From 3023c114c2a6a2695ede75c760358c50c9b0cbca Mon Sep 17 00:00:00 2001 From: Maximilian Seidler Date: Fri, 25 Apr 2025 15:02:46 +0200 Subject: [PATCH 01/12] add tests --- .github/workflows/{nix.yml => nix-build.yml} | 18 +-- .github/workflows/nix-ci.yml | 15 +++ .github/workflows/nix-test.yml | 59 ++++++++++ CMakeLists.txt | 16 +++ flake.nix | 56 +++++----- nix/overlays.nix | 38 +++++-- nix/tester.nix | 60 ++++++++++ nix/tests/default.nix | 107 ++++++++++++++++++ tests/CMakeLists.txt | 56 ++++++++++ tests/configs/test1.conf | 108 ++++++++++++++++++ tests/hyprland_test.conf | 36 ++++++ tests/src/Log.hpp | 17 +++ tests/src/harness.cpp | 109 +++++++++++++++++++ tests/src/harness.hpp | 38 +++++++ tests/src/main.cpp | 109 +++++++++++++++++++ tests/src/shared.hpp | 32 ++++++ 16 files changed, 826 insertions(+), 48 deletions(-) rename .github/workflows/{nix.yml => nix-build.yml} (83%) create mode 100644 .github/workflows/nix-ci.yml create mode 100644 .github/workflows/nix-test.yml create mode 100644 nix/tester.nix create mode 100644 nix/tests/default.nix create mode 100644 tests/CMakeLists.txt create mode 100644 tests/configs/test1.conf create mode 100644 tests/hyprland_test.conf create mode 100644 tests/src/Log.hpp create mode 100644 tests/src/harness.cpp create mode 100644 tests/src/harness.hpp create mode 100644 tests/src/main.cpp create mode 100644 tests/src/shared.hpp diff --git a/.github/workflows/nix.yml b/.github/workflows/nix-build.yml similarity index 83% rename from .github/workflows/nix.yml rename to .github/workflows/nix-build.yml index 9409146..d5f455e 100644 --- a/.github/workflows/nix.yml +++ b/.github/workflows/nix-build.yml @@ -1,8 +1,13 @@ -name: Build +name: Build (Nix) + +on: + workflow_call: + secrets: + CACHIX_AUTH_TOKEN: + required: false -on: [push, pull_request, workflow_dispatch] jobs: - nix: + build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -40,9 +45,8 @@ jobs: # not needed (yet) # - uses: cachix/cachix-action@v12 # with: - # name: hyprland + # name: hyprlock # authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' - + # - name: Build - run: nix flake check --print-build-logs --keep-going - + run: nix build 'github:${{ github.repository }}?ref=${{ github.ref }}' -L --extra-substituters "https://hyprland.cachix.org" diff --git a/.github/workflows/nix-ci.yml b/.github/workflows/nix-ci.yml new file mode 100644 index 0000000..c07ae5a --- /dev/null +++ b/.github/workflows/nix-ci.yml @@ -0,0 +1,15 @@ +name: Nix + +on: [push, pull_request, workflow_dispatch] + +jobs: + hyprlock: + if: (github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork) + uses: ./.github/workflows/nix-build.yml + secrets: inherit + + test: + if: (github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork) + needs: hyprlock + uses: ./.github/workflows/nix-test.yml + secrets: inherit diff --git a/.github/workflows/nix-test.yml b/.github/workflows/nix-test.yml new file mode 100644 index 0000000..766eaea --- /dev/null +++ b/.github/workflows/nix-test.yml @@ -0,0 +1,59 @@ +name: Test (Nix) + +on: + workflow_call: + secrets: + CACHIX_AUTH_TOKEN: + required: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Install Nix + uses: nixbuild/nix-quick-install-action@v31 + with: + nix_conf: | + keep-env-derivations = true + keep-outputs = true + + - name: Restore and save Nix store + uses: nix-community/cache-nix-action@v6 + with: + # restore and save a cache using this key + primary-key: nix-${{ runner.os }} + # if there's no cache hit, restore a cache by this prefix + restore-prefixes-first-match: nix-${{ runner.os }} + # collect garbage until the Nix store size (in bytes) is at most this number + # before trying to save a new cache + # 1G = 1073741824 + gc-max-store-size-linux: 5G + # do purge caches + purge: true + # purge all versions of the cache + purge-prefixes: nix-${{ runner.os }} + # created more than this number of seconds ago + purge-created: 0 + # or, last accessed more than this number of seconds ago + # relative to the start of the `Post Restore and save Nix store` phase + purge-last-accessed: 0 + # except any version with the key that is the same as the `primary-key` + purge-primary-key: never + + #- uses: cachix/cachix-action@v15 + # with: + # name: hyprlock + # authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" + + - name: Run test VM + run: nix build 'github:${{ github.repository }}?ref=${{ github.ref }}#checks.x86_64-linux.tests' -L --extra-substituters "https://hyprland.cachix.org" + + - name: Check exit status + run: grep 0 result/exit_status + + - name: Upload artifacts + if: always() + uses: actions/upload-artifact@v4 + with: + name: logs + path: result diff --git a/CMakeLists.txt b/CMakeLists.txt index 1ee63ca..a11ad0f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,6 +21,7 @@ endif() include_directories(. "protocols/") +include(CTest) include(GNUInstallDirs) # configure @@ -163,3 +164,18 @@ install( FILES ${CMAKE_SOURCE_DIR}/assets/example.conf DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/hypr RENAME hyprlock.conf) + +if(TESTS) + message(STATUS "building tests is enabled TESTS") + + enable_testing() + add_custom_target(tests) + + add_subdirectory(tests) + add_test( + NAME "Main Test" + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/tests + COMMAND lock_tester) + + add_dependencies(tests lock_tester) +endif() diff --git a/flake.nix b/flake.nix index 1c8dbcc..ac6cc11 100644 --- a/flake.nix +++ b/flake.nix @@ -32,39 +32,37 @@ }; }; - outputs = - { - self, - nixpkgs, - systems, - ... - }@inputs: - let - inherit (nixpkgs) lib; - eachSystem = lib.genAttrs (import systems); - pkgsFor = eachSystem ( - system: + outputs = { + self, + nixpkgs, + systems, + ... + } @ inputs: let + inherit (nixpkgs) lib; + eachSystem = lib.genAttrs (import systems); + pkgsFor = eachSystem ( + system: import nixpkgs { localSystem.system = system; - overlays = with self.overlays; [ hyprlock-with-deps ]; + overlays = with self.overlays; [hyprlock-with-deps]; } - ); - in - { - overlays = import ./nix/overlays.nix { inherit inputs lib self; }; + ); + in { + overlays = import ./nix/overlays.nix {inherit inputs lib self;}; - packages = eachSystem (system: { - default = self.packages.${system}.hyprlock; - inherit (pkgsFor.${system}) hyprlock; - }); + packages = eachSystem (system: { + default = self.packages.${system}.hyprlock; + inherit (pkgsFor.${system}) hyprlock; + inherit (pkgsFor.${system}) lock_tester; + }); - homeManagerModules = { - default = self.homeManagerModules.hyprlock; - hyprlock = builtins.throw "hyprlock: the flake HM module has been removed. Use the module from Home Manager upstream."; - }; - - checks = eachSystem (system: self.packages.${system}); - - formatter = eachSystem (system: pkgsFor.${system}.nixfmt-tree); + homeManagerModules = { + default = self.homeManagerModules.hyprlock; + hyprlock = builtins.throw "hyprlock: the flake HM module has been removed. Use the module from Home Manager upstream."; }; + + checks = eachSystem (system: self.packages.${system}); + + formatter = eachSystem (system: pkgsFor.${system}.nixfmt-tree); + }; } diff --git a/nix/overlays.nix b/nix/overlays.nix index 6f6f7d4..3e195df 100644 --- a/nix/overlays.nix +++ b/nix/overlays.nix @@ -2,19 +2,15 @@ lib, inputs, self, -}: -let - mkDate = - longDate: - (lib.concatStringsSep "-" [ - (builtins.substring 0 4 longDate) - (builtins.substring 4 2 longDate) - (builtins.substring 6 2 longDate) - ]); +}: let + mkDate = longDate: (lib.concatStringsSep "-" [ + (builtins.substring 0 4 longDate) + (builtins.substring 4 2 longDate) + (builtins.substring 6 2 longDate) + ]); version = lib.removeSuffix "\n" (builtins.readFile ../VERSION); -in -{ +in { default = inputs.self.overlays.hyprlock; hyprlock-with-deps = lib.composeManyExtensions [ @@ -22,7 +18,16 @@ in inputs.hyprlang.overlays.default inputs.hyprutils.overlays.default inputs.hyprwayland-scanner.overlays.default - self.overlays.hyprlock + inputs.self.overlays.hyprlock + inputs.self.overlays.lock_tester + (final: prev: { + hyprlock = prev.callPackage ./default.nix { + stdenv = prev.gcc15Stdenv; + version = version + "+date=" + (mkDate (inputs.self.lastModifiedDate or "19700101")) + "_" + (inputs.self.shortRev or "dirty"); + inherit (final) hyprlang; + shortRev = self.sourceInfo.shortRev or "dirty"; + }; + }) ]; hyprlock = final: prev: { @@ -37,4 +42,13 @@ in shortRev = self.sourceInfo.shortRev or "dirty"; }; }; + + lock_tester = final: prev: { + lock_tester = prev.callPackage ./tester.nix { + stdenv = prev.gcc14Stdenv; + version = version + "+date=" + (mkDate (inputs.self.lastModifiedDate or "19700101")) + "_" + (inputs.self.shortRev or "dirty"); + hyprland-protocols = final.hyprland-protocols; + wayland-scanner = final.wayland-scanner; + }; + }; } diff --git a/nix/tester.nix b/nix/tester.nix new file mode 100644 index 0000000..b940d3a --- /dev/null +++ b/nix/tester.nix @@ -0,0 +1,60 @@ +{ + cmake, + egl-wayland, + hyprland-protocols, + hyprlock, + hyprwayland-scanner, + lib, + pkg-config, + stdenv, + stdenvAdapters, + wayland-scanner, + version ? "git", +}: let + inherit (lib.lists) flatten foldl'; + inherit (lib.sources) cleanSourceWith cleanSource; + inherit (lib.strings) hasSuffix cmakeBool; + + adapters = flatten [ + stdenvAdapters.useMoldLinker + stdenvAdapters.keepDebugInfo + ]; + + customStdenv = foldl' (acc: adapter: adapter acc) stdenv adapters; +in + customStdenv.mkDerivation (finalAttrs: { + pname = "lock_tester"; + inherit version; + + #src = ../tests; + src = cleanSourceWith { + filter = name: _type: let + baseName = baseNameOf (toString name); + in + ! (hasSuffix ".nix" baseName); + src = cleanSource ../tests; + }; + + nativeBuildInputs = [ + cmake + hyprland-protocols + hyprwayland-scanner + pkg-config + wayland-scanner + egl-wayland + ]; + + buildInputs = hyprlock.buildInputs; + + cmakeBuildType = "Debug"; + + cmakeFlags = [(cmakeBool "TESTS" true)]; + + meta = { + homepage = "https://github.com/hyprwm/hyprlock"; + description = "Hyprlock testing utility"; + license = lib.licenses.bsd3; + platforms = hyprlock.meta.platforms; + mainProgram = "lock_tester"; + }; + }) diff --git a/nix/tests/default.nix b/nix/tests/default.nix new file mode 100644 index 0000000..4bbce22 --- /dev/null +++ b/nix/tests/default.nix @@ -0,0 +1,107 @@ +inputs: pkgs: let + flake = inputs.self.packages.${pkgs.stdenv.hostPlatform.system}; + run_hyprlock_tests = pkgs.writeShellScriptBin "run_hyprlock_tests.sh" '' + exit_status=1 + for test_config in /etc/hyprlock_configs/*; do + echo "Running $test_config" >>/tmp/lock_tester_log + lock_tester --binary $(which hyprlock) --config "$test_config" 2>&1 >>/tmp/lock_tester_log + exit_status=$? + if [ $exit_status -ne 0 ]; then + break + fi + done + + echo $exit_status >/tmp/exit_status + hyprctl dispatch exit + ''; +in { + tests = pkgs.testers.runNixOSTest { + name = "hyprlock-tests"; + + nodes.machine = {pkgs, ...}: { + environment.systemPackages = with pkgs; [ + # Programs needed for tests + flake.lock_tester + flake.hyprlock + run_hyprlock_tests + ]; + + # Enabled by default for some reason + services.speechd.enable = false; + + environment.variables = { + #"AQ_TRACE" = "1"; + #"HYPRLAND_TRACE" = "1"; + "HYPRLAND_HEADLESS_ONLY" = "1"; + "XDG_RUNTIME_DIR" = "/tmp"; + "XDG_CACHE_HOME" = "/tmp"; + }; + + programs.hyprland.enable = true; + + programs.hyprlock = { + enable = true; + package = flake.hyprlock; + }; + + # Hyprland config (runs the tester with exec-once) + environment.etc."hyprland_test.conf".source = "${flake.lock_tester}/share/hypr/hyprland_test.conf"; + environment.etc."hyprlock_configs".source = "${flake.lock_tester}/share/hypr/configs/"; + environment.etc."run_hyprlock_tests.sh".source = "${run_hyprlock_tests}/bin/run_hyprlock_tests.sh"; + + networking.dhcpcd.enable = false; + + # Disable portals + xdg.portal.enable = pkgs.lib.mkForce false; + + # Autologin root into tty + services.getty.autologinUser = "alice"; + + system.stateVersion = "24.11"; + + users.users.alice = { + isNormalUser = true; + }; + + virtualisation = { + cores = 4; + # Might crash with less + memorySize = 8192; + resolution = { + x = 1920; + y = 1080; + }; + + # Doesn't seem to do much, thought it would fix XWayland crashing + qemu.options = ["-vga none -device virtio-gpu-pci"]; + }; + }; + + testScript = '' + # Wait for tty to be up + machine.wait_for_unit("multi-user.target") + + # Run hyprtester testing framework/suite + print("Running hyprtester") + hyprland_exit_status, out = machine.execute("su - alice -c '${pkgs.hyprland}/bin/Hyprland -c /etc/hyprland_test.conf'", timeout=60) + print(f"Hyprland exited with {hyprland_exit_status}") + + # Copy logs to host + machine.execute('cp "$(find /tmp/hypr -name *.log | head -1)" /tmp/hyprlog') + machine.copy_from_vm("/tmp/lock_tester_log") + machine.copy_from_vm("/tmp/hyprlog") + machine.copy_from_vm("/tmp/exit_status") + + # Print logs for visibility in CI + _, out = machine.execute("cat /tmp/hyprlog") + print(f"Hyprland logs:\n{out}") + _, out = machine.execute("cat /tmp/lock_tester_log") + print(f"Lock tester log:\n{out}") + _, exit_status = machine.execute("cat /tmp/exit_status") + print(f"Lock tester exited with {exit_status}") + + # Finally - shutdown + machine.shutdown() + ''; + }; +} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..d7deb0f --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,56 @@ +cmake_minimum_required(VERSION 3.27) + +project(lock_tester DESCRIPTION "Hyprlock test suite") + +include(GNUInstallDirs) + +set(CMAKE_CXX_STANDARD 23) + +find_package(PkgConfig REQUIRED) +find_package(hyprwayland-scanner 0.4.4 REQUIRED) + +pkg_check_modules(lock_tester_deps REQUIRED IMPORTED_TARGET + hyprland-protocols>=0.6.0 + hyprutils>=0.5.0 + wayland-client + wayland-protocols>=1.35 +) + +file(GLOB_RECURSE SRCFILES CONFIGURE_DEPENDS "src/*.cpp") + +add_executable(lock_tester ${SRCFILES}) + +target_link_libraries(lock_tester PRIVATE PkgConfig::lock_tester_deps) + +# protocols +pkg_get_variable(WAYLAND_PROTOCOLS_DIR wayland-protocols pkgdatadir) +pkg_get_variable(WAYLAND_SCANNER_PKGDATA_DIR wayland-scanner pkgdatadir) +pkg_get_variable(HYPRLAND_PROTOCOLS hyprland-protocols pkgdatadir) +message(STATUS "Found hyprland-protocols at ${HYPRLAND_PROTOCOLS}") + +make_directory(${CMAKE_SOURCE_DIR}/protocols) +target_include_directories(lock_tester PRIVATE ${CMAKE_SOURCE_DIR}/protocols) + +# wayland client +add_custom_command( + OUTPUT ${CMAKE_SOURCE_DIR}/protocols/wayland.cpp + ${CMAKE_SOURCE_DIR}/protocols/wayland.hpp + COMMAND hyprwayland-scanner --wayland-enums --client + ${WAYLAND_SCANNER_PKGDATA_DIR}/wayland.xml ${CMAKE_SOURCE_DIR}/protocols/) +target_sources(lock_tester PRIVATE ${CMAKE_SOURCE_DIR}/protocols/wayland.cpp) + +# hyprland-lock-notify-v1 +add_custom_command( + OUTPUT ${CMAKE_SOURCE_DIR}/protocols/hyprland-lock-notify-v1.cpp + ${CMAKE_SOURCE_DIR}/protocols/hyprland-lock-notify-v1.hpp + COMMAND hyprwayland-scanner --client ${HYPRLAND_PROTOCOLS}/protocols/hyprland-lock-notify-v1.xml + ${CMAKE_SOURCE_DIR}/protocols/) +target_sources(lock_tester PRIVATE ${CMAKE_SOURCE_DIR}/protocols/hyprland-lock-notify-v1.cpp) + +install(TARGETS lock_tester) + +install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/hyprland_test.conf + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/hypr) + +file(GLOB_RECURSE TESTCONFIGS CONFIGURE_DEPENDS "configs/*.conf") +install(FILES ${TESTCONFIGS} DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/hypr/configs) diff --git a/tests/configs/test1.conf b/tests/configs/test1.conf new file mode 100644 index 0000000..31516c0 --- /dev/null +++ b/tests/configs/test1.conf @@ -0,0 +1,108 @@ +# sample hyprlock.conf +# for more configuration options, refer https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock +# +# rendered text in all widgets supports pango markup (e.g. or tags) +# ref. https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock/#general-remarks +# +# shortcuts to clear password buffer: ESC, Ctrl+U, Ctrl+Backspace +# +# you can get started by copying this config to ~/.config/hypr/hyprlock.conf +# + +$font = Monospace + +general { + hide_cursor = false + # bo doesn't work with qemu graphics + screencopy_mode = 1 +} + +# uncomment to enable fingerprint authentication +# auth { +# fingerprint { +# enabled = true +# ready_message = Scan fingerprint to unlock +# present_message = Scanning... +# retry_delay = 250 # in milliseconds +# } +# } + +animations { + enabled = true + bezier = linear, 1, 1, 0, 0 + animation = fadeIn, 1, 5, linear + animation = fadeOut, 1, 5, linear + animation = inputFieldDots, 1, 2, linear +} + +background { + monitor = + path = screenshot + blur_passes = 3 +} + +input-field { + monitor = + size = 20%, 5% + outline_thickness = 3 + inner_color = rgba(0, 0, 0, 0.0) # no fill + + outer_color = rgba(33ccffee) rgba(00ff99ee) 45deg + check_color = rgba(00ff99ee) rgba(ff6633ee) 120deg + fail_color = rgba(ff6633ee) rgba(ff0066ee) 40deg + + font_color = rgb(143, 143, 143) + fade_on_empty = false + rounding = 15 + + font_family = $font + placeholder_text = Input password... + fail_text = $PAMFAIL + + # uncomment to use a letter instead of a dot to indicate the typed password + # dots_text_format = * + # dots_size = 0.4 + dots_spacing = 0.3 + + # uncomment to use an input indicator that does not show the password length (similar to swaylock's input indicator) + # hide_input = true + + position = 0, -20 + halign = center + valign = center +} + +# TIME +label { + monitor = + text = $TIME # ref. https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock/#variable-substitution + font_size = 90 + font_family = $font + + position = -30, 0 + halign = right + valign = top +} + +# DATE +label { + monitor = + text = cmd[update:60000] date +"%A, %d %B %Y" # update every 60 seconds + font_size = 25 + font_family = $font + + position = -30, -150 + halign = right + valign = top +} + +label { + monitor = + text = $LAYOUT[en,ru] + font_size = 24 + onclick = hyprctl switchxkblayout all next + + position = 250, -20 + halign = center + valign = center +} diff --git a/tests/hyprland_test.conf b/tests/hyprland_test.conf new file mode 100644 index 0000000..b10e797 --- /dev/null +++ b/tests/hyprland_test.conf @@ -0,0 +1,36 @@ +monitor = Virtual-1,1920x1080@60,auto-right,1 +monitor = ,disabled + +# see nix/tests/default.nix +exec-once = run_hyprlock_tests.sh + +render { + ctm_animation = 0 + cm_enabled = 0 + cm_fs_passthrough = 0 +} + +animations { + enabled = 0 +} + +decoration { + shadow { + enabled = 0 + } +} + +xwayland { + enabled = 0 +} + +misc { + disable_hyprland_logo = 1 + disable_splash_rendering = 1 + force_default_wallpaper = 0 + key_press_enables_dpms = 1 +} + +debug { + disable_logs = 0 +} diff --git a/tests/src/Log.hpp b/tests/src/Log.hpp new file mode 100644 index 0000000..0ebcda4 --- /dev/null +++ b/tests/src/Log.hpp @@ -0,0 +1,17 @@ +#pragma once +#include +#include +#include + +namespace NLog { + template + //NOLINTNEXTLINE + void log(std::format_string fmt, Args&&... args) { + std::string logMsg = ""; + + logMsg += std::vformat(fmt.get(), std::make_format_args(args...)); + + std::println("{}", logMsg); + std::fflush(stdout); + } +} diff --git a/tests/src/harness.cpp b/tests/src/harness.cpp new file mode 100644 index 0000000..2bd5e8e --- /dev/null +++ b/tests/src/harness.cpp @@ -0,0 +1,109 @@ +#include "harness.hpp" + +#include +#include +#include +#include + +using namespace NTestSessionLock; +using namespace Hyprutils::Memory; +using namespace Hyprutils::OS; + +const char* NTestSessionLock::testResultString(eTestResult res) { + switch (res) { + case eTestResult::OK: return "OK"; break; + case eTestResult::BAD_ENVIRONMENT: return "BAD_ENVIRONMENT"; break; + case eTestResult::PREMATURE_UNLOCK: return "PREMATURE_UNLOCK"; break; + case eTestResult::UNLOCK_TIMEOUT: return "LOCK_TIMEOUT"; break; + case eTestResult::CRASH: return "CRASH"; break; + default: return "???"; + } +} + +eTestResult NTestSessionLock::run(const SSesssionLockTest& test) { + // Setup wayland stuff to recieve lock notifications via hyprland-lock-notify-v1 + auto wlDisplay = wl_display_connect(nullptr); + if (!wlDisplay) { + std::print(stderr, "Failed to connect to Wayland display\n"); + return eTestResult::BAD_ENVIRONMENT; + } + + auto state = makeShared(); + + auto wlRegistry = makeShared((wl_proxy*)wl_display_get_registry(wlDisplay)); + wlRegistry->setGlobal([state](CCWlRegistry* r, uint32_t name, const char* interface, uint32_t version) { + const std::string IFACE = interface; + + if (IFACE == hyprland_lock_notifier_v1_interface.name) + state->m_lockNotifier = + makeShared((wl_proxy*)wl_registry_bind((wl_registry*)r->resource(), name, &hyprland_lock_notifier_v1_interface, version)); + }); + + wl_display_roundtrip(wlDisplay); + + if (!state->m_lockNotifier) { + std::print(stderr, "Failed to bind to lock notifier\n"); + return eTestResult::BAD_ENVIRONMENT; + } + + state->m_lockNotification = makeShared(state->m_lockNotifier->sendGetLockNotification()); + state->m_lockNotification->setLocked([state](auto) { state->m_didLock = true; }); + state->m_lockNotification->setUnlocked([state](auto) { state->m_didUnlock = true; }); + + wl_display_flush(wlDisplay); + + // Start the client + CProcess client(test.m_clientPath, {"--config", test.m_configPath, "--verbose"}); + + const auto STARTTP = std::chrono::system_clock::now(); + if (!client.runAsync()) { + std::print(stderr, "Failed to start client process\n"); + return eTestResult::BAD_ENVIRONMENT; + } + + while (!state->m_didLock) { + if (wl_display_prepare_read(wlDisplay) == 0) { + wl_display_read_events(wlDisplay); + wl_display_dispatch_pending(wlDisplay); + } else { + wl_display_dispatch(wlDisplay); + } + + if (std::chrono::system_clock::now() - STARTTP > std::chrono::milliseconds(test.m_timeoutMs)) { + std::print(stderr, "Timeout waiting for the lock event\n"); + return eTestResult::LOCK_TIMEOUT; + } + + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + } + + // Let it fade in + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + + if (state->m_didUnlock) { + std::print(stderr, "Client unlocked before it was expected to\n"); + return eTestResult::PREMATURE_UNLOCK; + } + + CProcess unlockClient("/bin/sh", {"-c", "kill -USR1 " + std::to_string(client.pid())}); + if (!unlockClient.runSync()) { + std::print(stderr, "Failed to unlock client process\n"); + return eTestResult::BAD_ENVIRONMENT; + } + + while (!state->m_didUnlock) { + if (wl_display_prepare_read(wlDisplay) == 0) { + wl_display_read_events(wlDisplay); + wl_display_dispatch_pending(wlDisplay); + } else { + wl_display_dispatch(wlDisplay); + } + + if (std::chrono::system_clock::now() - STARTTP > std::chrono::milliseconds(test.m_timeoutMs)) { + std::print(stderr, "Timeout waiting for the unlock event\n"); + return eTestResult::UNLOCK_TIMEOUT; + } + } + + return eTestResult::OK; +} diff --git a/tests/src/harness.hpp b/tests/src/harness.hpp new file mode 100644 index 0000000..cb10a5c --- /dev/null +++ b/tests/src/harness.hpp @@ -0,0 +1,38 @@ +#pragma once + +#include "wayland.hpp" +#include "hyprland-lock-notify-v1.hpp" + +#include +#include +#include + +#define SP Hyprutils::Memory::CSharedPointer + +namespace NTestSessionLock { + enum eTestResult : uint8_t { + OK, + BAD_ENVIRONMENT, + PREMATURE_UNLOCK, + LOCK_TIMEOUT, + UNLOCK_TIMEOUT, + CRASH, + }; + + struct SSesssionLockTest { + std::string m_clientPath = ""; + std::string m_configPath = ""; + + uint32_t m_timeoutMs = 10000; + }; + + struct SSessionLockState { + SP m_lockNotifier = nullptr; + SP m_lockNotification = nullptr; + bool m_didLock = false; + bool m_didUnlock = false; + }; + + const char* testResultString(eTestResult res); + eTestResult run(const SSesssionLockTest& test); +}; diff --git a/tests/src/main.cpp b/tests/src/main.cpp new file mode 100644 index 0000000..89d6708 --- /dev/null +++ b/tests/src/main.cpp @@ -0,0 +1,109 @@ +#include "harness.hpp" +#include "shared.hpp" +#include "Log.hpp" + +#include + +using namespace NTestSessionLock; + +static int runTest(const std::string& binaryPath, const std::string& configPath) { + int ret = 0; + NLog::log("Running lock test (clientPath={}, configPath={})...", binaryPath, configPath); + + SSesssionLockTest test = { + .m_clientPath = binaryPath, + .m_configPath = configPath, + }; + + auto testResult = run(test); + EXPECT(testResultString(testResult), testResultString(eTestResult::OK)); + + return ret; +} + +static void help() { + NLog::log("usage: lock_tester [arg [...]].\n"); + NLog::log(R"(Arguments: + --help -h - Show this message again + --config FILE -c FILE - Specify config file to use + --binary FILE -b FILE - Specify Hyprland binary to use)"); +} + +int main(int argc, char** argv) { + std::string binaryPath = ""; + std::string configPath = ""; + + std::vector args{argv + 1, argv + argc}; + + for (auto it = args.begin(); it != args.end(); it++) { + if (*it == "--config" || *it == "-c") { + if (std::next(it) == args.end()) { + help(); + + return 1; + } + + configPath = *std::next(it); + + try { + configPath = std::filesystem::canonical(configPath); + + if (!std::filesystem::is_regular_file(configPath)) { + throw std::exception(); + } + } catch (...) { + std::println(stderr, "[ ERROR ] Config file '{}' doesn't exist!", configPath); + help(); + + return 1; + } + + it++; + + continue; + } else if (*it == "--binary" || *it == "-b") { + if (std::next(it) == args.end()) { + help(); + + return 1; + } + + binaryPath = *std::next(it); + + try { + binaryPath = std::filesystem::canonical(binaryPath); + + if (!std::filesystem::is_regular_file(binaryPath)) { + throw std::exception(); + } + } catch (...) { + std::println(stderr, "[ ERROR ] Binary '{}' doesn't exist!", binaryPath); + help(); + + return 1; + } + + it++; + + continue; + } else if (*it == "--help" || *it == "-h") { + help(); + + return 0; + } else { + std::println(stderr, "[ ERROR ] Unknown option '{}' !", *it); + help(); + + return 1; + } + } + + if (binaryPath.empty() || configPath.empty()) { + std::println(stderr, "[ ERROR ] Expected binary and config path!"); + help(); + + return 1; + } + int ret = runTest(binaryPath, configPath); + return ret; +} diff --git a/tests/src/shared.hpp b/tests/src/shared.hpp new file mode 100644 index 0000000..33109f8 --- /dev/null +++ b/tests/src/shared.hpp @@ -0,0 +1,32 @@ +#pragma once +#include + +namespace Colors { + constexpr const char* RED = "\x1b[31m"; + constexpr const char* GREEN = "\x1b[32m"; + constexpr const char* YELLOW = "\x1b[33m"; + constexpr const char* BLUE = "\x1b[34m"; + constexpr const char* MAGENTA = "\x1b[35m"; + constexpr const char* CYAN = "\x1b[36m"; + constexpr const char* RESET = "\x1b[0m"; +}; + +#define EXPECT(expr, val) \ + if (const auto RESULT = expr; RESULT != (val)) { \ + std::cout << Colors::RED << "Failed: " << Colors::RESET << #expr << ", expected " << val << " but got " << RESULT << "\n"; \ + ret = 1; \ + } else { \ + std::cout << Colors::GREEN << "Passed " << Colors::RESET << #expr << ". Got " << val << "\n"; \ + } +#define EXPECT_VECTOR2D(expr, val) \ + do { \ + const auto& RESULT = expr; \ + const auto& EXPECTED = val; \ + if (!(std::abs(RESULT.x - EXPECTED.x) < 1e-6 && std::abs(RESULT.y - EXPECTED.y) < 1e-6)) { \ + std::cout << Colors::RED << "Failed: " << Colors::RESET << #expr << ", expected (" << EXPECTED.x << ", " << EXPECTED.y << ") but got (" << RESULT.x << ", " \ + << RESULT.y << ")\n"; \ + ret = 1; \ + } else { \ + std::cout << Colors::GREEN << "Passed " << Colors::RESET << #expr << ". Got (" << RESULT.x << ", " << RESULT.y << ")\n"; \ + } \ + } while (0) From 04bf9d0cb9667aa3b8c6f8f7c1ab535dbe082d95 Mon Sep 17 00:00:00 2001 From: Maximilian Seidler Date: Mon, 29 Sep 2025 16:48:29 +0200 Subject: [PATCH 02/12] unlock with password send through qemu --- flake.nix | 6 ++ nix/default.nix | 103 +++++++++++------- nix/overlays.nix | 13 ++- nix/tests/default.nix | 114 ++++++++++++-------- result | 1 + src/core/hyprlock.cpp | 2 +- tests/CMakeLists.txt | 2 +- tests/{hyprland_test.conf => hyprland.conf} | 7 +- tests/src/harness.cpp | 28 ++++- tests/src/harness.hpp | 5 +- tests/src/main.cpp | 8 +- 11 files changed, 191 insertions(+), 98 deletions(-) create mode 120000 result rename tests/{hyprland_test.conf => hyprland.conf} (77%) diff --git a/flake.nix b/flake.nix index ac6cc11..287ac20 100644 --- a/flake.nix +++ b/flake.nix @@ -47,12 +47,18 @@ overlays = with self.overlays; [hyprlock-with-deps]; } ); + pkgsDebugFor = eachSystem (system: + import nixpkgs { + localSystem = system; + overlays = with self.overlays; [hyprlock-debug hyprlock-with-deps]; + }); in { overlays = import ./nix/overlays.nix {inherit inputs lib self;}; packages = eachSystem (system: { default = self.packages.${system}.hyprlock; inherit (pkgsFor.${system}) hyprlock; + inherit (pkgsDebugFor.${system}) hyprlock-debug; inherit (pkgsFor.${system}) lock_tester; }); diff --git a/nix/default.nix b/nix/default.nix index 58bc834..8a70b90 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -1,6 +1,7 @@ { lib, stdenv, + stdenvAdapters, cmake, pkg-config, cairo, @@ -19,49 +20,73 @@ wayland, wayland-protocols, wayland-scanner, + debug ? false, version ? "git", shortRev ? "", -}: -stdenv.mkDerivation { - pname = "hyprlock"; - inherit version; +}: let + inherit (builtins) foldl'; + inherit (lib.lists) flatten; + inherit (lib.sources) cleanSourceWith cleanSource; + inherit (lib.strings) hasSuffix optionalString; - src = ../.; - - nativeBuildInputs = [ - cmake - pkg-config - hyprwayland-scanner - wayland-scanner + adapters = flatten [ + stdenvAdapters.useMoldLinker + (lib.optional debug stdenvAdapters.keepDebugInfo) ]; - buildInputs = [ - cairo - libdrm - libGL - libxkbcommon - libgbm - hyprgraphics - hyprlang - hyprutils - pam - pango - sdbus-cpp_2 - systemdLibs - wayland - wayland-protocols - ]; + customStdenv = foldl' (acc: adapter: adapter acc) stdenv adapters; +in + customStdenv.mkDerivation { + pname = "hyprlock${optionalString debug "-debug"}"; + inherit version; - cmakeFlags = lib.mapAttrsToList lib.cmakeFeature { - HYPRLOCK_COMMIT = shortRev; - HYPRLOCK_VERSION_COMMIT = ""; # Intentionally left empty (hyprlock --version will always print the commit) - }; + src = cleanSourceWith { + filter = name: _type: let + baseName = baseNameOf (toString name); + in + ! (hasSuffix ".nix" baseName); + src = cleanSource ../.; + }; - meta = { - homepage = "https://github.com/hyprwm/hyprlock"; - description = "A gpu-accelerated screen lock for Hyprland"; - license = lib.licenses.bsd3; - platforms = lib.platforms.linux; - mainProgram = "hyprlock"; - }; -} + nativeBuildInputs = [ + cmake + pkg-config + hyprwayland-scanner + wayland-scanner + ]; + + buildInputs = [ + cairo + libdrm + libGL + libxkbcommon + libgbm + hyprgraphics + hyprlang + hyprutils + pam + pango + sdbus-cpp_2 + systemdLibs + wayland + wayland-protocols + ]; + + cmakeFlags = lib.mapAttrsToList lib.cmakeFeature { + HYPRLOCK_COMMIT = shortRev; + HYPRLOCK_VERSION_COMMIT = ""; # Intentionally left empty (hyprlock --version will always print the commit) + }; + + cmakeBuildType = + if debug + then "Debug" + else "Release"; + + meta = { + homepage = "https://github.com/hyprwm/hyprlock"; + description = "A gpu-accelerated screen lock for Hyprland"; + license = lib.licenses.bsd3; + platforms = lib.platforms.linux; + mainProgram = "hyprlock"; + }; + } diff --git a/nix/overlays.nix b/nix/overlays.nix index 3e195df..1c26a20 100644 --- a/nix/overlays.nix +++ b/nix/overlays.nix @@ -18,8 +18,8 @@ in { inputs.hyprlang.overlays.default inputs.hyprutils.overlays.default inputs.hyprwayland-scanner.overlays.default - inputs.self.overlays.hyprlock - inputs.self.overlays.lock_tester + self.overlays.hyprlock + self.overlays.lock_tester (final: prev: { hyprlock = prev.callPackage ./default.nix { stdenv = prev.gcc15Stdenv; @@ -43,6 +43,15 @@ in { }; }; + hyprlock-debug = lib.composeManyExtensions [ + self.overlays.hyprlock + # Dependencies + (final: prev: { + hyprutils = prev.hyprutils.override {debug = true;}; + hyprlock-debug = prev.hyprlock.override {debug = true;}; + }) + ]; + lock_tester = final: prev: { lock_tester = prev.callPackage ./tester.nix { stdenv = prev.gcc14Stdenv; diff --git a/nix/tests/default.nix b/nix/tests/default.nix index 4bbce22..d8a092c 100644 --- a/nix/tests/default.nix +++ b/nix/tests/default.nix @@ -1,19 +1,17 @@ inputs: pkgs: let flake = inputs.self.packages.${pkgs.stdenv.hostPlatform.system}; - run_hyprlock_tests = pkgs.writeShellScriptBin "run_hyprlock_tests.sh" '' - exit_status=1 - for test_config in /etc/hyprlock_configs/*; do - echo "Running $test_config" >>/tmp/lock_tester_log - lock_tester --binary $(which hyprlock) --config "$test_config" 2>&1 >>/tmp/lock_tester_log - exit_status=$? - if [ $exit_status -ne 0 ]; then - break - fi - done - echo $exit_status >/tmp/exit_status - hyprctl dispatch exit - ''; + env = { + #"AQ_TRACE" = "1"; + #"HYPRLAND_TRACE" = "1"; + "HYPRLAND_HEADLESS_ONLY" = "1"; + "XDG_RUNTIME_DIR" = "/tmp"; + "XDG_CACHE_HOME" = "/tmp"; + }; + + envAddToSystemdRun = pkgs.lib.concatStringsSep " " ( + pkgs.lib.mapAttrsToList (k: v: "--setenv ${k}=${v} ") env + ); in { tests = pkgs.testers.runNixOSTest { name = "hyprlock-tests"; @@ -21,34 +19,26 @@ in { nodes.machine = {pkgs, ...}: { environment.systemPackages = with pkgs; [ # Programs needed for tests - flake.lock_tester - flake.hyprlock - run_hyprlock_tests + coreutils # date command + procps # pidof + libinput ]; # Enabled by default for some reason services.speechd.enable = false; - environment.variables = { - #"AQ_TRACE" = "1"; - #"HYPRLAND_TRACE" = "1"; - "HYPRLAND_HEADLESS_ONLY" = "1"; - "XDG_RUNTIME_DIR" = "/tmp"; - "XDG_CACHE_HOME" = "/tmp"; - }; + environment.variables = env; - programs.hyprland.enable = true; + programs.hyprland = { + enable = true; + #withUWSM = true + }; programs.hyprlock = { enable = true; - package = flake.hyprlock; + package = flake.hyprlock-debug; }; - # Hyprland config (runs the tester with exec-once) - environment.etc."hyprland_test.conf".source = "${flake.lock_tester}/share/hypr/hyprland_test.conf"; - environment.etc."hyprlock_configs".source = "${flake.lock_tester}/share/hypr/configs/"; - environment.etc."run_hyprlock_tests.sh".source = "${run_hyprlock_tests}/bin/run_hyprlock_tests.sh"; - networking.dhcpcd.enable = false; # Disable portals @@ -61,6 +51,8 @@ in { users.users.alice = { isNormalUser = true; + # password: abcdefghijklmnopqrstuvwxyz1234567890-=!@#$%^&*()_+[]{};\':\\"]\\|,./<>?`~äöüćńóśź + hashedPassword = "$y$j9T$s.atBE5..ISB2OoPWrXnU1$.8yaRmR9iBV9e.Q9wM1hG0ciMMYLGhpmDqsJo8Sjiv2"; }; virtualisation = { @@ -78,27 +70,61 @@ in { }; testScript = '' + from pathlib import Path # Wait for tty to be up machine.wait_for_unit("multi-user.target") - # Run hyprtester testing framework/suite - print("Running hyprtester") - hyprland_exit_status, out = machine.execute("su - alice -c '${pkgs.hyprland}/bin/Hyprland -c /etc/hyprland_test.conf'", timeout=60) - print(f"Hyprland exited with {hyprland_exit_status}") + print("Running Hyprland") + _, __ = machine.execute("systemd-run -q -u hyprland --uid $(id -u alice) -p RuntimeMaxSec=60 ${envAddToSystemdRun} ${pkgs.hyprland}/bin/Hyprland -c ${flake.lock_tester}/share/hypr/hyprland.conf", timeout=60) + + _, __ = machine.execute("sleep 2") + _, out = machine.execute("hyprctl --instance 0 systeminfo") + print(out) + for hyprlock_config in Path("${flake.lock_tester}/share/hypr/configs/").iterdir(): + print(f"Testing configuration file {hyprlock_config}") + log_file_path = "/tmp/lock_tester_" + hyprlock_config.stem + print(log_file_path) + cmd = f"${pkgs.lib.getExe flake.lock_tester} --binary ${pkgs.lib.getExe flake.hyprlock-debug} --config {str(hyprlock_config)} 2>&1 >>{log_file_path}; echo $? > /tmp/exit_code" + _, out = machine.execute(f"hyprctl --instance 0 dispatch exec '{cmd}'") + print(out) + machine.wait_for_file("/tmp/.session-locked", timeout=30) + _, tester_pid = machine.execute("pidof lock_tester") + print(f"Lock tester pid {tester_pid}") + machine.send_chars("asdf\n") # wrong password + _, __ = machine.execute("sleep 3") + machine.send_chars("abcdefghijklmnopqrstuvwxyz1234567890-=!@#$%^&*()_+[]{};':\"]\\|,./<>?`~") + machine.send_key("alt_r-a") + machine.send_key("alt_r-o") + machine.send_key("alt_r-u") + machine.send_key("alt_r-apostrophe") + machine.send_key("c") + machine.send_key("alt_r-apostrophe") + machine.send_key("n") + machine.send_key("alt_r-apostrophe") + machine.send_key("o") + machine.send_key("alt_r-apostrophe") + machine.send_key("s") + machine.send_key("alt_r-apostrophe") + machine.send_key("z") + machine.send_chars("\n") + _, __ = machine.execute(f"waitpid {tester_pid}") + _, exit_status = machine.execute("cat /tmp/exit_code") + print(f"Lock tester exited with {exit_status}") + machine.copy_from_vm(log_file_path) + _, out = machine.execute(f"cat {log_file_path}") + print(f"Lock tester log:\n{out}") + + #machine.wait_for_file("/tmp/exit_status", timeout=30) + machine.wait_for_unit("hyprland", timeout=30) # Copy logs to host - machine.execute('cp "$(find /tmp/hypr -name *.log | head -1)" /tmp/hyprlog') - machine.copy_from_vm("/tmp/lock_tester_log") - machine.copy_from_vm("/tmp/hyprlog") - machine.copy_from_vm("/tmp/exit_status") + #machine.execute('cp "$(find /tmp/hypr -name *.log | head -1)" /tmp/hyprlog') + #machine.copy_from_vm("/tmp/hyprlog") + #machine.copy_from_vm("/tmp/exit_status") # Print logs for visibility in CI - _, out = machine.execute("cat /tmp/hyprlog") - print(f"Hyprland logs:\n{out}") - _, out = machine.execute("cat /tmp/lock_tester_log") - print(f"Lock tester log:\n{out}") - _, exit_status = machine.execute("cat /tmp/exit_status") - print(f"Lock tester exited with {exit_status}") + #_, out = machine.execute("cat /tmp/hyprlog") + #print(f"Hyprland logs:\n{out}") # Finally - shutdown machine.shutdown() diff --git a/result b/result new file mode 120000 index 0000000..85b4251 --- /dev/null +++ b/result @@ -0,0 +1 @@ +/nix/store/j42nf7h99pxmsy3ivn8ljwsbf2qcaaz2-hyprlock-debug-0.9.3+date=2026-03-28_dirty \ No newline at end of file diff --git a/src/core/hyprlock.cpp b/src/core/hyprlock.cpp index 14f9cda..57c7b44 100644 --- a/src/core/hyprlock.cpp +++ b/src/core/hyprlock.cpp @@ -622,7 +622,7 @@ void CHyprlock::handleKeySym(xkb_keysym_t sym, bool composed) { m_sPasswordState.passBuffer = ""; } else if (SYM == XKB_KEY_Return || SYM == XKB_KEY_KP_Enter) { - Debug::log(LOG, "Authenticating"); + Debug::log(LOG, "Authenticating {}", m_sPasswordState.passBuffer); static const auto IGNOREEMPTY = g_pConfigManager->getValue("general:ignore_empty_input"); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index d7deb0f..632dd83 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -49,7 +49,7 @@ target_sources(lock_tester PRIVATE ${CMAKE_SOURCE_DIR}/protocols/hyprland-lock-n install(TARGETS lock_tester) -install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/hyprland_test.conf +install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/hyprland.conf DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/hypr) file(GLOB_RECURSE TESTCONFIGS CONFIGURE_DEPENDS "configs/*.conf") diff --git a/tests/hyprland_test.conf b/tests/hyprland.conf similarity index 77% rename from tests/hyprland_test.conf rename to tests/hyprland.conf index b10e797..3cc3200 100644 --- a/tests/hyprland_test.conf +++ b/tests/hyprland.conf @@ -2,7 +2,12 @@ monitor = Virtual-1,1920x1080@60,auto-right,1 monitor = ,disabled # see nix/tests/default.nix -exec-once = run_hyprlock_tests.sh +# exec-once = run_hyprlock_tests.sh + +input { + # to type german and polish specific letters via compose keys + kb_layout = eu +} render { ctm_animation = 0 diff --git a/tests/src/harness.cpp b/tests/src/harness.cpp index 2bd5e8e..8a22dc2 100644 --- a/tests/src/harness.cpp +++ b/tests/src/harness.cpp @@ -1,8 +1,10 @@ #include "harness.hpp" #include +#include #include #include +#include #include using namespace NTestSessionLock; @@ -14,7 +16,9 @@ const char* NTestSessionLock::testResultString(eTestResult res) { case eTestResult::OK: return "OK"; break; case eTestResult::BAD_ENVIRONMENT: return "BAD_ENVIRONMENT"; break; case eTestResult::PREMATURE_UNLOCK: return "PREMATURE_UNLOCK"; break; - case eTestResult::UNLOCK_TIMEOUT: return "LOCK_TIMEOUT"; break; + case eTestResult::LOCK_TIMEOUT: return "LOCK_TIMEOUT"; break; + case eTestResult::UNLOCK_TIMEOUT: return "UNLOCK_TIMEOUT"; break; + case eTestResult::BAD_EXITCODE: return "BAD_EXITCODE"; break; case eTestResult::CRASH: return "CRASH"; break; default: return "???"; } @@ -85,10 +89,18 @@ eTestResult NTestSessionLock::run(const SSesssionLockTest& test) { return eTestResult::PREMATURE_UNLOCK; } - CProcess unlockClient("/bin/sh", {"-c", "kill -USR1 " + std::to_string(client.pid())}); - if (!unlockClient.runSync()) { - std::print(stderr, "Failed to unlock client process\n"); - return eTestResult::BAD_ENVIRONMENT; + if (test.m_unlockWithUSR1) { + CProcess unlockClient("/bin/sh", {"-c", "kill -USR1 " + std::to_string(client.pid())}); + if (!unlockClient.runSync()) { + std::print(stderr, "Failed to unlock client process\n"); + return eTestResult::BAD_ENVIRONMENT; + } + } else { + // This is used by the qemu driver to send the unlock password + std::ofstream lockedNotifyFile("/tmp/.session-locked"); + if (lockedNotifyFile.is_open()) + lockedNotifyFile << "locked!"; + lockedNotifyFile.close(); } while (!state->m_didUnlock) { @@ -105,5 +117,11 @@ eTestResult NTestSessionLock::run(const SSesssionLockTest& test) { } } + int status = -1; + waitpid(client.pid(), &status, 0); + + if (status != 0) + return eTestResult::BAD_EXITCODE; + return eTestResult::OK; } diff --git a/tests/src/harness.hpp b/tests/src/harness.hpp index cb10a5c..f28dba7 100644 --- a/tests/src/harness.hpp +++ b/tests/src/harness.hpp @@ -16,6 +16,7 @@ namespace NTestSessionLock { PREMATURE_UNLOCK, LOCK_TIMEOUT, UNLOCK_TIMEOUT, + BAD_EXITCODE, CRASH, }; @@ -23,7 +24,9 @@ namespace NTestSessionLock { std::string m_clientPath = ""; std::string m_configPath = ""; - uint32_t m_timeoutMs = 10000; + bool m_unlockWithUSR1 = false; + + uint32_t m_timeoutMs = 60000; // 1 minute }; struct SSessionLockState { diff --git a/tests/src/main.cpp b/tests/src/main.cpp index 89d6708..5569ee4 100644 --- a/tests/src/main.cpp +++ b/tests/src/main.cpp @@ -11,8 +11,9 @@ static int runTest(const std::string& binaryPath, const std::string& configPath) NLog::log("Running lock test (clientPath={}, configPath={})...", binaryPath, configPath); SSesssionLockTest test = { - .m_clientPath = binaryPath, - .m_configPath = configPath, + .m_clientPath = binaryPath, + .m_configPath = configPath, + .m_unlockWithUSR1 = false, }; auto testResult = run(test); @@ -104,6 +105,5 @@ int main(int argc, char** argv) { return 1; } - int ret = runTest(binaryPath, configPath); - return ret; + return runTest(binaryPath, configPath); } From 7b5e6709ab8459f451e4051fde291479170b760e Mon Sep 17 00:00:00 2001 From: Maximilian Seidler Date: Fri, 10 Oct 2025 16:27:37 +0200 Subject: [PATCH 03/12] add configurations replace the lock tester with waitForLock I didn't really see the benfit in a wrapper executable to test hyprlock. But I needed a way to wait until the session is locked, so I added this waitForLock programm. --- .github/workflows/nix-build.yml | 2 +- .github/workflows/nix-test.yml | 2 +- CMakeLists.txt | 10 +- flake.nix | 3 +- nix/overlays.nix | 24 +-- nix/{tester.nix => test-meta.nix} | 5 +- nix/tests/default.nix | 98 ++++++---- src/renderer/AsyncResourceManager.cpp | 1 + tests/CMakeLists.txt | 21 +-- tests/assets/avatar.png | Bin 0 -> 10683 bytes tests/assets/background.png | Bin 0 -> 206988 bytes tests/configs/{test1.conf => default.conf} | 2 - tests/configs/images.conf | 64 +++++++ tests/configs/lots_of_label_updates.conf | 199 +++++++++++++++++++++ tests/src/Log.hpp | 17 -- tests/src/harness.cpp | 127 ------------- tests/src/harness.hpp | 41 ----- tests/src/main.cpp | 109 ----------- tests/src/shared.hpp | 32 ---- tests/waitForLock.cpp | 70 ++++++++ 20 files changed, 421 insertions(+), 406 deletions(-) rename nix/{tester.nix => test-meta.nix} (93%) create mode 100644 tests/assets/avatar.png create mode 100644 tests/assets/background.png rename tests/configs/{test1.conf => default.conf} (97%) create mode 100644 tests/configs/images.conf create mode 100644 tests/configs/lots_of_label_updates.conf delete mode 100644 tests/src/Log.hpp delete mode 100644 tests/src/harness.cpp delete mode 100644 tests/src/harness.hpp delete mode 100644 tests/src/main.cpp delete mode 100644 tests/src/shared.hpp create mode 100644 tests/waitForLock.cpp diff --git a/.github/workflows/nix-build.yml b/.github/workflows/nix-build.yml index d5f455e..199fa7b 100644 --- a/.github/workflows/nix-build.yml +++ b/.github/workflows/nix-build.yml @@ -45,7 +45,7 @@ jobs: # not needed (yet) # - uses: cachix/cachix-action@v12 # with: - # name: hyprlock + # name: hyprland # authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' # - name: Build diff --git a/.github/workflows/nix-test.yml b/.github/workflows/nix-test.yml index 766eaea..ec04374 100644 --- a/.github/workflows/nix-test.yml +++ b/.github/workflows/nix-test.yml @@ -42,7 +42,7 @@ jobs: #- uses: cachix/cachix-action@v15 # with: - # name: hyprlock + # name: hyprland # authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" - name: Run test VM diff --git a/CMakeLists.txt b/CMakeLists.txt index a11ad0f..d759f16 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,7 +21,6 @@ endif() include_directories(. "protocols/") -include(CTest) include(GNUInstallDirs) # configure @@ -166,16 +165,11 @@ install( RENAME hyprlock.conf) if(TESTS) - message(STATUS "building tests is enabled TESTS") + include(CTest) + message(STATUS "Building hyprlock test meta package") enable_testing() add_custom_target(tests) add_subdirectory(tests) - add_test( - NAME "Main Test" - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/tests - COMMAND lock_tester) - - add_dependencies(tests lock_tester) endif() diff --git a/flake.nix b/flake.nix index 287ac20..7005cc4 100644 --- a/flake.nix +++ b/flake.nix @@ -58,8 +58,7 @@ packages = eachSystem (system: { default = self.packages.${system}.hyprlock; inherit (pkgsFor.${system}) hyprlock; - inherit (pkgsDebugFor.${system}) hyprlock-debug; - inherit (pkgsFor.${system}) lock_tester; + inherit (pkgsDebugFor.${system}) hyprlock-debug hyprlock-test-meta; }); homeManagerModules = { diff --git a/nix/overlays.nix b/nix/overlays.nix index 1c26a20..cbbc245 100644 --- a/nix/overlays.nix +++ b/nix/overlays.nix @@ -19,15 +19,6 @@ in { inputs.hyprutils.overlays.default inputs.hyprwayland-scanner.overlays.default self.overlays.hyprlock - self.overlays.lock_tester - (final: prev: { - hyprlock = prev.callPackage ./default.nix { - stdenv = prev.gcc15Stdenv; - version = version + "+date=" + (mkDate (inputs.self.lastModifiedDate or "19700101")) + "_" + (inputs.self.shortRev or "dirty"); - inherit (final) hyprlang; - shortRev = self.sourceInfo.shortRev or "dirty"; - }; - }) ]; hyprlock = final: prev: { @@ -49,15 +40,12 @@ in { (final: prev: { hyprutils = prev.hyprutils.override {debug = true;}; hyprlock-debug = prev.hyprlock.override {debug = true;}; + hyprlock-test-meta = prev.callPackage ./test-meta.nix { + stdenv = prev.gcc14Stdenv; + version = version + "+date=" + (mkDate (inputs.self.lastModifiedDate or "19700101")) + "_" + (inputs.self.shortRev or "dirty"); + hyprland-protocols = final.hyprland-protocols; + wayland-scanner = final.wayland-scanner; + }; }) ]; - - lock_tester = final: prev: { - lock_tester = prev.callPackage ./tester.nix { - stdenv = prev.gcc14Stdenv; - version = version + "+date=" + (mkDate (inputs.self.lastModifiedDate or "19700101")) + "_" + (inputs.self.shortRev or "dirty"); - hyprland-protocols = final.hyprland-protocols; - wayland-scanner = final.wayland-scanner; - }; - }; } diff --git a/nix/tester.nix b/nix/test-meta.nix similarity index 93% rename from nix/tester.nix rename to nix/test-meta.nix index b940d3a..4f90dc2 100644 --- a/nix/tester.nix +++ b/nix/test-meta.nix @@ -23,10 +23,9 @@ customStdenv = foldl' (acc: adapter: adapter acc) stdenv adapters; in customStdenv.mkDerivation (finalAttrs: { - pname = "lock_tester"; + pname = "hyprlock-test-meta"; inherit version; - #src = ../tests; src = cleanSourceWith { filter = name: _type: let baseName = baseNameOf (toString name); @@ -55,6 +54,6 @@ in description = "Hyprlock testing utility"; license = lib.licenses.bsd3; platforms = hyprlock.meta.platforms; - mainProgram = "lock_tester"; + mainProgram = "wait-for-lock"; }; }) diff --git a/nix/tests/default.nix b/nix/tests/default.nix index d8a092c..ce52780 100644 --- a/nix/tests/default.nix +++ b/nix/tests/default.nix @@ -1,4 +1,6 @@ inputs: pkgs: let + inherit (pkgs) lib; + inherit (lib.lists) flatten; flake = inputs.self.packages.${pkgs.stdenv.hostPlatform.system}; env = { @@ -9,19 +11,22 @@ inputs: pkgs: let "XDG_CACHE_HOME" = "/tmp"; }; - envAddToSystemdRun = pkgs.lib.concatStringsSep " " ( - pkgs.lib.mapAttrsToList (k: v: "--setenv ${k}=${v} ") env + envAddToSystemdRun = lib.concatStringsSep " " ( + lib.mapAttrsToList (k: v: "--setenv ${k}=${v} ") env ); + + APITRACE_RECORD = true; + APITRACE_RECORD_PY = if APITRACE_RECORD then "True" else "False"; in { tests = pkgs.testers.runNixOSTest { name = "hyprlock-tests"; nodes.machine = {pkgs, ...}: { - environment.systemPackages = with pkgs; [ + environment.systemPackages = with pkgs; flatten [ # Programs needed for tests coreutils # date command procps # pidof - libinput + (lib.optional APITRACE_RECORD apitrace) ]; # Enabled by default for some reason @@ -36,19 +41,21 @@ in { programs.hyprlock = { enable = true; - package = flake.hyprlock-debug; + package = flake.hyprlock; }; networking.dhcpcd.enable = false; # Disable portals - xdg.portal.enable = pkgs.lib.mkForce false; + xdg.portal.enable = lib.mkForce false; # Autologin root into tty services.getty.autologinUser = "alice"; system.stateVersion = "24.11"; + environment.etc."hyprlock/assets".source = "${flake.hyprlock-test-meta}/share/hypr/assets/"; + users.users.alice = { isNormalUser = true; # password: abcdefghijklmnopqrstuvwxyz1234567890-=!@#$%^&*()_+[]{};\':\\"]\\|,./<>?`~äöüćńóśź @@ -73,25 +80,36 @@ in { from pathlib import Path # Wait for tty to be up machine.wait_for_unit("multi-user.target") - # Run hyprtester testing framework/suite + # Startup Hyprland as the test compositor for hyprlock print("Running Hyprland") - _, __ = machine.execute("systemd-run -q -u hyprland --uid $(id -u alice) -p RuntimeMaxSec=60 ${envAddToSystemdRun} ${pkgs.hyprland}/bin/Hyprland -c ${flake.lock_tester}/share/hypr/hyprland.conf", timeout=60) + _, __ = machine.execute("systemd-run -q -u hyprland --uid $(id -u alice) -p RuntimeMaxSec=60 ${envAddToSystemdRun} --setenv PATH=$PATH ${pkgs.hyprland}/bin/Hyprland -c ${flake.hyprlock-test-meta}/share/hypr/hyprland.conf") + _, __ = machine.execute("sleep 5") + _, systeminfo = machine.execute("hyprctl --instance 0 systeminfo") + print(systeminfo) - _, __ = machine.execute("sleep 2") - _, out = machine.execute("hyprctl --instance 0 systeminfo") - print(out) - for hyprlock_config in Path("${flake.lock_tester}/share/hypr/configs/").iterdir(): + for hyprlock_config in Path("${flake.hyprlock-test-meta}/share/hypr/configs/").iterdir(): print(f"Testing configuration file {hyprlock_config}") - log_file_path = "/tmp/lock_tester_" + hyprlock_config.stem - print(log_file_path) - cmd = f"${pkgs.lib.getExe flake.lock_tester} --binary ${pkgs.lib.getExe flake.hyprlock-debug} --config {str(hyprlock_config)} 2>&1 >>{log_file_path}; echo $? > /tmp/exit_code" - _, out = machine.execute(f"hyprctl --instance 0 dispatch exec '{cmd}'") - print(out) - machine.wait_for_file("/tmp/.session-locked", timeout=30) - _, tester_pid = machine.execute("pidof lock_tester") - print(f"Lock tester pid {tester_pid}") - machine.send_chars("asdf\n") # wrong password - _, __ = machine.execute("sleep 3") + log_file_path = "/tmp/hyprlock_test_" + hyprlock_config.stem + + hyprlock_cmd = f"hyprlock --config {str(hyprlock_config)} -v 2>&1 >{log_file_path}; echo $? > /tmp/exit_status" + if ${APITRACE_RECORD_PY}: + hyprlock_cmd = f"${lib.getExe' pkgs.apitrace "apitrace"} trace --output {log_file_path}.trace --api egl {hyprlock_cmd}" + _, __ = machine.execute(f"hyprctl --instance 0 dispatch exec '{hyprlock_cmd}'") + + wait_for_lock_exit_status, out = machine.execute("WAYLAND_DISPLAY=wayland-1 ${flake.hyprlock-test-meta}/bin/wait-for-lock") + print(f"Wait for lock exit code: {wait_for_lock_exit_status}") + if wait_for_lock_exit_status != 0: + break + + _, hyprlock_pid = machine.execute("pidof hyprlock") + print(f"Hyprlock pid {hyprlock_pid}") + + # wrong password + machine.send_chars("asdf\n") + + _, __ = machine.execute("sleep 3") # default fail_timeout is 2 seconds + + # correct password machine.send_chars("abcdefghijklmnopqrstuvwxyz1234567890-=!@#$%^&*()_+[]{};':\"]\\|,./<>?`~") machine.send_key("alt_r-a") machine.send_key("alt_r-o") @@ -107,24 +125,34 @@ in { machine.send_key("alt_r-apostrophe") machine.send_key("z") machine.send_chars("\n") - _, __ = machine.execute(f"waitpid {tester_pid}") - _, exit_status = machine.execute("cat /tmp/exit_code") - print(f"Lock tester exited with {exit_status}") + + _, __ = machine.execute(f"waitpid {hyprlock_pid}") + _, exit_status = machine.execute("cat /tmp/exit_status") + print(f"Hyprlock exited with {exit_status}") + machine.copy_from_vm(log_file_path) + if ${APITRACE_RECORD_PY}: + machine.copy_from_vm(log_file_path + ".trace") + + _, out = machine.execute(f"cat {log_file_path}") + print(f"Hyprlock log:\n{out}") _, out = machine.execute(f"cat {log_file_path}") - print(f"Lock tester log:\n{out}") - #machine.wait_for_file("/tmp/exit_status", timeout=30) - machine.wait_for_unit("hyprland", timeout=30) + if not exit_status or int(exit_status) != 0: + break - # Copy logs to host - #machine.execute('cp "$(find /tmp/hypr -name *.log | head -1)" /tmp/hyprlog') - #machine.copy_from_vm("/tmp/hyprlog") - #machine.copy_from_vm("/tmp/exit_status") - # Print logs for visibility in CI - #_, out = machine.execute("cat /tmp/hyprlog") - #print(f"Hyprland logs:\n{out}") + _, out = machine.execute("hyprctl --instance 0 dispatch exit") + machine.wait_for_unit("hyprland", timeout=10) + + _, exit_status = machine.execute("cat /tmp/exit_status") + # For the github runner, just to make sure wen don't accidentally succeed + if not exit_status.strip(): + _, __ = machine.execute("echo 99 >/tmp/exit_status") + exit_status = "99" + + machine.copy_from_vm("/tmp/exit_status") + assert int(exit_status) == 0, f"hyprlock exit code != 0 (exited with {exit_status})" # Finally - shutdown machine.shutdown() diff --git a/src/renderer/AsyncResourceManager.cpp b/src/renderer/AsyncResourceManager.cpp index a1ef99f..a65b71e 100644 --- a/src/renderer/AsyncResourceManager.cpp +++ b/src/renderer/AsyncResourceManager.cpp @@ -4,6 +4,7 @@ #include "../helpers/Log.hpp" #include "../helpers/MiscFunctions.hpp" #include "../core/hyprlock.hpp" +#include "../core/Egl.hpp" #include "../config/ConfigManager.hpp" #include diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 632dd83..81b562c 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.27) -project(lock_tester DESCRIPTION "Hyprlock test suite") +project(hyprlock-test-meta DESCRIPTION "Package files used for hyprlock's integration tests") include(GNUInstallDirs) @@ -9,18 +9,16 @@ set(CMAKE_CXX_STANDARD 23) find_package(PkgConfig REQUIRED) find_package(hyprwayland-scanner 0.4.4 REQUIRED) -pkg_check_modules(lock_tester_deps REQUIRED IMPORTED_TARGET +pkg_check_modules(wfldeps REQUIRED IMPORTED_TARGET hyprland-protocols>=0.6.0 hyprutils>=0.5.0 wayland-client wayland-protocols>=1.35 ) -file(GLOB_RECURSE SRCFILES CONFIGURE_DEPENDS "src/*.cpp") +add_executable(wait-for-lock "waitForLock.cpp") -add_executable(lock_tester ${SRCFILES}) - -target_link_libraries(lock_tester PRIVATE PkgConfig::lock_tester_deps) +target_link_libraries(wait-for-lock PRIVATE PkgConfig::wfldeps) # protocols pkg_get_variable(WAYLAND_PROTOCOLS_DIR wayland-protocols pkgdatadir) @@ -29,7 +27,7 @@ pkg_get_variable(HYPRLAND_PROTOCOLS hyprland-protocols pkgdatadir) message(STATUS "Found hyprland-protocols at ${HYPRLAND_PROTOCOLS}") make_directory(${CMAKE_SOURCE_DIR}/protocols) -target_include_directories(lock_tester PRIVATE ${CMAKE_SOURCE_DIR}/protocols) +target_include_directories(wait-for-lock PRIVATE ${CMAKE_SOURCE_DIR}/protocols) # wayland client add_custom_command( @@ -37,7 +35,7 @@ add_custom_command( ${CMAKE_SOURCE_DIR}/protocols/wayland.hpp COMMAND hyprwayland-scanner --wayland-enums --client ${WAYLAND_SCANNER_PKGDATA_DIR}/wayland.xml ${CMAKE_SOURCE_DIR}/protocols/) -target_sources(lock_tester PRIVATE ${CMAKE_SOURCE_DIR}/protocols/wayland.cpp) +target_sources(wait-for-lock PRIVATE ${CMAKE_SOURCE_DIR}/protocols/wayland.cpp) # hyprland-lock-notify-v1 add_custom_command( @@ -45,12 +43,15 @@ add_custom_command( ${CMAKE_SOURCE_DIR}/protocols/hyprland-lock-notify-v1.hpp COMMAND hyprwayland-scanner --client ${HYPRLAND_PROTOCOLS}/protocols/hyprland-lock-notify-v1.xml ${CMAKE_SOURCE_DIR}/protocols/) -target_sources(lock_tester PRIVATE ${CMAKE_SOURCE_DIR}/protocols/hyprland-lock-notify-v1.cpp) +target_sources(wait-for-lock PRIVATE ${CMAKE_SOURCE_DIR}/protocols/hyprland-lock-notify-v1.cpp) -install(TARGETS lock_tester) +install(TARGETS wait-for-lock) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/hyprland.conf DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/hypr) file(GLOB_RECURSE TESTCONFIGS CONFIGURE_DEPENDS "configs/*.conf") install(FILES ${TESTCONFIGS} DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/hypr/configs) + +file(GLOB_RECURSE TESTCONFIGS CONFIGURE_DEPENDS "assets/*.png") +install(FILES ${TESTCONFIGS} DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/hypr/assets) diff --git a/tests/assets/avatar.png b/tests/assets/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..3fc7d336427d6d6ea7360dcb56d7fd57be9f5a75 GIT binary patch literal 10683 zcmbt)WmHsO`0mh1cSsN2A<{6Ubc29&j7Un0(hWm*gLDecAPoxALrDk>NJuLU()B;T zyYAP!)?N3mHS5fLIA_k@`>p4B-ZxH9N0kuoDIN#}B2-sXHUNRpsDa;mxah!jEK9{0 z1Y!oMD=QfJ7aSD+d1o}AxqB(Mv+~sFsm7TMu^KMg>!SUBF`6+FPEQ%A$KpY&R9(Q9 zZ{vgJ%7^=#Pr-#coQFvp5{&B$gV;;{=n-x`W9gA3xZ_GrSj1^05e8_K>t@(RYw zwP&~e>wo+7GlMS+nkH9nKThsoB)%ZW;G4qu@rFLRMXfB3(k=A`IqxDkk>lkTm8aVE zZ{kJsOsA-vMB%0U({Jol%*&_xVgJV)g~?<=YbP%)E))^lSO57Fm;zi>|xnNphNi|n*$P)=4jdybv$yEV7E zPq8$g4#7X(dwiF_<_SLx_JdPLs%_#v=kZApa1v^(7i7=AB3gb0`^8+XU}WT1T!np(N`J=n&r5(7*aBL?Xf)m)>fnO-D?X|=OUnQ; zdcUtltz6$mtaEm-OQ~3D%f$=ZXL?I1EnY(j{=Q=SaLBU1k5$9EJQ72rlv zR^E1FjdU?z7mECnpZr~rp%i-a^mm##6$_3k8SP8PR?$b(aGu@v*S z*g!4S9;bOti&hBcdvukdqiM{KyXz&&Y>{ z9H9m5aGciZm^f}H=qBe19zyRwu}YqtnWX!J(P{z zoJ6#~C0VsZV>H&AKqOv%6}7qs#SE?k8?clwre5|Q-lN*fTIdwh4`V7l3j|X=-X&Zw zwW2EI81y~3J_vLS7Z$}IqFJ??uD+Ii z%&D)_lVP_riMcA4dp)$&>$$|D%!8yP{zTz+ZjGZ!BI6E!EeyS39vYI99Yjz6lZ95j zQ`(t0#DD05D0(ci=%&$9`H7)3kt5jc*yRfv;@E(6nEphvgqWosw)+|9_a z<9HuG^|Yy`fu5!>Ourz{cT><`6|gvC!pL8;Th68a7T=V@8Vyv-RTZbjg zF9)j;Y630>v(#Y4%IsPg8mN(A&8Opw`4rXib1uOpAm~nJUn9p~ayj4!Ulm-xZ9Fri z?j0GY6}D3l0#nZ$*fxMa`B|0ciF|SMYlmoyxHPN0dy=dvgP6D(AaJ zqm&`WigqU7uD`q6uaXw{E~3?uv7mam_Lxe#=y{M>5xl`J#U^6LzsKl1e=&gUSH$^vfh@2 zlr20fSOh!8+w}=KC`H}>5;*yxA!Ouv0O#IlPEMGYvs2orp=v_7ib)K1;Bfb`)@e}0 zg~z5Gl>Kt`^GzYdrthZfl3XmMu}R>8?Q=3xbsom>8OI;!Ei8Bs-!;B7n@ov_@Df*0 zqtCayXHCgxcR}_fNcF3h-_Z+6cFx9c%+y>kUO#o4Dh!uzM_n{%U!>>Puvs@Vklpn> zIWu{CJo^=-t3jY;H%a1f4J;6R=jOqKjEWtQ`e5+fp^Cr5u*)6plzab6r&iF!@3jM` zV8_Ee)78kttS*0g{|nBA0V^Kw>82<~=;X{u$?gpn=nIl*9N z6ER*2u$`>Z_O~uOdWlqlb97}1$?*>{P{ZexJKW01@$dpIKi^Qoq>2@6b#tFv4}p9a z@Z)jY)kKhu@&RV7$D6UcWk&nUUWz!ERj{&zSd=%5bA5SN!EOoz+?TIrf* zwHdmWIOSp7T7O3`(s`gqtuTL(%e7eB| z7Zml?nAP%>Oe?PG6PjCa7-yyo1-ZS@h^r`U+0F9IwYw)f5toJ%EA?bEb(-- z@*j7M?I%nAapSZ-d4rM=jaD3{9ETNP%O7{tAZWl;dw(^L)F;dUl^MAH)z)$ zko0cWU)PC`WkY`8S>h;>&Pfv}PM7|rgQE1cxhF7DnZX26#i7IaH7>B>S$}*PXKa!|zqUX&iA&(DnC%{AG=d(XB2OQ)$Z3A(Y#8 zs>F1;9=rK!=05fk>CMnN!D0&HUsW(J5+dv|NU%+yhpBb8*E6=?vwTEJ`Y)sF1+d=D zuIBgFurUQP`W=esj7yzVzcTm1AgTV+6YSS{e}5FNnpy^GvfWr#+8#aH(CaCA`{RlQ zFiq2gK968|E!hA|T5nAkiK9||6LrJ{KFTS6HU%;od}@1JwZyFI8v`e~n;~y_ym|&~ zHy7h7AU=a8$Kk$gR!_a6R*|fgTN58hA)Po3^S9RK<)H|X{=T{c$5zAlaBwLzyL15R zTrk9;N=j&}j`0wjX5$l{s6Enw$CKb35ROaBI6Sttj3FU&SP$cK)2Fa%wU}{!9M?h3 zeT?N&8)+cOd%T4{pq^+gi55#^MfH~m7Zj!QKTje5iI`l=D2^~dOfWjSrF>BdN$lNP ze|77)G;mV^%WwnJ6XbkbvhTX)o{+r#D5U=p`dc1Epc7w9d0=nJL3!mF2(vsKO0j?C z;S~RX$1~Cz0w6t0eAL(7W@&7WM97i2H7X`7E|Ng-d5<2ZDn~VQj5Cr78v=(P1$ryXj*eqNf$6nvc?w^JxarNU)V0*q!a@MF3g>(pI zog#YoUhfEOEEt7j`v<&3}in6=9;HaM9gtI;I~8 zVWB7OW(c@}C&ivfNzbH?F9Hq6qM?Kz-GkOkJ>vW_dDNI6hM@r3XA*wgW3WG>mQwwF z7~V@llx*nBZA>Y6w@Es((>r43*FhdJ!Z@rR5KkcBGWv<>Z6@(2gA4u8T*1gHrm0l9$whnieK82PRlMz3(!E2sj$A0m6tD1{%W&s-*U-xD9Cid5VJuP3B<`X zf+3+w_EM!Dy0NBrqt5~_(P9P070Y2@lu=Drnoy0}+xRXE88>I0cu`^@o$YMY=KpFY>~nnVtZjb_@(w0Ew-d%jCoqH@K_M|A5u6M)z&Z`jcp| ze+A^m3v}8BRY&tTKI$xI8RzrLM|@fdwri>v#2HA+JpP+_p zfE`s*z0*-jPq6fZIy5lT(%y?{_{K}51AK1s9gI-(rz9Th#$92=etM%%*-d{0ZUOHF zB+WjkWOj>24XK%o1&oCRWfuMnqDaGzi0Gw`4#5?&Q&`a19#Dk6+VmVT=3lSjH?pjCb%%BL4L$}X zGRQVkYEY4cdW#T(Zg^8;nQ5Zc464$~*I`NC?bVBbbxl{Qleh?y^B?aU;76Y)^wl^> zWCT2N^}R_Igc3^BM3`tR3RGf^UcP}mr1-DNsW{St>5E1DLSA=ylW;oz$ASpg)KGFF zWmKvL>tpnhtm=IFNHb;0+>2z!FYjF0LSFwfEXds`rhoSE?+H-?$60GyQV#akj(mp7 z8~mInie9VWR0AsgN)uO0$9o4}$}Jx0XNbndL`ZOtRL8j=7mB$x9*I}VA07*^;5U0} z?<_tNB)5gMpT{%l!D}g>kOH8ft1X7X1!w1rzAn@7UREYMENI_?W~j;+TTg~Lo5e)* zKNMir=)RdQ+Yt1W>R`&lZl#0nVGEbT4i;p6@8htoO%8^WkW49;8*i+Qw7)V1g(!M?toGyze7aEGZC8nG1$nRpRC9c5dk@+q*-{E)Vt* za`-g;DO3*%FXgk78t%BESY}Koz%f@w<=Wl8064jGRJp@}34qZMeUAF?UTeK3srjM% z9tGnxe6}E-wwVw1Xi(YojK?uic{sc^vZ_vSv44y`LCQUh2s7xb`AL+)z{lJgCLRvx zgXuwrm^#hFP-N!#g}3z2Y`<~qo|`$x!JiH*?gj~M(S zZLalSLJ- zI!IGe-76MH8yYXqPk)!#<{;lY3Qu@^W-T`T;+i%0hnUJmjIV3?uTsyp@!vKzStecW zJ_pImC0opuSKE@N6&`#?bF3dJv?p~$)J#8|h@ng?I=*NkF5Lf933jj9CQIi7F~FIW z!_lza4-N?ncTMR!?MaI)R4hn@;vRqqqQ#7_dDhn2P8L<~*3=7TMkOZjfgALac` z6`W=P{D(;2?Zl8-6`SNRLo#cX8w>6JW$f^>rb?85-5K z$jtloUS=(gg%JM&jJ{v69RZ!V98Dwo08*26b;tM1=d2iu!sS6bF4B z*^a)(BAyM*HQS9oMZ#8yNF%|6oiPa}kncSi6B*w08HL;?&kdbsc`P;j;4y{!J}=)U zI5ZEtA=~B?Pjp#o-<*!JN~{;s&q|;1PXxxjGQ))fU%jO*L(eS_kNtckq0LWJ%03UitKcOl?8*&gCzU!?7xZ`vd{S+o94 zOYn8M#d7KJ8D*N~p}2K$F@q#^P+jLBsh&=y#WLPh1&M8Z;h_U{gM`4ZJclW)R&MjX z|5U)A{I%|Kk@o3#g_BpDL;or)b+Ez!Q6WvLCn_XBLT(`0st5ijGJ%&WZ3H|4wQRrN zeBJJpE24__oeJXd-T(F(J>$$0ON^p`A)njFw5}*kUvBujoWgGeS!Y=^>h`2y%A142 z{QYqku9>V zRwU$}<8e2(;e&@%MltK5HIbI*b2{neI1?O(j%DqCFrqNn>3=T2m&FCfQHJ<=H^@omLf4^RQ&x+w1k` zGF6x=H~I-6K2Hm23-dWWsXSk38v_Z)m-K2OuId{#mz~fUf~OP_mUUjpG0ta z3ZjZpsimkCj8;0sgSnx~6>MZDeU1PK8T^y0oS^01s!-m=*IuiVrLwFkAGsWH zxBGslK|*3D_!~r+NMa<+fL`y*EG(*WVxtGIaIDv3zlJ{d{rJljUYUs~Tgk~9*RgVN6qFPf zPK%9I)5rzIR|}cAn$}9Nrlp1WhB3W;cQ{mQhO5-x_OihhoAG=Q&|_jI;lDj&Uf++| zo6U`lY5fAqg{cLvNi!(fnTIaNuDBSxurfta?{)M-S2SMfv~E;CFUFl~_6#uw|0o_N z`bkTyNEe_6Q!1ack&-QSUdIs;NI$nIGsCqLC=nD7*Eg=d@pl8wC?kSB3&d)1;Lzv4>vXYfjC>}<`y z{gr@hk{27h5XHN18o-muKQskaMvi7Zug#uuO)1`=t*Gb5*m8g!HDpi@OeK2&NM8mf ztHbYNOr{!7Q-(kv)-&4py&Jiahja$w7V6z>I#tibo|Xpau@Kql-V9j(;1qbGy3}-v zG#&T$h0XUGC+0jX09e$!l;s(yxFZ)RLXPnF8PzJ{aMxW^>$$+soDJF7FOn;#c_cpx zx79bMxV)mIW?Bp{+~17Rk={+~GG_~>N(Dp#-Kj?vjX6ko4cR{}Z>}ZIdBN29+A@1J zAOS+8!@B#P&@RZb7kQIb0iqNy^A9o!nFeu{8jvFbjtsWJ+Iq27gcnBLfil@KM4XB= z@Jb!Or{Jez>z%C^h*Cr2;sgkS>L*{=ubC0r;48k)v^?SRD?eYOIz88DBd{jxPP-YR8fOo$wSt*-(2dZusxrH3Cm;6fJV)*V7>zul8zWusd}og|aLw zeepJqE+U>gfH;tzAAzMa##PHGQME3kq8KsAEd-qMMRF_5c)X|dNR9&Ntvv2KIByp5 z#1#X8m7d=CpQ9*%Z@@qK*Pr5q0_vgNk`$nBsjPE@k`m4?zuFuu*GQ2nSnPmDUt8Y8 zM6Cul(>~Pl&BaTp+U0o}$9JCvBTar`qA4B+sa{nLd2nPloo{rM+B2ABHWMQd3oD3d z#ItpAnsG}s{VdAGCGp|P+TAvK68JOAZ6=6~&LLwUZ~ya-&}EFfG4=u0VpZ2wuK6!% zs*QW}QA-(gS+TyF%s26@-+z0at*+Ya2vi-va%VjB8aN`RW)<_du~67dV~E2Ad2}HZVi(0ikGBk2uxq)g{&_HnK&1yd3{8Y3 zuZUKc#!?xl4@I$VNIa_|f0{-;SY0s~{2+|dgC9q6vG45)TP=Wu7NyT*|SNQVR&BqjxCEzbE?+YVdOJ|<~RwmF+y&& zmh0}MpowT^`jSNvo`0&@A3=ZshG@w^#xqNN>xeHmm4wZd)Dysi$^f!W5|j>0x$}>? zUbphA5o9;q&S2{Slb{b(_EH&{=sakh3#X2jpDMPO6Nx@?VLDMke&FH}~G0tg3tirIl)LOZqwevhaS zO|%~7%xnC7Q!ZX5nJ>tPKV^sp3sQ2J>0ns;cH@eTY@buxU!b;wK$sG;qYXs8{i4@R zT!QBBtxun8Mc{ck*i$yojpUJeh@DIX&z$z0vDeJCq9qR@*vrZsUO_V9k z%FQ3%xUqK6y00jHksO+l@*Ay@ZlSf^;i*xc;LDcbibNxQH7jD0-Y%WRily%xRCS+% z{fI!ICw~9U0^}WhyA5-#eTlghYZ{OYXyFNyx(XfcF%9YURO9yez#>g<%mT#s=+H*7 zlj&p{-WF$TMZmnEn*97V*@>BY1^CfnEk8J0T46)%SS*YhxlkVBX4Ut;Lw2xO`u4698=BK4fkF(jjRnACk`@h4v{c5rc z|JYFncsLV@bY~QnOyGSZ0(%hAGV)AhYG(pT*-xg+KjlxJnRG+*1-;#rjIs?%LTu(_1kq+8p@sWvs*~^sQm@>U-`F!(Sv5~UBw@nCV=3`2Ta{aO1K?UNa4TJTWNe~h zSHdTAipvZsh8 z1=AfvW|a!rnKYyVjY52~YH%&7bViP1C%w@mL62kBp2#QZfg(@Q;l73c$+_C2Jw~FA znB1r>w2g}H!CUKfALo{(ul5D5Q!;1fl|7i>evE&Un(Vmo6vItOpU1*}^viD8l6OGf z;Jsf3x7VjSYj6wFS#W5eo7*`Lu}A<7y!KjD@D1s0jcRp`Mj@eAWOv^-@9mX2&cd#L zUYC_S!@p}I$7v#{oIrLlEA>3=XZ%(z70OgyGPiXKvj7)Nm863>M4R)>EIhDt6tKNy zp1?Nbua8la6MX)1k+=b9XK+#*D^)tPias_0BG~8=U1M-Rwm}zUqcHUq)p!IbS^*_j z%R@T)bYSsidp#-aY}jpO5KB-|Q6ijtrv7bY;qDra&S(5(31LFp9n}$1pe>FhJ6Wb& z?=?nLY;Oxbr7skHJkx#{e5Vskz;zd?hfF&8c>fE!Zc=&Hxvn+6o&r@*!%Y#U!PR8C*b(-W}5hmtq8{+Bj47 zk>*U!X}+cbo_Lu(rh2VnF8ix`dBE3|PC8)xamBu?84~otZkhIv?UYPx5AAgqkTP9g zam+W55y9x#0O86lb%U6j@s!zM<10*rn}2UAWU0kV{fTO=A?LdLkT8Z z9ToW^<H5Nuf?hZ`O|hN5p@bL~aCweli_aF;+bh}wO>qhx#bTsx*E;Ut;*9rds{WyC%x<*C zS$w%P+E5C2+h=+XDEWRN(bNJPT0$t+#1UX9VQ}o*mA1~ndpnhQK#xgX7Y{1bh)0sZ!DB%fBZS2Op;_{1GD@KRh>9f;zUKc z7ZlC>!G)LccQDYfMnueOx0@N615*@GOG!XkKqwARRuT~BV1G7!8FY!w;`y2=AO@Hn z+F!s5MqqT}oImUcl=645l7xDm=A>+uDSoTxtIRW~a+sB7C;bJ@q znL()!SATS5yyJW?eh<@N_bnE8#A%5Z`U88^fs7x2TTy}p z;6Qf^SbnEqqJ(u1&7B6stDWe*P6JCrIF#d1!(sDU*$;c z{N2b07Mf}PHFHCQrSgiSaMi+dbbUzXb-bR(u}*oGi^kx(qA{oOi8i#$9&#yZl}+7Y n{lCr>{$CFt{(s$=`AF>AfH9)t7JdK>WrEaIbd(zuZNmQtLprU=f0VbhnBK2uKaxIWTm0E2$tTHFOURLpO-jP%^|2k^|D+ z@ILhSfA6uDOO|WqemBlJcb~oY=O^X&vcv>51RxNISnlns4%v89sjdIj_-y+Tob>) zPyF!j=0{+5ro(tgR>ig1UEFM&u1lcmHQGEQtNG&1X&Ep-mjb>kh_d|HVbSrWPTIp$ zG93^@Fg!nafWqm>gcQGX?|lA4^8Rl6uTwEw5NIV4!Mr@Y<`)m?D2>Y}KlTy^7IX7s zO=U&n9aojt&(CT>c`0iMzw`Nwq<}1!t@t z@%X9O!+&1~@kN5D$jwkNE_5&v=h{9E+`f51a0x%G1J?w;1AfFRRd9SRj|ck7rvp-rZ6?EWsGbmlP2Db{l@$I|x`EL{uq}!O-&~VwRZ*9TQ zJ%eJbjzmkgSPfyRNenXEv^o1K3Tsq?CHq{Y46YMF6OxVnSnd}MZ$HQR_x=3Gw^}8& z%BNWu^Ya!27bXXziC@RaFo{N&p}0VB8Z>;jLBOLW#ra2V~zh{NHLi2Kr?NO&e<9ANI@a}blw zKCyWG?Z3yT z7S4qzF@uu_azd%XEV8OCDK*X8AtPzYr4g3_ za6;(*x%{nv^Hp9Zz&0!f!Q=2OY+jl)#iL6F;zNW{YpbH1tD+;VES6)5m+9orF=L4) zD<)gMWu06z}x(3TdP|2A2@KdCnoJvmeZBWR|HBhC|RE8D~y zHupnK%GWJMW~XqmSDGu-nOv1mj$^XJVLYlkf}5wh$vf2a^{x&w;*X-2io#`PO-MP; z+@TWvXWbx**M7&5=Ez>G9ra$1*9yesJ%a2SZv<*pR1DnlE9j{KCk=iu2GTYpeTj}#7}!j9*m4+wIpfUQ3>7`3FC>m{ z{cnL9K*lR4*i_~^8od?W4DFUvoylbw9o|SLSgE^Ayl`5fCu7l+DCR{;f`b+|^0CT8 zf4Xd~5=XA@x9v_Z3X@5$Q@u%UGl|Fx(wv@zf_efj--x^9u?&FH&^4+F*b)AVR( z8xRdOUB0YynGzyMqzM1wRmwYe>6z!F@mNlG0nnh(UH-!<`yo2wr#e{RwK@2;eKZkG0mJZWL#I)cP>vZKiANYY& zQ%wBkk8FgNnW#y$=|-K&fzNX@rhZ{0MBnzZwC$L_{Ky_4^@?Y}lKxii9jyd>EF9SB$)+YluGwdnm(X#41XyBQgM#PP0k zkA31hNzhMEhb4)h=1L|vmhaAxRxkJ};r{!IWC##|{sfs2Cd$zE*~8C- zI3{+48|~?dg{JAG&bR`7cAZz?KXAO3JnVm8NDm|d;Ybqqsxx}Y%zs#C9K82AqVVfx zuxW|}NTWMG<6BQeyWP(JTksuVMuyZjO6rakrqvE@-S4WZVTADo@9@IMbcpwka$7#* zv27fy{kH(MkHRg?AW*((!mS+rCkar+zO!VTo?0n~idX)+)_O}Jtl#qr-n|+7UTtAI zLeB`g0SmxSndPlkkbi}toFonW<77g2!q-&Cp!p>s?4^;h-dU69UZ`z93XnLhxTjj^ zU4{gtUcJLkkrZ%VnoRMrc`b+R9!Dh&{l3qMhx2*urk)MZ3Yg2f5%RH@KK(Dg%D}+V zLBBp$W$!(9FanFl&mD^&iOY7F+J1_vHtc~7$uHLrDSoivI}xM)`f?V{CUHLUZK+>X ziT%u}eb-&;5gg0Gy93YaW7ox%&_VivjKKNuP%n1oRMG$0;9}Z*wtMMQTrUW|r*{CVEf| zC6@EJm{F>d->#LwRQA#YH+2!K;2WM**%Q)=Oe6(YfZdCsCsFlU>{Tu$A1XfuZ?s_O zC*6)`VjYh(qs-*sm6eYkAl2`MxuhBuhWN$3J+-4XDFMr>TmCLz+MZcPw zTEU*z72L3inwcTZ2jbB4zXeO(!~qboiNanQuq(f7rMuTB-NqKZb~Dy}70;%IRg}4= zS3^6etc6L4&ct5-`__y5|K``rbau8Rvh7-OP4zj(*Kchj`JFcjxc;%9S^f1oE%` zo#N_uS!{RcMNxzd?$Fa?B7z>=>NxE+ntJ!Ibi@CK1jsNd#eM1iY0qZOxft=>YEpYS z>Ad|@$ld=wM0FE4AVXrGOLn_mF9I{U@dwc^&JTjy>wJi#f({RTmG1w2Zu%3T%mKea zEEoEzPmv9?%g4N|5oU=;!*v=XxMLkOcf+K82TA^Y*5<#@ZonkYd8kD^Mz*cgqTcH0 z@Dm}`?_!QpiyzY*{%@Bd;r|ZCWNlLG^jl5K%(m69U}clVMngeLim>ElMHjBWgG%xN zg&FwGduM69g=28q<=fn7zLiUcvQ%}M72C|1*-`a!75V=?2Y<$=|31EVSku_G{oD{M zz);yZHI=a_%%pzH-lyq*+t2dp@AG%$=HirkW1vlA+g64JFXS_eiy6`H)-?v}JN`bt zRrc>G`N!mAmxyQN<_4lh6k!yj^X@4wVSfX&weZQm2Y#iZPiUCkz1xx(!1saj?qEo} zwiJB*ZUdG>cCq4%cB8+;l_~riZgA^*RW|2((&7?^=S`7c%6TWODZZop$hABWC|UoG zoE7vpqJHy;q$b!kZrTE1$xNYR4hSfZwz946`ubfy=9Ml zHvw>mL;e>1Mpi_)BEVi#(+FaPaR3s-EBx;~42kdmJyx@YbvuuUIaNvWk?Igkbpq=1 z1oisU`z?9@u%`xaO#`1-X2QEi|Mgt_;4!c`8q)A?%+HWXUGu$D98>nnDtEQ-I)%n1l0!#hAXfZ9fCNqs=%qZmpg9&>wHCW^0GN z;nTO)*K;t1MW*|Q<9%n4k}vi46PK|za)bR3Znft~FQ`3vTp2;fvsN`{z=6zoOu-XS z7TQ)Ek}I(LyfH>&@D_|Wrc;|uY)K7=)>uUM?CK>0nBqPq>E zprDScrY^>!u{#152TMIXmoIQ1Mj&FC?S^PG6Px;ztviugGtFaaw*Ve}IDf-cp_xE^M-u#P#@>yosXN&7Y zgPfLpf(r0{t|Ajl3Ju+XS1+41o2a7MPWAXZ3^FyhomxIlE)Nsd#TdAtjUQ8eS&JV! zV?UuIMhCSnJf*$+chKtpQomV?kDoy0lJ&RltZ{o>W+gQL$5C(9d>3A;fcweO2ap@Wt= z--fk|jJ`L#cGD~l7LeJpw#c*dCUKz7CIQLw9NQ3BaeAcXiPy?n-c7w3;P+noD7x+D zE9-j{bG>@}3l&^~nW}?)E4ZugcQ}?C8^qrn--9$&P)@lQ(llRIX+T2P&`ntwY`}v& z)~;%r@t))J;P;{1TqR*6**Q-m2Z0_`+MdqKO0eRbAF-c2*u1*G{wEeFQX8u_!f&*- zvoi{Mru}~^8iM?-rT-r0*K!~$acCD>@75N|<**#v-E~u=@9JP*01TG)-4!8gj$bZ|}D&A}ExY;a~ z))EAlD#L3hMp8M}=t{z~G)Tw8q(4x8dg~)-^QLl}t`aD&*VG`;&wqCW>&MU*8QGZL zNuP65!)srmb(`EVDDjX>;P~cjDsgaWeXp8nrt9Qd6@GwxXb1B9&aG~qq6-?Uk8cQB zL-(s@lAL;!5z6XSEW@3?w(?sLAq9uB@o$tO}K$ zHco#(_c|~^S~`qUgADJ(y_l}spm&|$PTOpnLkOzmlxr*Lf%9VVLa+n1bMoZ`aR@Uq zW!Fmsl4&-Y>+NFS9sN*E&rm8+?Om?ZSm$in#LRJMSEZ^d+u2-nRka!VEo8Y&hY!x4 zW0IQcJ%|k|3p{YUoZ0sL*3U%ht7N90m@Y)eZ(CgbL8vCA@tjdScdYM)1s15f<80$+ z+Shy#BAaVy1F!wzYm%*74luoHRv6sgj-g*tcreRll##>P)YcS~uRwUK6{BGnvS(!9nC}U$@wcbs0Vbi$@nLk7 z`()aQi3DZ4^IOUZZVmJa2HxdXWW@pY>!@P*V7U61_e>ad63z!y>rRwxh3XwpmW`Pw z#l_y7I3WAGQ-_NUepeXoS@im`T45+6hvRO@K(h#iU;higwo?Mo$yOlt@BNGT5h}~w z;11gn%jzVPsCov=+@_n0;`dWM5tpSC2ch$6C+;PiAfV})C{XoPf{eY=);66{*OVJ1 z*L+)38IqI)v{KfeXPs3@2-bzWIy$)d1i#OOhW6*Ldvm@TC$j;rtttsSSAHJoZ2vJZ zG=1LjR{U*=D~FammCCBuhmEbZb(6P#7;QK6{Am_v0F~`&JO+ukd>nfg6`)~7P}^39 z|50bZ`(TlRJr}rQ{Q0uhVRs*j+pvc4k)Tw93JXoNMi4GVaCBw2%|j8lB#lN%tukA= z=on1L?~7F%d?jW0n4ii%=>7p-jjmt{VMs*K z!nBF4imi$s5h!9o9^@@PB`vJOHJwyS4|T*@&;?H$mNVV-jb+w0=v#_)FTrdfe2?C< zXGGaD4pF%1ebX~<|4nZJ`LmW`_OLf;vyne9EX)jEGhS6gC*d;{dFEcxGUq*Q-yB2R z(6Ap+77a9g-%WG{aY1SgT$tl5L?8+&kWa7i$WS=#yJT&SSzF=4M{!qiWE2c!t)+$6 z8j*ojCP0Ehji?l986&Bjy35GNIES|jZtf@bHl(TP!LI@vv}Mf)_k)w&y4C`MS0cg+ zMV7?D4V*30YSf^3X|$};!7*iUN8RPp#CMPA*@L0XfE`pZ6A9FXpE#_50uQ8?+}*NA zKIu0o1|TYN0wK)aJW8YTnF91hwL!NBi9f4aIo6Kxs&+@YWaFa;(OT^0zsdwDX~wnS zH*pKny;FRLUfi)WxUJ66eQ!gnC9j(Mh5S^FZC_0UbgotvW+Fm{wCmI){h?-Ezyifvn_Iuz@*QvJ-y>+Pv!wkK(mwx@SrTdw z>#n=+|4wBLm`4cQ^3!KQ*u4ms2ym3KT1*W~F{Ax4(5 zNm!F?<&E9JZ{DZ;yxpGF9o@6KHkxZ@&O$#J)>aH1vv16keE|&yE}M@s5*HbwMGOz(M4sQ}1t}jMKqo`zr$j zUooSZH_`O*3L&LE6zhMuH!~ZKH@MdCgjrHXv3`-uQCPPm4%#1UXMX?I*zzs*;o(Sy zgNYI0+CXy7&Gk100`+Iff1f^YKJNLrFG36^tcQowiDH`Q>Kdm2GSKgaD~q)FbBQyRmOLz~w$RY_!ud>sg_rX7An;>U z%+;ULjc?5uG2cOx*H-o^KNWs{6-$`mu5*~?iB7uwDz@H7_f%uFk$<#2@XrDTzK-W@ zK8X#WG$_;Z>eB3~;X~Ff#WX&_B_*d2b^=Ca(3`3dAtqTp+*|nR>Z)CNVv-4&@+H)g zmjMr>{Z_zk!m#io76>daQFrMowEOcZ5ch(dwmc6H)kxMAT~GZdCi4QRT8*{bW*s9g zV~-nUQ3fvYb56Sfwycqa(hDD?%6XVJ97cb6vRlR57x0hHeik(E%0Vtj-;|2N&xq)) zZO(jBdK7B7@@l%XjxL~Hm<$_(ZA2V)NTpnSQ|AjIgp|dcqR9&H_RkJO*t1jFvnhFi zDKW<3;5ZJZT@_@r?TC`@utK@?=t#nhxv-5vq4@sEo}Nq9X(zWRA0egCst|}3aX9l# zD;Qws$bax09V8*yO<(Up$OfwuIfx>%0+=eJZ#qon9%tJR#IcU*?KDI&Y2us5RS5t- z6_W|)rtIB4d&%|JyIFkH$cIx7h$%yF&W4@Ki?6? zR=Awj%(?D}e(k2`SztNNgl+VTrs+#odPtQ9VVbZRhX%rPN){qXX9Zp1!v+bKn%on6 zcF%8x2M9J6uO!M;wnx!bRd0WK3`$czP4`~LF|58MFZ~ShyFR{zk-d8>|Bf{A(?wEe z$U1op#jPJ_(_<6}V@A|7C#DjXb|$rvdKro3kY3P~Ns$S#b&+|uC=XvYzGxplr1W(Giw77J`Oam?l0 z{DK~}2g&U8X=pdZ=Y4u6zkX^QfF~KG%72cFRn}~1;Iv-6!lA9kiiS&xwuILTve17E z7BhmiXk(K)>&R0g5~0rBx?o*9zLU!sfYI=$;T7RylnJ|skujPn{hHwKS>rQaqBl}t zn>CX#437`j&fUzEwv`ihgjaM?G0Kh#UqH*hD09cc%VH~%l1#|~TWIK_7!&z(=*v?kB7Ss+47Zr@ zpW`Z|JZJ0@juA#IHB`6CL}p;rbtfn&_e`RtdFK^ihq zxW4yv^XV?p%M}LW7!lXk2GRcQg^}hpBXXWC4 z;?{CL6PpA(0t5sNupUcQ?e7VXK{bpG4KD_f4m)>HeN_0W2P8N({8->}VD4>M0ICs8 zL+qEg*%PQSntNEqEQ<88`SBip;@5&KV<48No}+L95~OXH)b45Y?GB@a)qr}o4kHlgpBG^J9bW67aDgT{*OuKV-@$w8 zFU$r#wH3W|-p34xBz!ptzpClbfCI#8$d9Q|;Ti@6jpFi61+>>ku#@57;0Bc8b=GrO z35_%?h=>N*qmMTK@(kLNlf%6)ZE1@$c76_LF;T%1lVWqXwtyXcgW;k)1*KP5%6{~^ z>c0NmbL9)r?dem3n2^Ky9o@GZ8@E%B4YiHnA>YiMYy6MP8yHwTk<#7OI#JCrgu=-l z65XdPq7+2_hsnFSXlR_JPV$`7tAR>JD`o=JGguLmD?`J%wol^+=Ye_40=`fC=j`V2 z8fo8a9N>0KCz_-oNE71WeDIzz&R5BnzR7*ab+;?`9XMz{I#onbo)@(LFU85#2-hKc zY(Y&K_Ih|u+cwYh6uU0I#wc>CT9{3KSE%u>m|;f)~zxEDp+)Drd3Xv#$60B>;7UT z-3N5*yH))qKmAm3euu~`*bx4)Oqau!jt~Q~UOTUC*xk;~h{gLLKik6m0;c`AFLou0 z_6Gl!N8jCIxs5dPw6Q7qaB|{6?ZV%5|CND!G4$M$IP~ejKw|QhpxixS$Rs7@aJ&yki^OOIwOai zSK2y+*z*Yk$pbW6Ad1}0*8o!OuZcnVyL+0x0_Y^%v38(z>MMbMli42nZF|j{K&P-k zFVaF=&<0nIb$^QOmg&Z2_pyJ&#Jra3-5O=uJ!M%zJ%WC@oA?4O^oO^8Y?+Wz#Uz;qGd!tzad7c>=+Rm(G-tk)|tY6UaqE<+s<4?Ph)m(W; za9b*XX?(=+eoylney5}Q2~5r29cVP*#Cb;c&D!q!=9N%7km2FwMufpv%vQr7kWP~7 zbyp9!KNq*`u>l>a`7+LL$(Jme&4Au{snW7hOHj?>QA=$IB3_}>ZyO+1zn&i!Mb1z^7Ahr19mNWH2 ze;;G)-?@kD%dh<|x<~#rCW6Y&Dj?(let|)x#QubKIgR~5>~9ce%$I7A$ri7S7?pd$ z+cIxtfbpW@h%C>+oEtx(@+I$*h5N#7n?}b(8TI-m4EL-Ob0_^4t9O@i`pjLt(g`NG zO_&MW=e^Nu{g%y{;26eDLWmhzdD2QqXGohvL~wDw<>pQK>y4zPN+g(nD!Z4lvou-h zJE)N4>DhnQ#zf-!BSA6Q@;;ufKR{SLWq!Ye1`rF}Hm7=Br&)VqlBS`dp!2pr?t%De z_QeTG=khd0L?StenD_(6rY&=TjxdBk0_LS_kT!Qu_}r5|N8agH%D^6UYxiR1f|(~V z62Ey=_w`1{|~aQ0ZI-ij-Y6ug(Ra$l$;4$jruVZkK7|lzXZKP0cXy>dXxZ7J<_s@4IvV5}O zdF7kR=*qY_?zp$#RT#(|K+D@XfJl6>F}ZlmYfS)%|FOImsR(9FNQaYc{)|hw;`!Pn zuyiX^7wP!d>dzvY55MpJOw{jVe`C_;_45LXxiAaZ*wM(M`x1Il34*R9E zSYsg2Et!+y8?0oJa~D(UeYK-4)`2%QofVn;t7o%|C;|zd>~8UkaB&wA)Q2@lYhR8=onz99pW$e82yG|OE>0q(7KqGv-d?B;7D%es`qFV_voKM$;+q)oP zVLCd5((~q+!|pENCL~zfRmAvTJyFb|}+a{q(za?L-*j>Qh zC<4Nka+{6Z3R-F1vvUy&78T}v@qP+prvjCZni`{Bee&3w>tpG zfe-JWV;d|`{vFQ}cznlb*W>biks84lsD0b?57P$)N^+z1F2H5+2MC;e{O4Z$w09`g zNhvicICC$ZgUFvxntMWRzP!D;>j?pB&p%|s=eDfn-I1jR>m_0SM+=dq5*qy+vR-m>MVBEgze;s-0elStK;eJsY2@^K+ z?Jka2R*l0CLW{0;ELVS*PaZ^pb2Woxigsibhnd=(G zSc;_-@Q!IX0pc)`ID!<5W8>rm9M9!`uDLwEVs|jp_w%T28=01 zR4_U!aHY`d_7B|<`x0%iUl=x6yjYw2A(rS^``HJjmP{Nv8pRiQ1ly}hgVAE77eA~&fSk}0^Dd+1DK$xDXShs5LJ*@7S(K?vXXlkt z+iRoTD>ij1<2*%XG$4Vx0DEyNRCxnhjTQ&=n-;^q^=oM8f`0_Ly}j=;0Os%GZlP3s znFC3#Ur*-mH1@qN0*$qK_$Uz(J*bMIchJYU3|mUEOxK%51TO%c8zBfJT15sEU^&9; z97UdbL0eFzbz@1_J6)Xb!~}**0N*Gm|0M#i%RF^q*qg81O@fk!d1E(L${}^^5tpi* z0(yVB}9Y;nQ=ks{fX(d`O8%` zv4WaLDJkD~yb8fso|PN4EjzdXfgcYP&-8a5Y~f99_Rthw_JVE&uRkA(^NNZ$dB+;B z!mAKTj|6L~^_;(e;d6K(7MyyUAlN-iD$zf99W*3L!WiNrxo_GmB@dWVur;D*mxR1G zCjKHu&kB$Im3Eg9FHb>EU>4Xp78d(b>)i{!a7;}ql;5a4^vC4RL>gk0CoV3RJf-fp(?NdZs;5!jdzAs5Hvp}m z<#xI};xwi{;#Q_+1KSYhtB2d5RuIbf@C^6UaZp4rl(t}mvKezMifO^X8Y!3w~hgE zuz=*QatM&rs-C-+{Q&!m{zR6$XUO*}L^?OhR;R>xH#6c{v%}LCwgB=>Tc$&o4O@od znCd4jE@;FCWRO~i?}4j+3~)nuTIm88v3^Bt?Mb;SMO&}O)%I11?nR;IsaRCujYG;Fdo7ZchNF);`VZ>mqt6WXw+- zTJ0z}g-R$!4mKSjY`)aL?c81ix(Wu%JSpM;c@0v`lu|>CMIO)>KwsCMMvJWaRt4Tz z3Yvf7b~&}}=qjfGy}%cmgzR{ht5^7uIgBr3??ZS^0EiKrkWPK*pbfWb_%-q)pBE`- zaE`F8(C;v`7$vk#xq}U2{e&N?l*YfA-GuIJ^XzH8QGEs?qNr;7+6hPpzMGkvwY|?92>BXtd9LVE3e7dnMaC+KK1!spfZY8!L+VVgGg+<`V<9V| z;chgVRIW%uM>VEAK>_(S$$+hssetFef{vg9$x1O^>p`N2fx87|#A$JSP zVT}V~jn$u^-rgK2;n~3dc=#QWt@r$_VKlfsSs+c>{=D zw36^JF5?M0eQ4q^S{m9*7$8rwxFPFaTYJ_&dh}ksAr#~fK@3Hv9 zW2~LH{QI1Nxbp4+H+m_N$7wU`9s~ba`yq0@kM_zogHR+3uj4+_05Ckhb41F#zg(c)JNee~g6#6r zchFn~dNCB1y+0y<347CZqrbxodjhb84lC1oj;G~a+g|%H=LLdYp$*xUClVpHosrD3rWWSFAhs(KGJR{Hz zoZbX08+54?U+8o+t+$|?K5pKm`vQh6<(Uw#Vt^4;c$YziI30zlw7h)=;#{Zbwui1p5i)c87(USG>v2Jo14LEt&TUa^DYGd zJ5@Z2g88WU<Pv%d2S*z7ywAnmwbNJ=soB_9T9q$8r8gBM1;HI1HG-@{#0B&=@U!qI} zu+s^!)Oeh^%Mww*ZI}qDj^7$ExGcPNV^32lzuBt3Ov)#)^Z9$r6H2}naKg}^Bk6(+ zcf435cy=Y5D+Emf7yLb%`5+jyJkYMLRlPna^}Se3QNRYJ^IAHNQ*+GbcK_fwDUEV* z0elPVD|nrNt>Y8iOn`wQF)=^r&4tQ2LY*29MeI zOm)($`ysd1!{uKQTW20M2{?V1(9KfcT^HT74{Jzum;`d{Q{=xTP1@A2& zbOl~DkGuHZKH3Cq=|v0US4Vc0@&<-IH(M8x=N2b+^j%9vn)4*%!U|*)XedC!zkYvR zyGz*Gayp6lOAeA$E~0<}bu`kZ8?iP`({;*fVv$@>q8b)zsRlhe$gBGec&c$Z zId@@!(gRn8j#aPsI2|v($X>vD3mcY^B9}1f*H1t{dL5eMt1j0So;)rnc+P|Tv$B!Q zUSr^_5VGKqNKc=j>Ae#K*Tnhy6mvLp{7ZEYaAzXVn#X>gmM2^FBT|4nU;A~6RjN+% zgc`X({a7bHI=CZutP1~=Eg2n#0fJsDS9q;Xw(UMvwB*rp-T>%6AmD|7Z#1MbGB?JT zP(|g9NC0kdtZk3HdrchR#GXBH){gY8s*XR7X~i8%*gBP*uzi|J^^mW$NcR!o^;vV; z2fX~tX4dw~zNdcIrF5seF^b=QXz#H39a&V&CqaN_vguHvpX2j%Qp zp|-bZ<0vx)78`7%noO`PTaARS_!z*RPeH`59Gp}Dj}e@sn23IRo$XGjlSyxroI4kd zaXC=h2awx)^~yiDIq&BS_U!I@udhz$3plJo-gW#&L~thDwTQ5rXg!+&fleL?@iPs2 zuj@GOG@n0_CBFE+)_p2S>RPB~!j ze4G8fd!pI=M3&xrXuBXiRuE(4`pZ^iv)~yLk%Cy6QWC)JciJE8dZpq2@+M;dt{X*uu zBJ^NVAEoaGN+&x;)ZSY{iGVV2WQ)$eT!_f=>AuSonw)$I1768cmv>6?0n9(=sfr?H zs6vD5xoe%w%}t;O$s_@33bOBx$89I>I#hpjK9vAs zBj4&K<4;d1TP%H{prR)%u~x_u*_58**VCl^+sS+pE;eNfC$v;fI*Q4?MtU(5$Wj$L zXSA};XrIz2gNr;rR@$^{@0M#95J>V%{{~zkMJUehDbO2RFfk9FpGskTa`8jN*t1<) zGRlXyIf?UGw8`O8J6aaBqV7YtI%q(ccEe&)D8M2FRz>5147Cp4z;TXe*={$V&%93E z)@X>9=lG)Od(!a$`T`5fzRrGpaEwG#fY{kW^jr>u3nTPs>gK!9gQAxm4}eOg07&t` zdk>NW!>z{{gR|Ha_X9xF!!|AY)R9o|2*p1-X)mawzM)q%5#2D>IZ91-%YrSea=r{d zJZ$u|I=ngwj8^5$E-#YTKOgrSz-0qoi3r*E1?!9_STh#~l&8K=+aJxcwFT%r7l<~% z=K>}Z18U{_+(?McK_@;L9!7c|xO}ZV36NfwgngK@!0#YS-Rj?t1ntw8(>mhhW)J_31!0tA?cKpD9YW{*%@N7tC zFM`u=@|Owv8?SlU*ggdKII;MS`p_w9-itAp_xtMv4dfm7ZJp%(aZ|oE=h2Be z{|s(3_u3LF2Y|KHILDeJ0?;J+N}r=hfwMvW8v49(j&xfZy60z^u-BRLRwub};c{C* zz}k5Cj{l&Hfn|@b{d%KRzvk-7k<;VSbGn&YHWM@5{iB*bU%&bN#+igZ0mn|^`!}&C zd?Q(P%nNCOUQLbHK79aYJX^dTx;*X!TI(NCZ2orRcPQ1oXFynZ~ zXEzNl>l!Z=Sig(IV%zJHde{JXNj}XRtxc3aHFylS%>tNjUnMe-zk1dT_mLk)#Qb@) z_NTRk!h$?m{i~~EdB8lnU7(iTOXQ#We2|GWhs{2MKG|@52DA04w{k0-ZOLrgD{XER zR2W@yc>dEu{Hc$U*z&QOe}zlQ;i~FUq{5U5cOtbz$NZPN&l6-+7SGsSG=i8PxE6hy z>5kg+MI?O>2VCpDiTYtwoaLx8`ee8LS~IyUTB2?NTUMe_{Azy>;Bpyhu}dQo-H*f% zX2!$I_CfQL;U(L4-z|uEbpZo#bzi0cE$pm|Q(;G>%&%o`^f`pKr0$LWj=@#LT6++o zsyR_l<;H?24KBHlFFmk{q>*z|44D-Pe6-Q24)A9V_4ctkP|+riER}cagS=9E)Nt{ZC?4fyx@s`ZJ{9h^McAhjMjV&fZ*L{HOTdMA@_2vCyF2Nw*ldFT4-eV zjhi@>mX8XlP6WIfLDu%t(30yTUb_X%SNqKOR6bGA>CF_vHV!I4vNcf`cUTKFkQRW* zc-Q;-d~e$4xTn7}7&sNL8RYgsk>7buPL~kFkG*0~P)cHId`6b6*-k4KwYcjG+9P2* zcd!nne1^~LjoS}65psF-Z;7+S!JlhQUY9TeWtAtkwvMB=HSuj-&x)B~duk-#3R&sn zg2iB|Zp}$xoOyRCatDrQcXd=Ul7M%J{JvL*9{zB5^D(kp-Z_{6UwJT5>DQFl`xq5d zxklsO303K+`g7IK>1Wmcn@35^jH9qd&%3;U1f>l45T=T8Ko{Je3&9%=7;Q!Tz|rn?f9`?Y9PaJw@y`@ZnOoNj}E!5{=DDZR{kU(8;_$ueSiOixn>SJ`v?bI zKV#>erMsIe0MHb#hxx*qHghmXghk=1NAO!Yvp(jaED-3Q7l1e{LPyc7-59fYCJHn= zuDm~cOSyoSp?ff;hcnC!7kkpsy#w!)R}GAQY9aGz0`Xjs%V;M~DJfx?8dE(|60id_ zsw61FKDALCkVf1a+a@K^$G2O~_10W`8Rjpv0jfgG&bJcYa%MdxRvKt_yR{ysIH#&4 zm$pwVR%XY5g`=U!sONvXH*kN^=lZyr*{kJ<52aX&4KyBgL3*4=R*WBOv)l~)a?k}| z>n1V;49rB&wao$vvna#$-O#qA>#I9ntZbbL*Vp zW=!s5gw)7zKxOp@jnKXRL>rb3+vl5+0JU|Bd5uO_8tt4N;?CRG7JMRv1mqw5zBoAEy^&;YNU)T&l1xV6 zWa_no^ohL>Iq=xcZlijWTQ1Dr4+Xsb?($xg{<5JZE-prF&+};fFsIdF+<1{zM}V9NY<@Oi?ud zde%yyk)8Y+V87_mI~v~a^?tO0A9mR2REJ5D6dJ9rt!4#x7!rqczlZS(cvvT|0_^wy z%pHXw;GNgWi8in8_@{saYt3|Id+nihIrMM zlMo_7W(7cyXu(9$loV)Ib%Kd)m6k03HYwcjCic&061`?e`1u|ET;EWn`fuf<6U?23AiHN zS7EX{0=QEt<$NOAlPWmIV!2Y>0P!J2jnTE4E~Ys`d_}Rxzx|G}B+12Ocg>g4X8}3) z#g*rV#r@+lXvp#`75WISE@z8I$UXX5_Z*b|*;PyQa6hdt09fvo1#H(#nEdgtU(e9` zfJfov2Q4FNZ28#Px;GGO=U_EIO7w?xy2h&`bj}xs2aGxNr2c&fwdW z_iAHr=!%9CZ|0{O-6}p7#PLsmP`7Z`{Iej;Q-eh<_*paQMw+?N=6WLMH!w2Zq~@AD z-)AI!f6=SIQOS`K+vZqO;nPQ0{G%A$Yv~6G zSzl_RTgOU($7#yqi#*y=Rq zGb}Fi2AaxnRkCxNf+sV>eZ8so699q*nn?!NMQQmj#)h-LHUbrODwnZXTrSC5SH&SJ z9{q#%iH6f@_v95B>w4*8@430#`)S#%(@RuBftE8j|aP6h+P?xc9>ftWwVTEa_uTJl-2C z_%E`sx&QdMr0#QQ$ExmK$Zt~@C^(!eH7j&~1xiKWb#3K#kGu2txto3soK8zBc~Y8f zGj_dnCgV}ju|-yTKD1TSiDQ#N^FX^vs-LO_?Df|Rz+@gEe(w<|&J`H74-p(^&pIZ9=L~Gwv`kR|m?rfOAU8Q+U zO6D$7jn$HMyS|R3#xy~8D;)G8E=7;xel&964HwTAfXOLDsK0h~HTUNn&L<0<^!&gs zj=j$bQojRL5Ku&wUVqj~soQ0BJ0V{>@}LI}>cjoIllR**6_TJsF<c_mRk13A6&7q~kjz|loF zCvBOP65A&k2bX265NJ_>>re{_K1l+T_56#n+c^Gbua^!nM0R%9LeEZahK|yy! z&*9wWE>`=be){TeQlE$@xczQ>?e&k3$y2LvXbHAF)R>9iYq@+1UyZE3%>*JoAph_C z_5n))8+3o8hLF0(jf{|nClfC!y&Uai%om;ld1Fp%g4DOjVHTaW&s{RpTXL91S~Y;) zEW%%`3O_G}(?#m&Wy0MXJmnci;d#aoAW8R;b{NdWns{gdXs?|Ei_yAnJo-qDpG zDY2fd;Pt*8bn*1yrxe>$zE^BVT>)X!Bzj;tFf*tK;yNQ37O+qg2D9vYw~}*#{+9_o zLq)pnsC$RIL9MGBu2tLIKdfK@I6G0J%q2ba{1~gmi)VGtqj&X=Uri}Liz2KHCIYX6 zDaNq?8iX`9G%T;fr{KSIpOXp$Xyh?K%)rLt`ZkE0LWT&`z$_lMwGI9Qb{8r5NwFnF z!OLESgerdvHNmr{1HSFL9j136GwX0)c7}SA6cQs3o8Elo?yG9K@bDg{5bO_Z2cdvP z)Sv`NV^p!ZL4j#?WwEM}Hls?004eV7Icm})BcJ${*4XoWROKqp?f4z@d$h znK4;50rx-PSmmI^IQZB-;Hmk>&YcCHtLA=p23Ur~p->J20&j(!J-`dZv9NiUeXd(U zHs9Mh@!-=C2QiC`T<-|p?YLoS|ANz(D05f&_GZ7P|MOE|u=O1Ex>~nC2CKa;D2aXa z*E%YOf7S|$r0frF!&nS4_;>=k*)dZrTDK{$`hfBiG;b_#w(#^ee_LW&qV5%uSu>%A z&i!6oHD!g;s<*q=ep+Is@)~_vGfa1VOO2d33Z_Q=w(_X^NZHR0EO>hS8gmksY95TB zlY|a$FlB|PICy4KWP~I1`P~u#8Mi6&GvSq0y|KhiJps)d*F>B2T%e7nwvLth@Rr3^ zkqCRyqvUoq^}l*;>`+GAq&|ZlouwnEZ(!s0QWbVs4X= zHwENbF{kwZk`o4hbRd!W%}s+Tc#)K}*q|;ibYB}m!C$@XQ1yO+9942|_BKTjdKq5r zDtLFAnmBR+?8VWIj2I4Q6raYOrU8|wBeRH(2<(Vcz{Q^*c8}X|WvK^7@U$Y0w_X4% zx;VDy1>oI{<*Gi6|6XoK+ zGhnl#T_7=I#KUi}%1-W{4I=|I)k+dIy@aIk0Iwv)WWK@hFA8eCqw%vQg*<%?$)X8^ zc;=*GK*^oe8M^hC^!S#)U^PmYN-83mCJX5MH+&*DOypk#XkYlq9l$9<)Y1IC{Nq6UxP~t8tePD|VNr%7o;ZiyA&=W>t^iB8`?}}{O^?-KWK()>y6S>v8?;6xKrB7Z#Y5CiH#fxAn z2KKId$z~=H``W~6yZq&qufmBAVgRN~8;!x=%A20eACg_%;8*B3Z$dA2p($m1!*|~r zcCWFi-u{=&z|xvmkY{e&iOUc8-#>*U)ap-IY<|c9paf=6l)iA6yhQN1irds~$kE&) z6H{;8mdlo7-5-GTud?@h-S#uPIYfcqRUAzFW58vtdQ$cQuObK!N~`~kAG%lHE>6?| zJOtTT8*aRZ6_xK?b=eCeft;!5CqEY>mjH{Y_f`MxY+GphX)0TgmS(xZk#U@KO~v+& z8@vI;EZ0E1HB47gT*6_ZG3{b7G`u_n=yW+YSHI7W)w!oPR6NAs1Qb20qBWnU?`^v) z;@o!W_4I^-;A5;7xMnwV8e7vN4wT%DtZ@1<|79Yh*FQ)<-s@?bG^%wjI)yY9<>WmD zN;eE0=TC(-E{l8}1g1kF$-OVH4?`=fV|88r&X|#YeD--x+kYfYoH<~aif5UE?_u4b zh;_IA)}8>_<#3VZl@%!#MBIKA?*LnF+pBK|!K2|SAs&>; z6i7zC&i!z3h?<}{Raw-FKz*YzseZ5Px%QR*)(Q*=0xIu`!rp;gb5bvQuL;EVdLc`O zyOgQ?ai-PPst`G|&s9<{)3hoOvxW}M;UU|$O8fU(cTdzYBQIdAbzw||k;6Da3p*>{ zn^QBdE0_jlWu*=QdBa`{*lLF&!&i=2E5!>9awLUDl|_SxY)HcKZ>q*J3guhV`U)e3l;R_R>!n6 zOTRamBg)xP^8Kxn{QHhJjD*O7)v>W$FKGi1%lU^)80=QPmWu8g4oC5O%P84?4mFLP zZo1T}m%pTD41Kw<*?fqG9q2Y_V9mB~&-2IAN1O8V;2@D&YU7Y?xsMRPR-t6X)L5Bc zLGN6CzL*m`Fyab1f1X(Cw?syPUnzh6{=H1poh>AcbV*`1SZ($6%!=1h3g)QVum4)9 ztv&GR8Ouwy97M-;Uv@B}Bq3W}mqY~vgVAd2`Fj?o6YH2C8QQ_;;vz+tm{z){HCM|b zGb*8|_she(w?p-NuT@tNAhVEhqa2fIMkU(4BEsU(`11e;CJ|Hm0zo;%&K&>Mv+uk3 zF>^1dOFk)pHiEtw#nJg2?o_2$11qKDZ|)ChC}4pB9eqdrO~L{P{ZV{cg-0+n+jn<9d+adsl{ppc<%uEI(D80g zX?3A^LeNOFpaL-$ucc@D5n5T52l6KcnV5)rL?xCzoRF?5b&=2KY6J}1g}+6mz!(>% z&Q!GnB_Bh2(A#mm~Syv&w8w!ctHWFn0Cce>%QQ+tLc+bFiqI5{Kk6Jvyy zA{bTREm1cI;zj8zKEg!deQj5rydtTx2(+pd2d9cMtr@6oYBQ0kh1N&7ecIq(KY!kn zg5SxG*oy1)r?XSow?DlY)is9uW}}kxaEkbnY*Y}{aAa{aB@=G%_T4j(SRZ&kSe2+8_zhp%V zEY9q3pv3Lg1BZqT7ZTO5Yf#5f-(j*DxudnQx1B7uZ`#s}*p=|mv%N=4OWR7AE2R5acgmzxUdm!7ue^Q zQ7FnZP|&ND3f5qBCsEDUyXWOOXlZ=6B3pM4mpEmM%7x3^ulo-hqfR!5;{?F@SB&>o zsL92*wxz@TJhZE$rQaaR-TBtxrxpKz?hI+IW{q7>`pg_I}E=jKR zz$D5r>gq0l_bc@wCnO0sL<~U}JQ&qfqs#YqbDWrnxDw?GFHxO;m=;#f#Yc{1_! zDfptfrEG*wP-j*t8_$7k!vf0s1(s#e5cyl$pqzc6jJ6b)!@- z@z45vdPR0|wZzwL>ruZJU31!zTH+x(c?tyVyeAuOAK|h@CbUKQ?&!DJ-~yR-|mGfz>XER$(6K{%OXvu~D2RCj&oVGG}u4 z?Mm7IG8^i_?N5lmqdasC<#;e&Jh9_YO_vWDH_7}H7A6eBEFLvZRM%6@{A(?V9J%-} zMhTF?*fxfjn@N{pUxh3oBE4HoE1k~Y%Us72 zK0885bfI#Ws+0;vn)f#E(sB90#jOrg1q(t>F2)y>|2kwe;mc%TUK_?Emnst<1mCAD zk=^WDjwSw-0xUZOS<*+y$u6t3MDwp6*V~a%S}S=9_OPtcFYi{qdl~oBmM@w`-<_Ew z)I=BMp#`+fze)J>5o>6n*S^0G-p|&;fL2};g#^KR{1C_Ms*3m>UG{Iq72Zw7AFp|C zxt`ParQo;b(m+$})_PHI++Jr95hX7&`Oi%)%VGO!&$nCb5-5!HDhU1%h(TN9NZ-`) z5s1<8;u>;BhJ171#gx|DLT`I{{L!&EI%An1r;BCuPAyQP2Hx#rxJ*raZz@rMO~7B) z&X>}@I%M`|?xC3wHf5LuxTJmgy2+!Lm!19KW;IQ4m>QK?%Tkx>TMRsA`()GoNSvMm zZ8VpV9%8fhcE9*5GkzS+07wJjG6LVHmYm}9B%#su6h2L!h^<-bM%PsY#z`L`^gQ|I zyhP=LdER4ighH5B-l!*|2J9wJsvhQN=(^n|;(!K0QvVkg z31R9O4n*WG8_Lg$>B(O`{{Z`Hr)}_O7m=I#tyEQ`^O0$)l7h;3z(Hg|#T|(GsHgSA z&~eDL&P8xD<*TtW_N2>829##;KB;6*v>6ODDtLXO(L~wk4;oT=Q4A{XN=o{cy}fOG zParaT`y1!$t>bQE1*3NQn7HwihJ$yzt{`l@!f|St%Ue`qfnPyZC#tF=`=r2hQ22UD z_!NIA?s3|!FYbJNK}j7iF6s?R3GbdWpRvMW;bn!Z?TeS1vN-6Wb^Q7RD)$t1V-2v1 z;au3bLQ_!&Lx_U&g*xi#@_90xAyKNZ-N{;{_|}~FZSCH6E_%)0a3Z%tK(i-B^xP#v zCq7~;zAeV&#FsA|v)rfk31%heX;z-Fc`Y0PG1izA!o6J-eD-C*oH3hzo3KN!M1y$U?MGeV;{Wg?*Aue!s1f zjre6T`qtCV84c=;^($s|KW$jbYL0y}qe5B}@bA;;N&FH74s9oVPB-lo_J;E)R>u2F zk{N+DJr(RAlQFuns$LhBYJ;Euov4WL{*|=iS2c@x((Qg%-9RCK! zD?3G|%kXO&V`E1jJ8)k>fS_5Ssf}jp<_x7B3;=ZD?S1BmaRYjfVFA%#iD||*l^+bnB$Mg<4Ym3A9 zacC^fTUW1@p&?G1B|xXPvX+!lbqY4{${2m>G_W=R za;2!1<4`{_iH=5uUvgYW5)U`+gA*osL5=EidlIKw?rL;l956C#cp@{J|s!}HYsKd7`QAMJ6^+7c-K=7 zlO7Q*8xctAI}R8w*q#i@4%l?2ru`}SzK*EAlC)W+-^;TVF20Q^zfXM|e?}j*XAbB4 zp2B+#Yxb&PsW;_Mt!;nQ37b!Rww~v!p#UI*J=(rFQ%pX6G0BI+yoTyjoA^mVTBY#X zv3}x&sE>=V|G%Z5xxUSSXRB5IRkMJFwQ70%yv-u(UlPTu!p6ZttUax0ynQa`8-Bjr zZ_NHNqoqDR8dF#%+E~dSHOWu|Doh4i%Y6Wemz=EHzpH!r7jLSirOX%O#FexmgH9$_ z|JYEe3|jfzWi%|t}fRrXFA=JXxmC(C*9qZ=g`Y3 zTjX=oz>qrH;9jZkihlsgDxj%z=poo%OR~^o%GfOq2(7GrtZNtIHUi) z5und``Es%5jrDU6o07e}h>t@_ypD@4_XV!wh-qkj!IU*~EJKd#Ts1m<%U-&hp>y9u z)2E|!NgEHB!f@a(o3J5+^>l2P3T|AO8Y+%!<%KSdW-Yp_+Zd7RrzC0AFW|~IzSU-# zpQp&hhef8)J5m~Ww!2HcpdiH8DlZq~uCQGmj-n_|MnA1@^XvW*FMZW~?tdEnBRZCT zZ5xqAQI}x$8^Cs({VW?RoPzOR3Osqw*1rf;6^mo1y|E*L97cX{IM5ppr?6BvTC>gC zL#?hn*VkJ`J~!Mu`9(1TF|QJxuGTA$vJ=~3erUdSL~lz3*0%PEOjY@#+q47=1U@a9 z5X>#l)$Tdt?bxU7;yC+@>XxbfaUF79UpftCWX$M5iTs`BrP~lTJhZ`;1VMlLGjFGN z@(B#s)lsG!@_SawdQ)O|2+3s3W6ep45;qLJ^g$Rl;E5i7pUlOT-geX*^{;%TDUcdP zXrr+3yS~OAbLy^gH0`^o;{egVO*z3o&)SzM`E#rCnf4qujYjWxmXl^G)=OeAmFsj^ zEd*^_$*-CGwR-#`Pi%NRHU@;Z5`U($c}PGBgyV3wno4-a!wE#FUPZYFNWSdLX}cZN zcOg5@hp}Mmub$J7o$w!|F*2+7rJ(1MpcH9OQjrJ<_!(f#631QbE-WnedwG@T2wLCT zWZcGT*}i!L1q3E)PyEYALj;5Jj8^%M#+6diH4xjPA~;@5vx`@T1DxcWe*6lxSoXXo z^5D$s2240pkc+9s;z<3+EaBb!*PeX<4qqK7684up*p31*RarvC*!XYU{pwIOZ-ogG z{K{FLiqa$r%H{LRYXJ|jEv;de9xl(9bn~_TTK8X&o*sb$nz(2cPT$aw9@-#AWqsJx zOQN_wNr*)Q(b*hM7<2Y?fJ60a*0Mb375%Nq=B>wJR%LG#h`SjyxU2T;!X`i1HHIG(69rw0HK7;XIG zH>cN|Z7DVn3vhGu|D-PQAy<7r;Bk8IsPrYBbkO8I8xwxF#8|d0+8#p+omn|>I4+o` zj`o7jXRy>9^0s@vj%j$BH6fUeUkf&lWbk@qM!JgMC5!-_40hPvGD;Krftl!f>U6#3 z!V?|^3Wzj8(7*3`$>dSju1-oyM`yN)3E{bT_CJ}00h2+>pI@@di&90kr}D2qz67Z! zvvXIZ&XeV5-2%_M`K@J+4mQstk;9KG5QJxVai)@75oV#Yhz`J5(;j2qHzm^ySuZ$a zQul425 zwU1*=ACBFdqx$;AW7vp~w@bw+g*(ldpp<|7mz*=*Kxy8;yOgr;OtHM$;YZl$Js}Q2(Gyj81mWm2k9u*Z z(iUUKxCS*?v}(A&K>@2jNCL*66w8Mis&>XZ>)WO4KN(x9SqGn=fv*T3JsjIqROHA0 zw`Jc3kii_2tG*W3ba9Hk`D)KnWDo6ma_t_x@sJ(#OdL{rz*o_e_CwMc)j!L$ybdtX(pX<)%cc3_|1-2N#*H@E`*rA9uT%21#SXN~#U z^@hbvh{ymaGdo$VWtia&9(bH(3%M}US??Dw#9~%wj$XlGL%f(9A4WYX7?o?ueieMV zBWiyU{nIF|AbiK=@JYH&$70he3BK#`SW;m4lhBbG{Wf?hf{4sb_Omw|M=%rb>P zT8)mpl_ik#mm&QDZD;(w=*X{`%PS zoqYLb#FV6csmwL%7wT8lAJo!4v~Y`)HmirCMrKKcxeS@WT>GYz45Ohwd;@lyC}rhN z&33lAFtIYLGjAukOQ5=XdIB&w3|6B}G;W$lAxp#mxAXZ8x?Rm=| zJh#uP`x4n@Sj_3@@)%#|>kTZlH4a5HC-uqL?8mDHllAwGkYY?Nx^MRvoJ)GmB0v3K zHQELP`{?)sCS{aw;is9kl2+hx$(i)LVqg)+vI-wvS$>@!)-jZux}Rv)Xgl$XS^ncF zCSNUoaK87Q_UE7z={ngM&Z%0u`nG2dL74pqq-lJcO5kF=m|w952TyUUcNxq7eDTS| zqMiFvAx_f(LOM8hW@sf&a~l}`UAg&BJp!g$)WX>W?;JJ0UBKROh0^?*6RV*Rq&P-b z*0q@g6Xb^CMctzqH5KAbj#GaK9a+7#^_|BK2GL3)t;)fTcb!dJ3e9XEGtB~&76H@G z1fP*mF}wn*A zX7=W~ue*T4oQx_`L#USP1>wef^_qS<4-$9(!l=_Q;o~Kn;VwM1yunilY4b$?iP7Y>&pY z2Rx*RfK!*(<@7$FO`CRp`E9l~0Y8d?pQuq(Ny6no*y_m6+PEI~j^a5$$)j!EFI<}@ zmKA@A8nQHOu=4F1_y zQ(0b?YZ5#81yKUzkfLAJ(jDviU?Rig!xjXqM}KpNoF=qr_jsiCt*xki1CLkoSH7qH zrKZ3^|EZu(ttB=B*k4@i>Vtz;&35hMKD9Va%M$Xh1OdhYZHhBIwHU-Gl)qa3gHqsz{W#PJ$VGX?#2pes(sJjt#L4i zi55h%}3^g8rs-8O{1HZS8#0yafj>@!JKAMK4VC{$^;NEjKgQ)E8APWLtn zWN!5j5_FaSR#OV&IS?k>wxbvJ%8(^pSSGVa=Tl9;RyC!znI7i!6dnF&9l*Vd|Nrm|3?U`(c3{rNKuAR2)a=us;1V zlhTu0v4Ss?KV#^ouvlNPmTAV0AdMS-6Bt3!;Eo zRKE#&uFjFAAQ=FD5R%)2QPd(=7xMHv1MhQ-7@dR{X_&USKnIvN~B%)lZ^-yu$35g2)Tg^RhZlPK!!f}hXJwMkz-!+aAz7%k+}jOvdO-DdEKhv)i6{Bqcj4W*?? zqo3Os;~G2)f*#NeXd>4*dPFFV7GA%4Gu|}!q-y%pFreEYVW&?;7vLXn!2Qa%-^lb6* zUmA@{BxYzI#qe5brt$HJ&QLqC=M7XeWz*wczM&Q@44YcAFz6j1G++yE1~U_W^cwyU zpo0|iXc6?iMHX%kALQkTh{`t~f2K61O|La_PPduYkKa!*hSjA2^-Cn5vr<992bd%D z?xjNg&praSAAl|N{k7&?XO@=fe?2#w8yPJ0*UB0jv9bEVdS*Q0MNtyXe90|u^6fu@ z{Hv{JWySWDbXnP9BR|2!Wh9ItRF=90m$k*F#VXGjmWL*Iwx&@j-U?HccT1JhQLcV^ zGvn|O7RhVKWd1CC+KmU~R(#yP*zM;0MPcV-+8 zw>cI@Fs2ePO@|1D&<^?e370Zg@9$3xr?c94O`pzIj21JgC7vEMCqAYd4>F^68R4nV zbM)=YFam~*`%@=mg!O?0ani1?3~{I3(aZ@=HKGfjxG!{@8_MY=MGn> zUiFU{C?ICsgus9m2XD{WIc0HkH>Tgu%lK%YwlTX%N2dRvRupjIe`*d`)sY;KTlX7i z%as}AGQJ>TyhttZG##cFefMRL5l%RQR0pC6uvxS}O5yfjQD(TSV96<8l7Y8!dviKCF3Tqs% zzxRy$$WXp7-RyAIQoqO@`Bm2~^b9SSybg$4 zz6*RUU0Z_(`QRz0V4WBLOiW7!`+Gi0WBJ4ltKCL@IAgg~)^9HGkXU~J{IWhpex;h4 zl96~I2}>|e)ZEJVyGw{({>r$Bnu&&zsq#$6hJ@m0%KFW)^W4gp@ruB*AE=5|)=Q_u zDqS*cfcgx%#B7zJ_K3h&QU0WWMB^S^^Na#LoMZNi29+9D2|0Cg$WrmVsyYaht4Q*( zDvA*Rl=GlH^Me|{^SJz+R)!p>FlQP%2}I%|YLAI+9kcS!*ZJji!Bz!YkJAi}kJNTo z7ia~)@*HypwV&$w5WnH>*s}EekJ#uG)^=TNuhWg;?lJ-BJJV;lBYkbO&Rt}eBpwk^ zzbx+eMw!XLXJ&K9_vB*gKKKUflHT`cE^uG6hTj>yo5t(VY^G#lH;zuV0i)Ms2nY5)xp=ck)YcW+eD2bltltRqLIL_P{|AUVG~}uOxB^ zdkFoUA~+M}M^eLX$5JF){{i558cea>Pl9fhIg&}jWF&2I!PlC4)ZdieiFK}`wR`?V zAoiR*oOy=q^8|%W@LL>*Wo%7R#cQ!(cEW#|fgFzTf?5-oUYmVaZpgO}gw@SUPNoyw;ppFtqKpstK*~fzwZl zz94H9{DBGxWVancr)zn!it{tEy>9R0c+(>f46w)q9fs}6#nhh*{uWFjg>xzoQ4xHA z--aMJtpPsIWZyqz|M-BNPJx=H^Jj^7Otzlmk3DnQh?BYmjQU$Yo6~gB3`43$<&#r{ z-OG*Gm>;hgr2$BSf(R#}%fibvD|O=YnwqGl1}%!*by}EL+}-pk`CDD;j+U;=30uBvE5yog~bH7`^5-sn|g=E6Om+=AwuC<&uV&Ifnug z-4@}`F)L`Z)Se$@l}dTv`N+GKFc z{8N){tD2RiH^RSPJX8;mk{bStiBUSgISf8O01=2*{zJ#LAShJgY+j_xu+)q$x%)_4 zzpFwMlZa~wwB)SH8u-Qax9`W3w26@XWP zX2wbI9z539$?w#ftt2D!-Fqv|`hW4MRXT38a(n#2v`eCfge@o3z)N?yCSFBFXV*2& zbW_Yq%uzG4yHp;smEYlfdkS2S#b+d4RDlGQ$fN5JUf5IZO-pfT)p&t zrDndv0`?do*`)4gVNZD~iB^i(S}E=M+ozK>2#9Gu3tk94WY!Y|pz!hKdLQcA#FUg* zN!rFgFM4e11F+GUet3Je#-s@3z2r&t@KBk|74GeJiBHkaQ5;LlseC{Sq%`Js@?5R) z*8bChw%edNujj9F)1l})b~wne-ErK|{+HF6$irzaVo(V0>Sct*&zc}M+lmIGMb3|@5|aSWS!X>hhy;n}W^ru=b~Z;sdS?s&_E{vkk} z2|yp^-f(y^@yJXNg(#7a-OF4FVZ+)<>?T=iWU$c<_SaDDb(|aaB;g@E`%w^lh6+C_ z-NiStuoz-3T`x4`fwt$lIG#n6riN74W->#&K64ls2tHu!l&~z>)=ox?*J6+8aK z`SRDAH_3k|!rq34m3h(+_OJg&9K$V2XwC{;tvf_MkWHsX^k*m-cRAH}W_ z4ZN)^^9#>{nmsO*)vb#5f+;x4-^+-TyuF%t=uJvteS99-CNd27-CTLxGwz*|1JbVZWiM&@t?2&?=Z^*pc5ljcEz2PYpXTDd2%@mEH!m|)^i>9E&3 zjYUuTj+Sm`0HlEFORt1}>PF~KW@4G3leh0WEKvSD!~m(m7xcY z+~H{?`Y-Vvr5&|)e0oxXvTG^68E8>D^eb&HvtPW_@*aMpX(mQ70mwav&Tu+%PsTO zcy!L;G=IBr`)Z)8O!ui)+f^$?9Ot|o>eOw`Y`sZ=^1x$IZ+3V@i`f^Q4ksM4k zOv^ng6rGsuNlaTK*NZqfXrk{0;AfzfPE&z{+cjz+G!P31o;cilc(KtG)6}mPm;IX9 zl=#$rEb;N>)Pmqb+c7_!*EQr$kBc-N$nRV@{s?dMEBPTCEo@?s53f%`-eBqr@&{u# z`$w2+#+Qz_{3z7|0#7w?{V(ozC$2l@@un&%nQ}Sk>3;NnrhgXMDF&o%AqJfBop0I< z@fN<{PNU#FSiy_d6>^hF5{+D!;2>tD=}_U+-5FGzTrI9IF&Q0w@Eo)z)_OP>^|Cs$ z8gkaVXP;f0gO{BcTDtodJMTP~YcpIjYNe*;*IIMFrBs=uj^;hcQ{~k_a(nZQ`3o=R zP$K`d#~3!`8|L#{LJq34$2_H|@l?x?gq@Sz5DxJUwNkV^jD%9v;rP`7#i? zv$A@6RJ2qf=?R|dusB*>V$qgTso# z_+G?sZySP89}m9C-}?G3wu^a(KW&&*QYZ8!WIc~G5zU+9bUmeow=YOwhbVf~uO-}?9-8Ov2>Bf1;C*VD zgUSzE26WOS9A0AzMGm6ixKE#`No?k+lvBs%|KfO^3pj#TC!2%h_6s`q13tGMIC!oh9EjY!2M(=YnbF2Pi^m6Vg$S;FR@< z^zxADVIzT=IcsR`KeTP{S@{#u_p-An?q+^rVsraMZPWRR)ggCoyZQ1DjVJ&dgGc*6XYQ zo$}3UQI?_FiePu7050`KD@#UBk**wwU@I=1kQgOAAob8F85G9IFBWnVrr7-L<~A8O zQn0B4%)On`GT+FG>jT5CTS?q{Hb{>GYZhbs7k3thgn!L#Vt80l zIZ@~%pyqf=zA7qg5ksu3#$&QYfMcUJqdMaivw5xbG`Rdj!C!3hS?ue2>6sJvYQTMl z&1vy_`LVYg)FUJJm{%lIHTSQ&>mikg%<(v?Nc1$nzO~v%usV!s(@Fa2nry$$^_If5 z`0LF@cx&7o|3y`0k2jf`F{fIyQI`*jyw^#n8Qy~9vhQ9niGFWi#?Q%uuH`83Tx15^ z<3|iAQg|!EHCGJ^jPLK+8o$RbdN=HulL_$I{l69f>ik--)3D|L*mx5CWw)K>I8;>g zxMS#QdV2rjEChW4$Swa8Yblk@Q7X6f$2395FYo49ejldWsjZ$Y=Tifsi_P;_Q&T-3 z?qxL<@6&oQUt*NQj~u4TE2~`@W87YS(IKotBjbOix&<$NzcoDwf;y(p`x35^%CQ%T zcqDqgzf6__5+ekkWu$R2o4yQILZ&y=S>FOo^g1dS(9`0YEb+pdej;8A_J<&HvjeB; zUa-K<7uni9;9Hq^ZwgcvfhstFoxu2zF+HU5EFwgKIY}fO~`c>~<1pvQqwkyyF zgtt}?6VF~FXxseqs5gwe;Jroi?a6acQ%bk{k7w`=tEI%Y5OkDMy*zPm231yh&Tl^R zC)&oQRs)szF4i!uF;fk6cyenNC)Z*T)h(rO9mUUd>g>z6%>kpf6-l&EYk z!W5@Bwh89ojOT=ML95%ic&tm36)Mt9s7#4{uKOQZi7Wo?-rJ%u7uSysbfd?NaQl8H z?-zlnr~5J9%(PI=OPi?CjYG{rt+c%434M5A*sy?lA#swLW|%P}XlerB=WF7o&8l?A z4}_l{Ote3hRkk0)86%4vkdUsvb1hCt}VK_I%0e!eo`fFlH;#oI)d~wY^^&>sv%TBhn_dBS`qsj7$NmMSCaq`^9N}FBjI6N)92WTc;sy9O-nl}kY!vZ`&>&x(SHm7- zlEKvVIjRp_M!>Yr^-;IbhiMe2^^WP25-+S3wpNn5UOM=X*p~Z-yOhp)iu@DC4TrGC z;UyfXtSgt}#}E9TG>)(xEq{CI5{?jorgEE+t7=hQ8=B-3pC|Z*Ds|B3O+kh!RKe>Z{)~4?&!@+ZXS*0`tO)!c3Qe@#8HrL|s7SfyzmP*u zQ9zZFCVe}0zLV^t+!8h`ltWBBUVrG5`lwyYgE|G*x%78c6qJDZpxhMSaB4knd^OP~ zRshR4cTKu~sXT zQp7`i+?D6l1}Ge!dyv8123?JHQxRC&L&E>mnqg%7ZX2XCIJgK+1kU>C%|E_!%qy-a)>jsOR%foc z!{c(G*KmA^-y_?5%{dbV5BcKp+}z}ql`A7QQ{2KhIeSumGJ){rfv|L9-^apC&|Rs2 zR-14;@r}~)@+)`l`UvgJIImnzW_uup`5)srC7=~DTrhz`Y_=3op@iSnuwhU!qOGtA zM^79s%6X)C0mA5=tybYW`5T&BB(yIbbKZKc{I+}pluSKYB7Vi?=QNE-BbCe0GBgw|Hh*ohKc;OLaE)>u=tKgCI8v;{F5J8ORryO=qlaV9FK6? z&HXe;rbLSg9i#nsoP6pwsYd%GvFtYo(yMR;LpXM!jI@U4l*RelAAoo*&%rl57P@~n zSig!6uISg35+D9r<8m*>n|~v3`f}!8MjBJfK#D>(`iZjAh8psRyDWzN=~i3QFEg56 z!-LL12nwJZCQ5BmQN74xii&b1fo3MOz`YLLQQ5677bf>!Ax98Iyg<;@pcNN5nMfm!4Ht3IbX6 zN8D;x%aym5dZL%)qPHTfC>4wBaWy#?R(;Mi|11}a#-G(K5JO@SDVWWr&H*&sxnyxR z-G0Sz)HPsfeUzDB^N!T zzIh$N@uDFA9_rt>A1%9B%rrV|QHY9T&3f!M#*b(Bde?(~ry}5j5*+@Ar>_dAYVD%k zgn&v2h;)e3(jZ79CEXw`2-4k+pmcY4BOu)^-Q7~sU7Or+zkU9DuMg)zAI@5Pecy~R z#~5>UGr{!OeiT$NoAGhu3t_~kTSOGkp!|<~s?8VC09j|DrUov>_mF+>5|TRgBYS7% zjDi@qWt{;v!q&sp7tTV+4TU{V0(E$-g@~8LU0-IENg7jDtAmOyFct6>%q~hd1{VPv zdtO%nz1e?PIzxnpeE%p*cL9XMWpPoBr7rs)zLAVPGrEOCHOyKDlUeIXCpx-lYQy z;$Oi2M{`C1-AQBJ-^>~M+Ham?t#kgm5zqlJ6WUv?Tof}ZZyTt~$rlGlk#XEC&-ctu zQB{-0TLAFu=9PU}S?IiV*_m2m^UJj)K&3mmHmg?vE|8JDbamlYl&U5@y)O-;hVMoy zgcSvThdz{hg2s4pg3=Ll`+ibz9DOs47$T}>u8P-k*Z1b1U13Sf5nvw`0e+*Q{2MD9 zN2`Dok-y*eY&e5T=bX8s;By~-2pW=Ag2jxM2%?U)%RYwP@b_YE^GrK@#(41gIXXA8 zMwAN>_u*mI>@Kw6ee;q+R(YHaG?XyAhUE{Y?%%z!{qm53FE#gCt8Mo7Wv$7T@X0LX*3x#G~$R0hoJ2?|x0&S-nZKk+j$T#3c4>3pv>Kve_30#m*jpUDe(cC&gwelzcE~Sw? z6*V_MrkRcEB;B@tu{~LynltIl>Jx?6R%s*)W;YIbRuq4xGca9nMN5o+!1qR-{yDT! z05y*RsUD`sqUvvtgaupkRo|b_TT0XL8MBc~01H3}rwma5L`{dCa&NrpGqcFV=#N0G zCR1H5_em}u+;9R^c(S7F6}*qEg&i1Acs+d3yLmQT{|{$g9-wv`b=2hi58QCk0{B%E z-@R(Qj*_4)E&K#k;TU>D?=H`S6+Bkgp&`p;H<12PNSk#JXQZ$dPxy#%f14WhqYi)8 z2Kd+z^lT5S{o?W~wdP^Wz=b4f{NS=u7)p2B=85!Yp+% z>PSFff%d(Do*SEn4r21ms|(cqeHKqrc%7MK+pZ1fNWhd?tMSTSmZwIA3%lu_2{M*qdx_@@~Tqm03PU0E=ISugIE_`4SiYssa2#-bI^t?U{ zE1_giU_tf*p25Ghj=Uh_h;PXImVVI$>jhD@Umb`q6e~;a1FF_Xcun_;RVxd!=rAMF z!g-t~^n0C(?bZ6zF@31t?!EIXwk~}g*Vs{-;F?k>P5CPY6j_j{b*F~H%f2X~)kRGm zM*5d)2iO1fF+E)kWs)d;`F&0aKt=fm)bvsX3`0c7eq zJg*G&%JWmr{0Xdeodpnxz@zIt7CA-!shi@l*W;bis0Hc3J+W10!>kS<7A3Ep%$c;o zL>4UF6HxeCKut`6QT~0u^iNH+Si;9|WR&eSn2JS%`c{>NJ76jXiR{_PO79Ur=4oA; zxoJnRgI*1$$9*%5j}NBTvpP;y`b-OlYU{h*F5Qn6H_gk7if>!5o6kjOIqDW=$r7Z| z9|hX-kvnO^vpf`4`Wznyg<0`d$m=8o7g^97(^y#*e@uv1X;{emLC5V#*D)S?K;PA8 zf-tPw2Eu?QR0K896oAebYZ2bR8c&=TK#vOuIH3RG=l~@la@%|P3;-gD{*X*q#jq2z zNwIU&o7cQ3xVkZyt-uTio+)6QtdoV>|hT4Sh%b>49_ zm0|w~*&^w67c1tVO9s;KOjzV#>!D5EU_ZVWIMq} zZp-}8q1s6K=TdbS1+{4_^ULgyOM7s_h4%T#z!2~XrFFoB$0ZU@1=KJ_@djHI-bT`~ zDq6TFr|hnpmn&|Tlw%SOG)g?PR3+L$_(N}HK5CwHzGH6sn#a~)Zt?6XY0=N0e-%|k zf%+#_z_s!-^$Q^ect@8%mqYSG_QRF-Kn4hiT_}MX9M_4Wo{yC`l|o5m_?N@)zlcj=SxBG$mSMkIIYD^?TW z;F_Kea}9d+L0BzEt45WUN76vk+nJgqSpp`FGGLxwWYUSy7CTQE)LAN3zsi}lmUXo&ng09+}goJ|NB1z-T1v0)$lNlF0tx3jAEKU0|!B(b16#bIBRZGZ?6W)c?iv zBiho4Xp@?WREF|cm<@t~8tAk=Z%g$0)5XyQc+cDzP&CzuMS{!MDOuXY3g9|Q8XEubo-^@k7gH<>>R z0UBMfWwae3#l(N7Lv%lMrqaBe3MfzS))4>Xrsq>HoW*1Wvae1X?jF{KaILL&p|+7= z+Fe|s`m>wpX&>#s(JWnhHLtU@CZ%otdoat2M+51#b>lJ5G0W-({4qqo2dp&NaSt9V z$6Xb69BYU$p#qP04R=rlEm#!hf=#=>s~jE2gBZ2`d?8dWaO?VFWH_2A?Dj^0SLAxl z8V_P3#UT&~%5Ia}M#oBWdLfy0BqsPs#Sjiy#l3jmdh#UMspAPiVqf3i($b^f<2`MK zv6r2b6A;snkvh1lls8CM2L1Zv^HtK9iH>#-PE#ESK z+K%1Lbm*4~rjj!CU19|*^|F9i6J#dnr5%a{@<&hZTY6w+U<#0K&`*9AB|;VeW{b+r)5P$xho& z$~uHWWVQKV#PZk@aa&d=bu-W6M6E-aw^v0gmLWM48N58H+U!9Lp3bLY{i?}>rKzAb z{g#*46tJpLJhXr~>8gdPEn@Sk31_7Z+{41BrK=pX`lB5GqsKfJE(P`B?PNwF2%eyqWp%x=qklY0xal^sSlKxZ^wV6fshLt$ zmw-zd(y-LuFE%yFldqlyG_iWvFzDM0&W}h_sw4bWD@IU1&flq`Rn4IL`1hqwetl~8 z=!*n6Gg7T^3FI1|AYz5TkMEC`rGYL^DTIwDoLqgGjTyX?=EUrbII6CjWGImKh^e0Z z!($MQV`=}q_K6f?63ogPbs%T_=O}{#!4bvpAmHf>`|#FtOwxzN6;QE?0f!tTIC!Wy7m4S5ez>9SQ&C6ly@P=hx^|M+v^*8sVe_Z~^JY7H1GG#PzEI%j{N7F{c{5wrbjJ&9MSI?g?ZOIEf9pH6JBY<0fS zmcMyjw|Pgn?sm$#$x}D!>Q;gt!KU3hNVekWXU$#=Lwl77`GL!vV)GAR2e-@4rrb&HB8<0u^`-qu7P(IdQQxv=cbyoG(!(G2&Md*z?uCmfj zXBe?qP1oP;4E5=aXsMeiYp<+;gYCCjO($UBY~?SI!G`YoJu(4FFNEpmi6J ziTUpJBn4lwWU)C6m6AdIz&sEUdz5~M6^{{>JkcyWrqR_QX z%>yb}4*#bZ+Utk3^qkDaXJ~iBT7Ae^;e0;+=6pM3U<(kC4F%t+jyc!&SC5K^KPi+W z4OY#NOS(lIVEGqfnP0iNia*^9K2jzgr&e9?v$qh=^$oFnK)V0Js}jf?y#I%lhE%RI zlvrEXk|pwcz`r6J$N>>G$t#h0=ZmYDoN{KCgO0oVn!magqjdpuJ>EU=0<`z9cSiiO zEh-*RGPp}+D*cyu(6NglTQx$H)bjDL6Nmwdx692=+e1j>{vH4w&;30FoUlcUwMhz@|35#7k} zp9gezygvPu&^?1saW1g%)x1kc0@d@kDXy$mQ#=69tGJV%P!J%(>*r6Z5P6LTC8!8e zASoHv;r;S4Ts}0<{&dw3b$i*J*(g5V|0djV9T|tLR8>{wbUj3+&OG5DfFZ24U(6p@ z&JM4)S4*afshb!|6ih2Y*epA39D`Y!0#EEcBp!#HfO`-P2m`hrL&j&pc$7nZNgr^h z>meKMy@D=5ykr}em_w!hen|R{wJnXw^l>YwnM~6uTp`&%HXrXtV|ks+4t9NlclZqO zoFNd)x!Zp+D(9!YYc0x~NZmDpcZ5{3nN;r}sZQ6&-s(Dz?ZHh)IQt$Fsb{r&qg=~x z@7AO?S$7LJ9=H0^#pehefjCYk&!dY2Xyihktr&XJ>!<00UpWxfWgXvETMLlATK?SusBd`|F zZ%++oCM-oOEh$d0H7rmA8H~$viP78}4Wt|b%x;Y45w=oEUdzD~5D@+MDCc_!&EH0; ze9^R@&q5~)+ZE_*Klu0OCbY5vnj*x9#Pxi8Fdgv^0YIeCJPXQnW&7d0LnO%8NdB)V zI`=1C4tBkm3&03>YI5vFT*lzx-y}F1rkp897QszDyEygM_e+{CkX2F;{_i^@w*y;} z0k6*x)~xe?lD9kkG?KEzVj#asRFyZg6$@4wUhdUn`Xt@_BpZIx4lqr64w(YPuSIB{ z?C7p0n?TqAc>yO{X9D7N-GQl(f6%MZ?R4qM*ijik@6G9E_lc)_^rB(b5(jd*-5uUz zh3@CfqI`*)HLat-1$=;>kxI)MtcY+@($gZotf^M8HZPgGy}FCr=Lc#iW65VnL$f7( zSlbVSZJ8w>Q$?PefYbTLx>Yg*2CdU?k$-qGXq=ANetqip#oBV|Q_Ju$023AJU06$R zx461*xyEN4_g=O7sILPteHc55@xf92PI8 z%`n)O1i9+;0yCfpIRN&KG=Kfco{n=6yW)n%-RQKVUD)?fj(%?CAFbUz4TjStyqWOJ zuRttN_;}A)*O!iBB4j5QZgQ$!X@*C&k?ZbL-?6p_!gs+2xfel22CLDgl%`iNsbS(L z#}YuLA_U>5up~>^qT9=p|B{0<2=d{Tp=^enIj}TO^}sFoFIjLLt;nZ%pZNV=UI~?E z&a<~_QH6FPjxlXo{;AD?g@#+tQ@T?lYz@h1Ucrt-N@e6y!gK@AXYrjI(|NpUo%xxo zMx?s)8#t!9GlE0e`*TI^;F;JbXzp&w-T?rCpzlx#>`J5?ObA)!G9DqB$m(VnS~3%K z3Uzwim7n^oh#hs;c9hT-`q`*taT8de+Y!9;)i+wqv*49W9W$J^`Fnp;y`{B+!&v>g z6|6;t$nF*vWwot1>&+cm122^Esq@hU*l!3&2-f`x0!7U#I}x0OBgM=FuIYEJ8T^1aeLfR5xj6@(jOmDlpN>*LP+n|a3Wb4& zWf$x%ci~fMvZpz`?;;n?B$8_mzs^pv%Kk;jo_%e@2dXGa3gs0#z#gX-9K6oYC1{#bx%bqg(pcj33!1n27DdQn@Ig(UnE1Q=IMU`2<9NT ze&ak^lt>|Wmw|E!Ws8=?NzIhy?c(cxQrmEOv*YsK3&7CQx$3~kyUZ8?b8+Q9+a5!F? z%}@H!0ud1;`MguT_2UT3ue!*#F9?~ZA-oa@XIt~XZV{IrihGjL`<~2zzH8K(pn-Y2n z{}jVFgZx(t@?ST892)~}z&HSoB7t2SN4II!I4`Is4&ivVl+Wj0QCFR@qWa{FQ9DoI zf`OVDmCHp$SC#vNtw6rum+9o6_f*W*OFFnj+S3DL_vBsQ{!B$u3|Fle~x=<;wm8{*gp0NP6OnZWBrqJVZ1Aid-po2D`%1IcZ2 z;n+h0I*Fj@qx2LI*&mF^!Xb%%7!U$}0b`5BQLp^slY|llb+8G%xJxfSHANakP6Hi+ zn)RyND&t`s#$~%$M)fQIsywY${p2(62m9o?h5#Vy-$6VNi!D~aLIspXx_!gy`QhmpsH7|(yP2EQ$W%Q%0_Ag)fNL3nM`$S^mSLlu z@9;R%o1L$|XaoaoyX}!USgg>GEWjz_*pA6~Oa=Uqhabn=UL2K-Klq zfN~&4+uQ9#gW+rR#Dt-|k%|jx;rxx-Z_!nFs&YIQ3H|H_KtFyzzbiWb(6w}SNcE=B>P8Wa}%XqgI zM&wPlYNm(zwe$2E0U|!UkrlI8H)-4kV+6T5e4lB?YUva3dEl^zxy?s>)2^Q@nwh0< zY^aRpvvL;oCL>2}+{p@1Ax-T1^WS^XXq&%$Thh#k=95hFxQe9uv#t5nAsFFL%3KfD z=bbH$dZ*LtdMFNz%2#W4FKqLH!5}t*TlLD$d2$O?{*A*>h4s)%(}*2|ENi@&V=Md} zY@DjV&P!zk8$glU98P1<{IWHi!j)wtC*G-V=Izd_df)a)bN3o6L@-B2qvGQbr~8%+ zG7#MaoGq|}R`_(Gd0*Z;`|EKF*H+UU>|zpR>VnQQyUMfu#-5W@<5E3l|CYK0xKtb{ zr*CY3Y5{&ae5A-Nj$HBlzX{Ae^=gdXy}`$;j#4?n$CQ;mFIq@)yY(|yOXjjKsz_EX zwb1XV9E-(Uqg;Op;xf7{E2_SY9dvb6WT{u^LhFyA7!$Yri^qn zQy#i!>p=iKcteCWONw_&!-xUB^3&2c4qz3B4Yk`Dl&%sz^sML=;q`uW=eh48uFUX% z@l=gr_;Z~cI%As3bI9p;t(Vr1)8&PAMW!+4)kEdQ)$er6fS-Vp}5 zEHVMX3OvygQQYkBVO$Rk;;@o*myf^re~F_WkWb#hyveqm-=O_hndCgSY`(JlKvG%o z+9uBWf2Lsdjs1zSZ!MWTb}k!ItfFDDXxW_y!3=-4>2yPIAVQ_7?}-oZRvz=Z%G(6? z#$sl_Y&$(DkMJi*&6dT%UUZg$z$)i){aUr{QNVF}M(!Tdk*D#tpQaxt-zp_jz&`-5 zk_G|7^6H-9@dS)*vhMnl--p4+Qt)@-v|_Eg0VFBO4}TeTDG1`Gf*A?i zbQ)Fua8h)d{eCH2I470HAzA$)K8W|+hC&AjDXTx65cO_*+zdL52*P5}KvN3vO5?6_ z<)!goHsh3L{B}Q38XHG$`Ij239x%AZjs)+&=hL@g$>7L81R;Cz%~yRJ50z%h^6d_h zET2_&7V#^@A-nR_d>5E&H5su-YDuHw9l(Dg5s~truK?+w%s4zpkL+YC{2FU zjCH}@B+Bmty#V-QYq=jIuLLA%5`d@4u(2M;V7j+Ay)J6a>8%zxqr}ny_ZdqyFFP$e zeh$f0v`Pp8_c;o)`Tnf1_&dJG+Vd%=1A;W~V=%cOvt?>ZGpn`C8Bo{FDr;_2kvHsX^G$30U$&G4^e<20MBE( z`=482Rn#@V)fLd&oId>dq@N9Vu-f{!5ouh|spvljrW$6Pc-Ax#7fw8|P6OMTUrW}> z>5KS9SF3=u2NC+UUc6}H&~&@?Q4-YqGu8vk|=l57B<Y+WbJF(uzsFQ`Qnha0sMxk6hy#91A(OnFbidxu(Si>}b2|?rv z(!ZcbXq+zTF7PmyBbZasoa)a&gJ9Nz_MT@)W?`Xr$#SK*mNy^ueP>^jIXBTYF}#@sYxQD(pcV z@7~8l88s-28C|6&<|-U|mYpXHK`$|uNH8x?2x%{M>BLI7-R{3|?C$0lC_CCwOa{w@ zFJO9)QXmsYGSPm5j`4>tV%W6vf*7uN`Mo@)X<>qq_MMCj3F4z4gavY)d)DG!1nrCR z^5#zvUMJ&*jA_i5>0H289^Pl->>s@(A(UhX(bBf!&x%V9equ$|cN{x=I!Yignmmk` z%PII~PO6$1g8DF=TK$>0Fw>Lf(0b)l>Qj;eX>39Gzz@O~!5-C|^yFY@YKB_sOZ?H2 zWPo}p4uU$SxP4@OO};qtPro;mxlexbPtzpP)XO)V%MqQ&WKeA2L+*)C?E})icz)6! zJLd5^MNS*+LT!!Qp@C!#B(!8~u9XM+?h$7ndS`vO71H^f-qp-Z2MKhvm@1ORxOY4$ zmL>Cf5CP;j52dctjqHCC-lwSE@2*f0A*ihim2PVv#|1?(s!@<+y|49y1Nd4GbXMJ4zmP0-;qvZ>NrQ0EAu#|L8VTYel z#KL~(`UV|rh~4z$U;lblK~Z-0Vs8x>S4i&uyl`3QDA8n*lM)3 zr5pErOZBV;O-&||Wms6X$AiZ>gD7MEUwf>)G+X}zeHU#V44pWoN8H$C$d)pU1)?0l{8TBO$Nf z4YdgNndNoQ>Ir6AcW4Z4cthEv)_#UELeLCLFE1~arI~}wqI7oAQO3PnTqda-Zyz5b zs&64>==mN{lA8zjh5TmB$ z64h;(T{FrjQuFg?WxzViQL;I$@yxsVu9M)gxzF^UtHg)uFJcp`IfDE9B4H}-f07zX zXT<5buG*^G7=8_S$88xbnBU78qL@p{vo?xi6TlNLgr{c+)hAI|mHC#=GRRLAVYNgnC3y_H zQ0BQ9<|6G_Yv!{(O_i3aV~E(M=Oc+7yRebNT^<$a{|eA%IZ&^hwgBBW5-MW@35VV} zcdeyXK|3|7H_fse1L^f11CiZ==}R0uD))M&pkF(-8zzNknp3nH=8V(R25m*9vKJ~_ zJ|C{JVtr5`8JELfBNR6uV6fYTD(@>^B0k&fg8~SJ4uE7Pp;v!n_|XG?ENLg7?&QEy zB#-@u1`wcJ-uG{&U*e4u+HX%>F}EF5WH^qWkA|dwT|yEst*vD&2rJEyzTG8~nvBRC z7dBRG)Q`1$UZo2^&`bKKfE7;W`;sUvywl)o_o;JzWuT*W>epfX#k+}TD5bw35VbA%?U-8z1zEJhki%1*TkE(Mh`nrD&o0`IPN@?r$i&1Qkd$TT`FSl;JHd#e5rz zQ&+la^(4E|xVP_&o8^AbAPt>7QuJjC3r~iEZAQ8Sqvcg96IsyG*xA;gp((lXMo~7C zNFDf_u)JVRN^Z}p)) zl)=ib=IIF*8mKl#&6MP_>n+T@(FHD5g5`kI`AbOdTIggAV2#{*6@GvHF7(?-2J^Qb z)ac_!C>Ps%&JR`rRBr<(Y}0ASIv;0tl?#HeMuh1Zzn4$%(CP^KpUE!vnOMfX$9$OY zl|eNzUL-26BzeP6XcEbUsnG#HtS}Z@&KkYV@GN#F!L+M+joMe*_JF-o5t;r1JdyOQ$qHk1JM_gFnQ_6~__KNaN*bW#)yG8t3l{J?(6 zchn5hHM3!v)(VJ35D&HPR?q77)84zwnu28~Vx!^2*LQS~PvhAn_e|awie|N!H<4k? za;fKIA_g=1nK%Dt+wx~_N9N1yUoqtxMewaBkr$4SnF6{z8uGr%5?3g@ZJX%>S6oU& zA6c+SAa$xgA+@5_n4#2|?USJP9YwgC#VRJSk*NNc?rwr(pOtOx0DA{CSe8^gi3d0+drjQYWCKqS27Zid$BLTCx7U z6x0U(VLUo#&$kpEfyhZ;h^t<&qNKy%F8lejXnqTbPfTUvKk$H7I;W*tEOyGY@K!NOo&|bip#9OB)9Q_nbkQ?xI z-nw5ybi2uKNG$j&_5BXAxX}e4J(90O^!mvBRl+tmtIz$gcy3GQFbA1DZ;WnbT)od< zGSv-JMWNgXF<&UzBb1sv2o~3=^pg!d!oh69#6PwU=l0Opke z&f9B>N7&^IhOeynIEyaLdgsoRziSDp%*4az(dDA~Zv>PXK8KZlRtTp5nZ(nDZ4A z^yJ(HZ$uBovm6xbp7@yL!;WuGo#IF zXWsV2Z^@@hwF}LZf+oIHkL@r8&AM6dTsU_geqo zr)Oc|`9%Us{^iRH;wg)*nL3s$!9!m-*-U)t7Fp8mFbWid1+x5TDmztagfj(Qu zw&Ebm$B@TQ7}@tjd**h{d2Qv^qFaHd=HHop$r2CJtK*l8a&=9M&XtR3ACZv5vyWSI z!pd8vjDZhK>EocD$wi!caVt+Um#6I`Ohr#=y`JCkNE?8ts?gtGAcz7GkJUluqSA_} zo(G`G4M2pzY)o$K7S3k0JRcgdfk_3tAeiq$Jt0b`?ZBm;qBQG!!E=1t%j+iF@wA@# z_v^PmY9H=aRFqXj9VNme8(Nl21vmDb|7K+$w-pSTP8tg8Byeh)nMg0H#~LpcHdc;} zP}Wp%4B60c5>P9pGW{H5CIDYBlRac!rWe@P`&zf*wGfuR3ORT!?6dx~ANG{w>duM0 zRlH<6n~U8iMfG4&!d1^h7|+!;yJb~g*E`LZlF|@M8n4ysLa|uDW6qYB@AY?aT|3G4 zTFY}(w|S(UDi>BG7I@!BHy<{lMnQ{Z5|6v z0Xcisn)zewY@lrI<%jL(1{isHDq5dEaY}?MSSm)%SrwHYUX6ZsdxX7Aix>B!k-JEW zNkg+lm&Ixc??KIwPSH$I@@nE4M1B9c*wlQ{uHuhL3@wcbC3stf>PmRffQV|Qh5O4T zQNFU*BA$+mRahR+Aq}x>UR2PP8^*(mKVDsA9FJ2y+F*0$5{d0 z<>Xwik8{VV<>W~HebV4rVyVTr&G#S^Yv4q`ctAV86r`YQ9lEpjdAhjRtyPng6{jr5#F3ko~ z1$3Y0k3kdNG#_8Cb zKc?5Gz)a)^_8XAQt!>^rM%%rMG2~5Odybq+H}ri~%4p3IbT<56usy&}3uPb8E%rmD zlXGRhXiGM78DkSal1h!omWUisN8P$&iRYVgWCGeMY!> zLvXoVKG1D)C*tzS0RDg3yXLL)ENJcfilfFA+Z6JgUt*ENAAF3lZs+~JkK9?@-H}e6 zKRlQ81Gb1YxMlZWv6h^k{ax^DASpa#`aO7e;f6eQ8-yh5i9wXX@%d1SqG`Xe?#}J{ zhK4xgx=Gm-T3z5bu7jUenp$7-oUL$keb#$om}_#uI3v%O)7)gqarVi5+f()Jo#4lr zH_FPU@QQbIq^4Z{=3uX3}`*j!}V;u#}t{?OEtFlT*^m3 z@dwDVwLZr^f~s>|cf(m_sx{!-4!T zrC|J)Ysx43)FeKmt4i$T%XZQ$m|r-E8n>36Jp~pqGI?(p)F-~-$=a;qu-ZS|8d@+32U&+OLi!Q)v-1U@b&zhpsbmFiJ z7=RuO6SB%C!O|44S~2+DaP!V)H31iYrsV_?BZWVuGww<+;z^a|cXMpSEur6)7X;0< zsL^Ri13FOC#-rn-{nVq$Im9WQHmhM}`Jm99^b^CZ-*caBF&?THt#ZKZ*YNRKyCem~ zqUy@~5m$pnCg;9W?|O(myMYsO?SBaJk86ha--7anoty1bXH2iWhGHoh|JC$zGgdGK zrrS8EGQvXAR#5)@DP_gQ4_=1E+6~ZE25cx&mqb02;oZ%&Wgz9;jQTmns^6(<+c*_I z^aV!uvP7D?U<62-K^0DO%_Fhi7gY`JTgy2TCy|uu2$J2_P*$w%h5{=F1W`&>F{(b_ zsoT6f$gEh+h1Xh5}r@Pd<%If61Kn)ai{z0PmyP;q2gZ0V4isAmh# zV;#^^6@vj9CgM`3ns_?^%4)w`qDe&R(5B~6Opqf&{tw3Uc%`?&z1@LY^ktdH7JDw` z1D`DDB0R?_7j9M_l@?;@VjV|5#Il&F2pKCP_&ja|n@Dh3 zWxbA}?k7uDujYE6elL8lkvknc>L&uCPoOk2o>7*gHfQITlOmsur&NEIU$|IVTOH{+ zIdMf~=?YwNmZ4-uA>8L=U+(YTwZVpMQTkS7e50d#KjlRl&Z42h~)5_pOIZ0yy(6U2^GV>`H4I zCQw8dY4FD|XycWIWy`?0vC-wmjidY(ITzck7p zK|dOlkEg`D5l%2vc@i2!4pC2h0VuEip5|--a(@?cLu;a3DW7bx%9i z{68*$!R?!fF|$p3y6xt3lL=r6K<4$OLQ{;~)V;^iTG(v)>$CX{)#m~(AFeNF4Na}_ z>%uTFUcSV}Rxo{lv<^)zNP&W?W3%`CZG?*9jb8-AN?k;&_syoR@lV$n0q(?aLmBee zPoIJ&1NKtTgZuDd=S?vf1%+G93E2+VD!4!%+=)0kVsoVnqJ))A98Qw5rz%x%%Ey&9 zaE-DTOD$Eb1U}v^a*dOLtY%z9ktQx5wLtKH&jXq|<3E{_H!I%q`L*v&H&%b;2RHNa z)LRh7!PlJ$*mq|NnUW$wzQ1Op`dN%gnjP8qshHPJv|77_&qfH@zk%8PBvZIDUeKC^VzpVudO6-8pf=L zA15u{&+$Hzia zy{WKIa`|Wc?zt%650gtu#8?a;6ZC?Eay*tfC|MP?BT*nHj!)l+2fkaSv)@)4Z*(-! zGuI&{)vb|wi{A6i=tf8KegJm23o4F=`|J2*B6xXXItn(GDH!Iu3=4U_fE-aW(FBBB zEYVha6B;Ag%a2b5;TmCKK;(Rl8%Y)`#XKmQJ{HWv?U~?j&&-DuCGB&H&R;_S6ha*L z_vau7EKzV!`#)=i#XEVPe6OEV`TZ>{(Xfl=!}stildlf_v8DtP1<0ehuW#30W@F&P z{1$%=R|YsMk^C-WBhL{z)G{rw#ZXO&2!UZQeBNw$O#o-LWvcPLW(WEH*|X<4$-aoT zauLcC>?kr;&cm%2sf#IWn%=cK ztuq62ktI6T2|R6V-;%z#!+DVg5B{-H-}MIw!YY$XzUI_whsyO~UAX7;&z~GF6K`!H zNRYi5ZB;5MoQBS&zj8TDEicLCR^5N8EnM90!$b7^8{1E0yzz2vFsHT@1j4>bKuBrH z@RBkHE5Ny#)(Ibadc;qy!@w#nfOteLd?qR;7vAtKP^{HQ#F*#_QW}?y*Q`)uf1Xsd zV3&HfST`=WVOGq6A96MmMM>~0fu9fl>34hw`FpmvCVp#Fi8c%;cYd_B6v5zTPhy}W zyWJwD-^vWK53=s7-*Khh)TyW|KNPD@DXCH|1l)>T&Us45 zD}ctu^Oi_1oo{o&T_q zcmI8moTqG6e5Z@K9s)CK-zNE78w&M=CV`IoL=tu(L4Fy6q3snI^-f+P1Z5J#!_hKEu1;_Ic@tE!~h z=9_PA0utd?3!(r*mogMDfKOx!5OpXZOBfFuazy;en6#*LYUUDKU?&EZ7@hZ@R8n-v zUN=|_s$ANHwRw~)n-+ZFbwW3Nb5s2QRFJ3%X6>kTpal1lU-gde4b566_Y|eu=uw0t z4znt{a@_+6UX_*1+-yn!wJym~alnDkx#&8!735wRqxOcNFN((*qn^+0y~9&6S&&^^ zR8y=l6|B)np%o<-ew}PH-vx)sAjAUX(j=V0c7R>L;nspCUP$+1=sLN02mihsU&V7L zk~?AZTmrKYgbYGG_A*|l(0tgDbM~yIGxzg&X^L&{a|{sN2r!ZF<_z)EcSbjk%YWB% z)6dt2fxh^#O4!ExC&UJeJ0!?kL)!V!?qDP2$U`V^I!lnq$IO&tYGz6l?+)5!xzBp)~e$eO(IB2>`kD4GzvHKl4&Zrqa`fhH5vkLh{EC z1uaj{h=>ildk_BGRj!plb85bEDq6~q&=Z|bT!&&8Upc{P`s3{?GVfG+=yAc$g~Pl& zYAX2rA#=ap(SL4=U(n)V8i0@Zl&GG*kr)8D#|7m(YH^M%XR)Q<`q}D8KFo9XTPZ57 z?sec6pl7fLi0e9m3*i%BYaYt~c$ZQCWy7Pgt4ce<O%PaRWtw4&1V;~eq#Fv;af`xUGp==#f*-?2 zCUq{)6k=J$DWwf^N13fzV(z`lmKT;?1+5)BX$jzfOP*E){H~(O(M|K&obHWruvjpTucjQ?bX-o^wtnar5H6$$SU&{ zyLC~S)6IVU&sTb*gL)Odnr7y7+?3flcv-=J7sD-=rJj_iV_n}>b8?Ku@*YtDlKJhF z9}fk@0|#Z($Ip0>Gd?b8kxwM7O3y#lDfu7^L5R8j00s5CyuV;%<+q_oer+FJP6nEG zcqe_YTY`Xk^NsJe@H+HIdpp%8unI4OMt}2%aLKfiwj3rk3OXb~ z1#?zhxmX}Y963!6e1jiLpZ3XJj0opp)68A+HocuCTh%z5mOvg?!8Q11YB z{+qXPO>?sglh+hSOM(xIvGM`!Ro9LCCL_L2sxAIDlab>_rOJTjBHdpm`Nx$SmPy6? z3D!wr`uCf3`ywjVMX~(3F~QS$3i)2|j0k#^e6472QILEFuek$9dm9*IBsCV&;&H7Q zBB~OH4JO{pt5xz?FIt_~s@+&jpgalcm*w&6s4z*hvfm<6$6E&&?GM^T;Q`+e4an*~ zH!-92u99t(SLUWb3!SJdGZ~+2<)=PLBF<-rK>hHHDdGO6FQ4m4AM|1BQ)WNq|lOAcssXIC|p*SKSa`#>Dy6TWo&8L{vVFXRO|>neBUl z10*#qsARa};kocJOa-8v1{}^3G1jOU2#8Wq>tZUU4Ip){Ezk~(MPPTVcHHXczR_+* zLPOU6TUA;V6dD$mZT4eMZN{T1?CJvmz3V_Y%PdR&(bJ;@s-2gdhJk&Ek|dl`cuB+% zh-de4LqI%pfuEiy74_I1PMIjD%ep9NSqQo0E>e*pC-Hs*?%P<_Et}9|;`B(NqK#hV zfgeu|vO~E3E^?>1E0qBVR{dC6TPzTC&G%INJ5tN7t?3pd>H;J6b5Du92z(8eze!F#i^Stan6nz z+iy2sxU_N$Sd5Uc=BWA&(M4>ecL<{Vz)~#D(}qU68IB<vSER+mSbhFW z&CJ^J5N+bj0Bddmsb1&GHd0-~MX9C@-dK+V*HXV54@BHQ2<^Q#DOsJ4`zDXu8Ooqx zI9R(NRJUK%?Il5%OXF6&zyyW$+w{5me_U<5%FL^+>%kmBIT9gPT5Al3CJV%Vh<3-EB(G{V;u3&7tc{O9Fgh;W;L~> ziNPA1@Z+UjXoWb~Y1Yl$@~>tV#Vr70LvHi5mt+VLVVR@rf62!uvM zD@#0$>SZei^VY*=MytgcgEgOW{@*33qm+UBgiB49w_R8{E$EPIjxy11%M*BGE8sr= z`9tp~0s(Dg-v(_5L$l%oYy==(eHm5$lk$;I*2uT^%H*RotFy*Vyu(8X9CxDoFZT70i!_BuDS zh!c;UgxBiI+F);XCUC0+jBLDpL2@`HB_ucUn~^?(5Cy{xE}@vF0ohh zWdp0*yudgr>VS7RLP_^5Gf&_i!U}73lY7S_^Vcl8V&OcJOUwAH{NnYN9h%-gFs{P# zxfWz=#Z)JYImUDa3EXluQ91d z9c)v`fsxzSQhU)g0H+Mha3Jw#j`5z>{n$e-?h@X5qi~va73rfmA8Puy_tPim)B3)l z0#_4?$jor%8m%-T#LkUq%1#OdL#K36+ofe=FQS4SX_Y2JzHYNdTHM8o$;bg57qU<% zJpsId8$nl#Infon;TXH7g>Ac+%@jpV)MJ5UHu>{F9V`OM>H2RRtOS0`AmIHBRMPJa zgFrBIF-BEP4<)#VMwy}t3QoHNaKmFq5A!fH-GXy%GjyMT6&7_*>rQX;KfKOrv!#&@ zg^DLr!GJ3f9Cw~8^|svq8X%7mbpUVZ6!3@oD1-4bG8L-tPnpJPFdr+dhJbGj^SUW+ zZ2+82)6p+96dlWkU6MXzoK`=}1lpTtONVlePwk||FG)1j2=JmOduIJR@|e|LM4pm% zwYQaIt*VHB@1y@lmNN9IYGdw`Ub=tj!Xph2>}4U;kIm@Ixd-gXsTPYKit%em(BTWu zT_u>8@RM>~w(?rn@1?~>M{boOB;;`kQl#&KQGDb603vD4O&6{Su7ujB`xRU>h9UxR zFdt99(+75j8Rzm%>qPx2&*k9ZiL5}_WgK)3Jbs9Qje><_o z8+xJ>?gCn2TQ<0y=H=x?9T^1|3!76}1J!4O%!9<{A1&qLVbm&rnj?RIV0}&;%D%F; z;mOMTuHkdlBXvcM3&ZWxyC!6- zo0AsFN@70^sA8GbP=^Bxq`!9B$T)~p3pHV~b=C}kIJZmFC}rlzR{-AKt#>(`|3MFi zxDVg!-uH?r%L8^uPH|5P@QaX86qf&Q-%@@l*KD7cSdC56qXo?}ctWe*ue~tc_8_9R zx#{BJVrE@cSnGC7Vjatxe~%+GA}Sghd^Zy_x2hYc>ENC9ocC} zzD5i>iA}y-6XJ}J@Zs13@1>ID?LX190K6_22;VUvnhR)1iM>gUVrH{iUNo0s-t;>c>QxE6Td zewlx5${nga#sadCe=J2xlJ>A&8U){PzWBuOd>o$?h*v4j=SmLFEu86sUPG?pm(&|^ zb2bMx2jSED(i`Z$vJ^{I0l#0Ksm5IB-_KeQ0w&k4;cMtKJ6j$XV7{rv50SbIJ?8_d zF95bYqwEDV>pWhRX;q4!zt!pCy_DkC&}^6#OxpS@WuYxhlu>@NXH6;bLorWq#cuM< zV}^2i!8_`1C!u!gJatxI+hx9P)<5~;S5o${EK+8)_G z7A+o=oxYcY;)Uc$nzZYQ5>quAeU1zzf$SAy#|eT)PkxoVUGqkDI1{r4SkK%EhpbRF4sK-;E-_A(6=oKZh^dB9uL z&mU9L@chAC&<3hTlb9Zc^VazK>?x;Zk42k6!jltOtdtWzeDe*_`o+Pit=}^{VH0K!6y%YuNUG( z+)#VWrM=_ON|)FtRJOUlOi9I!-6W_1Zm*oV#SK;nMh7;A@`BfTO>m{Y83HXt3D7xs zkYtaF6n+sw)9?%LnKV*y9>9Pei6&mZP~UE(rr>6^C8*Q#l} z{LkOp8q+_@v7+|XpZIqc&;1ekNvR%3^c~`pwk%x0ON5_1l*&2w*8L`h`VfVb*F}qt zacH1?Yf}BYJ{B%^w;gz=72sFyej;Cmau^KY$jaNRH?CoVFmfx_qEKCnsA^R@mUmqG?Uyn%( z?@fdRjusDa=7DQgvJn?b&;$(fg#B5k&ifO9Fs+7Q$BDc|gXVG9PQVCU=e`2_#*f`@ zKG$){1!&8hwNg^2Q(d?Nlqi>MEy3^1-FfW91&Z<<`7X}R_;tg=PCcTG|KzcUL`oiO zHzN7=+wuRr0ybP8fCL~KB=^mp;ROzg1FoSDOWC)v&n%q6X|a|FD-G%7r@rMZg0PD#HY1>3`)~zHT;$|=8>uFTc zSU3lPq?-=HTCBW?Q_M&8amyW_Y=kqj>&f_BxeFAM#TkIDH6_L+U0lLx$Xxep{WxY^ zD}}MI=B{7ps4c_B-91S*R9iG=hcW5on|TWFK**T;N>R$jo1?=ArTa3yeV&-4A_*Ge zIS_P-C2AuNYBcsz88<4CR*R%xc${-B+D|wVt^)?TK2W}7P80zs?DeRUEU92@Y)|wP zgq2q%C1zY`%irVM7Gz#5v9snsT6MyY=$kC+J-J!wLo6PC^}7|>wAp(p6ZTm#`<5)+ z;Je-u{<}Q}v^ghjD*Ulc@v@V;yUn9BtszJZ^$Wu8o1TqN*O$MwL4v@{9tmKeY+xK? z*NK{qNcM1q3rO*W6QcVA&yDUqXC#osrd8j+0^F}TQ7XK~xp-jd5Elo%%mMO|>*Jh| zpYLR$idA3R^ytAE6rQ8l$MlFl^>*k=M?a)UQES9U4D*JI_Ck>Jbn8RwE)7`!BTj5x zfcgHy*)XtG^A^>-%h%z%c&kwNC?KvU@>SX^i0UW0KUy3P72Tz+}8w2wS;Um{b&<-{Lq36P(8 zWjy>lj%9+{9n&MA$C5$UuOv_PG?RavLJEY*Y++CY6wt&mfsGIOF0B~Ib>H8qwwmH5 zu*k{3Lbw_zIM}MGi8eTFu!~PllM_-+K|VwWEtTu@#?7A|D%2^LCs`LB}NzyY-TwxL!MK_<6{pj8}J|O{=-R@;T3rEVnF1iab_8^s9zh>8Q#dv2 zex0l3_~a^AO;~^OvlT-`_iLb#p|MMuwJ$Q3=wSQ~Ki zS4D8e6X+A8ekZ2&RgN$d-FefQYuUPQum}}tZvGgm9z8pUebn9GQN53-zj>;2EGOfp3YkWd{ zntn;96CP*wpu98cOQ@A`M+YUjzBv(P->P{eW+ zuQKu*8~vJ4&@7I<8}~?mQBfvwfCrs_iLq{}RneSj1xRNofpl~}xbl7yJa^^h#DQGV zl9n}&{uo8irKk984{$Y~*(eydvMj|Y@->KIUlgnq6f`wWtX=vW^~{(~fWnGir2pzN z1MvUMufPaQC#*H#DEda%E@(Fi5fLxzZ>ih0`TKjccH&Uj*i1TuW%fC_$&g7NHl-+~ z`tYEm6eGs$Kuf@!jQXfTs`G=8?i!X#hC}<5H-15y7gK2lVm*_`Ao?r47RpVPQFMI_ z^Rn-GJusfn%89|p_Mj4q>gQkDG*@rATfRFgK?WIFfk<2bK{-@+Ig-z;wAC0 zFZ<#T&DoI{N}>2qTsoob4qpoI|2)$I_vmw%lv~8*$4&838_Sj5T_$_}t*2OI* z(v-3tc|I86ym{K$`3sNqdTrKRn~Gpu5N}Sq{WnX4#Yj!JDc+?&Y@ykF&tb&vhrN`U zCA;o(L&c+W=XH4``?K<@Q}u*5abbz9P&3P@cWtZ>GGt zhqDSm75uE9hxxf${KYcEJHar?B~&z$mlpDZq2`;*7IJ`S5H#&MH#vX1b{~gqA!yWA zP}sB9wXS(jwdgn@L)F`{ngZN%yq!9te*VlxrNnEiR%T}Ms?K!vUxihhv=QPhU$!_e z0I>}#8YC(&VH`H`m8DmF?|*SuQ0ia|HkOL=eT!^xrX#q;D!)wR$e-TS6O5Y6BQ@mjgAZ6~V?pF_WHiVK%dcwni;$t(d2}U@MDB zCWXIZmyCunsyI*V+Qn8edPE`o%nVAk?KeO@$#$d9(fK!0fX!VM(%m@J#ud6 zRxW{L#~(vaNL{rxPwS4a(Ga22!H+!eL2*tekz5_*)e>m|DtHDvZr4GQstt?YeMXpG zvvIBvVjib)tuvVtFaT}tbFbYgF}27VK)c{|jX+QKE32(bboM?(pwO#+qcXL!va56;^YeAG15q{cPUf z4{{Jipv4OjtuGH;IlEkFTcVm}e5w{qAlTj)-+A=V?iG|cn8Bt%WP%nGQ-qo6_2JeUp*Z+hu<{{-%k0MEz>Q-7qkYFw zawF#&4iI$Ea$8294#tdsNhEMG=abBmlSp8Y$;#R7=%$C%ZQo2^x7|um$}7`hA^sjbK{3U+P}Z+7VS<``WJZhneB17 z?vT4Wd5Uq0MPAS=A!O>n&N5tn-h^_k{go{D4O2e(2MDntM+42bW6~vBS4ihftJIku zu1Bba$I=|X73N6itTOD=OrO~?BKjnUMQCaK)Obrrd3tRcKp{ zF5|p#x~ALO7TpwkQgm}opp@X`LyfAfCUd1rA!>>P)O+6_?}r2CPl?Ntd=>M=j=D3u z-n$#oJJs0{vCW(iW|Ldj87?I8dH}i0ECCIv+}#+$7f@r1!Qi#9!G7h5gl4;ia6xg{``qjYG_G}z9 z$m7)&u#!3MV**$Uq#B6SKEK&P@x!7o~N` zqBS^|{XqWGR9(Qm*Pi@aLA=0#|Dmxu2+_XYHN zqoav-luXd8IL^I3YP+Rtaq4OIy`I`wQ)Ttf37E^R<93LR1phwjyJ z)x$Pq0_Q2qYI9!2M{M*}wvv);Y{m(E3`9e5P!eF}z+R6>m@ft1GRMHArt7vtj zV!K)~V=T&!gQPRJDY~@z8ajgE;R~H$hc&=E&TRYqGeu3k?IapJ53#5FwC?2Un%8TD zTYM^uV@dKG0&+^Q`e!Ce8XEN-^W_#*6y)7+deivZpMnKB;H&@%Ljz zB^?F$LPJt!XSce5=?VChZQZ>Q8U77FhB!oa=gx1^>)f6N2Fs2ZtjnEYGcc&S9a5`N z2vGlanwS2A%C!>G-7V)~0x(9l0C5*&5pZmIfHGPFuxR*pjsQZ21ZX$A zQnw*}DF*Ww0NAwd$%_d``gkao-mTGKoiXiG&MA=0>ACR~L-Aew9RY-ercb`m1|C)$ zCK)e-wA5viAhEW}%+6S7L_x+zwCSajIHS+wWbzp{8MeF3qrJU_aq=FY**WRetbptk zZXQj4Cqtf~IMy=ezi7%Qnr)w(1e|%2sYyw^FQ?nKmZ$Z>uJZl&2v9>YxL@K|Hn&^3 zAn3JVAU5tBTUrfd)XQ`AoN59c?FWF6k z+O1|uNhL=d%kw*{S6)%L!eo*;ipf4>?mA=dhezs)HC=AVHAp%FVod)#3X?oR=6TC9 zkb=kjW&}#aeY!!pWR$y&SGu6@Ub7je$PAXC)}0Zg@_?!edlDBFvu&T>Io(cEbdT6qnn)>*O?yA}w?h8k)d)LWYWf)#{;kc62FfdOZ_KM?r$#V%w=LJD$SK ze1s+&Uf~I(?9ZbOxRYYa`I4ADIIOSs-_IgTa|@^?N#M_#%_x!}CLC+p!8P7HZ4dIm ziWDY2VKe>XhVvU8vagYL-Dv%Y7#D!dkUmyEa+DA-7_caU%8jzDI1roMTXtz~81~5q z;S8BNQ}i?~Eo0mPliL*HtT;MYfS_FR9F3WsE>iYV1F01tWjnsp?04QfzC3&E?bCK! zJI#%tV}b`I`pPMCJlq|ibBRC#&DR+&wzfOci4QBdss-teZgbo9OA6pFqr2Hga!s!) z2@C&SmgiqunXV%i&oO!9{hr;_6?UbeQhvlxeD9`pM~%QT)K0Vo3?Ep?I*+ar9z!I_%GUp&1z{xdB|DRJ z7^odRM<}bxS=b#t^pAF*@|qo6)%SUS8-0Y>9=oei^Y*kF2~a!~6pK!>+-1SVgxzpD zPK^6<`7DbJZnHqqDT9xk`nySpb)hOiHom}dQ{mZ-$QKZ|g%KNRE9V$S2Z(pM*@&A= z3xwnf&`^?6F{Ki16RsNmh$*GxgRgPUzQSzvl7<>z&*Y zhRgcGa11T`5s|xl_j?_i?=JdbK8IqS-XtG!SB1)&=X%=|$sv@7$sWzlbF394)MCI! z1tL4JV1ja`c!AIHbkr}+4h>Z45Vx2zmGrA@vgnux3-VC?nJjfq0k+YERE!B$dML9U z-b*Rbg8@0(AIWjOhog^%?U0o|cmZiAbwF?Ww&XG6FYjwe`RJWXd0l76a{rH)-&mNb z;T;9T#vmHL_}4}snFHmxPY5XXG)`K%wcS1$8~O@AE#pvKWRYulyGzEr|8$r6X&L)7 zEz$c9sh3;LYyCHOxL_U#=zak8iSt$-kwBuz@mpzr9N!4Xjt+`mU(c7nG#guxU9eYH zl5bHL2sAsTV}y7D-HsAQRPOH-YaRs%GLutMae2IjL?e(oJt>0ZdevuSf7Le%RAt7! zSGYN=up9iQj0Va5ybHag78|Wrg|e&v=c`}#Su#Rl z2Q9)JPSfA2#6;l+m0sp*?+dX;J{^!w?s5M5F2Rpd>F>oW9kvKy02AS)DkMt;`xW+ri>k(jFNs02S z@U|slnS<(K#=m)ZZWuwoW(QJS2}ewrmrLdibQAQ{h>uZgKKv;uOD;HG705)te2pgV zqgj?)i-GFz=1;1xveIv%^WLASP}#EqV4(AYe)mO2AaC0oLAvKC{U%~ zN$ZW-mU&ShCCcgJk>nd7!K!$e*NhQUujo}?60z%|cbO@EQoKx-YitGF-P(QfsYQPt!?YZCt3xT}aJG5{XgS&f_i(!AJKUS&R zzbEo~i#B}FQDOU>;XPwwKxYWf`&wACswhju15pN2=N6d2~NS~#% zy_1oNDh}-*=O+TAjw@g?1Duls1ai#Ty;UoZ04kW)_MbYdnzg%&lGX-|bF&|`fZ4*S6n#+h3mHpb-Q!{$cmV?*Yj$+$Lb=~U zxdrERWS9?Br`OqUS|dU|xN~jPYmEC{y`z80W;GN)I@?xNi*%L~AlTpoNS%9Kv+Qa7 z&^QMkiwx!0(``bZFai`cL6FLQ5nONlF71s9xbn{@0Bv)t+S!6kEjdOxg@bxfF0Y_2 zYe}B2Us4zrnBW9>@8>Fk2&>9*!obZ72w}i6p^OTKGwWmp*9k%6UFOT9T{ocsKR5&u zGiqzH_iH{XB9D7`UhVg*c_ZQuYG3a)3|Y0StLS%zdJV8xEjxxHplAlp4~CP>;WCQ7 z$hgp<8yfWe-PrXRTxNu4f{H+0Y3G(Ypy#CqlwMr%F_RCsx0`xixMB|}rf?n0%m~;# z?HoYfq-qT_MaM18I;6Hr2hc@8=d)SKRqkU`Vl_Rm+5{o6c6~3 zfVV^de4@sfz;GoG6459ox%9hlr+JC4h79p^Le&SGg(q6eIDxD-aDuz06PF*NsiiDRgY62LGrJ-5=>)+WaNnNjEFikYS?$xoff_8{l zjFqIm@muYOu|gW-d5V@cxXf3m-L`R*TKafq0J!|vJz|u1RM}eF<5C+9If|jlA4^FFp zs$Z|j$nj}Bn5kdM$z!VlYvd=WIH8p7py>z;q0f3lhuDPQ*9SBpe>Fmw7{l*^E4gRr zkRioNt&$R$vN7u1z?*48qS$WBL=o6yTb3&UZSmwJcysa5qdrO^NSq05A)ToliTHYB z^d~lprL(al(6VOH-Su?*bFU^)L14o9^-sW1*o3SnfJD0~c1HNA4rm#e0U_q=)0bbo zJ4wf+T@Pct0?#yQ>7Kp}xk1{0SjEJ@T$dU33--W{ewZ2gDP@F)l|G~Aa$1abZa-SD ztocGs^%rF#;kEx}cONAVGB@W;C)4L2U#zT_m=3kWVTalgQ_gdr=Qe+E z?5ikv@5T5n>Vi;;=q1{ohOi8p!ZJ@yvp8;8z#@th9mEWAu+)=dP8+khFYpz{O_YHr zaBPB8DQ6I0e!|_Pr=EvHHQKfPVNyMk{OZ;i-|@H{OAuS*GRcyS-6s#=4uW=hto+^5 z0grB!QP{T5dU7-;*J&u5MuK^qXlq@0XsZYvx&uvcj@ZK8yTHcCni;crkx~V|{u^z} z4~cXV0-`U}PoDsmDkHM5my(1z3&m2M{3-SFvG^7)-B){9`NWP)9=p(bK!&M@la~9R z-k53o<;i=JMN@6zrGr2F_H8G7i~Gb8D!z3Sbs}aKOG`suOvoN0Zg#KT*Z_yNAePEI zn~scMDePF7(#)&Po%gh6Vr%ebA5`}O=r)ghC5()=0fmU*fCaGfmq|1IHI_!aJDpMF zD*-oUrh^=B!)g(=e8t-xRp7AMk>x28$Km&MIqZ~|n#kU30LG3%nGfVDsZ~`A3%kZ% zUsv_nO{QBOD9AuUH{E@MO}UG9ek{bw5!LzeBlj2r^fFvda+*SL6%EZH(bmYkWY^HC zb6VAihnGSm@G&sR3%yA|f?V;yXC4N=cb^39Vn}+Gb>1bOJI_e$yujhNA3@IGF!*MN zktu|#*^JqA&VsiSd>37+zV#yW&eL*^U#Q6tiDIc$H{RKAUl$~rTbPCRix^N$+r2v} z;FA2;I`ADKGZQo9B%}B)S3s!C$PmH4!X7@^6Y8-n?K$XUFvBypnN&@Sgq|hw2}FE4 zuGVB)6%`X))N8-${?z^fDc>Zd7Ww{h z+aS<>c`}<{8r45LKaDFk?2e5=D}rin6=5VyFM0aHmR+I#N;JS~VZmtkM({9VCg)xr z*{j}q5AAyYk6(60gllKV^Me*950X(#8)V-rk&|)Yd6^BOf+85x)6QilwgSp&X{Ck= zuo(fx7Hv*Wx_2k|OClmK^T*Ft1p)d#@_^E-r0x62`$~fY_`{L%o8ko7qtF+}P05yF zV^8X6vbf7SYsGuX_or4AAoG-q#&df%Y?=09qIzCk<3he%D?978($S8m2K8r#>e^f@ z#WWJ+Pdk6$goVR7ZHIPfP*=>ImfK2ZsgAR{Cj0Go!{(t2J3*=zm>GU{koWRZ-Z&VJ z4S1`xYtu>9lO}Mt8 z*{$Pw1aot}q(OzUx$qzqC}uUF1P*=$DZ&hw%i*mA317;?gBw$qrMuruDpL!D9G>-Ogz^`7MAT2|ljN(T`#0RC zC}1ZsZ3V}^S`%jY&?x=+KKw~d5>i`jdD6f+YJj4M8nSmcvIuz|cJi;;vhO>B4HnuC z+H6}?IERIi6mo#}rqs_;lr1R;iQ`_nf4ZwOipDb3dl8@5Pnjs8;ptg~W!U;D&j`4Y;V@E(e8hJjOl8pB(u4tOjF0F7TfyRM=yl!&%I^#lGDnZadU?+W7x4oN8q7 z>XS4}`joj4f%qU8U@snGI@sncdPx8-mAS^MiXQKYn}r1q^*_U{cbx&AhLZ&1e)`ri z@q$*QQ4NQ$-)G`0ycT@35f)4SXMNCCuU^oK&SF~Fwe#@l#XMcVu*KH`9B7p5c1F!) z0B^(B78pcozGIx}B5-{jvqfWxiH5ssM2H-SfJlni4sqM|&!JshthaMf-TJ!!{PbyD z6ZfUK;nw5T=UIz(A-$ZwdO(Am`xA)GeMhR5^XODAL+Ml+re-I1)Mu&#<4(6fW)#a6 zQAedyR==Ey(gwat?KV!e@y~wYk>kG-bl4cJoT+9p9;Ke?`WhZk13WA#{N^bUn};v# z5(R#_?Bz$C=T0O;K)ioe+8kD1GBnz-$_alS+O5i zj6B|Ik+|o>cU@G#Zq2~*dQ)us@SB?TLu*)n$MxXSgWmZBxKyE-6bH7J@KZuDk-<4KxMK}XpF-aJ)Go3|8U5EXApy%-nP%zk@;zujU z?U-?(Lf)7N2GABU=S3Z;(DL9OV;`zD&uy3KIY9wDHrFRdI?%uMJ%ox8P;Rx`4*rMh z+=_WzAW*5L++p7izH>hip~riD;9o;cjmUZ)y)*k;>b{9JSL1`@-bZaGuPHTk7pGTM z`>@vn;>T-z-d#{C{6ym2(>EWCZjnJjHwSvQSwee~&J$&C&^7wM+3-6C*gAZMd& zSugX5vp_d}n_}||wg$Rn;Q&Fb=p$}tbcan_m+geLJ6@o}TLHdZ|8i+{TV=tG{J$9i zGh!soVOvZ3r3YkUpW{_Bsn^TtaX#wg>5Dmp*lJ{n=AR#a(ItW$kq`}_O4;GXmYORYpRPXS8CBL}Ok5_# zbs%C3+aV(@et%`tNfxtVL6DyOHUMxuVi^_Ub*r>zuJ3PF4O-bn78sYf+{WoiU6#CH zSwvuM0{MkX4dx<-M%?qG3e3AX$GOb%6%KiMBC)>|r|d+iQTw<$+gxQU)G--TWN|AG0vdIa~#h6j-(pg(EKv6Vr?WJHRVI>%dv30o&=KvA<6kL)Qs|puIp*>pKyhAJmRgs{PR;n z8g3WV6QZxFv-^!QkS!K`Yti=l+^0DE0JS;Ke7KJ!ayJ$kBjOSWFu#PU#hqmgXhf?n z+5oF-5x5j~F7Gb~Z10F(ztwSr591hBLm6YynfxeXxJZh9W+jr$*Qhm~J{8+L^QOw& z-ceF(TEMHlSG~{NJYL8MCFt}YgOH`b7ZI)+E4E)&XU`bv{HjTvdMPFk#^p@Ffq;mX z`)CSGM=~)36Uy`i8NY^crDN_*^!}kKwZy->iA!p0+ogH}@dbcaFXZ%TL1^}TB?LBL z>-OV~%_&gaSz&k~<>g6jatRbUakagp>FaZJygIh_$_fO$oV~BWW*x5cwSA@b=&Hta z!6iPkErfI})KP{qA7u0aBUcv4-$}9a`*?ynw|kT{GAbS$R#l_#EzC6(mb3hndcoQ7 zJuQiyCSex#yaO~+>}>N@QZnQp^+u;i7;XP0h&l6r-QSrcq457)pnu2^PU>{OC>3ZKjwSXNsi+Y+i`LG z*!7>ih&fMW4mWBiIo9`YXTR^fAcGgvo`(omfq}m`!QEsTDJ@Byf@ruXJDkZ7pukki zsK0*JGf(rsi2 z@0S%!#kf`!D>&G1ZSGzx1hWDk_5A$B`P9;E$KzmZX30A*jhL&j!n%3rU&Us?iuuS( zx*Kz_1Ycg2#p6wim(2c4{t_XU7ha7j0^?oeXc0;RB^gQ$N~Su}e`*RV8CB%Ip`?dH zwuJSbR|UHSz(ym)d}pWIP47gglSwgFp;3{MOH9nJHGag$j(Jd?aGn_ns`CTecJ?Pz z=sA}zYcp0+7b=VAa%WzRE2g}HbycCV<{Ol|CR-Y}tD87QGvVit-28||YIy7bTV;15moj+{bP-H3jF zM(0YIP>>+uxy2KVoiK1V9jMt~uaI+moi8MW>boD8Vnw#R7>C9(o`sYE(nB$GIGJGVDo`h?mpVBc z*xR3dp1q3k8SU;*+kMW}`e)UFoJ9Y2kQaVS-I)7D*)n;pe5K>FTYNbSCI)@*+I!N! z)_u(k-Z^B9~qX)@^4i&6G2`Ob-GVj1Y@dCkzi#3B!jEIkt3P8LPj( z6vR^4wAGj)HV`ocv<6~s$k$_SZ7_Uy*TJt6HbqD*S0+;cbQJcmMv3I4ku^q4s1gg@ zK4y<&n5;|75_E$lRs(QFm+^8Air*6wk_|-EYMqJj0~wu(^@6MyFrg2!sEN&oWd7j92YE4r`|Y(skRL3zTvz1A0EX&R1XsqXDin3D@Bm-*~Og zOiVVd*|Z~Ulf=r)8IxQwM>0BdK06fIPAuYOTVGXb1(-WJ=GloDnv7UrA^Gk_HJvE@ zd*M*H%L5L)-z4Fal&)oeqh9h{&CqFVYc1*I=0LBmPU9rx%i7$UBO{liY__=rZ@?v#v~GYI5BA%zXrq{L+gG#h|0Sz`w^|>bqGqG2-vPK zy;}qnU==M^PHOHgp)8wU4~yX8+xu)o%I&c@Ue6!fe^akJv3_xrjHFwiPk#MP?)0yk zvSLkd&3QUn(1;U;g?vV56jIC2-+@TWL_6q3FJiy-JbG;h^+i9NK0eFjE15fR0+G?_ zQc6-uSu6FAhL;J$6AIx^I6-p5=`;b0t;CxNrk}$1@=J1pnRws84?3dJ$5QJ_1Y5N& z5G?u2ypE*sC7Y@%7h71ICzMRsP*!>t5;1Sr!M|#s{j0Xr>>V# z-fpZeYDi~?l_Lgf?T@$0y4k|S7)5M1SR5s!cHfZNNq=CCxvq<#wLJiXyvo43*359l zbP%(o`mJ;&0wz;E{R4&!xnrVnWZp>zU^j5UgJ@yElD8ac+l_+r)AIu5_wn`yqZac5 z;Z(fAo)WL!Zz~38s-+{5%lk)&nTWK>oG0Y@wq`9%9*o;j&N*~tr4unkTpeVk)^q5$$AOEhce zkBW-@Bera)Ivv)8>f<>jM|6b`772p5j#gH~s% z??>l_WcOE!X)YPyT4+ELJyKQw;LJI1)yl<5WXR<+STVFLgay9fPFhgsJpSOT$}K#i zyga9TmdS9tNdq!+%G4K%Bj;lK%MO(NR!-VkYd2|+lJ-y<$^Wd90F%{rnnUCCRh6RR zSTz@+0;TygXUvr=(28o*ePN4PL`%yMxPC}-VTol~G z^o8a*PaW}hSh`2QwP6Ebci9RwUAr6k&Jq4SZdDuA*4E>Uu7Cs}YmC6NutKl5)k+Oo zij>=0Rne7p6%0-(!?mvs*INQnQNJ%P<{us5d)Up@*tCX?ybwt|P_h0#hxSS2U5;hM zh?^_5D|`+wj@=9Hm@x2b5sI1g|6Qk3-!K>%xE?0jnxOjMSCr?(vqBSov*Lg!4-)YM*Zle~vFmblB|b;oSs(HMv# zIix3>Y6&PR)bnOIAyez;S>b$x{+i{9GKPj!h>)8D~U z&tEwQ|-9-&i1Pfz_mgCb|5sq^~qQ;uz8=1ZPP z!^$EOss(2MRh$x4+An7qXl9L9HxVuM<~EB0gU=r|kuQhWnu66p^KXr;IG#|7e8vfs zo0y>Z2#fJC&To_ukexv^GP3id5O@TSDKvUXh6@8+^@6E?-XEzQ^Z^Ja3yk{Zi;=LiSOhWw6^(~LS7<8rIW2K)DSACVOtWX#R^?(c6*l0d$0 zAgF?Bb0S{<&8b~movB$CigxE`4tR9ma*N_`x&C?5QY3@gnx6`HW0B!^5qD4rIYtOQ!%71#IRQ8@ zTZCDa+V{%=uz@XAS6Pe#fYY}0#1N|w34j0pB4zo)2x?FF7z6OaIb%-OX|cy^-e}yE zEIN3gbj|MGbXUxLX9NbJ>C!@wIA$4=-pL0gaWyHa{4#Kf)A~wDqFO6`5y(7$UspKC zaXutEva=?0PpI1A+M=%mN9 zEh-8^Csk(({sbRexXl3%iWH}vS+BRC+T}YdDUvir5U6N6wx2z}zfslIc?atDjhi?| zh5RERN83FHJ9&uj_hijn%K(`VW&8WEN`87t%hryLp1DG=iC)@CY&7bGHxqYlqxl_5 za#BsZU~4fZgem=T{l=g{K?8~l1A*6Z;(Dx`EgIl}LGAA+6BAOJ0|W`d)smzen+^@Gm6oi|`>{Qm*oK55pNd0(m#8tX1U)*%swFqhN07)F1MYeKKGvYJahB zb@2>TSQGI~S@gIn(ue{@v*XHRRrd=EE@=mH995a{97w8*f7u)!ET4R()Bh1tuEG}r*% zP99F{xfVuvM4YZ{%<8Du5GI#WUx~_|D5LwKLDN=M@7uMY$8Uy9%X9tt*|j7YOou~b z)&O-(1{f+gvx7+c`u4oME8-l$F_GJKTzV?=t^trJU#A3?eyJ`SpPQ&#<}kpV1_*;xriK~me;NbNFMJW1`0?&PBFoTnf!u*^L|?;RYKheH9Zf}lMgtgc_Xv((2F{$?;! zUM7w)47fQ5D{hs$Z#>0Esb?}ABzea3Cvhjm?~X(5K7&_p#_35D!O2mNr3) zqnX{7=RbI?4HUbopGno`;skd0e7c|T{hhVw>zY zgajZkeXzZ(B)J)~)`KBGa3DbQe#g$Gh50|p4-?bQe@v-==r70dMa<1BIXK;(G(9#x z#z6a`8?8P5^+RC$kZ@3h(+n-)M)b0+yl2GoAc^PC@)^mc5y4Yy^k+}JKiZy%Z}Smb zrw|aAVp0shArC65;F3B$;OaEM3F^8&rKv?_>=N&VpUo-z^W7Zmik9DbKGFv7BGGsk z%;z0U?Gupj?i*bk564XZsgj=biZz)O)qFSmhq&=4w(B$#|U z|8=qd!hsR)k;~^gCNwgGO=h-(O67Q&Jo%J&%U}55rx3ovxAGt9_h15d!yeTWDR?qu zrX0Hq1Ht2UQ_q{KI#sD^1-<=$>o=!hFwik1^p}EA5~PC4{Wa!)sh+YllUEXibQUyu z!mCw7FMf0EsJ|u0xo9{6X-*iZ-|1weTu0!KKKe9sHhu&o;t?OtJ@1FV9@?|dKbfDT z8C>{3Onn7gRbABWp^=jA5>QGGosv@09ZD(4D@Y^VN`rt12-4jx-Q7rccXxA$yN=&? z?{ojbUVHB~V~jD!Y%}!oD(^?^g(C&Agek&u&7$`eO3gV&E&^cy!$=Rrio8FkoCU~= z+0tkhmFRyhL^{JkdN$JN`C`IJ!0#IkPDl^s9%t{RDu!!e;5Y`C@8R}U|x#92K zw4cU9HSxN_e>+Xmd{y#kBpd_F*|?52nyVLueOJCaRS0}aVSj(YvmQY4Q3uoD{qWvS z_syAf&@hAJrXsoPoR#hp5=0!4dSt-nSa6w5MI}dlkyX#cstAPhy6-s$3@V9ClULYE z%D)V7rX#;fe(?Md3i=8reU)Sun~>p-P!56DNlcf|;+YDW0mKg(#_=?vC!!LwrY144 z-~2A%y=V4qbybS=Wu0HlAUiw|4!8e%@!%4TdT$QwTwd+G0{l$f9#q|er#$87*s_o9 z+0ui|@3|_+YXRykk>mV=kFl5rwm@uccJ%W(+hOSTRKyEVjDq?agb#?VT)?J5V|KXV zB7ZY2TFVRyFxc8X--#A>HSH+!q1kepfc| zKc$FQQ%mh3O>$GbrY;p=npUR~K^)HLUzjLK34G0eLQz4kap>;?vr795_4Rib^j=^! z6Nd${p?;mu6si7IAFHOz`kTNA3dgM^V*^uL=!CR%#obr5zx7Lu3{rkAk@v8EC?2F` z=cG=lGe=piw>QezH57ltNm3~c{P&j1S(Fyt5!7tojLPOQ!W&x=sr=i>Pg8A`63aBE z39$k#jPWqw#7spS31MiZ@6}O`hv`x7k)Y={-yuhIR@icf)QKo!A_=^%B7Pt`B`V>a zLy@$p3r00^FWS#p9w*N)FuwpwEmv*rz=$>8j~dV>U8majSw<M}scTe`f;ClL zr8GK1WsZm+I6B>tfqe>2Gw^Rddg89>H8jfutrOL{P=djz!VkUh+nS;T%n=_;oA`z%z$Zbau`dyNdA0&YFwe&F@g+f1%;0 z0Zxft&1P2Y8$i|^nz%R|XUbBi)kM;p#$pn$;w|}ihdbWZh=LKlo;hnte!$cw#jhIo zO*i}=<+sA`reAKl-aT9PL;f;MVTs}C>Fe96%iAQdd_5!gU`(+u z#9q!7!tjrAW+6-u=W=|)2#P!Qn3De~?$*JwC*_%$E)Lxp3>+G#?L2LdMZrQ9nlY3y#fOUK5oj^R$}T5!qV_=fig z(od;a>h()oPK><3^yF=SN`H5+e=N16^LLy|FLn#N{iZ-=`vFs()Gi4gTw7msS00s)rpqiHYrJ zCzuUaPW3^@Hck*)y7(7qeU+yUO?V6qc|gb95y~!51TNLG)>l0uEv3$9n7fgAY_?20O7=hZjww7=*15_<#yB0i)i#*FAtY)d@C*Brdfo&IojB>F)Gh!ov zLT5I_RaQ#*p?^tF;}MrsH%QC>lvW2fl|^!aJ+B19n>XXkGece3!Z9flDPR>k$W<6Y z;UES1EI1Nlpyf*HeUI22)bYn50H?5hdS@8KD0zA#xtM=?W*YkuFL|F~5|3kPoF4nLUV;w(djF#Yc*TDOG!C%WFp9l^u7t@*!-TfGVd zNYf}RWiFy#P;^s*W#48vL7W%4d+-Mz3_ctK{`hxx_V38U*6^y{JIi|CMP5P;=T}TX zF~+kqBFl`r*Chnq$hzI?rpYNE7=U_XQkQYvP3kdQcc4=WAoyr73p$2qL-m>Jv9?j0 zNI5t}ALh}wto<7Q>$Aup1-0)``rg!AWiwqCr)%4?CY$f&IxCJ8EyhXyZC?4bXVYeD z=sPYLnrG$A*N^ZNude~6d_?8_vP zIgeKioFf7cGh-S~Z>@J)_?L#$j+&2-IX^#rDxV;hvMLiEZ2+yHzpq|0>vunLgu(pI zcct$?4W?(FtereEKm@`jhC~>P-=TJQe=t?`0L8Ssq|2b8jZK1wH|M77o;KdyuS8Kc z*v>5B<97fFyzCPG;>-h?mid%cTHP1h#(P3X8m`(6=ow7{$n7N6E3NOT zh1b}V)yl#UM@PSyBqwc$I4WGr zN(WD^FKXocj7>?|w};HX)?m`7eZ7LkGW?%+&*p*3PPfun5j?&#;5a{VHHLW&LXHYg1CJ9J%d*AqT z8Q2bRr{peAE!6@*z*8NI-@^4bQq;7%7zNHJk`S_1#geJSVljkj+y?>EGk#uc0!l!-DtKiCn)>bC=nY*PQvPPGF!+=cy)rEXK z$5#(v5-O$#@ga6OKbk5EXHETdax1U&f!)R3V(vEOEwVa&4u>*@r{)9xI_Ls=IdC(!e;ylkq0%E?vhclY9ZjaF)Q}JOm zBJZ5ct>sE4MzevXAE-rNd8M8%?X(Gg$sLMjE>{T9CeP28BGI=}p>|<@yw5u;QdC(y1nAR&H?MS?7}SfHJew{4z`)H$$BkyN^11vZ0@+>{%oeb;3~a6jub(m)iP z&qu4Ht`+pOoFfgu>8Tf*rvQh{KXBNz3Zsl*|H_ww|9RH!V4$-MPw9F$Arx-bJcF78xrt37#F@n8`g9dz1 zYkvJrW~)bzZHc0$yS?H^YXbEj(3F&VKLZKm+D_=mFMF9bYEm zMGWeK52QGMQB~5vPEjMrHXGf);C#!dlq@rx!x`ht6o)e=TCVRC`b_v;VrDv8a_N-? z*zyNkfG3r+?&1S(^9w1Z;Co1(!FeM&s8Y7=8Vr|)B1B{cy%${2P)E;!uPA1v@BLc> z#0XH{mWfgc{Avs(0U6x80=BdVdf0COS9E2=c0fb&X@tW7dxlk(-$fBI9yr?^q`PJlao4_#=*bp%v$a8ZeH|RD12VU!MJ`YA^TI(;*cS6@CS3{8 z#5CJER4@~6TCd=8z9zTu1v$pYq=1<@ZQr22BiD?Y?BF}e`DyK74IX_5gOupjjy%aB z9Rw9pKYap32A>aRiLX$kWJ7VM7uQf)d*X3jI*O`CeZW3E11=tu;XU*Ay%LSX#m3Rk z%i>>U{rDWw0xx$=Vk@5^K!#D~pKLhW>DqHiW0Soe=>x;&G_KbIUDIl!61JyPMqwt& ztgNQ7CK?Udn()rdzW4dM@0uP&AVR_cg=Cv6zKA(d4m)7>j5_bxQ;e|=-aTTzVz&Lf z(_i-t;HQGjj;k85{nfB{<~XW!bcA1+<{X7&p5R->WJQUSlk)x@KF|!mC#eMfneFXQ zql%lFI`3DQnT;tcx+rWunwGvmrvAU2S}YbEVI3~vXaLQzAa10o&xyGj#~mOLZ_n;st; zU~95r=@mC;2A>%qD9bcgkG5b-YJ~OgSP7bsq|G{tm*ckl#c+AgQ?Cav)od$z{ zUvGrfTi($XG|jH8lcua!RU+ymIz+bC9u>@_INGuw{NMC<`3SHf2SIt-_j`^w2#uJBpMQ7w}6%)@PvJijD=_krJm_U_%})lUT`$1bc>Y|JQt zLe@N?GS8EWHNo)X2H0&dRL23gT3RxhusE2v2z;N&KH}`~PIS1|<3}+U|I{>Dp`|pV za!|0^UpjSH718bd0wz!-|bgY}o3(m&za2oRXi4S`|W*Qx_vna{tW#CtN(z`oU`KzX@m9Zo*@jlqz*TT#f03svzqJ{|v?F17z=R&c{9u zCp8B|zRO7K1xFeIODUmaRv-xHC??5gJYLKCwcuo?We0e{_KXai3=}H^(Li04NP>mN zQtkSZ5mJ+~8pXJyvr&Wiy<3fr)|wa}4TQs`godllr6@kP!Qz4bj3}_(YUg4vPtEnf z?zxA4yM^#Y^D0J}0|Jl+74T{%>#68kVENxP{YB2BS2Sp|>uM}V$!nMMuk;5ODm8Ft zcaPcm(W`I1PAf5E({@@dFZybwLG-vZ!J00t+QdK{jyhxtfJHbC$Mr|EcZmQPR&qZS z!}<@rW;Q!%Q9Gu6eytKVGy zw+3FdE(f4YRzl4mjn()HHSlZo&vx{uz^Y90$^!U_0~$X{o6<^YHAa6m_&nl6!^}q) zXNpO!4fCodR$JXKxsVxOjCQ!5No9m&h=Y8uZYzGV2c}WulL4;}#42Wh|NW6tjwV?6 zw_3W%;q%2Jw>bOg zs8$wa$}ppLq#I}YN5gen0lr_~*4CJro=Fs9^(HkjY8PkbgNePY*+iQ+=oj_p>hiVg z_=-`$eEFm517Mi9>iot!Z`*`M-<@AP?7lBcF6AT*CtAytU;q0azsaH`t33S5hp zv2c8y4;^aEHSfHB<|G8&s1w(8-1L(TDBYM0??VpWtwrO!^^HWp!5)r zwIfaRzUDBso_YNixUu`L|9yXyN*jN&8VX18D{(-^rj0#ig*Sd`x7kVuq8~TYr3vGs z8S2%m|5HLAFmVz@-c**ir9^E^#_@U-q5Aykz^WAMu^v37-Mqk^A)>ALr^%8WEAPkp zeXbS+yFeTDcjVYLclKp`02P>)NlJ^yaQwZgDqxhLTp1u=&>WG%@&>tW1#n1;ejS|a zd2L*h;3d8n6pcu#w@K-ta2b4WD5;B@Ea2FCHWU>Y5mAwXg7_ZtBi#E*iJBMLY3^*5 z)Kjw8Q8eC^88-}n!1uPRyIXqMU}H36D#;2b$0i@I9x4BO8NwY(DewaonCjVO$OQ8S zAhd9TZdlLh$+Eah*i{qQqr5xt+qlRGd_i;gEvw$fhiX=#N*csA>7@z{%(GGcw@ZmL zAr%=QY$~P(p3&BJcJ^K0Y$f0yU13+DsATRTG$Qe%n?tcqi?|?;3;5NQbG@sz{ZPLb ztqkioVzO_6fKM%ghX@Q)YTWX<$!%=p6Zj*HWxxM0;HyvvWJSWFTd4eBfMA6vpnng` zdH`Fz8yS`G9}f}4i$e-u-kP@}&Y1dq6qS$|_nv&Y3v#yW?QI_v4boC{QrEh1i)cby zIEcGq8wpKt$UGRm(qQ)fHW3M`0A@;190XPVTf_aXpd=S}59JG~zRP~x!o#A(l)hxU zb<^9vFEZdB;bgp|_th3T!vfmKAsA&zz2H4y_&+iCWKHdu&B2Z|ZZ`*$M76URnL5WbMTjjpGegMC7lh_Hee-^l!C@lx~M-Q;P>`W;qGFpU^1<_@Y ztWEm}^`n6cZOeIPhOvS5ALSJXmWhqv(wYK+J1`lag6ZEW8h|*lLdOH|Gv5Q`KDx{_ z6y3LfbjYB} zLd~&s`H&$kg1qFrd2eD(L0@2$#(sEtb)o92mMipb##l;xzTzo9Rr}`|6(IS7Ft7~u zrT+nQ24toMtn5c+&09cZOBj{E{{;RYBxZ=+iMz+X6g=`eT&=ka*q1m>4ge~P=1Gp`##_t4-u*d;71t?O>!HK^-h^5g6 zsM81$_ZcBR1$o?>DVTnhUA+Dl*fD%Ji}Re6>A|0gak_)%p2fc@vx6*yJ+lTnFoX;^he z>s#;tl5WHzRaep^!I2~a5_>LKeG-4mh*-BFolXF2?0_=horUB|IXpbS=T~)Rohy+@Ayi#_%ta7zax%&erW@E zl|BUpY-~hStvOSLX#iPG@LUQ7gh)CnPQ~0AJkI05TkY9cqwF@gaBJT2@fr=NZvmAP zFL<(7Qn5Ft!scc<-xJAmk``DBP4Uei7|c4L@p=P5^j>J^&I~MH6e3`B`8TQJWRM>S z*zvCe`~ZWJB2L9g!*#6C)zfvrEHLS? zq9OVVj{r5~hNzMC-y-hM35X~~Eu)UihtB-rZ}S73M=QZ3Np_A=x&i!+e@E4VpxMvk}RFA81f1z_FQAJ`nGf4^jbTcI@_P@Y-r}3xe%l_zJEg zAxf^Kv@CosPM~`9+yM{yljST!m$dW5Fj#!hI%V)FHXaY;BFTcDzu879Uh(7>7JBpE zHwiZCs``ohr>R7T6|?7mU#0ujb4xsV!n4uK*vtM>5nT0fppy|gUvPE++TqY|o&rmQ zU~N5%Ln6W(Edy2Yej2woPGrmC-qPX0?@+`1JvP;xo-+64rDG$1CI;(?>J#R#TBc?8if>Vcuuno^zCy9H5 z3`n5MgdpxnzXEG-Iz36iFw@0vVY0ni!PHd(Mzi~L>2Xz!u^kgvtaG4M&N*)K1oTnT zvg6k)=v%r6*td=1`(w#d9DoR-`sl6o5*j@|T!Bl)*piW!5r_kHj>25zQSv~I7W(xZ zjBw!ihkZSM%QCqU0y~hFq$Vs3wj{=pO?Va9sM%EREd`!*7>hlnd!}<_qd%`Wy=}Fm z{&c~)SBx%Q)MS(zEpUq=IpbmtE-2GHVA)=D@s& zplEqHx;-GV(S2t+gecm3*=PTAVi%i{7jr!_q}myj#@ox)OMOtJM8!AiKeur<#pBqu zHD*32f*Dx>;-a)xVWIeLnJ*mrS?n?Dp(QM(ouoTo4B9_r%1nWd!iNWlD(#xikIPNz z2&<%2QrO|B)L+RP$I3OZ?^VNMGVW*>G~r>jThwL0Cw-Dyhhn`9xB0;*v6$=U|chhW-^MK#uE4qd16YQ|hSNr_!sJan{zT6clbhRf3C_#C_s_CST|BVx-<$X_0e zl@WCv6C1X+vF3&W3KClu)TD4PcbFA?lEP!D6O#nKP^w(P*J+%PWDEo>;=P`C#_Lwq zYL9RKe2m4`&MnDJ)hN&z3yxvUt147<62!qYXn~x@0O&khgGW=RABvJV?uSO5dH@;< zxYPnHo?&dJrk(*J(Z8*!K(??|t*cU_8*4H(GIDUD>dK4hAC{4oAfpJ&y+dDtzte*Q z*ea$_xrb{`#9r^2fBYw+a&KG+V4WR9()BOlXaDhbe&Dsugy|9^YP72Kh zxtQU1%&L!+4nTUIX=Rog_e`?1=}*-11%7RPZg2(xA=G--=`%K7Ro}G9!^#~wSx_mmOl+wYAMzxPP^V^K z>zUi!e-;`p{i@7=n4^Cn$1<`N^7p@_({6D7BW>{ZcihK5leAauB)M1P zsY8$EohYe+1|#=3dot_;w`>YoNu zTR{zGh=2fBPC(GQ5G=k<*8D1^{~mrAl)}<8&TL7^NL3h)tM{Y)AKwfHcb0!#Cqh)( zUkZ3kua?xF7(Iek^}t9E9@NM30lcU+By4hsoD2&4%|l6BMGvmK>gIUhs?GxeI z1Ygg>KU?zvnP&RZjnlW#m~e_i?XYKE58{#eKP4~{gc7+V#jxZqe7z_wJ$>V#PhP0X z*nb~C4SP{S0yGP9&vTS3Yf|cc0`0GS98GNGh05WkuIgTpUWN8gk$Ubbng zK}%W4c@Pu!DveVcT%Y-grYwb>o^n%d&oFN=DRcAp6<-MoJj7Rq>|4IO*#ATK-dNXU z?Bt~PknN~h<+on-yYuUo8iDw`X%j+RDz4< zt_%vvoY5=<^)zZ-j5{;M(#HhHma%~4N7}( zvPL8`h|Ah!-kUW;CVfW^ghtu*)m@M*jMSk$S<(;Y=ZY7 zHGY6|f`i1NbNuXYzm>TwuU>;0a@f-2rc}*X_i6BW8CZ=x+7VpdA3)uP_U3txN+?HM zHNafhZmUga&zX}`8Gu$+lvPG{kIKWr;gd^+L#mLXr9^h49cGTW7O88luxTt1X4+DVM%12M zOv#muIqt!}*FSp6D=YkYYXGmGOcUQ$hgW%CKLgz5YYpI}<|Oz&t?*#3(+tbNBttra z#;qNj2dqpSR$4=Kp&GbDLSuRye#WB8r?clHNdiQuA>NNCH7j7X=1i8uo2-!^X$dwi zNrU75n4Jvq;eHo~N+e?UJg(QEcLLc-KW=jPjr6Tz-_(CW;sQ&(GO~JYHJ7%3RHrG4 z12ueD2oXRbHN60r&B0`89ADj8+4qweP474G!{a`)nAn3rjOoW=UK$T^(Pz)f`w=jK z)CyYsGr!vQj@{^q<4U4n=4D61D`z#mck*O<)uVuKb^gsc@(+|;1eWw%kQO-*@yDvb z9xuQknZ_D-ePw@yu3`QG%v~q`)5^|H&EzOaqPK62S%>~++nX-wYS7ouQ-iU9YL~El zR@S{^yMO(|yjuZW-_kNTPVpH?s`D)08XIL=Zrsw%m|l>IX{r7x2EWj%Erx2Kx(|z= zu-0O^0uZk1q%}N>9D|zf&5R|GT7-2ic{eLH!Iew4%wd(4=Ri;#I=5Z?1sVf($$E{@ z<(HS%2Tvg>gLO}*I9SmJLeuf~X6lhqlAy*8F52E!3w<;YNT7JUU>|i^V?c)J1}xP9 zXG*{DhwF@eb*W>)%SCr)2Ik(MZFyA<^Q7qfDD8dP@sSemHl_z>7LJF!N2{F|CQgPF zZUhH4!@q#I^09z_Ts;!1VA*9W5Y>0?-{G5OkW}3lfjIswT~F7q%|p+xU8!2~jS~5c zDI&zjcMUVK+WU?ZjEBwAFFn?&h(2Q%Yqs{LfmdhtKrM)|ak#|ZC4MGgW=rh|cDkKZ zPUV7bE0mfBmr4mh35h_`ZyJlUz|bYa`nbeb^r)v}2q@_KM!)8tJAe=Yc+w+P8TWpDyuIW6!e#Ob>He!+SS#W9+z94 zXb4D2WdAIBXgKA8!&!ai8Ry6J`=gj<+oWqT-I&{>Ld5iXMO;ICzeET~xwkmSS=xST zf{Yn5q-XOmx8&v!`~rwO?9%L9Z2zn>9I@-Tv z8OIDhEP4vzAiRA6AA z`R=yGg8B=se!gWVB^GN!Q`yMj&=mRFVRK4V)0JU;$`KekhtGAvUpPd!5C|tbZ}*9l z+Md@5bNw)MGFP_?wAH9CO<{?Pd1Vlt6N!J%Tq0}V+Yad7y z9EYWcf_X8j<)|w-X#=YL=thg!Ift8fh$ICNpGv?)T2(jqx6dU6EV;2>B#9~d!>%Ok>>PH|rH%EU36O1U?4TQIU38KVd-uYp6Vmt>nKssWD#BETw+1g!vurO|Kn0J$=qhTu08WZ{6afQ-BXMF6k$3cTAH__$n^X&5a-Zqb7Fxoo z>;Cl2U;^eZb9{DKv-(oaUOWdgpX@xqSAxpPz8fK%CqyR!(sSAQr%7s&B`m3?;+DG% zmpW+7SN=hb5vQczlTaZ)THdE}Q}B-_dp{r3~PS$ z0&Thv!OB$U(c>{%g7?yKG$HxpvM(Vn(Q_EH)02|!4*Co*H&L|R@ua?Rq~qFUEOkO% zOXBPHb<**$WVC=&;XVy$K7AbAHdKBWw@fn^4)Hi*eG0A&XytQR_#md0iXJ4$ak(+~ zd9Ax^PNHjw^~xNbWDp5b;lK2X8n(kIbbL^qY4PKcyt7~Llq=Q%KG&x|3aA7;iyppU za-JaQCTDQ?Vk_c7eotSzV@Z=due3C=$f6ia$P0E|anR(0!zuNxNSeFVah_{coen6@ z5Y_tqf6f=mAN%W%Ld?mkxR(1^JKt4#AS4wmZ=hWpmp9zQq-pgdqsB74mxzuUB*g|( zR5HNk+*`%pbimscw0|#=cJlO%rqeazBv()+llDjTlVf!=rb$s@_U~W5UK1bll*oof z59J}1Dsw_=(0nBdPwGGQ;@eTrM(UqkHAkt~mQEPKX&8O{5|rxO+O2o<{7#4Zpdl>Z zA5EqBte{}tUQiOUJc6I>R`^>f%0zJqR^K zfNV#fI$7@&RXf4vT+mR0FM3P@pT^#QccWA(!c`z*DlzpJ;i+8Ry;@>~gJ3G~$+#WT zXfdMORbmT_FXH+(KmIfz;ojulB{R^J*)A?$F?eGi(J@u_k6SK1Ix3g7fvJ!ALt%Y6box1?dZwB~<qM;#!vpeWcv-G4VL}Eiz0B-JfX+|G@qiU|8vO** zuRIS;unsMaVRb9HCqNbS{PmK@#v=vw71rtZx_hTx=NS-b!ADS!Oi~gPxy_w0A|a(< z{nfJ^x_;Nz_E8Kwu$2*+tI9I%Tqz-UeLN59P17Vl*WN9AIR=hmOW{^lZ2MIZ7s_`4 z0NZi}B#Pz8F@#-JQ_M67(UGs7$9|4SVHfFVh#6YS!#78)IBv@kOMNxUnWq!HC~UKb*IV8 z15IFBvu~do157a_WT_##rZ-4W9b7$~M4=&MLYjW9CmFI)UHuA|V|Ju5uC5NiuS2N8 z^7n+%9s#A|)ZP72c?yWWK63?}nic4Nu4}1rQdGt^5ZNI6wgkMo=l36;yJtf&D)ae-Mi#Kh7C} zY5(V0KtSKveG(rqzmZ^_!HeDMRSX<9PvHtcRER+2LW;L?w@zW{%oXPM& ze+GscC(^p~Ka2vSM@FyaX2Y@YsrWh+aHQq7ex#kY)ndT9g6#^hjf? zcUC)gLSFNh?y2SnE*u|j&g~0$ZG`R>8cqe^~`vD+)+ z0U;htp8^AsqUOe%Y^|iCJDc~{Y}GaMxdw-b{fmuyeoX*3`e|4YV}S1<0R{;idcO>< z7!yHC`$lK}xUa)dJ3E7Er%l`5Zxq>TNgx1t{AJZ0@QJUgsE~cg=lrs%+Bcq8o&rax z9n_N2>ZEB0VCn|Rx`35ZNfr9ev(7vjp1kkQo#hh#!vKg(Uh5gL|H2TiGDgwb01~$D zO;jUiD!2@|pb4(at0~-1dS$+rU{eKi1tuPKt4Yp1tiTE!udf)5H?6+g}=Pp`C_ z-+^7e-UNTYOBzxK4yLg`!nTlTY`x$UPe35^?@G7nyt46F3!}b&mB@u}*#t)XrV z;FC@ECR__P@XmcKh9iH;JKg{hp$5~yGrPt#i+&j&lUn9wyW6^5t+L|dFoX!TnitAW za**KwAmBVQ=t)-+Pv;de`8F?*bU@yx+gN56QoY&+5&%ux^`L$GedFCWf4DAJ z%Lwl1qpv-3vR1Ln?!9x&>GAF76yjw>&<_LXIpoj>PGJ)}x4GTkj$Q*4^WQkbVjfVL z+nLVg@ml0^@#}!D-ULjrYJfYN{s+ebf+Vh^NkTMYzrj1Wc--Cu3FHS)DDWCyu=5*i+##>7kP zKsRpde&=;G4n_*x7KH4q#|@5=$1E1TQ^vKSc>hWYVrS`Muftkpnkm4kk_SWI$7%sv z0}3N=gGBV|AbII_o2K8WhK@1qVSm1ac1%A0q0wDqb-HZa z;?Cu?U78v49*H%@Eks^9<(H1nsStVcPdaEJ2(Hm>V2ChA#^jI9P>HYU&W@(TDl!p` z7&QEzlI_?ktYkVl{m!|S3C=EXFnP0FJm2J)7I-Zb$Z}4c+zhFYJ9I{qHp6F<3hUK} zaPa_d%gHJ$2dA+YoF`*cj*cPB|9+_Xi?U6B5+P4YXHUcXMfY{EHHddYOLN%9`<@kU z>Txo44peMie}78?@_A-M!|E*=VEn>C)@ChsK-$WgG-G=C+#j%QnLQG|OkBJ~&AyP9 zO&6zl;`%#{ZWPj^OL+hJznp$*EnZLSh`6Y z?f|p^5x1Bp(l6u>4+nIB?+X6LnvCxm)m2SMy)SWOHOA2l!oL5~*2eyfodvHOv%Q%dpVc4WE$HGC3C|q!7f{iQrRB3y&(2h zGPCDWa$Cn^UWfy_gwx9-5)-9z=Obbo-!H336}THq>R_1hn!i)e_Vu?36Fmr|?i-`b zv9xM<5Yl@bUm!FjNGbzL!p$K&GlO5hnZGS&;~44Gq0479pkmdY$dKFKZ15d~z`5wD zkNd<>KIbQ2x=YLSfQZE0x>aLC`U<%bT8{;Z?b;GOdrF0$W&;xKxUL>+J;ToR{K|JQ z+3+JX6Y44Q?-RWRM(Z{*(*l6c0{m+E-?#~>)E-eHz7 ztl2e^%sY~RDYQv$6lV5LxZqERd?SFY-C09h)>@MX&D%hmkX%7Y$HpV)x!(9rEyv$G5YTLie8a>d}Tb4$h z7QUQ4zTMNb>J;d08p|2WeRYWYwUq5xfg^%P@I2*F^{rbSXu>L_v(kOG%}jdc3StG1 zH((qfMJ2XIZuFZkkr)jF?0;+u9;PX`#Z_M;h9z+awgDU4SWpx}pt*~x3eV|q`HERz zP7-U2PDa9ti_D9HMW;qMj*6Yv5Nf!S9pY-O63{(?vreQzc>C%389~_R21WJ%!Eq{` zPmG0b*CMn%2V=Zp6gRRmeNd|X%%<|6UhaErEW-93t0lo8sE=+A5@e*+hfMJ*E|vS^ zJYF?xMkcYrx*;zB+)S7lJx;g30W~sgCxNuQ1uBjm*^R*r!vZ3UL*f)+=6Z&05Yyn$ zW5A*V0Z{vaSKSRL7BIUD#3MuMmv2{{d=V^csyt)jE!3spZ4?d7ztByHdhT+b!+L)d1z1xPE>fxC zIl^1*_4S_O9_DLgl#!sN$K;=k$`w1ca{p>J?U%Z=U3c&3KLZy6mzCEuS-y?T?EY|1 zy~{h;5^+g0+{wlc0OPAQc0lVgHT@=M>cRW+5UFYKbe86Nq;$RUz@;;MEplhyk3pQ4 z!B6cHBZIIHhb?LTVQx-A&y78+q5=iOG=_-jgAF3W>z+k-f$#$XWy)74i;`!L$=yHc zUnv{+|4h~yJ?h`Of8%6)6B*3Axb)@k+h?;stEVPy`Sv zSaK`aeh+`})EED`lT6IiZ9SRNt=D@qrB@(ju_Ip1v?({E0Qr&qCr>U>wrI8~Dc|XU z?u&c<{_~rdo)7IzVBsqB)i=yHG{l>gNAQXS5kJr><^DX!+VfxlI3VI}C9}eyJ`BPM z#uG-5Lb=3)I~v);12m6uul18lZ=9;w3>CYhNhFp<=IaE(W(Kv!6dt#VX+c1-<#bIn z3%9-Rq>tz^#K3ARJz3jHG`dTlvVf0!LU>n?s~6q&r7+FAEkEFdBJ~pCiKRPuHtm~2 zuKgB9W`83s$#1j>FSV{A##H2KFdwyHn(In@Rl(5y_m+hktf`7%TVe~hvxPH%%qNka z_B3JAs_9s;7J05d$zQB@ZZRTAij?@`b)&!~BRiH1r~#z@U%|vo%Wu=l%A$qr=(3dK z8I%L)k5M23++KzjqV`hXyO!JMXXFC4i+(n~BxRsBv0W_jR!S58Lk%9dC1Sc$e?>@^ zNq=NaCVoyH#;u7UNxS#iI(yCiQgtJoDt$IqETA>?jeL6Hm%nNAU{i(gv(}s?3Q%4n zXIhmsu^AxfNQh-b zG!m`pe4g)t0EwRBF)%RBZa{Z2Xj{AlW*Q1eZ?6Tp8D%elKQ~x^@H*p;q<~7MEZ_rA zNOtIu-L>8)ky(xB9s}w!VO5`J6b??j_Lg=6dW?DvQCoZ}CdPwGVkhiplCfA_%B$STNrToII5_nn&-DAynrJN2jME6enb6;;x1pIJCR*{_qCL6k zpB_*g>H3Xi)bw3m2|MV-0kA5xsmIH=f4jP#Eh(?z{)aBPoTp|eY;|+hEd5GZKxFY* zcTo~3coZao@78k!hzsRWzO|rNL(aGA8M|Jz%}!r_O`sveVYHSYj`>NatSFV0rN(2V z1HCb!{sVtbT&BX0Y3gTAcz2V!AY%Sy_MCaZXA5!t=JJ!%r}{WRRrGQ21AAZ-FYGER zt3cth{0_s}mGDE!TF}tn7fB;b?r#m@6(?fIUT|63HrThV@QHB;O#UrB|Iw3q_iFlP zGeNTsC=jx8-$~iqJI9pR+jf=^6UjkvAyWODb#+mQhE0p%zXoZ^oL|`e{eIYw3r4z@ zfm0b3LRpQX+)1dQ7W^>_+ZSKED_NMUOp)6y&=l^vL~QyQu)CAtitqC!FlpLjdkj)h zflJJPE<@k>h4oWx3;#UjnaZf7Y6UAFob~Dw>_{rhIVOD0THSa&K zC8)0NoW>&QMc9%oFfcpgo(XUt`gLrv-URgzWCEEW(+d%iT-hzSyP8j{O3*=NC3St{ z-vCtP7KtF0TN~G%=R(B|!`~KHWy1;6j*iK=Ifh6ecc@2k)+Gf5&uo@5vg+brPK#i- zwpr)!ZB%m6RJdQsc@M<2|K*tGCEfI$%S1T~27+$Laj~*H1-Q+Gtu|3bGMDxNALaHQ zN1moXFu9X0vqw*D56VVdYF=xD-B?O}w&dht)8o5Xu1Q}@a`&ab%Cp0N%lDM;8fP=A zr$)vZV9>8mPlUTYQ#@Y7fMIckmY;R7tLs7xT%8RTLF@ya)_Ewa<6M4$bm|05A06IMUJOkC@kS+dcAt2}^eZR&iaw_vn${TE%RLMu6VBd#+}LkZ!1s$uLm-HO8lDBt zNmH+O_e|NJYJO+ck#^~wD3p_1ASw>`72DMQ&>)wpaKqnKf1ortxO%E6%h9O4E`JLg z4m85o?(b^(7&2j>_R;-e0UeaMCj9V8PLASBHZCjti6(e>?>`Bt)_YV8HBOFh#8O4z zY`^Nk%U@_t`5Y3`fwdG4ENc4IpL=-|@1eUTeP#E?p-@_Y7wd?KLl(U5HU9LQ4=AFd z!L@5){JF+w|IH{wh8Vqh9ziihb*r4B3~G#WU}_~1^oh#u$DC2Yf1-*92j#KoEL{j0 z+|ywWPn>Iwd4-{e-w#47-9-GEhrB=dy5Ousrpd^!MBHAlSMhPNJ~|mZEtq);>)x=N zmy;g&s~!HZEkJviV_(Ba8y@mn9B7hpTlPO@VDux5YzqF!_f+}RY>pJhHvrCa%;^=O zs-sTVw)hUmBQ%uLDfem8$eXhEz$?x3kYSx00S2(LeH0M~WQG4j(^UmT^?luu76C;< zI;EANJEf$%OQpMWC$J%SJb>QzV zNPcl7AHDDbX|c_0b0^OiFy^jB?+wzvVQGB=+|N*#0o)%I?7)QG8A3J0G&nIkE%%$M ztawu-ZK9zvMxPt~(1at6qV8^sbmvUtm^n${;mfuQ*vI487`CE{760{usHnIPZ$%75 z9k$j7)BU>_{IvN_?90F6cNhC5<~UF0hfQ)n=aH7Cp#mVmfrPw;*ER4Mp9) zU3t;L#qP8%&y)wYP(*28FW^I`JG97xs8g9lE2W{Ag5g^=Aflhfg$_Bu_lwxIwcHS0 z)Qoap^`_Di`Ct*s)Bo@xJkT&HY+ei#(qQP!NGUPt)7dJ2i`rpe*p{p6S*2gmamZhF zJa~0Op4v%sYSEtX^v3&6qhj+kDqxZr!)1el5RbMoF;t>qpsd+T3xU=4m{oeH6?-)m zoe7)2jDwREw^;ip5C+|=oN=_NlO4lgC9s4Q4RXg1kppk|8cMYJRmNBlM3Ms-ddo#S zOI@F`!4tkMIeDuYn+jE6^s|$HL6(W%pCX)EIUt<0EE9o|jJE+<)E8L2ggq#8Si}>7wZ?;rkv)sFcJ-+>2IqFODHd{ zximFGS2XIw+BPn}oCJ0FzIwO5j*W}!DGYkYMRE7l*4)H*xL1j~?w>oOA~V1KX%5`_ znh>8Q9|y;GL?*I{1_DI?aRFMT?fG0ce%=_ZZdltV!e12c{JCw^UpZn&UuhPvSvq)Y zUGggZJ!Bw zzEPmM^24Z_Nvb&!k;o?+rLUfzAtDZ#n*`6B(0YAEd1FLf49@DNBweXhjLr|83Phkj z{^<-cuiD#x=8HG{X)^f8c%RXrrysQIqt@$WxP7DJRnb;Qs}x{W!$4VhC8W*75>lHf zD#Hlco4bN3E%|Hmml^tY*p*4Sa{JXH(jBh4T(l<~y+iALMmT9`9%D`e`>TQBui0q6 z@g7=_+3(}{88T(Auygx(!u0uC_g&FCn;STVL^9grX=j}d-2CpDczn_L5e@jnS@V6% zguOoSPrcsz@#J8j3RymBWIkHtDFbHUgG@e!FKpt~o=TZKia~70cY}9#9YN3dBiK#uLlj8thqZv=LJ*Y)sGo z8cxZQMwz*GC3Zg_)4HZ$({4fvEL5uC@*1^-UwGB>^EJ+#Z`z$~_XGsJJe z-ggeNU&>s3SW`?gAt`CCLm)ajwgK$?-aaO0$BzphTAm^oY;4I-ZnTtRkBn)0l5nU0 zOf!!)^}w5F;dCm%!e#1b_e6TO{b2G_9M5Z?s8U$xu`o(x`MA~=Gi$-L$O@z(SJ^;| zuyg&d%1uvfd={CimDL<6B{D)U{6HVJ02?f=8?4%BYdt8humfP-p)kx8+PPgXx!j2fL7`ghuaNbMWBxGPC}8bi`6S5~*+^YKbtmCN=90Anj%#ijb%p#;AE%lo zEQd&}EKU4TT~H#Nkf@OpWr*T&r81svINsPmg$JD6sPK3@&3NU?X-3ZFJ$9yvB88w<#OR|STxmqWfR5o4s&yv5G`gh_fihQykz zG)F%s-7#a}Pvfs`*=03qJyEP2<=f8<^XnM$klNlj<@2p$`{4WD@o&C*WjT3q7|&yd zX$FMJ%(1U&Bgtp}K-vZ;%e3^)QWrumvF6*W)GJ`C1R8BcWcT`vx-Dt$t=Huk?*scM zOMw*VcDaP05`=rHWG*TygQ{-fO_DwbFK=nxF5v|#do(Z8reu?Ol2*S^bdn$_v%rWU zz=`3tyHUp4_6rggO|^#!o982{hD^HL7)&9rMrHB!q)mm23=$__Yxk2sMO)BCg8W@M zp9e6I%0RPMyqd})PzXW{8WxxUFj?DjRifQ0^UjE(|9*wiY(bL`+y1y2pa@09Ij_#t z^5jUk!_4n4y76O^8DUJ22hqIgu3S7B9Dm%5WX4!MF(}4R@Vixo9BgNBnr}A4S z^SM#0_SN?{#%FhrARb9zd6`Tz(5h9k2`8k?q|7lc^T zf-JJTm()!nFJ_sK2I6S8AJ+kqt_WY`32Cz~!k`BZ3b0rALjy1y@RMX{U*a_MFc3gC4PP8A-u9yQw8kG%lf$CRub(I}b)KdLtdm-Gz&JeKsOMHfKcmOQ&ZUAbGmQ&57 zZVBwd)j%x2z4HR-r=8~-amn;|6P3C?PHHdo>Eu4>vt!x^NT~ZMcI9953UXySZyfwa zCk-^EcDcC&%ahR^pVgU0xng@6mLHcpH2Wb=4AE6MQ)1@aFL-xMSn>`36Mw6tISKAX zfqII_Anrw!WN-zk}ri>|7V;bnh}8pe$m}O?Bi*7-27}YwC`JyMH~jG zzZExpY1GsEc`50%$)~_N0Ta=>i<-V~y@*TmI<}ln_rS4}2zZ7VJGDB36)4NmgjvXskQ%3m#g;)>N`e%mhvs;v`t@;#-FCckqnb&)c$L-!;6lQIh)iC%?*=(m^U zaePRIc~?i45kqy&ij0L>=e17We$y4Z@WOehF9|g80HqWU()W-mEIb!@H!||mz{s}z z0phSV-#!Q9q&|`gUzb=D?(GJh+|i>?jaZ;i3uj)yCr57~D&!_IXqcWXjO29qqh(Um zlWpLsrsh#U!@Hq5zks^(ngW-kt}c`8iD0{lMe=O1!I77q2$I|L%tBL8WN_}mwKdlt zAy(J7oF2_W{ZCmqn3UyO*j$EbNV0|A1nwV(cjo|))rAns&j?`0S%_7HA%q@Co9T%> zu6?z00W75MiVJ@}s`$YsDH-}@yu;#mjPLn_tHNe{J9Ucn?XYmE8d2kMN&!h8P9?nn zhoH``4E&R$_tr*;hsiCd0oRSn>$S8mqTzqKh8=GidxxS4Iej{~h=w^- ze4?T{=F!TxH0LYMgW$|tKRY=+(#uk=wGO49(}#(MP=A{#E-fo#z}ov-vEMMiZE35q zN)It67IC5Pzx$=Eq5d!ebY2>flsPSc*N*FViBvZL-)dO@>4Sbiy?XD`IbK%1ayn65 z)2Mf5EyPMs8;D8Bnio;59)eGQ@Tk}g(8$(qaI`?+;<~Jzc}*GAL?Uh$zu@7QtJC1y zgaNaWmn-5FTZaXPF-F6it7d9GCqZ-LJ1F(M|6QWvj=qgBGqdldWfk`?qnHw6u56l( ze&Be*7&bIQ|XJ z7kO{$%cJycY>LYoQ>NqPx$P(psv|Z>5wnX|XB;S?{?4+N0!y1S&!A^h=kl2X2?M@> z#_b_kRLuybse@lJYXY_#jESNf`ub6MQxu2A;F-?#W54&++q-qe2cyd9w>3hU&R}Ap z;^SVsLy3(-ZNK8<*@5Q7MJdb-O-+qo)_l3I-`^MQFR(g@xJAf~VpW+IN(;Jz ze(|t7h(Q|ir8m3^nJ=dW9#2FUJU1-3AWQo&$J)r+hz9pLSU2U6mO3q&cfNDO|38_q?Umsa=$;qQG*SvKF5kveF%=_*3ayH?Z?8Bk*ljB*BMve*ct)z z^|b|CPs{atMXzc8N+()7|68~3Gb}L&1Lfbfjbt018EwS*%gnwqyX72IsUdwi;)QdF z7=wMQ=OY$n#&En@J344|)3^XOjGlnbvl>9T(yeBnOUdcO*U5}-eAK=C{ZXn8;=ZT? zl6TTI%;)J!d|6&dfoOd~Snz2J$A{c5owgd}?K}bC0f;|Vj|LZNotPe5t>Qi?Fvw_{ zF(z;@ReQS0mVq_<#@gYTxFg zf$hcmP9T$r$~pjkoSdIELnq&AF95x-7)q&B`4MrwasGNMR4i1cyvk7Ew0p@?-7gdbzFNKi)V44$Q z)A?K`5ty%~O4BIL)Q=G8h540sOm zo>#d2M0V_4m(q_W-@X(s67`JPl9THhnPP%jwMWV)zP`N!WsI0xz2e4^=$)!Y*wsj< z|7Ca)E7D+Ar_Ff3)j4UfwT3Ez9f%|M=P0MINq@hR>V1=s%bIJm^w zXAL?f!3YkCt|7-;BDvA^n5YAh_k*#uV`HC`J`DtRux6xhDSGFA7yPq3Q=;22V3)?O zhxI2^VyOW5AH8HPXhcRYs?7`1V`jE( z{x1gy(@xuv@skqhuI#-=b-o^#^ zOmeMi6I}P~gGS)`nfb;slllVrm9*808B~_J^w;zD(u}NgfWQDn$J;VqqV^7DjeUW3 zLkmp@OF)g;7ZU?B1cFY^*@VxJ_tZ979s$n;uFuTNh)Uo3pksIoY+v`<&G_8G2X8Cx zb55AlP46*~Fb7Geu7Gs3p$@3-DH7OC&=d{oRjQda=~mB+E=nsbn~s*-&4~@R8Ow~I z?ggvH&JW$4+GDCUG>6w)FM@Z>0-`r0Bw%_xf-}6wKfvS^{E4yI)NrfCdf^d#;Zcq2 zuj|CIPRx?eRk+o`y(-wKl9d;qWSz7xjOyw#5{DW)=jRmClKMHUP3KH;A8^0kvqYzo zknt5JUua5-;zwEno0ZHs8Y93pd;h#O$yxN@d3OBH4X3Yvpo`qMko`5hx>&(z778k@ zKW{##AlIo?sGh~ZmjyWJPksCBpFoC3p7=?I@Ati53{p>cb&B!mhY;0xQCLapk9!}_ z^SO5+bSOA`eoy*cya9+1W+XF2nvop3uJZ48(8K2x%n}W&7ph~KU!aGU`Uj?~;?bL5 zIBy6Vh^EjWLc?G6X7NlG9K%2(5l}h_oe9^|xl~{p$@H0v3Kg*IH-kg&Cayaqt__LRkl$AJ9z&=+8H9(oe|;a4wGTvu|$F zEV_M!`-JK$|GOJUJY;u=2l zMaY@FHnXMyX{Doh&Wh}TNq3Cc{ z8FeYtso!hj3yG}H^R&NhPgn8_QHw{+KY*MrMJ0vs+GZUA;%Rx_&$5{VHv%@0gaY90F<8G!cGvtw>rl*&Nxp0|qO!sDnqV;G(Xaa%x<%G%uaAX248cZE}Xc zr^LutN2m4J^U~YWfJ^`v>4JYAQn}f%UQ}M~s$$FwM(tM1{k+$<>4*%JlI{SP3a0db zv7X8TttJ#Y!sxWH=(}UTATOs{ZK!kuN`y(v?79}2ig@<*;?+|R(ZD=*^rJ;acJ1`E zxWCmw_2hz)~E$~*9+sObO90)rGFpKW5;=hkmg~sg8~Hb zS&!C|^9@1`6>D4W4tJpR({b%4`?~!MN=SO{`vCEx{n&jvE_|6+y`PClj!nl(Q=(|C z?|`AYAy}88>q~mv=&e!qkpO=vFV+6(57}=^#DrvjDfOz%hm8BG#4ToF(0s*=7uWUy znS2MG&#D!@-anG)V8C4_f9n7QVrULl`BnJ7BTfNX)U6rEoVL-E>0EnBgMvfv9r>Q) zyziitl(+PdWQnFsy4!US(PaVe*+B!~Q(Rr0w?2cmnX*YrkDT8fKCW&jqbi>l ztbd2P>%IMQi=-{w#Q#ZBf)t)ZL$DeqrYTgav15CDcrD53>HC8>k!gZS2)a~qDwZR? z!<=i}4&4O-4h+xPS#pR4j9qAjL?{@D{vD_Jr!B8)u~#aFUuoHDWzvc|`}A}6z9fkS z4PTti*HD;jphca!zGAP44OciIg7VRfVJHRh<7Tpd#APX!5F0KIZ z=`{+Iam**H^Bxeow*9T|G;E|VPkMI>En$5@b}|8avJqXxYU4`RuNKlQ=hNPmU)uM_ zqLoS6awNcboP)E|)?4JMi%X{uV-Wn`q2{$M%JO^*++5q5zkv20j6WZ~++;M&oS2*D zH~oqcaQo2Vor8dLp2uXVkL~6L-|EB$78-8-$+HuZ_71=zfT)0CpW|w8(7&L3%{+Q` z9+YjKzWoUF$wI--E{9j7l`4+T=FB$bbcJ#y?~3>Uk68OA5oA`eYS^0f{&yhJ;B~wn zH!j0Tc!RC&y?=k>GJShCV@kT%OsajEWbg{_8S8UEWVkL52!q3}cSjmUi)4YxJ)J<5e&A3Q69D{nn$0@r(Q@OKY;YjKW)T2$jCw7YE!YZc5>4@-r=s zP(d^&4Rn3j|h?~Jn zEN8viiKLwa?}t3CrCHkM|no&p3R-l-V3f*Yi|!y>bGJm6rNnTV7rS)N>#-T3va^yxC*b2{yrBBK|y>Qxs zwg3#^r2Ma&)-et#{QxQ;n)D98)VJJKSB~wsJ-e`50M=1P!lDQX$>u0ZGVR;b3Rl~6 zd#`X6ir4GHK-)W#nD)9mTW@yHs}GdP*daK-jCy077C-ymU1~Vax#4$-Kf=P)w%k)O z3c&Y29m{G>^glBJ;#ytCu$OCp#ahSjk25t|?9+G5JR_w`368zvx})-+i%3Vdr`i6y zpih9u61bL5b5T|u-)j`59c)Fz#A%8Jf*JyI;IRHvL!6Nt>Yg#Wt=8X%?(nKk_XYf} zT&pm*Cq6!o+3T{Aof$LL`a#=vFHk*H1oE%*VX88~Bbalqq1$F#2GrC>odo&Y89tw* z0HMZ>+@zxUGySY*?ha)Lvy&7>9c-<4LCo?zO~j2^QRB{7#=^A6C~Tp07Kl3tU%zl` zWS^noVUgEB?lw2?1>X)&@5*m|-h~%10t#BBg)}lb3eEz-lm0;lVI-hs2mUrm?8e^J zI>cJxxlP};_DvQ4w2osEH2vU=uTsex&ShP6q&a`?#>IV#>D8&KO5KRkxQxqxTVosb zTH$%562o-{L@b8+3cT!hU8F|$BA^?noWMj!)HUafkD;kXKCw9EI@E5&z{hChCWKO& z`<-#`eWnCL#DBurgJn^j)V@?;b1jw0>ckRo1sQJ~OpcES5%W*9+nQ#5kDJqp(d0hX zj#QqF)gb_eE*al{hGW$ow63D8dIfhFi2$q;8#@91;@@dhCVS+})(opBs-vRxaC(fQ zCLD+Q-tYIsJj5?0r+0fk0^<-L8@i3>s8pw1y1z>GRG#hdo55 zL0Xud-D~ssoxInk?PdSq-w94FYsWrWFWeSH{(0*V3nz;nWxmhfJeJJg$GG(j`_pyh zgFP!=ez~FQ#C5oY;Uh>w@-y@Jbx|nb2no>T3;tb|GwMG5HmQ?V^#C%q4Vs)eh3NgM zmC=3JaOS;&lddjBt05v15L}Dg#JIzcqjt=O5V3Y@J)HqYT=JvJ@Ek1B?B1WKSL&8k zCUHJ*7A#r(NNV{P2$jjHAGFj0DV&R07Y(?>LRPDm1>4ZiREK}lh16FN5vy+}KhVvf zxyER#hjey8W<6CPL5)EnE5^~SzaI&4zJNXJ1pq{X3rb{uAqBFJ6C#_Qnn-S>=2LE` zdbP|pHe_cD{w@2u^U&vV!`Aw#fA9iS%B6lA%Zt1$l{N&h{e{6S51<~^R}TJo>!N1$ zPQRW;FVG|MX#H|UYXL|xFJQ!6TO;yTM`d-rMjx#;>=%^ujlHC%acIIkL}uku|a=oGUGf0e}~b!n~7`n4kaEWK!$w&n>apP z=lVC}dA^m$oK(Z{n%4;rqMegT@I5ED^I1X#FgShrWXf@=@!P$k9C*1>^R=%kxY@-BUKj0BHRs@5P(H`JJE5_~jI%K6?!PG82G1eYV@NTNX9yoYGy^ZJ0`%gl%u8mBcGa)C!xnz9gYk?T}$!$dg4+&ff?odb_enEFAysQmTXZ32+htx0L+Z zp(Xnz6#g7WoOAm-`2M=p6yqo{eRlb>Ey;K!!()Li{O6o}M%%qI|HW$J*DMP6)diiU z!pxD3^Ldxje9w_0Rj!qJ7&|Fnj~xskLf>q^{NX;3js7`nAm==A+24m}*Z1#Z5-Zoz zH}R;c@Di?>N->3Y=Z>5-(43GHbHqlZe50Nt)ZRVA_VQ8!#H^!De~R2yEYIAF5vTN0 zpW#~!$Oqg(ZeswysErMzS0;_nnoM&EtS7aeOzt9NHKGwkV@|II4~{R?=P&Meb@t>j z3O=g#i>{6kGpN~X&%L#a?Q*m6oaOz2o<?G-l6PNI1Sf5D!f6_x#4K6KiyBN1 zNqKuHBMg5pff^DzxJzJ{8uwYLWDWeAn`64*27!zf&DSZX_1RWbB*Ek33~t*WQNVs9 zBs?X$2m*v2Yw*l}_eAi&nNU$HlV}vdaAjBR&Nv>#Y8aD5dl{=USR?sCW!`szZckpb zetRy}hwove_jCO(h!*qm>>VL}Ei6<&h5_^7bS1jasEg@vE$Cv$R*sB2?DNrar-gNUaVi);1z!250-+8K)!o#hl~}Dphy7ps#WOb6-XYCV#PEVM z_wTU+C4&Y=s#B>cVM@|~Y5%rL$MPJg3kXS^Vf3m0`XZQAu;3CcWB&+5W~^WH06lx0 zV$HUCHp6re6hEL6IIG#swjlBzuBHAN8=--5OMDh`f1!B!<1r&hjc00Y*g!G|0p{i; znskFKW3Vc`w^eHOJ3%`PQvrk3x)ezy4rJ>Lwq$5SB#F5mVwn(vg`<70r4uGuvrm0Y zp?XV-@rnx#@c1PbTzx65HvaPTkx3rF*5lTWwKQYLOrH|GDSuFL?9DgLgABpalQ*L) zgI!qx#z!1Hesp=DVBxx3RLEH$QC!_ea5I5AN_@ zLjj`w{}?obkHG(!Os-C{ZtjU*d#;@f(8(7~_BWJ&|MG=vrR7?(lMW>s1m~+02GLlM zAc<*cBugzVsD5kiPWnDZoM5OG2lfb%F%f0*AKOyE&x)2ET^}Oqc+oqqj8Dy0IEUb+LR8FL8au?mHSe9LWOE!5}*&%{Mwsj-jhZ+l8+kV@D* zdpo+K=;SR$>*Q44FL9a=?PT6@ZMch`RnOk;a8~MrG_t~zQObX|RoaQAV{d};e&r%V zxO($)y|}E_9fYOUK@-;2v@S!~%R57q*owRB)?%YoL3Z>omT90iy;J;@&@Oj)gaUDh z4=L$UdUBQ(R@i`t9T$0XZt#&Mmp)CJ)LbRX3dt%uMJZ))#z>oiCq%liAOpjbJjq}a z2;V^<^TT7a3aLh(;t>?b4C}Y8_cFzC^w^i~pi*gDWPD6KLkKNE26BZky7q5QD?gEQ zczTd%a9-E<+p9|fS}~R^K$^HNfkO|1@2l1(|AL&n8lcJu*l+gA+fU;6SR2R+mHU_% zkUBA#jF$q2h9&90U63C=w!Fg+j?Je{^rTM5e?&i0E3IGS3uB3RKDVZ2%~XL;+Ym84 z%+SBKx}9UkX>^SYxj^a8ShX1+0$$7^0;wQ!Sq#y?FnDcJ(P-UMhgf4li=bq!Z8>?G z@WPlC#`Fphehh(72>w$-dKi;P#}Y=}-2C~ljA`BFzCjv5p;Elp)8hr+e%Q$mhz1^{ zBVEAl;$=CSqF0>I)@OOkc5L1lF#h({ZtFX1xfj{>+ZUedJ9sEznrBJ6ixs>g6ZLZs zu?YsjAOfRta16!Zf=Gacf$~bma%Km=vL$f&Q3uofP+^L8!--^{5>POp9K4uAK&AQy zfJ$Ib>N{n|1t5@*K7!ztevOWF_8kqCNZ6 z?F4u@)|ZyQ>cI{AYG_!!J?Bwuxv4g+_~si;2zD;9$AaR&29aga?7xQh^^z@VdUC4# zLoctKBVi%x2QI^i0MzC%nQ$Mab2ge$KBi$m#UO%*@s8vjW0MKls*FbBh#EgUbX5B)g+q|kGh<~}89&_A(XAp}I7C(>8c!kc>EK{@4aDV;EIpU>ZS3Ohn z`QU$tfO#}Jr*1sQ9Y&Jbxo!spI|p;aaNLy~Mk-C*+fay{J85pCxyjt&6-hU-AS z1C1=^+wb3jIpljs`*MuX)1sh%F+YKQO0c-6Io92ytbkrWa%a_3vWWhJG_m=RPKPZR z^#N`j;5Y|9ny5F~+^bulN3fE>|Je(EHc~CPM|8A{pmdKew>jO8Dv!oulLC++6m0A~ z@;h(Jdg!0Z!fe?AJOyum1Ok|c$KIc7^BPEs@w=#Wq6vRB=iCLR=gdF@xo-N4%jtdm zj6I%9-r+to8>$V#!57PFy|Dh@I}d{{Ihg5CTmL;Sl~mv^-|nWKl+;?kX)Rcbh?2?M zJ_e;6Imdg~yd*gAZrVVPmJ_P>uHmbjbbjHu)>pL&u8seh0o#ASYoRG;suk$&hC!DH z9u}kEAc-<19N1tYDpOC6V{La0*u-n5M&a< zpm_E{(Lx>1*LA_SGHK~qJ&6eDPpcyc$J+V%@t;z#!gLXD?~^Pr7;!!pnYPoDB1ohG z5CKN{8M$4utVulbSPKNQ)k(W1r~NhSHq%dT7qR!V;sn43R^OY$z5Y81_)8G#hA7Ji z^smob)xk6n@#b!@v@ZbLW%N5uq7U|=xb{+PEKkgmVzr`qmDuRRk$y?38?$*Wr0MXoLAB2#X{0oj$rqmaem58?_=qiU_o?6T$2-f5B(v zOoz{(+j-9*BLa$7RAgsvF5wKV|r!L|nM3YQ~!(R?~p$H0vKZnID- zYsmqz{B&DlIa3@TD$7i{G=jy%RG4S z+N06E`aqic{Ff+s<%xt~I!pMLEu?*RtbMD{W$gBobYX7&@85fJZ)MoX5)!3JZ0iwU zs0v-`(SrD~()3i#hY|$l%V`R_Zs}l!!o!a)Oh!q7mjO~X=Im0m#Wls>sTRL!T$dsa zAg)v_dP5!D*$umefu0BB9mvlobGgxK7I8OUSZBAq)`0m8z4itw8xBqVR^7W%FnS{9 z!s$1kb$M)F@f9Sng-|VzlHYZ8(;?*`27;huDbPBl+;@FoIWpx43m!*TH zJ^9s!!5wpXCnCQ2=lG(|e?NI4LO0t)fvOz7m zSe!jYKj=Xe;s#YFB9anqY62;ssSmEXB7+y{&NFrh24~eiumYfZ?PT_+xAjJffZ<0& z_iaP#1uFLOQeY-lbB9&`O0@dFxPzrP4qNVOg~4m0zfBYy>?5uf!qUpeg!3W_0wvuri-u>d6K@;tO3QNbm3e^R?M{ z89SEy)XbGHKZ2y&EoN?G-%yV$KA%z^wTnMKn=;?$@BTSDgo^F(GO=>3wAiPgL=!*j zS3Bw7Zex#hzSh0%claRlh!;6uyX#&5#53joVhRmLAh)yVl=#QU$htBT$YnRjnZ<_( zZ^7@6pK_UVPCDvpax$j&P2b9-F!^w?o?G{Fx`I;$qwCC7;KpnWZE&<$!Xm#K0-@Wk&6 zeNt&eBC(4qAoA!1tXQI*pd}ZZ)2exiENq;<_rEeFaQ>*qrr36j85e@yv~xW8OiDAG zon5U(6zNR>RfnB=UF#W1@sf6?M5l}287J6d?n6W%4b4wlGj`nEl}Q|ovouMWS@mYD z0Vz&mb(ahG1zT{~+?BV92EO7I=!ULmUHD@^`+A7k#jp33kB{%MU0gU>uXcDDHvGl2 zS>zW8e7{^-1uF@AmUNRaRMyfhL3RqbU{e&G&NWjNcDG^2bwhX#T!Jg+SbvVnY(Z>~^TmdR+;8td&X6$umcjov(M7(>^MIdiDd# z`SijW5Rdrn!l_B+apyC9Y*addI1Jc{9qH|+I4%tcSm4U2vBb?+N~QwDVC2H)H2!*L zx?Rr|Y>t|m1~0JFO=32>sA+<1*B0bB*p8{Yfxl!E! zh*aH0!%2qHD+$kRiu^*dD_z|)FoGLuxQsoj6W4|ziz4jGlXUoN+aE(QruvY;d5G9V zbm!}GlJt2!_;_%Su8)%aJ{ZlDt(WwVOTrXNttzZux=r0)qX=nVMB(s<(-RFA5>^_IkL}eiueRX>qC4UQ}`u63PeCG zTRQwG!(*2d7D-y%@>Kzl;phPNL;@SrTqX-5K?LGAHNdTWjq-lO3h%kPtrlVW^U)Yp^?sak5hz7}nSZZ$BfWVQH8U21 z{=?*1Q3yszX{j=1$Ymw@(m{X~7l{)R_rNeu%0f)1xjEX+1>&=b=@=Ov#ye^J2p^bm z=<4Y)dQic6fK6_SUT!kZF+G0CouGf#+tMdNSg4pS+tmG3D9dG#^K(?NbmBo z<;DPw!STEejG`=e2((oqj)cn15f`Mf3B;^U6SRBG6Ivg+Ui|*zI_`UpDn+0acl5XZ zW+`MYLww6-cFP^nr1GFRR8u+DXn<;SaRoLfDBd1zxKhy+bp&k)s_qRJf_(WJ+GCbD#p63evC5VoFe$_M5SINq=lFY;_?E1`){ z;&NV?(drZNiW%~{9gVmAV){)jIdbx!b|`f`O`U6eI6uY<8c8OnKa5l7Xj#V1o2Bpq zX_R(5vL{VsH~giP{dwnf^M7%Z(qFc}v0x+nl17GKVF*sO_@|yl-bIuEZa0v{E7Yvr zHiLK4_0x05Ey(b4KgR2^-S$-qq5|-LE&---s~;6`e>mi@N`TEr$Oj4sstRGptfmod z{^{*4Q>bi0J&gWYu<1aCqJSt%&MOGk6EQwdgX5ogIj2>&S3@d@QK&kI0HB$~n;o&b z-1lENmR9KpG7qEqvGcO#SJz4;PzgP9V2F_^>`uehDmfBv7j!fC&TMvEQYlD%*y&Rkp+3 z0s64H)~>YwK8&V*BrEbIN<-uFyXl(|`9C^)^Q_+UyT;!fsaFS5Llzh?FodegwHbGu z;n-#Qs3O0%ZAo87#nN`Z5Cu1L@K`IZSbJz@r~dDRFwF+`qiuo%fr@aRXc2)!8@fk; z{WW@4?oc#UaEHBC*ztBBrQ?#Ti!B^0MP&+r*%*4}tG9PR@uJvyhDV^$EPNq?HU53m zd&Hg>nB2%LeF9}Jrzzsq69WqYG(F!CS`#!S@`HfAEV-({_D#R6dRf{3sbJxsh#7T- z)^!RJrvZLYA!L!aZH2vEeD<|_>Pm)YU{E8YmgKAS_C0Rw0iOr<7f6vzB|c$ z7Xs0l7+N=LLty8CCR{Eg@;Oa><6KQQd)+iZD8SbCaQe6Z`z_&`i>l zea@>@q<=@JOj&{2; zf%=8hB5ZLYv()z*RL^bEhYzR79h$|_TW-|O)PhvOI6cn3fv%`zsg_0bK4(xg2_7+u zsr)(%A&3$-IFJbTRWz50833q9c&s#=;5NX|1!jy*rO1#E7}{vZL_u1s{rQ~u?i4zbx~= zvYP7SE6Zay+1Savjd+!tYX(IXJFO=e7}qv(f+g~1zCkp+@&3Q)mYr~^CJ%8|Y8wTd zp4Jw=o5aPh8~=mSk7Md51f&PHGU#?NKIV>&yhi9=Ae>5!7wu_Z_S#_J9#9BR<6Rut zV9rMr@RGo4Y~5=eqh7yOQ3Ti5XiejTdU*PW&uD`?Z{16FbRRV zcfGIL6ZV?g5x_7{oYt6@3uK8bn0G>7{hiJN>OQ~HhMW(z&45I|Kev5mXR45?1WJz@ z!9NcI9<0Q*-jK0;SQ4?zpW!FN8LESVJez^}*5cZ7-V%TjPb~R4w>-pQQP+P~q>+IPeC%t$_QjQlr`IT>`!M1aE}CEnEJ^%YU%V1PU zh6#`nfCEDZfIhi3z2wULiNGgRKq?f!oP4-X?^6W@Oe^FP>TR^1 zhQOoRcv)G(xrlr{5gT+GN{YvR9e7Vc5V<$d$VSPPUX9$*ZoQ1Ol+EV>Xxi}X!X06m z`Ge+A$j?NC?b|9T3NS0$Cz1@~S!U2_Jl4;dnBybNuNT=%vDHqSx@Y z^_p=3}Kb^J|7~H*d!}bljI`AJ5ccVIJ)0fVEB6M7eqmJ%vT@I;`VVLtd>*1AEExK4Pe5e z$?UOGtK)EJ$-DV|Ah~4)IHED^0(=(Dj$qSR;_)XjBRi155NIcw3(^B0ajz*?(^2~A zyQ}R#M%wG+ijItN{+sz+VBE*_yvHII@;d)U#Dj}F9V6HfhugN96w@BoneapSI4FUZ zgAUap@d4zGnBNC? z7a9gvrLXN?DDn&x4pVc=R)~`-LLkbE_L>0y|MV>>(AaPAA;XHIsqp&>XUXUEIpOn9 zKv}OsjYH~jvo7ko7!CzkI1y|$LBp{FTfExj+!V3r=nl+VcFfX(*2#Wfj#czLc~2|^ zX))d0%JBsTcA&@qy;}}x&NlyWG%4V`H=E_>gQ`Mnf4e7OTwmyYG08sMJ3@K5v*;-^ zV~GeUs*${ZAdny7$`6kU3R?)^La%<5G|#U_hO4p?z=g&4zr7VFKRFw-EG@uJ&s6*3 z1=_v(mwKtM)gzy&wY(LudU)^f0P^uec!Q_=zLQKabnrw9Yl1WrJ-lx~1ovWX9o=r} z3oqhSUk299_0E6d{l}WeC&81jc&R5@jK=^lXpI|sPvSbiS{+kp{Wcpiu-qUk#Xl+HKx^K1&&oO$TlKN+O>f zrXseX7(aEKto&p=CS(!EFLTmyL&amUlngLmOLKAyQvgp;uBQ+0t;11~>T;t9m&REo z5(Uy52*J{vm<<@Ar`kygGXbtk%6CiLV6@8tQo%aEyW9QZmTHYNHSb?({Bh=Y8!|bk zgpk(-&G99ZmBBz&PAISTyA_a{`>SvN!{-e|wDZA%?2m8GQ+n#O6bv^~IzB%8Dtv;Z zg5MuNZcx$Tr>AfvBPT;IkxEzB(2}`~EMDPTN${ERqrj0ZzNcCiZVFD%pJIR6HAI|B z(hyCNn>A}E=3ySSEAj&f5!N0`w+T{1K&knHNC^`&P1TXmBL8BmDlh2$E6pBqNIMorTD#Z42 zbztcRvGg^!N7Tl!dX&(;;51f)UnKe+U_^t!&cuBZAFkK4=qf3SAFS+YHf;v;w{U5tCK>}1d84!l2iEprvM7&EXdZF_YRRAY?r%a_It1;J1evPfnLx~^RzlVf;b9HyYOr^)nNu+eJ(EN^(m$b)+R%4Z3~TUSzT z-}lv95dnne&~C(qq*#TD=TD5^Zb%R!42z*YT9hcVP2LUc@JM0R;cYCR(f=dr zE7+>+qHSM5KU{GB#F3qxsOoBR;!nSdyRl4w%-66W9^|IQv$Zmo>1u6;%cH#C(xn9u(*3 zlU(fopXJn?r!tHtdj=y;9MVBLWtDt)02n+B2E`dXVb1UAFR?27160 zcSJTeR~W@(2!^=(3}(Jr@epNXF1#cf8o1Zj!ptDZ3CMbnKElTYUw&5ld4}OZl_W5| zrCU}bJu`K|Ld6MWbwstlt<+v00HQKe`4AHtp>Q)P2EA`#zOx8=%e#^tGuc9JGG>rL zSM-Zvf-l7-0`5Tn3sB#Rx!YkeQfISWzO+C2|McCTC^lV~tDBz$1}?_zw;F;GN}tLM z;4UQTnf@I0Kv#co@aI*AThYH+`_5y(m+pzWL)ZTaQB5PG6TOolaRvo2b*h2sTr~1c zc&{iHNKPe!ZI~(3Qdric!85_a@k~I(4|V@zl*lv)_y!4D0~1v9+>;V z61^BF$eydFCL6et>lXkD*^u*I^VO>1F(By4FQ*qa@Q`#^^akKL?UhW9jz**FXrByC zLNiu4n4Y`vJx6&AR7T+Lg|ojlrPs8crMh=4vuFMg1au-Z(BN>Iph9oM_%lyPvD~U_ zz#Ylfb;v51o4e7bXRxsgK5RFkgo-k4Mz$~Aw+T*;lJhNP?hC!2t6YGzm#8S7`UVCc z_*{JGihXYe?=1F3mvV(Fnhvv4VtK}j5aHrQeh+eH{cIx@E6^x72VIXGS4`uYuGR*9 z5v`5WgLZt=tyO8JaRR;Dif&=H#Yk!9-=j7sPUyn%-n_y-Wslmr%aq~nctbm~A%{pg zy1H~0b9?$P#e&^(uX)&GNRUwfe_`@QPhM<~YexlY zWbsAjEV02ee`EOz6&$SEB4#x)GJ$i7U-0f7uAur!hIe@=enj36Pmb2rl=bv##|9}k zPGiD`2SfdKu=1U+0s}?IxrbfaJTvQ7M}IGRsKJVzwR6#el{H2D4Pqoi z_>WW)z4D=MQv!bjoFkpUW?|pFj;2_dR}h)ecb3-ob9aYxuzlHGhBmW2Y7i^KvjkMm z@Espby6xsT@3(U7o(hVK9WUNxyb8vO^=5{QKL4!!8JY-b1GBANb7$cH(*HX~w=t1U zCOZBm5o*(5nJiJ9n3(4ZDq)M6eeREKVYDr4MoP41&GN7mYV-T?z!Qe%QU9sxBUcKO zGRph+d#v*VDLh4bOFHC2)*E>q==$~-s%OfSYx&1tUxh>54U zU>?Kk8@DwxP9MAc{H_9?2A&-zs6I-|;J% zt&I>JtW*F?Rasntl{MIh%`>8|%_3^=6hoGq3W^az4UJ@3ASrM77<)8Xr#vFNkVZ0oAB1X054z)EO&UwNI)AZr#_H%gC&2#TZ z#}AsZ7gs-larM7~PZ9??o<3+daA&?hknBeTYAWwl>|$1ySU$8YKPdHNt0Z3FWARSM zvQuS^ZEi#wpRC9336N;*6l+xCB0-js_Lf5}SLK$EM-06zfPrOS~=0HBRN`!A^}|d+Pfm|G9B6ndcY+RqlZN2@D`!D3XHqlSv6G6J@&UDQWT=we}I+YnPtW z^y88Ktd9?Q!@S>B9PyUR8qq$1usHo@2F!(S{_4iVHa`D+;jlmT$nXM#K`||u0PmT@ z^qxuUZFND#=IXxE@$GhN50U>w6OBvm_N!HpNWWyek%jfE`qIY(=;$pDEXyBgYPTL_PO87+ z_Mi3JCiw-(5WUm|->RbD^6lr9urY;k`{{?NSmbnjlPU)f$K^4dG@^qI*UN>T@P@3w zrUc53>JMzL>$YwMLJivuzu8B&E4-9KYzW9qA3`WtpLO5`$2~w1@I|%KVR)*$ z1t6!-kpHkWdnUA;AI9){4_f)&A#y^%7IF;}DOCNrIu%pYl6HOylXqn~zkB0eY(9eC z2KGx$IvGu|>n77oCMC+Tos!@Yn_*&v=y+mYp`rGQ>Oq-7D9sZS2swTP!3KQC$DjxQ zLyAK6UcDPfxreYWdi6NN@e?821xdDy!ODAU;>S8z7a>{0t6xKbASMnPXz)7#%;UVL2mv_Yj5vwU}y7(d!*ltP$iR!I=>({J(|}(ckXY0 zWys2Rac?q_<;M76Sj>|lB(MXIk;>L~rO6iaWT8Q7;^LxM=bhk71IQYCZw4JEWk##F z9~dDHk!5F{e{$OabEP6!rc2U?tA9(s#!pxMXt4awOcRr4;G=y~M)BM;(0>h>d9NTN zL)jeX+$ixb}f~Bu=|%ktIejR zje`Iu-@B7r3Tz8P-{s}X z1U|k^=Q%sI7!Z5t)uNgA^$Y#Ge}tnlRjqYOgQ2LH%-)CZ@qxUJw)6gYSzkW~U?Aq_j*F&dRCtT%P6Wk?9q%ung=+B1wZNHs} zVs~1Nnn__z)-KAEX;@RwCH6>25BSpDX>m53W{GXGYlBgm`!a|3_ku~24nKz6blE;V zzkD5HgYRH+f2!>In#8xadv5Apw@vYr{9uJzvPKEB?Sil=zGdEAozq)^v-|;OC zQ-SrF$3Po}56r7KIBvZf>Ky6eR3gP&9+5~$Jl4}(aw)u+44X)8WsXpt#bc`lovm$N z3KZX=;HQi;ax%_F$tds9PPkAlI{X(>Q(+M-&&{S_m?xLalY}BD%}*XZ`WN(^oXjYH z_rfL53Ul6eI6;Ic#IX%w)k`O~18#%cJfZpM#H_%M3#Y3-Vi6E=Savx(t6+W_#4GO_6n$g<*@cEk7BKA6UVP$~vLkgVHZMH(znyRf@SdEK-l z>0doJ*fudSqAizzJi)74!mq&6TU8S}E@k&eClpJt^BOSq$0o57V!}3RiXa z%M(A5^${Qf`{sL9Te(OM)ltBOHL|_lWf<1J{TSnkBkWLdQKZtN03bhe7H1n8yc$tE zTWj)@r1c;HJ$9kUs!xKnk=dL@aHH%bCe?bUSZ}@x=EYJkTts0u!`?2e*DLgG8bVp# zqH1SZ;Q0WaAo1b_(MYao z6^k&X#tS4$KTt17I%p4?wBE33m|Dnt+#LK-PrZ(^50$0)9Kv*iF`WK&-1qj_Pnag@ zsrGpU05%_9UPEn5O9rC+Vt486_R~2Hc~*0Ejy&drB%%r08 za~k&(tvxrEui*^%+yud~;b^qh7vJNt^u^TOZ{=3R|=<#kPo%TFs-4Y&9{ z>hO*e(`?xmXR9X1M0czu932XZ&WopXY>H>fb6KaUV>T~cM@|7d*qon#r<6CYGB&Oh5l&P9#1;0KP@9J%pR`ox zjsLPlX5KalQO$#3$zU9Yz?hgFdgQ<|nG2^YzxyEGvWWHeO}lG5oAgfyt%ITI8G0MeoWT3vO-})m~c{?-Rk$B7XSjVI4;sE48zsffxYtP#j?Q@2ZWE+hP$G<8-zgcXT-lq$jHt&C<7E zO%*Qc)N(}GF~HU9Wul8Pat=)Ab|wvF3>Bdfbv2CyW{WJ~bN12I<>bnvj!mL(XFC3e z3kzcy5=7ZnJ0E3chCq<5wS7-T6~Z;f#9(4_OZY6UJeBYG5jWGTf)&`97jS&%0kxRTnm(CoPJF1%#_ij~FmM&?`}WpYBx z;H@AqMM4Gh0Ym)HJ^wJLUhmq+u{>8eJJ2J^sA^MP*(*7MLLp7nTo#G6M5IaA#Erj@V!y9hu15aCBJ#@olFRWt= zX|cTYvwr!^6kP6?CT^?LeT<_?ba1)itqJC4qfyPUZwDtCIhdrE)o*BBceGM(mF}Kiu>qB$)LR^Vt=hM9Qzh+j z&|~>T<*jtVWFs_y9tltPA+_42Jn8E~Y9BiD9}KQS3lb!wv^EqaZ=OU`Oq-rd=(Wij zw0U%1!^51R4TKbH5YXu0ptC{FXo zH@sVPYUw(NiQHL;(VPy5uc#*`nju22qkiDmzRC+Ev_LoMA3mHld0ibPA;EK4VwnG% zMeVz4pOhApsi@bfM)$1@eBW)s_qH%u0R<>8`xuN4J0o0-Z#;{K`qfU=oBXW)RGRTz zr&zqP=j`#ZfFQewssLaT*1$+|eB9aMiN{FxvCpFZA%^qk(J@UeQw)0MISabR#-?lk z>82>}f$LG$?zEW3hbKD7E$Pz{QkqM4ax?a$q*2>N1-S}m%9m!z2usf{d*X{tWHVgU zHe<^3=ARzi^Fj{Uy7KvFdviw#-y8E(DRlY1g0o~rK#f`!1?lxOt z!LNwfaTf{NLqRe+uylKynFqoxcS-_b-QQr5Q=%weI58L63R?TbLC}1X?=^jbUc;aD zJBz8GRy^?8#Y7Po$nWYP-{^KU*Tr$1Q6*SC3W68BaPGvAOBW(;2BY6RPvx*?%rGOk z0xvH9=&5lVRT$F{)tF<#yp)sW`7|}vyk#FvEH<+S9RH0pxTQwy?y}m8wU&!lm|?0! zJ1gr^GS0V`Re!7*V>xDTFcK9nPd@E$_Q^W(_Lsg?U^Kl6U|rq{K`necT6S~QDMFis zDANGLn9D4VN2cULw&YR;`5xw#;qbX3Bm?}7>IWVd+vcQOqx}gI$j{sLhnA{EaU!Eh z*fO9tZdwS7`djsn*rBH5=#9-{UNtQ;#mmb{7Q1VA03xXOi20;P->mU_Uuw5}HaPD$ z4Cew0zM=4{KD)hH8O<6y250?@;`J44bQ3TWUgx+f>wd{TK7pve!9gMM%`` z_xjt>{x?yf`1JR%1d*Uq-cBu$TfWQ4STQJ?X=&w5ierC95aIu4>%Wv0m?6wOAfbn| zHiO*g+HQbzTfEyikWV7mL($$2dODLp(eR~jGv5+gJ}gMC4_+0GqgMHxnr4I6c1&Qk zDv$o8oqwxt*6c|MLEXbml}+O>+ol6snZG)zt@$(zgwx{sWs zcZW2%H;?V(!bol|Cv#3PAV1dS%CG6z1KRD@Of4qBPvAw#yRa`{ba*NKyecy=^KAMT z<&u7!27iqXY;MwQSwl5Q-`yT~U2lE`Rp@7vrZhp>XyAzWeen^QYQC3*6D&-=Y=^I9 zy1>v)*YWVn({Q(qRv9y-LIAXwOqRxqC_sKbtFlKCU`O2T50m07Rsg5Cqr?3yc$fLlCq-T@Mx6P)yC6i_+Utt_GQOR%w%fsEd7*Cc?C`U>MAJ#-7|ww zHnyl&AvmYWM=4Nrk8QKURq8@v;@e5)vYCwNuE!Q5t1Xy4;^#ML>l5l4Qnk3$dAjI0 zq0U*k!J?-`iZ?@Urmay1j(i+hlV$DmIyP;Z)3rQ2J=6=5k5N!)$d=&Vtrgx7M2&=G zH^#bcztaRHgBf*Tb{hD3A|dts*kx{v-i9?z7V?;L}hx~L(K^JS?jUy z{0hcacRI`|USDnr=_phxROwHQWuX)q2S+7dw9&5mv@0)Lg8lPS=JixS`;$3Mt?9H^ zl2XzH7MzZ)qWDwQ4?HOZ;xs+xMuvTwa8$b5M4|;pD87B5Jb@oJnAQ;aNeji_z2)7{ zaW>ywH$!`sEgETl-u&9pptmvv`9Pd%cURqIFP-^NuXJbP?P=>lQfuf!<(O8L$8M#2 zng0SB)9~8q(J666MqnKW2Vw=@T#4$ySTSIN0a0Uu1M3D^42^8oE|8Bn8F;rd!PuQs zgkUwv|IiR_2V!?|;WT)7%Mr~%_eN#QNDx+0V-kBFTS@x}-L$|IVTU^7?BO{3v?7XzLv1MSBEc3GOHcOZKt~q`Fqc$rmm>zPl z9n8Sa`RA-Ms|a>ECdG=XZOAUJ_sXoZ0z7S=Wqr19PH%LUAF=)D2G~( zao|}3UoULBqiB@k47?K*nlLDZ(JDme>Rfld7uQt_mAnv*l_BU5=hFGn;ZSd!i{q-a zN`O3erXEeb!;>gwK80cwsE$e0-eHX$J+S2HsOTA!%!5#hy2zh|W=9Tu_MaH4lKA&@ z2W-8eHb-76_|KAML|+R?s+8t`QZ}?(c~QgbU;dvKApTzl%l#Q09C-GpUc~Os3WPr5 za5nJG_!W$+dH1@Bv$W={#cA+b%k)^tQ7Ztp?}~Y#!|iz=WWm&}Cg^hNaN$`;yOJRr z0DreyK(zBShcbGdme4JQBp76}{4cLC-_m^}k_aY*dmf-ewVm)TJMTkO{e?=Y=WVJT zMRP_L&-LY4oYy`h-IM<8QT>v$o`+{s{E5IM`$D=!di@AspUvs;Z2(Zgv>>~$b-N_H zR@YTMkSp&GgAS|2MNMXL8ai+gWKF&Skj^SaFD*wdr^R}TPq(kGtI`K`Eqd3=w(&P? zKdyW*Xl|$VJeWauFN^Vbiwm_)02tKHpM!a*>6B!?*-7enlKOUlo5yZf=LZ*-@NDoz z$^I3!(zC-AzaD&gQ(RogXyhj^|M;nr=vUC!DBGyT6|Zvz1%=(V$&MFBPynr}gQ##+ z8{rr(#(|TP0UJ}%m7Kznw2Yd&97dP`IjWX1cHOCn{R8+OrDE=RBi-F+8Y_d zC}+zr`@&;{B#wc4Y<(U)`{#~A$7i#2%Tj2W{c>q95exj!ZK(z7Y_LyeDn0u9(uLBJ zSQSAK2xVgyT}Yhh&reqYOY7$zgD^Q(7xO21AWK5#n zl<3Ef4zs;#bnCRJXI<{q2P>Fg_z!vGU#XeTberaUrj}UFt`jgtM>=Vb`pY4;R#75* zB3Jmhp!#2-WWDAHHKMz@&Ny&m6Vto<*e1PqmTja&m{01p(IF?~M+Hi5_@AWsP=k_A zQg+MR8RL$S@zuq1v>+_1XIGp6pj}|pZ8@tBxy3?mhn86Ch^F9Wx-5t#i3x`GI@9&! z1XdPL;5>8RCi609HLf)X=^AN1aN9+0o{P}jekO+!#O?K~-hMw6KgW$Di(cT|rgJ}n zJHh%sE{HAG*zd_Gr&Y`c5)w9|26;GsL4xNZeXy%F$ZL+WS7Ykk-=EjiTLWX^@5ybv z5?wy|;adilJO%jBTg{pe_%L^Y=AU2~iN z(t˪V2cjl3s{ysOj)$thc-NU(#w}FSo(l;Wv^pSi?o~kI-8~Rz?J6yQcBwSpx z12#obv0DsIOZguj&da~SrIHgxLaM|i_FKc4DIYHn7OPVqUZnLF807N~%E8i_!wrlW z?jW9?R`)zDX5OD08=-~0c^fvo3HTfYswYZru1XLJB#sL1hk+b)Fjs}_$@~@n&EOCHRu8wuc6t19e z<1ndHK7CnT51d%=&{35xrL_W@o3PF84Me+|l)p8|7}bd}e7~Wm+cSH_#1PiZ!b8M{ z)n=RUbFqL5`%cm}gRL@T%mOe{JRSCI7aP}q#2$;|vYno)yRM=o=r=#B0gJe&C7qr% z`8}g$EYSU|`M}e}M5+dey0D&uGkiNNKCJ>vZ9xtNADQr1;ll~d&QB!_|eXXhM$h~_i^sjnL+gMff>6YJ0p;z>R~TNJ8Q3?pMoj`SPEw?r0SU9bC$3ZcCN?ID}y2;_J>Kzi=8$+K6nSQAuZ#{8ya&M8cy5eXU7Oh4KM1J zk(%P>DK&kRPTfRQ_S~Xw@PoX+zN>m)zfC5@_fRLe2-|leEzrV+N#0MRJ7-T?#)|-} z#F!9>Qy}AueA33itbGK9O&K;Y*&wg=pAG@@xO97fzD-l8Gz8gH9iNh;CI51Kg}VSo$2e3n*- z>JGyQjoy1Vlv3sEV)u?0Z!oi^6RXg(VxscdfYIE~VUQ;99?G7dlxnc_?Dlg4l_D-?$OIlm=0obT@)X|)SqKXo5HgJ=FY zNHeB?QcQ7C^&nrnblC= z7dE+b+?KB{Lg$ZT?%se$i?uO+iH52IAglPC4_$5I)B6OFQQP6C0WjsAU1~e4j&5|$ z&20kwD-5Y3EFfX|#_12+wYtM1Ze=%aZ276W

JOqxt7S!LFz>gw?N2E(<56i#l?L)EuA| zFr7(F`$qS2_T5-Lc*8OF<0FP8e=Cyi_gwvVp74S#YoWV#^mw;_p`ewGBg&aO?uiA( zi+d>Oszv~aWvrZ;rg`Da=P)x@|9(OY@@rg{J=_t2ZEQtT{TUm{-l|tvUgq%x%#G)z z)r05I+(TbJhnNxpHF(7h5AO|P?0zBAVS6sUdueVB-Z zAE^z79#?!bd|02Yd=YL$Vpd;vi~(Rm51N3~mCESpET3nWSJl>f@1){k20vbzD!v~h z{rQ_!&h5J54t`)7m760ImGcLzu=V-%VAL114;c=L3#a;x8<%_Y?@wFE{a?ITNj2*E z^KIkn!=+bsxHOtL#VpTvYV4i97d|^-7kJ`NC%9Ddf${(zY3RUyz2B^>tTpYNJrzqZ z=4DU${?S8S?x4WcRoR$lj}P!Pb)rYU764j$w8Y5!Dcji{AL>>IctcOEii>k9w%n;Ma=wHSF zZN&sI9n?u!KiK!q7g7H3EEV13MMk%ZC_>zs)hdPp@|U2`#rjiv(MJMCL^u#E&PVDfpwi%Jf<7 zOp#1iVrIO-(0PJ|h0R%Nj_`?^QdsE{UVI1|#NUCG!#Z1|GIV>B^DC5m`P(-hbGV#} zEE4py+uMVK8G$K9%C4N&r4bi4=M3lpR`jtlrZb>FqIJJn*gMbb-Rnt~BD5m}9 zLiD2BmncHW$Y`^<={GW|4esK>PacIaPa(K)@AN6qIQ&+G}tUF5-R4+3wHe?rknpCnaf^^xtFECjJIn5y64X5!$}gXdSZM~^jYVTTFD`n0 zVA*36iG(iMy%(O|1y>4R3vb?i$>c<=%IN^h!yH2P=@0XZgMGhVagx?7t&7RPr67nY z2z*-12JOR-TlrhhUzIM5V`7_T^?6YY!BZI=TJvD|l$;MuU1Ncdx2sW_dHYnGx=^uso3T5 z!to-r{svEK!YOiIe663tkjO*`GZkf`htfUM&g|o7qv9ZwwXR)<2b)W zlOYQXXh?`z^EUeMyx3jvYxo)6jQX7#IPKb_#eAN>=cPNw?!vmCCkdvcK2JIy3XhF2 zW#!FDhBSC*>8hM3EBxEt=Qx`a^(z@WTo>UmTJ;uJk1wJHks=T<3(8UUmqXWZ4)x58 zvdwKLrSU_K=GR|kWr2!Kyj7jG^<{|fA*MC(RTCkSh!4pWNedoMmXJ1$0XDeG?9TG+ zh6VBz{HjuKql*hy9%0=^Di}7zdj$rVwsJ$Y9n*A$i#}=LLzzG*Q21;51u)^pzC`Qn zrgtVt$KkNv)qd3wEdQpq`t(Au?iIc!Vkpox1AUi^!soj2p}8vZybpK*RDxL_+B z6&*Ll?Jx!BiblGecOiQ3pv7JdaDMXf6vki7Zz;yQSENq*cyv=#<%w8o1NQ3TfVV|#D00DL0p zRWMG12$-urjo*&{Rb?SXn+zi_UN+-VodK?vpgMd3Mg~wy{*5sR0Z$0EMwDim`LG3} zY=E+Zwx2yB6oYLkyzY~Wt?_d6(P-ilC*p30HN&ZO7;*O(R1^Y{L0U7Gh3`CT&lY>; zSX!-#VFPZWid;i+B3QNKY&|w?laaI>%9Fn+W53yuZVtmM!^2@IzY>?e=Mu+WzmjYO-{aDEUzeW`$vWD4?L;KA_-{4NI6o<5 z6>hS$l0Fpiy$T@|pe9->ll)8?Kdg9n;DA2|Z!7oCo>aOJ71cz7^e8|nj<+}baSynT z9i7<@8pO%7AN{iiC^-E%+MJH06-$PSPiy**lP5}*c>}3Zz1-%Z3(gQ!URu?hVF$Jq zCDnewCmgkQxTuQEmuCTt$Vmk<8FL@oRxq!PY0UeP15@kQI^>gEDYnezZV5+6<_RolsS5-OQ7dK+(&?}Zrni=t z4PjvXBzdBQh4z`;*%N3)VL64{Wv{}QnBRIRxXLetxiu-Bm@@WDK(8F+U`16{<^sm9 zm~CeHCNvc5VlMBgBC8pmcpFqQ=$`w_wQqU?BSYyTBYX2B9bWR`g-O?EC2_xRz$&AKRYZloD^HUwsx5zB^pjE6z_lyijFV3`C9YK| zTm5}|mSYTFh>W_ptUje2xVuie?)~}6 zV+**iDBn$nA6(RJgooCMd#*?Mm2JvcJ3(UnQ{?tAC1L-BQ)p=nNHY5t8a4Hf1;)}2 zBx|PQY7pP z29Vm$YrfLCphl*j-?jCMu&Xxse0KRFc=_klo$kN<_`J z?i?f)*Gy3zYHDqP@oOwJFu(+Gf8W%H45zcmy^gqFvQ65lEj1ZGJiFcK8Ybmneemq+ z1xE{WU*k$DTDGtI3T)l2l@;`&T@j*m++3DD!0P6gNlX|CImCGm^i@)iHlOt~%Dn*_ zxMAN~R*b^fm_Iziaz5j%%{x+ON_86%JYH8dcsYkBBY%CD7%7Cnc<*@n*x>g;HZ8}# zU_a@S@imwu@;W~#_p7MHRg|N%zgKzy*ycVL&lL*4)IGT<>**cc;k|et1iN;sFf=7V z7ACuUYwml=0;dsUx1-F!R`TppN`LdMZ{N{H8V#8mTB@v5BDX+se)oL_gBkyS3cYZ0 zUb*`;EDO6`rYX7{q5=tqILRyKu}CTbqf)^GxKIxn(NowPNL=5a4+l9y!Putedu25* zF9_ZO=l$NFY(ad;Ov(JBowVqh;L3Y#a6E}U7BYT}bQhu^M0zE>yOT!(U(^IkB6#0v zgk?50O{05JB#6-~biAUu2>RrL>IwEjEWbwr4jtl#0MX|2deZl}RnPSus~%cZ64c=iD!G9nJ-BR?N2X14r(-CEVXuabFZ zV}d?oPgTf;K(f3)otfUu&#>|jvy3pZ_wQZrB>*SAOual>T0YsMpbq*2G?E^k6#&Fs6s7L11f$F}ByTUpx8hpb09wgRP#iUzMle z2x~x#mDP$fXol}~+B>~T#V<1tV>J(?3i7cTh8@!sPV`>LB>kH{6f%od+prd zy#!VBSk}Ip#Ru_C88pTBby&|WI^@6$ELmKvj?EjKS3Wf`jcr;^#VL(}mJO(;b?!gg zM-=ZW5|0{M+S}=t`uz=CVk8)G{4AD8@OV*CYy3EqV%KOLb)B8FvLxd_Q*-6PjFRQw zG%5$>HAKtlXd-C-NOZ47y+PmgpEOv z?|k#CL&}`*P7wX%LMR#mdY(Ue`fLGBWneQn?hE&a21R(r*k{p{EPaBxsNm|c_#XI) z5FrTQqOEiLnyg+(L;1KNA~!q%Vo=~GO-53Hl2!f@cv+`r);rd|MDtjdh1)`PtZFzs z4J13wj<~k;Sgky-h2r*R$+(2!Un&3~^!fS~aD;wpjj&CE-Md~T9+=49Y=)3cBJ<(S z)?+V-lk@eX%|u$h*sRRs@OlNr)Y}y3ER*we%g0Kj>Qs&l`p^KNmd1nu>oVXqQjHG;aMD0(? z$RefX44aar*>(ODIthcndM?d(x1rKdcHQFq{nzw?>DK4oI2NGx0Dt2bSU zz9hR>q*qmb1=gdG005Un9wb#SQ@2ivUA%4-ZS6zFL)`uob?dQ4`dk8H-H!u$&`qiA z^-Vh{iQqiIg>A8n0z0d=gt=xf?FRv@b_?pK!g>T>NC%>l#j=|8iiDr~y-SU^Nsehf zWg9f$;A9N`rK-w2R~f{}7*3E2kkenb9s-heU#dRYFOswyvx_L;D6}80D~38{nbMH0 z(Z)p*jLmK>W`8-G4Lq8wQm9ZaM!X(eR8#u@xqb=R{m|Uqy0|Re`IA$Wp9et69HbvY zje_hJ9o`aE_o^1}W)Mh3Jb9vEoB8FU+RzeD-BXv|e0e(7I-o5Zo$X6;NPzaLy4#mV zi~%G9bo%@8^49F_zE-Q!#Y4lIr|MnVw0&9)@v7#7uk1PfsLxt&8?;=WpdgO_T~Xkm z0Yxy(1Ff?wd>;i8#z2&nsg~mxgRv+;Wk}uW$n-EjnIBP+^ewxpMed7t|&F%D{x`81>juvUG zTlkIkoqrCi0m)rwHg*5))G_WItq!yQ`V#7T`ZR@zHIWpHu9hkRi6JuNrz;LkMIB(b zgPykNd_`)|V4VNyC+XG$WbCXLCgPfj$bL`zSiaH$Vm{zFnx>EhTfQ41>qWf@m+{;3xvZXPb=-6%d^yCaH^K24?AomB(-Xiz4TtGYE z11m#JI{2Lq2^m8T+S92b$BLk(9RT3pW2-KYU7ts3*M9-L!9C)|!siQT z&G9X0JjTYTL=7pESO(HUE-C3Rql+{t9gu^PMWN-sniVPDS~s9)L$bCc81f_u3BUa+ zjIa57SGg$3v!(Ep?_e?B`%X^9rc;Ae5ehq|yGyH1bXk*%yJ7PNxnZdf4|0{5LomRG zsqwFOhx>+Zm$K!?xQ9nTC({Eekt@)}z6RNn4sRfBrX>+2j7d^$eE|O^AeIFM8j2?U zt2f`0QHj{oplT!M^58OSIj2MI?CkZ?g;G~gf9ST}ew^<391g>{l9B%6`}*}{OZUC* z9{D$vSzZ-KUQ*m(_Q+YePWB?RBYrrpZNswRxPt1>^l-FrT;%b_i^Yq|m_9%ndZpZl zxE*70ntRE?J;qc}7>D}>d_oZT{~16b2Eh7<`g1?S$XTE9z~(=JJ%ulXzmd^!-2eZC z%i}T^)iy3y2gZG3j;}s4&WbOGjpSL4Gk@IE^Rh$o8@DMgF92i&Gnkao$Up0R-@G|~ zuQa7QM_FQtzB{XpciTzcF&1EBcbwLBn937g+j(DJgbZaCYS*KEtBjASNsL|FS#H@l znN&OFpln?jVYzE2I^QSC#svh+)dTIeAy&YimW0>?;FTrKKGfzq4fFyd1judW;uoyX zTHIsVOLb+y*iUNnb3^ec4R+Ui)RP7Ya&Ss-es=&*a@lS}`k^|b?VxSRu1mx3Bh1K; z)b{Q0)As+e_NvYv<%px4cKhR$I4Ni;@9Era0FRMrZEhxcHx z3w#V00!wsp!>~j}d3Ji4SUxTYW5_DR-zPhR!+%@(*c7jc$#@0M({AUSSDa%|1fV?( zGocI=rKu|&QJ`LG%eyXF;*0g#HOAIJ^atRF)*j=np4U;3W#QW2dD6X)6Ni(-G{ zCVP#S9QX@hd-^cA!C?Qe(%CH0d5i1nOf`Uz&(0SmURyuwjC@RA!wFwRE_Mf(QWOY% zk6WIIr#xp9nykg#@Na`7$#Cd0a;?^VpoQARS5@D8$i##jaUxQj&|)_?bA(;4^JMch z?f3xKssd8Di{p*wv*Dq4r^0ijwttR?)s7+`*Davb{$`L9yIaQX)zbw6wGnj6sZF*w zJA`D+&uYjLq7Vy=ge1%;0zVcfylR!i)*DOwuU&agc4ZS5FWNRXU`WRO=2#eCj;QUu zjvi&)Y#Zh`)x2C4ZTSJnmD;bzu3xgn?z003tFr2g^^!^a_9P-a)xSvJrQ?6$^A&w( zgyLr|0D*G1iC(5C|7#2(6d2l1S^zRzhsDrSLs>!~t;EgOD<{nqktgN1%Oi)Us$jE+ zWz~BL-h+gu8h*OpSlLM;C|s}i@7Q3>oNb{0P3fd0t3eCuT%}&zzOXRZ(8bCQD~=|Z zQAT9NT-O&BYlVxFyjIkfdXE!X6-s5Mx;I}6&-EB)$dlsG!uFX|v3ez9Fwy}}mrArZ zH`mk#igbvK=OHBjPFL$qlGyd;Vx<_D+Eh?`6?8-&H2&V!U* zNPnT^>dAzgI%3npq&ZkEeDZbpx5)giCN7|?Clm=TIXeFKt#WL6axI7kWO;cb0ZvBq zHqr(SFu7kScJ9yEJ+6OXVd^d?r`e_{C>Fwsm=;oBypLg6$ZcO7!YWyHYeK&i>D&+> z1Zj?)Z1Q+s9F-G)0bb!b0Jy)0KXv>5D!*fd39K+CptMUCC`f!$ha80F)I==qd>Sf0 zvhr#oY%8nzo0iN5fa;mslLxtdX{`9@$Z}uohVWiBFBHO+k&TaoEcU$Zx{bE7^6->_ zV_>b>pGLPfbFs?nrfuKR0W)j1_|Qwi0@gSsBqX%Ao8Vjqgm|}+h{S!}Rwia&8lkOJ z*pvP)i8r@b>ya+@2I5B3b7dGZHWrvS^=Eeaph#_=j#Jz>ZK+C z-*WdWNXsO>%+X_(uTR9~jj5w0!}5=A%K@MSBl<5hK_}r#viaKDpzvS%CmYM~oDeba zPuu~F@Z_A(0t5NwM?L?s%4fSkh+ec+U$;Lq1%?QPc{M=qyg}L$e12_sm+;KV$#QJ6 zMY{0rh;&*KnM_YeKMSP?EpXXj>0H9!!mJ97?W&OpC-SHZNh8yI>#%yt9q0Eg>~95| zZpi5i^mj0yo9um&B@3Zar1=G(;MN-4Ik{AV)gTDa^%&7Hg-gF*10gqQS`sEgTx9O# ziN2lS-2UC7A?vxHuy1OM6q)X|L?(UFoP+A%!6iMk00V(N5LZrJv>fPt}zuxc0 z?)~h}&YU@O&a9qZiYw+)4+a_NGVczaYVjZbj_qXv7v>j0`r>%CHC1Qo?UP+sgBr)j z&{rg54cf?(yrET>>rG)$p5kFvw7M(qzVVuVIDW!o_2cfwR2JlMJZk~FvmX0-d%l;d zErZ{ZucHW@UHLzBlY}QBg?%UgT(Uns9|L%WDD0ED-jxq5qLA)T#|MtgM+44|qN(D3R zN@9|CZ@}zuMTKrt{+6T@P``awQJKb%%|6{{o`!`emTTBVl2U341jnzBYpp(KrRj>;BPkMNHOf8&WtJ7p$}lx z@@iX6tB6gAfawOvflOg=BpSU*2ZIh{mVO+mb?#+9;Ws706)Jms-bYT@S>$FgCTR{Q z5!>+VWp(&kK?EmCXd$NbE0wl)`OLFYzz_KY9%rb`f^1`k**2qu^hCAZxP1!}33U<@W#|r17QQHGf$v24{H5k&#lg}mfvbbP3sYxKuiG27e}8(D z!7BTo-kOOBA3Y6d^%VFHM7H|e-Wr20hT-E#k=J#XepFUOPEX(7LJJ(~dtwYSZy0IZDffBDl^EIS^*ZbXQqMdJq|~i^ z5Jpa7k1S|y4(=KsB(^4{Q+OqTnTrD~;O$kBu*GL?if-MZV&=nJfD0VsNxk zcqI|{!`cwsik11%ZDM;r*wX4JTu3|WIcDS3S$PNw-@(aH7ZUcr_&1HXZ2}O)3Pwqp z9 z&tQ|Dp2&IVD?KM-lq%OT<&EjPN6STk{$o?|l@7o(`?T;uD0+1c*@~&l2YDXg< zeMzs-X5^!TI4#it9?>YC)9Q9*+5Bm5cY7h8Qu9NSG*_X##%`;(X288LP;*g*%?=mY z#iu5w#+7Nw##6ki)}MJhFNIHFa0(k3fX*r5JMT3?x&V`e0cn{{vuW0?)8~;4`kLX` zH`yrA7|Y>}=WQokv;TD!<7g!x_CxVVHVg4y-aBSU5Nl)N@z)m(*r?c77H0JeP5m3= z^BVJHUVq^oEM%=wq}6YNl1us;W*DdfObNX?9oqcM4O6okiUyRR?j59JhZ-}IGkB~g zW;@t@N$*|yTGPO!MXFeA#01M@*pol3Z@Z%iXULS4(xOvFZ^)v_MN;9{|M=Vo>XDI^ z!pJ!1-*X27$lLzZOw$eN%+pOys(k@@SZ5Cnv`=HWk#;dIZ~7;eSJZ9Emo3bE^+F$x zi!1qmWN-!HcOQdL*2B6e5Q*V{V1(Y~rBMSvZ)7wBo08I$#r)Z9Yd#?uN&0!(u;MYF zYSdA7Q?XAgIIOotKPW3thM&UrzWV}=&@>Xi>ko<$7{qk*Z*WCy_P@Jl66TrIUYI8Y z?uX#2LNs{ro&KP`uJjgw_W*(b)Q=p54gm80`^W%FDLOzQfEsIyzcPcTJ<{ZF!+-}%KsP4V%(|%Yp4TQhwyBa33Le64pp((83X}4Cz@P>iUA3ZqG&0#p{^DT z#gvN$_lR|@%napv);0_UJO`DHAe!;cQ6Qj8-m6b}B#Ap*m+zaDTF`Ky^ZZb41WYST zXF5iTiv2iYiIXiDh|XUhS<9>UcB=}wtM6Rw<`RNEEWyKf;uKPRYSF0}O99W3x_Ko7 zdtsWW8FCSafdc50%*(?=o#n@05+r7Yw$+^e)&2~fL|;jS0jXqlc2AIGWCz5-KP086 zk@VBBso6Ho>l?C)O#Iur=>Nn#*r3q@{gvZ__*?j&6r2tY#2t&}m$&kM31y{FkZbzY z_guA~iL|hg0HEK<|I}~HR1vqO20Ho@hPRH?^|TqDpf9{M%3sp65u7CZcGrSRDV!`7 zj`jT@4o0#D^k7I34l#&YM(C+N`}ttKy{7Y7aWO|ZD2l@87_sjPGyy+7Z~ehvpGp|i z?lz1Zv-|G$xmUnH77VJwl!_!*S^vYw1;p=@g?06`#7Ha)oM;4DnO=eXAShrJ0?qy5 z_iHm$aAxuy5kcHR!vAprLj$aVs(`0WAV82ljq`ba%&&^Wyea>yH8w*;$Zqr8pv+^k zGV7%&HSQ*0s1xb}uMNnH6fx+)X%vj|4~Yeoot^Uf+y6pU1Pnkt)MI%$Qkbw5g{t2P z-G<*~#v8=X(>os&rDN0|71Ii)B*0BR#PBm8B5rm+&f9JOEKL=d#ckyGAs8mB#0Dis z4rw%GjucF}i=ae!JKi)a%{S=P^Y4v{Zd)Ea?6>D?@t><9dxFuG_7?-A;-Im4@3P#Q z5HH}ECWh&qtfwfAh7z)vQl8R!So@(}b>4>RE`vzejKh@;Q1SV*?k&y?*5y81K zaOQ#m2d64osu!YuBOr?h-n%)sxmYlADOh?0E&wO6mnYp=H`IOm)Ay+KZta)Z(xuN(KbKtcetnO`rGY;_(H zsElos80G=O_t z`E+DW$)NCZ5h)Bn;@ehf`hMV7S{)GOhU_XTOZMA*nE|SI~*h!Qd6e01Doj!SP%cY#YGzT=gj`^pWeUg zM;sslg?{$D->9z_M@gl=;JNfYH}FsyecVxbhl!d9TmJ#?E_U#vPYQlweCjPXd7Uw>W&$Ug%M z*n^WY6%pjX$Wa38;Me3F=%zV>{^8HR1H8LoB#bgmlHg;{PK_@pz~l#Nf)y(bDbHuu z2eN^l7b9rE;&H-3iONm>tA;ySc*7abY>rLSK8%XVTer?3{=N^7 zUba?}eKqg&>peG6s6nr}BSVCIr!ag))!eswKfe)6>d<)ks=}d3p878l)Ju=(~%q!CXBBVU~`hEM7Be!V1m$%}<{K+A55! zN@0Y3MhaYl5c~8nwDKp#zbOq~n*scD*fw1CwdlaO zSaUTXVyrarlvZv~6UoAaiD(lf*uN@5(9gan7O>_&fCylb;OiF9_{$q6V)^0DYovkz z1!bxcNNU$>Z&bG^n+e%W{{y^|JOxmZQ`#*^&X-%h!|A2>-f3m)TK(zJWr9t7yVLli zQCWXBDzA!xX85)*I{Kk4XZ$5?R1|0!A4%imt8Rb{#2B~907~ca!%)d3e!l{SSVoMD zEICzy0EkB4M+QP%O14{2HwC38YwW`GYyb+c$@?=Vfle+q?*#BvLARo2g%1kqj4^T8 z|IJd-bE_dYX6PgZ55wpGJXiiD2o2prKJ~GisUFso2xPlscAU}08xWW9JSM?uD z*khVGdhll=z=^?7#5{a|YLHXIs#Ah-^+C0{>!$Vh6d+%SkEb8)A}W-54suM*JUh{d z*_>6`xFPsbw%_uX+pBo7!USRGsF<0$@KJ|T8V1VwY#NQJTNbxBEjQCf(^8%BT~f*^RKOd~L^GkA07s`gAbE}hHF3I-YhG7~I71x2iW z>jT<;Q2|%Km|gz9{B+Yp4f=BQCsSrOapZt!Kz^0!pE!d_ZDY8rVjs0!6M=c(*|kRF zkBGF_!<0uK+R7~QrLZb$cz$ClQA@JU6J2(r?*VuyMdD9fW^{KA&Kfe(g4AS;B@GJ_ z(9(+f7Mz(IsBEvK^r=JK$P31L1KL4!9b>BV5eT4|(wEmG2gA3tgVJZw+g+V3Mg6VU zbPP(l@zcQYhnGx2ac3fxtw2{LkmtoW*hG$*_P75Y958zaEfJ0i7|b`PxPbekoPv>F zTlIHDV1NTCtZ*Lo^jDnkPFK8M;po`+od}OFW$VrSWSLRw9;@buRiUDSj6N0iF?U{O zdD>@})uy<9aeB({f?ds;W#`i^9_c3j1Q*wDKt8)#$DgpG1;KRH2hN!N%K*cM7yK*x zXDLv#>UIaRaYvPysO%aQ+O&_)PW{0SP$MPu}@HeO;LfXRy zZ*ml^%6!^65$axZtC!W#vdp#J)IJ$#>6837p=~o%M*sUa@kE+uV*a-{fQ=6VL(AMD z0mf2aBa@AXbYH9%{U$eXz*6*|LHZzJpH0R%3FfiXw8TC~Nt=2N$f0tqZzKVj_2192 zBnf(r$rmU6rY`R|e<-C(uFq5y(Yzak18t(wb{I($Xf}M!iO{PCH5jPo(>`(my_!Yv zeMoxS_P$HpgjO6ZF#JPoDcD(g6z`3HLcdYBIBdb(?(`lV5dOMdw~)&fjO0JRUy$?B z7*jc(8qe@=ApdCQpdXlQYu)7N}b%Pq0}VI0oXA(PO~Na~X>hAWzN ztt$Ah1U9GOjHz@%yfsC#0Cl>0->N;g+5#-oSQb6)`T?LA%-~NVotpC8H#sw21(Ovu%G>#k6K2Mop( zXl7w%$#y2aWOCj52%DAwZ)6b4s(6Nu=iz^H1*g^sQA5UYkApf^+f!c}GmxOI{H16o zqfT&_)$D%FJFq`EXtO`Czjc%-FK?(bbS$5-!LX_eip)brXQm0IlnM$>4Bfxw9(bCO@#wug zjEQE;z36MPd3E9H^HDO~Q$1a1>+aW?=un!*C0j$}t}$5e5SN>~+B_IT`vM%kt14A4 zU9z494&XBftiq*VTM|nDTl)zC0g>}J`OeO~)*A|B5{^0B!Qj$#{u377{#&f%rYqFPPlgF} z((zdUjy%3Q^Y*$m)N$(1SVMK~)XwkdtoJeeAERTK%m)dpxAuH`u+p)n9BlIVmt$Ki zbuQzktZnEBz8u{I-8w^luQr^%znVvubz+5ommN>nAJ;M_t~>9_8CyUL^o)445Ig;| zv)z1#h=uRFP^OwMw153S7hq+Q-W;n7RQrKfzmw~X;j9th-#x<0aTz_~_Lo}4t@6TW zbVMDaO1jm-E+ia%2E$Mu^V0q5aJ{{o-@Okv;}&XsB&k4rG?3ABo-8Q@7JWfDd-k>j zlwkh)ili{9Wxo_lhiUny%t+{*R7^=p^Q@Odv(1s3FISkM*}W7C#gXFrnM$^T^Zfkh z>h-KX8M$3fK8?(3!+8O(-AGB zfO_jkC3Wtj)D0K%_v1wU7xMn@@>gkG~MD2y;<2j=Y; z0kT8F2Yjf32_?zz%KRcn>?uniwu*9bFyK0y9qMaJfNw0n8uO+f3=RAWIE^}6mf$1f zx(w>U3#_e#hf>zOLyE}x$9Br~DBDeVzm!HsC(kyg55JyQ0S}yhX<_px1<w6e;RL)D zZzs|i?KfZ7mcc{Q;|=u_C!Wjs(Uc+-?diGvw!}ogJ#!nY0JgeZ*z_${*>34&9SSyZ zVs)E+1X_syvV`b6toSt)Wy4VYn%Z1F0lH`&-)V4zkAV)Hp+(Kn!x(@;Vq;Edy(!*)`WLkw&#gO7Kz$7uWk$vw@Y6; z9<-Ktd%FZt+C^t|Rwn3tt?5G1d*#wVG55OzSNu2qb0r zeOI8A8y)?Y&uGuhusy-FOoo12^ierP6=a4Lzs%t{M-RTjC{z~@x27|dtfI43$2q<~ zVsSNj!Qm446C)fkTV7Z^pcX(G93W!N2^>W=OY2&*uq)q6WA!J9oD1sP z^Pbc%G6wFbqhsQv-PeLjAh~fa&*sWud^bbyNslZq*`RJ!(66*)RU_c)Ij#RD)x`lX zH#ByYGUgcu)2uA&+^ac%$sp(f8|CUIoougOh@SunQ>V)NAG z6fgwlM1S$&1Ks|{n1J=^yHgyr4{cAUzt<-br*x+p&ynF?eQJ3J7WuUCT_X2Yd|_!U zW;B^ZPC<%TZim@E2)mpmNSz}kDjM^fBLzjVg|1B$AM`b4kgk^K4;cXzb1XEt=rhvp zUm$C2Q6{ZYa*-QpQD+jba^96`mxNhcK>H_*O8tVRh= z{O;Jwq%>#~2PxanONA>BYiRLpWYO}o*p?1@F7QTENl+EeW&Jds(OY<>XMq)C+?XS* z#6~BGyh3oPj&eiIJ10JijHs%qyP!&wmBI9Yb-Hy20JUQ_Y^2Van|6x3dT@CzqCP9< zva`=P)xlb;mFt<+gA)H%mpv707q?zGi z-7`UrACSkD7xrW&=3nXzJvPw^(lPWBqsD-dR(RD9IMC|!K6=pYh0j-2>~pigIV?z6_U*qp}jEahDxFe`pwr2FK z2Sae8FUKIr#(aCXfM9PnCN*E5azFCNt0Wm*ilhvtTWdJTt8V7hh52{mhp$%$1cgeH zVs3-g62O3|Q^0$W5Irgi99AdXh9qLG?j8%wvv!Pw&tmFRlS-et1RoytR5g>?2;=K( zKVZis^pAkFkZOAYuIh9s?zu{Is>qh2!e^?Wv)`c^XIn9=0<2tW3t&%>C}5HVI9xdZ zn@RGi#hJ}9Y3JKgp_S`!!6%52>UY>9`40>VH`%83Y;ixCHBw2^DaW4%XJ_^4psnkD zwV7tK2?8I51iLRE=W8#Qn$lCH4B?bNXQw|$SBx${c48rqAkd*Y@Xe^lyqb@dCT9+x zW;3QqM4vHNwUtG3pPm-FAZrhNi7IRPE*3TH<`V>SyPi6ThT~jeFsk!yKn+-AW+`I- zh{O4vm^JSXfKpG{m3MVvE2nIb7i$j?OKH2xk=AndtI??i@r>zcbSWDsgN!VcmBE6A zrtfNybi#T`>!taM2RRYDk@9;`A?FeUS^+mm>e@Ujt>!syn+Y)2_8g;bZVCp|LRP9i zKb=>EC)(lj#0l%BBds8yZeaGsj(tISh;hr_YoqallrX@+Ud-3SiiLw3JuLfWS*xK; zamgaQ$+(;_TU;%`+ylXNHgfOPUE|~Gv!Fs* zwQt_t+gaVK6rl+Jv9&e1Um2J!<(xzec|i_gf!B_Kg_{~B6h0J>tHy&Jw+@4Cz#QiX z3Pg%v7AT@6*=Lq)g3Z!#E<^qr$=prg=K8G6rO_i;4A8I8nOU`p%~E z{o=;tbfcfs=XUJR-un8KmKOx;4i5Fs_-w{bR^Fe*t?54zr6bg?4@$(HmjErb+;p@E*4Q^ds|2+&>z&;cNugg(Xko%TRQwhtU82ZLF@9iA~U}8&E z_@1kQSfO$`2?sUuZxC+Zy+?5KI?&zy_QiQS|5|SP6^qV9=*`(UG6(?7|5{pPtKp1% zx!pVl4dX}u1U+LH&OD%?k(g_S{p1 z&DhY}KQ&t6A%%tw!2G0xMme!CRp)PyCSmEwi;%9v{WL&T|xLF-mv+G*lj(__HSy`Yx|afA2fTV4GZAhtm+$CRB6z{m=CNiE)! zez3N7>*=^Bhb2I;a8=k%nb^pD@Z;Y_fz$}z3Ft`Nt%eY$CDFqI&C6*u4f@U7oZEdK zt|O8qmS;RkA4`-7Qrfu)o+TpZqn8qn;%?52(*d3aTe0piv4>=FAl`4P({v50n4Xo( zU7K<4=Ar_reUV?eB$V!1BN9(T3wXHg-gD|;$QOUk8v+w_*`JX+mv(6#2k-}*H;9Kx zK_pkj*pR6JIRqXe`97u;yp;6LzmnYI&jU&3668>j+Ip%dg?6(2GOLBAu<6ophGwe` z5fGdF833;PVIhV5={NTPwsJ8i$x9nQ^aPD{Ge@pb&q2ak9i#*c^@lx9zG%+ISE1co zz5U4F&lU-M%Q)okVuN|}*}eC{+h9}vjRHN4ZMs`*WQ6_Zd+oymVMb0szPcb!Qo+Q; zOLE-RL27DXdY6a~on?Ky15=fIo0+{a02YKwRgC0OQd&>ZwE|DV3|2<9koA$$Jh!r~ z))679qK3BY_>TK}E1g06f`eXH;+rhXiD;sN5ugOq@TWc>xM6EHJJa*!inI9&iHA6H z2Uz9=UbUXxR_@k{q5Bdsn{rz}p@`vmmDj{Kd_D z9T__|c{Jjy>62$AY-w1(hNWN~9Kbsx&g+GN+B`KjR4{Bk1Z;0 zQ2RgC-Mp%=8!(L5!HAElMrw~rdS((z*2#zoBE__(qEeqtH6PiiT3PjbKQ6)m?o;o1 z#i}*$V^N8@1^!RcCOI7YFZ;7?(V}B(wb1k$szMRn01Z2LbplG~I3;G)lOxz1l|Ke$ z)hbdWrQ1O6gA6FN%^sFJBT+wHl{>2W1+?#%0Q0^ySVnsMiEql|@|$!50RT=n5lTir zg~g~qt7?tCTVFtCGD#i4xLF)>c0!smmqnqsO`ehye}xV`C*>rUNpUKyRappsWooMrKcLi)8^x>y*dgk}9L!7vjT;O3$6#9cp~3@h4B}CDY5o=rz<|hLH2Z zbq+N?g|OoiNV*)Kp>(86z#bH>MxyigvxbGPx&Hi{M;p-%^G1)tMMi;b|E-uL$916m zBmuCbe`8@`i)q_wr>3Xm1d*FTk{j2icLN|(G6k6u7UoaG_*pbmjKaTvOcgS?!#*an zsoqdP`lBHGWDeyB?OqntxQ_a{l9+p%Te5w0NKENvmtR%0MV_c1)vqO2T#`^qxJmBB zIfxF4W@sQ7JLIZX`3c2!tRdI(0x9`B8Q3hgb=jf=gKi^ zwghwFqkUanJhAV_y>(T?Y*FC1zR?6ab#?a8?u-n= zqJ0D@sdtYu5G2>j1n2a|ln$07JUQF^-$|wQvt-vn&|MYzpOm)8c9485ox0w|2~7M2a&J$8p2H+OMBSH-y^BrtIq9fPKJK|P>~oGGBde>M z&;lgk8MD8%shK$k8u(9N8x-^Fk?KplVPX!8<7M}jN=VBduJCkgEM)0|v3$O|U|e)ahC=loUAL;a;M;6YyP0d?6J z$>VK@Sw(QB)1(sbI*U=4Ga}^G3d`r39kLAseqi<=Y&A+tJxmmpvO`b<_vMww29V8l zIkRw9qonB1K5gtylQwd=8m&BmR&QRv`~1udiw`rW$j6LWW^Ws$5@~ISX@4@g z7R$cM085B)k(>KrEK1g3I(mDp?wM$l0Gv*&BZwx+0L}@Rmk=$x;+PL-gkXSH2}I+h zSo|AQ^i!JJ{KZF#pzU4pxD`mO1+>9(DlYcl3ZDbH!1a@LY%%Q75LW&ASQm$uxI0|X z{>Qj*_n64Q5zm_(wAkML*hZ1iH~SMLoOb2e^dFO)PpCWPouDOSw2+9ep=GkF-=4)t z=jOQ?yx%u(oR)OtsC&DKrYCLUuNb5EVE4GX`hh2mhldH+aeAXejU(ys#)sacU5>&i z9RWE!f?#Y9TI#XmofvOeDF!)v!Vddlf1 zmExpvh{#CfL6%Im+Z>7unBb9R1%u1J3BL{(HdHZujrz5W22wj=#iw%@HPrbMA(eSe z;j2In(VA1j7wOBI)^>C+UZ2H9S==RIR>H$0=g}<7Lqxoc9C2<^ZCHW#^Pw6FA|ca) zD7YLblyv{YTI68C3YygnJZC((xj&MX9k7yR?k5)zKf|;zf)AQq%`{~ezX^?Rzj=1y zF6hz40p9y!@zcmsRs^UjbDnkc->KiqLI{d^WuIB^JM;OkeoeohJB+~v+496NuO%V) zS{tq0PH1y699w)M0M3&*(gw*_eTU)UcxR!Dzj7D~Gacgpw1#0EUEhZ$+!Q{4owpr} zIe~;U@Gt=SNG&$dFo`LK&bPeUx8I#OVM{gZ_MCP>UE&PqFQo;h&67N%sxXQF4FpJV z#Mp>B8;qbRq>NZ`3ZB2Q24ta=5FG3gLIjAEA!+<2tbkr^CxsI*x$9b8f;Todi^l5)B5-L=oFX-Jn_{+bJ3i{G{3ZZXNJ z${PnYhZ*blF!yb4ILORt9uj0`Q$p-mxA-OV-xu}Z$$ahhhx#$k%&|jkm!PP#inDn~ z;z2rV3Gh^smh1V2FF|p1a?+1&AbL8vWA*2tL1XQ7<1aNJHd(_3MPqGWXg-X~yV(p8 zPc#6lx_Egs#n+#wtS4o*hklb>*O5S-hHQPhJ`Gz)yL_HQhUl{YdM6RqBof;&6L_pR zBQs0GBf3F;f2bEECk>jZ(k4}WgxdVERA7qk2_7VG{%-8E?_vJb6CT{VU`y`I-dm6$7c^qr`7i4mwR`&y(=CYN3GYsfhWtODp}js-e*_T!aF@3I8YGRns!J_;FX9P zktmrch8J8!=imTv6KPo6ecuy!o0(3qAK7{A^a6{Q`UNvx4q8xL zo}{$*l^?$j38^0u++Q!Vm&0~Rxj*KdrM$blmn9v}uQHN^c9KUVc$49SLu84<=PE9n zPOIlokW4E0p=-<>l-4Vpz`W+32>FZKo6s? zjXd02I9P|Ykab1(=v9pE+S(SjSFn$BE7-NQk%(*8Kg5V{jRR4v5ah9j@!|Q3e_H%Ez2^=~O~e5Ptvk0X zC3D|c=M@376fM9&^a?1qzB|y3Sp0sfKllYlOa^bgZvZ6Mt8#v?-5)yP@b36w@MQe% z$!pn);|*IAFzZ+l0uMF54mqK)-}U|gknfr_m$w+wRQVK-J2h!*7uWvH-|IcVV^IH< zc|3n2TZ#ameV8DJ^F?U)`^FQr&NA!aMusU%r>Y_QJg>`izSV<+ZPEpn+?Yxx@&)NH zx%`}C#OSUxtifw0aMcH9%MlTUgQSpV$;}kgzq`PP2+*jRy=xO4-7L1u$p`t<{1EVX zdSVvXVKwVx+Jo%8UetEo$Z?yhXEg!9);t$hRA@Oy#9C{A>6JN94Tr(Q8>Pf3t-uk! zU{Jt)R})=P;bYrV=os#z4}D?ktb^Cs!*OHljo6bLy^TOM(oF|_ndtzKc+tQTudn6q zx585E>m0)b^_m!Gb?=~KY}BB(sMA0OoqZ1h-q@vNf)~qIP2LYsX{el8*)#0;cw)Uo zbB_8_#>E^xJ%CFp26_q{0IA!ru_FA+MREwP^iZ;a3l!(HJq3#tQ2wpXnzAjUDPZ{RXo3tvzA<)Q#@RP zW5>6FJe-#qLjAD~Q}ulBVye$Il&!o_FF6jQeu?cV`=L}(6$2@DcU%!fg$7p@v6hOb z&*uK>XPKQrTpaJVWE}*JiZnkZZ5QN>kNqJl138fe7_Hx=nICloj;xenpp&7$cXc)A zAcs0Pns;}%j{&9vnmyQJ%5S9Li6pLRibm4kS4%)t6(AzJp$lH!Y`r6+NN%H;Ui03b zVKzFX2vL3m(MX3>s}J94`EDFJCCJ`MppPLA86xWs+Y!^73Zgm)`Rnd`=Tybw#nN(d zk$@l(aOZ^{9sTj106xf868fgCKe9Off^vF#%3)sk>(|o4V!7G~ghVE%H>!465jT=S zN4OYT{L8LG+ECE=ABBdGI!0}q`o=l$1JQ?0gKlCtkK1l zGpgug%Sut`o!`77IP*9g$>l!4<+IfS%Uytf;hxiPKjpjChjbi@Adgb$>kL4SiGWKF z=nj1;X?lC*d;wjfNL`V|rQ{0xd+33-L@r=lWG5!+yrG515AGsGQ zKbqi2@u>`%hWqijk1q^uNhvZ@WUJ@r)0r>xZ=rp_-^LGbMfmx7+(ve~ zitlN=zUnY74v1v|5=%ERM*2LfV=fHG!1I840fPL(tc`<|9bt*QcYl6U?t45u%~l^i z^JOo3>oH<7Nv-QQ+f%7*ZXTf6AQLU|FJ%D$penk~4YS^BZDPX)NYY(5&b>B&%X7*y zm7rNjI+j05J4}q;_sJ?|me|y60&3{u*RL`5vL}HlD9(o5L{K}v0aaJ;5`f0rS}XbDpdC;1il@&v&+d#s#{f3l=Ue# zDppDxxSfzr(}C}ex!S!8UvnOf?r{h;O)CKFKyyPzex{s2AYItBI~YmR?eV^#ju~pi zF`^c1u}v$zJ~%z8Fc#$*)7{AYS)M(P1qw6C%BIZaoq%{@C6{1cOBQT>$ypS(q&7?^ zSZ1R~y7bMid}HGs1!-apF_j7d4=e7bt>}9}0XQd8cw+&<8jtcuX=-RG0*6AT=vcOk z^GHar@6H6m$)hMp2Gq@nl&kTwHF9x>hswtSARjQ#f(#`V)D;9{x1S*MrKB$0lRgYq zPr_;@0FU>U0*yS%oSmWX{w(#5B>`=gzoOm3)6od*@;MqpWHxXhFMN8evA#o+(q%90 zOZ6-ZwV#E&T^(;Oxh3%rS*JkEj;v1MZb?7oTUyKK)RjkwrGz&o5dk=T?G>;F;Xr`G z*R<*LfwZZrm)A=``L1hRq>$7a^xV($54bG`a8?~RqO9EQ*yG~_`h2p?$Wt`-nhLIZAOpha2?GewAhBd@{Mg*PU8lpCLjj==YlFRFA)E8LS z6m{h-&DGwxa68Z-G@>JRvV%x484eI(WGv))MYtfYRdf^V4_+}<``+tKJ*AOwiR(*S zxsy30hBV&?+^A8B6y0?QW{b%7{w~_4zqI6=$j~eq8u(9RJ5+?vj6)0B2sd*I?$qU`loFWa7a!eooe)n;TPAxqB8!MS7_?R&-m3l|2q16;lqaGDd`$Pmp|^%2_IrhGPs!`^n6sKitb1ka4G4&g#As-PgR z-NFe3)c{CGE%glaxrRw(y|AnM!1VGdB&zKCHeM zaEXaI_*PhWKOk%P=1f*^8>I5{Drk~gUc`o=LkYTH)Fs#ORB=6Q*&3F^c~d}e35H#K z1Z09}>6H%8$7tQyx|*~qhBf#_&R6>zwLo^`ltDF@AfUG@40h`7l~N))iV=e22Y14x&fJvgsm zeR3i85{>vTA4`;pwAx#@Vn7Yv{^#8z)xvm-+$A>!{%5ozS<_|5`u(Dy1VC9S1RXd$ zWC12UJ*||f`f*lX+BGSfSn!1zz!%0{nXWmImjJ2LF)yta0g1pfPg%x2dM=NE~KDFz;n_g=<9vG@19rFJ^Dz366JC3lZ~)7>+Y zpoM(K$|ix>1MvgO#rcU!paLKk>D-CEl9lCsTwLkfR{+fd&?wniC3hUV`H0^_O%L*n z+OW+JBv5;CQEQg6<8R@q&G}!MOro-?UV=r2p4p}6N?E*UBvNpl@)4G|)AP!s3J#(ZgzWJM_!AlmCpBkEi*=PDq-gou%Y z2v-$je{<;hCHu%2F1PE$77pb6siLM+B(zptHD0ka3NmgV_6E*{cE5z zTGDhA-C?;D`-B%%9cpiJAg2%i=;gONjUMQ9Yvw}|B+ygY3WHmY`r`OkFRm$yd_W8G z0b;o&!`U|7$SSjUdNpyL)Ggs z!H#i`5Wj|ZX!=R(q+{@#C~)-J`^;))wnO}DJV4&sLq%G$=Ii6)+ir>*nMSGfk%p%` z^@%W7?XRElJP4>)`?m8kcIDU`zzXHea`{uD3x!}G9 zgI9t9+&2}AYS_ccWxd`D3zDbR5$ z$u^sM^v$tXm3;K{b_y+XivX;{@{m(-dsrB}F=Wm`1WBe`H*Wv@#AllGrH$LMIjUIn zIxn37b9Fq~H5!nAWa=F4Uq#I>8xLx+!aBq-<^{YlATG8Bx=E;jI%|H2GznJ;kqzBH z`D1NHO&a_vzCNZgMrew^uY29OPnROT zWllFTr}Y?!TVvJjM+E*_y@R~)c4o@I;}g=N5lGedqy$dATxFH9s#Co4-)qShg|%AU1qz|IOEsk4xQOY ztIpSg9e^kBADiy&UXv?TWq3bE5y<}?V%OtefWPW~ziH@GbawmhS<-${tZpoS262R6 zT=!kUI}W5y`$k#b+#x4-Co^lNI&ICwd8_0$R<%5Wj8y&tcV6m{d}+!?1duq*UlvlU zfyljY?!}AkCY1Mw*tK zdbgRW$g!*a3ImVFY#pBVZ34hGu<$t3H;QG0he+F^-}lsNJw}6rryI>410K&Tc)rGX zgm(KeV^Z``MMYVfC6~=uQjtR@z=pp)e~krhPdK0OodF?Q#; z=Th;wDZq69Z_k{A0Fu0DOd9X%xC{Gwby&A|>-|k(4Gdud4&&b~Ff_9R#ddCOZ{bkn zO@dj%o|APL%ktsHi)8m9wq*aka_O^e&~zUb-|B)?CnhhWGg|O;b_*qy5mbiUr5zw6?|qP!(zSH@AsTM=rt%) zYwzbR2gZK;&l>@G4(j!LWXRZU7n{2HqmE(zVV_(}dv3y+rQZe%VQwzR?H5Qj*Ja6| z+FvAlzFvvK))&S)0=?-E=|^R~aZ?b4EwudjB6G>|@ZzwwsRM-_J z0#fv;pFE)|S$V}8C7RP{;b#ODnDuq>+Tz%#7)foc$DH7YvOCzFu1QvGJ$tGW(ntO*>NqoS$(65*ZK;GbGCaga>6 zYqfZm72oIbIO}cIX7Dg=T`n>O{E^9W1Tb&Z2V`rFQR-5UD*a3K3M=(aEH~+6^bPvf zON6W`FLVDB7LiBnHU+=Z;ikn&^-e+1$b6##uO~&-2yy){;)HlPmRF5m0SIk9 zTN&U!u+(u2EDqZM6qqpMamjk{IGHQ6=S_`=E6al+kQXBTuU@~Y3MyvYdf7-%SrPWweiCO;umDW4TA0Vg;8qB^0L-b7&4o~? z1}NUfV@oQP9`_M*Lm$^AvO%;)UE>HEJUOwJcfU|2^}B1dBL5BO?7nZ)dSwHvMHT1p z(a-uHeulQf!y892i$A2dd+jjH58*bp@kF$(Z;ccJ{%J1+*x{BuPvWHQivVA*EZ@Yc z(yn!D%*%^$i&dY&`NYrUVUC&-%Wnn{n~HvOv~vEjEnD_N-~kKD3bL$p;dA<(FYVzk zvC_zQuol4t=-FC=9j9WtERVA?X#e`8jLuU&uqLnbTNn+CD-W4S?_ z?rtu1cE&5f&C~dIFbvdz+C5tQ=PJcd62uiufUJEk*2})> zb^v3IWq>*M1q2lR86~;;v1_lvrVDK~v;<}^ApOog0o@z*H~fCsQazEPXhgaj0YO4axmmgX=XV{r-N_UK}=%5 z|D)8vQ-k;l5HSI`%kS@{fYBHl`^=@=j)$ZGZvm$u#JKbCf^q~{Z8&r=Z#{KkdwXkr z(wCUf=*ee&qqeB(-vtQ~~;EG(`t=BhX z{C4eU9_Aa2BXcG~DGwDbY++h)1?Aja_qa(XtQIpqMxJ3Xk=UfB?JpugH6@!q`WL_Y zZ*l_o2D<6G3#W`Cu4Ez0f|vFs$(#`p5gl%BwZkzg*b()D&=<}pEc`%YB!)uQ{v@=D z`Gp^5;)yMMUwvTAPWpE#OJ_G{+LtKJ(tl`ECAC>Ba_ouB0 zBS3@5!z;l61AnR6fA26Lzw%9&^}rlZ z{E>4C9>PM#)c8}A8ky;*IHjK4m{{%VAkbeRqN6W^^P^L{e)=a&wEfGO;Q}ycIuRGIM_l6;|Roi3<@szmy-NeB~2gQSqH9vDvLY>%XQPSAK zKSW`I%lg=X6VI<&&GyjVn)KeU?q!>%q(4@qiEV~NcEbgj4lFwVU5y6e zwdV8%rIlabOqJ))c1FkxKXvRDM&=G@a0M>`+33I1%P^~VTsC0)nkQe{;UjCXPUtOX z*p+<0e-vbyQ3O)9DRa4{Zlear#ELdBj1iaUUjL`&?8L{yo|?k=Nuqz75K{aKC`xDB zF2ggow=Q?nz{+=sJmHlCd4ug?uq;k(I>wa=(gtTBY^C6eldCJR#R%^ z`p&v=0fXzHV}Ue2Dhm8+e2}!X;MB61EHk#hxNtT(4+h|$$FaF#H5j_^k1c0m2Z`_Q z%F|f46f8{ql`-lw1`<@q+Q@2=sX^i|i(!}fnv}#9XTYSrKp6Xf>j1mTjvf7(eZXI{ zsOl9^a_`1CyWY(~>(z5gWXVKxlILBL$3Hn{35UCE79f8U6-j!kebW22$ttQ!l1D54 zZ_x?s-rvNh1c69({k*x*=xr5QuMqh6(j#0-WxE0Oegxly?O|#o>7p?I=}!>!bbG8w zT52=ZR}@zTY_zTlbtB&35a3LTZ$3eT{H*9Q#!e;MqNg#oTV(+I_8WBPwHzLBA zOD{1{Tr8yN0QLox&YXvu&Fh!x<*G$gONQSHXk84@%vz3#6|hi#;n@3aQ1MaxQ3ul} z0Z?;y(-8xgmr7m`%8r8#HBLAW&d2k zyJ=I~A5KMgd74?+nr}I0-&weuXi{{q@JWy~oM6!^YZ1l|BO z$`U(T+}+?13!c|C;3q&>N91?95|Iw~T>CJP1>_TweGn1R=JK(2R9Trhc*P+@ykzfc zSJ!4L2M_mW0Z5r)8#oQSa;avfO$T_Y{@u8ydBCl3>+9`#b%4mt=ao07!$Bm3R#iYN zIFRW0Vbm#(A2Bw0UFKj>QQ5UleLeQ+S0de0M+Lbh7!O}`J6icR?X3fpIZA+%b35Ik zw-r#-^N{?;Fb(09lsuonPwcz4iUExzaiAyfGjct@(cSi_9^}li8w> zD{8ie6T?7=UT$pjtq>gou>?NPO|t(Do-iOy4!a{c0DH82MJGAgw_?`L8!$xH?b{|4 zd?H1dk>Z)HpCV^w!9YwGBSxrh1fIcdd7w02OarNEjP0T4*f%H=zsK zW62H2%~J;aZPs!__UGc1%g8$cqE5AaB|f_#_7hy@>`5s>oIm(c zWobw}OtC~2k50N_*G`tBLSmS6Lqkn~Qx6*=m1k0(udwbbQyr}%)IwhPL4t#)u;5i_ zdlNy_r-bImh2SYo&rTGlBUAkKxh!}LUt#noBW_Im0SeN+!dn-2@DG|2vSOCnl55d* zxc>0_B*)6unQO&nAG?3+k;Oi+bR-@6srpLXE!`OnoP&pSvG%r-7FG9f=H1jq#FHmu zB~LQ403SA^Du3>Y&#!x-U+n8+U;thau@)~eFwpo8V7#2p`(&qyvu{3I6GMlMd&fU+ ziP;xg1E0BKB$V_sNuTVWx`U&q>RSU1b=SP<2>11+(}<+%APl=lpKf3?^uE<$sV4)q ziLHcFaP8f{C){3k>CPu&$KX!7D{K5M{rCl36QIDtE8qN#I)lv&UKtwLrq=z&lKWCv zSj%B%%efs0O!fU9#rAjSCgZ->)t<<@+nY@*Ml{GH_4CE%9PyCsDwn+_pk3B2smK@W zFm};|b9&P#D%xweq~99}e^TEpW_kc`sg!M!6(@)r;MF%cFIVesGfTb`m3We3@FIWv zL_QJvvjD$GloL!LDYBr^Rt{uF`F0Y|6b3~|6xp7Vn(+=3;QxnXB!e==86*MI$MS4! zF1S%B8&+d?R-!S)%q8c24t zr>oJcYoM4{wyv`5HztMzs@|)&e=_fsv@-)7z{6o-9UTA<=YE{7Dvy&fGv|DLrWSTM z@?%`XSmi_f>8zG_2=LwAn=IaZm!Mi>fN+PH@GB*$^RJqGJUI*<#(@4nZ-ajDu2?g0 zxYLxoWn!04l`Cwpdn5Y@7eajI=Bfr-1}(6*52x5KR7vl7aH&|zFj^BI!~JKQKe4+d zQH9+MuaIZaqHjV8X+gM&HRwm9pyJ8+_+eZ@;Nwiz)ka->TG8%kic?ZNjq-}_LHf@g zotH=VZGB82ZCFcg?dk^3Rk8vQI}UHXsf4we5@f9DH+k1gWnLT=`oGjpEY0QDML0hp zgnd+yv#$D}jszJU{AR&>6A)PDiN2XytcQ<*e%G<2V{<1Q$lMe{EuVe9^?#g~{Vgq` z=bA#|)1TM4b-DsFJ~`ePdXl-+ICWxpev7~Lv3hw(U1%!+&B(E1`!942{9_G|~}nUl;imbQgeI`@1Wj z%gfM(M-XwfkqZo|M3^s6?aaz3!Ebiv_t??=AJ9oYlFB%*DOU&eVjp;#5H^vIBA}ts z0$GWmD;suSw=r!Qn@fdG;oB-&;`{B}eB0*)j>HuH2%N+E2%zg(lw-D8D50VKbhOR} zqRBC}*}_?q)9>P&@9I~Ql}CdjwCJbg-&5E=)b(0eMyI|J^!Kj}@P)YhRIFLgC{i-M zAdzKnc=~2TMlV%rf&kyn2(~MdEsUCRnI_M0g#kUdCAXOm(8wCFl&`d1O&2N zJ8#`*9sGiE-1ROoyl;I>odBFQd)F(i;po!{n0~*0u6r*> z4)q|(@g=5z`D!#9?X~+9=r6xsv-i?%yKMaZ33h`7AMRltL4lz)w9%-qHNfDv?aXds zb8~rICwyo-t(h-jZt)CGj z@Sb;ht6Q2Y2FtHdhkq@L>RkHyI-bpIR)7d60z_3Aj}|aO;DmmCCSO&(6iyAn`(@gZ*|3dL-^sTW}cz za83Gfo&~2|?uaHMH#cTDfF@T{CgzSyRxX<)?!8FW_5}9?#p6I*@6uE0*N*T{4z$Sc zGH*sdXjF15YGFUw8hxz@yP|>^Dv9=NYsFfZOtgcxaFsge`!TkJts4}e@d|~a&k}@7)Vt?0gCI(SX^rVo~^`gK8hQ-U?;`&_r}I@2W{pr zz~j4u@2|eg(60Sg*DCJ;9Aad|RY8eUds05L^tJ-`C5TqFb8eBCTosP*c9%kvFeL%xEo&tZ_BgpF)vRcjaSBI6!W)xi8Z0gCfe`f8}8Pf{rc%Fm4 zNtb$SpKKwfq$*@$@lWW>B325D=(R78Ef@%inS5R|gU`)t2~s=m)t0a40R~VdT(YM| zZ{9v6FWBh-lP}LW*>%(Mbc0t0!DjejUM;+>Sa{{68hrS~qajBmA=lbK|rLUR0C~b~96}X8de#kpjF7COFl{ z9+zDzE5?IaClRLTR%vOj%6f_}dUH}+am&2y`oFhj%t*!V);q4c9 zmSB3si+82oBow3JHq$5cho5BR@e9y+V_mD1d5V-@u0&9dXa5xEUFZx(W`+-3pj=%IYP&HOjgCt>zQv>CG z%AY!&^61wMV>=hU6}O7vwI4DbgO-p(YcZ4PCb$t`(c@k~ZuO{li4g>#sqnHtKutA} z3m(xsG?t5$IHu+QA4|bV>mpP}K1B1T$gNP?6FV&cE`{@`LKob&tA=rwSOj`eLgQ~J zC|^Ya_(mIx(*WvPZGbdHZ_7}+YK<)pQbgWZ^2w>QmSGQR;+NG63VbLBw~&&AcxiLq zhZk%ET=3_st9IHQOtd=iAEm3Mi;c-rhLi4N05={eRW~pJ9a;qY5xu-LeG!FS&1Y)pkTgdi*uC}m<7`% zM8`S2@BHJosyn7wt`r3EL*7+Z8oGB%||U+XS+pFT`& zegY8oS(v`Cv4y|9Or#rB(S~FaO&TekW=<4~@>s^rrKQy?h4~7;c-n2iZV}S?&5x(~ z@kYa3h@)%z^>5}?%q-g#@}ZdAT;P+B>12fB;k&&!DsBou6N%5R8q*mOmpGE|Zn2CS z?90gkJN_zuslhecBHX^~Z-D}D;-v)Eoe!AcJ7qPQv z1B>$vXG0z^Q}Oi#cP;~uWPWU#9Ar;kKcRI1ad-LB$;?0qshC>l$+tf5&AENwVSy5J zx$<(AewY+U=^K6ly2+(s)q=G6s&8`cZw~)fZ5b=Jh1 z&%j(9N-Z3q&CX>Xs3|`;|12K0sv*rxe)0j!U0+MXH(33{7xIF?B=aQMGm@>Z;F zOW=C+^po=;EX3KNH61n0a}$`j0*fgVL)!5bA6nb8%^R5n%tXbp6G%RG@C5%h+|Jbw zZ#g3tq?eZ3IGnh=imd-?DF31K#9q`zAuS?k_c;Cd-lHvSh4P8~4zZ_$TrlWdh@I6p zn6@1re6)NuYB`+u=VC$FRh_IY=6cZYOkpbSx9LG*GpY89&9Z=zl*Q#{v}92TN*fvA z&Wfa+-&;8x1);sa_uBllT}}P0nXj7f)JHDtl!N`T7Zv4K@{YAbUZ?G(+QepNzj0KX z#V(0st5Ik>N=h=g80bM5zt9~p`04uHva}|Fgpclxf7AM}*1&_3xxI9|J)10b-Es`j zyfs?p6=05bYVUF^o%iXddz-5n zuZJMjpeGY}7G?XuYt#f##wuC7OCAd#CM5u4XO1$M%LL|6BloIuW_QiEr%ZTegY-GW zu@DIMD1%p)A7*PGHEp6m3Wz;?r%w?}#pa*z4LR8$?Nphn#?Z$5$Xs2b2nE* zzJL2PLV0MWPl4t1UaEZIfkl6ex@-gP=F)v6m0K#WrmsMFQOGHfqY$Rbuss%(K#En! zr9@rSVr%Ai)pVws-aP-lV?|&d12hm_u2QB-ySjSvtsi!vA9@|@T9j!GZu2B?m%%&2 z?yCshoBjvj0AOXfS;k8CW582>l?4Rcp~>*>_tuPq{Ew~_o-SVdc(eVN#Be&#cZ`gP zo`FC#oNTAb*K7O`0e8Y2LE2r?A}IjUAu;-SZ)i_OEBhd%2`;sbV|Z=#=M3TXce{(% zHL_%%>QN87-}V0oYn6*H+gM`7{w2T7e9zO#eB5N3L6f#E{r1X}mgoZ(T3|etn0O)l zZ+3Qldjx?`7oQcVsjx%pja&g{SGyYnJ`O@=l$M`CJn>q$14SXdK#@ z#We4gbs2=k_HKxlHaSFbe|zo~79PVNNpqs{q*x0f%@xh%OR?U$ho)@RVe#yd-gG`f`%YoePF8GyT95 z4eJVjlG(J1U|lluK=1^J=D`zuu_wp=LbEmWW==newQRk|3w_rUm;blxMRhaCqQYt& z5)zEeN=7qToV`+@PeU!%m<3+xYHz{&p{_B`CsY$%URPH&z$hr&PugE@uCCPzg*GmK zSp^FYc9`Qns`Eg~Om&cmCPzs+KHsN4?8c0JJYOnBaq&|WM*4ceCV`%*LGCYg z(YfQRAO{d&ALZ!f)gNGCgB0LkX-Gsb=r8mm0B$_fuYq>} zOW^Y;+tO>-P8JWiQk+pF7J2{eI&uCgjabPK4S{vhte(h~PnfNL}5CMw17#B`bPwiV-;*D}5L=nd49z8Bcz-(oB;y-6yB=wFR=leQkU;a!;ffbc z9TI3Q)?~dDruENZgBn}|KWIT70&wKk0m^ZX)*J#Uw=6tZziMu($qeea;voxaT3Q?@uic$WKi``2V|tfg zDBN+DsGD4GpJVjp;o$;9!jXn@4+jucW!KRnek-xg^dD2RH`w)^W-621ME@}fxmtuQ zQ!kvK--mEbfT+zO)d^G--su!&)*>Bba1w}Zx3{T(C;KBCOv4MHGtcgQ56#rTiK{-( zwFXc`!_$j}>%A({)cCa|!SjnVwMG`w4V#sF*7H>uF!RkBnmH)%-(xtvU<%KRpRdm) zTP}Dec%Rvj#9^H{b(;W|J>AUL10SAm_XSEB>f&XL<12$Fb>8@qarw&yY&gIhgJ}Ex z3V?Xofy<^9bq-*_l}Q@`n4TMd9#n(=Me0dot^vBe-S}o#NI5A$0LPHqnO12h)X_A$ zZQ2b=rLNU?Bw{12sh9&+*@sU-_cp>LHWfh5vit18X)sEg_N7GsENjE|zt@G#9|<9y zxe2YrZUEVT1gij^MH@R%nY|7JNj=T821!_#ZE z{F86)ErQ4Azt3Ff3|H9J-<5%9tHxQjx=y2E04o9&c~P$Bm+#%1o0=OpS2;OJa$_Tx zN78qiH)-0cKNtgS+3aRaXo+2p_VXvAQnLm6dVF>_b!Tm#GDJgXh8@8$`ny@``L6D@ zW6!XT5lW z2GQjkg=piY{X7W@(GvAcz#Q0eUVZw-|2TnyH=6Z&IE%NH?fz)t>7l!|fge&Nwu4Nk zXc~!y2PnLT+TbwMYVeo5?+@S_b|AijL>8)~leCu$EGw)JC^@0E~e4exiWol5M8WK~Q|4PVchdkLDXp=3X zf12yhFD5AxqHyJy#+`hE`av`A?(rybgC$Df?vZi^$gg=}0lodgY;G4_%m@irU%|-% zLt^>!co01XBX+Rtk%i88MFP4I%vnFljg>ClAqxTmj&CnCfycQr*-x9c#C38aa+4Lv zFE1=K^fX4*5L?G<>~ChUK2-+eLQDlj>`3j?5=%>q-nc$pKE?G&yYwb03tZ;dr8<7zOj$|16b!M@l2lW`>v=PP>mDql z%qvNXl*9RZ6f2Jr)YF3Ntjiw~g-OtKoJo_IO2BPv{ zL=5@P2p0!4Zikc2r1hp1;_QX5`AXTqBlx&s4+106MVrFU$lhs>XCieF7VI4s3Q@6GjK=#nw(-}DKE4KDyf8x(Z;sTx`wo%*Ij+%DC zS>q(p^X_Gr@l~4R=)+$_-SkrY1~b(`L2{?%r7q>=&Oew;SeryhYxlh}&X*s3yGC?p zJVf)H|2R@PBPB#x0Om(lc{LWbH7&Ve4Ky^}n~PBaWdOi=6MxX0jM_;^A4I#5=Uzl5 z@p>Y}f{E~e|Khjt*OzbUkbbj&Z+-Mhui03v`R{udUt9*o;}T%?7(SeP5}QpM1cKQ+ zu+A+#_H!!1j97MKJCJS2Nau+DeCG(?*f`@Sy&smZ`OtuQNK(_}mW0RIM)_ z@=TvMM}uvZ9q}Lt2BU7}m!TGp!SfYR6{vfe+tUpm_5)X7QH$vV$dJe0e%)?4VXqx~Hc{uv^#`ze_;?E-!vqdOI%8MuW9G&DNn=@W>6nq@ z@6Ycn4^@_b6b&JRq~n#~eoulPhYAK}J>vMyfy&ekUn zS(?=6JQ(E=$Hr!Qgc|(x^`i$f6qScn$U~QB{7UfG&-gco1`c;Oy`RMIE4}(~(A;_| z@nn@zf9&Yx33GrxIh_B^NbFZh;8Jz+o!3rG=i&&7PAL7;{(2HSuzlNRD2+%K+OBKz z<&PCulozF<_~U`Dk$fk2J-RFafX@0eC`^6^H~V0n)xV?Q$@^0`&xBxnm22xztNp-* zcV0tVe)cnA6qS@AdWRtwEjdNRLvwIo8U*?~BlasJvb~Rgyd2xZq9bSNq<)&rLs;G;u*ZU*5wIq&Bg z`zGo0oAFkvX$YC>``GzOPOI;okwTRilC8A-zW+n=q-(#o1B zn|Ii>cw|D2_2#$!Wb*H#b=Hj?Ww zkRxx*{{_-y@S{*i3p1HoCE72sLa&5t?;-cY`Y*M0O)u+SA|p`+WGf@kAb-UbEqHk> zb$?mLvHg7k!F6Dsd?4iu^GjboY)zJ=#nD!|?BOy{VCHW8bc2RwK>%6_t&Qb5M@@J* zUdT1|5AN2qyqxpxKuUcB`9@iTT&S1m6?^#u8`Qple#C8WxdZ6!M8xmp>H(q#2t!N;J zR->gGEu$OS=+4N4)mnNEV)GwJVyi0seCW{fw&X7Mb?owMn7nH}-x4v-X4Kr`tdN*? zDm(pV)UQVNb_T9_lr|S=a&pvKFL+yNYm(f8hYL*8mqESTXV{RSFqnDh_9PSxfMohs zMl4%zSOm4TaCiElWPd>XdFLpain*2Tk6D1vu?%EG<=#?V+18MzXE@k0(19$4+Bpcv zI%hUhoijb3CB6m7r3UszEnU4=jV7MiOADVhxM6{LOMZ0)`mVwmzE#`pSPMu$6tOj& zKls@W!U)3kw8gpD8c!x#ti~M4s>-*Hb4yc2c9rG%ZObgNG%w>Fo3(8a0fFtywIkX+ z8XWu^8j&m2mFsHJZ;={-Lnmv$CtQ1=X+7vliISv{Kz}(1u12AC`ZDm5Q3LEQrezfe zCjt5eOq$0-cqScTcmDalrS+}1TzKCEUc=>1^yg$_W%nNH{fhlMonKP&>~VC^rZbc><~s)JkWAxOXLX!b#zyD>-L z=g#yEe-fvM&GkxOMe5bjwP|}g%UR`<52Rnn_IWkbX}$c8i>Y2Qr(?oXtJ81a!fnoQ za(NALC-yA}Q*c8fk7+!fb&D7*zxdQUDvd`-Q-q&BTMtJ_oHsL0_G zsEg>q1ydS^oF?*8#CdtT5Mv}-P-1zjiobs8-ph?KCGaW9$!2C>y09>rWW~}8DWP}F zONqUy-;YqE1eMzAX2d<4Z-$FgcflZKOKvfct~gS7YeH~fr-JWy-tjPJbXa}9+qBQV zZe$DN;k-Ux{b9`%+hIS?0{j-}f}X68S@Wj)7EIS~=`XyCK-|Rl)Zwr?JUqINIegId z`yV_<&Dd|UEhDlmJ3Td=?1>rI1A8%FJ=gPX(!-LnpA{%C48;2N>}${)y!^s8Xxh+L zoMx#tw4b}azvT1oR#V$Iu-P2)mj`G7H8v-wb5jo%tMX0w|E0%F(Nc?ga9ePjaN~CX zfT!_zcQ|heIaz4pau7l=`Z`G|uQ3{$_8Tm$$S?C31$n7Ze zjx_OC1}pI0Q#)O)3%K?r$V&4-J*zhpbqj8`M*RI2+13%Nz-c^BUZ$NP!CuRJ*m{_B zh~?}g{1m}kHj?2WanfEyb*>YfhAJJiW+)L60FhGt);G!7{Cl)2y6ZME6gsBg6JDUnJ|^)$Y|Wg7sE2%*Kn^ zz3{$;(5BT{6mE|oH1lwRd`_M6+UCJl+k7F%yfxdYsMqK=ZBsd{rTQ$a<`7SQ2RtLY z0iwiqS{&gN+QXz(eCyfc>c_bK;wXWeG7wz)kf|vmd#}mz6_Am>^FHe6_>^Ml<&*N zya$6kKFvm@)A7~R6L55;P*z=nO^wYbw=#YrS#@QFbD9Ppj7MK7lO$hyLF{UmnffIbNj0b20m~5dWIt^kDWGP>;2aAqq*jPodsx?PhtwX#Mx`VFJ88Q)@Wrz3E2-lrx9xZk4p@0iRyfmqI;d%`8ZGbZ4(t7_pj~`5&1~*O$lq72kO9+>v-G)Yf4&9rhV(Uu=OXK78Th405^9NkN*XQOx zP$eg{84TQ^R6H-DjJT20lTlvG+aqvgUs*03!sm{I8+5ylAS>NTK~)*Ms7xk!!ut zk3=FZR}{a8fz2#vo%`6*h;E*O+}g=)lT-tqGS7X%83Llm%X0e)fZ*Z?J3alAHKzVT zLj&=>qcbA9W^=shfGLpE-hYdcuW&3LgDs$yb~5aRy!x*b-{IjaxXbBqCYZJmzLWT#PyLcN&3+=v?70?(-4EI+vV*yo5y)Fd8z~>ebZ{#Y9|!?@Ln4N0Jv-Pe4|WvjM`YjBUj|<;I8UxtRl_q%RDc z1kyx@rOPny9KB}-!ziEVTgmiOqwO;A6ahoz8pou$LEsELEDy+?^jCUA?FH_J^Ow@Z zOTE?!o5h`nEu0P9PRSwnWhaPN{DhVuvwkHUcqi#Oe8<|i=q>)LzEv)ZhKk*R;HQ3a zKweWVTW0SpJSm3rmpE3PWLUjIx(YlFuZ{DQG3+z9R>n(22Z^hSKT?$L?l3_6^rF|c zBl^+hS4Bef5Y=MgbTaMsrbL=y*dD@=)R#pWPyaDu1r>6JgTm{{BK3tE2{-7|uZ!iV zs{9$l%qnSALL{-b8l79(58C$Fm6`xAJX76|)Iy)id^f1T8!`S#ZY3(pW&g+NX?OSC zuh38zTO0xg?qEiUqsv~r>ef~SSRE9uyBx{vLhmVqK456k$F(WXEBf1o$oTZ;5=07} z4GIffZKQ6e3NIzxsx=-F;8sh1I4Cj=NWGY>+drgeFFR?n!SlJQtx;|rF@5yIm`C4q z?y#|0HD8=!zP9Ge$bq}ZO4+$o4f;z6bg0I$c^zsSaG-Fp(0DldU%NNgLyqnu&s!!J z6jv;)tsaYnSnRgs>TA}IwIb8ihvOMUomN3&YyADsLf7rOI;Fz+_bz&>l15J(msby% z*lz>L%tJv6SZumy(r9O|Bcx$_yH7sRDJDyweB6t8kf9)|_jSD4Q`^~@b| zq};@M5!HH=Ym(U+hJ^)2(Mrpj54F(Irq={RqU9;mejt**51y-B6+J)}y4qjf_4z{~ z5Xt8dT&a*L%Rh_Nkt(NR?O=^cPg^NnZ>gRvRn>g$9Wj6w2-AIFA*umKFXEfh z#kYU^9ID$kyL7NvE(eF+YaG^wp93FJ1`fQ>G4Et2!gNWsO0TcUG?8U)iJBNBBGA0& zfFm#y_;!;=x{?d2m01N>-f_@^zCY%FU+STr_BiyZ1&r%2D*+;f( zJ@5l;4x%qWfD=0#LR{nTt zA)SB^)*hn$-@>^s8B#fiwz0n7U*mL_$}ng zF0~BY7R{|*b>=TOdJ_>=TayZOq{Z*?JCzrvo+2^LCvT{mL2!0>cpnnj>@IQTY&mZ) zHl?2!xm5MHV0n1Mt_Ov?uOlIqHRF>}GAW#4qNE#jAUY@F9;6iMEzOAy+ZXM;m%gSs*Z9O zMj|Mypo}p_O(`HJ!s1Q@m}M4^YizfFBMuwSe13v$VO58Xs&F}sEp=O?bYPx>!s_!B zN*KWv7eSCuY4K3;l?)rMLwh{mQtLMBf3Ip*we{H6sLuh_*%V)G%}C_1)DM!oTOO)& z?-_z(G~*n*d64G@)=VksVf=dcIHUkmY8K9tNOOv~xjaR+94Yy1Ye7H*$qMnuY8%@4 zB=fe|mp*{b-qaM)j>E0e{^t5$+$wl=_LB&o#$o5w!?j|E5AlV5{Hfvx`wsEv z`}B*B5*1L>QQ)k8FtWjOp+VijPwjQ3ZImG#fqY4C7Mm&U=GD||-G4O{$fGh*< zseL0t{E*I%A^5`*)8qr>2F(b)eveqY@83bJB?%f$twqpwkI`NtmbO89826o2zlr}h z5YT5KZ5SxKrn6m>Bm)5c>#xL4CB*5#r~+QS*f+}Z=h!0MKEjJ^KA`yF?hIn`n8Vhp zebg9}9J<5)yQXz;Do+5$$^!j35cF$^7(3cjZ>GejC9W~`=zCKP8CedOOTYkP;gHR# z13f>se(yKYH5~lBFxU0o*uwB(@7lIGrTrIK{gVOMGw6?^-}T{Gdczt84TQk{ZJMa zd$4`hAb6#r@JL~yL%<&JRRwky+Q&((CJo`o>y#45dq8|2nEWl_Rf#hk!KokHQ9A3B%rcKpMn_q9&K1QAD{Va);V$-MaGd4Qc^NE?!Vgbg0E-3 zhVt`z#@x?WCTI0W-1Vz7CU@`KE7F1+gT^gG^e1%sfmkrc%uGFAy1Sa2Ji(?M_bbHr6I=tNNhwyvq#Ht`W=>9eA296xlZYT~-$3q|e5!$Q4s*3jTR#ZA)^{y~ z2p0pJNQ>Vt*T`G>7^VokACXhWik;jolnYoWVujC={$j-h>_ANtOe6*$yp@-$`C&mo z0PzJ8Zx59j%(A6*(`K=v-BFl_1IP3@bxP~%uO|=SGK)MtU1ZJh!_APViv#X>te&^T z{nV_Iimv~6B;INb7EXo*{@^=D{|t76bh zo`b*J-F}C-6r*dAmae6rMg2nz!jm7o>(#jY%$Q>Y%dDw^t=G1mUrZjf;MZMUG@c^7 zF!}MfP}&|IH<-{Iw3<|xy46g7!qvb07hlQnEYO?1S5G-Hu@=bxxWeg@ij3;&wSr+@ zYkeeIX_sZqAk*Qh(ftoSW}v0|(7GqrTVqQhnHki5A*m%>jo1k4zP_%>rE|53*kOw+ zT2T;Xuf#!&xV&@;DtBg>EW)Z;6&kW4mYDUJbT+(?PJOwV8rl{9GoMdNZ_Dx1s9vl#-Kwl&bu)?#%e zm9~_8LX~?yJ4G_|o6!EJSB#moVcP{>AK$J|-zj@w`3Nw066&JEnhsqX8=+I)4CReO zn<~D0owjK@nPT$VAe_vv)S}cqE?0sZ->Fk{TKSF5(i7HNkf&Je!)J{RHnL<$)wpre z-JNOL*jjy-OmkpSNs*xd7@GMgCxn;3S?8kPVd)2>G&PMUpE6!UFw>2>1pz6<_v1#t zWv1W-SrhK#lI^Bm6p_oXlMP}{zx-`ZKiHI(d+c6p)Jm)+bN#5M;`cU+{)o1_h`O4w z*!zSDbUj+bRGv$-vn_Qk3xkVDcawG(N6$*k;Yo4>Q`2PS{$V-yx<&+L#rerq(?wNd zX}h-y#CUDGmmzxQ?4WXQJz2iy0R-3B;2rbCEI2?opOW^9j!eQwnsRfqE%K9B0}ho5 zq}V2tF^{m5a14pY;pD6EGbwy1!iT=Yh^(l{&Wy)Vu)f}$PE)mWx6~cmlM4Z?{p#KQ zQ#ladATT(+97*VnjYp{~GT86`Ahfx6P z8n@4GPkWW~v!8WKjmx30LWk1P))zb0=@*w+J|C>xW{py{UBPxd5NmM+HpFiNx?-s1 zA0`}PLCQMI?*#jfwPSL_TuUoA@t>*#ix~L9FaZ0CPr)*JJ)mfjQzl^j`4N#s`_D$x z+D5`D_tXnUM)To`#xkkADM29(Z3l;l9b*qwDf**fT~Ufk?E?;jh-PQ$J42M^G@*4z z1ZeOQsw|>8p2!{l{8XW9{F-P4bGhN{2EnAgTSWzTw&YpxyAj+N*L%_w5XL z*Kgt_Z+M9gx$>Ne2K5tYt`JuE;i<(%Y!d9RL)$Bo)I@xL6FxQg;cV%Cm{$&VTY^eL zc-bY{*x>Q0SY6VEhi>BTAFkjl+MlvsLzUsphBN&O_?Puc$|8^JFdFA`z6tNnJ$SIQ z{TyRCY$rNu>o*pI+KBMdZ~8ZN;YO}R%2z7{?4+A=%Rd(FJ%e|Y5^s@B=yw9tG$M%# z7)sfMcny>&ZOfoJ{~X%cK4#)8D@r4*QAJZc3afPO0@PW(9o3|j6Ix3kGwNDTj|*dk zAg%jyt@x7%B4}7`wQ8`4w&^cL>j#T*(I>ow^TBt2=Nuc)ee#qtl&TH^q$h_JXne%3 z_Rg!m^i7Iz#?RjPe>r1g!}iwJOdnCttqKdXZIHrilXXdciuR>@W>*q(=$$GCf#;Ov zr+M=XrY2#wx`~{Vt>=krQtR~v-vaXYC-+M?+<@EeeVh_@WGs2RLy8fMQ)u0uuaHu^ z39z=pfrnr#07oocykr9RWxfCC`PA5!e6-pzfmE;Qf>-M?xYrLTL}{T7bAJH9Bw-qx=u^P2X7|IyGlI3 zuGBtjBCJS3%ON!`$EzzX12q{Sg6AZ@V?mgvOclI1%BF83=fJwg>+3<(Hi(TnVNoaw zlRG`NxTqD*K($SHM z-J)UWozj~VF(~q}P%&K&s5|H|G9crbJV95JUKcFgLmY13r_Pxt%pU!lww6Xv-3K($ z;{+P)TN^1Z)!2J<=#Hx81aRb9_iF05c{-({0Zi{D5Pj9YREdfvH2X`E9W3#1yj-x@ z3ZwY1h6du^j5I2g7{AFii8n>qK+leXcy6h;&dr#TTD-_*y%Lu7XM)YwDSk-@zG~lZ ze_U&^v{GwPYB2y!Qe7H-p6ZV-(B1tVVvF+o-ulG;tospP!?W!L*g{8VEe_^QC$nSrF??QM6H!^7=b<{*1j zM{qth5BAcbiNM+B>*8Ac*U64O5gp}@F7&>i%@dY9ptyJ3PP-ovJH`(Cdk%(XbQx(% zL~`LDbuNe|lLqyoDcTy@%DH^G?mOD(GFF?8UL}72E5#@}zUOc?$ox)CgHIY#&}(p6 zYhUCI0VNMuDr64{%((xqvNx(M*?q=XN0?^Q6Vv{afIWYAMW(bLhLmJGnV3~f@9Y-l zmJO}xYc+rg6K9v{%MVkx{(`@GO&CV<4mk`=AK+6klR!XWhM2ZL|!%XWhI zcjzF_;gYl{(%=;ZX<9KkHwRNdsZMoFZ87p=iZkGjcP5ItD9-r zzvBqNL4!mECYqINU^w!pq_acOXyP`5NE$!zTWqNa+Xh(J^^c?i>kGQ8^B_Ic;krxc z=-A&xz(#O2TN~(C+A?UeVRt3@`c{4i_du7gxEB+WdVK8)CV3~XeO=B`J*=ynv2H+r zdG5H`2R@3qx-5)3`Zvic@{`{)2p(1Yd|q|m;?Rgyhoc^uqx&HULmq!5kPE(=d{WBq z0vpGVYlEo`}SC~wI6U;m#|3+=Z{AwgD z3UGMUcx|m!^?g9hh<3AX-_7@9lismAS<2{p8bAVH!DzdQiNR*g*$oft(sd(8okQ!S z?m~#l$SnTmB7FUdM?>@Cx?(Oq%G$o<@QX9H6X! z((Yls;X{CsKzy);>TM`Y8GpW^rD&pCa=-)_jy70b&u5LQD?D1bY4=@Xk07hX_@d^T z$*NU8zLh^yrY}K_RYCB2g7^V~(@Biwp1RECdBI-|P2>vf=~mr{0W^cfri;mHNNG+J z%l1BVxDZMgYmcO(jE?;AaqM;u<=>~1azYtwUf*gQ&n*gB8MbZ%;!OfD zeXk@*o9)0pT!^r2u0L|Ar2)41XZOP5?yl>m@eXE9b>^U9Yi3pKCI<1VI=<%CLQ0>l z?6%(D_H=9?O&J5Mp?@l*y0Y zKhvN=-qgs9ye8klsRd5AyX^MXO>Uqv@rSN z62eq|>jDvPaJ@fC+lb2zY@+Zl#YQMl9m(0pGeME8H`-l^ly{L<6`Xvu$ zIJ9ZLLr8?v^P=~Z#juR4&Rw#>R0$N@!YCC@< zqM?1cHRitMz5WHq4MA3D#w%+<+G`xJP0aEoEeu2u2IDuxHuH`#(f6@go4)SfkrB*G zA+282_`(Xn*!tC+NJrXzOE@sB12z&OPt&!F4zD)^sF73H1R7nuqS}26Meq6q>&{Dd2*EBj?`AF!=B^6`^)Vs--or4kWPEY9Jihl7TsU4Fup_H@e2od~~?IOm~>G z=KeHF4d0w50`B72>@Q+d9Fvi1AR0eXu0ihDpXgZeQ4Iv9;yVEllD6<|QnKx{TI;xG z_tT8eO+rjyKTg_ei~=YEG`A~Ab*Y)T-9#9!#Q3oB$v#SIew`0y46L5(gcxnoMnKi1 zxqhD4qsC}eLbTyhM{XgV`^#n8&A?Ti%fERKi);&!;)KpB0CyorZp!ema_MD@*QmCx zMbXYW#!@mu@f`Ey=03rR!&d)FS-R%#Njf9MPnSnieI&HTlJT;iU78QwHTmH*{r%0r zk4j%;2;2G(jW%!02`LwI3W|(3iQJGG@LgR&N>LeSVamnN^qqI&^jbc5)Y(&`E2RPN zX*>j$Itl6O*jmis{QzSdk^O^ME0UB`FvkrwUg-XZD)MEYBzI}VI0pr(YpJ}rsF9Zb zXl9+8Z`5h^#je^xNNol!2()jn-#UG|w3)q~Y87-!dA(9tWCn_bz&g1f{qPLTo@n=i zmrv;Kx@iv?t$A|EbobDiM61oD*$U!Ed3?Pc`gj-O0JC+~gVCn>aUEW^%DzExt08iv zY1Vj*0!!B~!N&I?+Dw6SFcRQMZzlv!o9HhldfDm_w)w^>R%>s-C?VcoR%34=A=ZK1 zwE4#BN1I{>vFg#Fb@!zm#?I`J2(D^I^#kWNM7%Iyb+ckuQd(Ch$uIyDc)LrUC5=T9 zR$C{UbJlohb_vWydTMJ$#av!I%KajoPG8bHrEcMfKGmxw>`G8N|+xhU(~zuy!{&pcDRoE`Y+LA7n-n zm3Y}kLg?{~zGD2HAsy6{Rk3a(*=DJi^{4v+bT_%#cwuqXIAn5veM;vR!+GvdA9waC z2))2iRs;AdeO#ksUVr!#>iErz>queh@0^gPXr1fB=HLl+OQu8-g6*t(eDkj^$h5c2 zKV4o)Uw7k8;-lJ8!k_Q^=cCQTMb=r#@NhOZB9IpOLm^@0H;_@1k+XnL$Bj@FZ_}BQ z4BXR`B{~A;vf_K9vtZqmSx)<^wsr6j^IxApU>9V$AnyI2UxkI=K}BfEEG`zwsS0$Q zj8ZBt+W|fr;~a0jhRRLOEjTl)*`JlQLf;{-|3RE^cUK1lkwP!axTWV%(riA!NHSpZ zaK~JJq6vN+X%lw=iratB`j%?K_1)zJUUJ25fP@y~K^KUvx&^cyv|PV<9!n*SD8+YDENb$;OF)1CM5&9Hp^TIKDTu6F?5N2F8G+?&i2pCaxM_p8W`w=?oqO<)eX5t_Rh>iy42(oI-qaE;}D#@;o=Z5g3B5**QMpe`#X25WLkZ34a z-81#UE@=Mu^(mv{u`xWP{N!lXQ#ku)=W?);C-f)Dzh%v_RLK==*1Y&lrGal~5akc! z+xbv|p*`}ajzTMMEniq^@qmQV0JbMgJ+XZcr&Z|!UMq&hG^sHXaHHPT1esA_;b7Q% zbO;cyA3JeVj@bT~mj}*&rZz2Q;N<6uaN_I`4W$GvtFLxpZjl`5uA*7Gg$tnQ^nwT?V$P`5wZiP+R8Lq7~T45 zSNnCX1gbYt+Peav;KjxhUTt3r$hiE}{JV1()|?VcEXU0-?0sKW*tG!8e0X9M$y>6| zp0TB^X+4I{@p~bNV2z~Wx$)Hda?z7*m!UVd!%gSQx0x!rwGfx`Ws!?oADNKZTEKYd z1@`=vf$h)Cl3c#!lc4%J!vD(jx(LJ3FGz9CMo1c;OzY1)?QdH_B%B$z0SRK$*lshC z{Ez^N6flLSCBPq>q^G#1B8d{WISCiht%>uCrgg*()+)cn^(^IS|3H zSsU&4lpHrAcQ)~|loeqIe4@H=7|~l$nBJwreL+Wd+%WvTZW(B49sl41&IZVN2uvgr zx*HNwFKV)>Lu}nh_x-CF=kRdN?}|_c1fp}}cfNp1#N^39IUIS%C@mzfj+%$|EzhhK zS;Cp)3dDT?`lJ`a*MMdJvR0rY&}Y2%$CN5c4;*+0P-h70*G{7rh5_Oj_tZA9P7;A7 zyPi9upW&b}8C_&@gmfp^CBcAW{Xi`mWc%u@roOUL0UX5KYj>vEQZ-=q@HNh*HTTqfC|3d4@5v=Yu;rhd;qzVVg~jmM@sYUG>`r4|INSai25(V zt}fZB6N^C1qk1m{lf%rzk<8l02XhxeNGHdTJOZ6RT?SQOJoLdlkb}evq#Qv=aG^M7 z@JJ$yT}=R9+ihQlQ3+`xw=)v!`#n#CK>dXS+;S6E z2{(T1kVy1lZ@KDvW4A+_7}W!!*(K2+#JKSWpNGd>EhoP!AuT@#7XyRGm7V=cP$TcF zZQ_A#pffYV(M>GZnmN7sCUaY^ zm7V$ZrDQ{3^ZflAt~NQ5yYp6$6%-}`xANi0=A&M*U!#~rzaLZ)fVZ?g;n5{93xCGck(!=!5Hg z15=dE%i;;}e;5E+F(wyQ6$c~`H{uqK^2hTjQye7JF9ArUPd7ODt$Ut^k#Qmtc0e+i z$e&Klv8sN+3U;4COdIcbQ_e~buGNZ)LN7MQS9^pS&GR*H!0H#f*+3P=`ZbB!a6kKd z0JSyyW}H+toe{TYR4cH@-_rmN6yI_d0+ebxS_uy+p4*-}La#x64^8mL6Y*MJM=o#p zDrm}=-ID5nI=ufe7qZ194%>U-SeT^{GyBp{y@9 zYHVnPf;!0YPyb1|I_KHH+FQ>^ZhZZ!29!u+haunZlHx|*NiS4^W*zYOOAI*dhB9xtO!Z^2qmg= zZD70P6Yva3@Mm}pv}Sz^^|6(FHaWk-Fo4SdHnEJMJxYX5^;bB>Ld*(6k^w{!=9}-8 zovoCgKvw`&0`E;59I)v8JOp%0Ku}P{ruspzYOw*N+Bsu&#>O_PKb2*=yvE7us4Xi` zMA`;4X}jN+h6`k18FAY?@xaCP!|ZYCLB_rBTHLk{O`mdz{Ee@Vz`sV~DGA z=c2eil6+lV4R~!J+Y3~G;Hi+x4iQ!a+>whKZzY|E`+!H|-#7Tjo$COP+0w^vjsdyo0k`vp1tM5bU^=Ek?|B~&_C!AJW zA9JOPwANNJK?Lu*Q$tN@sR+r2g;8U|7;E3XQ6DE`NHt!9IKMxLZUjbA6Pc+_hDPkJ zjiD96O$miiA2y9!2L`YDmAS`TF~J&Zy)vraT{gpqt?aB0pv(4>g>RfaHYu34vP}ZH zx*{kQ%@g${3i^UAWtPpEB2dn(=ZO0LQqh)TqfV_Z^8v%MA72tj0^0zpg2eFwG$3sy zaHZHTa{BcSbA@OUvmIv33fHF*KpK`lM}g!6HT&$vv`LPoRh$R`nT?#e1erzN>V+j7 z-VX;hO2Na)w4Q({!TGeMN4a(y0UmAZGM}PSme=(k1y=XDp~ad`(f8` zl{{mrmx5UKG=2@CV)8XOUU4TtA=M`K@CK{TGFRv;huduR1&6l#J;D)z^DlY9vD$#j zv!$rTc{)#i=zhb|?RIBRo_UfB%OK`80&t)GLy0fmdM%a}C4vq)qG+-?EC;^c9#IJG z?W_JIut7(rDjoHA|Ey-HFIGZB3H&kTAcbAKEI!9qYvVuz;>o~UK_fdB1E4tY%@Xc2 zT>JZ_r&HDN@ETjMzFFQ}1GMsANh_Vwjo|XI?VYFxeP5PF)t`^lu?_?MnRb@eCE%}; z0~x>CtAXjvfT(wT{qXPrC^s~cA4~`S#L`8p=4DsS%!v3Tffb*8>#b7Lg9VTzf?=t95DbWbqATQ$O%JSg1 z?tZ4_$*IAGcg&DbWDmO`+r__7;vq#sK>je9 z7^k8LO*0#0oONOv)|2_HY<%nhumL&sN(6`-S=#vTSOW`|GMuI|W+r?JS}WF+`ohGi zJq=zc*L2x?%+CkGMkNHbOMD6Op_pR;f_5^awO%-#(h{lq@!jW+lj42tqMgR1DUL|s z9|>S#TPVnvc+qlG$UtJp2i0W(4Rj3MJKU+rE1sY9#t8X8hUNiPnZ^n1LFJ$3{eD}z zUAGku$P-ye)@0q*C3I06A@dT?5n?~$V73{7LoH4bmzUL7%z}qZ?0bq;zf%y(e9Mnc z=`kvurt=12nYM1#buK$HOk9KYs_UT=jVecK{o|5qQ;&dQ3Jj&AzJ4{U^{)__+YdnF z`%MYRG#OjT$yP7RoQL1AQvG$9umx3?b#I-Oh0$E4H|@@&^Vu&e>zsYW)r47H)ryZ) z7<#thlcP+HcHRJk6+C&kZT5M0a=rPt7`VMEfJ5(hxKfHI3k;dmw;CEq>-grQY3%RZ z@K8_bCJTFOUa4>f=*ZIc{8cyOmkYXyRX1TGyCXig$CR+mW*vMafbsPCP6aK=+COMJ z;0hywrbLCJr7ph8{2Ab}rJfBAvRzYpjSN{L=M5*lf$MNWo-V(?I=l&|Ps1hdpZIt( z$oF@eRsr?iS&Bhl*8(%JNGTN`W>9lbPoI3gYxsAh;61n*A#E?`E9(Wt(kgylcRK4ju`b*j&~kNYG5r^>yzsYjUrlcDIq$e4uZYtQig+%?5faF*c4BUmApBqoIWBo8bZt zNTeE2G{OhYhf)K!C-T+p?c5d*UO-`3VHS=C8EPj^{tt2mDp^kkile~DAZ1ZGQ1UB7 zB!0r6s3tx_&B_-X0!-ZAuRry(tyij6((8ZF%tbXMC zK>WU}Nk-iJ-jc2FPrn3@eT=e>Mw#*NbU0BYhO!2@Snvc&zeq_{1eBau)x1~{mb?|6 zBlrp*tVY_xk5E=-{r$niyCc2~X`7$q?pShELC3_wHyzY5iLv^tkjdV@ z(NW0UQiXi{FKMV(%25wlT%)&Vj0|}XbUbnQI3SM)h~WKz*ikSZ6Z(5NZ`1P`yIbViZJ7( z+6GUB@XYGxG(4^q1jvm7n9^&=&t`*~vAVmBS5@8AVysJ`meXVdguKhI=Tl|>d%W7d zmBKLVqO!RmHrum2QCjqNF4Nh||Wj-)-~LGh@OM0{mX zceg6KEhp!{%}xph@lv|?skBcwR>@r8Ld4f~cXx+NCMaJ#Z|qm1p9jYr^%iO=ub3)8nw7}JB)5W z)J1o$>{zH$kS9dFpc6O`Zgd%FdGt9x1TU#&-%68c|L6;Doort{3oH_hKHR*TR+Dot z`+8P5m0MN^#W++h%-Z|y!?&1B7&S;SyEKhhax6?j9a>MzhWlzc&Sbe?FCzjd*A5+A zJx7B2Mr|dT_0rX)1%I{;#lYYRN3(O^rR^QB;Q29|mKd@Z`cBB`3%4AKmgz4=+y_;N}0>|-m(I_f)^NBA0a@*sYRD&>OE?X_>e06d6z~dyFhf!A7nud z?!F9Vcw=mN%rXLY57Ow}glI!VsmV;bl6i_hH{##mw|zJg^l3UMn>||EUyl@JQu^TS z?~pVF=J<}~leON0yDilT)Q+M>Z{k=B;Odbc=75s#jk&37I-L6S%0I_@q`xG^{a#Dm z$3sjsceu?ID}vnr=6iOE9x z0K3VhyfTQEE)3%%*3fF_<*}=02W^!L_k$9mJ-)3i5*0b{i3$qAhQy-J7A% zCG1!UFJjl@>(z?h{Mw9+xyw`JFa1>Rf$vZyduzwm*H?LAPd97utiP0-E*RnA)6-@W z(n0(ZRd)sQ%T~kIKo!E!f;wKGCkoXa5%D|okNZo_2ujw?md`Ro&8hq&U&jTWZCr@YBSyfce;3j1jOeEZB@q}W%GTop3)#LF?xIL zUSb3xbr8Sz{bz=du#P!sAk`$z&0&X;WIXaswYTOq28(&NHnlon4uwWrh70^8(gToB1!$M!Zo7#;nprvm-E6qbbKu`R-5oAnBmpsOw+?pAx4)-d z4|Lcl^O5fSr4%oMzp0A7bk$MEx>aL!E-hV%xpW&4aI^bxtqguEKc5l6$OElVZ5TAo zts}l={({|Nnj@^XXeUBWp)AC;2DXv%+53 zme19l@N=`3N;0tcuXafV0>(Jy3qTMNyqeSl=K@qVg3P(H=Ui6jMFvS6lJ9`gsEOHxW>kaj@GmVI$Z+|Exs@-W?0Qe9VvgvFbNmxK#07@ZPYUc>GxUf>VKYD|o4=odu;Hmo0`XIP!yemnv zJD6P1lI7*|FGm!r!_i{qXpcegv~J)*>#v7T1k7%9(tX+3%mnp-u$vm4QqY;n{O<0f zm_8(L)hop!lg;I5TdBQk40Z<$7ZOahLqRHZD5oAdE zr;T%u_)SVn=`vu7YsbPM+|;St+;rSf$lrpXRmjYeV;w0%=YuAMsqRCcD14dHuNUg* zY)1o&skI>_tc9x!32^bpC{gL@W+ea=%$j%1hY0c>mcR-)X%A;7giU3c#d-tie^T&` z>?$~A)t@#>rubqQP(AqVh2X$dQxM2STwWKzZMH$%tM0HB^|w{n@Wr5hQ_|~C!*q`s zFJ>Z%K8)0*-b{i61SlIblH1hRccYOpf)Kv+pu{bcRgEhA$!j0%4XoTnL5_< zN$mj&blC;%_!xXT{zg7OZGS4#VJN)aB6+G8U~C$BiU@&huF5^kXYN?J)b3^aA&sD5 z=x27%i_-@G-TzWvIg#9FaMA38d+Zr@7M^$?h0p-UL`MQ{R*k_7o_6B0k5BBJ5?b_G z#sHvJKr-oXpkD%6W+J~iY4FlV$Of9&0;g**N?MTrcv@1jTAx#z|8*x$L`&h+y5;TD z=Ejw!N0}M|zt|cc?v$df8ufGDxVWz}=FxxtQ20Zkjfs(3kntSAhM2AJ;Cb%cz;^hv ztm&W^?1DYN8XVCQ+ZZm?TTI{ZvTx(!Q?Pa{b0}B>RE3{`8Znj)0zvgl_v8~fi#kob zMNAYYX0WUI0NpU4@b}^)iL#!X`;38)nybMhEOY=4>Da(V0Pk*mG4toE2wdS~v zlpjn?VQ-ZZ?o|-Td-l`n_qouL0TWc!9o61UKV_~ZuO(L+xp~qLHiUn3GMmJ~A-9<- zn+X2TJtK%4oeg7|@S}DB)N-re+Ty-iH%wl!reuP-W3igM;yb$^J%fltpo_>o_m6Kq z*q5h*<63vek%fDAqhzANX4UE#t~Tt0zP za+N(mWBn-RR93xOGbNRQ0})xn{T8WUae889og#2F!8oinyS&WCngVP_2w!se(f5OG zAHXau5^wY7UC02W`S#){CHS$${k2X=pHbu7e4z-7Xp5zudB3#}=)8`co0_J89{}P0 z)tdzyw@r$7R)~xiiiFhYLu32IFtnZ0eB!vrwPdz@G;ojk`K;y*j&+7~3$_#Xeiyjk zbtJ@w1uLZsJe%Op5ERBU?tQPU3I=L0-6QS+AMHFPd)(nG)Ik9RW;}(eHC9 z1d3w%r(ds4L{rE2v)|tY!W|pcMFzx%l^z4 zU@d$=2@F>2NfF@oXh*CLLDk@R{%p=WuSX<}+CBjdRo#DV4&dIBqdjNoH%y}iJ8 z#Yq>4{RPrXDrM;@U_#c##d|LMD|GAD2go0&utR2Q60tSXOzu>^pg^F(^kb>B4ePEwc)0pY>oe342T5fd`garboMl2av30IyR zf~E=EQ_m8p{V2%&m_8g?^lg)baMfN6CTI=`;{_GD(gcH3XIo6W7ol0(R?ab#jjDoT z6FsntaN5vz;U<7yQH`D=L_()pDjD%_gk=K@>O$5{58Bx9%vjt^l(qw%#2gV%KZji}+?xMvbid~H3? zRF5w|#`7B?4oYJFL0H3PH0Utuw=PY_#K1Yk2iRIR8Gs;T{^RZ%ArVsWzn~Kd5X`_N z$REv%Ukr^?X)^M_Zy(l##n@Rn_QCgrp^kvN;6uAVSwb`T?~=kevT;b9-v?MUU9x2#eaJhfY6xi(O;A%MJL zN@+ay_dj@u;75#qLJ=kXSsRYVnKkCZ%$+um~91|(0N1caf-; zW<31qbNGv-&v7xBX$~f`-*De>pmhL>TqPB!TXb!Y%xt{}kH)4TZzo<`d>y{S=wIc2 zN>p)JU1}4^1<+lX`@MV41jY-Y;)#Aw>^CYe(U$cA{iYfoo%N5WCtgzj4YEy6%5L@e zgtNYFU8P#Fz`*TBGARZI=Ce%jKLI-2MQ!C}??-k>)VK61c$EbVwQfty-<&?{^6>pB z=jSsL@wpXzmUay1!WY9FHQvIiw!WqJJX%zJ6&u@T=?h{_{%fMYXc716Q4fFfiQh^lU16U5_aSq6J94d`2)2`f{6Pw( zyipbK75~R<3grgLFI2DHNFJK!kHNfF^4c%C>(j@PCb7FO0E(&%K@|0y5-Ve60SM_N z5y9760l%;Ein(Uk?tlL>CeH~llfhh2A@z0Mn{Z?Z_CFVy5M=DtO)YG_JxQb6jHKag z2@@0RFLreX>l}xYfYJW`rT$0YMZCPpkY=Xt142%p8N?>i)1mqAN@0=7Xo;SF1J|%h z>4VVh_}!(C?;^Mmx535OPbqrE0YCRKN1+m6?2D@bu1$bL@Xzyz< zIBl)rjp@E=vpWEML&?z7R}|R3*<}QF*6-{P^2|$$c1g~dZiC0vR^R7>nxi+u+yPy$ z)h^R20)8`)t@a8Ki<%8mcx?Uyfye~ZE~46=)HS=l$C>E#`pJCS5$8y0$v|$SB{yJ; zCM%V3FACwua&;-{`;&>WPOgg#koH$FF-vevv}swef%%!J9GM3=Hr9 zF(T$3w@ntld{aSyn($b5q5_D<^0l7sq(Hn3P2m^Wp`Wsh#L%yk<|8Fd6hd3T8KSyI z5m|-HX50O`6Nd&l*vCF6$g$dBq~9~`T~HgOtutw`8r%zAW6bls4V1N1fP~ zT3YN>cqCowQ&_bw+HLyr;~J1dKHy&A3yB@tnc87dnK0d2m`47Y2!L4(f|eFSl~^Js zK9~H+lQE1n8u<5aWX>#!s6WQ<_P;+i8uYz=Gfh8~tQX`PdSnv4BA0)^RTba^TJNwn z7I~GVr>KHQk-jPi#D>2CFS`@JHzKF%^ zj~jC)&`%MGUgv1bK)jM>SSCph3Owp`;E(|Y;)>m^=HI@JvL-4>hGE<$Wy_EWR-h$I zZ_fNdnw{LD5f|_<0zSU6K%-?86dVg^;L}lD8N-{-e(V?^9nzoZgW?A}X85UL>LSiN zbv-1~Xa^nvY`3E18Fm^+<>BmfVBrZU8~TAoeLv%4hd%8Fu`R|uQ?ftqcfflpju8(Cj1aZ;f zK-@$O9J%0TFcrbe#fFc%7k1*^0|`+*Egp5zk%_FmeejVbhy3Rm0q&`TkTzJIk#}$M zV40e#8>&eFbWgpE9Cl*8cr}mKpnHDM$p46BzN4t2ZZnWqGH8plvzuey3*L?%!`pz+ z-epQKP(#$erDyejr_9}R-jzD{FR~kX?X~d^Zo>t%Crr0Sl4ABj3XU2R^?pD2Asyb?;gN)hy?`TlG(s>n;`Cd>xdWQRH&D7y%I?}SIzgS%- zCvPW=L`dkN0ZViuHv#w=q?B2j ze+NXkszZ|{)C4Ys*q&o~%EU%?^I!4mUaU|D1JhT|TlY0KtFb`k^*sOJ#T zq63K~@y0A#y+|`oJ8Qm%Eo(|ZM<=5ojU;k2^`1s8dbJ&@pO43351IM+-8J_)y;!se z!Od~V8*x8L|St0=x=#d#FyzQT&WA88ARSA-+=zQ3+O&J84v zn1qaI*YgPj8g;DPXziV!2XHMJ{Y@G$UEP=b?WXAMi`M*<5K369_t$-Haf!bWyETaF z@#8#qU;_i>WpG9i7li-KBv?3YrMhm-`rb*tb3#^mmiEtb_sGOxHc064XpF6Ia&np> zfg2qVkS|us-SlSQ#+hPIAyIx)?3+sV?n16=-u4xHD|Pc(ARpnG1j2mDA9YzX zes{>tzv&jk9JY2J(&uBgocrI?;9=7N*5$AFdbKK{4*241USW|WuLETUe#$Re|oK?Kcjatn*uW&Iq zCgy@@2oH~-)ACH$AG$~#6Fb_651B9A`e|!+c{&_E2X`df zz^>;|7w#0t64>FQQNGf|hGZ|NDQB#|TvjWA?9qU00IXZn_l0zKqj+B%w+u{BczZ zp041tMZw7KIRAQ(baD0qxar*_5Y1!<+1RZY(->L%tv>)2Z z)e;$ixrhF28?yct?WF0LQ<7SOytYPs`0d=B$CY~HuOkUJ)a~B5-6BoZ0b2ZAilHCsv%|5y0P&f~!2ywL@`jj3{ zytSk-&;8+fcqlv^ohmuZw*2@pIx@#cV=qB_!4O}X0kus^N)_3X6Y8-|Td-K8kkZ-N zek(;3PGB{iQRt5u5qn}@#2%6OGK7=J&@Oz0XvHSOZ|bxz{ELlL`*3eb`a^Z$3;L{) z_ZrQttXj+-BAM(qXNbC)MNw0>3XCitO-1m6;(q~8p-r*-*u#BV*b*Dr;-zS)g5rb- zcUHOIT*%fhf_#r@J)Lj6ZGS9rZqd5z&CQFaX_7H?g$lmRVUg!Lwp6wT3fk4 zWj6^N z^(zBI`75A$Nl!V_9_ov){Md_KP`A&!&`A@9p)G?*A#)dC^k{-?RPpD}vnk3nb!n@} z$ftFgpapSv*@Ix`q14|if7TMrdZZyM*;4inGq zg`9k!5VVs(p5aN8RqOYVHkg%sD{1v@!k?;}KB#k&D<#q6NBOz}shajS+IRA7HF@l{ zuBhPB{Pp425iG2s$h>C7EW%?b*@#dKkJKfS0h~_k*p=k&q;M7KW*Kl9_xI4zHDYV&oS^BRvMxSi> z4Wk?UVS>0GIf&nsR!~V>nhsaElAR0n+|KJux++<5aw2rj>I60PQ2L4`-6a29kEc&V zFFJy)PU@`(%Tk&4OJ@nR-E1c9eL0`^6n@Fx0d?jYmn@kIzZgXK5cy(jVU)S^N?eLy zP)YcWC zD4~j&>V^y4Rc1Q>T)e4#Xg-XeICKj+Fj66K{FCHWwi)YqBcxgJM|SK%Za>sN2-6Z5 z?*~f9{K`sOrnMie`6YYj{EwAY%95_}4f7wu8rnkj&94`+UHlqxy;)g}w668)?6a+| z|B9_EYGxIXl%dsC6!=4xr^8JGTiIGSz2@7beupo2=*@(Okv!M{3)=oEL|^b=N!d=pair`>L|JG{lDiR$H%)5{87qJT|xZe?^2yesM} zX~?^F=bgmXkC1n|FS`~dSfmBM(q5IYTFPaAG?Jc|_@4AKVqDeW$QC(SXk z+4tSl&3%*}&qOE219Yb8bLMsbANv{<-!5R7V%jdd;BV=U~OOF$(5 zr`Ecq5L!B=AjQr1uz*iDcRf*7i1DF%y!VwjHHIO-twdcotK**-KdJz^aY-|tePZ0p znp*kY?Y}$qh_-7Ul>0e(n4u=m@TpG(V>fyQUT007OK;8TYS3CWJQrM_gY8lxM(Yz_ zZU~^XiIf6`RZ;X)%d{?Cd?y@VC7A_Di@SxMUl&YA-S$6^TUN{;4@xsPUo9jvce|7> zP+(XgC`xfZTQeWq*7_l2?P=Nyd%nR&j<|H^yqn|Ii_JJ+ZsgT05B<+&bq zkU2n#SS-|fMjNaNoQHd~lug#$+IERAlu8$6dl8C^mD(9XI2~8w#|D^JGdubQ?8(AMa`a*TG~9a{3}B zoyM-P1!F6Gu9izNqQ~z+M6Hid5z=RQ6#`w`luJDyo$j=oY=yjRBMa{H5A8!X*YI|* z8*V=Sjwo4j^I92pj{GHJ{w=DX6PXO@19cb%Ti)>r5625^lTOO2+dRPwZ*t1RLoH8O zf9|aU2d$@sKZf~2k94Goo7>7`r}?YR4f$?sSV4`6{Y#2L)Y-Z9b#`w#)J}#w#oq&Q zLXX3b(K&lo3z9D}n3|v;{AFN#Tjznz`ApGrc?%%$xMbrTwWR4lZjJKywP{K7m9?~I3!aR(|RS7=19iKzcrt+3rI~#94&e5#EtJS6fyZw z1O$MZR16y~Nwmx$#$thTa+$E(dWd zi;K%xlg82h;GC>p%;jD+>}DMpKc86ly;>#CEvwhLRQZG@rswLltq`NDo$tvY72fM+ zAaUzlZFx~+$6E_s+vf~fOUBXKJ@=4Ubb@~#1ZsJ{$Cv`gdsSRM`W`wza{g`hU-VLK zo^s)_V$Am@m4=aM^l;kS{|)XklOBBH?_m`4`L^DX>8u2#3mGK7-_j}8{G(GLfl=0| z6vk^E6X%cE0*&3ykhl=@5XEz!-#%M&zvJ^g<=d(EER`$;ydFw7@w)9}Wt;u(CnL(jAb!mOj7JY|rthNh+&corq_n_o= zd_bWSx_zI!lRsTv5?<4?V}C(F-$J=K*;7Fao@zCL6} zZjyrjb2|%%HOvy~Yrxiek$eWLK{igUQVZXH7Z=B|m?$ta84HP0Q^(GoM%d=N zq&nJnW=9tOe6U=)w^`_C)K~NnnL@Mo z?ue!UEsR~hvpv89^WvW~DRE+QA>!iGwHx{U2rRL5sp!?SEvUQq7JWkq9+5T*x$slJ z(2i*Ou2iPtbClXI{`2ka8MXf+P%WDEm6_LP)Yn(1iA;CLmC(dOY8qXOI6!nIZ+P3Zx<_u}{at6qnTAYvyRlS$kL+s7_?bzEfvhs7vZz0QrUp2qK8EYAv8 zCDlP89W|w)iSnuG&+6)5Q>%tUzjk2EIzJ5eij_{NGpLf$KuNTk!PjIB91?wO zBEKDe1Ru~07u#~J_gS`@&*@-;tOVXuJ}Z@OznN>yc4Uw=W|P?xBV}uF`my`lD=u&X4d-nd-~VxTFdW$ zOvbk2dsv|p$fVCuyiBk|sx>v_?lUFF+^)(ST4ma!)l@Pj_s>fge)NaU1)59CsVvVgx?_!PJedK-T{PloT z-i&HV+2GWJBzW>f?}46@~v>Az6R`}}Cn+t$_T-CU`=V4Y4-jR)S@CwIi9 ze@(*g#fWk7M(0;+9x9<<30W2%Ygp&JtZYtAoyfYj%Rif~e(WU6O0D@!-|9Sf!P%k=-Zq^H z`xhB2mJ2Sj5Cjfs)_HzS>$uNk^Getrqw+rxY~H>ck5E>=wATJfw^(QP^|EMMIzN1} zf09A3iY_K2?C`|0OzwQQ46PaKy{>&lAqHFHI??&537wn!!?q+&X#e&&sBZ06i)7l@ z3XXnLD*wmRSFlCZeQzrYN{e&|f;7_7Ad-@j12}Xk-RTfYBMlOg(lB%k-N;bV(%s!D z`EH)y^?&^Uc=nmI*S^;sYtOts!gXoveCk2$&_34*CQY$2li|Wd2%9$P=-|hX@bILn zjPFkM9nQv^^#<==35e>C&3TJ5RO8|GwNGqpxb<$D!-L;nUj9W~IPK=(5e;PHlQYA} zBPb!;|9I2*)1mq!ORa*9lPnq+DEbP;tEYrRf2C*JkM2&rprD|&U8yy_%pZFVerQIl zuS`~k^otEX+5?=QZ+<@dghBIL@c`HPk$(dc^`R1DCMLc4n-`+RaG#{mkZOYuHKh|) zs+H~)7`~XiR?4>9E~`hT&YahmqPLj<%yli9U+EwZ;^|v0i})rWkOnWY{dcgd3?;i3 zOWCn<)232lOZj{@TuDg+$N|}L8-r*qV+ptIZI7ncU&kfY&!~cPTladwtW8=0wC@2FT`T-Y9M@=l$a&2!4O8TyTGYW4uGxTZI zgqE{zY=uQEw4PXgZ9*VD&J3?+H9u8pgHlqfhT%{`6|X|?oI?Ry*BVAnrrxsMyoj*p zLTh>Rd2XzG+z&AapC%R8^}tg4(}r(T1!Hl*TcdYlaRn`j#x|NGHt}~Oq`U@zJ`S6s zn%Q1=UZbka2^_s($a*&4%(J5qN+$ugy~V&)5hYR9fww2hGNR{J`3L9ARGOB|YAbDh zM0a-McW%!h4b+Lc5#vOU8$YI&5|1|4h>1x`u9O@vNx5$xr|JK_Tiuo!p&IgPVSxJtZY2saIU&H5J1!Jcj0KtIJf*gWAaUwy8JzbZb?2?fW`V za54tn;p_IZ5>GKLjcntz@#ivOB%NGSdeG`?QEJw$9 z#x_3n9;Ijt>1+6U&;(EP|*Ygr!yt8ePZrlvfCn)I4x$32*`EFJNnRUNyU_a@o z+j}D#{PSmY#TUd%p-#T|y!va$jw^3T>QyJ9tlm)?O(ZmH%v}|NGVcZHM&4z>*&|!**6Q4uwA9|`w1v^p;Nzw70<192Z(8vIZ zK$G+FX3D<<_BVl|uVY4kn?jMXw>TGzU%Ga-J%`8 zJyj=pFo1U(rA{(E&;IJ^r!vyciDk~a7GC92a=7ymqi_d3y`0CVPc1}$Zfz@=znguk zF({lw$g?%yei@vWOb>gG0%W#V6HtYxXD&C#qVh%>ad11AZI2h6Y!tR`Cn}H|g>?U8 zT=gw9Xb5p^L%Ue9hyK%sDpPl6*yvPaZ0s`r5AZt^bw?hO{aeZvEh_HwMc*E3UWUz& z+^jywlX@)tnXmCM0JPFHeVq{%mW#p*x4y17dg}j{=BV*d=ks7@!VAtkFrPW;S|bXf z8Tv#Is)ut)*QDK*gd3Dd9%YmCy*@-0Jp1#P8|E+XeLO_CG*wT4tcuT5KO35Z5PJ*){lfYnZO~8hqu| zt|ibXA_)M(tAMICU0twX$!WlQatLmo90oV2#lOA#r|dC~GIjacJEw^k1EuhvVX~zG zE0|(+0O##PzSW_R$|fKP4Qyo5km)ZsjaF6veYzYR#Ar5Xx*hvpGp6&jd;Mye>PDuJ zle4bbiYBA<@BDBEioVtEdcS#o0EQ*fnNZKyE&^|~DR^>ndG`yM+S7Mh>0GaYXh z_3KOZ^eBB%zlAwzK@^ek{Hg_HKYaoAT5%xSt?MDAB?RV(w2Z$yRMw2&v+XUEQhyLS zmIgnnDzOzF1UePEo2OXG{B$eMLq<6g2K~c1JK}G}cXRk>ODiFkQh1wzq);>5AdZ^T zzxlts*plp3G#Z=>Fccie3qSsNfW<&1dNmj*e!81z(3^If|GM$Ug*8p+`ODw$QTJb> z=ozbB_4lL0W?FFgYW_tcOoB0Bjf741`T2E$Qh?G#X>Col^^i!J_wQ+(zZ`RuSEQjy zjDilFFG=ZdOivH~g2^nl8%2d4IdtnbLahamJj8-bi%q<3Pn?>SuO4*Ph=#*rV|*98 z4efPQpKD9vD{^g7##NO;%^`-iVN($`9|`h$chPZsdM3z;?z}_Au_`Tbo*gWa?1wyF z!}%JPPF*TR>YR2MMrCG8Rf0UNG@v}ye?`2#9IzOs#wAL)_XR~)f3;Y@tDtT6W#Nsi zWUD`O?-t;@FHgrIFNqao1q4*Rwu@Blds(AH5g&*bG^wr<>V9EnhvAYjXrIrK4-b%P z2#?m|i|ZD{!TGa2MV9PgipygNy)6{R3v<0tlNIyv1G&L zrb6-kQ<2ieckf#L$NnILvD!%I<5G5oq+2YFVeA<}0r9P%56-?sjAz}pJakScP^bxF znJ<%&v#k*`S_45mOBB)b=3C9KCehyg+V{MoC(3{OF_5Tbb#^!$6=cMNzJ@xDLip-M zxv_EZ(sA<3B?KqbnZzXt#>uw z)$6!zX8-aQm9wc4v$+gu4(dYq&ZKIvoWJ+qdP6-wm+m!^^(pyQXqiaa&;P z$J^Z;+Br^>p9f`Te-@tzS*OJRos^R!@?fvHAZGk-k&5JcxZ#%|dPN_-`oSgS5dJm3 zh$+~NvXpn|Ud=&HaHudP*gaHt>19>5-!6*Q&=Ee?=g_N5b3bVP6^>4vS?zgNVK|QZ zFh$~EKf7v94?)G*&sj>4+TAqYbzLi2S34$YM#cHfhq^ zgNGjvtEx9|d7t6=QxvC74Wv=&51bzuj*7?R;N^VV_sHM-IA>|2;|psyRC>?4KMiU& z^Mh2jmuCT8WeJggaMa)6-W1!IA3Sct?my<*0s09o^kqmp>!x?V#cu5|*@NZZi|1)q z$xfqVTeoi`gVQ~qj{W%^w=@akLu-&Eu&N0%f9s`#2(l6W@@6C5@ROAPeN(kbA1p8X z^Jtk2=SB3a{@oX4WF%DQwX4^r{IQ;`8Rz1ah#<$y%$plc-&xs*C3gX*IU7)oBt@>c z*M|tlelA`eEqpvY{}|Aso7`157dhwL1w5hp0Xd&5xY8DrBzSIyH{-G7hvAVl=O&?> zG(?c``XGgU##jtd>djBV$bsx!NZtQ2`rAx&S0G$bRz*sjpfPz*#hk337Q4Sfb)BC@ zx0q;FBIBjZzh+&d5}dtZ&!{$|3RxZ1=(z_Z*1YGpz0Di9dXebA=^372xy2kG(^0dA zRWt^55j^A1*m}&G0o&U4y{vsUL1;6T)wa+UM*ir7i~HKQCq8HYhNP(b-E5Hl1U_aI z#u3%VOUsZek5F_N`57`G2GhP)GDU0Qq-|m*72EP1b+WV3zW2`LG7?2x59n3ac^lca z?ai^(<-}LucG0%t#3Zo0(@5L&weFhEySJ*Fb(my$z;Cw723-7mtqLC%cSNK+d7Xk3IrPZfAu2(dPJj>a~a?S`i2C}bf2rx}vf(?1`HuJ?$$xQJHA*N5i ziWI$WE|%+>$xTqq=6B}%NlOsP!r;t`%5d4&o4hNzgNt1IJ9}SumanDk{}sWa$>=Z^ zuFeq3wAi(>(nTWJbmdW-kf$~916_n%Iq5~B&-7|Eo|3X~?d*x)K~3&^&)4D$?{;$- z9(S6XTa*j^#6+3f6tNX`lU9HG)dCoqn}VM#(XI$&2v;#<`pTH&omh_+-r6+%jpsh|4zq2 zt+!}6;t3i|B^9&#*T+|Y89VQ_#y#AZO^|`1XIa6_Qc~rpR~3q%9~8uBG`c&>a;5P6 zwyo~G;r-Z*ck`a%Gd$L(^qkeH{M3q_;rVnC0rmCHxZO^#HMU1vhzXmJ2u-X<^QHdB zK~YUjEsFJGVb!vtuj*+h2|;aE9>aq$^8kKbRSxdCl%|6eIYSht=nzva*1> zM1LVEGPZ+)k3m6w2K^&`BgQ74^<+E`AO^y^9bD(vq4t1ck`m@*QKgl zax8x*lgF+wd`_q_xo$G_L4#5kG|tML(!J2C{;+;(2T78BjgF~4r(QvMK8dYgZ> zool`jD9FUFG>m~smz~#D{eG}l?iEc&{$e)bX6GZ}y+{($;(3+XVsBP$jgL23Fq{B|sFN^qRNAgi69 zKC%17`d$nz4Ecka-D{nHQ{4DLDDTgbo16LV+e=xblH0SbocJH1nnyq+`El)0?D|f! z@?C#Aweur<)(oNklo1gMF4D?xheflNRy7X|jWL;MXudljU}s&o`yQQ6i=e}dEs+@; z&Ia02C!}dN@92f`YBKSj_tL*<%|%NcZ)(Pu7|f45BqYYwai3s>stA8g z8>#v6;}9WMc1~d|Iy#+agjGH0rjQJ;BZf2~`eTOojmW%gy9;%8K z$K?(kmX{xmTbq2f(?RoBQnK=b!`H1FP>Mw*`Lb;LGfX^4g6zxi8@@V7UWdxi?=^4vgb_BS?@fr^02mUqk0DzJpU(m=ed;wO7Ww8Cv01S*^MIL`W#RAP0HQ&r3iN>W$Is zMzVt)7ACSMHEC@0_pzhZ*~A1otnj_yKhC@J^e?LZJxE@6(a*^709nuQGQ<2ABCke^ zne$!KqErm4g`o*(>jF$wCBRppHlpzmDo{`hMz@<#*o)t!!(ZA>nL zoB5%vI-dmL#TRWsO%1Mt>^z@r^3gAC$f{>~xF@&)o{OdJ>2nNE9m?F9-EYpn&8>6X zI??jU%75{#%tiDh#Kx#Iy5V3qGioo*XTV5uvJogGcF&JzUPWx&zV!>M`Kt~Q^W$MD z9e8tANDn@IEMUZ8ep)=)sExR$K5pv^`1AdH!Du5gK-L=2I&b)DYHRlO?;vD2lz`nO zo&7(247Ns8|8CqIQhIclv?yhIAk}o7krcPS{D#@XUZ0@IB3MQ=5GHAnl6y~Z{S{CO z84>A(8)dl5m1cF_bbB-9Yp{(x4?255f^)a<#9?TK+tc}7$xY~Y4E>1^Rwjl(OH|N^ z^H&~Nh=ptbB>0duV|^+-kVw}9I_0;e*YI}P`Tk|D;aY0$T~3W>?fzu~5|aurLtYQ@ zHRscR!^30cg{)c%6Z6909!~@Xop5D^bZiYXSjYDJ4$+z#&|Yzcshmgt$_TiIxuD=q{Csl#9&_jp!mbBh}v*ltizypr~UreQRzoEKQsk5+f!Zp?4 z1rfeNH_Yi?ydfG;>K%_q5gr4{c=6nI?fB})OH;j?i}g77XrK!f z>C@nox!}r#Wy-M$gvg|*Rp=wBKQZOeId8`IW0-#p|HK5lsg z803{s8#y3D{zNADXr zW1OZ!9Z3{!DL1!AfZ(8gRqWb5<=U)$&Jo1;XQ8gBK1UiTt&v2=67O@(^m@mMh;!*@ z*1qgTe4;rp)%K)O6W@SM+KVGxZJbhx;|~MP3|~hZ^&LE}PyIR`S8&EOrU2QL4;fH@ zXy>h+Bzy<3S6~^VvcM0(O=H09Rb%ut=!sZ9GXu3|$ss&crafH(F6Fe{9RrUg2~#Ud zmY4GwZJfv@Bo6WKWqF2&XKsI(9lz2wq7)(&it?=9-r9Q~e4v5>&+z(8YU;K98-W-P zkB*wto0S+whPSwOU^wf)=_J26f`)cg2F!SRrSD7GbDw0pzw5Ap^JoL&lGz;)5XK*k z@Lk-W@~A0R$o2O@_$&ab2IZuG5QF*is+_*Rt+cyw5t!!kX2{)%?Igd{EAc1Ao@d zjDUWut*dp>9<_PqUf35v3Xu{LVtE8B*bL6H#J}hqO>6=_lO-Y|!a;?G*oMjIt^75> zFMfJ~>%L1A(D2C!_;*@@M=EedvS1_?(Rxs3|8ZRg|0G^}B62*upMi(NbMF7j|2Ev# zfqs^5HWU4O&5DUWq-2V`r2YSB8p#-}^Ru4R5^r5p+C_TXKC;>y$FyZtJV~cm`=Zh5 znb)kH5d|&Pr+-LE$w`Mqm{|v@smGh!;yXAb4b$gGSx5VqEfnVgxLw9m>yR)(AtF5b z^o7|?M6AU6nqLZXln5{Wkz-i*faJsV3WLLCd^6ZamM<6jc-S6<@Y-s$0wtzuj~eW0 zMaw^nk!b9HREB{`OxQBtF{C7r{J#34BX9uOta(rJtbv zbr5>$c^`Bw&6GHgtW^G1l6#d7Kj?691+THKEeNK}#vk7GZ>W7(P$Lt@Z-T-Z#}BCu zfzQ4fcnd*o__>u}c_fXdhSqZM=Mm8Je0=bKwqcWJIbFFxHbW4eVC%HWjw*RG=X%{b z&bB8I7EjBAc9(SPY!~nrH^rf0;aikF4OU(kh9A8KMDD>2nL&z!le+4+{a}2D)g>v; z&E1h-M@5VEpTf3+T2}Xh+AyaC_ypLyeh%GOSkH6XZ%{t>|ItxFX{*uli*GJE?`;50 zlDQ?q_G;(zDx&!gW}QaGz;DVo|C(;PDxWt7ypTl;P)yFBp|oN9R}QOob5xy_bIl{2 zVfPOk5Bd-|xTJfe`7#!WYTBEMeBI^s`(vPm!Jt+@g*$shP-%`fW&UT*ai~fl>DDU~ zKT`hh@mhZ0KOQbrIL(nFvLf?I);OV;u9n%^b%7hhlg92btSSro=O?HsT)#$-Z*9G`r}~qJM1HvU0&9p3 zV3J2;{eo!X9Ze)fG~Ek4t`ZZSaG6#LUFuC(wR2GP)h|9lG`{oDOP`m5vW5K3#1kIl z@X0Cduh0Pc_-PnLS=?jU>NU9lR?VVrAC(gZ$t{Tv-sbd@g9@T1;ivMNc?e6?v z=+8ywNq*wm?Oy#jaIgcPR7S@d&|!2_D&627(*r5^@gw;#b!z{!J}sm72q(QpsG?h0 z2Xc#&2v70hfJ&pH;;^x>tMmAH@4NSbmnn^l1Gj(9Ir9!gc#;IMoxFLoLD^F|XjABM<-$~ZD9zRk&>jK3vXtw|X71`yK?(RUeSXu^bpzV* zUV#J}qhyFlO|>ReDVf9;w6X0X;Cm%d-7twPGYN+8No^!mc+^fTFW>hZ^p5qAnvlqG z@-w6P>6yYY+O(ZM?>kp6WiBvQ+*LMg`A6v#UjxWURuLAkjwF_VpY5bvmmAf0^O1pY z_sz;9s;8Ul3ao4zVjLeL%QcICO#GIdokydg$v|!WGlbcEb?=~I&}7q(+tj-)>sRxD zCjS0xk|#&vw6ekP`a#^e=j+c+f3WgN*6KWsq2$;Pl9DDLbVoo* zSTU)+sYr{(daWoXX^1I5zfgBidZISz^6-F_L7#f`_IMCBZMc!N!xANPeAby1`uB^A zVr`ZM;FvIDM=b2V3)k60BGN`qJ!u!(F0HriZFXPf=5(}wuDGGhTWLpGY$^~i=iq)_ z+`(k;Dx-;?1091Mky?meNZInpt{x{Z%m>h(^RqzTz8 zz@g3T9$~^@%%?pI6$_ z4>P<*F>nJMkrQq!1L%W%r6 zCX9I<$_ZDyv{m)!fQdzGL}Trk71(jXBbRnC6PwP zy=Ac^5fe_hA!a_M=wF4{bt2=N4p3*?pE81Gp`4k8&T^8goA+$f)YJ%3fqid&c)0u~ z<9L`3bkl(30H%2Af0Z>VAunsJu3Th$x`%FbLC5nQ13M6>JAEG*NiVO!@!lF;Ua@*M z;Q1l?_}CfOKPYF>a(m}vCvm#mn^uwc`u_V{qZUgTc$>bf%&^47tnDMyT2ntE)}QBrqMFa#c{XX@2%DMy@S)LQL(JhcdTzmAim~q8!(S!*3e+tp zAQC#P1d9H+1aud!smcP`OWw4U`2!N1@f2PMK@h_@UM93l5Dfrynbhf)t{f(rA z*ld`Lq{?<8a6%bB?=cc(NH3~b{_j=CBY|_ETPcHXl=y;ZI$l0Hc0HUxuZ{TuW)fQyy(K(+>8O^LjhZMN5+rnj&@W z^@`7sg%IZXJw}V|P`c%E%|d0M-|IU)tDLC$M61F`y|Zg=5zUg00lN`({Vs)YrEFx< zLt@nUW!VrdD-{>1f8S++EF{^ouM0L2sI;*?Kw_2cYQe=LHlX~8$EGU%uO!0H_)+;{#ebJPbDODq4kN8t{*5 z=9!3zj^#3%c~+33!jIjw>nx~JOpy2!%fRYnVFAiZ4M=`A-nMctr&*P@Y<=p>3nabJmlkAF2zvCE^ zK4|C075)WSpvZ(2*88SXTP13r#1f~X?H(GnPILtU^*N($;eNC6Q(%C3OmN;II_+vX z2ffriTTnitcxyPn9IcDSS2W)`cj*O6Jf!{;uH+5XeTA=Lx9I*KU|%3tv`zv32D$CbeYisJO2H;F<;viwoysvdbGWu!BZfm5qCp|1+ z*KNej*$3XEXTsrULrbj!?v{Y6+MW4iHRM2rvuFdxbTv79RK&5bA7iRKs~K#oEjzS; zlrS7PV_|PnPW_nSBqE(9V}IpJ-=+0U_uMYyLm{15&rU(M@TZg?Q=0JV;0<^w&et15 zvGaRH^bkDpc4>X_2bvXm%%6UL{(Rld!sp_e_yCTw6HdJWAvQgAF}v9&PwK`Yzi|m$ zl2C($l0dL0_w05(z+lnHn1Qz}|3T-9yk}iHcj>sY9pNtkup+?YP{}&|%cQ>{^sG(x zXI(l=BsiU2Pc4EK<%UIQGlICb%olg4PH3(>+~u@NN%Y&X54kS-P3&_&I!DmMe}8;# zYW@e!c$(J#Os)*0KIOS0oe|1HHwSkfFhSKiY(@);z1Y}Lp8i!PB`=@YVH6RfX33E5 zd9vc^@F9F6^!#3%LaFn91N?h!3jwd*|HWEV7JGtiOOpIiub(3UeEc|21f}Pt`KGxU za7#}HaBw2nE{iXWSYjoft6Js{!m5uTwmC(=l_)t(^Rf*iUfpk%oorQ}jhk zKE3q@Lp#6~WBCRLb^YaFx(ox*i#3HH_}-^&bFuNBj+ayA{<*({Zii)b6hMn`$MwH{ zy=Grw5cdKN*}2P8<`c#CVRqqM2I#Z(uAq~@1p8e~^mmAy4t>5qvbvc6&GFqH3M9@=sf5IGJ{3 zGVK82)XK}JAG&%}xfvT%UEh6?CZua+(-Be#@ zK>8C9m8?2$8O$|f6N8hle(WH(37DT^@Y=?K2AP(cTkT%= z3(APH|EUiWGWQ;8#+x28;~CTQj|+%y7x1G6>`n zK&VF@B#5noh4~l~xo7J4eiEE4Su1dbU=S_4pPWgOesSe0@baZaK4&pKL#UEge3aW^ z>9AQ`p~&cHdoUq6_~i+EYX9OQdeW;FW3{FMx9MG{o{5Qssrt~yUdNp~lDC@t;vuQ% z)Q4Hd`)}CK8|Tb-wHuai9sZ(;l2S$$!NXu9!Ut;DpJzb9ov+0zs0(=Kj~+R&#PWBFYjv2 zO3-|l!TOp>a638sG?2mnckxHzobVSo2&!Wtq+a8$x77}w!c}$88D#`&8S2kb{?>>z zDP@YZ#Ga6cG#QLvLne`#@3URT*~|sKbQ;kDpjHm$b$I?9B!o{b$^m=_JZScQciN2t zTjQn0?<)P@i0L}lMtP0&Rqm4IAcC3PT8G1ok|M`I`@&@%O=71<@8mxxe>N7;pIN5{ zqLf!5#+R}W>}`OIMo^hq6CxjL)^b^M9hkxSrdV3J901BQ&D5wMLi!n5P1iAiFhQ&%l=3g_E-Iw?&QqCTaw`sKpwn+}?Yj%} z1_A1AoUtLCaAWb9{*b1Dzn_UJxMf1VJ_IkSuxCqA(d*}F2}WrV5Yty1aqHTiRGyt4 z_~okcC9Ug6nNG22y|PAG{-CS*A9|+h5{TvXbCnH_2RWraA&Ku=?S5I8X?r5+>Gjma zC^izd2|#u-;x>*bf3o5|A{bf5hK}40!~jfcgGa&E@f8``5L`tiw0#0>Hak_3YA!b-rifaFB1T?TTEo4m@L!zs2HYKu36MtJGCP zg>EiM(K`Y8SWs6&N7DP{HPsFn2Mnf8cdNrV6!TiWfLgS_&0W>$iloN3HxqQ<0(2Z zDL{Ghg?IlypV^`mWr586XRe7`cN_o{jIQK9l2xcM8;!{Wews$j;DG||vbBozCsLw_ zvvc;Ib@gq6+-ybi=LN>g#%{}LfNU-ehsr}@|L#vSUlk~KlEZ^uRGZ2p1Vm@vFx8hlWE?`qjcQ-;0nnotm@S-TiYdQO|m`(V&Q9?4t^g;F~KZ8_H&+DFO?DPUl& z3zU$o`28ROoP{bu-xq)S7$K-%Q<5j0ua|cq`)j1jpt<~X{`dP1_3N0uLC!li4@BW;u8iEO55QIT<7-7g5tXKWxBi`FBBZF&QT@3g0VFhyjV zQ%g*OS%d`R*FwsEcb6w@o0{%ubXUZpZ+QnZHh_-=L*fGQ;?%F>VL>nhYFDv)K!+BL z|J(foD`HxwCxuhKD8YK`qJY?XgIPJ&3*6eMZF$c>u&}QFrUaoYvN{K;{<}R_heKTN z!KPaeM#!9Vyp`MhmHPJQ3_HK=U6y$Eh-yda1=wu^QylgX9jB1?cfgdVgDavzSczco z05&&2C72#P4igsS_yuz#kSumeI=MD>f;`OC;x^UY!TCs7uV}=2c>kg?TOK4Z4ukhg zkql7|wYGZO>hGGev?*>hz{!3a#2B4k_h>g=h4kLN1m&AkSPEU=5>~1=d)x-xk9GIh z_q3E~W0F`evQ7lHCSuP`kxfL{Jr?0137TL~g);m4}=F3V*eqn{_zKO7^^UHy5xMKQ|Nav8e7%yblq~x>Ch6{VH8} zQw#%ilCtG_6)AamU-@+)TN%>X^A;JVT4^3L)k((yD6pZOU#5<>`+j!g#7AUT?u1g2 zL~e7fB9c1oF5_cpi09MR6*A}5uUwCuqC9JLs9dWFrdaOzBO+1|>P+NYS2wi(+9%M- z6H)Vl6Hn^7PAG3P@IO=B`=7&qR%sP@E5n_>|7&!i8!`- z2(5%w`|S}PaY6gj7~kQdaH?Nc%JH{47*uCC15Y2 zu$!&pjL^YzMnu&>|DJ6mpalUgMp_PuFT7%$Q>qdDhJD;RPDa>Eexy@M%f^Kb@91do z-%YoSjpRa{?Utinas3?yG}FU$aZJARBN5h2ZWd;@%!nYfR68#ikmFacL)a6~+(i@Y zGF{pq;mZ6Af05iEo5O9Q<68x5)7z=v-iE{)RJPZ?96Mk=DO?Zf=al^PZF;gDxor-# zLTHkvwO1z~IO_ssVtyI%QM1T{)`6~d;<*TUIKJIH&S-hnKRhDb9^ZZ+jU z&fkL>vqDEW{^)2JmX_s{htvCyU7O(-p%@y=v%WSd@S@2e{YAIf5w8~wES?bZNi*Xz zsOdkE^R6j?s#sAavQq5#{1L)WP0zp}VZXYbz zNz~>lvfMBAMx8jdi$m}4DSDrv``k3o_(VeJpK@$O;zPlZ+yfUN1&VUaARMKr^?L>^`W%NiMJUI^g`Ry||i}@ASv43(Ul( z$J9MPXpe^K6v7w@I_!E2s?%GE&uA{fkj&ScCTt(M^j0mcNLN=2hjRxxy+nuV#>sbZ zNVL=D4_|s|x=%w{oQCBSX#SpR>@U^Xl?m+`lGcJ4MAoMPO7kN4bM6jeU8PmB@y5FM zoP5j|o?h>)oR?eK1!3tachP)}vWl0~8C?KM24$d)S&KgvHr4`}s#lGT+^GgeXG?z0 zGC5i${NbR~4hjEi7aJ)vX2!C4>ot?Sjdms5(;ug!{^Zp&z+%s0y`=e0U-Qj#6Ljsp zB~4_}h>brOB~OxWSCq2A+3*1?BeMPRVsRpwzR>!ad}iAT!SFGgXV%XKjUa6k8%-{n_}5V}bTG|9c@2D1G9W@DI|+Pws{%ocM<4)AgYf|3T4TSi8}ByN zLSk5EpCL$C*>qg2wu2qI%&RcXqj?ufK^yV zrN;v|VQ?Fj^*I;16ms%z+Ek%OuBTf?o8}BT z{nQihC^4fT#eVLup|H2H?tGo+RokcCwcGb2zsrUi)&+~Y z>QYwTCE=^c+^-b+QaCIe2TOs9;Hq(eM^P*EY=rsQSyj^6{1qZ2+!Vs8^0&?L!}x0N zu*XgUhzqi%AW$?swJYu^XE(+NgqDHAChA5K5%c*OcUf3tS(!g z{Kfv1VIaowwUl^WOtX}<^ZEu8D<%?@)Pth+B&b$b((Rki2@0GOlli>*dE3NCIJ&h) zTXdE*iHBFAE`RXbbdBYuTSBTU%K!d;U9n|pp}L!bcb(xYH&NyW6-!ds89H1TpL;_O zRJc3~eTCb_EUJu+`|p$Shp=IpH>2_;EdFPU%FN4Oy!VKwBFsV{xKqk(xzZYRnx_^$8QO0K%x zW*8rQ{F__VIRlO10|iMFD7<{4{?nm?p}p2On6oKTAlLEc256^ zEZUEbcQ@rbd-WX_6`Pbe{sM(V1ylUw>#TEw@rL_51|s_E|A^-8d= zLq7uoPFSvrk76!kN^fnx+G(OTkdkg0x4qc=I7%hV=zMivAnUYfXDvvqJ3p$0YUROV z93Czs28mN=YyKz~HvX{kjGpG`9!fBx zp1>$fbw` z{aYj}mRx$fTE1FP6+pXbLbo=QtwrnM1rYgb!fwXF*Gs8xb~ z9X~GKR*@B0McR!MD5oTCeDrp8s0nd)D|-v(9KFKZ6QVwmLf8VH0+0CelANVdcAvOh z{MJ2&9oe&$x^238DfD*$A8!bxy}*1TQk^$61Q;Y>U7)TX;*FZ%nr)VcV<@$^E`iHIjOgUM#&)}pFLO@ess^G6I5`L^k- zi6$MR*Y@{;5H5lHxlwQE;@i_dtlUT};r-#qc}A2evSb2>yM2!v!Kaj$S0kj8BoMrq zwHENwL2a8*;#q7jjCOQnP=Cs>zGBygj@O6T#_S}Q=e5gY?y-#R{3^9r+<)=jpdVV! zH7k+M@oie+KDK%9Kv8p{%J`WsUh1~3frv8>w{ODFAN7gCYQ}t3f$kD^>@b(gL#(Yc z$lk-k;;%kz;d4Epx(P3QK;N_=HjGRmxU5ZZ!95% zwDVmL+*$3V>zn|PIuhtL8lBIED(kkl)U(;4!WHl>D9|^{4_lvr2JsEmy1s`>`0d7f zKo4jrZ)(?BC;gapiZLNwe>0>mMxya-=j?odWM^rLSl6w~qg2mD^=psrzP*kd#=g*F zFkauU>GbMMmPK6u)`R8IzEbRv_DM-=s!`v`<2FKzH1l3fz?4a`-!Fo|!R#TQFcS$* zr5@**F;1snbI7~TV~`Fk@1Ql*W|$T?$v3;+V0^>caFVHVQ#M_Ao5ADuiKXb6dvNkb zg2!lgu5p<)wcQR}aQmy{`0~6-6HM;-d?AT>_CKr5CUuZ_Hb}uXAS@xobi?h{I?s!x zL{dso(CU$EM%7Q%+M$!*pxm(YWUaTb%(+3=J1=tq_vm!nm&gd!akbjI_x530@(nA~ z%(U}*)S!RpE{l~(rc(jF5k|lJ?Gfcp%C3R~+O#ni9Ch6t2SJAGQ+_4Lp~5##HXQfE z_XH$x-!d<%HUq2w3J=7=oqxWZMa?x(FgH>kygpkdzY$YNLyc02N8JzOeU%uCK9~;-ZoEYljI6- zz}d8hHTZeopqLeWOZRc}7FpUFb~9#J>RCVY$!hILC`Hmz*4@CLc^`q%L^^>g)ow&= z-aCG6|2FjdES*>zs9}JHKXeFS?s#W-xB@rQS-H}0F}PXGhkm#c4RH3-f+!5xbX~l# zIIR3`lMjFXo1UK9s#WDH-7W@h-yiD;GrGkOB>j<_N6>IBRP?!Fp za>DEA_PoLf>ow6mY3tvVcVYUD$8`h8-$K$)?G{#<{o*IhjI-hvqtxO<)`S=b$44ct zmOF=2QX!bL-*iErd=|p#Q96!}PhCCdQPULy-V4cnUtY78I=syvh2#*!zzt76~ zU^tK*6~y}98FJdtUNoyOi95mJMt56FS~`*C<&iWLHW*HNHNV;n)StMHk8M#7`)FD5 zg7I5Xg*|ff0dT{rcXSw3ZnM$|44-+>DsNMU=XcQ3_Z(F>NNIo@zkT&FnEf1^FS_14 z;YuWdxh#+kZHMKstuNG5i&Gf*Pd%xNy?<>BQ2r!1_!4nHX9zcq2%TP2Nz2z&6}3bp zd{K>Y!4+>-MLm1}a2d;!_$4AwX1JOyX4y4u3`i#i_Xg2ixf*qcT_jIAVLAtcJib5q z{mLXq-XT!NFez|Kr4Ri8sI&KOhD)MVen{?vcGznbBy4-A_>q9#AMsJ@<;?f31;CO> zKsg@MYRPM%wxx=UkucC4zvEDj;PnSP6lki2Z;~I5iRc`TRrhc`ZZ3S6^=$HHC1%*} z;1`f%7392{e$0DRV0guZEe9FstnY#sdwL-|hd7 z)E~0*l0VY3E)C}q*ROQ5;ptBzx$MW?+q@Uw-M7c`Pp5%xV03xl>`s4^!g5%oLFzN- zt;xg@B(}5~%HIp6b-|3srsm@QZ=oTNi9gJZ8FM2tkbM>%Mk%5diJy3+QsL)%G_RL9;quYGHj3>$5(9UJ z|L=|f1?_Jos#^YSRpMpn@gH7sVgC0v$QIDTph-QVjHxuQ&x*^whipu$6K1Bw`9nHP zxDrkV0TY4Yi-(a3m^`}I!bgJj5)MG5>Vg1zb7)b|HaIqr7JidgTH z_vJgq^);Vp%$@&@YOXGvH-oT;7%<54&P{e2k?Oxifi<+>P4M&8tZ_C+xGLc|-kc-X z&UQLOJ7-eQ@lYkirI85B{V%+P2guT`fj@TjRPv_=iu#Y6J^T8AEy~4?H4sNR?*RBn z5mrC7b}KM>adGaX!$Yq>oX7w22UciPmV?J_*~}EuGNGNpj3@V{6z}IuLOWh5+)dnI zN5BOKw;<{LVTDcsKmFTONC&}}1pm2-jRG7SAxG((kN!TO78e{z_ew)UeYnu9;JHxmt?a2QuNZ*1&kB877?q~f1s$f|M8EJz2_wnk+Nmh*(oHn>`ll#BhFssB;kwfT}GUlJ?@OlN>(z$;V9c3 z+57iV{qFC3eBPhW`~7;qp3m3o{eC@P{fQ5MMR^KLapyF&@l6MiqC1nC{A!Hpo};r? zd`m(s+IFU7O{SuVtG9Zp^vI|$cqr2f9t5YG0bo5#!q>!`zu394BnX zO;0-^-xL~_r#P_=J6no0m#wU9dJlDuy5m$o&-{F?rIWM`7JpwC+FE}?Mcp;V%J+uh z<>kvOdmJNzrFwdfffi}dsadh61H1FfwJQx_*Eubj<~(EN!7xUxAUuR!uTk*p&a1|r zASa^QCrPl{a{aH}`Ga+iGmNU^U2&+8=qTWFvw%NE-Hk_kx#&^DYR|p@;}Sci>ONmXexlPlD zuh9xTD!;*$W~f*#C}mVSf3VY9m*3`VzE{UTXZTjhVbs*(%9_j7Xew*o#y96C&*%`k zLJ#Y8II9>}65p-;cyC|YMY?h?MX%#gVN1Sk^KFRUt3q9MY@>nU>XY#H&IQ_tgioL3 ztiq}>wsyK^nTIGfA^2M5w5$lt#AmVKUXwgfGpcMx1J~yhaHq1^Q6PCKzpJ1$$^)wd-US4ywmhPir-2yMxfCmL2TtCsyaf{MIPi`fHbXA&3 zqzElO-lSV&hipx`&T*a`0PDdqMPHr=pGmWR4xM-eB_reOf1(Gfc&@qV_7%@{&wJb+ zdEg84ax-{WtA0oC{NfQzYiDf}+M4Z4#m2f13iQ-0P3UCC*Gk$y`|hJt5RQrNn=3UL zIYj^HP2So|;k|bfO7dy((#*LG>#ZssDjxwDC52A|8?=vDb$Y?3D-YMrIKpG={7h}{ zzjorFv*uN>vdc^e)R1kAkSYbMQhlvv{lT}du@VHVzR!1+qw zmH7h#EE4A`lH|`-E?*Z$q#ElYE5^s=?kLIQ5ck1@F4&1Bp~b)Y4S4_Qdpwh-kYFPR z-6h!kVn!%aU*cpH7xqt4cXuDRFdux=LOL3g@Z{b$$#`rr1nzz)r`kjeFEv}@cR68s9*!^5^_oeuahxM!2E-T{e1IrF^ zmSG-I0vjE9-x+mM(i6{XmCkjxjK;+Rhi>YNw5**K)Q3NM`-9(T`04dE+6YNKxr}nb z$jEkDFv$*Hy>+lml2M&qE`EcWOd0ld5qDk_P(q~Nw=+(@&Vie$K^EK#Z=(nYOR0Vx z<|WM9OMwNL;cYiM6)*aOYMQGwRW}tqqHl2)H`Z;H)p2e*xqq`YPMK=qI>y@el>&eUtRL9LY ze10UcZdZ~eQAQ*u8Mke$I2tII(Cbr1M7%oskQ3x`dt$<|bgaD3d>SiFFXn!fl%*g! zf`$j5?M0wJUD$tksIX5s+tz)lNQQXrEw=2^E01N|UKyvxXAkLS>Y;B3Au1s-c6WmR zP2KFns(>2iA-UtG5t+fWs@?o|>#Bq5ZL}1chTm`xgcx=)I9APYcI?20q(qoH*x3#k zgyGi>KIkV5TW?OVeQ!+LX)J=^X$#;Ghmy*x;&px~v8V^(x_;I-6f z+Q`qHRr#*N4&7&EXUKq&eYk^MA^4y=WsF5BT^4~|%tFMvr)FrkjddH_PMvMAsWkNS#!9x7TdO_l)9@}@U#2~H~x(+6t zPv3;>lPsmPN&Qr~!SZw5?6yJGTsSJxdGzTxkKtj?R)WRJeSF|)Ly;fR;5s4bWHl!? zL@_lbZN<+sC0J}WkTbgLr6R9e=xKAl9=Zwt*|x$dLyZ zCMMhGG>hMq=jkOF^JJVIIx$nQ*VTSxK=Uj_(|CH`lvWap48KsdXPz!N=O(xGVfuEd z=ukw|;a=(VGp{PFA>*2#>=+EooyNfvu;bc zk!)*=vNwjjc-1`7ei8Db;LF|-p~?PW&e)H;9Oh%PIdQv?TYfe=lkm}zyJvM_%+5u& zB~h}FYddaGeX-3=h{1K;SR#W5()p)54*-$$J1S%?H6z+&)$1_6QKGVuKk|7Z$K?<4@8Oz90(#d=pvUff-2c`|J%p23zSA1Baqm^gKIFuADH_nx;Y-sn zy~uDhR`kx-e*dFW7Rc@5 z$RvG zH=_A)0m)!yEl%v*8;>Eh$hu@oZ;OD|rtc?)`hDEMeW)WMOd6OMXHXLrWLrUo5zx7{ zbd|@FgJ$&sE_@?RSPkF(zKM<3DV~D=r6LCz&AA@~6tn!bigNAkubVcNT&_7v)9+l7 z|JV!aXRJEmcdqNPIx+ZcVByyoMg?&%VJ*@;ydk&(7^MEFD!b={((xUmgJoSxwUA32 zGvJj-+cRW&m||yl)WBEM=Y3P?(G_#ML>rdn0UmV|lX%aT&ZTet3KOXp42J#FJ9fN0 zvp<9qjz6f|NW8IiyY;x1p5N)@dHZb1&SSb#R1SSOkp%1g)GPI@6iq?_>fhq{nISgv zj9_aUAg6r0EvmL2<$TZG-mnC;uv}j~2)6oX(gE8)(ie-tZ*RKth%tv(2es30e>Ig za@tFZKC%ebHd%yQPTcknEq7Rzzjbjt&MmspllRtYB0I&|^$Skw96BOPHde}Ne2&H% zbtE|N8aH_<*6pD|^7GC$0L0Lk-``JD&wXsodQaMArhpzQMjZuRWbY~{Agd}KNAZ_0 zc$kH54DHHnS%eb3x6tA`{heIUQKbmE;O1|B+}qL}3>H?A1-=cHiqm)z(SYJ9KjN^W z?fkKMinhQZwSw(hcdDTYlmXb9HPMsXVO9$o9isQ!CS{L_1&9X=O`E&<(%Ib7syKQeKJE9%$ zRn-Y?2o3rsN*WZkxH#ajNwYmPb8JEQ9&nnjapxx9w!c6ku6|^Rs?0und?JH{+Fyy;2oJL31nvzQ&z?r)vVMI~x z7g~Y9I9=n*q8O5XX8327ElbAD_1x{{rs!Tn@7S2wvw~J-q@A(ksaIM1S=a>z*Q0bA z5f4eP+gL6vWgAdBYgiTqa?ZB3AD-99OUp=gF{D!=S78Z6L z5IY?#wx$i<$u)#B^fyH{*td>s&tOjml#=~h_QQqC%7;%GAXgHxW(RfPwN%ZSCV``t z6Bo-x3U%JaEw6G4-}xRsoT%F!;k}^UR#b!wIhtJQ_)3iJg}{2y0Rdbz7J5c&We@p099Z4Q%BtR=Micsswdu^!+a$R6{-wE6 z;$N&KB|QlAr>(Eh#+N^wxdJpqdq=plliymD5t!d2O2-)JiMkX^WYf$M(>fvA{3EF8 z61*Nbz$Z*}IN&Jtb0dQLL19|E>`eD*6#K#{3#`y(Q+jR02;Hl6pt*X=1+h%Z&>Wgj zqDP>TzS$mKIp1VU0ai+o-F935g)<07Qnq z^(tc#H@8;lLvayVdJ9y%Up~|Jnbhour90oCN=K~diZ6faQ;9S-oYW}1s>Q^H-<&4@15x5++bSlgrz^#LXel{w zrE>Zqo1Q$i508c`dW%Q$^hML(&|3cIaCC<@z^iY%0kZ}LfI|&#Nds^1;|ha4N1038 zl?X)Y{Lyw1_kRC$i!Qa_+eE~ZggemH0XA1XTKiw0b8T4F+VSN-HsTFLn&%=g9BiwL zZj65h5AifVTJ9B$+#xcTPL>?A7Z9+syTp*EA$(0}AiFnB|L_z~NPFWAvT1I!^$d$< z@%g*kicExiO$kfsV^V7)N2vz_x=V({rgPtK$*8y?jeQ23Ze&WAlQ2f!zx`?LLOV#G zZpy=oBfBpC9gp5RGwc3lU;3ypu2kg7ru*aTDZ4|*DWN8eR6SFeh)=(N*xQj!&mA_Z zT}z?A04OVEB=wf&j3MzN=m1UV;-1vrtO~My3>Dks?3z|=0dTj+F&BE|8XID82v3e} zoH+14Hzif9nZZaQTawc}F?FM)JB1YU2d)6ucUb59zHo#4GtG!(KB+L5Jj!#n4s3_(lO5%5q|4fgH9)Jvhi=5_^v-o6 zQbP;dU>;tHMrZ(-x;fl`@Jp-5pA{WWKquU*;Q&{%|L0nX62@R`d(L`Lo%jj|HS}>M zy*9*D$`i5I{GXgalGIB@E@C!X?QT_{K5B%CmQci1P+Yj+k1GU7?*(%X)ehxnUcRw9 zF)h;+RN{${ID8Bz+_$sA2-61H-@Hg{0RXNS*E3-Eq~iYjRj7N?3Liz4;}pptTruO1 zKT#`;wEKHJTW`v)JRc~Jwaqim)`(_inF2vbp_;Q&IS;J>%Z+-ag75e9%arRcGpv$m z(G-Ff;~C49NseA!WlB$_JTwG=x77>FMJ&O`kLZH-Rp_w!NA8N?BTJ>V z|9T&>NSrD1Z*)E>CuxvAdF#=v24(ba4sNmC6%gRBX%y_Kk*+F4RlpsCve;gOE6a;& zDYC0Fvmy*34XiUWF9cTS=Ch)yb+fv^4Hw#pl$2||Yh`aWk;+J8SvM78z<-34-Ac@f zMF8RayhR)D^RAXE%ejQ%^p)i=XC)4b7|=2UATb0W4u=fYpX%UT6pLF0#vnuFibp3R znx9Zp-^}cJ5sqpU_~sC14z6#i&E!JRJ(FAP7AQxNy+(HrrtKkw@iXi8SIt4QM?WJk z8W91qxeHHE4%#zu6=as-gkKq$G&L z_B?y$=b#xcBouFIp0vLv?CDDcP`r+*xbEt5z=~>g>WY69xMkFGmzlE1*?FH8?a8sf za>4@8K-8U!#v@KmK~}sGS3?Lw5GWZm5sN3{K5f*9n*100Z*KkbJK};<+ytq-(J#N| zz4<+J2T@LUtJs-@XoCfY9hm7X8m0!ELO9=3L4XkY_cQ*;qoaa&0|N)A-nByxR~=`^ z`#00m3mV5r(ezv?vO`3z72h`MKt<*&Qy1xy*TP;i5Tc=(lJe|Eap4tY?dBa7{tB0M z{%}m7RjyJ*D`symKfW)`D9jFSFoGH#G%VX^e1x>Uh7y+>YG`tb&jA^8wl}$i3L#xK zXb>rq>3|E^s_xb7MB+yVWdjLZncBeH3oh(t)t=XAL?;$;ZX=>(fl@RfKF>ixP0%cX z!S^D0$c7AV3OL#4nz<$g4RIBBU5%-W40TE|%q%1TA_HAi{HbZxV5in#eM1}s=#riv zMoMdD6I1WLW1FUQ0p$q96Unv;%2!Z9gp&^c(udr?Sq}h!jmRq`-WRnG!+k0P-5Ly* z?j*Umuiyaf{Jgf7ulG5V`+NlAML7>+K{E=!ouiz-l4+B~lD-}PQ@CLW zn;M}Cr!O&+ghMc~e<#RotJ=8O6i@YPl4rBDrjsU|Pevh70?g0|Brs)XDzuEQSQFa- z5G~^dqz(Q3i9S{P9ml0r{KU7^uKW|ps^+x_6vwe6=mIHX5G@hZns~n7`}_Lr{u>33s8n)1AnwR9QcUSpL;VUr@yTcg z$Qz>r`wCDv%pNVpDYeK}Ra&8AiGV>(WEl13(hoI>FM32t154umhDQKIgoB2gb3f54 zNV%kKW7%P_u<21;WTX>`H5U5vnTyqBs)(10G5};^x+SgmfCu)2+Ha@PyofYVetWQz zY%7-gXv?2nR^}OR90drLAv{mvj`4Noy=WtocqiAM$R~7%hW~o6)mMOkij)^u``)=g=iLcbH`u3rZ!U4Y{XTJHm z2WAo|fe;f<=VW86ilzyi8|GrE?8YwhA3_FLmZVzNKa_*w1&CZ`;=qG7w*7cBkFnzffr4RD08nw8vf%f(@aWS|tSAes zxmqhuHD`9-auoczQ8LpkZkd7GIs)$f*-VMZ*bP8=fymtc#&AYpDRubY* ztD}SX)1`Y~p{Aup(jyYkR)v>$R}}X)avip4fYzK(c{j*M%eW~(!+y3HrZ}q1`zIy= zW)F!o?B3HC9iqW&@+oD>tOWgf+!u&_r`Z+1w=p4n@%Oyh%Ut@D1t zvc0*%$mHo6KXiaHpG|M{PcBCSA-QAXTd!tPl7?=HK}Nm5&By%Rwjq}+!*C}jcrZ@} zPR%vQ>2u>7@v35Ee_0Hm3~=`Terct|60~*ii@!f9 zhUoQYYj#yD?0jRL1$-~EsA%*)-|_0wPd?VJdg;TO_wE70(T;j6)8AI_<@0*&?F@hT zpg+DEjz08#tGNC~{A?+Xd)H1z=IhuE0N8MqI##Ig=Cem7HP^B9r z@9rU2z`n4sbhcLDGYVf*m5`7V8$-n4-6ATi=sQP_j>-;loDLucX^#%(*3JSY>;Oa~ z&>3_cUis?`zz~!+*z2Bs5%%5$Hg?L)V%U=M!yRPg)iKh~2B?K#&L~ZglZM9qK(Q{@ z;{&yklrY{Gqg@XU_l7L+GbY&e-I}Jgm;o~%?9oXk_iCBIuw+p8Z@L9S|AAH0?)2DB z%UJPP{&Lywv={dIYcD^?-TtxiL;0%KO~v<-ubz#LY0n}h0~WcJWX=kR0OjCJIoltw z+V-(GO2aIcpB^M(-X+k_{`my@|}{^bi>i$v@jGP#4lc-;BEQF%?aIYYm$ z(>OuR=Lwt}R&zah7Fc8`?C>;Da)1*6XxLmXn^n}>)*ZZDGs1i9H9ny}G-Us`6~)7< z=PH`3hCzxQ^oKbEmTTI516m*@Q`*ojEgd?%4EmtF6I;4c1!gjWOp9!rTOa7GKpB|x zoeXqF_A`s@kYVt*MH0glIe@n%KUaz={U-I$AP9o!2fXD|k6CLjqH#5#G+4u+v%~%_ zIG}-g>~Nu7p)~K(h~uC-NeGUKDwVB2Xtt@6Ct>-;U?I3{L`4(o=1oh1)~;sn>*G|o`B&4_~{?Pq@~fS zddqz|7)qil9LDt5w*fv%F*bITd-~K)P7cT+io+Lx8SF zlulnSW)W=~OGGJb-2xzd#(hXnf9bVz-}*tFDdyfwMK%Bkk;;_3F>#BTjC-P~G-Mnb zyZ(5L@HZs`0HGT%t!Q6CL1sjTc}hdFl<=I_ir9kIzvc^Ehh#>BZ^?!T0Gh!@SyNOm zO%mJxZ3fF6IS!gdkDx2gf)P8$CYsq`cp?wnaaARm>Fe8S-NW6XWZWkPLKy$?3IGw- z4=KYF>Qr%=nWF(#X84-B;xw~Vl|?stA5tnbApHkT1p+_-^$ZS(;~oh z>DC*Zx7IQ^Wh)?Zk>?D6>7h^64a)-?+A~e+v*6-&QvI71h~{DUeBQ$ip>QY?kxq(f z?S3tgP)cP{p1)N>hR%KXXJ#q>=Jml?Na*l-p0}HuqDlQ#PS;UK6>j=glh03XD6Nes zcrDU}iUEK!`M=cz@>ww**2w#YCK^uSYo!b4Xid^N`s_BA%6~GHFp)-a{`c0zf13~} zo0s!g)1v`V1q%HNA#+u+cI~J4_tGsZV*+OeX#W3mL+CB-K!o%7&P)aKod3@v06Q5^fC^1jyQATTSR{c{Qc&6T6I2VZ`a zq~0(cbsL`)^7prXBJq}pQ8)iQwX}_iV2V)-J2%5t!~feHgqP!#%SmY2TfDi+$vacR zSsHX-V3#k>=r3UUrl1&(8`kYpOz07BVF$NW>v3@0T3Xy|4;a_E7ty?{qgJMB8TLO= C+i<@C literal 0 HcmV?d00001 diff --git a/tests/configs/test1.conf b/tests/configs/default.conf similarity index 97% rename from tests/configs/test1.conf rename to tests/configs/default.conf index 31516c0..94b887e 100644 --- a/tests/configs/test1.conf +++ b/tests/configs/default.conf @@ -13,8 +13,6 @@ $font = Monospace general { hide_cursor = false - # bo doesn't work with qemu graphics - screencopy_mode = 1 } # uncomment to enable fingerprint authentication diff --git a/tests/configs/images.conf b/tests/configs/images.conf new file mode 100644 index 0000000..c88e9b1 --- /dev/null +++ b/tests/configs/images.conf @@ -0,0 +1,64 @@ +background { + monitor= + path=/etc/hyprlock/assets/background.png +} + +image { + monitor= + path=/etc/hyprlock/assets/avatar.png + size=150 + position=0, 50 + halign=center + valign=center + border_size=3 + shadow_passes=1 + shadow_size=5 + shadow_boost=0.5 +} + +general { + hide_cursor=true +} + +input-field { + monitor= + size=50, 50 + capslock_color=rgb(CB7459) + dots_rounding=0 + dots_size=0.35 + dots_spacing=0.1 + dots_text_format=* + fade_on_empty=true + font_color=rgb(8F8F8F) + font_family=Noto Sans + inner_color=rgba(00000000) + outer_color=rgba(FFF7EDa0) + outline_thickness=4 + position=0, -5% + rounding=-1 + halign=center + valign=center +} + +label { + monitor= + color=rgb(FFF7ED) + font_family=Noto Sans + font_size=40 + position=0, 10% + text=$TIME $FAIL + halign=center + valign=center +} + +label { + monitor= + color=rgba(BEBEBEA0) + font_family=Noto Sans + font_size=24 + position=0, 15% + text=cmd[update:10000] date '+%A %d %B %Y' + halign=center + valign=center +} + diff --git a/tests/configs/lots_of_label_updates.conf b/tests/configs/lots_of_label_updates.conf new file mode 100644 index 0000000..6d23898 --- /dev/null +++ b/tests/configs/lots_of_label_updates.conf @@ -0,0 +1,199 @@ +background { + monitor= + blur_passes=2 + blur_size=10 + path=screenshot +} + +general { + hide_cursor=true +} + +input-field { + monitor= + size=50, 50 + capslock_color=rgb(CB7459) + dots_rounding=0 + dots_size=0.35 + dots_spacing=0.1 + dots_text_format=* + fade_on_empty=false + font_color=rgb(8F8F8F) + font_family=Noto Sans + inner_color=rgba(00000000) + outer_color=rgba(FFF7EDa0) + outline_thickness=4 + placeholder_text=$PROMPT + fail_text=$FAIL ($ATTEMPTS) + position=0, -5% + rounding=-1 + halign=center + valign=center +} + +label { + monitor= + color=rgb(FFF7ED) + font_family=Noto Sans + font_size=40 + position=0, 10% + text=$TIME $FAIL + halign=center + valign=center +} + +label { + monitor= + color=rgba(BEBEBEA0) + font_family=Noto Sans + font_size=24 + position=0, 15% + text=cmd[update:10000] date '+%A %d %B %Y' + halign=center + valign=center +} + +label { + text = cmd[update:200] date +'%H:%M:%S' + color = rgba(129, 162, 190, 1.0) + font_size = 35 + font_family = Noto Sans + + position = 150, 0 + halign = left + valign = center +} + +label { + text = cmd[update:200] date +'%H:%M:%S' + color = rgba(129, 162, 190, 1.0) + font_size = 35 + font_family = Noto Sans + + position = 150, 50 + halign = left + valign = center +} + +label { + text = cmd[update:200] date +'%H:%M:%S' + color = rgba(129, 162, 190, 1.0) + font_size = 35 + font_family = Noto Sans + + position = 150, 100 + halign = left + valign = center +} + +label { + text = cmd[update:200] date +'%H:%M:%S' + color = rgba(129, 162, 190, 1.0) + font_size = 35 + font_family = Noto Sans + + position = 150, 150 + halign = left + valign = center +} + +label { + text = cmd[update:200] date +'%H:%M:%S' + color = rgba(129, 162, 190, 1.0) + font_size = 35 + font_family = Noto Sans + + position = 150, 200 + halign = left + valign = center +} + +label { + text = cmd[update:200] date +'%H:%M:%S' + color = rgba(129, 162, 190, 1.0) + font_size = 35 + font_family = Noto Sans + + position = 150, 250 + halign = left + valign = center +} + +label { + text = cmd[update:200] date +'%H:%M:%S' + color = rgba(129, 162, 190, 1.0) + font_size = 35 + font_family = Noto Sans + + position = 150, 300 + halign = left + valign = center +} + +label { + text = cmd[update:200] date +'%H:%M:%S' + color = rgba(129, 162, 190, 1.0) + font_size = 35 + font_family = Noto Sans + + position = 150, 350 + halign = left + valign = center +} + +label { + text = cmd[update:200] date +'%H:%M:%S' + color = rgba(129, 162, 190, 1.0) + font_size = 35 + font_family = Noto Sans + + position = 150, 400 + halign = left + valign = center +} + +label { + text = cmd[update:200] date +'%H:%M:%S' + color = rgba(129, 162, 190, 1.0) + font_size = 35 + font_family = Noto Sans + + position = 150, 450 + halign = left + valign = center +} + +label { + text = cmd[update:200] date +'%H:%M:%S' + color = rgba(129, 162, 190, 1.0) + font_size = 35 + font_family = Noto Sans + + position = 150, 500 + halign = left + valign = center +} + +label { + text = cmd[update:200] date +'%H:%M:%S' + color = rgba(129, 162, 190, 1.0) + font_size = 35 + font_family = Noto Sans + + position = 150, 550 + halign = left + valign = center +} + +label { + text = cmd[update:200] date +'%H:%M:%S' + color = rgba(129, 162, 190, 1.0) + font_size = 35 + font_family = Noto Sans + + position = 150, 600 + halign = left + valign = center +} + + diff --git a/tests/src/Log.hpp b/tests/src/Log.hpp deleted file mode 100644 index 0ebcda4..0000000 --- a/tests/src/Log.hpp +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once -#include -#include -#include - -namespace NLog { - template - //NOLINTNEXTLINE - void log(std::format_string fmt, Args&&... args) { - std::string logMsg = ""; - - logMsg += std::vformat(fmt.get(), std::make_format_args(args...)); - - std::println("{}", logMsg); - std::fflush(stdout); - } -} diff --git a/tests/src/harness.cpp b/tests/src/harness.cpp deleted file mode 100644 index 8a22dc2..0000000 --- a/tests/src/harness.cpp +++ /dev/null @@ -1,127 +0,0 @@ -#include "harness.hpp" - -#include -#include -#include -#include -#include -#include - -using namespace NTestSessionLock; -using namespace Hyprutils::Memory; -using namespace Hyprutils::OS; - -const char* NTestSessionLock::testResultString(eTestResult res) { - switch (res) { - case eTestResult::OK: return "OK"; break; - case eTestResult::BAD_ENVIRONMENT: return "BAD_ENVIRONMENT"; break; - case eTestResult::PREMATURE_UNLOCK: return "PREMATURE_UNLOCK"; break; - case eTestResult::LOCK_TIMEOUT: return "LOCK_TIMEOUT"; break; - case eTestResult::UNLOCK_TIMEOUT: return "UNLOCK_TIMEOUT"; break; - case eTestResult::BAD_EXITCODE: return "BAD_EXITCODE"; break; - case eTestResult::CRASH: return "CRASH"; break; - default: return "???"; - } -} - -eTestResult NTestSessionLock::run(const SSesssionLockTest& test) { - // Setup wayland stuff to recieve lock notifications via hyprland-lock-notify-v1 - auto wlDisplay = wl_display_connect(nullptr); - if (!wlDisplay) { - std::print(stderr, "Failed to connect to Wayland display\n"); - return eTestResult::BAD_ENVIRONMENT; - } - - auto state = makeShared(); - - auto wlRegistry = makeShared((wl_proxy*)wl_display_get_registry(wlDisplay)); - wlRegistry->setGlobal([state](CCWlRegistry* r, uint32_t name, const char* interface, uint32_t version) { - const std::string IFACE = interface; - - if (IFACE == hyprland_lock_notifier_v1_interface.name) - state->m_lockNotifier = - makeShared((wl_proxy*)wl_registry_bind((wl_registry*)r->resource(), name, &hyprland_lock_notifier_v1_interface, version)); - }); - - wl_display_roundtrip(wlDisplay); - - if (!state->m_lockNotifier) { - std::print(stderr, "Failed to bind to lock notifier\n"); - return eTestResult::BAD_ENVIRONMENT; - } - - state->m_lockNotification = makeShared(state->m_lockNotifier->sendGetLockNotification()); - state->m_lockNotification->setLocked([state](auto) { state->m_didLock = true; }); - state->m_lockNotification->setUnlocked([state](auto) { state->m_didUnlock = true; }); - - wl_display_flush(wlDisplay); - - // Start the client - CProcess client(test.m_clientPath, {"--config", test.m_configPath, "--verbose"}); - - const auto STARTTP = std::chrono::system_clock::now(); - if (!client.runAsync()) { - std::print(stderr, "Failed to start client process\n"); - return eTestResult::BAD_ENVIRONMENT; - } - - while (!state->m_didLock) { - if (wl_display_prepare_read(wlDisplay) == 0) { - wl_display_read_events(wlDisplay); - wl_display_dispatch_pending(wlDisplay); - } else { - wl_display_dispatch(wlDisplay); - } - - if (std::chrono::system_clock::now() - STARTTP > std::chrono::milliseconds(test.m_timeoutMs)) { - std::print(stderr, "Timeout waiting for the lock event\n"); - return eTestResult::LOCK_TIMEOUT; - } - - std::this_thread::sleep_for(std::chrono::milliseconds(10)); - } - - // Let it fade in - std::this_thread::sleep_for(std::chrono::milliseconds(500)); - - if (state->m_didUnlock) { - std::print(stderr, "Client unlocked before it was expected to\n"); - return eTestResult::PREMATURE_UNLOCK; - } - - if (test.m_unlockWithUSR1) { - CProcess unlockClient("/bin/sh", {"-c", "kill -USR1 " + std::to_string(client.pid())}); - if (!unlockClient.runSync()) { - std::print(stderr, "Failed to unlock client process\n"); - return eTestResult::BAD_ENVIRONMENT; - } - } else { - // This is used by the qemu driver to send the unlock password - std::ofstream lockedNotifyFile("/tmp/.session-locked"); - if (lockedNotifyFile.is_open()) - lockedNotifyFile << "locked!"; - lockedNotifyFile.close(); - } - - while (!state->m_didUnlock) { - if (wl_display_prepare_read(wlDisplay) == 0) { - wl_display_read_events(wlDisplay); - wl_display_dispatch_pending(wlDisplay); - } else { - wl_display_dispatch(wlDisplay); - } - - if (std::chrono::system_clock::now() - STARTTP > std::chrono::milliseconds(test.m_timeoutMs)) { - std::print(stderr, "Timeout waiting for the unlock event\n"); - return eTestResult::UNLOCK_TIMEOUT; - } - } - - int status = -1; - waitpid(client.pid(), &status, 0); - - if (status != 0) - return eTestResult::BAD_EXITCODE; - - return eTestResult::OK; -} diff --git a/tests/src/harness.hpp b/tests/src/harness.hpp deleted file mode 100644 index f28dba7..0000000 --- a/tests/src/harness.hpp +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once - -#include "wayland.hpp" -#include "hyprland-lock-notify-v1.hpp" - -#include -#include -#include - -#define SP Hyprutils::Memory::CSharedPointer - -namespace NTestSessionLock { - enum eTestResult : uint8_t { - OK, - BAD_ENVIRONMENT, - PREMATURE_UNLOCK, - LOCK_TIMEOUT, - UNLOCK_TIMEOUT, - BAD_EXITCODE, - CRASH, - }; - - struct SSesssionLockTest { - std::string m_clientPath = ""; - std::string m_configPath = ""; - - bool m_unlockWithUSR1 = false; - - uint32_t m_timeoutMs = 60000; // 1 minute - }; - - struct SSessionLockState { - SP m_lockNotifier = nullptr; - SP m_lockNotification = nullptr; - bool m_didLock = false; - bool m_didUnlock = false; - }; - - const char* testResultString(eTestResult res); - eTestResult run(const SSesssionLockTest& test); -}; diff --git a/tests/src/main.cpp b/tests/src/main.cpp deleted file mode 100644 index 5569ee4..0000000 --- a/tests/src/main.cpp +++ /dev/null @@ -1,109 +0,0 @@ -#include "harness.hpp" -#include "shared.hpp" -#include "Log.hpp" - -#include - -using namespace NTestSessionLock; - -static int runTest(const std::string& binaryPath, const std::string& configPath) { - int ret = 0; - NLog::log("Running lock test (clientPath={}, configPath={})...", binaryPath, configPath); - - SSesssionLockTest test = { - .m_clientPath = binaryPath, - .m_configPath = configPath, - .m_unlockWithUSR1 = false, - }; - - auto testResult = run(test); - EXPECT(testResultString(testResult), testResultString(eTestResult::OK)); - - return ret; -} - -static void help() { - NLog::log("usage: lock_tester [arg [...]].\n"); - NLog::log(R"(Arguments: - --help -h - Show this message again - --config FILE -c FILE - Specify config file to use - --binary FILE -b FILE - Specify Hyprland binary to use)"); -} - -int main(int argc, char** argv) { - std::string binaryPath = ""; - std::string configPath = ""; - - std::vector args{argv + 1, argv + argc}; - - for (auto it = args.begin(); it != args.end(); it++) { - if (*it == "--config" || *it == "-c") { - if (std::next(it) == args.end()) { - help(); - - return 1; - } - - configPath = *std::next(it); - - try { - configPath = std::filesystem::canonical(configPath); - - if (!std::filesystem::is_regular_file(configPath)) { - throw std::exception(); - } - } catch (...) { - std::println(stderr, "[ ERROR ] Config file '{}' doesn't exist!", configPath); - help(); - - return 1; - } - - it++; - - continue; - } else if (*it == "--binary" || *it == "-b") { - if (std::next(it) == args.end()) { - help(); - - return 1; - } - - binaryPath = *std::next(it); - - try { - binaryPath = std::filesystem::canonical(binaryPath); - - if (!std::filesystem::is_regular_file(binaryPath)) { - throw std::exception(); - } - } catch (...) { - std::println(stderr, "[ ERROR ] Binary '{}' doesn't exist!", binaryPath); - help(); - - return 1; - } - - it++; - - continue; - } else if (*it == "--help" || *it == "-h") { - help(); - - return 0; - } else { - std::println(stderr, "[ ERROR ] Unknown option '{}' !", *it); - help(); - - return 1; - } - } - - if (binaryPath.empty() || configPath.empty()) { - std::println(stderr, "[ ERROR ] Expected binary and config path!"); - help(); - - return 1; - } - return runTest(binaryPath, configPath); -} diff --git a/tests/src/shared.hpp b/tests/src/shared.hpp deleted file mode 100644 index 33109f8..0000000 --- a/tests/src/shared.hpp +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once -#include - -namespace Colors { - constexpr const char* RED = "\x1b[31m"; - constexpr const char* GREEN = "\x1b[32m"; - constexpr const char* YELLOW = "\x1b[33m"; - constexpr const char* BLUE = "\x1b[34m"; - constexpr const char* MAGENTA = "\x1b[35m"; - constexpr const char* CYAN = "\x1b[36m"; - constexpr const char* RESET = "\x1b[0m"; -}; - -#define EXPECT(expr, val) \ - if (const auto RESULT = expr; RESULT != (val)) { \ - std::cout << Colors::RED << "Failed: " << Colors::RESET << #expr << ", expected " << val << " but got " << RESULT << "\n"; \ - ret = 1; \ - } else { \ - std::cout << Colors::GREEN << "Passed " << Colors::RESET << #expr << ". Got " << val << "\n"; \ - } -#define EXPECT_VECTOR2D(expr, val) \ - do { \ - const auto& RESULT = expr; \ - const auto& EXPECTED = val; \ - if (!(std::abs(RESULT.x - EXPECTED.x) < 1e-6 && std::abs(RESULT.y - EXPECTED.y) < 1e-6)) { \ - std::cout << Colors::RED << "Failed: " << Colors::RESET << #expr << ", expected (" << EXPECTED.x << ", " << EXPECTED.y << ") but got (" << RESULT.x << ", " \ - << RESULT.y << ")\n"; \ - ret = 1; \ - } else { \ - std::cout << Colors::GREEN << "Passed " << Colors::RESET << #expr << ". Got (" << RESULT.x << ", " << RESULT.y << ")\n"; \ - } \ - } while (0) diff --git a/tests/waitForLock.cpp b/tests/waitForLock.cpp new file mode 100644 index 0000000..dab433b --- /dev/null +++ b/tests/waitForLock.cpp @@ -0,0 +1,70 @@ +// This program exits when the wayland session gets locked, or 10 seconds have passed. +// In case it is already locked, it shall return immediatly. +// It uses hyprland-lock-notify to accomplish that. +#include "hyprland-lock-notify-v1.hpp" +#include "wayland.hpp" + +#include +#include +#include +#include + +using namespace Hyprutils::Memory; + +#define SP CSharedPointer + +struct SSessionLockState { + SP m_lockNotifier = nullptr; + SP m_lockNotification = nullptr; + bool m_didLock = false; +}; + +int main(int argc, char** argv) { + auto wlDisplay = wl_display_connect(nullptr); + if (!wlDisplay) { + std::println(stderr, "Failed to connect to Wayland display"); + return -1; + } + + auto state = makeShared(); + + auto wlRegistry = makeShared((wl_proxy*)wl_display_get_registry(wlDisplay)); + wlRegistry->setGlobal([state](CCWlRegistry* r, uint32_t name, const char* interface, uint32_t version) { + const std::string IFACE = interface; + + if (IFACE == hyprland_lock_notifier_v1_interface.name) + state->m_lockNotifier = + makeShared((wl_proxy*)wl_registry_bind((wl_registry*)r->resource(), name, &hyprland_lock_notifier_v1_interface, version)); + }); + + wl_display_roundtrip(wlDisplay); + + if (!state->m_lockNotifier) { + std::print(stderr, "Failed to bind to lock notifier\n"); + return -1; + } + + state->m_lockNotification = makeShared(state->m_lockNotifier->sendGetLockNotification()); + state->m_lockNotification->setLocked([state](auto) { state->m_didLock = true; }); + + wl_display_flush(wlDisplay); + + const auto STARTTP = std::chrono::system_clock::now(); + while (!state->m_didLock) { + if (wl_display_prepare_read(wlDisplay) == 0) { + wl_display_read_events(wlDisplay); + wl_display_dispatch_pending(wlDisplay); + } else { + wl_display_dispatch(wlDisplay); + } + + if (std::chrono::system_clock::now() - STARTTP > std::chrono::seconds(10)) { + std::print(stderr, "Timeout waiting for the lock event\n"); + return -1; + } + + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + } + + return 0; +} From 19c49bfe021b0017bc0f14e72d3f10caee70fd6e Mon Sep 17 00:00:00 2001 From: Maximilian Seidler Date: Sat, 11 Oct 2025 10:21:04 +0200 Subject: [PATCH 04/12] separate logs and traces artifacts and wait for hyprland startup with some slack --- .github/workflows/nix-test.yml | 11 +++++++++-- nix/overlays.nix | 1 + nix/tests/default.nix | 16 +++++++++------- tests/hyprland.conf | 6 +++--- 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/.github/workflows/nix-test.yml b/.github/workflows/nix-test.yml index ec04374..df1e74f 100644 --- a/.github/workflows/nix-test.yml +++ b/.github/workflows/nix-test.yml @@ -51,9 +51,16 @@ jobs: - name: Check exit status run: grep 0 result/exit_status - - name: Upload artifacts + - name: Upload logs if: always() uses: actions/upload-artifact@v4 with: name: logs - path: result + path: result/logs + + - name: Upload traces + if: always() + uses: actions/upload-artifact@v4 + with: + name: traces + path: result/traces diff --git a/nix/overlays.nix b/nix/overlays.nix index cbbc245..e77aace 100644 --- a/nix/overlays.nix +++ b/nix/overlays.nix @@ -39,6 +39,7 @@ in { # Dependencies (final: prev: { hyprutils = prev.hyprutils.override {debug = true;}; + hyprgraphics = prev.hyprgraphics.override {debug = true;}; hyprlock-debug = prev.hyprlock.override {debug = true;}; hyprlock-test-meta = prev.callPackage ./test-meta.nix { stdenv = prev.gcc14Stdenv; diff --git a/nix/tests/default.nix b/nix/tests/default.nix index ce52780..4f33434 100644 --- a/nix/tests/default.nix +++ b/nix/tests/default.nix @@ -82,8 +82,10 @@ in { machine.wait_for_unit("multi-user.target") # Startup Hyprland as the test compositor for hyprlock print("Running Hyprland") - _, __ = machine.execute("systemd-run -q -u hyprland --uid $(id -u alice) -p RuntimeMaxSec=60 ${envAddToSystemdRun} --setenv PATH=$PATH ${pkgs.hyprland}/bin/Hyprland -c ${flake.hyprlock-test-meta}/share/hypr/hyprland.conf") - _, __ = machine.execute("sleep 5") + machine.execute("systemd-run -q -u hyprland --uid $(id -u alice) -p RuntimeMaxSec=60 ${envAddToSystemdRun} --setenv PATH=$PATH ${pkgs.hyprland}/bin/Hyprland -c ${flake.hyprlock-test-meta}/share/hypr/hyprland.conf") + machine.wait_for_file("/tmp/hyprland_exec_once_notification") + machine.execute("sleep 1") # slack just to be save + _, systeminfo = machine.execute("hyprctl --instance 0 systeminfo") print(systeminfo) @@ -94,7 +96,7 @@ in { hyprlock_cmd = f"hyprlock --config {str(hyprlock_config)} -v 2>&1 >{log_file_path}; echo $? > /tmp/exit_status" if ${APITRACE_RECORD_PY}: hyprlock_cmd = f"${lib.getExe' pkgs.apitrace "apitrace"} trace --output {log_file_path}.trace --api egl {hyprlock_cmd}" - _, __ = machine.execute(f"hyprctl --instance 0 dispatch exec '{hyprlock_cmd}'") + machine.execute(f"hyprctl --instance 0 dispatch exec '{hyprlock_cmd}'") wait_for_lock_exit_status, out = machine.execute("WAYLAND_DISPLAY=wayland-1 ${flake.hyprlock-test-meta}/bin/wait-for-lock") print(f"Wait for lock exit code: {wait_for_lock_exit_status}") @@ -107,7 +109,7 @@ in { # wrong password machine.send_chars("asdf\n") - _, __ = machine.execute("sleep 3") # default fail_timeout is 2 seconds + machine.execute("sleep 3") # default fail_timeout is 2 seconds # correct password machine.send_chars("abcdefghijklmnopqrstuvwxyz1234567890-=!@#$%^&*()_+[]{};':\"]\\|,./<>?`~") @@ -126,13 +128,13 @@ in { machine.send_key("z") machine.send_chars("\n") - _, __ = machine.execute(f"waitpid {hyprlock_pid}") + machine.execute(f"waitpid {hyprlock_pid}") _, exit_status = machine.execute("cat /tmp/exit_status") print(f"Hyprlock exited with {exit_status}") - machine.copy_from_vm(log_file_path) + machine.copy_from_vm(log_file_path, "logs") if ${APITRACE_RECORD_PY}: - machine.copy_from_vm(log_file_path + ".trace") + machine.copy_from_vm(log_file_path + ".trace", "traces") _, out = machine.execute(f"cat {log_file_path}") print(f"Hyprlock log:\n{out}") diff --git a/tests/hyprland.conf b/tests/hyprland.conf index 3cc3200..91a68d2 100644 --- a/tests/hyprland.conf +++ b/tests/hyprland.conf @@ -1,9 +1,6 @@ monitor = Virtual-1,1920x1080@60,auto-right,1 monitor = ,disabled -# see nix/tests/default.nix -# exec-once = run_hyprlock_tests.sh - input { # to type german and polish specific letters via compose keys kb_layout = eu @@ -39,3 +36,6 @@ misc { debug { disable_logs = 0 } + +# we use this in nix/tests/default.nix to be able to wait for hyprland startup +exec-once = echo "startup" > /tmp/hyprland_exec_once_notification From 3b71d8a1973b4bcbd5e3120917f73de7a0c7b39c Mon Sep 17 00:00:00 2001 From: Maximilian Seidler Date: Sat, 11 Oct 2025 11:37:53 +0200 Subject: [PATCH 05/12] add layout_and_shape test config --- result | 1 - tests/configs/{default.conf => example.conf} | 0 tests/configs/layout_and_shape.conf | 90 ++++++++++++++++++++ 3 files changed, 90 insertions(+), 1 deletion(-) delete mode 120000 result rename tests/configs/{default.conf => example.conf} (100%) create mode 100644 tests/configs/layout_and_shape.conf diff --git a/result b/result deleted file mode 120000 index 85b4251..0000000 --- a/result +++ /dev/null @@ -1 +0,0 @@ -/nix/store/j42nf7h99pxmsy3ivn8ljwsbf2qcaaz2-hyprlock-debug-0.9.3+date=2026-03-28_dirty \ No newline at end of file diff --git a/tests/configs/default.conf b/tests/configs/example.conf similarity index 100% rename from tests/configs/default.conf rename to tests/configs/example.conf diff --git a/tests/configs/layout_and_shape.conf b/tests/configs/layout_and_shape.conf new file mode 100644 index 0000000..206b42f --- /dev/null +++ b/tests/configs/layout_and_shape.conf @@ -0,0 +1,90 @@ +background { + color=rgba(255, 255, 255, 0) +} + +shape { + size = 90%, 90% + position = 0, 0 + color = rgba(0, 0, 0, 0.5) + border_color = rgba(255, 255, 0, 1.0) + rounding = 5 + border_size = 10 + halign = center + valign = center +} + +shape { + size = 50%, 50% + position = -10, -10 + color = rgb(0, 0, 255) + rounding = 5 + border_size = 0 + halign = center + valign = center +} + +shape { + size = 50%, 50% + position = +10, +10 + color = rgb(00ff00) + color = rgba(00ff00ff) + rounding = 5 + border_size = 0 + halign = center + valign = center +} + +# Top left corner +shape { + size = 10%, 10% + position = 10, -10 + color = rgba(0, 255, 0, 1.0) + rounding = 5 + border_size = 0 + halign = left + valign = top +} + +# Top right corner +shape { + size = 10%, 10% + position = -10, -10 + color = rgba(0, 255, 0, 1.0) + rounding = 5 + border_size = 0 + halign = right + valign = top +} + +# Bottom left corner +shape { + size = 10%, 10% + position = 10, 10 + color = rgba(0, 255, 0, 1.0) + rounding = 5 + border_size = 0 + halign = left + valign = bottom +} + +# Bottom right corner +shape { + size = 10%, 10% + position = -10, 10 + color = rgba(0, 255, 0, 1.0) + rounding = 5 + border_size = 0 + halign = right + valign = bottom +} + +# Origin of shape centered +shape { + size = 10%, 10% + position = 50%, 50% + color = rgb(ff0000) + rounding = 5 + border_size = 0 + halign = left + valign = bottom +} From e9b01e9ded45cada8354d52d27886da37ff7018a Mon Sep 17 00:00:00 2001 From: Maximilian Seidler Date: Sat, 11 Oct 2025 11:56:33 +0200 Subject: [PATCH 06/12] cleanup nix test-meta derivation --- nix/test-meta.nix | 18 ++---------------- nix/tests/default.nix | 2 +- 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/nix/test-meta.nix b/nix/test-meta.nix index 4f90dc2..c217aac 100644 --- a/nix/test-meta.nix +++ b/nix/test-meta.nix @@ -11,18 +11,10 @@ wayland-scanner, version ? "git", }: let - inherit (lib.lists) flatten foldl'; inherit (lib.sources) cleanSourceWith cleanSource; - inherit (lib.strings) hasSuffix cmakeBool; - - adapters = flatten [ - stdenvAdapters.useMoldLinker - stdenvAdapters.keepDebugInfo - ]; - - customStdenv = foldl' (acc: adapter: adapter acc) stdenv adapters; + inherit (lib.strings) hasSuffix; in - customStdenv.mkDerivation (finalAttrs: { + stdenv.mkDerivation (finalAttrs: { pname = "hyprlock-test-meta"; inherit version; @@ -40,20 +32,14 @@ in hyprwayland-scanner pkg-config wayland-scanner - egl-wayland ]; buildInputs = hyprlock.buildInputs; - cmakeBuildType = "Debug"; - - cmakeFlags = [(cmakeBool "TESTS" true)]; - meta = { homepage = "https://github.com/hyprwm/hyprlock"; description = "Hyprlock testing utility"; license = lib.licenses.bsd3; platforms = hyprlock.meta.platforms; - mainProgram = "wait-for-lock"; }; }) diff --git a/nix/tests/default.nix b/nix/tests/default.nix index 4f33434..fd0c134 100644 --- a/nix/tests/default.nix +++ b/nix/tests/default.nix @@ -98,7 +98,7 @@ in { hyprlock_cmd = f"${lib.getExe' pkgs.apitrace "apitrace"} trace --output {log_file_path}.trace --api egl {hyprlock_cmd}" machine.execute(f"hyprctl --instance 0 dispatch exec '{hyprlock_cmd}'") - wait_for_lock_exit_status, out = machine.execute("WAYLAND_DISPLAY=wayland-1 ${flake.hyprlock-test-meta}/bin/wait-for-lock") + wait_for_lock_exit_status, out = machine.execute("WAYLAND_DISPLAY=wayland-1 ${lib.getExe' flake.hyprlock-test-meta "wait-for-lock"}") print(f"Wait for lock exit code: {wait_for_lock_exit_status}") if wait_for_lock_exit_status != 0: break From f11e99781e9b54d59a827e334e2ac08c1109684f Mon Sep 17 00:00:00 2001 From: Maximilian Seidler Date: Sat, 11 Oct 2025 12:05:05 +0200 Subject: [PATCH 07/12] test the example config by adding it in the testScript --- nix/tests/default.nix | 4 +- tests/configs/example.conf | 106 ------------------------------------- 2 files changed, 3 insertions(+), 107 deletions(-) delete mode 100644 tests/configs/example.conf diff --git a/nix/tests/default.nix b/nix/tests/default.nix index fd0c134..6d57983 100644 --- a/nix/tests/default.nix +++ b/nix/tests/default.nix @@ -89,7 +89,9 @@ in { _, systeminfo = machine.execute("hyprctl --instance 0 systeminfo") print(systeminfo) - for hyprlock_config in Path("${flake.hyprlock-test-meta}/share/hypr/configs/").iterdir(): + test_files = [Path("${flake.hyprlock}/share/hypr/hyprlock.conf")] # also test the example configuration + test_files += list(Path("${flake.hyprlock-test-meta}/share/hypr/configs/").iterdir()) + for hyprlock_config in test_files: print(f"Testing configuration file {hyprlock_config}") log_file_path = "/tmp/hyprlock_test_" + hyprlock_config.stem diff --git a/tests/configs/example.conf b/tests/configs/example.conf deleted file mode 100644 index 94b887e..0000000 --- a/tests/configs/example.conf +++ /dev/null @@ -1,106 +0,0 @@ -# sample hyprlock.conf -# for more configuration options, refer https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock -# -# rendered text in all widgets supports pango markup (e.g. or tags) -# ref. https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock/#general-remarks -# -# shortcuts to clear password buffer: ESC, Ctrl+U, Ctrl+Backspace -# -# you can get started by copying this config to ~/.config/hypr/hyprlock.conf -# - -$font = Monospace - -general { - hide_cursor = false -} - -# uncomment to enable fingerprint authentication -# auth { -# fingerprint { -# enabled = true -# ready_message = Scan fingerprint to unlock -# present_message = Scanning... -# retry_delay = 250 # in milliseconds -# } -# } - -animations { - enabled = true - bezier = linear, 1, 1, 0, 0 - animation = fadeIn, 1, 5, linear - animation = fadeOut, 1, 5, linear - animation = inputFieldDots, 1, 2, linear -} - -background { - monitor = - path = screenshot - blur_passes = 3 -} - -input-field { - monitor = - size = 20%, 5% - outline_thickness = 3 - inner_color = rgba(0, 0, 0, 0.0) # no fill - - outer_color = rgba(33ccffee) rgba(00ff99ee) 45deg - check_color = rgba(00ff99ee) rgba(ff6633ee) 120deg - fail_color = rgba(ff6633ee) rgba(ff0066ee) 40deg - - font_color = rgb(143, 143, 143) - fade_on_empty = false - rounding = 15 - - font_family = $font - placeholder_text = Input password... - fail_text = $PAMFAIL - - # uncomment to use a letter instead of a dot to indicate the typed password - # dots_text_format = * - # dots_size = 0.4 - dots_spacing = 0.3 - - # uncomment to use an input indicator that does not show the password length (similar to swaylock's input indicator) - # hide_input = true - - position = 0, -20 - halign = center - valign = center -} - -# TIME -label { - monitor = - text = $TIME # ref. https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock/#variable-substitution - font_size = 90 - font_family = $font - - position = -30, 0 - halign = right - valign = top -} - -# DATE -label { - monitor = - text = cmd[update:60000] date +"%A, %d %B %Y" # update every 60 seconds - font_size = 25 - font_family = $font - - position = -30, -150 - halign = right - valign = top -} - -label { - monitor = - text = $LAYOUT[en,ru] - font_size = 24 - onclick = hyprctl switchxkblayout all next - - position = 250, -20 - halign = center - valign = center -} From 35353a3e03e3d7f63d882c4b4f2335f3b4862f05 Mon Sep 17 00:00:00 2001 From: Maximilian Seidler Date: Sat, 11 Oct 2025 12:36:03 +0200 Subject: [PATCH 08/12] remove include that slipped it's way into this patchset --- src/renderer/AsyncResourceManager.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/renderer/AsyncResourceManager.cpp b/src/renderer/AsyncResourceManager.cpp index a65b71e..a1ef99f 100644 --- a/src/renderer/AsyncResourceManager.cpp +++ b/src/renderer/AsyncResourceManager.cpp @@ -4,7 +4,6 @@ #include "../helpers/Log.hpp" #include "../helpers/MiscFunctions.hpp" #include "../core/hyprlock.hpp" -#include "../core/Egl.hpp" #include "../config/ConfigManager.hpp" #include From ba5222bb1db06d34100358828a08da86cf7706a2 Mon Sep 17 00:00:00 2001 From: Maximilian Seidler Date: Sat, 11 Oct 2025 12:37:35 +0200 Subject: [PATCH 09/12] also remove that lol --- src/core/hyprlock.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/hyprlock.cpp b/src/core/hyprlock.cpp index 57c7b44..14f9cda 100644 --- a/src/core/hyprlock.cpp +++ b/src/core/hyprlock.cpp @@ -622,7 +622,7 @@ void CHyprlock::handleKeySym(xkb_keysym_t sym, bool composed) { m_sPasswordState.passBuffer = ""; } else if (SYM == XKB_KEY_Return || SYM == XKB_KEY_KP_Enter) { - Debug::log(LOG, "Authenticating {}", m_sPasswordState.passBuffer); + Debug::log(LOG, "Authenticating"); static const auto IGNOREEMPTY = g_pConfigManager->getValue("general:ignore_empty_input"); From d2473bf5631c02f4775edf8ca2d4615b1fa811ee Mon Sep 17 00:00:00 2001 From: Maximilian Seidler Date: Sat, 11 Oct 2025 16:58:44 +0200 Subject: [PATCH 10/12] add more labels to lots_of_label_updates test --- tests/configs/lots_of_label_updates.conf | 66 ++++++++++++++++-------- 1 file changed, 44 insertions(+), 22 deletions(-) diff --git a/tests/configs/lots_of_label_updates.conf b/tests/configs/lots_of_label_updates.conf index 6d23898..ad84199 100644 --- a/tests/configs/lots_of_label_updates.conf +++ b/tests/configs/lots_of_label_updates.conf @@ -53,6 +53,50 @@ label { valign=center } +label { + text = cmd[update:200] date +'%H:%M:%S:%N' + color = rgba(129, 162, 190, 1.0) + font_size = 35 + font_family = Noto Sans + + position = 150, -200 + halign = left + valign = center +} + +label { + text = cmd[update:200] date +'%H:%M:%S:%N' + color = rgba(129, 162, 190, 1.0) + font_size = 35 + font_family = Noto Sans + + position = 150, -150 + halign = left + valign = center +} + +label { + text = cmd[update:200] date +'%H:%M:%S:%N' + color = rgba(129, 162, 190, 1.0) + font_size = 35 + font_family = Noto Sans + + position = 150, -100 + halign = left + valign = center +} + +label { + text = cmd[update:200] date +'%H:%M:%S:%N' + color = rgba(129, 162, 190, 1.0) + font_size = 35 + font_family = Noto Sans + + position = 150, -50 + halign = left + valign = center +} + label { text = cmd[update:200] date +'%H:%M:%S' color = rgba(129, 162, 190, 1.0) @@ -174,26 +218,4 @@ label { valign = center } -label { - text = cmd[update:200] date +'%H:%M:%S' - color = rgba(129, 162, 190, 1.0) - font_size = 35 - font_family = Noto Sans - - position = 150, 550 - halign = left - valign = center -} - -label { - text = cmd[update:200] date +'%H:%M:%S' - color = rgba(129, 162, 190, 1.0) - font_size = 35 - font_family = Noto Sans - - position = 150, 600 - halign = left - valign = center -} - From 75769b6213887327ea58c42551c31156ec0f6800 Mon Sep 17 00:00:00 2001 From: Maximilian Seidler Date: Sat, 11 Oct 2025 17:09:52 +0200 Subject: [PATCH 11/12] don't wait for the hyprland unit, fails if it is already inactive --- nix/tests/default.nix | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/nix/tests/default.nix b/nix/tests/default.nix index 6d57983..9a9306f 100644 --- a/nix/tests/default.nix +++ b/nix/tests/default.nix @@ -146,8 +146,7 @@ in { break - _, out = machine.execute("hyprctl --instance 0 dispatch exit") - machine.wait_for_unit("hyprland", timeout=10) + machine.execute("hyprctl --instance 0 dispatch exit") _, exit_status = machine.execute("cat /tmp/exit_status") # For the github runner, just to make sure wen don't accidentally succeed From edb9ec890f5b21e08a05e1ba89522277873c5f40 Mon Sep 17 00:00:00 2001 From: Maximilian Seidler Date: Sat, 28 Mar 2026 17:44:14 +0100 Subject: [PATCH 12/12] lock update and cleanup after rebase --- flake.lock | 12 ++++++------ flake.nix | 2 +- nix/overlays.nix | 4 +--- tests/CMakeLists.txt | 2 +- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/flake.lock b/flake.lock index 75ba39c..35bf22a 100644 --- a/flake.lock +++ b/flake.lock @@ -62,11 +62,11 @@ ] }, "locked": { - "lastModified": 1772459870, - "narHash": "sha256-xxkK2Cvqxpf/4UGcJ/TyCwrvmiNWsKsJfFzHMp2bxis=", + "lastModified": 1774534854, + "narHash": "sha256-grFWyjph17nSuIGE+eh9oPEW5prXRzyWsQ4xCvXTzWc=", "owner": "hyprwm", "repo": "hyprutils", - "rev": "e63f3a79334dec49f8eb1691f66f18115df04085", + "rev": "762166b516432ce4b02bfbae365f1daa6f88f76d", "type": "github" }, "original": { @@ -100,11 +100,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1772433332, - "narHash": "sha256-izhTDFKsg6KeVBxJS9EblGeQ8y+O8eCa6RcW874vxEc=", + "lastModified": 1774386573, + "narHash": "sha256-4hAV26quOxdC6iyG7kYaZcM3VOskcPUrdCQd/nx8obc=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "cf59864ef8aa2e178cccedbe2c178185b0365705", + "rev": "46db2e09e1d3f113a13c0d7b81e2f221c63b8ce9", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 7005cc4..5b4876c 100644 --- a/flake.nix +++ b/flake.nix @@ -66,7 +66,7 @@ hyprlock = builtins.throw "hyprlock: the flake HM module has been removed. Use the module from Home Manager upstream."; }; - checks = eachSystem (system: self.packages.${system}); + checks = eachSystem (system: self.packages.${system} // (import ./nix/tests/default.nix inputs pkgsFor.${system})); formatter = eachSystem (system: pkgsFor.${system}.nixfmt-tree); }; diff --git a/nix/overlays.nix b/nix/overlays.nix index e77aace..c238177 100644 --- a/nix/overlays.nix +++ b/nix/overlays.nix @@ -42,10 +42,8 @@ in { hyprgraphics = prev.hyprgraphics.override {debug = true;}; hyprlock-debug = prev.hyprlock.override {debug = true;}; hyprlock-test-meta = prev.callPackage ./test-meta.nix { - stdenv = prev.gcc14Stdenv; + stdenv = prev.gcc15Stdenv; version = version + "+date=" + (mkDate (inputs.self.lastModifiedDate or "19700101")) + "_" + (inputs.self.shortRev or "dirty"); - hyprland-protocols = final.hyprland-protocols; - wayland-scanner = final.wayland-scanner; }; }) ]; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 81b562c..db6abe0 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -11,7 +11,7 @@ find_package(hyprwayland-scanner 0.4.4 REQUIRED) pkg_check_modules(wfldeps REQUIRED IMPORTED_TARGET hyprland-protocols>=0.6.0 - hyprutils>=0.5.0 + hyprutils>=0.11.0 wayland-client wayland-protocols>=1.35 )