From 7d0d32dbc65a8332a49aeed3a97e24cb109958b2 Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Fri, 23 Apr 2021 11:31:58 -0400 Subject: [PATCH] Nuke the never-functional iriver ifp-7xx port It never worked, and hasn't compiled in something like a decade, Given the HW capabilities (limited onboard flash, no expandability) there's really no point in trying to fix/complete it. Change-Id: I7d175089840396f8891645bd10010d730dd5bfdc --- apps/SOURCES | 2 - apps/keymaps/keymap-ifp7xx.c | 185 --- apps/lang/english.lang | 3 - apps/plugins/battery_bench.c | 7 - apps/plugins/blackjack.c | 16 - apps/plugins/calendar.c | 10 - apps/plugins/chessbox/chessbox_pgn.h | 14 - apps/plugins/chessclock.c | 10 - apps/plugins/cube.c | 10 - apps/plugins/fractals/fractal.h | 14 - apps/plugins/greyscale.c | 8 - apps/plugins/jewels.c | 10 - apps/plugins/lib/grey_core.c | 1 - apps/plugins/lib/pluginlib_actions.c | 7 - apps/plugins/pegbox.c | 17 - apps/plugins/pictureflow/pictureflow.c | 2 - apps/plugins/rockblox.c | 11 - apps/plugins/rockboy/rockboy.c | 10 - apps/plugins/stopwatch.c | 8 - apps/plugins/text_viewer/tv_button.h | 11 - apps/plugins/zxbox/keymaps.h | 8 - apps/plugins/zxbox/zxbox_keyb.c | 11 - firmware/SOURCES | 19 - firmware/drivers/ata_flash.c | 484 ------- firmware/export/config.h | 5 - firmware/export/config/iriverifp7xx.h | 129 -- firmware/export/gdb_api.h | 3 - firmware/export/ifp_usb_serial.h | 30 - firmware/ifp_usb_serial.c | 1121 ----------------- firmware/rolo.c | 13 - firmware/target/arm/pnx0101/app.lds | 144 --- .../target/arm/pnx0101/backlight-target.h | 28 - firmware/target/arm/pnx0101/crt0-pnx0101.S | 225 ---- firmware/target/arm/pnx0101/debug-pnx0101.c | 5 - firmware/target/arm/pnx0101/i2c-pnx0101.c | 24 - .../arm/pnx0101/iriver-ifp7xx/adc-ifp7xx.c | 59 - .../arm/pnx0101/iriver-ifp7xx/adc-target.h | 31 - .../pnx0101/iriver-ifp7xx/backlight-ifp7xx.c | 35 - .../arm/pnx0101/iriver-ifp7xx/button-ifp7xx.c | 90 -- .../arm/pnx0101/iriver-ifp7xx/button-target.h | 49 - .../arm/pnx0101/iriver-ifp7xx/lcd-ifp7xx.c | 224 ---- .../arm/pnx0101/iriver-ifp7xx/power-ifp7xx.c | 76 -- .../pnx0101/iriver-ifp7xx/powermgmt-ifp7xx.c | 55 - .../arm/pnx0101/iriver-ifp7xx/system-target.h | 36 - .../arm/pnx0101/iriver-ifp7xx/usb-ifp7xx.c | 49 - firmware/target/arm/pnx0101/kernel-pnx0101.c | 45 - firmware/target/arm/pnx0101/pcm-pnx0101.c | 207 --- firmware/target/arm/pnx0101/system-pnx0101.c | 317 ----- firmware/target/arm/pnx0101/timer-pnx0101.c | 81 -- firmware/target/hosted/sdl/sim-ui-defines.h | 7 - gdb/Makefile | 2 +- gdb/arm-stub.c | 2 - gdb/linker.cfg | 2 +- tools/builds.pm | 4 - tools/configure | 41 +- uisimulator/bitmaps/UI-iriverifp7xx.bmp | Bin 233562 -> 0 bytes uisimulator/buttonmap/SOURCES | 2 - uisimulator/buttonmap/iriver-ifp7xx.c | 71 -- 58 files changed, 3 insertions(+), 4087 deletions(-) delete mode 100644 apps/keymaps/keymap-ifp7xx.c delete mode 100644 firmware/drivers/ata_flash.c delete mode 100644 firmware/export/config/iriverifp7xx.h delete mode 100644 firmware/export/ifp_usb_serial.h delete mode 100644 firmware/ifp_usb_serial.c delete mode 100644 firmware/target/arm/pnx0101/app.lds delete mode 100644 firmware/target/arm/pnx0101/backlight-target.h delete mode 100644 firmware/target/arm/pnx0101/crt0-pnx0101.S delete mode 100644 firmware/target/arm/pnx0101/debug-pnx0101.c delete mode 100644 firmware/target/arm/pnx0101/i2c-pnx0101.c delete mode 100644 firmware/target/arm/pnx0101/iriver-ifp7xx/adc-ifp7xx.c delete mode 100644 firmware/target/arm/pnx0101/iriver-ifp7xx/adc-target.h delete mode 100644 firmware/target/arm/pnx0101/iriver-ifp7xx/backlight-ifp7xx.c delete mode 100644 firmware/target/arm/pnx0101/iriver-ifp7xx/button-ifp7xx.c delete mode 100644 firmware/target/arm/pnx0101/iriver-ifp7xx/button-target.h delete mode 100644 firmware/target/arm/pnx0101/iriver-ifp7xx/lcd-ifp7xx.c delete mode 100644 firmware/target/arm/pnx0101/iriver-ifp7xx/power-ifp7xx.c delete mode 100644 firmware/target/arm/pnx0101/iriver-ifp7xx/powermgmt-ifp7xx.c delete mode 100644 firmware/target/arm/pnx0101/iriver-ifp7xx/system-target.h delete mode 100644 firmware/target/arm/pnx0101/iriver-ifp7xx/usb-ifp7xx.c delete mode 100644 firmware/target/arm/pnx0101/kernel-pnx0101.c delete mode 100644 firmware/target/arm/pnx0101/pcm-pnx0101.c delete mode 100644 firmware/target/arm/pnx0101/system-pnx0101.c delete mode 100644 firmware/target/arm/pnx0101/timer-pnx0101.c delete mode 100644 uisimulator/bitmaps/UI-iriverifp7xx.bmp delete mode 100644 uisimulator/buttonmap/iriver-ifp7xx.c diff --git a/apps/SOURCES b/apps/SOURCES index 6c13945904..5c49f0bbbc 100644 --- a/apps/SOURCES +++ b/apps/SOURCES @@ -197,8 +197,6 @@ keymaps/keymap-gigabeat.c keymaps/keymap-gigabeat-s.c #elif CONFIG_KEYPAD == IRIVER_H10_PAD keymaps/keymap-h10.c -#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD -keymaps/keymap-ifp7xx.c #elif CONFIG_KEYPAD == SANSA_E200_PAD keymaps/keymap-e200.c #elif CONFIG_KEYPAD == SANSA_C200_PAD diff --git a/apps/keymaps/keymap-ifp7xx.c b/apps/keymaps/keymap-ifp7xx.c deleted file mode 100644 index c89b60e747..0000000000 --- a/apps/keymaps/keymap-ifp7xx.c +++ /dev/null @@ -1,185 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2006 Tomasz Malesinski - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -/* Button Code Definitions for iriver iFP7xx target */ - -#include "config.h" -#include "action.h" -#include "button.h" - -/* - * The format of the list is as follows - * { Action Code, Button code, Prereq button code } - * if there's no need to check the previous button's value, use BUTTON_NONE - * Insert LAST_ITEM_IN_LIST at the end of each mapping - */ -static const struct button_mapping button_context_standard[] = { - { ACTION_STD_PREV, BUTTON_UP, BUTTON_NONE }, - { ACTION_STD_PREVREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_STD_NEXT, BUTTON_DOWN, BUTTON_NONE }, - { ACTION_STD_NEXTREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, - - { ACTION_STD_CANCEL, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_STD_CANCEL, BUTTON_PLAY, BUTTON_NONE }, - { ACTION_STD_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT,BUTTON_SELECT }, - - { ACTION_STD_QUICKSCREEN, BUTTON_MODE|BUTTON_REPEAT, BUTTON_MODE }, - { ACTION_STD_MENU, BUTTON_MODE|BUTTON_REL, BUTTON_MODE }, - { ACTION_STD_OK, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT }, - { ACTION_STD_OK, BUTTON_RIGHT, BUTTON_NONE }, - - LAST_ITEM_IN_LIST -}; /* button_context_standard */ - -static const struct button_mapping button_context_wps[] = { - { ACTION_WPS_PLAY, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, - { ACTION_WPS_SKIPNEXT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT }, - { ACTION_WPS_SKIPPREV, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT }, - { ACTION_WPS_SEEKBACK, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_WPS_SEEKFWD, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_WPS_STOPSEEK, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT|BUTTON_REPEAT }, - { ACTION_WPS_STOPSEEK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT }, - { ACTION_WPS_ABSETB_NEXTDIR, BUTTON_PLAY|BUTTON_RIGHT, BUTTON_PLAY }, - { ACTION_WPS_ABSETA_PREVDIR, BUTTON_PLAY|BUTTON_LEFT, BUTTON_PLAY }, - { ACTION_WPS_STOP, BUTTON_EQ, BUTTON_NONE }, - { ACTION_WPS_VOLDOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_WPS_VOLDOWN, BUTTON_DOWN, BUTTON_NONE }, - { ACTION_WPS_VOLUP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_WPS_VOLUP, BUTTON_UP, BUTTON_NONE }, - { ACTION_WPS_QUICKSCREEN, BUTTON_MODE|BUTTON_REPEAT, BUTTON_MODE }, - { ACTION_WPS_MENU, BUTTON_MODE|BUTTON_REL, BUTTON_MODE }, - { ACTION_WPS_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT }, - { ACTION_WPS_BROWSE, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT }, - { ACTION_WPS_ABRESET, BUTTON_PLAY|BUTTON_SELECT, BUTTON_PLAY }, - { ACTION_WPS_HOTKEY, BUTTON_PLAY|BUTTON_MODE, BUTTON_PLAY }, - - LAST_ITEM_IN_LIST -}; /* button_context_wps */ - -static const struct button_mapping button_context_settings[] = { - { ACTION_SETTINGS_INC, BUTTON_UP, BUTTON_NONE }, - { ACTION_SETTINGS_INCREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_SETTINGS_DEC, BUTTON_DOWN, BUTTON_NONE }, - { ACTION_SETTINGS_DECREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_NONE, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_NONE, BUTTON_RIGHT, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) -}; /* button_context_settings */ - -static const struct button_mapping button_context_settings_r_is_inc[] = { - { ACTION_SETTINGS_INC, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_SETTINGS_INCREPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_SETTINGS_DEC, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_SETTINGS_DECREPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_STD_PREV, BUTTON_UP, BUTTON_NONE }, - { ACTION_STD_PREVREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_STD_NEXT, BUTTON_DOWN, BUTTON_NONE }, - { ACTION_STD_NEXTREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) -}; /* button_context_settingsgraphical */ - -static const struct button_mapping button_context_yesno[] = { - { ACTION_YESNO_ACCEPT, BUTTON_SELECT, BUTTON_NONE }, - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) -}; /* button_context_settings_yesno */ - -static const struct button_mapping button_context_bmark[] = { - { ACTION_BMS_DELETE, BUTTON_MODE, BUTTON_NONE }, - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), -}; /* button_context_settings_bmark */ - -static const struct button_mapping button_context_quickscreen[] = { - { ACTION_QS_TOP, BUTTON_UP, BUTTON_NONE }, - { ACTION_QS_TOP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_QS_DOWN, BUTTON_DOWN, BUTTON_NONE }, - { ACTION_QS_DOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_QS_LEFT, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_QS_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_QS_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_QS_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) -}; /* button_context_quickscreen */ - -static const struct button_mapping button_context_pitchscreen[] = { - { ACTION_PS_INC_SMALL, BUTTON_UP, BUTTON_NONE }, - { ACTION_PS_INC_BIG, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_PS_DEC_SMALL, BUTTON_DOWN, BUTTON_NONE }, - { ACTION_PS_DEC_BIG, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_PS_NUDGE_LEFT, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_PS_NUDGE_LEFTOFF, BUTTON_LEFT|BUTTON_REL, BUTTON_NONE }, - { ACTION_PS_NUDGE_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_PS_NUDGE_RIGHTOFF, BUTTON_RIGHT|BUTTON_REL, BUTTON_NONE }, - { ACTION_PS_RESET, BUTTON_MODE, BUTTON_NONE }, - { ACTION_PS_EXIT, BUTTON_PLAY, BUTTON_NONE }, - { ACTION_PS_SLOWER, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_PS_FASTER, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) -}; /* button_context_pitchcreen */ - -static const struct button_mapping button_context_keyboard[] = { - { ACTION_KBD_LEFT, BUTTON_LEFT, BUTTON_NONE }, - { ACTION_KBD_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, - { ACTION_KBD_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT }, - { ACTION_KBD_DONE, BUTTON_MODE, BUTTON_NONE }, - { ACTION_KBD_ABORT, BUTTON_PLAY, BUTTON_NONE }, - { ACTION_KBD_UP, BUTTON_UP, BUTTON_NONE }, - { ACTION_KBD_UP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_DOWN, BUTTON_DOWN, BUTTON_NONE }, - { ACTION_KBD_DOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, - - LAST_ITEM_IN_LIST -}; /* button_context_keyboard */ - -/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */ -const struct button_mapping* get_context_mapping(int context) -{ - switch (context) - { - case CONTEXT_STD: - return button_context_standard; - case CONTEXT_WPS: - return button_context_wps; - case CONTEXT_CUSTOM|CONTEXT_SETTINGS: - case CONTEXT_SETTINGS_EQ: - case CONTEXT_SETTINGS_COLOURCHOOSER: - case CONTEXT_SETTINGS_TIME: - return button_context_settings_r_is_inc; - case CONTEXT_SETTINGS: - return button_context_settings; - case CONTEXT_YESNOSCREEN: - return button_context_yesno; - case CONTEXT_BOOKMARKSCREEN: - return button_context_bmark; - case CONTEXT_QUICKSCREEN: - return button_context_quickscreen; - case CONTEXT_PITCHSCREEN: - return button_context_pitchscreen; - case CONTEXT_KEYBOARD: - return button_context_keyboard; - } - return button_context_standard; -} diff --git a/apps/lang/english.lang b/apps/lang/english.lang index fd90817130..9cd31363c9 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang @@ -57,7 +57,6 @@ # H120/H140 iriverh120 # H320/H340 iriverh300 # H10 iriverh10 -# IFP 7XX iriverifp7xx # iaudio/Cowon # X5 iaudiox5 # M5 iaudiom5 @@ -6069,12 +6068,10 @@ *: "Battery: %d%% %dh %dm" ipodmini1g,ipodmini2g,iriverh10: "Batt: %d%% %dh %dm" - iriverifp7xx: "%d%% %dh %dm" *: "Battery: %d%% %dh %dm" ipodmini1g,ipodmini2g,iriverh10: "Batt: %d%% %dh %dm" - iriverifp7xx: "%d%% %dh %dm" *: "Battery level" diff --git a/apps/plugins/battery_bench.c b/apps/plugins/battery_bench.c index d9c5eae516..2534e3bebe 100644 --- a/apps/plugins/battery_bench.c +++ b/apps/plugins/battery_bench.c @@ -61,13 +61,6 @@ #define BATTERY_ON_TXT "SELECT - start" #define BATTERY_OFF_TXT "POWER" -#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD - -#define BATTERY_ON BUTTON_SELECT -#define BATTERY_OFF BUTTON_PLAY -#define BATTERY_ON_TXT "SELECT - start" -#define BATTERY_OFF_TXT "PLAY" - #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \ (CONFIG_KEYPAD == SANSA_C200_PAD) || \ (CONFIG_KEYPAD == SANSA_CLIP_PAD) || \ diff --git a/apps/plugins/blackjack.c b/apps/plugins/blackjack.c index 650eaf412a..4242f5a89f 100644 --- a/apps/plugins/blackjack.c +++ b/apps/plugins/blackjack.c @@ -104,22 +104,6 @@ enum { #define BJACK_RIGHT BUTTON_RIGHT #define BJACK_LEFT BUTTON_LEFT -#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD -#define BJACK_SELECT_NAME "MODE" -#define BJACK_STAY_NAME "MODE" -#define BJACK_QUIT_NAME "PLAY" -#define BJACK_DOUBLE_NAME "SELECT" -#define BJACK_SELECT BUTTON_MODE -#define BJACK_QUIT BUTTON_PLAY -#define BJACK_MAX (BUTTON_EQ|BUTTON_UP) -#define BJACK_MIN (BUTTON_EQ|BUTTON_DOWN) -#define BJACK_STAY BUTTON_MODE -#define BJACK_DOUBLEDOWN BUTTON_SELECT -#define BJACK_UP BUTTON_UP -#define BJACK_DOWN BUTTON_DOWN -#define BJACK_RIGHT BUTTON_RIGHT -#define BJACK_LEFT BUTTON_LEFT - #elif CONFIG_KEYPAD == GIGABEAT_PAD #define BJACK_SELECT_NAME "SELECT" #define BJACK_STAY_NAME "VOL-" diff --git a/apps/plugins/calendar.c b/apps/plugins/calendar.c index 54173fde1c..e7f221a3c9 100644 --- a/apps/plugins/calendar.c +++ b/apps/plugins/calendar.c @@ -68,16 +68,6 @@ #define CALENDAR_NEXT_MONTH BUTTON_VOL_DOWN #define CALENDAR_PREV_MONTH BUTTON_VOL_UP -#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD -#define CALENDAR_QUIT BUTTON_PLAY -#define CALENDAR_SELECT BUTTON_SELECT -#define CALENDAR_NEXT_WEEK BUTTON_DOWN -#define CALENDAR_PREV_WEEK BUTTON_UP -#define CALENDAR_NEXT_DAY BUTTON_RIGHT -#define CALENDAR_PREV_DAY BUTTON_LEFT -#define CALENDAR_NEXT_MONTH BUTTON_MODE -#define CALENDAR_PREV_MONTH BUTTON_EQ - #elif CONFIG_KEYPAD == SANSA_E200_PAD #define CALENDAR_QUIT BUTTON_POWER #define CALENDAR_SELECT BUTTON_SELECT diff --git a/apps/plugins/chessbox/chessbox_pgn.h b/apps/plugins/chessbox/chessbox_pgn.h index 5bfce10ec5..827f045a4b 100644 --- a/apps/plugins/chessbox/chessbox_pgn.h +++ b/apps/plugins/chessbox/chessbox_pgn.h @@ -70,20 +70,6 @@ #define CB_SCROLL_LEFT (BUTTON_LEFT|BUTTON_REPEAT) #define CB_SCROLL_RIGHT (BUTTON_RIGHT|BUTTON_REPEAT) -#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD -#define CB_SELECT BUTTON_SELECT -#define CB_UP BUTTON_UP -#define CB_DOWN BUTTON_DOWN -#define CB_LEFT BUTTON_LEFT -#define CB_RIGHT BUTTON_RIGHT -#define CB_PLAY BUTTON_PLAY -#define CB_LEVEL BUTTON_EQ -#define CB_MENU BUTTON_MODE -#define CB_SCROLL_UP (BUTTON_UP|BUTTON_REPEAT) -#define CB_SCROLL_DOWN (BUTTON_DOWN|BUTTON_REPEAT) -#define CB_SCROLL_LEFT (BUTTON_LEFT|BUTTON_REPEAT) -#define CB_SCROLL_RIGHT (BUTTON_RIGHT|BUTTON_REPEAT) - #elif (CONFIG_KEYPAD == GIGABEAT_PAD) #define CB_SELECT BUTTON_SELECT #define CB_UP BUTTON_UP diff --git a/apps/plugins/chessclock.c b/apps/plugins/chessclock.c index 79daf0987c..91b04e713a 100644 --- a/apps/plugins/chessclock.c +++ b/apps/plugins/chessclock.c @@ -46,16 +46,6 @@ #define CHC_SETTINGS_OK BUTTON_SELECT #define CHC_SETTINGS_CANCEL BUTTON_MENU -#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD -#define CHC_QUIT BUTTON_PLAY -#define CHC_STARTSTOP BUTTON_MODE -#define CHC_RESET BUTTON_EQ -#define CHC_MENU BUTTON_SELECT -#define CHC_SETTINGS_INC BUTTON_RIGHT -#define CHC_SETTINGS_DEC BUTTON_LEFT -#define CHC_SETTINGS_OK BUTTON_SELECT -#define CHC_SETTINGS_CANCEL BUTTON_PLAY - #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD #define CHC_QUIT BUTTON_REC #define CHC_STARTSTOP BUTTON_PLAY diff --git a/apps/plugins/cube.c b/apps/plugins/cube.c index cb9d67ec35..857f2415d4 100644 --- a/apps/plugins/cube.c +++ b/apps/plugins/cube.c @@ -62,16 +62,6 @@ #define CUBE_HIGHSPEED_PRE BUTTON_SELECT #define CUBE_HIGHSPEED (BUTTON_SELECT | BUTTON_REL) -#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD -#define CUBE_QUIT BUTTON_PLAY -#define CUBE_NEXT BUTTON_RIGHT -#define CUBE_PREV BUTTON_LEFT -#define CUBE_INC BUTTON_UP -#define CUBE_DEC BUTTON_DOWN -#define CUBE_MODE BUTTON_MODE -#define CUBE_PAUSE BUTTON_SELECT -#define CUBE_HIGHSPEED BUTTON_EQ - #elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) #define CUBE_QUIT BUTTON_POWER #define CUBE_NEXT BUTTON_RIGHT diff --git a/apps/plugins/fractals/fractal.h b/apps/plugins/fractals/fractal.h index 28172aed9f..b64bf942fe 100644 --- a/apps/plugins/fractals/fractal.h +++ b/apps/plugins/fractals/fractal.h @@ -155,20 +155,6 @@ #define FRACTAL_PRECISION_DEC BUTTON_REW #define FRACTAL_RESET (BUTTON_PLAY | BUTTON_REW) -#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD -#define FRACTAL_QUIT BUTTON_EQ -#define FRACTAL_UP BUTTON_UP -#define FRACTAL_DOWN BUTTON_DOWN -#define FRACTAL_LEFT BUTTON_LEFT -#define FRACTAL_RIGHT BUTTON_RIGHT -#define FRACTAL_ZOOM_IN_PRE BUTTON_SELECT -#define FRACTAL_ZOOM_IN (BUTTON_SELECT | BUTTON_REL) -#define FRACTAL_ZOOM_OUT_PRE BUTTON_SELECT -#define FRACTAL_ZOOM_OUT (BUTTON_SELECT | BUTTON_REPEAT) -#define FRACTAL_PRECISION_INC (BUTTON_PLAY | BUTTON_RIGHT) -#define FRACTAL_PRECISION_DEC (BUTTON_PLAY | BUTTON_LEFT) -#define FRACTAL_RESET BUTTON_MODE - #elif CONFIG_KEYPAD == GIGABEAT_S_PAD #define FRACTAL_QUIT BUTTON_BACK #define FRACTAL_UP BUTTON_UP diff --git a/apps/plugins/greyscale.c b/apps/plugins/greyscale.c index c44b1f77c0..d9cb7436de 100644 --- a/apps/plugins/greyscale.c +++ b/apps/plugins/greyscale.c @@ -57,14 +57,6 @@ #define GREYSCALE_RIGHT BUTTON_RIGHT #define GREYSCALE_OFF BUTTON_MENU -#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD -#define GREYSCALE_SHIFT BUTTON_PLAY -#define GREYSCALE_UP BUTTON_UP -#define GREYSCALE_DOWN BUTTON_DOWN -#define GREYSCALE_LEFT BUTTON_LEFT -#define GREYSCALE_RIGHT BUTTON_RIGHT -#define GREYSCALE_OFF BUTTON_EQ - #elif CONFIG_KEYPAD == IAUDIO_M3_PAD #define GREYSCALE_SHIFT BUTTON_RC_PLAY /* somewhat dangerous... */ #define GREYSCALE_UP BUTTON_RC_VOL_UP diff --git a/apps/plugins/jewels.c b/apps/plugins/jewels.c index af0189e9db..7f7965b07d 100644 --- a/apps/plugins/jewels.c +++ b/apps/plugins/jewels.c @@ -63,16 +63,6 @@ #define HK_SELECT "SELECT" #define HK_CANCEL "MENU" -#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD -#define JEWELS_UP BUTTON_UP -#define JEWELS_DOWN BUTTON_DOWN -#define JEWELS_LEFT BUTTON_LEFT -#define JEWELS_RIGHT BUTTON_RIGHT -#define JEWELS_SELECT BUTTON_SELECT -#define JEWELS_CANCEL BUTTON_PLAY -#define HK_SELECT "SELECT" -#define HK_CANCEL "PLAY" - #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD #define JEWELS_UP BUTTON_UP #define JEWELS_DOWN BUTTON_DOWN diff --git a/apps/plugins/lib/grey_core.c b/apps/plugins/lib/grey_core.c index e3543aeba2..b025ef8eaa 100644 --- a/apps/plugins/lib/grey_core.c +++ b/apps/plugins/lib/grey_core.c @@ -294,7 +294,6 @@ static const unsigned char lcdlinear[256] = { #define LCD_SCANRATE 73 /* Hz */ #else /* not yet calibrated targets - generic linear mapping */ -/* TODO: calibrate iFP7xx */ static const unsigned char lcdlinear[256] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, diff --git a/apps/plugins/lib/pluginlib_actions.c b/apps/plugins/lib/pluginlib_actions.c index 907cb3ee42..028472d9a8 100644 --- a/apps/plugins/lib/pluginlib_actions.c +++ b/apps/plugins/lib/pluginlib_actions.c @@ -91,7 +91,6 @@ const struct button_mapping pla_main_ctx[] = || (CONFIG_KEYPAD == IRIVER_H300_PAD) \ || (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) \ || (CONFIG_KEYPAD == GIGABEAT_PAD) \ - || (CONFIG_KEYPAD == IRIVER_IFP7XX_PAD) \ || (CONFIG_KEYPAD == SANSA_C200_PAD) \ || (CONFIG_KEYPAD == GIGABEAT_S_PAD) \ || (CONFIG_KEYPAD == MROBE100_PAD) \ @@ -348,12 +347,6 @@ const struct button_mapping pla_main_ctx[] = {PLA_SELECT, BUTTON_PLAY, BUTTON_NONE}, {PLA_SELECT_REL, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY}, {PLA_SELECT_REPEAT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE}, -#elif (CONFIG_KEYPAD == IRIVER_IFP7XX_PAD) - {PLA_CANCEL, BUTTON_EQ|BUTTON_REL, BUTTON_EQ}, - {PLA_EXIT, BUTTON_EQ|BUTTON_REPEAT, BUTTON_NONE}, - {PLA_SELECT, BUTTON_SELECT, BUTTON_NONE}, - {PLA_SELECT_REL, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT}, - {PLA_SELECT_REPEAT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_NONE}, #elif (CONFIG_KEYPAD == MROBE500_PAD) {PLA_CANCEL, BUTTON_POWER|BUTTON_REL, BUTTON_POWER}, {PLA_EXIT, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE}, diff --git a/apps/plugins/pegbox.c b/apps/plugins/pegbox.c index 498aa36357..f089c38023 100644 --- a/apps/plugins/pegbox.c +++ b/apps/plugins/pegbox.c @@ -95,23 +95,6 @@ #define LVL_UP_TEXT "PLAY" #define LVL_DOWN_TEXT "-" -#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD -#define PEGBOX_SELECT BUTTON_MODE -#define PEGBOX_QUIT BUTTON_PLAY -#define PEGBOX_RESTART (BUTTON_EQ|BUTTON_MODE) -#define PEGBOX_LVL_UP (BUTTON_EQ|BUTTON_UP) -#define PEGBOX_LVL_DOWN (BUTTON_EQ|BUTTON_DOWN) -#define PEGBOX_UP BUTTON_UP -#define PEGBOX_DOWN BUTTON_DOWN -#define PEGBOX_RIGHT BUTTON_RIGHT -#define PEGBOX_LEFT BUTTON_LEFT - -#define SELECT_TEXT "MODE" -#define QUIT_TEXT "PLAY" -#define RESTART_TEXT "EQ+MODE" -#define LVL_UP_TEXT "EQ+UP" -#define LVL_DOWN_TEXT "EQ+DOWN" - #elif CONFIG_KEYPAD == IRIVER_H10_PAD #define PEGBOX_SELECT BUTTON_PLAY #define PEGBOX_QUIT BUTTON_POWER diff --git a/apps/plugins/pictureflow/pictureflow.c b/apps/plugins/pictureflow/pictureflow.c index 8f59695127..9faf53661e 100644 --- a/apps/plugins/pictureflow/pictureflow.c +++ b/apps/plugins/pictureflow/pictureflow.c @@ -128,8 +128,6 @@ const struct button_mapping pf_context_buttons[] = #endif #elif CONFIG_KEYPAD == SANSA_E200_PAD {PF_QUIT, BUTTON_POWER, BUTTON_NONE}, -#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD - {PF_QUIT, BUTTON_EQ, BUTTON_NONE}, #elif (CONFIG_KEYPAD == IPOD_1G2G_PAD) \ || (CONFIG_KEYPAD == IPOD_3G_PAD) \ || (CONFIG_KEYPAD == IPOD_4G_PAD) \ diff --git a/apps/plugins/rockblox.c b/apps/plugins/rockblox.c index e85c6a5eab..07a15bfb62 100644 --- a/apps/plugins/rockblox.c +++ b/apps/plugins/rockblox.c @@ -152,17 +152,6 @@ #define ROCKBLOX_DROP BUTTON_SELECT #define ROCKBLOX_RESTART BUTTON_A -#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD - -#define ROCKBLOX_OFF BUTTON_PLAY -#define ROCKBLOX_ROTATE_CCW BUTTON_UP -#define ROCKBLOX_ROTATE_CW BUTTON_SELECT -#define ROCKBLOX_DOWN BUTTON_DOWN -#define ROCKBLOX_LEFT BUTTON_LEFT -#define ROCKBLOX_RIGHT BUTTON_RIGHT -#define ROCKBLOX_DROP BUTTON_MODE -#define ROCKBLOX_RESTART BUTTON_EQ - #elif CONFIG_KEYPAD == MROBE500_PAD #define ROCKBLOX_OFF BUTTON_POWER diff --git a/apps/plugins/rockboy/rockboy.c b/apps/plugins/rockboy/rockboy.c index 6dd010961e..d2c56ff6cc 100644 --- a/apps/plugins/rockboy/rockboy.c +++ b/apps/plugins/rockboy/rockboy.c @@ -122,16 +122,6 @@ static void setoptions (void) options.SELECT = BUTTON_NONE; options.MENU = (BUTTON_SELECT | BUTTON_REPEAT); -#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD - options.UP = BUTTON_UP; - options.DOWN = BUTTON_DOWN; - - options.A = BUTTON_PLAY; - options.B = BUTTON_EQ; - options.START = BUTTON_MODE; - options.SELECT = (BUTTON_SELECT | BUTTON_REL); - options.MENU = (BUTTON_SELECT | BUTTON_REPEAT); - #elif CONFIG_KEYPAD == GIGABEAT_PAD options.UP = BUTTON_UP; options.DOWN = BUTTON_DOWN; diff --git a/apps/plugins/stopwatch.c b/apps/plugins/stopwatch.c index c5ecfd7a8a..bb96b8a44b 100644 --- a/apps/plugins/stopwatch.c +++ b/apps/plugins/stopwatch.c @@ -51,14 +51,6 @@ #define STOPWATCH_SCROLL_UP BUTTON_SCROLL_FWD #define STOPWATCH_SCROLL_DOWN BUTTON_SCROLL_BACK -#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD -#define STOPWATCH_QUIT BUTTON_PLAY -#define STOPWATCH_START_STOP BUTTON_MODE -#define STOPWATCH_RESET_TIMER BUTTON_EQ -#define STOPWATCH_LAP_TIMER BUTTON_SELECT -#define STOPWATCH_SCROLL_UP BUTTON_UP -#define STOPWATCH_SCROLL_DOWN BUTTON_DOWN - #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD #define STOPWATCH_QUIT BUTTON_POWER #define STOPWATCH_START_STOP BUTTON_PLAY diff --git a/apps/plugins/text_viewer/tv_button.h b/apps/plugins/text_viewer/tv_button.h index 26bfb7a464..d9a57d114f 100644 --- a/apps/plugins/text_viewer/tv_button.h +++ b/apps/plugins/text_viewer/tv_button.h @@ -75,17 +75,6 @@ #define TV_AUTOSCROLL BUTTON_PLAY #define TV_BOOKMARK BUTTON_SELECT -/* iFP7xx keys */ -#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD -#define TV_QUIT BUTTON_PLAY -#define TV_SCROLL_UP BUTTON_UP -#define TV_SCROLL_DOWN BUTTON_DOWN -#define TV_SCREEN_LEFT BUTTON_LEFT -#define TV_SCREEN_RIGHT BUTTON_RIGHT -#define TV_MENU BUTTON_MODE -#define TV_AUTOSCROLL BUTTON_SELECT -#define TV_BOOKMARK (BUTTON_LEFT|BUTTON_SELECT) - /* iAudio X5/M5 keys */ #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD #define TV_QUIT BUTTON_POWER diff --git a/apps/plugins/zxbox/keymaps.h b/apps/plugins/zxbox/keymaps.h index 1dcb9c9034..e9316a301b 100644 --- a/apps/plugins/zxbox/keymaps.h +++ b/apps/plugins/zxbox/keymaps.h @@ -47,14 +47,6 @@ #define ZX_SELECT BUTTON_SELECT #define ZX_MENU BUTTON_PLAY -#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD -#define ZX_SELECT BUTTON_SELECT -#define ZX_MENU BUTTON_PLAY -#define ZX_LEFT BUTTON_LEFT -#define ZX_RIGHT BUTTON_RIGHT -#define ZX_UP BUTTON_UP -#define ZX_DOWN BUTTON_DOWN - #elif CONFIG_KEYPAD == IRIVER_H10_PAD #define ZX_SELECT BUTTON_REW #define ZX_MENU BUTTON_FF diff --git a/apps/plugins/zxbox/zxbox_keyb.c b/apps/plugins/zxbox/zxbox_keyb.c index 1028836351..6e0997c339 100644 --- a/apps/plugins/zxbox/zxbox_keyb.c +++ b/apps/plugins/zxbox/zxbox_keyb.c @@ -32,17 +32,6 @@ #define KBD_UP BUTTON_SCROLL_BACK #define KBD_DOWN BUTTON_SCROLL_FWD -#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD - -/* TODO: Check keyboard mappings */ - -#define KBD_SELECT BUTTON_SELECT -#define KBD_ABORT BUTTON_PLAY -#define KBD_LEFT BUTTON_LEFT -#define KBD_RIGHT BUTTON_RIGHT -#define KBD_UP BUTTON_UP -#define KBD_DOWN BUTTON_DOWN - #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD /* TODO: Check keyboard mappings */ diff --git a/firmware/SOURCES b/firmware/SOURCES index b6f7688946..dd12c4953f 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES @@ -336,9 +336,6 @@ drivers/touchscreen.c /* Storage */ #if (CONFIG_PLATFORM & PLATFORM_NATIVE) -#if (CONFIG_STORAGE & STORAGE_NAND) && (CONFIG_NAND == NAND_IFP7XX) -drivers/ata_flash.c -#endif #if (CONFIG_STORAGE & STORAGE_NAND) && (CONFIG_NAND == NAND_TCC) target/arm/ata-nand-telechips.c #endif @@ -1039,12 +1036,9 @@ target/coldfire/iaudio/audio-iaudio.c #endif #endif /* IAUDIO_M3 */ -#ifdef IRIVER_IFP7XX_SERIES #ifdef STUB -ifp_usb_serial.c libc/sscanf.c #endif /* STUB */ -#endif /* IRIVER_IFP7XX_SERIES */ #if defined(IRIVER_H300_SERIES) || defined(IRIVER_H100_SERIES) target/coldfire/iriver/ata-iriver.c @@ -1349,19 +1343,6 @@ target/arm/ipod/button-mini1g.c target/arm/ipod/button-clickwheel.c #endif /* IPOD_MINI2G */ -#ifdef IRIVER_IFP7XX -target/arm/pnx0101/iriver-ifp7xx/adc-ifp7xx.c -target/arm/pnx0101/iriver-ifp7xx/backlight-ifp7xx.c -target/arm/pnx0101/iriver-ifp7xx/button-ifp7xx.c -target/arm/pnx0101/iriver-ifp7xx/lcd-ifp7xx.c -target/arm/pnx0101/iriver-ifp7xx/power-ifp7xx.c -target/arm/pnx0101/iriver-ifp7xx/powermgmt-ifp7xx.c -target/arm/pnx0101/iriver-ifp7xx/usb-ifp7xx.c -#ifndef BOOTLOADER -target/arm/pnx0101/pcm-pnx0101.c -#endif /* BOOTLOADER */ -#endif /* IRIVER_IFP7XX */ - #ifdef SANSA_CLIPPLUS target/arm/as3525/sansa-clipplus/lcd-clip-plus.c target/arm/as3525/sansa-clipplus/button-clip.c diff --git a/firmware/drivers/ata_flash.c b/firmware/drivers/ata_flash.c deleted file mode 100644 index fbdd7f04ee..0000000000 --- a/firmware/drivers/ata_flash.c +++ /dev/null @@ -1,484 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2005 Tomasz Malesinski - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -#include "storage.h" -#include -#include - -#if CONFIG_CPU == PNX0101 -#include "pnx0101.h" -#endif - -/* -#include "kernel.h" -#include "thread.h" -#include "led.h" -#include "cpu.h" -#include "system.h" -#include "debug.h" -#include "panic.h" -#include "usb.h" -#include "power.h" -#include "string.h" -*/ - -#define SECTOR_SIZE (512) - -static long last_disk_activity = -1; - -#if CONFIG_FLASH == FLASH_IFP7XX -static unsigned char flash_ce[4] = {0x20, 0x02, 0x10, 0x08}; - -#define FLASH_IO_BASE 0x28000000 -#define FLASH_REG_DATA (*((volatile unsigned char*)(FLASH_IO_BASE))) -#define FLASH_REG_CMD (*((volatile unsigned char*)(FLASH_IO_BASE + 4))) -#define FLASH_REG_ADDR (*((volatile unsigned char*)(FLASH_IO_BASE + 8))) - -#define SEGMENT_SIZE 1000 -#define MAX_N_SEGMENTS 8 - -#endif - -#define FLASH_MODEL_NONE 0 -#define FLASH_MODEL_256 1 -#define FLASH_MODEL_512 2 - -struct flash_disk -{ - unsigned short block_map[MAX_N_SEGMENTS][SEGMENT_SIZE]; - short cur_block; - int cur_phblock_start; - int n_chips; - unsigned char chip_no[4]; - unsigned char model; -}; - -static struct flash_disk flash_disk; - -static void flash_select_chip(int no, int sel) -{ -#if CONFIG_FLASH == FLASH_IFP7XX - if (sel) - GPIO5_CLR = flash_ce[no]; - else - GPIO5_SET = flash_ce[no]; -#endif -} - -static inline unsigned char flash_read_data(void) -{ - return FLASH_REG_DATA; -} - -static inline void flash_write_data(unsigned char data) -{ - FLASH_REG_DATA = data; -} - -/* TODO: these two doesn't work when inlined, probably some - delay is required */ - -static void flash_write_cmd(unsigned char cmd) -{ - FLASH_REG_CMD = cmd; -} - -static void flash_write_addr(unsigned char addr) -{ - FLASH_REG_ADDR = addr; -} - -static void flash_wait_ready(void) -{ - int i; - for (i = 0; i < 5; i++) - while ((GPIO6_READ & 8) == 0); -} - -static unsigned char model_n_sectors_order[] = {0, 19, 20}; - -static int flash_map_sector(int sector, int* chip, int* chip_sector) -{ - int ord, c; - if (flash_disk.model == FLASH_MODEL_NONE) - return -1; - - ord = model_n_sectors_order[flash_disk.model]; - c = sector >> ord; - *chip_sector = sector & ((1 << ord) - 1); - - if (c >= flash_disk.n_chips) - return -1; - - *chip = flash_disk.chip_no[c]; - return 0; -} - -static int flash_read_id(int no) { - int id; - - flash_select_chip(no, 1); - flash_write_cmd(0x90); - flash_write_addr(0); - - flash_read_data(); - id = flash_read_data(); - - flash_select_chip(no, 0); - return id; -} - -static int flash_read_sector(int sector, unsigned char* buf, - unsigned char* oob) -{ - unsigned long *bufl = (unsigned long *)buf; - int chip, chip_sector; - int i; - - if (flash_map_sector(sector, &chip, &chip_sector) < 0) - return -1; - - flash_select_chip(chip, 1); - - flash_write_cmd(0x00); - flash_write_addr(0); - flash_write_addr((chip_sector << 1) & 7); - flash_write_addr((chip_sector >> 2) & 0xff); - flash_write_addr((chip_sector >> 10) & 0xff); - flash_write_addr((chip_sector >> 18) & 0xff); - flash_write_cmd(0x30); - - flash_wait_ready(); - - if ((unsigned long)buf & 3) - { - for (i = 0; i < 512; i++) - buf[i] = flash_read_data(); - } - else - { - for (i = 0; i < 512 / 4; i++) { - unsigned long v; -#ifdef ROCKBOX_LITTLE_ENDIAN - v = flash_read_data(); - v |= (unsigned long)flash_read_data() << 8; - v |= (unsigned long)flash_read_data() << 16; - v |= (unsigned long)flash_read_data() << 24; -#else - v = (unsigned long)flash_read_data() << 24; - v |= (unsigned long)flash_read_data() << 16; - v |= (unsigned long)flash_read_data() << 8; - v |= flash_read_data(); -#endif - bufl[i] = v; - } - } - - flash_write_cmd(0x05); - flash_write_addr((chip_sector & 3) * 0x10); - flash_write_addr(8); - flash_write_cmd(0xe0); - - for (i = 0; i < 16; i++) - oob[i] = flash_read_data(); - - flash_select_chip(chip, 0); - return 0; -} - -static int flash_read_sector_oob(int sector, unsigned char* oob) -{ - int chip, chip_sector; - int i; - - if (flash_map_sector(sector, &chip, &chip_sector) < 0) - return -1; - - flash_select_chip(chip, 1); - - flash_write_cmd(0x00); - flash_write_addr((chip_sector & 3) * 0x10); - flash_write_addr(8); - flash_write_addr((chip_sector >> 2) & 0xff); - flash_write_addr((chip_sector >> 10) & 0xff); - flash_write_addr((chip_sector >> 18) & 0xff); - flash_write_cmd(0x30); - - flash_wait_ready(); - - for (i = 0; i < 16; i++) - oob[i] = flash_read_data(); - - flash_select_chip(chip, 0); - return 0; -} - -static unsigned char model_n_segments[] = {0, 2, 4}; - -static inline int flash_get_n_segments(void) -{ - return model_n_segments[flash_disk.model] * flash_disk.n_chips; -} - -static inline int flash_get_n_phblocks(void) -{ - return 1024; -} - -static int model_n_sectors_in_block[] = {0, 256, 256}; - -static int flash_get_n_sectors_in_block(void) -{ - return model_n_sectors_in_block[flash_disk.model]; -} - -static int flash_phblock_to_sector(int segment, int block) -{ - return (segment * flash_get_n_phblocks() + block) - * flash_get_n_sectors_in_block(); -} - -static int flash_is_bad_block(unsigned char* oob) -{ - /* TODO: should we check two pages? (see datasheet) */ - return oob[0] != 0xff; -} - -static int count_1(int n) { - int r = 0; - while (n != 0) { - r += (n & 1); - n >>= 1; - } - return r; -} - -static int flash_get_logical_block_no(unsigned char* oob) -{ - int no1, no2; - no1 = oob[6] + (oob[7] << 8); - no2 = oob[11] + (oob[12] << 8); - - if (no1 == no2 && (no1 & 0xf000) == 0x1000) - return (no1 & 0xfff) >> 1; - - if (count_1(no1 ^ no2) > 1) - return -1; - - if ((no1 & 0xf000) == 0x1000 - && (count_1(no1) & 1) == 0) - return (no1 & 0xfff) >> 1; - - if ((no2 & 0xf000) == 0x1000 - && (count_1(no2) & 1) == 0) - return (no2 & 0xfff) >> 1; - - return -1; -} - -static int flash_disk_scan(void) -{ - int n_segments, n_phblocks; - unsigned char oob[16]; - int s, b; - - /* TODO: checking for double blocks */ - - n_segments = flash_get_n_segments(); - n_phblocks = flash_get_n_phblocks(); - - flash_disk.cur_block = -1; - flash_disk.cur_phblock_start = -1; - - for (s = 0; s < n_segments; s++) - { - for (b = 0; b < n_phblocks; b++) - { - int r; - r = flash_read_sector_oob(flash_phblock_to_sector(s, b), - oob); - if (r >= 0 && !flash_is_bad_block(oob)) - { - int lb; - lb = flash_get_logical_block_no(oob); - if (lb >= 0 && lb < SEGMENT_SIZE) - flash_disk.block_map[s][lb] = b; - } - } - } - return 0; -} - -static int flash_disk_find_block(int block) -{ - int seg, bmod, phb; - unsigned char oob[16]; - int r; - - if (block >= SEGMENT_SIZE * flash_get_n_segments()) - return -1; - - if (block == flash_disk.cur_block) - return flash_disk.cur_phblock_start; - - seg = block / SEGMENT_SIZE; - bmod = block % SEGMENT_SIZE; - - phb = flash_disk.block_map[seg][bmod]; - r = flash_read_sector_oob(flash_phblock_to_sector(seg, phb), oob); - if (r < 0) - return -1; - if (flash_is_bad_block(oob)) - return -1; - if (flash_get_logical_block_no(oob) != bmod) - return -1; - - flash_disk.cur_block = block; - flash_disk.cur_phblock_start = flash_phblock_to_sector(seg, phb); - return flash_disk.cur_phblock_start; -} - -static int flash_disk_read_sectors(unsigned long start, - int count, - void* buf) -{ - int block, secmod, done; - int phb; - char oob[16]; - - block = start / flash_get_n_sectors_in_block(); - secmod = start % flash_get_n_sectors_in_block(); - - phb = flash_disk_find_block(block); - done = 0; - while (count > 0 && secmod < flash_get_n_sectors_in_block()) - { - if (phb >= 0) - flash_read_sector(phb + secmod, buf, oob); - else - memset(buf, 0, SECTOR_SIZE); - - buf += SECTOR_SIZE; - count--; - secmod++; - done++; - } - return done; -} - -int nand_read_sectors(IF_MD(int drive,) - unsigned long start, - int incount, - void* inbuf) -{ - while (incount > 0) - { - int done = flash_disk_read_sectors(start, incount, inbuf); - if (done < 0) - return -1; - start += done; - incount -= done; - inbuf += SECTOR_SIZE * done; - } - return 0; -} - -int nand_write_sectors(IF_MD(int drive,) - unsigned long start, - int count, - const void* buf) -{ - (void)start; - (void)count; - (void)buf; - return -1; -} - -int nand_init(void) -{ - int i, id, id2; - - id = flash_read_id(0); - switch (id) - { - case 0xda: - flash_disk.model = FLASH_MODEL_256; - break; - case 0xdc: - flash_disk.model = FLASH_MODEL_512; - break; - default: - flash_disk.model = FLASH_MODEL_NONE; - return -1; - } - - flash_disk.n_chips = 1; - flash_disk.chip_no[0] = 0; - for (i = 1; i < 4; i++) - { - id2 = flash_read_id(i); - if (id2 == id) - flash_disk.chip_no[flash_disk.n_chips++] = i; - } - - if (flash_disk_scan() < 0) - return -2; - - return 0; -} - -long nand_last_disk_activity(void) -{ - return last_disk_activity; -} - -#ifdef STORAGE_GET_INFO -void nand_get_info(struct storage_info *info) -{ - unsigned long blocks; - int i; - - /* firmware version */ - info->revision="0.00"; - - /* vendor field, need better name? */ - info->vendor="Rockbox"; - /* model field, need better name? */ - info->product="TNFL"; - - /* blocks count */ - info->num_sectors = 0; - info->sector_size=SECTOR_SIZE; - - info->serial=0; -} -#endif - -#ifdef CONFIG_STORAGE_MULTI -int nand_num_drives(int first_drive) -{ - /* We don't care which logical drive number(s) we have been assigned */ - (void)first_drive; - - return 1; -} -#endif - diff --git a/firmware/export/config.h b/firmware/export/config.h index d23abfa086..b758bef49d 100644 --- a/firmware/export/config.h +++ b/firmware/export/config.h @@ -101,7 +101,6 @@ #define IPOD_4G_PAD 7 #define IPOD_3G_PAD 8 #define IPOD_1G2G_PAD 9 -#define IRIVER_IFP7XX_PAD 10 #define GIGABEAT_PAD 11 #define IRIVER_H10_PAD 12 #define SANSA_E200_PAD 13 @@ -222,7 +221,6 @@ #define LCD_IPODVIDEO 8 /* as used by iPod Video */ #define LCD_IPOD2BPP 9 /* as used by all fullsize greyscale iPods */ #define LCD_IPODMINI 10 /* as used by iPod Mini g1/g2 */ -#define LCD_IFP7XX 11 /* as used by iRiver iFP 7xx/8xx */ #define LCD_GIGABEAT 12 #define LCD_H10_20GB 13 /* as used by iriver H10 20Gb */ #define LCD_H10_5GB 14 /* as used by iriver H10 5Gb */ @@ -322,7 +320,6 @@ Lyre prototype 1 */ /* else HW controlled LED (iRiver H1x0) */ /* CONFIG_NAND */ -#define NAND_IFP7XX 1 #define NAND_TCC 2 #define NAND_SAMSUNG 3 #define NAND_CC 4 /* ChinaChip */ @@ -410,8 +407,6 @@ Lyre prototype 1 */ #include "config/ipodnano2g.h" #elif defined(IPOD_6G) #include "config/ipod6g.h" -#elif defined(IRIVER_IFP7XX) -#include "config/iriverifp7xx.h" #elif defined(GIGABEAT_F) #include "config/gigabeatfx.h" #elif defined(GIGABEAT_S) diff --git a/firmware/export/config/iriverifp7xx.h b/firmware/export/config/iriverifp7xx.h deleted file mode 100644 index 0db9a7810d..0000000000 --- a/firmware/export/config/iriverifp7xx.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - * This config file is for iriver iFP-799 - */ - -#define IRIVER_IFP7XX_SERIES 1 - -#define MODEL_NAME "iriver iFP-799" - -/* For Rolo and boot loader */ -#define MODEL_NUMBER 6 - -/* define this if you have recording possibility */ -/*#define HAVE_RECORDING*/ - - - - -/* define this if you would like tagcache to build on this target */ -/* #define HAVE_TAGCACHE */ - -/* LCD dimensions */ -#define LCD_WIDTH 128 -#define LCD_HEIGHT 64 -/* sqrt(128^2 + 64^2) / 1.0 = 143.1 */ -#define LCD_DPI 143 -#define LCD_DEPTH 1 - -#define LCD_PIXELFORMAT VERTICAL_PACKING - -/* Display colours, for screenshots and sim (0xRRGGBB) */ -#define LCD_DARKCOLOR 0x000000 -#define LCD_BRIGHTCOLOR 0x5e6854 -#define LCD_BL_DARKCOLOR 0x000000 -#define LCD_BL_BRIGHTCOLOR 0x3ca0e6 - -#define CONFIG_KEYPAD IRIVER_IFP7XX_PAD - -#define CONFIG_STORAGE STORAGE_NAND - -#define CONFIG_NAND NAND_IFP7XX - -#define HAVE_FAT16SUPPORT - - - - -/* Define this if you have a software controlled poweroff */ -#define HAVE_SW_POWEROFF - -/* The number of bytes reserved for loadable codecs */ -#define CODEC_SIZE 0x38000 - -/* The number of bytes reserved for loadable plugins */ -#define PLUGIN_BUFFER_SIZE 0x10000 - -/* Define this if you have the WM8975 audio codec */ -/* #define HAVE_WM8975 */ - -#define HAVE_LCD_CONTRAST - -#define MIN_CONTRAST_SETTING 5 -#define MAX_CONTRAST_SETTING 63 -#define DEFAULT_CONTRAST_SETTING 40 - -/* define this if you have a flash memory storage */ -#define HAVE_FLASH_STORAGE - -#define BATTERY_CAPACITY_DEFAULT 1000 /* default battery capacity */ -#define BATTERY_CAPACITY_MIN 500 /* min. capacity selectable */ -#define BATTERY_CAPACITY_MAX 2800 /* max. capacity selectable */ -#define BATTERY_CAPACITY_INC 50 /* capacity increment */ -#define BATTERY_TYPES_COUNT 2 /* Alkalines or NiMH */ - -#define CONFIG_BATTERY_MEASURE VOLTAGE_MEASURE - -/* define this if the unit should not shut down on low battery. */ -#define NO_LOW_BATTERY_SHUTDOWN - -/* Define this if you have a Philips PNX0101 */ -#define CONFIG_CPU PNX0101 - -/* Define this if you want to use the PNX0101 i2c interface */ -#define CONFIG_I2C I2C_PNX0101 - -/* The start address index for ROM builds */ -#define ROM_START 0x00000000 - -/* Define this for LCD backlight available */ -#define HAVE_BACKLIGHT - -/* Define this to the CPU frequency */ -#define CPU_FREQ 48000000 - -#define CONFIG_LCD LCD_IFP7XX - -/* Offset ( in the firmware file's header ) to the file length */ -#define FIRMWARE_OFFSET_FILE_LENGTH 0 - -/* Offset ( in the firmware file's header ) to the file CRC */ -#define FIRMWARE_OFFSET_FILE_CRC 0 - -/* Offset ( in the firmware file's header ) to the real data */ -#define FIRMWARE_OFFSET_FILE_DATA 8 - -#define USB_ISP1582 - -#define HAVE_GDB_API - -/* Define this if you have adjustable CPU frequency */ -#define HAVE_ADJUSTABLE_CPU_FREQ - -#define BOOTFILE_EXT "iriver" -#define BOOTFILE "rockbox." BOOTFILE_EXT -#define BOOTDIR "/.rockbox" - -#define IBSS_ATTR_VOICE_STACK -#define ICODE_ATTR_TREMOR_NOT_MDCT -#define ICODE_ATTR_TREMOR_MDCT -#define ICODE_ATTR_FLAC -#define IBSS_ATTR_FLAC_DECODED0 -#define ICONST_ATTR_MPA_HUFFMAN -#define IBSS_ATTR_MPC_SAMPLE_BUF -#define ICODE_ATTR_ALAC -#define IBSS_ATTR_SHORTEN_DECODED0 - -#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */ - -/* Define this if a programmable hotkey is mapped */ -#define HAVE_HOTKEY diff --git a/firmware/export/gdb_api.h b/firmware/export/gdb_api.h index 1836c5992e..d2358ee3bb 100644 --- a/firmware/export/gdb_api.h +++ b/firmware/export/gdb_api.h @@ -25,9 +25,6 @@ #include "config.h" #define GDB_API_MAGIC 0x6db570b -#ifdef IRIVER_IFP7XX_SERIES -#define GDB_API_ADDRESS 0xc06000 -#endif struct gdb_api { diff --git a/firmware/export/ifp_usb_serial.h b/firmware/export/ifp_usb_serial.h deleted file mode 100644 index b56e5fff86..0000000000 --- a/firmware/export/ifp_usb_serial.h +++ /dev/null @@ -1,30 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2006 by Tomasz Malesinski - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#ifndef _USB_SERIAL_H_ -#define _USB_SERIAL_H_ - -void usb_serial_init(void); -void usb_serial_put_byte(int b); -int usb_serial_get_byte(void); -int usb_serial_try_put_byte(int b); -int usb_serial_try_get_byte(void); - -#endif diff --git a/firmware/ifp_usb_serial.c b/firmware/ifp_usb_serial.c deleted file mode 100644 index f7e3a51858..0000000000 --- a/firmware/ifp_usb_serial.c +++ /dev/null @@ -1,1121 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2006 by Tomasz Malesinski - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -/* -#define LCD_DEBUG -#define BUTTONS -*/ - -/* #include "config.h" */ -#include -#include "pnx0101.h" -#include "ifp_usb_serial.h" - -#ifdef BUTTONS -#include "kernel.h" -#include "button.h" -#include "system.h" -#endif - -#ifdef LCD_DEBUG -#include "lcd.h" -#endif - - -#define ISP1582_BASE (0x24100000) -#define ISP1582_ADDRESS (*(volatile unsigned char *)ISP1582_BASE) -#define ISP1582_MODE (*(volatile unsigned short *)(ISP1582_BASE + 0xc)) -#define ISP1582_INTCONF (*(volatile unsigned char *)(ISP1582_BASE + 0x10)) -#define ISP1582_OTG (*(volatile unsigned char *)(ISP1582_BASE + 0x12)) -#define ISP1582_INTEN (*(volatile unsigned long *)(ISP1582_BASE + 0x14)) - -#define ISP1582_EPINDEX (*(volatile unsigned char *)(ISP1582_BASE + 0x2c)) -#define ISP1582_CTRLFUN (*(volatile unsigned char *)(ISP1582_BASE + 0x28)) -#define ISP1582_DATA (*(volatile unsigned short *)(ISP1582_BASE + 0x20)) -#define ISP1582_BUFLEN (*(volatile unsigned short *)(ISP1582_BASE + 0x1c)) -#define ISP1582_BUFSTAT (*(volatile unsigned char *)(ISP1582_BASE + 0x1e)) -#define ISP1582_MAXPKSZ (*(volatile unsigned short *)(ISP1582_BASE + 0x04)) -#define ISP1582_EPTYPE (*(volatile unsigned short *)(ISP1582_BASE + 0x08)) - -#define ISP1582_INT (*(volatile unsigned long *)(ISP1582_BASE + 0x18)) -#define ISP1582_CHIPID (*(volatile unsigned long *)(ISP1582_BASE + 0x70)) -#define ISP1582_FRAMENO (*(volatile unsigned short *)(ISP1582_BASE + 0x74)) -#define ISP1582_UNLOCK (*(volatile unsigned short *)(ISP1582_BASE + 0x7c)) - -#define ISP1582_UNLOCK_CODE 0xaa37 - -#define TYPE_BULK 2 - -#define STATE_DEFAULT 0 -#define STATE_ADDRESS 1 -#define STATE_CONFIGURED 2 - -#define N_ENDPOINTS 2 - -struct usb_endpoint -{ - unsigned char *out_buf; - short out_len; - short out_ptr; - void (*out_done)(int, unsigned char *, int); - unsigned char out_in_progress; - - unsigned char *in_buf; - short in_min_len; - short in_max_len; - short in_ptr; - void (*in_done)(int, unsigned char *, int); - unsigned char in_ack; - - unsigned char halt[2]; - unsigned char enabled[2]; - short max_pkt_size[2]; -}; - -static char usb_connect_state; - -static struct usb_endpoint endpoints[N_ENDPOINTS]; - -static unsigned char setup_pkt_buf[8]; -static unsigned char setup_out_buf[8]; -static unsigned char usb_state; -static unsigned char usb_remote_wakeup; - -#ifdef LCD_DEBUG -static unsigned char int_count[32]; - -static int log_pos_x = 0; -static int log_pos_y = 3; -#endif - -static void nop_f(void) -{ -} - -#ifdef LCD_DEBUG -static void log_char(char c) -{ - char s[2]; - - s[0] = c; - s[1] = 0; - - lcd_puts(log_pos_x, log_pos_y, s); - lcd_update(); - log_pos_x++; - if (log_pos_x >= 16) - { - log_pos_x = 0; - log_pos_y++; - if (log_pos_y > 5) - log_pos_y = 3; - } -} -#else -#define log_char(c) -#endif - -#define SERIAL_BUF_SIZE 1024 - -struct serial_fifo -{ - unsigned char buf[SERIAL_BUF_SIZE]; - short head, tail; -}; - -static struct serial_fifo serial_in_fifo; -static struct serial_fifo serial_out_fifo; -static unsigned char serial_in_pkt[64]; - -static unsigned char device_descriptor[18] = { - 0x12, /* length */ - 0x01, /* descriptor type */ - 0x10, 0x01, /* USB version (1.1) */ - 0xff, 0xff, /* class and subclass */ - 0xff, /* protocol */ - 0x40, /* max packet size 0 */ - 0x02, 0x41, /* vendor (iRiver) */ - 0x07, 0xee, /* product (0xee07) */ - 0x01, 0x00, /* device version */ - 0x01, /* manufacturer string */ - 0x02, /* product string */ - 0x00, /* serial number string */ - 0x01 /* number of configurations */ -}; - -static unsigned char cfg_descriptor[32] = { - 0x09, /* length */ - 0x02, /* descriptor type */ - 0x20, 0x00, /* total length */ - 0x01, /* number of interfaces */ - 0x01, /* configuration value */ - 0x00, /* configuration string */ - 0x80, /* attributes (none) */ - 0x32, /* max power (100 mA) */ - /* interface descriptor */ - 0x09, /* length */ - 0x04, /* descriptor type */ - 0x00, /* interface number */ - 0x00, /* alternate setting */ - 0x02, /* number of endpoints */ - 0xff, /* interface class */ - 0xff, /* interface subclass */ - 0xff, /* interface protocol */ - 0x00, /* interface string */ - /* endpoint IN */ - 0x07, /* length */ - 0x05, /* descriptor type */ - 0x81, /* endpoint 1 IN */ - 0x02, /* attributes (bulk) */ - 0x40, 0x00, /* max packet size */ - 0x00, /* interval */ - /* endpoint OUT */ - 0x07, /* length */ - 0x05, /* descriptor type */ - 0x01, /* endpoint 1 IN */ - 0x02, /* attributes (bulk) */ - 0x40, 0x00, /* max packet size */ - 0x00 /* interval */ -}; - -static unsigned char lang_descriptor[4] = { - 0x04, /* length */ - 0x03, /* descriptor type */ - 0x09, 0x04 /* English (US) */ -}; - -#define N_STRING_DESCRIPTORS 2 - -static unsigned char string_descriptor_vendor[] = { - 0x2e, 0x03, - 'i', 0, 'R', 0, 'i', 0, 'v', 0, 'e', 0, 'r', 0, ' ', 0, 'L', 0, - 't', 0, 'd', 0, ' ', 0, 'a', 0, 'n', 0, 'd', 0, ' ', 0, 'R', 0, - 'o', 0, 'c', 0, 'k', 0, 'b', 0, 'o', 0, 'x', 0}; - -static unsigned char string_descriptor_product[] = { - 0x1c, 0x03, - 'i', 0, 'R', 0, 'i', 0, 'v', 0, 'e', 0, 'r', 0, ' ', 0, 'i', 0, - 'F', 0, 'P', 0, '7', 0, '0', 0, '0', 0}; - -static unsigned char *string_descriptor[N_STRING_DESCRIPTORS] = { - string_descriptor_vendor, - string_descriptor_product -}; - -static inline int ep_index(int n, int dir) -{ - return (n << 1) | dir; -} - -static inline int epidx_dir(int idx) -{ - return idx & 1; -} - -static inline int epidx_n(int idx) -{ - return idx >> 1; -} - -int usb_connected(void) -{ - return GPIO7_READ & 1; -} - -static inline void usb_select_endpoint(int idx) -{ - ISP1582_EPINDEX = idx; -} - -static inline void usb_select_setup_endpoint(void) -{ - ISP1582_EPINDEX = 0x20; -} - -static void usb_setup_endpoint(int idx, int max_pkt_size, int type) -{ - struct usb_endpoint *ep; - - usb_select_endpoint(idx); - ISP1582_MAXPKSZ = max_pkt_size; - /* |= is in the original firmware */ - ISP1582_EPTYPE |= 0x1c | type; - /* clear buffer */ - ISP1582_CTRLFUN |= 0x10; - ISP1582_INTEN |= (1 << (10 + idx)); - - ep = &(endpoints[epidx_n(idx)]); - ep->halt[epidx_dir(idx)] = 0; - ep->enabled[epidx_dir(idx)] = 1; - ep->out_in_progress = 0; - ep->in_min_len = -1; - ep->in_ack = 0; - ep->max_pkt_size[epidx_dir(idx)] = max_pkt_size; -} - -static void usb_disable_endpoint(int idx) -{ - usb_select_endpoint(idx); - ISP1582_EPTYPE &= 8; - ISP1582_INTEN &= ~(1 << (10 + idx)); - endpoints[epidx_n(idx)].enabled[epidx_dir(idx)] = 1; -} - -void usb_reconnect(void) -{ - int i; - ISP1582_MODE &= ~1; /* SOFTCT off */ - for (i = 0; i < 10000; i++) - nop_f(); - ISP1582_MODE |= 1; /* SOFTCT on */ -} - -static void usb_cleanup(void) -{ - ISP1582_MODE &= ~1; /* SOFTCT off */ -} - -static void usb_setup(int reset) -{ - int i; - - for (i = 0; i < N_ENDPOINTS; i++) - endpoints[i].enabled[0] = endpoints[i].enabled[1] = 0; - - ISP1582_UNLOCK = ISP1582_UNLOCK_CODE; - if (!reset) - ISP1582_MODE = 0x88; /* CLKAON | GLINTENA */ - ISP1582_INTCONF = 0x57; - ISP1582_INTEN = 0xd39; - - ISP1582_ADDRESS = reset ? 0x80: 0; - - usb_setup_endpoint(ep_index(0, DIR_RX), 64, 0); - usb_setup_endpoint(ep_index(0, DIR_TX), 64, 0); - - ISP1582_MODE |= 1; /* SOFTCT on */ - - usb_state = STATE_DEFAULT; - usb_remote_wakeup = 0; -} - -static int usb_get_packet(unsigned char *buf, int max_len) -{ - int len, i; - len = ISP1582_BUFLEN; - - if (max_len < 0 || max_len > len) - max_len = len; - - i = 0; - while (i < len) - { - unsigned short d = ISP1582_DATA; - if (i < max_len) - buf[i] = d & 0xff; - i++; - if (i < max_len) - buf[i] = (d >> 8) & 0xff; - i++; - } - return max_len; -} - -static void usb_receive(int n) -{ - int len; - - if (endpoints[n].halt[DIR_RX] - || !endpoints[n].enabled[DIR_RX] - || endpoints[n].in_min_len < 0 - || !endpoints[n].in_ack) - return; - - endpoints[n].in_ack = 0; - - usb_select_endpoint(ep_index(n, DIR_RX)); - - len = usb_get_packet(endpoints[n].in_buf + endpoints[n].in_ptr, - endpoints[n].in_max_len - endpoints[n].in_ptr); - endpoints[n].in_ptr += len; - if (endpoints[n].in_ptr >= endpoints[n].in_min_len) { - endpoints[n].in_min_len = -1; - if (endpoints[n].in_done) - (*(endpoints[n].in_done))(n, endpoints[n].in_buf, - endpoints[n].in_ptr); - } -} - -static int usb_out_buffer_full(int ep) -{ - usb_select_endpoint(ep_index(ep, DIR_TX)); - if (ISP1582_EPTYPE & 4) - return (ISP1582_BUFSTAT & 3) == 3; - else - return (ISP1582_BUFSTAT & 3) != 0; -} - -static void usb_send(int n) -{ - int max_pkt_size, len; - int i; - unsigned char *p; - -#ifdef LCD_DEBUG - if (endpoints[n].halt[DIR_TX]) - log_char('H'); - if (!endpoints[n].out_in_progress) - log_char('$'); -#endif - - if (endpoints[n].halt[DIR_TX] - || !endpoints[n].enabled[DIR_TX] - || !endpoints[n].out_in_progress) - return; - - if (endpoints[n].out_ptr < 0) - { - endpoints[n].out_in_progress = 0; - if (endpoints[n].out_done) - (*(endpoints[n].out_done))(n, endpoints[n].out_buf, - endpoints[n].out_len); - return; - } - - if (usb_out_buffer_full(n)) - { - log_char('F'); - return; - } - - usb_select_endpoint(ep_index(n, DIR_TX)); - max_pkt_size = endpoints[n].max_pkt_size[DIR_TX]; - len = endpoints[n].out_len - endpoints[n].out_ptr; - if (len > max_pkt_size) - len = max_pkt_size; - - log_char('0' + (len % 10)); - ISP1582_BUFLEN = len; - p = endpoints[n].out_buf + endpoints[n].out_ptr; - i = 0; - while (len - i >= 2) { - ISP1582_DATA = p[i] | (p[i + 1] << 8); - i += 2; - } - if (i < len) - ISP1582_DATA = p[i]; - - endpoints[n].out_ptr += len; - -/* - if (endpoints[n].out_ptr == endpoints[n].out_len - && len < max_pkt_size) -*/ - if (endpoints[n].out_ptr == endpoints[n].out_len) - endpoints[n].out_ptr = -1; -} - -static void usb_stall_endpoint(int idx) -{ - usb_select_endpoint(idx); - ISP1582_CTRLFUN |= 1; - endpoints[epidx_n(idx)].halt[epidx_dir(idx)] = 1; -} - -static void usb_unstall_endpoint(int idx) -{ - usb_select_endpoint(idx); - ISP1582_CTRLFUN &= ~1; - ISP1582_EPTYPE &= ~8; - ISP1582_EPTYPE |= 8; - ISP1582_CTRLFUN |= 0x10; - if (epidx_dir(idx) == DIR_TX) - endpoints[epidx_n(idx)].out_in_progress = 0; - else - { - endpoints[epidx_n(idx)].in_min_len = -1; - endpoints[epidx_n(idx)].in_ack = 0; - } - endpoints[epidx_n(idx)].halt[epidx_dir(idx)] = 0; -} - -static void usb_status_ack(int dir) -{ - log_char(dir ? '@' : '#'); - usb_select_endpoint(ep_index(0, dir)); - ISP1582_CTRLFUN |= 2; -} - -static void usb_set_address(int adr) -{ - ISP1582_ADDRESS = adr | 0x80; -} - -static void usb_data_stage_enable(int dir) -{ - usb_select_endpoint(ep_index(0, dir)); - ISP1582_CTRLFUN |= 4; -} - -static void usb_request_error(void) -{ - usb_stall_endpoint(ep_index(0, DIR_TX)); - usb_stall_endpoint(ep_index(0, DIR_RX)); -} - -static void usb_receive_block(unsigned char *buf, int min_len, - int max_len, - void (*in_done)(int, unsigned char *, int), - int ep) -{ - endpoints[ep].in_done = in_done; - endpoints[ep].in_buf = buf; - endpoints[ep].in_max_len = max_len; - endpoints[ep].in_min_len = min_len; - endpoints[ep].in_ptr = 0; - usb_receive(ep); -} - -static void usb_send_block(unsigned char *buf, int len, - void (*done)(int, unsigned char *, int), - int ep) -{ - endpoints[ep].out_done = done; - endpoints[ep].out_buf = buf; - endpoints[ep].out_len = len; - endpoints[ep].out_ptr = 0; - endpoints[ep].out_in_progress = 1; - usb_send(ep); -} - -static void out_send_status(int n, unsigned char *buf, int len) -{ - (void)n; - (void)buf; - (void)len; - usb_status_ack(DIR_RX); -} - -static void usb_send_block_and_status(unsigned char *buf, int len, int ep) -{ - usb_send_block(buf, len, out_send_status, ep); -} - -static void usb_setup_set_address(int adr) -{ - usb_set_address(adr); - usb_state = adr ? STATE_ADDRESS : STATE_DEFAULT; - usb_status_ack(DIR_TX); -} - -static void usb_send_descriptor(unsigned char *device_descriptor, - int descriptor_len, int buffer_len) -{ - int len = descriptor_len < buffer_len ? descriptor_len : buffer_len; - usb_send_block_and_status(device_descriptor, len, 0); -} - -static void usb_setup_get_descriptor(int type, int index, int lang, int len) -{ - (void)lang; - usb_data_stage_enable(DIR_TX); - switch (type) - { - case 1: - if (index == 0) - usb_send_descriptor(device_descriptor, - sizeof(device_descriptor), len); - else - usb_request_error(); - break; - case 2: - if (index == 0) - usb_send_descriptor(cfg_descriptor, - sizeof(cfg_descriptor), len); - else - usb_request_error(); - break; - case 3: - if (index == 0) - usb_send_descriptor(lang_descriptor, - sizeof(lang_descriptor), len); - else if (index <= N_STRING_DESCRIPTORS) - usb_send_descriptor(string_descriptor[index - 1], - string_descriptor[index - 1][0], - len); - else - usb_request_error(); - break; - default: - usb_request_error(); - } -} - -static void usb_setup_get_configuration(void) -{ - setup_out_buf[0] = (usb_state == STATE_CONFIGURED) ? 1 : 0; - usb_data_stage_enable(DIR_TX); - usb_send_block_and_status(setup_out_buf, 1, 0); -} - -static void usb_setup_interface(void) -{ - usb_setup_endpoint(ep_index(1, DIR_RX), 64, TYPE_BULK); - usb_setup_endpoint(ep_index(1, DIR_TX), 64, TYPE_BULK); -} - -static void usb_setup_set_configuration(int value) -{ - switch (value) - { - case 0: - usb_disable_endpoint(ep_index(1, DIR_RX)); - usb_disable_endpoint(ep_index(1, DIR_TX)); - usb_state = STATE_ADDRESS; - usb_status_ack(DIR_TX); - break; - case 1: - usb_setup_interface(); - usb_state = STATE_CONFIGURED; - usb_status_ack(DIR_TX); - break; - default: - usb_request_error(); - } -} - -static void usb_send_status(void) -{ - usb_data_stage_enable(DIR_TX); - usb_send_block_and_status(setup_out_buf, 2, 0); -} - -static void usb_setup_get_device_status(void) -{ - setup_out_buf[0] = (usb_remote_wakeup != 0) ? 2 : 0; - setup_out_buf[1] = 0; - usb_send_status(); -} - -static void usb_setup_clear_device_feature(int feature) -{ - if (feature == 1) { - usb_remote_wakeup = 0; - usb_status_ack(DIR_TX); - } else - usb_request_error(); -} - -static void usb_setup_set_device_feature(int feature) -{ - if (feature == 1) { - usb_remote_wakeup = 1; - usb_status_ack(DIR_TX); - } else - usb_request_error(); -} - -static void usb_setup_clear_endpoint_feature(int endpoint, int feature) -{ - if (usb_state != STATE_CONFIGURED || feature != 0) - usb_request_error(); - else if ((endpoint & 0xf) == 1) - { - usb_unstall_endpoint(ep_index(endpoint & 0xf, endpoint >> 7)); - usb_status_ack(DIR_TX); - } - else - usb_request_error(); -} - -static void usb_setup_set_endpoint_feature(int endpoint, int feature) -{ - if (usb_state != STATE_CONFIGURED || feature != 0) - usb_request_error(); - else if ((endpoint & 0xf) == 1) - { - usb_stall_endpoint(ep_index(endpoint & 0xf, endpoint >> 7)); - usb_status_ack(DIR_TX); - } - else - usb_request_error(); -} - -static void usb_setup_get_interface_status(int interface) -{ - if (usb_state != STATE_CONFIGURED || interface != 0) - usb_request_error(); - else - { - setup_out_buf[0] = setup_out_buf[1] = 0; - usb_send_status(); - } -} - -static void usb_setup_get_endpoint_status(int endpoint) -{ - if ((usb_state == STATE_CONFIGURED && (endpoint & 0xf) <= 1) - || (usb_state == STATE_ADDRESS && (endpoint & 0xf) == 0)) - { - setup_out_buf[0] = endpoints[endpoint & 0xf].halt[endpoint >> 7]; - setup_out_buf[1] = 0; - usb_send_status(); - } - else - usb_request_error(); -} - -static void usb_setup_get_interface(int interface) -{ - if (usb_state != STATE_CONFIGURED || interface != 0) - usb_request_error(); - else - { - setup_out_buf[0] = 0; - usb_data_stage_enable(DIR_TX); - usb_send_block_and_status(setup_out_buf, 1, 0); - } -} - -static void usb_setup_set_interface(int interface, int setting) -{ - if (usb_state != STATE_CONFIGURED || interface != 0 || setting != 0) - usb_request_error(); - else - { - usb_setup_interface(); - usb_status_ack(DIR_TX); - } -} - -static void usb_handle_setup_pkt(unsigned char *pkt) -{ - switch ((pkt[0] << 8) | pkt[1]) - { - case 0x0005: - log_char('A'); - usb_setup_set_address(pkt[2]); - break; - case 0x8006: - log_char('D'); - usb_setup_get_descriptor(pkt[3], pkt[2], (pkt[5] << 8) | pkt[4], - (pkt[7] << 8) | pkt[6]); - break; - case 0x8008: - usb_setup_get_configuration(); - break; - case 0x0009: - usb_setup_set_configuration(pkt[2]); - break; - case 0x8000: - usb_setup_get_device_status(); - break; - case 0x8100: - usb_setup_get_interface_status(pkt[4]); - break; - case 0x8200: - usb_setup_get_endpoint_status(pkt[4]); - break; - case 0x0001: - usb_setup_clear_device_feature(pkt[2]); - break; - case 0x0201: - usb_setup_clear_endpoint_feature(pkt[4], pkt[2]); - break; - case 0x0003: - usb_setup_set_device_feature(pkt[2]); - break; - case 0x0203: - usb_setup_set_endpoint_feature(pkt[4], pkt[2]); - break; - case 0x810a: - usb_setup_get_interface(pkt[4]); - break; - case 0x010b: - usb_setup_set_interface(pkt[4], pkt[2]); - break; - case 0x0103: - /* set interface feature */ - case 0x0101: - /* clear interface feature */ - case 0x0007: - /* set descriptor */ - case 0x820c: - /* synch frame */ - default: - usb_request_error(); - } -} - -static void usb_handle_setup_rx(void) -{ - int len; -#ifdef LCD_DEBUG - char s[20]; - int i; -#endif - usb_select_setup_endpoint(); - len = usb_get_packet(setup_pkt_buf, 8); - - if (len == 8) - usb_handle_setup_pkt(setup_pkt_buf); - -#ifdef LCD_DEBUG -/* - snprintf(s, 10, "l%02x", len); - lcd_puts(0, 5, s); -*/ - for (i = 0; i < 8; i++) - snprintf(s + i * 2, 3, "%02x", setup_pkt_buf[i]); - lcd_puts(0, 0, s); - lcd_update(); -#endif -} - -static void usb_handle_data_int(int ep, int dir) -{ - if (dir == DIR_TX) - usb_send(ep); - else - { - endpoints[ep].in_ack = 1; - usb_receive(ep); - } -} - -static void usb_handle_int(int i) -{ -#ifdef LCD_DEBUG -/* - char s[10]; - snprintf(s, sizeof(s), "%02d", i); - lcd_puts(0, 2, s); - lcd_update(); -*/ - int_count[i]++; - if (i == 10) - log_char('o'); - if (i == 11) - log_char('i'); - if (i == 12) - log_char('O'); - if (i == 13) - log_char('I'); -#endif - - if (i >= 10) - usb_handle_data_int((i - 10) / 2, i % 2); - else - { - switch (i) - { - case 0: - log_char('r'); - usb_setup(1); - break; - case 8: - log_char('s'); - usb_handle_setup_rx(); - break; - } - } - -} - -static void usb_handle_interrupts(void) -{ -#ifdef LCD_DEBUG - char s[20]; -#endif - - while (1) - { - unsigned long ints; - int i; - -#ifdef LCD_DEBUG - /* - snprintf(s, sizeof(s), "i%08lx", ISP1582_INT); - lcd_puts(0, 2, s); - */ -#endif - - ints = ISP1582_INT & ISP1582_INTEN; - if (!ints) break; - - i = 0; - while (!(ints & (1 << i))) - i++; - ISP1582_INT = 1 << i; - usb_handle_int(i); - -#ifdef LCD_DEBUG - for (i = 0; i < 8; i++) - snprintf(s + i * 2, 3, "%02x", int_count[i]); - lcd_puts(0, 6, s); - for (i = 0; i < 8; i++) - snprintf(s + i * 2, 3, "%02x", int_count[i + 8]); - lcd_puts(0, 7, s); -#endif - } -#ifdef LCD_DEBUG -/* - lcd_puts(0, 3, usb_connected() ? "C" : "N"); - lcd_update(); -*/ -#endif -} - -static inline int fifo_mod(int n) -{ - return (n >= SERIAL_BUF_SIZE) ? n - SERIAL_BUF_SIZE : n; -} - -static void fifo_init(struct serial_fifo *fifo) -{ - fifo->head = fifo->tail = 0; -} - -static int fifo_empty(struct serial_fifo *fifo) -{ - return fifo->head == fifo->tail; -} - -static int fifo_full(struct serial_fifo *fifo) -{ - return fifo_mod(fifo->head + 1) == fifo->tail; -} - -static void fifo_remove(struct serial_fifo *fifo, int n) -{ - fifo->tail = fifo_mod(fifo->tail + n); -} - -/* - Not used: -static void fifo_add(struct serial_fifo *fifo, int n) -{ - fifo->head = fifo_mod(fifo->head + n); -} - -static void fifo_free_block(struct serial_fifo *fifo, - unsigned char **ptr, int *len) -{ - *ptr = fifo->buf + fifo->head; - if (fifo->head >= fifo->tail) - { - int l = SERIAL_BUF_SIZE - fifo->head; - if (fifo->tail == 0) - l--; - *len = l; - } - else - *len = fifo->tail - fifo->head - 1; -} -*/ - -static int fifo_free_space(struct serial_fifo *fifo) -{ - if (fifo->head >= fifo->tail) - return SERIAL_BUF_SIZE - (fifo->head - fifo->tail) - 1; - else - return fifo->tail - fifo->head - 1; -} - -static int fifo_get_byte(struct serial_fifo *fifo) -{ - int r = fifo->buf[fifo->tail]; - fifo->tail = fifo_mod(fifo->tail + 1); - return r; -} - -static void fifo_put_byte(struct serial_fifo *fifo, int b) -{ - fifo->buf[fifo->head] = b; - fifo->head = fifo_mod(fifo->head + 1); -} - -static void fifo_full_block(struct serial_fifo *fifo, - unsigned char **ptr, int *len) -{ - *ptr = fifo->buf + fifo->tail; - if (fifo->head >= fifo->tail) - *len = fifo->head - fifo->tail; - else - *len = SERIAL_BUF_SIZE - fifo->tail; -} - -static void serial_fill_in_fifo(int ep, unsigned char *buf, int len); -static void serial_free_out_fifo(int ep, unsigned char *buf, int len); - -static void serial_restart_input(int ep) -{ - if (fifo_free_space(&serial_in_fifo) >= 64) - usb_receive_block(serial_in_pkt, 1, 64, serial_fill_in_fifo, ep); -} - -static void serial_fill_in_fifo(int ep, unsigned char *buf, int len) -{ - int i; - for (i = 0; i < len; i++) - fifo_put_byte(&serial_in_fifo, buf[i]); - serial_restart_input(ep); -} - -static void serial_restart_output(int ep) -{ - unsigned char *block; - int blen; - fifo_full_block(&serial_out_fifo, &block, &blen); - if (blen) - { -#ifdef LCD_DEBUG - lcd_putsf(0, 2, "o%03lx/%03x", block - serial_out_fifo.buf, blen); - lcd_update(); -#endif - usb_send_block(block, blen, serial_free_out_fifo, ep); - } -} - -static void serial_free_out_fifo(int ep, unsigned char *buf, int len) -{ - (void)buf; - fifo_remove(&serial_out_fifo, len); - serial_restart_output(ep); -} - -static void usb_serial_handle(void) -{ -#ifdef BUTTONS - static int t = 0; - - t++; - if (t >= 1000) - { - int b; - t = 0; - yield(); - b = button_get(false); - if (b == BUTTON_PLAY) - system_reboot(); - else if (b & BUTTON_REL) - usb_reconnect(); - } -#endif - - - if (!usb_connect_state) - { - if (usb_connected()) - { - int i; - GPIO3_SET = 4; - (*(volatile unsigned long *)0x80005004) = 2; - (*(volatile unsigned long *)0x80005008) = 0; - for (i = 0; i < 100000; i++) - nop_f(); - usb_setup(0); - usb_connect_state = 1; - } - } - else - { - if (!usb_connected()) - { - usb_connect_state = 0; - usb_cleanup(); - } - else - { - usb_handle_interrupts(); - - if (usb_state == STATE_CONFIGURED) - { - if (endpoints[1].in_min_len < 0) - serial_restart_input(1); - if (!endpoints[1].out_in_progress) - serial_restart_output(1); - } - } - } -} - - -/* - Not used: -static int usb_serial_in_empty(void) -{ - return fifo_empty(&serial_in_fifo); -} -*/ - -int usb_serial_get_byte(void) -{ - while (fifo_empty(&serial_in_fifo)) - usb_serial_handle(); - return fifo_get_byte(&serial_in_fifo); -} - -int usb_serial_try_get_byte(void) -{ - int r; - if (fifo_empty(&serial_in_fifo)) - r = -1; - else - r = fifo_get_byte(&serial_in_fifo); - usb_serial_handle(); - return r; -} - -/* - Not used: -static int usb_serial_out_full(void) -{ - return fifo_full(&serial_out_fifo); -} -*/ - -void usb_serial_put_byte(int b) -{ - while (fifo_full(&serial_out_fifo)) - usb_serial_handle(); - fifo_put_byte(&serial_out_fifo, b); - usb_serial_handle(); -} - -int usb_serial_try_put_byte(int b) -{ - int r = -1; - if (!fifo_full(&serial_out_fifo)) - { - fifo_put_byte(&serial_out_fifo, b); - r = 0; - } - usb_serial_handle(); - return r; -} - -void usb_serial_init(void) -{ - fifo_init(&serial_in_fifo); - fifo_init(&serial_out_fifo); - usb_connect_state = 0; -} diff --git a/firmware/rolo.c b/firmware/rolo.c index d435db977e..3496545cac 100644 --- a/firmware/rolo.c +++ b/firmware/rolo.c @@ -69,9 +69,6 @@ extern int write_bootdata(unsigned char* buf, int len, unsigned int boot_volume #include "backlight-target.h" #endif -#if !defined(IRIVER_IFP7XX_SERIES) -/* FIX: this doesn't work on iFP */ - #define IRQ0_EDGE_TRIGGER 0x80 static int rolo_handle; @@ -331,13 +328,3 @@ int rolo_load(const char* filename) /* never reached */ return 0; } - -#else /* !defined(IRIVER_IFP7XX_SERIES) */ -int rolo_load(const char* filename) -{ - /* dummy */ - (void)filename; - return 0; -} - -#endif /* !defined(IRIVER_IFP7XX_SERIES) */ diff --git a/firmware/target/arm/pnx0101/app.lds b/firmware/target/arm/pnx0101/app.lds deleted file mode 100644 index f14ef90129..0000000000 --- a/firmware/target/arm/pnx0101/app.lds +++ /dev/null @@ -1,144 +0,0 @@ -#include "config.h" - -ENTRY(start) - -OUTPUT_FORMAT(elf32-littlearm) -OUTPUT_ARCH(arm) -STARTUP(target/arm/pnx0101/crt0-pnx0101.o) - -#define PLUGINSIZE PLUGIN_BUFFER_SIZE -#define CODECSIZE CODEC_SIZE - -#ifdef DEBUG -#define STUBOFFSET 0x10000 -#else -#define STUBOFFSET 0 -#endif - -#define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGINSIZE - STUBOFFSET - CODECSIZE - -#define DRAMORIG 0xc00000 + STUBOFFSET -#define IRAM0ORIG 0x000000 -#define IRAM0SIZE 0x7000 -#define IRAMORIG 0x400000 -#define IRAMSIZE 0x7000 - -/* End of the audio buffer, where the codec buffer starts */ -#define ENDAUDIOADDR (DRAMORIG + DRAMSIZE) - -/* Where the codec buffer ends, and the plugin buffer starts */ -#define ENDADDR (ENDAUDIOADDR + CODECSIZE) - -MEMORY -{ - DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE - IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE - IRAM0 : ORIGIN = IRAM0ORIG, LENGTH = IRAM0SIZE -} - -SECTIONS -{ - .text : - { - loadaddress = .; - _loadaddress = .; - . = ALIGN(0x200); - *(.init.text) - *(.text*) - *(.glue_7) - *(.glue_7t) - . = ALIGN(0x4); - } > DRAM - - .rodata : - { - *(.rodata) /* problems without this, dunno why */ - *(.rodata*) - *(.rodata.str1.1) - *(.rodata.str1.4) - . = ALIGN(0x4); - } > DRAM - - .data : - { - *(.data*) - . = ALIGN(0x4); - } > DRAM - - /DISCARD/ : - { - *(.eh_frame) - } - - .vectors 0x0 : - { - _vectorsstart = .; - KEEP(*(.vectors)); - _vectorsend = .; - *(.dmabuf) - } >IRAM0 AT> DRAM - - _vectorscopy = LOADADDR(.vectors); - - .iram IRAMORIG + SIZEOF(.vectors) : - { - _iramstart = .; - *(.icode) - *(.irodata) - *(.idata) - . = ALIGN(0x4); - _iramend = .; - } > IRAM AT> DRAM - - _iramcopy = LOADADDR(.iram); - - .ibss (NOLOAD) : - { - _iedata = .; - *(.ibss) - . = ALIGN(0x4); - _iend = .; - } > IRAM - - .stack : - { - *(.stack) - stackbegin = .; - . += 0x2000; - stackend = .; - } > IRAM - - .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.iram) + SIZEOF(.vectors): - { - _edata = .; - *(.bss*) - *(COMMON) - . = ALIGN(0x4); - _end = .; - } > DRAM - - .audiobuf ALIGN(4) : - { - _audiobuffer = .; - audiobuffer = .; - } > DRAM - - .audiobufend ENDAUDIOADDR: - { - audiobufend = .; - _audiobufend = .; - } > DRAM - - .codec ENDAUDIOADDR: - { - codecbuf = .; - _codecbuf = .; - } - - .plugin ENDADDR: - { - _pluginbuf = .; - pluginbuf = .; - } -} - diff --git a/firmware/target/arm/pnx0101/backlight-target.h b/firmware/target/arm/pnx0101/backlight-target.h deleted file mode 100644 index 7ebe85d66f..0000000000 --- a/firmware/target/arm/pnx0101/backlight-target.h +++ /dev/null @@ -1,28 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id: backlight-target.h 13136 2007-04-12 22:12:13Z amiconn $ - * - * Copyright (C) 2006 by Barry Wardell - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#ifndef BACKLIGHT_TARGET_H -#define BACKLIGHT_TARGET_H - -#define backlight_hw_init() true -void backlight_hw_on(void); -void backlight_hw_off(void); - -#endif diff --git a/firmware/target/arm/pnx0101/crt0-pnx0101.S b/firmware/target/arm/pnx0101/crt0-pnx0101.S deleted file mode 100644 index 51be8c72a3..0000000000 --- a/firmware/target/arm/pnx0101/crt0-pnx0101.S +++ /dev/null @@ -1,225 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id: crt0.S 11850 2006-12-29 02:49:12Z markun $ - * - * Copyright (C) 2002 by Linus Nielsen Feltzing - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#define ASM /* do not include structure definitions from pnx0101.h */ - -#include "config.h" -#include "cpu.h" - - .section .init.text,"ax",%progbits - - .global start -start: - -/* Arm bootloader and startup code based on startup.s from the iPodLinux loader - * - * Copyright (c) 2003, Daniel Palffy (dpalffy (at) rainstorm.org) - * Copyright (c) 2005, Bernard Leach - * - */ - - msr cpsr_c, #0xd3 /* enter supervisor mode, disable IRQ */ - -#ifndef BOOTLOADER -#ifndef DEBUG - ldr r0, =0x80105000 - mov r1, #1 - str r1, [r0, #4] - mov r1, #0 - str r1, [r0, #4] -1: ldr r1, [r0] - cmp r1, #0 - bne 1b - mov r1, #0x74 - str r1, [r0, #8] - mov r1, #2 - str r1, [r0, #0x18] - mov r1, #2 - str r1, [r0, #0x20] - mov r1, #82 - str r1, [r0, #0x28] - mov r1, #100 - str r1, [r0, #0x2c] - mov r1, #0x120 - str r1, [r0, #0x30] - mov r1, #6 - str r1, [r0, #4] - ldr r0, =1f - mov r15, r0 -1: -#endif /* !DEBUG */ - -#ifndef DEBUG - /* Copy exception handler code to address 0 */ - ldr r2, =_vectorsstart - ldr r3, =_vectorsend - ldr r4, =_vectorscopy -1: - cmp r3, r2 - ldrhi r5, [r4], #4 - strhi r5, [r2], #4 - bhi 1b -#else - ldr r1, =vectors - ldr r0, =irq_handler - str r0, [r1, #24] - ldr r0, =fiq_handler - str r0, [r1, #28] -#endif - -#ifndef STUB - /* Zero out IBSS */ - ldr r2, =_iedata - ldr r3, =_iend - mov r4, #0 -1: - cmp r3, r2 - strhi r4, [r2], #4 - bhi 1b - - /* Copy the IRAM */ - ldr r2, =_iramcopy - ldr r3, =_iramstart - ldr r4, =_iramend -1: - cmp r4, r3 - ldrhi r5, [r2], #4 - strhi r5, [r3], #4 - bhi 1b -#endif /* !STUB */ -#endif /* !BOOTLOADER */ - - /* Initialise bss section to zero */ - ldr r2, =_edata - ldr r3, =_end - mov r4, #0 -1: - cmp r3, r2 - strhi r4, [r2], #4 - bhi 1b - - /* Set up stack for IRQ mode */ - msr cpsr_c, #0xd2 - ldr sp, =irq_stack - /* Set up stack for FIQ mode */ - msr cpsr_c, #0xd1 - ldr sp, =fiq_stack - - /* Let svc, abort and undefined modes use irq stack */ - msr cpsr_c, #0xd3 - ldr sp =irq_stack - msr cpsr_c, #0xd7 - ldr sp, =irq_stack - msr cpsr_c, #0xdb - ldr sp, =irq_stack - - /* Switch to sys mode */ - msr cpsr_c, #0xdf - - /* Set up some stack and munge it with 0xdeadbeef */ - ldr sp, =stackend - mov r3, sp - ldr r2, =stackbegin - ldr r4, =0xdeadbeef -1: - cmp r3, r2 - strhi r4, [r2], #4 - bhi 1b - - bl main - /* main() should never return */ - -/* Exception handlers. Will be copied to address 0 after memory remapping */ - .section .vectors,"aw" - ldr pc, [pc, #24] - ldr pc, [pc, #24] - ldr pc, [pc, #24] - ldr pc, [pc, #24] - ldr pc, [pc, #24] - ldr pc, [pc, #24] - ldr pc, [pc, #24] - ldr pc, [pc, #24] - - /* Exception vectors */ - .global vectors -vectors: - .word start - .word undef_instr_handler - .word software_int_handler - .word prefetch_abort_handler - .word data_abort_handler - .word reserved_handler - .word irq_handler - .word fiq_handler - - .text - -/* All illegal exceptions call into UIE with exception address as first - parameter. This is calculated differently depending on which exception - we're in. Second parameter is exception number, used for a string lookup - in UIE. - */ -undef_instr_handler: - sub r0, lr, #4 - mov r1, #0 - b UIE - -/* We run sys mode most of the time, and should never see a software - exception being thrown. Make it illegal and call UIE. - */ -software_int_handler: -reserved_handler: - sub r0, lr, #4 - mov r1, #4 - b UIE - -prefetch_abort_handler: - sub r0, lr, #4 - mov r1, #1 - b UIE - -fiq_handler: - @ Branch straight to FIQ handler in pcm_playback.c. This also handles the - @ the correct return sequence. - stmfd sp!, {r0-r7, r12, lr} - bl fiq - ldmfd sp!, {r0-r7, r12, lr} - subs pc, lr, #4 - -irq_handler: -#ifndef STUB - stmfd sp!, {r0-r11, r12, lr} - bl irq - ldmfd sp!, {r0-r11, r12, lr} -#endif - subs pc, lr, #4 - -#ifdef STUB -UIE: - b UIE -#endif - -/* 256 words of IRQ stack */ - .space 256*4 -irq_stack: - -/* 256 words of FIQ stack */ - .space 256*4 -fiq_stack: diff --git a/firmware/target/arm/pnx0101/debug-pnx0101.c b/firmware/target/arm/pnx0101/debug-pnx0101.c deleted file mode 100644 index 8dae2e4925..0000000000 --- a/firmware/target/arm/pnx0101/debug-pnx0101.c +++ /dev/null @@ -1,5 +0,0 @@ -#include -bool dbg_ports() -{ - return false; -} diff --git a/firmware/target/arm/pnx0101/i2c-pnx0101.c b/firmware/target/arm/pnx0101/i2c-pnx0101.c deleted file mode 100644 index eaf1e79500..0000000000 --- a/firmware/target/arm/pnx0101/i2c-pnx0101.c +++ /dev/null @@ -1,24 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2005 by Tomasz Malesinski - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -void i2c_init(void) -{ -} diff --git a/firmware/target/arm/pnx0101/iriver-ifp7xx/adc-ifp7xx.c b/firmware/target/arm/pnx0101/iriver-ifp7xx/adc-ifp7xx.c deleted file mode 100644 index 0f306f9986..0000000000 --- a/firmware/target/arm/pnx0101/iriver-ifp7xx/adc-ifp7xx.c +++ /dev/null @@ -1,59 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2006 by Barry Wardell - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#include "config.h" -#include "cpu.h" -#include "system.h" -#include "kernel.h" -#include "thread.h" -#include "adc.h" - -static unsigned short adcdata[NUM_ADC_CHANNELS]; - -unsigned short adc_read(int channel) -{ - return adcdata[channel]; -} - -static void adc_tick(void) -{ - if (ADCST & 0x10) { - adcdata[0] = ADCCH0 & 0x3ff; - adcdata[1] = ADCCH1 & 0x3ff; - adcdata[2] = ADCCH2 & 0x3ff; - adcdata[3] = ADCCH3 & 0x3ff; - adcdata[4] = ADCCH4 & 0x3ff; - ADCST = 0xa; - } -} - -void adc_init(void) -{ - ADCR24 = 0xaaaaa; - ADCR28 = 0; - ADCST = 2; - ADCST = 0xa; - - while (!(ADCST & 0x10)); - adc_tick(); - - tick_add_task(adc_tick); -} - diff --git a/firmware/target/arm/pnx0101/iriver-ifp7xx/adc-target.h b/firmware/target/arm/pnx0101/iriver-ifp7xx/adc-target.h deleted file mode 100644 index a18aa77c7e..0000000000 --- a/firmware/target/arm/pnx0101/iriver-ifp7xx/adc-target.h +++ /dev/null @@ -1,31 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2006 by Barry Wardell - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#ifndef _ADC_TARGET_H_ -#define _ADC_TARGET_H_ - -#define NUM_ADC_CHANNELS 5 - -#define ADC_BUTTONS 0 -#define ADC_BATTERY 1 -#define ADC_BUTTON_PLAY 2 -#define ADC_UNREG_POWER ADC_BATTERY /* For compatibility */ - -#endif diff --git a/firmware/target/arm/pnx0101/iriver-ifp7xx/backlight-ifp7xx.c b/firmware/target/arm/pnx0101/iriver-ifp7xx/backlight-ifp7xx.c deleted file mode 100644 index 8be7a59de2..0000000000 --- a/firmware/target/arm/pnx0101/iriver-ifp7xx/backlight-ifp7xx.c +++ /dev/null @@ -1,35 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2006 by Barry Wardell - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#include "config.h" -#include "cpu.h" -#include "system.h" -#include "backlight.h" -#include "lcd.h" - -void backlight_hw_on(void) -{ - GPIO3_SET = 1; -} - -void backlight_hw_off(void) -{ - GPIO3_CLR = 1; -} diff --git a/firmware/target/arm/pnx0101/iriver-ifp7xx/button-ifp7xx.c b/firmware/target/arm/pnx0101/iriver-ifp7xx/button-ifp7xx.c deleted file mode 100644 index 45f9fae478..0000000000 --- a/firmware/target/arm/pnx0101/iriver-ifp7xx/button-ifp7xx.c +++ /dev/null @@ -1,90 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2006 by Barry Wardell - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - - -#include -#include "config.h" -#include "cpu.h" -#include "system.h" -#include "button.h" -#include "kernel.h" -#include "backlight.h" -#include "adc.h" - - -void button_init_device(void) -{ - -} - -bool button_hold(void) -{ - return (GPIO5_READ & 4) ? false : true; -} - -/* - * Get button pressed from hardware - */ -int button_read_device(void) -{ - int btn = BUTTON_NONE; - int data; - static bool hold_button = false; - bool hold_button_old; - - /* normal buttons */ - hold_button_old = hold_button; - hold_button = button_hold(); - - if (hold_button != hold_button_old) - backlight_hold_changed(hold_button); - - if (!button_hold()) - { - data = adc_read(ADC_BUTTONS); - if (data < 0x35c) - { - if (data < 0x151) - if (data < 0xc7) - if (data < 0x41) - btn = BUTTON_LEFT; - else - btn = BUTTON_RIGHT; - else - btn = BUTTON_SELECT; - else - if (data < 0x268) - if (data < 0x1d7) - btn = BUTTON_UP; - else - btn = BUTTON_DOWN; - else - if (data < 0x2f9) - btn = BUTTON_EQ; - else - btn = BUTTON_MODE; - } - - if (adc_read(ADC_BUTTON_PLAY) < 0x64) - btn |= BUTTON_PLAY; - } - return btn; -} diff --git a/firmware/target/arm/pnx0101/iriver-ifp7xx/button-target.h b/firmware/target/arm/pnx0101/iriver-ifp7xx/button-target.h deleted file mode 100644 index 6932b8956f..0000000000 --- a/firmware/target/arm/pnx0101/iriver-ifp7xx/button-target.h +++ /dev/null @@ -1,49 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2006 by Barry Wardell - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -/* Custom written for the ifp7xx */ - -#ifndef _BUTTON_TARGET_H_ -#define _BUTTON_TARGET_H_ - -#define HAS_BUTTON_HOLD - -/* iriver IFP7XX specific button codes */ - -#define BUTTON_PLAY 0x00000001 -#define BUTTON_SELECT 0x00000002 - -#define BUTTON_LEFT 0x00000004 -#define BUTTON_RIGHT 0x00000008 -#define BUTTON_UP 0x00000010 -#define BUTTON_DOWN 0x00000020 - -#define BUTTON_MODE 0x00000040 -#define BUTTON_EQ 0x00000080 - -#define BUTTON_MAIN (BUTTON_PLAY|BUTTON_SELECT\ - |BUTTON_LEFT|BUTTON_RIGHT|BUTTON_UP|BUTTON_DOWN\ - |BUTTON_MODE|BUTTON_EQ) - -#define POWEROFF_BUTTON BUTTON_PLAY -#define POWEROFF_COUNT 40 - -#endif /* _BUTTON_TARGET_H_ */ diff --git a/firmware/target/arm/pnx0101/iriver-ifp7xx/lcd-ifp7xx.c b/firmware/target/arm/pnx0101/iriver-ifp7xx/lcd-ifp7xx.c deleted file mode 100644 index 1ad604d50c..0000000000 --- a/firmware/target/arm/pnx0101/iriver-ifp7xx/lcd-ifp7xx.c +++ /dev/null @@ -1,224 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2002 by Alan Korr - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#include "config.h" - -#include "kernel.h" -#include "lcd.h" -#include "system.h" - -/*** definitions ***/ - -#define LCD_SET_LOWER_COLUMN_ADDRESS ((char)0x00) -#define LCD_SET_HIGHER_COLUMN_ADDRESS ((char)0x10) -#define LCD_SET_INTERNAL_REGULATOR_RESISTOR_RATIO ((char)0x20) -#define LCD_SET_POWER_CONTROL_REGISTER ((char)0x28) -#define LCD_SET_DISPLAY_START_LINE ((char)0x40) -#define LCD_SET_CONTRAST_CONTROL_REGISTER ((char)0x81) -#define LCD_SET_SEGMENT_REMAP ((char)0xA0) -#define LCD_SET_LCD_BIAS ((char)0xA2) -#define LCD_SET_ENTIRE_DISPLAY_OFF ((char)0xA4) -#define LCD_SET_ENTIRE_DISPLAY_ON ((char)0xA5) -#define LCD_SET_NORMAL_DISPLAY ((char)0xA6) -#define LCD_SET_REVERSE_DISPLAY ((char)0xA7) -#define LCD_SET_MULTIPLEX_RATIO ((char)0xA8) -#define LCD_SET_BIAS_TC_OSC ((char)0xA9) -#define LCD_SET_1OVER4_BIAS_RATIO ((char)0xAA) -#define LCD_SET_INDICATOR_OFF ((char)0xAC) -#define LCD_SET_INDICATOR_ON ((char)0xAD) -#define LCD_SET_DISPLAY_OFF ((char)0xAE) -#define LCD_SET_DISPLAY_ON ((char)0xAF) -#define LCD_SET_PAGE_ADDRESS ((char)0xB0) -#define LCD_SET_COM_OUTPUT_SCAN_DIRECTION ((char)0xC0) -#define LCD_SET_TOTAL_FRAME_PHASES ((char)0xD2) -#define LCD_SET_DISPLAY_OFFSET ((char)0xD3) -#define LCD_SET_READ_MODIFY_WRITE_MODE ((char)0xE0) -#define LCD_SOFTWARE_RESET ((char)0xE2) -#define LCD_NOP ((char)0xE3) -#define LCD_SET_END_OF_READ_MODIFY_WRITE_MODE ((char)0xEE) - -/* LCD command codes */ -#define LCD_CNTL_RESET 0xe2 /* Software reset */ -#define LCD_CNTL_POWER 0x2f /* Power control */ -#define LCD_CNTL_CONTRAST 0x81 /* Contrast */ -#define LCD_CNTL_OUTSCAN 0xc8 /* Output scan direction */ -#define LCD_CNTL_SEGREMAP 0xa1 /* Segment remap */ -#define LCD_CNTL_DISPON 0xaf /* Display on */ - -#define LCD_CNTL_PAGE 0xb0 /* Page address */ -#define LCD_CNTL_HIGHCOL 0x10 /* Upper column address */ -#define LCD_CNTL_LOWCOL 0x00 /* Lower column address */ - -/*** driver routines ***/ - -void lcd_write_command(int cmd) -{ - while ((LCDSTAT & 3) != 3); - LCDCMD = cmd; -} - -void lcd_write_data( const unsigned char* data, int count ) -{ - int i; - for (i=0; i < count; i++) { - while ((LCDSTAT & 3) != 3); - LCDDATA = data[i]; - } -} - -/*** hardware configuration ***/ - -int lcd_default_contrast(void) -{ - return 45; -} - -void lcd_set_contrast(int val) -{ - lcd_write_command(LCD_CNTL_CONTRAST); - lcd_write_command(val); -} - -void lcd_set_invert_display(bool yesno) -{ - if (yesno) - lcd_write_command(LCD_SET_REVERSE_DISPLAY); - else - lcd_write_command(LCD_SET_NORMAL_DISPLAY); -} - -/* turn the display upside down (call lcd_update() afterwards) */ -void lcd_set_flip(bool yesno) -{ - if (yesno) - { - lcd_write_command(LCD_SET_SEGMENT_REMAP); - lcd_write_command(LCD_SET_COM_OUTPUT_SCAN_DIRECTION); - } - else - { - lcd_write_command(LCD_SET_SEGMENT_REMAP | 0x01); - lcd_write_command(LCD_SET_COM_OUTPUT_SCAN_DIRECTION | 0x08); - } -} - -void lcd_init_device(void) -{ - LCDREG10 = 0xf; - LCDREG04 = 0x4084; - - /* inits like the original firmware */ - lcd_write_command(LCD_SOFTWARE_RESET); - lcd_write_command(LCD_SET_INTERNAL_REGULATOR_RESISTOR_RATIO + 4); - lcd_write_command(LCD_SET_LCD_BIAS); - lcd_write_command(LCD_SET_POWER_CONTROL_REGISTER + 7); - /* power control register: op-amp=1, regulator=1, booster=1 */ - lcd_write_command(LCD_SET_DISPLAY_ON); - lcd_write_command(LCD_SET_NORMAL_DISPLAY); - lcd_set_flip(false); - lcd_write_command(LCD_SET_DISPLAY_START_LINE + 0); - lcd_set_contrast(lcd_default_contrast()); - lcd_write_command(LCD_SET_PAGE_ADDRESS); - lcd_write_command(LCD_SET_LOWER_COLUMN_ADDRESS + 0); - lcd_write_command(LCD_SET_HIGHER_COLUMN_ADDRESS + 0); - - lcd_clear_display(); - lcd_update(); -} - -/*** Update functions ***/ - -/* Performance function that works with an external buffer - note that by and bheight are in 8-pixel units! */ -void lcd_blit_mono(const unsigned char *data, int x, int by, int width, - int bheight, int stride) -{ - /* Copy display bitmap to hardware */ - while (bheight--) - { - lcd_write_command (LCD_CNTL_PAGE | (by++ & 0xf)); - lcd_write_command (LCD_CNTL_HIGHCOL | (((x+4)>>4) & 0xf)); - lcd_write_command (LCD_CNTL_LOWCOL | ((x+4) & 0xf)); - - lcd_write_data(data, width); - data += stride; - } -} - - -/* Performance function that works with an external buffer - note that by and bheight are in 8-pixel units! */ -void lcd_blit_grey_phase(unsigned char *values, unsigned char *phases, - int x, int by, int width, int bheight, int stride) -{ - (void)values; - (void)phases; - (void)x; - (void)by; - (void)width; - (void)bheight; - (void)stride; -} - -/* Update the display. - This must be called after all other LCD functions that change the display. */ -void lcd_update(void) ICODE_ATTR; -void lcd_update(void) -{ - int y; - - /* Copy display bitmap to hardware */ - for (y = 0; y < LCD_FBHEIGHT; y++) - { - lcd_write_command (LCD_CNTL_PAGE | (y & 0xf)); - lcd_write_command (LCD_CNTL_HIGHCOL); - lcd_write_command (LCD_CNTL_LOWCOL | 4); - - lcd_write_data (FBADDR(0, y), LCD_WIDTH); - } -} - -/* Update a fraction of the display. */ -void lcd_update_rect(int, int, int, int) ICODE_ATTR; -void lcd_update_rect(int x, int y, int width, int height) -{ - int ymax; - - /* The Y coordinates have to work on even 8 pixel rows */ - ymax = (y + height-1) >> 3; - y >>= 3; - - if(x + width > LCD_WIDTH) - width = LCD_WIDTH - x; - if (width <= 0) - return; /* nothing left to do, 0 is harmful to lcd_write_data() */ - if(ymax >= LCD_FBHEIGHT) - ymax = LCD_FBHEIGHT-1; - - /* Copy specified rectange bitmap to hardware */ - for (; y <= ymax; y++) - { - lcd_write_command (LCD_CNTL_PAGE | (y & 0xf)); - lcd_write_command (LCD_CNTL_HIGHCOL | (((x+4) >> 4) & 0xf)); - lcd_write_command (LCD_CNTL_LOWCOL | ((x+4) & 0xf)); - - lcd_write_data (FBADDR(x,y), width); - } -} diff --git a/firmware/target/arm/pnx0101/iriver-ifp7xx/power-ifp7xx.c b/firmware/target/arm/pnx0101/iriver-ifp7xx/power-ifp7xx.c deleted file mode 100644 index 1fd9d68028..0000000000 --- a/firmware/target/arm/pnx0101/iriver-ifp7xx/power-ifp7xx.c +++ /dev/null @@ -1,76 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2002 by Linus Nielsen Feltzing - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#include "config.h" -#include "cpu.h" -#include -#include "kernel.h" -#include "system.h" -#include "power.h" -#include "logf.h" -#include "usb.h" - -#if CONFIG_TUNER - -bool tuner_power(bool status) -{ - (void)status; - return true; -} - -#endif /* #if CONFIG_TUNER */ - -#ifndef SIMULATOR - -void power_init(void) -{ -} - -void ide_power_enable(bool on) -{ - (void)on; - /* no ide controller */ -} - -bool ide_powered(void) -{ - return true; /* pretend always powered if not controlable */ -} - -void power_off(void) -{ - disable_interrupt(IRQ_FIQ_STATUS); - GPIO1_CLR = 1 << 16; - GPIO2_SET = 1; - while(1); -} - -#else - -void power_off(void) -{ -} - -void ide_power_enable(bool on) -{ - (void)on; -} - -#endif /* SIMULATOR */ diff --git a/firmware/target/arm/pnx0101/iriver-ifp7xx/powermgmt-ifp7xx.c b/firmware/target/arm/pnx0101/iriver-ifp7xx/powermgmt-ifp7xx.c deleted file mode 100644 index 4ce90a4c4f..0000000000 --- a/firmware/target/arm/pnx0101/iriver-ifp7xx/powermgmt-ifp7xx.c +++ /dev/null @@ -1,55 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2002 by Heikki Hannikainen, Uwe Freese - * Revisions copyright (C) 2005 by Gerald Van Baren - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -#include "config.h" -#include "adc.h" -#include "powermgmt.h" - -const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] = -{ - 1050, 1150 -}; - -const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] = -{ - 1050, 1150 /* FIXME: just copied from above, was missing in powermgmt.c */ -}; - -/* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */ -const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] = -{ - /* These values are the same as for Ondio divided by 3. */ - /* May need recalibration. */ - { 930, 1080, 1140, 1180, 1210, 1250, 1280, 1320, 1360, 1420, 1580 }, /* alkaline */ - { 1030, 1180, 1210, 1230, 1240, 1250, 1260, 1270, 1280, 1290, 1350 } /* NiMH */ -}; - -/* TODO: only roughly correct */ -#define BATTERY_SCALE_FACTOR 3072 -/* full-scale ADC readout (2^10) in millivolt */ - -/* Returns battery voltage from ADC [millivolts] */ -int _battery_voltage(void) -{ - return (adc_read(ADC_UNREG_POWER) * BATTERY_SCALE_FACTOR) >> 10; -} - diff --git a/firmware/target/arm/pnx0101/iriver-ifp7xx/system-target.h b/firmware/target/arm/pnx0101/iriver-ifp7xx/system-target.h deleted file mode 100644 index 9aad4a7b74..0000000000 --- a/firmware/target/arm/pnx0101/iriver-ifp7xx/system-target.h +++ /dev/null @@ -1,36 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2002 by Alan Korr - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#ifndef SYSTEM_TARGET_H -#define SYSTEM_TARGET_H - -#include "system-arm.h" - -#define CPUFREQ_DEFAULT 12000000 -#define CPUFREQ_NORMAL 48000000 -#define CPUFREQ_MAX 60000000 - -typedef void (*interrupt_handler_t)(void); - -void irq_set_int_handler(int n, interrupt_handler_t handler); -void irq_enable_int(int n); -void irq_disable_int(int n); - -#endif /* SYSTEM_TARGET_H */ diff --git a/firmware/target/arm/pnx0101/iriver-ifp7xx/usb-ifp7xx.c b/firmware/target/arm/pnx0101/iriver-ifp7xx/usb-ifp7xx.c deleted file mode 100644 index 0bfcdf3b1a..0000000000 --- a/firmware/target/arm/pnx0101/iriver-ifp7xx/usb-ifp7xx.c +++ /dev/null @@ -1,49 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2006 by Barry Wardell - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#include "config.h" -#include "cpu.h" -#include "kernel.h" -#include "thread.h" -#include "system.h" -#include "debug.h" -#include "ata.h" -#include "disk.h" -#include "panic.h" -#include "lcd.h" -#include "usb.h" -#include "button.h" -#include "string.h" - -void usb_init_device(void) -{ -} - -int usb_detect(void) -{ - /* TODO: Implement USB_ISP1582 */ - return USB_EXTRACTED; -} - -void usb_enable(bool on) -{ - /* TODO: Implement USB_ISP1582 */ - (void)on; -} diff --git a/firmware/target/arm/pnx0101/kernel-pnx0101.c b/firmware/target/arm/pnx0101/kernel-pnx0101.c deleted file mode 100644 index db0f1b0d7f..0000000000 --- a/firmware/target/arm/pnx0101/kernel-pnx0101.c +++ /dev/null @@ -1,45 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2007 by Tomasz Malesinski - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#include "config.h" -#include "system.h" -#include "kernel.h" - -void timer_handler(void) -{ - /* Run through the list of tick tasks */ - call_tick_tasks(); - - TIMER0.clr = 0; -} - -void tick_start(unsigned int interval_in_ms) -{ - TIMER0.ctrl &= ~0x80; /* Disable the counter */ - TIMER0.ctrl |= 0x40; /* Reload after counting down to zero */ - TIMER0.load = 3000000 * interval_in_ms / 1000; - TIMER0.ctrl &= ~0xc; /* No prescaler */ - TIMER0.clr = 1; /* Clear the interrupt request */ - - irq_set_int_handler(IRQ_TIMER0, timer_handler); - irq_enable_int(IRQ_TIMER0); - - TIMER0.ctrl |= 0x80; /* Enable the counter */ -} diff --git a/firmware/target/arm/pnx0101/pcm-pnx0101.c b/firmware/target/arm/pnx0101/pcm-pnx0101.c deleted file mode 100644 index 6099dcb7ef..0000000000 --- a/firmware/target/arm/pnx0101/pcm-pnx0101.c +++ /dev/null @@ -1,207 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2006 by Tomek Malesinski - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#include "system.h" -#include "audio.h" -#include "string.h" -#include "pcm-internal.h" - -#define DMA_BUF_SAMPLES 0x100 - -short __attribute__((section(".dmabuf"))) dma_buf_left[DMA_BUF_SAMPLES]; -short __attribute__((section(".dmabuf"))) dma_buf_right[DMA_BUF_SAMPLES]; - -const int16_t* p IBSS_ATTR; -size_t p_size IBSS_ATTR; - -void pcm_play_lock(void) -{ -} - -void pcm_play_unlock(void) -{ -} - -void pcm_play_dma_start(const void *addr, size_t size) -{ - p = addr; - p_size = size; -} - -void pcm_play_dma_stop(void) -{ -} - -static inline void fill_dma_buf(int offset) -{ - short *l, *r, *lend; - - l = dma_buf_left + offset; - lend = l + DMA_BUF_SAMPLES / 2; - r = dma_buf_right + offset; - - if (pcm_playing) - { - bool new_buffer =false; - - do - { - int count; - const int16_t *tmp_p; - count = MIN(p_size / 4, (size_t)(lend - l)); - tmp_p = p; - p_size -= count * 4; - - if ((int)l & 3) - { - *l++ = *tmp_p++; - *r++ = *tmp_p++; - count--; - } - while (count >= 4) - { - asm("ldmia %0!, {r0, r1, r2, r3}\n\t" - "and r4, r0, %3\n\t" - "orr r4, r4, r1, lsl #16\n\t" - "and r5, r2, %3\n\t" - "orr r5, r5, r3, lsl #16\n\t" - "stmia %1!, {r4, r5}\n\t" - "bic r4, r1, %3\n\t" - "orr r4, r4, r0, lsr #16\n\t" - "bic r5, r3, %3\n\t" - "orr r5, r5, r2, lsr #16\n\t" - "stmia %2!, {r4, r5}" - : "+r" (tmp_p), "+r" (l), "+r" (r) - : "r" (0xffff) - : "r0", "r1", "r2", "r3", "r4", "r5", "memory"); - count -= 4; - } - while (count > 0) - { - *l++ = *tmp_p++; - *r++ = *tmp_p++; - count--; - } - p = tmp_p; - - if (new_buffer) - { - new_buffer = false; - pcm_play_dma_status_callback(PCM_DMAST_STARTED); - } - - if (l >= lend) - return; - - new_buffer = pcm_play_dma_complete_callback(PCM_DMAST_OK, - &p, &p_size); - } - while (p_size); - } - - if (l < lend) - { - memset(l, 0, sizeof(short) * (lend - l)); - memset(r, 0, sizeof(short) * (lend - l)); - } -} - -static void audio_irq(void) -{ - unsigned long st = DMAINTSTAT & ~DMAINTEN; - int i; - for (i = 0; i < 2; i++) - if (st & (1 << i)) - { - fill_dma_buf((i == 1) ? 0 : DMA_BUF_SAMPLES / 2); - DMAINTSTAT = 1 << i; - } -} - -unsigned long physical_address(void *p) -{ - unsigned long adr = (unsigned long)p; - return (MMUBLOCK((adr >> 21) & 0xf) << 21) | (adr & ((1 << 21) - 1)); -} - -void pcm_init(void) -{ - int i; - - memset(dma_buf_left, 0, sizeof(dma_buf_left)); - memset(dma_buf_right, 0, sizeof(dma_buf_right)); - - for (i = 0; i < 8; i++) - { - DMASRC(i) = 0; - DMADEST(i) = 0; - DMALEN(i) = 0x1ffff; - DMAR0C(i) = 0; - DMAR10(i) = 0; - DMAR1C(i) = 0; - } - - DMAINTSTAT = 0xc000ffff; - DMAINTEN = 0xc000ffff; - - DMASRC(0) = physical_address(dma_buf_left); - DMADEST(0) = 0x80200280; - DMALEN(0) = 0xff; - DMAR1C(0) = 0; - DMAR0C(0) = 0x40408; - - DMASRC(1) = physical_address(dma_buf_right); - DMADEST(1) = 0x80200284; - DMALEN(1) = 0xff; - DMAR1C(1) = 0; - DMAR0C(1) = 0x40409; - - irq_set_int_handler(0x1b, audio_irq); - irq_enable_int(0x1b); - - DMAINTSTAT = 1; - DMAINTSTAT = 2; - DMAINTEN &= ~3; - DMAR10(0) |= 1; - DMAR10(1) |= 1; -} - -void pcm_play_dma_postinit(void) -{ - audiohw_postinit(); -} - -void pcm_dma_apply_settings(void) -{ -} - -const void * pcm_play_dma_get_peak_buffer(int *count) -{ - unsigned long addr = (unsigned long)p; - size_t cnt = p_size; - *count = cnt >> 2; - return (void *)((addr + 2) & ~3); -} - -void audiohw_set_volume(int value) -{ - int tmp = (60 - value * 4) & 0xff; - CODECVOL = tmp | (tmp << 8); -} diff --git a/firmware/target/arm/pnx0101/system-pnx0101.c b/firmware/target/arm/pnx0101/system-pnx0101.c deleted file mode 100644 index 63720d11be..0000000000 --- a/firmware/target/arm/pnx0101/system-pnx0101.c +++ /dev/null @@ -1,317 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id: $ - * - * Copyright (C) 2007 by Tomasz Malesinski - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - -#include -#include "pnx0101.h" -#include "system.h" - -static struct -{ - unsigned char freq; - unsigned char sys_mult; - unsigned char sys_div; -} -perf_modes[3] ICONST_ATTR = -{ - {12, 4, 4}, - {48, 4, 1}, - {60, 5, 1} -}; - -static int performance_mode, bus_divider; - -static void cgu_set_sel_stage_input(int clock, int input) -{ - int s = CGU.base_ssr[clock]; - if (s & 1) - CGU.base_fs2[clock] = input; - else - CGU.base_fs1[clock] = input; - CGU.base_scr[clock] = (s & 3) ^ 3; -} - -static void cgu_reset_sel_stage_clocks(int first_esr, int n_esr, - int first_div, int n_div) -{ - int i; - for (i = 0; i < n_esr; i++) - CGU.clk_esr[first_esr + i] = 0; - for (i = 0; i < n_div; i++) - CGU.base_fdc[first_div + i] = 0; -} - -static void cgu_configure_div(int div, int n, int m) -{ - int msub, madd, div_size, max_n; - unsigned long cfg; - - if (n == m) - { - CGU.base_fdc[div] = CGU.base_fdc[div] & ~1; - return; - } - - msub = -n; - madd = m - n; - div_size = (div == PNX0101_HIPREC_FDC) ? 10 : 8; - max_n = 1 << div_size; - while ((madd << 1) < max_n && (msub << 1) >= -max_n) - { - madd <<= 1; - msub <<= 1; - } - cfg = (((msub << div_size) | madd) << 3) | 4; - CGU.base_fdc[div] = CGU.base_fdc[div] & ~1; - CGU.base_fdc[div] = cfg | 2; - CGU.base_fdc[div] = cfg; - CGU.base_fdc[div] = cfg | 1; -} - -static void cgu_connect_div_to_clock(int rel_div, int esr) -{ - CGU.clk_esr[esr] = (rel_div << 1) | 1; -} - -static void cgu_enable_clock(int clock) -{ - CGU.clk_pcr[clock] |= 1; -} - -static void cgu_start_sel_stage_dividers(int bcr) -{ - CGU.base_bcr[bcr] = 1; -} - -/* Convert a pointer that points to IRAM (0x4xxxx) to a pointer that - points to the uncached page (0x0xxxx) that is also mapped to IRAM. */ -static inline void *noncached(void *p) -{ - return (void *)(((unsigned long)p) & 0xffff); -} - -/* To avoid SRAM accesses while changing memory controller settings we - run this routine from uncached copy of IRAM. All times are in CPU - cycles. At CPU frequencies lower than 60 MHz we could use faster - settings, but since DMA may access SRAM at any time, changing - memory timings together with CPU frequency would be tricky. */ -static void do_set_mem_timings(void) ICODE_ATTR; -static void do_set_mem_timings(void) -{ - int old_irq = disable_irq_save(); - while ((EMC.status & 3) != 0); - EMC.control = 5; - EMCSTATIC0.waitrd = 6; - EMCSTATIC0.waitwr = 5; - EMCSTATIC1.waitrd = 5; - EMCSTATIC1.waitwr = 4; /* OF uses 5 here */ - EMCSTATIC2.waitrd = 4; - EMCSTATIC2.waitwr = 3; - EMCSTATIC0.waitoen = 1; - EMCSTATIC1.waitoen = 1; - EMCSTATIC2.waitoen = 1; - /* Enable write buffers for SRAM. */ -#ifndef DEBUG - EMCSTATIC1.config = 0x80081; -#endif - EMC.control = 1; - restore_irq(old_irq); -} - -static void emc_set_mem_timings(void) -{ - void (*f)(void) = noncached(do_set_mem_timings); - (*f)(); -} - -static void cgu_set_sys_mult(int i) -{ - cgu_set_sel_stage_input(PNX0101_SEL_STAGE_SYS, PNX0101_MAIN_CLOCK_FAST); - cgu_set_sel_stage_input(PNX0101_SEL_STAGE_APB3, PNX0101_MAIN_CLOCK_FAST); - - PLL.lppdn = 1; - PLL.lpfin = 1; - PLL.lpmbyp = 0; - PLL.lpdbyp = 0; - PLL.lppsel = 1; - PLL.lpmsel = i - 1; - PLL.lppdn = 0; - while (!PLL.lplock); - - cgu_configure_div(PNX0101_FIRST_DIV_SYS + 1, 1, (i == 5) ? 15 : 12); - cgu_connect_div_to_clock(1, 0x11); - cgu_enable_clock(0x11); - cgu_start_sel_stage_dividers(PNX0101_BCR_SYS); - - cgu_set_sel_stage_input(PNX0101_SEL_STAGE_SYS, - PNX0101_MAIN_CLOCK_MAIN_PLL); - cgu_set_sel_stage_input(PNX0101_SEL_STAGE_APB3, - PNX0101_MAIN_CLOCK_MAIN_PLL); -} - -static void pnx0101_set_performance_mode(int mode) -{ - int old = performance_mode; - if (perf_modes[old].sys_mult != perf_modes[mode].sys_mult) - cgu_set_sys_mult(perf_modes[mode].sys_mult); - if (perf_modes[old].sys_div != perf_modes[mode].sys_div) - cgu_configure_div(bus_divider, 1, perf_modes[mode].sys_div); - performance_mode = mode; -} - -static void pnx0101_init_clocks(void) -{ - bus_divider = PNX0101_FIRST_DIV_SYS + (CGU.clk_esr[0] >> 1); - performance_mode = 0; - emc_set_mem_timings(); - pnx0101_set_performance_mode(2); - - cgu_set_sel_stage_input(PNX0101_SEL_STAGE_APB1, - PNX0101_MAIN_CLOCK_FAST); - cgu_reset_sel_stage_clocks(PNX0101_FIRST_ESR_APB1, PNX0101_N_ESR_APB1, - PNX0101_FIRST_DIV_APB1, PNX0101_N_DIV_APB1); - cgu_configure_div(PNX0101_FIRST_DIV_APB1, 1, 4); - cgu_connect_div_to_clock(0, PNX0101_ESR_APB1); - cgu_connect_div_to_clock(0, PNX0101_ESR_T0); - cgu_connect_div_to_clock(0, PNX0101_ESR_T1); - cgu_connect_div_to_clock(0, PNX0101_ESR_I2C); - cgu_enable_clock(PNX0101_CLOCK_APB1); - cgu_enable_clock(PNX0101_CLOCK_T0); - cgu_enable_clock(PNX0101_CLOCK_T1); - cgu_enable_clock(PNX0101_CLOCK_I2C); -} - -#ifdef HAVE_ADJUSTABLE_CPU_FREQ -void set_cpu_frequency(long frequency) -{ - switch (frequency) - { - case CPUFREQ_MAX: - pnx0101_set_performance_mode(2); - cpu_frequency = CPUFREQ_MAX; - break; - case CPUFREQ_NORMAL: - pnx0101_set_performance_mode(1); - cpu_frequency = CPUFREQ_NORMAL; - break; - case CPUFREQ_DEFAULT: - default: - pnx0101_set_performance_mode(0); - cpu_frequency = CPUFREQ_DEFAULT; - break; - } - -} -#endif - -interrupt_handler_t interrupt_vector[0x1d] __attribute__ ((section(".idata"))); - -#define IRQ_READ(reg, dest) \ - do { unsigned long v2; \ - do { \ - dest = (reg); \ - v2 = (reg); \ - } while ((dest != v2)); \ - } while (0); - -#define IRQ_WRITE_WAIT(reg, val, cond) \ - do { unsigned long v, v2; \ - do { \ - (reg) = (val); \ - v = (reg); \ - v2 = (reg); \ - } while ((v != v2) || !(cond)); \ - } while (0); - -static void undefined_int(void) -{ -} - -void irq(void) -{ - unsigned long n; - IRQ_READ(INTVECTOR[0], n) - (*(interrupt_vector[n >> 3]))(); -} - -void fiq(void) -{ -} - -void irq_enable_int(int n) -{ - IRQ_WRITE_WAIT(INTREQ[n], INTREQ_WEENABLE | INTREQ_ENABLE, v & 0x10000); -} - -void irq_disable_int(int n) -{ - IRQ_WRITE_WAIT(INTREQ[n], INTREQ_WEENABLE, (v & 0x10000) == 0); -} - -void irq_set_int_handler(int n, interrupt_handler_t handler) -{ - interrupt_vector[n] = handler; -} - -void system_init(void) -{ - int i; - - /* turn off watchdog */ - (*(volatile unsigned long *)0x80002804) = 0; - - /* - IRQ_WRITE_WAIT(INTVECTOR[0], 0, v == 0); - IRQ_WRITE_WAIT(INTVECTOR[1], 0, v == 0); - IRQ_WRITE_WAIT(INTPRIOMASK[0], 0, v == 0); - IRQ_WRITE_WAIT(INTPRIOMASK[1], 0, v == 0); - */ - - for (i = 1; i <= 0x1c; i++) - { - IRQ_WRITE_WAIT(INTREQ[i], - INTREQ_WEPRIO | INTREQ_WETARGET | - INTREQ_WEENABLE | INTREQ_WEACTVLO | 1, - (v & 0x3010f) == 1); - IRQ_WRITE_WAIT(INTREQ[i], INTREQ_WEENABLE, (v & 0x10000) == 0); - IRQ_WRITE_WAIT(INTREQ[i], INTREQ_WEPRIO | 1, (v & 0xf) == 1); - interrupt_vector[i] = undefined_int; - } - interrupt_vector[0] = undefined_int; - pnx0101_init_clocks(); -} - - -void system_reboot(void) -{ - (*(volatile unsigned long *)0x80002804) = 1; - while (1); -} - -void system_exception_wait(void) -{ - while (1); -} - -int system_memory_guard(int newmode) -{ - (void)newmode; - return 0; -} diff --git a/firmware/target/arm/pnx0101/timer-pnx0101.c b/firmware/target/arm/pnx0101/timer-pnx0101.c deleted file mode 100644 index 1ec1d2871f..0000000000 --- a/firmware/target/arm/pnx0101/timer-pnx0101.c +++ /dev/null @@ -1,81 +0,0 @@ -/*************************************************************************** -* __________ __ ___. -* Open \______ \ ____ ____ | | _\_ |__ _______ ___ -* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / -* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < -* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ -* \/ \/ \/ \/ \/ -* $Id$ -* -* Copyright (C) 2007 Tomasz Malesinski -* -* 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY -* KIND, either express or implied. -* -****************************************************************************/ - -#include "system.h" -#include "timer.h" - -static long cycles_new = 0; - -void TIMER1_ISR(void) -{ - if (cycles_new > 0) - { - TIMER1.load = cycles_new - 1; - cycles_new = 0; - } - if (pfn_timer != NULL) - { - cycles_new = -1; - /* "lock" the variable, in case timer_set_period() - * is called within pfn_timer() */ - pfn_timer(); - cycles_new = 0; - } - TIMER1.clr = 1; /* clear the interrupt */ -} - -bool timer_set(long cycles, bool start) -{ - if (start) - { - if (pfn_unregister != NULL) - { - pfn_unregister(); - pfn_unregister = NULL; - } - TIMER1.ctrl &= ~0x80; /* disable the counter */ - TIMER1.ctrl |= 0x40; /* reload after counting down to zero */ - TIMER1.ctrl &= ~0xc; /* no prescaler */ - TIMER1.clr = 1; /* clear an interrupt event */ - } - if (start || (cycles_new == -1)) /* within isr, cycles_new is "locked" */ - { /* enable timer */ - TIMER1.load = cycles - 1; - TIMER1.ctrl |= 0x80; /* enable the counter */ - } - else - cycles_new = cycles; - - return true; -} - -bool timer_start(void) -{ - irq_set_int_handler(IRQ_TIMER1, TIMER1_ISR); - irq_enable_int(IRQ_TIMER1); - return true; -} - -void timer_stop(void) -{ - TIMER1.ctrl &= ~0x80; /* disable timer 1 */ - irq_disable_int(IRQ_TIMER1); -} diff --git a/firmware/target/hosted/sdl/sim-ui-defines.h b/firmware/target/hosted/sdl/sim-ui-defines.h index 97562ef933..5b4030bd37 100644 --- a/firmware/target/hosted/sdl/sim-ui-defines.h +++ b/firmware/target/hosted/sdl/sim-ui-defines.h @@ -203,13 +203,6 @@ #define UI_LCD_POSX 42 /* x position of lcd */ #define UI_LCD_POSY 35 /* y position of lcd */ -#elif defined(IRIVER_IFP7XX) -#define UI_TITLE "iriver iFP7xx" -#define UI_WIDTH 425 /* width of GUI window */ -#define UI_HEIGHT 183 /* height of GUI window */ -#define UI_LCD_POSX 115 /* x position of lcd */ -#define UI_LCD_POSY 54 /* y position of lcd */ - #elif defined(MROBE_100) #define UI_TITLE "Olympus M:Robe 100" #define UI_WIDTH 247 /* width of GUI window */ diff --git a/gdb/Makefile b/gdb/Makefile index cf24a77cee..0a52e8b5b0 100644 --- a/gdb/Makefile +++ b/gdb/Makefile @@ -7,7 +7,7 @@ # $Id$ # -ifeq ($(MODELNAME),ifp7xx) +ifeq ($(MODELNAME),EXAMPLE) INCLUDES= -I$(FIRMDIR)/include -I$(FIRMDIR)/export -I. -I$(OBJDIR) \ -I$(BUILDDIR) diff --git a/gdb/arm-stub.c b/gdb/arm-stub.c index 33181acab6..3a6076ebfe 100644 --- a/gdb/arm-stub.c +++ b/gdb/arm-stub.c @@ -21,9 +21,7 @@ #include #include -#include "ifp_usb_serial.h" #include "sscanf.h" -#include "pnx0101.h" #include "gdb_api.h" #define BUFMAX 1024 diff --git a/gdb/linker.cfg b/gdb/linker.cfg index 826aee31f9..053323b9d4 100644 --- a/gdb/linker.cfg +++ b/gdb/linker.cfg @@ -8,7 +8,7 @@ OUTPUT_FORMAT(elf32-littlearm) #error "Unsupported CPU!" #endif -#ifdef IRIVER_IFP7XX_SERIES +#ifdef EXAMPLE MEMORY { IRAM : ORIGIN = 0, LENGTH = 0x10000 diff --git a/tools/builds.pm b/tools/builds.pm index ce8b3dd0a3..6fdf75cc26 100644 --- a/tools/builds.pm +++ b/tools/builds.pm @@ -187,10 +187,6 @@ $releasenotes="/wiki/ReleaseNotes315"; name => 'iriver H320/340', status => 3, }, - 'iriverifp7xx' => { - name => 'iriver iFP-7xx', - status => 1, - }, 'lyreproto1' => { name => 'Lyre Prototype 1', status => 1, diff --git a/tools/configure b/tools/configure index ee217a917d..f1aa03fd08 100755 --- a/tools/configure +++ b/tools/configure @@ -1554,7 +1554,7 @@ cat <c>69gkbfCQ6BG3TtroO8|q!7R_cyU(-x6ZRME z-`n?`>TZAv9)B})XZP80>s7J3y1MGrsZ(!-u5Q$|4gdPZpXeyVe;5A$Uw{77pZ;(B z{qvs+;r{7Q3a4IQv5be`w%8SObC@{_?Lr{`{A}e1Om8@Ikac|Ai%jt0wTd`zZW_dqq?|@Z&p0 zVgG|``;Vgkp@Ba%z#0G-fFQo$%1r*;_vmJwHffO^lfv zlm1}`e`w$j4g7~`K#YI{@qP8xS6_ca$D>ak-+ue(+i$-E_|T(#^9VPnw|w{QcaI(c zk0^lC!O7$AzI)7}-#z-~yKng-=b}3zDUs}Br2pvA_m95){=4r8-@<+TSft6RA|*=u zYb3A9`Smy7eMd2nI3>c#;hIPgaS?)S1rUfEzyA8`zkcz>AN2PhX6%0y_di|(g73sw z5A7cZhDBe0_0{9YkDvVb<4;e1!twLZKhqyR;H6UyKmYPGpr4ZGC-oH3=$dx?^2^Up zfBE@210I|LIB?4ohDd}H{NBlEe9x?sVyqJ&wc%%5I6o3J=ZdBy?rxN?0x%q*7f1LcM zYC!OvnEHvy;Fn*0g+bO&Po97po;`i~{Q0wj=g$iZ3i9y05FyW=7CwJkSb$3mgy_%% z^E?IYFDiImRPd~@05?8Eh&b?IWGOB-6cr%^nWBIo!0*5R{;My)gc3*_|EZSnuPQgM zxC*mUU6Jzt42}KnRQ2LL5bfW10^`cZzcJ_k|7Rr>i|Lz6VPAfDV!lMQf(;)?|p-3_nJ1j<*WOQ0g zUb__Z`)kXi4b`#Mc%rtfD(G?B%x2IZs222x;Ux|I9%1l@@h&*e&iMGUKdH&^}ZA_~?c0^lxQ z2u+fqz6FGzf^r9}K|gY#zv)B#{OdSXmvZ3IK!E~Zef13k_ox}=-z);LBJ<5RUjaCD zQ6EP8|LmDsDAtMa3sHqmRIynVdQ9@5pgQ=1SeAMa=Tj%pD){RMu$OlHz=w9me;;Gb z?K}7o?Z+Q}z{K`vfM%+gFKRQ+r%y3MeD>@a#$^~D6&Dv-t(Nlga57mFk5$GhqE%(3 zRnZ8cEK*q(sfb1@A|(}(NM)q7vNT#1EvqUoudb|!RaL~Q%j4DMHPz*bSYgsA6>g$@C>f2v5cCcT|q4m@WT(#5{?Ht{3lKxfB*f*5b5dRA1ANMrv3Ri!oNR6NDF0Y zLjCX~AJE^ECuCGVJs~{#;fHS@eFMTlrwsb}w~hgI)&uE50?-E<(hrXxqeedgA^z`m zb4mR8BTBBB2`l5b(?FBc@!K&!y!s#$UG4wxcs`WvGv~T+pSe!Kx;7qop75bx)lT!% zq4-apV2UdEOHddsq6IBe^iVBO1ixs!8Hc>M+ zG_W{7x4gW#va`8*u(Ni!w|2b0c5<+OdbD|ZvUPU4b$$kHoS&|q94;U1EFEkw?QSk^ zt}U)EFDxz0FV4>|&do2*&M!>Q&ri+GP0r6vF3e9ZE=(;gPA@OctS-&2ugq_*E^eH3}^32Ne-1^$Y)KvGIS6#10yT(Sk zMuxh3dpkQ`4i5IsFD@)C&Mz#?&&5Qn&Q)E;wMdqyT=b)Bf_q50Afj^ffc!7yqUKAc#*4^^hwl4-436HnfzZ zck;Au{F92j)nUElv@HD5LBj)a{PNR-MP=1C9@H5r`h##Sch;F^RUAi4SFA@<##oOL zP)8-2kb2CV=O3))-(v}EskxkTzK?YCVStD#@_-+gb2sZgD1;aFsf}qKUb3f!d;Rzz z1T92dLb%#uF;wH$t34+W>;4ZC(Ql!WDw!dVKy5rCX>Z%wwMGg7L&ya7%gTaW}-Qm z3}$07U@{aLkrm|t3MOz4>{2epB##l`!-O0SW|P5cGT6*Uz)Be!%@D&#Kui-NlW24= z(;qRQ4$OrqeYm_P2xi1OCTLMtsa_qw-$S(UQMHN?(edQF2>%C6RnlMo-`@g3f>@gT+Vy17ePsF4vFKz?!}g2;&cdIq2JsL6_=>8_TCK2pYDS(RKf zKN{}o5621%QSDZn&0;a5BgHKE@i*US^!Kk@)YDTU*5eVM81B(nkH^nwgeW75B2esI@e&f912p13i^X68ZJ9X*x*b$Wyhfuo@(>VW zF(Vm}qftT}NFoA}7v*b|^l_h-mwvCfor%(jBml)_4+i{^P&gb6y6koo7OEiP<8dD; zmU@=lp_^l_3N&+7HP76jMWerzh^BD;nYakdxmva6a{7!<=t+F!c~CS>Fu`v*foU56fiu;LNze32b<~@ZMWNq9g_`Y(VlkSY{rm*`DzOAd zB&BoKzr>S2&;9n>Z$W$*$cS+k_(Ctw$L&hLB$S{x`Fx$|afE)=zDy6Ls45j|9`$ZL z3OwSV5dF{s^Z()^sW|`O5V}dLiClc9LS5$H@Cd>56hzHw+JJsoMQUBD)`Mb-@@lRw z_lF+Q<3a5Ir9)Vf-X8Kjx{-;YnJ_8UeQ3(LOYqT=*Vyz9`~TW|LwvJFI5A#iE$avV~zbD`uQp zWF&(5E_ljfwpsy;&5ATF5(6n9N1N5eFiJMFY%|+!7R73j%oeK|2ThYPd_XHg3fhg7 z1!Ry-CK~{eEF>yrZMDc&xX2E7naoy9xV7;nO|;F5Q}PA8iQ1aFRI;(LzB*YQ3I;HY zrM9X~c!hG%H$eaS)hbl1Ycl82`X0R#(mlBfB0klTw>K!SLiP5=o)4`_WcOjHxc!p? z@TCU=sFncf9+d0TY32!r_<0+QczY9=PLDvjbB94s_G#WAmP&+0p~}2YCmymt5u1wm z(Z|1p^e7Q^p8LfYnCD`N9jy0&?{pFKJRg@9AvsQA-v@CX>gxku`1n+9gyOExxoQ?# z2ZdABygvA&NuD1+Us|2ibkB!Zx#yxPq}~bJ&3JbhRhU+VA6X9ypj&XBIQfC9w7ft@ zb^m)0Q5<0|nj{b@-%NE0$wP~88uH@vC0wOdW?cr6$j5hmDsh_a8VYHV%ZObpnEGMt zW;V&-6syG{OHM^5*sOlL>~}eRfZOGDIXy0i*RHq~*>89F-AGrz4exEPk z_xS^%l9ICWs)nW)eS^JygFU^2UA1+IK+s2XYF^_b))Npb0JOD`05#_8jr=%14y5ph z_$baNl6n}2jfbpDZ#ntql%HvSIQ;6R&j`SqiiGj#Hm~0DAe~&coWGtdd&r!0@YbaV z#Zj|XS4+eqFgg>SI?&9(rP!-0$}uGU;rqv5eyKkB{TI-mKH>xM;qe6)P|^OWkyAU@ z^rCqllvX{VqJHxDRLd9le9->+RM#C-#>ZJBB&R-I9{n!i5#eNC+M&h7?R4bD7c%FE z>@pKleQ3K}fV@B<&qMp>D%V*_llY^*c}4g@EqQjS zQJd&FMGO4ch0GdgogNXi1$$bg)A^A-YGdYT;*u_zIL#5C%6&!H%7;-H&qmFX)#7qF z13qtQX{5cWsjIcMr=z{QqrI!W4d`xf!)b44drxN@qrIoAqqn=Ox3{~mueX1AXmDbD zXkvVDe5`+Tq^rNby}P@kr>C>0r>nOI4`h4#2;F@>?Oh$M?Jr+;wsmxMboX@i^mTXl zb#?W1cJy|%^|rt4K{oB}J?$MpcUx!Y%dXCs-Cb?Hy&e7io&5t{K;J-jUw?ORUpLb3 z>hA39>gecfudA<1HKgjB8XB4#2~AC@hUV&6RU{hqdA$Y`FC)@wruKXz$9>rU%$))6 zF+|4zE#)hgbe;!cPO6<~@%XQ5X(EE=K1fPL*DFQykd29Un`eFx`ag;(qG;Bl<*a9# z%ZQ{ErlN_h%KUk=q{PX#)kN~ktNCerCa0sX4%1kVU;tz6{pkTayl{Mb2${3L&B)f=|EZtbhuqKw)DCcFNT*c zJK%B3ZUu8yhf8t09UiyC?N(eKyW+CiJ@7aH86!rS*VffJHRi}Pn+Eu4FFl;02FZI| zNL>$+uR17PJOD8j6&tB7la}-d5355p3C&1|DS^+`sTQ6~?GtvBXIHso*~WAkC>_mC z@&b|UM_FqL{{{C_HW8(WWmJhL08N`PH4%ml?042$*E%Ivx`;bH)oC~s7 zDPPsZg9z%0t|L(a`l;>_;Sa4uS7H%OvbZ}{rP5?3u|JmlQ`SLYT8TI>GC4iF2Ns}5 z)6GINdX+(lL>L^d_Fa07KJ+|jFdt|*PfkumG&9;x0en~;`n_8EYBY{1uKM0nHg1 z{IFGjkV}tq=?Mcr524jI13eqTUD^{8TvDI9(n}+TVzV|<5JLtuA2XK88CKlOr+5%S ziO|v^F&cp%zfd%IC=sGL9eNxRl{UCgNws3q1{w`|O+jy}A8NtSkfADEC|0;a)$FPq z`hk*#ZdF(9!?-h3yBSLJqngrl&+)RJ?57gcjaHYRLLOQg^Au+a3t=PSUQ;)9Exz7% zaw%{eVP@i9^>*S=N<@XQ7Cay0NA2PX5?t{_OFYe|wPRWrHe*F1;Pv9k)#L9Ui=p2? z$$ej7?+l*jVp=CgTcYq(7+$*-r4oVp-H2$anx=9i0-gLRGA`#1{R(+-;4^jx={8=Pr6Gwa!$rNpjTt!-~vr&)TJY8B{;lO3qgDvJ-(1>I^kURw%5EZAfc` zG)jP9vr*mXMO)SFo~@ItRy!cKnhrNMbuS3{nVWQ%8=*Qi$n%pVEFsz+k%A7j`r79z0RqY|aro>&MPV-$g zHO&-N6QZ){BC#Y|1kGqw4plSNY)Pc1?i`|9h$wWk%z3okjCvF4IG#R1s@5P$*D=xou+ikQNJo`TCZ$9Tu7BK zv$$PEfIt5bmsCT^t7AR2oQLgO)D2a0o+R+=b*9=AM}{9MbBJzCVhb3Z@}Wk+?V_Oy zJ3xX$BotVeO{7e1Lv7o<0ZlMPesj_`nsJu2b4`V2b4WqWOXCPFK|N(P0w{p@ov3`l z?HuxJ396plT_2|duE{Gomt7N2jhw&5L>+Sxoe2pMM;~pGhj+jT$`c!6$YsV<$6|S- zGZA0p!V@KJFAEcyV7EM18}SJlD6gCnINFC1v>a&*p;mBWy}Z->^6HgEr4XPYEkoZV zsE%hjYb{MZ@y~hGorxr{W(K5nP0w2YL6yiGiBuP-YK7)ik;pVB9w+#)4pE;utNuVp zeYCEbJ<(`B*Nct;`ztNRVk-k4fVZ9NW~mLaiS_95J(f3Q$)ez?lx)RgD?7Um$tpn4 z?roNU-{TMX@Pq*)Hrns<4=noW#D_Ny@uZRlrD!t`^+*L)l|l_$a198K=q9HZ(dJbb zy@8;``~^$BRp)aPF&Ygw)Gk+799Muy?V&bFk{tEGFF4|(3RBx4F^ch7v3!__6&baTTC3t z3+clZk_a)xGK~lkt|}5Xnh-c&&P8z9$F7iBghMcFf58S90FRFa_(2L@@z9}`jpBr3x?u3= zaX$8lXnMGMs&0+UXr}HhGO(OxSWZ&g1DX~F$u=p7_<@ATOVl#C z+@`oW~~o6|12?2^+VV-1#Im)wfv zl<^2258|zEyNn%0s1&?*As+bV{iMO~m;rJPj9al6$wVh)Yz`M+-V+626jiAOCZ+9U}ZtYqk+Eq0pksZ5gE|5*6Mw{KVO>JUp z8}GKm+KK?O&gCVNWqAbqz=e<^0tBFv3+mz5&gh-9JV|JK9f9XHoIY*+6JQx=mmhER z(>V^Oyaf-t@Cdx~jweBCd=j1;4`n1YAolSgP|b@45Ylpq=oSI7n-4CXYOI>?5qD7$ zNM?~ByP6*K(oxo2dJ&@4ky=x_epCrHorv^xS5Hm%=$AhBh&XzJ!lUJmO5r-iHc4zY zVxa#(A}YyJpGQU|Di@I{ebw-C9_DVr;OuH*<6e=S;7hf}$(Sh`rNem%S8No=UU7Z9 zIQO{f;vJrA$u_G5NH)7253v-NQ^9s4ubUoF`P}xP#~E;A3zWl)a6HPw_9Kv^Yzuht zyvmN(eetR(c@{nsd5DL{y@J*?5EEuTDQ48M#$Z$CnY*P;p!?DN*Bhb%O>bXJr!dORGz4B zYLlpbResfMx!s~TNEUj?YlQS(CqpwAixEb{x}p%#!fF339Y`6i(E{MfB*yUkyi%|r zH4civ&6V4m+H`q;FYWS$DG+GCE^HTm+9Lwc!Uut71Zo_55Xp&)%*e$qUNuKt(qM&0 zYyj4_0rPfZO4ce1&^9`H@XC*0Ep~NbMQrY+J$fX7mX|1zcn*sd8C=4)I1vY@w2heE z42?7-w%3tgThL!UsQ~Z(Q*#%|B6nIOB6YE%_~9^} zYJjwysa9~SRZ$_r)uknkH*&^uLwS_ecu+)Hb8L+P-2Y4wNt$Wen92s_~67H#53A0&oe!ZL(G z5O)w%8b{#R*bM4-rUc*aD0`3%>3E_`YVE}F^zQCCb%ENMp^;w*(pgbS$1I`F9XvGo>}B1fptO{WWq&e)H`4C)bBnDTVuo*QDjf2!gsA5&1qk^BhDF9r8r z7St(&mhdokb1InC$}YR&aoDlrJ?sO``JzF8StMK;4Of(g%OjzRNC<9eI1mnceO{Lv zd(9n+L!oWwPP!54nSXim_t$`aV8-%b4il3toDki{&NlA-1XzF^?qR};%8q2N> zT8vN>T93es2LeP5cxwOvzhLW`jEW%_pP;}WxWXgL*q5e5ZIfv8^lE`3`xM1X9tFG2 zumueU;lxHXOaVAGJ1QGn-!S0EZa9YoU@3&)#ES~iDyiUTRw?M}P| zq1YV?j0V6J8LvsegEvp{h6D`Ar^4=a*gX!KS-2g@9VwFx5QgNj)14@b-HsP6Bv_pj zVz4kQ5_ZlJH;H8$Bm#rhf$jL57dGKJs8C!GEamW?JT-l{-R>bMUWbC0Jv@*>p%*it z4L4c2fQ&7A>H?5MMmUQKY2gPXcF~-mRrZVbNw^@a3d$N9B0n^MZGxbF@IEOVcR_dp zsufktptnS{>J+u9;1Ed(M|KVwH73bw#qOyrwc*5iKbR`Tc&6$Avwh z&=pjNZky;2%^B0yN5B7x2l(;NfB6e0ygxsAf_>GP@M362!w~BCs3mi&=4zmJ1+`Me z&^A=N;~u&KumaJ2?JsRjD{2qn^tW|A)`bfkqBEA z7Z7^n(xLtkj>tYI$|$pOP?5P($*}Og6az~V-2AZmK-+1-EcDKm(@xFXgBPtFPHN!@ zQbDg@;jl9Y!Ds|%2QK*?ewWMda0H!>u!|6KA;f{VzNngci!N={g^BR1V3-sH-OiAQ z5cW92K4;kL47r_Qw+pXi!HnE)CvJ1Ou(8*H6ud5kd$2G954Hf~zZ-D-lc)cv(b_YG4pxYgAyYOxqlJa?+9wbOFpYbbbE+=|s28kDN*;Tmhez)BVcxY)R zfYlk2&=GJu{Ycj10sP3q<@N&*1FxlV(L6|B01|i*h;7I&A5`IjFiu|LaRzvAG6ES8 zgBE@K9s#6JK#{#(rw71<2&H!0*<;6>YP_Qvi$nyH94g{m+$;cQOa#&r)|GhgGZzFm zx&Z8z2B0odCb_Iv#HV_Jz;1xTk)wbeetH{^c4(6YxJVvNdrp!QwMkdGHsK0A(B^9m zK98F~dZta;euzy3L1qSS-aOMK&C>spyE8JJGG+^7#6>?RZz-E)`{A5m3UkcpD&E}`tUl7*W>lL{a&tI zFW&bDWTwL6@4r>w z@!&b_Z#p#L{R>Ta@wFxF;KeFFrjr;_f%u50L1(0B(lwRbh1TUNal3&q!4>j)P%5e$ zXb0Ma4LKaRg@I;IEgy+czel|y7=-vy?b02J4;?#0j0=2DyN_x`1u|tn?ZcO^ZH7Vw}!!r;7a zzt4@ehJeRKD-Pr#BlCNmUZ2CwJN{i>r;FOOM)d~ z7?>Z=#W+vOHxvx|g8^S4fX>wK_u*<-N6?QH!kA@*0thU@=SgtM;|Y1(rG7tThz0|Y zvy^1!g&4}n8w>%yP{>~z_LqkI=%tY+3PJe_`28?llELrw2RtRPWXxiyq<$a>Svgub z;LC#_jV**k0C-4Fz)SFZQAWNMFWOQOd_FWnsMQ0%A3?|+DSF%ij~kVO$rMTv@soZ^ z{Cscr)h5H~LNvHu;346e46iW8FOS~RPi_}nm&|fGBHF`q4 zD26myJXJ!hi(#3pBnTZsONfl(kYW1(zsHLT@OzPI3FQlyDwlNVBZEO211Lh&FW@J$f##8;&w~<`1^wlr zAnc?v62up|Ym@QX+IW33(bAY|OeS8|raDr!oi7?XS{vG0QZG{RrbIlzP2UpRe5SuLuUqQ64lfxWOO{2PO0bd`aRGx#un5o;$0(jkgy73 z2#hbBA-|)v8O_o=rDk|b-74gc-L}gWFX=%JXnyiS% zOG|5`(PXSTUQrgSD2-KARF+1{N+U?5IvR;rM{6n~@n|?%R#ID0nut|ZLEzGGG!mvG z1W#FMNu;!-gb)n_Q6ybj5(Oe9<&lzVN~g4{ELvS&7OSkl%j8G{QKBU%M<@c-M?xi~ zgh(_LjfShxOXIfkP?!)z0YSczaHtGn<>eJ+W!0r+RnhXwl9E_OIr5H|msONSA#izV z6uCzbxg-R|R+NN6RS{Gl?kz2$iYtS%L+AiXV1ZQW@P{Laj%q~B2hk;zltqvVp)wjp zG(?6r(AaQVNp2~16{Qi_aA_bI2~bk70a69#Rj5;l97WL~0va1wK2R18m%%myel%L> zt)!#`QDHfVU0M=~mV~3FkU0bfKn zh?L@Xe>55_4Z-TdSm8opD}o`kvZ`>nt~8P=Ev*iPs>7j5NLzxW0$?A^{7Oq89%>7k z_m@Y4SPqLq3FwfhFAT-Y%F9baP!v>6I)s6Sq5KfEfqW~lh=!|?Fn%h4lmJzfm6oB> zP^4f8CLKm$A|<#J>O<-1UX+D+Dp(mQiAN(frQu|0Btdn{-7r)~Z4ix-+9P`9l0dLD z2x)2dT883;!lL-lKy^vDsw7ksElHG@rmD*uYRenz<1d=)+q+wP`nv}PdPfKPhP!*l zy1ECt+WNZjwsmVqdt+N;qBT|B5-(4bp}__)3Bz^?><-2o6E@j`0R+}0utlWs=~Mi& z2gY+?w%;7}@%LKrn>3FfKQ4Oy4DaEKIWM>mQ(cVRFk%9~qDKPLLE>0A9FIh5qS07s zX%&7^p)6V+Mg_o1OQK<@3zig&hW%*pm8GF589H_QX!DhkP*ntF4pv8lRnbsoSxHr8 zw6d%;R#gVRua1?~#43Tx>dJU^Rid(@wydJAvMLp;u8+s+YY3^D>J)yWp}Mjz9#6&N zwXy0%RRxvV?Re7Sa9IY-HkHurizOp7BPu9e1Vk%-dPsEdiSZ$&jgYepTd0kCK zU9!5iwmO-N#p2b~al}c~)z;S6)iu=AHrLg*)FoT%Vy(%_)>KVved2|NmWD)2L-IvK zvZ+2%pQ=jL)TC^c+ptb(pcBpSX*CPgWs}9#_^*Qi5GRX&B^$SRH7wW z+mcAM;MXML@#c7}Ar^yXni8?bL|ptZMRP-{rLn%bF4a_9S6^FKm!cn@NYuQ_o zQq6UBFY9XCYhxX$L}x>7XMLh0m27WFw$&wGrfOSLwJphHOATfBqBhxFn`}zP8tW1b zm}u13Hl`qO3hBRSsBfqz_eDdhxjt1_6NjWJ{KiFXvLRL5h@ZJ=5U6cxAT&4Dy=bUw zNW|)@${J&_#(1JBo@}f`g0+pfrM|wYzP>qC-&~t&uBmB?$Lp%A>#Ji;C|5Fxa@ED+ zsO#EfLPb25O4QWV)KJw|SJl@f8WQ+Lj-&tv3-yTv45KcQqyzWVB~gpXRH8OjTV0M{ z`KX3%)Ihc97!t8qtSZhSwec8+7|qG#iv*AWnvqU5tf(qMl^;V7k*tZ;Bp^vmDj82D zs*~}`c)T)^h}YD_5{X0-K6q%C`byn0gFNxRZ-DYlV~ED zkyI>^tct}ds;bJ7c(S?@zZ}v~9Y?9D;MJ9In`+`svFg?&R|kG|Bw5o`3ju19v8q^2 zRjj&_l^?H-SCUAviWE!~Q^KlB`dJdnB~gcxR#jG4RYAH0iHEim!zIYpTvgE$uWXH% zGb&nQl`nwm%4TF*lW43-!nzs~Fo0S@GSPtg0+NZwx+HA1xemXPg63IKAFHfSRHH;> zgtZh6HQQKQ+f<8&Q1_y)t|gUfN!7z`PNiUzjbupmFPa)&HaE7vXlie1?rv-88*CeW zHTY&~e0p(eW@&nUae97sa&Ge7sCm`WW;j`T1v;D z4|6??sDnNXKrqv;uPSehRo229;?;>77)Mo8yt+AF^`a);Qky_MwV{F4*L60eIvVTS z8tY#+qCuu!G}XOms)gIyoN9Z~(B9hA`SL|)8_?3x*3#bA($?PE*8Z}+qYYon=<4k3 z>Fn(7?8J9BfPO-IUk5(D(c0D4f*adkHo)zA+0y;8wY#mgr;R?$(MuoZXvc>@I@_S5 z*7i0+M|*2$M{9RSYj0<3UuSE7XX^mF{T(g6Z7+J-UUUf=+FRR^JHGsZd+GL<9c^ud z_I5%?M`veecUNa$ch^8q*I;kgP+!*|W1z3QzptCW9@5j_*E`hLH`3QX*55bL*E`YI zGtt*Q-q$tO*ELFR_xM2f#6Zu)V9)qq&*(tU@IcQ{KVi5}#YlfIFg(yZ)Zg0=^!4=h z^$hj(jtumT4fc-@4U7*Bjtv3>ql5jUgMFiey<*0Y{ z!^p93l+Zs$K<*>}$uKlHIy5*kG(g!6_6ZCR^^FYmb7YP=JTNgl2v8P-18)Wg-VP8Z z1_s6k21W)3A(+7Mz`*c8|42Xd)<53g|4PGnf8S_d-*8{=U~kVLblcwt3={eVMh5z! z3TS2ws$kVYSBQy<=tY&#mtDGno?d+61)qT-W%l+_U{_C9Cj%b(%1cjIUr$#*YPP3q zsHbbVr+b(^1KpkdsC0ZtrmGXc7iD_7@QsKR?se*2Z|*)rQZ z1ASfneVsjM82srQm^I`d=i>jO$gcS|F8G%s|-i!{v8XF!TA08VY9vvSVWzYD;$oRzQSn<@M#2^~II-h2{0drPbNF`Kig*ug8Xmdi#63(7fB4Uo<9bt12;N7awQf z7whSR05}B|ifv`!!JmHl>C3AC55vr}*9rryp^zgwD}TArI;nVVS_n4Mjon*)|+=N4vWk;cq4 zA5&A)Q&TgOQ?rwk(BZ<=^3n*>?-G@8)MF=Vqp6r>ACTrja8bbI5#-0ihNk z!`vJsnVXxPo26ut_|oj`%G})Q{QTPD!ury}#`5C&^3wXs@|uSAWmMnt#`5yk^776K z+@%e|;>OD2=E~CEDq&-FX>Dz3b!};7ZFyxCSXxEM>hk*9%KG~1#`@a&);c^m-B?@M zTwmG8FZpb(9c*swZLDo>tkI=S!tVa+{{G7L=E~OQ%I4ewj^wt(|vblAN(t8 z+uuaiYX|GAyKAdEYpdI9tD9@98w3__12QjjaTeEB7uQ#pw%3-oS64PySK#87y|uMn zcvhD8mY4UImNpibmKT@AvAn#zg8$1nTU=gRTwPj(uAnqT-d$PRWYr1vZmcY`l9!g3 z7Z-sgB(Vtp`tl+)ytTZzy}Y=&G{3$$w}_uETAZDOyEM13Jim+|HCmcqT*MCz%>fJe zv7x2;dHl{1V_|85LKg6AM>7la)4<~V^wQik42*1y&5SHTih6^lAPt8wH%?Zp*&B1`lhACuzW@>(RY7xoK&#W!XtuM@Nz?|mi zR_EqmT7-GV!tBbz%*x_4u(~v}x(v)NFU>BZTubo1ceOuPy-i38=YQG=RD3xmgkwO?8pA z0X?kEPOr~SZ_iF|&CaaN&MeQ)E;5$pW|0ocvbH$Cv9z#>s$5*yT3Q6Qmlk(WL9p$u zg_VuD<@LFhjro<${gdy8rl&?0=H9F>&TOvE z?QSgYY%J|)aaWUe!r8z7yzIZt1oonN1wU7w#{ zWzH|pPcAYi_|2_!`s_S&o)JenojE^0JwDDNPCAWyuP!r}m*^2%n?S7{`8cAYuL)y&z+<;7|C;`BTXoFRm+A~hAb_X5b`M#ja(MLL~6KUW3F zq99b3^yS6*Mfx09AW%Acj@X&(dFCPwPd1y$l2j~PmW4?pekOZyp3RG9t2;m*;){sI2(o*nL7?C+%ach2^APWKN__Vk4LlWueAOlUDpJh%@GAAdQ)6>lHNg6I0?O9sL1_h=MFD`(C?8U*w z#pwkEPM;m09vwl{Gb%+IDL^kLN5@BpM@NSzCnrZoNBal+r)Q@JM|;O7dnd=-`p^Im zb`SQp_jb4U_O^HTw)Y|Y=~3qN_~P_9b8-ZnBZ{OJKWnn-rYXg z-8|XZINaLY-`qUdB5Z@{cK7z7wWE{MV`%5}^boS2pX}k6`?l9GEPD6m?Zn8)KxbE5 z>&s?51mJJJ;8&Ezk1FFgmc?())3;Cr{ec0&hTnhx1D<$*-#)wK2WrH`7#xZ3|KYQp z^w~Z7U>+E-2z%Y|AQcZBA|-)}vT(e*ELj)BhaSgYjl7$GJHI@=zBa$Jy>`5}oj%>m zWDcnTUte6`WP!^Yw3y80P3H3U^7{7r_V(ub=H~Y1=Kkj9*W0_l-QN87?d{)g?ti_x zySur)Cfr=zTwfEe1So)l3AphNxV|P_UEN(?-CiQ$%iF6q`|^m!Mo7NbQCbxV_BYUI7<(aIZ7hSLfGPnVTCXU-0i`mVm<1 zy@IKUO~5J0=;n&JB`e4!i@%o$AT}r9lmK>7!KVnnzRKQQT?kxXU2rcTB42>}iH(?n z;Nlc%BN6ZsWFR#oUk0+K(p`byC2w3WHOiNwLr{dPS=d9Ygiif8G@rx7%Bx7o?5Vs?-(*Avw`Oy~+?Q=u-d(RDyD@?@^l=_~Z*=b7vCODZXK zFDNAp>F)9Zc10EitIJ-nDN-#U4+08%!+w$+9xevVgY4#lv_dv}bxqn*tD9tm5kLb_ zJE@dvjQT1_hv-!KWJ2hBaW!*^!lmJXEpZYQNaG9iyVN_TsSjgtNzogDe!zvG#`ELz z6ZHRt>^VB5QxI+%Tzhtg-U2<*Ie-v!VhmhI1oSTG=0Ie)_v{#q$fOAO==ALH5S)Ap zrc-fnf{>#l@OcIuA^LH!|8eI0D06m*@zd_w{LI|DaSZ%k4Y#(v@cP~O3OM#319$@i z&t>s=0zWHHzmmY8J*8nAKDK~w2NfHB{<}{+bne5Ck`KEUe>|Fu zRYnqt%I4;};n#g{r{B)6&aH2*ADkS+WXROGo~~{#uK^-EA}0VI@Ymhl?HwQYcXz+u z-~HG9{eR!z|8MvA|8@8NzwY1vdjJ0Z?jA92z+qsx`x`3`lbLx8*M zOTrBSd4c*Vl%ffGzRundsBsfH(M3@CodzKlG$%R9xWkiZ`^h8RX7mi9t9`bx`gT=FB&BEOQMTl4_O8EJVdUd;h~`- z1l<(@bwwJuqI4*Lg`|?8kmyLWnJW;|1;+f~%G=w^+q=sf>iW11Q%h!|6k>{Ea&eF_ z6_biW>e7l2{Xx!4xF|``Bz?Q7|nS)%E=?(Y?&kfk!eXhI4D`?NKr?Cx_w!_SIB0Z$k$@N#P=zqK zI$1VUivUY53=L{0z9eu@Kps(hYB&*V9=InKe2>}3Nj80Skv@Uv>f+?;^5iPZ^hd*Z zjLpw!sGnib*c@Yd8qV{0l}4c;N4UZRT1?aU8l!BmB)MQr9(sco8An8sm=$2sK)|fv z1aq>?>A~^A+Ri$bz21($9dB-J!8SB}{~N1uhGMz6NW$2xsL)zS^at+4;|==cv*14Q z4nM|m-+lMpZ$0r4-1p7b--vM^b00AvjsGyLG#arzFB0}wRh8h$27aUd&Fj(irJ230 zb((KshJx;fHHemgDq<^#p>r)!bzOsg?(RWuL|XVOxDUh!{P+EP;BVl*d+;0)Boh_5 z>gM+S&E0#r#9R8kxE(b4{{7wkuLvW`6Q>ly(QaT<_hebuclSh%Ot_#+Wcn*bCK42k zNf(&`VOYY_g*`EO-hl6b_n=qy2%>}$0=SEC2kuncC)xwbjixK)g~)8Knt5`%WWRjC zW)<;+Rz1tGz>%#!caQY66Zs1#HiRQFUWNXs%)y|LhAPKZE;q;ec{A9^E>34(?P6-zb(aN~tf zcxXIG%S@M8MarCBrcXh9*O$QYRrdJm;us4+SeKyHiA!3e&_;~3po7`Cpg+NSnKO*z zPH858idlUI13D%_%+RsE0D$krco6i5B?zoU5ckol3g-LA=Vw?x*xlJ#Sy`KTH9212 zR4LirMuWp-aGMNXW3k6j>?kghv9qPH(1N!y^0<$_bV(l}G2xMI@spo^`tr*!@j&C# z^ImWtX2st;`UXF$sEzxyxi8Ip@#$0(_Ls-1qRE=-uJ+cqZ^ky(7BP9p0F{=jFq{^k zp@!PYP(MR$n2ejpY+x*=FpZ4XH0}dqFss0!K^zVJsA17WmzjodB<@3O zFdeMvJwQCjAo|1s3cR@|%euaQPxi&bNikY{e|HNo9}=C?LEJ|+1v3#WBaEI63r$dM z_Bf>mNi2idDraI`2{XskC3{D+VlV|Pj~I|5BN;G;YN4Vf3F3n*u6@LPG%f%j3nFlv z2ifs(g4~a|k6VIBlMJ40oene)hj_^3uKP6nFB2OU0xhrW{xmMxWK9c#$v2PDgu=VjGw-_Jifj-X6`$?zC5MV z%ahCO=~XsO>i{%^qv;`K0uL>krmrqfvlyFT6_zZM1mGzl8Z-Q8;FwmOVtwrbtCpCr z5O`iliwQJhr6C)tKvbHjK~^ieI_d^7G6&1@ss|?d7?UysLSCXjm9E8@mzGOtBur&N z3S>J>y;tY=gsWe#FYYfd-(OwaXMrrcSMRge?=P?4UtPVw&feqF6&e(+5qM=Npa_WcF#z>Thk*NT4A2^QY#Q^IM^rvzkw2{FADy?mU z`z{Wz&JM25kFGM{K8*greONN*^;toGSj+|&!H9k2!KR7%; zq?JVm=#PeeU_(rJv9^n4Ukv%q4mS^WRyQ}sCnr-)EiO;QY;xe~gT)lFm@3T1N|PaK zEDjYHIf@G9LK^x#KL+!zT|{A3MLBp&Mvlsi>>>4&Mudh!ougdmbZ3Rws%%{w$^rc)_1W4vbVOox4N^pvc0#wwYRvn3oLE#t?W=Zt^ylavBpXa z%$n(J@BDm=){@V*c6Zjc)>k&y@T7TmZFy>CX=-V4Y5|+67N)VA08i9rX5UUvzn+|& zc>8wz^{cUo@v*UqvC(m0baZ@VbYf)m)#%vkv9UMfvVhDFnO~Sax-qO|4iHXti@sY8y;nA_7(b2)N z(ZTW2!B?Y$Z^j4Tz8ZKtF*NmdWOjOF=H1BjfP+bo9T(yQ-oKOgo$^Xn|P9NadeWI zTUei2Seso~!)}ZD<@JSCU~PVBd2D8Cbn4Zsnb~)<%QN#En|tS*d&j$2k-tpe{2$kM z|L4v9{|>t(zQo)R4TJUZCfAQRf&-q_k++t^-R-@;Q>dg{NqySllzvayF<1uJWKtZ;g; zmjMpY)ROfTU?!4Se~3;cs(;a zLCSyk3ROHeJH4DbT?Ctzq&(Lsf{R_7{YBB|l2EW-H zu~^Ej<|><|Q8Kq#%}o|ljoDCPC=N3HNi_81B|q^COZ2#dxDVuq59}2^`ToflfBoXq zPdqRm#<1|mpMJzsVf}~4w4dUk`7?c{9>6zDjgnQtD_a%VREuq@P0d{|n!1vWZ3#kq zO=Cw*V`oicS8Y>IV{>2gi-DJ|!|gAJJ6?{oy&P(7>2H3~+tl3C+}!ixMQ=+>U+c^M zmu>xRZ3Do|mxxSmTiak;$6$NsaC_HiYsWxSYfs~g?uO>>#^x@de_xw@t< zmPiq5>Z^fx5~!)E!&b`r#+Fp$i@JsvwGA(ljV;NBmPCC^BGsBqwIow7YU|r-8`^6d zJ8By{fg}X3Z;#i#tWGvn)ihMZ>Z4WlB^C80#6a1;%-me>xsGDRZd5RqLj&iqfAnwHo24_l}U2BBv;rJf@H5$TvbkYmBUpfE0wa0 zkP69B2~Y&P8b@|iDuBJxZm)8Asy+UgHyHBDZ{DtFk+6eVgG*(v3+yDAo$eQem@HP#G;zv$+&a&SWkz7)y!(Lus)w zYA}?UjRHt2VzrdmtR<2yLe*!hkgSzfYXxb^T4ocFNZX21Dk%}0jL4)Jz$!&7*09ME zGFpNrO8_vM{RXqI*yJrXx{D01BBQg&;3z7#7a8mZqupe(W8h;kI;}=G!(%lOY$mVG z4EXTfVo46la@cAMTP$I-846*YnBk{Wvngmc1;{mqEXELAvmq#8Dh?WpKq3L4s0fcx z1BRjiLX714jm3TwU;qMu88GHxF$MuErzw)9x&RD7kZ&lIv`v7Buj@4 z^k+<%ic1Vd?&3l_&wNdIJdxu*-syr*(BXkEeoS0^(&`iRhY2q~Iy*`jR~TFaRE}6kCdlt;I!3QIWH#$X!_EDJb+56nUQ&`<@p2pB4w66^EV`ho2it ziVYD%QK_LQVknFl3nPYtlA?l=!e?Q)#f6dLf>L8)si7chC@3>ND>FPTEBYl`_)BTQ zFOlcK)5x=@k>^FF&kLi4g=IyB<%NY6g@u(xg;hplOfuKl%n3tbP0{mY!L#J^r&Z6M z#-2Zm6AEeyp2Z5DRTVt1E-0ujD6D?|th(S?b>XvE@w2$8C}kS62{_0adD!s zsHUK(=K1rQ=LNOTky=5jupm`blqxQ+HyG-TruyPSfd-?g*-+G6T-;n-)Kpa1SX9_h zWNauZtS>4|6&f1~p4UHr)&LYdZzw20ctdefqruQ@ENV0tHd%^Wt;H`b#cdW-hsDxq zk-Dt5ZUvCK?bdFG)Z>tPWkBwgm0qjVgR3@Mw`1hAQhZDxdwnF-^HWx{G1Hdt?Py)rF3H+ywse}UT~=$i&C+AF^vafg zhh@lR6&Q3_1`wiHfj-IFXSb4KNxiBEw{#-~o3#V5m{HyB7BhgVe`zznv{_zCR-n~p zX|Y+FO{QkE1$be$w3sce7IUlF+-fqn8qBT5gqOvpmnPFo$*8;zz$6P-3#%oM?55~#PDfCji0W6Er- zGaKqmMh);A5Rx(*>T@vGn;8}(-NLBDjaFldU?5oNE}+(INSX}^21aK!Ccv055|YTp ztlnO0F(xg>8jCS*GR6R-F>W*>W=b-)*v*4Z)TZ@~Tbg!B^Db%0DJ?jpS-bSkZX1TS zWy?#Osm?+(U!S4KSzL&PKXYM$5q!mzg||Iu&Wrba1^0p9K0WQlpzrHPkDfh!%9~qq zKORXW%G^i4#DvEy2H9xzm@(xxS3{3hbF0(R=QIzxETf8L%xQV$w7hXz-a0Jr?3PKF zWy)onQY>$s@Jmww!WHYJOP+SiGj3(pEzdgT8A+P4+h)Adj8C5RGko%lN1jF@9nxFb z`p&J)d6f;1yyUVhxU6$7>kLwM+onCzj8~rX$n$Q6;8GUc@`77g1U$-;fLmI2D=Thg z-J`5~m35!I>9?)>Z7Y83vQJ*}SQp)ZyyUha+NxVw^T=x+WeqX?%C2A9^2>WZ`M_h{ z_DTCbdEX1zc5q4_`M_sCBq)1+*_A|eH`f{f@L(0WxkS<8xm4oEg6}?Q;

pX)Cqcq-z;@)b9eHerbR)Tk z4%@!Nw#R;i?0c+xF6)ldx&zl`+s?z5)3(Ogbl6nbZ5vK$(+$XLZh6Heues!Pm$d4Z zH$Bpp7Zw62+psH_gm7TZDXlpG8SbiLTUKnVvUSa2U9($PWb2%4omFg0ifvA@&D!Bw zr)BFD0FTo;XSdGSEz=Imw8uK@u`YP5a~|80S6=lD!Nr!b(CZIvRQmn6J>uU+Hyp}C*Wb-T8JfWD! zW%HQCu$jlKreTX|2!O|C8nv26tZ7@^)nAm)Hx}_6}M$IE1$3FSQuOT3x3O@oxG-^WBsOWZ=?Sz_y zbmWn^Y00Nv<j>8d@bHDw{nX~c z8U(-NGT^uf*s}q!i6i63RZx%p+y_#ypSekX2!9SvL3WIc56ndrMqm%_${>-TGYf#B zT!akZCL#l`r2}9wJA)F*dcj{rVZ>`*dj`BF0FLw6L1Yx-5m(72vO|1gJwVC&AiVt& z;6QN;GRlAi!K!XqAnjI&3R#WN=Lu;Ex{@KYD1z=%K@gKl1oo8EZWY9dZutx$bfbjZ zPf`112BLCNM`Q+PY*ASnmuk5iEg5Gl2)*Wyu1x}v{7umT1iixC_UAA?=ZCm%q>s}e|nnzl4NeeFY^zyPx zUUo_=PMg3oh?Th2y6CVj+N}$+bwRSsO8*aY@BQDzo%Va5*E#n|cC)+pCYx*)TYWUr zsJdc$F{Xy@f^i32=*{$+P~E#_$+Cp8v1M#*9Mb{`3F(_c3P~WOkPy-~b=!IVfah~v z-;r!c?(^I8yl%g)Ovchk8p+ICpR0Zi>&!6ydRf2TtY0VT*GRfGCf#amCH>m4;l`Dc zu0+xnO4<^Ww$Mnnf(Zzs2?I3q3}gjH-7=GIxunCv%Y~V=%b0^WCfA_NHEIhafX}!A zZ^16%BgH2V!)LxtVf-m7{+2;;oArx~+DZE8L~RtL-(BqE)gG~a2H1yT#qd@s+e?)$ z|MP!hbirM9&iCDa{~sUxqi}eEzF)8p4lnSDh=a>$m}oZ5m8GSiuhqOkG4HmS_u^}r zp@x5#haJ)pP|sm5i?ENr)d4>GH+|3{u`$c|U-m(l`7Xo1;}N&uUq2otL;(Sm4Uh#u zaTx$ogrP9wct?N(><}gcB8QlaI00NmASRwa0yR8?N>6?g9E>N#H5tB2%|~5igb!iN zKHyJa=rGvihJk(1L`*;zlo3lO7w7}DSpTfY^a#V?xovLU4g! z3={}1FpF#?0R_?UiuANZPo)BcvRle+mI{S5S{Yu8am-sfH=I}{wgfMRFKvlsWK2L} zoN9u4RvgJD9(C^)=Lv;)1X~rFbgHWH6AD#G_$GzOchMW6SESRs$M9*xa4@42k1gZ3 zj1L@d9CzU_!haNeHwawfY0Za8a?+O&{iR}LQo(VS!?7fy54h-?O#Lzw4|m}!N77V%a6mH@_sT^tM0R#VSB^2$8LrJg}d!CnGH-NqgxzoPV*iZ?aMpu@(#A` zHo_maxMFwOq@9W|^Df1_%gTlwrrvHv+HI3|Lp`towM1J7n^W4!wgUo_Z6|?Pq9-K7 zGn0u|#1`Ucn?n{VX$OR=jf_y}FmH2`fq-ypN*(6SPO?%VC!r`E(q;$TBMG?NsF*fb zO&ctx4YFyyY+P?46bf5!F|3yj>mo*2BwH)%VQXM!!s05Ew%DjGVgeEeP1+SE4b&oR z1^udn6-nA+Vx>md3Q4ovq$x0I@*x{dV4|+bYQ(oo@$+?L#GF#eprs1(j8hOR&_8Kuzt`Zk38}pzdF|CH@~_6p$8v) zloB1>(80Qo8au>V#sH9{8uQ5A3s%?gQh%KA@pYux|wZ za61_vgRg5c{$f{!6&N?t1fEzm(AT>n9kiMbS|vD2z#r5BXb2_}s+d;d@}O&jueW=) zxK0k+$;6{bjJVhZ!xowjmj_=<;&OuG!1X3@qw>yWu5ig@bOF;_1KH_vWjO=50A$26 zf|^p{A`|!{oRO=jR5+~_4r_(oT5couRmLclu}VdZIFj&3)DvpUVHF@Nx69xWxW+Ha z+Ku2FW)|%LVM@7Esjyk$oYIka2x&CD1hE*#T*k{;t6~U$m5f~?uRte3nPG<)#p$tC zI;~_bD-Om3*({YV_2HE<7MwPi3#K1|XvLW`Ng1reh-9@$iV~*23wk5r1H#`E{E4aW zh;%4XkAB7N^g`k-uvgA61Zd*r!sukk@`rCJkF}P^ksXPnXuu(-P5YbSkE=#qW ztULxv*+Teplc+}+0b2W@+j0O#K!jUBIuT#t!uH$Euze1BpIyd9ND#DzEpk~p%zN2z z*d9CCZkxOdX1A~bm!u5#*d+C_5DIr0ZfCPgdmUt?MkD4VWxC5j#xztFkbp03SrF}V z$ij94zGP-HM&u5g1cC@Py4`7p2?7!XVXlZtTbx8d#vg^%Hd;-pS;9NG1z3bI3~R#; z7Q+UaXh=Y`umOLPZna6f(x@#q5dL7rCJn66q$vUu?=rf*Ske?R0l~**j6ZBwNV;OH z0VjjcAAbvkJN7Bk9{Q?a{MqDENLNGv6;qLHNHyu^>NOLzl<`oaqrg6Pd&7OcD9*!3 zZ7i(7|2ND*@`BkHhCC#fCu}OA1csP;>MeL$1ct2AAq#B}+lXT1C5>Po zdrv|>08H$NvEm>|jWoP2p;;<}lyj4jth?LoBE{-7hpETNbIFx3Cs_rw7@N>0tgTpo z0c0?@trF(4Rk&>BE?b$~Rvu%kfVq`Q7Ys~MDq@w&c%>4dy3w|ZI69ylhv9gqt%9w} zVXL$&unLD#i^9|u>)+p6M}3NoB607~GiblC9Hc*QCgzYrc0r&PldZ8fo=r&1M*SFu&b+3_g2 z+ecz;W&E6Y3pgdbcbo~G4>V&~NLB#NL~y!=z5s9+eNgPtozal-MDl+C8 z_~HQmq%u1j@0U9y7~Nu%jOd;wq&e%(0$4Af; z2vhZ@-CQP&v?m$FS_O>F5c=K`T0*9->kYaxVhDN(ZqI@`@x3 zDHI4Or3~dW*p@o;*`Vjwu57AWfSdX5c zc2y+1%2S*bGhG$4-BpjpRzH?dH7llaMoh&tcX@Jb#njlcDXycF90#U2j!tz{COayp z#Z*pnS59#pNwV)BYdinGm)| z)r_S2Sz{Vzj%k>Y)Q}R_ketvkIkqNwOk>Kprj+qb(!_>aDqsriS{8V=?p7Da)(ve3HhnAkHJSCH?nO`VQSPeay*V4)`?*h5&;pN zbdhZ*Q=^Jo?9vwGYDBt5&Dd}xQ9-7KY_rY8X56e8H(LywWc@~2zX8!ewzXzN1GTG- znw5HDpK3-;i7=A};9E)CVG|Hk@n_T&8Z|}O8sH1-k;#M-r_dH0O2zyH;}72)yWrhB zWO(iyY-VIUa!rObgKmaSGfo>FuZeOZ+e;abzo__&9;Lw&G*}@6>&ixrdh|EH{Wab9 zzyrU<^r}Z6Vcqwr>h`kxOLGy>)rKT5YIcz5Fd36A(o*DVIkt+gEc{(b^nra)XUKKf z)LaK~P2dKs5$2F8>}2J(unGJzD=9Y;wz~)jiD!dJ*n&`mGx(%zs-_dvgEtDjCdg$s zmxuAkAS2RMigR#DmDqQiu>}z6*^tTKl~b;A$Y5Wk!%`WiR84SK zO$J;>Z=E(_bIO$UDN|QXOJ12gtvETQIC*;U^w}%tE#8>1WLs9|_Uz0ZSxdGrP2aX8 zZR?V>9ZS--EluB%o3XnfW-^HX=_r|v9B-MKt<*NU_~h3Wf>G7c@zIFOhA zL~h#SIjQ?|Q}^ek9n4QVke_;>Aoakq)PpP1j}~Q=6)!0($vjk)v3EtUvc){;+);ZIeUt8_Y~#sD9SG_D%e|8 zuxEMhw*1U3c}q6uW|YEm(#dkuOY_pV107xOmf|MH?0` z+K{$*eMaiW%(T*_>06d&Y+kx#)6%7zva&X3W|wAUZAo3aWpU<~)FoTemy~8?lxE_9 zj7>Nui)>@|k`1{_HWXxTT(NXhan|PI?9$@wEk#*d3bVE@U%IVe>Gr&(J94si=Hxt) zn|CO`;PA47L(7*PUa|aeA#B;e6pez|e!yFh1N0xEnkr4+GVwQ-5kt|BsJ0=b?{sguJ3M14*EQn0FZ@5@k z+>uli76u|6?~w64NWQ@+{>V8Qc7#dI?FqZpA_PfW+(_Uv?{&$0oe?89obC$y=>$p& zFRDhdLe3#X@P{4btPvSR(o&?Vk)k29l5OR5ieO@?-9%^;72$TxGg3+#KG(yt6Ys52NriZZ+^`$%K~ zH*8J`0IC!Ov`H0$fH;zE*fkClP)IoyaA5@p5f@H7aP*Cl2kH^{gbDmHdBgAp>B8sW zma5$5YTyrtfsf#+O)g_Yh>bKI%mGm1A*A@KgfaW79F{7?!l2Z~J2yTyaYIqg_TB4u zV^~sCLtV3{$Y=0VJT!b&a^IQQR`A46F#JcYm~jwEObt_g`pbfbfbdSvqBun7M6-hEt3#UVv` zuY-;JXf^>jaex3Hv?naQPmc=6C?i2eBv}40?AwOi2xmyPM{?6vQv`p6MP!Z1j9YDn ztyX=hMYmbj0e>51-FmZDun)R#l`%SOgu;ly9gg5nB_K<}h-)msM}a~ULVhO1Ps!`cqcNk57Z@lmKzx&<85B>>DQzG7X5Bo^;QIgke(8WmxIJ^s~Y?auDG!thz zME+qU_)JIbrZR`A%xNljG5g#CJ*2h>D}YNx140Id@u&L8VQ!WoFc(If;2OEEF!oq! zdl&44UgHDkb``#aKRO;D<8wgJC(hbD+U||BG$_&$IMGOtLh;#%dX+FbH*=NKT;+nv z)ovN#wrUrsX94?=uh^>BFPM;+KW`QW>J-#g9B%Q}wRi!(rWPQ@2h4e40(`9ke13pW zWuKqW<`4M&LBIc4*nGVKnVc2i+wX|T1a}Kt81;l;cHlMen)prau^|rJ! zJXL})N5E3>vAG#!Y;5(l0J=C6Mm)V)Hk_e1(ApAcZ4R_H(bm`8=JnvI=xq6fao%*! z`~lL|4{PzV`P#g#uz(Nd4Yv5`OQX#nX!EzxcLO-y(BkpX=g)7}@AKn(pv{Mm5g(>M zfPMT$=nZ;(IL3p&6rH>W-&W20cI}>?l4+M`IxH(4l${{_G5Ew6Ic2~iA!)8UU>Qi4 zB9sV4qr$RINH*F+5a2HI)DQ<(S&140!9G+Pu&hJL0cDwqcLIEN`3V>mV^K9i_%Om5 znJO*Gza|%(F$XyAL;WeXfFKD;K1^h;Syx8zw@2hyM2;9iK;%Q5W|Squ)asmYY8V+3 zPE1oJ4NR?bM41jMY*1%IX54NwY_saOTJ&2iIzhmVvUZ)MS!>d)F-ETrTXpvzPAOJQ79rFi*t;d7@u7JP0t+lJw*8zkP+UNyfX|1s4f@*xpfeE=$OcZEf~}3T^)&~)9zWp^pPL{xu}}Q~@q{FH$(W;{9wQ&r z!)JFa5C{f>!5}`RHhe<(X%#<2c{~sTm_EITfsi06QI)@k0C$yu5U&lZ*PtF{mR-){ zoGH*oT92bQNXl`2BIU%mB!KI*xRMk#p@MycKXz#&>?5H^?4v*s5Giybw!^xQ@W|^{9_=fR^T2wxO3vsYdCTdh2RQitUoc%C264o-+Gg93m`{UwBQOCmq6Y)e4P#7Fx zN`s83Or-imKroydCRHd(4i(c*E14kRPW%c}>%fgW6ytV<@dpB0iGZ7B?MAb9y-Bmq zs99@_ju`N_#;AcW3?uxp&nv(eVP7OTDAFU85jN{qT8-Odl`0f4C>BzGiVXi3e;U+j z0`y=X`V>g|*(FqZrx|tVW`WO(N*82%k?}C`P(SECYDmNSi&%cvq!(`QZ!x#!F6sA& z-~ZuH4?QIEym#q7g%mi7;X$j}aqR!3cl+ zuNDQs2-PRJ$l~osgE z9_R}CLqUH}N3bgxXm1Y$V03v01O5OE9O(=OVc6+vZ|@2Q+kKwSfG-&Ef|%_AUwhCW z4EO>8uix(ha-f4q3gO4+ZSwgVyxsq5Z9e#g@zoR1%>J0R?2l|7-9x&SL2?8$s40w8wryZwDu)~?)^*x{- zojV@NC)^&yn*-S4)O&+?Vn3UQULioF_5f8l4Ue};JR6=EH{d!wj0_S@Y?K{# z$!yr+WHCw$QOm7@4?9$Dy^Hau?u%Q1KjI+pX8``ltOUU=vTn0kyV0awZ`7Ffm5LhT)$fnaB#y)yukv!AK1fM?fU}M+SVr9}EzDeSAVV6}&3QjNid6s8IZho4~$c zPpG56v$Ho4?0}ks-$@wq168080Ea!&tw1p8)_`DiM}T(l2Kilfw0Cs0^GTAt_4W5I}z0`eBGLUiPl@9600>FVn3?CR_23Uzeg0K7ClLkK}gX}ldZ zP5{;k_VJcN2lT^^KgB;Gb%l`zY;E(j2SN+xEwh?uJ1t-zJkUcn8HqLEPn1%T&&#?G zJA^-O0pjv$(R0Fri(T4b6p|*O!Y{TFxegV7bj}VWn5Yasag$V45yf7t6C{@Bh zM0FvG4N+@7Y>Yof-fqPtOmL9&AmL9n!XNx!vu?Ab-DuQqFldN?(0~9R9ATJQvqmBl z>?8GuIADZ**k?Vs(iB}HMHibjB^K=}#jpuwVF<5Npb4e>RJew(BD^UCNugfR#6pFB z)Z}X_mi3uvCDukIa)SqYdnM7|#_>8Wmf!~d4CwBN8uiE@|41Y3N%@7lJO1$d-#`4& zLw|nc&tM-_xp2^r2KP}_GaOz_kBBkrr(2Au>|3sw(UXhZIfOL6%5XM_i4gd>YJ|gZ zVRa@nV3^>L% zoTlyQ(J>jab^1)LAxopnijK~X8kMJwLQ6c_Gw}_Nf90r&0oN+oNcxfPGuMPofDfU- z3VhrK&AbHX{Kuv*YAi$CsufW%s6TT0RA)`~xrET*D;F1U*qD87fi}V(D8N4*?d^R7 z{eAs?149G-gZ%(RM`ss^6%2Ou_nrxL^%DF1?Lz}YfRMMLA=KG<{>&L%@W4u6SLni- zvx9woy`d0T0A%=@nt+2)S65eOr~@Pog@SlA(1Z)#=c{jM=O93 zX9kCQd-{6&`#ZY2@S5%I!M>iJK0I?E*x%K4wy*C@Uq5gY@It-;kAYtNghH@RJQb80 zo);A9Xz%H0@9k(G=;}P*-`DH&4Fuamf%e{D=Rj9)Z)d2t6VKV()!9R`m9jfNoOvhf zH@vAXNJPJ{)9dXE1kUvK^!M}tg@7}@3_$t*&aT0(uECDZp-@kMC`53?=fGRwkJtxg z&FYWY2ejiyfKT0u=qIU4#-DKZ+uM5zOSP!XcUrwprPZx8QZ=Y3P^WV4 zaHA0bXF0kcxogq%lZ&T^7ESA3oYJ$1EVM8sG;eD6}I$ZRp7A!LCrdOXjbQ8dIpWArF}G?tr;(i#mWuulsK7ajfR!w>z( zJuA2U?jH70m5Zou(O^O}u}>FkHcYb^7b?;Un^epNNBCPp^xX?SxVOSB6#|VBMnx^W z!+|+YcOcjov0(v-8^hu*%swPQ@NguBD-^bHeGKXZMXe0o1;b&2edr#s8CKbh)WSVJ zp)4+Tm&uT)(`D)OITGsBAy+MrD+tz5^b}w0$o2~GRl(=A$yIi_+QH_8+=Ks1)h)QO zLcx*pX4H`<#>{^#Wnoh}qV+2KfIlK2D+>{CQbSI-6vHN5Fz7yJpNLfv{5m>2z`o9& zuJ*2u-a!y>u%~~(3-)yM3=CexBE}lOR1i*yu zYpAUq?C(D_FxV671rzW?&LUXn^WgY~hK7q5FR?QUQAl2B#K1T(6dZxp#H}O%gMQE$ zIPCB09O&q{G%#@K{CSWW6oo`R)7v-H(+i0T`au0PAqDLBfMFqaM>_-lP$1CX*>Rz_ zw+A4Hx8Bjw+tY)spmu+6Zx=)x{8sR;6F0LD8wm8^y#)MSUhiOg$EE&(flyB;9DIPU zqw{QUUoSos#0va@0pO28jE9r-hzPa#nVp$ zg$rl&ES}RpYg!kkV31(s9w$&Q)><=ra(C*Ko&^(+k58ygbfQZ9NDOs+Q(H?6B8D_F z18vUx8Gl4TwmqWL&Za89F#Dw4XhTLnGNp`7>M#g3{AbuI>q{lwCX;r9Q461!9NsYa z1p7GSL5eQ|K9s+x?4#NjW*?*sa%*Mm4_|DMCdZS7Fc;m8dVbgXd3XB6uT=iW|!T%MX_wP zS@zj12QVzaX+4Y{GIWpfHwnC5D84F1hE?0-YP($HU<3OYf&@MU1UVzT$zXUa-ZgK| zwE4a|ALV1AcNlylbFnNs$nA=N4?BW=P$q~?jnsW`aG|vz)4;V(Xr&A1&z?OG_JC&n z17|`Z2q410qn1P+tB0{iFfOJtbEbC6WA^p;4uraJFVxlryw=$>04Uf8 zy?Ob}SzrjkKs=YopPfrIv!o`Jp!*uG0wH~xv4wHw)74lU6$#w4> z7!gVk(nCl;>NIEeapsqE8i1hiG!v69l1JCY zSP_sxi++aHl;*JHx|QOwF=dHpbU`x=nr+bABiF>p_3?7cXp3)*)t6-TCRtk&70+lp zS-id3jfNJqEprDqS_9*3HF371vC4)xB{$BV8)MIni`_6j>1a~ykp$b}MCEX-RmC5& zB@SvMqgrc`BX)3cH3$d+sF>gmtA;#sVmz)g?m-s#qwwE0>s{=lya)Nbr1)qnM4v&k zn!!ix(}&9d!v%mVjnS|YV{|dL$Ot2y;I!7dU>5jZi0>npfUYofwW5&>@Ktr6BCS$P zE0FOpX{YF;#%M>mHKUO2#X25X$q2d+4QYCdMKKzUTCEoB`|WS<$HHvGJ}(BmJow;) zkHF`pV4o=Kqp^K>q$b*=C-z~`<4j_ov>d%J%sy1QV|W41M&vitpdRbBVd~xU>#wqp zYKce4K&~=DbWaojq680kBKBEfQiVk-hcN-^SGv($sjwkm0TG8+RFJ^MtP3M%{*;g; z#`p?^CTZ3Synv%|RHIiFkIq^8_e$&o_^fg@v#&<5&nefC?o&&ekrbw6lT8Nu=EOSZ z&PgWraZL#+zA*SmVno0vb|Uy=_KCDDa=7#pgoc8D+S}JZFbKB~>JG#k92z=*;Q}BB zr*vQd5bH-kuA?&q?-MR8gx>j~GZaMQ)CZi-3l}bcIG_M7exC=)Q{S@}F7|hYkT$?A z-~zFRqiIA3pYO^u&%&Jri4d6in^bK@%oQI->I)g9C>I`1@0N@J0wv(c4 zkXIMaoQ2SX-wmC1{`>_ZI6o&|6pk>|-{9aNj>M}VZvjN&;4=dQbT49gejhx0WOeBz z{h%!z_AaD!a3pXE&m61-{`-PmUEV;42j|m+Xy73H-1bh2Z-RZ$fH)@D4sRC{75+F* z39rR(kdnw@@QwJ&5p_Rzfe(Kpm3;)hRu3%D5n7m5s5eb_TDA)I@o*aI4q~lAqL1r9 ziG3Ug1pd_CaNv*kfj<#qqZ|brWo9``JA!=(CW@LE?4Xa>dN9^@bV7Vxl52mAtsq88 zo&VUH%^Ojn=r1q#uU~gyPD}a!O?a!?bXFv8e-+jJ4TiX>eKqi+Z;e7_C9BAkMZWJGW}<)|w|Cug22KIr(do#>`Wcc}}HZtoy)t z_mKqUU@XprGsWS&@Nnrh6$uVI!qk3;TV{;)&YIvy%N^m*w3~*|P~Z=4FLa+8^+VFb zq**U%)=6CZqL#mKs&@qbMykIOLo}>dA62A_D%4{q8gsq&1AJ~pun(1I_;a8N7%6x( zl7W2~7lvsx>uu6%MJiTIS(0v=AsXz9(TqZoGp%8SY%kU4Me9u_lO#(91AhI>?;lW? zE>iLLzylBbf_>-$5u>XloyK9*C4zkzw5dpi7^g*LlSE%I80j#QW|64eJ+R|nM@Hqa zPc?M*unE%ra!V9r>WM_e2=)PgOg-9G0(^pf;Vdlzc9n{BR59%}>(^-ig3qx~Hlg+S z0Og5@eHiI+D8_;$7Y6$vVhXBOTJK_CtwXM5_6hu6n9pePJL9S<(h|1@-`G2)luOy#oUfc9f(*x}&de5K^wQ6Fx0& zhkHvo;9zj@?AfkR4;uiuCG8kAjcXUF9W=gH-S$b`^jJ#}Vqkm7xvogg3(GsI}a zGvaRdxaozF+eJjLJ=oLLNpjWe0o35q zcEPvx2m0GXJ-{C#0qvms(%v>tTX$%2Mv=js;<9XUS`T0X&~~nW#ZAm-q*O8`I^vasamuz>+lqMC(!8bHE6O}4x_eH9x;wg$9q&5U z-Pco5)x3B?(HK|JSm&W6TVsOK5^wRx$^LlRpCAVk$&Mw;z69A9Z)u6O5dPfOChlUc z=l<*UC3)3-r!L`NQD6Tl{Hr(-I*xa|dEK^2N%P~Z^W&|{N89!%*f2zrFiquws_vtr zYk@+pkw#=+t(BQFre(%>e++Upn1qP(V;YP|?8D?0&UkE%Kj@FwklEq>%8Vn%X!+%1^?>~ksUBJHo{NsN@ z_xg3ka&Oeg_WJ<|yOIQllsJFZQk z3KdWg%tCO9|C;{sMpi4Txyq;F+`VXki2W1J68jnaG1O733Qb)ob!V z3=R$sfqL``j65hZ?BEvoyk`JbDyzZqC>8-ce2C3KfAw{Bp6!DZN&*c>l5-je3=Ryy zp#Fe4APFE*AMv4%64PGa!KO~rO!pN}<4Gcn-!g~cz;mITJ*w@(ss395MOWrdf z7+VDUI^n|m11QrO2z3r1C*$#U`P=)t`UZQ3dOQ0%16@cm_aHYC?CkLcVTg%#w1@erZ=IM>1RwKzyZ|AZhthK>JGg=HW~KN=KB;8XEO6?_1n1ygDFMU0cY08O6V zJUcsMOJ#X$=ZVmX6Wv|iJzYIL-6#7_o*p=L=Je_FL!Q>-V`9^j93>N7O-VL?qS6^} z?M$$ACdxgdWj5{Vxg6+Ym%p|?mjVe`ZS*C$cmW@4X;KlXnk1dKos;XgI@2bBl*>4w=? zh^Anpey0zxC=!ik4Ba>BrkD+Ltfp+6w2BiQ)X_l| zOr}GM>8Q=bQ8~`Tip;|Z{E50eqMpsfMqmP-RI^JWwTkR&n1D1fgRS@D~4FC~K zE7YO%_aZrQ9&Q}q(9;WfcLD!nY34t3W(cX#dbpFp_P)U(IKGgIz5PfB4?)QxqK81? zrHjv?+>L5WKvG=CO+KIo*$~JzR&RtqK`Z=<8-X%7)W8oOLFo<{D&~;qZ4X|+eQo)d~dkqUA-N{?+!02+F+=cgTOr^?7;3Vr!_`4u6U4^iC9aUCvc)WbLm9`sAroy{Aw2JvrEqy!)lILl@5P-dQ=;y>v$Wks0wF zQ=C2HmAOa|i@)ycX?6X8E-KvsXzs|5SV)r~6Blg~@+gFHlSv(sAVwAMQ;wRRboCn8`dC`L;K zn#wR8me{A5*ILcR7IT5coQ1V0qDPI69u*fo${q!`mliK4pBJfKhfR?Ts8iNzqWY9nj3*X z6@0*4xFA`GK4u?1r(&wInjqyWEoQ_Ap%xJYMAQcOLro&aAFj1gc{WCngNY>l6q%xa z$aUD{8a8~^FyuWb%|ugMP)BMljsElW(Q$KACO+0&>*ZKFi9RBpK;4Kd4~!5$+;@OF zTUC~TeN8|QE?LC){6VM}eAR<7*isY=3W#%;$ffoo2i#7%U1&J=b_e_WPz(c!2G}9z z-~*EI5C}cc1d0rJs;{pHhHyI|g5&VjSaSMJ(%CR=Yvx%_a5F-i4;Cb+a zcZCue9FGTLA3zjL#9ai`0IHok5zae1I0$DJn5sw4gYwA@kb3|hJX!D#4@6Bh(k?h2 z&x1z_hZ^+6tJ6K+rhvBzRelKS_4Jo%a9Z{WpBF9O zV!{Q&9f%Rb2!b^7hl^ck;LxwIkE4D_cMM1Uh$H0WLMvd}8x8nVq)bJcnYyr~uEx`O zqU(59=Ltk?DfBVaclzAG(AmKY=Px~b`Pmma}_UwHB5=Py3HEPdTL`|_pJJ9B3~ zH^nhD(ROZv_381}XU8eejgc=V$(Ix5vkA)SMCH`H@q=Sy8ZE{}3+Ju5^89P>ymR%H zSN{6q3opNL<@w7OpL*)-nR8D9tEUD|^_@D|-5csY9z4En^WLcwGGgp$Zl%zz>~&cq z(hpTT2#6z;d3eUu_Ia~HaZapu@c6id`Z>v+v!@=PH90VI^0AZ&Z75nq6)oYw4^lAgK4@N#O*k_0;MBopTV2mh^F+Jh1 zH9C|AyOl0RPD>&Lfm1?{3T9{v_N_y=g~eQCk}@@#snJp6qDRGpebm?+g_VV{kU0ou zw8}CFh+$S(aqYLieL%Rq#6FSh;QBrk_eCMyK`Wf288}KmDjN9_m)VePH7>GA`B-Fw z|D5;(^Yn1jVdy@^R8A%WaEQT$4Wwg8sbwfE3B@fc_!Nma#cE5%AIAX&@2Ig1=8&pj z0*(TIVeqkjWZlQ=PcW3X^t50fhT=8gdjls1$DDj~3R>fP1E1P@#@|L{+<1@yGP#u~ zaEY)_k!xUpAeX#AgkrJ_MuC<_{dvadq`6ZjJl0g}VQ*@L!#e_eBeVyDCk#Fi5C$;= zg1{-|QWYHFLp}l?970)`7C_!6m)A9`~4thJ>BmOdZ^kt z~Pd|0( z$}?A9dg;~IU%z(k+Iw%me&fB@Pxpj!7MF~%7iLaxFIw_^+Vtlq$6lTo|HAm#7skcB zIM)5rgxD7sOnYVZk{b(>`_bk#fA%VrB;Ee<&WATXc;~G*U;pc0Uwie{m!7}!?4^rO zUwrD^*)vZL4xT!7>SS*(ULXIUF!N#B5(ybqzaSrj%C_(ZA~ z>@!4ZWUbDPDF)2GW#}WJG!|vGDC%J|LG%&(DCJ5?*h-lVJFpQD1bsk2@_dDegG>YR z7<_n3FhMS697spVyUTD3OFt5N_n3kTmGF%$A?ZkRrKR%NnA$iuo*Y3*P!EY+c+mLx zApH;~*of~9csD$Y6t&}(b_@Ckt8Ms*8GMXCQS~Cqi!j@&GzvcN==mwr<~KH@r=Mz? z`KlY%eE>uReCl;5!t4}(BI(Di9i#$r1yf%EJXN9_I75y1!bnk4*)(0TKI9^O9yG}Y zU}zwtQ37~nYNTsvZEkLDYW6oawUITqHG2F_E&gVbHq@3Y%!@e$zBbe%k`AH*L-f@J zs9%_kx@}1}!C?&0ya0d>rvxvu1+RqeTxzGqEz}<-9*g6}4sJn`f!GHWwYGR#n>{$0 z*5)REb3;6?l)x<~HT zJx&eL9uL$RK?=2a-eXi))Y^>aqBCT}XCeL&^ta%rCNG!&G&IM7w58}fq!|qmr>y=M ze=UN2Xi`~{wMH@{&$|titOWb0iyj^pt3Ti`LO`0NPyI{7E-?GNk&Fi}OJSt`M5POt zj375yVm8cnD6@C&Du>kT>N*iZNl6H?O{b?Y-;Q zKfL+z&0C*;^5qw|o`3pE>8dA^6N=JOYDzNCmt?+NnE6uS(l?8;uC2`dVAqd&laM+UKrZ{ra1)zyA8p?c1N-{P_C2AG~$-?bly>{jV>+_`>C9p1yeTsWWHK zo(BGqo9gT9hU)C@uB@z0T~HKjpBv{WinHx?ThVMsxj_J(S^y}ki6jF=U(=#Fr!Zhj zG400^Q8v@#6I{(RCmzSBQJZnM)v(KA*eUCG$hz%j-BwAvMbeg8&9u7H=F_MX<|)J$uQMoT5L0~aLAjeUm7u8UMa?II${I+NL7J-1Uo^!$aVz& z06vxLx`z&NrWL_(>#*^i+D z!djZ~7@`;yBH>RZwOaoM7K=P6;D`eNVtP;Xy1wRS=r|%8B4uD7zb(Qa8L^W5N|suz zs`&V(W?v&%+}PUG;A?_XtMfJ2dC8hVIl^}{<`)E8o7+)VLK3W{$p`j%8d^PdINsZY z!vHCCwqaUKd#kXP0G*Ym(ce_vTGN2H*4EPCZ-FCR=l9k4eGPtJBYp*5nSgZm0HUBF z#3WG<>KQ+gQ8Cu!dKYyu1C@QK zw}1u_@xBQAu%qIS*eAhIGYs$*qHn}$opoeiO*j2?p)ma9sa`mrL(qF?pSpPA(zBPI zd*RuaUw`51wb!oQc<=p>KK}UA&u-uT>dQOdeD&QA-~IUG_uqf>U3cs0;wAehyNl;e zIGQy-urjl6b@sX9MZHU>c&9qH&z!ujzPkInZ-4my$M633-PhlK`}LP!efin#&u@Hu z^WE$3zWMIe*RHAtg{Ovwo`mA;K^O$d{O%JC^$mH;SH?LWi?uI{ zA^h>OUud?YcZ7;!DlQqH*qAP^yToCdDC=lO= z_l6G{mBlDLM7m=WFTk`K>{HAIl3}4PdYm>2W1L+y(}mb)0{b)?tk-750B06{8co!r z4?OT2EYLR0K6LW(5SMVCmpXxsSVdT`OOVjiVM?=^iyiVd%3(44oD}k)X?-YjVZV}M zc~&@^Y$BpJ@>gab%|{{pG0_Nc%s#3j7Pm7NiFcr07<@Q*xWh~wM#XpZ5FrL5(huMh z1=2jjik7_M;XJ5i*^L3^3GP5rd=T@{c?>t$hpCXr{KB6_M6VhjE`?MrwamU+W?v21 zN1_t=L&1%yRHvUmI%z>l%EBtJkI+T>BGS@9uv5i|dIjQ|WTR_R)B!@!L1gieD>eM& zq0l=C986;(V+H|0#1UU3tQlNrq4|I?b-G~Q*z9e}U7skOP$Ck)9Cl2lM$ zP(1(v4{o6n50%a&>mcrMJ7JEdoA7`WV5o`AgOPqH$zz|9=m`@_kVjdyK)B)gVSrte zuTdD-$M|ckYazq@za~2QCO?K&(cCJ43p8&A#p!{q@MjzAQ8egnY~=Td=~6h6pw}D3 zG#R`aeF2cXZE9_*X>F=)ZLVqc)B=~SEp>ixz2Do2r^8e8=iH2uSpHVp=OHtgPN@E1 zM@*feFzk?2s&NRb`2NM&ra&vJtx7#^yInpS4tui#HD z^b_pkG-#p8ILiU>9c%>lLZR-S-ky{Fy{AqO3=W++cj4lt%g;Xd+?5wzc5 zYd5an_~_G5Z{5EA#aCZ_^|x=o`To1_e*EF5zyI|2fByZS|NiIapWF%^56zizcw*AJ zaj~n$#H<>Zux9F{jhX33)~*SCc=N{hKmG9I&p!fx-+lk>-@g0in{U4Q;>+6~-Maa~ zhwr`n?%P+dzVYU3e|_bJ7p`2na_Q2gGiQ;RA3*vSiI(1;P-~-ib>Z4L=WO5)BVD2X zTxdQaKTmM{z*uJu*cXplF)WlQVGYs)Q<6M$rkp@Q3>Fl%8~2hK_S*EjEIO#attM@$ zQM1{o*~GTdsM%oTZePrL0rDay++NCfM3v~GinUbbSFDR(t&iRi=V*wvHMp(yC|%@> z9cfk6)j@=!-Vp0CVW9MSBq1QnIMusAubqem%eB!?O|%tDOQJlPbsw?MVm3=Can@<0 zdC5w+y(;@2dH4}#AHX-vK8$PDYV26$9^;y^2D8mvf~9f=`)FwiIJ;X;mF8O-m~W9mPsiRxH^^5mSuiKw23jCGa7)YnSV6 za-Cv^)xv~7&R#ZhHCr@M^Tv%`ICbj$M$GG@cpF_zYL_T$Ku8b34wqjOO;7PQM+{w&NQQ}{;i02=Y$Mbn=|+_l0vY6ck_4mKq{P++q7_E*VP+}KFKq;H zy?7Kcsfi6R1r}lORqI*YRpZs^92#o84cOLs8>&5ZRZTS&O*Q3Bm6e{la{SuTP}$N@ z-c(oSX@DJRsy^IUb*QE0poi>;r|xJ|T}5+!MH8&Cy1BWgrMbonYpU?pmwD?ed=2Hk zh6-O}rLU>V+f>uiRMSvfS6@?KU(--mi(MLCT2+M^s^wKxWw7e1s-~uT3>8Fa4-hEy zAN{$)hA}({Jz{KEFp!zO#$cL;8YVQ@A`Ak#XOW0~GT{$9xCO4(f5pDL)E`t5sE3JC z7*vJz)sP-E7-lM#nOk-q?dU$yMd{q`lc!Fedh+z(xu?!udgiHTuRML_`R8AL<+ZDC zzVrUI>mPme(XG!u`Qr9xUw(P#TNQji3h@2wpa1?p|Nh56{_b-9pI^1@+fU#8=))g> z{^6&8{Pfe$KmPdB_uv2Ux4(V&?Kj_kbLY!DpMCc6#~R8Z zix)4PrS!*XQ~;vD010RO!B>@RinGs5vX#Us+heTz+%z&vxOxY$*wc*h$EGB!<;MO>e9SF z17U8J4i;6SCH55({-RgwqSwXR>tpNpnn{qrCH@Voo&yPw#HTt}FF z5ucZ9o54O>remzhI1S5mfPF4`C*GtR%RJK3s7GMvqE*=!&fyC7kxR?Q_@jNWkHN?6 zGuHrls^}y3)w*C38DOW1KGuCC`dIgcAIrl;h3-QO8tXFFedj4K5wnJCA)B0YF1`Oc6L^NE?I6)L4Mw{<@vbC;p z^!%)}g6y;vIk41aIg9gi7Ug9x%)@DCFUZYav@9nTcNNlh@rs;91=(cFvKQuOFD%Gf zkhgShPWqhOjK}ga=jLV2&(B`KkHs^<7Q^zh7vacdSqlo5K9-$6H#cKJe&(E|X*1Io z&CWkNius_)~%W;j-1(MLPhUu7R?D5PJw_J!h5G>!#A2_0-SX3k+MmW(rG zDP`q`z5Wv&?cJTBlifXiCwu!(oj!Z++|vZU%g?`b<)v3%ee>!&?|<((c? zZ{Paz%P%0vk zqyzg_YE}F}0OH0?F-mQW4J%JIK$=j702)hWAC|Evw-;T#R%x|t$~PJ384QyQhOq`c zR@ZPDbc$Xp>9we9F&MOZMK-%^R@tD(AW{_m{pmmdaNqsRKIA$$-bWK$RNY5o|EQT) zr*#|jSdV;$#k3SjUYER&*>^b1K3bND*hjfkq5FjN6EQm#e*hm)DA>m%;|X?QvS6pq zVXkwU>s(U3OG4%3UF^f7NHDTy6tO~~_y8m2~0P{Xn({g zx4JCbT$bHVD~RF%3lb9N zO`S52*+gCUXZmUaq@(*DalhGn>{CW(W3OU#aWrDSy==WSZ+?n zid=$MVQwl}PS|qOmJ>>_P0b~0z|wIfUCg-|pcS@-d1OWT=|y;W-l774FL!Za9&C}Y zqP*0i{M6!n93u=Io=vqSg~Y+k!aUd#dj4Fzt~ePSMn@Lq(lJGJ z40iZ|Iq8Kt=|#C|Fn%M%xWb%;D{>aB$X!IIkqg7U{2p2R|I)Z%&0V6cb@jjG=Rwxh}6k{UM#~BZG(PRz+Qq>e^9)qt8G8^ou*6fA!U!Z@>AP+4sYbKLTWb|Ht3KzJLAu-~asAKbl*+kT6aXjqjpMU%Tfx;iZg8=;IZ(rT{>hsTTfAaCC zH$J%W?pyD?{`wm)zx2wLr!QZ)^vwD5Pn~)4$Zz%sZt0?eI3*=cSstrw zi?LuuBr5u&z#s9Q=4i#+%M+9`sJ|p@#q6=F3_#@MkfqjI(VfIC@GwQZbYX_~m2lmx*i65mqIQN3F3xa(c ztx}Q6I7ep~r_o!rdP%RB;Nco{Fq1)NFzO7F-VpD0x^0TZU@+@-$o@X`r-$ylpMBo{ z{KFp}{?nfx#qzvi_Jx~yB^37=_2VStEUb!TH?ITxc853mFB!t$!#VQzGq8=MlEL#ji(Ph>m<_|!5NE_UHm22B~@4}!8B=xGx< zWpb-I-pAwYac=l#0Q=TEX}tAD^m4c@+cDflF(EpDuL}&o*}-d|AoD9m7zo`bz(@NI zxz36HHpU-S+nBa0hSd1DdDFnYM)b6yjv3&i@OrqpjW~z|LRoc1LQ>+Gl;qi2sf(5^ zO)bPln?qI%qf*1RIJ}cqlAkUN z1Y}Du&W{`~UMTYFktf8?60&?4UMu}>qgOAyk4_fgmyi`1`77qx*HRf{B;YK$u1fhA(2(Vy1 z9f!HVZc14^e}(_paZIKSqNK9>M5wp_^poe#VVush&piFyl^0Qba`oz)*RH*D{rU$V zef;6A&p!VA_AO=~>At^x`z@k&NL~E&!_S1V?{LExUw-w;t=q@iKTSv=0XS~_drLA` z}6G1i$e)*@Uuydn}+ z^&(7!Y=c4#U1$?HGFqveJK@;e@qrk4`lcsr#(l_mh-@#j57KWd)E|suf7;DPm3`|; z`b87|7<`c}xxEzZi$b~II)iSD+XCI^!HT0!a(gM=K{e+zNdUdZNcCcR{03w>bo!}U zolB>;F!)ShALN~pwkYZ|n2kooY*Nfdt7Mc7I!TYtwg>OK?>FT0f_;B_2<*e)QdRef z$$eO&NT-cA>L*IZxnQ5oypHrdO>l&(E2yV-bckFBvyXBe+#f~`DH-EWuuM3)toXpb zdNLW?28Zl%SpshBF{im15M=g=I+fuqyV4^HTqysbvJbBd)d?90hnLpbpveftK08Lv zNE;j~{?XRQ(po9B@7~a6E9N;z(R#{FE8f7Ultb%sX+NugpsyX?MfruDjI3^3zw| zV|WI-C1b?xX)E*Zv0psut|!64zdQg>c#qw4%sux;ejRz(J*V-jFZ9bBe|gJ@=N$Qo z-Fw=RbBOHl1H;q?Hw$uBuGv8O8Ih6y1^c{M%A?~%7TBko>adjZ5EoJ3Ms3o9yG0>_UBI*%PgVav(h zlc$CTht8kBh<==Bo_p~{fbXyGy#3~T@4a*521MUYW*>APf_;#Fw^60??KfY2`^^{M ze0A%~FFyYKvuhvTc(;(vb3*dKtugv3whFIbb2QMhOC69a?2Z(e=- z#)mgVihaURPZ+?w^w5%^i)uSB*%d=@?jrz$5 zB3h&ZW*_3XnBhYy4l%_*p_U0M-{T~&$n#Q)LzL{Xx2XERVekpcK*0j!%}(pFDG8zE zF@00UbdQbqPE6`Ziu1axAR}sGXz&3w!*Ls&$eB>|Fp_%>;}7Z&92D$R<9$SDB*L-4 z`$kAVyR^=3TH}z`Du!aKKG$N%`)|#Yb z8_h1o0IPf0$Me?0YtlO`M`3o$5k3-AP9cI|yfP6jp^a665Kh6e*>h~tj6J*S186>J zZ$EaT^LVJcyYE#0;F+N_PhGh5^yTNCd*zKcU%mR)8`rMAb^ZFan>RoB_~Q>hz4g&& zpF{e6^2HaQ-nsMXoi9GQbNl+IAHVtjwO6jbdGYcyXw?p#9%wxlY&#Z2K5hR2@3`@w z0e>+uUrd>rm6}#kUQyP6`qbc)r=NZ9^6PKE@!>}we)G4l0YQ|!z~}w?+dE%=bNlv} zw{Cs@(T$s^AbjVox8HpIjaOfI3G;oPzV!4(#$SKWNpuCF=&vi-8Z2FfI+6)abDG<- z1uKLg=Zmq`6xk&99hw-^vS`YQ`4ih`jrXUFZ=Er|ZO+8wlN0N$`W>io;VM5A`fWq4 zpIN)b9I1BJqS|?bF?zib%8sO8#Q8<|j~aVe(=Kt`woiY zA%_V;)m28rTzA64xeKy3mzHiW-L$@>BxlK@c{5XHCQqI^Y5at7Nn^((jvk#56X&wq ztri(;m1`gVNkR5#CcNgh22}iADtdTka8V~KDm}wEW*-72&@{3eRHPI_o9xNNXOtq^)E;L zsB)#P1-%Q0%MZKb+*4*vM@TCbel9M>kyqw_*Zq+k5&QR?_Ad|k)x++2)c@DN{`xtr zgo{nOuV~HMNL>!qDykAN{3k=M<3!ie?9~#nuM`s=Z5Co5_w&+RTMh@4=;I1!l6yow zG6o;94~h>B_Kz#(eY6~!snlZ3jgC%OR-tTTAL<5_7f*gU>ew|Q~gh(i1{LF zTAoLs@2$7qc=uh1KEXaz^g;Roe>Xq-?4!>Wyg;7n>VdmyS8N2s@%L)iHYw5e{T2S`0-2DtXaMP@%;x69YhIH@2S40FF*6z zo3Eq3@79-}-}&~=oo~Ll1Ks!KXP@5wh#+!eA<<%FSd+wQME?;`; z;(7G_p6aJY$?j113FK$|!5PU5W&MO0%PKcT%#q1KypQHWqxgBz)UJh7I_FI~K6_$d z=7hks@t&#U8z#6bnSDEeKPKQdS%>*9#6B~3dPvMZ6SME`g^iH&6(xS?>Mi0X-}Shz zV-&BOq+b)*$Fqc4_fZ;sk5dBsO0>EubLK8D-MVedmeQ?THkWQ(zdSE<@%%ZD%}kjw zb?T&XW5*!?l^CB8?~Xyf!(zfTt4AOHGlp4(+4rZ1u|(wv_F*Y=qZY+|+A&7`RLQW& zYAQm)l$)HHeFy+kS)UlCNBHBm4XR8A^Hs&7AmeT` zZM0Eb4_R;+@JH&;W?Z8fmn){V+}DAc2Fi7C{UGO>8Fom#kd0&?*6NkESeSj#eJF!t z_EBR786^#QK}9Th7VsUaIOK|RO`4g)>|@dQ-<5YG!SqYCjl388zdYdAx%1!Q&4PW! zxyU{f`_LAHauyU(a#^4HMa5rN=w@l_=+4Yqt<@(xl&yA}U5ZM82>XCPHnqJMX%GlQ zP>&2zf9mv7*|#4{wo(GkxXz%TF?C8#MMZ1i*s)_^AG}8lXh91Frm37AI(O;fb1yvq z;;XN|`sN$2lf!%Mtq(qU_rnk0yLl7%yYcC#H$M5~{hJ?NednEv&p+35_Q{6h#}3t2 zK3;xg*Uo)K#cK-+a??^%=ggixBPC^8a`Kc(lSe0{fqhQrZMS>g+y#&27v!#7RkCfz zw!=q{pj9!{bK=sai+_Fnt#>}Y{_*Www~_An^0QAq|M;U%KZNvq_Zryu+FxHow$dz3^B>f7S5_%S0}otyPZIPb=)L#edxGA3@4fe)@=AH7Qt6ddnPs!f zboX@6>~8FA%+B=A&dkQ_AK3SN7oe1;HY%da#6&3LO9V(!APE7_J?1^{f#e0Q2hcp< zz61L)GT}ZxI_~QkGF#$}$}}TaZy>!3Ebqw;9|v}DMi?VWN3j@3Egn&e25^+ZUJm*` zgnk%q!)z}dC;Q%*a%%+pB<}SR68fXg*+s8h+Y|9G6{I-qfZ!iM5II()1L@V!oWp(vyryj3bnFc}h} z!V^~JRxsYcgO7hl@e`vYRNmVdogUMf^?{N0lv2cf|I@I~MYp0i8TZHF?^|EpcY_T4jrd8`V%gi)kO`Wx&A4 z`n;eX4lPT>u2@V0IaL?(CeF&39dh4%LL$-VufU1HzS$tlLyE|KrvyZ_#M zj~+dH`QZnU7Ju=@7eD*zt6x#*hZ5eee)rq2fA_n;`|WSP{>^WH_3K~#;^$vId+|PU z+quO>M0uqZ6{S^GIk`EJ;o+e{LB8Hz3VEVfq?bx$uwoa9v|yi3_unP55WhhG&@g*! zLVR*+T1k1CqorwRd~AJt@7BWyFTeQgtDk-O_3wW3_y6>JNS*)jpa1^%|M;7)fBOrJ zyCLm;1-k>ZU*3QA^zoxd4@mHb&=2^drtiUFX-S<)lVVa;88}n`X$J^nA6r@?MfwS4 zAJ{iaM>L`m4RXR>1x7oZ?1QH%W1oN~e4Qh1?yuP=b;o=gKigX)cB>K-`*2`t05{WG z*z23sn?|rtx$0yewr|t^yg_W3!-`?VeF8z4h6^8`UhV8??`Ui3XmQk5l$8`_B_}2( z#>D!0S$(Z$e{ZY5m&M1VH)@qK6!WgX3&&Do-{1V;Z=mnHGHnL?m~kmA5RmhFNoYeG zTuUop_DKqF%Jxy^y;mM3`8*JgmEN`PCm(0oue^dkn0l_{esxaI}dpWTF zYTAfpk{GLCW-YwaA6xc@y()-ovE>gtL($X0Q*)hGv5EvEuKUdCs#hO2cJAbi=?~nOm zu72{XJH)<9C~We|>ucU*A7)fY*~cQOV-8T2{X zhc))J$sX)O=m&pO{@}ep^*#*qLvo>!v`Yl>p+R}OFpD?%|Yh-ujyH*Va5eD3c3 zC(mCH`#$;ffeiHUM4S#w~vpnzkgs* zV0>aic3xgpU2V_M&;iq4``t@&r@%w-Kn}7J{-~aX>zW)06zxc)1Kl}14 zkoeQjKK=0H4CH$BxPcC^kK#T~Qi**7(BaL_ZFY6GceS^4v^F-? zR#rkPn~{=|oRFEGTArIzo}C%v?;Bt-n)FH)y1xRCAO6kX68nDi&O0!1aW;9erh~+N zu)0Ui%ZWU#*wDs_)78>Sti^;|KVu(_vawW@&vyBskKa;6hJDC?0U(8BM$XQg?4yP$ zz$Y2SMN%up=2QG8*i?z;ETx?IBeq-|6XUdVk5?dTpra<(1Cf-R68=a8<6<9W(3GO0 zjEImB@g}|03Li! z_A%RV-T{av+gK+ANiq0{ufzcX8T&9JgtfNfQn4_&t7Cp||6reDzGI5|&d(7;!5#6@ zLn!H9zWC^)m&Cr$Kl{lSpMUiwe?I%_%TIsyM53{}Q4Ger>A032#G~(ul(63s=@FzqJ=uxXvj+!)^M)ih4 ziB|85PQJuOys&y3Q6~iC9U57+P!uK<*;bbKdOF*?J6bwh8(M0ss>@4?3JOwEl7@!* zfBuWF)|O_2z0G0XUS0;Rj)ThO+TZ-`4~c!(2z)Mq3u7O@sYBqQhGR3f6saT`8d;T2 z-br?hBpc@0N8n?XJ}3KF#)|S8FhQad!XG2x8|(wT5cExHXb`#w?4zxcV4q^as97^= zpmYKIuw!?Uwn0lr6c1FWjKW$>>nPT9K*4NIWxX@|Gmc#p1uD*v@IXK{P+_HTt0sFIUM>v z#`(z?AN}Nu7oUCd3yla1vWK8huTrawdY##zHyQE_ zhMRi*KOxW6>Ho!G{HevO+3IaYI}`s|!AG;%*W1U>#}@4G9~K&#l966sQQiro)cI*t zX71d*`QqjCpM3QSqitXR-7mgGuj9*CpTGL#Q?T#D7au%*`sm?5C%1Z?dlo;7g9VgjVTz>>_Z=o8Mqx zgUlU=XCGhts};M|hzNg(`(W#WjyblPY?##KN3EBw=%4~7y)8s+m>q=oHQ3iE6h(?f zKI^MTJ)Ipr9WC9hj`oI{`ik<(;_aak}KVB>uK+K=CP zhp~@=4_k`ZYD&J|M_Y;@?&H}Psgz`DWHoH7F>+p~g#lmYqcR*-;z$C@RG>@~K%$e^ zV;+3T4>_-vWxHC*q(IILIBV95Zj1OqrxIQqQ#>M5t?q0F?T_3%1Jw<;##SshLbhPiG2>W zq(x0>FE+8kt$?>IrCmkDK{nSxx6VN~R4VZswadjxR%=p_Z{qSa^nLI%VO}hZeGGs6 zK<@hJ2m;c+i?=KkJewTevcc+yX6jhYKL5GEVf_x;U1Kc(X_R9vVoTdLcgPv zBbd=+e)rBj__aKH_WZ@mmmhri(aVoMe)%z`**=C$@8xHoKKtS*dB6DXEz$Y3xpNdQwVyQgTW{ zLR3t&9l3E(0NCg4?d#?Rl`F4_OKsaB_2>A^A+|2e{x~BOxPvCjEA62Bxn(_(2pGb+#4DAocKcw$hSVk zZnYvFf3UIga41D1X4SSuvuorw4e|}0Y*kCM4~Rt|wSj?PH>S2kqG*xWwzhuU+uhUC z)!yCK)Ye#AkAaucvdZ$Zgw&MfjTMaabu~5kSuNgRpPUn1b9?7UKcct~*kk{FlYJy? zR*40Ea#0kfb1>8af-pxzYCgab4>_-ENiMF9&Vvgk(}I#Nl-K25jrX$AGz$8(l5w@T z75F1PB<-%pzPmo1Vo0wX!*)?7AmXnoi2J&6aCxEEoGUwK0Oj#Vai3F^=ZyH~!9Hp< zOQ!Mc)3OdR%w0QlO6+{@`u@8I4!9Lp4MxK3CF+}c6V<*ld zhZGTHgdIbNSeR_HCi(j$E=;YE=^ctk zmp^&b^Y#J1mwlLN$t^FY!E0BI4;mL%>_gm#SdhZOO4mV-MNbEa1IJrDJy9sT}!$*WZ zup}a6YCL+=v;OApi ztCVJo-rL6#9~YgHoRpcGl9`qo9uX245a@>&nYWLZH$pzI(6G>?)a0zp^lbc}o*5q( z6&`92Mup4fgWK3h;4iJNsyZl({dG$Oonk?|2>7EJk7gK}!p~Xe!k?7ozhECpUS6}W24?p%!LU`c zV^!~(xNW^+Q!885NSBz91JWY6VM9>aC>FZB4CUUrl8-LcfZ# z%&hd9>ZY$t#JIvwn$Ji(Imy6<+66{rJ zqU)O+-;$qbA^frSDr zn98V5;W*ewig}s1Qvok*JjHLakFsWBA8Q=DS|5ZwWV$VHd3sbx1vM%R^C~gA z+aecYE~SIn=T>o&Mx~^cr7F12BlJUJ%aUJysDtVIG|tHrun#muyQV|nnPT%w4X`E6 zO|D>+7nq|i#})Wo>>HdILQ&c;JlI+9d&|B*e*pMh_GMu9uA-<2?4$galzq&yi*B7N zKN|C0KfS!9dY>>@uWVuBDkuAZKOTI1^NqPzy7>25M!9Eymo!`1Ry>WJg(C_r{`1Gcq zB~>d=hsi5%;z=D|EDI;_VUB=k2zw_SgKRv|xbCf9q|lGCPfF}V=tm=NFn5u9G)q02 zWbTB&EAT<=B6h<;&Wm;jgnp3w)k_3}R?V(OwQExDfPEU-D#iWt3hERcgYV!ccf zCz1Fqtn797ba$fH3xRWELqlzKO;vd{8onh($(iY>FnspYpV+Jxo7w2C(_(e`wI4g# z2kKpck9RQ;zyU@iP)mh@5Va}Et=>U(4PxI2nlGGmjB`eRL_pFZ(`$v-f)f5{B!dcn z$QH?b6kaSk__z@JX23p;s6``g(GmN4$?8Yirjd8kQY*Ti@LK{%IVFKOh_*oCDdyuo zSI*0(I9!50hCdP&^5EldfvPcqdzs*RmdGPl;*l?QFOqmvpfQB>1mNQ&*li5%)^HzCnI|_JFtS`-=sn-^;#?ilSo1J{rOy`)XGDbFz;a`E9KofqjJz%6V1IIu628 zdKvS1jEjAIp34T>Q0#kc+;YV}~F-0_W+A7f|`#dGh$?{d-u}v3q<7Z|FG_{+)9N=}H)Nl&RNEvzUitSTxlqtE8#W@l$-Wn^a~+)K+zPmQ*Rh6MP8hx)^C z$5B&R3KxmAn3yQLueZf!F~>*6l;q~OIhqFgdgmr5_II}-VSe)b;nNSE;5>Wrrs3xbGzwYl#3tz1R3MbHI$KpGo zdkGpw5`n{@9J5*0t$O@a9gv|CaLH;7l|(!y8|rwi=_Bex%dAPa z2d2+VtuQ-acq1|PZNMjKZG+(tX)pABm?ZSGzm5C;l%3rFe~f;YedOil6^~Qj!bmvE~M!@H*MYgfGqu8JwW3 zTp$sJI2@x}yNA06M|%gD=s3NAuJ7*sM^6y;fqjHOIJi7|{`~%vCs>+ye0jNXu)VUr zvakRap|RVNQ7g_oeghaTYOSNZef02VSau=Ze@8`F~dh>Hym2=%f0 z_X+x(Ja;<6HxbJB29GLsTR0&M<1maNpI#@dRysN|JfXoZ!Q*u{4n@*J$qyg0i! zAMC?|iU6G~i`a)Zjw|6spBILDp?46Df z&vtm(OFUX6?oASR2d{7z^Wa0=$B($ZW*_3d0gGk_2ke9Ix|-OBH$K=0M1XyrY8m8f z@tiVZdSSDtw-;ewdrNC`Lw$Ws72-ayud1RfJ~6SnzV6d6Uo|x~TD2N)l^O;IaBsO{ zAHe5^NnR2*Q=&K{*e5#dK_A@5Uh~W1^9Ea z58)WK4iNgGIZLuWa@La!Qx#JTV^O#d_9~_Au!BeC(iQhn=*OZztOe*$Nds1bRb^a>0W)$RueekeCy$_gUScZ*xMlm>T=-+tN3;P(+RaJo+}(l$L$mhJ?;YPbr$urnr+4mRJMIIp@5%em z`STcUjVDjAh!VN>-q9hfVHZ~y21ff^J6noi#h9Mz<7?y8YBXzOk`vN1QVU9pic5>i zON*h_Ey~Z$&&lmJ8&BW0kPKOmOVICA`CDn8ujGd4mSbF)UdIKm${6jCOk43R%m^r z1lwz|!4Vrg(C)zMqHa!r0~h;Fn(zhtJcxZ__a?DBgnl&D%MO8$KYX7TxA?rwa}eM& zYjzFFEsbK0u@55*U>`KUaE@rhU_K{HQpiI`XEyrAhH12;wY7=myj7KDc-|_@OViTQ zvT|}i`uLNnsWC6T&ev-6K*syScX;*@_z?8*aUaBe6!%fitEEjH;slP^hk75TUx|H6 z%6W->eCCTE1?h`Sfc^< zp_KvlVOp+_nZ#gJ1w10jIJH3}U1~9;+b~H*bVhr7$w$uxKHk3oA2MSrn&;(#Wl${o zsMk!2MV)L6|40_~oR4wA+c0C*Pnk8Ndaegz9fhb|Bkk5fUrmZa!W=)t>(ca*ijeQ3 zyk?)YODWFwGh~POC2zt4nT*f@KK?l4J`fPCkCo*)KfL(fvhUAd=DP|8zZLh9qYO;3 z%JT~=ODN>SA=5rqr~vrbd4qk8FhPQP1B;lMh}~JUW?efL2J)&G=Pi#v768)PaulZV zZts_gss(~nPtU-Tvd$ZKo}AwVFD_wB|KQQ1$Isy1@)Xp2{Osw&r%&#q%y;|7$=NBq zFqT%~Jw4Oa-%(mwf(l(|us^KTEnepM)a3O1oPx6AlJb&@%5ogUFS~0SC#Og6J$VGT z0eE6z$t3JX?_Qo`eezgeUtw`}ZblmHTnh^`aT^^GjBZF~YBFTLHC1J~dFjY}gMEC` z5)zAZ@|)@#+B;iUHW&8~cW>T2xpV*Ky@$8&KDc@N{*7BW_jvH#1P_1uvoGN9QeE99 z76i&g86@^Vt&=?4$5gbQdjw)K03kl+p;+5f zf_)N?HZ0-*`$X;zk$WQ&ThTZ0M>#Jm`4Ri1o&zTJwn@EbP+~>;8ggDH<3$S|Ai^9W zw%^q&(iPfhOcI3KwO#B=j<^_G|V5TWWESRx+lQ zOrS%;oTZH@G3Q5vvo_#J+3sbkSaS<2$@U1(=?kR!RtPr30^|=*n!nlg{HrCg0)^Q8_ z_pSAX<#~T-tL#B<>wQ;j`g7m;e)g5+mseLi!AGiQ$Xxi=JmHTtE+S1XKot>uEa59+;6ZrZ0xnmUi~Ewbqr#M+FDlydnbpa?{f*E6N+2>qZxbRyG%oj`wcdI=OZC z^wzzzoA=Id-o3bam-eLJxqthMufAB>*ouzLR7iq3IJZk7I79Ir`ZItJ`)Nl>Maz!2 zbt5w1I6C+^BH$=C>@+g)FvNEgS_`GH2kb-Wrx0{8_H{7!wTj%Cm%WpHeDsI7kBsc! zU|*xev)`nI#^uPY+B0xlTKO9FI;bLn(K47Y^>T8sFIB-sq232UcxOj*OLJp=T@8N0 zwyw^Sl9IgK?4qKAsMx5J3+%Aov3Z*Ue7%J4Ui&exad{o|xm~djIj@qj4{r5wN@+3J zcjaJ%bs4Pb0LpsA1|gMnIRmcY4nZE z^oMlPLA?Uo2C%gQyYh;q9>o&(BC%VMR8WigY8cEyS-Yxy*k}hEcS9Ql zZI%wXM{0m2Bg{8pa{(*HXqgX>JWy|q&g$y=D(Zdn%X9vS`$7ZXvhUB0ysO9m7W?2B z#?N(B)zt9pgT&9drjoVhA#+A`0_`bcUqOS12YMa7Iwcg#QyRrIB!29mSx4GccBaVg z%$f7@K_A(=P`8)V9)p~?Ln>?(c@_&j^97y}o}Rw>CC#@VP`LNxIgF8?JbwBF$uGh{ zB)mt52e@!9&d-jGjCAz1*EUq=m*m;QgOw_UR;x}+OD!)gsjsPnIHRtnW^Q`=41={N zn6EfEJ~^0}9L+1p9~mDjC@83HbYNQL6dGz5{`!Wxi_7zi%koMqi*gInEf!O7a6ng2 z+kAgVc~MqkT(GarD1peEn-n_KlFa zK;uG63{<)>V}s?|{hYi(E>BZ(G4l&MQ)A=3ZOt9cjkPt^i2Jab4)4c|)a0i6x~SM_ z^tq0YcKv0*+2y!-ASU>|lF!L42`66mC&aJeK|DJ@aUvGoFr2ym6dFOR&Hwo|Gk zWHW^!Ha3ffIE#*nn+-5-1zC1Oy!HbuJ66pyc07KEea&DWrM*(LaZxA6R*jxF*+=z0 zn2$<&HIiYlPfx=hNKR?2jZO8wh9Id=oH}Zzvc{Hl@qkPS4UxmB8aJwtl60cBsFbv8 zWSF9Zni{sIsPTbi$dM^cX3r+5hb=|4q>Vp31d#%x_J=@HC!f*DJJga4KYdz=f8zSm zGPVG%udS}(tiL|El0*11w>;w)68JXmy8_c+;Ldm1N5<4;`G}mT$3eRUKnYsENwYU} zs7bZ4xq5cYO%Z$s$J_*SpNvq$dPE%WS>dUQ%WI=;z1 zmic;6=1X3FZneVeHNxv?^&$WS9Q({_uU`xD6<{AUMH%Ty4b>I#iLsLt!zd5L#l#pi8oAKp`ZZ^t*IDnQUI*p8Jo{8U z`>>tT#XiV5uh>W6Q%R;ULE&VdbXG5;W0KDz^Y_)S+I~+QpWSS3`4qzkFRov%dA5TDPbTIb4#vc}?E5##n z5eAH!bgfK^@%+VY!~`;Tf8cPSU~p}2VXk+u*U{!E z#EPYyw9K4Lu~e$oYLZe@TH2c$9gTJM^^T^d;}hCsJ~BF*mYSZHmeJJGwYIf;aDKM5 zu|B)9JhQmi**lP(gOXO!U~eA+!;{nF18>wU<4aZLIZZ}Ucg_fC*)H`ultV%xz{;ms)Mm3#KcUb7Ez zU#r-e^8$R>UPSn#zK2`A$gNI9>|+P_-Fr+L^!4?Y^7kdTzm75dE@74tU3W{CGe zgx^Vs*PfSl(WoR76v7`3|4u0-6P&nLhF*t+f-fjQo#m4o z7X^h49&TV?w_Y_xao_i`k1Z`C;R_%Byape|eK5+!c*CGv)FKr)q=IItuuUfF!UbL? zEbwsmaWsxX-SY6+gF6rJoZdWv^CNa^4vdXB+M7edy8HrKlF}0~hvp#^`UeG-mXsjm ztEsQ8t*f1$p2k97*di<~ubiI3R^V)CYBDpoA<&*{_RBK)=9p|*5z!Snc})$DPH3G6 z2L}$}x_5p$IyG5USKZK3*VOKahz!$eRjr-PYrCtBZH?(^$y%i%F(Delz^r@>fn>zR z=SRnuMaERb##g0hR0FvalVf4_RJ9^Tqo~7s2VO^Pq@A@Z>5UA}Is|~o{Ez~p^iQ{# zM6d@Qg@>Glpwj2J7vf9o3$<;d^yHlGpqv+RAJzL%q0er6Qy=eQo5&p#2Yk@x^ zpd0M$yG`nKt7hNI*r%04+l+xL$UN{JM^y4b>V<(7Ok7}KB@=j> zB*JioI8#Zc&8^tO0@EilGLTFtB{0YX$Z&u^)@qQ>gqU{Y1J0uSP6Di(R_%gbHH{Hn zJ%`QTcC?=%ZFFD}1s+G~U91*`_iUk1NGp63<#KR!nh-{)TkuKq6fw{snT{s8cMb6(mlSDH_Ic&W2N87})bTE-;`XLWsPb$t~W@gAJSe-^}2Fir5q`+v);$!5A1Ud_Bv6(=9_T5^&o=6{IeA%dC74;5%FjvFs1$J#VW~-R(Qye@%Yni0 z?{vEVM{oE)EnY9|VHHU!xiN8>a%q5Ck*y`ymT{Eq5eJaMpP&N*68p#=n3^68e}Et+ zI+Qbkw%yQx!$9wCqjVG#t6I^ZhT0u{Ea63yw?pcIJ}=X_yxv((?8B5BDgN9VCD-dE z*XtPmK)?o(TPJ*6yflXv>UHdBA#;%}@$zOR2Fw5uc@ye=3T4E|>{{Q*P}#g6Dim`aV$X6dhk4#U;7`j9YdMBL1!P=PNMl_EM84$b#2+(81^f8T znY5^g>U~I)az5Jl7RLP!O@YMw`6XvEJJ!IKUS2mVJNqxQ|wD z68QM)-UeeIQEz#5ZD|E(ec=r3E2tBC1R2#mP`{JRMKKNhq18+64!+pu1Rsw-XU9XM zm0118R2+k$(wB_dUCnq9K!PA;7fjW88o+*25#Rv0?1w=rSjJAt}KT8Cew( zQ59@2;n}CwdMTBW*WFTOQfWj)bZ`Gac{L<0l`}Ilmzet4-5sBvcC@r^>>o4@41TYH zl}`5`b=F*aWMN)K<>1&D*mrbxHa$zq24y6Hn z=7u?8)~$y6?uGg61#?S!(V&($H9*8i%03(feN5ZzK~uf1gAuo8se6;u%^|(sz_U+G z1Vkj*Wl?QB1)p46@`I<_;NcDaAhoZeM>%%-RCrel96UHak2Zx7y+MC)M8j|A@ z3Q9{Zo<4f;^wGh=UPf9{R(3}3VE6IKepOLHklAFENr1m^u-QFdYAG*CFcMk>F zClrQC#in zy91#gYr=v`y_|c4mIgWckeP~zeT|4K(Uf3?KUm=MB|qe??RaL@62?9ZmQyDeF($Ks zc3Swsw2D78%Ekw4B+aADcTD10Y}!0v}@^Di`y_zQQ_@XRt}#YfzF*m0lGtjSG99 zGnoqsT=-zn8301(92b5&D)bZ$KuqNwpj(GF(93v^6T^;=sh=@xhPhv=+bfHkwIr+ z{)dD=ZaLilMyTI8n|vpwcV7AjK9)5Yq*HT)S{%&7Svm}3=TM*R1lvKldD9{ufx3k{ zyw0HSHT&39FQXof_cqJin`AEbG5le+w^8cZZ&qzuHHRkku7=xEDb|#zP0>p32@bIl z?T2ax`_!h?zJck%!Lgp!rp{(ZQcP@aVZp}X-tNKP{{CJ@MruZOW>(@@AE& zolQ!Eebi89;CszJ*8s1ReNH!1>f0hV#P_0xuUv%f$kl@D`R>=Vg`PQbNs&@stxftM*^_u}n$ z{4BdZ`YEw{j@6LUfpW{HUo4=XLsZ)~hBE^EYR^!opN?OLcplBwn3 zel!*vb~7jbNkZ_=FzbG7;AKM4&B%aDys34{xxBO&zE|v%4EtL*f^1tMzS|+bJ5d4q zDIq6mVQ2pOdHB~~v5$}Y*gP*rdfxyaSsQ?TjeOkaVqb$C8W&>U5#-HUsJWyXjqrg2NxPQw~Xu8L#|!3 zUi-1h-7Q2dD`lB48oonnaWB}1@2H`9VQ0OMkNen0q}S#JZ-CFqKIWi>?h1<2=uE*( zu}&xYnw^qqCjUR!=g=(vZsv> zjgUZWV;#yqRQ+%^pzNc_0!1Y#X4f&-;b(uV@B1s}ytJhk3(ND%3s*N*R#|6**tf>m zx4N{ly12Z$u)I2da&cB#+5+|&lx+xeNZ-eTKEMvLKD0PkmxIY%@Y2O$5Jc32vPpdS z%~<=TJ#a79ej^s_3%L;$bR#DCCL+Fs(EADYyZ+`qn|@v*$dgGU3dR^x zB4XO|i|PwYD@rQL^78Yw#&|r4R`)NV5d~WZhYy}UJ3hNOK0QA^Ik($m0(=AdItDY- zvcW!V<9zSwl;t zqeCvUV;*NkKgbNfml|>#CoS|&T+oehzl*$-XTFwIr(3;r)X%ye?6(!@vk~aC8RWeg zXj$_!tys8WP6RsxR_yy`+RF&YhVe zVjs(Su^JTqOwCHfed^@V2{OBGZEJ*+L3DI@etypM#N^!M?k;t|{KVrf|FNqmdVD6)60n?}2Q$Q!T*?80e?KK9({&XE}f>mvM`8MG@&;a9lwj z#h6!zE#*K32QqBb5F4?yNG*qHGt6U~jjow$}Yg-{)fAcXm|1nXJ9N|0j6{z7zLhUkBC|6(H_gUPnuQ z1=35ZPT;IAudXbutSm0CEG(_gADy3;mbE~Or&mE0fc3ks+!o-I@`8L!CDHw>gJM6i zPcfAkelyyB8WwyI6M7ySdKnXZ85MXL<$oC;ay!v}KQa7Xpk>e3uqYQ4%B7L{`BYpp zn*LpIaBOUBMr~yo1I_>IWlj$Y^u;W_My)O@EnAwMFDoyDvJZnFC&z~`o;^j$@9^+2 z6D6zcTyNVydikCPM>a;sXGg{5+WcCy+F#;v)Y=!>1r^xS*xx^Vc#MuP_H3MiefHqE z!TzbNv@Da=x_fl^-m}O3gS{r5E-WZOuO}884G(SJiT?iZy2`d#p0gk6%XfZkP)Kvs ziarfD5gmRzEADY-rdDCuF+V+C$C(_ArEjOd#_zn>o5unu!s)U>vc7_dTZou(Tqv-MU$b9!*?|0wj za0H(IYIy;e$a}hQsP|Fm$Ft8B_c6vXS}_7r$c6*hy%s!Q4Sw+cR7l3bM7?6!f?b~^ zQG|a?6ZUT~_gA=YfqhU2;$i~)y=EVUe$??ml@|to$lSX*X_j8i;y$pCz{j(X;g8}z z(#`U5AF(ggrEz)7zCVBR`(5^tzOTF>v%G-Gks!td_2{gwF0ZUCFGHfavbeOeKYI^PTlo<;`#AAPWY7&S{W2#W2=dwruxz0D z6JTEVH?KO`M%S{QzgF7PTT%qlz7$*ccugZf*zr8bVQ)%FFES@9ypHnwglWsVvVg zD5$He*xp=3+-EZ=byBHL%IbaYWZ!}d4-5LJ(IIqq2m3gIP%DO)fh0{Ot5VAwH41o4 zxwOqB@Ifw#N*^Tx3?EQG;j%et4>$@7JP8jxvHKnQ7_m_p?Bm5KJp0BuQKv%KsKz1= z7{DreM4mbB*Mr@z`?tJ7|N}e1Ynu;q5*tf~Ek4?6*oR`>#&m!k_vhVG_jz2&3_^|Oi>?3V+ z2H00tfG`i|4fd^oeLVh_Ru&J>&q^y>-Q0Qh;mYk~A4_;?9?5wa^*}&;$k;cD{R)ZU zH{$FU1_eAj2Tj~`m}T80AD6jxcyUX?)}z>Ju=2c ztN)ijp^53Kw$AqO=-BX> zxQ8FTxc~kmM`xoFCads9HUE1&n#FWrH2xEQB$Mes1qOarRyv#-o2Zrgn7J}D*Jt8J zBLmJ*=`$&p4cwf+Y1?YpB#ne(O0S&FOn&NRLaze@9%Gz%G&1PI+qek!g?sM@8P;Ik z9ObhgWQL0$Jghop%)pBI_g&c;I3<2CbYXs0jnKG|yqTz1!%l z-&mb*sjKieavF&c+uEq!=VBiShy#HO*e4~}iD7nt4!Tq0!n2QJG3rhLf@EgJJ_*>pW*_{rz&{W+sW7`%hoAV zVnS19hevnT`K|_y^j=N%^1TlH!CUtINix|#{z1OWJ{0?S_ARmr95!r?`A$CcTUlMf zSzcLPJ~%rqt7-%Lw5kpbhB}snaxKbMGdF7DCX9+H1Drt=(>evZ zKvd`?*Gu`NLARn-%)rxxW;|r$k%4EC0jCjuhtd8gVP2cT=GFM%Q-9MU^*RJtSHyxo z#C@-=T%1AQYxc3x4&n7WmhjdJ-I~P6c{S)6oEkM}IwjO{>#%a6aD@CcQLq}sz7Dl4 z!(d7q9$W7j8fy#g_D-5<(%kXG65VjnNb zLXnrRqVR=gdQl<8VfaG>ga$llOD{89!{ntJ>IG_Owt;<+xu6Z`ty}WZ&8roqDplOj z@cPB=yL%^FQ*$d`UjGr$vDsF6koo)Nrlllkm1=>9M@T?$ZB1=wPghG@b9-kSS>GS* z!e*+Xwz8wQ`__Y-{9n0tT`Lj?OJwm9S%TS`o0!yDP`C-p&gS;^?fsqYqy6opgUM;s z`X|PRhs%qKgF`~+mKHww^z*&-wY>W4vKR>9BZGr+t8NL?Tu}ihu|cOX zL8r07XYnCtKH3FX2=nZ727R!tciLDH`&h)s8#vSAN;n$OSR1)Fqu0?bcJDL5v{`d( zP@ibI4X{rO_EA|M>_h7nnh=Ltnqf4j4UMk#3=Lo$u)V7}CMql}!d_NW;b^F9Z*Hoo zEX&ADhqueZ+;m-KS!7@!#&t!WY_5aFeNOfJiT--w=y(x)iPbJv5z%P4q;*T=lMK;n)?4w=>bzt(%s+9Q96tM4L zeGT~AeuI5v zV|+8tZZAGRzjJ!UW?{=LmTY%) zwNFot?H}$O9PREMZNt54|9FT0E8o41je}*@z2_f%h+QPGIoR6UnVOoO7$0wIZjA{K zkBN+W^7QeG7fZ7~H}{DV~r%rKC@RKCh5@)_XF~dM0mX z7JhHA&!bVwmiCgH3sH}b#Jxx2-mg_{8@11e?w<@CvnDhS8Ef zG`ik9G|<}7)Ya7<9~m7Q8k~`n)!fwB*6gUNEK5yGsj01+ot~^JEVBFgDMWCwdY9rp zmg*wtqqxt-KCy>~Lf~l;^X!up!{=R1-lfi*_sYBv>~kf*#6G+Ah+QA>TA}C2X4#Im z-=g9%>zZMnm$7d^A#P^u!|KRhfqRWqSc|z`mg-W_2azNzpbjDELy*W!v7PL@+WN)_ zNM6u%BsgFqZ7XNm7ixVV%OPPu68|7ikj4->7y-?YDE;%kFc>xvW_0`?=)tz;`ok-vU`4|iO82h$1d_#hK zuj0P9Gi`tV0Ps8PE1+ISS$=v+9<5c`Sl@z`0r75i3;wcn)^WBs)^@gb>T5ehLTFst zk<+1S4CyR;toGKXmZpZP@{**K#Oj)giSe<@ zg1jJ`k3uYTdYAHD4&JxVJXW0s|j1h3OEV{V1^Sb*+Thry#c<2ZBDb9z@*dQ708)Q#jng5Z^J4I0}4Z35(FL zAJHG4TxOet$PtM%85S@CQmX4>-xc_v&O@&jT?_g$j`mwZm;&Sb7L~YNCmqqtm&mJ% z^@UlX5PT%|xsqt6aAt!dN*P9H(D%T0N)qTWH#hi36zLQxvB4?xLt}f4eQ@!6gMF)% zT;Ywiz3CSm^mbpzpCq9BBOl}svad9ccJjhxn_5uBJBB>mlA9l_t#-He8fq|g5Mt)q zO*H1n3Mou8z{h27299Y507ybT65w~y{y|P?=~o)){1JV z?YlTT#U$z32@G8Jp|XakaBg98YIbyDYG{0NU}U_zZ=k)bx=1RMxCuS=7L%i+xvRIU ztEU5nzoo^6i_m`Bg@(ZRzOScyV4!zk5T~bqpbNJ{ z!$9Z|g3X258Ao-CQ5|dG;tgE6LD9?D2mHOsKFswK_;~g)E5iv)LmM@7!QN|;0Y`Bm zr_p}m@fbAd z4v2l~BMrB$k#DGF%eXSJeJL1zh1Us|j-~5NDdRJnR1$4-^mMh>mgh%=1(z1&^tCtF zRh3nh7bhgef_-BneHFP`0p3=HMEK4-f6K>xP9p=?K$`%4Uii2OJ*^UFV6Oe#cuu)6^J zAa4fyB*J=$s6i>FgqPMnktGHlR`ToTB#8UKK72=5pQ5lj%SmC`f|l`BnU9iR7W4sC zydMGBhp)l+!k#0tM};Q>%r-2_HH&J^q*~K)NMLDK>lYXkUr_O0W!2m>qsu#mUjrGF&3{`Ft>9rj&$ zSi#GHw3x&`7w^c%ls|BI+1jeDMlKd=Mu3B4#Z@z*UKuNL@pUd{;LKBxAP89~zqJyt zD{Q1ipI0mGR>P7~f=MLo{b*grqo+TEF1n1}1%*zjmhc3xCi)Xv_?Rylq8!40q_k}41+xHcZ zQ6Kyrq=GK7N2kc6L*#yizt`@~U?1U+g?<1Z4YaxU$UKJ4+C8iO)TBOQ!sa!VY?)4s;sE0yeK(2uDYfih|kDK z_qQ0Zis+pm{>}HZ&%;gR=`Im@TBL$7PL!mQlxn2y%vle`UHCT;_*`>lPWG`YAq2pH z1&7?kbWqC7zzDKkl#KvBvO;2qnusW* zBM#i&39EQP(qTGmzKGZd1R(BXJ7GrP)TEWPfqE)QlUiCWmxin5_N(GVmuc`;dwakEiFvW&W%sbj*QO?4Nvy=4RjReXKCb8wM=U9@+vDX z9v&JRgelcv|KQNT&cXiedt`rqc=K%YaBp*eXZL7-{}>g(Lp=1|2k(9H)mINc|M2MM z#nSrv?Baay@Nidue{51b*!lSJV^{!=jgBV8Cm3}4sPM3cy1Id`j-kHpAqKvI!R~(K zxr05!BmEPTBQrCT^Yb%{%NTlDDlMrn8X^^nNTs4kt>}h=O+#BcA-Vto$iSJ|Si#C+ zEWolG>3@c7*Uz-+tzBY;zY(<>s%GXsg=bB1pcLMe`sAOqoOX~3O>R|s+EB1A?H#asr5|dK8 zJ6c93#w*Kh@Hg<9eKf|*hjj@3oa`e4zGfdwc+tQG`$VlW4+na1 zdetn96)lD}lV-xC9y6*Ty{7L4$nt;p&2W#W9&P58uPY$+l?HqJmOKdk42M z!A6eFSL`FhdKddP06t=0er{?-UfSDw-(R8L$Fr{>vp9cymjXW|zPJVWcG#iNkBqIr zzRk+&cA+TLsBA}d4}wsqe2QwpILv;H8M=IzeW>@boR`?Ak-*lwi4*6DMRu!qG&Cw0 zCc*bRJluz+C_+92eY*(zV4k`@zq&lTFh4m%>>HiHvbCAv;j!MHw#Jm$NTpb;QpjVY zVp<%IVfNq9$l&Ps@cQP;t-E&~fAs#-PhLL#_`Ro}+<)=eqmN!a{@p+R>UaP4x37Ns z)$RLtch64dR#t$t(#nd8y4snAIoSW5pPf%nP1V-aSae1$#}#Fy545%n^>z*qb`P_N z58&$?pffbmH$F8oJv%c;Zg*6PscNJ?t4l8fc!nM~|43eq9agMk&pAKpP= z-?&jZ6Xd-YVmt6NLxMM|6b-XkH-L{8wy}Mcumb6pdcwE4Q{v9!?@Hbb%pvD>mi!PH ziQMXGsKdQoDjqXxcFp=DgXTcXZL4K#D(N!0mZ0EBR!`{jVm>v^Y)%~)1v!SWBrKi;%WmoAqk;nBP{fOH=C?i&F67%!aoqfs+)C)m zRP;L7`i^dmb6*ENxgacKAL2f2|LX_)(3YiW&N+ZV_I^D!^uvB$_PZeZW9k;x*mZ%A7q|d?{00w%gv36DINN}^ zj^MO`?*1*vn8~yXhj*`{oY%>|olPXXZ*$&%eJ145w!9eN$-uB+^CZLNc4Vb5{EiNt3&dg6v&VqeoIKa)+%;?la zUsqj4grASZU1&91;KI_{+=`LZVe~9ey&E5zU7TIr-`+mm-?`XX*`DtnYwsFt!LlJ3 zHDf2--s#E0>MCkpd8Nfk>FJ0qpMUVdl?bgPAt09Gxq+s5ZWIg0z zOw?lsZ&>R2V08(+OM-3tfwn!1dIgjCD$$TiG)NnZn0Y-dDd%nL-8&={`n6I;kIl4^ z(uLRunF|>>L*N4T3E){T9J82?&4wd`?of-FHrbk5y3F3NJo`|EYf;P7^oEpy;pM); zp|*}zoaUCMN-Vbn^(sqnn~JsVSt*$JXl{4d!-CXWxk4#W;j@tsHt0QtZAPpndO{8g_2~gvt+p3XKcchyF5D1r$zR;g9i%sK+0^gTek3 z#YaTu0BDC!+U~0x6S)_=Un}sqmM?J27rPgzWc4~VY*QUH(?+!$q&ZH*KIf)NQnygT z3-@NUdeQ4(4?Ccc6kw(;G9<0Pt8a%^-e8bpl@4Adym=q>I;h^~7Z!q(T$1xP?)&5U z^{@HL?`2~(8mb4zP-gCTG6`&h0D%XWp$fKWY;NMF{Z|5c=*>CZt>E^ zOOAn$v5z(JcnH$2UP=JTybnuYpwe#=c}Aqf*A9;^EiNxD(prO+Rn|yG?~7W?P#A8k ztgJ6#hWgWA8nm zI-S%xAV&fq0Rjw2-2g~{1V|$13=o+}jnIhQh(urj$>GdMnq5gNt#(#>H{I8_>Q-I9 zaQTg0eq)ziWmmcU5BU2$ztatnl5ctMwX`ohqo?sj-?eh!PctLkdo zhK64M{Ab_(^FMv{&CfTsHrm?Ta<5)>y4}EETXXZw#OT7z#8Pl_F*p&NAD@~T8Gk%7 zHuVU5GRGc|%rDNYKqDr+j(`_CP2jfzd<-M~J^pY8yHeR=6m zb2E-JlXfzaw{kKMpx~L4yzgM}k<&-)!xTf5eNb=am>2Am$ymG(V{P$d;Gp>u@Yidi zO2}+-;;TgOiP!ZEIxaNNt87Qvhq;bP%v{(NztdGRGq*K1iG1JS(9po(K!0xs{@zV( zt&J@$4gSh97?fOly4$b?)a6vH8ra9R4i0tCvJX2dX~xEE@W{q&^82JZ{L{iO<24#0 zR3zlH!V2M!_UAJDJaWh@hkUgAQTGA$_?HJTh=cI^Ea>k;bO83D3W3(;VNF7l&KTJ0 zR;Q^;UfftncK~4~YPCqT(W(^mA0Ry!!(Wtrv1A{)essOc7(U0_L(3K9pwXZ-7JuP^ z3spS#q|1i2aGk291@aGeV&5d+%u(khmF6h;_=IKa$pzp#FDdsb)0%YGN9+qsjZ7ei zgijH?KhiJ2BrnvfL~|eNh(}K{uY!HK-?8t%250}O@BM@9t8A*RZGJ#KE-+rqhP{+n zBFaYK6YOhk8@=|kqOTqPgUrO@jygY=xpu)t&$l~1O^1>9@H#awmwU#3j zLn9Nzqm$U$F&>0>3HEIwbdI1)pDIB|M~BeBd;aXr$v2vuX_L!cENjALPpWdTE#yGH zBm=VR#Jo;z-znHf?hgDu_(M~6wcDly9JZ3#`RzxeBabk~Hca^I z@9FGpZSH{ZS4%_r?eg;5{{B9E)qp|f1gG6jLI^Z7fx9g?@n;<`n@i$=seX);Hxj2WWs}Q{^ZeB8OVIxqX6I zaeXVi5!r;HVt@i`B(ebq4Q+i}+c;T|MAkMpS60`TL#vAfzSRXJ{#MtQ*2AGq)IhdZ zXM*E*ZU@{ByGyfXCZ|=E`a4_NA5Ttig`a%!>Ny%#zIgq5Xa5k03T|x7uWtl5HxA#t z`sR1P`1W7^5$@g>-~4=WW3795=yvVhwA`Ge)ReTWjG70v;}fHgACFHz9t$ncETg?9 zhyu&-@aVws$iSn~!SRVl*ygjmFu%5jLI>@m!Tnrk-!oK_Pu{%xg-yv+mc^U!1p%$Xwst(Q*LA! z|1d12CVY|N`@#neE9z|q{;;kn#=Z&cCby}TPG{L{aC;a7y!hXvVX$wYudBDSwW|#c zj`z#TZk84o4fM3N+^@;YN=|jTG>iH3pKz@s#y(2<3HHUCj0V+&-Q>i+e5<9>p>#Oa z2@FWk2r;#x%%i)9O)q-HT)($tUce5fr~i2T1EVlO=(woHE{yJq9hL9_?GmB}tmvIa zMMbcW_Wog{SHcoY^!=f(gv1=`CzR&n!CT?(odFibt#}ZBil-s$#qKEV6drM__@^3l zDTrv$rh|Q$eVWvcwjlU@2;ot!<2G^8;zzH>5(b-Y6>COmK_zc2LJkP}gEKa{)?@V- zUGYzijvpfpLhM6W0QMpN#j;oabRFy=j4HZzCA$DI?{~G1KT)aoEc>e3?pL)E`))VZ z)-={K@^tWleQZ(oJpua;+S>+o_F*i6wG0IQr~#feU9g!K!Yy3e~kcYmo?2a4?*&f_>}j%b2oQLBP8bTv-dQ zt}kqaLy_&Z$nM(4c4&5f46Dk0ZX0q_sgPOD%Bc(l+FDx2#zruN3@!U_u;ctUfAfpK z{o7yt-M7E````Wb-~ZiLKl|zNtLLHhH3-~S*W4|-ej_b2)9v-9Wo6!PdN>a11s{hf zw>TdP%`PrYPtT7$8ihIx4D)m356;g$MqeNn$Zf!B#Ud_Z-@%jPBUG88A$YL=LXpy- z<>A(bu~v-r-zWoy4;rx#-MA8*1Hzw;YP%?LM5`R+^r6s!%{-{{68p?F(>93F4tDx< z_L0-a;G@MI!texRDAo5S&G%)J`?Xhl;?efq>NeM-;P*kpYRaZ|YqH<%E1#Js_B|RQ z01l(t+uz;S-QL~Nit2e;aZ%aL!okkghMJ1}%+y4i4eF$yeDo33dEd(SVLf>qCJW65 zgJLqeET&AwT!@wI4y8TDK5oIIo<^Esj%qk#fYB-JOwohE7eZ|}YKTU$=V)Fwz^CmX z`7J2!TOMI;n@t+WTn7)SU@{zy@~HMA=Eb^u^yr~30m7bPACGWE73u*jlqP5-gJ*IH zfBfW0yQLp7uS-FuvIm_9P6e8MKps+!Eu`Wn0ltV<-eMmsmB#P~_6htE`%qW1DGwZK zdC^t><1xg%KpfQ#MHWf0kERF6@7uq2?Ml{n?EB-FcVn(%jC}+?W*?G$cfdZ(wCNrn zIejcLMml2@0zW~i_X*h7*)}L!uDY>-8a*5__HmU%=vnDo$tljFIaY!o2fPq%gQ5Z2 zdLct;lNv9?<&2DM?jN3jdLYQ^`r6w1+WI<5x@ebM4R5Z7!@{sya%E#9w7!lu7wklv zU0DsTt_3$Ymm`r-czb2<2+ad4%k!f>t&Mr#|-Sq5N15)=VzBgOQ;T`4!wz)XJkna4-YVi_mtSz-+@>) z(W^f2sDmDTm#h$}*YPL3Ka3<0`|z1%_EDyf8k^DJGATcKsB@yy#`2 zlphKCof@e+4=Bc!RL`4K@0(=Ds|4-9r|x;xEf4u6xaD9?<&;(FR^{^K)WGm)XaJ*t zNCTjy`_aI_Kra>?x3{#R+6(YimfRfZXsz>?Tun{zD9X9d&i(MiABr9qG0?_GW?x)9 zv`ZDE(P1{F$riBh4zrJB^$54@_t`A-s9Hdq0QiF{AMffVC1)ZaH@g5pf_*qL`v5)+ zz~RY=dExhhebB0cTL(qMHmkYI0sK*;zz9$3&0#A!wt2`Vqylk!L9$PG8=!q=7{i326~>`cT5d7DQs-?%{rJ;gzgw(OSoM`h9wC#RX5hvG+x`v(VyU2Q{(<%-wZ?;+_)plJfW*Eb#kdCcrMTZD+g~PHj}z2ApStZ;5tiZhgIdR9yV7lz%5w5*$0yhNhKEK* zhet<-9>MQJ(A(49+|*EWyXyYEyM3+AeJxFuHwyETeAvDF$&Ww&!TayO!@hVHtTzhw z8H`SoDP6K)MeiLu#k?e^EZE0R-#ofiNS6gGcX@SDbbSXp{cGC*dfrtOWgk~O&elD^zUN)-=p$qHS(kW8o9O9__4hIRsLkLMf8reVH)uDZux68I zuxrp{xS>b|>+8?=cAvxV3$3j}gDMoJrJbG7-v0Xj!N%U+>gr~2Xt?9f9e;XiqRZ~E+w4}WO|e-Ot5vmXn$?OWM~Z@j z>To)J9&c`DIyNzm5B0Byf?MlLPj-=k+}zw+3#~7seGiQ+BcrH!bPx1)fe(ZIJwro% z6BBUy<`$M0m)BNS!yD@mw%&tK$CJZj2;Dz@ee!aBdDk50b1S7jZNPg5e2C9nSf4Ei z-EuHD<>=PcFNuBR^ub89nZ^^y@1tZN0$vn4FxtUJEq3jB#?m#CB}_P1e+8w_iX zHvqmAC)oEo$@)A|dy=4T`_xUWltM!Ymmk2slB)%cV-stg{rw}OL!+Y*?i&~y?CbC8 zzF$|nys+>OfA`l%I~x!01pEbgmlHfv+=Y)m{P4Z+f1lZRNr<>mV>7Yul9Bdx#4GUz zyU~h z(<9QNVje*E3{N}vASdcj`YG&{`&_7U$iO0~imn~7FE-Ch`MxMsS#p)Sz3}5uU&h@Y zX~%~it-L6=e0KctOO!cqeUJ(H7VN#=7VO(S+`E1=KMRa(;2xLn*!QPmpC0gvm>0sO z^>x)c`!LiNtM;B{-|oS|)2_B*S-I-9^?R%kBU!;(L00Zz4J&T$i{8J%J`~)@_z^)v z;BOK5Lz}8A;AaUks;ZKBfbo+EG~r> z7MFv;rTO{Ax!}^=QYeT&MGN$kgUFL7;R7<{4rhl4+d3LsssjGR z`?|3rxC@QIqr-!r`PbWfhbB6DyT-<_ z`gmw`WMFuxZ?M0&ud{PGIQI{~`-h{Q$i0g4VoaL)+~y1CK6wBA_uhMt*cS)(T@qn0 z*azKa!9F?OU^5z%Al4{|*h?JV8!`$(!DB@TqZ6#t^K3<)sgu-{^zu4_OZpHQ#j)>gXW z(aF{5QvF3a{@KyTSQ#x8>#?bbJDlHQ-;G<>Gr`F3*!Rb$o=Ev2<~;=;vyX&JAJ$es ztOfOiopJhTW3T9Rf#28JHl(TfUOU(~5B6c5v|t|w(&>a-`~?1@*E8MJqd)`)DVjlU z8m^zka8t1qtZzKuj2r`h6z&TA3HF7EbSo>El>^5NQY@Y&Jcv!mT-M>|iCc8-s>50O3G-v};FO+7~QTX#=aTUSSGS4Uen@Ymb@ zXrO<3Y;LF8_FSOC91tN)+X$fedc(y z^$jrlMy=MpWasN7$E!s9bBcM%@7wW0my_nHAsvQ6*e=7R8|Yl#*?uuHG6eRGjt+wF zkB0g%+cwzK*^N$@hWfUL4;t@PU(d@)aXT-3_UZfI|Ni&B_q|j0v34nzw7tW=1orzN zUy3qTKiG$L=vEojn^!TOafW@o!9ysF!s*lH9vOcz05xp z5x0|y0jpOb)J5(9KC@=-mJDss#&F7*6<=amK#W^P^`>ZQSTyvlT4~TtP;W(*L#n*2 z%8P=1nq|->kGjjM=w;aQLFVZ2;`^So^S&5$(+s_R<(HX;{$(K)3MNHGKBM7GVvJgguu}qXzprnhKeV%ucN=ee_~{0{_$gU6|Svd#CQX8*0`ck z{XRT6dbhkWzUQtqOxa9LF553BmN1gMKbPWcXvCDWV*}hto_2Sm$lRV#(6m8Xu z8E49~RP z!FrgWalQ{bW9bKheUlEU%Mf35@AmLFKmS`O_l=DYkB%|>P{0}J9_sBJ=xXh4ZR%=x z&{2QCFfZHVw0-iEAH(VU^FRM{Vqbh*d>kQ97{$DCai+L<$ks!;IniRitVm^6`60qa zJ8hLjFAv;30w1%F%N>-(1NhFc5BQ5pt>DtZ1tg3`U-0C|vZepRd4Jrca>?|N+KkbP zEX|7F8dg(kCV;O|Gq*XUNxs9t#f6L-u@BScq_xMcpXhTY@agO$@M&aAc!!F)A7WWv zWg@{k``p;_K}PJu6GRIubX@FmozGfv{c^=r z|LAkbAEBzj8gSIKA6-DHVmPDON=yN_eYU3UkkJdv|-ZZX{TOE?i;)*5q!OmX8(LWMTAod|8f}#hS zu{2AsYz&;g=vxSF9X&hQKzqyj+A3E(z&-?(D5NgMjKK$|Z-D~dx%tJ}xrLdzg=rWj z*n*+C5SsoXE8Dvphli1qll`yXJpKC3vnyBr2Y@dv{h#jK=|jujOz_~wO;Q6)O8RdD z{+{s0%FE}6C(jO^9q(<0*VjPR*~y8qp5D&J?zV=`wx-S~`+B>(#|9tGOiV1y&8;pk zqrwphM|KdsV8r&Y|A6{_d9EwuYY8hJu`ItEznb(U0Ey^Y8unpZyuJ4{O(oL)Kz^?YNekbyMK}|l(KID2&m0ftMmqc#4-pUetv^pbZBx{N+ z8(dbiu`&K)S^ULPtEtW*bvUJNh+){x-I}S{Vt61K8*G+gbWlSi7T@9~1OC81xPE%r z8)Ki2KP9A*En9IPRu(ZmqQp14DcWy^4D^G}A`LaW1GAWgmHe)bo7M){frht4^&Gn+UOD5UqTS zGeGS>gFFHsCOw#gcqX%t^57$?so}!;tkiV>-jml``+FN<^vkWTuCK13-mwC&Z+S7a z1Y013$4B5>Se_T`1M=pA)3ftaD8*vFZFX@gxH7vMUW)8&JU`xjb#nB@ORN^6-IBL% z+^@Y`gWwL6Aw#3HcmylfZry5|ot@go*l&0(ydGMe9h)8)818KEYpL&Rt?y|A{u;a5 zo6z;v*WEQTG&DUqfh~?9M7yhKLfqVj90#snIDLmlXlr@>`UFkXS942^@riDw!J|Oy zVV=Ra;MJCRiN_N3T09y=?Uxd4E4jX{n`zIoJP~wgI7G~g&OTP|L$VK{F1vd}Sk*?` z+64RJhfQ%qFmwDM$GJp3$pFLCkQ|&z(w;Hvb21hIpO#D=@#jlTmx`shV$D=$HTl)}fE0H}F*HEMz)mC6n9N1INkf!8 zRD^F7?4vRqgqJaC%Q5dNxqfU`>d2>TwAC_Txm0U9UunL0TQl5sNS&CwbYPN1?&ckp zf_=DmG5aXH7iFJDZG9rilrKcU~JJAi_H4R?us7~Vh>hi<;8yGI@$8%z2A`;m8(v*!>P@3 zzn&;%&@>wj^O6b1y?Yc>Zn!cz?4s@sk7s5lr)I_{kcXRiG&}}JW@L6|BD65GxxTWs zv5}ZSV)q4CZ{Ng@-aEHz>#EBG^~}EiweZ%1-r>H<(V>Zvfyu#vvF?t6=7zqehTdkd zuc5cCu@@^WI$QezzTu(CDXQ%*K~5pG3Oq+P!_h?F!Qs*I^OrBa{PK%?_nKuX#UYn@ z)FJfr>Fk4yvvoPqxshmJhcrJ{bb@_8btyqzOi~uSlnMm<5cA?!F%@H8;6HzPMR{4EtgPhLt%Cgg%a^m$(o+>#F`Eq^eE7q& z?29MY@AugkuNVw&qbWtTl-iU!yV?oAk3v5*G%3VBGD`Uo3Zt$c6?xeRe>(eQVjnzJ zVS<3{34)RsJ{z=|n`A?UYOc`Cx2@&}Ryb%ROo+A;7z(Vo59`-o%zvbUuVA05vkwH+ zIPnJ`5coq!A;;Hq*q#MJ7iyd)hQPtdGh%Yl5GB?7nU%mO+MtFUFgZi9L@wYo<#=n;*cz>1u20Xm03edf3tUu&c4YyRo4c4Q}nNeO>M7`K3ARrTfx!g9K2j~^A}{Z0WA^b(+b}wuqwE_r zalmWAFt4E>$w8h2K|AzpvIB*V*NL`Q3Dy^0?bxI4^2%)d!XYFKM4N?B1)#&Wt29pontE8btkcW4$a0#vmL{R1fo#Ug2JW zL?qg(@g}Le5Or$Ix+&u>sJwuEh@(&aKGb%xm<`6VebnkK3LupDLp!Bg?Z|XjUrqB5 zv~<5l&pRXUAgY88@Zmq~#W{L*Tv}X~Rq!4A{zL&U@b?z@M9d5JJ*=s`U(K2Ytkx&o zy)zXm{A2AtIc(_|(3E_K+Qpd-lIcb~LA}jyvoH2#42XOI!xo z7Pg^C(Sx0p-CaFhon3A1w=0Id-v0@(J8K^I|Cs2lgkJ95sz7T)U0dV*wx$P=EN*M8 z?`Uf3YH99i@9gX98tCrD!0Y7XYQ5*x;1zJOKxi@E%mq{`(?UsGtIjSk@{;H2Spjj$&fZ6;bETi zz0|cwSq#0B0Zq8rb3`+6s%as~`8v_@I>GkJYklES z58WyjF5)8ze<;d673}MFst+Vnt}#B@Y)q1jiHaowrdkrMYLd;Cq^KTZpJFpwET3NZ z35vWZbo@c~aljiV*oSiJk*220@j>DUZ0Jn#DOpN+6Opy$j zs-nCe;#`v3A;q0t7<6Z0=tw_m@5DSWl$N`BQVNxQZt7(1Qqt>&C&<@cjD2VQLBgLd z+d=HZT^vmwEM14BRn_?msd+gSufF~(QWeE$8@gUle&FDD8Kngecb1Ip@e-5BElm6`a|ralwUO2$Lup;RU6imo023;ktRd6wau+fy0uxCisnYr zuwoq-Az?2dDA*^ey#jxNfRy!Pqg0)!(lWxL>?6jJYsNiOggF?lFe~ZQ>n2<|^tI^h z(>*fs%eWhvmUTeTm5s*QTrvtH3tn{rw=BrbyR@|g`*Ei4t2FOZynh94)iPW^2v5S1 z6jfuq4uo3-_`*>=E1iR!{==e{_5`h>FgwuK)cysA9Wm?8;1iiX!9L7*9Gx6jR9B|w zX8Ip|7xVs!T)%hyKGfEm?!xJ-(%B~xd;lM9)Z0ZllWc1nw)dp7d(5U`F-5mao9D_t zZiLj?$LBbqG~ZeLA)SI7bM$7cvyZiVNyQ$UpsCGGnsAsqRYS$4OKJHx@11=0i<37e zm}?{U5&i@LLm|wNVT5*RVP$cCWnnH9oLQcGyf`yC_jnxpG=M)$rw+pNgX7oP*$z3n zrpDyt{~pv!@J=QBa#K8sDZU(^dyF~wpHdRbt1J91^$$9mTe{jhI@>$oDRy^t4-5|9KGXncF}X{ba4YDw z9&yV6m3BwQ@ zOz60X)k3jZGyyDpi5WGhyy)!1RmESj;wg#UqiZh&V*-MPV)LZ_B4_)?`Sf?7EW>Qdu>}VBnvdl5UNr9=D|KO&Vh-Jn1X3cus-SoQZ^83 zMQzwsRG1U!XlQ;W6kMY0BmC*<^WA4JkMG>OotBgFo!|Fw=JyHq-Mdp+dq)@SBbh~7 zGaz=8?`%UqIYR8)-RLm^xe9AIZ%_Z|K<`Me*ZY5fbRO5N$8pu;NcB1M6TDRCb-Vxf z?8}vR@7#fV*xS(!cX1HR!^ZMKjCqYsj!({`i)I0#Hoyz;Z329dKLz+up`(7jqvJPU zp1k?;&E1;j3+J6qrPQnSc+?S(`WTr$H+%>l-pF=rRA2e&RWEu?DE*g3D14EfyvqqV zoqe3|g8&`!eHe2_%u6$EBwR|>UQ}-p_L6`VjxyO08%`kWf*D?nvf)qB`ZwaXZznik zVl%JD`rNG%`&^Xo!>3iS?=e2t9%bC4jCvGI?)SOWE~mBKWpD8~8-4Ej1mFF{#M;!< zI=eGZ(~@1TG*Ip%G`PG+MczOAZ#drv;VR5^pu0t{@S?~Izb{U(&tozsV+DaCRX8!x zq78Yq*d#M8*5GMAzR^)jHynPFG8M*Qug*SrZ9HbnN(4NG#?Bf!Xe4MVEt3%e1t@WO z36W>Q9}|#{V4uKWbe@-(1?maaDe~0LvQG**q*0eN=9Y11m?TwHZQf_!@>nTRN?|Wa z#o&^KA1Yo)XWyAEMKSOp1Bh@K)n0hMfx_HCV?#6ABWOIHJNrb~OJzh96AyNej-OQ5 z-AT%VUer7LfQ{qs4@1z^+V!s02&8oV_Cc*t+@2zH^2P5 zqZcp8`y&Ss2C)M%_kqs81>i5VIJX>}U6`MlpM5+t^B9YYCLT{>XWJMkIQ1BwTUGr7 zm*>|^x_4sU|I6k6ZFOyZdq-REK+hnCx<-e_u;>!l8y}y=s0doBmuavV1sBZ6A=D+0 zk6T(u&F0|ntFK@F`kP&!bxKrXlBmwY*%0T`bO>- z$@UHOyWo#9lXi2{4{6E`ejmw>z(j9ztk!`A?I?GUA(G`%uV5cwhmATzFovMcK2~x@ z|MP@f+x3Bc_LpuOvCpL*xD-GZ$taWuXrPVRH|ABa6clCXem6XKTf5ud>UB2x+zkod z2Z;%Fnd$dcCEMrA^SD#aojd=dADwA%L4V(c3l~VY4|U!+qk+JuvyW>XZlf{TY|2ul z3YSvv(fXNvGrW+L6bD=qO}9i14!^G9%pm{;yy7NFVFFW(3CJ3J`lg{(yA+DCkDshB zpJXh8fCNE7KvZ%Gf4YhvE!l{H&!vQ^03^fpi~4;M`F$`f4@4gyrbk@rw8x4qMTl$g z&x6%S*z1nz9P<0lxPI(E3NKQxdkFC1!+xX;aQYa3+FKL!8+1y|- zmR`J+a;v!hn_qnU{Nykyg{h@^~<|84=g5+RW7wFEe={p z``DpQlTM$CPYo7SE+x5Eujjpn9(`fX>&pp{(!<9GStASrq6-b4M3jB{TnA=S(c?mX zA5kx=-^ZfO=wuc#@9+72EM_Ig4XN=n365t8juWr_1TpU!_93=IaEYJ|dqF4R*?5S3 z=sg^8YdvmTr^nIeb2TTp8xlPaQxYF!r9F@>sVT`Kr0uj|AADd8*a95rt0w$8rJz%yuosie)Q2q7 z@;2BRzmF~#n-sDV=HLL5Tc6`uG@sa2S!KBcVMv z8&|$hV_s^jCckgQDUG;fGKbvbQpcU@2pYjz$PZ(}1GFK8A{5cqN8X=Ma1m?UIQ zG(hVEI{w?7s{eA1zrL{r1rDkb@-!RRhn@+Fd682;*gZTxs(C2bSN$FP{^*$dLk?p_ zYi*#hCQx_BUsDNv9r|bDG#@-Za{9I+P%7Ep4s*b?DK$q*k2m+`&d3h zxp}MRm%sY<)$1>?1#Lad z_|p|%(D_VLAHd(@VlcRX2o>%cz%>g7R+ZoO+EOJ8ghkMuTcVk(RO3CH=^+}zRP%ks zgeqr^*>KZh%#q9)g~hk$7pZk{KDdaNLq{P(Y^(&vkV!a##pMtO#C0pc2bq@V*yZ-} z)k$$lrP1uMDrI)H)u!~?)yG)UU}NnPr?!@xesV4M)%7c{3Uf}<+#7irhXt3PBjrbf zyq=x{3c_nGyWmp#6ijtiRmgmx(tkg|J%gF?m%Dt>SPClte6lH(-NapJS1 zobueG9lOcz+hL7P{9?gbglb0e_tGLY|I4 zEagDT?-YD)dDA5er!Q9SfIA7QjzAHMHq2pkSMGs=i(P6_P4#xE$puXpxtDuf;K{Fg zXoBsG_a}4Z1XUEVn4Ig;qX$nfgGnq-LZRSxnMTKKYm?dH*ch-~#rY`yA}UG_S$?0vR)Ooqbh0=)F0pfsI3)O%iUkd4}J}0!A zEzK~X&?WcaZvjCFud?P<*FDMxTu6E~N+<{iP%p@!7l$uyB(vK*s{dw=zpK6l@_jTO zK+R$ZAE>(pM%tx^yZgucwGDNGeSWa76(7Yv{pbJxzdsSb@Bp)~thTD`UL^uu;E%#v zeDV?R!S})BDz=|(ZAP#|WA|xeORuEnJGEZys6<=4Q(Jdv)HyFIyo@unm(uV?)R=LC zdZLq`d++%<`ZLcE5G|$X{GYPQV_23To2%n5>4uB8;efHVsU>{Z#=}uofoIdjV;^HKPy=av-8`D(F4W|sh zuiHx*P^3ShERUEM!z<+XA?(%J2LWgH^*G?w3%()*=31E8VRXtqJ(|$df?^beqFtgM znHXOa;O_rv%nvhJ1FtTg%0-nNZ$orGC(TWH|!**kGwpW)bEmdofhD)(6z!g6-@)$Q@m^iaeXy^r z4jl*g0>r-mS5}D(ebi##!jIgq1U;jF^shaMy_7h4=iA@;(|^^Mc&T@u|6lOpu^0I- z_}<_D>Ee+U#u?`CqSeiCZ5KLd1yO>2-r9{Y{i}|OT83- zHSUt9thnx%zy8gy|K_*Yt4rWp!|WU553*O#d|oFdy~5n<7K2wY7pRuIin&=fA$D$- zjV-dN&Fh%Hmc5;l2+fW*XeelwPDqh!mS)X--)ziI&nO9RKZ)$_V(SpfI(l)3g!%Sf zeDV4(|N56FUwm<|w$W@(HJkIC+I^=s3$!x??LOs zl*{QQHRa_^cm2(^0bwn*_)G>`>i(crwAB6~tE*^XzTl|a*{8)G6er@3-g)pWp3Z)6 z^c<*v8IAWbe4Xxkpj2Ql^~Pw@U0I!Fu7r zi5ONd=QMRDE<&^ zzGbY~EI>)s65;(}gE-k~ph|usU5@fFR9m3*K=SmM;gxzE1io&FS+S5`CvC7)AiIcx zjWv<-L)MQHf4VUTDHbMW7o-K>b!)sE;OA4q9_KCC_lD#> zJ@}4QG(#!|f6A}fB3>Vl=nwLV{^Ix%{AzC>@gRLyHCYP`Z?BpRCuH}cC*n&!iYMT& z5Vi7_nliGxzh04 zTg*O-e1+M!=+v-@oHljXu%?4NI0|nC=EQEcDEk7`sz@%(JS{u)#Pp z_vk6}nQ41zNxPU~hd@hV*2{EnBscXSKkIp-9m#R@yFjEKYW1|Mh|0TM*tP56)7eM) zIO(wyt70t^Hq)49990eIZD#4_c&zA&vF|PXQ6LPb&or&5>#4pkl3h?OJ@FFz4n4}Q zo3i{!f>Do)otAY>I+QVog8hrg_w~4_$P4zhCc0bFyv;dD&4oG5=?T}9d|6JH`?F6! z{r=f$Ho?9hee}_1pMFLye(?JY#6Eye7^nO&-H{-fuQ;UJE(N01=y-gLt{-L}{@Qx2 zgZEWpx4-z7e={1%J&ibw)eLmO^>DKWM<^$x95Dl4n<)5+bc^4hBMx~lT(s`5Kk{@OeK+jq)uaLNLN)?l-E|4->WFQ z7bvSLK@eSjzsi5VI&i<*fB&|>w#r{!<-db6U`2UF83yUf@6sCP^4o#($`XHNfF2Q6 z9q`|+Agj3@xO+QLRT-$M3RG7GDl70b|DB5RN?4#=Kk=7Wmeb>S1cq0x2$WS+M6If< zqB3f?ODif%Dk^SP1d1yCg%zbY1Eu(D;y=GXQ0~Wf1xl*|r8ox2iv8uq{y<59OgvKR z_m}ufN&|jaiN6$IUN0{xDlg&lveG~qKLJPm`S`}-fWNrH50x;OcuVCK`0H1c18JChLcU3Ag@HI|K@YQ0K+QZY07W z^;{PpckA3a-}#H)l9INq@SA`B-GA6vJ@L7VFP%@9q&rrn-=>V(wJDoCnCc0Z7kyDu z@cLH%%bQnUUcY*B>*`CKm*&6p7o6m#qVPK8fH;VyUqc4a1n)1eqPp|&<(uFByKk|` z{MwZ=)tq6M%A5*17REt6M7Z$vxRGU!RoZwoO$lbD9p+`eNKf2Kv@TxHI?3`yeD=jF zna>KcQF6sk0r-&VBI@bjLxNA97KTh5CF7(R`zGzCaSgrA)Z8}$gJ?5P^$NdFZ+799 zW;&N4U}c)MTeni(uaWWt`%vpZp@W@1Wcl$sM-BmsD)9TJu_gI#cJ+#Vl|s}&N1he(0kJhky>3$jvFp z%`3<&EXpq{Dak3!znp(1r{GHNwJZ5WSFhd3zj3qRR>_SU#n-OhxSCg(mwPQYw;=b* zwY>boD>ts^7Z(?nmfS4$-zp8eZ&?ybT0IZ6VKm}lQBT#ldP~%gf73%l*ZrWj9Lzqq1VZpA3(b`)`%w!Ls7=a@dWM5~z<{$L{ExxAKdM z3U1uGR$5#L<)QM@5>S%Nf77pj`z?R@E&lQr@CSebsRZS65SAdw0L9M+_)73gEGz5m z=-5URAHcUA10V25$-Wr-!g~h~nz~Wz(Amced2KXHPJ@*QAaK1!bvFd*gfmDN?HTsr zT(B>Ozi77uRY<7j%j^@K&mutvu@e+SC#>cH)r4U7p=7MSbgAId`KyLY1#uUy8!lA1 zl^(Z>5B8Wt9k;6!c6roeow=U>qPPIOdv%k+SCaqQU+}u@>Pgv^7g-5N;D|^ZCo zUkL}$T&0*1GM8(X3aeD(kh`%3o45QRwq>IZJ^~+^7|W%$mBp;|y~6C1ywv@ojOY33 zM<{eqt;2&Dh~7WDd!*OG#+3~u_yqp2tb?}hz!39dJ^7>!qaB7ZIi7YEG57@ggzKmG zxNv(jO?sdqMzui2;6;k-HC9t1-{-TU$os^lZ1X?_;yL(OG@f85&3dp8s_cS&-EOeY z)t2aKP4hKhPHrm9YP_6Oa3w9@a^ccvAAj`T_uhL8e8Asd{P4qzpMQqQHaLCpM#wb_ z{KeR(8jKE$Da&Rlb;%FiN-ug`plO2*;(Csgz$aE0&8v{Jmlrg7kxU{3{%C`xUH}oD z0s7riTvdEKrAN>?h1oUX`hkzpur~%ij8*6t9HUT-26Hil6{u)qk+N=8)==lQp(7fD zB9<|m83I}TP6^YyJ&g;Qy^&_;gcO2?0LdJ^yK5Fz6q6X|siXIoiL9Y6#*!xj@ zIisY)e@Bmb&j!2@G649veHKUBVT7g%bX0^lw=qM6J*}G|?4RC_v8VBip+e zQ`%VH35WN>n|tBNendP@PuL~H6L#pyZ2B-iUIG1HJ2chL&!N}ZLFWg0-{|MUY2wGx z1N?i2;wc)1_qHQ@TakUTt$nP9!28i>W;xG>>MHk@>}-X}&{a%5CMY}5!we?+Dfn@C z^JKVfVDJKM<8Y%duQAeqH3&i6`hUE`9|46e@AB(?=Cv zGJ!wHb*_hZ59=DcC8fZrb-A?#1h%*oxmHG@314Y~efUy5E@EN*8jkvX;>wKSFP8F- zm4+$t$K^6=dye+RiD(gvq;Zq(rJ%&pZkO88h|1C_XeNVz${5&(p?!yn_>O83@X=h_ zg4-6#_B}1l|M|`Amx+i>l?9kjK?wpg82Dh$kb0;zWkqwfG^|O8m-`^8ZFQaoi}6o2${W9*}iMd)x= zjT5w(9PEpWu}{Zebf!&=b_`;eS2fM6=3tWhRkDjVbtKqMP~>&1`%Wc-R$u6npa{e4 zBmF*yJf^b`D+g>{G4`b=wB)5XU(0FCPA<5TnSbf?iy!~^_lmq=-v=Lj@cE~oVy-RT zXo)vsMUljHUds2yQ@&3#8SLmLw_2_{r8>9Vf>hwiN2LKCvZs~(ee4rzL0?Fgp+{R`EB-%IEcQ%1M z5R>+Pa042BnDNn#ex$dVN4vYkyM40l{e77DiTI(g?Oh_EfS`VaNISL%V|)5B7N`T# z)P*CSvrQ-Zw{XX=Xwbn=7wRVZ>o89NN-~{&=#M*#Ke3)^dk^~^*cg2H5@6*nVtsTB ze{1}8xTg-yWx7$D$rd$T=(bJ0CNTUe=s7#c&69C69_UDIDd7kd<~Gro!p4jfzan~l zif7rCW9LrCAKX3uO^P?5x3+M1OALRAe784H39YN|Hp_(`trsf9sA!?Fne)YTMX_QK zjrYb}JWk3T`2GQ-ChE({_#0vrY^TohWt zkX)j3UJr{SluIyZfe>}hsRdIU+x1odcrE=!g1Y3Rk{#)W@-huj3~4*G+EL}fO6@hU zNgUC#hiH-DMf{B!^(VUtn)Hplb(aSA8PLIuBq7lj&GwX{ngPGm(zn>N2?~%a z$PV46aO(&z`qTKC|<{#Et&vr*#rTx8C}qg-U*n9{3D)r z_+;-8D=BnV>aHRaQ+!wKMF`^DsEBVDuOocJ82jKep0Pd1pRnP-3AXKrmH$wX_Ka3%pyMRAC^9;00a|gJ-kcRXcG%Fb2d9a_2lo>bO)R@Wv${I_ z;4`|h8cd$2QU*N})!txE#=*6m7wl@Gkp)e~q~XN)qdG5);@?yJ(XtNcHbW=aNhi}b zOtzUO6~nk3Kc5Q#5=O~B+f$DQshB;dy2W~8 z3utiRm>stY6goy6>X1_#a9MlZ_AalpBf-;_1okDh7F=n)np>BfbuBAB_x$p}9&eR|UJVTA z^sBLBK_|&LlajMdLS(Ls`bD?=(VdWUz)Z2X+oN!m0Bvykn0;^znR*O9un+MFgOAu3 z!{6z1qUk@Xbs%Gib?K%)tFhCq^d~t+e6}G~LXNN7E_G?7!XHL5~yQDQfD;JUx^o^*VFwq3U7&4hyz)bglo*F_=`f2oH#OaB>9=Z zAB?_*@h2R{{UI8f^~>kWVW$M8geLU;t?3Wr11mNd5>V`A;K2M@WVPijh+kw z3ZIc0b=feT#xX4YDLr8ePoRMfh9mID|M7k24E{h=b`rND!I|}hq?;DymRAG&AX7#` zfJl9C&KKt}5_che7Y0wn*=gW@h8B?H+Y?W0)MP_h4dd8pX<&b zfTc&HoP#6GK{n~s@Fff@0~eB9``7b-mYs~|55z8DpUyHGCFYtkiEOG1HZ^Ed7pyRr zTgOf%ke9$Glkp@zz;~8?1U~LxA;1B1{Bb6?hK)Yj$hbkb3EzvSq1O-32mZLnh37g@ z%SQ7r8Sux8dKrI+d|{eloNY`qjB17vmG^jXhx34B98kLr;(V)}s!cd33%jfDy^0cKSv}Po?7Uj1U4R~t!$55=P)4PUsZ?iIIz(ZJ{b~U| zW*>u3{IZ0mDT9xPJx+V#W9*A2gT>q%-5%e%hQxJ7N1|Q~eBh?ez9<0+kz$1#Hz6Yf zhz`LOCx+zAgK}J>@lu)TQkglvT%l1mtgOUdJ2Iz)e|TK4xTZyUH(J=$Hl1YLH^Vb+ zLd6%IuGns_#OGU0X@%+e4=bu>hWp`{P*M;7A!kPH+uhpViBJ}d5`PRe2;y=+O-zz< z`V2ml{=uaZB!$MzD%q$&ap9M@pBQqGSn#dx3wFN?1sa-MZ&v?Ou=rX z7diX39p1%X8txu-5cBUtbd?ZnfFZIlqWkU5bvSpR79*tcM#3aQRMp1!A|GaI}--8lHAC>UsqewKsK;y)A5 zQAmdmIJ1xXoMFQIW8V-EBsWlJA7>sB0`rUq<^F6YDt*|D<5uIS)i|OVu)7kQiOA`b zO#_+*-;UjHJE`thm}yILJWsG4d$oPH79rP%R)*oPjF24co1pc!PI=lz8Lk0Zl`I!nA7(b`@}8xjQ6Ksog}G%U3uni)!3q%n-Jl0{uoIOTq1O5CfPM{ zDMtfdy{%8%bTRvYKlTAp@zC>qSm|rCRH%j&mz-35HNUg5;qlP$@^lbh4Q06~8@CrB z{2@QbaV%jEo*{r2hA}9kDB*yY2ts*4%J0RdPB~A=wFj2k0N3yu6c;lA38m~1QoRGX zA~_jS)6(GupARs^1DuFtClRF6V`To4Ji&tlOmprX9AY~y8*TH!h#q@?%)Xs{)G^@P zfqI(}w$0s*jor=l-OY`iFl-&=8}!F*!_QiSs|CgZQ=99{TaneRNC ztnUIH;IVmRYdMiwX9_boc92=Shy=JRcU*hk$hBH(o* z;MLjJmh5dwOKi!{Y%M8lFDYy+DXcKZTR!{ArzBa5#^!foUbMY@@ZpD_eG2wnV)khU z@Q%TUv9>s7A4E*erfk_<%%tZ!iqbY*32d22m{?tQMi?(A-oTeh*hytcFi{_MadT3HRR ztit75!JAoF49@HS1;LL+$XQ}n*Wx^clY(==$K$yfS{N}iJwA;M?BjhS!~LU=`bLL) z$H;m{hkHhbx`zjQ2K##l2l@v3`}+HOAuHU|-QC^M-PPXR+13T?Xlrk8X=!b0X=#Qv zH#aplH#IahHZ(QVH`O<=H8#~ZHP+*S#`=d14cpB3pGeeR;RK4tA&NZY4CTDr+mNYAdR00%UgsRre|??^WW#in^+b+N!|4D*s*B z?ZCY|SX@+D*WS=}x9VY0VToN$GsJmK#$2~t@7ACex8#9%A9Zn}nTgD)tzgW9dYi~7 z_~468zZ8Yjha((7TypUEqU;mkBl>V^o3DH^5JD?obQ9q7(l|L0Fp58XwgvtOc7lBl zI>DEWyx5W1$KZpA-dpS=7m`}aAPxfd5&pnF9AR(+nSGpUe3yMX^3Jd?7W2|Z3if6w z{)ICLgMW%h8KsqIfrY-E^MfQ?&+J3+9>pJ_iUwi122H&$HtZ}X@Qv7vj|BTrabNX-s_Pzgu_doyabI3Pir;*ugHKL~vLI$UP z9|WA8W>bb_E>fktHi~)2X^}G~V950&FIQyx&~`}1>=QE1F%O>${AUSBbR+gfEe1q= zT1W@q=@X*Qe5=GJ9u(iJ_urp#P!N_w48#RAsZLk0u;|TPL^MP|1{_>GYHbl&zcWWX zg7P2YckG{TG{s*t8B-)vqH0O9ODQ%v)h6SZq)7=@$){O7irFKZ-ICcYTilw(ZIxVB z$*Gzhip3$DQ8c$(U}kgJOGbxgcFHD~M&@Soh!fT1lFcr~?85uOyRzVDp`+RCG8mnPcrs(W z%P6@`Fr&w0_LwE;!TBWFrz$>+;xo!Vlae4QiHeHlFJvl?N|LH1vn8oAEK!3gi8ztv zLh zwklngEtgd(Ta&UhDbp%t+9dQ{Wmzp*swER!q)p~DnAwspTQX!R6DC<;8Eom2IZZO9 znBtP+F8VH<^ISORGhNEUT2zUXNl?@g}neG z1-$Bt7ftfCMVkCOfRDI?m0Q^MOPOLa%!DxeLYRbwd0~pMGx#IdMqrMR7d7#Si1^^> zMe8Kw^a=LiNb;f__UbxvTwO%7EvTnQyZCHUn5-K`yWFWq4I98#jC!#XVws-uBL|Sr z`N>f~k!mAk!s(-!j|PFM9zytwv5$AEL2`<`KkB@}?n>H51R;Cm`-WANcRB1O_L+mK zWhvGDBF%l0;&`59d+O7kc-0*qHbrV4=~29Yyz=j}59(Fz37F(fXvs=%F1p%$tEj2; zRzqf5&V_U5KmPHL-;3?!JjosW!De*L%>UIF2p`#rerQq zEVpe+s}pTUQT9>AgEDls>F8X`B*}Z$0vxyy}q>(f;Vp%51Vzec*2|T4_^s+UkP}J<>e0Z zmz?3zh%C}KguufvfgEUcAv{qJxzWMTN6U@&v?F`2&!WXOtN52?7Q_ z?~EehG@o~x9CYy^axehWarysnW_eHp9305)<%N+UXp2pW!mB#+_vT1 zsGW4h8!JvINFYAqKI&DVG!j38_&BW4ALBmqz;PeZALBkw2INFPRBzU^lXiX?_eqJ5 zyUxja%lyT09}yq7YdE7na33u%fx3w)+=;emP8{i@e!+d9JR&I?sgM#M8}#6YKBQN; z;SP=gInT^?9*uL->>Q#Y4y?l~^%iCXv$f! zU*5AE+wx*pBUwxhcGw2uQw`dzB+(N1Ybg4tD|#@ME7}+^2_gn@5?jtnk-&7@)^@yn_OHD2TBnZkwPlUkuk?|et z#Vp&TgwRLjl@B-)826FrM}x(`7WzmJNM_xL{x~Ust06FduZ~%!Gz$TSh8{r)peA^# zBEUAD$e8UT479ompb*y~SSfJAtp#z%Jsx?5;5P>$)$#*rSV z39%C(M1Uulc%e@60tqG`)l9g_lr93%RI&#&l;Gc9mH&eE-Cp7;s?P!k0P)1U0g`2K z=76AZT?o8l;N0BL*SJFd1usf*+0@IG8VxLP zT|BOrN41?RT^JMOzhpf=sQEF;q|83PS^3bA`1#Ske*ln3JD05?l#q%CnDf$Od^ z2lr82PnKfE+Eh;BTj4%@6g)8Qa}Z*A94!=)ihj7Y^2yTVV#>kgJ}+tgm}Um_CuKlZ z9#Al-FAR`UkI8x~`aY85*mWA}T^{X4rDIhLov;5fO#$|$bXQY!W!#5aKtdnu@M53?v%ayS16E7F z(-2vcy#9gv(7l&Rd}O_uZP`Id&uLy+L-cFz zL;HgQit>%ZM>XUF$1&D}`h)cjI14aq(8=e&T81O91IASWV&!X&VX7? z8Y0q;6F*{{#FYV0L6&44D2g_!5XFIwDZ_y}0Cqt2d#*$&KtR2siXrWG5jUv`Ua1QZ zva};cucIp%GAK{*n!!;;;HV1!0!Iyi5|c|1oVjizCuqYh zz0Q*QwI=iVk!P+2LQ_OJh^*vV7ik+q7paxv1oP!gB<&kKvjsWqDJJ-{wvgzI&4hqO z7ACln>_+LV%%|?B5Nrqs0~I{R)JQ8$q!rG;WkVzO;Rw;iOq{K&Sib&JP)Il@=!YB{)M@=1p>o5_uaUEN7NVyMR#Oar) z4~XlS=3=j|0FbD`sv)Eh@Er|4EQ9oMtk28ICBNi8Ci*erlhU7b{1-F$Xbv-hrZKNT zN`K%!2!P8SVQD9tiG*y93nu!la37z9KF}Y7%zXt+`eXDb-NuN-z=w)57^3mps*V*M z!JCNt#Oi!^HsFp-2k)bE4NC&|G02PME^63H2|EZ0zS|_cs-=8+i|WN~nzq_otqqN= zcUzs`y9eBNV#9iwFIIp4$tS-w*Sym0g&k9LhX44dKdf8zh0F#yKDbX7yOM+TFvv^e zyiD#xM_5IkR`u>zQaGuqh=t$Wa0gL7QkhF`*04xf?>})L{4nlYroVqBKH@%BN{Gvd z_-Ga$O~hm1w9(Q^f~tZ9JrtC7W}xW@!c8Vz)$!DCvvn1W(0d;{Dk5I zJvxLYB?c0psBTb~oM@B?Wd+19ECfgCMIq!eDG6!_UTeapE&&edMNp4a$fCPafZ#}) zW8BB66P^hgLPrinvI4vUuloS78zZ=XxgvB@6*{R2oz(I@nJCkDoYEF5(@)91he za?}(!ZDN1}SoTkD=@q^s=9kbE69Tm*a5JeKdE~6Ypf1e?N>xUw>=8Ee4nLVrgNe6H zTSq?`(NjywQXA>41P9SKzKe!3a0_XL7Gl#fsI@?oz`$A>t|5Up;=zx4!N@Oas~|0M z#D_E7@B`Ln+=u*yIV@^=Kk9r?+eW#=Df?Ih&yC4)?H@mV>jPu5LP|AH6W?bgJ2Lj%G;y!7g7v0_m z3NqNb7l3h7ZYLvX03Y&YUSOM!EovcJnBAfz))e@H`=}C;xB%Wq=Ly}-dsz0Ts(2fV zoi+G3H3ioh_g&hec5&M#+a23&%uTKL>^Z-0&)MCUU#?%fcGc(qVCI_tWuOBLi1oct z`TdXI|8Cu?RU6lDkXIDQ$thxG+eh37>&*h$jo?0A0dJ3r;%QiOQWId)TTDQwem+Z9 zwq?h%xW^IS@|o1DoB)U`lx>*yOkkoP&1@pkkE1!pbRa%Pb8OT?O

EPhG(gU^GYa z7ZVMjzauwV25y=jdb_mfPtj3`MQMD3GWx0{k&z!}k`KJ*hE0w^a~gbCO}-0NEyjHs zil}3*>cn60KokZBWE2J#12{LwfFGaPU63Z8wTplkb2TdD780Zk zD161WB}^h_Z37w!masGcLee7ZcA&&U?qk%+81prr0=1!7vPDYN^Pu;#t^=u$@oD%* zfh#gsLy_cP2z{L92eLn#kAkrg^Z@V*m`!_)qOKwDxNKRHT4iQg66GH=-LSd~iuAyb~sGft%RG6k2HtYEzYWQeSq}wSPX$>oMOh!dte7t&R@~?* zzu~pwMqlAZk*cgjOEF}#Aas);5Pe>C0cs*zJ7_1MLBcd|D3M6$Bktpa`)+6ou5Chx zR|OqjyRDmTw{N$xu(aO4@BEkh&zc#Vu3x+6?|=I%&1&X0`#!e`Fo}~&Oa{?}^3nBNBK?qLhWv#?7BtDMj zI2D6bDqJ1|5t4xeX68U@?~Epba*Kh~UOA5V$A{TvhlUDtu2>KKA#-!a$s1f!0f% z?}<5+ntYKa-$#RJ%S}Vzt2-nkBl!%d#Qg zO6voT?6k?)J^Du@6FJ`8`mV*7I;_E3kt8IGL=G_JyiR-}R< z$1+T+a#p3tFVi=wF-cn>EU+GAJ!dVU%Vs6Ft;#-HLU)i3Dl;dAant|;(o%BWq~yFw z*-29w^ykFr58Map1U3n-oGf zgr+HU+oa^C#jpiuq4Q=Xm(9w{P;%X@Ui zeUkuwu*E3gMlS;3jhZe70nx6Ovb&~=m%5Uty3h?kB)6)1Ybkkc5_)2~tf~OJGkfW% z`sk|o8mjtj7kY0Kdg}}QfbA-NNXG4|B3%vfR#ksso2vh2K*e86*;iM?f0L50=5ipa zN^Et((Q$w~F<&{mpeH#yS!coj^04 zP_rH3W;-Iybi++`!%g(U&Ge!y^rOx6W6bnp&GceT^y19);?4CEEc6pB4H9=7B<(Xw zK4e1J2biVo-5#_mjw^@$qmPxdMJ&o`!%7L0f?5T}5 z1Ns?krSe#f5B<1Q=u_qYsK&pgE`YM{il)*?YMs z>%Lh1mp@@8??-!dd`y4fKB)Yl4*dM@e_IdklT%ROE3Jbymkl63#(f(UHf|)jk0-0m z=j~A!oZqbaz)auWRNvjqz}*7ScQx04ZKn6qO!uX!uD!_)f{~8Bq4o;{?dN*h&-AsQ z!(pKF!VnjA?BUSUfsvdSx;plHI`;ZHFAa1Y47FbwYC9TkcQM-LX1v|QRNK>Rho6O> zpM}1cg}w)14(Pd?>3Nvx`f(x#@Z5;r=7YnmU?kk`mw-nI!9XSMeNi?Q42HP9=v0VWXEQS z?iPvuwm@wSA0sW1nYP4uyVzihNKeDZaFfVrdw{Wau(5WC-nO7k8a`XL`08x+-?7zS zXA3F}Dv$qmm4NLU0o$}Bo3$i5TZ8nshZt&y!oTr$07ij=47X#qmmou(Afp|@hC3t% z+r9KP-3+(-8E+LEZSgkRaoBVfZ`tQ*2HQgFu zwj;>gFvQF-#MB_jSl{1BPi%y;rz=JvCfmJ?x45CWn(O+Q==vCJ^ES~F?KJSWH1ywV z9JtpcaIdjsk4eB@lYj%JlKp1>=G)wNn~JT>#FnPwUFKp-f8hYt&cFr~+UTtCIWntuv04@ojMSG z`e4+F1Cd|vi8#71;+w;f#}9^|I288H;jlADBTpZTJb5hq)X~V3N1~1$iu}qlVxL*q z4o#7kGVBJTi({`Le5@|Oi2OY@K4#b52Jxx#e^3+LAe()#Q;$75)UcGzMrW(Fk)E~H z9_xJv&hI^NQch8R&8p9^W|w9)|0lT*H!$z{?|=R4x;1NMWaX8VFzt)S*|WkDw~ZSW zWn`3PWi&9sN?CE=Cbe@~D(AISt#MWto>hYwsE9ch$5j=+QjtHbBLC$wU>NqGlKg%l zZ?BNIM<8d#m)oTvYpy6`rXXX&+h`;sqq{*ydxMOQtn7}BvU(e3^krlWHf%K9u-0h9 zT4T8l#v9ieZCq!taf9B*jk+=$b!238WMs8vF_TM9M@DXk3{O`UbH3z__zEU`1v5nj zQ+at4d7g}BO2;Q z)m4wGsvK2OJ))%awX*WpDymny+6uxriQoom)uto_0qShw1I?P~KitIb!hHeW@sShad5u$sdv^HrQy_}5G>ZLGF!9C^ov!-YgQSpp|c752|wnae{RNM)#v7`KezaTV7~e@vsDDsRiBvv zs|hf70hp`;J_U>!j6VO=@Uu@1KKoSv^MB~C`iH?6pBv&8YgbFLX0_3p)wqJ|`d@se zzvgrOb*qfle_^s=joF5^Fhysyex1RF^#&U^8pty6)*HxgFywDA0u(nG2{sxjZ8TN^ zHULIS>x~5Kjf5MG`LZSovc~eV#ynXg*v$oyvwV3op}e`0yoD0aLYcQyg||~(ey4`Q zE=@(tO@iH8N_(}`_HR->ps8_CbNiQ?+J`soIHIHfje)VPzJZOt9t?Zf8W~(L(z{@+ zcfmy0&Q#aVO!uOh9$;r?bivff7BDfsU}9=#YH`tQ=VeRFt5%lRtSqnZ*>!!F*)hKGXonlLt9frTO)lN1O4;*`seiZ&Kv2U zH#M@hG`6ua#`(O3@i|N5a|f)x+q3(srNt$yT~~MSxo)-d8eoaD1#o?@<#+q6ZXVeE z{o#W@9Qpe8u_HenJ96j5u{+nAStJfT^Uv&hoU3R#7>E)G+4wo4&**RRcbGUNx^|edR z*DtwTzwCPXvg^ewZr@#XyLQd>+I83OuDjYl3U+f1_jHfGc+usXqdx&B@V#IC^wptT z=BAgoYMj$l`c_l$O(A8Drf3GIEsV2m7j!WuFcAFsdsoUyk z+30PzHZ`{1x7YgE5$nBs_sDM8xEkh~v7+PO65oez?{9zm=Rf^%4Td`~(!p1fl~vd% zBfmjLexr<{tgMopoVuKx2EgNK@cEn6RW|GB?lLwweE9JBufMXjvA%Qr$Jh7nI6b)U z`rw|^{kyO4{^W4yw!=@i9d6%t`0@6OAAfv)`}T`FKfSzv_tk@YuO2cydhq(m6W6Ct zT%JC0e)iP)`3r2*=knr}D+l{mZuSmtFJH0sna=L7U%5Lu!{P_*eqhliwi=ZJ){6*O zD^DvHr^r>~2b*u@K`?>yW@-dK0)>gDI^m4Am-kCouNTgqfW4E~Ge`HQ zuiTzFyT5StdhX)++=V-PIyieied+qx-tn=c+vC@+4DOGeJf7gXlLu}+#hS0@&QG2@ zK7Qfy_@&z;2e*d~?hjwOJ$ylU^um?!+~whOmj};X?mu^a{KEa&3-{+ZKXXF@K6~Ow zc>3zuGpDBrA_2x5_sNQ7P9y?sTnj_n2bioE<7a25Ck|l3lPgomudOlGJN0_=Dq;wYkWlheqw)-SnTf~APEQv3Xz0`hJ=N} zj(mu}B-lSN*xS#a#fer0l0T7uP(V;{U~n+}28DzKg$9d*LST131W&O4_$3Yu76st> z&;UtDfF#&2AV`A1#fYa!|;sBAKzYmO$`67uVe&RrXq?3pihQlH_ zEQG^WIF?Rg;WXAw!aN!lZu{aUw;^A>q~S|e6|u4scE?~F z2urouo^_m!Ff6FV8X{U$j>X_eE@mx_Ofr)3FtT|=yV}95BD0`~RoYm;&DLs@Ax6$x z1+B_tb|E~OopMAd#>5!Q`gzex)MfJ{UVdUvk%+93 zV0k?=5$ENFEFsI3w5Sx@!lP(nwJQ=DNdOB*uttQnpfK@)^dmb(WaG_=GtEJ(zLv9s z%MdQv827OYuw=As%!o{RxVf?{)d)9$T-U;uw#5fO}!NF0c2i^#JKhY5rgrenm%mH|uG71Q>e z^x1ykCf`u8A3@|7BJ!h(O%UPxL?XQ04<|85#P?(Piu?#zbWE=jalAx?17I04xDTl) z7Wq*K1oG+U>%9!PiTh|f6^{F8Z8K-_fmSU460{VWz_N^)pdqsqw0kYG0v5m!3}=Om z#QL# zAUq0zv*$p}#BAfz8LvhNSSksF5st1djxG*l1_IW=h?WRoC}*smbRjD{bOj5wUEmir z4K{XhhT$<7njkls;K5IJmR3#1c-V9a8w9g(h~pr*Pz7h8w;*zi1;Osbeb}rdBp8KQ zB1Q>DmLg+7vMx8iyR&V}UJb!MO~EBhYEc(n!#3oQ_|%mzz(_qUWdrwZvo+DR*==ca z7(2WiwNVxb*REdk=Rg1H|BCz2FpOISt998YNfc_%M7^umpw=20(l8Y%O6T1 ziU`YXlpQ#@GD`FZV6DD~w=3w6*`8zOSYTF#84Jdl9f-HoQWaWF*eqZ`BgYK0&`su_ zd&(0wi1A7E18pek6jeZ0ztG+?D+Ej)l1e00KT#POElR5-$Afg{Dk<6qs)}Ade)z-K zM(pV$_VgChK1sAm5>;#tQe%9q+JiE{RwSE%nyFsHoF9xAF#lw7Mj9K|9&xP_ZLbb_ zh|vwiAmR>s<1)xJ0^&sPB9k(B9&TnBi?gmp7a5C4<1M8>qL5{9e~J4UWie@MRw`U@{!sF% z__LD4&Sdll2P-Jl_LFfl1}2TsZ<4#n#2MVI#G*(OyAi3OevwseW*~#?=)ign8L45W zftVRJSW*K}Qejibi=H3?CVMu_8?hZI5dpyZA_NT7Hma_GhX;&?LBhbR5S*0z7^T6g z7?V7R;)pCM1Ok}~Bc?~xSnP0xTa(V}D20T;8Eb+#VPgl6Gec%Xo=)IQ78Jb=qN~3+ zkalSb2?-4egkbECb`x2Is)ScMIy=Aq>GoYy-F@l;D|Nw9b>T^M;W>4s^BT%F8Y(uL zsy5(0?QOPDM_5_f9Q)dK-@Zc|Wn@=<{`r5L)x0v|Asz1ck@nHY&+IRXXeGm(%bu9V?eCzqmvn2|t7;wzJ2r5}X*9I@jg@QG+75E=|$V+VR- zK-NX3pvc8ifWDRvoSEQ{rUN1&XT1?;GUVgx?dA57IiKb9qE>=y5fKs#Oqvy3aw0TV z0O`yTE~PCUW_@*{f2<}v6AQ>CNw&*~2q zPO|aniM}-apwo zP|ZdNsOjiRp?QFVMT08WGAJ5|J^J!uKZtwb;i2K-VPWB+=#oezAU{8F3yj#hVDDnG z4f5jgqer{i1{wKE3+n zy=Lk-(Lr4}}841eGRsl9msIwM?i; zWa@5k2hx=l4puytFS3$Ag$H>H&L#F@Z=x_!ZkY_h)o_py%rtrWdU*MIkeY-{+M!_6 z)@#fgJhMWN(#hg3jVfYB0+IA{xURcYc4Os{vYy^9Es^+KR4{+)!BJ(W4xF#AgcMtT z0qE$l?jCx4beF0mtL@7@x0Nm&9K<__5MstvSuyG*)lL>;uo?+G^p0PFUP%Y_FQJ!W z2iMgEm*5dj?FIM82cs%!OgILlv|zDfPa&(RvLM4LHyNaV=^+O0i&(6rom19_Wz2;h zE_(G$qef9#21W6s1AY9JJ7Or+pnVfVMTY7C1O)h#o78dA17AiyaNt9INnt?0=zHm5 zu7iy`+z-4xKqMmg0n`VFh>YS(PvND@QT2zKff9{?=n~bU69z@2lzl0!r7uFn{r#a^ zfI^P5V+NmO77>XIeI(q=rH2(m=<@u7#Qu1DkjOs}fP^DKS)kN~rhzgUk}Z1#2F6G! z3Wb1(eZE+Xo*+IO434+M`WRkB+DQ~7AD=*9zd#?~AYY$gk#DfCPY^VQC=@<^P$UK- zRF-2@H_%(4xP#k4?!NRCBExhMC{}oXkiUO$KtOO{P_PIIfMxrFv?! z#yRb+w)%RuR#q4GAFw@k!cJL3bN^0P8cg$&Oi zQ^^ZCaI92a?$U}#g?CWQP*(u4I6y28kw7DcoJIM85)G_DdUR-!xM~RxNb#URsG<>N z(p6E*j}l3r#l47Lj;w>&KotSH_5hJTz6+ZBkbt02DC2MgUxmykQ4HURFAjt{KNy+} zge^wF3JaEmLf=M(SRCx{A0kEoC}mK1qef6s=Uz!~#rIG;`lAEJ0f|Ejc+~tr`W|{L zKpcSBa=-`RB2{rQ#|o(Za0If0l!1YP_=$@s`bZfuS3*M**u&gAif=-_W%aWLwDj*~j8cakOV+N6tk4@+9ncifdxJwFAVNTU6a*j4Q(#~)1BKx4Pc>YOb3jC3P$WD+>R|s_x?z|DX@Z3H zm*7i+0#PQ!060Vv;DBta%25t85tNob@b zG?-NCA%XtE5^-=)Kqx8DC81EJgLOgzffr~D=x8J-rReg3>$sT^AD@&EpA00%0ZEBS+*l-X zY#f3Ki;0eikBf|tkBm!*icJWQjgN?Ch>eeipM?0>gqYZbxY+o(n3$;W*yxCaxah?A zn8di)gxJ{ln3(wJnD|(7!w-QTiH?tpijNJ8kB&@;i%Cq1i%*P4KH?mo5CXrG8bf`TAh z-~b2VO$Y|TVibnPUqvFSpm9+lkzvrKEi1shz`~)Ckm6?;3m6Mg7 zgMS1ZcqSt|I~~Z$&LHFfaN|l^b{4`<&CEyvGSZWQ^z_8k^wjk9w2X}O4C#@ck(rj6 zm7WD;0~v&@40=0(jx35EF2YY*R#swGW>O}Qkql&IretT~6EbtMvk;-&90s_vGP5(2 z)05LO(^50j)3P$svhbG7bc9Kv(Rb$N=H=z(=jRs`00o7Gg+;|hB_$=LWu;|hW#t^o zaa5F7RN!2;jPi=gipt6gTr4XoE6ORxM<&LmqGH8FM5EnQN{dU880Dp96=gtad1*;maZzbuK}kVDaXwI3Tu@XZeFV?0pcqLGk0r&W z2%)s7xU{IKtgxu8sJOhiq`ai0ycD^CkW0&ok<^6pqSA`uvZ|8us?zeRva(8g9o|cC z$2&`l%SwuIt|%?3Dl4fdD=sfZ;Dsf{gwm3tQaFkViwg@1k>kks!h+mFI@5QtSizBB zke8F6o6C?>keA0HKQAXQ7eMjK%E`$DP+M|Qh;nlCvUBrta`I64P?6H(Q{qF={zil) zrX-=-u#(0+vPW6Mrf204vU4->2udmnBCmz|ZD z17zptP;3kGfV})X6ls)e1c9nZk<3L^%mROXbJFwZ@dw9_-#>axietwgpFHJ@76vqW z>Xa`4e$GWm1qHeJ`Dpl0o%RKy<6;m#nwJL;olc&*fBeL~6W=^JeMS_Yn2?^8303!_ zC(kcjynFi0y>Cwv&YZbtck#iq=dNHS9Ouvb1F5Mgs4msj)m7EimDSbd)m3HHRi#x` zB~_Khl@&!5Kj`ivwLOFI%aUm6heFh(HxXb!A0$Wo32M zGO8is%mSi>uPK2>Z)pLKsweo5^I}4&{=hTeO*&yU1MW?gY>A!6`+AoOQ@>> z8tZDC>g$>t8k!p$n;V;&8k-v7AAalcU|nNFJwj-taO&_AH@Ke-4YdsoH4XLE3^k1n zwM~unO-&69TqqO}f@;LMk*+j1H#9fZHzJUF1S`D={}dp-sJ5}8rl}FA=766c1SWW$i6yriMqYEWbT| z%;FJEgq1w640ksiD5Psj;=CxwW;qt*xc4y|ulg zt)mlZ(canBN$BqC>gn$4MXL1l^!4^K^z`-;`UsRhgZ%>|{ry7&gTn*(+0)n4-HS)M zI(s@hdOAKrXJ=1WXLn}@(A5FJ4RrN%b@z1j(z&~<2Yxy_y4wLbx_WxL`}+qG^3Xv4 zKu=#^XLoN$*9UasEnR)x1oprvWKTbjAzh!WY{OlWFp3rOU2`MY%}+!Qqj?A*w>;7#$fLAL$z# z=^q;&8XFlH8yNv`3=WMB4h|0wqAd0H_jdR7b}@AK_x23*^$z3q@W3$Y;sDO@H-Ow6 zB8&`;4h)U<503x?!y_ZZqa(v(BV%L3V`JkJ<3l53!xLlu!^6u_@aUWtbQrpBw|m#z#lT5e9`bJ~cK0OyWE`F+MyxIy^i&JTW;rHaR&uI)NAB zm>8QF#S^3BV`HOZV+aNJDO_^HISx!sahRBznwgxQWq^Y)H3Q7f%+AeD&rDBEPftxv zO-@ZsOifHoBFNFP$*G_C6Vr5K zY6_u^Pfbru&Cq+NW~YG3xv8nS>6y9dx%rv-g;`*MVSa&rE-cOg^NVwHi?g!}voi}b z6x+GU*~Qs8xaW`-!(-#aeO*0ZlEU2F)Wjrow1c4ygAN7?Mr?uL_|n1Q`HSaIo<4r? z+5Y?|DEt1ya*h?& zlR6mpVGi`_&;B7NCoACdcW7@lGSD#r_d)KnGPK%naqyeH=Pn$-`{=q@{5mR9l9QX- z*jUxm-93cjg3>WIGCnpsK91}}{){2}xh$HT8mH8pW|*0rlwxWUNd~N3nMQ7ov7DQn zoF1E;!g+#{cp44@%K&5s+(>j_n(|c&ghRk}Wc<`DvILlrVg`XAKtu^;cNFoVJex*d zQr1pPj{ztIQ&J#?a8KeV9IS9mj?auwAh)QvkmqqcLIrnXdRki4SbV0YX9?_CJiZJ> z7~hE3%`5{iof@Z7H8n9t80RoPg~G=H)nj~QR9d?(U-3XUVPtfK70OAZ3>9J|DT}AH z(9^4@rQp(mMTU#ghg;+aK3U?hubaT9&5Yv%Q3ts1<#GzK9j7#>5|6qwGcyg0PmHZ_ z)~_6p6wp?27q47#MPCOrf%oFfUA%n7t)jAGcx2epa`xkA>l*93`+72SsLUvbu6P5EqDRV2OqK>4ll8h3V;qx!L(SI#@}VLbSQOppq~*gPJxwKRW}*JREbg z3-fae^YaVyAcfia>Djp%RLJ?o*@@}#xy70JrMdZ~+4;qpxy5NI=*rye()7&2^uprw z{KE7+)$l32eR^6N+Z#7x+S;0CW+qY3QS)bKXFxi5Bc&K#F;8cJ709XC#c2TH%);}+ z?A+4AJj2}L{KA`goEMko7vC%_zL{TmyRh_jVfM}J(%ZR(xA@4J#W%ByZ$Te(^Y7*s z-pvDxZ|CRV&dtA>n`7|=v*2@xXqMQSb1%%zF)S|4%^@jf>DBNsyEHemIJ2-gyRLH`h%t8jFCF(icXW_M>tY{KyB#dG^7 z&z?Ve^7!uK`#(Io`~Ab8Zalbs^ScW+`}ghF*{1jHmnRO^uw?S28K7TStsDj8|iBs8|auCLEoo`fsO;m_8vX^wYBYuhfjV83-Zs& zOsTFY?d$6r92y!%Lpe&^hc*iIx6FOSH6PL6_{a2zqARjgQq@F75I@Tk|>E|WUwK7JLjK!e3=TlKxQbM z$(av9QGkdWqdy9bAf+4j_7(194x&E_mKsU=cKT!@Uo@&?0MQ>Pm6~E=y>Un`!~H{j z(h7gsxu~QF66+{h7bGd#ZzKzA-tk6MMYOk6+2*KZGoS`iBRnewtBT|SpzCO9(dtq( zW{K|@{Y@Zx#EA$NVb0G?&P}tHiJB8sW2(`!vuMwjImo%Ns1Wkh(D3lkFl4XcaR?~m zqsw<+LLJmU(1&=UU&CFzdes#jO01UE+wAF~Gh`~vTn-oAgsu=Mub(i?)*!xHD9VA(B> zdO#}(nSkhlp62ke@VWGE34qV{@87(82P^>}-b)?`iz|4)xb*YVoA*nL?-$>_fAjwR zTg2hbJ1!<%2ybwmi_hDi-@N;jIjh}wJ zar?)ccYnO~JTIZ*Z`GXk-X-`!FiO z@bK8^2!s@l0Y}GCD_C~{a?At)vOKx~Bt1=yjzQ)JARIu5CkdVtXwZ8gfrEa6o4AXd z^fyTY6vuSnKF|m1D#_qX(!rTyG}LMalKZBC6~ZFE0Dm!(LNZH5zp=6Dk@4x_=^4l= zka9-hSe5~qFt|*JM10fZIM0Cc5GzC&(Pok)8|z9dN{;F&%)O#SGV~lMKRWeG)OGH$w8IGf0rN6G$TJzd)t}_py!) zD3v=PB1+}HOPB5A6XKyiB^_B!WmR<*6holG3*9|$Q@8e*P6OiN230${}_2#awLqX`fbgc<^4LngeC z@U;R)SPSpoExvoZ@Q$Pv5Gmp?_jYLkwU@w1hxqF~(F8{y+!?pty$3iJSo#@mqMkQz z-*J5LX6Y@X61uXu%x>fv+yN?i1HSticndc9Kq#OX#)G)~24qA;1OIQ{bHFVw{I^ne zW5mShlKjIP1@-gKZvZf$6z|}mcye)IA-`F~x3DjI!{`sUh}u?2Z8=ubh~eiy-~IeC zet!2)29O=+_+LN2```b3|G)nE{-6JR51;RUe)k?x1v@XGo(#9Q)Rz_Ir6(uEhGTIX zW)xt8A+|Gp<$!JcUOsyA^xmV#Ki$1|>();&F|nez(_npw?F;2+juXdgk1bTR&ZS{QQpd z>lfi6lAP4kn#zjC+A64hTbk>7+M9dYnmU{7JDVFiS{tFZ>gZ@kUjRCy?%uYx?w0o6 zw(fzho`J5e{*Iph&cUJH{*eK~@W9yUFm;wkM#lz-KcNjB9_ShG>ly3q9vh2xr=Y`DkD4zCDJG-0JJ@?CwK^J9$?fm&t*WZJb}j1CCHIRLowy2beg2xA&4Wu994=pS zzy4ixV^bZJBhypk(^DhUlfyGpqcc+@Q&36`4lqF*dYiGSDI{wD*ii4p#K0t4m*G)# zvZqE!#)4QmHa@~Bo5m-hr5Z*fgkC%-cxYk(Y6tip9PJ;P9KjWm$3gTYo06P6JSJtX zbLVf^TzGu(lB1oS^Q9{;SFd{9xDgF?JQrbG+wbl_cpMWGjX}eh*ck5O#fuK*3NmTtNEt$n%GC7uEZRtD@5V+ZM$zsgQAcMc#-QVxpBSIVt?|)GWC!k!QzFky zjV;bo_hNQt;?3;T?DWJN>eMbQOinG$O)a8l4Z(kWbb4ZRX>OWCM)VcYTb-GjpP#}b zvuNF?M(3u-=BGzyrbm|MC+25Hr>F6CqqEba)03lkFEBefHZ?g4{p8fl@c6_K!{GQh zJ|7rChh&!eBxBR#C^jQg6QlTq*?BZKBNG!NlM};J6C-mF6yP2oMj!-)Ha!Z>67(YT z(-RBR6Z5kZh%o5v?flH!rFkYNzJ2?S@c!Lfa36uu-_QSiPu%w&0^rgc2*`6&BSU>H zjkWn%=@}_W;lY?Qf+=H|OpRR$?d`#R&lvaJ|KZ0wH#zS6;m4al{BZNfAHLsZX@#NM zHLF(t=?{PS4JrHnh2j1W7pU9&o8SKJuYXy;W|h9~mfcpyW@dUAjrX~6JNTT4@WTXTCC)bbcCt8VRT0Gd1Cp|Y-_qN%B( zrK!55v8uVgs;RE3v9_|gxvr(TzNNmVxrvQdHPwL>@L*GOU2{uA3+eb9;lOwo0^|S> zjZHQ6jn#GaRWT#4R^nV&SKZuP-vnS_t&RrPXg~}xMNlm? zN``^H+S;m`n#!7*ifW)5=kls*0Pf1_8bVENWqm^pUQtt5SzU*p6}7b$4Tv*hURPa@ zp+cPNYa1JD>luc)jtKn#9tcR@hZ|nccMLWBog2L?9miped#*UVHINDn3yW1Lj zJ6mZqs1qYPAmEcW_Z%{q3d8FY@wp5Hjb-#`Ym*#H6Mr6&L3tJ#}>#eib11Q&V&P^5y4= zNeSG~Lx-N8JZ1acjUOBxUt!`+ZcZlBvlGKaEf{IT$Y*^|Z$}TBsLqyd6tnimj*g~| zw#L?0l!vCS?k+T(G#u30h(XDgwnm_?P$VVy1QCw zjHIutpU^#k_OZWbaG-Y>V;^2SKmPQz#zt9`Ui&l1_pY7;b9`#F*J2U zgTq5K(l#`RHij;>5F4<6uc@ zn`asG&Q6ZZP7KdYkIca_2|6A_o5e5=#Szqt5S-sb4>*t3Y_z+xwXUWDQ+?v1qrx#Y z6>~>Du?F>(^Q))!&+k2ceEZ)0AMV`w{>R%le)#dmj|9-)cbhacHmqH<`t#2)Zh@iO z{{zwen_Jks7o)xC_I|N?m69TV&o0wlJB_S%nH)R3|N2Gi$9HeJJ3N#4c!mav!o!22 zVk5G0(+i7pfuiEP(&GF|nnl3PF~HPKP=G{jbp2PT#N!0=4-gO1iz=#snsP+1wz|B& zx}veB5|VN~&6EHwR@X{VMa)}MfuG>we@g)?7xVJ6Dr!obnroZEo1pKy%BK42=7#F_ zmIfNy#Q<+xYfTNND>O8L^qcD%n`=2V5bxL4;}!Jb6%^a*vWlt_O0n9C%G&bU2J~H# zQ>EZ#q!qXujEvL(HDiiJQ)6v&6CSQuiOH`V>6t0TWztUi=FKDf_P;uQ;=-}xS4~Zm z;1gG_Uw@dG6q}ls%su$cH#VnF|8(Z8z3qj-)U=dy=c&JJZk~Ghs~g9TojG#EZs$%v zT+!97d-lvREj^WcYRi`4ufF#D=G*U1ow|DV?4t{|l7igKMr!{W+Gxs1J=(3t#u_w= zXcf>pa%ZGNQ&SzLA2d@dh-9g6YN>B(t#53pYXh73l40$MAJuZ|6W?8_?6)*4x_&PVDRJ2L1I8pi2Q@zCmXXdH_A>l(Yf; z@YCDb4R=p_R}V(OJK%u>h!qkg(JS>BR)A?DguZ@4FSr$r8iqoFUUGwN3B8@mz(wNU zp8l?G0DX==^m5R-A@uck^|L7on5BTZ3Pa#-V6bOssAq7f8(o&cVW4M-7!#cmCKN+1 z9_}9=>H~e_3M26W5H4h1usLMs;URciVbVe3#Nk0m;>4R{Ba>sp3`3wl^iC!xhNi{` z(Q}xgo(lRaz$odLK#^1Erhxt+qE0N%PXlw)MS01w(Q(lcVVF>lMX1i$ z;rf}w^M{Wg-vRgCzVrPLw{L>}Zr{Fn_s;jnjvkQRunye!mp}g*QhnAIU0*(h(TYHSpD;|kjR}uUj7d(7&(2Td zreWsgrswBn78GJ)SAJn(etuC_MqX-OUItBD%fNgx%$UTy%Cz*nw2Y#(ywcpf(wyu9 z%tlMk&CH<5a5*^zm|uojZ@Jld#W{tgn97%5T9{W_1mu<>*!;|rqMV9iOrXRJ!R(5X z{QQ!<;*vc0EGo_^D#wf5Kn6_S%PXw_JC~GKmf&1kSzLxm zf)(t+ic$>7R#Y-nl!8pbFXfe`V9#oB3dp*u9Ov4qa^g@hEEteLYztCm3=5LQFkVP9GLNgr8s!HjM55ZTL6d<-BK|~ufA1fiW5*tzs zkyc!kPMvxf79Nt18I48xKyg_?SyfqSWeIopU(b8@W;!}K#>K_`>#cL=#L1YG9Gk17 z^NaCc_|()~xN%b)5gA%gn9n_EYAWqkb3bit1F|zyYpKO5NA&P@Xhi^|DwDpez~Btk z=w8$|kg#9dSOZ5benR|5C!ndO0n7+0B*0PE(ndWMptTLm*x1xs+t^y$)K*)E2OFzu zAkNp+P~bJ_7SuM?)gd?0v?G0Rku@sim1ymnYie5X0tAR@Np$&_6A9W~?X6JibamoqYgcz0fw&T9sC^i^p?D#5b+rGvW-yIfaUU_@)D*Z6BsfNzbm#{N=+xu! zK1@%9tdpCaoD`4sE8+lHm~(yY`r7{0izkmB-MxDc+;{7T+YtST_yEHlTQ;s+^Tp?% z{_d0iyX71!l(*ubZtrhD`Rs3h!Tdmd?QQ$4cI~w=J$dNRgB#bL-n;+G{;8YuYb=0; zb*0Ftkm$IGnE1$qM9ip%RQ4-rX=AF$9OJ_$&`qKBlo znAE8F^r)ERnAoJ4loZUgr`hu9X-R1*NthR%l8Tx2Nh#?`scEU0>4Vw#KuThAR$4OV z+^3}{LlVxw6!+}ZjO>)moV3h>)b!lcl#Jx`tW@x3eohu~C{5JO#&q4>?92jO%*Ex* zyxc6vP1$*A;7t%^ettG)QfB9*=jLVR<&8#lLU zrOqp(slJ#{T@Las$}7pkwD^?t^khs?PQ_e(d`ospT4rKeR#I9-TbH<{EaI8P4Wn1A%DT$ag&E0+aEO-C@-fdeKpvBYEo3XR2 z#WE@^p~%e23x^MPxw$8yXyxW*m6l2+ z%DAMM2ajrZ?wZir{04!fq$g5SR9Re6jrOg$63s?+353}SkUMLf;9vqZkz-YDc?CSw zmX}wTfu11hR@YaOUZTFb29CN4&QXRL?U-p_T*QvTvg)G35;Wvs`J7x7nEdSgB3iML zpN}Ge_J-v*^1cu=?hElOO{m9|c(g_|g}xZ=A9Wzm8>ql+>k?>1pw@uY4-vbzzPz@+ zqM@~}p{=gIrK-BVyuQAosj;#NS_tTK+Ui?dp)vyh)&uz2)KTBu*$DqF&>%HILsHWL zMMQf`H&p7Kpi9gXZEo+tY|Z*ccy4QG>1u56Ztm!A?Cfgj>T2ljtnKM+Y;UgXh3MMd z1}g08ZiOzs2m0;4_O8C>p8j^Ir=eb_&U-(UC)B&gnG-yz-#tK72tZ@rH$Z}94^d}F zKS;A56K0!RyPMmL z4L}=&?&f*`3W*L38ni$YRGFQP$?S2_;X%OxK7MXaF0Y3Nr|*Bd z^Zny{KU}go4XdIX*M0#D_5VMGJ}@A-58d9s{^?J!YoM&CxZA>Xx4Fr;hY#NV?%IRf zKRkK#0Lx1}+}yC(4lCFqus|(3Bq}B>CMGN{HaspC>y09@8Z9g`C^9-MGCDLWIyfpS zBnlJ$u~v%KIYvfAg+|1LM#P1L;T#(pn;0FR5Sx%dOT>VDS5*r>P|AU-}WDJeE739Fdml2a0ZxP;ia#Mt=c*rb%0l;qg7l-R74)a;a$?9`O3 z)YPn0;?v~RgxHjr7_3A}iAzkSg-W;x21!W+5)-jTC?hF7GdU?EJ{jvNG7?hK6HXU69gWTj;$XJCC#25}LlBjx0Rx{{N!k`i;V_$e+iB_3Qx1eBQ! z!6YRqHX$)8At5RuDJDJv-y4I)b}=#0n8cJ6ADc)E;o|U#vC)x<3HZ7g1dF$0tqjKz zM~}OSCH`1O2kK8wNlqcafiIxdR>_HIIg-*dk~1=sQ}Gq4@jzNSTA+lC^n^6DE=e(I zsfpK=QLOxf;tw;6FDf z7fW$+a;5Bc_$!+uM{XQHe(%_^`^S&nJAVA(wGSZ>Q!wM)`1Vsx> zh?4W!YA37};XdlbNw1Kw5UfQ@NyjoTya=mDup9;JJJNE{TgcAL&CWnug(WapFN2;$ zQ3L(jKE!Y|EkxhobjIey?B!U}L$nTIwxY5GC@;s79_f0X zvg%UsAh@!s1}vFhUXfc~QBYQ1P+AN|L$3urjC>C0z2u=Qk_!(IshL=h1s@n{0mXvq zumFfH7lJfiRPg_{_ub)f9rv~07qb%tiAEAc-(3LP7r-t$QAmI!02cJ#d+z{Iw*XtQ zSnQ(r-g{;5y;*W(S+-Of`*r`lZ}U@ z=0SX!?xVnXh|=Qu{UsxPJ8P#lvT4EqO*R ze?;mi_t0kYoHW|NUyYROs4F~1b>Z3lCr?24_nrce9z1yhPbn0!x9>h66}1QVZ$5c) z>*=Fgj~?87{O~3!I**^C=5+7TL%8HTefk_$IhtJ%vio?4TbI|C=BH5C9D*)ti>$px z-rQKzSYK6JTTxq6-cVPGan2z@C+w^(p-{hT=YQ4cBiyH_zn!~wm>e>uT3ZMD`@!yu zj|?p<$g8_pB@qjy&{++$yP;7#Ha<8x zF$Bk67ziUooOTpytZ?`rpBWvUhI=POZwGK>c%*-H1PzGr0EK|pI6TzH;LAKYGCe&$ zH8VCnGd=~E?RnT3BcszpSPxGPP0i1swQ+nAj;^C4)59ZkBJFuZE0lwsQ$nZy=L2JPL z!u0CK!rI0n+)U9|kFsH59!~_wIdgOH*PR+i%w}f6>hp8N_jCbXr5l@9Z#~?)dVk~c zo%OAk70iigP~DyD*Pj4eTUX%8xvw@$*B{)v^6=K?gWFq=Z{2vd zebxNJ>gCH|)@zrqz$f&^l`GdbVf4axZws+nym|c!Y<5`gU=jG3UcQ8YUV(odT<>n& zx_o&H^a^`<sU$?x31f9u|@ z8+UG8g%x@I=EjX1aE66P?8>zpFr1fHw&1NjOPqffm*7~9A{g$i+y005;GcT^*5&!@ z;{(@5`mYW4-sIw}1 zt(7f&otu|Y6ydyUx39ze+`4&X_0rnfr8W52ZsIecx`V>z+9mkRzz6sy3Xm;QL%Mza z@{Jp0=i24o#ga zTi36w-Mw?=-W_;fUb=Jp3R;|Q-+^c2#@!oNaL)bP*Y4j#@p<*u?XA0auRpwd1C@mP zchRo3h2|+#9Uk04S&7uPiThu_d+o~I%^UYgjSQ8on>VlBx^wOJ-5dHQuPvmpEmZrq z^yMI2I&Yz*yngTA4ZIK}MP$I~DKG>Cf^|I_l~&#)7uGe_Rf79!YRl_uE6PhUcpQ6c z%frS-2T^DJue9{NS?xuWpP}Iav>oyo^q>I$$k4O7>8UkkrH%EqBC${=Z_>0Xx;ops zyP@LV-i39yuCKQPF6vnKKoqYVs)poOA~Dz9**^ev5F*x06p?$|J9=~-y}FM6_MU-G zqD9`{rKeHI7eWK2tDoo)^>q*R^bA2Oq<08>58a>PzCr8)!@Yfw4Il35g?{HiPv<~) z2Smsqm^0EhFflYRJq+}XLwmeu02GWhFw#3ZF)#?Ko$eo+>>HgL7?~Ix9fL{-*m(?E zi7-Hjp!hgM#0H_=Gd3|WF*Pze-VZ>UVR8!Rj7?5Kb-aIid>G>`r^be1-ooY`8-tGW z;K+yDFP^3=z%sm=(m6nh9G@DK0Y)&Iyf~+1RcmZP(epG=LEtrIz2tN zwsv!7=4z{IB{z3GDy%Q!Tz}Z@Z8;h$Oi)&lZgdhjkHWyI=2i7*`LFI4q-J9D3gMASD z08y9B>vTv4M{n|QAljAtPo3oY3NNdJRgR5+z)ZTlX&W0Y5arIq}!Ut2WwN$E?q_`^$;F1Ff$t zkSZDs2Ba%g+R&)AvV=yh<<0e#EyA;C`&!;yMfGb5C$DYHEG$khZp>_KOkcXRba`|6 z()v8Yc^Qp1n`=mEi)+&)kQ*!Wt4l;yWOWH{>kv0ogYsbXU92gqs46&n_N0xCIcDPByJr{btbZx@!NJ2|-ySP-b12q(xvmjkZ&*=^$wBRJV0$+PgFzU2Q!e%FebPA_a@tH6Q{Gac3==a-$oH(AwUYfHbrY z2Rp%=V9y@?6djnQqf4vnCfgl79i0HqfnsTIJ9xIQp8zu)boO<24s>=7lQq%o8z3T} z&_E-?ir{PP4s{I-bq@?fR)i?+Z-Zu(N1oW%(+>WJbQZL^#z!Zh#?;j_Ra)8^ z6Qw=jrw#O*N(g_D8UA)o#CP&yzgv*-VNuFQ<0sW=pOnXaoE!OJR@gh4 zVb3pSzfjdbAJM&-ns_!besy$ov43!)Z*Zcg56bdHEDFZ+B;O zErov*qo8tRMa(pTQ$`^;1%>?CvB`N@qNCvbnT7F5*xJNAhtw6+oCZMIW0TNzg6te{-#XYIuAYYG32CF+xCO>F zq^~B1N2i9zruxSx2PP&4#wP}lmmnsF@S|*k^_2zq z4F&qI2K(QRKKFJ~*axMlpH^l5rY`3n8}j~9nEzXG@ozd7+KN2AQB}C9)m)yMzA`nl1+5&Ei+Id1q)A4Hp_vDTE~s%q^bD^Q5@e&3!zhU- zr$-^&G&Vdy^tB*;1a+DkfgxlvpQvtV>=0Iw73KsX&zTV$RDL~nL_ zY!m`vsHLF{9-5pSoEYyL8}FN*=$n~B9Q#QHZhCZPdT@4XY-VzFW)f>?bWBVWm1bmu zu~9^JdKmRNGED+7HiS4%LcnN#YI=5T1X6+{y}dnJtwyO*NMw>aQC%gRI;yKm@`}?U zV?vosnz=bXkgF9+wOp>2t2GL(PKDTFqeG+Y1hk4ajY6f8;z1gX zO4IfV8l|R9+1jRRZEI=Osx@tDjk={()6&{P9*td9tGY#_QR_5nO)CVxG3AlA6Mj>= zHl0?ZZPn=1+Rj!0A!)^21f3d!4xm+siF(>v@RO#qRo&jI*0r>@t2^5vtkj09K)%{O zZCkfi-O<|C34U+y?d<69>=@|k#Pl$I?VXq*29n+A-^5>?7H>hJZc(*sHQ+#4!;*Ss zR7gIbo$ktMJmohR=yxN~_i2FF6JMwM{!aJ3S&vRTf9t&WcSC)@7k=`GDdC?~Xa1vB z^jUk;=Uvjzb)wHMX8l7-_(ut0Z^cJEDa(7(+5UWR_+j7RN_XExcP}v3-8J0Vr6**} zuLRnL9j=88HsNSY$OCCfy$#+01|J;43_K`ox-k0+)C3{Fh-Qo-BCQ9SALtzHN36P0 zW)O{f81KFM1Wii2`wI(K;oJtDJ!mB&+@y-piIENvK86e|tbGV~VmgyyM4`K{y?3BvavZWp?cJo* z)IpaUld)i?95UrWyQaSvWh7M7+w>ajTFkI8*wKr!3A_ifK};e9B`v9RJSkq`=3M5? zC=;+WCy&pEp12+Cf7gqB+mmtMoAJz#_00hG2j`rA9OwP(ymS8~%KmMi5s>m2SK!t6(5{UeyW zrN3u{G&l8*4)hH5cMbM+Vq>ruLd&h4U9G5Hq1bL8(rO3VbVF@ecl2w!h5=pIkhZg* zpsOF20?84bUC_D5q%|GAeVu)SU44VyDB3#*Iyy1C*C6iG*@fNSc1%&#L+1V>)(mF6 z(ZLq$)3zgt^>u8^R+7@4*b=DJk?C)U_%mdliSj(!+3F_9?SI=b6B zd$dTWFckWT@-RM-rcI;K$Zx2xYZTUtnuOwJ zQB$)-x{W4@q)FV=BvLj@(I29cN@Y@sR4Qqf3Y!&@COxDwi9#V!DkM^g2<|CTr3h%2 zi<;yjiCkPKYp9jh)ha{{7{Vh3#7booc)m#{5z8bZ=+`uh#Z6*K6S=Ki*@RzlE2Uhb zf)OfjQp%f^aw*nw$lb`LGI_HeO{k&E6jH*}Dw$FRK?s#f(;|ifwxUU@kSUZh1+G#^ zRce{4RnejWL1ROvR?AviWNJX8XwkN)v@OzBP_tB_0u(JRDm9q34KjA>rj{mYOS4pk zJK(5B-HHnoGPO+JDwQb2BAKX3){J){SISzUM5bYc}V}IT!kzT(@5BVP#lYckS`uXy} z7ZcrIXe6Ii)W;%S@uj#hJ3t(;IRM_ZKr>Q*T3btAWF zlpQS!okEVe+<-Q@OxvPpZ&B$~%2sWQPNmQ)l$)DSw-v z^0cx1sY>>2u>Z->;KSje+kJi4bX^PDj%jWCI4DBh)~{;mYf<+pWu0=VM&7Jd%5+kh zwy8-gk+q3{=2o!`)6TU@^^w(}2tv_^ct8@Vt-q~pT&)?G%g37}<0S0*7^1hpX=NyWWhq{8{gv=Kdg3@Y7iLU&VU=CNJc- z%|)LLX}(yU_}A6xFBXPBA8-3iBl=x+-ruL5`@o-n%at+g%9Q(gNXrU`+O?xy9Yc79 znzk0T5(Ry8i?XRj+1#RPMioj$N_~}5O`P_DR<%l{mMQ^_RM9S1b|{tYDwR&zrfX@_ z;(MU5SE_XiRjXX7mML3gsuq%5Th-FG)@H4yS*MZfTI4!avrg5dZIQI8#2TfjMIn+a zL<+fBDgz{dOxA=YN+wpyMKZZaDi<~rkbEk|5t&dS6UwAQiBu?R z77Ck1fT&3%ZW1ByOJ73RENN_(G?2k4qS^*M8pU-&ah*t12lYL4)HVt0B_gO%)d_{Q z4Z@nb#*4M})it$MH8oX@HI>4eN^wo4q_(1|wp>zMCaf-LtSqc5fofl7c4}gBTxdc} zXxN2wTn@|J{HTek$=gwxpTD7R5s-eCH zSBT)7grhZZO%c}Bi1AV+_)}TYSYFXwTOp~f7S_~=>*^$UcMbI-A+D`$Xs98muWP6m zHa3VG>zgHbi8azDyl7#gSXe7=tP=sX5=nyu>?x{ik_Zt7iKrHuU!*U*S=i9rP>-QH z%?)+p+D1v8u&EIYE87N`ysi#EN*YCC44;%r8l+8iQc1n6xvm+FtF`r#+D4gBEUIq; zok{UMYwHkMQGKJVK`0lBYSJwC#KGc(e1*R6fhRt>8l>}4LAChJNXhG2w0$w%_r+B27h_#t^eet-7k}PT|2u{7H%j5B%K9I*Nd8W% z_)sHzU)A_bUUyq5ywM`Nrjo9!#PcfYoI*Cy)Z8Z&b~Mzqi-jHXrf!+6Lo8~ONp*55 zn6X2t=vFCuL7J_~!B*vPi*m3I4g*~Kah}5r&vDL)zUsud?8LmuXFosA`@rA%!vOvdgIs?U zfAYtb=|3NkeKytm`E>8+V8Ee{-*qbgsa5><@~WRoD!wnRcwb)io~rs=Ef?R>s=ldf zd%IQsSSh+KZMY^EUu}`!P&8kXH?7N?R;8jPv1magniosvgu=PT#u;(bd{gs+Qn}LB zx~A1^Dq2<>>lZ5W=JKBT{b|hUpH=7mbD#3_9_8mc z*}t?2f7jaZ&s8bEOga1ES&wg>bbjE;-gHIT#%yxq)(4-i%gRz!S1GD0C6yHg6%~0E zZ1rA0-hg~g?XrDcVs?%ZrN33d+iIE6Vb#$_g%)<^wgQxpigv4dwX_6$SMb z1$E^G4LBz+w z?=PmkS2rN^w_^wHd&tn>puv7q6T@T2Or2TGGXck=E(E1S#^h&Z=jG(&=4I#PW+UD? zd0DwYepY@#RzX2_QDIJTVP08berZubS#e=`WpQyyVQEQWSxHejP+D41SzcaNQe9Sd zv7)TDyri;;!pcudxswl3gD6Xm~fxli=Wl3duaYZ$nHY>`?a5+JBB@UEV zmX%eMmzGzQRMnPM)m4|)Rh8CNmeiE%QCeDCQCd|}j?SQ}lCsJYB$2X;BBZv;isFk^ z<+U{xHAD)ctgfb_vF2jk#mbA7rRX;*D=R4}FDb4lEv_srsVXb4Dy_y(wN)2uD$1)% zD{3k#Ys;$ZDr@TDR9IDBQ&Lui^j8EqvFgg=`l`}~x~kgBvYN`Wi#4SeFP7AT?HhzK zkx2{(H@dwaixI97ZLVDdI9)c#L*uMvn`lPe30M&_@N1#ff*zQ*YH|-n^J`r8Iq|Jaef$d#<{0uD)`%zGAkqa#nJ2 zwyAbjTsK)=)?b|0Rg~3PklCG+(Uo+*B_gQ#d|;iQ^F`btR7*%AScTo;FoKZ76wIUGShX?_PP%y{fExrRjG{ zQg7wPUrCQ#P7Pmh8TuKM%&&6ThmA>K0y6(fh>&YL#bsV( zI;IQQ=|O?nNr|~BNtvlhNoh$b>B&i1$%$Dh@u?|sDFm@VYD!E>N=#}h5Sx}3m!2A* zNsvI05}%P0pPn3-mK>Lw5}yL3CID%vxMN~Q3QkDKPD#j3P0CG;&r6HT1=8d4GJyE} zjQE0#guIl5yrj6IZGm~S|lA{vh!c$_yvy)=8lVY;d;&U?Mb21aK&PDearX}X2C&nd3#wSK4CPpE&X>pO6QQ>(p5&6;KnNeYh zQK7LwTv%*EWE?psHVNF97!w~G<$uzb&1D_4JO$tsY{;4O=Ym2n1c!&6jf^-K6>&Z) z{6b_{XaoV~^$m}Vh=_`ejERhljf#wo27gD!#ze-&L?S*3v0!upY+x6Ni;Ienk4lV> zN&*rhfy6|-sfgHwh?uzW=$P>6=!h8oed1!GVTvZi$0Q_dBRU}=Dj_jCQ4eeY@%lB6 zBqhb9B*$(eIXN~dIW{3VCN3#DHZdwXJ~BEkA}TgKIxajWE+Q@=lH4STT#}SXkcd~G z7!#Km9h(pp1H?xHvGGyy3HUbA$%)Y^iP5PEQK|7!X>mYwT6_$eBvKROk`v-j_ysZ< z9xTQw4kwPoN#U?EIjkHGvw*`a_)c`td!YgEp7(zz$nzV%ygRO( zbv}EN&+6kdI$_QT=*=+D+}VK8o!#ips`KF1dU7v%ajU(!RbJe3PgcG=GuzcMQ(< zqh;`DSZ6sCWINesaU8NZ^ehe|pTj8NIApWw*&NIb$jE2YaRl>2=QHUA4)%HW)O@O4 zE{&4!Kq+*vD{!#MbFj^!+vPH-`7DPbF1?h?sOB+6PAsW2TkgVE^I2U2cApz(*qt-$ z!CCRk=-gRaPi~tBN9nmNGV)Zw*)xH`A!mY-ea;4-3JwYgK7BIi)QR9z zC*V?b?o0px*V2&FG?ihCE@4lBQFS} z!^JUCO>r^G*cf$Wg!=r2)^q3Eg3q>jda9kAWlqlRJa!L{HSENiabnH6u$K6o6#>CG zpEJVebo1FtKD$xCt8wL(x$#QfImIrl6i0{iG@ElY>mb11Cdl6QG|lED&DM`b^|Pm9 z?N6tkaHO1|QT(YC967&NK|x=BeqT;@Z^-!; zKDUv>67$)e9^45x?t~Y2QUGu!_4GaF!Ww{?#%I>JvM#!@%H7!|E)E&?R_7e7LL97u z9T0w-(^Ts~JKF#|+Y@%S{uCQO2RnZz#h*nXu>c&XCz#ZePWGo<>1SP;q0Wp@Cq_7r z8O>v-aM@XGRu+qu#$;wP>6r{i1U?TWNT=m6Y1u4Vwllln)bY~T(1yyA&Wjb@4RzfL z`K(wpTiZBORX1H(Gg(zPRVP{$NmdIA$IhKsdblYC9EBT4?au9V=k~gD`dm33u55)H zyTOfJro$P!y?|!Vq}nrCY&Mt1n;TDH2EX^$e3p2|jrWQv`%@3QRU*nLW z;ohCQ&>=x+55)K93AX(C{P_C}xMT00J^S|?80^_|V9y>y;J^XH0|p4vp+g5S!qCLT z$kfEh%+wfbz{Hrq)WjGa#|ZinGc$t2W)KPlhr0vVyGgA{&a$9m|+#i|^N6bu*;#Nn@aL%zKW)?>dTbduiwP>cawj{tP zMZng|!Vc-i)|z5xL!sE(Q7{X!jg6hPwGC$Fw6uT;Z2_3Wmd38Nt+gG+mP(`0?5PAa z3YBI@q2elATRR&YTWcE|D;pbYJ6jv7ot-^pJH=2PC=`1;Ozughc1Qm>KCwNOVo#$% z1ls{qKRLRvSpiPGXlJKXXI_RAH>56&jL*yCb3nKk=#2A@j1V_LsJ&w#)rL#8=F+UW6s#!#hib#7*)nN%bc&55 z#n!>j#sST|wswx_>$0_CT3fKJEjYH;ZZtb@4&$5?C&h`A%3~+$jf`j;z%Q zXW|k&T%D?2xEDc%d~Oq;)68cBO?+0P3#-PNnIm9ky4XjsYy#=F{`OYx6ic4HCDY!D zL9=$GSUXrAv$wV&Y+$F)^7zzt_&DS{kWWFip)u^}Tze;HM*+v)jY)N9+8<}rPji?d zY-T8n6~|$vu$d`rdJ31G=FCVJuu|Ndk^+2FP6wwXq~y!hol6_nTQprNO;`KitZr~l zJ20#3Cur}-G)U_hLcO$hd3aEE*#N1CxUXO^l5RjEszsztHpq?Av?j z0Ggo;4saS?ArcAek1pOeN)6>`|ddS>Xes% z-w1<#^Hsq0&)Ttj$Bx~*cI@6s?hN4DV8JKay?f`LJ-ZFiT54(nR&=z7aqR8HIpxAj zb_^Ze5;P--27o z^wQcKhML}eaQXJlskw!=j$XB{r?yU)m?8`gF6O)C2%HNAPDKJ9P$=N$y09}i4i{)P zeiSPYJ4-&r#)W3@Z13Pgv1Qs=T3K0OL?{ZNBdA8095pjEL=k0bid2ghWHS>}V`Jn& zLw)`;LWykR*a^jo^tGaL_1TJAtE&+VklkR>2L80d= z>MAhhD&zp(ej9GA(BOIS{h_~E-B{@r^Ye)JtUe%`(RV0w0Wd~R`U zW?7~i$t{uig=DySr1PCpoLOtgY1HhgNKX`8XUxLM@&pm(3&4XX=-U}X-l!Rr`phME$B3B zjw98b<>=3$2lD8rU6^MC%rl<6pyM7vfdRp3X=%fweRrSS{#$s%>haF^zx(bFe)#Q= zKK{-R2|oDIC*S}0llQ*&?w!YX;e7x z?O}b4ZEj{|bjS>Bvz?7eQbGFBCmw8&jIB>UWKFWUewPg3*g+Bu+!nja6U!njSk}ZD3b_5Z95sw}af47OL` zui;Mc``W#G*X~_Ackg@!L}45HWWW8>9;E->yY}qdg^7Un;LKOKWA_ehZv$89H*gh+ zEQ#;-ibS7;PX7`};9q8R5-&Xsed*@jpT&$g8AQCzkN?T_D`q4y`i~a!RsZBdNcWB9 zRqA+|OkV%;Z^yCq#`4GaeElPN?A7iUg@6DNSnJ;~*saB@D$b3x_#WLQLGOnRJ1(X@5z%6EVK;dej&yAMA8=z~un z@A=7xKmXZBpZ?-Uzx)(x#h?C=N)%-IWBPVI3E&} zlaW?bT>?Md7tf!(2T?p|I6@!gohR>q^Vx?VeB*~d`1Vgf`u?Xs{^*xK`N^+-{)=Dz z>=#hK!^Dz(W4%)g(=&^67!TgqEH5spj)_V;;U3O)@UXWL*jlnE77o@Hc1O)I5zP@; z0eki!Pa(7F-!SsGKJRY_n1op$5#-?QpOLKy(IBtx-h(QO;XXs71F))0j+z{{ItoJ{ z({nkXp2u?JI3f7Ud7^N%75ed z_U6m1u${VI?z}$f_2t_S`VV6F=Tg%DvF8(;^*>9O|86AoH~A0V*uVGlpDaE8y^~)a z*W20K*7oZ&|F_W~-xOJoC`6c=SzB2<+SBaq(0W7Ta``^qC;a?QRM%8D%9?}sm`^3=1-1y82yxtbpFRk6Uefh!TJI}uU2nrd{wti$H z{ey!TdW{i1g{7rgxh0++r)?~0HkK62qZUU^52GG|Dg*Rv_klC^q6{W%pig}IoVT6m zknsQ1@;V>le3Zq61o!NPz^#c9j44wLskgN_hGt)PzE|Xh&}N|+LjvUr%&8^DRH_(e zq-#_4_jits^o@@V%uI~VPr!w20_z3%XpF%jItQxlj-8t#G6)*x~ln5TCE zA{&cy(CZkRo*0}M=^q}1Yo|`9Ytbs2)H0D;DlE!Lv$L^;pD0Q}gyB!U=2ypFCG*#* z`qhEI#@|<|`VTCa?bQ8m2Vd`h2^)WnXnysKzup@_x+Yl^=E=?-2Mr7kn;0EEY;0v= z$!0RV+&x0iht<~B)YaBv7M4Z~`&P-dZ7MX3_4V`&5BE)u3{H;?&x{YwP7KXY4=>D& z%)>(nvzE`m&uMmUVRm{Rd2S3&%I)214EV07sZ7sIb#rw;iasgB1AF)GL4MQMTwZ5< z6tu*2-Co{EzJL0Kyv~H%=i^ensRC1r7*l(9??M|Dj4=+=G3Zo4R76BlQc`Am8pc10 zM1=d`{;0t4T{VVwE84Uz9Xd^SySBGO*VloTzcv_Fy*do*mDE+1)>f8cfLL@~WK>kB zudjy_kI81zXm(a+W+ny(`|vD6y(H+b!~QA;Z_mtzEj-Zk@WTP1Vt= zXjjYIS}>$vq?9&dRA^~gPEuxMY}kd!&>(+-z}1CG1@Rp)K(T=*z6|sqh4ZTeU%i3< zH{ZZ^ir>y`V2ypdcONo5fCgZ6sQGw%hnxwBj0nrlPA@FTt*$D=2*IX?T6I%Xn^LY* z%G%++pptf}rQNO4ZjG!`#)0lJK6D6ehc?z$d}rrV0Rd-%gJMI^<>sUp z6=ao_6_i&NRa6vKlowW(5mc2HR+kjklor;O71fm&*Hx5kb6-wcqL+sN{ax@=I%0Yd zJ!5EbKVYyAW*Q##ioX7fA^*e6UfqrqOQdmZ2YLz6Q->nsh?y~)MhWygehMQ4ZO*KAf|o$_m~(TJbKjF(!w0w{A`A!Gnb7y zQbGgIq{m}KXhKm&N@-SFc}{wH4%Vrq*(t@@DFqlhpOKuEmJ}I!{)C^8zwdE26N3<} ztgXz^Cyw@iWMI9a1inDFCeQpb-t8;uAg%7O$9C`9g)9#1$<*l3QBxDE!$<7w%pDwU zISjfJhCs1dEOI8J-1t32$hp|L$u8AMw1*Of>8wM4YD|T6rvtB78aQF+8%xSH1t{7 z>p`Q_XbdWqPNC54>>O-u?5!+qkD(0!<1mbj4jnYy4?~Z1xeJ9vNzX5&wCdp}kL#mCKM0pQd;0g52@cYqYX^c@$6e|m=wUxUQM-R3ekA=ZgE*v_K z<-nrT933baOk<640vI>6ozM1@raXP`8>!=hF}AIYFNgPj@0}n^Z%2o80)jh8m%{FS zdv+U=!4?==VFW4wA;X?BH8ucDj17zr7?>V9Xl86=cJSaaP|OiCjA{bQn322R_vYZrhM z@C8sq$K9~JE+oE$P=9sHuin7_ZExTuUl2os^a3NZAj6YPg=|K8Ble(E)nFgGC-xZ{ z>^H<{tOEuB8AN%&;D7;!R_;eHEgY`*?m=}^&z!iLvwvTo4aEa}(}<%^QE6XuPIBJQ%e5 sngO>z4SIRd+f6_`iC}pZ5m-7xae51ONa4 diff --git a/uisimulator/buttonmap/SOURCES b/uisimulator/buttonmap/SOURCES index b372407b4a..03d4d7caff 100644 --- a/uisimulator/buttonmap/SOURCES +++ b/uisimulator/buttonmap/SOURCES @@ -15,8 +15,6 @@ ipod.c iriver-h10.c #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD) iriver-h100_h300.c -#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD -iriver-ifp7xx.c #elif CONFIG_KEYPAD == SANSA_C200_PAD sansa-c200.c #elif CONFIG_KEYPAD == SANSA_CLIP_PAD diff --git a/uisimulator/buttonmap/iriver-ifp7xx.c b/uisimulator/buttonmap/iriver-ifp7xx.c deleted file mode 100644 index 97f29c7376..0000000000 --- a/uisimulator/buttonmap/iriver-ifp7xx.c +++ /dev/null @@ -1,71 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2006 Dan Everton - * - * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ - - -#include -#include "button.h" -#include "buttonmap.h" - -int key_to_button(int keyboard_button) -{ - int new_btn = BUTTON_NONE; - switch (keyboard_button) - { - case SDLK_KP4: - case SDLK_LEFT: - new_btn = BUTTON_LEFT; - break; - case SDLK_KP6: - case SDLK_RIGHT: - new_btn = BUTTON_RIGHT; - break; - case SDLK_KP8: - case SDLK_UP: - new_btn = BUTTON_UP; - break; - case SDLK_KP2: - case SDLK_DOWN: - new_btn = BUTTON_DOWN; - break; - case SDLK_KP_PLUS: - case SDLK_F8: - new_btn = BUTTON_PLAY; - break; - case SDLK_KP_ENTER: - case SDLK_RETURN: - case SDLK_a: - new_btn = BUTTON_EQ; - break; - case SDLK_KP5: - case SDLK_SPACE: - new_btn = BUTTON_SELECT; - break; - case SDLK_KP_PERIOD: - case SDLK_INSERT: - new_btn = BUTTON_MODE; - break; - } - return new_btn; -} - -struct button_map bm[] = { - { 0, 0, 0, 0, "None" } -};