From b36e532b5e0eef219f33075e6e60b68d104484ee Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 4 Jun 2016 00:10:47 -0400 Subject: [PATCH] cleans up folder structure * consolidates docs * deletes converter/ * updates .md references (most) --- README.md | 12 +- converter/adb_usb/Makefile | 141 ----- converter/adb_usb/Makefile.pjrc | 73 --- converter/adb_usb/README.md | 103 ---- converter/adb_usb/config.h | 63 --- converter/adb_usb/keymap_ansi.c | 16 - converter/adb_usb/keymap_common.c | 30 -- converter/adb_usb/keymap_common.h | 212 -------- converter/adb_usb/keymap_hasu.c | 58 --- converter/adb_usb/keymap_iso.c | 16 - converter/adb_usb/led.c | 27 - converter/adb_usb/matrix.c | 296 ----------- converter/ascii_usb/Makefile | 82 --- converter/ascii_usb/README | 38 -- converter/ascii_usb/config.h | 70 --- converter/ascii_usb/keymap.c | 42 -- converter/ascii_usb/led.c | 25 - converter/ascii_usb/matrix.c | 195 ------- converter/ibm4704_usb/Makefile | 93 ---- converter/ibm4704_usb/README.md | 72 --- converter/ibm4704_usb/config.h | 61 --- converter/ibm4704_usb/ibm4704.txt | 182 ------- converter/ibm4704_usb/keymap_50key.c | 17 - converter/ibm4704_usb/keymap_alps102key.c | 50 -- converter/ibm4704_usb/keymap_common.c | 30 -- converter/ibm4704_usb/keymap_common.h | 146 ------ converter/ibm4704_usb/keymap_hasu.c | 85 --- converter/ibm4704_usb/keymap_plain.c | 50 -- converter/ibm4704_usb/led.c | 24 - converter/ibm4704_usb/matrix.c | 162 ------ converter/m0110_usb/Makefile | 96 ---- converter/m0110_usb/Makefile.teensy | 98 ---- converter/m0110_usb/Makefile.tmk_rev1 | 96 ---- converter/m0110_usb/Makefile.tmk_rev2 | 96 ---- converter/m0110_usb/README.md | 79 --- converter/m0110_usb/config.h | 62 --- converter/m0110_usb/keymap_common.c | 37 -- converter/m0110_usb/keymap_common.h | 133 ----- converter/m0110_usb/keymap_default.c | 137 ----- converter/m0110_usb/keymap_hasu.c | 87 ---- converter/m0110_usb/keymap_intl.c | 73 --- converter/m0110_usb/keymap_spacefn.c | 71 --- converter/m0110_usb/led.c | 32 -- converter/m0110_usb/matrix.c | 142 ----- converter/news_usb/Makefile.pjrc | 74 --- converter/news_usb/config_pjrc.h | 62 --- converter/news_usb/keymap.c | 125 ----- converter/news_usb/led.c | 26 - converter/news_usb/matrix.c | 142 ----- converter/next_usb/Makefile | 87 ---- converter/next_usb/Makefile.pjrc | 63 --- converter/next_usb/README | 45 -- converter/next_usb/config.h | 190 ------- converter/next_usb/keymap.c | 177 ------- converter/next_usb/led.c | 60 --- converter/next_usb/matrix.c | 271 ---------- converter/next_usb/next_timings.jpg | Bin 407936 -> 0 bytes converter/pc98_usb/Makefile | 83 --- converter/pc98_usb/README | 67 --- converter/pc98_usb/config.h | 123 ----- converter/pc98_usb/keymap.c | 208 -------- converter/pc98_usb/led.c | 33 -- converter/pc98_usb/matrix.c | 211 -------- converter/ps2_usb/Makefile | 105 ---- converter/ps2_usb/Makefile.mbed | 46 -- converter/ps2_usb/Makefile.pjrc | 75 --- converter/ps2_usb/Makefile.tmk_rev1 | 98 ---- converter/ps2_usb/Makefile.tmk_rev2 | 98 ---- converter/ps2_usb/Makefile.vusb | 107 ---- converter/ps2_usb/README.md | 84 --- converter/ps2_usb/config.h | 173 ------- converter/ps2_usb/config_mbed.h | 60 --- converter/ps2_usb/config_tmk_rev1.h | 147 ------ converter/ps2_usb/config_tmk_rev2.h | 85 --- converter/ps2_usb/keymap_common.c | 31 -- converter/ps2_usb/keymap_common.h | 173 ------- converter/ps2_usb/keymap_jis.c | 34 -- converter/ps2_usb/keymap_plain.c | 32 -- converter/ps2_usb/keymap_spacefn.c | 61 --- converter/ps2_usb/led.c | 33 -- converter/ps2_usb/main.cpp | 46 -- converter/ps2_usb/matrix.c | 486 ------------------ converter/ps2_usb/usbconfig.h | 377 -------------- converter/serialmouse_usb/Makefile | 106 ---- converter/serialmouse_usb/README.md | 11 - converter/serialmouse_usb/config.h | 119 ----- converter/serialmouse_usb/keymap.c | 33 -- converter/serialmouse_usb/keymap_common.c | 30 -- converter/serialmouse_usb/keymap_common.h | 174 ------- converter/serialmouse_usb/led.c | 24 - converter/serialmouse_usb/matrix.c | 83 --- converter/sun_usb/Makefile | 85 --- converter/sun_usb/README | 106 ---- converter/sun_usb/command_extra.c | 61 --- converter/sun_usb/config.h | 95 ---- converter/sun_usb/keymap.c | 192 ------- converter/sun_usb/keymap_sun3.c | 173 ------- converter/sun_usb/led.c | 35 -- converter/sun_usb/matrix.c | 186 ------- converter/terminal_bluefruit/Makefile | 99 ---- converter/terminal_bluefruit/README | 37 -- converter/terminal_bluefruit/config.h | 112 ---- converter/terminal_bluefruit/keymap.c | 227 -------- converter/terminal_bluefruit/led.c | 35 -- converter/terminal_bluefruit/matrix.c | 262 ---------- converter/terminal_usb/Makefile | 98 ---- converter/terminal_usb/README | 37 -- converter/terminal_usb/config.h | 138 ----- converter/terminal_usb/keymap.c | 216 -------- converter/terminal_usb/led.c | 33 -- converter/terminal_usb/matrix.c | 262 ---------- converter/usb_usb/Makefile | 140 ----- converter/usb_usb/README | 74 --- converter/usb_usb/config.h | 39 -- converter/usb_usb/keymap.c | 115 ----- converter/usb_usb/keymap_common.c | 31 -- converter/usb_usb/keymap_common.h | 77 --- converter/usb_usb/keymap_hasu.c | 158 ------ converter/usb_usb/keymap_spacefn.c | 61 --- converter/usb_usb/main.cpp | 132 ----- converter/usb_usb/matrix.c | 133 ----- converter/x68k_usb/Makefile | 101 ---- converter/x68k_usb/README | 151 ------ converter/x68k_usb/config_pjrc.h | 67 --- converter/x68k_usb/keymap.c | 150 ------ converter/x68k_usb/led.c | 43 -- converter/x68k_usb/matrix.c | 142 ----- BUILD_GUIDE.md => doc/BUILD_GUIDE.md | 0 {tmk_core/doc => doc}/COPYING.GPLv2 | 0 {tmk_core/doc => doc}/COPYING.GPLv3 | 0 {keyboard/planck => doc}/CYGWIN_GUIDE.md | 0 {tmk_core/doc => doc}/FUSE.txt | 0 HAND_WIRE.md => doc/HAND_WIRE.md | 0 {keyboard/planck => doc}/PCB_GUIDE.md | 0 {tmk_core/doc => doc}/POWER.txt | 0 TMK_README.md => doc/TMK_README.md | 0 {tmk_core/doc => doc}/USB_NKRO.txt | 0 VAGRANT_GUIDE.md => doc/VAGRANT_GUIDE.md | 8 +- tmk_core/doc/build.md => doc/build_old.md | 1 + {tmk_core/doc => doc}/keycode.txt | 0 {tmk_core/doc => doc}/keymap.md | 0 {tmk_core/doc => doc}/other_projects.md | 0 keyboard/atomic/flash-pcb.sh | 3 - keyboard/ergodox_ez/readme.md | 2 +- keyboard/planck/flash-pcb.sh | 3 - keyboard/preonic/flash-pcb.sh | 3 - .../1-setup-path-win.bat | 0 .../2-setup-environment-win.bat | 0 Vagrantfile => util/Vagrantfile | 0 avr_setup.sh => util/avr_setup.sh | 0 new_project.sh => util/new_project.sh | 0 151 files changed, 12 insertions(+), 12799 deletions(-) delete mode 100644 converter/adb_usb/Makefile delete mode 100644 converter/adb_usb/Makefile.pjrc delete mode 100644 converter/adb_usb/README.md delete mode 100644 converter/adb_usb/config.h delete mode 100644 converter/adb_usb/keymap_ansi.c delete mode 100644 converter/adb_usb/keymap_common.c delete mode 100644 converter/adb_usb/keymap_common.h delete mode 100644 converter/adb_usb/keymap_hasu.c delete mode 100644 converter/adb_usb/keymap_iso.c delete mode 100644 converter/adb_usb/led.c delete mode 100644 converter/adb_usb/matrix.c delete mode 100644 converter/ascii_usb/Makefile delete mode 100644 converter/ascii_usb/README delete mode 100644 converter/ascii_usb/config.h delete mode 100644 converter/ascii_usb/keymap.c delete mode 100644 converter/ascii_usb/led.c delete mode 100644 converter/ascii_usb/matrix.c delete mode 100644 converter/ibm4704_usb/Makefile delete mode 100644 converter/ibm4704_usb/README.md delete mode 100644 converter/ibm4704_usb/config.h delete mode 100644 converter/ibm4704_usb/ibm4704.txt delete mode 100644 converter/ibm4704_usb/keymap_50key.c delete mode 100644 converter/ibm4704_usb/keymap_alps102key.c delete mode 100644 converter/ibm4704_usb/keymap_common.c delete mode 100644 converter/ibm4704_usb/keymap_common.h delete mode 100644 converter/ibm4704_usb/keymap_hasu.c delete mode 100644 converter/ibm4704_usb/keymap_plain.c delete mode 100644 converter/ibm4704_usb/led.c delete mode 100644 converter/ibm4704_usb/matrix.c delete mode 100644 converter/m0110_usb/Makefile delete mode 100644 converter/m0110_usb/Makefile.teensy delete mode 100644 converter/m0110_usb/Makefile.tmk_rev1 delete mode 100644 converter/m0110_usb/Makefile.tmk_rev2 delete mode 100644 converter/m0110_usb/README.md delete mode 100644 converter/m0110_usb/config.h delete mode 100644 converter/m0110_usb/keymap_common.c delete mode 100644 converter/m0110_usb/keymap_common.h delete mode 100644 converter/m0110_usb/keymap_default.c delete mode 100644 converter/m0110_usb/keymap_hasu.c delete mode 100644 converter/m0110_usb/keymap_intl.c delete mode 100644 converter/m0110_usb/keymap_spacefn.c delete mode 100644 converter/m0110_usb/led.c delete mode 100644 converter/m0110_usb/matrix.c delete mode 100644 converter/news_usb/Makefile.pjrc delete mode 100644 converter/news_usb/config_pjrc.h delete mode 100644 converter/news_usb/keymap.c delete mode 100644 converter/news_usb/led.c delete mode 100644 converter/news_usb/matrix.c delete mode 100644 converter/next_usb/Makefile delete mode 100644 converter/next_usb/Makefile.pjrc delete mode 100644 converter/next_usb/README delete mode 100644 converter/next_usb/config.h delete mode 100644 converter/next_usb/keymap.c delete mode 100644 converter/next_usb/led.c delete mode 100644 converter/next_usb/matrix.c delete mode 100644 converter/next_usb/next_timings.jpg delete mode 100644 converter/pc98_usb/Makefile delete mode 100644 converter/pc98_usb/README delete mode 100644 converter/pc98_usb/config.h delete mode 100644 converter/pc98_usb/keymap.c delete mode 100644 converter/pc98_usb/led.c delete mode 100644 converter/pc98_usb/matrix.c delete mode 100644 converter/ps2_usb/Makefile delete mode 100644 converter/ps2_usb/Makefile.mbed delete mode 100644 converter/ps2_usb/Makefile.pjrc delete mode 100644 converter/ps2_usb/Makefile.tmk_rev1 delete mode 100644 converter/ps2_usb/Makefile.tmk_rev2 delete mode 100644 converter/ps2_usb/Makefile.vusb delete mode 100644 converter/ps2_usb/README.md delete mode 100644 converter/ps2_usb/config.h delete mode 100644 converter/ps2_usb/config_mbed.h delete mode 100644 converter/ps2_usb/config_tmk_rev1.h delete mode 100644 converter/ps2_usb/config_tmk_rev2.h delete mode 100644 converter/ps2_usb/keymap_common.c delete mode 100644 converter/ps2_usb/keymap_common.h delete mode 100644 converter/ps2_usb/keymap_jis.c delete mode 100644 converter/ps2_usb/keymap_plain.c delete mode 100644 converter/ps2_usb/keymap_spacefn.c delete mode 100644 converter/ps2_usb/led.c delete mode 100644 converter/ps2_usb/main.cpp delete mode 100644 converter/ps2_usb/matrix.c delete mode 100644 converter/ps2_usb/usbconfig.h delete mode 100644 converter/serialmouse_usb/Makefile delete mode 100644 converter/serialmouse_usb/README.md delete mode 100644 converter/serialmouse_usb/config.h delete mode 100644 converter/serialmouse_usb/keymap.c delete mode 100644 converter/serialmouse_usb/keymap_common.c delete mode 100644 converter/serialmouse_usb/keymap_common.h delete mode 100644 converter/serialmouse_usb/led.c delete mode 100644 converter/serialmouse_usb/matrix.c delete mode 100644 converter/sun_usb/Makefile delete mode 100644 converter/sun_usb/README delete mode 100644 converter/sun_usb/command_extra.c delete mode 100644 converter/sun_usb/config.h delete mode 100644 converter/sun_usb/keymap.c delete mode 100644 converter/sun_usb/keymap_sun3.c delete mode 100644 converter/sun_usb/led.c delete mode 100644 converter/sun_usb/matrix.c delete mode 100644 converter/terminal_bluefruit/Makefile delete mode 100644 converter/terminal_bluefruit/README delete mode 100644 converter/terminal_bluefruit/config.h delete mode 100644 converter/terminal_bluefruit/keymap.c delete mode 100644 converter/terminal_bluefruit/led.c delete mode 100644 converter/terminal_bluefruit/matrix.c delete mode 100644 converter/terminal_usb/Makefile delete mode 100644 converter/terminal_usb/README delete mode 100644 converter/terminal_usb/config.h delete mode 100644 converter/terminal_usb/keymap.c delete mode 100644 converter/terminal_usb/led.c delete mode 100644 converter/terminal_usb/matrix.c delete mode 100644 converter/usb_usb/Makefile delete mode 100644 converter/usb_usb/README delete mode 100644 converter/usb_usb/config.h delete mode 100644 converter/usb_usb/keymap.c delete mode 100644 converter/usb_usb/keymap_common.c delete mode 100644 converter/usb_usb/keymap_common.h delete mode 100644 converter/usb_usb/keymap_hasu.c delete mode 100644 converter/usb_usb/keymap_spacefn.c delete mode 100644 converter/usb_usb/main.cpp delete mode 100644 converter/usb_usb/matrix.c delete mode 100644 converter/x68k_usb/Makefile delete mode 100644 converter/x68k_usb/README delete mode 100644 converter/x68k_usb/config_pjrc.h delete mode 100644 converter/x68k_usb/keymap.c delete mode 100644 converter/x68k_usb/led.c delete mode 100644 converter/x68k_usb/matrix.c rename BUILD_GUIDE.md => doc/BUILD_GUIDE.md (100%) rename {tmk_core/doc => doc}/COPYING.GPLv2 (100%) rename {tmk_core/doc => doc}/COPYING.GPLv3 (100%) rename {keyboard/planck => doc}/CYGWIN_GUIDE.md (100%) rename {tmk_core/doc => doc}/FUSE.txt (100%) rename HAND_WIRE.md => doc/HAND_WIRE.md (100%) rename {keyboard/planck => doc}/PCB_GUIDE.md (100%) rename {tmk_core/doc => doc}/POWER.txt (100%) rename TMK_README.md => doc/TMK_README.md (100%) rename {tmk_core/doc => doc}/USB_NKRO.txt (100%) rename VAGRANT_GUIDE.md => doc/VAGRANT_GUIDE.md (72%) rename tmk_core/doc/build.md => doc/build_old.md (99%) rename {tmk_core/doc => doc}/keycode.txt (100%) rename {tmk_core/doc => doc}/keymap.md (100%) rename {tmk_core/doc => doc}/other_projects.md (100%) delete mode 100755 keyboard/atomic/flash-pcb.sh delete mode 100755 keyboard/planck/flash-pcb.sh delete mode 100755 keyboard/preonic/flash-pcb.sh rename 1-setup-path-win.bat => util/1-setup-path-win.bat (100%) rename 2-setup-environment-win.bat => util/2-setup-environment-win.bat (100%) rename Vagrantfile => util/Vagrantfile (100%) rename avr_setup.sh => util/avr_setup.sh (100%) rename new_project.sh => util/new_project.sh (100%) diff --git a/README.md b/README.md index c848d477d6..a6bd3c495e 100644 --- a/README.md +++ b/README.md @@ -14,18 +14,18 @@ The OLKB product firmwares are maintained by Jack, the Ergodox EZ by Erez, and t This is not a tiny project. While this is the main Readme, there are many other files you might want to consult. Here are some points of interest: * The Readme for your own keyboard: This is found under `keyboards//`. So for the ErgoDox EZ, it's [here](keyboard/ergodox_ez/); for the Atomic, it's [here](keyboard/atomic/) and so on. -* The [build guide](BUILD_GUIDE.md), also mentioned in the next section. This is how you put your development environment together so you can compile the firmware. +* The [build guide](doc/BUILD_GUIDE.md), also mentioned in the next section. This is how you put your development environment together so you can compile the firmware. * The list of possible keycodes you can use in your keymap is actually spread out in a few different places: * [tmk_core/common/keycode.h](tmk_core/common/keycode.h) - the base TMK keycodes. This is the actual source file. - * [tmk_core/doc/keycode.txt](tmk_core/doc/keycode.txt) - an explanation of those same keycodes. + * [doc/keycode.txt](doc/keycode.txt) - an explanation of those same keycodes. * [quantum/keymap_common.h](quantum/keymap_common.h) - this is where the QMK-specific aliases are all set up. Things like the Hyper and Meh key, the Leader key, and all of the other QMK innovations. These are also explained and documented below, but `keymap_common.h` is where they're actually defined. -* The [TMK documentation](tmk_core/doc). QMK is based on TMK, and this explains how it works internally. +* The [TMK documentation](doc/TMK_README.md). QMK is based on TMK, and this explains how it works internally. ## Getting started -* [BUILD_GUIDE.md](BUILD_GUIDE.md) contains instructions to set up a build environment, build the firmware, and deploy it to a keyboard. Once your build environment has been set up, all `make` commands to actually build the firmware must be run from a folder in `keyboard/`. +* [BUILD_GUIDE.md](doc/BUILD_GUIDE.md) contains instructions to set up a build environment, build the firmware, and deploy it to a keyboard. Once your build environment has been set up, all `make` commands to actually build the firmware must be run from a folder in `keyboard/`. * If you're looking to customize a keyboard that currently runs QMK or TMK, find your keyboard's directory under `keyboard/` and run the make commands from there. -* If you're looking to apply this firmware to an entirely new hardware project (a new kind of keyboard), you can create your own Quantum-based project by using `./new_project.sh `, which will create `/keyboard/` with all the necessary components for a Quantum project. +* If you're looking to apply this firmware to an entirely new hardware project (a new kind of keyboard), you can create your own Quantum-based project by using `util/new_project.sh `, which will create `/keyboard/` with all the necessary components for a Quantum project. ### Makefile Options @@ -205,7 +205,7 @@ rounded up (5 bits per key). For example on Planck (48 keys) it uses ### Remember: These are just aliases -These functions work the same way that their `ACTION_*` functions do - they're just quick aliases. To dig into all of the tmk ACTION_* functions, please see the [TMK documentation](https://github.com/jackhumbert/qmk_firmware/blob/master/tmk_core/doc/keymap.md#2-action). +These functions work the same way that their `ACTION_*` functions do - they're just quick aliases. To dig into all of the tmk ACTION_* functions, please see the [TMK documentation](https://github.com/jackhumbert/qmk_firmware/blob/master/doc/keymap.md#2-action). Instead of using `FNx` when defining `ACTION_*` functions, you can use `F(x)` - the benefit here is being able to use more than 32 function actions (up to 4096), if you happen to need them. diff --git a/converter/adb_usb/Makefile b/converter/adb_usb/Makefile deleted file mode 100644 index 2369ee70ac..0000000000 --- a/converter/adb_usb/Makefile +++ /dev/null @@ -1,141 +0,0 @@ -#---------------------------------------------------------------------------- -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make coff = Convert ELF to AVR COFF. -# -# make extcoff = Convert ELF to AVR Extended COFF. -# -# make program = Download the hex file to the device. -# Please customize your programmer settings(PROGRAM_CMD) -# -# make teensy = Download the hex file to the device, using teensy_loader_cli. -# (must have teensy_loader_cli installed). -# -# make dfu = Download the hex file to the device, using dfu-programmer (must -# have dfu-programmer installed). -# -# make flip = Download the hex file to the device, using Atmel FLIP (must -# have Atmel FLIP installed). -# -# make dfu-ee = Download the eeprom file to the device, using dfu-programmer -# (must have dfu-programmer installed). -# -# make flip-ee = Download the eeprom file to the device, using Atmel FLIP -# (must have Atmel FLIP installed). -# -# make debug = Start either simulavr or avarice as specified for debugging, -# with avr-gdb or avr-insight as the front end for debugging. -# -# make filename.s = Just compile filename.c into the assembler code only. -# -# make filename.i = Create a preprocessed source file for use in submitting -# bug reports to the GCC project. -# -# To rebuild project do "make clean" then "make all". -#---------------------------------------------------------------------------- - -# Target file name (without extension). -TARGET = adb_usb_lufa - -# Directory common source filess exist -TMK_DIR = ../../tmk_core - -# Directory keyboard dependent files exist -TARGET_DIR = . - -# project specific files -SRC = keymap_common.c \ - matrix.c \ - led.c \ - adb.c - -ifdef KEYMAP - SRC := keymap_$(KEYMAP).c $(SRC) -else - SRC := keymap_ansi.c $(SRC) -endif - -CONFIG_H = config.h - - -# MCU name -#MCU = at90usb1287 -MCU = atmega32u4 - -# Processor frequency. -# This will define a symbol, F_CPU, in all source code files equal to the -# processor frequency in Hz. You can then use this symbol in your source code to -# calculate timings. Do NOT tack on a 'UL' at the end, this will be done -# automatically to create a 32-bit value in your source code. -# -# This will be an integer division of F_USB below, as it is sourced by -# F_USB after it has run through any CPU prescalers. Note that this value -# does not *change* the processor frequency - it should merely be updated to -# reflect the processor speed set externally so that the code can use accurate -# software delays. -F_CPU = 16000000 - - -# -# LUFA specific -# -# Target architecture (see library "Board Types" documentation). -ARCH = AVR8 - -# Input clock frequency. -# This will define a symbol, F_USB, in all source code files equal to the -# input clock frequency (before any prescaling is performed) in Hz. This value may -# differ from F_CPU if prescaling is used on the latter, and is required as the -# raw input clock is fed directly to the PLL sections of the AVR for high speed -# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' -# at the end, this will be done automatically to create a 32-bit value in your -# source code. -# -# If no clock division is performed on the input clock inside the AVR (via the -# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. -F_USB = $(F_CPU) - -# Interrupt driven control endpoint task(+60) -OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT - - -# Boot Section Size in *bytes* -# Teensy halfKay 512 -# Teensy++ halfKay 1024 -# Atmel DFU loader 4096 -# LUFA bootloader 4096 -# USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 - - -# Build Options -# comment out to disable the options. -# -#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = yes # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration -#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend -#NKRO_ENABLE = yes # USB Nkey Rollover -ADB_MOUSE_ENABLE = yes - -# ADB Mice need acceleration for todays much bigger screens. -OPT_DEFS += -DADB_MOUSE_MAXACC=8 - - -# Optimize size but this may cause error "relocation truncated to fit" -#EXTRALDFLAGS = -Wl,--relax - -# Search Path -VPATH += $(TARGET_DIR) -VPATH += $(TMK_DIR) - -include $(TMK_DIR)/protocol/lufa.mk -include $(TMK_DIR)/protocol.mk -include $(TMK_DIR)/common.mk -include $(TMK_DIR)/rules.mk diff --git a/converter/adb_usb/Makefile.pjrc b/converter/adb_usb/Makefile.pjrc deleted file mode 100644 index c320c09d25..0000000000 --- a/converter/adb_usb/Makefile.pjrc +++ /dev/null @@ -1,73 +0,0 @@ -# Target file name (without extension). -TARGET = adb_usb_pjrc - -# Directory common source filess exist -TMK_DIR = ../../tmk_core - -# Directory keyboard dependent files exist -TARGET_DIR = . - -# keyboard dependent files -SRC = keymap_common.c \ - matrix.c \ - led.c \ - adb.c - -ifdef KEYMAP - SRC := keymap_$(KEYMAP).c $(SRC) -else - SRC := keymap_ansi.c $(SRC) -endif - -CONFIG_H = config.h - - -# MCU name, you MUST set this to match the board you are using -# type "make clean" after changing this, so all files will be rebuilt -#MCU = at90usb162 # Teensy 1.0 -MCU = atmega32u4 # Teensy 2.0 -#MCU = at90usb646 # Teensy++ 1.0 -#MCU = at90usb1286 # Teensy++ 2.0 - - -# Processor frequency. -# Normally the first thing your program should do is set the clock prescaler, -# so your program will run at the correct speed. You should also set this -# variable to same clock speed. The _delay_ms() macro uses this, and many -# examples use this variable to calculate timings. Do not add a "UL" here. -F_CPU = 16000000 - - -# Boot Section Size in *bytes* -# Teensy halfKay 512 -# Teensy++ halfKay 1024 -# Atmel DFU loader 4096 -# LUFA bootloader 4096 -# USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 - - -# Build Options -# comment out to disable the options. -# -BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+5000) -EXTRAKEY_ENABLE = yes # Audio control and System control(+600) -CONSOLE_ENABLE = yes # Console for debug -COMMAND_ENABLE = yes # Commands for debug and configuration -#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend -#NKRO_ENABLE = yes # USB Nkey Rollover(+500) -ADB_MOUSE_ENABLE = yes - -# ADB Mice need acceleration for todays much bigger screens. -OPT_DEFS += -DADB_MOUSE_MAXACC=8 - - -# Search Path -VPATH += $(TARGET_DIR) -VPATH += $(TMK_DIR) - -include $(TMK_DIR)/protocol/pjrc.mk -include $(TMK_DIR)/protocol.mk -include $(TMK_DIR)/common.mk -include $(TMK_DIR)/rules.mk diff --git a/converter/adb_usb/README.md b/converter/adb_usb/README.md deleted file mode 100644 index 46082ff67f..0000000000 --- a/converter/adb_usb/README.md +++ /dev/null @@ -1,103 +0,0 @@ -ADB to USB keyboard converter -============================= -This firmware converts ADB keyboard protocol to USB. -You can use PJRC Teensy for this converter, though, other USB AVR(ATMega32U4, AT90USB64/128 or etc) should work. -But binary size is about 10KB or more it doesn't fit into 8K flash like ATMega8U2. - -Discuss: http://geekhack.org/showwiki.php?title=Island:14290 - - - -README FIRST ------------- -https://github.com/tmk/tmk_keyboard -https://github.com/tmk/tmk_keyboard/tree/master/converter/adb_usb - -Also check these when you are in trouble. - -https://github.com/tmk/tmk_keyboard/wiki -https://github.com/tmk/tmk_keyboard/labels/NOTE - - -Wiring ------- -Connect ADB pins to controller just by 3 lines(Vcc, GND, Data). By default Data line uses port PD0. - -ADB female socket from the front: - - ,--_--. - / o4 3o \ 1: DATA - | o2 1o | 2: Power SW - - === - 3: VCC - `-___-' 4: GND - -This converter uses AVR's internal pull-up, but it seems to be too weak, in particular when you want to use a long or coiled cable. The external pull-up resistor(1K-10K Ohm) on Data is strongly recommended.(It is almost must!) -https://github.com/tmk/tmk_keyboard/wiki/FAQ#pull-up-resistor - -Pull-up resister: - - Keyboard Conveter - ,------. - 5V------+------|VCC | - | | | - [R] | | - | | | - Signal--+------|PD0 | - | | - GND------------|GND | - `------' - R: 1K Ohm resistor - - -Define following macros for ADB connection in config.h if you use other than port PD0. - - ADB_PORT, ADB_PIN, ADB_DDR, ADB_DATA_BIT - - -Build ------ -See doc/build.md. In short, - - $ make clean - $ make - -You can select keymap(ansi is default) like this: - - $ make KEYMAP=[ansi|iso|hasu] - - -Keymap ------- -You can change a keymap by editing code of keymap_[ansi|iso|hasu|yours].c. -How to define the keymap is probably obvious. You can find key symbols in common/keycode.h. And see doc/keymap.md for more detail. - - -Magic command -------------- -To get help press `h` holding Magic key. Magic key is `Power key`. - - -Locking CapsLock ----------------- -Many of old ADB keyboards have mechanical push-lock switch for Capslock key and this converter supports the locking Capslock key by default. See README in top directory for more detail about this feature. -https://github.com/tmk/tmk_keyboard/blob/master/README.md#mechanical-locking-support - -Also you may want to remove locking pin from the push-lock switch to use capslock as a normal momentary switch. - - -Notes ------ -Not-extended ADB keyboards have no discrimination between right modifier and left one, -you will always see left control even if you press right control key. -Apple Extended Keyboard and Apple Extended Keyboard II can discriminate both side -modifiers except for GUI key(Windows/Command). - -And most ADB keyboard has no diodes in its matrix so they are not NKRO, -though ADB protocol itself supports it. See protocol/adb.c for more info. - -If keyboard has ISO layout you need to use ISO keymap with `make KEYMAP=iso`. With ANSI -keymap you will suffer from swapped keys problem. - -https://github.com/tmk/tmk_keyboard/issues/35 - -EOF diff --git a/converter/adb_usb/config.h b/converter/adb_usb/config.h deleted file mode 100644 index 5ce5c22159..0000000000 --- a/converter/adb_usb/config.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -Copyright 2011 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef CONFIG_H -#define CONFIG_H - - -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x0ADB -#define DEVICE_VER 0x0101 -#define MANUFACTURER t.m.k. -#define PRODUCT ADB keyboard converter -#define DESCRIPTION convert ADB keyboard to USB - -/* matrix size */ -#define MATRIX_ROWS 16 // keycode bit: 3-0 -#define MATRIX_COLS 8 // keycode bit: 6-4 - -#define MATRIX_ROW(code) ((code)>>3&0x0F) -#define MATRIX_COL(code) ((code)&0x07) - - -/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ -#define LOCKING_SUPPORT_ENABLE -/* Locking resynchronize hack */ -#define LOCKING_RESYNC_ENABLE - - -/* legacy keymap support */ -#define USE_LEGACY_KEYMAP - - -/* ADB port setting */ -#define ADB_PORT PORTD -#define ADB_PIN PIND -#define ADB_DDR DDRD -#define ADB_DATA_BIT 0 -//#define ADB_PSW_BIT 1 // optional - -/* key combination for command */ -#ifndef __ASSEMBLER__ -#include "adb.h" -#include "matrix.h" -#define IS_COMMAND() ( \ - matrix_is_on(MATRIX_ROW(ADB_POWER), MATRIX_COL(ADB_POWER)) \ -) -#endif - -#endif diff --git a/converter/adb_usb/keymap_ansi.c b/converter/adb_usb/keymap_ansi.c deleted file mode 100644 index 4ea601be0a..0000000000 --- a/converter/adb_usb/keymap_ansi.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "keymap_common.h" - - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - KEYMAP_EXT_ANSI( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, NO, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PEQL,PSLS,PAST, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, PMNS, - LCAP,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, PPLS, - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, - LCTL,LALT,LGUI, SPC, RALT,RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), -}; - -const uint16_t PROGMEM fn_actions[] = { -}; diff --git a/converter/adb_usb/keymap_common.c b/converter/adb_usb/keymap_common.c deleted file mode 100644 index 55a13793cb..0000000000 --- a/converter/adb_usb/keymap_common.c +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright 2011,2012,2013 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#include "keymap_common.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/converter/adb_usb/keymap_common.h b/converter/adb_usb/keymap_common.h deleted file mode 100644 index bdca38e129..0000000000 --- a/converter/adb_usb/keymap_common.h +++ /dev/null @@ -1,212 +0,0 @@ -/* -Copyright 2011,2012,2013 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#ifndef KEYMAP_COMMON_H -#define KEYMAP_COMMON_H - -#include -#include -#include -#include "keycode.h" -#include "action.h" -#include "action_macro.h" -#include "report.h" -#include "print.h" -#include "debug.h" -#include "keymap.h" - - -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - -/* M0115 Apple Extended Keyboard ANSI - * ,---. ,---------------. ,---------------. ,---------------. ,-----------. ,---. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |Pwr| - * `---' `---------------' `---------------' `---------------' `-----------' `---' - * ,-----------------------------------------------------------. ,-----------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| |Ins|Hom|PgU| |NmL| =| /| *| - * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|End|PgD| | 7| 8| 9| -| - * |-----------------------------------------------------------| `-----------' |---------------| - * |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Return | | 4| 5| 6| +| - * |-----------------------------------------------------------| ,---. |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3| | - * |-----------------------------------------------------------| ,-----------. |-----------|Ent| - * |Ctrl |Opt |Cmd | Space | |Opt |Ctrl | |Lef|Dow|Rig| | 0| .| | - * `-----------------------------------------------------------' `-----------' `---------------' - */ -#define KEYMAP_EXT_ANSI( \ - K35, K7A,K78,K63,K76, K60,K61,K62,K64, K65,K6D,K67,K6F, K69,K6B,K71, K7F, \ - K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K72,K73,K74, K47,K51,K4B,K43, \ - K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,K2A, K75,K77,K79, K59,K5B,K5C,K4E, \ - K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27, K24, K56,K57,K58,K45, \ - K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C, K7B, K3E, K53,K54,K55, \ - K36,K3A,K37, K31, K7C,K7D, K3B,K3D,K3C, K52, K41,K4C \ -) { \ - { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ - { KC_##K08, KC_##K09, KC_NUBS, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ - { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ - { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \ - { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_PENT, KC_##K35, KC_##K36, KC_##K37 }, \ - { KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_NO }, \ - { KC_F17, KC_##K41, KC_NO, KC_##K43, KC_F18, KC_##K45, KC_NO, KC_##K47 }, \ - { KC_NO, KC_NO, KC_NO, KC_##K4B, KC_##K4C, KC_NO, KC_##K4E, KC_F18 }, \ - { KC_F19, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ - { KC_##K58, KC_##K59, KC_F20, KC_##K5B, KC_##K5C, KC_INT3, KC_INT1, KC_PCMM }, \ - { KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_LANG2, KC_##K67 }, \ - { KC_LANG1, KC_##K69, KC_F16, KC_##K6B, KC_NO, KC_##K6D, KC_APP, KC_##K6F }, \ - { KC_NO, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77 }, \ - { KC_##K78, KC_##K79, KC_##K7A, KC_##K7B, KC_##K7C, KC_##K7D, KC_NO, KC_##K7F } \ -} - -/* M0115 Apple Extended Keyboard ISO - * ,---. ,---------------. ,---------------. ,---------------. ,-----------. ,---. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |Pwr| - * `---' `---------------' `---------------' `---------------' `-----------' `---' - * ,-----------------------------------------------------------. ,-----------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| |Ins|Hom|PgU| |NmL| =| /| *| - * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Retur| |Del|End|PgD| | 7| 8| 9| -| - * |------------------------------------------------------` | `-----------' |---------------| - * |CapsLo| A| S| D| F| G| H| J| K| L| ;| '| #| | | 4| 5| 6| +| - * |-----------------------------------------------------------| ,---. |---------------| - * |Shif| \| Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3| | - * |-----------------------------------------------------------| ,-----------. |-----------|Ent| - * |Ctrl |Opt |Cmd | Space | |Opt |Ctrl | |Lef|Dow|Rig| | 0| .| | - * `-----------------------------------------------------------' `-----------' `---------------' - */ -#define KEYMAP_EXT_ISO( \ - K35, K7A,K78,K63,K76, K60,K61,K62,K64, K65,K6D,K67,K6F, K69,K6B,K71, K7F, \ - K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K72,K73,K74, K47,K51,K4B,K43, \ - K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,K24, K75,K77,K79, K59,K5B,K5C,K4E, \ - K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27,K2A, K56,K57,K58,K45, \ - K38,K0A,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C, K7B, K3E, K53,K54,K55, \ - K36,K3A,K37, K31, K7C,K7D, K3B,K3D,K3C, K52, K41,K4C \ -) { \ - { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ - { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ - { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ - { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \ - { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_PENT, KC_##K35, KC_##K36, KC_##K37 }, \ - { KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_NO }, \ - { KC_F17, KC_##K41, KC_NO, KC_##K43, KC_F18, KC_##K45, KC_NO, KC_##K47 }, \ - { KC_NO, KC_NO, KC_NO, KC_##K4B, KC_##K4C, KC_NO, KC_##K4E, KC_F18 }, \ - { KC_F19, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ - { KC_##K58, KC_##K59, KC_F20, KC_##K5B, KC_##K5C, KC_INT3, KC_INT1, KC_PCMM }, \ - { KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_LANG2, KC_##K67 }, \ - { KC_LANG1, KC_##K69, KC_F16, KC_##K6B, KC_NO, KC_##K6D, KC_APP, KC_##K6F }, \ - { KC_NO, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77 }, \ - { KC_##K78, KC_##K79, KC_##K7A, KC_##K7B, KC_##K7C, KC_##K7D, KC_NO, KC_##K7F } \ -} - - - - -/* M0116 Apple Standard Keyboard ANSI -* +-------+ -* | power | -* +-------+ -* +---+---+---+---+---+---+---+---+---+---+---+---+---+-----+ +---+---+---+---+ -* |esc| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | bks | |clr| = | / | * | -* +---------------------------------------------------------+ +---+---+---+---+ -* | tab | q | w | e | r | t | y | u | i | o | p | [ | ] | | | 7 | 8 | 9 | + | -* +-----------------------------------------------------+ | +---+---+---+---+ -* | ctrl | a | s | d | f | g | h | j | k | l | ; | ' |return| | 4 | 5 | 6 | - | -* +---------------------------------------------------------+ +---+---+---+---+ -* | shift | z | x | c | v | b | n | m | , | . | / | shift | | 1 | 2 | 3 | | -* +---------------------------------------------------------+ +-------+---|ent| -* |cap|opt|comnd| ` | | \ |lef|rig|dwn|up | | 0 | . | | -* +---------------------------------------------------------+ +-------+---+---+ -*/ -#define KEYMAP_M0116_ANSI( \ - K7F, \ - K35,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K47,K51,K4B,K43, \ - K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E, K59,K5B,K5C,K45, \ - K36,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27, K24, K56,K57,K58,K4E, \ - K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C, K7B, K53,K54,K55, \ - K39,K3A,K37,K32, K31, K2A,K3B,K3C,K3D,K3E, K52, K41,K4C \ -) { \ - { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ - { KC_##K08, KC_##K09, KC_NO, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ - { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ - { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \ - { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_NO, KC_##K35, KC_##K36, KC_##K37 }, \ - { KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_NO }, \ - { KC_NO, KC_##K41, KC_NO, KC_##K43, KC_NO, KC_##K45, KC_NO, KC_##K47 }, \ - { KC_NO, KC_NO, KC_NO, KC_##K4B, KC_##K4C, KC_NO, KC_##K4E, KC_NO }, \ - { KC_NO, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ - { KC_##K58, KC_##K59, KC_NO, KC_##K5B, KC_##K5C, KC_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, KC_NO , KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_NO , KC_NO, KC_NO , KC_##K7B, KC_NO, KC_NO, KC_NO, KC_##K7F } \ -} - -#endif - - -/* -ADB ANSI/ISO Keymapping Note -============================ -ANSI -,----------- ----------. -| *a| 1| 2 =|Backspa| -|----------- ----------| -|Tab | Q| | ]| *c| -|----------- ----------| -|CapsLo| A| '|Return | -|----------- ----------| -|Shift | Shift | -`----------- ----------' - -ISO -,----------- ----------. -| *a| 1| 2 =|Backspa| -|----------- ----------| -|Tab | Q| | ]|Retur| -|----------- -----` | -|CapsLo| A| '| *c| | -|----------- ----------| -|Shif| *b| Shift | -`----------- ----------' - -ADB Keyboard scan code: - ADB scan code USB usage - ------------- --------- -Key ANSI ISO ANSI ISO ---------------------------------------------- -*a 0x32 0x0A 0x35 0x35 -*b ---- 0x32 ---- 0x64 -*c 0x2A 0x2A 0x31 0x31(or 0x32) - - -TMK ADB-USB mapping: -ADB USB(ANSI) USB(ISO) ---------------------------------- -0x32 0x35 0x64 -0x0A ---- 0x35 -0x2A 0x31 0x31(or 0x32) - -Note that mappings of ADB code 0x32 are diffrent between ANSI and ISO keyboard. -https://github.com/tmk/tmk_keyboard/issues/35 - */ diff --git a/converter/adb_usb/keymap_hasu.c b/converter/adb_usb/keymap_hasu.c deleted file mode 100644 index a0b3f1fc68..0000000000 --- a/converter/adb_usb/keymap_hasu.c +++ /dev/null @@ -1,58 +0,0 @@ -#include "keymap_common.h" - - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Default Layer: plain keymap - * ,---. ,---------------. ,---------------. ,---------------. ,-----------. ,---. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| | | - * `---' `---------------' `---------------' `---------------' `-----------' `---' - * ,-----------------------------------------------------------. ,-----------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| |Ins|Hom|PgU| |NmL| =| /| *| - * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| Fn0| |Del|End|PgD| | 7| 8| 9| -| - * |-----------------------------------------------------------| `-----------' |---------------| - * |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Return | | 4| 5| 6| +| - * |-----------------------------------------------------------| ,---. |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3| | - * |-----------------------------------------------------------| ,-----------. |-----------|Ent| - * |Ctrl |Gui |Alt | Space |Alt |Gui |Ctrl | |Lef|Dow|Rig| | 0| .| | - * `-----------------------------------------------------------' `-----------' `---------------' - */ - KEYMAP_EXT_ANSI( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, NO, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,EQL, PSLS,PAST, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,FN0, DEL, END, PGDN, P7, P8, P9, PMNS, - LCAP,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, PPLS, - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, - LCTL,LGUI,LALT, SPC, RGUI,RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), - - /* Default Layer: plain keymap - * ,---. ,---------------. ,---------------. ,---------------. ,-----------. ,---. - * |` | |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| | | - * `---' `---------------' `---------------' `---------------' `-----------' `---' - * ,-----------------------------------------------------------. ,-----------. ,---------------. - * |Esc|F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Delete | |Ins|Hom|PgU| |NmL|Mb1|Mb2|Mb3| - * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U|PrS|ScL|Pau|Up |Ins| Fn0| |Del|End|PgD| |MwD|McU|MwU|MwD| - * |-----------------------------------------------------------| `-----------' |---------------| - * |CapsLo|VoD|VoU|Mut| F| G| H| J|Hom|PgU|Lef|Rig|Return | |McL|McD|McR|MwU| - * |-----------------------------------------------------------| ,---. |---------------| - * |Shift | Z| X| C| V| B| N| M|End|PgD|Dow|Shift | |PgU| |MwL|McD|MwR| | - * |-----------------------------------------------------------| ,-----------. |-----------|Mb3| - * |Ctrl |Gui |Alt | Space |Alt |Gui |Ctrl | |Hom|PgD|End| | Mb1|Mb2| | - * `-----------------------------------------------------------' `-----------' `---------------' - */ - KEYMAP_EXT_ANSI( - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, NO, - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, INS, HOME,PGUP, NLCK,BTN1,BTN2,BTN3, - TAB, Q, W, E, R, T, Y, U, PSCR,SLCK,PAUS,UP, INS, FN0, DEL, END, PGDN, WH_D,MS_U,WH_U,WH_D, - LCAP,VOLD,VOLU,MUTE,F, G, H, J, HOME,PGUP,LEFT,RGHT, ENT, MS_L,MS_D,MS_R,WH_U, - LSFT,Z, X, C, V, B, N, M, END, PGDN,DOWN, RSFT, PGUP, WH_L,MS_D,WH_R, - LCTL,LGUI,LALT, SPC, RGUI,RCTL, HOME,PGDN,END, BTN1, BTN2,BTN3 - ), -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_TAP_KEY(1, KC_BSLS), -}; diff --git a/converter/adb_usb/keymap_iso.c b/converter/adb_usb/keymap_iso.c deleted file mode 100644 index a1b1a5ebd3..0000000000 --- a/converter/adb_usb/keymap_iso.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "keymap_common.h" - - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - KEYMAP_EXT_ISO( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, NO, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PEQL,PSLS,PAST, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,ENT, DEL, END, PGDN, P7, P8, P9, PMNS, - LCAP,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NUHS, P4, P5, P6, PPLS, - LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, - LCTL,LALT,LGUI, SPC, RALT,RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), -}; - -const uint16_t PROGMEM fn_actions[] = { -}; diff --git a/converter/adb_usb/led.c b/converter/adb_usb/led.c deleted file mode 100644 index 3ee64a8e7d..0000000000 --- a/converter/adb_usb/led.c +++ /dev/null @@ -1,27 +0,0 @@ -/* -Copyright 2011 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include -#include "adb.h" -#include "led.h" - - -void led_set(uint8_t usb_led) -{ - adb_host_kbd_led(~usb_led); -} diff --git a/converter/adb_usb/matrix.c b/converter/adb_usb/matrix.c deleted file mode 100644 index 6220ee6e1c..0000000000 --- a/converter/adb_usb/matrix.c +++ /dev/null @@ -1,296 +0,0 @@ -/* -Copyright 2011 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -/* - * scan matrix - */ -#include -#include -#include -#include -#include "print.h" -#include "util.h" -#include "debug.h" -#include "adb.h" -#include "matrix.h" -#include "report.h" -#include "host.h" - - -#if (MATRIX_COLS > 16) -# error "MATRIX_COLS must not exceed 16" -#endif -#if (MATRIX_ROWS > 255) -# error "MATRIX_ROWS must not exceed 255" -#endif - - -static bool is_modified = false; -static report_mouse_t mouse_report = {}; - -// matrix state buffer(1:on, 0:off) -#if (MATRIX_COLS <= 8) -static uint8_t matrix[MATRIX_ROWS]; -#else -static uint16_t matrix[MATRIX_ROWS]; -#endif - -#ifdef MATRIX_HAS_GHOST -static bool matrix_has_ghost_in_row(uint8_t row); -#endif -static void register_key(uint8_t key); - - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -void matrix_init(void) -{ - adb_host_init(); - // wait for keyboard to boot up and receive command - _delay_ms(1000); - // Enable keyboard left/right modifier distinction - // Addr:Keyboard(0010), Cmd:Listen(10), Register3(11) - // upper byte: reserved bits 0000, device address 0010 - // lower byte: device handler 00000011 - adb_host_listen(0x2B,0x02,0x03); - - // initialize matrix state: all keys off - for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; - - debug_enable = true; - //debug_matrix = true; - //debug_keyboard = true; - //debug_mouse = true; - print("debug enabled.\n"); - return; -} - -#ifdef ADB_MOUSE_ENABLE - -#ifdef MAX -#undef MAX -#endif -#define MAX(X, Y) ((X) > (Y) ? (X) : (Y)) - -void adb_mouse_task(void) -{ - uint16_t codes; - int16_t x, y; - static int8_t mouseacc; - _delay_ms(12); // delay for preventing overload of poor ADB keyboard controller - codes = adb_host_mouse_recv(); - // If nothing received reset mouse acceleration, and quit. - if (!codes) { - mouseacc = 1; - return; - }; - // Bit sixteen is button. - if (~codes & (1 << 15)) - mouse_report.buttons |= MOUSE_BTN1; - if (codes & (1 << 15)) - mouse_report.buttons &= ~MOUSE_BTN1; - // lower seven bits are movement, as signed int_7. - // low byte is X-axis, high byte is Y. - y = (codes>>8 & 0x3F); - x = (codes>>0 & 0x3F); - // bit seven and fifteen is negative - // usb does not use int_8, but int_7 (measuring distance) with sign-bit. - if (codes & (1 << 6)) - x = (x-0x40); - if (codes & (1 << 14)) - y = (y-0x40); - // Accelerate mouse. (They weren't meant to be used on screens larger than 320x200). - x *= mouseacc; - y *= mouseacc; - // Cap our two bytes per axis to one byte. - // Easier with a MIN-function, but since -MAX(-a,-b) = MIN(a,b)... - // I.E. MIN(MAX(x,-127),127) = -MAX(-MAX(x, -127), -127) = MIN(-MIN(-x,127),127) - mouse_report.x = -MAX(-MAX(x, -127), -127); - mouse_report.y = -MAX(-MAX(y, -127), -127); - if (debug_mouse) { - print("adb_host_mouse_recv: "); print_bin16(codes); print("\n"); - print("adb_mouse raw: ["); - phex(mouseacc); print(" "); - phex(mouse_report.buttons); print("|"); - print_decs(mouse_report.x); print(" "); - print_decs(mouse_report.y); print("]\n"); - } - // Send result by usb. - host_mouse_send(&mouse_report); - // increase acceleration of mouse - mouseacc += ( mouseacc < ADB_MOUSE_MAXACC ? 1 : 0 ); - return; -} -#endif - -uint8_t matrix_scan(void) -{ - /* extra_key is volatile and more convoluted than necessary because gcc refused - to generate valid code otherwise. Making extra_key uint8_t and constructing codes - here via codes = extra_key<<8 | 0xFF; would consistently fail to even LOAD - extra_key from memory, and leave garbage in the high byte of codes. I tried - dozens of code variations and it kept generating broken assembly output. So - beware if attempting to make extra_key code more logical and efficient. */ - static volatile uint16_t extra_key = 0xFFFF; - uint16_t codes; - uint8_t key0, key1; - - is_modified = false; - - codes = extra_key; - extra_key = 0xFFFF; - - if ( codes == 0xFFFF ) - { - _delay_ms(12); // delay for preventing overload of poor ADB keyboard controller - codes = adb_host_kbd_recv(); - } - key0 = codes>>8; - key1 = codes&0xFF; - - if (debug_matrix && codes) { - print("adb_host_kbd_recv: "); phex16(codes); print("\n"); - } - - if (codes == 0) { // no keys - return 0; - } else if (codes == 0x7F7F) { // power key press - register_key(0x7F); - } else if (codes == 0xFFFF) { // power key release - register_key(0xFF); - } else if (key0 == 0xFF) { // error - xprintf("adb_host_kbd_recv: ERROR(%d)\n", codes); - return key1; - } else { - register_key(key0); - if (key1 != 0xFF) // key1 is 0xFF when no second key. - extra_key = key1<<8 | 0xFF; // process in a separate call - } - - return 1; -} - -bool matrix_is_modified(void) -{ - return is_modified; -} - -inline -bool matrix_has_ghost(void) -{ -#ifdef MATRIX_HAS_GHOST - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - if (matrix_has_ghost_in_row(i)) - return true; - } -#endif - return false; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & (1<>3)&0x0F; - if (key&0x80) { - matrix[row] &= ~(1< - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef CONFIG_H -#define CONFIG_H - -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x5C01 -#define DEVICE_VER 0x0100 -#define MANUFACTURER t.m.k. -#define PRODUCT ASCII keyboard converter -#define DESCRIPTION converts Serial Console Terminal into USB keyboard - - -/* matrix size */ -#define MATRIX_ROWS 16 -#define MATRIX_COLS 16 - -/* key combination for command */ -#define IS_COMMAND() ( \ - host_get_first_key() == KC_BRK \ -) - - -/* - * Serial(USART) configuration - * asynchronous, positive logic, 19200baud, bit order: LSB first - * 1-start bit, 8-data bit, odd parity, 1-stop bit - */ -#ifdef __AVR_ATmega32U4__ - #define SERIAL_UART_BAUD 19200 - #define SERIAL_UART_DATA UDR1 - #define SERIAL_UART_UBRR ((F_CPU/(16UL*SERIAL_UART_BAUD))-1) - #define SERIAL_UART_RXD_VECT USART1_RX_vect - #define SERIAL_UART_TXD_READY (UCSR1A&(1<>8); /* baud rate */ \ - UCSR1B |= (1< - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include -#include -#include "keycode.h" -#include "action.h" -#include "action_macro.h" -#include "action_util.h" -#include "util.h" -#include "print.h" -#include "keymap.h" - - -// Keymap is not used. See matrix.c. - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return KC_NO; -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t) { .code = ACTION_NO }; -} diff --git a/converter/ascii_usb/led.c b/converter/ascii_usb/led.c deleted file mode 100644 index d1c39bc653..0000000000 --- a/converter/ascii_usb/led.c +++ /dev/null @@ -1,25 +0,0 @@ -/* -Copyright 2012 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include "stdint.h" -#include "serial.h" -#include "led.h" - - -void led_set(uint8_t usb_led) -{ -} diff --git a/converter/ascii_usb/matrix.c b/converter/ascii_usb/matrix.c deleted file mode 100644 index e1ea8e0ab8..0000000000 --- a/converter/ascii_usb/matrix.c +++ /dev/null @@ -1,195 +0,0 @@ -/* -Copyright 2014 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include -#include -#include -#include "print.h" -#include "util.h" -#include "matrix.h" -#include "debug.h" -#include "action_util.h" -#include "protocol/serial.h" - - -/* - * Not use Matrix. - * - * ROW: 16(4bits) - * COL: 16(4bits) - * - * 8bit wide - * +---------+ - * 0|00 ... 0F| - * 1|08 ... 1F| - * :| ... | - * :| ... | - * E|E0 ... EF| - * F|F0 ... FF| - * +---------+ - */ - - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -void matrix_init(void) -{ - debug_matrix = true; - serial_init(); - - debug("init\n"); - return; -} - -static void type_key(uint16_t keycode) -{ - if (keycode == 0) return; - - uint8_t mods = keycode>>8; - uint8_t key = keycode&0xFF; - if (mods) { - add_mods(mods); - send_keyboard_report(); - } - - add_key(key); - send_keyboard_report(); - - del_key(key); - send_keyboard_report(); - - if (mods) { - del_mods(mods); - send_keyboard_report(); - } -} -static uint16_t code2key(uint8_t code) -{ - // ASCII to key combination in US laout - switch (code) { - case 0x01 ... 0x08: // Ctrl-[a-z] - return MOD_BIT(KC_LCTRL)<<8 | (KC_A + (code-0x01)); - case 0x09: return KC_TAB; // TAB(Ctrl-i) - case 0x0A ... 0x0C: // Ctrl-[a-z] - return MOD_BIT(KC_LCTRL)<<8 | (KC_A + (code-0x01)); - case 0x0D: return KC_ENTER; // Enter(Ctrl-m) - case 0x0E ... 0x1A: // Ctrl-[a-z] - return MOD_BIT(KC_LCTRL)<<8 | (KC_A + (code-0x01)); - case 0x1B: return KC_ESC; - case 0x1C: return KC_RIGHT; - case 0x1D: return KC_LEFT; - case 0x1E: return KC_UP; - case 0x1F: return KC_DOWN; - case 0x20: return KC_SPACE; - case 0x21: return MOD_BIT(KC_LSHIFT)<<8 | KC_1; // ! - case 0x22: return MOD_BIT(KC_LSHIFT)<<8 | KC_QUOTE; // " - case 0x23: return MOD_BIT(KC_LSHIFT)<<8 | KC_3; // # - case 0x24: return MOD_BIT(KC_LSHIFT)<<8 | KC_4; // $ - case 0x25: return MOD_BIT(KC_LSHIFT)<<8 | KC_5; // % - case 0x26: return MOD_BIT(KC_LSHIFT)<<8 | KC_7; // & - case 0x27: return KC_QUOTE; // ' - case 0x28: return MOD_BIT(KC_LSHIFT)<<8 | KC_9; // ( - case 0x29: return MOD_BIT(KC_LSHIFT)<<8 | KC_0; // ) - case 0x2A: return MOD_BIT(KC_LSHIFT)<<8 | KC_8; // * - case 0x2B: return MOD_BIT(KC_LSHIFT)<<8 | KC_EQUAL; // + - case 0x2C: return KC_COMMA; // , - case 0x2D: return KC_MINUS; // - - case 0x2E: return KC_DOT; // . - case 0x2F: return KC_SLASH; // / - case 0x30: return KC_0; - case 0x31 ... 0x39: // 1-9 - return KC_1 + (code-0x31); - case 0x3A: return MOD_BIT(KC_LSHIFT)<<8 | KC_SCLN; // : - case 0x3B: return KC_SCLN; // ; - case 0x3C: return MOD_BIT(KC_LSHIFT)<<8 | KC_COMMA; // < - case 0x3D: return KC_EQUAL; // = - case 0x3E: return MOD_BIT(KC_LSHIFT)<<8 | KC_DOT; // > - case 0x3F: return MOD_BIT(KC_LSHIFT)<<8 | KC_SLASH; // ? - case 0x40: return MOD_BIT(KC_LSHIFT)<<8 | KC_2; // @ - case 0x41 ... 0x5A: // A-Z - return MOD_BIT(KC_LSHIFT)<<8 | (KC_A + (code-0x41)); - case 0x5B: return KC_LBRACKET; // [ - case 0x5C: return KC_BSLASH; // - case 0x5D: return KC_RBRACKET; // ] - case 0x5E: return MOD_BIT(KC_LSHIFT)<<8 | KC_6; // ^ - case 0x5F: return MOD_BIT(KC_LSHIFT)<<8 | KC_MINUS; // _ - case 0x61 ... 0x7A: // a-z - return KC_A + (code-0x61); - case 0x7B: return MOD_BIT(KC_LSHIFT)<<8 | KC_LBRACKET; // { - case 0x7C: return MOD_BIT(KC_LSHIFT)<<8 | KC_BSLASH; // | - case 0x7D: return MOD_BIT(KC_LSHIFT)<<8 | KC_RBRACKET; // } - case 0x7E: return MOD_BIT(KC_LSHIFT)<<8 | KC_GRAVE; // } - case 0x7F: return KC_DELETE; // - } - return 0; -} - -uint8_t matrix_scan(void) -{ - uint16_t code = serial_recv2(); - if (code == -1) { - return 0; - } - - print_hex8(code); print(" "); - - // echo back - serial_send(code); - type_key(code2key(code)); - - - return code; -} - -inline -bool matrix_has_ghost(void) -{ - return false; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return false; -} - -inline -matrix_row_t matrix_get_row(uint8_t row) -{ - return 0; -} - -void matrix_print(void) -{ - print("\nr/c 0123456789ABCDEF\n"); - for (uint8_t row = 0; row < matrix_rows(); row++) { - phex(row); print(": "); - pbin_reverse(matrix_get_row(row)); - print("\n"); - } -} diff --git a/converter/ibm4704_usb/Makefile b/converter/ibm4704_usb/Makefile deleted file mode 100644 index b5c97d2d31..0000000000 --- a/converter/ibm4704_usb/Makefile +++ /dev/null @@ -1,93 +0,0 @@ -# Target file name (without extension). -TARGET = ibm4704_usb - -# Directory common source filess exist -TMK_DIR = ../../tmk_core - -# Directory keyboard dependent files exist -TARGET_DIR = . - -# project specific files -SRC = keymap_common.c \ - matrix.c \ - led.c \ - protocol/ibm4704.c - -ifdef KEYMAP - SRC := keymap_$(KEYMAP).c $(SRC) -else - SRC := keymap_plain.c $(SRC) -endif - -CONFIG_H = config.h - - -# MCU name -#MCU = at90usb1287 -MCU = atmega32u4 - -# Processor frequency. -# This will define a symbol, F_CPU, in all source code files equal to the -# processor frequency in Hz. You can then use this symbol in your source code to -# calculate timings. Do NOT tack on a 'UL' at the end, this will be done -# automatically to create a 32-bit value in your source code. -# -# This will be an integer division of F_USB below, as it is sourced by -# F_USB after it has run through any CPU prescalers. Note that this value -# does not *change* the processor frequency - it should merely be updated to -# reflect the processor speed set externally so that the code can use accurate -# software delays. -F_CPU = 16000000 - - -# -# LUFA specific -# -# Target architecture (see library "Board Types" documentation). -ARCH = AVR8 - -# Input clock frequency. -# This will define a symbol, F_USB, in all source code files equal to the -# input clock frequency (before any prescaling is performed) in Hz. This value may -# differ from F_CPU if prescaling is used on the latter, and is required as the -# raw input clock is fed directly to the PLL sections of the AVR for high speed -# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' -# at the end, this will be done automatically to create a 32-bit value in your -# source code. -# -# If no clock division is performed on the input clock inside the AVR (via the -# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. -F_USB = $(F_CPU) - -# Interrupt driven control endpoint task(+60) -OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT - - -# Boot Section Size in *bytes* -# Teensy halfKay 512 -# Teensy++ halfKay 1024 -# Atmel DFU loader 4096 -# LUFA bootloader 4096 -# USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 - - -# Build Options -# comment out to disable the options. -# -#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = yes # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration -#NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA - - -# Search Path -VPATH += $(TARGET_DIR) -VPATH += $(TMK_DIR) - -include $(TMK_DIR)/protocol.mk -include $(TMK_DIR)/protocol/lufa.mk -include $(TMK_DIR)/common.mk -include $(TMK_DIR)/rules.mk diff --git a/converter/ibm4704_usb/README.md b/converter/ibm4704_usb/README.md deleted file mode 100644 index 68db4bd050..0000000000 --- a/converter/ibm4704_usb/README.md +++ /dev/null @@ -1,72 +0,0 @@ -IBM 4704 to USB keyboard converter -================================== -This firmware converts IBM 4704 keyboard protocol to USB HID. - -Keyboard initialization process takes a few seconds at start up. During that you will hear buzzer from the keyboard. **You need to plug USB cable after hooking up your keyboard to the converter.** - - -Update ------- -2015/09/07 Added keymap for Alps 102-key. Thanks, tai @ geekhack! -2015/05/05 Added keymaps for 107-key, 77-key and 50-key. Thanks, orihalcon @ geekhack! -2015/05/19 Fixed a protocol handling bug. - - - -Supported Keyboard ------------------- -### IBM capacitive switch models: -- 6019273 Model 100 50-key (grid layout) http://kishy.ca/?p=894 -- 6019284 Model 200 62-key Alpha(60% layout) http://kishy.ca/?p=894 -- 6019303 Model 300 77-key Expanded Alpha http://deskthority.net/photos-f62/ibm-6019303-t8502.html -- 6020218 Model 400 107-key Full key http://kishy.ca/?p=894 - -### Alps switch(vintage Green) models: - -- 5954339 Japanese 102-key http://deskthority.net/post87127.html#p87127 -- 6112883 Japanese 102-key http://geekhack.org/index.php?topic=52888.msg1194489#msg1194489 -- 6112884 Japanese 102-key http://geekhack.org/index.php?topic=50437.msg1193047#msg1193047 -- 6341739 Chinese 102-key http://geekhack.org/index.php?topic=52888.msg1176566#msg1176566 - - -Connector ---------- -Keyboard Plug from front: - - DSUB-9 - ------------- - \ N 2 3 4 5 / - \ N N N N / - --------- - 2 GND - 3 VCC 5V - 4 DATA - 5 CLOCK - N No connection/No pin. - - -Connection ----------- -In case of using ATMega32U4(Teensy2.0): - -1. Supply power with VCC and GND. -2. Connect CLOCK to PD1 and DATA to PD0. You can change pin with config.h. -3. Optionally you may need pull-up register. 1KOhm probably work. - - -Build Firmware --------------- -Just run `make`: - - $ make - -To select keymap: - - $ make KEYMAP=[plain|...] - - -Keymap ------- -Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_.c` and see keymap document(you can find in top README.md) and existent keymap files. - -Use `KEYMAP_ALPS102()` to define your keymap for Alps models. diff --git a/converter/ibm4704_usb/config.h b/converter/ibm4704_usb/config.h deleted file mode 100644 index 2fee10fd61..0000000000 --- a/converter/ibm4704_usb/config.h +++ /dev/null @@ -1,61 +0,0 @@ -/* -Copyright 2014 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef CONFIG_H -#define CONFIG_H - -#include - -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x4707 -#define DEVICE_VER 0x0001 -#define MANUFACTURER t.m.k. -#define PRODUCT IBM 4704 keyboard converter -#define DESCRIPTION convert IBM 4704 keyboard to USB - - -/* matrix size */ -#define MATRIX_ROWS 16 // keycode bit3-6 -#define MATRIX_COLS 8 // keycode bit0-2 - - -/* key combination for command */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LCTRL) | MOD_BIT(KC_RCTRL)) || \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ -) - - - -/* Pin configuration */ -#define IBM4704_CLOCK_PORT PORTD -#define IBM4704_CLOCK_PIN PIND -#define IBM4704_CLOCK_DDR DDRD -#define IBM4704_CLOCK_BIT 1 -#define IBM4704_DATA_PORT PORTD -#define IBM4704_DATA_PIN PIND -#define IBM4704_DATA_DDR DDRD -#define IBM4704_DATA_BIT 0 - -/* Pin interrupt on rising edge of clock */ -#define IBM4704_INT_INIT() do { EICRA |= ((1<| Z| X| C| V| B| N| M| ,| ,| /|???|Shift | - |-----------------------------------------------------------| - |Reset|blk|Alt | Space |Alt |blk|Enter| - `-----------------------------------------------------------' - +----------+---------------------+----------+----------+ - |` 00|PD1 04|Caps 20|LShift 30|Reset 31| - |1 18|q 05|a 21|<> 3E|Rblank 41| - |2 19|w 06|s 22|z 32|Alt 3F| - |3 1A|e 13|d 23|x 33|Space 40| - |4 10|r 14|f 24|c 34|Alt 3F| - |5 11|t 15|g 25|v 35|Lblank 42| - |6 12|y 16|h 26|b 36|Enter 2F| - |7 08|u 17|j 27|n 37| | - |8 09|i 01|k 28|m 38| | - |9 0A|o 02|l 29|, 39| | - |0 0F|p 03|; 2A|. 3A| | - |- 1F|¢ 1B|' 2B|/ 3B| | - |= 0D|\ 1C|{} 2C|??? 3C| | - |??? 0C|PD2 1D|PD3 2D|RShift 3D| | - |BS 0E| | | | | - +----------+---------------------+----------+----------+ - Bit7 is 'press flag' which set 1 on press and 0 on release when break code is enabled. - -NOTE: When break code is enabled the key sends scancode with setting 7th bit on press -and without it on release. That is, '`' sends 80h on press and 00h on release. - - -Keyboard command ----------------- -Keyboard accepts these commands from host. - - Description Entry point - ----------------------------------------------------------- - FF Soft Reset 0008h - FE Resend 00e8h - FD Buzzer(emits a short beep) 00edh - FC Set Key Flag 00f6h - FB Soft Reset 0008h - FA Reset 0000h - - -Keyboard response ------------------ -Keyobard sends these bytes to host. - - Description Entry point - ----------------------------------------------------------- - FE Overflow(key event/receive data) 00c5h, 0346h - Memory test error 0224h - FD Command out of bound 00d8h - Key out of bound - 7E Read/Parity error in receive from host 00bch - - -Set Key Flag command(FC) ------------------------- -After 'Power on Reset' firmware enters this command mode and waits for data from host, -so that you don't need to send 'FC' and it doesn't send any scancode until you send 'FF'. - -Data sent from host: - - bit: 7 6 ... 0 - en | | - | `-----`--- scan code - `------------- enable bit(0: enable repeat, 1: enable break) - - 00-79 Enable repeat - 80-F9 Enable break(FA-FF are used as other commands, see above.) - FE Resend(011ah) no need to use - FF End(0114h) exits FC command mode. - -Response from keyboard: - FD Out of bound - Invalid scancode - -- OK - No response means that command is accepted. - -Examples: - To enable break code of all keys. - - FC 80 81 ... F7 FF - diff --git a/converter/ibm4704_usb/keymap_50key.c b/converter/ibm4704_usb/keymap_50key.c deleted file mode 100644 index 97294fb45d..0000000000 --- a/converter/ibm4704_usb/keymap_50key.c +++ /dev/null @@ -1,17 +0,0 @@ -#include "keymap_common.h" - - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - KEYMAP_50( - F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, \ - 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, \ - Q, W, E, R, T, Y, U, I, O, P, \ - A, S, D, F, G, H, J, K, L, SCLN, \ - Z, X, C, V, B, N, M, COMM,DOT, SLSH \ - ), -}; - -const uint16_t PROGMEM fn_actions[] = { -}; - - diff --git a/converter/ibm4704_usb/keymap_alps102key.c b/converter/ibm4704_usb/keymap_alps102key.c deleted file mode 100644 index f3dda718ac..0000000000 --- a/converter/ibm4704_usb/keymap_alps102key.c +++ /dev/null @@ -1,50 +0,0 @@ -#include "keymap_common.h" - - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Layer 0: - * ,---------------------------------------------------------------. ,-----------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|BS |BS |F21| |PSC|SLK|PAU| |F1 |F2 |F3 |F4 | - * |---------------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \|F22| |Ins|Hom|PgU| |F5 |F6 |F7 |F8 | - * |---------------------------------------------------------------| |-----------| |---------------| - * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '|Ret|Ret |F23| |Del|End|PgD| |F9 |F10|F11|F12| - * |---------------------------------------------------------------| |-----------| |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shf|Shift |F24| | |Up | | |F13|F14|F15|F16| - * |---------------------------------------------------------------| |-----------| |---------------| - * |Fn0 |Gui|Alt | Space |Alt* |Gui|Fn0 | |Lef|Dow|Rig| |F17|F18|F19|F20| - * `---------------------------------------------------------------' `-----------' `---------------' - */ - KEYMAP_ALPS102( - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC,BSPC,F21, PSCR,SLCK,PAUS, F1, F2, F3, F4, \ - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, F22, INS, HOME,PGUP, F5, F6, F7, F8, \ - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,GRV, ENT, F23, DEL, END, PGDN, F9, F10, F11, F12, \ - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RSFT,RSFT, F24, NO, UP, NO, F13, F14, F15, F16, \ - FN0, LGUI,LALT, SPC, RALT,RGUI, FN0, LEFT,DOWN,RGHT, F17, F18, F19, F20 \ - ), - - /* Layer 1: - * ,---------------------------------------------------------------. ,-----------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|BS |BS |F21| |VoD|VoU|Mut| |F1 |F2 |F3 |F4 | - * |---------------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \|F22| |Ins|Hom|PgU| |F5 |F6 |F7 |F8 | - * |---------------------------------------------------------------| |-----------| |---------------| - * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '|Ret|Ret |F23| |Del|End|PgD| |F9 |F10|F11|F12| - * |---------------------------------------------------------------| |-----------| |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shf|Shift |F24| | |PgU| | |F13|F14|F15|F16| - * |---------------------------------------------------------------| |-----------| |---------------| - * |Fn0 |Gui|Alt | Space |Alt* |Gui|Fn0 | |Hom|PgD|End| |F17|F18|F19|F20| - * `---------------------------------------------------------------' `-----------' `---------------' - */ - KEYMAP_ALPS102( - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, VOLD,VOLU,MUTE, TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,PGUP,TRNS, TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS, TRNS, TRNS,TRNS, TRNS, HOME,PGDN,END, TRNS,TRNS,TRNS,TRNS \ - ), -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_MOMENTARY(1), -}; diff --git a/converter/ibm4704_usb/keymap_common.c b/converter/ibm4704_usb/keymap_common.c deleted file mode 100644 index 55a13793cb..0000000000 --- a/converter/ibm4704_usb/keymap_common.c +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright 2011,2012,2013 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#include "keymap_common.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/converter/ibm4704_usb/keymap_common.h b/converter/ibm4704_usb/keymap_common.h deleted file mode 100644 index 9cb23b0b83..0000000000 --- a/converter/ibm4704_usb/keymap_common.h +++ /dev/null @@ -1,146 +0,0 @@ -/* -Copyright 2011,2012,2013 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#ifndef KEYMAP_COMMON_H -#define KEYMAP_COMMON_H - -#include -#include -#include -#include "keycode.h" -#include "action.h" -#include "action_macro.h" -#include "report.h" -#include "print.h" -#include "debug.h" -#include "keymap.h" - - -// 32*8(256) byte array which converts PS/2 code into USB code -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - -/* 107-key */ -#define KEYMAP( \ - K46,K64, K00,K18,K19,K1A,K10,K11,K12,K08,K09,K0A,K0F,K1F,K0D,K0C,K0E, K6A,K6B,K6C, K47,K48,K49,K4A, \ - K56,K66, K04,K05,K06,K13,K14,K15,K16,K17,K01,K02,K03,K1B,K1C,K1D, K6D,K6E,K6F, K4B,K4C,K4D,K4E, \ - K71,K77, K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K2A,K2B,K2C,K2D, K70,K65,K72, K50,K51,K52,K53, \ - K44,K45, K30,K3E,K32,K33,K34,K35,K36,K37,K38,K39,K3A,K3B,K3C,K3D, K74,K75,K76, K5E,K58,K59,K5A, \ - K54,K55, K31,K41,K3F, K40, K42,K2F, K78,K67,K79, K5B,K5C,K5D,K57 \ -) { \ - { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_NO }, \ - { KC_##K08, KC_##K09, KC_##K0A, KC_NO, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ - { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_NO, KC_##K1F }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ - { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_NO, KC_##K2F }, \ - { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37 }, \ - { KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_##K3F }, \ - { KC_##K40, KC_##K41, KC_##K42, KC_NO, KC_##K44, KC_##K45, KC_##K46, KC_##K47 }, \ - { KC_##K48, KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D, KC_##K4E, KC_NO }, \ - { KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ - { KC_##K58, KC_##K59, KC_##K5A, KC_##K5B, KC_##K5C, KC_##K5D, KC_##K5E, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_##K64, KC_##K65, KC_##K66, KC_##K67 }, \ - { KC_NO, KC_NO, KC_##K6A, KC_##K6B, KC_##K6C, KC_##K6D, KC_##K6E, KC_##K6F }, \ - { KC_##K70, KC_##K71, KC_##K72, KC_NO, KC_##K74, KC_##K75, KC_##K76, KC_##K77 }, \ - { KC_##K78, KC_##K79, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ -} - -/* 77-key */ -#define KEYMAP_77( \ - K00,K18,K19,K1A,K10,K11,K12,K08,K09,K0A,K0F,K1F,K0D,K0C,K0E, K6A,K6B,K6C, \ - K04,K05,K06,K13,K14,K15,K16,K17,K01,K02,K03,K1B,K1C,K1D, K6D,K6E,K6F, \ - K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K2A,K2B,K2C,K2D, K70,K65,K72, \ - K30,K3E,K32,K33,K34,K35,K36,K37,K38,K39,K3A,K3B,K3C,K3D, K74,K75,K76, \ - K31,K41,K3F, K40, K42,K2F, K78,K67,K79 \ -) KEYMAP( \ - F1, F2, K00,K18,K19,K1A,K10,K11,K12,K08,K09,K0A,K0F,K1F,K0D,K0C,K0E, K6A,K6B,K6C, NLCK,PSLS,PAST,PMNS, \ - F3, F4, K04,K05,K06,K13,K14,K15,K16,K17,K01,K02,K03,K1B,K1C,K1D, K6D,K6E,K6F, P7, P8, P9, PPLS, \ - F5, F6, K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K2A,K2B,K2C,K2D, K70,K65,K72, P4, P5, P6, PPLS, \ - F7, F8, K30,K3E,K32,K33,K34,K35,K36,K37,K38,K39,K3A,K3B,K3C,K3D, K74,K75,K76, P1, P2, P3, PENT, \ - F9, F10, K31,K41,K3F, K40, K42,K2F, K78,K67,K79 P0, P0, PDOT,PENT \ -) - -/* 62-key */ -#define KEYMAP_62( \ - K00,K18,K19,K1A,K10,K11,K12,K08,K09,K0A,K0F,K1F,K0D,K0C,K0E, \ - K04,K05,K06,K13,K14,K15,K16,K17,K01,K02,K03,K1B,K1C,K1D, \ - K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K2A,K2B,K2C,K2D, \ - K30,K3E,K32,K33,K34,K35,K36,K37,K38,K39,K3A,K3B,K3C,K3D, \ - K31,K41,K3F, K40, K42,K2F \ -) KEYMAP( \ - F1, F2, K00,K18,K19,K1A,K10,K11,K12,K08,K09,K0A,K0F,K1F,K0D,K0C,K0E, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, \ - F3, F4, K04,K05,K06,K13,K14,K15,K16,K17,K01,K02,K03,K1B,K1C,K1D, DEL, END, PGDN, P7, P8, P9, PPLS, \ - F5, F6, K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K2A,K2B,K2C,K2D, PSCR,SLCK,PAUS, P4, P5, P6, PPLS, \ - F7, F8, K30,K3E,K32,K33,K34,K35,K36,K37,K38,K39,K3A,K3B,K3C,K3D, F11, UP, F12, P1, P2, P3, PENT, \ - F9, F10, K31,K41,K3F, K40, K42,K2F, LEFT,DOWN,RGHT, P0, P0, PDOT,PENT \ -) - -/* 50-key */ -#define KEYMAP_50( \ - K00,K01,K02, K03,K04,K05, K20,K21,K22,K23, \ - K08,K09,K0A, K0B,K0C,K0D, K28,K29,K2A,K35, \ - K10,K11,K12, K13,K14,K15, K30,K31,K32,K36, \ - K18,K19,K1A, K1B,K1C,K1D, K38,K39,K3A,K37, \ - K16,K1E,K0E, K0F,K1F,K17, K33,K3B,K2B,K3F \ -) { \ - { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_NO, KC_NO, }, \ - { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ - { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_NO, KC_NO, KC_NO, KC_NO, }, \ - { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_NO, KC_NO, KC_NO, KC_NO, }, \ - { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_NO, KC_##K35, KC_##K36, KC_##K37 }, \ - { KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_NO, KC_NO, KC_NO, KC_##K3F }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, } \ -} - -/* Alps 102-key */ -#define KEYMAP_ALPS102( \ - K00, K0F, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K44, K45, K46, K43, K41, K42, K4A, \ - K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K54, K55, K56, K50, K51, K52, K5A, \ - K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K64, K65, K66, K60, K61, K62, K6B, \ - K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, K74, K75, K76, K70, K71, K72, K7B, \ - K31, K47, K3F, K40, K4F, K48, K2F, K77, K67, K57, K73, K63, K53, K4E \ -) { \ - { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ - { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ - { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_NO, }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ - { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \ - { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37 }, \ - { KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_##K3F }, \ - { KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_##K47 }, \ - { KC_##K48, KC_NO, KC_##K4A, KC_NO, KC_NO, KC_NO, KC_##K4E, KC_##K4F }, \ - { KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ - { KC_NO, KC_NO, KC_##K5A, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, }, \ - { KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67 }, \ - { KC_NO, KC_NO, KC_NO, KC_##K6B, KC_NO, KC_NO, KC_NO, KC_NO, }, \ - { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77 }, \ - { KC_NO, KC_NO, KC_NO, KC_##K7B, KC_NO, KC_NO, KC_NO, KC_NO, } \ -} - - -#endif diff --git a/converter/ibm4704_usb/keymap_hasu.c b/converter/ibm4704_usb/keymap_hasu.c deleted file mode 100644 index 14c171179c..0000000000 --- a/converter/ibm4704_usb/keymap_hasu.c +++ /dev/null @@ -1,85 +0,0 @@ -#include "keymap_common.h" - - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: default - * ,-----------------------------------------------------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|???|BS | - * |-----------------------------------------------------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| - * |-----------------------------------------------------------| - * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '|xxx|Ret | - * |-----------------------------------------------------------| - * |Shif|xxx| Z| X| C| V| B| N| M| ,| ,| /|xxx|Shift | - * |-----------------------------------------------------------| - * |Ctrl |Gui|Alt | Space |Alt |Gui|Ctrl | - * `-----------------------------------------------------------' - */ - KEYMAP_62( - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, \ - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \ - LCTL,A, S, D, F, G, H, J, K, L, FN1, QUOT,NO, ENT, \ - LSFT,NO, Z, X, C, V, B, N, M, COMM,DOT, FN2, NO, FN0, \ - LCTL,LGUI,LALT, FN3, RGUI,RCTL \ - ), - - KEYMAP_62( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,PAUS, UP, NO, BSPC, \ - LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,NO, ENT, \ - LSFT,NO, NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,NO, TRNS, \ - LCTL,LGUI,LALT, SPC, RGUI,RCTL \ - ), - - KEYMAP_62( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,WSTP,WBAK,WFWD,BSPC, \ - LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,TRNS,NO, NO, ENT, \ - LSFT,NO, NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, NO, RSFT,\ - LCTL,LGUI,LALT, BTN1, RGUI,RCTL \ - ), - - KEYMAP_62( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, BSPC, \ - LCTL,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, NO, ENT, \ - LSFT,NO, NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, TRNS,NO, RSFT, \ - LCTL,LGUI,LALT, SPC, RGUI,RCTL \ - ), - - KEYMAP_62( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - TAB, NO, NO, NO, NO, NO, WH_L,WH_D,MS_U,WH_U,WH_R,BTN4,BTN5,FN4, \ - LCTL,VOLD,VOLU,MUTE,NO, NO, BTN2,MS_L,MS_D,MS_R,BTN1,NO, NO, ENT, \ - LSFT,NO, NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, NO, NO, \ - LCTL,LGUI,LALT, TRNS, RGUI,RCTL \ - ), -}; - -enum macro_id { - ALT_TAB, -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_MOMENTARY(1), - [1] = ACTION_LAYER_TAP_KEY(2, KC_SCLN), - [2] = ACTION_LAYER_TAP_KEY(3, KC_SLASH), - [3] = ACTION_LAYER_TAP_KEY(4, KC_SPC), - [4] = ACTION_MACRO(ALT_TAB), -}; - -/* - * Macro definition - */ -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - keyevent_t event = record->event; - - switch (id) { - case ALT_TAB: - return (event.pressed ? - MACRO( D(LALT), D(TAB), END ) : - MACRO( U(TAB), END )); - } - return MACRO_NONE; -} diff --git a/converter/ibm4704_usb/keymap_plain.c b/converter/ibm4704_usb/keymap_plain.c deleted file mode 100644 index 4aed684e4c..0000000000 --- a/converter/ibm4704_usb/keymap_plain.c +++ /dev/null @@ -1,50 +0,0 @@ -#include "keymap_common.h" - - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: default - * ,-----------------------------------------------------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|???|BS | - * |-----------------------------------------------------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| - * |-----------------------------------------------------------| - * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '|Ret|Ret | - * |-----------------------------------------------------------| - * |Shif|Shf| Z| X| C| V| B| N| M| ,| ,| /|???|Shift | - * |-----------------------------------------------------------| - * |Ctrl |Gui|Alt | Space |Alt* |Gui|Fn | - * `-----------------------------------------------------------' - */ - KEYMAP( - F1, F2, GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, NO, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, \ - F3, F4, TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, PPLS, \ - F5, F6, LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,ENT, ENT, PSCR,SLCK,PAUS, P4, P5, P6, PPLS, \ - F7, F8, LSFT,LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH,NO, RSFT, F11, UP, F12, P1, P2, P3, PENT, \ - F9, F10, LCTL,LGUI,LALT, SPC, RGUI,FN0, LEFT,DOWN,RGHT, P0, P0, PDOT,PENT \ - ), - - /* 1: HHKB - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|???|Del| - * |-----------------------------------------------------------| - * |Caps | | | | | | | |Psc|Slk|Pau| Up| | Ins| - * |-----------------------------------------------------------| - * |Ctrl |VoD|VoU|VoM| | | *| /|Hom|PgU|Lef|Rig|Ret|Ret | - * |-----------------------------------------------------------| - * |Shif|Shi| | | | | | +| -|End|PgD|Dow|???|Shift | - * |-----------------------------------------------------------| - * |Ctrl |Gui|Alt | Space |Alt* |Gui|Fn | - * `-----------------------------------------------------------' - */ - KEYMAP( - F1, F2, ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, NO, DEL, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, \ - F3, F4, CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,PAUS, UP, NO, INS, DEL, END, PGDN, P7, P8, P9, PPLS, \ - F5, F6, TRNS,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, ENT, PSCR,SLCK,PAUS, P4, P5, P6, PPLS, \ - F7, F8, TRNS,TRNS,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,NO, TRNS, F11, UP, F12, P1, P2, P3, PENT, \ - F9, F10, TRNS,TRNS,TRNS, TRNS, TRNS,TRNS, LEFT,DOWN,RGHT, P0, P0, PDOT,PENT \ - ), -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_MOMENTARY(1), -}; diff --git a/converter/ibm4704_usb/led.c b/converter/ibm4704_usb/led.c deleted file mode 100644 index f76545f0ba..0000000000 --- a/converter/ibm4704_usb/led.c +++ /dev/null @@ -1,24 +0,0 @@ -/* -Copyright 2011 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include "stdint.h" -#include "led.h" - - -void led_set(uint8_t usb_led) -{ -} diff --git a/converter/ibm4704_usb/matrix.c b/converter/ibm4704_usb/matrix.c deleted file mode 100644 index 5b91d49f81..0000000000 --- a/converter/ibm4704_usb/matrix.c +++ /dev/null @@ -1,162 +0,0 @@ -/* -Copyright 2014 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include -#include -#include -#include "action.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "ibm4704.h" -#include "matrix.h" - - -static void matrix_make(uint8_t code); -static void matrix_break(uint8_t code); -static void matrix_clear(void); - - -/* - * Matrix Array usage: - * IBM 4704 scan codes are assigned into 128(16x8)-cell matrix. - * - * 8bit wide - * +---------+ - * 0| | - * :| XX | 00-7F - * f| | - * +---------+ - * - * Exceptions: - */ -static uint8_t matrix[MATRIX_ROWS]; - -// scan code bits 7654 3210 -// R:row/C:column -RRR RCCC -#define ROW(code) ((code>>3)&0x0f) -#define COL(code) (code&0x07) - - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -static void enable_break(void) -{ - print("Enable break: "); - while (ibm4704_send(0xFC)) { _delay_ms(10); } - // valid scancode: 00-79h - for (uint8_t code = 0; code < 0x7F; code++) { - while (ibm4704_send(0x80|code)) _delay_ms(10); - _delay_ms(5); // wait for response - // No response(FF) when ok, FD when out of bound - xprintf("s%02X:r%02X ", code, ibm4704_recv()); - } - while (ibm4704_send(0xFF)) { _delay_ms(10); } // End - print("End\n"); -} - - -void matrix_setup(void) -{ - ibm4704_init(); -} - -void matrix_init(void) -{ - debug_enable = true; - - print("IBM 4704 converter\n"); - matrix_clear(); - _delay_ms(2000); // wait for keyboard starting up - xprintf("Keyboard ID: %02X\n", ibm4704_recv()); - enable_break(); -} - -/* - * IBM 4704 Scan Code - */ -uint8_t matrix_scan(void) -{ - uint8_t code = ibm4704_recv(); - if (code==0xFF) { - // Not receivd - return 0; - } else if ((code&0x7F) >= 0x7A) { - // 0xFF-FA and 0x7F-7A is not scancode - xprintf("Error: %02X\n", code); - matrix_clear(); - return 0; - } else if (code&0x80) { - dprintf("%02X\n", code); - matrix_make(code); - } else { - dprintf("%02X\n", code); - matrix_break(code); - } - return 1; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & (1< - -Close-up picture of handset cable. You can see one end of plug has reverse color codes against the other. Click to enlarge. -[![4P4C cable](http://i.imgur.com/3S9P1mYm.jpg?1)](http://i.imgur.com/3S9P1mY.jpg?1) - -[Teensy]: http://www.pjrc.com/teensy/ -[TMK converter]: https://github.com/tmk/keyboard_converter - - -### Socket Pinout -- - -![Jack fig](http://www.kbdbabel.org/conn/kbd_connector_macplus.png) - - -### Pull-up Resistor -You may need pull-up resistors on signal lines(`CLOCK`, `DATA`) in particular when you have long or coiled cable. **1k-10k Ohm** will be OK for this purpose. In that case the converter may not read signal from keyboard correctly without pull-up resistors. - - - -Building Firmware ------------------ -To compile firmware you need AVR GCC. You can edit *Makefile* and *config.h* to change compile options and pin configuration. Also `KEYMAP` option can be used to select keymap. - - $ git clone git://github.com/tmk/tmk_keyboard.git (or download source) - $ cd m0110_usb - $ make -f Makefile.rev2 clean - $ make -f Makefile.rev2 [KEYMAP={default|intl|spacefn|hasu}] - -Use `Maefile.tmk_rev1` for TMK converter Rev.1, `Makefile.teensy` for Teensy instead. - - - -Keymap ------- -To create your own keymap copy existent keymap file to `keymap_name.c` and edit it. - - - -Debug ------ -You can use [PJRC HID listen](http://www.pjrc.com/teensy/hid_listen.html) to see debug output. The converter has some functions for debug, press `+H` simultaneously to get help. - -- Magic combo: `Shift+Option+⌘` or `Shift+Option+Ctrl`(`Shift+Alt+Gui` or `Shift+Alt+Control`) diff --git a/converter/m0110_usb/config.h b/converter/m0110_usb/config.h deleted file mode 100644 index 801bc4ebfa..0000000000 --- a/converter/m0110_usb/config.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -Copyright 2011,2012 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef CONFIG_H -#define CONFIG_H - - -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x0110 -#define DEVICE_VER 0x0101 -#define MANUFACTURER t.m.k. -#define PRODUCT M0110 keyboard converter -#define DESCRIPTION convert M0110 keyboard to USB - - -/* matrix size */ -#define MATRIX_ROWS 14 -#define MATRIX_COLS 8 - - -/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ -#define LOCKING_SUPPORT_ENABLE -/* Locking resynchronize hack */ -#define LOCKING_RESYNC_ENABLE - - -/* magic key */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_LALT) | MOD_BIT(KC_LGUI)) || \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_LALT) | MOD_BIT(KC_LCTL)) \ -) - -/* boot magic key */ -#define BOOTMAGIC_KEY_SALT KC_FN0 -#define BOOTMAGIC_KEY_CAPSLOCK_TO_CONTROL KC_LCAP - - -/* ports */ -#define M0110_CLOCK_PORT PORTD -#define M0110_CLOCK_PIN PIND -#define M0110_CLOCK_DDR DDRD -#define M0110_CLOCK_BIT 1 -#define M0110_DATA_PORT PORTD -#define M0110_DATA_PIN PIND -#define M0110_DATA_DDR DDRD -#define M0110_DATA_BIT 0 - -#endif diff --git a/converter/m0110_usb/keymap_common.c b/converter/m0110_usb/keymap_common.c deleted file mode 100644 index 4ac2d71783..0000000000 --- a/converter/m0110_usb/keymap_common.c +++ /dev/null @@ -1,37 +0,0 @@ -/* -Copyright 2011,2012,2014 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#include -#include -#include "action.h" -#include "keycode.h" -#include "keymap.h" -#include "keymap_common.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn index to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - action_t action; - action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]); - return action; -} diff --git a/converter/m0110_usb/keymap_common.h b/converter/m0110_usb/keymap_common.h deleted file mode 100644 index 925556d977..0000000000 --- a/converter/m0110_usb/keymap_common.h +++ /dev/null @@ -1,133 +0,0 @@ -/* -Copyright 2011,2012,2014,2015 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#include -#include -#include "keycode.h" -#include "keymap.h" - - -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - -/* Common layout for M0110 and M0110A - * This keymap works with both keyboards. As you can see, the M0110A is - * a superset of M0110 keyboard, only one exception is 'Enter'(34) of M0110 - * does not exist on the M0110A. - * - * ,---------------------------------------------------------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Clr| =| /| *| - * |---------------------------------------------------------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -| - * |-----------------------------------------------------' | |---------------| - * |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| +| - * |---------------------------------------------------------| |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| | - * |---------------------------------------------------------| |-----------|Ent| - * |Opt |Mac | Space |Ent| \|Lft|Rgt|Dn | | 0| .| | - * `---------------------------------------------------------' `---------------' - * - * M0110A scan codes - * ,---------------------------------------------------------. ,---------------. - * | 32| 12| 13| 14| 15| 17| 16| 1A| 1C| 19| 1D| 1B| 18| 33| | 47| 68| 6D| 62| - * |---------------------------------------------------------| |---------------| - * | 30| 0C| 0D| 0E| 0F| 10| 11| 20| 22| 1F| 23| 21| 1E| | | 59| 5B| 5C| 4E| - * |-----------------------------------------------------' | |---------------| - * | 39| 00| 01| 02| 03| 05| 04| 26| 28| 25| 29| 27| 24| | 56| 57| 58| 66| - * |---------------------------------------------------------| |---------------| - * | 38| 06| 07| 08| 09| 0B| 2D| 2E| 2B| 2F| 2C| 38| 4D| | 53| 54| 55| | - * `---------------------------------------------------------' |-----------| 4C| - * | 3A| 37| 31 | 2A| 46| 42| 48| | 52| 41| | - * `---------------------------------------------------------' `---------------' - * - * M0110 + M0120 scan codes - * ,---------------------------------------------------------. ,---------------. - * | 32| 12| 13| 14| 15| 17| 16| 1A| 1C| 19| 1D| 1B| 18| 33| | 47| 68| 6D| 62| - * |---------------------------------------------------------| |---------------| - * | 30| 0C| 0D| 0E| 0F| 10| 11| 20| 22| 1F| 23| 21| 1E| 2A| | 59| 5B| 5C| 4E| - * |---------------------------------------------------------| |---------------| - * | 39| 00| 01| 02| 03| 05| 04| 26| 28| 25| 29| 27| 24| | 56| 57| 58| 66| - * |---------------------------------------------------------| |---------------| - * | 38| 06| 07| 08| 09| 0B| 2D| 2E| 2B| 2F| 2C| 38| | 53| 54| 55| | - * `---------------------------------------------------------' |-----------| 4C| - * | 3A| 37| 31 | 34| 3A| | 52| 41| | - * `------------------------------------------------' `---------------' - * Two right and left keys of 38 and 3A are identical, you cannot discriminate those two. - */ -#define KEYMAP( \ - K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K47,K68,K6D,K62, \ - K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E, K59,K5B,K5C,K4E, \ - K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27, K24, K56,K57,K58,K66, \ - K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C, K4D, K53,K54,K55,K4C, \ - K3A,K37, K31, K34,K2A,K46,K42,K48, K52, K41 \ -) { \ - { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ - { KC_##K08, KC_##K09, KC_NO, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ - { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ - { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \ - { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_NO, KC_NO, KC_##K37 }, \ - { KC_##K38, KC_##K39, KC_##K3A, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_##K41, KC_##K42, KC_NO, KC_NO, KC_NO, KC_##K46, KC_##K47 }, \ - { KC_##K48, KC_NO, KC_NO, KC_NO, KC_##K4C, KC_##K4D, KC_##K4E, KC_NO }, \ - { KC_NO, KC_NO, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ - { KC_##K58, KC_##K59, KC_NO, KC_##K5B, KC_##K5C, KC_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_NO, KC_##K62, KC_NO, KC_NO, KC_NO, KC_##K66, KC_NO }, \ - { KC_##K68, KC_NO, KC_NO, KC_NO, KC_NO, KC_##K6D, KC_NO, KC_NO }, \ -} - -/* International keyboard layout for M0110 + M0120 - * https://en.wikipedia.org/wiki/File:Apple_Macintosh_Plus_Keyboard.jpg - * Probably International keyboard layout of M0110A doesn't exist. - * - * M0110 + M0120 scan codes - * ,---------------------------------------------------------. ,---------------. - * | 32| 12| 13| 14| 15| 17| 16| 1A| 1C| 19| 1D| 1B| 18| 33| | 47| 68| 6D| 62| - * |---------------------------------------------------------| |---------------| - * | 30| 0C| 0D| 0E| 0F| 10| 11| 20| 22| 1F| 23| 21| 1E| 2A| | 59| 5B| 5C| 4E| - * |------------------------------------------------------, | |---------------| - * | 39| 00| 01| 02| 03| 05| 04| 26| 28| 25| 29| 27| 24| | | 56| 57| 58| 66| - * |---------------------------------------------------------| |---------------| - * | 38| 06| 07| 08| 09| 0B| 2D| 2E| 2B| 2F| 2C| 0A| 38| | 53| 54| 55| | - * `---------------------------------------------------------' |-----------| 4C| - * | 3A| 37| 34 | 31| 3A| | 52| 41| | - * `------------------------------------------------' `---------------' - * Two right and left keys of 38 and 3A are identical, you cannot discriminate those two. - */ -#define KEYMAP_INTL( \ - K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K47,K68,K6D,K62, \ - K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,K2A, K59,K5B,K5C,K4E, \ - K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27,K24, K56,K57,K58,K66, \ - K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C,K0A, K53,K54,K55,K4C, \ - K3A,K37, K34, K31, K52, K41 \ -) { \ - { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ - { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ - { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ - { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \ - { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_NO, KC_NO, KC_##K37 }, \ - { KC_##K38, KC_##K39, KC_##K3A, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_##K41, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_##K47 }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_##K4C, KC_NO, KC_##K4E, KC_NO }, \ - { KC_NO, KC_NO, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ - { KC_##K58, KC_##K59, KC_NO, KC_##K5B, KC_##K5C, KC_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_NO, KC_##K62, KC_NO, KC_NO, KC_NO, KC_##K66, KC_NO }, \ - { KC_##K68, KC_NO, KC_NO, KC_NO, KC_NO, KC_##K6D, KC_NO, KC_NO }, \ -} diff --git a/converter/m0110_usb/keymap_default.c b/converter/m0110_usb/keymap_default.c deleted file mode 100644 index ff7478d1b5..0000000000 --- a/converter/m0110_usb/keymap_default.c +++ /dev/null @@ -1,137 +0,0 @@ -/* -Copyright 2011,2012,2015 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#include -#include "keycode.h" -#include "keymap_common.h" - - - -#ifdef KEYMAP_SECTION_ENABLE -const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] __attribute__ ((section (".keymap.keymaps"))) = { -#else -const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { -#endif - /* Default: - * M0110 M0120 - * ,---------------------------------------------------------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Nlk| =| /| *| - * |---------------------------------------------------------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| | 7| 8| 9| -| - * |---------------------------------------------------------| |---------------| - * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| +| - * |---------------------------------------------------------| |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | | 1| 2| 3| | - * `---------------------------------------------------------' |-----------|Ent| - * |Opt|Mac | Space |Fn |Opt| | 0| .| | - * `-----------------------------------------------' `---------------' - * M0110A - * ,---------------------------------------------------------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Nlk| =| /| *| - * |---------------------------------------------------------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -| - * |-----------------------------------------------------' | |---------------| - * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| +| - * |---------------------------------------------------------| |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| | - * |---------------------------------------------------------| |-----------|Ent| - * |Opt |Mac | Space | \|Lft|Rgt|Dn | | 0| .| | - * `---------------------------------------------------------' `---------------' - */ - [0] = KEYMAP( - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, NLCK,EQL, PSLS,PAST, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, P7, P8, P9, PMNS, - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, PPLS, - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, UP, P1, P2, P3, PENT, - LALT,LGUI, SPC, FN0, FN13,LEFT,RGHT,DOWN, P0, PDOT - ), - /* Cursor Layer: - * M0110 M0120 - * ,---------------------------------------------------------. ,---------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet| |Nlk| =| /| *| - * |---------------------------------------------------------| |---------------| - * |Caps |Hom| Up|PgU| | | | |Psc|Slk|Pau|Up |INS| | | 7| 8| 9| -| - * |---------------------------------------------------------| |---------------| - * |Ctrl |Lef|Dow|Rig| | | | |Hom|PgU|Lef|Rig|Return| | 4| 5| 6| +| - * |---------------------------------------------------------| |---------------| - * |Shift |End| |PgD| | | | |End|PgD|Dow|Shift | | 1| 2| 3| | - * `---------------------------------------------------------' |-----------|Ent| - * |Opt|Mac | Space |Fn |Opt| | 0| .| | - * `-----------------------------------------------' `---------------' - * M0110A - * ,---------------------------------------------------------. ,---------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet| |Nlk| =| /| *| - * |---------------------------------------------------------| |---------------| - * |Caps |Hom| Up|PgU| | | | |Psc|Slk|Pau|Up |INS| | | 7| 8| 9| -| - * |-----------------------------------------------------' | |---------------| - * |Ctrl |Lef|Dow|Rig| | | | |Hom|PgU|Lef|Rig|Return| | 4| 5| 6| +| - * |---------------------------------------------------------| |---------------| - * |Shift |End| |PgD| | | | |End|PgD|Dow|Shft|PgU| | 1| 2| 3| | - * |---------------------------------------------------------| |-----------|Ent| - * |Opt |Mac | Space | \|Hom|End|PgD| | 0| .| | - * `---------------------------------------------------------' `---------------' - */ - [1] = KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST, - CAPS,HOME,UP, PGUP,NO, NO, NO, NO, PSCR,SLCK,PAUS,UP, INS, P7, P8, P9, PMNS, - LCTL,LEFT,DOWN,RGHT,NO, NO, NO, NO, HOME,PGUP,LEFT,RGHT, ENT, P4, P5, P6, PPLS, - LSFT,END, NO, PGDN,NO, NO, NO, NO, END, PGDN,DOWN, PGUP, P1, P2, P3, PENT, - LALT,LGUI, SPC, FN0, FN13,HOME,END, PGDN, P0, PDOT - ), -}; - - -/* - * Fn action definition - */ -#ifdef KEYMAP_SECTION_ENABLE -const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { -#else -const uint16_t fn_actions[] PROGMEM = { -#endif - [0] = ACTION_LAYER_MOMENTARY(1), - [1] = ACTION_LAYER_MOMENTARY(2), - [2] = ACTION_LAYER_MOMENTARY(3), - [3] = ACTION_LAYER_MOMENTARY(4), - [4] = ACTION_LAYER_MOMENTARY(5), - [5] = ACTION_LAYER_MOMENTARY(6), - [6] = ACTION_LAYER_MOMENTARY(7), - [7] = ACTION_LAYER_TOGGLE(1), - [8] = ACTION_LAYER_TOGGLE(2), - [9] = ACTION_LAYER_TOGGLE(3), - [10] = ACTION_LAYER_TAP_TOGGLE(1), - [11] = ACTION_LAYER_TAP_TOGGLE(2), - [12] = ACTION_LAYER_TAP_TOGGLE(3), - [13] = ACTION_LAYER_TAP_KEY(1, KC_BSLASH), - [14] = ACTION_LAYER_TAP_KEY(2, KC_TAB), - [15] = ACTION_LAYER_TAP_KEY(3, KC_ENTER), - [16] = ACTION_LAYER_TAP_KEY(4, KC_SPACE), - [17] = ACTION_LAYER_TAP_KEY(5, KC_SCOLON), - [18] = ACTION_LAYER_TAP_KEY(6, KC_QUOTE), - [19] = ACTION_LAYER_TAP_KEY(7, KC_SLASH), - [20] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_SPACE), - [21] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_SPACE), - [22] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_QUOTE), - [23] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENTER), - [24] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_ESC), - [25] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_BSPACE), - [26] = ACTION_MODS_ONESHOT(MOD_LCTL), - [27] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_ESC), - [28] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_BSPACE), - [29] = ACTION_MODS_ONESHOT(MOD_LSFT), - [30] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_GRAVE), - [31] = ACTION_MODS_TAP_KEY(MOD_RALT, KC_BSLASH), -}; diff --git a/converter/m0110_usb/keymap_hasu.c b/converter/m0110_usb/keymap_hasu.c deleted file mode 100644 index 11f1a4f394..0000000000 --- a/converter/m0110_usb/keymap_hasu.c +++ /dev/null @@ -1,87 +0,0 @@ -/* -Copyright 2014 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#include -#include "keycode.h" -#include "keymap_common.h" - - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Default: - * M0110 - * ,---------------------------------------------------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| - * |---------------------------------------------------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| - * |---------------------------------------------------------| - * |Ctrl | A| S| D| F| G| H| J| K| L| Fn| '|Return| - * |---------------------------------------------------------| - * |Shift | Z| X| C| V| B| N| M| ,| ,| Fn|Shift | - * `---------------------------------------------------------' - * |Fn |alt | Fn |Gui |Fn | - * `-----------------------------------------------' - */ - [0] = KEYMAP( - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, NLCK,EQL, PSLS,PAST, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, P7, P8, P9, PMNS, - LCTL,A, S, D, F, G, H, J, K, L, FN3, QUOT, ENT, P4, P5, P6, PPLS, - LSFT,Z, X, C, V, B, N, M, COMM,DOT, FN1, UP, P1, P2, P3, PENT, - FN0, LALT, FN2, LGUI,BSLS,LEFT,RGHT,DOWN, P0, PDOT - ), - // IJKL cursor - [1] = KEYMAP( - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST, - CAPS,NO, NO, NO, NO, NO, HOME,PGDN,UP, PGUP,END, NO, NO, P7, P8, P9, PMNS, - LCTL,VOLD,VOLU,MUTE,NO, NO, HOME,LEFT,DOWN,RGHT,END, NO, ENT, P4, P5, P6, PPLS, - LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, NO, PGUP, P1, P2, P3, PENT, - TRNS,LALT, SPC, LGUI,BSLS,HOME,END, PGDN, P0, PDOT - ), - // HJKL cursor - [2] = KEYMAP( - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST, - CAPS,NO, NO, NO, NO, NO, HOME,PGDN,UP, PGUP,END, NO, NO, P7, P8, P9, PMNS, - LCTL,VOLD,VOLU,MUTE,NO, NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, P4, P5, P6, PPLS, - LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, TRNS, PGUP, P1, P2, P3, PENT, - TRNS,LALT, SPC, LGUI,BSLS,HOME,END, PGDN, P0, PDOT - ), - // Mousekey - [3] = KEYMAP( - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST, - CAPS,Q, W, E, R, T, WH_L,WH_D,MS_U,WH_U,WH_R,WBAK,WFWD, P7, P8, P9, PMNS, - LCTL,VOLD,VOLU,MUTE,NO, NO, BTN2,MS_L,MS_D,MS_R,BTN1,NO, ENT, P4, P5, P6, PPLS, - LSFT,Z, X, C, V, B, BTN2,BTN1,BTN4,BTN5,NO, PGUP, P1, P2, P3, PENT, - NO, LALT, TRNS, LGUI,BSLS,HOME,END, PGDN, P0, PDOT - ), - // Mousekey - [4] = KEYMAP( - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST, - CAPS,Q, W, E, R, T, WH_L,WH_D,MS_U,WH_U,WH_R,WBAK,WFWD, P7, P8, P9, PMNS, - LCTL,VOLD,VOLU,MUTE,NO, NO, BTN2,MS_L,MS_D,MS_R,TRNS,NO, ENT, P4, P5, P6, PPLS, - LSFT,Z, X, C, V, B, BTN2,BTN1,BTN4,BTN5,NO, PGUP, P1, P2, P3, PENT, - NO, LALT, BTN1, LGUI,BSLS,HOME,END, PGDN, P0, PDOT - ), -}; - - -/* - * Fn action definition - */ -const uint16_t fn_actions[] PROGMEM = { - [0] = ACTION_LAYER_MOMENTARY(1), - [1] = ACTION_LAYER_TAP_KEY(2, KC_SLASH), - [2] = ACTION_LAYER_TAP_KEY(3, KC_SPACE), - [3] = ACTION_LAYER_TAP_KEY(4, KC_SCOLON), -}; diff --git a/converter/m0110_usb/keymap_intl.c b/converter/m0110_usb/keymap_intl.c deleted file mode 100644 index 6cc251a289..0000000000 --- a/converter/m0110_usb/keymap_intl.c +++ /dev/null @@ -1,73 +0,0 @@ -/* -Copyright 2015 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#include -#include "keycode.h" -#include "keymap_common.h" - - - -const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { - /* International keyboard - * M0110 M0120 - * ,---------------------------------------------------------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Nlk| -| +| *| - * |---------------------------------------------------------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Ret| | 7| 8| 9| /| - * |------------------------------------------------------, | |---------------| - * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '| \| | | 4| 5| 6| ,| - * |---------------------------------------------------------| |---------------| - * |Shif| <| Z| X| C| V| B| N| M| ,| ,| /| | | 1| 2| 3| | - * `---------------------------------------------------------' |-----------|Ent| - * |Opt|Mac | Space |Fn | | | 0| .| | - * `-----------------------------------------------' `---------------' - */ - [0] = KEYMAP_INTL( - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, NLCK,EQL, PSLS,PAST, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,ENT, P7, P8, P9, PMNS, - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,BSLS, P4, P5, P6, PPLS, - LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, P1, P2, P3, PENT, - LALT,LGUI, SPC, FN0, P0, PDOT - ), - /* Cursor Layer - * ,---------------------------------------------------------. ,---------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet| |Nlk| -| +| *| - * |---------------------------------------------------------| |---------------| - * |Caps |Hom| Up|PgU| | | | |Psc|Slk|Pau|Up | |Ret| | 7| 8| 9| /| - * |------------------------------------------------------, | |---------------| - * |Ctrl |Lef|Dow|Rig| | | | |Hom|PgU|Lef|Rig|Ins| | | 4| 5| 6| ,| - * |---------------------------------------------------------| |---------------| - * |Shif| <|End| |PgD| | | | |End|PgD|Dow| | | 1| 2| 3| | - * `---------------------------------------------------------' |-----------|Ent| - * |Opt|Mac | Space |Fn | | | 0| .| | - * `-----------------------------------------------' `---------------' - */ - [1] = KEYMAP_INTL( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST, - CAPS,HOME,UP, PGUP,NO, NO, NO, NO, PSCR,SLCK,PAUS,UP, NO, ENT, P7, P8, P9, PMNS, - LCTL,LEFT,DOWN,RGHT,NO, NO, NO, NO, HOME,PGUP,LEFT,RGHT,INS, P4, P5, P6, PPLS, - LSFT,NO, END, NO, PGDN,NO, NO, NO, NO, END, PGDN,DOWN, P1, P2, P3, PENT, - LALT,LGUI, SPC, FN0, P0, PDOT - ), -}; - - -/* - * Fn action definition - */ -const uint16_t fn_actions[] PROGMEM = { - [0] = ACTION_LAYER_MOMENTARY(1), -}; diff --git a/converter/m0110_usb/keymap_spacefn.c b/converter/m0110_usb/keymap_spacefn.c deleted file mode 100644 index 5017861a34..0000000000 --- a/converter/m0110_usb/keymap_spacefn.c +++ /dev/null @@ -1,71 +0,0 @@ -/* -Copyright 2014 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#include -#include "keycode.h" -#include "keymap_common.h" - - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Default: - * M0110 M0120 - * ,---------------------------------------------------------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Nlk| -| +| *| - * |---------------------------------------------------------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| | 7| 8| 9| /| - * |---------------------------------------------------------| |---------------| - * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| ,| - * |---------------------------------------------------------| |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | | 1| 2| 3| | - * `---------------------------------------------------------' |-----------|Ent| - * |Opt|Mac | Space |Mac |Opt| | 0| .| | - * `-----------------------------------------------' `---------------' - * M0110A - * ,---------------------------------------------------------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Bcksp| |Nlk| =| /| *| - * |---------------------------------------------------------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -| - * |-----------------------------------------------------' | |---------------| - * |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| +| - * |---------------------------------------------------------| |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| | - * |---------------------------------------------------------' |-----------|Ent| - * |Opt |Mac | Space | \|Lft|Rgt|Dn | | 0| .| | - * `---------------------------------------------------------' `---------------' - */ - [0] = KEYMAP( - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, NLCK,PEQL,PSLS,PAST, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, P7, P8, P9, PMNS, - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, PPLS, - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, UP, P1, P2, P3, PENT, - LALT,LGUI, FN0, RGUI,BSLS,LEFT,RGHT,DOWN, P0, PDOT - ), - [1] = KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST, - TRNS,TRNS,TRNS,ESC, TRNS,TRNS,TRNS,HOME,UP, END, PSCR,SLCK,PAUS, P7, P8, P9, PMNS, - LCTL,TRNS,TRNS,TRNS,TRNS,TRNS,PGUP,LEFT,DOWN,RGHT,TRNS,TRNS, TRNS, P4, P5, P6, PPLS, - TRNS,TRNS,TRNS,TRNS,TRNS,SPC, PGDN,GRV, FN1, TRNS,APP, PGUP, P1, P2, P3, PENT, - TRNS,TRNS, TRNS, TRNS,INS, HOME,END, PGDN, P0, PDOT - ), -}; - -/* - * Fn action definition - */ -const uint16_t fn_actions[] PROGMEM = { - [0] = ACTION_LAYER_TAP_KEY(1, KC_SPACE), - [1] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde -}; diff --git a/converter/m0110_usb/led.c b/converter/m0110_usb/led.c deleted file mode 100644 index 3822a131b8..0000000000 --- a/converter/m0110_usb/led.c +++ /dev/null @@ -1,32 +0,0 @@ -/* -Copyright 2011 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include -#include "led.h" - - -void led_set(uint8_t usb_led) -{ - if (usb_led & (1< - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -/* - * scan matrix - */ -#include -#include -#include -#include -#include "print.h" -#include "util.h" -#include "debug.h" -#include "host.h" -#include "led.h" -#include "m0110.h" -#include "matrix.h" - - -#define CAPS 0x39 -#define CAPS_BREAK (CAPS | 0x80) -#define ROW(key) ((key)>>3&0x0F) -#define COL(key) ((key)&0x07) - - -static bool is_modified = false; - -// matrix state buffer(1:on, 0:off) -static uint8_t *matrix; -static uint8_t _matrix0[MATRIX_ROWS]; - -static void register_key(uint8_t key); - - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -void matrix_init(void) -{ - m0110_init(); - // initialize matrix state: all keys off - for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00; - matrix = _matrix0; - return; -} - -uint8_t matrix_scan(void) -{ - uint8_t key; - - is_modified = false; - key = m0110_recv_key(); - - if (key == M0110_NULL) { - return 0; - } else if (key == M0110_ERROR) { - return 0; - } else { - is_modified = true; - register_key(key); - } - - if (debug_enable) { - print("["); phex(key); print("]\n"); - } - return 1; -} - -bool matrix_is_modified(void) -{ - return is_modified; -} - -inline -bool matrix_has_ghost(void) -{ - return false; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & (1< - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef CONFIG_H -#define CONFIG_H - - -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x5021 -#define MANUFACTURER t.m.k. -#define PRODUCT SONY NEWS keyboard converter -#define DESCRIPTION converts SONY NEWS protocol into USB - - -/* matrix size */ -#define MATRIX_ROWS 16 // keycode bit: 3-0 -#define MATRIX_COLS 8 // keycode bit: 6-4 - - -/* legacy keymap support */ -#define USE_LEGACY_KEYMAP - - -/* key combination for command */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) || \ - keyboard_report->mods == (MOD_BIT(KC_LCTRL) | MOD_BIT(KC_RSHIFT)) \ -) - - -/* Asynchronous USART - * 8-data bit, non parity, 1-stop bit, no flow control - */ -#ifdef __AVR_ATmega32U4__ -# define NEWS_KBD_RX_VECT USART1_RX_vect -# define NEWS_KBD_RX_DATA UDR1 -# define NEWS_KBD_RX_BAUD 9600 -# define NEWS_KBD_RX_UBBR ((F_CPU/(16UL*NEWS_KBD_RX_BAUD))-1) -# define NEWS_KBD_RX_INIT() do { \ - UBRR1L = (uint8_t) NEWS_KBD_RX_UBBR; \ - UBRR1H = (uint8_t) (NEWS_KBD_RX_UBBR>>8); \ - UCSR1B |= (1< - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include -#include -#include "keycode.h" -#include "util.h" -#include "keymap.h" - - - - -// Following macros help you to define a keymap with the form of actual keyboard layout. - -/* SONY NEWS NWP-5461 */ -#define KEYMAP( \ - K7A, K01,K02,K03,K04,K05, K06,K07,K08,K09,K0A, K68,K69, K64,K65,K52, \ - K0B,K0C,K0D,K0E,K0F,K10,K11,K12,K13,K14,K15,K16,K17,K18,K19, K6A, K4B,K4C,K4D,K4E, \ - K1A,K1B,K1C,K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27, K6B, K4F,K50,K51,K56, \ - K28,K29,K2A,K2B,K2C,K2D,K2E,K2F,K30,K31,K32,K33,K34, K35, K6C, K53,K54,K55,K5A, \ - K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K42, K6D, K57,K59,K58, \ - K43,K44,K45, K46, K47, K48,K49,K4A, K6E, K66,K5B,K5C,K5D \ -) { \ - { KC_NO, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ - { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ - { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ - { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \ - { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37 }, \ - { KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_##K3F }, \ - { KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_##K47 }, \ - { KC_##K48, KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D, KC_##K4E, KC_##K4F }, \ - { KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ - { KC_##K58, KC_##K59, KC_##K5A, KC_##K5B, KC_##K5C, KC_##K5D, KC_NO, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_##K64, KC_##K65, KC_##K66, KC_NO }, \ - { KC_##K68, KC_##K69, KC_##K6A, KC_##K6B, KC_##K6C, KC_##K6D, KC_##K6E, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, }, \ - { KC_NO, KC_NO, KC_##K7A, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ -} - - -// Assign Fn key(0-7) to a layer to which switch with the Fn key pressed. -static const uint8_t PROGMEM fn_layer[] = { - 0, // Fn0 - 0, // Fn1 - 0, // Fn2 - 0, // Fn3 - 0, // Fn4 - 0, // Fn5 - 0, // Fn6 - 0 // Fn7 -}; - -// Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer. -// See layer.c for details. -static const uint8_t PROGMEM fn_keycode[] = { - KC_NO, // Fn0 - KC_NO, // Fn1 - KC_NO, // Fn2 - KC_NO, // Fn3 - KC_NO, // Fn4 - KC_NO, // Fn5 - KC_NO, // Fn6 - KC_NO // Fn7 -}; - - -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: default - * ,---. ,------------------------, ,------------------------. ,---------. - * |Pow| | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10| | F11| F12| ,-----------. - * `---' `------------------------' `------------------------' `---------' | *| /| +| - * ,-------------------------------------------------------------. ,---. ,---------------| - * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| BS | |Hlp| | 7| 8| 9| -| - * |-------------------------------------------------------------| |---| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Del| | |Ins| | 4| 5| 6| ,| - * |---------------------------------------------------------' | |---| |---------------| - * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '| `|Return| |Clr| | 1| 2| 3| | - * |-------------------------------------------------------------| |---| |-----------|Ent| - * |Shift | Z| X| C| V| B| N| M| ,| ,| /| |Shift | |PgU| | 0| .| Up| | - * |-------------------------------------------------------------| |---| |---------------| - * |Alt |Gui |Alt | Space | |Gui|App|Ctrl | |PgD| |Tab|Lef|Dow|Rig| - * `-------------------------------------------------------------' `---' `---------------' - */ - KEYMAP( - PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PAST,PSLS,PPLS, - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,BSPC, HELP, P7, P8, P9, PMNS, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,DEL, INS, P4, P5, P6, PCMM, - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,GRV, ENT, CLR, P1, P2, P3, PENT, - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RO, RSFT, PGUP, P0, PDOT,UP, - LALT,CAPS,LALT, SPC, ERAS, RALT,RGUI,RCTL, PGDN, TAB, LEFT,DOWN,RGHT - ), -}; - - -uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) -{ - return pgm_read_byte(&keymaps[(layer)][(row)][(col)]); -} - -uint8_t keymap_fn_layer(uint8_t index) -{ - return pgm_read_byte(&fn_layer[index]); -} - -uint8_t keymap_fn_keycode(uint8_t index) -{ - return pgm_read_byte(&fn_keycode[index]); -} diff --git a/converter/news_usb/led.c b/converter/news_usb/led.c deleted file mode 100644 index 51e601318a..0000000000 --- a/converter/news_usb/led.c +++ /dev/null @@ -1,26 +0,0 @@ -/* -Copyright 2012 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include "stdint.h" -#include "news.h" -#include "led.h" - - -void led_set(uint8_t usb_led) -{ - // not supported now -} diff --git a/converter/news_usb/matrix.c b/converter/news_usb/matrix.c deleted file mode 100644 index f0d5b58633..0000000000 --- a/converter/news_usb/matrix.c +++ /dev/null @@ -1,142 +0,0 @@ -/* -Copyright 2012 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include -#include -#include -#include "print.h" -#include "util.h" -#include "news.h" -#include "matrix.h" -#include "debug.h" - - -/* - * Matrix Array usage: - * - * ROW: 16 - * COL:8 - * - * 8bit wide - * +---------+ - * 0|00 ... 07| - * 1|08 ... 0F| - * :| ... | - * :| ... | - * E|70 ... 77| - * F|78 ... 7F| - * +---------+ - * - */ -static uint8_t matrix[MATRIX_ROWS]; -#define ROW(code) ((code>>3)&0xF) -#define COL(code) (code&0x07) - -static bool is_modified = false; - - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -void matrix_init(void) -{ - news_init(); - - // initialize matrix state: all keys off - for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; - - return; -} - -uint8_t matrix_scan(void) -{ - is_modified = false; - - uint8_t code; - code = news_recv(); - if (code == 0) { - return 0; - } - - phex(code); print(" "); - if (code&0x80) { - // break code - if (matrix_is_on(ROW(code), COL(code))) { - matrix[ROW(code)] &= ~(1< -Arduino code by "Ladyada" Limor Fried (http://ladyada.net/, http://adafruit.com/), released under BSD license - -Timing reference thanks to http://m0115.web.fc2.com/ (dead link), http://cfile7.uf.tistory.com/image/14448E464F410BF22380BB -Pinouts thanks to http://www.68k.org/~degs/nextkeyboard.html -Keycodes from http://ftp.netbsd.org/pub/NetBSD/NetBSD-release-6/src/sys/arch/next68k/dev/ - -This software is licensed with a Modified BSD License. -All of this is supposed to be Free Software, Open Source, DFSG-free, -GPL-compatible, and OK to use in both free and proprietary applications. -Additions and corrections to this file are welcome. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - -* Neither the name of the copyright holders nor the names of - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0xBCBC -#define DEVICE_VER 0x0500 -#define MANUFACTURER t.m.k. -#define PRODUCT NeXT Keyboard to USB converter -#define DESCRIPTION USB converter for NeXT non-ADB Keyboard - -/* matrix size */ -#define MATRIX_ROWS 12 // keycode bit: 3-0 -#define MATRIX_COLS 8 // keycode bit: 6-4 - -#define DEBUG_ON_INIT 1 - -//#define TEENSY_CONFIG 1 -//#define PRO_MICRO_CONFIG 1 -#define TMK_CONFIG 1 - -// comment out if you don't want the keyboard's LEDs to flash upon initialization or pressing shift -//#define NEXT_KBD_INIT_FLASH_LEDS -//#define NEXT_KBD_SHIFT_FLASH_LEDS - -//============= Start of Arduino Pro Micro Configuration ============== -#ifdef PRO_MICRO_CONFIG - -// this is the debugging LED that flashes when a key is being pressed -// comment out in order to disable debugging LED -#define NEXT_KBD_LED1_PORT PORTD -#define NEXT_KBD_LED1_PIN PIND -#define NEXT_KBD_LED1_DDR DDRD -#define NEXT_KBD_LED1_BIT 5 - -#define NEXT_KBD_LED1_ON NEXT_KBD_LED1_PORT &= ~(1<mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) || \ - (keyboard_report->mods == (MOD_BIT(KC_RALT) | MOD_BIT(KC_RALT))) || \ - (keyboard_report->mods == (MOD_BIT(KC_RGUI) | MOD_BIT(KC_RGUI))) \ -) diff --git a/converter/next_usb/keymap.c b/converter/next_usb/keymap.c deleted file mode 100644 index 0041df543f..0000000000 --- a/converter/next_usb/keymap.c +++ /dev/null @@ -1,177 +0,0 @@ -/* -NeXT non-ADB Keyboard USB Converter - -Copyright 2013, Benjamin Gould (bgould@github.com) - -Based on: ---------- -* TMK firmware code Copyright 2011,2012 Jun WAKO -* Arduino code by "Ladyada" Limor Fried (http://ladyada.net/, http://adafruit.com/) \ - released under BSD license \ - https://github.com/adafruit/USB-NeXT-Keyboard - -Timing reference thanks to http://m0115.web.fc2.com/ (dead link), http://cfile7.uf.tistory.com/image/14448E464F410BF22380BB -Pinouts thanks to http://www.68k.org/~degs/nextkeyboard.html -Keycodes from http://ftp.netbsd.org/pub/NetBSD/NetBSD-release-6/src/sys/arch/next68k/dev/ - -This software is licensed with a Modified BSD License. -All of this is supposed to be Free Software, Open Source, DFSG-free, -GPL-compatible, and OK to use in both free and proprietary applications. -Additions and corrections to this file are welcome. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - -* Neither the name of the copyright holders nor the names of - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#include -#include -#include -#include "keycode.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "keymap.h" -#include "keycode.h" - -// 32*8(256) byte array which converts PS/2 code into USB code -static const uint16_t PROGMEM fn_actions[] = { - ACTION_LAYER_MOMENTARY(1), // FN0 - left command key - ACTION_LAYER_MOMENTARY(1), // FN1 - right command key - ACTION_KEY(KC_BSLS), // FN2 - number pad slash & backslash - ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // FN3 - number pad equals & pipe - ACTION_MODS_KEY(MOD_LCTL, KC_Z), // FN4 - cmd+undo on layer 1 - ACTION_MODS_KEY(MOD_LCTL, KC_X), // FN5 - cmd+cut on layer 1 - ACTION_MODS_KEY(MOD_LCTL, KC_C), // FN6 - cmd+copy on layer 1 - ACTION_MODS_KEY(MOD_LCTL, KC_V), // FN7 - cmd+paste on layer 1 -}; - -/* This is the physical layout that I am starting with: - * Note: there is some strangeness on the number pad; - * the equal sign shifts to pipe and forward slash shifts to backslash - * ,-----------------------------------------------------------. ,-----------. ,---------------. - * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| BS | |VUp|Pwr|BrU| |` | =| /| *| - * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | |VDn| |BrD| | 7| 8| 9| -| - * |------------------------------------------------------ | `---' `---' |-----------|---| - * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '| Return| | 4| 5| 6| +| - * |-----------------------------------------------------------| ,---. |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | |Up | | 1| 2| 3| | - * |-----------------------------------------------------------| ,-----------. |-----------|Ent| - * |Alt |Cmd | Space |Cmd |Alt | |Lef|Dow|Rig| | 0| .| | - * `-----------------------------------------------------------' `-----------' `---------------' - * - * Keymap array: - * 8 bytes - * +---------+ - * 0| | - * :| | 0x00-0x87 - * ;| | - * 11| | - * +---------+ - */ -#define KEYMAP( \ - K49,K4A,K4B,K4C,K4D,K50,K4F,K4E,K1E,K1F,K20,K1D,K1C,K1B, K1A,K58,K19, K26,K27,K28,K25, \ - K41,K42,K43,K44,K45,K48,K47,K46,K06,K07,K08,K05,K04,K03, K02, K01, K21,K22,K23,K24, \ - K57,K39,K3A,K3B,K3C,K3D,K40,K3F,K3E,K2D,K2C,K2B, K2A, K12,K18,K13,K15, \ - K56, K31,K32,K33,K34,K35,K37,K36,K2E,K2F,K30, K55, K16, K11,K17,K14, \ - K52,K54, K38, K53,K51, K09,K0F,K10, K0B, K0C,K0D \ -) { \ - { KC_NO, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ - { KC_##K08, KC_##K09, KC_##K10, KC_##K0B, KC_##K0C, KC_##K0D, KC_NO, KC_##K0F }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ - { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ - { KC_##K28, KC_NO, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \ - { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37 }, \ - { KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_##K3F }, \ - { KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_##K47 }, \ - { KC_##K48, KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D, KC_##K4E, KC_##K4F }, \ - { KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ - { KC_##K58, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, }, \ -} - - -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - /* Layer 0: default - * ,-----------------------------------------------------------. ,-----------. ,---------------. - * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| BS | |Ins|Ref|Hom| |` | =| /| *| - * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | |Del| |End| | 7| 8| 9| -| - * |-----------------------------------------------------' | `---' `---' |-----------|---| - * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '| Return| | 4| 5| 6| +| - * |-----------------------------------------------------------| ,---. |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | |Up | | 1| 2| 3| | - * |-----------------------------------------------------------| ,-----------. |-----------|Ent| - * |Fn0 |Alt | Space |LGui |Fn1 | |Lef|Dow|Rig| | 0| .| | - * `-----------------------------------------------------------' `-----------' `---------------' - */ - KEYMAP( - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, WREF,HOME, GRV, FN3, FN2, PAST, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,NO, DEL, END, P7, P8, P9, PMNS, - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, PPLS, - LSFT, Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, - FN0, LALT, SPC, LGUI,FN1, LEFT,DOWN,RGHT, P0, PDOT,PENT - - ), - - /* Layer 1: extra keys - * ,-----------------------------------------------------------. ,-----------. ,---------------. - * |Grv| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| BS | |VUp|VMu|PgU| |` | =| /| *| - * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab |Pau| W| E| R| T| Y| U| I| O|PSc| \| ]| | |VDn| |PgD| | 7| 8| 9| -| - * |-----------------------------------------------------' | `---' `---' |-----------|---| - * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '| Return| | 4| 5| 6| +| - * |-----------------------------------------------------------| ,---. |---------------| - * |Shift |UND|CUT|COP|PST| B| N| M| ,| .| /|Shift | |Up | | 1| 2| 3| | - * |-----------------------------------------------------------| ,-----------. |-----------|Ent| - * |Fn0 |Alt | Space |RGui |Fn1 | |Lef|Dow|Rig| | 0| .| | - * `-----------------------------------------------------------' `-----------' `---------------' - */ - KEYMAP( - - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, VOLU,MUTE,PGUP, TRNS,TRNS,TRNS,TRNS, - TRNS,PAUS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,FN3, BSLS,TRNS, VOLD, PGDN, BTN1,MS_U,BTN2,WH_U, - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, MS_L,MS_D,MS_R,WH_D, - TRNS, FN4, FN5, FN6, FN7, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS, TRNS,TRNS,TRNS, - TRNS,TRNS, TRNS, TRNS,TRNS, TRNS,TRNS,TRNS, TRNS, TRNS,TRNS - - ) -}; - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/converter/next_usb/led.c b/converter/next_usb/led.c deleted file mode 100644 index 2bd0ef6dd4..0000000000 --- a/converter/next_usb/led.c +++ /dev/null @@ -1,60 +0,0 @@ -/* -NeXT non-ADB Keyboard USB Converter - -Copyright 2013, Benjamin Gould (bgould@github.com) - -Based on: -TMK firmware code Copyright 2011,2012 Jun WAKO -Arduino code by "Ladyada" Limor Fried (http://ladyada.net/, http://adafruit.com/), released under BSD license - -Timing reference thanks to http://m0115.web.fc2.com/ (dead link), http://cfile7.uf.tistory.com/image/14448E464F410BF22380BB -Pinouts thanks to http://www.68k.org/~degs/nextkeyboard.html -Keycodes from http://ftp.netbsd.org/pub/NetBSD/NetBSD-release-6/src/sys/arch/next68k/dev/ - -This software is licensed with a Modified BSD License. -All of this is supposed to be Free Software, Open Source, DFSG-free, -GPL-compatible, and OK to use in both free and proprietary applications. -Additions and corrections to this file are welcome. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - -* Neither the name of the copyright holders nor the names of - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#include "stdint.h" -#include "led.h" -#include "next_kbd.h" - - -void led_set(uint8_t usb_led) -{ - if (usb_led & (1< -Arduino code by "Ladyada" Limor Fried (http://ladyada.net/, http://adafruit.com/), released under BSD license - -Timing reference thanks to http://m0115.web.fc2.com/ (dead link), http://cfile7.uf.tistory.com/image/14448E464F410BF22380BB -Pinouts thanks to http://www.68k.org/~degs/nextkeyboard.html -Keycodes from http://ftp.netbsd.org/pub/NetBSD/NetBSD-release-6/src/sys/arch/next68k/dev/ - -This software is licensed with a Modified BSD License. -All of this is supposed to be Free Software, Open Source, DFSG-free, -GPL-compatible, and OK to use in both free and proprietary applications. -Additions and corrections to this file are welcome. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - -* Neither the name of the copyright holders nor the names of - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#include -#include -#include -#include -#include "print.h" -#include "util.h" -#include "serial.h" -#include "matrix.h" -#include "debug.h" -#include "matrix.h" -#include "next_kbd.h" - -static void matrix_make(uint8_t code); -static void matrix_break(uint8_t code); - -static uint8_t matrix[MATRIX_ROWS]; -#define ROW(code) ((code>>3)&0xF) -#define COL(code) (code&0x07) - -static bool is_modified = false; - -/* number of matrix rows */ -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -/* number of matrix columns */ -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -#ifndef NEXT_KBD_LED1_ON -#define NEXT_KBD_LED1_ON -#endif - -#ifndef NEXT_KBD_LED1_OFF -#define NEXT_KBD_LED1_OFF -#endif - -#define NEXT_KBD_PWR_READ (NEXT_KBD_PWR_PIN&(1<>1) -#define NEXT_KBD_PRESSED_KEYCODE(response) (uint8_t)(((response)&0xF00)==0x400) -#define NEXT_KBD_PRESSED(response, mask) (uint8_t)(((response)&mask)>0) -#define NEXT_KBD_PRESSED_CONTROL(response) NEXT_KBD_PRESSED(response,0x01000) -#define NEXT_KBD_PRESSED_SHIFT_LEFT(response) NEXT_KBD_PRESSED(response,0x02000) -#define NEXT_KBD_PRESSED_SHIFT_RGHT(response) NEXT_KBD_PRESSED(response,0x04000) -#define NEXT_KBD_PRESSED_CMD_LEFT(response) NEXT_KBD_PRESSED(response,0x08000) -#define NEXT_KBD_PRESSED_CMD_RGHT(response) NEXT_KBD_PRESSED(response,0x10000) -#define NEXT_KBD_PRESSED_ALT_LEFT(response) NEXT_KBD_PRESSED(response,0x20000) -#define NEXT_KBD_PRESSED_ALT_RGHT(response) NEXT_KBD_PRESSED(response,0x40000) -#define NEXT_KBD_MAKE_OR_BREAK(key, code) \ - do { \ - if (NEXT_KBD_PRESSED_##key(resp) > 0) \ - matrix_make(code); \ - else \ - matrix_break(code); \ - } while (0); - -#define NEXT_KBD_PWR_KEYCODE 0x58 - -/* scan all key states on matrix */ -uint8_t matrix_scan(void) -{ - _delay_ms(5); - - //next_kbd_set_leds(false, false); - NEXT_KBD_LED1_OFF; - - is_modified = false; - - if (!NEXT_KBD_PWR_READ) { - matrix_make(NEXT_KBD_PWR_KEYCODE); - power_state = 1; - if (is_modified) - { - dprintf("Power state 1\n"); - - } - } else { - matrix_break(NEXT_KBD_PWR_KEYCODE); - power_state = 0; - if (is_modified) - { - dprintf("Power state 0\n"); - - } - } - - uint32_t resp = (next_kbd_recv()); - - if (resp == NEXT_KBD_KMBUS_IDLE) - { - return 0; - } - - NEXT_KBD_LED1_ON; - -#ifdef NEXT_KBD_SHIFT_FLASH_LEDS - next_kbd_set_leds( - NEXT_KBD_PRESSED_SHIFT_LEFT(resp) ? true : false, - NEXT_KBD_PRESSED_SHIFT_RGHT(resp) ? true : false - ); -#endif - - dprintf("[ r=%04lX keycode=%02X pressed=%X CTRL=%X SHIFT_LEFT=%X SHIFT_RGHT=%X CMD_LEFT=%X CMD_RGHT=%X ALT_LEFT=%X ALT_RGHT=%X ]\n", \ - resp, \ - NEXT_KBD_KEYCODE(resp), \ - NEXT_KBD_PRESSED_KEYCODE(resp), \ - NEXT_KBD_PRESSED_CONTROL(resp), \ - NEXT_KBD_PRESSED_SHIFT_LEFT(resp), \ - NEXT_KBD_PRESSED_SHIFT_RGHT(resp), \ - NEXT_KBD_PRESSED_CMD_LEFT(resp), \ - NEXT_KBD_PRESSED_CMD_RGHT(resp), \ - NEXT_KBD_PRESSED_ALT_LEFT(resp), \ - NEXT_KBD_PRESSED_ALT_RGHT(resp) \ - ); - - // Modifier keys don't return keycode; have to check the upper bits - NEXT_KBD_MAKE_OR_BREAK(ALT_RGHT, 0x51); - NEXT_KBD_MAKE_OR_BREAK(ALT_LEFT, 0x52); - NEXT_KBD_MAKE_OR_BREAK(CMD_RGHT, 0x53); - NEXT_KBD_MAKE_OR_BREAK(CMD_LEFT, 0x54); - NEXT_KBD_MAKE_OR_BREAK(SHIFT_RGHT, 0x55); - NEXT_KBD_MAKE_OR_BREAK(SHIFT_LEFT, 0x56); - NEXT_KBD_MAKE_OR_BREAK(CONTROL, 0x57); - NEXT_KBD_MAKE_OR_BREAK(KEYCODE, NEXT_KBD_KEYCODE(resp)); - - return 1; -} - -/* whether modified from previous scan. used after matrix_scan. */ -bool matrix_is_modified() -{ - return is_modified; -} - -/* whether a switch is on */ -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & (1<I% zibq3WGz3ONU^E0qLtrF_!2gGa+cQc^3as??^NRHnQ}UBi^^)^*^(zt!^bPe4^cn0c z3KEmEQ%e+*Qqwc@Y}McI-mk8ZnPRIRZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+Zg0oS zWm92Qkz0_PT9T+xk(-lOY*k^a1UB3%uhGK4GSmQ<)Z*l#%z~24{5%Dafr&}^ zr6smXrKOoER%wZ8rb#I&rn*Uq#wognhAD}3q z)?*C`B|Dpn+yX1-qSVBa{GyQj{2V)ynrAlp=-O@cK@LXpfE`36$i>ahMjsx6cD!5) zbO584kQB(H!8ICOB!vJ;ibqq|XmF7f0wgIOO zTqK16Ns32P*JyB&6apkE9!*`N!9`LCkfeAtb&UoWNg+Uz;?dMK8eAlW07;5RQ`cy4 zkrVbPKf)l(z`)4D%*cqexrT+6jh&I1gNgJ15r$d;21aIPCT3<R;l%0a6ZajGL(p7O48pcS^d=-kef$M$BGllMyPMD0 zXM?G-mv^p;Ny}s=xdQ2@A4{H}+f`EPfAqWbx{Oa!mX~imDd%;%|DS=8ZC4Cfc>RQW zt8cA;Y#D*db&$Wy|F-|*R402E|E=~VfqyUjyYZhvGDP`{%kSXtu8eI}+uyq1aZOym z_M7sL6>BzM-JfOmNSn7df1~_SR|fS5^KboU*zEL=d;iw>JF%QU)W7Y2b76ne`?ulW z#T}}OSMR%Se|y0n)qgkRkC|9ry`Me*?S(p_{|q_nA4@UhKjgp7|5$CqdAGkS{uycO z{!#p$_$TF>>$Ye?z_KF8=uL_gu_cuhu92XUN+0{80SQ`^SnltXuU>{@ZH38rA;{bN{4k z@MwPttq%Q@dM)^u#@`LUx3<=GtX?@GO-2%F>&j&J7Q10(Vu zsDE4eyJ^$;1MVC5@9H{S&uG8Z|BeXb-!uQN{AUmio%%-<#o)wy|C^-L;n4R=bQFt?R)ehyng%p3+x5|=Ern>vQmHad+qgg5C7Wj z6n#?SfAo9w0>%%)Z~jD``p5CD&NQJ$&SbOZnd%1&uLIRj} z%}@OO#qz`Sf8}>$xn9+_zrO&El+qH0{cWH?f0|O)`LF!9+Xhr_gY;iPxhww}HbcE!yQu3b^m9u z{;@7B{K9Yl`)e#Og0sx2U-Fs1zp(K;zWx1jp{?-8+G{Ut*|)!6*75}$4g72UkA4qy z+Q+f@b@0d9D*@}9G#G2`mp8qLumAGzw-YF%T-f)Y;pN|N4X1wf=id)a_@nZl!Ji9- z!ywOTFMcPl@v7ayKVdIWIE?Yt@43W3OnqbjHemhU@2%WFyuQhQTftb*S^vCV^3=({ z0>Aw~PK}6%WS33#E_Rpyqy{k6yU1Pqp3PfhQXTkRFw*};^DVo#iR;_?v+N#eFwS2C zE~1o||6KfI(Wdj)ss;aqgb7~$bMa501NRTTx~uVpq0{Ym{bzV-e|wGogPp%aYmbJ- z{Cf?_5e=ty?fjkk_i8|YOMULY3kzdo{%-pBYK8kD`)&UjG6I<6Bj37zoEVY*VDXLq zU0tV9xy+~Q7cReH_h8NZ3s>LR9}P|1f8p{Q`GPS27g^urAFXOQ^^fa6!?}OjQ>R;L z-&((8*C8}MGyC%6-;Xjs=+F3PTp~AL{=Nu*lkMUkXD=}P(EPFQb!qbl_st)(l^=i$ zF8+gZ=Z`Khs;c*A4U73V|L>&@2xi0Kx%JC`dhs8UyCw4)lws-wzFlCyuKwtE2Q(M_ zdh#c}P(*!Io&JuyjLlc7?LKA12fwkeLt-|Zp3hl#v|jR*=r5(etNt0iD1NAaWBp@G zr~NMRTjP(#GR}Xu|9SnEjP!@gZ_WRf@$WS#yR_9w)vo-{kk%mi!}mYK%s(OF)Anuu zw(_4=_GNp{{h#f-x;|aM_V23wQD27Ito>Q*AI+Nd;mv=B!_nn$@Be35S+zJmYW=O% zKb9@oWBs3@Z`*%{+x!1BgnUh1@$Xgqg)P-~t}oA36yC;C3W8G|1&&${?~8$C&~W|-M?P{XE>#{{|ATZWoEFi zi`^%j_|MS%>&f@IPB;HE+)=ph-8^Z2_dD}=$yK?}CjQFn{?9PI{Y(58zK?JIGo*^> zuRl`vRQB=Bf2TC!gWs6W@_Ef}wf@HXUAs>GliIuLpYhao%c;o+<4a4Y{xPke`zKwC zp}xd^oBgp+j=zF-SN>jf|L*)2!E;EQxAu47cfpA4*R>u0w6t};x^I;)6m8qL{l@%9 ziyDMK_`j{cxv-w~{;l=z^cpYxyZ(2U_{IB4{~o>aTzq+M?6;l&?y^7B|90x1;lgvN zcj~A7XUOYc7yowZcV9<_`-kMW$shAgoY(t1@J~uu^bhB6hku-0W5g%@pTYRYi3M!? zm~1=#GbC-8f8n40-pK3+$~XGIX>K&edyFI2OCbY*|ArfTYU(E!Ht@9zKd|MvRQuAOh=?}jFxf43jR z)v~$sZT-7d4ea28Bdg7B^R52JN{t`--|oM)aQ>Qai+`M0V1QbcicZ_dW!v$4#TxUI z%yyi=o0c`y7u#>OKN^}^4{6^V|8D#{_)ln9_=m9i+&|%3jMMG7{;vAny)gFQ{ryhA z^g%_6=!M^Pe;La8Uw%EYUU^ZS{;s=KCk{OSYp%4xjtj(NogvR^cmC*_^$+^fABV9Y z^xyn3TkD7NuZl}2S-Z`gNr z310=3@_mrZ!mw`njk>>l;D*ija7W_m*N^`hwq!8wzbN?D|FReqcQ$H@+`3?ucISMJDvhRu=bi|e0(>f3!xww?bO(xx%g zwb*BW@8$Z-8+Wu`w1oe{Km9!!;V-g473=Dylkiosn|S1!Z-2k+R0V45T&UvDzwgTo zjvieh`KbBb?-sSz2)ct>q$?K2vjjB6`@ej!OZ@&{`+XPo&A};)lzegkfQ22)b z3|pND)Ugv#YE^B`zXH|ncNb3Zx_El8{F{(wp13W!}hFlM{2KxMcFfh^3I0y2i0%mwED}Mb~{gefN z6yL5?vD;}ce#e#b6{sq42UocZz+JTk237s(_k6j*d7-NR<(*mLSAO%~U&t2o!~2`| zk8=U*FN(hn|2W+lRO{AWy|5nK4BZuA{P+5w_uqPX{+Rp@{&!aXZt?5?3>g=$ANKgV z{O_y=oDXZS}Y1pjy@jRLj1HRI0d>R&YpDN{Qk?o**X=Edw*Cpu*xLJ&68VF#~i6?bK<1L&(~9z+|A?6J$}Go+NHgE z_dYyes5YN3<<1`%8?JIPJJf7S|C+2vpBjGr3aj7m{AaoQ1=)-ZiMd zb5G~)Pwl^}|Do&Ykyp__6ngy*O=5fRm3`ztgI~zfwVt(F;mIp5{M0-pEi5N@XMV!! zy1(+DM1QgEnQPv>yN>UYAD?ad-z%zIUYET5jONv=7JUx?eXD$B?zV^F#pU8x`#Ubb zk>0klwCzgYOJ07hP@Fr(2e2 zE6Z$r{liW~yO1yWb<>B!SK$vuPkrYNtnIcv&bOd2Z{FNV_cVWO^j6O1ev$t9?zOC# z08jbga`|Ix=D#u(k7oMv(zLAP)ulB%8+(r?6n(t^!4dCI&UAU-(7!&cVTAPuiMKl4|T5$kh^uUZlQ17fxWi(b@pH2P?&htS(5!t zYvO_+0THX5^ZHT7pP55iY+YB%Wcn#RIW=2(`qgV5c9*>t-zi#MXuU zXXr@Uf5`uWxN@bJfCz(ypTmC!bNhm8L83QH!U|u1ST*79R;x&jvT6;k=X>87!|K9GI^VT_fLY>u`{eiCfkK8YqU#!=t;yUomX=nYcUE*i8nD>`|4FBO8 z&=X%;p3-;ib&03sDVLz?KVGYOU&Xpi=d!)D>+3DAMf3L7oxTZj$n~F2U%o%tKV_2R z-;D?CpVvtp6DeTwv^-~1xopKVee-bH)Ry~t?{>1 zIYEIhc1~GecwFc4W0RH3^L*cXU%!4r%Q{G)R`8D1uYXzl|2WGVYJ4ejo!I0cTbc6x z!j{!Cld2y7_|MQ1>R-LXUQBse?5UvJx2H_8iVmxb>OQ=8s(x19=1pOi(p~%cS1tUv z__*AoYMqRVQ*SbjQU0-M{k>Y4!P>jK9gT!@Bpz!JVsrmDhZEaQomF z70ZH3hJK$#Pu9=s{>o=rD)84TUiHYrR`qG@eYR7dvuN6NK5?&KDc^84=#z@c;oKwp z&ho70vX18t+B@gvIiB>`T+O2QCh0S{OPase)|>kOapd^V(6ab~mz_5ctEf7&t=%Jg z#>HH=M?QW1!PQ*3PW04E9g)u`CZ758Z&$#RbWxGD;htTbw#>JS->!&XvG9>ft+1Ll z`z7TG2mdoUY+ztXHiQH>y0I zXuErU+f>EdPSaaGg5oqS)S`aMCz>v?t@W&D{Guzot&z*~;FG{P^)vtdlJ>e3ywlb! z{kz8bJEpN4PG`NHl2;slex{M=>6_lSIqqyyvG4nQd(HD->Ce{OU+=pAk=F&!pK2Xm z+nzKSOg#VRqN7t+7{e>k{t5r2x{rqxImJxa!c_I`)%pI~j2(X7k(En#ELkGhcjNQ% z<6(7sMWt_fUAWFW>1$7WVgLH~AMf|?(pE{?;Z`{HvBi6>~DhO5a-hD0~`)c6=w@V98YkaFw zxguw>`a*z;qUZUgANp7;g6@@BO|>iP(34px-RN;#>z@4zMb(n<7b!b7m7VfvekN+W6A&4S0y$DTUyd#k|g+9^km zI(q$Tn&wb=oWoMKGW|%>mg#GktaaIRVVZEWrUm;Yt>cOh_8*Rn(0pZh{`mDk4)Kl^ znYL>#Px6!&S-gAx_N!izJIr36)tt^%`Q=OJ>#*amCr&RA`tohhq~r@SpH948GuRsCt1+|9=M0AFinhO@=$tm#_cgAHOC<@y65b zGSTIsYqehNyPD|njlXM74qMPB`O>Qbdsp7w{ov2ORmbEu?z}2hEBsUCxR$c4)vw(z z7~c8o^u?{;`0a;O)`U0PRHr@JGkvDk7q2S*$!kqwQ`f9KeDh?0hx)5LP0`A#t0nCh z?I(p9aaAVYev|(}%D74N?#Ith*ng`(|M4I|k5QG+{&vfx;#)RLlOO#!Yw=o6+3|vm z?Y`_tL6(kd)#Y;(7d6ehTJ6Yjr?%Ry*8SM(?rYOLL-`li-qZ~ezp60b<-y}=mj4-i z0=BGl^>VA*QT}87hpwLrruri5jP73%-1==v`@7~ozi6Mkas?(bfr^aQ9~jtWR%ch8 zj%{K1w|l?E1NOCNzvNlGKlHOi_Up^XS68micy_Yaaeh>oNZ1;czlE>rPS#f}+bd8V z#BosFUhHwalKSg;ij}i(Z}ol7xc6bk9xoQb^D@)peSd`3`QC1k@_St5yvC#K#t-*_6$5>udYLnhM*aDStOGT?(5Q>0kf0{(eM8ZgfKP*ZGB#zuOicOG#C* zxOHtwL*?|sSx$dmtmt`Jmwh6r@5#gSGivsm7M#DfXg&;){_oo2X*<<&+V))Bx=YAbW$hiIn#@PfLLN;KX7$zKDJpce{ITld*WQc& zRO5QrD;-tzdMh+VX2KqxAFYqyb;+>5YF}3ElRiE6$L~cmg7Ok2K8O8wKB?+$YiI0R zBwYV_iOMO?un*N{S2%2b|GXBzcd6DbuZw2uPEKSI)r^!muk-6H$1$dUpCzCFZmPfU z^LBr+%hG+TlR{tQ27Q0<+hN)D_RAZKiFWL5xeSaGj^O!}0{%+eUUK z!rys$TU9yPB^fOx|E_;v%3TqEx5P|;Mb7&9if77;MAr&FKT@(P^j`K0ExE3M#gjjl zhXsCpa@RsEiv8*25~jcgqr$#7U)Ic7sqIxYW%Vsv(Z2Z-OA0vz%h!E$|Y3@%3*1#QL^PTjnl#yyx$) zo-*@Jy>ADFn6@ondB~HYJpJnT>=f4Xsd4$5--SYIZTB3rP2aU*Z;_oq-^@Rg>{gyv zV0`{*`3I>(MM3laB){AKgV(&%h$ZN8PjB<`G)I-1Ee&_&CUA5enK0*<%Y)kg43TU1 zSN6t=RfYXZ{>OKLI8jUJaX4tOfD=;KB!Xf z_v*q?sFjvCO1yJ`&<8esJnWYYnpRL)|*p7lP4{I zr+NH%v!8C(?&!1ct0SW&Im0}BuFRja+9Yn@?0>3pQ`g;0TO$;*+CB^gCzS88WU@zJ0N|ueiw0E^SNQ zmi?#PFWXQ0?V*^dBDeV6H7QnYw=Z9Aei!_~TYRNYBQxd1Tlq(#YXv{HYR+6<7+$`4 z-yY?Ts>G+OJgyboNokt0vV7k8^&6fo{B>#lqu9(HZ(g)ba`3b~!0}H@n?b;`xp(o3 zza8sp+y%d6s2<5aEhNHj`@MDb`(Ljw|8cwc&b5&5quZfL3wK86=_T;F-)+n9J^GU#Vm&F$GWh$>`Y)$! z&7Zt9Yh+YsXIO5(%hA5znzW}^fQa2;Tbsc7JF=(!oAFMlIQma?kWlEwttCCTmCalULG(hfbpb-?BN4pA{)NTxZ(pe8wspsv^4@hj`=|WcSLLsLn!jo3 zp>3wMA3gnj+~fHFYVGn&p=Iv;EXn$rWRqYvo4gM|Ixmb8%PxyDE9+ z(~XB>GGxx~G-73ue@jw4Fw1h8Jc=to=N#%bA zpX+RfPcI)n=E)bmRq8)OT8hm4mtDbMz88F1{X2NohJ}BB&EIwUPYcK&bC+vc`x&u+ zv}cvDo_yldvC691f4J5$&wP4u!4;me+^9L9@9#K$%<$v28FewU47W~Qr?(+Ux?aCmP}bUad(aO1lm+~E*XsYQ z&PZMUdGG3=ybo{tAFlrQT>q26$HjZD&pq|}e3@P7Kf%a=Q&*gdC#`?1|Do&WTm93k zeS256r(LO(eLbP@;bYI>r-zrv6^Or;>iKsqQTE>AS0Zss)vp=ZE~yo{GtIuccqT6!N`TK_3 zom6wx1;6=3-~QCT+JBne`}D4j;(?K-G8Xw(QXws|cNJCUEy;Ts`uF00h6&Z?N9TKO zTb-#Qmud6ym8r_Z2jTmp%Nq;-rOywG`>EX<_^enmD@515G^BjObcrZ^Zq6Wn!wDf- z7d}DwlSt;uTRecBse~C)IyA8+u*!_98V4 zuG8)6+;vq_k#c+Fw!W;}5Z=%E;NP_M^?`pqbE>ah`?fu6m$;S8VP<>%FGsb-#p60& zEBpFus^oEHGyIrT-Rctb`R!8P9bXK>CQsUZ>FTG)Q?)v__MVLX=9(vQaL;P>t0%4> z)bRXacT3o7O|)I=PS#6*=RIVY__8cV_2S!;XWee^*)!csqV8LC;Gr^S5BZ{LyE;xL z7cD=U>6^#s8@KuT{!7nKO>ntlwk#mB?r%}x%lTza4c~Z*R?gG>;kNHd#D}BD0v$Cc z*E?z`$Q$|Dcl+tYJ)f~6b@tq!dsj+EZd)3?v+oU8diSa?mvc3j-d|?Ad*a;+&+`w~ z9*@p+o6Yh4?#%|nuiobsKc%hMn40u)T~3AXqequhjl@eQh+obLFUfMYx!S zU--@4>$iNcWpF9gNWXr1Y2Mspb;3uzIIcw%dU+LCi^=BvaY>)+bveyv^&HRc^6j^$ ze7aE{Y&dbN!-h!<-<)_FH`yrsa8cR%LW%PkYiFKseEMB$le=t%&EZvrr;n7I|La(L zUTERNOIxj<${#EXS#a%oz`Rbq9ZY+thA%$zGvk)!g2k=}v-W6c)Ky>gj<;deUBJG5 z=JNcKb#BTtTg|+J_+RuZs?YDQ4dks1DQJ~cI;*o(c|xYvfgcB-f4n~Z&*}=FKSgIE z!Yftox5}b&nmsTZBTGxkn{FF>ip#Srz=U{UcWo*DL5~T-&E<5@Z?vL66?yUPm8;43lLtK zzn-P9JIKLa;JIf?Wzr2nMXm0`x=)=aR;&D}3|M?2?FYA=$qy@&Gc^KJj?X;tneD|S z``%d*hfkDzTh+Bi)pttI`QuCH?aiLqKCMVf)BRa0KePIT@O$d-t}lMNTKCBEvp>=q z8C5<7x1`T+FBNOHKd2wbWtI1Ah40b3lG~Czqa7D3o^tkhyB{bGyIblud9su$f!5feWOdJ z^rmTt3Qr%FSiP35{9^N!L+8$IJ27utjIh3<2VWH*n@CUJySBLjGWun?_vdRmo|<&I z^1z4ZF)rVy@r#^xaoQ9e^K+48#kB0Wd({uJcb^5Z_`K{=$9h+ZVo|v}g9gnwH_=(T#(~lJU ztvfK~HfQv=OP|CW7__wf*E8))-Fc+W*rH&c;=S^Dv*Q)``}WLJC|t0n{`ZM}OP(*7 zv+B0|(zJbn;j6ps+E33&x*K+R<2pW>D%KMXONw5epR3v~Q#OO>^}@@Zg|U#8LiSmu}3!FsHlrW`2s zI_DH}z%TRawx?&kdZx@c#c{%+Z|eMRS?y<>yFQxvFI!t#8)zG{^0a*2o*ny?Ef~V~ z?$OX*mu^w_x77KPk*dqz9LXsw$)VmExXHzqf3wP<#jIPcvbElR~K`!N-WZP z)1>Q1Yh`&8!BuT9s#{|sAyp=fJZ`qzy$^PT-xZ&h?$yfVp5z|;Tvw{vxc z(V^?NY)<+4Z1c7p_kfjeo4;p2udXrG^oUxgpZB+Gn(^Cb^~*s3b zw@B6Ol1_7eP@;a(;^(Rle=W^^EBxi6=xq(2o|xQ{PWq3>v6%$zv9yc2(SUfEc)vO=6ycJZ&b$3^cstQl z?5FC<61Ku2ugp{DEIoEL&*J!Y`?|$~dp7UjXZ?0zV_oSU+0)-`Z8~0ln0h~?YKQ02 zvc!oK4COfm1b#7Ko`Fv>V>G`X+On-Uz?`F=bCE-nfdY|4u5Y`nJ zd8PWc2LpGug~YojtAd_iWO)!YTleR>O-@DjPTLo>*8Et-IZy0Gi%rwJ`5jA|&oEU5 zZQGH%a5i6KN|W^cDa#Z7m@cXJcXeB{{vB(#{^|WK3%_da)nBP9{PmTty1YPG_SMCw zKetSn{m$^Z%UR(owLb*Eaw8dEMjw z4_CIoJP|LX`@7k--TcLb4A-68^!e8Fsam&ROP;FJm${PTM~1SIdqQ=Z|_zUH(BzEG4z%>`DO0Y{|w$Ag53r7Y|-1}a3Q=_P}^ap!MitlmQit0-8NIqSsI&LSw4LY znY!0Db;7#ScW$gV^LO3U(^`@KA?&(NS$9=*kZz9o*2ohM_U84DK5>n0LR(JN*34&@ z*qR#^>Ctv>kyfTASCqh(_ZH6z*u5%UW*?Gr7JOT-BG7nNC)MlQdVfD(O@H-M`e`qfLBxh4c*9Y6j?fTzCZl1{5)4(JmaNktbTSfTetWQ#z zn$l7y!WX}hlRFpMvX|RmIsVSG9WGHfpH6-%%6nW?+~-#Fj^oyq0mpxywl__RpT<5l z`1D)JR?#(crkFD7E~#<(yfTq9caM^_Ca2{W_oZ>%8CrakU+OP7?{&$pyGgrgeeA?f zE-IBlKO?-PXL~2CC=rylV7`^P_q@h@t?8k+)g1f{xGwYVJ@9L<*1Wa4pS0LtHD{IE9uV!TWW4P8#AG^q-h*)C^I9s6f%YDUKSX91 zncidz7vHl+CTjNg>lR|?jHa@D`qspnDHHl>L*k`hU-zD5J?|o{B2)GA`LX3Q^NWHm zMtaJet4!Kr#hmi~&;h$H2aEGZBmZ4&v}?Ndf*Mp{c%Qj!D9KskLpb8?Y$1n zcPqMfasqql_o+hHmfd-@_DSE{%~#JqUvlcIUC`{VxsQ5(C%0eX+_^%is`z;rW2(** zw&VI6eJcyhJ~@S*GrThI*Z#M&DpoHNTbHwb{*Fp#zWk4RAGdsdT2!#&Kf|RZiT^Cu z9`YA@&v~b~->%$VetDR4Bk!-;881&YmI#{qDa?}b1kZ0RyXjodv-CEdf6~w= zuOndd^J)3wqR!)eMcM4_*|&-nUFP$s{Motkhx)=}+T4c%ma00)lwYZq_|I@E`p#^H z#qBFKISaGHEbBV2?U7}=5SU_9*u%idQd4RWys3=g!PAJakF85S%WBomsej5>Y3I=# zW0APu@pvus*V_l5N8NdN#Z`Fkr65bj-MgQx?2^@D**R%Z)qJi~(}au+&ns;N^o-DjRnubO1QVEJ*?9)tLY z%6F%q6qe$;+`uK`@p=;fUDJsR*B*4)#$;gmM@D{k(1gk_oZrIQi*9Ehx>7DUdEV6c zES~DgDVb49x0bX_Yg9>@(|<7H`*cp_v?Gjc~H)-{i9vxBCsVc=Zt z&1d?+(vxT2mt2qV1vf0-+q}MTS!`d*ra8Y_ZB{&aGV8cv)4I0RZx26MzteE8RMri% zhtsYYpVxdDQSKYPaiZi_#tV;^+RSa#dUMXcH2qx;xyrrT@Oa-G3-UJ~y-IXrAP)OYR%lKU`k-IO@ut zd7ccvGdJ0@s!r|gk9c5mE9_40Dcf@Ox#@RaXaxmL3#d%^>+|)eX42_b5w~6y&s*xW zB{egutKppGoX~B@AN0O{a`|0|i6*z;EZGNd?N(9ot|$vIqtIR zfwHBR=lw#ZlTP`*dvRg5kE;gLw0~+H>$$ca%&pX2(jR46`zm7j{e!G3Rj)mxrqmi0 zh6UW(r6ibhMR$X{K}*69(;u7*%U*Q4RhtO-*{Yq8FWM&DmvDX3qB@~XHb%aoOR_^x z%!$hVVd=$avy<89`)=>tqlGU{MV0k6D*XCnd}{s_H%2a-zQQi=iZ5^12{#nDS(dDM zF7dXcGw6ra^OJwIuEgkWJyjocI`LZI&Ezu|_B38rk$SOT?KETOabHc1ER!>D=FAbf z*m`rtyGE57{m`QGlXky7@o+=motwUE+a0XKw=jOZ9#v_vt={ac!K)`LFD+NAF>Mw8 zdC1?N>*v3?;#BQk8R4b&kN!?SeCI^_e}?j`jZbaY%-eQ%L8h$9{h4N;Le)~*PTqS~ z-Dt~Nb*cFu|IOmlVmBH-|7X}cd&T{!Rx|vClNSmfX_yhusn@FV`J?E!{|qY=mVI!Y zul=jYH~mWZ$)HuK7rpN3ZQjlob3e>5!s~hK`?9B+k*~j|)=AmctiH6{cENJ%{-}>( zv!y=N+V52M%zgASeD0or>Qm<*uFpt4bWh;(5q|d2Szo5S3-FLUtJ8L9+v+OErzeE3 zZLKi0XTCH2#JxMdN2coDy?e7X(nL!-`U)4P<||LNInueltt*c?aro+=^CE?s+Dc%i3E33mAHnd&bs_AdHkt&bL8115W;we-(gDyaDB_RmM;$SqO8)_%2rFPS(1=!xmNs( zlJ3nn+rOIXXv;Be-Et|$veb*q-{;za2}|B`1%@|>woW(R>dd}x+2ju{YxnV9oSEwt z$6<3W`_>J`L=TUX?~Z09EZoYfZ?o(1zNuCl7EImXZaA;hI(t#CXQhFpbW@*UU(ytl zB@38DFZ>AGIEQEAB<&l#6M}aym8$dT{h4+&*H%dTkif>%N}DG}-wIAWc;;8Ft=1(Q zu_t$?P28xmq~z)Oxz#LrGFN+&XRNmfD4%|Sd1^JwlPaY(KeXO%z9hJ{Qla9L=tfsh z#f0TocP~xeZ?`6Vp`+8LX?lnlhzE#@se4S;` zlnpn7ylzSNSFCGUb9URzms;N0I%e}C&bb?U3G_BIUYPpznWcPab}pwwfQM~nux`_& z<@`FKQ!?6ayEztTsCshSbUM6SyGGH|(ce_~UiRs%O!q7iKHJdk7f*S5_1W;oZ?-)v zp(8YBYI3IJQeV}n`kPtZ71HfY7yR6HjqT{y=h3$^4{iPCJE1RbdaZM};>oT_Cxgl~ zSgTeh=V&e~dUoy5PKAkcq`WS;y9!kn2iSb}emK4CVNFvVXXNjzODvR&ZMTccHeLB; z?b^V3i{CyrKe0!#NMwQaB&LG8sDOj1=e)wx7FkXx;?2|5%+!i6*KOWYaqWb9lBss0 z^d`?^o|bD*GP6R%VF)@LyP7- z;pwSbo$RY&F~9YzlUIYSYqi@G^(@a1&#GT1Gy1Hs+c=f4&SsTR{(_5}*hH$$Cb?M( zt%{qXtMD#f@%rDZ3#ZI!-Lmkjzehh;fn$`LSgQt0)vk+!EBVytJq5$#kFH!#c@RS<|bs$oA^njwhYOD|Cp7t_`=M>;X0|M0kv$dR)l_|~@@n#`b-Qi{a`))UGn{c<`cW=QXhAi5 z=m$URe@_dujMoG%u2q{=)iXOue^1uyn({rjctX8)de_?J3hr-tb@G6p?f!ym@(;hf zEvyKeyS>oPs5Ex%cGc|}nTsMaul&l&yk5r2n&8R2JgzkTp2^c=Dbp6dl)P1R@No3%c`s~Bdd)vy`SPvt>e8ci z9n1Yqa+xOvSU!!HTz4%ib$*&%|AMnGg$}ar-lUzhbM~4kGxM!3mbT`3d!4d*yR>Cb z;{%4XJ~ud=9j&*mmg!ox`P!ys5nFT4MswXdyX<7;oL`HgCq1f8OWt;9-@0v=JablR z+Vme%x6P_f+;x0stDg0%370z^6J2dOG}-NKYyFqM|F&8`y>r#&-$G9+c(yE%R_BT; z7k(TU!>K!MmL{W3r|DjuHQTBkmdXfDu;MzgeJQV|ud4IKgId40-rcs-GBmdLF~_Z! zUS91wJfB6^Sv!bxFA&wARnGHhE>F>EkCG`C{K|JvP5M?ndG2nn&V#b9t`~}b2>N)p zD019layZmfC3U3jP_@yLmEM{*$8~;8_DV6@CVgt^l=*AdGj7#TNm%HTu4U8lHMBgh zB+6)=+m~q~UY>zmw*EF@+e3O!xg7{%Gk%m^(sm&1$r9!{4A!rmZ+CJsFFfz}tMgNL zRLv|Yr&vYLQ(i@L$}9fsA3 zc8N@zvhC6Y*WB_Xzq`9nyr@2^IxQedH6zmUX{c@u@6qg_uBj6|Po7ne+U>sE$cW+O z*P!WcW=}*uNuE^;ZsscG?P+d4y;h_7+_ek0j%PTmmD!V>nK{*LDXRc)<(u$1xj$de z@-8;>RZ$PtEX)&UHr(Gc-!WXV>7ZaZ|!M$E+!HS{JhVLHul2qAwb*o7<&(;^trnN2UXAN-&9itX+B1PuPL$=?izTU!ujjga~IpPRtH6gFWvE3#4IVH?NaYL!Ru=?1N=PQvJ0FQ=AQmm zoqZz5;@Oc&W}nY;oh(dS_hw?(L6)8$;aiumPT;gyZ+oQT;%Ybc##x6ZiJo+xn&WXi zpib)?ui*RV)=iaK z88P+B-2K6Jy_IjSzA}A#M1z6tPV%n3j9ZdL<5jM`lU%+zytN|2>D$6&i5Kp*8pq>f zGlJ90eI7Lh6i%{jyKt|vbjdrDIa6DgvXnlJzUNq|d3;e#c4Xm}#N|edFI%i~EsCr8 zl<6d}RrsaMoaeH&r7w>Ou^EKU=eoP)3p?k#Z(%EWSE{P)+)&k*^(=FnD)VNG0Oi|J zo%gR#-!#R7DTHhKe$(f#N_|)CyZ$Nj;J@DyHyYO7?vxYVu3^iYetl!8<5pwGRBr3G zi+!c7OSSwsUS7DqX}!n9`w_RV&v+iTCHaIZ1ItrOrY$xT!dm!U1kd!n`nK&(ptMMl z^`7h_8(Wr7e0p6}<>-gRV@ynUyso&h*RR{M^lW>9U#;6VCFg20u`5iwCPz(~^U2?9 z_T$MuWz*Fs1r>3z`CEP7YMaT9&t+XlUhG%CmbQQ4I!_mIktzG;C5ztJ=eJSK?Xll9?`zMa zo%7DI9xY~=A*9`D)Av{@cG^eT*M}CriBR11?t=gQb@x7%ZQU!~^DD_IPj+?el0!>6 zr4RmjsJ#2}&(+WE`-&@8yEA4ctgrr7Wc7Qt@T%hT8*)P2Plbgn-?3z}mW%mafxt;u z;!Sg&?=e{;7=Cs3$@)`DmoplL(s}%T6x>KWs`NWs^OQ7)mi)X;Zh;Tyg}VIo_phoK zjV^qC>BV=$x$9fXq(5JH8*bmV@ACDn5}*CK`qP_VRN2hRd_K?haE)k!q(a4oB2JbI zlUtb|WNS$V23o9hsdiuXc-Kp5N6GgpK}%Qi9+Y&@3Ow-K<6_eSj`MaqUwW%rT$&%Dr(x~mlNlwW<|}>IBhBM ztT0+CYL0`~@uk1D7Q0qIxN(bV@-5M1+w5Cq^E}SkmM(ly_UTL6ADyskAxy=OqmE8| z*4y!A>J}N{`;pOE_qVK837fh)kE5XZj>erub8mNAz7FH_^y*#ed5_Is>q`KiN9hLR z3#;d5-&(M7$^)r8%PuVYK4F2o;_0=n);hNqx*f^&p1q6leq{dUxaUH}uhu43q;Gx` zW3z|-;o7xq7wnexTwA}+M?CFp(-fni2b^9G(aD_Q9cxWgy&PF>T?4=6{Swy4hbgZq`WpD;C^@72_jlnyZP(|SMIVgVP!=O^0Pp3w*1lq{E%{raG#NytOa z_Q%?@OzWFIJiRPxsFc3!L{3g{tIL-YYu_s7tzelv>%-g|w>$&Cb_JYx6T)e8zJ1f0 zB44u~qT8l2FikywJzAtphp+R!#rw6o?$%s$0-rg`ymYw5$8MjS-Luy8W{aY0%D0*9 zb9MU`-<&w7yyUfKgV#0dl|BVa7BoMO-V%LqgG%xYxeMBwZlM#_BtKs~-}qs4@)Xv* zVukWR^)%bf#oBM9e`tF8JFWY5=XMw8mn-Zx2?5)jZr|vO_E5IJd^6hFS7(WaO!D)! z9=2QdolH>RSwG!>-qd3eg|=PS7B`=C-?#PH4Y6r+4*Ffv49+#bSyt^4#Cc=Mm!naJ zpL}+in-o28`{!uOtC9PqA=1*%|IpgN#S7N!SxugJUVUDsbIwx6qpEfjpBRT5b(hIb z<~(Gp(^o07a>|@FqO!A#Ce+kq$JDT}HJy8S=Gpdb+TPvWwIbt=b4}v(VBfXvK$`VhML(M*yFUm`u<94~UVJ=LZ|zcx8&9_?XcVt*QU9Fq zNT6wndIF2g^SOJ?yQa6r`iXD1cy~McNXEfULSbu4pI%#B z7<+9+MwWH2&84uQfC4_NOG{RIlxE~=DQIWd9-Fe|R5{;`2@9_ze+av($g*;lA z`W(BF@tnug*X?SLF`B++(=5+hw*)5d->><6*5kd!%b&XLKJR*5w{zXD&weRW1vbxX zpRV=subb{Ze*eo~g)Z;CsPppH=FTeJ>GB)1BFindz4Xk|{?6vpma=6Nm$RP^@7-FJ z$I~qH-c86laqq)A{bQSNKUg1Rcc*&J&rit@HvL|CZ&|W?;EhXFDr-_6x@(F&eDeF~ zKE*8if*+-dVcJKxDZl90wodGdO;oDf#L_M5^RGR&{Q79xNA0)|%|V{~_8!R-@@*}Q zlFPbncD6)|Z>?iyZgysh2+vaWi+3Be&o%{4d#P>nw*HlD&0i<2eOKJR`poFx&mDDi zn_>hlH1COD~B2ya>G@HNuU&Hr>P?}D6wFVALdb>FsQ zd3>+Pj$apUGH)x5p3<if&}e!aI@s-EMvZKmhjkSWEUtcnWB z^P@brEU&l~5>%Ct61@8DG2O>$A@hZ!%vNf!Zuj7N62xct@uHr$+I^m!%5@i=FP;zJ zZ(M8J)Zm}7_SH#t+bbKtyblk$c9n_kQE}A$gW5N^PCPTPKAU+cR&4bHw{3^y!c#8! zZ=1br3X5{lr0F7+43?L^O{o0#I!JV0%&u$m&Q5;uF1I4^XZF0>Nt0rF&zmiq{Z`Dw z_U8Mwx$`bOO(|L0m9oaFJ^H{sugd4sSe2ryJw4t%4bd&D2y&XVX>sEn$CsWl&RIED zvO$w3R8BlID?(b+Q#yoemz2Yn2^*&Dc=dTs&%~}a-rOBthbBF^Q}t;L!=gvcOGNqF zdSp*}Jn^fVH|KTKca6Dw`l_C-IIV2En=8OZdmf%L z`9e?F^!Vg0o{{X95*{mTT>rT+Pz1EVXejOo>H~xOFlAi=G8%I0n6{RDog{i7rPy8+|lRM zz-hs3`ZjvXq@_Z(kx!$-wwld7A!$0()L{zC^1K31)2YhE)m*!(R-cO13hO!&sqM~%=>pDVabC}>-it2XP&jLoKq37^?s6E zq8FDZ%dgc3pLiTx%8{G@@L5;czjIr5_FY)6dA{z}rnI7%4;%rKj`H05HY}JjN8L_s zo7u(S>{~`_deR@SF_Uq7vXbFJ`K*;GvqLhiJMQ#c+oI}yXS)BQy0==MK@<2cSeC4{ z4l{nSdVS?8U*Tw%zAb?*3ssiwncyDi%@L@g@m69fz;QUb04`p?A6Ex9dwyZ|YAv_3^UllOhRwU9&|$ z?w@?j(0po7i;7I+r71ayM^Y?b^3`3A3i0w^Z_}G>^1i7|`OuUp@*e4SqEC}GEq|;| zbn;LsQeT_SpnfxGx7K3kMCX+ee%ck8QyyxZ(0b|2LX|u?>?-zWL|MLuX2H`wN=>ORq~v+S!=cQ53Wcr^E`gkrD4&*V^1b=aJ@Un zUzVN0tbXyF)qE~F@6!oORx>=$xIORH@n2JQ*Q)k-K%T;S*U{%raD z$t5$D`>cYLS63{tv{pS*qvJUB%CFT2P99sfUp++XM)c+m!#NE64Ru@Ur>yV$Q{ggg zM_1cZ&8NC%C+^I1JAD7{`9u2-`)Uf#)v{pZviw>b{P*j}^L=_prXHCt&g3;W`_79Q z5rJAiR6Ym3j(1$w{_Vys%MZuj{%2UoE?aqhlK}gRndcq5K26;5^<{*Ibsty9*OIjt zm?jvly20g~<<;gX(_8uUe%z#>B`hM-u2>(pxq3i#`!u0j!q*@CXYfzU&XNw^AE2d~ zyKZaSwI6ZUxK1+L{QS>w(@Ut`T7AmGm%3^T7bM`^+ZFjrKHFJ21WnKrjImBN%ooa8JzPU0&RrCC+ zRln3HCn#{8uw1Voc;)(%YcmeM&{#ghV!c;{Zp%}b?~~&+)-n`5Z^+K*pXS^ZaJ)C0 z*=F;JPis%{v|SKeD!^u771(ld#uMI~S`0nmOBPPmzgRGpF-}G+z#-A&7N1{6{${Vv zKtIoStBln%XIDGF)Yw)q&!ytpl?e_fj#WNBv_~%1R`8zo$)Jg6J};>@y7MOFvhSLe z-pUsxJTT|BXgQW*2S(@-!8UPRe2((#QNM5+M3)2 zs+{lE>h%5&Zhja&i;GW_BT!XK`S`xI!rohS-Neso9eB4uJ+JK3T1PJqg+KZ{VON9- zCx&O7EX!FuRfHj|Z28>4xuOTwdfpRgE6;hq_Jz|VGtHP*Wse}SX}7evn2$}}ws`a9 zFplT5cFyOx(|fqU%WM0R7#13-@EMXfv@jY zE8FxxxO1q|1-{&YGTnnXY>m3M>TJE>+2g*Pjh{x4p4) zxyZIjB26MTnGVX5fya9@gQH{b-qMzMV%=NC=@+&&Pg(MKYc`APCyktKQ(1MMlvmd; z%Zy-GU}c=|ecMwyH`}g>k%cFH_jNB0XAZ~c*>g0NuU-lJqJG}(UkXEZ(S(*Qb60)o ze4%NRn*U{v#8HjY*>UWS_rn8?+r^WvOqi0RrDgH*zE{$=@SCfdSz`` z#{744zie%bQ-4**uJz%^tGgni?(WN$tX;yI(oh?^lace3)Cq>q$9=B1RogZ!ba}pN zWsppv=Pj`Ye!W`Xs2_{gZ@yACdCqzk4Vi?nZ`G!n8y2luek5s&Nvpw>6Ov(^GQE0z zq6%gc4E$sMNo{i7xNEnq>c%q)4U8v0F7;iwWvTY9;>)H>*ltJt6=L_1t9eD{>4thHr<#+sfd^PHv}^IkdO*4;!2NtPcMC8un=v!jPj0(s zMDBw*V#mw%T&~I=iRIV&&yYLmiCNI>-ZkGoURgNrLVby&oW$x@fyHV$OJjB4o7?4i zZQFU$c}Mfzey&SjBn#hMVwo0|`2B)QiuUCwp*o@SE4rSXWu5T)pzho`)0dd?KKFWM zu|3wdEOcj{Yh}xxb4(LjnZz1DeO=mBdTFEX&#d5`$Fp8_#y9+4{zz@vbvwRSl2#{A z{K~tx-e}tOx!ZoZMP*xXG5q+oG0dHB&+Melg|6o#&%2)1OXX3N4?e*@Y3Ibaq)X=Z z2bX-ae7|VxMJa_>C96IbOnD-m9K;-vyJ)fMA;X3m%j@n@Yd$Q9OuQWtP^qi3(#!wQ z{rjJbRwiyep1ADc!M-!rf$>>q+`P)RZ29!W@LuJ$tw(yM?YW`qp;~=1f8So7s#Mmr z;7K#(w{H?^3TSz>pjJv!(FP4OLj^*IXiDIb&a%rw8vI@3#V32OJBmJ`{w6uyRFYLnm*ssccE~K z>T#}0A$OgtPgX{Ts@%Buq^!xS>&hOU#=a>N+eEhZOwBu}dA_~Ydgrqj92V*fd6LIB zzrW;}ox3UM0jH-WC%dZM;mErmG9KNMy5rR~C3s8mF<+HBW!tX#ewQ|^t9g0$fC%?$ z39cUs%U3Mv;uX=ziBChl%v)=lLt4PB!gFZ z1P0zRzU%qhg~`nz$oSO8j4er*-(;7b%*gdDR91fQY>S}k1}>3%g;Q6}k*Uz+($dyc zUm!B^sM(S^sz>_Qv9DaU<@C163mGzxbA~->jtVhbv7F_>_n^H`kEU+paw~ghakjFO z_w%ifXVXq({SsWeVe`~U3+%RhS?jN=yW^&}r$UiJ(1M1d^0X}$r$RQYOW^0<9S~cP zIpIWUh2N7kMGT8C{>;>F-gG)kVd7QiU2{Y(O_{v+yU4sR&lxTk@0}6V6tJXk#)>WS z>P=IoHcV;Ij&omlb0w$U2JHmpynFu{q^@tSVh9Qdvwo#|!LQ{L^FdeHMNPihUQ+pA z#6@p?pBNn<7~GobdHZfu$ifek*2w(}JsbAZw8vcASUGDFXJF9p*TEi~C&T@jqvHfm zS9sr^vd)ENUg%O4Gh1=vt~JvSYPTO;7oX60=6U(qDDJm!kNN9|YHQ^tJk5P?%lL7v zW#$pVTV_+!_pK~Fxa!o!h4(Hh2=%#beWPw^p}cF_V@9nCP3NP^N?X?IJUz6rGbj1HL7Tu&T;0vS@r@92Z}( zCCJ_8Ns*_eytr52F9BaBXD(IG=MxGt6+PX&Zre?-%`f@pyeTEo)-R~;Z`SE-_Dj#K zc%IFb4mMezB{XNroH^msr4^ofoo}~$b@zqJ!-yxvaWc9)ES2YX{AbwKzer_=$y!dk zPKoymbulLq%;(X>_%V&FYt)lOWcMMOsx`Y#grd@6=mJ@xbs%Y16 zs76~)Q+?ilhIw08URjZw=~#D4bk^p>XIHvc$h2l0tE>rGxK-?SKxyX5C8zXMo-B;` zc+`ATQbN-_hfixt*H?SBJymq5xIRby_@lGVKTQnX3LUsCZ{6BiwVK6T4&QF=%OfRrWmS53Q;Yb^kKOXrAZEW7?;-F;4UI zuYb5OwkwL&Pu=pFXvE3S2a`^IvYU6rPAT@`DIcTu8`jL{zg336@vUY4R2jSZbLOQN z-D1}HWs}XPc-%jKCS_inZT55i$xe&ayUx2$yA$qwW_?x|SHss&>leoPZYz^`ylvWy zJJHqBF|!y_-HSFexp}ZZTF)MMY^m{L=^gz=e-`av+7`q4xUSh#(IGj=$!4!k5ug0# z_0#SYxwKU*x1GsddDL7=+x2+BlsPT6{YF+luJ$jvTax+OD5_w=@7W?vQw7Q;UYx5h z4?QmP*r)U8>N}b@f>*lK{EFo}bNxouzDZG)$y4XWFRPkjI{75K)a`?ux0ZE;2^2q$ zQ04w|YTKMooG*MUY`WY$8Gc-96T1Aa%=69!%SrwUbzaZhtDao#Pd^@+ov5mpAKu_w zT{ySVBJ6|XOJ~KqM@%*_JS&d6A>xu}pRv^ZmdaB3Sg&#>qluHFq#4#&v}i155&fH2 zkbQV{aKGX*5yQTk->)Uh_=~)l@ynP+@TV-wS zqEFS6_zM=71b#YuP>VV1kmu_OhHhbe?2Bx&RaGqxb&9@t^2;P==h|!zhIyZRu5T#t z_vpO#aM^WLUf(nC zK!fGG<7YH-58S$Xb9I^Z-_Yk(b0be(628LHwRKt7zVqrUSZxlxj-GVkP4f)qd4=~Q z`zLMvYIiX@ChWNIlv3t>tA1+TyXVidV>#bdo~pBX3av|R=ebudD9f_$?vy*Xb;E?k zJGGwJ_$vK0n)IoXcj3{M9(MiP8ZKEry_38z~7tY+|#?f!e8%mz$TTG%UV0) zGxn&;99Jk0`=Y_}WcmD7WtSP5$FE)xss0``^<>Yj#*k$Vf462lnPu#GbL*set&yf1 zQ{F3b1l6Bil9Uttvho(kN6`&23){UWTgZGD4bjq9cUtnTee?4ZGC`AXt}fy{snAn# zIbx0~OJ;uX(E0Ycz0!YYq-M|hD0?`~t?oaA)}~1s4~{=ulJYd` z*2J$nPOe?(XS4OWqSi4Z!@!3t-*_^fw=Ll*W?Xz~Z*O#B(4;Ls6E?6{XNj&!ca@P; z&)k0K^VA7!_hPjxoVx;YvodlerTet3&aJ(?DtpSw#K>RQI?tbv7GC@1cKYU0;js0a zI1a9eoHWr|?vmdmhFhPG)jCi7@jBaYDT}IZ^X_GCStfH!mrdTv@!erUQMp3$qqQB6 z??{-CAXZmV-wao8i1rj(8E1Po8p*?_6`R z2v?jX^Jv{XwMmK+3(D?b% zvanl1oDMgp3O}g(8`||)MPP}=z3w^gb#W5wvmQIIRNr)A{aS6g4!znxA-_+|IJ!?T zYs=%@)y0i*GoKjFinjk&ITHWz(cWuf=@I8o#qy&G!(z8^k_8ftJ%G(H@Rb9pq6URhgTA;7MvkD z3BP@{``7+i5*IbWqCT5%t!nb;9ZwiOuJ|?0r691Z@=#FIo#`i>_Hp{xACGo9qMjDE z;8p0xjQ2maCMSpg42ubB7I%rBsrjsBX-m(Kucj|=Kc9MdjpEUlueCMaiaab>xcAlZ zvf`kvuKQ-}l-zZs^xN&=Mg<`Toz*JWPPbf>&p6(xnv-u)dUnpYz6Dh$&ISkG`Lv_v z>5gyCyO(|0dgA-{@7Hd(UygX;5wq8lJL6Cjx99W6XG4XrJH&ZJxH=}R8$LiM(Vf>4#k7+T#tDo{FRH^2!_p)0~JJq*T z&S`$!b16*cU%-mmokA9~mr8%Rvc+s=;3cE#ReePsQ$>F0aWkZ@;ozR|;Mg5at}lXb zkH>e-lPJ_-nsKip+IuIj*r|f`@yfH733H!fy{cP3+ihC<);NZ|Y6n&49oO0}ALqO* z)Ayf2e#>E1i`+YB+_-khB=47bHSydo^;_ASz65`geKX71+v%WIP_wF|!~7;bt7|dA z>llPZpKY6$oETPT!?kGU=EB?;9LX=|U)Jy`U7P&*k<*0~o6 zGqfx6qHfI!n`Fbsu5~dzG-La=>FREJGRr-Jlr&YCif>M+-Sbkr;2mqMh%Ya>tx|b^N@pSO(wIp*Sys!-Yvt!% zUzl#O)#GvRDf={ArX?p1?JQQF8~AFHNrZ*fOtbG|B1>6BWm3e0Ctg1;(wD5WP}Qrj z?~3e#l~+>jHlEwrkhxA~pP0Q__2qXWk9A!pEc~8b9mU+1$5J-O<;wXL%5p8@=R98q zY~_m)`=(h`l6>x9l!JMgQ1FW>>zp&$|4lWU9+~>|{Vu1}E%UO3W@-N3dfs@8JGavI zeR->{yeQm!HSD`vU9hj(*+cDj3-j)o8r{xG&_3&VQf|$Ui_dSK*4VJJq-4+O*0mmY z-~C;i>G5i&Z-4h%Q_sCOq%+>{j}Gwv`=$9~xb5%hhfXMX50jC&x7gZXZyd<+7!rF3acJ z^2<68)dOz}?_Llx@zQFu9p#HV@0HA3Q!{b$SCht92hV1ex0jh(v~E27)@xBnkolA* z1LF&yUxrmmzc?2dG%?BJnw73~$g`E(<<8GweDnFIrtz=)F57Na-}h1F`TS**;|gmV zWA9ffM<1qsy=wbHQLC1dWnSg+@~GNv1$w_rYmT-aJiTeJ-r49UizjWIb1lBQM(S8# zKhxzSy3)I~t{5`;*ZFJl3w#k^|0ib-3zbV2 zS?%om9MBmx@2Wt@z0bJ}>mMe$`DQm)nwvD7>)q0JYKqXJpB^eD%F~@=*4wP>+wrJ7 zW^%g4{6+K1H@cn*+Uut2e|J59p|SIpdBN)1c7kUWT9@ff+HN-2G$}jdho8+N_f<>8 z&I!M|-Q<*fyX0Qz2fG!E!@~7?qQBkcjh|K4$sOR+-PGo8viZz!%j>O${_Yx6%<{Y= zo^ReHd3@cJ*R{N>wm1u>#=Z@6=KStmS9HpVQJK-!Qe$4I@Q%2-TNM}lXV|f_@Zbk- zy9pmyzF!JwJz25i^um|-v@&f^dF6h0T41TY`Tbh;uBr%~6*u+VmFESYTD1D=W_9)>*Uet1bxSS0|2g1t1|#R@yA0ut zC;l^(W`_&ubi}#MpBGg5sUYP~$u_=*>*rFo?AF!{P}fSHXHeN6uD?4dw7|YoiF?wF zT{rF*Zeh1p*zE&mno?CnLX|@>6>Xx(#h&EoC{6-b#Pk}Xrd9aQJ?Jb(1lwb%Yycary(w77Q!e@~pN#Ta-%`sDME&2er!_Ip}STyp!| zomPed+dZpl*OKBQ zbgHq(wjUx9Pg@V~1wDlumv(qiri6w3xL_;?%NzzCiYg)cIOtuR7nyA+HWqX5Khn zaN^gb^LHfHaKGCcWi;37gs1(3SHHi!ExstOYh4oBAGp(W<=KYq5kBV|L@!_RJXYve z@MZ2Q5AUqWmMP!0q8fi@yM8ZmnX2uQxclBZFQc4JR(A$AK5gxt*-MsYe>a>^_+rTd z{@va?I+yGID!VH6F@K`*hRXBig+i`=*s8fx$WM3+!^;;|rK_Iq zSm$E*C~I}wo`}28G8}(1O!@rtb=30gqP5FRN*D^vRqfjr87O=0Fj@Kj^pt5AUZgD9 zvB=Z*(2{L?Z4Pl1CiC>BbzY|~`epT`hPyS$ZTxX{;Yq39jbF3Zl+3@G@aaFp(tw}kV)vuME_-;V zPdI6*wwZDJy6+j+R&==}tDZZft&)84?)|@(*Mxq@8oRBTIz7KJ#kMpx;zLlT<-}?g zmHV?ezwVfIcj*`R-S6&%iJVG~R?^DZekYLAiSd@@_etxV=Hyn@oq4UHwO!R+;a9@* zcUPyYR-)&GwgW&s}@o{P3D1SJ6A$aDwgbKCNl<8IsI7etdbK z!D`9H=zeIczsHxuXJ4x~j8${`zSC+6!-A z1l;A4RH>0|US|2{DrY3`rA>;_9KW%S%|2irQ6wUgGHbMR?i7uc%O z%F|PE<)E3i@9waOWw#%FbBh*|DrL0bKE%nk@B-I$wd%|;CV9L58=qFr(K1uIv(t9c zCqHJ-=clc+lRZ`KCMPfzo=DoekX!w-LgSr{)0ABGe-qa)k@H`z|8cSRuD3g%-O=;5zSh|I^O#>{-_+0A&HgUk$94yQmd^D! z>A%e5SoJaOm+_O29y<4*LHf&SgC$MRv&~;+)~u*c@Obw%ynR(~meSe6La_q9$ z1z7!_$^W0BEpPQaOU=W_Y~3!Oo4TXbWbW_cIZA74HUBe+zuD9IZ=3TItA9;b!)!96 za|@e;%5qLNwc538yK<(za7*d!9qIE|?fd?f>pAguXCN)z|C8%vS$D|3CpV?{Bkb;`&GA#_TN$WkItC$ zq~eV$cV)hYkiX&?zC9nKHO$tE-gU{mU3*EIJ0sDjL9}Is@R{$IRF&fH-LiBGYzV6Q zx_tMx-mQnHyw(amIz3wXRnVr(oqoo1yS{Y%XD|s?dOLBp>>AVQvsro{UI?mnXey4} zy7iOSq*@97GeIA3EqPM>WmouuH(Qd8q$MpFR!#QUzVD9f*-R~$5)D=N^~RUBEDC0f zxvdqT!XUJG{-l+rIrG?Cex6>TSah3(_rPNI_t)pxHSRs>!7S5PJilw{9g_>&YIE)$ ztG%b(b9B4zwh4#56!Z4%Z<>66OYfaO4$EW956v#?-nVzT-nL`2W?c5&zg1s&Bex`{ z^6nLD7xzt9t9z5z^6^Xi=Tlbtt+cOVu%x%SlD{_|cTwSBKILc^xzo+uS!hWc_@RCx3UYs$XA*q-6)%r%M!x8GlPZAZDhO)p>d$D6fVerY>}Ir$YB6|ng+ zoGV~>8erWd(6n55s_c@_j4_`t%sS-hddd9Q+lYHtkKJ14G+FR#Q}OP^ld}IAY&G60 zY4Bb<>9Abkt(#k>*s@ls`z4tMDWcn+h^eeejd&|IA!MFQ`Mg)2j6Zd(ck)>_URjxC z`St6Xhpd_xjdwkm5dFZu?5^DTrFy}?1$Q1gQ?%tz`i_3CTYqW)f<&(d!Vm}tK?CzS>Xyuo) z*G^o!GU(wM+s)Pe*SEY1ahmvw*>2aH(~VAjsa7S$yOxwWPo4Sge52-?t#(>-ZtRY7 zI(U%v$)DP*YCE>Hmn}^A^dnZww7w~Jquztdv*Yr-lMA9YmGjK`yspwYbJg$N;tPEk zwk*5Qw6#RZ%k%iAsjkh1J7XS2>D~(S**RJKhN0}z{OBV~51*F*oFy;6YN3xuv}D9d zo2he(8HzuyoA4=hhsD`vf9o<^7x`5Cy+QW+ZGPn>-E zM)dBkXXjI{2E<-n8M@3VXYzb+6{{UNx(g-*%Xv-nlW~+RPSxupBA0>`FpCc>9mol>CWXBZ!2E^rnz*^lbpb3c3SJUe=E8hzR02SLl~y)m-9CUuP}Y_GRU+ zDxT$TKH&j-&+ssnuP(EGwc=9$$>~P2dt004mn5rlhIv><6+zeDzJf7w?z&rkEydB*;ua>ZNi!ra}<(5Xd{*8=ZNJNa+U$FO&+^*4N;IBVu@H~&Rf=ABvSr;@@DyrrV_ z=N|3V@4h}TyT#$hZ^V|(GtqO}akbydoY&4DDc&$y?#AV(3Oz1&-!9jvT9kWr!HRRY z8a*t}DA+}HWld$~J9E3!%PXq>GUv1P{u535jx8^m+n+0O-ZYniZ{Mv`Mp+?wk5*00 z$ygn?@Y>}i+nF9__6lh=drf$|N8oY$0tZ`K;3Mnh{Z13!gk2S3{J37ClcliQ`d8e4ZvMi5^KHFY4MUmUuQRaG!4DeEM{1HL_=tbz{CbSy{Y#_rFL1)F86r+`q}(zW#vWJ z)@X_2-_DDurT|Cnd+UPF?L&ExOCUb9=_2 zXvwEp7?&PD$-`tvTT*TXyErkuTe} ze#S+^4I>xmnDv`7JX@> zDYN#w^&3U zx_W2P0{6{x1J16I)%g^kV>RD~MWuPer>7I|xtCd$Ur+q0zE#Y+iq|Oa&Xc>=7Dijw zU&`~kSEBMDLD#{|@R48UvU%T6#@x7Ksj}@H>&s*|uca~i{JQdscD|duilcZxyUnrU z(6UVzrmePq^*M5S%Tg|Djvc$qEBdxxyCrvI=}T2L7iamiL0h~$S=y#w=92Y1SN(eS zj;(6iLi3#+qoYr%OT2%@S{1a)a{Joj)^R94yvd!;j@?szk>dp8t2`BnYndUfgK=J_TeRkB~h zIkrfPE%?)`&A8KF<=ebYYbnkj&hw+5@@Z%8)#nP&lsYcCWOG}G$1U%MUk>R9O4fb3 zUXbK`QSqkVO0NlRmnC-0Vdt_{ZJG0==!x;^V>`6FE~V~TK4n{1wY!K@Ig?Z8vC8MW zugA58-O+h+lxt$>UAcPSSDxFZnp~b38J(4*$z0$y$)30B>hxs~H=W;k#?2{Q!X~6G zctU}v&F`NzU#55H*_E~)yvmcfjeY6Eo67rUmnu25i*6BR-I@2K?BCG{yL}bw`HHi0 z<<=yM%Xt@jM7=f0*=F(SO@R989k*JpFWG(Om;V%&o|02RS*I`F$~(zXxhC5r_x`ETCtDV)bg1n}y7sVAK-b{P=}fP3juQ@A3{R3} zT?3^qU1$BPS+UdAyD%+!N%UbZryz6o`yAnp53-kAY??Oxc0-HYK}kjl_AR$}Ml$@k zZu$CZn@QbrmolbJZ`WqM`yteC_`UZ>LwZWiz*^(WJ+v*tSh({^yG#`YhmnG@6>j&lfj8D zOGKB5@>KhlY?tVmt9nwy=&$G?Ke<>vX1P)bA-&2msvgAmEQL5NVfNjCR*qzU{5$D=+Q9=)HQS8>Zq^&N}*Uftp^M~{^*)8?9RXmL!yqOBIKBHJ7+ zEL2Kgy4+Vk>0}(#x5-;@iNx7Sk5ksPGQ<>@JHE{GVBf*jYP<65tf#vx>ch{+Y**eX zv10WkY2{fC2R^bE?`{Vn&^a8aj{EzeWx_`Yr2EctxOgXEjB8@khHTZF4l zUGc-c@M77_?ccT*#NFIG$K(7Gm8BbBG;u0lI&gx08pl(=DCfX4T&{a>%Fgy(v&!Yk z>We{FCT`>kH|hI$qT=(alU7at8On1D^Q4-do7rcmSj%1y3ka#4I>Ab2&L`!y5mKIV zg+=XZ&u(81Rwyf+(AYN9sraQv@};;3Zu~Zaaoacwiq7u%)a|=BL7ewxxWpySj$4;* zcsHahD7KSWC;91KWcQKPtY4>1I^BPOZ_l#uhIdyPH~jdWy*=Hv%$U!9pNyoD*M*MP z#YIAs41z)|73z-k{CeHKXZw}7t5q45x4TQlz6)%xw(VfhpA}>qdo|Z}kI&1?o;!G z{7h6|3**_N?}MCbTUz*Kru^u+rWyHG}^h6Fj-3GtuSW zOL^7G$&b?0e{fgHb8kJP-BKNU=-d%yML#{CAHz8 z=ajCS_;}KDIjL7{OU0bI%cKr?d9w32u~{{^ho;MZJzIY0lgi(4-KI+%=MCJfSNrDd zc<|<6uSVAwCqu1g?M5-5O;s1UzuDkd-Dez|oO9Vm{ffWa#cM8%wcC$oWeV6WOJNU~ zvU1X^t6PsUIrSMBh(3&2diXi#4*%SZeV3#zJ*pH~GI{cet1}nA`SexxkZ9j=PJW*$ zn`WF2)JQY%;<{6M$!v<*rNCRFOqL2iuJhS(KY8=g+n;?)a8>E)+cw@_kAL2}H210P z;)#d4s~yxee=Q2(?{kz{{is_sz3*;S7fZ=SU|k?UEgs=J_}pzyk~Df{Mv*X?}~ zI{YvHCLH;F_h|6q$|I-q6NMf;$<#NKyyL<9L}jVWrwzR~PcGlhB@ykjudM+3pHq(IUAa-Hm*)_8l9Qc5RQUV?Q|m_& zTX(L^eRD1(;#*4OqUxU8U0zB*w;d3BoX5)Y{(Rtv&9e>*Z|m8l$JsjTXvJm~^|1AK zcF)h55%$~ZQq8-lM(KM23OV@;JWr~q{NP%%XNAy(a=*1RUS)FTg)x0FFZQeCd-G*= z+--fIlNY7r(stH8*gYv`LWi3G*AA_FO+mN2^;A=qXKk8%dS{%d+TbC#_{~=okzp&B)pZ{n zCf6gfwA%R8nz<^E=3f?T7qR@gtH`!<)%WhVlM7ou&pe(GWSO?-$@ggM@Y`D2ku1B` zdsuGy6!^-xF?e;A`cAfMcU--T4UIQh280QPIa*gfNVp=qh}l(7$kRg7;uULTlzz}% zlj>dhK@s!hYL2)wrh0IBcieg85mwbBe3||F-I%g9cfaXwUFol3eQWL0wVDxyM@3gU zG|riPZdq80vSv{5+`G0;3%{*hcvP1muP`gp!;(|WQd4eSsmYdBhE~Rxe6iN6H!~TY zvaS*AIPQI`^?KL4)x` zo=WY(m}i^3ri7k&^6AIRRatFwV{)cu{1j4-o}Z)hHY>S^i(hGdK;Y`Mmq*I-w}qSh z4&xN;UZ#m&P;`XuQdNI#b_vA@dxLc`HBy15 zJyR?MH&#yyDX9GWYu4@P_`TIfQX7K4urr1Br958hq`N6>*(A1*3Ds?dZ*8**Qv<&% zRdc@;zU5NRvV6yqFF&=nbGZrCSDw_{_NY8{y(`P(`Cf&WI*zT`(yFmX+>j&8vPjYS zokGo&rmT?LtGSNdJ%0SyoG(QJrM*-6)+hOV+qC9)z5FxNle0VL7CxDO{EEP$my%X_ z%-ngUhhFb{@#wFJ#9988TkPyAKCb`taeC}3jD;~5*KN6Yrf=jDaq{+r?)=R$yQL+~q0*^iNGq9R9$LjSP z*UhK9Ua#5vj5qPvw4gOSbJA~jHLbtowYe{8xzP4?cb9jkUnsjbXX2~%rsg|md1-#J zh`MJKV(ssF$?MeAvtH`!{OfzYl3GwcYm|CCx(&puu3vhu&aqvhru34Ie!!g+BXP^vDIGt&+IN0pIJEJO zhrPi1`PT~PseQ1B_7XDrJL9p%wj=);R^+X^r{`OhFa9;+<%2UG$g#4BvlVf6_gr z_d(TBE!J%pWOLp{*z&4<*}mkHh0-*Ww%7E5ZM7(!Q<`ki zwYh8456%_2QC=7Hx2p$BPEYqvy%`H?uL|p3+gbSZc&SGIIpsrw(S;Q%Z?b1injn17^XsMA zv%5Tlg0`wlFf3oeyrXLO`SqewlN?#SR8}m{{HTyFU$%4kX;t4A+OeQsR3@VW5P%)qNV_1@$# z8DCeJH>LUHEz8+UOl`uHH>IAMb(mN6Y0L7$^l6W(c-B8Xu+%2tV!1DOUA5ocrOtIu z3pbm8-u@y%r}%bX#0jQdPbPI4PN{nm_9>Qk#rn-E8o#rB(!*B!Eh#c~S#ry6g~tzt z9qbR+7c=@4&-wIm?Y16XI-$!~qZ4zvb!kJoj#O z>u9WKEcq@UXRRF={r2P@n}+Mp8O}ZaDr#f-ZFhlzduu>>kjN6-CZRPt>Jkic70f$Q z=D*1LX+K@vY~F3D+;=Q@lNCStsi-Fe&=;a)H|mH_1k79XEa{_iKj93EzY5 zK@O}RD!&(*@|Rz(ytHJ=!=qpSZd?~L<=oyY$91Lm-=8=C*4FL2UL4?N(U|YOC%hu7 zPvNdf$;4c*DKGLKT{*tQG(YuHKy*ZqV|WGk&%#&hgf42QNEYSnzu8$OMFdRR&E}7rfqiAeQ$kR zS-v+n#G<1n_+370sd-LIu~50X^R3ZRRj>06M=L+YY>x3&b&lJRdu&~f(R8QVVmDrE z`Uk8#>+Bd--ft1|qVYhlzU^6St_KI(f=ySd%Aw%RTn>@B z4G+&~2_7dS;#tXXdP`o(3|kBn>0KIbv-@y?Jbky(9yzPpps z%U8BCpI`QEy)@6$zjDc5H>n455=r5Qk z9%3yP9e60`L#H;wB$usu2kbW;Ey<|Jojfl-@q$d$)$nST&uXmaPJOzV_c>Yc$KO3{ zH@LZYzp+oczMo~y+*7um{#ws;1MPBtx18Sk%72dkv`14ucR9H$RjS%-60l-~4 zlVdmKw(U4@<=WHYoK8z_4wXNwp?OP;LLP=MiYfiXA#*NP`O#{pYhk^C*{8ng8gX(R zE3#JowCZ$K&4XP_CQP+@)$#GycB{uH4_O!5RjSG8cRhLib(2mi!`8b=3R7kHvLx3% z%=L?Y9xK@q?RBrxJ4&GM!jt8BRzj93&n?zzJd8{|eRi)G>z4hMEiDg$Ke;kN2dOO&LuHD~7A)#?hrLM9zJbzOTCw}gX=N@H{1&a)P; zwyfW{dHvZdEn=x+ca$eLSh=~M^e8zc8+$jE`%sgmJYVQZ&7~?O?u&ju;JT{r>FllN zRkG@{M%ygM+>9V^7q)5hs{1$&tn1mk>ZZQe?OXe!*Z-KVdtt(_IpG;=mwLPv3GrVL zRKVX`EYEp&dftVA=eO@fn+sOXe0JVwy)WOC1+0vhr&V2DU%EFY=kvmsiAv8+UT$f% zS$AdSPN8{jadFirPMmMczS8~MFLvF{*jMILUcZ}a;oW$&b*;B{@SLBb=?jlKK6$z| zR%qFjE$c2Dyya4U&2HDW?EAH=d+!);RbTebB}DfopL^A#4X+w~7v()!tTJUv-@}-l zKVo`fFNRp&&{B@RlL`Eqlks@)~;zl}~;cNbPGq|E1g z7kl;9dF928PEU7Exwj&rtlvzIWrcQz)3zy(EuYodOErF!{H~UD;Pr-xzQ(+^mbP6& zQ%aAQRlh1;A?4J3PLutzmU_8Pk;?BHEyndX-fRu~6x5=3Q`FPpT*#!pc-ew1$*W!Q zmCuw!o=uvxwQ@0z_+FYoiew*0HyjE84r&3U~i>Gm&+?w%kt;~l5})IFY-3<~9P zp=SdmIUe4AVl}0)*h78&wJ+;>K4o5+X!5t)c~wY9;f?uuJEP}>v`o0%71BDlJG@ZQ zCA8#y;<|;AH=+{mt(g_~koV@rC3-cXR%b4}2sX0uP@eeAzqaVT*kaX_-6?yv%Q$%n zy^IpsympmbV*3@ZIo>{IFmVR)!<4~y1e9QfO?7_oxnI4-!WQ0q$fAAej@z3C>qGwnV-r{C z3!ZCf6_Th{uvAM(ys|=P`9yU~dyXdd)}nMFku=?Fvwp4aRMZHtV%)Ae4# zI|9#k>7H1*W7=iUYr#P+EJ8D4_e#Y~RYzF3!f?C#qsOU*X+Ipj(FconD| zd}o<|$nQBXjn&pF>+Ry|Jou4$YT3(8ABvv&ou1x#S(ge$B&+yhvaGqs=4I#P^b}@+;~Q6dQ|cq8Q!g0DrZ+qGw@FGKUVcc^lnpb(an<<+iVK8 zveax?{7$DGc)cPuW>Sdd*Y|8YZ+B%*>djRYir3RMd{nGF?Lte^y1&jsE-kv-k}NJd zXx@9(RD6f=`H6J)N2}bsr*oGckM+*GU62>hFQt<{C;O6n#uViO_Wf+@SDaXS(L(8> zz?Dp{`6_Z=Z>D=eLf<_v919n>D$2*s@3+00 zo0*-vOpE22lFgO!Z^tGr6Ms?x2yenZF`^kOSQFqUNcvl zyit$J*(Q|7E3!O4v`A%g->Zl9+IA{0WwTeT`6jDaTJ&D-pyajtGo~Giihj3R#q<^P z{(Xz>GIVlY9PA6vDS9YWoo#w?$)1AF-Z}I3+-9CYn*6HLw+2<5}wt1PS zI_~&|o_Wl9wyLo*q|b_J@8=o^o-+KaY*01YgVF7hs0MtGHScJ zgUORuRKIA_lrIdEd-!Ah#E-=Z-O62Iymj%ViSm~OA1SQ#R(PT!_hw$?dT;+pf)=$q zx1T&$6P@WCl_hlh=^?$Wlgg4$L!W$o*gE$?iG;f3^Gi!-Ef3nfHt&0HNJm!p^UdXE z$79UTOMbA~dBw@u_4t&v4>e^rWH(2B_qzDvn5mSWt1;{D-$`#}e+n8(o(z1vFS_tZ z4$D$?7G+zm4V5X$b7N%eu1B@~wkuuuO zZJDxXDZYLn)?AR8Rk?+wU7&ITgM6{6LjO@-ts6P}j@*6I@65@}d?3^?=*_8!?L{T2 zi-XT!_2rD(rKI(y1Y0UC(d(7mOZ}Kp=QNJ*^XH$2Xi+}deS1Y zq=<#3wJJ9J`g*^ZhUYWR&OgQM9yv$v_vFHYPb?}+@{hYbe!OD2u*H%848rTC&Di*M z(cP@ADqAI6)>!Njp5!Taf8Ore6FV+OJidK0AtQfv#%ZUC4MNB5YW)ho@2hJ0IJNC_ zejvMa_!+608LYZhLgyY$3t4wIQ)Yi!;b*SS!tI=CXSc@l`Z3k{AC5R05}7A6G4NZ~ z)5%+wI>wx@yEuQosa?mdiObjU=_)4PICX+u!gkSrhPwfiZW-Uwt>;wu`=4Q7_L=NA zH#od`_uo>K>k{%;>6v``sp<2p)>iVVtJCi+yR>$p<@2sN5p#Igm~U9Irs&JYkeoW@ zb!tMplfu^RJo)>|Tk+m-jya2OJSv<2G-N?xti*DkQxzen-FsdXd{~y#c75-*=LTG} zZ!Kz`-&DyXe16Z@bwyESJBo_WPdHZ?)SG;?*K^I=v$vitoH6ZL4EJY`pSQO1RR;cg zS7|S&Ww!VH-aSis`&+6v&MVFN926sdn76Cbt}D}f`@N9ICvtUFx3)ZCl`Hv~U7+gn ztu=0X<*ElKi?my>6@{$H*9c?Uc-ds1-1_Mv4>mOSZ+af{VN&e0TQ^H@%~e&*)MPF< z+*AB>Rc6AZ30EeyvIX9>o~nAtuS{-9f=b%XhcZEXoHN;MH1_l{2B(WIdwq0oV&V4v z`Mw8Nob~iidz5V6D)_*^y|gsx#Ke}5d#@Rs35?mv<<S z=`Go5a5Fq_Pk*R}-}-(0j=N83u3=VPTe-A_}Kz2 z+ZyNG?A@=NME3TT$ej3iHhfmy&w{Bdb(ZBkR~1{wGiPnge+C!dh+oUBq8{l!)m=ZS z?Nd!rcBs0l&q1eU%BKrIOl^KS_p$BOz1k;ED9_ir)Nz7KTl1vtvu!de2_>eo(pPy4 z=K9oDClxZDyJ|Fn?dqHNvd{J{s5E!oQbFPhdv+OlMMe~QOyBa2D~Iu2P5*S$2e0e*cdm&% z92Kl|Fx}$(*G=mBe>jtYm2;B>UFQ~2s*T>bppH3qkZ?ka{YV!pP`O_>RaKXoL~C6rW`4hIxv1rWw#_dS z__hjgdx_YxsyZ*b#Q3dvt=EiK9efWtB@Vn3S)83`yf-8K?dDUfJ_T>_ReJPbrO}qS zm2FdH55<%_9pVhobUap>EZ60~T~zj-qy25tcdN$h z7C)UG^~zRS^ZA<3hqb0$@a~8zH+$sBKI542iJC9l@z~M z)V_y0t-3mm7es{T&zoRhP!;rV{nlg&<^AmcP8}-V#~Hn+i&-;z-M6!f>U$OABo98R zK6Yz&&BTj>Z>y`kA5QwTMz3;L$fl_)t1s2cRj5z*S|ac$buG)(1u_!~Pt0NLpS9O% z$DK9XRbt)>&udq+s$2G3J?pl8QjOz}Utu%U->x=UzvXprbx!dWt1u&)WkstETQ?YwqICR6Jm-vfSG7Yw~)X5W95ouTP#b7wug5 zXMxJQ9Nxp*G zJnbBTGsi-_b}{asSEu#%Wz?m!*}>wTw_ION&iy2_<93?E#G7XSo~Zh6`!vZhN@!if z6DH9|#Rp&Y{b`?_x@5(~9TRGJE3$)M?Kq<*qW$)O(ZL&x6Bbx%d{REN>%;TH<1Q&} z&tiYImHb|MF8AF-870?K-k0Nfw{G0l(R=Nem#^BgTQB*9;!E!WflB7{a=TWa+&y8V>P4Mv)3r@c zeUv@zy?(7uw6c4x-*V<{UIq*1e9sHo=*y#eX>V3r*4VI(2I2*ViG(Rqj2`3O#w_kM@-{ryqvR?_cts(=s8^%i{ddYro*iDr8;`2! z2w2K4pRd0&PIlK_If=T*s@0Xb(We4_o-KKDB|hDL)0{P1*J*Ls-1D&gH^XAZ(dU5& z;-*huev5CvQOLDer$fOTHJImHwXxrgl8LO$QlIAB()fCc$>)k$>QdX;d8=%W{b#T>nwQCC`{V0X(fXK*^_I6{lw@~4 zQDOb`jccK|?XGDXf~Kf5mlXs*(w3dvUA`&zDvMx~b4&9lsW~&RXFTs?7mM=EI_=u` zneElDK;0Gon%||oey&vHlC52~`cuf8);-(29k0ifY~yn>Utb_EpionCYei?KvU*vi zwo32emGY|E+jRr4@4S+yUglwGX>;=U5j(F#!9`)2(Vni;-aYM{T+wxFP8H9N^9v;p zg>HG$^J7jzxX+D>_lLfosSmhq(Xm^9mtWeLT;ayIiUF?!j|)F(V>7Zd+lv^ zoDACV$>CV>iP8ffR;-Frm&j*Tw>-!1Qz3k5Ti>F9khY_Gk(a~&DHQyyh?Y8KvSr0u zR@bFW9ya~`23dReyn1W(==!todN;YAo@8NseKyol)k1G^x$fe59zT6^-`vr7)79v2 z-0XLjvWZSbEGrlO^|bEZpvqsbP36yuPpO!Y5luYc(_mFb!zJyq*V?uB21`}@{r?D2hYOJP~EjZdkN*OjfVMMh1NJQ$|R zlv>EE7Nr~u7tPj6Sa_gXmC5r<4g4>65lA|M-e~ zpZvM2o#+P4&*J>a!v}dX(jN_T?z^y% z*C+0I@S4?_CDCPhKFZ)!MBP_Ek?gSZ{$u`SQ>0JxYM?By0YVx!7tSjD0hu*z=Zq4leq>|H{?mx9m%#zt`-n#K_X|68s zN^{nwTUH33S-j`@)xg#J<<#~~*)8wx)DsKC{bNj0q*42VZ`=v{x(O?lq-p#oH}SF6`B=+mM870)!E{-w`mi;L>9^fP1rK0w(!K)=6k$; z4}ZG7zVUYDOx?&ht>af^Qdoa^G;($k!JP8Z!3c0E4Odi6%i%%R&4Fc z{BurI=ko~8nwd5;mE(Z3=!e!_ua8WZ341E4t+HyV)XuA`?xzNIx&3fanb&-2$;67n zRZo{pTcD}I^6raBW%7ExcvH`HzqFo~Y&+0#$FucDj>tl<)M}6SGDp3eXKl*0D2P{xgL)S^E(7XT8>@OW|i5lsqoy+X6Lo(C9J2ot<&r- zOCH*=U=xG7k&p@RL=0+-zpv`9i74z2(b@HJc4v8+z|q4Y zd!jQmIe8U$)c5eko$B`9b?5#1O>gf#__FBIqyV`fc{b=c}V>GMfNFK?E<^RkW~zqIS;8lQdW`ejdw zS$mYDJ>xfzAlHnIp2toto4iTk+_EbZf*Pg1>oPLWiZ1C1o>QlgeQlf7xives2`y~- zcIThYwVzh1g0hCsUR6w-$Ih9XJKy_ebnt>x?is7U=r*#tW;-$@KVCEM>A_Ur8wagJ zv!Z8B+ugQs*2|z%`&Rt4{95#J$%Xl!gBEOIQJ0w{`oS~6(q3};l+0}Fb8L%Vx!OHC z_wH=R&gYLO&1>Fs`Rnr5OHW$_el2C4!?Lw;$JbX5wuhD(PMMiDDTYVtpsINIY))10 zLM?X77p!h^e5@-!or>nPxZCq}^}go^_lB?N;x?Op>LBwgza^_DyePgjLvN12-l*zu zz065d6s@nc9f+Fz_PFw;t>02z%T<1AyM@0Ln5xNATjj1CcUj9x&TGb$UtwZlt*wGh z!CT`^y>)+?`}+AQ$IriiX3EO-&3%hS+G>~kI%+%aI$fPtHthnNhlR4-t>^Pz2weT- zUa(2D{jObyr{du=e9rH}r|3RivM@W&uz~BW?^+w%tXEUM>3e0YWIU?qsp^sQxA3^v zq(cuvDl@(2Uy&Aab64`SUiG0;^^kPJbyc^$?-I8+6lbU`b+@!L-MCageNjW>he?(V zm0yp45iMPR^41jzm$t7~_riTwI{wtMuDvMcD{Q2`+vjAk(YYI+0wxLhRkD`z&suL2 z8T7l`Ju9R;z0pVcj`fVFzp8rbi!2|%(p-K{efdA;v-uJng>&YAUb(utkyq{8wtG3M z-hB)EVzxb~x$#r;d#CTV`}}#Ub>C_6$}OM2#PWLG{GN0^zqBIVgLZ|r;KKdt`>T}eDA$a!B$q(b+e7g~zCN*g{v!T?4xo5w% zdfl^AKDFn}g}ZiqPi}QB+8q_XLu>x#AAVt_#JJx*&E`kWzP6Z1|0UNxx2)g~+WG5aVCHs?qTMQ+ z^Ya`^H~jQ`<|KOhVeOl%PubfR_^KQ4w z9A$e`U)H$^jPH!O!YjQ*`zN*BmUC)y?OafN@2040UmfRn%O`1D4@^|L_mO9{^!6g= zxhAK)CV0nA>gx03&U*KARnf}6!#xkH?zNRQ1r<10tT?jz?bRou?|CP1-V&I~VD-H} z)VtejX1ea3iI*<#cy{UIgn|Iq6r)ea?j1~)`4!rpyN&5GTjbk0l}q-x-AT}1@L^@> zzKhwGZy&VEv@B&**Rqr84OM-zX48rfLAA}Ro(Mf-H*z>A@^Ja16Fy(;q=EvNHuzUQ zy&KD$dpS&fQp3|tc87a}Ppm(_(p2VA=rp!DNutk0RJI*yzjV;!g^0)T`|CO$=0+Js zhU}2rk@g_pCCaI2;oc(?uglF`=4TK+RnK&(bR$RM-Da8dUNsLboVNHltjqFgZ{K|R zrH93t&0L3bCS6cyzmp;NXQj=)r*T3%wn!}t{PfUIgJ;pbpHFOcijHY+ai|boaICn1 z;gjsm8SWOX>xQ_H!b zalSm)O|`Qn39C2v-!j=(GmXu9)wM_3g$s^1+gSy*to?T|Rhe13s=7Fo<#o^TC38-e zYTR*PjAhIEskl|jt!$0gYS$wZ!sRFJN{l&M^_?p#c!!(jyA!WJUY#~c``w@^ z2Rv9K6|JZC%-a2aj>fjkUX9g%tdDf^AFi{hbiDDD$5U^4K`^(>74{R^bG6g*b!GmQ z{P{jfTJZZ+ZG{zcg4(vsJ<08#_gL3#^4ujw=eJxv%DLmLje0THwXPrrtL|!{uvmaFTJbriC^u&`+=IWa@Kd4Q= zr>1*SZ_{*u|p9%?TmJq0?-8Zd!+BrCl^~xUpw~YmPp$nfj!9+&t`pCvS!t!$;#)WuH864_xSVIYc;l> zE?ly5+l9i@vR9Y9{o&aTfuYNkBhB4bNhMY{s}7S)3h%+YN}jgDxMI0 zVPe;vOP-ky^Fn7ooxaJq?$+6J*A-ZQ3C(`SDf?*O>YsY&obNbXboGkrx>3_q*%zQv z{@XZStJJH0!wJ@iTK09;M{AWnSw%nZva!2!<;b^Q?3Kf~SI ztLo!-{aL5{s@1A>>E((kUSSKCseGd!VsZpBgDc7`lerlzpMUA|#YwsbI9c!a4v+eqKPV$e7XSf=1cJ0X( z#TgEog((&DJ+5v(6l1wsT|bFItkdTA<_%YzT@LrE$#h=&CNA*l5~sgHx!kXr&Q(uN zdEONC-Bj$b#5q#ovBg@y+i4T(7QOPoiB{?+p3LaiLxlL3|@_p4hvKHUnm z_Ds}Xv%J@puUc^X@+GH&M6O*Gc`~InZJP07Q;{oze2k?sAA8hQl3({LUYlg}>G7M= z>8Fa;Xy>onRo`lMx@t$=zvX*e#W`kWop^dDIz~F!$T93net7Ik3l+Yt7yEfqrBf^m ziq-d4zxK9{E?CK2;1I_U@WikBr=#aST(>wi z`}9UJp$VI}eqgh4_^~VW>65GPYF0;wYi`){Nql$jkqMWMt19|3p1;Di`D5sD>n5wr z*-2kiy0f+Sy6usEy>2;Yq1jX04J!W*sECHWXSoVn@|?Ns);WtN>DNS@=nkEm?df~+%a<=@!Dn|nSXNAyV_kYZ&11&Cv%QNS zrmuUSYPezR(k%;~y!G(&U$rh@t@-&Lhjzg!E053Y`rRn|c>1C91#7q5xaRJfsukv% z7sGwUY+F~#(xz0IPGcNL7S(19++NGZ8iSsJg?WqWEd(7+RF7crt=A6j()Y2=vt(@Zf_OCK}Z5?u}@t{}Z^K-M; zeOuz$muRttWpP$u-;VSCp(XrNHfGv*O!%CvW6h*BGf=sDrN$3Gk+0#sfx>fh)-2WX zRCSo2V5@DZdQsxZ9gpmdi=7Hg-tNuvI(SaZU`_DVzN;B~_S~sA((#BmRJ5?!_xc>O z4u)URx3t1n&yV`L?8(yAb9fiel4CDiQ@i4w$1UA&k$+4cEZyDdx8itKlH;_5V~JB$ zy(cJz@Yxb(QlaFI=sB%JxR*j?8O4Q&w-dY_Q#6`uC+vr!1c+pJFaQ zZ*R=3isMq5GRAYJoJ*d_eaDPNI_2on#yN=#Le}(DRD@W)6gkW_S$0~CvQ|W)q)PeM zm0MqV+D#06K7lVwxzKB=%T7fN;)r;;Fwy%TtdWg-L8hMg{DvO(V9rJt<3P;bF2V3}@$*@~T*y zlKW)WqTIfily6vegFik3v2_*AoTrdfpGm(7>suJpWb`knW1d1w5x zNyRUwUH-7QRAA?e)uvrOGXfJOPWAk{QK(s6V%)ALi?dzt_Ill9^?2XT-NCthI$NeJ^^gx?NLSmnDaqqWq;zV2$;JcKMH8-F zZ9ePLJo#~;qh9Q;M^92WO5Qv1oOR=QTf3*;di_mdi$d5ql_j1}{E;PHUg){UE0aSt zJ+1Q7G5&|^WHtt-rv59=C(c{>CWd#`?#3u<{~K$g7V*t#7L$Fs{B}Y@dvuUU zdEWCYJ^WoOt*`r_F|_V}@~Y{?Ez}w|VTym3ZA7ZF_q{^n?Vrm}!p|u;f|yaUNjldX;?e zH{blUYgbO^E(^-LFwt7Gd&2_xwI_eXYR}v=kEw6femAF%;0qlIq;TC*prkZdI~g$@}?j;f0#5FJ2a|{8XH!_UNt5!?jzsPP(sn<>)q7FKPcP z9DeunTtmg9YlI%AX7jQ(Gz6?kKD73qmWbPY1EWbEPaMM?XD!QL|83Hwd1tLdJ{dT^ zW7~2isms;C^Yo@2)6JeI?m3%eddX`t=hy99vsE+_g759THmfanl~8!;lqHMqZ{_Ba z%-#4QXkJXi^UE{epEb@>y7krfN&}P6(meL%&OfxTZ3#Q=yIR#zdwZ3q$Fl-I%j+}q zOXXS%)5AZMxBMy$$lG4)wSC5h%-uEa?~DYjBZK5?erfnOd<(twpMkF=WG>&e^%uV_ zU1lWr*)lMF%cS32AKCXmJ{!76=W2mY=AIj-x_gg*`L}S}?aP*eGIv$mrTw1CJJoQ$ zvff)-ytVA|x)-G{b0wZ^WYsoG_1dXxSE!r)L!IMg*O!9CJLm0HZp}O+^-H8orqt(n zDrd%&R8CIojSuFet@JJBGcG$^makc5d(s(iwDcOQYGl8vd$~pYwe9@Ck5{s$9gguYPd1(Pwh#EM@9yrkPHVcmcR{t8%T6t)a*e)K3~M7kc&(mq`s-%eV_hz%X{{!c*7V4` zTK>NA_bl!Zv4!1JSA4tMG{t<+JlB|CDU2~c5C46)IB===mte`I zsx}9??)UV|?bTkA@AOdW@S=x4mp12aTzJsnvFD^M^Q{7{r>s$*aL{J&)OnWH5Bz); zADxja^2p@fx2)rqx68M#Cw%YIJmm$K`FgcK-gmliNmIy+oFx`Tj5eR=eGax2=ZZaP z6fEW>RVH~?F>j9S&SUl|9DGiz;+5(mE*IX> z*>Ek0Ayc_frq}t)m0s739Wkj9EQ`+X?A=;4>9V3nZhO$2_bOjhzJ3jDUlx_UsYmQn z(7h|_MODc%eO1M4H+<`}S$i`v>dV=^rx|Mb#8XvM{`zV?{l2Q>)AXigUuyR`o!V`- z?v#hN&G9SW1#BZtuU7dnANLnM5T5dkBPjL>$ML|JqfhOQnH=J7u6lG&(qDOs&Xg** zy*U$uj^>;fnfEw;@+Wb_e6Q|LWD*Ww3j+h*F&ve*{*=fnEwIUi5d zTupiDq7j+X(ZQUrJ7r5lXoKIM;%{B+-bqLAu<1KLSx@lo(=fgXK~h^H#rHZGEm@nX zAS&DU&f-6V@zhGm+?0}X&ntp8=7*N&^vv%5wM}?hg;7j<$&|(|Zj}pKHJ40HFYZ1k zz^)V0^gF3@xn90?Zm(*0Osm<9WzMs&ZHVT2{-E-UNS5_`?yoG8zcSZ)q--wRx9YW2 zHqV6a;zkCu>9c>mz0+u6^YVO%Pv-AiTQ)D;7T@<+XkMj0`|ZMWr?blB8j@#zy&g9A zbh-Lm^WB@4KDOqt68hEF<{X#w(U#%X3-x!Q^#>z1Jl$<3vrVc%?S{ytCC?>dqh+$& zT3*CU;w{Y?v=G0MMRwYhO^+4V~Q6jjabx{CH2xt>SA3fgjRPS&C*t?e#1 z8tzy$^uLO!DKZ&(dS1-HL6SQ{)a|W{r@61!2T(Ubl{Oir9^%_o>rZdgu6XAP!Y4t^|n;{?j z?wzqV37_F{Xl`(N#>Z8$4%6;9N_-J*Y4X>R`?c@KzC(V~dzPfgTL#9tzp+eOVRmi7 z6itVwB@^mwKCdxer*lu9wWEc7c7sEZ(?cUqE;|v@Q?MO%$55=hUpn)7{mN zY9+%ymXd|YONz-i`(|v^YL}}8yP(4xXOPXp>K+!NMEF7lc+>xZUoP}S!pdy2fKE>_f6DJ#C@#$KnH&tA>Ac#co$iYe!c zx2PZa&u}BVTuOQIJ^rkPAJP;)f9-mF{K@OP7tiah)O;%>+}nBgOilBXqmi@3a;M#1 zQL^`SuwquDC{xmfOT|03@AdTjD#|kdvkfQP#!~0B<3{@~*ZEn$O3#fF&DtzrCz7M_ z)sidzUf{Ztoo18oc-6deJ(RM#=jzj+MPa{R$y^EZt5ckOp=fzW7UPi#hV$mFO5OgM zHHFDsRAchBxr?oCb9)wB*j#QrwXN&PvFt{Dk+~oo(VeeL+w+nUN=brb_@r1UDeBaFdo!dme_5bq74?UvU zclm*T|RJ#jH_G)s3eOc1_6A`hK&T^jy+?mYV&`nwphsn*w#G zU;Z$=xQM+|*6#WFn49zOlpOvcc5c>ncQ0GTj%^Ee=I&Lz;+YpT`_^{L{0Nyj5-(3} zjqX&?SktP%Qh8?J`xSp$+143N+%n)8|@xSZ=TE*)3Lg;L1dep?j-g;Ej7>MQIn49Nld)7XZhz{1$9;r z(;a^E`KLrG^@)bKAWDl&KA$O{}Z+XDH3k;SI)el^j-LP^?%N&8~mp`Yp z8nvC;WG+xUW9`OW8pr0T9W8jdI%d%#kvsd`uTIGFT{n$w>t;KnCHA=~%C^rl{)ikr z(su1%7k8m6@9`-UZrJ|YRewE8FV-ZcrSavhTPHsrSl4z{a@k}l*`V(lQ|2sLZSn2W zG_R10oDyNiZ`bnadIeoF{4n)y^R+2v=hK8XR8EYUYnFLS+3KXlcC%Mgw`_Z1TX=cK z`lbI|zfXVm>Yj|^g;%E@drEilF?_fDDpz+W{H$-ulw~)T?mW|~(pT|*{gQvq=agK3 zx9cA-SjpI_=&0AqP;R z0e-yCBA)Osefd4~;L=HM^ENN|Z1>E?|KFQyS~IV$*>Yc?G&r}F#k^`7qh8&a>(_sM zRc%~WvwcDFiu3Wx5pDr7;R^icqm^|P^%^|i3OG5+{#c-)*)%8R`SRZCdvotju<-Ph z{*@T|IOXYl|Cq?c4-@!n#f|E=om7n3-FG-}pB%gGvD&LWe0LAt66Y%5RQPlE?q4nU zL$2R$P5Q9mf}`uy&!_jW$XqFJf4lmQc;NZjuWkDMN-uJy1=UPT>wR?QF5lH{#!^<- z3qw1nswuCk*z~L1LX7LuypBNWvc8=MpZJ=-UZ>@IeFEzuzuCRndOJ>Ej>-HkvbX-|vAnYKH}GY&U;F()ddI;$ikgqyPa9hfuu<>Tdcr5DdE zTvnpmWvmg#!=hRFrBT)E-OudJOgkh~9tI116z}}i924>QW#>0u+ng=8?l^x;j!M{Z zDpGls^X!u)<8hZkvgU-v_o`Q}lwIgFEr#>X!mWvx2i`LTuYEgh@7e9Ei#mc& zYca;`B8kg z8y1L7yY=Oq$1UO0E8knJowc}oj%RhysjK-}S600**k0ZBXUmqLsZIwy9Q^gYSw1gr zIOo=Vu=4Hk;I7G5FWz5a>N`7Ih+nUzN_qO-74uf+)~@c<*Jqy=<0pD~#tX};k8#VE z&GMAVvR<0ga>mQi%UqjN!n!Y{cFRpo58p+fPJ0A;PmH>=p2x!1$|w7>N05`7Re5mE zcIl*p)n1`5S5BMMAF2I3F6VypGVR04FG^KeBX1Q|)|6IODp<|eG{_EhxhQwP--gvV5^>e;=?d6nfWugsObCpS;`yPs?%5;x;koTco7 zA2utS9yz6Z<@|Eh({-19F7oFPbMS4a=`WTh%(+sRy;kj|riZ7d-Wt*GB|ld;>kB@3 z?RPxaZp*sxWj79Y=g+gMD*d9}`94Z`(amPda1k-DsIK$DXRHXSuK1S9v4m zbhkan`~3C#>(?)car2({VB78flS#@8Rd>8O!J5qZ<##B9*9kkz^~J8DIyQ5DzCL-% zYMD=~)yp!c`!W^gXx8OEAGA&?g$8&A2*XMc-mP%i7bM*6G@XM*!yY2C<*|+L9dj5PJ zH!D81zFAREWTl=)@ACP6&U2G?&N2<_Tly)i^l8Lp*}@5rIWv?_xLkIsq)*T++|Z%d=@U7 zvEb2NUbE-AN0=X zHvahK`0-b(d^LhDiELe>@zl{}4&Mx$Jz2jVoJmV5OuNyd%PU`fN$gR_Nw32RygT1N zpBKkAt8DLS{i$XvUhZz)ICGYp&W_&BWZT)EP7cwwuRLG)`PUY|+tByeSS~X&DyYe8 z=W}*jtLtvjG2QZ>ss}`$XZE#hZ=EDO@ocL5JpaaZwbwkOi|+BOp7T0z%EThNs&r%|Gzc`yayIA(Q#w*^^e4g2N^EMnUP0&EGk% zr!{vz)$D7P z%x)hhz0Zx6`3*OP+`ptKSS>9eS{DmhPvn z?ZLZjKixfd$;>MFdPxtbqxX;XK+4Q>RcBICkoy!mH zigqsRxSUaDn7e$#o|Ar0rcHb!&k??RX?E(ov_-n!i>Fjf&wG=4Dv?94ELoZ1{i%Io zZie@=W?g-GZ0Z~X_QbN3@`R?lCFY`u`de#@bk4bImb4m8S+eEQuBDpcK^zLtUl(>Q z_mbzYfduXpbPx*DZZQcj>%`|g0S)cySZ-rvDtnYTs1Mlu$ zTk=O#?|I0y8y>+0vy>$dIaEp>?+*^NRoz+me$`t>ueWiN_ORPrS>B{;to3w-u4eV- z9o`L%yj;Z`g$JHJVzB+ewC9hp$Lm??zAs7_aywS$8a1^fr!O*pQl&2Y<7}+ewB%ru z@`R3#%!@5ccD)P=GP0ag8u+sB%~jqdvm$vn>scRl>3u925b$2kH1FK^%(I5FGbf5{ zXKvr%Y}h8yQ{^XMw>z(B-Hx->5klId9wPeiH^&tf^lWrXH zRNrlSZr9D9#!N0FocCFWo-dvwqF!!^p_4G&kZ(2xNdNsxe%=c!`x9>JR zTjSvrUNUE!@RMbQQ~tfVW|9qtmXGtu7XFda~ zyKWsUuAi-{>973aq5Fh$R^i+GvJ($moV4r9e&m>cFZFcMBlcVS95i#aESMIWej6iX4F*r|x7*yq&f#T|!&l zHhg2$&1HFk2RS*X+?q6rjj60i`T0-n<5$l;_4s1o{`N`q;Ya(e_iR|QM)5}PN^ei= zAg1HSKiquduX*yHdRR9#OX+rl!qRoAtl~hmZbSlGgvQS{!iq?YGq_9p5?(a$Vi5&87vN@?OQP9eLiS`Mjvaie-M> z!Y;ROPxumO_23ngkhO@>4XwzN7U%nq``Y-;c)ZeE@8_W_Vn#9HOKgpV=cn+Vt!w_t=>_t^9+uh) zLLq*J%@5;_sLSVX?#{oPZuE+GV#P|$Dcb@!6*V}#JEg^ItI2;NIP;ju;)be*HN`)* zqRaQ)et*Yva_N@cw_K|pepT;c3VJ8pk|A^X}R9Ih!l@+M#{R*54Ge{^Pi=`tq*hJ}k!q=Up*KT4a4+HEemnkwra^?aYVr1@Uq!?2?kH_uKpns|AaBk#$MrdM7;x3e;@ zmddm-+Fm{VFSu}8uc2y-$jWK?f&MB9%T@aJo!X;Q zH~Vz*3spX4JB3OWO}o`8wqvEGtw*V+`m@!}QS8$f>PIr?&seekYGY{mWXr1nR(HD|F)g_%EVKnQ=#U1U#8yBB$xx zvRvVZ%J=4neWBh_rt79AY`Jr@C}?TVf*D*dgQM*wcf@CVnrAFchh z)V_Lq*g|d1c^&>%C+5Q|80k(W^GATNInRrOZ2M17m=s?A4b(ntmcHH8qbb z&ntcT1xLR%GDdXBZMI;kjE#bHSs3%bI%kdYV4WU70OmJ$2&U zbKChnrfO(LynMAbg>A!zNiw$Xt@5gqQ>%|n7n!SaOo&mKL4D6JwVkh%Tc3wb)oGYC zNvL5BKabRlcScV#N_Bl(1q~AV-ns2Od1&d{431axQi{G7*;%MRUt?VA?q+nLlgr0i zb&^YqrtW^3HZi6kF2itSJHttB?*J`|V>E!(tEL9Q5imYEP+J67tM5#2X6n5pK ztU6m>bxpdVuA(64A^A$Uq3ZG-Kjk|~I?OqJ4{bKZM4W%;n{c1wTHyVIRX1(L1-Ki% z?%1u^6#C+a%r%Sa(pw*v{LCnfoo)1ph55wQeoGQT;$Zk1Za;}wbu%gknPnYvt6 zt9)zmjIU|4OqWZTPTSXXcF}h&Z3F2bna>tEnoCwzU+%r#XPG?Bwr?PG?eKf3v-{iqWp< z(gr@Sq6<&zyeb~u68p}#E^!0faY=>#+hGxg_R46Ta)c>T{?Tr$L!h_-?Psp?<{hBeqFR>-nFcq54I`V zh@bi1*US*y>{YE9;i=(Pc)vL`BsYD=;f1$;LU#JQJ;E-pU9x~VyK0;%;4I91$7r|zclNZIkHj|hSeva& zT(E9thFs`7zx~%fOBkkRMJ7)DrNyJ3sQKYkc1)$&j3>vQz4^N4Zr{6=d-SxLduN{4 z)cPj(tAFP$o+N}p~ugdlq${x^kqo?ccI3EURb6J>f||GA~r{G3z~%)xFDfGFMFcEbvXo zY=cu#m5|ldqM7FG8!lg(-cl?XXz?w4#m6gK@-r8;m=vsGp8Q(<(AK`FUXDvX?5d8{Hl1h? z_!K0-5MFkbsjjLjr)^^UrL{ZMFKIAaJUvsqs=;H*ls8_V=RH_Ff5x*tdd`0?$poIT z^`0kdIVbeNi5pRO9QPdhzUc4HpqoWrcbq0n(U4&bl8wE!PM`lBS0rZ)i?YPm;#HC> z-kop^HWd5F5g4>{?sD0$6|c7M&Q(7=GxJp0(J0Z^if59xG#8a5YJAEJa;Qy>Y3k~D z_g-Yn5~il2Aog;t+&Ql%tDarKoOP=3mCehOlR^%KtlM1`X7qM(##fj6sD*lw_u~&R zv%Gs|82kB)U0P;k`90}X%$I{r)G}^7_VUj9^H5pc*0Sn#)7S3Au<#J4lO88DUuo~E zYxjNiR_X78M60()PqdzVP}V1R);huCmGSGRacP@>y3TSH%&2p@6S(>IVwdkhHF?+G^MNOIb}G$p?)Pnyh%OAdF_+8VmC5nxscmLa`NiES zQ(Ht;6+Lv!=D1l-%IKRNqZ?bJDa$KIJl%4og$`z3Db_6)!I6C3+Qq`E)+ z3MsicRrVw&-_k>ijL%E1bmtZ5jOzNa>3LH0C=AbfaK6M<{_VNKr4z5C zZr=%?zc=L0lGDan9A1aKwyl0$_&EHHt!LuSjM?@(r+1u~bi~ErOX>QoNgMn;zWsf* zU{=nK4RcncuUyY}ytH%ugh^9ZCTFrsN_<$?;h*)OclUkO)diDz^(=Q~yH7a3#A;UG z>6wBPjCJ?BOg{4``CW+W+2e}-x~#E9g|iNKR&0~L^Q!EtmgI>wPtD8RPAosDyf;?C zf4kE*x6W-Y>Gv!1pED*_FmPqLr+7_TqN$l%X(@SvrGMV+L$V%T8_x+ztuO3Ui;OpT}D$?;ZW4SlcD$-J7WN&6>v-Tf8_G!{udse#a+! zQcpt_c?v6PJD>V&&M(+|bVqcctlmyTpN4;a&&<}VGw)Yg%#plVk}IgK z>eEmD^;aW;#ANT>KA<8{`0(`pM@JKFuf?}tcr$+$)5QLZB1P;vDYJIi%&1tJ@^HC; zaN!j{ldId_N}euWuPZ(2q^-yTtKYoAg3HWqd4;}A_{913a?9_eo7;>&N!|)8*R-@$ zK633wu}w_pXR*GXM`rsTe!cbV=a$zTo24o@HcePy{OWvZNO|_%sn@-tc9{00FovFr z^z`tO<nGsjeeFTqL!unN)L|nge0HTFu!4#s^sV$#O=*}=%;Ezc}hrK zNTZ%hdk}YB!80!bTfvV(2A8|N3YPYKJ|WM2_3~294zYI8Nn2!|REeJ7yW`?kZC}1= z-|x2E**>Y^VXpMQmH!zmU#;7ILg)EuKZ3pZ}Hn{{E|+voGG zo<_&+@|j(7T+(UkE%Td;D{PLR_t9!roznZp!nlDy{q7yxd8b|YbNWQpSnuF;pugk;Om3}q6CdDyO}q;0i)m+O32jlDVRO?YJPg1x7r>UK-Wom!H1v1-x72l`XeIv$?g7T5X6 zt!;Ao7IQn77vH%{8t&|PU2Ku_?#YrT<>7lPpPDZIs&gnI^Yko9N81UNnfGsg7Zv$x z>f(QSyT|8yj$NN7Z53r@JU!o`dZp1C@ufSaRL@pjdzT}B*53I|yOyq+9MZG2xn5(+ zy&t_y&o({r;M+dI!E2h9#kWhspBduLa@ zDSF^FSMJW~g&V)7ar-S;=(A&LZP``fSGNOy+qGW}aG=bM2Z;?Z;Vnr2B682Q9afk4^Y{Qd@tgUhld&nJX2{nuJyP z7>cJ>F;Df{Qa?p+*Cn%WIZp%ET~ydM?U7oN-?soh2Txgt=btW#Mm#oLes|lsD`wlC zSS@(rS;JTH#PUjEFMs)rTT^8YRj2W5%GM^W?>r^5N%i|WzlOb)`FGWBNN+JbtnFjT zxMBKIN$<$Y*jF0o*md~3R^>V$kM*w#D!;k*>~hIdLW}#SE#}ME+2bRadgtv~t9_nc z_rsnF7@w9|>19z}Rybwp&WU$Cr8~XEg4i3CZ$_P}RKF<~_XzjTR^Idh9aw>dh(301BZx(&Doc+qD z^Gl{`{1NV(v6@YudHr^`0NvAN&J48$?xq##ySD8=aQp98_H&ay1yz=1260WWJ|FWW z^tsHWuoKbB7sW4~@Di;~Pj26`eaFPc6TJ7EW(cGltz3G%^jnry^T}IVh0o_%J_uG_b$P*7*0Y|@*FC%nwNzOi&u?F~@wR@$r-&wg zp&jkHH=kLZdoI8Ehwbdenm=8wZI9a-ooq{9-LZY$S?8>#*xOU)xd=b>eE+N7B_c-P z{=~u=Kb}Q<9%Fp@YI(Ok@0#+oTNAo%FK!EI2ukthV5wR$=Q_vfx4Tp8?LL<86y@$c zm$H<}K&EDOx?P2R?3GV1G>vN)cnM5VFMGn=z*bPn_= z*k&7nWxw0l?SE%`?Fh}34 z+ZLr~nBnKIv_(`2`+TdP-*!=xuutzK|S-;4V?$@A&tb4$gpYQ=U{pYROM zUAth-cX@y1ccC-RGwOa~nwMu%+i5GR8e3EOb*;Fp&A%zz_vR;E&YEzksG8xO$a>+| zi;rp+o#?qbWyz%JcLN=4PB61=ZFuak?Z`>q`79Rh`qP$un_g1-?D5Srm)n#dMh6MJ zbF2RSa^2U0&CyHuTwQip^oaW*q1ed4pss$KYt>RE87~+1np^MA_%-)lf#;J#)r9#I zE~#I9t{A(!PgBb>?CYcu_dfr1>!jnlTUNZ?UAXOVuHOR7t-MpU3uWz>_gW~sWNu}8 z;G+6gZc?>^2>*sZp%+EfR-8QQ`YB{rnR9QaU-S6#sIoW=7zPxCHUzj+_$1_f3G?Q{8(zR5|j?>a2P`a-BB!jJS1WTI9rOSHf@S z6X`fLSMa)sh|bBltEI;?!_Ag^g)e!Z5yTNa z?fEJ9jiN!7wsF#XW7io6J(?}|L{r<-PjrW!A~9=Le6{pZbX`V&-KtGC63dx^EIzUa8@$7j8OJI)g>{8pFv5>OQUFf3U2^-0ao zX>WstTAI)9i0*j)X3cDQ!Bb+a>xv5c9pkdt&(3;uwk>$>T!E8fE7tSg50YK#HOt$1 zeOhI;WsrOAr5TGp&7AeRTR zGrbifp7GyX+0R+>Z0)93-}0`Xwz?>~W0Hja>KV@6xeO}vg^B}tf`gxQdIn~_K4sa|jWwSy&((k8dYz~9qhZ6h&e{o89@#S`U-1^-d8=Qh zZI{+|?Pj3L)W@QiX05w#_jUQwsDzfX^_r@x?hMKHZL2;Wd>iuO-ly3NJo2m3=O)gK zyvQ~&y!zUn=L(7n<=B_nu4*yIRm6_<(hl zQQ-yFS*NqjgFRN=zI6G!++D#>ZthEa>ZERz+o0e%@3+y$>_3Ajd**|Xxdt<#+tL ztu=)=dba0Hm3dusdE@WoO)q7c=c~?3p1EYj<-)FV?lZ}KyB#fF|KLCG(RWjQTVPnURF|t+JPcqkD=Lg-7rMPH z?~X~@$)#5ls{UP_8t!R$x6fs(;@(%K9`Qac52T)C-KY^UuChu#BE+@%PE~)Xo*tB}?@o4NT__MemQ z4OQE9-z+Rl`gWehW}mC>ya=V)Tkp<2Yrpp0w4J9D^UDrCJCpL(D`?}Cx9(-`@uBG) z?}T!{I7wf~s1ezA;C!XlOOHIWWp9qYxRkuo)`0WXyiZz{jMWcNnYcD=HGHuE7Gk2srB!Z88{-AtplE%Zm z2Q58ij@NpcY+0Sm?>x1lY2}+O8~09`G-)gIgf)FN9qf-D(Yqk3rR!I)C! zjh+=EJLbg}KB%fG*|}Fy@=3~;N&YHNzOH8OyuMbsYQMF*U(}zgE=G?(@l3V9t-bl! z#Xir23ZFlGT&CeC(6aLJBo395<5rghHQ#yk#pW7qS-LOy!-RXsZ{67MA|qsZ<#uJ;hJVXI+;u zJ9YT^WS1j~L19~qw7rTyt^Rvu&18Xr0F)Vio94RE#+~X_;tT*VeU`O(0N{=lf1JI z9IL#Z_?P>^=~>Nw`sbwdOs$Hl?aeinKexe_{X%)+g6_{|GfDAR`fr^ne`pz z-@CrLe$2YL;5uIs(e9{p!9zJLDk z)M}~o@0C(Tk8X~t_DMZEbwbDz5%Z=+lNdg#FRctS=X2V2w8Fe8WMV7x#}MbA!FrK* zjJ%t^uZ-68nzGjB(<%RJ4LAQYl%EdGoptZdi`0dpe#^_)*qvXkj&94y-Fe1!WO(Gja>YTDZ9qV%3d(Cv`lF0H4nac$N zUy8KMn=f9Q={DVIlZ@B5K9{E!-x9uGcRcrS>!OtZ42BbzrQBTXsQ-5IZ8hiV%O-4j zyeVT2zq`uh9u*Sv!ha8f}7f${ZzIb_pBByQBhlTUfnSWJleN1opm3q5<#>Q1?YYQh` zN?D=GsIzO6hn`$~Fz12rx_6}v*FL=6V5)lPcBZbLPAZF{uYOgC`=NmF3iYMow>#w? ze{vRIzP7q-Wve=ioY(8qH{)FU?io$Eb>N-!M!!$OU*lbBGhS#1eP?{N?8q*?xjmB> zZ_SI(xMO!&;z!mwyR1u3k13yHwav}pU#I9IRkCY>f<^Vuge#SYZsgm}h`LnyY-PXHlr_`t6w5PT zDfHVTmE_a;ertYT+*BpQ)Coa$QXRJps$}}yb|rUB^EEGh$ojnHTCQ*Qj=NiQ#MXN> zN?OjE*{N_+JI=ttyCrE?I?KXzlO^9}O1@M_1;~gUt9(+|<6&X(^wgG49kT^VH*aV& zFDw4|Wqr^#o1jl-Zv)ObFvwi*a8Z4#pXI;6wRlPI9;vxk{A{;)HXXFQH6d^kf2)1O zgCl!Rb&8qpoqBS@^Ykr$SW=3kCeM4H>cSPxTy*}wIja?~B zz=Pqt@EPXUYd@@gv*ed9clqSJb$gxZk!)AcBaXmRA;u@27k+Jyot(Y>#GYFwInvXn&n({Rn0xPZz|D0@ zT3bG71qM#xytQenklTaW(BoCdymPa(XDP+|Uff?I@1-Ysat3pk>_*$C@f`C$d9FM& z?XkqkZ^pZAeU=LbN{G}5Y&+q9(nEa3dNmJjL$2dx=Uvpc?~pF_%zV!GX#Kp|aY3`@ zEGa!-Uz&8CJ*s-bccyoTKQ6KQ;*nKl9J?v#mf?Q(+_)HvPxX`6Z`r(ShWGYuiYBKw ziK>1%>XNc+!m>+?_PI}F+Ih;#q0WgzA|{=G@s)JZ+fw14>jQq;W#uZIy>#p7p(340 zGxMHm>MYEBGbyCjZV7X2gyC|wb2*=G^wmGoYnZ)2ziV@RZf4)3**??coT3U>`U>`* zwX)l8>v6*N&_eyETc3z^d|kHooW;Gjo$1~g+_6`?Pkrg#c`V&8HFk0A?ykEx%=Q%D z;xE?=_1&{&?S)0#8NXdO?lrohzLWFm{rA$6-bEX(|GBHV^%Zy1oZRl_+mjzfGtFB5 zizE4x-RwCZ|5^r|@(A`W(9h4@p#A>JG0n}H)~@Fd_A>ov5YE@?Hn3Q+-s^M3Md^SH z(Z^cRONu#;+g#b-F-LS;Mux6`+0WdW&-pdyn{U5o^ECIZ&3EPx4zj+wpX{qltj}oA zxjC`LqP#q8t5vPo$(;WA3%`a{EMFtM^7#^3!{xcW2WEV`8g=W&;}`cogw-&7S-r0? zu;9k=!m8I@*t3q~>(v3y;wl4i;Hmh0B>BhF1oFU88RxnN7JLR*N!%4dZ zepA_%9h# zZf8$s@W^~7rpa(GymPu-zH4XFRK}pNM^WloQ#OSdS+8EWgZ0q+ z+Ni1rvx|!Y3z}2E2Qq2LuHGacc43OPExU1l=DN&?pathkT^%_%*=4K3V=C=mO?|nV z=c4RR&dFsPO}UKM%w5X;Bf4w%&c@HzZpBp3_Bn1cE2Q_=;bB5( zkN%iOFFno?By_ogTh3A|{DjuLJ=@wY1uRia-^_hJ&29%@{Fkh6kHogjthit%&GUR+ z@v;LmwR~ot*RFf8pvfupeiQ%c5Vr*dDz;q;!-9YQdKI_Ue-D?LdDrD|Ye2-z)$77D-){Oc!{FMs-yux`OKlcTeEq~O>Se9@ za^3P;&K2vIMK6k-==*acGpF0TJ-c{iT!cx>V1K+c=)RbN` z*DYPH7Zv5Z+w;ZGg7o-6-rc*V?O(Bclb_w9IYlRrmOgA*b@Al9=nBo%uePb?EvH0|Wc_K4lw(DXdEJhs z%Pl$ko=ttF_M78cdf-{xhVbpLnx_`)y?9llym5!)fhn)oGX4JLy5Q`kyVXeywJv3X zYahxauxv0&o`E%FhBNpFo2t8TsvRSq4#m>Gfooh|xC;al0ois(hsrR6x@=goU z_iej=)pom`xg?gp)M3`UMV-~Y2e}UWnqBzI>rgx4srQfNggBf=epVa!Hc!Q ze5aW^rRH5_o$>LJ+q`YFlFSTlUGC?PbvN}n=J#cZ@?{V1TQ~0Umt_U6*fF!{dajnq zTf^nKmr^a_CtC5;_N~3QWb*yDE9@4w-(;OGqpjtk=<&*b-QG~?#^)=o7qM1My0ui% zeT#B|pOJh0>Zu_Yem(oEWU18LYcXDaDciTJPdI1w>)$`EFPn9?8Xmi{b?!M4m9^*6 zCsnSPAMYQh?W-MBGxM2_wT)?q&x#hyuPReycYA$4G5;pxdAT!J@*|IC^6PS`EMc7b zW7ez)w}1#|y_Mdco&`NEZ&^ND+BzI>U$rRe=&{Ldx1CNt<70amx7f?j;;~d&;2$5} zRiZnO@}BUz<8ENTywtsUo#kRZPTfzwS2;MJp0!|?H(35p!*0s$g=SIqi`Va;@6Xk@ zN#tJh4%_C&G6zZ9-@cWSxAXdgWL&vRm@~^#k9xa3dhNT^OY_`?(CzZJCDBor{xhsx zQ+C$Sa>mDmo0o5HiSoO;rq9`KUFf+QJMVp!rY;KYQu)%mRNl+H`hI!a?b%^l;wE$6 zH;n$5cW1!_fvx>56RJPXy3LaOavi%JUcFXX>s0rJwJ&({(DU+!_|v1y}B&g z^(JrC_j0}ax$4R0BhlNIPkJQ9oUUZGqJQm=R~xTyJRS7g;nAcu3T-E!%#oXKTUC5q zKJVhu{PJ|;T_3Z-B-}-sUTtL^@YZ7xn*nI8ocHOL)r){S8YUu6d()%&Fu9) z3(xW9i$6FvIc4jW;&3L!_@a)S6wZrb6Jj(l*H`jERlHkfk=1(>} z-aBmpv%1-Jp^e*B`0ji@Ut1#CcPF6ltnDHprlx7t=VPi?&)YM_=*jCx(vgm3*IsDG z8#vTFfBt*x#h|c&C0n*CEMVZTH>kWWHnHf)`Qvo$Dcw&$H`P)^vEU&|S^=X?@gxhPzQInt3cs z4;1#j3e=R|6yU`l<Zu-Ds_OFK?aL^cz_(@FL>OgWt<~1m{JU(!B+i4+tiq;WlJ*QbsPcp7 zQadN}ML&;sOV)kUXL@wFVfky<;$3$F)%HF1x^l_zcCO?LkC$;V-YbLH)26aAw{qQB zw(ap|Pfq*PGuO5@Ep26Rl-Xo;wa7H}$@Zdt#jOh+G&es!KQ}kOvQm}v;QO_CqVq3` zo|S2<(Y{f_+q$hmdDZTXkykrroSNFAvb^$qOxVN=D=(Ot&vQsK~uE+sn;> z)mc}2bJT%=Qx~}W&qmG2-LPHeoY0gxL2DN7_jKp9%?@B>^~z*)ytiNc?^Z^+Pp8ka z=(A5)=9_dm-93KNF%AJS5sw#{ZzH9r-l!3<3iey*z525Fk}?(56a49R=YMCZ*H1d(yliCHb)^vsdWtNeu#( z-$Q2m?7FdWg+^6U!87BDFFyVLdfM*vj@!C#1CQ3aAE`E*vo%ZXvDt2EFRwXyX7}!w z+dRKI>uPS;rKu@03`YEizFx69w^d{gU+g{Qb~TPWW5utz7yhbVuWvilm*2A#pVyJQSvEdYq%NlGBMP zXwu$O%n}UqKEHmyQg!KhUk;Y9EB2Ty=H0Qmb&k~JsCk*ogBDGicz*u6?Z;j`pW-z? zCUvg2saD35weGi1EncUieKqKwhT_K6DoeF(E=_*(G*G8@o;J^MH`9YQmu~G3d~v&d z-pke96XGiS&fe{1_nP?nxXz_3G3qhT^h$nuO;vMly&hY<=+50U^Ir8G`LgJk>Y=r7 zpI>^yzHMHD=7j*^Ela+BSd~=b{M%E6Wo3%^#|I8f4qO! zJY8)z&9EyI!h7T@{>YumV3(~5?p=A{FjxNOJClm%d|BsyaB*}ePw3-vY9)@X7*T3DmvUg{jG1#rquIl$D^V`e6l|(Xirya z{P*icm&Pqm>2#(}R*k5l1(OPFoi@vIIezIYj=E>NNGdvmVM>$#(dgS;imGlqi^_ej zuk#fz$!q!{@#NGM{xw{$-Y?AfeJ(p&JFR-RpjFmsmrs!fDSyxJk6B&p_Pb_+n|oUJ z%6+ZDzrSA5cuA06M`-;LK9koO z%tgf~zJFc&+$~_*HQSwf&ab`ZOjp=-K_m6tRYwnZg(WJJPpZF5o6NH$ku_nl3X8_4 z^UCLK3r{~^IDOkYRmp%Kmg^;@`@X&l+G7M9+{VyPiEwmpHD|)$#YB(+}3Q)lE$dPg~`Mqr!Ku zv=p7N-c?!UtIg5G^uj|`^PCoL=~Y_Ek=O0LZR$$Sb7HLS=Zd`i{c3iveDv(4k9c&- z+{QEY`(|#M(%fM6S^Y+~*xH+_+ZRezoqD}F@kB`Z(WTRGmTKJ!cr;~=M%A%f8N2T0 z<;0|&>9M4d^aXwlKUO_?Wa6G=d2`Y&X%&lT z??{fP-(tT8+?f=-pI0>1Y1AE;R_|pjc)hZ zw1}i=UQtmfwS1Ae%FDax9{1C&F3E@I7T=Zq;Iuorqx`(sQl|Ch0q(1{Bz|s=4PLqE zSg}v!WmT=poMVZKUdIe1J&x5_ub!IQ=sHs~N^oPYg1Yvt%GTs}U9WS4d9$`1{NfQD zIH6@r^9~jk2F~NFWnN#pZ1QpQ?0`vOr__F(a_Wjs<#0H`!OZDb^<~AIrn!eNa6a#M zTV~a{WXtCR8p1vEN`)rfR?pY@mAr4qCfA!1s^W5N+FifhX1=+@to>f}-POIP=a^l3 z=n=hAxx8HO*VhWCSy}p7hXkhg1uaGmH>bqurP4;uwGg-22(kUl%Rjq>&VV+#aL{Cr4zB*TLfICailzs2jj$J_TvCi^Q@2ieZ!hOgyK^OrnIdAePW``gFH3~yGK zm8_9m2M-k$p5HB-HSbEML%Hrsm(M3peA&Ctv~cIMLq;vB?0-cSkEmXms_HQ3sXRw$ z;OeMgzNwn349_`j-H*ogEz@+n`TTKE@Kez@M}O%pbyZh*ATQM)ClkKQMJHFWMOER) zTl=Q@dW~Meo$jV{R8+KAs$ch&nx%d1_n(f}8H%|ZE^V9I+Lw7e@c#LwmHcg0X4maUZaiOj5BuG-3@T4{6QM|?@R^DFC~Wnn5&%hqnco9VOX^o7F*JsFCh z_wMz#`_Is|BG==DM^tl`g091qg_@rB&%R%eTNapZCb8wGcC5>ib(b|gf19NA=Vn~U zS$j8}dsC{O2K&@Ae>2bwc_PwueYizS@zwNiZ|7?eKz}x&Xz-0&3-zoFhwyR z(PdSCAKpLtXF>U-cf1qyr6yUgP_pQ|B;QHA;ZGR@;5Hto7*N^Ns)MQR3c9{bPW!IKxR z^|<@@POJDkee*7!cDh;SG&ekbBV#u6MUVFEA!GYuXmEM5HJ64yTQrRPhlZ%9>~*Vlb-sULi(g6-Nvr)!Q}$CcbSt$rJIt96n9 z*P%T>9|-vyw=7@qesy?6^kIM9jL1UWbiUm$*7SV69oo0eTX4(MMfc)bR`SK9?t09s zax&L;R>4yJh3xYfl=jSZnf8yb$Il~ii?Z42Yv+BBJt*=oe=$}2!Iyd~-_u%w8WU~? z8DGBe%)iy;&FPy=Zx)`|$+5jZ*6W93{pD>d%{9Jv@6!FGBBG_;w^&!B>iUI0ThDhc zwN7{0_u^)K#9H2W`P=-sg1k6n4$2B?ORc)HMbl4p?(7L%ZI;jGl&pR3b7nG|?*6cs zOV7+;$Xt3iK#cS0RHk+DvRaRHximqs{LYE?#t&-@eNCk`^admT|jY z-Ec?Ee!DegQiSr8+=iO$3AP{?mK70kvkL5 zmoxU3o8;cA`6H9Qn|ZGBD{&d`&uvGhD5h50)`{ECniDyr``G%bM~8LY^Fl6caevEn zT0?z;mQ1hml{Y)OxBO_mvf$ggEu6^fS&*!U9rb_(%VDGitrf%uka4;fV zCv{5lv!gn^);D#wp4F6@(%^B_L3d8lrC{B_=sgazvu7OE-SGS3rS=J*CQN8qeaTXi z(_iu7ykB+Mol>TnUh;K6Vm+igw=bDmQ6ze~UnQw8XJVP>&EOx7TtRGx*Cp3c_3QOI%SCA$ zcNTbt3VvybKdhb8F0Jin?H6l!$F}5oPPR1jJ07uVuaonPii#NDKMy#*?+uG&! zXG!u+XE@k&FFIf1<(yyttcv|*cO)E=;@tOYW#MhF3sb7wZrq&DRJ%2GlJ2+kHz$p% zbGJSds9k$bd+V=7k$z<>zU!1e^}Q3n#XY;leEO_;)59KndT{$4)mZZRfXypQ>ApXb zos3KL9v)#=IbOJZCP(rn=kB|c&uFNy^gTYcFedKtv6;wd^6+GyeBr5DoeTcpH9rv`FVAhhlHe`-Lefvw(j<_CCLl) zv|_lANwYtAA}V;|y2VdLi=Wr~Tr$syC;3Gbx?0!=X0uB?o%J%KL+M`Ig)J73Pp~ko znc(oAd1<(B?7~_4<;rRIor^lyw(Qz=ZNeocuQ~78rdr<2KUlD$ZvkIO=c8$JJWHpl zF8jAbd2Z>+b?4H>YdGbSyvn{M=egHgIlXb0a*XbKBHUo;m*m{r@95As=l5#v+H9u@ z4;&djKfSbb+4ZK|(UJm7Ra3aWgiqzG+3Y2kySFPk^N#WP>z>Q(^S2vK*AthxaCj!e zjk>#TqBbFFWV?Oo+my43aU(rU-oFN@c6dCi=#Ogipg>!_hbtr$K1-~4yz4)M+frA(tgv#06y62TpD*8?^WwY3+n9tC&L8J{>RPpY3OH|9 zt95osP(W4;cYz3_`aF#wFOR1^f4)9Fzc*!qv$f~kC74#0#T|JStQDE-`(*h% z{@QHMTRu~sue;QE*DLhdgN0cqBhDshELbt6w|Ry_k({Neik&}~WNxIEq@>KRAn#pa zB~RaO`}}up#gp%I+ke%BtgW5XcJAuDIUO(K)Xm;>o1Sf&+k95mL!nf5)+*Ht{pnKQ zPCH6Od4%!XXa2si(r!ABWya1uE6*&wXv!*Z!gkTIbJ^^NcRyNjq^+8D?WWcmyO@oQ zjZtFDr2;FL>=5HKS3k64*^9SbAyL~BZ|iS%D}Nxn<7>#Zn?jGmZb@~#d;HI*e@;)h z-PV#_$1_&hy!8E{sXVv(`_UD#Zr9&^zB2ErcvoFk@|g*RKCe#iirkdR-My>vh;#0b z_1kVnujGzymGE*n@Aaf;!Gad^2?Cdb%1h5#UVHv5CUr~n)S^khGru&+R7`2Dc>MS4 zJ0Et5+?iT;rtF)v`1JIc+E@E>POD_NNyjc0ySh=XT1eKD)AP&6`$60Ewr!ubb>Wu< zLS8}ZT)3Kdd}=Ccnpewdy3#vp@}3=G>smEswdZPpZUgFY8)$6t$O!6Z{I8R zrw%1MZf%&dW_j9whG{dHg4SOY39=1+WxL~K!oFpei)To$_BwFOEp+1bscLsl9}2PC zTHBHAlI5J08#r;p3hhaI>voki)^Ar)Se5K7bKa_XrRv3v-eK&H8?Lu3{kp(JiD}8# zFCM?IPI};F-JPbk;_}7gIe)LpP4``)@@MXsgX^}QUG_OU>12lUJJp?9QTGbIKD}eT zN@Pa=ng!qZo);Xr*<#|um zKh*eMyjI`rbM%4SgvQgF=Q5RSUbD=2r>XM!kmvcMk=tvhseCBa-L2@qW`RoSQET_B zV!Ewy6$=(#R$7ocbKQzY-b~&vhiYnSv~>?pTl%)Jo#U%Y>B^u*GLrVy@i!MAt6Z_7 z@c5iu-=+mlm3>?OE}nL09pk+j!R>?!)o?QJQj{jiL%geo{naY2{#X&diuJF_j-frD}j)(PJZKSQ|y{uoC8>(+@t$()T z{vYE|XS+puob8-M3#h`j3J^xFNi zrgYif=H?0JiRu&A%duZx5;aTKBeCk~%!&Qk?~AwOI=t2NNVSyL%UXYV`V6t(!GX)x zZ!BPP;8MS6`)n<*$o8OryXw4}uD{Q9P^l5HHa`7)m8oF-WLbR`9i|(17|yX8oAY_B zm^{Dqtu}Mcvx4<9&-Q4&&vvw4x+Tbl)p4?{qV;dp70g!_T%SH8eCbxMFB=RA*%#slY?l&1;Nw}19XjbUf9a-Etzr1hv zT>2(GLrhw5%EpPi3w~I#&vl+G;_>C!&UAm1j_(>-lP*0LS?FoclJfZ7wVA)RUHkY} zAZ)@O83E%@mqQ;NS#QuY<0V(=vQG>6?b4T@_3gct=jG|8uxo+UoKI_QuZINZn^}18 zITG~U-Fk|@O_984ZtIGxygPeba@$2sry9JP^DJQAVtLJFPohEwBDyfWYQiS{b4 z-J2i#yt$?Ks&I>%*`u(QCo787Ezh3~Vtsj{-GAkD881EQ^G+PE!+P#mDR~z?ner;m z{N}rtn%zs|o2DvEI#FHWsdbX!*D6u%NVf^$Tc>;4KAY9s^zqi*wOfMN*srqYidnBX zRCCk**$SyGn|B&b=yD5PQI=D>Y|5<*)eigiS_PHp-t5ynI`?$sou#X%6`wcVabsQY zq)-_}_vuR(w`Oa`9!=+LUQGwlT)oCQT8;U)v+G_jS@SvNSf=i>;Obe0xh)No7O|Tq@XY%>t0QvF!7ck{cb~{S z?#9MpZ5wjw-Q+nlz56b|+0(LIv(Sa7@73M3iid7R(Z^S>7kU;e6#C9vN0cW;V^-qC zRjD5COK$jY2wz`yJ*j`ClA-#a6>FAz#ai2}+%}t`R4-|z%(@uSfWR2eIXf)PC!dxN z`oa0@;>WNbZ?w1PPG#6K^{J~n7yHdz?5(-{LD6A${!Sf6xxmwfq7$b}AGcXOUnji#xYY7{ zveAKC_O81vdL>bJlh-NHucz*~hgJluUiNmGXjt_4bf3^ZhcyqLT&~`g>AOqh?JJ>g z>JlD5l(to-Ja(E~rZIEPGH=gw7bc!wYqsvY>4QD{HnnPVb3XC-V5fZ5uk&J1jN6mb zJf4BVQ^vG}S zU(UWVY2_??@y71Z;mok3+ZL_&)MC*{m+5%7zObZq2h&RNEjjF$y`m27YO=F?-#0Jc zY&Yv8>A-MHpLIrVN6RXoKJ41H<5PI)q_zG}mmcR$xDs-Ad1kAY5ts9t8_AotvzK`Z zSpKPbwQqM}dQ{xBoyJcOycPZXN-3Z&=2Cje+1>?xmqSeFJ(*S*{qUt&+S0i6n#@b{ z8aWQGI6192>pcDbyS2Jj%kR9E3w+BoY3aoC1uW&? zd&)z4->S22pWUw?uwdWwrCYa^YpA5mo426O>(;T3ZJeGrt0pXBx9u%D$F=bjEUtJ6z3UIYeYPXC#{UT2}R z+~S}gVtcLgw^?UvPkA}5+-j+Lll2G9m3OTd-1xQmI_KNvg*Wh0P39|y+|68*w|D)#SKWIi zY<(Y4dTCwClP8n>&->=@Hawa?;n%dKR)td^Jm3B7xYY*TS;_7(N;?htymhzrzDsG? z()g%GQ$!;w=&kOFZ?AO^etX=Pr}>6)^2wNeUaKNiUQD^<;<{ARBPcf9_{!Aud6~b1 zmY8R5*|wnRLT={02d9eGuRZD=c`#V@V%E4ZRdJFdK7 z;+bnIqNsc^NLE>1*1KJP(kkzRF;QFZZM%HZSu8fNq@&|Ubgoixmlp?1lks_lrE=>+ z)pvh<-5b?+Tj+enquO^N9H)cN8fVDOyYbApGJ~^B`UgobgBW~@lxSNGO9NTsV#d~_$npXN+2uutqCr>L#fGi5!7F|8&pEB+isee!<+t^+!uyMRPlov$e>Sw?UrF><50m z`mjAZ?Z!;b&9@YeAMz@AG@^jYg_*fv-bTt9AYNYdVae`O7FU3?Dmo?{=WKMzsap+W6tKiQ=X={OCGDb_&DY0 z@|!`5GF?~NV*K0#7H+9F-fsGOvvcJeDc;5Fo+w)W?8`cKIqH<|tDr?OYqmYu&L&l2 z{`JN={=UNgz6ocp3&qb-xV7fm6^4Ch83PaAs|tBL?^e!M6{mo9fiMvn&2Xi8OUnPq zEtnH>jCI;aWp`h@q(|Q87e2eRMZ0QSYclitAgj=oOTM@ZZ*}c*eReym@9RDVjo_E5 z%(kz1`&Mxtw@DXSDwX$9%h<2_b)`(-m2b)%2an%fVsKwoeWLOl`P@TGO(cSvvjc8P zEA%tfzpR;}s-5bvLx!O*Gq~cXe{cMDZ`otaS_N@8DlfR1yUCpI4KL4iUzuw@)nSJz zlXoR|Mwz2x#VS8uqg8<^hOsL+Q@3?8IxJOPd}c!7s~7z7T-T%~JiB)B)(UMF5yQvx z4}RCWd^Kv}>DXy3zm;Zi?%K9J;BimC>j8s3MK8>Gs(n>22AT4H@tLglY1!lBm4cV1 z&GJxYC@uN4U03XLHV(@bs3G00-Bt34F!pchAdoQrxql`Q4SL+LfFPOZd_! zp0m0-k8P*M=jBSxX4)GgqH;c)EuZO;7;~<&MD}iGL2`&pS#M0}%i>>?F5j_F(R!D3 z;n3xC-wV`>Hcu~{#L2#VP0iJ%VH{mrj`MBSx-T6tyVxx#+I{|tGt+s`W6eAApG{5kYVug&31#?x~i%@1jwlwDkvb>-cK?Ri{5 zm2)rg@#buKr_pNCB|BHYCg9MTPahnE8reCYpO%o>32MDeozQY~$t0^u=idBDUmNf9 zGFrRKw!66DAlIJ{e%ZISl(t^Hu~Dq(`gO&x>2kZ~r}-}nuX5$-)m4P1?|kf!&h)I}RyV69%eQDBjMUX=s4tj5Z&%u- z$2u-NRu>pGy(Yh6C|P$_ovSbAbNPw6dAeJsnr)m=$Kh*!GP-4brB=b;vdWq%`+^^~ z>O8jeb6ED=TAZm&cDMM;s@Gc=&(r%Uyk~>GwZ$Y6w<5c@ncgQItv3}IIKDUC&81$R zeO6mVrc^%JGwk-MsPh4qe?n)uU74OH^!kXdCdaKcy(^VXLw`EB#vZ%ByqPnXTS#Tj z?kR5$)woA(zB)%#ed6!0VU-@=dNNn5OcUM0nXfYcwz{aKMYDeAv)>*2|uH^Y$&TZq%$`hhFz7%_lVyT}uBmRQ$Bw{b{$6_fqdYPc?r_yt3EhjgOLV z5nDZN($tD8(^p*EJ^5qAd?Be2v4o@1joaoXBTa$Wu_KL5H3kzprPz){ z`8~LtzcBfr^cgimAwTt1@{pFC5aBYdMXMo=0f)8t#W)(RVY~tD(c5*RW zuS?5{-ru2@m)BN!=c%f47Oc!-XXv`ExTI{=+W>Rr9iP^!EY0L{Qy19SF*_cUH<->CqsIEf!f|g&de2Wmn(Be9q%~!G~kymYr5*a zy@yiYo7WkgUU95!MeQ$lQ87=xZ-sByub9JN?RaL+cP{^;LbunN?6bOGOWH~I>TF!d z_&l6hwo6)9Hw zRFbp0*sfab$f8q0e$mB+a<^RdUdrw`=$+x==)t?-@$}}wvRie#@jzvh zfy1|wqk+XikB!96rwL38+w$1*;GN>n&$d-upY$qB)AwSFCZ||LyDU@Z@`$Ie`)bbJ zI2Ch%%SlpIQ*Lwfr%75?r!K^J7OT&AzxsSL|GgWnTDg0dJ-YEWcy`riTf^UxMz>Yo zwp=QxDpA`oB}nm<_NMLKSrZA)+mjV~U}Sr=9GJ9+lI(vL^oYbChyCpw<53bE?CzF^ke zq8-P#-O}SdQWvbZb?ec$-Y0JM9WF2Pul3up;8NtwIf5EqHu(A9T|WEYlJ7_B%)=shHgDZFD@BE&!Rk-Q z(ZkC-HWwPHU9$Gj(qdj_(vYT})k@f=+n#_m|&gn|>%;BFwOF&)<-) zYeFS=4CkycTcS}R`{eJbSWfMOstHZnmfxbbt7uH$>LYiOLAHG!YutYZr-zyDQ!a0u zBDhD*Q@Zo+-*)W>eeKsjh6?Lm>nT|-b7@XO`PH*uOyp|UYrpU{?>lH+9 z+rn4YZWBYoqsss3Mtvy!o89}L;jn3l+SOGdpO$`G?X$dVY7djwt6!Jze@wep{~;#- zpX90qw+k%Z%)5M%&3lPz?7#V)M{C{J*UPA%shj`rKZE&K+xae{f+u)peQWSIUg;Tr zG}7N>%C}0E7+;Ty!*wmM?aa&Db$1+Jl%=@fLG?m4)*XAF{VV$=Rpj9J?kH>A zq>krvcz#=bI+pEo>QPT-^RzocEYmILE`IR!E6?ZkTHB6kd7VD8hOuY)MD_{FPb|M) zeOmXx$5U*|{>7#&)AGE%qT9L`I`)^GlChpqD(Pm+^G7e@WB|iu-{;NOW{0i}Uh+C( zqKazw+9R&kly1Ayuz2pVDasqQIK#O31Mg)8iJ6}CemlWB`8pp#=n!9I4*QDig;R?5+{ewSLm7ZU<%G<$dxtY0uNNbAV1dnwK zA142?-KdxQJ^WR~x4Di?LV?SztFx9K@A`GY-ZqDM)&Z5o2nJP^;=-w$hF@}w;t*|Pxh90vL-QtWrCP-K=_00TQlyyNJw}mbI$6@ z_9*ua4*O5|&A+Dis^b#>oc)E-s@r2Hta*R#fn`eif+q_MPpheI)#*!QpYPIBvu~G$ zSa*>`o}g@U)`g`B^Jf3LzT%V0ktn&h{CW%KIcSyJtxQ0ekljPql(g}4u*-& zo1wl`Su`yE$F%i)Th2}n-f{PIsITFo{e}Xk7uI!aC{(4?_IaGI^{!|>xc|&Qr8!r1 zkMtK#wJ=O?l}S0xKaqifO1Ls^7A2OL-E?bcvd7^T)$DHk|iuKrc-8ombb!xS88hVDLMtK|x*i_lNgmF%|TTZ59;Hme8 z9$NPW_q=gnC>Is(@0;=NW0b-Ut^;=*G}V`Sq^wZ=%CqfSQHb%0SxGx~OlY4XCNkyo zfpeDEWmccOFjsNm+%@ZyIKljk|3G3!Q ze7D?+JJ@Oe&MenU(uKleDdAQg`3Vxr%azaVGEBacKJ~4VjLT)QyZQy&BQ8u?SCl*P zNvxPt;d8xIR|URWv$`i&*d9!qvSE8PqsJ4oPhUe$N8eL<#p_yhMO^6S^uj4`rnXFC zDsEY-e07Vu#LF$uSFDg(9IvE$wtBx&L8gFQNF~;HH-(IWuh|}%M-w5)}tz^5STeSUj(C?5fOFbNaXdEl5 zO3y9+&XQuy^w;jiDd+x!JGU!NyJ9qTC0A5~9rN{Yvo(*pFE6;i=w&W*@?{}Yt+Kmn z$4m3}{Z>u%Gi_yJh+|(NBa>`;S;lv@yUE;BU6b;&9%z+vzC6#qPP6Id#$zFu6I5A* zmOOqaRk>@$rgeU~UTthoQ{yi)q+ipr)jiOvU3BQ!;S=T8B1NY2>B#_!Ym1uU_D+@#YqN&VygBI2>0fvVQsLSyRWa7*&Ot zEYIgJar-#&jjgtY`i_gcecs6OE-Wcq_+U?W@kHtFmG7pzM{o9je)8IEE^qZ6tUO;2 zoOP*qp3}PAG}$cU+LGH-rH(TC8_j8&&RuhAZ~D8W#rm)I`dppFH#I4sTj*w?xyC!w zlTYj$d*<^+96#$((Y$V}zQFoRTiw>pmVG^EnpCE1i%6>~Cqtfu%yIt&(fb-2%57n{ z6u(RQ32oT0c*~c&bBex(7za$)J}b^_Udq?!pF>t9oqn)GxcMG?uS+S@q}XiRo9DHj z%+8*?j{m@ZznzK#d2hBn)GU+pGk)>;>(!M{x^vt0J7B3Bz&l7h%ezsc3UgSsL5$zhcQt1_0SN<%Ia7fWGdouUv)qWwbDeMhL z!_Adm_^W+eQYvwbzfsQg!pGd|nWy{P4DZJ0p77tYvG?r6Gv!yS1-C49v~CDvxI3RU zCH|p`mY3txn-dnSnRutL>)8{d*HPz$VjPvXrN(sp77Tln zvczutcG(pLPY=ITsoGieZ?5)YmN2K8k^3Iq2;QWk6+P+Dla;yq{xhhH_5QrG@LR-+ zyJvH!HI^on)r#~*?~9sv+CgV|;@y{@wO5?ItFnD-A{VE{fwe`tdnIm0zq-0M+-&ZX zrDEr-cfY>fV`7pxsXa_(_U>Noa)+ktfu3Ijj(qE|xpYz9R@1WDTbJug!0hG9J#(i0 zi=Vfnyx2XcTuSYZ!mK;uy5Xv4CkoEE&Mxx#V-WXB33+Cl&2Lw4kA9trkVU z*t0v|^AA4tTsymMQUBCjxsoNK@|o)_ww+u0U3tZi)wEC2R913yMxg>74zPb``9_wJ#^v$W3FUfC}GX4?{z`DP7I zPdTsKx9x^AugctWJrCBGne~1Cm=>HDoM$v;deD?_HJi*p8JB3ff zUL@~d^2v$wy_$C{`BSER3U4l8QY#mNi+P`bNThN=E~p0qG^YVIiiHN>uGvvK>K}AxkdYW*@?1G zvpLtcscyEMZZu)p6Y~kJJ?YCrPcIWaJ>PHpgU?Up+?ZbWz3Dhv+sW9;XE1%z{I)3? z3xqhH6il4>c-EbkJdL2{l&Q>7vXj*wtKM$;9`dJCTYulHNkUQY$n;LJL(E;=Qx?8hY#R}8^;&Iit}>(LtsVjQw(LoNX5H5*bUL@;bLUN+ zmi0%8_ob5%Tgbfh>00?3 z4qlV{(&tBot8Tl)@m8p;9HkDFhw&0Bc(sO52; z=SRY>2Tc8Zd;g79ZlAt2O*Lcm_xE41COYHdr_6Z8#tW-OLw~v%E&rmT`do4K1c~!D zg7bHVO}f|~w4mqRGh3~-7JsJvKHz_qBVfmt0!HOoHrYCptK(TWx;-nd$mNI%o4|OF z-D=+Lc|ie}yEzUyg!lW^@`fMPww)MN#Pn&AR&}2BW3y;K%jBZA!c%)n{(av2cg6M! zyN+WQkF3sKzs;vtp=GK6&X@U42i;9;bQl}h4LoeGTxE1Dy!6WHWGQEamd*J%x5Z&g z#U^gCa?n)H^7QkweDb}?vUsIQsL9@QO!KZZxLK(xl>A)1o+tC>Su>}KsiMd3Z(UvG z5E-C+_-dFv+qB7tmrcIKdvV#xJ9Q@i1OwJ-xV+6R`@K4*VM6qwcI8t`Ys3Pq*qppB zw06&a8EDI|^6BTQ$@PVsGLOu0Ej=z95WuSWWp7IO7Q2wWZ<`FyDziMPcsBW%S5s`H zrliIFS8F|MRM#D8yw1=n*!Zz@t=T2Rw4Z)E?yS3ecHLASk$2}b4twPWZhJiKO_$&6 zhNT)g<)2lR)gQlKJL!1J+_MwR8$@6KoAYXkiDt`!t#TIxCNP|Qk)2brvY08LVZoG% z=MOYTDYvp63hiAiu|8lv_l%pj45mI-OsKsa9M*lfxqscuH|sw~YaV|--F?G*(@j^l zDtVv%qq2IQ!_S7n6jz73G)qftT}&li#jjVm)T zSh{p2JL{Q+mhV+GctTCrPU!g6_2_=l^Aizr*F_wE@@7t+F|}Eujp^Y16N0lgZRr;@ zo!8a%CfB%bGL!ME&#j7EmR3)_TyWxve|u@zoOb{4yDLLP6t=aB<|-;n?cXGF%VN^(izlm}Q}wLgQhD4jB&>3!!*9>!*~#6f0v-iafimd9m*pA z85kM#Rq~jp8EG%ll(=yG=(cMS+jef3o)xj`b5Y3LyY$;;M^69v}6-yv-YIGoL@KeGnKKwx+MT&rxMo;pMk0!;Nm|C2Hr^o7?a8J#8Nv z;c?RIg!1F1)71HQy`8dpX9B;R+s65N-EZY?vutbFB)UUGe!}DT!F!ZX?z_UOqr&rL z*|eSg0qQfBM|3^8b>PIyV0NFgmrCqi{En(7Pj5JuZDScU*}fy-bj`g@yZd5)%D04V z3tD%P<-O#Gr7^ad$F}ZU-6OUrezU~_(R*&UUih7;H^=pJL(cWD{B%C>(%SrmcUtB3WVIGt z?mBGlvr_${TkfQfyKmopV|sjUWXa_eYybZYN2}xifybcCL%6+cS3gnDVt&`V_;`6) z*1yaD89v5cf3?-^Kf}Y>s~CGUbk<)A&)R%?$Mdzd=IiYY8aCR!OJ$AvX6hNwQo9jaYf*!*OOiZ1m$>n9kBIaTO{TAb3*db znfaxGPmUk%)!p)-mHA$ke0r^qNlV+Dt=U&s?%P({cy8gebndWi(vGUClE>c7c^%WY zsORB#qmb_croS&;wEY`fpl9?hKsuMF?HpIpl*O9NTmeseo_u=ld+(p=>b@zvSLyNF zeD*(9=%>gfJNsOIP02HvIPtfxraK;IpUzutYao(+CgHJHluUfvc^>{3*=pOBJ~btU z#|2H^nD9{Rg-C(*CimWoNtdMK1S%g0M=v#q2rT8+;tqQgwzaH?BPy(6^NTm<&%1ie zSTgb9qIDOw{Z0E?zKFh9%gt5zXwkDbsp?Z%weoo_40`W#$cI)2IZat`@eX^tUa0j% z_2nsRkF@<2n0S4g?SX zIsb<6jt6pa8|Ux$RGx5US;+d<-3w(8@7vfj^{wmeCGl2R%yE@a&FS)Ul3_eP#gmzVG4S`AmX7sCQ+2czlGzz*ru;7O66sMqRCsCe_u4Zq zsxG{zJnT%Lot5T!88qqE<}>r!*6x#1RC+I>!m1H@t*6dOdUwd}j#I0U$En8O4KmXS*u9RhmqQaCM zKL?xNe@m0&7w-vr5Ujt@=acm9S$?NWQJML4or}WgxAKcrup5Nx~S-5?6<$-C}q=LHo zRT|b+epokYcE+3wZ)a{f?UNqmnEK>+)XV~ruiVU{HiaWcU(G(R z?qi2;=O-2QJl1~ZZ}X&Ps?tQmX^NRUjhZf;2^V=Zjje3?77z7DT<5f>3ICot%jD{` z(>*qST9+(o+^wa&|N5(CzgzrQH5`sCc&^el)3H_Tq3H>$s-MZbRC1&Jx0~{^M=MW1 zY}4_=HS4NbYr+H2Q^JKo81Sgtr|DtXy-?v7nL z7a9GG9v^MtdAhl|x%s?((c*H6*Zn)UHVG9K`DNuY?$~Z^{XHUTxes@ai^9Iw*ZIz- ztYDhE_ObdzQSQC>P2PQ)SigN2zso{*dC@9Km064X45v;t z)joIXdhr@}|SRA^?Gk;Y}j^ypvtKBXh;pKaM-laP5L=sPH*;6B_0PQF? zfu&0=xdPaymu1(QOsQ5jiGDHREFz0GP zhVN7}Z+h)mT#%;_8O{DJdDrT>&g)95y`u%*@$K89ToiUYg~877+P1U)%ZeTMUb)D2 z)j_&Bli|rGG0P&Q?d|S+)6bQ?-MQ4|2k+cWu_e2s*Nd~sZaPw{yIE4R@_6V@Kl?dr zD}G)1{6sU_liBm+ggtLQf64Q&e0phz{n7M9jfb~?=N!!n{F1VR$!q7%i5IHQ#_&cy zk9?wcwtCB{X2XV7n=?}qGr1&LeiW^8cgW^d%-FC$Z?CcL?nTea4tWWQT~EH(c)lR; z8RIkd#+Tu|?HyKJKNXL!-xJ`x`I_!%r3G+y5=dmy}Qwn})qT}=7KZLfLS zu7oYRsjjT`%6eZ-X!#1}qn%pu>fC$_7Vn=_`S{TCU$Y}WoVpX4xK8!JPH_qAJ?E@j z7NkGu=~|<2<9JEQXVa$tNEbgIRQFUM=s{dcsz4}0{;>B{s;UY9EKj@ty) zTl((%Fms)2UU1-3)#J&}^D~%sr61byXvLde<%Mg-cU(KmT6p?m3Ujdc9W*E%xtedKr+b!S^j; z&Rcec$G3w|i;MoSn)dz9SJhwQ=_eFtSA;!$d$ufbPU6jzllb29Sxww`)3dPc`@)T< zrz`j8Y0bO-@_tdvqiBYet@>IP=k2?v`fhcXs3=*^95(fy>V_pxG*3KSDp$YFG&1XL zeE!vPjZ1I7ZRXQSvsS!ieaqt0=CkQChu7@-{YMhC&P1QnZ^(66FqBFeyJDO z2Qy2qQ1Mgtnttt|d{WydpE)w$`=)Lvl+`M=o!h&?tB7Gnf#rM#?ZtPyEtj%~_@2&+ z3tP0HT(I$i-12wVu5n5_NU%@TT9MMHbs#v`V6Fk9U3b^#H@|9My?ogCG3@-=pnFqv z^<3-he1#>Jd~3D-_;tk-&FI28lP0xpe;_pXzM<{0)om6J z8MmqmnRKsPyzr*7eAV9LkIUw!UKjY+HX$-POT%-jgS8bU5 za9-(A8Hs7h*%m>QZh6g~E%NDEtvX*(eb$oxuH8Wo9)(-ED+o+l&j-OK(m|*3@=sJ=wUOYnDU!YTIm|)^S2d9kZnl8=Fnk?V<_*2g>V+~aP?Ob^}3c*p8ih{Myf>hrfPxpt#ZpH(oddfzfW z-{RL%%YzLV`zt0i{+8*Vw|(>4t!vUdlSA%A1-@{e@%+`g6=}E9-@Mc9)9n;AdAo5Y zM>ONh)+=Vun7%bITKgN=E?N>Jta?_qI7fwrd-Lv)bqSLuUVgr=Y;NVg*m$4WXD_83 zmkzsoepmRG^cg2Vu6B1VRE&}nx$Qkc=tan7)jg{jelaBU_pSJ(={-r#DkS#P`Ptjr z_R7_q-!@^*LJqBGHkBcq|Evr?9q!s}JXQTc>nHZ7OZYy{5dF`PE$v{x`Dv`bN~9~( zIp^E6y}Gums!wxV`)=2C8NZ-{!cgl!DTTaw28*pGIdBB+3Y%{6*l=^3?garhBd?$Q zFVC%3o35N#Y_LSjYXYB8%ainlrZ1N+6;4(ub5+f>Y3~iQ^6$Q$>$pPkwoIqMqNr_& z%JZGWyv#N{j-6dMKclhvyxerFvnk<@2lf1XuX^gfsy=ioh=1N51NJw)O4~d;u6(gB z(DqK{^3Z%2_#*Rh$Ax?8k#S*DR{E~WI_2fA|8mZi$U}b2oh&NfKOHT8HvLXMU+10d zJ)(@Ao}RMhg0pJ6OSY>{TAuFiAK5d@{8Dg-{m!4+TsaG4XZEd;Tg4e@8aj0y z_bKV_eg9)bzq)dd@%=ma{mQoQ71gy1 zW+nK9ED%*?b+`DTGJj6+?Xs0#+f);`bN!rPHgBeBebr;v?v#VIHYNRPQGL-VpI_THAsaWWDws$6<)v3@qdFl(6 zcl?^{cQhjUyV)TdH@~dazU#dD-kX=?Nqm`5*mZvArhsZyldVg>m(}&3j&dvNZ&;Y} zx#QNQ5BUD@*LAccJQ$mTz;e zPQJ8l(WP%9L63w&FKe$^e9&Z~a&q*6OhvC&b%oqRmFd^xVjc;5b^TJhb?#|X!>6fp z7xW0eUGZV-t|e1eUJ+&dmOM9chW6XttY$6S+z)cSjymL1kTCI#C}vYM%4E#aON!-+nGHo0qXYs8VCzo_?$FMc1bNSZ&zS5Uh3KmH#{U2g@pQHFh+# z{}p9oV3t_!D|2hsqqBPxnnD?`9bd1xt|z}dE%+;?j}S^m3p{{73l zF`L8IY>JsEYghkZ?fU-=rl9egS?g-M*0+gN?btl=?YgE7{6DmF{xh5n{LkQ+q?Cox7Kl$IaTMhk5+MdHG1v*bl}_d z{&MA4;U%rFTKf_t3cu?>McIy1d1%Yi-Me zuLn=AI=dprl5_i=AgA*>@;nuxo1;2sMW-Iz8U8bN-IKM=rze^|UH$m&%7~Bx@#|S# zoj+Fl?_A58$emyCY~%LbyWfY|9#8yaY^gh`>~Vt3>-p6tBGxsfm3%AL&OO5QDew6v zi#LW>ik|sqie;Qx@~t?cc&2oLdHV77Ue{I!XB=+wPUuS!Y_Rj1&GzK}BnG=YPMIr? zrj0eZl^h9ECeN98X`9}~{1BHD;?E|%n%Zi((OIUyPE)%e%2UJVkXM^o(}D>$#m&A~ zeK$4WFzWc+x>}i6YCVbH=B(Zuu2=g6mGzlWW4+m7XWwS~e7J+H06wx}A~r z{GF?*VyAuGlseX(%su*ZcbB7vvSuKQe6DSu#;fwj+r?@x?3vc!-^ZBz0nJbrCW%O|f1MYVHQhpZ@TSJ|=b-h@+O<+-}d-(Q{b)iNv$64ej3R4z1U zvQ3=3zvgn%`^_<09J9RKouZFc`|dg?5VE^xN%`A1A16LOZBjXRm6Ox#-Bt|0t{Tsu z)74k4vuHx=O0CMj@0*s^&Ny!sHBBaJ(oIjTf`z(sn!g@d{cP#QH-=A`H$9rbaE{ya zkLWsO!K8Ce7h;Mx+H9ET^8KnvRGGKj+Zf-gvs^qbUweH$l}Fcob1Cl*ALoYrkmcj)^_ynj*kbf7=FOAI z_d*0`y{JspW9o8m-x_+*J>ewR^SOKNe7by|d_8qw!mlZe=eYc>;_hx?(d2aLUHQcE zRfg~GGN$O7<6^> zKVI@Nx5;|;wKGlDKQAv?dTh4f4!v9Vf~0@Q96WwL%I)z<-~DPgWBjj$i#eCu##T?A z@9TO~>tuYpvaf#pb%l2m&7M5kchZkJ?rPTdR!zU#Dhr+W7yL2ZDAvKJUZi{J#Mixn znmdiwaSDF5`Fu3RbBd6^!29(d1I;XUZNWxl6%x- z6W8W`_Z2U%9|$`cwLSQpldyTnUD-E{Ue=M`%IrIeSBjov%8O35&PhF*&Kg%xs~_*> zkt29I;djTu=hwG~KUkaaWQVrup6+!e-}kDXo3u22rV*cA)uE+AlXn+gvpX4m@TXSj z`%*5q@U-6Thqs2+J+00b;{Lg5~L_eGy@}_6Q3+1g*91P1Ruv;8_ z!M|;;{+ly-*KRbo%eK-@tuV|pH>^L3{R7IQ_P>C7%gz^ z%JW^5ZDwy?^;R~9WzC!kN=svFOSz@}P6ma9{hgSr^`_fVok7*>$prq*^N+`IHT6AO z=N zK5*%T+hv~4n%-TdM_U*Q@2p$4?4;`*fz4(bD#c1tl{H`A=ic4A)c4Nh#}iI59$&RM z(Qxu6>(y^3&)lW?)#P!9?m|ajmDTx+EEBl;lvEb6Dea%+bkbXo$>Zgeezc8^X78JpHI~eapcqdrTDe zZE0-YtLpyl%HN4Ato_bPEqWmQpTVl0H@8Ul?tg|=>wcQocV~OqJ@Sp7q+8~2YwKC3 z?HoZ@);HboDdm}bp=4$GUR|eq)2d8X$L#nlQ()6^DlsCc@XEZ3weJq?Sj(9k)%L9Z z%YTMN4V*cjezZq@%DJwhnGm&XWjeDWmzTfYpE)59!%P&G?z%;-~h> z%PZcBPTd#WH+R#2hWlOF6nYl3Gf#N; z_4;1ntnQl6Gq+0y%ih{|lDCuV*4EO4Pap7xs;h(*dvyK2dBuV|cI~%Ic6>4!^1qZ# z7O73UqNQ5*Y$an#?>SA~2AiV7`Q4^Di`y^Mo;5$7!>grujBDvi?T>G0_falmmC9CpiPI z6;7PArmuO|qO6PCmrr}>9k_9xYp{^*p3UF2p0qD{%io&r^=-vT?V!inj1erK&nun@ zn)W5N%QMC8BCo~grO{=_f|@q=$LnpiyMEAhZC9$;TKTG6M~yNie+N-bb>;p0Hm#K{ z5Bj!gM+LLZ66WykSz>4Y?sGjFWhBgV*gmB2n#g=_izim|CyT~@v0#PNo&p&}8} zoytvCb%iXw|5lxSp8Pr1tnb?nUEf;ObnV^|nTM$^{nOUn)jnMMTIKG{%T`s_w%%Nz zSF&Y~!|CKVo^q4=?c!EVHb3w-=1O$TGm{whSvz!$F7^a0np(zDF^PkjQCm`BUg@eM zx8#0xEuM9@OYFYePmY$x36mC|m)~k%w#PWJYwz7<3meS7$b9~89P69^&~C?!X;-fE zDm}bvbx+1SGmw|1wY;%s-s0=tYvyQOy>31u(Ms;7nD+YpGOOHCaZ$%iQG2{yoWjO1oH-UvbZ3QI1X9 zVrJcLtZtBLUw>@Fb+6?I_sJ<}m1>rH>g+9ua%6d%y6{R$c}2o+%dczS9-R}sQE+|r z;Bz+Y0IvSFA_q}u6XmkoA>Ey(N{j<@jb$~Dz`NJc2!?- zhuto6m032M-inLXDAJ>ast+UD@rgz|kQgp{%y4x6-s{$HE1X37`KnG*34d@i?g0 z^8I(ASM+7?;sUqsd0XbMH)1?~qBuBWK`T?pRHg}q_k*IVvkq#M%XL_=ORg<@S0j?U zEclJvw%coL7}=otjo7WW9H)-lN>TdN*9ID(ddJ zyihUW^KrY-7+)>thpKUt0wzzg?pSeR8_Vqnw^AGnuaudIiL7s8D2&Z?pY35;DCV)^ z#KF@$MP{9mG>*C7Q(_q?`AqB9!*A`|UhN1{J@-g_di;t zS1DBO^^14am+ccJ*V^Y6J{R4nGgUK7<;x4h&)>st-YO1qY}nm>tLVy~Qr^=VvWq%c zdT+=x&roLJZ@zzC*7eXki45&Ex7+#j_V`>5Ke7E-$PdGXJ5+Da$-eY?+5B_ToG0#1 zJ|lRYZMA1yu3YK0>tfGlPpR;Z3GvQVFjrJq%|6Y@-Kajt@P5=Gy%<5xcQsSP+GYw` ztvmF`L~*;Q4FD!yxFN<%uO__LWYFR#0WyPwUlfBJm%(`?>%uTQ)=ST7-(@UE@ zeYQ@R*z~}XeTU4o(rwQAJkRx%V&t}GonE_7z^Q-ET32sbM#~k|!SB}D-Y}B99QmHD+05rvHVWwOSn_;Y@R>PGewGckQy+@WUZLsqZk6P(Cng5<%TGTJ zpU;!_isj{9zPSe5|J>tSJmc=uj&o%h9EBXG`&pVq<}Tq`wW|AhQuo`FJG{9Qcdl2R z!@ri>;@j`6!lOoUUdf!>&f5o@xAMq6Ygq5O)&H1y#pKEN3{T(mS>~i$L4Eg9^PWL-&<6^^txQooS;pi!L^aHdbhcb1#Wo9wBYKTi+d_X z4kYaPw0+51=7o1J%~w9KZBJ8Fs-A}M-q>YNKK)%`-!${Bim2|^1q}PLj{2zFy}8qI zd-RP>N19d_amh?La4V(i8eio#SJmU`9n-p#52&As)@Ck{J$^Or*~`;ek90qZ>e{qS zN@5nu#@%clBp>RgsQ@)bybJ(-uTiU zpPM^v(oBBUgBPeU(%KR)^i`gu)!9M-kPSuT0fl*O5n4D(7}CKdV?8vEL`Oics2RotNT(*lJzPj-zFy2-fWt?%H`-2 z=F>B6UOrOpI5a7w$m-cdqk!(O-;6oEob!eIJ`}lX^hxEq=s&FebzVPp!OW zI;s5O8nqoJ{*%NL{xfuKJN%!aDY^c`*>F2YMPJ3p1FR0eUN3z+%RT1ymp2xdeq^t^ zS*E+UZ9dl}aUaFZ%q=>?&we~T@%)q50*&p}MTD+_Dyy14| ziL#1$+aBjH&`4!j(#rE^>Q&Q%u;kMdZNk~~*PYmQ;H?7do!nzdVOtY5Y&YkMU8|nH z_X21@kou1B~MxUakYsIH*iheI4yLz#`Z1PsIqDgO@ zDuP#ExWjkp#J$sfk4|`>v^k*8!dH8BSv{9&NZ`(}Wz$-Y3f<=@kUJ`&vShxT!=t&1 zh1C%eceHYUWV;DWS(?+Muv9|A_CW0|U+r$GRjHd|H|8JlF24O{TC^kA4^`{V^Tt~y ze!Ld!rQh_idg_G5yvqZ)E;KBi^W`1$^i%w2eT{B=`>$Nm(_nmUuFS2Fuv_P^ElFR= zXt8Yh9j;23{?L$(ucX&4{C441SJ9f#?xZb>K5pH-6P7Gj-Z$VQPomT`{u1ysAX?$XK4429+=}8a2+c{KD>$)A>*V~|}!WVaW z;=kO)D6LNc+pQ%WJ=m*69^C2r^lkZW+1EzWngPlQxz_GWLinstsC-`b{HyGhU60qF z3!3)Ndz}VT$RewWUDq?uJ)Ur1*(2_TPx?25Ej9~;f;OIzdl$O2%IjTJ@VeuDPBFLk z>^#f){G~jjr_|N(jx2|?qMZp#G$lQbuWDYk-qpL*SmyLhz9kB|QGP{}=e;ZCvl0Be z>gl|EgQ$i_4|hzP6Yc5dW%h!J?n3C{$rRbsOYB{amQ{KfD zFf3@vWl+^*V0`1T%wfue*s!9IrA$@J)i&42O3W^N@|EF4^wJ6Qn6*5s(Q3dm4R{MU|%ORt_15p4|? zO_ysIC8Hg9ix`sn#4m;)xOdsFDTu@FV)UhZXEYd3uh)u7(qMR=KJN|Jfu4sfWi`i3 zy_;Wbdv;;E?6wC|TJuhwa@9=Q4JWK>XynA!KPTT$A~GpwtG*fNiw z<@n+9_Je=ar;bRkDYvdb?d2iT@^SI?Bl zktsR>`A!zAU{N*906732?QymnQOBtkKPo`Da!3S#`if zNs1k65)cXPk!idi=b~=L++bwfl;zMJbj7)KgYb3+t*PAh8A11xUp`1?R`{*$+PfsY z#^biHz>Qo-_54+hlAAa+Wsb4yO;yf2zw^-T+@9ozjQ8)^>22M(Ti~RY=Ydy+cOM77 znR>6|a$$7NCzi=qq`u!!U0(i1+4e}$O66$^Wx5MLY!aLwnxA*#@!E&EQ!Rw}Sfg*K zS-$9+7WRNuJ;U>yVcbR8tQR+*KhpB+wNXW3S9eShYq{6OW8(=y!~b2VjWd#iknv*HSUU;1T5-@$69ZOx5=Up^Uq z4`lxAD!A8Y`Ngl-&Kt!&X=yMrezTf!uG!-kcka|>JaP29v_3WUtjeoNGTxqEo=?i= z@RYJ&5BrtLUn#(xU+~mD$hK=dAG^RD8a9a zTA2!Fue>HLnp3n|*QB#8;>22sty5DhCh?b6#IUli&Z{b7DP1l3mRDg%@~)|h8Get1 zuY@hls9w+`li7DeL$vOsrp(EotYHzVLUEyD;ZEGAbJaJ>7EZo=JM`X$oMZcC&onGG zonUt|p=Bs<*zKePX*Is0bmJZ5&W7Vp@eCeFOr%s!R zi{@<8xqVk~rH*D82VY8Y&?Wa{TA_!ZGvx+J-E5J}w6jzYRez$%{%FOjQ?>7oc-~pR zTIce&#;D6|!C5DmocxV1Ph3-Yb^1wZ-5KAji*s(@i=C^r!=+D2EofRn)cqY*_9=V? zRmIEeYd)WH=)9$<$t6AQTbQS;=lg>%1D-wmWo@ z4lH}QDdOJRc}q>CB{C=VzT|rH;Qr*(M?IzMyaGytUu^r?rL=UB16Q&7{6!P|s&_7# zANQ(r>Qokm2RxJJ$hFivdPS8co;`2l6?}SmeE8Y$73*15m-K}5luoahY9_Ozb>c0% z3;Emc6a`s#ybR435^7#{VR@0E<&t@o$Ms_){P%9P$X(m=d4;)9Q0vR(b50zXbn=+p z?z!nxb(hCYsl=PGh~M6LTen{?=E$k& zNw@Emsj8Gk{1%=w=gK;H>95{KH{*9qdvLkP+D)J-NZ@3K(Uzk3K>?HBu4>{skw4LT zl3($;xi?Dn8ovf{aVRjxPIwr3++z7f`|{3P`;wP=cek~NO5Vt2Ravo=t3Y4o{EhFI ze_0$~wZz3o_2{CxRr`S$qVDgwtk|*|o{u$-44Sy42lvB)^ioYV&R7(!7s~uij)% zl8HTfU1Wh*Y~ahwGuN42c2#=yOJMFwrzs2g9k<^3&#*bRUNLsb^9z$-tk$yl`aRri z>ffWA^>UuQvp0J^>siqh4(&Jn{x_}&U0VFE%fP_hLF@42TVAErucKR|nSY`Pe*nfnA$Q&@!Qn1zH5~kTKQZa z-}KwgDfq5@X1T`(>83l|yH9jn?$X^7dR^x4eqC4HyR!sZCYYJcUGnRXmSY~zf;>j+ zz3IDV?9!UrchWJ$Ms=QJ!s5*5bH2~}wMMT)<66*hgQ=}D)q%4%-;C(H;WfoAM2xAj zG4$#U#EGw_ht zNeRgxue_h-MLqT0dOkxfMZ71x!IClI^Rix%KQn&KJ6qx7-d&(KQEtNH%sY2dcf8`x z-Lde4AG`4#54l}4U%#$dF~{}lISGC(o9suA#T#zjh-7rt3irJ|#emUf=d~TFMN5)3 zJv|x=1^55ZHBeP~Q_02hr!*{vX?McoF1g7WM`Nt6w(eb;xAvXihlY*!oA~|bt^D1` zy>`pH;+rac5ibnt-ukT#SKBb{X?nM$=FYXAr5XV?n~dj$>U7;HwYc`|c5tUBtE=Vv z6}d~lO)TX5YQ5{nuT|+Rx(8%#3DwknEjoBp_lHVZ_1ja2*%~sZpp+eRcQ-tpFE_Ql$n<2;;yD$^XZ-s0Xjl z`}0%Q%i)gb`RRedex_oV*Dc=_u6Yvz3Z8a`>#0ye|0Q|AgB&y=o6&HTZ#(tWr@i>Sed68drmlmE>JyJj}kR6Dk}9=G-$t36Puyf*xlb#>=zv0t29Pby#fHS_7~RS$Y^+&phOXMgYX z!#RPhSH2x|wmEle!m+S_2@`BMp9juZp!n^Q(9%i!oR2LjU#2X2t-9rxb?Eu)v+~Nn zsLuJDX>V%%DwMzMsiww>VwQwp>s5?g?g}B3gy+kI75@wK)Xcp5y6>g`;l3O40?Rqp z@%}g-m7n4IIfCC*lU=7}$NY@}vYI9Ju9<=Catmj5?BZYej%&)Y6Sj^|{d!kyuf25H z`X&Ouy1 zp?1mKh?BSUrpi0M=iU0QWUJUM%S^8yoIhMFckkXm|5WzFsS^*)u9m)))70F&eZFIS ziN5-;o7%S4sLvKkn-l_H@OMS!D^^K3$pgDR8T*d*Oj)VON&&zGC1#!Xve6 zfp*VQN!^7C=>@ODxK~F>I%jHz3Cs(PcZ$wElX{$k^X|*E<;$G)7IOPtn3Ev$b#1ar zL+{rmqD_l;Mm%vpcq~(TiT33}_6f({Et=w?`)z6RCH3o`Q=W-%O>%Fy+B{P_a;5Lu z<3gJrx&ORzVm+USlU$I8giM3iirS}&)rT2fN~||}%G72BOKTT@+#`AOjw)FWydTk<>++V&-hG{ zO46!NdL3OJW!tT1Pt>&Q^ka})HFMMDY)0vA349S>L!|BmonCh`Xj7Z?$(7OOFZdR2 z5BMY`((=jfV3b?Nv^B+oeO_K0?6V!aia+d~v+GiEO~V5IT|7(r7MpH0f9=S!E;*%d zYTD&bsd-0vO>Zt(vRLJ_+^VqKzG4TpkLyjj{(jO44z4-Zs$Y6snWk`ku_l+rhehjo z=0$Aed6=@TfaBM@sV@!AXKfV~m=j!8Dm!t#|9L5uzAn?fQriwTE!XpDm0$Bbyx-1a zndM?lhAJ1XD?1t{t-Gkne%0gRsx6l$PS;zrv`*$VdqhOQ-c>s`PrQC{b)nqNh~>%M zzM2aJx2t^qvPb*gp*3qYPdOfY-+cbCNT=0#AJq!qJNo5I=beAR^{sSSzousBLoL~Y z==X~X5)a<(%V=S6`fax)vLY;)wsMc zd#B30_YM>6w6^aQy{x*@uD#!oRd!L(9N~Fh?510HL}ujX7lbz~D=lPpQ|aA4ox|qJ z6r%hgB|$xD z-IMNRE-1R0oObR{`o8V+%reTScnU{(zM5~wb{Xc`*T^`w6Gq$r%UD95+fbHYmc{QtpWAZMp zaB`B^rMqnE4&{v!_aA>)bt>ZIx2G-(%N({%y4|}a#^0&+o!S)V%N{dd=2|fGK8(^ugzWS`zG*)Q+wz0)5}X87gzd3 zDVOQU8kQE$I4Lc7OF>0j+V{ApX6h0- z{Ym?-+*diPhJR*H_hc_owBcm z-KmZ%{KIyh2h~E_`ET}l+1i}EJ;#2!tm{hO?a%de7;d>6Jr7;d@+3i}`Mjj%OYfTx zk9?o{?Ac|_6dC1LSq{(7T6eG%i^ku!+49KY^U}I>zMp50I-d(`4=~qMwmkXDzmDO< z^J`mIpALOHDK@>me`(Q&dBqI37*BjF{=L<-`^ma9-Ca7{D!eVf%NR_#KSzOO>2}er z%Z^`9O@H0qcB`=W(AjquZT7b2yt+$|&rVI;vNApI?tg|DM~SDWr-p5`+4b(*k9V8; zq|M}=nr4RQ+&f@>sEzOOZ=F9OYktOY=BxA4<}UmoTNG1c@oS=ygR|hFSwTX#I$njI zU+y>6NB{Kgpw&f!heK4kqo#SSQ+_!4rD&Dq>v?TcH-B;Znq3gcJ5SarWLdlEst3Kx z=Q*7?ZrZ~jIxkMN;I!4=RT2N z>+z~m&S}oVpB5Xwv|TmQnzUVLimpaJhnMBsDF3QXKjXfwr}b+E-|28V{-{#+Guk#s ztG0I4l%+oymVA+0SGuy^CA#}`>2bG7m*29kSfR)rcjOauzQ4%xD^W8~_-~Ucs=Wbe+>FxSwRk>>`B+nl@uRm$>&M%G@pSD_T7hW#qb;-%xXhVzqCO>}TfX$D8 z>TKE6d4uc0<9nsD+mp?f-&Nnr<#9)_xzAnp-bR;od{HtQ9e2WJO_^S|f_sK`O7YXi z6GhL@&p5G8JAQhP_FQNf`|XLIgjW0_h~XO{KA%_`;2CMzBO4!m)j{!tl^fw*$D-?<#ww+73?ZIw_N(ghU8t3%-*D`Oe$LP z%i-}vX67SZMUI|~t`^~SPbP+5yjpxyGI(Miqt>w}#kS8S&uaA^;nZ2uUzB@3rAD=# zt#`j&nl67*e)jvL2uj;sI;_j@%{+>$@jf)erN<>&hSFlX(sdym6pJyBUHD;d1 zNomhZRn;7x%#)W?hhF}bHmxpKC{*s=%EUr6m30_#Q(o<}+`_;cMOvmo4 zoP52o($V#b>`7LQd&b+3Pphmh3|w1vOYUOvvjr=2P1UTzwk&zbGP!wbLheV~dm?x3 zd#jdt&s`ENH?cuv(Nd0UYJJ6b=kUcbEw)y1jhe-*y0xq? z-z#X2PyxH+m04$3$X8!yS*U&MmNch2%Y^wt2Ap3n`(*Yz&pI(qD~YmU^ zj~*A>?Q;qHc;xgagBFg|_)T5K(Z`KqjQXV}W^GkHE)c{tb>b9()`_RrJNE6{6?Nvh z)D5n{J$=rZzyJKpTHY^WTI{8nedj{>*VRp;^QX_%Oz+usUQ2hjRhS#o-V?bF3CSzh z{{3-r@}bj(uXkNps`yoV8sC*|Yvk`V$314Os0_HBdG@?!bm+!J4X1$eR4)%nS+lD? z$E7P;1v3qo-5+}b)}N;=Ss@>>&h9c-_&ggozsRV+d|sTA zuU|j?p1n4(z-P&J%{@!34p%cxKL4O^Yplt>*T!er<-D9vae7#FdiAZD)OP-_)Y`Y1 zF0VHT|a-#c0Rtl{A^gbJlEtEQ$D+Hn&RR#`L)H-5Ds0Fkb8%M1h;BB z9x8qunKkv?#ci4~fhouG&t7|ye&X$fO(H?%ie4W@{^ojWdL81_lwh>p`RA(NvZt!r z+PU9r^>)T9#`WH-Dq3v&X_BRg-NNs$HBtl3BQ8IAVNrIvW$Csv(LO7^RCINXE=t(m z?tEdBwe9Ldj%(+R8c7!(yXE)c+*MUB&AVGx@A$P!$dvct;@fIJD-xEfq^^AB=Vm2% z|ION6xvH-h=bPNRcWBafG5;lt*evIL4xg7Dqa2($_(}W}oezn^_m! zI`wV+d=uu=1*Y;l^v|YP&E$O(_NZ+2p-DgAr&)&y1n?iyEJ)f}9%-^?`hGsstM6T2 zvAz3tZ1K5n)sJ!yvupRBIq#_OEz7_7K!elI=2t7f3s!WOJ({+pEOpa~+-qhbGMyQj z5)svTGPPG8rW-EC)Yx1Xrp z>U6%)%PHugsz;_pz>5WLg&&h9oZE3{y^&PjL!-wf798$#ZQ_DzyOb4z*B-lSB%IUK zs`KW{apS+d@phrAAwdSqJ@U4#vo4-d_RN~_OWC|ZX1ThgysTra zR;A;*1C1BsI$wSYpLAsHLdNDTa*^l#XYE`(aamlTr`Q%wowusTFU)!TdUF4q{{2C- ztG_Ll4Z64QR+8%4oxz)f=Mn--2x0%Lhug9mo z$a0ppgr=~sqn+sCFul-?k3QROmQG=rvha*fdS2CkhMTd1s*i8$)-Ld3vs!I?XlL4W z-WNSH`6f)&yf$gh6QT0{?%g}MUZ$sNX5Mh(S9z{(duZaMn#mJYf@)F~@8)VO=kl8E zZg{8g+Uh4e7I1hOF>(dIw=hj9%;LFuYo5=F6O0_W%*@j&L#uSBn=C1taJ~6s*D}|< zOPp$JCMpL?foJt*j1<&dpVQz>7x`F-Er?UVab$^`@W7rx61^U0q*Ps4Xs*?Tvw z&yW1I*57}S>oRq&cW#h>#->U0_N-2x)pe>tWM?*O?7_A7>!-TzJ-I_yBA55M`l^ld zXKhnDSz02rOepk$h*qDkl$OUtS2@$D^Q9BFjNd+w3t#hKl1N98IbX7h z{<~nOFH>J=>{vMG6U&kb_Pn`nlXhtyIMT_xjo&@Qmhq$1=GiGG^V4oG+f?V`o^-tP zLr zG)-OT8Ggt^`NP%Ai*hoeo_dxB-JQ7CTV(FnmD4VSEby>2Rf%1?JnGGD2e*5_eAe2D z?L8eKv*PXqlcUqNs#bGtn^#?*`q*pnJw1h|`fFKjd3F1jCqH>x8vXM@`qaeRLP8Bw z_ik68ao(zFTd!YM_aWh_cb2N}$PE?ip1tWS>n4}&u>pC}UfPl83f4T@w(ht9%Zfc7 z?uS^OO>@}lmgg+weRSFFsF(xt986Zi7p|<6Oh2V=zCFxhWvvttGms8({|5M`j~L+=5&J)4yGwy2>%aDu2JtB7uF%a2{2Kc7iB;2lojTFH$nfW@?;BO6 z9k>4wsv6=|c7B2R{I@Cle=hxdJo{nm(!?8V;~ZIJQWz-L*sMr7&HmUjoVJ=AYyN1xj@X+lei_C$;K z>odJOgSa+`#5l@qzGuC<)#|~8=`Wv8FezJKdPpc-a!Y?^(A0ld!_HgkZrnOO*30gM z<>_Tsp%WA53reMZ&z|)7bXB%4TUmpUht21SfzKZt=dIj*af0ytw#Cgq?6U5DmgAXy z<4vbt%@me}d4l)+-pu;4GT4Lb-m{D66=UyS)!pvCEo!2r*M^N+&TrnP9*V$+OK{ZscYW!?D=MqjExMl~*q*ZIRhiYMMSKs~_3AHN>bNvJ zf_H7S$Lm=W?fE1aI(U<9%hM*U<5AVs>QVA|N8ZAl z-O;YL3t1j3$Zb`fEXCFFIql}HbxYJGer6|h<~vu%bRBMA=hR@YYPN}Eb5U56)0{}J zHV*b(Q#YG&N<^`*o@={EcI$D26(^k>UTk7Kzv0?pwkv%0R_|n)_GsDeb7;FS8_a!n zYr|BdHA{+@mFnJjuQ}CZ?MjB+^L|dt46j{gf2EzszCWphZLj{>D~n=yg#2w9>Z^@4EJNi?bb? z%kHk)&=(>3Y;wfs=}b)?VeCo{Hm^!nUbx1eyJ3CVp;k@%ity#Cw*t&oa!OYgIha~U zsxWU&v5N6jmQQIa$|y=Io7&X!_4&m6m#6wqR6F0Wx8v#W_@hg|_j*gcFL3@e%h|=K zh3}}NCZpWK$G)4~s@JR&+O(ytBj@c$P0KanpNblUU#tJUYWdyi65n~}jIZ^(rka*) zIPRgH$oHS&CHsS=-X~M8c)j0RsLb#%PC@YWll9Rj{QgY7=fM6UwCU-!6F>PBd6%j$ zxM$CrllMNidwRf{DW7EyzWf-v&2XpDF6Y+~$BriaX#Syn?eF4AoOX=rA3}Sc-n;SW zw|i9KfhA7_Hdy|d!o79oCb1Rggsit;zMZq|OL*_f3hf&U`xZ1is(Rj$3OHWCKK*Q% z*7BQT8^5wXj5%>9yDDFdt@!7ONmaeiWpsaPJx|S= za!TQC>ibnChxj-?toc{rer3w-gRyP`t2WKPa*bi~ZvP$Y->2xF-`jO>u4}TJ*w@ww z+lPJ{e_Afz%E*3}C&O&eCuWYwtoE#Mo~9(?1{-nTE^ry0(D6?DK} zw9;+WCZ6^87ER%NQSBOfO>J4Q{F<%f9Bz(16{Ku7VYPN?Ky;-N%FyDOQR$B(owTo1* zt2)_iSX%mp|M#ogeyjTyPAzz_)HZ0dZ1(xhm)7=Xv(52TZ>#RAt zebu~lt;>hr)_+Hwj^AJLE4@7VUZ=0p?MiJ`gL_{l)otP58_l}w=T{Sne)Z|sMH;dm z`>nWQ-JW=ejl=V#T!Kj5Tb=CCtaiB|sRwUNbB;$BSg52=w<*86Z|o6k(z61eYK zT*0(G7anq}@LiOA9@oNsY5L|32ag{N?tT95>SyVoLP0(e8G73@8){NdWils&nOx<;G79^US*{N`-@ z+gEY=Pj!~JPLzJjVCiF$XeY6pCCkpnJCUbP{5GRT;Q3iw=4DzO_uDG(c7IacN|}4R zbziFI-FUmw`4W>;xzxAWu~+mroVMP0X8JL^z*wE5_fM&AlXibr%DGgBcST6pCO505 z;#sj=;ZqI?JW9xzo$d1VG|#)AM{~dAKdJTci+7u|XH7fv#?Zd{;0aTCstp}3f1j!% zwBkv5;<uM&p)-2 z7wlKHTRUgNwf-whH8XTK%oo|VY5w$l|J+n7<&Ztk)7m<{JftVfUS+K|nDy#}y>HDk zYgM(wA|~F|GKCw0=e<$2dHHiU|J02-+vWx?o#j>55cFu0;Q57zSfgLWpOgnr%vDUKDCwS?3C}qUw-p#amX$xkYwJIvY1nDSO0=PGuC|iX(<__c=c(u z&9xvmBadyK$2UK?KL1RAMAOpBHBaX`^cTxNG5#I(y7E^1sZ0&W@?NW2)(pNfFRu-v zmnZFHe*F4q#*Peq4gJzbw`V_oJI|$3@OS#M?UGkmba=ki&WL*#@p@MOg6w6HX_+@q zX+Lis--!`u>{nwr%)c08|V@-N+1^7dounKxd#tDjk)w|dpQz-EEX!?^mV zf_aH;H-dY1NtM=ae8CiWEB)!qYZHz>Y@gz?yP;>D&4$~&4^!{hElufpU?$o>eW_fR z|EBK1{7K!D59Vg%_}sdE;a97-r0QWtXRZ}DAE*nRZkI~>6lPhUsJ;AH_ENQi^?kZ; zm`^Eg4|#MlIxF+aN`>;q{qw&(_vmN;@#fIAWjmgU-VzX6cl3+=tp<=AaHqB-iNSt4wa4e1(&A%ne$^ti17QgcT?pSp9$^X9sc@{{NwJ1_m6|7ED_u> z?VioY*RkgM&2v&KBZ_-gYJJqK{`m4s{=vwss8qF@xjQCJol<>!_gm#xvl9j9^DVy} zk$&=fM+L9C|J_MO4ql6wE8m_R-tW zS@uufubnjM_nt^D_I1x>{v>-|ee!vQe9qFE;HU=aD}s{e57|9+zvwY_m5bTUgJ&c2 zQ-5$>x-{+ZlIdZ~qh&tWrXQMl_W|FE!UM0~*>wUQ(^7+yfmJdxz4*vO^3dKQJZSsCkeeq${ z6~W0`jO;A`s^5QW3~oLc(fh5lI5;-!`XT86%c|8UA6)HSRvlQkhxOl)<)Z$}7wr!? zQR6F`-!$n+_R@7$wIVB>9D^?P9?|&EaA|d})PA=_o~^4EZfm=G^Py*8&?HOd%d)I4 z?Ce{9#d=LG-8DTdXp@7aUBAtz_pfS8AIivGIuUeu_3kOj)8d}hmTpmgTjH|meXnuc z4!=29%I!-P?>(@&G@EBf>y~xR`xdRu=(W3aXug3+CaZq-lKi-)v2lPru!t= zxn{=mm_#dbhG=qWys%Dg_B{Bc%ulCFqsxAo$>fS$!DN~5YgX{@^t`(K%VX!u6Z6~~ zIMt{6gdWzF2%WBTPK2*vSGIEdEk|yr8Cxd_--!u4oAl*g;Dya<9noRAI!ji16&Zc} zru(G!)}4eK34B*~&*pjeyv6CB#2F^xR`=9>i}P%)t8rfz`MKu= z@rNWURD2TM5?6BjMubp@Ok>d0Np@bF&P2?aqO@s36~iq@==FU?AGCNl)zYCoe%bK3#=5S7E;rGjt zZ>Kq&&i?j}rRHjUW|_I!Pp#+g3`M+Z-<-8ud&=Txwo?l09A0zFbaqLnsc&9r-FWNe z=k~zA(L^)lp`XTtc{87fEx9UHvO_Cu&rjQ~i;L2QroMZ2XzJyK&x2I5<|*$uZfk4k zz{B{gLBKHBW#1#u;OsbmAMIV+Id4zln)Wh4LNTS~iiS$yZtdMu)|OTU#Z6x-AD_nd zRV?^KiR?eiwc1-=tG>OxMAm87#25Yj??NZVSFG3(>nZv2Za-gbHt(Lty;GJR72Gko zHF<9Ar^u3Ujcu=&+V9+JWU0beT^Z&(xuaY4*qcBB_t?Ml+|SOMzaviTmVkq--)E=a zVV8HO2Yz$-dogmyCa=F$^&JX%E*=`^<5w+6ezw-x=k?d7t$N&8_J^Aq6jvI@#CO8AEn=H;mzGsc<8qXn5G3NEzE0a|M`3Mn zrctT4&98@>-0G}mr)Cs9PjFzLXPcK+@B%ST{lkUZBLf3kJze+Ff zN?!5j$n~iON8g=|yv7whZ^e_er5UBZizmvQZ>s0bs<3$YHf+i-JDKfa!H*YRak+dr z?6=d(s>XMb^o79ucFu8x)96y7i+R`V9&Re|xMy%L0 zadKJ9!nP!fsCHRqO=a6Zud{tMHKi{YG03ae=J{6!xmBgL7WpqSsx8%Qx&486Emwf! z$&bpr*2gO`)XmWoeW$FJ`dDTcf5AFY*UeK@y`ON(e9(INNuiegbaHFq;n~w<_UJnA zNIPz~%=_)8k8ghQR{p!@^`Bu@{GGCWqPIOiTm0sbYpVJ!9ABExY6Y`>r=r=a3T41YwguFbE~=6{^rbZt{BlVz#J>yP2vt}Io~<2Z4AiS}W=vUw92 zl9%RM+Fbo~U1UeJKCM0@k9ryWObhPT!$tRXv2EHX$o+3R_wr1C}oZN$o z&s^G`yzK;gmFPV8GEaGVFW2)DqFdMgZ94X6LGd%K6+2%ZQ(BO^wN*1_<6qmUTMeXn z9teqFVZI+F6x42R=3Z_SbnwQ`_T9m|ml>a0xXxkDK@G*cX~(Kq1Y%XQLWlMBj8y)qcL4ed5bV0cE)r>POPH zsU8T34dP%vzBW-vD$0E7FXi>CrtqfS72j+5d|vIzyfZJ61}nf5#+Acja?a zB@AM|OqI2?+jY24`L)m_(fjjCw@MpsDLP)TI-FHz{=tO-i<#SQdlh;~^jth#&8WVo zM085R>g8u6*txW1I#+nCdzMt(#9ffw=v^~6nn->%@^jlewMffxWSHK;PQ!Yiq6 z-kB8S$8bLCw(PmHEKG&3O)HiJ9_oG3DXOm7cf-z_{r=j8ZO0F!uKDpTQ{Livl+?t% z2PXIZdmpO7>hNpt*42S7q0Bv-U-TWdl#@JvcWGddtf!azmE%f$m4CkU8kK7&GHo|{ znR#G>gV(N4D}H-qHy)LAs%Ck6>`hN!Lh@}daY4L$vF+Evqjcyd(FGwxl`6I>PI)pwk|Tr2$6 z+&vvZ4Nq8eHwx;>N>BPUZORUrKux*63yktr(~h}pc%@?I)Oj*cOWxMpBSF!q#=0`WbkmIwHp0bwt?^!UFDRfSe?Uk+5Wio3Q7M?wqGKulP z*V1LFca)~;e$`nxfywZZyUm|RbCk}$z2OyAl2H6*_tET4+6RToFMO13uNGaax4LTQ z6RD!Er3&mWn}jwnO+L-g7bmwWtyfiB)1_bn!=bj!gIl##r)X5gTyHH|t>ONld)mc| zYtO8-59bcFyd&aZZ>wKw=@>C-k7e&k?w3AUL48MeORDk~aoj%}x7l0ybpKA}4P4sK z&&Is^&=TJ)8722<*R;;?B{Ck2oBWD+Ew(J^UCX-bbM8B437M16&&`aQaXR^OVyflS z>uYs;EmY=g3%T`a5y!Kxmk|#?2rSZF#iaM|wW1JDt9qu>+^9*7k9+=}s!rXsecDX< z5I-ZX>E~w7ns6#?dSuX~5PrXpcQT{>-uh=OS*?(&e&k0;wMU<;>y%R}E3dN6{GlLZ z?0wU@TI6DJ)y6&ZnSBM{Wfl6W>Wb}lJ|TGdwwL6bsYVYHH;J_7xV?)Mxi!5p%eJ4l zWy+FM9@!E-P<6>c z#?iTT($p2jr*?*2lfSie>&@=~spWU$R65FT39e@8^GEY`a^-i4lV*RCa{PsOzDPERb(YJ%vRi3Z^BD!MzPOYFz z`<8^{cGt|Z6MT4SI-~d6Ye8o;p;|nj7^yX5}JVd6z#Slbm1j zu4J4lbIs4tziCTG?b5bOT(j&{%;wdbszh@YTI3#VC~j(b{4VSX%QUZQ)1~KUZC#s@ zkyI?*8+q#6?ixtlvhG~)<(XY;y>neLL za_>LGm206pgg-bqyvWwtbhaRq?|9S+-oH5D zE#9y7-!-M_<@3IMyK=oZt+=#tYjnt#g|a`{_9#Z*aV*T#^7oIesC9Bq(GZ#PRr~p@ z57Q1UNnN<1w%%^*oTVZ%QDN1!i{|VIDVx_cSzLHeQy9b7YuClLGKeg2s(Q3_*Az|b zjq?*k4FMAtEM2R|_rWqOF*PGRSrpbgnc8injHm|dm2zX7KGx_er z0H3UWRxgDnBX;M9k?9X*&uMP#Z<*YDC49nybqUG0ojwINS-+C>w5pMgb?#f4vN9`| zCAsSNYpzp44B?6ws$O$X+^wjdp`gwZAXL_{lY8W=rFlr%roT zY+1^?Ig&Bf=z*xLm{((Vfa0>7QPL%;$>CYDmD^3wR@=f^Wif=Ou ziscr2K8e#!(41)5^0zNWG~A?h>w^!;b0)-k1>c<v{H4Bv<=S#n zz4@G+bx$QeJqucOVQ%8mLtfFl&A2LSl!JHHOqwiXZT@ZLRNXAEofGVrdtKaG-Bq?k zrRdqZ%CDERww{~AZM*a)=fT@knu?=hukVU33dplvR6HrDM{4n$@QHnL?x{kIkv5m_ zMll4RI-U1Nzs=Z}`}(c`QN^2ntW!QoXDVC0_ffvUU0=PY(c>I%+Eei-bJt8>E4#Qe z!tYG!t!)2UTP~HeOr9?sIQdAe-3c{g{kQQq`I5HoJ@VV)OR(hCYS-uzJI`AutxjE< z?^5)FeO;@;rl!y5L~{N74YJfKdh;|+t$i=^JzZw?p&fJc63XnJ?L1Q|^D|V;W4($K zpUX;}bJ=d&Y4J3UUFdp)V4B9=Rmwy7Gbw$&S>E}!@=%C~5d{j8X&8cQMtr+j@q>&iOiv#Qxy=US!~ zsm8LO58NlOvSOQ0v&-ZO^8@ZWI0bM71=%`WQMGa2{jD>g;lu&uY1&a+uf9DxwJn-m z_PEWe^?F7kWuN>SI6Q-z3g52J%(3iUdBWE4{M_*65wFyzPn$I5`NXGpqiwHUyZo1< z=R^SWLq!%w*Gcj!Lch1((p}nW_3MI&CCl^qC&ThDyr~Mke>%Ip-1zL4-IX7o*dCo@ z_fph7x*~gBsqn$?xS7yBP2a}}SmE`Dlr|M_y!0;lGlhra#Asn6LT zGyGc3`D$^su->9o=Pt~dvQGPCxKk7Ve}9=WUO%_5HQ7|rnk?3NeXhB(if*UQT1U?kzO1{w$L%D)UC&>Y z7V%tYN8;WfOWWx?=Uq)yW|#0y)n{73_W1ntHJATwczA5h#o$o6$IM%D-Cr3=NzaO^ zaa{3f=9EoLQY`W=EE9Lzm+gGK;;7zPE$;(s*Ij1yQ((Ls&3NL;WRFQ_K7SQ8TVPe? z7}{`U*>_duLfP9LzgIFpU#&AC&g+eM(;^4yjrSvMjw@LP7ZiEd-?jSc_vD|{m)n;d z52tROe0Q&X+t$bhk54OSi~aff#$v&xS$<5R*G>AjS1+2>GXLk5#?RNAw(k?qy76`T z<^EZ#-yf`$j(94YyYTE%M~`sj3*}*J@9dO|R0*=X>6b8l28&E_4ddnOaaVSBdT@Aa zF(h9o)v~YZ5A55moU@O$D>~J>d*4Kx1ENp2Y94K2;&1%0b}~ol2_eU!>>`m$`Hm^8?knArb_XX>Xj2LRn}@nuhE!% z@5lP=GKZ+H*aUUkOTj<1KkWV2 zKF`c`zpAM9vt#w&IHPqulQ->|v~;D-&IGArL7oSHzOuM|dHc826ED@*z2uZP(|DW5 zE2EgB8MnMq;^R3jx%KkX+&8N~m^fWv&9>!cBA-qk)8+_>>I&H3R5)Kg*4_JZW1!yF z^X!Uut{vHLV&Ok$i}0LM_W4Icex30?X>{z?BIlbEYE^5#?&V)%;!s+>$1re{9@oEj z{2Qdc{`|Xfr~eZ9p1-HIlvXT#vg*i5r_|P!jLOWfcZP*LDP6zm{#5mSi;_|{m@7pI zPyJ)`x!S%r(s|O!doy)c{C16e_0j#rH<`||kNvAsEuMFMy{%s4U|W-=vOJG{@nPAj z@|vm7x6fd-tGaOfrsaQzH&@o?=}(H|6lV4G^59ZmXUP{j?H-rST#w^rS#t98=IF#o z9(;FyLj8+tES>u%UDfT2`6*hb@q4R%boY~LBelf0t0fARA1~GQYFK=^%&wcc|cb$N>~leuHZ1Lb;m!?2x-?wsU)+v8pqg`eDi#+G`>uD z@YVKeT>CSX+MuVhmM=s+E!QWX=i+<4TJyby=kYUH;wzGrU#{42u_)!KXR(DWIeyu|u z6_-8Pa?|3}CZo*zcV8@Awru9ake9C-Ub!otR(~XVR_|8cn&n#x?lH2@dy)P8qukVO zcC+`K%1t$R&mDhlesNr}^6fKHdu+40AG9x;vcui`_?2y;!iwQ+)~+(zubOW@e(0CE z_g17C{i@`jHfK@RU9D|Gr?#rFYE0FP ztl;T;kUd%Y;kJzvHgxPt4}Q<`MCr(*oxk}sqiw_=1+U~xZ~t}i?!9SGBIG4)pHHg4 z8|D6$O|Rqc-p#8QW%KHM+VJ)tx1&v)ysw4jx)O!1+w*=WZ0f!7?1hE$zMV1!{vBCC z+Y8=D?bs@K`i^UlJoCJgr`9J=cYla--c%8KMC^8u(}ksxCmiK>t*-mszp1WsuFG@5 zlIYy!|3q(1*-}46dY{*a^MWPnc|zAVZC#OWJ?)uY){`p*?wxv;JJ-p*+IzNk>K^6t zV~cog+&*PL`g?wJbdBycx%q$JTsUf9cjU~!rr%am=V^ZU&#*CiT~>F6p7sRih6(Pq z)!E%P=B3d;yy>@8Ja)z=7#<+g59|_C7=3X-p zx}9v@JZE#vrhYX!{f7)6)_uNGrRI|0zxtt6ZTpkL^a^`$3EeD?&cKyR;5VP z{q>LZZ;S3bx;veE^q+ydIz;5v4R6h7OYZ`0rCY%vi$Cv;w^)AJx2&q(Cq(5Z$H%$fzW?sd?ptIl z@b=Cm_kIOUmGeq*`tET@k8NC{&#v}t4->oBlKlb6FBjQ08U0haDi;)E7^r4^>C%?I zO2^|-m!3~)=Z!4ip5sx>c`L|W$-mY`;*-XsjbCEK(|`NEzzKRdCG#x4F>G%CR#oz5-pVh*~l3)+3aX5*_TSta`wxYv|Su{^@INp7o?YbG$14RQ5)gf|>EBYsFtr#ftuN>8rP?O}@wzImN6;Xmewny}29T z<98lf#rq4_P5$M!MX^44`(L-R&xdBF+U%+0{CPGne4;q-B=gk~v8S`1v`jc)uXZl9 z`|J6ZOkS-TnN9B{H>_Q;eX0B5`C1qLGf2iWsES?NKCfkRV{FKJrE?-C>-|HrcvR9g zqvIz0J)7~%ufk<}+18>f-hs9}%i7%gy$;3g*Is2(CGnwX_nf3TPUTTiVYcpbRc(TI zSWFVm4G4UFdTyCWymFloocxPP1ja+RA@Xs&9|06`{d_V%|j6nzi!U_ z;j(3E@>5HbwvPwq32u5MtnD5h5n#)bg2C0`*_2q>YblI@6Xrdox0i+-dQ}4 z<6Coe^{MVohxh8!&&N9m9`qB_@(McE+_&xHX@L{(KAyEQKh!7dCO`K_I_tqZOOG+j z+q%EInR?2l*2I6#xvaf`J!)Pdp2rvMnZMIvU$#=iX5Djp3l^U~JYoHkoPuvBWi6W* zn0#^hJNaU?3V)t)^u(nPwk)_^xK{GL`z)3P{DHTx|NScTHD*6++)Q~h(ZXx%EhbD~ zqHS~T+V#s%7HV93XSKAy#35YqtGMBJ?N?m71p-r41J?e&WZ3q|{6uwuHed8C?~bU5 zo(X(z&n7YaG!FTD-uz%rh4N*)M6LVly^5rF%HC<@+4)2J{@#5mR*Xru4=-7LE4)_q z<=y(_GrH!u6}hDJyi?_!P?vS(*Zk7d0;g-I+-zl3`tOF=hn)Z5b!?Bk$;^k}#pZbw z&Q@DkFt0)|{QJv@hvHIctCLK&epp#^{)*WA{qdg3X8##-+PRj=#me4Vz`ts{y;YFt z%Uu(Uo2TafZd&=fE&R05u}PbsGsiGJ&OT!LKI-kwvgvpejvUj2jJ?p~{q%yDC&8i{%QR>y! zxGj?zuZ5RzX`T%55?j1`Pl{a4%PFxsK~o;-9`q4S*W-Au_0v^sv+|pLx<=lU=Ps(0 zHQK6a^mR=NYw?{Kr^3&7)%HH|%~hFhy0~T9Z+|DTGyHrN&%>8U1mCgz{%A$#Z-H}< zzh`G{`NA$X>DjuSR%`wkoVYn(ZmM?R#HrsN1?pFdzdRN;WqnXgSoKEr|Rvi${J>ZEjhyW_jU<<2s>x z-`rPS+{M3XefN{ihuiM6J*?ibXWf%+eH9ZQ=7O1qevmy|Dc=_!7F{>j2}6H!*B!>XBgIJv@?e$Un~s#l#N^dVIF{>lg~A&S}>PicwXbb|j6!`E4b$4pLpI#oV= z^ZDniMA5Yxhl2j>6rUz{+#s@0F=pd+o7K1bGR=Z-bCwJ78!@kw`LlCn(23uvVK=@x z-+OSMfAKbvdp)VC2U`=;A1{0IVYTzo8pHQyN|P!lg*Nwd&G3+lS(xp5?%fT$NnI%# ziRzDznstV?_1y^63ywHf?Rw&*^6`20yuPQOw2Rs`*|j}f;?gF#a3PPnY9zP9pD*i7 z_j?%i9Jstjd9wwlx2L4NYNb=iBd>|emmkmQX%$)VPVVB5OquSrD;Gt_NKbP(CM@&m z>t|Cw-!CV=U3%DetR&-&hSB8-U6l=|g3mt|P5!ADBldm@UtgkU(Dt1+Q`fWnXUJYE zzc=Jmz5r9`SNABdMuuJI@2)mKY3kuVC9OOAZbtsQqDKKODZ0*gPF6mtu?*%>c{W?; zKY0FU zcor^s?22b*n_SU@7S$_D-g*CBZ&UHu^j+0|hFgy=_H{3FkKObte8P%qolVLX>o3Ij zE$^#sDUw?^W#T@uX!(Ml_oiOEP~+!VM&2;Ln zs<0I=Tq-7Q;`4v*eEu45=&Mv09qk9Ln-53u@jEw{`M#8h`!Kmbf%E6<`_Iyjy?1Yk ziaqkf!sFn_gBe#l=7#G!Pswyyk|OG+KL7ZoNq0@N?z$aM*>R}wWm)eE#*bX*Uq!!| zpR1R#?wyt1nM*vCdvq_I)lg>jsE@BdtRa2?+ZmJK3nWpitqPjK+^#qYAOntnUq@Q`QhtrLrP^l*3|IR545 z%IfJE9;wGq=f2ZCmV8`!%QvoF=WeOKTs?8>Kam%`vmX>(y0>@nv=_Mz{->i7KCHVC z^H%1e=;Uwe8{F@#G+p*$#@nUK-hQ5!>s;hDo7wJEZQf^AQci&Z8%1ioIRC~SDSh88WeU{Ih8e!R%iQl#A(mizBu8Vm* zzgo+$_p3WjPv6v1cG5ftcDWvxwU*x|y04nvbn)`CpOVLBUd%I_vbgP5An$sG^_%)U zK0duR`{LnTo-4f{bY>Mw_k~P7mh$+KO4pR?ZT~*b)cf?R_PoT;R*j^flr<}bVxG-m zeAZAEXLB_8)h46&{vtc1?2U7!m{XiC@19m5G{bO%omZf6o0Y8p_8i|;NB%4_|0Qn&RNU^9^6+*Hu#vUf8(U$m>VtGNNSUltcLlen*CalxOP`fKaS6Sd(INT7>+_56>7x49$u~PL+WSQ%Y`^7sAu3n$ z`QJ`S=VwRNI?hdu3gPEp%j!H$Ff%dcpP}D%d5hYqt74|fWUBO@-FdVBaNvua=nL=u zGnfW9rmvjF8v1-nm6}D;QFou0KUV}yUh;6uRDDIxE!($kKk)EgALpHtB?|lp&o12O zwB1m%p~YZ^T*Jp5OuSY`Pf{D2c_sXv)c-T=TeJC;_oUhxyyproyKh;tCR$f_Y0RrOlo=`7*;+=KYV#k|(2h_YLO}N#;=qV}rwQJwct;sjzJa#=g(yC+dbQP1> znkh>SFHSOiE%ID6XT!CxHy=#ZexNu_@IQmM((JTTTX&a5sh{fEs!*kT$@4!$<x_F%T0Nm>>2N}d~>$MPu9HN1-YF$Z8v+S>R+;6 ztUTe{qwVHa0@6JRYXmsf55^LlZ7y7F7miexcUb+71K znTJka^tyantKrrLJ4ZjBmtV|z7Fn%bw|nACJr0JNSj~+m#aY(YW!!qQearIjk~#W9(@0s>k-I!y)9%VkL(U>H}{hsDhF%cYfpK;z>?L3uP*9Z@a*218g4(O zrRH5=JhtVJe&iuO{?*JTPp*EvbR$zxz^mietl%w;_j{hroH^yUHb=kglqoCTsjkcV zH|Jke+{#HFT;-db>UJ!ZurJ#fxmnfiG@sg#;a<1U^cRQjdO{&uT zqVoLqtb4ug$zP(3->y9PYUSC9-!mnj<}bJ+^dM~UO1<>#;NJoF9DnVaR(QuV@N8w; z`@+6Y3oR?|yky8bw84N~r*EIgQmb8O1?Qf9Wi9P!Cv@>;bwQTm%F?pl=(j6g-FDEj z)Ky9nYO1aIq@DI;>g7!<9fd0Y9=OeXFWRIcbTbR!u8yu*&DeSJ-uI@IDSm?c&N*sJs+ynmQGh)JKKr--4cb0s*HeD z%hacsGYLIP`Il*yGJ(N9G~PbmEAIJJc1E$oJ#yMN+1x~A?m2u54=TDD?PH$2@nqQR z$wmQ>PnBM<(%CV0e$o6l*E>&opM0}BX1=r5?eAJsr$4nm5EdU4bA62tUuSOXN_$g{ z%|9b5ZCnb|;swM``d|CGXg_Oem+{@pde_u%TLqo3-53?0TQ1^heAClAcYE*dkJn8( zul(x$x!!K)ifIe{K1o(8CeQavT6ObZl%3zo;v`d}$7t?p!EzlNvIjyF|(Dc)C{bK39jW5i?yf!~rR4YGgiT>R!b!{8ZT#f3g z?%aNB(Ylo7oxyWwF}`z7SQ*oPkYU!d#ZQ+XlzsI%O|Q>PbZ(zXSy$i3{L{>>vtGAO zf6LBw-$?7-$FRfv-!gBAObD5@uJYjfRWCpI*BhjG1^l#flAo?VY0o#wvWF|zWynq_ zRC&2_6~n|k)rz05hzImuy{q zOEQ-;iiy$Bz+mDlSv#u&@gHv&vL3kI_juB@n+GjkpW1tL$zASQ7ICGLLDoCv!eltN z?cMp-wb=@cFb9Tg}6-_4@a{{P|teY@4^9N1u~a6uVDF zxXhPLN8Zci+>%^q|D=4$>hE)O{iolL+C6bcF7uNWM~<$%b~k92UTXD*twl2Z_VaeS zzx;lgBW2UMmR(|-o4oJ-XAoFYRI^)`Z|Z-B-&=R8Dl|2v2#J0UpFdlyvfx39TSfTf zwQD{+_L^`@%|W&ye90E&O1Xo<(X)RQ87J}1J0b7jp>o3Qkbk{%jC;l}1;Mrbn%8#3 ztETYe>QAuUt9|ACBK6w0p1p^bh^%;isbIz9Cu<8cH?6pLY0}BAIKN$m-(ozy#W+sL zM^D@S$9H#G6ie!ri>^&oxMpb*xyk-fWZI#{VP(%|UkSgR<0$#%aGzzXra@=i{h4auO55;qOnlpkT=hVQ;HL|Ci+cXpJwYc>&~Y~kG`~M zC_6awt-r{!w7TkhSik3rz*`ggYP?V0>N8m`7p&oQ^7V_IufAT6Jtf>~H$}Cq<*nQI z$xXGT$4-B`^4PiSP>Jte?)-}ioA%6~^7(aC)Th&rr)Mk|U%0l*KV+&?Aj6-nXa1T8 ztLKVU&54t|^)1`=?v_bciq3^_uX1S!n)3ZY{jPb-^o%{c7VdZ#{Nc(XPkYmXLpEFg zEV_1qH{-Q)Ci|*{6-;(f*S|df>7^lJyj++0CP(9+tXIEe-Rvfwx4H16`T`i`->vTB2CVb`CHf0l0w+O0ZQj>XaPpQ%#()cPr} zyP~cNU2EA_}>$d$aoPeACI@F!J;u;mX9 zR3_@!?_7L_Ve^UKg)v&sr^-(aJ9O)+B(L0(Lr*_)x!j*JeX69ExA3ARnywB%XS@uX zzU*|zd}_m* z)pyev!vDUQH(yqvzVBX0HaF*0KC`Vtb<0i}My~fcw@2vnK|Q~}v3;+_jC@kuo%*X+ zcibvG+o)(*PwV?-3JzhW6YT^x#tDhwOJ2KfOuI~94+drO~CPDAK^|RNVVfk$^l}qndQefu3Q#K~76JO4F74VH`4u9r4 z{^G8AL0q1i*NYBno%j;{N2Doi&!^TYYu{)8ZirO2h+ydNp0MWrlJuHIAFm#q@01)Z z*L8}cKUZHRVQsWfkWHoBt8agfi*Dsx+jePU@7evk=Wi%pKezi@O|6!v)vrek3cvKz z_9{nxd@*TBq0l42hqucAOig`R)qddDoQz*0Uyr$car1r^)%mso%Y1p=))2Gxn+*eX?69@6&sWIc3Y!v)0FLPdRYN zt$8;4dHn2>m4b&a3HPoF_Kf&x_N37sm&dM!W4;Ia@ zEjRA}{j}y^)wR9WE9OQ9&uXi@ePYtDtJfcY4O#Db^6A8{n)05vT=(qUdDfpZ(L#N5 zp~cVZaeDj_5vkeV6PLFB(VZNfKmV84&kbu;OT)~wI9n>jLmS^LcxgS0?b^CaQ$%d_ zSFaY$znv=Tve(6b;k=)T$GKcQ10CE9mcQra`4hX`%WLKVqsf*ZY^+oH;_h4(U+xw3q;;kD;uqDE zN)Bs#U#flY6KT(V?oslSyQikCj>z1dz!kFBRFZjx(arx12@~Tj&vkh<{Q2_Yc=xKc z-WPMGPWgH2P>uPD=g${^S)RIY#V>>Z48kS5IsHn@W;s<(V7Mai;U*L;L<#Wp~+V>MJhEw$->OGs)(m9{)tQ9W(cevL;$jS$tmR zYFymKX&)GarW9VDuNeAw`6s6<_tVSgDQB27B-sm=R0&KxYr9(W_m^w`wq00tB3!^^ zow+FAxyQ2X>(?HPakw{On{v^$n{l$o!`paoa)u&P<7)3`YyHOr~yJ5H#&r=yeUIJ^CKE z3tKl$;SW%MAF|%BQ2X8DZ7PN58}#1aJ#vG)bYJ_O2aZ2ojZZyZ&T>0t)3FUr{~0oj z#7+vH-~3?K6X7LmUok4IV7$EG_tm9QVba-$6Oykm{JxrhTmHoNNiSY|+6Bx}OueFH z`*qTU31TrbmOj2d<vW5(XGPs>`POyZZb3pqjnk%* zE39iZz0(V1Pd)9byZcl9etNji$q%1Amg@6XWvPC z1?^QiGIPuCa*=oTlIxzeUN>&^YK#`kny_DUX? z4k|EM^5jc^esR-v4TzWK>?}jzjluJ5Ijs8DX>g^+KCDy1$mn zlwR^bH(Bz;%9scHPQ`twU;C->#r!z!^T!KLZ=IFD<6^$=zhmX!+IQRE*KT{H7h-od z_jZc#28QI@yG>R+eiLJQXER&!4*R6~pHn|8_t!X0KKxww8n3>Rvw38W`2C5Bht?h3 zcsi-T?Qz`mwFjR}QA%H2vLtrnvwIgB`VDrgdOx$bHkssqbXK(BUB`B=HQ%qMs)(xU zGO_nZJzQ?F`pDK5R(mr|9ZF6p|6LdQaG&}|jUD3eFFl$w?FN)mtZpP|uU@~0=^jLRdkGg(t!yC>&Pp!79JOxUg~<|F_(3E zIbZso^0bxmp3@UwPnmXQr}e$4^xYdeyTdG16n)L+e0hC0ZgXVG!WBzQudC$}HVJm66ZOE5v<~NVH8SW9+f*_e$9IT;A9+*E8{o*|s?W z?wMxVZ^*FMYN?$o_Mt(&8OpLpL4aXWhXr3k~|pIfBJ6M$tvyRr%jK)GCa+D(RxW%to-dY zr>+(rj6bZD?Zr^l@Acu`{)dMx6RXa8=gM=a1=p-@^WFT~>++U9XNe#C7p~9TdgOq6 z64%bJ43j^7S^e+qPAUDs?3TWV$=!P-yUMD6=)8T;ztsKutlP?cGFmRBi|!v;(V8WH z_xgoDp@(^IOW*S1+W25<(c(KNo``B|9)HuhTHh^J>HHPdtFrU@%w9|>%iVrVIwqy@ zK;#2i4zAHJc&VF5}JR?ncfqeh5*-w84e#qU)=)EH@r6O0`!Cr8k zm+vyA6Izmow*699wv*K^%KbQHPnma^0lSfhyr}Yv3#oEjZ(g16ThDfJi)G#(ohMJG zbFR<+wEH1*rjx{`yVoYp^DJn-emiF6yAsg{E0S#)HPwIBaoxD1@pifH6ZIQzcHdV& ze|l}rUUBIc`>*Y?YJ2#!`j94r$-S9-J;ToV>{Rshu(Mny`ZGB)x?Jbw@+$|P*y_xw z_AUPP$YhyVKtq8Yr{uwJrFM6&Nq4lfd3gE9B(Fao{M$rtX3N$!FQ(UQ)%9_AQhcGw z*HoSt$gF%z`@p9=g7e-c6@2`At~l(uk>!u{T|0kvS7+bh)`)6UmM?z3KD$wNs>&kk zm}8YoiqAs^FgMijSygAdznHN|d7b~Fr~cEv zEp&K#SeoN_(e9{QH9Ja=l^uC_Y`&L!{Z-yz?OdDg+}0)s$@k}fZ~Sz9!W6rT_-kYljDhh&jr1H7JD3@#x6Z+!nC7HRlXc? z;H!1twQxeo+hZ@TEPuOg=43(MMPH^G9gK>~VJg>XGGJhte1~z#tG;^=0&Xxf&tQ43 zJn`w>(7Mhp{bE<;_1m}F1)3M1df%V-OLM2Aqpgrc&huyMy+7^!)EVIsde6{7p<#t@ z?Za`EF=bAnv&-RZrbobPb_^r;yUxr>ZjS(q$^ zXWfwM;n2*G`C{?$<&WB?g;jnkXX17hzA3j0ycf_X`!=hfukw)cHuke|{ZrznOl09r z`^7xh%%m$jk+-2NCqjAAwl5#Q%GGK{DVuG(w1zc#p?Xo{*YZcZ5?@BF=wCazcGi=^ z=2Kz?ch%$W2o#=m&Z^VfGFQgy@$Ie~y|pDz&zI-SKkS#wvS8ZfCJ*a|Ag7Mkr){hE z-}Q_8uCH4;dEaAi&z(Gn?Q%AxG))m$cI>^+gx56<=a*SN2;1>jp1D@y=~vPIpPP(I zugjh~87{Ei;#k?w0|)H|7oH71_R>>p@_M~{3|e7!e?8Tlr{-3kxSX(C$k~gta3!zU zwK<=qCoJ+%N$9KPSnp%DVXCT^*M}ObnyLA>zP#QsQMUM`?CX<)KKJzXFBQkfT(Ds| zlm2|YR(_|jk<7Jlqw14W*46JcHPW3rai=BoLY7be=By0PS!`X)F6O?7Ygb@Z+Poi~ z_R-pJ8oTB8S6Yj&TBlc@d`|rP*(xdX=+!*E!3ANpx@|!l=TE;HCal9W_wEF*<2p-g z?Y`=COH4bd$r<=eWD(orhtckrOJ3Fs*=?#(}Cv?5l)}|$>MhCs(3R(Pesg~q<1p}*jdyDVBTI#jMXWOo&zAZaWd3ZHc z?mM$oWrFqh;^TVn+^rOuzU5rpg8SdfPX_S`+>K$?zM`+IyoY)Iylv(O`!3o} zT0iO1)?({P96vUPE$TYJ^6q(m>%8>ae|htQBqg*wBM)-kDss2lQ)@5YF)ixm-A$|h z9J$T=2^%PvkvTs}#Rq>f8_}AR=nz-63&%!<5F;Du3@!T5}`I zY0AFSui7VAzW>j#X>KT&vq$R5fH}GR=C@eZuFKAq(9$^grQr*^O%aF8_pte{?SGb= ze4TV;iptMapZg43X3gdI>+}0} zhb8N(Ol4(hu&P>p`R1vR=~J4jrapD}lN!3DWP;zfh3|JNG4yd3yq64}V$pcjG1b0o zy6M4tvL+3_Q@On=8+SaP>T@Geac!RrQxU`3-Aw)q7}cj{ZJBZXhsUo@f%RvmJMY?X zeMjK8ubw$_`y_3@?zPdqC?L@LE$z~z^-X(ZezhMxwJdjoq~DSCndd%Fs!ZyhpVHCj zyyR^i^(gJM&GI*heR>Jv<~geS_{& zbH3|>(stW7xP^ZD5q2f>wRWOs-i=dXZda#nnZ&LpQ!6VcoX&i6+cT&#Rek>HSyvDJ zXE@Yx@1Glg^{m=0d3hHO1U?IGsH_Ozn6NcfTj1u6>L!Nec4zWV@BXl{iK|n-df|X*&cjMR{k&@zrtp+xN|R zGF4?M?{U?P^ESUM*LWmu-k5dRPvn=gB+FGf4W)|dX69NtWfR)X80M{FWVRRM&8m|M zS$A^_%Qn9v2I<?W)4lesHjKMu4h^txys!%?l_S-4k!&#+9}NQ�S+Z?y>AXuWS^cud zCarB``669l_TqUT;>t#5VTGZb;2Dvp~v;hOka&H#p`5hst^#a3Op z^k&(!yNYWZQneT}4$8BLrtoJjd{HR#MW8R?Nt0#z)1|eGn67P@z-ZHE*x$8PS5>)E zVQDSH>wrt*%FeyY)^~qs`k76fKWQSHRAKC@fF+NQ?+KomtDW<$!>;p?<9j*Nr*Bjz z1(>VaG}vB^a$EWF#I1k{o*EMGo@8o2-18|&@QrVN(3FtSIZVZU4?XYw+H_cfxi95v z%0#~WgNu1YCUMRA#uM%*hasJ)@5_09(6N_mNH5&mF!;=z-! z_T361%LVusS?|2mx@6C*pKrn{SIevppDpk%rbO)H3AtYpH~#tSw4JV=)Urg*Ss|!& z$L&l_4zB0d7oOFO_GM*BF0}b4ZlE1>)6r{k6PJkbsa01+x7}B3T6;T0uqTXzC0S;V z_NBIak!zUyO5I|PSu!@BezsnV(?N@a{aDL-mF76{+rkY6{5rFmJw9a^n+r{7GN{o$ zb%klS@9zHcZF^hxEnT^R@%GmvCF|p|Hr>3lXWmwks6ECJm451%jfGr0?`(B>}w^CM;+Sv{gPML-A@T`ExgJV zs?KIc>MnFx^Yw)3mN2ot3nGFizF&*kB>b$OyYR>arsC62SiAgdWPLo47=zw-Qc=d*bpw=BD6 zIo}ah^itgKF>%hk()Z`0**SBbl&*cdMVdjd>%wd2E&geHglw#?Y}Cw)k?WZwymgVb zbD!?H<1)-(K4(eIKSu7q3%cd@=Fd)ZF7%mrFAJ93tgpI&HOP+IOp3+MQeQDPqd+IY#+s zml^JzUJwv<^7!%C_$Lp}G#-0v^7?j&*ptI^7f*lAX|uZDX2QJOxBP{k!Apc(D$AM7R4gX--kB45f=iuIU0qJ}i$w9GK2=WBi$B-xzq~d0 z+PQ-6`l{^K>*D8=r|sEv_{y|+_1~gr{l1B7^te1y3d>&jj%u3j1ZclMhNTdN!y()9!<&5B(4iJTfU)+WbX!$m~-)`lz6JW$aGPV=|TP5{Wt+wl#Rx zRHgc9YC0Y`R0yG|G73+2p8{c^0I zOVD|8>aJ~wmud7H71P4a`M`(0mZyKUWkWUoV7@iCd%r8hN=Bqs!H7nrkz zp;qk93+u*{cTZlrd3>+#`^_KH*8x6rYr(TN)Oai!`5@-+o%QdX?&t z+W5uqw{^SCzc_98#H3qW?akhnMH(%!-se@@GI}N&&O>+a@+B{jiL_yxuQg(X&d7CTiejWD9Fg#o!*IX91J!Z>Fz1HPtg=OAo z*)QT*J^RL&8twCarVoBqzBW5GC%Q)P;0vLp+a~eb2zo_oI&GM=rS)-*I$+ zzOPfsuoQZG^5N5MPtJtgzNBthpv*mU$Ge-Yt2uA?lza>3k}u5Ubnv@iDCedwK;G0C|{83k2=wxaBb!EWx3n_Gn6dbag%Gpp&-6zR~xsNxs_Mc=9<3zr})Bq zId9^J`|&Qjm##LM>bc!#Yul9#OIIGvjVNg8%eSzcml(IIU{m3A*OzazwOqR$tLH9V z>R@*LW`0)6p2>4h2XGxwpJn!)dDhp(Hk_^|D}J2(_u%`*IqB$8-yPF$25E56|1iJzv49d%DamNuEMdFtH23_{9V>L1l_xCGdSuUM($;$=s=V#m?%$KQDyQjmikq0V z7|Sd@qN#CXYrdkMhDwoTpvs&_vn&>_dsDUR_yV14*Hpgk$~*H!d(!<(#Z7xBxLxZC z*|g+eSut0Dhvf+dsp~2qoM$Xe_FsPe>8#)>S9Jd~T>j6Xa_aq|buy8q&t`1fTd>=5 z`PUkA`R=bJir4xVEIZYoekSqR=acp^28O<~s+-G>nU<~1j@EiAcW`M$=~LY%sUi>N zDzi099b{B^_;$DVx>rm-VqLZ-tX-;f=b00i%L2KAFU|JO^qI2A{(xqn3e%;NC*)^Rl&KH#e>e{>`qxevQc#9Ysw>-iImciw^N0WWOl0F<|-9Y0oZsmV`d~ zniF>?F~4-B*{|pOe{yd*&a&p*%WkuUJ8qiVzVcfToNsn@uCK0uL;=&y;v!omA+Jpn zxH>eMl}oj@6d3z#KB|3h%6^|YtCPj@%NAN3y3o$-=8#j?(qzD%!TA1ot--Ay>lePe zrFL-H*2__CCcWl26}R3LVV|?X+VJKI%}fo}ZI_JC&r~U0FXi4N6?A;PDc{<-nX}n0 zTU~g%>8_B#TiF19g?5>H&lNlho|g%gsZ33uyL7U*)Hg6Zq5OraagZjQX7S%^$4VSN#n(TfjDQ?c?>*Y<0_nn&UbFJ?Q!%~*joPoScBhDEa z-Vcu~IC<1JJatoM>8u-74{DGwa= ziX@~Pj%(fex9?(47O&L3xts4?%({G?<2rZC&sW})(=@pyJ)B~c^V4FiH@~b>NKV=) zbzQ3I{u{~3aBC41&}Zi0=vmRQX~M(}Hiw$pxVAlE_Aq6ex+Qy^`MFEq zA};5y*|2H#W@!Xma8v%)E3~h+r(_a^|a7C zH|?fhFIv}e-d|5M*g|af6@#5AWl#Nf{`vUtNZb2E(M~3JKfTP{oaOEO&F#ASmR(D2 zr)-n*jJnplL-``hcfrQfm(D8g%Uma$>1(>=U3uC1&1$bKa@QQ|`RyUS=We^mM=d|0 zOWw096DulhKA)Od%C`DK+x_zP{#?@gNI*`<(i_W zo?H92wy#*bOX*^Ew<%xdY~zn?icWc^Sqow~Dl6LNxqJAKKshiJ^;H@Gz zF2DTxGnK#0KWp2cipS?qD(}zyCzENdH+6P>+IO|wf48nIJ=*m+W$MbdkjIVQoSa@> z9mkDdHr~-LTlnzbjLomDL)XqUFJEwH!Ou?ur&WJ)`4w(dWZ;>XZlMrTAM5c*<;Tbo(MZvBS-m*Qur+)wBv(EAXMJM_F>&?X2+ge_Dfgl%{5T-rFj<`QDmK zYd*;CSSh@8!>c<^0n0TL$uG+{(b$a*S<_fBkcP-o4FXtukqhZBs zsq;=wo3d7m?z+1wY_5C$q{Ew+vB^}deX@3os)k(I}zvk=iP>KmSWG>v#zV<7-lLr`!B!#tf+GGO2^aXgh} z#}rLR<)YA@c@Lw0EHCOWxz=_(+uMn4YVWhNs+&Y6{hkqg>cp#pfc~({p1-}BPsYrZ zP+ixyOUnAu%mLuV@q7uz0RDTn|vo++(%TG20v4?o+MY9sk=a< zY{#K$S0S&@6FfZ5v2OWzY~yW@mtQqsr>~AXyJYpRI?w1^dgrs6b7p*9^|j1poA)Kv zgVCPj zeIh6FMH`fcWa=)_JeIKU((I^xM;(s~Z=b2oFzYIJu+yISeDSr;8M8%q_Nx{=cB|(< zmdWYmsO8BKbal(xxM@b4ta~$_w>O_Z`g?9l@a_-q{~fx0y6i;YqoYX&>l^KyXS-DD zwo7?&DrovEYkD4F;aTzh(^>tv-VK|NME|k3n4x%N`|-JYIXlmtobbqdQ^ACoI|40l z0y*XSLN5fn-jDLw6{VQjZMyE;7S6LCQ|-PyX7xHH?*KnCagt+PI zp4+|Oq+11*t$H+;^1d(7jSjjcu$=vnb>El1dWQTGr)>q_V@&0J@8)ipwZS`8Xq|T^ zS7GYZrMxVx^6rHWp07d{U*5awdx81vd-L0wu4`&;yqWG+7QA;>MDV-4dBGWOS4AIx z-rRi2sY>o$sii7UX86BP(GFXq?wrh@)Vllm$K$^zc~({3`nGg)GvDf#M;hekI|NduKe^7DK z-*&%4n{BmJZnvy;2-~r7p+#ex&=k>?UU7F9DjxfMCcWTUcG=oAqpf;V@{3|}GJmi1 zo^7~;J?FRRt5fZF)&`~DoS3&|=C$l8C&jkK^hy>~D=bkwbR(?Vbpb=r;mBhi2cJf% z-HW?YHSe^hR8b1Yx8EYymaM#VX;z*~d+uvz-6<>9dU^JJ@|xDt@2+rlsm7ZnB^e*H zmal2qbbIaf+B)8Oc}tcEOF`sccqx(ws>**mvZv?dW^=MPy6aRG#^avrYwVS;@O=YHk=?ZOI0U zWmlrTyHqze7+&iu+cv{e^+sRLvRSvAf<&Ce7Fae^O06}$w{w?k+uL2&GeQ>1)^>NM zs{fLDNqh zk~{fy;_LPLk+UL_55D@9HlJ^~QDi*xeeU&Px3?|W9=rad$er7&7k36lRn&SK@&(Ur zf0z@<@~dODncwWanRn~{u5X`}R`l+AC+AfC*gFkTJ*Df5yZbg3v`xAgAakhU>8n-S z;)TAlO`r4ON>$$Z+R2%PfvRFRcy}y|dAeiDC+maE?@Ctc-g;ef;o6hiDn2{z#77IR z^NGA{8kd-pcx6(gecaZ5m$zZ;`dmM2?#-VZJ=gbi^WAIDzWgbU%J9hB>)*fZ>y(pb zE?#j{Cl}XthwQYTdfQ^!)Z05m)@6BJ;e2;Iu41*=UEP_dqCy@=2equ+(3+~QyyI%= zdbOzQCEM=i6+g31xvKMR+tHQEDdx?o`mUUET_V9ddQ#?1`F)su(jC!bH6}3~@6#G4 z`AONc+i&`~e&wZvzIj~SlaGJZsrdNBOP=MY?)to^3sjarc>DY>YvpHwTOp5(9z>ix z?vPnsaY`!nz|y^QWJo>hTwNuEfMfctAprZABr4NkyFJ-HZ_AACA+RIOCSWKm1; zJHM(cWhZRJye2tkvDzM&&Gx&RY^~{W%ixfRTlMkMii#;_>vpbDSyhrL8Ms(N;;4G1 zMnU7v<DbeWYmc2vo(Ggd3sardA0?u`Cn!_c)VC(d2Rb0R(46& zEY^sxLDOzpcZpcaInS-oX%%{KjD2xPipFjsfqVa|`*l8>K3VXVOV;{z)djPLEx#h) zeOT+aE$YDYb1Tkf&N{&GoN4opKT~_kAN-jj*S5gzkJJptqq^1GK0klGFn6WH3hTz6 zfN6i3=GA83n&8DDTXo^`c_oDdftCfI)+-pXxNf+3v=$pr@x~?OL{TPQSi$eOU5V z{kqqpaGB04)7s60Laci$cv%%|CwV;mcxh4f#`&R{s(Gy@8@C_m-x-?Lc}sBTUJj=q zKI3zH!X!sZCJ%(@>J)*_c8b5(6+L0sUcUjOz6 z*$IBut0Q%%ysdT6_#Sq(fq`kyzFXdo(L&*O13K0opJLv_qN-}~x^L>!2cP_;1KihK zU+|Fk;lYj06OLv^XdU_#{>n5vHOj_fjz)fv=o``HNmY4DQ(Lwzm~=bi{PoW-KYf{rwNnzDvOWiIZGFCH+tD#)!8C;k5@I(g)!n5e{k2A4MA%X!sjlGE&do5 zTyokoX!8lDlghhgvqSzfcuBhX+0J~oc6Z;~9SU4W=7@2~3*MerU$r^EQ7*9Vr_|mR zDKB3i7TY~Baf$_}hllOGU2pT%mwn}q$-H!O$4S29!J9o#C(nP*{_*^-9mXeFPrNSr zF8QO}U5+zQNqSzJ<%8=vKh5qb?>?TZ%DMbK!^-0JR8`6Rsrx)nh98Z$pJ=+mDrwrG zCo}){Jy)m|zW$%VGhT7el4)1^)Hg_XO185uvd@_D#NuA9>%P#hkMe46-l=W;&+sh# zc%O}Doxi|^)Lpk%`>wP2BD(+hv3>nl?DsbtUOt@@$tcrdx9ik~MVwE&KF3{YW$E{n z*`FFMYSj9mrK$4MQ?C>)!<#ZwTNzKQ@0-}Sw=mjPwRL6osfI6}@0TaYWco}9c@S2W zwr#_yYYV*jCO)#`_qse?xcOFp~R+7zo?n~@nL8|~%5YWt@zGv4k`ak7IPhNb zb^ps(a>9{o6W(-robFP1rziNJ_%q|fxH&0om)<>CJm>5Cuh)BTyH%zi>AAjjb#die zroE09M>BKgzsUCLh!5T|XMXyoX_|rCRa1oa6hFUz*JCFGr={(kU19Idi#OddJU`Dc zG`r!h^tDZgD^ry(S@&80XITDs=i1)fLd)ptuAP(Y{%QNTu5@WlR;c*2KGW&Y_HDn| zyLM3V!j$KF0X3@muCY+YIb-X76RoPW!Z%Y3B&#>V6<7lzADNP%yN}sXced4}-`f8ikhpx1Wi1cMLNPUsh zjyv1QY3pgRa>;2=y^GtoCv4ojm0{u|H|=bW+=Y|R%xjl9zWV9&w`&?F2yohLFv!06 zYyOKFcBeKySgUuwZV!XwIrsP}&!?Y1y*73KO8qJZhEL~De=Psc;B(Pk=Lc73QO1sE zttZO2`90ZU_S~lP^?!!cTt-!Ql_x*u?UOlIplK$P(-slH8F0dM=iIwu=JVyb_C{&5 z#!5STspt9I#q8vJ_xSwr>5lV5H8b_zS|o0nQ=`EC<+%M`&miYS#{)8460!&F_FTL1 zxZG7Cd5`weC|i*elai*0@JwZ!vhWP!KDPs{m{S!kfQIiYNU>T#vBWm;3F%z3bOk!b(4ttf< zt)&$i)OqgFrbQzDeT*O1w7ivkW_(&{+q6kRQ`0lf`){%@Tc5Y>=6RXG`|rZ-m0FF~ z9eES@mS2Z&#*dv})Ss_CnaJv##U%Qnsoi+DxYpbiL;@O9q*0sXB8Rn;IrZRlX47xnQvPGunPwDD+7d;aDqJv(zd|kMD zLgMK+x0gO}i=U%7d+xcIYqNtY-+AYIXmCkBZSdDCd2`EbjoEVZ;$xM|Z&Wg#w|v_7 z@88zBGi>_pmd0P6e?IzF?v#aE>Z&%4t9IwK_RGm{lb!7%c4-0I+mr9!Nxu8}x}t~a z(!*a10#3QHFOE#J^w883*!r3INKnVxEz6sxocgrnF=K?>y{YysQ7gY_bqeNhx^->a zThU=NEA-kc0y&vlg|$Jmv4JXw_GUMy+bqd zq{Pc8=k}9|Qg=4*d~1R!6v5?(dW-no2!%wy4=zUo^7_VDFP^#9NL7rB!AY{9 zclWN(zprMm^YTvq;QIAWsAc+u)0tdR(O%mp?wH@bCtUKicFBK+vUewIYiHe=@Otlp zNH4RM(a|StKF*K#d-b;Zbj}?`Yu2eIOIEW6UbED!PwnS=eosBqbGmflu3NWDf0~8r zdZh?YzZt$@D?e-UyYQK7+IRHb)h=A6wnya=YkO>zP8D}pLEX`EtqEt`pBZd*tK7cp zeaZKR34S((el_0JjZ(KBugKSb-5b4FuTbE#FK3{r63_8SPiN1}oGRs6PHyi$Sw5dy z{GWmM>(bBdvv$tj+hk%MQzm_8`S$!`7fn^$W!6_1Z8KfZy)WH+D&+Q>ujfme)+Bt( zWNF@`ejs^zz1OEj^UM!E&8jt4t4-g(b7t?V{O*m*P8_`yEw+4V=Q}m;Oue<2nr=^i?Sw)E;S3AczNBy?N67SGu@z??ZqT|Ql)3kr3L0H%N*`3s!ZBrb7_ju z?UZedzwZ5K$n{A+nPRqY5<|56B(b?ilO@ml)U@q6$>|xWtuFI2`{R@;?+UM-@HgOi z|5MZ2Lo4jvo^LouO~??(*(gHNM5CY$CpExNWO>$fwd^tK9gJ%S~{D2!q?@yM9_> z7rZubT0AlKRM|3TiOPzpat)yxQ*G~XwmoI#-<8R{)KfFji;+v^m*)BV%h}_DCPfEZ zds*`IO!hojxHq5xGaFn4iDiQ?l@Ao~QD|^trjbHm_%2xWSM(H%03BKl!*WPyApS$0-^2Uw7yq4dt6?<@jwsRG9#*$CdB(b|GQZPLu3g|(jkFiH`ZC4Dlk24HpVvl4 zOrbj!Ry@wKUVYekQrF(8VY!k46TQPeJgd@Xk>@&n&Mdr%lYQ5=)0q?IynB6ZOW6u# z?g*8Vv#wfZyWd>fuy@Id2I~g-x~-Z=wwY_H^vzg%Dp2d@`NY?=J_MA_J*@fds)p4* ze(A|O7}lkv=T;pnGVVHdg)h-wR`MWwUWUE;)Ru)3>Nc+rpS;zwl37k|+nV;TH)!bvPNT0&=nJbr8<_4eRDIdrcA0;?7149 zvnSEL!RY>?ITg>g%wg`jwReR@)JgUk66;m-=DDm$UuL7Vxkl)!ao|ClKbqQy<>W=R zOSv>PEzhq%w5N>2L#|V8)$B#dx@){$^J+I<;R%};@kHzI;_SOOpJqIrzdO!>h2NoO z>qg(z8QPv6A8oY{1)iU@$tG*^!-Bw%dW^Z-f_ENy!q;rNQl8_Nh2#_4&>c@?X*X!4OTDjSB)eE-` zd;c?p1_a6)o)&#R-|N;Zwl~YwZ$_2>az8A(bg{?f*4fOenXG)wkI!v+t|#`#Mnm%5 z6Aja|=Kf7zdU6h`ByDc0N;V1O_nL5)Per%-icxUXJ*V!@TRr@8zk&k49$)eD+#ZcN zT~p4iYsqVvD)QWJ*9WWbf2M3a*3{>zd?WjO!ki^jSM+?JHT|c0=?7Km&<}kzwp-hG zyKV@W(pv5R`?V&ct?=aY@2+nTT55Pw;#gJjyEXEulNTNR3C$)_aal4fCT$M~Wu{L<^!_gZIUzRunx`ep%N&BtiVEnB8Xb2&b3bYo<7OyoST z^8M-wgW|i_wy`xGcyov4`@0v~2Tmv}%ZawMOcmIgEBjnDWrcKfVeXn#&OrZ$wP%+m z@@w?&ZagX&m8u;z=~rmq+vRh$PF22pW_>j9^n}dxDJ42frfMYHKH4B%uyev9_H~`C z9vohd$BMhYOtmozmbZN2x$@28nh#v19>o_ER!r=9);q(VHS)vR9LJ|qRaz_3Ht(3{ z^)lc(>*NFjb|>3qd)4+#RVg){^6RMbVU@2RC%#$K-*JuKCgIr@-)8j%A`5=`F3DG@ zxK#R}l!ftr+{r)hii}?t{nR>R=i6mFLw1%q-=}O{g_O0PUPV=5EtA-|PF1FhzTXse zagWZF<}+6%eVZ1}{~jh%U_9r^^=Yx(Pfy6rTwgQ6NyPZ|ihdbMFO##qlNRp~VtoC2 z&B_e#RK~Td)h9K+Td@871)J69Q?}+=$lblVY0;(pwtf#)7nS0*XPc%@kYt}@#-n$qYv$-tK>#idQm*;_V)-S#NWE*2e{B16| z?08tn#rs)Z^5ar2ORu(vm)T{nE_N%b_I;STc&CP+|EekOh1snB$_ihOd-=4MdHG$* zw>a@-^SSNYK4%wv%eryT^7*l)l3ro?*_)!ww>8W?&aSzXS2NMU%*gSjXRxr%v*UhCs#E)FnV_2*R3n{zbz4NS-wzh z@B5%D%f2aJ{GlMX)!@&J`zQBuK5f~)gL&?iHLVNUMfN0$ zAZUtBt59fTLsr7iCtIF=?_%oK&OPAwY0j*;W8NO+n>o3em&eHc`Y`FT9;?Mgud=VV zXWeU0YEey>3_PH!zBF&v2UV>X-&Slq%)0Hj@997l_3K_r+m@AWS+P=aWADx9lOvR@ zIlNamO)8$W=Ighh`xaj&Et_`B>saN4tYDvW#_P@tJ~j!zrT)PDLwj$POYXz!m~;Gg z7oP1^y=pZz&nv*I$iUrx+FtfaEsB?xEY+*BXMb**>M@VONTSwPM`b}#P{Uc(9ed?& z%)8juJ=;;!%i-?)Sj{Y#NWFyO_P>|KQodna=zCzZQ%<=<&{rQ zPmk}~JpX~x{@k{wF==<=X8nm2vUkk&?b+P-@c#K@lPq}`r%ksE5E0+9>0(sbw^hfC z9N!)FUT$*wlaNE|(QQF7QDGC7CVXa^a7TCFEA!{vJB=CVE|p!}#jWXIRd~mL-Ojm{ zX2&g$Jhk4>_io$Sw6|SX^Xnowjg*+YI=psGT6kL0G_m0K$@_s>(vxDZW%+P0I(+lh zzZ|sh)cU#hd^+Kh1?!Yod%L#mSW=bgA6NV3KLcNI!0lUCI$q`K332&7)hKU%cxqGI zJmIOcytQ*u+82B|I!`!E+P8Dc?daljvrC^meY(q5C}iEA@4+3Lk7v&9ow6`Bk~QXp z$ljB0b+;H@y1Z9QTk&we!*`yq>-jB3D|A>GzaGuvwEUX3Ddo{2Qhdt zO?Y@~t6<~&(A2^S)p=(x1f0BmdEruRPW4xbkunF=nQuo$*RoDEy5xS9FSK#;?q6x$ zPtL2%3Tg4quDi3tsE$+f{d$!R4bi0^mNPuvP`vi&rsmS z3HD6M{|vQ}Ck5H{)u);r+NSA!XOgYWkBXr1X5G~nzBmSO*gjO>HAPMOwbzt@hwRc$ zjw%(uHBEN3vtBiN7-Y#XWuBKU|CwyvJKwUylr+3sk1l6qnZRfHBq->RwW!M4Y{@%r zuL|mT4&7qN_2QJ9;8lHo)9jY)h6yWPbUb|CJY`Pup`|Ce{%{7ho#MJH!Saw%eczV9 z{^~04WQ)C@Im~Kl>Cko(e960)|E%x3!;_+eS7b(p*SRLE=cv42sJ+^$)6dDhXxF2O zJC=oUcrSH~_3zWn-gqxVl|?}Ox~j?Cz&rj|e%rZQe3@YP*X_y9)MZO+c#kag{x!k2 z@JyI|X8L7TnLkyRmJ3XI8(GT15pefwNX?&@#s_(q=GhvlT`1z1(0@4MeRs{YK1=V- zPSJ7vD*bY$3lkr`;FV!8C@MbJZ`0;+C5?T#BsZ7+mea% z-JCpsZw)uuEt=jV_c*F6TGMONq)FDBtT%^g3XX`I2OzL$y zS!i>>+w1(wrr7Y4(JkAC-zla*RJh|I_YM&J!|u< z?6~b0HGg%PGM;!*Ej;;SP~h5mPZMKcC7kYS2DrcxM zKDGGV>$eJCVbh8R2^;yH+M|`bB|F)a-q_dP)TuLqEJG#3h+V`;f0qXPv+`6dD zyEKC9`FVTM%3^81OOEW!Hv{LN8yW{TS_M_*g@#WFvi;=2=%}cg z_4@0f4ez9ir?Gn_xNYuP5EDB!L9V&*>F4W{SKm=sfA7{c>ptUr>( zjeFF!<|&gn!;c0YUXy0QkasBXxA3m5y`cqKw$tVvc+XyL)n9a?d;3Xc7188+yN?ee z?zOB>)H?a{)Z)IZ>O&38{wz%%$F8P4+VE`Qo?T1W-ZThI{ChU?_tcWePoCGe-}apH zO4@xv`TQH7e@{7+H>)#+G1L86YuMB{{S(i0HT-HULp>&`@an8(S!>O|ZQ}a_c3qY8 zrLxSee@%aRkn@QjyWQ0FcY8fHZ*k6+ePZT+ZY^V{%vb4eKu+G^%<)~iuSR;nNX0S#VHwJv+J_{yjYP2@3%dDUzg9<=eqoSyW4H9 zvSiPDg%jLdJ$={I^P5yMt$A#^kiYD_1}nn^ex>S{qT5*ieb(OCsAGFmVNJ{92Yox2 zdfZvYSYfucRb+)q@zeVO@0wcWLZ)v15W?}Y=fZbDfW)?kK*7U4Z{N9~O zHHZ9+w4dLfyky0lG%5=O>e%rGUBII_{II|*WX^UxViMY=zR}MW8Q|~{&Pac z*Y@y+OLhEb2wpC3kUG`eF6W)qTl+t!e%w43zD&Qf+-%v>BOZc}Qf=C78SiMnS+eKn z?v~P9^*^V6+}^uM<>aHYFHd?o)^NO3wOe*9`=zb(oC`*W|3vZxOH>eg+S zel#w}*88WY^TK1t8u`!=&g$Y6b{-!sRZn-0ZrdaA6E`Fzf@JWM`#MR3lx(ETba z=Cy5DT+q|Zdt!l1Q&{kIb@}qCYSHV>rku>u)MPI6JZF5N=Gf|8x{<4nPP`N-ZgnB< z?rY76*AL^YRi+DV-Ls(awB-9Giyo_bX}&3%^SDq_&h(A0T6Zfcf>wJGIVF*J%Ds=F(ZJsqovf^glzX_rqu|y;w!Z zOqC@o8k_IOZR_b>BKT@aS6$|*kV`^rex9$rq_l$^^cJi>BER$1A5pQ%%e-1vmlos( z1{^pjxn|*(HE-`W&w27aZ2IgeZqb$O?8_>zJ&P=KU>Cd9!LoY3*G^aMH{b3Zv0AWq zwf~CeqEA+O1#M^$n3ptp#g4uU(}R12j2NCaf4V+r+HKY%rlLi2j~}-9z2Hi|XSD9y zl*wM2-7`;pTFUa}z3A4fiJ4ArLK}=2mgwx-BDz%AY3C=4mv>JeUz%XIV8ixQb-Rn9 zZLW45Q&fB3PFi?!TkzbIq8pY*|Kxd4{PfbSzYG%|?o6&!P|+wa{ylZ|`7W_3oHy_H zJZWJT1PJF8gvSlYw2YL*nU{6{XMbew6wq z-zOB3mmtr3Z{1XPlitNm#gE!eHf>m9@yPGWl8L7mtk-b3JEeI(v+urg&IHjr=1dNj z#nWo#;@0h1eLXWj{Ls90$$LY3zSoPXcU9cGsUaJ*_oDThrZ=Zq?A-3sf9btbVRW_I zZ>LRQHXQ=|?+1Lfj>N5X~v{Nd>mW$0hv&W6EY`PWm`S+p8E4rq} zt6e%e(Y@A6<@UKN3@<$IRLX5xE6vor^oojL6X$WOo~2^bqJuUY=*T2*43zj9@M$eq zRM3M-dvE6Oos2AayrX;$Q}!~WX?{JbpH4=_W==0(o4eZ9Ami4KfBc}Q@;5&cdu;t?b1A{b-ld#rWrC9rdNA+ zeSRx!QY3RxajW_Y$rJCNSq7_ox)LgK;*zk?5{AX?lh35f-n01mN-k3UX2yei>sWq9 zHT!C6zBP4mH>zyDB@_0nRBxh!uGA{6vakLri~FZ^t&7;7dF7K;!OAN=xkU+nzWRBw zo3b+uzRZ#dcvf$((m!jNRqtJ+na|)Nw>VV z3V!*cG`WA$qHWyXzm`>hSW~6i>D@6Q?%xg;Mb=oO>R(dRb|1W(c1qAPO6?kaPqeSQ2c zB<+3T{%94^GY|hRJgTVj)OgAUh7Ze*#)nFJW<6h+bJoo7?(51F9>Eh67KTh)=^C9j z@uFAWqM6BZx*04QEU|h=ndg7wYLMBR)V|~B;csn6ca~|`9CUF_nV+Y%yLol4IIG0Q zl6zD6a>EzzyjrYK{LH`oOlDQy=Brkw>%@958>ya-3Y4AF&Yux7@kHMPcAG1Yuj=$o z-c&a&Vy>@n;qf@xH(sG~UkXp#wCHM5W0;F3zti$Nc-iK){JLAOPVe_UwRrE* zi|Hpm^<8?haK$gHZ)=}Vd+zRdf7Yj(rEk_PF_|YHC(^L?pp(Ow{(iksL3iQx6LbAy z1?#sg*1B=~?9JIHk3U?g&bL)vuyl@C{`;&MW+$#o%Ff-oF(vo9yoajv2ZjTIUOUU> zVqV8oO`qP9tYczf`qWrp#abEt9ac>SQ)bG3-8f%kS-h6chq}U`Ng?ykt1qvO6gwxG zy*<(5$vmwSxmQ&*HCH3x^5EOKm61PLtKz4)Z79?zGiRLhw!78!Q+U(-jhweb&)m}~ ztoCuLdvae$FMqrErl96Pr3K~k?_(c4ezb^Pc1Poig_{}IX=Fuwy2TxIWugqb|C_qy zZ-2TL|E)Jo`*b0tr`+P>Uv9y9mLFxWwwfMrSzXn4RKzt5Prq{Y{gT8i@2k6P zzdc@SdgOP_ah`%t>o{|!y9aLJ3*BRE({6ltL;J=fai(@3>iiimZEIwn?AK7cr(M5q z%aQ#b-v#%q_#mZq%e&Rfp=VKe^8|P0`P0_>dLH_)+PQenb*U?VU3FC_mjy8ypY&Vv zc$uH&_s0`n$6P!zCH8Gmw7}MP8@zKA6}TM)NuQKHbX~bUn`@4L0;A*m*Ozwg3)_8l zTK1dSGH*TWD+Og7olowzeyQrL=ze&u)a0AJ+7mqapF-SC7V(`#uHV{j4sX zJ!NydxjTY0WaX!77iGKU+8ODUJn5ox?wj6EGig;ZekW6RLZIkR%If8Ik>@nkv!9k4 zaQyqZ*ug5wrTsW(! z?e>UTbmLw5ZX1Hn@YpKZg zf8;uK+IM+zm+vX7s>x?2)rQ=&*ZHu#^; z-IuDpwI3I~eq-@KWP9x6yOXR=m1`<}I>0=S;S0mpuRnIbcHC6x`|Zyo|0%ljFF8%A zUoYJlaLiq+_ThWBsTG&Sd7b&&Uli`h>bs(_W9d~7KAyFnC!Yv8oPXQuYw~R3Mb9Xk z&(0B7o`fd3DK2=jWVNM*rLwK|BFWs?nQ#3&lx9v&xTeYY{LjL-o|*?Ee9xx83oib+ z?%j@8GLQebltpR<&eRWPIqSSxerB0L!pVtS7GL-$k$ENcKZAzE3{7^9sS3@L z+^m0oTAOwgpT0^pyvjba)vt0z;- z?Z3qjW0?=>YD&G%zqIXHH}~unGrZT?{C12ETRMfcn&IW^v&GJVYHz2VW$l}-eI+xS zsk6vkQZ~?@RWr-+iS<7(cV+*~R*R{1nZ@^mezKZNKH_7yk1gX_$DO4<< zR6jgEmC2h^x*#C%OtH!r(QWxG6>Srynp|OO-*Z=^{(^_sU53d$C4Ob|Wu#t4N{1AA zs}>cm+H!AdLG$}Xf4+U(AaZM7fch1G<5N>MFZgn1>oT3ls-<7Gr%7+#JE`!s#JU6X z58qRGsa@0k_TcK`Gto;|*_0Xum@~FaeJsyj6lVNN)aYW>)FkJ!V>2^XcU@U}GJ2(_ zS1sSWn9irCuSUDeq&~UDmm3v3$LKw0?pm{{*8Gvlk{;g`&rE!LY4Pg~A3jc>mugh% zJW1eDWZ_0e&mfWNb5-G2npdpdF0pE&s;}v@oR+y4KXC05oRhRe`?O|Zg4Q z+m?Og*l)_|)KHxDA++ylvFVa6A8$Mti_8mJxk_on57%XSJmyNOuaeytdS5&dR9VdR z{7U(yTK~hoqDyu6y^L9R-O^>>w1AF}4PW}>Dp$_upUmaD?Bz4oJkxhGIivS;Y+H6{ zd(D>iuCqEX&EgUS9!?SAvt(ji=dt$Urpb>=LSLu12L?61FZ#JNeP)>O_m?{Lm6Jnn zx?UFl6~?iCAx2q_IaMVH1Xr*C3X_As!S3OTkl@(^9+7lY$tiv zFE=dL>CcU66EklHgKRKC38bGPbw@ochM?$IEjn?*K3+Z@%cH(55`%U(J8;8~rHz{fYfYNUO-6ZZ71 z%XI6yi_3#1+-mlGHpgP)_Y-5Ikk(@tjJ&*kkq z($`0|?QWi9km$3`T%%Lvt(@8}r<(`vX3h4#ZW^E4XK?4JOYT)qYi33TRfpQ?nLF*S z%$j`XOY3nTgZ9547dg+}oufL5|7xR!^}&}XWiK@0tU2|;evem!l*gZaLaG|y; z@6x#-$KbwsJAWwW$4$Ac9(uUvevVGqgy`R*J3PNuMab>%n)*@Kac^i<*VIIvJNF%& zD*5)UYd*BVnCZfU5+MN(+2SjW-#>o5F1Pr%X5j61ouXrxbuu!yVA3~erj zzJCt?865pL>WKeb+b+E+bBRjnq0q^vca*%0zOi-ozRg9q1)nKRzprbubaj@L%_pv1 zJWu%QOcP$5mHW9X{y}`n(}O?DJoFV7P7~QQGgCpCTdwoz-3Qqge^1?^^=x(OIoZaeEbUygGQFL9`&+m4&s#rN zp6|7m(ED?429I4Q%9oX4J?p|LepA7%DvzhvhV2Vp*&)8H$Mn6^B2Uji$$OqB zpFcj)WS^9Mp-)1mJT1#Ix;~%dBOl-F7>{?quWnswB<1u;XyJ*^zpn~kD|cIaUE%5` z+fDanbyc%G6IQyquj8w_a_p$&)|acZE-jd(Y*JM!ZJGRZ)${IE!QmY*a<#c890*YP zaL3q&av5BXR~SDf(fSsCQV)WEL2t3y(46A=aY~H z6C4;Gt1Y-BQ&`~@d$*y;U+>-2#FuY($tS)53OP}CAf60MO3de8QBUM_Y|}5o2U5l^qMsauR1NyUvqb> z^9d?n_kFKxQS77t45f7s3!|dBYYz!6VsbdHQzT*g&s25uHm>IO!t*BIe_Q?t+woM= zJ3HmHobT>Q587XQ$6ohw>Mw{}R(WHR%*`FD8e8G-I699L;x4>@(^QK$8kb?;K9%FL-Q4qnldd?eEF zxP|`SGLJ>~O?6Lh`ci%Skx_`yB7p{{e#cAma&zx2pMPFzR`yJbLta(CHhzD(*wfQv z+nzhyZbnJZIla0tL#5>hW7yUEK`*rX=EW{MEj#TUS0Pts+N~uT37-$ozkEApLtKhW z(vw#j8I8*%C!O{xdtW9UQZBIU;PT2p*8R%9o;z>lmnWKWd7pY4ZxLkM$<$_R&Yt#t zS?H994qt6Hzdl#|{Z)3J<)!O8&M6lb-FtRb<*UW>*oryfX3;lKJ@?Z8=WgV+*JeAD z#7x60lY8%Oa`QhOC$TeDubfSH+Vv+^f2LQPeR{@fynEscmML%4C7<4Z^{p>%SHY#u z$g5?2H{J%$V$k??XM5x4Ym%wo3u2Eh-{#VGdfEG3UCtjKdrVghj0~ARDfX6huKc2u z=hLj_e6d+sy5GlPMvM3}uL2DF-a&b->A ze$VYUzI(qu>=2vLlE=y_C10Ohab5ABLH(v{SMf8hKU@hPP8~K76V>w1+2^5n$w7UY zYxt~9Jhi4(lhb*o$0jUkoho?Z^T*Y*PA$6g?Uvt_sTzFmWh$!rPlm=z+~EDlSDh&t z(0Axhtx(_256@%8dAHU~=CRZ+?p`FX^rS3>@4Rf~{KG+eRS)O7u3kUUR}Ve$c>R$~9?Ky0 zQ)MpgQ{Jrfdtb2PQ`8*GA3Gl{36$}>qPa9*%gw#fYjgjOI8 zX>pFyaXn65ox)8wcRs(kXG-7EMD@q#<0o9d?8i{{^0C|O+~E7A8{X`9Jiu3PapL`f z-%~$bcigkXCUooWja!)>ux|-!DtsezwpQ*_VuY%st}qXzkww&yceoGRRVY4cVM4@-*^FCThU#7xnTJg&E8sq)!r zezr58hS@V6=Di^sB-f&{w_uXA@DeSPq_scfL%s7fS(cX@w5BiDd6GX(|3)77*>Cw-_mD(sm@)(pKg`Bd7+hf zOTbp!ZMXSSue~hPobqOy(D$^P(F+)+rX;`0cxAuq)5;~c`&zeTM)%FybMW#D{ut#A zZ`VpqFH(K_;{?}RYlC-J-a3X!hc7xbW$})=X9ccu9XRr$D!t20*S0_?T3kZsoY&fw z<(m(m?%VDesD9D*$&{W+P9goh*#Qf6ua~F4>9${9o2H+5Jo|Xqp5Wcj&kERC-AIaj zSLXeMLvwre<~*PF$7Ti7?)aT)u;Op;ixZ7r6r6f-=hG#tCosCtjr@~*C2Vb|EPurE zWe?@fORiY&r)eKP;Zf7HHS=%rB~M>^WbrCMh0naf%Pxv~$&9v7mxC5Oo zu{n7hUpl#EDod+K(}G#EuCPA6Gwo4afvR?pbbN;S z`dI;syl*@a2r~S-zRo&K_1ogxe?|UU37r0F-1k#$>W{|^OF7R20Y`R;aGh#ajmNsXL?0bZc_cP(+lJGAMmsLuPGD*4ax6$uDSGw3;K{6- zEw6PA7kw!{f7*B3^P;`pQK6aN9a)bp?mZ}dYC;H;8^gVMwKvb^hi$tg_1-yR+?9P`RoyL$SoW^~yS5g|Ae9>|XNvFaOHR318OO_3Qi3 z^Vl=lcc0~cnJLW0$)c)y8@8sp ztS>=DO5Y%XZ%BUNNb2RYEF9@7^nAr*jWYoi@E` z;hZ&nE*kuk&urzFxpLLo{jF8ZyqUUXoC#B;B5pnI|MgR9$NbEshlj7_iJ#TX+jRf# z4zoLM$xCWPHSM`s{$|?xU;FWCl}L>8h7aBoXKQ&J6Pwt#{CX^N_5O%8xAYz-S9b<} zO+EK0=h*Fx@1Q1ab8!L{=;u9TjgaGUYkZ3(ZCHNw{q?K^sEuDdSXy;;tt+IoV|d_$SO$XY%1^7Kgola?&>l2p&s z^lHEA_IO!Q*S5OKE`yV+T8z9F-SYj%RUMGYtGRqj-Ifi}52NqyxOFpNvZ@a6%AoCK zi7Zc^EVY#1&c58L=jCa)8JDE&;sx@;#PW>7Rh&Cc-8#hFZlSL5L*t9B^(vRO-b-?3 zg$MoKn9!Q<{M2t1^YrWHccv`b6g26v?+T6Pi5vGNIzO0TD1Ui+tzpHbqAzY6CLNt_ zB&ub+`@?Nl#|X}#6VHS^PJO&?^D&-Z<5^zyyET8;%luV6&3xHQdWuxM_`}_w%wDg} zU!qr*{&st;${Fv|7osNT*WD9pQPlet5%>5+6T|a)?Gmd_v7U;G<1R7VGI0`@1M}18 zVR}0@eVBKCx$2ZxX|%jH>4!s~9`D2si% z^p5JjZ35d*dq#RVYsIk{%z02DQ?lZ_P}_8?`XHA}XHuf|3KMmoD=*YjOiM}Lth`Wq zisAj26-9G1CEl$*`Pn;0A?nY&B*lcvQ(e)iUIne1d~A1u6B_$nG~o1oOyFY$#Xuv?f)5ybU(`^y}F${lc!x^!>h%L)*FobebzI4 zH95b+cYb`qqqi$1HoI=Qn^P@&UzCwC_j3W`TS=MEA2Rdil^rd5c=xc+E8f`TP3LDC zS-%#N%e3I-c=bi#cSpdN8OQA&`${eQywt>=U#}|MKg(iQSM5{B?XhiJrX_D#^I)a# zI}c@*go#(KH#|0-dP;nE`EU6^o*NGr_NZ!9+uh!`zTE!xhmenXn+KU&f{xf)OEuGZ;bmx-8 zz1b5U2SsEa*{6Ek$$Vj?JhS!}uObn~XRO6(+q+lmaqO90a@v1q;FY$pD`Amk&KjJ4 zk3zSs+?VKle8Rd3k5rGzw(3RZStUu|%Bpc)=DWO3S~KuYeCd_dsz>L0^gQ0o!n|VahX+iGkQzmfDc6(~v^I1zprbaQ|_O-!DS^u4U|M)M~ zyFI;}`sL=!t(+?N%cl3AnD~7`rnlInem0TP-78eqo-B&(X}@|?mC?)N?q%x zwX{8Hx9anj)he4;dTzb>s&2{2Mbnp^6P!}^cXrU~n4-!JG4F(K_oi|e<}Q0EBl5g3 z;Le=>*s^QW+cPGb{VcmWX-<~eSJ$SC5ssNze)q0AOl(nk{A8Wn!`=G!D|8nwU3%&1 zJqbpy+jG`h9Jkwg`&Iw5{MedT_hk8ZY~{CdUpCMEfk5Tw^LllM<4c!xf4dz!zwgQM zU4GO5GaOnwYsI(K4Mks~yzA<&?rpevr&HfzL(7!U&$ntvZL+LlpH~Xt)`7!Uz@8oG4**#Bi!FXnw%TcA>3rKe;W~;kqF^dh)gB z_o6j?v}bpBEm3Xr6I!x5YvTi$oF02f87xIyYkA3+|^6c96T#imTYok6Pmzz^257zk)LX2J(1PVp2_#%w2^Y0 zs@3H)E5v66RolE{RiDUZ$2{?T!Rp@;vG;a=_}E>$I>2et%+2CIuN8N4X1(^a?MEsj#N*=;tzxopqxF?mmV!;JRWpf%j<$uh@agWe!mKfbC=uaiI^(A zJZcf!vf}NIvwN?X?fSrwo59#WefqY=HU3+UWr=vMFU;+Y*V(tsTI7_F$n7l0!lM&Z ztQ&W>@Oer;@v97JZsSg4m(cyVPS{!T2Dg@W2IG#clbf$ge&tVCzx0dxHv7V#;jdnL zzg}wp;m1?^U$PSyg^I=Vhi7&!nOXH*{_}z9y=$MSb4jW{eEZD!%2oX}TNQUk^6ak3 z%rO>wozvE8b!b*_&(AL*x;DqWLZ=I@7veLT#JT5(ZBf%!hi$foOV<@^1v)uRo>ZyQ z;C8g=z1pgJ&Fs0`?yK4Eia98IeR;HWt6cQkZEqG_J=%LZQQ?;ZpS$F7<2!{HUsn|6 zw#5{EzPSITY}qV{&yTJ+nrnD1`BQlOKf@)#9C3?ZULoDK(^OAY%)YVhObf%*hGm!5 zOmcTvD!2EZ&8i)bd2fd;(y7jU?iu;Ob;2vzyhn$G+GTIenYMGSyM*QQf3N0S>fN|E zXJYEa^$IULC#9FYn6k37?`MvP@P?I7ggCtpTCfQBy}4R=bVrz}OK<7+!pPkla&yh) zZs;9Lx?QsTRbNxeng@^HxW|N_Ie04S_Wbite)m=%*LOZH<29?@?Yl3 z_dMiqxv)s6dUu2A^?zPr-$IVHx*S;;ySC}El93bpi@S?Yd3oA$MosNcc(=|ak#pkG z_!1LGVI~fnPlYF*?J93Pxx@X^9^<-0Zx8uAf4hF^x}#GyIGMbUnD3T2z%E<8F+P29 z*7@V6-0A9Gncu8=nYBK==06doWUcw_&|cH^Dyy|#aonn_Pc3@3?`qr+-D$6n?%n?I zc-0%_tEYzU%fT%E#InVzq6`0MF~yKQ~B(1 zjLB2$yiIwy%*S^=8sEE9JHsV%WA5%)=AE?@6&K`ktF9CQd6c(duCyDIg33pJjp!wc;~aM4cqUm7w?UhD?Rp9D`ydRn$J$| z+C#!~lwY;RwSCoocfEP(cgC-JJEXXXSSm)f=DQ6$T6PtzlT&^7PS-Z~f`^T#wdq+X~sf z58kfZuu#WJDbLQ^G(OXYU@R=qVsj1KQp=!m7 z=UKb>+$GkpJMieS@BC@0z5Cehv|gN3iCN$FTRX~aTV@5%BraL*Nv{`bcqDWAUFgwF z&Cd(e;%zXO;VYf2BzikMPI9*BOx-ADwM_4s%3A{?Gy|TP=Xz%yv)hxl_Pi#a!B(YL z=lQO$(=lUvbF!;_&#P*UO6dvS>y)fl{cxBhbTg~-<-u=d+BjiOh{RQikgSBFWbTBR#ivlR|&}qPp%fO zn$6jo=V)1YI+K%m{?ar2bNWixFU^nMZv1S2^piuM9`$IR&cAd0?DVqst+(~^UP?^P zKXl>brGhIf`8F)Sw6*=Ns&c-`SEgOezAtn2)53S=JqOJsVkkn*>BaZsOW2PUmiu?%ly_*=X5$N$SWjxv$leIQBx=9D<;3fP{zM4&Uf3T-`$ngpPXb>Cf;v;S@G0n=hfFoX5Om0XlTB2x^?X~<4F@1@|S&6fp>o!k0- zpZ4}{yA{T%dX#aiLi33^B~OgZtM@IM=WG0JuDt3m|L|tdSB1Yima`wX)t_d%;c>XF zt<=l%J0F_gb=@nBRA^i7;o#+GrMg9hXI`gF=hM)s?>oPFmbM%qyU%!WDYpiZ-lT0)_CN|}yf7+Cmsfv;X!YzL@erg{%z0WxAbAC%* zB`b$-+Sy`%-wN@GeswphN|ro-GVa+dEl-p4r%XTj+dO)Cxwa%Oe%84?E=$kq-pVySQbwvL&ab#e16r-;(xPBtQ7{?D5Bxwx7qe?`??slJfK1 zt_Zc~n!Hb0rmk6cZ-tx8g_0oGT9)i|o)1GwlsV(n$3E1z7U8V5@n2l5`#!1jveq@5uqt{r{LWi>=8f%2E{7+K%DmpuhUdX6h~&!Sab90U&RvUr@Ys_8YYMfcjw zQ&U=2EM?Fxnslk^xy{Fwx4EXuYj}DsR_OVBUT^E04E3p*({wtQ%TIn{A92`SxBN=R zlBJTXANPMVdtor&e%=MI@LfXt#6#x2k$bh(MEBO;{40X%q9Sh=mFmoKY!m8z=Mi*U zGgn<!GWGH+RKIx7|I) zvO6U6@kJL+BdLJQL+jVx@tVcHE=J;+Yx#qRx9rq|w*@@e(|W!`D%t%=S?wdf8?lP~yVV}w zJ91g9b+$~+lXxrQV0}=b=gYc+X-ica9`b2eOkJw-K!bTs(bvaMR)6jftM<}av3L9N z7rTzARYkX^e2?)d(vso2vvF7SDuo;mt=spE+;uKY-ZX7aAj49L^LiC0p757%+gE?p z^7O&)aviI^_J6qk+vw%?n`^HB6c@c`x^=(5>XdC8?o10=E*msyUUL53cduWszV>n@ z+uVIoCN;Lcw%cy@Tn>DD@k-cAKe0p84gYlosJct{`^{We9}=N|??!j|tS1_I5>J0} zCfF>C3SxUZuTwR;h~apU*3(P3mR((~$98S5B&*n4V?qC@b(2%)mqhek58d;DQI9pf z(CY-p%Ts&i=2<>DbVXkMdfm*c4=+`<$W>^%?pK+{x^ws5T^CobH)pr`#`@|lml98F z;<1S;+qi=71WXs1ur5nw`E;GD#cS7IF74-5zqi$CcGZI!e0OgYZ{qDZePih=J9eWb z-yB)yEqOHmi_2Wa70G^cpBK-WnZL(BcAbm)_Cu3pUvhJM=(ef|ge_&7Gr2GFxW;pl z(tT4lzs$bEA+^o*+2f+Vr(1VdEj3g)5;W;2LZ$`ZQEA?M+Q6`(tIttsrm79aPYo z!dk5Ljv;ONhFeFwjyyhL5fcs_8(T*<6wzOC;9rE1PHF?X$U;PVDi}8B}UAr=6{%twC>Xg~Rmenzx z6CT{wHP`E$M&Qqe4$g&^@B;7c5AvOH6^~E*HcK0pWcRyf-K+x71XB|=*GvDP1aK3POI&Z7s{yQ^w z+`U}8JA19B>9J|bx7Tj_eLO2dyFigqlVRndMH@ukD;Ydg&g9bHE_ux}tlDg1)=Sxw z{JWma4CH>h@QK-_um^f3QzuQCFr{Y>5975xJr+-OLgjATyPRHgu>Xp>?Ma=2Kecb3 z<$70yzWQ0XOUp=^b5qEt#b!(b^O7^ZF<$?+^}Uwp zYxYi$%-s=mtNHbvr810@Pdr;&$#?T@RjyRA$46;5XQ86J;JN$F+OI7#SYq1KF!^%f z>v>Ik&Ie~6bkm;yOFsLTk#)Mw%~=8crbqW5*zHwTB)xyR@6p8HODbQdG0k(&x-^4t z>4tr?J)bRAk#BA8xuShaO>~*I-Jdeq^^;dNVO#q#9U;Y&aG`1eOGcK5q% zmaD!z-Fb&S;}Or&6WZQujyhy4P~PIc!0XDA=Xv%{=WG@H=l7=fEi$_+AHMENRmop* zrM|0bvp?Sb`Z-lx+r3GhKl&2mM+T`D?O7qlcd|hmH;>4&I-8L-SQ}Zerfd(V#2VVYdonk;cAImj zpk^Vj&#c>=lh$uw^zu};IPqRmQu0LY)y)z+?gZBFdwo_}bH_V2h1+k-0~L-rcX1pN zJn0>HLMv*MhpbbOduwYvy(Tz>@>4z zG?ay~nMbbsukQxhJ)H~J=1c%)&e%)BKGHkF~9+A7LZ zcOBTbdF9)(Cr3(yqMW`1ty<@mcPf)w;#uUCyp~1m z(ABxi70Pq%pNG3Ivzc&G!!GdjuZx+VUnb6$4$QoEcS7S&|dodCJ}ESLBl?UtijkU(z{W zb?w7_>*^jA)uT!G)#YyeoSau1u=Q_Su-{s}Wl=&*()U8o@3j5;<^9Q{uNU7bxa2ii z^uw*GhOYV1&93&>UP>I=)jxT@*3ZB3-#=O@U(7r6?|AV9yUy4D8J4W?p5yIx{V1>3 z=e5WC7V4;P&Q{&uFmLAiEyaAwyF7kf{?Bk`eYcGJj63U;v)X6qE#&iMT{dZ1m!n1Gf#aPoqa-xKoaYLjm$O*gUNvPVr-hrtZBKEv zJ?hTw5nFCCXyzHu?%Gw9(>3X3#2WiU-0O)$G>a6w-nv5(azOfsj%D5QTh7*eS2l%@6NHTOp$uLb?!+I2W8D4jERM7EBk51(|cSWmcUe)N)`8G4~eEp%5AKtH>R^&GOnycQ*4R>cQ zWo162VdeKGg{QfH%C(b+RUIZ+CiEn2i@cFp72Y9P$Puu~e1mY){#A1tU%!mY^EkF` z@#?!pD=n?HH*rNX26i_v7;$Zw7ke|1dG`W&`O>RTX5U!d8SH-L+p;Skqo$tTEa`94 zSF?Y4Y0%j%-hGU>7)0j%NqPIMetB!0oaaZWxofvFmL4yZJM?)a1CQ`dn?BpfwOcgR z&OF<({kG28%EP{%N+PQ-pWbk0hp|L#?B@5Lv!2K|tz^*FIOyOJ!6MZ2>HR9RXCg~g zFR_UTH*HZ_&#LgtAys{y@pYNLx?Nwd8Rd$-)i#`~zUuA9cjju_V^#J|-D!D5s918T ze8UCiOxXulWeYO*o<8?LVD3tPTz~I!t*-Md9ojWvhKyc7pv=5*S3kT z5#)MWH0MoqF;`D~@Jlbx(?^&$?mg(q^4P-W~f?%`>d;ztf$A#lf1{rmvido+3hh~ z9?dE}(w?+7=Y3}45#1wIs-8iUisuw5@8}7!$_ktC&})*&n)R<765VA!&-r^^J}yoC z`6JIAchsG?ZO`l0Dw*lyl>gwkbDw77#y5An+G7Hywg*jR(apS78?*ZSltjPlX+Jjk zA720WgW2nFp}%+AB{R0(yq&zTdbZd0DvKu$es)}YGG}sfM@?EfRc4OXeA8DCcUN^N z$IP0>x=f)^SDSIU&{Uz;s)KQwZFXhMeHDInUOifdvpg=I3ochrul{i0e0fuq*Nv0j zYxWB!o;}Xd*ZaJ<`&c%NJ=<<~l%754r&)7S^Nv@; zF?W+M635td^W@K}%dGDnX8KKD<|i+n)PuGWZga6_9_vIY{Jnho|lD zAP3nek9KVdy7gUfTDTlv%i|V}pe;*gPhEF3w<<|8@#G|_IU(DkpYCWWW}k1w@vJsx z^$b()?n$pM{XQM!#ufDH)W$a|lWdzs>t5e1XP4ONxb5ZQ%&EmrN_WLtCdH>}ad|b^ zOuj!Sl(V|yw|7A4qAA-vtar-i`YqB5+SV6iX_P!Uj!inqa8<6QN06|_Q|Sf=Pp8dW zk}Z#~Tg?z@RKBC7f7R|C41IeS-tBjpQ{;c0Z|3tep|ho4rf-dZyZPODu}AI`!WBKA zm9tjD}EAvXQt7Q6*{Y)b6AC$eQ{rUdZx_lW|O@S ztrCyvue>9eH($)@0-M*QsZ3SBHpjLu|GIQn%uRD^xn&#g>WZ`1UdYwAnPPKj%A5rv z>mRHrc^WrwzEZ$y%Ob~Q7H#r-d*k)p z(Asw|S(nE$RWoNE@)A9NJ7%ZmZja0IJLP6CQeSmf&piFtsyn4S-Y<=ikmpIy<1?J| zz2>mUbnkD=-YqeiDtvQlg7Cw8?DyBs>JD_-t#&oD>jrOB)Pxg-wlQyIv`?Haj2L8-4Glmg%FUn_f{~lRnSLQI)N1 zo;+`Ae%#i*$27ORoa^(2yq*ZKXa!zw2O^(=O3@~xlbcz1rfe&%{F zOOeMXPs`-J6YLjJ<~oIc>IiurP=A9*>RC)t;@m#jv>ah0p@kMV`!CJ)}G3 zL{HBWT(u;(t++3~&@PZ|!b3rc=u;|7r>L@eeQDHS&J19g@>YFX_21IM4-d8cWfjc# z%Dl}!_w4ZOP3PQ%&ofIrzrHruGgnPo`%Z{dA5(j$m&4uf`?NOd{yKJd(T>HbSHsh$ zYbhIEIDIlPK7=DU+W%z4%PigxnX`gVe~(wsd}%(z%-eSd`{jbV>&j>Ecgj>wkly6{ z>XnG$Y4)|@HU3w+cE?KY@VxhVb^7KBQ&l~k`tC3=iA-8BK}e|h0#|qDIn~UFYfqQm zKC1C?5j*$3jMrVB8nyy8{QbR#uXq!ehAr9mZtM0_QJc1~teLyud-B!T-&b~~>y#h5 zRr^OU`a|`rcUwL;dfnf%&B@c^WY9F>-8YOsUaenWo$_j`rl0jq4#BBYMR{7)CrU;g z@5}OC@%7!*pgBH~e^+;Ncm-W6+>&mum&ICtCHutYd( zUXOYgPS(wtv+v@&+p@{+pG4L!H&^+U=sbT>?fimp-=CVXtn)4|4is#k^7Pc%qK1$w z^G-hEJ~tsc^2LU&3F^}o7;LqtCu?5&qO)wuq-D2vsz$1>JZe|)y{BxiX-fC9ueM8H z^4wNgd%9-Ds$Z+U3Zt(~ux<#ijpvyYyXa=-p^0Atd%c%mUY0wnNc7sXQ)>;UKj-l& zSr^@*rJ{QE^X;DJE5C*tXRlt;{$$^cd0!?h7klmZZQTmS9WqreMJHso{rE0CW9s5l z!mYWtpKVoozw*)41#31<+s-cg$}_I`y50J&g}0jfth}lMJ}JgNU273E?U6u(jb(W9 zxuxk&{jc+^H4_xZrF0w9My7bi1EPm(q%ET4rysKGu%Wj^s;77XJM5t2qwigjY7BgP-jnUZ_spBCWhYe!w$3SL5O8yUu9?0zNdts{NA(444rONZe!4K^7kA@weDf6?y{K@;j-YeBM zFI3!i_g_?erJu#CyWXn`IX!;puCy-OX4O2o$+CEz-J>Hr&DG~mR&$xU=hC@DF#!rI zT5E(V1-w4EcfO8$@-s6^G)o}j;n&j-EN)%+a`&Z1m_b8zgUzc&S8ej9mKDq{ZQXI$ z`e5m!t)g->?bdu**E6%w^iSy2o}y**o*#d5@yM35e%p3%>g)bdoysaR!9Qh!ho(Z! zf=jt6(?q$>3H2@vJG!v8^7-^~yI;NAi>KPfteoz7Zr|%y+*(na*vl?Hyb%0vebiL8 z3l5s$Gqg8&V2mh>Dj)U7t8O~t344_yf#O> zRClSThU_e-N(KgYg*kHV3v3-s!?U;8yyyFRdRbc8vRl)+=7ui|HF(H8e|ghZ0Ryw1 z#s&i=b9;?ke?9A*qnD>;xVF5#({^fm)56b>O*!{v+j_1Jx?(-&$j`-mtlxNgR}?ID zS?DGEB;R7ylhZtN7e{D5$jmG0OzmBFclDub&yFrq?&fAtE?>gt@ZoV~Z>+P*RFLaM^>27GdshQFDWvY4^ zhken!HIu`Z=H+GfEuOO@Y{}Ye712oo4qrB3nZr|J8+^8)V&R$xEEBb?HZc5Jtmr=B zh3E2P7T=F}oX+(5J;ga)^Gx8Rde(fNi(RXXrkTw>I(^x~_?-6WuEmxSM87OF<+-@G+jFQWiu}~Yo?YXhvTh+IZc*)%WnsE&zG#2Sn}5Ve!#Kk z=6y$}ELm<_Q1~e%P4?jRrM7B0?ei!6R6Q=Q>Rss4Bjmp#fD|Y61jG%`#&{(^XqTd3}^XWQgl2$)7rXI zcgLa|sY17%EK@TXF0IHpVJr|)cvas*llOVSI<4+?r5hM|vTpAZvPqes=`7>*h{uz2 zvV2s`rPtb8`9l0Q%h|T~tv&L58q3XlQI)e7PEvHrbMBdLv@cPi%B3$|AverZx=QBj zYH=U`iM%%_F3ocZd0Tk&n^(R{!W+-K&1XIxsO|Ta)lq#nBrE+ zP#41`dgPso?xa&+?=93ksj8NBEcEn@gAy-e1Fj``tt@grK2a;^Kg0clUpGCjDDvHK zDsyFu*{vq&2}=|G`eH8bV5z&KBQF@E_;h{U*7N%__ZpnN$MbSq#HOjbhVz4$SzT|E zjyicT;6?R8nFH(UXCLuXxD)**FY0l?u6F*b0=v7rxY!@cq)#<8+q7hD-rD0`=bo-i z*NQwKbM?xct47%hiyrm{RyYMeJ@GP+JMlK}J-6qaM#+MWXZp?*FQ2Dr)cV3xed6Ia za`QJWk>Squ-WYRbkVpW+antC(pIz(&zrknxF0bd?!tQ zo|ns<_pat=$Zzjg+CI0<=5Cw2)@!SCNciv2gq5z9cmKU=@b;3dyyW&kylLK)8$S!= zE_&UvPqNjYw&%>|Z_jRC_0L-F?jIT3_rfc>cEU}|15-lJJV?HzZXu!2#IN_SG~wk} z*VLRvF)NmG9{YA?*=?r{Zk8->EuJ?8$Ji~8%eRiJR9?p1#r$Y(V}4onwe6=49*|wN z!TogD@oAj5T+{o!Omo-2Dm^Z5nm1*0!L#?vj$Y&bKKnz*>A*xA8Qujvi_c3`W&YWZ$J3FG*2+sy!Gs~*x>9$pC-HQwtrroyBwtCm8*L)#8XF?ak;?1 z2e&)V8EibQJimX_D!z+c>MG55yRJ+RTEu_V{Ikrpg)t|07@gC~ntAQp>7&O!rfhq; zd)?By$JvdyBqqEoc3!(-dDv2mg*#O>weGB0o>wmND@8c?O5B=hv$MpDuTGmC6K1q2 zRFNY(c~w&Y8((2x=)nWI$4*WvnB;Ni(+1CvU;i`g+N!^$=2O@onZJQqk>~r3V=cZ; zI`-RgUboC{m+Ns^(q-$eY`^QA7WC(o%lj4V4uR)5wEgWI9xr2cT&nmyF2Lc=6ehQK zpZgE{UAytlGPhR4?ZQ;ngcA1oUb&N&@GMxZ{!p%BRqBb)wr5`Ugqd#Da(Sh;YwL+= zGlQS3?BvYlQ1!BSGQq}ntM=CHx0b9KReWo*qz`UYn09SJ*d)uPt`;f@^BfvKhKk7q zd}->Bdwg!gexG9I>Bg_ueBXM!$?UquD{XPn9i{mdT5fBdI|7}Ae_mPZyV&Miu_{YN z^SnyguL6(VC3NPv?TE;^m4D91+DrD#&5WS9!l#o&D!)FN^5n6)vMp=iZLebnQ;VKC zuuFbC@s)ql9373wU0ar#?%cq?WZ`L>T@|5^C)$6QR(#SoujIECcl)X6Sz@QwEY#9j zsiN{r`I7znpIXYtHbo^}5LyuOuq6Fv|KXr}Qn^-ASEeq}Q1$jaUM5!0>t1o5`P`#h zLAR@!{cI=Cd*}W>Y~{P|H0gD&cFB{rYNl(1J!yPkR5pLI$R@LuQ-w?-g59&uxV+7l z4LtKt%30S{)0=}!>-fo2v%52uFUK2qJv5*E?Bo|d#mI#W(|wM4GR!-h$?)%n%=`%< zZT!+X1_ufQ*6V9pa%yO@@82VrsV@2S?W8`yY>faN| zE%{;MzU#!+wFk~@pQNIyS-NM^r5ZQQzc%G*cFu&JZKvMNOg#SRigs0y>$<3KldpNmTyY3|IyHUO zKJjb6&XsvQUV3wONrxD>b=X1GeP{KxyiVPgc)r!TlU??A|EAT=Oy0dMnrkLiv3&me z=gz*U`*O!^j|*L&Ir;phs6SeTd-u4C&U070^W^S7U*8ik%MP7#47%c}zGvRAla+;c z_!d4j*~0IbX`vXO>b>OF6E{}R)M$4nR)xY&SLKpWUHPI(le2De79MzUY-NpS(EK}} zPJEfR^sC8t=}tGHOW}e~-~Djpd-G#^u9m&3vy1q&$y-}_(kZ#%o=R*(q0-3*)6)z?m*?fJRS@#`gjgX+yUpB-0tB6xq+ zn*FR&Tda;;o38P~tL@q;J1(aWQ+^#d=J-t`=-7{mwK6k&jDM>$O>KT9-G208;I}pJ zcNBH3wo|y&U%g#)rJmBgb@54BX6|LLbY&*B1o^J|_+UbG>C$%}SLQT*Hq7SrPu9$h z>-5i<_jyOpuYFN7UsXKqQ@StZ$(om#GUf9#;l4`CA3r~dMn>nJyRE-L#d_klWOnxD zFFIF;N3|Y(6mwu+Vve%q-)W-XU*`n oY`8GVN>Pf-H+E#pMGU&_u8dTR?E+uZFzg*iN442p*1r^dCw_lEO!p9E;ahq zG~tHV#%DstJ>l(Z!e{B+k`>Fj|E9d~8~cBTnen0(4Uf+k$_IN?u;>O)nX1C)e9^ad z<*a&ZtEwun0^zSSop-$t+}G4Na zN7-T8%)g2rGo0*wu3f9;dC;q?uP`W1Ktnd#xQc`AruKs4*Q8cX%&q-)Cp!0!c#MV3 zIdiF7!IOGj4h00&OzPbA=)AGwj`u2}Pgn&CKVSB_{U!WZz&)m&GEHp8J}=TYhcQ^6 zYH}04Kd1KBhi9L97G7e!W8|Sc@rCE1;@&-t>htv~M9=E0aip7@=eGNyOSU@3>*#;=?90Tnmq=dS`ko&+=eZj63(AVY=ws`L>59yh%5k zlTiAkcB^=HlWIZ9NwbNMLeD!{8wx($sAPI@gM8xoP0Wm*b~fivW!9|Ibf43*v|H+i zw3}1x(;emW4+n0`=|A1IJY|#DKDcdWwtbskO9*3jg? zY`T2T+apd5Y(;)Wnag}1xvaZT<&k?NVX2ma{w10I)oazvX1=}=otmimYChMk-9DEX z^6o31X)?OSHFe?@2FpJc@7CPTpESGD?7efhmsAN)`lSBt&!78Qg-2%bvaX2Q|MKRk ze#332_;r?M+6FDWKc6eZFt3+!+T8Hemn=1GAey!lpdWh5SC;{B@_)@^wVQk_9ZQRla^yo8o#YswsPAmhRe<+5uXc*(+pk+TQv1 zaP4!?R~^}J?rz$1(l5wU!b9P~FZYYDA7z`1J$iE5O)p082%qYqDBdP9&tsLj#|_+% z2Pq%Br^MlNut_$%xUsygLFSlomD|x%|n@Xp6yd#GML&MVI;{_+})|CFb z^WfpG+KJ2Lg5R9V_^bF7kAHRwV#jP`*vmCL-UM0o(Xg0(w{B0`9S!2n*hx1exgiO(3W&LHnv5DjN{&&kAw)SYVybF+Z%Y1lG{MCv~_xTPn zp(=Bp^gf?|g| z)uk2}RD`&*etewR{4d`s*L9uIcAeN89yWhfO1@o9H@`Y@H+K2CuBkisuY!CY-qK6|!h^YvcS>%`5)ry3S5>l8e?iWYOI&utq2K z=$r+gl%*SAKlFd~aOyJ#?{(fy+c+7-uI>=Le@1=cw=e6YwNAF(yU0Z9JvwO-So|&o#CYf1G;Iup7 zoA}OO`N8R1fn`?(%ctvSyj`N1eeU3n=gRB7!Wo~lFIC-cwtQL$ABU_}f8vi-$1c@K zPhE3(RbwfSQ{qGMEzw$mrFR;FS{7?rsLyjaaPr;q?*7TS-!2``Hv9J3)A3eJ4C_*L z^+`olMemR1f4Ss!)4x>RHD@~ath)S^piR>+h?JKw6wCbHc_o5~zi*1h8>4(P5 zd#LX38pGn&^hq`_xX)(pzfN}}hnIc-8MxZ~wz_VA`k9e$p}NY#y9-plSiE3-cXCb2 zw=ZWO7Qa#nEm4DXB^OEp%@GBA8*xbnE=*{f5ho3?elUb8mK;fv#O z<>vWZ6K_m?ZZs((>eS&pp?UwN=IWokb>;9!#gjW?dww_T+DdMe|5CDM%0iFhN*wHa zWcU(-SPP!rUoNg_@Z_YPd(f=nZEiA7jfWbJuj#r}Ayb_eeP`Z{DJ4@TJ?>k1Xt~Iy z`93vrwFfR-P*$}F@_b*+Zg(#E*qYhfCT#bp^mohHvtfNhwAK^L?>t`)z6{)^9Ibdh zCh}J0+LP*4b&B%{$yR^HUyX?sV_c@t*%GM1L&zlx7{hU%vG>e-3$DV6r)Ef2nYacbA8XNl1`?<1?+Z7v%gel*Tsh^{nXDIM#Q#SY?&+ z441Gu77k$rUYqYQ%KW7C(HHc7{>h53z~^Pj!D{bmH+nPBj^Q$?RaxQD?qv~Y#V)Tykw zCo+$F*mSSDvnF|>#nUrQwxMe_SZHtBc;fjPFI~gidik{(%9aYt-(P!n>BilgVjWz^ z9G_YL(MqhnoEw#>_nvXtblK%Wms>L}JZ+5@xBU6C-p?{&uI7&N3ZG3(SO+J(8ZF7FpnppXqd-KbOp~J#aD8s>}A5OS2cBav@$syIIr_{-O4L} zEH7_Umrqj(59r9W4(eoSFEDa*FXPwYk(XM#E~-vBD@tkorg($7E4fadv;Gxwo`3sg zlb|UpE%tfU>g>5RVd}!G4<;3~mS4Mf_IQ9yB6l%+R#SkN)9=ZbRsMvkR0qD2mc13b z_ovT31*>gh^Ukto_#b-4`GVthSM}9DPCFOf&-<*V`{7O&WA1k44J|1uPefCGWrbBv zzEE;D%<#@yqfg!4D@8voJd>`s$oL2IEH94d56?3{Unw>rDQ5PR)Lf2)l-8*Y?8hg^ zN*~JOHeNYhGrW8GtRvfQU$pvMIg6uTzWxBGgUrcOmPN0_&a79jlXJXW_%*b3$FH{A z#>JYGZi!r)@Idm=Bs)HLpQ{g>u5RXhlI3L(cJpBPX`36L?l|;qV(Q>qYAJJ8*{pMQ zfD+Gi%g04g>hq7rs;(~CH*cHfHQlghvokHZd8~Kj|CUjC{!}z9Yg?Y#HrvbF{ANmT znl_`g&6885=efi=>z!Sx$9b}Dn;hEobZe|YO4K{A$jq{xGujcJwvVKn{SZ{LGdFbPsRXz9A z>zb)nQI9y5PAQw|p7H9#(kTy8xQ?n^UF`mCpGUM<_Tsniv$#7Qw#-z$N~ znmz9RHrOnlZ@lPv(DEt3{aS3w&cs|O~08;PV#J36ZXnIG-WNLv(=_5lCOQ!8bmNWG5@cl~(eR#N*fBEAmQ=Z+E`&H)}rgrLVnRY35s^X^>^`faKRLbW3?5lWE zy)bFB{*(uFRwSVEj~ts4%pgy?5E$aFQF?~nSp;_Zgpxn3?FuRQ~ER%$p+nt1<%zj7?M z&!Ux^EuKtSyjOX`wNcTVAoIR6TNPYcdPI6sm>ey?czJ&NeqGJO zP59PtD@9I=_t}k|Z$%4o^6N^sD$H}=rls;DA>q=EDy}a-S^uugmgLH1O__LstKdSx z4351qA(uo}=qTn+)wDSo!IBtfx9WvzRL-^2e$)59JT}i+yt^t@H(y6nvsR^5C3$&i zyiCYk$tSa#HuYSolKWU#YaFrN$McI*XP;-75L*F%zkb&YwGa1$+`Z=PNNt<6CiPed z6aSjz!^d_roz?X{$>q{?C}fS6)2W~do9woiE1#dfYUbDM;N--hM{BRxIad^FDjo=( zd)TJqK)8X&^XoS4S(gsyZcE>nnYWHFtoQKCJ~MH-_o4?D?kKkTm*s8kZJKv)Wq3!1 zrl+N(I`jJSsMimu2PY8^9jcD4CV6^Wbdu&^3bzdVz!}t#iUKqny}+0`wicjcw2WtL7Ci_^A=OBH)LA9))zp;pPVX!(vg;#Z3g+iN^(DH(N*4>~f zi>96U@MKk20q0Zy#_}-l=ChCX*>IK3N&aqc>uWJxe%r&h7bi9ET=6o<@$UxHZS$sN zJe&OcT>8GPOV0FumYsM@Q+n!#BDM*)zr35bM?s>;@6D9C2mLIBC(bE4mN_YE+VX2& zQw;XCJX=$%)o{1(j0E?Dhbaon6C@)mmhktBK7CsFJ?`=5+zVa$oD)qIwrsj+pYpEm ztBvaek@n8ODRcMUn`rrCAHRi%i|_7E~FvWbT~% zD}H1OyKb8qzRi2$?vSmwwrmQTDmQ!gM&Icnk#f#DJ1+O>dfd60)3BtWz%qSl%%1Gz ze7^M;Keue#p=ZKqVOf$FuJc9q`1JFk$2r$bFqOWnd}rocnKbr{)^wTezqNg4T#@pa zky7mu^`>m8%F-2|rv;yx@Tksj>ze4?w@uS?KYg#wi`c?t%2~V2pHu}}R`p})akekDY{pY;6 ziLYbD<|-#=dR3nh*eck&o8c#4Wmw~K9oKtj!@eE!ztQvO%QvOyJD-9k-rMfh@xUkP zhR2sl>)I9@=L=rldu=TbPZ4{5)Rv0%37zR%+$KsXMZFE%cE!zBpKoe_#)RG-G7}cq z`TTu#UZt!clYOU9hMAgN?$$G1hr}K^H)p)y^?3Ws?7%C}34Ld6EsM`(M{}s|(9Vrb z+_LBKa{bx!wC+5dH(~4D`0cO6RGs%k23)@Py7I~rgASvz2~)IJ94ma>w`a9+u6XzUjxQg+ zrSB3r{`Q@Jvrf^R+r1?f51j(ub+s+>U#R$`|L&6@Im2CvH{VY7V0HXH`Am_etY$u^ zqhDvPpXF4}ekQ{Yg?B#%=~*dgyG36;^LFm_Kevuc|BlkTpd*%GqXBjj|k?wLI^PEK0B+-6$ztuQx6%jfedjvv1+uzkw?t3}2wPvbV;4GZho zc5_|%U87?wCfpXAB&_BcWv-gIXe&#yY>2t~I>X(|71sH#o#lILSYI=@1q z^?6puokeYP`B)YvUpy)M=eSmM_T^cXPgiemxad{MQ+!r+dQsi?svYr9RoK(dM0Xum zS;#U+kx}8H@x*by_av_q_SbvbcN?s&X-ZQ(CFIV&zfgFFqR2 zpRP4JsG6})X7*y|s|$SQ#Z5@n&FtT@RGGPIN?||OR`n0_9xq?B@16Htu7I}Jxp$OJ z=Uub9Hus^*1f~uAM*LB$x2#HDyL+}#;Lc6cu0)-bWOSG#VD;zTt{1+6Yqz|8?CR5T zY*DwB$?}D(u4Xth8qLsEDO>ne&iiTO+*8l2S5I{>*I2UHvZzCa+jcECS2XXQ4OPtF zU;ec+yIj@q(Wg*0BR7vnu2SZs@5Nc}Y4UpPj*;3ym5h%nKOf5~UXr*fsY~*J)2xU? zO*@r~#P+Bp}?cX@fg?z((XcVQ|^=}QmYwS2#kfcK z(&nbUeq3U^yE3;vW=j92C$%Bx8Fp+~9uo9un)j*`0be@p*2jj6h={8SZ$0oi zt5Yg!%G52r4Yhs7q3`yqU0tCX^;kbSk)wb=XlH1Drge;mrPq|o@+E)f{L56o-E7w=0J~sCAoyd7|Vvu-?YQp0K+RIPJ^aifnW)sfD6e@Y` z>S@hFR`uu4KL`Jjk?omwjN^IVUQL!>=bHU{?)-Hus48h$U@~=W%K}x)moL69Ju~6N zorPQPuRU%!pXb`eMeDo&@XT>G7q{z|k8=DG zIe28r$?yBqXD#j7YQB4Z#aYj<&uo9+iqT@-uA8HMtBmpc>X3=j``j8t_&Zdty?E(0 zY013h7HeHo*;O8Eg$Lf96?DKWTHD{K&g%Kwi|H4|uX<`4>|BxfWX|$=mR-NRpHx=X z`3wK3mppkiF~^H>(=|?}yDDGT&)&6D`?J|Rzbn)3dRneuX6H6tqxfq(-;^cC_@}9~ zd`rG$vHisPGj&y;wqEqs@m=`GdspI-bpJR0<$s>m_+RVat{j`?KH*gGzGpuV=YC66 zUS?Kav-R7tc#U`euKZ{Cto^8MgI3tSt9svDmG5RsPg%F*-TLh4zhC$&>IIiZ-tu_j zux86r6&r_NXXJaroVYG6T|KorQ8PH7Rq!nPyAaQ5%WtL>Oy<5i`B2arZkNd?<2RV{ zT`W8H{CHLMswl76D298U=N?(|eSWpFpQHVc+RkZL8+0~>IM{D6m3a8kds`(}aQ2sZ zg<298%IY@94JV#fULJMPX#Gs3(-;4k_ewov`?~7QCFR@q>r5(q?Iuk$yxu1y_{~v$ z=GVM;EN!vr$=kgjt@$mj*j>zbzUh!h%7)Xdfyz8fHI*e)CeQ?qyb?06}yBe8zV%8Soz zOS8P>oKn2{ zr{2hv3m1OGJpPqA<5RbITC#0Xu;$yj1sZvr#gdxO@AzdcE7Z;Nihf~Lt#xQ>(U!$c zi*8(badJZb+Lb%z?qc3MFX|xg^FoI7d0P7eI18FA`##3*o5?dVDALZK|7+P||CJ}( z)g)H@?Ov$0+wLOsCB{gVcgnkF=bhazU6cVCY+JXp&q9&$7H(>jkg3*6e& zV&W1bCMq76xp7<5K5D9*OW&N`C)lUW&DCAXpfYjyvvpH0n=jXyW6`|n&YvCEy@Ql@ z&A7DZ?zsaiy-Ql(2Cy&~&TDD1?7FTpr@-@IvHQZ85g$^o9DWt+_S2@&^Q^&I@vMCr zziZMIcUIn-y7=L=OJ^1=S$S`jUvyC8*H35N-$=FH`_gST`|=&z?I%tN%v>Kc)4Oly zizTw%T&m30e^vS7L|(619~I`#z2@4DZT}9X=R9c5%zD)H#{A-Q&$lwnsvd_pm6>f9 z$X%_f5{WfjdfnXbm9EiT??Q**^**~cO%!Ek=k!#W{K3z_$iFT7sq$o{0}m&?JAW;` zpXYD*oy%U@a!2mgyB^xFv&Q1+@|!aAXvxBeb=GD}W4P20j+*D-JT{G*o^H)aPEw4|td zC}>XzI9kisX4+)9`P2ERDMr~wJKQGM$cjICpSLwWalySSTODVYxv*cmwPC@en+#QZ zRiCZNF6+KLE9k-9X&1m+9L*B=LEr|s)4ydKW|_LtOJqvgukmsMk>-vkM)S(4DQ&{9iX zdgr6fU*A+Fb{QW3cYOaZAu0Jam8C|#f4mnhyd-`)byM^u)tBG(h3?*#x-XgKnSX8y zpNONv<1HS?I2H1bn+8u8U;A(1M6YBcKI&Rj8EzkQ~@ zs9T7olK*U@*nI1`avDxQ>!<$ht@x>G`{T*}E5CFEkNmX`@55MPGJn%SA8|1;&%=u!ys_JJ{bojDu34S;Ty=4^(t2SXvubXCm6vOolFaj* zp6#^!I`f5|$&@`Wyc`d3eEIoZea0=m%Ji;%&&`g_thy+FcG0PA9`%zL3NwO~b-9B2 zjn-(S&nxopjk;6tC}H27t6ZNKCwMV#lb(`%l1KO1?H~^4Q<~NX6cW-OJdtV2T6KNa zeAlh)Zp&;~?y9);Twc*}_oUWmx1eNAUmFJNX-lRopTS<_sl21+`pTzQ+@t0MFR7dU zLc-SYmzqb)N!fF2_g%N;HmRGo$?1$Kl_k!v+i>BuNzus^i%#zl3A^(JcjcR|e|uN;{|%6WQ_Rb?+X}d-G1D zGAmCvob~fyqVB4s%eO^@mL1}>uG@bz-ucIr9qTjH9-i2<>9ycouPH(Y7@s>;EiN;c z3BURHa8>Q;&7W;HL>9U6e{d*0I@#mkquUoR%H3I>c0BjXw$lnmYjWSly*aPAV@*PJ zR?ma4YrFT}ytzH&t#=lW%GB+unnC3|r!;T*#GtCqe&orOQzuux`Ly-*_T5)lqg8a9 z=9essWy~;{G-c_=y_yUH#SNZMFML_G=%BcF*6KMsn%-*r9;~zYZkauO$}WNCTjJrT zIkgIOm>3Qmtx?(g^6BZmvdQ+DNBMm&zbu(_a8sV{t+@KN^D4I7TP>ilzx;9-huQZh zlDyvAoN~3JHf)%p`RvL9x8p^Q&q8jwhcqSb%1fHH>p=1LD39uSSLKq~*G5ELdYf{2 zk5;mid3kfmuCvo_KV2adthi#WqGupu<`eb>lWIbiRwS*CHCnRjJ@32|YrWzNzJ{-T z@u|40XOF!2uhV=I*|leKV|XOwCOm< z`EK>>Q(CpJUaFl;+nH6FboPCf>ak?6N)6|gnp}Do1!nKmcOP1nuR1gN-tDsQ0S{8m zXSYn+dq9=T%TY4CK+8j3PV;=Pc-*C^wbP|ley`T{_T6*q`LzC|lMYUd9Dy1ta?W!5 zLchqZ`jm9ZJ~KM~{J(i^lhs!`zIrxAT<^~x(e1)_w$ARGUB{j4)^5iAsli*?+GS#eWHmB6(dzSMTPO)isrp6A^s^64C(XStn1LbA;({Ufvg&9Cg$ z=abGkJ#PljN=M-d3k4gW9X(>zk}`EQL-Fla)rcnsD*o{~izD2wK97l3ikQ_PlxS_J zS<1!yU>aMIzuv>HKmQrD&uu(vz0d#lmi=2Ff0g-Nw)NXS?Z@-KSYG=xJE~Ol;%?*F z4>6ZnFEtnU-mBU^(GDbCFp4QE<&kv{fZoHarscIjjFoD75n<#(J)!h0W4!d4O zPd#^2)W>nE>GOpP`Z}~Mp5A@&R$er!M$@~uu(0{CVzn zQ+=b7ZiTOi6nFR8`Q86~ik-RK8C}Laf$A%Z42qjSN^MfT-D9hEW{2ys#V0aMJDx_z zaXnk`K#nCrYQ>uC5rw9Ex{toP*6p%Xl`%Lq=3t5{w^Pu3Ury(Q^<2l^B*?jK`0KFg zuuz}q-^efZf9wvvd>`_B&7`{zjpl96ik>4KEEFhp*7RoJjp$c9qc5vJ*t&zIX-VUx zCF*t-GHt$AAIqLgolb6Erg~F{Bi^wXvs?T1qULY8P1K; z{cCF-dTUAL;z@5uRbWtBDW&&&uCczWq|Ldz31epQd)Jk{vndC?np z@Xr@Lvb<`G$x1F}-4h-x#lOzYSU2mT^~$WPX}0@5T@gz$+7_cxqN2{__VBVw^T+Tj zFJ@1@_;cB|n1c8_i7h4n8F;sx?GLj!9i;0qTd7JQ$ffMsqia2nCy7ld3b2!WX5_B% z`uie}-I-6KouZOz_vS5C+`x6{Zo*=f2hX|e&Lyp@)482ryhd!<^eo>~oSb#Re0M}H zU3pQc$Q5~G)2r|uOne4H#V13(K1zL0Eqj^V%-QzzZn8nEjpV%Pwdd1|T{EHt_?Lfh zu-PT#TJwDM`H-!dM{W1YulP6p=u7U4s*>ldZ~NY_{bF-3cT#RSf6>}oLRZVT9L>p3 z{JXDQ*HJR)wpN@|@P*ZxtMq+Te6JdYtnlcPFACaoTQzn!*uRVEz1Lv=d>1XxvO-~V#?c_D^5F$bGMw#S(=>5 zyKCu6OXmG7@_jq@>iVV?&fUEH>y?uC{;Z8l{aaQ~js0N%(^~QID*cas7q;iVQ_MW) z)DT*}^z3ZYW2{{PI}|mxMcfwJt-55&rxRZ7l}}@opS->~*L$VP@(qeJvNgTeCG@YF zdxU@8>z<11Ng3MC{zhLECd=}<-{0$DaZ=*F&3U`2-z+wIKA7Bp@MoDS$7{n=^~Zkx zXP6mqcHjQ;>&Cj1XEf!06lxP`b@7^8n3c+3RQzBer`P2kmGzo-)A(L>M(H}=nf>O) zw`F?f(zOR~$E4ihnsUk8pJm7EIiDQv@8(ixRG;VeYEnGk+>5goy)WD!|Hze3d#ktp z-mOgoI_By{IN zkU`M2lMa3y@4trVhp*JRr8`@s?eMib8gm}-%y}%grl$GO8a|U(-coC(`KqVyGAx{$ zUwTvDmNzkH!%c0@9GwIKrpf(5uHnDV`p&h@RB7FOfbxESW zu<$&STaDgsyNoQp2i>$vjyZfpKkgM=M-FFr}#rn2eYmxYInPe$*RVg4XICm|{S zNNm<|z8_w1oBgvYzR%>_@%GYVEp1hvm6|Eqn{pDWlx^MXYlD8pZjUW}rgA*GPhta; z(B_t{)3}1XtUm_7Oj`jG!-MGg6A$?=a+fB^VY1hlLxh>-WR?i&D=v`>&psdoj8&+H2?Z7KexDvpzjrwpUN2V%3DHXMG~h zw#~{fKBt}F#Z)k5W0yZ)(f8aY zz2#Nuwz8FCe^$$!`fKy)tmhA%wflZv5?DHIk%5~?{x0SBe5qrJ-hb zWX|1T;x`QXxbJ>a!)oTvb|KZbKeaz^Q`$7`LbST#rHLQB_6j+k+Bs*%)gH0OzvNu^ zrQQ_t?mZQ~+1w|hN7DJyl^2=WGP44?gDNNX{$~(eXK}Ii@?^=&W!j=AXU~~keDt{L z@rdY*zC}&};rEJr_!;?Y;d`nX~8KY}r}9`9K|)3d5w&Zx&Z~%KUocbwHM{_-@SA zBeExVojEjR(KN=7%oktBnjfw{GMjD6wOO++N-=NOFneovCDLfoBF98-ui0@|eoWXr zwSM2e%{+5f{4utAGBuOcCCy;Y>4RQTL0j?^8s_eszNJZsfBmvdmddE+;6?Avo|>`= z$$z&~*7iDexWnU))092AUv^L8Uvqig%!FNnd4dzamguN@MV0fcR!Jy1$L~0+H^x-8 z-RaO=w#SxRV<(#a+_-St+E3TEzC9#x;>!lFs)?ue?2m|CJk?^`j{gkBU*2Do_x$2} zQukcU{ht|Kw*sHv;)^|}y6ASnWF?0>F1$sSVac){m4 z`Nqa64PK#>w`yq?%w6@&?6SVd`)R-Tc-QW_SnPXtwup$!bi=Kw+vgQ;4k}o`&OR`z zzp-x5oqUs0&$D;u{@b)=R=@k6!hnERvwrXV&#+PU;pa^<*@10Wf~Fi#b@Wt_`8M+z zhizdjzuCjIxVaa%t*%)vvb%K8X4S;4Y*Svhte7%sf~O?&GVQrP%C`HgzO0eWr=?u! zA!)(Ke5Km8Bq)Eo_j=wh3A^mROka3*+Wk4Zw^s>Ss@k+W#(Q_k2L4o;<#pq!-rJ(~ z)Z8$q+vc60lW*TD^iVN+(ta~>YeKQiojXomevHr0aCxqY7Ms0w6Z1KvFDw03w|e9@ zoX>cl5O>1K^Z8YEtw4)s9!%5PCY{}+@>5UAaC?kG%oCgCj(28Unpt1f?>OPoP(FHF;eB%H!=PSypejp(~XhdZO=2rFq)Y1^ZQf%s$PE?pJ=5 z5j1(qgh|EsUxr(I{c69etfS3!|GeZqj%S5kFF3;IN@rc3wMz8ZohPA-s+B@S?*(js z=Aoz3aOngKL*XPwWtrFWmiArD+YvCOXZ1zyyUp{G?JiV(UR{;4+4B6|IDhf4^K6BW zE}PbSJgYb8Kf})2%--OVOV?*NJzThaNo;PD^wX;)-W^_>3@@*<)0=9Zd;M)yYP;^5 zVVa#Pv2YFE%#K(g?(NhGvn5kK5x8E1@SSQ?*0ClYgKz! z!Sb^Yzbz^6;5pRuN~SJ!=QM_Uhu5lfJk9dz&saKn?v6v|JOV<6DFx3`aubg%y>D{p zsuk}A5ueNF*80kw-Cm{f*MYgo;r^Mf_H5nwg>RVN7F^k^sO3GIWk#A)+=Nfj z9v+_AD%%)Y(isx7POh`8KJP1ed-s2a<*I)nu6yP-9o_bPgUBP9 z5KZ=({!2D~_l>anyH(%mzI%pP&Gm{nt76f(O4BFKGq$dDFwg4VE5FI>guQL#t;_0; zaTlVkeMFg0AKw3L{hEt08&(>Bv`r~{ep_yGx`?k+)VxQsU)7Kx^TrVA-dMoXYeiYxIujgJJl9*pM zD;5^XTYp=#_Db&UjmivyvkI?HpBuWely%<8#C|~mmx}L_e&;jwR2w23ouo2WXlS~+ zOsZn=H!uvny`9%|>4N*Wlist%{9ZNxbH;?be0v^NUe$P)Z|UiECHQv$=klfTiMMn< z&MXeOvG;bFNyR(c;vGh<8%{WQ1hDkp@G9JH`Ml@RzG9K*5+}X>)Svn59oi)MwPKn& z%g>^kdXZmJ6*~))!lqplD7bZ1?z)iEvkFm9N# z_)3=WfmGJm>n&@_zU|DmeD9w<`MdV(ErruJickDh7yheX&1T=?X%$I}X1^4BrMysC zQ`Tz5*Y%!!y4JS?G}&3ouYK7tp;hCT@^UM&Qz2WGH*4Nv#6YX8}`^MSbZg#9jMnSLD4 zPfvV)YQy=9R~t6zt}hGJndI#mG?{n$gsCNgUYq9heVp=HPIC3i*{jxlvo+5wySiLK z*4;L{boqmog^f-jB8ytSMtT`e;y9_c;&fHK@3IrigMxxNOfEieU8-es{N1Wso9-ss zr(F(8%;GTH`KvDIj@E2do+YiVtpZCw*-WVnZ-2G+ZFhh8$?x@xlRHlvPt9My?c~)% zU$sm=FK^M7T40#%Bs1Z=dh*tvZmE+jsh z_*HY|F{@&UwKl?u8J9NSROa$Mz^d>>q>6bOukPdE4jY@=`Q94St{d2vezDk<{$#&M z@$B{@jzG?+@5<{7PW(Q$YyxxMtz6av)0rN%UERH2b-lc;(*@~pBO{@ua>)|!e}6UE zV)VJp+Ube;Mm@8&U0+#+Uw>SavetOHlwaV!$`_l~-pcno7Q4>&dNAAbyOTnWR1|jq z7UGbI+Wex}_RmVs%b%6v=WQ^sc@^w@ftSC9|6rhOVbkP~UEWI)B2C^ft}BhmT_$s& z<&a14raA8v_**RH_B1~CJ#kh1=5_CBOI)rVnpw)a_Y7Z-iBr&&B@@qQ1)hyFef0SJ ztjOmwelPxNN59-Rx7)E@ZIg7Wrk3}vPdDBlTPB=xVWMvIl-HZMmbI!h-Ej6ZxYcOW z=Q*j#z)I!w35n<7Awi#8xn3;(YrD_(=F9N^4C1$fOzdW6a#;r^m#j^{r2gvKnHBSP z+VmAz&I>(%Ng&`?3}(E6_)6JA`8 ziP*_9ssG&VPgc!yYNlFTG_x=-e|ma)Nq=rba@j z<;;zT_n9V&yPV!t#uas0&a!aX!8?q4%v)^^%ABhees#t^;FYw`mSY!Z`DVthy00p< z{PZc0Nsqm}wwcdweYud;OQyrg!Qy#PHuJ@j(!JYl4hrd;Pif?nmgbuODrD=#hAB_} z7|;9nFZ79f=|9Xjc||)5 zl_KSNT6SBfO~18N(Y49Xdg_OIf$N(ky;Ve(-~735mqlS#x~#p+!+U3UewwuBTjN!h z36(ta*ZtP-TeG@s>Se*br<1;~mhLUw#rwuR$v#J#oq=_=dVbu0hS^KQ%l%E$-W%@d zGy83Q(&_T~g0m5~q;98P`gY~@+OSIkH`VX_SSlYfZG-XL#Vh30r`NCBVe77Zlz;1| zTK<>1a<+L(53A|kDf*+L-@Z(;y=tfPo_mWAXI*RB>97BKf|5&D4Gd;U(I3*@!%Y(S9D|a_{maDch>9B8fP<>nRJdbBu?y?7;`RFWWG(2c`X7aVgEmf8h zFYgDHam8$oo^tuD#rxS0uP`=EW%6LZ9k*xSyYpusO`2<(x;W*6Rqf2O)3W!&H|UqU zU09ZUtSipTe07q!iI5+k_MxadGt$lZ0)I`jzx>NKY(Do%R?h9Y z_22&0>-2rRcEaRt+x<+J#R_77K5yah67c&lHJM#~=F>SvYiE7m9Q)ecBU5F1Zf@RB z&H5>!I|aW?-Bx^gk)}@c%{JlZntFTop7=6h{(ApKo&itKR9xbXd))2UIAspYx_h^? zzsk*6AAi}@=t@G+$(tYJ*KCofwZ8JanQ6sG=jgt^tC_s40!w-3y(?MR7IIH)O=8Uk z?Wjp2uRgald9_vlocMiZq6Z__Jt4!(>#~=AtGOGK(Vd;P-$G`kf@;EJ$=9d$O{x?$ zyLlzXymaqUyL|0gvkuB%`+i*c@~(Y_*=4uNE_~iy&e&8`_JHdb?-%>)qOZ5}#k8-I znz&V1=!wCLK>0Z;$_smyoxH@;Gt=l%uo%5RL%JtkH zB_cQFj~_f{CNnv3o_y_1*(qf^L4%#zxJ5NTzIQi zCLwwKaj(59OP=(|Pn&FUJ&k|)j(HCwZ~0A3{jR$6#uSq&D|G#|FDWXdU!T9%W2>Fb zH$|@J&pc#~J5TnWqoVSQ9b$qqM^^7NTmx#EI^`)b)7kNeNsd6ZRC)mxc)#z_m&ON>wUF3j1KU~^^J zW!5b^3eU3+TCzV|w}#i^V$8JZEKF~wS}g6oyMXiF)`^px4s9y1Dq>#mv~K6J(1pAv zd`DK88BB1h6>02?>o4Ooo)@u_^@4>=fj)DA%pRL8OOvIFig$9@wZ43t#9prV=DNv4 zk(Wzcj8kefO`TJ}wkqA^S^6j{`n|@}4So;U{FMyn{0NTFNZhjdmgs~9eh)9t8(Epe>&ypZ7Gs zEIMD*`1MMAWB6|GJDM|7JDwO;wVGaiTY2Etm8mU4j_S*ePs<*Elya3Tp!SLfV;0w; zkg3b(A3gtcy?fwP&tQW?&pF?@C}o_U9U$5;iK)opc$*{p^JU*JZuYw$w)K7Sri|iK z{lqpZ691hQh`c>6D(?_uEnSJ3TxP$Q!OQ`xK@3Hq%3S<*ya1vsUF7 z8C*WOVu#+0L#N8lJLhTWd|T+!sy*|3@T2wdD00l%R&MDPvh>35q|$A76jGMx z?(_ZnqfXuQ3wLLm_cgKGh4)TbhCNH&FRGe1VO~XGyoUXX25awPC)q zMf~yD<7+A|9_)2o_8_L@yMV5c)Rfz~S~?4sJv&moi8WO-PKd!~XY%{-tqZTXCN3*X z@4lOEo2Aj{Rj+Ys%GSJRQQ83`Nfm9@%&|;=N#{_dA@rZahdhl`VDg#m6O}ck7(|DUJ`mU;IOYMXV0bCCtj@z zPYv38t7Tzp;?dlvmmi7tC@s3=)>kw;&pr63{_!fm3Bl7sHH*$(%Z&EfX1w{K#@yqX z$E<&U^s-nau2pi<=X6n!PwTEp8@D>9dY%XqabOme{gn0SI(y02iGO8}?DZ|VRBrKI zvpDJA?L@z0wOgCprU(SNE4ark2|K6waeni6&(~tP9y2+(f_$bu(p9`*{bBL_x9jsN z7kyl@&)-~6(yzX0(_XVF`mNQM+{J~S^ zSdoZrg>2@r{|swQjw}k#o4r@&7mxhp!;e?&p0$=q=0!kMW^T;PH?qNtwY-YwJHIK8 zb93+g=)SPqEMnW`n(sfQX1%pGU8(uz%ErbsO$_f}U--28e)9#Nf7($EH@5z6`22fr z;H`64_&p}R`Xl?*dE4gA#VZ3j{e#Rk7_4{I{8@EoQ+DJWl}EbW!Eq)xXPwGTu+6VL z(05Dvgr=6)B#(1meg^(}b06J`w0N>fUD`eC_M|($GPmFFzd3D&--+{YRBYUh0vr_* zo`l=JR%P|6^s^ACjy)~;CFaK^OJ!U46(N1Mp9UXvd3n+x?BBBHLJ9AT(w6mGB>w%J z^P}{`s_nsrhug1Amv^n28PS|tWby(P~=g$xJGq+Q?^(Dq-U zQ-vm9e^qfjJ~q;d{Zyb;(QUr#D@|5RTOE`3$WZH^(Ct36zQzm1yH~z{+4bt;v%rac zHRi&bO1CbG>1HlccJ5c%cGGK4#>34odbBSqD<7Y6j^V`ZSx;*d1vk82v;Wpwg$aEZ zSl>M}-XRoJc*m{q^vt9FU)iVSb3S`%a_jA`@`&AP&Iz80?@qXS&wa>j-EhEP=kfDZ z=0Szmj+frLBdcw@;KCvAKJ&)w(;XlG`}Owft3=h1{U3^7etgnz$F|l{HZODaRA(tz!3+GP^WmGg=y!MOT zBR7$dEq{bhOZd7pmkvYCB)`TX_E5B_+)v%=waIMc1z-sc%JdUicp@-Xt4Bj>>bFXJst z)@|99p_}&g-IcbOh{A93eV@veoL#28QMN7Ol)JTmi}*C%ejlH{XA2)LJs2oB)$&>J zr0HS|2beXUo~bBV@9#XdSAW$R9-cTZDa=r?KR5gY5Gc^9^=U%5mm_)M~; zZP{aGhRN4O3Zn%ywSw)$zUaKv847ctgV+Rs@t_0p^F8F$QXI)p1t%~MEz$lO$SI#z?0JkQo}O&d>MalY?b%vw^7x8)|vAUN(k%a zZ;48Z4o|qvJ70AB&B^~6y!Otut8f#w^YfYUR8rINaxB-5nQ~`3^QQ^Tcq`8KVoA$d z1>q?cVhck27dbp{uzof9+Jz^}J!0;aZknJsF*<4v=beK24%LP`=0}LEj;!?0=8aT+ z>a{uQk_L&g+N$TO1 zl$NQkQVEs8dAYk~Om@u?Eaeh163td=FrK5mOe^}J*;9*mtCFl29uH*H_U3fEcj4Pg zb(x?2Zi}JJx6JT{W@&v+HIbb=?>0gqRXKeev!ydzQWdA!a=p-25o=p!h4)uedRHub^jUqHlCj*DfjBhe|OGFzbQ}GiL^^P^KTZ-)14Gm z$n|#8l!S*i-xHe8&sgWb^`~cH-l-tPyKfJ3%FJnLWjwvY&UD-Nr`E?}on?7W>^t7p z)bDYqt0hnN>%Gm7XRTD)*cV~DVY18g&Va=`7v+6A(qdM7d;6wSvMQPvw>!&epPFI(%^J!VkG2_~Y(5W(Jw#xS>Kk__hy~?uSiums{+n(QF=XbtzD{Iqx zlOsEQ=?4BKwsd~GXh>MAEa2_+t`n~o37iUBPIVxki0UkR$UpE#=3ybzYa{yx#Oo z+;Z`bl` zYw`1YUb|Nbms!V5TDsPy_pYUo*XH}z*XCT#TcmqTIMLa-co*DHu;X{ zq22v9Qaje1*yA6irn_^}{QxhqPuFC$Js4Of6>%^yPVAe@?)B)XYIe|+ExT@+O=7qs zw0K@j`|sD)`o6h}M^08s%6wb#_wy`gE$^JEtz7}X7yYzbk||w!cdo@oF=fGWBN;u5 z2ilA(+7>dC-0rzLB<~D8xi4t@Y|9POUhA*@EZ;dj#LuOoGxxYu-zhJV?P7cfjO?AI zYu#m5&z`OonX}C0q@SYK^PNXkG%5u6L_a>;vgNjp#nNq;tGPQPZ;9CIBrpg$e4XS*}{^!6%b`E$jJ}m(IW3eza;T>|}hSzMGN#L%7?- zori9oo_gh{h1-jEmZ{6x)#qh-E;aStySl_X`#s0|BhfQ|Gy0hCc$F0P-S5B_ra8^c zvz&!qB-rk4izrrfbj;xLJX?^ZU+o^0>zey!-%5W6Ck1SokaDh6dgqTPPc4q?#hISezH)Bgw)qpeZiSpURPC`Kp?+2- z%j=FgOLsj=YN*Ujo$qdEan`5kkikkj+8 zt=*`*E$zF>DMstNwO3P~FrP@M&RX}W*0VU^aAIy#?a3Jv-1TOJ*}n|cyLa5}kfW!< zLycSfTloGn@TIMLuYTi`^8MT$DNSEAp9od9v@HI6wepqurOs)`CKr|6ELp4ZrsxqT zSGa-brM+u2c^mpokeaoVTLb0-T0_ec2_ zuM87eaIs*8XnKCd@w3-$&=@op8JRWQ;k;MA*{r+-E3Zl z^Gb&wpXLa@vRvW6(>!JMg;oW@^NONVqt-EBj?Pah&pChhWy~tAZKtP{XnF|+`D}go zal2pi&EtD5^QSzu7W?g)^W^grX@$?{jXx&Mw&*|3DRt?@xmk_NZ)`s3-D~yfvZ|le z^R%MINel-ppZ5KG_v@or_T(<+J3pmsQxg6-aNQ`md+_MnkdTFz=RBWPN?m*sU3T4N zr|0hcX>l@q71qgn64$mG2h@r*7;omXklT=Xy@$D;@145M?b4}5a=X$WtO^#pSeG%C zN!9eq^LdBQE!pFoXk@~Av$bb+vBmkfD?9JrJa;ST$urj0l~Z=~Jb1DueZFDbqb$y_ zZ!Bp~EPhuz1x=mY(%^YqKiAU#a(IZ&w!@hUMR!D4)xIySdbOH+8_P><>x20nAzs+ zPZ=idWaZ>toZu%UmCGq>If1SC{IMB*llHKDYxR+lOW$%}J-e3=bJg9>^V474uvnKP zRpI29z4_XeU)wf^_9mU3cxu-lzNpQeRnwyv=|nH?+0G}-W>T?ci$L3iMW?1PdUD%M z=Cqqu`CLLmR8sNiTEEG8U=KRuUe0t@&6^>5UNqs!KX1JMca!B@s=Xr%!Arop7n0+|6HyP~o$qRTgWwp)UsV^eaY=pLyB`~ms zw93_sAC38Gcq}`m^Kw?v%Oaf_DUVg3Ogr`XxIp?bA4_wQT}{99r*ynA3*C4{*D^?& zuate-uc-G^+(qI_y|X?F*?B5d_N0DGXfWg1x|><{$>hG2d1*o>PY-@RJNNNU=LyPJ zy=q_HnZ9A?Ek)_dm6|Uj-7h~hnReCVef^4BPqS;`-^+jgTO>X8-s2T|o8Fg)mQ8xT zE9}wf+~r#$UllY=Y<|G7#BWF2rI2;+_U)>ho}D=@I)8gE>$*OT+VWD9pIbtgZdsQl zqP@y%+T}CFm9i(Ui#@dwiY#@MJ@v9b*LTL_>%xx?_UHDO_C)mEipu|WS^UBB1(rFJ zYL}aeyDrpI_2=wmSp>2Io^M<{$q9B=F5*yL6fYv)U90g<@c}5 z9rsJ0#8~V-lD_`c6{TOF^td=#J#&{$JR#C}b19?5LI3i8yOR0AABDqTx6Mcnh!a)p zIO@u~?Xb_b$@ixyGKi+Dm&ZrgysoyAeflZC()N|jOQW~CwYIUUYxjT>EmiZi?A}<^$D;Qkbxpj%=lF8X!UO`T77pi3* zUzGi8V7>F``>M|&S=MuAAHDYGNoP?nJLkHS`OzH;_;)SZt#MXCAuVZQ{k=2osW zogMaK`_DEf-Hj~~Cxdmj1l@8tU@c_+N3c~}eQMOKl~=WW3vM~8BpG`Bb=78;+c!6B z&%{itIFa*~4KtOzWoL=KIG^J2&eUdK({r95)#?eX{C1OSg7;6qvu>@K#-ra!J8a&D zt=8MDe0JvT7ngM(+@A3xnlqZV1}x57{G zg~rU?tkDy7k+sa-D~99td3A}OhUa!Ke^DBjaNA7X^FI>{!Uwm=BZt!W($(9;#qy5u3nn63}u7pot z8}j(CZ}5{>EB7qg-M_*93iSD9O`e*a1Ax^daWxqI)te!JyeVBFtD`+rXTDD-Q? zTL0SM}$85$EpUH)rwLkf88MHC9*89{Tfp z`^rmE>Sme}A35HfziYW_-rbyjJ%Ma4m10(9>&ow!vb+~_?fjHlbvcmV!=hFA^rWh= z{yOog56XI%AJ<&U|FUTcvy>xyVq}a$~-mQ+T(=sGLPpc zYPKBPRl$&(TR72iyWXI}m`#gb3_ ztNis7->*IF=k8T4Zy8jX&M^7yx38j}&Z>DHtIl`%=YBHc-g?rxqSAq=Cz%oD7O54lrO`CjNdCBn=*SBO|yX`0N@oUlRknkrLa-Bk69kP^}Q?lOIZ|8xD ziiT+?6BXkZE<7Z}zEXXvZjniJcH>FbqmLK(mnJ^X`E=iF!{@9x#z33aNb^hT)0B&z zme%B(vv-6CRED+Bo$)x@rJd8Z_+gO6t~lMJ-)=R%{&Y9MB6s20Sj*=UPrtt|S*tFm zaAeA!)~~1h_0tNkt@&`WDDCO?PC=7Bo4Bs|g)Mo^Jk!5%>B}3-u6;T*alY#z_js%}&Gqf_qLZ5+`%lsjTiIw=oF7-%GHHY1r^_wUvfCeLHS6!c!oXF4DXkT!OJFv=YdY|*mXW1w9+b1pCwvv6NvP#9DtNE*&#i!jU^DeU# zy4^5o=joo-9d}Cpopg}*kb5{U_Nq*^f0R@vpSf)Np9gu~y?eYuCRhqS;E=W6C08nZ zcT>T{U*~wnw*#_KfjKCb|6^n$9t2hE47NZ+;Kk;zIv|pp0n%J0^eolEoGOs z_WAt!yy@DvF4MOetajpJye0kCdc~rLhtvXtetSHcUAeho>6FJ7-tEfIUq%Mh&zcjc zEL$!$H;YR1-Nv9?z0;HO17mYH-!u_<`1F3)bdRPhp=;Z`L>Qi|J8EHT8@GQ> zuz8F>UZe0mzBacfcWChkwy&a@r7vowRHv1d;5QqR;=G0Wd>dmR+q&V%)H+(46~f)S_tNFHD>F62-%P3! z$cmeH=I@V_SG{P_gwH(jq?qHcy^zN+Ny70T6a(O4k&BM4eqYA2)G*$Lbn%Ep` zbnWso_gS5q9M+FK4ktA4Tr*X^BW>@`sRt7n^QN9*e#yi5cBT8iou@W=+?%uKmZP@A zsT0c6>a2EH*dI>c%G&g>H2Uqj(0w=ZKK*&38N1k7!i(Ykv%0{ro|v1GDjV0IJePFV z^rp5$!^bC_Hzs#Qa-A-9d~<8N-6rD`%njKq)n80CUAo}aw?}3(#3R=o%-nQq!XvS^ zON%^gK9u*TY3N{)^0dHqgz zIp3wJ>*pKzxu1+!ziGwQ+hM;XCN4E)ey6&b@lDHAmMM)V!mhlOes`rk_vA^|$Wx9- z{Vb|;zh7PbEM`4-^vAascLyBLY*FfAxs*i3a;+Ca#-A&yvtp9vIQtfU z>BxQVba!d&+|VV4n(blRxvWzrHH8#^e)6Ye;#t;JUL0ndLZ&jFJ@VUb6|I{i*TWIg-D^LBN+YOjQ^ob-0vv*=0Nu03LmI>@l%xomO7)%{z$V>fOnxE+$J zI^&J1${(R$eA!7m@>kBWdFY}Q! zep}S7w=%Wa>=$x5o>i|r9h+e*xh&l}ZTm*HPj~Fj8GoA4G|gp_!DHPO^1hnN4?nX{ zT)S{t(bJi>-rdWJ9^05*SrOnhuW8Byq33g$=G7LzSs8lS$#MGf$4BzM3wBQ1c8+U~ zM5X#nraAgKE+NO|)9&1ko_v#c!Ixwbk4%-BFu}0#^~p6) zMfoJx+3#+>q20D?>9X5}#}t;jq+cx2(70T^%Pwnvi0bL>JGQ*Pb3@S~_w^k9T+2xP z$rqQu`}XdtRwi%Ri7>7yt$7R#wUsQz@6USdkX^p^R&%iHR-dleq|$RL;a#DvyiXNl z&iB1qrxATSb<^IxA6$bE^Ll;o5|pu+BD~YXYf4qM-QTJ|XH2Czoi|Bnc=ZWAx*dN0 z)UIvsQ@WRyuKn#76}IC-f_HS`?$8Iz^DKq$`|R2j$e72pWo0IFS!K!(zE`iSLMAqy zyU!`&JL_=Pt-9@2x9oRVopsxKl5L!+#r~aA z-km;Emmbk{H%;fuQrYrO#`|7Z@M%u1m#=@ko)+;~+-FaE_S6%< z%P(Ab^Hk~as^l$;&n)Ggw7|w!Yukrcwr5lWwo0F0m?@!qH2mSRw|-mCUggr;Ic2Bj zvhz9*RT}%}?P7O|T>B~gOrw?PspP`kb+%HrJ2x$ws!|j@XM>Q{XXG=+xK>U5|+HV zDcK{1Wu2%acKZVqyzRFI6&3GyZt_ zkDj>Oj3ryeK58D7DSA`+;QQsc_RQtW{0kFwRJY_jF=+6RIDax$X02!D-j}b<=4{Ih zajLsAfAwh&$D4DZ-RJ8rU{oQ({Gm8@IWD$J=7`Fc|Mu)M0HX)>Q$`?LPxu!9@9d#dUX%bbH-n4!#x8(1w&rcrHdENJH z?V|GhhhO)Vq?{--SymmQdgOftf9qwtGr^N8A~S=yF5k9lZHf+`lUyL{ueEhcu$X!J zz3__6zC)}NgQA>|Yj_=M3UZJ+wZZdP^{S(thyF>}{WhPzzIW|T;beA+ZUsfnQ$b8# z{x?&mCLbtSo5-=x$H=b2^4#siC&a!BYR<^Dd-$Z)=0AhpoPBl=y_bG?cCo6!doGjJ z^qUWliia=>UsmZ4(_Rwwpq*c7)x)|ycVqigv$s^Z`8?71_V!)ak%Z@&oF3=xTLXJ5 zm+Z(+y|8iJH_1Np^2C5CzqzM~Ed6dmx?h{r&Vglvle}4(FqJ{m+j}yn%=WQr{~X><7>a<_zGtv{eB;G z-;6y&s`l8l1sKvIq~s;)7%0f(doCfPk8-tb^NhgK)HRpdR)*HpN?0WHkTaS z3_pHd@@2+jX_urc-nHBooCWO#dt>fy-*&q2?BZF$7bPlsxVFB({p41j&cZ}bAMr^> zhC6aB8A5rVtl4l`{PInv+A~q*>C>u<>i(8UE$a9!J@IQuL+I%P%UP<9TdkX!_fUBD z%*bQs;v{D^9QyJ^bnTLds#ku<2P|pz;D|e`$s#+`eNp9~tJl}v*zzbWT<)ac2I1z7 z3uj$Oj6T$z#uB4yAs;Ama!Jrcfh!f3HcEwYPcv6Ih~)h{rv7NXX1~SK*lF{6IKJ$a zxN$)As+$Rm`IIdO1D?LvU>GIaE1Htqamd5dlW~D@q_@k=Eya{_n zW1t64|d8Z^#Nt%_=j=FFWo zaRS$d#;JlAo|LTUn|*s~r{Begexi9EGL288=DwNb_|{gbiaCdwG~&z zrp%F)zwWc&+}o#9OtSL2$W+FjIXze1Oy+GbRNs^oobf8S$wB@0o7GQPm)44~6jNd5R7e8Iz zTM|^F`(?{i%_Ao5d{zvTuPr&1slRDLNZI3w%WP9+%opXqa8#MWt@7!eX~j{MQ?@r% zW?N?d3{qQJB&wNeUBsYL{QCRLOJ{kV6edNNewRO-YZl@e-DTkwWc{gdK0{{jA_HkH zE=@(7-R)i*DzaDHyEIv6*De!_$@8|vc&|M^scDIB?L5KL3l*O9d^J67oObt;+OPYq z{vYmzPPgB6eSPNZBnekHMt-z8M{mkKf^B>tRx|~wD zx~@NSuh-kHWyOX151F(s1uc?3Z~8W@F6!};)A4O>8Qi&9ewX)JDy+|A{Mz_>rR^G{ zZJ}Zgs@oa89ArKR&dxisaGINklW@;+mQOM#K0dQE4$AiGC}dGrRk!%CZcmnWv*z84 zzFFx4M=!y8u0ok{%8FD~?MQ+Bbjz4B?@-ieDg{!1+qF-!D( zQZ+Fs*5K|emkzJpCyR8P7Q{to-dV6Bl_d*A=BV!pzPq5`oNoeK%*&qs zc>UBO|Ba>}qW*+zf5}lb@oQ%0B+o(}i$A3X({5#m?G)_WY4Kqhhc}-pYlT;l@s=;k zG~Vsl(6pUtr@(@uMeAz%{2SgauQ=tuMDXj4+dt|GKV6&fxG}8i>e{t$jdk@BR;081 zNVt6DxUhPom7G`T&cNq(Cnb)teg2`j?+f#-x+;OWCwcNzKE3pgc=M#vGE!xsWw7~j zX}JYOb$_#_+i*u`%B8K=U(38IyClI{zNPqnT>4Vqed|{;?qQzuYqcQLUXnBnx+`rRXKd_`P!_$D!X4lSF`N-2ca^v#m(n- zoqiF0V#40s!Pf7py&07Ci`{CC!s<;2% zd>$4Pzstx@{O#&@JpUQqnD5V6|1Y)1dCr=9?>VCvG!{%g!GH7m%C-LrjSe4Nm??R{ z-|k)MChN}J%zIO1G*X_(ge}#!`4~OZ!Ml-l%bYLIFI=)Yu`}bt$*D?TS6q91RNHS_ zVN83>7SVs#@2=o$Zdf^Sv1{L_fIr(W9Fo&KcU0F=;ql{@-}$<1uU+kaYqlb@l;=mS zLkPdyj@w~o-&W?Xb)R(kx}Ea%C{L4M`Lbx`HnY=DUsl!o-+jK>NM-5mcbDE7PV2~s zDBYs6ZNr46D^@1tGPlz+~&i8X_=20tg=gAajyREHxZ`ril zT~0z%wiR)?g)K1RDn4WQ_22rb<=al|e6{<~WY*dVf~OPOVxyc_aopbMmn+lBF6&{M zmFaz)!y>mjZuN#j^U}p~@JBmqyv=ey zQT5Me<5g!J{gQA_ZU0{#7WJu*#isb~cgyrscWe|ry6w|Uvv2cmyk5b{cy!0DDN}RO z)zz7qFS5+)`{|y&^cAnWwChIQqU4t$de)bw+{i6@x;j5+(Ug|uNnSz1FP=P2w@_f0 zV#o*#K!=gaHJ^phNqZj0BAkYXCHp^YwLloH-@~~?`3v{)V$%ix7EUdMLR$6^-=q~ zr+l~iZCk&Np{sBA7FL<(HoG2enDo0nb?ZTv+o2_szCL<)C8DDxNaXPfw@+J_GHPo5 z`n+3tdf@qtQXCBDmT512aXR*YAtgLOz{ zs)F{^)PuWIpRxWpv0=-hWgBzzf<4Mvxm8wA<2-I7I47Oe*={1&?D$gC&jA^|j;p>J zxI{1A=Dlzx>l!uZ)vVgTW_{=VH_;AacpGFZE)*a#wLfT5kb9g<=t)$?2W?T zjMsg8I_&nnYTY8Vh$&2DLII!QwKetoATnE+sWddy|0Lou^KdrK)q67A{$s_ui@5ImsiKZ%NC_1UW~qV~^9613pF_ zReHVr3*Xv(uG>sijh-AfI>g+0cW$J%g{4_T9g9{lD0@_lLIS9y=q^11n|gKD?U z`uvxzPv*m=!)tW)<4jerg}Bwc+;Nd5J?PqZ5k^JF-1U}sdXi<%+gy!b@s?}DtL)aP z-x!LN&lyfyd)IQwB-^<42V)MP1U^pd;3JGSfetVz6G zSM5$$OclMcF^N;xZN_Jf38x|)oW!Q+b1_ROFwU9tW&MiNvbQ2Vt?UiH%+P%OP|~^R zQ%C!hjvemXUTR!_oqBNf)^*w!QY=l6-JP*y%C{AKExkLvJUpeZxEW8X4CcMvK1Xxo zDxF&A)%p{joXK2%+h1LXsqfBH!4OM<#ZAE%u35~vv_49XZ}r|K=9R%uTNY?$yyn;e3<5JKnC?vg+0E#|NE1M!T9X*eaycF=b_r&7t_7?Y9|IwW2P} z`OdR)shmTNR@d=okF}j!w>;s!UG;0#*-xF@%+8)WS)=;oj^4%Yb%!bstT%tNEr(N6 z=AU%Ch$$*b6LFfb+)?>7C`K>nDuiN>y_N~eHc)3i^@QJ~6uW8*4 z^R8#!(p0etTko2(^hnD>$tQD!LMJml(7Gt>78~-Qa8bI&qgba?Ayb)qn6EF_n!e@g zJJG+(BvbX=cUUZX)%HEbqE%H>l|SDzKf|wV?vaV7*Ovaev%KGDDZBr{^)Jqv@w#n& zeC1J4_oqLiz3txmA@`RZDy#N6w${4Gc3sSl`ns+C@@1!(Dd%Uol=`=>uFTC2 z6Y)5;SuyhYRrW&*atoTn?kf4G#qQmmotbXCWa*S`8|F;h>KZrUxbwWo_v>f>+B0*L z`lQl}-+tDLdoMh+c==_Wl{;hBuRj?2ZQV54%si$g>6g4tO<35<)6e)~)~w8HcidK8 ze7ADT)OWejoD7NT%FpFZ9d74No29#hDWqx1TcB@4>h3c$CxtwFKE-Ro zuLgxV3+7cy91py<@}I?t?WcBcUafe0v4ig;v-75XzvP`{GHt$DOpkH&_i5R+N6uvu zpL+44HPLr=m*uNDV_GZAmoX$ncw`}4#nJd=6=y8;pV%I zkF@)PwygHQ^F(B6d`P~+Z|&tjf*uFFEo*LYY`dw=asJwzo(GR_F@6ibnVI-K{N#^! zm3c8@?SiFC_7*NGIXdlSdE)EW!s(tfCJMM`wumf$)zV~SxY2IS^93paw@#gszMA_o zJL%3{#bqM0lgcf&?s|N-VF}Cfc@dsAKl6{5`u^y(yK;u(mg`@4zH4{Zc+Kf7GWfhU zF(Q{$_O$e*kg~a}0&aP-8vadqx{qBXSNO@@q-7!VO*0KAEiGH&op&N=UQpTN%sWB0 zif?4KpW8aePtCU7dL;8d!@2&ew!&YowZ%>5nYn1Gy2ZA)C4U5O&*%AaY~l2>OVd`* zy=h*d!`?G}R{mL;NJ$Pxxf!;1|7OjMhDF&lhpNf8JMGm$^IWZB6`@ z@STRy-C`CYTX#kKF=u%hzD%g?e8L|bQr7PsY`P?z*}IU>>Kl{$l8Ia9{CYkAa&gM3 zThm*L{%!hlSFPWd^KnzlcF&+6A5NNc-Y&eoZGrAet?DzgJ#%D4nSRLhmlZ9H4XwHQ zNA=<#``x>jzYki<>vbmg+q<(G6FHBlOkFB{{_2#aMaLJvQn%UZ-`u)8Z&=NkLnth6!t*EZ(cW%015A@@TDHgz1tZznLH9roP=< zXKIlj8~*r7L-t0oJ4YgYSlvT@oU>|EkzKdchM-C2>dNX8mTFsG@#-Gltut-G zJ^k(5R4fjun%xcz`xwL-Rs6zW-;QI}{p+TEEvxh+eOIAkuT@_kX z*~9fy^VL>Kd-IwVnD0mI+q7)aEzVPymN_1H_vOHn>zRGKYj>S0)zGd=ewUM5 zed$6_C#P43B!hqz-&}UD_*HY91J-0Yb+ymxS-#);^$U}2lY-v-DUW+-bEzOE+B&~E zCb-@uBl1_dpFi&_&0DinCd)qCw^Zx?&4E3pKp6#h_;WLv+GjRB_W4E_N6Xg%1w0dEM?40b>MrNEP1}vcdL)&wBK2> zZSQW%Wjz+WsTG(of0c;rf+g~vDOD=M^HM&ocMlhrRh|-S^q*n*!?wD`qO;|G-1q;t zRDOMK+3VVSJYjN?d9SYLT$*>HV2LJU!~spMQKa`y_TWsl7@fW9B ze$6`-6?DaG5+B!OQBUP8#~*QOb4=f4yt%XG@3(-0xOJz!^;<0Vwr)w8+V=CUr>4U# zE4d|Km!B;+dUE#Zx8x6PddqWiJ!-E7yl$EHd0x(X27dQRyH`IleqAbQmN(n|twb&R z<&U=B$NThVt&?7I{lUU_7frrse*f{yDP`xhC5N4oPEWcu>G6Gr-6s}qonx`|G4GsQ z*&m^HAEMsqUT-Y(c0HbZ-D1;kQ;Yc?JhBV=*PY7j`Ye?l&Kvdg(V1@VcVpo=M zD66-YUv=$D2bNrh8o58^m)CPj)p-|p$yf`kZr(0)kmK&PeUmTWx-E8J{juG;ZCTH~ zRv)}9wK^=rH{8he(eZ_IFJGTM`_)Xn$7+vnZJXG$`htZld&jpcrfoXE&fYxp^831e z-KK39Ef#Kdp7hAmYtp65XC1T|CI$B%Xw`R-d!($=ik zTdvKWx_nEw_Qc9cPVddrZrY_ZPibuxD7RqxE5duEIH-?J>)!fV5oN!FGdI7ecY9%w zZSb^ej#ohMwm<(Fek_trz5L7TWkPw#z2$eJ`>srz&1O`ds`uti+lAIiejg^W+w{eW zvR}0^y>#NTdt||XhM=7loq`vi`&w;TdB9vpT9O0WOZEE<=Az}DY`&F#bn_f zj;DQf8)v)1RDlZ>@Nx?=t33LU)&6E?wSaB=W4vgx$zJCVAodbr-k&wimmq z%DL;OD*vl!wHezt%sekCtg@#gVC}~#H)_96*|Lz+DJF{RRM&BXIqEB)@S0||1*!%_ z@a(vAyZy>xBQLMr4wDwy@-+6%klrQ4xiW0d9<9^MT_5?}?JC`B@o6?Ir`D?nUcuKV zIVjI_RA#qWQFi+3>wtq-&0Dx@Bo>(GcdGDRSX%SDbiwlkO}j1wHp_XXPqMepEXVVr7YLnjnlM%0uIt~j z1^r1=cQnm&o*O>vxR0`1)Vgi%dKcGeyS(_c+s$36o#{|H&m7samRIIQ9Aov_G5c_B zV8x!iEw@v>jo0yedf)zTcG_E#Gf>OIgMmlhC3#tv;L4KjS;8K7x4gcbWb;Ygx%RMV zs;6Q`fZv-3tqjIzYO6M$Ha-6G=RBW@MJIReyO@7vmrYd;pTw6{g1#Z^_y6gzs0-_y ze7bjW)-6X)b!O|GMGTWaCf^QkUH3A1qhprOOQTf38NZT`Z9f>~Gd*<60CrmM$ux>{H7dzW7ufr?i+ZRS|y`$uob~0<)(}UOfp36;mw1LTN ziSYIXuc{s}$8B4$v*Gc5are{z<{j1z+n7{wg!)D8Ty-vGE&0?_qQ!nQcEwH3nW*mhrY79aftKmm-AO^wJ+=yx67G- zbJ>(hPt9YB|1*4f7VDlHySlSnI{E14n|GK#-DYpT{9IFm zRWs=0d5JHRgU_i&K900ltGG;Uugd9Qqib;i+D=n<a3iONrxPbJK0W(tXYCy6M=$3G|8n+}OD&lXeF>X>MT3735~-MX9S-y=iRdsJD>MWtObzw!=y#(Pi;afHL9&{-AnKh}N@$#E%n{W24 zd3?3Y>jz)cf?oj>uO!dSkM3Lhwj=UZ^%PA@EvM6349{n-Q4l?<)LXF1~Yd2W3Q-J$Er@Oa0yDT~WODxY7E z+q{E^M}6PkTnz~Yd9KB(MQ2ns8CrSzWrX`DZJAdqIgrUT3qMK>mHXY{)B@{V?p znaPHqmbo?!@1Fl>NDW zv|cIt;N9iv)6U7-J-0nCYs*ykRo?Z%w>f1ugHqU~8B$bTlCK7>HQ8YDY0j5Jx92UI zAmYCK=JVYLihsN^neLsX-#3j(U3byOokx~#{;JcnGEX5zHKTKQZ)y}W4l)(0Q=hh>)Bvdt+>XtfHDji2Z` z(<9{D2~}H%mCt5ui217WByw%oXT>*~m!>@U#TXGZrErHz`b?S6CsK-6@UGtMdazwC z!pXeKrN2q5Fn{OCwlD2(wwEv7sVLi6IW;#hyNE;b-4BjK`vjyn6h^1qePb$jp8fJY z$*hfg-3|7IPdad|O3Q3g-KpC_PfnNBWNJ@&b*1l&?uJ8-`58~R=0+;4bf3jxYpmV7 z%;f6ofQ`%KXO>kx`s^8WCsn6ot?&*NAx~vhb%uHGQc88IE~?(<=Z|u@!#lUSGBtuX z`UA(W_Z~lZSY@7z+UUhdT;29sC1cHr?OQn*iwZ=&N_0f#_VMH#yLf_0gsYOzX#{;jAg^<{W&+9#^Tn z)cKG3r@KMxRF_>kws}|d+wQ=`_B$CX{mQy3BdzCXy?@3YQ+_2v(eI&#f=0#li;ri| z6S?`*eC5MF*|M059UhZ6OiFeS`?At?&O6R$S=S%7b1ltEID6>xE!XW<2A6Kc#a29L z>1pL*KCxuUoG%|%)ppO_a->ZxOIvtNAqZ|dQNXV-n(>m)t-^?`mLW&gE7^RIkg_BJ5NEarGt z!{=3uUW%M?=0ej>NU*$9D1I5W<81miS?2UBV&9i(wm)n8&6&F4mB^CyHWNG~g0oN9 z9M@ZTWTkWo@4Tm_vu{TxZ&iK4<$O9ZZ>jX5n7~`r$8Cy_6;vk8-LYobR(AHuEA)z_ zvO;$`MKpEXe!Ss_o{A_N=aaR4BE{!~t_e338Jt{kl4nBsVY|uxFK5Nv;tiUnGABR# z^Zk?ORT3>cmPH{*is~>nn}7v0v@yIBvJQQKmn8$AmY14r?>-i7+t)NFFy@ z@_5B5J&DX|rp>3zo^7Ambw=N6!kc=RrE!;9d-y#P8aU)Rm1h)ws@m_h=XKq&*o!}N zT{bIObC%Y1=PLeqe9^z)9KTiW!<@Y-xx(TL=WhSD_Hf5aKZ{E-rJUaBtjYz?L?%@> zUkUG=R{1^EE1v!3tX%meUQ#yQqRXD{EV~_&d4>B@(b`SPnPKaz!!Exrz1_UgtnGkx z+0vy`=gcYfV4iOrrL!vYzS@*+OEttynKqu@o$F(IY(c4v+V=aVYH>T)9u{rg$0SqQ zn!?IpSt9eZx;S92*2k#_q|Ye4JLd<$l8!XTFGi^U^*Kjx1 zvNHXQ_mrNP3F1s1>|DAUDc|{iy~+`qm+?us**73!=^6YQq|GOCf z=hTmKP0hUbCE-TjcL_Ni|M@rjo#>fIJk9@nL2?E1`e&zo+NBkIN?Sg5YIxn&+K-0q z>U$cAog8C2O9rEcrgm$KhO^)m>Tbs101kTlx|bKCL`{c+pw0Wo;dI zs`stQ?c^xX_kQO!q4>;(Ib97IU(@}z$!M_@Ns3xM{G_-v>gjcX$3nL6T1^-Z1x>i* z_|tLKXZQ0Rvz2`<70i}ASFGhfRuwj>(0^KxRvh~^nOqjD7hJ(!Ty9lD9IxYowlah) zoy5U;zN>ih{3-KlpT?Q4^fTFiVNPn~dp`9K*ZVF`k@vj9{JXG!cjT#fo*74%7loZY zWfAtz`QpLz#-IK(_{S<2Mo*t&+45Mz-|OC+j@z}Cyvg#Z9+wrTq~zt_-nE)-(lVc< zpE)rED0;iC zB(uWK>#|?YIM^NVtF7s^_TS+WBP`g~SiVIox-r&$^M~LFPp9evMwySVEsoz`rJmR6 zx^u}=?>z2s4(}+L(1lChdp?`*8FBo)&#ig?8S3}$5U$^SZr*LKKrgvsO?C$6#=hiZ zlU}@y&f0$5b=|k^Gnq6pmj_;ER$>0V%DZ6ittYx!N!8h2{W_oQWizMqNiNmYP7kvW zxcZ=fd%v>xhurq{rDwO@%boT%xFAVfcg?~CRSQdrrxV|@o1B-uvP0GCcXw%aW@?t! zokfd0Rpu?9sjhx(lJ`{6t$CSOcAkIGDv+I`ea55btn);k<*9DLJWXY7Q>xG1Nq>B{ zSjXa{*Q2)DvgN_7{W`b358S%tz{(hVll^+vwwgJQ&Gn<)QvFtLezu7%pkPtim-CHh zLp%cggtn+(WYpA9XL(Tkv-nfU>6SYV-G~1s3Vk)Q&zDs6Ihm{eYPN{wl)4k;;bF6) zRdYUnc0I+bcY1!bWx?h%&L6vOOyJb0vHa@7lh7X2$yT=rxxQrx=;+6I}PQa7Wxb?Ok!pPs~^Hy6xR>vu1LGgUrrkE|Xb#ORpH^c3duc zcYb$v$EP`IS{*kgHyIh&aEdO8S2Ec4)LrrFrnNufeZEUMJ$^mw)4d?Z!b2eo8c)w} zP5O}BYtlC(yVPjPI{$ZXBC}7;nle@O$ke6E1;_0@!lScXJbJUX?-hN%Xxd}5OJS3@ zRyVnY7=8{{*sS;>yHa-g@@GH&9-k0ta6cPV9m zu4FE_J9oijn+=uM7k5?MGv{1s?SeKU)4Q1*ZSPM>70}AXR_+<)V=#E zSA9o0*M;u_rH_4Ewy#!SsHG@zr-x+@PmO#~eevsM-PZ+mg1_r_2u;{pdT(RkNvWmN zFTU7%;Ym23uiCuOKwBQUt*YWmUi|9eNMl9_vfCUpuFwIsVRhQF@lVx9bO8TrW z_R4iHP~kl?Z>P{nzGr;O-Xwd9%`AyX;$|I;ZOM zh2ZpknW;N<+&xlP9xzqUJW*)*{y#%$<>t!|CvO$rEWYZsf#V@bS$i?_#3dWHDrz4) zBs3>kW@^~d)te`;H<3@0D&Ex6@5{bNp|4)Zan)Ac9g&3`cUsy`9pF0gV)6a+$Cmti zZ@WA_v)AQz;hYe$*%JbuIs3J&NZi_Z+14`LkA0KZIhpAb&F<^G+Idz}@NUpj%Z<^O zWO5!XbY8y1xH;tAnue|CjF+FEZu)jr?)D`%;Tu(+bIP)x^tYOQTIga$?&RzTd9yd| zTevIevHyhVl8INC_AU7ln!KXow9>bili!EQxO``OBFaBuQg&_lMyttTCl9WUGPnn$BAByQ-%z@W;lZ?NNU7b}L`hDliE!z8Lv5*7wkd9bvPhi&V9&rVF+U-0r+1 ze&Tt)jzCTI>d8e5)8~1a^RKL8wCA+mcy8$~_x?Ffm%?sbixBq^Qg&fAyggOMLfYY( z5LbutBhwd|#X3UUDt9VuQeMAR=g2Ytj5`^{i>)qQQr`7yLUbHk0sEGeFUJb+$NXKD zZ1wh#>#5RXE;Icfa!0SeyOGg5!pY+p+w(C0HNRG}zCLw0{NCEY1*S_)demU;M~ zOqV@pC%>eI&#Kg3gzf!NTmMQuosEK9R?PV(xb6A%b8A=5lbN(tH1%WZ)udw|-SXx? zsk>^`9pZc0=+WMl%Vua43Z6-|-KypJ%CKkNJX84##)3Il1)faJ$<(#F$?!F3;)}lka4KHE5R;HB`Q%TP&Tc z;|Nkw1loZsIi&m~^p?fO!f*0ON3;`5_V4x8E--TGHEjcv*0-tD$8*Llt@m>~70 zrPFV^S5Q?;0^|LMmljNK*Ath1rE+f0o0Iyxj=1PKH>m2iuDmeilXQT{qrEk|t|Wat zc241*bac_X!f$d3W`_iXCtt|*uvoG6cwqdx1zIWBV`UdIb1N#y#Z0pPeE;pbnjIh9 zwrMTi`r6box-#wV_w#9|cg+&dp3t{NQ}=Wwqes|-ps7=q&v^Z!(a&n-v#Hse)^dHR z=E;*efA|=i<)4rv$GEdRJUo~)8KsLHkN4WXQenB3%ezv`>9@Ms3I+qur#LSCM&Z1 z)3L{*&yGqRXj?O3(Y8l(3V(e2vTggPMFk6lA65SP8~W<7n#_!E{*&kN2QEMPE^(^; zf$ae|Wf}`(FPxpKRb?sZw=2e)-KDkYQ1ws7*Js_o>TS6mHrG0Thxy8PCu4qIitzef zBD1Zfi9Id&^sJ8awNC40BCc(3)fJwfxapy)^F}AW+6rIyC9&(uJ#{VZysmBA$5gka z>Q_~3rR0aqWiK7&*3G|K>n&UyIrsGblS=)?JMM|r?YaAGw^7as23y59qPmV59$%BQ z1gy%XrWV*7kG?+b?9sLqRbC6@=k}i3p}6rw)pMD>>1zx3=(?}SeQ#bPt{#EbGxsWu4g)^)1UP*r8(k6!2T6BW^Z)XtY4|yyXS9Rr_JuyOShC> zJ)P57b%lSMi@87obu=vRGdF`An-#%&7-dB&m zp7nQYTX1!F{~xh?d#_!3bM3`N9jjf@#rGyH`YkwLcCyb~1tzzmMV`lx2ee&#{Y&os zb3KdKoAf5`4xi?AtzhayufS((N`Ac3YI)0I#pLilipfFpRYB$FbGBPGwtxFnl6$i7 z!d7P8hb68ad{0%EXvV%iRDAdK`M*BZf=+W*z8KSD)qVe9v~f0ysKj@+*&eJQ@@%fn~yPK3oqSu%t^eD&ky{$Nu@bIy-K zx61QN7f)^|?x{WXeVOu3rH{NF_e09JN>AyT(!0;%Y4q1>Ki56`?tE*Enrr#Rz|;0Y z*U_b-0WmT^i~M!gtE}C0XY1>^!j;?HCd&P|Vwt9`G3CsegyTWS`*tLbl$wZHGr9^i9O)mK&FfrgogWqFZkMV3s3 zWqNnHySsMqOIPKM-%qB=^j*I7Sk82MDeufLojxC91tv{t(d4-kB*0YNaLYsX$IE%8 zXFrwlp7Zuf%rgpF*!-1&|BU7ew?NPEj0ugC3MaT9?YdQ|JTuJWmX%3VuUn^iTgkcE zRe2LbB-`>OMLz6Yxh-tHU0~dib_TyUMV@b``PqpXWCe;xXJ`i(N`&pb?BNn7a#}m_ zxZ^Q)Bg4OjF?BN%ue7ezwv=E#%>He^Y|iH*p=nKFWzQ9!=i7ISM*J4=(~_NjdiB-R z!lDyDp1hIfTles7*R5CAk4r~SvUw?dFZWpY>!_W%oYHO#PYhq13O+6uEs2>c^=$G* zsgC%xn0uPl8@rY%yJV^_x686)Ua&5oW6~n&H&-2bU0_CDz6Yb% zn@*K-#?uO6AFuu{xXJ4A>?D7+`p${B>%2dolyjPMUEg3D(-lQO4wY0##U(4|{C3xR znHF6V-JjDC_Q=8C?oa)m>&BIu(Rve0|8AHrpLjC&j!03H!SR&FzIp2F*thLUow3B^ z)O1CKl}j|O!{@J+`FTBVQuTFpwG357;j_#wJ3a-!eR}@T1c8=)4KiWUuNGAXJr@(4 zw58pkZb$mNOPqYV(TC^rFS}r%y>-`vXG>;24T@n|nqsl=^o+InJ8rLCx#@z;uWL&u z2;W>;9TRRBx_YZ;;Jt@7JNtzrrUjVToQjsdQ{`St1N=BVjR-$5VnsVAd{>{rRl?kLuU)FpVT;hR6Rg^vr$XPD zp7m@liTZ130bBzz%#&$TUo!>x-i&ye-aD|DH%n9GmdN$cd)(g#y_-sSwC3#EQ2?dy%><^*SNKl5ed&i23)rK&8UsTZ?$E$)ubPkW*xw>W?G{&$lj zd`=3;1fR7Do|DJ$$&RIe+WdFhZhKcVZ@!m#fI&Iq-BXX&P3M07Hp>$d+qY)|$2yzd zqjOhAExx-tHfy!enb*EI3zw*FRj|3nbjUw&j#PB^qiwskxd`f-A3dxgH)&?3!tVQ1 zg)Bd-{La)ec_Vb=&u5+132xVRKHB#CYRa09XH}E$w*9=W^Ks?2TW?+;U4MRg_U*}` z7iS+AwrF0l_I#B7tW6~|gt&x0^9cyOa60G_$UKkZ{I(h4V$P0wyB0YAo9DIrmBU`6 zBWc}}qvl<9NwM1YQ%Jk!bEbQ8Ryk%FLZPhDR^J0_Q~_pv8!wSR9&?gZM|o=W!BBV^1W8y z);!kQE=KaC(**gPU(umgQl1~0n|o&6vk(1jr{t>@IaAxbyMv~F)ATFXD1W zX*Rc=1!Z#HM&}y^yiWg?@b}fp5{-zu2eKfVCcQJm~+IL0m?YeV2vOhmupI5ql zk^PENwPn}z*x!Gj8Loc$q*i5wcft=92G)o>7MaI?sIEz#(zIgo;x*3?bII4uio4`J zr<1!^ck2osfm=bsC#u?`Y9H2=_w(-PmXVnzowCwy6efIb!a=U@d`#yJBD~yetS-ICdANb`Y4GID_8fOU zMeA6t5miz6BzmFVX*tK^OOsBoY56v(T+vgp{>G$@+jk$g{2Fe5(j(1MSL4ZotDnE< zHYcA-Jh1G_(j}hO+l%~?Jm0-Pe{Y>{yr$H_xzCIL9hmr^!3?w+$UKwzoGR<`q(4vZ zyU00TTEA1={|%?azi%KpvlNSUH;Wj!`FHL}pH^ORed)UT8lMjz@{UzjT;CAQUT!eK zz{BSCvBH<7$F05z&2#v7`_Zc8XJxU|w)IwePha=cC)2mTT6OQ-Cv4|9zJ3yQp0e`U zgjXR9H+$B6^7yec^!8#Ejoy;wUX__&8H9>=U$Ffeb@Nv4i(EBp-qi(%wttbkHRpo= zVvB7Zms8#bO;vQYJ;-%H#A3Nu$P}AJMpoiylC*m>bhI#-duozIp-Z$8k{TjEFL*~-m#uM zF+%60ch;>tMT@VzIk+-Fm1lc(^cknbXBR#O_%E5aH+C_8Jn!5YTN7m_9_y)MknK5TfYrSwqc)iSSBr#DU%oG`yl=5BwBqv%^+O`hqq zoL7Z?SuO4P^78KMLESvZRJ;Rrod~XQnl|N|!_u0aJl~5~i+g-n7PmRSrt;&>=$x5Z zZ$ktc8ZYG8Y%hKK=HrUl0pV)d?R-Ax7K)w9oo^v6lw?ybP^mC+lD|%}-=(j8ksocdh#M7NxZh&t4MU^QpZq_H`t~`zA+F&UZw6H(D*JbJ9 zol9F!YEP58Bb1WpYJJ|wxTm~i)lQYk`#7e}H<>ae>2`mL!J&CmztyGuWS;n?O6vQw zNkTGDRuJPKrW7@atwu+PQWS4laxfbhne}b3jx6o3ypPOw0GlQgT&N+Pw z7Oi-HI5s<($JgtUFz4sVJ*qtu!}?k-1%3UqZMS#(OjD((M5Ce!lQzxyeBx_Y`QCzg zpOdzp-xG6Wca-ksvzwFG*9Ly~e75btt9gGetKG3bJIh@zXJgS(u}kl!yXL2Dvb7Xy zS;p*Vb4@_zNr++Ne7=wqZ`+>A1n0=mD05v9^e1dSGi^JE*ICe)|G|YnhlT4=2T@Lvvoi4XU{*cvMmws-Gag`n`NiS zOp1B^@6`)$f96MVxn?sjtt;5_c~|SAr?XV9#{{o8vQ)foz>&)pc`UTCuj0e1ylKUG zbNeZ;K zRCHZ*RZWe0)>Wt0xlg+|D<&cyj^ypVJfjw%o(-YKwbNr{bD<%kvI@oYn5L-Kq52>A(Z(ye&L) zk9>Lh_)Kt(NX&L=Tf2-g?J=+Jk(H=C37c7eO`L~WJdmKW}I>=s$m@iBz`I{S9U zsIRhX!+vTAP1qI^;+T8D?P`L6L4DGK+Lo}twnj18Q_3Qbr@cDF5oq%{v@0n5!KuK4 zlB*_(QDPr9-Hdu*5`NNp4#WIu+e{bgojoPF^R`g%hY4YojrXt17Jdp@-7Y3(nzy=A zob9S+=Cm_vm;9BMi!9)B_i38=`Rd2DJM@?9l*xJ*Z;5;_5V~x>lg*dd8*`?PlL)kEr%4MqSuM}M37J1_&U<0`xk6W_DpyonAAC{pK)&E= z;9uIe zQoA)jt~GcsJA(YHcLly=ldhWOe9nw(>dhlu2hS_j1o!RR^?BK|lW8|A6BXUJ zwC~`(GimLObGB2He`>$n?YHRque#H99kT6(`!`Fa-AOIHaBJElqsm_nj3=5;ty@?- zXHuTl32!U0V=ZN;XI2+-9@P9?yRzWx7e9Bs`MOs3*NSoXh&UPO3&!+s*|Nx7znuez|?&ZBx_|E8n>NJ zW&zt<=ps&rn#THjq)Fw{P zn>}ayx0D2iDHG3BgzfmaQo{2(t7pQNgO@p-FTOEW)AapZc%0FD|3<%C4u7Y+?^Hdx z=}Ya2?UTxs96jV@eIq6-`qbWZ)m3!yj50r%^UW*ZoV8)ULv@XobwTP$E}k;gyrr(J z)?Qb<4Ch7so2&J`x9sBfORrKMYaIN0w;;So_Tk~8-I`W;FHUe-GUXqXJNK)m+V{iD z+1}+Qho=43E3w_Fn!eLQUF7&`UGvsEw`;p)zG|4CPYD;{Jilp+wXAQ(MVs~YsfDFe zjNGm&JMD3wNFN z_Uq5%I(qez_6fF4zV%DXn)B)TtDb6iOT2@6G^7lLPKmI^lq)8(S*o5_JjwHHs-#=ZV#{L{Pq!;A zi@0WM*S#b>rt@%_(3J${bxW773<}DOmCvlc zC#~@lF67Fad)b_Q$kj6;`)cL0`6ZK3(x->7Iw~PgnT7 zUb>3+VnE(3K51)PrDeubAK%D&uy6a$+8Nnf3S`6%Jf9zM@L$_1I|aunM;~cllB!&= ztkb)7)0B6TPbZ&RxuUT7>11BBa&g{EznH$XWU^dd+eEp0-yYfORUfN+ z>S2))mQ(I7bo11@71r*0UTzHM%MBxsMr&)F({B7`x+zAiv+e52o)tpd7O(iMzW&ft zuer@dlWx_#{T+RjTY=yB)YaF|=kE+_na7yjayaqX(%Z{V6iLpAV9sRWX-WBNbKL7= z>I1VqyEei=pYVW&Q1DR-sMB&v+U8d)20zE))BipSQ>%@SJnO zEQb1vAC%@x_x(8_-OuEGP(4rDY3g=6i?x>)pJ@6dRi?eRMMXR7c5rq8%X5YY^P39X zgQoJmdJ& z)s)ja&XsDVsifUX{C3F8>|G%9;X{k1PEOT#y~p-$qtnmt#V@k@rPlRzq;B^)KDlr4 z>=hO>Gv6+?YM-E{_;kT@4UK1&pPo6`v{hbryJf9!=q2{*%94dDq71e&g6AKLp0xAn z*PN$%d%J~Dd#do6x6(CtljY7d#wJ{JkQO~t=BRaO*Tc|d)7DLFEB`JRr;%YfX-!{q z#7uNo6@yDRs2fbok>TUAxJ3QykZJVT}9%WTfA{*!ZeM+mZ&sEZuwc*iqkMZ%nl zPs&eMTb<^6xqQprkLI^qe)s%!PO7>sYstIpUdP1Pc_-wit4wjONYp$LDfxbxbAICt zqtd(umF3d!yuG|#4?Qa2jI?z)=pOYr>W^XcY`Z4=C4as3(p#NodG7!EV#)dok6-?E z7b;z4;audYmBYmF?nUj^;)1Cb58rO|?f2d~A#~pSMJ225cXl*gy(cX;vt!zkRLupi z+}IvBx%+pmS;yN{Q7XgweA8@2^()5nchCBwXgX1Iz52P=TQ*;MQejlqIoWUS%cx1h z=XY(lcv%*p8E)S-al?<=N3FdJWK#IvOMSaDh5fgiyW06h90*{il^XMYeJ;ILZtI$Q`CI42o4Hb1$`cpsE*07yurwv_q@C#^ z$;eWU1222{16Dh!8Qs~X%Cr7_;-13~cHKU^(wgI(?Npbuky2Ji{xFNo#cw}4{m+}0aPg*{-NCILFK^wh?kihR zu9CuF-LO16d!^=$$1d_MYf71~#|C-^8I)I}o5hG4TisRt zvFY(@UaMQ%R?2L=d%tg=?U%oLpG$V17Je@*J6&aY(zRD76>8siZD==ou)AipxN9j# zwnosDH4oC?UGEKPmDXOI_CRc2<;!`?_8k9mCnxt<0sE#Yu{VR(7+v2O@uumY)jb;# z&%BbK+NLTpb9X9y`na6i%{%zQB;jf04emBfoWG|u^rdSlhz9*;EID7gg!f^t24986 zx|%tgVsc*GZrl9u&a(w4cYAO3?-jdnCgIY&xPXrtt=b8PiWu!x^QKlk6nWMZbaw61 z&D>{i<{F0dEYOXNj8LA*`Kt0N)1{Cok0=K&iHPHI@1}fZ=W^g{=~b(y{VDtU%^uXgIiwk=sy z)$?DBp3e9e9;np9FjI4m@x8JGQ>yCywtB5#HE%M$wD$hOy-Ln;QDq)0f@`O=<*A-M zeEG!oQ^zjfef?wgY|<&N80&?dyA|yAB1#lpa3)?do@>*MHYd z{?A~te#g@q!)?DTD?5@Vr`i_o81wH!a!YF)7Qy`dIpD8PyA;Hx$(+0 z^H27Fda&c(1KBV8PM3j_?@pg1J2r3h*)6Ia#(ZFB%i0Y_>s>w_D>9t5%c9}jl53mx z9B!$JP7>c);Kd@Ldg%1&T!$5syeqa%U0`vlO!lelhC2?LM;XQYZXLf{?Q_!LEfed~ zkBTdJ+zS+W-)d@jO`W^>P?QidIn-Jdn_|nCvEy-Kw>%P7f(;v)pBRE&jV(Y&}al(=JF4YL` zihX=vIWxO!U00*hYem-U%8C_y0de$D<#^LS7c%)_Nme1kF zyAQM6xB2Mp@4d@iefi7Mim$()%iYes-Y+xt(A?Y!<}yNsaod@Dv{k-7^<5cxPwa)Z z@^Y&i%dc&Si$3Kc)8uISXiM#-U1Do9bKVARYb_GpVl-99WV(psu@HW*oT{K$52sn0 z$FDzYRQY!D&9wy+3@<+nby!rKyv?WN`K(4Q+aJp!^ECNwrflD-@L)xG@NM1RmxV`v zd50@huj~rcobbESI%M;y**_OtU7Wgd!`FjLcC0-SVEOz4->X-3GTUS?z3-m->uOqS z>YJuTRzK2wPhO8IF|+o4d6+RPxr|YrQT-uL(a{O~rOB--vZrrN2om9|YQAS#wd(Jr zxsnB&CB8q|owq}MvscQ(_GgNoetgy@Da)s^nobZ5F< z9dC?J5%ZlOzI!*P9o-bHWAbLrlC{rnRUX-~g=MNhK@gXD9+%f%A;ajeOD`QSd2mZ5 zbA?xTUf#RgysX00nH*UUpLsCni@JT$VjK6X1z&Y;SDTfka{Ep*Y&rcYDCp0eH!2TS zOktQ7#P+5}CxPp_e&DUihfFe)6%Uuj-apTi;##s)LpJnQi%8LjyC1ne+08fEm^|Ia z&VO^=$|c9wTubuPGxojz{GsUDtA4v)J4#v?PvF*X#LPEk&cqk}EqssfzgfFI zb*0g%a#6mTlk5c_PpGd|&OMs%6f|LxSLO2uzv4{4*tm%ce|o>wbHC319lC5hH$Eue z$=jf7*m^K;zfw}ClcbYd=;_y+3?^P%t$dm_pf zQs)937`>nPu|3k-`S7=4)TND6&4g07%=FXQI)U@cuFvmful(BUzxYeY>9)mNR@Ln6 zO4%xRE5Wj5{fgj8F~4R_nlzzo$&)!f#imDJ&saLq(amOl@h|OQUX%29XEi<_{?D-f zNn7Msw>2(qCS{W{1@28Y-tu|J@sz1M+c~qh1a%d@Xq74cHP8BW{uJhI-`1I(@Uyt} zJ}2t@uDmV%u3m>dawgv?k_)?hSy}zyX_vSyeKRg^da{2-@9w};xq&rLBA=WwxGm4tApEmx6D2hx}(W`r*@co!QFW8#*mjKb*Yj% z;nG&_0k5RfcIW%Qs@UVO<>l=Xw*py#~kF>APx#8^CV!p*Y|5g4DYu|Ip^){j^>3`<0oAXZH!!qMPL(6)P?WZ#DUEKLE z;m?-7${!rz@v-iuZtE}IY7dGM)jMhw+ICUo(CO~rAQ`!~rz<%XlhckcPwKr9c-$tu zdF4@ySGR9{o4?}4R>9*hJ{+BH5*FRvuf6&|Ly~uW*?05S>6zvyH@=@NKjHFOj#R$t zSyNYPX%@8RIozJ-^>Sj**L8ITOZj(iXkA?pXm{?_4$+k*d=ociY5ekfY4u+1$Ek&z zB@Wdtd$2ImZq}TrS_9)bUoBX^+zmN-C}sDarx)h%{rNF#|FUBdPc=?f+T6c3t4H$h zbWTn0eADyhpR61cv${>6PU&5ltA1GJ)4KT&x4yc#>?^nTm0YXcF~1Yqbv-=84sKR- zw0$BIZhR|gPD_?<5IMlGeBs#=ky16Q$fD#lmz0HTUwCrdG5hf(`RV!vfquN3 z9~PRwKQznls`NYI_2IIXtJO~LTJ%vVSSv0gN8`m#I7t=8enGX+=CoZYH%U!(l!JbKit%~ZL2mIJ|)Mjq6@Y>qKqQPUa^t1B9qt#Wqul-r=&Y#{N zSRMRT=h8v#?#Y?|8CKdpNLiSBRVeSBL7eNh&r;q!OM2Got}kS^Tafkh%Ac@H-+ow4 ztx~#LGqd2zy-xF$wrebA&*Ki7a6{pVz$C+meJ$7RKP==-zR yE5+qV|cyoQ~$CiZ-zHchxT@89uM3!@qDgF z=W-`E>r#zh8}|es7x}u#qJ53+jb`3sYtOp7WMq{q=53QH%nCdq8@6>$Iq%{_v!5=! z9=LRO2#bpPMdg3R^H=TbcHEs(zRv&T-^zrlJNy0Kncu8+f8_h@>~fuJ+{PT8O2^C0 z-IiIb^M2Yp?~sw^tN#o~{`wx}tvR=FvfABcxo7rE>KzVV={@PBgGZ`X;H^bYVovT$ zU#76;GOfOT`1GVrExIgoWS*!Ly=Rv%nj-c^YO$N}67MZ%QqR8ME!!!~{g%Pele8T zZvAGR_S=N#t2$SKu7g~K!l!fE^+I25zk9vdQRVcsd~U(6S89hhi)-Gyu<5u{OY>#* z{rl&)ipTnj{bxABvHj?7nolqF83_GYQ`Alf3;0Oi0{banNNJgyUlO> zS{!wDw{vt?N5GwmQ_)?tIiiA=^qvYhX1)4Q8)xbqWz|#eS6=P)_FsH-&FN() z^NN=2=ilxmtL8s5?$89UJ;$e2^?UDIKF|Nwq_E!IPS++zr9NLP-g?S8Pu?{mJ@Jm6 zT`1F~g}jINX{#&oFEZ?zlofnv?YYd8vprdh{R-zr15jnZ)dNZzuQL@A?J7=T@FcwQ2AySfU!U?eo)F9oeq_>5hk8RzCWvxwC%W zyTCclYs}cZJG9xEFFj#6t`(V?BorTf-J>WzL*;YE`YQ2Oh6MuUCAP+QYAOxxnX<0a zn=^g6$)ly`%c}Q>PWdCQc)V@Ogu<^5Ugy}at(M#J)h>KZ!imkA$$sZA*?VMt`Bm>f z>zbdIuIc&yFMlT8UL3r3yEN~niz_8JwYqAhiO<%|+M&a^SL@&{21jX6mG|#X`WBzt z;`<@n`oxvqqrPX0#4g{K5w!3>}-Co@BKBay?pC0KiYD+pEt;VYg`@gn&QN zXHk!=+Mb+dewDj6`xsXrhwROl@v+OjPyTdy>Qm6K9CBxQbk4TQvxoYQg?BvoHc3S2 zW<;Dw`P;+uy6WVsZ0}f;ZF8<%yvUdG z_142JF){7BMUkF`NA@{qI$eq@bWgHdHHG>7%=J^R9zCrW`PgsOo=@j*{56kVe(B+* zN2e!x`32^F{I}=uNwQcIpnppf6M2r)md9dImK}Erm(OjbDq?8azC+Nb#ni03vR2N&gr?uHMuAKEIwU+=C5o$&GUqT zpPQf7Zq1C$a_Iz-O?kIxdC%u`SZWcdLkV}SFu&QUU5#<&(OuGJN+6(59d`0OupG-w!ASa`n>L)4R+7Bt$HV8 zGbPIA>2bGXDLa-(g_ic2&8~Vz#R-&q}&-A)g~lWcnRF;TKOiPAdPo z9Pd7Baoel&tzV{UW-qw%ZU6k{w8fuKi*-1c?{2=%J*U%Wk;R0mqM}omZ;^N=WX3v2 zl);EC^N@>gxxHUx@M862$p&IG6_0(_Jp0nY!GFQtCGQH-rx{It(-SvU$fte%b?&L3 z-WF+l3r1&q#Y8ws2Q_GBZ*dBkU@ofZtr*w&tV)bejSZY>e{W(k{uwLx%*WwF%x<)MQkc!)bYbLwSfAQduY7Br+O6ijZrjT9?y0PfM@-M`Dg5Am@chrM=37qBd2>2z zN!;S-wbQ-}%Ic^(&bObiV2UEE_mev229>W`>k87CK~Zzz+y``^myJJX7u z#kA-7n~U%VEY(mcIE#^@{Z_JP)i7`$)AE!L_Kf}ZvUbmH)x*tJR!Q3> zk34hERaf;}DZM>qYGd=>=zuAc%-$N<#;$rJmMg66p4qN?C*{sH=1Jk4H PT0F| zmXK)El*Xp2^6-`qS?2nM_9Ar??E}ADU3!|QxbObH>rcOgUoYAGzUop_NRU+NrrJc8 z$4?Y$LRB9+ZNIH|)LSzuZTt2uZUIK~BLALs%Uh}J6&cNSFuMPfCIj=ldAG_RPAo0d zZ=SSaTj(UKqHx3bK#|Mtk1TU*Pd|C7`tf|!?!2sBs(-+QqoX`R=`MFk9})DQne4*OoOb+RT$Yg4$|Cvi9};o;x!~*cjauAKo7Qfv$`uS;rIX8FzagST_2EgWSFDp>7MJR5 z3VT@O?Rml@NYarztn!nDrNWo9nZ@3xx4eFBdptb5d|kkt%;}el=G*J4nWS3%npCdO z!CbYI?`!`ik>ja;4QA?#vYL&q+v@#wdUQG{?HBv1YPQaUf2XJIkN6l{b2UshuxuP5A z%Bs6*cj@B~9$%Mm{_%2K@_p@5_VnmQ?k?eL&92YOow_Od#tXjwmAhgTQzp(~-13=i z;m13{9RaBszt+X5+a8~1j> zxn`ap$vVaUNvpQ{f3kIQ^45D>ygB0Kye;QfFKk@0{>;K}h0j{ORK8fg^kP|HIbmx` zl@~)$_06=nxqHPX%&F|Uvi3pBoa=I~0cEu&LX%w!pImtq{U~?NRI}*MOZjRp`6oSm z`S$$j*o5gpOIBWGS?U$kG+}<`I=crl>&+jrc6!uveRs8d`sn@xwOwC7Tn>^8Pd>5M zxyq08S><)Jt~+yiZoKSVx=kdg_cl`-*RMxgb{z2fu(W7xf31tEw)KS?%WKnR-v&<= zX?`pE;-r1k{$py(C$YU<9e>nwUUi0a*LUXg(|^CdeTmuo;7Rs%mX{*6xWb-=p83i? zUB7Q*;krl3U7lXIZg~WrE2{2q^?TF)d3WwkncBcTOTIE6m?QW2%&*38;oXy@ z-x^f|l=kvi)7rq|d7(gYM`Z+p#odJ}Z-(^{1+|CEGoN z7oEPWc2{=7;SGmkDsvRGq71G{dQCs6>aP8fk)hNy%FyVwo$Wr(T^701w(5msG#Qy~ zdo*d|Ez!27D-))7aB55Yd7QhzGwF8a-eWy?vf~!dWZc4<%ky*h?&34^S1t5%E8x7v z-yijHQ&pJf(cHMmUt#@Um(9Oh_d4&f$o;3`|2XbTFWN5lC8Fa%ZpWvf-rf7Sru9DI zmr0+$Zb^-BU|eJEwi9>q^cTFdWmo>bO8JPy+uL8Z$eTs4U;28|+@h@0>sEQ4S6aF& zh|%`&dc{*qZG^Ro-S0^7icE=}ckr2!SzoO7t%F?=h3+!D-JjpvxaRo!t543h2Ib5- z#L%>rcLyt{^5J896wj`mGIicX^$g{OqHjN~_!yP4oYi6Sd6QO8Kd!F!<8i%aJ8ar> zf;BUPf+jZY>6!Cv+n&wx#WT)*X?*kgN2ZdP$draDJ@PH{mfwzEvgh_Hub>y477}Y- z?bi0~N*2D!6wNIA<8|~xyUCUkcdw{VSgWgJ@#=>2!c3>)`BIXcF4w#yG_@ntxsGMb zda)(fc;Z&Arc&Dr%ndWwrz_7tZ2IiNc2SdQ(R>VZZx>z>V*I)K+VWrXmhZ7}WH?>H zGI`G2W0P-&9eStx^YGc@r?VWm90CG=%X}{{e)@Kutv}zzn{7)~cQ1PS@I3cAsV$u5 zqC4}q?O2*qAflP~Wa5h@Ul{n7Pc@6o4d;IHnd`EkzXx{&2m2zXZ|}kjp9NKx3kLCV z-+O-U>bDvCF>}jIw<)jPaLD6Lq=m}r%qO1b13z7Z`q^Oarp?|4ukiCg<=(CVBq4eS?cB0akuxtCwZ2?86Q`t z=Q{qbofp4cM?a8%?B5N766EFkA?`%CPuMm15*K`Tk>Vi*+`rJ^5}{ z*Yel;^21jyBo5uQB@7R$X>^{;K-9+b6tZ-ftS# z@+N9Z72m7P7As3OFFTmO<-m?ZRo?mhE4Hn>z|TDK!Y9#a(Y)7<^R~V_xwUWhlRuAx zCmEl4%6eee>D{c1Tq@dS#dpKm`6}G)BP}|oJA9E2p1*L%#OboOoE{cm9M2!^TBdtl zEJ3vFY~I`8jS{x(>(;Gfc(wBT+Ty&;Ub{}jRF|;NPP1y0PL$ph;$C_3xPSk?J$K7u zCLDU&zoq&=!;&wzbp5s_Ut8_JNI$PtFZY-YcTUlp>2u#iX0LmEMx~ll)AGYvpB zA}-5yvQ%MP$R@LfNggj)i`}CqzcO6*BmJ`de{+fuMVF$R}}ndN&o)1GyA8`pY55e zlCzRq*0NQuZ zDYKKm6s$dQ`-Hqy@ZoP^rhV%>_Q+doUO#>H#s3Vol~b8qXJsY&24|Hrh>BCLSgfc--UsbR$SiFd-_XY%l8RdSAWUou~Zhm zblW~*(b?;qoaY|C%USpD-TT~-(?OSRO|qO|8M^t4-Mk|G>1I8NwhQv2#qF*nUsN?) zxg`DhI-7Gpbwy8pNqP&L$9r32v@P|-il}{(Dic3mzjJ&0w_RcOdqGowJi6XzLh_X@ zK78eReeK$hnFpfX99UK_cvd@g;+61a!8<0b`=Y&k(^6xn`X%#n!}iuVx70^ou_{km zcujq}+?4}f9bxD8$-IhP%2;%M-JG1Ka!+;i=a+_USpTB!G>_Q#rxNE|vnO{bTj=k+ zsZ^QzVB3|2jUOsMvD?Y*n|CNXrew{I_gObib$;1>jn8=U{RvZ^AJ6#8vSrn`zAGyW z`uq=CE}Z>5n`ZWSzHwCV$tCLLDGU3mn>GhMS=F@eMckCN_CcDrmdfPWNvy3@ z^!B?@_Vw!}`*I}cr#jomGx4qqGVt04HxQDd9-QD^hRmF=^SUDYPsB9eeUmG zBY(a3vnIPbRhKpWo?_1Py*zBPWpN7o6697ba&2wU7KO7itKha{9 z+oG%D^JQh(mp}4NcaQd3sJic}-vqCH0$QQ&>vP{mO*qBmA#u0o$3LmQ8$WhdT)y`7 z<;t)b)7ciU^i0j0y3}{cq^d9Pmjv%P-=0QPy3b#=J9VmsNK@u5vzX|h zXz3skho=*Fl*{wY^s4jfyUR7R^DF~T@1Bk4uRf?;J-;_=@){9Oj~r2<%CrfdJ9pct zSKgXXxopR$+}*CPa*NJvU|_MhCwy5UY3)40sh+#a&aPnUuA1o)@M7*i*{oH$n$eZs z3#R^3NSpU|)~wHq(xXaQ*M3>}?RLbCN9G0_A1wL)r*xnA)^|p8rcCY?`}>wb)pe@+ zmi*V3D*s$%+jZQdCiU(?MGJT1?fC~^J}~U7*}c-{ozW}r-7Y?Pr!L+7GG$rfTjr~Q zFQsPrT-E)0K2hs~vr6r)%X$&9lSN+5c(AQ|lfY?LK7G~bsua2O<$le7ze=heU7Od! zqM@1T!EUL%Yx3^0S-+-tI?FOmoKW~ybjCXMj6%J)3=f_k+nF2BI`{N8&o|bxsXzMG zOtFj9RC#PS-S}g;lYgq=otTszFTHaYB%X6s&v^HKT}I-eyZatRec5n1<5Z=`EJL8C!O4p>=R5rrqnLErzk43ZM$Qb=hM?yV|HIH$Szs2*&?{* zz?IH}%6C;(I;gDp7IPqwq4|nj-TqjgJiQGIA{-MBPFleASHY(6Oy8@8Z*QFs%;@zm zoV)a0chl#izWX<@F7=(tB-~^Z#D667)BEFn8uxCc8kfo>-&nGM3!Lt zo9=26X75f;y{nhY>5=PF@@0~zy}%68?KO`n>CTBl6aUgVxJ=kvP{AD$Hl&gf%u3fUk$ajV74 z6PI4!nkTk8A-X#H%^imT_DiQG6~1{Iad5{;W53IrmrPCEd1T%n)5v>O-YWS#W-_cS zsan#EG6zL&mu>dz-YfLBII4DyhU&A}{Ji4J7RnQCj<2bBJa28)=J3eSeYaQYZS;^1 zdR*+GEX(G(H2iGkdj0c~;(Nm@XYK8Dd;Tw%LJ(_%`%Io#yuAX%v*MF`{ zUVZYU!c?ilE}J&3(a3wUXhD(tww*=ijQ(j{&R%!2ZPIh8S0YoIpQR?0&nq=}aIxd> zwBi#}<+t@0-B=bAC9t8@M0BshAH~W2-AkQKR(ZIdyf#H-ze$iAyN=we4l5bGg}E!1 zW=hd@fu-p;8?4Wl1_*wYTecA21dwhuG{%aSv@WAz@(?&q9*swnLcA;SuZOSPwzT?F72oQ=A2yllv?3O zZ2Vg57U`_z)U|AxyobSVvkHH{lGP<~o~_zOG7^zrrWDSL<;x6l5BunMlwrBi1gnzJ zqH~$MJ#M;c$4M$qdJ|S!HanXt ze`ojX6H^u3rU+fxYI>5L>qXClNtIpC&qf`dnCIxfKv^R{sY7NjqmRPUOz++mq88-| z>lNn9aP8CCZLJg#6jJ*2yI0KG3A1JwZ9CpA_hSCJb*qZCKDQ(+pXF#>sp)*2T{Jc; zdhRT}fVbC_*PAr#T@_bgy+Qay?XAW0CM$Uf$V_>?cfuj&K8qy_sv0fiMJrTQrtETv z{Pp>9^m&u?m@la^mBI1l91~yd+%`S0huiglPf(KjwjgOuZ$F`O6XO$&=jZ0-GGu11 z^5f2$*Sg{fgWsLc_H~POpDvtg)5^Q&=O=sdUayE=-MiAN9=Xw>ntE&^W-A)(1lV@& zs*&ZZ-Z5Qea$9l9mTacmGgmA+vU7XUuPN?RH)bTSs7c9<ovit_cgYxwOZ|}=iT4y&ADj1$h14PuFJVApG;*wslHtC+8STm;!DA| z-%34_o6^@JGf}UqcuwD&ACI4`3)ET9z_LQ-$?~MG&7Z=yI+kXu9F1=1TR64os|?r8 zw8CD~R2lu*i=)VSRO6Bad^V3oh{2Z2Kw7G z-i>^6=F_*%7G=I*mFqse+Sz@tTXHL(3oR%<(^C8A`da2SIk!?@cUv{7JXgN6SdnKp z?~zuMUtSv)@f%;?HAgiwdhxC#ZQWymRd&z4Q`yUH>bTlg9jxRo%!yjk#G(0XqJ_=p zu4BQ|Q|J0@d0fcvZ&&>6x+&`~*CauP?=raxVTae7JggAAZ1dKC@r?BH_?yC^$!2GR zMJjg(q%CBgVC`r5<63y;l@|e;?ItUk*In+~b>5_7o|Wsq_X1yvqH?!AjolsEd+IJr zgZSl)TQv;!vekbsY{~Rw{XHw}R#7oex6_fM;xuNs@R)J^V|-^GHXkIwU7s+JUf*CYJl+KeuXpQ7jX9(lB#*E&3^ z?r)`cp6a2gN{q5AZ`BGJUzn4AGvwl>TRke1^A1F9UGjRKN}~wJimWi`L>3Z@0ACRiml3?BxX@|y5r;N_BCdk z?#;NOFRFdPYso@M|MmM#uCCf~KXq|&3X+C7@VUeR^FrwU3G7tPCb3bLwT%G&UK zds%_V(rr!0ZOT@@{B(Uu=IZW~Ue<1I{3_ob$WNMlPJDWIPRZBn8F$Q9WuH}bX%UsFDLoNmx?$bL6$+M$zO5(b$|PtjD`p(G zkGFa~(@*0}$v01}s4KT;*fgHEdUavflhXl5`p$3N6n5nF(Y=eV zu=(BB{RtnZ|NHe^Py2YyN3m}~%$a;DtQPMWBtERjU)`}w zzgz6br_z$u-)8g)ci$1sd*^*Hr2W3#%v;O<-fe4|7ZLTbztd**)Fn2rUCPQOI&YNy zVsxK>L_=6asJJ-!`inJx-)(Kadh5yh%S+BJ4BL2#QGLsmX-8$`T;xjQKDGzGoZZ(u zS?GL4&*$}LGBce#?=9(DQmr-LXHVY0-5WM6aFlJ@&#Kj#m-#$;veIMOXJ#@v?gveK zKF35Z>Ph;cq%Wdo>F053XHZAgtoIzM+hVxAtn%I+_wSnSx7opaRqpEDsf;lPb3U0& ziF#Xec>07n6-JA+TW`O(Yd`T|pK|=7w>}luzUGEK+`IP9ukt-X&oI|ZFuX4z9N^F1W@{Av~R-FcTMRiEFsCQiv#Om4-lqeaF=VKcRYoZ1VY ze?RMVWSQ3?+hdtt;V!N7;xErX8Tq`va7ldgy?IxDHG9TREZunLOr(a_Z0Ald@s{1-_4n9=-|IxrObOYl>%uCs)X|;m0Q<#LJ0BD+KjJdwVW1dW@J7v`gMkOw zA55M1@Y+y?OO(<_?{p8ojpF`_^0$zn#19di5^d z7hz>Q6>HykG3Qn(CSN!-^~ILPGv9*>nZkFznDEG8?@bMc=6V0z=f_du36<#F z6HnYLPaKr5+rG^7t_P=PQ{$up>95yze0UR6lD^`Kzs>fuw-s;RebL|`Z<UGf4G_xHg|`J$jTpyvJ4vURurTOO%HQ_FSR}>{$aH4ckjiM zly2M+`Dz(ovm6XMW?ggoV>du zpSjXf>&c?3ey;j#|2uc3Ykp2q-S280agP1unbI{om!?}VnyZyJHh5P&y`!zVtm{MB z`hYX<-@Oh0CGb0U>+$Bq+>3h zl9fo=yokdyWxo9hT_m3Kd+)5f5gsr7d!ueEYK2S>vA#Hmf6~T+ppetC=)MB$^LnwG*Iuvus%!(Ohep0#V$IiL5r zlrHz?-j{piuiXphR-@!yHzfY{|K3;i;;4Ac3@8}>RLxfmnTK9BcARyX?_s0V9}(Y0*9wz?Guth z`t{z)?08hZGGq7hvOl^1Hv8FHf9~%V4bS(g)LQGWxM2SB!)?()W~=Y^)&CZ%O*GB8 zX#8UD{om2r|1#qXZ~cf*$*&QMjkjHST(9=fz8A6o8MbcP|7_}a+4XH=iGTC@w#e@5 zDqjAF?8JWix>pfT#UGx(UKJ5>!Skv;Yi{sd%#SK~=7v^RZ#a#aNK&D}L z)#raj+v|6&`Vuwii`jiYKQ;rcbC=Gx%_+-jRNZ`!>So15N=UT@A{7n~n%pRwxgtT)@f+`Hm- zZq6K~%G-V}Z|(+2@H4G>@agBirz&|j6|HAz-SYUM7~N_o?Nc6n%VffwIWk4;a_e5@ z)mira%wDhe+4Z!_rL&WYCf+LJ)nM*PpSjjQ`d;oOu7JLIeO19zIQ@-YXJ-6z`TYED zaI|Ze^cv%RTJlqMEf^yYg--69xqjX&#(Jx-cy;Qdz zQ&pbn^(*W};O+i`>~kvZ)~xTI^eq>C#bJ5k9y=+m zUzoc|WmPcWmZpcNHnA07eji+1w(JVm>4ynltgAw{XL&jCRhDxdJJJ_(@crUr*HdCk zTmy66M5hOoeLCqLb$;hsi%EeSR)3qSBiIxowydD}%$(Bo*=@})O&j0^b$S2f4{6|kwEB+X`B0ESv7K(EX*iqKDFi6 zrA5i2H^t0WNT2SDxyxn$loC%FZDJvYn(8tPV1C3_YdFRy;rqF zerSv5wHO9wrk#6|*8G0uo9SHbR!L?SOQtM}nYYvP&2jxOeywS3QS1{njyF7yX6BhB z6dS32B=jkJj96Jm(VC0W45}|z+y2Phb1gU_^~&UZ57_@)(n{LK#Bn0fz4G09#w`i& zR4Nie!=&FRsg-;QK3($pZ6@=(;I(Zg8A4~~n@o8|Q7o~Wv!Y9PCS7*i4DVjF_Vz``2?g%t)-QCFY?&;0>`-25; zXXS6^RH&(3@7Z&~?W)|Lo;mfm!}?U8YzmsBxbJ)7#Fx%9*sD&Tc=<;3o!yMq{q-~N z$fm!ZB6s{`@C~V|w`a!_3~=Ji_28LEnfNgD*sH=y{rAEyxF$iWzXw_Hq+jG zZOL1H;JRMRug`I}`=)9rdIZQ;hIPxIJbCJq+vK#ZQ=UdSEKK<#{J~D^L(YetZ!UE_ zJ+C!~bERSC6iv@t8(*eRcpW!URb6OJ=1DU(Z`T+=<-&OYcV*919V0stpx98oOv+ zO2O@myE!j!d%`dKY}_0O* z{%W*wCc<~{&|GFrvW<@HH7L|dctR1g3B8(nyw zcd@;xx74=jpTZ1+UmZ=o;Xi51l1US^YFGTwdiH0c+T$20zZ>7#gO(dNEj%?d^=`hQ zDx*?#cd)vBsK0&J8b%&nje9q({T%~jqi*}ei`=`~v?M*hUu(&his=w|Bk$`r^&T2~iHuHea__FqNKm>1ZGK$w-E&D*a*Z4_3zW z%VdfzzhEn*)~d47Qo7BLfBVuXQ)Qk@r3e1q>#IERtZI4uRN=Bi{}~Qu$St3nlkanL z+mh}tSNj&)?$8RW66}jO>m#uvayr+&+n3h0p7`kEo_m1btk8DZzl)yo+{?Wx{1zo{ zecvr$_qih~uCk!X>m1*ahp`M#&x@`))~A^|E2M)vjN7P_KW3Sx@=EU~GNrP{cPC%l z+pD;2)|)AL<_fQ_1W6lRnYepLy4?LqYt*)??wz{jw%C<2>q#oAItx~)?0h-pt!&xz zwfWukTU{D&9_ra|%dm8NY(^@pr+Z-E?xy{BqilGsGM-kgx%f_J&GdyPf41!UQW`5V zttdtGOeDvOxGfv46B1`H-Sp7XGx$ZWXY}cyf~tfc$)Z&;`Wba+t(XKpgtT4aPDyN? zP`UH`O51y)!G)@-QMKG*oS&}+EpG5UV4F4h@WGc4&g!h5V)*;fbY<^-Kkv0mmu#AD zKBvK;`24lSK4uk@-j`2i4SLe}%eb5SV1UOfySSa+HOtVB}HLVCze;e`H=Z^ zyLOVzkp)Y0S5yeC`4eir{o}K1wC+z<*Vb6?JoS0& zuG{Jx?PmA(?6CZ7A+t|wTg>Cud)`g4`)+*Z2+7pw-g@uM)9V7|B7NOAH^|4mDtDJs zT*Z}q{F45LN6S`zKeQy*(^Ff^`WH{raBU!CM_n#?)+to zcbEO$GoiSzX4lnfJFVz`#pZs`O$_W88I-3V51Yoi?X+8d_ov_(yB+)V1s3jj+-g^H z`h?@JLo%GNUpNC&z7WQ@3xL(n$STX6=1<&(8T_%5gwp;9} z&fe0>?_7SeK|g={MtdJtwr`$caZffqF6Khaq1d4Cxj&xX{H?{Ap1fs7(WQbVWi#H{ zt(yPwub<_*<(6}oUNzbO%anObeU8vAbDq!Za+80bo5T0`WKO~1w(xr@S#E2}w2Swp zU3Ppu_u!5t9TzvA-#vTz;@q#yyO!Laxom6b$tw{*5?9RKzVxe-_M}7wt7VhQTJ;ai zN_gll_*I<~snW${~!6#wKk9kv-x4S;y%8{$k zV0b0rO5Lq9GbalQsidoTRUTE`Che&e)pv%0t+uwHfbqE1WS88)E1&%r7CvzgOni1_ zk0!UQo7J4~5aoYKGljPMv=wSyIIy*PwV2X`ZLu77?CY{vEsu9?+r{>vWxhv|!qufm z(hhw&vekNTR_2q(%2%@1?NFIszIMZ;Xh(U~^x1EfxVvp5Bb`4_-^&&7fkCF~xc$p> zYh&3D?M*)-;eTh#9O;mbk8^G+7A;>o-=n-(G&nM(=5OYq5aY927VI~JenfX&SYq`l zWPzhoY#5*I)SgORz2y7u&KdIR*?+H`yBsyM+jZY-i}p3!+w?v3k4&0S&~)LiAiIJ* z&#za^1x-)b-_6QGvaM}6^_qA=i6|gP2a!c~Gz$s<52g>_u{s{*DmiL}so8QM< zcIGi>zUT6jaTzzx9KW{hn%|X$t5>JmX+EpE?tMB?=z7bOvK?IK<0{u>Zr49+x+eEY zp6|)U%@^&aTfNLYmwI%nM!L%K+>}RG&Km7rJhNiW(&ce?rZmreEibN>w3%&Uaqdx} zNed@`(w=@gNY6mkaO>S8OVzC>)W6{BJXX2huIGWZgL1vzzxVTZt(^Z;tn*Tg<*r3X zmwuTd5um)AJ2?Ki;}wQuxlgSpFbOTHHDL0v*;#BFac@@M?TYz~3nrbB%y-Y#j10IX z=J0c6-i+%~tG$m-W;$3A;_+$f&L^v^WH|#Rf;&}GH#acaol3j6RAa}MmEMusk&)6} zozLeKtxk@Mn3Ox??MzGAzN>u8)tVMx`D(W>zHEszT59{g5__=f z$!^tyf(+;9XfEeYo?g_h{3A7urxYJUh zs^9ADx}$Y_w>Y<2Hx@o#PwEf+E%j|mZm#vFg>y=6wWCBn7A!ne zG%{7l|{yLE7K;f8a4Cyrf@Y1^Xe@VD!H{LZN3b~<@;dLO>rwP)g8p1jG=n-)zm zvw5BMLaZ+4+N8Oso%f!2mRb6ccWdF4#-4@uBEDV{eV(al%U0)=GVNuQrPS@}Jz{x1 z7lpr0edLqzeyf;H#)`>W!5wd{MUrRS{(3}y=jDBK-&;vUnf#8LceB2~e5+6S=Fd|M zo)k@8towX(K|0IZm-Eth&H3T5@4olzEhdw1?_YkK!>eji@=0d7b;)*nf;yrXeGp2V zBEmBJvR3cjN=rTijt{@CetvgO`@q?CXZy7SKU}g8`Lh13iOCf?Q8b!&6C+uF8R-8PcW&uh=Oeq6p(bKc?AZyV%UM7FT| zy**j9?NWB}o{e|j8tX@YiT91txpz*SGud-x@!6?=(r%@Ft#J~Xvt7|keZQ*LQ?Dcy z)vSAqIG;z!dPQA}nr9(%`oN!6rhBK9t<%)9>#DlGbK=dPG06}4m^X6VS+kyb!RqJ} znVP>Uf5g2intSZ?iSJ1#?f36nrE%8k-oFdal`nn^J^sY{Kg0F%*7@7_mi}irGkG;< zNv!Mg^b4<#f7=xP=hD8%Q$OrGA+$PKf+a!b`3>!Nt&e|4f`_k8{YXrWV%=vE75YnF zuWr@5>-82>8+I%0RnSJL>ZMZ$*$lZ;hLY{BMWs4r~y}9IX z)~9m^`!}y{?u_d8D>x@&t@2uK#k>a{Z`xCCdsj;oUfQ(ymaf8*CA(g@@dXJ_KGF5m z*CzGo6|?PY*SlpU8%M;Xo{VtTtgx7Lv(SBl+Z!f-1>@MzMg7uq9=Xic7vAQ(VP{V1 z$yd4k=QK06ExL8!)`ZZBtxU!nejTl{(kVE}yD9!v&GuJ3H%o3V)G*zqJ+*cMFYi%b zS!q{Z&m-Kk?(DdIC%40F1>bxt?KhJ|UWrbaqp{X~zT(T`r7`JyHZCohyFKvbjdK#a zPTdO@IQ3Ub)5(3of~xK9jZYZP6317v9e(%XHt!+tHCqLz+P%55 z^s3mbTn+Z}#arf-3s?yT{97tZ7Li@CQ@B5Cr{KRf?3Oz}E-Y0H`^HX_reMLnxws^f1eo}aJJ zl`-W}xO!3JdBa)pd&)l@52{MP>YFzq%**50yT`LWhNs_D_qZ?7^jT3;WnO5i%Y?5R zXKY^dcxxZivFhI)KVNO`KILrF`K94W*5Qh_$J?4Xq#Y$}vtz>6teN)oz@uwR)0Epc zZ#v>_-Ke`TMO0UdOXhE--Tkh05z}PtQy$J;AN%Tc+0wa%`*b6FGYdI5b1gX(G*Xp0 zP9BszTYPzG%9`}NvNs1TJYdm8>9OC?a_730_g7B1Kl@=$;|H%j53_75 z1^Xgay8d(L&XM}h5WSy2DtgP_kC*Q5vwqd`Wx|2zOrvQHhxo+83U^F!<7BptvRSz1 zS8ku+3(d@{y%wu;*KgjYeCCe!E`?=WVvo~jvziQ@uEZM#8rRL3b2DcR-HAv?#atacf|4SjHlIL63TQT7sE9T6bFKf9n zXYD1Sa#iWerxzSletxXZD#!b*m4J}JR3XDSnW^%{96LT74Vxa4W-+N{s@N2xc~kzK zDY~6`f-CIeiE1tT+yLJbZw`368ED0wcAmt{!n zum~%@?L?n+PXK!p_#q`oO{zccxhRK%4M7J)~Vljo;u z`;>~bs(d=GSF$Ki*|INa%8og2&l|=a;<~hPOHX;yTyI5fPRBd`#*yB7Wk=)s4IhTB z)@r*p(@DEhD6^_!}=a<#>Sp5!{G zXWW@MIkLz+YwijUE`OuUi#%H zcsx%tDYw_;hFr&Q<$38hw8}gzm$|c;woJ`A$ZYfa`mEKAkru~1|HvHmn3xwC={4K$ z?(R!9ZiU}pC*?kuj^=!Ro_)vTef{!0?UR1E@6{~YbtXnTWpBjUzT3H_`b)PcnC;{~ z$0V}A&+)wT>0?VSgctN5eQ9)Wll9M+j5}U%vAXVG`8T}qnYkv{Pye`*&KY59Zv|~H zUH&xfbsl@r6NX!JOPIeNJi36PN{C-8H2=zU)2z*_;qH0n|Fv4CTsm{wTh>((?JMH1 z`g?JwSWKU?QTEcLi-pm@7gcKY8>n-tpCKUN+M> zd1l|zy{lCfe%Y=v`+U;&=I^WZi8J;(Z`$s-Uu4Ny6YVDg%wWpt~oU?I-z>8r zKBnlI$VR6WowI&*E5B{JtB&1a#w&kBjyoJ~`8%z;ebt;B4=2Ap;Zy0e{kGX{Uk{H6 zO@~6)lofr>k_^9Io%T7k=9H>Rx7p>*3{2KX^UPAW3BO2?b9nozM(geN57S<}lF9vW zvv5;rOXHsY0NXmP!rp_{TQ>cgkvZ?eLMEN$liB4DnTjvZSY2zFzM`i~aktsUd1o|Z z-SymWdhxb%Yv?j8D4XPdZ}lT}*1Y#Nhi+`M-WhY zZ}^{_AhuoB<9PapFMf4mS#~pPBz0bv6l+}Ws9f;b$Kp}dn&lJZcAef8dPa0%bIY%P zR<9)Quiiz*$tmw6Pb*fl0y6nkso9x1ilLUmOEuOgJNtOEA(ry{%d6x?(n%!$rZJA=T zRD)-^&9=V1HrZn5cHov5nR~*hSy1dqh zlV|PHWm0ks{hI?#zsy|6Y%k{(QO0$dan0LIZ@nwc9RP&G4f<+-x=94Y7lkmVp7gLe`oJ2v03reO#;N0>6&Kgp=h z@gw%fzqY+RftkzB$-F$oyY9u-(zw|drF08&i%R~j*mbf_pvq~1XX+Hw30oc)9TQly zFzbZnfpD+h%ucC5G1b_wJ1b8wez)niS#_b)+}f*b-&IvTkKH}xZ&YBm^Nz=AZja^N z9M>~@S3g%PU3!B%`nSNuyxd8bwoPzyvYa5ac%Ea;$5}0zKcd=#x35iK=;B$JTfBUc zl;LxJF{W$NVt5m#GTmg6`^rE0)|{kGde(OG{;N;FO*uNPW?kOzKhhShX&I<-TF~$DtN!xNrIS6yt?MW8ie}||*-i7aw=r9M{>r-jrs|jczEw3gah#gGrTLzd zYtHuFyM4}Q9=p6#b<>*SFWUv&kM>l%W?bg-ykaQicWKd{MAIif?K<~yM+u+O^g84a zoPMBW<-DfNyn!p_LgIS8F97+*IG@^>gBh{++?= zB-V%SU*RpKRl{-Jeeqh}RcV(dnQ!y(3gJ+n_`L7cmo2OGJdKZi%{c!u?c=V}8(-J{ zeHXd()TWnr^;d9zc(#mx{;4Ualr^{A9JU@x9|%-Caxp~l%qvO8Y}#TK}Bs?K;7yhL%?xkqKoRT$QuIw@&$wrZy$N6MeT zPcyd8TC+=2WBu~`*IJ$V-fVdH-tYEo4@WMWuCAT@p_MT-NyN!!EE(y@29gT>j_So z-^TDN>(Hl0*0~8isc%zN9^`-2ezz_+{_~cSIbRaM$|p)V$mBqOTTq{KMB~Qsqo}i!%ERb*Ny!%*B1S~IQ5uzrxthZDlX_f`QJ> z&0c7}eaqM0?905dr#yXFxBWVvx|3IA>6Ml$=c3>V{Jty-{P-e$Dg`I5o zF6&KMUBJgaKa!^v~D+8 z^vHpE<&RaDAM@?qa&j-P_rk}nb949Jxf>F$Zm_(v%saZc7#k&J)2&KIVAMNvJU zRyc0EZ6A94<-OUP&rn|_+**MraOp4R$l_*qOkdH>0u{HvQEonJd=gUaHXpd}Ss)-pZb zdz67|*MA28*cchh3wp0wx0mnGaor;BZ9Qf0>eBjz`LRLY4qRHNvtVaK@s962%xA9d zJv`GW{#uxssA8Ubx23%^trCNdP{)kWR+~0oN+Fus9WFOdc?QluF{Hx=u z-TJ%BAF;gEYoB%{qv(mMR^**6TW)n&s!um;d>d-#+_`*RnD(?K8#>o0U3xTay=CE6 z_L=@lTi!BrszyG)`-*M*i|MzMd&G~=E70VcX}IM{vidf!54Dw^2fkjCc3l=X{bAX% zv=0aSw%*=*ilg{d?V7%W*WApLt*1N+VR$95_)hkzsy(M>|B+vG_~I6SIgdS_%bw@| z*?KW3CMY>ub)lB+qI3hJswZpYces|Mw2F8YZ#fzE_*1y`tE1-cp9Lg-vD)^`XzH|% zh&v(^LPRWOzW&T!kZQg2>D+sk=Qo63ejGGu^T)kTJ*nGlWquw@yI}g}dys?5;^{vZ zE$kJ3uB)q_>9zR;PssgVY0I-)6ns$=Q;gm|uW1}r|9&Zj_>1i(*R@-oOGt=LK$;V!|PKrLais>;&X3uu9 zWfLxRwf|$ZF3(daPi9+bowuNuD_dMmK4quq6Pp|A4>e>Ge(*4Vy4tPYEyXAMD{X5h zSJC@m`-dbm@9}-k=dwMla9cd>&9;!` zi>KuFO?bsMdCKG0%*{J$gBI*k?~u~Fy6nA}ZQ7rcc5n8`*En(ZkHYpP%cl za_1cVEt#{oPIkGyj%R;mVqjcZpoep&WusS$FZdJoh7Ru^To*5uh+i(!sy{wt}$<~=1TM5N(_bOEG+X@I;T(k zaI_+B)ush=H-{|zW^EXsy1OW>j&s&hb*J4QgWd*7M=?6)7e2odTC(v)(aO~4VYlZr zJmxi9&b>d_jlI`JB9PPiV0fRlre{4zLvb}zngMJieZnb+8 z(RZZp(alV+Tt3~@Eprd5bFmlo7ANOfo$f4ERo)!-U@Fh&)yu@iNEzWzs ze3HP8j%im;KUB!&y65Qc^XWzQ(XTQ^vwMsBFVwqdm;B0j((+`n+I9VhM#n#Uh}~0q zT^pph^!Zw`W6w8TkT`W+GH?CkFQK3Mxmu!k>|OKlL~XhH;&c4$!Z++%mbU0T^^$4S zKD6zRs`j*k;K0}EvR9?!?wIQQP6}sx6LkBd*8$FyTqn!F(=O}}x0|ti^U-~Lna}3$ zc==Y-DD>#HOB2p4QE<=oI#*!6n&Eo`TYd7i9UBr)wuMgOy=AvJ^3|-^IJGacruJt~ zUH@6+*^;QecV;{~TzxmPq=iR8_ztV-t_?wp{6pqN9^bazdxy_1zp^KvCUC!sI^k8v zp+2eBX_B3XSI8ry;_IegCj8#Gtj>PrtnbgwKSe|(2gaLB{;=+wsA1rfz%(uUjcXy5Dv}H5; zF6V4=QC+cA!@)!S)&7mLH=g^5NB7*G`{`==-aA)~9xFXMoE3Lvq3%L;#Vx9~LR|f) zLw{|(dU8wi&$|jm?3>SNhwcyb+m)pqQRfkmm#ru7p248~_sh|xNBgQ5?KHXi>-~ys zgWr-x=0ZnyY4R5GeY<$#t)sH(TaD7KiAx#gcB*Z;C+qkq_K2?ap&P0eA5T1wo=|Nv zY0sRcnnz1dPpP>0AmsLe1<97`>~mxGxp3Tmy7kZ@p`w_*pZ_!5n7nF6Ca><2wVrmJ z=e2hIY5%tVba<<_SLdy-Z{%W)Q|A8A*3{!xKlw%Ov zx-#aRL1CQlyX49n?+!OkZa!_dYKgJG)bB|5WrruvbT#YzI=w^cy>E2yX1{Fduj?3# zx4cof6W?=Fg|AxRp%56dsx7;D7gvW(k5L=nYHYPwyd6pe^uB1S@Jhi^H+Li zsJd!uDa?ESB6F%1mrBb6Rsr{QlU6-d=wU7MQlHecH*}Nri9$|?@MV4Ovj27+JA0f% z(e8yiU+#?1N*O{ zwIVC|YJ@$V`SZ0rJbyhtFSq{XLqD;-nX7XOMYA`*dVP17^n+GozDK_`;#ah2Fim{m ze$4vy)-20aj9QZ(1bjI7`|9NCib;!A&wP4i&#T#bY zw~z(vGNVpds`II<%=@!iX5$6McOO^gPoMEI@owJdcY?V-x*dj3&y;>!Y&M1EukTi- zmXwA2qBoxS)#`G+a@tlNo9zt8ug&`K^jJVn!zQCDk*_~9KKsw}tk|fw@9J@vjVpxi z@GlUT;W1l#pkWH*Z{gE2pHCmRGnL5n3JP*M^{vlc;qlc|Te+t!XS>PIs-iA8UFQ?? z`dW>QPYq~6IrjpT|01i%uNkx`n-Fla#Hr>!;Sg=IwSk>pXd$%~B z^)sFF??kBElS>?4@mhA4rZ0`fx2tCV=rpza&u}u7>*=%$RhGxE-u|+S_sW9(th^#K znak_=okK1y`PL$K&7ASUoIlU@&OBuuGSJs@I^r*XYrNJfhm0#8~AK|*E zdi3TkPMyYYiV0VhQg$r&6uR=@h47A^ny=GUR$3Hp5m@t9dP>#RX(hY0J@y2=DP6oJ z=9t58xeMX*OB9|ktC?@!=KpY2i0zI%mWdDdTu52z^;RG@@N2rruNJ4q%Fb;^bTq>` zR95^_u6KOB-lOVjQ+wVA#&aK>S29m8D-Lm}Sdz#4VBQCjY}sWGCsh?IU;1O3K5LiG zxa%Yk7he}Vs!cW(tci!|~ntx}}l!?7vlY~D%TVZm-&A~(A`3kNzYtN{x z%!=ChTQxLp(H_wPcgO0rsX3}kUwJ1VG{PX#kc*M zn%ob*XAyR~G|!+Z(pBMoz=%?UevfEmBF&~_unnLwT_dUKVQ&~s@`^JEAR46 z2kjRty72S2UfX$dAu3C;IUiukvSPT9i{V5z}8Yp>4auwT=}OiH3k^=70_*`oh} z+si{TT#3J3d7@Y3RT(?O?xOV@q6_W1?q;l6dGO8qAFJmGs~(w}6UgY0z>v-Q+^}_p zX61=f=KS;4%f>2vco$N#d)Ik4RYRqnE8ZUE@bn1w_UgOy{F3xe`M|aBvg_pkGo0M& zx^v6K=37itQz``bYUf&o8*Wu)WR3LuH^afJF7ez3dCf1ArZv9*;+J(gWG27#Dyxb@ z=Jp<|fVI)Au1BgI*bOWN4ClQ`pS~tc>QP){;oBqS^CRdas0cV(#s`wE#=cI$SjKJuTuV(O89VjFHng)MaS2#kuk_bkNt{H|?V zkNJrmp7eR*`g3-@J3I`hZ9G$+60R%xiOH;q%|5lKi{~Ym?5dFY4E#n~VH06M4&Tw%dt!YD+V2D<=zLqJGN<_X8oqaPGmC9%9{kQMG+H+~`9$fti!RQQUSgG# zY$J{q1*M+QytBdl^D*gnww2eHJ>PR*UC7}DL(l={8`=@Sn))-^mwUWEu`ghbsFAF& ze!0=4IjYYd>^}d9b7{D}CLhC+r0C_9FbpM2i;AU2o#>4@1)&V z^DJtv^`xn+OIqqW3hKPRKEJf#cB)N-!a}VAnJ>=_U#+ft&fm1}2;bFhm7xW??Ww*~ zW-oerM)B;v4ENb{cn_2pzp#y1AMYp68Ki12JNwqD1HqgEfiK>^FsgjEV`i}W1NB!2 zUFOW~n|$W^%;Q$yW=`f*P)+rG$9TZ*X=K$LJC0we59eOY|8)Mr9=D~sW!#7EpK?2I zY9B89Wa3G+X^T%6HwA|LY+kZ%sh*DRiDeRTl}|L*@0Y!L@Wtf9LQCE=0l!6BAJkN= zUFCb5lh4q={CX;^+z*o;8SF^j- zV(Zh7hn6LpeYiMlVzJN`p<9XSc}|xB&+#a=r#zV!<6Z%Ce6?Hyk8 zz_Bu2R_N5_@2>IRUH=7s*4DYA_exx!m&SUD!prf3+e9=Qf{y@c129 z-IM*N;%^+QWvzZO^~H|QHqY3()}Jry%bhaS(}8tOjYt!pHrFpTsT#Yj#~${+6hOBTrKzXmD7GR*If=letdpsYP?p}*8gY7 zj8B)m*ZyMKhUw9|ANr!Zx$k&SzSI;vZ-%3?$*k~;nngM7{LlRRzEwvryVS}r7omJL zMy=a#MZ}$s{O4r{taGY%ufDkP)z0eRXF_6gK6wTl|NZjo`3JolVrAF;XSk@mN9#q} zztlIfC*OR~Yi6Eas#^S_GfO?SZ2!#CovIodjHl-taUAoM+5Jbm_wo|cz>+NrRVjJa z^Yb-jGpvF`)_hwgz`!_Z`Gg5>HLl**>sSmQcW*0Q9Pi>Be;~nq`wMSpKh;ZHzFj`O zc)HDm>h}1qo$*~UE>~+Ju9w?ZuUS_4_tKLfk!b12)Fty>Iesg?S@wCUsa(O@-X)*^ zo%FMd`TH><+vo0{ha9DWLZL5~tP9Wz_{co}?waB()mbLp&MC2rPj}_t@%X!_@4%-i z8`wPj>rY>Pe7@A;g|FYa`HdBg#(qb3DSedP);M92?YTm2mL0eD?OBm4DfuGvklVDV zlE(!-6PEu~XW(Kfdiwp9_51W7^M<*L7s$udc;@$9-}WVLN#wK3 zmGO?xnYQ&sD(g&aemG5Jo!-HT`QPPYV&isKP25<>wxpCtQ&F8^%T!GT#(4{!Z{FK< z|Cp}y^4pE?%zCd}`+ieeWo575vPmDj8>TGunYQh38HYkcongf96IWtxNBgimpBKk< ze6#4wy`pt*F7&Th@%d19yZUmavK4=}*4L|_Y`T~kdek-0cJIe_KmVP(%iZ~H9;Gxb z*{Sz>&&pJ86O$YxCrtM@!@wR6^A!tL(Nid~}?3 zn~mbG3!l^dW7spoHcTt>xIORBzEvNR109kgu zt#(^p{0v;^vCZzz_K*(>D-1q0xwkodJo)2g?>(v5Y0ska{P<0nWgirN3Jr;Va_Q28 z`|2HccfX$WcH5m>*Ve4$vD>2X>%h^x-lH5J?>MiyG4t&#MbD_zxhL&620Ci~=vc!0 z;dsD$xt@>l+OHPSTXx%k0Io#N=UwT7o&9_#!by6M@% zttWObZSZEQ{pQnmq$=`;$m50T(*L*$r>abx=)JJ;UhJm8`T3V8KKAAea+xu`a>6~g z2TWaIrw&a#EqN@&@tsUF*AD*`lOE28rb&pGt7IJta}W(R!fpRtC2XWV(VcWaku zX6)eU+uP|^Qx~=DPygnOV*+n_GTX(jT)%TNXXR9Zr5YM55+?bdtJ8X2uIfJJdCsNA zJC{?mcgA(BV!C^H_SC&vJ{dxD3ol3o_bY08Ii2+C^Iw_r`GXw0`C-jejnuX!E|ICW z(`ue72w4_AzdW@hbMg10#Ce*Zg{D4!B$FMq_RGe$3y1Ymy$+nSEe%qPo!sR;DaLD( zt;q68O@D&2{yp-W@jdPH^Uj{b8)H*B0{ayeTA42`@GaOn)q?xu^W4`{)^5_8HKX>A z*ilPWpSH~_*7ctF+;X~PePtYzNBC*4)a<*FmcG(+|2;FE$nei++?+Ul(gk~&WC&VPY4PBU?sXwsPM1#>aGZ-r@I25eEFEYRjS5c zPIJrr!^-PE8pl}OicSxYNj90-cyo!_A~}TAB@klYQ3B_gHP_}wiQ+ZJ#uXx@-;yxqP%QZ+7(I)OuoalOl9KhgRk#@ zx+*8JGS6$~wAj3w8`pFu=h=&eU6OUEycDn`H_$?Pw`s?9^W68WPE}5otqN^d%vP`0 zsrL&_JbiIm<+|xl_6r{Oc)HCii2azR{hnN_mX%rpeTBPAT37Es67t*6Ye{mq@?ljA ztBh{{M{H~6{T9+Q|J}1)IsNRB?Q)eqYxrCl^H%WBmc4Ue?ePw&tNzZ@*7_EO&r&aO z`F2Wo%i`UaZcds|u-*E=mp-d23o_2CO=+3_HuJpEq~9}57rf+^-?LIL`ojIH@*SHD zFHc-z;4JU`sr1QLUBB?}XLpC*l)W0`ab4<+A%D;-Pji+fEK9d6BK?}VS;?{k;>2rE}Op06WR92J6ez}G0M^ywIk2i|i z6y01L`DM?8C&efG=kGq%qV8Ix=Nt9$qGreBuG85yQpfUi{q(0e$zCaczFaG3_L;3G zOT7w<n&jmHZjxIf#Ty|7v()>xY@6ONrQf(bFRb`&1uH_G{RCcpY z-@rK4PU*d3q35sEv*z%evb=S9@eu}(pREy@^ErbGdd)ud9WZ-SF8goQ@tlxND}Koy zw>wdmx7zN!uYJ*KjUAH@#;cheYVKI4ePePok7eI4@2(e`G8-n(k9VB^TdOAdj+Clz zhI-$>*^74+exASEIq?1Q$x(_K$FG-Z`=6@}mGQirTGtV-+QYGa$;8I%@5;ki*A>Zf zhL}zYay()A{MwqttZRI8KYXcPW$V9S68rJ4d$alWN0qO46Fd2Qr>B>z)A1*kC%=U? zT`$u<^;lb;RYOA3&UEW+)4MMmi!D==2ehO+h86v$-VXW+!L<%=X%{ zUO>))FM9EU+QtctKeKK}hWd0JzECb=HC)v_}7v#u}M z>oMPZk8$Mp2BwqQ!F%@b%wN$of8O$ahigPni*e2fYF^dMJ60!Pc@9DP8YG9%9s9l zsg9Y4^huS9E9{<;+cYY)i@P}eH?7xKyzt=DiHGi48y2a?eQ>Jo?W+yaWLTf~@D=;M z_5MmM{maE$vrgF0d(S+*{A<_a(8&*Gd_H-*{XeII#_n=ACYt>?==@svuU%n$ z$$I-+JL^Ad|L(hf=yaWn#bN19x9apf*PYE;xoCr!r0k4a0-iRl>6MOr+B=WP)!s0D zdPgMTm)hQiM=W|KPVPzgex1K|ddwH^HEN2NW_5|Q&&qS|*&^j|F7$CvMMz@UjMRq1 zb5|6vh}O2MJL*&)c0-Mp1!3lLDRkb?MAP^=ar@Buw1J>?|xn5*T&$jj9Y)JZq?$< z-L&TO-Q7#8#iYyAr$-dX{86Y3x?e2V_%$>|>h`-Tu7dbt$(MnfelQp1h&>k*xT$J! zUSI0w`=Was0bZSQ>>_&&B%PWXBi}vqSi8dx;Xk0(qhmw6&}rz7Kz8SCTyBJ1z$$ojH7bh#b(@v~t8uH_tp8JmAeKT5P% z@3A>z(pHfpUgu*pO;(02b7WmE6Zm&hpLVr@;4k5J)|j8gKUO>x6ItVMchj+jw>fy1 zzvggw9xa-7`Glm7iS6?F$GyeV+NPUZ+?w2%!dhzDnA7&&;N;gQ^A87ZtkC%>$SpQ6 zOk~B|6<UhibnVW8JFgM%eUY~tw zY0{mvsT_MxUp^6^ro4f@FVop9S8ejoSJv*bWlKJpY>cWC+Nrwb@v%Ltj%J;T^mbYD z)%t8?!n%`13zfIk>MZ^1r7c~(ou~HHx2vmt+ykR0JX)P^BY0h8?_SFshuhC?GT)9n z+jmDONO?JnK=F0a+!fnRldGq_RiC>rUvxvQo`<^KD(P*RLXLL%eIIX16{Vfe4Qg^p z-Y)U1D(uP2-$fIrY?xa7VqN5Fo#UYO zrRuItZLOT0WqWTT=m1sS9W@#p%-7GY{qjv@mc(Rnm(QMkw}j_>^055*I%)DE5nHwB z^9TQOl>E$mdRlfNE2}}2`u>Ycb0T%#t2E{&Jm0f?X=K8B#*|&Yw&VzuI4&>@kS}K$fUnwn6>}%ijOXPdhI;8!~MkiFD&$w zcz%|X;m_5r;(fw9=03Y`>QMB>sp`*E+q}EE9DXMZ8T<=Uc={(?nwDGkWzW=Q7eyVN z3s@KS@6ZaH_DlP{Nx0^f7)_@p-&s!wCrrL2R3zoWd3;Oxr57J`&#u|=beB@d{!RW zuCe(iFm3Mp7xCJESv_06sfbB!^kI`V3tn(aVqY)bE9W~q~9U-yQ1qaPW`ob z`o)zG*5>Y%KY7-}OYrQZmE2zcY_BXcTNufyQ)#;Jz`DjKHg$hX4i*JX-DG`twomD; zh3BR#oYYy#Rn2wo%^PLTpIKp({)l`}{Zy>N>sUEoR@eDcTH6NUrbVYtb$)yI)PK$1 z^#+Fn|4eB@ty~Iv21Z{r1cHueQrMp{>R2pZN{9Gh7eZn^B zL;Ev~&s_bdUY67GI;eYhqo2Rwe0i@4$7id4aM^rYb5Q|b+3G8mmtV>s}T= zolG^lGHKb}%GiUh4*UTJ*BUNVO+3!6ddM>WBQ_0&VNQ3zI6Z{MF$)t(+?NBwnld#m}u%RU<6l%zXMuZT9`v zrylK{0oylEvQ@mv__50LqGYaj?xss3#&d6~^v|1of_I15?arvqaF^!!vrVcpR8!XU zD$l#W@n>+J-p-QdEngIKdg?DOS(mw9)9BulR}#4^Ru?K>`}fJUMEc?}v$b1A`Wn4# z_C@*3IP)(4dBOaZUp!d^Lw}Y0ayhQ;v!HGIr`|ZHttQ12&w5nuKf2aG(_X{9=+f3X z1yj^7GG5?6#jtws2_H?3!>Ow31qa`Ku-ms~;)|D(r3~}EB@R9fsfv2Cf5&gl=7l@n zZCU7j)rVnSq>-oPkJhYWr;qcqCcN94o4(@L%Gcpu({5c52wL*i^66={$$NUXJ&I1& zl4rO5xk}gmq}=0F?f2Y0{!7?RC&$gNtc>fk4BJ}px$D3h>$Or*Zo+51Y&M27pPhEw ziQCiD^2AxyO1`&@TbC@DzxH*|mzNVhZ9f@Ma$by3NxP2!A4*H7cm*%S8U!*9ewh?7t#4NQ zR%V7dlV`>5(6kowxP2ik((SA4Db52YRMKsZYb{wcTkA)Xef6)*^%vd*?43KU?r-jQ zb^n%D)6}-96=gOngBPZHdxf|3eV7y8Dyq1pRZ%5<((bcDp3{Tkc%80i{&2d?q4D+C zbgdIxZ+&OwjxpT+r{nk6Ejk*-UX>Nsmk6wBFMBI%U>NY9VdC0Z6RxODskW~1?`;XX zVs~l7l+Dr;ekiu|)J$p3IQ8MiDbLrtw#lz-njk!1`24%T>&=#Su3A$Z6+NAbUrgL+ z&wlmvaTB%d)Bb7qE*UmBvFpdGd0n#1xA}J@>|jgJQZKtbNvkHNp0Zh$vSf9#cZBjp zMdi6wAwLtfyyg{4ys!*!-O={3Rmk&&kmq_mMZE=&tN1%5R&A{j-gcg;(1NS*4BsQ) z%#cGuOPJQBE4;JKKH2lne}QPNRFGe}a48R8+JYs)o0H^piv8aATyGECKbGcy+K(TzkAYcZHdGMZgrhjkj7^awT8h zkILh`x%PPY)=hF22j9KOW_^6KHZb~xrROn&?DOfj6!x^NU|73jZSU4eOKdm}oH!f$ z$;roK>-vHNDst)bYb9+x-mTA5NQ|3jqkTX+$Y{;G7g}4g-4=PAlz8nlVSif~S8eE| zrXns*=0|I`H848J?c3@XI43!**Ok$Ii?Z$2*9t1VEuWq?N1GKrpLl*(!<5O5liXLE z+DzOO=bN)FaJpAf;n%xY%YF*%S-;%BweZRYkE#!AD(WNNiF*1@m1A~uX%Z5Cd}>Yq z!uPhXuTT5Wz?a^#ev|k0CF;r+a*xihRoixaa>S|!zk(~C=YUq9?BDUWMsxd$pUqyf z0xeIPFHg#TclLm4p`4>at3v;;Q$IS_mt3C39p-nrs5!Rn)1OoxhSy#{wB*)={rah2 zSe&YG{lJ}8)q}eqh8+;xy@LI!$6~)6R#m=jEe(~TU)R^wTvUFwMy{6edCa8VeUfWJ zxdYEzh`yd*R~RKd|8DKS7oi(J-pDSTF1A&+(_dfe9EWek=Z>Gp zb8gx#cbl|fx8 z(&g#XGM)KU9j2;UygWDYeg5y)^}9qTe0H8R*U#2VbUFV?p|Dn0-vzl27J={9cHU`e zS$I^yHf_SUGtDQjG}we_IvY)>%y*RECMvSeXQ{Z;vcJlc7S%4>B);|V_8ITKhPTCL zt9)DgNj^>cc;2Bt=9A~&wz|tjdL>O2UFn$2rGBLA%dJzLjvj22IC-9D#iaBJsS-7}8^7xJS zqUole!ftFc;u3C^x)o9`e4+fQ`-e-0W?EO6y(@s zW*w4#Txt7u)1~TKwVT*uR;}CQ{$#cPfvtM2`dO2k??x-{S~iE#S=09Bvdx-(SJqhd z-(}D)N_UkweL_-ZuR>Os>%WA@YVFIfZ_S9-Vt78^?v2!)(+_KBb=+7u=d!l(0^tw0 zquLE$UYho<@R-Q*X!d31T$|>^Po8_ow_o?9>Y>ReN?9%~J(;QHHTmUKx#nFncuyJH z+{;uxvTEDr;w~9Z@3-^&)=K^{iL$u$q@L^EyWk!H!^UQ>D~~SR^SHwvc-`dG*>lF( zs{UI)YJ`1z_p#b%S+cX8mguI_qPLYIo~kD=&NJKCHc2S-`ZPm7Llv=G8qup*lCv6R zZ8RHqujY>Gl6MU62w3Xl0#-^H0}Ko5ZsO z*94ko#V?q$ed_ad9A|aBrcEicz9O_Qy+GCDKg0I5E;IHy_nl%6V!CD^x-)^NqG-8G zT!b_4={o|qmuKX1v0GT2^WU`oo%>Tk4XYOuRi6ml&srXE%2MO4rTXr2X;In!vYtoH?_wI=58hbX7kgK;IOx%at=6|%6_qb4CePn|HLT5Jy~g6>*^B&+ ztT?b_?Q@}tCnNn0A9^QwrLs&i+^xQa`I6wBbEOAXV@9Fe&Rdp-c2t{mpgJvGR(Pj=O4ehM9waq>i^KxFu z%Fe*Uem2v^wr(+F?Avnw-PEmHRIi-qX}a&fYPsku+hfB1Y_q3JrmQZw@ylT1rz`m_ z^+&Yg1U@~vc&p4S=-7XTw#oP7uG;c0)!TKCt5!rsr7z^x-A890g?yf_aZ)>cQOK*x zny-7}b@`XfFI_n4#zEOlm4CiUUqAnQ;kJ0Dl?t{~-MHVzXsYxr2wKLhd+3(egx2Sp z0nhw<%@=*o_&jBbe_vzc-1SSIKVN%#cce^B{$3}}jFhHV^}OD**8OL=%RBjp+1eLB zb9J}OX+AU2>vl-e^~_eq)QX63!;ir+-N$BopNLu?(0P6d^UIf?uGxNhx#{pR-(UAy zj-R>|s%Z1CYDvm`-Tw?b(*+>-F|iLBQ3rAZL^A_GXCgpT={lw3yqDYD{KJKQ6??=!3Ttd>yRz3`^72_N#V@~< zkFWo7HdXWJ=l=`^SJp3bRs70!((4qb#H~eqm0y?Wc}Hh^-da>8%J?D6u43uogh&4S zUih`7^yn%ydrm#-C+)7XKJ=(YfzTHA;4^Vn7k^}JimSVscF3@{^3EdQ1w8A zrTy!?j%mrolpc1zJ^!Gs_ll^lIfZ(m}u5=j0~0#LZ$#tXSUx>or+BOv+%8bQ^us}Qg4MmO<6oa$bC)MCu_4?x1KB12%lR}wBz!^4NXU1td@1~ z<5jEfon>JbGSkcA>5ldDY^TmXDL=(_`GfgWmNG2axpVVL%lFG}vijOADr@ViWGYYj z6LZvQ&f~Nm|1?3xya|Ra^PIM<@7ZPPnz!`PQn_f)Rlj%qIkA1KQQWOx8me2?)Hu}p z$7WPIs~#2Xne%AD=|}&jdp`RZ@Zp|ul-y&vnGTw7?ndo;TyRXQ-_G<($G7KCW_v_b zZrY;FqHemDQ*)BQrR}PAY75qVZ1$a+$Fqa&PJ%{|>&LP)0*ji~d%t!RZTTv=?`)jd zqp4!Xr%S7uE(CcjIj5*)eQ1h74S&@7@T0$zQ!|4+^-8RNg|~bxyVrJT$~g}SkGJeg zU$1$-qGfv8YT+Jl2{|t=Pu?Zz%ImCOD#;{H66^iD@SJhz?K_bji*K16{MxiHbZJaT z{)!g=HTtI0cS^lklk~nN;;FCV)`gl{ftKutuST8lI}qSCWqs?srq!*5@m!1o6Ka?3 z-Fh@sWWAvDfgh2ffhocA%4i26#r*c(qi1YmRy1z*gWwPyN}+p}wqgt-@-T*Idt?`8aK z4PWK!yOF0&^fzrfu5>l}rT+pEJ~ux<%Rf^eGxQ#f|FWN9)#lI6S5yyp`zi>Y_+OVus+EgX)>gopOweEZ6Cna_+x_*LFC8hED$~B6y3r?8}SUsN_%AcJZxm|V<=eu*3 zf2OX<_RZ;Ya?U()QdvSy)O{X*bA8^=)NPLfr>t~gtE-_SLE@kGmBg)-Jl^>=ooRNo3ud##x6Z zef!%yeZ|#)c8h5*ZcI5ReR;dJU+vcAn;s?I;W5>E!^Otw7;yfG-CO6Y4*hxYs)yRH zY~edG@2Zw{hb(JFsfQ$I!6fVH*H(qxv{iox1?LJR%$&zx1hhEzbDs7y6R+6K*85r zj%&3a%8LqEi$<(_c=)CIOoo20_BAaY-)<)Ccv6~}*J83Ky&ytjJ?Bi}hn1gIzP~F7 zv65%BIB0z-@1RY-@|W;Jzj&|r5+}oS@&&3-A87u3)ov5xvG)BX55IM(rKC(etzDBe zX?NKc*0Q`9<N6>twntAno&D^;@mAUNV@}5pda8d2y0&L>#YEkT(jB@h zKAn2Dq~_-Gh<|Q(oFci)YBz3udvB^_^){~4uNFloD|cO;RoZ*xUck5a8~w6_cis0@ zWf$kavuLT_PpMZgetT~}?PoneAe-7ojw z*;2*Whw}f=+}6!^uHyL&^@ZOat>KvGAtY0>?&0d(jk90yD^K>0{^Y#fYQB4v zW2t9=B=46sbsK90`v^{khy9!io7YlvYm?OG#V%YCG zk8K&J*}_)mdfHZ-G@hDt>QnS(+hxjG$8WPwn)Zm%^D94B|N8!e<(*1PY+Nrdp3td$ z@pVHzZ+5)En-%w#J@g2SFZ0)*a`kK0C*O-)j76r!tts+N>~^tNH~iFn5%xWQuHhAx z2MIl0x;610t<3X-k3?5ZnKaw^Ny596Yq=juyH>hxOptnU-DXxrChvN$*n_Ug46Kdk zCMchL-)?w^$L8%p*Vu=(tj^c&n}iW9W=QS8k)mHhnv*gv`46 zbD2^r3eztdXKbCf?ZpoJC&52#)1NNOtTBD~i|LTtIBR+4#_LS}XZE+LPk&ar%;X zKSP%CKUMb%=Hs%4PX!N4r;C~7?t9O6v9!oJXJcvRv?nT?9?c4Svg!3o$skXO$fwuY zr$($O-TH^MwOT87kxuWw)IWxQ{k9yx)$yO9GxE>r9jW&Z&o%tE$o^4C|Mv80G5&UQ z4!l2_nzya-rGW9H%#?|X551Et`Ew4cBjV5L9VwRo(xZ~!+SDIesZppc>Bv&id~MY~ zyN|z)KKZ>|=lkz-eOGTSy#4m!Y8CFZY1_A3Rey@fye=eg>Tb@O+|-y!Uc0I+PV!zo zC_Cx=nf-0<^Pd$j5Ng*pEjT$tN^?n%vqXz`bCGLy`rL~Y-xG6zH`>=Gh45&c9zv$DKG9} zw7h!D)g7y@if`2IJNi?)J?+(RpM}zXZ@Zsy9QE2z{pa+LluD3ax z)A_y}Q2x)r;{L~LqUyIRiyF4PlMS9%I_b6Nxu;7KiccQXl8E`_&d+0!QTZ=@R>E_L zQg$AT^j~vdHon>7{>Llp(R7KD`<$1Tiq>zxvy?Y}Rqie?@tJ0qc3T#Q1zqm@)~C$N zG~Z)+(E)`Ptz}Q2O+K0JRhiCZVQ(vLGwH;OhyA=&|I(|H-@4QvSsy=hI&a~Bh7aF; z{;ur*F;ywJQ-YyqUh|%7-kqKY16Y2&^4P81+!kZ{*T3ZYtr_4LJyVfWRq)%l7NlO8 zMSg$W3Qx&DXDqVsAHHi;|IMfV$eMp?F=jID{7@Z1S+1qKZs%N3y}Rx@#|4E0sYR-% zCcTPEZJRJ@>Dr?!T9#^hs7xwgIQi7=z^RJ#!}V7nW>2Y0n`8dhzvRMyhMR`}8HAQ_ zlxm;2<9GSIvgnIBeC|rC)h=yxDgSKzaC`h2s182K4>yGWGrWUx&mQhG%&b$7+A8|& z%$XO4Th9J_xjb#vqiM5Fe~{I+dE^xn@MhB_rzt^&ADXIyO1xD=;!I)uYx;+ z9NkskdYudpn0Rh^XCaqgkfYqkX>W&WJ~QTfaH z^8TzFf4q)A%RRjQlGq%OGp|hQ5^_7vyQ759t?_d6e}+`UA6w_2x!+#DMA!1$+Ww;} zWkp2X?Tta!ZUI}{c(_lF|KEWx?{96h7h6&iAb9`G>-N95#QkemCx6WNb8bidFW1ZW zvu^x}ni%Mv)bZirvqt}e7k<@L>-N;?rhm4(P;q?EYBn3&v*{nR99?}kX$t;lIP;&u zscuq^eRkxZsPoV27jhiD7$#FuJ?s3V%YQ|-nJu!bs9x}&!BeXKZL)oL+}?*T3MNck zoD(5?@40dRqsw1KwrTR%efZ-3((LHBo%4^bkNdbK-oHxB$^LV-eYgLVpc}W^6c?5R zyj=Vy`MB7#da+F=c0K+FFPS;M*}nP5mY=S=lbsbV{4%sPnL4Ff_su`uN-JTPDQ~Up zj=8t*JoEU+mfx!i!hlW{-^4>V(CVY?mqE?3-v#CUzP{eJn5hHA1*KFH#rZkK!U13wy?MUF;!-7 z-<1w8N3Zbk$-SIYQ9V)qqn5v`?j+ZKZi_TOf4(orYHE-7|Cmyjy2towpKNAb{0}Aj zMpxuapW$OUq{6c|x+nSl!)u?~75zV^YAjlGLs@=iJ+H%ohwo-G|7S39 z2PMt;!#V#M{@7l&2RY13W9dd0kRj_|RW7Ro)tMk8=IybDxZ6u(Oc2q(TDA?AS^k#NdM=w59ilELvlo^jTOv<1xo)JX6Ezk4~A5j0T$7R9WS>- zit3fFA}k3X_P4eFXE=Iq#_vG+kJ`+wcTE2JeL1c-{~E}$pe_xL4*E~&-^#*_`j^=k6PZYj8cEj?8yB!@8$Zfpdz{d%=xze3@g9Q`W*z0Y$h{{ z%)=8eJ7jMB&#-C6pQz){G7rzc#0DvXrga4<*Uwzf_xlSZvxn6i*U9~xXadct%O|`KX~z4s&?8l_unSJT{RhJWSmv7%8a)7&u}H`PZV3v zCC;#iOLHFl=+I67vE{R?+ZDEnOTO%|l*+qe|5fcj18a^{zQ6j?t~>0jwCkJZtXOuz zY_8?<^Uo-JqTTv5)a1}Vxj9=`-{#%?edVpLTn}D#&zH&9 zeWUvSExG?-ecd;c`(^XC)vq%Dp?R(=*C8ux>Se7TQB^nm*GbnmZG7+V{oL-`+xS<$ z|8%VbeJ6?;uXcZF`Z;XI7LC4SgQ!1I!i%@es^gosx##N+%m2&9 z%>N8Q*&nmzK5v<3P_lQi{7>%qZhw*BEHRVniVf6e}*fw|A;<$@mI~yZ^oAN{|rjmA2T0yZqtLSPT?yb$a ze!;Z$S;*|DC%QY%FP*Yw-PLwUg|{9SjF;T_1GE=t9Cbb}e$w16n|=HO{dL@eLMPV}mJ@XzDUg1_60IkjwSFZka~`N}RDEs zS4!kgo3v5)h{@yHNhg)FJPPLY%nLc2{3-XcnY~8#e}*a6;-{OpYrkFL@ZInLPsApX zj-}rTJ{`t;QcPh9YQhj0PNA;fRZw+?e z$#_wDJ0@Lk^PJM0g>`*@d#0#-mEOc*H(_J)OWpb>tB>=EN3N}@exxr@vR+tkQjU1E z->zN1*DGni=-WPPs+8Li%>_(cA@|JY-tH?fOzBrX%WK?p?nBzg6?*44-Tha$blW|p z6|Qr0=PPATn($i7Q9*O5RSOP&j?-4pcaxYXBh5mUDLsVBaP#?DOA z$xbLpyt=TB!E0{7(>713jVNy%Z>a3qDD&{{`J@QWOLrh_MV8OSO z_AMWNbgp=o@m-khY0*^8XE*a~D!sX5+-?_Y6-Jkfs>aUR&YI_XGT~GDmdt-Fuj5!v zS3TR!AEg{%_Vr-kgz3rLtL_J#3Y@#@&7TL2lZ>~NEZdv;WNP;Qn_o=kDjw-|T=aEW z!zSb9Z>ttvns)k}qj&DM$NC%gZ2Kf4eMe|b%bItR3ZX*fC-wH!zjrA=`73Vs!}2L& zt3G91k@39}<8b-HmMgizDZ8@VU1smGyW}*pOsCU9<%DP8z1B5Mj2sLsz31X0W`sU& zWb|ZJ@A`JmrAYbAvylCbaemj%@x|!R+VppEzqu$tIF>9uETr|O=&BCuqoZNo8}>Wyyx4}Shl zd}Ox%;kF%H&VQQlc>a`ro~^&ud6ng?zEk!t#(sy$NzTHK4Y#F(4&4giEZ6j|=Pz?u zeLdji+v;QQwd>SBZ0)mqeOGny+FSL$cdK=EtBPdy-Obr2{OrAku3=PI*!G~7)TTNOSXLYHCf&APSgCG0*U)N zU!91(9`ZW#R=Vql`|(-Zw}$+atn`1mSC#L_&$~*GSvR#WUgzD+SQOCSB^!7$&@Cin ztLSQ*yeqTHBMObzX6N4$*1Gl8>iyYEw?5%hypwmSp)U5@yTeP5&z-PT&h>K3B%`1y z3dIVOj#qzD*tNIns$fa~l(yZMqSPbrE{V&xio0>Aw$EOr)$7etjk2}uBAj2UQXb9k z|NBAsr&g@((L6oNCwmXh*UJ93>x$5v3*R@2M{Y>nDL8xX)bBm!Dn5O!WqErJ>RL~l zsv)xGout<4*KS$W-^KQ<+UoK)rI{SN2`Zk9o3s>x8g}&mMYBk>XaF zG;MOYueI@06^|V!k4fH9+;m{K^Fwn1(@V=e4X=uOLVU3(*Qu4x~tnNsoHHhjf7&k&EOz~w5AHy*mDtI8Ewo37wJkn&VTE>?Ttp#sAb z*UG-!VhxO+?9{xsGBi$C>YUmH|4IKDWYWzw3)**GG}-OvkiFeGOEvH30ZrbrR=rfa zt_d5@OPa^Nl3n&ZYbJYubEnpA)pp70a?zQE(<1{k3-weJmU?JfDD;%FPc(TDc!7tf zJUDOBv)m?erS=gtI*_tmPB0h*;b_ZlkHC@cqG+eSzG&Et>uOHoce| z*Q@)*zBFy+m4HQiw>@0SthFbj!+Lk>>R%64zg^7YToSL$u zXI-(csmiuVpQH+QwCFPzc%2FgVLZp_45p)pJ>8drYjhJvI`QmJYljTAZ?kWm=aA1H0ID4hu)-ma@B^dCgUIPfX=j?9OTr z`JBi)J>BE&lv4$jOW7xc2lsqhA=-T6vrB|hp|-2qcind~g{sF@tr!2f%h8)L?Zx4D zhfAt_Rnsr=Hg4tO&^*Q$6fX6zvGC-nDEY9$=Weg>>aQ>N2*h& zfB7;aZ@o}VYTJ~p4w^x`UCOGPg67V=Jvn@jpWc~InUD5M>)7~THJ`n1cGj77YA@UM z%FR=D%y20)TKi^t$fB0*n!2jn4jz9#rD1~MOu6@3OSj{TfMj%Jtuo#i}Cs7bhRenLg0@1 zt1BiacOLGHdUfXC#vQ+x7j5(JdlgZ*T_x8uq@3wikdPbGqy{$9mU3Sl`+&v{% zs-%NXUKc-WZtm!@!*~1sEKTQorD|5uxo@BEUAmAjSJAULYr=-0Mcm~)HIq&LO{fo# zub93zU&iOku6s;6*Q<|y+;&@Qn@WO9=CTcKvrlSS{O~$x^T}8ClkbPV`s+0okNsJH zuztC9@YB{uaSN}Nt!zaGjR7niL@5*nG+H~YRUuui|}`Rk}$f=baXj!A{W zC!Ky)KXSd^6{Gg}+RBH$mxG+zh5p=KCsUadQ*)Me$2m>@CV?epUbb=z{%ori*lk(v zR+!%X_NPLn`>mzf^Hhz^+rNt|zr1;C?NyhnWiQ^Fv|qZj{Z_%+yanqSt2YI$ix%9t zY|T8y7w1%8q+8SHU)g#ZeZA$eZNr_^6P4Y@DXL~)EH*hgF->V{ zY4E!vd2Gffw#!n%Z8AX*L-^ERMNa#t@pJd5r*|fG1}l4cTg%sP2|RtOvNG~+Pm!dp z@A_kXj5jJyFV2lBOIxt(#=2WY-o|gjeRz=lz$6KZ=Q$?06)$+1@d-84l z+I2M#^(RffWA*6OkE<(p>|OD7-^%IB&$iX9UQ;%kfB8A)6@{AloEfSbUS=u@4^~VH z$zEts*fsUKifVAqS&=}ehpr+4tRjI9B7v?9fvzHqgPNPr7uvhv`YJ6AxiX#r0oJNT zOXSSL${MtpPRcbA6Yl!zaPMUuIoj zU0sgr;j z!_RdvU)^%8UCE_;g;T61ZEFa+Bw{q7xTo*UgRdW!GCWCJQpdyc_)zbnE&Fw+v3-wq zVtcY!E5Lur;;qUvW&IT&Wx8q|e4Z=q__XV!h2)Yqr&Aw7b&@1U{<=6CCUoN59|+j9TiErma=^J?NHj&q^;&=3D++Uv6#k@{ilXc1rtjx0mo# z0o(MY6-mzix>w8|g)9r*n4lrlnjj-1=guNmdn7=5wdkyiO2In1%kGwP1fRZfBd9?; z?9w9k&RbKpnRlu++_Aitec0=SvZbbly(*uMI`f_%7vx^74V<6lt@upVxg*?F)zRTk z(zXi{=d?}c-t<}Kr6e9C7bUV~alxG+E~hE%L5x9+wzpgJoSG(y*u7FH+ zm3*ptnu`K9xII`jmFGt*t4iNaiLXJE3XC#%E_(iXI%Q9r$S0;d=Z=W-td=dX`gG!_ ztHuJZ1D0!a9W}LVuP!rbTVi(m%&zHDm5RP=wOF-0C0PWo2sWQ;2z0FsWJtNTY{{m_ zullA>ST1xcM#Jl%qLzwk#Oo%f4fRPGykDD7ZH`Jgk!2ja`rN`TPk2uUc$`#VoP5ud zp*n+i>#S?H4t4q!U-+|g&5k7tQX}LxUw*p4_F_~-?eZy)qD!@PwUZ8o@Lf%|u(0Xl zu=v__*CDC#+?Eqlj+9I0UJq!s+1tC+i(zea$RZ)@b5~YI$euLaxHUy^&XhTFb*q@~ ziayL{XuOwwCX?q>qL4%>-?oiY)^c%i$tiR(=O&xZy6~i}rBQmTN2!N4$K97AO^g<= zdnOpaUSNJPE?~iuR=!_XmAnOK7e2r1?7L;s*0oujoF1DS46s{z2?y2ii#dNm*m_g=?CF;B&RcKp zp7?ZL2=n)-vjyop?z@TajwmRof3g1;m+i4%2KSfq@zpQ-&+tNn?^g5az}OA;JCEAk z^Iksd=bxj?U+j@ya%KDK9X2YeJl~FNJkh*6&2HiO*DK3G#(a5r@cftfzpRY6el6iI zo^i_k+o`+%8IEoCPhMKH`O}og`4`PUx?Qx?omXb7&+g;fH_T39+4ExR&E2Y- zoM!t8|Gbzo=j(yvcJaPfdILfh-Tt;!k7+?IVmYn{FA!t)tN?s$9O-o9nxcDZTAA2#1Tle}+kwQcx6!HoY5PR}0)u&p`1 zLuixT;U6!Ths@i0=3bmk_9OSn?)SD$I9C?QVW#ddN8F=Dh=6+bkNkJSns3<5*z*@!$kY=IiS>&C0R(?)IPI zKf|2B$&Y_tvMp44EAJ-AsU5cd!Ank-PwDo5x@tagJYGJr6E-x;x%QJl6s_;2mNG`BWnz{alxi*`F{dLi=@BTbj+FMq&{*Thd zf34?_E$e=8<>ma8dr!A|eg0aOs;kc#K5PG^HLF!}?^qU}^e-@B*}}sU#=+85y>f+e zsLUhR<&ytCJ%1d=Rhm{HzvXwexZ$5FW-Fg$e?!?6j>&@pHD!o&^tF+R0kI0jzWmiJPH>iqTa`bo>bMS@X^E>&AxqlTr zc>YWOUsJ=|+BD(!ZohXh*`A#`=SP{>@{N}tn|}WGpCSF1-ph@5dQXRaXbfa=?`gR0 zT$rDDw|_c()gR(nOGNRV|PZ^z0 z0hK~w$rWv}n2 zulmn$NLT(v%%7~x{k=Yk$KTG~_V|2Kg6h)d-RGolRjyuEIqy%A%nQ!kgfAv&DP4X0 zmLmCkF@Lg{k4<5?9k0Onw`j+g{|u+)mM^}vC@Li@neoG+wa^Z%fqvukq?pV@3+6U6Jd8MJ^>|tar=#Rkp9zQDHtrN)__xjB z<-=R2*LL}>@i>pp5Ob|NQ37Fn`+#i+KcvId4rF- z>U3T?=6Yq@-_3T_UwzM7IEE)(D|;Bz?ziXH<>g5BGROXBkb9N+rlEeF_v`-*6HhK* zU|<+1{ou;W9XFc0x2=qOp}konv%+i7H8-!uFppazY?kjd-?7a-WEyx*C93K_LuL8L z73@iDj?3067%qM5EOEqbXZsaj+mQ^$FGQ2uwS^VAd{jX!IZ4vot<=TTQ_kKR^S#%@jvwE$T_^R)Xil;L(945)| zZrQM@?_}lesR?oo>C+q+s2-pCu5bI5njn1pmY;RAUY)7w3BP6EPcmrUPR~d@b;H>&m$|0) zru61Hk7aM1t6ssGs8l1mP zJ})z~_~Q$Hfd;8vPaNcL-B6z1o~HumR_H#^I+u>RmMe2r)=MQY{NRMn_p(V*~X{so^^7Sp09gZiMCVP zy@XpwW@;yCPPW|9yIq!VEtgZwglPdww>=67lMY&?cQi0NU-n3V2*1~|t^223YrOP} z_it|YguL|}+bww->kohKpOeVkqRSP$&TQJDu&JU9jw)}O?wnMf9%ari zcy9Inv(MY*{^j1W$$M@2dg;Y;hqTw+O0#4Q;xRodc;?EMWYx!#Tdkym8xQpe%u6=t z^?%xYnA@N4>iRVrd+%H}I&1bdz3XY)O98*OBWdwQUDpMsEu5%kIXfv5v)l_tqA^*T1X#g6~}Jlv`77%-S|LcSCFrd$fis zM|5X|;+`hvX`b162UTXBdr&1aYhC#9I%)GYi!(xF({~n4d!@Ya$<1e4(nT@-&vlO$ zC1f1W@|vMh;vU_2Y3hQOs*KZlGe6CEsJD8{>?_hwPpPQhxV}=N?rHM;e4o`xLZ_zc zSx!1!yF0-%Su4MS^?=pY2{mE|!U`kbFPV1oOw5DhJKeljW(8|ha+WSN*)UZ_BhTqT z5FfwE3MPIf#-+)}8qSKKj*Mi7AF@-Po3l1my3g|Q{948rA`>{2Hc$D{mG*skPWY0Q zDPf6k*^eZlJ=ndk4#UGw?#?(?@-&OdcQ#_~(rx&I7mu_jY`kG!5S zr``Vd^pbTyy*rP)ezlLNsh#Rv8T3=P;PWZ{_HBPf*S?opr6Mu?hd7HK>+RyXE48~A zKQFOsm^)sz;Frk?7v!%be2V{TTWI~Zb^WJW#{0IbYQ%px|Il3QtDPf$Xu^ZD zhYFwFl-cw0@?V?m_WBhEpB(&E^(g-~cl?uIu9?61?0m{4&h2`(^-&U+sz)-@!)%+` zmATD-*T3gvf4so1Svw+8DGBhuX2H1)3=o$;@|Nw<{;xBbhl z;{UqwtBHJ;dfvHT7GfgDs$;8n=x;7y&TlimIj5+|U+3}l&%a(i-s<1V^p!nQq1a28D7C;F~+v&xR`jq%`IjCQZCiV!asJnmaQ?ghn(HV1-E`;6{klDV z#hY)x=$^Y)<*7sIcl+s4@3_qxHr><}ShI22y(>pJ-n!*_@AbYDbc>16I)>T8;|0Tc z2Mtc1Ru!X79zWFIg>(Gnd%XRW|7liNu7i(+J~(-v|9a|U?1sJSIk$qJhtJVSm|wQ+ z(|?9{TaVsa|HAL5)ko`&sPoZrU)u$f&+mzU8k4ff_7r1|wR+CfmTwcL?Om9^g7}rk<6QWQ zPtIpT>TTu4(S^EBB})x9<%#WC!X{g+{OkUs8}gD1?3$Jyc|0Tj9dE*}xd(FN---Uv zZn9r-@X4Wd=`kNo>feIWApeELPl+rl+4Iys|7SQPw*TZ8_M(?Pn-e=OueG{0X=V`ll`Ib5oYg zRj=^~_;>Bp`~M6otEyP-l-IhH#?9P*?6P?K?8#+Xc`WU0zqf2%u9@qSs#UPmdA@-o z`!vVpflJm_{5!qp@2=T@)-rqr6*SvdDt)g!)&8QV{6E7ak?KoZ|1-4StGny-FKo6# z<_^BQ@7C(M-cX$`c`LYl8t3VR&x&VO&+n`A3t`!;d?Z+JX>?Y*{4D>khxjZ0GjQho zXV|y-z1Q`B;+4NkjekaE?SHwuT3`mp#4^?3BxSALr^8h}a^%*@Rmk)QRQAY~urtXHZ$PtiCF2{|9IxRWf%C&(Et5e)YZrdA3($f$sU9uRCM-|NZ#>P~Oybsye%t zysnGMwV4fn*u&m*uL#N$zQC0CX%bhk=9T7_9c%>?iYh00s;rn4+c#*5PxAN5yL5`#_g0XGJo!T;Wv&__JlzFPPy4{3gl`3UU zb>?{tCr=3d=@;~sTC)63@k_>^&-DLRmp;EYb^RZZf73s0xxTXG>^9RC`(~P_=1!EK z^zPC$gE$A9DetU=9AEKqJY!s->RBl9Y~$TCv&6Q1Vsuu&9`pIgdo6p_bHZ^Fm#emS zdz)W>sw9+apuc&UH~*TJrP`U(MWQ5sJvUo^ee(Hh%RbHdlyp%hpt?osa@Y9?Q=YP! zle_1>s;O9K_Q-t6GOs&titldqX16`QhkM_lh0nt$Hy9U!Ix72$&wN_t-hHQJ(}%K) z%VaiLFPW1c>Ql-aQ>wQrcGx5Xn#~>dq_>>;+w`_=dUT1|y4I@oM2%SLk7qBJ_c+_rct%<_nMuCbGAl)WidE9Ev1w1*sfhWK7<_B-LgFF z^=fYSl$PlZDw+y1R~|dR`YpEma^P0CIhEfPP8EJ@m?-+tr%z~)D&#ZU zqRH(PGF7FO!Eup7wfZGl&D9$~q9<$2&+mP;UoM%bsABKMw6jKc?xaCBip?E7ZrImbR();Amf;6LvlDW|k3?5sKC>8THwtHd@% z&bZ;G_vxU*hKtXf=lopp_2dEO1q@d3V#W7gSc56og=Gsq`+qy8U;oq5-%?I#QTbl; zywn+)KC`zkHEsK}de7D(ZRWj~&resrQl2#D@5`wF42Ry^=Pj$(cCgXtT`r+6t2y0E zqk7hNJGZ9=%6|*rAJV>fscZx1=hX*~7w+}>7d8u2H2mFrb+^(Rk=ZRz7-sKT(lq5% zslr1&#yKiN{zgTfS}GG%pE}FBpZ56_GI>>Q7pwgZ7SQ*4iI@97JS`lqmTb(D}% zh=FaX%;uNX#n)E&?Noaw@+57_0)3$aEKB4ZtQ$WvdR<+zb_S@--aY%zTE-4lyWe^4 zn&)?JaM%BNGvxckM_S6#zR`ECinC2sdnKfBq#)_7hRn*FmXdra{Vs`?2c9<=6}?6( zlNpzHx!QeOSj7HMFv9-#d!eO1x~dB4Gnn@+sByh~Au&S9=E&@sLF>1<^=B7PdR4aW zxg`6=!b40O7Pm6)ROj;aY6zID>=hl-xGVOtP5-xN=?(uGv|lZd3t7N%-1wF0lsSDN z_t}o~-FY;(@5|Sz>X|}%Lh}A69$jJl`q<>b#4hHmXf0rZT+!wW*Rt6f8ngEazKm0i zQ#yC`;zX-^S0_DBnw(d<-^p1xreo`*4NkX%d`v{92sm{FC@fW5t@+R6!@FJGzOT+Y zu3iwoUM!;^ck{dOwVF&1jdC)A=2RJ`UO%+w;#b9|TRyMwd|RojnVBH!r z+TaJVbKaewyyR@seX%)L+T3PZ{c@i0_KeZzpugu57OuM&TwO3_roU19w3{mL98{iq ziR`PN9Q*CT>FePYYc-{oJ=wYD&U?W9%)!C z|IMPR!LOOE=oM(P>hqJ+hHtr-o8(P-6f&E8TdjnN%*#VJ?)2Ml`=+x^L^|k_WUcC? zB|4(2wyPVKR{Gt3oSU3#9U>W*y-)PiRk3X4s`5~e%hS)AP12oi;^xz`Ky%XR&caDc zT3gLLo-A-Y$UfcbT>7Nce{p@)e)_%U;^}9T{xjt7h?CpAW%<*?yO(a%(9|r{^gbD^ zsZnadJmW@XxO>7^yIl;7YRmTD(bib8&+AteyV&hVb2Ps-yt*v0P&wUsNKVe+@TE0Xd?ppwrEfhkx%Bi%KZkpW zxx~Ss%PLD3Etn)U?~Ke-O}4+x^WKC7^$0)6m_OmCjiP#4fo0Eg(OnyRtf4RNj*H~owDOcEf-gMlGD^Z0>M3>ELN>PdD=beN6`AJ-vM{G zo{9GTsJl5~Lss>flamyk9JPc}76n~d_SAmv(e>^db4+e}ly6rP-XzaDlRxO@#G0M^ zR%US&?s%xap?C%N`D?#ko_KXy;r#QXMUwUb<+s0?KH~h(&|;qa&r9F#U0=;sw?bq0 zyA|EX*tT5f-@0zs)}2f)kyV?X=U=&et1&lKkvs3+nX1UUJ-tB>}qD?w@ww>9k=~N>+@rH$^TC|t?tQw&@uafWAQ=a%7P5AQX-TOz^<_3tq zE2+IbwYzt}&3}gX*9yP?XSf@1&L&2$H*>e{B-VGOGxs{L)Gf;_UU16riOJzl6Iz#U z4=Oj?+9V({NyI!Q;o`@G+*ADaevM=+HjLSS!urRS>&w5Y&a*MU@Mf#Z%*$fzNzV_4 zOc$}+exTW>hHYQ$`a8zkPVb4GyK~RsOApnmPjeLo=Xexuu~^FAvPOkz-I67fCuM~$ z>r?R5RN*gCZ*n}xKX-4yU4`D~p*M~ho5mclUtoEU^S6Acng5k-srPjAl%l$#f^VNs zdakp*@#|La5B0&XPVNb5EZFgyd(Fqy_pWQq&zz`ZDJGP2{n|p8kg|R?XWumj&(nl& z>0a1wuEV6?Jze|hoWAsu{_a<9OXS*CZxZge316*a`C|)jXo@D6acECpUEcenU$=Vv z40y%;#9V57^w+1yy^e3o*c-Tdq887&gWfZ9UE&VrP5E5d_UEBjwAbnEI}(7HQhTgZNM+lV^}ZS`stOMkxZ+K`ABvUKdZ&Ls zZRS2#dvg(wi)w81oGUUDJbu`3@;~jD92#*xvg@P$+&ka?_GTw5hsIR$NY}_rs@|O$ zcmCzaw9ZGzR$iU3V`JeC$E(-9tE+6KRKtFURL-4~d1_DGQ|BquZ~f3OTan3Q7Q?v?yOFg3;z4|u^ zK6tfT;DoWq?K6KJ&-359oH{?~mgL;(sHYn2=}R+yHMc9cCE6!Hnq;Td_tPw1-)i#7 z&uzDw1MjNDteY;Yo-x%drZun3`JHp7pKkhIuRxVw=WBg*T0Q62Dzp4v)K~e#{mkS4 z41STncT7L1_P%zSPtlAu{~69$|JZV~@=DnBJTq6NppLYvY3o;5o{(6-M85ga!jNNA zug+Td&O)vF)}d#=@^*E7UVe9zrNJs?!6diDV^iAfxMVydgQl@PWp@ZvV9@t|ce!9g zmDl-Qe#z_-f1azquYING@hQ)5^+pE&d8;`k|1zGNzjMK>-2yhxv?m_?)x6Js>#Em% zd9mxJ=Q1u#eC55jk8kxABSpWdnR8Z5n%0(U{B+yte1+D<#S;UzicIi|3i1nB$~CdT zIp}WbeD*JXYxkb>xp}>tM{>QlQ_z&tK{vg2m$WoYkU5{hAi-E6tFe>6@wi`Bv`e*0 z*qkW~mMnQE+uZ)T^PR87?^m0O4c?6BSozh;LYx;8!Hl{4GL73of$S?#;|Vp2_I zk1VYAUvwk>MPH)LB@qq(rgK-Lrk&UJzNfrV)4T9?O^c#!bF-H21a^~8&s?o~!&6Q& zW$l#zP+l)KOZ}GYh7YG=dvDLVJ$ph`vsI9eyr}8mh;gUjzh42Z^kGsnAn&aOLC$JH@JBZ~A^Vy#1T? z{BGZCe?8Ok-j-DsT@iY9Q^U4-&W8)~$*)%3KY8Bm)#>c%dy7}-TRohe`g@aW*TI$V zg`S;gOZ-@WZ>`C5x&8qm{qgj)L&8lB-_|MR$ z|Cf1ww{KK)P~;MqzP2=tmBtHqxFv5?S5ywDE>Tk*MZX<`30}8h^aJ^J=%4{buoh>z+Tl z8obLW}k3RN`_u0;0?>#5vALrNbC$E^Q{;k}oIdzFooR|N1 zc6+f2nPD!*nF(5-(&e>%SGX!$YU#a zcp6Q;sdt}~)3$lemFX&z47b~g%%8Ss)u(9>pV>cpF7ltDsW!y^-(26on#DV+<^~o_ zeP7=BpCP1?cMqTFt3?~P-c+Aed;WyneC7KuD~gz|eZQLYpMfX-7rVXKtgUtnH=fzN zQ&Rui?7PWD;ca{s1Vto$SVYW>M8cURaf-chY}Bl0_Q z=i8@0Ufp@mRT>n0@`>EO=cP{@tk1DB#((5L(SG7|$90MCl{IF~sXLBMIQ@6)B&|h? z_s&*tvpA5mVTs14fSZ#zCD+8(wEyXOKgX%KW4fPIbjYt;iPPR1CajWOJK@5Q%wE|o zs$PMXfq{w<3_U!di{@+k$?@&V@0x$mZPlN-5yhv%+iTkQ-qYfl_fO>2!ZXGH8N{o4 z88$sU+$yV|x1k_7;Pw~ZP27D84sXA4GsavhLNUYeV8+5q>!zl5yA*Ac)A^r@Thp(J z&Az)i>`d0tys2W(-cBvNwBKUKM&5$kHT&nDbWhoPbnkLKRjoS=nsz$>0{7UY{$AAE z-1(Z{_buBwkyld_%5-_;UzaPNUieOF&eW%xhY$Z}xN%?9zNt3!r`19&g=U9OULmrU z)_$=TJx6bDe`98=o16B0*(1-c8DcZ}_e-ucoEtQI%F?n|d>Un`v9m(vomoD0sxEIu4-zX@#H+@zVqJ1FP|IFGrI4ZC;U|V@WJ^%%#Zr*UkM7kpibS; zNmjvGUu`EYUAgt_sYxEzQc>+k91gB}8yB?4R*U`KeNn^z3_li!*7+^_Yx-3B@Qtdv zyCOF%=54x?c6sMIkylF<9xBhUdtNNJi|G<_O1g7pT7J!%Q$kZW8pJu;HqYrS-2BaM z@uv{~m(w1;e+kR(zUzLvefS#H*%|lXqdjNK>uP(WwW0fG_s(g2SMC>EvgiERsSAiqm#|E%fv&;FQf|XRO)1XZD^&?{qT%@~)BZ zT=7KF+qdtdVBpfXax8hNbw?}~8DB^VF(^?eNOcgL;Q!_4YwOo@l3w)&RlNIp^lW1B zo2y6oD_(4vIe*UC{r7I^*~~b1@BWscC*O9wwKm*rZ7UVNddchTayi?tcb-YkGP?72 z-<`{1YqJg86HZiW`#)dp?K3Tfb#3m0U9Sq}CCG%RaUZ&I`OKYl?{-~ulAm(Bcaoiy zGq1|Te?=ZYR$i`PpSdo0<4?DbbD!MK-~MBlS=AQGUZ!a@{{|=b@Pv${2pt6ka ziF&e!3{EQwE%rQh>e_UPzJPg`t|lKW$}(CgX8c5BkU1q1s;_)eQx(3y<3fvxcIb_QdOQ8)-`nlQW|dr9ve|9>p39p;TBUowGrWm; z1~0r{MXYbC>I*r(r2Xs8PxG7KO+9WAR{8Vw7nM7uvF+@iAML+j`D4pX^`M(mSL(iB z7S)}5cv`FW#^Q;31`a>$H`=RugQ7gCO`IQTT5woV9F}3;W7PVVl z!PzN9vUnz+r%H`HtNPRB`L$*8ACCTKSWx^iJ4CQIzS!b*Zu9whg}1$*`qv9CP>^xo ze{0#xAH6OUmW$2)+WW{_bvcLYC9P{k4lkQiFCj9E%QHE)nz^=34#n%!C7Bg*jWdyB8#jg?ti~T&WZS$;34}YPnUAy@lr_T&=OS@9pFH1dxs@>*vEYarj z3Snet)wI2GaFK=e;vJc`zt{8qkUd@=Ui#i_ z=888@4(;$ZQr_3|M|8^*r&j(zmfBk-R~dfKI#&F5#B-}xy_ zO0nFLD|q67s)Ni^=a~$XSPpzqDP2};RLuIZFYd*;cmEmo-CdykZLiX5(SL7OubE?h z@k9Rf2RC=!S$y)%(irZ{!*vCp5?gm~kx{R-c2{gXHT91CRju7oS5~`jt_Z$6LtJ&j znr+3CpWW-%t7$y%9Q63oEIozayVFkm`u?Bc)e4Spt1rH|UbxWd+8(ou*PrQL7A$DH zdiFnqwM(T3i{iISZ(LcdCM;#x(y&0JpmJ8V_pcqvX4+PTr>EY${GZ{~m0#|y3D0GY zRd$tdm%iunzuxnEz19EacGdr$l=;;8>MRB4 z#d}xn{d_hk=i64xXNHWPJM}aCGyYu?efCr3X(bDT*>aY5VOPHUN_9W|cX@Tbjp@b9 z>!-;+yIwTuKSQ<_V?l0w!ly-|TX(Ru<|r3DDPr|dD!w|M??1!q5}p4HOQ!l;$m=o+ zUeS9sHFC+K(0SL|PWXA3n~S+GF>FX~sNVfExN-6tFSeYp+5=y{$KK!lY|G-%q77b8 z=QsW-xxC8H)0BUL>zfbxv+8d09ZtR^RdhRN`>{M7kBNF*sWaZ1O_*YGJEKdeMOB%T znSrIT@q+pmkE?Mn;=04KqfXA5v|;z8OG4{S(S;|@Dm zH{A5Z-}KeJF#peR@c2q*mRy-Tw&B{bhaN8LO%L)-G)#@XU7vFOrk}yBCmeGZT`(}1 zw1|ye>wZ;z$johi*Un~g`yNbP(mm;l$a>Qnfso{<%$b3w990^uG$tATYg3nOy4!T7W!r=)s^;kh3{Tj@V_o4f&{|sq!-nwUe5!KE(dElJo ztodH-_hW?5%RN5>S|sJqQ1s05iv0wKJh9u;=3NN-@^`W4%h#@pSXaJS$q$3!X2(lcBJaL9&Wc0e0Xl!RMQP- zrmyKSW;{NdU6DIjU{VO9Z#(y&!ED*=-@6tDC@=kOyVhbh zuXFC%qrd73nkJsJc;aVNwM584g&{5E^h%+{T;@vdy97Gze_bwNEv|SV*1SLacDP7h zjl{+5tJfl(a;z^K$MhRm2`zbgJgR4^%^ZzidQ+Fr_uAm~HH@$1>12uj43fM5+?u~L zpejIMuUV;3;y$GtZ~2tZKc5s{80Gg^_tL^shEGH%UZ26NAQ$p#xoOXF0LBSouFg*|NW8 zrCK>+7v&D76)xm$Xw`c5K+8XEju1;u$=8WNH`!nDC9k{edn^8*?k%IDnnU(+`xh>2 zaNBMg#{NfU<71ou4D0&(;$LmKDt=$!YPsmLgX#J+1P)!wLTzM>VT3GH+UiyCqwuAD2uf;O1uUqw3FXG?Loqul4F6F$Ey>-gT4L5JQ=gVJm zJ$b13_G0Eag;yR_{0KR0a(R{UJIiDBo07i#XPBSY;B)J1gukwJ%I}Q#pQA+Ht-52L z`C383{(IoPJsbZssC``iRWu(@9Tjx~w3-7$@VeGhwz zEi6@%8HAqR%36QvY5&{B^UtpIZU3$H^*_TL`=7kQ+cG#}U%V2wI}x|x=7k6I_MOz+ zvDPu`v!^7x;U-(z;}g`USqb|ctXeJqvFt?sx5e|%u1@{W@H=z)uKx@<)8~J+H2E~i z@Ki&B_ElGRtD@tlS?XhD|7H9BO202$RduUl8n@9+pRgv8-Axx3nf0V988ZB8RKAv# z;BS?A$!5#ZHTCy;>qP=MzrO;zZT9@LD>pt~vG?PK^#yAV{%0^M$@%VCUG}Z_$@8d-F{=Y4)9I&1auz zCk7W@T3|Hgi_OozmZrN)O7!ME*f(b~x6_B+o|)Y`Vcwq>-<085dBkk;%aux2%K&EJ0LqL|s<)1Nt3`0wmdH!90*rHiIqe%e-Dxfgzxu}5=PtThbCSc6?=g8f-eveoI(<-<$WJvvMXYhyH%rusLJvx6V!-MZ1^!nV!+o zo#C^e2$VHU;IIr-5ouUi`SR4vC;dM{bG|yx{!}*c1xnGjR(NUFQ>O{jbEdT{*s}Mi zxx0wN!IKQf4%)4ncqw{b?b)e~=QqZG^kq1hHhFbmR-4qOTOy6J8=6)x?o_pQ<76^d zaS#bL|rS>GCDCvIuw_^C4YC#!;bRzc`aN4$!WY3-X~ z+VDW-*D4*k7wfHCrP~UF_(Q@c?I}9AMzpW;#PLo>V0q}!Zt9@skLh5 z2IR>$&^+$pbtV_DMOpo4SbX$W>Wceoi{9?5<&BQ-iqG`@c6Q#=4w z{ck7!$$H~4YrD63?M}OAOSdfCK2gSOv*`lyhCPojy*u$U^YZ<5eX^ygv;WqvKeoWm z`)AotjaU9E?}Vdvv@Wk%X0dREN{lJDSgG5N*cj&wuSMQ97F^et<5nL z+NxRiHa2*t%L9)mmfwrkas4tZzpZ=!U}C`+_QEe;U4euM;b~ zx?<@Xo8=bslXh%gqkcQ==&mR0PF|AiRrE_(!Lnjq&`%YX1~%5R@UMP*I{6ikh1*ws zU;nJszm`MSefirzjMtQEKiwDgfBn1p>@t@Ylci?4-#&>5Z4zy6Ek1s2J{RNlU(@)@ ze+yVuRux&QiYooQv<){75SmWSRvDf2;n>)n5)jEBwm7goGIbUbg4 z&AJ~4j?ZyUeRoz|Mpb$O-v#p$$)o!JmNwu07g3Y^JM}-q+wjDfzTry~U+(ttw3>C{ z@)?J|+iO>4dj^S2JLKh|bwZ)ZpzuucS}XnNj0Be)Eqj?7YTb^zMXy3SoR& zd5rO9y*Y2{f|4uK-(PRFcsonz+EOo-71IPfReC1R`}K7G zqJt}P#Osy2?|6rPx^MWoa_hWPHcKq_ls%p&DIe;YR|eKhn~;%4z`|J`0SoU zX?6S36ThTuyG-x=`&&}}a?{y=`>sC@_I(|enJN6H&v<37p5n|?(Oo{*PB<9OcTj09 zlAhN1HbB;6fyIYfZuX87pAJ2iI3NFd`hSM4?q79e&)e(h89x8dU|Ih=^wx`OyDXMy z-%p**KI6~7>xREq@ol|$G-hk;oX0bde5>TY8z5tz`b*sJ+}4encHw&xGb}i7%#-zoJ{yTyH9z10*uDcWf@>(b>8PcEnDCLCWnpP2{GM=6~oLGZZYS(3wQkTys^#gLV1bxr}`|-`mZ{2?><37Y>n`7z z$FoGd=Ih#pUePS-*1IO$I{$O|I$rDQFBcC_ygDuCKf}|vb*7AmzW--fSn+h<(V`vl z+UE>xpIx|Dv2Ax>(B2j5nbNyt5-$B`cokuL_i6hv`)%$YS8v!Fw)WCyle3RZa=o)E zk0*F!ZZS7qs+k>}&8WaC5-}>sW7w<1SZT{?9c&)xBZ-?=xMN{&^tcs71?#ULOCoyw0V4x#XPl{~0EIU;nIx^{3v+?!Q|%SMHp&Ek*X|zs%$57amWreEuwEiWUXYde+pu)%{IYk)8U8bzs=w=Da<$j*k6!_*pjgIqz0Kwj%k9 z-=5CUlQO9V^ZzrbzK=iia-01{-A~&2fxbId_pEv&-zqvqaG8Fjmh&X8ot5(y+l4>> z2#|GuU-O@#U+?~F`*+LsdM5{mP1QA@J*z)o)*||+%sq$mev2*T*hL-xGlaZ9(f>8A z`1|^*f9W3j^)9lt0&s^xIDG$RV}&|BR!8R zzi9BkF_rIEg&0#&?Va7F{~0*tn|4;c{^D)Z^~`_szT*^lPCZlq6XabF9eGe--c4y{bC;ZYYojdh`n(x?1t(14 zsK4k-&=kCvz5dC zMUhX!cE1j1`8d^e$&tdz{~6fyqqmDL=!;9g%xS{z&udrscMmkZAAZq#{)&|JiT?~8 z+y5G`)(=Q$Q*h=tSLgCJ$_rGso8a(t=kmFJ?uL6Fv-Klq-B-<@UVM7~DfY4cq;H!a z-sk->>*@V~yVJ7_6;~ZD>Ah7J?$N*gRsS*P%)_}B>ph(<4xBuoklY;ayzJ?bcY+yx zDls-|ckJeiTYY)j>DwP~?p*1+>B)+NHgXQyqmHm(+3ta5)l0O+8n%QCJ z6QkH^9(e2VzH3dFPe%Kl$<=oJZf38SmB$~hIiz}6$vcFt; zOhn?7z|DXi57vl9hxso(^DE*TqxXM?l?mTpAAYQUTlvS;8)0W7m)_hJd#60;R>1V9 z3$}%tF1*EeaLH4<>2?_b-)GDny$x$7_Yb|rJ!c;ELDF>h0iu89_&GuM~i zCmwihdVSEr{|wh*MgRM%-CifsL3OZj6<#QYalym^sl{pIe*#<`oGZrv&_!+i5Zq4YlS;O&K9C&!*EUDh9< zXtn8#=M#JTE%mpS%{5(ZvL=IX+rOn-wro8&=Y`X=Et9tf&4~*AuuEjE7W+aLxfUtr z{{1TxzSmEKG_RKM*K%){-s{}@<=)4J>5Dx|EZ_AnncJO_AbXeZU;S3mJEyMgGME1d zZ3smF+U~VF@b;5l@2ocy`GUgs+hu2YO*`nJULGXmA^Sj{i@6`UnQ?Vh{Dm!*GuGSG zY^XT4pzX>U>CS@(UVd1;z4q6O_m?4+-CE(T(Ko^CMoG z??y8njo6eq||E=1-*TLLnlW10Vv)kw5 zr%X!U**7fSdDEuzxFfg>o%{Fw{Ey)J<;rRCu*|frt_Po&>aOHn#p4#V)i;A_i?w=H z@w}CH=JdVkmn!@IdhveWY58Bj?U!okEtI>El=))a@0A7BrQc56yB>FE;;xsX)(yuG zNuIDh!hAOifsTYh<9gO$hEYAyXEx&F)b#5g9t{nd0+^~(L6{*^qZbF+BOi+dh- zAFyZD@S3vt0?VWV#+BMp=RFo$hp);xd5ryAwQb?=e4d&`4bei^R``i__uQ18weLd{5zH- z&jb9I?ru7KM`Zh=DCejY#ogH)vo(y`W=~4laC&XKlZwIN$XqaySHl>zF-QP?_X(A zkmok9cj=Q%ahYa0?@foMmd;AC+U~%wdQ*0L&gVQ8Rqf29E4MDy^qLgJz;EXMpoL#+ z`uxXyGaufu6})w`RAowZ>*MoFRt7Fzcj4_(-5t{w>1k(a>0u3pE}N$oMc z@ij{<4%a{UY}M}b;oZfIz4yQ9tSyv0l2x)Nx9q5EV&T>Hw=Z*l?p@N_Z>Gt^D6i+~ zpD`h?eFy)clTw%L_Q%aGiCg58_fXbz=V_m^R3*)>=@Uh)pS_GvSadTWU(1hab7Rz2 z`N_{YO5b_5R+Sgq!SvEWGqpstQ+7+s;(a)xA6X6VM_B>X( zf-h8hW2N6mZogY5woU2$TiLel^55pP^PV2ht>v6{scK%g65pM=oi|Zdf7-0*)tOHZ zI~;NfDcW$|bNA9We&@H`ncFb+)W)Tm+bzP@9Ous89A^3Xlx1q!o_p;f9ZRmv?b7W^+KkVhu-%Q$cd3e2&buCynU$+;a$fGo!L?iC zS{i@ORrhh5z4FOzy|;J5OFGn!_^y4)QKYaVO4;V!RmDRaqLcXyE-_tepSI*yzz)Vk z7Ut2dch|~YUiR$FjrUGd^;~8b2^#;_F=f3jD%$k@d(dT1y}YDu$e*nutwp=L-=6i{V6k-N zj^7tlOePCv7n_v~ricV82>--*5@&KI|!?ea@i>$ZTUtvpSJr}s!P z=Zlrdbw1*o-I;#znTm?mK3 zf7(}E_TIb5gJF)r{~5lP%#~_;wA0Tq?}WJO6vgY3!ZY<0w@zizSzhK8vg{7S7ges~ z2Tdl`o_d#WHdWi-YO1P#j^~t{_rKcJe7<|FVQNCf{An8&o?iJ%v(Ing4#y08t5eEb z!rH#?ww$uO>WV7HG<3LzWdKGb?c8T0bU9Az0zW$6W`^; zB_znNRNuX8p2yP@^QSGU3VK=YH*NFM+1&kRvug^byDV#ncyqZmVNOqveBT_2{dbm3 zXUP`NzOf^!Jmp#F%{9fEVWKB``eG|D{aldSW&besu=@O+7dHQ!6l#-D^)IUP*v`9u zKl>GAe&=puF<7?e<({RsOL}CU%bW~2{wDK~+kzc#h0|0b4(FYW%xuvs)(l?9qFF7( z`K9lOZiMW~z!$tayng~NSp`RB+${4=UHax$)19!(%S7+pJ9Fb{X2h*Umrn+9Nh+$k6597Hj zvJXezTDVWH;Jx?DlrwW>cPbrE?`5!?_Grrzc54>(x~n!X{oXv@5@tBr|AVQ`?k#M2 z(`GxV9iDWfwEgiNiPG&s!4ra(tY~GP=Th|4Q|G((uJn7S%h+Yqs<;kJxp1TAYGdD? zpA74h_GCHg9QgWY%jr7iySDZ(6Miq+Q*{1Mpa03fHrXfl-(i`^a^pXPjY!$v{`toH zH=i@lJy$p{^5e4GN6)=~*V?l?v2c_6nuTh??vPf1O(= z6=9nhS5+seKJW6MWWO77`=>3smG-pUwNEMP@;j@B$*rBb4YkU5e6_O!V^nti7F^SK zJ!y@}FX?%wrd)2-jBsiQU*r|mn($pit|jQ;Hi!QVtru+df6q0ZUjJg^?%(_Gzgpg4 zS!%EAa&KpB+p?z33Go>Ur#;-~n!a4VrGIMafrAH*zuCLx!PkFJMYgHj_^tHnuy4D% z(cIUThuHj$3M#8sCVXGh{zq_M@rmzd;mZFROjcDgPdBRiam73I&bxD&)raIaSe(w< zev-T7RIVfEn{%NJMFo}*DuTD~+P-nl%jFKQ|4zI9aCrkbv8HcJx%WP9oBRaL+sU zxu#R(&Xhl&uOr{LL}(9x{ON#oS}$}3k4Up<+wH%&P1cuj^&0ir-Id!6EvHz-@lIX3 zeZrEZ(K3bB4d=ub&Jp%I9vCC6yF+VJ?v&5jrQ1R+Cv4r;s-l}{y(wtYv@y49v${Iu}bw0YVbJ8JoEk9H}QIt z7B36Q7Ob2uBzC*^Y^q0;zY~YWL3UGx)myGlnm<`)2EV29$?L7}R`}1kp>=WFowq*Q zgC_oBcbL*(>om82Qv9TQ_P@XdYtBEXrB-QA%Ut(<*_;@?^1D-2SIe?C{<*unD(5{4 zng6-iOYyaSN&4BX(TT^Vo81afb4zk-MMn zO4|9==)Rek<``A`EZSCS-ue9Rd~fDYoAVFF!_$0r#);N#o0|DuXv38WQz|b-`im-D#Y%NG8>L=kW}iU!ONF$qTr%xyi}hxVei-;y=Tr{7H|b zq9#ANf9QgPy4`2p`6q&8t)DD?a#-zP&P3&t=UdNNy)hHpy4vk_(NYm6{}-~))?C+{ zzUb8EWp^bd?C0HjVi)DST(7+3oYhe6rA2mmjM?l{_p=-Cd(D)L(h+j%rqsN8s_q(~6pZPkdOd zba74F!k)AnN^U!kdUs{)6?!iFgmuY;CGVU%PAIdKF1fg_ym;k1zHaWh3%4J-cX7(S zfC*3LXv}#$Q%gcVsWyZq{-yV)sK2>)bpAezuAi{%uJe_+fUokn-|^ zi_^}vK4G$Vc+b+`x5m=y$f2D_HlFE}oIT~s+Casf#eLJCu<)$e*0lE2?RhE8eOp%t z-pS|MDzZDFaLe?^bB_hPq}cTEfl^@!i>ICEJn!0nz97qP*H2iZf71A5@$QrRTbutg zoVlI;Nz`iQisjLXdkc3)UKWxGoA&vW+?+#FnOm4bwrZ^A1eZTDXDb_5rrlN8SiJS- zWFwVjlRonw-(m1LUtx*B5=|{dhvySz`lIw5qa*iBwV9FPv1{pjbvtn#W9!X1veG$U zf^Tdq{Kej>{&=}PN=3hPT6XV4qr9WLnY+$B3Sn8+cKF8D6Q7@-W`Df4=e54&ZqE(w z?UJXLm?)k!m{`)cl4of>t9Ooek)tf9gb8bL)u-T3Noh}$a_6i2i7(_oADy=(<943d zeA5YQm%oxVS5?2oYPI~N{>glqKeK;C)c-lNtzI!`_1#mi^1@WDlcKotxOAH}H{X&s znZQ-`>428azvI`v@_rq7`66q_D~`ao6PYG8{W(3SEc(tOp(*d88cwP+A9)ZUaQMm0 zC);->ACo%fg9a&uW;cuD5(qKFMUUa^FITjQ0(+Pk;FU+3>HCe1HPf9lq4dnZ=+ zS$F@5;N*E;^L(5GHw#o+73?rdw0h{i=X9Dm>o&%}%m?OATjL$K@q1y>#FS2{2f3fZ z`69YY`d;=cO5C|TJEUw)`Yb<=wSF<{9tRt2UVi5-i})nz&&xIi-!gxhZt(%MKC<2` zebW8cc@NXyo8A7?YLazd)nCn{D(c@ zryvGS4+aJXiKP{C`=>45ZX2j}n#=Xl$Lu^7jgxw|O1?+iX5}iRtn>vGZO?H+Of?(`{iBHP>vbxw|g5^3%bm-$L#eJo+|mOKi-ByZL1tRKqz&i`OSE2yNwe z`E08>-LwC7^p7z2UFC8K$^W9hm*4;Ka^J~ykyizJkNX(&y%*Keo&Ml%vfYIO1~0A& zi;P=U9$&M`J~n&j-HEyNn>Jd!s=YAJ3tXaGff~3|o_{l`VTy9sTmE!er^4@-+n)Sq zIFVK}cS%<7?H_xWzS|yOkXzo(b9-i?FGt{47IXP~lbj~sTzY6tk4#VcR12@2vF8>y zY)&ZDQxiGR_UGlA75T|3G7l13zW&zFWdyf|W<9fCdufA*;?(c|j$8>2EYv%{BwTiH zq}J8cn6*b+?&KFLi-JTmlGd*3$C2MH!{3%Yjo6XCTDJ4ul|C>YjgZK zRJFW16a?J$nFHoFK09K+X4`)Tk2y!O=l3tLURfx&$((k6J7}Mq z^`-4%^R;POFKeF8HG1*E7?1e|B2n%eErT1oBs@7Hm!WkeEriEFWFP?N^K7& z`|pS``;q8ddAic8+S5V>($@9wSYBVMKYwX^{k2(tOqlIO9IWyL6y$%nCcHjBf7eCB zply@eF4;QozZ&4Dd~Vm?<&TtnC!RRz`|H?-O~1sas=X9hD#30ykDbE^ro!92=j7(r=k645UGH@FP1ui#vjce!v^@Dyc(`Xv*t!ObN7r7T_A1YHy|bJ3 zWF>o8Y}x7^TlpoPp8hR=`_uI)FK>4lZVtN}+|QO+GylfFQ>u=ia+)Wv$lKR>JY9Un z>ywr1@*mB8?f5#+q`Gi%^ zE32@Wv|84=Y`P;}yJM-dnGUmaIooSjqKc~V@v&URkKN&8|`=1=WSJEh#ttA+NJKD(TMrEKT* z3WEohw$~H4YjPEIoK?-U6K+^^OJJ$M9G2Bfy-al{J(`^@yKL3Yy+6M(*_tKQDC;hm z`b&r3Q{|m}^aLZ06MDxE7KJOXes{z2=}qVNmj4;p|IPTgYHLmFRe}5Jt8;$GbLAR7 zzxDL?gzc%eVm!-2PG4NK&bcd|Hh-5&(bexYe9fC$Pv87`Z??(TX^&RquiYD5oM~5YkmDR^I8pV0zZvJL z4lSFHlL{CP2wmi8eZedGzW9`S$M+xCPQK`_zbuvcJx_?a+hu0Q{MxtC-mAWNW-dME zo;LZb*=c76k!L4&sQliUe!!md@BJ5Nv%l{zef|E_$K4X=lez8x*qYzb*?jcTmC390 zQoW;Zi$!(r++$X}{gv!rzT)pMcDYPAuNf=(ezn_8m91Ixi)LnClZs2J_!#hbp>+PW zPp_XYNw=M?Su%BklR&H`bK&a51}14O_6d^z=3m}5+qdc2k_WG)cm8L%==?7~LX3Nc zV%(p+C(VCfiGQvtSt0dhbyl(KErCt1xZV~{Dtw`9nQHm`H2b^cs{#7zYnA4T=Uo?z z_%?Gx;_ApdDK4L<-Qk*W>B7mkm$uugJ6+xJZKk5T&8x_zI_2ypdlw$t>U*)plF8E9 zcdKx6rtXp!^cspJKZ$^n9Cc5AcS+-m>ypCS2DBlD-??fcoC&R6c1d2PF`ZppqFU9q1Nrt`k|AivY2bnY38 zDQhQe*z_VZ(`&+XCy^FSRi)}=rBC`p7z-Y>#5WDZ3N~;NO)DItDOF! zsHG(KS7NsRl)Hz+T({og(%WUp>$$^fdf3TQVZUR}?V6sPCwZGMOzx{(&Gmz0e!?LU z_g&iO7f)cHdGc6Y;#-CCYku>0KDYam_w$&&Q|q65v)-FoHy5wz2wSyFXI<4Hv1N-= z7e8A+Y01L|BL~edjS_)R=Lp2Ac=CSQcriKVr|s+8Lb{XRO`5!1um4b^fW_9+GiKy} z<9HMOWuEOyr%U(vVshD8mT+zFH)ZaNT$W$`-Bdk)KlcuaW7Zn6Huf8T1?Y%7cvv0# zP~4NcBCdb)=lyqA{AAy&!+H6`_U8{)%$I4Mwbnv>F<;l!IdN@QS3Q&xd7F0R#QIa- zOM{!Xe4VRz!h7|zZ_h9N2>Rq$sK->!q*b`=&35&ii80xsv5`)bJaV@!%JpAT$$Lil z(_}xp@9$D3mA2kVUwwlS3!%M90IR~{mDDN^Rv+cqdDI;R{yE`(|&06I?IeN z@ul*-rOaZxTYi?s#`7Lw6MEfyG}YHmrqaWIQG?Nx=^_jajq^&4CMM5+KaDx=mtJaJ zvQE2qpm|HX@>Awl61R#tpU!tl=u6nCb+9BnHo5%xpDX&$zPw!Kkj2I8+ki!l}>#y@x;7S^7irH zY@MU0GI2h+yR2`*!~DHVZmL8{G_Tz1l;m95x+%IV|MHZBULlMc!LC~sV?|n39VR%g ze7hm-XN5$-;U2*$Uu7p{AK&|Wn&JCn@B4qwh(G&s8|$=3tM^{iylU>Exm}VgAWJRA zc9MtIY4#Z}Ps{Ayd~S)r>}5UCav{6oV~%V)Uu$F%x1`ywlDlxmtIwx7d*usHNpbO> zEYxk{>d)E0zsz;=N}-x-79N)0-NgO>EL~Km!$0F1-~3%dBBs6fm6u;xSoC~e{M`Qx z%g_5(HJvW-VPl@P>e&n9#O1GgjvRZexIz46<4fjNzPATb1gFgS&?x$;scpJWRo26z z4d?ep>Q+sXxqU<^kU-tT4+V` zpP_tZ*CMHHy;Zr|-?f6mCK(s(EIJ;LX5T-1`L-2$teLNS>~v~_-S6d2w+`R;aAjW5 zTfSpSRZH(PfACV#RoprIrtGSaQ*(Hhs&1V&WkJ_&ldIFJ9@=f&YI}6b?}Zk*nJZ=& zsqPY~RRh&Z;Wl~d3_J`k-&Z|hU%dL=OAF@72D|rvt!ml1DcRmp z-v9FLD(+LK4(;w~@tV6RUuu@jUe47zX4i7JZBN%-eP_SHXPdT3nt z?6>Z@zRylM?F>ck;8R@=4k`^I{(314g=az<%d{s&2VGsg?(_l6J6CMv^Pg8aE_+ih zZt``b@2lObGeXQnrd>GWyMmRWrDua5yW=GPPTPzVuJKRK=I8FLTJ=2j;`dz3NZdVK)jYCYyy{ZiZMjT+j9On6@Y?jIri{;DTP1^C~rUo?E9syoH?MA0`B&Lhr+0VPCzG$|nXUG{op}Gop>x&$8J>K( zzanQlTW+i0tM18%&nfe++bYcR?F3`Y44H!mWp6So^tlNwb^ha$eoF49((A(x)82e~ zcX8qUH{#q=BsPj`9)ElB-9`Cn6Am#(A27PzrK_kF-N?%6bY(%SoZqyYV*lh%7DPUa zN{BI){q{JsQBUd7Ub%aJ&pB^AG_yc8=bhJYhf9~HZkz5TGDTBWDQhyFQ> z+{*uRZ%Txo=K-mG@7&BDZ*1@XC;#`(tE3hE9B2Dye{W@4yYEHOdH)NNGW!hs^Rnla zu+86TczoHVlG10Yw^+}Ic-1y2{SE_QiKX-yeF%`JUJ5nT`F% zm(Naqbnku;v`(s?Lxp>CtGlGcXUo_cHjkeU?^mrq<;AQ$anZZ&XLU=jSXJFEnvoZ{ zAaedLUGB1*hSOw2GF}uORk3*_JY`{Y$d)S_ow^&YJ44mLD5 zsk!8+2o~ zAFW-vF;;lW@Atds%=@_vWoJ!OcGxaod(L#_J0HcsSwT^`E0%IFq_Dh8SkXA~ z%H-4QihMjHT$P_pU;gw~nu+Aa?X@;{*SFt_J6I#m9ekl>_n%N-qb}}FkExrtNG~;s zNqu)yTDCaxxTA&W`$cv_3vAC-&oe&1HT(H`W&fDthO6H_n3vA$^!)9g_rB*N_1FX5 zQ(je1`_Euh8M{1HxbEJ?{mx%_a-Z@0JmIS?)@cd67chMk!pYIHL34u>kMwrvX={kTTa|mhGQ90X*vFhnY*z2ygjw>G z{%0u7wW@ovc*m>P+iI#cD*rP)e7QXAX8Pu(`g-;&-xu<4-m!@|-_~wc!+R2(> zm)Q8Osz$tLpDWHW{brxes~J)H4)?yw9{0Fg>TRg3@w-2Ft94;r)=5rh&%`adUaYPP zbC;;3x-+V+_E(dLvRq&O-r&u3k6*jKZCe(<#D0<9HjV{6OIK{%(H&gxYPdlx9u-toB;HtdbDc%l26R!B|SZ|*4E-b?4L)kA2 z3Fc``0Bkn3sZ&Hhpf@T_U@ZlQmD1Q&m$tD$RVi>cJHs z4$oTl;$g^%6Rf!|C&Duf_PaK|w*aBuenzqFVs0~0cs{m?Q>GN=l89b zIq~7?uyt~`^EWQssQcOQ^}Ts>(`T9$w^;m{E;-|{p01y6q#jGIx~AtBu3*#4ePw2y zc~+NOlpYoZGH&vetN1Cwkn-te<9X$E*$EqBf+x+5FFSDlyM*(9hO7S>mTP5QHuG+J zuy5H{-;)d9wS3&VZBg!tDK7%Q%v9G>F53CH(1KIKW12Xt=%L;FTCVTO@Y}uj!{d;M zyuy2vxxF1GAI?6*wn*WLty#!%MJ0>cx638VIdYbyS6!KSaWdogvw3zC{AZjwXP+nzOTbl{c`8~5X)4(vOx0%tQ)8FuXxNd z!OzjstH9xosAz_${#3rjEnjAv^Ub>~{fD4 zWD8j~Pn+GpE**_nx0vO%^g)K_tSc&P`s2_2XDB|jWU@ii-tRHzZK~&T-{8;In7_*| ztLpiy6*<0 zq%6@4w>atb>9(fz1djlgx2g)7T7E$(XK%dg^051(_uxTEmVCp12F1U|4z{b8`Dyrj z<+bL_6g;%k{N?9H3C>!<1O9f4H|Mh3U2lEfuOvkh$DzcK=P;T>sP^FL!?t zdv;szqFl3?@yuIa$^!x(iT22dtmt#!*Raxk+VM$lmOouz@Ne&_GnMx{KFR%c_XYWU zi9cD%_RjZDoR~9T{jT}>Z~p%oG~K`2?&;Yd{ciT(%l{cp1xP=t%=oFk=x1?lUBE6L zv)6@(MBm+(2=s_6d|94Sv*q=dHMz&M<~^<< zIq}2_efzt%PIKy4zI~GV>wd}ock}-RHQZidv-!{DCytrRY!;SCU72}dj-vTCPEMa? zQx<>N#nR;8ruFCZi{y#Z4k%CjwP5|U`>xt2^H2U~XsTh}nAIopVb{fF?>24CsjmLC zNW6TfY}oJSuAFy~656RtOU?ypzhd8EW;$u>%>|lXfhsdjoV5HFz*X~0{71C>OIDN2 zl@o;-Kdkg=e%JE&m%{rgFXc`3zVA=`&miRRpCQcs!LnZSq)j_HzglLrJpAsIaq96x zcg{&Km@Qr~Fz`KKSfC#Do7fK}}it z&DuymY}(O90^VKK6>kJzCT?=8EPn1_U-`xU!#4X%TnFcJ|IzLL(lq(^{SE&aIu+_y zD}M+m`P(jk%ey}CKZBb4g9QQ^KPLt*d9xyBn$zUG9u7UmCMiEx>zN-KPR=;~%Q5h; zV$vq-r8(;?GuvKW&+pr+drV-drt6YPi#(orKJ%|!UYhxu^Z3_E?C~E`>bMwrGB?_O zy(5xp+??NLyeHw|$&ioFFZ^dXbmKpRhh~%Rq*J9X-+UJdIwiP7I3`LvO?fhBg5ild zJoEnWbCn^7&jP`$nG;15r%XAOGI{fa0{Qj6RzJV!JU@36WKMrb#GADdOLbTKs9iBj z^ho4XzU*J8c_#BWzki|bpPlu|${zx_d|t#q%&A`@axrN(PmKPO)9GA06q>@=>aE-* zMYcxO9i6Z+wTa{TDIu74in#yOe4IZv8-*Bk%i=|31@Rdsm&TNNI; z#b+n>?{rYPbXjrPK^{q;=B+VZ2Yx;F+gHmEj?x)hj!ruDw@Z0_l%j5yS7*=+r_L|^ zb()v&{cZo_$^17`zNulo#q{HT`~{0cZ~kX6=~I1q*ZldlpNlMZ#zZCTZdXpvh-xc5 z|9n}>&+MNn$^RMF#5Me`IQ}?Xz0&2w_Vzj6zclygUa)%Xar@n^y2ppV$4t&IWaYJ5 zcC|8!lSAQ&?iRWIQQAw{FMR)Gq-^gE&&gZkr}a;&S!-I+EqzMZanI*#KXtd=%J&gk zDt3aCx!lO}rQhSz$tRWN|0aE5zkSSJYT>W>C-_f1;+wtOr}qG_Mf>7|6JBSr{#lxt z>mq;A#?|saL-6err@!udx&N;HpQQ}Hk&A+5E9|1|Jm21Zci!?T_kzQDYbUiXT<*A!vD{Mkyv!srG|{S?t= zD>**Z%^xj{qj=knEDBkz!{n(lSyJX-*6|%-W~aisO+;2|u?R{^vfEY#h-~54-mfNW z^7quy6&9ZtCB!JiuJiHe`}@i&?9!3zo2K&K>D9H1`sc|a_~j_104}(HVf&}pPxX(> z8P@Mw-nB<(OP2MT+*qZ1XLhDu*!FnQ{rp1R-fm{;d!?~fE3T*1qXzTxKPzqKe7(14 z!^^YM$M(ur?DF9TE-rv<1qs%7|=?sUxOn1TH%uCz`gg=^xfl0FT&8{7{| zoG6RSJQ!7V$j$ahzk!!LCwh#?Du7bgD(W%|kL{x=HGoy>p1{>{jqmFx01 zohF?LMmEaI9|Abm1SfWePkx^Bc}GfW^871OFa7@2Ldx$MIc3(`lk#2`o#%Aid0T*| zL}1D{-2}!y=b2Amo4iK2#=$&(nQQ2If00w^oI7%a@0=Oi;v^j+FS2@00K5_XQb(NdCf6o6fvS(#jaISUY z&yS#*Xv>rn9hc3vtcq6XSeqi+P{*;f-9MuE?~=y8_)jTyTsfDvd29bFy7l>5hj-MY zZA&$M6kX;no@w!{wuJdTJSf}MT)tnItt&ZqzxbZyTQ=ic=H7eX->5$_!T##RADT;V z%TCFf@%Hyb4&^g)apw+7mzVYSJeDo+IKSq{1^z=NI`yd=|4j&q?~IyuFzMm9<$Lbs z7c4l~o;l<7ClwDb>D(=w_N-Vj&-wblR}*;c6OVtJbRQH$G26fRj038Xr1D%KPn~~e< zna=s?Zt(9Xo>km>R*yF9Nd>LkdcRuy*Svdf@oT^P{(JeK;i(4iwfnmAD&N+Xx5s>H zy^zT7m7BZz?lyx3%3C-k!#k9pepsHrJo%*ZS7>f^(cR||=gxm;-5JXRyk>!NK?04_ zf2wS_)bUsNsLP*{=YRe4mG!UvUiP1%-VYh_NQO0LDH?hCT^ z$9w8bOe47S7aul}z5@1Ulm z?P=TaT@ZSY9Iom+Dzhq8cQbkC{&aaE zs_C;}aI8dX774fUr2 z#QUc0janyFcGXVyl=j6Zj(xBF6t7HK%ayCD#Uhi?JTGSDmGdo(YRR(p`?!)W{R;PW zxIAr!pvm98D?To8Pn~uoMW97>OUsg!^a)IJ#h0&9VSJ~;xA)@29~vxzYA#aSo-Ed! zBVD67_pv13sT0fR+qM4_1GTwclzAI%^*y>Y@}UTKjcLm_j$0zjQ{E{gPqdJ<{UImv z5h=gB{g|s}yem&CdeWsSrmU?IUI(A(ZS=GkV7an#<%MrNr_*P!e{l@>r+Q1*u;h)q z(yd2ETjST{PBl9fw^kkS6Z8K3wo%XW_ZGrW@KYKh3Sb`-%HKR zZ`T~o2`$J@uw2p;^>)McTh7~$^(`_8xvc4_d{`l9Ne>q}=c8ZR9AV4LxJG-=aygs* z%X?)PC{Me5_w@doA@jw)ertYsT*{()#g6thCI4n_+nI1BFlu(?4nxkVHY>%JvR!(8 z%Hz(Gh3*-ahdd7+I9g_L@rd{HsXVsE+1GDH&ec__aa$Ya5>uUNep>n36i;)r8F@Ee zuiJiW?UQ9idb}=dR*_NMjb3H?eT-NCF7tTzttYJf@gmP};bK3{UmV+#Fa758(~nY5 zp1k#|Xw-bMIq_z))?3ZhzjM}l876Fc)6Si<^yvzH`yjUqZH^h9rDi*?YdpHWC$aO; z-$-+xmoHyz-ddIUI%1pB8BUj<(xH|@A%HeM-?Cx*!HTTNOJ7T$t~A_kacYT$*lC|929Lx} zglBm=Sk`RK*3CRLTW{sQgV(OR=WJ)&vAoK6&#l~Zn{y^J2kC6pvb62G!{yV-T_~h7 z?dl#4u}Mv{rXTq1o;I~7CE-Wl{@pW<7Cqx1X)^r!Wn zQuw7({9g2g_G7(m0$(OoOg)xfQCv82$(rxp!S24BmcF{Z`clevE&ZME&35Xq)JVEl zbL`GzqY3FNM1{7Qo!&F^{rBm4zgBz2J)d12uzf%9y!^?Br z9^T%bo%?*t?py1M6#ZS)g6mX|o@>6nZP6)5*378cET!=_bFFJ8J-)xA;JQ%WJ-_L> zQg@pJxAVnFyDq!G+~&s}-J?#{{3j+{&d<^2y7g(wBC$0pMT=@K@?KZZFYDAi6*A{> z!Sh#7ziV(yDs#Q=`CfW7d=9_Wf)CYRy?(Q2<;6W)@MhPyLq$@ShL^Rss@}KYndUrq z`Bkp(qN&lX#nw{$W?z-pt`_6v5l6TYAUp%|zfMFAJ%f_2+ zPPPhjyx+)93U9I%zJB1^k-v{UAOF>{fBN!)NMEFA!;*O)9bA>-^f>p$%#n(EwN+Q} zyMm>NNOGN#_YceSh3{To)|>Y}X20k4{x2K;GfZD|`;zU)*c0!w%PM z`d9Oao?4}C=5MvGhkdK}oK22$n(!pMMBc8%Bq2uX{wA%t5gyTNm#ZpTPn$Sr1(%0i z$MPv3p8oZ%)2i8Sf70~!uC*Ly$AlJ4vc0tZll{+RleafF-??4CQ-qzZJ|z59^?!z~ z>yP?Rd;U{xQdC`s|CBWr?-b`RJbcuB(n_OPExDI6x_N6|ZPwZzjjpK-um9#V@t1J@ zPLcD=B+}2M)OyO_mi*5UWm#8U*6_&wRo72{x%eyBA1(Otu6|Oc&iqBfPc@#LC<^~# zzGIDSUs$wXo`c3p3uU<{Paaf+*H4?F{6+0teUj$9hq8^en*~m>FIV^@`1f7IBYlub z_20JcSo!JBe+HF{e*^tBFQ53!Tc=h3%m0&a`TCUO-t$)o=;2XUlsW@FI@SHnZ*j*`s<*u znPoW5ZQ{nKOX{GC2bSpA^-FICtsz; zFHU=wCVTDJDgUCN(D$mxr0KGLdGSF3sY_TsZTa*iU~2JieV*_OtQ!usS*yr=`k^!{ z$7hqC`Qw|)bC0rADgP0&WjqppRrJ%m{|s-l3xl8T{O7r(_+Ll(lsz-UuE+h7u?bEM zT(a`o<=NA(hD4M~*Kf7s)_VHQ^b7l@6d(A^d>lbc5>e%=G_53HZ-kWSXXLwWj=9Z#0nr&R| zS0+yUE$C1nyZJ@yPp?A_XCmsIi@Vlsx?vr*G^W$$^OdMVuliNmPi_A*+`9H?`RU?6 zlVkTTjZC$wlX!FSL+Bm56PGvS&YL^Aey507&FP2dwmhCLYu8cFS8;cZ&D0;whi{iI z_Bp?4$K7MMb#o?ld>3sGRsC^sc8+GSK!fPl+is7-gzWl%?=E7N`@Ek0KZ7^_&#KRg z%Z{yUShA4e_gs@A`KQXk*Bm57#W?y_?TL}QY(B+uX6pnc_St!dWSY+3h z-gjnmk4hIU>3PynyiP}jC! zl-*t$6kmQP=RLdq_r!uN=Q!WY{(EAj(mByz!oPw$VvIgj?!WPMJ|E7q|7L+J)K44^;SH z&pp0e|7Z4n&np$DgaHaUV)`?vLr#GmT(UFXxOU%3CM`|ULA+-=YD z+^d2nFm2Mcc;54A-LDB}N)7g}G;{QPC-ZW*x6y&iVf`zWe>2$^{QEYGx&1%GD)px} z>)c=D6b9Pu2PJQ(>lZmcP0stNmmTli-PK)rW8o`+wKwflG3eY0p6!{khBM zOnc|@uC)rgE^TKnV%IFxVxGHvPlKJ+`*&yOzxViiV%glF(`x7Hmh``wu|LZGkn{qJ z4p4SH(!;-S<58#jZ}XqbI{ww=&+-tr_X{^4b!mL~4ivpEn~r~9QvA1Ljc%KW;f-z8 z`#2U@u<>8y`ZTTU%T>cK<~vqAtaHzL;O6R0)xDBa##ED-|0WqcBlP2&GveE-IBg=)xR148JH&fd#27w z-sHYH$?AK_5CROeWnhD zg1?mZ1@C+@B7c0s&HTz~< zmYCw1aXXsp{Oq?UqY6alRUEDLd^7XkxBfd_$=5c{u(JEboOyEFsTULfJ}qIbe{y53 z=Q5kQJEE8CONsrJdYFANOrz*Vt>KNr>9e%HzuA9?Xgdb-Gy)*kiA&u6Mn zFW0Mh?Y9r9WwSUic~g`7k7MS46PEY%%@koaTEAV1$+PXdfmb}X8s`JjkX(`Mt8IYI`D^#WP7B){v1D)^tx|E}`4;Q8w% z*Nvt|r}F$~D2#XhE$m=;^L@D3+k#7T)yoPsdoFPC9bt6Nc*a<-{FrI#y1&J@PrJt% z|7Wn~|9MnrBZJPi50-VM**}`5YfC(La7ntSzBuHLn90_QSq4eUN#P;_LT~11tG-E$ zw2(Y;tB74^clF+)zv^-JpmK5}Pjc9u_SS9ue{)tY#Z#xWFu7d_F&9~`C6u;)y2_GdkGoe448M9b?_U4n-~QP*edh%J zXXq~2|7Xz#{{IZ#E-RBGZWvUzGBnAaO1aLRe||CYx-N0IA)^yA>u>f2g{+<;Uvzoona(J}VlP zaCw99{WmHT@((^~OWoJI& zwA(oAcB7kC&4jF5iwrpB<%**P3^Wd|Y3!P?&*!46h>FIdE{3&P=c@WAZ428fmr@h? zVS#e_NvXDz*|RG`J{ua`i2j$&bz%9FT|#rFm^Hi$+uYb-Ik~H~;Byai$FFH0m*}p& z|F+zkr{dG|treHfJM$_&T5!p0$~*JbSyP0sXPh%|G>%iWTo-xqdV57~{?;>B?qzJu z%6j#?=ZKL9BUhz|)76cZTAG}vw!J-7p5m~BacM>Kq6OZYUcF_{-nPo?dcn-9{E(gH zv&(l_Ecw>&!PP9O8Pp)5`6XzIBBxit1YtqN$sL8IjQe6P=@&X3F8sdcfQp8|o}#yw z$@5PK=qY}@Xk)yaJ8jAKS4$V3EKD%8lIyQ?34h|D>FvAiQS6~BVH-GP4c0yIjS>i0 zUlShFWVcjYroVaK`u!pMmR!D5G5gr|(lvdOnYOMeo09CN`t-&t$Kd5^wVZ=XlO%VVJ?HZdZ1JUG?w@p-Ju)?8}Nh zzMfk%@$hM;t-POp#Aa_#Q#O1UIbF$T`rQJv+q!1c&2_V)8W_qie_P2AJwyAH!_Me- z=j-PqkC%V>nPqxRR(0i9)ux-;Zbuu{J|^xtxaU}>mDl5q+8Zi#eRZ!a%*rovYKS}f zRz-HX#Ns!t*Ol8QToE!oHm7}6$+x9_Z={>dx5RE;xn01iE2MRy-%~BGNlPYF31sIs znf^FDA$rfzOr@MNtqxkxRCZ4OrC-VNc!z-H*ClflE{V?-UGU)MSI(Zib=FELM~((f zJDj)Y)g0Z0UJO%~7kC6RTc|TzEI(^9_4j<0B`Lob+Gk2K|JHrnzw`Uf5bH&OoR|JY zZ+p#~YVRDmRl2E0-iD*{xA59ya}qs#BKPHdEY9BBGIil{v-z&+GQY0OtBL-xC+g7q zK(ABtZY*SI=wCVKN!gxXq4|gPgkRq^KcaCd|IIDw%d-;i2EAS6lj*lp>ruYBi;sWK zrP*G|9dBE=6g=L$YRc5V-g$>}VHzTceP$! z795nia)+6Es_u-!rckx$g?vJ7Qr;c+HlMUU9&_d5wEXiX?NL_*rtW6Zh(5<*Tfghq z!Bv<0@0dT*TN`X{Cu5j0+01Xw-j|WOu}drt7vA2nw8zKOIj^jBsr$) zMqRTG*c6p;^H$KcI~s3~drdvFQp3YT<;R2KMJ!bZ@-BQy-S*_^FO`U%XvvCi8#r~h zNpe{#9-O1T^690SJ93ZwxD(QE6gPdp&Gi{87daNe{c0Gzpopxb5XLO&{;|wo% zQ%#5R%jZ^bn@Kk38{hn!`FgLNY-V#$l-JKSCC=0C8qGNNn(uke9+#}>uH5N&TP(<;;V(qg^xjbJ4xvyEh`RKlNxz9K6b#wgugmuM1^-9AC>xQ?MygMW;pG~U%Y4#!8 z<5jNu(q(fK?ug}w?|ypjr;&~Lv@aE>rt2OLI3*J#5W|t{yI_5i`AV(0EAMWpObcO+ z$$!9C_fkcB;?tk!?0@gePnhQPq9wXwecrA@CV$?fSL(KxdzMED$!yp)BX7^8fbBDK zKRr9Tqh-g&-nw;zo;;+w>RKy?FU? z{_iEv^(yV>Jo(SCd;Q&4vHU8@9Z?_8NkuO_yZ7$>8DGyuG_r}VJM?B}(ULMhndE%w46jl*xys{VFnwzg##YDn#gUw&Ss&f{+D;4^LbTJP;@PQQY;;MeTUg)Xd#{ zlQzFN9kq5+OvSl0p(iVgW4&&>CoQ*jE8D<5ciz>%q18K`Hbo}y6%XL`W>xzv>20ud zrCw#@ttsCo9+Y@n`Q)v_50xL6S{V9)s-8J9wH1P7ed{bMK zWk-R>dApK*nR{+8+HY02V*5rZE0M?NcCsf4OlexGv0`@v1Iv>y2Tk8cvHU*2Z|W!i zos%|CDC|2KTUqklujt`cGwq8iZn@9qJKZkaE+o>r)S+n-zY>SK$?VJmj=ZL89*^>- z_pjN~wx(b2qL#~wGd8=ud#0|knXbIUDeOUj>|*bO3MmO+OdjTS*PCar3asjx+PX<> zF~fxQD|rO0<6?H!gmkyea{IifWXf#a56456Zxvg(i|NpnE#HLmg;h6C3gY{B@=Kn? zfiMRx24RJ5D!;c^o~kTc!`M*2XZfR*uNSyZU9Y&fW8#mX-elgY-rphJ*Jml+SjzTj z)0?tsVGEvJS+OeG!qd9LdSg%Owf_vl0UQ&5XI}|tn9IX3gVk>O95be!yDFKR`#zrD zZ*slpLb#?))@2*#wkvLHzwNcI-{vcG>GP&EugyCSH868A?k?^OnzE)xfx+G6^S(&LVn(?-;du_XFg=IUiY=6PcGte&EB}_3bv{{0v8?Fv{Nl)C7+PMWnaa! zrvndKd|;dUQu|A9;j#r;Yb{qP+vn{v=ro)Yy3r%-XbG2Rxk6t;^O@ph@AO{AhSqJn z@otxv=)Tm)zV{a2ozZF+^k}1wg05Dkzv^~wckUDMX?v0%d_EC;@UCq6g&OP4nYTZ$ zu`W)Ww6o3Z(TU3RqC;E_)=pC#PRO*Ed+DD@T5B%$Z*@)6)qBRC!p~E+8$vvV?w&lK zd0~a7Lpdws-C4PpcYRV@b9Gn0OXlB9uGs6I%aqowbX{9Jo6WJp>_&X{R&O@z*-f6e z3i$Y3JxgX4=S(~y|9a|)B6jxAuW!D-|NU>M++{1Z=c$j*t+}R^CS5lB?xeG9T2d;O z&jpvpjIU#Yf^@hwcm;K#ecj$c=S+iATXU= zeM?&O$LG=B?Jb>cd!tvx224A$^0kY$@TO2Hp4hgS<4rQQbIP30vhJu<*)ebD$}3-< z2i)2#RJTxn$A5;&t2X!FF@B`Be!}eOd^a|EOfI;z{jIF7c%+^|M{mrTP|g)MZqMDA z8t9iiq3?o~-Ku-%J-BTPOPOW_eyj*RS!K9GFO@NZmLp_yPntIHiZ@-0EGo?m&QKWv?9S=sf-I^)4o11`Vn6oz`&cNP|3 zLvz>d@LvDE#&@FKsk3vVvIF(~txKl-*&b-bxy`%wsp_<#o8EUf$$ByBnctiunt1lM z>-LpRy$c=G=g)Qhb@}=^=@p(Ej@hQKe3HRyt{j@h>u{r8Hpf7!Kcn#a{o3aNr+G|T zc7$w?sl0aE$=y^lQ}*YYjNV}N4y(dm-{o7G>vBH#ABzskd7b#9lsV_wmeeNS7jI8WGd$|+^r>7!@+beCFPh>*GD@%paSCWW7OpX5G&*LluS;#af% zyH(RY3#NC7tT2 zxt`UlUKe0g!seqCOX<;g!!wWlk- zd42l&ybbG&Gu{?f&t7I~&;Rz@>ekc#K2x?j?({8^*59Zk(sBCmip)!`s{V=x%w!L; z+V#CXaMEShS)=DGas~3Y<%Tl(aCh^1cl^?Qb?dR8iYAwQ=!>8QnRc@~Ys2Pk*PMMN zZ9>wPfL2E>4e3gzYQKt)U!?*M_v-!Yyiir{={0Gl{;k|KF11e-mg-rwFl<#-nY&W! z9Gf2-TXxx;j+s_ocV#oejwftu?pg9y_9F3h{QFXC-Y zLGi0qj~irk9*K2MyZ!5Hw=w627q8VixBZ@}dHv7V*_9K*EiY`lcw^le>^XMaCxX@UPF!L=3}^DbC*-Cml%tMjnYlNCRUOk1zdY@5m7 z@$tH9W--sw<0o>p!b6!XOIPx(PWt;k=-unc)Htu_u6}sAaTdzCU<=j2CX2EOi8CQf0Yx)_rY+LYaZm#QwNy~PdGVEFZ z;Og?#w|HNyzMUuUYPK>`MW(K4&G(vmU2zw?BfFaN7G1v9Ieog?&H_Q{;AN(}&g>M5 zIq+P$mIne&5s{Tz&1mmwU6`63`}qhh7KnI9M_? zRdr4MXdB~_?{fD%*TSeJSyMMGi4HEEuuW;{RRQz08M#NR6s9r=6>s6`dA4W|`{h~B zJ#MCC{taG`8|KnF(`$$Om2j(! z+*`CXb4tUb9ww*$*_(>kGfz+SIBwtMU&q29{qan}zkhez1ENdgQtl|-T6C^=@%<{5 zP9rn63zt`xbDx^t+&4RPo~PQH*Iwc8j(+I*&ycqLJp1}t8()3<@%6{5nL9J@S$jUN znOk1?aM{%TQMuj*CEIh?$oJ@844WW7E&2DH2gb6eE`{EDsM})JlX`VW%%&Q#rJvLm zcqy{y7tZ=`Ajh4yc6xb zlanD~^)io-E7=zKUs))l&GcCMwg2~v0e<$8KQ^y0nNn+c=yvWdue_pW^TS%--md+a zcdOd%vE7~YZx#=4P1?KDi|gBjMIuvnbFXu?(R<|i=-bTlkeAgxH!j?ouEwSpReNKd z?llpCM-!%6zf{mKD(7hmS|i+5b9v(W)!RLy!z*5R?C}2*%CKT8XI_)zTlOFkhj(1e z^P{dFx=}Uh?h@sw^}qN|E(y*3^PKNy#;$b_C3mdwa!#>W@kV6c;=FT?3QwLiyj*6T zm@#Epz;qdL>FH^liYh-J|LHug&o|HFtWSq)K6jr}*#7MW_gr^}-p;#TuChpa@|Tjf z#k;0i?s%RRd+bc|Wt+Z-kGtl1b=QAC%Br>3Rr|AMb@(&(EVpk)9B(V1YueUr`SEG> z5AWqa-sWAuE*pB}ob*fAbNhB}OO0EU_58^?78Xs{j*Us{?llOoU0Snus?JK6$63LJ z-hQR7+oy#-6D}~kd&}+Tu8;~jk95Hu-9-taenNPw^tSDK`Aak3DDB=P)3BnM^|;`a>7h55Jmid$ z-IB|9f5}Ue-79rA>V~Vj7N1i*GGk@0$r=rY>D{?gdy3De&D(Lj(tW{io5)33s!=U!L&gL;JP+Z*bS9{(8?n8*^jAVu)!)p?KXHdI`C+T7SL z_i@%Fk2w~*T3%H*u|Cr%HBg*t`Aj{lJzIsP<=adNMR&{RJ4%k5*Bf2A|M*9JcK@fX z>%{KYez$vCJ)7BP=i{x@o4?mpRsT5482?ep^zB+(!Q#A&^YicCR^W7Ty2)+sv5@QB z=Lu7D1O03jI8GH$RLhcErunqK^R#U4^Pf>!k0x?n4mkP#iW%dX2SRxl4eYF@nHbD# zk*NsaSmeHY)5Fk1&yGwHd8oK!>E7i>CT&fdzI@+?MQm2rf{HZwLx>*56~Q=D1O37f zRHH;!dV1O%Fx|HJ*Ygnf3%ASzvLiR7p6Olww&>k@w~m&z-!B~YD)rqa5;SQmivXj7 zkekPAhkPq*FO7F$Gq(y=PJZTFY`^ns`25OS{`Mb}F4@MVTz_<3SbovZgHPtJdN5tQ z$Ws2bj{o!0{#W}x6n_~{THrmY>B<=-E0y${W@SP?WK;jX8rveK=e>~bv1a~U7s%bWDPS3g7Y_0Oa0k1jiF zyR_u=hx?Upt#bt%5Ztfmt`|1FMTVdl6gCN-Cic^KHY-bLDROHO zmzTbkl=;uFAxi$u<+RCH3?(mpE9!Z2NR>Uu=590D($cb0P});6f_;YM`=2jQWZYG;6yIt>SDLbf zuh|qOur5wev-S3T`?o3mM;6$~N-mk?G;!%$hA;mPX788$ zbwA*z=DO2MzMQ_i-q&_{?rLx03AYmir30L5uD0e%%CtRQ@t}Ogyd_WXyvk^4`Pq6~ zrSaTt6b$Uh8qSBXXyyyAOIvo)Eevf;%-WY#+!i2;ROgBK@CZ z+3!f@kD9B#uUMp4+gq1fEIZ|^HrMujT$@F|JXBb$WjC$BsDSeYCxcb>xl3NJm+7(} z|J)tl9r1nkl7kAF)qbKU`i-*Z|CRdsewxCG&)nPf|41r-)MgKM`Omzd!R2fFP8^!@YW8Qd zZ&O>3bB5hXm>{x%KR~1=^ZdQEN#RT1CtdO{6qt2FZt=FA%TI-$KHa*{PsV#gW~}Sd zuf4B67HsyMp%}GR(a+>?zoPDr1;2Y!Gy~^LI0nkj3vCFV^`=(*9$#bs8Sn1>nMw6l z3#^4hUd9@7`@}wRxqR)IY!c7(S8-U~o}1lB+1zZrveAmq_J$Leqt{#ljS!on@k@LHhqH=aZ@t?1!=Q7@v`)o4v^)g+XU;hfT zKh`fl?_2&?bD2b|{D#ZZjvb%poPMF>R?)2`W>eKC{7|)&coF3BqA;fPZ}>gFe~V&b ze|ro6ylNJ=uX{P0oR7yP3&*1xt;LI`Xt}PE&J3FLDJ+O{`iBjZPw(F^vA}vu#$7eO z+Sj*g>*vh+6UEnislwvYw+8>;xW`E7 zCd`+~J(juI=aocn^nLf4cc%U=oC7K;k1y4{nye^s;vB~-4uuCznm41SX?h;v-d6uP zr~k+Tsb`t7#_zsvowz)=k#DQYS|;V{kl@WMJ;lfTY>Yq&C~va--=3(#{|pnh{@8kM zUhuq_Ir^V6uKo(TysG5h`rUWleN^>G6J2%nYrwfDOLV@y&XAd+k*G4UX96S3HTkQ^ zb&l+Ycm0<#QoY<}ZduN(EHF#{%_UjOC0`ETs=M*}R^GL(yLqRs^=i2pG$nvjWy+ID zRg+`l^`NU@wc;)egSAGo7GS~$dZ<%NKKIvlPT~P9o`)o2n(eu)`hN}96trs4D zvs?HneBsKZ`i9tj*F64s@h$6|U~}m0sA zYOy}H;1j7{7P3#~efFCNE;|h~?BwS}{fWxk^h)CFiCrrL^yY`o-ouz*Gr?M{-9Yff zrx%r9K8ielKTYyK!-Uv<*G~NLVx0GVY02quZfV_@ualzd9xSnH6dvkCof-nDJAoEa^FtL zt!uM8ZU#*W;`3Bic`|v<^QX&$S0>}_@q2Sm-u)kirmB2q5!7c9ydSrJ)$fC6{xkd$dh{LK66HI-Ei=~O?WIq*cU9fkvQ?88 zlz5VA?k-IzdSWhAczWjf;8`W#=PqT}uNIq=GXIU*#`$-?{%5EySR=pa`k{!=>xx3b zh42!^BTFJ52{EK@N%&Xwq-f5kcRyYp{|d81yT46S|GbKMt&3N1E;;mqo-#52BXQ@v#{jvY@T$7i3b(f_&*4~t= zyYcGpg*m;i+ivw;IbF&rsrf>P$>ALXWO2#Ke5P(2*PQ~# zPhPr}d|!p*-}kkx+m*ZvGd{b0Tj?3iAY|C&5Y%An_V`hDpZ~?02OnAZI18)oe}V!d zzxu`Yf{EojiqErFY!Nt;$txml5_@EAuE+$N*Aj>LY8N%UTfDeretgxp`Jj}w#qW|; z<7Ed;lj{GZ)O8qNd$M4bco8!TJamK=} z>T0LOnU(i{zRO`9basi!=4mVZESIhIidwvF>B@jvDl3)<`7ge1^D=2m-sC62%XAr* z&rsryWM?V*QdznzS9Gny-7URcZ|<)8bh$WpV#>m;x8?3MYzta2d8-POadVUVn#-5A znmF)3=ictz|2n0g|5m`nMQW2TtB1rW>-*gnxm=)R(IU}1WvO?W-yD|V%yjQ(fM%JWr{9@|A_ITr^O6Ub=htks zKcII%Tcu8wQS6b~?912w+6(?L(=I6&ui3O==~mG#8e5*8(~@yiDE6ALRMmMQOY?~< zQ`gEaHDg$7oM~%yDC0Z-jVr|+*LPet`4bi_^q^_>+lhB}vp&1zq*pk_LCb^HMV-+$ z#DhV|VWoD}Bn>CW=F%7T??APu$e|69x_z3rbLa86uC)$Xro3=d@B=T06H8x8yL&lv zeK_)5{V zymC5sf57$?D&D(I6@N@zvn%UqWo7P$Xz$g*1rn7WPTp^tmbNU{Q(^M8cABjLzkByR%xSOawA_*3aY^YEcd%COQw7B=#Z4hMRC8O+!ltkbguD^*(wwEXeABrr z;``)>0r z=k!$2ydLfMh=J8%MdP_?zWtISVM}&6Ff2`(IKQcWS>~>=rJG&$J6sk@n-a5b;*!%H z=hHUdGC4HMd(|DbD{qaYo-E?Le?msaQ_MOn+dqTx;2oo?iKlJt*-!gUzZ;l(+1I)5 zyJ=vcT~2mQQDoHi6SY^iTr!wYICZVEI;Z4Gg@B3Ay3%*Q%C?(dbm#27%+%9cuH1gO zWTBVdi6D_J+g~(q*L3Rh6F$A(aK_W`Jypj3*=`o~x>A#TUw%tEp?mAg)=N(g^Li8> zyBYl{=~!W#&{C84=3zZ7n(myE3&s3ao5sAHXIpST>{WbKS@+bt!r@vm9OwNnU)K-QyRm9-c0gc=&pZVe0vDOPszRdMsl^2)JWX3dQT1@3} zvBfQBmwlJ|**xmx^v+%C9jKrpam zE`PP%w)a`gyUnii|7Wo4H@~|7aku}i$CdpS=~Et6R&KS+2Or4Nis?JZp zrx&mLq* zxPfpJ@g~P~z;q0+Oi~kI#=B`uzbLL+U!+(aK z-4D%wHT;?Eu~x?Vm!96Sf&-tL9y$rAobqaHm^hvJwRhLQE8o`_eyf?nenI%cW!EG8 zfF=e48b!}%BczyEaoFkSv9!=K3>PdWVPeNC+TU99NweU~uXq2R-k&-DV#D9U8rA;{0rHbF`0iazkY-un zpnTz#ecG%tk7L=-|K4wpcRi=O^ZGlvfIVuZEpPAi7f)LA%Yo1Ba^H@n^JlKVSZB%k zspFx+!Pn1}Klw7=%Vv1IT<5XL#l(L%?r-d=UeNdc_a)mx$%pGN*19j*uhA#0E%Wgi z^Cw@W?H``M*lDfzWJX=U9QE8|OI3w9w=ch3ydk5N|FyqwEA#FLe^U4tgq*GO2t9Rh zN^^JDufF+no?I9Fmsan_{PpOE>3<#SJeQcu$@~=;TNW*7d`h^L&*I5aHA4a67Rwt} zp7z(~Z{Xwmml7cFF!{2bX%pLn%CsE@1=nBfU%@nAW1g@|@;-(?liipR<=}qx6rXQ3Q6xX zU;fiA{#nI*ZbQ(-CGS(Y6rFBsH1YeGtdXi<_&f1+pl;Z?WqvdF%ry5-x-Fn0x>P{M zsmoe5g(*%!_%u7a9Q)2Y?pJsGyAxG+&GOHqhVtWYdQEQMDGZ;zOXSrlfydTCAq93z z<~-W??AP``g_*x2o`3Gj+P-XcvF9y&KKs@Ek4KlkO`d;Fd-|XKd*)hfeJXosuk})s zxP_M{rr-LSBE6#M!Ih4;4~&&8zD$t6Q-0F%po0Y0^Ak+$(Ovw`G2$p8*?ic3F#}uO zjD5oLplDuTo$aNZO!I{8$O)@M~;-_su`vwLOzv&=8?mtSh1(r#J8|NB6l=K|YGua%y^)Z=_rxq|$6 zd^enUdSYH|`84~K?B~-aev10^VDHc159fRB0&M&rp8Xl+C@h^A_U)c?XQI!JsVZi7 zG+svD`(QWec)i`@d-w8J*B=*~zqPO4Vu5zOj;OAj*PJ+wLQi$)`-}%)@vv{w68~b+ z@XPB*{C|cCKK~gWKM8F<-pjb&V(P)%(!;l7Umfb4HQDb@uHkhh;j<>w<@>f>3fZz_ z)0C!-lLQvARmx30dPn6`#V<`8qlZVkoj$zoyQ8)3tdFh))J@EP_eT@J_j z_H{Q;znN?Ll=V=FkD#*db(@10!CujKXVq_wJOL^l9-jHm_(f=zX#m@q1rEyRlD^76 zy}eEmrAYI5_s8m&Ug5*C?fe>X!d53LCvJ(pRIBvLiH~>rPFM9u3#|VtGqo}lUbgud zBVm#KC4TBjyFeK=iT4KXPv(ave7OE%-||cGQ`|YH_EmfaWuLdN*}wTdU;gdz;XlnG zALH%U{;~X}mv3w1@~P#aaaLZ~@$)-hO5b^Np`8D<|BWeq@8-+upg72(?CM{|a9`UO z&E1oJHJ<)FXWo=A^JacrKYzNO%wKV~Ww$1ppW<)jvwE^sO;bR)#roNMA^)$--!M1t zpDD5jwPbkypW($U<~=8*H=j1Sx}^Tm(e=x}DaW$eZ3!3nmp0$^i{N~Xc|wyanV&IF z|Ie@}Q+9g0z3VyOWzyf?Ys3i~i{>o!*_Qi~RpY>cri`=Mf;qlK9T(U(td*urG|&cD;?C zwPsfCTl=3u23pD-UFmI}eL+uSsj>7e^P+#p(&icdRu0sTj+z>7eIo05HkZ$~-$@A; z3;btqspPwnkgF;Cm-GFBvd^{A|17rrT~qw?DC6wU>lA0y&hGMi`Ek-3;WOfF?wjUr z{H+{lecNh=DgU-zQCENdvNL47*qSfx|Kj-sOO^5;eOq4M$h!QWp-k64TjpO}Ls_`W z=a)_i&95(-;<4inyJ`CLc{bXY7QZ?$$@ktR2l+?W+5a=x%_=!%!bWnX45U9UG}&(suw%H}PX_z^9mpz3C+l?E!)^{y>d-W2yh_ngYa=6SU{7s%*Tn$6(S zI%ybn&fmU4v#3EKUDiFSFLK6Jt*uVM=FvgXA!%KV+bs&rdWzp3t1N#IwDtJaCCPWY z{cl~bpA#U_`kz5MFaGB?{&M?^slj($k~XjOTd||8+&iK8jFQk|#-mJq*ZeN_-AL&7 zR=4?NsV;MO&;79f41M6BEOam_^k(;UW|#PWIN?9T`z>Bm4Hz7r_B5V;v_f5Q<`vD$ zA9-F+-FfZr-A%dP0b#eA=e<1k=IW$Znw|35*=bC<3`(4>Am@80I6dPf$s_$QKMaD4(tu?}L z)?9Q5mPvm&UtsIAEtj|3vafwtrTe;W-aeP_Wir}1_sysMo**j8cWl<>y_?-PmS*vm zW!uj1&$*lIQ5W zg-SWvO*Kz_%Q`(P6osUNIo_>1k(|N6&tRaf%D&_A&48(V=ky+4XDDU;b#iIx)7uU% z6KnfZFM4f{S+2WN=+V-dpXGPtlzHtg(e&}i-m2{-Q>%4r%gX2pvz0vyHit*-nfM=QJJ?+L0jxXqVGr_jH*&FKO@{_ZTRZj z#n1m4_Or+wd(LTbImzd*eZk~}D`nZ+7GK)cyF4fCXjJ63olNf;&gJHu-r*U^-7TxH zvTXs^jmZ;a3T4*@9*kr1zxqexl2-dciD|jkMVJ5ByS~ys@1UF2p6uVP7JBm7tV+it zY8n-qK};!jGg-Hqw_TcUeSWje&M#}e)t#5`YnfwwRA0SL-FMT=+iY_mdM!D2`Lo{p z8-h7v23MD?`;_9w_4#{O(&lGN#Qq$ea>CI|`fa3BnOys$`2F7I0wsRCHWb|ZyLwh* z#_j_%j?VJkxcz3C^MtTlQ=eZ}R#@_luPHic3ZE5o*!T3y^A%6atva7(!)81uWZQ{P z#o97@*TUynyFTJsC$%$ouF`)7sef~WwL(PgxsK&zbUbZLTz>7-G&OON zd|!}o!Gd|+y-OEOzRi1Rd`mw3==Xj1mR%2g_wB3YiabGeqwViB6Sd3Fa|Rd9H&$P` za(~#3X;b1V%x}d`tCT7IH@|7~&3QW)s*0}AiQ0DeaGvzZjRj3!>Mv*C$-MmKXkY3c z%?Z;|6fYf~lwxwaL(f8tYp!>f*LRKlI}@d+W?VDhXW{-R_kQD^h$NHSvD2(|Z zTC8o?hfD7h+m~%Udp+2Gg{tqibt)%T?KnSCc1LEf=1tqhZPA>XwaX^8Ro9-&_X>Es z_?WN#io9vkuJ^reT`!-%Twmb5(~VADgPm_T>^+^iUG{L|A>++kf&@Z))+$U6)69@_ zQJ>$jc(cvVzPeTIC%pPHb{5QzD)f4_)_qk;%v*D|{|u|5rYhZfdPs79Zp+bWA!g4k zcD&nhVuF0IpXrSqFWs+nS~}iN`Dy)fZ~3y4)Jyt;YbPqkt7Ub6J^18Et=^{B`FG+A zm(Nz1G{xf9q%8~MW(6%-S~npy^6t#n^ImW75roeL+te4u;bv8Sw$gl9@EOUqR zS$#7XSWGgWzdvyHyLpvjE6-&3MX-e&hrncpWf&feP{7W2&1?7>t)#c99OX5N`rshX#*`Bo%=GdM4| z<&7P871N|r-up9-r;5ufy}V=5eE-s-317bM4L?0utE}$Y?f&iJmX7X=R zw^~)PcGZsgi%qvK_RhGgy6pYDAE{*PR;+%@K|#Bghy3ri=_Jf52W3f%?SDA^Fzb>T~HW9$ToMU z=P?=+s+yZDyAmJGJzJ%8koT{7PTkYW-FF^E>0VrVKh3Q#Zo-RPtnJeZF(?yrRS-I%ZlJ2K7p46!SXLz-0-US)=>1#}H<%HXse9>loSpICw--ErL zhBx`8ZN40;@ywXAblsJ;ep@%@rEZbCob+MV<~*sYTX&ybxu0EdcvW>-UQp+gn>PKK zFaE@4g==)H#x63P^GQT>$tQK0qd_*g*Twy0BtDj;O{x0NU@4ZpZpn-@dp-5ET(~Pz zcC~eRefKEzUt%_uWx?C9ugjUuLKj_6-V?2KXW`zWkjh+h#iiX#)@1~+s({YP`_crYO$Qr!xwXDU{Nl(s1m|MJcyfRtU?2Tn^*;-M}Xs#H)vb72# z@8r6sSYElI%W=x7H1_cFZ~Fv3{Cll7_qR*3~F08-8Ff;m*J0Mpsjnt_RT31K8Y9HX_)7| z(=(`Yt@4bwmY4NK^msCOmEQik%2ayl$(t8pI|S$L^GaQ=>OJL3+HTkPf!>+H2fY=w z0=z=EYK1YHaSM7m?G&=J%G|hCbI1LiedQwcA11yMJ=8tn`mW5M(|_lj4t;d9cz)_m zm)^P=zjaS^s^)0=S}avrxpnCltEMGOqhq8S!XC)K6_d_-cJI>T>HI7GoEXFq))0f{%T!UtNAzoAE!xA?^PR51w3gOnGFpdb#lRrAuBe zpLy9RFF0p|Ugnj_qPizHO64B6b~6&1cJ-FXf_AP=%~O^nn}xnR$hh;H!|ll*zICtjGP;O%t5G9}$aRAoi6%&HZSmcDwpBy`!DU0P>Wul*ew zGiSSV-qRJ!j&|LWYFCP0x8squYlEQ30+t1H-zmtb7d3z9Pr13Hap4-Ns~z7vGWSK# zn3uG(V$#y%(VbkuUYaFM0gIMQ;xn2TvoSDXQfBCa2*sYp7xN!WmA(yp9H`AZ?aFGN zO8?!q3MO0Edh9sq$2pA?#n9| zX1&d0@ZQ}3k>p5C3Z9zQb|-B|K_d)2A-7d^>;g|Y+>aUXv+b>Z!+<=vv^ zj+)%nyLSBTz4soIl2`E_^Rdx9V!6@FE`MjVr=KUI7lX!$wZE$FtloQZs-=B)o{@0( zoCS-gO{$!C`O@qAZ&tFb-{Mwv*=<>X!QzDf40k!~)#q#v{rqd;vK=>bAL{Qt{YcUO z@^|YKdu%HvwdlSm(p{mm>3-(U%-cnt!E+{w%xx~@zOA$WEX@msCgv9ze(?bh1f%;@0j)=z)EIJ@l5k=I{N zTx{-R71}<>G3rvwQZBnLk*b99OY6k%to`G1VcXe=FVa)@`Ftx@Q`mE=z~GagSi`;x zDXc0z4YqTyYTkD`88$Vj_H4aMea<@hKgn0Vg!OL{<-5F1yL#G7zFki~1zSCsAXqf1 z&vV)gGNy=AYb;q@nKH?7ay{oK~+ zk+H+Gbi-83Da`wm{z`Q}Yj-_p>iPX-)-!vDss9;HFVB7XamAdo_IbX)Zk;H4*d8^> zFE6NTXIaI;w?^!C$@{0by6o7wD*E9PZ0J`Rjr)4xYwC_0JTcwL~P_?^gt zC#^ni*A8e!vM&nSs#?Mw_+20};>5Gb_dQH@U7Bm0agzCSOZ~4cmx7nQT{>y)cjFh& z=U$7qVg48XD{b+ny+<$oF)I!~CvHA5dsBCF@8;r3y}u>y1x>ugFlSjbl^*KM!*n00MeZCLctm4R`*(O*?==GaQP zl-ON5H1+0$1u{V*ljh_(9#qaWmbk`Uapk+j(UVVgZ$H$Ozs_mBX?ZFixEwYxZhTpC zCo4yo@1n%H%+(>fYUdWu|LGIA|MT0c)@y!DRQ4^Dj7nphT^2WQtF&?X?&e*6$wiT& z=e#f8cq7TO^vL!b-}*##CA=m?aH7H{PRTa2(B;Ly`B5+uH1ER^LEDQY`5r%Pu+LADDh;G z)s@Swo?5wyTXr-pS?a2%UKF(UfYO_$%)}^{)#v=9JO4AR$eR1x<;SmAs_7e|VTR^$V($;@Pd1(5wiivvPkL<4&HaUE8%iTk<*Y0QTR1Wef3f`1^ z&aA!p%oA14_>4t2y}MM*%2_6{`p;57I_>XY&+p;>#s3+0d7u9^XI3S*!_$egI^y04 zMDK`b&O68Wy6M8&?~>{hIu)HW-`dJ$_!~C4xjSX49-Zr4c+u@(=EX48d-_pr-fuQt zJsfzpQ+8WK*O%!rK^JdnTSwfOAW&<%Tt&T*dqMQm#QTKnJ9(4a#1j?E@!Ys9?G zW>h`R-nubw?g~}=m1+iGGCrsMT*Om$Frd`q(Afuzs%ch zfq9c&ywwYe@lafhie+73;%avTZW!U9f7(_EenqWV3o&ME3*0ZJy=~>V%N)DO{M<~OGC5o=d-z7 zHt@*aHgs>Uxv`HSVW!aR1yRB!yx zpi{L#Ms)Tni^he@uh!Nt6JMU{S9;Z{mp>pzp3m`)HT(42Y;$t+)U|Ic$@2>7y%87` ztZ})jj``d3E8EjWxm&*UPS@0s@Yx<@#5}iPBB&`n$=CZq>q&h*g`RhEBA0bNrIy{Q ze=j-z>%>>nHovOV@P2F@V>Wxqmn+@Lyt|FwT3uhW?%auOZYn>wXSE)8u3f!cBFDmm z(fvV#?{aYQq%Ute$)pqIMb5LUgoK-%Hco6x zv{wD#{U%H9arDo=LaBcWOOHAqDP8e&y6^4SEr+7+?sylHHl^&YD&wRHm3)^cEbYE5 zc7T!Z&dKvXu7!V^s&K?;e(iQ0!N2R8|1(5u%`38TbxC~rx@xQIG0n1vTXzUtvtJif zp0Zm-X7!en5)KDmSWf)VYg2uF>wkvYoqxAZ{j-$e>`_sb%pGwP{xkGM)ztrrQ}vb# z@?!U!%KXT+OGMXJ^v63tE%VdLE|#|6-LBqwv^0V{lHtJ|4c?O$K^_4to>7;@4q5Il ze%g5Iwf0Xh#uqE?EEfn=b~y^2<-7N=$m;2emDV0r+2?txnyxt5?c1_b;q!TNMy~KL zYDbpMik|InlMr_6n!oWqSLZMecY#Uwwp_g4tC@XOs@>OXmrIe9-nQ4#$3lF6cul() z?W$Pq$ry1$>%>8ZEBUQbQSm$po0BFUkv{tDG@p{g4;m(Qo^(fvKqPlU``zcTLW+xxeAm(-eN z1*d-hTpC|7Iq7lTn(ZF@RgmR z0>+ao_7|4Cy}5iH`^n%Zg0h|~*7irw;B@)?^B4Dy(0xvPS59ZTudb~u@((ItI4N@V zNVf0%4l%X0zW4N}MQ(U@e8+(uN4D(Qo^&$t!sBd?!bPn;%V&jfD6desvOKu)UAE=Z zzeU^sGkom1e8H)*NM6-BOq@ly{X@xj{x3^(wYfr{Wwh_j_nw?H@z#mbqf>W0+HgTK zXo?>LLlN_YrMK$-=4Yw2O_}*%Rms&Vv!C1tLZ*jUwtbxMJ>%Eq6Q9|Z9^LYIsqxDx z%xq5E`ro!ZJW+o?@8W9ircD=P%r95zN1wQ+`zqGk&WQKsY2THYkbsn4^FD8DqYi0;(PpZ*oWqvMu zmAm1D?Xudw=L;U*SjTfm>`ZrXpgiaH6JbG-oMB?qK2(+jJgF26yeIskTb=u&$=+3_ zY73?tuGnx{t90SDD`z~;mKEOg$egnLqQ|qvFEu`^%-XOe%kh$#QRTDS;{R5fd{}nL z-D^^$aQ_P3l~*pu+_YGD!cf{z!9%?$cH(^ZG>0$k#wR`>KNzNP>v-F)?1=1XrIWtu zEp3*3m?d5vEH*vl=!IxCOCy0ouaq74j>koYrv=|qY0)oo5KVV;s{MAyjs4p`!Iz-< zZnjHSTwQV;^A_&E9lyylm#HpHz%h286T9m2mAVgt%LNo7cC;={$($LyzU-@|lFo_C z%F!xi8&lnCcM9J12zJ%F^;#p)snM%JGeBWtP;JPRZl1-BU+326%_@C!d0zAJrP{Mu zs}DzqPHwL%zM~SGKfTgO?aa=zJG{5rwWpq*s+hm$QIiyhU)ZarfC)@NLQ{HFxJov^ z(k@cF=hgE0);XsOuKS$!%9|$eIqq5V%a)Jd`J(5U9SfD`v7hw$CZc|q`@^xqf*ij1 z?{liAUlr&&clmIxY5F7QT|cs7J-*mmO)lt8iCuW#wA;)(ciZQa5$RjPf-V(I)mW;s zqJh)YY|kt1tY?v7g7&=rQB!BvG@dwGYcnbO)Xvq5DjO$XkeZ$&duZnSlT447A1j>Q z-Ta@Sc(PN?P3}i&^S8f#w&qgquh{{ar;p9uAw6~5bFMRwPp4jWt26El&No_i$7|-4 zR|N|S%2pJ6D86^wzI2P*q|F((waXKk4l>#9GSAMRvYk6uK~dF9_oRJ`XpQ7Gexrefxf@avCY4x7ctc=^_lq& z^BLclHJh!J4=r3`F`+eeam&05&n0ZyttOq|lv>AeTrq#<-G4#mUw&rZPxAPo{A6iy z%0%7p6>BG%?0vYz+`f2&%C-qRgrr$rxAJ8LS9tuL_{3^n$cwe!nT4CU^x|gNf7c6l z{?D*@aU_Gu)X(fJ(Wx?%dulyHzD(&$pMKJ7tB-&$C%^v-YvF4WM(c%cmAx+AEiS+H z1Q+*Q+n?R;i!Mk9?d0;R{CBmuTTjaJ%q@TLTP&^h zww{!Gw&lTN?y%wp=V=SClpRmp5YT!5=7l?l)_xLvvCKK;YyNuu<}34Eij|h`7Ji^P zJ1D`acb@xQ&?QQhc~cK4&2ifjwe{;F6^-ks-*!FDopbfn?V`?%%Hv8Wawdofyw=K1 zXw?u|AyE8gsf~T(vLCfebZ6P!`ufb) zIy7PKUaLSY#nnnuMZfd%SlU85AFO(4^UFX*rz+@Pz%%LNuEnxJZkNwUwZ4dx$=u7m z`f1j(uWCzoxXZni4&COu^upP-=A82?bMTy#=dtFjbFTUCo$%%Zy)IF(In4ze5U}n}Z^E*M7X!aNxAj z{+}fuw^VQiNQka@o4BZD*#o0VjAkbl>aTwK&roWl_}6}gMP09MdD@d5o8L0A%sa<2 zXNvCJ?ps^7_dNI%@U3gM2d6imaG$5i-KB^8W^egoKS%jL!_{Sr)`&jmHfdelc5SF9+{jm2}CVO@3ZGPbp_{XO;RMygPZDC6jdK z5lNPJ-j|A}yg4B^;h;^wO^s+$%(6@F{!*zOEx$kRY+(Pkjq~Ndu-K>$ZQtO-xu&a3 zKU>|6njYlb^=R$towp>n>`J~9o?m*j&Nsr9dKAp-UxF^?Z6T`}D3$BP=f9vHW zY$5a~^=a5o4hepRd8zxu{gy9ymK7oG@j`QXh^o?s#arrAj{av@pSMse#DBKZ9;a;) zKiZeZUJlYT-<>_Ll{PUA%-4FhuJak2zeASoQCa<*N6KN#7iQ%; zFV~yq>F3#A(3)0wb@7(O8}AhsUJGee^|jl0rpO}TpogjX{w3VY=1LyR^OpZTWmYAJ zf2%~SpsmicnU|vSt}cD6dsmq6tl$j8!_!`R1v+PNdIst~b$P7veNwhm+28DZzv#y& zvNAQgF6S}kPuNoO%$)5+!0R(bc89d0Z!Wh~2=<%kd%!RjvJiY6f`~BGA zhsGxaV)NympSU~k;^q(4Hjk&r&1J7xnRcYFX_l;0?bqXe?BDjj|8;DIlWXb`JL$}G z3RxYqCf@a3nVUPsslT*U?8?im7e_qf%4N4s-4t@~dXc9iYo@B!iKoG~f%RK=F4g-O z>2mjUqw11x6XJ6%-&|n}TXrbGK4lSu%&+2=4NirZpDpvvVz?xJVS?j#voOo@Z`vEE_Dk*duqEonBB5r@@E>=~TGHK4liMy3qxN;xX zc9ruhaGRd)5byrGwN1L0NovdDg6Ni(5)Q$|i}*v6O23 z7WAg{rN$>~j-1Auhcd4#O&2)i_ccK-yENM}XmdF40{+tV4SbWOWp@5&I5~59-&xBS z*1uQPw7Kff>bv#X;FO^K#o3aVMDr(1-eSRLx&8V#TYs4#ATNPWE<}OXq&oc;_GI{QzHNH*^Sse0@IrbL*{ZMiF*ue*O zUR^BWuKNovUu!*Z)#}>URjJdjy_l=+FVW?l!XSN9wq-$sqvbKbca;){dhKhsFT1JP z`(5nX&hJcO-PNye?+QM}uDHp#wU~XD$F0gHt)wLkB7RmC!Fp3YLU%rH>@QiTJl+0h z@|BtiJGA7)Kb-q|SbFwmd$YCS)y-zb-=%vpcloyLw7u^6?DgBDd~+8p)%>zkmDArb zEN88Ij#VFXqj6JoyROR5mfoA%2|enYPs;TN7+5lYXiKdYVpQSJ(_9qbdDZNI!*jO$ znDj3mf3Ga^+T0~$SKncE*gxxczVKGLd0{i1Pq*@}HR_yrS@-ak)3=qZ{;iq9bSw00 zXYh=JQJr&c<;6XF*>YQ7{Pfyq)q&S;U%t0#r>y@ZK2GOc)h$H_o-jOpyRtuR&U5A` zORlRZirsXdaG3j_Cg>KtStnQK=H5zF^w=TPaaQH+wvz!TJY+iZS*nglMeOy@w2+;9 zBIQ3rw<_budFQ8UY-E{jyI;bx<)J#~tHlkBD$HuxAyH-hP7f9~o{3hO_@5#C zVOQp(4rX6x`~M6DH|&4E65A=RSRR%&n;EN6`JV-Y@q5+qO@*c7yyh?d=K^ z-*>(3d-kY5U0w5W#)k!V35B0eeSR^iK-|OS>YVro%ei&7WtvBPc)ag)zo*u;xt{`V zdYikhV4ATmWnz!IBum$?pp{aqi<-;2gC>bMdG55}lzckzhD^=Y!}e~)mp-Ljc2HNp zf5tEVx8BRxAM@r*{@%juJ}2w`N7LnRXU{+Ta=D+!m3!$5hMC)@{QPtNqWX^3ywB6k zi{9|--aL4I$s8GV3!zu(mpy|L_U}|lduZ`l;{5aF89b6wo7sPz&HSDA{Bu>#ynoBh zXGcxV-qzY`6EM;8kmwYdced?|8~bJE#q7GW=F76x&Do)^E7T1zcWiye!y=x(Up)HK69;o&K>)I>mx6|)Vws!VS%IAi@R}_oV1bw~!Ei>~}a$R<7+Fzb&&v$ICG3%A%bX)yL|e{FD6g@$tz`r~a+@{Q9Kp zvKvdavbY(2GB+++_P9>VQ+geT&GGni6JIc& zGfn?7>+-j==bwGKTs?VZ%WuV^^SRugzm_Em-wE>CbM?=A+xA6f?<^0VY6@=LT`)b^ z_N!{RG#jJE4xKqX{~1oI1TaioZTaYYrn1fE;^LosD~(Fi>bG2*(^v7`_g=mH?8_%! zM%Z%{nXttB?p=8~rE8jQ*l}r2>yVxA6x}b`2H%jWSvF_S9{_R^L~?kIHhr!oBAEwA*XfUN35q zyQUPa;k)&y&{FNP4-70-zKgr;U4JmJPmbr@cSHTt(W*xc$}jd8G-xZ-r5E+v#cZru z_lZ;Dr9;i%{e|i;cAVH06Sbq#x?t&y)g7PYgY-1HoUK;gGRbnhI|pSu|CUqa6WR@4br&d@k@_mzU8w$b1VFo-wm!^ReRC# zh7*Iw@!gU#J3p^qU>*F>=i8m?ot4VJA2Z+ls_0NC|7_`(`2P&iAP4iG7LEP5`PB6n z6F)c|&$uF!@L)UFo3iSu?^HM0v`u?6DK#~JAuG>au?>@EyjFqc*ut%Lq6g=@v1>g@ zYhtvtpQXB^>OaGVJQ4Q1m48EbyxDxKtEj;D22^ zmOu1h__V;Te*cmAi=O2b$`_x!-YUCGx_XoQE>A{>w|7t9t*bcj^09Zlss5t>48Lyu z@cnk6E@IuCnXOscflq(&tp68llk4Bg`1yEL;rAEoU-&9kU)#0*3m0ig)CxIz@>7I!d%a6zz{Itx7Q@;0RR;}=Q16h3~otc6+ z{ZkdM1#ac`KE!z-G7G3mwm#wn(tfP=(_Aq%x8{9PvbiroO~y5Iql}l zvJ7)$yTg}t_f*Wfx%@|cHe7OBzf)sLL+%E*!qbyC{b%4m?@;}@H}ap_mcN^ef9^GX z<^I)htA>5%HdVPo`B~~aHqW~$U0KFFt#I-kqk_U_on>o%T6bn@IEgGuIrfCj^Vcp7 z-pq-sIZkZ8<*)dkq2$iLe5WN@XBu+8Eu0s#&QCu7&-}yo=DpTSiWbJ+=|Ae=nzQ~@ zqtdJBtsk#C=R~9I?}2X`n*VF?seY7%966p zF)wd5wBJw3N-WqYuJi4|{u0rfE&hd`TAw2&?^QEy$-PtDJe6fRbJ>FrDp}_$Hb;4! z*ST}&Uw&NvNv&O(Z?sCxN54)tYFJ%N*rCn=X=&7U}GsVDtkp{nAA-s@Z zwmtsJ;b3>Q%eilT#M>^~o?R%rxYBwz-_GMYB`448NT!yx zdOC~w#KhHwf0sdmJ~%FXPTVyap-)BEZQPQ*Z$7tY6E2iYELZp9-mJ2fmpkB1@D#-$ zr&CUoLIi?$szx9EVaXG&Q!6}W{*w6}OO{Xjt#JO|t>(XWT1>Mq$<+MPiF)sOvvl8# zPh}5ncH1r7?zZdpePiy_8<(WK*Xk@RFIe)F+w)L^vW0?F`JXHMy8ko0&VFcqoAGDT zuJV(n3O{uVN+$kixWP8}Kg0W+s;%FaA8PpdlfTp6b*FHicJj&Ftz5OoFU0xp;`}0h zW7`DwulFb1-tzgpX^mq&YAJF%tpDxa5B(pG{nI~p=0C%}dD}oH{VjUrezB;Or}F&d z?OXy=JTpCxo>bQMYV>$s{(O?d@%U6-R5$G|4iJcJF|yw#SpS+8oC^=SciFrCbk6*g z^U&bD&hG`5^}muPMDCdWC3;rJqXbYvdPTBmiq|{N69p#<{nV%4DdN5}@s(`#`3t71 z*8Y00QZLPUyS_rY_c;51hM1~`NBQvb<3Rm$#-B+Ob{|>4=;^y7?$e*VJ~Ua?@IJ5d zU6F?#L9?{&Z`Uno;oJLsec%_CB?+IFRYruZ+$Int8QdeylL$bo_J=? z98e=6tkSyj*qZ+g!clcMcmBDz$C3Gd?uq{l4{q3h-L&#u!}=dR-xgTa>CeBd`_@E% zo0G_yr#seNhQvuq zojCu8D`?sC9k|0X7EJiqDSj@x&{*V_EOI{o&vC!tdn zb2`x?haJil4Pq8 zV{V&K`Xg{|5%a<<%~W1aPF|yJuVWVcblL9y@paUFQ{Q=}-`l=b=gqhh)%SMU+H#9s zQ*Q=`s&P*i-g%?D<&x0U4u0)d{<{LWJf)qc%&gn?=*)F2ze;ag zTjH@?iA=kEDX*x?%)p>icfGc2^t&)Nn@ttiY4*xqvrqO#uj7g@|8`7OyY{p%`0ch8 z-+oT#x9B<|U9-~Y+Ke+g8!jt7xlovGEnu)|jqq0A?o;wEF+aL%9&ULa*I2MUw)RZ3 z!jTDYERWxrrspm+>H2KNa|f?ak2{KJ-Nt*$ zvFr6Suk5>19^akVHN{jkSZLFyy=N-F-3_{SyF#Oo?}=uxbp7PnW;=Dc%hr_XWZatD z{U_j#k&4OTsNCIJ$=?5+-Xq$58FnDRrFZnjh`!cobcH_u}Vg9zHCa zUe7Dfp2@y7^}(VuZF`IGObSk<#CH(;clxb(zYAFMVB6H zC<^W@%xjySy2Y&T>hrKilWs{nrygCK=@b;=U{J5VUfsH%h<^!i_Mi2a!4 zyV_@V)Vw;43cZ}^;(E@LmfGJIwfVeSyD+&hyx?-qgLE;;i@qPeJw9ry_jc8V6_a)H zj$GU%G3m&O$x)MKgTi(%?x>vaxGZ z6NR3vT$yAdYg;tE(0%5b?FPG9XS|+rDtQNUzUHw>(_*3o9(qk{SsB*#*lotO>A$DV zYkCy+q`I>+uS#mF?(CMtyjJt`%xf1c+*WojlQApos&?L0p)Jc6UfjXCE=O})maguR z*}+y9m)@H*zhGzP)Kl9|_+AUCG!nX_w#?|U>vqLs-l{<{w{8?z$VWFGv3McJx|1f6{Dq>^J_xbn;Ow%$>*0=zgC}eZvEA&y5rjJ zndd~as`vi;_ja0bnVj0X$GLq{+jpBD`g1IIRd7Db)`kEdKh+-)iLqOgC)GH&Sf|z6ugevy>83v z%}a0Dp4=Usc5=(z+`s$tW?W8Qv+afR?x2{=xb9w^g%E^G^#emhrx^Iosor73F^wQruwJiM3hS?7km zLJvz~&%G|5ulBZV?z4Y+ox&+PYY$zHo)(pRgsj|0J3vxDB zx*gmTua@~WGkmdU``XYYo1Pq*vgcyv*X^czS6EM2ESqu5;ZRfCd-u7gZgTlOsG7A@ z?WdLEU)SYZWpd+oOw!r4t88&4&jD$*qm$Y{vL@^(yt($lmR+33#F*GKJa)}|*5AK2 zw&k{2AnY2CR7=~hoAziX6rETg_4n-&n=`-H`L~|@&v1P4y({(~TW`Oe{GXve>fEMF zDOYT=ro2vM>yndgh{^QWwZyqxQR~=9P6o?zP7)`sbq7;y{kC! zGxPNQWm7=+zrFdhYrcKaWQ`2it`MZoktg5_z!P z+9{^HfA!KMjhmv*t29qpKF^3(`maZxaNW8;alcEYe{L;PTYPm_obTQi!OUcNtX%KIzV8XwL)%l~cV1&jH=Cfrf~8~bDLw^#a~ zvmDcY3Ek11FL^!mxSg(Y%1WI?^Nza$zb^29GY=A;{90}I;``I4FuJ_Tc3*t`^Y57b zFN4$OU7eL=V}9Y=qOE4@?PhEcHC<4)%DapGVTqyi4GGf!-5(e}fC?(EnWtm?Padig(mmw z z7xErzJX3hP`>y-nTfKj7?as*d)$qHxa;>BVL*?(7PX%_nk55g=w$)nFTK#aoYyGEuuFXevZ*3O=gWH$BZ<5X48B1Z+;8!D{o%IlZdxLQ_!zSRDo zVNHIzd9>*=JusKSL9}T zU!Jh-{0(43krJk&smN|zl8Sav>IJIWbyRq zR?bOR4t1?J>~s*k7w7&wZ)XmFqUl|^za|S`uG0C>AoFd%)NK8z)xOpRn{@X&XGf$} zP21y>^TxC5m!rB(W6&g{%9O@?8hn=WPV%i@a?@pZ?49_qviHxe{#PyqOI27t-tNBh z>pw%>qW=tL>u&jNx|AUQ!$0Ft@Q#0V*^?@Zf5ci|e1F+9<#|XH+vQe%`|OG5_^($q zI~44l{KE6Yy2n}lruQsA=5m*+Oj-0SoSc zefi_#m))mN&MgVdV`**J-F(XPu-6mEK$eQ;6W=dyxE%2D?}pvAo9jQmoFAHX*I3^> zPWkASvgNT=EYoi13P%M^TXdFwQj z=hg?_n$$k+)a>y2rmYP(*xAeNl4VxRZM=Q&47@}S>7QCYX<5&wNf*M_O0WKEwxUr? z^q=U#t%v4`?7MuqzsGL65Zg&@OHOu$;$x1x+BRRBai>&wft<5k&Gq2RuXn#(ACPs{ zP)Vj_zQ?)UsV#IC&?n^LoMNX~%3T#%K9&i8<$ghVVT7+Fjr@<6JPOSf=dJ zcl|%6;y<^Ro!@V(`SsSU3+(03pY4}wUh`#!SJzh41-Vb^?M+YLep$3~6Ic96^OMYQ{zuFGs{{Ts923vqmjBPz*&KcSsft((_CsJm;D=%F(Iod@%_~wbAN_qSAc~!NgN|$GC_db64 z+m82H-obg>dE2hF`elf$P*iB*+Vy;zO_u%%iyMDA>O|CMJl-z8&-zOIvn%(GUzq+d z`}@nXs~=ByH}W`lE9l?tIOyu9`(*;CsGU^!*3M@4n%BDOI}~1ZJE(m5{A}}|{J@`@ zi_F$sRt~vh`_HhF_fY=T``!2R z7T23CF<-w>{m|+XX3c$;g}EsHS3b+^M1RG$$jas_gG$o7qRn#Z@p}& zJAI(}jZ(`T!<=72b983?J<3;jy1P>_b(&CcW$#PAvs@?tygl>O{mIh%S6Uz1zj}N0 z{r159v%`~bZcUq+=6cmHOFGJV^Y#TZ*H&e|iIS9?ZaBeR?*q8~qL6##TiyGg)vJ68NJT@MXu_ zqi_1T&*VS5dSm+D&}H{_Mohc6aO(=gf}lIM4L5I8Q)y{h#IF#tq-S2FLV3?_^~g*c z!T0knw)FgGNH;xE@kfifvwo%Ep(zuld_*domze1<)I79%?kv%R??5H)ghMhxft5W% zoD2{6&7Q_ye1F;Fv)wP9KYjeqzwNBQv}~{GYLhFuwt0zvowG7?-Ey_Po^9ds@V9vy zv$6U5p@zrvUpW`dhtx&E~*=N7Eax--wRFk@k1Om*d+V|S;lWtP8j*H(Ww&v=rw76+|+_yghnkZO*Yoo`qfz25%$;KVCBam|)>#_#8yD=Iuy9N+6;c3X$XvUrc#&g&s< zsoR9Rn-8r1yxV=A=$R)I&mZ7x;41sRng35>+3%G94396nt`2?K_Ab0Vbj4av?@OS{ z{sy;P-lZbT&yrs4dLODk`_=t5naBD4eENY`HGkK|Y_i*ZcrL@;nhox$D-!&7&Aq&M z@ueL$RcrXZmOef4Rpj;iEO~f~yZYJMOP{1#B(Ib$eLGk7D9hQ52@@Wie6p_j*j(FR znKu6!j&)nIJgBSBUjJ?df7azdvq^g5dGjBu|7Vb!RdQ{9;tPJ=liOVc3+6OTxg+PH zXf)TuW@^ub37)S!RX(d+o_MXwKl9x3%@3BB)%;yI&z}2NN^solt5#Vi?6b=QqHc%p z6287QSlUxFWP8ZuGtXHxRmuexxNEfue1H|%_CLN{SN1>Vw|M*J=ihzwWEOeuu-$zz znt9^g36`H_|7^Yx+<0x5ukz(9-wN-ZtG2B#_1&~JZ${YSMpdi6D^Xb@Th`W9UAr=A z8wbm~11G%p7uE1_@csL?@IOP3-u;~Uf2#ZoFK>))R6TNj*Q9CF3i9+PUidB=zQ1l( zu;llP>HitxvX{TxV|i`nul?S7BGcNIZkejNRE5!W&7|NHjJvM~@tfsZOP&r<7q@%G z_1I()>(LL4nz9UGtU6&cJKVKf??2kP|HqfEv#U!sht1HnT$$?;q--`-H8_ezU;>BT zRPC@$mtxxYb-Nok{`|TA*aB_N12F;XF~XE3q2KJl-RS$We^lIt8B8@uCqiIdCo zVU>;lKU?D?SE~}Ts#~UJSx00RC@$2id>tLKWT(ms=G`m}OD6wLe585*e&3|OCQ266)SD@tAOHX>zCLG#- zQ!h_*b?PIYtqZNEOjA)jH08&HNd=Z)m%g+VA!B4x>Z}Oc+7=EANk97>1|tp54{Cc8 zD#9`}J_T?bO<2Mg^ZKr+i07J?zJ#!Xd2?Q0V{es^6IJ-wcp-dA4-eNl_SQ7`T7*3s zrKaz;>KBALERg(Kb<1z&u9;HP{N`pF%ny2Z@!F}_hK8GJPTnt~6&9q%hd51q@uZ1O zYvrfn?jy5jZ|^N#xnuHL{i?86({5cBDAkG14hof2nHnSW*`sjE{oKDNr=~1j!n)>N zh1u2SH6@o!zs=c^$(y)HAvR}w*lx}V_jYKQ{f_k13=`nvV{@x~EX%npR`k$W+rv9A zuK21xo^i%D_qn`uMU%f6TbbD&WE-zuVQ(50t zmwHsFYVzrrH!RI{5ek-yV#^{r~8kj{^WGJa-ott!y>3`$y#oYphnGbubL}GUzygv z$=`T9|MMTw6yN(VIeioD8H%(R(svXeJjS_d%Zuw`mQvYa8P&C?ZffUe9lp-W;1xP$ zg~&Fp5IzotCJqVPFEyLOIdUG~PUiMIsje4!!LzDD%+;r;ZZ*r~@+W*A9jv|4(eMT2nUM}*vyXVaGa-OpEg(~U$*XulxdZ5QOx#iaT zxVt~5Gu}S8d3xdYtm9i3ryYBeaU$)U&h=#v-9t*Zwd``tb=CiN&U)w5g&uDvaq-?S z3Of4k9MhDdG-wD!&Lm*ExwCKIyNe1&y$JL=W(pqFDs<3eIZaH;7Q|@6-7aOK?~R% z4;-0jv{k6AzxrZu^9BEx=l|t(Oq^<7S!O3}UfCq}`NJBH2^ZpxmM$|;w)uP|Z?7sa=tHHcCue`y7Ic5gvULMvfD1+Y%R_&@;c-vvUR@K8d-zg zr)RlcmB{>&?;g6dh4->q>-L)}Jj*vLq?D&TUT)>SXp8CQc0-i|7iFxsMk$}E-(G9@ ze8u}X15PbR3+4%a1?&o}LQmQ+DkQAP+TFn#^Y%mKJB#Dl+Pin({-HJLQQyAn*Y;`L z2~WEg^mf`^m0p>JDS0NT8!ODKkIX1?eibG1%{gZ&Pnn+S)(eaF-L!Dnc4PVq+b{kB z8;=Jak!VF1=Q)Z%p-?UD^op1ODK zs;Khsd7@h*gUXpVx~#NNnJk(!$#>k^Uaz3xhXR;x_eo7~qT z&@<7zP$H`E^k%tLUsvP?m8MRLn|r0o>b~7w+f7$G-utU+`^W8_=g7h&V&KTo#KG2E z!{S~cTzAEMu5w}L%B{@bZ-(i*R&MNG{nq66K)NQOxwUsVBC?d}Y0NV6N4Qk1Z9wE`6ta_qDeDuDdXG#romlpj zE;I?7eN9|e_x-BBN+PS*?(8^sDsx$G@zS=NpQqhT(ai4YnQF3s<TV22N zcy`$9olKjkd}TDKTIdn&{rT{&5!F7)?(6V~6I5>|@d9-gyLXBOG{ zy*odVMSYs(^Q-4m@7>n>wZnV&iyOkWXQy>utoD5J%}78*;8ET3E3Dd2O>IpMJ&0U0 zC3wmDcCCNcyk4xSFAT3Q_uI1R!|GMJ#i40FrT*S}GgeM|b>Y<9TWcG$Jc1_8J!q+@ zrI5}rFXZs5Wm&8*vk%E{a?j*yR@9D4`_`)Y=IT_IH_{udHyKr?@0;7Q)@@5-Rh7Eo znd$}p+kek>nVj9=Y%~A;t=$11t{Ru_{VP8EO0DCHwVTw<1zdBV9NBZG=i0HLrDd7C zn_8BtW(P3jMO~dbbMA)qcUK>{x6jY;beY4iuIk+@S*P7J_B$NA>-gfg9~SF{tX!43 z@`=iR#jpE*&tLdQb=T`|yRA|m^QPAMK6~jldt`O(4&rI&?KR@A`*||IBoxBh27xuY40N38!2P7=6mtEPo_Ez4(<)$Wg zExs+iVwkHRyKvj#NlBYFY}MY#zc80wbc2fMwvA_gsXS=4;kqh*H~!FT-uHobSY9_@ z{AO>c+jeBBqO0u&uUY}|hBbUK=e-KA?n;$&%cDCI9q?fy5?d6wy zUUzm~x>7Jj;UTBzt>v+kU#<+l_Q2EI%;U7<4nND!XWP}Hm&R<9>rzR#`Ss}>`;Kcj zC#(-HRf&~m+&%Z0O~s_8+>P9oZ6dE`I`yYt9@A(PS^Wa%DUC1flu1Pu#D3@_h3%dAd&V`PK7xKV28Lr0ov(yZ-HG z`_Al`d^`8%la>>`iaU8M?3Q2UH@e(>tug5G7WPNWxmg`kWS4xkl)pUHMgRKmw&@Sf z+;z`k4A!m64VHN87**}!c4yMMgcVGTHpePIi~M-9)=4VBs!qd`MMzKPz<&n!w?8v? zo!EV(SC>h6SD8r1I)}_f?W(`@%%YjOJaZbjs+P}q_dMY3HbK@0Y74G@S|>H#H>Yq70s~pSHYH81ez&t>sm$#Kweio_y3Ny=4Tf8at^3q=ED{VZ6pqjST`sn4-PJWu4{Xg` zZnB!`P{+kq1Q*%XNNX-wvoO|2FcuGYyTM%H&!pY z?YrZR+48$eM+%=EUg-O6;r6RH-#cB9(a>_b#N|JaHGV7WXE)#Up!m4G-kY+t?{>t> z%BPlJ9o~r-5 zYI+5#OcnA}nd~B;Jhj*R^Xy|Gi@V!6wa$NMt8;v{%GovhZoPSr;hY`WnZdf@ujeh@ z+H14o;-sTH&7R+I<~P~0c>5ivE3$88qP*s~UD?LQyE|=qy^!A0-6Exvt+m+l%vNvA zo>pyFv!VF(I_pi*Yk#qw&%7qQqcQj4-i5u+Mfsbi+6qq*+cI})%(h%sR}L)&rbQDx zEkwCD*x&d6dfLA>^x*8-4J?!Yv1+gX@`^S5PubpAS7J))CSR61S2yK*S6?bw;rB{sY3bn^M)y>2QEZq@eg z7qu*(UzYvJS-P#O@kn%%&aLYX(RvqdRT@d>zHXWn@W_$TGbli0a;t`nT%wCildCt= zIngZbdFvkTn|9@UtMd7E+h%NfqPb+sw#VJMs@@JK4}}yhFe(tSx^&lC@ma~-onN-S zUb;hfg@V3TB*&8p)h8AB`}VqozGDeXbh`9m@kYrlTMp~`-D*)(=Ja6P!@$76ct>-; zkLP|~`&{0LXE+pF!~4&FJ{#-7?rHcBf#WnQ;>9dNqq+S=$~?|*yg!IGV#S3F@c_=wq4aCyKh-po0so;=5~ASRh?HI2XyOieLu(av##rUsar`p z|C&2Cu?NqJf|>x~<;|aYGLPg3+}*;n{l!A->svVw3Ga+{IJw+i<^JDK$K!VtHqT4? zaQpe5ZQpu7pHIJT@w9(uaE$Pil@$-yeSJGU_JmY%wAW^*OCNO1m2=Z{(xvyT%DsIy zHubAjs|91OwbYxCi+roK^wc?4PY&Dhc$V6iO-u94R=Q8xHvdBCh41C%m&KM|Fzb!4 z-kRm>dAQs4*wd7VB9`{$+QnL2T>fq!*66URXb4QLa%P{ae|6IPTWo;;XxB5?1C`U-aCF9Bfd>wkuo zOS3E8v!YXPXWi8M`)=t|-y4h9x&@~uoIT*R=k9!$TL1Y9e3ivd?@s2P`Q-26mB0G( z)=oUs!SudpPF~Ox^O`C5^HtumUR^5T879zpd6B~lhDC4Yv-YnLS#U?**ZJ2&=?P)> zyZXOhvG1E+a&wFJWVfAHqq4kIP3|}^o7M95*kjd1&n#h$nX=!mEEjQOa8S-^I zXmm_H+Aq7k*^@!MT4lQUUI#^0-DTcOJIz)y?0CTTxRBK~p8fOdzjhD4Ce19#>+3#z z+IgC;;-bY44cn)x`bzI!UmNJCu)4T2XqT$(kEdQHpQkUqt!glvCp@yK=EIt^8h2;< zi}IAEFY0P5KEGb)fzK{Q(Y%J{Bf8$lG|O%6kG(A{zi_McCvQw(QPR1@J8G-#=R6kE zeQSHuaK7)QkJe2AMow45T{f++6?-F8Z*lh5Blg3+r)B@$d$q2lpTVMhf!@UYD)W|a zuS0ft7hdBQ->JCm+E$G^L^5!uw#Dj z&QIfGGd!<8$~K}tgwqKO1?ETr(U(%7PoBA;cefF*9#?Yl{~qLi8FfdWKAz= zmU*7c6Aq}l2qoQm+`P-ZjgaLKQ6@SHIh(%RM`IeCg>gnYDNCUp_SNlTDT~U*3Z6mkXkDCU%|SX!J0y zRAEnf(3ULvOKa`eS24(mg=o!gZsOu1&PdTt&G@tRKv}ThgE}RYWhW%IWh?+XU$)6 z%F(w;&%o-AZT#oD{j(a%!)+3-1z843Ov-z25o~qiNDAYNl{;e>svnkiv)!^&@|ed0 z+dx+lMpuylR#LC1L_W;}yWX&=D^%vpDgV6o%E5Ide-DRdoON9K)~YGAE%(`VJ(lbx zP8+_k&&%{( z->>XTw4Z;rcYb^-@pQ|I-oHX}n%~waF53ELXEE2^zPi`Xr}4*21^@LsuOx1*D?32c=-_9xSetPw&Y{cx= zpWPNMt9wrgma8o#4*oi{TJ>aB(B;+ZPO!SPv@J>~eqnU1 zE{gH-^mQ}8oU=V&Q~yx%Kf|Bst^Eag^~n!NCWKt&5b2BuhFa|PQwo2#ZP|66mtIdSKM{|twvkArom{5JV=Pd6iM z<<6-)mTz0JNH6*jr**+GzN+H$dUIZICVu5QUT%2b=ih@n{~7$u>%Rp2XPB_yMqb5# zhCUe2cyZx-uVeNfa`JyIxxAC1N2=qcweH!s`spQEt0!AO*s$TY?$O{3)-4mJOx+L? zWZV$qwZU>y<>ggt%zcWki5LH8Sk(UKUc*-r{@Urn{lDjP|JxR7Q}i=SS?X*-*z$Q7 zu7(>dWK%lbC|JHiTqRLO%nN-E9`BryUw|k2!t8Bc+!4KBbz;cDo9F+n!&(-}`t1^B0Ypzx4|O_|;j0 zT{{>H_ZPh`aR1N1F1Kg4=vfu{+V4r$pRU;FfA0^oZTbFa)|+k7P0!;d%ndJgnmwyU z(=$&qxczK|_0(wwd>nFpYz$8)c``-65xH3V?`GzIhCh$?|KsybMsnWenoV~uTAi3* z8?HKCeWjvzoZOp!slZvFy!+XL#tDVzW*+T&R#f{V_PE{L zDR%LH4{gXX_j!E3_x}9)RDR|E4CM>VG6Q?o(^XH8ctl&w>gzxHy*oi+6(y^sAKUh{bN z%Dyz->d)H8A9r`k#r(1Qlygxo@YZq1XuVsuzqil3HAiQy{`+~$y*t}>oT|_i`zFM6 z&B<~~U)G)9=sDrrrrP;c;RoUzk#H!hCM6lt3(g~XSnj_)58A@Z>JV|e;2nu^<|d%g&&`0l;xc0 ztre2fY?p{)?z&m@rE3C*rFdP<&f*W>0^}X4!|eAh{_Zq$tMplk!1k=>zlANuJL+4_ z|1+c(vVXOv$gmBUlIE!8vMZy-;ZZ0lq3cGXIQ2W-Vk(mWel=pZ{mLqq*PrW}e^6*U`;kF}LpXPGvE<6V$@gP_|@c z(;{}qNq+1`zKq%dED2pHZT1g)&wPHK3p%n&Z_{dsOAmk1sQu6IYp==C%`u{@*6H?! z7I_`v$ktWR4|EKx@@?J+S=F%2# zj+wbtTy)jCe7<`YHy#%{Jp05}D`q@#PT!lx32v^8+7b&Md|j4uV_o`xhRxCkp4jhn z{^!)3w6lqSKleu2pIP$Te;;2hcc?ameK!YF==14+FZ^eCV(fR9Uop^HciMv|-Kzpu zz3ZL!>`kC|p=Z=?u}w=;dzjBl_^~lOopX8l4s-j<(17QO|Ie^(R{4JhOa1>0&6E8d zy4vG&wwuK0cznNF6j}6ONvp1))9fRWT&E0$S zx3~rcne{oWY+7WyWWE$rz17 z>2&VG^2gQ5dDgr;o=>WJ!dG$5VOmepjM7!d_i}&t;m%o5_32mFukZgEZb!SeJ@5bV zxZ*#9EB{Zf=j-+7IXtjJTQb&*X!0!ejLiJb z5EUXaX~B{yD_9w_e0qV z_VdyQwEi>fo%u)J)aKio`dasQtu=pIzu4I$S`?46#OyVS%8lN? z?LR}3!}Eu4me!+{6zuu0#BaV?@Hce-+m`rs^7q--&D)(;4=Nb;)!ngc-#_Jy+fDsi zAv-M{YsGCrW_LQcf*L%Zm%p?5r-feqm+zXFpz=3RmS4fuI5T{f*z@+Bp4n56JXlfk z`S{L1Uys;ddGl$3%=wF2kLIz*s6GD~H!<=b$bu7ndgd2pA9ZsIJvDO*EMhK_FXRf> z-hW+FHO}TwQ3n5l)@KeDrSiK(&Z~Z_{TgkzrsrqR{dMy9m8)KNxL<%2d{aJp{AZY5 z{Aaz#{aXQEqv+q09GV2>Re+{X7 z5fnZ7On1)yRoj1YeSFEk(ex0=kw_)!*Qf6nK749(SkLD9Ma@Suy)(2Gl%CIFod0nz z;i0WW%jRCFf1Mh9 zE=y7DY(d=09cFVwi@aJmy7kx|y+aNe2oY$3l_CrMd z2EDyS`rcc`W~HWXHR?RDd~466tZjTVxY?EGEBBR7*fMYGDH+Yje0#6dL~p+_=aJm< zJ^PIVUqxKkwKw-vl3gdeh-YWvMJ?6CXKo2G=c#dLX-xRfuv|f~%$}T+E73Vo|v~X1_b*0?$4bX`Z6eIJqHxLWyPsQ}3gl zmjiw}X20g!e@!abH>1t8e&;&>ozC9VQ=)^8?vvei;`7>twas%kuP%DA>E0Xl@2SCeP_kO}%Nc&g)$h z`IsctxAfmW7WW{k_Q~h9)8h2*D-=i_KcYQ_<-Y!RV?JR+p;t+Zd~OC^mYlGi$s=>a zcA>Bhts)CFmU4$((bDYJlRdz5aZj@4(-5bc1zYc4Q{8rS$q#S7vTc>+N6v5YxzeU1 z@#w1JjQ8J+UBX2^mYyu+R`f9wxxG5Lb*ggG)DN3`uHQ{PayNZ}demL-Ytpm5D}}w1 zcjmM`UB|s5)pl0cmF+Iemn=MY@~Y|@-qY4I`8-u`?zP#FaYt*~j*seL?hpONwi>B7 z7G2u(p6AxIX;P;>ldQz9FLJv&VX5%Tblb0N+v9&+H9NiN&2&A5kNm!VSFL9Gq(8sE zc2{h0i(Ag8REARu%UlvJ%}uqrBfDOe-z8yc^NQ`v=XxKMU#&d&H?V$x=IgcFL+%6? z?95z!=da!0qr8e6Ee)@K)#UOrXxXtW?0WV_P4_IBTT|4tf@8AgRvs1AkNT)~cJ1u# zkzYjb?v5(Cwf5q5sRy^B`X0aYsPxoddMIT=-^nAYikzxiCs*vtXnFHu?aPmg3!c7S z=RftxI+HS+_-i@$zV69Ro6x#aX3O-4ndb{8y)m19!;B+v$I2rUM5;rUZVFnkG+A={ z50Q8Kr!If)dwufO%ai8J+}iPLYd3dLbgqV9NMl;itv6Rf+^>q>V!E|cC09#5>9mK; zwd}(Qk0oDZ-}O`k<ZEM%Z>;ZIP`_sJ zhim^C44Uur_J2w0H)#CFa{QO!4-Gbr^3@jmV`W2c2{_&E6I!e&5ytenuWqB?z4tfv z9}lp<7WgA`9}h=*z}*Q+22RmE4sVX@v|ipn!|^`@Q}SP_dRE2*@oquS^QS*KyXej>k^-sy$W$KJ3ZqWF|8?-?yybh}A6d=ZW25zOztERG-eUVN ziben3yZY!ZFJ-@u_Gs^Y1=F@SxW}D+9z36QMfsJGO2JB{$Nw2tuWSD8bN#^rsr{=s zpQQeJ@a6oe?~j60+fP3~@l3}(P`UqCDp$zOK8BF*2SeILCV#L#$o_bx<0qw0uE+l~ zgvWAzn>+uYZ&m$?ozJ@-lL zlTY5qtW-JwC=s(y^Y2Ye&*oy>)AQ+_37b8VbHn&AGJi6***C-1_|x7WQ{H}=SgG`H zdo266nd=Wa?djMvvGDZC>yBULze~=SPh}LlEEjL*Zm{L)DwTEinal1a@s!%o61_gJQTDjlYU{|L?u4mw zv7RQc)+^bo1Q>tW^}>G3nSWeNddES2tLn=+`qLqE!s!W%wzTF|vwB89b$(FJy8P*K z`&Uhsl65;E4s`|jFKo$d(K!Dokxh3vvb}6iWHWjdIRqZFJ{0_kpR4qj$DWDx(amqMLey2PiZ%kq-dA2qjK ze){!Esa)>E<2(K{EOScnb?%itU*#z{)6t&!&4h&?LuS^w#ChB}R5N#r#QA^h=^uh~ z=bu=8((vc^CALq#E)1KNzLd8)J^ON7>KVFddw?cj5^w-Uo?X~ZB`j*%0 z&sUylyyl$o@xLZZ+-Gfo4ovwXz=haVt^*%+{r6pq{|q6*Cr*Do_;UW#_ea)O<)2u7(#W?@`BTlj674=s^`fci8Ixbi zhg#OE#Chyrd)@Kxvg{85GJVe_D`Jo7FWP))ZsK9x+}tZ-9<$_9*qYW6+h9o{Z- zQ=9Xd!0YtGmqfqB#J_Q1$Ojh!S<5f&^O5tnv3%sZI4C2I=cTsnB^}P!Nh#XNxw~#n zy|KkBgv~9w^vG|qh4;f5wjX4cOO^jCut35z_u09B)At&ky(M*Rcg>Wg8nrAdU6&^C z$n9HIF8*80etQA9h}j+C*wU+69i_N|W4ot9+X01dUPo=z?z79^2>dnwUGj$jsakk3 zcG-8|*L2@!?;gFoFlp+JbC*(-xqeNM+4oIT4(k{D@8$Xxs5`ISy(V<&JcZkLijz-)JJ1~$4!Oo&XJ`oYs;NSyzaP+UyWEz2G@Uv zUkm2B#joS{`Ln)GmHkCirDXDdhBb0CLFv5=C7=8htWMxQy5H)9#NMYZHDgT~S1jr$K zKDhKh1GxCwvQhpNv(L)ZAFqzZy_i11^DqAnrYv9NGTV1oHz>cEuGuYr^10Kt{T6+5 zPj22iM|=Xu%X^&ivW#nLp|xHnD0eOZ`NOye=8sqNmGo8O{xhh@vVWVq{$ND>MDa;x z1~#zrDnM|x`}Fe@&t!_5+CF7m=1`ZOb@TL{%Qwx8f5~@w{8)J!Ihj>$`YBqeX0P^U z`kr|uT8D$Xq}k40Uo`LN;>ObxPO3j%Zoj1ar1;leFYLFRt>a?SuK4uxlhx#cO}oy^ zZ@F|)uIO$_tL=*=M{6zZ+HdMAKVI$#s#+TUGrVSBRu{fssQdcF@JYqu+R`~cZ8Jg? zf4iAd4`#Upvq5&%qhFhlwH{J^qm){r2N7wQ+|TVI_8&U7i#N|ocYIUr3y$9BYUkM;WGqr?n-Oqo!LEnyJKj7lDBQsB&r}!1EDtdi zoUgR!)$H4|!Di-%>EH;0upZL7S3wr z)8#{>yk@r&4uxL(!4vUBDLK(TSg!whT0LK#Rpoa({vX2f zFE0PkVAFp4>fGai!{r%XM}C~LPEmNk+TY#<2NnJm_5bUs`X}tEH>9A5i|yWgq|E^N$EKkN4TRQp+AadUxRv?>;G} z?iUOz^-kWg`YI_YdsF1&J9xD;d*Q+M_nRI~=I!AwQSLias(0$-@_vJ6Xj7ddUufO8 zol#ZFg?fc@QTgA@xuR>e6ghXf23>8aVrkWw*TCejHN~`clOluGM}{Ki->PzQ_tQ@Y z-cvi$acxf9vPYYmN?BViIhZHzI?7U$FfnM_+6&B?a;fqQ{ym$|pUT*lS9Y^oqrIT( z*CZq7yrnMu9ha8Oxwgf%=b~1cweKVYuK@NtYZoLnoW(xHg?sW$wE4odj0Fn2zPH@+ z@3{Q7-23?hgW*>}|4-*GDK#B1&iaZg`y7x$c>aOuWe&Fgn3ELdW}HDRk)jpkHQ)2)YkXES(| zr@LkzyIkY-R@Y*#+tyXDriX2J*|4N6Ra;yA!p#>gMII~mDl5)#8&5*RP zDXJM>M?N$4@a%4F;9xvI;jO={U8 z;B+p?k2mUvoJg*J!wQAOOSAlrF47U)@@!s-c=?fL6#v2j~JqZ@mx_H4C|C4DlPoL2Dxne4gQW^03=AA56ruKn~g8x|_R zntkZ@9g#Yw$=mJv?xZcbc+1(BZMNSPL33L!$>lNm~ z{66f|2Z!@z{#tD>c-sD!a%)IAeJCg}c%zpt`Sj;w+vDr+togmWjN|#@^$Jh;FDiaI zzsT{TZ{>t?NAw^vcdQ-MV$&F`-b|EsB?>Y8RjXthZ~Q`=%@_ z0l&lg8R4rt_QlNco4QLg&s@GZvrO*U$NemS<7IyD`eO3@-PfxM^DD1Up4Ysk{o#KG z`@TK<@1EPtk{)ok&G@Uu-g`^0s}@$;dF^ri)HFHyk=eY5PuEIirMSPJZoO`PSKh3y zM=c8jA1OKA(wniC;bLiK#M_W5hV#zYwfax8k+og1K3qNbjOtmm)!(z1G1@XaZ2Wg6TrFfee7G62F87w^^vHTw2YA>j7ujDwZQ*&`{Jj4s_b03MIzCl?uY1LJze>Dk;{1z=pFaL) zm{K12?(gM{fQ#RorzXp;(SI)g{&~#Tr&IGTZ6;wl3UOvh|Xabfc_h<@Urk1#Fj?+Tz(+5_%d6s`#e7%KsjFP}%(+U-fT~ zWP6>S%ThCU?mc98?p%oa&gBz2?#@tjy)2O|@qEr>iRYI^11l9BE*DDgUGI2vV(td5 z`{{YfKF5M}cUHOtsI6Gi!2PghUKrPuXI`Bq8)7!TpUz)1d9GF5^Bo5}M6TxwR|&~X ze5w8F$H9}#>~>9?*mZW!bu5u&_lV>4c>XmaPX4F+(YIfV7g+>eHJ3|a&TlI0|Fo&| zdCdJ|Hw5lIKAgQH%KO*CFE1`Hc&ep!?M>Ko1b65FPmFXmiv z_bk6y3ESemF|nIYWS-S8$<*RJ-Dl08Rj}mi;lF<^gZp=X_vyW5_ipZSnY-;he}e3^ zOfCOy@K!E-a?kqTUQ@PDle+Hg6ZX%GaXr0N?RiGgcUj(*nPnGdPf7LjUg>{0`Rw7n zn?k2(&bzA3s?ueCmi45?_k$%WkKN-6tp0|H$CUg#@vT3@?$Yh_y)l#Rz636P*L~NL zD=6TN&9<7Gja%cxUpI)JR_2oVJVEiFPhg_k!^4jb^SE5j%i_MgtH>%+*X-`faPh0s z8{HV3S=Ea*Jvez*PMD*j!p(Miveoac>2fcWC1vd`kN>P+-WvHeMeoe-2fH5IeSR+| zzv$5Ge;a+LufBUQoLez&`p(6h=PgyxyfHsiP5Z%8`|wwcT9yY6iJqCm?C|1t>|VKG zA-SXr(brDwy?cM}xzDNW(^FzH9x26C%T1PUlk!w$^ekAyJULde_Tb!vr}JNT&pdDc zQ)XV|hehgV<$C|U;{W5fr>Cd!mb1#Q{hRFUyEd4zUU~BS+#VUZ_|Vq#^Zy0@H4ZhO z@+DW}ag^Xawdlkc6Pa3CB~cK3}n z?B3oSDn(p()}%i^THHU0b>CH?pBgV$TTlCHyx8PVZc4apuEoDK&XawPdIq({&h39Q zJ$&cY_x*dl4i)&_WFHQw7qnCYgn$~c$Oz!FOE&WsbS3hQG;43KF^2z4I z(|3Q*mw|Hn=cl(0{VR0ot6FtuLe=eMH7d`4uZgR_{5~}Qc(0k>tnN1R%}UQ+Zp*fa zo#Pf4mCSqAPULg%0=|n5RmxjbHP1P4SuW32@?5rZUrgMk>uvWgUH5nq!^s)FZnto9 z^5y`oFnM+6l?T)rKAF6H-}KCQu6%{;e}=_QPyaLQ30xE8H)$W^q}sDn`(pog{hj%K z>GTzPcXEvrHWy50Es`i*;@J~;+i0n(gRb4`Hthb-@U<&%d)zvwx1~`fYp-S%9`l;bclgddX@d!3-hc#O?ka4sBFcKt(xBFo@%;Anz3$RuG!Pr?|RI7 z_im9dE7>-#$V*qrd=CdgGx+`(yMmFp5#0M)pa#}vsd{)0G zdsBIaq$$hp%2pVL%W*`<5WZ**$ftJ8MMk^Ml(@)UEIcAtCibPv?(W@aybeEzw{ z%I%2{gf%Y(pZ$1NWy-vWQ+}Khsux~KFJtuU-@RISnr!>WuM_WH{*|^hbAj)wfPjPM z+!J0l)!W(k&$ibs-ah&3x_ieZm+j8oQn_wf%BzLzo~jw$j+wf%>VD4WrH@~&`dsg2 z_GsLeofed$;~&sp7#ITKWXRn({iF+&J+IrjEvhEEqn3S zBHc#Kp6%ULE9+9ajN637F;R#T^=2|LKeP$llof((!?%&m)*}6!gcc;F1PmGGfaxU(3W^WI& zORTJ6J*i~=d)?c8pVzaIw#&Vi_LPTN zzxEjvIUGC}u%_{}srjTDT}|ox(R(a58|GZf+nvX2D5jZY^<0gabH=iZ4HK#ZoLhLN z2fYjn3GuxtqVekX`~covjLPy)mrg#n=-}(Szt*3P$l1+iDydJ)jfK;P555GT3f3N@mJSdF7@k~w&Ha3 z#+!K$HN)-A3;0*6Zw}&_Flp|al}mQ+RMeDJU+JgwN?Bbfsp@Ct;S#^A{U!eD#vPe^VP*=(Wtrczs^~(}rCSiXc_eqJ+92pDo|H;*1wbhLyb!Gta;H zTh-$Bwv@X`T2*llPj>vvk=0jqSm@Ipv?0i2O{KAGuXJ11cRBT0FTd+w-(K>h;9@Rs zlxWd}6^&C8Slo3dEDM?-G)?4G5R(I=c#8Q!oy~FUJSLaE`Lgxm*~{e`sy8ZgzUfwJ z{n{VbzJF4?&6mRO2TPCDKEKEC@|TX@Ui(9aksCkPeQ??t1a((x2noaS!dd+T&w{w|WdY;MWv6ZUP#?F-*_FjXzr zZ*D%lLe|}H>gpE5_kkACOO&%zynIit)-mz)S*q#3&~eExy{U7L9xxCIJ+ngQ^Kx6O znOc|1{vAxPN!TW>CBYb7nJ%{{#N6SV{&%BbSf$ovVELaRrNnMMe_Hh1y)kY}65m&C z_kARMg12nL_Z4Nmzv>r1mSiZGnRt4ghQIQPvJ;o@TjgEYU7xzh4mtM9UlAe=md~nO+2YPc5G*fGe2uM{rslzBW#{bpSzv2HvMOaVOSR_5%7FY!}E84Z!o#_?^$he zd^!K&jm%e-Va!`|JRhPrX?R_=puO=4B+20g>AHZYI^8NQ>iIV>e8pc1e z7Ju4uRmO5-28V$~^WrV*mKA+0a)~yn4bI8S-K2Bq)_&U)+)mB8CQX}`GVYAzUGT1e ztL>+%*r~0oS9pG(+mo_nPT7WEKZ+;*dmn51a`)YnV$YkS;$HnQ=R95v>YN2HSw8#m zEKg0_o1O=iSq|Gw|8kzaq@R2CmV&s4X*+IRHvOI#{I=j`*PYXozUeui%ABIQ?aG=3 zY!@c9U69UYP~;R%%sd{Ib>8s$0p3Lqi?qK~@A>$jVehPIPEYRSe@`$l$$c^B?;OL^ zk0<`M%gUKvv*Y)prk9tlyQ~#h+Oj3CeQ(0rCa=2nJvgDSNo}TJm`nDj)Q1Q+a`>ATK$Gj$7iq(!2lX9Bc&=jLEbxGgG85~!xy%C!D z%((dUx58D@50uaEzMg#9?VcaMjWz#tot}RcU$3qFetOm-kK8D)cT=WK;hOTsh9Ri( zKSN6Tbo)s=zn^CMe2DYAt@+`z#fcYI?~9e1@H(nFG$Qei)a7k=UwD6#@L4vk)ibIo z=(L4q(509H&1GS{=MP(_^XJs4ZoX*|bcU^@b>H=8*IFD^eZFaM`8iE}sq5-6RX1+Z z)SWJqe1*42FT8iQX6LfYtQwcX(}iZ7U81XZ_|O55XLjo^d|leLKen>|!0qF4^`Y&5 z9!-rXerLn8q&~^`kE3^tB!l4nyFs2p?bSPeKi^?tvi72P2uH#e+0MNTmg-#g;m7zq zBrH#fPOwb9fA{tJmqs7|O_TrJ^_fGy_PSln-g8ZbeeGMP&nx-b;2CY#pn%KcJO`k?WIz#AL+ zzmH~HEMdHC$kfKZkDIUZd-YnOrMdj>w#8kHBGPki_Gt>~7(ZxPUJ(5{p;eyo=8nzt zGnlXYaazj$*%>Cn_)1&zm?anURZ@pQ3GWbq4WDL3d8)iSZqIc);(RH?x!mn{o@ALe z)W3K8RrH^sR_kzi%aB|Ufx$5!eSqEd%ebX!&|RdEqGpV zJ{RRYbY_`T=;;G<9xpt`uk82edd&&tp!NIzdEBq9yqdzD&GPBr&gce<{|x&jpZYs| zdKu`D@!jZ`k>8Sd``>5RgwasHY8r|nts3deVrUzlL~S$~p){9Nf}w_A68e0Oz)*1tttH6OHAuCkRe zD?Yv7Zr4=dSIcHk{I~DsuRoTu_n(|)Y|P%LK7XI<^Q(fZ4s45O1Zpo|)^{bx)rk@l^x?di)VoqaSP?*9It%#oHovJsbgZr8# zY<_>QYPDQ;wU(j3ru#oba9+o%{|v3$<>iYPJV{=DH8uELZ3s(v;O+IgH&w*fzbaKw z*EEdwd+%%eXijkUJ|_EzN}u@ZH%fn4U$x@dK@G-l^2dFxp3ipinyD+23Hb8?ilpUf!N*~|*H)gMyZq~9azpwQ3%b#cWwJO-BJAVrB zx0`RuC~|q)?L%)0L(VOT&QN&k&~{mxMRB#ym&=GM!H_GUWw+Vijc z5_X#m#w+`KHQtSNAs`4_JA2eUKgL8@cZ)3 zOVv{5SXD~#@{-&7JC5&5{q*#2+ue$5S#n?WXFjn#J9TpZC$HrbYU52kq-sy^liM{l z{#9;p>b|>`=G`0o7Dk0k-6Xc&H0Pb|goDS+^9w59_l$%5g z{AV~Fw|r4;2uo1zu8;5jZdLoYX{)h%)}O0#9kTP>tYn^)epqf_^uBrizR>>+tIXq; z&Hv$<_4;II?ETLr@8^fQGEO|5`o?I}Ubm$Q#eZJhw{l+g_WIP9uajn9(RK>uZB@0) zx_OI>ky(A_@y?YxJ=0_uWTwn}m4E5@Ki(+&PaJ;^JpCn=<@DeRC z4CN<%4cC4z&D!0>`qML_k!Nj^72lKTDQ_iS7;cUEHTTXhuIa+Bey*G*wf|x7`Qvv^ zNJ_l?8d<`=FneEvJII|YxBK4ex?AbGVtW3og0hdtc)~7EzOBqYz474jIxSGdyqYuH zlA+irssG=*yY|dyXI;$RS7i57{KWI$g8P{xzZ?BN{ZDAkr{mw0>n|Uh$M{u>^XY{@ zQx<7--qgK5^~A20ELMeOW#T`tZr&N&?J}>{s?T}4e&q7toPB-H!8*n7+peY^D%AV> zpJ7goRjuQ!^7E?}bt;MPu6-!{CL{E3s`m~J#kj1-4IPs>Encj1=#iKC$~5=ynSH`j zUb(aXTXwf%|NPg>=Kg0m=T}odXUXLYpp3bMm+5w`q})%j%Ko3yC0Cc_Zf`evyEEth zl}kKnrv#s^2)o$RIQh)?;;$ha=GEF|WnNO3O1gUGUr9!D|BWuzgN@nyKK*BC=|1r8 zv)RsmuAH*F6;=~lqK=YNKt)e04d^X4A>8dm&jC5zw9{5`8) zR@_`6(yA7m=zccZdg`;cGM`_bXly(^t?KfEZTELoKaCFpS2>&iGvuyc&eCt2zu-T^ z-Wkh#ey!k``|WO}x4~{-ho#SQQktKw?a{6{w6kW%OTT^3;u)T<4707vxGUB1*GoM9 zZA;wyPfc?_zgi&KyXp6t-%kS%*ne{Srksi z{3CzggmrFveJkN)&{v^p^G>=n3vQgag?Pv3*>9M zW!gP@f7IXhwF$KUkR@OKM`=U-_gkvo(iRRUlojOK8r+3skG4+r*{v1ialkW?8ZKFxUd zRx|BCLqPV&OqYm$(~2EF5wdey45r9^-d#m-iMn0eu2f?-qi@R8Whv%;{@1pvZe9Ja zE7Wfav;LmBvcEz$*RL@CvE}OWlD=sZ`JA4-JRN=N^Un^hGGVW$j(XgBz}wT+q(Q;S1ZGu7jtDC<-WYRbNmN$e7Eo9FVm*E zKD&0Ros@37S98+t*0gzTvzNKl{$9H+I8$~`s#VPMGpx$Y&ld>) zK6&x}Qg8EL&GFq4R@&~5r%l=XRsIv(ezAG4xn6$kVp3f4rEluwrEfl|W}Z%IpVxGF zoz)k!X^*>uGqs|oZod@NsWR_VvEOo+7w;l2O)LD*0P@vhKj*sp3EQHdG{|;yw#6_n z2nt~QdDK#SDWhQTl9E+lOO<0vP>dwTS4!KYKt~~kv*1y#X$wkqR z57$~XrF@$5P2aia6kp{#r~6tz=lEJ)5Y+WtQnDplXZoX;yQB4%sHo;1O4X7KU}w*7 zRDQf%aZyRRe^ptY1LMzw>yIui|IzQaWxtRG>v6LO@%4sBbI`z3g)#^a-2wqJE) z&2J^{7fZeQd=gXY8Sk?R&ou>aI-dV|B9vkNJ-@!cT95>gvG*mf)|J=FzL}?!GwP}) zyb|PHFg-}wZo|~xeG|BxLfCJrs_$B6a=Wzc&&qAnXE7{OIcoE+dQ$S9#{SRKW-%IE ztg?($_ln%)dGa&c&i@P-*T@Pl-q~L@Ek|zg8OekH85aLF_V+w@ah6DdE2GHeDsQjT zn_MSq``nsanyKntB&-!^-5fR=!^)Qrhkb^#`pD{xg75cF-U9>-F8X z3S~NnC!Ol6d>3_7^XG(Bg|ZqPb*nB#MXAl$eX4u8ZqJ@0l6qSn2i$bJ9TgqO<+SaW z7Rx05LbbVVofmH$xKx%Gvwwr+pQ!sQ6;JGV`FrU;t)RH6oZqCmELgL09crEg&v@xz zT#ZPZzGZ)vm(JM}JFDFH*0kH&sk#dTW@$R;HaXSGIn1m0Xt}b~>`=#NbMGlj8w6Ez zH8)uwie~upsKNiewtL-Fo%^qN>vTOooL zMeP(8YoC|0+DgptJTGrMel5><^3E5zy3v7}R}?L8U)1mlns{eQ<6Xb!E-xPO{}I_- zyFUG6c5R#R2PKOm4NOzbk`M52Eb{L5|0~*6Y|G0iG=0gIP5Refyu2K?;PzRM;Lgu# zWowpizU6WIOwSy-H}j=RzE57f-wR~_ez7SY9ly8F5Ehv7E%0`&w&gRfZ^=KF%~`>w zUXnJ!*(=Iq?F>z2g`dr~^~D}0_xdm8zkD5i$>i$F=do?4`z+q5P1(BEgVihW_L)hZ z>U(BQvEiB(6nv$J%RQ;ior@j*xdbll` zT^JN3Q6&-GLF!M`$%|2r zDw0Tvw*=%W>+Be@;r<4{2ql=s#w@;)@ z?iZ@byo{84gEQLxgunB%VGv3yJNw|d=9}66cRiO&F-g~4vIaJSY%&k_RH_i^a z_CzgYtHzR)6>p!__}6-!SDxj#eBu85jR%`m6|9bwm~G&5P+-VlxrbEiMep+V=Jl2{ z-@7{^#i{b%38(b5zi%5Bnf+1VWcVTcIOtVwk@BnkrZ$W>7D=y}e1E66qr8zX!;Fl% zvi(1nLu~u(%;?*%kJ4u8d1E=E|_KP2S8?^zT6W$84m0bos=Z3j)96CSE!h ztFOCv+1otDnZDa@g>x=tyL`iB?aD8e>P1u5)J~dG{qpv`FnF1IKfmoub?YVP1{SYL z?a{}poOPGKTXK0WqrkpQSzXx`wSBX;D%ae2tFeq*Q#q1cu`kBCnB3f&4u# zRmp`xr-HnLB`PEBqoy|1Wfd=w6kW8X>~gPW+RJ|o=O116n|aA9%ysW~m6xZJUzzit)+)ixy!;xpGz_8SJ#)soKcB&qQ)y%Se zQ9I#!5p59R`YGs<9(Tpm+droi#u=%LYJVh@aWPV=ylC(CQf%R>WVxM6QbYgElCnu<7g>*&>|J_vopE;1b=E~oHI@i@-aa#VQfQH~Vg9F&|N3_6of`l~J&J$(GHt z7Cn@$%Dc8~BAfC`$F`GBVcS#Q2l(Cd3WHSJ)<}hQ^rOSIQf;{hJv~xi1V%cZw>?q# zY5mM2m*+CZ70UZ$?k=0(sdRt&+l_N$znwT3Z7Ai`ofq?H+apefR4u0|Q~AEE==(L< zbg@a-1oO;lt2Rc-hU<@ht@hiq`P{z9WT)*5xk`5*U6#~zbxT>`JHh+KkKf#iWZu(Y z{qpae7KU{Tcz$QF7?k|&yYgu6*2o0ssLNZu`XzZM*>HNu>>My$CYapL2e>ys?6RWdrHb$#AZam|qpY0YD$3g5DZ zbFOK7p4vX^Y2bV(!oEtI;Yr$N2a!Nm#-8G{X&XY=gEUn5DkWqym}NdkuE~=)=bF}_ z&5*P?;>5=V#u3MDu4OFXI`}+tQNsa=H5XkO8w?{CbuqJ~f#`;V&)vPwiZDhfo6gc; z+TfOL0zQo-q32r0qK0FZ&o;Y?FhWfL^B4kMMc5dQrgdrXB#X|{SYS|jflb>afHi?9 z3}lJqnu`tzJOP#0G8PzK+UzRA#&H&;RB+Z=kpNbZp$oVW#u%OhsW3cmI!j{#7szQ2 zqF^U!v(HWIVrEDJ$wI6W5IxazfkAYZ22+;?>7lR9zHrSoelI5Fbr#c?{3uuVb-fyV zr{~$4y_=W6P2BO$`qtUP?J`~>0h2f6W~Qu+V3w_XG`nK)v3K$Xb*4-2rkB9&ByCsn;Qr2AERCZCY%_-SZgRDP;HQu$QVeaSvcEv@vIZAY5^ZnK+Ns!(P& z$>GrK;w{dv>_ftg&nl*^7T-Ndo;`Enp$+1Fdw&0CSeBg_uTWXD^?+R9zM!f{&yTP`*oF{HLMyEYCpJKN1 zQ_|I{TP%N5rG6jEbvSx*=k!>+oX@7At-b5^-2Ql%RWoYFTc#<^y(dl_EA+mzT{z_1 z+$YN!CAe7TlzhG7-a04f;-9388%@78&3SWL=lE0i)bGhV4o%r6U)b*G+^8i{xRo#Y z=Hrkj|McQ4Rv)huc@Zc1YWd>KXF2K}QLB7(w9h5%5jwj~Fph(>^14i^=aZ#o$Ms@f z�MiqCO>C&f`DBtn++7ewzFDnyLrHtg(viF6M47@Tp$1bw}sx_^Tqz<8q&*swyaK zvwCN;>y2LEm)%?0_XOU0=%UeJTYvd#O#082g~g|4N57P1JY1*b^{{rDKmXcY-@X@Y zcgcO-yv{e!+i<4dQ;i%=ZIuaLle@|;#JE3t*SM>&yYbe4hOTY1=N@;ASRB8`>d|lZ zEa^_&?PXfUxl@)NHQ6?G?vnfya;qk7ubG<{!yuQbkp67(mY=`EPwzfH#cuP3@L2ve zJF=gq9*NU6)(^P7D7Iy;T=b>)Ccp3HD>mwHay#xcjXSw$gHus?(k|nG?Z@&oeuln& zCwQl!3HFA&6%RTtG&9&>i=w8?CtuLlM*z$Jk z>k_wniRUc}o*w#iNo>OcH_^??qF3#_P6d9-f4HjiS;^kb>+7GV)cbeMx$S?D_v=sH zJ^fOgvR7Sh?OFS!_IAhl4_DVo6o$_1@t(;W&M9T*T=rDUqF|-x1iwqIY<)-hTS9tD zmz}kIx_XhRj`o!kcT^wCxZHUAYKK+lE+ud62`y_ibvJPSTD&vBn%#y~?s4$VAF9V?Ng9bFJT2k$1Ftl|pPw_-=#gB9c1VnlprN zSuNSR(d%@V=Cds61v{-+wVs~oTKD7r@pF=uHZNz~I@~q=xNg|YVnN337X@F+hXtsx zvQ1jV#`vr{u}E(gC+mTZK=ks0evJVYliosP4HX+%F}jE?ALTQua7; z*5@$<{ z=S1$bE55TjrhJNsl_c+vuHF}N3a{-XD)n!hoaeMXza>kz_}J`iZJSR{6yMUDWt1-* zvb58f(>TN>#P0I-Y^Z(H`M&cD@2+@vyg!QTLlyHQ z>({;S{scbOmorW0*!lqP&lW#iQ>XMQ`|dui_*qk|e(P+NQqP>S_|=iAQ<G z(EhVp#~fukzFfb2XqjD@m9=N~dbNMbw@S}wT+&^WIeYFwJ-gm}X`cmS3U_kY25md# z)F`*1h?CuVY3lAJop%q%Md(&tI=x`&PL{iRLctW4z% zSGex0L+&~gXFba;wCG0+kUh!UsLMCwpIW;mL+ccePgQLVc-p9{{RqC>=ww;-;b2m0~_l*fB znip2&FP&OE=S=Mi?U*^+Hf-N+xih^=sO6yr3uDxm{qhwztxqPm)dh*?hU#8iVyd;^ zb((ad;pMU|OFxU|pUicbb|+t>FhZGC>wK_RZp5dF_g)lCVmx@hHD_Jbmh8X2N9Jp5 zT4j5@^7MI8C;Rf+^ol$?Yw5Z79=2|}b-j6~j+;XqBa7yj$+6r)lh=9p{ovAA1YWaG z{9G<=#z~19ffa2&6PB?+o6oSI@txM4ih9ev4zuI;)W(X3h)C4#pQpM^#U$d~m$K;Q zpZ8zZ$mBksaPletlMfcxxqa`MJX=@op1oJJIP2xIuPzz7r^R7hFI0F~7N{s=i%n-`A|p>?`k# zmn+|SyFF39F!#Rkg!fnGdIoxh-&(VDzq7ik>s@hM>nH0E{+_qy)8xmY&qIvO5<=ho zEp7RHW_tV~=D-I>ojZGF9y2acSw8d5;t5&bgKFiP_DpMJdGN9eRu6jJ|iHPo0)vXF;D}sK9i_Bkb(R?e@ zQT9&%m$TKJ%)5H;Oz>RlZuOD>q}xNKkITN!XQ)_c-CDKSHzMlNTCd*Rtk-?&IM;)y#hyg;D<*R+qMmN+iyHx6<%d+as1zR<}Hp zvXi;fqJtcHn~HZP7qBF+IOOnx;adQ!FPFvQ@Si+|?>oazmu~Nji!jzZn|br%x@{g4 zwzz1gh@8p%Hs`JChQs&g9dOR_D%WJ?Dp;ZEu#)@5TEl}+U*5CG?laW-GgJ4qwC}2G zy35qgn|?O6TeR=`7Tab287yqJsps8Wb#k?N#ygQ*$&;dX8pad1+D}y5SGqTO(T~EX z%9WRFOs~D3t5rAEwM}Qym6e|HSrId0oY!nv&K0&S$Y|kS>tmnXT?!^U?mX-#`Es7z z?jqllQDs-fZl$(aGyF_lvba8dZ?#eIoV+j_|6oH6PldNHFKuG8Uiqjw?6PUw#xn|~ z=a0`~c9zhTZ`*d!$=7j#C1W7>dG;U0E4Du2Q_JF2&fk^g9pZ1e{oIWEIV*DW3RZ9Q z+B9v-x|@k!4qQQHOI=zT)TV?4m@eEfX^SZNA=H7-kBvem}dZPN-h z|G8{V`xe=)>N{_}Pkw1njd0lBWXZ*0+6P^3*UV6iwppGh7pVKHe5zcEII~r4AVZqz z*=LV7DpkdD|HyN1IqhoAC^u=lwgQ{|l4lo-9;{g>68ClLQDNcL&t6Bn{=0Uf)#!Xt zS@EVDrTxAK#4eV4+@0^K8o^v}`%;8x@5+~MJJ$C#p0(0HS>6>~(Yd^$@u}cb@q$ND zTe4rxUB0#_^Tsrdz-5|TjuSoyUfXX`sA(UpvOF#HLsQ2}wrQVorZ20oJaSIt_ovLS zAGuureu)vzeshGsWWtt)$hYTnqTd?%ef$3SweiI2w{oJ-6FxlkUgBCa=kAIe2Qg(9!&wbbZ)k-5*VED;x&^ennKY15{@B0i2v ztNTBy*W}kkJZcwtH^=P}@4tIT=l(vjLMQssk?orvP3!omxGAJfD8%WSxpsAP{eqAM z`9c%tO?@r%kJl@I+Q~P|_bjbYUGd}bk~QCa)z{Cycs-lhh&orJ#;Ky zXM`JnJ<=D?ay7X0lhfn%BFT$AD_wp@-}ySPJ^Jm*xd~e`C8Fx@3f(%?Y@~9$Fi*2J z;av{PleYm;Ar0AUKb~KjENQu7;mNT3KQyjh?}?J`3Rth%DDQexUo0d#s-xhOTE_!j zy`@LK#m?ws@Nn9^dsTtfptc-spy`OiP=&^~}J2NYc_5GX*qvxdD ziw&$UR9RwubE>KYgACW}M-v~$6-+)acdAlpW#GYE-L1ba{e8NBWloLsqdWIx?wLI2 z*O~b6tn1e9)p|$nZP8r*=tKZt?+U-G@4P0hnX_6YbY;dT-L%UKzMPv~-YL9J{6>xE zwnFQm`_B)(jolZMv`g$&wZRLYlC>JSoChPE0*u5KEtQ+?U31XV!lo@d(ZS~9#G;tPSrJ^^Ecg}uV<~N0~ZV5%=iE1U%nZg_4a1O@hmQlMGH0r((Ei% z+L&CaFmFrlfv0gR7TEOdwG4A$+U)Aeu&7JR0gH7J-$0`)8f#KY7Vv~+OUjv~R9ui_ zUJ-PqVMEBAJip4GFTba5nz>-&`>yx>?+a^dPcQH3Vvg=NyK(2yp`Z{UPK%T33^gf@ zAFnTHJS}o|RhRAATfO1rp3Ry|pH-)-sZe@~ixS~$_6(tAbF zl?xH~CWr*jOOSc+=lB!TcQY3~zMp$|S?#&j`~QMMZ7#^k7V@fBcXN8Y@_eFw$dv%h+bbC@FELKXTMPJ|8w%=__>ViCs{Xq-bJ^kklKdb4 z86+0}XK3zsu(`Hf#z~}QWuj_&mZLq#gE{;i!XLviQz*>nS)0e%pS=)6mD%*`J(Vd>Z`Am|37`_zpM85WZrAIwmd+FcWT2Tu7>vt z$?DJLb#sYWVQ_?50+$M~4I&LY4|QFi5KW34J%y zbf*7a>38)&GpR_|LG)m*Hd7 zwO7)IrfrxqNr)44;meY+Q>j-Da0KqE&q?^t@KN^ye`xaw;m9>|Z4Do8uP6~U+pvJs zQ{njx3*|=&T{nGZ1+(4x_@CiWxZvae3_4Zw`n{OXXEkiNHHB&Fq>1+mufOa1?(@0u z{iMs6zevXa*;TQ?U~%KDPnSDNIio~GrZOy8-EM?-in?#Ym2;u;P3wo zCzmypsEa=2+qPWfLWH&lm*#l`J_ma_{u9}^+T1iJ$=Uw6^QZPq<7xY+sTcUCKD;h) zseG-Y<_SqVl?OFn-_0@&|28w`Kf_bQ>i-Owxf&*D6=My-{LnRiFKIg5@^^VSGk zKI8rgUEh7a@xNJp{a@jKh9{=}B5d1bokUtR6IBmyRhZvW;KzQ1^T+BNmXgb&e=@yZ zUi{A}zW(oXwRu4Xh7TQB9#2@fUEr0_<7_UcHmAlDO3fcuF88QES{+~h+->)Nh9nL4 zu4^&=nK$#LKkiW9FSGN{qrFcmE?Y0Dev?rD;Q9X7QVZm=qt~0A5_!Fv!#QDPmQ4dg z%H)sX8{F8fQm!?~D%MJz%iYxepP?v};iqdtSO#xKDRFneG88~Cy<9~mA#rUr4n0qhct~+wZMl}|7 zF)ZqWjH_x(E;eDySOXba1`YHwVsH72%3Uuu_1*85#raF>w%p^D%27*qr?smr)%Bb+ zZAwIL%G&*oel04K9%=EMe%DfedP-eRyz764 zuWLT+|66DO^wj$cZdMm3K6a@2k==dYb&vm~EtPr&yU$ITwmU)3M~LC>=IOiV?0y*z zGUY!*)Oqgz4A&q3i&^)y$^IelZP~ZSe(cnnXJnJXKfR{-)9GI-HoTW6nz~Eu;5{tO zJJ0u$O_&Nh&!nB1+!JnbDaYQ4U^NUY3KD)Xae~MBOGmx0F3jSM)a7zeQCaokg-ZIK z%ALng$C!RebMT)mH|y!?`&XRr|I^+TUZ=uS^4`9zAlH{*|itO&t%WV%yGPvV!0#H@Wg?zAikmnOdXyooR!RnW_~&Tjr-63cRl|Z{%PJ~ zKDG3<>~b+}d;gD{_n%$4sb+5QyQ6E?ozH&DH1EyFqJq{ccI*DxPi;0-rmIh1w{(Y` z$i*W2>$lC<7Fq8qgC}3)7;5E^(anC}ipD5_P^^@%T&3x@|wM zN0(3f&%iye+jNRY>Oso}vDPJ;S_k(&NfD^*x$^wQj{2_#`|6*s4*y%RZpFj-dNMEL z|D0t1w@`##XnoIo*SDN{mQQvbdeYLg$oG&1v+VOowQe7M>6MSnl)D-{r;Y z(9cfy5^q0s-L_lFA}jLqicbPtr>8DGyQ-yui^KnrWq`75w+7RtKI4|jpX>c!WVifl zPyf#l>93;~|Ic9he}?{@H*E8V5$>LN0BIX@I# zj-PVy3~FSU6g1@lt0-q1d#iDL{kE$5>3=WAm;ZgP)^K3@8p}sV(~tT8y;}ZrYr?5( zHs^Pg)qLkKoqO;|C!Gvvnp%Z>Xo^X~G6lfP;GGhCj-&&Awsv&v@GpQT^ir}Xtb5NFsCymb-*-yA|`Ze({X0zW+PqrwOYH%_lAp3ny7s1&((_+m@kZYBO#aVsFu(cF z{@;w3_y2v<@8JIjIShOYRI--beYe_m(Y38pH{VhXS7!>SHf)%r{M4bZ(&G7PiRVFg z__;E+)#tsB+4wcg^6{TZ8T=@bIr~pgMGF_Yns+A zC}x-!s{i!i=U}tt7R~a^|6UxFwST{C1@pPD{Xe?Sf4h4B+0|zKhzI`}BA}7tA0a2A zQDn1w1xMMe$*V3hemJ}8#;4kgb6YJ73)$6zmpXIyxd|;=(mZFSCYPehl=fo%h{wNO z)8&6h-hXx_)BbJtpN)TucKm1f*dKh2y_HdDx_W5!-aM_%w|={9R^H6?M9@YtOc#lZG7lpxLZ41b1S<}S;HjDiKXSse{D5? zxzlQ^Ro%5|YrZWHP~0T2UC&R^%fsPNmrIe5$3X=l#wVPwgJv?6aX$u*Cuwhux*f4YW80KFVGAC9j$~Nsa-5YxWu-%dXHd`_hD8hBslMi`*ckb7a{p^k zsV)95Jl6X3+LN{Szt5RfEZ&TNGq-xV&EIln*D9-gz6HB)7;QIW zt=xF*?T&MN#&e_|^a=h9{VTjq_rt&I>vs4*d48CC-LzSc`%W zP|RJCvTe>|g@ms6a`wrexgJ>@|Id(Q-dF!?_EzUwt^@89)!NusOf3J;@P5uJrX7E7 z?Cbu|@H+Bg{jWdur>9J;iTkDd?Ah(UpL!qmczrGxn)t3;eqo;5-ko{gni!i z{|Gx~fAoF*HB*Oz^YCi<-wpRaJ3aL0B>d9N-V`IX>!(4%UV*8i4|U^SY%ntkD4)~) z%zg2>eQi99*JgZO#x`-^gsuFqbJjOsx1F>rKw4BgoOOkH$`+9)Z`EGBP^mgT`_mfa zz@O)48&dQ&Ku|iSH)QtIrx{yrUE8d=_hszKBQ4q+vM+iHo_p9Mdz@XRCxI!p2DvDR z+>(4Z`{jRz{n5vNZ8rIM`l^FV{-n~tEcyKOZR*0xQ>NUR6TW<}1-oJU;yFEEndfmn z_1lM3s;`ggbl%w9|FI?h*FnEOdqbGDmcAC^|Jrr_@}I2tpR>|0Pby8y-NY<5JNocl z&Lf()C-=^osW+8J&GN}qp$WxPRagZkdAS^oIQa6?%qft3m)x?$R;&6gV1T5LQfe0cVDF@bgbXQ+8ch7Bua#is{y+s<)P>OkQsB{?Lj` z`WKhJx^^RMc9P5NuDhLzyox*CEnR-)cI)2$GQYLDJEXKVB00iDPfgzcl=qOvuE4b! z|5lYm-JSME<G!*{ zhaMc?b&Xy9kl-_uQ!=T?0ySG#X6mRcJ+iCutiwWQiH$7##HB4_3$IQv@!?Gs3VrnI za-MVU6pL+f_YO{IJN(eLKWiCdiAne^v11?R?s;XJ`f1+7-v0~%_ufw1y?B#unYM}d z;pu6Q_bhwTDHPXtImh(oxBmCR4%@ahUHYCe;btV;%&1R=SNLBoONp!Knfa^m^k%8H zhdei<(`t54($(Cy;^%EY)oqJca`JuiJ?`Cj$SIEZ;X>i*PwH20m7NqiJ^G`(|9$17 z8(;pGojSdwDp^_~xT2Uv}mYeEm5DgyMCGfqidVjeChJ^+Uhz-q-R3<*3v!1gkAKhqa`I19TKj5~P5Rr_ zudmEy+#cO09l67FtE=^)jW3H2D%)N3+xKTn=NGqCo1gEf{2kxx5O^=b&fCmiGf(n% ziQadRW{uvJxq2)78yR=!KBT;s=b&lh>Mb*nEwhQ^fo`;r!zOnb5!9 zvmg9t_<7~A{B6Ao9lZp!dgDcysrDo+ml~sy(?a8 z((s?*&8jojKhI}>TshzW)m~#U<(HFJ=IX9EH|qhPUxv_B&r(l&?uC9FU(*^MfBvGE z-;nY%tFZrV(|?AkOM>>b$v#~@h2!{X>mII0T&`}T3mCH~#e z{~2}gmw5Qb>!*WzYTf@{i2te9Yo_l^(2J`_94IP4yY}{_pAPP+&k_H# zwv2D`)md?RGq<>aylQiFpLL$u&bN6^mo71S?bTcG^~cIPuWgktyjpFc_44Q6^~V-i zq|RU1SsD8&MDXeCV+_j{xtDJdXUz+Uy2q&gYA@U2{@YUVf4yfve|`C}`fb+#4BD}+ z@}VzFvNA7CUGbJP^Ms+a_q>{GS2guKv^=bL^}ba9c4)5cub1+dediRN|8{Wxu>}^! zQGdDI-bAI8T_~m8y5+7VW#6oE&&hChxZ3 zjE=}shLySt6okw^ozr$(dbKJkbe2!WuW8pFcX1pNv|O~fwfXd=ufdZ_mrb%fwrbPr zd6xd!A6GcOJ!`jB(Zl@rJ`sbub@S%$T&K9JmM5dCzjKb`^{V<)!5vj$Zp*F|saN}Qj5+vPpG%wdU~Sz>piSykz31VB;~%m z{#AA*XI+s@&Z=VPDwi-Jk1soWPez>Y@^w^~`_B;c?B}nq7AL*Nj zZJBa>&emNEEf-C@l;q(Nv{%o$Xp-%ckmmm2FM8`!QYy0w`{(}?i2t;uKIqlYIki@E zl7A=cf115@^4gLnx2svJ4W7AMH^=OJ%zo+hEYUSzrhQ;ry}A5J90F_xoWew^Twn7%0W?4gp z(aZK!*0OlI`?{Zd)Jw+y3^zk(TOP9kB_2!e=K0RY?jHQlpdo91bauPk*JJB<-&(t! z?WTFF;?Zwe`5QR+G*&t)pO=YXp60&hdcv{;&o2J0-(A1l|IuZgxzS6*S3dNRnsh13 zMKf3PqV3$3L38?oCY2YdD7x^o%qo+*?2#~WRnFbQzw@rg-whC*KIJ*{gTncZQM=pC zYa^@L#h!{Tzplv2r^%+%wsbkC0`pXNuUbd9ox9jCtel(OEO#^e)A2`7EDEKZ1s@-u z5uG{h0#i_nsvg6X1_lNm28MOVuI}3I<8|r#jE$zcOP|keRNZzfuh=y^GSfj-xje{& zA^1?~vI&;QR&AE4@Xx;eElz}81QhbWzWjj1v_!qL*r%_D9*R_^7q+Td-S!OFp{;$V z!L4rf-8tb!y_rj_=7y&IXNb@KxN;ra>Ps(n-<2y4x+Qe`ol$h;oD1BH8~E;f&o^*C zlEG*5Z|PM;6f6<1U)WpODLGyA>Fi_dPEXx3Snr57gnbecJ$r9)nfsdX;_9!L)Yq-p zoY3I--Em#Qe}=ifQO%(*X9_BJ{OY^%Ox?Mp#Xn_2qvEE;A9k@Ub@|Q9czpkro%`zc z`WgP+07*aJd*CFFZ5)oT6yPntm1`Nt2NI56UhF!GU4Ize{Hf4#Uldwr0P<@(oda$G5!bercScf_2N9CvR%5Z=9? z{mF92wI!X_wO?+2D*n$`h%#CU-gH<_4>0)e*;x>UJMCxhfu-Iqj>@PwgvV z7jC`%Fx$Ip&b6bOdS0pu&u6tgdH(HC!{hg_kSY`B%3l)GR|Hg-{!A}yy?EQ8X=;pU zzvq?Z_KUtsp7`4J&T(x?*G}Hhw0Fn99$bHH*qC>p7Wsvx)qktzB>zqVl`$9BY?=3nZRKX+%fD^cxuo02 zzFHV{-eV4btyzL6^KaXA|K`V@x7ioP+^)OdS?H_k>n2crB2u|$-H9o8M7YkUwdUD} zzJ8f}gH;!r)F*>0+I2@Zy*jINq*R_RvvaEwUld9&Fdd|BhFj>fnY3j=&R&S@`M+^O#BVT-3Qh#W- zo%Q~8yd{6HG9D?~*V=llCVj!VPp2P!>G&ia>~HessxF_RGndz-n1d`r95x;6x=pHQL}#oxQG5J~*%AQ;y@}W78HY7q+hwC6yjo{LLb^HI zeyQ0d`_^3gSn_q7&Rp-T%x90biM5_j(Nxc15!}75>H@#qgPs5Ez)iZ#!P`=M{beUt z?@B)t7x(U}^?sL}Wb4AddQ*$vUoOQjn{8HG&bD7_*4(SRBBQ2uItSgVR^+^Pdfp4; zEjl}Ha@tLgVX9Mhu=(Be%zpcKNb~OMwov1x>-BzbFDlu}6!gvNgJzg?xGKZMDZe&f znrr(rQ>g6s%grhO8ScNWGc|s7H*%R;X7(A6S<|k3KJPH;wy&w}qOB{oED)OS{ZPn3 zg!#n=9R}MEcl#`hYwf$;cWD1Lh~0l#{bTllYgP7=->*Unz7^k}FaFQq8X6~%*-sYvd zcRgFWWg)+})9s*jyos5g%Yvu;ia8dv@U7?a`noFnFEC5kPQRV#ktU{J?)q-FtYq*> zi&Mv!eyF;<9qy>iS>IQeY-vkmD>Yqusq^C9u#;~l3COUl_!Y}=(&X*?^X~s8KAKQiht{P{qja<6evDU~`b?MZff4;sgs*cnQSspeux!h^0s`HhF4xSGj zLu6kXr+RQ%vVLdU_N$HIsdpytuJ<{+S=U`J?ljfa&bli5WtUJ5-{ljZOm;OOPg0Pz z^d2(7Ve>|G?xM}E8WKk(m^QmI_N4VLmN)=fu&%;oz?#+tp9ev+;#1&m%k`m8zAofR zzjD^%ZQGMerYfri4d=+cJg&o@SY#jOKF92_rN_x%i$wa}FR`Sp(pQ(X`p*!&yZrih zKkZj*eHX3E-EwYfZ*6O4=1ZR?lXkB(NOTK|nmFa>Zm+x3g5&~Ezs&9Sk9|>Vexz2j zHbJ-2?#1ohAM7_ru8VjaKQ(U6CAk2@ zAE`;#YfQH}_rI&jG}fpF-ydT%Y5x?={=SRi)k6XH@l_`}=T*R-@#UTQYgYXWF8I zJ-tq+Zds7{)MoF?zC}x{FFy%ia}Vpz9z1@MxN_ zi(6k?*p5$q&t<*t@v>drsONE)d-*!8fW47>RfR$o8XtdE_B~th-uciavs}K}#%`}efS=aQ16n7j+lgijC zSoTb2%934owjWOY@H2lEPWxEfZeF&2yTyeWbtQ2} z8LtaI%P}~;u{vSX>A#b>PXmlzSYN;?6@bshex*0 zulDMKs!2ioMvm$xYOx;z{ssOED4)miB2V5p=}MK>X|*pi&h1$1yecrevheYi%j?Z< z=Q&Pl7ua@acGR(>ihgDSBHM*qt?J`GW**xSd&KgO>vylCE2CSbUfo@N=j1f8-)>VT z`7FEXa(&5eMc)?9Ddw`AUY9mb5Zk?}oNvq3e+P3mWbIDU^W1*ua}e{nZB3yv#|s{6 zNpj`-sn5T*qVLyb`<7W;PuJdhq_f-l_1^89FZ&(}O19dfvUIy_$8?tRSSL@;(%hAq zvK&X9LJv&-VV0GB@p9cSQ-Qi`=XdU^UAcGdwTI6PF5dk4=)1?{jkV3nc_Gh^zVQg! zwp!X>;lt+B%RXC~t-o^Xe*A}Pxw}kPcA9k*Y+aK&ZRz=4Cj_M??&2xkbUE;eW9sv3 zYmBB{*epNeEo=W*H-lpoDWE9Y}L|2uoVrrfr$B9x4g(m`4LA>${wzM_2 z>)l`cW^L4>Gli{tE^`NX>bN9HN3hIYXt>Bdhq1Bkc%5he1P2TABkUEkpZsUYyk_(@ zcYDyeDYs_NF5ITM->mYBhh}(M+er?8#jPq+S>E39+O#;}XTZ;(tbY<81wmkPcc=?;ht%#RrwUW2; zPSsq(ViV_`#Wz(~)n#Sm{rw7ankPo9XROsPy%O*>5+%{`Xpk|bNkLKc7A7%D?Ot3So1~C+NV?Z?f4i| z=;Ic=I%vwnR1Q5&mo=-^^)_u;yX!sQ=j?q3GbiMI651YdXGva;!R1tK&4ZS2&bd2r z$gOHW6Xaz3sW5KRrU#CQ#Ntue})pJqaByM zDt5fgk-K`Q;nbv-Ip0J#ebB$=D_!OC(Z;V(|L5hLl`Yo0xS!Xjg>1T4cf3$pdFGN| z?M;8IuZnq8RlQE1p?F}zpBeu$OK0*vS^0Hk{*pb1SCsnhSSqyb%A(dUK^_d8!q?m; z=<+yb&iI&{KXvJp#hko9cdunx!spC-@YMm+wD*hbSDqBl*UBv}|FpnHY4byedgOfVV$4oeUsKB<86Nwb@aL^F#h#s(z9Ouqp3u6wWV-aOA6%tt4?SJ2w|$+~ ztJvt}$uUz?H>-UXx^e1vMs{?uJa;3XSwQ@q15QmFk}cNE{o(UZp8rcpZot3oovFFI zpDa1)y}3G^>yD5huYUTa<4d|rRK7fs@Q{#XJ?{VVw%wF%O6L<>lny$tx0}{k;W=8!m4vyS3e8N6gy`3zpwKqFplW?b{=nTPqg{ESOq(XkJ92B1dVpT;TRx z0h#T$BideFT57^^ijA$vU+X*5WvP2|-g;i~bM`%Hohfv;o-6WHQ?;vhl8v;V!2Goy ztCpXr<&68!&>Qxj!Q=6rm-A!%>Q+k6b*wnJ;_JV;SE@Lzvfi_?PJ6yG>GryZIpRxB z6<~M9q%JUOeN^7* z6;m1RC3LD?H{IRidpf9EQ-h16_@c4}cfi3D&o3?e={qU=nxvG|`@H)DSszcTgO z;yt-nzt^%KvQ1x;!??a=&9=zRO5&IIF0r}o6(shkTxBJvf~JFjmm@=;+tTnGdNFUN zOGjsWXU`OU@iM3_i0eWS=U1leySL6}@4vO|#`|eEKCitl7Tc|-({{Mm?sTVSbhhV{ zpe2(yY&z7BEo@>v_ob~#KAM@NrJP7S5%?sx`fOBYt3~Uc zjni)Bl%-Bsurx2~(Y~NL0lN$O+kWj1zVVf9_U4%RWwx7me*gU_b}iX!qRhhO(Lswn zoYyTpG_`F`j#<#umDyfGYi>zNxBm)nHw#X@RQCNw*W*`HK0WcNOPR^9sp(nxQb_Fa zdHt+_2}{?ysB(CG31SG;_I2EKV(Poio|6u5dgPP4Xe)2OyGFFP#c`7zx5C(c8md=n ze-P(8=e4CW_Vn(8MLf5sOYg{Du7B%r_&wcgt4~}FSay4@*^lV?tViwTG=jQ#!kDwY z<_4u3{ZuZ@o!5PFkLQMu)vdqcJARcpXK%khXZtB9VMV^Sn9s`&_lPc;qM5s6>bA8@ zetD?cURA!l$NrL(Z`jueos(U;W^FnK{8^9NOxXMa4p(0(TmImk@~q!x+ozUg+@7|j zbkU77+tviKDB8Wd`z*-0Peji>+Pu@kUi0EJ7HyN=W)WSoAct4=Dv!l|gQdOe;{4|XJbHUS zDpOk^Q zgOwwsGruRYyqOYTGI84JdY09BW|J6>>&z)OmA$Zs`{8~*z14eOdWW7B`g6BXGUWH$ zLyzvbiEUY%>y{V%PRU4Q*=;RvMaJ0KmF!7{5g&Hys(%Q-7dR(+UqOB2^<3v=>vzSS zEZ=!gJyLh`R@t9o$CAA#s|DxmxiqKmx4*^h*|BftcuDJ;y}DDVkr}-(M(xpk;Xeyz zZ9lNBu<818sVQq6%f1JDcsEwF&iEXaCZqIZho+Ojv?Z!Xmj?bWRWaD~xOQc(tyam@ zb+tRqR=){*W_I_=-Dtn3s)|p1jb;QMl+@jMb4B{JC(L&P-#Q-X6MI!_xqQpgm2M9^nXBnFE9#W^R#k@y9D3HWU+j*Ft1Wx^v3#an z>;b1*qxhavvofDMMcvtUJLpQZr_CX+t33@NRoD6N)@=DPyYhYD1MkaR_-p4*&>%im^%%(0iNX=#=B+%6l{nK@19KSRl_FMHP=>9*bNADwtx zw=CnFYcH3!X6CYJMMjNWPU)Zt!WWWv%}g!GZ~Lr}rJemNQ_XJ8_Epy_IVb%J)iSIL zeyW-o5#*n37d`uu({`K1^E?l?yq)k%xk{>T&E*=$Jq6bTvUl&>)csD_e8+d~H4(l( z9h+63$)q0UvMCce)g&G5u=N(Jnp;eim(bnhr}j?;S5zo2Epf56Tv_5eEA^Vhq|GZ# zgLEg!WKJ`R&Yhm<;dCJ+fa}nNwYP)Vmw4i^Q`MpR&tG^W2rY z^LdrxF=^gOOB!32R_ytz`zCYgtGzDM*XBs)%}Yxxds!f$xOlU1_%4^Z-EX9%J)?Jv zZ?vAe(IwYP_QAQ<;<%khrrq9ue4owdB00lS-LoD2yV?$WMsK)1VaB<+onEzO{Rbt_ zv8mj9Dtb5VOyS|1-tBT`(ovH(1Z+QP-Ntb~%fRux^5v=0TMzWh&e2?4v!-J2QSR7_ zV!rjMGd^E>tJN*;^vc`x+=tu2>-pu5^28*#CvxRUe^j2jXN{sqc7?vx_tfjZitHA2 zAGYAUGI^`b?pgN|kJoBpIQ@L`cy032>@^E2z4~MwuF05xR}x#$omO{VK6=yc*$bzoTl@+-eC_VN zqW=up`RN${wCyfek@H&riv0DZyTkRwU+Kmk^PcaNR*Ev~w(Xeji} zt?ZZQ_QSH4Y(i{o#j+a<_*-YC2b->1b1To;C~4Q@3yaphHN9QB_i3xD-;svLr@93X zP2Dl~&6ZY{T`ySJ#Y8zTJu&fm({*O{p{{A}yJYq%)$cIA{7Y($?xc!o_vPX@A9t~X!T9$0dE z>g^?rXZX%;dGPBm&!>-Tdu}~GK3nO*bXCopwlku_b+2wQ`y?$D)Fu7(jmO=uH&?uJ z{Gzx|_PVZ>Q@{13f4kQ|w>0H{d}j6E&7O-w(|`5ffUw}s(@WvRV@>86Ld{iQw1 zo<&a4UKbvG&h$GT7qnpE%PmV*XKEhwD_HnqPLt#G^Ufd4GZa_%^=+>HYxwuW&&72w zD>wd{pWp8-@um3j_KWArJ{_&PTp2fg+k$|OuW zUT9r-hfK*etHtfNDm=Cdm$xT*ho4>*zVYhu810&JVJWQ%kG9Y+>o$ap1_yf@%4@F-(_lZWqnTRn}7Va%w!kQEk}|g{6NMK6!oh-dd~V);aN4 z#dPCWMCwGZ6;O`6+i=)-{j2Yu^U4{&?^c`ii0z0~!>iw7LD72R!5Og+&uuTbRl_~^ zmFu;TY~{1|c1}^bC;ikcxk@uLHFLEBPjxs2P4K)m!GNVcqJX(=*W*yzwfTWtRkEMV zSnE_3yEyFbTdgu{SJ!RV6g@MwIJF}gnwz%DEqNBL?!V>Uq<>%Z3THhVt(p9*?W(Du^_5M<6mzvFv|D6AJ>hb;m{#4ED zIH7!OcFqKu?XJ;$n%Y56Pfg&E_!3*2*Z7gOp|*s%!;i1Xf6Mh%WSj^=;eaBuglu7) z$LqM)Cy!;xKaqL+bb0!9@p-bh6<*9{{rBm`F4dofYrgLkdtNOzDNgcDMERC4vphTk zBqIHcs)EJ#$-Me&m~q*vJiOp{z^N;r*H(qjwKcRWuJ+xREdD&@Z1m=87LIDk!sXL% zwKZLw7O>pQ?0QsTdQXhigRPBg9go<0XKy(^S#`(7=$VDxf<-YwmnKPnZkP7@)|wwC zI%T1j?Tr;odseM6*LLj=&3Gr7wKs8jsmO_IuWPRzwK}NTuDa(xLy{zC=vjSHm8Rte zH+dK6W@~!MXgc?GOuBnBBlg{_Pil*|IBj@wJLI=W6YH^uYF~C-QtWyBs_;m;(D%jX zXRrPI^z}OL$L0JMr`Oo5ket(;+-qUS5Y4ulgdu-Z$*_+7CbS>yVX|X$Fo3d`cr-J*0Se|*B0n(-|;Rx*5=>Rz9&0+P40M{op#V?YT3N*mK_BGV)GqcR`4$M zRw{hmYQF4E@RofWH@%83{q<4lSohRvFNJbEHc4(jG4Da`v%8uOJV(PE?kotq=iqry z*Kd+yfyevlZ11M|y5==XB`tAqo^Z!|!d<7ZM~fF;kkaztSI=I-nmbiNyUIM@>C!yo z(Chu%`nWSrGd;=rYpN#_5t#3P=yG}HioQ#_y)!tw<%BLODy-1tSJ%4ri9bi6RcSYy zyy%Z;yYKmz&HgF9>LNncJJyVsV8T$dT9Gho5ihNI;mx)^3oJES%6H1@>W1dN6s~VS-t2zS ze^YNyQn=8YITkzbzgu@~_wntoC8vuTwTVh8>y!oQ9+kcm9J}U-!Lv&qy1HLjg(myP zlwFAlzZ_G2=~Kz>S(i!|o0UyX+ZMfinMv=ZyFxKSH=Hl@1w`gvd#>2K_Gzx&R0h`# zz12^iFL}S~aQNzof>&oNJCaOS=czr-?^T^764^8J-8-*KPMdBqKPf&H{Lue$#ri`h zf=b?a&T+c5*6Zq7#kW?cr+1tzde_=AMN7%+v!d3$Ibuzl_av|L*%Dgt=6UzNwb!p5 zT({11{?VUSXIo#1-QVWA<t-43q1t#Bm)04R~ zru?cEU+A>F<&Uh@F6|Baqdg}&_tIUZ#3XIL=ufJxo1 zZ7-MWs^pxr`gd-9xAQ*3nU%-$Jz>|6OzuFP=`$6zKLnZQ25Jgj+19|p!OVVWiOiMR z-?q;@D%Q7P?vWkg{nlH1ZF9HXdZKk)@7@zJo~3@}n?JjqO0l%A&wE@HG)?fvLN6V5 zg<0t#g}rzAb$=FDY+9k`bm`SKp_E%om%U_r^<+Ei+uhNw8(#OSt~;-$6qBiG*|l7J zg0;;;>85QweeE*GznomNblV}XvL3m`GOO&Fep+Z5-^tu`%jD~R_q$uq_8nCFS~piL z`j^{VwVI#ayPo!2rM7NZ*4(qwn`?&9MRq-r^;64xMD{;>D;d8y$3LThEwnG4VNUUR zo%y*r-oB5e+4Y(a-;8D|@cg*kc{3}+_g^nKk1J$f6>*tyeBFlNdB488dKd^9_HAvN zkbPBzjmbeIAuMBo&6Iwra~C5QP2pFy+Z@Tj*b|nqg3a(@T(!;jS>Ihf47)zx{C8^a zMTg{!HMw7}uhPl1W*lW}5lDO;bf$b0-vuEDAHN z^edeA{GhEk*VojfV>`ENPZpRRdh4?svj=OUxAHax3-82ahF_Lkwp#1TPxJn$F}!HC z?&FG**j-=Cn)QQYZk2uK&9%<#_~E>9v5u9{PQ851T!lHB)15ZBDxST5qWq9m-go6N z16ix0%b7ET^QXP8t1c?id%5z>pPN&2`rcieK7F^lTgbgDxtVvLZ}wiHTYlF$@yaw! z9)~{FZEvEp4>{evcj<-)pAC2Nrht+ib365_G@QOOZE8u&7uce@+}Gt=d2f31_8ZF; zmmb@BW{1g<@Jp}CO_uE1%CbV&=JNR&&$Q-!TJWiFM?uonWvVYjGG}&OF=9Sh_jpB; zv-iYk&cbsi^(NkG-M*Vo<)O;rbzhppCO_=>vv3*vq;H$I-Cpk6yJ8J@WmVC`lvhTL=faqafh*!X=6LSDofnvYtL=7r%-@u`A?M!u zmR;%US(3SZ?Mm-+=bZD-`OhuWj^>-PQ}vnYf$}>rNC-U6jnbN90teQ`004 z%@gcTnI}p{#+%aGi})VpQeI?UlZ-f?n_1_2;qJ>qEJmEy`Q- za<+1L1%1|tnD@#$=+cy1i-m-Cd9K_uDNp#Tx30^D80$UJGdJJR4cHp`D!A*4n1As> z?lJ>`kmX`)R2`k7)yq6T*oIFLd8#7Vc;UwtovhtE9xIjjy?At^Jo z_%i*$+sLPVTSM2n2NuiYFQQ(98-_LcP1PUG2ApXZ9**%5tU zvgCy;hZb#7Jg}(g)}$qC)*4jrpEO^1UbVa1R_kTb&58X>Q#^|F7VmM=_1YE}UNGf) zO2F^wW^?X-W%Zx%vTxJYEw{5OvqR^mewxv`vSND8!)voHY@fM$n^LvmI@ay8dzDiB zyb|+Pt~)tpWn!jx>rv(=4_PhCCwq^@8GjV3Xg~6sb#KQe6WjKX&05;MJ(h)4m0nE3 zlQ(QSoM>t3ndlmGhtX)=ZJrq)>|3lBw|u|rwsX37&F{FSJ7U(I>$j*qDY(?Sc*Rk;3(_nNE!)aoYhiSORE{_eJS{~n&)e)}S$ z_?Pah+wSL7s2&xTvC8xL{A})0Z;L~Y!BwA@U%mEwvAM(@qba*f*PUIp^p$qhvrRJv z=Wh1iZt{7pO|7^P%S>qj2ED$s4$GHDt(ev~;{^NK^omuBoeSCHUv0CP6~0_i&28pB z&+VC4mU#rFo6X4Cb?pz&l9hg~#V=$ye_is8Ec3e8VV6Ib0rJeV>g&vv*g7_*+R+cBc z(7pR}!Rq`V?RoN_*6%d5Je^fxTUwR6%O|5e?e?zYnjL?-yWYN8$aVbcreDF647X~j z?-pHDKFxI7)q+dkPH*Rbe!S>=Y2N7~%~|cO>%87;Z+S57(t<6Vyt>iXqPW}-+*`0@ z*?|{tACxXw(a*JT)~98;%k|FR-BDc9$z*JP^;W#kwb-H;PnSLEu4!vdW?icJT_9S^ zBFIyvtLou)QPa|UH;-ta7yR#j3w>882W5(_W zbpJG;+Yn+o`EJbnr8R4(uU&gG->=|Q&0L3f%cT;#quz0*a+ln?vy;91-L|=Fr%45z zyFB#)Pm`#psrgjVf1j7=N;S7t={a3ClbgCbR?Vk$Q+IH9X3j#xE7u$=FPyBd^yJJh z&ib;sG5m+pZ>!)6c1e+Z**~jRJYxObvE5JM_K*C-tN(8H-}}yG_MMrZbMIB(YMYz6 z#NCT)l90&qO-r9l5I#}7ta|yBW~=aSsr2Su{l4F(YoD6gs`Z%9F{I*ixajdiWx0V~ z92t#!JtFULc=|65F1=~HTJMn~!}F<($r4{5?Yuc(yZrC7y{pp;y8cQAt=V?gHNCBq zbJCL^!YbQkc5FB$wyavz>ed|T@D|xS#|pkyK7KttUd{Tv+?JAxwYGBS%}PQPzpc}G zpXluo6n1LcuGXA;^P3h;RWAx!v&7%AC{B9gl`iwH=PEya{I+IV9~XJQQEZ3)y{pT0 zr95|Ji%SH}j%qZXlVh>$PL$i<&RjYOt*?ekA7zW)qdHM?VX)vmg& z$vQoc|IDmJH6!MgPLq~+>MqR+a`2MPJ!G(|<&DuNZuY6^%qDXeElr+QIY(Y_^7(f` zjjvZKT7%AQp8(rgjJBd?aBYu_w-%)4~$5woRhtwWYw zxv8+Ad2XLZ)#iCy7hOEmCm;EAr;*&0rnn-TipC)6x7B8np5D3J#OHQOPg}e4fOgcC zqNOXQ-LsA`Ir_cb+%@a0ddiiFxet8OuGda$%bg_ec{r~0)(WF-hpvdWGfkerA-(N! zI`12?KE8reN0;mU>XS-3Ah>W@@TokV5L?A3TaIMB)Y8n|clC(D|#q6EA)>zm*I#*ZgY(AHd$0V*Lif!Lldgd}7TD!vS?Fxr40WC{888sPftKh45D_MBsm#!<8+ID-Z?7EPZay3$k zoxK*1{+#@BeEL?+K=lo^8L9W*=V@w$i7enZ_1}9d`jPGHcI_Rmek*4m&9+;ZbpDpg znYtTyq%&i#Z2oXn*0%Yef6EkAUtLy5Pfg)}T8_0VH$A=eKy|T1d__X9|d3ZNEXHA*c(lsyo?T5D$B(_B-EwYKo;4wO#smQxj zfn|yMG&Y9+3>%*9P>QL%mES(0Wbwu)r?%fIY1_N|)|`Ts$8KxqI{uiusF9PgA}F|r zW&N}_G9LQB+-zou|5ZQQ$*bRGzSn)pv}4P*>$n#A&8iNLo-7f0GU`s-5qIy5BD<%W zLILe}gO3I0?TA@+a>-JU*Egb!?n+q;-rn_!Jy6Pan^wrvcgd@R60MdCEYhB^Wm?at$6zvP``74DYo(Yz?LJ+r%RVqbH?q-~=n?m>ByYAVxgzLdx?zVc~i0DObuaIw{cBb zB-V0wpYQePr?*23V_tPET>Zq?m+5|qM&GhoMZsd$RWhX$*33J2&Ts4aFXn-BG#;&$ zOFpT)dy%{R$?dJW*42@leGA2}oN->Wvvk_Fq-D{MTsDesdUj*s^GVZXcv|uUPHpa* zd%tAu;vkPLr*|7HkKK6Q_mrUbDz}r2+oidzJ?@z8+Soktyu}HL3XcO{FP>X~Ap>07~&58-KQ>|pK-$`v#bBosc+`+T&){M$Ummln!#5L#s z`u2N1yTbi5w!XX@t9bhDp&ae6`yQHZUurP@=I&FuKUaFiOnAMxXh!<0KAXokJ%i>1 zP1}^WCw*Z3X*1Zndq*vhnmgevPkv-NYrnmCwZ19n_KSUF)iwm&?h; z!Fk8c&)=%|md)%Pndy9~v%j9rDq@;l_I^eB`68>tQ+Xj}GlSpjY`GMdxmE0fQ|J~} zCd<$zhLOr9eqx!TY+&#(4j&#ZmE>3LYNs6#QMSbbFW7WXWgTe5N}mP2RAraJ$8m$yXIx z%I>khtXAm^Sa5RAUel7iFL~EEC(BLcO5QFm5xr#F>sF4OGXI84!CNXXFUh^L_gWak zV&*3+V+y#M)F(aXT6FXIt=RN{^C90JY<|97*0XTBm6qZj`HmTv=2rT<^V%@4cr$H| zPM*xq%ZKg!?-*p=(#_m-GT2S{!knmgLL#qURt2fU%s} zMuo9~L2lJqSEfBS91nNyh}CO5uY4}wIO+V1{dV&R*$$Qm9^$bcyNld zCW|<%dtM;kR?fk_^~?r~KjBe(H*C>MJ|YskjB|3`{@3#vJ?$fVlrx^jefiE@qBiSN zRkxdK)>|vK)q1NwJiYW$uV!Xe;eu0L^J|apo_9u7;oZ~5o`ldQcO5RnQ~eXdq})&5 zZu_P8?(Dbga^LlyT)nya`rJG3H>caI%)NbQ`@-z#cWc%Q#s*i1c>GY8p2U$q_sPaX zoNI4Jnyuc<6Onj3_l=>{Pt$2jHs;st=QNto?vz@lH&u7jhe*#rWl7WglrK!1&+nSz z>>}O~BX{wR_e8e5h2j;Lbx)QqOTDEpw007=9)nD(-?752YnQ(D49-$zS*p^rMBw0; z%>@hR`sQ3Uc)LBL|K^jUvxQWupIlq8UCE}@J@dV(_rg{S$*2h-0iNvhvTiWXH_+f* zk#$qMsp~?W=N`LDvy{xH@Alji^NwR{)Y`sS!SY#$H~u+(DdWK5SD|}l*M&(ZdNNEf zDx5VtszUzoYkNLD8ST!TX;0f;q^`=Sd#L!*C}z@9&F3{eCvL3{3Es^va^X6|+BdJ)@>k@A_*dVtYt=NX@OP_x-9F!gal3p~asP^4P50`S zMV~C@(>yA&MD5<11int0l_64_85v5L_6A0-hu-qbwL`TCU$0iG}ChxuuzCd>(`+)#0|dE&gKseXIb&4{C}%<<`c&I;94T&JWtY<5;#|9bx1bkoMJ2@+ptofQEe zIgb65OE%D1@b6TY9naC*@ z`g>$%8cXZDrG2mMWIR5bWywm;$|F-%_9J1l?MrFJKJAW6@)hz@0qcq{z&E>m5W7NgZa)+yZZL6EpIu?o~!2q zG7qY3zs0Jc$f$L9O3QMI1FPbvIcHtGK20`wd1*-a^32&^cfFOeS-#Nf3uo>L=OU@N z<55AgRah4~EcLXxiZu`nt9I#0&>lYWxxMXTD? z+5fttf>Yh1FL7Pkz~vhG?VhWZ&znsf{Me1>bDgkIzW!>Rdj08Z@2*d7=QsUw z+il9W>^_CN>X}EX*OwdUnB5Gx_Bm)B|DH|Z&(^NpvVN1->D7FyTl6cvnvYLjKaFqY z)j!eOKNNS)THU;BUD={$quN!U4_iOJ^vLK*%0fTqDMwm0pWV@&x@)>Qi-w{nrz*En z(00e=!W%@^$7yrLvB%F_t*>#;P`h!D_Rj1T(^T)hOZ;)|b?8=owmt7^rZfAPEuGV% zvesE$);J(eD0{v33>nwvMSB)ilrM?f7Qc3#Z)4qs7xSKYm$XeWKQi~ZR@l*%TCChG z3U33X`@N!vBFMWUQ_Yt|9H=g-$`kqMNnwiR{T%EGKC~T^#gG{Tc z!-JmS`5BzYw4aM}R4jh#de~pR`agrfkMu<*DtoyXZk1cLBQCIRzM;7H5w~@lRnpGX^`F7n!;xjhirndk_P=nSyx@D+WxbjV!+Eoff^*#ZnqHr`TF_$F z(zDVl@CgIMB!9=4_(S(~-l=5GlPp{n`{l#6k1H)=vqMkue)c>&(c1scq-ES4(qixP zUudf6zgnrjLwTYBzgDgH)7o`46W;&29d-MMf7+$#J9kx;WQUa8xx3q~?d>tES>ETq zwKn~V4{_Mrsj2a{L(!3G>H1y!vj3iVDeoE`S7dyq^!&DM%(Hq6zFNJMvb)izwl}Fb zl+C!*Ol98;*_}a~Z?K;%PBUQpm(Fr!qRA)ES6vz_2eu5Re(7^?%|(Z7WlK92sUcCO-=6*5(RIi-^B{qDJXRJs*+E&qVZS5m=rX9wIt8>>WpXfU`z2VI2mYsUMjY&b#`5T-9!ltS)h40~W zHocsxzJt+$L1zBWz>?eAYEQbhp9*jOyyO0%?6&UBvA4FyMNJlaoiXE;`Iaj$)-Ao} z-TB__NrQXi3UjWCQj#xFbezsvQ5mTzBaRV@A$t zlMb4TKhraNZup{U`t9?2kxHxY8B}T&W_?_>BXP~64~Lx#-OMImxM1>mS9(b7oL-^3 z#R&_&XI*2=efv-|*E7gNGuM)B_w;<_yN@z%81MMHGNWUT>f!UM{u#bSSAA{gF`jKtDwiCqckO$hw)p0*CbuWrT%O7b z=^{S-Az>RHJmHVBcAUdM=g(I&-l@;+PJLSL)H{=CMO4^B+^+#nRtHoIi4*8!Ub^@%?kHW}51&dTaskrVuG^P6qI?{Jz+ho?XP zC^@NJuKSjHk#*Rma`T-w#~v72_H-3$fAM7AZD+!EN^@K6yNh|#^S8(76)Jh{vRiRM zVxl5PQS`y3yO!PZv@A^AHYbwv(#)#*$&L+%aHf=n$b;qNiTIIf&y|p)fzU++p?56CgA2&BT#cyVw)l$7r zc{&}OiT0eAmCI8E>`s@l@z-m0%L-{}nrL23Ka!TCetV*vb7txESrJh(PHjO;RtSl3 zC^YeLn7;KocqjNo`SS^)3U^)2Z|YC$b% z%~WU-;bbXMo1S;xaeiOJSJw({g_Py;vXy#`^J=Yrt>E1foV)60`o2Tv(z>@)52@#U zN&4f-QMvEt^pMkM-#IE*$>!#+v<+IKslvpuT<{XojW;4V&K<-NEJTH&Xb(TvS$qbE zZT)Pkomv@GUVgeZo;1-zxU&zt5L>_4&JzUq?UveiL%-)_IXqVjmiOyji=8wD>-TBDxO zb>P+np#@E1A|h*V?k@;$`!$L6-rbVRr*Bv9*}fuWzf{SLOOuOpmqog4OEG#R+w&?q zaYr+w#JlfWU6~EC_`Zz!6wXE%-jys`~^L4Vh-_72c#c^$R)w7tyqfJMq z$=rHU>Xzr_eOqLSk(9OPo5ldnz$H7T9`(&!@#c@zCKBfJGEzYL;r8 zES*_+&-u-_*;hoS-SP7ByEJ!)$m6DX=X{3Jx@Fg5EVI(q&$)W&ZPwm2VI(@&JeuIOmFs%T7K`O(uBktJ}=!>nO>dn&fBte z?Q}+e6HRR|5s~?xDolKp*L`2wN-x`DHm7k($<(>svGZ=6NYZg*H#iWp> zLLo~vy#loY)%I=tsr@0|za#KrWd5hM+nzgL%=zvcTe0KTtcb8D8V*x6PwZ>zh%&l( zYk|ld0gg3~cO81XX>E2~rAz$P6**>^<>^mvUR-+BPIqN@#ID0ht{bck1Ev(MBZhs|hlAa@+ZYk!S zow}oM|ITgKj_wdi={;; zzml9Vvv21{xr@bl9QuolqEmJqn0;fd@4_uBHFB$kLKb@F)c8G4{T%YLJ8sG&xn0x6 zJH)zoY>WLWHgm(Rx9fdeoc?5*y~y<6Rd|z6ol*G0vu9!a8Jhwg?ee>LV4YZGLgd>E zUuKEi?R&2FRkBFUW74PRCsLoKcush|PV=PSjyuyQE#0?tMQgFjQj3(!|9opSE=*2* zl`Fg?F7~&-d*N#4>9)>AlR7wbHJP+kpT~aASR%l!tGrpllXp_fqhL>s{|o^}1=`(J z-91tZjg!v5$=RlB$z*#^OCpE${(RZhF9J2V-IGovbFwObKDAw4(^LFt*dL*XO%~~i zJ30$>*WBBxdM|C^Ug=6T%ek6|9(U$?If*P$R^$xy^5m3cxH>Vw>4C+~$sfZjc~uKhmckua%1M*FQ(qe^S*JI{kG0vt<{9_!wJ;rul4Jpae=Q{Lg( za|6pRSfxjv>s?lAvFXreC#zU7Pr(_{bp>g=je_zzYcry*aL3LHY}?S{em%pR_Ep0!AB%TC*p+0P1phnwsv6ENV=SRPL?Y1Kgk24ykJrTcC$tTHY z(Xv6Hg)^-4(SG5a4Lj1;ek~VGzL)SZ-2coz|8}*@5>A(2eYXr}o66zpTol`PL3Yxl z-|H=wy(_lquCxfaB1J`}?p?04sxcharXjg0S2Q@>BUlDa2g zs?B3huX}M%t(LCzQZJkTsrn(`^!Zi~GcLY7d$7~6=2pndphvF#s;)s2os!SR&X~>7 zvYy@7c4^^>9>%b@+noM0Bv04>Q}o!bFX^?F+S*4VC(8Atvu^+0^>Edew@r60Z%%N_ zJaOsmN9D!mBeIKE+4de?wJxf4J&D!}7dY*WOq6rfpgJ z_l(|sNwF7>H@p*9EG(W=GJRH^pU|o598H&VNtJ3Jl$2z=zLcEoF1l=VKxRk$yW*I< zo0=PLUzlC^lRLQZl>4GfTmelXOITLA%(UD3U^%}B*w$BsS8r+-pNs?j560@eQEUh9v4`fmrUyI20H6+WtR`@<^oz9+uOX54PPdS#9 zEaq#<7_2|5D{8U(*4wg9PIo#!ud@-oZPpa>(kbL}bjWlWr(>t;FW>Qb_-<3;N-O8M z%+r^H6jnVtJ?-_DO3fmz*kIQ$)2=O8c6jYt)@02)t?HI6q0yf>-Q0WAR?n3_zE1RY zZE(@WZMNxYq0jCtnYLi|lu&ystwrurW=@>#+!eiX%9UjuB@B~WOC$D&17mF{?6>_m|y=nfVO~#YeQE_?vTWhoHJ3XaC78EToJh#-q_x!e|+EO8RF^i-x zuU*%!Q+^rhyZ_L4ugkLLGmhT;Xl=UtIgf(AzUj>^kG?O~yw$qe!c%d3`<#pmF(JhP zI~V5b#3f|j^f_Ael*`#@p-=F{3qL~AXBH+NSzehNd5}*rnVn&B3FnV*7biXr)tmIG z`_iveAmn(d)%ZV$9cHl$@KD=lW0CYrfDA=NdDJ^OPB&j$g`MFj0?X*yu!taof)MV_6 zNnGWj*HddAhlBt7Nw4jn(9 z9gk$96_2of^9s%i;`A$#lOBC)DOw%bzGKUciU*)wVeSo z3y+JmEX>=oL}jXqs0x$2$!FO+FaLa5@mw%}a>=>IE4%t`MGLJBn^_#8w`3*bv714c zcQA2E${a9_G}$flL&Lg%(z&HuGPM3?t&93xxny$L!Th78wpDt=%whJzooMjzYSRJ%UA!5s~MK_}_r*Ta# zpIBIXY{KR9RqkhRSNba~ln(u>%FeZK+q@jRuw7xftx`?@8J4Wy=5cy++`ENA(JB^C z*Lvt5%b76gai7sExs1kk0h!}3vQ|8>JLVbZckAEdb*0u?VUydJtgl*VwanzkCHc@p zMiWz$?sP0NpS^TJ|4QLKc4gbPZWE~XS-A7OdYzuKB*>dJYqikGt-cM=g0IXPj8#okN0)=zb7dRLX&Zja4~EO_(n_V2K;^%2bzL`kK)^-)ErdJMbk6M1c4Bi*YbMR7e{`WemySdldc*K*V<>tzIO_obe zJr>KSGQn14?g@q!GCbv->zLm3XT+=CP0WATd)xWd?WYrs-`z3Wk}+NNxc=GvZ5?lq zX1{e_nR|TE8sAKT)gH+)o=e#p&o|?api2W1HgE)4EpA=y#gaBKK)C z=jDs)PTu+a$`@19tv1^&CeLB^x3PK@xBtrK9n<9_GPiAc)2nZ$ETEuy#BN)_)2*Fc z+NE1X_Hg&#79L$}f3Slw)=?@X2Z4V{R|} zj;3XwmH0bDajWS*qZrGG;Lcjj!>S_v>V8J?xu^ELV$D33Z;)?x@h;r>&N{m|H)>Nnum0QW#bz<;(Gy-J8=Sfs zoax~+ebTfk%e_zVG6jhh8BfSOE4I(|S8$`wi@BOBFCOu(@$T(J0c-{4#fp-OBrb|!O zoVUX%I%jIGrngt_F`;-Z4zIZff2dq}-Dq_>u#msmN0*PtUu}oko*GUQ5xJi6 zSu--qz)xsTYs-@cwC`|vp^*_U< zu(}!ce>|X^0Lfob7WKc<9!>wSe${@Bi(j@B{Ac)b_Ne~D_|Uq*HMIuyKPEgn|33Ra z!;-}>oBuN$X&0-nj{mF5IDhHl_Wuma@-*wQ*?9ai`+tT`KAnHx_W$y-8?|pVJcmkp z5$T`Of8pW9KlM|WK34DCb?AKV#yy`e3m5IbTPpm?c{baz+DkKD7xoExMg=UYWa2oc zzmK&**{jn2#fe+Wp7*!rUQ#Jp%31cGp>CqBgUTc(=|CO>%lWQtw>{sptyr%yf02C3 zr|NoNuPbvzuCKkF-*0pJTuh=G*ToGgO&5YX3Vy{Lb7Ql~`ud<!yvF(T!z#vAU-K4ToKVu@S*=%IefD74_voHeQZCyk=TBAM z%$j{zGw6l~_oUTC9>v8?Nph4r&dJTg)Hq3iCkN->&u^KGxwd^d(h>^@3%ft z=|87z&C|N|Q*T1Fm*rY@n~nZ|vaiXwY`(2yTv2&zbIzPcb9TllM~apg3Cqq1&i)+m zI@Nd1q@}Gw6XtnZuE?2m`;M>l-l-lpe|)T+$ab3T^pZQ*zw;L<#=f7t<=17&HsuqQ z$0j}2_0%l9I$6qVH{;7Crp;%aX6DU{n3Z>N)z@t^rZ3i8^5VAar$5tY)o%U0;Ofd_ zvnSk6sM3s@s>muC_=N9m*O$yEvV7umO4fY(tv_#N;Zx?S;JllW4_(imP3nFz0< zlJ1ul9U60DKhM28!9C%DvdwpupP69R-VP1`m`OJ)c<4GC$g{`i|r2xeb2B=T=pV%Zip?UwLuU7u{3$MNh7eyj&VG zEhgj6%tU@$`6RzTD*7444_10wta{yT7f|DT(Wv5N-lo}xGnYL&8aB!MCYtDu^J@MJKbGmy1_0PzZ zJ-QRV-E8VoJ&{(O9v$Wr&qYOdeLNriVPEKB|JU1VzntF`6QemXdGoitm_@T$eovBm zV;wqe9-l+0Tw}oswm$ZZwG(SDij`C-@40yT(9T~6pGM6MU7qvZSNHJD^60s*15RIF zb9>RfBu$Mf8}_udNB4yYwX|${?5fQf73(x9__WEv+D|9@moADe_1SBv_Bi9ScFvA~ z*-;Wx<+o&cJypHrwS6U5{}z_zlI$wXvnm()Enum5w8?hos=m8Vc@uWtS#&cw^Y`*y z=G<#{v1lAwpyg6o$aCb3=lK^NiTtAF?=wAqM6C4Z{u+BeICA;1eJiKNz7h8f^KQD~ zcI<9t>qEVzme$N`HK&)Qym{+oT{h- zc(aO=I)428Q~CSO-%`=*du%s;WU?{S+pJ%3XZwlIJ1*sXj}-gKyFO`xLuspOb;#5S z!E*%PEZ_abviPm>gM&N0w(nPMm(ELZxL9X3WfJq+_6d(&Gc1CtT{Kyiu&OLq+NrzS zo?UmJ--*kA0{3LDDEl$T;o3)?%chS~V%IW7>3?ro82r1^ce~=bv)Y<5+Ye27$)d5l ztIbB%<~@JO;%T=<7vFhwC)QGP<+g9PNRj=$sbySn@vI+}-e22QzkufSyLbdh7VN@aXWEB1OH`)8i{R*>(>cd5Wz zcXGZ}f9VW2&lPjK9ewt$(?Yj-PdB+pEWLWDck}s6LXS>O=;WQsa^+`YN#CW5R{H)0 zpFN|#xJ_wEx|Q>BqL{W@PjxHvbHTeF(f;#SnR(t? zI4fb-Pupm<)y@%%?i}8g?)gf5tIx4_X)dql{O))ga_P+VI4v*pJ&PU$g~d2}8BNLK zUij#hZ1iDU^Hup$y=LJRdve3Jzuh(SNm)STB_maX%jX?}dr!q^dyQTIaBfy@jFIY1;*T zw*th3C!Uu%tK9kI@SzuG({u}MKN>ypy!hO0-dslmzrJNs!9LsW%)7kB*)#L#0y7ce ztu9F`Vy)M2jq7^MxASsTbyr^8SEbVAz_?5O&P_}2BrWzi5Intg+hxs3tz~C>rcIe~ z^5%_i)pNX7d(|u`JylWkWp=%+#7?&z=eM{@?J8PxZO68q>yJcVTCmeHFkH;Sxp%2V zjAfBPm}F4-8k>tzicvMP@(G`+AEr&eRBRF>E&cB1^2{B-{Cp~l<0i;#Gkos4t!vt% zBAbu@8N43~1fRd?C-$O_@1>ml;r*M_tG=7w^;HyFH|gE?O5-Od3we~RxaQSnMclfa z;c@VZkoMdXb;%tk*Y2pQXwAQNN#*pW4~s6YIJ!x8oyxRz=ALn{wtbm?spI8@2M!&V zPxQ)cSh{vmL#^#p^G{hjZ?89>XK?4sbdl&s#(Z%PIBvD-ITfE5ne7ttR_|c$igP&u zy6;jsJZ=RQJ(5+62z~ryV|oF5TR3;^uB&R7bq#Z;iDWLDH1oXqEe8jOOg@2yw^nYt zB-XlG%c<>wqvf*K>nE%8uAh}^75CIWY}fJUQ#_}XntU|M&Y!S6YNGPiw{kgCmb{5n z$dz~*b8(UBdG0M|?rMs+ZI`%Uv8&|l!Mg>|(^yZ{UT~=O+gfS^hO{!KLfk^BNzO&G(&YUM;&WZDr9@F4g{UW9C z8#_KFFWuJM$iQdH3MZsB`9$Hb;)^n^*T{7$B$2Dp*Ot;t;T3wKM_;10c$aiyBg+3Rrw!UuhcfRe( zH&IhXqx*HVw;nk7#jny!$AdxQshidkw^^T-Do+>x5r6%w#f~}u8GhAmexH46_Sg7_ z^&j#J|Lk{&j#w-j^!wJQWq-qe#Q%}LQ?Gwu*{B_)Qwv{bN=N_o_BTfiIRRMl}cyNOPS$QQa3vt z*`KQAzSmPI?Aj&c_Ml${Q~TOC7iOx+6dhoQJo(Z`>bB?Yug7NY%8XuAZ+$01SCmJn zHAPd4`O1RHAA>&`Z=WA^sDbO8<&O(SX7Bp5zKZ+VuDn zzxgiHbo<>eEtS;BS8PJ&hwds|Yu{M#R$%^jVc(sZMR!h4c^D;{TiL!Suh@F}))QwY z@0k1BBh1lqdfMg&%MkUWf-zG|Kc76@daKn}uXNY5dpE_??|#l+(`NH>_mqihIpyDU z$~N9D)eM>$7WksEhbN>t=EHWsLdMnQyNce2-4t82-ehLVZjWszGqwCg8s3yHjOJk0 zJZH%lY9M=cUd+y`)eAy5{h4i%sAjv(*x=oT$n6JxH$FMI$E*L{6oW^1K3DD*vw6E| zd%UXNJNE6>Z>~;}_gc>>ZuDOF#r5lfRh_j>U()qAU6pOq=U@7}Ng`+G)`rI?y#6wn ztza??=c|74%JFFQC&~C%dF(H8gTCC{bo3tYq0+17Q)6_?GX<7z)^PO+S~f2;GuqKd zLDAEb(P6d1lS|t5lh<><-PLt>Wm42~)z{@ITiilVIW4mKohvp`^%>XcynWI^lW(n5 zjZmK(xg{m=M$D8a{Hl6_(X)3N9r6Bjxv-h-*8SYN84tI+w2URvH~n1R_pLkH zJB4XZ0@oDf<|yOOW;;Hta>|>uW_#Mwt(GUnJ^9W|NSUhnTvXLtZ#vhs#rw zx0yUSuGF5`C&R(4DR4bFvd-&4xFol=y zE6M}^v>uGNJg`sRdVTnj)Pr;Kx+kem^F8{X!T9rg6M;Wp-0t42JU^S^eD3zTbCE}t zCO>(7Sp7}m8s6LQ3}?1xZ;4W}mwT?b(s0H$(HU8pPuA%2DXewh!lLnfrfE8Vtjz9J zfhuD8Y$Yz|WVat?F)nOROTCt2wxeA9#*FE=YV4-BOwqBvRko5_`|hOT$>(N@KDl}5 z`UvcJ`+3vl2+#Bw$RJ&Ol??RG)Z%dRni6z7!!xMkPRbL; zE7jS`)4kLmw4Z!Yoo(7+2(!SZk6SIu!;IK)hgwq>y`dObI?Zf?5y)Y~m9rc2K~_ z&0EhdY*C-(5O%4+xNE8YJojHat^981Y{`sftTUZ=>Gs>h^X`PMdoC+(c3ow9@~+dr zgAMyH-j0Y0?sr+LHmUYM!@|&uH+y&7KIz?KHC?)ZX_5$62*fEO}l+Qpk;}=?GxeC7Aw!jFKFu0Sg6MDmAC(% zLgs1J;{kVLqYKtfoI6u7(=lq&<=NXEZ3azP94$G3}+gO#Ae(v(iiCWjT<*gT!(pSu}_@2;iEiNXo zJ=%M<)0BqCot}PAn;rc=WnJG@-5!2V@I|HJ)TQ~nxASv1ygljbk@e)vvAFr{TZ6=6 z(xRdx`7C!QO){fsw-R3n=IrCW{nQLRk_>9 zsG;zd^5zK_@6B1h;+*5*8CS|!ovNP9{=4T$-=_8y&J5jcYyODpTd-d}wR7%ywYwP= z(^slRl`NaF`F5UFr+IbS!d`vhMbWo6x^7=|N6I_VGiS%4bIh}y_{ydxv`wirD^z*0 zIMbc~%NjPh=^1IYUH6Neq-R`-IA`+a%AOssa``PDP1q!I>7<9kiWRMl^37{(Z*BUv z@rL*c*OR*6HePaeGx3*rBXJ2RCmv^l{3os zZiPH4d!k~tC%2$1Z?QF3gI(t{-r{W?pF*ykEw~liALh1U^U8^bZu|9Yk8wUVDd}ut zc*wpfJ2z_QPTgwQc4gbQH4F3lB1Dr4irZ$*_g~!cIq#1BK<4qkK6@l zZSs@VM}C*J_b;7swK(73`@%+@th(pbK~vLaoy_z%6j-`|r&4x)npazZKoe7AkT=`P zPafB&%SlGR`DV+To%dYM_v|x;lUF(>Tv1lcmG`glJ9zEdG>@q0%%zJfH6koknjg-s zTq%E9_`&H*-*^8?{Q1Ondce`ECyFl1G>JUU+p@*x8iV@QTu)8S69LL5vs=S?g-ai9 zo4(`2g9R_c-+Z{5%G=7aNIYrYQH%Ix9Bvn!_9{4XJ)iabYNhe(?CEkduix6I!~MlG zI5|ds$L!@PSHdo)yO=Ln#+m9>xOGo^_?A6V8dDZ5J9Q~!_3D%F-D7vu9+VYaxc*yo z>9Xeu8;@-F>CLaOmEV@h$X%+<;r8yLr=IW@nKjSVRi>Z+qOjre{fNkC3^sqXFD%nd zU1V}^|K{0zt6JWyP(5N3ofmxZ+?PMXdzY%lY^qEbRay8^)+%{!)v76#+65L*=4uxF z{cz_$!<@h`s|(D(tSH{hZvR}Q7Ma7k)iq?l*LLQ5 zukG^pMbG~{Dv!)z%nc0HzqIzi{Yz_)e?MCMuh1Qt;}9JZ>WyOAsMVAPxc%N&d-W4` zI&8bYm37yBy+L9#*72mOlJDu1o|^B|u&M~354=cQfMAz9Uz zCAosP-(K`gzd+`jXbs~lnHAic^6bldm3PN1y!pU$*PRsA855;~&s(hPaB}ms7u9iB zX$-J4eR+D@>W9k~ZM@kTa{RGst{La)*4~ueI}z(w!N)lLb%boOqS%t7~)8NNB2} z15e&JiJUy{rXq{LfR%`0RH}cm+HY-L1kj zCq;bY`0&O)c`ZI!=HduHY- z#i(T7C@YuWA2UTXaoU-cd_Qkz^NQLmn#uD%I<|S0!KHHElQ-FSSL%E$`@XuOySD0J zLeJjFWnYgrpOfCraOG>vGPkl@k7ju@<|c0AC@=04*eWzfUpK= zlmFhkU$o=QE)laZFW?=*W6pt0jkz*B5T@S z#Q96TzJGV!Gn0K&w{E$!!<_B?gfxqtWo9#*cD&kt%)3K7IMthry}~_avBi;yMZfxw z{1sIXizx{X|M6;P)Y`RopMCz-EjZ=%nx}q$7#2L%X0<#ap~B#(RjMvvGHuc&;jM39 zeU}x}E=fIAm7Vog`pxAzZ*R{%uF$~dY13}?ooaPgsq(6F1od6{B+5M@{!P5DQ0njba&I|rIxg9LW7{v0y6;Jv=Y)t&V6N_a@4jAZ z-IjQkt)=UGJg*6TX`8dfIqSL78@-LH?`Le2YrCwubqd?%wwXbEd~aJ7tpg_cnt#kc z`MP7*xv%S0BV@O7NbNO_u54ebDOWJ%#;hc^H!5#5b|`w=*2=DWRvEJHP*_RAzFRRf z-zDj7wE40nPO$qV-?V?{(~7rW?+IJ>)o)IfPUo3d+*yxZENY*4=lX7axYyyKy==f_ z3&Ax{3itkvna$g9IBdD!Qnw``lizi8=y-0Ic2D1|xYSDIrS)&y)%L+}ZLNB4{h4O! zH{)X1Y}du^nU+ps^DpMcyjl9-O!S%GQTL67KJ8W#-D5GwYRiiC3>pbs3MF-$ABoMo za4R(G(3>Ya!#=zzlm2d`Jb7O2@w?u>s>^0_MYnoKIdHPCHGP?9^x|!z#9rpR8F|Kq zv71t&r>=6*6p;6E*8hCkUr{SjwPEVgY(^D}dz^QS8RNN3?=Ei;`zx8bHEPNI-0L&K z+uml*OFojjZJo!IB(tAR+m>p0dWCM5l$pe?DDa4#amUi57T=}+Ex5d^j^*{)V-96! z^xo-i%YAt{Tsu4AWbT%!HcvWVsd{>qnJxLFbd#%J;iY_SRr;MTclj1?29;?OOpn+qJiYZawdkj8r&!C8n58FdCr3;Yi@fz{!_;@YD}JebkyF|! zb^D;4>PwDUZpZ5$hRwS&aq1Dy?-6B^e4DmK_wBW|oO?NCtEl1U{hOUaA|!A0-Yl$M zaXrrSPyC+Dwl8n8OWQu2o@P-HcI#bY>qgZTlP)y1%ckC6X|jEmgLL^y&J#ht{=Cgw zj-KM06rz6omW;Q`x0Q!t0vS|3KUw5);PsiHSpAi`RohNW{bxw8%H#j;_a@oWd7fileb5$|21=~YmIApkfF%Y zzNp$v?;^pQBKsEgye+f#Qqg!26C>PQ=-TzQZqDJ4kyoPHo>n%CJ`1^YqwVwYjap6( zK_ZWYAlQy^q4?1${|*{cOhc zs`3D@t+&7Ou6Mb+&fuAnN{FTIvRuJbYu%qb9^tch-#8JSarjgqcdz2KU-EI8+fC<9 z-2Kw6)b+cc)?3jNZLgCjw5cEQY7==<9@ft6$Kb)ud1ua36&;nXcj}Wbv@c&<7FMx$ zP1MB1!(!1>D#9erMLqncIQ39!o9>FX9jBZGr_D_~yL8)?rlwmSi}oE(-t*2t-@o9t z*K5yPRenq6uMFkW7TB`tb}9d<+D!{@S{fEkn)X+;%3nm}OBk=iySnHatIZLQdI76R&kM~f~`Wu69ZPypY(6))bzab`PZs8-Q0Fm+;3&z z{g&573R|CN1_vdb=z8MmQ7Syo>9XQ<0kZ|$rd{KjnpZQSJKR6+@hfTBegCdVx3H}< zjF>Uwy2R>k)d`P;7Ti9o&y{&`hpO*tF0V$G;G-@TxeM0pF}i3L%e?H$ueIAWI@(Un z)8G^7`y}loFe!9rv_OlZ^oN#hQx-DC2On>M_N@C~|Nb*qb7862ik4|S-L9)bp0zZ$ zb=}JJmj0{q%hKQ8qv*V05c8#3UroEzR$QL$YifIaR&QzB7xig}8VWTES-CV-1o$|Q zIewFBoBg6vqt^VX$JNuW_jg>aE4!Wk@M$aO*0v??G0{tIuPoixboF`OraNpQuMX!f z3krU*Qs3$|?>mvVi~p>*@Lv69)fJxoMxuLno4)$=X6k;fWL?v&!X-6`B+ zclhw;piA5Cv2q1Xcogut>Qnhe^O>8|UH9D24bl@kA@F2p&Va?jd zCtkVa6#7BNDd_fDn_B`cn_uZM+!j3QPGHs7N(~RT;qh|lQn#UKT_vqfjYvpkY$FJNnN}J&}alVkT zK)TuWd5YV0-*|-Q>^Og-@8z9`n!(xu96>>DU)F@pRey4M!IyaxCoh__^ZvRGX)i0R zT)&>5(eP`LYs^-&SFwrPrcD3tTNt~@z-iL0NkSWUoUkZ7w5>#VR$I#5+!bF_kB6L2 zOZoYI>*2SYSyqy{yo*%IBy$%efIgdz0*K3^KRi0539t`1hz44TmK(s?Fx72kv3YyYgW$X=jR^nUt7 z)rQmGeq5Y2S&N0y@MfXSOU^u(lRC#7y%n@K+V zPIn3i|1E`xlo+LTce(Do&fAh~G+BD9-xZrBitnzRaL)AhtT3N;W!c3i8#6aMPk2(N z`TFpRsfF#u-79`q7pXgynfMz!1>7!}EP6y@Y0gT1gGV8vd;SJ$6zW~lO>+4e`=WE2 zY1VAE?yK8htN7|1Tfghh+Ii1*%iYW`3=Z--Ic?JKj?jHkAsq|0y@>RF`$H3T~V>%WKM_IhQ8;tWIs1=o585E~8I2 z%J#$Szsbp$!}eX(seJqB(HV`ui#BhSU3|)`TtgWDD{t@)xGFw z$b4;k)jh?ZCO*vg&+z%w%|Cmqe&zg`wm)V%w|!mN{imxgdI?zO6|cX!;_t67QjX7e z*6+4&TOyi%IsM7jUr%;K{{Fn}KZCA2DmQF?()>;F@6O70)t#*0ZNeJ)<>pV_x}ADr zb${OOKOKm|3tfI=`J3s#H@ic$FoxBd)p^IS^KPBL-#Y)(6%^jp%x{{%RsX%Y2+`sY zI^TExr0cIIJxqUp?)IOp@+iEhT8QmsU@aF$ojk-t`ShODU&?kqcNC{423(tVH`c`?4(mlG)T-J>%WxHfD zU%XaU)Z6kZXxllvlgd}4E2bYfC;YK2cUrmd7t_rl)%Oaouf6zgWk|Fo?buopoS^2ZIN@h2*!ut@cUUCLztzZdF_dj<;5= zNvH^rb2IKKUDMJ~+;xtD435@5o?~01>Gw^&mn!fvL+-ioRqZ$$ip14^h zZ9GvTvEF^T)>#jmIoi{V->wnq`6BZ(d`&>{-M}YuUdE^2hjFL$2-r@2lfJJjl=;}1 z^a*O4T5?(V+Lu-@n&QeT5*Xw`o2DzMQ5-(`+TOr`gM5z`-zwAR->S1WezjWWY~`|@ zTsvYHo&KDj=+3)(ODW%jZ&{q@MA#nq>wD)}8a*^(`f_%kYpK_(m)^TI755 z|V`H69OKm6dm-G(0pgJ zGkj)Lx}SeXg8$`jFAco{T8+M#=(1|4EVTCWP*n9g-sWd@W%u@fEqX!9dlavAKho#k zvTu8lbCK+xsK=)&uPN_1>}Rti@u*pQt;x3VNfXvpm(7}U$xYe4?Qo#drpvrW4Yz&G zCQMOeNKn<3X<#UlW14!U^+KSlh>B)+)Q)9aO1~b7yP6i1yU8ohGrzK}+BEUO9NF7; zVg|*1ZS#2*_r$#Y=IwL)?A;G%BnI}jSykW8Y>hc+Viu&zl zb3N|Oy5hO>u8+4y(T95*r>@K~yr}o6qc0|GCb#~v!X@^%ElvjeYU(`5@d|lb`PhFd zzu=DCh0~r*e-zhv)qHl0u5(3EO@!l)>m1jfDeamTATwp!;ZCDVw=SJNzviK;hWb|T zTIJ=Y?3~Numu19i3f)<`Dfh*WJIW4Qv^Ttw^SGh1YuauVi!C~ux)uu_O;~$S)#jDU zv)+s64)?O&RZkDea6By98huM6dCRj0PF@AQcm1rsU%ByeO5$UA;mAk6XBIt9ow+RX z%B7Mg-riwff8J^``CV>e|J?Bs*KT(+5w@R;FL9k$Iw;&9_4cf7YGF<0!^`VmRf>K3 zdvJHs;i^de4WC!11=&1L?&8YSZQ33g=6Q-;p~~uH(WULPTW{%36udh*aVJOdp`cW&~Weg^*QegtqZoM?|HV& zSFn!H`VqU_kLFcdWY-FRz1r?!mH3joX=bjz`_vV3)2qDm^@Qgx3c0Q6&5+Aku)=1^ z&W$XZVfGvrFOQrpJ}!N2%HGWhy-9hYzm(0s*d5sEBKGrM-sRIyalxm&7qD{_PHT93 zal?)|8uveMc{guP(q4Q2+fUXp9C5YfwNd+HxGJc5;>zq zzpVU5XJw(lZ}SO{Zsb0j@VHfZ3+vJ?3ttK_GCXKvac@#tGugDs-|KdNs)I?pv_XkK zHRBED9+h@fb&y-+FTCRp`{E~OO9MWBznc9oXl=pVyMNlXzW4AXo3Q%+TwZwi>!#TH z+OYjkHU3=Q@$lD8z5V-E$A6ld^Pge1`_C<-N`_&$Xt^&kZ5JqIIT`r1o--}eEiyxQ z`n^4eXUN6XF?e&U+U$JtX=U}K2$z;)!Ecv7U9whJwD*dFc_+7OOWGb7Fbgefe_O-F8_l07*W)$AK9L{=To{HJ;UOi*Sx$hU}L^7=1uwc@qMuo2JVlP4i zjUOD{9vo#6x>V=aq3d$j%Ud)1r9#Y9cKwRbU8w2Bb*J*HW~PTjTzs|m{jcHmE-{~G zmONXqHS09%?vNYz^>45HFk`;pqo$@O< zbLsyKe5Jl!=MGlY9y@EK6ZT!v`fjwA7h9MUo2Sf`!pEnUJezGQd$UZ|zIdO~eYL8! zAMQ<2I_434eu~2C%?>I|OOu&ZicKSnnrh~3)^C&vytK#U${nT40qe@WRsXIK|6CAy zOnSTP`g1d5?_E^9d8$xY?6+s}hL9FZ$s;>D_m9(T97#5C67ny?873<}d%S z*P2$%p4(IB7jIE}F710J=zdvsZq$r4Y3L*?n`{v@@L6ylY+Hvx2ijI;1_-{Y|yU*@b$WHfVb?O| zlewNRMGBv{x5u7&cm zc;vHAZtAOCrK7u}qAdb5FNbMPPIuLhey96;#hq;tlO?@Ahw63;-V9kL#Nm8k!HR7G zI``Gj$)3L4SEzU+MybB_TdZSg*VkF+mgnBcT=w>i!FHjud%rI}e)>egx6E)G)_K`M z!Mo!s!(RB>FMB(EuF{pW?n-Zt&db)>DCQNBq4NW01xZX=!ZtrzZ^gnR+m?!G=*S4H zn)d-9j;K#)IpWA5Wj^FJh-%H||XJ{s$HjSx3le+S|Xr-CcWc7!@AX7_Ss*yKZ&w8oTvP6*E)^A z>o47(m{tG&v1{GzH~U||tuvMTXA=H$-|2t*u0IYC;2+gB8X7}2ZOAk~^?#yy^qrmG zMcwE>OV_VX_CGsO%k|J-uDj0-wks-fx82>w9Z25^89}7^uM+1k1Z{G z>zuG#H|JJyxiDv)-CZ-(+)_>s7gjL{GH4Sl;u-@?uQTr1qN;hh_(QavhXpXJ1y6wYBld*+n^f ztgrtu+ZdBqn3(-N-CFm%%1+H2_lizrbLi{3yk)jjSKn`{|5&B_Oq^&o`-#P zqX$2-gr~PEdIpI!1XXp_T?yZ(n-M4VB3oJ9TV`)&*=)AsR!@t&zU)|Q_1Ig_DmwSX zt6Jv-$vfBnWgRl!5@Pgcxy7%mUFa$Zk1?C>)zEOL@;_SnocrtQ8pnrUyCd5dTD?8R?0?eWq9TuyhqSztuBw#Z8Ql;I8VozN)x^w4eK&Wc#rkREzLZ4Y38ny^=a7msxVRKa1 zR!j3}ik^OQt_Q)tNl!H{XV}>&zZSM0!mqGFaen@Wk_bTAN-dZS$X;GJ8(< z+4tdvYO&V?{Co4$RPT1XWca&>NamjIdcAPt&zByR)B2YcZqZaw(G9tHBVcWC%)phc_Jpnb+tds>hOB2811C&Kj*gJ=~N?Wp6OxR=5;ttS$C7u z>&FA5vo>s-J$LN4EB%yx$ZtW>zt6F=1VkRad3#&rn!C%J{4M8WPaSvATsV&*YuTG? zFZc?VeR#6g(~rQN@l zJzl=vEW&E%TAM#&vnI{tn6cKHE$L3jtNTIGU2=LW45EU*X2ynV)`jq{caH83a z2_|v|w7yyc2IG$J9)X z_^u~A*}qWlYi7ff?2zo&Y05(4W#8>0C!KEfk`D~JvUK6u#axbF4$_YLHFlrMFaNQ8 zqaZ``+j0+3)PNmeSUYU8X%-y65%zRa#S)P8AUkpS0n*!UIw6Hm%cJ zmkQ2ljuzT`SG#{pzrfR%yW{$=Pn)N4XRF@gt5sfkE3Ry-o_hCXVf1az<9{CR=!*0a zlbq5l^G$I}leOxkXS`lp)2A%k*B8FrByM(d!Ig69sf(`WFLEONBXr?4+bvYw)J-4*0Z0Stcxb^Sg>ks9p6X)&xze7*QPOw-WB`wXtAGP zuJ&6!-Bm`iwVyn1Z`HF&e#5L;WPH2x1ZSD+#pEFEy^F5aw!B^UHMhHBTVz+y#53zABp+0{^_c(Kev8l|GK)+`R%-^ zf3`Z<*6P($+nIX?SQRMzFz zIQ-4J6Yx8IX}xX$f4uj7hW`u!e;I$@YW*`;9))N04_R#>inB*OI2wZ_Cec%S=I>zR zvp3|E{|8E>{!-~}G3FPI;$|Nu4=JcSDUg=aFn_9TW9qQ1;IIt=?aOaul8*7bU5++ z(q25*717}2dK@jsi1RVmvf0`9HDq4l+GLus!+OP3?mJ7|N{i3jotHP`Ap2Im{4ZrW z_jlWDobw>mHTl9nw>>TwIO~00{Nv4v6<)UFl!ig>w$5#*OIj7Ts|W;4H9FnOx>R36 zB}ePmtqm4?6Z%(G#IF8wWq0nir*f}T=CZyhTOM%br0%Xm7q-oa`YWZACxm0Z zt}zLh-7)vj>TC12+86J;5i=wHbDV-%?)L0CDaYb|tah5+Y|T9jql@r;(WTwzzA zgxYyzO=tJGRkE!$>0s*i8(+S*?iO9CYoFRLCe7I?s%Re^ld>Quhh@dvAciNEGE(__ z3Z}Pge{Hqp>-)A{UXQb*4Hxa?ik+r>@wDNc!W@Nd%T9SkN1xZ^JSG%du!L#x47=qQ zXPpoFaJ+3-+^f6yR9en%-M(UC;x5mYE$%L*?LjFf%kFuZ=iY6aJZoY8AN|Lv+ufYg zbk?bf?$6kCen;zFy~~HMyKFDcy*Ae;bIqC5eFa{B&L*g|=;rR6np$>CZKd*7op0T) zZCCkDr)+cG9-Vt;tB{OG&%$LAnOl}_yOq0zVTz)nCMN^Kgb54`Npn}R9&B8B{ZOs? z`(xLw?pC|b(=JxNlU8|WiLP$Tq|dhn_g*qsI=4gB)nTdngn3tYDT0n>^pWx`?q(|8 z6e7JQPS)E+EOJBMOonB`& ztvq$P*!E~Iv6l9(n4qvFik^#dzwOgJx8aq>H*UVIMYqN7r*)*=ThnvvtNDzrg-*|- zlf4tn;`7f;)zsBoVzNckd2`g<_zb0*+{=5yb{4$tHs>gLFQvP&Mc3Qx#LDZ^Q)aH% zv2?~FZNG0tv!}G^KGyVESNz^=?mDK!Ckh)*DwLkd6aR2dZS&+K9Cz$4z0F$b5hTCY zJiVv8d8GzNKuANwt41fG$x{=SDwK#c#t1!_wdL?H#~6)^cHi&Ke>Z#E;e^&_*)#wC z_4yV%vwZ$xeAbugm{U~y2^Q}K>GXI<06NXQun-`Hg~^&$jtYu?ai;Y&%1waQr}%)jh~Bd zr7YoHc_6^}FSC`S7@z2eV<(o+-kh1Mn<@AxN@R;`FOx<8ZB4<&DJ&|=Tc<2pD9>K~ z>eie!PyIR{KIgB_^?x2pQpWW0Z!L~9Bv8Db$ z43}0MWIn|l7+bpccGx=WP5OIx$#ttl-s#x6((KBX*ORBqtTgO)w96Kp%GbBj{3=&!pGP!Aj8;7W6 zw$10$vX09QCSmmGn)lb=P@5waVAz)e7<3Q@e6>jjNN+7gtVIGI_r6=Ou~A zU!Sgh$v@uqLBr#bT#f*9$Ei+cm6VCmj3>S{oGox&elq{`t=mrxm+fe+{WP_G#g-@P z%U10BQra=0>7hsFR?95s9bu16yM0m3GP7ScH5V6D{iyo>)Qaiu z(^re9uUh3_X%}q2`d!aI{&|0vyYHE=IsfW+w|e&Tb-@dC_rgd%0?YeAiypElU`L*tC`*$7ZR@ zg>QPgQEFc0@gJ3ru6S&5!KZBPuhg=uCeMn(madAveateK(av&#+T&%cX&dG@4~{9$ zJ8Zl|r9mfeZcy}Hxn06( zcTj^l>r%IukEZjll?l19eV_cjSY6jW$KQlK$mRQ%#l>f~>2_yuUdvie)vZewCKrW> za5Xj=9@o22gwKe-H8U0M+Gj?D}3kr{Ki|EDbaka%GT}alU^!3jdoz>dL5d!=95K!P-cf! zRou$U+eHp-ieB@y``IMnN0!eHJ>cnG6kL?Nx4Ti-TFP5*%d*Y4EJT8IuErl{v<@rr zZ4bC<>O1M~N|U#zY!6*8>$>tH=tf+0ZF|7fZIApbg2bls3oLx>w^jJzvFSTstQAbT zRKC~WKG1)gvrDD8<>^Ad(*-FjQ+8~ZIaa(y_qYrv=e@^WceZ+Ko!=w?TD)}drO&Tj z|K{p1T`x7~Xvo6MhCi1Mg>Ln0n-IQ1Mn-tM$^4rvRJLww^o3__+uV592O4Xf^f}!b z6p-lHcQ`xd@ZQ)7x^vIjFy|^Bay0VRm$pc)PuM9PXeqMnrqR3C<=!=`i+hfCd`OGB z<1+1ba8_!TLm@X~2A@fY&~$;N;Z^-7qgYR!uD*0_u5*6-^7S8eC#gp+i@0od@9iVz zw^nyH%jUCG?tYo7d#by~X2Mj(Ycg+TiVTZCrOgz&y5L74)8VYo`DN=iZI!+4dn0$7 zw0Bsf?^$Yxu3ZhwK->C>6IMh~-``e*Oh@b21_y*pk!XFjFfGTql+Jt#W=^OIw} zsw?*8Ty1-_@{>#{Yi{Kph2wKhc-`hI)OV@3r>3Wptp3SuKTEFNn)I~bkw|D} ztow?+pLb>_9f+E95}YZsVX z9Wu3;l>6yO#qAkupj5OxSsf^b@F}TR}A$ z-bD`ufB5f;Z96k(ole{B%BBe){H_aeHQcckWe)Hae6sA`^oMuO$;WOzK5x6V^Q|uh z)449p$WASoGv{&9g|xp!P!-ndE>!*GMd79k{>RIygXTT>HYezt;+-MZ0&iL zYWps?wQR-4*;&eg%^tZ$DJvb8&VA}tFlWu*yd%xt2j!XdrhICfSQ5MG<7yM5FVCi4 zxgfvmbllD)D^_x$Qs*%fq2B&cPr7o$d?sE)i^oN}kwY}4nxJuxPAbGMw_ z7^Rz+Suj(_y~udu?b@Ovd#p8iE!qxUIg#m^Gu0qQ@yf#aPde+aT$9wz-dnt+)by%( zbm=i^b6q}_h(k#Z2F^jc=g$`GnQF3BzevSs$sU0%a~JyR`|G7(y`qREmn85Bs!7b=^vlo^)YaXRZdvmpPGvp&ozc?x?MLc%M7hY;UBI&s|@` zWy|7KJxlraJ(+iO+l2O*eBNE#W@NT;cW`>oZTq{p)_1~x2G%*+r#iTf*BL+l9KOKN z$Lg|E#y+Je+jp<;DyCkUw&+ou!MbnX(vH6s{t$lCW~y?*$%Dt-{H(4hxo>&AM}ETf zHNWe;Rvw=eKk0t`H7IKf2O2gtMgiA zH)Xx*`D+gk-M^Q*`6m}Dk7-odNDUCi%UySB9-6Z(jkxh>*{0s*f-CM7neK8qHb?MI zDWj@q@Jdhb3NChSP5*Vvr0N4-z75Unuewc#zMz zLoqe9xz&p4;<81SP2Xo4Ft49@Vb`Zkua{KpSSt65sjPWQ^MvAi+E*)`oPrqEhcHq) zcSzyZNYL0)_~cn%BV;{RB&^%?@!O|z2OrcSR8uth>}Lnl83dcra3X0 z&8yy-v^v&my_&UMSIBO$4VU;{uCBdh@_e1&s}k>AaS>guzU51I{5my<%gIbN+h)=P zHa0DxEZ;W0t5&n)KWul()b`0Yy|SR#N0cgu-85DMc4gUKFoT{rJ@;S zyF`s!aItfh$x6W|ZdsP)8+rCzy7aiZ=HbUFD}-bMEZIdq9ePpu@Y=@yBeL8H*VZgk z3ar|8e9p2*ep$sHQ5Pm{QF7MO-6ODQ$+r$wu46$SN4;Lo_RGAjH+hrOWvjAVccfFd zPI2p&-Q?jUWMJf}>b_D-Wm1u+%4C02tvv!wT^cJ@4!+1-9b#RP?t3?GgPwA^i&JI5 zbb|?p;%`(NJ>#%8PqsO(^I10Y$|dgGVl&G+FRp*E8y7R8=cirN;Y|lo{ZL#{tLn`>} zf|i_c2%ePelDM?T>T_n1)w~UB=Eyuyoog;Dn!EY7Y;|Dt?3fNCz4u;|p0Mb@%1+-} z>SuCEMq#0Eu9x^$Pelj8?*7UAOzXCFe2bpfl>4K{+;(gJjx&0mE*EZ0nyFW|cgch; zTTc1sEPY^dLxRIY$eo#cUw~DgxM1G2$X!DBdezy!{B7L5xP0oW;!Dw+wwK(0menI5 zr4f*AR}dy<$988$W^$iRMC_!as_#TIuiPnJeBs!vT&q2+jBeIWkN@-QMe8lMLfx%r zbqy6+y*>EkJ)O>Mf6*srZTiw6SM2+eqq`(8apz6vF77dL(~7uLu;28}#I5mBj>m1L zvDM6}(3ZPxb>Un`CXatD|5~S#bvKuq&pYE@z2&X4s`V5m$si%7DGUcq_4lz(W!wB| z@*}rp7kTdNC|{}+CD$qM>$~4)a%rZ&W9Xq5(?q3=z4~4kO%k|$vhb?r+7+d$^DZ6; z=seG3vv7Tl+oRI+o~DPRr^K4e`Q8(W{-&@62iLmH*2rtVicRI34hx!Dyvk>!Z8f@nCVEaw^MdMo46}#cEmY@*3*ew*2Zu2RNpUZ7Rd1ViQ)BK8(*xR@q8BZEkCzx z)0R)NS7$LSqW)#_*pCjxZISkQgW|Z=Cttfc3&u>8ywSf=&!V<a$Epc`mc_y7FC*yQF$nS4mW? z+!m!9eQIvcyCWu(w=Nfv&0hI+-l{Dbx#~67wm*+?-E=U2a`BvHxAim(4to`*YRX(G zThhSzthO{}asMaPs66fdgL(?K)mvgOXUvy7?O>P1zE<^U@N{ zXz!MuSy6xUAD`Xs?&_7lCs5CSOXRxiqNm$eq?Utu0#z}6f(4#Y+ zlYhjnesFt{wN^;C$g>%V%ceZKTj-;s%IRdQD&!&IZ+szS%a>(qgKN5%mYlsEd@l9* z;#-OKrq^z8>gn<-taViM^788NJQl)MeLQMSyZOPBf?vK%SQIWat()DSyFaG1^`7ab zH`lgi9aZybfAf06;o^lWS1g@stR~HRWxJU1nmvylx4NBvnCW)f^?qNKw{vFn+~py! zy63zN*895ffqC_2-|f4lT&9aXUH585IcHIt?uygB%H=sV4+~S+WxWE9xqeN1+}FR~ zbN9)PBW)(%=5C*9KG#<_aK@I~_r09vbi96N!&$mTyLh+Ive}0wZ4cNG=#^X5-+1fO z>-1~WvahvXF_%u=7W3Non$C=1xn9;hF%_G`FI6*AR&Kg=t(9d`(^R40uD%Jib3SHl zEmZa@%#Lun#QV|m_Q5MJeB9Ms=dIQ~bgtKub?K=x=am9;C!}n0`?TrTTn~mEJ%*{X zr;COje*X4@%E!X))N{EjJFiQhT_3R5isz_nVeyn17n}0>+}>Vl`Bz$Itr>Lec(bEN zxa&(f+Yi&DvSzRA-;ynDurGSrymQjiC6@lY7|vyLk*`T{UkyCE+y=8b9dqXwa zCg;JDUVZz>%|~O!-p$?WDY!g#Vr^TZYt01aynQlnZbz!{t_rYJNS>#4@;}3kzH^lq zGe0$5nPX=)tENxU<*J#VXjII0mkBcioVOomy|}U~rjo^6DI?Qx$`ns+r&z;l8zwln zl|FfyezV}wp0oDiaa*%@-hI&Rvp1dTv0P5eqN}o7*Qz~fIaRr3$JFK3hb_G(*|IE{ z9cdHsFlcGi1Lclgp+V~lSkK*-iBp=ccIeHW>g|cvpB~4~)?1^?usqw_@{lKQ6?^Y4 z_Dkm~feUXY~DEC6%w1qC)1brOQLarnH-BtXR&cm^{y1bmCt-zx>OW z-d$9D;VZkW!gl=|soh>LJ3qYJK5?0vxtQz8u|6!y!?m5I@p7JZ7< z%vpV9*7aVi0SPI*V1Gfy%eTYE7wQFo2Pf@yd7PJUiK>6gfo zU8g6W2xL^S$?h#bm^Nqj;W))tXQkxlX4a+b=6zOTYN>Q%+8w=JJJ!uvXBBY!sF$V& z>|yU1g5`4;P%5*(@)*hcGdh0>)7ysfP zFC(HR&2L#?n{u%vV#VdePwS5B>3rBw|8M7x`TrT#U8_CtY5m`@its-&G4*;^H_4~; zvLmr)PX;KehjB z=J@-_oYk*7Gxyw_7IkORimU`+3LY zqUq0lCvkE(t2FTyp9uFTkh}bpG2`MIw@=O2qQV32A99P^7!}(wWnT66wcfX0zHFK% zDYK9Bbx>^hk$v(RyXUUExO(f_NvDmzJ({&`bHThTr9Oogr=++8?ydKzQdXbwG{`JI z^9j@KPUYqCvl?#oyp>$@e4d7^=H`I-++TT@jeeHaZ)|5>^m+BMO2!L(pQ;$IOk#Cr zo~aO)C0qQ+cG1za&G$`}{UVcNLpD6zd8S?bj6lbF&%*ra@|=pi$0GwWb}VTK2@;qt z(#FgFl>PAD{6l3HH@-fyn|H}*((>pXae4*Psk-deCTovJPI&B_TG#2^?cEs{uthOp zf$)aNCyzDM`dv3>aHIKeSLKA{d>=N;6yD~>cM|jpj zr3D?2?fDluUV5Lk*Hzr({54kITe?zHpG3VgiVt-1DRHm$jP7f-Xqlp1c7FH1RiDkgzxUV)me!@J7SCrfMMkdL#y+K-5{b%UcQOV+2Y+r)$C+F#LL4jF)_t0I@s_TPd+e># zEAIR`E7|h*fNR_BeO0O^ty^X+-^%E9x{-_TTeQcWH45!K|CpX^&t|w17~}u&bJbca z!MBBp*+J_x=jimsO8ER|FlSh?``OdlWoMYmALlVXGxVMI&gMhV`{nOuZMu5&t*Ft- zuSzgr+uU3TVr}hS;VH&7|!*FlJ4E@ zb8#2744Ut(GcC6A+2ScvEhg{vSG6uGz7v@nQ+IjYmL;!N>z?-TZ7(chJtz7vcANFI z53`G}Gkm(%nVtD;s${E%meD=s%Xfq%CPkLsc(YYw)z^FW1&(WV<)e2Vv*o)tce-l9 z;=9*ZJml~@;lwrVlKk6hQ(aB3DM6eHD)V0XTc2WY6|)RiTxGg-vH$J2Z=>(}UVB^I zDa5kTkk8^o;?rGBC!M`4o=$9<)ALAw7VD(N+viFib#L2sah=gl-mKqNH?xY(wu{Yt zGi6cqDzE5-xp(FSO>3AU?=iK9FKKVa-e~sdh=_eo{c4&)_j;97=FZ*Y>9b>5ihJ?q zpbIgX&+g>9az}AGY6M*hT5RSle~@i+T#)uvPes~|7srLhtv>ld&V(hnb5_#FH6?P3 zE=yGhdTfk&H|_gl=bZ+xd-ar0Io@~>?d9EZ@K{KzYJzBPkRQjgTp7Mcwv*lOzA?Ki zf2eJ3_{v_zyG)Pd%YBZvOq;`3xg#WZt;Orp-scnzoxODD^j$nI7kcpM>V4}se0UrZ zSHinAT-TNDy6W$o5aZjLH#u{rux#OY8+uRrRQZ&aCwXTBiY&e!*|x*}$nAOkyLMOX zc#+n!;#Yfc=JQHOb=Fjtrx_Fv*mg%&Qnd024 zZ8x*KoGEC=|DF$=UTNWWjRT8=I!|wp)1huUa{~e_HIhn@eS{8vk(n5>|7G_2Txag_D(Z zqEn_loorM*QPE~c@4|vu&%oT=-V;I78vN9Es}@Ww{V?D2-WPY?l6w=blxqa%nN?>C zEU{(M4pdI%WKQ-qYP;&OxFTZ&p5{KunimZ+@GjLr(;^wiXnP;(Faw*+*vmS?k%)u%)MR$Y{8_C8X}V_Uw> ztLgS?6;-a%r3xBTJ~QOKd;ZY>_)@nY{Z+G<{it5KRdnl-?RwWUrkhz^>wW3nyJhK; zDW6ZAklFo8n(NJ?b@RNg&n}y=^TT_`xVP8VYMOS3-ZEV%q;e>a^%Kjnl=)_5ddHKG zO+NnIA zQzV?vE7-(2UFvvI&ZDELQJSD~Lg!y7kJ6!Y3$FdK-v9E%yPNvuE@dB=Zd-nTo5;!& zXSVB^luuiJqfp<#J427{o^(+3snw4guG{opu9@?7>-FfY5YJti+f1hZ4(<)R-Lv#^ zLEkT(Gtm2V_e?zb(PfO=saQFxBK&( zMNhnpO5b#0y6D%k+5Z-9^z;ahUFmeqd)~ZH{ny0qMz2zQ{gzL1!);UMus|b|C%P|$ zuBNn_9MNUFe0zz-=gzm^)h`t)C?{xf-T$<7r^BV9ch~!*l|Us}Ozvrwe9l)eP#mJ6JsXX3neV z_%I{Yx9Rh#I{6f@E0=;~xwNFcvfK~tQ~JpCpP~AZkDuZV<;b|p;u1bb8ihQjwaqNL zb@;Vrjp9}t?(Tx7B??Vk4u>3#ZgYPKTk})u%$7{HEqf;iu6%6neq>|JyFjV=rsm{OVoVemOsAO7fNm6CP-Lg>BoWp~$^Dy(!8&Fhfr8B`@#l`0aa3E>DXn zYros@>Q3T)vrL_(N2V_1`ZB3yMbkW27bXXm>wJ|yuQ~;m#N_M|-F+hK;^IeHudhUI zifu0FyZx_@B}~a$!s7GqwdYt`+sfIcZ90!e{u1xl_P4fZzuH0Zty?1RcFK0IisQE>ee;8c3e@27(Wz56!ACEi#GaOpB z;?F|&OFIv}|9D*ZKSQf;;7_OiW$mr?kIt#ovq{bV*(&eL&-I_-=p2uKJf`NKxfp(h zTg3jecvSykpsn$nDtG!YQAW1)IuMS>}8`AzEHw++f9g^0oW+MLVjV{tOV@ zZujzD%9&@zy&X}z)!gkeGkKSMRa$9h`&aOu$OqlOW?#;VuU!}R`%ZhrlrM8Fi#A&d zYIs=R_B~{*F~P5Jt2RsWJR_|)5Ax+J>Ys8h30!MYkze@8E#YIb>iRJsKK)*n`^sUemX)_+<{hyuy4sw|7M8dBdqQrih&1sz zO0KtN3{?5_VS&Q*zt+Xq+Z|t-P1v2ZW_n}gRG}o1cBfFbVA**WzdkGysGMLh`TSD% zhzD=q?&HXa6W?3X^yID1zll{oO<~LCeOJnn}bhgcQn|a~a((dGievVh)?wS-Pee2GQPq%W99;;=a5hZYw$^f$k)@gz=bT0C)nhZ?Ptr;|e<^THP+q`SmhZU+ciOc~o+;|-C-bgd z^rAJQw6D{ZslBn*|VGyP{+5xL7M#`W4$JF65g zZOyl-XA5uo&ksig#vQ*?zOCRIDuDsMN~ltlv(9 z^HT-4$@Z0RoAS*=BhY(y*R)AfrYMVCJo2AGZLaHj{axE$a|cE*HeT6!kZ;2$kp-V* zH*V+Biv8keE$I>bVENA2=L{u&?5!f}a`d>A{FzNl`qXw;h)WAx_P(n7x@G^@;9_x> z$lz>2rm`IGXyN_a`SNd0v({Z+YvlGR=USMr?Q+&xZii77H_CMv)eLXH}g#hbC;K2wAb`YQ+v4D*52d{JhAN_SK)ovPRcvK+|+lX zN9^3$AuW|}PJ22Xsq~2M-OJ176y-gMO?l}N#bcMZURwC#dcu_EyO-xy-rzW{rFLQQ z?2>r)cV|CNyS8&fs(I$6ZQj|}&1KrQ9Nw8FmZT>ww0PHZ^X7tU+paelEI4>FD6~7c zd7JjuUFXa9-kVXSv(~p}evQCAzw1hyKF?0xw&icuZ?>D-{zX?dRQAmLc0gOhL-K&c z*N}FRgDT&zuhLjZ%YHI{)b}_KIa3~&?^g^CFg;tjs+=;nQr-)acGU3;mU<3axDW zR&H3G$aT9fWTX2--RJF6v%4DaHRi8!ntqyti&d}i11wlndN3Aa*<_WqnQ@H%9 zWI~kcC(q|p+nAqnGp|r?>yciz`$l{Vb~?`#oo4euQP(TUNj_gG`emfo!2-*zsR=3^ zTaV@K`g43oeENo0x{gcL@1{lT3a49iT<4yo)FvjfR4XVlmOSA)X%UqV8FC zI)(53Gj^1F#w1qq`EQ9_U!)o7MIF?Y1LNZ#{A8yrpLn#PdXCW%Y#VH}6dh zKDsG*%WP|VkC)zjZI?Hg%$w0LqilCDXTRjy*QE}8OZ{|K=IK0{YOz%_J7~&MAy3tR z3t}X$3U6J{^=00wox2TRPPev6pI;ZF_HftlxwD++y@@KlcH6t9tkXMht#pXl+RR&v zZC8GB;?h{uGQ(DL-|vj=S=_3J4p$^^Yb@+}DLMvbC;U`B`{n$HzGSqk$TQ_F;(+_jbxJHd?CbYtgh-SZ+t9<;(4JFN$S5 zzj428>+;&<1#j28_Ht=GU$`>=>=s?WV`&fNlrP1ylRoY~ z#UJz1PWpItYfb(4+G~lgtb14ew7Z+vqTk(eCR9yIg~Q){$BuUSLdF$=$*NBlW`?YI z=TdNTO8ev$`wiqoS4YN}KAu$_-Z|@avm^&p&O?{4pR>je`E+wiP9%NVe zIVh`ZEUYvwm~=P8b>97~y+@scZp^r{tloE zg@q#Azx_V&w@O9(p1L?~u7>TgxyvIiZA$cR2;5?v85C{1U+7RWPM7I7;*EL^p<`m4%w&stoQy9Ouu*y<8k(yHfdP>fR-~ z(_Xhe)O{vX-ShNt&*Rzc>TK>tr>XDc{tf;ov{rmS{515}#DeWVJa^PN zF22t{HT;$9q5BWj9{yx&*!o-T-$8qY#hdcq2!G;QW&7c0Xx)++-G4%P@)I&pG%nDs z1DmG-F?>~jja_K`N^$P`mf7u3q);_-$3x7s1{=N#)lO86OxGdijXL(k&emw<4;@fQssH@iRG0^Hfa$#W~Z2h*cd#H zhR*v@v#LHwPV7Ger#b%#Q^kwnaYnv#Rre`p^vb7pOe>Z>t+!@sNnu|4gSC9OlUmdz zt(&G)Z~J~hxWK@0Qtj4RpC)-ce@$pbIvX$Z?Z`z7B$!2KX{@C2;`M~z+9m-~S9<2& z_&5Io|D;U;#dGHT&b})u!Y}P_{5V1}X0P(8ZGm2F8|Dc4`DLeyg!DCm?$Z6_cyN74 zfYhPTM;W))d=6TjD#Es*xq0%O{|x?zBQ+I@)Ss>|36MHqc`Wqtwar`ReU5vvVnL;s zhv};>jfOy1Q3dT&lSF&Ihp*D$w|1{o+r*}ALf&x?;gcr#RxN5cAR!?-OJi`HPdhA} IVgLUo0AdMxL;wH) diff --git a/converter/pc98_usb/Makefile b/converter/pc98_usb/Makefile deleted file mode 100644 index 9892276d7f..0000000000 --- a/converter/pc98_usb/Makefile +++ /dev/null @@ -1,83 +0,0 @@ -# Target file name (without extension). -TARGET = pc98_usb - -# Directory common source filess exist -TMK_DIR = ../../tmk_core - -# Directory keyboard dependent files exist -TARGET_DIR = . - -# keyboard dependent files -SRC = keymap.c \ - matrix.c \ - led.c \ - protocol/serial_uart.c -# protocol/serial_soft.c - -CONFIG_H = config.h - - -# MCU name, you MUST set this to match the board you are using -# type "make clean" after changing this, so all files will be rebuilt -#MCU = at90usb162 # Teensy 1.0 -MCU = atmega32u4 # Teensy 2.0 -#MCU = at90usb646 # Teensy++ 1.0 -#MCU = at90usb1286 # Teensy++ 2.0 - - -# Processor frequency. -# Normally the first thing your program should do is set the clock prescaler, -# so your program will run at the correct speed. You should also set this -# variable to same clock speed. The _delay_ms() macro uses this, and many -# examples use this variable to calculate timings. Do not add a "UL" here. -F_CPU = 16000000 - - -# -# LUFA specific -# -# Target architecture (see library "Board Types" documentation). -ARCH = AVR8 - -# Input clock frequency. -# This will define a symbol, F_USB, in all source code files equal to the -# input clock frequency (before any prescaling is performed) in Hz. This value may -# differ from F_CPU if prescaling is used on the latter, and is required as the -# raw input clock is fed directly to the PLL sections of the AVR for high speed -# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' -# at the end, this will be done automatically to create a 32-bit value in your -# source code. -# -# If no clock division is performed on the input clock inside the AVR (via the -# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. -F_USB = $(F_CPU) - -# Interrupt driven control endpoint task -OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT - - -# Build Options -# *Comment out* to disable the options. -# -MOUSEKEY_ENABLE = yes # Mouse keys -EXTRAKEY_ENABLE = yes # Audio control and System control -CONSOLE_ENABLE = yes # Console for debug -#NKRO_ENABLE = yes # USB Nkey Rollover - - -# Boot Section Size in bytes -# Teensy halfKay 512 -# Atmel DFU loader 4096 -# LUFA bootloader 4096 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 - - -# Search Path -VPATH += $(TARGET_DIR) -VPATH += $(TMK_DIR) - - -include $(TMK_DIR)/protocol/lufa.mk -include $(TMK_DIR)/protocol.mk -include $(TMK_DIR)/common.mk -include $(TMK_DIR)/rules.mk diff --git a/converter/pc98_usb/README b/converter/pc98_usb/README deleted file mode 100644 index c9bdf3d846..0000000000 --- a/converter/pc98_usb/README +++ /dev/null @@ -1,67 +0,0 @@ -PC98 to USB keyboard protocol converter -======================================= -Target MCU is ATMega32u4 but other USB capable AVR will also work. - - -Connector ---------- - - 8Pin mini DIN - ___ ___ - / |_| \ - / 8 7 6 \ - | 5 4 3 | - \_ 2 1 _/ - \_____/ - (receptacle) - - -Wiring: You can change this with editing config.h. - - Pin mini DIN MCU - ---------------------------------- - 1 ~RST(TXD) PD3 - 2 GND GND - 3 ~RDY PD4 - 4 RXD PD2 - 5 ~RTY PD5 - 6 NC - 7 NC - 8 5V VCC - - - - -Protocol --------- -Signal: Asynchronous, Positive logic, 19200baud, Least bit first -Frame format: 1-Start bit(Lo), 8-Data bits, Odd-Parity, 1-Stop bit - - - -Build Firmware --------------- -Just use 'make' - - $ cd pc98_usb - $ make - -Then, load the binary to MCU with your favorite programmer. - - - -Other PC98 converter projects and resource ------------------------------------------- -PC98 to USB -http://davy.nyacom.net/kbd98usb/ - -PC98 to PS/2 -http://www.tsp.ne.jp/~sawada/mago/c_gka98at.htm -http://www.tsp.ne.jp/~sawada/mago/src/gka98at.asm - -PC98 keyboard commands -http://www.webtech.co.jp/company/doc/undocumented_mem/io_kb.txt - - -Inhibit repeating key: -0x9C, 0x70 diff --git a/converter/pc98_usb/config.h b/converter/pc98_usb/config.h deleted file mode 100644 index b8d676e4cf..0000000000 --- a/converter/pc98_usb/config.h +++ /dev/null @@ -1,123 +0,0 @@ -/* -Copyright 2012 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef CONFIG_H -#define CONFIG_H - -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x9898 -#define DEVICE_VER 0x0100 -#define MANUFACTURER t.m.k. -#define PRODUCT PC98 keyboard converter -#define DESCRIPTION converts PC98 keyboard protocol into USB - - -/* matrix size */ -#define MATRIX_ROWS 16 -#define MATRIX_COLS 8 - -/* key combination for command */ -#define IS_COMMAND() ( \ - host_get_first_key() == KC_CANCEL \ -) - - -/* PC98 Reset Port shared with TXD */ -#define PC98_RST_DDR DDRD -#define PC98_RST_PORT PORTD -#define PC98_RST_BIT 3 -/* PC98 Ready Port */ -#define PC98_RDY_DDR DDRD -#define PC98_RDY_PORT PORTD -#define PC98_RDY_BIT 4 -/* PC98 Retry Port */ -#define PC98_RTY_DDR DDRD -#define PC98_RTY_PORT PORTD -#define PC98_RTY_BIT 5 - -/* - * PC98 Serial(USART) configuration - * asynchronous, positive logic, 19200baud, bit order: LSB first - * 1-start bit, 8-data bit, odd parity, 1-stop bit - */ -/* - * Software Serial - */ -#define SERIAL_SOFT_BAUD 19200 -#define SERIAL_SOFT_PARITY_ODD -#define SERIAL_SOFT_BIT_ORDER_LSB -#define SERIAL_SOFT_LOGIC_POSITIVE -/* RXD Port */ -#define SERIAL_SOFT_RXD_DDR DDRD -#define SERIAL_SOFT_RXD_PORT PORTD -#define SERIAL_SOFT_RXD_PIN PIND -#define SERIAL_SOFT_RXD_BIT 2 -#define SERIAL_SOFT_RXD_READ() (SERIAL_SOFT_RXD_PIN&(1<>8); /* baud rate */ \ - UCSR1B |= (1< - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include -#include -#include "keycode.h" -#include "action.h" -#include "action_macro.h" -#include "util.h" -#include "keymap.h" - - - - -/* PC-9801-98-S02 Raku Raku keyboard(Luckyboard) Normal Mode - ,---------------------------------------------------------------. - | 60| 61| 62| 63| 64| 65| 66| 67| 68| 69| 6A| 6B| 36| 37| 3F| 3E| - `---------------------------------------------------------------' - ,---------------------------------------------------------------. - | 00| 01| 02| 03| 04| 05| 58| 71| 06| 07| 08| 09| 0A| 0E| - |---------------------------------------------------------------| - | 0F| 10| 11| 12| 13| 14| 3A | 15| 16| 17| 18| 19| 1C| - |---------------------------------------------------------'. | - | 74| 20| 21| 22| 23| 24| 3B | 3C | 25| 26| 27| 28| 29| | - |---------------------------------------------------------------| - | 70| 2A| 2B| 2C| 2D| 2E| 38| 3D | 39| 2F| 30| 31| 32| 33| 70| - `---------------------------------------------------------------' - | 73| 51| 5B| 59| 34| 5A| 35| xx| - `-----------------------------------------------' - xx: 74 35 F4 B5 -*/ -#define KEYMAP( \ - K60, K61, K62, K63, K64, K65, K66, K67, K68, K69, K6A, K6B, K36, K37, K3F, K3E, \ - K00, K01, K02, K03, K04, K05, K58, K71, K06, K07, K08, K09, K0A, K0E, \ - K0F, K10, K11, K12, K13, K14, K3A, K15, K16, K17, K18, K19, K1C, \ - K74, K20, K21, K22, K23, K24, K3B, K3C, K25, K26, K27, K28, K29, \ - K70,K2A, K2B, K2C, K2D, K2E, K38, K3D, K39, K2F, K30, K31, K32, K33, \ - K73, K51, K5B, K59, K34, K5A, K35 \ -) { \ - { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ - { KC_##K08, KC_##K09, KC_##K0A, KC_NO, KC_NO, KC_NO, KC_##K0E, KC_##K0F }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ - { KC_##K18, KC_##K19, KC_NO, KC_NO, KC_##K1C, KC_NO, KC_NO, KC_NO }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ - { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \ - { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37 }, \ - { KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_##K3F }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_##K51, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_##K58, KC_##K59, KC_##K5A, KC_##K5B, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67 }, \ - { KC_##K68, KC_##K69, KC_##K6A, KC_##K6B, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_##K70, KC_##K71, KC_NO, KC_##K73, KC_##K74, KC_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ -} - - - -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* - ,---------------------------------------------------------------. - | 60| 61| 62| 63| 64| 65| 66| 67| 68| 69| 6A| 6B| 36| 37| 3F| 3E| - `---------------------------------------------------------------' - ,---------------------------------------------------------------. - | 00| 01| 02| 03| 04| 05| 58| 71| 06| 07| 08| 09| 0A| 0E| - |---------------------------------------------------------------| - | 0F| 10| 11| 12| 13| 14| 3A | 15| 16| 17| 18| 19| 1C| - |---------------------------------------------------------------| - | 74| 20| 21| 22| 23| 24| MINS| EQL| 25| 26| 27| 28| 29| | - |---------------------------------------------------------------| - | 70| 2A| 2B| 2C| 2D| 2E| 38| 3D | 39| 2F| 30| 31| 32| 33| 70| - `---------------------------------------------------------------' - | 73| 51| 5B| 59| 34| 5A| 35| xx| - `-----------------------------------------------' - */ - KEYMAP( - CANCEL,COPY, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, FN6, - ESC, 1, 2, 3, 4, 5, FN4, FN5, 6, 7, 8, 9, 0, BSPC, - TAB, Q, W, E, R, T, UP, Y, U, I, O, P, ENT, - LCTL, A, S, D, F, G, MINS, EQL, H, J, K, L, FN2, - LSFT, Z, X, C, V, B, GRV, BSLS, QUOT, N, M,COMM, DOT, FN1, - LGUI, LALT, LCTL, LSFT, SPC, SPC, RALT - ), - KEYMAP( - PAUS,COPY, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, - GRV, F1, F2, F3, F4, F5, NO, NO, F6, F7, F8, F9, F10, DEL, - TAB, Q, W, E, R, T, UP, HOME,PGDN,PGUP, END, P, ENT, - LCTL, A, S, D, F, G, MINS, EQL, LEFT,DOWN, UP,RGHT,SCLN, - LSFT, Z, X, C, V, B, INS, DOWN, DEL,HOME,PGDN,PGUP, END,TRNS, - LGUI, LALT, LCTL, LSFT, SPC, SPC, RALT - ), - KEYMAP( - PAUS,COPY, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, - GRV, F1, F2, F3, F4, F5, NO, NO, F6, F7, F8, F9, F10, DEL, - TAB, Q, W, E, R, T, UP, WH_L,WH_D,WH_U,WH_R, P, ENT, - LCTL, A, S, D, F, G, MINS, EQL, MS_L,MS_D,MS_U,MS_R,TRNS, - LSFT, Z, X, C, V, B, INS, DOWN, BTN3,BTN2,BTN1,BTN4,BTN5,TRNS, - LGUI, LALT, LCTL, LSFT, SPC, SPC, RALT - ), -}; -static const uint8_t PROGMEM overlays[][MATRIX_ROWS][MATRIX_COLS] = {}; - -/* - * Macro definition - */ -enum macro_id { - LBRACKET, - RBRACKET, - DUMMY, -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - keyevent_t event = record->event; - //uint8_t tap_count = record->tap_count; - - switch (id) { - case LBRACKET: - return (event.pressed ? - MACRO( T(LBRC), END ) : - MACRO( T(LBRC), END ) ); - case RBRACKET: - return (event.pressed ? - MACRO( T(RBRC), END ) : - MACRO( T(RBRC), END ) ); - } - return MACRO_NONE; -} - -/* - * Action function - */ -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) -{ -/* - keyevent_t event = record->event; - uint8_t tap_count = record->tap_count; - switch (id) { - case 0xFF: - action_macro_play(get_macro(opt, event.pressed)); - break; - } -*/ -} - - -/* - * Fn actions - */ -static const uint16_t PROGMEM fn_actions[] = { - ACTION_LAYER_TAP_TOGGLE(0), // FN0 - ACTION_LAYER_TAP_KEY(1, KC_SLASH), // FN1 - ACTION_LAYER_TAP_KEY(2, KC_SCLN), // FN2 - ACTION_LAYER_MOMENTARY(2), // FN3 - ACTION_MACRO(LBRACKET), // FN4 - ACTION_MACRO(RBRACKET), // FN5 - ACTION_MACRO(DUMMY), // FN6 -}; - - - - - - -/* - * No need to edit. - */ -#define KEYMAPS_SIZE (sizeof(keymaps) / sizeof(keymaps[0])) -#define FN_ACTIONS_SIZE (sizeof(fn_actions) / sizeof(fn_actions[0])) - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - if (layer < KEYMAPS_SIZE) { - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); - } else { - // fall back to layer 0 - return pgm_read_byte(&keymaps[0][(key.row)][(key.col)]); - } -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - action_t action; - if (FN_INDEX(keycode) < FN_ACTIONS_SIZE) { - action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]); - } else { - action.code = ACTION_NO; - } - return action; -} diff --git a/converter/pc98_usb/led.c b/converter/pc98_usb/led.c deleted file mode 100644 index 48c3f1c2b2..0000000000 --- a/converter/pc98_usb/led.c +++ /dev/null @@ -1,33 +0,0 @@ -/* -Copyright 2012 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include "stdint.h" -#include "serial.h" -#include "led.h" - - -void led_set(uint8_t usb_led) -{ - uint8_t sun_led = 0; - if (usb_led & (1< - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include -#include -#include -#include "print.h" -#include "util.h" -#include "matrix.h" -#include "debug.h" -#include "protocol/serial.h" - - -/* - * Matrix Array usage: - * - * ROW: 16(4bits) - * COL: 8(3bits) - * - * 8bit wide - * +---------+ - * 0|00 ... 07| - * 1|08 ... 0F| - * :| ... | - * :| ... | - * E|70 ... 77| - * F|78 ... 7F| - * +---------+ - */ -static uint8_t matrix[MATRIX_ROWS]; -#define ROW(code) ((code>>3)&0xF) -#define COL(code) (code&0x07) - -static bool is_modified = false; - - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -static void pc98_inhibit_repeat(void) -{ - uint8_t code; - - while (serial_recv()) ; -RETRY: - PC98_RDY_PORT |= (1< -# to submit bug reports. -#AVRDUDE_VERBOSE = -v -v - -#AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -AVRDUDE_FLAGS = -p $(MCU) -c $(AVRDUDE_PROGRAMMER) -AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) -AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) -AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) - -PROGRAM_CMD = $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) - - -# Boot Section Size in bytes -# Teensy halfKay 512 -# Atmel DFU loader 4096 -# LUFA bootloader 4096 -# USBasp 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=2048 - - -# Search Path -VPATH += $(TARGET_DIR) -VPATH += $(TMK_DIR) - - -include $(TMK_DIR)/protocol.mk -include $(TMK_DIR)/common.mk -include $(TMK_DIR)/protocol/vusb.mk -include $(TMK_DIR)/rules.mk diff --git a/converter/ps2_usb/README.md b/converter/ps2_usb/README.md deleted file mode 100644 index 74464e2640..0000000000 --- a/converter/ps2_usb/README.md +++ /dev/null @@ -1,84 +0,0 @@ -PS/2 to USB keyboard converter -============================== -This firmware converts PS/2 keyboard protocol to USB.(It supports Scan Code Set 2.) - - -Connect Wires -------------- -In case of Teensy2.0(ATMega32U4): - -1. Connect **Vcc** and **GND**. -2. Connect **Clock** and **Data** line. - - **Interrupt**: **Clock** is on `PD1` and **Data** on `PD0`.(Recommended. Soarer's converter compatible) - - **Busywait**: **Clock** is on `PD1` and **Data** on `PD0`. - - **USART**: **Clock** is on `PD5` and **Data** on `PD2`. -3. Optionally you need pull-up resistor. 1K-10K Ohm is OK. - -To change pin configuration edit **config.h** and **Makefile**. - - -Build Firmware --------------- -For **PJRC Teensy** just run `make`: - - $ make clean - $ make - -To select keymap: - - $ make clean - $ make KEYMAP=[plain|jis|spacefn|...] - -After that you will find HEX file `ps2_usb_lufa.hex` in current directory. - - -- For **TMK converter Rev.1** use `make -f Makefile.tmk_rev1` instead of `make` and HEX file is `ps2_usb_tmk_rev1.hex`. - -- For **TMK converter Rev.2** use `make -f Makefile.tmk_rev2` instead of `make` and HEX file is `ps2_usb_tmk_rev2.hex`. - - -Keymap ------- -Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_.c` and see keymap document(you can find in README.md of top directory) and existent keymap files. - - -PS/2 signal handling implementations ------------------------------------- -Following three methods can be used to implement PS/2 signal handling. - -### Simple and stupid busy-wait(ps2_busywait.c) - This is expected to implemented with portable C code for reference. -### Interrupt driven(ps2_interrupt.c) - Uses pin interrupt to detect falling edge of clock line. -### USART hardware module(ps2_usart.c) - Uses AVR USART engine to receive PS/2 signal. - -To select method edit Makefile. - - -V-USB Support -------------- -With V-USB you can use this converter on ATmega(168/328) but it doesn't support NKRO at this time. - -Circuit: - - +---+ +---------------+ - USB GND | | ATmega168 | - === C3 | | - 5V <-------+--------+---|Vcc,AVCC | PS/2 - R1 | | ==== - D- <----+--+-----R2-----|INT1 RXD|------->DATA - D+ <----|---+----R3-----|INT0 XCK|------->CLOCK - Z1 Z2 | | ->5V - GND<----+---+--+--+-----|GND | ->GND - | | | | - | C2-+--|XTAL1 | - | X1 | | - +--C3-+--|XTAL2 | - +---------------+ - R1: 1.5K Ohm - R2,R3: 68 Ohm - Z1,Z2: Zenner 3.6V - C1,C2: 22pF - C3: 0.1uF - X1: Crystal 20MHz(16MHz/12MHz) diff --git a/converter/ps2_usb/config.h b/converter/ps2_usb/config.h deleted file mode 100644 index c0a4fab13b..0000000000 --- a/converter/ps2_usb/config.h +++ /dev/null @@ -1,173 +0,0 @@ -/* -Copyright 2012 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef CONFIG_H -#define CONFIG_H - -#include - -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x6512 -#define DEVICE_VER 0x0001 -#define MANUFACTURER t.m.k. -#define PRODUCT PS/2 keyboard converter -#define DESCRIPTION convert PS/2 keyboard to USB - - -/* matrix size */ -#define MATRIX_ROWS 32 // keycode bit: 3-0 -#define MATRIX_COLS 8 // keycode bit: 6-4 - - -/* key combination for command */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) || \ - keyboard_report->mods == (MOD_BIT(KC_LCTRL) | MOD_BIT(KC_RSHIFT)) \ -) - - -//#define NO_SUSPEND_POWER_DOWN - - -/* - * PS/2 Busywait - */ -#ifdef PS2_USE_BUSYWAIT -#define PS2_CLOCK_PORT PORTD -#define PS2_CLOCK_PIN PIND -#define PS2_CLOCK_DDR DDRD -#define PS2_CLOCK_BIT 1 -#define PS2_DATA_PORT PORTD -#define PS2_DATA_PIN PIND -#define PS2_DATA_DDR DDRD -#define PS2_DATA_BIT 0 -#endif - -/* - * PS/2 Pin interrupt - */ -#ifdef PS2_USE_INT -/* uses INT1 for clock line(ATMega32U4) */ -#define PS2_CLOCK_PORT PORTD -#define PS2_CLOCK_PIN PIND -#define PS2_CLOCK_DDR DDRD -#define PS2_CLOCK_BIT 1 -#define PS2_DATA_PORT PORTD -#define PS2_DATA_PIN PIND -#define PS2_DATA_DDR DDRD -#define PS2_DATA_BIT 0 -#define PS2_INT_INIT() do { \ - EICRA |= ((1< - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef CONFIG_MBED_H -#define CONFIG_MBED_H - - -#if 0 -// duplicated name against mbed USBDeivce -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x6512 -#endif -#define DEVICE_VER 0x0001 -#define MANUFACTURER t.m.k. -#define PRODUCT PS/2 keyboard converter -#define DESCRIPTION convert PS/2 keyboard to USB - - -/* matrix size */ -#define MATRIX_ROWS 32 // keycode bit: 3-0 -#define MATRIX_COLS 8 // keycode bit: 6-4 - - -/* key combination for command */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) || \ - keyboard_report->mods == (MOD_BIT(KC_LCTRL) | MOD_BIT(KC_RSHIFT)) \ -) - - -/* - * PS/2 Busywait - */ -#ifdef PS2_USE_BUSYWAIT -# define PS2_CLOCK_PORT PORTD -# define PS2_CLOCK_PIN PIND -# define PS2_CLOCK_DDR DDRD -# define PS2_CLOCK_BIT 5 -# define PS2_DATA_PORT PORTD -# define PS2_DATA_PIN PIND -# define PS2_DATA_DDR DDRD -# define PS2_DATA_BIT 2 -#endif - - -#endif diff --git a/converter/ps2_usb/config_tmk_rev1.h b/converter/ps2_usb/config_tmk_rev1.h deleted file mode 100644 index 75dc97df38..0000000000 --- a/converter/ps2_usb/config_tmk_rev1.h +++ /dev/null @@ -1,147 +0,0 @@ -/* -Copyright 2012 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef CONFIG_H -#define CONFIG_H - -#include - -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x6512 -#define DEVICE_VER 0x0001 -#define MANUFACTURER t.m.k. -#define PRODUCT PS/2 keyboard converter -#define DESCRIPTION convert PS/2 keyboard to USB - - -/* matrix size */ -#define MATRIX_ROWS 32 // keycode bit: 3-0 -#define MATRIX_COLS 8 // keycode bit: 6-4 - - -/* key combination for command */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) || \ - keyboard_report->mods == (MOD_BIT(KC_LCTRL) | MOD_BIT(KC_RSHIFT)) \ -) - - -//#define NO_SUSPEND_POWER_DOWN - - -/* - * PS/2 Busywait - */ -#ifdef PS2_USE_BUSYWAIT -#define PS2_CLOCK_PORT PORTD -#define PS2_CLOCK_PIN PIND -#define PS2_CLOCK_DDR DDRD -#define PS2_CLOCK_BIT 5 -#define PS2_DATA_PORT PORTD -#define PS2_DATA_PIN PIND -#define PS2_DATA_DDR DDRD -#define PS2_DATA_BIT 2 -#endif - -/* - * PS/2 USART - */ -#ifdef PS2_USE_USART -#if defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) -/* XCK for clock line and RXD for data line */ -#define PS2_CLOCK_PORT PORTD -#define PS2_CLOCK_PIN PIND -#define PS2_CLOCK_DDR DDRD -#define PS2_CLOCK_BIT 5 -#define PS2_DATA_PORT PORTD -#define PS2_DATA_PIN PIND -#define PS2_DATA_DDR DDRD -#define PS2_DATA_BIT 2 -/* synchronous, odd parity, 1-bit stop, 8-bit data, sample at falling edge */ -/* set DDR of CLOCK as input to be slave */ -#define PS2_USART_INIT() do { \ - PS2_CLOCK_DDR &= ~(1< - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef CONFIG_H -#define CONFIG_H - -#include - -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x6512 -#define DEVICE_VER 0x0001 -#define MANUFACTURER t.m.k. -#define PRODUCT PS/2 keyboard converter -#define DESCRIPTION convert PS/2 keyboard to USB - - -/* matrix size */ -#define MATRIX_ROWS 32 // keycode bit: 3-0 -#define MATRIX_COLS 8 // keycode bit: 6-4 - - -/* key combination for command */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ -) - - -//#define NO_SUSPEND_POWER_DOWN - - -/* - * PS/2 Busywait - */ -#ifdef PS2_USE_BUSYWAIT -#define PS2_CLOCK_PORT PORTD -#define PS2_CLOCK_PIN PIND -#define PS2_CLOCK_DDR DDRD -#define PS2_CLOCK_BIT 1 -#define PS2_DATA_PORT PORTD -#define PS2_DATA_PIN PIND -#define PS2_DATA_DDR DDRD -#define PS2_DATA_BIT 0 -#endif - -/* - * PS/2 Pin interrupt - */ -#ifdef PS2_USE_INT -/* uses INT1 for clock line(ATMega32U4) */ -#define PS2_CLOCK_PORT PORTD -#define PS2_CLOCK_PIN PIND -#define PS2_CLOCK_DDR DDRD -#define PS2_CLOCK_BIT 1 -#define PS2_DATA_PORT PORTD -#define PS2_DATA_PIN PIND -#define PS2_DATA_DDR DDRD -#define PS2_DATA_BIT 0 -#define PS2_INT_INIT() do { \ - EICRA |= ((1< - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#include "keymap_common.h" -#include "progmem.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/converter/ps2_usb/keymap_common.h b/converter/ps2_usb/keymap_common.h deleted file mode 100644 index d783e01ded..0000000000 --- a/converter/ps2_usb/keymap_common.h +++ /dev/null @@ -1,173 +0,0 @@ -/* -Copyright 2011,2012,2013 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#ifndef KEYMAP_COMMON_H -#define KEYMAP_COMMON_H - -#include -#include -#include "keycode.h" -#include "action.h" -#include "action_macro.h" -#include "report.h" -#include "print.h" -#include "debug.h" -#include "keymap.h" - - -// 32*8(256) byte array which converts PS/2 code into USB code -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - -/* All keys */ -#define KEYMAP_ALL( \ - K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \ - K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ - K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA, K6C,K75,K7D, \ - K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K79, \ - K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \ - K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA, \ - \ - K61, /* for European ISO */ \ - K51, K13, K6A, K64, K67, /* for Japanese JIS */ \ - K08, K10, K18, K20, K28, K30, K38, K40, K48, K50, K57, K5F, /* F13-24 */ \ - KB7, KBF, KDE, /* System Power, Sleep, Wake */ \ - KA3, KB2, KA1, /* Mute, Volume Up, Volume Down */ \ - KCD, K95, KBB, KB4, KD0, /* Next, Previous, Stop, Pause, Media Select */ \ - KC8, KAB, KC0, /* Mail, Calculator, My Computer */ \ - K90, KBA, KB8, KB0, /* WWW Search, Home, Back, Forward */ \ - KA8, KA0, K98 /* WWW Stop, Refresh, Favorites */ \ -) { \ - { KC_NO, KC_##K01, KC_NO, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ - { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_NO }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_NO }, \ - { KC_##K18, KC_NO, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_NO }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_NO }, \ - { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_NO }, \ - { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_NO }, \ - { KC_##K38, KC_NO, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_NO }, \ - { KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_NO }, \ - { KC_##K48, KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D, KC_##K4E, KC_NO }, \ - { KC_##K50, KC_##K51, KC_##K52, KC_NO, KC_##K54, KC_##K55, KC_NO, KC_##K57 }, \ - { KC_##K58, KC_##K59, KC_##K5A, KC_##K5B, KC_NO, KC_##K5D, KC_NO, KC_##K5F }, \ - { KC_NO, KC_##K61, KC_NO, KC_NO, KC_##K64, KC_NO, KC_##K66, KC_##K67 }, \ - { KC_NO, KC_##K69, KC_##K6A, KC_##K6B, KC_##K6C, KC_NO, KC_NO, KC_NO }, \ - { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77 }, \ - { KC_##K78, KC_##K79, KC_##K7A, KC_##K7B, KC_##K7C, KC_##K7D, KC_##K7E, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, KC_##K83, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_##K90, KC_##K91, KC_NO, KC_NO, KC_##K94, KC_##K95, KC_NO, KC_NO }, \ - { KC_##K98, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_##K9F }, \ - { KC_##KA0, KC_##KA1, KC_NO, KC_##KA3, KC_NO, KC_NO, KC_NO, KC_##KA7 }, \ - { KC_##KA8, KC_NO, KC_NO, KC_##KAB, KC_NO, KC_NO, KC_NO, KC_##KAF }, \ - { KC_##KB0, KC_NO, KC_##KB2, KC_NO, KC_##KB4, KC_NO, KC_NO, KC_##KB7 }, \ - { KC_##KB8, KC_NO, KC_##KBA, KC_##KBB, KC_NO, KC_NO, KC_NO, KC_##KBF }, \ - { KC_##KC0, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_##KC8, KC_NO, KC_##KCA, KC_NO, KC_NO, KC_##KCD, KC_NO, KC_NO }, \ - { KC_##KD0, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_NO, KC_##KDA, KC_NO, KC_NO, KC_NO, KC_##KDE, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_##KE9, KC_NO, KC_##KEB, KC_##KEC, KC_NO, KC_NO, KC_NO }, \ - { KC_##KF0, KC_##KF1, KC_##KF2, KC_NO, KC_##KF4, KC_##KF5, KC_NO, KC_NO }, \ - { KC_NO, KC_NO, KC_##KFA, KC_NO, KC_##KFC, KC_##KFD, KC_##KFE, KC_NO }, \ -} - -/* US layout */ -#define KEYMAP( \ - K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \ - K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ - K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA, K6C,K75,K7D, \ - K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K79, \ - K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \ - K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA \ -) \ -KEYMAP_ALL( \ - K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \ - K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ - K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA, K6C,K75,K7D, \ - K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K79, \ - K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \ - K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA, \ - \ - NUBS, \ - RO, KANA, JYEN, HENK, MHEN, \ - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, \ - SYSTEM_POWER, SYSTEM_SLEEP, SYSTEM_WAKE, \ - AUDIO_MUTE, AUDIO_VOL_UP, AUDIO_VOL_DOWN, \ - MEDIA_NEXT_TRACK, MEDIA_PREV_TRACK, MEDIA_STOP, MEDIA_PLAY_PAUSE, MEDIA_SELECT, \ - MAIL, CALCULATOR, MY_COMPUTER, \ - WWW_SEARCH, WWW_HOME, WWW_BACK, WWW_FORWARD, \ - WWW_STOP, WWW_REFRESH, WWW_FAVORITES \ -) - -/* ISO layout */ -#define KEYMAP_ISO( \ - K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \ - K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ - K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B, KF1,KE9,KFA, K6C,K75,K7D, \ - K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52,K5D,K5A, K6B,K73,K74,K79, \ - K12,K61,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \ - K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA \ -) \ -KEYMAP_ALL( \ - K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \ - K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ - K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA, K6C,K75,K7D, \ - K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K79, \ - K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \ - K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA, \ - \ - K61, \ - RO, KANA, JYEN, HENK, MHEN, \ - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, \ - SYSTEM_POWER, SYSTEM_SLEEP, SYSTEM_WAKE, \ - AUDIO_MUTE, AUDIO_VOL_UP, AUDIO_VOL_DOWN, \ - MEDIA_NEXT_TRACK, MEDIA_PREV_TRACK, MEDIA_STOP, MEDIA_PLAY_PAUSE, MEDIA_SELECT, \ - MAIL, CALCULATOR, MY_COMPUTER, \ - WWW_SEARCH, WWW_HOME, WWW_BACK, WWW_FORWARD, \ - WWW_STOP, WWW_REFRESH, WWW_FAVORITES \ -) - -/* JIS layout */ -#define KEYMAP_JIS( \ - K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \ - K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K6A,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ - K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B, KF1,KE9,KFA, K6C,K75,K7D, \ - K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52,K5D, K5A, K6B,K73,K74,K79, \ - K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A,K51, K59, KF5, K69,K72,K7A, \ - K14,K9F,K11, K67,K29,K64,K13, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA \ -) \ -KEYMAP_ALL( \ - K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \ - K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ - K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA, K6C,K75,K7D, \ - K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K79, \ - K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \ - K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA, \ - \ - NUBS, \ - K51, K13, K6A, K64, K67, \ - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, \ - SYSTEM_POWER, SYSTEM_SLEEP, SYSTEM_WAKE, \ - AUDIO_MUTE, AUDIO_VOL_UP, AUDIO_VOL_DOWN, \ - MEDIA_NEXT_TRACK, MEDIA_PREV_TRACK, MEDIA_STOP, MEDIA_PLAY_PAUSE, MEDIA_SELECT, \ - MAIL, CALCULATOR, MY_COMPUTER, \ - WWW_SEARCH, WWW_HOME, WWW_BACK, WWW_FORWARD, \ - WWW_STOP, WWW_REFRESH, WWW_FAVORITES \ -) - -#endif diff --git a/converter/ps2_usb/keymap_jis.c b/converter/ps2_usb/keymap_jis.c deleted file mode 100644 index 02585150fb..0000000000 --- a/converter/ps2_usb/keymap_jis.c +++ /dev/null @@ -1,34 +0,0 @@ -/* - * JIS layout Japanese keyboard - */ -#include "keymap_common.h" - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: JIS LAYOUT - * ,---. ,---------------. ,---------------. ,---------------. ,-----------. ,-----------. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |Pwr|Slp|Wak| - * `---' `---------------' `---------------' `---------------' `-----------' `-----------' - * ,-----------------------------------------------------------. ,-----------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| JY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -| - * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| Ret | |Del|End|PgD| | 7| 8| 9| | - * |------------------------------------------------------` | `-----------' |-----------| +| - * |CapsLo| A| S| D| F| G| H| J| K| L| ;| :| \| | | 4| 5| 6| | - * |-----------------------------------------------------------| ,---. |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| ,| /| RO|Shift | |Up | | 1| 2| 3| | - * |-----------------------------------------------------------| ,-----------. |-----------|Ent| - * |Ctrl |Gui |Alt |MHEN| Space |HENK|KANA|Alt |Gui |Menu|Ctrl| |Lef|Dow|Rig| | 0| .| | - * `-----------------------------------------------------------' `-----------' `---------------' - */ - KEYMAP_JIS( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, DEL, END, PGDN, P7, P8, P9, - CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT,BSLS, ENT, P4, P5, P6, PPLS, - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RO, RSFT, UP, P1, P2, P3, - LCTL,LGUI,LALT, MHEN,SPC, HENK,KANA, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), -}; - -const uint16_t PROGMEM fn_actions[] = { -}; diff --git a/converter/ps2_usb/keymap_plain.c b/converter/ps2_usb/keymap_plain.c deleted file mode 100644 index 51b2fddb5b..0000000000 --- a/converter/ps2_usb/keymap_plain.c +++ /dev/null @@ -1,32 +0,0 @@ -#include "keymap_common.h" - - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: default - * ,---. ,---------------. ,---------------. ,---------------. ,-----------. ,-----------. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |Pwr|Slp|Wak| - * `---' `---------------' `---------------' `---------------' `-----------' `-----------' - * ,-----------------------------------------------------------. ,-----------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| |Ins|Hom|PgU| |NmL| /| *| -| - * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|End|PgD| | 7| 8| 9| | - * |-----------------------------------------------------------| `-----------' |-----------| +| - * |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Return | | 4| 5| 6| | - * |-----------------------------------------------------------| ,---. |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3| | - * |-----------------------------------------------------------| ,-----------. |-----------|Ent| - * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| |Lef|Dow|Rig| | 0| .| | - * `-----------------------------------------------------------' `-----------' `---------------' - */ - KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, - CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, PPLS, - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, - LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), -}; - -const uint16_t PROGMEM fn_actions[] = { -}; diff --git a/converter/ps2_usb/keymap_spacefn.c b/converter/ps2_usb/keymap_spacefn.c deleted file mode 100644 index bffd2bc606..0000000000 --- a/converter/ps2_usb/keymap_spacefn.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - * SpaceFN layout - * http://geekhack.org/index.php?topic=51069.0 - */ -#include "keymap_common.h" - - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: default - * ,---. ,---------------. ,---------------. ,---------------. ,-----------. ,-----------. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |Pwr|Slp|Wak| - * `---' `---------------' `---------------' `---------------' `-----------' `-----------' - * ,-----------------------------------------------------------. ,-----------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| |Ins|Hom|PgU| |NmL| /| *| -| - * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|End|PgD| | 7| 8| 9| | - * |-----------------------------------------------------------| `-----------' |-----------| +| - * |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Return | | 4| 5| 6| | - * |-----------------------------------------------------------| ,---. |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3| | - * |-----------------------------------------------------------| ,-----------. |-----------|Ent| - * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| |Lef|Dow|Rig| | 0| .| | - * `-----------------------------------------------------------' `-----------' `---------------' - */ - KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, - CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, PPLS, - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, - LCTL,LGUI,LALT, FN0, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), - - /* 1: SpaceFN - * ,-----------------------------------------------------------. - * |` | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delete | - * |-----------------------------------------------------------| - * | | | |Esc| | | |Hom|Up |End|Psc|Slk|Pau|Ins | - * |-----------------------------------------------------------| - * | | | | | | |PgU|Lef|Dow|Rig| | | | - * |-----------------------------------------------------------| - * | | | | | |Spc|PgD|` |~ | |Men| | - * |-----------------------------------------------------------| - * | | | | | | | | | - * `-----------------------------------------------------------' - */ - KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - TRNS,TRNS,TRNS,ESC, TRNS,TRNS,TRNS,HOME,UP, END, PSCR,SLCK,PAUS,INS, DEL, END, PGDN, P7, P8, P9, - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PGUP,LEFT,DOWN,RGHT,TRNS,TRNS, TRNS, P4, P5, P6, PPLS, - TRNS,TRNS,TRNS,TRNS,TRNS,SPC, PGDN,GRV, FN1, TRNS,APP, TRNS, UP, P1, P2, P3, - TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_TAP_KEY(1, KC_SPACE), - [1] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde -}; - diff --git a/converter/ps2_usb/led.c b/converter/ps2_usb/led.c deleted file mode 100644 index e448e84ec7..0000000000 --- a/converter/ps2_usb/led.c +++ /dev/null @@ -1,33 +0,0 @@ -/* -Copyright 2011 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include "stdint.h" -#include "ps2.h" -#include "led.h" - - -void led_set(uint8_t usb_led) -{ - uint8_t ps2_led = 0; - if (usb_led & (1< - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include -#include "action.h" -#include "print.h" -#include "util.h" -#include "debug.h" -#include "ps2.h" -#include "matrix.h" - - -static void matrix_make(uint8_t code); -static void matrix_break(uint8_t code); -static void matrix_clear(void); -#ifdef MATRIX_HAS_GHOST -static bool matrix_has_ghost_in_row(uint8_t row); -#endif - - -/* - * Matrix Array usage: - * 'Scan Code Set 2' is assigned into 256(32x8)cell matrix. - * Hmm, it is very sparse and not efficient :( - * - * Notes: - * Both 'Hanguel/English'(F1) and 'Hanja'(F2) collide with 'Delete'(E0 71) and 'Down'(E0 72). - * These two Korean keys need exceptional handling and are not supported for now. Sorry. - * - * 8bit wide - * +---------+ - * 0| | - * :| XX | 00-7F for normal codes(without E0-prefix) - * f|_________| - * 10| | - * :| E0 YY | 80-FF for E0-prefixed codes - * 1f| | (|0x80) is used as matrix position. - * +---------+ - * - * Exceptions: - * 0x83: F7(0x83) This is a normal code but beyond 0x7F. - * 0xFC: PrintScreen - * 0xFE: Pause - */ -static uint8_t matrix[MATRIX_ROWS]; -#define ROW(code) (code>>3) -#define COL(code) (code&0x07) - -// matrix positions for exceptional keys -#define F7 (0x83) -#define PRINT_SCREEN (0xFC) -#define PAUSE (0xFE) - -static bool is_modified = false; - - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -void matrix_init(void) -{ - debug_enable = true; - ps2_host_init(); - - // initialize matrix state: all keys off - for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; - - return; -} - -/* - * PS/2 Scan Code Set 2: Exceptional Handling - * - * There are several keys to be handled exceptionally. - * The scan code for these keys are varied or prefix/postfix'd - * depending on modifier key state. - * - * Keyboard Scan Code Specification: - * http://www.microsoft.com/whdc/archive/scancode.mspx - * http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/scancode.doc - * - * - * 1) Insert, Delete, Home, End, PageUp, PageDown, Up, Down, Right, Left - * a) when Num Lock is off - * modifiers | make | break - * ----------+---------------------------+---------------------- - * Ohter | | - * LShift | E0 F0 12 | E0 12 - * RShift | E0 F0 59 | E0 59 - * L+RShift | E0 F0 12 E0 F0 59 | E0 59 E0 12 - * - * b) when Num Lock is on - * modifiers | make | break - * ----------+---------------------------+---------------------- - * Other | E0 12 | E0 F0 12 - * Shift'd | | - * - * Handling: These prefix/postfix codes are ignored. - * - * - * 2) Keypad / - * modifiers | make | break - * ----------+---------------------------+---------------------- - * Ohter | | - * LShift | E0 F0 12 | E0 12 - * RShift | E0 F0 59 | E0 59 - * L+RShift | E0 F0 12 E0 F0 59 | E0 59 E0 12 - * - * Handling: These prefix/postfix codes are ignored. - * - * - * 3) PrintScreen - * modifiers | make | break - * ----------+--------------+----------------------------------- - * Other | E0 12 E0 7C | E0 F0 7C E0 F0 12 - * Shift'd | E0 7C | E0 F0 7C - * Control'd | E0 7C | E0 F0 7C - * Alt'd | 84 | F0 84 - * - * Handling: These prefix/postfix codes are ignored, and both scan codes - * 'E0 7C' and 84 are seen as PrintScreen. - * - * 4) Pause - * modifiers | make(no break code) - * ----------+-------------------------------------------------- - * Other | E1 14 77 E1 F0 14 F0 77 - * Control'd | E0 7E E0 F0 7E - * - * Handling: Both code sequences are treated as a whole. - * And we need a ad hoc 'pseudo break code' hack to get the key off - * because it has no break code. - * - */ -uint8_t matrix_scan(void) -{ - - // scan code reading states - static enum { - INIT, - F0, - E0, - E0_F0, - // Pause - E1, - E1_14, - E1_14_77, - E1_14_77_E1, - E1_14_77_E1_F0, - E1_14_77_E1_F0_14, - E1_14_77_E1_F0_14_F0, - // Control'd Pause - E0_7E, - E0_7E_E0, - E0_7E_E0_F0, - } state = INIT; - - - is_modified = false; - - // 'pseudo break code' hack - if (matrix_is_on(ROW(PAUSE), COL(PAUSE))) { - matrix_break(PAUSE); - } - - uint8_t code = ps2_host_recv(); - if (code) xprintf("%i\r\n", code); - if (!ps2_error) { - switch (state) { - case INIT: - switch (code) { - case 0xE0: - state = E0; - break; - case 0xF0: - state = F0; - break; - case 0xE1: - state = E1; - break; - case 0x83: // F7 - matrix_make(F7); - state = INIT; - break; - case 0x84: // Alt'd PrintScreen - matrix_make(PRINT_SCREEN); - state = INIT; - break; - case 0x00: // Overrun [3]p.25 - matrix_clear(); - clear_keyboard(); - print("Overrun\n"); - state = INIT; - break; - default: // normal key make - if (code < 0x80) { - matrix_make(code); - } else { - matrix_clear(); - clear_keyboard(); - xprintf("unexpected scan code at INIT: %02X\n", code); - } - state = INIT; - } - break; - case E0: // E0-Prefixed - switch (code) { - case 0x12: // to be ignored - case 0x59: // to be ignored - state = INIT; - break; - case 0x7E: // Control'd Pause - state = E0_7E; - break; - case 0xF0: - state = E0_F0; - break; - default: - if (code < 0x80) { - matrix_make(code|0x80); - } else { - matrix_clear(); - clear_keyboard(); - xprintf("unexpected scan code at E0: %02X\n", code); - } - state = INIT; - } - break; - case F0: // Break code - switch (code) { - case 0x83: // F7 - matrix_break(F7); - state = INIT; - break; - case 0x84: // Alt'd PrintScreen - matrix_break(PRINT_SCREEN); - state = INIT; - break; - case 0xF0: - matrix_clear(); - clear_keyboard(); - xprintf("unexpected scan code at F0: F0(clear and cont.)\n"); - break; - default: - if (code < 0x80) { - matrix_break(code); - } else { - matrix_clear(); - clear_keyboard(); - xprintf("unexpected scan code at F0: %02X\n", code); - } - state = INIT; - } - break; - case E0_F0: // Break code of E0-prefixed - switch (code) { - case 0x12: // to be ignored - case 0x59: // to be ignored - state = INIT; - break; - default: - if (code < 0x80) { - matrix_break(code|0x80); - } else { - matrix_clear(); - clear_keyboard(); - xprintf("unexpected scan code at E0_F0: %02X\n", code); - } - state = INIT; - } - break; - // following are states of Pause - case E1: - switch (code) { - case 0x14: - state = E1_14; - break; - default: - state = INIT; - } - break; - case E1_14: - switch (code) { - case 0x77: - state = E1_14_77; - break; - default: - state = INIT; - } - break; - case E1_14_77: - switch (code) { - case 0xE1: - state = E1_14_77_E1; - break; - default: - state = INIT; - } - break; - case E1_14_77_E1: - switch (code) { - case 0xF0: - state = E1_14_77_E1_F0; - break; - default: - state = INIT; - } - break; - case E1_14_77_E1_F0: - switch (code) { - case 0x14: - state = E1_14_77_E1_F0_14; - break; - default: - state = INIT; - } - break; - case E1_14_77_E1_F0_14: - switch (code) { - case 0xF0: - state = E1_14_77_E1_F0_14_F0; - break; - default: - state = INIT; - } - break; - case E1_14_77_E1_F0_14_F0: - switch (code) { - case 0x77: - matrix_make(PAUSE); - state = INIT; - break; - default: - state = INIT; - } - break; - // Following are states of Control'd Pause - case E0_7E: - if (code == 0xE0) - state = E0_7E_E0; - else - state = INIT; - break; - case E0_7E_E0: - if (code == 0xF0) - state = E0_7E_E0_F0; - else - state = INIT; - break; - case E0_7E_E0_F0: - if (code == 0x7E) - matrix_make(PAUSE); - state = INIT; - break; - default: - state = INIT; - } - } - - // TODO: request RESEND when error occurs? -/* - if (PS2_IS_FAILED(ps2_error)) { - uint8_t ret = ps2_host_send(PS2_RESEND); - xprintf("Resend: %02X\n", ret); - } -*/ - return 1; -} - -bool matrix_is_modified(void) -{ - return is_modified; -} - -inline -bool matrix_has_ghost(void) -{ -#ifdef MATRIX_HAS_GHOST - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - if (matrix_has_ghost_in_row(i)) - return true; - } -#endif - return false; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & (1<> 8) & 0xFF) -/* USB vendor ID for the device, low byte first. If you have registered your - * own Vendor ID, define it here. Otherwise you may use one of obdev's free - * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules! - * *** IMPORTANT NOTE *** - * This template uses obdev's shared VID/PID pair for Vendor Class devices - * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand - * the implications! - */ -#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF) -/* This is the ID of the product, low byte first. It is interpreted in the - * scope of the vendor ID. If you have registered your own VID with usb.org - * or if you have licensed a PID from somebody else, define it here. Otherwise - * you may use one of obdev's free shared VID/PID pairs. See the file - * USB-IDs-for-free.txt for details! - * *** IMPORTANT NOTE *** - * This template uses obdev's shared VID/PID pair for Vendor Class devices - * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand - * the implications! - */ -#define USB_CFG_DEVICE_VERSION 0x00, 0x01 -/* Version number of the device: Minor number first, then major number. - */ -#define USB_CFG_VENDOR_NAME 't', '.', 'm', '.', 'k', '.' -#define USB_CFG_VENDOR_NAME_LEN 6 -/* These two values define the vendor name returned by the USB device. The name - * must be given as a list of characters under single quotes. The characters - * are interpreted as Unicode (UTF-16) entities. - * If you don't want a vendor name string, undefine these macros. - * ALWAYS define a vendor name containing your Internet domain name if you use - * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for - * details. - */ -#define USB_CFG_DEVICE_NAME 'P', 'S', '/', '2', ' ', 'k', 'e', 'y', 'b', 'o', 'a', 'r', 'd', ' ', 'c', 'o', 'n', 'v', 'e', 'r', 't', 'e', 'r' -#define USB_CFG_DEVICE_NAME_LEN 23 -/* Same as above for the device name. If you don't want a device name, undefine - * the macros. See the file USB-IDs-for-free.txt before you assign a name if - * you use a shared VID/PID. - */ -/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */ -/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */ -/* Same as above for the serial number. If you don't want a serial number, - * undefine the macros. - * It may be useful to provide the serial number through other means than at - * compile time. See the section about descriptor properties below for how - * to fine tune control over USB descriptors such as the string descriptor - * for the serial number. - */ -#define USB_CFG_DEVICE_CLASS 0 -#define USB_CFG_DEVICE_SUBCLASS 0 -/* See USB specification if you want to conform to an existing device class. - * Class 0xff is "vendor specific". - */ -#define USB_CFG_INTERFACE_CLASS 3 /* HID */ -#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */ -#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */ -/* See USB specification if you want to conform to an existing device class or - * protocol. The following classes must be set at interface level: - * HID class is 3, no subclass and protocol required (but may be useful!) - * CDC class is 2, use subclass 2 and protocol 1 for ACM - */ -#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0 -/* Define this to the length of the HID report descriptor, if you implement - * an HID device. Otherwise don't define it or define it to 0. - * If you use this define, you must add a PROGMEM character array named - * "usbHidReportDescriptor" to your code which contains the report descriptor. - * Don't forget to keep the array and this define in sync! - */ - -/* #define USB_PUBLIC static */ -/* Use the define above if you #include usbdrv.c instead of linking against it. - * This technique saves a couple of bytes in flash memory. - */ - -/* ------------------- Fine Control over USB Descriptors ------------------- */ -/* If you don't want to use the driver's default USB descriptors, you can - * provide our own. These can be provided as (1) fixed length static data in - * flash memory, (2) fixed length static data in RAM or (3) dynamically at - * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more - * information about this function. - * Descriptor handling is configured through the descriptor's properties. If - * no properties are defined or if they are 0, the default descriptor is used. - * Possible properties are: - * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched - * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is - * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if - * you want RAM pointers. - * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found - * in static memory is in RAM, not in flash memory. - * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash), - * the driver must know the descriptor's length. The descriptor itself is - * found at the address of a well known identifier (see below). - * List of static descriptor names (must be declared PROGMEM if in flash): - * char usbDescriptorDevice[]; - * char usbDescriptorConfiguration[]; - * char usbDescriptorHidReport[]; - * char usbDescriptorString0[]; - * int usbDescriptorStringVendor[]; - * int usbDescriptorStringDevice[]; - * int usbDescriptorStringSerialNumber[]; - * Other descriptors can't be provided statically, they must be provided - * dynamically at runtime. - * - * Descriptor properties are or-ed or added together, e.g.: - * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18)) - * - * The following descriptors are defined: - * USB_CFG_DESCR_PROPS_DEVICE - * USB_CFG_DESCR_PROPS_CONFIGURATION - * USB_CFG_DESCR_PROPS_STRINGS - * USB_CFG_DESCR_PROPS_STRING_0 - * USB_CFG_DESCR_PROPS_STRING_VENDOR - * USB_CFG_DESCR_PROPS_STRING_PRODUCT - * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER - * USB_CFG_DESCR_PROPS_HID - * USB_CFG_DESCR_PROPS_HID_REPORT - * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver) - * - * Note about string descriptors: String descriptors are not just strings, they - * are Unicode strings prefixed with a 2 byte header. Example: - * int serialNumberDescriptor[] = { - * USB_STRING_DESCRIPTOR_HEADER(6), - * 'S', 'e', 'r', 'i', 'a', 'l' - * }; - */ - -#define USB_CFG_DESCR_PROPS_DEVICE 0 -#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC -//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0 -#define USB_CFG_DESCR_PROPS_STRINGS 0 -#define USB_CFG_DESCR_PROPS_STRING_0 0 -#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0 -#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0 -#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0 -//#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC -#define USB_CFG_DESCR_PROPS_HID 0 -#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC -//#define USB_CFG_DESCR_PROPS_HID_REPORT 0 -#define USB_CFG_DESCR_PROPS_UNKNOWN 0 - -/* ----------------------- Optional MCU Description ------------------------ */ - -/* The following configurations have working defaults in usbdrv.h. You - * usually don't need to set them explicitly. Only if you want to run - * the driver on a device which is not yet supported or with a compiler - * which is not fully supported (such as IAR C) or if you use a differnt - * interrupt than INT0, you may have to define some of these. - */ -/* #define USB_INTR_CFG MCUCR */ -/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */ -/* #define USB_INTR_CFG_CLR 0 */ -/* #define USB_INTR_ENABLE GIMSK */ -/* #define USB_INTR_ENABLE_BIT INT0 */ -/* #define USB_INTR_PENDING GIFR */ -/* #define USB_INTR_PENDING_BIT INTF0 */ -/* #define USB_INTR_VECTOR INT0_vect */ - -#endif /* __usbconfig_h_included__ */ diff --git a/converter/serialmouse_usb/Makefile b/converter/serialmouse_usb/Makefile deleted file mode 100644 index 34f550b314..0000000000 --- a/converter/serialmouse_usb/Makefile +++ /dev/null @@ -1,106 +0,0 @@ -# -# Makefile for Teensy -# -# Target file name (without extension). -TARGET = serialmouse_usb - -# Directory common source filess exist -TMK_DIR = ../../tmk_core - -# Directory keyboard dependent files exist -TARGET_DIR = . - -# project specific files -SRC = keymap.c \ - matrix.c \ - led.c - -CONFIG_H = config.h - - -# MCU name -#MCU = at90usb1287 -MCU = atmega32u4 - -# Processor frequency. -# This will define a symbol, F_CPU, in all source code files equal to the -# processor frequency in Hz. You can then use this symbol in your source code to -# calculate timings. Do NOT tack on a 'UL' at the end, this will be done -# automatically to create a 32-bit value in your source code. -# -# This will be an integer division of F_USB below, as it is sourced by -# F_USB after it has run through any CPU prescalers. Note that this value -# does not *change* the processor frequency - it should merely be updated to -# reflect the processor speed set externally so that the code can use accurate -# software delays. -F_CPU = 16000000 - - -# -# LUFA specific -# -# Target architecture (see library "Board Types" documentation). -ARCH = AVR8 - -# Input clock frequency. -# This will define a symbol, F_USB, in all source code files equal to the -# input clock frequency (before any prescaling is performed) in Hz. This value may -# differ from F_CPU if prescaling is used on the latter, and is required as the -# raw input clock is fed directly to the PLL sections of the AVR for high speed -# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' -# at the end, this will be done automatically to create a 32-bit value in your -# source code. -# -# If no clock division is performed on the input clock inside the AVR (via the -# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. -F_USB = $(F_CPU) - -# Interrupt driven control endpoint task(+60) -#OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT - - -# Boot Section Size in *bytes* -# Teensy halfKay 512 -# Teensy++ halfKay 1024 -# Atmel DFU loader 4096 -# LUFA bootloader 4096 -# USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=512 - - -# Build Options -# comment out to disable the options. -# -#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) -#MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -#EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = yes # Console for debug(+400) -#COMMAND_ENABLE = yes # Commands for debug and configuration -#NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA - - -# Serial Mouse Options -# You can choose a mouse protocol and the implementation of -# the underlying serial connection. -# -SERIAL_MOUSE_MICROSOFT_ENABLE = yes # Enable support for Microsoft-compatible mice -#SERIAL_MOUSE_MOUSESYSTEMS_ENABLE = yes # Enable support for Mousesystems-compatible mice -#SERIAL_MOUSE_USE_UART = yes # use hardware UART for serial connection -SERIAL_MOUSE_USE_SOFT = yes # use software serial implementation - -# Optional serial mouse driver features -# Support scrolling while holding the middle mouse button -# (currently only supported for Mousesystems mice): -#OPT_DEFS += -DSERIAL_MOUSE_CENTER_SCROLL - -# Optimize size but this may cause error "relocation truncated to fit" -#EXTRALDFLAGS = -Wl,--relax - -# Search Path -VPATH += $(TARGET_DIR) -VPATH += $(TMK_DIR) - -include $(TMK_DIR)/protocol.mk -include $(TMK_DIR)/protocol/lufa.mk -include $(TMK_DIR)/common.mk -include $(TMK_DIR)/rules.mk diff --git a/converter/serialmouse_usb/README.md b/converter/serialmouse_usb/README.md deleted file mode 100644 index ef8a006716..0000000000 --- a/converter/serialmouse_usb/README.md +++ /dev/null @@ -1,11 +0,0 @@ -Serial mouse converter -====================== -See https://github.com/tmk/tmk_keyboard/pull/131 - - -Supported protocols -------------------- -### Microsoft -Not tested. - -### Mousesystems diff --git a/converter/serialmouse_usb/config.h b/converter/serialmouse_usb/config.h deleted file mode 100644 index b257d997cf..0000000000 --- a/converter/serialmouse_usb/config.h +++ /dev/null @@ -1,119 +0,0 @@ -/* -Copyright 2012 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef CONFIG_H -#define CONFIG_H - -#include - -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x2222 -#define DEVICE_VER 0x0001 -#define MANUFACTURER t.m.k. -#define PRODUCT serial mouse converter -#define DESCRIPTION convert serial mouse into USB - - -/* matrix size */ -#define MATRIX_ROWS 0 -#define MATRIX_COLS 0 - - -/* key combination for command */ -#define IS_COMMAND() false - - - -#ifdef SERIAL_MOUSE_MICROSOFT - /* - * Serial(USART) configuration (for Microsoft serial mice) - * asynchronous, positive logic, 1200baud, bit order: LSB first - * 1-start bit, 7-data bit, no parity, 1-stop bit - */ - #define SERIAL_UART_BAUD 1200 - #define SERIAL_UART_DATA UDR1 - #define SERIAL_UART_UBRR ((F_CPU/(16UL*SERIAL_UART_BAUD))-1) - #define SERIAL_UART_RXD_VECT USART1_RX_vect - #define SERIAL_UART_TXD_READY (UCSR1A&(1<>8); /* baud rate */ \ - UCSR1B |= (1<>8); /* baud rate */ \ - UCSR1B |= (1< - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#include -#include -#include "keymap.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return KC_NO; -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){}; -} - diff --git a/converter/serialmouse_usb/keymap_common.c b/converter/serialmouse_usb/keymap_common.c deleted file mode 100644 index 55a13793cb..0000000000 --- a/converter/serialmouse_usb/keymap_common.c +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright 2011,2012,2013 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#include "keymap_common.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/converter/serialmouse_usb/keymap_common.h b/converter/serialmouse_usb/keymap_common.h deleted file mode 100644 index 216a8dc020..0000000000 --- a/converter/serialmouse_usb/keymap_common.h +++ /dev/null @@ -1,174 +0,0 @@ -/* -Copyright 2011,2012,2013 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#ifndef KEYMAP_COMMON_H -#define KEYMAP_COMMON_H - -#include -#include -#include -#include "keycode.h" -#include "action.h" -#include "action_macro.h" -#include "report.h" -#include "print.h" -#include "debug.h" -#include "keymap.h" - - -// 32*8(256) byte array which converts PS/2 code into USB code -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - -/* All keys */ -#define KEYMAP_ALL( \ - K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \ - K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ - K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA, K6C,K75,K7D, \ - K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K79, \ - K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \ - K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA, \ - \ - K61, /* for European ISO */ \ - K51, K13, K6A, K64, K67, /* for Japanese JIS */ \ - K08, K10, K18, K20, K28, K30, K38, K40, K48, K50, K57, K5F, /* F13-24 */ \ - KB7, KBF, KDE, /* System Power, Sleep, Wake */ \ - KA3, KB2, KA1, /* Mute, Volume Up, Volume Down */ \ - KCD, K95, KBB, KB4, KD0, /* Next, Previous, Stop, Pause, Media Select */ \ - KC8, KAB, KC0, /* Mail, Calculator, My Computer */ \ - K90, KBA, KB8, KB0, /* WWW Search, Home, Back, Forward */ \ - KA8, KA0, K98 /* WWW Stop, Refresh, Favorites */ \ -) { \ - { KC_NO, KC_##K01, KC_NO, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ - { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_NO }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_NO }, \ - { KC_##K18, KC_NO, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_NO }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_NO }, \ - { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_NO }, \ - { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_NO }, \ - { KC_##K38, KC_NO, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_NO }, \ - { KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_NO }, \ - { KC_##K48, KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D, KC_##K4E, KC_NO }, \ - { KC_##K50, KC_##K51, KC_##K52, KC_NO, KC_##K54, KC_##K55, KC_NO, KC_##K57 }, \ - { KC_##K58, KC_##K59, KC_##K5A, KC_##K5B, KC_NO, KC_##K5D, KC_NO, KC_##K5F }, \ - { KC_NO, KC_##K61, KC_NO, KC_NO, KC_##K64, KC_NO, KC_##K66, KC_##K67 }, \ - { KC_NO, KC_##K69, KC_##K6A, KC_##K6B, KC_##K6C, KC_NO, KC_NO, KC_NO }, \ - { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77 }, \ - { KC_##K78, KC_##K79, KC_##K7A, KC_##K7B, KC_##K7C, KC_##K7D, KC_##K7E, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, KC_##K83, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_##K90, KC_##K91, KC_NO, KC_NO, KC_##K94, KC_##K95, KC_NO, KC_NO }, \ - { KC_##K98, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_##K9F }, \ - { KC_##KA0, KC_##KA1, KC_NO, KC_##KA3, KC_NO, KC_NO, KC_NO, KC_##KA7 }, \ - { KC_##KA8, KC_NO, KC_NO, KC_##KAB, KC_NO, KC_NO, KC_NO, KC_##KAF }, \ - { KC_##KB0, KC_NO, KC_##KB2, KC_NO, KC_##KB4, KC_NO, KC_NO, KC_##KB7 }, \ - { KC_##KB8, KC_NO, KC_##KBA, KC_##KBB, KC_NO, KC_NO, KC_NO, KC_##KBF }, \ - { KC_##KC0, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_##KC8, KC_NO, KC_##KCA, KC_NO, KC_NO, KC_##KCD, KC_NO, KC_NO }, \ - { KC_##KD0, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_NO, KC_##KDA, KC_NO, KC_NO, KC_NO, KC_##KDE, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_##KE9, KC_NO, KC_##KEB, KC_##KEC, KC_NO, KC_NO, KC_NO }, \ - { KC_##KF0, KC_##KF1, KC_##KF2, KC_NO, KC_##KF4, KC_##KF5, KC_NO, KC_NO }, \ - { KC_NO, KC_NO, KC_##KFA, KC_NO, KC_##KFC, KC_##KFD, KC_##KFE, KC_NO }, \ -} - -/* US layout */ -#define KEYMAP( \ - K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \ - K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ - K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA, K6C,K75,K7D, \ - K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K79, \ - K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \ - K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA \ -) \ -KEYMAP_ALL( \ - K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \ - K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ - K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA, K6C,K75,K7D, \ - K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K79, \ - K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \ - K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA, \ - \ - NUBS, \ - RO, KANA, JYEN, HENK, MHEN, \ - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, \ - SYSTEM_POWER, SYSTEM_SLEEP, SYSTEM_WAKE, \ - AUDIO_MUTE, AUDIO_VOL_UP, AUDIO_VOL_DOWN, \ - MEDIA_NEXT_TRACK, MEDIA_PREV_TRACK, MEDIA_STOP, MEDIA_PLAY_PAUSE, MEDIA_SELECT, \ - MAIL, CALCULATOR, MY_COMPUTER, \ - WWW_SEARCH, WWW_HOME, WWW_BACK, WWW_FORWARD, \ - WWW_STOP, WWW_REFRESH, WWW_FAVORITES \ -) - -/* ISO layout */ -#define KEYMAP_ISO( \ - K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \ - K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ - K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B, KF1,KE9,KFA, K6C,K75,K7D, \ - K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52,K5D,K5A, K6B,K73,K74,K79, \ - K12,K61,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \ - K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA \ -) \ -KEYMAP_ALL( \ - K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \ - K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ - K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA, K6C,K75,K7D, \ - K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K79, \ - K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \ - K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA, \ - \ - K61, \ - RO, KANA, JYEN, HENK, MHEN, \ - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, \ - SYSTEM_POWER, SYSTEM_SLEEP, SYSTEM_WAKE, \ - AUDIO_MUTE, AUDIO_VOL_UP, AUDIO_VOL_DOWN, \ - MEDIA_NEXT_TRACK, MEDIA_PREV_TRACK, MEDIA_STOP, MEDIA_PLAY_PAUSE, MEDIA_SELECT, \ - MAIL, CALCULATOR, MY_COMPUTER, \ - WWW_SEARCH, WWW_HOME, WWW_BACK, WWW_FORWARD, \ - WWW_STOP, WWW_REFRESH, WWW_FAVORITES \ -) - -/* JIS layout */ -#define KEYMAP_JIS( \ - K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \ - K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K6A,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ - K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B, KF1,KE9,KFA, K6C,K75,K7D, \ - K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52,K5D, K5A, K6B,K73,K74,K79, \ - K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A,K51, K59, KF5, K69,K72,K7A, \ - K14,K9F,K11, K67,K29,K64,K13, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA \ -) \ -KEYMAP_ALL( \ - K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \ - K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ - K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA, K6C,K75,K7D, \ - K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K79, \ - K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \ - K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA, \ - \ - NUBS, \ - K51, K13, K6A, K64, K67, \ - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, \ - SYSTEM_POWER, SYSTEM_SLEEP, SYSTEM_WAKE, \ - AUDIO_MUTE, AUDIO_VOL_UP, AUDIO_VOL_DOWN, \ - MEDIA_NEXT_TRACK, MEDIA_PREV_TRACK, MEDIA_STOP, MEDIA_PLAY_PAUSE, MEDIA_SELECT, \ - MAIL, CALCULATOR, MY_COMPUTER, \ - WWW_SEARCH, WWW_HOME, WWW_BACK, WWW_FORWARD, \ - WWW_STOP, WWW_REFRESH, WWW_FAVORITES \ -) - -#endif diff --git a/converter/serialmouse_usb/led.c b/converter/serialmouse_usb/led.c deleted file mode 100644 index f76545f0ba..0000000000 --- a/converter/serialmouse_usb/led.c +++ /dev/null @@ -1,24 +0,0 @@ -/* -Copyright 2011 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include "stdint.h" -#include "led.h" - - -void led_set(uint8_t usb_led) -{ -} diff --git a/converter/serialmouse_usb/matrix.c b/converter/serialmouse_usb/matrix.c deleted file mode 100644 index 0e0d87f80e..0000000000 --- a/converter/serialmouse_usb/matrix.c +++ /dev/null @@ -1,83 +0,0 @@ -/* -Copyright 2011 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include -#include -#include -#include "action.h" -#include "print.h" -#include "util.h" -#include "debug.h" -#include "matrix.h" - - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -void matrix_init(void) -{ - debug_enable = true; - debug_mouse=true; - return; -} - -uint8_t matrix_scan(void) -{ - return 0; -} - -bool matrix_is_modified(void) -{ - return false; -} - -inline -bool matrix_has_ghost(void) -{ - return false; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return false; -} - -inline -uint8_t matrix_get_row(uint8_t row) -{ - return 0; -} - -void matrix_print(void) -{ -} - -uint8_t matrix_key_count(void) -{ - return 0; -} diff --git a/converter/sun_usb/Makefile b/converter/sun_usb/Makefile deleted file mode 100644 index f046bfdd36..0000000000 --- a/converter/sun_usb/Makefile +++ /dev/null @@ -1,85 +0,0 @@ -# Target file name (without extension). -TARGET = sun_usb - -# Directory common source filess exist -TMK_DIR = ../../tmk_core - -# Directory keyboard dependent files exist -TARGET_DIR = . - -# keyboard dependent files -SRC = keymap.c \ - matrix.c \ - led.c \ - command_extra.c \ - protocol/serial_soft.c - -CONFIG_H = config.h - - -# MCU name, you MUST set this to match the board you are using -# type "make clean" after changing this, so all files will be rebuilt -#MCU = at90usb162 # Teensy 1.0 -#MCU = atmega32u4 # Teensy 2.0 -#MCU = at90usb646 # Teensy++ 1.0 -#MCU = at90usb1286 # Teensy++ 2.0 -MCU = atmega32u2 - - -# Processor frequency. -# Normally the first thing your program should do is set the clock prescaler, -# so your program will run at the correct speed. You should also set this -# variable to same clock speed. The _delay_ms() macro uses this, and many -# examples use this variable to calculate timings. Do not add a "UL" here. -F_CPU = 16000000 - - -# -# LUFA specific -# -# Target architecture (see library "Board Types" documentation). -ARCH = AVR8 - -# Input clock frequency. -# This will define a symbol, F_USB, in all source code files equal to the -# input clock frequency (before any prescaling is performed) in Hz. This value may -# differ from F_CPU if prescaling is used on the latter, and is required as the -# raw input clock is fed directly to the PLL sections of the AVR for high speed -# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' -# at the end, this will be done automatically to create a 32-bit value in your -# source code. -# -# If no clock division is performed on the input clock inside the AVR (via the -# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. -F_USB = $(F_CPU) - -# Interrupt driven control endpoint task -OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT - - -# Build Options -# *Comment out* to disable the options. -# -MOUSEKEY_ENABLE = yes # Mouse keys -EXTRAKEY_ENABLE = yes # Audio control and System control -CONSOLE_ENABLE = yes # Console for debug -COMMAND_ENABLE = yes # Commands for debug and configuration -#NKRO_ENABLE = yes # USB Nkey Rollover - - -# Boot Section Size in bytes -# Teensy halfKay 512 -# Atmel DFU loader 4096 -# LUFA bootloader 4096 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 - - -# Search Path -VPATH += $(TARGET_DIR) -VPATH += $(TMK_DIR) - - -include $(TMK_DIR)/protocol/lufa.mk -include $(TMK_DIR)/protocol.mk -include $(TMK_DIR)/common.mk -include $(TMK_DIR)/rules.mk diff --git a/converter/sun_usb/README b/converter/sun_usb/README deleted file mode 100644 index 98340dd315..0000000000 --- a/converter/sun_usb/README +++ /dev/null @@ -1,106 +0,0 @@ -Sun to USB keyboard protocol converter -====================================== -Target MCU is ATMega32u4 but other USB capable AVR will also work. - -This converter will work with Sun Type 2-5 Keyboards. - - -Tested on: -Sun Type 3 Keyboard: http://blog.daveastels.com.s3-website-us-west-2.amazonaws.com/2014/12/27/type-3-keyboard.html -CTCSP SHORT TYPE KEYBOARD(Type 5): http://imgur.com/a/QIv6p - - -Keymap of Type 3(keymap_sun3.c) were impoted from dastels's repository. -https://github.com/dastels/tmk_keyboard/tree/master/converter/sun3_usb - - - -Connector ---------- - 8Pin mini DIN - ___ ___ - / |_| \ - / 8 7 6 \ - | 5 4 3 | - \_ 2 1 _/ - \_____/ - (receptacle) - - Wiring: - Pin mini DIN MCU - ---------------------------------- - 1 GND GND - 2 GND GND - 3 5V - 4 RX/TX(Mouse) - 5 RX PD3 - 6 TX PD2 - 7 GND GND - 8 5V VCC - - -Protocol --------- -Signal: Asynchronous, Negative logic, 1200baud, No Flow control -Frame format: 1-Start bit, 8-Data bits, No-Parity, 1-Stop bit - - AVR USART engine expects positive logic while Sun keyboard signal is negative. - To use AVR UART engine you need external inverter in front of RX and TX pin. - Otherwise you can software serial routine to communicate the keyboard. - -This converter uses software method, you doesn't need any inverter part. - - -Commands From System To Keyboard - 0x01 Reset - Keyboard responds with following byte sequence: - Success: 0xFF 0x04 0x7F - Fail: 0x7E 0x01 0x7F - 0x02 Bell On - 0x03 Bell Off - 0x0A Click On - 0x0B Click Off - 0x0E LED - followed by LED status byte: - bit: 3 2 1 0 - LED: CapsLk ScrLk Compose NumLk - 0x0F Layout - Keyboard responds with 'Layout Response' 0xFE 0xXX - -Commands From Keyboard To System - 0x7F Idle - means no keys pressed. - 0xFE Layout Response - 0xFF Reset Response(followed by 0x04) - -Reference - http://kentie.net/article/sunkbd/page2.htm - http://kentie.net/article/sunkbd/KBD.pdf - - -Build Firmware --------------- -Just use 'make' - $ cd sun_usb - $ make -Then, load the binary to MCU with your favorite programmer. - - -Sun commands ------------- -You can send Sun protocol commands with TMK `Magic` key combo. By default `Magic` key is `LShift` + `RShift`, `LAlt` + `RAlt' or `LMeta` + `RMeta`. -https://github.com/tmk/tmk_keyboard#magic-commands - -Following Sun specific commands are available. For example, to send 'Bell On' you can press `LShift` + `RShift` + `Up` keys simultaneously. - -``` ------ Sun converter Help ----- -Up: Bell On -Down: Bell Off -Left: Click On -Right: Click Off -PgUp: LED all On -PgDown: LED all On -Insert: Layout -Delete: Reset -``` diff --git a/converter/sun_usb/command_extra.c b/converter/sun_usb/command_extra.c deleted file mode 100644 index aba3fe6da3..0000000000 --- a/converter/sun_usb/command_extra.c +++ /dev/null @@ -1,61 +0,0 @@ -#include "stdbool.h" -#include "stdint.h" -#include "keycode.h" -#include "serial.h" -#include "print.h" -#include "command.h" - -bool command_extra(uint8_t code) -{ - switch (code) { - case KC_H: - case KC_SLASH: /* ? */ - print("\n\n----- Sun converter Help -----\n"); - print("Up: Bell On\n"); - print("Down: Bell Off\n"); - print("Left: Click On\n"); - print("Right: Click Off\n"); - print("PgUp: LED all On\n"); - print("PgDown: LED all On\n"); - print("Insert: Layout\n"); - print("Delete: Reset\n"); - return false; - case KC_DEL: - print("Reset\n"); - serial_send(0x01); - break; - case KC_UP: - print("Bell On\n"); - serial_send(0x02); - break; - case KC_DOWN: - print("Bell Off\n"); - serial_send(0x03); - break; - case KC_LEFT: - print("Click On\n"); - serial_send(0x0A); - break; - case KC_RIGHT: - print("Click Off\n"); - serial_send(0x0B); - break; - case KC_PGUP: - print("LED all on\n"); - serial_send(0x0E); - serial_send(0xFF); - break; - case KC_PGDOWN: - print("LED all off\n"); - serial_send(0x0E); - serial_send(0x00); - break; - case KC_INSERT: - print("layout\n"); - serial_send(0x0F); - break; - default: - return false; - } - return true; -} diff --git a/converter/sun_usb/config.h b/converter/sun_usb/config.h deleted file mode 100644 index 66036da931..0000000000 --- a/converter/sun_usb/config.h +++ /dev/null @@ -1,95 +0,0 @@ -/* -Copyright 2012 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef CONFIG_H -#define CONFIG_H - -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x3333 -#define DEVICE_VER 0x0100 -#define MANUFACTURER t.m.k. -#define PRODUCT Sun keyboard converter -#define DESCRIPTION converts Sun keyboard protocol into USB - -/* matrix size */ -#define MATRIX_ROWS 16 -#define MATRIX_COLS 8 - -/* key combination for command */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT)) || \ - keyboard_report->mods == (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI)) || \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ -) - -/* legacy keymap support */ -#define USE_LEGACY_KEYMAP - - -/* Serial(USART) configuration - * asynchronous, negative logic, 1200baud, no flow control - * 1-start bit, 8-data bit, non parity, 1-stop bit - */ -#define SERIAL_SOFT_BAUD 1200 -#define SERIAL_SOFT_PARITY_NONE -#define SERIAL_SOFT_BIT_ORDER_LSB -#define SERIAL_SOFT_LOGIC_NEGATIVE -/* RXD Port */ -#define SERIAL_SOFT_RXD_ENABLE -#define SERIAL_SOFT_RXD_DDR DDRD -#define SERIAL_SOFT_RXD_PORT PORTD -#define SERIAL_SOFT_RXD_PIN PIND -#define SERIAL_SOFT_RXD_BIT 2 -#define SERIAL_SOFT_RXD_VECT INT2_vect -/* RXD Interupt */ -#ifdef SERIAL_SOFT_LOGIC_NEGATIVE -/* enable interrupt: INT2(rising edge) */ -#define INTR_TRIG_EDGE ((1< - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include -#include -#include "keycode.h" -#include "util.h" -#include "keymap.h" - - - - -/* Sun type 5 keyboard -,-------. ,---, ,---------------. ,---------------. ,---------------. ,-----------. ,---------------. -| 76 | | | | 05| 06| 08| 0A| | 0C| 0E| 10| 11| | 12| 07| 09| 0B| | 16| 17| 15| | 2D| 02| 04| 30| -`-------' `---' `---------------' `---------------' `---------------' `-----------' `---------------' -,-------. ,-----------------------------------------------------------. ,-----------. ,---------------. -| 01| 03| | 1D| 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| 28| 29| 58| 2A| | 2C| 34| 60| | 62| 2E| 2F| 47| -|-------| |-----------------------------------------------------------| |------------ |---------------| -| 19| 1A| | 35 | 36| 37| 38| 39| 3A| 3B| 3C| 3D| 3E| 3F| 40| 41| 2B | | 42| 4A| 7B| | 44| 45| 46| | -|-------| |-----------------------------------------------------------| `-----------' |-----------| 7D| -| 31| 33| | 4C | 4D| 4E| 4F| 50| 51| 52| 53| 54| 55| 56| 57| 59 | | 5B| 5C| 5D| | -|-------| |-----------------------------------------------------------| ,---. |-----------|---| -| 48| 49| | 63 | 64| 65| 66| 67| 68| 69| 6A| 6B| 6C| 6D| 6E | | 14| | 70| 71| 72| | -|-------| |-----------------------------------------------------------| .-----------. |-----------| 5A| -| 5F| 61| | 77 | 13| 78 |*73 | 79 |*74 |*75| 7A | 43| 0D| | 18| 1B| 1C| | 5E | 32| | -`-------' `-----------------------------------------------------------' `-----------' `---------------' -*/ -#define KEYMAP( \ - K76, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, K16,K17,K15, K2D,K02,K04,K30, \ - K01,K03, K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K58,K2A, K2C,K34,K60, K62,K2E,K2F,K47, \ - K19,K1A, K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K2B, K42,K4A,K7B, K44,K45,K46,K7D, \ - K31,K33, K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, K5B,K5C,K5D, \ - K48,K49, K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K6E, K14, K70,K71,K72,K5A, \ - K5F,K61, K77,K13, K78, K73, K79, K74, K75, K7A, K43, K0D, K18,K1B,K1C, K5E, K32 \ -) { \ - { KC_NO, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ - { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_NO, }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ - { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ - { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \ - { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37 }, \ - { KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_##K3F }, \ - { KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_##K47 }, \ - { KC_##K48, KC_##K49, KC_##K4A, KC_NO, KC_##K4C, KC_##K4D, KC_##K4E, KC_##K4F }, \ - { KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ - { KC_##K58, KC_##K59, KC_##K5A, KC_##K5B, KC_##K5C, KC_##K5D, KC_##K5E, KC_##K5F }, \ - { KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67 }, \ - { KC_##K68, KC_##K69, KC_##K6A, KC_##K6B, KC_##K6C, KC_##K6D, KC_##K6E, KC_NO }, \ - { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77 }, \ - { KC_##K78, KC_##K79, KC_##K7A, KC_##K7B, KC_NO, KC_##K7D, KC_NO, KC_NO } \ -} - -/* CTCSP SHORT TYPE KEYBOARD */ -#define SHORT_TYPE( \ - K01, K05,K06,K08,K0A,K0C,K0E, K61,K49,K33, K30, K2C,K34,K60, \ - K10,K11,K12,K07,K09,K0B, K42,K4A,K7B, \ - K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K58,K2A, \ - K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K2B, \ - K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, \ - K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K0D,K14,K6E, \ - K77,K13, K78, K79, K7A,K43,K62,K18,K1B,K1C \ -) KEYMAP( \ - HELP, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, PSCR,SLCK,PAUS, MUTE,VOLD,VOLU,K30, \ - K01, AGAIN, K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K58,K2A, K2C, K34, K60, K62, PSLS,PAST,PMNS, \ - MENU, UNDO, K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K2B, K42, K4A, K7B, P7, P8, P9, PPLS, \ - SELECT, K33, K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, P4, P5, P6, \ - EXECUTE,K49, K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K6E, K14, P1, P2, P3, PENT, \ - FIND, K61, K77,K13, K78, HENK, K79, MHEN, KANA, K7A,K43,K0D, K18, K1B, K1C, P0, PDOT \ -) - - -// Assign Fn key(0-7) to a layer to which switch with the Fn key pressed. -static const uint8_t PROGMEM fn_layer[] = { - 2, // Fn0 - 3, // Fn1 - 4, // Fn2 - 0, // Fn3 - 0, // Fn4 - 0, // Fn5 - 0, // Fn6 - 0 // Fn7 -}; - -// Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer. -// See layer.c for details. -static const uint8_t PROGMEM fn_keycode[] = { - KC_NO, // Fn0 - KC_SCLN, // Fn1 - KC_SLSH, // Fn2 - KC_NO, // Fn3 - KC_NO, // Fn4 - KC_NO, // Fn5 - KC_NO, // Fn6 - KC_NO // Fn7 -}; - - -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* - KEYMAP( - HELP, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10,F11,F12, PSCR,SLCK,PAUS, MUTE,VOLD,VOLU,PWR, - STOP, AGAIN, ESC,1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - MENU, UNDO, TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSPC, DEL, END, PGDN, P7, P8, P9, PPLS, - SELECT, COPY, LCTL, A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, - EXECUTE,PASTE, LSFT, Z, X, C, V, B, N, M, COMM,DOT,SLSH, RSFT, UP, P1, P2, P3, PENT, - FIND, CUT, CAPS, LALT, LGUI,HENK, SPC, MHEN,KANA,RGUI,APP, RALT, LEFT,DOWN,RGHT, P0, PDOT - ), -*/ - // 0: default - SHORT_TYPE( - STOP, F1,F2,F3,F4, F5, F6, CUT,PASTE,COPY,PWR, INS, HOME,PGUP, - F7,F8,F9,F10,F11,F12, DEL, END, PGDN, - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSPC, - LCTL, A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, - LSFT, Z, X, C, V, B, N, M, COMM,DOT, SLSH, RALT,UP, RSFT, - CAPS,LALT,LGUI, SPC, RGUI,APP, NLCK,LEFT,DOWN,RGHT - ), - // 1: with layer keys - SHORT_TYPE( - ESC, F1,F2,F3,F4, F5, F6, CUT,PASTE,COPY,PWR, INS, HOME,PGUP, - F7,F8,F9,F10,F11,F12, DEL, END, PGDN, - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSPC, - LCTL, A, S, D, F, G, H, J, K, L, FN1, QUOT, ENT, - LSFT, Z, X, C, V, B, N, M, COMM,DOT, FN2, RSFT,UP, FN0, - CAPS,LALT,LGUI, SPC, RGUI,RALT,FN0, LEFT,DOWN,RGHT - ), - // 2: HHKB - SHORT_TYPE( - ESC, F1,F2,F3,F4, F5, F6, CUT,PASTE,COPY,PWR, INS, HOME,PGUP, - F7,F8,F9,F10,F11,F12, DEL, END, PGDN, - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, - CAPS, NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,PAUS,UP, NO, BSPC, - LCTL, VOLD,VOLU,MUTE,NO, NO, NO, NO, HOME,PGUP,LEFT,RGHT, ENT, - LSFT, Z, X, C, V, B, NO, NO, END, PGDN,DOWN, RSFT,PGUP,FN0, - CAPS,LALT,LGUI, SPC, RGUI,RALT,FN0, HOME,PGDN,END - ), - // 3: Mousekey - SHORT_TYPE( - ESC, F1,F2,F3,F4, F5, F6, CUT,PASTE,COPY,PWR, INS, HOME,PGUP, - F7,F8,F9,F10,F11,F12, DEL, END, PGDN, - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, - CAPS, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, - LCTL, NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,FN1, NO, ENT, - LSFT, NO, NO, NO, NO, BTN3,BTN2,BTN1,NO, NO, NO, RSFT,UP, NO, - CAPS,LALT,LGUI, BTN1, RGUI,RALT,NO, LEFT,DOWN,RGHT - ), - // 4: Cursor - SHORT_TYPE( - ESC, F1,F2,F3,F4, F5, F6, CUT,PASTE,COPY,PWR, INS, HOME,PGUP, - F7,F8,F9,F10,F11,F12, DEL, END, PGDN, - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, - CAPS, NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, NO, NO, NO, BSPC, - LCTL, NO, NO, NO, NO, NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, - LSFT, NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN2, RSFT,UP, NO, - CAPS,LALT,LGUI, BTN1, RGUI,RALT,NO, LEFT,DOWN,RGHT - ), -}; - - -uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) -{ - return pgm_read_byte(&keymaps[(layer)][(row)][(col)]); -} - -uint8_t keymap_fn_layer(uint8_t index) -{ - return pgm_read_byte(&fn_layer[index]); -} - -uint8_t keymap_fn_keycode(uint8_t index) -{ - return pgm_read_byte(&fn_keycode[index]); -} diff --git a/converter/sun_usb/keymap_sun3.c b/converter/sun_usb/keymap_sun3.c deleted file mode 100644 index 273cd9442f..0000000000 --- a/converter/sun_usb/keymap_sun3.c +++ /dev/null @@ -1,173 +0,0 @@ -/* -Copyright 2012 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include -#include -#include "keycode.h" -#include "util.h" -#include "keymap.h" - - -/* Sun type 3 keyboard -,-------. ,-----------------------------------------------------------. ,-----------. -| 01| 03| | 05| 06| 08| 0A| 0C| 0E| 10| 11| 12| 2B| | 15| 16| 17| -|-------| |-----------------------------------------------------------| |-----------| -| 19| 1A| | 1D| 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| 28| 29| 58| 2A| | 2D| 2E| 2F| -|-------| |-----------------------------------------------------------| |-----------| -| 31| 33| | 35 | 36| 37| 38| 39| 3A| 3B| 3C| 3D| 3E| 3F| 40| 41| 42 | | 44| 45| 46| -|-------| |-----------------------------------------------------------| |-----------| -| 48| 49| | 4C | 4D| 4E| 4F| 50| 51| 52| 53| 54| 55| 56| 57| 59 | | 5B| 5C| 5D| -|-------| |-----------------------------------------------------------| |-----------| -| 5F| 61| | 63 | 64| 65| 66| 67| 68| 69| 6A| 6B| 6C| 6D| 6E| 6F| | 70| 71| 72| -`-------' |-----------------------------------------------------------| `-----------' - | 77 | 78 | 79 | 7A | 13 | - `-----------------------------------------------------------' -*/ - - -#define KEYMAP( \ - K01,K03, K05,K06, K08, K0A, K0C, K0E, K10,K11,K12,K2B, K15,K16,K17, \ - K19,K1A, K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K58,K2A, K2D,K2E,K2F, \ - K31,K33, K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K42, K44,K45,K46, \ - K48,K49, K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, K5B,K5C,K5D, \ - K5F,K61, K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K6E,K6F, K70,K71,K72, \ - K77,K78, K79, K7A,K13 \ -) { \ - { KC_NO, KC_##K01, KC_NO, KC_##K03, KC_NO, KC_##K05, KC_##K06, KC_NO }, \ - { KC_##K08, KC_NO, KC_##K0A, KC_NO, KC_##K0C, KC_NO, KC_##K0E, KC_NO }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_NO, KC_##K15, KC_##K16, KC_##K17 }, \ - { KC_NO, KC_##K19, KC_##K1A, KC_NO, KC_NO, KC_##K1D, KC_##K1E, KC_##K1F }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ - { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_NO, KC_##K2D, KC_##K2E, KC_##K2F }, \ - { KC_NO, KC_##K31, KC_NO, KC_##K33, KC_NO, KC_##K35, KC_##K36, KC_##K37 }, \ - { KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_##K3F }, \ - { KC_##K40, KC_##K41, KC_##K42, KC_NO, KC_##K44, KC_##K45, KC_##K46, KC_NO }, \ - { KC_##K48, KC_##K49, KC_NO, KC_NO, KC_##K4C, KC_##K4D, KC_##K4E, KC_##K4F }, \ - { KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ - { KC_##K58, KC_##K59, KC_NO, KC_##K5B, KC_##K5C, KC_##K5D, KC_NO, KC_##K5F }, \ - { KC_NO, KC_##K61, KC_NO, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67 }, \ - { KC_##K68, KC_##K69, KC_##K6A, KC_##K6B, KC_##K6C, KC_##K6D, KC_##K6E, KC_##K6F }, \ - { KC_##K70, KC_##K71, KC_##K72, KC_NO, KC_NO, KC_NO, KC_NO, KC_##K77 }, \ - { KC_##K78, KC_##K79, KC_##K7A, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ -} - -// Assign Fn key(0-7) to a layer to which switch with the Fn key pressed. -static const uint8_t PROGMEM fn_layer[] = { - 2, // Fn0 - 3, // Fn1 - 4, // Fn2 - 0, // Fn3 - 0, // Fn4 - 0, // Fn5 - 0, // Fn6 - 0 // Fn7 -}; - -// Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer. -// See layer.c for details. -static const uint8_t PROGMEM fn_keycode[] = { - KC_NO, // Fn0 - KC_SCLN, // Fn1 - KC_SLSH, // Fn2 - KC_NO, // Fn3 - KC_NO, // Fn4 - KC_NO, // Fn5 - KC_NO, // Fn6 - KC_NO // Fn7 -}; - - -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - KEYMAP( - F10, F11, F1, F2, F3, F4, F5, F6, F7, F8, F9, BSPC, VOLD, MUTE, VOLU, - F12, F13, ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0,MINS, EQL, BSLS, GRV, MPRV, MPLY, MNXT, - F14, F15, TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, DEL, HOME, UP, PGUP, - F16, F17, LCTL, A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, LEFT, INSERT, RIGHT, - F18, F19, LSFT, Z, X, C, V, B, N, M, COMM,DOT,SLSH, RSFT,RCTL, END, DOWN, PGDOWN, - LGUI, LALT, SPC, RALT,RGUI - ), - /* - // 0: default - SHORT_TYPE( - STOP, F1,F2,F3,F4, F5, F6, CUT,PASTE,COPY,PWR, INS, HOME,PGUP, - F7,F8,F9,F10,F11,F12, DEL, END, PGDN, - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSPC, - LCTL, A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, - LSFT, Z, X, C, V, B, N, M, COMM,DOT, SLSH, RALT,UP, RSFT, - CAPS,LALT,LGUI, SPC, RGUI,APP, NLCK,LEFT,DOWN,RGHT - ), - // 1: with layer keys - SHORT_TYPE( - ESC, F1,F2,F3,F4, F5, F6, CUT,PASTE,COPY,PWR, INS, HOME,PGUP, - F7,F8,F9,F10,F11,F12, DEL, END, PGDN, - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSPC, - LCTL, A, S, D, F, G, H, J, K, L, FN1, QUOT, ENT, - LSFT, Z, X, C, V, B, N, M, COMM,DOT, FN2, RSFT,UP, FN0, - CAPS,LALT,LGUI, SPC, RGUI,RALT,FN0, LEFT,DOWN,RGHT - ), - // 2: HHKB - SHORT_TYPE( - ESC, F1,F2,F3,F4, F5, F6, CUT,PASTE,COPY,PWR, INS, HOME,PGUP, - F7,F8,F9,F10,F11,F12, DEL, END, PGDN, - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, - CAPS, NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,PAUS,UP, NO, BSPC, - LCTL, VOLD,VOLU,MUTE,NO, NO, NO, NO, HOME,PGUP,LEFT,RGHT, ENT, - LSFT, Z, X, C, V, B, NO, NO, END, PGDN,DOWN, RSFT,PGUP,FN0, - CAPS,LALT,LGUI, SPC, RGUI,RALT,FN0, HOME,PGDN,END - ), - // 3: Mousekey - SHORT_TYPE( - ESC, F1,F2,F3,F4, F5, F6, CUT,PASTE,COPY,PWR, INS, HOME,PGUP, - F7,F8,F9,F10,F11,F12, DEL, END, PGDN, - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, - CAPS, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, - LCTL, NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,FN1, NO, ENT, - LSFT, NO, NO, NO, NO, BTN3,BTN2,BTN1,NO, NO, NO, RSFT,UP, NO, - CAPS,LALT,LGUI, BTN1, RGUI,RALT,NO, LEFT,DOWN,RGHT - ), - // 4: Cursor - SHORT_TYPE( - ESC, F1,F2,F3,F4, F5, F6, CUT,PASTE,COPY,PWR, INS, HOME,PGUP, - F7,F8,F9,F10,F11,F12, DEL, END, PGDN, - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, - CAPS, NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, NO, NO, NO, BSPC, - LCTL, NO, NO, NO, NO, NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, - LSFT, NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN2, RSFT,UP, NO, - CAPS,LALT,LGUI, BTN1, RGUI,RALT,NO, LEFT,DOWN,RGHT - ), - */ -}; - - -uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) -{ - return pgm_read_byte(&keymaps[(layer)][(row)][(col)]); -} - -uint8_t keymap_fn_layer(uint8_t index) -{ - return pgm_read_byte(&fn_layer[index]); -} - -uint8_t keymap_fn_keycode(uint8_t index) -{ - return pgm_read_byte(&fn_keycode[index]); -} diff --git a/converter/sun_usb/led.c b/converter/sun_usb/led.c deleted file mode 100644 index 809398faa5..0000000000 --- a/converter/sun_usb/led.c +++ /dev/null @@ -1,35 +0,0 @@ -/* -Copyright 2012 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include "stdint.h" -#include "serial.h" -#include "led.h" -#include "debug.h" - - -void led_set(uint8_t usb_led) -{ - uint8_t sun_led = 0; - if (usb_led & (1< - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include -#include -#include -#include "print.h" -#include "util.h" -#include "matrix.h" -#include "debug.h" -#include "protocol/serial.h" - - -/* - * Matrix Array usage: - * - * ROW: 16(4bits) - * COL: 8(3bits) - * - * 8bit wide - * +---------+ - * 0|00 ... 07| - * 1|08 ... 0F| - * :| ... | - * :| ... | - * E|70 ... 77| - * F|78 ... 7F| - * +---------+ - */ -static uint8_t matrix[MATRIX_ROWS]; -#define ROW(code) ((code>>3)&0xF) -#define COL(code) (code&0x07) - -static bool is_modified = false; - - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -void matrix_init(void) -{ - DDRD |= (1<<6); - PORTD |= (1<<6); - //debug_enable = true; - - serial_init(); - - // initialize matrix state: all keys off - for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; - - // wait for keyboard coming up - // otherwise LED status update fails - print("Reseting "); - while (1) { - print("."); - while (serial_recv()); - serial_send(0x01); - _delay_ms(500); - if (serial_recv() == 0xFF) { - _delay_ms(500); - if (serial_recv() == 0x04) - break; - } - } - print(" Done\n"); - return; -} - -uint8_t matrix_scan(void) -{ - is_modified = false; - - uint8_t code; - code = serial_recv(); - if (!code) return 0; - - debug_hex(code); debug(" "); - - switch (code) { - case 0xFF: // reset success: FF 04 - print("reset: "); - _delay_ms(500); - code = serial_recv(); - xprintf("%02X\n", code); - if (code == 0x04) { - // LED status - led_set(host_keyboard_leds()); - } - return 0; - case 0xFE: // layout: FE - print("layout: "); - _delay_ms(500); - xprintf("%02X\n", serial_recv()); - return 0; - case 0x7E: // reset fail: 7E 01 - print("reset fail: "); - _delay_ms(500); - xprintf("%02X\n", serial_recv()); - return 0; - case 0x7F: - // all keys up - for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; - return 0; - } - - if (code&0x80) { - // break code - if (matrix_is_on(ROW(code), COL(code))) { - matrix[ROW(code)] &= ~(1< - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef CONFIG_H -#define CONFIG_H - - -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x6535 -#define DEVICE_VER 0x0100 -#define MANUFACTURER t.m.k. -#define PRODUCT 70% IBM Terminal Keyboard Converter w/ Bluetooth -#define DESCRIPTION USB converter for IBM Terminal Keyboard w/ Bluetooth - - -/* matrix size */ -#define MATRIX_ROWS 17 // keycode bit: 3-0 -#define MATRIX_COLS 8 // keycode bit: 6-4 - - -/* legacy keymap support */ -// #define USE_LEGACY_KEYMAP - - -/* key combination for command */ -#define IS_COMMAND() ( \ - (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) || \ - (keyboard_report->mods == (MOD_BIT(KC_RALT) | MOD_BIT(KC_RCTL))) \ -) - -/* USART configuration - * asynchronous, 9600baud, 8-data bit, non parity, 1-stop bit, no flow control - */ -#ifdef __AVR_ATmega32U4__ - #define SERIAL_UART_BAUD 9600 - #define SERIAL_UART_DATA UDR1 - #define SERIAL_UART_UBRR ((F_CPU/(16UL*SERIAL_UART_BAUD))-1) - #define SERIAL_UART_RXD_VECT USART1_RX_vect - #define SERIAL_UART_TXD_READY (UCSR1A&(1<>8); /* baud rate */ \ - UCSR1B = (1< - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include -#include -#include "keycode.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "keymap.h" - - - - -/* - * IBM Terminal keyboard 6110345(122keys)/1392595(102keys) - * http://geekhack.org/showthread.php?10737-What-Can-I-Do-With-a-Terminal-Model-M - * http://www.seasip.info/VintagePC/ibm_1391406.html - * - * Keymap array: - * 8 bytes - * +---------+ - * 0| | - * :| | 0x00-0x87 - * ;| | - * 17| | - * +---------+ - */ -#define KEYMAP( \ - K08,K10,K18,K20,K28,K30,K38,K40,K48,K50,K57,K5F, \ - K07,K0F,K17,K1F,K27,K2F,K37,K3F,K47,K4F,K56,K5E, \ - \ - K05,K06, K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K5D,K66, K67,K6E,K6F, K76,K77,K7E,K84, \ - K04,K0C, K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B, K5C, K64,K65,K6D, K6C,K75,K7D,K7C, \ - K03,K0B, K14,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K53,K5A, K63, K6B,K73,K74,K7B, \ - K83,K0A, K12,K13,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K51,K59, K61,K62,K6A, K69,K72,K7A,K79, \ - K01,K09, K11, K19, K29, K39, K58, K60, K68,K70,K71,K78 \ -) { \ - { KC_NO, KC_##K01, KC_NO, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ - { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ - { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ - { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \ - { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37 }, \ - { KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_##K3F }, \ - { KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_##K47 }, \ - { KC_##K48, KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D, KC_##K4E, KC_##K4F }, \ - { KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ - { KC_##K58, KC_##K59, KC_##K5A, KC_##K5B, KC_##K5C, KC_##K5D, KC_##K5E, KC_##K5F }, \ - { KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67 }, \ - { KC_##K68, KC_##K69, KC_##K6A, KC_##K6B, KC_##K6C, KC_##K6D, KC_##K6E, KC_##K6F }, \ - { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77 }, \ - { KC_##K78, KC_##K79, KC_##K7A, KC_##K7B, KC_##K7C, KC_##K7D, KC_##K7E, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, KC_##K83, KC_##K84, KC_NO, KC_NO, KC_NO, }, \ -} - -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: default - * ,---. ,---------------. ,---------------. ,---------------. ,-----------. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| - * `---' `---------------' `---------------' `---------------' `-----------' - * ,-----------------------------------------------------------. ,-----------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \|BS | |Ins|Hom|PgU| |NmL| /| *| -| - * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|End|PgD| | 7| 8| 9| | - * |-----------------------------------------------------------| `-----------' |-----------| +| - * |CapsLo| A| S| D| F| G| H| J| K| L| ;| '| #|Retu| | 4| 5| 6| | - * |-----------------------------------------------------------| ,---. |---------------| - * |Shif| \| Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3| | - * |-----------------------------------------------------------| ,-----------. |-----------|Ent| - * |Ctrl| |Alt | Space |Alt | |Ctrl| |Lef|Dow|Rig| | 0| .| | - * `----' `---------------------------------------' `----' `-----------' `---------------' - */ -/* - KEYMAP( - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, - F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, - - PSCR,ESC, GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - SLCK,INT4, TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSLS, DEL, END, PGDN, P7, P8, P9, PPLS, - PAUS,INT5, CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, NUHS,ENT, UP, P4, P5, P6, PCMM, - APP, INT6, LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RO, RSFT, LEFT,INT2,RGHT, P1, P2, P3, PENT, - RGUI,LGUI, LCTL, LALT, SPC, RALT, RCTL, DOWN, NO, P0, PDOT,NO - ), -*/ - /* - KEYMAP( - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, - - TRNS,TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, - TRNS,TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, - TRNS,TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, - TRNS,TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, - TRNS,TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,TRNS,TRNS,TRNS - ), - */ - // pseudo ANSI - - KEYMAP( - FN0, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, - PSCR,PAUS,PGUP,PGDN,HOME,END, INS, DEL, LEFT,DOWN,UP, RGHT, - - NO, NO, ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, GRV, BSPC, NO, NO, NO, NO, NO, NO, NO, - NO, NO, TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSLS, NO, NO, NO, NO, NO, NO, NO, - NO, NO, LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, BSLS,ENT, NO, NO, NO, NO, NO, - NO, NO, LSFT,FN1 ,Z, X, C, V, B, N, M, COMM,DOT, SLSH, FN1, RSFT, NO, NO, NO, NO, NO, NO, NO, - NO, NO, LCTL, LALT, SPC, LGUI, APP, NO, NO, NO, NO, NO - ), - - // Momentary Function Layer - KEYMAP( - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, - TRNS,MUTE,VOLD,VOLU,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, - - TRNS,TRNS, TRNS,F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, - TRNS,TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,HOME,UP ,END, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, - TRNS,TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,MS_L,MS_D,MS_U,MS_R,LEFT,DOWN, RGHT,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, - TRNS,TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PGUP,PGDN,TRNS, TRNS,RSFT, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, - TRNS,TRNS, BTN2, TRNS, BTN1, RALT, RCTL, TRNS, TRNS,TRNS,TRNS,TRNS - ), - - // Mouse Layer - KEYMAP( - FN0, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, - - TRNS,TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,NO, TRNS, NO, NO, NO, NO, NO, NO, NO, - TRNS,TRNS, TRNS,NO, NO, MS_U,NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, TRNS, NO, NO, NO, NO, NO, NO, NO, - TRNS,TRNS, BTN2,BTN1,MS_L,MS_D,MS_R,NO, MS_L,MS_D,MS_U,MS_R,NO, NO, NO, ENT, NO, NO, NO, NO, NO, - TRNS,TRNS, TRNS,TRNS,NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, RSFT, NO, NO, NO, NO, NO, NO, NO, - TRNS,TRNS, TRNS, TRNS, BTN1, BTN2, TRNS, NO, NO, NO, NO, NO - ), - - // vi Layer - KEYMAP( - FN0, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, - - TRNS,TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,NO, TRNS, NO, NO, NO, NO, NO, NO, NO, - TRNS,TRNS, TRNS,HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, TRNS, NO, NO, NO, NO, NO, NO, NO, - TRNS,TRNS, TRNS,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, NO, ENT, NO, NO, NO, NO, NO, - TRNS,TRNS, TRNS,TRNS,NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, RSFT, NO, NO, NO, NO, NO, NO, NO, - TRNS,TRNS, TRNS, TRNS, SPC, RALT, RCTL, NO, NO, NO, NO, NO - ), - - // num lock layer - KEYMAP( - FN0, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, - - TRNS,TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, - TRNS,TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, - TRNS,TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, - TRNS,TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, - TRNS,TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,TRNS,TRNS,TRNS - ), - -}; - - -static const uint16_t fn_actions[] PROGMEM = { - [0] = ACTION_DEFAULT_LAYER_SET(0), - [1] = ACTION_LAYER_MOMENTARY(1), - [2] = ACTION_LAYER_MOMENTARY(2), //ACTION_LAYER_ON(2, ON_RELEASE), - [3] = KC_NO, //ACTION_LAYER_ON(3, ON_RELEASE), - [4] = KC_NO, //ACTION_LAYER_ON(4, ON_RELEASE), - [5] = KC_NO, - [6] = KC_NO, - [7] = KC_NO, -}; - -/* -enum macro_id { - MS_UL, - MS_UR, - MS_DL, - MS_DR, -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - keyevent_t event = record->event; - - switch (id) { - case MS_UL: - return (event.pressed ? MACRO( D(MS_L), D(MS_U), END ) : MACRO( U(MS_L), U(MS_U), END ) ); - case MS_UR: - return (event.pressed ? MACRO( D(MS_R), D(MS_U), END ) : MACRO( U(MS_L), U(MS_U), END ) ); - case MS_DL: - return (event.pressed ? MACRO( D(MS_L), D(MS_D), END ) : MACRO( U(MS_L), U(MS_U), END ) ); - case MS_DR: - return (event.pressed ? MACRO( D(MS_R), D(MS_D), END ) : MACRO( U(MS_L), U(MS_U), END ) ); - } - return MACRO_NONE; -} -*/ - -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -action_t keymap_fn_to_action(uint8_t keycode) -{ - action_t action; - action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]); - return action; -} diff --git a/converter/terminal_bluefruit/led.c b/converter/terminal_bluefruit/led.c deleted file mode 100644 index e5bf41d4ab..0000000000 --- a/converter/terminal_bluefruit/led.c +++ /dev/null @@ -1,35 +0,0 @@ -/* -Converter for 70% IBM Terminal Keyboard -Author: Benjamin Gould, 2013 -Based on code Copyright 2011 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include "stdint.h" -#include "ps2.h" -#include "led.h" - - -void led_set(uint8_t usb_led) -{ - uint8_t ps2_led = 0; - if (usb_led & (1< - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include -#include -#include -#include "print.h" -#include "util.h" -#include "debug.h" -#include "ps2.h" -#include "matrix.h" - - -static void matrix_make(uint8_t code); -static void matrix_break(uint8_t code); -#ifdef MATRIX_HAS_GHOST -static bool matrix_has_ghost_in_row(uint8_t row); -#endif - - -/* - * Matrix Array usage: - * 'Scan Code Set 3' is assigned into 17x8 cell matrix. - * - * 8bit wide - * +---------+ - * 0| | - * :| | 0x00-0x87 - * ;| | - * 17| | - * +---------+ - */ -static uint8_t matrix[MATRIX_ROWS]; -#define ROW(code) (code>>3) -#define COL(code) (code&0x07) - -static bool is_modified = false; - - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -void matrix_init(void) -{ - debug_enable = true; - //debug_matrix = true; - //debug_keyboard = true; - //debug_mouse = false; - - ps2_host_init(); - - // initialize matrix state: all keys off - for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; - - return; -} - -uint8_t matrix_scan(void) -{ - - // scan code reading states - static enum { - RESET, - RESET_RESPONSE, - KBD_ID0, - KBD_ID1, - CONFIG, - READY, - F0, - } state = RESET; - - is_modified = false; - - uint8_t code; - if ((code = ps2_host_recv())) { - debug("r"); debug_hex(code); debug(" "); - } - - switch (state) { - case RESET: - debug("wFF "); - if (ps2_host_send(0xFF) == 0xFA) { - debug("[ack]\nRESET_RESPONSE: "); - state = RESET_RESPONSE; - } - break; - case RESET_RESPONSE: - if (code == 0xAA) { - debug("[ok]\nKBD_ID: "); - state = KBD_ID0; - } else if (code) { - debug("err\nRESET: "); - state = RESET; - } - break; - // after reset receive keyboad ID(2 bytes) - case KBD_ID0: - if (code) { - state = KBD_ID1; - } - break; - case KBD_ID1: - if (code) { - debug("\nCONFIG: "); - state = CONFIG; - } - break; - case CONFIG: - debug("wF8 "); - if (ps2_host_send(0xF8) == 0xFA) { - debug("[ack]\nREADY\n"); - state = READY; - } - break; - case READY: - switch (code) { - case 0x00: - break; - case 0xF0: - state = F0; - debug(" "); - break; - default: // normal key make - if (code < 0x88) { - matrix_make(code); - } else { - debug("unexpected scan code at READY: "); debug_hex(code); debug("\n"); - } - state = READY; - debug("\n"); - } - break; - case F0: // Break code - switch (code) { - case 0x00: - break; - default: - if (code < 0x88) { - matrix_break(code); - } else { - debug("unexpected scan code at F0: "); debug_hex(code); debug("\n"); - } - state = READY; - debug("\n"); - } - break; - } - return 1; -} - -bool matrix_is_modified(void) -{ - return is_modified; -} - -inline -bool matrix_has_ghost(void) -{ -#ifdef MATRIX_HAS_GHOST - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - if (matrix_has_ghost_in_row(i)) - return true; - } -#endif - return false; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & (1< - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef CONFIG_H -#define CONFIG_H - - -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x6535 -#define DEVICE_VER 0x0100 -#define MANUFACTURER t.m.k. -#define PRODUCT PS/2(Set3)-USB Keyboard converter(IBM 122keys) -#define DESCRIPTION USB converter for IBM Terminal Keyboard 122keys - - -/* matrix size */ -#define MATRIX_ROWS 17 // keycode bit: 3-0 -#define MATRIX_COLS 8 // keycode bit: 6-4 - - -/* legacy keymap support */ -#define USE_LEGACY_KEYMAP - - -/* key combination for command */ -#define IS_COMMAND() ( \ - (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) || \ - (keyboard_report->mods == (MOD_BIT(KC_RALT) | MOD_BIT(KC_RCTL))) \ -) - - -/* - * PS/2 USART configuration for ATMega32U4 - */ -#ifdef PS2_USE_USART -/* XCK for clock line */ -#define PS2_CLOCK_PORT PORTD -#define PS2_CLOCK_PIN PIND -#define PS2_CLOCK_DDR DDRD -#define PS2_CLOCK_BIT 5 -/* RXD for data line */ -#define PS2_DATA_PORT PORTD -#define PS2_DATA_PIN PIND -#define PS2_DATA_DDR DDRD -#define PS2_DATA_BIT 2 - -/* synchronous, odd parity, 1-bit stop, 8-bit data, sample at falling edge */ -/* set DDR of CLOCK as input to be slave */ -#define PS2_USART_INIT() do { \ - PS2_CLOCK_DDR &= ~(1< - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include -#include -#include "keycode.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "keymap.h" - - - - -/* - * IBM Terminal keyboard 6110345(122keys)/1392595(102keys) - * http://geekhack.org/showthread.php?10737-What-Can-I-Do-With-a-Terminal-Model-M - * http://www.seasip.info/VintagePC/ibm_1391406.html - * - * Keymap array: - * 8 bytes - * +---------+ - * 0| | - * :| | 0x00-0x87 - * ;| | - * 17| | - * +---------+ - */ -#define KEYMAP( \ - K08,K10,K18,K20,K28,K30,K38,K40,K48,K50,K57,K5F, \ - K07,K0F,K17,K1F,K27,K2F,K37,K3F,K47,K4F,K56,K5E, \ - \ - K05,K06, K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K5D,K66, K67,K6E,K6F, K76,K77,K7E,K84, \ - K04,K0C, K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B, K5C, K64,K65,K6D, K6C,K75,K7D,K7C, \ - K03,K0B, K14,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K53,K5A, K63, K6B,K73,K74,K7B, \ - K83,K0A, K12,K13,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K51,K59, K61,K62,K6A, K69,K72,K7A,K79, \ - K01,K09, K11, K19, K29, K39, K58, K60, K68,K70,K71,K78 \ -) { \ - { KC_NO, KC_##K01, KC_NO, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ - { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ - { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ - { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \ - { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37 }, \ - { KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_##K3F }, \ - { KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_##K47 }, \ - { KC_##K48, KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D, KC_##K4E, KC_##K4F }, \ - { KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ - { KC_##K58, KC_##K59, KC_##K5A, KC_##K5B, KC_##K5C, KC_##K5D, KC_##K5E, KC_##K5F }, \ - { KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67 }, \ - { KC_##K68, KC_##K69, KC_##K6A, KC_##K6B, KC_##K6C, KC_##K6D, KC_##K6E, KC_##K6F }, \ - { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77 }, \ - { KC_##K78, KC_##K79, KC_##K7A, KC_##K7B, KC_##K7C, KC_##K7D, KC_##K7E, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, KC_##K83, KC_##K84, KC_NO, KC_NO, KC_NO, }, \ -} - -/* - * IBM Terminal keyboard 1399625, 101-key - */ -#define KEYMAP_101( \ - K08, K07,K0F,K17,K1F,K27,K2F,K37,K3F,K47,K4F,K56,K5E, K57,K5F,K62, \ - \ - K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, K67,K6E,K6F, K76,K77,K7E,K84, \ - K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5C, K64,K65,K6D, K6C,K75,K7D, \ - K14,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K7C, \ - K12, K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, K63, K69,K72,K7A, \ - K11, K19, K29, K39, K58, K61,K60,K6A, K70, K71,K79 \ -) { \ - { KC_NO, KC_NO , KC_NO, KC_NO , KC_NO , KC_NO , KC_NO , KC_##K07 }, \ - { KC_##K08, KC_NO , KC_NO , KC_NO , KC_NO , KC_##K0D, KC_##K0E, KC_##K0F }, \ - { KC_NO , KC_##K11, KC_##K12, KC_NO , KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ - { KC_NO , KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \ - { KC_NO , KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ - { KC_NO , KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \ - { KC_NO , KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37 }, \ - { KC_NO , KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_##K3F }, \ - { KC_NO , KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_##K47 }, \ - { KC_NO , KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D, KC_##K4E, KC_##K4F }, \ - { KC_NO , KC_NO , KC_##K52, KC_NO , KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ - { KC_##K58, KC_##K59, KC_##K5A, KC_##K5B, KC_##K5C, KC_NO , KC_##K5E, KC_##K5F }, \ - { KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67 }, \ - { KC_NO , KC_##K69, KC_##K6A, KC_##K6B, KC_##K6C, KC_##K6D, KC_##K6E, KC_##K6F }, \ - { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77 }, \ - { KC_NO , KC_##K79, KC_##K7A, KC_NO , KC_##K7C, KC_##K7D, KC_##K7E, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, KC_NO , KC_##K84, KC_NO, KC_NO, KC_NO, }, \ -} - -// Assign Fn key(0-7) to a layer to which switch with the Fn key pressed. -static const uint8_t PROGMEM fn_layer[] = { - 0, // Fn0 - 0, // Fn1 - 0, // Fn2 - 0, // Fn3 - 0, // Fn4 - 0, // Fn5 - 0, // Fn6 - 0 // Fn7 -}; - -// Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer. -// See layer.c for details. -static const uint8_t PROGMEM fn_keycode[] = { - KC_NO, // Fn0 - KC_NO, // Fn1 - KC_NO, // Fn2 - KC_NO, // Fn3 - KC_NO, // Fn4 - KC_NO, // Fn5 - KC_NO, // Fn6 - KC_NO // Fn7 -}; - - -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: default - * ,---. ,---------------. ,---------------. ,---------------. ,-----------. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| - * `---' `---------------' `---------------' `---------------' `-----------' - * ,-----------------------------------------------------------. ,-----------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \|BS | |Ins|Hom|PgU| |NmL| /| *| -| - * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|End|PgD| | 7| 8| 9| | - * |-----------------------------------------------------------| `-----------' |-----------| +| - * |CapsLo| A| S| D| F| G| H| J| K| L| ;| '| #|Retu| | 4| 5| 6| | - * |-----------------------------------------------------------| ,---. |---------------| - * |Shif| \| Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3| | - * |-----------------------------------------------------------| ,-----------. |-----------|Ent| - * |Ctrl| |Alt | Space |Alt | |Ctrl| |Lef|Dow|Rig| | 0| .| | - * `----' `---------------------------------------' `----' `-----------' `---------------' - */ -/* - KEYMAP( - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, - F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, - - PSCR,ESC, GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - SLCK,INT4, TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSLS, DEL, END, PGDN, P7, P8, P9, PPLS, - PAUS,INT5, CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, NUHS,ENT, UP, P4, P5, P6, PCMM, - APP, INT6, LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RO, RSFT, LEFT,INT2,RGHT, P1, P2, P3, PENT, - RGUI,LGUI, LCTL, LALT, SPC, RALT, RCTL, DOWN, NO, P0, PDOT,NO - ), -*/ - // pseudo ANSI - KEYMAP( - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, - F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, - - PSCR,ESC, ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, NO, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - SLCK,INT4, TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, NO, DEL, END, PGDN, P7, P8, P9, PPLS, - PAUS,INT5, LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, BSLS,ENT, UP, P4, P5, P6, PCMM, - APP, INT6, LSFT,LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, NO, RSFT, LEFT,INT2,RGHT, P1, P2, P3, PENT, - RGUI,LGUI, LCTL, LALT, SPC, LGUI, GRV, DOWN, NO, P0, PDOT,NO - ), - -/* 101-key keymaps - */ - /* 0: default - * ,---. ,---------------. ,---------------. ,---------------. ,-----------. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| - * `---' `---------------' `---------------' `---------------' `-----------' - * ,-----------------------------------------------------------. ,-----------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| |Ins|Hom|PgU| |NmL| /| *| -| - * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|End|PgD| | 7| 8| 9| | - * |-----------------------------------------------------------| `-----------' |-----------| +| - * |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Return | | 4| 5| 6| | - * |-----------------------------------------------------------| ,---. |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3| | - * |-----------------------------------------------------------| ,-----------. |-----------|Ent| - * |Ctrl| |Alt | Space |Alt | |Ctrl| |Lef|Dow|Rig| | 0| .| | - * `----' `---------------------------------------' `----' `-----------' `---------------' - */ -/* - KEYMAP_101( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK, BRK, - - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0,MINS, EQL,BSPC, INS,HOME,PGUP, NLCK,PSLS,PAST,PMNS, - TAB, Q, W, E, R, T, Y, U, I, O, P,LBRC,RBRC,BSLS, DEL, END,PGDN, P7, P8, P9, - CAPS, A, S, D, F, G, H, J, K, L,SCLN,QUOT, ENT, P4, P5, P6,PPLS, - LSFT, Z, X, C, V, B, N, M,COMM, DOT,SLSH, RSFT, UP, P1, P2, P3, - LCTL, LALT, SPC, RALT, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), -*/ -}; - - -uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) -{ - return pgm_read_byte(&keymaps[(layer)][(row)][(col)]); -} - -uint8_t keymap_fn_layer(uint8_t index) -{ - return pgm_read_byte(&fn_layer[index]); -} - -uint8_t keymap_fn_keycode(uint8_t index) -{ - return pgm_read_byte(&fn_keycode[index]); -} diff --git a/converter/terminal_usb/led.c b/converter/terminal_usb/led.c deleted file mode 100644 index e448e84ec7..0000000000 --- a/converter/terminal_usb/led.c +++ /dev/null @@ -1,33 +0,0 @@ -/* -Copyright 2011 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include "stdint.h" -#include "ps2.h" -#include "led.h" - - -void led_set(uint8_t usb_led) -{ - uint8_t ps2_led = 0; - if (usb_led & (1< - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include -#include -#include -#include "print.h" -#include "util.h" -#include "debug.h" -#include "ps2.h" -#include "matrix.h" - - -static void matrix_make(uint8_t code); -static void matrix_break(uint8_t code); -#ifdef MATRIX_HAS_GHOST -static bool matrix_has_ghost_in_row(uint8_t row); -#endif - - -/* - * Matrix Array usage: - * 'Scan Code Set 3' is assigned into 17x8 cell matrix. - * - * 8bit wide - * +---------+ - * 0| | - * :| | 0x00-0x87 - * ;| | - * 17| | - * +---------+ - */ -static uint8_t matrix[MATRIX_ROWS]; -#define ROW(code) (code>>3) -#define COL(code) (code&0x07) - -static bool is_modified = false; - - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -void matrix_init(void) -{ - debug_enable = true; - //debug_matrix = true; - //debug_keyboard = true; - //debug_mouse = false; - - ps2_host_init(); - - // initialize matrix state: all keys off - for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; - - return; -} - -uint8_t matrix_scan(void) -{ - - // scan code reading states - static enum { - RESET, - RESET_RESPONSE, - KBD_ID0, - KBD_ID1, - CONFIG, - READY, - F0, - } state = RESET; - - is_modified = false; - - uint8_t code; - if ((code = ps2_host_recv())) { - debug("r"); debug_hex(code); debug(" "); - } - - switch (state) { - case RESET: - debug("wFF "); - if (ps2_host_send(0xFF) == 0xFA) { - debug("[ack]\nRESET_RESPONSE: "); - state = RESET_RESPONSE; - } - break; - case RESET_RESPONSE: - if (code == 0xAA) { - debug("[ok]\nKBD_ID: "); - state = KBD_ID0; - } else if (code) { - debug("err\nRESET: "); - state = RESET; - } - break; - // after reset receive keyboad ID(2 bytes) - case KBD_ID0: - if (code) { - state = KBD_ID1; - } - break; - case KBD_ID1: - if (code) { - debug("\nCONFIG: "); - state = CONFIG; - } - break; - case CONFIG: - debug("wF8 "); - if (ps2_host_send(0xF8) == 0xFA) { - debug("[ack]\nREADY\n"); - state = READY; - } - break; - case READY: - switch (code) { - case 0x00: - break; - case 0xF0: - state = F0; - debug(" "); - break; - default: // normal key make - if (code < 0x88) { - matrix_make(code); - } else { - debug("unexpected scan code at READY: "); debug_hex(code); debug("\n"); - } - state = READY; - debug("\n"); - } - break; - case F0: // Break code - switch (code) { - case 0x00: - break; - default: - if (code < 0x88) { - matrix_break(code); - } else { - debug("unexpected scan code at F0: "); debug_hex(code); debug("\n"); - } - state = READY; - debug("\n"); - } - break; - } - return 1; -} - -bool matrix_is_modified(void) -{ - return is_modified; -} - -inline -bool matrix_has_ghost(void) -{ -#ifdef MATRIX_HAS_GHOST - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - if (matrix_has_ghost_in_row(i)) - return true; - } -#endif - return false; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & (1< - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef CONFIG_H -#define CONFIG_H - - -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x005B -#define DEVICE_VER 0x0814 -#define MANUFACTURER t.m.k. -#define PRODUCT USB to USB keyboard converter - - -#define DESCRIPTION Product from t.m.k. keyboard firmware project - - -/* matrix size */ -#define MATRIX_ROWS 32 -#define MATRIX_COLS 8 - -/* key combination for command */ -#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) - -#endif diff --git a/converter/usb_usb/keymap.c b/converter/usb_usb/keymap.c deleted file mode 100644 index 5397de519f..0000000000 --- a/converter/usb_usb/keymap.c +++ /dev/null @@ -1,115 +0,0 @@ -/* -Copyright 2012 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include "keymap_common.h" - - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: plain Qwerty without layer switching - * ,---. ,---------------. ,---------------. ,---------------. ,-----------. ,-----------. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |Pwr|Slp|Wak| - * `---' `---------------' `---------------' `---------------' `-----------' `-----------' - * ,-----------------------------------------------------------. ,-----------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| |Ins|Hom|PgU| |NmL| /| *| -| - * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|End|PgD| | 7| 8| 9| | - * |-----------------------------------------------------------| `-----------' |-----------| +| - * |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Return | | 4| 5| 6| | - * |-----------------------------------------------------------| ,---. |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3| | - * |-----------------------------------------------------------| ,-----------. |-----------|Ent| - * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| |Lef|Dow|Rig| | 0| .| | - * `-----------------------------------------------------------' `-----------' `---------------' - */ - KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, - CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, PPLS, - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, - LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), - - /* 1: Colemak http://colemak.com - * ,-----------------------------------------------------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| - * |-----------------------------------------------------------| - * |Tab | Q| W| F| P| G| J| L| U| Y| ;| [| ]| \| - * |-----------------------------------------------------------| - * |BackSp| A| R| S| T| D| H| N| E| I| O| '|Return | - * |-----------------------------------------------------------| - * |Shift | Z| X| C| V| B| K| M| ,| ,| /|Shift | - * |-----------------------------------------------------------| - * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| - * `----------------------------------------------------------' - */ - KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - TAB, Q, W, F, P, G, J, L, U, Y, SCLN,LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, - BSPC,A, R, S, T, D, H, N, E, I, O, QUOT, ENT, P4, P5, P6, PPLS, - LSFT,Z, X, C, V, B, K, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, - LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), - - /* 2: Dvorak http://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard - * ,-----------------------------------------------------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| [| ]|Backspa| - * |-----------------------------------------------------------| - * |Tab | '| ,| .| P| Y| F| G| C| R| L| /| =| \| - * |-----------------------------------------------------------| - * |BackSp| A| O| E| U| I| D| H| T| N| S| -|Return | - * |-----------------------------------------------------------| - * |Shift | ;| Q| J| K| X| B| M| Wl V| Z|Shift | - * |-----------------------------------------------------------| - * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| - * `-----------------------------------------------------------' - */ - KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, LBRC,RBRC,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - TAB, QUOT,COMM,DOT, P, Y, F, G, C, R, L, SLSH,EQL, BSLS, DEL, END, PGDN, P7, P8, P9, - CAPS,A, O, E, U, I, D, H, T, N, S, MINS, ENT, P4, P5, P6, PPLS, - LSFT,SCLN,Q, J, K, X, B, M, W, V, Z, RSFT, UP, P1, P2, P3, - LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), - - /* 3: Workman http://viralintrospection.wordpress.com/2010/09/06/a-different-philosophy-in-designing-keyboard-layouts/ - * ,-----------------------------------------------------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| - * |-----------------------------------------------------------| - * |Tab | Q| D| R| W| B| J| F| U| P| ;| [| ]| \| - * |-----------------------------------------------------------| - * |CapsLo| A| S| H| T| G| Y| N| E| O| I| '|Return | - * |-----------------------------------------------------------| - * |Shift | Z| X| M| C| V| K| L| ,| ,| /|Shift | - * |-----------------------------------------------------------| - * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| - * `-----------------------------------------------------------' - */ - KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - TAB, Q, D, R, W, B, J, F, U, P, SCLN,LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, - BSPC,A, S, H, T, G, Y, N, E, O, I, QUOT, ENT, P4, P5, P6, PPLS, - LSFT,Z, X, M, C, V, K, L, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, - LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), -}; - -const uint16_t PROGMEM fn_actions[] = { -}; diff --git a/converter/usb_usb/keymap_common.c b/converter/usb_usb/keymap_common.c deleted file mode 100644 index 8ab5ba923e..0000000000 --- a/converter/usb_usb/keymap_common.c +++ /dev/null @@ -1,31 +0,0 @@ -/* -Copyright 2014 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#include "keymap_common.h" -#include "progmem.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/converter/usb_usb/keymap_common.h b/converter/usb_usb/keymap_common.h deleted file mode 100644 index 435d83fdc7..0000000000 --- a/converter/usb_usb/keymap_common.h +++ /dev/null @@ -1,77 +0,0 @@ -/* -Copyright 2014 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#ifndef KEYMAP_COMMON_H -#define KEYMAP_COMMON_H - -#include -#include -#include "keycode.h" -#include "action.h" -#include "action_macro.h" -#include "report.h" -#include "print.h" -#include "debug.h" -#include "keymap.h" - - -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - -#define KEYMAP( \ - K29,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41,K42,K43,K44,K45, K46,K47,K48, \ - K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K2A, K49,K4A,K4B, K53,K54,K55,K56, \ - K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30,K31, K4C,K4D,K4E, K5F,K60,K61, \ - K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34, K28, K5C,K5D,K5E,K57, \ - KE1,K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, KE5, K52, K59,K5A,K5B, \ - KE0,KE3,KE2, K2C, KE6,KE7,K65,KE4, K50,K51,K4F, K62, K63,K58 \ -) { \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, /* 00-07 */ \ - { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, /* 08-0F */ \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, /* 10-17 */ \ - { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, /* 18-1F */ \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, /* 20-27 */ \ - { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, /* 28-2F */ \ - { KC_##K30, KC_##K31, KC_NO, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37 }, /* 30-37 */ \ - { KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_##K3F }, /* 38-3F */ \ - { KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_##K47 }, /* 40-47 */ \ - { KC_##K48, KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D, KC_##K4E, KC_##K4F }, /* 48-4F */ \ - { KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, /* 50-57 */ \ - { KC_##K58, KC_##K59, KC_##K5A, KC_##K5B, KC_##K5C, KC_##K5D, KC_##K5E, KC_##K5F }, /* 58-5F */ \ - { KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_NO, KC_##K65, KC_NO, KC_NO }, /* 60-67 */ \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, /* 68-6F */ \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, /* 70-77 */ \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, /* 78-7F */ \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, /* 80-87 */ \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, /* 88-8F */ \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, /* 90-97 */ \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, /* 98-9F */ \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, /* A0-A7 */ \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, /* A8-AF */ \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, /* B0-B7 */ \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, /* B8-BF */ \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, /* C0-C7 */ \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, /* C8-CF */ \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, /* D0-D7 */ \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, /* D8-DF */ \ - { KC_##KE0, KC_##KE1, KC_##KE2, KC_##KE3, KC_##KE4, KC_##KE5, KC_##KE6, KC_##KE7 }, /* E0-E7 */ \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, /* E8-EF */ \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, /* F0-F7 */ \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, /* F8-FF */ \ -} - -#endif diff --git a/converter/usb_usb/keymap_hasu.c b/converter/usb_usb/keymap_hasu.c deleted file mode 100644 index de19e23076..0000000000 --- a/converter/usb_usb/keymap_hasu.c +++ /dev/null @@ -1,158 +0,0 @@ -#include "keymap_common.h" - -const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { - /* Layer 0: Default Layer - * ,-----------------------------------------------------------. - * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `| - * |-----------------------------------------------------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Backs| - * |-----------------------------------------------------------| - * |Contro| A| S| D| F| G| H| J| K| L|Fn3| '|Fn6 | - * |-----------------------------------------------------------| - * |Fn7 | Z| X| C| V| B| N| M| ,| .|Fn2|Shift |Fn1| - * `-----------------------------------------------------------' - * |Gui|Alt | Fn4 |Fn5 |Gui| - * `-------------------------------------------' - */ - [0] = \ - KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, - LCTL,A, S, D, F, G, H, J, K, L, FN3, QUOT, FN6, P4, P5, P6, PPLS, - FN7, Z, X, C, V, B, N, M, COMM,DOT, FN2, RSFT, UP, P1, P2, P3, - LCTL,LGUI,LALT, FN4, RALT,FN5, FN5, FN1, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), - - /* Layer 1: HHKB mode[HHKB Fn] - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Caps | | | | | | | |Psc|Slk|Pus|Up | |Backs| - * |-----------------------------------------------------------| - * |Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter | - * |-----------------------------------------------------------| - * |Shift | | | | | | +| -|End|PgD|Dow|Shift | | - * `-----------------------------------------------------------' - * |Gui|Alt | Space |Alt |Gui| - * `-------------------------------------------' - */ - [1] = \ - KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,PAUS, UP, NO, BSLS, DEL, END, PGDN, P7, P8, P9, - LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT, ENT, P4, P5, P6, PPLS, - LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN, RSFT, UP, P1, P2, P3, - LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, TRNS, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), - - /* Layer 2: Vi mode[Slash] - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Tab |Hom|PgD|Up |PgU|End|Hom|PgD|PgUlEnd| | | |Backs| - * |-----------------------------------------------------------| - * |Contro| |Lef|Dow|Rig| |Lef|Dow|Up |Rig| | |Return | - * |-----------------------------------------------------------| - * |Shift | | | | | |Hom|PgD|PgUlEnd|Fn0|Shift | | - * `-----------------------------------------------------------' - * |Gui|Alt | Space |Alt |Gui| - * `-------------------------------------------' - */ - [2] = \ - KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, BSLS, DEL, END, PGDN, P7, P8, P9, - LCTL,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, P4, P5, P6, PPLS, - LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, TRNS, RSFT, UP, P1, P2, P3, - LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), - - /* Layer 3: Mouse mode(IJKL)[Semicolon] - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Tab | | | | | |MwL|MwD|McU|MwU|MwR|Wbk|Wfr|Alt-T| - * |-----------------------------------------------------------| - * |Contro| | | | | |Mb2|McL|McD|McR|Fn | |Return | - * |-----------------------------------------------------------| - * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | - * `-----------------------------------------------------------' - * |Gui |Alt | Mb1 |Fn |Fn | - * `--------------------------------------------' - * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel8 - */ - [3] = \ - KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, FN8, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - FN8, NO, NO, NO, NO, NO, WH_L,WH_D,MS_U,WH_U,WH_R,WBAK,WFWD,FN8, DEL, END, PGDN, P7, P8, P9, - LCTL,ACL0,ACL1,ACL2,ACL2,NO, NO, MS_L,MS_D,MS_R,TRNS,NO, ENT, P4, P5, P6, PPLS, - LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT, UP, P1, P2, P3, - LCTL,LGUI,LALT, BTN1, RALT,TRNS,TRNS,RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), - - /* Layer 5: Mouse mode(IJKL)[Space] - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Tab | | | | | |MwL|MwD|McU|MwU|MwR|Wbk|Wfr|Alt-T| - * |-----------------------------------------------------------| - * |Contro| | | | | |Mb2|McL|McD|McR|Mb1| |Return | - * |-----------------------------------------------------------| - * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | - * `-----------------------------------------------------------' - * |Gui |Alt | Mb1 |Fn |Fn | - * `--------------------------------------------' - * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel8 - */ - [4] = \ - KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, FN8, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - FN8, NO, NO, NO, NO, NO, WH_L,WH_D,MS_U,WH_U,WH_R,WBAK,WFWD,FN8, DEL, END, PGDN, P7, P8, P9, - LCTL,ACL0,ACL1,ACL2,ACL2,NO, NO, MS_L,MS_D,MS_R,BTN1,NO, ENT, P4, P5, P6, PPLS, - LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT, UP, P1, P2, P3, - LCTL,LGUI,LALT, TRNS, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), -}; - - -/* - * Macro definition - */ -enum macro_id { - ALT_TAB, -}; -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - switch (id) { - case ALT_TAB: - return (record->event.pressed ? - MACRO( D(LALT), D(TAB), END ) : - MACRO( U(TAB), END )); - } - return MACRO_NONE; -} - - -/* - * Fn action definition - */ -#ifdef KEYMAP_SECTION_ENABLE -const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { -#else -const uint16_t fn_actions[] PROGMEM = { -#endif - [0] = ACTION_DEFAULT_LAYER_SET(0), // Default layer(not used) - [1] = ACTION_LAYER_TAP_TOGGLE(1), // HHKB layer(toggle with 5 taps) - [2] = ACTION_LAYER_TAP_KEY(2, KC_SLASH), // Cursor layer with Slash* - [3] = ACTION_LAYER_TAP_KEY(3, KC_SCLN), // Mousekey layer with Semicolon* - [4] = ACTION_LAYER_TAP_KEY(4, KC_SPC), // Mousekey layer with Space - [5] = ACTION_LAYER_MOMENTARY(3), // Mousekey layer - [6] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENT), // RControl with tap Enter - [7] = ACTION_MODS_ONESHOT(MOD_LSFT), // Oneshot Shift - [8] = ACTION_MACRO(ALT_TAB), // Application switching -}; diff --git a/converter/usb_usb/keymap_spacefn.c b/converter/usb_usb/keymap_spacefn.c deleted file mode 100644 index bffd2bc606..0000000000 --- a/converter/usb_usb/keymap_spacefn.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - * SpaceFN layout - * http://geekhack.org/index.php?topic=51069.0 - */ -#include "keymap_common.h" - - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: default - * ,---. ,---------------. ,---------------. ,---------------. ,-----------. ,-----------. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |Pwr|Slp|Wak| - * `---' `---------------' `---------------' `---------------' `-----------' `-----------' - * ,-----------------------------------------------------------. ,-----------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| |Ins|Hom|PgU| |NmL| /| *| -| - * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|End|PgD| | 7| 8| 9| | - * |-----------------------------------------------------------| `-----------' |-----------| +| - * |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Return | | 4| 5| 6| | - * |-----------------------------------------------------------| ,---. |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3| | - * |-----------------------------------------------------------| ,-----------. |-----------|Ent| - * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| |Lef|Dow|Rig| | 0| .| | - * `-----------------------------------------------------------' `-----------' `---------------' - */ - KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, - CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, PPLS, - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, - LCTL,LGUI,LALT, FN0, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), - - /* 1: SpaceFN - * ,-----------------------------------------------------------. - * |` | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delete | - * |-----------------------------------------------------------| - * | | | |Esc| | | |Hom|Up |End|Psc|Slk|Pau|Ins | - * |-----------------------------------------------------------| - * | | | | | | |PgU|Lef|Dow|Rig| | | | - * |-----------------------------------------------------------| - * | | | | | |Spc|PgD|` |~ | |Men| | - * |-----------------------------------------------------------| - * | | | | | | | | | - * `-----------------------------------------------------------' - */ - KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - TRNS,TRNS,TRNS,ESC, TRNS,TRNS,TRNS,HOME,UP, END, PSCR,SLCK,PAUS,INS, DEL, END, PGDN, P7, P8, P9, - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PGUP,LEFT,DOWN,RGHT,TRNS,TRNS, TRNS, P4, P5, P6, PPLS, - TRNS,TRNS,TRNS,TRNS,TRNS,SPC, PGDN,GRV, FN1, TRNS,APP, TRNS, UP, P1, P2, P3, - TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_TAP_KEY(1, KC_SPACE), - [1] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde -}; - diff --git a/converter/usb_usb/main.cpp b/converter/usb_usb/main.cpp deleted file mode 100644 index 652c805734..0000000000 --- a/converter/usb_usb/main.cpp +++ /dev/null @@ -1,132 +0,0 @@ -#include -#include -#include -#include - -// USB HID host -#include "Usb.h" -#include "usbhub.h" -#include "hid.h" -#include "hidboot.h" -#include "parser.h" - -// LUFA -#include "lufa.h" - -#include "timer.h" -#include "sendchar.h" -#include "debug.h" -#include "keyboard.h" -#include "led.h" - - -/* LED ping configuration */ -#define TMK_LED -//#define LEONARDO_LED -#if defined(TMK_LED) -// For TMK converter and Teensy -#define LED_TX_INIT (DDRD |= (1<<6)) -#define LED_TX_ON (PORTD |= (1<<6)) -#define LED_TX_OFF (PORTD &= ~(1<<6)) -#define LED_TX_TOGGLE (PORTD ^= (1<<6)) -#elif defined(LEONARDO_LED) -// For Leonardo(TX LED) -#define LED_TX_INIT (DDRD |= (1<<5)) -#define LED_TX_ON (PORTD &= ~(1<<5)) -#define LED_TX_OFF (PORTD |= (1<<5)) -#define LED_TX_TOGGLE (PORTD ^= (1<<5)) -#else -#define LED_TX_INIT -#define LED_TX_ON -#define LED_TX_OFF -#define LED_TX_TOGGLE -#endif - - -static void LUFA_setup(void) -{ - /* Disable watchdog if enabled by bootloader/fuses */ - MCUSR &= ~(1 << WDRF); - wdt_disable(); - - /* Disable clock division */ - clock_prescale_set(clock_div_1); - - // Leonardo needs. Without this USB device is not recognized. - USB_Disable(); - - USB_Init(); - - // for Console_Task - USB_Device_EnableSOFEvents(); - print_set_sendchar(sendchar); -} - - - -/* - * USB Host Shield HID keyboard - */ -USB usb_host; -USBHub hub1(&usb_host); -HIDBoot kbd(&usb_host); -KBDReportParser kbd_parser; - - -void led_set(uint8_t usb_led) -{ - kbd.SetReport(0, 0, 2, 0, 1, &usb_led); -} - - - -int main(void) -{ - // LED for debug - LED_TX_INIT; - LED_TX_ON; - - debug_enable = true; - debug_keyboard = true; - - host_set_driver(&lufa_driver); - keyboard_init(); - - LUFA_setup(); - - // USB Host Shield setup - usb_host.Init(); - kbd.SetReportParser(0, (HIDReportParser*)&kbd_parser); - - /* NOTE: Don't insert time consuming job here. - * It'll cause unclear initialization failure when DFU reset(worm start). - */ - sei(); - - // wait for startup of sendchar routine - while (USB_DeviceState != DEVICE_STATE_Configured) ; - if (debug_enable) { - _delay_ms(1000); - } - - debug("init: done\n"); - -uint16_t timer; - for (;;) { - keyboard_task(); - -timer = timer_read(); - usb_host.Task(); -timer = timer_elapsed(timer); -if (timer > 100) { - debug("host.Task: "); debug_hex16(timer); debug("\n"); -} - -#if !defined(INTERRUPT_CONTROL_ENDPOINT) - // LUFA Task for control request - USB_USBTask(); -#endif - } - - return 0; -} diff --git a/converter/usb_usb/matrix.c b/converter/usb_usb/matrix.c deleted file mode 100644 index 83d5ab6c83..0000000000 --- a/converter/usb_usb/matrix.c +++ /dev/null @@ -1,133 +0,0 @@ -/* -Copyright 2011 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include -#include "usb_hid.h" -#include "keycode.h" -#include "util.h" -#include "print.h" -#include "debug.h" -#include "matrix.h" - -/* KEY CODE to Matrix - * - * HID keycode(1 byte): - * Higher 5 bits indicates ROW and lower 3 bits COL. - * - * 7 6 5 4 3 2 1 0 - * +---------------+ - * | ROW | COL | - * +---------------+ - * - * Matrix space(32 * 8): - * 01234567 - * 0 +--------+ - * : | | - * : | | - * 31 +--------+ - */ -#define ROW_MASK 0xF8 -#define COL_MASK 0x07 -#define CODE(row, col) (((row) << 3) | (col)) -#define ROW(code) (((code) & ROW_MASK) >> 3) -#define COL(code) ((code) & COL_MASK) -#define ROW_BITS(code) (1 << COL(code)) - - -uint8_t matrix_rows(void) { return MATRIX_ROWS; } -uint8_t matrix_cols(void) { return MATRIX_COLS; } -void matrix_init(void) {} -bool matrix_has_ghost(void) { return false; } - -static bool matrix_is_mod =false; - -uint8_t matrix_scan(void) { - static uint16_t last_time_stamp = 0; - - if (last_time_stamp != usb_hid_time_stamp) { - last_time_stamp = usb_hid_time_stamp; - matrix_is_mod = true; - } else { - matrix_is_mod = false; - } - return 1; -} - -bool matrix_is_modified(void) { - - return matrix_is_mod; -} - -bool matrix_is_on(uint8_t row, uint8_t col) { - uint8_t code = CODE(row, col); - - if (IS_MOD(code)) { - if (usb_hid_keyboard_report.mods & ROW_BITS(code)) { - return true; - } - } - for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { - if (usb_hid_keyboard_report.keys[i] == code) { - return true; - } - } - return false; -} - -uint8_t matrix_get_row(uint8_t row) { - uint8_t row_bits = 0; - - if (IS_MOD(CODE(row, 0)) && usb_hid_keyboard_report.mods) { - row_bits |= usb_hid_keyboard_report.mods; - } - - for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { - if (IS_ANY(usb_hid_keyboard_report.keys[i])) { - if (row == ROW(usb_hid_keyboard_report.keys[i])) { - row_bits |= ROW_BITS(usb_hid_keyboard_report.keys[i]); - } - } - } - return row_bits; -} - -uint8_t matrix_key_count(void) { - uint8_t count = 0; - - count += bitpop(usb_hid_keyboard_report.mods); - for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { - if (IS_ANY(usb_hid_keyboard_report.keys[i])) { - count++; - } - } - return count; -} - -void matrix_print(void) { - print("\nr/c 01234567\n"); - for (uint8_t row = 0; row < matrix_rows(); row++) { - phex(row); print(": "); - pbin_reverse(matrix_get_row(row)); -#ifdef MATRIX_HAS_GHOST - if (matrix_has_ghost_in_row(row)) { - print(" -# to submit bug reports. -#AVRDUDE_VERBOSE = -v -v - -AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -#AVRDUDE_FLAGS = -p $(MCU) -c $(AVRDUDE_PROGRAMMER) -AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) -AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) -AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) - -#PROGRAM_CMD = $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) -#PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex -PROGRAM_CMD = dfu-programmer atmega32u4 flash $(TARGET).hex - - -# Search Path -VPATH += $(TARGET_DIR) -VPATH += $(TMK_DIR) - - -include $(TMK_DIR)/protocol/pjrc.mk -include $(TMK_DIR)/protocol.mk -include $(TMK_DIR)/common.mk -include $(TMK_DIR)/rules.mk diff --git a/converter/x68k_usb/README b/converter/x68k_usb/README deleted file mode 100644 index 516fcd249f..0000000000 --- a/converter/x68k_usb/README +++ /dev/null @@ -1,151 +0,0 @@ -X68000 to USB keyboard protocol converter -========================================= -SHARP X68000 is a hobby computer released in Japan.(1987-93) -http://en.wikipedia.org/wiki/Sharp_X68000 - -X68000 keyboard has ALPS linear switches. -- DSETK0016CE01 green linear -- DSETK0022CE02 yellow linear -- DSETK0023CE03 yellow linear - - -Hardware --------- -Target MCU is ATMega32u4 but other USB capable AVR will also work. -You can use PJRC Teensy as development board. - http://www.pjrc.com/teensy/ - -Wiring: - Mini-DIN Teensy - ----------------------------------------------------- - pin1 +5V VCC - pin2 MOUSE - - pin3 RXD PD2(RXD) - pin4 TXD PD3(TXD) NOTE: Not supported yet. - pin5 READY - - pin6 REMOTE - - pin7 GND GND - - -Firmware --------- -Build: - $ cd x68k_usb - $ make - -And load the binary to MCU with your favorite programmer. -If you use Teensy you can load with PJRC Teensy Loader tool. - http://www.pjrc.com/teensy/loader.html - - -* * * * * * * * * * * * * * * * * * - - -X68000 Keyboard Protocol -======================== -http://kyoutan.jpn.org/uts/pc/pic/x68key/ - - -Connector ---------- -Mini DIN 7pin(female connector on computer side) - 7 6 5 - o o o - 4 o = o 3 - o o - 2 1 - - Mini-DIN - ------------- - pin1 +5V - pin2 MOUSE - pin3 RXD - pin4 TXD - pin5 READY - pin6 REMOTE - pin7 GND - - -Signaling ---------- -- TXD,RXD - Asynchronous, 2400baud, 1-startbit(L), 8-databit, 1-stopbit(H) - -- READY - ready/not ready(1/0) - - -Data from keyboard ------------------- -bit 7 make/break flag(0/1) -bit 6-0 following scan code - - -Data from computer ------------------- -- LED control ON/OFF(0/1) - bit 7 1(fixed) - bit 6 全角 - bit 5 ひらがな - bit 4 INS - bit 3 CAPS - bit 2 コード入力 - bit 1 ローマ字 - bit 0 かな - -- Repeat delay - bit 7 0(fixed) - bit 6 1(fixed) - bit 5 1(fixed) - bit 4 0(fixed) - bit 3-0 delay - REPEAT_DELAY = 200+delay*100 ms - default: 500ms - -- Repeat time - bit 7 0(fixed) - bit 6 1(fixed) - bit 5 1(fixed) - bit 4 1(fixed) - bit 3-0 time - REPEAT_TIME = 30+time^2*5 ms - default: 110ms - - -Scan Codes ----------- -,---. ,---. ,-------------------, ,-------------------. ,-----------. ,---------------. -| 61| | 62| | 63| 64| 65| 66| 67| | 68| 69| 6A| 6B| 6C| | 5A| 5B| 5C| | 5D| 52| 53| 54| -`---' `---' `-------------------' `-------------------' `-----------' `---------------' -,-----------------------------------------------------------. ,-----------. ,---------------. -| 01| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 0E| 0F| | 36| 5E| 37| | 3F| 40| 41| 42| -|-----------------------------------------------------------| |------------ |---------------| -| 10 | 11| 12| 13| 14| 15| 16| 17| 18| 19| 1A| 1B| 1C| | | 38| 39| 3A| | 43| 44| 45| 46| -|------------------------------------------------------. 1D | `---=====---' |---------------| -| 71 | 1E| 1F| 20| 21| 2l| 23| 24| 25| 26| 27| 28| 29| | ___| 3C|___ | 47| 48| 49| 4A| -|-----------------------------------------------------------| | 3B|---| 3D| |-----------|---| -| 70 | 2A| 2B| 2C| 2D| 2E| 2F| 30| 31| 32| 33| 34| 70 | `---| 3E|---' | 4B| 4C| 4D| | -`-----------------------------------------------------------| .---=====---. |-----------| 4E| - | 5F| 55 | 56 | 35 | 57 | 58 | 59 | 60| | 72 | 73 | | 4F| 50| 51| | - `---------------------------------------------' `-----------' `---------------' - - - -LED Special Functions ---------------------- -http://homepage2.nifty.com/m_kamada/docs/unlistedx68k.htm#keyboard - -1. Random Illumination - Plug in with pressing F1, F2 and F3. - -2. Sequential Illumination - Plug in with pressing 記号入力(52), 登録(53) and HELP. - -3. Scan code Display - Plug in with pressing かな(5A), ローマ字(5B) and コード入力(5C). - You can see its scan code on LEDs by pressing a key. - +---------------------------------------------------+ - |bit|6 |5 |4 |3 |2 |1 |0 | - |---+----+--------+---+----+----------+--------+----| - |LED|全角|ひらがな|INS|CAPS|コード入力|ローマ字|かな| - +---------------------------------------------------+ diff --git a/converter/x68k_usb/config_pjrc.h b/converter/x68k_usb/config_pjrc.h deleted file mode 100644 index c49b4a73e1..0000000000 --- a/converter/x68k_usb/config_pjrc.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -Copyright 2012 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef CONFIG_H -#define CONFIG_H - - -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x6800 -#define MANUFACTURER t.m.k. -#define PRODUCT SHARP X68000 keyboard converter -#define DESCRIPTION converts SHARP X68000 keyboard protocol into USB - - -/* matrix size */ -#define MATRIX_ROWS 16 -#define MATRIX_COLS 8 - - -/* key combination for command */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT)) || \ - keyboard_report->mods == (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI)) || \ - keyboard_report->mods == (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL)) \ -) - -/* legacy keymap support */ -#define USE_LEGACY_KEYMAP - - -/* USART configuration - * asynchronous, 2400baud, 8-data bit, non parity, 1-stop bit, no flow control - */ -#ifdef __AVR_ATmega32U4__ - #define SERIAL_UART_BAUD 2400 - #define SERIAL_UART_DATA UDR1 - #define SERIAL_UART_UBRR ((F_CPU/(16UL*SERIAL_UART_BAUD))-1) - #define SERIAL_UART_RXD_VECT USART1_RX_vect - #define SERIAL_UART_TXD_READY (UCSR1A&(1<>8); /* baud rate */ \ - UCSR1B = (1< - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include -#include -#include "keycode.h" -#include "util.h" -#include "keymap.h" - - - - -// Following macros help you to define a keymap with the form of actual keyboard layout. - -/* X68000 Keyboard Scan codes - ,---. ,---. ,-------------------, ,-------------------. ,-----------. ,---------------. - | 61| | 62| | 63| 64| 65| 66| 67| | 68| 69| 6A| 6B| 6C| | 5A| 5B| 5C| | 5D| 52| 53| 54| - `---' `---' `-------------------' `-------------------' `-----------' `---------------' - ,-----------------------------------------------------------. ,-----------. ,---------------. - | 01| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 0E| 0F| | 36| 5E| 37| | 3F| 40| 41| 42| - |-----------------------------------------------------------| |------------ |---------------| - | 10 | 11| 12| 13| 14| 15| 16| 17| 18| 19| 1A| 1B| 1C| | | 38| 39| 3A| | 43| 44| 45| 46| - |------------------------------------------------------. 1D | `---=====---' |---------------| - | 71 | 1E| 1F| 20| 21| 2l| 23| 24| 25| 26| 27| 28| 29| | ___| 3C|___ | 47| 48| 49| 4A| - |-----------------------------------------------------------| | 3B|---| 3D| |-----------|---| - | 70 | 2A| 2B| 2C| 2D| 2E| 2F| 30| 31| 32| 33| 34| 70 | `---| 3E|---' | 4B| 4C| 4D| | - `-----------------------------------------------------------| .---=====---. |-----------| 4E| - | 5F| 55 | 56 | 35 | 57 | 58 | 59 | 60| | 72 | 73 | | 4F| 50| 51| | - `---------------------------------------------' `-----------' `---------------' -*/ -#define KEYMAP( \ - K61,K62, K63,K64,K65,K66,K67, K68,K69,K6A,K6B,K6C, K5A,K5B,K5C, K5D,K52,K53,K54, \ - K01,K02,K03,K04,K05,K06,K07,K08,K09,K0A,K0B,K0C,K0D,K0E,K0F, K36,K5E,K37, K3F,K40,K41,K42, \ - K10,K11,K12,K13,K14,K15,K16,K17,K18,K19,K1A,K1B,K1C, K1D, K38,K39,K3A, K43,K44,K45,K46, \ - K71,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29, K3C, K47,K48,K49,K4A, \ - K70,K2A,K2B,K2C,K2D,K2E,K2F,K30,K31,K32,K33,K34, K3B,K3E,K3D, K4B,K4C,K4D,K4E, \ - K5F,K55,K56, K35, K57,K58,K59,K60, K72, K73, K4F,K50,K51 \ -) { \ - { KC_NO, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ - { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ - { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ - { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \ - { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37 }, \ - { KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_##K3F }, \ - { KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_##K47 }, \ - { KC_##K48, KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D, KC_##K4E, KC_##K4F }, \ - { KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ - { KC_##K58, KC_##K59, KC_##K5A, KC_##K5B, KC_##K5C, KC_##K5D, KC_##K5E, KC_##K5F }, \ - { KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67 }, \ - { KC_##K68, KC_##K69, KC_##K6A, KC_##K6B, KC_##K6C, KC_NO, KC_NO, KC_NO }, \ - { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_NO, KC_NO, KC_NO, KC_NO, }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ -} - - -// Assign Fn key(0-7) to a layer to which switch with the Fn key pressed. -static const uint8_t PROGMEM fn_layer[] = { - 0, // Fn0 - 0, // Fn1 - 0, // Fn2 - 0, // Fn3 - 0, // Fn4 - 0, // Fn5 - 0, // Fn6 - 0 // Fn7 -}; - -// Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer. -// See layer.c for details. -static const uint8_t PROGMEM fn_keycode[] = { - KC_NO, // Fn0 - KC_NO, // Fn1 - KC_NO, // Fn2 - KC_NO, // Fn3 - KC_NO, // Fn4 - KC_NO, // Fn5 - KC_NO, // Fn6 - KC_NO // Fn7 -}; - - -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* X68000 Keyboard Scan codes - ,---. ,---. ,-------------------, ,-------------------. ,-----------. ,---------------. - | 61| | 62| | 63| 64| 65| 66| 67| | 68| 69| 6A| 6B| 6C| | 5A| 5B| 5C| | 5D| 52| 53| 54| - `---' `---' `-------------------' `-------------------' `-----------' `---------------' - ,-----------------------------------------------------------. ,-----------. ,---------------. - | 01| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 0E| 0F| | 36| 5E| 37| | 3F| 40| 41| 42| - |-----------------------------------------------------------| |------------ |---------------| - | 10 | 11| 12| 13| 14| 15| 16| 17| 18| 19| 1A| 1B| 1C| | | 38| 39| 3A| | 43| 44| 45| 46| - |------------------------------------------------------. 1D | `---=====---' |---------------| - | 71 | 1E| 1F| 20| 21| 2l| 23| 24| 25| 26| 27| 28| 29| | ___| 3C|___ | 47| 48| 49| 4A| - |-----------------------------------------------------------| | 3B|---| 3D| |-----------|---| - | 70 | 2A| 2B| 2C| 2D| 2E| 2F| 30| 31| 32| 33| 34| 70 | `---| 3E|---' | 4B| 4C| 4D| | - `-----------------------------------------------------------| .---=====---. |-----------| 4E| - | 5F| 55 | 56 | 35 | 57 | 58 | 59 | 60| | 72 | 73 | | 4F| 50| 51| | - `---------------------------------------------' `-----------' `---------------' -*/ - /* ANSI */ - KEYMAP( - F16, F17, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, PSCR,SLCK,PAUS, CAPS,F11, F12, F13, - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,BSPC, HOME,INS, DEL, NLCK,PSLS,PAST,PMNS, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, ENT, PGDN,PGUP,END, P7, P8, P9, PPLS, - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,F18, UP, P4, P5, P6, PEQL, - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH,GRV, LEFT,DOWN,RGHT, P1, P2, P3, PENT, - F19, LGUI,LALT, SPC, RALT,RGUI,RCTL,APP, F14, F15, P0, PCMM,PDOT - ), - /* JIS */ - KEYMAP( - F16, F17, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, PSCR,SLCK,PAUS, CAPS,F11, F12, F13, - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, HOME,INS, DEL, NLCK,PSLS,PAST,PMNS, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, ENT, PGDN,PGUP,END, P7, P8, P9, PPLS, - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NUHS, UP, P4, P5, P6, PEQL, - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RO, LEFT,DOWN,RGHT, P1, P2, P3, PENT, - LGUI,LALT,MHEN, SPC, HENK,KANA,APP, ZKHK, F14, F15, P0, PCMM,PDOT - ), -}; - - -uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) -{ - return pgm_read_byte(&keymaps[(layer)][(row)][(col)]); -} - -uint8_t keymap_fn_layer(uint8_t index) -{ - return pgm_read_byte(&fn_layer[index]); -} - -uint8_t keymap_fn_keycode(uint8_t index) -{ - return pgm_read_byte(&fn_keycode[index]); -} diff --git a/converter/x68k_usb/led.c b/converter/x68k_usb/led.c deleted file mode 100644 index ccc38699c7..0000000000 --- a/converter/x68k_usb/led.c +++ /dev/null @@ -1,43 +0,0 @@ -/* -Copyright 2012 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include "stdint.h" -#include "serial.h" -#include "led.h" -#include "debug.h" - - -void led_set(uint8_t usb_led) -{ - /* X68000 LED bits 0: on, 1: off - * bit 7 1(fixed) - * bit 6 全角 - * bit 5 ひらがな - * bit 4 INS - * bit 3 CAPS - * bit 2 コード入力 - * bit 1 ローマ字 - * bit 0 かな - */ - uint8_t led = 0xFF; - if (usb_led&(1< - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include -#include -#include -#include "print.h" -#include "util.h" -#include "serial.h" -#include "matrix.h" -#include "debug.h" - - -/* - * Matrix Array usage: - * - * ROW: 16(4bits) - * COL: 8(3bits) - * - * 8bit wide - * +---------+ - * 0|00 ... 07| - * 1|08 ... 0F| - * :| ... | - * :| ... | - * E|70 ... 77| - * F|78 ... 7F| - * +---------+ - * - */ -static uint8_t matrix[MATRIX_ROWS]; -#define ROW(code) ((code>>3)&0xF) -#define COL(code) (code&0x07) - -static bool is_modified = false; - - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -void matrix_init(void) -{ - serial_init(); - - // initialize matrix state: all keys off - for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; - - return; -} - -uint8_t matrix_scan(void) -{ - is_modified = false; - - uint16_t code; - code = serial_recv2(); - if (code == -1) { - return 0; - } - - dprintf("%02X\n", code); - if (code&0x80) { - // break code - if (matrix_is_on(ROW(code), COL(code))) { - matrix[ROW(code)] &= ~(1<