From e7a91d38f2de8e8e00bef7fc316efffd20ed22dd Mon Sep 17 00:00:00 2001 From: Martin Mueller <72937414+mmarti04@users.noreply.github.com> Date: Wed, 17 Sep 2025 17:28:17 +0200 Subject: [PATCH] Pattern unification & Matterhorn Changes (#1303) * update ctb regDefs, included fill level of adc, transceiver and DBit fifos, added enable registers for cont. readout * fix fifo fill level range bug * updated ctb RegDefs, increased size of fifo fill level register * added register to read the firmware git hash * ctb: added altchip_id read register * start with unification of pattern machinery for xctb, ctb, mythen * udate addrs for d-server internal matterhorn startup * update xctb reg defs * move pattern loopdef start * added zero trimbits to matterhorn config * Revert "added zero trimbits to matterhorn config" This reverts commit 7c347badd52e9748fcbd048e427b4513253cbd58. * added adjustable clocks on Xilinx-CTB * added support for fractional dividers of runclk * XCTB: make frequencies adjustable from python gui * update docs * added support for patternstart command to XCTB * XCTB: map pattern_ram directly into memory, removed rw strobe * refactor Mythen pattern control addresses * test altera ctb with common addresses, removed ifdefs * change ordering of regdefs * updated python help for dbitclk, adcclk and runclk (khz) * xilinx: moved the wait for firmware to measure the actual frequency to the server side and removed it in the pyctbgui side * will not be anymore in developer branch * make format (exception RegisterDefs.h), rewrite XILINX PLL to have less consstants in the code * bug: mixing && for & --------- Co-authored-by: Martin Mueller Co-authored-by: Dhanya Thattil --- docs/src/pattern.rst | 2 +- pyctbgui/pyctbgui/services/Acquisition.py | 22 +- python/slsdet/detector.py | 18 +- serverBin/ctbDetectorServer_developer | 1 - serverBin/eigerDetectorServer_developer | 1 - serverBin/gotthard2DetectorServer_developer | 1 - serverBin/jungfrauDetectorServer_developer | 1 - serverBin/moenchDetectorServer_developer | 1 - serverBin/mythen3DetectorServer_developer | 1 - serverBin/xilinx_ctbDetectorServer_developer | 1 - .../ctbDetectorServer/RegisterDefs.h | 357 ++++-------- .../mythen3DetectorServer/RegisterDefs.h | 75 +-- .../slsDetectorServer/include/XILINX_PLL.h | 12 + .../slsDetectorServer/include/arm64.h | 2 + .../slsDetectorServer/include/loadPattern.h | 2 +- .../include/slsDetectorFunctionList.h | 7 +- .../slsDetectorServer/src/XILINX_PLL.c | 200 +++++++ .../slsDetectorServer/src/arm64.c | 27 +- .../slsDetectorServer/src/loadPattern.c | 357 +++--------- .../src/slsDetectorServer_funcs.c | 15 +- .../xilinx_ctbDetectorServer/CMakeLists.txt | 1 + .../xilinx_ctbDetectorServer/Makefile | 2 +- .../xilinx_ctbDetectorServer/RegisterDefs.h | 516 ++++++++---------- .../bin/xilinx_ctbDetectorServer_developer | Bin 304720 -> 305464 bytes .../chip_config_xilinx.txt | 20 +- .../reset_chip_xilinx.txt | 24 +- .../slsDetectorFunctionList.c | 28 + .../slsDetectorServer_defs.h | 7 +- slsDetectorSoftware/generator/commands.yaml | 8 +- .../generator/extended_commands.yaml | 10 +- slsDetectorSoftware/include/sls/Detector.h | 14 +- slsDetectorSoftware/src/Caller.cpp | 11 +- slsSupportLib/include/sls/versionAPI.h | 2 +- 33 files changed, 795 insertions(+), 951 deletions(-) delete mode 120000 serverBin/ctbDetectorServer_developer delete mode 120000 serverBin/eigerDetectorServer_developer delete mode 120000 serverBin/gotthard2DetectorServer_developer delete mode 120000 serverBin/jungfrauDetectorServer_developer delete mode 120000 serverBin/moenchDetectorServer_developer delete mode 120000 serverBin/mythen3DetectorServer_developer delete mode 120000 serverBin/xilinx_ctbDetectorServer_developer create mode 100644 slsDetectorServers/slsDetectorServer/include/XILINX_PLL.h create mode 100644 slsDetectorServers/slsDetectorServer/src/XILINX_PLL.c diff --git a/docs/src/pattern.rst b/docs/src/pattern.rst index 471a3e570..680b8bdc9 100644 --- a/docs/src/pattern.rst +++ b/docs/src/pattern.rst @@ -28,7 +28,7 @@ This instructs the firmware to execute the commands from address 0 to 4 (includi .. code-block:: start [Ctb, Xilinx_Ctb] - patternstart [Mythen3] + patternstart [Mythen3, Xilinx_Ctb] The maximal number of patword addresses is 8192. However, it is possible to extend the length of the pattern sequence using loops and wait commands. Loops can be configured with the following commands: diff --git a/pyctbgui/pyctbgui/services/Acquisition.py b/pyctbgui/pyctbgui/services/Acquisition.py index e931a1835..58c972c51 100644 --- a/pyctbgui/pyctbgui/services/Acquisition.py +++ b/pyctbgui/pyctbgui/services/Acquisition.py @@ -50,20 +50,20 @@ class AcquisitionTab(QtWidgets.QWidget): self.plotTab = self.mainWindow.plotTab self.toggleStartButton(False) if self.det.type == detectorType.XILINX_CHIPTESTBOARD: - self.view.labelRunF.setDisabled(True) - self.view.labelADCF.setDisabled(True) self.view.labelADCPhase.setDisabled(True) self.view.labelADCPipeline.setDisabled(True) - self.view.labelDBITF.setDisabled(True) self.view.labelDBITPhase.setDisabled(True) self.view.labelDBITPipeline.setDisabled(True) - self.view.spinBoxRunF.setDisabled(True) - self.view.spinBoxADCF.setDisabled(True) self.view.spinBoxADCPhase.setDisabled(True) self.view.spinBoxADCPipeline.setDisabled(True) - self.view.spinBoxDBITF.setDisabled(True) self.view.spinBoxDBITPhase.setDisabled(True) self.view.spinBoxDBITPipeline.setDisabled(True) + self.view.labelRunF.setText("Run Clock Frequency (kHz):") + self.view.labelDBITF.setText("DBIT Clock Frequency (kHz):") + self.view.labelADCF.setText("ADC Clock Frequency (kHz):") + self.view.spinBoxRunF.setMaximum(250000) + self.view.spinBoxDBITF.setMaximum(250000) + self.view.spinBoxADCF.setMaximum(250000) def connect_ui(self): # For Acquistions Tab @@ -72,12 +72,13 @@ class AcquisitionTab(QtWidgets.QWidget): self.view.spinBoxAnalog.editingFinished.connect(self.setAnalog) self.view.spinBoxDigital.editingFinished.connect(self.setDigital) - if self.det.type == detectorType.CHIPTESTBOARD: + if self.det.type in [detectorType.CHIPTESTBOARD, detectorType.XILINX_CHIPTESTBOARD]: self.view.spinBoxRunF.editingFinished.connect(self.setRunFrequency) self.view.spinBoxADCF.editingFinished.connect(self.setADCFrequency) + self.view.spinBoxDBITF.editingFinished.connect(self.setDBITFrequency) + if self.det.type == detectorType.CHIPTESTBOARD: self.view.spinBoxADCPhase.editingFinished.connect(self.setADCPhase) self.view.spinBoxADCPipeline.editingFinished.connect(self.setADCPipeline) - self.view.spinBoxDBITF.editingFinished.connect(self.setDBITFrequency) self.view.spinBoxDBITPhase.editingFinished.connect(self.setDBITPhase) self.view.spinBoxDBITPipeline.editingFinished.connect(self.setDBITPipeline) @@ -98,12 +99,13 @@ class AcquisitionTab(QtWidgets.QWidget): self.getAnalog() self.getDigital() - if self.det.type == detectorType.CHIPTESTBOARD: + if self.det.type in [detectorType.CHIPTESTBOARD, detectorType.XILINX_CHIPTESTBOARD]: self.getRunFrequency() self.getADCFrequency() + self.getDBITFrequency() + if self.det.type == detectorType.CHIPTESTBOARD: self.getADCPhase() self.getADCPipeline() - self.getDBITFrequency() self.getDBITPhase() self.getDBITPipeline() diff --git a/python/slsdet/detector.py b/python/slsdet/detector.py index 2f0597fee..1d62158cf 100755 --- a/python/slsdet/detector.py +++ b/python/slsdet/detector.py @@ -3305,7 +3305,11 @@ class Detector(CppDetectorApi): @property @element def runclk(self): - """[Ctb] Run clock in MHz.""" + """ + [Ctb] Sets Run clock frequency in MHz. \n + [Xilinx Ctb] Sets Run clock frequency in kHz. + """ + return self.getRUNClock() @runclk.setter @@ -3386,7 +3390,11 @@ class Detector(CppDetectorApi): @property @element def dbitclk(self): - """[Ctb] Clock for latching the digital bits in MHz.""" + """ + [Ctb] Sets clock for latching the digital bits in MHz. \n + [Xilinx Ctb] clock for latching the digital bits in kHz. + """ + return self.getDBITClock() @dbitclk.setter @@ -3513,7 +3521,11 @@ class Detector(CppDetectorApi): @property @element def adcclk(self): - """[Ctb] Sets ADC clock frequency in MHz. """ + """ + [Ctb] Sets ADC clock frequency in MHz. \n + [Xilinx Ctb] Sets ADC clock frequency in kHz. + """ + return self.getADCClock() @adcclk.setter diff --git a/serverBin/ctbDetectorServer_developer b/serverBin/ctbDetectorServer_developer deleted file mode 120000 index 2304a2043..000000000 --- a/serverBin/ctbDetectorServer_developer +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer \ No newline at end of file diff --git a/serverBin/eigerDetectorServer_developer b/serverBin/eigerDetectorServer_developer deleted file mode 120000 index 117c94c37..000000000 --- a/serverBin/eigerDetectorServer_developer +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer \ No newline at end of file diff --git a/serverBin/gotthard2DetectorServer_developer b/serverBin/gotthard2DetectorServer_developer deleted file mode 120000 index 7c8e54bee..000000000 --- a/serverBin/gotthard2DetectorServer_developer +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer \ No newline at end of file diff --git a/serverBin/jungfrauDetectorServer_developer b/serverBin/jungfrauDetectorServer_developer deleted file mode 120000 index 8ae22b591..000000000 --- a/serverBin/jungfrauDetectorServer_developer +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer \ No newline at end of file diff --git a/serverBin/moenchDetectorServer_developer b/serverBin/moenchDetectorServer_developer deleted file mode 120000 index 147ecfb53..000000000 --- a/serverBin/moenchDetectorServer_developer +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer \ No newline at end of file diff --git a/serverBin/mythen3DetectorServer_developer b/serverBin/mythen3DetectorServer_developer deleted file mode 120000 index cc8b2c91f..000000000 --- a/serverBin/mythen3DetectorServer_developer +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer \ No newline at end of file diff --git a/serverBin/xilinx_ctbDetectorServer_developer b/serverBin/xilinx_ctbDetectorServer_developer deleted file mode 120000 index f3a2ec25c..000000000 --- a/serverBin/xilinx_ctbDetectorServer_developer +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer \ No newline at end of file diff --git a/slsDetectorServers/ctbDetectorServer/RegisterDefs.h b/slsDetectorServers/ctbDetectorServer/RegisterDefs.h index cd525124a..bcd586686 100644 --- a/slsDetectorServers/ctbDetectorServer/RegisterDefs.h +++ b/slsDetectorServers/ctbDetectorServer/RegisterDefs.h @@ -5,6 +5,7 @@ /* Definitions for FPGA */ #define MEM_MAP_SHIFT 1 +#define REG_OFFSET (2) /* FPGA Version RO register */ #define FPGA_VERSION_REG (0x00 << MEM_MAP_SHIFT) @@ -65,8 +66,8 @@ (0x000000FF << STATUS_PT_CNTRL_STTS_OFF_OFST) #define STATUS_IDLE_MSK (0x677FF) -/* Look at me RO register TODO */ -#define LOOK_AT_ME_REG (0x03 << MEM_MAP_SHIFT) +/* Register containing the git hash of the FPGA firmware */ +#define FIRMWARE_GIT_HASH_REG (0x03 << MEM_MAP_SHIFT) /* System Status RO register */ #define SYSTEM_STATUS_REG (0x04 << MEM_MAP_SHIFT) @@ -119,7 +120,7 @@ #define MOD_SERIAL_NUMBER_VRSN_MSK (0x0000003F << MOD_SERIAL_NUMBER_VRSN_OFST) /* API Version RO register */ -#define API_VERSION_REG (0x0F << MEM_MAP_SHIFT) +#define API_VERSION_REG (0x0B << MEM_MAP_SHIFT) #define API_VERSION_OFST (0) #define API_VERSION_MSK (0x00FFFFFF << API_VERSION_OFST) @@ -128,24 +129,24 @@ /* Time from Start 64 bit RO register. t = GCLK x 50 ns. Reset using * CONTROL_CRST. TODO */ -#define TIME_FROM_START_LSB_REG (0x10 << MEM_MAP_SHIFT) -#define TIME_FROM_START_MSB_REG (0x11 << MEM_MAP_SHIFT) +#define TIME_FROM_START_LSB_REG (0x97 << MEM_MAP_SHIFT) +#define TIME_FROM_START_MSB_REG (0x98 << MEM_MAP_SHIFT) /* Delay Left 64 bit RO register. t = DLY x 50 ns. TODO */ -#define DELAY_LEFT_LSB_REG (0x12 << MEM_MAP_SHIFT) -#define DELAY_LEFT_MSB_REG (0x13 << MEM_MAP_SHIFT) +#define DELAY_LEFT_LSB_REG (0x8D << MEM_MAP_SHIFT) +#define DELAY_LEFT_MSB_REG (0x8E << MEM_MAP_SHIFT) /* Triggers Left 64 bit RO register TODO */ -#define CYCLES_LEFT_LSB_REG (0x14 << MEM_MAP_SHIFT) -#define CYCLES_LEFT_MSB_REG (0x15 << MEM_MAP_SHIFT) +#define CYCLES_LEFT_LSB_REG (0x8F << MEM_MAP_SHIFT) +#define CYCLES_LEFT_MSB_REG (0x90 << MEM_MAP_SHIFT) /* Frames Left 64 bit RO register TODO */ -#define FRAMES_LEFT_LSB_REG (0x16 << MEM_MAP_SHIFT) -#define FRAMES_LEFT_MSB_REG (0x17 << MEM_MAP_SHIFT) +#define FRAMES_LEFT_LSB_REG (0x91 << MEM_MAP_SHIFT) +#define FRAMES_LEFT_MSB_REG (0x92 << MEM_MAP_SHIFT) /* Period Left 64 bit RO register. t = T x 50 ns. TODO */ -#define PERIOD_LEFT_LSB_REG (0x18 << MEM_MAP_SHIFT) -#define PERIOD_LEFT_MSB_REG (0x19 << MEM_MAP_SHIFT) +#define PERIOD_LEFT_LSB_REG (0x93 << MEM_MAP_SHIFT) +#define PERIOD_LEFT_MSB_REG (0x94 << MEM_MAP_SHIFT) /* Exposure Time Left 64 bit RO register */ // #define EXPTIME_LEFT_LSB_REG (0x1A << MEM_MAP_SHIFT) // Not @@ -160,34 +161,34 @@ //// Not used in FW /* Data In 64 bit RO register TODO */ -#define DATA_IN_LSB_REG (0x1E << MEM_MAP_SHIFT) -#define DATA_IN_MSB_REG (0x1F << MEM_MAP_SHIFT) +#define DATA_IN_LSB_REG (0x10 << MEM_MAP_SHIFT) +#define DATA_IN_MSB_REG (0x11 << MEM_MAP_SHIFT) /* Pattern Out 64 bit RO register */ -#define PATTERN_OUT_LSB_REG (0x20 << MEM_MAP_SHIFT) -#define PATTERN_OUT_MSB_REG (0x21 << MEM_MAP_SHIFT) +#define PATTERN_OUT_LSB_REG (0x80 << MEM_MAP_SHIFT) +#define PATTERN_OUT_MSB_REG (0x81 << MEM_MAP_SHIFT) /* Frame number of next acquisition register (64 bit register) */ -#define NEXT_FRAME_NUMB_LOCAL_LSB_REG (0x22 << MEM_MAP_SHIFT) -#define NEXT_FRAME_NUMB_LOCAL_MSB_REG (0x23 << MEM_MAP_SHIFT) +#define NEXT_FRAME_NUMB_LOCAL_LSB_REG (0x12 << MEM_MAP_SHIFT) +#define NEXT_FRAME_NUMB_LOCAL_MSB_REG (0x13 << MEM_MAP_SHIFT) /* Frames From Start PG 64 bit RO register. Reset using CONTROL_CRST. TODO */ -#define FRAMES_FROM_START_PG_LSB_REG (0x24 << MEM_MAP_SHIFT) -#define FRAMES_FROM_START_PG_MSB_REG (0x25 << MEM_MAP_SHIFT) +#define FRAMES_FROM_START_PG_LSB_REG (0x99 << MEM_MAP_SHIFT) +#define FRAMES_FROM_START_PG_MSB_REG (0x9A << MEM_MAP_SHIFT) /* Start Frame Time (Measurement Time) 64 bit register (timestamp at a frame * start until reset) TODO */ -#define START_FRAME_TIME_LSB_REG (0x26 << MEM_MAP_SHIFT) -#define START_FRAME_TIME_MSB_REG (0x27 << MEM_MAP_SHIFT) +#define START_FRAME_TIME_LSB_REG (0x9B << MEM_MAP_SHIFT) +#define START_FRAME_TIME_MSB_REG (0x9C << MEM_MAP_SHIFT) /* Power Status RO register */ -#define POWER_STATUS_REG (0x29 << MEM_MAP_SHIFT) +#define POWER_STATUS_REG (0x18 << MEM_MAP_SHIFT) #define POWER_STATUS_ALRT_OFST (27) #define POWER_STATUS_ALRT_MSK (0x0000001F << POWER_STATUS_ALRT_OFST) /* FIFO Transceiver In Status RO register */ -#define FIFO_TIN_STATUS_REG (0x30 << MEM_MAP_SHIFT) +#define FIFO_TIN_STATUS_REG (0x1A << MEM_MAP_SHIFT) #define FIFO_TIN_STATUS_FIFO_EMPTY_1_OFST (4) #define FIFO_TIN_STATUS_FIFO_EMPTY_1_MSK (0x00000001 << FIFO_TIN_STATUS_FIFO_EMPTY_1_OFST) #define FIFO_TIN_STATUS_FIFO_EMPTY_2_OFST (5) @@ -198,23 +199,54 @@ #define FIFO_TIN_STATUS_FIFO_EMPTY_4_MSK (0x00000001 << FIFO_TIN_STATUS_FIFO_EMPTY_4_OFST) #define FIFO_TIN_STATUS_FIFO_EMPTY_ALL_MSK (0x0000000F << FIFO_TIN_STATUS_FIFO_EMPTY_1_OFST) +/* FIFO Transceiver Fill level RO register */ +#define FIFO_TIN_FILL_REG (0x25 << MEM_MAP_SHIFT) +#define FIFO_TIN_FILL_FIFO_1_OFST (0) +#define FIFO_TIN_FILL_FIFO_1_MSK (0x00003FFF << FIFO_TIN_FILL_FIFO__1_OFST) +#define FIFO_TIN_FILL_FIFO_2_OFST (16) +#define FIFO_TIN_FILL_FIFO_2_MSK (0x00003FFF << FIFO_TIN_FILL_FIFO__2_OFST) + +/* FIFO ADC Fill level RO register */ +#define FIFO_ADC_FILL_REG (0x26 << MEM_MAP_SHIFT) +#define FIFO_ADC_FILL_FIFO_OFST (0) +#define FIFO_ADC_FILL_FIFO_MSK (0x00003FFF << FIFO_ADC_FILL_FIFO_OFST) + +/* Enable continuos readout register */ +#define CONTINUOUS_RO_ENABLE_REG (0x27 << MEM_MAP_SHIFT) +#define CONTINUOUS_RO_ADC_ENABLE_OFST (0) +#define CONTINUOUS_RO_TIN_ENABLE_OFST (1) +#define CONTINUOUS_RO_DBIT_ENABLE_OFST (2) +#define CONTINUOUS_RO_ADC_ENABLE_MSK (0x00000001 << CONTINUOUS_RO_ADC_ENABLE_OFST) +#define CONTINUOUS_RO_TIN_ENABLE_MSK (0x00000001 << CONTINUOUS_RO_TIN_ENABLE_OFST) +#define CONTINUOUS_RO_DBIT_ENABLE_MSK (0x00000001 << CONTINUOUS_RO_DBIT_ENABLE_OFST) +#define DBIT_INJECT_COUNTER_ENA_OFST (3) // continuously injects fake-data into the dbit fifo when enabled. +#define DBIT_INJECT_COUNTER_ENA_MSK (0x00000001 << DBIT_INJECT_COUNTER_ENA_OFST) +#define DBIT_INJECT_COUNTER_CLKDIV_OFST (8) // Additional clock divider for fake-data injection +#define DBIT_INJECT_COUNTER_CLKDIV_MSK (0x000000FF << DBIT_INJECT_COUNTER_CLKDIV_OFST) + +/* 64-bit FPGA chip ID. Unique for every device. read-only */ +#define FPGA_chipID_0_REG (0x28 << MEM_MAP_SHIFT) +#define FPGA_chipID_1_REG (0x29 << MEM_MAP_SHIFT) + /* FIFO Transceiver In 64 bit RO register */ -#define FIFO_TIN_LSB_REG (0x31 << MEM_MAP_SHIFT) -#define FIFO_TIN_MSB_REG (0x32 << MEM_MAP_SHIFT) +#define FIFO_TIN_LSB_REG (0x1B << MEM_MAP_SHIFT) +#define FIFO_TIN_MSB_REG (0x1C << MEM_MAP_SHIFT) /* FIFO Digital In Status RO register */ -#define FIFO_DIN_STATUS_REG (0x3B << MEM_MAP_SHIFT) +#define FIFO_DIN_STATUS_REG (0x1D << MEM_MAP_SHIFT) +#define FIFO_DIN_STATUS_FIFO_FILL_OFST (0) +#define FIFO_DIN_STATUS_FIFO_FILL_MSK (0x00003FFF) #define FIFO_DIN_STATUS_FIFO_FULL_OFST (30) #define FIFO_DIN_STATUS_FIFO_FULL_MSK (0x00000001 << FIFO_DIN_STATUS_FIFO_FULL_OFST) #define FIFO_DIN_STATUS_FIFO_EMPTY_OFST (31) #define FIFO_DIN_STATUS_FIFO_EMPTY_MSK (0x00000001 << FIFO_DIN_STATUS_FIFO_EMPTY_OFST) /* FIFO Digital In 64 bit RO register */ -#define FIFO_DIN_LSB_REG (0x3C << MEM_MAP_SHIFT) -#define FIFO_DIN_MSB_REG (0x3D << MEM_MAP_SHIFT) +#define FIFO_DIN_LSB_REG (0x1E << MEM_MAP_SHIFT) +#define FIFO_DIN_MSB_REG (0x1F << MEM_MAP_SHIFT) /* SPI (Serial Peripheral Interface) DAC, HV RW register */ -#define SPI_REG (0x40 << MEM_MAP_SHIFT) +#define SPI_REG (0x20 << MEM_MAP_SHIFT) #define SPI_DAC_SRL_DGTL_OTPT_OFST (0) #define SPI_DAC_SRL_DGTL_OTPT_MSK (0x00000001 << SPI_DAC_SRL_DGTL_OTPT_OFST) @@ -230,7 +262,7 @@ #define SPI_HV_SRL_CS_OTPT_MSK (0x00000001 << SPI_HV_SRL_CS_OTPT_OFST) /* ADC SPI (Serial Peripheral Interface) RW register */ -#define ADC_SPI_REG (0x41 << MEM_MAP_SHIFT) +#define ADC_SPI_REG (0x21 << MEM_MAP_SHIFT) #define ADC_SPI_SRL_CLK_OTPT_OFST (0) #define ADC_SPI_SRL_CLK_OTPT_MSK (0x00000001 << ADC_SPI_SRL_CLK_OTPT_OFST) @@ -240,7 +272,7 @@ #define ADC_SPI_SRL_CS_OTPT_MSK (0x0000000F << ADC_SPI_SRL_CS_OTPT_OFST) /* ADC Offset RW register */ -#define ADC_OFFSET_REG (0x42 << MEM_MAP_SHIFT) +#define ADC_OFFSET_REG (0x22 << MEM_MAP_SHIFT) #define ADC_OFFSET_ADC_PPLN_OFST (0) #define ADC_OFFSET_ADC_PPLN_MSK (0x000000FF << ADC_OFFSET_ADC_PPLN_OFST) @@ -248,7 +280,7 @@ #define ADC_OFFSET_DBT_PPLN_MSK (0x000000FF << ADC_OFFSET_DBT_PPLN_OFST) /* ADC Port Invert RW register */ -#define ADC_PORT_INVERT_REG (0x43 << MEM_MAP_SHIFT) +#define ADC_PORT_INVERT_REG (0x23 << MEM_MAP_SHIFT) #define ADC_PORT_INVERT_0_INPT_OFST (0) #define ADC_PORT_INVERT_0_INPT_MSK (0x000000FF << ADC_PORT_INVERT_0_INPT_OFST) @@ -260,7 +292,7 @@ #define ADC_PORT_INVERT_3_INPT_MSK (0x000000FF << ADC_PORT_INVERT_3_INPT_OFST) /* Dummy RW register */ -#define DUMMY_REG (0x44 << MEM_MAP_SHIFT) +#define DUMMY_REG (0x24 << MEM_MAP_SHIFT) #define DUMMY_FIFO_CHNNL_SLCT_OFST (0) #define DUMMY_FIFO_CHNNL_SLCT_MSK (0x0000003F << DUMMY_FIFO_CHNNL_SLCT_OFST) @@ -273,46 +305,8 @@ #define DUMMY_TRNSCVR_FIFO_RD_STRBE_OFST (14) #define DUMMY_TRNSCVR_FIFO_RD_STRBE_MSK (0x00000001 << DUMMY_TRNSCVR_FIFO_RD_STRBE_OFST) -/* Receiver IP Address RW register */ -#define RX_IP_REG (0x45 << MEM_MAP_SHIFT) - -/* UDP Port RW register */ -#define UDP_PORT_REG (0x46 << MEM_MAP_SHIFT) - -#define UDP_PORT_RX_OFST (0) -#define UDP_PORT_RX_MSK (0x0000FFFF << UDP_PORT_RX_OFST) -#define UDP_PORT_TX_OFST (16) -#define UDP_PORT_TX_MSK (0x0000FFFF << UDP_PORT_TX_OFST) - -/* Receiver Mac Address 64 bit RW register */ -#define RX_MAC_LSB_REG (0x47 << MEM_MAP_SHIFT) -#define RX_MAC_MSB_REG (0x48 << MEM_MAP_SHIFT) - -#define RX_MAC_LSB_OFST (0) -#define RX_MAC_LSB_MSK (0xFFFFFFFF << RX_MAC_LSB_OFST) -#define RX_MAC_MSB_OFST (0) -#define RX_MAC_MSB_MSK (0x0000FFFF << RX_MAC_MSB_OFST) - -/* Detector/ Transmitter Mac Address 64 bit RW register */ -#define TX_MAC_LSB_REG (0x49 << MEM_MAP_SHIFT) -#define TX_MAC_MSB_REG (0x4A << MEM_MAP_SHIFT) - -#define TX_MAC_LSB_OFST (0) -#define TX_MAC_LSB_MSK (0xFFFFFFFF << TX_MAC_LSB_OFST) -#define TX_MAC_MSB_OFST (0) -#define TX_MAC_MSB_MSK (0x0000FFFF << TX_MAC_MSB_OFST) - -/* Detector/ Transmitter IP Address RW register */ -#define TX_IP_REG (0x4B << MEM_MAP_SHIFT) - -/* Detector/ Transmitter IP Checksum RW register */ -#define TX_IP_CHECKSUM_REG (0x4C << MEM_MAP_SHIFT) - -#define TX_IP_CHECKSUM_OFST (0) -#define TX_IP_CHECKSUM_MSK (0x0000FFFF << TX_IP_CHECKSUM_OFST) - /* Configuration RW register */ -#define CONFIG_REG (0x4D << MEM_MAP_SHIFT) +#define CONFIG_REG (0x2D << MEM_MAP_SHIFT) #define CONFIG_LED_DSBL_OFST (0) #define CONFIG_LED_DSBL_MSK (0x00000001 << CONFIG_LED_DSBL_OFST) @@ -327,7 +321,7 @@ #define CONFIG_GB10_SND_UDP_MSK (0x00000001 << CONFIG_GB10_SND_UDP_OFST) /* External Signal RW register */ -#define EXT_SIGNAL_REG (0x4E << MEM_MAP_SHIFT) +#define EXT_SIGNAL_REG (0x2E << MEM_MAP_SHIFT) #define EXT_SIGNAL_OFST (0) #define EXT_SIGNAL_MSK (0x00000001 << EXT_SIGNAL_OFST) @@ -335,7 +329,7 @@ #define EXT_SIGNAL_TRGGR_VAL ((0x1 << EXT_SIGNAL_OFST) & EXT_SIGNAL_MSK) /* Control RW register */ -#define CONTROL_REG (0x4F << MEM_MAP_SHIFT) +#define CONTROL_REG (0x2F << MEM_MAP_SHIFT) #define CONTROL_STRT_ACQSTN_OFST (0) #define CONTROL_STRT_ACQSTN_MSK (0x00000001 << CONTROL_STRT_ACQSTN_OFST) @@ -375,10 +369,10 @@ #define CONTROL_CLR_ACQSTN_FIFO_MSK (0x00000001 << CONTROL_CLR_ACQSTN_FIFO_OFST) /* Reconfiguratble PLL Paramater RW register */ -#define PLL_PARAM_REG (0x50 << MEM_MAP_SHIFT) +#define PLL_PARAM_REG (0x30 << MEM_MAP_SHIFT) /* Reconfiguratble PLL Control RW regiser */ -#define PLL_CNTRL_REG (0x51 << MEM_MAP_SHIFT) +#define PLL_CNTRL_REG (0x31 << MEM_MAP_SHIFT) #define PLL_CNTRL_RCNFG_PRMTR_RST_OFST (0) #define PLL_CNTRL_RCNFG_PRMTR_RST_MSK \ @@ -391,7 +385,7 @@ #define PLL_CNTRL_ADDR_MSK (0x0000003F << PLL_CNTRL_ADDR_OFST) /* Pattern Control RW register */ -#define PATTERN_CNTRL_REG (0x52 << MEM_MAP_SHIFT) +#define PATTERN_CNTRL_REG (0x88 << MEM_MAP_SHIFT) #define PATTERN_CNTRL_WR_OFST (0) #define PATTERN_CNTRL_WR_MSK (0x00000001 << PATTERN_CNTRL_WR_OFST) @@ -401,70 +395,31 @@ #define PATTERN_CNTRL_ADDR_MSK (0x00001FFF << PATTERN_CNTRL_ADDR_OFST) /* Pattern Limit RW regiser */ -#define PATTERN_LIMIT_REG (0x53 << MEM_MAP_SHIFT) +#define PATTERN_LIMIT_REG (0x89 << MEM_MAP_SHIFT) #define PATTERN_LIMIT_STRT_OFST (0) #define PATTERN_LIMIT_STRT_MSK (0x00001FFF << PATTERN_LIMIT_STRT_OFST) #define PATTERN_LIMIT_STP_OFST (16) #define PATTERN_LIMIT_STP_MSK (0x00001FFF << PATTERN_LIMIT_STP_OFST) -/* Pattern Loop 0 Address RW regiser */ -#define PATTERN_LOOP_0_ADDR_REG (0x54 << MEM_MAP_SHIFT) +/** Pattern Loop and Wait Definitions, 5 regs each */ +#define PATTERN_LOOPDEF_BASE (0xA0 << MEM_MAP_SHIFT) +#define PATTERN_LOOP_ADDR_WORD_OFST (0) +#define PATTERN_LOOP_ITERATION_WORD_OFST (1) +#define PATTERN_WAIT_ADDR_WORD_OFST (2) +#define PATTERN_WAIT_TIMER_LSB_WORD_OFST (3) +#define PATTERN_WAIT_TIMER_MSB_WORD_OFST (4) +#define PATTERN_LOOPDEF_NWORDS_OFST (5) -#define PATTERN_LOOP_0_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_0_ADDR_STRT_MSK \ - (0x00001FFF << PATTERN_LOOP_0_ADDR_STRT_OFST) -#define PATTERN_LOOP_0_ADDR_STP_OFST (16) -#define PATTERN_LOOP_0_ADDR_STP_MSK (0x00001FFF << PATTERN_LOOP_0_ADDR_STP_OFST) - -/* Pattern Loop 0 Iteration RW regiser */ -#define PATTERN_LOOP_0_ITERATION_REG (0x55 << MEM_MAP_SHIFT) - -/* Pattern Loop 1 Address RW regiser */ -#define PATTERN_LOOP_1_ADDR_REG (0x56 << MEM_MAP_SHIFT) - -#define PATTERN_LOOP_1_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_1_ADDR_STRT_MSK \ - (0x00001FFF << PATTERN_LOOP_1_ADDR_STRT_OFST) -#define PATTERN_LOOP_1_ADDR_STP_OFST (16) -#define PATTERN_LOOP_1_ADDR_STP_MSK (0x00001FFF << PATTERN_LOOP_1_ADDR_STP_OFST) - -/* Pattern Loop 1 Iteration RW regiser */ -#define PATTERN_LOOP_1_ITERATION_REG (0x57 << MEM_MAP_SHIFT) - -/* Pattern Loop 2 Address RW regiser */ -#define PATTERN_LOOP_2_ADDR_REG (0x58 << MEM_MAP_SHIFT) - -#define PATTERN_LOOP_2_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_2_ADDR_STRT_MSK \ - (0x00001FFF << PATTERN_LOOP_2_ADDR_STRT_OFST) -#define PATTERN_LOOP_2_ADDR_STP_OFST (16) -#define PATTERN_LOOP_2_ADDR_STP_MSK (0x00001FFF << PATTERN_LOOP_2_ADDR_STP_OFST) - -/* Pattern Loop 2 Iteration RW regiser */ -#define PATTERN_LOOP_2_ITERATION_REG (0x59 << MEM_MAP_SHIFT) - -/* Pattern Wait 0 RW regiser */ -#define PATTERN_WAIT_0_ADDR_REG (0x5A << MEM_MAP_SHIFT) - -#define PATTERN_WAIT_0_ADDR_OFST (0) -#define PATTERN_WAIT_0_ADDR_MSK (0x00001FFF << PATTERN_WAIT_0_ADDR_OFST) -// FIXME: is mask 3FF - -/* Pattern Wait 1 RW regiser */ -#define PATTERN_WAIT_1_ADDR_REG (0x5B << MEM_MAP_SHIFT) - -#define PATTERN_WAIT_1_ADDR_OFST (0) -#define PATTERN_WAIT_1_ADDR_MSK (0x00001FFF << PATTERN_WAIT_1_ADDR_OFST) - -/* Pattern Wait 2 RW regiser */ -#define PATTERN_WAIT_2_ADDR_REG (0x5C << MEM_MAP_SHIFT) - -#define PATTERN_WAIT_2_ADDR_OFST (0) -#define PATTERN_WAIT_2_ADDR_MSK (0x00001FFF << PATTERN_WAIT_2_ADDR_OFST) +#define PATTERN_WAIT_ADDR_OFST (0) +#define PATTERN_WAIT_ADDR_MSK (0x00001FFF << PATTERN_WAIT_ADDR_OFST) +#define PATTERN_LOOP_ADDR_STRT_OFST (0) +#define PATTERN_LOOP_ADDR_STRT_MSK (0x00001FFF << PATTERN_LOOP_ADDR_STRT_OFST) +#define PATTERN_LOOP_ADDR_STP_OFST (16) +#define PATTERN_LOOP_ADDR_STP_MSK (0x00001FFF << PATTERN_LOOP_ADDR_STP_OFST) /* Samples RW register */ -#define SAMPLES_REG (0x5D << MEM_MAP_SHIFT) +#define SAMPLES_REG (0x32 << MEM_MAP_SHIFT) #define SAMPLES_DIGITAL_OFST (0) #define SAMPLES_DIGITAL_MSK (0x0000FFFF << SAMPLES_DIGITAL_OFST) @@ -472,7 +427,7 @@ #define SAMPLES_ANALOG_MSK (0x0000FFFF << SAMPLES_ANALOG_OFST) /** Power RW register */ -#define POWER_REG (0x5E << MEM_MAP_SHIFT) +#define POWER_REG (0x33 << MEM_MAP_SHIFT) #define POWER_ENBL_VLTG_RGLTR_OFST (16) #define POWER_ENBL_VLTG_RGLTR_MSK (0x0000001F << POWER_ENBL_VLTG_RGLTR_OFST) @@ -480,25 +435,25 @@ #define POWER_HV_INTERNAL_SLCT_MSK (0x00000001 << POWER_HV_INTERNAL_SLCT_OFST) /* Number of samples from transceiver RW register */ -#define SAMPLES_TRANSCEIVER_REG (0x5F << MEM_MAP_SHIFT) +#define SAMPLES_TRANSCEIVER_REG (0x34 << MEM_MAP_SHIFT) #define SAMPLES_TRANSCEIVER_OFST (0) #define SAMPLES_TRANSCEIVER_MSK (0x0000FFFF << SAMPLES_TRANSCEIVER_OFST) /* Delay 64 bit RW register. t = DLY x 50 ns. */ -#define DELAY_LSB_REG (0x60 << MEM_MAP_SHIFT) -#define DELAY_MSB_REG (0x61 << MEM_MAP_SHIFT) +#define DELAY_LSB_REG (0x8D << MEM_MAP_SHIFT) +#define DELAY_MSB_REG (0x8E << MEM_MAP_SHIFT) /* Triggers 64 bit RW register */ -#define CYCLES_LSB_REG (0x62 << MEM_MAP_SHIFT) -#define CYCLES_MSB_REG (0x63 << MEM_MAP_SHIFT) +#define CYCLES_LSB_REG (0x8F << MEM_MAP_SHIFT) +#define CYCLES_MSB_REG (0x90 << MEM_MAP_SHIFT) /* Frames 64 bit RW register */ -#define FRAMES_LSB_REG (0x64 << MEM_MAP_SHIFT) -#define FRAMES_MSB_REG (0x65 << MEM_MAP_SHIFT) +#define FRAMES_LSB_REG (0x91 << MEM_MAP_SHIFT) +#define FRAMES_MSB_REG (0x92 << MEM_MAP_SHIFT) /* Period 64 bit RW register */ -#define PERIOD_LSB_REG (0x66 << MEM_MAP_SHIFT) -#define PERIOD_MSB_REG (0x67 << MEM_MAP_SHIFT) +#define PERIOD_LSB_REG (0x93 << MEM_MAP_SHIFT) +#define PERIOD_MSB_REG (0x94 << MEM_MAP_SHIFT) /* Period 64 bit RW register */ // #define EXPTIME_LSB_REG (0x68 << MEM_MAP_SHIFT) // @@ -513,33 +468,15 @@ /* Pattern IO Control 64 bit RW regiser * Each bit configured as output(1)/ input(0) */ -#define PATTERN_IO_CNTRL_LSB_REG (0x6C << MEM_MAP_SHIFT) -#define PATTERN_IO_CNTRL_MSB_REG (0x6D << MEM_MAP_SHIFT) - -/* Pattern IO Clock Control 64 bit RW regiser - * When bit n enabled (1), clocked output for DIO[n] (T run clock) - * When bit n disabled (0), Dio[n] driven by its pattern output */ -#define PATTERN_IO_CLK_CNTRL_LSB_REG (0x6E << MEM_MAP_SHIFT) -#define PATTERN_IO_CLK_CNTRL_MSB_REG (0x6F << MEM_MAP_SHIFT) +#define PATTERN_IO_CNTRL_LSB_REG (0x8A << MEM_MAP_SHIFT) +#define PATTERN_IO_CNTRL_MSB_REG (0x8B << MEM_MAP_SHIFT) /* Pattern In 64 bit RW register */ -#define PATTERN_IN_LSB_REG (0x70 << MEM_MAP_SHIFT) -#define PATTERN_IN_MSB_REG (0x71 << MEM_MAP_SHIFT) - -/* Pattern Wait Timer 0 64 bit RW register. t = PWT1 x T run clock */ -#define PATTERN_WAIT_TIMER_0_LSB_REG (0x72 << MEM_MAP_SHIFT) -#define PATTERN_WAIT_TIMER_0_MSB_REG (0x73 << MEM_MAP_SHIFT) - -/* Pattern Wait Timer 1 64 bit RW register. t = PWT2 x T run clock */ -#define PATTERN_WAIT_TIMER_1_LSB_REG (0x74 << MEM_MAP_SHIFT) -#define PATTERN_WAIT_TIMER_1_MSB_REG (0x75 << MEM_MAP_SHIFT) - -/* Pattern Wait Timer 2 64 bit RW register. t = PWT3 x T run clock */ -#define PATTERN_WAIT_TIMER_2_LSB_REG (0x76 << MEM_MAP_SHIFT) -#define PATTERN_WAIT_TIMER_2_MSB_REG (0x77 << MEM_MAP_SHIFT) +#define PATTERN_IN_LSB_REG (0x82 << MEM_MAP_SHIFT) +#define PATTERN_IN_MSB_REG (0x83 << MEM_MAP_SHIFT) /* Readout enable RW register */ -#define READOUT_10G_ENABLE_REG (0x79 << MEM_MAP_SHIFT) +#define READOUT_10G_ENABLE_REG (0x3C << MEM_MAP_SHIFT) #define READOUT_10G_ENABLE_ANLG_OFST (0) #define READOUT_10G_ENABLE_ANLG_MSK (0x000000FF << READOUT_10G_ENABLE_ANLG_OFST) @@ -550,7 +487,7 @@ (0x0000000F << READOUT_10G_ENABLE_TRNSCVR_OFST) /* Digital Bit External Trigger RW register */ -#define DBIT_EXT_TRG_REG (0x7B << MEM_MAP_SHIFT) +#define DBIT_EXT_TRG_REG (0x3E << MEM_MAP_SHIFT) #define DBIT_EXT_TRG_SRC_OFST (0) #define DBIT_EXT_TRG_SRC_MSK (0x0000003F << DBIT_EXT_TRG_SRC_OFST) @@ -558,7 +495,7 @@ #define DBIT_EXT_TRG_OPRTN_MD_MSK (0x00000001 << DBIT_EXT_TRG_OPRTN_MD_OFST) /* Pin Delay 0 RW register */ -#define OUTPUT_DELAY_0_REG (0x7C << MEM_MAP_SHIFT) +#define OUTPUT_DELAY_0_REG (0x3F << MEM_MAP_SHIFT) #define OUTPUT_DELAY_0_OTPT_STTNG_STEPS (25) #define OUTPUT_DELAY_0_OTPT_STTNG_OFST \ (0) // t = OTPT_STTNG * 25 ps, max for Cyclone V = 775 ps @@ -574,87 +511,21 @@ /* Pin Delay 1 RW register * Each bit configured as enable for dynamic output delay configuration */ -#define PIN_DELAY_1_REG (0x7D << MEM_MAP_SHIFT) +#define PIN_DELAY_1_REG (0x40 << MEM_MAP_SHIFT) /** Pattern Mask 64 bit RW regiser */ -#define PATTERN_MASK_LSB_REG (0x80 << MEM_MAP_SHIFT) -#define PATTERN_MASK_MSB_REG (0x81 << MEM_MAP_SHIFT) +#define PATTERN_MASK_LSB_REG (0x84 << MEM_MAP_SHIFT) +#define PATTERN_MASK_MSB_REG (0x85 << MEM_MAP_SHIFT) /** Pattern Set 64 bit RW regiser */ -#define PATTERN_SET_LSB_REG (0x82 << MEM_MAP_SHIFT) -#define PATTERN_SET_MSB_REG (0x83 << MEM_MAP_SHIFT) - -/* Pattern Loop 3 Address RW regiser */ -#define PATTERN_LOOP_3_ADDR_REG (0x84 << MEM_MAP_SHIFT) - -#define PATTERN_LOOP_3_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_3_ADDR_STRT_MSK \ - (0x00001FFF << PATTERN_LOOP_3_ADDR_STRT_OFST) -#define PATTERN_LOOP_3_ADDR_STP_OFST (16) -#define PATTERN_LOOP_3_ADDR_STP_MSK (0x00001FFF << PATTERN_LOOP_3_ADDR_STP_OFST) - -/* Pattern Loop 3 Iteration RW regiser */ -#define PATTERN_LOOP_3_ITERATION_REG (0x85 << MEM_MAP_SHIFT) - -/* Pattern Loop 4 Address RW regiser */ -#define PATTERN_LOOP_4_ADDR_REG (0x86 << MEM_MAP_SHIFT) - -#define PATTERN_LOOP_4_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_4_ADDR_STRT_MSK \ - (0x00001FFF << PATTERN_LOOP_4_ADDR_STRT_OFST) -#define PATTERN_LOOP_4_ADDR_STP_OFST (16) -#define PATTERN_LOOP_4_ADDR_STP_MSK (0x00001FFF << PATTERN_LOOP_4_ADDR_STP_OFST) - -/* Pattern Loop 4 Iteration RW regiser */ -#define PATTERN_LOOP_4_ITERATION_REG (0x87 << MEM_MAP_SHIFT) - -/* Pattern Loop 5 Address RW regiser */ -#define PATTERN_LOOP_5_ADDR_REG (0x88 << MEM_MAP_SHIFT) - -#define PATTERN_LOOP_5_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_5_ADDR_STRT_MSK \ - (0x00001FFF << PATTERN_LOOP_5_ADDR_STRT_OFST) -#define PATTERN_LOOP_5_ADDR_STP_OFST (16) -#define PATTERN_LOOP_5_ADDR_STP_MSK (0x00001FFF << PATTERN_LOOP_5_ADDR_STP_OFST) - -/* Pattern Loop 5 Iteration RW regiser */ -#define PATTERN_LOOP_5_ITERATION_REG (0x89 << MEM_MAP_SHIFT) - -/* Pattern Wait 3 RW regiser */ -#define PATTERN_WAIT_3_ADDR_REG (0x8A << MEM_MAP_SHIFT) - -#define PATTERN_WAIT_3_ADDR_OFST (0) -#define PATTERN_WAIT_3_ADDR_MSK (0x00001FFF << PATTERN_WAIT_3_ADDR_OFST) - -/* Pattern Wait 4 RW regiser */ -#define PATTERN_WAIT_4_ADDR_REG (0x8B << MEM_MAP_SHIFT) - -#define PATTERN_WAIT_4_ADDR_OFST (0) -#define PATTERN_WAIT_4_ADDR_MSK (0x00001FFF << PATTERN_WAIT_4_ADDR_OFST) - -/* Pattern Wait 5 RW regiser */ -#define PATTERN_WAIT_5_ADDR_REG (0x8C << MEM_MAP_SHIFT) - -#define PATTERN_WAIT_5_ADDR_OFST (0) -#define PATTERN_WAIT_5_ADDR_MSK (0x00001FFF << PATTERN_WAIT_5_ADDR_OFST) - -/* Pattern Wait Timer 3 64 bit RW register. t = PWT1 x T run clock */ -#define PATTERN_WAIT_TIMER_3_LSB_REG (0x8D << MEM_MAP_SHIFT) -#define PATTERN_WAIT_TIMER_3_MSB_REG (0x8E << MEM_MAP_SHIFT) - -/* Pattern Wait Timer 4 64 bit RW register. t = PWT1 x T run clock */ -#define PATTERN_WAIT_TIMER_4_LSB_REG (0x8F << MEM_MAP_SHIFT) -#define PATTERN_WAIT_TIMER_4_MSB_REG (0x90 << MEM_MAP_SHIFT) - -/* Pattern Wait Timer 5 64 bit RW register. t = PWT1 x T run clock */ -#define PATTERN_WAIT_TIMER_5_LSB_REG (0x91 << MEM_MAP_SHIFT) -#define PATTERN_WAIT_TIMER_5_MSB_REG (0x92 << MEM_MAP_SHIFT) +#define PATTERN_SET_LSB_REG (0x86 << MEM_MAP_SHIFT) +#define PATTERN_SET_MSB_REG (0x87 << MEM_MAP_SHIFT) /* Slow ADC SPI Value RO register */ -#define ADC_SLOW_DATA_REG (0x93 << MEM_MAP_SHIFT) +#define ADC_SLOW_DATA_REG (0x41 << MEM_MAP_SHIFT) /* Slow ADC SPI Value Config register */ -#define ADC_SLOW_CFG_REG (0x94 << MEM_MAP_SHIFT) +#define ADC_SLOW_CFG_REG (0x42 << MEM_MAP_SHIFT) /** Read back CFG Register */ #define ADC_SLOW_CFG_RB_OFST (2) #define ADC_SLOW_CFG_RB_MSK (0x00000001 << ADC_SLOW_CFG_RB_OFST) @@ -733,7 +604,7 @@ ((0x1 << ADC_SLOW_CFG_CFG_OFST) & ADC_SLOW_CFG_CFG_MSK) /* Slow ADC SPI Value Control register */ -#define ADC_SLOW_CTRL_REG (0x95 << MEM_MAP_SHIFT) +#define ADC_SLOW_CTRL_REG (0x43 << MEM_MAP_SHIFT) #define ADC_SLOW_CTRL_STRT_OFST (0) #define ADC_SLOW_CTRL_STRT_MSK (0x00000001 << ADC_SLOW_CTRL_STRT_OFST) diff --git a/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h b/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h index 6c7e641c9..5348d49d2 100644 --- a/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h +++ b/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h @@ -348,68 +348,21 @@ #define PATTERN_SET_LSB_REG (0x44 * REG_OFFSET + BASE_PATTERN_CONTROL) #define PATTERN_SET_MSB_REG (0x45 * REG_OFFSET + BASE_PATTERN_CONTROL) -/* Pattern Wait Timer 0 64bit RW Register */ -#define PATTERN_WAIT_TIMER_0_LSB_REG (0x60 * REG_OFFSET + BASE_PATTERN_CONTROL) -#define PATTERN_WAIT_TIMER_0_MSB_REG (0x61 * REG_OFFSET + BASE_PATTERN_CONTROL) +/** Pattern Loop and Wait Definitions, 5 regs each */ +#define PATTERN_LOOPDEF_BASE (0x60 * REG_OFFSET + BASE_PATTERN_CONTROL) +#define PATTERN_LOOPDEF_NWORDS_OFST (5) +#define PATTERN_WAIT_TIMER_LSB_WORD_OFST (0) +#define PATTERN_WAIT_TIMER_MSB_WORD_OFST (1) +#define PATTERN_WAIT_ADDR_WORD_OFST (2) +#define PATTERN_LOOP_ITERATION_WORD_OFST (3) +#define PATTERN_LOOP_ADDR_WORD_OFST (4) -/* Pattern Wait 0 RW Register*/ -#define PATTERN_WAIT_0_ADDR_REG (0x62 * REG_OFFSET + BASE_PATTERN_CONTROL) - -#define PATTERN_WAIT_0_ADDR_OFST (0) -#define PATTERN_WAIT_0_ADDR_MSK (0x00001FFF << PATTERN_WAIT_0_ADDR_OFST) - -/* Pattern Loop 0 Iteration RW Register */ -#define PATTERN_LOOP_0_ITERATION_REG (0x63 * REG_OFFSET + BASE_PATTERN_CONTROL) - -/* Pattern Loop 0 Address RW Register */ -#define PATTERN_LOOP_0_ADDR_REG (0x64 * REG_OFFSET + BASE_PATTERN_CONTROL) - -#define PATTERN_LOOP_0_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_0_ADDR_STRT_MSK (0x00001FFF << PATTERN_LOOP_0_ADDR_STRT_OFST) -#define PATTERN_LOOP_0_ADDR_STP_OFST (16) -#define PATTERN_LOOP_0_ADDR_STP_MSK (0x00001FFF << PATTERN_LOOP_0_ADDR_STP_OFST) - -/* Pattern Wait Timer 1 64bit RW Register */ -#define PATTERN_WAIT_TIMER_1_LSB_REG (0x65 * REG_OFFSET + BASE_PATTERN_CONTROL) -#define PATTERN_WAIT_TIMER_1_MSB_REG (0x66 * REG_OFFSET + BASE_PATTERN_CONTROL) - -/* Pattern Wait 1 RW Register*/ -#define PATTERN_WAIT_1_ADDR_REG (0x67 * REG_OFFSET + BASE_PATTERN_CONTROL) - -#define PATTERN_WAIT_1_ADDR_OFST (0) -#define PATTERN_WAIT_1_ADDR_MSK (0x00001FFF << PATTERN_WAIT_1_ADDR_OFST) - -/* Pattern Loop 1 Iteration RW Register */ -#define PATTERN_LOOP_1_ITERATION_REG (0x68 * REG_OFFSET + BASE_PATTERN_CONTROL) - -/* Pattern Loop 1 Address RW Register */ -#define PATTERN_LOOP_1_ADDR_REG (0x69 * REG_OFFSET + BASE_PATTERN_CONTROL) - -#define PATTERN_LOOP_1_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_1_ADDR_STRT_MSK (0x00001FFF << PATTERN_LOOP_1_ADDR_STRT_OFST) -#define PATTERN_LOOP_1_ADDR_STP_OFST (16) -#define PATTERN_LOOP_1_ADDR_STP_MSK (0x00001FFF << PATTERN_LOOP_1_ADDR_STP_OFST) - -/* Pattern Wait Timer 2 64bit RW Register */ -#define PATTERN_WAIT_TIMER_2_LSB_REG (0x6A * REG_OFFSET + BASE_PATTERN_CONTROL) -#define PATTERN_WAIT_TIMER_2_MSB_REG (0x6B * REG_OFFSET + BASE_PATTERN_CONTROL) - -/* Pattern Wait 2 RW Register*/ -#define PATTERN_WAIT_2_ADDR_REG (0x6C * REG_OFFSET + BASE_PATTERN_CONTROL) - -#define PATTERN_WAIT_2_ADDR_OFST (0) -#define PATTERN_WAIT_2_ADDR_MSK (0x00001FFF << PATTERN_WAIT_2_ADDR_OFST) - -/* Pattern Loop 2 Iteration RW Register */ -#define PATTERN_LOOP_2_ITERATION_REG (0x6D * REG_OFFSET + BASE_PATTERN_CONTROL) - -/* Pattern Loop 0 Address RW Register */ -#define PATTERN_LOOP_2_ADDR_REG (0x6E * REG_OFFSET + BASE_PATTERN_CONTROL) - -#define PATTERN_LOOP_2_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_2_ADDR_STRT_MSK (0x00001FFF << PATTERN_LOOP_2_ADDR_STRT_OFST) -#define PATTERN_LOOP_2_ADDR_STP_OFST (16) -#define PATTERN_LOOP_2_ADDR_STP_MSK (0x00001FFF << PATTERN_LOOP_2_ADDR_STP_OFST) +#define PATTERN_WAIT_ADDR_OFST (0) +#define PATTERN_WAIT_ADDR_MSK (0x00001FFF << PATTERN_WAIT_ADDR_OFST) +#define PATTERN_LOOP_ADDR_STRT_OFST (0) +#define PATTERN_LOOP_ADDR_STRT_MSK (0x00001FFF << PATTERN_LOOP_ADDR_STRT_OFST) +#define PATTERN_LOOP_ADDR_STP_OFST (16) +#define PATTERN_LOOP_ADDR_STP_MSK (0x00001FFF << PATTERN_LOOP_ADDR_STP_OFST) /* Pattern RAM registers --------------------------------------------------*/ diff --git a/slsDetectorServers/slsDetectorServer/include/XILINX_PLL.h b/slsDetectorServers/slsDetectorServer/include/XILINX_PLL.h new file mode 100644 index 000000000..a636ad33e --- /dev/null +++ b/slsDetectorServers/slsDetectorServer/include/XILINX_PLL.h @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// Copyright (C) 2021 Contributors to the SLS Detector Package + +#include +#include + +void XILINX_PLL_setFrequency(uint32_t clk_index, uint32_t freq); +uint32_t XILINX_PLL_getFrequency(uint32_t clkIDX); +bool XILINX_PLL_isLocked(); +void XILINX_PLL_reset(); +void XILINX_PLL_waitForLock(); +void XILINX_PLL_load(); \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/include/arm64.h b/slsDetectorServers/slsDetectorServer/include/arm64.h index 6614bfe65..eb79100d8 100644 --- a/slsDetectorServers/slsDetectorServer/include/arm64.h +++ b/slsDetectorServers/slsDetectorServer/include/arm64.h @@ -6,7 +6,9 @@ #include void bus_w(u_int32_t offset, u_int32_t data); +void bus_w_csp2(u_int32_t offset, u_int32_t data); u_int32_t bus_r(u_int32_t offset); +u_int32_t bus_r_csp2(u_int32_t offset); uint64_t getU64BitReg(int aLSB, int aMSB); void setU64BitReg(uint64_t value, int aLSB, int aMSB); u_int32_t readRegister(u_int32_t offset); diff --git a/slsDetectorServers/slsDetectorServer/include/loadPattern.h b/slsDetectorServers/slsDetectorServer/include/loadPattern.h index 0da960038..f2b25864e 100644 --- a/slsDetectorServers/slsDetectorServer/include/loadPattern.h +++ b/slsDetectorServers/slsDetectorServer/include/loadPattern.h @@ -58,7 +58,7 @@ uint64_t getPatternMask(); void setPatternBitMask(uint64_t mask); uint64_t getPatternBitMask(); -#ifdef MYTHEN3D +#if defined(MYTHEN3D) || defined(XILINX_CHIPTESTBOARDD) void startPattern(); #endif char *getPatternFileName(); diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index 8570456f3..a11f1e1ab 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -518,8 +518,6 @@ int setPhase(enum CLKINDEX ind, int val, int degrees); int getPhase(enum CLKINDEX ind, int degrees); int getMaxPhase(enum CLKINDEX ind); int validatePhaseinDegrees(enum CLKINDEX ind, int val, int retval); -int setFrequency(enum CLKINDEX ind, int val); -int getFrequency(enum CLKINDEX ind); void configureSyncFrequency(enum CLKINDEX ind); void setADCPipeline(int val); int getADCPipeline(); @@ -529,6 +527,11 @@ int setLEDEnable(int enable); void setDigitalIODelay(uint64_t pinMask, int delay); #endif +#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD) +int setFrequency(enum CLKINDEX ind, int val); +int getFrequency(enum CLKINDEX ind); +#endif + // jungfrau/moench specific - powerchip, autocompdisable, clockdiv, asictimer, // clock, pll, flashing firmware #if defined(MOENCHD) diff --git a/slsDetectorServers/slsDetectorServer/src/XILINX_PLL.c b/slsDetectorServers/slsDetectorServer/src/XILINX_PLL.c new file mode 100644 index 000000000..3a443a574 --- /dev/null +++ b/slsDetectorServers/slsDetectorServer/src/XILINX_PLL.c @@ -0,0 +1,200 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// Copyright (C) 2021 Contributors to the SLS Detector Package +#include "XILINX_PLL.h" +#include "arm64.h" +#include "clogger.h" +#include +#include +#include + +// https://docs.amd.com/r/en-US/pg065-clk-wiz/Register-Space (simplified, we +// leave some things away) + +// clang-format off +#define XILINX_PLL_INPUT_FREQ (100000) // 100 MHz +#define XILINX_PLL_MIN_FREQ (10000) +#define XILINX_PLL_MAX_FREQ (250000) +#define XILINX_PLL_MAX_CLK_DIV (256) +#define XILINX_PLL_NUM_CLKS (7) +#define XILINX_PLL_MAX_NUM_CLKS_FOR_GET (3) +#define XILINX_PLL_STEP_SIZE (125) +#define XILINX_PLL_HALF_STEP_SIZE (62) + +#define XILINX_PLL_BASE_ADDR (0x0) +#define XILINX_PLL_MEASURE_BASE_ADDR0 (0x1000) // added externally, not part of CLKWIZ core for clks 0 and 1 +#define XILINX_PLL_MEASURE_BASE_ADDR0_MAX_CLKS (2) +#define XILINX_PLL_MEASURE_BASE_ADDR1 (0x2000) // for clks 2 to 6 +#define XILINX_PLL_MEASURE_WIDTH (8) // per clock + +#define XILINX_PLL_RESET_REG (0x000) +#define XILINX_PLL_RESET_VAL (0xA) + +#define XILINX_PLL_STATUS_REG (0x004) +#define XILINX_PLL_STATUS_LOCKED_OFST (0) +#define XILINX_PLL_STATUS_LOCKED_MSK (0x00000001 << XILINX_PLL_STATUS_LOCKED_OFST) + +#define XILINX_PLL_CLKCONFIG_REG (XILINX_PLL_BASE_ADDR + 0x200) +#define XILINX_PLL_DIVCLK_DIVIDE_OFST (0) +#define XILINX_PLL_DIVCLK_DIVIDE_MSK (0x000000FF << XILINX_PLL_DIVCLK_DIVIDE_OFST) +#define XILINX_PLL_CLKFBOUT_MULT_OFST (8) +#define XILINX_PLL_CLKFBOUT_MULT_MSK (0x000000FF << XILINX_PLL_CLKFBOUT_MULT_OFST) +#define XILINX_PLL_CLKFBOUT_FRAC_OFST (16) +#define XILINX_PLL_CLKFBOUT_FRAC_MSK (0x000003FF << XILINX_PLL_CLKFBOUT_FRAC_OFST) +// The value from 0 to 875 representing the fractional multiplied by 1000 +#define XILINX_PLL_CLKFBOUT_FRAC_MAX_VAL (875) + + +#define XILINX_PLL_CLKCONFIG_BASE_ADDR (XILINX_PLL_BASE_ADDR + 0x208) +#define XILINX_PLL_CLKCONFIG_WIDTH (3 * 4) // per clock (7 clocks) + +#define XILINX_PLL_CLK_DIV_REG_OFST (0) +#define XILINX_PLL_CLK_DIV_DIVIDE_OFST (0) +#define XILINX_PLL_CLK_DIV_DIVIDE_MSK (0x000000FF << XILINX_PLL_CLK_DIV_DIVIDE_OFST) +#define XILINX_PLL_CLK_DIV_FRAC_OFST (8) // works on IDX 0 only +#define XILINX_PLL_CLK_DIV_FRAC_MSK (0x000003FF << XILINX_PLL_CLK_DIV_FRAC_OFST) + +#define XILINX_PLL_CLK_PHASE_REG_OFST (4) // signed num for +/- phase +#define XILINX_PLL_CLK_PHASE_OFST (0) +#define XILINX_PLL_CLK_PHASE_MSK (0x0000FFFF << XILINX_PLL_CLK_PHASE_OFST) + +#define XILINX_PLL_CLK_DUTY_REG_OFST (8) // (in %) * 1000 +#define XILINX_PLL_CLK_DUTY_OFST (0) +#define XILINX_PLL_CLK_DUTY_MSK (0x0000FFFF << XILINX_PLL_CLK_DUTY_OFST) + + + +#define XILINX_PLL_LOAD_REG (0x25C) +#define XILINX_PLL_LOAD_RECONFIGURE_OFST (0) // load and reconfigure state machine +#define XILINX_PLL_LOAD_RECONFIGURE_MSK (0x00000001 << XILINX_PLL_LOAD_RECONFIGURE_OFST) +#define XILINX_PLL_LOAD_FROM_REGS_OFST (1) // 0 for default values as compiled into firmware +#define XILINX_PLL_LOAD_FROM_REGS_MSK (0x00000001 << XILINX_PLL_LOAD_FROM_REGS_OFST) + +// clang-format on + +// freq in kHz !! +void XILINX_PLL_setFrequency(uint32_t clk_index, uint32_t freq) { + if (clk_index >= XILINX_PLL_NUM_CLKS) { + LOG(logERROR, ("XILINX_PLL: Invalid clock index %d\n", clk_index)); + return; + } + if (freq < XILINX_PLL_MIN_FREQ || freq > XILINX_PLL_MAX_FREQ) { + LOG(logERROR, ("XILINX_PLL: Frequency %d kHz is out of range\n", freq)); + return; + } + + // calculate base clock frequency + uint32_t global_reg = bus_r_csp2(XILINX_PLL_CLKCONFIG_REG); +#ifdef VIRTUAL + global_reg = 3073; +#endif + uint32_t clkfbout_mult = ((global_reg & XILINX_PLL_CLKFBOUT_MULT_MSK) >> + XILINX_PLL_CLKFBOUT_MULT_OFST); + uint32_t clkfbout_frac = ((global_reg & XILINX_PLL_CLKFBOUT_FRAC_MSK) >> + XILINX_PLL_CLKFBOUT_FRAC_OFST); + uint32_t divclk_divide = ((global_reg & XILINX_PLL_DIVCLK_DIVIDE_MSK) >> + XILINX_PLL_DIVCLK_DIVIDE_OFST); + uint32_t base_clk_freq = clkfbout_mult * XILINX_PLL_INPUT_FREQ; + base_clk_freq += (clkfbout_frac * XILINX_PLL_INPUT_FREQ / + XILINX_PLL_CLKFBOUT_FRAC_MAX_VAL); + base_clk_freq /= divclk_divide; + + // calcualte clock divider + uint32_t clk_div = base_clk_freq / freq; + if (clk_div < 1 || clk_div > XILINX_PLL_MAX_CLK_DIV) { + LOG(logERROR, + ("XILINX_PLL: Invalid clock divider, need to change base clock\n")); + return; + } + + uint32_t clk_div_frac = 0; + // the first clock supports fractional division, increase the precision for + // that one fractional divide is not allowed in fixed or dynamic phase shift + // mode !!!! + if (clk_index == 0) { + float clk_div_frac_f = + (float)base_clk_freq / freq - clk_div; // eg. 2.333 => 0.333 + clk_div_frac = (uint32_t)round(clk_div_frac_f * 1000); // 0.333 => 333 + clk_div_frac = ((clk_div_frac + XILINX_PLL_HALF_STEP_SIZE) / + XILINX_PLL_STEP_SIZE) * + XILINX_PLL_STEP_SIZE; // round to multiples of step size, + // 333 = > 375 + if (clk_div_frac == 1000) { + clk_div_frac = 0; + clk_div++; + } + } + + LOG(logINFOBLUE, ("XILINX_PLL: Setting clock divider to %u.%u\n", clk_div, + clk_div_frac)); + uint32_t clk_addr = XILINX_PLL_CLKCONFIG_BASE_ADDR + + clk_index * XILINX_PLL_CLKCONFIG_WIDTH + + XILINX_PLL_CLK_DIV_REG_OFST; + uint32_t clk_config_val = ((clk_div << XILINX_PLL_CLK_DIV_DIVIDE_OFST) & + XILINX_PLL_CLK_DIV_DIVIDE_MSK) | + ((clk_div_frac << XILINX_PLL_CLK_DIV_FRAC_OFST) & + XILINX_PLL_CLK_DIV_FRAC_MSK); + + bus_w_csp2(clk_addr, clk_config_val); + XILINX_PLL_load(); + XILINX_PLL_waitForLock(); + + // wait for firmware to measure the actual frequency + usleep(2 * 1000 * 1000); +} + +uint32_t XILINX_PLL_getFrequency(uint32_t clk_index) { + if (clk_index >= XILINX_PLL_NUM_CLKS) { + LOG(logERROR, ("XILINX_PLL: Invalid clock index %d\n", clk_index)); + return 0; + } + if (clk_index > XILINX_PLL_MAX_NUM_CLKS_FOR_GET) { + LOG(logERROR, + ("XILINX_PLL: get frequency not implemented for this clock %d\n", + clk_index)); + return 0; + } + + uint32_t base_addr = XILINX_PLL_MEASURE_BASE_ADDR0; + if (clk_index >= XILINX_PLL_MEASURE_BASE_ADDR0_MAX_CLKS) { + clk_index -= XILINX_PLL_MEASURE_BASE_ADDR0_MAX_CLKS; + base_addr = XILINX_PLL_MEASURE_BASE_ADDR1; + } + uint32_t addr = base_addr + clk_index * XILINX_PLL_MEASURE_WIDTH; + uint32_t counter_val = bus_r_csp2(addr); + // Hz => round to nearest kHz + uint32_t freq_kHz = (counter_val + 500) / 1000; // round to nearest kHz + return freq_kHz; +} + +bool XILINX_PLL_isLocked() { + uint32_t status = bus_r_csp2(XILINX_PLL_BASE_ADDR + XILINX_PLL_STATUS_REG); + return ((status & XILINX_PLL_STATUS_LOCKED_MSK) >> + XILINX_PLL_STATUS_LOCKED_OFST); +} + +void XILINX_PLL_reset() { + bus_w_csp2(XILINX_PLL_BASE_ADDR + XILINX_PLL_RESET_REG, + XILINX_PLL_RESET_VAL); +} + +void XILINX_PLL_load() { + bus_w_csp2( + XILINX_PLL_BASE_ADDR + XILINX_PLL_LOAD_REG, + (XILINX_PLL_LOAD_RECONFIGURE_MSK | XILINX_PLL_LOAD_FROM_REGS_MSK)); +} + +void XILINX_PLL_waitForLock() { +#ifdef VIRTUAL + return; +#endif + int timeout_us = 10 * 1000; + int count = 500; + while (count > 0) { + usleep(timeout_us); + if (XILINX_PLL_isLocked()) + return; + count--; + } + LOG(logERROR, ("XILINX_PLL: Timeout waiting for PLL to lock (%d ms)\n", + (count * timeout_us) / 1000)); +} \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/src/arm64.c b/slsDetectorServers/slsDetectorServer/src/arm64.c index 0c1cbc67f..034a9856b 100644 --- a/slsDetectorServers/slsDetectorServer/src/arm64.c +++ b/slsDetectorServers/slsDetectorServer/src/arm64.c @@ -13,11 +13,14 @@ /* global variables */ #define CSP0 (0xB0080000) #define CSP1 (0xB0050000) // udp -#define MEM_SIZE_CSP0 (0x10000) +#define CSP2 (0xA0000000) +#define MEM_SIZE_CSP0 (0x20000) #define MEM_SIZE_CSP1 (0x2000) // smaller size for udp +#define MEM_SIZE_CSP2 (0x4000) u_int32_t *csp0base = 0; u_int32_t *csp1base = 0; +u_int32_t *csp2base = 0; void bus_w(u_int32_t offset, u_int32_t data) { volatile u_int32_t *ptr1; @@ -31,6 +34,18 @@ u_int32_t bus_r(u_int32_t offset) { return *ptr1; } +void bus_w_csp2(u_int32_t offset, u_int32_t data) { + volatile u_int32_t *ptr1; + ptr1 = (u_int32_t *)(csp2base + offset / (sizeof(u_int32_t))); + *ptr1 = data; +} + +u_int32_t bus_r_csp2(u_int32_t offset) { + volatile u_int32_t *ptr1; + ptr1 = (u_int32_t *)(csp2base + offset / (sizeof(u_int32_t))); + return *ptr1; +} + uint64_t getU64BitReg(int aLSB, int aMSB) { uint64_t retval = bus_r(aMSB); retval = (retval << 32) | bus_r(aLSB); @@ -51,12 +66,12 @@ u_int32_t writeRegister(u_int32_t offset, u_int32_t data) { int mapCSP0(void) { LOG(logINFO, ("Mapping memory\n")); - u_int32_t csps[2] = {CSP0, CSP1}; - u_int32_t **cspbases[2] = {&csp0base, &csp1base}; - u_int32_t memsize[2] = {MEM_SIZE_CSP0, MEM_SIZE_CSP1}; - char names[2][10] = {"csp0base", "csp1base"}; + u_int32_t csps[3] = {CSP0, CSP1, CSP2}; + u_int32_t **cspbases[3] = {&csp0base, &csp1base, &csp2base}; + u_int32_t memsize[3] = {MEM_SIZE_CSP0, MEM_SIZE_CSP1, MEM_SIZE_CSP2}; + char names[3][10] = {"csp0base", "csp1base", "csp2base"}; - for (int i = 0; i < 2; ++i) { + for (int i = 0; i < 3; ++i) { // if not mapped if (*cspbases[i] == 0) { LOG(logINFO, ("\tMapping memory for %s\n", names[i])); diff --git a/slsDetectorServers/slsDetectorServer/src/loadPattern.c b/slsDetectorServers/slsDetectorServer/src/loadPattern.c index 90ef5b6d4..7b1a78456 100644 --- a/slsDetectorServers/slsDetectorServer/src/loadPattern.c +++ b/slsDetectorServers/slsDetectorServer/src/loadPattern.c @@ -13,7 +13,7 @@ extern enum TLogLevel trimmingPrint; extern uint32_t clkDivider[]; #endif -#ifdef CHIPTESTBOARDD +#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD) extern uint32_t clkFrequency[]; #endif @@ -54,27 +54,12 @@ void initializePatternWord() { memset(virtual_pattern, 0, sizeof(virtual_pattern)); } #endif -#endif -#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD) uint64_t validate_readPatternIOControl() { -#if defined(CHIPTESTBOARDD) return getU64BitReg(PATTERN_IO_CNTRL_LSB_REG, PATTERN_IO_CNTRL_MSB_REG); -#elif defined(XILINX_CHIPTESTBOARDD) - return (uint64_t)(bus_r(PINIOCTRLREG)); -#endif } int validate_writePatternIOControl(char *message, uint64_t arg) { - // validate input -#ifdef XILINX_CHIPTESTBOARDD - if (arg > BIT32_MSK) { - strcpy(message, "Could not set pattern IO Control. Must be 32 bit for " - "this detector\n"); - LOG(logERROR, (message)); - return FAIL; - } -#endif writePatternIOControl(arg); @@ -95,15 +80,9 @@ int validate_writePatternIOControl(char *message, uint64_t arg) { } void writePatternIOControl(uint64_t word) { -#ifdef CHIPTESTBOARDD LOG(logINFO, ("Setting Pattern I/O Control: 0x%llx\n", (long long int)word)); setU64BitReg(word, PATTERN_IO_CNTRL_LSB_REG, PATTERN_IO_CNTRL_MSB_REG); -#elif defined(XILINX_CHIPTESTBOARDD) - uint32_t val = (uint32_t)word; - LOG(logINFO, ("Setting Pattern I/O Control: 0x%x\n", val)); - bus_w(PINIOCTRLREG, val); -#endif } #endif @@ -122,7 +101,7 @@ int validate_readPatternWord(char *message, int addr, uint64_t *word) { } uint64_t readPatternWord(int addr) { -#ifdef MYTHEN3D +#if defined(MYTHEN3D) || defined(XILINX_CHIPTESTBOARDD) LOG(logDEBUG1, (" Reading Pattern Word (addr:0x%x)\n", addr)); // the first word in RAM as base plus the offset of the word to write (addr) uint32_t reg_lsb = PATTERN_STEP0_LSB_REG + addr * REG_OFFSET * 2; @@ -182,7 +161,7 @@ void writePatternWord(int addr, uint64_t word) { LOG(logDEBUG1, ("Setting Pattern Word (addr:0x%x, word:0x%llx)\n", addr, (long long int)word)); -#ifndef MYTHEN3D +#ifdef CHIPTESTBOARDD uint32_t reg = PATTERN_CNTRL_REG; // write word @@ -199,7 +178,6 @@ void writePatternWord(int addr, uint64_t word) { #ifdef VIRTUAL virtual_pattern[addr] = word; #endif -// mythen #else // the first word in RAM as base plus the offset of the word to write (addr) uint32_t reg_lsb = PATTERN_STEP0_LSB_REG + addr * REG_OFFSET * 2; @@ -223,29 +201,15 @@ int validate_getPatternWaitAddresses(char *message, int level, int *addr) { } int getPatternWaitAddress(int level) { - switch (level) { - case 0: - return ((bus_r(PATTERN_WAIT_0_ADDR_REG) & PATTERN_WAIT_0_ADDR_MSK) >> - PATTERN_WAIT_0_ADDR_OFST); - case 1: - return ((bus_r(PATTERN_WAIT_1_ADDR_REG) & PATTERN_WAIT_1_ADDR_MSK) >> - PATTERN_WAIT_1_ADDR_OFST); - case 2: - return ((bus_r(PATTERN_WAIT_2_ADDR_REG) & PATTERN_WAIT_2_ADDR_MSK) >> - PATTERN_WAIT_2_ADDR_OFST); -#ifndef MYTHEN3D - case 3: - return ((bus_r(PATTERN_WAIT_3_ADDR_REG) & PATTERN_WAIT_3_ADDR_MSK) >> - PATTERN_WAIT_3_ADDR_OFST); - case 4: - return ((bus_r(PATTERN_WAIT_4_ADDR_REG) & PATTERN_WAIT_4_ADDR_MSK) >> - PATTERN_WAIT_4_ADDR_OFST); - case 5: - return ((bus_r(PATTERN_WAIT_5_ADDR_REG) & PATTERN_WAIT_5_ADDR_MSK) >> - PATTERN_WAIT_5_ADDR_OFST); -#endif - default: + if (level < 0 || level >= MAX_LEVELS) { return -1; + } else { + return ((bus_r(PATTERN_LOOPDEF_BASE + + (PATTERN_WAIT_ADDR_WORD_OFST + + level * PATTERN_LOOPDEF_NWORDS_OFST) * + REG_OFFSET) & + PATTERN_WAIT_ADDR_MSK) >> + PATTERN_WAIT_ADDR_OFST); } } @@ -289,35 +253,13 @@ void setPatternWaitAddress(int level, int addr) { LOG(logINFO, #endif ("Setting Pattern Wait Address (level:%d, addr:0x%x)\n", level, addr)); - switch (level) { - case 0: - bus_w(PATTERN_WAIT_0_ADDR_REG, - ((addr << PATTERN_WAIT_0_ADDR_OFST) & PATTERN_WAIT_0_ADDR_MSK)); - break; - case 1: - bus_w(PATTERN_WAIT_1_ADDR_REG, - ((addr << PATTERN_WAIT_1_ADDR_OFST) & PATTERN_WAIT_1_ADDR_MSK)); - break; - case 2: - bus_w(PATTERN_WAIT_2_ADDR_REG, - ((addr << PATTERN_WAIT_2_ADDR_OFST) & PATTERN_WAIT_2_ADDR_MSK)); - break; -#ifndef MYTHEN3D - case 3: - bus_w(PATTERN_WAIT_3_ADDR_REG, - ((addr << PATTERN_WAIT_3_ADDR_OFST) & PATTERN_WAIT_3_ADDR_MSK)); - break; - case 4: - bus_w(PATTERN_WAIT_4_ADDR_REG, - ((addr << PATTERN_WAIT_4_ADDR_OFST) & PATTERN_WAIT_4_ADDR_MSK)); - break; - case 5: - bus_w(PATTERN_WAIT_5_ADDR_REG, - ((addr << PATTERN_WAIT_5_ADDR_OFST) & PATTERN_WAIT_5_ADDR_MSK)); - break; -#endif - default: + if (level < 0 || level >= MAX_LEVELS) { return; + } else { + bus_w(PATTERN_LOOPDEF_BASE + (PATTERN_WAIT_ADDR_WORD_OFST + + level * PATTERN_LOOPDEF_NWORDS_OFST) * + REG_OFFSET, + ((addr << PATTERN_WAIT_ADDR_OFST) & PATTERN_WAIT_ADDR_MSK)); } } @@ -340,39 +282,24 @@ int validate_getPatternWaitClocksAndInterval(char *message, int level, } uint64_t getPatternWaitClocks(int level) { - switch (level) { - case 0: - return getU64BitReg(PATTERN_WAIT_TIMER_0_LSB_REG, - PATTERN_WAIT_TIMER_0_MSB_REG); - case 1: - return getU64BitReg(PATTERN_WAIT_TIMER_1_LSB_REG, - PATTERN_WAIT_TIMER_1_MSB_REG); - case 2: - return getU64BitReg(PATTERN_WAIT_TIMER_2_LSB_REG, - PATTERN_WAIT_TIMER_2_MSB_REG); -#ifndef MYTHEN3D - case 3: - return getU64BitReg(PATTERN_WAIT_TIMER_3_LSB_REG, - PATTERN_WAIT_TIMER_3_MSB_REG); - case 4: - return getU64BitReg(PATTERN_WAIT_TIMER_4_LSB_REG, - PATTERN_WAIT_TIMER_4_MSB_REG); - case 5: - return getU64BitReg(PATTERN_WAIT_TIMER_5_LSB_REG, - PATTERN_WAIT_TIMER_5_MSB_REG); -#endif - default: + if (level < 0 || level >= MAX_LEVELS) { return -1; + } else { + return getU64BitReg( + PATTERN_LOOPDEF_BASE + (PATTERN_WAIT_TIMER_LSB_WORD_OFST + + level * PATTERN_LOOPDEF_NWORDS_OFST) * + REG_OFFSET, + PATTERN_LOOPDEF_BASE + (PATTERN_WAIT_TIMER_MSB_WORD_OFST + + level * PATTERN_LOOPDEF_NWORDS_OFST) * + REG_OFFSET); } } uint64_t getPatternWaitInterval(int level) { uint64_t numClocks = getPatternWaitClocks(level); int runclk = 0; -#ifdef CHIPTESTBOARDD +#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD) runclk = clkFrequency[RUN_CLK]; -#elif XILINX_CHIPTESTBOARDD - runclk = RUN_CLK; #elif MYTHEN3D runclk = clkDivider[SYSTEM_C0]; #endif @@ -425,35 +352,18 @@ void setPatternWaitClocks(int level, uint64_t t) { #endif ("Setting Pattern Wait Time in clocks (level:%d) :%lld\n", level, (long long int)t)); - switch (level) { - case 0: - setU64BitReg(t, PATTERN_WAIT_TIMER_0_LSB_REG, - PATTERN_WAIT_TIMER_0_MSB_REG); - break; - case 1: - setU64BitReg(t, PATTERN_WAIT_TIMER_1_LSB_REG, - PATTERN_WAIT_TIMER_1_MSB_REG); - break; - case 2: - setU64BitReg(t, PATTERN_WAIT_TIMER_2_LSB_REG, - PATTERN_WAIT_TIMER_2_MSB_REG); - break; -#ifndef MYTHEN3D - case 3: - setU64BitReg(t, PATTERN_WAIT_TIMER_3_LSB_REG, - PATTERN_WAIT_TIMER_3_MSB_REG); - break; - case 4: - setU64BitReg(t, PATTERN_WAIT_TIMER_4_LSB_REG, - PATTERN_WAIT_TIMER_4_MSB_REG); - break; - case 5: - setU64BitReg(t, PATTERN_WAIT_TIMER_5_LSB_REG, - PATTERN_WAIT_TIMER_5_MSB_REG); - break; -#endif - default: + + if (level < 0 || level >= MAX_LEVELS) { return; + } else { + return setU64BitReg( + t, + PATTERN_LOOPDEF_BASE + (PATTERN_WAIT_TIMER_LSB_WORD_OFST + + level * PATTERN_LOOPDEF_NWORDS_OFST) * + REG_OFFSET, + PATTERN_LOOPDEF_BASE + (PATTERN_WAIT_TIMER_MSB_WORD_OFST + + level * PATTERN_LOOPDEF_NWORDS_OFST) * + REG_OFFSET); } } @@ -466,12 +376,10 @@ void setPatternWaitInterval(int level, uint64_t t) { ("Setting Pattern Wait Time (level:%d) :%lld ns\n", level, (long long int)t)); int runclk = 0; -#ifdef CHIPTESTBOARDD +#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD) runclk = clkFrequency[RUN_CLK]; -#elif XILINX_CHIPTESTBOARDD - runclk = RUN_CLK; #elif MYTHEN3D - runclk = clkDivider[SYSTEM_C0]; + runclk = clkDivider[SYSTEM_C0]; #endif uint64_t numClocks = t * (1E-3 * runclk); setPatternWaitClocks(level, numClocks); @@ -491,23 +399,13 @@ int validate_getPatternLoopCycles(char *message, int level, int *numLoops) { } int getPatternLoopCycles(int level) { - switch (level) { - case 0: - return bus_r(PATTERN_LOOP_0_ITERATION_REG); - case 1: - return bus_r(PATTERN_LOOP_1_ITERATION_REG); - case 2: - return bus_r(PATTERN_LOOP_2_ITERATION_REG); -#ifndef MYTHEN3D - case 3: - return bus_r(PATTERN_LOOP_3_ITERATION_REG); - case 4: - return bus_r(PATTERN_LOOP_4_ITERATION_REG); - case 5: - return bus_r(PATTERN_LOOP_5_ITERATION_REG); -#endif - default: + if (level < 0 || level >= MAX_LEVELS) { return -1; + } else { + return bus_r(PATTERN_LOOPDEF_BASE + + (PATTERN_LOOP_ITERATION_WORD_OFST + + level * PATTERN_LOOPDEF_NWORDS_OFST) * + REG_OFFSET); } } @@ -546,29 +444,13 @@ void setPatternLoopCycles(int level, int nLoop) { LOG(logINFO, #endif ("Setting Pattern Loop Cycles(level:%d, nLoop:%d)\n", level, nLoop)); - switch (level) { - case 0: - bus_w(PATTERN_LOOP_0_ITERATION_REG, nLoop); - break; - case 1: - bus_w(PATTERN_LOOP_1_ITERATION_REG, nLoop); - break; - case 2: - bus_w(PATTERN_LOOP_2_ITERATION_REG, nLoop); - break; -#ifndef MYTHEN3D - case 3: - bus_w(PATTERN_LOOP_3_ITERATION_REG, nLoop); - break; - case 4: - bus_w(PATTERN_LOOP_4_ITERATION_REG, nLoop); - break; - case 5: - bus_w(PATTERN_LOOP_5_ITERATION_REG, nLoop); - break; -#endif - default: + if (level < 0 || level >= MAX_LEVELS) { return; + } else { + bus_w(PATTERN_LOOPDEF_BASE + (PATTERN_LOOP_ITERATION_WORD_OFST + + level * PATTERN_LOOPDEF_NWORDS_OFST) * + REG_OFFSET, + nLoop); } } @@ -639,59 +521,22 @@ int validate_getPatternLoopAddresses(char *message, int level, int *startAddr, } void getPatternLoopAddresses(int level, int *startAddr, int *stopAddr) { - switch (level) { - case 0: - *startAddr = - ((bus_r(PATTERN_LOOP_0_ADDR_REG) & PATTERN_LOOP_0_ADDR_STRT_MSK) >> - PATTERN_LOOP_0_ADDR_STRT_OFST); - *stopAddr = - ((bus_r(PATTERN_LOOP_0_ADDR_REG) & PATTERN_LOOP_0_ADDR_STP_MSK) >> - PATTERN_LOOP_0_ADDR_STP_OFST); - break; - case 1: - *startAddr = - ((bus_r(PATTERN_LOOP_1_ADDR_REG) & PATTERN_LOOP_1_ADDR_STRT_MSK) >> - PATTERN_LOOP_1_ADDR_STRT_OFST); - *stopAddr = - ((bus_r(PATTERN_LOOP_1_ADDR_REG) & PATTERN_LOOP_1_ADDR_STP_MSK) >> - PATTERN_LOOP_1_ADDR_STP_OFST); - break; - case 2: - *startAddr = - ((bus_r(PATTERN_LOOP_2_ADDR_REG) & PATTERN_LOOP_2_ADDR_STRT_MSK) >> - PATTERN_LOOP_2_ADDR_STRT_OFST); - *stopAddr = - ((bus_r(PATTERN_LOOP_2_ADDR_REG) & PATTERN_LOOP_2_ADDR_STP_MSK) >> - PATTERN_LOOP_2_ADDR_STP_OFST); - break; -#ifndef MYTHEN3D - case 3: - *startAddr = - ((bus_r(PATTERN_LOOP_3_ADDR_REG) & PATTERN_LOOP_3_ADDR_STRT_MSK) >> - PATTERN_LOOP_3_ADDR_STRT_OFST); - *stopAddr = - ((bus_r(PATTERN_LOOP_3_ADDR_REG) & PATTERN_LOOP_3_ADDR_STP_MSK) >> - PATTERN_LOOP_3_ADDR_STP_OFST); - break; - case 4: - *startAddr = - ((bus_r(PATTERN_LOOP_4_ADDR_REG) & PATTERN_LOOP_4_ADDR_STRT_MSK) >> - PATTERN_LOOP_4_ADDR_STRT_OFST); - *stopAddr = - ((bus_r(PATTERN_LOOP_4_ADDR_REG) & PATTERN_LOOP_4_ADDR_STP_MSK) >> - PATTERN_LOOP_4_ADDR_STP_OFST); - break; - case 5: - *startAddr = - ((bus_r(PATTERN_LOOP_5_ADDR_REG) & PATTERN_LOOP_5_ADDR_STRT_MSK) >> - PATTERN_LOOP_5_ADDR_STRT_OFST); - *stopAddr = - ((bus_r(PATTERN_LOOP_5_ADDR_REG) & PATTERN_LOOP_5_ADDR_STP_MSK) >> - PATTERN_LOOP_5_ADDR_STP_OFST); - break; -#endif - default: - return; + if (level < 0 || level >= MAX_LEVELS) { + *startAddr = -1; + *stopAddr = -1; + } else { + *startAddr = ((bus_r(PATTERN_LOOPDEF_BASE + + (PATTERN_LOOP_ADDR_WORD_OFST + + level * PATTERN_LOOPDEF_NWORDS_OFST) * + REG_OFFSET) & + PATTERN_LOOP_ADDR_STRT_MSK) >> + PATTERN_LOOP_ADDR_STRT_OFST); + *stopAddr = ((bus_r(PATTERN_LOOPDEF_BASE + + (PATTERN_LOOP_ADDR_WORD_OFST + + level * PATTERN_LOOPDEF_NWORDS_OFST) * + REG_OFFSET) & + PATTERN_LOOP_ADDR_STP_MSK) >> + PATTERN_LOOP_ADDR_STP_OFST); } } @@ -747,53 +592,16 @@ void setPatternLoopAddresses(int level, int startAddr, int stopAddr) { ("Setting Pattern Loop Address (level:%d, startaddr:0x%x, " "stopaddr:0x%x)\n", level, startAddr, stopAddr)); - switch (level) { - case 0: - bus_w(PATTERN_LOOP_0_ADDR_REG, - ((startAddr << PATTERN_LOOP_0_ADDR_STRT_OFST) & - PATTERN_LOOP_0_ADDR_STRT_MSK) | - ((stopAddr << PATTERN_LOOP_0_ADDR_STP_OFST) & - PATTERN_LOOP_0_ADDR_STP_MSK)); - break; - case 1: - bus_w(PATTERN_LOOP_1_ADDR_REG, - ((startAddr << PATTERN_LOOP_1_ADDR_STRT_OFST) & - PATTERN_LOOP_1_ADDR_STRT_MSK) | - ((stopAddr << PATTERN_LOOP_1_ADDR_STP_OFST) & - PATTERN_LOOP_1_ADDR_STP_MSK)); - break; - case 2: - bus_w(PATTERN_LOOP_2_ADDR_REG, - ((startAddr << PATTERN_LOOP_2_ADDR_STRT_OFST) & - PATTERN_LOOP_2_ADDR_STRT_MSK) | - ((stopAddr << PATTERN_LOOP_2_ADDR_STP_OFST) & - PATTERN_LOOP_2_ADDR_STP_MSK)); - break; -#ifndef MYTHEN3D - case 3: - bus_w(PATTERN_LOOP_3_ADDR_REG, - ((startAddr << PATTERN_LOOP_3_ADDR_STRT_OFST) & - PATTERN_LOOP_3_ADDR_STRT_MSK) | - ((stopAddr << PATTERN_LOOP_3_ADDR_STP_OFST) & - PATTERN_LOOP_3_ADDR_STP_MSK)); - break; - case 4: - bus_w(PATTERN_LOOP_4_ADDR_REG, - ((startAddr << PATTERN_LOOP_4_ADDR_STRT_OFST) & - PATTERN_LOOP_4_ADDR_STRT_MSK) | - ((stopAddr << PATTERN_LOOP_4_ADDR_STP_OFST) & - PATTERN_LOOP_4_ADDR_STP_MSK)); - break; - case 5: - bus_w(PATTERN_LOOP_5_ADDR_REG, - ((startAddr << PATTERN_LOOP_5_ADDR_STRT_OFST) & - PATTERN_LOOP_5_ADDR_STRT_MSK) | - ((stopAddr << PATTERN_LOOP_5_ADDR_STP_OFST) & - PATTERN_LOOP_5_ADDR_STP_MSK)); - break; -#endif - default: + if (level < 0 || level >= MAX_LEVELS) { return; + } else { + bus_w(PATTERN_LOOPDEF_BASE + (PATTERN_LOOP_ADDR_WORD_OFST + + level * PATTERN_LOOPDEF_NWORDS_OFST) * + REG_OFFSET, + ((startAddr << PATTERN_LOOP_ADDR_STRT_OFST) & + PATTERN_LOOP_ADDR_STRT_MSK) | + ((stopAddr << PATTERN_LOOP_ADDR_STP_OFST) & + PATTERN_LOOP_ADDR_STP_MSK)); } } @@ -826,6 +634,17 @@ void startPattern() { LOG(logINFOBLUE, ("Pattern done\n")); } #endif +#ifdef XILINX_CHIPTESTBOARDD +void startPattern() { + LOG(logINFOBLUE, ("Starting Pattern\n")); + bus_w(FLOW_CONTROL_REG, bus_r(FLOW_CONTROL_REG) | START_F_MSK); + usleep(1); + while (bus_r(FLOW_CONTROL_REG) & RSM_BUSY_MSK) { + usleep(1); + } + LOG(logINFOBLUE, ("Pattern done\n")); +} +#endif char *getPatternFileName() { return clientPatternfile; } diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 6b797f180..3fa5c88bf 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -5798,7 +5798,7 @@ int set_clock_frequency(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting clock (%d) frequency : %u\n", args[0], args[1])); -#if !defined(CHIPTESTBOARDD) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) functionNotImplemented(); #else @@ -5811,7 +5811,7 @@ int set_clock_frequency(int file_des) { case ADC_CLOCK: c = ADC_CLK; break; -#ifdef CHIPTESTBOARDD +#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD) case DBIT_CLOCK: c = DBIT_CLK; break; @@ -5843,7 +5843,11 @@ int set_clock_frequency(int file_des) { int retval = getFrequency(c); LOG(logDEBUG1, ("retval %s: %d %s\n", modeName, retval, myDetectorType == GOTTHARD2 ? "Hz" : "MHz")); +#if !defined( \ + XILINX_CHIPTESTBOARDD) // XCTB will give the actual frequency, which is not + // 100% identical to the set frequency validate(&ret, mess, val, retval, modeName, DEC); +#endif } } } @@ -5861,13 +5865,14 @@ int get_clock_frequency(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Getting clock (%d) frequency\n", arg)); -#if !defined(CHIPTESTBOARDD) && !defined(GOTTHARD2D) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(GOTTHARD2D) && !defined(MYTHEN3D) && \ + !defined(XILINX_CHIPTESTBOARDD) functionNotImplemented(); #else // get only enum CLKINDEX c = 0; switch (arg) { -#if defined(CHIPTESTBOARDD) +#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD) case ADC_CLOCK: c = ADC_CLK; break; @@ -7463,7 +7468,7 @@ int start_pattern(int file_des) { memset(mess, 0, sizeof(mess)); LOG(logDEBUG1, ("Starting Pattern\n")); -#ifndef MYTHEN3D +#if !defined(MYTHEN3D) && !defined(XILINX_CHIPTESTBOARDD) functionNotImplemented(); #else // only set diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/CMakeLists.txt b/slsDetectorServers/xilinx_ctbDetectorServer/CMakeLists.txt index db081528a..6abf22bd2 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/CMakeLists.txt +++ b/slsDetectorServers/xilinx_ctbDetectorServer/CMakeLists.txt @@ -6,6 +6,7 @@ add_executable(xilinx_ctbDetectorServer_virtual ../slsDetectorServer/src/slsDetectorServer_funcs.c ../slsDetectorServer/src/communication_funcs.c ../slsDetectorServer/src/arm64.c + ../slsDetectorServer/src/XILINX_PLL.c ../slsDetectorServer/src/common.c ../slsDetectorServer/src/sharedMemory.c ../slsDetectorServer/src/loadPattern.c diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/Makefile b/slsDetectorServers/xilinx_ctbDetectorServer/Makefile index 77b03aeb0..f08ac3792 100755 --- a/slsDetectorServers/xilinx_ctbDetectorServer/Makefile +++ b/slsDetectorServers/xilinx_ctbDetectorServer/Makefile @@ -23,7 +23,7 @@ DESTDIR ?= bin INSTMODE = 0777 SRCS = slsDetectorFunctionList.c -SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)arm64.c $(main_src)common.c $(main_src)/sharedMemory.c $(main_src)/loadPattern.c $(md5_dir)md5.c $(main_src)programViaArm.c $(main_src)LTC2620_Driver.c +SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)arm64.c $(main_src)XILINX_PLL.c $(main_src)common.c $(main_src)/sharedMemory.c $(main_src)/loadPattern.c $(md5_dir)md5.c $(main_src)programViaArm.c $(main_src)LTC2620_Driver.c OBJS = $(SRCS:.c=.o) diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/RegisterDefs.h b/slsDetectorServers/xilinx_ctbDetectorServer/RegisterDefs.h index bd3edb1d3..4d5563e45 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/RegisterDefs.h +++ b/slsDetectorServers/xilinx_ctbDetectorServer/RegisterDefs.h @@ -2,10 +2,16 @@ // Copyright (C) 2021 Contributors to the SLS Detector Package #pragma once +// clang-format off + +#define REG_OFFSET (4) +#define PATTERN_STEP0_MSB_REG (0x10004) +#define PATTERN_STEP0_LSB_REG (0x10000) + #define CTRL_REG (0x8000) -#define POWER_VIO_OFST (0) -#define POWER_VIO_MSK (0x00000001 << POWER_VIO_OFST) +#define POWER_VIO_OFST (0) +#define POWER_VIO_MSK (0x00000001 << POWER_VIO_OFST) #define POWER_VCC_A_OFST (1) #define POWER_VCC_A_MSK (0x00000001 << POWER_VCC_A_OFST) #define POWER_VCC_B_OFST (2) @@ -17,20 +23,20 @@ #define STATUS_REG (0x8004) -#define PATTERN_RUNNING_OFST (0) -#define PATTERN_RUNNING_MSK (0x00000001 << PATTERN_RUNNING_OFST) -#define RX_BUSY_OFST (1) -#define RX_BUSY_MSK (0x00000001 << RX_BUSY_OFST) -#define PROCESSING_BUSY_OFST (2) -#define PROCESSING_BUSY_MSK (0x00000001 << PROCESSING_BUSY_OFST) -#define UDP_GEN_BUSY_OFST (3) -#define UDP_GEN_BUSY_MSK (0x00000001 << UDP_GEN_BUSY_OFST) -#define NETWORK_BUSY_OFST (4) -#define NETWORK_BUSY_MSK (0x00000001 << NETWORK_BUSY_OFST) +#define PATTERN_RUNNING_OFST (0) +#define PATTERN_RUNNING_MSK (0x00000001 << PATTERN_RUNNING_OFST) +#define RX_BUSY_OFST (1) +#define RX_BUSY_MSK (0x00000001 << RX_BUSY_OFST) +#define PROCESSING_BUSY_OFST (2) +#define PROCESSING_BUSY_MSK (0x00000001 << PROCESSING_BUSY_OFST) +#define UDP_GEN_BUSY_OFST (3) +#define UDP_GEN_BUSY_MSK (0x00000001 << UDP_GEN_BUSY_OFST) +#define NETWORK_BUSY_OFST (4) +#define NETWORK_BUSY_MSK (0x00000001 << NETWORK_BUSY_OFST) #define WAIT_FOR_TRIGGER_OFST (5) #define WAIT_FOR_TRIGGER_MSK (0x00000001 << WAIT_FOR_TRIGGER_OFST) -#define RX_NOT_GOOD_OFST (6) -#define RX_NOT_GOOD_MSK (0x00000001 << RX_NOT_GOOD_OFST) +#define RX_NOT_GOOD_OFST (6) +#define RX_NOT_GOOD_MSK (0x00000001 << RX_NOT_GOOD_OFST) #define STATUS_REG2 (0x8008) @@ -38,8 +44,8 @@ #define FPGACOMPDATE_OFST (0) #define FPGACOMPDATE_MSK (0x00ffffff << FPGACOMPDATE_OFST) -#define FPGADETTYPE_OFST (24) -#define FPGADETTYPE_MSK (0x000000ff << FPGADETTYPE_OFST) +#define FPGADETTYPE_OFST (24) +#define FPGADETTYPE_MSK (0x000000ff << FPGADETTYPE_OFST) #define FPGA_GIT_HEAD (0x8010) @@ -50,8 +56,8 @@ #define APICOMPDATE_OFST (0) #define APICOMPDATE_MSK (0x00ffffff << APICOMPDATE_OFST) -#define APIDETTYPE_OFST (24) -#define APIDETTYPE_MSK (0x000000ff << APIDETTYPE_OFST) +#define APIDETTYPE_OFST (24) +#define APIDETTYPE_MSK (0x000000ff << APIDETTYPE_OFST) #define A_FIFO_OVERFLOW_STATUS_REG (0x9000) @@ -103,23 +109,22 @@ #define FIFO_TO_GB_CONTROL_REG (0xA000) -#define ENABLED_CHANNELS_ADC_OFST (0) -#define ENABLED_CHANNELS_ADC_MSK (0x000000ff << ENABLED_CHANNELS_ADC_OFST) -#define ENABLED_CHANNELS_D_OFST (8) -#define ENABLED_CHANNELS_D_MSK (0x00000001 << ENABLED_CHANNELS_D_OFST) -#define ENABLED_CHANNELS_X_OFST (9) -#define ENABLED_CHANNELS_X_MSK (0x0000000f << ENABLED_CHANNELS_X_OFST) -#define RO_MODE_ADC_OFST (13) -#define RO_MODE_ADC_MSK (0x00000001 << RO_MODE_ADC_OFST) -#define RO_MODE_D_OFST (14) -#define RO_MODE_D_MSK (0x00000001 << RO_MODE_D_OFST) -#define RO_MODE_X_OFST (15) -#define RO_MODE_X_MSK (0x00000001 << RO_MODE_X_OFST) +#define ENABLED_CHANNELS_ADC_OFST (0) +#define ENABLED_CHANNELS_ADC_MSK (0x000000ff << ENABLED_CHANNELS_ADC_OFST) +#define ENABLED_CHANNELS_D_OFST (8) +#define ENABLED_CHANNELS_D_MSK (0x00000001 << ENABLED_CHANNELS_D_OFST) +#define ENABLED_CHANNELS_X_OFST (9) +#define ENABLED_CHANNELS_X_MSK (0x0000000f << ENABLED_CHANNELS_X_OFST) +#define RO_MODE_ADC_OFST (13) +#define RO_MODE_ADC_MSK (0x00000001 << RO_MODE_ADC_OFST) +#define RO_MODE_D_OFST (14) +#define RO_MODE_D_MSK (0x00000001 << RO_MODE_D_OFST) +#define RO_MODE_X_OFST (15) +#define RO_MODE_X_MSK (0x00000001 << RO_MODE_X_OFST) #define COUNT_FRAMES_FROM_UPDATE_OFST (16) -#define COUNT_FRAMES_FROM_UPDATE_MSK \ - (0x00000001 << COUNT_FRAMES_FROM_UPDATE_OFST) -#define START_STREAMING_P_OFST (17) -#define START_STREAMING_P_MSK (0x00000001 << START_STREAMING_P_OFST) +#define COUNT_FRAMES_FROM_UPDATE_MSK (0x00000001 << COUNT_FRAMES_FROM_UPDATE_OFST) +#define START_STREAMING_P_OFST (17) +#define START_STREAMING_P_MSK (0x00000001 << START_STREAMING_P_OFST) #define STREAM_BUFFER_CLEAR_OFST (18) #define STREAM_BUFFER_CLEAR_MSK (0x00000001 << STREAM_BUFFER_CLEAR_OFST) @@ -148,26 +153,26 @@ #define PKTPACKETLENGTHREG (0xA020) -#define PACKETLENGTH1G_OFST (0) -#define PACKETLENGTH1G_MSK (0x0000ffff << PACKETLENGTH1G_OFST) +#define PACKETLENGTH1G_OFST (0) +#define PACKETLENGTH1G_MSK (0x0000ffff << PACKETLENGTH1G_OFST) #define PACKETLENGTH10G_OFST (16) #define PACKETLENGTH10G_MSK (0x0000ffff << PACKETLENGTH10G_OFST) #define PKTNOPACKETSREG (0xA024) -#define NOPACKETS1G_OFST (0) -#define NOPACKETS1G_MSK (0x0000003f << NOPACKETS1G_OFST) +#define NOPACKETS1G_OFST (0) +#define NOPACKETS1G_MSK (0x0000003f << NOPACKETS1G_OFST) #define NOPACKETS10G_OFST (16) #define NOPACKETS10G_MSK (0x0000003f << NOPACKETS10G_OFST) #define PKTCTRLREG (0xA028) -#define NOSERVERS_OFST (0) -#define NOSERVERS_MSK (0x0000003f << NOSERVERS_OFST) +#define NOSERVERS_OFST (0) +#define NOSERVERS_MSK (0x0000003f << NOSERVERS_OFST) #define SERVERSTART_OFST (8) #define SERVERSTART_MSK (0x0000001f << SERVERSTART_OFST) -#define ETHINTERF_OFST (16) -#define ETHINTERF_MSK (0x00000001 << ETHINTERF_OFST) +#define ETHINTERF_OFST (16) +#define ETHINTERF_MSK (0x00000001 << ETHINTERF_OFST) #define PKTCOORDREG1 (0xA02C) @@ -181,363 +186,282 @@ #define COORDZ_OFST (0) #define COORDZ_MSK (0x0000ffff << COORDZ_OFST) -#define FLOW_STATUS_REG (0xB000) +#define PATTERN_OUT_LSB_REG (0xB000) -#define RSM_BUSY_OFST (0) -#define RSM_BUSY_MSK (0x00000001 << RSM_BUSY_OFST) -#define RSM_TRG_WAIT_OFST (3) -#define RSM_TRG_WAIT_MSK (0x00000001 << RSM_TRG_WAIT_OFST) -#define CSM_BUSY_OFST (17) -#define CSM_BUSY_MSK (0x00000001 << CSM_BUSY_OFST) +#define PATTERN_OUT_MSB_REG (0xB004) -#define FLOW_CONTROL_REG (0xB004) +#define PATTERN_IN_LSB_REG (0xB008) -#define START_F_OFST (0) -#define START_F_MSK (0x00000001 << START_F_OFST) -#define STOP_F_OFST (1) -#define STOP_F_MSK (0x00000001 << STOP_F_OFST) -#define RST_F_OFST (2) -#define RST_F_MSK (0x00000001 << RST_F_OFST) -#define SW_TRIGGER_F_OFST (3) -#define SW_TRIGGER_F_MSK (0x00000001 << SW_TRIGGER_F_OFST) -#define TRIGGER_ENABLE_OFST (4) -#define TRIGGER_ENABLE_MSK (0x00000001 << TRIGGER_ENABLE_OFST) +#define PATTERN_IN_MSB_REG (0xB00C) -#define TIME_FROM_START_OUT_REG_1 (0xB008) +#define PATTERN_MASK_LSB_REG (0xB010) -#define TIME_FROM_START_OUT_REG_2 (0xB00C) +#define PATTERN_MASK_MSB_REG (0xB014) -#define FRAMES_FROM_START_OUT_REG_1 (0xB010) +#define PATTERN_SET_LSB_REG (0xB018) -#define FRAMES_FROM_START_OUT_REG_2 (0xB014) +#define PATTERN_SET_MSB_REG (0xB01C) -#define FRAME_TIME_OUT_REG_1 (0xB018) +#define PATTERN_CNTRL_REG (0xB020) -#define FRAME_TIME_OUT_REG_2 (0xB01C) - -#define DELAY_OUT_REG_1 (0xB020) - -#define DELAY_OUT_REG_2 (0xB024) - -#define CYCLES_OUT_REG_1 (0xB028) - -#define CYCLES_OUT_REG_2 (0xB02C) - -#define FRAMES_OUT_REG_1 (0xB030) - -#define FRAMES_OUT_REG_2 (0xB034) - -#define PERIOD_OUT_REG_1 (0xB038) - -#define PERIOD_OUT_REG_2 (0xB03C) - -#define DELAY_IN_REG_1 (0xB040) - -#define DELAY_IN_REG_2 (0xB044) - -#define CYCLES_IN_REG_1 (0xB048) - -#define CYCLES_IN_REG_2 (0xB04C) - -#define FRAMES_IN_REG_1 (0xB050) - -#define FRAMES_IN_REG_2 (0xB054) - -#define PERIOD_IN_REG_1 (0xB058) - -#define PERIOD_IN_REG_2 (0xB05C) - -#define PATTERN_OUT_LSB_REG (0xB100) - -#define PATTERN_OUT_MSB_REG (0xB104) - -#define PATTERN_IN_LSB_REG (0xB108) - -#define PATTERN_IN_MSB_REG (0xB10C) - -#define PATTERN_MASK_LSB_REG (0xB110) - -#define PATTERN_MASK_MSB_REG (0xB114) - -#define PATTERN_SET_LSB_REG (0xB118) - -#define PATTERN_SET_MSB_REG (0xB11C) - -#define PATTERN_CNTRL_REG (0xB120) - -#define PATTERN_CNTRL_WR_OFST (0) -#define PATTERN_CNTRL_WR_MSK (0x00000001 << PATTERN_CNTRL_WR_OFST) -#define PATTERN_CNTRL_RD_OFST (1) -#define PATTERN_CNTRL_RD_MSK (0x00000001 << PATTERN_CNTRL_RD_OFST) +#define PATTERN_CNTRL_WR_OFST (0) +#define PATTERN_CNTRL_WR_MSK (0x00000001 << PATTERN_CNTRL_WR_OFST) +#define PATTERN_CNTRL_RD_OFST (1) +#define PATTERN_CNTRL_RD_MSK (0x00000001 << PATTERN_CNTRL_RD_OFST) #define PATTERN_CNTRL_ADDR_OFST (16) #define PATTERN_CNTRL_ADDR_MSK (0x00001fff << PATTERN_CNTRL_ADDR_OFST) -#define PATTERN_LIMIT_REG (0xB124) +#define PATTERN_LIMIT_REG (0xB024) #define PATTERN_LIMIT_STRT_OFST (0) #define PATTERN_LIMIT_STRT_MSK (0x00001fff << PATTERN_LIMIT_STRT_OFST) -#define PATTERN_LIMIT_STP_OFST (16) -#define PATTERN_LIMIT_STP_MSK (0x00001fff << PATTERN_LIMIT_STP_OFST) +#define PATTERN_LIMIT_STP_OFST (16) +#define PATTERN_LIMIT_STP_MSK (0x00001fff << PATTERN_LIMIT_STP_OFST) -#define PATTERN_LOOP_0_ADDR_REG (0xB128) +#define PATTERN_IO_CNTRL_LSB_REG (0xB028) -#define PATTERN_LOOP_0_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_0_ADDR_STRT_MSK \ - (0x00001fff << PATTERN_LOOP_0_ADDR_STRT_OFST) -#define PATTERN_LOOP_0_ADDR_STP_OFST (16) -#define PATTERN_LOOP_0_ADDR_STP_MSK (0x00001fff << PATTERN_LOOP_0_ADDR_STP_OFST) +#define PATTERN_IO_CNTRL_MSB_REG (0xB02C) -#define PATTERN_LOOP_0_ITERATION_REG (0xB12C) +#define FLOW_CONTROL_REG (0xB030) -#define PATTERN_WAIT_0_ADDR_REG (0xB130) +#define START_F_OFST (0) +#define START_F_MSK (0x00000001 << START_F_OFST) +#define STOP_F_OFST (1) +#define STOP_F_MSK (0x00000001 << STOP_F_OFST) +#define RST_F_OFST (2) +#define RST_F_MSK (0x00000001 << RST_F_OFST) +#define SW_TRIGGER_F_OFST (3) +#define SW_TRIGGER_F_MSK (0x00000001 << SW_TRIGGER_F_OFST) +#define TRIGGER_ENABLE_OFST (4) +#define TRIGGER_ENABLE_MSK (0x00000001 << TRIGGER_ENABLE_OFST) +#define RSM_BUSY_OFST (5) +#define RSM_BUSY_MSK (0x00000001 << RSM_BUSY_OFST) +#define RSM_TRG_WAIT_OFST (6) +#define RSM_TRG_WAIT_MSK (0x00000001 << RSM_TRG_WAIT_OFST) +#define CSM_BUSY_OFST (7) +#define CSM_BUSY_MSK (0x00000001 << CSM_BUSY_OFST) -#define PATTERN_WAIT_0_ADDR_OFST (0) -#define PATTERN_WAIT_0_ADDR_MSK (0x00001fff << PATTERN_WAIT_0_ADDR_OFST) +#define DELAY_IN_REG_1 (0xB034) -#define PATTERN_WAIT_TIMER_0_LSB_REG (0xB134) +#define DELAY_IN_REG_2 (0xB038) -#define PATTERN_WAIT_TIMER_0_MSB_REG (0xB138) +#define CYCLES_IN_REG_1 (0xB03C) -#define PATTERN_LOOP_1_ADDR_REG (0xB13C) +#define CYCLES_IN_REG_2 (0xB040) -#define PATTERN_LOOP_1_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_1_ADDR_STRT_MSK \ - (0x00001fff << PATTERN_LOOP_1_ADDR_STRT_OFST) -#define PATTERN_LOOP_1_ADDR_STP_OFST (16) -#define PATTERN_LOOP_1_ADDR_STP_MSK (0x00001fff << PATTERN_LOOP_1_ADDR_STP_OFST) +#define FRAMES_IN_REG_1 (0xB044) -#define PATTERN_LOOP_1_ITERATION_REG (0xB140) +#define FRAMES_IN_REG_2 (0xB048) -#define PATTERN_WAIT_1_ADDR_REG (0xB144) +#define PERIOD_IN_REG_1 (0xB04C) -#define PATTERN_WAIT_1_ADDR_OFST (0) -#define PATTERN_WAIT_1_ADDR_MSK (0x00001fff << PATTERN_WAIT_1_ADDR_OFST) +#define PERIOD_IN_REG_2 (0xB050) -#define PATTERN_WAIT_TIMER_1_LSB_REG (0xB148) +#define PATTERN_TEST_REG (0xB054) -#define PATTERN_WAIT_TIMER_1_MSB_REG (0xB14C) +#define PATTERN_FIRMWARE_REG (0xB058) -#define PATTERN_LOOP_2_ADDR_REG (0xB150) +#define PATTERN_WIDTH_OFST (0) +#define PATTERN_WIDTH_MSK (0x000000ff << PATTERN_WIDTH_OFST) +#define PATTERN_ADDR_WIDTH_OFST (8) +#define PATTERN_ADDR_WIDTH_MSK (0x000000ff << PATTERN_ADDR_WIDTH_OFST) +#define PATTERN_NLOOPS_NWAITS_OFST (16) +#define PATTERN_NLOOPS_NWAITS_MSK (0x000000ff << PATTERN_NLOOPS_NWAITS_OFST) +#define DIRECT_PATTERN_RAM_OFST (24) +#define DIRECT_PATTERN_RAM_MSK (0x00000001 << DIRECT_PATTERN_RAM_OFST) -#define PATTERN_LOOP_2_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_2_ADDR_STRT_MSK \ - (0x00001fff << PATTERN_LOOP_2_ADDR_STRT_OFST) -#define PATTERN_LOOP_2_ADDR_STP_OFST (16) -#define PATTERN_LOOP_2_ADDR_STP_MSK (0x00001fff << PATTERN_LOOP_2_ADDR_STP_OFST) +#define TIME_FROM_START_OUT_REG_1 (0xB05C) -#define PATTERN_LOOP_2_ITERATION_REG (0xB154) +#define TIME_FROM_START_OUT_REG_2 (0xB060) -#define PATTERN_WAIT_2_ADDR_REG (0xB158) +#define FRAMES_FROM_START_OUT_REG_1 (0xB064) -#define PATTERN_WAIT_2_ADDR_OFST (0) -#define PATTERN_WAIT_2_ADDR_MSK (0x00001fff << PATTERN_WAIT_2_ADDR_OFST) +#define FRAMES_FROM_START_OUT_REG_2 (0xB068) -#define PATTERN_WAIT_TIMER_2_LSB_REG (0xB15C) +#define FRAME_TIME_OUT_REG_1 (0xB06C) -#define PATTERN_WAIT_TIMER_2_MSB_REG (0xB160) +#define FRAME_TIME_OUT_REG_2 (0xB070) -#define PATTERN_LOOP_3_ADDR_REG (0xB164) +#define PATTERN_LOOPDEF_BASE (0xB080) -#define PATTERN_LOOP_3_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_3_ADDR_STRT_MSK \ - (0x00001fff << PATTERN_LOOP_3_ADDR_STRT_OFST) -#define PATTERN_LOOP_3_ADDR_STP_OFST (16) -#define PATTERN_LOOP_3_ADDR_STP_MSK (0x00001fff << PATTERN_LOOP_3_ADDR_STP_OFST) +#define PATTERN_LOOP_ADDR_WORD_OFST (0) +#define PATTERN_LOOP_ADDR_WORD_MSK (0x00000001 << PATTERN_LOOP_ADDR_WORD_OFST) +#define PATTERN_LOOP_ITERATION_WORD_OFST (1) +#define PATTERN_LOOP_ITERATION_WORD_MSK (0x00000001 << PATTERN_LOOP_ITERATION_WORD_OFST) +#define PATTERN_WAIT_ADDR_WORD_OFST (2) +#define PATTERN_WAIT_ADDR_WORD_MSK (0x00000001 << PATTERN_WAIT_ADDR_WORD_OFST) +#define PATTERN_WAIT_TIMER_LSB_WORD_OFST (3) +#define PATTERN_WAIT_TIMER_LSB_WORD_MSK (0x00000001 << PATTERN_WAIT_TIMER_LSB_WORD_OFST) +#define PATTERN_WAIT_TIMER_MSB_WORD_OFST (4) +#define PATTERN_WAIT_TIMER_MSB_WORD_MSK (0x00000001 << PATTERN_WAIT_TIMER_MSB_WORD_OFST) +#define PATTERN_LOOPDEF_NWORDS_OFST (5) +#define PATTERN_LOOPDEF_NWORDS_MSK (0x00000001 << PATTERN_LOOPDEF_NWORDS_OFST) +#define PATTERN_WAIT_ADDR_OFST (0) +#define PATTERN_WAIT_ADDR_MSK (0x00001fff << PATTERN_WAIT_ADDR_OFST) +#define PATTERN_LOOP_ADDR_STRT_OFST (0) +#define PATTERN_LOOP_ADDR_STRT_MSK (0x00001fff << PATTERN_LOOP_ADDR_STRT_OFST) +#define PATTERN_LOOP_ADDR_STP_OFST (16) +#define PATTERN_LOOP_ADDR_STP_MSK (0x00001fff << PATTERN_LOOP_ADDR_STP_OFST) -#define PATTERN_LOOP_3_ITERATION_REG (0xB168) +#define DBITFIFOCTRLREG (0xC000) -#define PATTERN_WAIT_3_ADDR_REG (0xB16C) - -#define PATTERN_WAIT_3_ADDR_OFST (0) -#define PATTERN_WAIT_3_ADDR_MSK (0x00001fff << PATTERN_WAIT_3_ADDR_OFST) - -#define PATTERN_WAIT_TIMER_3_LSB_REG (0xB170) - -#define PATTERN_WAIT_TIMER_3_MSB_REG (0xB174) - -#define PATTERN_LOOP_4_ADDR_REG (0xB178) - -#define PATTERN_LOOP_4_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_4_ADDR_STRT_MSK \ - (0x00001fff << PATTERN_LOOP_4_ADDR_STRT_OFST) -#define PATTERN_LOOP_4_ADDR_STP_OFST (16) -#define PATTERN_LOOP_4_ADDR_STP_MSK (0x00001fff << PATTERN_LOOP_4_ADDR_STP_OFST) - -#define PATTERN_LOOP_4_ITERATION_REG (0xB17C) - -#define PATTERN_WAIT_4_ADDR_REG (0xB180) - -#define PATTERN_WAIT_4_ADDR_OFST (0) -#define PATTERN_WAIT_4_ADDR_MSK (0x00001fff << PATTERN_WAIT_4_ADDR_OFST) - -#define PATTERN_WAIT_TIMER_4_LSB_REG (0xB184) - -#define PATTERN_WAIT_TIMER_4_MSB_REG (0xB188) - -#define PATTERN_LOOP_5_ADDR_REG (0xB18C) - -#define PATTERN_LOOP_5_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_5_ADDR_STRT_MSK \ - (0x00001fff << PATTERN_LOOP_5_ADDR_STRT_OFST) -#define PATTERN_LOOP_5_ADDR_STP_OFST (16) -#define PATTERN_LOOP_5_ADDR_STP_MSK (0x00001fff << PATTERN_LOOP_5_ADDR_STP_OFST) - -#define PATTERN_LOOP_5_ITERATION_REG (0xB190) - -#define PATTERN_WAIT_5_ADDR_REG (0xB194) - -#define PATTERN_WAIT_5_ADDR_OFST (0) -#define PATTERN_WAIT_5_ADDR_MSK (0x00001fff << PATTERN_WAIT_5_ADDR_OFST) - -#define PATTERN_WAIT_TIMER_5_LSB_REG (0xB198) - -#define PATTERN_WAIT_TIMER_5_MSB_REG (0xB19C) - -#define PINIOCTRLREG (0xB1A0) - -#define DBITFIFOCTRLREG (0xB1A4) - -#define DBITRD_OFST (0) -#define DBITRD_MSK (0x00000001 << DBITRD_OFST) -#define DBITRST_OFST (1) -#define DBITRST_MSK (0x00000001 << DBITRST_OFST) -#define DBITFULL_OFST (2) -#define DBITFULL_MSK (0x00000001 << DBITFULL_OFST) -#define DBITEMPTY_OFST (3) -#define DBITEMPTY_MSK (0x00000001 << DBITEMPTY_OFST) +#define DBITRD_OFST (0) +#define DBITRD_MSK (0x00000001 << DBITRD_OFST) +#define DBITRST_OFST (1) +#define DBITRST_MSK (0x00000001 << DBITRST_OFST) +#define DBITFULL_OFST (2) +#define DBITFULL_MSK (0x00000001 << DBITFULL_OFST) +#define DBITEMPTY_OFST (3) +#define DBITEMPTY_MSK (0x00000001 << DBITEMPTY_OFST) #define DBITUNDERFLOW_OFST (4) #define DBITUNDERFLOW_MSK (0x00000001 << DBITUNDERFLOW_OFST) -#define DBITOVERFLOW_OFST (5) -#define DBITOVERFLOW_MSK (0x00000001 << DBITOVERFLOW_OFST) +#define DBITOVERFLOW_OFST (5) +#define DBITOVERFLOW_MSK (0x00000001 << DBITOVERFLOW_OFST) -#define DBITFIFODATAREG1 (0xB1A8) +#define DBITFIFODATAREG1 (0xC004) -#define DBITFIFODATAREG2 (0xB1AC) +#define DBITFIFODATAREG2 (0xC008) -#define MATTERHORNSPIREG1 (0xB1B0) +#define MATTERHORNSPIREG1 (0xC00C) -#define MATTERHORNSPIREG2 (0xB1B4) +#define MATTERHORNSPIREG2 (0xC010) -#define MATTERHORNSPICTRL (0xB1B8) +#define MATTERHORNSPICTRL (0xC014) -#define CONFIGSTART_P_OFST (0) -#define CONFIGSTART_P_MSK (0x00000001 << CONFIGSTART_P_OFST) -#define PERIPHERYRST_P_OFST (1) -#define PERIPHERYRST_P_MSK (0x00000001 << PERIPHERYRST_P_OFST) -#define STARTREAD_P_OFST (2) -#define STARTREAD_P_MSK (0x00000001 << STARTREAD_P_OFST) -#define BUSY_OFST (3) -#define BUSY_MSK (0x00000001 << BUSY_OFST) +#define CONFIGSTART_P_OFST (0) +#define CONFIGSTART_P_MSK (0x00000001 << CONFIGSTART_P_OFST) +#define PERIPHERYRST_P_OFST (1) +#define PERIPHERYRST_P_MSK (0x00000001 << PERIPHERYRST_P_OFST) +#define STARTREAD_P_OFST (2) +#define STARTREAD_P_MSK (0x00000001 << STARTREAD_P_OFST) +#define BUSY_OFST (3) +#define BUSY_MSK (0x00000001 << BUSY_OFST) #define READOUTFROMASIC_OFST (4) #define READOUTFROMASIC_MSK (0x00000001 << READOUTFROMASIC_OFST) -#define TRANSCEIVERRXCTRL0REG1 (0xB800) +#define TRANSCEIVERRXCTRL0REG1 (0xC100) -#define TRANSCEIVERRXCTRL0REG2 (0xB804) +#define TRANSCEIVERRXCTRL0REG2 (0xC104) -#define TRANSCEIVERRXCTRL1REG1 (0xB808) +#define TRANSCEIVERRXCTRL1REG1 (0xC108) -#define TRANSCEIVERRXCTRL1REG2 (0xB80C) +#define TRANSCEIVERRXCTRL1REG2 (0xC10C) -#define TRANSCEIVERRXCTRL2REG (0xB810) +#define TRANSCEIVERRXCTRL2REG (0xC110) -#define TRANSCEIVERRXCTRL3REG (0xB814) +#define TRANSCEIVERRXCTRL3REG (0xC114) -#define TRANSCEIVERSTATUS (0xB818) +#define TRANSCEIVERSTATUS (0xC118) #define LINKDOWNLATCHEDOUT_OFST (0) #define LINKDOWNLATCHEDOUT_MSK (0x00000001 << LINKDOWNLATCHEDOUT_OFST) -#define TXUSERCLKACTIVE_OFST (1) -#define TXUSERCLKACTIVE_MSK (0x00000001 << TXUSERCLKACTIVE_OFST) -#define RXUSERCLKACTIVE_OFST (2) -#define RXUSERCLKACTIVE_MSK (0x00000001 << RXUSERCLKACTIVE_OFST) -#define RXCOMMADET_OFST (3) -#define RXCOMMADET_MSK (0x0000000f << RXCOMMADET_OFST) -#define RXBYTEREALIGN_OFST (7) -#define RXBYTEREALIGN_MSK (0x0000000f << RXBYTEREALIGN_OFST) -#define RXBYTEISALIGNED_OFST (11) -#define RXBYTEISALIGNED_MSK (0x0000000f << RXBYTEISALIGNED_OFST) -#define GTWIZRXCDRSTABLE_OFST (15) -#define GTWIZRXCDRSTABLE_MSK (0x00000001 << GTWIZRXCDRSTABLE_OFST) -#define RESETTXDONE_OFST (16) -#define RESETTXDONE_MSK (0x00000001 << RESETTXDONE_OFST) -#define RESETRXDONE_OFST (17) -#define RESETRXDONE_MSK (0x00000001 << RESETRXDONE_OFST) -#define RXPMARESETDONE_OFST (18) -#define RXPMARESETDONE_MSK (0x0000000f << RXPMARESETDONE_OFST) -#define TXPMARESETDONE_OFST (22) -#define TXPMARESETDONE_MSK (0x0000000f << TXPMARESETDONE_OFST) -#define GTTPOWERGOOD_OFST (26) -#define GTTPOWERGOOD_MSK (0x0000000f << GTTPOWERGOOD_OFST) +#define TXUSERCLKACTIVE_OFST (1) +#define TXUSERCLKACTIVE_MSK (0x00000001 << TXUSERCLKACTIVE_OFST) +#define RXUSERCLKACTIVE_OFST (2) +#define RXUSERCLKACTIVE_MSK (0x00000001 << RXUSERCLKACTIVE_OFST) +#define RXCOMMADET_OFST (3) +#define RXCOMMADET_MSK (0x0000000f << RXCOMMADET_OFST) +#define RXBYTEREALIGN_OFST (7) +#define RXBYTEREALIGN_MSK (0x0000000f << RXBYTEREALIGN_OFST) +#define RXBYTEISALIGNED_OFST (11) +#define RXBYTEISALIGNED_MSK (0x0000000f << RXBYTEISALIGNED_OFST) +#define GTWIZRXCDRSTABLE_OFST (15) +#define GTWIZRXCDRSTABLE_MSK (0x00000001 << GTWIZRXCDRSTABLE_OFST) +#define RESETTXDONE_OFST (16) +#define RESETTXDONE_MSK (0x00000001 << RESETTXDONE_OFST) +#define RESETRXDONE_OFST (17) +#define RESETRXDONE_MSK (0x00000001 << RESETRXDONE_OFST) +#define RXPMARESETDONE_OFST (18) +#define RXPMARESETDONE_MSK (0x0000000f << RXPMARESETDONE_OFST) +#define TXPMARESETDONE_OFST (22) +#define TXPMARESETDONE_MSK (0x0000000f << TXPMARESETDONE_OFST) +#define GTTPOWERGOOD_OFST (26) +#define GTTPOWERGOOD_MSK (0x0000000f << GTTPOWERGOOD_OFST) -#define TRANSCEIVERSTATUS2 (0xB81C) +#define TRANSCEIVERSTATUS2 (0xC11C) #define RXLOCKED_OFST (0) #define RXLOCKED_MSK (0x0000000f << RXLOCKED_OFST) -#define TRANSCEIVERCONTROL (0xB820) +#define TRANSCEIVERCONTROL (0xC120) -#define GTWIZRESETALL_OFST (0) -#define GTWIZRESETALL_MSK (0x00000001 << GTWIZRESETALL_OFST) +#define GTWIZRESETALL_OFST (0) +#define GTWIZRESETALL_MSK (0x00000001 << GTWIZRESETALL_OFST) #define RESETTXPLLANDDATAPATH_OFST (1) #define RESETTXPLLANDDATAPATH_MSK (0x00000001 << RESETTXPLLANDDATAPATH_OFST) -#define RESETTXDATAPATHIN_OFST (2) -#define RESETTXDATAPATHIN_MSK (0x00000001 << RESETTXDATAPATHIN_OFST) +#define RESETTXDATAPATHIN_OFST (2) +#define RESETTXDATAPATHIN_MSK (0x00000001 << RESETTXDATAPATHIN_OFST) #define RESETRXPLLANDDATAPATH_OFST (3) #define RESETRXPLLANDDATAPATH_MSK (0x00000001 << RESETRXPLLANDDATAPATH_OFST) -#define RESETRXDATAPATHIN_OFST (4) -#define RESETRXDATAPATHIN_MSK (0x00000001 << RESETRXDATAPATHIN_OFST) -#define RXPOLARITY_OFST (5) -#define RXPOLARITY_MSK (0x0000000f << RXPOLARITY_OFST) -#define RXERRORCNTRESET_OFST (9) -#define RXERRORCNTRESET_MSK (0x0000000f << RXERRORCNTRESET_OFST) -#define RXMSBLSBINVERT_OFST (13) -#define RXMSBLSBINVERT_MSK (0x0000000f << RXMSBLSBINVERT_OFST) +#define RESETRXDATAPATHIN_OFST (4) +#define RESETRXDATAPATHIN_MSK (0x00000001 << RESETRXDATAPATHIN_OFST) +#define RXPOLARITY_OFST (5) +#define RXPOLARITY_MSK (0x0000000f << RXPOLARITY_OFST) +#define RXERRORCNTRESET_OFST (9) +#define RXERRORCNTRESET_MSK (0x0000000f << RXERRORCNTRESET_OFST) +#define RXMSBLSBINVERT_OFST (13) +#define RXMSBLSBINVERT_MSK (0x0000000f << RXMSBLSBINVERT_OFST) -#define TRANSCEIVERERRCNT_REG0 (0xB824) +#define TRANSCEIVERERRCNT_REG0 (0xC124) -#define TRANSCEIVERERRCNT_REG1 (0xB828) +#define TRANSCEIVERERRCNT_REG1 (0xC128) -#define TRANSCEIVERERRCNT_REG2 (0xB82C) +#define TRANSCEIVERERRCNT_REG2 (0xC12C) -#define TRANSCEIVERERRCNT_REG3 (0xB830) +#define TRANSCEIVERERRCNT_REG3 (0xC130) -#define TRANSCEIVERALIGNCNT_REG0 (0xB834) +#define TRANSCEIVERALIGNCNT_REG0 (0xC134) #define RXALIGNCNTCH0_OFST (0) #define RXALIGNCNTCH0_MSK (0x0000ffff << RXALIGNCNTCH0_OFST) -#define TRANSCEIVERALIGNCNT_REG1 (0xB838) +#define TRANSCEIVERALIGNCNT_REG1 (0xC138) #define RXALIGNCNTCH1_OFST (0) #define RXALIGNCNTCH1_MSK (0x0000ffff << RXALIGNCNTCH1_OFST) -#define TRANSCEIVERALIGNCNT_REG2 (0xB83C) +#define TRANSCEIVERALIGNCNT_REG2 (0xC13C) #define RXALIGNCNTCH2_OFST (0) #define RXALIGNCNTCH2_MSK (0x0000ffff << RXALIGNCNTCH2_OFST) -#define TRANSCEIVERALIGNCNT_REG3 (0xB840) +#define TRANSCEIVERALIGNCNT_REG3 (0xC140) #define RXALIGNCNTCH3_OFST (0) #define RXALIGNCNTCH3_MSK (0x0000ffff << RXALIGNCNTCH3_OFST) -#define TRANSCEIVERLASTWORD_REG0 (0xB844) +#define TRANSCEIVERLASTWORD_REG0 (0xC144) #define RXDATACH0_OFST (0) #define RXDATACH0_MSK (0x0000ffff << RXDATACH0_OFST) -#define TRANSCEIVERLASTWORD_REG1 (0xB848) +#define TRANSCEIVERLASTWORD_REG1 (0xC148) #define RXDATACH1_OFST (0) #define RXDATACH1_MSK (0x0000ffff << RXDATACH1_OFST) -#define TRANSCEIVERLASTWORD_REG2 (0xB84C) +#define TRANSCEIVERLASTWORD_REG2 (0xC14C) #define RXDATACH2_OFST (0) #define RXDATACH2_MSK (0x0000ffff << RXDATACH2_OFST) -#define TRANSCEIVERLASTWORD_REG3 (0xB850) +#define TRANSCEIVERLASTWORD_REG3 (0xC150) #define RXDATACH3_OFST (0) #define RXDATACH3_MSK (0x0000ffff << RXDATACH3_OFST) + + +// ---------------------------------------------------- +// TODO: fix these in the firmware reg generator: +// ----------------------------------------------------: + +#define DELAY_OUT_REG_1 (0xB054) +#define DELAY_OUT_REG_2 (0xB058) +#define CYCLES_OUT_REG_1 (0xB05C) +#define CYCLES_OUT_REG_2 (0xB060) +#define FRAMES_OUT_REG_1 (0xB064) +#define FRAMES_OUT_REG_2 (0xB068) +#define PERIOD_OUT_REG_1 (0xB06C) +#define PERIOD_OUT_REG_2 (0xB070) + +// clang-format on diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer b/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer index efc5f399e6d3547b955bff76572b153c268587db..901d97a7dcf53c22e635e0c48d049057dea56601 100755 GIT binary patch literal 305464 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⩔j@{w#^(+J{Oh9|A#*ZF1ixUue?Xv84-}Vgc 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%0DBF(sPBuJ_G{`H zJghSI8)a(0ubT9%{8Z|!fqx@A_BD&I@;Omgzj`Londw!a^EOMT&e}xZ8Usy?19pzs zhcmavc9^pcJiiCsMh+hPU9nRakY+tJpPN>UYg)-K&UH`@+jWY{@&6^k9Sz*kp|2cZ z(u_BGpN5Ci;g>VmoU7!XFk&t^Yt%lU++5@T&&v%q{{Or<|F3ob<{MZSSs1R*$p34d zzb^9s$f?BtizeQi^GC#DX0MU{=Y~E}zD9m^4SrS6HvdUeZfGIBsu>^G3jZy{(~7$v z7Tob3@X+z`Aq=0su?@Jbz$wTk!@gK#vZs~JzLLdQWHUCD&ExMX?dNZ?vN-@bGy{V* zDdYE9x5}HerL*;Id<=95o_vd9jRLMFzRL%$_pSma{}sZ8J#U^E;<{V7cvgF=9W+jE z0hh*ip-%J*{-ZMZfoA%y^snBe{rq>RBmLXC?1|8iuS^$wiCIq{?7=hhYkiT4`R*h8 zkv9z}`R?NYU_|r4Dd+o>eaL@#<$z!tJjyqUmI`l=g6-J?Ke9dj#A{#cJAA%{NBe9L zul)Z`boQ*`evHr-oN3at^0O_k`$?|Mjpo23|1k8v&|WSArshm_w^XZzUBMn+`3S+i z&%(b)@cIJ3ZwP;ZNzckpu<(s6p}*jpv;BiLD$}1j{bw0je$u38I`qvm zYYOsAT6Z)4WiH=`oNK=ii9ghH;v63D66f#)BPnjL4&kmrFBHpUt7qlkhjufEhr9~w zS!uq-hMs)^8R`Ekl*z(xJ^YHlK_)#b{|fKZr038E;Wt4mi5*H~ipwaop{;6Nc5$ji zXI7Gb8+x=B8jN0~si(FfrZ}E=kzN#Ns^fca&~h~I^slob*}>2>IHXBuMY23^c;O>hv%E9BiR+~JUVG&IKF!s?&}M`fzqLlU?Z~&?L03w zO3#Tp!n;Hr5sV}q!G;NLK}WD*XTVdEj{NaT_(NuY6`%Nqdg~i5Gig8nc`GaJZ;-6l z01rDmPjz-<-lXXIyqOMSkAcGUdn ztI%fFO_pc2NZ;#>FBuoyru-2V`P_&ZX3V7Z<3j)ThXf6RHyHSXXJD(@%VyFu^0k(i zVeq25vO8uSl7HE1;gD^)B5u8ieb3hl&QRbE4dMDGJtIHF!qwdl(vdK>A87T$?y-*h zRx-Z3d_6!snt6+9%pa+37OFi%|6Z^0D)~l^?4|w|_}#hpeN5WVZ>OI4{*>s^y!HZM zEWp=jUi;+mIdM*ba*1;af{~vRz1l51pY?yyPI?WrBiCBx9gLhb#?{zSe3y5}H^IiWv%^=+m7{I3OLQt2KIGY)t1G-e59HZ%~9e^N)f-h`~ykk*`(!Nd1p z#t097yB^=FcG@gFJWHP>uPWpvS&t#D_XXXKoqLYvTkTrbP!D|zeXV4W8%)0wEyMz9 zH^nf9j;5hO1$0DvQnHl28#;2;_-#2OKv~(2rojB*bqId#WEx@|v85yy+7b9V1Q{y*xUCa-Dl;9k*M zi4U&~?eynOdRG2WOZ!)-Z{nQ~Qk=gkjdz|!W^L!Q?p;~x)1H6Ja~CA z@euTD+$vfs*vl-x!+nrx?Hg<-?_f8NZ;rf1-Z(ceJ2H5MylDSm zh@(1?JkZS|yt?Y(Me>Hbc}>;9^W^R6=B3lY7V-wTd6{(Zd-61{EYg<_9wSfwwUEa? z%uVEJ&73jQX3x%OWjF{dpI9fc6fTt0m zuYXy4ZFpWsxima}oc=b5_%*^k8a|?D@uYd?X3iNKePWOAeuAet8~n8DKO=ZNUnjgV zvbZLsr$bqY{@+th^v@2jPR zGq=n<%usL{pHA!(%J6{TSw+Rx9jJPn2x7gqIArLegVywSkoT>D1Vb^66O zOq%@^z!L1DjZDzlBSSqKNBPclR_(Od!1Wvdy2_Lf+bKIPxK((qtc7=uN&ET!mM6^{ zjVqHcx>mwxiuTVTPY-!cV~K2W&P$?eb>%4vLX zmhx;r$WmssN&ES~Qzn#CX&Yyp{#rqKwdMCM&k;?uc|LlUE}&2MN=C!2jIMQMlo=nK zB%DsWSC};G|CCFEL;ldv%brOiKc`*aVb6~CRz6gqxAg3ROUEF}$i|44cT9P|aVh`E zENn0KM4B^v4lOSUK6Y;{Z$3=9(59E3 zM=3A&K)Z6qSnZ$KCbzuoP>R0#2KgcE(l%;if8vW}bv%3>_LOf)!VmR}{k4ea4`p=> z9&EtY4)8ouR>#BN3D0jkz|)NE+r^%rIxIQ%Y&s}dfP6|~&-B5;N#vEpp4{Jk0(m8| zC;LU!{@8?KyjM3Nm`z?u?AbISm_c4i?8%p8}Ltc68`Of9#ZTr7HyD}g6|LfTERl)4w>xqJ^OdY(cIp*&A(&eCU|bzXA?=dUEg(*6+k$rU}WpXc%W=f8Bm zF6xKYPpNN9AL;+hbzHkcdW-!w-&7%fQ9eH6HTekH2G)NXTgkWMP53$7+!^xHWz@q~ zU9b9%f0|*^e*RR+W}17>&5rTGuX@%#ZT8Yf1Q$6lvfw<_!Z-;S7r;k~pXxjgKOw)- zouif~;kR=D(U|h5TGwHG8GTDuYX}wIh4W0CurE+^8h48a{!Q%e__=|?kDogd{E~q= z9{?==^*zW2(IOw^@veA|&+=#6$m`_~)EU7X`>54sDV{TwH|JD!?v%aNIrc)chSYez zX{Y~|C-xG;%Q=>(L&Spv9#Ta{=oDt z=7|gq>SxgK4d|i#AojVKc$hhzTAh7m4?|!7!i&uKMCrf%KjNK3+;f_Cwvd(KVm?elB#bTTkb4#yc^Gig76mF3Z#Mc_^k!8JP1bENZ< zUnM%9|)-~W@m)Mm(G4t$$uw>7Hm z=-cK#l+V(Z8l!Y(Yg##L7}=W+^)@rb=!!qS96>T6fZg3 zADCY)u|4X)!p-_-Nq#qU`|3ez=Q0`9S>3Kcx69vU9KDZZ_DN(`jIoMiBDKTcj6KE2 zOfutj?q}$2#_Raw#@wWk&lTY~jys*E1}UeF#m`-eL6O@QidlS9=D}Q+S_kZv{4ZRwZwVjHevu)@}2d%ATY<8{M?FW(xW#n6;cOSFw*4uZwn?~zXQ6D=N z_^qT1_K-Vj)yF=#gg&OebSm@4ywB~Z2=uK!?iAx}O8A{Vjn$7)U)!L*_ItCAwsV=& z*KABce`qN5x29>qkBsbP!@{|n<7``;E?LmF($UwP{`P&I%k?GFrOHlpNqtdsBJvqe zztKS-jC>O19D28VSuZ$4^x3|ZMFt~H+Rx8~-dO$X+kqZ&7FT+Nz1b=L#qWKzO=uUQ zacy!8(t%Cbp5o3~>C_dpo&IMzbW7*Av;Q1?`8};pmBk?cl`rcZ)8ErhpB|6wi+#E4 zerywTTl)`x6~@f?w}96*f3@9f zstTSKjgG(io=NllZ}DXN&v>W*JQd@w+_q64k-v)U?%l7)^%EP@*jPVPb^W|wP%ed! zi((+<-AkVCB{cc;C1P6heUD<>J7b3O7)Epw4@9xX?xdskE005**n4|Qdk1OLKU@s| z{9i12IKJ>OllJo`+cw=_x@uz(`8xW>Ao&gR&s`c?lhPfSn`mc!o1qzh@Cx7URjeT$ zs`7ej&vLEw(%4ztK_Kr3tPA7R~#E!8n0~k zyk5a4%i8}v_JFIuSKIbCvRC}Uw`#mY1`JAbZ;IMh?K6q?=`;qB-Nv8D4tHp8yxzv% zES22Be?XbspA}u$n>_C&55*T6^BI`|pS5erzWsPdGPi5CMy3%Rk}vTW-z1P;XdQQu z^efcA@Y(cN%0;nRbgzu~_Xb>VV(VU!-WnL->ZJS!uQ@u6enmQ6D#x-|fHA- z6|}bznKy|4%hit_Ko<0?DDFrDvz2rq?%>`{#T|dU2wS-U+i3b=6yH}6bI{-5Q$F+6 z?a=uEy5Ot{XfDZx->V$H*U!NJt>8bD0AIWTe~X158`G#iVz*l9`z7OuOuyhX$;+|J zLrj|eW0EhhJBw@LbTzWgrcZ;jyic>YxON8m*?w$cZHVkOI;-~fvU>#6%4js->44_} z(0D-w^CJAzpH>31RKM*!5br&Hr}Dly4-|uoeUD?xaBXH^x%BNnw7~_H;NmA-rzPRy zy~pqP5?rAlGW<045Bds+<_|Iv&Y8S zOJZQw4G8`!7}iG#ra60ot-KqU`leL0pDcoTBKdkw0bj8!{lWAvk9{19SJii3y0BQr z;K>aL)Suo1m%fLzulg@{&E%f?{=BBA?mWX^o;G)vrIuF=_PJN7M&AOma}h=txtD7? zdDxYul47WmsZwaY9a8oJ| zY|r;Kelv4;g8NU&CxS~kjpYjE_{Mz)}BDzL&ami_iI}=#E(CrW)BZ!=24lwav3belONIGJ=o&@%eUE z1UFStgsXlV)iH6nQzxf80W8i8b;@zNb?;r=yh>?x2%opq>E)Z zBAqli%Ie=&E@$0MVe3b9l0#TFv@+YIAZdYSZ${6UoW((HkKzapP~A6VK0 z`%d_*eX$!BvTwEj9QFcMG>08Vy3br~3>}Ny2O3;ChnuI=9vUrb%{d_4M}@wcU0up09*65*&Q?T4U$_#^S><3bHF=Sct2i( zcQWutcq8y#6%E6MOEk`;>}-|&SV`HVdB3-}w<$Z!mQCE(`x{dqJ3(i4K+ZZw8a!{LS7(rLefc~w529P zG9i)4i6?bvPwYb3i zzURI?&z;FkXn&vGt$#G_;mmW-J?EZ#?z!*xxzD474`2MgC*&Q_E0J*!85v>7xr%mZ z_~IJXCJ)2=D8GllTm1z6?YhbA#o6{(!tjCHgf6so$dYruw}_tB*3TPT-;Dik5&JF4 zu-^^X>{9PiWxuJ`*4GpFCW%{<5%(tOmwA_|xUV~(t$*f}|IawDF18@wl2`VcKP2{f z^1Y0?#a3bu?(R};*tlt*8z%l=L391*a^WX@AK?=3QGSbz-8@U4gSfw5eEMSIa^Cd& zQvV9dFBy_}g@nnt;!*m^Z}49FH$H)1e``Fn@w}I#@6~w>Ud6+m(Zcfq;o*MIa?0Z| z{6^7+FH!A)y=UvHlNG!_TCo2QQnt5LJn`5kSi2o4UBYp02mUR@pbLL-U9yDnyJMfaswxU;ZJnzSFM|gG_ zan@dR^F_BQSvDGZU8ZiPj6Nc|U5Rd2R6Oyi%d~#e=qp7(Zwh<1x}5eF408S++5JX8 zd{paqNr4)p4D&7PN3Tb>%277kTX0bG{!w@{eP?e0_f}`v%xACG_nznwy)Hp7zKJb1 z`#Sxv=rl}w66iEMP3hENbb8Y2G#Ptcgg%#`&(%5f8PR+{%%zXdxp}t?jh$pn{3ze# ze(WNx&vD~VEu3#$V{OE_b+J)Nwm##~=iSt;=Xqy%Tn>G_%N3v0Z?TUrZQVG^gM3r3 zucMCbEhy)lIepjB_oN?U?lJXI=#RZy`?icPcAL88V}qdHqswcMDec~4^v#snb)w%> zTEE{Gd@tQ3?XQeuW&KUC?Cl6X-#AzL`tPHQl#S{msJl`p<@r;jA?=aUn|r@i|4&@$ z*C!)i!adHmua);TeoUYKW8J4;qMm6B(GTB`ev*De-Nl&wenztTv-;hvX=eTyuD8B- zvfdAsv9ahU_^Oso(MON(=_@enUst{J^8Aqx zMk_AlE?vg4qO)C({axc?*CX?4|q=u7rt&8mm~|P z^4;J6B^!K{{m#Nmm$jhRqoUUXS}$~*eDGJSr%d}=-;Loz^---CI!l{e272Yuk0(F4HnTy_hBzuxWm*Ecsuy$iqm^7z;KEdRPM^e=z-W6^`Vzwz?;S2D}L z)`$M(UGYHFEB*Y-<6k{l{*?^@JMv<&0loJP- z&(aUl_bnSS?dOxk^*Y#RnXq5m=IwgiAUX`%KGXOeX-xK)eJFbHJEkvRru%XkC$$h4 zS;07oG$xn-etY!bjbGFH&e#2GhQ6k6i4k{r@_VBr-!@~aT>6^&NE(w{KKS0~;L_pz z`Wl-(D*8UNBkE86swdVYOPJ1+VT?|g5x{4aLr*Vp*J=sWE5y_!W|&abZ- zuZh0iySGJ0cAC19%O6Z1C;Iw#k+_`MjT%#FMfZt zJpB!=YhUQQq_=FudG znP=-~{9g3)KJrj>qY?`_X92C7;f%pP9#qe&y*+QNPK|7qac=_~h`E z_u&s;$!$N=j);E4!}mwMq2b*6Id#Xsh`y`rtGV?v{v!GfFM1%_^5X-!?dQ~S?~@;m zmY@1mZvBj3EBy|AFgo~gGu}7$8yR=wb+mKWJt}2vY!f5x!KK*d&rSRJ4l~Cacf)nG zbJrnj*@!8>Cy6`qAD@ht$IZC-PBZTsx8S;i#6?!%V~#rLo zF0z7p@E+p&7j28Se9ZXc95X+0^)iA{B(Z%ntG%3?RzA8u-EjbR$ta(Jl1DK zM_H3m>p@_Ju^!vLiSVt;9{kukeuh-f8oHG!tFFkiL>q*dMooVD^&O5;$V=qJ2 zqXt<+ll}XGDWm~S-gA-l7Vb_{=L|f;Wk3BE_CLM}kHq!(zCF6UM)6HG@d!H#|5a!1 z{(-zt;nIYkZ#QUpt4K%IsbsB-Jc%x{?y2Oqus6(pwbJp7_uHpQPh?6wbo$Vhgw@I( zzU)a8#`)_H6-?kh4Ncek8`w+MHt*e-e&|iChpV{gEN5cexatgu#5J$DP9fDTqq$;W(j)$5Vp-mUMX za?XdE^W&Z^580o0%FWID(TmmjzqcrTFvh`8N3%|mb2weh|S55H)4DT-a_$Z!tl`{`Tj)(-#?>%zGX!60j-el5spotavnP0 z0na19kb01hCiP~_v=x1fv=u#1+F}E*;CoVkTsyXlFOlzTKYpXwP3$3S%*sdbckx-V z8NM&)@vgFV<9Feir9W`#flU>yVGP=;+%!pB*0o=*v}G;*`$D(SJEm!{b@<_BGSA_pYOR%Jug08fo$<!C95)RI|2gNtxN3z1jFI9Yz!~U|Ioz!-l zIg}DT7>mjMKO);#&z%3w&com}L!CmqOt-=1#JyBKbN_#k2mO9=`diN3X_S%liQ2x` z4*e9{NnXmauY`^Bua)x^TMLJ;4eZ-x>{}=D)8kGbO;;-2PRm(Ke*Y4>kIYY!FX1gP zGQ5`Jp>m}YcdBtm<}h(isQ3J;P9K3M(8HTGbin9QF@dvtY5e2)O#j#@I(&-r>E<5C z0iK`dxm?}>gkNyM!C7j*`UZ(RZpzS=8@Z?L{>*#Y-XXNgDS@1Jo{#b@vc>nd?9~3o zn7qk`+cOV3t?L52Tr09D_lqQtlgXpGFZN54M}B__y4d9o?4tBDdU_+*>HBn?JI&O6 zI^1dYAUv`!o)Q1xn}_~QWOBFZQSLJpJ3gYGt4@EA__^#=D!MuLD&cvQy$0o*YvVrm z%MHZMW3M-g9LHXl^K9)R_9{Q0y$+TH_WH4;gT1~gx|@6UJY=j@&sC>yN4D5Y?iI|) z|M2XgFGw77$DQQ=PW8F@f^KJT+~|DD_B{6h4(I`oC-d47&( zl{VjUbI)Y><10SzjW77TAKq900{7LwkgF~Gp2)pF^wodl`6$nlme}lfI~*S~;Tb+Q zJU6h}M?@Aj>z4ff7j^HybltmLJy)KdWNbDCn~8jBJ4JtwJ3L|%$JAG`*{jrZ<>|A? z^k%Sz$oI47xb_=o?Kdx@O;_^#c|&!=f7yl9S5-+h?^x}m3)`M)aOk+ALIG?>m%^X9f^6?J;tY2; zUY&VQakHfPeCQu{86BP{OwO7}ng!+ZJ+pD2nyX@|58ZE!PM6nk2Hw*RRC(lgZa)ov#PgbIs}ZL6>~B*gE9jq}sONoZ1w| z?o$}U-?HTiIX^1rqp#{{c|r9147}L&w@=FV@hAuBn_|-M-V#w~Aia&{4`lN^Vt9O+ zQ<``q_`)DMh%bmP;tQ`AJ71rf=5t~L^6H)|Q{`B`Ajt1O4e0!SLGpJo`Mp@@_fGX( zb9$M{uZ#)Z^yRmlpSSB5qLbvwll2JvQsoc&Rlnwr^_wDkodWDl@LqF_F}Hf3iRYs? zYk&00Zy5Tpq7|c^3KNmkrt_O~(dncs_as^R8Q#KJg}5-vWzI1imk}rM_4jx%RnCWaY6>L}-qE zmP$H~eY%Z(RDC1-81{djw3Uwx-W=FylE}eEzmoi!@qpOqLG@g9`hC#FMpKQAq@6ly znS_ViT`)rv094G=baOJg*oShXYVs>gmY=@-pqO; z^BH;9_ShBr8|}y5%)2ymc|Vi(MdmpzGS~CQ4Shw%(X8)rmjpgA7;RV2<)^<#{+MI) zZv8bwN8w|Q?g{n$4A01t=Rz}%P~juj4E4gJWD6h9BRprs8N6|5t;E6K6c5io;(1W+ zqx3HvlKU(~uDaKP_TVbsvs1Lv3)LN@QpWauaL;>hRMtjYiUwaRSn8wTk@R~M&c2ga zrAJ;aWKB)|CLglC_H%SOM!L_#SBMO?COhuJ>ncawyBRX;o|RRQPZoXIbG$Qn6q%w| zsUs`xe1}5b`%-0ft@p(9%n^^t+Ag-1an`Tti&WmRi|8q3a0~1Fa_5d4PTO&toE;Xr zDpT%PsLq-j{Z__f%#BuKYaf07O4=#PP}2Da(ow&+7R-ZR?K^x9dYbQGNSkNNTJGMq zW%-}?(D(8zb|{c?<{Wh#*;bD9H>z*8I(ZiisX4XN1|Cx5+N#qx!57HFA4FD^use;8 zaxWVDEK1jd=qJ7->1>ufqNA+$t8~eWy!WkagTJ^oQ+fQI?z<%J7Q;JIPkYOF>q!}J znKTATL)mfg0(&Ph>tgDB_U8f{k6bXM=G3O|lQP~e`JwL{XKXCw3e}XY6;~@Np@n(?T;Dtlah2o&L7tCNt`hbfWmhic%$>8ud0o}fXnnNIpP9Vku2L=> zBm8<5etSi9dF}EgAw{tXeL+|4@|yZA0^#%XgwM+zUYaXd{AW!%W8Q~X@ZQcv;@F$P4jK}=J z`MrIe-6=oS5%*hrx_T4wRNRmE_4V}mUGZcxwl?l}b}MRke85DWLqgXDfBve@L}&Ma zU)j;w>o>)dDSvTKtgp>)jQ8CW@AHFr*NJ*gx?QneKh;AjT|Ipp=J=JdZmmsEYdqe@ zb4R>&onO=0*R?*@7ndZ}-|g`>e|gV6{`|N2^KL4;ety}!1%739lRv+7KEokbes3(9 z^w-3aovnTft&)CEyI<3=q{5GNxA|-Oljlv+FSe=sWF*%rJ z>eOaS)d~}zU!&`qV~YW{s6_Qq@(dWD_ghV(@4C z$^O<>8UkA$N-tEEx*7|re$(Q>)_$=nt(k2lete)8kH(#5w#^FoZTV9ZrI06Dhp37t zVjKKO<6=J=U)z~X#ru>G%qy$wOm@XmtsPhSk)EF3Vq}&1xA*l>-jv@!iFOY8sgjug z660V065}s;iSZ{kYWubKClVV}LnPHpnxWAd#!h~!lV+EkShJ|8HJt-+HN;X_rCV2x zi8_oLqrz-4k&LgbrM$az;ea)KMs&ZeC$5XoST-sZ3>(7W6q^pvC6}2GRm7uJQ;F&% zOXu((BIn;w`j&Y&dfsyJm)_n)XKM_f_q;ycoO_+^tv%iCoooGgs-x83=&$XI_sVa2 zj*Y$_Tffe~_CC`^&6w}M>srI+m6;zjO6pf2$I7_2vpb&huQd{9-{W69Z~jf9)SP+O z5+|Qz=FjSHX6bw-c%~Llza?7s(^szb8&f^KzOFLbIB=*i-Q|_}b#!etvChPKyO>E{ zV?3qW!~R~|VYbr+%nNE(W~VyIo7>mZlbVYqlXC}DzdO4%wPtQ>e_vm`JJq~KdfsNb z<8{fov7VW2&An|VKQE2X^BQ{A$5m$Ade(RQu|&dei?!mIR^O_4d#pd9o93SWRA>j2 zA4~6z^~Jhq1N%%1Qb~)ga@HLenQMs~OLVU7 zmeEJ;+U_2urV8o8wtlM&NP=;QDr8)=*;k|wWq&Z?54&mtsM-H;t4$DWHENT_ zTvx+>djC283i{Muae!8FKRPV+;8Rj6fbJ!kGL{JZL?~rMF@m$h+uJoEx4xo)DlMy) zw|Ik$-=wysq$k%SQmGoeh9K!OnV*F6Tcv$bDQJyDyC}JqoL91HpJ-dMW%u?Z5+c^>O~NXHEcqr{ zUh%Z63F`RTEcs!BX8l9r+wMT^b-9GH!7pV+f4St5XW$)*CJkM zf14k*s?aWD1i!n#YYn4*e`caT9B1f2nY*hRHH|cxt_L&cu<$85PykuqrLiYc^hL9=!_lW3j=N1|M(IAtw#qZm_pP zhfgqgioq+4^P|77b(JlTPta_#p&zyvS3@B zfkwPd*1F{HCCnc>#SxN;p7lPBvgUUC6B+MVD)n6ARa8~d6Sdu~bn9O!Nv7gmxNI!N zfK-W?o7|9`%c|Yn&d#2>ZSi|LS(K39W%_sN+|KT1;kl`~v%9xH<@7(2o+HiVrzwyx}{Mh>pzVArSO?!#IfKcZz8LBYQ~W4 z@3MW02iJX3-+*l-`UX{vO?zuq3G~%Ey$O(39Yx1V?|j0+be3D46B$q zNY4?e!d3fdx{^e^J(##IPV}^{lYG1L(r_B(O}yIl(3N^7mZUc;@vCB~*qRL~Iu={s zCthuP-mxQ2yxQ%_$BrwC6Te5s4;e9a&}b!yZ~d}W^2HF@)NC4+B&FCc>zMKG)(y7U z@jo+=Vlbw8WTh>PD9sTqL*3GQHA`QAx3Z_L;>iu&s;;-0vG?Gey1m_O@K%Gj8=PN1 zH6I$K-+fcRu;l2y+iqbW<(2&)y9q`Kg!@V_?|#q<*(#ED%fBnux3*taOpJ$ePma)ZnKyXrQu*w}sj-FGeNNu@eiKAV5{U3Nz+ zwdQWPo%q>5m&CgnceVNq8CYPdQwvP0518XOuIubghSTrVhF%u^WeJI44;s;U%$`l( z#hOmWUm5Gd1Tu+d1CGwb3JR9=9U1*1!|Z*yLdyIVdP8Ik0cxPdrbeohM#WhqNcHzB z{W?W9i(xFn&DP5wIt46N-N`Wf?z@)tcdw-(?RPCVwzbrvnrwZj1z$bo!xUYT6q73% zf-cfnm2j9;jxriMCF!l}v_#siQYoK#>=yOKTjOmsdkjc%u1rPLWJ<<<_jLB9`Z0>0 zoU-&Z&?-|~m1|`h79D5LmL=dt{1f=1awcsWUkw(B@M6=(2&@Oro}EOXnG@Ucq&`Se zI&_X-)uVP^`dOf3MT_+hMx(9t$+F9`W`pD?)z@Qn_t~Oc8c+19?z&O0|JaE*ix6(D zOm^NY;}(@!M773xW36n%nSpyN^&-Yjj$Op1-RZcew`^@&e`i-&s!Y})ve)|?BaL{n z+0is zy>@&X@T)o(RIi}_3+SdkDKTp0z_r+TgQUac@>Ca45Ba*=B5E6SVoo zQH|^0(-~8{jy9&1msgFSdlXV=0~OR6jL-Z`c|qr>o%yy zSf?#PO=<7%R*Tr$lWLdLF6WS=`m^(rEYBm`j)8QE>ZyEEW*#LJ;4CIDWWJyAEBm1= z;;|CLX@hy}IpP$$81!1JBoyi;;7<|fu=S64l+MiyLaSaN3$ZCcMd@g%*VVZF`7ljZ6haoaj&abCxr z-K#xY_gkKqS-VYdMup=YDD|gmd3Ir_eCrx*NU|KWK^D8MAGv%kF&baPMiB#AGd}NA z&z`rWr>AYrhIlZq?Vx=S1x#n_N%fLv+gZwQ`BT*ftjopoGP(xBwG%UM>(LA1Qu?|= z2=^=JcvdX=(>%vh(_Fo(y0W>lzOJrfIg2ed%}c7AnyadtswisG*qkd)8W;t znyRDADW%Lc&ldyq4sbuc%vG9X0w%`hlFL>PFo{X}uP&Xl&L&`nk5QVo9|MvAXE|-rhlGHY$L`D$7k zt!`XeAE|1tUS1tt!a+phHC05Lnky=ATT$D{99N9PpM=*pj0z@P%8yyE@HMSKvi=L? zEElEFtRlh@f156bY_5q`)K$Cjk&`Q2*wV^=j!-)7@vGS5-$U?r5&4!C|Z&wHb}PvFO6zxMH!RgRts!a)sOYRg}6>IwO8| zxQg!-kXF{HXVV#jF8tb;nj_UUcATL7()vtD(c#8^VKC{49Bnrz*o5b>kBOxD>Z&Um zS469;!h*;O$53IJX!|*O*F@{uz*R!?nQ)U%UG?%NL)7I^b;t6Gy4uR- zXvOj+w*8cLBwAl<45{^TpCk2^x6+78gQv)<+FDz*4i-QwD&jC$2j(IgFbb8S5>{qm-0y{h|Kp6F%ix7SC_g1hls!xyQS zwx+6z)~Qj~wH)-yJ1WD9m`Rt_ImM6NGSZXqO3ArxcrxjA6^*xQgBgD?`nch)Jo4SF zX_@ieaNS`*>RyQ})uBsMeWjr_2Rnl>+q-bq;8V|7ebIiEj&&4z>RFj3Uzc7>lm>akR#|+D7R+P2-}fpy(%l)HDV? z55K9qdHDl+9)5aa;Ysv|8tZGC)Y!!|Zb}T{k!q<*H9PljWS^(&&4fjvjjmBPASE{CWacRTjd>EsF*y>44k z5ws_wkNYfi=8-JquV_#`n(Ne7V9UenY(-Lh1bIoHwti zYM|LrLpq(GT;al>89rZ?ucVhNJS)C#9!$A7@q_SD@kM;D_$FN9S24_WwYTweg=fcC zVvKw@z75ZaZ?qgG-wDr(uf=4`uWbmzGvYVY8`stL5A<=uN5xl?a>O^`5?{t~%7v~Q_ze|Ny4>oBokdvtf2USFRx_!VCRYU0GWdv}a=PT;a+d%T>cZYJNp8CJlZ@xWunrzKk9fTE+6^x`1r?j1HIh zE30Ya83k?XbA(HL zGtUpB8+~$xOMKDO6lySTUC~e_qa}C9WGBCY9T{I$*UAckRJb}8E$nnu(o^$hGqQE; zu>`4&Jlk~bv*bs9yS=n6uYBQl-Xh~}D@Wvp@nxQENMbgVuK1sNGxsk z?Kkn=XGu?=9LwZTICVaTk9xFPtjld ze&#$;m%nK#(NB*nX%DKZYbsVm)S`~~L2YC6%G#*R?<6Um57+*YdX%?30m0-~=3ArI zY(hEIQ|zjrwSU#pvQ;!#|C2ItpUEE_=v*f}@~7)%u5ih>YR57dbo^Z5LHvryl6uyx zmZ~(I_*vl+Up2ziFTEzG^^tIE4tHHl@|P=I;;VeB=2NHVKC5(`VYr@1>v-<)+=fg1 znh2eP8ujUT?z7OPJu$v()|hm>eBt8H4Ydu`42Oepu*k_3uJS1p$_xhW4^?@>$vW$P z&9zm=zk=~ig!<-|vmMVl;Wj^(M@2^tlkJMAYF?y52sJDp31KaiJ}V3ty>o?&d^?_K zY^YYV7VCGp!X^H#EG97OaXh1@*|gWe(s8hqVe%(@CXUmQ>T<~!?$#gSXUS7%-_#5D zS?CS*kqTT}ubXB)3tf%lB$B(1nkQVzTfy{@3F=~}Jrz4P_4V+g( zEn4l@?z)KN$9>j*XhSmE&z$Q`qK9clrH)oNvs6}X>V?!#wN_!e^>A%AtiSo_BG;v5 z&!0u_vFO52lak?I?z7M<>mw`bR8Oq+ai3Mbs-?cMNDz3qj@OVQTz6rvN@2O0agw~h zP7SVP^shP*B4~MI(T$!F2FkJ;WHbr%9Tl$hHtT9?olaE}dRt`)qkmqylo(aMxn{+3 zm7X1d1|zd-i4iQLpugI03dnZjiS-g$|Fq%8AJqD%4Wq>i7eck41tjaP@C9K~;6ZC- zS6Z{^szY!$K6HKq8QLM8jgB1jjDdF!I_stxi%QBwS@BGP25w`@InYB7*h6x5K1I)* z8y-3GYa5raaw)$G(h|D`8yZ>s!PFoteALE64tmB$LstGrEtqG~^%zGMtK7-0(p&sD z)LjjpUQ9f*IYv5ao?s;?r&n^-{#p>6rH^X3XvLO>@iX+uK^L=HaZbZ$1Z4Sh*f0k4 z(fqZ`tEyK8^wH^$MHio^I}8M5r?2V+L(>&%71xf7#m&?*GX>F5QF&{%-Db%4SEavN zX&*zsOnOHCbjPpFv!ZLIF*Uj7nM zM3ie6t+Ltsw-%0bWI4>mZm>bXp$n%#|xEV@k0 z)LMGZ@cGuSf_zGRRikpmmvA_&{u%m710F19%RnTLU4s?NEc&R0N!Cx6S4OMV4!CLz zOrN6l%J%bMna=pZ`RGA@)g~b;Te`egF!?tte`DlRFUaM#L%2W}&@=o*7Ii4G+A2Gq z&GK8Pol(Pw8Vsu>WtGQ^jpwd%=9FU>0JF*?SbQ?sFm|=pp^YLR>de*B+nx2EvFIU9 z>Y2O1C23@(KWbqr%T5*120anZvWpWQq?b_udB*EOtFp z^5@1e?M{DNxku6;xg4)0j-EIa8 zIg(K%jGCX>_it*<$zJO}3J zdVuR*yte?00Pa2XZHGN2A<02+anz#YJ9 zpcz;L#DNZA9ncND6G#E;fqQ{>0o-xu-4DDE_yDj4_$cr(;N!q{;1j?u;8Eal;4{GI zfX@SafiD4n4ajAn2Y_z?-vqu5JPmvY_$T0dz+vD=z`p`N0Y-r5f&UBq5;y_;JMbUC z?|~P9{{qed1%;kB9=HgY1iT8E0$c*T4tPB<9k>#B6EG7f2Hp(J0pRp9FYcVBu>0e=Vl1MrW)Gl1yv z1Mm-le*umFKLefvehwT5ehvH^@LS*%@CV?Jz*)ef5f}$t2uuWufQy0G0+#~QfGdDE z0#^YufNO#4fZ0GPa6ND%@D^YZa0{>)s0Nk-w*t$7+khrObbbY1vB4`o@bdY8mW@Xx@rz>k5S0^D8easRvb3*cA4Z-A4) z?|}aVP6KCvG*C!8a{({`m<+rccnvTWxD2=)cmv=AR|D4ovw#v{E-)Xs0ays!47?4f z0IGl`z%rl?XaE|4mB1aqYM>cd1H^$2U>(p6yc0+P>w$ZLcL9UI{lNQx4**+$j{+Y9 zJ`QXLJ^}0k9t9o;CeU=tcuuZVE1sF0#cO=(PE}s7iVwtF`{gAu-m`Mva0_nGZ0k&_ zi^Uw8dbf(V#5%kC!|PW`fxZ{G0FZIwMZl{887In}d^ZC!rjvEa7N8CIE$|$unB;$sUvUq&@aY@Vc%f0=Pv#Z&#X+v^OHt_H_p8gsl8I!qeF3kTdnCB;K;EM= zZ@2L(oK4q`pMy8!;=JC5c>7*fy*;;FQL8pmmeki*Exx1L)2BYEL;Btkuao!dNZwOg zgV)D+CAWL6$NTloT)@$p?1+mAJ#`CASEst{NS>j0OFVhcs+TBs9Ip$Ww?gF|wK3lg z)SB|bwtCV3#c~jT{@bpZ=T$3*lCm=IN0v>Jo4;)KgZmwwcwKE0!*8cZ%u90QV|foI zPI8l=WQxCh@ypD`WKk74Ol(CrFZK4U?dJVe?$xxfDN12zdFY!FN)ZLc-=<%t?d{W7 z4lCXD-5=`JYb8K#OK|S?$a)Vkcq`k!tL~{wF}V792RwaLTxBgd8}Z!^c+lKwqC ziIiOKoZ#LPxkb(T^^27g>XrNQo|-~2%VC^0WWPW70UZ#36$m>iV(>(v#vWM++O zg}8-FH7;rAPb?7J+oR3l=#l&0n=rpZXBpMh*f4y3Undv8U_$&*-NUPHMB`Q3;LhDp zrSRT8M=hE1>U+Zi33Ao)0QdHW@lAe{`qClh2089u5!F_7ugOUX^-ao6HhwI;PE_vR zLoWv{bz?3Y8Xdu5AMLUr+{y)aWtb8qW1Eu*Sh zW9n;Pq7E-R%e;(C`mNFRe007?%gMToEEMz-^>MT1Tw7*ajf{GftrxF%x5oOpu|WJ{ zjC6x|F?~xA1sF@nh+u1?z@b9WpHLXlz6|ijiI(?02TMy_?4Vw%FpDM^h3_fm{|^Y-h{^F z&PYevD{d6;Nm7^9eVKFoC2~cTzT4NYBo zZ*M3x;r-o035SKm*Y|ohmYw6T!?m4jW8A9AMR#T%;oM&m z#FKkSyE?fpiM~k}r>g8W>KO6l8Z#R$On0S?%iVfu2%J%-zAI-E_dv){ zw5NM+PkXz%^;t5-pDC|eeRELfz53E6zUd(MXv?^i+qU&TjN$YJ5ZoutEuZ>R0DsG*-ANf2aV7YuWc9>V3PcUmmBlkZRUx?zM;oKsQTfJ-DtFW9hmM+M1?}~r zpS`m`Cbxge)qd*F`U~H7VQSgW1xCsKHP)kum6=~Vp=$v3NURkk)8^lWhxBdWVn8)1o@ty-_)LDz$AXru z6NK?4|6`_Mk1J@xwoU;b^qjLu&7f_n7fN)Q_$$!XK!wN@d!CX?}2ZXB~DzgRwH!o9cZvV6aX+p~}mOy)~x&5_c|)H6&#>nIB3%LnDEl{5{( z81X`3S?RgU<4_F*YRIFj_mw1#qfM&O?`(1b296v#WWn4VV09 zwxceW{RG6-X1*ks(CLp|IjfbXR=9Gc!FA>6D9Nl)Nn8G0|Ktizb9ZNOzh}_Cy7z!` zBf7c%lO8%XOUa>m%XRIixAa~`_PF>{{b-b%x@W4QRc-J2?g8EWg~f_*tHIk19yU0S zUKl~^Wy`Cx`yG@wBN6o-46X*$mxu)mjyB%PI9+@+-p>8Z-1A4gB@$7s2HB=q=fjLI zDL?5U)rdolEKP}o-c1;WpsN&Z>Rhl344PwbQuT*_v(cyNP0+9Mw2@p*Cb-C z>)6^+Lnhgw$#;FDYG*R#jNa{%5gQ94bNrgVIOcJ7xpdBLaj8`j?9ktxB*)G+pRzjP z>c-gczQycVp&lVcnyop0eXrcRi<{f2qbWx{e^=czUqw-MGN{dAd(hk8)hp&%V>)Tu z4wx0E-u{H_%Y}@VZr7QzBV_7HOEw|dOJ`p{Z?vCCKBZ;V zORu3^U4LJybQ?9Sv+y19{|0km=xiMOuBaosp^9g;YG+jBf zUO9!KKZ>d@W|ron!tBe?i^;~$nmBh4>q8 zTX56>weq9Sjp)%AVT|?b^k<7rgpfbRcT9UzmS4sI_S1ZfHrvUD+G2~Zm;H9N=jg{{ zGE&tJ9A6V_lTX;mFqH31aZ9dVtk$1FoaDvv_dcO_%7!37;s~h&}!a*XsVxN&y8p!5MGRWTe3ieNSOSI z`tn=OY-h)FpXWob0p!fK8~&&CTh4!vrO$iMLm!LR(&T;t`#T%US*7eS_j#(J%YmKB z1Pi0ImEwPDG-^sVY;S{o_P|Bu0Eqcsf_v0SagNQmxL=08>NA3KnElGSBXvO-Uo_uU zd{nWA1;AwLD*2WHALUjRT3w6JyiR62fF3fbY~(xM~tPyt^VCIB0FVd z;!#ey6zBDL16Q#$~$1TRYpzuBzxq~m_J*t*qgP0e6j<72?S)ywzF>517yEd zJ{qAqQmVW@ILYUyC%%x>B>&j*}`ZKwu%{`YR zUfZ8as+Ip_s;|FQzWu2W)bxid`FexGUzzaZLP%-l3F4SZu=gD>fZ@tNFE z@v?not)L4OoLp02KDMgCU!|+O?yc;fm z>~yI&hluE#n5uAQ%8TRth4R!+sg2gx)5RgT*=u_E@E_AJwPj`4Ge1YJXH9;s9J1md zVhxKrssWscCw8`PkcpMu0nh}rsy0&)T%mwsxr$5+aE3yd#e ziFIW@F>~gtz>*&6J4w!AIYXbQkV2Am4PjC2;C%TTt)woO8XCVuXx3o9k|`%}1x!gb zZ0m{Z7qYrysn!mb9@UpA13U3Yb-0a+dG>XLVjq)0i{ASaW}=~OmlgKyo* z4lQk!>@AywLObM=>lZt6ct0;_KD~(zP6DWEl|SEp@!07}K3L9GTdm@m=ili~bo;ZD zs?c7toy?kf#ujz9dCp^Zzc_>2vCzaucjw!le-!7M{Wiypp8XDQnD5->An_dW-b4wY z3@6^s>pxOaf`x)c-6}3ty?#*P)~^vSa{Wjgwpf}4;g;$vexglP_#E>f%Gt^GFFDG$tQIo(- zdBu!<)$**;v$scWR_XR!@-K(B%_xUFVB_MT0kiFK*F6$$20Nqd;MATjPMTR^qpOSK z56XVT#xhR9Oss=n_k6lvAyuW*sQM=SVJ=^sx6AkX`dd3*Og@ZvXJ;WyQR%N@N!jvw zbv_@e%*&g&G6c~IPpl3JTBP)-Vqra@(CwH=;ERs-For1$l{UUZYo*U&1m4I#h)N~Y zMn{oRl(jY zkJR`Ci|92CV>Yiwf47owyL_QPajCU&`7`~%6r1_%r7Z>NFVIJSHB>%`nNbE(uWP8l z3afO9Ps%|zrjn-8Zdf0ajfSxFxc{SFxWIk-M;|Xmzo>d*3M|{d#8x6tXCOPD#fnSp ztrBtTO_lKxbyhLdaCYVNUq5%_<*$54{7>|Il=?Ix=MSXN`J-GL`T8(TpkBZ$GY(I< zISuEY+EnpX1(LJ+{m#Ay@lAM-v)jP9v&>f&Sh=(~Qc|a;hwm~KGp)@mb2#2KWl`=O zkcL?`Fc~cB+vCh3R?N-#*ybuKfAWtVBRyVog1)bykB9?tEf)grXsH( zau$Yn$%4;V+shD2)%#!O%$d||!|y8jQrIoO4C_cQ1zCG5wvGqqr! zjdO42edhmue!n;&=~IE^lin}R8kz5FMtXRY8ui^=>DDkjCu+;*c6ql`5|JH8ld`N# zi81t^k8apZejR&piwCDwUyQ9JZQg5WO{|l-N-4u?Z9Kj5E?cIAamu2$1K0h9?Z_q7Z}gP_Pb@QnQ1rP%I)cW@kT?> zOh5Z?;;-efq&h&%-k*8l%DVX5^y{5oF8i?=PZ!8{$aC0F*|>58hk28MA=r|UVBQn4 zv%Kv5m^(z&(7a6_{R-L~8L9q%`oG+M!uUjAoPZ;vZ$^GBT`nBZl+ePtgx|}%Aj)OaRjp7_KJ~a)Y8NPY8U6l8(B`ngT=btuQ zxoWVTLO-CF9xYj>dFpDVC0Y4pMTA8ZyA3lbxX&rDrW;4>Fic7 z44HPSv7ckR$s{ixC%6VimQZqe(j@Q9XMg+sx-|{2%6v%1>d1N*YT;kPn&a&*?lXzs)7i?Bw!CE}q9iLu z2$uus-4=ZTp>EQ$G1&Z4Ru$Uno7|9`tGBY}a-_YzbFCc5B8#&ni*rp<$+^kiPBk9s>uT$iBUn;*wyt&g z^ffD@`DCc&8%N(Nr{G=f?9zjUt=-k?+ zR^4f1R|ebHhM|e#cj~9oc};(EZf9qY@euX9Oxurkd}iBR*|yQiI)0(*gzPK^ejyiX zs0Yj&EDotcW&K87vEllaJ#k?rsDmM9l>~!rK6t1jJGpIAU3`2}&s(vd8 zvKi~P1pZwq_B2=%khx|nbA%GPgHd7mZQp@5tyQec)Rb7;O*by&GJN8emtrHq^9+`E zF1G(>v9jE5gZCP|-{6A=8?R-1P`&!9UpaSdYb$2%_JqRYT2rxFvut}1+3a(kr+DeR zUz|XD?8hnpERFrUFx%a>8SrF3Q{}{j2d-)Mfx_|}B?lAAi|xAX9XTdEQ_?Hzc7Lkt zcH!Ind_|W2A<|Si|Hk>Hv&{D9M8BB%J7t#G2Q>$d0m!d(OB9IyqD}~)s1=udxECA&Zv`j7d%;`4$H0$+pIUe}{S#ZEre}a7Z#|n{3LgKq zv*`|S3cMM-|CY1q-QeQ#v+1Y7e#P1Jaqu4SgiHA*1$a8RwDN3v5jX{24KA-bo8Aa6 zZXjK71NaEI7kmnwxDEYZ2R(}Z;1l2`a8cvgbPBwG#o6>W@Uyp{P45F2uOk28Rp3+L zec-8=@qGsH0&vM4@Pn6vQ{ZWL!Vg{m-Ul9k7yMu!dCNzi7lOBe6X1Q|Venyass%p)KLeh2 zIpqUh2%a80n_dNO1NVYYfwzLkuc7?F3&01!3tO=xcw^hyw0t}!(N6h+Pl2nzPp_r? zz^M+(58TvA`GE()PlI=ZN5K2Qr@#lm6Q<)w>&~W&!JE7A1Msup4hio@4)`hXZg5F2 za==yKDMOt5f&|cpvx}_*6gs$V-)n z?;$_nQ{XCa(R%zzp5J>my$8Ht6ZHx__0P|yPk>K6MEY0qEtBn}4=#O}^ugP~9pD*{ zpg(vAcsKa)C(s||+K!{93Lfv-}J!Knk(WAF%gH+bRKNEdtxd>mZMuC)x8xiA^wZ=UJoO*QH~3j_(beelowMl@a4$Fl9tJ1C{vr6m1K>U2 z!SBHjUit(0!5!eD8Tj2{_`w6<2zWa<0rvkHe(;tb!Vf+UJ_J7SBly8npM`%WdV)*9 zC%_SK@xQ_k-UQwP-t%Ml!CQ~O4}Re%@PnIv3ja0O|7Y-n_kbhd-6QaWy`%7hH-h(o z4}%YZ8=iw7yc=A^$C73|4?lPi904BzC%_Aj!4KXB-UB`XJ_N4%IsD*Za1k&2o&lGD zSN&i3!K;tM4<7j?{NSa(f*<@0_z?IM_yl;N9Ru;Ds;158ekZdNclh z8h-F*a0FcPNBF^;z+1q@{{=sI5PS$c;|%=Zjo_jZ%K0q(-~n(1{1i9=E=t1>e%w2k z-UBWvIF~*I-UmJbUQ~E4T{K(1mvb&%0*;J3myUoBgA?E>7o1CP0dE2C0Z+XUe(-ki z3Gf+k5ihBwE`lF?2pj<)oB%&~`b7A_+rWFkC%}imsY&pI&wz_KB)|Vv@Pm)N8h-HR zi{S^4fVY4*O@SYL1bhhG^cwiVd%#6ZAofp%AH4Ze_`wTb2S0e#H2A?CuZJJJ{c`xh z6RvR6{1jXQo_0O_;N9Q^ zc;N#0!6(6czzsLR58eSj0X_~cx{-X`2tRn*P4I&g-~@QeLioWQ;631j;6va=Z-F1Y z4P0~+@yg%_9|K3g!#BeZp0)^na00vs{4Dqoc*a}d2XDFcTzbkv_`s#$mdLqu19(5U z7aXZOm);6K4BiW_T7EA540s>-B)F&^{HXlQRp-*rf)9bufM?usE z!Dql*?uP$n{O#@VgP#Gf22XE>AG{sB1AH8O0KA|De(*5(4EP1`^hMOC82sQv;ML%& zHSmLXfOmlXR`|h>gO7k;0G|Q(w!!~a@(o@D-V}!)d<47^ys;gA@Qk(ag9pGzz-Pc` zz)c?i@?R5@Pi)*Zv>wK?*I?H1Ag!+@DXri9sJ;@!P9R+zXbf?0q|<@#xD55 z&ve5NF7AOJyr~y{@DcDC@TzyhUrzaf7lBLq;0G^Ao=Xpc2f@SOgW!YU?E{o|1?|`d z${T$AUi<|dxetE<@7RdHfKP$2jP!JEM+!6om7zmj}_OTpg#@PiZJ6!;`~8~E^_pG)rpAAJA0^kE6#d@g+o z9QnYx^wcW!{@}Uv0`Tw_{1to#oC2@Kb@pI`G@RrX|-@pgJ+rg*6`@xaVQQyD=e{nAT0(jvU&!wj= zB|rPmr5Az+!K=Veg9pHeo`4^m_zL{s5%9C%&0ob|z)v5*UutRJzJ|YmPlB7kC10n# z0jI#5z1-x`+M}bm3ZJq;6vcm;G*xq4?Y3j0bcZv@PiNk)4B99@TzCdrN>9`-|wAE z&j2s{0qKLsA3m3E1CM|=ft#K^mwpP|@-Og#i;fV#4*&ld@xW7$5)bVCobmy;{DSfU z?>&xvms38!I+tDwKK5(;8hr8uH-XQ9 zH-o3&M!BAaAH4e<{NOX-jo@i%_`%!32f!!5N5BKzKzRmy5IjAK9tG+2BJktj)!@>? zbb2FrGk6F1;J9@90C?5-bovOm=mPk`o50f>N#{cN!6g^L4?Y6k2=1K#Kllvz0Jvcy z{1QG1e(?Co@Hb&M@FH+;5&YmI;EmvpSHTaS@oMGU(;ZI`9fC&4K{ovvC*df+zj!t2xNt>DBB#0Rf_OFDfR zyrV3gJ_X)*b2>fscKl^gI=v9=zcrm+1)fq)dfg(g)EhtW#)2z~ zu2f;u2&;NMYZpSSxaf^jK_x&hVdEvt{0TqJpf^BxsS}21Z=2=kw+|$MgEn5ptNoqh zca2;8K;hD#{^SR*hNRNn3O?kdF`ehffdhn<7x2UI6)ykjPlQS6PXR|RXZ{X`zPE7a zHM?fsqv@jGF<{3P%wvVlpXB8QU^`)wCwQjRBFyLK6w=s3xO@kV@Moq}?EGNit`8KB z^9z3RQ{qT^3y3q-XFkertIsN(oT4{DUk%+Gr|7*qU%l&9ga;r&q58=}Z_f7cD!d(S5PP&K2po?7j&Z+Qc%a!k&E+l+J z%iTM^VrR{+>i!_VGoZf!{fMR?EZkYV>)QS>KUL88&179b)2E1DQAe*f=*OUo&8@vQ z8oE!=Cg=yQVSNA$y8U z@-5P1(B)gU@VD$N+BLbbUPlo56DX?*Z_dwO41E=JlLu91HV?ut-x@6~!Ebc>r8_U& zbwSLeFMihneFt>wgTk|su z&3BqKh35$L1JI98R`O3$uFH4TRlMpA)el6r-TLum57s`kbo-KrYaXfoMAeSUala~j z)s;(r^3xw5`ImqF(X;>j!yg=$`XzodgSxP~jP)3Pqvw>R5F~sN;R(Wh6JBHdw2AN( z;b(NXvemncUXpM524Ta^tlMe2%2$^|-v<2z^rsyD9*4dU`qo8Zy4m&Mu%YkK{-n$L zvs!?pe+v5aTj1Apm44y-Li*GTpjQO`tnBLg^8)A*=%tSS%N+fhps$9$TGJK(3WuJ8 zz8$*gBK8#hs~!3_=-bBN-v|AfG58NdKLq_5EnnHc&yjx$`o_ii)1P`F?K$*({0pEL zSLWw$f<6O!KK>N+!(;GogZ>P3hL>U=WxobT|9#M3fIdyrmHnz5`eEoNp&xPbZ<;Gr zZ%#qqQx%k-;&;n$>P6HW==t~;Kp&{i&))=nGxU7rn}WV+4Ei?cgJa0w2Yu@p^uy4H z$B=&t`VQ!}9}xe$)v@2y35+lD(0y#W0QytV4{Q5wolvp!y#>48Q_!b+4C)TytB8}T z$zKNsBn{}&j@UX->FBT>`s2_SYP#})h@lJ5e&`3FFE#uPrtNu#@Dqe@b@yynUOV}@Ls~lJAKBxjVzzIi=a0x4f>S9f}K-#UA*{#R~Odl zj!WXS5GPf8Hhogd*jljjwYy%k_<<>f13He_Y7=qFZ)H86-`3w-oOB+Cz8ku+_b~R} zRIuy*40}IKoK+FlG#we8Muwzu9QrZnBbu(-1T#cZM&)~eg&;ewr0 zcU@9Aq#_7?H}r+uh#E`zXSSH(D%FY%>YK|n??SLzz3CnZkx0l zdII_ZN51Vd#pX{#pRh8txr7}d>q0fc`BmYzUlxA+c;SP;D17Mu7H5Zxls{r0ozXJ4!InKEwQcv=$O9(F)GGC)0X+kwK0z`r*` ze|kgE-swC#Hr@?=1bT-EG<~8w=Xe@=@x8(LQ@2HC04jMq4t*Q+0nM-ayw#5U321r( z`a-Rr^4~(!;ELZALm$79Jxk%|Ps(KxVF|)K%`@fCcosV}ft%h%U40!7jBmz$>;gix z9eVk-`GNf7?5)tBg`N-wlg~Sho>Jy}q0iVx88NnnzIS59&Ib#2eY`-G`L=>>4-|a- zV+9Wm6+E=HVEac49{xzdBOfmK#Fm1>gL-W17P)HovA3B@f;iMNg>G_2D(6>TA zr0FLwuGo35VAt7#UZ=0CBF@6?>~lLZ8XeoVK~F$8ZI808+xBdNei-_&=2vZVyTkuD z^rnXyPq<}c28>d+PeE^ZB$yj1`F3vPLq7)nICNvvpub+_6Rpb-WmQ2lNA4 zN0o+ce?*6+(8uqf{nm8lzqdJg=n(nPH#+=xJM_)aw?JRz(A_p>H}t2VpLFQ=8h)R! zr=f4#iT^XU#V>-scwBRV>S#sB6T~_5SpIQc(QD|pKE;?t_d%*0WD+XQEBqzUPkov^ z>T=M1gvq4PBhdZN1oIYUBX{1Cfc_Npd^Xww{p1+*J~WH?&U#dedL#ZpVc`Vd(oD z{nnW>6#5qE$KhY?(A{~{9_Tan=9hoS(DT)^6VSK7pK$dzjf-PPzDY;_2=u3+=d*7Dy7#60bzlqh)zI_iANqFai(LH~Yg+$21byGW{QM`NpM+lQ z^0WG8`HN`OU-)wFbt$n=3G@Sh9gLCmyxJKfMWB!0pFjNs^m6EDbona(an}X5K%f3Z ze*QhsS3%Fme+c@5ujIG?3Fryv8+H1s{Mp>=5+h-{5?a_HW%jH;4Xx0(#`h{9~x1%P1e{`Pz>X z=x3nMaLQ+iTmPYZ-{f4ILwDP^gvf`!+o5+j{9B+;|5kqc?SZ}udbyiFXC3?y^ns^1 zkLA|yZYTfHr~NJMr%N{jZLwd`H0XbqpI##Lr-S-GYK|0v-tzbP*GLo47jix;pMPwD zo`U{@wvTEb+%?uc&?Dc;&wmK|X6V}-`?fmvJpug;^nB%8^m_JP59Oc3l|Vl{20a43 z>L2sB4+-eQW6-xiKLdT0qrW=_+5>&TKXFdbp|5rFcL@4^==u0hKtDMKf6?XG|GWA5 zOQ7$8o-h3f^wMYY^CzHpK+ng&1^S6G`1e4c@xA=xr$f*ipf7d(+bkT4f1iLp@O{n? zYr1Ox3){l_QFI0N`9XgFD1pA}aDI9O`oS^i3FyWDoS%OS^sQsi_dtJP4EiDHEkDdZ zJ~#n=F%6ZUy_2&@ushktdr~e7)5$O5& zi{8k(`xyKs&?g+tZ@&oi7U=oXPe9)ey-3g9^}gtnPX3{9Iu`63sQT&dTkL_p;OCtC zcl_raZuvuh3cBx(51f6S6GHz5Yrk&&UmT{-*0;CsIP)vl{$>$Q>|X-?sb26d{1IP`q>*#i9t^cS4`W%Pg0_x(D5`iG#8KaoHE6VSIo&zF9Y&ln2& zpqqbZjkW}O$-f2lTjk%a-x27&(DV6M0{SWF`O@Da^8cN4xZeM3@9V>(x~jd;Og@1C z0n!pQr9(^GwB;kvlt!D@34|{jAceGI8y$wsB$;+HGo6`0P;61r=C!d#o3^w~xu|$W z#Wq#EqN0sT6}?=gipsq=Dk@e~RIFIB#q$2v$DW)ynW6VS_kExD{o~97bI$p#wbx#I z?X}lld!I8W_~_ox7F+-B1^q1O8ehiLe;D-o)A{Q^1^O`P`RXs51^J-otA7sY2mhSE z{wB~%U(8>B6!bpO^VQ!+@O)_c)1Ob~)_($_4U2(0%9f)0;r=2R+~X83p|; z=-W}3@o)S5*#~;-Kk}E~3pzcA-ft^!zsGPG^x9YR(@%lE8}$9Q@@Aiq+dmuQ2hX=} zu+eX~jlVgdZv{Qy{#6s`doDnaf_@bAeD(K%9<}h?p{;&08*OxZeqDA2;_C(Ib3i`@`c_+c`~E=_=qtSW}Vqu@TF#_d!4CdqK}< zqan~sD>CJI4zQO$0=ggc0nw3dWM2cG27Mps`NnAZRak>xgl9BuOfD=%=lVH zhdXULw1Vdlc=Fj|E9lmxxotr@41&HL^nB$HfPUZtT1OMS-Jh4^s5KG=>qgt(0f47mv3$bz4J2s?!u;@J>MAwz4r18v>)^+=()xt={ExU z4$!yS9 z3VPF3_+5pqe*68JLD2VtuCa{AusxO?0Nq!e-##OtuLpgX$mcO`zpr=>^kbm!vC-}O zkyUfBp1V4K`|3d-06m}mT0uVxdfxsAz2=$=^grl*pyw-p0Q7?wC_e(a@7nz3&w;)k z^nCtTH5ak=0`z*&%je{m-wOH)(DTXP3i|E~lph3rjL9S3frq^h4|pGW$ouF=ygNSZeXQU6_=mhtJm@XB(lhpf z1F~5H^0wWOX%pvo_L$rc`UvPprA@=0Co6YO_evH><%dA;e*=DVf^##c+1KDlKtBq4 zvy|tU;nko{H>m)D?QLC7M|-;!XL> z_k-R9dM^9>V3Q%x_kbQ1`(*Mi`?DNJ!E+is+if;b+m1ttOfKljffkz`tA2I)1cQZ#qWruyyTwx&<)8S z0DbQ={NBtiUl*!G-v@f*iv04Ag1+qn^fRCz0DX^LzD|53zv4Q`e{+8MwV-bUJzx12 z&`X=}yDw?~nCFwzpj)8V37yBNZbNWxJ^*^<1hNDn>Q+I;lr!)m#+oA9>4d^7Xw;APk^2;2Bbkhbb;~%pr5-y`F)_btikUgZTj2q zvmOQgB%;_%YumtE+nO2gtc!g< z*adn&=x4!e;=S1ut^hO)dgt4)Cm?%XHQvuoVjnsNylex;sI8p+dD63>SAniR$Yap% zgO!V*7wGFnuGny3G)B~c9^HuFn9CTFdB%3HVm;_RZTPKc5$i3vM?s9&kJRoS&?_VG zF|m>C)fGIGq3;0wU_4_NmT$Mqe$ajR&GHIqACED;)hF!-eFfp%8^#Saz3jPiRtYJ(3B zQU{(!oKs!&n?3t)ko=&xf=;}KZvQRI2GG}oj#N8CH_w&(0Br+31bRrulH@y!AG+B4 zBhiA|yBj>ad$5kix%p6i2Y?R(&u8Be&<||MZC@&X4)m?>!0(&I$7LMv9`*66H((yy zni+d+A2ar-d_Cxg-<26-Y#aL+YXyA-bRT$O8}?Cs+=BgM>ub;lmA+TXv;2rHP9Ffh z^WF=zAN1b)F3^6^S8U7ViZaGESDcMHtKNul`fk`q{Fm*6=WH7uD)V9+<%easoy6^E z1mDT`ARY?ewt^>XcFy-o#zA%pf!?$|vu``JHWAvK9%2&^2Z;in>30z2=X?aQQte;V@MQDOHQrXTUlZsjNdJeB&x!n9Si=l> zcRnO*n2&e|KJ0zC-}}giypKNU-SI*1V}0JoAMif$0k8M>W0x>&k6I`_`_Wg=Z;iKGsk@=l1`&X~m`<{uH zF8S%tBo2`;?g4-AV5Sc^XJy{;Sn-N0T2%KD@I{}@@C{>4*z4JOzsKvBx?<&RH(Vv-korepk}_9n>qC*;qNg>lXPrs*@=rv>!= zyE1Ws=N1zes4Z#G4}q?2AGOc@q9ci|!hd>C$f1wrAK&!;kdq(JKfdX`B71gY|5Ms2 zbF^-Nl6-pKNaa5xz6o9Oa1C%oueurQh)-t5Eyo}G{f2tb`}Uw6_VTvpNn1f5_!QpT z0a<2lxXTv5wt_zU)9`y6J!qp3g5D4MfQ_ED{{?#CXHdV;IlgN3Y`+oE%Pv4a2YLnQ zwKn;;*y^u(6Y}T_(Cb03zW}`z^yUlDw}Ku5J>UE_2>SND`TO?(=#8Jvu_WNNY zp!a}IeQD+&``mmE^fc((gwFkM-+!#~W1TQ6pZ&)!zaI3`r!xJ=K_4pFX-zb-uR#WUeP(wPk>%$ zj|2Ln7xw=KjFBPCe^Q?H*T==!zv@9xKa*L9aQ*gmNGs^2pUbR+xPR>X(_2B`0J{1& zm$&=(Am~Ryukf(`M?6oyZs!c|682Ei?*QnBKA#z1te<^+jex#>Uw--LKtBw6KKoTI zM(+28{QgxBdK7e@=%@3dWH_W>E7AWYQ$OoxZ{JqXkAtrM!S=EH#~|pXUqoIY^4UIK zec+bc4|>`D%w7n~x8JWE0ewB_`Pz35^n;)uu=TG!zEv$j|9lB~h19S1m&}6duLr&A zE1CZ1`m_2U^dZojZSw8+SGIzF9CVVEYkUrZK5~Kb2S6`7kiYy0=%t_!ihQ=OZnN<3 zG|z#)9rQAy<3oCsHzFqncFcI9n?WD^I$~BSm+voY zc=8*bonM#VXAOG>p7lKZHP0ho^*nmOv*RnC$G+@&{7arE_In1u=qaeq_5J~>b2nsG ze;4t~#!&FowHD7WPUv>)_g&`(P{hLB^u-@EgDUhkJg2=R=7 zr|)D&&u!q@=G}STW51VdEklm*TllE7ceoPyQo+vq3%t*ZoY{~w8$3r(;a;%RH4Hhu z-ktY*z0YLlD^1|r`ln2N>~Hpcl_=z~mkoTJTbd-EHwazJ}QpYtO2 z`-zSZVZ*?D4vgN9RpG!+0xPv)RNpyZ=TKi03DdQ${+x^ZxoSE54rOxDeJD~7dJE|5 z#det-*89UzyO3!2<66MAfNKHQ0pV#X$rTZ%Vd^S<9 z5BnGM*$llt^p8e9d%a$l>hX1YJfid}2fa|Qd%S)=`|GRc<8*SYP_By@wXESXxh~f0 z@*=q&uh&0ReJAL3r5-QRqd64l$;tDguNJdPON3CNbiK5u>viQ6Kc5-Aw_L7GJNuPy zoE}a6ub!9o)G7aYy*Blp*6V@EB2SC|UppMre)#WJ;Me|lkJ3-B9sbYQ!Rd!I{zCX~ zj=OZgtq4iHaq@R6(42?9N$KmAZsMDflhBh5dCGSvJ&}h_y3(g754~H+*0wzKh|>F& z?$obK={xe!(@Ni!M}A7_uXUh$&41$U4kdhvU^3VhPKT2zUo4*XwZ&uYk&f zuzr9RQo(BAlfHnWmk=X;?!^BBPw8Xmh5~QN89Ee}M8Q!|TGBxWPw^7~i{6KG&y~|> z61%tPIUI_(xN^(cuGG;vhD-3 z_jS`Y04lnl>ZqL7K<5XDXGTQ}oj*$FudAS$s_3uyDx5X-863*X3Qre~dlhG;Ll9N? zV&SB(;=(HZ7G3>Ct_n+QP($Gvxhl1$yg-+KEiCvBIMJ?+RA*_?{d84WIGwKw-wy!= z<%RF2gU34!B?`(*nn5f2AfTcuZs&wQ11~TBVjOt!hjCu~rJ{PATg9iqRQ%=fX1-yQ zeTB}d>FoP-wvf)qtloM$BXf9{(b=PP)=X!gp|d;a>{&Vs(HX5fy)iob4W0GS*(-GR z9-I};z*oskcIOG*I4>-@lsc&R``{>jG=SuTW`u$xq1- ziYG&4$%%1aLva+Mp}xd$mRJ>^2V7D}!+G3{;!Y4IUIKn=;)n3EcO` zku1s^OB*NANVST$qLR|3r8_|=D=x)%>9Pq=;ZSZBk{})_bgfE_`ydK^ZS?x$BM@G? zynqB3jw@*K`a#F%Cj6(UwvII5s76Mi&-3{2od|Z%^a(fOd|bhC|6(Fwz;kpetfhAiCLJgP~;WHE(FZ*>*L?nzR4F@;9&H5b!# zkR2L}H5}dwO0kB+5S?o{+{`7i0+`0CoN-J7STO~#!YbB40$9-(XF$&q3SdQFDtZAz ztr8kAMPD92lNx}y3aIo0_?n07aZ7N507jsffFcfHbvX0Tmv=E?9Kf0gqc896gmD1d zKp1^_?;?x?7{y5s2g`eLCIPJYZ{NXr2?em?zpGXhz=~g<{1zO%B^1DlU#YkWhr$vH zV8yRaJBAAcFzP`MeR;o!ugM(1iV?u7!8M)&7~&VVb3DZ_gfEsjei!OO^!gMIh2tr1 zAb64cmyW04h1f+D#I9o`p1!js>8=*!zc7{{(#2%|6WZG>^`3J^wL-UwkF zyHbSFm-k(SaqPOEF#7U-m@tlAH1&Gu%lipBqh9kqO=maJ8MV@LE1i9l&cbx|Z*)e( z!21(ABa3=}L1$zM@9*iXp3eSCXU%kWp3XvaHV!TK^w1eif1W-%yM)em(b-ivE2h|0 zJaa0UMPgU+rDVwxie1ICCNID_PAGO2ziaA~I4>_R{&~@ZxYpRkr=;I6C+s9tV%Jkt zuJptBB9Q%UvQm=y~Ecgb`}4WT%d$vSMiB)Z8(P{8hw@lI8=M zFwIjiX~G1SHmj6KWn5@hi4i}s8q%u3I%$drdQT|0^!1mPPsfl_y^wpBPxG({)I$=c zsD4~6l7~zcN}o1e*r7kMR}?~pnUUvajfOPq!-HRc>=%sF0+SA1i}&> zUU|0lrp&Y6G{d;VRWnF}zw#Zl-_9O)+jNJ&IlOI(RX*L$W4#3>ix5C*z!Z8suS`Oi z$A{$MpNDfF%OY3x;(W4qHBtD>8s{|&jDnjzm(RK!|E`*K<*X|&ub$=gpllMXB>FBK zbBg9oydbD?{NIfK_u~If{C^7nxw`SZN}(CYvj|^aik)7X?F-&YXCZtQcHygt`I0y* zUWl?(>oqv$tQAZu-AiG};;(yfLZ#N>n6nhduVn@CpL8{PvW_L3GVm8G$~tD$D zG3Si)n&49~-7}31^bUyn@7SIbE&hTu6OLf}S+izc#sUGG6=}f{%X8T%Y!;>kzap5K z-~QjM{Sh?8!(XVzEL;n&@ys?=o5gFv0>$Rdo1fZ}3WXD?`N3eat#eWB{8T!aOwU_q z%?}0B!TEQEV|Pblsrj4Z$-7gDU|V=TwiV{4&9=gP*+rP2O191Kh(z3XcSh6m#tf^snVD*~7+NJAS8rHT1)~pURuU)!y zRdY*V@yeFbN@FP&kY2E`&et7FMLJ^PkgaJ3VolM;MFBF$f<@YtI<({hHLhE^e04(; zS4ievvS5L8*Ty%uD;i0sqv5&XSSS*V;X1f6a#J+1sMa^P!#8)$Lf_m}I&@Pr zw&Pg$hPjbgG!hHrvMZeI2+s{hqjRxej4q3%Q$UmPZU~EYKvudF*ReQc1l#VOn@Gmf z;kI-*^h5{slG!RXv@Pq@vBVUJqO z6N-0ljE1dLPkM=G!}Vx!i95nUcg2RlZKM`G&m ztJ&9e6pqq^q#W7L3ang%v5MXfbf@6CflxG%3`gT_!E~6$a5~Z!NJPRsy8j=#--SFa zr+4OYzZ{{jEt!rW^0i?Q1U83*cL&;IR&KV~|13a`6>4#igjDq3T->w?&ugQq6Y*4} zXFfVPMOWq+j<(zN>W+a2VSLkk4CU@oc8u%veEg^5e=nSGq#fe9IwL@xSa>dro{N|< zAJah^7BUltlgzU~cPa_KwrF=KEJ|54Zc_6)(M~v68eu0L8@-}d)^n2ETe#LT_rC1$!Uvo5i-npv~7#LShv zlS^Xqe+rO^)p`A67z(gV&+LTQs0G;N>dDDpn0bD}#t!Zx%RD!cjTdL0ugJzrtX$6} z6d-*v&ogB6kF(5k5!v{7%RE1kjZetzt7qe7mS6YFv+;?RNkp^pNtyllY<#k1HiNS9 za;yHu#de6#3#=*D@q#5e@Tr!0zQs-~u%=n&xt46a!pilWMS*pZbx5B($>zV<#+)Up0ETk*8s@8L^)Nxf67 zGY)^CO@v(Xg@3HS-H?ah=wp@&&U#A=v;A<{YsfLN$;erS6EAl13|^rGsdwzS6MXDA zy5oZNPOwa%GxZudChQqJctJT6tz8cLN5N0}JMoy}M;!cO|LN8S$9Q?S@|)+~aLJ!X z@$JDlDlL_9Xa2GHcY%|h=D9i*qy95CZv2?#jK!tiDVERC?}Cr&Y2@>b zvb^JEvUO57!41Fk%S5Yjrr$t(q|G$a-{5{VgirD9mkR%JEoJm6SGy^!?VWCQI_z)S zwawA41(1KCadh^M?D#y3E1GDXZugri`DpYvxKsa{PT@bUr9_|Um^ZWI=Thk7!P9=* z6yJbr`WXFv<=Nx05Y1i?BT=*30 zq(lGMYw5o~xBesltHG$wN29;No%&ZjApB1KcldJYIo&$$nAeQ`kJM$`fBS3bfASl- z^*{L8-1-~bsej?qx%J<3MK1lPSammM>)H1jdJa98ThID00p1TSShEaYdzKlVd6<)&c%HS@BOzeVNDS?%XSRa%suB%yi_+$lIc?nEDY znuPGf-}Uo#D}P(oR~27>tLU>;ae97(_|x|YzFu*96`>Ddm#5B<&0NU!2_ zYnAY`pAvjf@zMgpL*?1>>Fz4=pP87A&ry8uS49r3H|TRSaI$}e&ilqb^k53fIrmqQ zvqRXecEcAy7Ta@qd_Dre7oMNXZT8Bo0E+H5^Pp?KYWf*U)3R&oD~Y&X#kn z;w@JT-lF_(RDAaY!D~E1Xi|KnelY`0%HO7V^8r622Nl1EalNn|9#sB)Zx#95l{TpO z(ccSh>^7wM;qUpGvs3jsz_?AYo_sawb~ke~@|yl(_F=;vc*3ahvjQm@oXDlcYcw<95k% zey{SMeN6a`KYu{+;kO8G?C^x*>%Zk^0mh#{t$5i_1)nYAt%Ho~h3)VojjUD2OpII)r4{?n?_bPtqke{!OeLkePf0f`>Otq}til6|E%KutE651ikIM4GmZDg$$}>opAMY-v&RuXXDa{x zf0lavh$HlwYw)=;u1^ST-JtlsKlvFkifTKn;RMt)du<8Kc$&a7Eqdw`Q2c2zB9-0*){+nHa^?cePxXWx@j?=Z$K zeeTJ_|32m4@owSYqx$qK-s;fjQ;Kh}#7{<)|GSD0=zMDA{D5)M!T#M{DRw&?_A_k8 z#jn9n?cJ^Gfay!u7K`&9n;@nX-jpY=1c zU-3&7Z@ydjk9vf#Y@)>Z{sl5lmEF2Q`7KA>Tc-Ho*&?S`3#?bX@2H;-Y+Y@P3I$1?;*u~*N8sHRn$)upFLM_dP|Cn&F6B>uT;w0t`2UpR zXHey3%}`?cPqaA zIl+C(|B&L6XVKcJM;o4`&8(C0pll+sGPISe&(*xGEXbMPxG`P#T)0TpZrDY zHSu;>`48(l-SqGG8P~$L!!MNI3i=r}>!Uv^zV~*KzfH?{u%5`}|5JdI|DV?R#q|4S z%sPp2EO`^{ct@rJW>xJzQSN@Ps_>KSHr+BZ6_+c7VESn&Zxw_x@GzUd4Z8@D~I(apN!7N_&s~S@bvk_yYLJZoQ6m(BD;#&m;UM&UmNf zjt|oqpJ>gwO87UZK36I}v^HCxxq0L?D*vAS%CF$P3)QG7`ETa2AQ z0G#dVxL@-jGx*Eo30Ukj6H*j`#&f0`*ggg6t_+bzQQ94-K+Rs^()iw{fb9di+nTReN^%C zuM56i<$PZ8IhzDOq4-x6U-3P`<)_4!^+Uz?ZWr9x=huq&R|$St<-DZ$(Qjqj4L?O= zJCCdteq)Dn#XEKX#Q4wa6}KGo@?6FHe=YLQig~Q@r6PatIgvl0_|3|H`gg*=Rq-{7 z4>|5fgcUDu6aM|$t{&j*|GExEb^Lj^^7p@2>aA4#0mk*hcKB!>{Byu*pTzlm=CdmQ zV8G8(j9)#k_{rx5Kc{v4R`HSPqK~ojImP?$5Zu^d>U6PNoyPMXm2;)yoqrepA;oW0 zeETg@?-9k~v?|`Ac*P?k$Mjc{ab>a{wkv=A>$CNLMDe{E-+Wr;Q;JuAz|V+@ zC*M^3pypl14u=`n!nVV4&n9eknNpmX|&sRJ?4RpRW-% z`7@|^pXQ$?p6pe;PUE2&U(YJO;?I6AzeDZzUEn@OvcLWvIO$*J*ynjc<(#SzJ$Gxd zv&uiD^SEhm$&B3gp8=fY`*fUcQ#rGkf1-8d$9_iEEB>3ybIZA&2?;MqrRJ?MU%y+HoO!q79|FpqxSF9j=T#v z`N@zYo~M-mtlGiof4}0xx^6P#^rMRJcv$o_{q>CE)n605*&_;lNAZzG((gySg8v5i z6l?T(Z{u$-DgXLc{LE|#X868pD({dRS18^zNBEB_|DB454hw&);wi<4wZBZgA5c7cM&uZLm%(+v z+ThP9o_556?ogBE^-jW1JID_Q z-YopB%Kv)BTW=Hnw<~^);wSXEh&_roD1Pe8!e68KZH()M?GRP|;ibZVq)>?6idzZ6 zd$i1Z6fZyOXJo75AK`gnqP3%4aMP}bl)o$}at!_n# zq59_!^T_#?@*i~UPrjOmzkH_Hzw}ok-{+BvuT=cR3xb~&*t${iL%O~gRD1<+8eiKS z`&uo^U(+IT%9a1^jO&H%(4+i&)(gLhpZ6(#`WIqP)4z`z{`U*sqq3e>ylLTLM*P~Y zVa9D0>gn^!-})y%Bc{LpsQ8N2g0E2izboGSL#g+au0tnYD)u~DCU`>mFIC*9^JAUj za}+;wUgXbFJr^t9`zDcN>~O2%`#vN52ER-3Qw_pz+Pg{d{x=J5?DIk3)L#RReUHbL zzxCT9KdSnCN^!qq{W7F@@7qMa85cKHh#l%)5xhm)`wj5tx*zmyQ|~IN_lWWzSA5^w zMNXmW^P=J>3j{AS_V-D>Cw?GuOg~-%oZ8!~_qBDnTk{n+&tsQb^0^N9R6VyJmJsem zesYPQVI${G!V$+#{8sROrdn1)@xwQYAD&ixzpk_VDyLrY_bLCLZfVzc#XqiizvfY< zU0+bV;;Vk|fo$+~poA^e)BI&k1hk-}fuNL-WtwTE`B>Ycx+b?cD{O^xx|kFP~NZGL1_oRL;xe z#6J68Y+%I1jpvmAh|Vvj-k&I**836b)t~>M_@L&ob5#B-z;lhGg3F}dVaI%3q4=>_ z14}UdRi*ggzY1=if4dGiwb%UK%GmiP@HeYID-_?m*w4s0#oq=z*K>mrmA}I= zU!+vdA#E?c?2bO~WPYr(9P5z>l>hXb{mfUz-{L<7*l+O&Lf6@v*O44L{6Q` zzhCh)Uuv-EbC$m?>z@>_eZbF1o#Oix4=ohj@c*mgz4Ha%ulzqY_@Kz2qxHVPxH8!e zXY=4wXNx`0ED-q#EpwIP=dKa?X1p&_yykJi*L$VF62@&6>gnykdA;mdXT443jA(q` zru=s)e$26d@(#sM>-u-S^1qjHy|5h~R{q)Qw;`o{Lh+HG_!((c{0n*HeB1EreYzgy z|98dB?{qp9e?jqMEn=VTivN{yy|5iht`Pe-pY=0p_$w9fd_m;&d!*2{iXVSb_J;DqL&1%GRw`b2hv0jaf4$;88w59UIvH0c+u@zc-+!m@n|S*^BVY3nQ}3gS`@bdn zkEpDV8UD`*Ua0Nb2b|*ScE>vOYs!CUjqsmRIsdNwyBu-m1?4|7ZZUHnFO>o>Dc(9? z@YCwI7hNg#uUESnKfglpJxly7;DCs+-l%xb+XQb?Im;FA*ZHMJ`CAp={haXcQ@l%Y zzvF(yyDG#E{f_x`tMZq>By#H2ZeP!nw?Cl#N3IpSnRX2-zH6%ByH%ed#rqx<`IgEb zR=nqG!E2TOdBu19hv3_l|EG%Y|D)hW{>zHD=)BXSa>}j}`_FOYMIXcSgp@b#*5??F z{ilMT{KQf}(eAZosGOFw(yj{CXR-2|--Q)wy>}}A5#1LuetVbVM|C`glz*$@)hDD~ zohpAo@jaR!8vA@w@$~P6-`M|iil5sede*3%FEg%{*$#)5|3JC$Z&UuCD_*fdGuWz3gXh(~l1+K2#%kqeq18G5Ax08~c0(IE_2=J9pzh-%$R2 z&7!9nM?X+}gJb>mQ^iNF75U9lt@S6x{r?a-D-@r24eG_dy?HKIVQU8A(5F)4zy>8; z4xH?~Z;hXk5yk5iKmA*ge?akO#hd;n{H7m+j4PAvkOJve+naVb20gG8CyJNr9=A65LRd4!Ms z%wYbp`1N`4RVx3u`nl=fjf$WAH$MwIp(107r%S~S=J!h56tB_!5F_WqjE~jlW6Iz3 z&m!OW;TIGye^78^pJBz%{zmFO>k*kpjhsn}YgH!{Kk>BS#@~LYc*~y!-=_TI=7^o6 z+P_BsOB8RMDEvdpU!!=L!)`Y#URx>rWgaPTtKx~U;7uwgpm-=Kc&qZ?qj;+$@48R% zx;up5==reXd#=*_r$8$BIOAHG?eKNw?^OS+QrZ#4qYwBQG4bj@6hC#p)Vojl&nUj( zkHT;CDW5C$tW!H1`STPX7%y_lwY~L<*S}lvR+Yb;aPNdM@2y(J{K{lIbg7)G&x)Kq zO53jZQEgYB;=2{!t?MA8|K}C2`-h)74`?3v9mUHY75N7Lf#S2@CHQ`iRPbBH*K7V@ z>~K!;gJ*=lPWdn4aXrzhd8^cG#(TBm!yAR)=y{{!=Ux=NSE{vcQ+$v9uGYk>cE**- zcG#@^XG2o&0i`{l`0TYJze(|3ikIr|GK@Z-%_DzU`D=bE@{RvIpNIdKz$vcocieyc zy~^3MTI7tVK7UnwrD7>TmSiulS+I zM2=afeBH>oRPa{y=N~Dae%jA9ntuO{;u}6AxY6hDiXYeeQwAT0ifEqNvsdJ&Re$@7 z5ohD&l%p@Y^D5(#euPTz>?`yy1Ts{uM!M} zli`j?3V%Q=knRe!;l;FJdbMjP9_Wb1HwL4D5Z-%=ca3)USa=&{B8oq?6`~j2=Hdvn zLz6%-nG9|Tgk$OC7OS29I9DLl-PN@PMQm4i9cUz-#hQwy8X=rsv%0K1)|QUMV@=Qt zDlS{uw6tl>@<4MEuTE@=cVqzm<30q~%B~A1H-(cZMX%Tm#1kYZ1%=131lmzc3XJrU zO}thTul@vU2F1&M7uABger40j)$0SzO-;%gkKrVRH?@XCtHNFJZgw zVpr&TeB-6D9ccaSks$s+5w4qBmMmPfuqM!$jEI7Pz_PUstCj|qu5JtjtU%*iS2wJ} zi$ekdyz@4&bcIq^G_JJ*%bV6L#tU)REL*m2X-lA`VR6&afE9|gx1;l7=_Sz!zEf65 zIK3*^)`0iFhEsU)>bf-S)j??BZYUOx22gJbZM3?=U2Tai{^d<87cU7coVVZxi{8i@ zixcna?yi<(FqUcylbY*-)a5BF6;7MZX~t_h$x<9JVP zd$2p2#*1j%Shql;yDJfZSvH2bEWLR&-3j*2cr*lm!8>`kSW&!;byXl1r_Nz6ysb4I zz#n=GL=p=bNX5I8ZQ%^GDHx65RkwI+YdDR!e|Ds-^r-qvV?ln|ZaA&I^Oj&Ftp>t7 zHIwQ1-F7PgiH2iYNI1PD9_{Xu)^6-hLYYK38HtBjmt=f1AIS{x&2X|EZ;h75Cc{Cz z>Ng#rmjPSho=Dmu_V%Vo7v5(}y`u(9bVt!^(qUcUV2b{TT_DxHQR_=~#};>|wq)w- zK%=E9QHv`g(`OlI)a?Sd$D?>zZn!1h7;LjhJ-qQ&Mm~Iw-ef8-ujY`FQTDo8>ia+k z!i+SEo&o9gTeW%YSx{0Ej} zoJL|RV~Osxt$PR!_6SO~WE@{!qzoj-U<(8`rc&B(fzh673no$)wR&*`?;PK*F*%v zg||C%IG~arvV_J%a+wtOQ&~#J< z+uFhjjPY0uGY>^I(3<0$#Yxd>xa*qs#)c(m&lZf%_PE_sQf981P)1JIRnA_#FOzZ88sF%p0>LKpi%U) z>xUt58x>ArR^ik@B*@6fOpuvr4-#%$RJ%9=7l(4FDo0dTpCd&`X__8Vi7;loj2#I! z4n*(lXPqO-uFXg{GBHR46iua+VVH@QnH|GNS{I6JiXc)lgME<7m|$&fb4Va8uZ~YA zIilNblF<`-+5B>}ze!)7D>wq-%47|z@Jc#ZrJH(#b39fiA!7x3Bb=};diSzq_@3@? ztZj=eE=s;cA#63hL_f(Jwf#boqI7X=_pj5_f`1CvZr>1F8mrRYKCZ40GX zSBnM`B7pwgSW>KU3tqh+XZ6G z@u~$$LF64_?pSlW}IXpEeO zrbfg#B-fOmH-k$5v&#ym;}N^V z$%Kf6a1{bMJX`}|AW5OFEuMr!n#n864bV9-onz*1$6pD_%BLc!m01m?F3lI_C`k?D zPb2hTK8NDQo4XKy<85}8Y2_6Q*%1;;iF|v6vS>0GNod%Zf)L3e6B-VpnCtk@MxeEr zL@?gNtFw$MWLj;6pA zq(?`lZG{-10kABdY@%U`d;_6wO%#bCtw=?I)RtIVXEGj(yo09{gdTVoY#}ibf4c>7 z5X(iHk8W#hUK~t?bx_y>;tCi5nWCoiwqD3eIY?z~u0+PzU2qaJWO(pVY9PuXUT_9+ zJ1wS2V!)~B=!nGXp(SoAr#_`AC(H{i%4F^iEU2N`c{CN&iPokN^H~X6{9zQQBN)l) zje!L+Z{E`#3}HR$@KGuq$!-E5Bxd+qBOT$cM0yKUar8fF#*L9#FwqHf(zW5j4`AlvbJJ_(g+DjPMk>suz-xUbtUY2WTs5$ zr|w3n9H+9`PRU;1CMjN~6x7vH)VoW_CsSB#WHL)fE}+e8;3c_9)$wO2kZRbKB5Ue` zjWQ?rHmxP0JvKq?e50Em0Scj(`gg>Y$RK>}Cjh?mqJhZ~Y#u$7YCiS!EO ziBajw?3hpH8y!#(L`)MYZ7G~98= zNkeV(Etz6WCfX9mx=#wPX(b?95(4P4ak2sBg5B_$1UTT36FMWLA=yRg~OgUK&@3z77*?et;2D=`wOB5&#-`~^As+8aeemeT&5$s=t69tw;u zza)8C37b$$kZoX$NCr-Na`a7f#^D9lW@M~k?i;fchshiJC%ip@B)kKEDoy+XdAO{J zM|Wj83*@8_`lIg=dZ3_JNHwxr!enJwzzhxJMB$9AdMfJ)u+_DJV@RtVJRo4Z;GlEi0Og?lEn| zxTU3uq&E4sOI~v73ha#h&NjdUQX6 z`W<%Al{bcXq>c3A5x>BU_*{!;M3f%8*g&c?f(#Jqmi~I>@cN}9?Q&t#a#B^V51h$7>}?l3pKwLBTI55ii?`0fQxNJ^Ez#h zbGWotHC`XMjdzCv>zdZtZ^&@Zv&SaGe7~ek!pUevy^rqCfCHJlOz|WN z8`nwRq2_cFtw8x@lxv7H&{RWVH7NTynxzFIG%-r>vxT)tO2#i$f+ZsI*jUzH4%vuP z9y-a4W=6X=qEW#RPe7y=+YQ48H%l<4X=cn$^-%~}0o}r(;vv~Xf}v;=3HeplvHOz3YslERAOmV-|Iv~!~_YF}Yd^YxaKnO6`G zFg<5t2=4TNr=f9)rgB)AWA_*7L4%xb}` zr9W9Ohc{ynrIX{J*|R~DMt2A`j#F9NM2C$dWPqb9P$I`Lmi6W``pDd28jYLOFsye> z24oxWHXAY%c|w5a>j1osw^|@^9njI)kK90pI~AdAX_6A6F39BiwC_YP`q(zU&4P^7 z$wYp3CR*!oGR8aFtd;#XE5e*vuh}*NARN;&#sqeZVDhY)GT$GxwC&$;ReWn~baB6q zq8;wyW2BLi?bxb7QXQf_o9sR4tS0c}O^D>`>JUq5Rn7|nwvXB4pg;3yHmhj;?pVPF zHbsJ%it%Sxp@#Iy=nY@4h-Ou!7nBY2g9UQ?TY@usjc=UNQd2X>&Ms({@p9ac?Al@i zdJFx1Q`B#^B`FihtPOO0*)u?D2i;B~FF`z$8-3#axkn2}R0=BG;A}HDEWvI|cUTgr z%nB`_JC@KH-77(lLnfJ*>dvvipv7_~v%^*nOqitgBDDbHS>_>H2w`hxx$cW{j?N7c z$3}QsvaY#CG8Ig_SaR`}vt1AF4f6iXzUyd<)EC#p@HdCaOp+PPegOYnU3(AE&7DlI zfjeuvowvj!RKdHm(eeFANoGiK**4T0qKGos?4Z5N*s@4_JY^i6mRoG5cGlZ&7ZaJq zr7{#m=13}sY*L)MgYVtY)EEn8goh%ynVy|IcWuesNk&O|R)W0Bp3R$U{=1~v!-h!q zUZrcSFyLo0(AwLh-Ko*(1Otuq)A>U8%_vKwtebN*5@4UoF`s5XlwxueOzfOoWZ(JV zUf?=towErukVFf|tlfeoLm0^lHqX(h_B8E%Xf8ric+9cm1*LQjXZ5mzy4h%1RBM(7 z>tJ$SL4?8^yF2Lb6lVemuWL+fkqD6P#43eviy&Ot9vYJUF4_xDEe^NSjUSp)G11y4 zRkEgi9)Nyh2e+v%O!wQs(dfKkfi~0L`sfB8acRE5dnFV|=ur(GhLUe(J@&$CI3hAc z=fyv;h9S5~Ra23P)E03{tR!_gi?6SufWAGfgG7av{w+qXqW0~7C-M`C8f znkuj@GLqqq@i-Pvk~h*8A+^tBRh(<_qKc=(RikqYd<2iW@VyZ1a3t9C;43Iici1u` zR|kPDeW7(abwQ5p5hRv$dqk4U&aP#)+rrRV`-qx5dY_D1W0W0D0Rd*R3#yNestk9pAOI61;%7_Yyx% zWv0;VXQ{|5^gf4qL~YaqGTraIO|QAHK0;*r1`C(mPYY!Nmu;ToE~g$ zK=pnq-S?q(hvYu2=I*!!$+eE%f~C2886Jg+^5ku-Et``R-|c+?TOc9SX;v~5$&$$K zCZce3WhF5HG)Rrf+IT}HGe9U7j4@KCKRkn9qKJ~yPMo1>n2Fo-AEE0mO!s%?MZNwf=NN1#r-Gowpx zBw!JXF2PjmXre4`R^k?FW^J0i-^7aK*yi9RlX-B9%{f*J$-u?dob+H_u1_?PQ8LSD z-W8^bkl66VH7~WL3ma!R;t6IxcA7I;a9Z!L%t$Em#LSZ?klR`057qjU_0JJ1>M=GFa32c+kqe;b@hx-xu#`-)0 zTAXrtYhJihcVIfPHI=!N67rnClrZPIJq8uxkcF>#T!9F~lRMTtgdkeRLs?3#QI0m! zfXgNAK$-L4#*NAFCUeC%Ta^oTvBS6#k-1LBIw;jjncrOe4~}@v8~-$1e;#7hdHpP{ zP649ZKOXx9&hZ)ws|5c|`4+DqR~G)BJRdBd95UbL_c8{!9w$ZkZ_4+0{kXF5cPjZ{ zncuAt4}D7IfWOfxp9MI)bpCwYls{JJXM%a(d9AQ<9dv5SD{S3}lL`25%9j`UnN+S7 z4pHOqDaLMrW=&!KVffKT&k=Lu`d$oMOGMf5LdDH%T zwESY_tDNHJvr7Cfn?9v#KPrz`L1pSU<=+X6Y(n;>kFV0NM?T;eVc8$k?*`q36MK2{ zcUApb(7f-?@N2WorS)!S`Ahsv^W!~o^y$0YSVpe>a>#t&k28Dyhy7xS!+t4Ok>QjR zr~V(*@}`#KTK>3}Z+#|PfU&Ce}}gIMUl8$`@!%#>;Jf;{P67M>(a>OCG||Kf7~{*@Gq@#c9D_;dD4GBF)xD>?`qHh)@BK$F_ncEz zr_MQ5b!xrUJLX^biHPGU`HQG06tP5q*O2^wm0I#&g$Cz8u9~Vk;@=@^uxbaKAub;N zxd9~a69H>^ckrXB0=$`SYQ!f@jkpGocR!!310s#@I?PD=_nr4y&R-_IfyUs)<7_Mi+p@j-ktYW;cT>c}u#Bk&ben?q5j|u`0+fpItKL<0p`E z7`txG)nnIPGkV>c4cBcQU0uCt#p=nE#%$g=X1uRA`7`c3}!$T`vgl7t#`FJYujK(8>(*Z0H1n)k0y5eDZOvSSZ&nNKo$1@nu zS$Oz29M4QV=i?cQCyGb@h6O~_>Kh*OGpc>v2x%FVBlLRG3KKsKB1c+SQ% z2+ue?_TK~`=iph4XKWBK0B@Ip?PyG5k@u_bVPx$XgAmrlzKpuK&9{%6S6MuM~_)q4c@65yJjy!h$ULHP? zJn`Sl6MtnM`Y-dy^VvM{*W`)+LLT~0^6(jxNB;Zr(3j@n^L`%s_B`^uohSa~dFY4o z@Od#0{pWf3{5B8$?|JCo$itt$BZ?>d_q9BH&d+1d?Rn_a^U!zZpZ z9rN({ZXQ0hdFbrFqjH`z zcGb!)o7Ltmn^x3pQ#D&wZ(3P>4R~*kOIziU=iuh_C?;|6uL$>!R1*KJ;{R&Uw3VV(Kc zwCk%O3*v8Bfppi_Y+AEn%e9ckSY#cGWrJF? zVda+P8@6n$QU9@dLl9$g@UHQ--m)oeSC}&-*_sWoX7!2{D`Ed@eG%5LT#rJbaW_=2 zgFtIwuxZnlZ{ED3dc(D$)a<@%Z}+nA2bHg8to!qUF>`b}$KrOhkXtz6;j z4!y54hF`uMa&6d1<5ZhMM4_(OvQAZBy>ZhP1yNy21a4TR)~~NNg@M}S7uW_`4~AOL zna^ZGD|~3dh3C(iyL`f!iIbFo<2iLvk>I}q^LEm>&_B-m)YLv#^2k78j()0K;SAyP zD0~U$F#LO5-;H5(fqEjK-DB{GIt-kDO>LZ=VZ4n7D|27sFI#lZtK=_f(dP&eZ}AhH z7|2|J!Qu}{=iEj9#NUukpOyLZ{ZIsSxS;f32QzDg{Xq{zH(@0fopT5I>uu4IB>fk) z=tXI&Qo}5|%&!b~i!OD7^sN@1b4>Y*TXef0x!Iy~z9@fn7QIY}c;9Q$WlqRo&!Thw zDSr=Jbk1|-ufd|rJf2|(EIQW;*a5l zMYr4gIEyapDNHlfq7N4)c)J#TghgLy(YdxFe@iU7tf?^UGK)T1BI6yi=wmGUYKuPB zqSsh-du?N@MVGY-CW~A22^OE5ExNs?QD@O7S@G|+=;vB=&!XGwW)E9*)6oQJ8Z0{3 z!Q}6NMVIw9h9xZebcu}jvle}ZMQ^g`Tt}0?mn}NiY2+_y(YaP8e{WcHuA|9ct3`K( zi1!JLUTM))Bvb$ATJ#PUeV#=xvFLtEKd`q&|AZAkYS9;1^kEiV)&m(l&Z3`h#h+@? zFR90KUt@Cj;MW;nRU1w(#?Sw^;Zb;E_ls|4#rP zWZ@S8pJU;l1b(%JR{`H;;gZ-3p`Sk$^ViTYwJat z_(z1bs#v+M#=8P<^i6Lju#E@2sp5?VscNKYEpYZL_|Y)G}=CHdQo?)6vUf2Ow)n^x5dG*x`Ap z89XpSYEscrdIxx8Y*3b_#YgGSfrfEPhNedA>p;VpDMO2m)-|AE{Fb35M(eepVJw-U zMaSrCLBqHy>hEcy?VP!y>_Qc zy?zhv8lTlXI6kXoXnfYOk?~otjE&EFbz*$hYg6L0UY`-4)iyg3?yJ(TYPog9gGyLf5x3e}h_#(O#5bCqr`Kz~%|K8pG5qr{J)F1M7sDF^(LQ{2>9 zkU6;uaaW;im8wM{E;I1`#kG$DW?4G%@z5_`bpzuf&B^UYO&u}1w;J6WSx4LEs$V7B zLyq=t%G6^O)s9jr#A{MXKOW*}KW@dZPHtDmJ`#@n8x0Jegd>pAVcleU@VXTGL!Jf| zpP=_qmZ62I=ArY@zT#D%GWfjIUc{03FYZ)(nhVqj;SX7S{(&szg{n4Mu9iuBXV*u^ zPYzJa%2ud7Oj}vtr;R{1%H_l+>SRG=zt}t4Au&sJh|h|8hi58p*G$QWZ6JBPAk}<) zZi;q2$KZ2Qn?-iWR{=WZ#el2Kq-$Uq_+{i21u`cxwCX}rRt+jPN$*+d%a=s?{Y?2V z+WImN<2cIgK<;CJTTmB_+{sB=WIKG)x1ST}q~eqHCn?`x*n03hBk#Xh4*@U8A@6?3 zn=B~NE%0M3$JfC-d8}AVxgHDfCdg72QG1fJJ2YZHXHT+UVd_VG z_bN=a?Qr%bcdINuzh*krBjNL_0LLEYp6@eV_rg@njUVv}y}u=kAvfYO-`9)hrC#ek zFZC+qd8OC9)Ukf^QZ2I=HlmIgJ1B3m?oM4hBTZ+&ULB;afV+sURyiE%dTKdTfJU3D z*bJ@6t37zNpO^BW|0CoDI7NApKkE3qESDr?B791Hiq6bgpDJ4CoN!trC#1|?Bj10b zKK;|LPj?u6Zt73S$HcMf(;Su$@@s}IW~0x+dfT#NfLlN_bwSNa*M-@V9(Cat z8+tFrfsRu4d#2Bes@jBuBQ{RFsu_Kt$u}0!H!~mfi>7}=`A#ypo7#zdqrjOL+jpiv zXf*!LPhX(7GX6xQpXi$UF~s0*sut2YRB08f@j3AGlxlV{K<%B@G<&D3$;tR zdO^-!7!$w_Z$Z8!;Aw$F3MyEad^*!;%Mc__E{+YC<^Q*+IUGKW@HWk^VRH;TQn@F72@2;BM-lANciz zcEFk!@+~|i--;mL@gFzeSUa6$J{Tu75BBrD&ERh8f31A6wr=dN3RSlx>IBO#x!7%F z`Hp<2ZCUeD;3)sL80({77pu`0ni0n@=k}UDAlV)HbocAyCWE`FgUE+zPHun3j2BLB ze=<}5RR?{5@dCSeu*)?DcT4e-q_$(0`F;@{f1W z-wfqn73BW__#8sIok(Zmx}EfW3@e7L#lEZy4DP1(ATG-WYu9Cmk!Batr1Nk)>Mt{% zRhL>AwB+T+Y#B9d>ZqbLUWu7!#)R31Wy5; zLOexy+C8dTzdW-IwljLgJ9Es_q`c0$`F+@;yOT=pF4QgED^btmRUYh;1pGO?TR`{I zbTPKLk@0&usgA6B=-ZonRi=Iqn#4gl9N7}YNg}KqedD2jw=GMq!1xvMgK`Xi>Uwe2X~*H-SBy5fk;i7xta^1lybRq$-N&owe{CLh2TQD)GM zJjt#`<|T~(fJ$|v%n!J!I^f5cmStti`79&LCeWKfr!Bq(Sa?vU*#QrxH#(g}`$9a* zP{O=77wUi~$0JQn)aO~ju<}Z@qZfmA3yQ$lRcVeuWn;4!=7M!%;Rv&IdKg&99;$j}zyg1$% zQSs8q)`|o4v5GzyaR`@RscJFC^2-nNt?DlEQjC-Q`3iJCfHG`GT{FC3zjPR2#j=Kd zVH1iFfkH6-BWU{S%}qD2P|l77@1_^4M90dRx^V^CDv(RjL=!9)Zth zIkOI643L_KciSS>h`q(KBhIo- zmg@fG8TfD)Vb78$e0UF^=aHA&8J@t$PnwU-)Ejy|3e=^-}TbKi2kb9VIK@Q<3IiJ9Lo%TsX;}H(`ytv zF-D|ql-om}M|p$sA$k6V`Jhau1oDqS9>3yTc{b)HGgMN>MC`N_R&R_3@+k6#QxBXYDPuj`3mr~wf7+C}&713LC%5~38q1VxwpgmJGJOpEdXj#ZP0W5FG*jorHf2!bCsF+-TNZE!mw|Kh6AmkQd$$k+(I! zTVilG^{~QBQ2;awCMtaWBkuJz&nfV$^N>IVb=U)ror9Re+F?+ZV&l*+8TCG z($;8mwDr@XAKH!44e!~Q!z6n>(3firnYI+FQ}F@1#*&q`>mSIv2Kn1|p>C1n0FGDT ziw2rH1$+5r60~EsDHAU~(2tk!4-qw>ZAk+4uJ=BK!WiqF`TYZQ;K6Hy7>mFpjRr*n96i7=ITi{Q-S-3F`Z*NTauE z7k$#Nys=J-F!o#aw?{vl_~6E)ueRQJv`7{0{|Vj<`wPN4Bg{Q{bQR) z-iF6ajNd<)cT~M~!_l@C(dU?t!n%_;(&xJu<9yV!{ocsRR2BO^)ZYrMXFLde?>#QZ zgAGo+TzeR+-*}?!9=^N4{@xRi{RxCaU)Es{a1q{7;NOj?GWNgZ`3lmookhbu-KgQY zI^g+F^7s*W{>bO~puyc#E5gb1zrfR%r88u&O#KJb4TTOv{dv(TGADfgO9K9XBEN&+ zf6(WDtHIsW%K`r{fd5|btq*ioUWGowID?&3{oqQ|-`r&I%G7g6qoP<>El2+4l_^tB z{e0M4t5OFyqD+e~+Q%`xLU}b~ZdQS^s=poi-_HD<{T^Tw&N94J89v?$q+P|d7iOhB z7jb&19{U-;jPaRgzH-HUaxcP-{V`{}kot>^n41#zu0TG^na`rEe2k1=f{b4ZWCWa+ zad#l&Ql!0Z#4e$qB z@JN7177ctV&^LJ-=a_MUhqU#8yVj8p8XiJ|=GOkE#m=R$VBlO#O_u zfZo(~l2W(QJ~7Zt`=>oHF65d*b3xgD5AiQXm|d3|nI80|cr#u-VDeZ1oI0oD7FVYJ z8?>w8lT4dcgEZsSgGOI)2xHTOtDMGzE1bsq-9_5Fvq-;!y@+Grxff|ony8;<2>ytnj^f((~d_T^7Uw|Ah`1-^Q?xr3^IQ6+4vV3oOWuu4Z?JLaw z)d=s3N~{^jtD@0FUsuK^m~S3MIK%1@H%s665dAgsJ&Jse`ucvt;BM+pVeCAU_IJ~w+Q+! zu1xPg`0Zq<$>;VUpMlKh81gyh=ks&s1Gra^&riUg?Po6O;B^V?$T28+M~5WLr%c|0 zO5^7az2BD3Gt0(mm@Z^KuOpw=eH%BBAK;Ua<4)Vgv0=u>_XRfI2^*(r`yGrVsGm0k3y_+ZrDT_?zHGA3Ou``NmwNY_DIJ>zu@JW9LfB%DPPdJJ)IS z3X04*h(M=0C+Wv~hVim>s&mu`qtgd}NB)rYR?6`{5+)XV-I<|ucFpfCL zvBc6!jNRv8>^>J`_jwq*&)?^-v3Cs4aNxX0G3GhNm{Yp`ngP>ujKK1h{SDcl;JFYd z;-70^JPDV5APlOE``ht@0^te zy21~@mdFF)#y&_#n0?mhV4cU%IgbUe^8TP>t%UZ^%vpo=AMydce5R`1hcXHF$m>*m zv_5F;hP5l$PQi|A13Ml-os0sfPU-k+jQ$?O%MrgEegWaj4eq8ML3~VAtEBAS{xod0 zuDfq{l;v-LvrJ#dTk46rtk+W2rB`X%{s{jC(}Az-*QNK?!24x}-Ov$fI4}3lJD=Ph ztV=>i*ca#i((C+nDzoNar-C(qV+ZtmG5U1c1n|Nx0Sw#Xe3VZId^5-Fj02yOL>UYG ztfWO9_b{$Dbj(jV7F-N_86V<}(W_~jey~+P-&SP?$Jr~`N@QiZbFbhcNf#ZfFAv$c zU0~y-k`8)Fy4jM>8>=s5yurv1`^hYu6NsM#JYUkmHj>WdZ}Ax|eB5z*I{6F*pP@dV z*T@I(MBxKl3Lms{U*F_7J&Nf@BHc(o-OEe|_-sjM}o*E8&|^dYbA;MLu) zm;XavfJ^a?Lbs8K-?ltc<|^1@*~#))&i2!N0?*iqo~MSFX2K!Iso~vBxT(`)(SF8a z&xG}_ro^w)zy|>*eFEO5P9xuRT?V}`_YZW!_KF}!^y*g`eS~43Xgh; ze;RVIyr-Ndk6d!ZXjkyy8IG_nrz;0}#K8mWacLe7>YUgzB5+_s%o+W$M0A3_mUXu? z>T+klF0&4EJ#_hdra#ZQ#@JkpxEx!>C+bTWzZcTOM|+SVVsJOL80mKv?5T3_aNYTP zmq~r|*PdmMi0l755l7*<8*xxq_cK2Hj`8`K{vxx+$#B%kce$pYmPJj{^Z~Xke}W9? zmr|qnMw(rn?yhq1)FB_g9~D{rJ@K6gQ+T!@JmbSZBH#EV-6NFmp&;M0B;St67tf}A z`65i=xg;y!Q2&T}|80~r{ZO*)OI7f#YagZlY=bNdb*?^c^7YF?p)4K<M!p!xSL8MzH&1CWd-C?^GehGWoO{*FZ_;G7&@Yx;6o)u1UP}>G}-Q z{6@2eu7~*HjHM{MwZ8L4_YPAP@B{-vtx{7wmHj4WECjD3x;hD3K z+3k~Qha+utO-{Q6wrqzqc>Z;XU6+EeB81^No-3>n zVR+s`m{O(;K02@VNQ383A16%&Y49A$C4+-7JkQzuhM+Efn7#!_gXhPmk)~~KNqYZ{ zW58z2;aV`iYiq+fzhl{F=_4%r2Qz2s|NX9MD~-oM!&>)kHJ5qT@sw<3;a-^kH~Qda@gtB*6IVD;1A$uN^wRyi#NlXzo+yFj7eHQ|++o#W(olz4?%elH?g(tc^pMlk zQOf4c($$n@3Vi((e@@WV;BM-2U$)YbD1TF4Y9efwTPFO=-`=Pwu^YjJeg>~uX z89Xl)ulfi50^qrLPX`Y)KEM58osBs5Bu7lf8+-X9>^x0-JgTsdfbVe-_8{y$2<6>e z&~60J4E9EUz_E;fp6=O){qrqPWZAHJ&Im8{VGBhKciZiDg3% zdOk@#Vb6}VA$UbVGh-~+??HT9fWwkySdTF6;mwYx@@_#`x{RW;^$GIBerNMsf8O6y>IP1f@?PA>sb*hx>U$0*8+q4;PlfSW{+W!jD_}^i4A5jlmvh6&B z{=&5T9J;bz4@R6UxxCr>2;~UMm-YB2gS)BcAXgvi7`7S8$mAR7XXY|dM<LJ^b}XtV!-;+odmz`uo{jJ15S$ zaCeN~N{9oV514B}CJc4W$e3{SJ(MY!`%+idVU8{9AY&A`_`kN@p+41?<-ttZH)Ou#Zm9AH4#-f^mzHws?-2%NHAbPU=derGBPQ-5u&vF@J|2H+F5o+n2A9 z=Y;B%Td1!O%czR<`Q&S@pZy*Dxqdb$kdbHZ$dfWEb@f2p^l>EF%|CA$oSVejLy?|B zKGxd9G4g@^$ED?!`NOI6OHaxk_JdzpR)IW?%*i5MLB7`7=r70@2$!D2QbQSo0{p~(TsK8D9%nK8Fw+tv;+Dk zq-9*d>2$eZ+T~;M1b?oHuj4+%Y4A7a=iwuNfi`5~=a3n9WR)eMg9BaoRv#?6Gp$d6 z!>_#C%sh!R9_N0jGpYvq1+X(ymC{ytZ{xbVsc)*i{(>o6_&SuY2V0L1%KE0DtTSf? ze_;AAQ#MJA4~N0eKM?fs#K!@@&%z7c6wYn>Wz6s{z!z9JbWIjJ+tU0x0PpN*bUq@WC$R>TGZ~bs6MJ&UJLlA~#iudQew|z7~G0Wr2_1MjYRcH$UJuK1O&2>cf3* z<9`EgDX!f1YUj#ruOR+0(!qyuUn?jY@oGUK`tkyd_apco(7~A+^KEUNO0?HAnRn2y z&_-`i28Y_18bO*#j0Sr4h^L&`!OE_hy z7l;!b;!fKI9o;VdCq{>;X+p!^G-%4EZJR?{hwh{q{!Rz%+00YZm{$eL#&LbP8^!_( zaZhgldC)hezb$|-?WkX&J<+Z){x;|K>J09t{s23wDR);zm(pkXXY`48GC292a^@d< zTODhmhp7fzAGKPSC| zdIbHiFGpv6hsE0k@ACrQw+3>Y4>@WB{n>AubodVL^NbhtiA*=n;5a{ubd-^26yi7| z{A0*M-^p(%ON$9O zz%%~NUz4HU;CRaXnrGVM=i%E=r2Bg?*4^3Gw(N^IPp=B$ccBaWO#0^auyr$FW3yOS zJ&ZC0_KqXZ7byeAAQgO@deT*wGfvPZVuK;MWI!v&HY2+7{rMi)S{T z8O9$saqk!Xp&8#NG2ZBg^FFxUf1tW7dX_pc{w$2;pW-(S#_!Cz?Uib1b!cJIrys^+&fjxfTcXo5C7fR zJUif}8|!QIq; z@J64EwVUj-_wtQv6n5YkPT~6k^Dgq=>3z6z)oA8Ou%q15(~Ndd(bOa7Jv~X|cf0AkVAH8+hxEIK z=5^C`piQ)C(NcXYXk%6SN^V&F!vl01a(86VL0euLn);=`s1L zGQ9~j?t!NH#me-0&^V7v(-LKRHE8rlXIyQhctbG)ALPp96~ldd1A^YneAA)oL2vioGV&+GVo z7}gp3BTn1y(dl*MQ@-OEsZ!o|RAc>8@GS7pof{kDyAi3o2FHCVoUa==VZr!TOyYS3 zeQ;k)!9H(r->iFHu7C{Qu|Da0UM>Z0_%!)^)ZO?N;af#1?_2XzirNk+~>_t zIWviL9@bw@>%2Mh$oK8R14XI52zOw6?}7QozTQ%dNijF$*>09i#OtN&nIFRc{wDOA z(z%gxv#;=`EJB~+ti2We8~M}&_uIoc`qStWy?cuAeFpLe|009WPpuYP;2RaORpz&qLp>+Whl?N#7))JBHbP+bqXyzjV;E^Ujr-g4xP^~7jDoTVlFvQz8f zoU_2A`ULQcPHns-1F!2Hz)enV5_glB_<$ej6~NCswF!w2_^qA+J>k^4!XNM`p+63K zX%GkSI^p?{QyUdNfFCIf;&_m!dj@_>;5yK;_GaX{A28OrptLpQ^tTWd^%{%i!}rw8eOub?H74q5v-aGsNP7+RH1XoY^>d_eM!d~_yz317! z*>rb|J{-ia2i?>`w5|GMneS$N+Xvt5W6dI2fiW1zd*QN&7j zD|~(5!F?tk;3~wm<$?WcFXA{ckP+)mIJ@$IIpc5}_z7JF-vVF0XDA=w5s(jdFFhajwR!BsnSHjkYL3Ma4qg3l z)IH`wJ*tCmq)xytir*U^?9}KTyoLGy%DbW{McBjoM6UDpr+ll#xD#`qw?E~(HRh48 z@3<5?BAj|haK_QQbbe~g#l9|;u$i$(biDoz^5CC> zu^(@_!RMzAGY^ahyuqE){q`Eryus~sBPn>AS)%l>2}GZ02zL3FDmftxlmiL%S`^i)*ipGa9^P@50W%9(>u?&c?p# zoA{pJI~LJ%g7vK-NMqZ8ZQwzKr|l4>ZUy`Q2wCbuXFlDLhVS8c_kwPAdNb#QO_VoD zU&yjpi?Uhkm(2;>d*K1T;?z7Zj)mIIX7GitKH}j%fESSWeB5tg=Yx7&x@*3_?_}uS zcykwtfyZU;B9V5u9Q@jZ2mHAT+G5Q2MNK^O7NxwiA@6Ko-sdSV;IWW5sB`d-=jxt} zHy82d`tc4k9^kVP@8G4K&AE4xiTOl z7L1QGoUq$&{2_c7VDowo@oo*-YM7LPrB?zx9ty=9h}!cIL4HS10Pt$?_qL& z$1yUvD{1%W;B1Azj%eoRm=j|i$DTjpp4XZA=8uqRs-}F_{1Ig}RV&aYLhoRHhH{>! z--le*{IN;Jrs;oxX3Za)RAQQ@{?_~vc}&-Dfrd7k;TNB-UkA;aKfWG<5&3shjch z^tTF4UxD&GPd_9u_Ppx_#y<1ceYjO&+;X45ai#ASIH~kq0=tgBLtxL*w+pNy`Zj^F z*ZQ9VdlCIbfmMOtEwEdl;{wME^o;^13-sp%#@&V23mhxdTLktBb*;eI1Kl8StVpjF zI8mfm3mk2yR|*_&r>_<`*-kGP*ln+`6xeI8KP@os$Gb#euY+DHu-j2D5jfFNUnDTr z&o2-d>*EUqc022N0^|O(N`Vud^?3qg{dtDKZWldO;6xXFuE1_rJwafvs~#(`I!lid zIChpEE^y*3eU89xu^udNq8R6Wf^kH&L=O-+UZVR7oGj731jap7WdbL<>23mJJ?boh zy;9v-VAWlB5IELd7YUr`t|J0R%XC|T%oECZ|AarT@yc{c;AENphrqbQ24`4;I6ZW$ zz^bQyTVUKtgZn7_ILV&+b%A5OI1dl#y*S78VYj#bqri#Y`ga23E}54Fj`z{O7C6~Q z9}(E?t6vZ}-d8^_aI&xdnZVJ0`lkZN`{}0zPV|G%4`hh;*G~x?@2`I-uo|GB5E%E6 zJT9;rs2>v;_lW$rz^Yt-Ti|%Pepq1KTlNis<59g=VBAshfWWFk-!HIRp}#6{yh7hC zaI!+*DKNf|uM-&G!+%-e#2|f(z|q0_O9JEj^Un*M9IST=tcK{D1da{S+XYSx(OU(^ z_uAJ996wuc5*Xi8Zxk5cORp0+agJUiaCE4?R^a$hy+UBDE#Ul_Uk9SY^i=}KhUv=% zP7c$T3LG1*mkFF0t}hlC^Yu>(92=n*35;(`7YZC5spktEAF1aEoE)iV3+#^4GX=(X zkJALkz3h_(#(nG)1;#z>;{?V$c(lOrF?xi+$uWAU!0uQ*L|~jzs1O+E&ISq`8>jmT zoEWEj3ygVB4}s(3b*aF~@w!-GcY^LBFy=2E1y&PvJAq@kt6$*6M6CqI82cpFTF_^; zs`w=RFM*Sj^gji5&(-es{bT# zY^wgfz=^5)e+7eMn$; zrv9`G_M4Udn$Tl7mnCr0(Ku)qq>X4SZ1`|2qQ4?A`g%+XeLDL3n+1*) zXx?vQ@=X-zT>|4w6UN3qJzl795I9k&w+W2?{XYbDi!^>SA&6h3YXny9^m>8acKWjd zqpx2jF#7sy1V&$9Ein4}&j^gZ{tAI(9rR@aCpzd)2^{UHaS$kwp`*s{milnAqrOn! zXeWKX!0}G{69QvAFjrvJSz~VDr;T;ivjk3d*3$)!cF|J=j&;$K1opb<@d9HH7{4_f z@ad{Y3Y@^cEMU{7qG#!|1&*Jk2ML@!OP33bu|a=#qMUuqxAk z6WA@&?+A=B!&?HY9{SG$$9m}31WxqO#{`bz?mB@nX5f7}z6?Dz?!FIX=%s%nF!l{z z6gb*j|4QI^Z~aSwlfCtG0%QE}tiZ88`hNuW`sl*~V=Qq{;Amfs-_-W=#aIFdw*z_l z>K_Q~_S4@J*z2bo1Xleu*F}x|vHlw0?f7t_zvjBAp+^VkhXjrd(Dec*2I#K~9380d z6By%)dj-b0;x2*Ra(#!u7-QTnaH3pe9n#Osjq3jt*o*2f3LLG_y9M?tbX;JJC2&Wo zpVk|sKPPZ|kWF?Mjz)>jLhI9o3l zIC_r0Qs6lDdjwWP^(6vh{IFDDj31T=><-fx3G5Bi7YK~;!vcXZewZgP#t&Q<_2n6% z&l4D9h8Y55U4E*-iIMtTfw7)GLEz*lJyu|h4Mqv9#^~V!dt>xD0;{olu)wjgIx28- ztR5gR#sIiz#g{EPPWKWR{XQ;L^Xd53wVS~43HmI7lM{4jfuj?32Z6nb8o%Qlq@AQA z0%MJ=4eJ4Z{XAEHATauOY_bLP$@(7xdz1BXfzhY83XDGeZGodx^jF=&xTEI5|WAT440oM+8QH{er;mEd9K|iCOw*0;7-qslb?n zKP|93TPFlYzx)(n(?7aO|4`tB(oYB+cl6@|V}AXZz=??dZ-Lzc{cVBK&ps?L`q^&? zjJ|cR!01mO5I9++?-w}MPJdNk^qY4J9BZ%d6gb&l*9q))&|enV>!5ED7=7iJ1deyq zpBGql(mMr4|9F$Y=o7aK9Pg~R3XDGSI)Tv-ZW1`rMQ;>1+EuR;INnvS5m=q2uN4@5 z-wJ_Mv5pBGFV(ggYj8%x5|8vR9K1MO>!QMmLz7W zlK8BOVK|>NOr;VL{B{z~4Yb|v->aLv9eY^s-DJK^!gn|aDzR5qfwod%*1GXs9M;;n zu68zLFmZVw4bl>Bp6h=*`i8&WT&J*xj`jB{N6t)uk0KwOhr`|g?}cx05=9)tHK|xc zzjQ3vuLJx?oZFJKzRd3ygS)A#UTM3h066yq$(!rDOR=6E1$=V5d}on9ONw>Q4*EH! z4bIJx*YyT>Qx|}jpH9w>WWLXUOsC2ZxehRGa3+nst}!_7|IH!SXvigesJDE7adNx= z?G)^;zbrZjws{%+u&%=I^KcG$*-@OiFlUdAt-39S%y59ZSX^PeW?^@ z>WO2mIU;9b>QpqdClW_Jnf@y7e|p2;PwI=epRe3Sli${ZVb@)F$lrW(f-=5m4$hh4 zTpQ1qVePyYerg%ZZaV6rkt47l!=6J}7HvymZF#XO7%Jd!F5z2F# zhhYQOuL14Tdqk#Aus-+k^Q}{f%$_XzV4m4;9Kf@m!Tv2}>}JX6pdLWB29@lpD{%JF z*;;*qX`*WOOOy#=={y8hR^72_%p-}tC%&J@UJP}IPUeky)H3eww=7 znD+?rULeu|4--1>4s!VoDCvN)-t5CTPaWm{66t`k4(G$r(W9M7hu(yHieB+9;$zY7 zyNHi%P>C+$W1)MOjPB^~0v`(JR&yvO^t!UmU{y!c-QmW~g=w zL$t&&jrNiqFF8UxT|zXBKb?{g4d=sf4nI3>!z9h$kjTmx>o&MEESr{?qMc}n)-YW= zLqar+&Da-Y@oSo;ol#k|){1B!?Tic2>iTPEQi!I`(azKmZQMwWZx8G|S}SVsosS!$ z#h~xJFm0m7Hwx*r6*wzWq40Zb7lvqY(3XT~OS)@kS%{V>)6Qif8paFGl_46|yPcS! z)v>*ztXnHe259G+5DoJ@XLX3yRH2=9A=7qK%uWow^Lo*g1-C?DvFdb&huK4bkF7+PObO z!?@S+LbRq1+Ic8M8`nuY4~J;cF4}n{L_@oD8bY+1V(mO0qG6or90<{tV7(*}qG25A z{3JvhhkEdAh*sBAJI{w`t*9GKAzBRW?z|PE zDU^9@h}JMhJMV>PanyqoAsW_*ol%A9`e(|w4t3*$P`oLNpJ)eQJoNhQqIgXmx0-ZivRVIxj?v!~ZP|(Xd|NTo|I&!2c}?(V9?} z%R;mm{QYGi8rI>RD?_x_Y4B?yTFGqqwJcgwMGe~Y>JY82J^WgT*3c1tEktYT48Inl zwW9rQ4be(aH*N^g#-XjoL$oN`+vh{H64Z^GL$q=I;MYPl7j>g9L~DZ2-V>rVMB&#$ zv?VC>`$M#GD044Ft3z9TC`4;OnLiw&HKDCO5~3wg9t|N{&3W)^S+v#)g*JE~M8o*s zc``(6ErhQN(UzdC{v<>j2VeYbh=#ec^L&VwM8D9Kp;fZ~O(NeHL$n&?`*Mh;P+xwZ zp~2_0R>UzLN``1I#y+ovXjp4=-U!h!-ge%~(2OiG=+PRYm7xE4FGTZD|4xKx^i3aR zXhuG)yE!Ui`#;zoZL2UuW83NwqQxXM-u`RcmC|AlBAZ@-vJkBaZRWBpT0=!E#xGZfXsQ7IFGP#N*Ig5$ z#ZY%whiD#r-MSDhj=EM8qG8R<*%G3S!&qf&h!&&&3(=ye8}Sg$#aQL@85-(oQ$-2N z^5zf?`}xjo85-(eLq!ehRb7at;5+w(Xff2QdqXswv2gAW(Hh`Sy%4PgeeFXb8tc`= zA(}$}`$&iug+FZw(Omf5$3wIl)U^X4S`>Bd$q;P`d`TjU)>P4o`uvj+EsFa5Y=~BZ zJf08HYS5oIg=jcC;Jg^3VGqE0IYjf|uYMn*u`MJ+v;_L|S32i(de%(4ADy9 zua<;pQTVH6AzBUk#>+yqC7s|C!!-D?ScvAqhg}n*ao)W;M8p2Gvo1uV5332$=!dq1 zXjoHswuWe|r#FOXO{k~w5N#al>E}ZxMM|Q|}w#o9++MN;oDA(de%p3en=IyAOwGtf!BJXyZ^%8$vXki*X(g(G>i_ zfe@{A7JOoewgh!8k)fHoM!)fs5G{s!^=yb%2Ve4hh&B$kY6{V4s~0mg*s7_b2J*d} zp_zOY{ORvQH0;Sb$q;P`Z1qZr=5b6IqH(VKR)~guRHrpWtAS153(=a;_D_UpY||fv zXk0H*h3R@=^jHEr7lvpJXy+X=G>84K3q87IXh;hhY+n+hc@g-(5Us8d{x3vxQ6Bw6 zv^va>q9NK6wEZC=8usR#VIkU*{_txdS^{lrYKT^Xa+?{Vu^zY~S{!9LFGOoaf4MM3 zt3#i6VTh(s9!o;BDC+LAELu~=64>gp5Dj}t&XplrD{K%8(OmeyYeF=xH?0oQYA|0| z7oshJ{c1uq>{&Wn3RCz!>Bd5=MRRRhabHZ%nPdN9J???v{s$jfPnK_);ai$Qdu4Sh z*r!;A`(L?NhP{PW2lE%Rc8ED&=RcUevO4aYb>|(i*8bK(-i3;9qwhc*f6pbfzs0z? zLo=N3G2Cg{f^;S??DI-qt-sIYb;8`s%JlpuI9~OT!QIsL>Ad{!``ex_{qXOtagR?u zzE9h`5qmoL#tLVW_lrE($7qb)XzfP@`YL>L0jw;Gdy??qZuK4{1MUhMniy#RJtFee4Oz1xia z6R~3jWP<;}Z^W2yvHUuO{#(lRb4V+37511ujk-(yE(G1kcLVIEoadltsvh?6=FTy9 z1LIuAvb})oVH?Kp4Y^8?mNpYwcgkwn@IJ~3d@tnWJ{RqJ0pd{RYWx-l`KbHNcf8XK z%-@j1UQY$=wHIN2oh&gr55l)<5v5WUCGIxtmu#c%%+K3V*y!z;XTAYHguNrtP3%w) zKBD{Ukf$DYAs#{fB7c>DZD{)`(02;z80_~J?oIRnA4L4KXrG`QaV}~Z`I&S$uQ!3| zW+2@R*aUI@$aH`oLpqT|!Nwo?9n;gL!G3;be^kEf+y%doTMj-Vup*{dw?{J@#tYfcul5o6Y-fq-~d{+cwV|haT~R+b zTXKi*>lU4Jm1|G(gB`@5l?HgrAANeb?S9(igSI<2bm!+sw6hO>Yuecz^mPxO40wlh zm}BX1y6yKh@cl9R9hSf7$^KSg#d?J^3Oi8_E^Ny>;Mb+@_%_=At;|@VyU#6D`(jad zn;SJ}YD^h?JyZr41Z6M)HY#9y#F$2WPxma@GvB|89Jy@&1Z0oF7GYk>@CuC=Kf=Bb z`Svw_ELZz{cv{APeHFh|#I{wLBk$%}nLg%p%is%E-lJHyIegA@dHAM%9O`hn=lJJS z0@$2GA&h%h%=wf6Hs??X-;29k=uZL|-^ute?ribU7a95;^F7#{;-4<1mkT7&``h$;bF7&;$R}q@rcI1N5hFqEC{(TF#ms=eN*E$2+E5 zaE{98z5{oKZTEdx`ICX%NNavq9(3__(6fQ_6BX3wYRa+0Z9Jc6km*lhJDijCeJk`o z44CI&O&Ixh_3y1o!bhS#j8E`4!Gd#KfsZo$S)bW{TEG+Sq{+eAPUPK6pY+22nsJnY zf5W>s$6^jL)}MpyHaLF&6Ln!W^F=-v^Sl|_UbF85v-rmmX3o_~J|6BA3-bBCm5;e6 z7x!W`PxSLy!+ZeGL_R$K*o=IV+ug<+m>0(&IHM%C5?vTxz9hKI1NXVpro7AA+`|sP zk=7MwQALJ5mJIhZPu#!NJjIt`p~3O{ACQ4_O_AYk$RK&Epg*g}JxI*|E`;&!^`LKR zDopm$$54K}E1P)+eUq`#p-Q#KoX2KaK_`3*nJz0Qhki^SjGvnvw|7>55|uNjfo+Zb zFz0LLSRZBGgSr5I1N!p370Yb^WbGZ6*X@&6-n$_0H<>o5Po}LJ*`u{@=P3I^+-rIa z;c2_a`=sqY*|Ph2lnwWS!M;Y;zwquwz)vC06;^&M^9Nt|`v6nFaraf%9CrE|;=F?L z&d$4UI`3Xq-sQ|Y_)R(5={e>-)J=UIad^JjZ!>V#*(rcoXTj6RreutUbA!#OyOb-c)FRBO z$Md{rh*taMKz8a+J%kVYLi%9ArJcS4o~CS&xA8q*|Fk|0mOck4e{feQ^|{92IR6WM zScmC<#c$F_X5aUpH6Ay5Q63rpKqh0qCgf*iz_|sEkJ9tq4!GmDL*To478YSiKRw;P3f(xChwVzu_&LXX=YC6vFGGi$pabtN_4||J+9b}JmOois+X45X zl^-asRmAbWneWGoYon+me0Lz;P+aSxj`Mvp>5mlG#?U_b?m+zE;@UX;1m8C^-b2N; z9@-Ay`1XET`Anyl_9^#3$J;;KkG>r83=HJzk9QPxfi%`FH-Oo{#{!uBdpv;6cp!k; zzb68?6X0Y3hvpwmDn3A$ypOhx`XzN&1#QBCo~#Sa7?ZQiUSm7*$E2o?u}{rP1OHGB z-HbhXivRv&ZS9@`+ zy7o7$hfHP}u)Qqy>l^Q-HSJ}AY8)E05r;l#5#zXxjWaQq!@GfR+_8)MyiLD}HBH(y z+joJ6ZzRl}v9ocHQX)tH^a{d{fp-gd8Xw@{UXs8seC0P8ziRAf`61p_jB#SB2W$`? z(|0zulsjg#=9PJE`5okivM*)ZH}ApF4L-p58u3+A zp?@C?eF_}^cY`smQ^|6DE#(cqqwv75)ZlLFRpiS#X1G557IXZ}m^N#UlUIkEz-#Eg zPPNA~hL_B7PLJ1G@G8r}i)$g7yK^$UIA&)XWEm=)!>K@8wp~7%_@`GE7b5QuTmM*M zl|d!Sfa^nlPUUV_H)q-L^zt8t{7oHz-#$vdIp$cKviLTd-vwZMZSI%xJ-Pb29^h@} zHyCT0F$?X5?_K}MJ7R;ew~P95i^1{z590fN67g`B}ICY|o8m z8r)44L!Mtlo)MIRchy6lp@d9t+LYMmT!e9L%lM<{khDMg>`NJc z#Ji5|@$x`}%mUSeIK8P~3BMh5RhD$y~hQ+oF?%8P>&bMT^n0Z>` z=99Ry6#ggGggAFYhBup$S5Ovj5DxO){2}?S%jDbO#Li*9XwMNn($Ckx6Pd3y#{CoX z#qVx>7jd>CU!R^L|bH;X=S2R_g!1+s-ah-$xBF3c* zb1WH3DMR2-Sr30q8L*bG5$96KuyrBY0`{MrkIEZo{Or8b^)1Nr1o>M1_(KNA{vYze zV4=(!%QmRk1U&$B%Ci#r^L;+vywe=>@BIqrT_Q>B&tfeLI^mn0@wyiASr64m$~ins zPRmBdHov4?R{!`pgX8{x@aI@ed=AIEChuhCJFaG-K^}#@Cd&6Eq~m-=2;BKlLWE`Fu51Kj`jLQrRJxrafz?cRyppK77*RM^#HtpNk z)7a1QbLWshd|t|r0~s>*OJHnibWk{h0XrpU#LYLQQGS<*`~qLn;NTl56A$&|(jc$& zS_EjfkOp0z#CMe4SY~GI=#Q^g`acZa>O#$e_zvoX%9{72@_ zT9cnGE7Cp&{^Sz_tdO4v9PcBUxlN{DZ$`h)I14Z@%F~YVg zzbQdF$NL4Lb^e7}a%Rn0^V;C87c+8@=UnJx?}xQc^vjg{lFeAVnG1RP2jyIiIcivT zSK3D)uVdu(znxB^9U{JwMfzWsXEXezt)qMwZ0ZK?wm_Jv8()B|0)Lrx!SdD94DO~_ ze|q>fGx;d`0Qg)7eLwU1S+eb(KjAU{6L_$0*ifiO>tmQ>aPNY71Z~yucn#xysc)6A z5B=-gm|JDq(CO7TZQ1(wlp#+!zGQgk+$+mlj-M0W@MD}~gv;?Js~k6?90$Ng`-Aym zy+1BG)n4#{_d(9b0$Di@Oxp|JbK*=*PJ4YVhrR00K&Sb>PG;}rt$)B?ImYI8RT7J<$X8pn#bpSDvS5&wdK^&%v>gy zUMDAH+VWqqwl@WO4M#p~AI(4(6koe&+Pb!zEPKs_y-)0Mkf6L%*>T{5VYu+x>HpCd()}*>McEh9x0G5s7C=XrI>O&3mt%~Avf_MndQeAp za*cGk8842H=hNSvkkAxz_e>&vk8Zg!iQ-8+Ui*Wn@2hU?*J}SB@8EYf| zW0;p>|1D+u@A$-YzIR#q{ulGH=9T9g+)ed2cK6Q!NMBoO?EKSHerHzl&NUwW0rHaZ zRi_Ur!}rhq`0e=ti+8&0tbK|H$7lTP9<2Qhg&ki&KE}^tY|L_eB!^9tv?=CwqL z(3i(7-Ty^-^R$g`y*}`B%nI82DXd$IKf4e+71}$zj)P&%myoEZrY_4|dHlzF(4M)6*-j_n?Ec zgIqQ}F)mYA|BQ7Oj&(Hh57(9PXOQ==t-No@qf@^#;Cs;Gn@gvsEuFZANu93Dq01;loI&1et-MP=q)j)R0q@(nd z%;Njq53$9tGvNKa#e46E@a}d7yuWYpzV}0T{|ocITw{9aFLL#RU-x-`I&mi(&vxK zgY!X=muq13_tc+u!WgtpC8y{Uf6JV2rhnayIXvu>KI6X4)Bza_W%lHSZ>~Bp0P>l$ z8^=$bqYSdjy*tYN0?LFrEXRP~mUS}~+!+X3!at|bpi1!F4a(8jChCXJ=6*WrgrOl^ zv7A{Zn4dR;r=f!v>w@GFLm9NSMfOP=@}%AmLr=b8oBhT%xDWM*w0AHT_h6T64eq9< zLBC)>vW~wM(?EK#2gP_-8r)5dMLd%a&*>aHwG4WjGB|ZF zUwz1U^vM^3yaT(K^%Ru7>X5iR-`dK*Ay1~gpI*Pe7x`cu^^xuUp)r~EeizmxxnDgC zbuU+)`+Yt+f_%m@9d!A)vR;3hvTn0v{VZfPdq>ERbqkvr%k~Cy&^TbqLHaEL{9+qq z<2M31+R``k>GdJyc!4joKj#O}xu{?EI`k(kS!YAmQrPu#fqZ7K2=gP>X;aT)5q%!+ zRAl>?y2G{+9@E}%269F%IS2CI#yn$=m07$`&!2R(c$+ahe4=@CO;>DUtr2vzZ1OLx z=}e-J;TpkWlnd7g(5AUpi@xSDp8Fz9pVzz?ZP56|srpB_$5Q$Lw&_&{cT>|L%b>u% z4*Q;f56>~Q045Kyb!`q?ccv`66@Mqq3j8`gzB z%0B0urhR&5+VID=&$n=pPG2hkld(6XW2d!}Go*XMSBY*mOrsKFc!SC|CX&e`$&6+(-jQh>F*x2j)SZ84$BJEVx0DlCX zPHxZXXY<;5x!5`A`@((o3d^p`VApeC*W1N*!TRTg@JGw>ueTFaGI9qqmIrv&MjV^{%k= z9!J^p^!?Ww-m-stdcLod#XH^CTWiW^SvGCM+9Pc`J!I2T$aMCZ+BBK5>9?QH*z|kG zhM9HG<$+Bn^)&p@6F&On~? zEqSH~^0Z)IAl%k>oq;^(Sml(fd`4J#_Y3lVI!E3s&LHphe%^WKLY=L=Kfu}v%i*CM zdCxn8yx({((;jaJ&s=@Rm^0ve1bo|qZ*9VL{Wl{r?eAIW!?|6OXX`P4V;xnv!&~Dl zEqy~X`T`GaWtPF+R0(XgGKcO(XCUJ~Uw1RdUqan;jN9J9oa^JZ`8z*E_j@hf|1+2F z@tL|Rr2D_k*)TWtEATxhhweW;0~tSS>E11m?hR+aciD&N{%K413v%g>-?-}@(*0nd z`yJr>`rD_r_5a7*yT?aWoqODSl5kN_!bMS0G64|;6%`c~EEAxj#TE@7ZL3FuoTHwi zRrFY;U>(F(D^=OvTeVKWYQY=UYK^ufl(t$g6~WfF+B!+lwq9DiRYt+Q-{0D6&8(U1 zNkYy!@B98SpV@2ewVvC0*7H2;y07X1jpIDtHv%)R-52x#?rxp%zL&>)zc}9cM$k)k z51`ZewB>y^aDN!X`*A&>@$F~qm~6Vds{;rtsK+_`ba@d;>Xw|no#Sp0M2@Uw@`$G;8O z4*wU0&zlFYGU-(AWy+NLwC9mWVSL@acxVA|Ow7^6xu=WvFWBS%V2)S&vt^Inn#CQq zEjX{Kwpf!tKaU*dYRkOi!D*KuII)j7j>L0}Xlwzc%(4jGy8&{ld+Qr5GMeSl}@cW8jipPGg zUAl+~ck$ZgQ+j51PMRb^Z zrJy4kXJN~y(Y_Vl{NTeL9V@IXJ{Kd4HyMu=`gBozRJI+i6Ae~>S`JAMl5Z-N@k_vU zWdi(FA#UoPye|fa&eq1Y^VdDz=3Cwd$ME(@5pUhYd#cyYpT3Dc$Bd)yEP~s;eqYxK zKgW9f=zDdVAG;77vJvYPd$4wMB75wvg~p&i7HuM|;krF=(P8$j2mY zPnote{q-&FEAjg4ttOqyeFa)e+q1#&ykq^f%9G_B(QeywX-V9nxsZYmcCVe@fsboeqErYO0;-)X{`}0+^e-T zqSx>wyDA$omwUUM?>?*>^wsu|zLz}uUKKsw9{8(GI+Z&O`gG5uYgbwNVr_ozZ@`a<32y5F+{vBrUgzb{?_cTx-0iMc8DbZM#Z+vjC!FVE&pH0e}sXJoz-p1F^{ zseMM!l$7qW@6i0Sm&eD8U0q%aUA6dvivH{Ns#}~G#y0|IYVS^RaWE`PeOEp~8S`xU zsO{gpm-dpFa^T8x$5G1+&1FS*0*UsZp-(thbWK3dCPeEOyO=cg7+$iKiSR?tEqim8 z9r+LX=J}uI@jp{=JUjf6?wRH6)iact7uhTJzjA*;mAyAt`-~auOy%3y31o7v@I!NA z?_f|Cx&!_<^WL7pj^^VseHklPtsbSayu)^^Hhcv;h2w}r*r7lgfr zuxE+?D(zk3zp{VyU(q-EPgF(!e*^AcD|@Ye13a%+R<7R6J_gSZZAkEKs%&N7)lUQ0 z$RD1NSFZj1psBiq&%~>jZpxmYZfXTz>YRongS}HX)arf)=^FLGnaiFJuewix`g+#= zA@A^QZ=)aci(ytEJJqeEZp-|16YaG+*mBt>-5;<224GhR=6nm2`g*QOGd}^$w*uL8 zcW*{fY+lx0_J+@P=HEHq8w-Z3$FQ~mRJr^ett&Xa}ke866P-DC2U#XF-rc&(i%;y2hO zk9Xe~ykmve#t*{#d*LO1SY`3<-yOXD3*(KvoSO@Hd&l7IFT8f_ExeBlFEQ*gi`VSq zpv?mHb7%AUPF;WvZy}#Jcz$9_`^f=yOJgq6zTO&>?ygusUyxoe;d$#z`FPamuKJ3p z%&>`WKos-?y-G(w$7u+N3&$F4Dd~mG1sjbv!*i$D~uaNx&%WFT}8U{sgzeey73l z^(Xi$H<$3*h=Q%sSuh;UpKp*YAA|k&^hVFJ<+Y!-pL}VIJ$w_I zO7*8Jd0i(xaOVju&4HmA+`epL;^f~Nd^;9@U#Rvev;X1}uYJy;eRfm(Fh(%#qdJB0 z!UlauG8Xp^m|wKhP0_i(GHOYpmSJ;lFBzS2|l`DCp@7TyI- zuTrOU4Dy8@@crH|V)RY8HJ{jpz8%^Fe7^@@IemMjwqOsQV~(a%eaj9EZzz%TXRMqD zBImQvjZ*pa?g724J^7qeM&GtDrrJ@vc$4H{_XSKtNBn(<-}U5h4RSbM`eyeB7~96T z2WN{{&la}p9$0+bM&LeS$9U^Fo9Ard9or*YSW8}BkMQY&i;lh3puNjH2f-I_KtJD2 zqo3IX^8olQ&p)h5@Qn}ZuhH0jv}9wS$9rvo{i=UO^w9Soq>ScA@^%&+f@@;ta&}fR za~V53+|&Cy@Mzv)xsiXz`Ey4<{P=#!(0-U`ck@W%lUPq^w6U3gDYWsLAU!1flaXP;j(p3?^h>~faC1SwogBW<0~+63SCGSZff>j9 zkv)L>Dsap3-jXcz^Nq|g?OUwhYl2|6@b(hkXIS3%f_FEEVQuId+0f0~Yz&4CHElwB zCWsxKej6KVb$W_k8HVJ~)4Dbm^oxUFw@!$eq^< zv6YcO=GnD1`<)hUrH<33gtbdw=>f01Mlu}4eLi{kfp9DRWV9BoeMJt(Nj<>vVRLzT zeq2-Nn{P3PV|2-vXLk26l3ziW8mv4gK>O8g9px~l2Q)qhjV2C;Z{1ZJ$NQinxP|qD z&TR5y;=N3~`=rPF{qTN(jq~!llpY#hEMD!ry<)pslTPJ60PaxkZ{S|$C@$u#ozayT zKdQK{O=t0PyMoyYb0m+)ZSLkf254lwOXrdFN};IYjh@yi-gOL zHU6f(Zi@M0;_1f??2hA#&S0Mo>~eCR>&dy^=~!VbL7&|-9Om&ZIX|U2B<$7qfcwwZ zj{INW0~#lI{Qn7ixhT(D}GsLTRkHXF- zoyz?gxWBSv&{}u*2lsgYopE6ijMT7jI{f6n#bV?4z^-N2X%8+qCp|-~WcNWkeq={9 zS4Et}9b&`s_UItV%G#qNM2{VF$R4$_HlZ;h|B$&cw$H%lJ2MXE z?jHQ%g72+~J|p<-5xA2wnt!(E8P`-L_X*p;p|upjG5dNguU}xlPpOVvZQ9bEW$a!| zcYx@UZNyi6Pkh<=j_&f6{dqxde-j^eUPN-c$)r=cv%!(QvEv@y(~ESkd-Mj5Ue*Q- z-O|ID^??dc58r3L#;pIfbnI7?dO*W#;@Qnz=^t8TQ%n0o%RU7=un`)x&*tmUAbOWd zuZVA)U)!?>bo>lD(6i;{y#LbfoniZ_N7DmVF8>xImk$}Y73@Oy+UC1XE?(O>-HL0Y z?|QUcW94(G@W9BbR=AK8vNdtDD`IMmV5g)9#9Xc%Q>@jNud>Fl{ZpraZ(GTJ}21LrOW zcr*o8ESn1MBf3SVcCk zEM2ENzPo6zGrabi)meKbhljhDwAU}#kEhu1W^ldvT1OdNQzXys(R~oG%EfRKJX-gK zR{757V(^~Z1H9E1@8iIW8;6|Q1DK!uw0tbievW*9eV6%>l31Mm5W~YKjC>2@kh843 zkAl|gV)#C&2Q+SkMq^j7zYELozDEz>{xpJX_VCXWTzr=6Z*}x_%^O$r0PZ~=T)~_M zEPw8P^{|3mHHRr3ndZsL;cjCbxTCh@Di8NTWq5kN2XGg7aN~Ho*yHIe%hRqgJUv*1 zyJ*Z*)=t!eyPcRn@B5HxhdT$zGclyMPx(ZTraEXEDm&lSu|1CU%1xx)E-I&cn`RN4 zGN$mqb@#`=bhIH04Nq?DP&CI>mZyE-DbLUPj{Imp@y}y$odGUqpUs$!FvZ)Sc*y8WFPJ`O0-gYMbg4HoaE zz>BkgLwf-8NnpD8*4Y@z%-om7|9QVHwhL~|v5hfOp>KB24`;x2e2gsqZeT@zxP9rs z7q>48^52Q;tR21syi%Y3dtkNCscLGU#cyOquKn`93)?60Jd9`ZvJ(bIdV)=I^W$Hq z%{0f5oim+SKhZBseLcH&ypVQWP|5mSnfhPpqW+oGpW8|OFLzPDp86+sQvY*Z)SpWI zI_hixq1$_M46;*to^11F1zAk&0@iq79R#c&JWKsD^4PBn7{h_FkLXd%rZq*)-P2Cl zPpUhtT@3C5RzG0v?8DN!JnfyGL|f_}OFg$$cWCqNdv@ODA2QGKL4`-7)~e8zV6_6Pr5ILOeqZha)(gP;tq<$4?(w^>3%E_decXpzU7p_uyMT2MuznE1iq?$n z+}aYxJuk4gI7`3Ox0z`FErI`SCi1hD13Sp~hA!}31HNyA@AnpV9E>Ghz*q>3OMxMq z5m$df7xn*(`sb*AnLaVMi~3)p{ud=P@lXcFiCw@r4j40lu`}mL%E6e@1&oQnI06`- z7mPBpIH(I4`vGGVFcx(JW1lWy>;{Y>z$n)qyL3^%7xk+;slR=XF8V+7j~^t;x92-u z)PJ4&n>(rh=Pv61j`}ZkQvdlb>i>%RzwD&`&$_7pDD{8bN&N@9sQ&}%->v%n@Vx{0 z4aN?Sw078wQE%@8j=ooS190TG?`6-D@zaUIofO!RHTgRpHu&5 zoz#D*wQ1;*IPu z?2U^rZTykZnF{6cJtvJFvo*F%VA460H?okI&^Jm|-iuL!55BP}s19CC>U@J>j4qTX zo#UOk$KBNP;8K2O7CKFSGQwy4>pW`{y}J`m>4N_+!2jnB{~cqc8C}$!LS5a}I+-&b z~IN>HyXtSqqdW9*nUzsQ-lqs|(L7FBxc5bHySxwN0gt!u!<#u@qP>QkEztb5*35NQ!O7Xp0k$&!D>FY+ zmZoocydrNyTihD!)gDa?p-Jm8wa}n(ap^p0v!TPuynC|w59lzunNEhS%%$i|Rzp>4 zRjMjj)zCMUOZ5$My@Zc3Sf7Rjx9aCZl8x&1N2yf*7koB4C{ksU~ezk429>|O%dfh8uL%AE|{RnX~l%*|yT z@6p&kt-5snsVx6*KL#FjrNW-)`5WnA2;VFZGVlFH@A_2avVErJuq*F2GWP8Yy^2HM z<~;rcbghE2BPg4IMwR;mbw=_`em(gYwveatf7vav3#+x4g}f2)@jNg_03&V=XJbiu z$#Wg$cc=U|#!Z^n(m4v%HRl9@*(e&U&3lLYKRd+Pl&Jzvsq8)mp0TUbs*PRU5&7LA z8KL`5ez%c+Hp0DH`NC&(mH8>zskx#NdHlHq=k`V2)2lS_UHi-xZtXqB_PF-RAS1!Q zl7HR#P}Dw@yMQ|PTls06q4Q(LpW`P^;f`f1v*j9(XrE9e?KqNlY^9vjHO-xveKO>& z5e=jLZaRpRcE`I}enkCf|6xgl1+T59N@oQ-Ecw>eLjy_J8? znrCn1e+K{8^FNdSW&C?QtGyG$se3#7%XqG%?XipSR2yFZ9QtO@o2QW7B$H0%c9kAl z9g@D8XJTGGC;8sJ&dBRr{BPFr{cnEGwrZ~#u-BOHf9rb}`fe%lvfXQD zwcH4;*GKz(uaO;F7SYEz?&KEov%H_ezVSD;AI`p87VV8QaMXX)r^HJlU8}LZ=?k-H zGxvO|_?g67>?EDhN!M4JbSn3I${ZnEc`G8?kwTH0FzIf$rhUZo9LR6dGiR? z7J?z>IT#tXfUlPNwUm3EJ(8QDqYXW51)q2_<&q=AU#MLs(oPejcKWJGr*d`hZu$oI zQt;iBTm}7NkIwoAWuUF7Z`9B?d_IE3sT++?!seC6pGoF4wl8|de8)G&$CkBe>wgUW zz;ix!EosG~!kcI~)ZF7ZR_!aCC4RQj;AG5XeS3+YEsOIWaM1tEUErU88Q3v#;oFSw z3hReO{<|#P<-jc$7v4O$U~|94KK+uoa6^#UH=L!m^Wwr!v}YAR{9E9Tgw9f*w7v&4 zp6&6zYZ=}j=mFf5I^q2kkM|jIyeCJ6)g`?D)bf5ka5w+HBkx!CfW|S7cW)n;(F5%Z zM!)1IeSba1qkB*2*7$23wBX}9j7=MQKu;C)(2v*b$bP{}kERc}t6F35J7VNBxrm;k zxrDO%n|*|Jsu)=N8(6XX(8|Jk9#~(Cfwg-PtnT%zCxG=YJFZG__SM+F%&2gw(GhGP zeI!HMjkh{e5y^Ff&J@1DefRPyb;KEIzGs15S+4sN^7dEvl~`Zs{1NF5x=U7g62X2& zcgfanse3%JCGoiG=w1+&Rm^)WG`i=17aiWcB|DjPD)%a7O8f9e_}WoB^EKc^GT1Mi zS|WpgX#O90tc&RRKjF3B<8?#{ufG+3=1m%7cx8aM!@N!c4t><@0W)V6 z754fpMIQcq*`y+P-IL2}z`HtzwlO`B%X7f$%)WgUJQ^o0we6|?r}o^Xi0^G9v>Mazd!T<_hJwC$TB?rV#naFk*zul zxaIc8&iD8^-SSfv!_VDi@HX2sJlNd)zBKHj!F!y?&p%&^Z=>sa0QXSKk7<9+FVOb# z<^I{N!#%$CgD?5=---t8Nol`1uLm>?bi8@7MO;iV*rTJ$%J+WgDD?{`^nivf4@d2K zTN&9->;cSIEX+8WW~&Rj{~~jk(*1=oyzJQnyg##ebx&Fx?sXpSAAwu#`QC$B1`%bS#Gsvu?my1#=FUxiigo9Tp>#mwG_crH&@% z$7;&7@z0Ck7Ut_ZPYt&;xvcCCFtp$~3h&SodaCv@Br!`Bf#py5vu4JHO#BHo~* zGzLrd0PZh6xPm#Yq;Ea#@zw-yvM+Nzo?QHw=mG8@IJqLH6UwyLTa2}K)NWkw!Hu(9 zH+no>X?Z%pJ|PKlA(zZi=-8}8-+%=fEeVBP^tt)Iv@_%`pcD5S6Qp;Q6u5IbOLhS(#?nCn7uT@ppz-PIH)Mona|+;o9H66u)(qeZGn{3G%Z` z6XAB+p@sbHv_$x^o>>!-tU2Ggx(?XSE01*!$J>S6XxTm5sxC4NzF>jC@9loMHOx`^+SDADw_hrgV1-6-&;ywpcJ~KMp z_swXos*yRaifnX;v%$q$Y3@NYpI@(dCBi=-WX|8L^SHG1S!=uz{xRW`!e{4`Q|Q3i zCY{P14gR%jqrIw*7p-5oXV)+0M(bN^>|EHIL}pCUTv&3;y2-(oC6lvue0P`Nd-Gm1 zO*)ku4nFB%1#5NAzYQ_6b#Y+#Vxh;8fg9t`Dbr@3GQQeTpS{9^8)uL2*`?60Ze_kp z_IOH+9=_HC+)F*&W6SXLn;yVD&x0Gs(*lpDGc8X$$MCe;!(FU z&x2om*RAUuZ_{@%7L<;oND9H)1@&+q+E++WeKf0$qo3wmZ?_XbwY9Rn6zt34v* zS^Zp|2*wucXW!;yg1+fvYPU??n%GjY)z$w{`;*!GqWvrAQ+=aJPtEA#E& z{B@?nT$y8mwmo||Lr9<1C0oRNZ7&5yB8h>l0~+bc)r_XE8@JF)7+ z(<)YdG_P`1ZhqCOPgobvoF6nb&JUXQ1E=iGx{=tM%4ArxxYw$+^ZGVr=CcmjH@dgm zJ@?g`yz(iJ{G(^~I|RskPjr99v|7!LFAuU~b>E`dFUGy&`TRt3oN0&r8PJB*R=%;c zb!Wd!LwuQVEan5wJ27b6nPtWy5zH3KUL;YM=1p-m5a} z2NvO5tarA3v_79V-uif3Ev~lRtDkwtbGH&K65L&d+XI& zZ+|f}10CS`W8MwJ$E4aX+jPnMmu(sv3|)N+|9ZETcYE?K;N9Wm?H25|dWd}&Oy>Jv z+oo>{-d?<^eO~fe;R%8u%uI{mHXA8D}W3_fa7dz$XbTX3eYJ6a1nmI`8 zL&j!3e?KFK$XV`T9;WTEfVs!bcgeKut-uLweiH!mOhW+VE& zl5#81J<(D6t%XK(N%B1o`%zlIk^05`ZhUy3=$Z(f6Q`Sd$WJxt>AA7cpgEtS^2vk4 zyYzk%)dP383x5G#&0;;x3b^G$i3m|DlZR z&h|y_jQEeExV#MR_Blb$;db&zH%`{N+eO01`|O-(e@U(KD-&Uz@+X3K+sT{Q(>OLy zYx<9We zwgviB_WXX4og6D)O5P*DKjZ0qY-r@GzJCzyT?CUpDV-6_&FFg@bz52YvwMz=&aaH| z^`*4l5JT${?Y{!va%iarZyarAaLG^c!H$Fc0rwoNpS`-C%!lVfCG#~49- zGi9sOl#@MzUgMu7r;6r7BfFlQkk_v)d-o(q*N$q}r24VSH%#bI{&O+qhj_F&{Zsu! zrhw;$`_NTu>%J$wwPO&)TF07nDz_&xP@gMmLt>jgu)d2)RB`S|wH+{uo%&tc-HOdmSR<7X`V45Dq+U-EXO;jr+1Z$DfH-Mq`B`Tj3( zpMuWPc09WWH1_j&*E&_4Zl2TwxF4=A&-=$a74-5g&TDtzJ$qRA;}YH*EbkMb_v#ql z$Mk^4=b+K`%ZtkJKBxz9AM1qoCq3TpkK;XcczAIM@3ofq4}g1o4DWwuth}STd9BC$ zVP$yV)C0Jebi(^$kN5LRcu(sLTJz!I5hc90Hp@P9|0i&Fj^TZEc^cQ0j{Wf~Tg?7{ zkM|Fsi`V&^dI0xG4{n?do9yv_ApFZ7{|@}6{rF-Jcg&ndS-$oFzt*YToW>BFPCOXp zm(ClUX7Kp)21WB+W$}EvDzg3bow8@c5+1MbG0&#;@9#<0OFOR39p&-6eNo~2vb0xO z8vYCo=*)&hrY026`LTRo<{bMHw~#jyo9VB)zS_57cbWH^5gkGjeo7V zp32@3XfpE=x(oNTD30O4YV^D~SnvSjT}PjbGg>JpJx-*K(D=vb+9lBGo-da!+xb>x zS3l0AQ#r}=FwsJN!Ad5Z_sY(OmN}`W3$Q=(3EA1qQ3r{!x>KrU7Bt#-`j_1=Dl?P1 zr$#iVh`Cy3Ql9$BAlO+vHNr)OwsRsL-r%)Y_lWz{vTyZ zb-I~(fbEOicUZgE#{U7F9c|-zUK^iG8=uih8-Lr*O(gjK?hdzcrXZ6~e^_Ya-X(4P zBgv#DmHQ^Vm@^bHZTu0s=Gre?nH;Nj^4s}eyjMHF6IZT_w$AKmTW5~UxAoH=UmHx@ zGTx(orMru5ThEGV>(3Uob>WUSr(@_~e(x1|rl0&BT*eoBdpyh@u=O3+vEJ-c=*O=x zZ)4Vn)NknG~RpRw&Z5WdZx z4f^6$YM&Y42A1o;rafmUOEs2>?>>r-m4V%AV8^Zz zm9?$ka1e({?cOYWJl{weeamgKWUl!aVCfu}Xs^ml4%?*B`0fg7I9cS`p4+C|^1I~6)lbnW8qbe|k7SQXO_t?W%Q@=qO; zm&eoh7VO#v!+${@i>*9nLC=wrKmPNZKkBCZDVvvn@R>Zm`#pR=7JScFHkfoOHvxQm zgHQWjO@9ZL{Gs%#IfgIM)yDfgzUBhH+8w$SCcH70Yo12U4UVnWU zT*ki9PtO(YW%}#C7#Eg_<;(Wh?|HC4WbU*a?AMB5cTeAz0=t~PUERB2hZiy*INR!h z`k-_vXr2;Il^nhA4g7<9UFmYs*Uyw`L$zN<^EgQ}w`_by5*X@d zis{D)kJn#c5+3^Ny_6Ya>H0CU>B>GR?uqau@_O0Z!?UaKczXGS@ZcM+rHt&t&5}R9 zz*3?ZPDHlS=jLV$)7LreAx4-|5%Yo#?>Ocy(V|t+tmjylj#Syl(0Abu~^fe#oz6=H(5X1;$n&hxXL z*|dGpx(;*3?t9JsRYv#j;47gi+ULtyXxn4{cU2>JiKuL+@U~K~2;Mm29N_7$h8?w2 z7a&8Yqvrpi;3)GyJ6JgQHy!QlBglaMvfMw@-a!A18(V*=7cze+x{q^&=M!fuA9^L< zsb2o)$@gKG;l<#_F8T552HBfqI^iXbzGJ{A`=&YbgXkx^A0dw330}Ew~P-jshrFuXlEXPI;=cN8#7`^5Mj@UrO#k?mT9Y~toN z_v!)6pIex5?YzFK(9W8}RJ)uW(=OW>r|ziEWh~y~%JA~n9>84I2`|e%UY1y1_K)G^ zH$A|69(X-lP<9^ae2)gr0S{JxP|UY9>eF`JJ6bcMUmn6;G^P3%H|KOm5zR%hP}zQw zifAs}Ux5$E-%H``H=OFxtnbwwE}Dr&OuUMp$P#CM1^luHwR{s*dfv*oT5+uF7vG8D z!?#zeTSwp2J>Skg5F@SjVf>@8K9=u`E#T3(NoDinmSh$8*i@{REQQ~WTTGo}8QZ#k zSO=Z*DW5m8bMZ-Ge^5(5XyJX$0l|WEi0PJKH);>wDNKH`;qkdaP@Q}_$#A^p_bvTW zxyYteg_k2!jUV!PL9g)ZG2vn9XzhqqZ-4!0oZkwOk(LT9>kq;41bJEMp(R_3R_KG06S(R>?JeOv}jh zF|DK1$Fz-0AG3LU`k2=zq>p)HV)~fBPD&rsJ~7Az>_J;}H+GKa?E0!udS?EKzq9Kr zLvs&F@AM!u&pCj9&3jG@*o%`0lT|79#{>^3ZSFKePZQeHHj(>HpgDUsWzVK<(K|Dz zqG$HFJ%B$`TPA{?;g5NtcH!4viA^>}X>xlN7CQZP^QET$pU<9QjiaZeqW38yCo`UF zM88d)WRxe|;EMcF(9hgQVe}~3FI4?D?xB!g8+uax6uTK8vpX_z&v%PHZ=83cN%Q?L z$~;2*u?MtX^riUSFIhrg_WX$N)&C=U`se9+Z)Jg=wD5a-J`OPHRBj=-uZNx_beJ7!4TPUWUU&zIq;(b9gKrJ;_!AEtehyQ_~F9cythLUK?D zKe=}H2+EgY`*SVxDRXJ<)-3;l?la+?o@UPTbuzW|&nQvnX2t^~MT+Qu~-f`fMt1xIOL zhwb~kFVUO@b(aS{(PdB0^E^4fE4fZU&fJY6Ip1m0soa~Ckqovkddl{}hfE(d`!9*L zq)(I|lmAx_BY7!4)w_$iOG&&|B!?KiO{g945zbB|-F~{Nso0H*2a;9O z_^*5**l@$fU~uL=(`L|S{0A7|kzIQ;PXqnxjA ztmj;V%-;=0z-J7Mg3b;x`j|jxRW7hPn@To+FI$;h%{_M47&#+Hr?)M$6Re9R^7{f+ zZx47-n`iq)^8Lyl`7S(ludr}}>fofBn-UAo8DwLJU{HtH!NB8wj6(%)Ch%rP@ctrr zJdXp`Pw8u>TxLKxM&)KuZbnq@C6(j3mU2IG<(dbC`sRD~BFbG9m3v0zcpgf*AG&fu zbvQ)jW>aoR^9M6@MyUCSHRfmDfol3b=qjLAF z9M8EG?YCaz$~9Dn|5E-O%FT(&tuX0S?w^!{*NESAb@;aOy?uGNnRF`mI_19R%4Mp< zR^`tJ-uwvObtaw4y+XNjUAb&^_y^^mPr37>a#xykD)%Dg&UEFH1H<1c{}Rew5|#V9 zNvCp8QSOVbT*JWdm&%_-xmi)U3rsqd`x)iF5S7~yqz8siD1RR1=0)YsGHLezQEs{` zml+tYQU2MKJ3A_Ox=E*Ut0;H0E7v?Qyhr&{C^sc4S8vj(++CDAm~!oxSFO@MNPOhR z1h(|EQpWK0k%>yS#!=q^{Z1I#{vU zi`Fj`V)v}#cI^Lr?7yBz!Jq!S;>Fk`%9XK6Mf^m2SlzjT!dyft?%v?eXkNFYuiOw6 zZ2N`)+m4-;?IzCKBRo)TI+QjZ8qG8QahuZ2|NS5EV&rV&72<-ETw3j6XwR6KHCF@f zi0^0)rhR?zVzv)7_6eGZRq=JHTvk3={{!rQKjIzM2kt~Kvz4?9=N}rhMs1&u!#Qoi>3htsm>dj_eZRQxV9E^Un{9&< zUYRyvGysD;b6u?u+gVxUs?LDHmHnXiC%n*=>4ptcgtm) zG**k`gH3q#(oN8NgMq=jR^C~9*%N)-jnI1o^saXAU0vwq>;>&6dP`yc^ny*$Tn6Te zHzMyHhq<_6lg2o)__j4{n%WtSl0!0*gYNQcM;_A6?0E8JKeQ%A8QFmo-fllx@AN}w z?VfkrXDQc$&bE#Vn)t?CQ|mZv4SFIt1DX3S%xl>*w4Ic{U32Bcql!NZ=S~arF)j3k z)?vIK7SS~~icjmM=k2o?JI)N6mh#LxE$jbgkIPK6{xSoe?zzsaJD;aIJexK8S!wKO z)b1@a()7XT+=Oh<)(rMy8n~uKxOA6hW=HK%^B!S8*&XB~nGj3Y|Kt;;Q@N@}{-N=7 z>7d1-vy|P%(K-`3JA0SeGkjNYy)~~pO`7;$d{EZ3De}>C&A!0`t-p5{R~}D#ukdBT zwRTnfEH&v=ZiDc^kJeU_XqXt$@VIE;xtF7X_3Kg^R+phc-)QNQ2KGA^(GUy|-xAIV&@dsQ;Z~F89L!x- z4hMIn;oD_scw73~Ra^8gp&>myd`38#w_zRJw8hs+h z4mIH_;T#7I<02aV&7@Pg6^@1zJJK+t3=ONhL&J~~8qzi4)xv4#_oS1DnRF_*#L>{u zk%s-s(D3c<(6C1d4asD9ws6`xPth>gq>1Ys4HsA%y!(lIm7(FB?$EGz2@RQKc&u<* z8!j5&%PGzH-_np6LK~@%qD#8RH~8=2v(-=3rm__+itS@;g~o#A^z$5SMczInYr|2Z z!TL+l@SuL;I% z`pIng=lwF1PUZdpOx-ozemnJS+hlLG&&VjNyVNZ_Ba0gyog>3%1jEj|sLa<)n*J|3 zfmLb)FIM{s&+Wy&K;Ii{xeHw68(#oD4rg9Y&KFPyIjsp&Bg56g=X?_QPci9KZl%Q^ z=L=3QL&F)}p~3kAM?Ybcz>(XjISIGF}~nk#n3VO@QM0O zSNh=kjiVtuD%?*rIG+d&8$|>DvBuF5;|n&Fq2W*6p~3kAM?=GYVK33(d?GYFEE@2S zpWey8`d5rEc&H2w1g2ff!TAD5LohnrES%0KLc?;CPUZgWXo&Fz*Oj5+w(ij2e1W4O zJvv-3oX#gg!}%ti%Kg;QfDY-df5oi?R+de9c|L7+*OVz?1SR>jN^y2?&dGz(bg*)_>R=a?>4V-F3P4Z;kM9Cz0!K zE$(69)_AKh4vO~589a=WH13crve9@7+=aXpdB1BnbC-rrl`ZVm^X5VrN4BE3nmchk zsjTi!%5Ex&2gj$HRxqaU%bB|!qWdolFVsCsG^L1l=D|w^_iu<^^BocD-#~ro&JcLp z4Sg}NI?k=G@#a?7cyp^fj|+b<`FMJGg-NG!FCf!4=6_mi&}aId#*kktp|>!vW5?fW zbH>T7n(rK)R@}}U8skga{%qi7nJWyoowF&yTx9gzu&E;d{KZX``R5ZiRppN=0Qi-ufC%AJ&xT?Wb+}3tJ9J*SDvggmP1&D?^ z(KVDg$i;ii)_<_LdbXj-JolY#XwtK20B;AJS#Sd9{o5T*HxF+0LO6-j^j#vmR&UlJ zMuOMSoa8i>lLYKLm|d*bJhNXssoGP?7GGJjGT*85v{9^lnS2R7bo>#Ht0^Dc4q z$!(O?d}kyZ-J4Rm`r5o~-1&sUT7iitX>V_z&zjomLp!Y1X`W3mgY<#nH-UGg?5WGk z9vG&{^Y-~*?+ywVk#~?^uKA$wYvg(Re9*`7;R5o!eLmnAAD&AdJb5_Ahtj9L{Jhk` z;hE&AALMDt931{Td6H>9FE}LpB6GU>lyE~h>m2ANvNroBBs=PxIc5i^yD(%oUES@AqQ3OL#yiZTwP?N$+w>MTS@_j&r1yiF zLzkU;-R3t`1k6W8@7_m03-+qm9$>SZ)c4h|eo5Wd!Psn`1LobC(;CYf;Mkv&AK4Vw zzYG0FBQ-rahBiOJ#4Si_#mn zLNB_N^ULRDRTVtkZTh(rV2kLrV<^#Y_Ng$2`X@LGm)q{VfSqm$`w6cl(p7xRUVNXqO6MyMU|2olb$DkQ#J33{n{Mz!`gD02sYtS??d;#2^Un3qoGJJ+S&#x^H(np5BBG2<{%Y!WEY{~Qd z8aDH&@JaGKzXpz@!pF$-{2Dlp4j(4Z^J~O`M~C;5=lQkeLG#h!z2td*ZF!KK6s{o8 z^J~yIDZGr0_QKtY2FbSid&k<`rz%|L*?PXTKZi`TwS0I|G`#@N3Hx!7;IZ zZTlj-7HR!SD{*Vv$e?L+P0;kZ@iW-$S?C;o23s7hKh2EBb=n(i^7S5nW8T;BKP!5F zAMaVyGV60w80&r>d)7v}mHJx8!tT-5p9$}k?eb#p*(ROJZIP_-SH#YPw4Reh*Y~48 z8JOTpvc8lE&K%w{5*&8DDIi_jw_$jT=(S}`-X0CZRYuRrF+7h9wr5ACwghRYTwPB?aZb#m_T6QIAB@Tpw&xkdF7)Qe~ffSKmo(QdzZv>#Z0ECWxCj5${@ z9>A`cyYn){<@C*?YJSRHkic&woxx|n2(N;368JLA*~*X9a<^V1Ht|iK`(bbEwqLgC z>~}BQG&<h=S_=f4=6s`a~*!|Uw zqc)oo9!(o%@U@MjqczJnuvHnJmjYAmr2Z^;s!uyD zBYl)`E)&ji9v$#Lf;_=ZaGo+VE|oijH08~Bd?_cveX=XbUqM;ktwA@; zyO($;8R~vMbH^RJQ`jT=!)U%ZKMv`=D%-~1r>cPC-2tkc;8($qJ)S`ozh3-$KM-uW zcCz+JwGaoL16}RNuytu7GN`XxJOE|gBYvU5wyrWpSkywptw!L!*XfkWMk;8D7feKL|O^oQA>1i4+1 zN%kk`4R}YK({QBTN6$&~Y|04+Wn3M>pX1<>UlSzW(s;?$opKI!iFMj2C;c!yGnc9H z(-P{@M(@r=hm*+M>|Lg;+Q-mm`fY%&t8e_l&U4(IZv(;o#lg{Dv=!7*I;D0e?wPB& z2YDNOnMlU@eYwr+CI`(+CMz!euKeRG#D}lI6L>yr(y3f4@I=!<$ppAT|4OruN_9RG zeHM1mkO;3vziE^J?Pz%D!REwh61UBYSmEhuW&b zX8Mf$_7e0!yammP(5wm8Bv|{eGd!66mpnggdC+=PdwV5#x~HqH;4yMz4oJHBEO4?D z6S?ffIupO6>iXM27-sSno z(6*{KfqE0_*e}JI3E}7Yc(ekFi(8O=-1O+bNc}n+-4Y zW%vzfUXa{l@J2=0oBkq&0gPvx}VS@KGt6PYOmomer+`M#Y@KTihD z$H4P3$u-TBgEi^NjrM(z-YJ{~j11$7#u<@ZKG~*pDt8-lq0S(Jup!1~WOfRLb2#~# z`Oq?7J|TGbe}em9;hqWZnGx<+g`4Mv7WV>hH^Q&68_hd~`>Ooels`MN$6BMx@O+-i zC(|1<^Po$6rqvE}qUW;r4pVL`dKG)`uwayHhtp_(-kUh-v{dfnTcCmT3gm%p7@Hw) z74-a1W%GCOHVa;7MY6fsq*J*=t!&03o3&S=cY`Ym{+DlR3jet5ud}SX_HjHaIMOmN}W@qHkohIsa#*` zsBAvoioH|#1?&6moxU~nPuWJ#o)|ote&G**>&^gV=)WhKbSn1`c#!{_qkEsRoe9MU z!yKReL)n*qQyKnmQXOb@=M7RO&H5kjlfb0@5cvhcGkYVkKOgf=)Q)g>F>t3?xZe;Q z^r8j%(r4<&nl$_WE!>?17ntIuDzz(T4Ef%<>=ty2E+z}vH|p-fy}w)bXXS)~4FWD> zmP8_N^P0ipD! zkIM0Xtl(S%+)E<<-up!9NPi@^i=`Lb$Ns7NZie&@*!`%VhnebcV7_;A1oIHVTm;NT z5zIdeCeL4|j$k$b)7aLUL{p|_Nn~4>K{L-~`!w&$_G!T=*Qc+F;I4#b#RmA+jp%M} zw)nq`cXy?7ncIV$<|Z2T46o9UM#@}h^`p-6{9E`d@VtxR`BBUB2jcN^c)mR1Ib+hP z+%cBtk&+{HmeO&ErK9n7aDzX|m`U{LS$5`J_DbrV(Su}l_$R?#3ZA8uN0#3*Y4)86 z4m|z#BST^P4NC1i6)yg52E`OY}9# z`4!Q1FXiry=sew|IsXHFqRr?lG%b<*R>JQ}PhZJjF)iZR=^Z#8!<4=P>sSl(n}T6w8UW)Elji&17ADRz($^{I>lCZ6 zY9pS@>MQTc>Z@Rs(^vYq;I4$`yuQ-s?-i{-;oVPCxy&O$Zta{z)0f5TBdP6)Kg>NN zGcmP2;6KTHN3!4FHYS3zzaR9S%N)n0!!x53O^tKvnlhuKb2AOZV2wN*o#G79OM^@&$L zRyvitlsamwI?+EdYWILX*7yjxNKYYtTqYVx8yd3%!@ULTdSG2o8R|YQSUmqHu!ac^ zGRxe@d;L={Nk3A2Ay`aWpR8w_|E$Vo?qknXiHyG>zLBw^<0rN+B5TQ9eewPe=!=df z`r=2T0sA6bA(~d2G`>=Bfc*>P(1`5BLsfcE)EDW4jngQPe28(o=!-8$W6;W-3uDll zj(#*dZKqK2^d{Rjo}Z+jafYjg`4?!>zuCWP$2HP*vwxLw&0w!hveP&(mWsycP1NJt zUrj@hv44*25y89s3iiWu4+8TJ_&vociXFf?*vu7tl`<{l3*JgoeyVK!z%1~xmrre~ zNiiPKyaVrvJ60>+|1;&JUupC~`LC0|nfx|$Wgv6;E|0 zU6=a{?~|naL%SUlGIzXN_-(zPMEOZ|rri!V>AKuT%Bz0#J%pX@y4{Gp>|?+4g6(Vc z{I&U}$hKaqGAoO}DRMTj*Yf?aOl9%6P3Dq+_q>6je6(a&q4h=GPf%I4dMxjB7lF<< z$c7u)rdi)&e4n2eap#rY_dm8w=R4_DkEz`38)>eIc1`7HpoESlBCpt-1l{ zMh;Y2`wfx|W&fzMe1qg`lr?d{|4ZK#Y2;cXF~@!%aF;l0+R`TmE+%lvdvyFL6^nRaW~JKt`%TAs9jH8TO&6C&8!znbBB zu!Vg%uvegq`sRsgztleA&s4^KH%0CDUnV_0*PA*k;NQqDyN}_kbWYUQudB+@$=-hH zym&v)(y9Hw?i(o5uMV9SPi#k*};aY5Xnk#qas>%egSldSDxfx!|lxYopm&#{YjK zJ2)l(|BX2R&)CZBJIv0B)@S7ZTX>G-hyMphk^dJ>yf=HIiN(y?r2c0`K2g3#esu+Y zRnIp6SyOIkKD|t5)7#*`m3Ufl_Z5OWE&v`nKF-b)(Kj{&SLZSFvI%O9Z2odXB%6IC zi_yqtbR?VKY*jjyJIl((oIL^tYf{GVvu>4ZQQFek_Ah)4bO@e&i(-vDuG9#FYrVx) zAzaw=mI)EA2Zf7gwWr!a?L=37+kky>9}^ew7CLYJEdPI%wM+C={AORK}p@F?FXS}M{b z^S0-9@rv)*MZEU2I@dhX><_zIywXljiOxP%oY{?R!9^xLJy&gc9R;r~%#CKjBmZ#g zqmiAN3rx+K>b{FM3%i0n*~V`Hcd>>4kl^(Le!mF*X(l~Ax0UyKSwer_Hz!AhD^z9x zbp}i~viyQcPtUzYok*7IugSIA*f7D(>j*aNLU<~tBj2~O z`m^}NH#Az`@NJXk{GXMT_BTk@D}aZctydfNX5Oh-9?>23?Ue)bea5#z(vyJw-oF5L zwx)u0si~&_ebuC==K6t4eZB%et@+VMpv|nCEKYBfzEgig!20od${$vd%MP1r#!Om2 zR{u8eoA(b_3*KPh51xvxPS>Ae(o=KqQ%~tV;6-(1cg#8@|FYG>A)9q=$$C*l_t@|z z!5IqNp%L7aNl(rF*}~O%Q|U+)+YhvQ5zS4;#`XB_()9r0GV>Nwm_Gt;W{%o3^6!lr zuaa-*NskLJ0KY%?zPCxIa!r<=6Ge~awNC@aY4{q=Yo8iDmz`6fT-iAV!6>J9vze>m zz1l4^oArOuPI?8jBiFIYll(Qt)z~r5NAiI1GopJYvX~k9!#Dq>H2ePrV`A|h4Koh+ z@-$|NWOhI(91jWy@pdz^T0vTKQbt~U194yB!Ed`c@eRU*pOrpIFRGB2Wc|+alD-~0 z_w43d?ON8*0DX&mtz?iLoXSm#_%+{BQw(G1V4raXbhte!8OlBg9oZWEKjo!A><=5# zI35tj5qhwnP>JZ%m2InY4TFz!-qv{B|f||veW-=($jMv+qOFk8Jc)!TY^2|#qrLa zlxe@5b??ezpLVNcSxQURqa`>ve0?7A5cF%@Dq1R%2j}CVQ^k`P59xiPf$tR}pXq|l z|5DNE#Y5vwdV20T-b)9MgzlF0#6#eb-<$nNq|c37w=JbDc}PJ{sY625dxJRmb?9?( zlcABl*Yb_Re~_hPuJC$s(=H}GJ-6D@vAg8g1-=gL5*!-N6dW(M`shQYr{``0u5{bj zMjKmgU*zrKReV~59@zUY+554jwt8ah{z0Pyd@FD*Fpa#>50l6K>L;RA1$ca4tC76D{5D&HKOFKltSJv=w8F|IPh_ zUx4P$_76%1iR{Esy3z6e%gF8+86?e}K*e@~eW2K#Ax4hDQD%P6Jo7!0CVaSwJ@Ga~?V4KV!fM&?%CCtrCVO+EejlWd3NwOGN;t9Zof{yiqm_dlrnE&R0NBY$sQ-;%sS99w*T zDWkhn=nv4FYti|Fs?3GjL*(ZN>|4agZ_Hk2?B)X6|Kv!9$AmA54y$M4DQ(i+|7Up` z3{O6+nj?#0b4O{DftC48v@hQ47iM2PedJ^C3U+o7sGX8i!n-_K3-3%T>pxIV?WB35{Y&JFt`+f_0B#m}2FP;?d$f|^^W`ACt-P<` zeZHMDQ$iy@tCPZgfN-OeP2i5?6oi*3&-Q~1Wk#Ab_y15vbxP0c&|Vt?`mS(R@Lp~C zZ9?pGPevZC9>P7Sod?3bu`^->ZO`?lqO-TYeAG9upj>3r-FGnJ%PsCut`MvJ9oyu?l^sgZSKlE&f?a%mtDV00 zYDt{{Unf73m7Sx0p}!XJyiiid;K2rL>IBa(O6mmoJK_0tCwN+reTUd{L!a`oXNtX} z$fqdw%v6TM$SaCHxf_0W@`_?l_KOZA51UYk_p()CfAWfA&s49l4|zqgCwoRK$SaCH zgWlnG^u8$eWZ&ji@`_^5=HB7^%Vmr&&9l9GT{b6?>02iDjPy{tE19+OowXKz(vv&*eu#U% zo)|)Tf!3U*&pg-c!9MIy3wHn(WESOu0`S@`IscISUL{`sE6p)S9DOO!uA`IipQm(P)(;%=!Apk+z&mimC7 z>UN09cUT7OL4^0=RtEhg120~FTr!~D@3As4HbU)&95}ahlk_FFec@mF>tt|6?Je~Q ze$uN?#H0F3iA!GCv5&R%D=QGFOwgW?yeq~J`c^hx8p!`U?pwVN;=Ym zU5yO>ybQXKg}Kkp(*qMbp$GpNuLonT9yAr}LBW3+TL9i9_f)#)6WlZRuxF$F>rFL0 ze@FY=Wjp$_?>5?_Z=RoXWps}%^qVp~_jmcsn`LCzR9Ew!JZo$a>~~B3V#)2`V9@TQ z(_?O_ztpC6ZZsHoOZ|V_^sah;;4SqR*fe{Fh6D%SQh%;ZtL@W=-co;#P22Iopn_eq z`)_5t*uURu&wAs#qVHX3U%oGY(vkcJ7+Z3gUg)>} zwGO};tETpQ(e)0@AA>D2B$YX=XDW%%6ht$*ToXu3K+|2y%xLBB)yXDlAdk&r({^1FMWH4d}LW% z9=-b|`DU+|2S@t%bMmE&MexzX$H`}mT9hw+{1N%m#jb2Y8)r_PU+B~xB-!(YeE)b& zBf=i51Ww~eM^0s z_Ph+a%4RItAAiGdA!*r+!~wjg{Vpc0c3N@}@A)ktEt`=zg!i=9d8Ebnk_o)$_g|!~ z&A6dpGYaE!>F-+WgZUOuQ@THK2mjfLk!+W^IRw7ZaHi=4vNKUX-qrSrZM0cX6`U_R zfT#Vc-%$O4^SA0x6~`UBJ?MMp@FaUzgU4IG5d>#_zaaldqO*gZ5AC+jWcmIEw47jd z=4jC~5Blas^u578^(@aX@jgkLYd)a;Y+@j*H|kTe4blI`v zk`wRRu}fMTbvEf7;J1;szHLJyyPL5|`;jjgt!J}l!Tap{6`{Ue#T`4Gi;BKmC0XA7 z9&oW$+ZR1=_hx&xN#i5@H*;dEt$o^{djQ(Sn`fWyGil;a$->&FX6Ns)Re3vvO=|G$ zQ{E0?lW4=pp7ETwL)fQ`XP@#uvBW;957HNhRG`O8&|}g3mw!ZicdtN?6a19-NAjfK z73lL4^jUc?kvEXME70czKjpnZp7wQCpw~;#Yvnydp4#OK^g6*$dA}mBtR1rPkjfRw zFEunY_tRPXlA%pbll+J`jz@k){h(h5ecq7QXU?NbpJ|8fYDdXEL`Nc<=wff%*F61} zp5^_so_+sJnm)535$s`f`{r+}omsmw^r73(7(nlMOYc6=E8Q-Mle--srJXK7L%z+W zBTg51&bK*wk@DiBd>n+1Xv|{tj^`6xnGzkzpd*@ROpm&y{xI9-0lw-Go=qGy_LlmC zc@dI++)5I#1Bxm~S{*vpd$obSr z&c9<{dY0$)yqBC0fCk1!ru}p#HEOH942-cB#vX#<#XG+g3}T-jSr~Egju|(`#5*TZ z$BTEcE#Sg_3?SddJCRM{tR*(Y#XGY#*15M^@ecN6SooG`^z6y4CY{QCQ#}2DXipT6 zDAtkA-29IH{;189?kp!y_9R~p9a=`7?1{^hE`5tU*%Oy1omxVk={F7@y0w_Rj`qaH z2zGuT%^34a$|Z=y+&Dyemy@Ua)l5D%hjFU;PC*C18yBm~7ZLZmn7Th{r)Q<{wl|*M zkVx%qbZ^#<|H zW4;AH{s!M{S4=HkugdJBa}HzGe~f?RzMRJyn`9YR`)eDLb<2d3y2;^DT^o~Usk_S7 zEyM$!?<LoMHux!vbsWQtu*_CpsWU!G6s zZ=bQtS@->Mp1@p0Udfvg!7@zsq+vTKRVG&hgM1(BGbY+v+%T zLDFUA{hGYIj-zkN{|x2R`2Dpd<(2nDOnHqZ1N!MBCFPa(U`%=GY?^rC-jedlTM<)U zPptR4uwA$Bx5|&5*68O^waq*}cn;(OrCzWe+xbdzr;MU;0XH z+d`}=y&P)NjQ=g($>41Tp1}ucB*jQZlXee!q?epdfHU!Ci!(qk_AwOVbpy?^?Gw1nH za612)-HHAO9`$3>FZHZ`?B)n~HvLlh^xgbC0?#M7y7Xh_uJf_hcVq)p-t}WW(~r~W z#xar$w$Ru_XfCyh>d(z@wcmPJ7v+hysazurbU z=eNt1Q$M|qavl4nwW;#A*edz2fP1~yn6@dj)#*zj*JWbTe;_n^KG<8aG`gOl5`{m=4jj{OFC9ZUQY}H+nrd=$Z z%N6%{^_nF=-kEkm9(tC&JMW|RlQou8e^M-@e_|l>@A|FUwy^Kj>a~rz(X%x{YIL}c z{q#6VV6!zaHXdaTZ^176EY;%VaNf2wW9TYaKmNe>f!kzZipx4LoLP;Ap z*!a@N;dIjAD5-x*shn*b>eErGpN0YME6sI1IoDyQYpp?B-xNA*pa?C3CaQ7SitGL8J3K9C+02IyGk z<%(S6%TrCPcE9%4^ZY%^CFv9F!5PwMVFZ~m;Rkx(PWkq!xfJg+COtKG9p!^0XB0lE z$YnkOmd+@A6g}(Q!rD2UD;O}7z1kJ4gKd0w5ZhnNw*ni_hv)MZCni>BcsB3JH+KsG zCo`M6%%Q9p@VSn4i7^{Zj7eRd^L2@N4GrbaIJ{qxTLEmX0cGCjyo%)JX#S_Ac_w&g z3GeYmcqc*IuwWRzt77$DqEj?ZqwEZoJ+7$iQM}(X*wd8V!$ z%Jy4dM79_4y%EufpE;`LJCR-Zs?A$S8Fb>^ zT@~jhqkGR*P}kJqdl;%C{ZL$=qCHliH|AYte`5!dc27y|mO9S&Cm#PuZ9Ao|X~pe~ zCn)3!9{+~A zt%(hZtuG7ztr6}cE$%Ge-Ol4~7-w+T`f}hNlC>kbQ)DS}xG_c!nW)a)adOCxi>2dH z(ZO9MD@Jl(33AY#Ba%b&5bVBdlQid#kng8Uc_%-Ne+h^IGBwaMjNi~i(~8+uVdFgL zx~Piti`;u%+D4fO#$}?7aafUzvU~%qJ`(v<<6kS~)bLZ@Z;0sAkWLYbU-V zAo_l9=|e{&`UWRVjFRE|$Bh%9ZCZ@XIBTT3r^d-F;2e=pSCX+_GH5zSbPa|szN0Le z9Yt&>nPspid73f@8MqHyn$|g*_|E!TzGdGy7y(`3$i1BxUO=X%G0OUyqIY z?7`4gxq2$F8G8(AQxs<5T@>{Zs#4#kunJ69gL?jgLTQrEf~F1c&UAp*uJv^8b`gLZ{Y6lpkac3EMf_ zlX(T7{z~N2?=$JCx$jaI-LJpv|6%Xk!T4HHSD`2WPgNja_VSZ8vHC3Ep#>|K#qn)4V zgce6sbm)j9IKcgV*M6L{@6A1-{e5Pp{?W9XbKJ|R>Bhe?%e6269KtDh8sZU1B zU;meVYA#FqXFmRsX!%8-?#p8yD>7T(_ivj2&*y%7SKjA-hi_AT_jXO>%yX$@4beh_{1 zvLEDM_P;0BM*{RD?c8MY~Iy(6LS64+aI~?uktVd-;?V@ zk*7!UFIzT@TrrXBqgpOxoHp{~$D_ly?CZnNHf`$-TQA$1|GNJ@xgN-}uMY+GHTK*0 zM>qZX*Iyp{x!)?S1*r!t;@2n_XhUm z4Sym!viln^kA0=G>}y?MUy&;xjz&tq`106SPnLb90{a^K?at_?jxWDF_H|E|ef0$P zHS*!Dm%c20*V-)Gx+k!$k>5SRzOygCJhs)IWm{_l+bWyIH(Px#lWnzT*;adCTW#|h zgZ}axFOO~Am1SG4j&0rhVAT8W-i*F0W4yX6sB^D?apC6AWz@OM1!T-+ob~4djC0e< z_H2%he9Md>-Fl89X#%hKP_vi1eGOMc77O!=XqZg)n#Uq7YoU`1fJ- zWj(RO-y^yUx$0moTe-L~4YHt0RenjLO9)2Lo%`my;bJ~t~F=N-Fzs@b6u@{kV zc=5y0wjb@!tv{!YM?UpXwCvPpa?5AzTFE#1k?5vJ%zWSIZ*0=dH_*@B@TAnS(M^oJ zH`SnIy77i#(!$Gc2k$4Xck$L}+b4`Y&N1r~S6-tl@|f1P@T1YTFYM7e z%_Xm?Px6>n_KC-%n~s`!RxWvs%{@ul;fHoc$Ig92>o%9XX8oz;{pv@fo1S_~*MBZ~ zP1_ZD$Nui2XymtMo{&pkQ@Eb^8eqD}o`0(&t1jmSG(y)#<&XJ65Fn@e6}lOk{19Zy8Z-uc;Z{hD^8 z)VOo z+j+*~)vV85JZJAZdp&zP@Gm`g z3H~JT;%6GWgm2`bx9{LK;X{-6_j%k4DY!`Q8=GZ*!r7K;pFxCpc?W+R??1lD`wvMQ z;ZAg9d99+GVbT$I6#A>r-u?YN_At0Oq33QL&2J_7h@VP)U6e^=QQr*--!|S2^S)Zi zcsBCFLGlxxk`9?ZdKGcC@(y3#NfXC63Lnjz%=r!)uitN=FY#^u=#SHny%~SFN(=8< z_@Ujj>YcfyHN2G%F39UU@~yp;;i{F9r}N1p58oYohtAAds13bj{r@mJrK61AD`)>Io^3E1Hgon_dk-Y~zM~=NmrBm?}$q7%<<0gEj zDt||h;-{6kJY=wPN;w`zR_%}c_HKPT>Q#Kq%0{Sjv02fX*Z?+jwbdKH^Uv0N-^KenRk)@Ja4U1; zByaI+zg&5XFa71pTl({tA#dH@?RPlAcYdn9U&X$plE}Rs?4K;>8?~!X-kkHyi8A>f zv~B*-1K7_(=?AGt6*n?}=zYZDn-Aj3ZXDV`+#EM<_{O1r;_R6diZ-%fsE4>&Zo0Mw zL+>Vzel6fPvS27d+#B3D@1~(P;$+XOFUzKzhVCNHo;jiN7`tg`1#$Au$WK>x^Uynp zll@nI-0;mqb;Mo8d#g4%f5x15c9n^Ry zypi1Jouwa`?(g%Fu~66X!XY`+WbBfB_K)iKZ0fu&et!e`xi^9HoH=vJIk!0><$8eq zQ;dI%MW0uEI1{bxQ~DiaIb($2+54n$`J4fkC+7pw7hNl~z|Tsa7nA43dVkM5)HClP z!HZ2xohrU%ZykCNEeQn|FP|9#zR_A?IgcZ}-aFNYcta zdnE^ZyXAeToilkR{zz85*riG@d`K^QC$-+*I@B+6Fc*_EC4{%9p3BbMn_Y%Yi-$S| zCv!LY)-uw*PCavWvR{U8sWChKE$4h~>PW^!t>3o|-9}m|OBwo=xJlmIh6Lshzs=Y0 zKfafID7QLuB0cHM(R789O`SQx?`1}|PZ|B@86J_gw-1#mnK<*3GmMAH_k{XByz>gcLY~4-RJYSJRjv*c#G}r+Ntf0IeCkXw|gGi%g= z^!S8&=KOEc=hD}Z$mZzlV?4Y15;^iX$4T_HOwxwv>wdvG`g$+VRxhHjl^4?22={sz zeJvJV=0HOncX7szyF1=aag9PL0TOO<)U^JU_>?(oI=G#-0p&W{nrzCvuwmL{8`G%jOH; z2LfB2!}C#|B`?w0w4IKPnfMGF_vGkIHYWze!eq^D_E$#m~EVs9xw_ ze-UlDTJ<+)&dGE28L^-AZG~#>GWOQOr_10sc1z*Y=^G25{!`>i-~TGwVdlBDKbLY< zaG#E8&p+k)7|+k&SogH#mp^>5t_P1hEhiOx{z;Qw`ix7-&-PiuL&gL}!~K_5Zz?@{ z^F-#0k@@0k)n}>uKKcDdc!=H}6}?TOuQ)4r%4VJ;KO%WPAK1r!Bg6B=nY|`k^2+3F zqe-9NAUO1Q)kYcHybL@0lHeZj{IY(Y=c7CeZ?T6D?QrdZc*>Mv4{cNYa@`}mDAzAU z_tPlXG+nMo)pPZkpMjThp^q7&lRS?zbLa>BeQML0yH98SaNFS15%vzs{^+Ya+D?mn z1zN8!JR{#WQx9q^lX3U9I<*Hfva#&pY?|MZA9eA9>>sk}#;}D=$RM^LvWPAGk?8rx z%sihH9Z*(xUs;)qJ>1o3>v66r@0X-}mr&kIba~&Yo~zG%!IW3#gl_)wTlUY}u~=l1 zGDXB6fnBQdfxr5f+<|dRo%T}zBa8>q`7z?8P04p_l6PK&GjC{v zBOAc0wlcmi{jK1x3EIjFJRjv*_=}DI<91yxHIF0SpU1V)C(HOi+4l+$;Ek$o^<5Vc zX#e#r@r;e7rmpXnx`wYmPmH{F=vtxS4uqrT4upRa8h&2`P5QRUPuD?{O9y`|c{)1y zmdJf2>#o~so_@3Vw}4_3zU_-{X)jhsu71`FuMquwQE-laJ}3D&`uU*IPfXey@yF2r z^W?4SeiQwY(a}A^2Oa%F%4g;SqN7LEbLE+zftNNn!{|u*siTHZ#JhAz?wcLsehE7t zdr&=Bp7|HyD`l1TfxhIo?78L4Z8gW$_H6HsxWJmQ^!4FuLhfBVPhJ^o!pLPqXNbEI znf>+Erpty-5tp$h9J_4j--*ju6PC>w`UPsektG=;cOA&GS-A`uN(Ri zaT#mEk=G6VfH)aXeObKAhrUN##+q=`%x&&pct`{-@T2 zzh6(?{Wq@(KZeW~ToZEEhS=WtGq8=1a4vn_Tkt2co{{f*k6jsg`ls}J$KJxXG;{eD zl>SB5Ib!1x&Xf46%%kz|$yps`@Li*xx&IegSYy)%UpsUZx;*w&s^=!2;U&+u4^#1c zzxO?KBE0SM+u)IrCUW!8K}kbfQfYWzK$=bJzQZn{*U=tSUH`uz%KpBb<6qbwKUQ&YbwhxpfiiY&*-?|JC*;h}u8 zlPZpKfz`VGqLV&xw1dkx|Z-@N(Y9=I9l$^dq&c7*VNH#G_5)Vo8PxWtM1V> z>w%-|Xq(il#63sdJ;^h6tmjJRPQ87^$rw1snwWCEa8%}?CVenBc+=1>$+;u1Ub&9;ehmb*ds`1g>tEBq|{mrxe z&N;$gUIgy}e^=ghyc_&ds@4YdtR1B@aQx&>Xe z4b_cV2;%35#LvqeUz#gg_}|o3S+!(&R?b2Eyo{WK`1v96H-^M72#LQbBc5}MB77SV z!KNb2XCka2B3#@X;T=(=m@u0#pKuF7{wjI~l5wxQr{C-C>+J6L`a2R{drwzyGSQ## z5`BF=eO^~0m5QxRc%9t}+nrc%63-!{8~i_SWoNRpd%aiD(b?;@BvSp}lAc&!+-pws z-IwU|{B$>ncuu}uv0ksghg`aP`Zmn*Dq`JQnx6JVBF=M1qWvDPy0foqU92x5S*pJ~ z5^=Ag=RR-#t=_y_7Tq|1(Yys-MOBM8zjQuRBA0(}ES2(B$5Nf`UO!T$yq+~)b<@&v zFV-FRRu7~un59>2bN47ns*p{#W#ts>i}iP|#+v#!EV2Zc zMZedVh{bIkq`WnKJzc6M=Xg!YL@br?272Q$%yx}qEG-?Kq%;vhCb8a5%g8HMMY`T2 zVQ06^J(=*?G>xqDvFnQiS@l$H0D$kzuu>}^-oKbN}gg3qB4<;ZSd-vmw3^{+RjveqEFet zyhZh$sjgUmd&kvYT~AMMF}xOecl7m8-_+mw5^WsvQ)My#C8odeC8l5S64Os<*7{pB zkW6k+9g#FI>4wG^7(IFYopigD#HvLlt?pb8Ra2}Vt#s?AF-6DGVpN>1CbIFAwv=_3 zE?jRFpOM^)_at-`8qG$ffuTbPoNCh%y5=&=p{jViXev{kW$7ILgXR32N^dQ_H4cDBc``ADQscjuALHSIm!YdY6@iT;jKZ=<)iFVQQ%896q3UTobx-gWOaL)5JK z-XC9Q$Rdl(4>~3F%jaWxT-Vv1==ZKO9B1F>T{mz3Eh5yMdDoF9j5BL!^;c9nUokGy z>>0O2$^pj8wO(_7Pp_w&j8+a5Dozi1i@bV`G{!w@jf zZ&{gx>eR^GzMh``xo9#qcfA^SXSesSp4&dq*O%z-Z(S`TZ!5#`J*l~|o}zebZ`_pU zrO`zqO+D)ps<82%b=_Vpne^hZb_~I(%FV>xEPjt$pLRv}OBi|DBb5YTp z`D-+T7AIAo@WR%+;nToOqbEL)Of2%;B!mH@lwx&W)3*Gt;m3o`G)B zo0_k*cQ8FlB)vqpG#`vlSq(+bEr%|%R6YH9V7UE(a%_dES(|j`x)}~I`p@x}Gp6>6 z0kn(xF<_|&kD5{u3@@pEqY2+m1ha@FhH-ZMnl&1cTV4@B)s_`2vSfqI-=wwm%Sf(g zq|!9Hd)CeITGSZ2Ms16&oE=hpz>7|%G-Lq9+;05y!Jsr;`l%8L-Y~z`Tssi;T)+$JR(R%*ZrF7@l zsrHztbFC~Jx|mbX@#^Su7a5_05nAlWAD$yv?&?nTXZYIg$ypaDzB*ZM)=HFSv<4#? zGFhJl{M)5}Q8{Rd1HCA|79Gl2^-uII*}Qvul1X7}4 z7VC|B*iaU|u@OCY_l;AJp&ogPy=NMb(k^`6>64yWn$%iT*nt{9WAXMX)i>71QulcC zN|#!*^NQ7aLCd|NsH6Ay`3t}9_nNf>$f&OiIlviPm%n`iq zfv(le`n{s$KrqkHk+ODIiLlOOT$JzAD{QBL#Csor^v* zrA=u0*aBuV8ZSpyO2f$Van+K|OH6(|zZ?`+IMQ3bz0B5n;-Wlp>zGd5;ivHd+S0|< zvMaWRG1O{MnD{)bJUP<2$s)`SRliZ&D5VJGqLmFKqn3IiuM>X_*U?rYG`o_Q`du++fi#`uxn z)3Qn*=8MRYd-~6hk+pZP%#9LQJn4%I$&#orSE3)k@pl3LA3OL0yM5Y+b4Euwe zrKjAS66G3w=M1Ux`Iir_8>u#G5_a_z>tR{J%w>-|`HW#J!TZ zS9*)Z^6%SiYJ4CSbWg0?2D)*`DIbhVrd;3c$xfu0x(yTTnF1H!|+GjN$K@|Not z2@^0-6BJ$s^mo!2oyB$kK(CUoQ+VSXsoJ}>FM2fEgR@wO9wRIYHng} zDQA?tGEk0Ey;MRKU6K`x5}CR!)=<@OkX4R4nm8vJgpw(tbuH((am&R8aICsuEe67~1>SlK;Z z?bRfby=s_i)_xPafMxOSw#roJdt|&nk(iZKqwtcmracpY%H&_w_DX z8z1QGTGYQt*6-PV^5(i`EZMvXGolR-^W&z7 z%KS}Pim4izwJOmZe+Qy5M~EkBDQgD0mGf6yQti^(1~v$)KRch#vOJ3IC`i|+UIM3N z#$G}NUeBbT!VfU-<2@qIFFY8$rJu*UI*dYBgZ5EMMuA+)zrC8pi?|tSVX8y)I@bhm zPZ@6#>v{D?PkV>>#rykc8T!ov1xUszP-i#YO)PG`l95QYI4Y}gRkQXqy=T2xl6C}G zYcuJ@&6^`_yi=UoI_>OUZP|L; zTx2w{ninig1kJp*Pd!H>OM80at2ZS4^9TG>(+Z78p6ZLVD^pt`PnsX{~74BdtBEw%M5Zd&UbD>YY}Uv+J? z{*Ll!RqKkXXmf32gN<*liV_pVI`Oq+->|%XNmbOyC;9t)TB@3L52fW=vb?!fN9pI< z`tqe!D#ps9%aE@cxR=~~L8Ev@Ah?^s^j%-T?t!=J=AHjRrW zUh0q4qR_Q0hqM0k`80@7NLF6Q_IR5wifpZpme*Ig>EV+rUieFVOSE?BQmV`69};iV zmseIQ@x^*DEvbNts=B&y^cPC!^TPlem$o*S*EiMWlDj+vZ|N%;##%&}3h$ij;G3$VwT;T?`zlrcd-@JT@BZH9Y zd~(Ix^p(`Q5jrD%cDzdORFD?dh-dSe059~~mRjqos_i^M+oiRc0HfoL{(@-o5k6XP zPPB>7p&ye-)74j%H!qJ?RR$H26_28VI??)b@++@sS&pd$>ND{spZcnX z7K7CFPN+ireW#rNdM8Bl6UhH@CD_)YS_A z+9oY$RYUobI_bO`T9?)?wf1q<3o8Z7m1B;?9boA!g#mtEK4CTSk5oUm+#89Zx2{zP$N% ztuSK`MjkibSY zhDrvG6;!Q_uc)#0qw2YwA)%r%8f6r9<&Wlwm-MzW8BiPV$fzP+j*0M!9z$!cuWgpG z({wJX35tATM=cZJL+DN04W;+-A@qz6HIzM+-p4mZ8<#Tlw8}OtNso;ov3^qeZM=h; z3G_=_tX+W~tzLsMv!$wDwGqKoqtp7PK$YgXY6VS6Qug`IKC9rOn4Ip*r zZs%S)pIq@G*E^P%`~8W?<3017_LY^b`t!j4-~U%BEXy`Pp*N)M5mf3A2*-&7uD$gQfgs|c%~T=9~gAtS1~ zcz*??`R9t4^kT=2%Nf)B1(QynD_+v8p_B$%^^WCL4HYaOjQ(@Q2kDz?%9~B|&qzN$ zzP@~=$wT2{STwolj-$irPxQKNEfDidXt*P#ycY^%bL-bod$ZlD@WK86zsV z@`eUoLAHLz$4mMZRrK*qHH|H1)nxUNE8b5Zt*WkyqCTY(&40=AC=D&B1>qyS1o#!Y$nt4igyx6mn#dd>6zFhIbN6YQbfZg(B#;bgnGnHWu zs{1Wn4kc%fcu8;8`9X3cPp)`LFLIhn_2;e2n<{0t_@eoLZtH)_! zm!p!OS~r`St)q{naBb$<=4+p&Jo4KerEPtM#oKj@%)2cg;Txovb+$o?+DyJ;f9lc5 zmHlj`w&|NI%Js6}q<5bsKY4Cduaa9?!#A_G*4!<9MP)NW)GEJ$TzR901&FRxQh9kGMj=GGOpQCZ(fR=OOn{_7eM z-qQF8Q(jqbjq}+Ad}ycWRX=O{s-co#J}8j6UTEY`x654dQf}3cWf17} zx#Iow<#kIN@mbZVJe>4d@seJ3!n7~#lhg7@yj6$m7nAbkikI}NoT~fO`MJ+3A7>h_ z7t%VNJ3Y7YlD@i*!9mUXbUOE0@Y0_c+ciEWoh~e1?76A7sfy{aKMxi@x#CqhWkH!i zpzWbDB%Y$<_iL@KH1_4sZ|Z1oZav%ioD*-$V`)@!_^{Y6kE-rP8iZhj`jHrXp^RBU zyvUs^UijPjL~~P>TD4fa%M~x_Z^xOytjDp8>Q>WV`>tc(m0`*!bS8~6km`B~i+9_P z(Btyd#W(H3eHMIEV_i9>t^KB1&w^L;I7#ICQA6StzvV0sS)eX)`cu(kQ;v8^Z+wp8 zI$&X?>qFA#ikI}(#~2W3edLOl^xBSsdTze6p`s?**iidUTOv)LD_-bp%A=LJ{OmZq zSc&1(@Ez#3YPDUvei12;`>gHI#$@!LIsHu{hv`P8jaIedDyuT>LfWVDRhVHt@XZG8 zHw-U)U0nA1S>&DwFZ6UN8TREq3%;VUZh5^LiM2fLvnp4Wv^SgtzJ=>_O*!KA5ax;$ z)T@~%$#>th;0k8{Y7ilT<~I@E$XUlkS-e3;5?|hN@k(yvS5tmE)kqj^l_re*p?Ik= zntW^Z@&=Wkoq+l?vnom9yHSu|y>If-_Qeza67hf9cw-OB|7qjs@d8Jvwlg1P%@sO7 zPAc5*jjX3N3$F$Q_r-@Uug^mpr1PR92R>usodb{GG{dQ+RFsv@RH$z@rk;H{^n^V? zXO~mt%=yA2M|o}M5;QJlSAJfiH~)o37QMeT$ci8L;vok<<3&SO`NuiTv+#P3BhD&! zajWDO`we7QlcyJx&b%BWAGJ=f9F);3zUuv&ADtzS>bU5|YJ&6`a^%2^S}i-L<1-Ah z>^bNdef)U(+J?%il|Fua{uANF<{1us2HE+mHo??%x$@%Ld9j$8ax+sAP30B0SJ~GL z+4idBSDy9>;^2sRY1nDyPiGyV#J~{Aa{P3&H`rvhe#@U1FshfO* zaO^+BVVyan^pT3>EF%USx* zfzQx;Afxf*WzpxrhtM}iad9`XIjCoKsz*-uu=S8(4*|c>^qKsbfZ*2%I@WCY#^YH> zs!m4wbY|J|s?e$nk#zk!@35COGYHq<$Fu7|k#{1zWu_+U%`zx1Sq|6Qcd9w4V^>Vh z>vAXZ{`dK=+o!GXV5oEiDgEdrC%rB=cNg= z9G_0P1uqLT+WzfE-#)Ecfcc9jrH2gr$brw0Q{fw{tBK5MUpep@^!^KutadI7saE$z zMHXHbX3CeIGk(6cE5DqQUbUzk=_MWtD}RQ3(t-QVY?+9J=+*aFX5q&O> zt+eymEW36388v;VMzM-hR(-tKbgq{(Cm-to%&HIH`DBV=^lG(3A4NITo~xQW9DmP5 z_y8yE%yn={9$ER1b4+FFsXW@G7s6S3apL{_GAbZszV0V}5qMmoE#)F$4!NZrxQju5 zE}T_9H;w6Ud=XT`vJ1v6I)7o9r4QAAM61|l;lCfrXrDRoett?njkOuY((S=-4gApk zrtip+g2G|k`pkasRc&_mTKk#A56-uYOd%8!&j}jgyY$tq*@M*$l3A+hjAbg4NWx`&< zR|sDve2p+d_!i-B2!BTyC486gPlSIaJWKcy;U|QngkyxC5q?4V72zb|H-!HroFSYg zqzUCzKH866O&&j}|8|4#T1!fy$u3I9bnPsq!UL<$HO6Q&YgO_)x&jBq*Oj|ejf zR}tP!C?XUS-a?o|m`7MZxP`EY@HRpjp@L9Ls3z1A8VMZC8CgzPNw|yfE<%hDC#)sB zo6tr0vw}#Z7nma4N7z8vNVuQy0m7dU9wdB}@NvQrVJqP=!V`oYgki#G2!BfW9AOXP z&k27)_$$Ib!e0}4}?Pmk>mTo9}xb9aD?!$gy#r9B^)RGlJIN7 z3xrby?s<>=o^Xy3p%a)yxQH-?P)N9ha4F$+gewSF65d3(nlOuS9pMJTY(gpFM#9a6 zTM3H^w-J^Qst7fN+X)SXcMw_#BJ(TZ6&<`{123Nq+(A2hC*f{F8=;-BhR{h!5_$-I zgaN{O!g~qtBfOumneZXPM+hGyY#}^Mc$DxsVLRbdgijMbOV~~L0^v)9FBA3>zC!pa z;cJ8u!nX*2L-;$wDB-(=e(eqLpV!F z6Y}Y2UPYKpm_~RF;kASrgx3?^KzJj;BV0qcmT*0xgfN#dpKudlA>plrw-d?RZkyskdHOYtRpg70_zkBD^y-#f-q9rnwudUfoo9PHL( zJ^7%WKt(l%|<7N2HVQ>&QN$ zqz0~w@kws?+DP9(cPj^1bf!8IqQZzeJ*BHt9TFtZ;JYQAd}q~55<8FA70*|p@{QVr zUk7SQ`Cwa)qLlAQUlaxD=fC~hd66n*P*PXs`^ZI8<-{yoeE(cTCtX)uQg~~q67!K9 z7q4wK{{1L3=ebk1WzA8Q9V431AIvDQ?FI^dWlOv~lC6FFB#DoT!2;iGrHanvdgzK@)kpM1@n zh^M^!dXoKeC~}hXKIHT=j6YlPDv5)3@@wjy-x|P6`9FT zw1U$3Dpa2@Bb8lF*RT%bP()aJsrtYaU0yF`{{N=;D?qV%5qzp9)O@o!|I3tMk+)7A z4NGBGt6qrHt5oNbcK$>I{&_cA9gZBi&x;AlD|p-su5Fa;H2hwA)Vb&?pL z()wrB1|kLL)j49xl2@O%<#UiDiq~`AZIIrSH>D5jVQrA(+!7IOdH3p^m_Xi?oB-p+ zf@3)4%t{U`G(DRB99y3UsoNL!&HyQ24x2MrjEQq|695cxJTYtL2I4`#U7H{~1c9NbfII23>ro0t>H znE(^;Q7xiEPo2~;KQYxoD)BSu`2OB8JKc~RzO=8PLj6K+45^M}94 zVGje9IkeX<3{#H$7RyNm_h{w7D4B$nKf>w=RjxokmQGGmeQ~r>ek*@J#{sVGTpQyw zN)CuK>j>xk59#x;j;3w@D{RC&z!;WI?{;`ElA?ho4Xng&d03OGn_$ zGWA(GQ#l7hrlLLFb9>gTQKuzKq4+cPRjW@9>U@trbcwqVE$G3HDHF>Sf8 zL+psl0CbVmzZc|Z)*rRpu+W{7c@alxkIPmsT%|(PL|th-^NI&4Z7|yy*N@8GB&yy` zrym$uiqlJ2f&UDh}YqjCB8_7ICLTD^Kv zd;6kze36`4ul^yQ<#A5g(MJk)F}XJtXU{yM#HJ%D>ga$ble1`MLTt$7-oFHM8Z)P6tCdvs04!@&$8L)#I$e+vc27Jg%SfPdg4$ zXPpfzBU+$eGaC-_OC^%}P8Oem5Cr-XJLKeXZV_RQ4a#h0$#4)!2NCIy-(zI>ZnpVs>SapOS9m7X0=eu;H-+l zy%L>WGILXS=P<8IdOJDvEE~Z}O49pN1NUq2!xIN?CG_?66Tj2 zGS-`tSihd#GTPsgfh})4zPYtA=1y8x-*PRUQxl~+n7uFu>FM+FQM{nR1sQA)GdWt9 z05P8Jv-ODOuF82&A*aZLK(XVJ3M>D<6Y1o$20s~s)rACN*yE5&eUS#g#S8n&VB|Et zL|{(=C#T<$tF6@Ocx!ss#>Bva^kRSaaGwxu-FRW=__KlwrHgXymhuJlc*!1$j;*!# z^lpH^IRmcR+`MIDsJlC+H1+kYomaIT7B@ zZdN(=4lg+_lC$mCsAf-N&}Tsk6D1s+1AWSQ=E0L_H)c=UV>q+t=qaapaGjQvA9ojr z5z0%ZV78DHUCJMLnJD<@&ILJ0esEJtlQR%kCu8mR@ajWNDdY`C*zty{pULDi{%w%V zXmA+J@v8e0sK#j4*DIZU)pSSrZWv!=LAs&NefVK%NWoyPywDN_asoS`87~pS!N;dgam3b|z*v+n+6G zm)oUsmf9krOt5KDndJ&e@2^U;7NyR7mE~Vxl*pdR7wkk@=JGUFT5@tKr@@vg(;G)` z3{vz4w_yD2Ne*;%2U%y*u`&hwQnJoPFIh{znwzc|JGROI>S)b28 zre0q;*ZdFjd`xCla!#&#&n{JE)`R-YWrlKAg|bUQU$&_ZE|%`1+`PA76q6Sps}r2f zt2a@+7PPqVt=Po(_8_1+p!=8RAq$yS;(b&|`*wVbb$xLLc8XEZwrrDw+Jl9w8 zrUKX;CANw$1X>!W+I^a(zD+ajjC4zVo{K9Y^rCBlt!6m_^wCRe6oOIFfyz?<@1hKg@X}S0}6Mr?khH zd$ckmj0cf>kU3a?E{Rkn^AGdB>v#ny(>{yx(@GkRmv@*DF$ist3w3zAEV~6|!Z!ue z1Iw0BS;^b3PVJ{HQWugG^_CP@G&d<hL$)4xQnSM2Z)(++Fp7C8^^F1HurFT}%>qSx|P%S{*Rovrpxus2WlymRT-+UK&C zSTmPB-O-bsj8(RTr|Hi=<>zUhe>MCPi0fkoPdUX;?mIDWH5P(?AXXf=6xMKz0x z>K7F?dqteqbj}iRi!QnGLPh&#izpOLd9|?7nl0Ykzf9ch@jl! ze{DwR;sDCr3nM!%#;22!+TSr_hwB{a;1{~PCMRE9jjA=&%Dl8&kns>*=)gv zq-qwg>WZN$SYqdz4KjhWo_=k!dI0e6^$zkEy)W0-pv!BASh8JqecMaI_?V!$zVfD4 z*=WIomr} z2zj^MatreC=#*Ptd05r&E!|iE>Y!%QgZh8 zD5t#c&!zmbdDF~tC<8h!_B$}!A9vj+@n*6!P7hA&>0-x;Wj4OKIQF3QM`|?VRLqom z==I2_#}#r_GL36*LLZd!#aX-D+cnVM@nXthtUJ31L5@m(l}hTC>xsEWP^p(M@?;94 z1)fqBAT&!EQANWkt$)>Z3I}d>voD=ZU8uaV9eOMMzS*}%{JkodKpLGyW>I*L`sfWa zv=cI?MMQ0@6YC`Z(7Gy>%icyjJ%Fk^_YJP%7^xDnN zFRS(ab;R3cn!f5zOXJdK+JUJybN!vI1=@K9^61+GyI*@i+2t%&RHAQ{iQ8@}jg1tE z6EBc(cE!wJK6mpQUb#>B5A;|v=~xK=ccFcvJ^AD&GlxJtXLB=MEU+$I%d_u zWRR#kh*^Tjx{7Wsu15^r+_JdqZMTM_F0U!9$=>vk`Yq!z zD;Qs8XNKKrQQOE=NWH)hw(#6IUu|3R-S*f5J7;_3x-bx-LyCJeqT)nthDk;6MF~vHpRad*M3}Gs=g;NdvuhX=KDmaurGz&?k|w(A=#@P zDdyV>{2l6A@*)=VW_Nq06ug(fFP4%2e-u)9iUU_50HDb6Y`%K7>t}9$LVOCr5uf7pUWUZ;{=|np1y@&R3pE z?RCreXo_m|##eql+%NxPm4=*|cJ|*yU(4n)wc(O?C0Qo^cKx|nB$xhpdC5@9y~a88 zr*vGgfz6L8UlDv2Bhl=ux2whM@|ZIT)D%Cix61f^m&|zoKkZ*mQ(&H>Kg7n6kvF3} z7B3$#YxKBwp~|C*e zT6M5dvtG{C3iM1{q~?4*1}lb1Sr4d*wUk@-Jq7ux>AgwD%h9z1vVYtjlOpt;e2mqX zRNT}$!Lm>>x{;iVQpJ@y zJI1=sZuQ}W>3^CB*uI!b@quEJ<09l;LoQ328aey97yhY!b<->B{y)%lKj%B~ijVcT z9Hiv<_1-sEzWf>BJ9GbsH+!`=w~y1g=Ca=*HCMkOn9Y|nb60lqqI!Kr%aS?L{mov( z5l~6f-~&5m#>eDWeNW^$e%d4*qh26LSEX0xzE=`|7-C^xLYm_%7tTFM+}GKT%UixS z5mr(Z!-S8B_1hSIP??@rW~Wc&{CbA>={XD9o17ExUoB_kx_so@M%k06I$LpMW_j!+ z=P98C+Mj5PJU6u=HCMkBpUc+XHJxi^TM9*-Ek&GbvP#WO^>(UxMqgLFQ?{Z=+m*jS z-*Uu*YLswDa%!I)Zu$%biP`(E~TN+`Aw0HTI=~XP81(Tu|{@3 zXtJ(*!sIm`(=Z;&z2nGR=~TQcops$9DXIGqqcwHuz1@3BI-jczAkcHDma`-_`pPA@ zFLQgB^2*c4uJB)P8-f<9-)Wyp=G6nKxt*Oo#zNHZMOuIK<3;hg@>)k{>)3^A6Y}QK zw+s33UOk{*-+81e75|R<6yLQgyCcJLP#Z_gjM{PuOeE0L#Q9nu6{f6qJE*;hENF~m zs(mXC^0L7H`tTqMZxBV8>^j5Jh(^6vbTW(&+q1mJ@lXJ8M z&NEQjhsmbK4~2LtRV7{F~>OUT zvVB^g7=_K^jWM4*+Wl~)imS6;SLfuYv7~2Rw}%8?(R|MKD4KmUM_IzKYlUi-(q8p> zjQY`EPfLE}L@$z^nI8Y`dM=BzNG$yZ)=P1;=!&yVug~v+$`QvWg7rEhN6zQ876Kd=`#2u$9E{DNPF{J;~y6Trf|&!r15C*Rg{=@Q_xv2*D&;wh5CxA&{;T6cc z7JA@jU>&fd1A5?g;2>}xa1Zb>a1=PX6MEocVBsGjC$I!K2&@B+0F%J2@5T;*CxK4^ z3+_3WJ_KA0JPF(kocspPSx%ly7XxPj7Xw>>Ex?ss=n=TR`&@b(aIly91J1Y?I|3dD z%Hhk=8@Bfw$cs)2Lq5#a81*a7e~Ffx<)_3!~61C{~n z-UA_2fuG3FR&lD3V0T{ z5xD(Z$P3(e0R01dzm5KZM}Tta$AZ5hU*Jh#8F2C6A~$d!a1(I)LF5KT{tmf;ga1hT z1$KOwa=)4O`aQ}Goc?{v4Ll5t1HHrN(wl)v;4a{H-~r&we}*2|4=lKb`xO2!^uWp^ z&;#SZIPi)eLl5i+?gDNF9sth#3G~1R{}uXK)HiSzaNij8!0AV!2Mz)^1CIlD0cSlA zJ#Z877;yJ7=!;1AQ|N)G{tbFy)6bv>)*Xi)xEr_&xa;T81J44F0oVTm`fI5-;4EO> zFQEtS0>**f3Fv_vfxCdu0uKNe{0e&D7GMFFtsDo=0+#(6df;|o9C#YI8QAjg&;wV# z06p-?e?Skc{0;Pc3^@v%1w09?1nxQoJ+SV#&;xe^cL9(8C-m}s8hYTtGtjdU^Z4(f z2R5CB9$0e@df+bLX5jYo&;w5c4*&<#&;w^g&Zi4*ARTZPa6#VrbS3a9U>sPIe?Gk# zxEZ($SUl-``T%ef@ECAb0rYP{KfqZ)?^VzP*8}6gnHND1><8`wjsOn;Cr^eRI6MXV z68KJq9{3cn61Z?0^uQ6|W?)Sr^uR;F1Hi)9Ko5KnSTGxVxdeLPR$wLYG%ybAoen+l zAaECO|7)QKUU4b(z%9T6KH@nJoCWN?40_;cU>vyja_E6$uZJGE`3mTPM}WtGoBjxT zHrGE3oCR!p1N6Y%z&LR48=(hoeiQV-1y?~2Y`GeGVEoO{v#{8D4fMc*SS-wcSt<&LEu5)ZlKqEK7A0l7kC`FxaE9$ z@<4xLuUG*+aOEB6(|drUz(c^TE6=A-0#Dp|K0W@D%z(HU?u(a)bdMofj;9g)!?0ot#a6j-Aux|DF^o&Kw4O{>`25bSIYKI;;7Ka|V zFabSqGw?7lvIcr!6L7{`u@~S1;N-Q?1KWW8z$3t|zy%%91NQ(A0}DE#2R;a#u^2ml zH}t?ZU<>eBU_Wr>JtV=z&{+Gj2n^`=AF_ zu7e&p0_+D~u^xKhR^VRX_6_IL&jODFPXmkJb3T1V8T!1R`UY+UJ_u}jKlTFL3p@xc zcmR6=t^!UjM?b(~V993e1-J{?0Xz$Q5IFoN&;w5c4+6J;5PIM#;N&IL_lKYdo&?qa zw>}6x@C5KdV8@4{2Ob8F0#|Y_tucW;KOMuD8pa*USCV~5bgTTYUJ;1_k&;y?Zo&fHB9QrEy zhbN#19tPF{>plrRa2PlUyka}_z)|2RaPm&*fi<6kz8d+5p$G2y4D`SQpF5vk4=nrq z`Sdp6!Y`ap?*pFtBJB-0>r1pZ;40wsrO5FV?F~5g<@4z#;P6+@r+b0Pub)qE0UifF z1uXpr^uPrp&;t(xr`I6IGtdK10_Aer(r;le!089D7vM_Z9^h8s0pKyGUz+s#m4c1@AzA7p2p)fCU#r58MKb19we^9(ZgD^uXS!&;!o`j{%>Z27MIy z3ZVxscn$Qxjlei?_!8)Wh0~!2ZUY_wwpvv`xEXi= zxC?j)xKHB$D4l*5SUNMEJ`J2+lup;RFy8|vfroENr?&woFCsng^xM+uBfy2XrPF7D zSCpmGGnZ2iU>R_Kc{<$&+*3(@z!O#J^lsqd+H`spSXh@%p90p^r_(c5(BCzr(+hwz z8`J3);4EN=!~-`17XY^a7Xxcp+&_gPENZ;y~96wfm0%3tH{DA+k^$;0_I zKl$^QxVEM<>7wU%97H=(G9C{e;8Bk7>S76_oF& z-dQ!^mvZbf}dH6-%aDEi(FAht~mHQ@Ji>V{x%xC2hC>i zv*xir1ESBS9aDEsS@Q7Y{6~yoh|YI|i{E%Iy^r5k=Se4zgW%7C?{)C+bntSQVBG@N zg6IJHwjG5#r{y>51j2tZb=7-QIDIkr5%8uAs?KZ~gkJ6n+=ef4Q0HH|EqKB{YmPzVP}2$tKV4laNXA1A6fQj?PE3DmOftnMAauNw^vO1MgFU=TKeOk z{OHKP{NEow`_Di4{$XifVmGsB3kNFkAMqPGrq_Uw_{GE@Cf+mg)y7U+h(AL7Sskx* z^~XjoDYx7qwyz4mjmE2fpv%E;1>aK5y4<1faqxS=p9b$~ys|g99UL}zxs%eb>(6Nh zlK(02n`@!hc$I(t2Lt?!SAoCXw`ZkS*Pa)E-wVD}=db9OIr6oDKLCD}#w+^e4!$3J zqz*r`#w+=&9Q;=BXD6WF3x44Q^oPMO0DnmHSNiXB_@4rQYy$cj7txf@gXs^{4dLi;H9Q{=~_`~2=f=`>?;+X(@O9u1YyEDST)yK2c{|^q*QZ7dJw~o1%~{ffwSo1L$2;&% zYaXf%R5*384SWgsg&MDHpw8fhW*_)U@HK|M$@D#ki0>zUi$k~C&`l@qB=}?C<+uC^ zuYxJqJ8`8FLI1YQ@R~{dY2pik~D3k zIor&;1#_(F;2PvTmLDEPqHP z5d3cNBfPU}5{_mL;r7V~!Jh;lckp+(<(K?d`8rm8w$-ulpUfD!9lYE<4SzKU$v2Za z!54!+c6WH6Qv?18_$@krWv|xmguVlO-Mg5-xctooM(_^`|5o1y$Bikw!Jh)Z-{Eh^ zOwsv4@LSpfolD#i;x=c+og{9(6DN5WP!sgerzz@cJ+sT+;3wVQkNzzGv46|o_S5{w zkL5q{eEuh&%l9WL?mR{07=_=luJCf40AJ9PyBs20;j0<9!9RPcl4ts)y#@3Hx<4xh zx9J1ex!aEO%YFN-0iS%p@2_+j9sBD5zZraoFf?PDyJmP0{3!TAjn{pNnLtX}c7tEI znRka8ulmbX4*!GTw}6+s*De2i(_xA&90$MqPk47G^!!P^oF#7h2U(|Rn(6POw4#R@ zz|+JxUCsmj;iONz%GX0Fze;w5&y%Ge-UvPksg>hSBWE2^z2FamFO#`1YqcrmJ08v3 z`AD9s^R0PXAI^K^6M2sgkX9^DfZI zFJbcYh#LdH;7NaueDad=9q03Qp3CcX#;Sr#Xe*>?adQr#|DaZ4`gIw(-F40zbIR*Qr0=u5`+9kTi!$ zvr@~Tc(gb&90y`woY`82n-I%6^Rf-tFLPz?c4Mc>W#W zJHVfG{y_lSEC{K7xO{+XMSzdx2vYRyvvrO3F4G{bxRb*R#_S%xZG7zMxTi_AIn z7^3j9h{OaG{sj1Ke@+>7J?K8(6jJyXzLxg?l)vs!I&{|^CEz>09Im4}@LMOqC&7<^ zFC{OlV|U#!2>uZGO&YKAH$$Y7e-HT5zX;dyDEJQWleG?&-(gZ2`a=Oyz7yb^zQVp2 zU4E^f-atQv^n0iGQL}?;0K=$pYtWb9|Z4d`iyZx=m!lx*E~q@ zd%%}|m3H9DZ#oyjkAmO$*Wvk}0KX6XVV%FyZ_1Is@G|=F{o(p80ly3UMu*;Q19jjd zUklGa34Ss7#jgC!6|H>^f?xUdaQZ#qw}LNr>G7Uf`cd%PzY)G}IRU*DfL{ncwEn?w1;5I%4|m<41b=7({2=(kzX_+`1HNVg{3!U% z;6uv~e*XmcLdN@36YwtqU&{WOu=3S`PfmbOg5M3k!0n&Sf@&r@8w5Ydew@wPzIFfH z8rb(9@F)L1d=51Ve&Kh*$LSN`hr!Qs>Sw9j{$G!MfZyxj-Ttiv{K8T8DLMEKhrSN{ z2>3AlB*C8rZ|2#$e2yP`5d6%4WIvMIzPp|BgWvyM`cD^cCfcIEQNbSy$Da`V_x$!h zZjDpO-!{(TS;7@_CaqZhU{=~lbfS-AUeU}=q#_#-i&^|`N%YM2r`#1sq>;(A2D_N`l zB%Hnk{OAPuI`9krHJm;Pe)|OYLGT4*;q!w%;Ju^a_BRTCBlytrgFgm-vtxgzdsXwp zLX=$dT(}RV1pFZQ^$xwe2CV~s418$)gP-|4`;#@j>L1?g+CTV{;8!{P-SKk|_>yDc z`HzC%3_dLX6X5rQ57STK8}W<&G#p<7UiMY)*W;I-KYcN6?5iws?bkTb$U2e) zzkq#~VeMxS{66qu^6vqEasv8M@cr!D45L2*eh>Kdj(*+xD|{37_sekl67Y+`7wWaU zey{nAQ-1KpzxMt9s(rfe9g^Um1^<+j|GVA#2jB7Uj9>2jzI!M}4Pe@A$9q{0pz9eSi{|E)VQ83BKiAc>gvCehc`p{P%#LaXvi%QSf!(!{|?dKQsY- z;hUL1rNik2Ct$*+bz>nrd#J{2Em*$1E>i@v^=CKb9G?-k~*e-C`&we%n0JH(;H`xxFc4(9FrXx^m9Ci#1TN=dWj4Y_$p z9!=o)gWt$++s55BR4@1|t_;`l7Vu5rw`zK&BX6!-(+!`j#(@Fg?ZW9iVlWBf_* z8z;a|zm9eUKFkJ6!56$Sw~cz_*#!PU@MXFW^nLaD_1al4Y5GaC>rL!$xx^lNkLLS$G4ek=Ge`i+v-{Ht0utDyq>xQA2#1y41WFf><6Z-*4Ewm&MNSgH%w4|@EgI0^~c-6?*<>% zmiB`$cnkZjo&4Q*;zz(Q03XKxEciC?Vg1F-8|bgVht=O=@W;T1$+rr8SxGqkM)2#w zuXp5k$BXUY4^2S7AN=Im;p6cU@W~1AXN5obu>N%BThQ;EaQPO4Uj=@XBftB;W)=AT z;7wnq+OXS~Z3JIBH(Wp4!FPZk*8Ei)ci$`S2Y(#=ZU^uBBaeXZEe$W8^ig} zoXva+d>H@5;P*~IzY6?`3Gf@i&sxB~d8ZG*-d%ZNYVT0Ko-xg&&h~>} z%=cnp?ehrue(WfgRfi|PQMELM)0}lJ@VfO{#o#o zP5JCTviqGeXqYtnZw>FmM!+8jUj{$=VD(PXxYYRuf%zu*$&2{LNRNXfuPxuPEq~`@ zdXLGY`CA{!e`IU^qYvjl_KEy$L-~(y$$#RZ{7-&7f6}#i<2M|L&PwMp|9QJ#CN; zY_g)FVRckgk`MzdYfw>%;w~zQsHmu{i-s6fRLr75MT73B7%_?AdrzIWdT!t8Np_!o zzUTY?xc$uBTlYPuPMtbcb?Q{z+qd2EO$+E}K|ii_IuzJZzjJ(0qd>`@0ex2(->E>_ z&Kd4C_!iJlgWjU~jn4?usZ0KSpv!mehHCR;pf`hF%I1>4AM`z-59RY}8?eU@`cOW( z0rc4mhAzJa^d#uJUG;Ov@EOqiUnc(+(5EyFoqr$bdqE$v{-B?Jnf(2rcP$(`f9*`P z59mYb-vIjLMMLLr0ev;-rR*PqO){V#06nSpDa2jwXF0Zl$5}kIU)~RT4D{35M|2;O z54cJj9|wKPQp6>0Is+4-p9B5e>+yXnrRzG~wNF+z3-ewx{D$gi`k;Fsb~fl?(6?)T zjXn9$jmU2U{opdJ6W#J%&${J7Z(A|6{H>sGc^UeC(2s(?$1R@|pQ*pdf5Xu7&xw4{ zhss}f9o8tV_#UFx-#lyOe!h4%=(V8Fb=ilHTAA3q4fH85lRpo-eD8Ir{98ev3;I!) zd~Tx{`TIdX4f;tJy~j0g90z?DzCSxu{&S!=-!`-lsGE&_OwfB>^4)RSY|u};_+6&{|=;EFa)_}eX^z-1g{@(5h*8$oHdT$JS0zst*A01`dcpLBuofxC8 zd>o>>{sVm~=Xm`n3L_uL6Cj*ysT0^Lh)hv61hNjZc7n5cIstH|@f&);J+x=RvRCP&#&&EKn=96mH`hT*$4ax@D{~Q zo6i48CCsAVj}x8tf#)1}nv}=reLT<9q3bCbo-ol2v{vT zR0wqWJ`;4)eS`TQ85{h*Y9ad122a!5u`Wj1ex$r+;PZeFWv?XYt2dUmm*npQeFDDU z&Dcl#EMuR^pv(9Do8O7=&1#=D;}*}2Hh!cgh;81dYH)kQ)bTj@4!#THTlqGY?P%CJ zBd9AIDd!yMp?4Sd;SQDUn7i`^Zo~<_?ndMXeX@=nes3!H9tlf@J{$By_Z9rB(bMgp z+dxllF8F6dxBht^^5;RH@=xfSYUBREj>~plY94@{u=UmVzv_WY9<1Ls{-KLMdeOsm z!5=>T^Pky=UZsLk{(j_N-G}cVYyB8wHk!dL@{fbQvlOMR^ z!OOQzdMNbKi4R{Ee8eMP^4GlBN~%`IJosg z!TYxaANXMK!4Cwty+8O+U+|;v3qJhbVDQ<&A-S=~VaPlGAojhrzS?Jl4;XudP~K_K z=YF)%uXf=(otuI?-xUnLK^Gb_7OHQ;ob)ihL#{Fk-}^NEYjZI8&XE%r{QPMhhte14 zf`9dnLK~PE%}8KBqzN`#1`NZ_tSRKG4s80&}I( zHLm1jDfGRdAKp_Kx5oFm_s@@lzUEV?hdaOP`N*@NcYV5W|HZi6M~R%xNs%SgGCpq~MKwyS*i_tN%) z{^HBfkAhyicj)|QL7)6G^qSY9UxPlB|DFo^sz--z-)7M3KU;_^jeXqrcaoqtgD!1p z?c<)C`aoX-`YENG_IH0rX)oy2pDV~W{l_i;DCqM*XZxA_?)Ezi`X11GRldpZj%#af z0byU^-h#>Re$Ia?=v|=SO{`Hg*wo__(o{9h5%x%~jY z#344@3;KkAL;c<3hXxS(QP5lV7vgH8zdNoz3;Jo$hbq4&jJ4?(hSq;7=##&Q_q%BM z#{xTEweynT0y9FS{ASSWzf|ZyI=)@cHzq-!dthk!eW34t8Tww(Yac7jtHyqIUN!Xx z{V3?6BKzqBl0rW#^v4V93f0fGuBd6m`1|reye8w{9g|K4z4jpD0+ny<8{`9|rv9MU zeWkFrH}c*0-;$uO0ez_c(Fgib&=0D7)z1}|>;=8+YpB1{X@9kVsXyqGzdm&Sv!EaP zMj^g5^4<3fYUX2a26T~CYJ5%w{p`!+Zw7tBH%sT2STPBDJ?J$eA0H`aBd}UvCxW=J z&kXEWrz`Ybpda}b#-y9ROX(6P9|FDM2z*Ah$-kwhamP0TJHM{qCpr|^`nACQUkyC) zmB51s1KYkFcOM$W}rM~YjW!5dgJa!ECL6L?|rk~mGYKd>34SM;L z*k2fH=(_?RsoOek{{3Sg81rCl*+Q-$V6?hst)|R~CFyEeUGwxk#S%)BJb8zQ`x0FAHf=c?e}0! z!1j2sRlv5pFextyYzwev5ypPSuOFFq?gRbc5cCkT>;?S{=&RIrg%~yX)PP+?wEyuf z;9J1AfNufc0=@-&3-}iBE#O>_!jUj;9J1AfNufc0=@-&3-}iBE#O>_!jUj;9J1AfNufc0=@-&3-}iBE#O>_!jUj;9J1A zfNufc0=@-&3-}iBE#O>_!jUj;9J1AfNufc0=@-&3-}iBE#O>_!jUj;9J1AfNufc0=@-&3-}iBE#O)L&k@ke0-; za=orFsN?La(d$ZHS6Arua9)3p`i|grJfMynMX5Dt`|Il+~8MLr#I< zIOHg+t!e?S;{AXsCYXAT_#^Pz$}gpXSAGcT%Ev0^A?;M21ykkY!}GWZI^|1n8ulLG zn~)fO9TFp*fPg^(svZ`7K7dp}4#91LJuleD1d~H>uV7VzeNiwu1P=*zg<#(mOb)^0 zIE?ryu-dA>P81z}hr+7bBujUinGzR=qUtI&_R`r~GM= zCx_r<;A0=dVM0}9p!!`%RR2g=s{<;sx&mBP!vZR^dY6!Z{*v(Iq0a z`lQfmlveMQPX{p|hu~&m>y;cI7EBJo?Sefa*e3*&Lr_|{YMo$@3nqu)VZoZ9L;3dw zlSA-?V4oE}Q6M0PptMKTTcxVc2_}c2gUf(4U2wRhJ|d|)NqtgMmr3f&lA0o^CnPmX zQexKNJV}W;f{P^eprl$P^%+UMNm5^vR7_G&Nh&3&-$<%gQZGpAok&$&f}tb(u5b85CMu^>gV5m7^iD>h!R$B0Dn4 zP+wpxm0ci=ycGP-$PeNe7Q(28;^`a4<#i`aQ7eQvE$TgK3_I_mg>cI8I#~{3VahV7%A6C{D41#3&y)BMjs$yP{D_;79#-buG+zi9@Wwlp&z6e|kShW7dv(R?;250hCI* z!tPF!fCCdSC_sgAU~`cQ$RRjiFyp|Q1(QSYcEOATTO*hpf^QSdI56>( z0pl$H5h- z19Av{ABWM#fmOnRO##<%abWOYrk=yaf5CkjiNklHEO@U^;Z#0c{05wtbpPt%;=JIy zgaY4nLd44Yba1aA|}_^yaxatI~_GrlV)m>h!l3TAxQ zeS*m$_#wfJ?~o@CHeJQ&MqB$(B|?hC%Shk`jvse<3Nc zMDSTj&6Ct$B-J9R3zCXS3Zujc^h!#mzd)a)E|t_SNxcTCO7UHlmyH#(sPC$rD3+`e z-&Hwj^h~6Y5Z_gK@7Ntk*Vb14XT=9_P2XjbqTeq^>=aae*JmYP^@nf}(Db*_PPOD0 zin*?Gs-;wE9dm7cSLM&83si~ksyscc9cf6C@pr~@RykuP7*`PRj_Sa6rvaSe0|M_oB; z9Eic`PT8niE?Ih!z!>=Amz=<8XT+rHrQ<-p!I4whWM{;P*NrF}g&uj8K`JgrzSoYp zX~c~qgrRbz>vAr3E~~}?n1?OZYEmkMQ7FR#fu-XD$TNHrB+URaVqBnX)QAyA+N5eB z)tF3^s;u~tQy^^uSVxTsK<^P{6JI^Cc07g@^+N1fJ1$^Epd67fhWeRe5j+%%Abs3; zWrzO4URMqkUN>R{bks@-co9XC=i=F}I&Kb(2+GDNOzKuB=;pcQ5@E5ngO0S_f6Kns zewD?BuJRhX+M08iHRo_OUgb>%lMiX&%7TFhs)3GBCAJ+kVB67N>(v%pZ_IS(mP>4R zc+DjuAzXjA?5CR^ciVVRfAjRVF;4AxH;?m1t*82)r-~ZXO?zhrfV{eH=%+ zY7pts!R10R2WME&E-=bo7r0{575ID2q^l-fb;XoP!2t4R!78HPhI2{LX7erzY8wCR z@&Awb---Xv;@=cE+^kY$#tF>9At=5xD6@Up9g>RSP~MG0h2hI0RXGcJrPOP1E?Fv= zC_N}{$T5dIk&s-iIG4WiE!r+#%VrXrK7B@RLoOE2v3eqp|LeIYx?Yl z=?zZANOW@P_I1%%EE`GW(yohCG@Egf=~QRP9AsG1@nNb;YvE zn1KukmGXKVlo-uBD_a-7A+n$~vZ%Rnab)?5$jXJSZH+72A}f|hT2?MxxU8iuGJk2? zK%uFe5s;rbYi_6~l}mJ{;xSj%EMzoA9p^;E95d&zDsxejmnpGz>Eh*$&89#x?}C{# zy}LD`Y2C?0KA((Fi>G3VXbRWSwTYXPnK`pV(>g=bR?G@b%jIJ?ccyxfd0Gd~b8noM zNF@`gI4-;6+0OX1Xfins`^0FnR6YkZo9=9CxyLfHBT(vvo;xb za#6MrEKx8PcCAbcMedGg(@rWPxpH?87#$4;G#1ab3u;WtUZag|dXN}e#7mcEcPSK5 z)Nf)*Co&(M+d*$Joz>N+;^`Dh%5TWTU#^{&EnU2_v29^-&*+_Xz3G6alSxlB3Q2F% zZVp69(wD6b25N|&Sm-U+&2qB2_??mV97aX7GZ$H#a8c)i5ltS+M>_|yCsOS2%S~VB zC>)?iMLDsb6Ir?fV->9(>B*tzMq(!G258U`&Gcc5U2G}vK^E2=-=l_{IUn@Jq(>NnQom7095j_n)V+N*! zJS=1<3@_Qt0zJ7b_}Y^_vA8Pb$hgT(??OG%!SZlB`P9Ib_Lmy+A2E{*HziMx38eCZdN;MR#(}%((L4l zn4v#qh{Waw!-E*guuL!Pgt(|>*yZXi$zNW0KElNgZbShUVK-#bW!S^9&ri6CWloh- z>bZk5girQ)g<}3;j(zT-7$5G~=Oc>o5stNFF<#@GVsulCk92GxT8xi!Y&#U=SbT9a zs2Hzx4*q7o8#3uKXN+_Hd?|daW1nAfXDV~XIrh1gV!X~N^&CZ+bCGj|&y^JOU+mcD zO^WgHPD^m18#3uK>{FbmDuv7HVDP8Ru}|3))5^>$wiuJEGH1eI(BRU?2Y5uOP?zCM#zd5<%?bS-g$}EqCy^ zQ+)6^deh66JHoM!&X#NCShr{K=*!9(>4dloYx$E%i2hzYMZCqsul67Btn!SPcaYyc z&t~O6h(rM6sGs8~K!VB{Jgy%x{DblD0vA0GmDFdj-}sS{GZ@!$$2fC6?XLKMo>bHM z3lcBa534!o|!=}hn=BRsSvQK*6zW3i?;SwY2_wbKxR6R)33o^*@_e{!`3l+r6u%*w5Q~9Vsh?k8uuF6ziXQ1^uUd zzO?>_-`!YJe~WwdFTYRuz4~tqmC|#(b7YAAvu9ed{+nJw|21DOt^eLnmDbC*b|DXIS$ z+yE%n^IwP1bCMZ7Bb}o)#d=ylQ$4R(&VeE1DF0|@+sR@%R{s7gi*f5`EbguExvP}F zc$|)Lwt4h9@(TLwIbB??)#u1{#kkeS;$D5KuP>!fy|d-&(&KL5&Bb<$!p=j_FJqj; zuPf&N3F;L!41(fyiE1EhxoUxoNmQe5&t3aRm&Am68{77rsu*2 z*-ZRT#PfR;-%k7m;-^Lx%daU@eKIx0_(bAU4yqi9o9AAvf zqZ-10VuIrPDF3j*2P<@({HI#OhG^~ZH1SobVtxKdeD@EP-?pPX+9BmuuT{L>NW+LA zzUj5aaxNpj5A4IPIVP+()Vh9vaN<%rtf*_yq~ay{B74Nf7d9@ zu*Tqn3%HZ~r|wt&xn#MQ_?}k9tsOo<{P^Lp;k5mE2l356Q+zVze97RvaGj2j{|x&B z&EPyuyx)VLBi?e6>Jy`^%1Z6GyXnWwBYmJ<3cMC}_U@}(OaA^9DyNrnZX{m+eZ}SR zLHR5pe)@M|b8YRgmUw=#;vx7i`P@mo={sR_ZSC_;;)j|QpJ1qt^PrV;L~$$s0P*^I z)n_;Pzf1f`lk)Fnxj(Tu{nAnLKTEuKsmj?x{CVPsMk<~mJ{-4prGKvBItAU^e8vD5 z|1kUGVRIdZACXUp`0>~1xIV40a}Du^KZFfp$NR_8&?4vT3tH~MfM&RX{BzGLzpZa8 z@tP+Te^J?;w-WDqpUSC6edLoSzUua{xz>5zae9fbjw^2a+h&6s)}q71z{L)mCoD9$ z<$siNcKuPy?PIRP7N>vML;N`LniXM#%qIRc@d@mQ_YnUr@zY#?ZK9pe5#Rb}EjL8F zjio(LOj6vo@8!hnZqst*-nM+MC0@h0+UnB;T{HBcG*)U(@d69h9^EAuab1 z#;1H@L-6;Kf8)K%zlZv~i};CODsJ`JPQ3Pc#ZQv|E5z^Nd}`%<%iyYm`*;Gl)T@v2 zzwOUYQ_kvlseJ1P{zQD+Ps2t`7ll;}(|#NF%=hGHxu0O``##F4Td(!Caz07CWv}8b z6t&H$LFaM3=cD($Zcz&TCIYn9DCBA#A;_{TAd`=LryG7;X z6?T3L+>BqYv+Vc{j!=6p;rNPkKF!9ZsR395h z?FBCFYxhrVzxpcq8?IM5M=Ad(@io6vIabf#5I^CG>(B+AvBAOjDe$bM>7UiFS2@j; zKc0Bqm0B)tN|{fHclJpc1uk)**KgcF{sU7qZaGB$MZ}MONz0wgaktvwWOAKS zz{Nfbc0ch3u5{xpq8$g8cir?zZjw1%ta3Ve&iV z-?b)ekgk9djuYRyQsr+{*!j&6a{dZj`u_>eBevbEN3mVFzOd~wk@(ht%D4V=2J!w| z!=}VzEVs$vyl|avBmZgMr?CA$PCUc;Ydh=p4&ujt6E;$|P}cj2#{$~E^2HVTY%{o~ z-N#P@mv%hmX~%<<<8WTH?eYZibN{CG-9~+WN__XzVI%$!@xKs1pHu#`#4iw^e5c|` zDpiMDkEQ(5H3lE)w8d4v^`AEpkNsTnFy%KB-}sWsuc7=1@eutX+@SfaC%%O1Yde15 zP5ecU_cQQ!^4Us!`wu9e<$j#_o{ZwwZjTWUS1NA%|M!UJxqoik{TblWE?YUTSwFnc z*iChCA77-LLw`{DeI$;9K$-70bKX2cd?N9#%a#8C@ma+8UK=*ZdE$-4Yugkr4=7(P&SdgGMm%;(<%EboNxc5|%Dqxb~s|Bu8QzM^{zQv4{(m`l7Rtnyc}UX8@JaX-Yi z?^58#o}T+D%gMj{6Dns3<*y-rda0J%Ks-l$%ah7){l-5M-!o19vwSgBJ|84LkL$-x z3OoNoyek$qh?W01@hShQ@~xja3S8o-!=AX}1o@YIQRSSZ{8JWZJY&a2KXHfqs}{$t zDbxS={9Vhn?LL}#_$tM%JwwC~?$dJnINoOwzvmB%FA1nZHxrMsU)gqFLA>qtD!-Zf zuOZ&|1;sZ}PL_CGR`Jus?)K)mH!s=u|* zVJm;R@>@GRLHwRS7xVwZ%0I36dDiRiRchz`=Ty!-mis62Cx5H__mIB~`}5+LroN!K z)#no8`_?LcfO4h+H~pOJ$7;&Cp8UOU*K+HL-(qlHxK6hXfp-9xeGKpOhdIiRMZ!jk z?LY6f_%X#_WEne%uewBmCM^A_T}H-`;k{l$H{pHJ2&B?GJm1ACD+*?e_Q(a!!!{K&|q}SjHEJSjRm}{^Xy+hSQdN zehB#^>$M-^OW%gyuKO+nF8z7?kF;F*PO5yaCcbxN*j&R+na^C}8yPoR|FDGk{$Ga; z-&SRJ-c0=Pe<^O)QysuV(p1@S4IA8o&y1AI(y@N<<5$iH=+mfJ@8Efzl>Hi#W}pSect zKi)a!*=Jru{=J`7e%tQd#Lu&zETQ~&5|7nsxo3%QC4P|izpR}Y4tfkd>j4VZdJ#5g7}t+s?Tid^EB~3#t-ts5BdC# zcs=*q4=C*Xo%n%IhYhle_{I2wcB%0-#o!~Ijn^puN%GGjew6F7bHr~Ye)1{hxBdCe zz@;6}d;Cd){0II+?Z1ZlZyn=RL$vFHrn2%l&8Kr=C^Z_J@PSGw)FON6G&L z@e_Q$#qysf9-gB7$I1U!EC0JH-_~pN1nr0O0?KdYTt$4_Zxy%pnMeE#;~C4pjCjAt z54??dzD3K$rTN@Ty!r!*w_skEPapB492flxJKKowe^s%bpC(@S`mo_#P5v(tZ+e6B zZzBF};%iPS{~qE$H#jd`r*q`r)2MQel`HY@#Lv(l_A<}#OVyrzKL{J-9^$Vier|QK z{?iOjCfDf}^0&MxY|vArEhS$2W5vta-`+fgoOR@ndG-U}GX(!O@^AWu$`1v!;Lj3Y z!~Lc6)aRSPWn6T5_K}_-|FKq;Q%nAz7@QZb)1S$|WR>!7Chd9RNyZfo#K&HycHZ(% zwWqcJHN?B7&NrMkZoJ9h%FLj?~KINQj z)_NTy|C@<#f0N2Dr#{`pV?o8``9Jw=Ccfs$u(`JFxDB}JpS&;3;p=>wxP5N9+T_9u z3XB|HxK3XcJcuCr(y&3ToF5tfk__XNjNT^RE5Glkjt5XZyXjdBmL%`}3Vz zFYB)^BVNP!$JVRC@_#w($j8P}H-%JA*Apto#^JXT&r~RG?Hnb3&l|#yeC&MD6;e3| zJCxtH@4JZ~8l$+?=ON%?=Z%wfU106=N%HUiQP`2sYIAg)gCUVW`15_>5}zbLq~q7h z`MKdA>FnZuLTy0v{+@XMW2%pxAD<&$$93FpWp}D4X}#*{w{5*@fs6iIJ>%k1@^Aj3 z%0EpxzaOS@w(z-yUgFo2|3FgtZMlnyZ{a@wD)!sA5O*F`{;8C+4tS~Yk|X~r&wRRx z_@TF{9NR8^#On_!Zl4Ex1h~}Key_*c`BCy8T&Daj)aL;4sq@1Id6D?{fR}oX?kB)a zfAGu;&saIE?-JVKS;LQYkY~N{0{Jtq*K#MY-0I8K{@brZ)OvTR=AA5z?w|a)+2Z&!vJhM&fJC*XM8JtY6(=9{bcTi5ACMZEtim2b!I zy~OJuP<&NTGrV^Q`8$A{^{HoFvzu~O9Sj=*8&!<+dE!Ss`xRd&euC>wJMO+~aAtO$ zPLjWd{V+z_S>mfae)7d3(?l5<$TWI zWOALpLH>p}E5G%hM~RC> zpQW4-aN*zV@h8*Bf3|GC;XGBX8Ez)td$r>I?6<3lA9yls7;QgK5}&d_@q;SHc?a?O zwq#Jnt7wAU>~7>(%R-AHPZdzH=&PUO+Rs3#@?k9?GBL8IKvl-`G z`HjSva2{#XQk+&Rhx_sL`A|0eO>zf}G%%KsVhC2vsN+UF0%`x&oV`~Qvj=^oXy zfpP+`k@^n)j5GL1XYOd_-$?$ei0_YRxmM2`i0^u{^0$$HDRA+__IrZX4lBrC!~KUo zs*oYR>eniNHSu>7uOF-O?Rb2E_*~Dv#2(_!SF4;5<$RTRIroRH{!b9E{<-qoa(_+y zl;^p%;FQvKt26jW=d{O9?jEE4YBiq=O;VpLhLCeTucL_0dV7g7>949oLkAi z<|)-V{YgN9Dm#!q<{}+|B#L>?J;IbcX zpGPI^tPmXfIGh*OkZ=d(gja+Oa+-LGc=BnLe~|clh#&cj^4oTK(BNcpojwITE;g@i+4Ky*_Mk+b-4DsNIepQQYctHSv?P6u0B?b;Ngl zNAcrEn&X_FR=WSMF#Ke4oz@M3zl-vZu%FxZ-9|iiRLiw?-c7u}Qte>Bck@N!^`3a( zI|g?t!sH3^AK9()Z9jaLcwe95);`Y>&!5zC&j(b{a4ZaDU2vp^IOV^J_|eZOZu?t^ z_%S{ody4$G5N~7qT0687KQuz+>?3~%@pHE;Zu#@X_g$=bO+Yi;M|@RO@n*`opLp|I z6kkpLPZDo>lj2tX7l?;E<^Bip!;={2lxYD!F*plzo&HMxGwh!eNUNNx_B``XVS{uL zuO)t*&p+=cehu-HXO-XTxrq3F+S$sF5w9Jl^{Qokv&1LgtN3clzgKWPM1N?!$|vl+ z%kbN)f%7AjQ~oKHvxlU|iMPBrY>+>-9e3 z+pkpI`m5~*CzI>+DEYU=!UjD^+SiHKELS zKUQz>kxN&awG9I+!wO;xs~|Y#l?C?i0{8haciHf!C6VyDLI;c z-m~twk8-wsS>?!!w&n8>@!D4v%l{1VdGA!bP1&7q5mLj`+z>g$<|G=PKeycz?&@bBJ%*qw@2V?|wnvWW1zs z;Dv|gy`^bqaxcL3*=Q!xjo&-Li{plTSzNmKO@DZSTxvS7Y(AIo>FB^K@pfoP8_>83^oyqjtXfhJR`!Dg%$(~*ZZzaqm@l#7NdEsd(jz|YIiA1y6 z=!Qr zBv=b5Uivy`HmT_p5;?r2Gag$O?@nho81d0qOEeF=39&nNJ&t%^XeTOsdm@V8q``G_ z+k#nhW;H~bvI*5G5?QpeaoNJi!sShoh!bhLV|nAUr3+vgyzVrza0#hPnpQfI#my_` z<6WpL7A8}aJTcnYZqIB8FK%8se?er{^qDs}@-og;T6mZDbhl-rsa$(p)NGAPE9abC zJa5~h1#f5+;~2rIp6*CA6-}l)BRR67aFm!&;}xYH(Vk=;?;veAx^hE|5=ys9Y(@DH1 zHQttPincqV9$t2;gB^WNUSg^5EjC`HpzL+CrR^h~@GM#tch8TY%SYSs{z`DfdojAY z;|{dVrn80o=vz|79Bc;n0XwaYXAR=&9n3GI2Rx=9!49m4lN5hc)F>SS;pMGu%h1Pc z9om*H5O>w44elDAsAYHhF70yJxOVHvzz@YaUHNn>>DHG_P4eno(Y?JZktqxv0nifW z^{_oT$M(L)RID|gZ%iiJvWaf<*3w*8cdV$*3*$es7~?dNTAIrA*#%Rw-PHg8S&~gvStIc~5s!qBDWlpjwY$x$t6N;|`?d;H}ZYBJJ^H(zuL) zF@X+{6!pC2Wa3gyAf9HaxCC?&Q=q%U!+0&~ zMMRbEsLZ&|+5|cg-UN$x*V=9+PL1-K)9K8D4ejEL#q_9<>6dV>a;+*CjZL7fqF+9p zfy2+`jQk?)@z!iKcn|u9cmurew%8e>ly>!fMRK81LGBQG(!=V!5fLYu%gA)y;V!;A z+S`G*lxrzTwZ3)(sb3N{K>#8X8$7?Tt%R7KjJWzmcoDR|J{Yc3yck>=CKE#PmfSdO z3iG7m@~e=TxS|PkND*s-4!lY_o9@<8;~>asUl##Qyq8-)41wDua}KkLi3U`Hj*P+t zS(x@9;kG%m=O@s`p&W`T;nmsaL=jP1riWZ6jv23DM}chzlGn8xofFya^$0f#K8OxV zrc#M8>_lsrJ;O(97falgfTuJJ?m?orWbX;o|H6LD;gQ@SL~eV z7N3K;kaH~xwIQSAUWBGzh(|+_Lb38XWT)g7|nLN zYfhVUycB5!C3HX-mCW?#h&qcBz44ehCR(bv9w^e4D~myo*XO6RaBHHK)ZKJ*{B}V5 zy5gKM^k+=E5TIQ@B_k~7BytM|RZ0eM(a;ium7WAJZ16tzX#1T#iGlde6$xr6wJe&0 zHV|T4Zav(bx_R^s3?><{tgmTQb>#?UL^-oIK^%~{J5HW~o-@$;i_Js`-`kqU&onq@ z9bsy_7ULXm$A_!NXf_rWM-MwJ?9GS+Mi?WrA>10`Y5br;tSNq1qCMW0jmHZk>{b&A z-_Af-ezG81H2KR)WIQ5ZzcWb%Ck3 zp*PsEVMduu`>GrqgNY7qmxYo@jCd6t7xHZoJ^#5;SUF|0K`ol$ZpimLz!K^J~PqBGu|$!~xvo`x39 zOl5S2%XGn4=T%*TcYXTj@6NdOC`^aYkNrx*G!v#4_de6T+ckVEIx#C%C@x?*Q8<}^XI@zA;~z%qwnp&c*avLQ%eCnJYAd9m5xTAGT* z@k2UY_)!+ebwq|cbWSUhVD(7hdAr%D@V3EdX`&MS)=i(mEC7T{OcgMpPE~L<% zn^;gnl{oej%`!?<(gk!>LLs|1U@BIKgJh#ZBO!PF#GN39hk!w&y3jZS{!bXuk&2z1 zShG~=vaQBR4y$vx6?cs!lWg-K0Os}rkVRZe*%6})N<{VXMnp5~5wFwFnVOmD3I;5> zrKN+QBOAZ7C!T8GU}|XlfUfH7B-oAJieAic#e0CFpKGfQ3s!ZE2>i^h418YHxLkLo zM94zfV6#!7Mj}g5chMN30|tP`&0=xmS~Fc~w6?Pzac11Kf!#90OpJ{VvyXt#xf4HU zrR|UCSr@MZ+ovXWGoc*xL>t4eKn<%z_d01~x1QqSp@4RLyO+u3FBU3VMcZ^xR3<5H zVq-_o?uNvwE8{tACd=M>WUb7U+FudWVNB7fi93tOjCoL>ST2pgQRWJxMJAn$!UDQ~ zs+tUJ2CePMnH8kQY`Qgz{iRG2zbdAaR8c240B@RQ1TrZK^pLg(__Q| zE@LB^v}GUL_(Eq{)AfwYk+S)99g1%bOmXjhh=A?dmoLJfB&unco3(Wa`Wn zc`&qqo!FPQNDEP{%eP1)aRkPW!DPpTsUM7Ulqb8{w&vSA;7 zVNGtNfCFK<&fg*mJIqldcbhUEL*5P z?zn)bv1tLrFszob3yWDkAxnPTZ!~3~{t~0hjx_AijtMM_8@V!wU9lP_r)bf7TntvC zvtnbT%eXnak%C$b?9|asOJ3J}h20!PZv(4EA*V1@b%05;*gHJ~Zqao9lEc|$Hp3*1 zA2HKz1f9w3e?Vd@(1FQKT3$!9WRdM*krETD7vgl;3=(*G$-A1ObHTBj{v+!Y6H}R; zWuuk*cBk|{d!uV$)ePa7b>?Bc*sRxTp$dZWcu2Y<7r+vVu0jys?knkC0#5vpYz#*7mG6BX=dDm}&9Lmrz67 zWZ=fDDahQ&*L%!U?6tsdSy|vo4KRpxZjqG>_D&XahtkB?rXt##;f5Bpwlrw;fvFU0B(wSJ z*26S`bos&#=s=Cw0av8(Td!g!jcRoPFE>&OjRa!RKDXJTQg?(NTpaP3nV8<&1d7HF zY7|+BAWfsdndXY`vgzyxqIYE}{2~~>O?;Mlz``_-xj&?LzgEI&X%HuF)ivujCiNF) zWpgmKDAAG5*-k4fAXEDeqo2FOSud+Sr9gp~P2@_*76rx1=6;CGVyRd`cr1Y%)Wvab z_lCmVS>)8`52UlW18;k6e&(@wGziJvSaOY^AKgdCPe(_xCpR!PVEl-F^!?ngl7LDA zWD`z_0Qanm>9F`g4;xNk4mNQ>@vQ~Z3Z@KMdfbKCL`S}7(rrU@A4gn)ZGBX#BQJXp z3>#zyPI-2kpcJQIqh67Nwi_OEX4@#f6((n}AB(T;>FkiZeU{BEL9ENrft~Ndg2LQ) zfESWof5t(&?<9M$x%u%9xw9hEBPLDP1S!^Z`*i3xc+A@3;&KlQ98KOk0;scWUJq=f z2^Y06dlup!&WTpGP2ys zVhG~4@xUVtu6xY`A+visa=_o1UFt;2ZWK!auJu4RzBZl48b?Ds*{YNJ*`UaTN@o3I zrnY4RQwI779v?9`8?fn+F+C4`1-a!GR$=6F5V%4SSvpG-l-RLATqyS+G&bz&UgWyf z3a!~jQr&?YQBoVLY$1Y^8WbW0DbE;{4@eZEXS=)5*s|2NlJE`6XvMn%;Q`|=mS(}a zyeYjtrIQqf6#m=>7+65aLfh%dCFAj;NLKX4V=@`NH7H>q5YrAtyZ7n>Ot&=Cv1AkP z*O5rdE{{IQfnROL&6XQ)jO1kMExLz)S1vX9#=cb9v(;nn8+g1q#yB?!v=hT;>eFd* zX9rIPh#2+41M76gH8P$S6zw4t`~z~aRb4yrkqDj+;&XNgT8&lBFf1{Yaj(ff*oWxa zj9c8UEVwxgGjkWv$(W_JyHU&oNp@x|ejEu^v5wb1dSr07koK{$Fv1=gW(5tj z^`sLNBJrL-M0yb9Y<776|J&t7;&kL6O+qIuPSbjglAu^htw)F|*ZC7$D*c1{tZ)a9FSMwwgZq zV}?NCZk}qYPhfa-U7Dc>E#61hCuC)BRePJMg55ThniR!arB;x+_0fz(V5arW+Le#+ z>3ssJv>Vm1<9qNs8`&ha~(Y=T6b%+T) zmO!f&?I4(#1ap8s49k|&4q~51=@{%pr6}oM7`M98>42t1`(08weTGcxP}(xOQ&d<3 z2_s!QZjWKVB&~CEVNmG~zWjW8B!vmpQ!`zeEX57V!fLX31IQ>+Vq?OrckCli#)^Zr z&^TL7Y(ksjo%O=PSGGfq^$@<8{g81xrLZhnfsasJY2cvjY#j-P*@j$6xJ&UEY?A+w(IS*6$+%dqhRfz@>ULVHv)FqOf+ z^>mp_oawj`fFoAa3DD9KsXNo-UEDM2!v0a=N^|H#@tVV?xrYT6(vXG2bW?x|!viqR zba)>1f~bnV(~{4RTCZf%kac5%bFGf=qBraC2{%Goa{{O``M zM)m;y`8A-z@5;|5AawUfc-Vdo|!M&RG( zx4(OD-&eg&Du+)c{-y3Vf4zYCEWp2fHOA)ORTIXQ{!Q zulbKHbmtyuKZ`z!#3=mB7?97Azc=x$h*w{GZO@N^Te`Z$AKSldxwapCA2eaH`Hx(n{udMpf#&|${Pz45i0=GnnEwp(cc~c*B5Xc; zKIzGC-=o|T)Rx+82OcHZd{*Eukr2%4Z@+JTqDu2`!}qn_A8-EOfGGMmxS5c)`8~~V zc!iZ_b^2Xt!R;p`Km3VLgJmSa+MSoq1tdHyhSV}l^M87n<uf0_B@34$o{X$(W9A}HnzNF^A72m6L Wf4t?3dn%Rxg@-kNizkEU()m9wsCYF1 diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/chip_config_xilinx.txt b/slsDetectorServers/xilinx_ctbDetectorServer/chip_config_xilinx.txt index 0d9a5e05b..3f48ea84c 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/chip_config_xilinx.txt +++ b/slsDetectorServers/xilinx_ctbDetectorServer/chip_config_xilinx.txt @@ -1,24 +1,24 @@ # Prepare MH02 configuration -reg 0xB1B0 0x00000041 -reg 0xB1B4 0x01200004 +reg 0xC00C 0x00000041 +reg 0xC010 0x01200004 # configure Matterhorn SPI -setbit 0xB1B8 0 +setbit 0xC014 0 # wait till config is done -pollbit 0xB1B8 3 0 +pollbit 0xC014 3 0 # reset transceiver -reg 0xB820 0x0 -reg 0xB820 0x1 -reg 0xB820 0x0 +reg 0xC120 0x0 +reg 0xC120 0x1 +reg 0xC120 0x0 # set MSB LSB inversions and polarity for transceiver -reg 0xB820 0x61e0 +reg 0xC120 0x61e0 # Enable MH02 PLL clock pattern enable_clock_pattern.pyat # start the flow -setbit 0xB004 0 -clearbit 0xB004 0 +setbit 0xB030 0 +clearbit 0xB030 0 sleep 1 diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/reset_chip_xilinx.txt b/slsDetectorServers/xilinx_ctbDetectorServer/reset_chip_xilinx.txt index 769cdea10..d79f3e9da 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/reset_chip_xilinx.txt +++ b/slsDetectorServers/xilinx_ctbDetectorServer/reset_chip_xilinx.txt @@ -1,30 +1,30 @@ # turn off clock -setbit 0xB1B0 16 -setbit 0xB1B8 0 +setbit 0xC00C 16 +setbit 0xC014 0 sleep 1 # reset Matterhorn periphery -setbit 0xB1B8 1 +setbit 0xC014 1 sleep 1 # turn on clock -clearbit 0xB1B0 16 -setbit 0xB1B8 0 +clearbit 0xC00C 16 +setbit 0xC014 0 sleep 1 # reset rx transceiver datapath -setbit 0xB820 4 +setbit 0xC120 4 sleep 1 # reset 8b10b counters -setbit 0xB820 9 -setbit 0xB820 10 -setbit 0xB820 11 -setbit 0xB820 12 +setbit 0xC120 9 +setbit 0xC120 10 +setbit 0xC120 11 +setbit 0xC120 12 sleep 1 -clearbit 0xB820 9 -clearbit 0xB820 10 +clearbit 0xC120 9 +clearbit 0xC120 10 # reset buffer fifos reg 0x9024 0xFFFFFFFF diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c index 3fe36be67..8ad87c245 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c @@ -9,6 +9,7 @@ #include "sls/versionAPI.h" #include "LTC2620_Driver.h" +#include "XILINX_PLL.h" #include "loadPattern.h" #ifdef VIRTUAL @@ -39,6 +40,8 @@ char initErrorMessage[MAX_STR_LENGTH]; int detPos[2] = {0, 0}; +uint32_t clkFrequency[NUM_CLOCKS] = {20, 100, 20, 100}; + int chipConfigured = 0; int analogEnable = 0; int digitalEnable = 0; @@ -1778,3 +1781,28 @@ void getNumberOfChannels(int *nchanx, int *nchany) { int getNumberOfChips() { return NCHIP; } int getNumberOfDACs() { return NDAC; } int getNumberOfChannelsPerChip() { return NCHAN; } + +int setFrequency(enum CLKINDEX ind, int val) { + if (ind < 0 || ind >= NUM_CLOCKS) { + LOG(logERROR, ("Unknown clock index %d to set frequency\n", ind)); + return FAIL; + } + if (val <= 0) { + return FAIL; + } + + char *clock_names[] = {CLK_NAMES}; + LOG(logINFO, ("\tSetting %s clock (%d) frequency to %d MHz\n", + clock_names[ind], ind, val)); + + XILINX_PLL_setFrequency(ind, val); + return OK; +} + +int getFrequency(enum CLKINDEX ind) { + if (ind < 0 || ind >= NUM_CLOCKS) { + LOG(logERROR, ("Unknown clock index %d to get frequency\n", ind)); + return -1; + } + return XILINX_PLL_getFrequency(ind); +} \ No newline at end of file diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h index df291c0d2..4660329f1 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h @@ -72,10 +72,6 @@ #define VIO_MIN_MV (1200) // for fpga to function #define TICK_CLK (20) // MHz (trig_timeFromStart, frametime, timeFromStart) -#define RUN_CLK \ - (100) // MHz (framesFromStart, c_swTrigger, run, waitForTrigger, starting, - // acquiring, waitForPeriod, internalStop, c_framesFromSTart_reset, - // s_start, c_stop, triggerEnable, period, frames, cycles, delay) /* Defines in the Firmware */ #define WAIT_TIME_PATTERN_READ (10) @@ -158,3 +154,6 @@ typedef struct udp_header_struct { #define IP_HEADER_SIZE (20) #define UDP_IP_HEADER_LENGTH_BYTES (28) + +enum CLKINDEX { RUN_CLK, ADC_CLK, SYNC_CLK, DBIT_CLK, NUM_CLOCKS }; +#define CLK_NAMES "run", "adc", "sync", "dbit" \ No newline at end of file diff --git a/slsDetectorSoftware/generator/commands.yaml b/slsDetectorSoftware/generator/commands.yaml index 3fe3f4534..72e8a0c32 100644 --- a/slsDetectorSoftware/generator/commands.yaml +++ b/slsDetectorSoftware/generator/commands.yaml @@ -1272,7 +1272,7 @@ asamples: function: setNumberOfAnalogSamples adcclk: - help: "[n_clk in MHz]\n\t[Ctb] ADC clock frequency in MHz." + help: "[n_clk in MHz]\n\t[Ctb] ADC clock frequency in MHz.\n\t[xilinx Ctb] ADC clock frequency in kHz." inherit_actions: INTEGER_COMMAND_VEC_ID actions: GET: @@ -1281,7 +1281,7 @@ adcclk: function: setADCClock runclk: - help: "[n_clk in MHz]\n\t[Ctb] Run clock in MHz." + help: "[n_clk in MHz]\n\t[Ctb] Run clock in MHz.\n\t[xilinx Ctb] Run clock in kHz." inherit_actions: INTEGER_COMMAND_VEC_ID actions: GET: @@ -1318,7 +1318,7 @@ romode: input_types: [ defs::readoutMode ] dbitclk: - help: "[n_clk in MHz]\n\t[Ctb] Clock for latching the digital bits in MHz." + help: "[n_clk in MHz]\n\t[Ctb] Clock for latching the digital bits in MHz.\n\t[xilinx Ctb] Clock for latching the digital bits in kHz." inherit_actions: INTEGER_COMMAND_VEC_ID actions: GET: @@ -1791,7 +1791,7 @@ defaultpattern: patternstart: inherit_actions: EXECUTE_SET_COMMAND - help: "\n\t[Mythen3] Starts Pattern" + help: "\n\t[Mythen3][Xilinx Ctb] Starts Pattern" actions: PUT: function: startPattern diff --git a/slsDetectorSoftware/generator/extended_commands.yaml b/slsDetectorSoftware/generator/extended_commands.yaml index 1b16b55b0..7ce58b90a 100644 --- a/slsDetectorSoftware/generator/extended_commands.yaml +++ b/slsDetectorSoftware/generator/extended_commands.yaml @@ -106,7 +106,8 @@ adcclk: store_result_in_t: false command_name: adcclk function_alias: adcclk - help: "[n_clk in MHz]\n\t[Ctb] ADC clock frequency in MHz." + help: "[n_clk in MHz]\n\t[Ctb] ADC clock frequency in MHz.\n\t[xilinx Ctb] ADC clock\ + \ frequency in kHz." infer_action: true template: true adcenable: @@ -2219,7 +2220,8 @@ dbitclk: store_result_in_t: false command_name: dbitclk function_alias: dbitclk - help: "[n_clk in MHz]\n\t[Ctb] Clock for latching the digital bits in MHz." + help: "[n_clk in MHz]\n\t[Ctb] Clock for latching the digital bits in MHz.\n\t[xilinx\ + \ Ctb] Clock for latching the digital bits in kHz." infer_action: true template: true dbitphase: @@ -6515,7 +6517,7 @@ patternstart: store_result_in_t: false command_name: patternstart function_alias: patternstart - help: "\n\t[Mythen3] Starts Pattern" + help: "\n\t[Mythen3][Xilinx Ctb] Starts Pattern" infer_action: true template: true patwait: @@ -8133,7 +8135,7 @@ runclk: store_result_in_t: false command_name: runclk function_alias: runclk - help: "[n_clk in MHz]\n\t[Ctb] Run clock in MHz." + help: "[n_clk in MHz]\n\t[Ctb] Run clock in MHz.\n\t[xilinx Ctb] Run clock in kHz." infer_action: true template: true runtime: diff --git a/slsDetectorSoftware/include/sls/Detector.h b/slsDetectorSoftware/include/sls/Detector.h index b4f39ab97..218f0dacd 100644 --- a/slsDetectorSoftware/include/sls/Detector.h +++ b/slsDetectorSoftware/include/sls/Detector.h @@ -1612,16 +1612,16 @@ class Detector { /** [CTB] */ void setNumberOfAnalogSamples(int value, Positions pos = {}); - /** [CTB] */ + /** [CTB] in MHz, [XCTB] in kHz */ Result getADCClock(Positions pos = {}) const; - /** [CTB] */ + /** [CTB] in MHz, [XCTB] in kHz */ void setADCClock(int value_in_MHz, Positions pos = {}); - /** [CTB] */ + /** [CTB] in MHz, [XCTB] in kHz */ Result getRUNClock(Positions pos = {}) const; - /** [CTB] */ + /** [CTB] in MHz, [XCTB] in kHz */ void setRUNClock(int value_in_MHz, Positions pos = {}); /** [CTB] in MHZ */ @@ -1691,10 +1691,10 @@ class Detector { */ void setReadoutMode(defs::readoutMode value, Positions pos = {}); - /** [CTB] */ + /** [CTB] in MHz, [XCTB] in kHz */ Result getDBITClock(Positions pos = {}) const; - /** [CTB] */ + /** [CTB] in MHz, [XCTB] in kHz */ void setDBITClock(int value_in_MHz, Positions pos = {}); /** @@ -1943,7 +1943,7 @@ class Detector { * selected bits */ void setPatternBitMask(uint64_t mask, Positions pos = {}); - /** [Mythen3] */ + /** [Mythen3][Xilinx CTB] */ void startPattern(Positions pos = {}); ///@} diff --git a/slsDetectorSoftware/src/Caller.cpp b/slsDetectorSoftware/src/Caller.cpp index 70e0700c7..292b881f8 100644 --- a/slsDetectorSoftware/src/Caller.cpp +++ b/slsDetectorSoftware/src/Caller.cpp @@ -73,7 +73,8 @@ std::string Caller::adcclk(int action) { // print help if (action == slsDetectorDefs::HELP_ACTION) { os << R"V0G0N([n_clk in MHz] - [Ctb] ADC clock frequency in MHz. )V0G0N" + [Ctb] ADC clock frequency in MHz. + [xilinx Ctb] ADC clock frequency in kHz. )V0G0N" << std::endl; return os.str(); } @@ -2805,7 +2806,8 @@ std::string Caller::dbitclk(int action) { // print help if (action == slsDetectorDefs::HELP_ACTION) { os << R"V0G0N([n_clk in MHz] - [Ctb] Clock for latching the digital bits in MHz. )V0G0N" + [Ctb] Clock for latching the digital bits in MHz. + [xilinx Ctb] Clock for latching the digital bits in kHz. )V0G0N" << std::endl; return os.str(); } @@ -8452,7 +8454,7 @@ std::string Caller::patternstart(int action) { // print help if (action == slsDetectorDefs::HELP_ACTION) { os << R"V0G0N( - [Mythen3] Starts Pattern )V0G0N" + [Mythen3][Xilinx Ctb] Starts Pattern )V0G0N" << std::endl; return os.str(); } @@ -10429,7 +10431,8 @@ std::string Caller::runclk(int action) { // print help if (action == slsDetectorDefs::HELP_ACTION) { os << R"V0G0N([n_clk in MHz] - [Ctb] Run clock in MHz. )V0G0N" + [Ctb] Run clock in MHz. + [xilinx Ctb] Run clock in kHz. )V0G0N" << std::endl; return os.str(); } diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index b4dca9e77..b1a416a61 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -7,6 +7,6 @@ #define APIGOTTHARD2 "0.0.0 0x250909" #define APIMOENCH "0.0.0 0x250909" #define APIEIGER "0.0.0 0x250909" -#define APIXILINXCTB "0.0.0 0x250909" +#define APIXILINXCTB "0.0.0 0x250916" #define APIJUNGFRAU "0.0.0 0x250909" #define APIMYTHEN3 "0.0.0 0x250909"