From 01465aac7c6f60f27aef82b8a9fdbc2b9dbc5354 Mon Sep 17 00:00:00 2001 From: tychovrahe Date: Sun, 25 May 2025 18:45:25 +0200 Subject: [PATCH] feat(core): update NRF application from firmware [no changelog] --- core/SConscript.firmware | 10 +- core/SConscript.kernel | 4 + core/embed/io/nrf/inc/io/nrf.h | 179 +++++-- core/embed/io/nrf/nrf_internal.h | 3 + core/embed/io/nrf/stm32u5/nrf.c | 51 +- core/embed/io/nrf/stm32u5/nrf_update.c | 147 ++++++ core/embed/models/T3W1/trezor-ble.bin | Bin 0 -> 271680 bytes core/embed/projects/firmware/main.c | 21 +- core/embed/rust/Cargo.lock | 7 + core/embed/rust/Cargo.toml | 8 + core/embed/rust/build.rs | 8 + core/embed/rust/rust_smp.h | 12 + core/embed/rust/rust_ui_common.h | 2 + core/embed/rust/src/lib.rs | 2 + core/embed/rust/src/smp/api.rs | 33 ++ core/embed/rust/src/smp/base64.rs | 166 ++++++ core/embed/rust/src/smp/crc16.rs | 14 + core/embed/rust/src/smp/echo.rs | 76 +++ core/embed/rust/src/smp/mod.rs | 472 ++++++++++++++++++ core/embed/rust/src/smp/reset.rs | 27 + core/embed/rust/src/smp/upload.rs | 101 ++++ core/embed/rust/src/trezorhal/irq.rs | 13 + core/embed/rust/src/trezorhal/nrf.rs | 7 + core/embed/rust/src/ui/api/common_c.rs | 5 + core/embed/rust/src/ui/layout_bolt/mod.rs | 9 + core/embed/rust/src/ui/layout_caesar/mod.rs | 4 + core/embed/rust/src/ui/layout_delizia/mod.rs | 4 + core/embed/rust/src/ui/layout_eckhart/mod.rs | 12 + core/embed/rust/src/ui/ui_common.rs | 2 + core/embed/rust/trezorhal.h | 5 + core/embed/sys/irq/inc/sys/irq.h | 14 +- core/embed/sys/irq/stm32/irq.c | 26 + core/embed/sys/linker/stm32u5g/firmware.ld | 3 + .../sys/syscall/inc/sys/syscall_numbers.h | 3 + .../sys/syscall/stm32/syscall_dispatch.c | 20 + core/embed/sys/syscall/stm32/syscall_stubs.c | 18 + .../sys/syscall/stm32/syscall_verifiers.c | 30 ++ .../sys/syscall/stm32/syscall_verifiers.h | 10 + .../models/T3W1/trezor_t3w1_revA.py | 3 + .../models/T3W1/trezor_t3w1_revB.py | 3 + .../models/T3W1/trezor_t3w1_revC.py | 3 + core/site_scons/models/stm32f4_common.py | 1 + core/site_scons/models/stm32u5_common.py | 1 + core/site_scons/models/unix_common.py | 1 + core/site_scons/tools.py | 17 +- 45 files changed, 1503 insertions(+), 54 deletions(-) create mode 100644 core/embed/io/nrf/stm32u5/nrf_update.c create mode 100644 core/embed/models/T3W1/trezor-ble.bin create mode 100644 core/embed/rust/rust_smp.h create mode 100644 core/embed/rust/src/smp/api.rs create mode 100644 core/embed/rust/src/smp/base64.rs create mode 100644 core/embed/rust/src/smp/crc16.rs create mode 100644 core/embed/rust/src/smp/echo.rs create mode 100644 core/embed/rust/src/smp/mod.rs create mode 100644 core/embed/rust/src/smp/reset.rs create mode 100644 core/embed/rust/src/smp/upload.rs create mode 100644 core/embed/rust/src/trezorhal/irq.rs create mode 100644 core/embed/rust/src/trezorhal/nrf.rs create mode 100644 core/embed/sys/irq/stm32/irq.c diff --git a/core/SConscript.firmware b/core/SConscript.firmware index f5e740e957..94f38c0b19 100644 --- a/core/SConscript.firmware +++ b/core/SConscript.firmware @@ -831,6 +831,7 @@ protobuf_blobs = env.Command( ) env.Depends(protobuf_blobs, qstr_generated) + # # Rust library # @@ -891,7 +892,14 @@ tools.embed_raw_binary( f'build/kernel/kernel.bin', ) - +if 'nrf' in FEATURES_AVAILABLE: + tools.embed_raw_binary( + obj_program, + env, + 'nrf_app', + 'build/firmware/nrf_app.o', + f'embed/models/{TREZOR_MODEL}/trezor-ble.bin', + ) env.Depends(obj_program, qstr_generated) diff --git a/core/SConscript.kernel b/core/SConscript.kernel index 48d9fcc678..7d9b758d3c 100644 --- a/core/SConscript.kernel +++ b/core/SConscript.kernel @@ -263,6 +263,10 @@ env = Environment( FEATURES_AVAILABLE = models.configure_board(TREZOR_MODEL, HW_REVISION, FEATURES_WANTED, env, CPPDEFINES_HAL, SOURCE_HAL, PATH_HAL) +if 'nrf' in FEATURES_AVAILABLE: + FEATURES_AVAILABLE.append('smp') + CPPDEFINES_HAL.append('USE_SMP') + FEATURE_FLAGS["AES_GCM"] = FEATURE_FLAGS["AES_GCM"] or "tropic" in FEATURES_AVAILABLE if not 'secmon_layout' in FEATURES_AVAILABLE: diff --git a/core/embed/io/nrf/inc/io/nrf.h b/core/embed/io/nrf/inc/io/nrf.h index 799b311ff0..8035a1a31b 100644 --- a/core/embed/io/nrf/inc/io/nrf.h +++ b/core/embed/io/nrf/inc/io/nrf.h @@ -23,7 +23,6 @@ #include - // maximum data size allowed to be sent #define NRF_MAX_TX_DATA_SIZE (244) @@ -58,66 +57,170 @@ typedef struct { uint8_t hash[SHA256_DIGEST_LENGTH]; } nrf_info_t; +/** Callback type invoked when data is received on a registered service */ typedef void (*nrf_rx_callback_t)(const uint8_t *data, uint32_t len); + +/** Callback type invoked when a message transmission completes */ typedef void (*nrf_tx_callback_t)(nrf_status_t status, void *context); -// Initialize the NRF driver +/** + * @brief Initialize the NRF driver. + */ void nrf_init(void); -// Deinitialize the NRF driver +/** + * @brief Deinitialize the NRF driver. + */ void nrf_deinit(void); -// Suspend NRF driver +/** + * @brief Suspend the NRF driver. + */ void nrf_suspend(void); -// Check that NRF is running +/** + * @brief Check if the NRF communication is currently running. + * + * @return true if running, false otherwise + */ bool nrf_is_running(void); -// Register listener for a service -// The listener will be called when a message is received for the service -// The listener will be called from an interrupt context -// Returns false if a listener for the service is already registered +/** + * @brief Register a listener for a specific NRF service. + * + * The listener callback will be invoked from an interrupt context when a + * message is received for the specified service. + * + * @param service Service identifier to register for + * @param callback Function to call when data arrives + * @return false if a listener for the service is already registered, true + * otherwise + */ bool nrf_register_listener(nrf_service_id_t service, nrf_rx_callback_t callback); -// Unregister listener for a service +/** + * @brief Unregister the listener for a specific NRF service. + * + * @param service Service identifier to unregister + */ void nrf_unregister_listener(nrf_service_id_t service); -// Send a message to a service -// The message will be queued and sent as soon as possible -// If the queue is full, the message will be dropped -// returns ID of the message if it was successfully queued, otherwise -1 +/** + * @brief Send a message to a specific NRF service. + * + * The message will be queued and sent as soon as possible. If the queue is + * full, the message will be dropped. + * + * @param service Service identifier to send to + * @param data Pointer to the data buffer to send + * @param len Length of the data buffer + * @param callback Function to call upon transmission completion + * @param context Context pointer passed to the callback + * @return ID of the message if successfully queued; -1 otherwise + */ int32_t nrf_send_msg(nrf_service_id_t service, const uint8_t *data, uint32_t len, nrf_tx_callback_t callback, void *context); -// Abort a message by ID -// If the message is already sent or the id is not found, it does nothing and -// returns false If the message is queued, it will be removed from the queue If -// the message is being sent, it will be sent. The callback will not be called. +/** + * @brief Abort a queued message by its ID. + * + * If the message is already sent or the ID is not found, this function does + * nothing and returns false. If the message is queued, it will be removed from + * the queue. If the message is in the process of being sent, it will complete, + * but its callback will not be invoked. + * + * @param id Identifier of the message to abort + * @return false if the message was already sent or not found, true if aborted + */ bool nrf_abort_msg(int32_t id); -// Reads version and other info from NRF application. -// Blocking function. +/** + * @brief Read version and other information from the NRF application. + * + * Blocking function that fills the provided nrf_info_t structure. + * + * @param info Pointer to an nrf_info_t structure to populate + * @return true on success; false on communication error + */ bool nrf_get_info(nrf_info_t *info); -/////////////////////////////////////////////////////////////////////////////// -// TEST only functions - -// Test SPI communication with NRF -bool nrf_test_spi_comm(void); - -// Test UART communication with NRF -bool nrf_test_uart_comm(void); - -// Test reset pin -bool nrf_test_reset(void); - -// Test GPIO stay in bootloader -bool nrf_test_gpio_stay_in_bld(void); - -// Test GPIO reserved -bool nrf_test_gpio_reserved(void); - +/** + * @brief Place the NRF device into system-off (deep sleep) mode. + * + * @return true if the command was acknowledged; false otherwise + */ bool nrf_system_off(void); +/** + * @brief Reboot the NRF device immediately. + */ void nrf_reboot(void); + +/** + * @brief Send raw UART data to the NRF device (for debugging purposes). + * + * @param data Pointer to the data buffer + * @param len Length of the data buffer + */ +void nrf_send_uart_data(const uint8_t *data, uint32_t len); + +/** + * @brief Check if an nRF device firmware update is required by comparing SHA256 + * hashes. + * + * @param image_ptr Pointer to the firmware image in memory + * @param image_len Length of the firmware image in bytes + * @return true if an update is required (e.g., corrupted image detected or hash + * mismatch), false if the device already has the same firmware version + */ +bool nrf_update_required(const uint8_t *image_ptr, size_t image_len); + +/** + * @brief Perform a firmware update on the nRF device via DFU (Device Firmware + * Update). + * + * @param image_ptr Pointer to the firmware image in memory + * @param image_len Length of the firmware image in bytes + * @return true always (indicates that the update process was initiated) + */ +bool nrf_update(const uint8_t *image_ptr, size_t image_len); + +/////////////////////////////////////////////////////////////////////////////// +// TEST-only functions + +/** + * @brief Test SPI communication with the NRF device. + * + * @return true if SPI communication succeeds; false otherwise + */ +bool nrf_test_spi_comm(void); + +/** + * @brief Test UART communication with the NRF device. + * + * @return true if UART communication succeeds; false otherwise + */ +bool nrf_test_uart_comm(void); + +/** + * @brief Test the NRF reset pin functionality. + * + * @return true if reset behavior is correct; false otherwise + */ +bool nrf_test_reset(void); + +/** + * @brief Test the GPIO pin that forces the device to stay in bootloader. + * + * @return true if the GPIO behaves correctly; false otherwise + */ +bool nrf_test_gpio_stay_in_bld(void); + +/** + * @brief Test a reserved GPIO pin on the NRF device. + * + * @return true if the GPIO behavior is correct; false otherwise + */ +bool nrf_test_gpio_reserved(void); +/////////////////////////////////////////////////////////////////////////////// diff --git a/core/embed/io/nrf/nrf_internal.h b/core/embed/io/nrf/nrf_internal.h index e442144c4c..99e4bd522f 100644 --- a/core/embed/io/nrf/nrf_internal.h +++ b/core/embed/io/nrf/nrf_internal.h @@ -52,3 +52,6 @@ bool nrf_in_reserved(void); void nrf_uart_send(uint8_t data); uint8_t nrf_uart_get_received(void); + +void nrf_set_dfu_mode(bool set); +bool nrf_is_dfu_mode(void); diff --git a/core/embed/io/nrf/stm32u5/nrf.c b/core/embed/io/nrf/stm32u5/nrf.c index 875af4778c..05e161f58c 100644 --- a/core/embed/io/nrf/stm32u5/nrf.c +++ b/core/embed/io/nrf/stm32u5/nrf.c @@ -32,6 +32,7 @@ #include "../crc8.h" #include "../nrf_internal.h" +#include "rust_smp.h" #define MAX_SPI_DATA_SIZE (244) @@ -91,6 +92,9 @@ typedef struct { systimer_t *timer; bool pending_spi_transaction; + bool dfu_mode; + bool dfu_tx_pending; + } nrf_driver_t; static nrf_driver_t g_nrf_driver = {0}; @@ -645,6 +649,14 @@ uint8_t nrf_uart_get_received(void) { void HAL_UART_RxCpltCallback(UART_HandleTypeDef *urt) { nrf_driver_t *drv = &g_nrf_driver; if (drv->initialized && urt == &drv->urt) { +#ifdef USE_SMP + if (nrf_is_dfu_mode()) { + smp_process_rx_byte(drv->urt_rx_byte); + HAL_UART_Receive_IT(&drv->urt, &drv->urt_rx_byte, 1); + return; + } +#endif + drv->urt_rx_complete = true; } } @@ -652,6 +664,7 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *urt) { void HAL_UART_ErrorCallback(UART_HandleTypeDef *urt) { nrf_driver_t *drv = &g_nrf_driver; if (drv->initialized && urt == &drv->urt) { + drv->dfu_tx_pending = false; HAL_UART_Receive_IT(&drv->urt, &drv->urt_rx_byte, 1); } } @@ -659,6 +672,7 @@ void HAL_UART_ErrorCallback(UART_HandleTypeDef *urt) { void HAL_UART_TxCpltCallback(UART_HandleTypeDef *urt) { nrf_driver_t *drv = &g_nrf_driver; if (drv->initialized && urt == &drv->urt) { + drv->dfu_tx_pending = false; drv->urt_tx_complete = true; } } @@ -938,19 +952,19 @@ bool nrf_system_off(void) { return true; } -void nrf_set_dfu_mode(void) { +#ifdef USE_SMP +void nrf_set_dfu_mode(bool set) { nrf_driver_t *drv = &g_nrf_driver; if (!drv->initialized) { return; } - // TODO - // if (nrf_reboot_to_bootloader()) { - // drv->mode_current = BLE_MODE_DFU; - // } else { - // drv->status_valid = false; - // } + drv->dfu_mode = set; + + if (set) { + HAL_UART_Receive_IT(&drv->urt, &drv->urt_rx_byte, 1); + } } bool nrf_is_dfu_mode(void) { @@ -960,8 +974,27 @@ bool nrf_is_dfu_mode(void) { return false; } - return true; - // TODO + return drv->dfu_mode; +} +#endif + +void nrf_send_uart_data(const uint8_t *data, uint32_t len) { + nrf_driver_t *drv = &g_nrf_driver; + if (drv->initialized) { + while (drv->dfu_tx_pending) { + irq_key_t key = irq_lock(); + irq_unlock(key); + } + + drv->dfu_tx_pending = true; + + HAL_UART_Transmit_IT(&drv->urt, data, len); + + while (drv->dfu_tx_pending) { + irq_key_t key = irq_lock(); + irq_unlock(key); + } + } } #endif diff --git a/core/embed/io/nrf/stm32u5/nrf_update.c b/core/embed/io/nrf/stm32u5/nrf_update.c new file mode 100644 index 0000000000..f253b8dcf9 --- /dev/null +++ b/core/embed/io/nrf/stm32u5/nrf_update.c @@ -0,0 +1,147 @@ +/* + * This file is part of the Trezor project, https://trezor.io/ + * + * Copyright (c) SatoshiLabs + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifdef KERNEL_MODE +#ifdef USE_SMP + +#include +#include + +#include + +#include "../nrf_internal.h" +#include "rust_smp.h" +#include "sec/hash_processor.h" +#include "sys/systick.h" + +#define IMAGE_HASH_LEN 32 +#define IMAGE_TLV_SHA256 0x10 + +struct image_version { + uint8_t iv_major; + uint8_t iv_minor; + uint16_t iv_revision; + uint32_t iv_build_num; +} __packed; + +struct image_header { + uint32_t ih_magic; + uint32_t ih_load_addr; + uint16_t ih_hdr_size; /* Size of image header (bytes). */ + uint16_t ih_protect_tlv_size; /* Size of protected TLV area (bytes). */ + uint32_t ih_img_size; /* Does not include header. */ + uint32_t ih_flags; /* IMAGE_F_[...]. */ + struct image_version ih_ver; + uint32_t _pad1; +} __packed; + +/** + * Read the SHA-256 image hash from the TLV trailer of the given flash slot. + * + * @param binary_ptr pointer to the binary image + * @param out_hash Buffer of at least IMAGE_HASH_LEN bytes to receive the hash + * @return 0 on success, or a negative errno on failure + */ +static int read_image_sha256(const uint8_t *binary_ptr, size_t binary_size, + uint8_t out_hash[IMAGE_HASH_LEN]) { + int rc; + + /* Read header to get image_size and hdr_size */ + struct image_header *hdr = (struct image_header *)binary_ptr; + + uint32_t img_size = hdr->ih_img_size; + uint32_t hdr_size = hdr->ih_hdr_size; + uint32_t tvl1_size = hdr->ih_protect_tlv_size; + + /* Compute start of TLV trailer */ + off_t off = 0 + hdr_size + img_size + tvl1_size + 4; + + /* Scan TLVs until we find the SHA-256 entry */ + while (true) { + uint16_t tlv_hdr[2]; + + if (off + sizeof(tlv_hdr) > binary_size) { + rc = -1; // Not enough data for TLV header + break; + } + + memcpy(tlv_hdr, binary_ptr + off, sizeof(tlv_hdr)); + + uint16_t type = tlv_hdr[0]; + uint16_t len = tlv_hdr[1]; + + if (off + sizeof(tlv_hdr) + len > binary_size) { + rc = -1; // Not enough data for TLV value + break; + } + + if (type == IMAGE_TLV_SHA256) { + if (len != IMAGE_HASH_LEN) { + rc = -1; + } else { + memcpy(out_hash, binary_ptr + off + sizeof(tlv_hdr), IMAGE_HASH_LEN); + rc = 0; + } + break; + } + + off += sizeof(tlv_hdr) + len; + } + + return rc; +} + +bool nrf_update_required(const uint8_t *image_ptr, size_t image_len) { + nrf_info_t info = {0}; + + uint16_t try_cntr = 0; + while (!nrf_get_info(&info)) { + nrf_reboot(); + systick_delay_ms(500); + try_cntr++; + if (try_cntr > 3) { + // Assuming corrupted image, but we could also check comm with MCUboot + return true; + } + } + + uint8_t expected_hash[SHA256_DIGEST_LENGTH] = {0}; + + read_image_sha256(image_ptr, image_len, expected_hash); + + return memcmp(info.hash, expected_hash, SHA256_DIGEST_LENGTH) != 0; +} + +bool nrf_update(const uint8_t *image_ptr, size_t image_len) { + nrf_reboot_to_bootloader(); + nrf_set_dfu_mode(true); + + uint8_t sha256[SHA256_DIGEST_LENGTH] = {0}; + + hash_processor_sha256_calc(image_ptr, image_len, sha256); + + smp_upload_app_image(image_ptr, image_len, sha256, SHA256_DIGEST_LENGTH); + + smp_reset(); + + return true; +} + +#endif +#endif diff --git a/core/embed/models/T3W1/trezor-ble.bin b/core/embed/models/T3W1/trezor-ble.bin new file mode 100644 index 0000000000000000000000000000000000000000..1973eef070cb17d2fb63284fa9c599adfea85030 GIT binary patch literal 271680 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

%lI~g6S64i}a|&#!dU1Jwc3ETb zr!LZ{Ed`oG*I=9h`PE*{n>ZM20Hg)wV2*dn@Sarh=mqS7E=<9(49A}%m@jei`xhek ziVL$wKYAhK9?p21MT>RUCLOo%6V_rxaZ{LIE&nBU#mdOHJ-JUb6?Y$fMiN?n@Q{w7 zWUzgtsYAI^lQerTZ;*M?{ytmV))k8JDHw6czdc~L*xDc$hAT2lz+-*^R87WlR?vU< z`?jul)kYlW8=z9psmiP>L@U(wk*0INo6t+xQIX&%v}ZWh2aaR92ro7TcHODs5!$69 zf<(?ckt+U;_T}8So}ql@KF}-k6|qZSCyr(7Ssv+ z1ht_AyV)!;0j>MJldh;KpHGQSG9vraTUh75aQeNQfH6-Rny(Rgv%YUU_S}ANL*H2U zjTi+tViY+2bmqCf5s1%Qu26NE6>%#Fuea1WzRFQwh<3jpKEKuNW5#AEyfE^h*?fAXDelBT0=#mmJPLT7k>9BewE@@*e! zUOY~cvfgsdgE#j?rj6g_TyK~N-(bBM9UvU%-@DpYD01I)^11sl@44{5ctX_O10DQ+ z)R0GH6Y1#bmygXgvNe*MmAl%y|2Mxs2$xVyd}UZr`tQO zmwPeSk~}>tQ?>n)ccx#pGpST(x!`?uAR3b6H9wJ2Z-akm2JG&yNRxH-=7=LY@+g3R zbFL*k_>Qqyx#^yGW|90Mm{&ekO!dR#VgK1ifx8%|;1Y)`xcVS}kZrXDQZ=3B^#k5R$P!63RPWw{cSKoKkjt^Q8*W%j5;OC`L+nuK?k@s2Y<}4B z2Tr{+pCS1Hw*y{UIqlCv(kY-8Fp&LBj*&?fe-DoXKL3VIh>Gt-1c?#2OZ)$feZ)J1 z{E+f3%APaA8r53#js`ZC+H|oFSPHZ^i2qT$4ShS8%jn5ePMy<6zqf%L#cIP;9hrcUWeIcnZE_ zNscYuX9cp%%DVqlQPu19Jh>0{Hms#0?3vu#KaL+Q9}+h=a!CB>)Z>HrEB}l5(ZrJT zUcP^5{3zrBMJ#;3KZrjfoi$Mm>0ZdFBqb=i4#Y>6ACQnh8~+{SPvyrK3Hg!Mf3bCt z_+g6nU9>}EupYCaM>+XE$t0)?5P-;|gS-aR@DDhk8-=_@dU3-5vP4V}A^R5zJkB4~ zo%PUj+-~mTdkeJFV{O{$q{l!EDp1h`7b1(&2^CMafzcJGRKsx8?w17Uk0_Rzo+mu( z;{o_BTNJkOjw!ZG$5PwIc6d$ItZ_u*Gt-gm*k}ufWTJH6Yn#;`A$xWJi(jel^$2o z9r)H`O|{D0Yn-tQnMQ8c_**;c*Z!ofac8W5#y(ae2AQK zBXEYxJqgPk@~r5;@bHM|kn6%-{1aL>t|r*78IJD2&8%hf$hvru>7eA6eUi1Tyt}TR zRuhRHB%cz{vC6>%nVBU2>7XIXStJVVKUZL;qX=>~C!XU9_VJ=xIO`Fxhd~dE1IUyv zwFxFM+%jYtEY-~r5YM#!g)*unwmx*2Q7wTC%0DU zz5$C>IFeD`1wG_0V4mv?iXB4tFfL1cPMQfWfS3h5M~JKU;5k?#(Tf7S={kbrG7o(7 zEBr3lJ+GbiPMq;9a!+RWe#qhrbl8($^p1l6Iz@}0zz&#jol?Y?u=hQIy>E)R!Y3oF zr;4McQ?RR&U$5%ow(4O((l!uL=c`7m7r?@DXfe7rncCH5f}8{aMgGw0&qF@i&_) zE%;W-f-nbrkW6lrj7XSdyW6(OcFcBA8pa(&*1LnqdUp_>K}J|hVx5ZI@oW?ka?n&! zcZEKX#&Zp9pb@N|8~SP(2ExC)vl5&&RI{l+*>4^5$QIZX;Ja(s_zu;9=r1$?K|-v8 z>~|CP$c3ye_xVYCdj$R!Mbe6V6ZQ*f{SW^E&Xm1HYG6eo#q0Lu+opdkFFH z1^YCV<6}RKJ8}0KjQz{LqBINUvsnPifu*g>dPgLQFgPurud0!sCMVNc{;jrVV#yD_FXRW}oK@JLv zZSLfv#CQAjdq1PBLuJi=MSPPs7FcreK)~$O6L#%ardJ%f!00!!(T|k}`J7nxxIw&v zTpON-#TtGj@Cc*ct@}DZs8?EsXgMmMQbHe5xu}_aH!o5#Dje8-{MvaFR)*$<^d>!W z0n?lGF_D+w)MJky`X;)MkGY%O$H&|?q0!WfU-uU5m1%six1?>b7kccoiiXsR?(Fc#xz+H}DX8VeGT&dN zEgYA#q^Im{jXuoX(JHvrtadMW!jOT9`dkA^K?zAgi8V$E89{+Vmfg^AGe1X9O@;4B zgM{P`qJoKk1C@;d*nC&wzxnv@9?X$#nA^0jl3ZO{ zfV>9y|0E9hz_3}%W?GMZ!O%X|mfi*Qjz2)+BsnZJ5{y5(OZLW15htUhF3&U9uI)IGDDdWF; zg5JdDSI?DrMDxJ$&T@^@Xf(V6+LB;<9xU}oEBsl8ML^tnn_pu*?IC`a7i>dXpJ{C- zZ_TLQE?S8@X0r^s2c^3@4odezns^Y>M5P{UamVZ`T8R%zzr>Y!xbi5jEWj0g$LzVZ z79(Fgt}MotCAdA6=-=)bHeH!H478Q|hw^v( z6znVp`8(BeS?_iSp&_NP9_1mi3|;jKuV{bDEU45|Y)VP6p7L5x`#7p=R3`0pGNe6@ z@2MTJrdNlJw+ydU=y~x|WTftNj16YiJs^#?9zg!71JZci0qJ^%3@wjk?uxM-LS!Qu zE?#1OC&6e1nU}yynGIi}vHWqv{}RXd|Bjcaz)L>wCtk8M$V-5a9c-I|-3{R6$iE~+ zxd=Z|@>=@0BPWpLHTQS0@0mbWks}Zi7s&eYWbsS*2_(+f1E1w1KiN!3CZF4@1l9#2 zV=obIeK=xTlf?tLk8tag#ogEsk}O`2a!Jp>Em*!A-|*Xj97dz?V_1m0Y-u(cg(T13 zF!P`^3FGEwjGL*DXH`H?ZnYB*YgSQ_vgJA2e<*ixkkLje?+xxlcyR^Rze4df`xRrV zV(6G^vne;qb7*kh^l(?KL03FGZs@Z#9&bg4fE<>6lQ_ctK#ZYWOM~wcubkiX#C4QY zAm^lOJtP`F|5z(YHVL^JV42Et$qn#b{@kea=q(A* zWIxH(K-L%qwbk+t8X_uqk%Pt4%&2Qon?VoCf_>c+u|h*{po5)TfVMU*plhSdL{l9)tYBKiFe~9zngp93Av6W! zi%Sy4e=;A=v(9dh8o6==!puTc5?Pt`;{D*0-(vJXqx=`+fp-9_n=nH|(m`dL#BOXX8oI| zOnBg;vRAcX4&_=PYJ>Ea}sj6j(MCd-t`MvqQ z+uNmmeD+aK412?!Xu)rsUojgAjlC(7DwD=zuXnPa)1Ss3xyNh7FUpH(i{+FCtbl(BmQ5 zD&T!KaE`5)VJKY-f8|psDG^o~`ux|R&VuC1$dz?%6mgC*ua@J?d%THkSMz!|HYwt{ zzQVnuYNAKwb&e^UC5R!jS+SBIG*A4RP2f=^e3{cgOp=tVFjC<>>I9hXb*MHmHn7bjE>1L~3HR+xqlC z&V|1{ymOPFW90I_cNVbB#fRW;PU|zxM-$#n+lW5+jT z4BLgBQU|gePjtceSfd7NOd+C{uclAdB z$udKPJr--khxYYs^%H_SqoAZ(Ih4E7n5SLdtxGvQVOqn^QI~^}nBMnO57PwLN20X` z$9vrZFjF^Q;br;Huvy|;lw!lyC=AN{-$9oFV zBX?en}*c$%6%N`3&iAJtuOv>YnYB24nqw!diQs74a0!f`jY2}#OptjZq&CS z4r+&Vlj%jN8l!BT^F>6l$RqoC=U?H)(r<;ooB|e5eXlo7%C&t25Bi<;yPnt~sq`x( zwaEm||4r}X$gD{G3;0a>H@<_M_g#5#E?MzSvYz)^<`*!9tUQ=ecG#!EtuEQ}Yh+}Q zWO04}$TZ>r8Dgz}wj<4vTNUXjgjQu7+s#+u%@ox^c|PIek9I%rBt4}qSPo$s%O1d5 zL}#aoUDzefcAPDUmxR1;rk1uw6e{s6ALtu(4&6S=5Aa8<%#&Mf$H~1 z)MB{!y8*)0H}z32L6R9mcq*$=7VTHIT->%u&X|=fUfWMG>4-Dv+jep5!pjoam3q#C zecOU`g0C@uUwS=em5AOQz{!_;;FNzWo5Npt?rr6A>jrCdxedriXV!uzp;MIGj_L|&2<*rD#_qjAf_qjAne?UscZY&+UF#~pE*?M{lXN<3yMaaqe z__|6@XiuYoJfQ5=lqFT`9csi=e$!8$tg`1!vUp7&`5sYB6xlycY7l!K92>gbI>g_1 zBIcfudA`CfMg@GI;i45;|GvU5X1I8J|8}g4oj7O@LwV0KfzZ0bq8Y(u#k(`hAHbN- zEX~9-mi`CWSf1ElfGEvUMCAg*!9Tk_1+l|hEb6?3&SpLd62S6dNA7DgpLJ@+oOdNq ztgcRNh(}bVLG)mbopKdhzVoQZD34MsF!_`0bzul zjw`#C#~)k4nQw8xP4Ra@pJg zxqYZ?Y4^}lqsreysbs?$F7EDokCnQel^WSe7*|wkn)woPkf>N&?3o7V*?m->q3@LQ zkSO3+?qoj7w@g+*RyCk@gg`;HODO*c<;0gJpq!EsE?1W_B|8bj2yYEKNM_D4l_wIGAV$w)qt`=6KD0go8d6b@uoNU8I zbKiMZ`gP!+CFpx~-tf-sAO)25_##@^02O5oTupd1gAAEWXpJUP$J(@bvqA(%%81|FjIk)g!cY!hjIOLy8JZ6nTw;NH| zNA0>Iidy)0b*tVzoV6v@g^*W`@diZw$D%gJkYUakOEck+pXw5eQA{oP3X6fKu}ksi z2DStL0U1|mJX0x%jrh@+Omcj%B6jNgi0OwV9%baC48p-0F77}X`K*j4=nUw&(0r42 zn?aWreH`$rkwehxporzj@?&Ui${R3TT;)H;TKj1~p{Bs+7`qR`X&Qy!e+hVgG&gj+ zYoHTW*1}30GYsgi6u;Qx{ls4gn*rf|r1w&uuNgg*6P5CO4Hxf49==x?C%DD$^;Y(u z^bDm>+`WNvw*cEW0mupy;N7m}<=F26c()hwl)yVCyQtOdssxz5){81JT->TSR&Du+}m?t2At{40>Z zUuPck@J_L8!kI>#`8_*x2HA}+uOx~$60Y!{Zy2(Q$o})M1-0BvIw~aTs6_R%qC~0W zK4`k{4f)Rx#<=~jR*?BvLF$8k^PAY}fo#X1dLF1QXH>rci}4d4v;wlj+>99?iAYoG z9|Ll(Wn1iYg}dOLJ#aa$d;rtphgQk$Ln8#3EMCH7@sc0O;)biPl2?lj zxLQ7g0@U#u)baPMe*Xwk9DsZTsT}zl6v)?r+%`Yzk84XSunJGCRv<5f+#k(9?GF}n zSn>$^W8VLp{)hst9e##X8g`h;tDT++@TM|aXqTu$udHS{-R2MqcG&yhL63-7u^Q~z z62S9AF=G?(dp3?59J<}Ju?wS!V{POFL>%{cqv3N?4J#S&b20B{VBTw(6!<10-e<6R z|2tsI$k7YQ$WMRziaFLu??rj_X2sD}Np)u7XuVl=xGrgxSi?ZZ5u$VvPp{zh)Ju&fa?ZaKjiz9rvW;;57B1g?u{)mEM_GAWxav7P`uXt z0X-G%@dVc-8*-rCt0_(z5%U@;>LBYyk9sE zUqWr6r07`aQ2O}<9Ov~#aVhX|dy=2j)LL0=pSh)r=OmZzJ)lMdzg_20*dp4Kt<}>) zZ*`@;2b)EvsN}WXfyuApH({Vf+7>(1`9@e&lk55MYg?5TU^sM4mDGP@=j8qzj+UkJ2GTJfQrn4s7BCN3IOhYbv7xJzdDVG85S^g=R?AlwkBg48)Lb1h=Mmc!2 zlLN@t^}6}BZjA~UFgH(1+up6$yxwgJ>vGXv?Tyj!cgTev^&O>UwPllo@0!9VlmNRz z2k zkKgo|P{teXxkL9}w3zrF;`CLQo;o1f>m7sO%YdVs3DD^|2XDboId92k~?eyp% zB^W@@TD8KdVCOzNtxz^j`xtE-q8)8KAqJd8w4XpX(U=g z9f!OP%B(}Dg}vbt*AmgC9;RHUSYKz^gH^SC?rbS5M!inGGl2MB!J^*zjzj&**qW-E z-z0~L$}oQHbYZHPDc4KVSkp_=wfapM8_!AC z0xeEh_mY%{b7O+%#^9W4oucXf^sd%Gu43KqyS3^Lm$0c5@tg@QagM$47b|wk5v2UY zs%mx95mrm}E2BZjk=EOj6=)fLbf$C9T#C=6oXQ^zJYwaW=GM%s&aG)mCLaVIHVLAQ zYO-s9A1hcIUD0l3)7)y(?M8Gd70{s$eD4X}vk^5=G{FPSc(-M?C0vR$MT?PsnTmUW z%vcD#JdDK|(c<=Zxx7_Q+SAimp>{7zKh`?mF(sYrQUU=CbM0oM@@A0 zUp&ki)BD?j_?iY=bl0uXGtNY(2Xa-2*$SgK!H-%QzsaU3+GMpBnf7hA&>Q1xl)pI% z8n<@w+SDE{M)yvgt*9!(l_xGKuPkadM|GY|=8Q!Zbyk`SE0Te)GG&!nbM)TiW^?z^ zloT#2bWK}yGWoQJ_J}#R?341U1-w5mI@&KhfUJ_3eL~k1;cH-F@Le51+*z*bsfooL zpI;+%^V$b{SNFM#8}}1M6~$wm^KImlIpd5l9Ed&%GekkdOX2oPtEQ>h8s2om8qs8| z&^9$!#5PsViE27g5#3~*6Vuc@N7r;>j>0&n`uEG4tDlvW9bcc;T;Dh?7yZH+TBdEO zp&cc!r_Y7p6Ep{umcrU2r@3NaF+kqzw<7^stE%e*#U{%ti*l`MgVCbgberwxHNu*` z-GP{gosnH-L{}1GlUw2?O^XuraU)=r(Jlw)`-j9;Z<3Pq>Ml+AoMPBNbV>UaFGjmQ zc84d2x!R?4`=6wAw^+=b|AT$c{ehhImR~s)7DbmiOx+chem(!Sq`^vm>ZoEfBD!?% zp~MwfKYoE;UEQbcD%Z|9qfO--)zGB`Mu$1^oI>5D81}C1_T+c1TWk37bE>&9JDoe{ zq8<5B)jN>k>NJggeZw@qX%6f(FS~ZmHOx6Pcg`HDO`}V>N%-B`nvE9XGS#WA;3|CT zUs}~&e4@>%Y#JtMbxAcXX3c&sTNriLHMa&OYQnoT3A}#2#JgXu`EBuxGn%9%8kzQb>i$)&Xu8&;*vwn*^e8u~8keH1SD|54 zJC$o=J!)8}_)VZl|DZ?BV$o?#6g|xwUudcO4TrtQ+jiyCfn1)k?d79KW2XSSlEm>y)+h`+}WnrF_h@ zYCT$KacWcRi8^j{wR7vLP3B)6-ZGcoF?FdDK9CPP`E1TO#WvO2Od~;&{MgnSkBz@^ zYjsRpWfj$6J?6%)E~PTQ$S5u;oHN&0rA6i!Zfv3WNBcV%p@&X$2Npofp=|oDj>{FA zfTIBZe4^&z3!L&qHP!M3m+Iw>;C>sW2=Hr-iywcuRWUkwe}ct`^Y~F}0 zy8NW(>H{9SzNDw-ZMvhWIMB1;ZMtU~Myh9(dfm&G=2Z{dj!UWTz2=wq`;#}eQj|*l z{)xoJ<9UBrMcA5+w%-1}vV(RamXkLoSQPe-i251*QQqc-7vc#pP&dSZi} z%bx5}HZ?nBsh(vMq_xmF_V*$jo*DoR^o2>B z=%${0es*i^`M7m;6h9%<#r3H2=ESNtueGFrMG?r z8LKmLa#>^8dS=TtOCv<4`>%_Qc6R-ekq_Aw702tC@r>BJ0_Sz1%(Xtuu!xs6ulxv# z&WwIXs05rUCC(YyUH&IHFeU7vcr)mnau_0mwJH$|Nw=($Xc^H(<0`~+i<8v)f)Yj2 zjmOwc;3avi??W|7v(EE6ZhcKjaf#t*T&zy?@yTvgQkxXZyL zf9%3(Z{eot!I}?vG7B+JXtrE7S13K~jreyR?-nx2@47(Q^_!-@<=G^><54D!au?dI zjXUi(HJ-O8H6|6rHWn646iY3qV8s;gVyYB|`wC~GL=AlNvBsU#H0#lF=T7)0V8mKy zrBLd@d4{-SnJVemKnr)f3+zq5z~7P6Onbea8rxCOYeki^^4?fbjSOApCX2cK<7F+e z#W(6zuQ!49rF8?07c^xm_+8>TJ`B@;b`Q?eWWZu3B&T<>=2; z#^&`F!?$0b3t5X&x$mJ1ty)KAwybqz7iChZCk6G*1-jxS*y`msy;f2ru(-wcnj%CsxH~*c6rI!|92h^Y;1zU1oi5 zQo(x5>gFnNLiM@tJ`-2lUXtIzaP5xPXLPmfl;^;={(O!#@Ktl~C@v{1;n%UL#g0Lq znZnL#1mV)oS$iV3YF=YDhgGeWVrurbs+6FpV~DE%eVMvaQAMk9bt}gMu34e>FyVd| zc-(EFuYh`oWDB56cO4M!hW~?g@Jbzu96XNQZvW82wA;#F$L<4EyXD^4wt`ib zwC3ky-)iO5@3e9u6`2XmjDd7U+MjI8eZ6pd0dRjTBmQ+6yaRwr-M)-TGUG31l6ZX? zld#wim|MMlWWQ81b|-rRhQ&DUZy^w z2eod@@Vi1^W444<@tgI+1Jh!f$&*@6&k^h(*p28-c%8sh#V++FX|bZtEsGL-*C|W5P)H2_7j2K@A%-sfl%!IuR!?!Y!7Q}T<}V5=!T)@jd*Y0; zYK~lg5Hm$j5pXpwwm6s3Pd>{UK|3oM3LF9n6nFpDoc{cCM?$y>I3?3NZ5@U0q- zdO%#0uZyn=#o26r3Fv+eQP)f3TH5*X?kG<+#yk$(#lKv{A&?!^9QXTJZ85t~X2pMf zjtxC>PIFMTNwI-RP@H7bRtcH$b26i`ul#M>6znA`Gq+Fcz&uuLt8V+Xm`$tx^GIrD zeD$Ai6wk^0&8^t-GkhU}vtjb{2s1mJ+ig2g&rS~mNY?Gnt=w{_48E4ji~Dl~uN?hPK|vCTGKn<#zY?=hy?O1zRM>3|sb-%Joduzd((l zwOTQ+z?bsYi)1NxfxcsIY2ue^Y`&ChU0`zTc1vc>^zz2x zlG41_?n~K}iFhZinaYq>SgTu=R8y*mHoZ&gKTeSWQR+<`7O`dX{8rJ_plXN@mvMqvWeS*mTzM>Do?Hw=47&_ zwbPt+(Z^0mHQRU1BpliaZ&up{!k{^sgh7;oaL8Hr+ffy82zg)4&vRss>UQ@3d^Wr) z3^5^m-rl`TrE=4^1xK(hfsO!YH7ymOl+m$z_z53`jgrAf_l=0 z8Fy?~n}RWCW=%_M&O*4xF~{z$H^;HA4=fYDJ(;O#Re(AxnK+5l6HW9bT?1KDL- zgu}F_3v1<~qS@8<9hs{O2iJ~X%%*Uz)dft-Ki!nW<2jkBXw@)?`knl<>qpP1T65e= zti*pfgYUluv{g@l7N^gJtVFvFGpl8%eMRQ3R*uWFy=?;oT4-N30i2{SWUIiO+#q0w z*&e7nCYn78P0BKhQ+(6e5=-fE_L%ewC~vX6pBv)xU57IC4+rq}dNvIHEic=nMk5Ck z20khbCvdGVuv6e@%xEkE_Y&?q{WIo)aMnMQKiQ>7h&lTq)`Za4wzr0I+ikRhtjBut z)9KKv+2{EX*o4@*%EPhw(CvTM25Z8qGHH0t__NIT(#}EefkI-I&BZJu3ZQ!LAtC3i z(Q3>don^k@)(sPT`kudHzUJGx_1}Al<4ZezdEU}a)9&6g%qH&1Do;49j1f6WaS-|T(lNqg?QGCfLo z@9$^$S1_9A)OY-Rjt^D67P49AiCOyGX~-bAzADAf)@=Epaqz60Z1YFnShS>QsqNdk z;#w8t7EZJ}d<(N7Vhg)r&=wAnB5pSG8?;*#8=|%-H$-nyZP0B|Zy3Bq zvw;~MvZ3F5tUpxtlcasWNz$4X8?^iSz5m=#`vhs$SjdoQUNsq!=Jyza3I0 zwW4*pf}~3`AVF#wG*~iKYz3X!DzT2BoavWe>CNRUq@m6g(y)qZ$BURt?tqjD>z*MXWqL`LGQAY+cX>@H z`W=RThs*t*gnpy#=u;$mu0_w`-x@xn*7-E(G4?^}BWJ1t{Zc)kYJE; zkFjkpuLL!RT}2L)a={&M+v4HqYA4ci%HfrYw3gnwc&jJ;`h*_ zDyuq&NsMXMA(EHIR$0EvDW7D3GjL3&GAJ$i#SInj=!1_~ac`Fke~8uaLc08P@^*esp+_y>r%sn>~)4`^;ZFC@*}49hrRwm+l9LCJj^vF(g%8pI1M)854^unN9P$o0mi`9={L-pQohM@|1s>dm5Jav zk8H!`tdxeBPe`tcO5*P)ovu^LHCJ2ALX4~5I}?^+S;C8mLqTz?(p@SW(wnUCXfmaI z6>_q-uv3PhyeZCq(fQKKDdmWmh_Y8~8#%L5iZGA3jkqoCjjFFiTJb z?gxFCnZoE>u7geuez)Knjf=)AJ;#D`9L?GjQg4kSVN=X#?DiPVTZn?w?``b5IR_qr z4Vz;6z4cwMU`P4%Gm2|2!D0KfEJ26XeGYq$dBPJEj|12?*Yz=4si514fA*i%8m)REYE-}Xk1jplZN)pW zc2wZqnXZvJssx`t)=B>QG~(T`O{Vc2ZjH^31SO~rWl8^ABYhu~z!m4=I8M>rqKa}Zk4$|$CG(6U5}*P`aZ?XDd9z*nn^Bn z86oMVGt5-jqOi$x+$P~yZ)ML^D|77)#dDvDf={61bxP3VDZ*yUB-doy?ax>wgKh2; zOv=>GQG1Ngo-XZ-+mnyDr&BwJ?b%kaX}Zpnc(J~Nk`l3=cyU~x#-n_P?&kFAFMfR= zUumb-vpZ~23i5k*kIG3Ds25w{eR!0NrKiw$x3uyKEJc(mE5%YYU-$`MKavJQ<~7)N zM9FmdS$wY>ko#HS?#;l@U7){&qb&itOfd(Ewh{gkUjKymhv-|wgq#U8Vr(mG!o*oV z>hWCHb=l*s<7X-%Ur~lH1Ft`BhGN|~D~G)bH(Ftgz!@$xILWGcT=Qg@gVC#?Yka!f z3=d$8;TmXe9PbGgotUeny+Ph)eBQ%y1b44HRJ7u>lVV+P;{Ed7@9r@15n1QrS2r(C z2LH<>o^rGL5YgCm!lMHm24gK7Ry<6+^(r`g;_3HBORUj|sCbAWhyE&{kD8Xs=ogxJ zX5j>$3Bm7Ycs~#CXg#`oog%-QoR|b(0FzO3H_pd1p?jE~qZg_rvpGaOB~8tqYBlFT zCn9~r@-53)c&8#wjz@ZK&Vi1qz(b!_16nr*dV+Vui2xp$oPy6o%FCrj~A@rZBW*z#oOm-wM;v~_g$7^IqsR0pm~wbK)C zjmIiaF*JvYwO4)r7(NIFLo;<&=Y7ck`c>cS5NCA|bV$wZ`N+T4cjXM-lgH{cEVq`BYM^sB}kDmH%Lm$jdeeyX_Pwz3+EdGJn~SpjW1+xMV??9M*# z7<1rUQYMEUWj77aW>eqAQ=hl0pL{3B z^nU0WVjYq_6#ZSBKU5skI9;&Uf$J=d>>T4O})a?9+`@DntH%Nsh_z2`z;1?Q2*rRGiALDjw;JuRaPOwhQ zo(K%81jL*J%0BB!0v0Eu=E#hp;=%!6S9-SEG3wL)L?q3pY^{$js2vGx9);Aak$Qgr zmDEnzW@D9ztk~ye$V*IZqWwP)bK-g5ZcxEtL+VlI7s{FIKEi6piF17}sobO#7J!=?OLC0%$Mc7Zuk>9BF=gA+7=;py!Yzm! zuBrc6Du)jbPQ1p)q?C3p+OyRYhjy$Dw4>yzmL`|)^F$$rP@nggUdmzH^DH8hL}qJH z-&3gX!2$Jsdm2xA|3=`R z&rw)ujSX|4EqE7P^E3^r9M#1yM|u_DABcKIiz7b_rlBw{ItVd#- z7IL)GqITUbB{0yVOQnm>6@oHp^t>ojt@tLaY=^*xcR<*d6G- z45JdXkP^o^egC316AT~u%1?i=?>2Js4i#}<5;P4_0(|G``@G-vQY@@sd7;Ha#m$$O zCrh0*(9e$#(D);OJ<+oeF|Ct9X|a znDxA2WDWz5gqc1r5!&|9Cg9-tY-4RIe41^s7+izv9}~whO3+xW&;h<7S~PU=uQKC) zbCU(>TAx2{6r!-;^fd8Tm$t1W5?H0DToY`tFEysxsD1Q2*~TRP;39tw1k>BmUK$tR z@iRHk{Lgr-9Dv8P)&q~9nfpu-kBKi1;PDfFJf<{hzzF!^6&H2sp?e4#VQu;~&D`fr z-U~fY8lwa*Ckhf0#Jkzs3)>(^AboC^LC`x?R$8rx^sos{zdFo(AZ1w~FQo@9&WN1} z38ZtQ#2&y*8T24D(DuVBYqPLXVkT%vr)yC0v=L+@&^jajlwA$06|Mbt`#Sqygvdi% zq%{Y%(mgf|&tj7CiCH5DaY=4R}!u@x|=P0u(P;!OD8Y(H0Vrzyr zAe+HARtU=qEy1@5>ZBFTNM{IjtjA2Bi<$19!H`jENiuXP5A6ptXT1W>@fGBIwx-&` zRZJzFrciZj=HSpV6p!LCWd4e6*OVTCuE-}HW{rw8DaK8AvA6s#YeyuxC@+;!4V-<7E< z%AD9|?s;adMd6wY8mp}hH~FDS`xFQ0rXMRu%G4Ef)$GSi-4nZNIU_UX8oP1f7~3|; zcg9O0R>DeJhfZ~|2`bj6+348XUlz(f8BnQ)1x!4)VGJ z#PWk@zwoR-yuTv;$sgV`uw~NQpug{zueC2q9V&ivRY_+(_7RXj#54MvQC3jCM!bqJ z%Oz=@C#0CyajjjBSk*x~k|snUUN?McxH1;86^i79qwu8ez6De++BiqZ1`knrc|G!K z!d9|x>uf&6i@CfMB}zFQDCMVP%H*Fe?s0g1oA)o+vr()BMy&U-RZK#xjfL*}y**4y zBe-4BJF*AT3s3>kTiuhqN&&frNtlADbqvnCb>c()OiHVJhbIv!k9Wf}WwMS=jwa$t zWl{QMl+JG2f{190*nC;}$vrN_o`YVTfkCR-aw;lGA=e(?vjpS&^dvvLf;^uHd9AwO z`IF?9!hd~^pM;aSzv2`+ zGbSe{o7p(4^JLMmtY~pqKh1}c;!;GuQgcWL{PCxY&WV=OnTw*3j_;2`tl5!bA-um( z^o2pz$SkA48o*5>mJ7Y{w{;WR`|%ST<1A+MG~Qb<*0sePV|Mt*{%t%zO}GS`jj*L$ z0X%BDboQ9(U)tkJl+ba!i&h?8yJkGja4J*Nd6#k6js)7X3ZbmH56 z*j=$SR@Y*O9)vk#(CL{J?7OS#YvG@%3uo#TS;(2%&2D{OQZmJh_+-wVx+o@j5G)JR zu+o0jgHcaDdJ!kgz`K?{mxo3WzMlbOrT*`ds-n&NOjkCnR}`?MkB4RITO{MPcqDY;=RM1)#Z|Gt%)}o8j-Q#1i-kyiw4pwaL zvM*#et1()(o?qao4S8Go_wU=-gC6^2`*?a^xX2q^C|zAaoqUeggv!6151bek{Sn!zKsIJNaCd@Cyw z;OEB?hHvg}rDL1K+HPrFV*e069o704iKpGeGOQsQ+(YiGcG5G`yiJ9Zb6jEro3^rM zun?6PiX96h8qIfwgxEtCZ{8K+{}(|%IMl$qFYP~;Y%Yl@SHn{9&K&5<8Dh$ZixF7; zz^#}>@49Z4V+^b>DDBLg2z-q}^aFT(u+i7D?pd8?#H51%`oU@g#f!{O;2kXzYerPh zB1=(O(ZM3V_=M-yoOC(oFTV6Z&WF1hgF?79fsy#Qk)jsX>Tjj)kXX~_p46NWIqjD| zcvzEbnN7Z?6JVE>jFR>9ZU69mZYQ3~+>@9??Trx|e8KkK)JG zFD8&90wrSx85oJ15(Op70q0sk#ZPjI0zjg*AnWWqrAx^N9Nt{;A(z z0KaN=4U+)=d7Zg^)G}~R@Z=(Tw{<10Dl4h9w1_#&xbp9B`>5ktL{y#V9M!$N_oI#w zMaa===z*z|qhvYjFzqL;TCLVN6?~*xj`&LUn?p@zal(qfOH2!EunFO`x~Ip8Q<_z< zdpuD#BBjIKYL6-BV7bK#rt<%I@gUzu8$XSjCU!=cyRwU zt^>FlaJ`F*zFmI3fOpU0dIr}^%Q)t5xaj*d{N8}8&&e@AKNzP8psH zaNUDz46fn0g5Sb$&*OrlP{xhxHC%tgm5=LAT%dtW!!sPS5myGTV7~vqehrt^!Qwt2 z&@C>z^C*ws8D-;ArU1$|_~IN{zFy*-G4SE32+X7ZNdKr)2nXXy*M|e{e$xePx9J_Q zJEE~#mN!z9H1&dEkAFn|@ifOQz%>omf9uN_yq{^kO{PqD_A+CRdsytVxjpCY)|@E& z9Q$ya4J-0|TMX9!;LLarGE?61iDwDg`mg0rBmMc^t@csn_mqE7$BFl01%TfM%%#YF zKG5b3IJ*YraqRL;wx-H;jq3f(V-wVvNxgmQK&oXDFka6}Y*@dyy6a_62=FgP{H-q} z@O>e?!1-sd&ETKE=?lwH3MhhjtS>!~>H+Z53Slbf0S9`Z=~WnqTTd08dO~lE$vy<_ z?iT&5&WgNz$E?oK;%y5LA+ppC>012`DbjR*pvL-(HKs|kI%nr1`l6L}Mi|N*2OaFf z7SN_Fc`oWP7Zb6560JIqM6{Ym ztC#i#Aq1Kv&vp*8oz5YKdCuF{mT1fCpbhnfA`F#AnbNOJLPsTSZ+I*AX$C%^9TTr&CeE8W`du)kYo!P85+~ZiM zo`K)ZCG$$Mnm0Q*(ICC!A&gT3<6_{ANGU_}5AQ#4T9YuMrtX(`R&4W~DoI$RhbHj) z?&^;E?y?TrHG#KEJ>_7M)^%^c;vHe7abf*gn*b^-h6G^xhxbKTW5TOkTP&x-Y0^;W zdN=x-q@gCF*-eO>yo1&xL|ob-DeN0k6j0v(n&a;mb4&M+cygKrMHX5Ux zLu=Z7HWl^{tv;iW+o9$Ubf^>ZIwFlB;kg~dGD1RgJ4WSyf;Hq5KtOj^AUjO|6 z!}}k|ZQ~3)R>yQlnd2h|clNx!_TpS+4T)!ewX4N7T?f#nzjW;nv^@J_%Mq^zvzJ;w zx69@@b%x-0*84)wJ7>??Ve1vfiud$XU%Wrn{pwjxZb9P365f+b$Z&jo<~RErOR5*; zEix?9mvb8*TEcErPhvK(;+xWPxfQ#*m*SUc8^#?Np@ziyDM0?7@|bc~Z0KKzmMHs`fb^{ zRu(cPi;XY3Tds*oP@z1Pc%5$pYGMo%5!LEKU~IQt%sB?|V6ggY3>xvV-kZ*#$41Rg z260rw#0Mo)c@%p2d{0yWbI5Bsv^**OF0~N(6?}y-3vG3_4%-MC3&3U%e8-u}(@)cU z)X4L(utyWf{Rb$@FYz_#V`iV9?sIZabILX7Y54QphOf%m4b;;paG?L`rIO-L6GlXL zeSq?bLu17(xdtt27*(!$hah%;zYdxv*QaB1Vy&3*rgTKd zIEWJ%9VAkW;UnCQ!Y{q)_b%d;Apd5AR0EbtA02gLZ>2bniTU-X4mLo@}5VrA?5|vmDTut1lK-XZ{wnMMrt5`tH)K$5vhp-=TE*) zi1Yu$`)~NuHMc7*u}(eshCjSN_A=M1Y1N%QvE(BM`AVVu9OS3$6xqVLnPBT^;7dO# zmn}@Eu*s3fhC(hgEX&gVPva1==JGwgEYWo|VLfXL$1aI#c&FD`N;$dY@MfWtxl8DD z-lcNpmu5I~OB01ZyqkOTN)>IRSdz(&6yrW{p%20RGszoP)Ko}{mQTv}wegYuD3(lH zyk?MVSKBbea92e#?f+SR;@5c5z$|B0G5eTrnbQo%9xUajM8n_c*kvbv)rr5d*Wy0| z7s*}A#^R#?-o*70u2u5W4eSkU418#t#gye6ApaxT7Bupgf0%QxeG_x{ca4Cjxt&eW zS@=$7(JWW^WJ+NcP0Q;ER;fB0X~!^P_HxcZy}GV9{lcvnJy2RaUE3RqksB%B8+x4* z;{?QQ`K1RP)usHxBhn}n_yyDZ@cO?^3Nam#lJOjd=ka)s#Pb+DN8x!ao`;z7U)&}Q zGgag7aMLOLjWcbK(o7joDNcq8W}Hnz|Gi)KbhmO9TECgWzAfa!cjf58e0BSG;gkI> z{2AU|Z#4#6_&rV?5qB#zQ7Ds`Z6O%9uX_j{N`d-lEKPR2ffk>7;SJ1i+Mo)S)h4# z$t$fc#b~z3d`CN3W6He9#7n%%-=O(Lvu{<+?eT1?;%!dI$Wx6r=RB9&a!!39BiABn zXWg2G9cQQI_TRiw-R}vvd!|^YWZw+zuLkx{xJol1-7`*ZMd_cn>`6vD?p2lknYJeg z^#p=?Y7pviJ!pG=ptiRWUHF6YGfh5tEQ0eT%~RcCRAA&4M(_H1x3PxGB<>Wa_& zeCy@&u?6q8<{+mT@I}AA+8u1)-?1}ahW07sHtp$Vpqn;oGgi1xX>LOHDbz^J+m3%;@8c;a}s8pPNMlP%L&(*u1Mp?(u zl9d-*vXIJ}8-!G0w-RNA%dPqg_Vq@ITVN>6L+lAoJKttpld-HohQuJ)3{^P`tc5Z> ze(!tWY?v^SEUm$*-Qm0YY%c1FRS}k#{(1Ywx~5#w>q*_PD-HDb*0b9{)yD9?1fp#! z_?|s><__x}*>`58U-+(gusGx@y@-QnF7YR^2^>7DVV&xVJxg@u4!3`X@ZIU{m*CV3 z4={02RR%f-9oJDMjI8oLy)9dCzoRp7&pu|O$$Rm$_;-NOp z2(-zDU#8YEJv@h^L@9*LHcrnPdc3uLOe4i2B40!13o4ZK#DJ2tP50rPl*$U8?T{|D zR*Ij(BwyzmJ~O}IZQGLC80+xt;V2;vCERfpwBEMsvLi8iht4Ur;EVM=-X~CR8elv~ zhH(ON-FQ{5v?e-(giN=YX`T^iLrI`N%Uv^!xs9-f?YyY_{4GY6`7br9plhZi|A*-B>OfsggD$6X^?GTncD+>C z!nZDC6FM`B5=4&sywD;J;wo3D^h^TIp&xy$!xCOC*-w@sU8p0=v0j?2MS5P5P_-b| zG0)+T|3!G?Xo#ONrm*$V;@UWCTy{Jl_aI>KkE_nBgL*VQ-urr0ft1p5BEW5Ys|xl@&b&Yam+Mw^bS z`S&8e;|%=TTQKu@1Dk+zIq%!>>(mFoJWS%fh;)3t`~?(YT`ywI)0g+5NtU&D0_y4W zX=+PMH@e5-{!_WmL~A0V^_nltK%HZ*s?%5)hBJq|eAEv{AJl$QiI4Ts$-1d&7|N-Z z%Nc4N3hvr`Ap_;GSCtbEo2dxQy+KHkjTB=_b5@)Qj~Pg#ak8G3Z$Eydh8-x zr2t&%tX?r0`VLDAx6acbMDf z>SHpU@U>)aA8Pc!Ib{mGDbbo*7`8ob0`q6RoLZCV|B_x3-nyDU*vf0o3=6;R#~G%5 zik9!;xC)d+=SL%j7ix&&Y_+^9WmV|540DYsVJH7y=Y)>K7{?R!;J0!HEhB2gBz$HA zm0h_^3a!{|WA#ypp1Hlp-iQ%JY#3IlbWgOV=0uesuA0T*3L{x(naOI(o&YE;&<%#v zVjva$#gk}FlE*C@-?Ilm^8jKmDhwfS>l|wFlirXjgH^SG{AF#9J^L^RZU!y6e4YpCT0F+f&~~IENY~GSuIup*aGbSp#wcN74lvC29DGKthnKUm znxQz`9|Frclk-(+k{)(CCZ=MIq|lOIj@MUnI7g)2*&N2unX%Avo=-4{92=UkeFdnM zUI9M@`(Uvg4%^3XrIZT4{zC*j{_Ft#fK|n|ctmtg5=XH*P%pxv@Mg@Tgs_afj%hkr zPQV*-B)k%Zijkq&F2ekWIxMo*-;Z_os>8q234iT4C_mHbEFzPbGIBnU6#7ah%BH;V zc%&5Bup3>QaT3#x(|$JccHA?j1s%`n9_#p2u498V*>pOWBD=oFRxePBX65{nX`(_o z!V%i2N|^6334RSq%99t!qk>lt*7S>qO01Jh|Dth)WVY?{gkKX(ZxtxVUy*~8G*i$* zE%~uQ`?PDF;d1^1@KrGMnChl)>q6iWa!3|R(2o!srRP1QR~nU#x6BB!R>G4>l}a^k zgZ68Lto_;qY>V!`lKN3Ee+aDEpTYOrT+Gk0xQHIk!x$5vLmoHvf<}aI=C*J~BSuO- z#GQmb0eBfL(voiMU-3+ORcQ?&GmuJ2>BHdrPa|p|iBOAw`V#TC-3Q%iXagWV2=ake zY-5H#72tVS%`C27Mg2V zOQ!qtA+DhO9vjc@aK`&MG--ZwiJoY{*eRK{p+dST9o|Zx@SX9fv!O2nI+Fo9b6iqo z4Hl0|JUuTQEPf$v0!|Tb5nk=WJuid`Y}Rl{5FVBJ#!+K)2~O!1sFC2byymq9e)uqL zlN8MO4Cq@BWYl7ok1sKbQ~8^O3{k<8uoN0ae zDJSi)sL%1@C?ECqN4d9Z^cMB$Ir*e&Bj}J4bST~EE)11neb{_l-TGYuPVvupFTlp< zjO!d?c&f!!{VjF#8iUYzZGpl##i2snuU#@^)QH@9sekL_{^2}5N0&8t1`EE(wXoZ} z(ife>!xm_?p&K#KwK;0pE~wkP#K(zU-4WJ^oI%-`X|}k8SZBDEhg4w4(>o-lCCs67 z(ENKE^N1MAFW<9X)CHyfrl5~s0e=PuY?8w9OWK<)jf25YL+}PY$Zqd9KH}oF zupfy+i2_PocX^4j?2x#8M3qIGenp#>U-kWa&uXlTR9A349F4j(4dJL~6Rd;D(|#rD z(V!giPj7B7LOl;$RgR|VkpboWFZ+e|dr`*CSCuhvzt9c-_Oks#dmeHbuF4hMFT8>M z!qb5^1osQsoBaC)O+%S|zI|@#@sLP&DBwXO@DISF8)pbtYU68~SnS9&X3c~%-mHBD zm!RyFX(aE=;TY}h-7757u0F35zk^(U{V{XqJ94Y@cczf*wjiJ1e z*r#hTHs2!e`~M|xV6WG{2H$sF_5DW=mAxWRHjUe*^3yIW-`xHj@~^lmKk2^7d&%}P ze1H6^?^l=4W_5cH1m-21-R*S;?zwE5d5FD$XTo2OX5vCheWZz==QV1u|D<TcZ^I-57^GjG<+Nq}Td& zuobe7>t^t&qotd{Ysos;wiS}W#Fu0=ZtS|z#3T!fzal-Jd zk)SpApohzaxs8w1aw+h<>8HFazi#Bj-@2nua)IZFDt7(X5>t_Zm_-wypMMwDopbI= zxt(gXQ>G~^$KuN`h{4SYv(d6bIc7Mu=V)V^9QipS0F_awQz>Mijze8(@K(V6h!&Z$+StaFp?;Tt*Ih?1kRn z|6GF0Ujo`8HaZ$2;K|rOR$7#?0%a(KvPPF=noy+*{f?|MIdO8AzH!6Fad0%n0%rg< zx~8+B_)46$QtWo>8}WJ3<#FYlGt5bFrL~FHE6&R2Xr05I#Hj_}%|aaVZCKy1&N;T@ zSL2M4^R!?rBZR?$c7>u{X%we%&FseY(v$j+Iyf!~QiZ2X2Rq;e3O4LCqVg!Bez_jU za0k_+39N|}-#}_4pUwWB>as=vD+kGat&;nCT&epmS%CMMjTDEM6YYq|78B@m=y6y- zLSKx7#+__=6!`V`e5?eo!l?HsMnc;#C@Wm9quYC;heL}Ujdjv<6XvYpdiaimtr<~j zD@j5~Hdhs5bRw!e`07jecX(!=_GqI&f_V^+_mU+U%9+2$-2U%$wufuCv}+f_gM)#+ zv9_nZty+36YG66=-MTlefuu36g~I{8%{{=*ws?+(#Q^N1q!`4{F2UK$AUD=$D^4Ha zO;Z2tA=uJ{t=NvegkR#cZ7)2Qcsl1>QU!>d`>yZ zzrtz2MOMKEhUy5eZ^Ji3hsyqA`MSLhtSrzRM*m~b|KU9}gX8wn+)A+P0&-XQVKnL% zCfF%5H=Pc0qOx%=_&eu>D(Jf0VtiJbJt4tPX=n%FoKUIm4!nhTyo6Z1mH(n&H2xCg zfy|l_0?8RRSqRtQaacHXF5}4^(%{=!@hw=TIVWHz!)V=zOAxTnSdV^Ay{e!8_W0#D z&Iyl+FEEn4W{LrrN|2ew-v&yrR|~NxyS?w?)ZvIJZcW(U0z1yydx-wi*PQrO7ImA? zbi7XC@~;FdAjN_moO&pB%6ij!3qi*uM7k!yM*(~-DVd}n;E5t^(PKEFCX5JM*z1k% z{~j?mXk4j}p!KuTt%L2`EGi*PQ24E1*1RdrXJZn|YFNW_(mY&_33Rq_W525Hh??%Q z`qS|D`5yYapD>Z4;w^$sZw0OzT-!)Oz~lTDm~P~4S(uwcyH#yZYm~wV(37@ce7d~_ z-IRYT@}I1QO#P}HeX@PH$4!=_6NoxazQkvK7H!5^8RR+&wC4aE8@F}|0etk+RFd@3ddAnoS3mwT;y+H z=ExJ$^v&Tmep!j4Phw4 zx=v>iz21s_H2$wz65XlxEtZ>HOtR=21siug#$i9|eDLx*hI z%5#hs`2VC?7zrBnDKtS?ab16^z1s4%`Dkpw}&yRJaUwr0DGG2_Xoi~!CvIo}GNP`XYVzjc17V@BmFndP6LYQOTvA$dT!JETFy(`GPqFXGPLGR&1Xty+3SuE8$X0I1+Rz%Ac{hs~gSngtb>eQrj7(33aqoEt6Crk}qZ z`i?9V;dw|pDHX+brIi0)^*-W%>Ahomg@rtv(^%F33N_Na0JNV3gzviy+7JJ)(0=41 zwC&7b*K$BR2n+H|M*Xx22Rh80<$U;MJ#|c9Zuw1y0#ec4o0zEbWi4%Nh@Er264g5ATp3H}U1*Ba@NaNV)y_;3HqT z19_>8#K}9P`yjb^3YvLECbWh9o%tH8xSD&XE)MVJnG{LjFm*em`OFUK0qqXp*A9%l z@nOBI0VR$V(x@#9H%M;ic|NM8SrC`7LVhaLljp++ahl>bQQ8cgS<@Gli#4u5+tQkV zIk~@hs{dBs7B{NXoz@iOX(`SD#nNC!i@Ybe*_AX(KO!Va1#Ndu9F;IeiGPX8WFzdx z$zu70F9!MES5jyl4LKlJ|u=}H9l_Om)C6i18U1LQCDo>1WxX{MGFzv=(f16yOF zBRJnCSsmHk;_McCAXfZAO2iJG6^C^3#_A$O+=H(OvbcG{S7!eR64U8=ioVPjd@SuU zy;*?K%YCz!H{P%)bz$U;@Y0>wTk3Vf4a|S}ogAUjP*L z4zP4T?x8lF#6@j#06!woj+Z2DqssVh5wyVCUQ(q(7hBmj1@_&^kX5(BcWRaPkhD*G zM2;q2gWtDttw%h#S0EMqT#L2MaOj+gJtVyk%=rwQ(pzZ%2hf4qh3{XR7$bbuvMZ$5 zOe+v&ZiVzZuI;$0aqYnM2Cg?v78x5p)2@)-GAR+8f^dcR&FVamzhK!0=|xipVmzg!J0TQK8#u%l$f zc!?sAe(F>MV(lIdRzGjZu%(p$aq`!WUzob4)hWlkM%*VAJV5``8EZ_&s$~K#?SpL2 zEUs~eAUDqF$GP3uosIj(9fs#G5i#y_Hw*pKaEWY%e7*iWr;z6_?r@}l_TRV<+#Mdx zxCXbmolDJMR)M}e)}hcj@e9A8^RVN#y2lD+iFDFOkqay?44s`F`CW20W#9 z+|X~n5P?3tEcf9c{~Ug^J*vRh#D1Dx!=YtWT?8F@z;2`5`lsdAhjde}48&ceT-SLb z0=XiPi-+A1@zJW}Nv_fGfTQ0NIG=5QDm7ZXbAUGkE$MV3_Mf?ZB)$rlow=t$3&rSB z;_Q+9RE+ctg$@BuXWJu@ZsLGaI1g)hy@*PI_CVN2Ct$C&UyZ+; z_H+2VaX*W{>-K|N$M1{yh38N2s{Q4Qx51NVO}A4thY(%YVRrhwOZPh(*23%aT4|hK zkqqy0M|s%!DUu?N=`y0QpHyS6BxjGqKoTJDT{U2$wE{zRnUEWxMO)H9l`+ zk28)}{Bb1Fc-|9bTqdU_xr5j+NGPkpX$r@_QzJbxyGD8xCj^Lp)AKUwWRmW4zl{2O z8sC>5F}-UUbhrs8EU+Fw{J!+4X|F|vXPgOIxWjY;A~yNggGXi)&1bQWJnA6IFMsK} zkzo=?9Nz%WVuNI#jn#-x&WuPs&d}=frMapOCC{$MdLgeY#52NU?ZkQ}k^hlez$7$n& z;Bhpp0cD`w?hCohxXCErfK#23-zCE@(@6IS&;+6s8vv{1r(O=oOy0%ald|+=!BdI$ zu{h)Y7j~zHfX@^I=oX87ZJwY!_9v_#h`cjkSL6cq_RC8fbkT_RaHXCA=@6d=jwOEW zr{9Ecga-!G%)%-)u;9qohzpavF!ZEKcn>Rvznz!|EYXc4z5aHsliS545JyUq%e*`X zq_nhV%*k}SLzAxy z$QP52%dIw^$|VZ4QQBZQ*zpmc-|;c`Ebj46k9QODARWW=1b><*_5PE>gWQA>&q9hu ztFj0B;ECv!x{oONsFRG?*?S2}7ocln%d^!7VKfvl`ot9rO`SOEwJuuxclUpT(NDd8 z7_s8tnj^8V)*|&YNd4u2z3RpQOlEZ+DvlQS4fuNSe}D=3s3g8*yiW`KsV<^O;XHY8 zO!Q*qq~0vWIc*zkUwLt1j~XYJu!1%4;zK=&LWKM~)Mya$iz(&8-jlihy&7p)W#K%V z%I3w~9>{^^vi&8(CJk2SRALrNq_U|bbI-7gCC#{^q=WFgDgxI-Tgu=^LyeVxBzysf zM25-qRjG^%4Go>}_>w&ge8qn#ulw&<-^tzy%)1AWxZx`K1JNEn>AbrFd#d9hX7RA| zRqLzSTLIVS!8eV%EIn}U#P`q|V8r*GD*UZ*a!KE~D+03qm#piuE0F68r^N;1xrT>Auyl(8;Al(M;Fwx|%X z%~7u04h~)uc@A$Gql+lO>S-$h;aHa+8il>oBU^x)`s+Fh`Gvgh8fSSZ@6=Aq9?D7i zUbg((eUoSPv=i?g+B8$0gF#SWuy?Qw%rF+G4-n|Q$=W)Lyuj#?HF^G4>yY6d?iX`4O5|K7y zBBSwF9U1P@HjD;8M4T%tUVwgMb&WO_+&?h zt;}}N#^(}W%$KmKyaO8GCHFQSL_A8aAhvdyJ-0T@wj7p!{#4}KlXo!5|8Y4Wr^~Rl zVgB(YQ)k`jS&zb?x+<@m{1D@Fd&mjYzRRf-520Zfvo|Tt9lRQO( zoxkJ_hsQxD{O(P&sfwoOuFOqAd{VtB7T#-SA?~OzA+IQZS@p8Fib+xee@*Dez;+LO z9@y@I-v_pHVETd21N%Mjd0;;;e@<(dW>*N~YDt1j>$t-60B-Ur{1>{ys!JkPRDNr+;hS5Ij+ z%K4uyPzcj%X%C`srGU4uE=VYdwWS4h?Au4^qTt!&${oWS1!sZd)R)tNzN9r!Irq!u zFs?LtSMquRK}Tcn@vitFsB4mp(zaYx+9}WFWxY_KtBqZhk`(3&TdYnV;`*{6xz;7k zFvQxvENGEtV3!+bcS%`>`L-7d=v?mwyv>?GY0tTHpf!Ki75tu4NZ)f{=d3HrY3cfACIp_OGPkCtUNLI>>Va4h2{dDNuO?R%4I%jj@PTwIZ=JrG9 zZpE|e_8pP}m*)0EQXGEM@T+2^mfMrxnU<79qJ?K_r1-~KIj8=mVW&X7>M))MjUoY-pIlRrE< zm1o7hI7OdVo4hzQnRg`^9}|n2cF#tv#&q{PxPQOwuLGmk)O#f^oR-H<3g7{s6P8)u z)7G&~(#U5NzI*ZztRAsN#WeWXktwnGInJ@@T~sYQR_(%xxH$3Rw-Fz5*e?WA-t?iP z0VAER5+=dBy+O#dcYEi+7o_C=UYe247(cMSo;!Yi zdhm}VlN^LI^^oi#SkZREp4nXMl=L>IWSC7dQ?&#+d{emp0^O%E)HbNI{ikv3`VwnN zhXC<=e0Yy^bY4PfXnYYVSFg#&`qDSAmTc)B!b;6zRnwa&$B)R7h8$^4m&#P&gwKAl z%+CjuNqT`wSS_pd+U!^1Lv9$N@%p^8``)fS1<9#e!;5KrGfN)j)S_8EB_refCpv$9 zv{TxS(!en<3zz?1Y9lMQcF}I(r+#&IDC$q_OGBT~O7tIl?u)JT_e;~@hn(g(BfjU; z*Yby&f8~bU@hz2TA(!2pB0jsgc?DwvcOG<=S68Ka{jx>rxFoWU8&{9mBr=xE9=XvS9X-2TABL%4xEq{A6%IwGcj}&_ayf%AjuKh14ifag{vhS5K^*DwM42QxBaRWTaZ@?DHc)_+Jn306*G*>zCpO~uw92eiZ zm?Eu-@W!7i4XIj4OHOjUw0RkE5padt1vyTCOknP<2VH=ix(D^br?jSi z+K*IPEG{GL8E=$ZC#EBk>HbXX9LcCps3rT8is`o6Q>9$;7uX3UK;lGw5Yr(K+lQ!U zPf_hr{fV{zEiir7mWt7)FF8tFgo6#e~G`CadV*6qRKn zyg8?4xxpn};r~xQi9fZd80TnoUbVI-73)wEFokq|5F>BD2GHE;(-}L8TH&pa5s&&p zaDN7S8CI;2e8$IfJBt40!TKk@D~03BQTfZpz!x|2u!xf~1Yf@NELhVZt&W0*mW4FE zprKWS`0*3i8xw`vo{l!E@%cJNY=!JH1X944(bmiXu>)R2ze~QkG`Hvsj%ck~9=T1DLWnAdaRjgf=aUqJCY+06J6D z?-;;+nyhpPs!hzZa3u5B`U? zPj5;>J4kwqHA3!ljV5V)68+^RjiH%MyRYB2W;=5#bI>AwA^LyV-W+y;Vlj4_Bte3# z275xqdW`fE3&6kTl$1A9IZkN5PD8i59(U*)gWOWGv%IiRs6R;BLApE@ba_1lqV*m*R&^jI$9iEo?c~qkX+V}Z(EN@D>s$GWU;96= zUA&yXEWP-ScJ6sZWEMaBJI}WKho67Qz0M)m@o%30oASLE&&@0K)<65nf03}EGTA!> zt-PNPk!CU4xC`2YRX*a_Q+!p<>dI>1^xkrVh`{MX^#vJefnK<_;m{B;!4 z8%Fxo|BHxDe)Hx28|5b~dR^eWW>jy5EjQqkU#m1oW0%G9YuIvrSoe%Hx4 zk)Sor_@_+iUK#vCK3)}Rhi3~D=MEkVM1v8@16tDPSNvz^_qMGth+UD3XE$I*eC`Y9 z1hw(PxtgWS)iEiPGwH81v$6`XseBp8hdM@HbBNX!%W|3NEeh?P-)lf!`y=PusbF?` z3w_I>UEla=)Sl3uJg!jlYoaFtRcP69|Hh?T_bKtv7H5ieH%m%S^ zSewCnitobmeKn}jE?7B0Lx3yA&O91400N@+1n+MLD0hplRT%q{{N77=?>kus5(y4~ zo_!U2??(B(oK{|bk7(ZZ{Y-oeZ+{Yd`+L0o_t@Lz1B;h3*v)Y8wG;|@nQG=>-xCQQ z!CP;}-m(phDC8kEHbR=|Zc#XP{&+Mfg=)NnpUY&dV((MP%+BQ-7tsnB4R#)&XIG=< z&9RzaMwyTJD5?kYDIs4EwTmC1bO zr_Q@%>MRI(77b$)Z}#Esi36a>D#YS=*mE^{VIe5h%@}#VA0j(&x2Qp#%_~VyooM|w zMyII-j~w78ejcOK*~Pzz(dp5jARgq$7yq(i_mVGorp9^YkoUr|>-hbiA%r?37P2h~{BB{#Ru>cwgkD7=`?K;CcDZih&*Su|NED?8$=g6Y+de-NjSd zk!>c39nF=!{|h`5^?h-WtPK7qv>P~%+Z8;DI?oLA7a!UO8KX$ndKofS=R>j^4Nild zsUjD($@fSydK2Us8Kdawb?+$8u6~F1(i(AWe~tH;bb7&T{QuEt#UAan?MX-~4@*DV z$SOchx;&#s+$$AB<4xzm;2#J6+ZSxocRp~U*r5l58=;jXSe1IZCA(bDmtOdfVV~1& z+_U0*>1!@1{cgE*HtEc{l70SAxPOF94tX`q!>8Q*zNI&D|J zkDvVrn*cR%>4Ba9aXdAm-Pi}qc*~Ru&*6<9pr>rozt6R-KTPk^-i&BhGLGdPwdE)A3q98q{EorScV>4fvc`jC*@Gl?qMP zkTGqL$76gPKxTz+DT+I5*R=@N0be4lUdRTYzFsu!Yse=E2gq}BF>L2?ahVKT!r1f- zlHo^!ji5}CU=(u?aq6LMmve}n!^jHx&RHMn1tP&`<#*4>@BTXW?rCr)F8Taa?5z#* zTmO{bS{Qrlc;G@@s)xZn6qm{zoH|(JrD*sB;ja)8JQCakI|`EXL5hN0XKc)FsoPG^ zIq}WVdP%fXInZyJ(hJMUM+5Oe54ve?(7lWy_mXN6XiqM#}g#@CRCGsS$$Ed^H%vO>f+LX!Tj zp47r6J=tY>iA#D$FLoh5w&5JTlY+MoQZxVoK4l5!CGJ!1j_zOXDe@#M1Gmn~YpYx%d}1e0nLwxmkG3<@)||@H z?Kx^kX&2Ky+#%c}1v3X#9ZYx+a1m4*@n_9UyQ4!_``#Jnr8;P0xWf0OscGvaBY0SG z%_aYMI7nqXYcf#w!qmEs^c4a)yU%j89lREHb^O((AE5lQE~a|8gR7MguYt;Rbg1q@ ziTCL`5G&HonNc5ya!XNeNxWR@7eVg3kr(tGV!kcg3~g=|dXTjy)$$kMM2-lj+(+LU z(YHda)=80!=ZhM-B>P$YRf5}tae(Mqpr{nXnCelU>My7#wCD~-ZY zi}Hv@k1U~)lUw4&6T~jWQH$d!S#OY3E6DK77qj*8@#X`xKB>s~h^xv)@fwm=Y?g{` zRg~QbGEAX1*`$)cDRm1N$?I~|uuapO;<7^ItAurQ3u%DGH=AjUtL3*Z9`~C6a4%{2 zy=C#)kX)!>fo2ZMTt;J(ur0XL&_b^5kh|<09_QMs(B64yJ>fgvCnGMvl@V4l2Zbv1 z3!U)-%`VoO_yAom?s-q3zHmN379UElTv$%_1?4-Lt zvv%9_h();h&MGm65g?(KnNp33nzqW$({K8oA{S z&m$hEfd5)s9sVcT>NXKRsDEzA{;QwxYDURwTU@dzEb-!t^7S;T1^mYs_@8X6TSwo} zGhtm7vMLnXl2&>UhgzYZ336X#p2HVBaBLer@C>mft=TL6%Jvb?Z?;vfiH{-W{jC3s z_wSI)uaV3Dtz7=O?Wq?b!N* zlbho@YHda;GK5|npY9(4_^*QJJa4ahzV0U=?Hw1Z8=3)*R^5g0qF_F$MJZoG`FyN= zM2KIJD&`I;|H~oe+nUN75*w-;8XC5it>4T0>l${IWkSxd2IGZ)GU-mlk{Y95xdqyY z4V#25FCylUH?*d!GU1!x6(RLrTgzUw@TNRS_s!o!@BN8vcdUhU`Xk5=uk?){l{Sg; zb0AW+l9i)4mYpMEa-rF2hPTW7-bz6E_hI|i&IgvPfHw~0eFvguXp1t@MxBH73b0WE z$N0O!pCG4-1_NP=#1ak8k9;p5`v<>)M45I&kY^ki3~rF~aK0Un3D})DB~{!!WN#1u z1sUgY{*L7A@I#jEgjXN~v*Opc7+UlwJbHyCWdE* z+!ir3lkdufJHbrs^=ZE{5Zn<)Y}ed86+5m-m0+tCp>dXlRu;N`kRyo?dhMf%>?BGb6gB-;&6#Fpm`}{dLw> zdIp2@BJiIwzp#kf2fOzrCWm<)eep-^&If~6Ms_bEd4STUxNJ=i&BrUUY%M9@{-Nxs%kg-9l@4@@BluZXI+XtQmcqaYTqewD2crlUWJ{qhVIJKz|@GWYM*G?Os+Y{xwO8eDZzR3izD`dncjVQw#3S~z z1uM+!sC9~D%+bnCe7F7l^=++eVl%WIn+6p>Dn+6wO#BUeh+g-n7HZIMCRujLChm^e zdEWdv$(ZZBsq_qes+2quB|QNNpmLRts|M(Em^dFc;Wzon;*nZhckYed2Y6UyKKKS~ zwGpYJE$v9cb?|DbHZbwh0ovQa`@oYN`)YM>4diV~$*&w(;9O9773SE)g{k7SVLNUS z;WNZWhLihd zed@>~HplKw1Hte6t-0G9=bVi!-&zKpIjmk6ASM74ZwEysXq8b}kE|$kRbc)%EKF&3 zJP&xTggvY_2GJ+5HD#hxo^#*$ljQmFrGJ#`1nA9R@Z$mUXFK2Lx&s%|4;r)5IeD;V zybdc9CuUo<+9|hz%1pc+Ys_k=r_zH}Y1)cZ3TfAKvW4 zo4*+nRe;`WkI9H7NNEdO1k8j657|CH?%^kX7#sCD;lc)2!<*8Cwyg?IOE;FyYTpZ- zmL7R6j#J#btiAl)c;A#d<;Zy8hC#uF&{V%l)1g-tMHnrsn zs;$SA_kV)@KFwtH0JY$HqI3(`#9zs?e&N9GMPv{28=2Nk02PzVgf@-A{=Y!(uXvyQ z3tEwnAy=ShheCm+-!G!LZ1J^u`lu*!k%h5-&yaiYt1#8(!wiW8e;fHYpx9*>ov_G# z_o1Jt>E8o4J)lrcf^SZ^IY9aYSl`3{mUJ>E2k8|=Xxk&f>tx!vGe&Qp1*G5L{$LRH z{FYb4AxvxFn^S* z1_?G<7!yyU7bhspOi`StDaam!y%=naw?u-6BHYtSX!mHqw{baTNfeOpjN%m;Fdp84 zx7_)wrUR4o*$t;o$E zg>T*Q)dcA@Z|cMZ#D{RpdT|TvlM&Gb5_WUT7;}nj4NZ10FTx5U!K#+mnkUY!Zu>9` z&zG492^QHiYj7mLKEB1>baXXmrL|ZK9UirsiK{`OX!dSg$yw8V8HhS6`LYmMmNJo# z1OAT<)5W`yD}ua%qrpA>7RT64;h;ZyY3^T$P9QQX->ztMEa!BD^I|nX9u1x-&KH1J zlWRo22ZzCzv`>jKr_}kM^#6$5g!p%6d2R%csk#cm^B|_HtScNP*Fbiq8^JjYt;Z)x zh*d%SmpPV4^nP>df3W}G6O(~w`Hta>a_AKX47t!;NXDmS&BcIGkxdT7TxJ8yBl0-QtXH-UprclG+ha3rBAKtUd zdd`LzGW1ro3s0iKv?wgdaW)W~8vao}8w~zQ3dmQ1gFKR;;d;&+H4FiC3;gB}G9Wa|d3nU;mN3qFlItKsyCnRlJB$yKY7g|SlK}zd> zF{E|-0z=#8ku+(vSEnCEde|(fxwy?YdWF$_WHsR~)L$t23SO3jk)DFirc)o!(x=%G;?@07<%s5pYV|yp%sz@+Wkd?Z??vc2ZZr@tnACYs_|hze3M~6!WK!O zhV)h+JTVZ*JS_bReY)ZTUopy900`)PK}TBf%sdavCByOwsy8moa| zi?nO$cd_$Q=)=B}&!fTj@J{iE z7s8PaI0k|f5lQ3x`=ryl@Es<RJh<{RRTMuUGjz>q^D8f?T-!12#G zs&IVufCxQy9WwG}IaYa(uFkWTw0|vaYr_aL=sU}`A0(`<&27YbW1nfa`g1^yzm94h zr!hAK7uF5iDQ}MJur$CZ(i-*W+Q|M@d0w(~MxD?^ONJRaoo%#WNI_z^v(SfRS6xc+GkzJ71m z*Q76_ZzygjeZyIpPl+%p1s5WNL5eT_{R8-Z_pt9tk3-+z9IF%Yx5^Wq-2q!{?35c| z#k{P(tVmvuHakXx0~psYHjl04E&pPD0$#w$>To*zx;`3R4>IVBYe{w&w@Rlcd){n4+}HOd;hz) z6dxn(JKmxgi}81!BcBA><5K;3F(e!G_CWBSR`N%n_taGyr{T@fM#^JSWXgBtEK746 z-oZMB_9h_ipABP<)$Wk=3t%OiHrmO}S{vs0#93FT@tp@5-|68W$@Mk9t24T9xS8Vl zl!o~3bkd3W_lEm=)!|Ilca66c7#yl8tV@@YC2^x~4Lus+k+qnE*B+;z-*FYk`>MU% z<=-{l8rsyoe0G=L;Mh?X@Y`D69kn6%gGTLmgX3(w4P)j{@Bik@vU*m(!0w(SHcg#7 z6^4(bMbRYQ8uCO^Iv<^+>3qnj>ab_4JM0>D$2_L$m{)K`xxFKWu}(Hl)2YE5DPviu z)_5st2<`R`WWwlVh{77ZTsJFUjOsm&|MHjGM_23&b9Q|$>%4~96If@Pigm7Iy4<#& z!*HY3sxxnyQ2L#=tug-??WeCRfTplqHQ9y8jXL!RiTlS-jU1wGbE#Yxr<&h!v!3^r zBaiNh#%~&5DeLy@98Z;<@rx~5n?1L!QESnmeInXtFd^UeIvtz4m}Sq&=9)j7b=;_0$gVS%|5L=(wLs?>DDZ zr_5bkkSW=0S}SnIsoS%p62#A#ouS4t9ruZ9@;GufouvcuxD;<4*7^a;r1H?d`5vqk zRN`(}_1){=hP(q&?6Q{lemPIq#U)_&B&r;LEr7;0Nptds**E&Qsk#Z8E}bUTmks&z zLA2_Kw)@!IT~S2GzcsWj6o3A+|801}UfrH8T?TLYQeKNAZ_W%SPHjhyfSFfaKC4+$ z*>-tQ<6d)h63YK|f$AhTO*c{1Wl>G_sXNyT^E(ddM!+WqQ6th%XvO0<&i*%e4ozXD zBU^kK@CN)NBprO?je-WppBhn@P22e)PZSFE*{*d{G!4YDNZHOT+x=be zCsCe7i@ptLW9O`u@J(Ze#wa*)U?xX;fB#b$e{Z3Uh!5t=o6BALMuAS`bbuGwP-AWs z5jFs)oj;-NJzh4u+pmF5PYK|>25@%zwVj8Bn`*UIT{~i`Bg%X_Mu)3sb{dZ(eMvo~ z#ZmEa;xF)XB6z5;v=&-TRPdh4a^$s-ny2bq2mGu{ApC$rYfZlAXK{riATg&H8};Z% z3$mA}%-uOX*IQj%>-TtQtuP?EbsBj5O`ylKhuPjA1+OFLt?3>KUT4~nNP(XQ2#!sl z*S^^L_63eKCJh*q{lVI3{eI-dtR7jrm0}mTU5H|ZA3xGvhwH7<0%Yx}HOBAO;kpjj zTcw@2|NaH{cjEs0xG&;<(*z$;7{7l>Pg7BVxzd zFOAwaNMWmp3yokIW}!BO4I$B#_2C~mr%c_`$kB=7}oFf?e+M!)353L zyC!O0;eG*-j>L$heonwq8F|R`Adk-YNc>u=Z3Dfq{i=YUsj;4I6xyGZvORle^M23@ zS1U4W@|~ItzEhX}6m$xyA3b_Hm3=K$pQO2x(0Pa-iLubGRUf|rv19)To$$Ugt&e6@ zN|z<&M?c%1TZ>)&_O&Q8w^mby>=6r&1Zb?&7$aQja87t-_|a$^<+uq^LfZtpmBYSD zs!MfrdB2ui9ySI#9}VI3JVyUb7!?!lOkq;-7y2$@IzL1#{X@jw)pe*getys zEtescfQ}wLo@2C_(vT;|QnPJA?yNoaTRk7hFcBOSzjUo5cV4cOoq$p}V<&X5ub&itj)MDIRTS-iX%z;J@>Z+#1wi z+%DHZ^jx0T53^RPhj?C^HD3BcIpfNUL0jA3i|U%$(s)tfhD&iS8|+5OjukTE;EXg4p>2 zoY%(AYjM6acD@tm@5j#H$GI3g7jd3rQp(9Or8+a*sa06PF2(N`$Yb{#eU;f|0bl8} zlO1ECcoVYS`s@if`|aEDHIZ;mIHvjF8_kS6_b0QZ13cS_bBZg@5EsYy@pO$n4u z&tq%WRq330wak>}$wMUmXz)O|FF<(@VDpchz*HB(M)eWRTjO{bd5^vhJGpW$FSo42 zw|H?U$3M=>I<_v~&hm0fJ9+LyTrGsPmtp47q^gdxDsC%fTFmy}?w;`o#Y z=Q@+SbP0T?knWs)&r!{uXUgt9nmQRdSA^uQYz7W%B(jB%t}E;JS2#3X*_=V#2kZR< zKD*OiS&Ds4k2zWVdf2`^4&NKcsq{)v1B3Vnd{^lwzJuTPGXDQf8s(u}#5)3CqFn@? z%2(v%wjabwvQW-;JKjfgbP)c3M#%8)u-&9J9)AKhEm~`Sd(_+ju7fh(QLa1wm9Opq z=fXH~>cH|^`0Y+E!Tc&3AW39@P&2Rt??ypK5qr?4m8m|DJYi4I-f$!ue1r0?P`0yf zZc4KFz_7OL#$2PZNMq(PnsYc3t){g&zGpKamO>OdiNyap4vWL_aY!TZfwvS|LSs;C z$!eFHSf@uwp9{Vfy{dA|@9=02^|UeVad0)-?OM(8v9r{je-p011DYSK`HK8zey?*y zvS=KV8xfvmtwg^GJ~75CXf677szKu<-lqzyl*KHBA;IV>V3r);*X%jKg--#CDDIqj!yf@ zJ_C;6tz@xO07R1VP6q~xwt{wl~M-im51_U<<16-(XR z41Tt@J)v_0e}pZX`!9(zaE~v{$92+~1=d+_ODe5G{x!KjTmOFEeUA|+*9qySkH&fmySI;31p3tdhu2FY>lr+C%gW&Wt%m4awCNtA3 z3yNpWnYRTIuM_x}x_BLSMFx|Y&Z%+y1I8$E&B_W)9C@w}`wt`bsM^PNm zkZm17-h|+LPy2P9hjsN5w^?;kkDPqO8?$j$vsQEHcjFv^7o3pVadtq$HhD*+Yiq+jY{VAV z2GV0N2tGYZf3(bpS(DjMW9&lSh4>b&McWQ4-RWT&5D2$n1S_M9-sP+EY6Ul6L1Qh> z?@Vtp<8B@4SUxjV<=>*6kl${sBJMB)d<8gb^%%(Hr?=$8hmYdAKY$tf@-WSKhWzEX zpT*Uc4^i=V||&fmt@vPcw1k zT$SU`6cN9(PX9-iC0*Wz-9Hn2ANP3jU!0xbqt%?a%YXYhnMdGI8rKz_em^p8Gkvzi zy^$kv&wV%>*E-^%+6#Ehwp>knw1W8%DbbWNxk zz9^t}kOi*Wo3kIigi)2;mBP*jFO6VU8Z)YPNRWa&!6BYLZ|V!qkh2f!eJPdDX5z|(`F1UzjG2^BN&v@tY85ZL9%RP5sz-mk$q z$pdq66q_0#RaFCqO8~b&Mt^prV$z2TNI>5$l=ba^x{!&c+2Y7*e*LSD@-7AAulGHj$7puYZ9eDmUo)bQ` z&z=qLAH06wu`|rJZ4PIFhmN1Ha~{X*2APR%$pns50cVN~XMGG#{ZDP6w(Ue)-l6tb_;y`| zPK+MVAzBHQV?{Zg{aTcBx?fdcML8!>&gJ;#JG>w7FV%7ENt=+N(Zp9|iL>P_f%Fbv zwX^%h#oz)lLa82R?2}{K=$iV1y9c?dZ7!XR+Zu;a)N&0D4sjnol70vxQO0S`zFy(? zkdxr3WH(*b%o%%wmxhQt<8fB>Qqz^aZO2kd394?PYd`XXdxb-%GdOR8?4= zTWhM_Qg*a4)n{}XP1tkIol;v| z`wZw}l3aWCyqvlD&C0zvJeklmW&xhBP+!5Y`jBl1+EmJVcW5v~u&#_M0 z92kEChF->aznsJMu~KI#vbyGCgiQ9&bk3|yuT8-D1Yd3~HyPA4=}2R)`v%91Dw1>D z=(rx=9}1I{J_WmP4yMvkc_t)%SN;OS)Y@2f!_>PaeINtBVyri)} zW1>kVFzSPNE^jriXR8H;H1H7md+Y8(wxqK!W(tlp+g@FjO8Vr@7^ z5pFDfejRZ*YfjbdE4x1Skewxs6O-_%em&G#D}yOwU7L%V}Sn*gXX zkS{<4>hZ5X4D9;+JG&x+Pl%WAJ^Cg z%*pCXO3mp*dJ&oVhKy>Z_0ciOT}iA#O0u5~R=~P#lAkkAuVGu6 z2|b*q*`nP%!zFD0*BOpey?QqIGxj?0{6@@0BeDZfv~V6}Uos?e|J8Dj3isEcrBpK2 za5gv+rTcsW#?;wk2LbCA=ma_f=G8AOJ&&8sa}=lwW7@@q5gV{}WpD8tD%c;WQQ!XZ zZ5SJFj0Ng{Bj%p08^ZB6{BEY}4@hU21^QmuZ`gtxG5g|1S^a;Qx#eC+d)q#(?~D>5TMun|}@Zhq}Rg zh~rRV!U_7OSpH_5{LPpU@gvA0>PV=ltI4ZL@;=^}Ge=pY3{5wg_2RaOwn7itlTdM! zNiWt%sLU4ux0_(USH%v~@lEaAJvBGiO!Yp}_#(<;W{bo2j%&`{;(BHyJr%zBKY54N zGh0(pRUNFw-1~BC)=d;0V*cF})zKxN0y_d8U zd2?T@nXqp{4Kwd?SzToF(FxgSjvQk}0DeyoUaU!^Z&HzMnk;vI03_{0?Cn1SoJn$~ zOn-)6{9wq}AD)9V=U+f+_>F|a%fEQ@1*@knH0vVbz zL5bJ(oAAG`UvLmbSNVl03D$Z%$B2S7Z>)u+efhp|mULf{MdwSj6nr+$Vrmy`cE}4H zgFNyNB3B3EBGL|>6U$o`;QF$2*E5mrjuR)JyGHy_`OEQx$bRe8$uYg}1zv6*COJ4B zpg9z`O+XwRM8vxfzXw~uBZ=DwiG$%pHF!e0-a5#M(TH+y7h)*Vy$!h67vYfOgZLrk z8O2w`Ge=GZCsqz1HqoHV%Zas7PW*6yi9T30rJSHQ86*Na-8GBqv^h5?=*W(73|KoD-`thY5Gl;69}- zj!eK74s+rygLW?yA408(=U{3%z=;WiOk9P#y)jtk_u4UX0O5auh43*H7Lp-6ymz!C zigl9bc1ZTU4UoD&?hsC@R%eQW%8WUejXBpK=LPHa-#Bky4YMxs^V?T|;_h>WYo=f= z^ntp^)(O=wV_)3UkIa2oCy>Kh-lJ=3Fh*8y)f!{ZZ|f)ThCV;S%A>@Yel}r-e?R0` zxB6Sk{^2WimQ|L4lHNN-FJ3)xF+b1-OINnJ1i8HWf>w!Pv@%P6>paIShaZ-#$f*)0 zdVJ7lb55y5M)~e1QHE`Z<~|P91jl8LFVS-1NETuS`z78{v5(-$0Yty>6~VWdtVR~e zWv2M@oCTHnn4{MK)0$zJzFWLc{ZQb1d6%I?Na@hdE`KsOTau4m0cg%ZYP9wu9*1iD zn-883@Z_F=$dDAbJx+Tpu{lj^h7spnmjST`kG)0l2_8XYblNGXUd|M4(NxGs*;v86 z6xKq*Q~cI%gC{@*4JSydTLR5-!1moasqUAU>m<=ty{r>^rNq7NmMy8Yr{avfcs8Vh zJe(U-<=W)>$VH>_+u&dJd$6V`&ws#kmE&9RD9V`qR*pqM&-GQgwTYmBL{&Ir4stX2 zLi2k=%g8$BPtob{5&1Sadw{p-Tbc205o;jUt90;6I_yhYdv1Dc;c0fsRr%$onSr9U z&>dFHeMzeoa&yS57V`1RYa42+VZ~`*p8Klc!mqe90*SizbK(owe?ohQdqrVpg5N*R^1~BmeKggW%ZXKk zq(8HPf_Yj-I&)?3pl8cL|A*Ppr^)5^^hbgpK`(biUJK=TBZZs;dCmbr9x@Qc^D=K; zq8I-Xx_FIw6=P~mj==6ho7-Yz>Mb1ClJ zPSPq4`uU`#kUk-^J7>*or8lWx62S8$Vq9MZsDC#M>aS7fh7qwkFQ9+X;AG%i1AIq= zGY63u+Qb#=9M8IXf{%tM|8(58?zM%O|HDc(w0wvC4Yeb_zcDnO_Uchq541t56LCsf z{7y2YRW$4F2XvE$l@ot)?$+S&ce+I0)|yE2Yq@P1=Jr1>gUp`mG8j>XgyoYSu% zer*j8{|XgywcmqPjmB{s#@Al_w$b>!;QdR6ynpk5c%R0gx}qoe%YMY%1g~ z5CL1x5okrs-03Zp@7Oq*nYChnWOH*a-hDV)yz0(XTd^;t+~wCwg~s^%k9add{ib8r zo-St~KLM(@amX(COYGSxKNh&&488c^usw8BfN(->AiNM>H=1%MZ8t?v%(Aq>F^}EjIG$` z7x|7iW;t2sdhLQ$k4yTtaX^srX z11__hGpSHx32KyJWl86Bh8%D)_(5}5zSqNNVdhVKGPGNyh~GNsnWDC}ds!E!arg>X z-dSL^%W>+v#<0TWw06J~woA*Y5ZMzPEuuTWBzstvA=(QkCiYw9ImN^8L3t~OA^vj| zmKzqk4>Q}g1RiQd6%5woM2B{Q3XV-< z^V{~O!r!!`U%!z1mgwpg@MS>`5uPhn`w#V$$+7Xx%TF|Bi0)LiZ%NHU?^gJWk#>d? zBd`oqc%Tya;vts^IIhj$*odPP5pVbq{5T70dV`a&117JRCorQY<{m!77Mj=4mu~x4 z!3WX_z#H-iYUY zvtra6hP`nl@Jf)e-RT1RCQYGlmcJ?OCq9q%_{omam534S$##6GEpQ|pCmnUR&szJ} z&ZDDqvHPHX{dj0=(j-1f`%GJp#}Enb0?a@8mw*=kTYf*_*KW_LjRbGU{crr=A>$To zHaMFjQ``_yqRmq&6#GJ&KiZMBeTQV(yhE}rAWz4~9d|aD1NQ>x^@PvZ#LIl<+P6`+ zQ?6Tjtlp9QOb+U%noD8NN_BL@CyDKSyYs~8AN?xSgs7K=nc_lF)$jbt+w&k*FYq<4 zj27qlw&g1Ie-;~ODHH7os5GiPj&#@YIUtK{gP@aplH zS3L>;Uebl?#8lnrr86CrNht&EV`8eFEXMV%TIgaS%Sw2wOGpLg(r*nt5}M!P%f12D z2kO*Df6eMb%Nu@BEX!*?#D-XqCGzS&`IEcGF<~<#>d&x0(8wN#we?w_3S7kH;L!fy zbIR>eMVMF+WugO5=lU1dJdT+`mSAgf> z@(xAD(2Z7f|l@j$7z?PrY|@*EMw~7TSN6?B=`fe9j^{V%|8ZeR_h@t zx&95(s;}<7<_&_A+YD}ar_u4r8I4)JB^rD>V%bl4(Qg0pj5?h#vmr1V(qGEldgGEL zWUaZFuDlS)0VhMzB0~$4#1%uHRtHk#wmyp8%i*Z`_k`{CrP$w~?H^*Cy$Xw4vURj~ zXQ1qBA{%0SvK=uSpA8VLxe9Y`C=Ww1!Jq+S*8|9VZ;kAwYYRGB%&i$5g9IW(c z6z!2N&HceueCOdas&UM0U9tyW=*pL0yp=Pq6KkLnS8CCeBr!B(cixOODib`e2%TgG zj>dKstAALb6(pl+i14)nB8x5R;rLuP@l=q#gM%hM)$pdeLS3z?)F7j$*&`qdMuuzy z94{{mP5cx5ga{rcddCiJeB#F}o zFJ7vfB%Fufpo@p6kG!EiQ9y#h+JffxUQlA??D=cP|N*Y{_-W@dy@sbBExrlv@7>!94 z3O*Cx$uW0=Z&${=16cih*uL^m;FSV_5pM6ok6@RYQXR-uY(QRO7h>nC)W{;+#t|;> z8X#Q0z)olgJ6(;*$5kZ?E_V;i02ZGB%r8b2Y<>I=;rQtRvML~~9)3qeUm*wit8M?A z>KOmq?%+*wX*X&$j_JoL_HoZXDJ?^$G`CSTHGfum^Wxg|IG^G**K&o6Dc`d@{`_d} z61N3W|Nkev1e)pM&s^ZF%rc+D3d=jV472+M_vJ3~xhNM^!g@f=AkR=a%(avu(>&~1 zn552=e)b8qWZNago=>i^{`Q$Nzn__Wm}9i&(#nrM8lZI|5U-dm#=&0(UXtr7gq_=_ac;Y;7B(oz zEw`4x%&qvL5S_mnYocA;>0#o%pnMNv1!1X7T;tiff$03UGJ>QOSj-LG=cQ8ew8(r8 zI4_qd)8DQQmYPn_ct}AUlG47u;8kzYdn2`2w=}G)$y2-a@m3J}WFpf`1Zd>B4BZ%P9ChkV-d>)r`QRO1g^q)W_XWWH-Uyqty7$UAxaTTlT;CN!PKAMr zK&7*)(uvZyW+aI-hm}4*Q0kloX;Kt(Yr+sa0;=!I-lR8{1hA&-F!y=tr)SEleQa!r zb2|2=X>RxpqxY%r-4W~R&omQ{anH@H{akZp-{7BD)iUeq-u^%TCBQ^)xUQD3f3EI)H4cY+rod1Wrd)A^iXils~ z)a~WA;?)G*8-aD`fwKVtI$0Aqgx7uatPZj+diT!N%=)5yCr4X+j2ru0faou+IkZN6 zmaou{xEz(}2+=`WN9u7--c4?!@wck3o4M{_4f4(A)y#Bp+ef>;M66;32E>#X|2jxM z;!Axr_L=2c|1qf!J^!#Vqg>^;Vyq!n9WuF2tD06pyJM_o6ips6?GR@=bTE{)5FizH&VFBK4r&*A2rD{q|qwFY*TgBaWrD9TpaAQZjbGB z=J&2yk|gE~$;tQ-=nJj0gj0Eqi>)CZ;7-|ZM1ngohsT}xrpCCT>W&ZZU}0fO{T&&z z>X3m{aD22_@oA-fNN@01^!z?V*<0U&vH8`oy|c0l(PMXAjpv^Zd;WgF)Q>#~;-`X4P1%VhpVgn(oSX&IhNpe&pC>D3M#W~d*epv28rMBV-{z) z{J5X73|=$lCCK`=aG77)j2WKq^Gi?Qn1kas95Zoz7Doe)n{5XXeVd*igualTACyvX zd=|%ao9-kt({p-8_vs$l*nr0|1E#A5my*-#h~$yWKO(J@%ReI3%jF-DHsPrE(eor1 zJ*~q3dfP_)-(>p;@({|?Rpr_UNu_&^8n(tB*qt4cbXkX_S>{8M$}HCfTLv}kbIS5_ z-8s!F`%}$e3W0fCcLlA3r00WAL-!HvvBzep4rruOXG5GC;kQS9t_} z+syc`l%u{Of3#0yP4Hy{*PE|G)bXniNh}9-SadB%q^TvsOqEq^Pjeo*xzU^KJR;rm z3$y51Va7hD9LIyW{sz?6UA|R1d5Na@g#V~?`pQE+LdLfNwe#rB%zDIkDj>H*x*qPbn-cOgeDSu{@?K8{c8e_0nNx1>^|%j8nd&3Jnzl-?ACz*Y;e6W2 z^3q;=39hnGTC3bvCPfHtdA!8h5I?6@Ta4q4^e&B9I-`3UW1?~|Hkzp%(xn;Ru91S=c6d!lID`2cL zE^gVTz)Sa3|KXngKipfOR(A98wyLTSLq8p3tmu$5U42NpoUjnD2QHL|j3&2B#tSSR zJ$8(193Q+=Io4jmjN+T4sz%K%m{(9edcHs{DJ-u2n^bcz-=!B$H2T;HwuK2@o^saZ zu?v0D6xN5}n_ZsLze#tgxjsWFN%qnz(9+qM3u?b)pEl9@NGlyV^Te6&(s8l|=PL#f=AuunXT|5%x^{lY8a<%7xAN@N+X2z-&hB|;zBmVYuk~G? z>ay;)%1XPP3wcWpqJZoB4AtpQ>nw_Z_=RLIYV6!PdVTA*1e^ow+pE(RivB}&FzHj&P@m0kY#dEFm zxN%>**f?PI-ktFJQQ^#R?`A!Zqwd}@PP9q=o>Y;A`c3aivoh=^wC47M(yVC*F^a19 z;eH0rrsW|@0vn?;`(3!2eNZw?%c`RJn&!%?1YOJ0PX^U0;``p1oL+rMx_&m_H?W-R zW2J|rn~SEG=Mm*+6|uvxv#0;30D=d zbxEjHIXQEcD{0X}R|aL(#JBV=;qYB)mU_NeznI1kp0vu(FdpEST%m#W=^>PINU8=D zvFCWkFrMrv!vhlns%I9}gKMrz@%_06a~J2xqRCp7b66b4-r?ct!s4}|taEV6-^XCa zd484cO*RH2Yc@X~v0hblrgDt+VZ=>A3CptP0-~&ps!Ysp)wMD&Fq?3w2egJFjHcQ6 z0`!Nafv$m5P~oT|jvMaHh{nLCpp=hw{(Wi_uK|C{tY=b-31G#iV4?n(2k?@5>Kgm1#6aW9uC1yDg4Cj1NY07WWKq!af#0 z&crKPO7JbCZx2gs+PhfGWy~n+B((!$V|vpFd~GSQ?#rs?V)$Xh@S}&s7}kt3ev+z^ zoZJxns7%G)i?9Sv?>wA@FKz}mUfrH#O!Vr-b**~wVOWhQ_9_$2iK2R#q=sa7HQ-m` z`>gTacnPP1O|3b`Q^7`*fVM)yS&93}$1${wdc-T_ELtCLN%lYAbv~9p ze9zBic$HU7teV_-T~nHmAD`-b9=sRnK3Aa@?}fF<8NHyl#riUSm{L1a^?JD z_z4HPrVKG%LezHI21wPO4o`t+p=mUL;_i$=G%E6k*lGS}U{uw! zvXujm><(SQx$pswUvs#gy+8ZhHN*8U_h(jdCglyCqboRVe_9oP!S%%bDY5rC6OZ?c z_VZ4@Qm8m!em+2LjgO69=&;8mGUF`#rsAiplSHv5H{*X%E=DjjvEn}84KBLNiUWQeuSIqZAKoq^T81%wlGzcHSB|K{IShq0 z$XnSJyewoWOzz}a3C^d6Y9Qx)FIwa^6zX2F;Epvk!K-^c^%J9O5hA>wa_M0sLVQ?e z8PV{zTzi^(&d1nuD0UL0eeaDTcc+Lq-xL)r0ur2YTJt;s@b zV38PWO#-r>#@n;6*&v1>jU*2REzg-S@1TA7bCmSF9DM7T`3&+9R3rAtAHp261TvEV zJnjmA58M$B6x@B#NL0xnUK#e(kn|CmxvN(q)1iWgxBFMZPdHJ09lix`0Zu7~2eKC$ z;rO`G1V6&UFgGE&y~Lrj8N`XuKxtrgYQgJZ^?+4xw#)#X;kXk z{tL^bC|1<-!3cW3P^gFoKgJlK-k#nlKOkqbYi70tla`tv={jk&oQ zSSaVg=jqJqldR}$;5B4F(u?8%_bQ8FXcXjKJw9%Gl9!wGv%lIK*EsPQlbq2Y-WooQ zJ*85L%G?t$5|7^W@Lp)Le4j`v;FaHs3>jNhdsJK1TkmurvI^z@u&7}h-h^9(-y#u;P|1jQO98Q8GP*Y~`XhH4*ag z1YFmL)F%yMG{l)`F0Ki|Mn(LjKOCU`i;rFEBVE(GjU3)63hCrNyU-R3Is{I!s|w22 zSm`34%6#x;f+s4$N@Mar&t*;?{rr%*ye6c~WjEv-1)!pF>n){@ez}e^?^N%Sf)kCL zwV<7JFJDI7Et!DtIBXCz=8@h%G*~j);y4++3y~>Kf1Zl@tH=C>zZCE?Q^J)zeQyn$#8P@MSVU8~-z4<|{PfCsHUt?Y{{f%Oa#P4IZCNxBAQ-wK+rAuaS7=b0!-y!VtDsr4IKGB$ z9^oD_l&a^R!~LY_Tp9O}oe#mi;KV*i#{Xw%OV)IOO+dNS59Hg<6~;#CXf|H(W2739 z|5zTW9Ae|0#22iU`T%&Mo`Ig=JNX{LC}7_M4?t&zi+=7oRHhw2f*XAf9DY7P-%~&0 z`*UrKMszLo9_+%ZjcCtESjL>996Uxt%abz%rmVTJCSv>;u8{18z(0t`LerZQK(}u4 zUhXxB`TgAGVn8j^E%=tmu)!`At1)ZM1#FeOwG%mjWTjqb%Q zRo!#Q7BCoKKI|Eq9&)U&JzR@2Hk~g+Q#-{mr}p){BKxal?6X%J_vRSw@Tg^*Vmf@C zLwho%Q{bE|h>u9~7dj?lO?o*hwM@W>7ck#TD$KEy4*+g<3ou z>XrNcMi+XlmC9?t&xN0Yt5jGS^GkE8o`G*(PWAVgCE4&!NPzzTdwG^TI!N+k{HAES za+q5DHuR1+d0zaU4eRA+@JgA1cm}gEzk?AqEV9(%h7g)1+ z$`ZLESq4CRQWNd2RT(2)h3KzS!PI`jEpuVs>juj3!7D2xWWc0 z)2MN>$GNTQih*EJxW;iJxN<<@ELiIwE{6}$uQ=t~E%@Sb4qjH7HdvHy<@az~OV3s> z7zifHU)>t}DvEE2kD_RZY2x+Jl8*9GnOoDZc@$`TAN=hOa6?F zp?Jvd7WU*6M;0VaSy=yE;k(5wRX6w~rC-x9N`n0Z!4sj{W~IcHuxL&>N#9_vY@#*O zA%D}3j0CjqK7{8geDzd6<=nUnW3%lJ_yqwcn{X~-&7v&JqhKR#1bn&C3NL&Jv<82c zD5NI)o0_MC`e3#`X?Bc2`6E#N2r6IO9iV#|xJR6gUcN{CoC0SGYTN}l9}ZP`ixH8E zc!FCI?@@>QSM?tYDECsu`MB2$xCj=4>opt+Ho{#p;K~PF7Qpo>vX;E*DW| z)=Kr!7||g{3dW0(#!Riu2QNhiun~xYTvfBrE7WA{OBH_~U9dmWOm!BX98rA*W+26V zP7ps2)Bk^kuaM{AhvC%fEAcEH+)aY`aX1bCKL}qbKYJ%U*=w$`x{6#&YRbI|51B3*u;jF#Wk5aTihrpWvD=?zG2u zS9gJXP|G~RW8wL|cgfttnlN%1;QROSqcV}F6(f_YF?sbhuX&$u);rQqBC7PswCY8G zI}O}w0{Cb8|G(iyGTg4P8QgHbV~zKbnqs@kR|OA{fRDTc*@P~i8CO61*o2?_W=Chh z-9qsH7^{omhOB+gLwhNT*wc<#HL$hUnpe%~D9@%b_Z@Vw3w=#}Y;-ZKY4wTlhImT# zRHfYSRnZ1X&)8GkQ~Xod6YShoV-D$hXs+}Armmf@+ISY0Wf4EnEa6d zj)<6@CRT(sxZmR=%kF;$$W!hp{%0|=Um>1fg&*2izG1J{u>ll%HnmS@T~*Oho?}2= z4@4TI0&HP5SUdOi)vdnMH=kcC^z7W(%6f5g2BcvDsSKYo{_N!zqZ7ofBS(xxpfEf8pt3aFul&<#P+5dk%& zfGLX>>&Bo%SyWs`tHlvP90X^^btG0C5gDqW0)0m|0A<{(N_IJSRq@T83HpQb}zvrJ= z`*g(w&n9JviTdCj|0U>yGWUeK?*ShZswV(49RBY)WX$l#@lyAAbv)he)$(+wH~nue5h^PjV8>J`mCa8$r@hMvzyGXv8#k z1@uP>;u6r;6JhJFucm90AAaLGaptdko(dsq0ANQWd=>rnQrmw!r~lxK&FLo~E9g6? z373nl21JJ#Y!{!y-X{_9N%2hQ(&Iivp*G-F)anx|sYhJq6M{D>pzcTga{vnz>(k=p;gq%(MT5XSz^Skq&ei%C~7}=pvt5+Pl z4iu4=An_5J^FBWRfAOvXJcuzJZU^+OjfNtV=kUV#YKmYQU)2(jO@{`&-L-jQiX*N{ z2&9zG0A43*{2qbUmsYpTc}`n}5xndF&Ii5#4q4>`pHj}{1L6M{ooTK2K_grn&4$;q|t6(^kvUR(4zwm$DT0biNA*E zekJ@C`ycK{yhi@lbIHzv-d+Wqss(>ys=EZ3f#TT5vl+@I95dLJggTX%Pr%(Og*f?m zaQnoQ&^)+@&x83GO96fO5c>4}-g%~J6wKkC2P5W&H(XQ~b#AQ>5WShg2EZFn%rRh2 z{Twiu6Ip9OkI?`{X`xveS9b^MqOO5S${oB^L5Y>&j+OyC-bTdiiE#&`G)xmBzK)(V zZLe^qIOWDHtkG>sz2Jo0_F3!B9Uf)osKj=`0*&h!F~{vRGD{eK33aw#>SS8)Q^D~c zh~P>z+x6_dhygiMk&^^&UeEr9oT)r#2XXViT!|b#o>jxi1OfVRVOKryw>K6>_U*gO8@Mr;e%Uhj9K7tF%2 ze;|Dg>4%>mQtF^Vd(HeFJoEMP`zX~68P9iN@`WUM9^sPJ+xpwxifJ?APuSdwruC2_ zOn*|*n}_Xeu^VBRTaPc<*mJO0o6GFP+K!B=HPH0Q*dJ6p)T0FZch-Pw*jbuuuSRGCJxh(y*$5fQ&QUZHVuU0!dr$PY z$ekpu-#q`T`LL{>KXl%Ld0Xcln`fE7PH|WtbhX3stJJ;`K7)spJX1Na_lnRBlV0yi zMBK-%OTJ!`Ryomw{XlPfS1F$_6uhgL>OX^f^)9q{pWuN1g>V4vLT@DCNQCt1MIC!S@FM1yQP{=L zZ+dTBuwcPuz%_(#2)<&n#5d?acvM*q{#e#uOu-W4J`--x+*UsQHLS1$!x+P7moO`vW|I%7FhxBSjhC(XWX zc-zRH2_5m4Ih|$sC%?Vz1Rv?EC;lKORuyI>_8Dn8NdB+j=MY6gzRaZcvvq=Q7U8u&T!kOAC_7DwU*4k7i|LPURwuwu<% zf%<63GdkfBtUT$)Oh_ANcVR?b*o0$2H7&2XT*odw1}kzxm(rb9(kCe2e%w zJ?#I_rTvuc_d2IIHI1n(cyp;I%`Rc%ZtJj1-P3C_ZPTZ|P*LrcS)8O9cC|b0v@KV{ zS-5PD`_(hHk&XD@GDPdnbrDx3x>ujJSuCepQZI4R2pjxju-{38ae;1sVW2#3Zrz%*6^JMh(evXsJ28)sZ z8S+O~4?|9Qa0Jd{kpCIa9~!hE|8wLQK?|&Bg~<7w=VS)6k#iI|7I^mSSyqtpGmw9j z=O+Zyk^dF)2f<%Z&k}?5lpgtC@qB*(>oV-xNq$D_asb@Bo+$y`m}XUT)OzY4KFBs;v{XUGAG<=d}T3dd(T zw*^kI_pK8R9Wr7Aly+oLyw|fUVKa{pKy=wRihhTA@mZ`?07*$RVWr*AcA~z(NyM{0 zxJ`J4uv}atR^}E^4XwXZmRPe~rOqeed+t!vXr8wC%8 zG(?{i*dJkYcOQHh=)MWpTUtb1=U9o}Aer_vYbk=gk(Gt0UP7^rwY3x@78Xhq;a$ce z!7G3PZR`=ecQ2kOb6}Mjy9>TCY;`U0aV_xi^FE?9PkD=+OAzm7{8GuXeCgV4i|y&% zCMm_8Y|eCP3dN%pwGH*iZ9;C-2A952IQmRIq6El7P6Bvq!Pey!5nJ}sN&S_=#fS{M zNE{^=ojH_Ln0GYUQsI(wE?z3+EL*x`shHzidZ*J|FXSNhuz2&Si8xl_cvln=ZG3IY zo>K|%DVc%XAy)_%OVyV>ZNZoA#9M5^TAd{y^qNucL8$js)VrVXgm)0G2jY4%zkbA< ziR*s2zJy=j=cS&M-J)fdSF+3mW$-H;bG+0$Z^71udS$*>w!?}Z(!qFEg14Y&2UoKY zurLL66G}OtoAzIQ zICvPg%TkUOeX?HZ1n-W6^ZRe0y)-|t=SQOqUy*4Zt$piFhh0?4UxJ-Ws!;dwt}ds# zH|>_2>d~sj%9fk9F4^kZP?214UR-R*c2UP45alBSe{cCls zh<+tZw#GTT)8ZWL%vpAJu0If+>-`YxT%GHq`porr5W9h9`ycBK#lq3AFz3yf^ND=U zdokzradBNbL$;#-2($h}n)Rm-rC`>lV%BT^FK2x!X8n3U&H7Yf07{}+uP=MidD1C& zy(2$WVc2JOnjmKv3fF^w+m=GD-3cGj?>{F>*8uzmiTrL`wC$iRL8}S5Yd|Bl0lpJ= z5D%>BUM7ev1nt%Oig@t+zZMP9HGQol@N2>R1AJ#h*c|BDzzEfYVmgVK4SJTsua9#2 zb@MUkKBDEUK}vq1cBigU$Z1*xX!L0Y4>;Vth+v|h=hVXWQ_3+y7e_RM4TnkgxY$o4 z_6n{whmF;Rpb5OtMwso&t~kJez~&*&j;TA%sCS#-hy4Y1uO_KJD5voE-Z=c%;Qt5V z?*O|iYY;aiT94{uIEhrxLdeHxTzwHet|f3sI!IAADg8~*fw2V0NHoG3tO%(BG%Xx2 z<**eK$ss8%kA<|Q)i^73*%FbI}iD{oe_)$hbZ?6KY4EDdM+I(j-|OA>3NgS#J3|PW7OE+ z&L(MDv!5U-+TCE`O+r|e41 zr|tBmn@`Gyht#c|;qp+x1_QHRm1Y`QAc+_L-B4UbSX%*2ZH-J+T1 zBjh3Y4t=j2I&Ty7T1NH@s5Qi4adu{AWz;z*bqktAN1bEK86gdleq;PTU2T?gU_w^h zfegqww3=GPk)0feXfEZup2Iiu@V#wFMeH#~wM&WB>>r@f4XD}MLQ!wc03`{45=|-9 z9`*)KO83}^s{hhWUK0YW(*^9(c($I@Zs9ATvwV9}ZMHK%Auo$SlR_o!hNRhmL`(Ql<$hw59`eo^6`!Il+Z31v^L)tfj`|U%oiiO z10Lr6YUM6X+Wr&L{qIb^tt(!exKGF@m|BY158t_kCo1f4eX|MU=WUDWA-o zh8TYC=`ktg+b1Lotv)N^`E6vE`Y49cdg^!79gts2RHy6_@`RGaqu{QAWuSM0ob!x3 zE^5EQ_)hN6Lt4${{un2!KhZtVj6gC1sdi^yeX>#0?Pfph%ejCv>G=nHURzIP~D+(sF(>SR9D0;t=wrb>g}d=(ST2yMTIf zyFzKOYluFL$JQ-T3Lu-o~z@q zX4^Kb5*e_H&N|u;ef1pT6l&~g+|nh|^Km#8vB73LTQUjn81`u)5Y?|F8MvrtPbplbvymPc;f9x45O#9di4b4&xwqL%YO|H?()ZfAd(k z#NKZJ<}p^dhjUrXpo*z(aH+6b9OEpm5Z$X-$J~-LiQ~)2?CQ^_#)#7eUIP zgZ+OI&Jx%BgN~gESaALsvVc2y{x^Y4>abCD-YQ?l0{8qhANlB_y=^T!AjI1as`cIGi(FSmv#MT@-rQ~J`j&@&BnJ#ex_qn z1OKn&XF6u(^&Acx29lrY*pLg<6Z_KT<=YM5=n!igcz3UqvTTM@2J5C|6BpH|R^)oseyCvfT(=A-mR3iLEMzDv9}niCF#8U786( zr)I(g*lrLFw0_Dw#IgOw1J8auBf#2K*zF)3jAIgxrtNXqIV#^?vNM0@0#{ls>SRr= zX+zAkG-$Jq&(%Pyx_&P9xH&DPCQ`0|y2}HXMS6Y%?G47SjQnla&t>4;wNbi!ny=7K z>YTw5)zW`P?M*?nF9#SbtJ59{qVX56zVRnaHW{z=lpbZ%U3+ViC z7M}Supl^>^yJM%?y0w;EJH<8Bv77v9hzg{GE%aLOTsn3g>}w)Dt&xl!{WwKu&M^pXZpmnPSx-J|u{8BuRse*T~zXnNav1AdC8F;5wz!o-UyVi@ti0Wsn*Elc)oeZ*xG^4 zXAnQT-bR!`azx)*hPsjra6L~XXC%r))wv$qJA5$KOiq4Hhl>cEDfe=Z8V z;VMKrComLW7HPNpJnGwVfx`Bf<_zKz_^XIHBx!6?4tt02UL1_b5jysvFQa-e(!crC zUVPK1_8#q>b26;4C-5=(#7mfj`Y#>!H#)Y>m&h^7OR(ct`|oKV_0Jsi;WF5smLQ!O z?JMfbSl`}?d*}CStS^b`gOxm|{sfoo80gYq=bl-%1c$_JUFq9}IGVPPg%#{rP)T!x zLf)KqA+Nwru~kcJ%W7sho(82Ll+?OM*NujrLI$=R#alo+HoCqyDCFqT=kJ3<7!fY+ zJ4T>y)G-qB37Ye(3#x>!y+Sf#u^`SS;QoDYE_#tL@yC%Lyo3A94Vo*Fo*(g?ZAS*p zbvbhx>BRjDGb`h?qw*6CK+Uc?WYpHdm*ktv}Su z92P&GD+>gh)CXok6lk736z$)akiL(D`j4!>DJ6c3o<&@r!l4H_{wOLqDCDKP1nl{v z?8=XF7Ac;B=)VNFkefs`7vrN?>NdpY$Uv*V@rt?KoC7D^JU#LS(RaGT{0zy}?h@4H zNVG15^U7St9GVYrBeD_UKJ?8fU9=}tqHT_0JRK{H5KT+pI34|lX}fbrf?c*7@Xj98 zW;)!hF;=istbz{NgosSUiR)M*WC8s&XCNsPb7Wl0k)OQu9TN`1n^dRWr=~rkt^U9% zo$j2gsZFc=&_Q>E-651I`~a*e__Y$KaG{KLN=L7CiZ-&lhF(sKy`#9@HQhrj2lm&1 z4fwHT#(pKQbk8Y`4htG#X%YYQj;TpUk=fX8KAcd7^K|wJ+ds)z@lqWhx*` zg0%(oMn=J9IHwmRvk0Uyc8bVxC3wvAYfyVLJSg?)h{J%?fV2>)326z^bfi|K8A!{J zW+SyBH6xvbG!JPN(n6$lNK24TM`}fS71A=KP>u%wQ(>b|m}^i3_j1wp(G(}*9i)+-L})@IJtoZi z(_wlhk)Fxx2M$EIGSU+agA+ljz$QM@6ADLqz6t|Itl$|sbhae+@|y%N!gT2VV1pr; z$PPo}{K)khqT=r99)c(VV(tc89`@j+`8WNz@Q-IFYdp5&!ic~2^7G$$5}Twd@OV{0 zfrUe4bo0o$QWi=BRp3 zxps@SQn8xkt`2#YL%l~FZ_qT6dxr+iThClqnc=iy+%p}soVwcC&W)MvXA*Ak?T7b- zLq_f%JWaTa_q_@J#{Y%yT^zd(Eh2qi9Ge#Y&wTI5wl~i1bcuy#Kv+v9%{IMdmgB4? zP9mtIn0J|&`#I0yp4X#DzNWK2U6Je-@+*Ee-J05&UUvk&PH{ow*nsd6-s=frcvonD z^or(WhTRt?7~EuUjBnbAb}4iT!@FTCNZxxtxS>;UlU1=6^uVm8q;KDbK9AW)%maSM zdbzA}2jy>An&E&hX6dY@1Q~QtKEap)hiQ8eKZ+gJLa;ri`bV<$R{Wg3lODYl8~G0$aS`# zS+(LOH^rn7Eya#;C{rkIf;JjSR7jpF9E^}8F?`e zNwF;zHkoOBG!V6c;|r4~nGN)dt>T7g3-a}-!>VSf;4QECTr%tL?*@fR-^u1)mSP*- zO@!p{TSS@3f_8**$wN?M`AhUk@_P62I?`CHBl&wrFzP}6wchyw zKNgxX*|oEmS$1UA&RUAG$Nntp(;D~#(ZAjv&QZNIQ!pm5R*61k7`2l>rOL+iMpN&o zl$Fpri8iI^u~O>OP%NvTP3zq-%<^H)VFSIl{LbPXDOIXw(NyL4zImtcST3+ip);AisnC1P5eYj!>xI#! zQ8e#Y1YjM6F(iCt`VR609JI#J+NLX%54H%xnU*G1=5G7>1$=>gljGQ8eBlNDh3f-z z@XosEdkW<1QC~kw8widQ^B<-8d1*rt375X`3?e)Zbz+Y>>@+lf`uLf-PVJd3ORt2LKqXet z3Z%k_!|q(H>MtT%lcw|&$OvseCs$GrQ2h<~V)8`lfv}(2ZSbn?wjwRxUK>9U`d!$0 z!OjkRf9ZZsCm7wyY>x7N6!HobeH0o~m8zZ7PXD#3eAfV!@hxx+`G3T*&%xt<%W=#{ zeiQKgsb-=COvw2dzUilyQt7+>Bnk539RqBS;#ddX@$z?G^{WtBf_TT{BIH*<_1qlo z=Lx7M)tO`zdPEo74ZfF;e;BrZvQo*7r2m7%qwF)SkYNXOki`Dzrj_XkYOLbRTT$a9yv7UsF<6P&ztdb@1v`MX ze6B`%wnzTlK8|Jq>J@^X&wQA^|6|CelsV|%i4bvjQ~3X5A+6np=Wd9o@cPZG^Q32A zwN!%sY|aP###gD)Bk8@5L*ySxbqxDu)Ug|$2s#^jrs{jHmqa}(Vc87$8^HTy3}UZ; zrU*O+XrY_nCW$SA1ZW!k_S9vlXG2YCmW2*H@V5oMlSmna;3Lx&~L>hn94iYSRJIO z=^OCb!#W+3s=5KUv3H1mA&yu;nciS4Y-`h8i5TCeT^ht35OPf5%={6{66^}KDZ3d4RAW~UCblWf@ISU2qIb$oUnLkp9!^Pzr6 zBKV3(k0+7<3S2*#yl!LPjP$%7(N_KBor7L`0|(*N1gbyEQ2UTzHJOb=Nh$lE?KWB3 z&uCT{_LIctag>4C&-1amy z+aL0|+Nx052cl&&q_kI(2u;v+=(ok_x3tbF-nl1-%EB~_89d5jk$_#iK>5_j^! zETqM5I!hiv0JxWd_@6@mu?h{q{~@5YqPaH2Fp2%2PHR*u`r&o-gUWAZq90!8{a{c) z{oo0l@kN~RCS>dXrmoq?&(iz<4Nap(L;#hh(K65fXLbeTpD8bkze|SIAW6Me$s1PG zpPDFbxZ~Jw5?$mOZuyN^ybh5$MMQBCEScaa&6rEYJ|SOtyx2Yr*A84;d~~(tH%0c% zxXSif?ph7pCbX$fbmCsB?=$aW;%9p466~$@ztAPX!|>~)^|KY;c~uy5Q)H$6>)(8- z+}e`R^?^>`b)RnMin)kfyz>si7m=RdMUFYg&&|2(P2P$(?*Mh**5DM|wmPM@t#^^# z#K(%M)$$wiux-G(pVhMBx4@&=ABpOy6fZ+h$TJm-)#562+D_@LdPF)<{ruqHiuyNU zk6D^+PuUTl#wABN_Bc0segX9kRb)ya_bvYuu(WafIYfY)JaWA68i8xn{k#H^>Bja2?hH^9TbjBzh z{t06S?Wk=uqGed&Ozw_u@0Wq0t@Hs&2KJxA{f#R0dP9^>V! zUxZ~2?5&bnu9EE1Rc(TwFX5*-il*ubFMU%}Dpe7m#PJX28`;7q!2<(YaCiY;=60hU z*u4v1?7%-<<#eDd@a{OO#=N-0jrs?6PzzznQ2K#0v9Uv$l;458n#Kq5zYPD&5w%dR zCtZQ<=ch|m+D*%@frtLnqo6Bh)nT&0{XKH}VHX-Lt3l51dCr6|+0fg-rzf#Wtk6f? z#TX^E4JnFByKTpNBZ^K>Q-!mTYxpThz8gMW$G_6$6A2Y@PxTNc;# zo|MVwN!E&nov>8_)j_z#gq>Sde+;TwQB-E2Wg&2fMW~II{S^9Av9{uUIlgOkVzpvv z5;uN`s09=Gdi?!m)*$*qBhn{~Xa*qOuaV2GDU!hUweprrL$u@yYn)zagLkvJdzu+VJv z=dId^ojpa^)!~jN6?fLih+lCB!7;6051?JNeregGXx9V0U8_S$Y;wek{;q)CP7=E; zLSK{l*D@9+v9XbZeBNIv>IG`Y-e^0N?U>UYhOUp~+Ns*E)!Jf2tDfT4aV{hgJo)AB ztvJtiA9H3UI6VzG&-e6)g|Oa@cce?zF<3~xJPSN@=VE?mHome57U~!A*4MiFvvg21 zls}5+!>{ZPTp32->LG)n+hAA+D`K)FCM&}v_NQ>EoxHuv!4V{cA!SFauLHc~Rg*@h zKU#eqhZlW_Jd|H{4?_O+$frHvv@8z!*YkWOcntZQ-Tjb%1M&wzf}~}?Kreg)&p#ea z#tJjDnN}F`W>onlfyycup01=0g@bO+VD;Tf9HRK`l{``FZ=c*Lw}Z^0L>w!9yfFVA)9;^PsM zdsBtxP}-zT70HJL^TLK)3%_#!=Tfg=-` z1$1H)=)qf!d))VMt%2^-^{0Rg zVK-f4r?t+EQUkQd^1%e0mHkBj#MfnDu2W1xE!!BNxC-k78GOD!2t7H)Nh-e)J_#7} zmv9iyw56`V%;?a+kjOlp33C}m}<4+ijbT?Zt@m#aX(47~v<-hz0+4TzLlT3=<0IS|a)t3LS z-TjQykM_6JxU}cl^?rnX2mdpB{_3hDJue17wr9JJHNwAHp1qT7zUD>#xixucO=|L$ z(bh;uCsd;?rf6Fnv9|o|`fGQrC5CP@T9C%=grj<%j-7n^KIW zuvM=4CtKzJyiMt7(?qmMrQebxn&Cbm^_S?IW%=H!f% zk|=qS*e#fsQgsG)k9jiS^G>cOn7?;hQC)gx!$NJFWud0+SfkvwwNYwoXcXHljY8Wo z=N4zZ(~PJPYr+=iocY$WA+=9c#2rKg%ZhLIOQ1V4>ykUO>L#PtGONiRqurN@^ETgP z-fLTZ*0NMQn|v?@=YjjSEIh_nRsHT)v9>a|87tu{(C{YIHR1~iurkuJ$9!~t#Mj8b zu*xT4zv(zw0yR0|kJyO$j6N&J5yK1m?G!mbvq^?t?y|_yo}WN7^b2ZmRSv%M;mBt_ zh@MuHhCV_B#%BF4^CZ}CKm*Nr%o@lwd$xr}ffP~i$yIVqY9=DwLCdP&g{9k^hvx}5 zM0$o1^&uys=jD{d8jO)FVK=Emj_g~pLZl$#de_P{`HZFkIT{HgIKyG;GafCs5gxvG zo5Tvjrl~2l*VU)gY7r$+(&SXhSeJycZJnD0dvlR}2tR~Hd}J3j7s9gudo`jC zZ-N?%1I2_mFK7dev$9wtQ2lKys7<7ud@DS-cJ(R!+QD@Vjg_Z`=7#!C$R={FLjJdR z=im5;8_A>oDD3c`0$EKJ-!a_SN7e3Fb&2_eQQ-Kht(&owk$1 z5g@-hkWpp;ENBkmD;1~qlYMb~-N4@UpiQCmpj8>jM}IZq0yJSAp|xZU#{9WH<4*MR z{fPCTd9=-*x+(4V!|dbjanB_o_T$kLab?(FxJ=)j9(S&F5&Sq1r&8PMaM8bgzMoEM zSEsqIIjNOXiFZ%%*e~uJ&#hm^SC2XcFTaY(BavVPIR|G&Jh7Iht4U52}tC>P;8 zPO0U2!xikrYoQu=LvfpQzZV`CpMY1HlmpvY*!`ibzIIMjzSFmv*W+Oy$;t+KX4y4Q z+U$pV<^@*Tx9zy3GTr?q?(g>;#Y*A!_T%;HSKSX~3aD3lm4*c)R4)zt2~Z)k>ArGT z%oeIjjY0AV(R*ZY%crR8(+5$BS=298a5|F=W8SDcrPLjD(005utqRv_(3C-;fUcGz*`^R zBcWSQeR2O;DuCLsLSeiw{-ESE3Pt1Gqa5+hocd#pV(GDZv7PGiy-yE|BzkrkY`7=7 zWBbj)_K3?=^LanzA(F5LUPDFpJf!i_ehP-?Hnvq9hAsFPu+j3O6@!6uHP~5o5YE4Z zy}T7C!q=SC%Nj_JOC5;&qj}$pxF#*)6NoRsM`JbLA^JT}O6^AH?8Z{Z+r53A%=>y@ zxCpj28pN%N!AM8=d>Em=xeA9H2jQSt->Z5R^bO6sK5#-apgYpRp?!ct9CH%8(Wkg9 zjf>hXjff~keKh`9Jw5kBWPN)K4wPMH-XBA-`=16<+)?%+NLPkcsJ}Iw4L)Zr_?#@n zlG9*Ut4y44fmVMlxE&3f2a9@%9Ya5V1nZ>^|gj~n5@|)b`(*?Vo;U@eUpY= zjqg*-ujp-gC2Tw{)b{VuZvBsE=LaZD^k$nc8GfGehtc-cXW>G}UiY1WUMCCVMR7ee zEGL}BM=Cu`eOH3-OvgcR#^3CXMwsXV_5;1FtDB2=N%yW{a+tm#gy-@voC?7<3h&+- zeg7$>fK%u>fZ0|GMI$^E1#A%6SoRr>J7M=Z4DyTN?%VKhTI4IIP;`+;D6+AYEw@D5 zVW}5KedV|bS6dy6@l-CJZ+6GVg`$~}J^zh$H=|}ZR^Ny^y&j@-d+26fvps)$9hE1 zdYrhL+A5LJ9+rFDXi1+aACpnDccIz7)?JBzC&ODoVa;<}oKIEU;1-InbLTXwU!0_agg5?zcYo!M*+Eilm&d%8#uo3GDAv3P5x_O9I#gUe2I*vQ;40P} z8ybqY*N3gW7>lAp-0B?~eXp?Eg6D^a22~G5TGabqR!FT!g3@Ad^=9)PQek&MC>1(H z4NHsmP+Tad@ef|om%IR-5cCi19v*w9!kZi|!w70g1OI;wczg}(0Vl84?F4kx+W=Pt zTOR=)SQIuiKb^I$Bzx7^oGnLeZ0+jhh?l$?y?2}YlA6byZ56kA_K?&M9;@Q`Jr0Ty zQC{~M#=5+^9Hn&x>AWlW86WFy!BKTTA+L=0)~msv_}xDQ&mF7bXv0sT_g%$E`-O8F z&4{^tZv?xYA>zqqN2jY5v&T{|7QHwQff8b&} zt%?7D=2?ZOx51Og+D|yDZy%6cA-WRYdluu-n(q&8#!4tLb4YEkIc#zXIRWkdDxk+k+jhSj1I|Vo7*yD6h{@K6`6Wp90j! z9<9&Cfd&Vyzvv&(RXMPZ*06FsLn~8RZ?6>uW}ei^nI0-(O|Y=H1R?JuFG)M;U5c@& zVVQW>gtUL}yZV6e1R@5upywpDkDd=^?9c;W&S`wvE9AZCJ-uCL!_zR<>Ml{pS zhzv%fwkVo=z2DqBV%fNVgMR?0DP~74{55Q45f7?sZ(A6;` z3c=>bzE?;m^u9g9A6u(LtW}=CbG$z$0e{THLH$AWbZp%E&Y^!EFB+#=fecqaq%DDT z*a_0?P-$n`Z-iDt!y?=sU&DSzOoRkU9mx_ujqM^ty*dr75*s1lMbMEFYBdiY0>bVK zjgtWXyZ9RE#m9~#wi^zijX1$+r(3QhI~weDjYvgWZqb9-(TmZRHQ+VD-!-+v!xFx5 zS%A&e6dgU2w&>6Q(^r{@A2O#oZ#p0IIeC&$$JoiUNTxiN;6jvZl;VYbitn`TmUm&8M2+5UEp!$RJHv7FD7}IZ}<4X1d8vEvM6VbeV zXcJn!?(o0i8iI5a_Ldaeu2M7;EKDy=QZywL;Vi?GfxO%N2YXj7vNBLdJDqb%2A_$K zwmv%A0c9&BGvf2ad9R3k30_8p%0$l1oKZBKCLsO4in~Gk?(Vq2yo})sg1scW-YP%a!erYv(v%FO74y!|#0q-!X09L;GgPdmL%-EV|2OfzOcvc-`1( zu?G;zHmS{-OuH<0=FLRpRm9mS>2c3>uB!MR7HmTCX?G@UN`3~7#ypvb zhE3mQfI+Q2zw>4e?KfB73@Cp{QPZ`Y|JJbO$|ry>NV}wWmFLVf=63+nC4yESJDTFx zYrEG2Yu2M@tqMk@&$=`R_x=paxsTn~;@^JXCrYbLDES2R;=9;Y@)Kp9d0j=Fn@S)n zHk4o`coC(q9VA~Pdzxd88=WK!&zI2T!~LEMf)?C3F7&6?_3QkVsk-yU?x@ z2O?>JHyId%C<~eG0exlwHv1FzFcuZKMEu~y6Mt%wegC$l$tOM2lPzMNpMFRr6` zqsI7O1KTH(OB&p7J0~)|__pJSBA8ar)mEFV607!!*q6K>P;Lm*J}$0xGGvwIF4(Pu zmZ3da-f>KXbSn#qfpC6Y}ES_c*7z66_)<2Lrn?KG}R^+?osDf;3h?~8_T5!&<#`eImh zA#&!SEuZkd_*FO;?{wiE@|~5T|Hl=7ry5cP_$T9?A&{=fT>t+We`i8Ci}zm^WNahV}MeHmn{^LJU`7f9Jqv!1nolT8BP8{b%rJ z|DtbA+s&?R9AEz>Nby3aoi0NwRJc10%ltClitj>w;f`&;e_Qeygs&6#j2UO2@N;Fnp@JaG6k8=Ml}=ZJX+U5stARpNP8=yFj$c zZRF7|tTWfre(-Mp)vh9Eii_~Z82_SWSuV?R!km_7x--fj4;qf(^Gm=X*`La61GwWa z`5b*HME0lUXbst)%IvpjO*wDPiV)eKeua0){#0fyc;_qr&MlxH+P&DJ)r4qCyM2#C z=Yjdw8l7+Jk#5FOzI~>P;O}{tmG@j`aIpi_O>-C4H}d?PT}oOXg7z8s^6XJGTPBC7 zZ?8dZ$X-omcGTt?UYl~>w+EtS5H3+;v54&y^*!l4X-hsJx;YG47t$xgUBLT;jYHvu zIRw{tgs1n?wT`OJ>I*B}hd2O_cYQ*{8u6+{N1QujethE9diA<-5ezi`xgpTG~es zN-YhCtnC)eToKV_2|K=}jO(qL1~sFcU?`(KriF`fTm%z7v|ELVR@BqS+r26nTb~Fb z)&vdU;W7Tvb~ke`f0}b@J8un=d|PHsz3rU)f7Q;W?Z;u2b1r_)LF*m~G1m~_XOX>z zxDp2Jhe+62WNqN`&tm5$4&hmq)S3aPO%ZC7HIZN{3sDPHTAo@l2(2LuJTTfCL!Z_V zlqW$3LNFQM+nNA);s0dZXq*V+!jrq`BDaApgdMt2cqwsSea34%T2z32)h~0G<6mv) zl#`A$qr%KWdS|!$J?SDw2YORXwb8mcBit{dw#zWekDA6VYpXyrittzeAh^4 zDk5H=sxzg&Rju?W23gY6#t|djaor|)aPf$Ph4cf;yFipM!-9uVg4GW$(jm2DuCVJTC96D^AwBasgHd$iNkt`l-F!9r< z1@;v~xjX%w{zK_c^U`1NkG2=1<*?n2eCMUIWAewnC>#67xnf=#7vUQu4~I4yZ(qdU ze$X%M{vOYnepc&CdwpqFkKd6}yTQ4Cxmav+i{tkpO;hU*WmrF zh_FgD`rrKEpz2M#NH((;WxW<{8+{f3>FQcgHp$Cm=J&PmQhz{9{o_&HKlR~}XgOrXrs~@T5ACw9 zLi2i1X2Nc=0jQuFKyNYeFiG>M#iHll#yI$1%w;R2ie|EMj)Sc;`sapC6=|L^_LR=WkI)qdV6cW1!BcdjGdaipH~))OLoy-iat)P~CCi4`|^sD4TI#LCL%G}dA?dGy1v zjuud#42hVA!zy%y4RNttEmburPI90SPYA$Yu zmF|r%-bl3jB%ii+lfxBlTi>xEm>@m5>ZgD>OwP*XY0LqS=QL(ECc5=Ghzk|T03M#} zxAy9Ghjf~9;EaQLs7j=W%Ir~+ISxD(<^5&$EpfknB5QR$f&Wp{MJY6ATb19s^nfAq zxgN@UIniB!ZyX07T-M76f9N&ke9wCx`?YumBmW@RpC_`ykTCo$_h6Lr14~clRX{Var9-W~4tG=Q! z6;8p|2?vd3Y*r^7UbMUc^LkP9FvKt!;x39}nG)!5hjpsZX}JJ&9`l+xbduf^>pyn< zB28v6lF8>C(S{NWM`+%WUbVrw$Wh`LWo?nTGvc%_I$uDjL=G{}6cX^n1 z@zHr#&l~k(l$S)c%rC;f(Wqri=1$U!?O_WvCK7XT zj#y&PLjNA=`A3joMN$fTDP%E!nEmdZ4a;R#D6dnROz|!q;-d>Wpnyyit@%5TQ2dQ& zYZMa~1_+;Pq`A$)$WPrCmJZC0I4RMwAbwC{cZRhbQf}>S-2&KG!xl7(*DeGr%J#C_ zP0q5~L5?!aKnplyvd0D7^wHf9hwS_Dh^f68>COo3iY%j`3u*zDtANx;U{Ao4E)RKa zkrrtAj`YliPbf*+Uc~BXt|kd^F>3T8pQnSuDwR73QU!?(3HJw;E3vF-UnPh8PbK^` z4A$HPea3K(ophRscz;m}ts(fkKNJT!12k>mSP73x?E4Vmr}v}yoN$sA z_=xcNg=kzwozs0}FJ`o4FvS=s7=(ZDaLCK(jOnPUuJ48h@VdXvb<`4gAR#XePo_tj zdbK5D!T;e~-bz7=lmQ{NxYt1t7>$}h0Pk>lsp zdvdhi6MO4j`XAI=jakZPQXk%H66)cE{eY0S(moOY9|{WvQ#vo>bN;gG%TVj&(D-VS z94AC;9|}(3Yr=SF;3;~zx+eS_?2G-&>@n=W1#2g$E?|FaAM8K;JnT=j(@I286+2&P zR(o+o*xJjRi-?qD^$@Kv#Q3A<&yB)}E)T6)i<+~sn*GJS&{-U%Qi~mn9IrIT*1GiQ zD))w`%>H_BADTGSZVhUoUBrqIeis5-R=9v$BJ8M@T zqc{SMWJ@x@EwKLy5#4bZzFHaBh93l z6{iSwBzZtTNWx$h5lrDVP2utYV0-v+sI@VH(~%JWFP`_E*jt-Z0n$t~K(+?keLv(s z@XJ^VPsVOv4foNUN)2u9T}Q<{IEV9g(caM#c62d7o+q(Ca1A=_W&*KZCcTve zYh-n8dOXU%OYFYDzi-3&^%{*DybW6iAHKK7;%5#hh*8Dv0fmFeKGBh+NQx3O2jX~-WcRi>IgrRo6{5#4 zGMxrjG-PQPaRj>+_ z_N?U+c)VH7cKBwDabN4qbS5~iK+GD%+i}>iI>u)7rI_zl_k`%YhTJ}HeCIf{Xig=p zv#^5(EUEk#yTUp!Fr}ZCL_~Sx^LA8!sU)b1}zdR_O6D{(cpg zJ><{l^ldS$A0_s%U!`wX`uk$I7=4?-MnMyxVz~Z&FkIRNFr0~x!`slP6K1$S)C4;R z6*Ew@Ka4-LKLnpwqxLFhm;yNjjYACYQ2+Op8PNPEnu2s&#AnCGf^a?IB#OLG+|%@v zqCCru$W?MyCP|~_c8QW$d`q_=%{Yv^+TocPqx;WV&RmL-xel6O<;G$rIm0=awUjlDBXF#@Yl4ms2lULxq@$M?LFe5Y^V>_Euxs{#- zRv#(MY(Ru#v9P&YkcH1x?|I3Z7465_xbN( z+j8&6RM0TYbQl=*YBoCy~DBh@wmu41FjG!o^;n& zidmWUU6OdeF!5yD(v3n^Mg>M;pHOjf#w~}1DZfOP&djL5h;$^{PFC1VyQrSepq^w4 zAhB9r&nndO8D7tEKE$1XJ;4V)jHlHLox}O{B$yHL4Eai_IP`pboHC5^LjPtLVXaob z1>+?afdVC}?Ibj4L=AlhKK6H45G8p~AwN=*9SnpvL1Kp#Bj+wYiE_FU`3eqql{Vl`4{S-*+K=e6~HNs@2={ zPk}Rd3$_Pu0q6U&T{6wSMvH?ix=m{d22>g_8TM-D&iA2c!F(T4f%*9N0ANbc7j;^A zt8-yP3i@9e4E?0UbiCCfB2Nf;cfqdSY~MDe1?zaOeG#l(PlLA?O3?0M%##j#iWGdU z+Bdz|(of8LiBq{>0ds!|YZrC&lhAUJeIAKJ%SG&BfxDo_MfQHg#woH3uSK!8AH?nx zY1sXIz_Tp9!ZmFl16`tUdRyC{Dq?VOh@QWG4#0 z!Yt5xhQpPZGee9C9@@1u-i;^%osgI^5jI1D1$F}#1qbaLbO7IT;~*N6Xvd`5!FR=V z*=0kWrfZLeIJs|p6svo~)g*~{KO*daO(LRti{thWh=XN-0NKSEe22!8>PYpYZ$AGQ z8SX+s?SpkU58%~BUN@OwqUj+Y8bKyDccNm-NB-aoT|4#$ChS+QWFS3qsU))S>&yKEt zME~}+?~tA25vM?w5t;Qa_gDmCrPwvg)DZFJtM7AqEYA3)}-C_m@}>N z!3r5#W;I?%>>WgR<$1D0{f2%!BBQ}aE3P_$4f4g+kX?KN%RrGP z_;nzqdotpluCEZ>fD1Fl^Jqd$5i8=yUI}YZNOTETqg3_2e!B+a1>1XAp!j>n`LMtB z?t`d%A2~X9k0MN_S~kkg)jL)?grR_f2hOhKSAY_~GqTn-4e8U7s?N*nZUV$lt-c&R zn-iXj^WgAJ9PU%XwS0VQs;A&?TDStcK#Ji1*YaE`+`n7YW5mePw+mB=2TO-X}S!Ln!9w#uN}T0w1!U3fd_b`XDZ_0W}r8P;$5Ia zgn*Fa@3}_#ORo((QNz%RgRf3O`goMD7TJ9v!n{pWj-cOu{oMJI0yEn0;@mdvFYsv?c7^(^KC%s1QgPXa2>rj>@Agn3){R#GHhT)* z*czUGR$_p7!p|ZmhEV*2hnr&j$W?&{LXJ^js`sx-7pev)M|K(OEwJIxPVppfys=P8s0{nJz z?7p6|ND^xL8LZi37!NcbDEo8Qw#D4;L1fO}y37jFI1s!L-2AKYPza~@;hlz{tVhXa zdgvhhdmVD5eETEdeNTikYto%pJ2e9*cXi&@A9)Xh4~|&^h(o`JmWFyR6;!dv^5KC% za`2pJ%hQ8rYfDhm53&)$yeYl4m0_)21j!iH`QO!-VE%jv`Za1Z77~a%kzN-XVYfJI z+i%1FOZsr?1er^D4VP9gMac&OORAfYx;dvTvOR%?(Xm}z-H7{p1M{mFBJGIstr+b9 z`Sf0SQWmxDvl#MXk7bcqYH6@6-0zx+GG$m9IC|+>3wHA5@Ykn@2~T!{JH6grhksh4 z*W_m#w^qytE!TjRG2AmBejcFdtdo#`7*F2Ps~Mu)KL^%($s0f%Mp#PvTpUWYlz3TH zcceT4`=y9h+S#RJU={W|5et{%zy5RJHy$@{EVunLhMonl^N+qy%Jf7kac-mPfoV^A z$+m&k)I!)ci0qO;4k&SvUEJFn#ZgO!LGTKIRwO|3N0Ajpdow%G4|TsAa*7y)T-s~N zKylMyR#MJvm=^R-J)_*Q5!TJwgRi)Ot!K-!xKK>OfkJ&9lm#6Lo1E}sJKczWe z5S+>9JW0A#UH@y~psd8RN~yFmfM=zZVd7!3Ilh8?Yc21cNU*@Wupt+k{$bU0e`#6Wcr0wA*A`7`lG4R z8kgmt5fh2%Qla=$4#(H}_j%1&&*nwfw7Zb1n(cFO4y{zz1Ug*VNbe4qoohhho@*CS z1nfRoNk{&S!1`X8YT9*H_9h~V1`i2ceI$E>Rty}j3QvEB9lCnKphyk(HK{Xz7UX8J98+#WKM@B(95bnu_^t=f@tV%%pp%&|W zDZHOsqqSY_BP{=ozpwwyH+?i)#6SEREr>^Ydv6PzzJFJLqTE((TZvdekJ&LQZ9=yp z4n5yTHct?}!EbG+w8M|c9@Dia6LgDhnv)6A)waLmT6}yV{4uJKpXw8ys)GeQFq7#I z3(WR;H-&rV`h}7+o{6wm3irGagx3}M6y2xi?NoUlGkl+PsB?C-oksNe-y6=-HZl4D zb)805@f1Dvs8Zfy{5{dmByem3dPVc5x0tt%nVQI zj?We6=56rp6B1tbK1K5lcA?a-=hKjPfsQ2IG1+FrLJKgV8J)hbcqceezEk%k?9FMl z2YUVn%d zb>SiZPr%Gj30me z>?Y`jl@(DQ-S#6PdROl(cnGh7=Po~&5y*qDl$g2#JRKf>afoJPw(xsh&>*IDI0AB7 zen&!dML$IfG`dn|3)P0F9rF0V-VSbV?g7lVm!C1RAbFQ%i}7iG2e*lfF4NKjh8obm zWeHfVE;nWkwAStZAfk~_T~R(n-fHs8 z?vCWuh*wa~P2{49t8*qM1!s>CtNE!y4Z()ZMO<#v`AdFr%U6;ADBmz5XQEgg4RTjC z$ou8}9ivmHwY&naIaX(4%gHm)B2P$gB_t$d<1aU1LPEl5?v)OgnBdHB&6{{lC@bnt zy6()fx+YAgnp-0iCmLCs?&u5t*->{= zF!I2}$w6m}GVy!C(uvmv=S;jd$W4+l>u(%zM%_Yf$9?=C4~*_!)5BdQjN@AuIVXio zSLZ}chLhUwwwtduU6lpi=l#LNc2m;#`rdg?5IEKsYn*=3F6P4{#B1hW_Q|Ft&5D7AB()wv6vq`jyoUqpFA@t zn#RrLzK;L@?(S=@pZk)%&BE_%9L?bq@R`eBmE4h$xHp35-4(ORa@Txdt4#Beeqg#x z_+T;MVzp+Hw@2t}+TdfH{7djR{1>8M&nb90DFT3Otf9Gz^3$5z;vW*V3hwB0{{7IKbA)%vcWP47 zo5PMocF8nvc*^2KX89s!k$YswfmwCtx|tW62H|h=TM?37yvx4wU+^stg`Ckr!qav8 zW&TXL(`7fus&TiL;Lnqn84G-9!gQV!4S%vUKEufsyQzGY`;MXhc#H>NOOi zwxI@^&sXa_sNId{VW^#dmU=uZ$k%WaJs}abk2BqQq}^ovsI~B+=^ldO(%XycVTrO;nG%3+~p75~J(M-KZQu}ej-2~&%{Fgv)hb^4f>QV$wg|1u9W z)h&|!b+1R9h%f(i9nI=(k(}rt!>btOF?T;KsoW3=Y*TGME4Syeg zDNUIv3pM(8k6lW8O{y_$<@2``c6{=3dlLUaMva_U&-Qt|C&FvLMy#Bx3iz7oSzA0~ zJ{c+By`SHT@g&#_Zby{HjRjYS`4=}ugsB7@gc@2ekz-$cL35q#`7AgDCv*A%r_E*? z(&>Ll>foiBa>juPkk5SA3cda7u@Am5?&hzbDKEHNujRdC2fz4kjZ&W2rTxF(*)BoT z`}`*dK96(TV5v(GU4lgvztf6yW?ff2h5%B;D^h-bSqfoLuc8#41xDoJT%z(JXsC+H zS2csnglN~`7eyDxOX&Vh#qvbw0tVHL3C>CRKe*<4uRM=yR`Yr@!{j?89jB%_dK%Hh z7MIsF_{vX}^G|cna5FLv@Q!HFE@&dN9V@PQec;<^E6HA4j^Q?-)460!CtS8MB2Q&8pTd>>%$^ zp@_Tuh&lxJXzxaN+uMLpF!F3-O^hgS*%(jml_i)Y5H@@K0-een`Q{0_keAgWm;T6G)Hs zNTaMsmym9BS@VoRDSu?a*AYsK_Iw<%ISrr?he-5%rsr=FcoQ5+_osR!xiex#>)aUr zsT_N@EC5$n+)a@VjF4HDX-{a0+!I=o`-u8*KRo7g$sNgXQyx=aiH*a$6R=ip(Jb)x zW!?8DXsH9&*ci1_9W%Qfh?$TW6r6*CNr4-XqZ9c>K%SUPyi!3Gxx^ zUesqRUTYQ%AAMsUB zM-D28AmVo5yg2AXlqCn1vi`BG=#QFY{Up-tKNZ>HzZ6LuSqz`CZ4C#Nxl!I?=@xpu zXDzG*@>|hLyk;Y6*4q%9TQQ<7el^mHF}YbQ2%TwlR`bqX#Ojn^l=Qqy#;-K zOVCGbZ4UYLyX58%FeYmwdS&}G@_YP#j$fneOeEz0D)Kw@H5zeUHY4NEhEzO1b6qCi zemj3RM=jY=hg3X=L;aRVm3??Kg5J0X=FqK8ap|oMrP6Mp{WgKV*5GEOSY2#RgyJJ; zO(<@oU-zdG8_JxH{1NvNy0^CLz2NmaM>WGz)J*MB`}CEhVzK>pQSVQB^DVyBN&qQ? zzHN`5lBqoxwKu!+B-LGfI&zEuOV-Lc)?zfG_fx`(csJ9W*<_|Q(Z%)!_1M%*-+i7k z&&=luLCy{ihJAYjy`xlXGo{d7GRm9tx3@P7{FJ)xHRs>z7%jxq!|*gXukx#izJ0x%3-0H~K^nqRu3By%8jbUbw= zi?$F`e-91z6_qC<^D9p?JLg}-^irngm8f-|pzHKbg|Fe2m6swfEo?>36D+3^&uKyZ zd2&f6N$_m(cT#ih9baXBi2NOq+J#*aZJ)kktZc?!YHt?#{QB++iVh|m>~KiM+8Cc) zKQ}5`28SibSCKzyLfNn|QDe^jG2uUHM)$ChZtW`f9|0HAgRgi72h*{m#<&rsB867s z7tJR$sVva`gVfWl^!z!VE$-8iL(0Jpn?TV97kWmx`4DMZKGps5dHPyxPr9j%uDH>XYPMN?m&>b#g21^O4PF`*Rtlsi)1l56$Ob#pJ3tAZ8bGAw9Kup|ZDqerj?v z4@;z6)bwhfe*H7J@sd3pSy=gXWNLw(McRm|{{g*L%GKGAIHow8Ia@pazQmbfkq1G_ zB-CsxvNpP>HPv04`#94|r_(GQF}IQtcibpD8?15=v9c=wJ-5_B$3fnMIJxxhXZ^gZ zE3&X&=kJ){QF|jiUuBm6u>865wsNU`jU=^urSS#C5l9TDgXSyL9Eh(ORPRJdsUWd~ zPpm6E-)!hG!?*kr*TIPH}(chwEDDO@%o1HQRq>ThFjG~`T3 z38L184+pr3TCk`v%2KwHmQs+vh8z2JQB6`R2YV7pezX)EyV#>1p>j45O8ILCx!?4`FNP>C0+ip&IUa(~ee%Gt=)#MlP%0@NZ49u=qynLYw8N!P zL1`^YXJrZDf>QoEhgf3*V@as5-|4xokx2@x23lcKCh=dM%_b51uMn06K0B zcoJi)hDZ5?2ZB_B(h$q3W`Dyy%De)~%X33Ri%QpfhBnX3Ob_3#jkUgc;d%Zjn~9&p z!$7SMCt$)Y;o(@lG4)rm&mxOT`RR%7dwie5-|9wKTWweDzR!GK%!y;s^zgg_TLaZ6 zp*|t3=iTl*7vWj?`K(61#u0Fo+7*t)g5qoD7f|2rN?L(EK5L6gH=u@v@fwoc4j;{o zeG!d;X54`5+ZwkAk$s_iGfUPz&b#)`&yY&e*}NB)?xq?r?}erO^-i}zc^*-Lzx!VI z;Co4>1r*%~?do4E0pGgXlh9m~X$tecF;TN5EfU#RPjh>HbV8X))^?fBy%0_7*#-_o zTU~-vXh|xgmAb8C5uOcBvE>KT%<(rf<8Q8szxj55!b{^&aNT%8Xus9Gxo}d8NuGQ5 z)`as7+?baN^IGo%&S~O@Y3W={eIL6sw~eBvW%2p9^H);apjOBBQ1%QF#?A0*EAE4(d^detAg$|_U0n{Js(Murw0Zp!+kTA_2A%hjx_AR zG(}|3YRK!m81ecp;FLs6Q+z!htAZlXReQP-LFH4>CpdYbiNHrqe8mPw)FdW(D=OFu zo@r#7RI8QjfJM13FuB1ZOJR!)&%@y1jgU(Mw01Nlk#dWLWsJoF6VE=CAW>i+ge0&d$zexxpeWq}_Oqbca!G`XpWdO*4S;3^K2 zN1^Ze=&c(&;?r2RGC7c}PFV^LxiH zB3aEp_JZD=j|lRffLGCXc2ZDuN*JX?^b1F$gFkdzm5=Ta;SU-S10x~7Lv&A==h}61 z&kmXs)VQ#vM>;p6dv%AubgeQ*p|c9~mm{Wr1v_Dk#=8!Zg-Te>jgk+Rj#eJ=n4&h* z7lEnrpWvbWI#|M&;#47S_(zC%v>B23ILph035PA<^erh!(`@H{UuX&u=6@mby{v5o zpMoky93H@Y;+#e+IETq8wY+uLdeW20hjtUb3BmOwMZD+-?f2HYy7siWq~}uGE_jpR zwTDS-ETXbzU4n)05hnXfp=Z`_l+DnEEo+=0eO6k#Zr%zV!+8-a`vT_0V1yTV;8-R* zFULSJzY;sOq5^s{ybTlx^k=9}vwW%)QTd!HttUn<^o(+QE7w#$pAl0}#iljXuB*w~ z?J=~XXN~5u@OKZ7N$>%})&%j`E7{!elM-8dMn2*h?QYRH_vtLaD|e1%f+U2^S6z&p z&ib8aSZgWP3Q1vZ!E9AFl(73I^zxhF1mtW49ZfW98mLz)eHycc(~)LsHCf?VP;zH1 z7^tn>-(attdnvYjt0z6w&iZX>J%)Z~x_7TzRJky-zUO?0&@(81Mgwm{`>dsjufE?a)5Xja3HcB5HpHzr(DKrn~A6AB@H-Fe`HQvpxr``zuOnacKd zvv9|XhWDx+rBv%0vEb=que4)4#=0V1ZWF+w~}+uY?Klm2e8*NURo_zn*LRUs@;D3@=!h zC2TbBq80K@pExSLjlQ}W9HmkH+Zq<*lpk79kF%808_|DTgSdt6b1}9IIgyRQJoYen zd$sr`W>)hv{q8`cmgvfogz84kj`bi^JHi4>n}>2|0-r|iQTQ6H@gV=av`hCN^b%6I z+#{hz%?e&lhHI+9fRL^(PV zX+-oG&KU{Luw-HHW!j$4aA2M?T}F(np&zL>9gYlPUu0{%hUx6-gW#t4Y(LKMe9U)~ zKFc)cF~%R_0Y^{uBkmSvn&$q=etqsUVizMW!j0qeepUQS;=3(HJytFUbrdgFHfP|g zfxBe1W}%0ReJ`zBpP5#$*hh7h#OpfWpFNUh`u;xpYPCLiVn!S)v%Q6&6NBEQr8|6^>490^@-))n?BApBE|zD;MTt7AE6M?FWU#&QPo*eiIK~ zCu#a##;@JPR|}3(sLRMh;NaYYhZkbqw2N2bjl=SuCMOB2n;Yy z=Iuw-2KK$+F%S3kxYtiI;Ill@gjD-c^%mG^(|WCd|9i609}Vq*+$u;tC*&Tmj`>jI zs%9V>%w%9wN7dPVV+$r^MML`Nsnlak&Rr#kG;>vI<=Yq53^SKEU3kl2M()!+{HV-h zoFiMlRkJSq^M#vp?x}q1Lek(_!wn6PheMxU+9Xy98~JCkx;EW}6Zxq6^F9-sS?bw; zbc@if|KH8a|Cd#LZ-1|vh?P4#fyF-892{K{`II-$ByMY2k-Nl(2rnEwCJ-)0tJGVP zAIQSr!jh~NPMqvIu0&UT4b#_<5%;Yf_NyY~=fIP5Ep5LHm>_?Eg-5KcfoE^|u;|EN z3NAy(uTpzLh|SI3UWy<}hCOpB2T21cV7Z_qM;QV+^oZbRN?m}z_A_5y!**cw8FCfs z9n{7<97~5_w_Ad?5^qTs_*3Ro6D(Cejfv0``WZ)OF5$3=*falnl+*SVl-QM1N_~R? zzB;7Tgv)9h6g&!QlEzRAj%+TIIU3vG(Qzr&4ca~b6i!^d1v(+!B^eki?E*8rz*rk? z^2h2c8gRxUV7%}gWNdpU1AJEZHjf2dZ>pm>04^~{oXzZl0sNP@U0^sr;*Tq{p=F)e zjCIwtxL~u#eArwvyM(SZ-@qQrF!PSIGWr7WJuGfmH1JdgxJdZgUlmYU;2$1~`GHd{ zQtTxQGi7ix9VN#0gT^Jwa-Rdf^x>P_Mw%C(&bV&u8_xEzI)_0iig*37nuvSr-gG$; zI#_AGU|={#ml;N+99Lp_9-{wjMbyTm!1d0Hp=AwX`6SQ+*E=o2C7=ULVM~B_*?fcr z>LVs@0dMPx@HSuzdj<3{0ktOiHX(Ofc|K~9f|Hy=kazJ@E=49e`5=|x#`gsIDRv)W z=$9g97tLrK8>-}hll0)!u*uJPxV8)#Slc*QkdsFF+-I>ftK=>626;*Vxad_^KgnPH zYTYhyn)s_w*HxDy)(!!d0y**nqh78fj_~(_H$$qEEh7Re=-IzP1MjOgcwmI=*@5NW_nxx zleI*#+NOrLLkF0Db~|=9;AZvl2tQ+rY}cmUC^!&nZ{{?dZe_4o`tsQ5@Ea?EOYmT*{Fu^%$UXZJ*-wv=wYf;c zo*|jh29GZNvF>{cXH%xUNH#@3goZ9~$$h416tMbW0!0R+D329Pic?k;-M5pSX6Z7Q zlZrJp4w%08LQz`APU{ZX=ycm<>rMsI*53gy#C{yp9P3kws*>_U7T zesLwA&p(w_2TeQ2ty<;y^qpqpk^9njO~?7fMHhf0Of|0PMXAnv6NKH+5qVa8b}py@ zqB~sZv8R{ra&dP(<~xU-Hl`_v_dETjIzCLl+&HnVnBr+W)!?iV?mDcI_SHP-dZVuPn|nd&RPj);}#@&&n4RM%$=--WBCZ<6>_2 zhVI+J)0!pnGqx5QkNv27eb4T8vqY_)ip)LxjwsDAY`sYnZR}ir5*lrg-ncb~jn7|L zx51;e5gg8xfxR8G?uAs&ZTAkOKq?S*ClCySYyx+XAPqtectRS@^NtPf3^&0tiiR{Z zRu$l}=lsz3x($*&U}fQjW_}7He}-m_^4Ga}f1R~}tJ8S~qz!wk=4e7Mny9U6kBVOK z*Uqcs^3vL<7k2lpkQ+V+ezmz-f8Pm9)dBcRdRB3M2g(rNgv%SGmvf<+yjdf*=XtsX8)Qjd8F;DnsFdWnmsd5K>`{3mWqwwxAT0ABMCv@yldU@O=S zzc}zqVt*Vpkv;dx7%$(1G@9qVo-f$Z(A*AzixhX1^SeI{ct@Z%2Jz z=)@J`TGmMPFzu0;`WECUXR!DFRr_~mJ(xMrKGq{^|HXgNz65&Z`7Wz3AN4*Hb2aEV zXiP1R@xV3n5l1(h@e|&G_Z;Hge3u)1PFT8qm*Zy$d5v?ZX#1WuOnQR7Sj}(z9shD2 zeAJ_MAy!d$I&*B@9+{gssBPATqKxGpV|27ceghXAxXUwB9t>LW?S5{2=5c5mU_Ol< zqs?a{cOW9EsauMg+eLx*+IMh(N*>KU;!uZ;zp9(>;1QkiTnj&D4&pN2Bo78usl-0| zy#FF#?s(EEw2;jBPzNvCUo#=*)_kqkJ(XTEqhzV&BrRT@8sLp z@VBCcJ2GEtx9}T0$3iC~_ZGs>(HMTrIM&N=`j(8c6NExJ_joGtC@bMP`{pt)-XIrh zeH8sT*2mxQy*h59(8k%H!b!+llk()-w8|01n3awFc7jNcx%O=Y7Bd1-OgP3n_`L6k z_B)FH3ruVfQJKK-6Oq4N=M@%hLhf}~JEN(DZ!(+Ve8fo@%xb$9Gm(hdJRO@MCqgfS z^ilpAyH-vF{EVrscuNs|hz31~xB3_UYs}OkA!>>jY5F>g_Uli2`j_!1olfuSr#kd} zFU2Td9-fFg{^;9$v{wJx&jFi^sok*RxEbro6EEZIUlW(=-Gtce1P5*hjPaa(Zy6+O zwrk^ctz|U}z)`5?1FYtOr#Is52y9FN^hdx*sjWL$DH=DeyO;Y1)^uCn6pWf`I*Pl* zoizSX-+d8X=4j|UNb7ed@o0!Hq7zTpVT#(jL}>Rs-NpI!NEb!W!(G(*Q)#P6avbNY3z4DF7s;8(2!rmz`QSLL?bVmNQu`^0$NDc|Oz6=OnqVb@H?SAUJAP^;8VcOUhV^3=!6>tEsPKI+@G zvapj{iS$vg^)>foyu3c^$NKV+hekH2FO#j<=)RZYoV*dB_Niwd^lk%hWU`!rn)-Wb ztyyu`)tfC7FRZ?ocbKcQ!C8dVxHlQHZmMlZ?^4`RiBYTs<-Dbj@FaToMXvzdXkjp; zh9rq+gI0DO12^R5zBI-S)` zDILArSv~sucY4pkN4}ZO+0S~jiRZg7q5LN9raD+^0ed7b%_fF}5_UP6)%AHF^;us* zf5ZJ0jE8D|m%Z2b%E3PJs*IHh{*@t)p;)&JdXBKT;q^DO{5SUAjIq)DUW+^848*{7 zpt|*)^JZ+|{)qN+@s1*Tn#uC-jp;n#n^--qJ+Nk}X56x(_251b{2GaUFl*cQ<)K~D zD(=~Q>;uyKLLYnQVTG8{(i*IyfmQebyVrNs{e6_5dX|e^0p!==Tq%3+iI)a7f?W3a z(+lj$6Nh-u_Rjwn4&KO0Q9HC_*RvG8<|$XS^NU_u-IQl<58Ks`VeaO>wnwZ=K{UZl zfZ)fq)Bep}TydT}7UOuSXEz5fQ2V0^bUF>io6S8RYLcIODrNVmT|;+L9(Sy{1~j{VzhI24{%#xQ%&G!jl!vNQ&tN74ySwfP`Y;yf7G*WHyFse-+O7{hs zbYGB8u*@OP!+HFhWQZZGzD(Xx?!sposWvb0sdf40|&KIr#@ z`n~v0`uzsvxi)_PXfM^S%MhqP7m&}mD`n>>)cb6Io;+%&_#Dl2tQ*mgG3P=}MnMeP zm6Hf!JV~&cFzWg)!JpAF+A!ou;f10hV#gTCiLc7D(NE~{HN4SYI6D294(Ih`4yqWUqV;k0^Tia6l1(pV#u6<8qSD3L*Ejxvc(k^k61O0g`hIs>xl1>L}o8MP7(&t2q0u;2#aa8P0(hK={bxg+qWl&mL9VZV??(QA)pq+OX1W|2VLCGN!egxdDcw|8dRUx%F|v4|E-r7u zP|af1>*G;hrZ=y6puU$2&$dBshk2{Q?z6}nu}WbN*=O57c4S`sJh-i!&mA2yw?Asi zi?5*Bcr!d?#}h%k{XG<;#g5zxFcau4vA6TP7c^MutE?tmy9-n?&s}1_#NQD(nn}WM zs7>C+GidO13^0ZRrD)rkk=*VFuJm}!YNy#F7-fasmJZ#28zcM&)^On0h~@8<&v%Pu z-tzUhddn)xZ^pHv>|l8!t_RD+74NM;`cm(T^|*SMR;;)g*NUYFS0v(kaH+WRy_HB` z=3TiSSMRcll{e#BvFzZ=L|hLp6IZ>r3hB$etJdS{U0$*3W?U%rxqeZbch zpn1#LJkYu2ZEIFSBiHuUDrn@|1iX=K9=tKw*5HlN_7-xQYy#exZ63Tyu&u$HMB7`) znPe02#$xl}O|oqb-lW(LB4?`03QqEHSR#EM=NOm40@EU!%lpBdG{`<&zl<#^-wxg8 zS?)r2se8UVzbvPm-XD(@y1%O1hP##+r57W8iF-Lx7nk4druQGP9AVtO9XnON0O|Y6 zY&Sbt47|&In|UUkqNdd4kk?aA)B~-0hC( zJtv#m$DmgYe>ielSE`fCliFyla){P$goemtmaYiwNx+>Cj>sr~9NZ28Pa8a)@G(r0 zwif{N>Q|S?D2@kl|F%JMK!Q~cy;ZPAI7E+faj=ym-`DqY_PL$@{6k-+J3zCs{L|_w zzRys^7Rs*I>$)ZO%Dv+N5ss?ox~V+%&>P$S0G%X9)dKkGwHkEl3%bOz)M3MFd>1Skpjp0g5rao2g&F6-S9B&>4;4c@AKSO^Z+;M`rz9g zRVep`fsUdY=}iG@_#55f^Fg{fi&SFIappZ<`YS?5G&F;_Q(d`F%+}@oU4&OCI6Px^JEnN8TQa|aoUTwX>IuRTv$N5MKppOOm5!8Y{ zZw>wTqkiI25`U6*EkPy@TuOMNWLgqS>u-L*ng>0B4y%Q83=a$F<6DSDj+sLrUqK%o z1%7*l=CWa~EMG<9J>^DdqIH(r6YuYZR_ZTt_N(DL2e=;Qk|g8AgCpK6H~yQ>GcaBQ)7(=6-##T|u^ccYTq*3aBOlknQ0Ui75 z*~)sw<{aEw4~w@!E&PnQ7N@un(a>%X)4bsF?EF|w?uyHb92X-uI7q`MspO^-@bj=E z%=qznq{kpHD!DbVc%`m$N4aa5=Lf9WMf6P(!5DUa zv@a?D{GQADvE=2CQ!%c`SX_p&yji+V`B+_y zF98jiCXZ5~you}0z70O&6^Y7-N+J7W^;Y>ehb3!@*bRrrud(9;K`Lr7|mQEt@p%YWk|S1AUlL1~(=HE)`z_wmBCr z)0p&UUsPR*H9{~iT@Iix8_HkBFWFsijt^mX@gX$6KGc$6wUX*8#rX$bL(Ci?XxE5S z;d$h<`)kXH z7bt67yh4oL2z^GkxOgeyDTG(l#m+|#D#yyn``)p#%oX-1FJvyoPL7VY@D8!ta$#BE zrUY;>nUt&e3^ys$>psI}bK^94IA4ghtf#hlnKX>j-B+g5{Bqe%N{gC+*bgMxc?cH% zp7Ue57S#hkgOuK+RB3MO$Et=CiE{jq<@h0TOh%3>@KKP(A-lG5grB17Pb!zzajX(q$fEyE96||f|bZ*=kO5k$S;E(B=j@#%eo_nIt;>; z0^X5XAY>cb3%EWtrJyv^i z2hS&W4B?E?8@duP^YCa1+yR=dAs%uZ!I=_t2B^HbF{Yk~^+ep2vn!i2)rcGNsiw>e z5v!eKL0Dg1(8h)2PRdISTJuH*1=4i4k$ji43uUuVr{^qZzthj#IwAkbD0{Dbqb4-X zIV+6csPSP+O|ipH#B-j%TLwh+u(Wra*k zba~pSVIKzhaT%TSy3}Mzx2WX%)>KxksPoq^U7|RAf2iEQV!OX~={Y)SfaztF zx4`cU?aM>TUXAxT%0)nYG?c?!c*XaXFuTT&>b_@os|lP2|&Z7xvi8-Dk1h z%ZgV26jV!*kShg6{PDTEo(k+lkS0`mE8%gs#gI3wwf^F)hlaMSt_)o4ekA>HQ{}df zL}62%`_fP6+*6p+!uN>z_3i%Dq{HkCMcIK>dHHo*?kKhvY$Ne+^bq=u|I1?6;RBBY z*I@!`BE3{2{!I8wz#p|hXX`j%7j$xTt1m!a)T++!m2iKW$?DwaXENAzO8rT1M&RH& zk~$K`(u*;Zz9d2Llx)v=8`r9~YE1zno-8hQUOPme*H_`ISZ(k-D!u;2l@ zmE!8jfUQ(wS1&;@1rUsMePZg5`;`VBR(I}8qPtZc25(Au-rS;Ab@Q7)R)5n)X*17@ zD4BpXvecuqgmO%0IY3*n96WMpu;qh%H$hTe1YzGLcGhS4=C&`@fKsh7a9&cMoeyQdqv z4w5WjeukpWn^2ztPc%OVx*e6GpFH5}X)gf|>GhHKnN*zZMwGIn)I@mVH{gj%z1*FT zQbqo?@sgCjwvQyPG>0VH=dxSX#eLR>$j>MJw51yK^7;!TbE)x2HQ<3KB8a3 z&QL7drt!rTkxxI5r0i7W8H79%Ywv+>V;OJvloi4+WZ8eCO+wfR*I|`RpfiYL&ow|( zhuwb;4GRrtnzQU;#OjKlzc)Hydkly(h09apC$x?^p$?;wVFT|nY#^E4A7pjty!PWU zXq)c45{|Wgd#(#-c?;_O>!1Dsk`er+6D2j<>Y{UwYrwie54q?My1Up{LfZxtT-z&a*~z7U{ak#*?Y#qEpVkYHk`oB8h%G?LY}tYy55_4=Yh?m* zZ}={E1MS<%fm7-=;2!WUof+Ehh556$5Xp5ceNeL|Se-{2W^7`BEf zE-k+ak>v(IRoEGVZ55*QM1zCN$p+;dbfG!WUIS+!7i|)ooC&bwbi?k3EIj!TK{tX? zbdFJ9MA_QO%}olyqM*}%BVcK?k4x+1*j*1taP0hltM@~zF@>$bb1^?6FeI}3FMzie z!jrJRHczrA30e@-8iky%m@H&XoTqHdZc&%^bM=1N#=cwxvCBw4Vu)7va!(O$IXc@n zqD_6jTY^R-XD9A&tNJHc^b$;>lZUj)=0GHXy(x8KZ+gy?&dG9oy|h{W=e0T8p4W=^Jg?nW1zB{pq1sq&s&2rF&JU4q1tGW}zbPT&`jqfUiIeBwhx`9up$U2jowTGN`Z*~vBz86}uD|Gih!4^#9yq({N)g29l%!pq zh+QrB1#zl87eG{X?CY^z+*2k*;k61P;uN>2Iem1-P|jBM*=~v;hFHV2|GP-@MuDw} zc^}zB&??Gsb*VE!ZxPIJqjsWJhV`8R%y6U3QS}K(Dcn;*^M;|h-n2zIrhpy{!^>yW zYD9#!=38C0o^L`rTp5e@egvqdpCtbtE1Ut0#b3_n>M?T$v>`6Va^a0BrhXl>0`kCS z1AMHYwwKd=6%dxZ!!HOaE#(Xzy5#3u62#?WSQT@Ro@vP4pd4X zS-CwFeNf<_Ex);lG`E+4D#xrgg^RwzI0oe@=qpBRa?tNQsxF7$LU2%lZTm#srIj@jenxyH zZj2cAA&O0IH$U}vo~*+`8`mTGK2g8lwHA11XV8lXe8%9N(Aa4Yni%wqwEPiv6Z<`U z$R}%!R5r0Y%;Y0F#=wEY^QUfuY;9PKb;rXZ7FY((E!5df)IE)S5=L?y{?=$bZzG~D zy(OB`8~ChzO+(wdv}iUwpI}cBXSkz`=T?3O$r5SEeT_4=GeSAW#B+QV5#^?pxrm^+ z4LdAjl}>BWn$KWs{=I}jIGYV2?@G}*xTONWgIaKMjwBDSlB0GReWiSyp^I16F0%r1 zJi<{8&}_AVd$5w|aB<}Z&nWoz9|G$r>J4$xdbBq{OU(|LAo=(idvjjXzguFM-u;rj zI}?9Lcmup^ksTH2kniY?G{Cx-y5EV@8%F{6z=iNptm`$aoxqX*8O1?mzJgZI0JdBK z9~nXjkqm$-(>i5-F4()z)Y}19^>_a!Sh!>WwpBdto>5bGqtnpBJ(0A2Gc4UQWI(a? zI$R?fl5jdNe4=kIB3^x7kN%Z;=$Ow*+KaQ`-B|Hd&JjPwC*cI2%#G_}cr@h%9Cbes zm~-7-ppHn}Wf~yuarL*_=?BQJan5z;fg56NI1b(`-sioK;3wBnEb`e@-+b`Kym3x| z&O4jeAjU^l0|;o_7})HKWy-M^*nb?Ga(5Rn*n2V$`BHie1v z4y|{GsvdwX#M_J?{&QgR=R-?iBS{bmJI!}0e(x;R-+_m@mnWO@F^~J!E*T$i_$n5g zeeW?lQs83OEa9z}IPj zQm|_PB|Q}qLhjimh z2V)c$=!*WW|L6VFrE8z4PXdaX?Ss+62do7%!y1eqcZch_5St*xw?-9jO?r0DuXP4o`hD2GIya6%_alJ4@Tm#s+hZ4iOh0^PMnHTZ@|#8N8DceXKjzI_MXp5?EysHc1h9CyU#~X-SeGYXu3SN z^XX+c2NfPsMQsny+Ha7rQgq4wE3h7RtjrH&I5UDySqz&Uj)ybBRXnPh{e1P}^<1@M z{bww16EvoUHV5F4AxL^;wug=2L7oK;?|7Kc0rbrwzl}uC{O_?FaO~iZQ`dSCHjM;K z6RTsY5m+f;b$Iyt#Day`W8I-DkJQ4A8Su_2Y(A=L@D&F+MdGh6%e6Ms1mC0NCA7R} zttYpc?w0o;X7j{J!B$OjcPZDd=bo;wODwoa7B_Dzl143POQ~@NQn!+(6!vuPeZgAn z8Po!-Bi6OOV0^)E>S*UQ_6zX0cypNU|BKyU-n(DHD+zpq;d|fFPhYEF9ob{T?gz~e zU5%sa*BX_pfzF)+R@t}7TO;3%jP*Hb0eU(LeU_T(ZaDhA%65tly=OJwq- z`I=^1?#8Ond8EtxTLM&G?%%GYtv{H_JF|`p*#eu5a@YWHuvOryYb&=a#4{z&EL^Uk z&E@BFOtgNMOJV5N^xKwSz9xt#OBC}zZ~q~*{|+o~^!A~v*+BISf@I^$mJo|Bmv7^9 zsD+GwXhHMp{4g3}wK6+UtBfq?C!__12@`{~Itl6(!-9t>p7gG5zI-JMTsY!w!P}do zCz7vJ!@`T`XK)d6zKHk~;%yyO`?avo*!oFfQkPlp4%RonoapxN;7@9dSBvl8hm*}NhU+zJ(>-kEbzuh%ZytaDEAX|^r9KC5yM)1? zg4MJu@CsIx^ZqXNc-J)Gtn_|tAK~77^cNawx~wpfCmgbHCtI@heYt_Lqi=)lKvLkd z2XPKI-mP#GdV+b%oxUx~PERUq`G}+bdqiJ~9;1ABDtW%UeOnbS?@Z`<*m7_65g$hL zn&h>mkJs z{qT6OP0kFHRrZ(gBTd?MtJ$jlbMNZHa40$aC*L+u2-{?HI7e=dI5FQN<=X;|A9K!N zkfJYt1bUBiUI^})LEaR!3Y{L{+02aTBfc=TN?PL>J20%WMw&G#>eR@m120`<7Ba@s z#hP>%Ss2B!tI^r;j|&WI@BruY`oO6N^P&CjicIj_G9$e5@m+(As=EZ;LnP`bQi6!;@;E<$smldf zNm(OVWX%6Mr|X3Au!kG(3F#yHalf&$s1ka8 z&_3!{JzekACwB}L^tJHQo+#|<$oJ~pPTPEDRlbvQ4eDCJ-j8s3F7e{4+9;Qay*G4~ zH;}$0zms}4p?46xWWbl9&5BXc8iq_KY=uwe;cR`+!ZR0^Y@{cfVuPLxY=GZW(kkaw za+{Lv7R>zDy#qGC6?@)SvMO;dZc4HzBIVO~N|ddDD@S%id}RE$BU5l5ex&Wd$Ogwp zmH;2_G_rJzATR$__**nUYq(#1S<4ML0p&9kME^vb1{zHXo9FJ{G&Y*SHZvOywDxU@ zVG+EFyTD_8xyRfv*hZQ^G$K=cL^!u#*GnE(jEoEMk@{bKhDy0|5A;+Khp;NSBSp}m z;G5k+)*q|uRc)}J`lZh}^-IExFVHqOIDXDm&qjYpWB9nL_3HM$G{Y%2V>U@DUqqiS zL=qi&Xpf$s#dAC0Cizo%Um02X!%DKd(_5@W>~fvofc?`)R(VvD(Iznt_DYoOj9cHu z)E{PrvD#x*2bzKGc_ALP{yKV+72TKA6AIu75 z{hau+T&S$k;GnaMR@V4F6|4LtwB?tts3>gpq$5d=>NRIewfEj@EyQRGP-x32se+cGrwJEeyF5 ze+5UI=srm%7@QN3rjeEM?otu>H1&0GpG`Tb&gfS`2@t*ZiTY^o8-WU>@0n2(5IgP? zsMdLBxKvxz%z4gmJU334R^i0P*?{wR2DGh+HpI#2MRad5dja}yj&rHY_K{7+2ykzz zV}J1(7V(aQe(7QGa~<{Vx29SlJ+VTY?Y&I?TC0ZjsfqX#VC_Yz9nB;wDJ$9oN%=j6 zgPXa1(8~!gFEqE_Q^*|_{E3y-9;r3Suj{lC|CI87mnN{ZI4y*4$wN+4Qztlwx6D1; zY^iH+P95CJwOgbyE5)cOWlVQUC;6;87aRm1cmq$LgI_chxEk<1N43X#cuB*djHh6$ zJP18aL8&=sQ!H!oOf|#GJI=+m`iM3o|4d}jG$Sy7-4>4+ymfW6A~JuXVta)}XrE*G zBT7DA$h9t#`TX`s4EPbzZbZcax<2=cas!~N8Ef=>jP&Dk_|t9|%0WpE$~ zCvFvavh!_ZG$6HU-B-DXeBw1~xi0e5AXJG}Qk9{~SY@ipa#~toQCyG(52E}I5i!#F z9UrTc`fTukLYyn3L>jyn=@Ns;M&;^qZo>T`!fTgT)?Xa+qs(A>t9bGI-WbLzIe*mh zDsVgjnl*_yOOGRN43~QYc}NluY39kZ!?hP}^K0rv=S_c?&w<#v1G%P!m&508qU*a_ z()-FAeyIRXRi(j3c{)Zcj7n-FKPksmW8bU>K4%mx-}N?zhtX2@&~Kjy{X=bE^@3NO zLoqe<5?CX^l?kHrIgp;@=yW8-adCH7kCj8EoxKzX3d=IE6#O6SaU-uQj3;afp`YswY24 zQ#&Jg<_zs_&Sal1^DZ&k1&sfE2yZ3QY5D?ihqxl~|5ZL< z-ZvdFD@Y1c7xPDX_?v~Sfju9Er@ntp-CF^B5T}R9nzQ9W(0AhP$JJ6m9B8yK-3Zz# zLY^2rp*o>cjatDM(z&+4A7U3VFVN2P9amq5yoaRt>G)b-^vnv_S7a+^6hIyDmvp|T zu$nYYMY#&kyv%F7vkBkmO-;0!^9OKG;GH%uSLYP6eTLfZ=qtuflRC{+%x}x%Lo@>3*!o>l;vtx2-&`PVO~>=e85tk+fD_*bUL3 zureZ8%}}^^?YABmCUL-;etxkEO*b-S)jKUZg$$up4{T@EOr z!wC2QhAb~*%&W+qi{HU+4!`N{Jp2xIo5u)GNx$QtYSe6Q?kRY6jTr%32oD;N?)D)@ z8FF$0tm}Zwi99?Lxm;W|;WD~*!y7TeP>8A~{c~L={IQw@JokO*=J@M`DzcA+x#VKlcbcWxA+5PY`Kj6ZXGK;!#~A6 z4V@f}qpa~>K&zo{0b@kZB|T+PtOM|pFnx-+GFm2l;Rn4{0rFHd)b-CsNnbOj7P1yO z2jyyyya8Qz!h@*C60klIc&pLH@8py|b!Sg;!zpERr5o`6g!)7m@4_6g6@Zn1*`=9U z|84srz_86IOQWT;<8bU%Z3qW{Y1X9j>W0}E!7z9rAD9JqeCG8&^~5a}LmJ-{0#zT< z5^NzY+4Z3|tm#87i~CR;ZTk>*+i8vy*p(;LM{&y2dZtxw2+m%g7JWK(LU6XSq<%1T zC)k_Lryt1;Zcx1SbJnN3(>qT*k`ruSxjc{_bs<_(dS}xk*`PAFxx{)s_AspSY(v7i zz;%c8R0UFPsqB7XkC1z&#Q^+Vuo>|ug<*ApKb*?g0|wx3Bn>wJcQe3u2F(Xywa3*5 zK@EF?&|ZpbbP)8XH3BZO8TwV2o!UO|lyfhHEDbqw6kb~B-H-83Yak5uVdz71xu=74 z|7&)CB1mv#0rUn)6J*w9dIOZ_M?E~#)p@k!A3VrVStstsGYyj$2>n$b z`1AM<+?eF>Zvc;^_5zWI9|Z#}mHEkOTA77eG)y&*|E3i%19T+80>D_qIGI~{Qhi&) z&I1f1KCKQVPN;|x2Cp!*BMJZIa*gahrhbBZ4t_OAznq_zk~@Uy;F*Uenk|Wz^c1Vv zoRTt_W1M8bsLQqO%y=e^JJN3Pjxqxqp(rKE35Mj91XEH1M>+$E_@jIT-zXn=;lEh8 zYJf9t%1vgirKU(0i_x4&yy$WG%fR1Y{EfyRwMe>s1Ak2`IhC->~2I4-;Oj#Yzjp9PIrTWSW=h#eB* zbJ8G1DlL!aT0wvFR*TSD|k!ke}1O)x@yK+s7!@H|tmu~X)+>xQDGtYGRY z^8fdkC!=L3YEBGM%rRc%gLy002dW#KE32V@kPtRx=YpH`G&n3@hoIAh@$tZ720R+# z9=q%kqfGgk$wF7+40fy}?cs|N5mcTC4@b}qV>9poJGY^6H7qV>d$$=>yQH%PGW%P}3P9y#6$aiD2UNN?F z#2*C&gWftYhfr(}uoEk*VQl{qjA0SH0iGf~mZq7I^&SLwG81Pf(VRc*!n$lU10vEs zhFu-X2V(DhTi%HBS2Z2coYo`SB-;@!-}U#k*ig$1)B<^5ycVNfKrO$9?+#r9^N4y1 zUJ3@eMBiTM8CUrA)~Vd+%gVi{1hsRnHb|1eJ4S7iY#2%7C4E8%EVrOf2#KvuOMEM__H&1{1J*;@L6@$JIJ>{9A(8PlWbp3?YJpbb@+-6wZSS)gjcY9a zU0Nd`r!jq+f8O&b z>-p}kbCD$MNs?`!b2CW7;K_!74o^~pbb<=0$)H%RjXG8uR`>K0v>@GVUDn5g-$wZ2 z3CLZz+#d(&t4OSmTL9NfLL$4b#{K;v@&^`EpTPa%5Mdra24uKCcoZ;$d#3f)qA zuj}Pqx!+x~1}>YyIdyLrU; z8Ga?>N&Kc7KViSE_*INY*>5w0XChmfko%9G8TDVmnKs)_s0#c`(wx$WH$$5l_yyuP zZ-h-1uw4HM{X~pD;Wx>;|I<6p8pV;|*3&%Q6r^_vA$n&F;hlAO;C*PH*iz?)QnQJB ze;l3wln|Zx4}wp{@RP^54k=M&w%UJ1YAa^680qiy;)KsV%&?K=&`uX1#Vg_yHVe_0 zW2xgUtu%9Y(n$qKdGlqM$&tt*X2X|IlQCR~z8*Up!Rj!;!wWl4?qe&2%iR^CH$2Xh zyV#rU5z8vX)tpTA{{;1?v`W`d3qOdrP;^-fe9rbO+E@!(N3a|5^^d8a_g3L#+JxDD z6sIt8m>JXtuaw^;Y!WwF?Ip4hT@JssPDn&~wvuxDh#QS>%#pp|L8gsD`ZfdFDARy@ zX7_3JpxH+1I<1brmU><9`s!ZVf5h2y!IK27K;Tln-|auPwg5S<(D?*>`gYy@Ls~RK zv|u~w31An0iKmn5Pr!jZjWG@3K4rfr7`&y`aw}r~Leu=)6_wrTUwXN$L&vlmNqz(k zwUg@HelGlQz=V<%cV|}Mq;kEki-3zQ&4Z7rB>{vu-?BQh^8-p#-b-f&7x>5fleV<13a+^`k9RwDD z8Qauju1^Q2le9anh*2Q2yCjDF#-S8J@Nae3DKGismvE)r`n|~Ri9?#fw5e~zuas&F zzT9!{TUpS|PXD6I=VuU;Ku3C>iCmE@>b_!M{&yoXc5%6nbpGtMspt#me57;PYlQ2c zR1^CixU$Z_`!Yu&0@GO$vcu|DX!Q_&f%!HTgSQIpFxU$w_nf(o_{;EW)MI0w9%GPu zYzvry^`BIa^%e%&*JTBkFgPrL(;HTUJ##yomT^cIqFu0-NM)r@0dAfNBBIp)f(shm z_blQwk>`vNFWQK^u_KIcXM>(>0`6A!J)sp8TM<2JFrJq8&5&op-f-{^E_xSqw#i0h z7-(uMqbv^T9-F++g7?1>9%)9uV0$k6d8?gj{C=O+ev@p#-L1Hr$?BfdC)!7CNyfV( z#OVMBXT}rSHLjx?&!tpt06lq~%VNI#c(Nk}59RbheL+wTvrF)T{+;JlpR%tn1mi?upVL!SLkQwve+fyKySg4kNlz!-9=XDy=qFA!lF&m{ncH?ffC?6 zz3R3uH{i1e^f@3sAO`)C#<|3GMz|6l5%AV=?#UFv$gR*5*+_!IDB;>?TFZ(MNnni) zu`&i%lEtqGedZ=$#?Tppy@u%HY-_%?5+)x9YUJJ&F@x5iI0Ff7hcwRrpFY9|DN=+8&x9P~SrUiA4^P5m`9XXG@-O)=^s`pR zxa@63q(2J3oY3XE{Qw8{TnqO{K)^=e%&v@>KjDWcaFTV=V~L;lTFIje?Elr#s>)uYl#D*t9kC zy0d~{3ci(b>ry^nM7*eqGNRQ;-w|IO8WHdxQN~YyvrHiSMWm2M+7Rflya4G1(Yvrs z2Tv^SRaFrSX8T}iS&-!0pk!rk@aeQObd00nK5o3RZJWo~%4IzY-}NM2BTV-@yD(U> zL_>W>*|93AfrDnpIrP6fQmbqT_>>FkwBB0yL#{={0$Be0_^TbOI44Dbc^~_X%WV&C zQ{vi^%=a?riE4Nou7;&JeCaCqwttKJi6C57T=hOU-L;6VkkRT;hAUM6b?})4KiTT@ zF}?0@Slz=>_u1e#Y8$Nb4d~J2p3frRz(Sez9H%q45%q5(K9q%dBny7)jbhCn;>C@S z*I->be6_x`l2XW0Hy5RcZAxzDo}Tm3EckLIO-=_4v4ni&!MxS__?k>*jb~7cIUgD? zHFu8UHq8j|HFqla__zt5hPElLOv2HIa3tj;i)iwB#@S=)Uv$fmqF?P`h*wgW-fDQ!)c&4n6?Ce&95F1`z*qeD_^W3qyP*jJPUJH);Z^7zXgzg= zjKm#$j3V}Y`frM_0SLmP3IZpG1*-%b9viHNXhjj{g6L^|5f)U@KILx-uRgXNDw7}SOk|R zglGaJnS`K-h}j`EK+K{j+R0>Q!i-EZ<17%UR#a+jYwy*%6t`BZ?X^|!B`&>km5QRR zwzduEwODP7bwNdIkYGk-`G3FXoM+~lEQ)RapZ9$ypC`|A_WgH$+xZL5bUtEy|DM(}yzihqax5(3-c(dK$)(4%g4+s8;(WA`VcD?Ps zzJaMpoPF89D@MDJll>I}-btY}M*;U*eV$WrOskU)9KWxvV zy~Yg>kCX2;4=?NA<)zQp@KrH~U%Bs%voXbt-i^?$IPu}4Zirs1$2~lw`(7N^Ioz|L zdj<{_|GlTYdj^geA61P~qP%%d>GnadX54SFC-eCo9&l9haI<3 zj^GsN0o&T9L2ry>peQJ|)LL(K&nkPP8gT!{&K;eTs_nhbyr+`RIc)DGx}I`$FL^py zK6g~!)5&>rZFw)Y??~p9!uD#ffKN^-T|1HuHW&DzPbVArjc36q%A|81saamrGZm*c z1a=K9rpD^!Ho4zXueb^$0caQqYzCCG1$uT|GO>FscHM1o!3XnTD&~QzKk*}SF(~bz zJ^cXq5Tjtpc{=XUoD%38I6bLw6DQ!K$lVEe_pY?a^UNWMp%glM&)D2I@Y7Ft0$V~& zaQ>O|0QQY9!XKUo7j$4i0QVq&Z6fF{jM;`X_D78AvO^m;Z_s06!|wUgVc!h;M{u{S zD0pi-THW{egSG|zuntO%H{N7+0{Z^MKwfCt!{Fq@?rr7aOkD4cP&0JQL|I;+;dqv# zp7$*J_J8pR@FzXOmbW3vnZ!PhhK@NUZS05R1KX3p+$^)3_vSiXl)GeYr>tcX z{yWD{#5oR}8h|DcPaHmlG&X6oE`akghX;NxWpQ?#O>~0y$a+@=CS%R-09WGN9x>yp z$Z-nxEd7ZG?l=p@&&wr2arliO9IQ!m$dFO?0?|B(L zaul>y=d``7d+S$tr?6wGc{%pbi{Q`4aQ{`#qt0MOfRN%|K#EN{O;b5LF-v9^;2!pE zfFFP>muySkCm83h9BQl_Ut{Y#8kosVzk_oK+yx%0s;7Ri>!cb(&d%?nzG*lw)4Bll zZ{gRyu7|7az3OgXv$W~JSDywqZhGKpgcqP4cORk-AY@qwBvyFkACnFKP2lVF4%~F; z9^8wY<+!J96X~^U(k)Tg*sTYy(RF@(H|k`R)ojCm=JnX2DcI5A*LMG~DKAT1>__ea>b58!lzfE(VTXxqTMo`69Zk|NGK!;lW*x&jLq(S^u@t zecHjTk5BFwC8NM;Y$%-sUT{w7wuj+!HhpTe&*Sh}e}x@BM(J-6e?3l4bM8F;_!ykn zAs2wbk>0G zo&&#xy9VwW>Hh7ZCuPcqKYL2P-#fHz_s(Pu?9D@i`oKt*xS>d9) z_5fl(;@p*0?ra+uuq_ye{|!CPfFE}U_P_Y(XZ!X~ZgT{t1Z<$Ta^!u0#E!`)7+aV9 zFwQjk91k}K?(xk5zj?Xcxp%P*)&&L63%B_ng#P3kzI%FL{lw4kHiS1KyaD0Q9^T~# zW#fy$e%)(m>7SwF`wrf`Y1G`UCV)ql-mN|y*mZ!r6)>D&O~6)&vo(cZ={=)|`w{5C z+%`bX*P$JAbF$Nw2YwOVuRveGsM|N-PjZ!Yx?st{cxSf*nzUTA8v~J^OE*v5eA~4X z``5d(woeJ#`mRnAKRW*F8?ifuE<1A7d(_WIo5{F`tXQ#qO z!XSZHW!z`oH&D-;F;Fub&i&KY-#tM`PtF!^8*Jx^{(-;YOeWF;(Gis13kTj+(BIxu5sEFK>CHh4RvSw{s6eWUgkAeSdUWnY9`iu?PfwlF4w z4&3FJz5RNGoC7@f2|%CTfojh;2|O1LjJ3Os>) z75kopO0xg^!_+txkN$Z7`fn_I?}x{bx*7NBF$Yd~&o=((-Yb`91LGdMOXObJc-8W0 zJyQd)9%Y}}rm!v6B!bz<)3>}YJ$u)Wh3$U({=1@z-}4gg0eJHv$LxKtOa^XXhqOkN zR&SmR41wRyQZH;0NIE+YJ8LOJZMRngBY+OXhJ2TK+ zk%tlHz3s1l!7c55I1`<<1-9RsUrf46AKrWTY)9{CeT(I?zDV_r$z5lEyqmO+c9p!C zeCOzqk^h(wD z(MLOy@02{f&oL3S%6!{Q_JX_wt(JV`i)zEmO zhlxi$%XcAfTGp472h3(V>RAnnHD7W&K}!N2^gR!a?`-GHp6gx0hWjdT2Qb!v{Mwq# zI-XpPj|P4vb(|%~!`P0q7vx5MI`H%%+8T1;Y|6MNZTTYKww)(ifsGk^Va1$Sw9&R7 z_X64W|M*heK2kBGe^L32{)%`7zUiK5xA!NTa62G)8dIx}t)@R|ENhC5$Ij?awhW)* zPS6F@MmhS|PqL=|$Ds|WKWW)$?cRa4us20qXaC_WS9vl=a&nXvMuE^vbSUTq8M<{} zMNT?&g$@N@NQUP0ognYqNXPi9jsd=(nI5|+q5IJ&^L=ny6tC;o&^1xeQ1M!o-t2m; zMCznMr!!UGT%F^cI>(BmpdDIpQ|gXz1x1~(O?!CG{Z$j7rF-)1aXVdTi}Mhu8;1+p zyRd9>#ov3k?W@N9>H-umW}38qz}x0P8_ah68L7)*X=n@6y>qZJSx)N)$O|@L_B`WQ zfxRe+8^E}SW}zMDtGdX1oibnNo^1kqBeX4u$53CMy}9k+HEjmoPab@>Ey6j8@689V z2ga=+FVC_m?a0H>5HWhj1gdbBmG{Wq11o+!*UCF2u+QYZ*uzyq&7xy^r=qQQHN2KI zYL_OR=e&Tot?Z%`eq6Qh#i|RYZ??@5v);oBcS&0VOku;Fv46oyraQ&dIKV}K87 zUe#XEL%qqIQMTK6R-`$4gvzX`54$8W*s}4P;XYfxC zU9Z1>erS5YmUndpXwNyIQ}+Kj(v&n@wCh@hH%>!HY3%QT5vBY6e-5O1sayBiDop%@ zH=UIhD;QXla@4?AX0!&%X<^g7^|++x~3|H~ob+dB^52OG?kQ63(+ z6^4oOKwvqSQ(&htaPc0-DEv~%-Yk=)? zO|bV~IJmgylz@T&;}5Z?L|z^Gh(26*Tq}jpieMQ(Ihf@Vc{4EYa5_TgIZfwzDe_cY z@M9qR9Q`A#;a#lJ(K}evj}F|me|_xsEO0I>j;s0zoUvJrvzGsTwfWlTI&bCFEMo+ZBN&fjB3tg=71Q5?71$QW`w*vt%=;QX0j_j-VD@3VjNhDeHi+3f zw*NtD{?Mx4lwBxgA8in`oipCEJ01If96K+W*ZAx{XFlG7^9m>7F>dMxi02{edUJbH z@_&wjtrh2_=N~HTtVFALmfd;Ms8>xpwZDUuL5=E~!!!Cs%}1aQ_VNY+z_7go>!poA zo{?4Vu~L?|ci?MM{&#rbyV`$&b{oLc2;V=F?!Ay{DR--O-vT%Bj446lYU`VqgCy&lbeYh@)1YfgnnVz!BuIn&D%Ty)WKwYJ1ZM--#t#IgKyga zzHNhT8Df11i3fQ0l?<Q?^iA(Z4?Ox&;E=dB~KQm^5t~QvQ1?%%p`$--=5%0plOtd;1mA!e8$M z@W3doqHN%^-E{p08WOZp*T0)FPv|8~Q+w^nbvBF!wL1anal?p$K35!)w{hP-4QU@b zJhSdYq<#W#oNipi92~uz`@g}Q<%ttQM_XRC$2S9~RwR5s4bl+unxFoZd}WarTf_DH zmqX+(Q+7hm9WB#)uK;zKmj|0ejnE75fbyBQMe(Ixf^}#|@aX_f#O=H?z&nhWpA=cN zajI<|<&DW|CvGe|uI|~uw*vpMXH@nLwPRkX2o%(azHc3vTk{rfnuX1jz*p<&^Nj-^ zOq*MSdu;Y(+uCr>boGI^+WwBcnHC6m>)ErA(TMCRyH-rQ@T7+W7frhf65nI%o{)Fd zM*_Sdg1M|XaCgmJHD^!DuX&iV*xvnZ%X;Pn@2q;`#fJhbrcJG}&EEy7+P>Y3rR4%* z(*sf?05|>c9PSp}*h5^)b#0Y>$E1tItWUOMu0U@+>(L!jFQKhxTj0WO^1mIu)4Hj5 zjBq?AEe5*t>NMSX2pBo7^4tTBtBugzgM_w>>hHx zYpQ^|&DaNyU=o%^_hW^LzNr%OfcFmwMi_%L1kPvLoSqj3ny{l>8Qd0t6=eIwKF9bR zaCPmTs-SJY{WIGf=PrA2YMaAzRq*zyPX}(R8i1YvWg(MAWYM<3^HayYbQSJ)wSVT= z_uZ!J2hwp~gA|o%Csp&TI?kj)&Li_edV3q>Gqd`)SG9e#n_Qh24*#9~G<|FGI-}Cl zKX4fR)z;$xr`It)t2gJ-nm{)AK!9(33qLbp-vQ&L&wrsO9ox`DxS82e?YY{65Ue-c z4h@Y5+(H0enKzl1h4M@#F|2(!b*y|*YA$a`#htWUF6{XZ?w6)zKhajv2K$!|ho{<; z?s3)cN7d!_WCzaenb1bL6zZs3lSFG+uSsazq@Jm;qy>13uz!`UANKWc(a%o%Z`w?& zsnF<-Z$_*SvY&ag|YvwjZha{zq<8k<6jTsP8Hr+3{Kic*ZzSB zW+Ph%9hwYI%l?6Utf!nu?RC!tjzyl&?5l9vwzL1UU@w2)zzLs`Z?_F~$wA-exc0%m z68Ay+WZ9oa?XsjjQsjYB!n~am7TX78ExD5t9{m)uZqp82Z}NKBD!jjHa_bEQp|gc%tFO6Z4>Hb;X=KSU|V!tr&C9-ipy@&l6kq^ zkBAu?+8nW}*p;zoVjDcqcu0A(e>pn+1DliWkT*?ggFF@*Fy6NIuTRGawa4yhBQDW9 zkN|||YP{i-W5m^<0k`7T0;VPucLp|8P3*k`@Z~UWX>snIBKCvE<8FVQ%Rt_(pUe*Y zqzd-wX1tF+dk;FFYNzNQ82!nruah6QDt4&nKikR!Kds6_tkJu?u#GVrw~hMSCSgbR z!5Rp64cyOIu=h3ees3&r2Qb(ffxWw9xPf66VkSUIM$nSuKqXMdT_(9~{R3m9g%n%v zlzIIFCt}^I*8U1-&sodJLAEY)e)SLRM_bKyktb$H9eC$)i)`UvFhlyG8_70dN1O2x z+T%E}y6x&V)tCDRE;z8b#|~LyWzYyto6;7n+#_t0Jm-2cdziS}{(&=q*Y6)_IB;1{ zUa&nlZEE|TUD1belSXu}ux0&8%(SUHkzwa1+$Sn{idj_fCWie3bAYR z_v4m4dEZn~e6MiY{sdSxee0CUJ$9R`?b5c_YTSP8he=ia@?j&|-n z7GocUZ03!2;`93k{^wK7WjTM2uDd4ia!(9;*+=8fsNfi3@dATG5E#Pt0VdfI4_X52>u4}#xM*lB~F+{XiraE-0Gp-SvMJO>sXu;!u7 zdX6J$TXsX$C);zjTw9g%sBMqkX@6xyRbJhgoz*AZ4JiZS%tD-!F zDONnOy>H8m?3(v%2pK;rJ3G5*!;>Ez|G`5a?B4#av+TyIlb*crgt49}5nyPG1*8K) z0Q)sAy8OTuHX+2?%lTi3$#Wf|t-~pvU*VMQ?ca3BcjdL}eL=NDbR+!oGnD(x1x|4v z+~+QEi0kp5w8$y8;=O-`3cp+D`?DIA|62+5PTZ)%v(I*jKE&s5C*BvF=MY&dox*ml ziuY8VLl|%uyy_Io@kH=kc9bw)s1yd%%=?Q|EXLD@X9N77s8aq5UQ>BC;QbBwFV_Ao z+TVxwdiXOB{`&vw6vys@AD(OBf7w`J`0(ufmC8r_+9}q-zq?$ec|qsXkM~v9eEx=f z-f)VIc)kPw>yXENqlK{x_2cgV-q*nYIbEM;I~}6FQH7m)$RYc#XR%YoGIkNBTa9a)!(ANYno#@nFWusHnkM zpzF>ZW0U2Z|HkN#7s7h%;O@>5#`?u7{)C+2<0qr(_*oN#v9&?PZ=EoF{9a4`8xbGp zDP?_b9wB~3ES>-IiKu_8ivQr0%=}H)9bZq!AB8sLzO6z=_*Zl=?d*TtDYD>v<_V`@KPAxy=GXXBr{E}F1UKKyFIDgUPW67r^hX~t{LP4Z zH~vh$UB6K8$ZhIfzDd1zZd30kUexaA)cbv`E9P_U3+jEJ4)50KXZ&2pLwyGL&`n-X7w((RlVjhCYt{Q5tYiAGzgoR_ zZcy)nZ>o1Pq~7oAerUNtxfkE0-f!yn`uCN4{kPP+1!K;9rG)9pCwea`yo) zFy65``~i$T-Pgs{80pzS<@xe@o4SU7MBPnEdqoc@6!@ zU*ae=Z}|O^_Pf(=7iUdS{*R$Q`TJglUF<(g`Ms&*J)dnC+ea(Ev-9#~eU8r>KXG!6 ze|6C7H$q|WD!BG~HCyD0(9&wLTIPqlRnIa01#Y_~5S9?6<$LmY{R6T8@ z?efEBw>j~9*cY15 zRknQoNdJt2{8*uxrYPt`dX-LnSBJa0{N8vl++}olf+2Kifj=5G@)Jm-!{C=6W4XdrOOh9X!3W4 z9v#5f6He%9@%c_Kh{XD{M`f8Kyfq9yVkh zbZ`66+d?c2vo+}oS@X1}3rEt)tZ{;vFU+Sp5smu0;zm`Av81xvsPy@w{#cB|F;*;1 zbQ<9fqrRpYZcK(TSQ%5s2r%AZWB_mWv$YP*{w^Ooip@>L3=DQxe7<2FLf>p_rI~An zhdb4YDk$RjM=_EKW`hc_yiQM-XQjUrIlJQlOb4G^PSaEv<{AUVF6;yKGqFbSdja2E zEYIP6So<}i{`9*`hB21;bBa6QcO~LoIm#~P$#~<$MoU_kP8-o_Zy2MNsKAA$_MW?c z^zm6^9{kzzCAa?sP~|#gJDeX@E`Wl)Fe41`VMu)K$M_j>Q6%HySHOOW`J;q&qT18d zg{k55hx~EB(H`#d#pDEF2Nq&(S4kfg>@#8suNTAJkqBWGAykMuwXiYgR{G=S*m1=N zyE?+@sU-Vb=8iOto?w*Y?)7we{UN{w6hR*Xv?~fXuL_83V2G?O7qAgxe zDAexpu8I{8YV!#3W!p0ovCku_-6p(XzjH>eWdm6w_KD9E_n--uevM(3NN*#I1H|4)Ai>nl~CPpv{p8?75nUQR5({f8g(`9+u!@8%kJx{bu%gd!nPm zA4R)5-9CvOxIJ=5b4L?h1%;`7O)i$YrrO&1MtU>`jhyVEk;`N^1Xp7X>Jou#Mb`nE zb#}VhO=!>gwaqQ=mSv4K^-U$~{E@)gXi2ck8%p^6rqdTi4$)Z2%1AI=9AJMJbc8%B zW5y{)K|yJ&v0#BwR$6FWW|)pLt7DGUQEqk2wK`5KEG#t6I?He||H|g(+NPHJWlIh2 zk;aPr*u_Q#7VZ3eP@VW?*LPt(MH7*@p=#oZ`VG$fSRxX^xcCvxT1Qq<7tPPPEGzdc z)_!P+%)b$^$Y_lin3sn9t_iQ{GGc*nBIJ_=wfhY<+W@|TorzG~)8!8*VxhINez^td z(p3kQqJ73Grx>|I0!~)}7Jt^M6jhY%j3fX66*#q&*#XSp)MXKWmr)Z1j&0MrYXPk4cmujP%PAab$y<4K0M-;4&`5*rkS4_DNZ4G|~ZjcuVJ5#;x=WbKC}H zBBw@Gz z=HT);*s8z+Z^z1_g`7$5NU#greQXscI~Rc4^o_aWg{VyfN2>s_^qg|FvaPLMshMaX zjFVzWKMr0qs;fp?Q4-(E)_|^^pjJaW*4hMEL33FEZ#u&ARDG8ufS3A#L1Hh^`J(rS z%T^4T+GXZk!L-0UN|&oaL%E&$?&3gYSH@9-2Yq^kbqsh0 zEeVAa3=7wr8|&rnMzGF}UBh&u7#OxF46aMu~bA zVe=}9MZIvUouVWb2^NET104oz%!JX|O|_LZ7a(5~5(Bg92(Hwd*I4v{PvYS+mbt^G zLRG!6u!t9_Jy2F!qAnzfWW9B`HxP^f>j(jx89r`H7~lkDvpbk}#C}U}o@zrxWHio- zR;2ew1hCEI=botF`pXaeAGW+fTW@REsxG;SXdKz>T_iX04gw^jeraQC ziv{J-OJ0U8Yi-F4MA}$zWtS%eOn1yN*(Xe!ICz8(s;mjwKti2TP9 z^#&4MtK5m0-&a7CR>7D=m%lrLt_Bs&$dZuq8wI{Fh8z>4^Q70(h=vu=Q z2Od0Dg!~fUJV5lYRyAziPW`aB!X9 z2y#J!=IsOyC(|>?9b1PSWFuqi3Sx*C?kI@GqX|sRb#BJsuC4pk&6>d z>-K`_umBjG97uY|4hob1w94;~WQI$hRD{8!!~Pw4EIT7HuRDS{F2|6pB@>PglV%Y9 z4M5aI?xDiH*SYC-)59%6dO=9d-Fgk-&FFGf3ZdgCWEPeb*#ughYmGtCM`}YN9t_1w z!d;--)LuaTil40@#-gwwZkUn^P)?V`Vg0M)oT|0wwYZlqYZQWRq@ug2wt8`G^*I;| zGcRBxxv{k|cZ`fOcQEGmcShoC3r^`=87*4q4Fx%q(b_l|f-%eni72F(KsujPl>i?w zE;4!4-x1Tjo+>XD4|UCmw@~7&SleIJNFwSAvl%h2tM!XwSgXN`3^OMPyVV$AZx42? zm4mRT+NdFh(dmh<0<7yGDCIm{8a9RtnvbQ1S}I23N&w@f=QYb+*MbRyhicL|;dZ&A zKp4aVM#K~Kbb>V!B~QhQ-b(u3Xy<&C3yI~oDncA9nEaavU>BBXM;P?JLPBELUa)Mr z?#Q!EFIX~N5m1EPUdE7YH}H#n23WaB5+gi^OM-03c}QOyYoZ>~_p^=sZj>!iqD(K* z5p#E~M#YEe*FkG76kfR!9Fr2f-DJ)HDq-2_uOaiTGq!Sw-!Nsw6787O%rliYHbK8y zM`qsG6R@aLrMl$`K=JHPD{Pi5WO8rNbP41Di>>Kom$}jJU?hMtDVS4clo)eb3(=_{ zcV|H%y^!%)lM&N#_IFPLvIG9!)o(b&2Y+)&;e`7w2dk6%A)n#;beQ&buI!Af_J)F8 ztGEHm#?oPFDcixAEMN&(f}A)71l@&(FB*H4`2YM9A+K9Y~e>%c36_->=k^uz42~m~% zLT{yF$ThPf-!(6kxY%Gn;kztBVT$@!obQ^Gn9Y9(p0>gTX$#g*tQgOHgWn7CV+;9_ zA1gt-DGEXM<*jfV;%Lkzf}ZrGEF|{SxGVZ{o>efQuu!nVMjo$7XNl&} zfi)KocB)02od%LR50fq_kUYDQ^TTkGBO8+hmg$fS!yAyR!t`@PV&w|~N9DE>^rjaH zA`}6NCj63?N&t))tNd%p(pJEeHDJ@tjQA}X;mO0AX=cmM`u?No^{979iYV%a6h4k7YCH z+3~--aK4iNq*yb5Zx*Z*zLsShQxubw@1TGxelHJ$nL!-a2@Y-rvtJ}?gSthnU2zdYls4a@(~ z`{B<&t6nnao3)?VuV`HGqx;Uir{dqgf9JgYPyFIfxjBdT?fBieN$ed91%bcI;oicGRo8%I1%)A3fuur(b-a{f3+0T)X?Z(>uTSze|4> zIz%+&Cfl z%D>%o`$^w=_xG&@f4%PRZy){S+f{+eTZ_hTYI*#)sH?{SJcX>$&vH_hRrdf9+W_8zjz}e-r4|W0X2bIU|1>##u zCyjz=>D-ctw{U(cIbe%gwLYW1>0FAL09%?Hn`;|Lp(shAWX&4BFlbRAa`5*BrG%id z8MrYP8&+s*bLFC1aK2j`TDX>G&IBy339g3B7p1qaHP-o~Vbs+CmPK+HfXt-Cr5p|O z(lCGldczQ#P_QNmq*VQhzZph7BxEZ+AtMy_KqsNYs9jzSbiAdtX(_4%ysfdC^E(}n z9%esDQZCGOrz zK%?3S88qd2+|XAm?Sum7du0tGrG2_txFnPzo1=40g(uQHwksW2h0aBV#pBT zY?IhGb_dKSatSNtd@;@ohC{L__%B&9Tmv)PFeKS<`==-B4U~AIoh8I{`43fccb0T; zMalgRGLnMk>MD23+K3+<3}C9R?pl}2#izBQkeF(>t44hn7A>r7rU{fY8zXWUIsFfDkI(Ciw;Rjjt%fT zgDoVPggA>mQJ;!u1}-*3jphKz9*9vWw+(xt;4)VDV;w{2knGy#I=}#vn8OSJ_cj_t zvP_9PSR{ipl+5R0aF`LsG#I^9YeaBh!LtezlS#7$=79Vqrw-#}a-kVXD(2*Ct`Go5 z^wL~T&;%f($;1m0&c*>#jr>pogSgd6On|?mMt4RM7I}6`(%R);V{nmBh>qb@Osq!I zyb^flC*~V54@E;g$s>&tz^{9qnuYU47w7X?TVRe zDOwgO>C*U(PEprT*}T~863y&y7v~6g0q~z8puh)^7sB^R;;0G3%xm&iy8LlB*mET& zi%#I9XrU5{l2u2sp7x7U_AMD-7S@x9gu@}miTW>9j9;t)Nvy#y8=V6N3RQwc2a+?M za-#@lH`vYWb;N%^>|k{96})vNhl96++JGuhl?4-3wu3aSZbixsf)3tho;m@U*r0a9 zo#e-3EQXB(wovE`;(-1LW05FiS=OKb204YRv}{iK+|y2T^U!5cLphjos7HC5|@cG<03b1 zFxg73F4X}bSjVQVfIj*NdK?;Faf78YO~?ajh*j6d3+NBrsJ6P=P>PTx0Dsur{osrR zp#_4uAoU|j$5HN(+NptJg8J9=+%WT2^I6(W?VFN7I2JDnc!O@g*Gm`$Ikbt8vUII! zGgh2k|M5%rJnNnpfBxY&cI2Gh_|?O0U*A*l-?uKm^|7D+Zo$+o7z3RPlu`d5qmh7Z zVN`-%@`{Z#+%RPhTxz0zWf!&|;`Khn!p?v_CkCWc;;mFEi3L);N;P$$f0#o2fy*;8 zm{ZIv4IYUtn0x@hVG!s9jXJ8NN^TIYuRf$9o_d@HLPph_@IKz%cH3|Me#Pg09tFJEEbz5UYd!HB6^rcN)N|D1fm_=P4JBN0#9G#N13%pu?GV0rcS;p!+Ytl$i1c z^xNUS2yUP)V)@^dI|MhCv*&#XomiQb>`xLg0#aVeo(1LPQld#7sbZoRDh*jl!A?ex)8>QKrY%e%$0NHvs^v?~>= z2t+OzP?afpGxJ80;r6$YVV!2B=c3N+E7XfjJ+AHu6gDGJX#t%JY)5O2Gfrz-#7%+= z_`hluNJ)fA)E`7`C>&m8VAe9N!rT-v1!5%gu*Nf^u@};@DC+_U(!4xiS7!mIl492o z;1PJ+7=?wzvsAs)m6W}i&WD0le>{eofC&kb4r2%t3%77@0KRllpHQy9<;K3;b;-~uihYlb;cy*Zk;aQ%4%%~kKc%PyVr!H zt8^1G>WAfvJ(YbWQ7oHt5`15-_{ zd&~q2OhmB+1VQd25MZgJ2a?CG#}~bgQ76Bo%Nt#*xF3q*FVH@E2rwa5xGom;YI|Bs z-aQAybg#(wU95*kU|i;dYK=;t*Y5n2uO55(G)!6s9uk#SHqIV z;nQQqk;F9DBt}#Xuyt6K*fcc;)_zI%r`%Z$?uaPP($7*E2c4nxOVc}v5X(Rf11^~G zML{F9Kb>ca6j5O^UoTXy*!AY}Cs=X=Bw-I!8s^kJk-El4IKow++h&lj4+31#QL)U@9|B^;d2;p}a!GZ^{U`(FD6Yk7;MN2z zV)6M#BX|o`y5LZ&aV-bn#SdZUd7?p&Jd$7ustZOtx#rUe0I7}h%*l}`2E3_C1fjz! zL6~LkO57zy`(ZwDd77=3`*V7p4UIim;Q;G6VJhpI zXctj>tf!)ddTNj~>vp-Udshnn@c0QAf4cvHIhklCR!>JTL>)R0czIxrQaWtK)8v{M zHjZTvT)Ye_;7eP|Xq=WWHNQl}w2TO}f@sx?OVi%rL zF$eE*`IO>aCg$RMF8t@p?>Tsvi__rO3{`0#_97#FXdpdi$XBn8)XrcHH0QTuTl=E| zJYz2eVZly~iz~LNAEOC;tEp~oDR2qCiP-QxN59J#cT0D9LpNX-j%7in6@_B2;(~H6 zM8TGa&H;8;99041KP>6ArOO*LJu%z$9!M-ijKev**?1P?S&k=wCywVbJR9&_hvz0d z^uGhoCOpsKImRKx=OzB>l;vTWr01DkLjCB)IlZ#1CQ zPwuvfF?hd@e8xdw_S8n?I}Ug*{Ie<%{=7|O=L%8#8=J&KU%J;R7NLKa_X*>Oad1+T z1fk(BqT=F+(*>2z8wQ~R2MC8K{Fwd_oMTc2vBmp`@If&rB$YQffNXM^sU@*mkbdlN zpc2lhy`b4$U*pDsx!M|2%MkPpa9k=zL-k}0XIe9MeM!%I*DBeLxm9SWkOHb`cX|y= z7^DbF;9L#v6VON|zZRI1$o>{z22d~c}zA`~EwYz>k+mU=3Asn zLPwTVG^!%G0hY?3JSW=W~;Mtl<&4|efb2nfWqN|vQ> zR(rZm#o(dc^7KG`P3_W_`j!hY*EzDX{XtA;Nh4C1+H$5+Zrlj6l!2**<4~IiEZqCSF9mT`KZPr90aEHdSxu@Zn56>tY=YR)iF1QZKXU}N&N`DvV zNr0J}#f+KaehBgQopX;_Y;(Nu>cRd8Cfv~f;pU%w^6r0JJ^O33fBA!tb~rW}-`(-; z$-Vz}LVSkngMWXz*1P(m$xRnNd0UycbI(kF{T=IHLz}?01J6417_r4&gnCKR8oH~V zuA+87a6^BQ(%qvRkvh3VXrxS0p#?<>A3$dzajHuN-M(Nn!!KQ~%!)d^lGx#dK4N&y zLIB~t?NXNoO`?a}+n!cmN%Kz_BxgOby|H4I8w3+s0F~l#mt~LB|G7wduFm|j^r>qcMv=Ex8nn%R-j3+%&`ha#Y)c%=&z8pBMW zXXy)cpdVAk>qmRTpk@fBDGTeu0@oqvc<@Sq7-JiDA)4q48(M9cy$OUGKQn7GGYn?L z9TSDJD5y`HpdE99db5BJFjQth1F9tR^kurQ0KpUV?GB9wufco<*N+Camq7+UK=DNWo1jY|O4<|&7 zSd}is9Vu{2&v1v^U0|+(SmA8L;(dxG02~I0C@)sRSqMJN0}bh<&>Us8P>mtU{cdi!`BXI_#jVDZ_2FJ&V55*b zE?9yRM^d|kbqi4OaLPM;1d++ZH8ufp$IsZSc(^XQZJ_Vr)?Iq!us2i&8d##&Lav`v zaQGUt2TVbC#Fuc(4G?8vnp^n5q?|d~Rm-BW2>0<6lBpLwVn~G&f&dwt{W;8dYIuS& zyFgOa*N6_5Z*B#$e(sK7x8Eo0W!V#k$qNtxD_KGvU=E6>C2HltB#tQft?1=^9~V5% z@~;Hy0EEKa=5Z_p>;y2;snLPTwiDc<6WG^j9=NKmIzPoc8*3=!Rlc9YC`23+ZYaV6 zAb><@m+mc<4QNyI^u69l)4}LO&3po3I=DVajz-B-+eF9GvMRYHaR|)(*tx2sO(xy; zNlx)19_#O{_b{Ob{V=!WXwbW|rG-^I4)7IAd8Ypi79!c&{x-P?nqw+_Lvq1ZTtHzYiP>wHA5VCQeR4%rAquxj{az0i@EexW$kmZX9!=_NrJGhV4f?%-EogUMzSop_%loZ|fHPSFI-l#>z8yBZhY?`Z~ z1${(oI2qfG_5*?e2$-TzWIQZM;3p|h!WDT0uv#9QGOB?{fcX!R81xssRN_t_y8*rJ z_Z!vAme$oTa)Y36u5D?lU%IH-U0q%6Zf;rDRO?<+iK%hKYigxhRI$}i#=ubzw1+;X zeV8FS?HWG^MEBt=ASQwWsS2xAB6BN#PUv2PEx+9ZEzQM{HCs2~bY4pCpqpQ(+0)jj z0=v}UBV@oM6`{;Rs_TFOp%1v%NUZ>@4$MD=5W_E{gl5zBgkhF7TwJPQbWj0E&$?7D z&DH6uB~mg-DQ9o4CdR{bz^FSg*VAdWi5+WVHH}H>lbIa}dn^B9D|y61{@tm3xjnxW*k6^P1Evc64Y1 znabCa1FmDEy9nTr3HpfHV4nrgjEAW34`MrO333)m_3Z91ks%DuQonUPCz729K8 zC=CJ@t1hvuZ8=9Z{*>O5Injv5YK?Qrg_BqxD511ordd~27ZqN#kX58ogy~KsB&$f| zdXxZK+U98w#tULztur?pGXx3~HTBh%Ew%2(T6`^CWYP>;<=w>AG&slF!aOx6Pr8~Z zhz8h))dRAOQ-;S5$sXbw8?mj3Na?ak+FI5HY5bIkmirIQNTD<3T$3En^cvEuyt*2a zwltFuV=mQPIQCRLz?&*CcuQC(w!(&_Y5VI5d=s&M3~$r+*8^F?px-7LhG5I@0r;7= zzaEkC9O6Dp+Iw}{yWn>;Y=nK{q>3Yd4snMi-W@vLP4Ihbycvh_h!f77r5@Svj=3oMMDfi_0#Zu?$P`A%_H} zM^wW4)Fy^xsXaC&D8a}|gdcBneX7*~?O)2y!T8|W3$PHR@&xx?SsRI9*V^zOv z`hojUBSzSe@|h*9wz58hhCof9%pJtwE@TnTe7n>x&Y$NLZ=9BfX^C&3o9I?ZdAQ+hbndqxo2Tvd%bXrh#Zv1*d9gZZdFdQ)h^(O@%IH3rB9}fFRyNfSP zgySCaB$a&vaGqUwU_lTpXmYs=Xj4OwWdvPDd8Q)QbQCR=nLq$UJ4Dd6?YvZGE9+Ra z5Ope+ybLsd>9U$ychhn=PnqES&C*)L$@Kz1Rg?tUB=h*fM6zs@iyp}+o9$%ZKuZ)W z=Sz>j>SyFi4!)@u!Tu(m%@_K!sI>HqFFUWGX(3MlD77ODVgnDKYCR{32y5IyNnl}% zRq882g8^-j-+0&3>WY-CDs4)(&tw---l{qBTo+2S!<^QL$2AcTMP-1h1awQ{cHxQH z#m%ejV#sN5qyb1~w$)n6j%QFPQcl5o8Mved+o06#RLt3QI*OWxO~Zh}X-t^FJQ+?# zf(8zvr5oyTlJC4sYd)vzfUw#wDQo=FW39)8D@vY`Do8*|LNiS9LJGMGjeLk`@O60Lxf^*?FqwKLH7Z(d-#jKY)Z%^bya!$cl3{m@Z;z(0PXJT0sG?S3v>o zm+mpsTjWYzWZ-$E6oHzxBfVxMF!vNm%d%J%9TTS+qpP$Sn&lJvnA!-m;i;-X5QzYJ zmdFLzg0(ydJPGE*ypce{QrVi+;x3cp0+>2tdu9BNh&vo{%PkaHS*U_S0T_xR6(2e+ z7*tk6z+W~^lTrMGD#!=h19%~r^X$w5oLyx7@N$!er(bqsG~6x~FDh%);(%@(k6nXf zPz(;mk>qJevg0=)#PDAqbI*6$%>q}ZW@hDeF8MjS=vA7Mjf zJhWSHwU)V{j)V>IS94AenVc||;S{Qkc9GD2 zC*qsGZ^B)qzi-C(S@`}5-b?Vl7*8jj%kg{<&z*Q4)#=TA&G$k0|5NR=ASSYHv?jsH z*VweI+TBvyw4{D1czded8DTY*EtT$u+NFzH7Q0&;;UenwPu4~9Hqhg;PY06{tb;sP z1!@l!giFQ4te3ke=15e+IScUQ(i%Kumbo_=flSZ6f3{DthylW6Q&iuLT*rU1&%A+7 zc~bqK?R&*8VU4rwN7=_Za3O*I@nkixJaIbckuCr8evxr_#z>cn_z(A4`UIEkup!_X z`>uxJ7_ibId&SWG{GaFxrBNsA0S!^^oC|P7T|`4Gl=I@^xCi#)*kX$x&N9bRx)+d1 z%9C42Eoq;BvCdD2Cp1{whh8J;`7q3);ggOk@hmu3Sn8W+u)AZjWd*wm<@RMc`y zd`*7hFtM5zu(t~(&SLprHib@s+chMQCWV)lyN2602H8$flzFU#itgdaT3Ao;M1n;N zd5Tke4c=rS7uU+vTFGzFbqGsa8yYyza%KI@H$k#&3eGzr<6`Rg7R$RcNR9bdOO_FI zZ-AUKt!yyUoHAU~_4sj#sJ>vDe%q(w7U2`;h%)F^96MawhnyV-KA1_LWX>CtBo%6F z?nb@j>VT?^td?9DWcmQlmb%zvX0a~WJg8ZT6PA#m*PaIjd-t;QYMU0r1Uj@RDw|r| zuu8?#rtBwkP)U@2NtmK&szG%oj>`$3uB#UAqqeG-!K)&PI+P^&my|zftNxd@55|c~ z05s>8z*aM1CWfFR1-K>08=VQg8vg#7eoU1E6Vn|bWncGSl3xnigNI7_p4|Jj))-VR zXyXyGBOHtY&(m~r@d3B7Ih>=0sl%YPOgku2(#>UzIZMs>!K*j3Z*Vk@yy>5w~0HoE)cxAcD>bMg_*pnA!3ft>n{yeO@PZjnkzf$ z6dfXcQo>(gS&Ev~ci+iQ@v&3>7x$F@Y`#O7$rKM(h_e@{wkA?m0rmP<{JMFe?)g&a z5!C1ThYywW$H3m~E0PRJUVla9+f;HP_kNxn(GZk1EA`9aQekWe`sk^J4pE5bn`b%1 z1Uxo8vWAB<=i(RNIV3M0a!cdan3G&1RQKUH$g>yPoeQ99hM7Q)8>2Oj*29l7u5})K z(Rwg%KH`*6m%u=;9ROUNFsB`{f|(Is6$8A?+nz4nT83_?xqg_9Y8W!@#!S%rH&(}T zcXMlXb!~IAV5EwGzZ2aO^86_jwSq;o~x!6V6s_gk9`%aHM5TyOU_WQs%I*dDmnE( z8}}7oT6;um5s(shj+O9|Dwf|ZudAXxt6WvMC$_c=!W@W`^gT>0Br`1DjnjOR9^<$% zC%;=_A<&WKkV&7}IQ~}W<}F&aunEI0yJa~v9vd5R=2K)tLpRJbdNLex6d;P~)QMHc z4iix6MKt276{@&FtPEI>@?@WssXiIh5&_Ma3bkv&=E^QPMm)Bg`Z=qGaiB^VC)5aI z8Xm@PL_Cn&B7!$lwDFBZqt|1euNSs4>xDgQy>L*jJO*ZSvPTPB)@b4QW0g~se$^r7 z);h(v7dyn|a9>^n9iwWe*pB;;&!}_?Q+IZa2f`xa_`pWxff=gd^OOlM#zVe~J)w>w zUjokV!6INC%cQ#Au+gwC0ehrUH3$w^1wbXxqsBbk z?*elHB#s8j-RposC%}f}aZMh{)d@<=<{GOOuNy9fb?j22G31L`rcdjGiwpa*(A(fW z15ldfK@o|xLID7ZCtfrU8fenCBF>4fT!}(?yu554jIB3TE;Z(YFVLz^iI@fs^x-zG ztA>6!-_p^11eDEQ`(af zC$;FdWz0t^M9TS?mUXAXd2><=4uF_ZhRY)}j+_;&t+fxa7br`DhHM8ahbjx)DI?wN&rUpxnSwyC;UVdEF=3DLNh=$3%2n^JC? zF9m;J--JOEhtiT^f&5}ct1%AH7~x8GxN zz5`yMGq~Q;B-_r4@2*>Cc06pI-$ctD*oa=;o71l@W$o6i3 z2qXzGV{RTGlp&Rlk|QA9>SP*x3m{x;r*Kp9j7-7uk<0^gBj-(7GEa#sN|a8ZFk;Xk zaf{V7l2+H$9hyG0?H|gY0~A;G=W#JjYRw)=UYfR%xC^r2v=yrVB@2^%vUViIMqxGB zbL3GzHwFx6&(Uq>W;mM@S>0_Yqkz2~^W$bE2o#6JV!4b&8)q7D4jTtk9Bc@w-fNaC zkGu~T`AFJ7WURVYcT#R8uMtsfK)Hs?an6!{?pPq$fhmD$g5?eB%p|4xo~`8RBZNt2 zmpR9XM=QZT4(BL29@ZVS4rdlJCpqW-q52bss=16Si|`F;A0(pPAd#im8W&Z;Gi|d% zj<1Xdje^gKhk0eeUNKfA@BozLxXCcdAS7`q@zk28^T^l$>eRZlerbJ6ePu)ag|#(E z*A1)zcbiflJi^Lp6>TIOB!kI_iim0nlG6i(HzN?7w z64P2=rw3*d#14)BGwjf*d6g1zpR$_AshscBggc0}xok{8Vi$^8))#ZAU^ zsw#@o!*)qlTk3vsWr80W;68F*GCy*Ebb!K9{9|m`R3F96J;#kIz${GD(%J?XNLpH7 z&Af5fBgq|}iUYqL`m$`kGWOwt`Z0SKx&df3H+Ua#>#)2I^mEE4POA11eYrR(9yuoF z!6}P>dVo-ut$wF`a3&PQlc zNZV4o~gavbQG625@&lRo{84M!Ls}Nz7A_oL`1e$KtH#aG} z88RAFS0w%rE|HJt~14s=54HGaIP(YVNATZ-E#ZGr2=#1T>_ln1qDUCR$FbvW`1dZxj&oU zq|kIy&Uupw%1X$42zcb{OqdChM!gg%Lh6glLECi9ZV8Zf!#crDNu=bsOyEPnkG(iG ze?MoQQmtD~7S$8xa>c1UC@0b?*2rm1mj5cL8%_-V^I?FDCf7KshrO#5E9i*w*Mk%o zDgVJ!N#qV0I7LtusGPWzL@s2ML`=v)$~GA(roA6^cvD)(@}YydVQcA#TeSj+tGv8Y z;j^3v1P-joDT89LtS{Fu%C5g^gQ~EWf#ZN+!3bH+#>_LZMqF;q`6Sy!;vA=YFkwOI zfo&y8eO`_GIpfOh6PI0jkygSmb30X&H?1cOT~5S;ff%*j#xUz8)4>|UOsf~f@Ik;# zEh@xD!6}0?UhywCMKh@8gY3}^3LQz+V^B1U+Q*;}l>yA!=x)epZMuta8)8Ptpj?nT z-!$zoq=#TPN8;XcZjZcXbzvA+d8esQN|S+EP$3gL@hS1JQc(LmJTwAhv=U^bVU{x0 zELHGnZmFA>bl|7wTPB4C|7>P~og{`kW^j;Annv;H*~ye6*IyRIV?Lh~2Z#(UVjz+f z7s+l>kUBm65C_NX3RDE^mCe8jXh<>h4l6J?ft~BzcuuEqtj@c{91wjjl6yd@Tqr7b zYQS`On*JSfH*_cO^#Ti&gM(MdhY(w$7hXs@Mp`H-2M~fd!0Gc zHbhwdxQzTt{*Z3WBQiWkv>s&>myb=4X|;~?`Z(qHvuyP?`TorCgO?rRXxwdk>(^A+ zzIRl%mncW`~W9J+hHnd!cCko#yF=e7JEyd^V!=PQ}+qTi?8 zE}VhqV>2hMVu&lPMud|4NF|dC+$w zYy?1LDDIW-vEmW=HW-xgd+Jn`t_A1v8NW@xL-IXVti`!h^S5c1s`~_-{o?O2?XLAI z_g3xpk5zsA+#q+acK5hd{71@Fem%#j_%CR;nf@j1zW6#7|Dw4n{{CB(+o#=T{E&8k zZ=(v2Yj^fN%DwS4mHr+5er}#}cb}o&xp}G{z6HvCu2y=!Uc1e5HdU(dKR2p;?;GU4 zOS?Twbh(4VuOAeC?V#|v^DJ}Jrh5O~>df)od9td53QhmN9(1ZVTgQvYQNrM3Gd)$%zx2O# zU!41-WgJjSAIj$Q-&zl8aKSm_a8EHF`d1{?n^mQ*2Y)Vv@!@yHP3iE*=z(7&!uaqz zqSLbmC(uLxl1OJPHC^g`EzF+!mX0q^%(~s$Y0^EFN=!gF7+j6-1EYOb`zX5JOE&4J2eQ@&$>BscH3~oLf z^ke$p1UH{M^ke!z05>1H&EHnI`8=l|)1U9x;K%1p{aC}2@Z%!|niOhUe#gSi=LG#& zf`kixeCFxL8rA?mJ}vsOh6UiqC!!x~*arCVxlTU}bKoyWN1Cw-_UrpI>-ZSr^4Y2% zYnmUN1YR?2mpwO-ndW`O<DxL!UFe= zpD>Ot|NiQ$e)PT#aSohsd(AWV^|E=3wmdW5x#O*0zIFAPc~Af7#tY68w(CB<^(F(w z1Rj|F_T?{S&sp2~?5zF|YP^4ZYUgi${z}m&|GhbPYx%5+mmhONeYAf`#aG^r{$=9C zEnoS|!>8R{dGVRsZ@+x;QRP4WpH0p2<1aaJ%THGv_tZ6w$GrS$V#Df(ZtFNjx@O%UPX5cC_t#dBz3bFP4Oe%&{_E}K6|=s#aK*&?9>3#}H#UCj*A + +extern const void nrf_app_start; +extern const void nrf_app_end; +extern const void nrf_app_size; + +#endif + int main_func(uint32_t cmd, void *arg) { if (cmd == 1) { systask_postmortem_t *info = (systask_postmortem_t *)arg; @@ -51,7 +60,17 @@ int main_func(uint32_t cmd, void *arg) { system_exit(0); } - screen_boot_stage_2(DISPLAY_JUMP_BEHAVIOR == DISPLAY_RESET_CONTENT); + bool fading = DISPLAY_JUMP_BEHAVIOR == DISPLAY_RESET_CONTENT; + +#ifdef USE_NRF + if (nrf_update_required(&nrf_app_start, (size_t)&nrf_app_size)) { + screen_update(); + nrf_update(&nrf_app_start, (size_t)&nrf_app_size); + fading = true; + } +#endif + + screen_boot_stage_2(fading); #ifdef USE_SECP256K1_ZKP ensure(sectrue * (zkp_context_init() == 0), NULL); diff --git a/core/embed/rust/Cargo.lock b/core/embed/rust/Cargo.lock index a463558c41..a6db466850 100644 --- a/core/embed/rust/Cargo.lock +++ b/core/embed/rust/Cargo.lock @@ -165,6 +165,12 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +[[package]] +name = "minicbor" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50699691433ccd88fbe1f11e9155691d71fc363595109f35a92b77be2e0158f6" + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -346,6 +352,7 @@ dependencies = [ "easer", "glob", "heapless", + "minicbor", "num-derive", "num-traits", "pareen", diff --git a/core/embed/rust/Cargo.toml b/core/embed/rust/Cargo.toml index b6e4f7f7e7..740099fe72 100644 --- a/core/embed/rust/Cargo.toml +++ b/core/embed/rust/Cargo.toml @@ -46,6 +46,8 @@ backlight = [] usb = [] optiga = [] ble = [] +nrf = [] +smp = [] tropic = [] translations = ["crypto"] secmon_layout = [] @@ -58,8 +60,10 @@ test = [ "debug", "glob", "micropython", + "nrf", "optiga", "protobuf", + "smp", "touch", "translations", "ui", @@ -141,6 +145,10 @@ version = "0.3.0" default-features = false features = ["libm"] +[dependencies.minicbor] +version = "1.0.0" +default-features = false + # Build dependencies diff --git a/core/embed/rust/build.rs b/core/embed/rust/build.rs index 65763e86df..135dce8da5 100644 --- a/core/embed/rust/build.rs +++ b/core/embed/rust/build.rs @@ -39,6 +39,7 @@ const DEFAULT_BINDGEN_MACROS_COMMON: &[&str] = &[ "-I../io/button/inc", "-I../io/display/inc", "-I../io/haptic/inc", + "-I../io/nrf/inc", "-I../io/touch/inc", "-I../io/rgb_led/inc", "-I../io/usb/inc", @@ -46,6 +47,7 @@ const DEFAULT_BINDGEN_MACROS_COMMON: &[&str] = &[ "-I../sys/time/inc", "-I../sys/task/inc", "-I../sys/power_manager/inc", + "-I../sys/irq/inc", "-I../util/flash/inc", "-I../util/translations/inc", "-I../models", @@ -56,6 +58,7 @@ const DEFAULT_BINDGEN_MACROS_COMMON: &[&str] = &[ "-DUSE_RGB_LED", "-DUSE_BLE", "-DUSE_POWER_MANAGER", + "-DUSE_NRF", "-DUSE_HW_JPEG_DECODER", ]; @@ -449,6 +452,11 @@ fn generate_trezorhal_bindings() { .allowlist_type("pm_event_t") .allowlist_function("pm_get_events") .allowlist_function("pm_get_state") + // irq + .allowlist_function("irq_lock_fn") + .allowlist_function("irq_unlock_fn") + // nrf + .allowlist_function("nrf_send_uart_data") // c_layout .allowlist_type("c_layout_t"); diff --git a/core/embed/rust/rust_smp.h b/core/embed/rust/rust_smp.h new file mode 100644 index 0000000000..0516290db6 --- /dev/null +++ b/core/embed/rust/rust_smp.h @@ -0,0 +1,12 @@ +#pragma once + +#include + +bool smp_echo(const char* text, uint8_t text_len); + +void smp_reset(void); + +void smp_process_rx_byte(uint8_t byte); + +bool smp_upload_app_image(const uint8_t* data, size_t len, + const uint8_t* image_hash, size_t image_hash_len); diff --git a/core/embed/rust/rust_ui_common.h b/core/embed/rust/rust_ui_common.h index c6a742d3e0..d101533711 100644 --- a/core/embed/rust/rust_ui_common.h +++ b/core/embed/rust/rust_ui_common.h @@ -5,6 +5,8 @@ void display_rsod_rust(const char* title, const char* message, void screen_boot_stage_2(bool fade_in); +void screen_update(void); + void display_image(int16_t x, int16_t y, const uint8_t* data, uint32_t datalen); void display_icon(int16_t x, int16_t y, const uint8_t* data, uint32_t datalen, uint16_t fg_color, uint16_t bg_color); diff --git a/core/embed/rust/src/lib.rs b/core/embed/rust/src/lib.rs index dc6277f7d4..72916993b9 100644 --- a/core/embed/rust/src/lib.rs +++ b/core/embed/rust/src/lib.rs @@ -44,6 +44,8 @@ mod trezorhal; #[cfg(feature = "ui")] pub mod ui; +#[cfg(feature = "smp")] +pub mod smp; pub mod util; diff --git a/core/embed/rust/src/smp/api.rs b/core/embed/rust/src/smp/api.rs new file mode 100644 index 0000000000..05ce0f1a4f --- /dev/null +++ b/core/embed/rust/src/smp/api.rs @@ -0,0 +1,33 @@ +use super::{echo, process_rx_byte, reset, upload}; + +use crate::util::from_c_array; + +#[no_mangle] +extern "C" fn smp_echo(text: *const cty::c_char, text_len: u8) -> bool { + let text = unwrap!(unsafe { from_c_array(text, text_len as usize) }); + + echo::send(text) +} + +#[no_mangle] +extern "C" fn smp_reset() { + reset::send(); +} + +#[no_mangle] +extern "C" fn smp_upload_app_image( + data: *const cty::uint8_t, + len: cty::size_t, + image_hash: *const cty::uint8_t, + image_hash_len: cty::size_t, +) -> bool { + let data_slice = unsafe { core::slice::from_raw_parts(data, len) }; + let hash_slice = unsafe { core::slice::from_raw_parts(image_hash, image_hash_len) }; + + upload::upload_image(data_slice, hash_slice) +} + +#[no_mangle] +extern "C" fn smp_process_rx_byte(byte: u8) { + process_rx_byte(byte) +} diff --git a/core/embed/rust/src/smp/base64.rs b/core/embed/rust/src/smp/base64.rs new file mode 100644 index 0000000000..1f2375d41f --- /dev/null +++ b/core/embed/rust/src/smp/base64.rs @@ -0,0 +1,166 @@ +/// Provides Base64 encoding and decoding in a `no_std` environment. +/// +/// # Errors +/// - `OutputBufferTooSmall` if the provided output buffer is too short. +/// - `InvalidLength` if the input length is not a multiple of 4 for decoding. +/// - `InvalidCharacter` if an invalid Base64 character is encountered during +/// decoding. +#[derive(Debug)] +pub enum Base64Error { + OutputBufferTooSmall, + InvalidLength, + InvalidCharacter, +} + +/// Base64 encoding table +static B64_TABLE: [u8; 64] = *b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +/// Table for calculating padding bytes (0, 2, 1) based on input length mod 3 +static MOD_TABLE: [usize; 3] = [0, 2, 1]; + +/// Encodes `input` bytes into Base64, writing into `output`. +/// Returns the number of bytes written on success. +pub fn base64_encode(input: &[u8], output: &mut [u8]) -> Result { + let len = input.len(); + let output_len = 4 * len.div_ceil(3); + if output.len() < output_len { + return Err(Base64Error::OutputBufferTooSmall); + } + + let mut i = 0; + let mut j = 0; + while i < len { + let a = input[i]; + let b = if i + 1 < len { input[i + 1] } else { 0 }; + let c = if i + 2 < len { input[i + 2] } else { 0 }; + i += 3; + + let triple = ((a as u32) << 16) | ((b as u32) << 8) | (c as u32); + output[j] = B64_TABLE[((triple >> 18) & 0x3F) as usize]; + output[j + 1] = B64_TABLE[((triple >> 12) & 0x3F) as usize]; + output[j + 2] = B64_TABLE[((triple >> 6) & 0x3F) as usize]; + output[j + 3] = B64_TABLE[(triple & 0x3F) as usize]; + j += 4; + } + + // Apply padding + for pad in 0..MOD_TABLE[len % 3] { + output[output_len - 1 - pad] = b'='; + } + + Ok(output_len) +} + +/// Maps a Base64 character to its 6-bit value. +fn base64_char_value(c: u8) -> Option { + match c { + b'A'..=b'Z' => Some(c - b'A'), + b'a'..=b'z' => Some(c - b'a' + 26), + b'0'..=b'9' => Some(c - b'0' + 52), + b'+' => Some(62), + b'/' => Some(63), + _ => None, + } +} + +/// Decodes Base64 `input` bytes into raw bytes, writing into `output`. +/// Returns the number of bytes written on success. +pub fn base64_decode(input: &[u8], output: &mut [u8]) -> Result { + let len = input.len(); + if len % 4 != 0 { + return Err(Base64Error::InvalidLength); + } + + // Count padding '=' bytes + let mut padding = 0; + if len >= 2 { + if input[len - 1] == b'=' { + padding += 1; + } + if input[len - 2] == b'=' { + padding += 1; + } + } + + let decoded_len = (len / 4) * 3 - padding; + if output.len() < decoded_len { + return Err(Base64Error::OutputBufferTooSmall); + } + + let mut i = 0; + let mut j = 0; + while i < len { + let v1 = base64_char_value(input[i]).ok_or(Base64Error::InvalidCharacter)? as u32; + let v2 = base64_char_value(input[i + 1]).ok_or(Base64Error::InvalidCharacter)? as u32; + let v3 = if input[i + 2] == b'=' { + 0 + } else { + base64_char_value(input[i + 2]).ok_or(Base64Error::InvalidCharacter)? as u32 + }; + let v4 = if input[i + 3] == b'=' { + 0 + } else { + base64_char_value(input[i + 3]).ok_or(Base64Error::InvalidCharacter)? as u32 + }; + i += 4; + + let triple = (v1 << 18) | (v2 << 12) | (v3 << 6) | v4; + output[j] = ((triple >> 16) & 0xFF) as u8; + j += 1; + if input[i - 2] != b'=' { + output[j] = ((triple >> 8) & 0xFF) as u8; + j += 1; + } + if input[i - 1] != b'=' { + output[j] = (triple & 0xFF) as u8; + j += 1; + } + } + + Ok(decoded_len) +} + +// Testing uses std; keeps `no_std` for library code. +#[cfg(test)] +extern crate std; + +#[cfg(test)] +mod tests { + use super::*; + use std::vec::Vec; + + #[test] + fn test_encode_decode() { + let tests: [(&[u8], &[u8]); 7] = [ + (b"", b""), + (b"f", b"Zg=="), + (b"fo", b"Zm8="), + (b"foo", b"Zm9v"), + (b"foob", b"Zm9vYg=="), + (b"fooba", b"Zm9vYmE="), + (b"foobar", b"Zm9vYmFy"), + ]; + for &(input, expected) in &tests { + let mut enc_buf = [0u8; 16]; + let len = base64_encode(input, &mut enc_buf).unwrap(); + assert_eq!(&enc_buf[..len], expected); + + let mut dec_buf = [0u8; 16]; + let dec_len = base64_decode(&enc_buf[..len], &mut dec_buf).unwrap(); + assert_eq!(&dec_buf[..dec_len], input); + } + } + + #[test] + fn test_invalid_decode() { + let mut buf = [0u8; 16]; + assert!(matches!( + base64_decode(b"abc", &mut buf), + Err(Base64Error::InvalidLength) + )); + assert!(matches!( + base64_decode(b"!!!!", &mut buf), + Err(Base64Error::InvalidCharacter) + )); + } +} diff --git a/core/embed/rust/src/smp/crc16.rs b/core/embed/rust/src/smp/crc16.rs new file mode 100644 index 0000000000..beffeb664b --- /dev/null +++ b/core/embed/rust/src/smp/crc16.rs @@ -0,0 +1,14 @@ +/// Compute CRC-16-ITU-T over `data`, starting from `seed`. +pub fn crc16_itu_t(mut seed: u16, data: &[u8]) -> u16 { + for &byte in data { + // swap high/low byte: + seed = seed.rotate_left(8); + // mix in next input byte + seed ^= byte as u16; + // apply the ITU-T polynomial bitwise mix + seed ^= (seed & 0x00FF) >> 4; + seed ^= seed << 12; + seed ^= (seed & 0x00FF) << 5; + } + seed +} diff --git a/core/embed/rust/src/smp/echo.rs b/core/embed/rust/src/smp/echo.rs new file mode 100644 index 0000000000..5dd40036ec --- /dev/null +++ b/core/embed/rust/src/smp/echo.rs @@ -0,0 +1,76 @@ +use super::{ + receiver_acquire, send_request, wait_for_response, MsgType, SmpBuffer, SmpHeader, + SMP_CMD_ID_ECHO, SMP_GROUP_OS, SMP_HEADER_SIZE, SMP_OP_READ, +}; +use crate::time::Duration; +use minicbor::{data::Type, decode, Decoder, Encoder}; + +pub fn send(text: &str) -> bool { + let mut cbor_data = [0u8; 64]; + let mut data = [0u8; 64]; + let mut buffer = [0u8; 64]; + + let mut writer = SmpBuffer::new(&mut cbor_data); + + let mut enc = Encoder::new(&mut writer); + unwrap!(enc.map(1)); + unwrap!(enc.str("d")); + unwrap!(enc.str(text)); + + unwrap!(receiver_acquire()); + + let data_len = writer.bytes_written(); + + let header = SmpHeader::new(SMP_OP_READ, data_len, SMP_GROUP_OS, 0, SMP_CMD_ID_ECHO).to_bytes(); + + data[..SMP_HEADER_SIZE].copy_from_slice(&header); + data[SMP_HEADER_SIZE..SMP_HEADER_SIZE + data_len].copy_from_slice(&cbor_data[..data_len]); + + send_request(&mut data[..SMP_HEADER_SIZE + data_len], &mut buffer); + + let mut resp_buffer = [0u8; 64]; + if wait_for_response(MsgType::Echo, &mut resp_buffer, Duration::from_millis(100)).is_ok() { + let echo_msg = process_msg(&resp_buffer); + return if let Ok(msg) = echo_msg { + msg == text + } else { + false + }; + } + + false +} + +pub fn process_msg(buf: &[u8]) -> Result<&str, decode::Error> { + let mut dec = Decoder::new(buf); + + match dec.map()? { + Some(n) => { + // definite-length: iterate exactly n times + for _ in 0..n { + let key = dec.str()?; + let val = dec.str()?; + if key == "r" { + return Ok(val); + } + } + } + None => { + // indefinite-length: keep reading until we hit the "break" + loop { + // peek at the next major type + if let Type::Break = dec.datatype()? { + dec.skip()?; // consume the break + break; + } + let key = dec.str()?; + let val = dec.str()?; + if key == "r" { + return Ok(val); + } + } + } + } + + Err(decode::Error::message("key \"r\" not found")) +} diff --git a/core/embed/rust/src/smp/mod.rs b/core/embed/rust/src/smp/mod.rs new file mode 100644 index 0000000000..84eeefeb30 --- /dev/null +++ b/core/embed/rust/src/smp/mod.rs @@ -0,0 +1,472 @@ +mod api; +mod base64; +mod crc16; +mod echo; +mod reset; +mod upload; + +use crate::{ + time::{Duration, Instant}, + trezorhal::{ + irq::{irq_lock, irq_unlock}, + nrf::send_data, + }, +}; +use base64::{base64_decode, base64_encode}; +use core::{cell::UnsafeCell, convert::Infallible}; +use crc16::crc16_itu_t; +use minicbor::encode::write::Write; + +pub const SMP_HEADER_SIZE: usize = 8; + +pub const SMP_GROUP_OS: u16 = 0; +pub const SMP_GROUP_IMAGE: u16 = 1; + +pub const SMP_CMD_ID_ECHO: u8 = 0; +pub const SMP_CMD_ID_RESET: u8 = 5; +pub const SMP_CMD_ID_IMAGE_UPLOAD: u8 = 1; + +pub const SMP_OP_READ: u8 = 0; +pub const SMP_OP_READ_RSP: u8 = 1; +pub const SMP_OP_WRITE: u8 = 2; +pub const SMP_OP_WRITE_RSP: u8 = 3; + +const MSG_HEADER_SIZE: usize = 2; +const MSG_FOOTER_SIZE: usize = 2; + +const FRAME_HEADER_SIZE: usize = 2; +const FRAME_FOOTER_SIZE: usize = 1; // newline + +// Frame sizing +const BOOT_SERIAL_FRAME_MTU_BIN: usize = 93; +const BOOT_SERIAL_FRAME_MTU: usize = 124; +const BOOT_SERIAL_MAX_MSG_SIZE: usize = 512; + +// Frame start bytes +const START_INIT_FRAME_BYTE_0: u8 = 6; +const START_INIT_FRAME_BYTE_1: u8 = 9; +const START_CONT_FRAME_BYTE_0: u8 = 4; +const START_CONT_FRAME_BYTE_1: u8 = 20; + +/// ReceiverStorage wraps an UnsafeCell> in a static. +/// SAFETY: We need manual synchronization (irq_lock/irq_unlock) whenever +/// accessing this static. UnsafeCell allows interior mutability, but we must +/// ensure only one context writes at a time. +struct ReceiverStorage(UnsafeCell>); +static SMP_RECEIVER: ReceiverStorage = ReceiverStorage(UnsafeCell::new(None)); + +/// We assert that it is safe to share `ReceiverStorage` across +/// threads/interrupt contexts because we manually lock interrupts +/// (irq_lock/irq_unlock) around all accesses. SAFETY: If any code touches +/// SMP_RECEIVER without locking IRQ, data races could occur. +unsafe impl Sync for ReceiverStorage {} + +#[derive(Debug)] +pub enum SmpError { + Timeout, + WrongMessage, + Busy, +} + +pub struct SmpHeader { + op: u8, + _reserved: u8, + len: usize, + group: u16, + seq: u8, + cmd_id: u8, +} + +impl SmpHeader { + pub fn new(op: u8, len: usize, group: u16, seq: u8, cmd_id: u8) -> Self { + SmpHeader { + op, + _reserved: 0, + len, + group, + seq, + cmd_id, + } + } + + pub fn from_bytes(b: &[u8]) -> Self { + // we assume b.len() >= HEADER_SIZE + + let len: u16 = u16::from_be_bytes([b[2], b[3]]); + let group: u16 = u16::from_be_bytes([b[4], b[5]]); // [hi, lo] + + SmpHeader { + op: b[0], + _reserved: b[1], + len: len as usize, + group, + seq: b[6], + cmd_id: b[7], + } + } + + pub fn to_bytes(&self) -> [u8; SMP_HEADER_SIZE] { + let len_be = (self.len as u16).to_be_bytes(); // [hi, lo] + let group_be = self.group.to_be_bytes(); // [hi, lo] + [ + self.op, + self._reserved, + len_be[0], + len_be[1], + group_be[0], + group_be[1], + self.seq, + self.cmd_id, + ] + } +} + +pub fn encode_request(data: &[u8], out: &mut [u8]) { + let len = data.len(); + + if out.len() < len + MSG_HEADER_SIZE + MSG_FOOTER_SIZE { + return; + } + + // length including CRC (2 bytes) and length field itself + let length_field = (len + MSG_HEADER_SIZE) as u16; + out[0] = (length_field >> 8) as u8; + out[1] = (length_field & 0xFF) as u8; + + // copy the payload + out[MSG_HEADER_SIZE..MSG_HEADER_SIZE + len].copy_from_slice(data); + + // compute CRC + let crc = crc16_itu_t(0, data); + + // append CRC hi/lo + out[len + MSG_HEADER_SIZE] = (crc >> 8) as u8; + out[len + MSG_HEADER_SIZE + 1] = (crc & 0xFF) as u8; +} + +pub fn send_request(data: &mut [u8], buffer: &mut [u8]) { + encode_request(data, buffer); + + let total = data.len() + MSG_HEADER_SIZE + MSG_FOOTER_SIZE; + + let data = &buffer[..total]; + + // One buffer big enough for header + max‐encoded data + newline + // header = 2 bytes + // base64 of BOOT_SERIAL_FRAME_MTU_BIN fits in BOOT_SERIAL_FRAME_MTU + // newline = 1 byte + let mut buf = [0u8; FRAME_HEADER_SIZE + BOOT_SERIAL_FRAME_MTU + FRAME_FOOTER_SIZE]; + + let mut init_frame = true; + for chunk in data.chunks(BOOT_SERIAL_FRAME_MTU_BIN) { + // 1) write the two‐byte header + let (b0, b1) = if init_frame { + (START_INIT_FRAME_BYTE_0, START_INIT_FRAME_BYTE_1) + } else { + (START_CONT_FRAME_BYTE_0, START_CONT_FRAME_BYTE_1) + }; + buf[0] = b0; + buf[1] = b1; + + let enc_len = unwrap!(base64_encode(chunk, &mut buf[FRAME_HEADER_SIZE..])); + + // 3) append newline + let total_len = FRAME_HEADER_SIZE + enc_len; + buf[total_len] = b'\n'; + + // 4) send it out + send_data(&buf[..total_len + FRAME_FOOTER_SIZE]); + + init_frame = false; + } +} + +/// A simple writer that copies into a `&mut [u8]` and counts bytes written. +pub struct SmpBuffer<'a> { + buf: &'a mut [u8], + written: usize, +} + +impl<'a> SmpBuffer<'a> { + /// Wrap your buffer: + pub fn new(buf: &'a mut [u8]) -> Self { + SmpBuffer { buf, written: 0 } + } + + /// How many bytes have been written so far? + pub fn bytes_written(&self) -> usize { + self.written + } + + /// Get the filled portion of the buffer. + pub fn filled(&self) -> &[u8] { + &self.buf[..self.written] + } +} + +impl<'a> Write for SmpBuffer<'a> { + type Error = Infallible; + + fn write_all(&mut self, data: &[u8]) -> Result<(), Self::Error> { + let end = self.written + data.len(); + // In production you might guard against overflow: + // if end > self.buf.len() { return Err(...); } + self.buf[self.written..end].copy_from_slice(data); + self.written = end; + Ok(()) + } +} + +#[derive(Copy, Clone, PartialEq)] +pub enum MsgType { + Echo, + ImageUploadResponse, + Unknown, +} + +#[derive(Copy, Clone)] +pub struct SmpReceiver { + rx_frame: [u8; BOOT_SERIAL_FRAME_MTU + FRAME_HEADER_SIZE + FRAME_FOOTER_SIZE], + rx_frame_len: usize, + rx_frame_dec: [u8; BOOT_SERIAL_FRAME_MTU + FRAME_HEADER_SIZE + FRAME_FOOTER_SIZE], + rx_msg: [u8; BOOT_SERIAL_MAX_MSG_SIZE], + rx_msg_len: usize, + msg_type: Option, +} + +impl SmpReceiver { + pub fn new() -> Self { + Self { + rx_frame: [0; BOOT_SERIAL_FRAME_MTU + FRAME_HEADER_SIZE + FRAME_FOOTER_SIZE], + rx_frame_len: 0, + rx_frame_dec: [0; BOOT_SERIAL_FRAME_MTU + FRAME_HEADER_SIZE + FRAME_FOOTER_SIZE], + rx_msg: [0; BOOT_SERIAL_MAX_MSG_SIZE], + rx_msg_len: 0, + msg_type: None, + } + } + + /// Call this for each incoming byte + pub fn process_byte(&mut self, byte: u8) { + if self.msg_type.is_some() { + return; + } + + if byte == b'\n' { + // end of a frame + if self.rx_frame_len > 0 { + let frame = &self.rx_frame[..self.rx_frame_len]; + + // init or continuation? + if frame[0] == START_INIT_FRAME_BYTE_0 && frame[1] == START_INIT_FRAME_BYTE_1 { + self.rx_msg_len = 0; + self.process_frame(); + } else if frame[0] == START_CONT_FRAME_BYTE_0 + && frame[1] == START_CONT_FRAME_BYTE_1 + && self.rx_msg_len != 0 + { + self.process_frame(); + } + } + // reset for next frame + self.rx_frame_len = 0; + } else { + // accumulate into smp_rx_frame[] + if self.rx_frame_len < self.rx_frame.len() { + self.rx_frame[self.rx_frame_len] = byte; + self.rx_frame_len += 1; + } + } + } + + /// Handle one decoded frame chunk + fn process_frame(&mut self) { + // Base64‐decode into rx_frame_dec[] + let decode_res = + base64_decode(&self.rx_frame[2..self.rx_frame_len], &mut self.rx_frame_dec); + + if let Ok(len) = decode_res { + if len > 0 { + // copy into rx_msg at current offset + let remaining = self.rx_msg.len().saturating_sub(self.rx_msg_len); + let copy_len = len.min(remaining); + + self.rx_msg[self.rx_msg_len..self.rx_msg_len + copy_len] + .copy_from_slice(&self.rx_frame_dec[..copy_len]); + + let received_len = self.rx_msg_len + len; + + // the first two bytes of rx_msg are the length field + let msg_len = ((self.rx_msg[0] as u16) << 8) | (self.rx_msg[1] as u16); + + // too long? (received_len - 2) > msg_len + if received_len.saturating_sub(2) > msg_len as usize { + self.rx_msg_len = 0; + return; + } + + // advance offset by the *full* decoded length + self.rx_msg_len = received_len; + + // complete? + if received_len.saturating_sub(2) == msg_len as usize { + // TODO: CRC check here + + self.process_msg(msg_len as _); + } + } + } + } + + fn process_msg(self: &mut SmpReceiver, msg_len: usize) { + // hand off [2..2+msg_len] as header+payload + let start = MSG_HEADER_SIZE; + let end = start + msg_len; + + let msg = &self.rx_msg[start..end]; + + // too short? + if msg.len() < SMP_HEADER_SIZE { + return; + } + + let hdr = SmpHeader::from_bytes(&msg[..SMP_HEADER_SIZE]); + let group = hdr.group; + let cmd_id = hdr.cmd_id; + + match (group, cmd_id) { + (SMP_GROUP_OS, SMP_CMD_ID_ECHO) => { + self.msg_type = Some(MsgType::Echo); + } + (SMP_GROUP_IMAGE, SMP_CMD_ID_IMAGE_UPLOAD) => { + self.msg_type = Some(MsgType::ImageUploadResponse); + } + _ => self.msg_type = Some(MsgType::Unknown), + } + } +} + +/// Called from interrupt context. +pub fn process_rx_byte(byte: u8) { + // SAFETY: Called from interrupt context so no concurrency + unsafe { + let opt_ref: &mut Option = &mut *SMP_RECEIVER.0.get(); + if let Some(receiver) = opt_ref.as_mut() { + receiver.process_byte(byte); + } + } +} + +pub fn receiver_release() { + let key = irq_lock(); + + // SAFETY: Protected by IRQ lock. Resets Option → None + unsafe { + let opt_ref: &mut Option = &mut *SMP_RECEIVER.0.get(); + *opt_ref = None; + } + + irq_unlock(key); +} + +pub fn receiver_acquire() -> Result<(), SmpError> { + let key = irq_lock(); + + // SAFETY: Protected by IRQ lock + let already_acquired = unsafe { + let opt_ref: &Option = &*SMP_RECEIVER.0.get(); + opt_ref.is_some() + }; + + if already_acquired { + irq_unlock(key); + return Err(SmpError::Busy); + } + + let new_rcv = SmpReceiver::new(); + // SAFETY: Protected by IRQ lock + unsafe { + let opt_mut: &mut Option = &mut *SMP_RECEIVER.0.get(); + *opt_mut = Some(new_rcv); + } + + irq_unlock(key); + Ok(()) +} + +/// Read message type without removing it. +/// SAFETY: Unsafe because we access static mutable without compile-time borrow +/// checks. Must always be called with IRQ lock held. +unsafe fn receiver_read_msg_type() -> Option { + // SAFETY: Caller must hold lock to avoid races. + let msg_type = unsafe { + let opt_ref: &Option = &*SMP_RECEIVER.0.get(); + unwrap!(opt_ref.as_ref().map(|r| r.msg_type)) + }; + + msg_type +} + +/// Copy received message payload (excluding header/footer) into `buf`. +/// Returns the payload length on success. +/// SAFETY: Caller must hold IRQ lock, and `buf` must be large enough. +/// Also, `unwrap!` will panic if `opt_ref` is None (i.e., no receiver +/// acquired). +unsafe fn received_read_msg(buf: &mut [u8]) -> Result { + // SAFETY: Caller held lock, so safe to read. + let receiver_ref = unsafe { + let opt_ref: &Option = &*SMP_RECEIVER.0.get(); + unwrap!(opt_ref.as_ref(), "Receiver is not initialized") + }; + + if receiver_ref.rx_msg_len == 0 { + return Err(SmpError::WrongMessage); + } + + let data_start = MSG_HEADER_SIZE + SMP_HEADER_SIZE; + let data_end = receiver_ref.rx_msg_len - MSG_FOOTER_SIZE; + let data = &receiver_ref.rx_msg[data_start..data_end]; + let data_len = data.len(); + + if data_len > buf.len() { + fatal_error!("Buffer too small"); + } + + buf[..data_len].copy_from_slice(data); + + Ok(data_len) +} + +pub fn wait_for_response( + expected_msg_type: MsgType, + buf: &mut [u8], + timeout: Duration, +) -> Result { + let start = Instant::now(); + loop { + let key = irq_lock(); + // SAFETY: IRQ locked + let msg_type = unsafe { receiver_read_msg_type() }; + irq_unlock(key); + if let Some(msg_type) = msg_type { + if msg_type != expected_msg_type { + return Err(SmpError::WrongMessage); + } + + let key = irq_lock(); + // SAFETY: IRQ locked, safe to read and clear receiver + let len = unsafe { unwrap!(received_read_msg(buf)) }; + irq_unlock(key); + + receiver_release(); + + return Ok(len); + } + + if Instant::now().checked_duration_since(start) > Some(timeout) { + // timeout reached + receiver_release(); + return Err(SmpError::Timeout); + } + } +} diff --git a/core/embed/rust/src/smp/reset.rs b/core/embed/rust/src/smp/reset.rs new file mode 100644 index 0000000000..3070b4c031 --- /dev/null +++ b/core/embed/rust/src/smp/reset.rs @@ -0,0 +1,27 @@ +use minicbor::Encoder; + +use super::{ + send_request, SmpBuffer, SmpHeader, SMP_CMD_ID_RESET, SMP_GROUP_OS, SMP_HEADER_SIZE, + SMP_OP_READ, +}; + +pub fn send() { + let mut cbor_data = [0u8; 64]; + let mut data = [0u8; 64]; + let mut buffer = [0u8; 64]; + + let mut writer = SmpBuffer::new(&mut cbor_data); + + let mut enc = Encoder::new(&mut writer); + unwrap!(enc.map(0)); + + let data_len = writer.bytes_written(); + + let header = + SmpHeader::new(SMP_OP_READ, data_len, SMP_GROUP_OS, 0, SMP_CMD_ID_RESET).to_bytes(); + + data[..SMP_HEADER_SIZE].copy_from_slice(&header); + data[SMP_HEADER_SIZE..SMP_HEADER_SIZE + data_len].copy_from_slice(&cbor_data[..data_len]); + + send_request(&mut data[..SMP_HEADER_SIZE + data_len], &mut buffer); +} diff --git a/core/embed/rust/src/smp/upload.rs b/core/embed/rust/src/smp/upload.rs new file mode 100644 index 0000000000..9e731e0383 --- /dev/null +++ b/core/embed/rust/src/smp/upload.rs @@ -0,0 +1,101 @@ +use super::{ + receiver_acquire, send_request, wait_for_response, MsgType, SmpBuffer, SmpHeader, + SMP_CMD_ID_IMAGE_UPLOAD, SMP_GROUP_IMAGE, SMP_HEADER_SIZE, SMP_OP_WRITE, +}; +use crate::time::Duration; +use minicbor::Encoder; + +const CHUNK_SIZE: usize = 256; +const MAX_PACKET_SIZE: usize = 512; + +pub fn upload_image(image_data: &[u8], image_hash: &[u8]) -> bool { + let mut cbor_data = [0u8; MAX_PACKET_SIZE]; + let mut data = [0u8; MAX_PACKET_SIZE]; + let mut buffer = [0u8; MAX_PACKET_SIZE]; + + let mut writer = SmpBuffer::new(&mut cbor_data); + + let mut enc = Encoder::new(&mut writer); + + unwrap!(enc.map(5)); + unwrap!(enc.str("image")); + unwrap!(enc.u8(0)); + unwrap!(enc.str("len")); + unwrap!(enc.u64(image_data.len() as _)); + unwrap!(enc.str("off")); + unwrap!(enc.u8(0)); + unwrap!(enc.str("hash")); + unwrap!(enc.bytes(image_hash)); + unwrap!(enc.str("data")); + unwrap!(enc.bytes(&image_data[..CHUNK_SIZE])); + + let data_len = writer.bytes_written(); + unwrap!(receiver_acquire()); + + let header = SmpHeader::new( + SMP_OP_WRITE, + data_len, + SMP_GROUP_IMAGE, + 0, + SMP_CMD_ID_IMAGE_UPLOAD, + ) + .to_bytes(); + + data[..SMP_HEADER_SIZE].copy_from_slice(&header); + data[SMP_HEADER_SIZE..SMP_HEADER_SIZE + data_len].copy_from_slice(&cbor_data[..data_len]); + + send_request(&mut data[..SMP_HEADER_SIZE + data_len], &mut buffer); + + let mut resp_buffer = [0u8; 64]; + if wait_for_response( + MsgType::ImageUploadResponse, + &mut resp_buffer, + Duration::from_millis(100), + ) + .is_err() + { + return false; + } + + let mut offset = CHUNK_SIZE; + + for chunk in image_data.chunks(CHUNK_SIZE).skip(1) { + let mut cbor_data = [0u8; MAX_PACKET_SIZE]; + let mut data = [0u8; MAX_PACKET_SIZE]; + let mut buffer = [0u8; MAX_PACKET_SIZE]; + let mut writer = SmpBuffer::new(&mut cbor_data); + let mut enc = Encoder::new(&mut writer); + + unwrap!(enc.map(2)); + unwrap!(enc.str("off")); + unwrap!(enc.u32(offset as _)); + unwrap!(enc.str("data")); + unwrap!(enc.bytes(chunk)); + + let data_len = writer.bytes_written(); + + unwrap!(receiver_acquire()); + + let header = SmpHeader::new(SMP_OP_WRITE, data_len, SMP_GROUP_IMAGE, 0, 1).to_bytes(); + + data[..SMP_HEADER_SIZE].copy_from_slice(&header); + data[SMP_HEADER_SIZE..SMP_HEADER_SIZE + data_len].copy_from_slice(&cbor_data[..data_len]); + + send_request(&mut data[..SMP_HEADER_SIZE + data_len], &mut buffer); + + let mut resp_buffer = [0u8; 64]; + if wait_for_response( + MsgType::ImageUploadResponse, + &mut resp_buffer, + Duration::from_millis(100), + ) + .is_err() + { + return false; + } + + offset += CHUNK_SIZE; + } + + true +} diff --git a/core/embed/rust/src/trezorhal/irq.rs b/core/embed/rust/src/trezorhal/irq.rs new file mode 100644 index 0000000000..116bb3d248 --- /dev/null +++ b/core/embed/rust/src/trezorhal/irq.rs @@ -0,0 +1,13 @@ +use super::ffi; + +pub use ffi::irq_key_t as IrqKey; + +pub fn irq_lock() -> IrqKey { + unsafe { ffi::irq_lock_fn() } +} + +pub fn irq_unlock(key: IrqKey) { + unsafe { + ffi::irq_unlock_fn(key); + } +} diff --git a/core/embed/rust/src/trezorhal/nrf.rs b/core/embed/rust/src/trezorhal/nrf.rs new file mode 100644 index 0000000000..d0e1aa2f40 --- /dev/null +++ b/core/embed/rust/src/trezorhal/nrf.rs @@ -0,0 +1,7 @@ +use super::ffi; + +pub fn send_data(data: &[u8]) { + unsafe { + ffi::nrf_send_uart_data(data.as_ptr(), data.len() as _); + } +} diff --git a/core/embed/rust/src/ui/api/common_c.rs b/core/embed/rust/src/ui/api/common_c.rs index f9b8037c3a..1fe459600f 100644 --- a/core/embed/rust/src/ui/api/common_c.rs +++ b/core/embed/rust/src/ui/api/common_c.rs @@ -30,3 +30,8 @@ extern "C" fn display_rsod_rust( extern "C" fn screen_boot_stage_2(fade_in: bool) { ModelUI::screen_boot_stage_2(fade_in); } + +#[no_mangle] +extern "C" fn screen_update() { + ModelUI::screen_update(); +} diff --git a/core/embed/rust/src/ui/layout_bolt/mod.rs b/core/embed/rust/src/ui/layout_bolt/mod.rs index 8d53334b5c..3892739039 100644 --- a/core/embed/rust/src/ui/layout_bolt/mod.rs +++ b/core/embed/rust/src/ui/layout_bolt/mod.rs @@ -80,6 +80,15 @@ impl CommonUI for UIBolt { show(&mut frame, fade_in); } + fn screen_update() { + let mut frame = ErrorScreen::new( + "Update".into(), + "Finishing firmware update".into(), + "Do not turn of your trezor".into(), + ); + show(&mut frame, true); + } + #[cfg(feature = "ui_debug_overlay")] fn render_debug_overlay<'s>(_target: &mut impl shape::Renderer<'s>, _info: DebugOverlay) { // Not implemented diff --git a/core/embed/rust/src/ui/layout_caesar/mod.rs b/core/embed/rust/src/ui/layout_caesar/mod.rs index 66d7709445..c4a4713ee1 100644 --- a/core/embed/rust/src/ui/layout_caesar/mod.rs +++ b/core/embed/rust/src/ui/layout_caesar/mod.rs @@ -35,6 +35,10 @@ impl CommonUI for UICaesar { screens::screen_boot_stage_2(fade_in); } + fn screen_update() { + unimplemented!() + } + #[cfg(feature = "ui_debug_overlay")] fn render_debug_overlay<'s>(_target: &mut impl shape::Renderer<'s>, _info: DebugOverlay) { // Not implemented diff --git a/core/embed/rust/src/ui/layout_delizia/mod.rs b/core/embed/rust/src/ui/layout_delizia/mod.rs index 09d02d707b..b9241debf5 100644 --- a/core/embed/rust/src/ui/layout_delizia/mod.rs +++ b/core/embed/rust/src/ui/layout_delizia/mod.rs @@ -81,6 +81,10 @@ impl CommonUI for UIDelizia { screens::screen_boot_stage_2(fade_in); } + fn screen_update() { + unimplemented!() + } + #[cfg(feature = "ui_debug_overlay")] fn render_debug_overlay<'s>(target: &mut impl shape::Renderer<'s>, info: DebugOverlay) { let mut text = ShortString::new(); diff --git a/core/embed/rust/src/ui/layout_eckhart/mod.rs b/core/embed/rust/src/ui/layout_eckhart/mod.rs index 50ec569925..8e73349ee2 100644 --- a/core/embed/rust/src/ui/layout_eckhart/mod.rs +++ b/core/embed/rust/src/ui/layout_eckhart/mod.rs @@ -1,4 +1,5 @@ use super::{geometry::Rect, CommonUI}; +use crate::ui::layout::simplified::show; use theme::backlight; #[cfg(feature = "ui_debug_overlay")] @@ -34,6 +35,8 @@ pub mod ui_firmware; #[cfg(feature = "prodtest")] mod prodtest; +use component::ErrorScreen; + pub struct UIEckhart; impl CommonUI for UIEckhart { @@ -87,6 +90,15 @@ impl CommonUI for UIEckhart { screens::screen_boot_stage_2(fade_in); } + fn screen_update() { + let mut frame = ErrorScreen::new( + "Update".into(), + "Finishing firmware update".into(), + "Do not turn of your trezor".into(), + ); + show(&mut frame, true); + } + #[cfg(feature = "ui_debug_overlay")] fn render_debug_overlay<'s>(target: &mut impl shape::Renderer<'s>, info: DebugOverlay) { let mut text = ShortString::new(); diff --git a/core/embed/rust/src/ui/ui_common.rs b/core/embed/rust/src/ui/ui_common.rs index 6ce9144ea8..2388a5326e 100644 --- a/core/embed/rust/src/ui/ui_common.rs +++ b/core/embed/rust/src/ui/ui_common.rs @@ -44,6 +44,8 @@ pub trait CommonUI { fn screen_boot_stage_2(fade_in: bool); + fn screen_update(); + /// Renders a partially transparent overlay over the screen content /// using data from the `DebugOverlay` struct. #[cfg(feature = "ui_debug_overlay")] diff --git a/core/embed/rust/trezorhal.h b/core/embed/rust/trezorhal.h index 375bedc040..3a0bd755cd 100644 --- a/core/embed/rust/trezorhal.h +++ b/core/embed/rust/trezorhal.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -22,6 +23,10 @@ #include #endif +#ifdef USE_NRF +#include +#endif + #ifdef USE_BUTTON #include #endif diff --git a/core/embed/sys/irq/inc/sys/irq.h b/core/embed/sys/irq/inc/sys/irq.h index d4a283354b..74c9cf69a1 100644 --- a/core/embed/sys/irq/inc/sys/irq.h +++ b/core/embed/sys/irq/inc/sys/irq.h @@ -17,10 +17,8 @@ * along with this program. If not, see . */ -#ifndef TREZORHAL_IRQ_H -#define TREZORHAL_IRQ_H +#pragma once -#include #include #ifdef SYSTEM_VIEW @@ -37,6 +35,10 @@ typedef uint32_t irq_key_t; +#ifndef TREZOR_EMULATOR + +#include + // Checks if interrupts are enabled #define IS_IRQ_ENABLED(key) (((key) & 1) == 0) @@ -131,4 +133,8 @@ static inline void irq_unlock_ns(irq_key_t key) { // Lowest priority in the system used by SVC and PENDSV exception handlers #define IRQ_PRI_LOWEST NVIC_EncodePriority(NVIC_PRIORITYGROUP_4, 15, 0) -#endif // TREZORHAL_IRQ_H +#endif + +// functions for rust exposure, same behavior as the macros above +irq_key_t irq_lock_fn(void); +void irq_unlock_fn(irq_key_t key); diff --git a/core/embed/sys/irq/stm32/irq.c b/core/embed/sys/irq/stm32/irq.c new file mode 100644 index 0000000000..1fc0b686e9 --- /dev/null +++ b/core/embed/sys/irq/stm32/irq.c @@ -0,0 +1,26 @@ +/* + * This file is part of the Trezor project, https://trezor.io/ + * + * Copyright (c) SatoshiLabs + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifdef KERNEL_MODE + +#include + +irq_key_t irq_lock_fn(void) { return irq_lock(); } +void irq_unlock_fn(irq_key_t key) { irq_unlock(key); } + +#endif diff --git a/core/embed/sys/linker/stm32u5g/firmware.ld b/core/embed/sys/linker/stm32u5g/firmware.ld index e34c154ae5..df9fbe8054 100644 --- a/core/embed/sys/linker/stm32u5g/firmware.ld +++ b/core/embed/sys/linker/stm32u5g/firmware.ld @@ -46,6 +46,9 @@ SECTIONS { *(.text*); . = ALIGN(4); *(.rodata*); + . = ALIGN(4); + KEEP(*(.nrf_app)); + *(.nrf_app*); . = ALIGN(512); } >FLASH AT>FLASH diff --git a/core/embed/sys/syscall/inc/sys/syscall_numbers.h b/core/embed/sys/syscall/inc/sys/syscall_numbers.h index 54855e338e..2e90ecefc2 100644 --- a/core/embed/sys/syscall/inc/sys/syscall_numbers.h +++ b/core/embed/sys/syscall/inc/sys/syscall_numbers.h @@ -139,6 +139,9 @@ typedef enum { SYSCALL_BLE_CAN_READ, SYSCALL_BLE_READ, + SYSCALL_NRF_UPDATE_REQUIRED, + SYSCALL_NRF_UPDATE, + SYSCALL_POWER_MANAGER_SUSPEND, SYSCALL_POWER_MANAGER_HIBERNATE, SYSCALL_POWER_MANAGER_GET_STATE, diff --git a/core/embed/sys/syscall/stm32/syscall_dispatch.c b/core/embed/sys/syscall/stm32/syscall_dispatch.c index d9f91078a3..87eeb0688c 100644 --- a/core/embed/sys/syscall/stm32/syscall_dispatch.c +++ b/core/embed/sys/syscall/stm32/syscall_dispatch.c @@ -45,6 +45,10 @@ #include #endif +#ifdef USE_NRF +#include +#endif + #ifdef USE_BUTTON #include #endif @@ -741,6 +745,22 @@ __attribute((no_stack_protector)) void syscall_handler(uint32_t *args, } break; #endif +#ifdef USE_NRF + + case SYSCALL_NRF_UPDATE_REQUIRED: { + const uint8_t *data = (const uint8_t *)args[0]; + size_t len = args[1]; + args[0] = nrf_update_required__verified(data, len); + } break; + + case SYSCALL_NRF_UPDATE: { + const uint8_t *data = (const uint8_t *)args[0]; + size_t len = args[1]; + args[0] = nrf_update__verified(data, len); + } break; + +#endif + #ifdef USE_POWER_MANAGER case SYSCALL_POWER_MANAGER_SUSPEND: { args[0] = pm_suspend(); diff --git a/core/embed/sys/syscall/stm32/syscall_stubs.c b/core/embed/sys/syscall/stm32/syscall_stubs.c index 61b666ff9c..59a35eb7d4 100644 --- a/core/embed/sys/syscall/stm32/syscall_stubs.c +++ b/core/embed/sys/syscall/stm32/syscall_stubs.c @@ -681,6 +681,24 @@ uint32_t ble_read(uint8_t *data, uint16_t len) { #endif +#ifdef USE_NRF + +// ============================================================================= +// nrf.h +// ============================================================================= + +bool nrf_update_required(const uint8_t *data, size_t len) { + return (bool)syscall_invoke2((uint32_t)data, (uint32_t)len, + SYSCALL_NRF_UPDATE_REQUIRED); +} + +bool nrf_update(const uint8_t *data, size_t len) { + return (bool)syscall_invoke2((uint32_t)data, (uint32_t)len, + SYSCALL_NRF_UPDATE); +} + +#endif + // ============================================================================= // power_manager.h // ============================================================================= diff --git a/core/embed/sys/syscall/stm32/syscall_verifiers.c b/core/embed/sys/syscall/stm32/syscall_verifiers.c index 475dd3f34b..4fea54a49e 100644 --- a/core/embed/sys/syscall/stm32/syscall_verifiers.c +++ b/core/embed/sys/syscall/stm32/syscall_verifiers.c @@ -817,6 +817,36 @@ access_violation: // --------------------------------------------------------------------- +#ifdef USE_NRF + +bool nrf_update_required__verified(const uint8_t *data, size_t len) { + if (!probe_read_access(data, len)) { + goto access_violation; + } + + return nrf_update_required(data, len); + +access_violation: + apptask_access_violation(); + return false; +} + +bool nrf_update__verified(const uint8_t *data, size_t len) { + if (!probe_read_access(data, len)) { + goto access_violation; + } + + return nrf_update(data, len); + +access_violation: + apptask_access_violation(); + return false; +} + +#endif + +// --------------------------------------------------------------------- + #ifdef USE_POWER_MANAGER pm_status_t pm_get_state__verified(pm_state_t *status) { diff --git a/core/embed/sys/syscall/stm32/syscall_verifiers.h b/core/embed/sys/syscall/stm32/syscall_verifiers.h index a83d43496b..7864ef8e93 100644 --- a/core/embed/sys/syscall/stm32/syscall_verifiers.h +++ b/core/embed/sys/syscall/stm32/syscall_verifiers.h @@ -207,6 +207,16 @@ secbool ble_read__verified(uint8_t *data, size_t len); #endif +// --------------------------------------------------------------------- +#ifdef USE_NRF + +#include + +bool nrf_update_required__verified(const uint8_t *data, size_t len); + +bool nrf_update__verified(const uint8_t *data, size_t len); + +#endif // --------------------------------------------------------------------- #ifdef USE_POWER_MANAGER diff --git a/core/site_scons/models/T3W1/trezor_t3w1_revA.py b/core/site_scons/models/T3W1/trezor_t3w1_revA.py index 55b5aa4ea0..fb17018a5e 100644 --- a/core/site_scons/models/T3W1/trezor_t3w1_revA.py +++ b/core/site_scons/models/T3W1/trezor_t3w1_revA.py @@ -109,8 +109,11 @@ def configure( defines += [("USE_BLE", "1")] sources += ["embed/io/nrf/stm32u5/nrf.c"] sources += ["embed/io/nrf/stm32u5/nrf_test.c"] + sources += ["embed/io/nrf/stm32u5/nrf_update.c"] sources += ["embed/io/nrf/crc8.c"] paths += ["embed/io/nrf/inc"] + features_available.append("nrf") + defines += [("USE_NRF", "1")] sources += [ "vendor/stm32u5xx_hal_driver/Src/stm32u5xx_hal_uart.c", "vendor/stm32u5xx_hal_driver/Src/stm32u5xx_hal_uart_ex.c", diff --git a/core/site_scons/models/T3W1/trezor_t3w1_revB.py b/core/site_scons/models/T3W1/trezor_t3w1_revB.py index 26676a360d..3e7c1218fc 100644 --- a/core/site_scons/models/T3W1/trezor_t3w1_revB.py +++ b/core/site_scons/models/T3W1/trezor_t3w1_revB.py @@ -109,8 +109,11 @@ def configure( defines += [("USE_BLE", "1")] sources += ["embed/io/nrf/stm32u5/nrf.c"] sources += ["embed/io/nrf/stm32u5/nrf_test.c"] + sources += ["embed/io/nrf/stm32u5/nrf_update.c"] sources += ["embed/io/nrf/crc8.c"] paths += ["embed/io/nrf/inc"] + features_available.append("nrf") + defines += [("USE_NRF", "1")] sources += [ "vendor/stm32u5xx_hal_driver/Src/stm32u5xx_hal_uart.c", "vendor/stm32u5xx_hal_driver/Src/stm32u5xx_hal_uart_ex.c", diff --git a/core/site_scons/models/T3W1/trezor_t3w1_revC.py b/core/site_scons/models/T3W1/trezor_t3w1_revC.py index 050fb65b43..1e286915d0 100644 --- a/core/site_scons/models/T3W1/trezor_t3w1_revC.py +++ b/core/site_scons/models/T3W1/trezor_t3w1_revC.py @@ -109,8 +109,11 @@ def configure( defines += [("USE_BLE", "1")] sources += ["embed/io/nrf/stm32u5/nrf.c"] sources += ["embed/io/nrf/stm32u5/nrf_test.c"] + sources += ["embed/io/nrf/stm32u5/nrf_update.c"] sources += ["embed/io/nrf/crc8.c"] paths += ["embed/io/nrf/inc"] + features_available.append("nrf") + defines += [("USE_NRF", "1")] sources += [ "vendor/stm32u5xx_hal_driver/Src/stm32u5xx_hal_uart.c", "vendor/stm32u5xx_hal_driver/Src/stm32u5xx_hal_uart_ex.c", diff --git a/core/site_scons/models/stm32f4_common.py b/core/site_scons/models/stm32f4_common.py index cd8291fc51..8b79b2af02 100644 --- a/core/site_scons/models/stm32f4_common.py +++ b/core/site_scons/models/stm32f4_common.py @@ -71,6 +71,7 @@ def stm32f4_common_files(env, defines, sources, paths): "embed/sec/secret/stm32f4/secret.c", "embed/sec/time_estimate/stm32/time_estimate.c", "embed/sys/dbg/stm32/dbg_printf.c", + "embed/sys/irq/stm32/irq.c", "embed/sys/linker/linker_utils.c", "embed/sys/mpu/stm32f4/mpu.c", "embed/sys/pvd/stm32/pvd.c", diff --git a/core/site_scons/models/stm32u5_common.py b/core/site_scons/models/stm32u5_common.py index 654939cee0..a781f57470 100644 --- a/core/site_scons/models/stm32u5_common.py +++ b/core/site_scons/models/stm32u5_common.py @@ -91,6 +91,7 @@ def stm32u5_common_files(env, features_wanted, defines, sources, paths): "embed/sec/secure_aes/stm32u5/secure_aes_unpriv.c", "embed/sec/time_estimate/stm32/time_estimate.c", "embed/sys/dbg/stm32/dbg_printf.c", + "embed/sys/irq/stm32/irq.c", "embed/sys/linker/linker_utils.c", "embed/sys/mpu/stm32u5/mpu.c", "embed/sys/pvd/stm32/pvd.c", diff --git a/core/site_scons/models/unix_common.py b/core/site_scons/models/unix_common.py index 0e90958195..7c0f9c7373 100644 --- a/core/site_scons/models/unix_common.py +++ b/core/site_scons/models/unix_common.py @@ -18,6 +18,7 @@ def unix_common_files(env, defines, sources, paths): "embed/sec/rng/inc", "embed/sec/monoctr/inc", "embed/sec/secret/inc", + "embed/sys/irq/inc", "embed/sys/mpu/inc", "embed/sys/startup/inc", "embed/sys/task/inc", diff --git a/core/site_scons/tools.py b/core/site_scons/tools.py index d389c9d9d1..49e4afa491 100644 --- a/core/site_scons/tools.py +++ b/core/site_scons/tools.py @@ -118,12 +118,27 @@ def embed_compressed_binary(obj_program, env, section, target_, file, build, sym def embed_raw_binary(obj_program, env, section, target_, file): + + def redefine_sym(suffix): + src = ( + "_binary_" + + file.replace("/", "_").replace(".", "_").replace("-", "_") + + "_" + + suffix + ) + dest = f"{section}_{suffix}" + return f" --redefine-sym {src}={dest}" + obj_program.extend( env.Command( target=target_, source=file, action="$OBJCOPY -I binary -O elf32-littlearm -B arm" - f" --rename-section .data=.{section}" + " $SOURCE $TARGET", + f" --rename-section .data=.{section}" + + redefine_sym("start") + + redefine_sym("end") + + redefine_sym("size") + + " $SOURCE $TARGET", ) )