diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index ed31f6bf..51be1c18 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -8,8 +8,10 @@ jobs: linux: runs-on: ubuntu-latest steps: - - run: sudo apt-get install -y libusb-1.0-0-dev libzmq3-dev meson libsdl2-dev - - uses: actions/checkout@v3 + - run: sudo apt-get update + - run: sudo apt-get install -y libusb-1.0-0-dev libzmq3-dev meson libsdl2-dev libdwarf-dev libdw-dev libelf-dev libcapstone-dev python3-pip ninja-build + - run: sudo pip3 install meson==1.2.0 + - uses: actions/checkout@v4 - run: meson setup ./build - run: ninja -C ./build - run: meson install -C ./build --destdir ./install diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 6e67555f..c49a190d 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -20,10 +20,12 @@ jobs: mingw-w64-x86_64-toolchain mingw-w64-x86_64-zeromq mingw-w64-x86_64-SDL2 + mingw-w64-x86_64-libelf git zip mingw-w64-x86_64-meson mingw-w64-x86_64-autotools + mingw-w64-x86_64-ca-certificates - uses: actions/checkout@v3 with: path: ./orbuculum diff --git a/COPYING b/COPYING deleted file mode 100644 index 665eeea0..00000000 --- a/COPYING +++ /dev/null @@ -1,37 +0,0 @@ -The BSD 3 Clause License applies to all files in this distribution unless -specifically indicated in the head of any specific file or in a file -called LICENSE in a specific directory (affecting that directory and all -of its descendants). - -Specifically, please take note that SUMP2 has different licencing; - -The FPGA for SUMP2 in orbtrace/src/sump2 is under CERN Open Hardware Licence V1.2 - -Sump2 itself is GPL and is downloadable directly from Kevin Hubbards site at -https://blackmesalabs.wordpress.com/2016/10/24/sump2-96-msps-logic-analyzer-for-22/ - -BSD License -=========== - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the names Orbtrace, Orbuculum nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Inc/cobs.h b/Inc/cobs.h new file mode 100644 index 00000000..ee52e904 --- /dev/null +++ b/Inc/cobs.h @@ -0,0 +1,70 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ + +/* + * COBS Module + * =========== + * + */ + +#ifndef _COBS_ +#define _COBS_ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define COBS_FRONTMATTER (10) +#define COBS_MAX_PACKET_LEN (4096) +#define COBS_SYNC_CHAR (0) +#define COBS_OVERALL_MAX_PACKET_LEN (COBS_MAX_PACKET_LEN+COBS_FRONTMATTER) +#define COBS_MAX_ENC_PACKET_LEN (COBS_OVERALL_MAX_PACKET_LEN + COBS_OVERALL_MAX_PACKET_LEN / 254) + +enum COBSPumpState +{ + COBS_IDLE, + COBS_RXING +}; + +struct Frame +{ + unsigned int len; /* Received length (after pre-processing) */ + uint8_t d[COBS_MAX_ENC_PACKET_LEN]; /* ...the data itself + room for worst case overhead */ +}; + +struct COBS +{ + struct Frame f; /* Decoded frame currently under construction */ + enum COBSPumpState s; + int intervalCount; + bool maxCount; + int error; + struct Frame partf; /* Partial frame that is being collected */ + bool selfAllocated; /* Flag indicating that memory was allocated by the library */ +}; + +#define COBS_EOP_LEN (1) +extern const uint8_t cobs_eop[COBS_EOP_LEN]; + +// ==================================================================================================== + +const uint8_t *COBSgetFrameExtent( const uint8_t *inputEnc, int len ); +bool COBSSimpleDecode( const uint8_t *inputEnc, int len, struct Frame *o ); +bool COBSisEOFRAME( const uint8_t *inputEnc ); + +void COBSEncode( const uint8_t *frontMsg, int lfront, const uint8_t *backMsg, int lback, const uint8_t *inputMsg, int lmsg, struct Frame *o ); + +/* Context free functions */ +void COBSPump( struct COBS *t, const uint8_t *incoming, int len, + void ( *packetRxed )( struct Frame *p, void *param ), + void *param ); +void COBSDelete( struct COBS *t ); +struct COBS *COBSInit( struct COBS *t ); +// ==================================================================================================== +#ifdef __cplusplus +} +#endif +#endif diff --git a/Inc/generics.h b/Inc/generics.h index 1e64cd29..41b4d28a 100644 --- a/Inc/generics.h +++ b/Inc/generics.h @@ -82,6 +82,11 @@ extern "C" { return y; \ } +#define MEMCHECKV(x) if ( NULL == (x)) \ + { \ + genericsExit( ENOMEM,"Out of memory at %s::%d" EOL, __FILE__,__LINE__); \ + } + // ==================================================================================================== enum verbLevel {V_ERROR, V_WARN, V_INFO, V_DEBUG, V_MAX_VERBLEVEL}; @@ -91,7 +96,7 @@ char *genericsEscape( char *str ); char *genericsUnescape( char *str ); uint64_t genericsTimestampuS( void ); uint32_t genericsTimestampmS( void ); -void genericsSetReportLevel( enum verbLevel lset ); +bool genericsSetReportLevel( enum verbLevel lset ); void genericsPrintf( const char *fmt, ... ); char *genericsGetBaseDirectory( void ); const char *genericsBasename( const char *n ); diff --git a/Inc/itmfifos.h b/Inc/itmfifos.h index b7b55f57..3cef32b6 100644 --- a/Inc/itmfifos.h +++ b/Inc/itmfifos.h @@ -11,6 +11,7 @@ #include "tpiuDecoder.h" #include "itmDecoder.h" +#include "oflow.h" #include "generics.h" @@ -26,24 +27,26 @@ extern "C" { struct Channel; struct itmfifosHandle; +enum Prot { PROT_OFLOW, PROT_ITM, PROT_TPIU, PROT_UNKNOWN }; + /* Fifos running */ void itmfifoForceSync( struct itmfifosHandle *f, bool synced ); /* Force sync status */ -void itmfifoProtocolPump( struct itmfifosHandle *f, uint8_t c ); /* Send undecoded data to the fifo */ +void itmfifoProtocolPump( struct itmfifosHandle *f, uint8_t *c, int len ); /* Send undecoded data to the fifo */ /* Getters and setters */ void itmfifoSetChannel( struct itmfifosHandle *f, int chan, char *n, char *s ); void itmfifoSetChanPath( struct itmfifosHandle *f, char *s ); -void itmfifoSetUseTPIU( struct itmfifosHandle *f, bool s ); +void itmfifoSetProtocol( struct itmfifosHandle *f, enum Prot p ); void itmfifoSetForceITMSync( struct itmfifosHandle *f, bool s ); -void itmfifoSettpiuITMChannel( struct itmfifosHandle *f, int channel ); +void itmfifoSettag( struct itmfifosHandle *f, int tag ); char *itmfifoGetChannelName( struct itmfifosHandle *f, int chan ); char *itmfifoGetChannelFormat( struct itmfifosHandle *f, int chan ); char *itmfifoGetChanPath( struct itmfifosHandle *f ); -bool itmfifoGetUseTPIU( struct itmfifosHandle *f ); +enum Prot itmfifoGetProtocol( struct itmfifosHandle *f ); struct TPIUCommsStats *itmfifoGetCommsStats( struct itmfifosHandle *f ); struct ITMDecoderStats *itmfifoGetITMDecoderStats( struct itmfifosHandle *f ); bool itmfifoGetForceITMSync( struct itmfifosHandle *f ); -int itmfifoGettpiuITMChannel( struct itmfifosHandle *f ); +int itmfifoGettag( struct itmfifosHandle *f ); void itmfifoUsePermafiles( struct itmfifosHandle *f, bool usePermafilesSet ); /* Filewriting */ @@ -52,9 +55,7 @@ void itmfifoFilewriter( struct itmfifosHandle *f, bool useFilewriter, char *work /* Fifos management */ bool itmfifoCreate( struct itmfifosHandle *f ); /* Create the fifo set */ void itmfifoShutdown( struct itmfifosHandle *f ); /* Destroy the fifo set */ -struct itmfifosHandle *itmfifoInit( bool forceITMSyncSet, - bool useTPIUSet, - int TPIUchannelSet ); /* Create an instance */ +struct itmfifosHandle *itmfifoInit( bool forceITMSyncSet, enum Prot p, int tag ); // ==================================================================================================== #ifdef __cplusplus } diff --git a/Inc/loadelf.h b/Inc/loadelf.h new file mode 100644 index 00000000..6f94314f --- /dev/null +++ b/Inc/loadelf.h @@ -0,0 +1,139 @@ + +#ifndef _LOADELF_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef unsigned long int symbolMemaddr; +typedef unsigned char *symbolMemptr; + +#define MEMADDRF "%08lx" +#define NO_LINE (-1) +#define NO_FILE (-1) +#define NO_DESTADDRESS (-1) +#define NO_ADDRESS (-1) + +/* Structure for a memory segment */ +struct symbolMemoryStore +{ + symbolMemaddr start; /* Low address of the memory segment */ + symbolMemaddr len; /* Length of the memory segment */ + char *name; /* Name of the segment as defined by the linker */ + symbolMemptr data; /* Contents of the segment */ +}; + + +/* Structure for a line memory region identified in the image */ +struct symbolLineStore +{ + unsigned int filename; /* Filename index for this line */ + unsigned int startline; /* First line in source code covered by this line region */ + bool isinline; + symbolMemaddr lowaddr; /* Minimum address this line covers */ + symbolMemaddr highaddr; /* Max address this line covers */ + struct symbolFunctionStore *function; /* Function encompassing this line (or NULL if none is identified */ +}; + +/* Structure for a Function identified in the image */ +struct symbolFunctionStore +{ + char *funcname; /* What is the name of the function */ + char *manglename; /* What is the manged name, if any */ + unsigned int producer; /* What code/options produced it? */ + unsigned int filename; /* What filename + path off the source root? */ + unsigned int startline; /* Start line in source file of function */ + unsigned int startcol; /* Start col in source file of function */ + unsigned int endline; /* End line in source file of function */ + symbolMemaddr lowaddr; /* Lowest address of function */ + symbolMemaddr highaddr; /* Highest address of function */ + bool isinline; /* Is this an abstract template for a function? */ + struct symbolLineStore **line; /* Lines comprising this function */ + unsigned int nlines; /* Number of lines in line number storage */ +}; + +struct symbolSourcecodeStore +{ + char **linetext; /* Table of text lines in this file */ + + + unsigned int nlines; /* Number of text lines in this file */ +}; + +enum symbolTables { PT_PRODUCER, PT_FILENAME, PT_NUMTABLES }; + +struct symbol +{ + char **stringTable[PT_NUMTABLES]; /* Strings that we don't want to duplicate, so we give them an index */ + unsigned int tableLen[PT_NUMTABLES]; /* Number of strings for each of the deduplication tables */ + + struct symbolSourcecodeStore **source; /* Table for source code lines, indexed by file number */ + + struct symbolMemoryStore *mem; /* Table of memory regions, sorted according to start address */ + unsigned int nsect_mem; /* Number of entries in memory region table */ + + struct symbolFunctionStore **func; /* Table of functions, sorted by start address */ + unsigned int nfunc; /* Number of entries in function table */ + + struct symbolLineStore **line; /* Table of source code address indexes, sorted by start address */ + unsigned int nlines; /* Number of lines in source code line table */ + + unsigned int cachedSearchIndex; /* Cached memory search region, to speed up memory fetches */ + + int fd; /* Handle that we read elf from */ + + csh caphandle; +}; + +enum instructionClass { LE_IC_NONE, LE_IC_JUMP = ( 1 << 0 ), LE_IC_4BYTE = ( 1 << 1 ), LE_IC_CALL = ( 1 << 2 ), LE_IC_IMMEDIATE = ( 1 << 3 ), LE_IC_IRET = ( 1 << 4 ) }; + +// ==================================================================================================== + +/* Return pointer to source code for specified line in file index */ +const char *symbolSource( struct symbol *p, unsigned int fileNumber, unsigned int lineNumber ); + +/* Return function that encloses specified address, or NULL */ +struct symbolFunctionStore *symbolFunctionAt( struct symbol *p, symbolMemaddr addr ); + +/* Get indexed function, or NULL if out of range */ +struct symbolFunctionStore *symbolFunctionIndex( struct symbol *p, unsigned int index ); + +/* Get indexed line, or NULL if out of range */ +struct symbolLineStore *symbolLineIndex( struct symbol *p, unsigned int index ); + +/* Get indexed line with distinct memory address covered by function */ +struct symbolLineStore *symbolFunctionLineIndex( struct symbolFunctionStore *f, unsigned int index ); + +/* Return line covered by specified memory address, or NULL */ +struct symbolLineStore *symbolLineAt( struct symbol *p, symbolMemaddr addr ); + +/* Get command line that produced this file (compilation unit) */ +const char *symbolGetProducer( struct symbol *p, unsigned int index ); + +/* Get filename string for specified index */ +const char *symbolGetFilename( struct symbol *p, unsigned int index ); + +/* Get pointer to memory at specified address...can move backwards and forwards through the region */ +symbolMemptr symbolCodeAt( struct symbol *p, symbolMemaddr addr, unsigned int *len ); + +/* Return assembly code representing this line, with annotations */ +char *symbolDisassembleLine( struct symbol *p, enum instructionClass *ic, symbolMemaddr addr, symbolMemaddr *newaddr ); + +/* Delete symbol set */ +void symbolDelete( struct symbol *p ); + +/* Collect symbol set with specified components */ +struct symbol *symbolAcquire( char *filename, bool loadmem, bool loadsource ); + +/* Check if current symbols are valid */ +bool symbolSetValid( struct symbol *p ); + +// ==================================================================================================== + +#ifdef __cplusplus +} +#endif +#endif diff --git a/Inc/msgDecoder.h b/Inc/msgDecoder.h index 34ca366b..bb9b994a 100644 --- a/Inc/msgDecoder.h +++ b/Inc/msgDecoder.h @@ -32,6 +32,7 @@ enum MSGType MSG_NUM_MSGS }; + /* Generic message with no content */ struct genericMsg { diff --git a/Inc/nw.h b/Inc/nw.h index 95484788..479c589e 100644 --- a/Inc/nw.h +++ b/Inc/nw.h @@ -17,9 +17,14 @@ extern "C" { // ==================================================================================================== +#define OTCLIENT_SERVER_PORT (3402) /* ORBTrace COBS server port definition */ #define NWCLIENT_SERVER_PORT (3443) /* Server port definition */ +#define LEGACY_SERVER_PORT_OFS (NWCLIENT_SERVER_PORT-OTCLIENT_SERVER_PORT) + #define TRANSFER_SIZE (65536*4) +#define DEFAULT_ITM_STREAM 1 +#define DEFAULT_ETM_STREAM 2 // ==================================================================================================== #ifdef __cplusplus diff --git a/Inc/nwclient.h b/Inc/nwclient.h index bb0a40a3..f564f59e 100644 --- a/Inc/nwclient.h +++ b/Inc/nwclient.h @@ -23,10 +23,9 @@ struct nwclientsHandle; // ==================================================================================================== -void nwclientSend( struct nwclientsHandle *h, uint32_t len, uint8_t *ipbuffer ); +void nwclientSend( struct nwclientsHandle *h, uint32_t len, const uint8_t *ipbuffer ); void nwclientShutdown( struct nwclientsHandle *h ); -bool nwclientShutdownComplete( struct nwclientsHandle *h ); struct nwclientsHandle *nwclientStart( int port ); // ==================================================================================================== diff --git a/Inc/oflow.h b/Inc/oflow.h new file mode 100644 index 00000000..1093b22b --- /dev/null +++ b/Inc/oflow.h @@ -0,0 +1,71 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ + +/* + * ORBFLOW Module + * ============== + * + */ + +#ifndef _ORBFLOW_ +#define _ORBFLOW_ + +#include +#include +#include +#include "cobs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct OFLOWFrame +{ + unsigned int len; /* Received length (after pre-processing) */ + uint8_t tag; /* Tag (packet type) */ + uint8_t sum; /* Checksum byte */ + bool good; /* Is the checksum valid? */ + uint64_t tstamp; /* Timestamp for the packet */ + + uint8_t *d; /* ...pointer to the data itself */ +}; + +struct OFLOW +{ + bool selfAllocated; /* Flag indicating that memory was allocated by the library */ + struct COBS c; + struct OFLOWFrame f; + + /* Materials for callback */ + void ( *cb )( struct OFLOWFrame *p, void *param ); + void *param; +}; + +#define OFLOW_MAX_PACKET_LEN (COBS_MAX_PACKET_LEN-2) +#define OFLOW_MAX_ENC_PACKET_LEN (COBS_MAX_ENC_PACKET_LEN) +#define OFLOW_EOP_LEN (COBS_EOP_LEN) +#define OFLOW_TS_RESOLUTION (1000000000L) + +// ==================================================================================================== + +static inline uint64_t OFLOWResolution( struct OFLOW *t ) +{ + return OFLOW_TS_RESOLUTION; +} + +const uint8_t *OFLOWgetFrameExtent( const uint8_t *inputEnc, int len ); +bool OFLOWisEOFRAME( const uint8_t *inputEnc ); + +void OFLOWEncode( const uint8_t channel, const uint64_t tstamp, const uint8_t *inputMsg, int len, struct Frame *o ); + +/* Context free functions */ +void OFLOWPump( struct OFLOW *t, const uint8_t *incoming, int len, + void ( *packetRxed )( struct OFLOWFrame *p, void *param ), + void *param ); + +void OFLOWDelete( struct OFLOW *t ); +struct OFLOW *OFLOWInit( struct OFLOW *t ); +// ==================================================================================================== +#ifdef __cplusplus +} +#endif +#endif diff --git a/Inc/orbtraceIf.h b/Inc/orbtraceIf.h index cbf1a0f5..71cac094 100644 --- a/Inc/orbtraceIf.h +++ b/Inc/orbtraceIf.h @@ -32,7 +32,7 @@ extern "C" { #define USB_TRANSFER_SIZE (65536) -#define NO_INTERFACE (-1) +#define NO_INTERFACE ((uint8_t)(-1)) #define NO_DEVICE (-1) enum ORBTraceDevice { DEVICE_NULL, DEVICE_ORBTRACE_MINI, DEVICE_BMP, DEVICE_NUM_DEVICES }; @@ -70,11 +70,11 @@ struct OrbtraceIfDevice const struct OrbtraceInterfaceType *type; }; -struct dataBlock +struct __attribute__( ( packed ) ) dataBlock { - ssize_t fillLevel; /* How full this block is */ - uint8_t buffer[USB_TRANSFER_SIZE]; /* Block buffer */ - struct libusb_transfer *usbtfr; /* USB Transfer handle */ + long unsigned int fillLevel; /* How full this block is */ + uint8_t buffer[USB_TRANSFER_SIZE]; /* Block buffer */ + struct libusb_transfer *usbtfr; /* USB Transfer handle */ }; struct OrbtraceIf @@ -90,6 +90,8 @@ struct OrbtraceIf int numBlocks; /* ...and how many */ uint8_t ep; /* Endpoint used for data transfer */ uint8_t iface; /* ...and the interface */ + bool isOrbtrace; /* Is this an orbtrace device? */ + bool supportsOFLOW; /* ...and does it support OFLOW for transfer? */ int numDevices; /* Number of matching devices found */ struct OrbtraceIfDevice *devices; /* List of matching devices found */ @@ -140,6 +142,11 @@ static inline libusb_device_handle *OrbtraceIfGetHandle( struct OrbtraceIf *o ) return o->handle; } +static inline bool OrbtraceSupportsOFLOW( struct OrbtraceIf *o ) +{ + return o->supportsOFLOW; +} + /* Device selection management */ int OrbtraceIfGetDeviceList( struct OrbtraceIf *o, char *sn, uint32_t devmask ); void OrbtraceIfListDevices( struct OrbtraceIf *o ); @@ -148,10 +155,12 @@ bool OrbtraceIfOpenDevice( struct OrbtraceIf *o, int entry ); bool OrbtraceGetIfandEP( struct OrbtraceIf *o ); void OrbtraceIfCloseDevice( struct OrbtraceIf *o ); enum Channel OrbtraceIfNameToChannel( char *x ); +bool OrbtraceIsOrbtrace( struct OrbtraceIf *o ); +bool OrbtraceSupportsOFLOW( struct OrbtraceIf *o ); /* Device manipulation */ bool OrbtraceIfSetTraceWidth( struct OrbtraceIf *o, int width ); -bool OrbtraceIfSetTraceSWO( struct OrbtraceIf *o, bool isMANCH ); +bool OrbtraceIfSetTraceSWO( struct OrbtraceIf *o, bool isMANCH, bool useTPIU ); bool OrbtraceIfSetSWOBaudrate( struct OrbtraceIf *o, uint32_t speed ); bool OrbtraceIfVoltage( struct OrbtraceIf *o, enum Channel ch, int voltage ); diff --git a/Inc/readsource.h b/Inc/readsource.h new file mode 100644 index 00000000..11f653a2 --- /dev/null +++ b/Inc/readsource.h @@ -0,0 +1,18 @@ +#ifndef _READSOURCE_H_ +#define _READSOURCE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +// ==================================================================================================== + +char *readsourcefile( char *path, size_t *l ); + +// ==================================================================================================== + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/Inc/sio.h b/Inc/sio.h index a57f343d..4e91e07e 100644 --- a/Inc/sio.h +++ b/Inc/sio.h @@ -24,30 +24,35 @@ extern "C" { struct SIOInstance; /* Events that can be returned by the handler */ -enum SIOEvent { SIO_EV_NONE, SIO_EV_HOLD, SIO_EV_QUIT, SIO_EV_SAVE, SIO_EV_CONSUMED, SIO_EV_SURFACE, SIO_EV_DIVE, SIO_EV_FOPEN }; +enum SIOEvent { SIO_EV_NONE, SIO_EV_HOLD, SIO_EV_QUIT, SIO_EV_SAVE, SIO_EV_CONSUMED, SIO_EV_SURFACE, SIO_EV_DIVE, SIO_EV_FOPEN, + SIO_EV_PREV, SIO_EV_NEXT + }; /* Types of line (each with their own display mechanism & colours */ enum LineType { LT_SOURCE, LT_ASSEMBLY, LT_NASSEMBLY, LT_MU_SOURCE, LT_EVENT, LT_LABEL, LT_FILE, LT_DEBUG }; /* Definition for a single line...collections of these are what get displayed */ -struct line +struct sioline { enum LineType lt; bool isRef; char *buffer; int32_t line; + void *dat; }; // ==================================================================================================== const char *SIOgetSaveFilename( struct SIOInstance *sio ); int32_t SIOgetCurrentLineno( struct SIOInstance *sio ); -void SIOsetOutputBuffer( struct SIOInstance *sio, int32_t numLines, int32_t currentLine, struct line **opTextSet, bool amDiving ); +int32_t SIOgetLastLineno( struct SIOInstance *sio ); +void SIOsetCurrentLineno( struct SIOInstance *sio, int32_t l ); +void SIOsetOutputBuffer( struct SIOInstance *sio, int32_t numLines, int32_t currentLine, struct sioline **opTextSet, bool amDiving ); void SIOalert( struct SIOInstance *sio, const char *msg ); void SIOrequestRefresh( struct SIOInstance *sio ); void SIOheld( struct SIOInstance *sio, bool isHeld ); void SIOtagText ( struct SIOInstance *sio, const char *ttext ); -enum SIOEvent SIOHandler( struct SIOInstance *sio, bool isTick, uint64_t oldintervalBytes ); - +enum SIOEvent SIOHandler( struct SIOInstance *sio, bool isTick, uint64_t oldintervalBytes, bool supportDebug ); +void SIObeep( void ); void SIOterminate( struct SIOInstance *sio ); struct SIOInstance *SIOsetup( const char *progname, const char *elffile, bool isFile ); // ==================================================================================================== diff --git a/Inc/symbols.h b/Inc/symbols.h index 198889ef..19aa5548 100644 --- a/Inc/symbols.h +++ b/Inc/symbols.h @@ -48,6 +48,7 @@ struct assyLineEntry bool isJump; /* This is a potential jump */ bool isSubCall; /* this is a subrouine call (BL/BLX) */ bool isReturn; /* this is a return instruction (i.e. branch to LR or pop into PC) */ + bool etm4branch; /* Will this be traced as an endpoint for ETM4 decode? */ uint32_t jumpdest; /* If this is an absolute jump, the destination */ }; diff --git a/Inc/traceDecoder.h b/Inc/traceDecoder.h index 68d4e300..fc7b85de 100644 --- a/Inc/traceDecoder.h +++ b/Inc/traceDecoder.h @@ -23,12 +23,24 @@ enum TRACEprotocol TRACE_PROT_LIST_START = 0, TRACE_PROT_ETM35 = TRACE_PROT_LIST_START, TRACE_PROT_MTB, + TRACE_PROT_ETM4, TRACE_PROT_LIST_END, + TRACE_PROT_NUM = TRACE_PROT_LIST_END, TRACE_PROT_NONE = TRACE_PROT_LIST_END }; -#define TRACEProtocolStringDEF "ETM3.5", "MTB", NULL -extern const char *TRACEprotocolString[]; +#define TRACEprotocolStrings "ETM3.5", "MTB", "ETM4" + + +/* Events from the process of pumping bytes through the TRACE decoder */ +enum TRACEDecoderPumpEvent +{ + TRACE_EV_NONE, + TRACE_EV_UNSYNCED, + TRACE_EV_SYNCED, + TRACE_EV_ERROR, + TRACE_EV_MSG_RXED +}; enum TRACEchanges { @@ -38,7 +50,6 @@ enum TRACEchanges EV_CH_ENATOMS, EV_CH_WATOMS, EV_CH_ADDRESS, - EV_CH_EXCEPTION, EV_CH_CANCELLED, EV_CH_VMID, EV_CH_TSTAMP, @@ -56,9 +67,24 @@ enum TRACEchanges EV_CH_LINEAR, EV_CH_TRACESTART, EV_CH_TRACESTOP, + + EV_CH_DISCARD, + EV_CH_OVERFLOW, + EV_CH_FNRETURN, + EV_CH_EXRETURN, + EV_CH_DATASYNC, + EV_CH_UDATASYNC, + EV_CH_EVENT0, + EV_CH_EVENT1, + EV_CH_EVENT2, + EV_CH_EVENT3, EV_CH_NUM_CHANGES }; +/* Flag for unknown/illegal cycle count */ +#define COUNT_UNKNOWN 0xffffffffffffffffL +#define ADDRESS_UNKNOWN 0xffffffffffffffffL + // ============================================================================ // Messages out of the decoder // ============================================================================ @@ -68,7 +94,6 @@ enum Reason { TRACE_REASON_PERIODIC, TRACE_REASON_TRACEON, TRACE_REASON_TRACEOVF /* TRACE Decoder statistics */ struct TRACEDecoderStats - { uint32_t lostSyncCount; /* Number of times sync has been lost */ uint32_t syncCount; /* Number of times a sync event has been received */ @@ -80,16 +105,20 @@ struct TRACECPUState // Gross processor state... uint64_t ts; /* Latest timestamp */ - uint32_t addr; /* Latest fully computed address */ - uint32_t toAddr; /* Address to run to in linear mode (MTB) */ - uint32_t nextAddr; /* Next address to run from in linear mode (MTB) */ + uint64_t addr; /* Latest fully computed address */ + uint64_t toAddr; /* Address to run to in linear mode (MTB) */ + uint64_t nextAddr; /* Next address to run from in linear mode (MTB) */ enum Mode addrMode; /* What kind of addressing are we using at the moment? */ uint32_t contextID; /* Currently executing context */ uint8_t vmid; /* Current virtual machine ID */ - uint32_t cycleCount; /* Cycle Count for exact mode */ + uint64_t cycleCount; /* Cycle Count for exact mode */ uint16_t exception; /* Exception type being executed */ uint16_t resume; /* Interrupt resume code */ + bool serious; /* True if there is a serious fault pending */ uint64_t instCount; /* Number of instructions executed */ + uint8_t exceptionLevel; /* Current exception level */ + bool am64bit; /* Running in 64 bit mode */ + bool amSecure; /* Running in secure mode */ // I-Sync related enum Reason reason; /* Why this i-sync was generated */ @@ -100,6 +129,10 @@ struct TRACECPUState uint8_t natoms; /* Number of N (non-executed) atoms in this step */ uint32_t disposition; /* What happened to condition codes for each instruction? */ + // D-Sync related + uint8_t dsync_mark; /* Co-ordination mark in data flow */ + uint8_t udsync_mark; /* Co-ordination mark for unnumbered sync in data flow */ + // State flags bool jazelle; /* Executing jazelle mode instructions */ bool nonSecure; /* CPU is operating in non-secure mode */ @@ -107,83 +140,62 @@ struct TRACECPUState bool hyp; /* CPU is in hypervisor mode */ bool thumb; /* CPU is in thumb mode */ bool clockSpeedChanged; /* CPU Clockspeed changed since last timestamp */ -}; -/* Internal states of the protocol machine */ -enum TRACEprotoState -{ - TRACE_UNSYNCED, - TRACE_WAIT_ISYNC, - TRACE_IDLE, - TRACE_COLLECT_BA_STD_FORMAT, - TRACE_COLLECT_BA_ALT_FORMAT, - TRACE_COLLECT_EXCEPTION, - TRACE_GET_CONTEXTBYTE, - TRACE_GET_INFOBYTE, - TRACE_GET_IADDRESS, - TRACE_GET_ICYCLECOUNT, - TRACE_GET_CYCLECOUNT, - TRACE_GET_VMID, - TRACE_GET_TSTAMP, - TRACE_GET_CONTEXTID + // Convinience, for debug reporting + genericsReportCB report; }; -/* Textual form of the above, for debugging */ -#define TRACEprotoStateNamesDEF "UNSYNCED", "WAIT_ISYNC", "IDLE", "COLLECT_BA_STD", \ - "COLLECT_BA_ALT", "COLLECT_EXCEPTION", "WAIT_CONTEXTBYTE", "WAIT_INFOBYTE", \ - "WAIT_IADDRESS", "WAIT_ICYCLECOUNT", "WAIT_CYCLECOUNT", "GET_VMID", \ - "GET_TSTAMP", "GET_CONTEXTID" - -extern const char *protoStateName[]; // ============================================================================ // The TRACE decoder state // ============================================================================ + +typedef void ( *traceDecodeCB )( void *d ); + +struct TRACEDecoder; + +struct TRACEDecoderEngine +{ + bool ( *action ) ( struct TRACEDecoderEngine *e, struct TRACECPUState *cpu, uint8_t c ); + bool ( *actionPair ) ( struct TRACEDecoderEngine *e, struct TRACECPUState *cpu, uint32_t source, uint32_t dest ); + void ( *destroy ) ( struct TRACEDecoderEngine *e ); + bool ( *synced ) ( struct TRACEDecoderEngine *e ); + void ( *forceSync ) ( struct TRACEDecoderEngine *e, bool isSynced ); + const char ( *name ) ( void ); + + /* Config specific to ETM3.5 */ + void ( *altAddrEncode ) ( struct TRACEDecoderEngine *e, bool using ); +}; + struct TRACEDecoder { - struct TRACEDecoderStats stats; /* Record of the statistics */ - enum TRACEprotoState p; /* Current state of the receiver */ - bool rxedISYNC; /* Indicator that we're fully synced */ - - /* Trace configuration */ - /* ------------------- */ - bool usingAltAddrEncode; /* Set if the new (TRACE 3.4 onwards) addr formatting is used */ - enum TRACEprotocol protocol; /* What trace protocol are we using? */ - uint8_t contextBytes; /* How many context bytes we're using */ - bool cycleAccurate; /* Using cycle accurate mode */ - bool dataOnlyMode; /* If we're only tracing data, not instructions */ - - /* Purely internal matters.... */ - /* --------------------------- */ - uint32_t asyncCount; /* Count of 0's in preparation for ASYNC recognition */ - uint32_t addrConstruct; /* Address under construction */ - uint64_t tsConstruct; /* Timestamp under construction */ - uint32_t contextConstruct; /* Context under construction */ - uint32_t cycleConstruct; /* Cycle count under construction */ - uint32_t byteCount; /* How many bytes of this packet do we have? */ - - - /* External resulutions of current CPU state */ - /* ----------------------------------------- */ - struct TRACECPUState cpu; /* Current state of the CPU */ + struct TRACEDecoderStats stats; /* Record of the statistics */ + struct TRACECPUState cpu; /* Current state of the CPU */ + + enum TRACEprotocol protocol; /* What trace protocol are we using? */ + + struct TRACEDecoderEngine *engine; /* The actual engine for the decode, including internal state */ + }; // ==================================================================================================== -typedef void ( *traceDecodeCB )( void *d ); void TRACEDecoderForceSync( struct TRACEDecoder *i, bool isSynced ); -void TRACEDecoderZeroStats( struct TRACEDecoder *i ); bool TRACEDecoderIsSynced( struct TRACEDecoder *i ); + +void TRACEDecoderZeroStats( struct TRACEDecoder *i ); +struct TRACEDecoderStats *TRACEDecoderGetStats( struct TRACEDecoder *i ); + struct TRACECPUState *TRACECPUState( struct TRACEDecoder *i ); bool TRACEStateChanged( struct TRACEDecoder *i, enum TRACEchanges c ); -struct TRACEDecoderStats *TRACEDecoderGetStats( struct TRACEDecoder *i ); -void TRACEDecodeUsingAltAddrEncode( struct TRACEDecoder *i, bool usingAltAddrEncodeSet ); -void TRACEDecodeProtocol( struct TRACEDecoder *i, enum TRACEprotocol protocol ); +const char *TRACEExceptionName( int exceptionNumber ); + +const char *TRACEDecodeGetProtocolName( enum TRACEprotocol protocol ); -void TRACEDecoderPump( struct TRACEDecoder *i, uint8_t *buf, int len, traceDecodeCB cb, genericsReportCB report, void *d ); +void TRACEDecoderPump( struct TRACEDecoder *i, uint8_t *buf, int len, traceDecodeCB cb, void *d ); -void TRACEDecoderInit( struct TRACEDecoder *i, enum TRACEprotocol protocol, bool usingAltAddrEncodeSet ); +void TRACEDecoderInit( struct TRACEDecoder *i, enum TRACEprotocol protocol, bool usingAltAddrEncodeSet, genericsReportCB report ); // ==================================================================================================== #ifdef __cplusplus } diff --git a/Inc/uicolours_default.h b/Inc/uicolours_default.h index 5a0ac1c3..afe23638 100644 --- a/Inc/uicolours_default.h +++ b/Inc/uicolours_default.h @@ -19,6 +19,7 @@ #define C_VERB_INFO C_LCYAN /* Verbal level info */ #define C_VERB_DEBUG C_LGREEN /* Verbal level debug */ #define C_DATA C_YELLOW /* Output data value */ +#define C_NOCHAN C_LRED /* No consumer set for channel */ #define C_DEFAULT C_WHITE #define C_SEL C_LCYAN /* Element selection */ diff --git a/README.md b/README.md index 23181aad..12a352c3 100644 --- a/README.md +++ b/README.md @@ -37,12 +37,10 @@ these data gives you a huge amount of insight into what is really going on insid your CPU. The tools are all mix-and-match according to what you are trying to do. The current set is; * orbuculum: The main program which interfaces to the trace probe and then issues a network -interface to which an arbitary number of clients can connect, by default on TCP/3443. This is +interface to which an arbitary number of clients can connect. This is used by a base interface to the target by other programmes in the suite. Generally you configure this for the TRACE tool you're using and then you can just leave it running and it'll grab -data from the target and make it available to clients whenever it can. Note that some -debug probes can now create an orbuculum-compatible interface on TCP/3443, and then you can -connect the rest of the suite to that directly, without needing to use the orbuculum mux itself. +data from the target and make it available to clients whenever it can. * orbfifo: The fifo pump: Turns a trace feed into a set of fifos (or permanent files). @@ -325,6 +323,40 @@ In order to get single folder with Orbuculum and MinGW dependencies run: Orbuculum executables along with MinGW-w64 dependencies will be installed into `build/install` and can be transfered to different machine or used outside of MSys2 shell. +Communications +============== + +Originally orbuculum provided a TCP/3443 port to which an arbitary number of clients could connect +and each one would receive a clean copy of the data from the probe. Optionally, the TPIU framing could +be stripped off by orbuculum so that individual clients didn't have to do it and each TPIU port would then +appear on consecutive ports; Generally, that means that ITM message appeared on TCP/3443 and ETM on TCP/3444. + +Some debug drivers (e.g. openocd, pyocd) can now create an orbuculum-compatible interface on TCP/3443, which +allows you to connect the rest of the suite to that directly, without needing to use the orbuculum mux itself. + +However, times have moved on. Passing all those data through transparently was wasteful as a fair bit of it +was 'nothing to see here', so Orbuculum now supports a new protocol, orbflow (OFLOW). Orbflow is always carried on TCP/3402 and +is a bit more intelligent than simply passing through the messages from the probe. It turns the stream of data into +COBS encoded sequenced messages with defined message boundries and it also removes the redundant data. When used +in conjunction with an ORBTrace probe the orbflow messages are created in the probe itself, providing a further +performance improvement. + +Basically, all of this is mostly transparent to the regular end user. Orbflow is automatically used for communication +between orbuculum and its clients if it's available, and Orbuculum still provides the TCP/3443 port it always did, +which you can connect to in the same way as you used to if you've got custom clients. Orbflow will give you a performance +improvement, but it's otherwise mostly transparent. + +There are come slight changes to the command line options though. Historically, when using TPIU decoding, +you had to specify the channels to be decoded with an option like `-T 1,2`. You now simply need to tell orbuculum +which tags to process with `-t 1,2` and, if your probe doesn't remove TPIU framing automatically, specify the `-T` +option on its own....if you try to specify the `-T` option and you've got an ORBTrace that supports Orbflow protocol +then you'll get a warning, because TPIU framing removal is done automatically in the probe in that case, so you +don't generally need it. + +Why have we made this change? Well, decoding TPIU on the probe saves a huge amount of bandwidth, and moving to the +tag based approach lets us convey other information from the probe too such as timestamps, voltages and currents. + + Using ===== @@ -384,9 +416,13 @@ For `orbuculum`, the specific command line options of note are; `-p, --serial-port [serialPort]`: to use. If not specified then the program defaults to Blackmagic probe. + `-P, --pace [microseconds>]`: delay in block of data transmission to clients. Used when source is a file. + `-s, --server [address]:[port]`: Set address for explicit TCP Source connection, (default none:2332). - `-t, --tpiu x,y,...`: Remove TPIU formatting and issue streams x, y etc over incrementing IP port numbers. + `-T, --tpiu`: Remove TPIU formatting from incoming data stream. + + `-t, --tag x,y,...`: List of streams to decode (and onward route) from the probe (low stream numbers are TPIU channels). *By default only stream 1 (ITM) is routed.* Orbfifo diff --git a/Src/cobs.c b/Src/cobs.c new file mode 100644 index 00000000..be1c2930 --- /dev/null +++ b/Src/cobs.c @@ -0,0 +1,246 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ + +/* + * COBS Encoder/Decoder Module + * =========================== + * + * Routines based on code from http://www.stuartcheshire.org/papers/COBSforToN.pdf + * IEEE/ACM TRANSACTIONS ON NETWORKING, VOL.7, NO. 2, APRIL 1999 + * Consistent Overhead Byte Stuffing, Stuart Cheshire and Mary Baker + * + */ + +#include +#include +#include +#include "cobs.h" + +const uint8_t cobs_eop[COBS_EOP_LEN] = { COBS_SYNC_CHAR }; + +// ==================================================================================================== +struct COBS *COBSInit( struct COBS *t ) + +/* Reset a COBS instance */ + +{ + if ( !t ) + { + t = ( struct COBS * )calloc( 1, sizeof( struct COBS ) ); + t->selfAllocated = true; + } + + return t; +} +// ==================================================================================================== +void COBSDelete( struct COBS *t ) + +/* Destroy a COBS instance, but only if we created it */ + +{ + if ( t->selfAllocated ) + { + free( t ); + t = NULL; + } +} + +// ==================================================================================================== + +void COBSEncode( const uint8_t *frontMsg, int lfront, const uint8_t *backMsg, int lback, const uint8_t *inputMsg, int lmsg, struct Frame *o ) + +/* Encode frame and write into provided output Frame buffer */ + +{ + uint8_t *wp = o->d; + o->len = 0; + + /* Get overall message length */ + int len = lfront + lmsg + lback; + + assert( len <= COBS_OVERALL_MAX_PACKET_LEN ); + + if ( len ) + { + uint8_t *cp = wp++; + int seglen = 1; + + for ( int i = 0; len--; i++ ) + { + /* Take byte from frontMatter, main message or backMatter depending on where we are in transmission */ + const uint8_t *rp = ( i < lfront ) ? &frontMsg[i] : ( i < ( lfront + lmsg ) ) ? &inputMsg[i - lfront] : &backMsg[i - ( lfront + lmsg )]; + + if ( COBS_SYNC_CHAR != *rp ) + { + *wp++ = *rp; + seglen++; + } + + if ( ( COBS_SYNC_CHAR == *rp ) || ( 0xff == seglen ) ) + { + *cp = seglen; + seglen = 1; + cp = wp; + + if ( ( COBS_SYNC_CHAR == *rp ) || len ) + { + wp++; + } + } + } + + *cp = seglen; + + /* Packet must end with a sync to define EOP */ + *wp++ = COBS_SYNC_CHAR; + } + + o->len = ( wp - o->d ); +} + +// ==================================================================================================== + +bool COBSisEOFRAME( const uint8_t *inputEnc ) + +{ + return ( COBS_SYNC_CHAR == *inputEnc ); +} + +// ==================================================================================================== + +void COBSPump( struct COBS *t, const uint8_t *incoming, int len, + void ( *packetRxed )( struct Frame *p, void *param ), + void *param ) + + +/* Assemble this packet into a complete frame and call back */ + +{ + const uint8_t *fp = incoming; + + for ( unsigned int rlen = 0; rlen < len; rlen++, fp++ ) + { + switch ( t->s ) + { + case COBS_IDLE: // ------------------------------------------------------------------- + if ( COBS_SYNC_CHAR != *fp ) + { + t->f.len = 0; + t->intervalCount = *fp; + t->maxCount = ( *fp == 255 ); + t->s = COBS_RXING; + } + + break; + + case COBS_RXING: // ------------------------------------------------------------------- + t->intervalCount--; + + if ( !t->intervalCount ) + { + if ( COBS_SYNC_CHAR == *fp ) + { + /* This is the end of a packet */ + packetRxed( &t->f, param ); + t->s = COBS_IDLE; + } + else + { + if ( !t->maxCount ) + { + t->f.d[t->f.len++] = COBS_SYNC_CHAR; + } + + t->intervalCount = *fp; + t->maxCount = ( *fp == 255 ); + } + } + else + { + /* Check for frame overflow ... if it's max then error */ + if ( ( t->f.len > COBS_MAX_PACKET_LEN ) || ( COBS_SYNC_CHAR == *fp ) ) + { + t->error++; + t->s = COBS_IDLE; + } + else + { + t->f.d[t->f.len++] = *fp; + } + } + + break; + } + } +} + +// ==================================================================================================== +bool COBSSimpleDecode( const uint8_t *inputEnc, int len, struct Frame *o ) + +/* Decode frame and write decoded frame into provided Frame buffer */ +/* Returns pointer to first character after frame (should be COBS_SYNC_CHAR) */ +/* or NULL if packet did not decode...and store the fragment. */ + +{ + const uint8_t *fp = inputEnc; + const uint8_t *efp = inputEnc + len; + + uint8_t *op = o->d; + + uint8_t interval; + + /* Deal with possibility of sync chars on the front */ + while ( ( COBS_SYNC_CHAR == *fp ) && ( fp < efp ) ) + { + fp++; + } + + while ( fp < efp ) + { + interval = *fp++; + + if ( COBS_SYNC_CHAR == interval ) + { + /* We have finished...for better or worse */ + break; + } + + for ( int i = 1; i < interval; i++ ) + { + /* Deal with possibility of illegal sync chars in the flow */ + if ( *fp == COBS_SYNC_CHAR ) + { + /* return false...no good packet here */ + o->len = 0; + return false; + } + + *op++ = *fp++; + } + + if ( ( interval != 0xff ) && ( *fp != COBS_SYNC_CHAR ) ) + { + *op++ = COBS_SYNC_CHAR; + } + } + + o->len = op - o->d; + return op != o->d; +} + +// ==================================================================================================== + +const uint8_t *COBSgetFrameExtent( const uint8_t *inputEnc, int len ) + +/* Look through memory until an end of frame marker is found, or memory is exhausted. */ + +{ + /* Go find the next sync */ + while ( !COBSisEOFRAME( inputEnc ) && --len ) + { + inputEnc++; + } + + return inputEnc; +} + +// ==================================================================================================== diff --git a/Src/filewriter.c b/Src/filewriter.c index fba5c27c..dec6e825 100644 --- a/Src/filewriter.c +++ b/Src/filewriter.c @@ -55,6 +55,7 @@ void _processCompleteName( uint32_t n ) if ( _f.basedir ) { strncpy( workingName, _f.basedir, MAX_CONCAT_FILENAMELEN - 1 ); + strcat( workingName, "/" ); strncat( workingName, _f.file[n].name, MAX_CONCAT_FILENAMELEN - 1 ); } else diff --git a/Src/generics.c b/Src/generics.c index 513d7042..ae8843d7 100644 --- a/Src/generics.c +++ b/Src/generics.c @@ -165,10 +165,18 @@ char *genericsUnescape( char *str ) // ==================================================================================================== static enum verbLevel lstore = V_WARN; -void genericsSetReportLevel( enum verbLevel lset ) +bool genericsSetReportLevel( enum verbLevel lset ) { + /* Set is respected to maintain historic behaviour, even if out of range */ lstore = lset; + + if ( ( lset < V_ERROR ) || ( lset > V_MAX_VERBLEVEL ) ) + { + return false; + } + + return true; } // ==================================================================================================== enum verbLevel genericsGetReportLevel( void ) @@ -260,7 +268,14 @@ char *genericsGetBaseDirectory( void ) } currentSize *= 2; + char *oexePath = exePath; exePath = realloc( exePath, currentSize ); + + if ( !exePath ) + { + free( oexePath ); + return NULL; + } } char *dirPath = malloc( currentSize ); @@ -303,7 +318,14 @@ char *genericsGetBaseDirectory( void ) } currentSize *= 2; + char *oexePath = exePath; exePath = realloc( exePath, currentSize ); + + if ( !exePath ) + { + free( oexePath ); + return NULL; + } } const char *dirPath = dirname( exePath ); diff --git a/Src/itmfifos.c b/Src/itmfifos.c index 5dabffa1..d71746a6 100644 --- a/Src/itmfifos.c +++ b/Src/itmfifos.c @@ -21,10 +21,15 @@ #include "generics.h" #include "tpiuDecoder.h" #include "itmDecoder.h" +#include "oflow.h" #include "fileWriter.h" #include "itmfifos.h" #include "msgDecoder.h" +#ifndef O_BINARY + #define O_BINARY 0 +#endif + #define MAX_STRING_LENGTH (100) /* Maximum length that will be output from a fifo for a single event */ struct runThreadParams /* Structure for parameters passed to a software task thread */ @@ -45,6 +50,7 @@ struct Channel /* Information for an individual ch pthread_t thread; /* Thread on which it's running */ struct runThreadParams params; /* Parameters for running thread */ char *fifoName; /* Constructed fifo name (from chanPath and name) */ + bool ending; /* Flag indicating its time to disappear */ }; struct itmfifosHandle @@ -55,6 +61,7 @@ struct itmfifosHandle struct ITMPacket h; struct TPIUDecoder t; struct TPIUPacket p; + struct OFLOW ot; enum timeDelay timeStatus; /* Indicator of if this time is exact */ uint64_t timeStamp; /* Latest received time */ @@ -63,13 +70,14 @@ struct itmfifosHandle /* Configuration information */ char *chanPath; /* Path to where to put the fifos */ - bool useTPIU; /* Is the TPIU active? */ bool filewriter; /* Is the filewriter in use? */ bool forceITMSync; /* Is ITM to be forced into sync? */ bool permafile; /* Use permanent files rather than fifos */ - int tpiuITMChannel; /* TPIU channel on which ITM appears */ + int tag; /* Which OFLOW or TPIU stream are we decoding? */ bool amEnding; /* Flag indicating end is in progress */ + enum Prot protocol; /* What protocol to communicate (default to OFLOW (== orbuculum)) */ + struct Channel c[NUM_CHANNELS + 1]; /* Output for each channel */ }; @@ -115,22 +123,24 @@ static void *_runFifo( void *arg ) do { - /* Keep on opening the file (in case the fifo is opened/closed multiple times */ + /* Keep on opening the file (in case the fifo is opened/closed multiple times) */ + /* We use RDWR to allow the open to proceed without a remote end */ + if ( !params->permafile ) { - opfile = open( c->fifoName, O_WRONLY ); + opfile = open( c->fifoName, O_RDWR | O_BINARY | O_NONBLOCK ); } else { - opfile = open( c->fifoName, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ); + opfile = open( c->fifoName, O_WRONLY | O_CREAT | O_BINARY | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ); } do { - /* ....get the packet */ + /* ....get the packet. This will hang here until a packet arrives or the link closes */ readDataLen = read( params->listenHandle, &m, sizeof( struct swMsg ) ); - if ( readDataLen <= 0 ) + if ( readDataLen < 0 ) { continue; } @@ -172,11 +182,12 @@ static void *_runFifo( void *arg ) written = write( opfile, &w, sizeof ( w ) ); } } - while ( ( readDataLen > 0 ) && ( written > 0 ) ); + while ( ( written > 0 ) && ( !c->ending ) ); + /* Falling out on writen fail means we can re-open the fifo if it overflowed */ close( opfile ); } - while ( readDataLen > 0 ); + while ( !c->ending ); pthread_exit( NULL ); } @@ -208,16 +219,17 @@ static void *_runHWFifo( void *arg ) { if ( !params->permafile ) { - opfile = open( c->fifoName, O_WRONLY ); + /* We use RDWR to allow the open to proceed without a remote end */ + opfile = open( c->fifoName, O_RDWR | O_BINARY | O_NONBLOCK ); } else { - opfile = open( c->fifoName, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ); + opfile = open( c->fifoName, O_WRONLY | O_CREAT | O_BINARY | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ); } do { - /* ....get the packet, don't worry if it can't be written */ + /* ....get the packet. We will hang here until a packet arrives or the link closes */ readDataLen = read( params->listenHandle, p, MAX_STRING_LENGTH ); if ( readDataLen > 0 ) @@ -225,11 +237,12 @@ static void *_runHWFifo( void *arg ) writeDataLen = write( opfile, p, readDataLen ); } } - while ( ( readDataLen > 0 ) && ( writeDataLen > 0 ) ); + while ( ( writeDataLen > 0 ) && ( !c->ending ) ); + /* Falling out on writeDataLen fail means we can re-open the fifo if it overflowed */ close( opfile ); } - while ( readDataLen > 0 ); + while ( !c->ending ); pthread_exit( NULL ); } @@ -417,7 +430,7 @@ void _itmPumpProcess( struct itmfifosHandle *f, char c ) { struct msg decoded; - typedef void ( *handlers )( void *decoded, struct itmfifosHandle * f ); + typedef void ( *handlers )( void *, struct itmfifosHandle * f ); /* Handlers for each complete message received */ static const handlers h[MSG_NUM_MSGS] = @@ -515,7 +528,7 @@ static void _tpiuProtocolPump( struct itmfifosHandle *f, uint8_t c ) for ( uint32_t g = 0; g < f->p.len; g++ ) { - if ( f->p.packet[g].s == f->tpiuITMChannel ) + if ( f->p.packet[g].s == f->tag ) { _itmPumpProcess( f, f->p.packet[g].d ); continue; @@ -538,6 +551,31 @@ static void _tpiuProtocolPump( struct itmfifosHandle *f, uint8_t c ) } } +// ==================================================================================================== + +static void _OFLOWpacketRxed ( struct OFLOWFrame *p, void *param ) + +{ + struct itmfifosHandle *f = ( struct itmfifosHandle * )param; + + if ( !p->good ) + { + genericsReport( V_WARN, "Bad packet received" EOL ); + } + else + { + if ( p->tag == f->tag ) + { + for ( int i = 0; i < p->len; i++ ) + { + _itmPumpProcess( f, p->d[i] ); + } + } + } +} + +// ==================================================================================================== + // ==================================================================================================== // ==================================================================================================== // ==================================================================================================== @@ -563,7 +601,9 @@ void itmfifoSetChanPath( struct itmfifosHandle *f, char *s ) // ==================================================================================================== // strdup leak is deliberately ignored. That is the central purpose of this code! #pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak" +#if !defined(__clang__) + #pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak" +#endif void itmfifoSetChannel( struct itmfifosHandle *f, int chan, char *n, char *s ) @@ -582,17 +622,17 @@ void itmfifoSetChannel( struct itmfifosHandle *f, int chan, char *n, char *s ) f->c[chan].chanName = strdup( n ); - MEMCHECK( f->c[chan].chanName, ); + MEMCHECKV( f->c[chan].chanName ); f->c[chan].presFormat = s ? strdup( s ) : NULL; - MEMCHECK( f->c[chan].presFormat, ); + MEMCHECKV( f->c[chan].presFormat ); } #pragma GCC diagnostic pop // ==================================================================================================== -void itmfifoSetUseTPIU( struct itmfifosHandle *f, bool s ) +void itmfifoSetProtocol( struct itmfifosHandle *f, enum Prot p ) { - f->useTPIU = s; + f->protocol = p; } // ==================================================================================================== void itmfifoSetForceITMSync( struct itmfifosHandle *f, bool s ) @@ -601,10 +641,10 @@ void itmfifoSetForceITMSync( struct itmfifosHandle *f, bool s ) f->forceITMSync = s; } // ==================================================================================================== -void itmfifoSettpiuITMChannel( struct itmfifosHandle *f, int channel ) +void itmfifoSettag( struct itmfifosHandle *f, int stream ) { - f->tpiuITMChannel = channel; + f->tag = stream; } // ==================================================================================================== char *itmfifoGetChannelName( struct itmfifosHandle *f, int chan ) @@ -627,10 +667,10 @@ char *itmfifoGetChanPath( struct itmfifosHandle *f ) return f->chanPath; } // ==================================================================================================== -bool itmfifoGetUseTPIU( struct itmfifosHandle *f ) +enum Prot itmfifoGetProtocol( struct itmfifosHandle *f ) { - return f->useTPIU; + return f->protocol; } // ==================================================================================================== bool itmfifoGetForceITMSync( struct itmfifosHandle *f ) @@ -639,10 +679,10 @@ bool itmfifoGetForceITMSync( struct itmfifosHandle *f ) return f->forceITMSync; } // ==================================================================================================== -int itmfifoGettpiuITMChannel( struct itmfifosHandle *f ) +int itmfifoGettag( struct itmfifosHandle *f ) { - return f->tpiuITMChannel; + return f->tag; } // ==================================================================================================== struct TPIUCommsStats *itmfifoGetCommsStats( struct itmfifosHandle *f ) @@ -659,20 +699,29 @@ struct ITMDecoderStats *fifoGetITMDecoderStats( struct itmfifosHandle *f ) // ==================================================================================================== // Main interface components // ==================================================================================================== -void itmfifoProtocolPump( struct itmfifosHandle *f, uint8_t c ) +void itmfifoProtocolPump( struct itmfifosHandle *f, uint8_t *c, int len ) /* Top level protocol pump */ { - if ( f->useTPIU ) + + if ( PROT_OFLOW == f->protocol ) { - _tpiuProtocolPump( f, c ); + OFLOWPump( &f->ot, c, len, _OFLOWpacketRxed, f ); } else - { - /* There's no TPIU in use, so this goes straight to the ITM layer */ - _itmPumpProcess( f, c ); - } + while ( len-- ) + { + if ( PROT_TPIU == f->protocol ) + { + _tpiuProtocolPump( f, *c++ ); + } + else + { + /* There's no TPIU in use, so this goes straight to the ITM layer */ + _itmPumpProcess( f, *c++ ); + } + } } // ==================================================================================================== void itmfifoForceSync( struct itmfifosHandle *f, bool synced ) @@ -696,6 +745,7 @@ bool itmfifoCreate( struct itmfifosHandle *f ) /* Reset the TPIU handler before we start */ TPIUDecoderInit( &f->t ); + OFLOWInit( &f->ot ); ITMDecoderInit( &f->i, f->forceITMSync ); /* Cycle through channels and create a fifo for each one that is enabled */ @@ -718,14 +768,21 @@ bool itmfifoCreate( struct itmfifosHandle *f ) } f->c[t].handle = fd[1]; + f->c[t].ending = false; f->c[t].params.listenHandle = fd[0]; f->c[t].params.portNo = t; f->c[t].params.permafile = f->permafile; f->c[t].params.c = &f->c[t]; - f->c[t].fifoName = ( char * )malloc( strlen( f->c[t].chanName ) + strlen( f->chanPath ) + 2 ); - strcpy( f->c[t].fifoName, f->chanPath ); + f->c[t].fifoName = ( char * )calloc( strlen( f->c[t].chanName ) + 2 + ( f->chanPath ? strlen( f->chanPath ) : 0 ), 1 ); + + if ( f->chanPath ) + { + strcpy( f->c[t].fifoName, f->chanPath ); + strcat( f->c[t].fifoName, "/" ); + } + strcat( f->c[t].fifoName, f->c[t].chanName ); if ( pthread_create( &( f->c[t].thread ), NULL, &_runFifo, &( f->c[t].params ) ) ) @@ -755,8 +812,14 @@ bool itmfifoCreate( struct itmfifosHandle *f ) f->c[t].params.permafile = f->permafile; f->c[t].params.c = &f->c[t]; - f->c[t].fifoName = ( char * )malloc( strlen( HWFIFO_NAME ) + strlen( f->chanPath ) + 2 ); - strcpy( f->c[t].fifoName, f->chanPath ); + f->c[t].fifoName = ( char * )calloc( strlen( HWFIFO_NAME ) + 2 + ( ( f->chanPath ) ? strlen( f->chanPath ) : 0 ), 1 ); + + if ( f->chanPath ) + { + strcpy( f->c[t].fifoName, f->chanPath ); + strcat( f->c[t].fifoName, "/" ); + } + strcat( f->c[t].fifoName, HWFIFO_NAME ); if ( pthread_create( &( f->c[t].thread ), NULL, &_runHWFifo, &( f->c[t].params ) ) ) @@ -784,6 +847,8 @@ void itmfifoShutdown( struct itmfifosHandle *f ) /* Firstly go tell everything they're doomed */ for ( int t = 0; t < NUM_CHANNELS + 1; t++ ) { + f->c[t].ending = true; + if ( f->c[t].handle > 0 ) { /* This will cause the read to end, thus terminating the pthread */ @@ -831,7 +896,7 @@ void itmfifoUsePermafiles( struct itmfifosHandle *f, bool usePermafilesSet ) f->permafile = usePermafilesSet; } // ==================================================================================================== -struct itmfifosHandle *itmfifoInit( bool forceITMSyncSet, bool useTPIUSet, int TPIUchannelSet ) +struct itmfifosHandle *itmfifoInit( bool forceITMSyncSet, enum Prot p, int tag ) { struct itmfifosHandle *f = ( struct itmfifosHandle * )calloc( 1, sizeof( struct itmfifosHandle ) ); @@ -839,10 +904,9 @@ struct itmfifosHandle *itmfifoInit( bool forceITMSyncSet, bool useTPIUSet, int T MEMCHECK( f, NULL ); f->chanPath = strdup( "" ); - f->useTPIU = useTPIUSet; + f->protocol = p; f->forceITMSync = forceITMSyncSet; - f->tpiuITMChannel = TPIUchannelSet; - + f->tag = tag; return f; } // ==================================================================================================== diff --git a/Src/loadelf.c b/Src/loadelf.c new file mode 100644 index 00000000..ea3295a1 --- /dev/null +++ b/Src/loadelf.c @@ -0,0 +1,1292 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "loadelf.h" +#include "generics.h" +#include "readsource.h" + +#define DP_MAX_LINE_LEN (4095) +#define IS_INFO (true) + +static char _print_buffer[DP_MAX_LINE_LEN]; + +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== +// Internal routines +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== + +static int _compareMem( const void *a, const void *b ) +{ + const symbolMemaddr as = ( ( struct symbolMemoryStore * )a )->start; + const symbolMemaddr bs = ( ( struct symbolMemoryStore * )b )->start; + + if ( as < bs ) + { + return -1; + } + + if ( as > bs ) + { + return 1; + } + + return 0; +} + +// ==================================================================================================== + +static int _compareFunc( const void *a, const void *b ) +{ + const symbolMemaddr as = ( *( struct symbolFunctionStore ** )a )->lowaddr; + const symbolMemaddr bs = ( *( struct symbolFunctionStore ** )b )->lowaddr; + + if ( as < bs ) + { + return -1; + } + + if ( as > bs ) + { + return 1; + } + + return 0; +} + +// ==================================================================================================== + +static int _matchFunc( const void *a, const void *b ) +{ + const unsigned int key = *( uint64_t * )a; + const symbolMemaddr as = ( *( struct symbolFunctionStore ** )b )->lowaddr; + const symbolMemaddr ae = ( *( struct symbolFunctionStore ** )b )->highaddr; + + if ( key < as ) + { + return -1; + } + + if ( key > ae ) + { + return 1; + } + + return 0; +} + +// ==================================================================================================== + +static int _compareLineMem( const void *a, const void *b ) + +{ + const symbolMemaddr as = ( *( struct symbolLineStore ** )a )->lowaddr; + const symbolMemaddr bs = ( *( struct symbolLineStore ** )b )->lowaddr; + + if ( as < bs ) + { + return -1; + } + + if ( as > bs ) + { + return 1; + } + + return 0; +} + +// ==================================================================================================== + +static int _matchLine( const void *a, const void *b ) +{ + const symbolMemaddr key = *( uint64_t * )a; + const symbolMemaddr as = ( *( struct symbolLineStore ** )b )->lowaddr; + const symbolMemaddr ae = ( *( struct symbolLineStore ** )b )->highaddr; + + if ( key < as ) + { + return -1; + } + + if ( key > ae ) + { + return 1; + } + + return 0; +} +// ==================================================================================================== + +static bool _readProg( struct symbol *p ) + +{ + Elf *e; + Elf_Scn *scn = NULL; + GElf_Shdr shdr; + size_t shstrndx; + char *name; + + if ( elf_version( EV_CURRENT ) == EV_NONE ) + { + fprintf( stderr, "ELF library initialization failed : %s ", elf_errmsg ( -1 ) ); + return p; + } + + if ( ( e = elf_begin( p->fd, ELF_C_READ, NULL ) ) == NULL ) + { + fprintf( stderr, "ELF Begin failed\n" ); + return false; + } + + if ( elf_getshdrstrndx( e, &shstrndx ) != 0 ) + { + fprintf( stderr, "elf_getshdrstrndx failed: %s\n", elf_errmsg( -1 ) ); + return false; + } + + /* Read this into memory by iterating over sections */ + while ( ( scn = elf_nextscn( e, scn ) ) != NULL ) + { + + if ( gelf_getshdr( scn, &shdr ) != &shdr ) + { + fprintf( stderr, "getshdr () failed : %s\n", elf_errmsg( -1 ) ); + return false; + } + + if ( ( name = elf_strptr ( e, shstrndx, shdr.sh_name ) ) == NULL ) + { + fprintf( stderr, " elf_strptr () failed : %s\n", elf_errmsg ( -1 ) ); + return false; + } + + if ( ( shdr.sh_flags & SHF_ALLOC ) && ( shdr.sh_type == SHT_PROGBITS ) ) + { + Elf_Data *data = NULL; + + /* This is program code or data; Allocate a new section */ + if ( ( data = elf_rawdata ( scn, data ) ) != NULL ) + { + p->mem = ( struct symbolMemoryStore * )realloc( p->mem, ( p->nsect_mem + 1 ) * sizeof( struct symbolMemoryStore ) ); + struct symbolMemoryStore *n = p->mem + p->nsect_mem; + p->nsect_mem++; + + n->start = shdr.sh_addr; + n->len = shdr.sh_size; + n->name = strdup( name ); + n->data = ( uint8_t * )malloc( n->len ); + memmove( n->data, data->d_buf, n->len ); + } + } + } + + /* Sort mem sections into order so it's straightforward to find matches */ + qsort( p->mem, p->nsect_mem, sizeof( struct symbolMemoryStore ), _compareMem ); + p->cachedSearchIndex = -1; + elf_end( e ); + return p; +} + +// ==================================================================================================== + +int _findOrAddString( const char *stringToFindorAdd, char ***table, unsigned int *elementCount ) + +{ + /* Find the string in the specified table (and return its index) or create a new string record and return that index */ + for ( int i = 0; i < *elementCount; i++ ) + { + if ( !strcmp( ( *table )[i], stringToFindorAdd ) ) + { + return i; + } + } + + /* This string doesn't exist...add it and then return the index */ + *table = ( char ** )realloc( *table, sizeof( char * ) * ( ( *elementCount ) + 1 ) ); + ( *table )[*elementCount] = strdup( stringToFindorAdd ); + + ( *elementCount )++; + return ( *elementCount ) - 1; +} + +// ==================================================================================================== + +#ifdef TESTING_LOADELF +static void _dump_die_attribs( Dwarf_Debug dbg, Dwarf_Die die ) + +{ + Dwarf_Attribute *attrs; + Dwarf_Signed attr_count; + const char *name; + + if ( DW_DLV_OK != dwarf_attrlist( die, &attrs, &attr_count, 0 ) ) + { + fprintf( stderr, "Requesting attributes failed\n" ); + return; + } + + // Iterate through attributes + for ( int i = 0; i < attr_count; ++i ) + { + Dwarf_Half attr; + Dwarf_Attribute attr_ptr = attrs[i]; + + if ( DW_DLV_OK != dwarf_whatattr( attr_ptr, &attr, 0 ) ) + { + fprintf( stderr, "Failed to itentify attribute\n" ); + goto terminate; + } + + dwarf_get_AT_name( attr, &name ); + fprintf( stderr, "Attribute Name: %s\n", name ); + } + + // Free attribute list +terminate: + dwarf_dealloc( dbg, attrs, DW_DLA_LIST ); +} +#endif + +// ==================================================================================================== + +static void _getSourceLines( struct symbol *p, Dwarf_Debug dbg, Dwarf_Die die ) + + +{ + Dwarf_Unsigned version; + Dwarf_Line_Context linecontext; + Dwarf_Line *linebuf; + Dwarf_Signed linecount; + Dwarf_Small tc; + Dwarf_Addr line_addr; + Dwarf_Addr tracked_addr; + bool zero_start_dont_store; + char *file_name; + Dwarf_Unsigned line_num; + Dwarf_Bool begin; + Dwarf_Bool isset; + + /* Now, for each source line, pull it into the line storage */ + if ( DW_DLV_OK == dwarf_srclines_b( die, &version, &tc, &linecontext, 0 ) ) + { + dwarf_srclines_from_linecontext( linecontext, &linebuf, &linecount, 0 ); + tracked_addr = 0; + zero_start_dont_store = false; + + /* If a line address starts at zero, or is a direct continuation of a line that started at zero, then we dispose of it */ + /* We consider any line that is within 16 bytes of the previous one to be a continuation, to allow for padding. */ + for ( int i = 0; i < linecount; ++i ) + { + dwarf_line_is_addr_set( linebuf[i], &isset, 0 ); + dwarf_lineaddr( linebuf[i], &line_addr, 0 ); + dwarf_linebeginstatement( linebuf[i], &begin, 0 ); + + if ( ( isset ) && ( line_addr == 0 ) ) + { + zero_start_dont_store = true; + } + + if ( ( zero_start_dont_store && ( ( !begin ) || ( !line_addr ) || ( ( line_addr - tracked_addr ) < 16 ) ) ) ) + { + zero_start_dont_store = true; + } + else + { + zero_start_dont_store = false; + dwarf_lineno( linebuf[i], &line_num, 0 ); + dwarf_linesrc( linebuf[i], &file_name, 0 ); + + p->line = ( struct symbolLineStore ** )realloc( p->line, sizeof( struct symbolLineStore * ) * ( p->nlines + 1 ) ); + struct symbolLineStore *newLine = p->line[p->nlines] = ( struct symbolLineStore * )calloc( 1, sizeof( struct symbolLineStore ) ); + p->nlines++; + newLine->startline = line_num; + newLine->lowaddr = line_addr; + newLine->isinline = true; + newLine->filename = _findOrAddString( file_name, &p->stringTable[PT_FILENAME], &p->tableLen[PT_FILENAME] ); + } + + tracked_addr = line_addr; + } + + dwarf_srclines_dealloc_b( linecontext ); + } +} + +// ==================================================================================================== + +void _dwarf_error( Dwarf_Error e, void *ptr ) +{ + fprintf( stderr, "Reached error:%s\n", dwarf_errmsg( e ) ); + exit( -1 ); +} + +// ==================================================================================================== + +void _dwarf_print( void *p, const char *line ) + +{ + fprintf( stderr, "%s", line ); +} + +// ==================================================================================================== + +static void _processFunctionDie( struct symbol *p, Dwarf_Debug dbg, Dwarf_Die die, int filenameN, int producerN, Dwarf_Addr cu_base_addr ) + +{ + char *name = NULL; + char *manglename = NULL; + Dwarf_Addr h = 0; + Dwarf_Addr l = 0; + enum Dwarf_Form_Class formclass = DW_FORM_CLASS_UNKNOWN; + + Dwarf_Attribute attr_data; + Dwarf_Half attr_tag; + bool isinline = false; + struct symbolFunctionStore *newFunc; + + Dwarf_Off specification_offset; + Dwarf_Die specification_die; + + /* See if this is an inline die usage */ + attr_tag = DW_AT_abstract_origin; + + if ( DW_DLV_OK == dwarf_attr( die, attr_tag, &attr_data, 0 ) ) + { + /* It is, so track back to the real one */ + Dwarf_Off abstract_origin_offset; + Dwarf_Die abstract_origin_die; + attr_tag = DW_AT_abstract_origin; + dwarf_attr( die, attr_tag, &attr_data, 0 ); + dwarf_global_formref( attr_data, &abstract_origin_offset, 0 ); + dwarf_offdie_b( dbg, abstract_origin_offset, IS_INFO, &abstract_origin_die, 0 ); + isinline = true; + } + else + { + dwarf_highpc_b ( die, &h, 0, &formclass, 0 ); + dwarf_lowpc ( die, &l, 0 ); + } + + if ( formclass == DW_FORM_CLASS_CONSTANT ) + { + h += l; + } + + specification_die = die; + + /* Get the possibly mangled linkage name if it exists */ + if ( DW_DLV_OK == dwarf_attr( die, DW_AT_linkage_name, &attr_data, 0 ) ) + { + dwarf_formstring( attr_data, &manglename, 0 ); + } + + if ( DW_DLV_OK != dwarf_diename( die, &name, 0 ) ) + { + /* Name will be hidden in a specification reference */ + attr_tag = DW_AT_specification; + + if ( dwarf_attr( die, attr_tag, &attr_data, 0 ) == DW_DLV_OK ) + { + dwarf_attr( die, attr_tag, &attr_data, 0 ); + + if ( DW_DLV_OK == dwarf_global_formref( attr_data, &specification_offset, 0 ) ) + { + dwarf_offdie_b( dbg, specification_offset, IS_INFO, &specification_die, 0 ); + dwarf_diename( specification_die, &name, 0 ); + } + } + } + + if ( name && l && h ) + { + p->func = ( struct symbolFunctionStore ** )realloc( p->func, sizeof( struct symbolFunctionStore * ) * ( p->nfunc + 1 ) ); + newFunc = p->func[p->nfunc] = ( struct symbolFunctionStore * )calloc( 1, sizeof( struct symbolFunctionStore ) ); + newFunc->isinline = isinline; + p->nfunc++; + + newFunc->funcname = strdup( name ); + newFunc->producer = producerN; + newFunc->filename = filenameN; + newFunc->lowaddr = l; + newFunc->highaddr = h - 1; + + if ( manglename ) + { + newFunc->manglename = strdup( manglename ); + } + + /* Collect start of function line and column */ + attr_tag = DW_AT_decl_line; + + if ( dwarf_attr( specification_die, attr_tag, &attr_data, 0 ) == DW_DLV_OK ) + { + Dwarf_Unsigned no; + dwarf_formudata( attr_data, &no, 0 ); + newFunc->startline = no; + } + + attr_tag = DW_AT_decl_column; + + if ( dwarf_attr( specification_die, attr_tag, &attr_data, 0 ) == DW_DLV_OK ) + { + Dwarf_Unsigned no; + dwarf_formudata( attr_data, &no, 0 ); + newFunc->startcol = no; + } + } +} + +// ==================================================================================================== + +static void _processDie( struct symbol *p, Dwarf_Debug dbg, Dwarf_Die die, int level, int filenameN, int producerN, Dwarf_Addr cu_base_addr ) + +{ + Dwarf_Half tag; + Dwarf_Die child; + + Dwarf_Die sib = die; + + while ( DW_DLV_OK == dwarf_siblingof_b( dbg, sib, IS_INFO, &sib, 0 ) ) + { + dwarf_tag( sib, &tag, 0 ); + const char *n; + dwarf_get_TAG_name( tag, &n ); + + if ( ( tag == DW_TAG_subprogram ) || ( tag == DW_TAG_inlined_subroutine ) ) + { + _processFunctionDie( p, dbg, sib, filenameN, producerN, cu_base_addr ); + } + } + + if ( DW_DLV_OK == dwarf_child( die, &child, 0 ) ) + { + _processDie( p, dbg, child, level + 1, filenameN, producerN, cu_base_addr ); + dwarf_dealloc( dbg, child, DW_DLA_DIE ); + } +} + +// ==================================================================================================== + +static bool _isAbsPath( const char *p ) + +{ + /* Path is absolute if it starts with / or x: where x is in the range A..Z. */ + return ( + ( p[0] == '/' ) || + ( ( toupper( p[0] ) >= 'A' ) && ( toupper( p[0] ) <= 'Z' ) && ( p[1] == ':' ) ) + ); +} + +// ==================================================================================================== + +static char *_joinPaths( const char *p1, const char *p2 ) + +{ + if ( _isAbsPath( p2 ) ) + { + return strdup( p2 ); + } + else + { + char *res = ( char * )malloc( strlen( p1 ) + strlen( p2 ) + 2 ); + strcpy( res, p1 ); + strcat( res, "/" ); + strcat( res, p2 ); + return res; + } +} + +// ==================================================================================================== + +static bool _readLines( struct symbol *p ) +{ + Dwarf_Debug dbg; + Dwarf_Error err; + Dwarf_Unsigned cu_header_length = 0; + Dwarf_Half version_stamp = 0; + Dwarf_Off abbrev_offset = 0; + Dwarf_Addr cu_low_addr; + Dwarf_Half address_size = 0; + Dwarf_Unsigned next_cu_header = 0; + Dwarf_Die cu_die = NULL; + + bool retval = false; + Dwarf_Half dw_length_size = 0; + Dwarf_Half dw_extension_size = 0; + Dwarf_Sig8 dw_type_signature; + Dwarf_Unsigned dw_typeoffset = 0; + Dwarf_Half dw_header_cu_type = DW_UT_compile; + + char *name; + char *producer; + char *compdir; + + unsigned int filenameN; + unsigned int producerN; + + if ( 0 != dwarf_init_b( p->fd, DW_GROUPNUMBER_ANY, NULL, NULL, &dbg, &err ) ) + { + return false; + } + + struct Dwarf_Printf_Callback_Info_s print_setup = + { + .dp_user_pointer = p, + .dp_fptr = &_dwarf_print, + .dp_buffer = _print_buffer, + .dp_buffer_len = DP_MAX_LINE_LEN, + .dp_buffer_user_provided = true, + .dp_reserved = NULL + + }; + + dwarf_register_printf_callback( dbg, &print_setup ); + + /* Add an empty string to each string table, so the 0th element is the empty string in all cases */ + for ( enum symbolTables pt = 0; pt < PT_NUMTABLES; pt++ ) + { + _findOrAddString( "", &p->stringTable[pt], &p->tableLen[pt] ); + } + + /* 1: Collect the functions and lines */ + /* ---------------------------------- */ + while ( true ) + { + memset( &dw_type_signature, 0, sizeof( dw_type_signature ) ); + + if ( DW_DLV_OK != dwarf_next_cu_header_d( dbg, true, &cu_header_length, + &version_stamp, &abbrev_offset, &address_size, + &dw_length_size, &dw_extension_size, &dw_type_signature, + &dw_typeoffset, &next_cu_header, &dw_header_cu_type, 0 ) ) + { + break; + } + + dwarf_siblingof_b( dbg, NULL, IS_INFO, &cu_die, 0 ); + + dwarf_diename( cu_die, &name, 0 ); + dwarf_die_text( cu_die, DW_AT_producer, &producer, 0 ); + dwarf_die_text( cu_die, DW_AT_comp_dir, &compdir, 0 ); + + /* Need to construct the fully qualified filename from the directory + filename */ + char *s = _joinPaths( compdir, name ); + filenameN = _findOrAddString( s, &p->stringTable[PT_FILENAME], &p->tableLen[PT_FILENAME] ); + free( s ); + producerN = _findOrAddString( producer, &p->stringTable[PT_PRODUCER], &p->tableLen[PT_PRODUCER] ); + + /* Kickoff the process for the DIE and its children to get the functions in this cu */ + + dwarf_lowpc( cu_die, &cu_low_addr, 0 ); + _processDie( p, dbg, cu_die, 0, filenameN, producerN, cu_low_addr ); + + /* ...and the source lines */ + _getSourceLines( p, dbg, cu_die ); + + dwarf_dealloc( dbg, cu_die, DW_DLA_DIE ); + } + + if ( p->nlines && p->nfunc ) + { + /* 2: We have the lines and functions. Clean them up and interlink them so they're useful to applications */ + /* ------------------------------------------------------------------------------------------------------ */ + /* Sort tables into address order, just in case they're not ... no gaurantees from the DWARF */ + qsort( p->line, p->nlines, sizeof( struct symbolLineStore * ), _compareLineMem ); + qsort( p->func, p->nfunc, sizeof( struct symbolFunctionStore * ), _compareFunc ); + + /* Combine addresses in the lines table which have the same memory location...those aren't too useful for us */ + int nlines = 0; + struct symbolLineStore **nls = NULL; + + for ( int i = 0; i < p->nlines - 1; i++ ) + { + nls = ( struct symbolLineStore ** )realloc( nls, sizeof( struct symbolLineStore * ) * ( nlines + 1 ) ); + + if ( !nls ) + { + genericsExit( -1, "Memory allocation failure" EOL ); + } + + nls[nlines] = p->line[i]; + + /* Roll forward through all lines which have the same start address */ + while ( ( ++i < p->nlines - 1 ) && + ( ( nls[nlines]->filename == p->line[i]->filename ) ) && + ( ( nls[nlines]->lowaddr == p->line[i]->lowaddr ) ) ) + { + /* This line needs to be freed in memory 'cos otherwise there is no reference to it anywhere */ + free( p->line[i] ); + } + + nlines++; + } + + free( p->line ); + p->line = nls; + p->nlines = nlines; + + nlines = 0; + nls = NULL; + + /* Now do the same for lines with the same line number and file */ + /* We can also set the high memory extent for each line here */ + for ( int i = 0; i < p->nlines - 1; i++ ) + { + nls = ( struct symbolLineStore ** )realloc( nls, sizeof( struct symbolLineStore * ) * ( nlines + 1 ) ); + nls[nlines] = p->line[i]; + + while ( ( ++i < p->nlines - 1 ) && + ( nls[nlines]->startline == p->line[i]->startline ) && + ( nls[nlines]->filename == p->line[i]->filename ) ) + { + free( p->line[i] ); + } + + nls[nlines]->highaddr = p->line[i]->lowaddr - 1; + nlines++; + } + + free( p->line ); + p->line = nls; + p->nlines = nlines; + + if ( !p->nlines ) + { + fprintf( stderr, "No lines found in file\n" ); + } + else + { + p->line[p->nlines - 1]->highaddr = p->line[p->nlines - 1]->lowaddr + 2; + p->line[0]->lowaddr = p->line[0]->highaddr - 2; + + /* Allocate lines to functions ... these will be in address order 'cos the lines already are */ + for ( int i = 0; i < p->nlines; i++ ) + { + struct symbolFunctionStore *f = symbolFunctionAt( p, p->line[i]->lowaddr ); + p->line[i]->function = f; + p->line[i]->isinline = false; + + if ( f ) + { + f->line = ( struct symbolLineStore ** )realloc( f->line, sizeof( struct symbolLineStore * ) * ( f->nlines + 1 ) ); + f->line[f->nlines] = p->line[i]; + f->nlines++; + } + } + + retval = true; + } + } + + dwarf_finish( dbg ); + + return retval; +} + +// ==================================================================================================== + +static bool _loadSource( struct symbol *p ) + +{ + char *r; + size_t l; + + /* We need to aqquire source code for all of the files that we have an entry in the stringtable, so let's start by making room */ + p->source = ( struct symbolSourcecodeStore ** )calloc( 1, sizeof( struct symbolSourcecodeStore * )*p->tableLen[PT_FILENAME] ); + + for ( int i = 0; i < p->tableLen[PT_FILENAME]; i++ ) + { + r = readsourcefile( p->stringTable[PT_FILENAME][i], &l ); + + /* Create an entry for this file. It will remain zero (NULL) if there are no lines in it, because r was NULL */ + struct symbolSourcecodeStore *store = p->source[i] = ( struct symbolSourcecodeStore * )calloc( 1, sizeof( struct symbolSourcecodeStore ) ); + + /* Lines in sio.c are demarked by \n, \r or \0 ... so we just need to find the indicies to one after each of those */ + while ( l ) + { + /* Add this line to the storage. */ + store->linetext = ( char ** )realloc( store->linetext, sizeof( char * ) * ( store->nlines + 1 ) ); + store->linetext[store->nlines++] = r; + + /* Spin forwards for next newline or eof */ + while ( ( --l > 0 ) && ( *r++ != '\n' ) ) {}; + + if ( l ) + { + *r++ = 0; + l--; + } + } + } + + return true; +} + +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== +// Publically available routines +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== + +const char *symbolSource( struct symbol *p, unsigned int fileNumber, unsigned int lineNumber ) + +/* Return pointer to source code for specified line in file index */ + +{ + assert( p ); + + if ( ( fileNumber < p->tableLen[PT_FILENAME] ) && p->source && ( lineNumber < p->source[fileNumber]->nlines ) ) + { + return ( const char * )p->source[fileNumber]->linetext[lineNumber]; + } + else + { + return NULL; + } +} +// ==================================================================================================== + +struct symbolFunctionStore *symbolFunctionAt( struct symbol *p, symbolMemaddr addr ) + +/* Return function that encloses specified address, or NULL */ + +{ + assert( p ); + struct symbolFunctionStore **fp = ( struct symbolFunctionStore ** )bsearch( &addr, p->func, p->nfunc, sizeof( struct symbolFunctionStore * ), _matchFunc ); + + return fp ? *fp : NULL; +} + +// ==================================================================================================== + +struct symbolFunctionStore *symbolFunctionIndex( struct symbol *p, unsigned int index ) + +/* Get indexed function, or NULL if out of range */ + +{ + assert( p ); + return ( index < p->nfunc ) ? p->func[index] : NULL; +} + +// ==================================================================================================== +struct symbolLineStore *symbolLineIndex( struct symbol *p, unsigned int index ) + +/* Get indexed line, or NULL if out of range */ + +{ + assert( p ); + return ( index < p->nlines ) ? p->line[index] : NULL; +} +// ==================================================================================================== + +struct symbolLineStore *symbolFunctionLineIndex( struct symbolFunctionStore *f, unsigned int index ) + +/* Get indexed line with distinct memory address covered by function */ + +{ + assert( f ); + return ( index < f->nlines ) ? f->line[index] : NULL; +} +// ==================================================================================================== + +struct symbolLineStore *symbolLineAt( struct symbol *p, symbolMemaddr addr ) + +/* Return line covered by specified memory address, or NULL */ + +{ + assert( p ); + struct symbolLineStore **l = ( struct symbolLineStore ** )bsearch( &addr, p->line, p->nlines, sizeof( struct symbolLineStore * ), _matchLine ); + return l ? *l : NULL; +} + +// ==================================================================================================== + +const char *symbolGetProducer( struct symbol *p, unsigned int index ) + +/* Get command line that produced this code */ + +{ + assert( p ); + return ( index < p->tableLen[PT_PRODUCER] ) ? p->stringTable[PT_PRODUCER][index] : NULL; +} + +// ==================================================================================================== + +const char *symbolGetFilename( struct symbol *p, unsigned int index ) + +/* Get filename string for specified index */ + +{ + assert( p ); + return ( index < p->tableLen[PT_FILENAME] ) ? p->stringTable[PT_FILENAME][index] : NULL; +} + +// ==================================================================================================== + +symbolMemptr symbolCodeAt( struct symbol *p, symbolMemaddr addr, unsigned int *len ) + +/* Get pointer to memory at specified address...can move backwards and forwards through the region */ + +{ + assert( p ); + int i; + + /* A speedup in case we're looking in the same region as previously */ + if ( ( p->cachedSearchIndex != -1 ) && + ( p->mem[p->cachedSearchIndex].start < addr ) && + ( addr - p->mem[p->cachedSearchIndex].start < p->mem[p->cachedSearchIndex].len ) ) + { + if ( len ) + { + *len = p->mem[p->cachedSearchIndex].len - ( addr - p->mem[p->cachedSearchIndex].start ); + } + + return &( p->mem[p->cachedSearchIndex].data[addr - p->mem[p->cachedSearchIndex].start] ); + } + + /* Search backwards for candidate section for memory to be in. This could be */ + /* slightly more efficient as a binary search, but setup would offset any benefits */ + for ( i = p->nsect_mem - 1; i && p->mem[i].start > addr; i-- ); + + /* Are we within this code? */ + if ( addr - p->mem[i].start < p->mem[i].len ) + { + p->cachedSearchIndex = i; + + if ( len ) + { + *len = p->mem[i].len - ( addr - p->mem[i].start ); + } + + return &( p->mem[i].data[addr - p->mem[i].start] ); + } + else + { + p->cachedSearchIndex = -1; + return NULL; + } +} + +// ==================================================================================================== + +void symbolDelete( struct symbol *p ) + +/* Delete symbol set */ + +{ + if ( p ) + { + /* We are done with any elf that might have been open */ + if ( p->fd >= 0 ) + { + /* There is no point in nulling p->fd cos we will delete p anyway */ + close( p->fd ); + } + + /* Close the disassembler if it's in use */ + if ( !p->caphandle ) + { + cs_close( &p->caphandle ); + } + + if ( p->nsect_mem ) + { + for ( int i = p->nsect_mem - 1; i; i-- ) + { + if ( p->mem[i].name ) + { + free( p->mem[i].name ); + + if ( p->mem[i].data ) + { + free( p->mem[i].data ); + } + } + } + + free( p->mem ); + } + + while ( p->nfunc ) + { + struct symbolFunctionStore *f = p->func[--p->nfunc]; + + if ( f->funcname ) + { + /* Remove the functionName, assuming we have one */ + free( f->funcname ); + } + + if ( f->manglename ) + { + /* Remove the mangled name, assuming we have one */ + free( f->manglename ); + } + + if ( f->line ) + { + /* ...and any source code cross-references */ + free( f->line ); + } + + free( f ); + } + + /* Flush the string tables */ + for ( enum symbolTables pt = 0; pt < PT_NUMTABLES; pt++ ) + { + while ( p->tableLen[pt] ) + { + free( p->stringTable[pt][--p->tableLen[pt]] ); + } + } + + /* Flush the source code line records */ + for ( int i = 0; i < p->nlines; i++ ) + { + free( p->line[i] ); + } + + if ( p->line ) + { + free( p->line ); + } + + /* Remove any source code we might be holding */ + for ( int i = 0; i < p->tableLen[PT_FILENAME]; i++ ) + { + /* Text is all allocated in one block by readsource, so just deleting the firt element is enough */ + free( p->source[i]->linetext[0] ); + + /* ...and the block of pointers to lines in that text */ + free( p->source[i] ); + } + + free( p ); + } + + p = NULL; +} + +// ==================================================================================================== + +char *symbolDisassembleLine( struct symbol *p, enum instructionClass *ic, symbolMemaddr addr, symbolMemaddr *newaddr ) + +/* Return assembly code representing this line */ + +{ + cs_insn *insn; + size_t count; + static char op[255]; + + if ( newaddr ) + { + *newaddr = NO_ADDRESS; + } + + *ic = 0; + + if ( !p->caphandle ) + { + /* Disassembler isn't initialised yet */ + if ( cs_open( CS_ARCH_ARM, CS_MODE_THUMB + CS_MODE_LITTLE_ENDIAN, &p->caphandle ) != CS_ERR_OK ) + { + return NULL; + } + + cs_option( p->caphandle, CS_OPT_DETAIL, CS_OPT_ON ); + } + + symbolMemptr m = symbolCodeAt( p, addr, NULL ); + + if ( !m ) + { + /* If we don't have memory then we can't decode */ + return NULL; + } + + count = cs_disasm( p->caphandle, m, 4, addr, 0, &insn ); + *ic = LE_IC_NONE; + + + if ( count > 0 ) + { + /* Characterise the instruction using rules from F1.3 of ARM IHI0064H.a */ + + /* Check instruction size */ + *ic |= ( insn->size == 4 ) ? LE_IC_4BYTE : 0; + + /* Was it a subroutine call? */ + *ic |= ( ( insn->id == ARM_INS_BL ) || ( insn->id == ARM_INS_BLX ) ) ? LE_IC_JUMP | LE_IC_CALL : 0; + + /* Was it a regular call? */ + *ic |= ( ( insn->id == ARM_INS_B ) || ( insn->id == ARM_INS_BX ) || ( insn->id == ARM_INS_ISB ) || + ( insn->id == ARM_INS_WFI ) || ( insn->id == ARM_INS_WFE ) || ( insn->id == ARM_INS_TBB ) || + ( insn->id == ARM_INS_TBH ) || ( insn->id == ARM_INS_BXJ ) || ( insn->id == ARM_INS_CBZ ) || + ( insn->id == ARM_INS_CBNZ ) || ( insn->id == ARM_INS_WFI ) || ( insn->id == ARM_INS_WFE ) + ) ? LE_IC_JUMP : 0; + + *ic |= ( + ( ( ( insn->id == ARM_INS_SUB ) || ( insn->id == ARM_INS_MOV ) || + ( insn->id == ARM_INS_LDM ) || ( insn->id == ARM_INS_POP ) ) + && strstr( insn->op_str, "pc" ) ) + ) ? LE_IC_JUMP : 0; + + /* Was it an exception return? */ + *ic |= ( ( insn->id == ARM_INS_ERET ) ) ? LE_IC_JUMP | LE_IC_IRET : 0; + + + /* Add text describing instruction */ + if ( *ic & LE_IC_4BYTE ) + { + sprintf( op, "%8"PRIx64": %02x%02x %02x%02x %s %s", insn->address, insn->bytes[1], insn->bytes[0], insn->bytes[3], insn->bytes[2], insn->mnemonic, insn->op_str ); + } + else + { + sprintf( op, "%8"PRIx64": %02x%02x %s %s", insn->address, insn->bytes[1], insn->bytes[0], insn->mnemonic, insn->op_str ); + } + + /* Check to see if operands are immediate */ + cs_detail *detail = insn->detail; + + if ( detail->arm.op_count ) + { + + for ( int n = 0; n < insn->detail->arm.op_count; n++ ) + { + if ( insn->detail->arm.operands[n].type == ARM_OP_IMM ) + { + *ic |= LE_IC_IMMEDIATE; + + if ( newaddr ) + { + *newaddr = detail->arm.operands[0].imm; + } + + break; + } + } + } + + + /* Add classifications ( for debug ) */ + //if ( *ic ) + // { + // fsprintf ( stderr, &op[strlen( op )], " ; %s%s%s%s", *ic & LE_IC_JUMP ? "JUMP " : "", *ic & LE_IC_CALL ? "CALL " : "", *ic & LE_IC_IMMEDIATE ? "IMM " : "", *ic & LE_IC_IRET ? "IRET " : "" ); + // } + } + else + { + sprintf( op, "No disassembly" ); + } + + cs_free( insn, count ); + + return op; +} + +// ==================================================================================================== + +bool symbolSetValid( struct symbol *p ) + +/* Check if current symbols are valid. True if we've read them and the file we read from hasn't */ +/* evaporated in the meantime. Not a perfect heuristic, but pretty reasonable. */ + +{ +#define ELF_MAGIC (0x464c457f) + uint32_t magicMatch; + + if ( ( p ) && ( p->fd >= 0 ) ) + { + /* See if we can read from this file */ + lseek( p->fd, 0, SEEK_SET ); + + if ( sizeof( magicMatch ) == read( p->fd, &magicMatch, sizeof( magicMatch ) ) ) + { + if ( ELF_MAGIC == magicMatch ) + { + return true; + } + } + } + + return false; +} + +// ==================================================================================================== + +struct symbol *symbolAcquire( char *filename, bool loadmem, bool loadsource ) + +/* Collect symbol set with specified components */ + +{ + struct symbol *p = ( struct symbol * )calloc( 1, sizeof( struct symbol ) ); + + /* O_BINARY Only needed on platforms that differentiate between binary and text files */ +#ifndef O_BINARY + + if ( ( p->fd = open( filename, O_RDONLY, 0 ) ) < 0 ) +#else + if ( ( p->fd = open( filename, O_RDONLY | O_BINARY, 0 ) ) < 0 ) +#endif + { + free( p ); + return NULL; + } + + /* Load the memory image if this was requested...if it fails then we fail */ + if ( loadmem && ( !_readProg( p ) ) ) + { + symbolDelete( p ); + return NULL; + } + + /* Load the functions and source code line mappings if requested */ + if ( !_readLines( p ) ) + { + symbolDelete( p ); + return NULL; + } + + /* ...finally, the source code if requested. This can only be done if mem or functions we requested */ + if ( ( loadsource && loadmem ) && !_loadSource( p ) ) + { + symbolDelete( p ); + return NULL; + } + + return p; +} +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== +// Test routines +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== + +/* Test routines can be built with; + * gcc -DTESTING_LOADELF loadelf.c readsource.c -I../Inc -I../subprojects/libdwarf-0.7.0/src/lib/libdwarf -ggdb -lcapstone -lelf ../build/subprojects/libdwarf-0.7.0/src/lib/libdwarf/libdwarf.so.0 + */ + +#ifdef TESTING_LOADELF + +bool _listLines( struct symbol *p ) + +{ + int index = 0; + struct symbolLineStore *l; + + while ( ( l = symbolLineIndex( p, index++ ) ) ) + { + fprintf( stderr, " " MEMADDRF "..." MEMADDRF " %4d ( %s )" EOL, l->lowaddr, l->highaddr, l->startline, symbolGetFilename( p, l->filename ) ); + } +} + +// ==================================================================================================== + +bool _listFunctions( struct symbol *p, bool includeLines ) + +{ + int iter = 0; + struct symbolFunctionStore *f; + struct symbolLineStore *l; + + while ( f = symbolFunctionIndex( p, iter++ ) ) + { + fprintf( stderr, MEMADDRF "..." MEMADDRF " %s ( %s %d,%d ) %s" EOL, f->lowaddr, f->highaddr, f->funcname, symbolGetFilename( p, f->filename ), f->startline, f->startcol, + f->manglename ? f->manglename : "" ); + + if ( includeLines ) + { + int iter2 = 0; + + while ( l = symbolFunctionLineIndex( f, iter2++ ) ) + { + fprintf( stderr, " " MEMADDRF "..." MEMADDRF " %4d ( %s )" EOL, l->lowaddr, l->highaddr, l->startline, symbolGetFilename( p, l->filename ) ); + + if ( ( l->function != f ) || ( l->filename != f->filename ) ) + { + fprintf( stderr, "*****DATA INCONSISTENCY" EOL ); + } + } + } + } +} + +// ==================================================================================================== + +bool _listFile( struct symbol *p, int fileNo ) + +{ + const char *t; + int i = 0; + + while ( t = symbolSource( p, fileNo, i++ ) ) + { + fprintf( stderr, "%s", t ); + } +} + +// ==================================================================================================== + +bool _disassemble( struct symbol *p, symbolMemaddr a, unsigned int len ) + + +{ + enum instructionClass ic; + symbolMemaddr addr; + symbolMemaddr newaddr; + + for ( addr = a; addr < a + len; addr += ic & LE_IC_4BYTE ? 4 : 2 ) + { + char *u = symbolDisassembleLine( p, &ic, addr, &newaddr ); + fprintf( stderr, "%s\n", u ); + } + + return true; +} +// ==================================================================================================== + +void main( int argc, char *argv[] ) + +{ + enum instructionClass ic; + struct symbol *p = symbolAcquire( argv[1], true, true ); + + if ( !p ) + { + fprintf( stderr, "Failed to aquire" EOL ); + exit( -1 ); + } + + struct symbolLineStore *s; + + for ( int i = 0; i < p->nlines; i++ ) + { + s = symbolLineIndex( p, i ); + + fprintf( stderr, "\n%08x ... %08x %s %s", ( uint32_t )s->lowaddr, ( uint32_t )s->highaddr, s->isinline ? "INLINE" : "", symbolSource( p, s->filename, s->startline - 1 ) ); + + if ( ( s->lowaddr > 0x08000000 ) && ( s->highaddr != -1 ) ) + for ( symbolMemaddr b = s->lowaddr; b < s->highaddr; ) + { + fprintf( stderr, " %s\n", symbolDisassembleLine( p, &ic, b, NULL ) ); + b += ic & LE_IC_4BYTE ? 4 : 2; + } + } +} +// ==================================================================================================== +#endif diff --git a/Src/nwclient.c b/Src/nwclient.c index d63ca460..e406b98c 100644 --- a/Src/nwclient.c +++ b/Src/nwclient.c @@ -9,6 +9,7 @@ #include #include #include +#include #ifdef WIN32 #include #include @@ -41,9 +42,6 @@ #endif #endif -/* Shared ring buffer for data */ -#define SHARED_BUFFER_SIZE (8*TRANSFER_SIZE) - /* Master structure for the set of nwclients */ struct nwclientsHandle @@ -51,12 +49,8 @@ struct nwclientsHandle volatile struct nwClient *firstClient; /* Head of linked list of network clients */ pthread_mutex_t clientList; /* Lock for list of network clients */ - int wp; /* Next write to shared buffer */ - uint8_t sharedBuffer[SHARED_BUFFER_SIZE]; /* Data waiting to be sent to the clients */ - int sockfd; /* The socket for the inferior */ pthread_t ipThread; /* The listening thread for n/w clients */ - bool finish; /* Its time to leave */ }; /* Descriptor for individual connected network clients */ @@ -64,17 +58,12 @@ struct nwClient { int handle; /* Handle to client */ - pthread_t thread; /* Execution thread */ struct nwclientsHandle *parent; /* Who owns this list */ volatile struct nwClient *nextClient; volatile struct nwClient *prevClient; - bool finish; /* Flag indicating it's time to cease operation */ - pthread_cond_t dataAvailable; /* Semaphore counting data for clients */ - pthread_mutex_t dataAvailable_m; /* Mutex for counting data for clients */ /* Parameters used to run the client */ int portNo; /* Port of connection */ - int rp; /* Current read pointer in data stream */ }; // ==================================================================================================== @@ -107,20 +96,11 @@ static int _lock_with_timeout( pthread_mutex_t *mutex, const struct timespec *ts // ==================================================================================================== // Network server implementation for raw SWO feed // ==================================================================================================== -static void _clientRemove( struct nwClient *c ) +static void _clientRemoveNoLock( volatile struct nwClient *c ) { - const struct timespec ts = {.tv_sec = 1, .tv_nsec = 0}; - close( c->portNo ); - /* First of all, make sure we can get access to the client list */ - - if ( _lock_with_timeout( &c->parent->clientList, &ts ) < 0 ) - { - genericsExit( -1, "Failed to acquire mutex" EOL ); - } - if ( c->prevClient ) { c->prevClient->nextClient = c->nextClient; @@ -135,58 +115,8 @@ static void _clientRemove( struct nwClient *c ) c->nextClient->prevClient = c->prevClient; } - /* OK, we made our modifications */ - pthread_mutex_unlock( &c->parent->clientList ); - /* Remove the memory that was allocated for this client */ - free( c ); -} -// ==================================================================================================== -static void *_client( void *args ) - -/* Handle an individual network client account */ - -{ - struct nwClient *c = ( struct nwClient * )args; - ssize_t readDataLen; - uint8_t *p; - ssize_t sent = 0; - - while ( !c->finish ) - { - /* Spin until we're told there's something to send along */ - pthread_cond_wait( &c->dataAvailable, &c->dataAvailable_m ); - - while ( c->rp != c->parent->wp ) - { - /* Data to send is either to the end of the ring buffer or to the wp, whichever is first */ - readDataLen = ( c->rp < c->parent->wp ) ? c->parent->wp - c->rp : SHARED_BUFFER_SIZE - c->rp; - p = &( c->parent->sharedBuffer[c->rp] ); - c->rp = ( c->rp + readDataLen ) % SHARED_BUFFER_SIZE; - - while ( ( readDataLen > 0 ) && ( sent >= 0 ) ) - { - sent = send( c->portNo, ( const void * )p, readDataLen, MSG_NOSIGNAL ); - p += sent; - readDataLen -= sent; - } - - if ( c->finish || readDataLen ) - { - /* This port went away, so remove it */ - if ( !c->finish ) - { - genericsReport( V_INFO, "Connection dropped" EOL ); - } - - c->finish = true; - break; - } - } - } - - _clientRemove( c ); - return NULL; + free( ( void * )c ); } // ==================================================================================================== static void *_listenTask( void *arg ) @@ -207,11 +137,11 @@ static void *_listenTask( void *arg ) clilen = sizeof( cli_addr ); listen( h->sockfd, 5 ); - while ( !h->finish ) + while ( true ) { newsockfd = accept( h->sockfd, ( struct sockaddr * ) &cli_addr, &clilen ); - if ( h->finish ) + if ( newsockfd < 0 ) { close( newsockfd ); break; @@ -220,54 +150,54 @@ static void *_listenTask( void *arg ) inet_ntop( AF_INET, &cli_addr.sin_addr, s, 99 ); genericsReport( V_INFO, "New connection from %s" EOL, s ); - /* We got a new connection - spawn a thread to handle it */ + /* We got a new connection - spawn a record to handle it */ client = ( struct nwClient * )calloc( 1, sizeof( struct nwClient ) ); MEMCHECK( client, NULL ); client->parent = h; client->portNo = newsockfd; - client->rp = h->wp; - if ( pthread_mutex_init( &client->dataAvailable_m, NULL ) != 0 ) - { - genericsExit( -1, "Failed to establish mutex for condition variablee" EOL ); - } + /* Make port non-blocking */ +#ifdef WIN32 + unsigned long mode = 0; + ioctlsocket( newsockfd, FIONBIO, &mode ); +#else + int flags = fcntl( newsockfd, F_GETFL, 0 ); - if ( pthread_cond_init( &client->dataAvailable, NULL ) != 0 ) + if ( flags == -1 ) { - genericsExit( -1, "Failed to establish condition variable" EOL ); + return false; } - if ( pthread_create( &( client->thread ), NULL, &_client, client ) ) + flags |= O_NONBLOCK; + fcntl( newsockfd, F_SETFL, flags ); +#endif + + /* Hook into linked list */ + if ( _lock_with_timeout( &h->clientList, &ts ) < 0 ) { - genericsExit( -1, "Failed to create thread" EOL ); + genericsExit( -1, "Failed to acquire mutex" EOL ); } - else - { - /* Auto-cleanup for this thread */ - pthread_detach( client->thread ); - /* Hook into linked list */ - if ( _lock_with_timeout( &h->clientList, &ts ) < 0 ) - { - genericsExit( -1, "Failed to acquire mutex" EOL ); - } - client->nextClient = h->firstClient; - client->prevClient = NULL; + client->nextClient = h->firstClient; + client->prevClient = NULL; - if ( client->nextClient ) - { - client->nextClient->prevClient = client; - } + if ( client->nextClient ) + { + client->nextClient->prevClient = client; + } - h->firstClient = client; + h->firstClient = client; - pthread_mutex_unlock( &h->clientList ); - } + pthread_mutex_unlock( &h->clientList ); + } + + if ( h->sockfd ) + { + close( h->sockfd ); } - close( h->sockfd ); return NULL; } // ==================================================================================================== @@ -277,25 +207,12 @@ static void *_listenTask( void *arg ) // ==================================================================================================== // ==================================================================================================== // ==================================================================================================== -void nwclientSend( struct nwclientsHandle *h, uint32_t len, uint8_t *ipbuffer ) +void nwclientSend( struct nwclientsHandle *h, uint32_t len, const uint8_t *ipbuffer ) { const struct timespec ts = {.tv_sec = 1, .tv_nsec = 0}; - int newWp = ( h->wp + len ); - int toEnd = ( newWp > SHARED_BUFFER_SIZE ) ? SHARED_BUFFER_SIZE - h->wp : len; - int fromStart = len - toEnd; - /* Copy the received data into the shared buffer */ - memcpy( &h->sharedBuffer[h->wp], ipbuffer, toEnd ); - - if ( fromStart ) - { - memcpy( h->sharedBuffer, &ipbuffer[toEnd], fromStart ); - } - - h->wp = newWp % SHARED_BUFFER_SIZE; - - if ( !h->finish ) + if ( h && h->firstClient ) { if ( _lock_with_timeout( &h->clientList, &ts ) < 0 ) { @@ -307,8 +224,27 @@ void nwclientSend( struct nwclientsHandle *h, uint32_t len, uint8_t *ipbuffer ) while ( n ) { - pthread_cond_signal( ( pthread_cond_t * )&n->dataAvailable ); - n = n->nextClient; + ssize_t t = len; + ssize_t sent = 0; + void *p = ( void * )ipbuffer; + + while ( t && ( sent >= 0 ) ) + { + sent = send( n->portNo, p, t, MSG_NOSIGNAL ); + p += sent; + t -= sent; + } + + if ( t ) + { + volatile struct nwClient *newn = n->nextClient; + _clientRemoveNoLock( n ); + n = newn; + } + else + { + n = n->nextClient; + } } pthread_mutex_unlock( &h->clientList ); @@ -378,8 +314,10 @@ void nwclientShutdown( struct nwclientsHandle *h ) return; } - /* Flag that we're ending */ - h->finish = true; + /* Flag that we're ending - this ensures the listening thread dies */ + int tsockfd = h->sockfd; + h->sockfd = 0; + close( tsockfd ); if ( _lock_with_timeout( &h->clientList, &ts ) < 0 ) { @@ -388,30 +326,15 @@ void nwclientShutdown( struct nwclientsHandle *h ) volatile struct nwClient *c = h->firstClient; - /* Tell all the clients to terminate */ + /* Terminate all the clients */ while ( c ) { - c->finish = true; - - /* Closing the connection will kill the client */ - close( c->handle ); - - /* This is safe because we are locked by the mutex */ - c = c->nextClient; + volatile struct nwClient *newc = c->nextClient; + _clientRemoveNoLock( c ); + c = newc; } pthread_mutex_unlock( &h->clientList ); -} -// ==================================================================================================== -bool nwclientShutdownComplete( struct nwclientsHandle *h ) - -{ - if ( ! h->firstClient ) - { - free( h ); - return true; - } - - return false; + free( h ); } // ==================================================================================================== diff --git a/Src/oflow.c b/Src/oflow.c new file mode 100644 index 00000000..48bb463b --- /dev/null +++ b/Src/oflow.c @@ -0,0 +1,139 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ + +/* + * ORBFLOW Encoder/Decoder Module + * ============================== + * + * + */ + +#include +#include +#include +#include +#include "cobs.h" +#include "oflow.h" + +// ==================================================================================================== +struct OFLOW *OFLOWInit( struct OFLOW *t ) + +/* Reset a OFLOW instance */ + +{ + if ( !t ) + { + t = ( struct OFLOW * )calloc( 1, sizeof( struct OFLOW ) ); + t->selfAllocated = true; + } + + /* Initialise the containing COBS instance */ + COBSInit( &t->c ); + + return t; +} +// ==================================================================================================== +void OFLOWDelete( struct OFLOW *t ) + +/* Destroy a OFLOW instance, but only if we created it */ + +{ + /* Need to remove the containing COBS instance */ + COBSDelete( &t->c ); + + if ( t->selfAllocated ) + { + free( t ); + t = NULL; + } +} + +// ==================================================================================================== + +void OFLOWEncode( const uint8_t channel, const uint64_t tstamp, const uint8_t *inputMsg, int len, struct Frame *o ) + +/* Encode frame and write into provided output Frame buffer */ + +{ + const uint8_t frontMatter[1] = { channel }; + uint8_t sum = channel; + + /* Calculate packet sum for last byte */ + for ( int i = 0; i < len; i++ ) + { + sum += inputMsg[i]; + } + + /* Ensure total sums to 0 */ + uint8_t backMatter[1] = { 256 - sum }; + + COBSEncode( frontMatter, 1, backMatter, 1, inputMsg, len, o ); +} + +// ==================================================================================================== + +bool OFLOWisEOFRAME( const uint8_t *inputEnc ) + +{ + return ( COBS_SYNC_CHAR == *inputEnc ); +} + +// ==================================================================================================== +static void _pumpcb( struct Frame *p, void *param ) + +{ + /* Callback function when a COBS packet is complete */ + struct OFLOW *t = ( struct OFLOW * )param; + + t->f.len = p->len - 2; /* OFLOW frames have the first element representing the tag and last element the checksum */ + t->f.tag = p->d[0]; /* First byte of an OFLOW frame is the tag */ + t->f.sum = p->d[p->len - 1]; /* Last byte of an OFLOW frame is the sum */ + t->f.d = &p->d[1]; /* This is the rest of the data */ + + /* Calculate received packet sum and insert good status into packet */ + uint8_t sum = t->f.tag; + + for ( int i = 0; i < t->f.len; i++ ) + { + sum += t->f.d[i]; + } + + sum += t->f.sum; + t->f.good = ( sum == 0 ); + + /* Timestamp was already set for this cluster */ + ( t->cb )( &t->f, t->param ); +} + +void OFLOWPump( struct OFLOW *t, const uint8_t *incoming, int len, + void ( *packetRxed )( struct OFLOWFrame *p, void *param ), + void *param ) + + +/* Assemble this packet into a complete frame and call back */ + +{ + struct timespec ts; + t->cb = packetRxed; + clock_gettime( CLOCK_REALTIME, &ts ); + t->f.tstamp = ts.tv_sec * OFLOW_TS_RESOLUTION + ts.tv_nsec; /* For now, fake the timestamp */ + t->param = param; + COBSPump( &t->c, incoming, len, _pumpcb, t ); +} + +// ==================================================================================================== + +const uint8_t *OFLOWgetFrameExtent( const uint8_t *inputEnc, int len ) + +/* Look through memory until an end of frame marker is found, or memory is exhausted. */ + +{ + /* Go find the next sync */ + while ( !OFLOWisEOFRAME( inputEnc ) && --len ) + { + inputEnc++; + } + + return inputEnc; +} + +// ==================================================================================================== diff --git a/Src/orbcat.c b/Src/orbcat.c index 7998daf7..0ec81c1a 100644 --- a/Src/orbcat.c +++ b/Src/orbcat.c @@ -10,11 +10,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include "nw.h" #include "git_version_info.h" @@ -24,11 +26,12 @@ #include "msgDecoder.h" #include "msgSeq.h" #include "stream.h" +#include "oflow.h" #define NUM_CHANNELS 32 #define HW_CHANNEL (NUM_CHANNELS) /* Make the hardware fifo on the end of the software ones */ -#define MAX_STRING_LENGTH (100) /* Maximum length that will be output from a fifo for a single event */ +#define MAX_STRING_LENGTH (4096) /* Maximum length that will be output */ #define DEFAULT_TS_TRIGGER '\n' /* Default trigger character for timestamp output */ #define MSG_REORDER_BUFLEN (10) /* Maximum number of samples to re-order for timekeeping */ @@ -47,14 +50,17 @@ #define STAMP_FORMAT_MS_DELTA "%5" PRIu64 ".%03" PRIu64 "_%03" PRIu64 "|" enum TSType { TSNone, TSAbsolute, TSRelative, TSDelta, TSStamp, TSStampDelta, TSNumTypes }; + +enum Prot { PROT_OFLOW, PROT_ITM, PROT_TPIU, PROT_UNKNOWN }; +const char *protString[] = {"OFLOW", "ITM", "TPIU", NULL}; + const char *tsTypeString[TSNumTypes] = { "None", "Absolute", "Relative", "Delta", "System Timestamp", "System Timestamp Delta" }; // Record for options, either defaults or from command line struct { /* Config information */ - bool useTPIU; - uint32_t tpiuChannel; + uint32_t tag; /* Which TPIU or OFLOW stream are we decoding? */ bool forceITMSync; uint64_t cps; /* Cycles per second for target CPU */ @@ -62,21 +68,23 @@ struct char *tsLineFormat; char tsTrigger; + /* Sink information */ - char *presFormat[NUM_CHANNELS + 1]; + char *presFormat[NUM_CHANNELS + 1]; /* Format string for each channel */ /* Source information */ - int port; - char *server; + int port; /* What port to connect to on the server (default to orbuculum) */ + char *server; /* Which server to connect to (default to localhost) */ + enum Prot protocol; /* What protocol to communicate (default to OFLOW (== orbuculum)) */ char *file; /* File host connection */ bool endTerminate; /* Terminate when file/socket "ends" */ - + bool ex; /* Support exception reporting */ } options = { .forceITMSync = true, - .tpiuChannel = 1, - .port = NWCLIENT_SERVER_PORT, + .tag = 1, + .port = OTCLIENT_SERVER_PORT, .server = "localhost", .tsTrigger = DEFAULT_TS_TRIGGER }; @@ -88,16 +96,24 @@ struct struct MSGSeq d; struct ITMPacket h; struct TPIUDecoder t; - struct TPIUPacket p; + struct OFLOW c; + + struct Frame cobsPart; /* Any part frame that has been received */ + struct TPIUPacket p; /* Any TPIU packet that has been recevied */ enum timeDelay timeStatus; /* Indicator of if this time is exact */ uint64_t timeStamp; /* Latest received time */ uint64_t lastTimeStamp; /* Last received time */ uint64_t te; /* Time on host side for line stamping */ bool gotte; /* Flag that we have the initial time */ bool inLine; /* We are in progress with a line that has been timestamped already */ + uint64_t dwtte; /* Timestamp for dwt print age */ uint64_t oldte; /* Old time for interval calculation */ + char dwtText[MAX_STRING_LENGTH]; /* DWT text that arrived while a line was in progress */ + bool ending; /* Time to shut up shop */ } _r; +#define DWT_TO_US (100000L) + // ==================================================================================================== int64_t _timestamp( void ) @@ -113,7 +129,7 @@ int64_t _timestamp( void ) // ==================================================================================================== // ==================================================================================================== // ==================================================================================================== -static void _outputTimestamp( void ) +static void _printTimestamp( char *strstore ) { /* Lets output a timestamp */ @@ -122,6 +138,8 @@ static void _outputTimestamp( void ) struct tm tm; time_t td; + *strstore = 0; + switch ( options.tsType ) { case TSNone: // ----------------------------------------------------------------------- @@ -133,12 +151,12 @@ static void _outputTimestamp( void ) /* Get the starting time */ _r.oldte = _timestamp(); _r.gotte = true; - fprintf( stdout, REL_FORMAT_INIT ); + sprintf( strstore, REL_FORMAT_INIT ); } else { res = _r.oldte - _timestamp(); - fprintf( stdout, REL_FORMAT, res / ONE_SEC_IN_USEC, ( res / ( ONE_SEC_IN_USEC / 1000 ) ) % 1000 ); + sprintf( strstore, REL_FORMAT, res / ONE_SEC_IN_USEC, ( res / ( ONE_SEC_IN_USEC / 1000 ) ) % 1000 ); } break; @@ -148,7 +166,7 @@ static void _outputTimestamp( void ) td = ( time_t )res / ONE_SEC_IN_USEC; tm = *localtime( &td ); strftime( opConstruct, MAX_STRING_LENGTH, ABS_FORMAT_TM, &tm ); - fprintf( stdout, ABS_FORMAT, opConstruct, ( res / ( ONE_SEC_IN_USEC / 1000 ) ) % 1000 ); + sprintf( strstore, ABS_FORMAT, opConstruct, ( res / ( ONE_SEC_IN_USEC / 1000 ) ) % 1000 ); break; case TSDelta: // ---------------------------------------------------------------------- @@ -157,7 +175,7 @@ static void _outputTimestamp( void ) /* Get the starting time */ _r.oldte = _timestamp(); _r.gotte = true; - fprintf( stdout, DEL_FORMAT_INIT ); + sprintf( strstore, DEL_FORMAT_INIT ); } else { @@ -167,11 +185,11 @@ static void _outputTimestamp( void ) if ( res / 1000 ) { - fprintf( stdout, DEL_FORMAT, res / ONE_SEC_IN_USEC, ( res / 1000 ) % 1000 ); + sprintf( strstore, DEL_FORMAT, res / ONE_SEC_IN_USEC, ( res / 1000 ) % 1000 ); } else { - fprintf( stdout, DEL_FORMAT_CTD ); + sprintf( strstore, DEL_FORMAT_CTD ); } } @@ -181,11 +199,11 @@ static void _outputTimestamp( void ) if ( options.cps ) { uint64_t tms = ( _r.timeStamp * 1000000 ) / options.cps; - fprintf( stdout, STAMP_FORMAT_MS, tms / 1000000, ( tms / 1000 ) % 1000, tms % 1000 ); + sprintf( strstore, STAMP_FORMAT_MS, tms / 1000000, ( tms / 1000 ) % 1000, tms % 1000 ); } else { - fprintf( stdout, STAMP_FORMAT, _r.timeStamp ); + sprintf( strstore, STAMP_FORMAT, _r.timeStamp ); } break; @@ -203,11 +221,11 @@ static void _outputTimestamp( void ) if ( options.cps ) { uint64_t tms = ( delta * 1000000 ) / options.cps; - fprintf( stdout, STAMP_FORMAT_MS_DELTA, tms / 1000000, ( tms / 1000 ) % 1000, tms % 1000 ); + sprintf( strstore, STAMP_FORMAT_MS_DELTA, tms / 1000000, ( tms / 1000 ) % 1000, tms % 1000 ); } else { - fprintf( stdout, STAMP_FORMAT, delta ); + sprintf( strstore, STAMP_FORMAT, delta ); } break; @@ -220,6 +238,7 @@ static void _outputTimestamp( void ) static void _outputText( char *p ) { + char opConstruct[MAX_STRING_LENGTH]; /* Process the buffer and make sure it gets timestamped correctly as it's output */ char *q; @@ -229,7 +248,8 @@ static void _outputText( char *p ) /* If this is the first character in a new line, then we need to generate a timestamp */ if ( !_r.inLine ) { - _outputTimestamp(); + _printTimestamp( opConstruct ); + fputs( opConstruct, stdout ); _r.inLine = true; } @@ -242,6 +262,13 @@ static void _outputText( char *p ) fprintf( stdout, "%s" EOL, p ); /* Once we've output these data then we're not in a line any more */ _r.inLine = false; + + /* ...and if there were any DWT messages to print we'd better output those */ + if ( _r.dwtText[0] ) + { + fprintf( stdout, "%s" EOL, _r.dwtText ); + _r.dwtText[0] = 0; + } } else { @@ -255,6 +282,147 @@ static void _outputText( char *p ) } } // ==================================================================================================== +// Decoders for each message +// ==================================================================================================== + +void _expex( const char *fmt, ... ) + +/* Print to exception buffer and output if appropriate */ + +{ + if ( ( _r.inLine ) && ( !_r.dwtText[0] ) ) + { + /* Timestamp this so it gets output at an interval later, worst case */ + _r.dwtte = _timestamp(); + } + + /* See if we exceeded max length...if so then output what we have and start a fresh buffer */ + if ( MAX_STRING_LENGTH - strlen( _r.dwtText ) < 100 ) + { + fputs( _r.dwtText, stdout ); + _r.dwtText[0] = 0; + } + + /* Construct the output */ + _printTimestamp( &_r.dwtText[strlen( _r.dwtText )] ); + int maxLen = MAX_STRING_LENGTH - strlen( _r.dwtText ); + va_list va; + va_start( va, fmt ); + vsnprintf( &_r.dwtText[strlen( _r.dwtText )], maxLen, fmt, va ); + va_end( va ); + + if ( !_r.inLine ) + { + fputs( _r.dwtText, stdout ); + _r.dwtText[0] = 0; + } +} + +// ==================================================================================================== + +void _handleException( struct excMsg *m, struct ITMDecoder *i ) + +{ + if ( options.ex ) + { + const char *exNames[] = {"Thread", "Reset", "NMI", "HardFault", "MemManage", "BusFault", "UsageFault", "UNKNOWN_7", + "UNKNOWN_8", "UNKNOWN_9", "UNKNOWN_10", "SVCall", "Debug Monitor", "UNKNOWN_13", "PendSV", "SysTick" + }; + const char *exEvent[] = {"Unknown", "Enter", "Exit", "Resume"}; + + + if ( m->exceptionNumber < 16 ) + { + /* This is a system based exception */ + _expex( "HWEVENT_SYSTEM_EXCEPTION event %s type %s" EOL, exEvent[m->eventType & 0x03], exNames[m->exceptionNumber & 0x0F] ); + } + else + { + /* This is a CPU defined exception */ + _expex( "HWEVENT_INTERRUPT_EXCEPTION event %s external interrupt %d" EOL, exEvent[m->eventType & 0x03], m->exceptionNumber - 16 ); + } + } +} +// ==================================================================================================== +void _handleDWTEvent( struct dwtMsg *m, struct ITMDecoder *i ) + +{ +#define NUM_EVENTS 6 + + char op[MAX_STRING_LENGTH]; + + if ( options.ex ) + { + const char *evName[NUM_EVENTS] = {"CPI", "Exc", "Sleep", "LSU", "Fold", "Cyc"}; + + sprintf( op, "HWEVENT_DWT type " ); + + uint32_t opLen = strlen( op ); + + for ( uint32_t i = 0; i < NUM_EVENTS; i++ ) + { + if ( m->event & ( 1 << i ) ) + { + // Copy this event into the output string + op[opLen++] = ','; + const char *u = evName[i]; + + do + { + op[opLen++] = *u++; + } + while ( *u ); + } + } + + _expex( "%s", op ); + } +} + +// ==================================================================================================== +void _handleDataRWWP( struct watchMsg *m, struct ITMDecoder *i ) + +/* We got an alert due to a watch pointer */ + +{ + if ( options.ex ) + { + _expex( "HWEVENT_RWWT type %d for %s data 0x%x" EOL, m->comp, m->isWrite ? "Write" : "Read", m->data ); + } +} +// ==================================================================================================== +void _handleDataAccessWP( struct wptMsg *m, struct ITMDecoder *i ) + +/* We got an alert due to a watchpoint */ + +{ + if ( options.ex ) + { + _expex( "HWEVENT_AWP type %d at address 0x%08x" EOL, m->comp, m->data ); + } +} +// ==================================================================================================== +void _handleDataOffsetWP( struct oswMsg *m, struct ITMDecoder *i ) + +/* We got an alert due to an offset write event */ + +{ + if ( options.ex ) + { + _expex( "HWEVENT_OFS comparison %d at offset 0x%04x" EOL, m->comp, m->offset ); + } +} +// ==================================================================================================== +void _handleNISYNC( struct nisyncMsg *m, struct ITMDecoder *i ) + +{ + if ( options.ex ) + { + _expex( "HWEVENT_NISYNC type %02x at address 0x%08x" EOL, m->type, m->addr ); + } +} +// ==================================================================================================== + static void _handleSW( struct swMsg *m, struct ITMDecoder *i ) { @@ -322,13 +490,13 @@ static void _itmPumpProcess( char c ) /* MSG_ERROR */ NULL, /* MSG_NONE */ NULL, /* MSG_SOFTWARE */ ( handlers )_handleSW, - /* MSG_NISYNC */ NULL, - /* MSG_OSW */ NULL, - /* MSG_DATA_ACCESS_WP */ NULL, - /* MSG_DATA_RWWP */ NULL, + /* MSG_NISYNC */ ( handlers )_handleNISYNC, + /* MSG_OSW */ ( handlers )_handleDataOffsetWP, + /* MSG_DATA_ACCESS_WP */ ( handlers )_handleDataAccessWP, + /* MSG_DATA_RWWP */ ( handlers )_handleDataRWWP, /* MSG_PC_SAMPLE */ NULL, - /* MSG_DWT_EVENT */ NULL, - /* MSG_EXCEPTION */ NULL, + /* MSG_DWT_EVENT */ ( handlers )_handleDWTEvent, + /* MSG_EXCEPTION */ ( handlers )_handleException, /* MSG_TS */ ( handlers )_handleTS }; @@ -383,7 +551,7 @@ static void _itmPumpProcess( char c ) static void _protocolPump( uint8_t c ) { - if ( options.useTPIU ) + if ( options.protocol == PROT_TPIU ) { switch ( TPIUPump( &_r.t, c ) ) { @@ -408,7 +576,7 @@ static void _protocolPump( uint8_t c ) for ( uint32_t g = 0; g < _r.p.len; g++ ) { - if ( _r.p.packet[g].s == options.tpiuChannel ) + if ( _r.p.packet[g].s == options.tag ) { _itmPumpProcess( _r.p.packet[g].d ); continue; @@ -433,6 +601,7 @@ static void _protocolPump( uint8_t c ) } } // ==================================================================================================== + static void _printHelp( const char *const progName ) { @@ -445,13 +614,16 @@ static void _printHelp( const char *const progName ) fprintf( stdout, " -g, --trigger: to use to trigger timestamp (default is newline)" EOL ); fprintf( stdout, " -h, --help: This help" EOL ); fprintf( stdout, " -n, --itm-sync: Enforce sync requirement for ITM (i.e. ITM needs to issue syncs)" EOL ); + fprintf( stdout, " -p, --protocol: Protocol to communicate. Defaults to OFLOW if -s is not set, otherwise ITM unless" EOL \ + " explicitly set to TPIU to decode TPIU frames on channel set by -t" EOL ); fprintf( stdout, " -s, --server: : to use" EOL ); - fprintf( stdout, " -t, --tpiu: : Use TPIU decoder on specified channel (normally 1)" EOL ); + fprintf( stdout, " -t, --tag: : Which TPIU stream or OFLOW tag to use (normally 1)" EOL ); fprintf( stdout, " -T, --timestamp: : Add absolute, relative (to session start)," EOL " delta, system timestamp or system timestamp delta to output. Note" EOL " a,r & d are host dependent and you may need to run orbuculum with -H." EOL ); fprintf( stdout, " -v, --verbose: Verbose mode 0(errors)..3(debug)" EOL ); fprintf( stdout, " -V, --version: Print version and exit" EOL ); + fprintf( stdout, " -x, --exceptions: Include exception information in output, in time order" EOL ); } // ==================================================================================================== static void _printVersion( void ) @@ -469,11 +641,13 @@ static struct option _longOptions[] = {"help", no_argument, NULL, 'h'}, {"trigger", required_argument, NULL, 'g' }, {"itm-sync", no_argument, NULL, 'n'}, + {"protocol", required_argument, NULL, 'p'}, {"server", required_argument, NULL, 's'}, {"tpiu", required_argument, NULL, 't'}, {"timestamp", required_argument, NULL, 'T'}, {"verbose", required_argument, NULL, 'v'}, {"version", no_argument, NULL, 'V'}, + {"exceptions", no_argument, NULL, 'x'}, {NULL, no_argument, NULL, 0} }; // ==================================================================================================== @@ -483,14 +657,25 @@ bool _processOptions( int argc, char *argv[] ) int c, optionIndex = 0; unsigned int chan; char *chanIndex; + bool protExplicit = false; + bool serverExplicit = false; + bool portExplicit = false; + #define DELIMITER ',' - while ( ( c = getopt_long ( argc, argv, "c:C:Ef:g:hVns:t:T:v:", _longOptions, &optionIndex ) ) != -1 ) + while ( ( c = getopt_long ( argc, argv, "c:C:Ef:g:hVnp:s:t:T:v:x", _longOptions, &optionIndex ) ) != -1 ) switch ( c ) { // ------------------------------------ case 'C': options.cps = atoi( optarg ) * 1000; + + if ( options.cps <= 0 ) + { + genericsReport( V_ERROR, "cps out of range" EOL ); + return false; + } + break; // ------------------------------------ @@ -515,7 +700,6 @@ bool _processOptions( int argc, char *argv[] ) // ------------------------------------ case 'g': - printf( "%s" EOL, optarg ); options.tsTrigger = genericsUnescape( optarg )[0]; break; @@ -524,9 +708,33 @@ bool _processOptions( int argc, char *argv[] ) options.forceITMSync = false; break; + // ------------------------------------ + + case 'p': + options.protocol = PROT_UNKNOWN; + protExplicit = true; + + for ( int i = 0; protString[i]; i++ ) + { + if ( !strcmp( protString[i], optarg ) ) + { + options.protocol = i; + break; + } + } + + if ( options.protocol == PROT_UNKNOWN ) + { + genericsReport( V_ERROR, "Unrecognised protocol type" EOL ); + return false; + } + + break; + // ------------------------------------ case 's': options.server = optarg; + serverExplicit = true; // See if we have an optional port number too char *a = optarg; @@ -546,13 +754,23 @@ bool _processOptions( int argc, char *argv[] ) { options.port = NWCLIENT_SERVER_PORT; } + else + { + portExplicit = true; + } break; // ------------------------------------ case 't': - options.useTPIU = true; - options.tpiuChannel = atoi( optarg ); + options.tag = atoi( optarg ); + + if ( !options.tag || ( options.tag > 255 ) ) + { + genericsReport( V_ERROR, "tag out of range" EOL ); + return false; + } + break; // ------------------------------------ @@ -594,7 +812,12 @@ bool _processOptions( int argc, char *argv[] ) return false; } - genericsSetReportLevel( atoi( optarg ) ); + if ( !genericsSetReportLevel( atoi( optarg ) ) ) + { + genericsReport( V_ERROR, "Report level out of range" EOL ); + return false; + } + break; // ------------------------------------ @@ -616,6 +839,12 @@ bool _processOptions( int argc, char *argv[] ) chanIndex++; } + if ( !*chanIndex ) + { + genericsReport( V_ERROR, "Channel output spec missing" EOL ); + return false; + } + /* Step over delimiter */ chanIndex++; @@ -631,7 +860,6 @@ bool _processOptions( int argc, char *argv[] ) return false; } - //*chanIndex++ = 0; options.presFormat[chan] = strdup( genericsUnescape( chanIndex ) ); break; @@ -648,22 +876,33 @@ bool _processOptions( int argc, char *argv[] ) return false; + // ------------------------------------ + case 'x': + options.ex = true; + break; + // ------------------------------------ default: return false; // ------------------------------------ } - if ( ( options.useTPIU ) && ( !options.tpiuChannel ) ) + /* If we set an explicit server and port and didn't set a protocol chances are we want ITM, not OFLOW */ + if ( serverExplicit && !protExplicit ) { - genericsReport( V_ERROR, "TPIU set for use but no channel set for ITM output" EOL ); - return false; + options.protocol = PROT_ITM; + } + + if ( ( options.protocol == PROT_TPIU ) && !portExplicit ) + { + options.port = NWCLIENT_SERVER_PORT; } genericsReport( V_INFO, "orbcat version " GIT_DESCRIBE EOL ); genericsReport( V_INFO, "Server : %s:%d" EOL, options.server, options.port ); genericsReport( V_INFO, "ForceSync : %s" EOL, options.forceITMSync ? "true" : "false" ); genericsReport( V_INFO, "Timestamp : %s" EOL, tsTypeString[options.tsType] ); + genericsReport( V_INFO, "Exceptions : %s" EOL, options.ex ? "On" : "Off" ); if ( options.cps ) { @@ -691,13 +930,23 @@ bool _processOptions( int argc, char *argv[] ) } } - if ( options.useTPIU ) - { - genericsReport( V_INFO, "Using TPIU : true (ITM on channel %d)" EOL, options.tpiuChannel ); - } - else + switch ( options.protocol ) { - genericsReport( V_INFO, "Using TPIU : false" EOL ); + case PROT_OFLOW: + genericsReport( V_INFO, "Decoding OFLOW (Orbuculum) with ITM in stream %d" EOL, options.tag ); + break; + + case PROT_ITM: + genericsReport( V_INFO, "Decoding ITM" EOL ); + break; + + case PROT_TPIU: + genericsReport( V_INFO, "Using TPIU with ITM in stream %d" EOL, options.tag ); + break; + + default: + genericsReport( V_INFO, "Decoding unknown" EOL ); + break; } genericsReport( V_INFO, "Channels :" EOL ); @@ -712,8 +961,9 @@ bool _processOptions( int argc, char *argv[] ) return true; } + // ==================================================================================================== -static struct Stream *_tryOpenStream() +static struct Stream *_tryOpenStream( void ) { if ( options.file != NULL ) { @@ -725,17 +975,39 @@ static struct Stream *_tryOpenStream() } } // ==================================================================================================== + +static void _OFLOWpacketRxed ( struct OFLOWFrame *p, void *param ) + +{ + if ( !p->good ) + { + genericsReport( V_WARN, "Bad packet received" EOL ); + } + else + { + if ( p->tag == options.tag ) + { + for ( int i = 0; i < p->len; i++ ) + { + _itmPumpProcess( p->d[i] ); + } + } + } +} + +// ==================================================================================================== + static void _feedStream( struct Stream *stream ) { struct timeval t; unsigned char cbw[TRANSFER_SIZE]; - while ( true ) + while ( !_r.ending ) { size_t receivedSize; t.tv_sec = 0; - t.tv_usec = 10000; + t.tv_usec = 100000; enum ReceiveResult result = stream->receive( stream, cbw, TRANSFER_SIZE, &t, &receivedSize ); if ( result != RECEIVE_RESULT_OK ) @@ -750,17 +1022,45 @@ static void _feedStream( struct Stream *stream ) } } - unsigned char *c = cbw; - while ( receivedSize-- ) + if ( receivedSize ) { - _protocolPump( *c++ ); - } + if ( PROT_OFLOW == options.protocol ) + { + OFLOWPump( &_r.c, cbw, receivedSize, _OFLOWpacketRxed, &_r ); + } + else + { + /* Both ITM and TPIU go directly through the protocol pump */ + unsigned char *c = cbw; - fflush( stdout ); + while ( receivedSize-- ) + { + _protocolPump( *c++ ); + } + } + + /* Check if an exception report timed out */ + if ( ( _r.inLine ) && _r.dwtText[0] && ( _timestamp() - _r.dwtte > DWT_TO_US ) ) + { + fputs( EOL, stdout ); + fputs( _r.dwtText, stdout ); + _r.dwtText[0] = 0; + _r.inLine = false; + } + + fflush( stdout ); + } } } +// ==================================================================================================== +static void _intHandler( int sig ) + +{ + /* CTRL-C exit is not an error... */ + _r.ending = true; +} // ==================================================================================================== int main( int argc, char *argv[] ) @@ -775,13 +1075,20 @@ int main( int argc, char *argv[] ) /* Reset the TPIU handler before we start */ TPIUDecoderInit( &_r.t ); ITMDecoderInit( &_r.i, options.forceITMSync ); + OFLOWInit( &_r.c ); MSGSeqInit( &_r.d, &_r.i, MSG_REORDER_BUFLEN ); - while ( true ) + /* This ensures the signal handler gets called */ + if ( SIG_ERR == signal( SIGINT, _intHandler ) ) + { + genericsExit( -1, "Failed to establish Int handler" EOL ); + } + + while ( !_r.ending ) { struct Stream *stream = NULL; - while ( true ) + while ( !_r.ending ) { stream = _tryOpenStream(); @@ -814,10 +1121,10 @@ int main( int argc, char *argv[] ) if ( stream != NULL ) { _feedStream( stream ); - } - stream->close( stream ); - free( stream ); + stream->close( stream ); + free( stream ); + } if ( options.endTerminate ) { diff --git a/Src/orbdump.c b/Src/orbdump.c index 2317c7d6..5bc3f8e8 100644 --- a/Src/orbdump.c +++ b/Src/orbdump.c @@ -10,12 +10,14 @@ #include #include #include +#include #include "generics.h" #include "uthash.h" #include "git_version_info.h" #include "generics.h" #include "tpiuDecoder.h" +#include "oflow.h" #include "itmDecoder.h" #include "stream.h" @@ -26,14 +28,16 @@ #define DEFAULT_OUTFILE "/dev/stdout" #define DEFAULT_TIMELEN 10000 +enum Prot { PROT_OFLOW, PROT_ITM, PROT_TPIU, PROT_UNKNOWN }; +const char *protString[] = {"OFLOW", "ITM", "TPIU", NULL}; + /* ---------- CONFIGURATION ----------------- */ struct /* Record for options, either defaults or from command line */ { /* Config information */ - bool useTPIU; bool forceITMSync; - uint32_t tpiuITMChannel; + uint32_t tag; /* File to output dump to */ char *outfile; @@ -49,14 +53,14 @@ struct /* Record for options, either defaul /* Source information */ int port; char *server; + enum Prot protocol; } options = { .forceITMSync = true, - .useTPIU = false, - .tpiuITMChannel = 1, + .tag = 1, .outfile = DEFAULT_OUTFILE, .timelen = DEFAULT_TIMELEN, - .port = NWCLIENT_SERVER_PORT, + .port = OTCLIENT_SERVER_PORT, .server = "localhost" }; @@ -68,6 +72,8 @@ struct struct ITMPacket h; struct TPIUDecoder t; struct TPIUPacket p; + struct OFLOW c; + bool ending; } _r; // ==================================================================================================== @@ -97,7 +103,7 @@ void _protocolPump( uint8_t c ) /* Top level protocol pump */ { - if ( options.useTPIU ) + if ( PROT_TPIU == options.protocol ) { switch ( TPIUPump( &_r.t, c ) ) { @@ -126,7 +132,7 @@ void _protocolPump( uint8_t c ) for ( uint32_t g = 0; g < _r.p.len; g++ ) { - if ( _r.p.packet[g].s == options.tpiuITMChannel ) + if ( _r.p.packet[g].s == options.tag ) { ITMPump( &_r.i, _r.p.packet[g].d ); continue; @@ -163,9 +169,10 @@ void _printHelp( const char *const progName ) genericsPrintf( " -M, --no-colour: Supress colour in output" EOL ); genericsPrintf( " -n, --itm-sync: Enforce sync requirement for ITM (i.e. ITM needs to issue syncs)" EOL ); genericsPrintf( " -o, --output-file: to be used for dump file (defaults to %s)" EOL, options.outfile ); - genericsPrintf( " -p, --port: to use" EOL ); - genericsPrintf( " -s, --server: to use" EOL ); - genericsPrintf( " -t, --tpiu: Use TPIU decoder on specified channel, normally 1" EOL ); + genericsPrintf( " -p, --protocol: Protocol to communicate. Defaults to OFLOW if -s is not set, otherwise ITM unless" EOL \ + " explicitly set to TPIU to decode TPIU frames on channel set by -t" EOL ); + genericsPrintf( " -s, --server: : to use" EOL ); + genericsPrintf( " -t, --tag: Which TPIU stream or OFLOW tag to use (normally 1)" EOL ); genericsPrintf( " -v, --verbose: Verbose mode 0(errors)..3(debug)" EOL ); genericsPrintf( " -V, --version: Print version and exit" EOL ); genericsPrintf( " -w, --sync-write: Write synchronously to the output file after every packet" EOL ); @@ -185,9 +192,9 @@ static struct option _longOptions[] = {"no-colour", no_argument, NULL, 'M'}, {"no-color", no_argument, NULL, 'M'}, {"output-file", required_argument, NULL, 'o'}, - {"port", required_argument, NULL, 'p'}, + {"protocol", required_argument, NULL, 'p'}, {"server", required_argument, NULL, 's'}, - {"tpiu", required_argument, NULL, 't'}, + {"tag", required_argument, NULL, 't'}, {"verbose", required_argument, NULL, 'v'}, {"version", no_argument, NULL, 'V'}, {"sync-write", no_argument, NULL, 'w'}, @@ -198,6 +205,9 @@ bool _processOptions( int argc, char *argv[] ) { int c, optionIndex = 0; + bool protExplicit = false; + bool serverExplicit = false; + bool portExplicit = false; while ( ( c = getopt_long ( argc, argv, "hVl:Mno:p:s:t:v:w", _longOptions, &optionIndex ) ) != -1 ) switch ( c ) @@ -233,19 +243,63 @@ bool _processOptions( int argc, char *argv[] ) break; case 't': - options.useTPIU = true; - options.tpiuITMChannel = atoi( optarg ); + options.tag = atoi( optarg ); break; - /* Source information */ + // ------------------------------------ + case 'p': - options.port = atoi( optarg ); + options.protocol = PROT_UNKNOWN; + protExplicit = true; + + for ( int i = 0; protString[i]; i++ ) + { + if ( !strcmp( protString[i], optarg ) ) + { + options.protocol = i; + break; + } + } + + if ( options.protocol == PROT_UNKNOWN ) + { + genericsReport( V_ERROR, "Unrecognised protocol type" EOL ); + return false; + } + break; + // ------------------------------------ case 's': options.server = optarg; + serverExplicit = true; + + // See if we have an optional port number too + char *a = optarg; + + while ( ( *a ) && ( *a != ':' ) ) + { + a++; + } + + if ( *a == ':' ) + { + *a = 0; + options.port = atoi( ++a ); + } + + if ( !options.port ) + { + options.port = NWCLIENT_SERVER_PORT; + } + else + { + portExplicit = true; + } + break; + // ------------------------------------ case 'h': _printHelp( argv[0] ); return false; @@ -272,16 +326,22 @@ bool _processOptions( int argc, char *argv[] ) return false; } - if ( ( options.useTPIU ) && ( !options.tpiuITMChannel ) ) + /* If we set an explicit server and port and didn't set a protocol chances are we want ITM, not OFLOW */ + if ( serverExplicit && !protExplicit ) { - genericsReport( V_ERROR, "TPIU set for use but no channel set for ITM output" EOL ); - return false; + options.protocol = PROT_ITM; + } + + if ( ( options.protocol == PROT_TPIU ) && !portExplicit ) + { + options.port = NWCLIENT_SERVER_PORT; } genericsReport( V_INFO, "orbdump version " GIT_DESCRIBE EOL ); genericsReport( V_INFO, "Server : %s:%d" EOL, options.server, options.port ); genericsReport( V_INFO, "ForceSync : %s" EOL, options.forceITMSync ? "true" : "false" ); + if ( options.timelen ) { genericsReport( V_INFO, "Rec Length: %dmS" EOL, options.timelen ); @@ -293,19 +353,62 @@ bool _processOptions( int argc, char *argv[] ) genericsReport( V_INFO, "Sync Write: %s" EOL, options.writeSync ? "true" : "false" ); - if ( options.useTPIU ) + switch ( options.protocol ) { - genericsReport( V_INFO, "Using TPIU: true (ITM on channel %d)" EOL, options.tpiuITMChannel ); + case PROT_OFLOW: + genericsReport( V_INFO, "Decoding OFLOW (Orbuculum) with ITM in stream %d" EOL, options.tag ); + break; + + case PROT_ITM: + genericsReport( V_INFO, "Decoding ITM" EOL ); + break; + + case PROT_TPIU: + genericsReport( V_INFO, "Using TPIU with ITM in stream %d" EOL, options.tag ); + break; + + default: + genericsReport( V_INFO, "Decoding unknown" EOL ); + break; } return true; } -static struct Stream *_tryOpenStream() +// ==================================================================================================== + +static void _OFLOWpacketRxed ( struct OFLOWFrame *p, void *param ) + +{ + if ( !p->good ) + { + genericsReport( V_WARN, "Bad packet received" EOL ); + } + else + { + if ( p->tag == options.tag ) + { + for ( int i = 0; i < p->len; i++ ) + { + ITMPump( &_r.i, p->d[i] ); + } + } + } +} + +// ==================================================================================================== + +static struct Stream *_tryOpenStream( void ) { return streamCreateSocket( options.server, options.port ); } +// ==================================================================================================== +static void _intHandler( int sig ) +{ + /* CTRL-C exit is not an error... */ + _r.ending = true; +} // ==================================================================================================== int main( int argc, char *argv[] ) { @@ -329,9 +432,15 @@ int main( int argc, char *argv[] ) /* Reset the TPIU handler before we start */ TPIUDecoderInit( &_r.t ); ITMDecoderInit( &_r.i, options.forceITMSync ); - + OFLOWInit( &_r.c ); struct Stream *stream = _tryOpenStream(); + /* This ensures the signal handler gets called */ + if ( SIG_ERR == signal( SIGINT, _intHandler ) ) + { + genericsExit( -1, "Failed to establish Int handler" EOL ); + } + if ( stream == NULL ) { genericsReport( V_ERROR, "Could not connect" EOL ); @@ -350,7 +459,7 @@ int main( int argc, char *argv[] ) genericsReport( V_INFO, "Waiting for sync" EOL ); /* Start the process of collecting the data */ - while ( true ) + while ( !_r.ending ) { enum ReceiveResult result = stream->receive( stream, cbw, TRANSFER_SIZE, NULL, &receivedSize ); @@ -374,13 +483,22 @@ int main( int argc, char *argv[] ) break; } - uint8_t *c = cbw; - t = receivedSize; - - while ( t-- ) + if ( PROT_OFLOW == options.protocol ) + { + OFLOWPump( &_r.c, cbw, receivedSize, _OFLOWpacketRxed, &_r ); + } + else { - _protocolPump( *c++ ); + + uint8_t *c = cbw; + + t = receivedSize; + + while ( t-- ) + { + _protocolPump( *c++ ); + } } /* Check to make sure there's not an unexpected TPIU in here */ diff --git a/Src/orbfifo.c b/Src/orbfifo.c index a215be7a..f2613a31 100644 --- a/Src/orbfifo.c +++ b/Src/orbfifo.c @@ -29,6 +29,7 @@ #include "itmfifos.h" +const char *protString[] = {"OFLOW", "ITM", "TPIU", NULL}; //#define DUMP_BLOCK @@ -50,7 +51,7 @@ struct } options = { - .port = NWCLIENT_SERVER_PORT, + .port = OTCLIENT_SERVER_PORT, .server = "localhost" }; @@ -78,7 +79,10 @@ static void _printHelp( const char *const progName ) genericsPrintf( " -h, --help: This help" EOL ); genericsPrintf( " -M, --no-colour: Supress colour in output" EOL ); genericsPrintf( " -P, --permanent: Create permanent files rather than fifos" EOL ); - genericsPrintf( " -t, --tpiu: Use TPIU decoder on specified channel, normally 1" EOL ); + genericsPrintf( " -p, --protocol: Protocol to communicate. Defaults to OFLOW if -s is not set, otherwise ITM unless" EOL \ + " explicitly set to TPIU to decode TPIU frames on stream set by -t" EOL ); + genericsPrintf( " -s, --server: : to use" EOL ); + genericsPrintf( " -t, --tag: Which TPIU stream or OFLOW tag to use (normally 1)" EOL ); genericsPrintf( " -v, --verbose: Verbose mode 0(errors)..3(debug)" EOL ); genericsPrintf( " -V, --version: Print version and exit" EOL ); genericsPrintf( " -W, --writer-path: Enable filewriter functionality using specified base path" EOL ); @@ -100,7 +104,9 @@ struct option _longOptions[] = {"no-colour", no_argument, NULL, 'M'}, {"no-color", no_argument, NULL, 'M'}, {"permanent", no_argument, NULL, 'P'}, - {"tpiu", required_argument, NULL, 't'}, + {"protocol", required_argument, NULL, 'p'}, + {"server", required_argument, NULL, 's'}, + {"tag", required_argument, NULL, 't'}, {"verbose", required_argument, NULL, 'v'}, {"version", no_argument, NULL, 'V'}, {"writer-path", required_argument, NULL, 'W'}, @@ -117,8 +123,11 @@ static bool _processOptions( int argc, char *argv[] ) char *chanName; uint chan; char *chanIndex; + bool protExplicit = false; + bool serverExplicit = false; + bool portExplicit = false; - while ( ( c = getopt_long ( argc, argv, "b:c:Ef:hVn:Pt:v:w:", _longOptions, &optionIndex ) ) != -1 ) + while ( ( c = getopt_long ( argc, argv, "b:c:Ef:hVn:Pp:s:t:v:w:", _longOptions, &optionIndex ) ) != -1 ) switch ( c ) { // ------------------------------------ @@ -167,9 +176,62 @@ static bool _processOptions( int argc, char *argv[] ) // ------------------------------------ + case 'p': + enum Prot p = PROT_UNKNOWN; + protExplicit = true; + + for ( int i = 0; protString[i]; i++ ) + { + if ( !strcmp( protString[i], optarg ) ) + { + p = i; + break; + } + } + + if ( PROT_UNKNOWN == p ) + { + genericsReport( V_ERROR, "Unrecognised protocol type" EOL ); + return false; + } + + itmfifoSetProtocol( _r.f, p ); + break; + + // ------------------------------------ + case 's': + options.server = optarg; + serverExplicit = true; + + // See if we have an optional port number too + char *a = optarg; + + while ( ( *a ) && ( *a != ':' ) ) + { + a++; + } + + if ( *a == ':' ) + { + *a = 0; + options.port = atoi( ++a ); + } + + if ( !options.port ) + { + options.port = NWCLIENT_SERVER_PORT; + } + else + { + portExplicit = true; + } + + break; + + // ------------------------------------ + case 't': - itmfifoSetUseTPIU( _r.f, true ); - itmfifoSettpiuITMChannel( _r.f, atoi( optarg ) ); + itmfifoSettag( _r.f, atoi( optarg ) ); break; // ------------------------------------ @@ -265,18 +327,21 @@ static bool _processOptions( int argc, char *argv[] ) // ------------------------------------ } - /* ... and dump the config if we're being verbose */ - genericsReport( V_INFO, "orbfifo version " GIT_DESCRIBE EOL ); - - if ( itmfifoGetUseTPIU( _r.f ) ) + /* If we set an explicit server and port and didn't set a protocol chances are we want ITM, not OFLOW */ + if ( serverExplicit && !protExplicit ) { - genericsReport( V_INFO, "Using TPIU : true (ITM on channel %d)" EOL, itmfifoGettpiuITMChannel( _r.f ) ); + itmfifoSetProtocol( _r.f, PROT_ITM ); } - else + + if ( ( itmfifoGetProtocol( _r.f ) == PROT_TPIU ) && !portExplicit ) { - genericsReport( V_INFO, "Using TPIU : false" EOL ); + options.port = NWCLIENT_SERVER_PORT; } + + /* ... and dump the config if we're being verbose */ + genericsReport( V_INFO, "orbfifo version " GIT_DESCRIBE EOL ); + if ( options.file ) { genericsReport( V_INFO, "Input File : %s", options.file ); @@ -291,6 +356,26 @@ static bool _processOptions( int argc, char *argv[] ) } } + + switch ( itmfifoGetProtocol( _r.f ) ) + { + case PROT_OFLOW: + genericsReport( V_INFO, "Decoding OFLOW (Orbuculum) with ITM in stream %d" EOL, itmfifoGettag( _r.f ) ); + break; + + case PROT_ITM: + genericsReport( V_INFO, "Decoding ITM" EOL ); + break; + + case PROT_TPIU: + genericsReport( V_INFO, "Using TPIU with ITM in stream %d" EOL, itmfifoGettag( _r.f ) ); + break; + + default: + genericsReport( V_INFO, "Decoding unknown" EOL ); + break; + } + genericsReport( V_INFO, "Channels :" EOL ); for ( int g = 0; g < NUM_CHANNELS; g++ ) @@ -333,10 +418,7 @@ static void _processBlock( int s, unsigned char *cbw ) #endif - while ( s-- ) - { - itmfifoProtocolPump( _r.f, *cbw++ ); - } + itmfifoProtocolPump( _r.f, cbw, s ); } } diff --git a/Src/orblcd.c b/Src/orblcd.c index 51c0e087..42ccfc8f 100644 --- a/Src/orblcd.c +++ b/Src/orblcd.c @@ -19,12 +19,14 @@ #include #include #include +#include #include "git_version_info.h" #include "generics.h" #include "tpiuDecoder.h" #include "itmDecoder.h" #include "msgDecoder.h" +#include "oflow.h" #include "stream.h" #include "nw.h" #include "orblcd_protocol.h" @@ -64,20 +66,24 @@ struct TApp }; /************** APPLICATION SPECIFIC ENDS ***************************************************************/ +enum Prot { PROT_OFLOW, PROT_ITM, PROT_TPIU, PROT_UNKNOWN }; +const char *protString[] = {"OFLOW", "ITM", "TPIU", NULL}; + /* Record for options, either defaults or from command line */ struct Options { /* Source information */ int port; /* Source port, or zero if no port set */ char *server; /* Source server */ + enum Prot protocol; /* What protocol to communicate (default to OFLOW (== orbuculum)) */ char *file; /* File host connection */ bool fileTerminate; /* Terminate when file read isn't successful */ /* Demux information */ - int tpiuChannel; /* TPIU channel to be used (for case TPIU present, 0 otherwise) */ + uint32_t tag; /* Which TPIU or OFLOW stream are we decoding? */ bool forceITMSync; /* Do we need ITM syncs? */ -} _options = {.forceITMSync = true, .port = NWCLIENT_SERVER_PORT, .server = "localhost"}; +} _options = {.forceITMSync = true, .tag = 1, .port = OTCLIENT_SERVER_PORT, .server = "localhost"}; struct RunTime { @@ -86,10 +92,12 @@ struct RunTime struct ITMPacket h; struct TPIUDecoder t; struct TPIUPacket p; + struct OFLOW c; bool ending; /* Flag indicating app is terminating */ bool errored; /* Flag indicating problem in reception process */ + struct Frame cobsPart; /* Any part frame that has been received */ int f; /* File handle to data source */ struct Options *options; /* Command line options (reference to above) */ struct TApp *app; /* Data storage for target application */ @@ -329,7 +337,7 @@ static void _TPIUpacketRxed( enum TPIUPumpEvent e, struct TPIUPacket *p, void *p case TPIU_EV_RXEDPACKET: for ( uint32_t g = 0; g < p->len; g++ ) { - if ( 1 == p->packet[g].s ) + if ( r->options->tag == p->packet[g].s ) { _itmPumpProcess( p->packet[g].d, r ); } @@ -365,6 +373,29 @@ static struct Stream *_tryOpenStream( struct RunTime *r ) } // ==================================================================================================== +static void _OFLOWpacketRxed ( struct OFLOWFrame *p, void *param ) + +{ + struct RunTime *r = ( struct RunTime * )param; + + if ( !p->good ) + { + genericsReport( V_WARN, "Bad packet received" EOL ); + } + else + { + if ( p->tag == r->options->tag ) + { + for ( int i = 0; i < p->len; i++ ) + { + _itmPumpProcess( p->d[i], r ); + } + } + } +} + +// ==================================================================================================== + static bool _feedStream( struct Stream *stream, struct RunTime *r ) { unsigned char cbw[TRANSFER_SIZE]; @@ -375,7 +406,7 @@ static bool _feedStream( struct Stream *stream, struct RunTime *r ) }; SDL_Event e; - while ( true ) + while ( !_r.ending ) { size_t receivedSize; enum ReceiveResult result = stream->receive( stream, cbw, TRANSFER_SIZE, &t, &receivedSize ); @@ -389,7 +420,6 @@ static bool _feedStream( struct Stream *stream, struct RunTime *r ) } } - if ( result != RECEIVE_RESULT_OK ) { if ( result == RECEIVE_RESULT_EOF && r->options->fileTerminate ) @@ -406,17 +436,24 @@ static bool _feedStream( struct Stream *stream, struct RunTime *r ) } } - unsigned char *c = cbw; - - if ( _r.options->tpiuChannel ) + if ( PROT_OFLOW == r->options->protocol ) { - TPIUPump2( &r->t, cbw, receivedSize, _TPIUpacketRxed, r ); + OFLOWPump( &_r.c, cbw, receivedSize, _OFLOWpacketRxed, &_r ); } else { - while ( receivedSize-- ) + unsigned char *c = cbw; + + if ( PROT_TPIU == _r.options->tag ) { - _itmPumpProcess( *c++, r ); + TPIUPump2( &r->t, cbw, receivedSize, _TPIUpacketRxed, r ); + } + else + { + while ( receivedSize-- ) + { + _itmPumpProcess( *c++, r ); + } } } } @@ -435,9 +472,11 @@ void _printHelp( const char *const progName ) genericsPrintf( " -f, --input-file: Take input from specified file" EOL ); genericsPrintf( " -h, --help: This help" EOL ); genericsPrintf( " -n, --itm-sync: Enforce sync requirement for ITM (i.e. ITM needsd to issue syncs)" EOL ); + genericsPrintf( " -p, --protocol: Protocol to communicate. Defaults to OFLOW if -s is not set, otherwise ITM unless" EOL \ + " explicitly set to TPIU to decode TPIU frames on channel set by -t" EOL ); genericsPrintf( " -s, --server: : to use" EOL ); genericsPrintf( " -S, --sbcolour: to be used for single bit renders, ignored for other bit depths" EOL ); - genericsPrintf( " -t, --tpiu: : Use TPIU decoder on specified channel (normally 1)" EOL ); + genericsPrintf( " -t, --tag: : Which TPIU stream or OFLOW tag to use (normally 1)" EOL ); genericsPrintf( " -v, --verbose: Verbose mode 0(errors)..3(debug)" EOL ); genericsPrintf( " -V, --version: Print version and exit" EOL ); genericsPrintf( " -w, --window: Set title for output window" EOL ); @@ -458,6 +497,7 @@ static struct option _longOptions[] = {"help", no_argument, NULL, 'h'}, {"input-file", required_argument, NULL, 'f'}, {"itm-sync", no_argument, NULL, 'n'}, + {"protocol", required_argument, NULL, 'p'}, {"server", required_argument, NULL, 's'}, {"sbcolour", required_argument, NULL, 'S'}, {"sbcolor", required_argument, NULL, 'S'}, @@ -473,8 +513,11 @@ bool _processOptions( int argc, char *argv[], struct RunTime *r ) { int c, optionIndex = 0; + bool protExplicit = false; + bool serverExplicit = false; + bool portExplicit = false; - while ( ( c = getopt_long ( argc, argv, "c:Ef:hns:S:t:v:Vw:z:", _longOptions, &optionIndex ) ) != -1 ) + while ( ( c = getopt_long ( argc, argv, "c:Ef:hnp:s:S:t:v:Vw:z:", _longOptions, &optionIndex ) ) != -1 ) switch ( c ) { // ------------------------------------ @@ -503,6 +546,29 @@ bool _processOptions( int argc, char *argv[], struct RunTime *r ) r->options->forceITMSync = false; break; + // ------------------------------------ + + case 'p': + r->options->protocol = PROT_UNKNOWN; + protExplicit = true; + + for ( int i = 0; protString[i]; i++ ) + { + if ( !strcmp( protString[i], optarg ) ) + { + r->options->protocol = i; + break; + } + } + + if ( r->options->protocol == PROT_UNKNOWN ) + { + genericsReport( V_ERROR, "Unrecognised protocol type" EOL ); + return false; + } + + break; + // ------------------------------------ case 'V': _printVersion(); @@ -511,6 +577,7 @@ bool _processOptions( int argc, char *argv[], struct RunTime *r ) // ------------------------------------ case 's': r->options->server = optarg; + serverExplicit = true; // See if we have an optional port number too char *a = optarg; @@ -530,6 +597,10 @@ bool _processOptions( int argc, char *argv[], struct RunTime *r ) { r->options->port = NWCLIENT_SERVER_PORT; } + else + { + portExplicit = true; + } break; @@ -540,7 +611,7 @@ bool _processOptions( int argc, char *argv[], struct RunTime *r ) // ------------------------------------ case 't': - r->options->tpiuChannel = atoi( optarg ); + r->options->tag = atoi( optarg ); break; // ------------------------------------ @@ -587,6 +658,17 @@ bool _processOptions( int argc, char *argv[], struct RunTime *r ) /* ... and dump the config if we're being verbose */ _printVersion(); + /* If we set an explicit server and port and didn't set a protocol chances are we want ITM, not OFLOW */ + if ( serverExplicit && !protExplicit ) + { + r->options->protocol = PROT_ITM; + } + + if ( ( r->options->protocol == PROT_TPIU ) && !portExplicit ) + { + r->options->port = NWCLIENT_SERVER_PORT; + } + genericsReport( V_INFO, "App Channel : Data=%d, Control=%d" EOL, r->app->chan, r->app->chan + 1 ); genericsReport( V_INFO, "SB Colour : 0x%x" EOL, r->app->sbcolour ); genericsReport( V_INFO, "Relative Scale : %1.2f:1" EOL, r->app->scale ); @@ -597,15 +679,6 @@ bool _processOptions( int argc, char *argv[], struct RunTime *r ) genericsReport( V_INFO, "NW SERVER H&P : %s:%d" EOL, r->options->server, r->options->port ); } - if ( r->options->tpiuChannel ) - { - genericsReport( V_INFO, "Use/Strip TPIU : True, channel %d" EOL, r->options->tpiuChannel ); - } - else - { - genericsReport( V_INFO, "Use/Strip TPIU : False" EOL ); - } - if ( r->options->file ) { genericsReport( V_INFO, "Input File : %s", r->options->file ); @@ -626,8 +699,35 @@ bool _processOptions( int argc, char *argv[], struct RunTime *r ) return false; } + switch ( r->options->protocol ) + { + case PROT_OFLOW: + genericsReport( V_INFO, "Decoding OFLOW (Orbuculum) with ITM in stream %d" EOL, r->options->tag ); + break; + + case PROT_ITM: + genericsReport( V_INFO, "Decoding ITM" EOL ); + break; + + case PROT_TPIU: + genericsReport( V_INFO, "Using TPIU with ITM in stream %d" EOL, r->options->tag ); + break; + + default: + genericsReport( V_INFO, "Decoding unknown" EOL ); + break; + } + return true; } + +// ==================================================================================================== +static void _intHandler( int sig ) + +{ + /* CTRL-C exit is not an error... */ + _r.ending = true; +} // ==================================================================================================== // ==================================================================================================== // ==================================================================================================== @@ -648,23 +748,30 @@ int main( int argc, char *argv[] ) /* Reset the TPIU handler before we start */ TPIUDecoderInit( &_r.t ); ITMDecoderInit( &_r.i, _r.options->forceITMSync ); + OFLOWInit( &_r.c ); if ( SDL_Init( SDL_INIT_VIDEO ) < 0 ) { genericsExit( -1, "Could not initailise SDL" ); } + /* This ensures the signal handler gets called */ + if ( SIG_ERR == signal( SIGINT, _intHandler ) ) + { + genericsExit( -1, "Failed to establish Int handler" EOL ); + } + /* Load up default colour index map R3G3B2 */ for ( int i = 0; i < 256; i++ ) { _r.app->map8to24bit[i] = ( ( i & 0xE0 ) << 21 ) | ( ( i & 0x1c ) << 13 ) | ( i << 6 ); } - while ( true ) + while ( !_r.ending ) { struct Stream *stream = NULL; - while ( true ) + while ( !_r.ending ) { stream = _tryOpenStream( &_r ); @@ -691,7 +798,7 @@ int main( int argc, char *argv[] ) } /* Checking every 100ms for a connection is quite often enough */ - usleep( 10000 ); + usleep( 100000 ); } if ( stream != NULL ) @@ -700,10 +807,10 @@ int main( int argc, char *argv[] ) { break; } - } - stream->close( stream ); - free( stream ); + stream->close( stream ); + free( stream ); + } if ( _r.options->fileTerminate ) { diff --git a/Src/orbmortem.c b/Src/orbmortem.c index 8dd8a389..fe480a40 100644 --- a/Src/orbmortem.c +++ b/Src/orbmortem.c @@ -13,20 +13,29 @@ #include #include #include +#include +#include #include #include +#include #include "git_version_info.h" #include "generics.h" #include "nw.h" #include "traceDecoder.h" #include "tpiuDecoder.h" -#include "symbols.h" +#include "oflow.h" +#include "loadelf.h" #include "sio.h" #include "stream.h" #define REMOTE_SERVER "localhost" +typedef unsigned long int symbolMemaddr; + +enum Prot { PROT_OFLOW, PROT_ITM, PROT_TPIU, PROT_UNKNOWN }; +const char *protString[] = {"OFLOW", "ITM", "TPIU", NULL}; + #define SCRATCH_STRING_LEN (65535) /* Max length for a string under construction */ //#define DUMP_BLOCK #define DEFAULT_PM_BUFLEN_K (32) /* Default size of the Postmortem buffer */ @@ -49,23 +58,25 @@ struct Options char *odoptions; /* Options to pass directly to objdump */ int buflen; /* Length of post-mortem buffer, in bytes */ - bool useTPIU; /* Are we using TPIU, and stripping TPIU frames? */ int channel; /* When TPIU is in use, which channel to decode? */ + int tag; /* which TPIU or OFLOW stream are we decoding? */ int port; /* Source information */ char *server; + enum Prot commProt; bool mono; /* Supress colour in output */ - enum TRACEprotocol protocol; /* Encoding protocol to use */ + enum TRACEprotocol traceProt; /* Encoding protocol to use */ bool noAltAddr; /* Flag to *not* use alternate addressing */ char *openFileCL; /* Command line for opening refernced file */ + bool withDebugText; /* Include debug text (hidden in) output...screws line numbering a bit */ } _options = { - .port = NWCLIENT_SERVER_PORT, - .server = REMOTE_SERVER, - .demangle = true, - .protocol = TRACE_PROT_ETM35, - .channel = 2, - .buflen = DEFAULT_PM_BUFLEN_K * 1024 + .port = OTCLIENT_SERVER_PORT, + .server = REMOTE_SERVER, + .demangle = true, + .traceProt = TRACE_PROT_ETM35, + .tag = 2, + .buflen = DEFAULT_PM_BUFLEN_K * 1024 }; /* A block of received data */ @@ -79,19 +90,22 @@ struct dataBlock struct opConstruct { uint32_t currentFileindex; /* The filename we're currently in */ - uint32_t currentFunctionindex; /* The function we're currently in */ + struct symbolFunctionStore *currentFunctionptr; /* The function we're currently in */ uint32_t currentLine; /* The line we're currently in */ uint32_t workingAddr; /* The address we're currently in */ }; +/* Maximum depth of call stack, defined Section 5.3 or ARM IHI0064H.a ID120820 */ +#define MAX_CALL_STACK (15) struct RunTime { struct TRACEDecoder i; struct TPIUDecoder t; - + struct OFLOW c; const char *progName; /* Name by which this program was called */ - struct SymbolSet *s; /* Symbols read from elf */ + + struct symbol *s; /* Symbols read from elf */ bool ending; /* Flag indicating app is terminating */ bool singleShot; /* Flag indicating take a single buffer then stop */ uint64_t newTotalBytes; /* Number of bytes of real data transferred in total */ @@ -103,13 +117,15 @@ struct RunTime int wp; /* Index pointers for ring buffer */ int rp; - struct line *opText; /* Text of the output buffer */ + struct sioline *opText; /* Text of the output buffer */ + int32_t lineNum; /* Current line number in output buffer */ int32_t numLines; /* Number of lines in the output buffer */ int32_t diveline; /* Line number we're currently diving into */ char *divefile; /* Filename we're currently diving into */ bool diving; /* Flag indicating we're diving into a file at the moment */ - struct line *fileopText; /* The text lines of the file we're diving into */ + + struct sioline *fileopText; /* The text lines of the file we're diving into */ int32_t filenumLines; /* ...and how many lines of it there are */ bool held; /* If we are actively collecting data */ @@ -121,6 +137,12 @@ struct RunTime struct opConstruct op; /* The mechanical elements for creating the output buffer */ struct Options *options; /* Our runtime configuration */ + + bool traceRunning; /* Set if we are currently receiving trace */ + uint32_t context; /* Context we are currently working under */ + symbolMemaddr callStack[MAX_CALL_STACK]; /* Stack of calls */ + unsigned int stackDepth; /* Maximum stack depth */ + bool stackDelPending; /* Possibility to remove an entry from the stack, if address not given */ } _r; /* For opening the editor (Shift-Right-Arrow) the following command lines work for a few editors; @@ -153,7 +175,7 @@ static void _printHelp( const char *const progName ) genericsPrintf( "Usage: %s [options]" EOL, progName ); genericsPrintf( " -A, --alt-addr-enc: Do not use alternate address encoding" EOL ); genericsPrintf( " -b, --buffer-len: Length of post-mortem buffer, in KBytes (Default %d KBytes)" EOL, DEFAULT_PM_BUFLEN_K ); - genericsPrintf( " -C, --editor-cmd: Command line for external editor (%f = filename, %l = line)" EOL ); + genericsPrintf( " -C, --editor-cmd: Command line for external editor (%%f = filename, %%l = line)" EOL ); genericsPrintf( " -D, --no-demangle: Switch off C++ symbol demangling" EOL ); genericsPrintf( " -d, --del-prefix: Material to delete off the front of filenames" EOL ); genericsPrintf( " -e, --elf-file: to use for symbols and source" EOL ); @@ -162,9 +184,17 @@ static void _printHelp( const char *const progName ) genericsPrintf( " -h, --help: This help" EOL ); genericsPrintf( " -M, --no-colour: Supress colour in output" EOL ); genericsPrintf( " -O, --objdump-opts: Options to pass directly to objdump" EOL ); - genericsPrintf( " -p, --trace-proto: {ETM35|MTB} trace protocol to use, default is ETM35" EOL ); + genericsPrintf( " -p, --protocol: Protocol to communicate. Defaults to OFLOW if -s is not set, otherwise TPIU" EOL ); + genericsPrintf( " -P, --trace-proto: { " ); + + for ( int i = TRACE_PROT_LIST_START; i < TRACE_PROT_NUM; i++ ) + { + genericsPrintf( "%s ", TRACEDecodeGetProtocolName( i ) ); + } + + genericsPrintf( "} trace protocol to use, default is %s" EOL, TRACEDecodeGetProtocolName( TRACE_PROT_LIST_START ) ); genericsPrintf( " -s, --server: : to use" EOL ); - genericsPrintf( " -t, --tpiu: : Use TPIU to strip TPIU on specfied channel" EOL ); + genericsPrintf( " -t, --tag: : Which TPIU stream or OFLOW tag to use (normally 2)" EOL ); genericsPrintf( " -v, --verbose: Verbose mode 0(errors)..3(debug)" EOL ); genericsPrintf( " -V, --version: Print version and exit" EOL ); genericsPrintf( EOL "(Will connect one port higher than that set in -s when TPIU is not used)" EOL ); @@ -193,7 +223,8 @@ static struct option _longOptions[] = {"no-colour", no_argument, NULL, 'M'}, {"no-color", no_argument, NULL, 'M'}, {"objdump-opts", required_argument, NULL, 'O'}, - {"trace-proto", required_argument, NULL, 'p'}, + {"trace-proto", required_argument, NULL, 'P'}, + {"protocol", required_argument, NULL, 'p'}, {"server", required_argument, NULL, 's'}, {"tpiu", required_argument, NULL, 't'}, {"verbose", required_argument, NULL, 'v'}, @@ -205,8 +236,10 @@ static bool _processOptions( int argc, char *argv[], struct RunTime *r ) { int c, optionIndex = 0; + bool protExplicit = false; + bool serverExplicit = false; - while ( ( c = getopt_long ( argc, argv, "Ab:C:Dd:Ee:f:hVMO:p:s:t:v:", _longOptions, &optionIndex ) ) != -1 ) + while ( ( c = getopt_long ( argc, argv, "Ab:C:Dd:Ee:f:hVMO:p:P:s:t:v:w", _longOptions, &optionIndex ) ) != -1 ) switch ( c ) { // ------------------------------------ @@ -274,19 +307,43 @@ static bool _processOptions( int argc, char *argv[], struct RunTime *r ) break; // ------------------------------------ - case 'p': + case 'P': /* Index through protocol strings looking for match or end of list */ - for ( r->options->protocol = TRACE_PROT_LIST_START; - ( ( r->options->protocol != TRACE_PROT_LIST_END ) && strcasecmp( optarg, TRACEprotocolString[r->options->protocol] ) ); - r->options->protocol++ ) + for ( r->options->traceProt = TRACE_PROT_LIST_START; + ( ( r->options->traceProt != TRACE_PROT_NUM ) && strcasecmp( optarg, TRACEDecodeGetProtocolName( r->options->traceProt ) ) ); + r->options->traceProt++ ) {} break; // ------------------------------------ + case 'p': + r->options->commProt = PROT_UNKNOWN; + protExplicit = true; + + for ( int i = 0; protString[i]; i++ ) + { + if ( !strcmp( protString[i], optarg ) ) + { + r->options->commProt = i; + break; + } + } + + if ( r->options->commProt == PROT_UNKNOWN ) + { + genericsReport( V_ERROR, "Unrecognised protocol type" EOL ); + return false; + } + + break; + + // ------------------------------------ + case 's': + serverExplicit = true; r->options->server = optarg; // See if we have an optional port number too @@ -313,8 +370,7 @@ static bool _processOptions( int argc, char *argv[], struct RunTime *r ) // ------------------------------------ case 't': - r->options->useTPIU = true; - r->options->channel = atoi( optarg ); + r->options->tag = atoi( optarg ); break; // ------------------------------------ @@ -331,6 +387,12 @@ static bool _processOptions( int argc, char *argv[], struct RunTime *r ) // ------------------------------------ + case 'w': + r->options->withDebugText = true; + break; + + // ------------------------------------ + case '?': if ( optopt == 'b' ) { @@ -350,19 +412,42 @@ static bool _processOptions( int argc, char *argv[], struct RunTime *r ) // ------------------------------------ } + /* If we set an explicit server and port and didn't set a protocol chances are we want TPIU, not OFLOW */ + if ( serverExplicit && !protExplicit && r->options->port != OTCLIENT_SERVER_PORT ) + { + r->options->commProt = PROT_TPIU; + genericsReport( V_INFO, "(Auto-set ETM over TPIU for TCP::%s:%d, override by setting protocol explicitly)" EOL, r->options->server, r->options->port ); + } + /* ... and dump the config if we're being verbose */ genericsReport( V_INFO, "orbmortem version " GIT_DESCRIBE EOL ); - if ( r->options->protocol >= TRACE_PROT_NONE ) + if ( r->options->withDebugText ) + { + genericsReport( V_INFO, "Incoporate debug text in output buffer" EOL ); + } + + if ( r->options->file ) + { + genericsReport( V_INFO, "Input File : %s", r->options->file ); + } + else + { + genericsReport( V_INFO, "Server : %s:%d" EOL, r->options->server, r->options->port ); + } + + genericsReport( V_INFO, "Elf File : %s" EOL, r->options->elffile ); + + if ( r->options->traceProt >= TRACE_PROT_NONE ) { genericsExit( V_ERROR, "Unrecognised decode protocol" EOL ); } else { - genericsReport( V_INFO, "Protocol %s" EOL, TRACEprotocolString[r->options->protocol] ); + genericsReport( V_INFO, "Protocol : %s" EOL, TRACEDecodeGetProtocolName( r->options->traceProt ) ); } - if ( ( r->options->protocol == TRACE_PROT_MTB ) && ( !r->options->file ) ) + if ( ( r->options->traceProt == TRACE_PROT_MTB ) && ( !r->options->file ) ) { genericsExit( V_ERROR, "MTB only makes sense when input is from a file" EOL ); } @@ -377,6 +462,25 @@ static bool _processOptions( int argc, char *argv[], struct RunTime *r ) genericsExit( -1, "Illegal value for Post Mortem Buffer length" EOL ); } + switch ( r->options->commProt ) + { + case PROT_OFLOW: + genericsReport( V_INFO, "Decoding OFLOW with ETM in stream %d" EOL, r->options->tag ); + break; + + case PROT_ITM: + genericsReport( V_INFO, "Decoding ITM...not legal for TRACE" EOL ); + return false; + + case PROT_TPIU: + genericsReport( V_INFO, "Using TPIU with ETM in stream %d" EOL, r->options->tag ); + break; + + default: + genericsReport( V_INFO, "Decoding unknown" EOL ); + break; + } + return true; } // ==================================================================================================== @@ -409,7 +513,7 @@ static void _processBlock( struct RunTime *r ) y = r->rawBlock.fillLevel; #endif - if ( r->options->useTPIU ) + if ( PROT_TPIU == r->options->commProt ) { struct TPIUPacket p; @@ -479,6 +583,59 @@ static void _processBlock( struct RunTime *r ) } } } + +// ==================================================================================================== +static bool _rxAdd( struct RunTime *r, uint8_t c ) + +{ + r->newTotalBytes ++; + + r->pmBuffer[r->wp] = c; + uint32_t nwp = ( r->wp + 1 ) % r->options->buflen; + + if ( nwp == r->rp ) + { + if ( r->singleShot ) + { + r->held = true; + return true; + } + else + { + r->rp = ( r->rp + 1 ) % r->options->buflen; + } + } + + r->wp = nwp; + return false; +} + +// ==================================================================================================== + +static void _OFLOWpacketRxed ( struct OFLOWFrame *p, void *param ) + +{ + struct RunTime *r = ( struct RunTime * )param; + + if ( !p->good ) + { + genericsReport( V_WARN, "Bad packet received" EOL ); + } + else + { + if ( p->tag == r->options->tag ) + { + for ( int i = 0; i < p->len; i++ ) + { + if ( _rxAdd( r, p->d[i] ) ) + { + return; + } + } + } + } +} + // ==================================================================================================== static void _flushBuffer( struct RunTime *r ) @@ -505,16 +662,18 @@ static void _flushBuffer( struct RunTime *r ) /* ...and the file/line references */ r->op.currentLine = NO_LINE; r->op.currentFileindex = NO_FILE; - r->op.currentFunctionindex = NO_FUNCTION; + r->op.currentFunctionptr = NULL; r->op.workingAddr = NO_DESTADDRESS; } // ==================================================================================================== // Strdup leak is deliberately ignored. That is the central purpose of this code. It's cleaned // upin __flushBuffer above. #pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak" +#if !defined(__clang__) + #pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak" +#endif -static void _appendToOPBuffer( struct RunTime *r, int32_t lineno, enum LineType lt, const char *fmt, ... ) +static void _appendToOPBuffer( struct RunTime *r, void *dat, int32_t lineno, enum LineType lt, const char *fmt, ... ) /* Add line to output buffer, in a printf stylee */ @@ -532,28 +691,30 @@ static void _appendToOPBuffer( struct RunTime *r, int32_t lineno, enum LineType *p = 0; - r->opText = ( struct line * )realloc( r->opText, ( sizeof( struct line ) ) * ( r->numLines + 1 ) ); + r->opText = ( struct sioline * )realloc( r->opText, ( sizeof( struct sioline ) ) * ( r->numLines + 1 ) ); r->opText[r->numLines].buffer = strdup( construct ); r->opText[r->numLines].lt = lt; r->opText[r->numLines].line = lineno; r->opText[r->numLines].isRef = false; + r->opText[r->numLines].dat = dat; r->numLines++; } #pragma GCC diagnostic pop // ==================================================================================================== -static void _appendRefToOPBuffer( struct RunTime *r, int32_t lineno, enum LineType lt, const char *ref ) +static void _appendRefToOPBuffer( struct RunTime *r, void *dat, int32_t lineno, enum LineType lt, const char *ref ) /* Add line to output buffer, as a reference (which don't be free'd later) */ { - r->opText = ( struct line * )realloc( r->opText, ( sizeof( struct line ) ) * ( r->numLines + 1 ) ); + r->opText = ( struct sioline * )realloc( r->opText, ( sizeof( struct sioline ) ) * ( r->numLines + 1 ) ); /* This line removes the 'const', but we know to not mess with this line */ r->opText[r->numLines].buffer = ( char * )ref; r->opText[r->numLines].lt = lt; r->opText[r->numLines].line = lineno; r->opText[r->numLines].isRef = true; + r->opText[r->numLines].dat = dat; r->numLines++; } // ==================================================================================================== @@ -562,272 +723,411 @@ static void _traceReport( enum verbLevel l, const char *fmt, ... ) /* Debug reporting stream */ { - static char op[SCRATCH_STRING_LEN]; + if ( _r.options->withDebugText ) + { + static char op[SCRATCH_STRING_LEN]; - va_list va; - va_start( va, fmt ); - vsnprintf( op, SCRATCH_STRING_LEN, fmt, va ); - va_end( va ); - _appendToOPBuffer( &_r, _r.op.currentLine, LT_DEBUG, op ); + va_list va; + va_start( va, fmt ); + vsnprintf( op, SCRATCH_STRING_LEN, fmt, va ); + va_end( va ); + _appendToOPBuffer( &_r, NULL, _r.op.currentLine, LT_DEBUG, op ); + } } // ==================================================================================================== -static void _traceCB( void *d ) - -/* Callback function for when valid TRACE decode is detected */ +static void _addRetToStack( struct RunTime *r, symbolMemaddr p ) { - struct RunTime *r = ( struct RunTime * )d; - struct TRACECPUState *cpu = TRACECPUState( &r->i ); - char construct[SCRATCH_STRING_LEN]; - uint32_t incAddr = 0; - struct nameEntry n; - uint32_t disposition; - uint32_t targetAddr = 0; /* Just to avoid unitialised variable warning */ - bool linearRun = false; - - /* Deal with changes introduced by this event ========================= */ - if ( TRACEStateChanged( &r->i, EV_CH_TRACESTART ) ) + if ( r->stackDepth == MAX_CALL_STACK - 1 ) { - _appendRefToOPBuffer( r, r->op.currentLine, LT_EVENT, "========== TRACE START EVENT ==========" ); + /* Stack is full, so make room for a new entry */ + memmove( &r->callStack[0], &r->callStack[1], sizeof( symbolMemaddr ) * ( MAX_CALL_STACK - 1 ) ); } - if ( TRACEStateChanged( &r->i, EV_CH_ADDRESS ) ) - { - /* Make debug report if calculated and reported addresses differ. This is most useful for testing when exhaustive */ - /* address reporting is switched on. It will give 'false positives' for uncalculable instructions (e.g. bx lr) but */ - /* it's a decent safety net to be sure the jump decoder is working correctly. */ - - if ( r->options->protocol != TRACE_PROT_MTB ) - { - _appendToOPBuffer( r, r->op.currentLine, LT_DEBUG, "%sCommanded CPU Address change (Was:0x%08x Commanded:0x%08x)" EOL, - ( r->op.workingAddr == cpu->addr ) ? "" : "***INCONSISTENT*** ", r->op.workingAddr, cpu->addr ); - } + r->callStack[r->stackDepth] = p; + _traceReport( V_DEBUG, "Pushed %08x to return stack", r->callStack[r->stackDepth] ); - r->op.workingAddr = cpu->addr; - } - - if ( TRACEStateChanged( &r->i, EV_CH_LINEAR ) ) + if ( r->stackDepth < MAX_CALL_STACK - 1 ) { - /* Execute instructions from the marked starting location to the indicated finishing one (used by MTB) */ - /* Disposition is all 1's because every instruction is executed. */ - r->op.workingAddr = cpu->addr; - targetAddr = cpu->toAddr; - linearRun = true; - disposition = 0xffffffff; - _appendToOPBuffer( r, r->op.currentLine, LT_DEBUG, "Linear run 0x%08x to 0x%08x" EOL, cpu->addr, cpu->toAddr ); + /* We aren't at max depth, so go ahead and remove this entry */ + r->stackDepth++; } +} +// ==================================================================================================== +static void _reportNonflowEvents( struct RunTime *r ) - if ( TRACEStateChanged( &r->i, EV_CH_ENATOMS ) ) +{ + struct TRACECPUState *cpu = TRACECPUState( &r->i ); + + if ( TRACEStateChanged( &r->i, EV_CH_TRACESTART ) ) { - incAddr = cpu->eatoms + cpu->natoms; - disposition = cpu->disposition; + if ( !r->traceRunning ) + { + _appendRefToOPBuffer( r, NULL, r->op.currentLine, LT_EVENT, "========== TRACE START EVENT ==========" ); + r->traceRunning = true; + } } if ( TRACEStateChanged( &r->i, EV_CH_VMID ) ) { - _appendToOPBuffer( r, r->op.currentLine, LT_EVENT, "*** VMID Set to %d", cpu->vmid ); - } - - if ( TRACEStateChanged( &r->i, EV_CH_EX_ENTRY ) ) - { - if ( r->options->protocol != TRACE_PROT_MTB ) - { - _appendToOPBuffer( r, r->op.currentLine, LT_EVENT, "========== Exception Entry%s (%d at 0x%08x) ==========", - TRACEStateChanged( &r->i, EV_CH_CANCELLED ) ? ", Last Instruction Cancelled" : "", cpu->exception, cpu->addr ); - } - else - { - _appendToOPBuffer( r, r->op.currentLine, LT_EVENT, "========== Exception Entry ==========" ); - } + _appendToOPBuffer( r, NULL, r->op.currentLine, LT_EVENT, "*** VMID Set to %d", cpu->vmid ); } if ( TRACEStateChanged( &r->i, EV_CH_EX_EXIT ) ) { - _appendRefToOPBuffer( r, r->op.currentLine, LT_EVENT, "========== Exception Exit ==========" ); + _appendRefToOPBuffer( r, NULL, r->op.currentLine, LT_EVENT, "========== Exception Exit ==========" ); } if ( TRACEStateChanged( &r->i, EV_CH_TSTAMP ) ) { - _appendToOPBuffer( r, r->op.currentLine, LT_EVENT, "*** Timestamp %ld", cpu->ts ); + if ( cpu->ts ) + { + if ( cpu->ts != COUNT_UNKNOWN ) + { + _appendToOPBuffer( r, NULL, r->op.currentLine, LT_EVENT, "*** Timestamp %ld", cpu->ts ); + } + else + { + _appendToOPBuffer( r, NULL, r->op.currentLine, LT_EVENT, "*** Timestamp unknown" ); + } + } } if ( TRACEStateChanged( &r->i, EV_CH_TRIGGER ) ) { - _appendRefToOPBuffer( r, r->op.currentLine, LT_EVENT, "*** Trigger" ); + _appendRefToOPBuffer( r, NULL, r->op.currentLine, LT_EVENT, "*** Trigger" ); } if ( TRACEStateChanged( &r->i, EV_CH_CLOCKSPEED ) ) { - _appendRefToOPBuffer( r, r->op.currentLine, LT_EVENT, "*** Change Clockspeed" ); + _appendRefToOPBuffer( r, NULL, r->op.currentLine, LT_EVENT, "*** Change Clockspeed" ); } if ( TRACEStateChanged( &r->i, EV_CH_ISLSIP ) ) { - _appendRefToOPBuffer( r, r->op.currentLine, LT_EVENT, "*** ISLSIP Triggered" ); + _appendRefToOPBuffer( r, NULL, r->op.currentLine, LT_EVENT, "*** ISLSIP Triggered" ); } if ( TRACEStateChanged( &r->i, EV_CH_CYCLECOUNT ) ) { - _appendToOPBuffer( r, r->op.currentLine, LT_EVENT, "(Cycle Count %d)", cpu->cycleCount ); + _appendToOPBuffer( r, NULL, r->op.currentLine, LT_EVENT, "(Cycle Count %d)", cpu->cycleCount ); } if ( TRACEStateChanged( &r->i, EV_CH_VMID ) ) { - _appendToOPBuffer( r, r->op.currentLine, LT_EVENT, "(VMID is now %d)", cpu->vmid ); + _appendToOPBuffer( r, NULL, r->op.currentLine, LT_EVENT, "(VMID is now %d)", cpu->vmid ); } if ( TRACEStateChanged( &r->i, EV_CH_CONTEXTID ) ) { - _appendToOPBuffer( r, r->op.currentLine, LT_EVENT, "(Context ID is now %d)", cpu->contextID ); + if ( r->context != cpu->contextID ) + { + _appendToOPBuffer( r, NULL, r->op.currentLine, LT_EVENT, "(Context ID is now %d)", cpu->contextID ); + r->context = cpu->contextID; + } } if ( TRACEStateChanged( &r->i, EV_CH_SECURE ) ) { - _appendToOPBuffer( r, r->op.currentLine, LT_EVENT, "(Non-Secure State is now %s)", cpu->nonSecure ? "True" : "False" ); + _appendToOPBuffer( r, NULL, r->op.currentLine, LT_EVENT, "(Non-Secure State is now %s)", cpu->nonSecure ? "True" : "False" ); } if ( TRACEStateChanged( &r->i, EV_CH_ALTISA ) ) { - _appendToOPBuffer( r, r->op.currentLine, LT_EVENT, "(Using AltISA is now %s)", cpu->altISA ? "True" : "False" ); + _appendToOPBuffer( r, NULL, r->op.currentLine, LT_EVENT, "(Using AltISA is now %s)", cpu->altISA ? "True" : "False" ); } if ( TRACEStateChanged( &r->i, EV_CH_HYP ) ) { - _appendToOPBuffer( r, r->op.currentLine, LT_EVENT, "(Using Hypervisor is now %s)", cpu->hyp ? "True" : "False" ); + _appendToOPBuffer( r, NULL, r->op.currentLine, LT_EVENT, "(Using Hypervisor is now %s)", cpu->hyp ? "True" : "False" ); } if ( TRACEStateChanged( &r->i, EV_CH_JAZELLE ) ) { - _appendToOPBuffer( r, r->op.currentLine, LT_EVENT, "(Using Jazelle is now %s)", cpu->jazelle ? "True" : "False" ); + _appendToOPBuffer( r, NULL, r->op.currentLine, LT_EVENT, "(Using Jazelle is now %s)", cpu->jazelle ? "True" : "False" ); } if ( TRACEStateChanged( &r->i, EV_CH_THUMB ) ) { - _appendToOPBuffer( r, r->op.currentLine, LT_EVENT, "(Using Thumb is now %s)", cpu->thumb ? "True" : "False" ); + _appendToOPBuffer( r, NULL, r->op.currentLine, LT_EVENT, "(Using Thumb is now %s)", cpu->thumb ? "True" : "False" ); + } +} + +// ==================================================================================================== +static void _traceCB( void *d ) + +/* Callback function for when valid TRACE decode is detected */ + +{ + struct RunTime *r = ( struct RunTime * )d; + struct TRACECPUState *cpu = TRACECPUState( &r->i ); + uint32_t incAddr = 0; + uint32_t disposition; + uint32_t targetAddr = 0; /* Just to avoid unitialised variable warning */ + bool linearRun = false; + enum instructionClass ic; + symbolMemaddr newaddr; + + /* 1: Report anything that doesn't affect the flow */ + /* =============================================== */ + _reportNonflowEvents( r ); + + /* 2: Deal with exception entry */ + /* ============================ */ + if ( TRACEStateChanged( &r->i, EV_CH_EX_ENTRY ) ) + { + switch ( r->options->traceProt ) + { + case TRACE_PROT_ETM35: + _appendToOPBuffer( r, NULL, r->op.currentLine, LT_EVENT, "========== Exception Entry%s (%d (%s) at 0x%08x) ==========", + TRACEStateChanged( &r->i, EV_CH_CANCELLED ) ? ", Last Instruction Cancelled" : "", cpu->exception, TRACEExceptionName( cpu->exception ), cpu->addr ); + break; + + case TRACE_PROT_MTB: + _appendRefToOPBuffer( r, NULL, r->op.currentLine, LT_EVENT, "========== Exception Entry ==========" ); + break; + + + case TRACE_PROT_ETM4: + + /* For the ETM4 case we get a new address with the exception indication. This address is the preferred _return_ address, */ + /* there will be a further address packet, which is the jump destination, along shortly. Note that _this_ address */ + /* change indication will be consumed here, and won't hit the test below (which is correct behaviour. */ + if ( !TRACEStateChanged( &r->i, EV_CH_ADDRESS ) ) + { + _traceReport( V_DEBUG, "Exception occured without return address specification" ); + } + else + { + _appendToOPBuffer( r, NULL, r->op.currentLine, LT_EVENT, "========== Exception Entry (%d (%s) at 0x%08x return to %08x ) ==========", + cpu->exception, TRACEExceptionName( cpu->exception ), r->op.workingAddr, cpu->addr ); + _addRetToStack( r, cpu->addr ); + } + + break; + + default: + _traceReport( V_DEBUG, "Unrecognised trace protocol in exception handler" ); + break; + } } - /* End of dealing with changes introduced by this event =============== */ + /* 3: Collect flow affecting changes introduced by this event */ + /* ========================================================== */ + if ( TRACEStateChanged( &r->i, EV_CH_ADDRESS ) ) + { + /* Make debug report if calculated and reported addresses differ. This is most useful for testing when exhaustive */ + /* address reporting is switched on. It will give 'false positives' for uncalculable instructions (e.g. bx lr) but */ + /* it's a decent safety net to be sure the jump decoder is working correctly. */ + + if ( r->options->traceProt != TRACE_PROT_MTB ) + { + _traceReport( V_DEBUG, "%sCommanded CPU Address change (Was:0x%08x Commanded:0x%08x)" EOL, + ( r->op.workingAddr == cpu->addr ) ? "" : "***INCONSISTENT*** ", r->op.workingAddr, cpu->addr ); + } + + /* Return Stack: If we had a stack deletion pending because of a candidate match, it wasn't, so abort */ + if ( r->stackDelPending ) + { + _traceReport( V_DEBUG, "Stack delete aborted" ); + } + + r->stackDelPending = false; + /* Whatever the state was, this is an explicit setting of an address, so we need to respect it */ + r->op.workingAddr = cpu->addr; + } + else + { + /* Return Stack: If we had a stack deletion pending because of a candidate match, the match was good, so commit */ + if ( ( r->stackDelPending == true ) && ( r->stackDepth ) ) + { + r->stackDepth--; + _traceReport( V_DEBUG, "Stack delete comitted" ); + } + + r->stackDelPending = false; + } + + if ( TRACEStateChanged( &r->i, EV_CH_LINEAR ) ) + { + /* MTB-Specific mechanism: Execute instructions from the marked starting location to the indicated finishing one */ + /* Disposition is all 1's because every instruction is executed. */ + r->op.workingAddr = cpu->addr; + targetAddr = cpu->toAddr; + linearRun = true; + disposition = 0xffffffff; + _traceReport( V_DEBUG, "Linear run 0x%08x to 0x%08x" EOL, cpu->addr, cpu->toAddr ); + } + + if ( TRACEStateChanged( &r->i, EV_CH_ENATOMS ) ) + { + /* Atoms represent instruction steps...some of which will have been executed, some stepped over. The number of steps is the */ + /* total of the eatoms (executed) and natoms (not executed) and the disposition bitfield shows if each individual instruction */ + /* was executed or not. For ETM3 each 'run' of instructions is a single instruction with the disposition bit telling you if */ + /* it was executed or not. For ETM4 each 'run' of instructions is from the current address to the next possible change of */ + /* program flow (and which point the disposition bit tells you if that jump was taken or not). */ + incAddr = cpu->eatoms + cpu->natoms; + disposition = cpu->disposition; + } + + /* 4: Execute the flow instructions */ + /* ================================ */ while ( ( incAddr && !linearRun ) || ( ( r->op.workingAddr <= targetAddr ) && linearRun ) ) { - incAddr--; + /* Firstly, lets get the source code line...*/ + struct symbolLineStore *l = symbolLineAt( r->s, r->op.workingAddr ); - if ( SymbolLookup( r->s, r->op.workingAddr, &n ) ) + if ( l ) { /* If we have changed file or function put a header line in */ - if ( ( n.fileindex != r->op.currentFileindex ) || ( n.functionindex != r->op.currentFunctionindex ) ) + if ( l->function ) { - _appendToOPBuffer( r, r->op.currentLine, LT_FILE, "%s::%s", SymbolFilename( r->s, n.fileindex ), SymbolFunction( r->s, n.functionindex ) ); - r->op.currentFileindex = n.fileindex; - r->op.currentFunctionindex = n.functionindex; - r->op.currentLine = NO_LINE; + /* There is a valid function tag recognised here. If it's a change highlight it in the output. */ + if ( ( l->function->filename != r->op.currentFileindex ) || ( l->function != r->op.currentFunctionptr ) ) + { + _appendToOPBuffer( r, l, r->op.currentLine, LT_FILE, "%s::%s", symbolGetFilename( r->s, l->function->filename ), l->function->funcname ); + r->op.currentFileindex = l->function->filename; + r->op.currentFunctionptr = l->function; + r->op.currentLine = NO_LINE; + } } - - /* If we have changed line then output the new one */ - if ( n.line != r->op.currentLine - 1 ) + else { - const char *v = n.source; - r->op.currentLine = n.line - n.linesInBlock + 1; - *construct = 0; + /* We didn't find a valid function, but we might have some information to work with.... */ + if ( ( NO_FILE != r->op.currentFileindex ) || ( NULL != r->op.currentFunctionptr ) ) + { + _appendToOPBuffer( r, l, r->op.currentLine, LT_FILE, "Unknown function" ); + r->op.currentFileindex = NO_FILE; + r->op.currentFunctionptr = NULL; + r->op.currentLine = NO_LINE; + } + } + } - if ( v ) while ( *v ) - { - /* In buffer output NL/CR are treated as end of string, so this is safe */ - /* with these buffers that can span multiple lines. Split into separate ones. */ - _appendRefToOPBuffer( r, r->op.currentLine++, LT_SOURCE, v ); + /* If we have changed line then output the new one */ + if ( l && ( ( l->startline != r->op.currentLine ) ) ) + { + const char *v = symbolSource( r->s, l->filename, l->startline - 1 ); + r->op.currentLine = l->startline; + _appendRefToOPBuffer( r, l, r->op.currentLine, LT_SOURCE, v ); + } - /* Move to the CR/NL or EOL on this line */ - while ( ( *v ) && ( *v != '\r' ) && ( *v != '\n' ) ) - { - v++; - } + /* Now output the matching assembly, and location updates */ + char *a = symbolDisassembleLine( r->s, &ic, r->op.workingAddr, &newaddr ); - if ( *v ) - { - /* Found end of string or NL/CR...move past those */ - if ( ( ( *v == '\r' ) && ( *( v + 1 ) == '\n' ) ) || - ( ( *v == '\n' ) && ( *( v + 1 ) == '\r' ) ) - ) - { - v += 2; - } - else - { - v++; - } - } + if ( a ) + { + /* Calculate if this instruction was executed. This is slightly hairy depending on which protocol we're using; */ + /* * ETM3.5: Instructions are executed based on disposition bit (LSB in disposition word) */ + /* * ETM4 : ETM4 everything up to a branch is executed...decision about that branch is based on disposition bit */ + /* * MTB : Everything except jumps are executed, jumps are executed only if they are the last instruction in a run */ + bool insExecuted = ( + /* ETM3.5 case - dependent on disposition */ + ( ( !linearRun ) && ( r->i.protocol == TRACE_PROT_ETM35 ) && ( disposition & 1 ) ) || + + /* ETM4 case - either not a branch or disposition is 1 */ + ( ( !linearRun ) && ( r->i.protocol == TRACE_PROT_ETM4 ) && ( ( !( ic & LE_IC_JUMP ) ) || ( disposition & 1 ) ) ) || + + /* MTB case - a linear run to last address */ + ( ( linearRun ) && ( r->i.protocol == TRACE_PROT_MTB ) && + ( ( ( r->op.workingAddr != targetAddr ) && ( ! ( ic & LE_IC_JUMP ) ) ) || + ( r->op.workingAddr == targetAddr ) + ) ) ); + _appendToOPBuffer( r, l, r->op.currentLine, insExecuted ? LT_ASSEMBLY : LT_NASSEMBLY, a ); + + + /* Move addressing along */ + if ( ( r->i.protocol != TRACE_PROT_ETM4 ) || ( ic & LE_IC_JUMP ) ) + { + if ( r->i.protocol == TRACE_PROT_ETM4 ) + { + _traceReport( V_DEBUG, "Consumed, %sexecuted (%d left)", insExecuted ? "" : "not ", incAddr - 1 ); + } - } + disposition >>= 1; + incAddr--; } - /* If this line has assembly then output it */ - if ( n.assyLine != ASSY_NOT_FOUND ) + if ( ic & LE_IC_CALL ) { - /* Instructions are executed based on disposition for ETM */ - /* Everything except jumps are executed for MTB */ - /* jumps are executed only if they are the last instruction in a run */ - bool insExecuted = ( ( ( !linearRun ) & ( disposition & 1 ) ) || - ( ( linearRun ) && - ( ( ( r->op.workingAddr != targetAddr ) && ( !n.assy[n.assyLine].isJump ) && ( !n.assy[n.assyLine].isSubCall ) ) || - ( r->op.workingAddr == targetAddr ) - ) ) ); - - _appendRefToOPBuffer( r, r->op.currentLine, insExecuted ? LT_ASSEMBLY : LT_NASSEMBLY, n.assy[n.assyLine].lineText ); - - if ( n.assy[n.assyLine].isJump || n.assy[n.assyLine].isSubCall ) + if ( insExecuted ) { - _appendToOPBuffer( r, r->op.currentLine, LT_DEBUG, "%sTAKEN %s", insExecuted ? "" : "NOT ", n.assy[n.assyLine].isJump ? "JUMP" : "SUBCALL" ); + /* Push the instruction after this if it's a subroutine or ISR */ + _traceReport( V_DEBUG, "Call to %08x", newaddr ); + _addRetToStack( r, r->op.workingAddr + ( ( ic & LE_IC_4BYTE ) ? 4 : 2 ) ); + } + r->op.workingAddr = insExecuted ? newaddr : r->op.workingAddr + ( ( ic & LE_IC_4BYTE ) ? 4 : 2 ); + } + else if ( ic & LE_IC_JUMP ) + { + _traceReport( V_DEBUG, "%sTAKEN JUMP", insExecuted ? "" : "NOT " ); + + if ( insExecuted ) + { /* Update working address according to if jump was taken */ - r->op.workingAddr = insExecuted ? ( n.assy[n.assyLine].jumpdest ) : r->op.workingAddr + ( ( n.assy[n.assyLine].is4Byte ) ? 4 : 2 ); + if ( ic & LE_IC_IMMEDIATE ) + { + _traceReport( V_DEBUG, "Immediate address %8x", newaddr ); + /* We have a good address, so update with it */ + r->op.workingAddr = newaddr; + } + else + { + /* We didn't get the address, so need to park the call stack address if we've got one. Either we won't */ + /* get an address (in which case this one was correct), or we wont (in which case, don't unstack this one). */ + if ( r->stackDepth ) + { + r->op.workingAddr = r->callStack[r->stackDepth - 1]; + _traceReport( V_DEBUG, "Return with stacked candidate to %08x", r->op.workingAddr ); + } + else + { + _traceReport( V_DEBUG, "Return with no stacked candidate" ); + } + + r->stackDelPending = true; + } } else { - r->op.workingAddr += ( n.assy[n.assyLine].is4Byte ) ? 4 : 2; + /* The branch wasn't taken, so just move along */ + r->op.workingAddr += ( ic & LE_IC_4BYTE ) ? 4 : 2; } } else { - _appendRefToOPBuffer( r, r->op.currentLine, LT_ASSEMBLY, "\t\tASSEMBLY NOT FOUND" EOL ); - r->op.workingAddr += 2; + /* Just a regular instruction, so just move along */ + r->op.workingAddr += ( ic & LE_IC_4BYTE ) ? 4 : 2; } } else { - /* We didn't have a symbol for this address, so let's just assume a short instruction */ - _appendRefToOPBuffer( r, r->op.currentLine, LT_DEBUG, "*** No Symbol found ***" EOL ); + _appendToOPBuffer( r, l, r->op.currentLine, LT_ASSEMBLY, "%8x:\tASSEMBLY NOT FOUND" EOL, r->op.workingAddr ); r->op.workingAddr += 2; + disposition >>= 1; + incAddr--; } - - disposition >>= 1; } } + // ==================================================================================================== -static void _dumpBuffer( struct RunTime *r ) +static bool _dumpBuffer( struct RunTime *r ) /* Dump received data buffer into text buffer */ { _flushBuffer( r ); - if ( !SymbolSetValid( &r->s, r->options->elffile ) ) + if ( !symbolSetValid( r->s ) ) { - switch ( SymbolSetCreate( &r->s, r->options->elffile, r->options->deleteMaterial, r->options->demangle, true, true, r->options->odoptions ) ) - { - case SYMBOL_NOELF: - genericsReport( V_ERROR, "Elf file or symbols in it not found" EOL ); - return; - - case SYMBOL_NOOBJDUMP: - genericsReport( V_ERROR, "Objdump not found" EOL ); - return; - - case SYMBOL_UNSPECIFIED: - genericsReport( V_ERROR, "Unspecified symbol subsystem error" EOL ); - return; + symbolDelete( r->s ); - default: - break; + if ( !( r->s = symbolAcquire( r->options->elffile, true, true ) ) ) + { + genericsReport( V_ERROR, "Elf file or symbols in it not found" EOL ); + return false; } genericsReport( V_DEBUG, "Loaded %s" EOL, r->options->elffile ); @@ -843,180 +1143,79 @@ static void _dumpBuffer( struct RunTime *r ) } /* Two calls in case buffer is wrapped - submit both parts */ - TRACEDecoderPump( &r->i, &r->pmBuffer[r->rp], r->options->buflen - r->rp, _traceCB, _traceReport, r ); + TRACEDecoderPump( &r->i, &r->pmBuffer[r->rp], r->options->buflen - r->rp, _traceCB, r ); /* The length of this second buffer can be 0 for case buffer is not wrapped */ - TRACEDecoderPump( &r->i, &r->pmBuffer[0], r->wp, _traceCB, _traceReport, r ); + TRACEDecoderPump( &r->i, &r->pmBuffer[0], r->wp, _traceCB, r ); /* Submit this constructed buffer for display */ SIOsetOutputBuffer( r->sio, r->numLines, r->numLines - 1, &r->opText, false ); + + return true; } // ==================================================================================================== -static bool _currentFileAndLine( struct RunTime *r, char **file, int32_t *l ) +static struct symbolLineStore *_fileAndLine( struct RunTime *r, uint32_t i ) { - /* Search backwards from current file and line until we find (a) a source line with a line number and */ + /* Search backwards from current position in buffer until we find a line a line record attached */ /* (b) a filename which contains this line. */ - int32_t sl = 0; - int32_t i = SIOgetCurrentLineno( r->sio ); - *file = NULL; - - while ( ( i ) && ( r->opText[i].lt != LT_FILE ) ) + while ( ( i ) && + ( ( ( ( r->opText[i].lt != LT_SOURCE ) && ( r->opText[i].lt != LT_ASSEMBLY ) ) || r->opText[i].dat == NULL ) ) ) { - if ( ( r->opText[i].lt == LT_SOURCE ) && ( !sl ) ) - { - sl = r->opText[i].line; - } - i--; } - if ( r->opText[i].lt == LT_FILE ) + if ( !i || !r->opText[i].dat ) { - *file = r->opText[i].buffer; - } + i = SIOgetCurrentLineno( r->sio ); - if ( !sl ) - { - /* This was odd, no line number found before filename was. Let's search forward for one */ - while ( ( i < r->numLines ) && ( r->opText[i].lt != LT_SOURCE ) ) + while ( ( i ) && + ( ( ( ( r->opText[i].lt != LT_SOURCE ) && ( r->opText[i].lt != LT_ASSEMBLY ) ) || r->opText[i].dat == NULL ) ) ) { i++; } - - if ( i < r->numLines ) - { - sl = r->opText[i].line; - } - } - - if ( ( !sl ) || ( !*file ) ) - { - /* We didn't find everything */ - return false; } - *l = sl; - return true; + return ( struct symbolLineStore * )( ( i < r->numLines ) ? r->opText[i].dat : NULL ); } // ==================================================================================================== -static bool _fileExists( char *fileToOpen ) - -{ - FILE *f = fopen( fileToOpen, "r" ); - - if ( !f ) - { - return false; - } +static void _mapFileBuffer( struct RunTime *r, int lineno, int filenameIndex ) - fclose( f ); - return true; -} -// ==================================================================================================== -static void _openFileCommand( struct RunTime *r, int32_t line, char *fileToOpen ) +/* Map filename records into buffer */ { - char construct[SCRATCH_STRING_LEN]; - char *a = r->options->openFileCL; - char *b = construct; - - /* We now have the filename and line number that we're targetting...go collect this file */ - if ( !a ) - { - return; - } + /* Get line reference from current buffer */ + assert( r->fileopText == NULL ); + assert( r->filenumLines == 0 ); + unsigned int index = 0; + const char *c; - while ( *a ) - { - if ( *a != '%' ) - { - *b++ = *a++; - } - else - { - a++; - - if ( *a == 'f' ) - { - a++; - b += snprintf( b, SCRATCH_STRING_LEN - ( b - construct ), "%s", fileToOpen ); - } - else if ( *a == 'l' ) - { - a++; - b += snprintf( b, SCRATCH_STRING_LEN - ( b - construct ), "%d", line ); - } - else - { - *b++ = *a++; - } - } - } - - *b++ = ' '; - *b++ = '&'; - *b++ = 0; - - /* Now detach from controlling terminal and send the message */ - system( construct ); -} -// ==================================================================================================== -static void _openFileBuffer( struct RunTime *r, int32_t line, char *fileToOpen ) - -/* Read file into buffer */ - -{ - FILE *f; - char construct[SCRATCH_STRING_LEN]; - char *p; - int32_t lc = 0; - - f = fopen( fileToOpen, "r" ); - - if ( !f ) - { - return; - } + r->filenumLines = 0; - while ( !feof( f ) ) + while ( ( c = symbolSource( r->s, filenameIndex, index++ ) ) ) { - if ( !fgets( construct, SCRATCH_STRING_LEN, f ) ) - { - break; - } - - lc++; - r->fileopText = ( struct line * )realloc( r->fileopText, ( sizeof( struct line ) ) * ( r->filenumLines + 1 ) ); + r->fileopText = ( struct sioline * )realloc( r->fileopText, ( sizeof( struct sioline ) ) * ( r->filenumLines + 1 ) ); - /* Remove and LF/CR */ - for ( p = construct; ( ( *p ) && ( *p != '\n' ) && ( *p != '\r' ) ); p++ ); - - *p = 0; - - r->fileopText[r->filenumLines].buffer = strdup( construct ); + /* This line removes the 'const', but we know to not mess with this line */ + r->fileopText[r->filenumLines].buffer = ( char * )c; + r->fileopText[r->filenumLines].dat = NULL; r->fileopText[r->filenumLines].lt = LT_MU_SOURCE; - r->fileopText[r->filenumLines].line = lc; - r->fileopText[r->filenumLines].isRef = false; + r->fileopText[r->filenumLines].isRef = true; + r->fileopText[r->filenumLines].line = r->filenumLines + 1; r->filenumLines++; } - fclose( f ); - - SIOsetOutputBuffer( r->sio, r->filenumLines, line - 1, &r->fileopText, true ); + SIOsetOutputBuffer( r->sio, r->filenumLines, lineno - 1, &r->fileopText, true ); r->diving = true; } // ==================================================================================================== -static void _doFileOpen( struct RunTime *r, bool isDive ) +static void _doFileDive( struct RunTime *r ) -/* Do actions required to open file to dive into */ +/* Do actions required to get file contents to dive into */ { - char *p; - char *filename; - int32_t lineNo; - char construct[SCRATCH_STRING_LEN]; + static struct symbolLineStore *l; if ( ( r->diving ) || ( !r->numLines ) || ( !r->held ) ) { @@ -1027,49 +1226,16 @@ static void _doFileOpen( struct RunTime *r, bool isDive ) assert( !r->fileopText ); assert( !r->filenumLines ); - - if ( !_currentFileAndLine( r, &p, &lineNo ) ) + if ( !( l = _fileAndLine( r, SIOgetCurrentLineno( r->sio ) ) ) ) { SIOalert( r->sio, "Couldn't get filename/line" ); return; } - filename = strdup( p ); - p = &filename[strlen( filename )]; - - /* Roll back to before the '::' to turn this into a filename */ - while ( ( p != filename ) && ( *p != ':' ) ) - { - p--; - } - - if ( ( p == filename ) || ( *( p - 1 ) != ':' ) ) - { - SIOalert( r->sio, "Couldn't decode filename" ); - free( filename ); - return; - } - - *( p - 1 ) = 0; - - /* Now create filename including stripped material if need be */ - snprintf( construct, SCRATCH_STRING_LEN, "%s%s", r->options->deleteMaterial ? r->options->deleteMaterial : "", filename ); - - /* Try full path first, and filename if path doesn't work */ - if ( _fileExists( construct ) ) - { - isDive ? _openFileBuffer( r, lineNo, construct ) : _openFileCommand( r, lineNo, construct ); - } - else if ( _fileExists( filename ) ) - { - isDive ? _openFileBuffer( r, lineNo, filename ) : _openFileCommand( r, lineNo, filename ); - } - else - { - SIOalert( r->sio, "Couldn't open file" ); - } + /* Cache the line in this file in case we need it later */ + r->lineNum = SIOgetCurrentLineno( r->sio ); - free( filename ); + _mapFileBuffer( r, l->startline, l->filename ); } // ==================================================================================================== static void _doFilesurface( struct RunTime *r ) @@ -1082,14 +1248,14 @@ static void _doFilesurface( struct RunTime *r ) return; } - while ( r->filenumLines ) - { - free( r->fileopText[--r->filenumLines].buffer ); - } - + /* Buffer is a ref so we don't need to delete it, just remove the index */ + free( r->fileopText ); r->fileopText = NULL; + r->filenumLines = 0; r->diving = false; + SIOsetOutputBuffer( r->sio, r->numLines, r->numLines - 1, &r->opText, false ); + SIOsetCurrentLineno( r->sio, r->lineNum ); } // ==================================================================================================== static void _doSave( struct RunTime *r, bool includeDebug ) @@ -1136,9 +1302,10 @@ static void _doSave( struct RunTime *r, bool includeDebug ) { p = r->opText[w].buffer; - /* Skip debug lines unless specifically told to include them */ - if ( ( r->opText[w].lt == LT_DEBUG ) && ( !includeDebug ) ) + /* Skip blank and debug lines unless specifically told to include them */ + if ( !p || ( ( r->opText[w].lt == LT_DEBUG ) && ( !includeDebug ) ) ) { + w++; continue; } @@ -1201,6 +1368,7 @@ int main( int argc, char *argv[] ) int32_t lastTTime, lastTSTime, lastHTime; struct Stream *stream; /* Stream that we are collecting data from */ struct timeval tv; + enum SIOEvent s; /* Have a basic name and search string set up */ _r.progName = genericsBasename( argv[0] ); @@ -1219,37 +1387,25 @@ int main( int argc, char *argv[] ) /* Make sure the fifos get removed at the end */ atexit( _doExit ); - /* Check we've got _some_ symbols to start from */ - if ( !SymbolSetValid( &_r.s, _r.options->elffile ) ) + if ( _r.options->file != NULL ) { - switch ( SymbolSetCreate( &_r.s, _r.options->elffile, _r.options->deleteMaterial, _r.options->demangle, true, true, _r.options->odoptions ) ) + if ( NULL == ( stream = streamCreateFile( _r.options->file ) ) ) { - case SYMBOL_NOELF: - genericsReport( V_ERROR, "Elf file or symbols in it not found" EOL ); - return -1; - - case SYMBOL_NOOBJDUMP: - genericsReport( V_ERROR, "Objdump not found" EOL ); - return -1; - - case SYMBOL_UNSPECIFIED: - genericsReport( V_ERROR, "Unspecified symbol subsystem error" EOL ); - return -1; - - default: - break; + genericsExit( V_ERROR, "File not found" EOL ); + _r.ending = true; } - - genericsReport( V_DEBUG, "Loaded %s" EOL, _r.options->elffile ); } - SymbolSetDelete( &_r.s ); + /* Check we've got _some_ symbols to start from */ + _r.s = symbolAcquire( _r.options->elffile, true, true ); - /* Create a screen and interaction handler */ - _r.sio = SIOsetup( _r.progName, _r.options->elffile, ( _r.options->file != NULL ) ); + if ( !_r.s ) + { + genericsReport( V_ERROR, "Elf file or symbols in it not found" EOL ); + return -1; + } - /* Fill in a time to start from */ - lastHTime = lastTTime = lastTSTime = genericsTimestampmS(); + genericsReport( V_DEBUG, "Loaded %s" EOL, _r.options->elffile ); /* This ensures the atexit gets called */ if ( SIG_ERR == signal( SIGINT, _intHandler ) ) @@ -1257,6 +1413,10 @@ int main( int argc, char *argv[] ) genericsExit( -1, "Failed to establish Int handler" EOL ); } + /* Fill in a time to start from */ + lastHTime = lastTTime = lastTSTime = genericsTimestampmS(); + + #if !defined( WIN32 ) /* Don't kill a sub-process when any reader or writer evaporates */ @@ -1270,29 +1430,29 @@ int main( int argc, char *argv[] ) /* Create the buffer memory */ _r.pmBuffer = ( uint8_t * )calloc( 1, _r.options->buflen ); - TRACEDecoderInit( &_r.i, _r.options->protocol, !( _r.options->noAltAddr ) ); + TRACEDecoderInit( &_r.i, _r.options->traceProt, !( _r.options->noAltAddr ), _traceReport ); - if ( _r.options->useTPIU ) + if ( PROT_TPIU == _r.options->commProt ) { TPIUDecoderInit( &_r.t ); } + OFLOWInit( &_r.c ); + + /* Create a screen and interaction handler */ + _r.sio = SIOsetup( _r.progName, _r.options->elffile, ( _r.options->file != NULL ) ); + /* Put a record of the protocol in use on screen */ - SIOtagText( _r.sio, TRACEprotocolString[_r.options->protocol] ); + SIOtagText( _r.sio, TRACEDecodeGetProtocolName( _r.options->traceProt ) ); while ( !_r.ending ) { - - if ( _r.options->file != NULL ) - { - stream = streamCreateFile( _r.options->file ); - } - else + if ( NULL == _r.options->file ) { /* Keep trying to open a network connection at half second intervals */ while ( 1 ) { - stream = streamCreateSocket( _r.options->server, _r.options->port + ( _r.options->useTPIU ? 0 : 1 ) ); + stream = streamCreateSocket( _r.options->server, _r.options->port + ( ( PROT_TPIU == _r.options->commProt ) ? 1 : 0 ) ); if ( stream ) { @@ -1302,7 +1462,7 @@ int main( int argc, char *argv[] ) /* This can happen when the feeder has gone missing... */ SIOalert( _r.sio, "No connection" ); - if ( SIOHandler( _r.sio, true, 0 ) == SIO_EV_QUIT ) + if ( SIOHandler( _r.sio, true, 0, _r.options->withDebugText ) == SIO_EV_QUIT ) { _r.ending = true; break; @@ -1349,13 +1509,22 @@ int main( int argc, char *argv[] ) if ( !_r.held ) { /* Pump all of the data through the protocol handler */ - _processBlock( &_r ); + + if ( PROT_OFLOW == _r.options->commProt ) + { + OFLOWPump( &_r.c, _r.rawBlock.buffer, _r.rawBlock.fillLevel, _OFLOWpacketRxed, &_r ); + } + else + { + _processBlock( &_r ); + } } /* Update the outputs and deal with any keys that made it up this high */ - switch ( SIOHandler( _r.sio, ( genericsTimestampmS() - lastTTime ) > TICK_TIME_MS, _r.oldTotalIntervalBytes ) ) + /* =================================================================== */ + switch ( ( s = SIOHandler( _r.sio, ( genericsTimestampmS() - lastTTime ) > TICK_TIME_MS, _r.oldTotalIntervalBytes, _r.options->withDebugText ) ) ) { - case SIO_EV_HOLD: + case SIO_EV_HOLD: // ----------------- Request for Hold Start/Stop ------------------------------------- if ( !_r.options->file ) { _r.held = !_r.held; @@ -1378,31 +1547,104 @@ int main( int argc, char *argv[] ) break; - case SIO_EV_SAVE: - if ( _r.options->file ) + case SIO_EV_PREV: + case SIO_EV_NEXT: // ----------------- Request for next/prev execution line ----------------------------- + if ( !_r.diving ) + { + int32_t l = SIOgetCurrentLineno( _r.sio ); + + if ( ( ( s == SIO_EV_PREV ) && ( !l ) ) || ( ( s == SIO_EV_NEXT ) && ( l >= _r.numLines - 1 ) ) ) + { + break; + } + + /* In a regular window, scroll back looking for an earlier assembly instruction */ + do + { + l += s == SIO_EV_PREV ? -1 : 1; + } + while ( l && ( l < _r.numLines - 1 ) && ( ( _r.opText[l].lt != LT_ASSEMBLY ) ) ); + + if ( l ) + { + SIOsetCurrentLineno( _r.sio, l ); + SIOrequestRefresh( _r.sio ); + } + else + { + SIObeep(); + } + } + else + { + /* In a diving window, situation is slightly more complicated */ + int32_t l = _r.lineNum; + struct symbolLineStore *oldLine = _fileAndLine( &_r, l ); + + if ( ( ( s == SIO_EV_PREV ) && ( !l ) ) || ( ( s == SIO_EV_NEXT ) && ( l >= _r.numLines - 1 ) ) ) + { + break; + } + + /* Search for different _source_line_ to the one we started from */ + do + { + l += s == SIO_EV_PREV ? -1 : 1; + } + while ( l && ( l < _r.numLines - 1 ) && ( ( _r.opText[l].lt != LT_SOURCE ) ) ); + + if ( l ) + { + if ( oldLine->filename == _fileAndLine( &_r, l )->filename ) + { + /* We are still in the same file, so only the line number to change */ + _r.lineNum = l; + SIOsetCurrentLineno( _r.sio, _fileAndLine( &_r, l )->startline - 1 ); + SIOrequestRefresh( _r.sio ); + } + else + { + /* We have changed diving file, surface and enter the new one */ + _r.lineNum = l; + _doFilesurface( &_r ); + _doFileDive( &_r ); + SIOrequestRefresh( _r.sio ); + } + } + else + { + SIObeep(); + } + + } + + break; + + case SIO_EV_SAVE: // ------------------ Request for file save ------------------------------------------- + if ( !_r.options->file ) { _doSave( &_r, false ); } break; - case SIO_EV_DIVE: - _doFileOpen( &_r, true ); + case SIO_EV_DIVE: // -------------------- Request for dive into source file ----------------------------- + _doFileDive( &_r ); break; - case SIO_EV_FOPEN: + case SIO_EV_FOPEN: // ------------------- Request for file open ----------------------------------------- if ( _r.options->openFileCL ) { - _doFileOpen( &_r, false ); + // _doFileOpen( &_r, false ); } break; - case SIO_EV_SURFACE: + case SIO_EV_SURFACE: // --------------------- Request for file surface ---------------------------------- _doFilesurface( &_r ); break; - case SIO_EV_QUIT: + case SIO_EV_QUIT: // ------------------------- Request to exit ------------------------------------------ _r.ending = true; break; @@ -1414,16 +1656,22 @@ int main( int argc, char *argv[] ) if ( ( !_r.numLines ) && ( ( _r.options->file && !stream ) || - ( ( ( genericsTimestampmS() - lastHTime ) > HANG_TIME_MS ) && ( _r.newTotalBytes - _r.oldTotalHangBytes == 0 ) && ( _r.wp != _r.rp ) ) ) ) { - _dumpBuffer( &_r ); - _r.held = true; - SIOheld( _r.sio, _r.held ); + if ( !_dumpBuffer( &_r ) ) + { + /* Dumping the buffer failed, so give up */ + _r.ending = true; + } + else + { + _r.held = true; + SIOheld( _r.sio, _r.held ); + } } /* Update the intervals */ @@ -1470,6 +1718,7 @@ int main( int argc, char *argv[] ) } } + symbolDelete( _r.s ); return OK; } diff --git a/Src/orbprofile.c b/Src/orbprofile.c index 8333118d..78593d1c 100644 --- a/Src/orbprofile.c +++ b/Src/orbprofile.c @@ -21,6 +21,7 @@ #include "uthash.h" #include "generics.h" #include "traceDecoder.h" +#include "oflow.h" #include "symbols.h" #include "nw.h" #include "ext_fileformats.h" @@ -30,6 +31,9 @@ #define DEFAULT_DURATION_MS (1000) /* Default time to sample, in mS */ #define HANDLE_MASK (0xFFFFFF) /* cachegrind cannot cope with large file handle numbers */ +enum Prot { PROT_OFLOW, PROT_ITM, PROT_TPIU, PROT_UNKNOWN }; +const char *protString[] = {"OFLOW", "ITM", "TPIU", NULL}; + /* How many transfer buffers from the source to allocate */ #define NUM_RAW_BLOCKS (1000) @@ -61,19 +65,21 @@ struct Options /* Record for options, either defaults int sampleDuration; /* How long we are going to sample for */ bool mono; /* Supress colour in output */ bool noaltAddr; /* Dont use alternate addressing */ - bool useTPIU; /* Are we using TPIU, and stripping TPIU frames? */ - int channel; /* When TPIU is in use, which channel to decode? */ - enum TRACEprotocol protocol; /* Encoding protocol to use */ + int tag; /* Which TPIU or OFLOW stream are we decoding? */ + enum TRACEprotocol tProtocol; /* Encoding protocol to use */ int port; /* Source information for where to connect to */ char *server; + enum Prot protocol; /* What protocol to communicate (default to OFLOW (== orbuculum)) */ + } _options = { .demangle = true, .sampleDuration = DEFAULT_DURATION_MS, - .port = NWCLIENT_SERVER_PORT, - .protocol = TRACE_PROT_ETM35, + .port = OTCLIENT_SERVER_PORT, + .tProtocol = TRACE_PROT_ETM35, + .tag = 2, .server = "localhost" }; @@ -110,6 +116,7 @@ struct RunTime /* Subsystem data support */ struct TRACEDecoder i; struct SymbolSet *s; /* Symbols read from elf */ + struct OFLOW c; /* Calls related info */ struct edge *calls; /* Call data table */ @@ -181,7 +188,7 @@ static void _callEvent( struct RunTime *r, uint32_t retAddr, uint32_t to ) { /* This call entry doesn't exist (i.e. it's the first time this from/to pair have been seen...let's create it */ s = ( struct subcall * )calloc( 1, sizeof( struct subcall ) ); - MEMCHECK( s, ); + MEMCHECKV( s ); memcpy( &s->sig, &r->substack[r->substacklen].sig, sizeof( struct subcallSig ) ); HASH_ADD( hh, r->subhead, sig, sizeof( struct subcallSig ), s ); } @@ -267,7 +274,7 @@ static void _hashFindOrCreate( struct RunTime *r, uint32_t addr, struct execEntr } *h = calloc( 1, sizeof( struct execEntryHash ) ); - MEMCHECK( *h, ); + MEMCHECKV( *h ); ( *h )->addr = r->op.workingAddr; ( *h )->fileindex = n.fileindex; @@ -375,7 +382,7 @@ static void _traceCB( void *d ) /* Create false entry for an interrupt source */ r->op.inth = calloc( 1, sizeof( struct execEntryHash ) ); - MEMCHECK( r->op.inth, ); + MEMCHECKV( r->op.inth ); r->op.inth->addr = INTERRUPT; r->op.inth->fileindex = INTERRUPT; r->op.inth->line = NO_LINE; @@ -407,7 +414,7 @@ static void _traceCB( void *d ) { if ( TRACEStateChanged( &r->i, EV_CH_ADDRESS ) ) { - DBG_OUT( "New addr %08x" EOL, cpu->addr ); + DBG_OUT( "New addr %08lx" EOL, cpu->addr ); r->op.workingAddr = cpu->addr; } @@ -425,7 +432,7 @@ static void _traceCB( void *d ) } r->op.workingAddr = cpu->addr; - DBG_OUT( "A:%08x" EOL, cpu->addr ); + DBG_OUT( "A:%08lx" EOL, cpu->addr ); } /* ================================================ */ @@ -461,9 +468,10 @@ static void _printHelp( const char *const progName ) genericsPrintf( " -I, --interval: Time between samples (in ms)" EOL ); genericsPrintf( " -M, --no-colour: Supress colour in output" EOL ); genericsPrintf( " -O, --objdump-opts: Options to pass directly to objdump" EOL ); - genericsPrintf( " -p, --trace-proto: {ETM35|MTB} trace protocol to use, default is ETM35" EOL ); + genericsPrintf( " -P, --trace-proto: {ETM35|MTB} trace protocol to use, default is ETM35" EOL ); + genericsPrintf( " -p, --protocol: Protocol to communicate. Defaults to OFLOW if -s is not set, otherwise TPIU" EOL ); genericsPrintf( " -s, --server: : to use" EOL ); - //genericsPrintf( " -t, --tpiu: : Use TPIU to strip TPIU on specfied channel (defaults to 2)" EOL ); + genericsPrintf( " -t, --tag: : Which TPIU stream or OFLOW tag to use (normally 2)" EOL ); genericsPrintf( " -T, --all-truncate: truncate -d material off all references (i.e. make output relative)" EOL ); genericsPrintf( " -v, --verbose: Verbose mode 0(errors)..3(debug)" EOL ); genericsPrintf( " -V, --version: Print version and exit" EOL ); @@ -491,9 +499,11 @@ static struct option _longOptions[] = {"no-colour", no_argument, NULL, 'M'}, {"no-color", no_argument, NULL, 'M'}, {"objdump-opts", required_argument, NULL, 'O'}, - {"trace-proto", required_argument, NULL, 'p'}, + {"trace-proto", required_argument, NULL, 'P'}, + {"protocol", required_argument, NULL, 'p'}, {"server", required_argument, NULL, 's'}, {"all-truncate", no_argument, NULL, 'T'}, + {"tag", required_argument, NULL, 't'}, {"verbose", required_argument, NULL, 'v'}, {"version", no_argument, NULL, 'V'}, {"graph-file", required_argument, NULL, 'y'}, @@ -505,8 +515,10 @@ static bool _processOptions( int argc, char *argv[], struct RunTime *r ) { int c, optionIndex = 0; + bool protExplicit = false; + bool serverExplicit = false; - while ( ( c = getopt_long ( argc, argv, "ADd:e:Ef:hVI:MO:p:s:Tv:y:z:", _longOptions, &optionIndex ) ) != -1 ) + while ( ( c = getopt_long ( argc, argv, "ADd:e:Ef:hVI:MO:P:p:s:t:Tv:y:z:", _longOptions, &optionIndex ) ) != -1 ) switch ( c ) { @@ -569,19 +581,43 @@ static bool _processOptions( int argc, char *argv[], struct RunTime *r ) // ------------------------------------ - case 'p': + case 'P': /* Index through protocol strings looking for match or end of list */ - for ( r->options->protocol = TRACE_PROT_LIST_START; - ( ( r->options->protocol != TRACE_PROT_LIST_END ) && strcasecmp( optarg, TRACEprotocolString[r->options->protocol] ) ); - r->options->protocol++ ) + for ( r->options->tProtocol = TRACE_PROT_LIST_START; + ( ( r->options->tProtocol != TRACE_PROT_LIST_END ) && strcasecmp( optarg, TRACEDecodeGetProtocolName( r->options->tProtocol ) ) ); + r->options->tProtocol++ ) {} break; + // ------------------------------------ + + case 'p': + r->options->protocol = PROT_UNKNOWN; + protExplicit = true; + + for ( int i = 0; protString[i]; i++ ) + { + if ( !strcmp( protString[i], optarg ) ) + { + r->options->protocol = i; + break; + } + } + + if ( r->options->protocol == PROT_UNKNOWN ) + { + genericsReport( V_ERROR, "Unrecognised protocol type" EOL ); + return false; + } + + break; + // ------------------------------------ case 's': r->options->server = optarg; + serverExplicit = true; // See if we have an optional port number too char *a = optarg; @@ -604,6 +640,11 @@ static bool _processOptions( int argc, char *argv[], struct RunTime *r ) break; + // ------------------------------------ + case 't': + r->options->tag = atoi( optarg ); + break; + // ------------------------------------ case 'T': r->options->truncateDeleteMaterial = true; @@ -650,6 +691,12 @@ static bool _processOptions( int argc, char *argv[], struct RunTime *r ) // ------------------------------------ } + /* If we set an explicit server and port and didn't set a protocol chances are we want TPIU, not OFLOW */ + if ( serverExplicit && !protExplicit ) + { + r->options->protocol = PROT_TPIU; + } + if ( !r->options->elffile ) { genericsExit( -2, "Elf File not specified" EOL ); @@ -660,7 +707,7 @@ static bool _processOptions( int argc, char *argv[], struct RunTime *r ) genericsExit( -2, "Illegal sample duration" EOL ); } - if ( r->options->protocol >= TRACE_PROT_NONE ) + if ( r->options->tProtocol >= TRACE_PROT_NONE ) { genericsExit( V_ERROR, "Unrecognised decode protocol" EOL ); } @@ -671,14 +718,33 @@ static bool _processOptions( int argc, char *argv[], struct RunTime *r ) genericsReport( V_INFO, "Delete Material : %s" EOL, r->options->deleteMaterial ? r->options->deleteMaterial : "None" ); genericsReport( V_INFO, "Elf File : %s (%s Names)" EOL, r->options->elffile, r->options->truncateDeleteMaterial ? "Truncate" : "Don't Truncate" ); genericsReport( V_INFO, "Objdump options : %s" EOL, r->options->odoptions ? r->options->odoptions : "None" ); - genericsReport( V_INFO, "Protocol : %s" EOL, TRACEprotocolString[r->options->protocol] ); + genericsReport( V_INFO, "Protocol : %s" EOL, TRACEDecodeGetProtocolName( r->options->tProtocol ) ); + genericsReport( V_INFO, "Tag (TPIU/OFLOW) : %d" EOL, r->options->tag ); genericsReport( V_INFO, "DOT file : %s" EOL, r->options->dotfile ? r->options->dotfile : "None" ); genericsReport( V_INFO, "Sample Duration : %d mS" EOL, r->options->sampleDuration ); + switch ( r->options->protocol ) + { + case PROT_OFLOW: + genericsReport( V_INFO, "Decoding OFLOW (Orbuculum) with ITM in stream %d" EOL, r->options->tag ); + break; + + case PROT_ITM: + genericsReport( V_INFO, "Decoding ITM. Not sensible for this application" EOL ); + return false; + + case PROT_TPIU: + genericsReport( V_INFO, "Using TPIU with ITM in stream %d" EOL, r->options->tag ); + break; + + default: + genericsReport( V_INFO, "Decoding unknown" EOL ); + break; + } + return true; } // ==================================================================================================== -// ==================================================================================================== static void _doExit( void ) /* Perform any explicit exit functions */ @@ -698,6 +764,23 @@ static void _intHandler( int sig ) _doExit(); } +// ==================================================================================================== + +static void _OFLOWpacketRxed ( struct OFLOWFrame *p, void *param ) + +{ + if ( !p->good ) + { + genericsReport( V_WARN, "Bad packet received" EOL ); + } + else + { + if ( p->tag == _r.options->tag ) + { + TRACEDecoderPump( &_r.i, p->d, p->len, _traceCB, &_r ); + } + } +} // ==================================================================================================== static void *_processBlocks( void *params ) @@ -738,8 +821,16 @@ static void *_processBlocks( void *params ) } #endif - /* Pump all of the data through the protocol handler */ - TRACEDecoderPump( &r->i, r->rawBlock[r->rp].buffer, r->rawBlock[r->rp].fillLevel, _traceCB, genericsReport, &_r ); + + if ( PROT_OFLOW == r->options->protocol ) + { + OFLOWPump( &_r.c, r->rawBlock[r->rp].buffer, r->rawBlock[r->rp].fillLevel, _OFLOWpacketRxed, &_r ); + } + else + { + /* Pump all of the data through the protocol handler */ + TRACEDecoderPump( &r->i, r->rawBlock[r->rp].buffer, r->rawBlock[r->rp].fillLevel, _traceCB, &_r ); + } r->rp = ( r->rp + 1 ) % NUM_RAW_BLOCKS; } @@ -798,7 +889,8 @@ int main( int argc, char *argv[] ) #endif - TRACEDecoderInit( &_r.i, _r.i.protocol, !_r.options->noaltAddr ); + TRACEDecoderInit( &_r.i, _r.options->tProtocol, !_r.options->noaltAddr, genericsReport ); + OFLOWInit( &_r.c ); while ( !_r.ending ) { diff --git a/Src/orbstat.c b/Src/orbstat.c index 7f2328d4..b9349dc1 100644 --- a/Src/orbstat.c +++ b/Src/orbstat.c @@ -21,6 +21,7 @@ #include "itmDecoder.h" #include "tpiuDecoder.h" #include "msgDecoder.h" +#include "oflow.h" #include "symbols.h" #include "nw.h" #include "ext_fileformats.h" @@ -37,6 +38,9 @@ #define IN_EVENT (0x40000000) #define OUT_EVENT (0x50000000) +enum Prot { PROT_OFLOW, PROT_ITM, PROT_TPIU, PROT_UNKNOWN }; +const char *protString[] = {"OFLOW", "ITM", "TPIU", NULL}; + /* States for sample reception state machine */ enum CDState { CD_waitinout, CD_waitsrc, CD_waitdst }; @@ -62,20 +66,21 @@ struct Options /* Record for options, either defaults bool forceITMSync; /* Do we assume ITM starts synced? */ bool mono; /* Supress colour in output */ - bool useTPIU; /* Are we using TPIU, and stripping TPIU frames? */ - uint32_t tpiuITMChannel; /* Which TPIU channel to use for ITM */ + uint32_t tag; /* Which TPIU or OFLOW stream are we decoding? */ int port; /* Source information for where to connect to */ char *server; + enum Prot protocol; /* What protocol to communicate (default to OFLOW (== orbuculum)) */ } _options = { .demangle = true, .sampleDuration = DEFAULT_DURATION_MS, - .port = NWCLIENT_SERVER_PORT, + .port = OTCLIENT_SERVER_PORT, .traceChannel = DEFAULT_TRACE_CHANNEL, .fileChannel = DEFAULT_FILE_CHANNEL, .forceITMSync = true, + .tag = 1, .server = "localhost" }; @@ -93,6 +98,7 @@ struct RunTime struct ITMPacket h; struct TPIUDecoder t; struct TPIUPacket p; + struct OFLOW c; struct msg m; /* Decoded message out of ITM layer */ const char *progName; /* Name by which this program was called */ @@ -403,7 +409,7 @@ void _protocolPump( struct RunTime *r, uint8_t c ) /* Top level protocol pump */ { - if ( r->options->useTPIU ) + if ( PROT_TPIU == r->options->protocol ) { switch ( TPIUPump( &r->t, c ) ) { @@ -435,7 +441,7 @@ void _protocolPump( struct RunTime *r, uint8_t c ) for ( uint32_t g = 0; g < r->p.len; g++ ) { - if ( r->p.packet[g].s == r->options->tpiuITMChannel ) + if ( r->p.packet[g].s == r->options->tag ) { _itmPumpProcess( r, r->p.packet[g].d ); continue; @@ -478,8 +484,10 @@ static void _printHelp( struct RunTime *r ) genericsPrintf( " -n, --itm-sync: Enforce sync requirement for ITM (i.e. ITM needs to issue syncs)" EOL ); genericsPrintf( " -M, --no-colour: Supress colour in output" EOL ); genericsPrintf( " -O, --objdump-opts: Options to pass directly to objdump" EOL ); + genericsPrintf( " -p, --protocol: Protocol to communicate. Defaults to OFLOW if -s is not set, otherwise ITM unless" EOL \ + " explicitly set to TPIU to decode TPIU frames on channel set by -t" EOL ); genericsPrintf( " -s, --server: : to use" EOL ); - genericsPrintf( " -t, --tpiu: : Use TPIU to strip TPIU on specfied channel (defaults to 1)" EOL ); + genericsPrintf( " -t, --tag: : Which TPIU stream or OFLOW tag to use (normally 1)" EOL ); genericsPrintf( " -T, --all-truncate: truncate -d material off all references (i.e. make output relative)" EOL ); genericsPrintf( " -v, --verbose: Verbose mode 0(errors)..3(debug)" EOL ); genericsPrintf( " -V, --version: Print version and exit" EOL ); @@ -509,6 +517,7 @@ static struct option _longOptions[] = {"no-colour", no_argument, NULL, 'M'}, {"no-color", no_argument, NULL, 'M'}, {"objdump-opts", required_argument, NULL, 'O'}, + {"protocol", required_argument, NULL, 'p'}, {"server", required_argument, NULL, 's'}, {"tpiu", required_argument, NULL, 't'}, {"all-truncate", no_argument, NULL, 'T'}, @@ -523,8 +532,11 @@ static bool _processOptions( int argc, char *argv[], struct RunTime *r ) { int c, optionIndex = 0; + bool protExplicit = false; + bool serverExplicit = false; + bool portExplicit = false; - while ( ( c = getopt_long ( argc, argv, "Dd:e:Ef:g:hI:nO:s:t:Tv:Vy:z:", _longOptions, &optionIndex ) ) != -1 ) + while ( ( c = getopt_long ( argc, argv, "Dd:e:Ef:g:hI:nO:p:s:t:Tv:Vy:z:", _longOptions, &optionIndex ) ) != -1 ) switch ( c ) { // ------------------------------------ @@ -588,9 +600,33 @@ static bool _processOptions( int argc, char *argv[], struct RunTime *r ) r->options->odoptions = optarg; break; + // ------------------------------------ + + case 'p': + r->options->protocol = PROT_UNKNOWN; + protExplicit = true; + + for ( int i = 0; protString[i]; i++ ) + { + if ( !strcmp( protString[i], optarg ) ) + { + r->options->protocol = i; + break; + } + } + + if ( r->options->protocol == PROT_UNKNOWN ) + { + genericsReport( V_ERROR, "Unrecognised protocol type" EOL ); + return false; + } + + break; + // ------------------------------------ case 's': r->options->server = optarg; + serverExplicit = true; // See if we have an optional port number too char *a = optarg; @@ -610,6 +646,10 @@ static bool _processOptions( int argc, char *argv[], struct RunTime *r ) { r->options->port = NWCLIENT_SERVER_PORT; } + else + { + portExplicit = true; + } break; @@ -620,8 +660,7 @@ static bool _processOptions( int argc, char *argv[], struct RunTime *r ) // ------------------------------------ case 't': - r->options->tpiuITMChannel = atoi( optarg ); - r->options->useTPIU = !r->options->useTPIU; + r->options->tag = atoi( optarg ); break; // ------------------------------------ @@ -665,6 +704,17 @@ static bool _processOptions( int argc, char *argv[], struct RunTime *r ) // ------------------------------------ } + /* If we set an explicit server and port and didn't set a protocol chances are we want ITM, not OFLOW */ + if ( serverExplicit && !protExplicit ) + { + r->options->protocol = PROT_ITM; + } + + if ( ( r->options->protocol == PROT_TPIU ) && !portExplicit ) + { + r->options->port = NWCLIENT_SERVER_PORT; + } + if ( !r->options->elffile ) { genericsReport( V_ERROR, "Elf File not specified" EOL ); @@ -683,30 +733,61 @@ static bool _processOptions( int argc, char *argv[], struct RunTime *r ) genericsReport( V_INFO, "Elf File : %s %s" EOL, r->options->elffile, r->options->truncateDeleteMaterial ? "(Truncate)" : "(Don't Truncate)" ); genericsReport( V_INFO, "DOT file : %s" EOL, r->options->dotfile ? r->options->dotfile : "None" ); genericsReport( V_INFO, "ForceSync : %s" EOL, r->options->forceITMSync ? "true" : "false" ); - genericsReport( V_INFO, "Trace Channel : %d" EOL, r->options->traceChannel ); genericsReport( V_INFO, "Sample Duration : %d mS" EOL, r->options->sampleDuration ); genericsReport( V_INFO, "Objdump options : %s" EOL, r->options->odoptions ? r->options->odoptions : "None" ); + + switch ( r->options->protocol ) + { + case PROT_OFLOW: + genericsReport( V_INFO, "Decoding OFLOW (Orbuculum) with ITM in stream %d" EOL, r->options->tag ); + break; + + case PROT_ITM: + genericsReport( V_INFO, "Decoding ITM" EOL ); + break; + + case PROT_TPIU: + genericsReport( V_INFO, "Using TPIU with ITM in stream %d" EOL, r->options->tag ); + break; + + default: + genericsReport( V_INFO, "Decoding unknown" EOL ); + break; + } + return true; } // ==================================================================================================== -// ==================================================================================================== -static void _doExit( void ) - -/* Perform any explicit exit functions */ +static void _intHandler( int sig ) +/* Catch CTRL-C so things can be cleaned up properly via atexit functions */ { + /* CTRL-C exit is not an error... */ _r.ending = true; - /* Give them a bit of time, then we're leaving anyway */ - usleep( 200 ); } // ==================================================================================================== -static void _intHandler( int sig ) -/* Catch CTRL-C so things can be cleaned up properly via atexit functions */ +static void _OFLOWpacketRxed ( struct OFLOWFrame *p, void *param ) + { - /* CTRL-C exit is not an error... */ - _doExit(); + struct RunTime *r = ( struct RunTime * )param; + + if ( !p->good ) + { + genericsReport( V_WARN, "Bad packet received" EOL ); + } + else + { + if ( p->tag == r->options->tag ) + { + for ( int i = 0; i < p->len; i++ ) + { + _itmPumpProcess( r, p->d[i] ); + } + } + } } + // ==================================================================================================== int main( int argc, char *argv[] ) @@ -729,9 +810,6 @@ int main( int argc, char *argv[] ) genericsScreenHandling( !_r.options->mono ); - /* Make sure the fifos get removed at the end */ - atexit( _doExit ); - /* This ensures the atexit gets called */ if ( SIG_ERR == signal( SIGINT, _intHandler ) ) { @@ -751,6 +829,7 @@ int main( int argc, char *argv[] ) /* Reset the TPIU handler before we start */ TPIUDecoderInit( &_r.t ); ITMDecoderInit( &_r.i, _r.options->forceITMSync ); + OFLOWInit( &_r.c ); while ( !_r.ending ) { @@ -831,13 +910,20 @@ int main( int argc, char *argv[] ) /* ...and record the fact that we received some data */ _r.intervalBytes += _r.rawBlock.fillLevel; - /* Pump all of the data through the protocol handler */ - uint8_t *c = _r.rawBlock.buffer; - - while ( _r.rawBlock.fillLevel > 0 ) + if ( PROT_OFLOW == _r.options->protocol ) + { + OFLOWPump( &_r.c, _r.rawBlock.buffer, _r.rawBlock.fillLevel, _OFLOWpacketRxed, &_r ); + } + else { - _protocolPump( &_r, *c++ ); - _r.rawBlock.fillLevel--; + /* Pump all of the data through the protocol handler */ + uint8_t *c = _r.rawBlock.buffer; + + while ( _r.rawBlock.fillLevel > 0 ) + { + _protocolPump( &_r, *c++ ); + _r.rawBlock.fillLevel--; + } } /* Check to make sure there's not an unexpected TPIU in here */ diff --git a/Src/orbtop.c b/Src/orbtop.c index 11485be8..e2473067 100644 --- a/Src/orbtop.c +++ b/Src/orbtop.c @@ -21,9 +21,9 @@ #include "generics.h" #include "uthash.h" #include "git_version_info.h" -#include "generics.h" #include "tpiuDecoder.h" #include "itmDecoder.h" +#include "oflow.h" #include "symbols.h" #include "msgSeq.h" #include "nw.h" @@ -52,6 +52,9 @@ struct reportLine struct nameEntry *n; }; +enum Prot { PROT_OFLOW, PROT_ITM, PROT_TPIU, PROT_UNKNOWN }; +const char *protString[] = {"OFLOW", "ITM", "TPIU", NULL}; + struct exceptionRecord /* Record of exception activity */ { @@ -73,10 +76,9 @@ struct exceptionRecord /* Record of exception activity */ /* ---------- CONFIGURATION ----------------- */ struct /* Record for options, either defaults or from command line */ { - bool useTPIU; /* Are we decoding via the TPIU? */ + uint32_t tag; /* Which TPIU or OFLOW stream are we decoding? */ bool reportFilenames; /* Report filenames for each routine? */ bool outputExceptions; /* Set to include exceptions in output flow */ - uint32_t tpiuITMChannel; /* What channel? */ bool forceITMSync; /* Must ITM start synced? */ char *file; /* File host connection */ @@ -99,19 +101,19 @@ struct /* Record for options, either defau int port; /* Source information */ char *server; + enum Prot protocol; /* What protocol to communicate (default to OFLOW (== orbuculum)) */ } options = { .forceITMSync = true, - .useTPIU = false, - .tpiuITMChannel = 1, + .tag = 1, .outfile = NULL, .logfile = NULL, .lineDisaggregation = false, .maxRoutines = 8, .demangle = true, .displayInterval = TOP_UPDATE_INTERVAL * 1000, - .port = NWCLIENT_SERVER_PORT, + .port = OTCLIENT_SERVER_PORT, .server = "localhost" }; @@ -123,8 +125,10 @@ struct struct ITMPacket h; struct TPIUDecoder t; struct TPIUPacket p; + struct OFLOW c; enum timeDelay timeStatus; /* Indicator of if this time is exact */ uint64_t timeStamp; /* Latest received time */ + struct Frame cobsPart; /* Any part frame that has been received */ struct SymbolSet *s; /* Symbols read from elf */ struct nameEntry *n; /* Current table of recognised names */ @@ -147,6 +151,8 @@ struct uint32_t interrupts; uint32_t sleeps; uint32_t notFound; + bool ending; /* Flag to exit */ + } _r; // ==================================================================================================== @@ -386,6 +392,12 @@ uint32_t _consolodateReport( struct reportLine **returnReport, uint32_t *returnR /* Make room for a report line */ reportLines++; report = ( struct reportLine * )realloc( report, sizeof( struct reportLine ) * ( reportLines ) ); + + if ( !report ) + { + genericsExit( -1, "Out of memory" EOL ); + } + report[reportLines - 1].n = a->n; report[reportLines - 1].count = 0; } @@ -399,6 +411,11 @@ uint32_t _consolodateReport( struct reportLine **returnReport, uint32_t *returnR /* Now fold in any sleeping entries */ report = ( struct reportLine * )realloc( report, sizeof( struct reportLine ) * ( reportLines + 1 ) ); + if ( !report ) + { + genericsExit( -1, "Out of memory" EOL ); + } + uint32_t addr = FN_SLEEPING; HASH_FIND_INT( _r.addresses, &addr, a ); @@ -739,10 +756,10 @@ static void _outputTop( uint32_t total, uint32_t reportLines, struct reportLine if ( ( _r.lastReportTicks ) && ( lastTime != _r.lastReportus ) ) genericsPrintf( "Interval = " C_DATA "%" PRIu64 "ms " C_RESET "/ "C_DATA "%" PRIu64 C_RESET " (~" C_DATA "%" PRIu64 C_RESET " Ticks/ms)" EOL, - ( ( lastTime - _r.lastReportus ) + 500 ) / 1000, _r.timeStamp - _r.lastReportTicks, ( ( _r.timeStamp - _r.lastReportTicks ) * 1000 ) / ( lastTime - _r.lastReportus ) ); + ( ( lastTime - _r.lastReportus ) ) / 1000, _r.timeStamp - _r.lastReportTicks, ( ( _r.timeStamp - _r.lastReportTicks ) * 1000 ) / ( lastTime - _r.lastReportus ) ); else { - genericsPrintf( C_RESET "Interval = " C_DATA "%" PRIu64 C_RESET "ms" EOL, ( ( lastTime - _r.lastReportus ) + 500 ) / 1000 ); + genericsPrintf( C_RESET "Interval = " C_DATA "%" PRIu64 C_RESET "ms" EOL, ( ( lastTime - _r.lastReportus ) ) / 1000 ); } genericsReport( V_INFO, " Ovf=%3d ITMSync=%3d TPIUSync=%3d ITMErrors=%3d" EOL, @@ -784,11 +801,11 @@ void _handlePCSample( struct pcSampleMsg *m, struct ITMDecoder *i ) /* This is a new entry - record it */ a = ( struct visitedAddr * )calloc( 1, sizeof( struct visitedAddr ) ); - MEMCHECK( a, ); + MEMCHECKV( a ); a->visits = 1; a->n = ( struct nameEntry * )malloc( sizeof( struct nameEntry ) ); - MEMCHECK( a->n, ) + MEMCHECKV( a->n ); memcpy( a->n, &n, sizeof( struct nameEntry ) ); HASH_ADD_INT( _r.addresses, n->addr, a ); } @@ -843,7 +860,7 @@ void _itmPumpProcess( uint8_t c ) } /* We are synced timewise, so empty anything that has been waiting */ - while ( 1 ) + while ( true ) { p = MSGSeqGetPacket( &_r.d ); @@ -873,7 +890,7 @@ void _protocolPump( uint8_t c ) /* Top level protocol pump */ { - if ( options.useTPIU ) + if ( PROT_TPIU == options.protocol ) { switch ( TPIUPump( &_r.t, c ) ) { @@ -905,7 +922,7 @@ void _protocolPump( uint8_t c ) for ( uint32_t g = 0; g < _r.p.len; g++ ) { - if ( _r.p.packet[g].s == options.tpiuITMChannel ) + if ( _r.p.packet[g].s == options.tag ) { _itmPumpProcess( _r.p.packet[g].d ); continue; @@ -952,10 +969,12 @@ void _printHelp( const char *const progName ) genericsPrintf( " -n, --itm-sync: Enforce sync requirement for ITM (i.e. ITM needs to issue syncs)" EOL ); genericsPrintf( " -o, --output-file: to be used for output live file" EOL ); genericsPrintf( " -O, --objdump-opts: Options to pass directly to objdump" EOL ); + genericsPrintf( " -p, --protocol: Protocol to communicate. Defaults to OFLOW if -s is not set, otherwise ITM unless" EOL \ + " explicitly set to TPIU to decode TPIU frames on channel set by -t" EOL ); genericsPrintf( " -r, --routines: to record in live file (default %d routines)" EOL, options.maxRoutines ); genericsPrintf( " -R, --report-files: Report filenames as part of function discriminator" EOL ); genericsPrintf( " -s, --server: : to use" EOL ); - genericsPrintf( " -t, --tpiu: Use TPIU decoder on specified channel" EOL ); + genericsPrintf( " -t, --tag: Which TPIU stream or OFLOW tag to use (normally 1)" EOL ); genericsPrintf( " -v, --verbose: Verbose mode 0(errors)..3(debug)" EOL ); genericsPrintf( " -V, --version: Print version and exit" EOL ); genericsPrintf( EOL "Environment Variables;" EOL ); @@ -986,6 +1005,7 @@ static struct option _longOptions[] = {"no-color", no_argument, NULL, 'M'}, {"output-file", required_argument, NULL, 'o'}, {"objdump-opts", required_argument, NULL, 'O'}, + {"protocol", required_argument, NULL, 'p'}, {"routines", required_argument, NULL, 'r'}, {"report-files", no_argument, NULL, 'R'}, {"server", required_argument, NULL, 's'}, @@ -999,8 +1019,10 @@ bool _processOptions( int argc, char *argv[] ) { int c, optionIndex = 0; + bool protExplicit = false; + bool serverExplicit = false; - while ( ( c = getopt_long ( argc, argv, "c:d:DEe:f:g:hVI:j:lMnO:o:r:Rs:t:v:", _longOptions, &optionIndex ) ) != -1 ) + while ( ( c = getopt_long ( argc, argv, "c:d:DEe:f:g:hVI:j:lMnO:o:p:r:Rs:t:v:", _longOptions, &optionIndex ) ) != -1 ) switch ( c ) { // ------------------------------------ @@ -1077,6 +1099,29 @@ bool _processOptions( int argc, char *argv[] ) // ------------------------------------ + case 'p': + options.protocol = PROT_UNKNOWN; + protExplicit = true; + + for ( int i = 0; protString[i]; i++ ) + { + if ( !strcmp( protString[i], optarg ) ) + { + options.protocol = i; + break; + } + } + + if ( options.protocol == PROT_UNKNOWN ) + { + genericsReport( V_ERROR, "Unrecognised protocol type" EOL ); + return false; + } + + break; + + // ------------------------------------ + case 'O': options.odoptions = optarg; break; @@ -1094,8 +1139,7 @@ bool _processOptions( int argc, char *argv[] ) // ------------------------------------ case 't': - options.useTPIU = true; - options.tpiuITMChannel = atoi( optarg ); + options.tag = atoi( optarg ); break; // ------------------------------------ @@ -1106,6 +1150,7 @@ bool _processOptions( int argc, char *argv[] ) // ------------------------------------ case 's': options.server = optarg; + serverExplicit = true; // See if we have an optional port number too char *a = optarg; @@ -1158,10 +1203,10 @@ bool _processOptions( int argc, char *argv[] ) // ------------------------------------ } - if ( ( options.useTPIU ) && ( !options.tpiuITMChannel ) ) + /* If we set an explicit server and port and didn't set a protocol chances are we want ITM, not OFLOW */ + if ( serverExplicit && !protExplicit ) { - genericsReport( V_ERROR, "TPIU set for use but no channel set for ITM output" EOL ); - return -EINVAL; + options.protocol = PROT_ITM; } if ( !options.elffile ) @@ -1189,20 +1234,51 @@ bool _processOptions( int argc, char *argv[] ) genericsReport( V_INFO, "Log File : %s" EOL, options.logfile ? options.logfile : "None" ); genericsReport( V_INFO, "Objdump options : %s" EOL, options.odoptions ? options.odoptions : "None" ); - if ( options.useTPIU ) + switch ( options.protocol ) { - genericsReport( V_INFO, "Using TPIU : true (ITM on channel %d)" EOL, options.tpiuITMChannel ); + case PROT_OFLOW: + genericsReport( V_INFO, "Decoding OFLOW (Orbuculum) with ITM in stream %d" EOL, options.tag ); + break; + + case PROT_ITM: + genericsReport( V_INFO, "Decoding ITM" EOL ); + break; + + case PROT_TPIU: + genericsReport( V_INFO, "Using TPIU with ITM in stream %d" EOL, options.tag ); + break; + + default: + genericsReport( V_INFO, "Decoding unknown" EOL ); + break; + } + + return OK; +} +// ==================================================================================================== + +static void _OFLOWpacketRxed ( struct OFLOWFrame *p, void *param ) + +{ + if ( !p->good ) + { + genericsReport( V_WARN, "Bad packet received" EOL ); } else { - genericsReport( V_INFO, "Using TPIU : false" EOL ); + if ( p->tag == options.tag ) + { + for ( int i = 0; i < p->len; i++ ) + { + _itmPumpProcess( p->d[i] ); + } + } } - - return OK; } + // ==================================================================================================== -static struct Stream *_openStream() +static struct Stream *_openStream( void ) { if ( options.file != NULL ) { @@ -1214,6 +1290,13 @@ static struct Stream *_openStream() } } +// ==================================================================================================== +static void _intHandler( int sig ) + +{ + /* CTRL-C exit is not an error... */ + _r.ending = true; +} // ==================================================================================================== // ==================================================================================================== // ==================================================================================================== @@ -1272,8 +1355,15 @@ int main( int argc, char *argv[] ) /* Reset the TPIU handler before we start */ TPIUDecoderInit( &_r.t ); ITMDecoderInit( &_r.i, options.forceITMSync ); + OFLOWInit( &_r.c ); MSGSeqInit( &_r.d, &_r.i, MSG_REORDER_BUFLEN ); + /* This ensures the signal handler gets called */ + if ( SIG_ERR == signal( SIGINT, _intHandler ) ) + { + genericsExit( -1, "Failed to establish Int handler" EOL ); + } + /* First interval will be from startup to first packet arriving */ _r.lastReportus = _timestamp(); _r.currentException = NO_EXCEPTION; @@ -1297,7 +1387,7 @@ int main( int argc, char *argv[] ) } } - while ( 1 ) + while ( !_r.ending ) { struct Stream *stream = _openStream(); @@ -1323,12 +1413,11 @@ int main( int argc, char *argv[] ) /* ...just in case we have any readings from a previous incantation */ _flushHash( ); - _r.lastReportus = _timestamp(); + thisTime = _r.lastReportus = _timestamp(); - while ( 1 ) + while ( !_r.ending ) { - thisTime = _timestamp(); - remainTime = ( ( _r.lastReportus + options.displayInterval - thisTime ) ) + 500; + remainTime = ( ( _r.lastReportus + options.displayInterval - thisTime ) ); if ( remainTime > 0 ) { @@ -1342,6 +1431,8 @@ int main( int argc, char *argv[] ) receivedSize = 0; } + thisTime = _timestamp(); + if ( receiveResult == RECEIVE_RESULT_ERROR ) { /* Something went wrong in the receive */ @@ -1388,13 +1479,25 @@ int main( int argc, char *argv[] ) genericsReport( V_WARN, "Loaded %s" EOL, options.elffile ); } - /* Pump all of the data through the protocol handler */ - uint8_t *c = cbw; - while ( receivedSize > 0 ) + + if ( receivedSize ) { - _protocolPump( *c++ ); - receivedSize--; + if ( PROT_OFLOW == options.protocol ) + { + OFLOWPump( &_r.c, cbw, receivedSize, _OFLOWpacketRxed, &_r ); + } + else + { + /* Pump all of the data through the protocol handler */ + uint8_t *c = cbw; + + while ( receivedSize > 0 ) + { + _protocolPump( *c++ ); + receivedSize--; + } + } } /* See if its time to post-process it */ @@ -1415,6 +1518,8 @@ int main( int argc, char *argv[] ) /* ... and we are done with the report now, get rid of it */ free( report ); + /* and, the hash of seen addresses! */ + _flushHash(); /* ...and zero the exception records */ for ( uint32_t e = 0; e < MAX_EXCEPTIONS; e++ ) @@ -1450,7 +1555,7 @@ int main( int argc, char *argv[] ) free( stream ); } - if ( ( !ITMDecoderGetStats( &_r.i )->tpiuSyncCount ) ) + if ( !_r.ending && ( !ITMDecoderGetStats( &_r.i )->tpiuSyncCount ) ) { genericsReport( V_ERROR, "Read failed" EOL ); } diff --git a/Src/orbtrace.c b/Src/orbtrace.c index 6d3609f0..93ebc20e 100644 --- a/Src/orbtrace.c +++ b/Src/orbtrace.c @@ -35,6 +35,8 @@ struct Options int traceWidth; /* Width to be used for communication */ bool swoMANCH; /* SWO Manchester output */ bool swoUART; /* SWO UART output */ + bool useTPIU; /* Decode TPIU on SWO */ + bool opJSON; /* Set output to JSON */ bool mono; /* Supress colour in output */ uint32_t serial_speed; /* Speed of serial communication via SWO */ @@ -141,7 +143,8 @@ static void _printHelp( const char *const progName ) genericsPrintf( " -h, --help:: This help" EOL ); genericsPrintf( " -l, --list: Show all OrbTrace devices attached to system" EOL ); genericsPrintf( " -M, --no-colour: Supress colour in output" EOL ); - genericsPrintf( " -T, --trace-format: Trace format; 1,2 or 4 bit parallel, m for Manchester SWO, u=UART SWO" EOL ); + genericsPrintf( " -T, --trace-format: Trace format; 1,2 or 4 bit parallel, m for Manchester SWO, u=UART SWO," EOL ); + genericsPrintf( " M for Manchester SWO with TPIU decode, U=UART SWO with TPIU decode" EOL ); genericsPrintf( " -n, --serial-number: any part of serial number to differentiate specific OrbTrace device" EOL ); genericsPrintf( " -p, --voltage: , Set voltage in V, Ch is vtref or vtpwr" EOL ); genericsPrintf( " -v, --verbose: Verbose mode 0(errors)..3(debug)" EOL ); @@ -312,17 +315,41 @@ static int _processOptions( struct RunTime *r, int argc, char *argv[] ) case 'T': /* Set tracewidth */ r->options->traceWidth = 0; - if ( ( *optarg == 'u' ) && ( !*( optarg + 1 ) ) ) - { - r->options->swoUART = true; - } - else if ( ( *optarg == 'm' ) && ( !*( optarg + 1 ) ) ) + if ( strlen( optarg ) != 1 ) { - r->options->swoMANCH = true; + *optarg = 0; } - else + + switch ( *optarg ) { - r->options->traceWidth = atoi( optarg ); + case 'u': + r->options->swoUART = true; + break; + + case 'm': + r->options->swoMANCH = true; + break; + + case 'U': + r->options->swoUART = true; + r->options->useTPIU = true; + break; + + case 'M': + r->options->swoMANCH = true; + r->options->useTPIU = true; + break; + + case '1': + case '2': + case '3': + case '4': + r->options->traceWidth = atoi( optarg ); + break; + + default: + genericsReport( V_ERROR, "Badly formatted tracewidth" EOL ); + return false; } _set_action( r, ACTION_SET_TRACE ); @@ -632,9 +659,9 @@ static int _performActions( struct RunTime *r ) } else if ( ( r->options->swoMANCH ) || ( r->options->swoUART ) ) { - genericsReport( V_INFO, "Setting SWO with %s encoding" EOL, r->options->swoMANCH ? "Manchester" : "UART" ); + genericsReport( V_INFO, "Setting SWO with %s encoding%s" EOL, r->options->swoMANCH ? "Manchester" : "UART", r->options->useTPIU ? " and TPIU decode" : "" ); - if ( OrbtraceIfSetTraceSWO( r->dev, r->options->swoMANCH ) ) + if ( OrbtraceIfSetTraceSWO( r->dev, r->options->swoMANCH, r->options->useTPIU ) ) { genericsReport( V_INFO, "OK" EOL ); } diff --git a/Src/orbtraceIf.c b/Src/orbtraceIf.c index a5cf6407..b98dbe0e 100644 --- a/Src/orbtraceIf.c +++ b/Src/orbtraceIf.c @@ -22,11 +22,11 @@ static const struct OrbtraceInterfaceType _validDevices[DEVICE_NUM_DEVICES] = { 0, 0 } }; -/* BMP Interface and endpoint are fixed, so we can return those on request */ -#define BMP_IFACE (5) -#define BMP_EP (0x85) +/* BMP iInterface string */ +#define BMP_IFACE "Black Magic Trace Capture" #define SCRATCH_STRINGLEN (255) +#define MAX_DESC_FIELDLEN (50) #define MIN_GENERIC_VOLTAGE_MV (900) #define MAX_GENERIC_VOLTAGE_MV (5000) @@ -46,6 +46,11 @@ static const struct OrbtraceInterfaceType _validDevices[DEVICE_NUM_DEVICES] = /* Maximum descriptor length from USB specification */ #define MAX_USB_DESC_LEN (256) +/* ORBTrace protocol versions */ +#define PROT_UNKNOWN (0x00) +#define PROT_TPIU (0x01) +#define PROT_OFLOWV1_0 (0x10) + /* String on front of version number to remove */ #define VERSION_FRONTMATTER "Version: " static const struct @@ -125,6 +130,11 @@ static int _compareFunc( const void *vd1, const void *vd2 ) const struct OrbtraceIfDevice *d2 = ( const struct OrbtraceIfDevice * )vd2; int r = 0; + if ( d1->devtype != d2->devtype ) + { + return ( d1->devtype - d2->devtype ); + } + if ( ( r = _strcmpint( d1->manufacturer, d2->manufacturer ) ) ) { return r; @@ -392,13 +402,13 @@ void OrbtraceIfListDevices( struct OrbtraceIf *o ) char printConstruct[SCRATCH_STRINGLEN]; /* Get longest line */ - genericsPrintf( C_RESET " Id | Description | Serial | Version" EOL ); - genericsPrintf( " ---+------------------------------------------+------------------+----------------------------" EOL ); + genericsPrintf( C_RESET " Id | Description | Serial | Version" EOL ); + genericsPrintf( " ---+---------------------------------------------------+------------------+----------------------------" EOL ); for ( int i = 0; i < o->numDevices; i++ ) { - snprintf( printConstruct, SCRATCH_STRINGLEN, "%s %s", OrbtraceIfGetManufacturer( o, i ), OrbtraceIfGetProduct( o, i ) ) ; - genericsPrintf( C_SEL " %2d " C_RESET "|"C_ELEMENT" %-40s "C_RESET"|"C_ELEMENT" %16s "C_RESET"|"C_ELEMENT" %s" C_RESET EOL, + snprintf( printConstruct, MAX_DESC_FIELDLEN, "%s %s", OrbtraceIfGetManufacturer( o, i ), OrbtraceIfGetProduct( o, i ) ) ; + genericsPrintf( C_SEL " %2d " C_RESET "|"C_ELEMENT" %-49s "C_RESET"|"C_ELEMENT" %16s "C_RESET"|"C_ELEMENT" %s" C_RESET EOL, i + 1, printConstruct, OrbtraceIfGetSN( o, i ), OrbtraceIfGetVersion( o, i ) ); } } @@ -449,6 +459,8 @@ bool OrbtraceIfOpenDevice( struct OrbtraceIf *o, int entry ) bool OrbtraceGetIfandEP( struct OrbtraceIf *o ) { + struct libusb_config_descriptor *config; + bool interface_found = false; uint8_t altsetting = 0; uint8_t num_altsetting = 0; int32_t err; @@ -465,8 +477,55 @@ bool OrbtraceGetIfandEP( struct OrbtraceIf *o ) return false; case DEVICE_BMP: // ----------------------------------------------------------------------------- - o->iface = BMP_IFACE; - o->ep = BMP_EP; + genericsReport( V_DEBUG, "Searching for BMP trace interface" EOL ); + + if ( ( err = libusb_get_active_config_descriptor( o->dev, &config ) ) < 0 ) + { + genericsReport( V_WARN, "Failed to get config descriptor (%d)" EOL, err ); + return false; + } + + /* Loop through the interfaces looking for ours */ + for ( int if_num = 0; if_num < config->bNumInterfaces && !interface_found; if_num++ ) + { + for ( int alt_num = 0; alt_num < config->interface[if_num].num_altsetting && !interface_found; alt_num++ ) + { + char tfrString[MAX_USB_DESC_LEN]; + const struct libusb_interface_descriptor *i = &config->interface[if_num].altsetting[alt_num]; + + int ret = libusb_get_string_descriptor_ascii( o->handle, i->iInterface, ( unsigned char * )tfrString, MAX_USB_DESC_LEN ); + + if ( ret < 0 ) + { + /* No string means not correct interface */ + continue; + } + + if ( strcmp( tfrString, BMP_IFACE ) != 0 ) + { + /* Not the interface we're looking for */ + continue; + } + + o->iface = i->bInterfaceNumber; + o->ep = i->endpoint[0].bEndpointAddress; + + altsetting = i->bAlternateSetting; + num_altsetting = config->interface[if_num].num_altsetting; + + genericsReport( V_DEBUG, "Found interface %#x with altsetting %#x and ep %#x" EOL, o->iface, altsetting, o->ep ); + interface_found = true; + } + } + + libusb_free_config_descriptor( config ); + + if ( !interface_found ) + { + genericsReport( V_DEBUG, "No supported interfaces found" EOL ); + return false; + } + break; case DEVICE_ORBTRACE_MINI: // ------------------------------------------------------------------- @@ -491,7 +550,9 @@ bool OrbtraceGetIfandEP( struct OrbtraceIf *o ) if ( i->bInterfaceClass != 0xff || i->bInterfaceSubClass != 0x54 || - ( i->bInterfaceProtocol != 0x00 && i->bInterfaceProtocol != 0x01 ) || + ( i->bInterfaceProtocol != PROT_UNKNOWN && + i->bInterfaceProtocol != PROT_TPIU && + i->bInterfaceProtocol != PROT_OFLOWV1_0 ) || i->bNumEndpoints != 0x01 ) { /* Not the interface we're looking for */ @@ -503,6 +564,7 @@ bool OrbtraceGetIfandEP( struct OrbtraceIf *o ) altsetting = i->bAlternateSetting; num_altsetting = config->interface[if_num].num_altsetting; + o->supportsOFLOW = ( i->bInterfaceProtocol == PROT_OFLOWV1_0 ); genericsReport( V_DEBUG, "Found interface %#x with altsetting %#x and ep %#x" EOL, o->iface, altsetting, o->ep ); interface_found = true; @@ -517,6 +579,7 @@ bool OrbtraceGetIfandEP( struct OrbtraceIf *o ) return false; } + o->isOrbtrace = true; break; } @@ -537,6 +600,14 @@ bool OrbtraceGetIfandEP( struct OrbtraceIf *o ) // ==================================================================================================== +bool OrbtraceIsOrbtrace( struct OrbtraceIf *o ) + +{ + return o->isOrbtrace; +} + +// ==================================================================================================== + bool OrbtraceIfSetupTransfers( struct OrbtraceIf *o, bool hiresTime, struct dataBlock *d, int numBlocks, libusb_transfer_cb_fn callback ) { @@ -559,7 +630,7 @@ bool OrbtraceIfSetupTransfers( struct OrbtraceIf *o, bool hiresTime, struct data USB_TRANSFER_SIZE, callback, &o->d[t].usbtfr, - hiresTime ? 1 : 0 /* Use timeout if hires mode */ + hiresTime ? 1 : 100 /* Use 1ms timeout if hires mode, otherwise 100ms */ ); if ( libusb_submit_transfer( o->d[t].usbtfr ) ) @@ -624,14 +695,14 @@ bool OrbtraceIfSetTraceWidth( struct OrbtraceIf *o, int width ) ); } // ==================================================================================================== -bool OrbtraceIfSetTraceSWO( struct OrbtraceIf *o, bool isMANCH ) +bool OrbtraceIfSetTraceSWO( struct OrbtraceIf *o, bool isMANCH, bool useTPIU ) { return _doInterfaceControlTransfer( o, OrbtraceIfGetTraceIF( o, OrbtraceIfGetActiveDevnum( o ) ), RQ_SET_TWIDTH, - isMANCH ? 0x10 : 0x12, + ( isMANCH ? 0x10 : 0x12 ) | ( useTPIU ? 0x01 : 0x00 ), 0, 0, NULL diff --git a/Src/orbuculum.c b/Src/orbuculum.c index bef1cdcc..1bb4563b 100644 --- a/Src/orbuculum.c +++ b/Src/orbuculum.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: BSD-3-Clause */ /* - * Orbuculum main receiver and TPIU demux - * ====================================== + * Orbuculum main receiver and TPIU/OFLOW demux + * ============================================ * */ @@ -24,7 +24,6 @@ #include #include #include -#include #include #if defined OSX #include @@ -53,17 +52,35 @@ #include "git_version_info.h" #include "generics.h" #include "tpiuDecoder.h" +#include "oflow.h" #include "nwclient.h" #include "orbtraceIf.h" #include "stream.h" -/* How many transfer buffers from the source to allocate */ -#define NUM_RAW_BLOCKS (32) - #define MAX_LINE_LEN (1024) #define ORBTRACE "orbtrace" #define ORBTRACEENVNAME "ORBTRACE" +/* Multiple blocks are used for USB, otherwise just the one */ +#define NUM_RAW_BLOCKS (32) + +/* File header for OFLOW formatted file */ +#define OFLOW_SIG (const char*)"%%ORBFLOW1.0.0%%" +#define OFLOW_SIG_LEN (strlen(OFLOW_SIG)) + +/* Number of potential tags */ +#define NUM_TAGS (256) +#define LAST_TAG_SEEN_TIME_NS (2L*1000*1000*1000) + +/* Record of transferred data per tag */ +struct TagDataCount +{ + bool hasHandler; + uint64_t ts; + uint64_t totalData; + uint64_t intervalData; +}; + /* Record for options, either defaults or from command line */ struct Options { @@ -83,17 +100,16 @@ struct Options char *otcl; /* Orbtrace command line options */ uint32_t intervalReportTime; /* If we want interval reports about performance */ bool mono; /* Supress colour in output */ - char *channelList; /* List of TPIU channels to be serviced */ + int paceDelay; /* Delay between blocks of data transmission in file readout */ + char *channelList; /* List of channels to be exported over legacy connection */ bool hiresTime; /* Use hiresolution time (shorter timeouts...more accurate but higher load */ char *sn; /* Any part serial number for identifying a specific device */ - /* Network link */ int listenPort; /* Listening port for network */ }; struct handlers { int channel; /* Channel number for this handler */ - uint64_t intervalBytes; /* Number of depacketised bytes output on this channel */ struct dataBlock *strippedBlock; /* Processed buffers for output to clients */ struct nwclientsHandle *n; /* Link to the network client subsystem */ }; @@ -101,15 +117,13 @@ struct handlers struct RunTime { struct TPIUDecoder t; /* TPIU decoder instance, in case we need it */ + struct OFLOW oflow; /* OFLOW instance, in case we need it */ + struct OrbtraceIf *o; /* For accessing ORBTrace devices + BMPs */ - uint64_t intervalBytes; /* Number of bytes transferred in current interval */ + uint64_t intervalRawBytes; /* Number of bytes transferred in current interval */ + uint64_t lastInterval; /* Timestamp of previous interval */ - pthread_t intervalThread; /* Thread reporting on intervals */ - pthread_t processThread; /* Thread for processing prior to distributing to clients */ - pthread_t usbThread; /* Thread for usb thread (this sometimes dies, so needs restarting) */ - pthread_cond_t dataForClients; /* Semaphore counting data for clients */ - pthread_mutex_t dataForClients_m; /* Mutex for counting data for clients */ bool ending; /* Flag indicating app is terminating */ bool errored; /* Flag indicating problem in reception process */ bool conn; /* Flag indicating that we have a good connection */ @@ -119,13 +133,14 @@ struct RunTime int opFileHandle; /* Handle if we're writing orb output locally */ struct Options *options; /* Command line options (reference to above) */ - int wp; /* Read and write pointers into transfer buffers */ - int rp; struct dataBlock rawBlock[NUM_RAW_BLOCKS]; /* Transfer buffers from the receiver */ + struct nwclientsHandle *oflowHandler; /* Handle to OFLOW output handler */ + bool usingOFLOW; /* Flag that OFLOW protocol is in use from the source */ + + struct TagDataCount tagCount[NUM_TAGS]; /* Data carried per tag/TPIU channel */ int numHandlers; /* Number of TPIU channel handlers in use */ struct handlers *handler; - struct nwclientsHandle *n; /* Link to the network client subsystem (used for non-TPIU case) */ char *sn; /* Serial number for any device we've established contact with */ }; @@ -137,19 +152,18 @@ struct RunTime #define NWSERVER_HOST "localhost" /* Address to connect to NW Server */ #define NWSERVER_PORT (2332) -#define NUM_TPIU_CHANNELS 0x80 +#define NUM_OFLOW_CHANNELS 0x7F #define INTERVAL_100US (100U) #define INTERVAL_1MS (10*INTERVAL_100US) #define INTERVAL_100MS (100*INTERVAL_1MS) #define INTERVAL_1S (10*INTERVAL_100MS) -//#define DUMP_BLOCK - struct Options _options = { - .listenPort = NWCLIENT_SERVER_PORT, + .listenPort = OTCLIENT_SERVER_PORT, .nwserverHost = NWSERVER_HOST, + .channelList = "1", }; struct RunTime _r; @@ -315,10 +329,6 @@ static void _doExit( void ) { _r.ending = true; - nwclientShutdown( _r.n ); - /* Give them a bit of time, then we're leaving anyway */ - usleep( INTERVAL_100MS ); - if ( _r.opFileHandle ) { close( _r.opFileHandle ); @@ -336,7 +346,7 @@ static void _intHandler( int sig ) _doExit(); } // ==================================================================================================== -void _printHelp( const char *const progName ) +void _printHelp( const char *const progName, struct RunTime *r ) { genericsPrintf( "Usage: %s [options]" EOL, progName ); @@ -345,24 +355,41 @@ void _printHelp( const char *const progName ) genericsPrintf( " -f, --input-file: Take input from specified file" EOL ); genericsPrintf( " -h, --help: This help" EOL ); genericsPrintf( " -H, --hires: High resolution time (much higher CPU load though!)" EOL ); - genericsPrintf( " -l, --listen-port: Listen port for the incoming connections (defaults to %d)" EOL, NWCLIENT_SERVER_PORT ); - genericsPrintf( " -m, --monitor: Output monitor information about the link at ms" EOL ); + genericsPrintf( " -l, --listen-port: Listen port for incoming ORBFLOW connections (defaults to %d)" EOL, r->options->listenPort ); + genericsPrintf( " -m, --monitor: Output monitor information about the link at ms, min 100ms" EOL ); genericsPrintf( " -M, --no-colour: Supress colour in output" EOL ); - genericsPrintf( " -n, --serial-number: any part of serial number to differentiate specific OrbTrace device" EOL ); + genericsPrintf( " -n, --serial-number: any part of serial number to differentiate specific device" EOL ); genericsPrintf( " -o, --output-file: to be used for dump file" EOL ); - genericsPrintf( " -O, --orbtrace: \"\" run orbtrace with specified options on each new ORBTrace device connect" EOL ); + genericsPrintf( " -O, --orbtrace: \"\" run orbtrace with specified options on device connect" EOL ); genericsPrintf( " -p, --serial-port: to use" EOL ); + genericsPrintf( " -P, --pace: delay in block of data transmission to clients" EOL ); genericsPrintf( " -s, --server: : to use" EOL ); - genericsPrintf( " -t, --tpiu: Use TPIU channels (and strip TPIU framing from output flows)" EOL ); + genericsPrintf( " -T, --tpiu: Strip TPIU framing from input flows (mostly not relevant)" EOL ); + genericsPrintf( " -t, --tag: TPIU streams to decode and onward route (Default %s)" EOL, r->options->channelList ); genericsPrintf( " -v, --verbose: Verbose mode 0(errors)..3(debug)" EOL ); - genericsPrintf( " -V, --version: Print version and exit" EOL ); + genericsPrintf( " -V, --version: Print version, connected usb devices, and exit" EOL ); } // ==================================================================================================== -void _printVersion( void ) +void _printVersion( struct RunTime *r ) { - genericsPrintf( "orbuculum version " GIT_DESCRIBE ); + genericsPrintf( "orbuculum version " GIT_DESCRIBE EOL ); + r->o = OrbtraceIfCreateContext(); + int ndevices = OrbtraceIfGetDeviceList( r->o, NULL, DEVTYPE( DEVICE_ORBTRACE_MINI ) | DEVTYPE( DEVICE_BMP ) ); + + if ( !ndevices ) + { + genericsPrintf( "No devices found" EOL ); + } + else + { + genericsPrintf( "Device%s Found;" EOL, ( ndevices > 1 ) ? "s" : "" ); + OrbtraceIfListDevices( r->o ); + } + + OrbtraceIfDestroyContext( r->o ); + r->o = NULL; } // ==================================================================================================== static struct option _longOptions[] = @@ -380,8 +407,10 @@ static struct option _longOptions[] = {"output-file", required_argument, NULL, 'o'}, {"orbtrace", required_argument, NULL, 'O'}, {"serial-port", required_argument, NULL, 'p'}, + {"pace", required_argument, NULL, 'P'}, {"server", required_argument, NULL, 's'}, - {"tpiu", required_argument, NULL, 't'}, + {"tpiu", required_argument, NULL, 'T'}, + {"tag", required_argument, NULL, 't'}, {"verbose", required_argument, NULL, 'v'}, {"version", no_argument, NULL, 'V'}, {NULL, no_argument, NULL, 0} @@ -393,13 +422,20 @@ bool _processOptions( int argc, char *argv[], struct RunTime *r ) int c, optionIndex = 0; #define DELIMITER ',' - while ( ( c = getopt_long ( argc, argv, "a:Ef:hHVl:m:Mn:o:O:p:s:t:v:", _longOptions, &optionIndex ) ) != -1 ) + while ( ( c = getopt_long ( argc, argv, "a:Ef:hHVl:m:Mn:o:O:p:P:s:Tt:v:", _longOptions, &optionIndex ) ) != -1 ) switch ( c ) { // ------------------------------------ case 'a': r->options->speed = atoi( optarg ); r->options->dataSpeed = r->options->speed; + + if ( r->options->speed <= 0 ) + { + genericsReport( V_ERROR, "Speed out of range" EOL ); + return false; + } + break; // ------------------------------------ @@ -415,7 +451,7 @@ bool _processOptions( int argc, char *argv[], struct RunTime *r ) // ------------------------------------ case 'h': - _printHelp( argv[0] ); + _printHelp( argv[0], r ); return false; // ------------------------------------ @@ -424,20 +460,35 @@ bool _processOptions( int argc, char *argv[], struct RunTime *r ) break; // ------------------------------------ + case 'V': - _printVersion(); + _printVersion( r ); return false; // ------------------------------------ case 'l': r->options->listenPort = atoi( optarg ); + + if ( ( r->options->listenPort <= 0 ) || ( r->options->listenPort > 0xffff ) ) + { + genericsReport( V_ERROR, "Port to listen on is out of range" EOL ); + return false; + } + break; // ------------------------------------ case 'm': r->options->intervalReportTime = atoi( optarg ); + + if ( r->options->intervalReportTime < 100 ) + { + genericsReport( V_ERROR, "intervalReportTime is out of range" EOL ); + return false; + } + break; // ------------------------------------ @@ -472,6 +523,19 @@ bool _processOptions( int argc, char *argv[], struct RunTime *r ) // ------------------------------------ + case 'P': + r->options->paceDelay = atoi( optarg ); + + if ( r->options->paceDelay <= 0 ) + { + genericsReport( V_ERROR, "paceDelay is out of range" EOL ); + return false; + } + + break; + + // ------------------------------------ + case 's': r->options->nwserverHost = optarg; @@ -497,8 +561,12 @@ bool _processOptions( int argc, char *argv[], struct RunTime *r ) break; // ------------------------------------ - case 't': + case 'T': r->options->useTPIU = true; + break; + + // ------------------------------------ + case 't': r->options->channelList = optarg; break; @@ -510,7 +578,12 @@ bool _processOptions( int argc, char *argv[], struct RunTime *r ) return false; } - genericsSetReportLevel( atoi( optarg ) ); + if ( !genericsSetReportLevel( atoi( optarg ) ) ) + { + genericsReport( V_ERROR, "Verbosity out of range" EOL ); + return false; + } + break; // ------------------------------------ @@ -537,6 +610,12 @@ bool _processOptions( int argc, char *argv[], struct RunTime *r ) /* ... and dump the config if we're being verbose */ genericsReport( V_INFO, "orbuculum version " GIT_DESCRIBE EOL ); + if ( r->options->port ) + { + /* For the base of a UART only 8 of 10 bits contain useful data */ + r->options->dataSpeed = ( r->options->dataSpeed * 8 ) / 10; + } + if ( r->options->intervalReportTime ) { genericsReport( V_INFO, "Report Intv : %d mS" EOL, r->options->intervalReportTime ); @@ -554,7 +633,7 @@ bool _processOptions( int argc, char *argv[], struct RunTime *r ) if ( r->options->sn ) { - genericsReport( V_INFO, "Serial Nummber : %s" EOL, r->options->sn ); + genericsReport( V_INFO, "Serial Number : %s" EOL, r->options->sn ); } if ( r->options->dataSpeed ) @@ -569,30 +648,22 @@ bool _processOptions( int argc, char *argv[], struct RunTime *r ) if ( r->options->nwserverPort ) { - genericsReport( V_INFO, "NW SERVER H&P : %s:%d" EOL, r->options->nwserverHost, r->options->nwserverPort ); + genericsReport( V_INFO, "NW Server : %s:%d" EOL, r->options->nwserverHost, r->options->nwserverPort ); } - if ( r->options->useTPIU ) - { - genericsReport( V_INFO, "Use/Strip TPIU : True (Channel List %s)" EOL, r->options->channelList ); - } - else - { - genericsReport( V_INFO, "Use/Strip TPIU : False" EOL ); - } + genericsReport( V_INFO, "Use/Strip TPIU : %s" EOL, r->options->useTPIU ? "True" : "False" ); + genericsReport( V_INFO, "Decode/Forward : %s" EOL, r->options->channelList ? r->options->channelList : "None" ); if ( r->options->otcl ) { genericsReport( V_INFO, "Orbtrace CL : %s" EOL, r->options->otcl ); } - if ( r->options->hiresTime ) - { - genericsReport( V_INFO, "High Res Time" EOL ); - } + genericsReport( V_INFO, "OFLOW Port : %d" EOL, r->options->listenPort ); if ( r->options->file ) { + genericsReport( V_INFO, "Pace Delay : %dus" EOL, r->options->paceDelay ); genericsReport( V_INFO, "Input File : %s", r->options->file ); if ( r->options->fileTerminate ) @@ -605,12 +676,23 @@ bool _processOptions( int argc, char *argv[], struct RunTime *r ) } } + if ( r->options->hiresTime ) + { + genericsReport( V_INFO, "High Res Time" EOL ); + } + if ( ( r->options->file ) && ( ( r->options->port ) || ( r->options->nwserverPort ) ) ) { genericsReport( V_ERROR, "Cannot specify file and port or NW Server at same time" EOL ); return false; } + if ( ( r->options->paceDelay ) && ( !r->options->file ) ) + { + genericsReport( V_ERROR, "Pace Delay only makes sense when input is from a file" EOL ); + return false; + } + if ( ( r->options->port ) && ( r->options->nwserverPort ) ) { genericsReport( V_ERROR, "Cannot specify port and NW Server at same time" EOL ); @@ -620,96 +702,131 @@ bool _processOptions( int argc, char *argv[], struct RunTime *r ) return true; } // ==================================================================================================== -void *_checkInterval( void *params ) +void _checkInterval( void *params ) /* Perform any interval reporting that may be needed */ { struct RunTime *r = ( struct RunTime * )params; + struct timespec ts; + uint64_t tnow; uint64_t snapInterval; - struct handlers *h; + int w; - while ( !r->ending ) + if ( r->options->intervalReportTime ) { - usleep( r->options->intervalReportTime * INTERVAL_1MS ); - - /* Grab the interval and scale to 1 second */ - snapInterval = r->intervalBytes * 1000 / r->options->intervalReportTime; - - snapInterval *= 8; + clock_gettime( CLOCK_REALTIME, &ts ); + tnow = ts.tv_sec * 1000000000L + ts.tv_nsec; - if ( r->conn ) + if ( tnow - r->lastInterval >= r->options->intervalReportTime * 1000000L ) { - genericsPrintf( C_PREV_LN C_CLR_LN C_DATA ); + r->lastInterval = tnow; - if ( snapInterval / 1000000 ) - { - genericsPrintf( "%4d.%d " C_RESET "MBits/sec ", snapInterval / 1000000, ( snapInterval * 1 / 100000 ) % 10 ); - } - else if ( snapInterval / 1000 ) - { - genericsPrintf( "%4d.%d " C_RESET "KBits/sec ", snapInterval / 1000, ( snapInterval / 100 ) % 10 ); - } - else + /* Grab the interval and scale to bits per 1 second */ + snapInterval = r->intervalRawBytes * 8000L / r->options->intervalReportTime; + + if ( r->conn ) { - genericsPrintf( " %4d " C_RESET " Bits/sec ", snapInterval ); - } + genericsPrintf( C_PREV_LN C_DATA ); + + if ( snapInterval / 1000000 ) + { + genericsPrintf( "%4d.%d " C_RESET "MBits/sec ", snapInterval / 1000000, ( snapInterval * 1 / 100000 ) % 10 ); + } + else if ( snapInterval / 1000 ) + { + genericsPrintf( "%4d.%d " C_RESET "KBits/sec ", snapInterval / 1000, ( snapInterval / 100 ) % 10 ); + } + else + { + genericsPrintf( " %4d " C_RESET " Bits/sec ", snapInterval ); + } - h = r->handler; - uint64_t totalDat = 0; + uint64_t totalPct = 0; - if ( ( r->intervalBytes ) && ( r->options->useTPIU ) ) - { - for ( int chIndex = 0; chIndex < r->numHandlers; chIndex++ ) + if ( r->intervalRawBytes ) { - genericsPrintf( " %d:%3d%% ", h->channel, ( h->intervalBytes * 100 ) / r->intervalBytes ); - totalDat += h->intervalBytes; - /* TODO: This needs a mutex */ - h->intervalBytes = 0; + for ( int i = 0; i < NUM_TAGS; i++ ) + { + w = 0; - h++; - } + if ( r->tagCount[i].intervalData ) + { + w = ( r->tagCount[i].intervalData * 1000 ) / r->intervalRawBytes; + r->tagCount[i].ts = tnow; + totalPct += w; + } - genericsPrintf( " Waste:%3d%% ", 100 - ( ( totalDat * 100 ) / r->intervalBytes ) ); - } + if ( tnow - r->tagCount[i].ts < LAST_TAG_SEEN_TIME_NS ) + { + if ( ( !r->tagCount[i].hasHandler ) && r->options->useTPIU ) + { + genericsPrintf( C_NOCHAN" [%d:" "%3d%%] " C_RESET, i, w / 10 ); + } + else + { + genericsPrintf( " %d:" C_DATA"%3d%% " C_RESET, i, w / 10 ); + } + } - r->intervalBytes = 0; + r->tagCount[i].intervalData = 0; + } - if ( r->options->dataSpeed > 100 ) - { - /* Conversion to percentage done as a division to avoid overflow */ - uint32_t fullPercent = ( snapInterval * 100 ) / r->options->dataSpeed; - genericsPrintf( "(" C_DATA " %3d%% " C_RESET "full)", ( fullPercent > 100 ) ? 100 : fullPercent ); + w = ( totalPct < 1000 ) ? 1000 - totalPct : 0; + genericsPrintf( " Waste:" C_DATA "%2d.%01d%% " C_RESET, w / 10, w % 10 ); + } + + if ( r->options->dataSpeed > 100 ) + { + /* Conversion to percentage done as a division to avoid overflow */ + uint32_t fullPercent = ( snapInterval * 100 ) / r->options->dataSpeed; + genericsPrintf( "(" C_DATA " %3d%% " C_RESET "full)", ( fullPercent > 100 ) ? 100 : fullPercent ); + } + + genericsPrintf( " " C_RESET C_CLR_LN EOL ); } - genericsPrintf( C_RESET EOL ); + r->intervalRawBytes = 0; } } - - return NULL; } // ==================================================================================================== -static void _purgeBlock( struct RunTime *r ) +// Block decoders and handlers for the various line formats +// ==================================================================================================== +static void _purgeBlock( struct RunTime *r, bool createOFLOW ) + +/* Send any packets to clients who want it, no matter where they originate from */ { - /* Now send any packets to clients who want it */ + struct Frame oflowOtg; + struct handlers *h = r->handler; + int i = r->numHandlers; - if ( r->options->useTPIU ) + while ( i-- ) { - struct handlers *h = r->handler; - int i = r->numHandlers; - - while ( i-- ) + if ( h->strippedBlock->fillLevel ) { - if ( h->strippedBlock->fillLevel ) + nwclientSend( h->n, h->strippedBlock->fillLevel, h->strippedBlock->buffer ); + + if ( createOFLOW ) { - nwclientSend( h->n, h->strippedBlock->fillLevel, h->strippedBlock->buffer ); - h->intervalBytes += h->strippedBlock->fillLevel; - h->strippedBlock->fillLevel = 0; + /* The OFLOW encoded version goes out on the combined OFLOW channel, with a specific channel header */ + int j = h->strippedBlock->fillLevel; + const uint8_t *b = h->strippedBlock->buffer; + + while ( j ) + { + OFLOWEncode( h->channel, 0, b, ( j < OFLOW_MAX_PACKET_LEN ) ? j : OFLOW_MAX_PACKET_LEN, &oflowOtg ); + nwclientSend( _r.oflowHandler, oflowOtg.len, oflowOtg.d ); + b += ( j < OFLOW_MAX_PACKET_LEN ) ? j : OFLOW_MAX_PACKET_LEN; + j -= ( j < OFLOW_MAX_PACKET_LEN ) ? j : OFLOW_MAX_PACKET_LEN; + } } - h++; + h->strippedBlock->fillLevel = 0; } + + h++; } } // ==================================================================================================== @@ -750,11 +867,18 @@ static void _TPIUpacketRxed( enum TPIUPumpEvent e, struct TPIUPacket *p, void *p } } + r->tagCount[p->packet[g].s].totalData++; + r->tagCount[p->packet[g].s].intervalData++; + if ( ( chIndex != r->numHandlers ) && ( h ) ) { /* We must have found a match for this at some point, so add it to the queue */ h->strippedBlock->buffer[h->strippedBlock->fillLevel++] = p->packet[g].d; } + else + { + genericsReport( V_DEBUG, "No handler for tag %d" EOL, p->packet[g].s ); + } } break; @@ -772,136 +896,162 @@ static void _TPIUpacketRxed( enum TPIUPumpEvent e, struct TPIUPacket *p, void *p break; } } - // ==================================================================================================== -static void _processBlock( struct RunTime *r, ssize_t fillLevel, uint8_t *buffer ) + +static void _OFLOWpacketRxed( struct OFLOWFrame *p, void *param ) + +/* OFLOW packet received, account for it and reflect it to legacy buffers if needed */ { - genericsReport( V_DEBUG, "RXED Packet of %d bytes%s" EOL, fillLevel, ( r->options->intervalReportTime ) ? EOL : "" ); + int chIndex; + struct RunTime *r = ( struct RunTime * )param; + struct handlers *h = _r.handler; - if ( fillLevel ) + if ( !p->good ) + { + genericsReport( V_WARN, "Bad packet received" EOL ); + } + else if ( ( r->options->useTPIU ) && ( h->channel == DEFAULT_ITM_STREAM ) ) + { + /* Deal with the bizzare combination of OFLOW and TPIU in channel 1 */ + /* Accounting will be done in TPIUPump2 */ + TPIUPump2( &r->t, p->d, p->len, _TPIUpacketRxed, r ); + } + else { /* Account for this reception */ - r->intervalBytes += fillLevel; - -#ifdef DUMP_BLOCK - uint8_t *c = buffer; - uint32_t y = fillLevel; + r->tagCount[p->tag].totalData += p->len; + r->tagCount[p->tag].intervalData += p->len; - genericsPrintf( EOL ); - - while ( y-- ) + /* Search for channel */ + for ( chIndex = 0; chIndex < r->numHandlers; chIndex++ ) { - genericsPrintf( "%02X ", *c++ ); - - if ( !( y % 16 ) ) + if ( h->channel == p->tag ) { - genericsPrinttf( EOL ); + break; } - } -#endif + h++; + } - if ( r->opFileHandle ) + if ( ( chIndex != r->numHandlers ) && ( h ) ) { - if ( write( r->opFileHandle, buffer, fillLevel ) < 0 ) + /* We must have found a match for this at some point, so add it to the queue */ + for ( int i = 0; i < p->len; i++ ) { - genericsExit( -3, "Writing to file failed" EOL ); - } - } + h->strippedBlock->buffer[h->strippedBlock->fillLevel++] = p->d[i]; - if ( r-> options->useTPIU ) - { - /* Strip the TPIU framing from this input */ - TPIUPump2( &r->t, r->rawBlock[r->rp].buffer, r->rawBlock[r->rp].fillLevel, _TPIUpacketRxed, r ); - _purgeBlock( r ); - } - else - { - /* Do it the old fashioned way and send out the unfettered block */ - nwclientSend( _r.n, r->rawBlock[r->rp].fillLevel, r->rawBlock[r->rp].buffer ); + if ( h->strippedBlock->fillLevel == sizeof( h->strippedBlock->buffer ) ) + { + /* We filled this block...better send it right now */ + nwclientSend( h->n, h->strippedBlock->fillLevel, h->strippedBlock->buffer ); + h->strippedBlock->fillLevel = 0; + } + } } } } // ==================================================================================================== -static void *_processBlocksQueue( void *params ) -/* Generic block processor task for received data */ +static void _processNonOFLOWBlock( struct RunTime *r, ssize_t fillLevel, uint8_t *buffer ) + +/* Not an OFLOW block, so might be TPIU or clean ITM...deal with both */ { - struct RunTime *r = ( struct RunTime * )params; + struct Frame oflowOtg; - while ( !r->ending ) + if ( fillLevel ) { - pthread_cond_wait( &r->dataForClients, &r->dataForClients_m ); - - if ( r->rp != r->wp ) + if ( r-> options->useTPIU ) { - _processBlock( r, r->rawBlock[r->rp].fillLevel, r->rawBlock[r->rp].buffer ); - r->rp = ( r->rp + 1 ) % NUM_RAW_BLOCKS; + /* Strip the TPIU framing from this input */ + TPIUPump2( &r->t, buffer, fillLevel, _TPIUpacketRxed, r ); } - } + else + { + /* Not TPIU ... need to assume this is ITM on the first channel..and assume it's present */ + r->tagCount[DEFAULT_ITM_STREAM].totalData += fillLevel; + r->tagCount[DEFAULT_ITM_STREAM].intervalData += fillLevel; - return NULL; -} + if ( r->handler ) + { + nwclientSend( r->handler->n, fillLevel, buffer ); + } -// ==================================================================================================== -static void _dataAvailable( struct RunTime *r ) + /* The OFLOW encoded version goes out on the default OFLOW channel */ + uint8_t *b = buffer; -{ - pthread_cond_signal( &r->dataForClients ); + while ( fillLevel ) + { + OFLOWEncode( DEFAULT_ITM_STREAM, 0, b, + ( fillLevel < OFLOW_MAX_PACKET_LEN ) ? fillLevel : OFLOW_MAX_PACKET_LEN, + &oflowOtg ); + nwclientSend( r->oflowHandler, oflowOtg.len, oflowOtg.d ); + b += ( fillLevel < OFLOW_MAX_PACKET_LEN ) ? fillLevel : OFLOW_MAX_PACKET_LEN; + fillLevel -= ( fillLevel < OFLOW_MAX_PACKET_LEN ) ? fillLevel : OFLOW_MAX_PACKET_LEN; + } + } + } } // ==================================================================================================== -static void _usb_callback( struct libusb_transfer *t ) +static void _handleBlock( struct RunTime *r, ssize_t fillLevel, uint8_t *buffer ) -/* For the USB case the ringbuffer isn't used .. packets are sent directly from this callback */ +/* Handle an incoming block from any source in either 'conventional' or orbflow format */ { - /* Whatever the status that comes back, there may be data... */ - if ( t->actual_length > 0 ) + if ( fillLevel ) { - _r.intervalBytes += t->actual_length; + genericsReport( V_DEBUG, "RXED Packet of %d bytes%s" EOL, fillLevel, ( r->options->intervalReportTime ) ? EOL : "" ); - if ( _r.opFileHandle ) + if ( r->opFileHandle ) { - if ( write( _r.opFileHandle, t->buffer, t->actual_length ) < 0 ) + if ( write( r->opFileHandle, buffer, fillLevel ) <= 0 ) { - genericsExit( -4, "Writing to file failed (%s)" EOL, strerror( errno ) ); + genericsExit( -3, "Writing to file failed" EOL ); } } -#ifdef DUMP_BLOCK - uint8_t *c = t->buffer; - uint32_t y = t->actual_length; - - genericsPrintf( stderr, EOL ); - - while ( y-- ) + if ( r->usingOFLOW ) { - genericsPrintf( stderr, "%02X ", *c++ ); - - if ( !( y % 16 ) ) + if ( r->options->intervalReportTime ) { - genericsPrintf( stderr, EOL ); + /* We need to decode this so we can get the stats out of it .. we don't bother if we don't need stats */ + OFLOWPump( &r->oflow, buffer, fillLevel, _OFLOWpacketRxed, r ); } - } - -#endif - if ( _r.options->useTPIU ) - { - /* Strip the TPIU framing from this input */ - TPIUPump2( &_r.t, t->buffer, t->actual_length, _TPIUpacketRxed, &_r ); - _purgeBlock( &_r ); + /* ...and reflect this packet to the outgoing OFLOW channels, if we don't need to reconstruct them */ + if ( !r->options->useTPIU ) + { + nwclientSend( r->oflowHandler, fillLevel, buffer ); + } } else { - /* Do it the old fashioned way and send out the unfettered block */ - nwclientSend( _r.n, t->actual_length, t->buffer ); + _processNonOFLOWBlock( r, fillLevel, buffer ); } + + r->intervalRawBytes += fillLevel; + + /* Send the block to clients, but only send OFLOW if it wasn't OFLOW already */ + /* or if we're decoding TPIU in the default tag */ + _purgeBlock( r, ( !r->usingOFLOW ) || r->options->useTPIU ); } + _checkInterval( r ); +} + +// ==================================================================================================== +// Generic handlers for each of the source types. These all call _handleBlock above to process. +// ==================================================================================================== +static void _usb_callback( struct libusb_transfer *t ) + +/* For the USB case the ringbuffer isn't used .. packets are sent directly from this callback */ + +{ + /* Whatever the status that comes back, there may be data... */ + _handleBlock( &_r, t->actual_length, t->buffer ); + if ( ( t->status != LIBUSB_TRANSFER_COMPLETED ) && ( t->status != LIBUSB_TRANSFER_TIMED_OUT ) && ( t->status != LIBUSB_TRANSFER_CANCELLED ) @@ -922,10 +1072,13 @@ static void _usb_callback( struct libusb_transfer *t ) } } } + // ==================================================================================================== void _actionOrbtraceCommand( struct RunTime *r, char *sn, enum ORBTraceDevice d ) +/* There is an orbtrace command line to be executed as part of the probe connect process */ + { char commandLine[MAX_LINE_LEN]; @@ -961,7 +1114,10 @@ void _actionOrbtraceCommand( struct RunTime *r, char *sn, enum ORBTraceDevice d // ==================================================================================================== static int _usbFeeder( struct RunTime *r ) +/* Setup USB transfers from an ORBTrace or BMP */ + { + bool firstRunThrough = true; int workingDev; /* Copy any part serial number across */ @@ -1010,6 +1166,33 @@ static int _usbFeeder( struct RunTime *r ) break; } + r->usingOFLOW = OrbtraceSupportsOFLOW( r->o ); + + if ( r->usingOFLOW ) + { + genericsReport( V_INFO, "Orbtrace supports ORBFLOW protocol" EOL ); + + if ( r->options->useTPIU ) + { + genericsReport( V_WARN, "TPIU decoding specified, but ORBTrace supports ORBFLOW, are you sure?" EOL ); + } + + if ( firstRunThrough && _r.opFileHandle ) + { + if ( write( _r.opFileHandle, OFLOW_SIG, OFLOW_SIG_LEN ) < 0 ) + { + genericsExit( -4, "Could not write OFLOW signature to file (%s)" EOL, strerror( errno ) ); + } + } + + /* We only attempt to write the file header on the first run through */ + firstRunThrough = false; + } + else + { + genericsReport( V_INFO, "Orbtrace supports legacy protocol" EOL ); + } + genericsReport( V_DEBUG, "USB Interface claimed, ready for data" EOL ); /* Create the USB transfer blocks .. if we are connected depends on if there was an error submitting the requests */ @@ -1024,6 +1207,7 @@ static int _usbFeeder( struct RunTime *r ) { genericsReport( V_ERROR, "Error waiting for USB requests to complete %d" EOL, ret ); } + } /* ========================================================================================= */ @@ -1044,8 +1228,14 @@ static int _usbFeeder( struct RunTime *r ) return 0; } // ==================================================================================================== + static int _nwserverFeeder( struct RunTime *r ) + +/* Setup network based transfers (typically used for things like J-Link but can also be a legacy orbuculum session */ + { + struct dataBlock *rxBlock = &r->rawBlock[0]; + while ( true ) { struct Stream *stream = streamCreateSocket( r->options->nwserverHost, r->options->nwserverPort ); @@ -1061,19 +1251,16 @@ static int _nwserverFeeder( struct RunTime *r ) while ( !r->ending ) { - struct dataBlock *rxBlock = &r->rawBlock[r->wp]; - - size_t receivedSize; - enum ReceiveResult result = stream->receive( stream, rxBlock->buffer, USB_TRANSFER_SIZE, NULL, &receivedSize ); + size_t fl; + enum ReceiveResult result = stream->receive( stream, rxBlock->buffer, USB_TRANSFER_SIZE, NULL, &fl ); + rxBlock->fillLevel = fl; if ( result != RECEIVE_RESULT_OK ) { break; } - rxBlock->fillLevel = receivedSize; - r->wp = ( r->wp + 1 ) % NUM_RAW_BLOCKS; - _dataAvailable( r ); + _handleBlock( r, rxBlock->fillLevel, rxBlock->buffer ); } if ( !r->ending ) @@ -1141,7 +1328,7 @@ static int _serialFeeder( struct RunTime *r ) continue; } - struct dataBlock *rxBlock = &r->rawBlock[r->wp]; + struct dataBlock *rxBlock = &r->rawBlock[0]; DWORD transferSize = stats.cbInQue; @@ -1150,18 +1337,14 @@ static int _serialFeeder( struct RunTime *r ) transferSize = USB_TRANSFER_SIZE; } - DWORD readBytes = 0; - ReadFile( portHandle, rxBlock->buffer, transferSize, &readBytes, NULL ); - - rxBlock->fillLevel = readBytes; + ReadFile( portHandle, rxBlock->buffer, transferSize, &rxBlock->fillLevel, NULL ); if ( rxBlock->fillLevel <= 0 ) { break; } - r->wp = ( r->wp + 1 ) % NUM_RAW_BLOCKS; - _dataAvailable( r ); + _handleBlock( r, rxBlock->fillLevel, rxBlock->buffer ); } r->conn = false; @@ -1183,8 +1366,12 @@ static int _serialFeeder( struct RunTime *r ) // ========================================================================================================= static int _serialFeeder( struct RunTime *r ) + +/* Setup incoming feed from a serial port */ + { int ret; + struct dataBlock *rxBlock = &r->rawBlock[0]; while ( !r->ending ) { @@ -1228,15 +1415,12 @@ static int _serialFeeder( struct RunTime *r ) while ( !r->ending ) { - struct dataBlock *rxBlock = &r->rawBlock[r->wp]; - if ( ( rxBlock->fillLevel = read( r->f, rxBlock->buffer, USB_TRANSFER_SIZE ) ) <= 0 ) { break; } - r->wp = ( r->wp + 1 ) % NUM_RAW_BLOCKS; - _dataAvailable( r ); + _handleBlock( r, rxBlock->fillLevel, rxBlock->buffer ); } r->conn = false; @@ -1256,7 +1440,12 @@ static int _serialFeeder( struct RunTime *r ) // ==================================================================================================== static int _fileFeeder( struct RunTime *r ) +/* Setup incoming data stream from a file in either legacy or OFLOW format */ + { + struct dataBlock *rxBlock = &r->rawBlock[0]; + + if ( ( r->f = open( r->options->file, O_RDONLY ) ) < 0 ) { genericsExit( -4, "Can't open file %s" EOL, r->options->file ); @@ -1264,11 +1453,19 @@ static int _fileFeeder( struct RunTime *r ) r->conn = true; - while ( !r->ending ) + /* Start off by checking if this is OFLOW formatted */ + rxBlock->fillLevel = read( r->f, rxBlock->buffer, OFLOW_SIG_LEN ); + r->usingOFLOW = ( ( OFLOW_SIG_LEN == rxBlock->fillLevel ) && ( !strncmp( OFLOW_SIG, ( char * )rxBlock->buffer, OFLOW_SIG_LEN ) ) ); + genericsReport( V_INFO, "File is %sin OFLOW format" EOL, ( r->usingOFLOW ) ? "" : "not " ); + + if ( r->usingOFLOW ) { - struct dataBlock *rxBlock = &r->rawBlock[r->wp]; + /* This is OFLOW, so we need to read the first data after the header */ rxBlock->fillLevel = read( r->f, rxBlock->buffer, USB_TRANSFER_SIZE ); + } + while ( !r->ending ) + { if ( !rxBlock->fillLevel ) { if ( r->options->fileTerminate ) @@ -1283,17 +1480,14 @@ static int _fileFeeder( struct RunTime *r ) } } - /* We can probably read from file faster than we can process.... */ - _dataAvailable( r ); - int nwp = ( r->wp + 1 ) % NUM_RAW_BLOCKS; + _handleBlock( r, rxBlock->fillLevel, rxBlock->buffer ); - /* Spin waiting for buffer space to become available */ - while ( nwp == r->rp ) + if ( r->options->paceDelay ) { - usleep( INTERVAL_100MS ); + usleep( r->options->paceDelay ); } - r->wp = nwp; + rxBlock->fillLevel = read( r->f, rxBlock->buffer, USB_TRANSFER_SIZE ); } r->conn = false; @@ -1317,6 +1511,8 @@ static int _fileFeeder( struct RunTime *r ) int main( int argc, char *argv[] ) { + struct timespec ts; + /* This is set here to avoid huge .data section in startup image */ _r.options = &_options; @@ -1325,24 +1521,18 @@ int main( int argc, char *argv[] ) WSAStartup( MAKEWORD( 2, 2 ), &wsaData ); #endif - /* Setup TPIU in case we call it into service later */ - TPIUDecoderInit( &_r.t ); - - if ( pthread_mutex_init( &_r.dataForClients_m, NULL ) != 0 ) + if ( !_processOptions( argc, argv, &_r ) ) { - genericsExit( -1, "Failed to establish mutex for condition variablee" EOL ); + /* processOptions generates its own error messages */ + genericsExit( -1, "" EOL ); } - if ( pthread_cond_init( &_r.dataForClients, NULL ) != 0 ) + if ( _r.options->useTPIU ) { - genericsExit( -1, "Failed to establish condition variablee" EOL ); + TPIUDecoderInit( &_r.t ); } - if ( !_processOptions( argc, argv, &_r ) ) - { - /* processOptions generates its own error messages */ - genericsExit( -1, "" EOL ); - } + OFLOWInit( &_r.oflow ); genericsScreenHandling( !_r.options->mono ); @@ -1365,8 +1555,9 @@ int main( int argc, char *argv[] ) #endif - if ( _r.options->useTPIU ) + if ( _r.options->channelList ) { + /* Channel list is only needed for legacy ports that we are re-exporting (i.e. clean unencapsulated flows) */ char *c = _r.options->channelList; int x = 0; @@ -1390,7 +1581,7 @@ int main( int argc, char *argv[] ) if ( x ) { /* This is a good number, so open */ - if ( ( x < 0 ) || ( x >= NUM_TPIU_CHANNELS ) ) + if ( ( x < 0 ) || ( x >= NUM_OFLOW_CHANNELS ) ) { genericsExit( -1, "Channel number out of range" EOL ); } @@ -1399,31 +1590,23 @@ int main( int argc, char *argv[] ) _r.handler[_r.numHandlers].channel = x; _r.handler[_r.numHandlers].strippedBlock = ( struct dataBlock * )calloc( 1, sizeof( struct dataBlock ) ); - _r.handler[_r.numHandlers].n = nwclientStart( _r.options->listenPort + _r.numHandlers ); - genericsReport( V_WARN, "Started Network interface for channel %d on port %d" EOL, x, _r.options->listenPort + _r.numHandlers ); + _r.tagCount[x].hasHandler = true; + _r.handler[_r.numHandlers].n = nwclientStart( _r.options->listenPort + LEGACY_SERVER_PORT_OFS + _r.numHandlers ); + genericsReport( V_INFO, "Will decode tag %d, exported Legacy interface on port %d" EOL, x, _r.options->listenPort + LEGACY_SERVER_PORT_OFS + _r.numHandlers ); + _r.numHandlers++; x = 0; } } - - /* ...a blank line so this doesn't get erased by monitoring reports */ - if ( _r.options->intervalReportTime ) - { - genericsReport( V_WARN, EOL ); - } - } - else - { - if ( !( _r.n = nwclientStart( _r.options->listenPort ) ) ) - { - genericsExit( -1, "Failed to make network server" EOL ); - } } - if ( _r.options->intervalReportTime ) - { - pthread_create( &_r.intervalThread, NULL, &_checkInterval, &_r ); - } + /* The OFLOW handler doesn't need a channel list ... it works on all channels */ + _r.oflowHandler = nwclientStart( _r.options->listenPort ); + genericsReport( V_INFO, "Started Network interface for OFLOW on port %d" EOL, _r.options->listenPort ); + + /* Don't do anything with interval times for at least the first interval time */ + clock_gettime( CLOCK_REALTIME, &ts ); + _r.lastInterval = ts.tv_sec * 1000000000L + ts.tv_nsec; if ( _r.options->outfile ) { @@ -1436,11 +1619,11 @@ int main( int argc, char *argv[] ) } } + /* Blank line for tidyness' sake */ + genericsPrintf( EOL ); + if ( ( _r.options->nwserverPort ) || ( _r.options->port ) || ( _r.options->file ) ) { - /* Start the distribution task */ - pthread_create( &_r.processThread, NULL, &_processBlocksQueue, &_r ); - if ( _r.options->nwserverPort ) { exit( _nwserverFeeder( &_r ) ); @@ -1457,7 +1640,7 @@ int main( int argc, char *argv[] ) } } - /* ...nothing else left, it must be usb! */ + /* ...nothing else left, it must be usb (either ORBTrace or BMP) */ exit( _usbFeeder( &_r ) ); } // ==================================================================================================== diff --git a/Src/orbzmq.c b/Src/orbzmq.c index 7f67addd..e76704bb 100644 --- a/Src/orbzmq.c +++ b/Src/orbzmq.c @@ -9,6 +9,7 @@ #include #include #include +#include #include "generics.h" #include "git_version_info.h" @@ -17,6 +18,7 @@ #include "tpiuDecoder.h" #include "itmDecoder.h" #include "msgDecoder.h" +#include "oflow.h" #define NUM_CHANNELS 32 #define HWFIFO_NAME "hwevent" @@ -24,6 +26,9 @@ #define DEFAULT_ZMQ_BIND_URL "tcp://*:3442" /* by default bind to all source interfaces */ +enum Prot { PROT_OFLOW, PROT_ITM, PROT_TPIU, PROT_UNKNOWN }; +const char *protString[] = {"OFLOW", "ITM", "TPIU", NULL}; + // Record for options, either defaults or from command line struct Channel @@ -35,8 +40,7 @@ struct Channel struct { /* Config information */ - bool useTPIU; - uint32_t tpiuChannel; + uint32_t tag; bool forceITMSync; uint32_t hwOutputs; @@ -47,6 +51,7 @@ struct /* Source information */ int port; char *server; + enum Prot protocol; /* What protocol to communicate (default to OFLOW (== orbuculum)) */ bool mono; /* Supress colour in output */ char *file; /* File host connection */ @@ -55,9 +60,9 @@ struct } options = { .forceITMSync = true, - .tpiuChannel = 1, + .tag = 1, .bindUrl = DEFAULT_ZMQ_BIND_URL, - .port = NWCLIENT_SERVER_PORT, + .port = OTCLIENT_SERVER_PORT, .server = "localhost" }; @@ -68,6 +73,7 @@ struct struct ITMPacket h; struct TPIUDecoder t; struct TPIUPacket p; + struct OFLOW c; /* Timestamp info */ uint64_t lastHWExceptionTS; @@ -76,6 +82,8 @@ struct void *zmqContext; void *zmqSocket; + bool ending; + } _r; // ==================================================================================================== @@ -342,7 +350,7 @@ void _itmPumpProcess( char c ) { struct msg decoded; - typedef void ( *handlers )( void *decoded, struct ITMDecoder * i ); + typedef void ( *handlers )( void *, struct ITMDecoder * i ); /* Handlers for each complete message received */ static const handlers h[MSG_NUM_MSGS] = @@ -408,7 +416,7 @@ void _itmPumpProcess( char c ) // ==================================================================================================== void _protocolPump( uint8_t c ) { - if ( options.useTPIU ) + if ( PROT_TPIU == options.protocol ) { switch ( TPIUPump( &_r.t, c ) ) { @@ -433,7 +441,7 @@ void _protocolPump( uint8_t c ) for ( uint32_t g = 0; g < _r.p.len; g++ ) { - if ( _r.p.packet[g].s == options.tpiuChannel ) + if ( _r.p.packet[g].s == options.tag ) { _itmPumpProcess( _r.p.packet[g].d ); continue; @@ -469,8 +477,10 @@ void _printHelp( const char *const progName ) genericsPrintf( " -h, --help: This help" EOL ); genericsPrintf( " -M, --no-colour: Supress colour in output" EOL ); genericsPrintf( " -n, --itm-sync: Enforce sync requirement for ITM (i.e. ITM needs to issue syncs)" EOL ); + genericsPrintf( " -p, --protocol: Protocol to communicate. Defaults to OFLOW if -s is not set, otherwise ITM unless" EOL \ + " explicitly set to TPIU to decode TPIU frames on channel set by -t" EOL ); genericsPrintf( " -s, --server: : to use, default %s:%d" EOL, options.server, options.port ); - genericsPrintf( " -t, --tpiu: : Use TPIU decoder on specified channel (normally 1)" EOL ); + genericsPrintf( " -t, --tag: : Which TPIU stream or OFLOW tag to use (normally 1)" EOL ); genericsPrintf( " -v, --verbose: Verbose mode 0(errors)..3(debug)" EOL ); genericsPrintf( " -V, --version: Print version and exit" EOL ); genericsPrintf( " -z, --zbind: : ZeroMQ bind URL, default %s" EOL, options.bindUrl ); @@ -553,6 +563,7 @@ static struct option _longOptions[] = {"itm-sync", no_argument, NULL, 'n'}, {"no-colour", no_argument, NULL, 'M'}, {"no-color", no_argument, NULL, 'M'}, + {"protocol", required_argument, NULL, 'p'}, {"server", required_argument, NULL, 's'}, {"tpiu", required_argument, NULL, 't'}, {"verbose", required_argument, NULL, 'v'}, @@ -570,13 +581,16 @@ bool _processOptions( int argc, char *argv[] ) unsigned int chan; char *chanIndex; int32_t hwOutputs; + bool protExplicit = false; + bool serverExplicit = false; + bool portExplicit = false; for ( int g = 0; g < NUM_CHANNELS; g++ ) { options.channel[g].topic = NULL; } - while ( ( c = getopt_long ( argc, argv, "c:e:Ef:hns:t:v:Vz:", _longOptions, &optionIndex ) ) != -1 ) + while ( ( c = getopt_long ( argc, argv, "c:e:Ef:hnp:s:t:v:Vz:", _longOptions, &optionIndex ) ) != -1 ) { switch ( c ) { @@ -610,9 +624,33 @@ bool _processOptions( int argc, char *argv[] ) options.forceITMSync = false; break; + // ------------------------------------ + + case 'p': + options.protocol = PROT_UNKNOWN; + protExplicit = true; + + for ( int i = 0; protString[i]; i++ ) + { + if ( !strcmp( protString[i], optarg ) ) + { + options.protocol = i; + break; + } + } + + if ( options.protocol == PROT_UNKNOWN ) + { + genericsReport( V_ERROR, "Unrecognised protocol type" EOL ); + return false; + } + + break; + // ------------------------------------ case 's': options.server = optarg; + serverExplicit = true; // See if we have an optional port number too char *a = optarg; @@ -632,13 +670,16 @@ bool _processOptions( int argc, char *argv[] ) { options.port = NWCLIENT_SERVER_PORT; } + else + { + portExplicit = true; + } break; // ------------------------------------ case 't': - options.useTPIU = true; - options.tpiuChannel = atoi( optarg ); + options.tag = atoi( optarg ); break; // ------------------------------------ @@ -745,10 +786,15 @@ bool _processOptions( int argc, char *argv[] ) } } - if ( ( options.useTPIU ) && ( !options.tpiuChannel ) ) + /* If we set an explicit server and port and didn't set a protocol chances are we want ITM, not OFLOW */ + if ( serverExplicit && !protExplicit ) { - genericsReport( V_ERROR, "TPIU set for use but no channel set for ITM output" EOL ); - return false; + options.protocol = PROT_ITM; + } + + if ( ( options.protocol == PROT_TPIU ) && !portExplicit ) + { + options.port = NWCLIENT_SERVER_PORT; } genericsReport( V_INFO, "orbzmq version " GIT_DESCRIBE EOL ); @@ -770,15 +816,7 @@ bool _processOptions( int argc, char *argv[] ) } } - if ( options.useTPIU ) - { - genericsReport( V_INFO, "Using TPIU : true (ITM on channel %d)" EOL, options.tpiuChannel ); - } - else - { - genericsReport( V_INFO, "Using TPIU : false" EOL ); - } - + genericsReport( V_INFO, "Tag : " EOL, options.tag ); genericsReport( V_INFO, "ZeroMQ bind : %s" EOL, options.bindUrl ); genericsReport( V_INFO, "Channels :" EOL ); @@ -807,6 +845,25 @@ bool _processOptions( int argc, char *argv[] ) genericsReport( V_INFO, " HW [Predefined] [%s]" EOL, hwEventNames[g] ); } + switch ( options.protocol ) + { + case PROT_OFLOW: + genericsReport( V_INFO, "Decoding OFLOW (Orbuculum) with ITM in stream %d" EOL, options.tag ); + break; + + case PROT_ITM: + genericsReport( V_INFO, "Decoding ITM" EOL ); + break; + + case PROT_TPIU: + genericsReport( V_INFO, "Using TPIU with ITM in stream %d" EOL, options.tag ); + break; + + default: + genericsReport( V_INFO, "Decoding unknown" EOL ); + break; + } + return true; } @@ -823,12 +880,33 @@ static struct Stream *_tryOpenStream() return streamCreateSocket( options.server, options.port ); } } +// ==================================================================================================== + +static void _OFLOWpacketRxed ( struct OFLOWFrame *p, void *param ) + +{ + if ( !p->good ) + { + genericsReport( V_WARN, "Bad packet received" EOL ); + } + else + { + if ( p->tag == options.tag ) + { + for ( int i = 0; i < p->len; i++ ) + { + _itmPumpProcess( p->d[i] ); + } + } + } +} + // ==================================================================================================== static void _feedStream( struct Stream *stream ) { unsigned char cbw[TRANSFER_SIZE]; - while ( true ) + while ( !_r.ending ) { size_t receivedSize; enum ReceiveResult result = stream->receive( stream, cbw, TRANSFER_SIZE, NULL, &receivedSize ); @@ -849,17 +927,34 @@ static void _feedStream( struct Stream *stream ) } } - unsigned char *c = cbw; - - while ( receivedSize-- ) + if ( PROT_OFLOW == options.protocol ) { - _protocolPump( *c++ ); + OFLOWPump( &_r.c, cbw, receivedSize, _OFLOWpacketRxed, &_r ); } + else + { + unsigned char *c = cbw; + + while ( receivedSize-- ) + { + _protocolPump( *c++ ); + } - fflush( stdout ); + fflush( stdout ); + } } } +// ==================================================================================================== +static void _intHandler( int sig ) + +{ + /* CTRL-C exit is not an error... */ + _r.ending = true; +} +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== int main( int argc, char *argv[] ) { @@ -879,12 +974,19 @@ int main( int argc, char *argv[] ) /* Reset the TPIU handler before we start */ TPIUDecoderInit( &_r.t ); ITMDecoderInit( &_r.i, options.forceITMSync ); + OFLOWInit( &_r.c ); - while ( true ) + /* This ensures the signal handler gets called */ + if ( SIG_ERR == signal( SIGINT, _intHandler ) ) + { + genericsExit( -1, "Failed to establish Int handler" EOL ); + } + + while ( !_r.ending ) { struct Stream *stream = NULL; - while ( true ) + while ( !_r.ending ) { stream = _tryOpenStream(); @@ -917,10 +1019,10 @@ int main( int argc, char *argv[] ) if ( stream != NULL ) { _feedStream( stream ); - } - stream->close( stream ); - free( stream ); + stream->close( stream ); + free( stream ); + } if ( options.endTerminate ) { diff --git a/Src/readsource.c b/Src/readsource.c new file mode 100644 index 00000000..0158d2d6 --- /dev/null +++ b/Src/readsource.c @@ -0,0 +1,161 @@ + +#include +#include +#include +#include "generics.h" + +#define BLOCKSIZE (65536) +#define MAX_LINE_LEN (4095) + +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== +// Externally Available routines +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== + +#if defined(WIN32) + +char *readsourcefile( char *path, size_t *l ) +{ + *l = 0; + FILE *f = fopen( path, "r" ); + + if ( f == NULL ) + { + return NULL; + } + + char *retBuffer = ( char * )malloc( BLOCKSIZE ); + + size_t insize = fread( retBuffer, 1, BLOCKSIZE, f ); + *l = insize; + + while ( !feof( f ) ) + { + retBuffer = ( char * )realloc( retBuffer, *l + BLOCKSIZE ); + + if ( !retBuffer ) + { + genericsExit( -1, "Out of memory" EOL ); + } + + insize = fread( &retBuffer[*l], 1, BLOCKSIZE, f ); + *l += insize; + } + + fclose( f ); + + retBuffer = ( char * )realloc( retBuffer, *l + 1 ); + + if ( !retBuffer ) + { + genericsExit( -1, "Out of memory" EOL ); + } + + retBuffer[*l] = '\0'; + + return retBuffer; +} + +#else + +char *readsourcefile( char *path, size_t *l ) + +/* Return either a malloced buffer containing the source file, or NULL if the file isn't available */ + +{ + FILE *fd = NULL; + static bool prettyPrinterTested = false; + char commandLine[MAX_LINE_LEN]; + bool isProcess = true; + + char *retBuffer = ( char * )malloc( BLOCKSIZE ); + size_t insize = 0; + + if ( !prettyPrinterTested ) + { + /* Try and grab the file via a prettyprinter. If that doesn't work, grab it via cat */ + if ( getenv( "ORB_PRETTYPRINTER" ) ) + { + /* We have an environment variable containing the prettyprinter...lets use that */ + snprintf( commandLine, MAX_LINE_LEN, "%s %s", getenv( "ORB_PRETTYPRINTER" ), path ); + } + else + { + /* No environment variable, use the default */ + snprintf( commandLine, MAX_LINE_LEN, "source-highlight -f esc -o STDOUT -i %s 2>/dev/null", path ); + } + + fd = popen( commandLine, "r" ); + + /* Perform a single read...this will lead to a zero length read if the command wasn't valid */ + insize = fread( retBuffer, 1, BLOCKSIZE, fd ); + } + + if ( !insize ) + { + if ( fd ) + { + pclose( fd ); + } + + isProcess = false; + prettyPrinterTested = true; + + if ( ( fd = fopen( path, "r" ) ) ) + { + insize = fread( retBuffer, 1, BLOCKSIZE, fd ); + } + } + + /* Record what we managed to read, by whichever mechanism */ + *l = insize; + + /* There may be more file to read...if so, then let's do it */ + while ( insize == BLOCKSIZE ) + { + /* Make another block available */ + retBuffer = ( char * )realloc( retBuffer, *l + BLOCKSIZE ); + + if ( !retBuffer ) + { + genericsExit( -1, "Out of memory" EOL ); + } + + insize = fread( &retBuffer[*l], 1, BLOCKSIZE, fd ); + *l += insize; + } + + /* Make sure we terminate with a 0 .. there will always be space for this */ + retBuffer[( *l )++] = 0; + + /* Close the process or file, depending on what it was that actually got opened */ + if ( fd ) + { + isProcess ? pclose( fd ) : fclose( fd ); + } + + /* Resize the memory to what was actually read in */ + if ( *l ) + { + retBuffer = ( char * )realloc( retBuffer, *l ); + + if ( !retBuffer ) + { + genericsExit( -1, "Out of memory" EOL ); + } + } + else + { + free( retBuffer ); + retBuffer = NULL; + } + + return retBuffer; +} + +#endif + +// ==================================================================================================== diff --git a/Src/sio.c b/Src/sio.c index 5cf450d5..640e707b 100644 --- a/Src/sio.c +++ b/Src/sio.c @@ -22,7 +22,29 @@ #include "sio.h" /* Colours for output */ -enum CP { CP_NONE, CP_EVENT, CP_NORMAL, CP_FILEFUNCTION, CP_LINENO, CP_EXECASSY, CP_NEXECASSY, CP_BASELINE, CP_BASELINETEXT, CP_SEARCH, CP_DEBUG }; +enum CP +{ + /* These initial pairs are set to match the ANSI foreground colors */ + CP_FG_BLACK, + CP_FG_DARK_RED, + CP_FG_DARK_GREEN, + CP_FG_DARK_YELLOW, + CP_FG_DARK_BLUE, + CP_FG_DARK_MAGENTA, + CP_FG_DARK_CYAN, + CP_FG_DARK_WHITE, + CP_FG_BRIGHT_BLACK, + CP_FG_BRIGHT_RED, + CP_FG_BRIGHT_GREEN, + CP_FG_BRIGHT_YELLOW, + CP_FG_BRIGHT_BLUE, + CP_FG_BRIGHT_MAGENTA, + CP_FG_BRIGHT_CYAN, + CP_FG_BRIGHT_WHITE, + + /* Remaining pairs */ + CP_EVENT, CP_NORMAL, CP_FILEFUNCTION, CP_LINENO, CP_EXECASSY, CP_NEXECASSY, CP_BASELINE, CP_BASELINETEXT, CP_SEARCH, CP_DEBUG, CP_SOURCEHL, CP_PROBLEM +}; /* Search types */ enum SRCH { SRCH_OFF, SRCH_FORWARDS, SRCH_BACKWARDS }; @@ -58,7 +80,7 @@ struct SIOInstance uint32_t warnTimeout; /* Time at which it should be removed, or 0 if it's not active */ /* Current position in buffer */ - struct line **opText; /* Pointer to lines of Text of the output buffer */ + struct sioline **opText; /* Pointer to lines of Text of the output buffer */ int32_t opTextWline; /* Next line number to be written */ int32_t opTextRline; /* Current read position in op buffer */ int32_t oldopTextRline; /* Old read position in op buffer (for redraw) */ @@ -177,6 +199,8 @@ static void _outputHelp( struct SIOInstance *sio ) wprintw( sio->outputWindow, " CTRL-L: Refresh the screen" EOL ); wprintw( sio->outputWindow, " CTRL-R: Search backwards, CTRL-R again for next match" EOL ); wprintw( sio->outputWindow, " CTRL-F: Search forwards, CTRL-F again for next match" EOL ); + wprintw( sio->outputWindow, " p: Step backwards through execution history of current window" EOL ); + wprintw( sio->outputWindow, " n: Step forwards through execution history of current window" EOL ); wprintw( sio->outputWindow, EOL " Use PgUp/PgDown/Home/End and the arrow keys to move around the sample buffer" EOL ); wprintw( sio->outputWindow, " Shift-PgUp and Shift-PgDown move more quickly" EOL ); wprintw( sio->outputWindow, EOL " again to leave this help screen." EOL ); @@ -293,7 +317,7 @@ static enum SIOEvent _processRegularKeys( struct SIOInstance *sio ) } else { - beep(); + SIObeep(); } op = SIO_EV_CONSUMED; @@ -302,7 +326,7 @@ static enum SIOEvent _processRegularKeys( struct SIOInstance *sio ) case '0' ... '0'+MAX_TAGS: /* ----------- Tagged Location -------------------------------- */ if ( sio->amDiving ) { - beep(); + SIObeep(); } else { @@ -319,7 +343,7 @@ static enum SIOEvent _processRegularKeys( struct SIOInstance *sio ) } else { - beep(); + SIObeep(); } } } @@ -387,7 +411,7 @@ static bool _updateSearch( struct SIOInstance *sio ) ( sio->searchMode == SRCH_FORWARDS ) ? ( l < sio->opTextWline - 1 ) : ( l > 0 ); ( sio->searchMode == SRCH_FORWARDS ) ? l++ : l-- ) { - if ( strstr( ( *sio->opText )[l].buffer, sio->searchString ) ) + if ( ( ( *sio->opText )[l].buffer ) && strstr( ( *sio->opText )[l].buffer, sio->searchString ) ) { /* This is a match */ sio->opTextRline = l; @@ -397,7 +421,7 @@ static bool _updateSearch( struct SIOInstance *sio ) } /* If we get here then we had no match */ - beep(); + SIObeep(); sio->searchOK = false; return false; } @@ -573,7 +597,7 @@ static bool _displayLine( struct SIOInstance *sio, int32_t lineNum, int32_t scre getyx( sio->outputWindow, y, x ); ( void )y; - while ( ( *u ) && ( *u != '\n' ) && ( *u != '\r' ) && ( x < OUTPUT_WINDOW_W ) ) + while ( u && ( *u ) && ( *u != '\n' ) && ( *u != '\r' ) && ( x < OUTPUT_WINDOW_W ) ) { /* Colour matches if we're in search mode, but whatever is happening, output the characters */ if ( ( sio->searchMode != SRCH_OFF ) && ( *sio->searchString ) && ( !strncmp( u, ssp, strlen( ssp ) ) ) ) @@ -588,23 +612,53 @@ static bool _displayLine( struct SIOInstance *sio, int32_t lineNum, int32_t scre } else { - wattr_set( sio->outputWindow, attr, pair, NULL ); - } + /* If the output string contains embedded escape colours then extract and respect them */ + while ( *u == 27 ) + { + u++; - if ( x == OUTPUT_WINDOW_W - 1 ) - { - waddch( sio->outputWindow, '>' ); - break; + if ( !strncmp( u, "[m", 2 ) ) + { + u += 2; + wattrset( sio->outputWindow, ( highlight ? A_BOLD | A_STANDOUT | COLOR_PAIR( CP_SOURCEHL ) : COLOR_PAIR( 15 ) ) ); + continue; + } + + if ( !strncmp( u, "[3", 2 ) ) + { + wattrset( sio->outputWindow, ( highlight ? A_BOLD | A_STANDOUT | COLOR_PAIR( CP_SOURCEHL ) : COLOR_PAIR( ( *( u + 2 ) ) - '0' ) ) ); + u += 4; + continue; + } + + if ( !strncmp( u, "[01;3", 5 ) ) + { + wattrset( sio->outputWindow, ( highlight ? A_BOLD | A_STANDOUT | COLOR_PAIR( CP_SOURCEHL ) : COLOR_PAIR( ( *( u + 5 ) ) - '0' ) ) ); + u += 7; + continue; + } + } } - else + + if ( *u && ( *u != '\n' ) && ( *u != '\r' ) ) { - waddch( sio->outputWindow, ( x == OUTPUT_WINDOW_W - 1 ) ? '>' : *u++ ); + if ( x == OUTPUT_WINDOW_W - 1 ) + { + waddch( sio->outputWindow, '>' ); + break; + } + else + { + waddch( sio->outputWindow, *u++ ); + } } /* This is done like this so chars like tabs are accounted for correctly */ getyx( sio->outputWindow, y, x ); } + wattr_set( sio->outputWindow, attr, pair, NULL ); + /* Now pad out the rest of this line with spaces */ if ( highlight ) { @@ -664,15 +718,13 @@ static void _outputStatus( struct SIOInstance *sio, uint64_t oldintervalBytes ) { if ( sio->warnTimeout > genericsTimestampmS() ) { - - mvwprintw( sio->statusWindow, 0, 10, " %s ", sio->warnText ); - } - else - { - sio->warnTimeout = 0; + wattrset( sio->statusWindow, A_BOLD | COLOR_PAIR( CP_PROBLEM ) ); + mvwprintw( sio->statusWindow, 1, 1, " %s ", sio->warnText ); } } + wattrset( sio->statusWindow, A_BOLD | COLOR_PAIR( CP_BASELINE ) ); + if ( sio->opTextWline ) { /* We have some opData stored, indicate where we are in it */ @@ -690,7 +742,6 @@ static void _outputStatus( struct SIOInstance *sio, uint64_t oldintervalBytes ) mvwprintw( sio->statusWindow, 0, 30, " Diving Buffer " ); } - wattrset( sio->statusWindow, A_BOLD | COLOR_PAIR( CP_BASELINETEXT ) ); if ( sio->isFile ) @@ -701,19 +752,21 @@ static void _outputStatus( struct SIOInstance *sio, uint64_t oldintervalBytes ) { if ( !sio->held ) { + uint64_t oldintervalBits = oldintervalBytes * 8; + if ( oldintervalBytes ) { - if ( oldintervalBytes < 9999 ) + if ( oldintervalBits < 9999 ) { - mvwprintw( sio->statusWindow, 1, COLS - 45, "%" PRIu64 " Bps (~%" PRIu64 " Ips)", oldintervalBytes, ( oldintervalBytes * 8 ) / 11 ); + mvwprintw( sio->statusWindow, 1, COLS - 45, "%" PRIu64 " bps (~%" PRIu64 " Ips)", oldintervalBits, oldintervalBits / 11 ); } else if ( oldintervalBytes < 9999999 ) { - mvwprintw( sio->statusWindow, 1, COLS - 45, "%" PRIu64 " KBps (~%" PRIu64 " KIps)", oldintervalBytes / 1000, oldintervalBytes * 8 / 1120 ); + mvwprintw( sio->statusWindow, 1, COLS - 45, "%" PRIu64 " Kbps (~%" PRIu64 " KIps)", oldintervalBits / 1000, oldintervalBits / 1120 ); } else { - mvwprintw( sio->statusWindow, 1, COLS - 45, "%" PRIu64 " MBps (~%" PRIu64 " MIps)", oldintervalBytes / 1000000, ( oldintervalBytes * 8 ) / 1120000 ); + mvwprintw( sio->statusWindow, 1, COLS - 45, "%" PRIu64 " Mbps (~%" PRIu64 " MIps)", oldintervalBits / 1000000, oldintervalBits / 1120000 ); } } @@ -727,14 +780,11 @@ static void _outputStatus( struct SIOInstance *sio, uint64_t oldintervalBytes ) } } - if ( !sio->warnTimeout ) - { - mvwprintw( sio->statusWindow, 0, 30, " " ); - } - /* We only output the tags while not in a diving buffer */ if ( ! sio->amDiving ) { + mvwprintw( sio->statusWindow, 0, 30, " " ); + for ( uint32_t t = 0; t < MAX_TAGS; t++ ) { if ( sio->tag[t] ) @@ -754,11 +804,7 @@ static void _outputStatus( struct SIOInstance *sio, uint64_t oldintervalBytes ) wattrset( sio->statusWindow, A_BOLD | COLOR_PAIR( CP_BASELINE ) ); } - if ( !sio->warnTimeout ) - { - /* We only print this if we're not outputting a warning message */ - wprintw( sio->statusWindow, "%d", t ); - } + wprintw( sio->statusWindow, "%d", t ); } if ( !sio->warnTimeout ) @@ -843,7 +889,9 @@ static void _updateWindows( struct SIOInstance *sio, bool isTick, bool isKey, ui // ==================================================================================================== // Malloc leak is deliberately ignored. That is the central purpose of this code! #pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak" +#if !defined(__clang__) + #pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak" +#endif struct SIOInstance *SIOsetup( const char *progname, const char *elffile, bool isFile ) @@ -865,6 +913,11 @@ struct SIOInstance *SIOsetup( const char *progname, const char *elffile, bool is if ( OK == start_color() ) { + for ( int i = 0; i < 16; i++ ) + { + init_pair( i, COLOR_BLACK + i, COLOR_BLACK ); + } + init_pair( CP_EVENT, COLOR_YELLOW, COLOR_BLACK ); init_pair( CP_NORMAL, COLOR_WHITE, COLOR_BLACK ); init_pair( CP_FILEFUNCTION, COLOR_RED, COLOR_BLACK ); @@ -875,6 +928,8 @@ struct SIOInstance *SIOsetup( const char *progname, const char *elffile, bool is init_pair( CP_BASELINETEXT, COLOR_YELLOW, COLOR_BLACK ); init_pair( CP_SEARCH, COLOR_GREEN, COLOR_BLACK ); init_pair( CP_DEBUG, COLOR_MAGENTA, COLOR_BLACK ); + init_pair( CP_SOURCEHL, COLOR_WHITE, COLOR_BLACK ); + init_pair( CP_PROBLEM, COLOR_RED, COLOR_BLACK ); } sio->outputWindow = newwin( OUTPUT_WINDOW_L, OUTPUT_WINDOW_W, 0, 0 ); @@ -907,6 +962,21 @@ int32_t SIOgetCurrentLineno( struct SIOInstance *sio ) return sio->opTextRline; } // ==================================================================================================== +int32_t SIOgetLastLineno( struct SIOInstance *sio ) + +{ + return sio->opTextWline - 1; +} +// ==================================================================================================== +void SIOsetCurrentLineno( struct SIOInstance *sio, int32_t l ) + +{ + if ( ( l >= 0 ) && ( l < sio->opTextWline - 1 ) ) + { + sio->opTextRline = l; + } +} +// ==================================================================================================== void SIOalert( struct SIOInstance *sio, const char *msg ) { @@ -938,7 +1008,7 @@ void SIOrequestRefresh( struct SIOInstance *sio ) sio->forceRefresh = true; } // ==================================================================================================== -void SIOsetOutputBuffer( struct SIOInstance *sio, int32_t numLines, int32_t currentLine, struct line **opTextSet, bool amDiving ) +void SIOsetOutputBuffer( struct SIOInstance *sio, int32_t numLines, int32_t currentLine, struct sioline **opTextSet, bool amDiving ) { sio->opText = opTextSet; @@ -982,7 +1052,15 @@ void SIOtagText ( struct SIOInstance *sio, const char *ttext ) // ==================================================================================================== -enum SIOEvent SIOHandler( struct SIOInstance *sio, bool isTick, uint64_t oldintervalBytes ) +void SIObeep( void ) + +{ + beep(); +} + +// ==================================================================================================== + +enum SIOEvent SIOHandler( struct SIOInstance *sio, bool isTick, uint64_t oldintervalBytes, bool supportDebug ) /* Top level to deal with all UI aspects */ @@ -1030,9 +1108,14 @@ enum SIOEvent SIOHandler( struct SIOInstance *sio, bool isTick, uint64_t oldinte case '^': op = SIO_EV_CONSUMED; - isTick = true; - sio->outputDebug = !sio->outputDebug; - SIOrequestRefresh( sio ); + + if ( supportDebug ) + { + isTick = true; + sio->outputDebug = !sio->outputDebug; + SIOrequestRefresh( sio ); + } + break; case 'h': @@ -1052,6 +1135,14 @@ enum SIOEvent SIOHandler( struct SIOInstance *sio, bool isTick, uint64_t oldinte op = SIO_EV_SURFACE; break; + case 'p': + op = SIO_EV_PREV; + break; + + case 'n': + op = SIO_EV_NEXT; + break; + case 'q': case 'Q': op = SIO_EV_QUIT; diff --git a/Src/stream_file_posix.c b/Src/stream_file_posix.c index a20464d9..0b684f1b 100644 --- a/Src/stream_file_posix.c +++ b/Src/stream_file_posix.c @@ -76,7 +76,9 @@ static int _posixFileStreamCreate( const char *file ) // Malloc leak is deliberately ignored. That is the central purpose of this code! #pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak" +#if !defined(__clang__) + #pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak" +#endif struct Stream *streamCreateFile( const char *file ) { diff --git a/Src/stream_socket_posix.c b/Src/stream_socket_posix.c index ec955520..b011c54f 100644 --- a/Src/stream_socket_posix.c +++ b/Src/stream_socket_posix.c @@ -158,7 +158,9 @@ static int _posixSocketStreamCreate( const char *server, int port ) // Malloc leak is deliberately ignored. That is the central purpose of this code! #pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak" +#if !defined(__clang__) + #pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak" +#endif struct Stream *streamCreateSocket( const char *server, int port ) { diff --git a/Src/symbols.c b/Src/symbols.c index 72323d3b..ad00968d 100644 --- a/Src/symbols.c +++ b/Src/symbols.c @@ -116,7 +116,9 @@ static uint32_t _getFunctionEntryIdx( struct SymbolSet *s, char *function ) // ==================================================================================================== // Strdup leak is deliberately ignored. That is the central purpose of this code! #pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak" +#if !defined(__clang__) + #pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak" +#endif static uint32_t _getOrAddFunctionEntryIdx( struct SymbolSet *s, char *function ) /* Return index to file entry in the functions table, or create an entry and return that */ @@ -709,6 +711,28 @@ static enum symbolErr _getTargetProgramInfo( struct SymbolSet *s ) #define MASKED_COMPARE(mask,compare) (((sourceEntry->assy[sourceEntry->assyLines].codes)&(mask))==(compare)) + /* For ETM4 we need to know direct and indirect branches, cos they are the only instructions */ + /* that will get traced. So let's label those...Per definition in ARM IHI0064H.a ID20820 Appendix F */ + if ( + MASKED_COMPARE( 0xffffff03, 0x00004700 ) || /* BL, BLX rx */ + MASKED_COMPARE( 0xfffff500, 0x0000b100 ) || /* CBNZ/CBZ */ + MASKED_COMPARE( 0xfffff000, 0x0000d000 ) || /* B */ + MASKED_COMPARE( 0xffffffef, 0x0000bf20 ) || /* WFE/WFI */ + + /* 32 bit matches */ + MASKED_COMPARE( 0xffd08000, 0xe8908000 ) || /* LDM */ + MASKED_COMPARE( 0xffd08000, 0xe9908000 ) || /* LDMDB */ + MASKED_COMPARE( 0xfe10f000, 0xf810f000 ) || /* LDR to PC */ + MASKED_COMPARE( 0xf8008000, 0xf0008000 ) /* Branches and misc control */ + ) + { + sourceEntry->assy[sourceEntry->assyLines].etm4branch = true; + } + else + { + sourceEntry->assy[sourceEntry->assyLines].etm4branch = false; + } + /* The only way a subroutine will be called from gcc (See gcc source code file gcc/config/arm/thumb2.md) is */ /* via blx reg, blxns reg. In theory it could also be done via direct manipulation of R15, but fortunately */ /* gcc doesn't pull tricks like that. It _will_ tail chain (with BX) though. */ @@ -1035,7 +1059,9 @@ bool SymbolSetValid( struct SymbolSet **s, char *filename ) // ==================================================================================================== // Malloc leak is deliberately ignored. That is the central purpose of this code! #pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak" +#if !defined(__clang__) + #pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak" +#endif enum symbolErr SymbolSetCreate( struct SymbolSet **ss, const char *filename, const char *deleteMaterial, bool demanglecpp, bool recordSource, bool recordAssy, const char *objdumpOptions ) diff --git a/Src/traceDecoder.c b/Src/traceDecoder.c index 4dd8e0a2..51507d3a 100644 --- a/Src/traceDecoder.c +++ b/Src/traceDecoder.c @@ -15,992 +15,14 @@ #include "traceDecoder.h" #include "generics.h" -/* Events from the process of pumping bytes through the TRACE decoder */ -enum TRACEDecoderPumpEvent -{ - TRACE_EV_NONE, - TRACE_EV_UNSYNCED, - TRACE_EV_SYNCED, - TRACE_EV_ERROR, - TRACE_EV_MSG_RXED -}; - -const char *TRACEprotocolString[] = -{ - TRACEProtocolStringDEF -}; - -const char *protoStateName[] = -{ - TRACEprotoStateNamesDEF -}; - -// ==================================================================================================== -// ==================================================================================================== -// ==================================================================================================== -// Internal routines - the decoder itself -// ==================================================================================================== -// ==================================================================================================== -// ==================================================================================================== - - -// ==================================================================================================== -static void _stateChange( struct TRACEDecoder *i, enum TRACEchanges c ) -{ - i->cpu.changeRecord |= ( 1 << c ); -} -// ==================================================================================================== -static void _ETM35DecoderPumpAction( struct TRACEDecoder *i, uint8_t c, traceDecodeCB cb, genericsReportCB report, void *d ) - -/* Pump next byte into the protocol decoder */ - -{ - bool C; /* Is address packet continued? */ - bool X = false; /* Is there exception information following address */ - int8_t ofs; /* Offset for bits in address calculation */ - uint8_t mask; /* Mask for bits in address calculation */ - - enum TRACEprotoState newState = i->p; - struct TRACECPUState *cpu = &i->cpu; - enum TRACEDecoderPumpEvent retVal = TRACE_EV_NONE; - - - /* Perform A-Sync accumulation check */ - if ( ( i->asyncCount >= 5 ) && ( c == 0x80 ) ) - { - if ( report ) - { - report( V_DEBUG, "A-Sync Accumulation complete" EOL ); - } - - newState = TRACE_IDLE; - } - else - { - i->asyncCount = c ? 0 : i->asyncCount + 1; - - switch ( i->p ) - { - // ----------------------------------------------------- - case TRACE_UNSYNCED: - break; - - // ----------------------------------------------------- - - case TRACE_IDLE: - - // ************************************************* - // ************** BRANCH PACKET ******************** - // ************************************************* - if ( c & 0b1 ) - { - /* The lowest order 6 bits of address info... */ - - switch ( cpu->addrMode ) - { - case TRACE_ADDRMODE_ARM: - i->addrConstruct = ( i->addrConstruct & ~( 0b11111100 ) ) | ( ( c & 0b01111110 ) << 1 ); - break; - - case TRACE_ADDRMODE_THUMB: - i->addrConstruct = ( i->addrConstruct & ~( 0b01111111 ) ) | ( c & 0b01111110 ); - break; - - case TRACE_ADDRMODE_JAZELLE: - i->addrConstruct = ( i->addrConstruct & ~( 0b00111111 ) ) | ( ( c & 0b01111110 ) >> 1 ); - break; - } - - i->byteCount = 1; - C = ( c & 0x80 ) != 0; - X = false; - _stateChange( i, EV_CH_ADDRESS ); - - newState = ( i->usingAltAddrEncode ) ? TRACE_COLLECT_BA_ALT_FORMAT : TRACE_COLLECT_BA_STD_FORMAT; - goto terminateAddrByte; - } - - // ************************************************* - // ************** A-SYNC PACKET ******************** - // ************************************************* - if ( c == 0b00000000 ) - { - break; - } - - // ************************************************* - // ************ CYCLECOUNT PACKET ****************** - // ************************************************* - if ( c == 0b00000100 ) - { - if ( report ) - { - report( V_DEBUG, "CYCCNT " EOL ); - } - - i->byteCount = 0; - i->cycleConstruct = 0; - newState = TRACE_GET_CYCLECOUNT; - break; - } - - // ************************************************* - // ************** ISYNC PACKETS ******************** - // ************************************************* - if ( c == 0b00001000 ) /* Normal ISYNC */ - { - if ( report ) - { - report( V_DEBUG, "Normal ISYNC " EOL ); - } - - /* Collect either the context or the Info Byte next */ - i->byteCount = 0; - i->contextConstruct = 0; - newState = i->contextBytes ? TRACE_GET_CONTEXTBYTE : TRACE_GET_INFOBYTE; - - /* We won't start reporting data until a valid ISYNC has been received */ - if ( !i->rxedISYNC ) - { - if ( report ) - { - report( V_DEBUG, "Initial ISYNC" ); - } - - i->cpu.changeRecord = 0; - i->rxedISYNC = true; - } - - break; - } - - if ( c == 0b01110000 ) /* ISYNC with Cycle Count */ - { - if ( report ) - { - report( V_DEBUG, "ISYNC+CYCCNT " EOL ); - } - - /* Collect the cycle count next */ - i->byteCount = 0; - i->cycleConstruct = 0; - newState = TRACE_GET_ICYCLECOUNT; - break; - } - - // ************************************************* - // ************** TRIGGER PACKET ******************* - // ************************************************* - if ( c == 0b00001100 ) - { - if ( report ) - { - report( V_DEBUG, "TRIGGER " EOL ); - } - - _stateChange( i, EV_CH_TRIGGER ); - retVal = TRACE_EV_MSG_RXED; - break; - } - - // ************************************************* - // **************** VMID PACKET ******************** - // ************************************************* - if ( c == 0b00111100 ) - { - if ( report ) - { - report( V_DEBUG, "VMID " EOL ); - } - - newState = TRACE_GET_VMID; - break; - } - - // ************************************************* - // *********** TIMESTAMP PACKET ******************** - // ************************************************* - if ( ( c & 0b11111011 ) == 0b01000010 ) - { - if ( report ) - { - report( V_DEBUG, "TS " EOL ); - } - - newState = TRACE_GET_TSTAMP; - - if ( ( c & ( 1 << 2 ) ) != 0 ) - { - _stateChange( i, EV_CH_CLOCKSPEED ); - } - - i->byteCount = 0; - break; - } - - // ************************************************* - // ************** IGNORE PACKET ******************** - // ************************************************* - if ( c == 0b01100110 ) - { - if ( report ) - { - report( V_DEBUG, "Ignore Packet" EOL ); - } - - break; - } - - // ************************************************* - // ************ CONTEXTID PACKET ******************* - // ************************************************* - if ( c == 0b01101110 ) - { - if ( report ) - { - report( V_DEBUG, "CONTEXTID " EOL ); - } - - newState = TRACE_GET_CONTEXTID; - cpu->contextID = 0; - i->byteCount = 0; - break; - } - - // ************************************************* - // ******** EXCEPTION EXIT PACKET ****************** - // ************************************************* - if ( c == 0b01110110 ) - { - if ( report ) - { - report( V_DEBUG, "EXCEPT-EXIT " EOL ); - } - - _stateChange( i, EV_CH_EX_EXIT ); - retVal = TRACE_EV_MSG_RXED; - break; - } - - // ************************************************* - // ******** EXCEPTION ENTRY PACKET ***************** - // ************************************************* - if ( c == 0b01111110 ) - { - /* Note this is only used on CPUs with data tracing */ - if ( report ) - { - report( V_DEBUG, "EXCEPT-ENTRY " EOL ); - } - - _stateChange( i, EV_CH_EX_ENTRY ); - retVal = TRACE_EV_MSG_RXED; - break; - } - - // ************************************************* - // ************** P-HEADER PACKET ****************** - // ************************************************* - if ( ( c & 0b10000001 ) == 0b10000000 ) - { - if ( !i->cycleAccurate ) - { - if ( ( c & 0b10000011 ) == 0b10000000 ) - { - /* Format-1 P-header */ - cpu->eatoms = ( c & 0x3C ) >> 2; - cpu->natoms = ( c & ( 1 << 6 ) ) ? 1 : 0; - cpu->instCount += cpu->eatoms + cpu->natoms; - - /* Put a 1 in each element of disposition if was executed */ - cpu->disposition = ( 1 << cpu->eatoms ) - 1; - _stateChange( i, EV_CH_ENATOMS ); - retVal = TRACE_EV_MSG_RXED; - - if ( report ) - { - report( V_DEBUG, "PHdr FMT1 (%02x E=%d, N=%d)" EOL, c, cpu->eatoms, cpu->natoms ); - } - - break; - } - - if ( ( c & 0b11110011 ) == 0b10000010 ) - { - /* Format-2 P-header */ - cpu->eatoms = ( ( c & ( 1 << 2 ) ) == 0 ) + ( ( c & ( 1 << 3 ) ) == 0 ); - cpu->natoms = 2 - cpu->eatoms; - - cpu->disposition = ( ( c & ( 1 << 3 ) ) == 0 ) | - ( ( ( c & ( 1 << 2 ) ) == 0 ) << 1 ); - - _stateChange( i, EV_CH_ENATOMS ); - cpu->instCount += cpu->eatoms + cpu->natoms; - retVal = TRACE_EV_MSG_RXED; - - if ( report ) - { - report( V_DEBUG, "PHdr FMT2 (E=%d, N=%d)" EOL, cpu->eatoms, cpu->natoms ); - } - - break; - } - - if ( report ) - { - report( V_ERROR, "Unprocessed P-Header (%02X)" EOL, c ); - } - } - else - { - if ( c == 0b10000000 ) - { - /* Format 0 cycle-accurate P-header */ - cpu->watoms = 1; - cpu->instCount += cpu->watoms; - cpu->eatoms = cpu->natoms = 0; - _stateChange( i, EV_CH_ENATOMS ); - _stateChange( i, EV_CH_WATOMS ); - retVal = TRACE_EV_MSG_RXED; - - if ( report ) - { - report( V_DEBUG, "CA PHdr FMT0 (W=%d)" EOL, cpu->watoms ); - } - - break; - } - - if ( ( c & 0b10100011 ) == 0b10000000 ) - { - /* Format 1 cycle-accurate P-header */ - cpu->eatoms = ( c & 0x1c ) >> 2; - cpu->natoms = ( c & 0x40 ) != 0; - cpu->watoms = cpu->eatoms + cpu->natoms; - cpu->instCount += cpu->watoms; - cpu->disposition = ( 1 << cpu->eatoms ) - 1; - _stateChange( i, EV_CH_ENATOMS ); - _stateChange( i, EV_CH_WATOMS ); - retVal = TRACE_EV_MSG_RXED; - - if ( report ) - { - report( V_DEBUG, "CA PHdr FMT1 (E=%d, N=%d)" EOL, cpu->eatoms, cpu->natoms ); - } - - break; - } - - if ( ( c & 0b11110011 ) == 0b10000010 ) - { - /* Format 2 cycle-accurate P-header */ - cpu->eatoms = ( ( c & ( 1 << 2 ) ) != 0 ) + ( ( c & ( 1 << 3 ) ) != 0 ); - cpu->natoms = 2 - cpu->eatoms; - cpu->watoms = 1; - cpu->instCount += cpu->watoms; - cpu->disposition = ( ( c & ( 1 << 3 ) ) != 0 ) | ( ( c & ( 1 << 2 ) ) != 0 ); - _stateChange( i, EV_CH_ENATOMS ); - _stateChange( i, EV_CH_WATOMS ); - retVal = TRACE_EV_MSG_RXED; - - if ( report ) - { - report( V_DEBUG, "CA PHdr FMT2 (E=%d, N=%d, W=1)" EOL, cpu->eatoms, cpu->natoms ); - } - - break; - } - - if ( ( c & 0b10100000 ) == 0b10100000 ) - { - /* Format 3 cycle-accurate P-header */ - cpu->eatoms = ( c & 0x40 ) != 0; - cpu->natoms = 0; - cpu->watoms = ( c & 0x1c ) >> 2; - cpu->instCount += cpu->watoms; - /* Either 1 or 0 eatoms */ - cpu->disposition = cpu->eatoms; - _stateChange( i, EV_CH_ENATOMS ); - _stateChange( i, EV_CH_WATOMS ); - retVal = TRACE_EV_MSG_RXED; - - if ( report ) - { - report( V_DEBUG, "CA PHdr FMT3 (E=%d, N=%d W=%d)" EOL, cpu->eatoms, cpu->natoms, cpu->watoms ); - } - - break; - } - - if ( ( c & 0b11111011 ) == 0b10010010 ) - { - /* Format 4 cycle-accurate P-header */ - cpu->eatoms = ( c & 0x4 ) != 0; - cpu->natoms = ( c & 0x4 ) == 0; - cpu->watoms = 0; - - /* Either 1 or 0 eatoms */ - cpu->disposition = cpu->eatoms; - _stateChange( i, EV_CH_ENATOMS ); - _stateChange( i, EV_CH_WATOMS ); - retVal = TRACE_EV_MSG_RXED; - - if ( report ) - { - report( V_DEBUG, "CA PHdr FMT4 (E=%d, N=%d W=%d)" EOL, cpu->eatoms, cpu->natoms, cpu->watoms ); - } - - break; - } - - if ( report ) - { - report( V_ERROR, "Unprocessed Cycle-accurate P-Header (%02X)" EOL, c ); - } - } - - break; - } - - break; - - - // ----------------------------------------------------- - // ADDRESS COLLECTION RELATED ACTIVITIES - // ----------------------------------------------------- - - case TRACE_COLLECT_BA_ALT_FORMAT: /* Collecting a branch address, alt format */ - C = c & 0x80; - /* This is a proper mess. Mask and collect bits according to address mode in use and */ - /* if it's the last byte of the sequence */ - mask = C ? 0x7f : 0x3f; - ofs = ( cpu->addrMode == TRACE_ADDRMODE_ARM ) ? 1 : ( cpu->addrMode == TRACE_ADDRMODE_THUMB ) ? 0 : -1; - - - i->addrConstruct = ( i->addrConstruct & ~( mask << ( 7 * i->byteCount + ofs ) ) ) - | ( ( c & mask ) << ( 7 * i->byteCount + ofs ) ); - /* There is exception information only if no continuation and bit 6 set */ - X = ( ( !C ) && ( c & 0x40 ) ); - i->byteCount++; - goto terminateAddrByte; - - // ----------------------------------------------------- - - case TRACE_COLLECT_BA_STD_FORMAT: /* Collecting a branch address, standard format */ - /* This will potentially collect too many bits, but that is OK */ - ofs = ( cpu->addrMode == TRACE_ADDRMODE_ARM ) ? 1 : ( cpu->addrMode == TRACE_ADDRMODE_THUMB ) ? 0 : -1; - i->addrConstruct = ( i->addrConstruct & ~( 0x7F << ( ( 7 * i->byteCount ) + ofs ) ) ) | ( c & ( 0x7F << ( ( 7 * i->byteCount ) + ofs ) ) ); - i->byteCount++; - C = ( i->byteCount < 5 ) ? c & 0x80 : c & 0x40; - X = ( i->byteCount == 5 ) && C; - goto terminateAddrByte; - - // ----------------------------------------------------- - - /* For all cases, see if the address is complete, and process if so */ - /* this is a continuation of TRACE_COLLECT_BA_???_FORMAT. */ - terminateAddrByte: - - /* Check to see if this packet is complete, and encode to return if so */ - if ( ( !C ) || ( i->byteCount == 5 ) ) - { - cpu->addr = i->addrConstruct; - - if ( ( i->byteCount == 5 ) && ( cpu->addrMode == TRACE_ADDRMODE_ARM ) && C ) - { - /* There is (legacy) exception information in here */ - cpu->exception = ( c >> 4 ) & 0x07; - _stateChange( i, EV_CH_EXCEPTION ); - _stateChange( i, ( ( c & 0x40 ) != 0 ) ? EV_CH_CANCELLED : 0 ); - newState = TRACE_IDLE; - retVal = TRACE_EV_MSG_RXED; - - if ( report ) - { - report( V_DEBUG, "Branch to %08x with exception %d" EOL, cpu->addr, cpu->exception ); - } - - break; - } - - if ( ( !C ) & ( !X ) ) - { - /* This packet is complete, so can return it */ - newState = TRACE_IDLE; - retVal = TRACE_EV_MSG_RXED; - - if ( report ) - { - report( V_DEBUG, "Branch to %08x" EOL, cpu->addr ); - } - } - else - { - /* This packet also contains exception information, so collect it */ - i->byteCount = 0; /* Used as a flag of which byte of exception we're collecting */ - cpu->resume = 0; - _stateChange( i, EV_CH_EX_ENTRY ); - newState = TRACE_COLLECT_EXCEPTION; - } - } - - break; - - // ----------------------------------------------------- - - case TRACE_COLLECT_EXCEPTION: /* Collecting exception information */ - if ( i->byteCount == 0 ) - { - if ( ( ( c & ( 1 << 0 ) ) != 0 ) != cpu->nonSecure ) - { - cpu->nonSecure = ( ( c & ( 1 << 0 ) ) != 0 ); - _stateChange( i, EV_CH_SECURE ); - } - - cpu->exception = ( c >> 1 ) & 0x0f; - _stateChange( i, ( ( c & ( 1 << 5 ) ) != 0 ) ? EV_CH_CANCELLED : 0 ); - - if ( cpu->altISA != ( ( c & ( 1 << 6 ) ) != 0 ) ) - { - cpu->altISA = ( ( c & ( 1 << 6 ) ) != 0 ); - _stateChange( i, EV_CH_ALTISA ); - } - - if ( c & 0x80 ) - { - i->byteCount++; - } - else - { - if ( report ) - { - report( V_ERROR, "Exception jump (%d) to 0x%08x" EOL, cpu->exception, cpu->addr ); - } - - newState = TRACE_IDLE; - retVal = TRACE_EV_MSG_RXED; - } - } - else - { - if ( c & 0x80 ) - { - /* This is exception byte 1 */ - cpu->exception |= ( c & 0x1f ) << 4; - - if ( cpu->hyp != ( ( c & ( 1 << 5 ) ) != 0 ) ) - { - cpu->hyp = ( ( c & ( 1 << 5 ) ) != 0 ); - _stateChange( i, EV_CH_HYP ); - } - - if ( !( c & 0x40 ) ) - { - /* There will not be another one along, return idle */ - if ( report ) - { - report( V_ERROR, "Exception jump (%d) to 0x%08x" EOL, cpu->exception, cpu->addr ); - } - - newState = TRACE_IDLE; - retVal = TRACE_EV_MSG_RXED; - } - } - else - { - /* This is exception byte 2 */ - cpu->resume = ( c & 0xf ); - - if ( cpu->resume ) - { - _stateChange( i, EV_CH_RESUME ); - } - - /* Exception byte 2 is always the last one, return */ - - if ( report ) - { - report( V_ERROR, "Exception jump %s(%d) to 0x%08x" EOL, cpu->resume ? "with resume " : "", cpu->exception, cpu->addr ); - } - - newState = TRACE_IDLE; - retVal = TRACE_EV_MSG_RXED; - } - } - - break; - - - // ----------------------------------------------------- - // VMID RELATED ACTIVITIES - // ----------------------------------------------------- - case TRACE_GET_VMID: /* Collecting virtual machine ID */ - if ( cpu->vmid != c ) - { - cpu->vmid = c; - _stateChange( i, EV_CH_VMID ); - } - - if ( report ) - { - report( V_ERROR, "VMID Set to (%d)" EOL, cpu->vmid ); - } - - newState = TRACE_IDLE; - retVal = TRACE_EV_MSG_RXED; - break; - - // ----------------------------------------------------- - // TIMESTAMP RELATED ACTIVITIES - // ----------------------------------------------------- - - case TRACE_GET_TSTAMP: /* Collecting current timestamp */ - if ( i->byteCount < 8 ) - { - i->tsConstruct = ( i->tsConstruct & ( ~( 0x7F << i->byteCount ) ) ) | ( ( c & 0x7f ) << i->byteCount ); - } - else - { - i->tsConstruct = ( i->tsConstruct & ( ~( 0xff << i->byteCount ) ) ) | ( ( c & 0xff ) << i->byteCount ); - } - - i->byteCount++; - - if ( ( !( c & 0x80 ) ) || ( i->byteCount == 9 ) ) - { - newState = TRACE_IDLE; - cpu->ts = i->tsConstruct; - _stateChange( i, EV_CH_TSTAMP ); - - if ( report ) - { - report( V_ERROR, "CPU Timestamp %d" EOL, cpu->ts ); - } - - retVal = TRACE_EV_MSG_RXED; - } +/* Individual trace decoders defined in their own file */ +extern struct TRACEDecoderEngine *ETM35DecoderPumpCreate( void ); +extern struct TRACEDecoderEngine *MTBDecoderPumpCreate( void ); +extern struct TRACEDecoderEngine *ETM4DecoderPumpCreate( void ); - break; +static struct TRACEDecoderEngine *( *_engine[TRACE_PROT_NUM] )( void ) = { ETM35DecoderPumpCreate, MTBDecoderPumpCreate, ETM4DecoderPumpCreate }; +static const char *TRACEprotocolString[TRACE_PROT_NUM] = { TRACEprotocolStrings }; - // ----------------------------------------------------- - // CYCLECOUNT RELATED ACTIVITIES - // ----------------------------------------------------- - - case TRACE_GET_CYCLECOUNT: /* Collecting cycle count as standalone packet */ - i->cycleConstruct = ( i->cycleConstruct & ~( 0x7f << ( ( i->byteCount ) * 7 ) ) ) | ( ( c & 0x7f ) << ( ( i->byteCount ) * 7 ) ); - i->byteCount++; - - if ( ( !( c & ( 1 << 7 ) ) ) || ( i->byteCount == 5 ) ) - { - newState = TRACE_IDLE; - cpu->cycleCount = i->cycleConstruct; - _stateChange( i, EV_CH_CYCLECOUNT ); - - if ( report ) - { - report( V_ERROR, "Cyclecount %d" EOL, cpu->cycleCount ); - } - - retVal = TRACE_EV_MSG_RXED; - } - - break; - - - // ----------------------------------------------------- - // CONTEXTID RELATED ACTIVITIES - // ----------------------------------------------------- - - case TRACE_GET_CONTEXTID: /* Collecting contextID */ - i->contextConstruct = i->contextConstruct + ( c << ( 8 * i->byteCount ) ); - i->byteCount++; - - if ( i->byteCount == i->contextBytes ) - { - if ( cpu->contextID != i->contextConstruct ) - { - cpu->contextID = i->contextConstruct; - _stateChange( i, EV_CH_CONTEXTID ); - } - - if ( report ) - { - report( V_ERROR, "CPU ContextID %d" EOL, cpu->contextID ); - } - - retVal = TRACE_EV_MSG_RXED; - newState = TRACE_IDLE; - } - - break; - - - // ----------------------------------------------------- - // I-SYNC RELATED ACTIVITIES - // ----------------------------------------------------- - - case TRACE_WAIT_ISYNC: - if ( c == 0b00001000 ) - { - if ( !i->rxedISYNC ) - { - retVal = TRACE_EV_SYNCED; - i->rxedISYNC = true; - } - - i->byteCount = i->contextBytes; - i->contextConstruct = 0; - newState = i->contextBytes ? TRACE_GET_CONTEXTBYTE : TRACE_GET_INFOBYTE; - } - - break; - - // ----------------------------------------------------- - - case TRACE_GET_CONTEXTBYTE: /* Collecting I-Sync contextID bytes */ - i->contextConstruct = i->contextConstruct + ( c << ( 8 * i->byteCount ) ); - i->byteCount++; - - if ( i->byteCount == i->contextBytes ) - { - if ( cpu->contextID != i->contextConstruct ) - { - cpu->contextID = i->contextConstruct; - _stateChange( i, EV_CH_CONTEXTID ); - } - - newState = TRACE_GET_INFOBYTE; - } - - break; - - // ----------------------------------------------------- - - case TRACE_GET_INFOBYTE: /* Collecting I-Sync Information byte */ - if ( ( ( c & 0x10000000 ) != 0 ) != cpu->isLSiP ) - { - cpu->isLSiP = ( c & 0x10000000 ) != 0; - _stateChange( i, EV_CH_ISLSIP ); - } - - if ( cpu->reason != ( ( c & 0x01100000 ) >> 5 ) ) - { - cpu->reason = ( c & 0x01100000 ) >> 5; - _stateChange( i, EV_CH_REASON ); - } - - if ( cpu->jazelle != ( ( c & 0x00010000 ) != 0 ) ) - { - cpu->jazelle = ( c & 0x00010000 ) != 0; - _stateChange( i, EV_CH_JAZELLE ); - } - - if ( cpu->nonSecure != ( ( c & 0x00001000 ) != 0 ) ) - { - cpu->nonSecure = ( c & 0x00001000 ) != 0; - _stateChange( i, EV_CH_SECURE ); - } - - if ( cpu->altISA != ( ( c & 0x00000100 ) != 0 ) ) - { - cpu->altISA = ( c & 0x00000100 ) != 0; - _stateChange( i, EV_CH_ALTISA ); - } - - if ( cpu->hyp != ( ( c & 0x00000010 ) != 0 ) ) - { - cpu->hyp = ( c & 0x00000010 ) != 0; - _stateChange( i, EV_CH_HYP ); - } - - i->byteCount = 0; - - if ( i->dataOnlyMode ) - { - if ( report ) - { - report( V_ERROR, "ISYNC in dataOnlyMode" EOL ); - } - - retVal = TRACE_EV_MSG_RXED; - newState = TRACE_IDLE; - } - else - { - newState = TRACE_GET_IADDRESS; - } - - break; - - // ----------------------------------------------------- - - case TRACE_GET_IADDRESS: /* Collecting I-Sync Address bytes */ - i->addrConstruct = ( i->addrConstruct & ( ~( 0xff << ( 8 * i->byteCount ) ) ) ) | ( c << ( 8 * i->byteCount ) ) ; - i->byteCount++; - - if ( i->byteCount == 4 ) - { - _stateChange( i, EV_CH_ADDRESS ); - - if ( cpu->jazelle ) - { - /* This is Jazelle mode..can ignore the AltISA bit */ - /* and bit 0 is bit 0 of the address */ - cpu->addrMode = TRACE_ADDRMODE_JAZELLE; - cpu->addr = i->addrConstruct; - } - else - { - if ( ( i->addrConstruct & ( 1 << 0 ) ) ^ ( !cpu->thumb ) ) - { - cpu->thumb = ( c & 0x00000001 ) != 0; - _stateChange( i, EV_CH_THUMB ); - } - - if ( i->addrConstruct & ( 1 << 0 ) ) - { - cpu->addrMode = TRACE_ADDRMODE_THUMB; - i->addrConstruct &= ~( 1 << 0 ); - cpu->addr = i->addrConstruct; - } - else - { - cpu->addrMode = TRACE_ADDRMODE_ARM; - cpu->addr = i->addrConstruct & 0xFFFFFFFC; - } - } - - if ( cpu->isLSiP ) - { - /* If this is an LSiP packet we need to go get the address */ - newState = ( i->usingAltAddrEncode ) ? TRACE_COLLECT_BA_ALT_FORMAT : TRACE_COLLECT_BA_STD_FORMAT; - } - else - { - if ( report ) - { - report( V_ERROR, "ISYNC with IADDRESS 0x%08x" EOL, cpu->addr ); - } - - newState = TRACE_IDLE; - retVal = TRACE_EV_MSG_RXED; - } - } - - break; - - // ----------------------------------------------------- - - case TRACE_GET_ICYCLECOUNT: /* Collecting cycle count on front of ISYNC packet */ - i->cycleConstruct = ( i->cycleConstruct & ~( 0x7f << ( ( i->byteCount ) * 7 ) ) ) | ( ( c & 0x7f ) << ( ( i->byteCount ) * 7 ) ); - i->byteCount++; - - if ( ( !( c & ( 1 << 7 ) ) ) || ( i->byteCount == 5 ) ) - { - /* Now go to get the rest of the ISYNC packet */ - /* Collect either the context or the Info Byte next */ - cpu->cycleCount = i->cycleConstruct; - i->byteCount = i->contextBytes; - i->contextConstruct = 0; - _stateChange( i, EV_CH_CYCLECOUNT ); - newState = i->contextBytes ? TRACE_GET_CONTEXTBYTE : TRACE_GET_INFOBYTE; - break; - } - - break; - - // ----------------------------------------------------- - - } - } - - if ( i->p != TRACE_UNSYNCED ) - { - if ( report ) report( V_DEBUG, "%02x:%s --> %s %s(%d)", c, ( i->p == TRACE_IDLE ) ? protoStateName[i->p] : "", protoStateName[newState], - ( ( newState == TRACE_IDLE ) ? ( ( retVal == TRACE_EV_NONE ) ? "!!!" : "OK" ) : " : " ), retVal ); - } - - i->p = newState; - - if ( ( retVal != TRACE_EV_NONE ) && ( i->rxedISYNC ) ) - { - cb( d ); - } -} -// ==================================================================================================== -static void _MTBDecoderPumpAction( struct TRACEDecoder *i, uint32_t source, uint32_t dest, traceDecodeCB cb, genericsReportCB report, void *d ) - -/* Pump next words through the protocol decoder */ - -{ - enum TRACEprotoState newState = i->p; - struct TRACECPUState *cpu = &i->cpu; - enum TRACEDecoderPumpEvent retVal = TRACE_EV_NONE; - - if ( report ) - { - report( V_ERROR, "[From 0x%08x to 0x%08x]" EOL, source, dest ); - } - - switch ( i->p ) - { - // ----------------------------------------------------- - - case TRACE_UNSYNCED: - /* For the first instruction we only have the destination */ - /* but we code the exception indication into here so we know we arrived via an exception */ - cpu->nextAddr = ( dest & 0xFFFFFFFE ) | ( source & 1 ); - - /* If the low bit of dest was set then this is a start of trace event */ - if ( dest & 1 ) - { - _stateChange( i, EV_CH_TRACESTART ); - } - - newState = TRACE_IDLE; - break; - - // ----------------------------------------------------- - - case TRACE_IDLE: - if ( cpu->nextAddr & 1 ) - { - /* If low bit of nextAddr is set then we got here via an exception */ - _stateChange( i, EV_CH_EX_ENTRY ); - } - - /* If low bit of dest is set then this is a start of trace */ - if ( dest & 1 ) - { - _stateChange( i, EV_CH_TRACESTART ); - } - - cpu->addr = cpu->nextAddr & 0xFFFFFFFE; - cpu->nextAddr = ( dest & 0xFFFFFFFE ) | ( source & 1 ); - cpu->toAddr = source & 0xFFFFFFFE; - cpu->exception = 0; /* We don't known exception cause on a M0 */ - _stateChange( i, EV_CH_ADDRESS ); - _stateChange( i, EV_CH_LINEAR ); - retVal = TRACE_EV_MSG_RXED; - break; - - // ----------------------------------------------------- - - default: - assert( false ); - break; - - // ----------------------------------------------------- - - } - - if ( retVal != TRACE_EV_NONE ) - { - cb( d ); - } - - i->p = newState; -} // ==================================================================================================== // ==================================================================================================== // ==================================================================================================== @@ -1008,33 +30,13 @@ static void _MTBDecoderPumpAction( struct TRACEDecoder *i, uint32_t source, uint // ==================================================================================================== // ==================================================================================================== // ==================================================================================================== -void TRACEDecoderInit( struct TRACEDecoder *i, enum TRACEprotocol protocol, bool usingAltAddrEncodeSet ) - -/* Reset a TRACEDecoder instance */ - -{ - memset( i, 0, sizeof( struct TRACEDecoder ) ); - TRACEDecoderZeroStats( i ); - TRACEDecodeUsingAltAddrEncode( i, usingAltAddrEncodeSet ); - TRACEDecodeProtocol( i, protocol ); -} -// ==================================================================================================== -void TRACEDecodeProtocol( struct TRACEDecoder *i, enum TRACEprotocol protocol ) +const char *TRACEDecodeGetProtocolName( enum TRACEprotocol protocol ) { assert( protocol < TRACE_PROT_LIST_END ); - assert( i ); - i->protocol = protocol; + return TRACEprotocolString[ protocol ]; } // ==================================================================================================== -void TRACEDecodeUsingAltAddrEncode( struct TRACEDecoder *i, bool usingAltAddrEncodeSet ) - -{ - assert( i ); - i->usingAltAddrEncode = usingAltAddrEncodeSet; -} -// ==================================================================================================== - void TRACEDecoderZeroStats( struct TRACEDecoder *i ) { @@ -1046,7 +48,8 @@ bool TRACEDecoderIsSynced( struct TRACEDecoder *i ) { assert( i ); - return i->p != TRACE_UNSYNCED; + assert( i->engine ); + return i->engine->synced( i->engine ); } // ==================================================================================================== struct TRACEDecoderStats *TRACEDecoderGetStats( struct TRACEDecoder *i ) @@ -1060,6 +63,15 @@ struct TRACECPUState *TRACECPUState( struct TRACEDecoder *i ) return &i->cpu; } // ==================================================================================================== +const char *TRACEExceptionName( int exceptionNumber ) + +{ + return ( ( char *[] ) + {"???", "PE Reset", "NMI", "HardFault", "MemManage", "BusFault", "UsageFault", "SecureFault", "???", "???", "???", "SVC", "Debug Monitor", "???", "PendSV", "SysTick", "IRQ" + } )[( exceptionNumber < 16 ) ? exceptionNumber : 16]; +} +// ==================================================================================================== + bool TRACEStateChanged( struct TRACEDecoder *i, enum TRACEchanges c ) { bool r = ( i->cpu.changeRecord & ( 1 << c ) ) != 0; @@ -1073,28 +85,24 @@ void TRACEDecoderForceSync( struct TRACEDecoder *i, bool isSynced ) { assert( i ); + assert( i->engine ); - if ( i->p == TRACE_UNSYNCED ) + if ( isSynced ) { - if ( isSynced ) - { - i->p = TRACE_IDLE; - i->stats.syncCount++; - } + i->stats.syncCount++; } else { - if ( !isSynced ) + if ( TRACEDecoderIsSynced( i ) ) { i->stats.lostSyncCount++; - i->asyncCount = 0; - i->rxedISYNC = false; - i->p = TRACE_UNSYNCED; } } + + i->engine->forceSync( i->engine, isSynced ); } // ==================================================================================================== -void TRACEDecoderPump( struct TRACEDecoder *i, uint8_t *buf, int len, traceDecodeCB cb, genericsReportCB report, void *d ) +void TRACEDecoderPump( struct TRACEDecoder *i, uint8_t *buf, int len, traceDecodeCB cb, void *d ) { assert( i ); @@ -1103,32 +111,57 @@ void TRACEDecoderPump( struct TRACEDecoder *i, uint8_t *buf, int len, traceDecod /* len can arrive as 0 for the case of an unwrapped buffer */ - switch ( i->protocol ) + if ( i->engine->action ) { - case TRACE_PROT_ETM35: - while ( len-- ) + while ( len-- ) + { + if ( i->engine->action( i->engine, &i->cpu, *( buf++ ) ) ) { - /* ETM processes one octet at a time */ - _ETM35DecoderPumpAction( i, *( buf++ ), cb, report, d ); + /* Something worthy of being reported happened */ + cb( d ); } + } - break; - - case TRACE_PROT_MTB: - while ( len > 7 ) + } + else if ( i->engine->actionPair ) + { + while ( len > 7 ) + { + /* MTB processes two words at a time...a from and to address */ + /* (yes, that could be +1 on a uint32_t increment, but I prefer being explicit) */ + if ( i->engine->actionPair( i->engine, &i->cpu, *( uint32_t * )buf, *( uint32_t * )( buf + 4 ) ) ) { - /* MTB processes two words at a time...a from and to address */ - /* (yes, that could be +1 on a uint32_t increment, but I prefer being explicit) */ - _MTBDecoderPumpAction( i, *( uint32_t * )buf, *( uint32_t * )( buf + 4 ), cb, report, d ); - buf += 8; - len -= 8; + /* Something worthy of being reported happened */ + cb( d ); } - break; + buf += 8; + len -= 8; + } + } +} +// ==================================================================================================== +void TRACEDecoderInit( struct TRACEDecoder *i, enum TRACEprotocol protocol, bool usingAltAddrEncodeSet, genericsReportCB report ) + +/* Reset a TRACEDecoder instance */ + +{ + assert( protocol < TRACE_PROT_NUM ); - default: - assert( false ); - break; + memset( i, 0, sizeof( struct TRACEDecoder ) ); + + TRACEDecoderZeroStats( i ); + i->cpu.addr = ADDRESS_UNKNOWN; + i->cpu.cycleCount = COUNT_UNKNOWN; + i->cpu.report = report; + i->protocol = protocol; + + i->engine = _engine[ protocol ](); + + if ( i->engine->altAddrEncode ) + { + i->engine->altAddrEncode( i->engine, usingAltAddrEncodeSet ); } } // ==================================================================================================== + diff --git a/Src/traceDecoder_etm35.c b/Src/traceDecoder_etm35.c new file mode 100644 index 00000000..ba456674 --- /dev/null +++ b/Src/traceDecoder_etm35.c @@ -0,0 +1,894 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ + +/* + * ETM3.5 TRACE Decoder Module + * =========================== + * + * Implementation of ITM/DWT decode according to the specification in Appendix D4 + * of the ARMv7-M Architecture Refrence Manual document available + * from https://static.docs.arm.com/ddi0403/e/DDI0403E_B_armv7m_arm.pdf + */ + +#include +#include +#include +#include "msgDecoder.h" +#include "traceDecoder.h" +#include "generics.h" + +/* Internal states of the protocol machine */ +enum TRACE_ETM35protoState +{ + TRACE_UNSYNCED, + TRACE_WAIT_ISYNC, + TRACE_IDLE, + TRACE_COLLECT_BA_STD_FORMAT, + TRACE_COLLECT_BA_ALT_FORMAT, + TRACE_COLLECT_EXCEPTION, + TRACE_GET_CONTEXTBYTE, + TRACE_GET_INFOBYTE, + TRACE_GET_IADDRESS, + TRACE_GET_ICYCLECOUNT, + TRACE_GET_CYCLECOUNT, + TRACE_GET_VMID, + TRACE_GET_TSTAMP, + TRACE_GET_CONTEXTID +}; + +static const char *_protoStateName[] = +{ + "UNSYNCED", "WAIT_ISYNC", "IDLE", "COLLECT_BA_STD", + "COLLECT_BA_ALT", "COLLECT_EXCEPTION", "WAIT_CONTEXTBYTE", "WAIT_INFOBYTE", + "WAIT_IADDRESS", "WAIT_ICYCLECOUNT", "WAIT_CYCLECOUNT", "GET_VMID", + "GET_TSTAMP", "GET_CONTEXTID" +}; + +struct ETM35DecodeState +{ + struct TRACEDecoderEngine e; /* Must be first to allow object method access */ + enum TRACE_ETM35protoState p; /* Current state of the receiver */ + + bool usingAltAddrEncode; /* Set if the new (TRACE 3.4 onwards) addr formatting is used */ + bool dataOnlyMode; /* If we're only tracing data, not instructions */ + uint8_t contextBytes; /* How many context bytes we're using */ + + /* Purely internal matters.... */ + /* --------------------------- */ + uint64_t tsConstruct; /* Timestamp under construction */ + uint32_t asyncCount; /* Count of 0's in preparation for ASYNC recognition */ + uint32_t addrConstruct; /* Address under construction */ + uint32_t byteCount; /* How many bytes of this packet do we have? */ + uint32_t cycleConstruct; /* Cycle count under construction */ + uint32_t contextConstruct; /* Context under construction */ + bool rxedISYNC; /* Indicator that we're fully synced */ + bool cycleAccurate; /* Using cycle accurate mode */ +}; + +#define DEBUG(...) { if ( cpu->report ) cpu->report( V_DEBUG, __VA_ARGS__); } +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== +// Internal routines - decoder support +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== + +static void _stateChange( struct TRACECPUState *cpu, enum TRACEchanges c ) +{ + cpu->changeRecord |= ( 1 << c ); +} +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== +// Externally available routines +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== +static bool _pumpAction( struct TRACEDecoderEngine *e, struct TRACECPUState *cpu, uint8_t c ) + +/* Pump next byte into the protocol decoder */ + +{ + bool C; /* Is address packet continued? */ + bool X = false; /* Is there exception information following address */ + int8_t ofs; /* Offset for bits in address calculation */ + uint8_t mask; /* Mask for bits in address calculation */ + + struct ETM35DecodeState *j = ( struct ETM35DecodeState * )e; + enum TRACE_ETM35protoState newState = j->p; + enum TRACEDecoderPumpEvent retVal = TRACE_EV_NONE; + + /* Perform A-Sync accumulation check */ + if ( ( j->asyncCount >= 5 ) && ( c == 0x80 ) ) + { + DEBUG( "A-Sync Accumulation complete" EOL ); + newState = TRACE_IDLE; + } + else + { + j->asyncCount = c ? 0 : j->asyncCount + 1; + + switch ( j->p ) + { + // ----------------------------------------------------- + case TRACE_UNSYNCED: + break; + + // ----------------------------------------------------- + + case TRACE_IDLE: + + // ************************************************* + // ************** BRANCH PACKET ******************** + // ************************************************* + if ( c & 0b1 ) + { + /* The lowest order 6 bits of address info... */ + + switch ( cpu->addrMode ) + { + case TRACE_ADDRMODE_ARM: + j->addrConstruct = ( j->addrConstruct & ~( 0b11111100 ) ) | ( ( c & 0b01111110 ) << 1 ); + break; + + case TRACE_ADDRMODE_THUMB: + j->addrConstruct = ( j->addrConstruct & ~( 0b01111111 ) ) | ( c & 0b01111110 ); + break; + + case TRACE_ADDRMODE_JAZELLE: + j->addrConstruct = ( j->addrConstruct & ~( 0b00111111 ) ) | ( ( c & 0b01111110 ) >> 1 ); + break; + } + + j->byteCount = 1; + C = ( c & 0x80 ) != 0; + X = false; + _stateChange( cpu, EV_CH_ADDRESS ); + + newState = ( j->usingAltAddrEncode ) ? TRACE_COLLECT_BA_ALT_FORMAT : TRACE_COLLECT_BA_STD_FORMAT; + goto terminateAddrByte; + } + + // ************************************************* + // ************** A-SYNC PACKET ******************** + // ************************************************* + if ( c == 0b00000000 ) + { + break; + } + + // ************************************************* + // ************ CYCLECOUNT PACKET ****************** + // ************************************************* + if ( c == 0b00000100 ) + { + DEBUG( "CYCCNT " EOL ); + j->byteCount = 0; + j->cycleConstruct = 0; + newState = TRACE_GET_CYCLECOUNT; + break; + } + + // ************************************************* + // ************** ISYNC PACKETS ******************** + // ************************************************* + if ( c == 0b00001000 ) /* Normal ISYNC */ + { + DEBUG( "Normal ISYNC " EOL ); + /* Collect either the context or the Info Byte next */ + j->byteCount = 0; + j->contextConstruct = 0; + newState = j->contextBytes ? TRACE_GET_CONTEXTBYTE : TRACE_GET_INFOBYTE; + + /* We won't start reporting data until a valid ISYNC has been received */ + if ( !j->rxedISYNC ) + { + DEBUG( "Initial ISYNC" ); + cpu->changeRecord = 0; + j->rxedISYNC = true; + } + + break; + } + + if ( c == 0b01110000 ) /* ISYNC with Cycle Count */ + { + DEBUG( "ISYNC+CYCCNT " EOL ); + /* Collect the cycle count next */ + j->byteCount = 0; + j->cycleConstruct = 0; + newState = TRACE_GET_ICYCLECOUNT; + break; + } + + // ************************************************* + // ************** TRIGGER PACKET ******************* + // ************************************************* + if ( c == 0b00001100 ) + { + DEBUG( "TRIGGER " EOL ); + _stateChange( cpu, EV_CH_TRIGGER ); + retVal = TRACE_EV_MSG_RXED; + break; + } + + // ************************************************* + // **************** VMID PACKET ******************** + // ************************************************* + if ( c == 0b00111100 ) + { + DEBUG( "VMID " EOL ); + newState = TRACE_GET_VMID; + break; + } + + // ************************************************* + // *********** TIMESTAMP PACKET ******************** + // ************************************************* + if ( ( c & 0b11111011 ) == 0b01000010 ) + { + DEBUG( "TS " EOL ); + newState = TRACE_GET_TSTAMP; + + if ( ( c & ( 1 << 2 ) ) != 0 ) + { + _stateChange( cpu, EV_CH_CLOCKSPEED ); + } + + j->byteCount = 0; + break; + } + + // ************************************************* + // ************** IGNORE PACKET ******************** + // ************************************************* + if ( c == 0b01100110 ) + { + DEBUG( "Ignore Packet" EOL ); + break; + } + + // ************************************************* + // ************ CONTEXTID PACKET ******************* + // ************************************************* + if ( c == 0b01101110 ) + { + DEBUG( "CONTEXTID " EOL ); + newState = TRACE_GET_CONTEXTID; + cpu->contextID = 0; + j->byteCount = 0; + break; + } + + // ************************************************* + // ******** EXCEPTION EXIT PACKET ****************** + // ************************************************* + if ( c == 0b01110110 ) + { + DEBUG( "EXCEPT-EXIT " EOL ); + _stateChange( cpu, EV_CH_EX_EXIT ); + retVal = TRACE_EV_MSG_RXED; + break; + } + + // ************************************************* + // ******** EXCEPTION ENTRY PACKET ***************** + // ************************************************* + if ( c == 0b01111110 ) + { + /* Note this is only used on CPUs with data tracing */ + DEBUG( "EXCEPT-ENTRY " EOL ); + _stateChange( cpu, EV_CH_EX_ENTRY ); + retVal = TRACE_EV_MSG_RXED; + break; + } + + // ************************************************* + // ************** P-HEADER PACKET ****************** + // ************************************************* + if ( ( c & 0b10000001 ) == 0b10000000 ) + { + if ( !j->cycleAccurate ) + { + if ( ( c & 0b10000011 ) == 0b10000000 ) + { + /* Format-1 P-header */ + cpu->eatoms = ( c & 0x3C ) >> 2; + cpu->natoms = ( c & ( 1 << 6 ) ) ? 1 : 0; + cpu->instCount += cpu->eatoms + cpu->natoms; + + /* Put a 1 in each element of disposition if was executed */ + cpu->disposition = ( 1 << cpu->eatoms ) - 1; + _stateChange( cpu, EV_CH_ENATOMS ); + retVal = TRACE_EV_MSG_RXED; + DEBUG( "PHdr FMT1 (%02x E=%d, N=%d)" EOL, c, cpu->eatoms, cpu->natoms ); + break; + } + + if ( ( c & 0b11110011 ) == 0b10000010 ) + { + /* Format-2 P-header */ + cpu->eatoms = ( ( c & ( 1 << 2 ) ) == 0 ) + ( ( c & ( 1 << 3 ) ) == 0 ); + cpu->natoms = 2 - cpu->eatoms; + + cpu->disposition = ( ( c & ( 1 << 3 ) ) == 0 ) | + ( ( ( c & ( 1 << 2 ) ) == 0 ) << 1 ); + + _stateChange( cpu, EV_CH_ENATOMS ); + cpu->instCount += cpu->eatoms + cpu->natoms; + retVal = TRACE_EV_MSG_RXED; + + DEBUG( "PHdr FMT2 (E=%d, N=%d)" EOL, cpu->eatoms, cpu->natoms ); + break; + } + + DEBUG( "Unprocessed P-Header (%02X)" EOL, c ); + } + else + { + if ( c == 0b10000000 ) + { + /* Format 0 cycle-accurate P-header */ + cpu->watoms = 1; + cpu->instCount += cpu->watoms; + cpu->eatoms = cpu->natoms = 0; + _stateChange( cpu, EV_CH_ENATOMS ); + _stateChange( cpu, EV_CH_WATOMS ); + retVal = TRACE_EV_MSG_RXED; + + DEBUG( "CA PHdr FMT0 (W=%d)" EOL, cpu->watoms ); + break; + } + + if ( ( c & 0b10100011 ) == 0b10000000 ) + { + /* Format 1 cycle-accurate P-header */ + cpu->eatoms = ( c & 0x1c ) >> 2; + cpu->natoms = ( c & 0x40 ) != 0; + cpu->watoms = cpu->eatoms + cpu->natoms; + cpu->instCount += cpu->watoms; + cpu->disposition = ( 1 << cpu->eatoms ) - 1; + _stateChange( cpu, EV_CH_ENATOMS ); + _stateChange( cpu, EV_CH_WATOMS ); + retVal = TRACE_EV_MSG_RXED; + + DEBUG( "CA PHdr FMT1 (E=%d, N=%d)" EOL, cpu->eatoms, cpu->natoms ); + break; + } + + if ( ( c & 0b11110011 ) == 0b10000010 ) + { + /* Format 2 cycle-accurate P-header */ + cpu->eatoms = ( ( c & ( 1 << 2 ) ) != 0 ) + ( ( c & ( 1 << 3 ) ) != 0 ); + cpu->natoms = 2 - cpu->eatoms; + cpu->watoms = 1; + cpu->instCount += cpu->watoms; + cpu->disposition = ( ( c & ( 1 << 3 ) ) != 0 ) | ( ( c & ( 1 << 2 ) ) != 0 ); + _stateChange( cpu, EV_CH_ENATOMS ); + _stateChange( cpu, EV_CH_WATOMS ); + retVal = TRACE_EV_MSG_RXED; + + DEBUG( "CA PHdr FMT2 (E=%d, N=%d, W=1)" EOL, cpu->eatoms, cpu->natoms ); + break; + } + + if ( ( c & 0b10100000 ) == 0b10100000 ) + { + /* Format 3 cycle-accurate P-header */ + cpu->eatoms = ( c & 0x40 ) != 0; + cpu->natoms = 0; + cpu->watoms = ( c & 0x1c ) >> 2; + cpu->instCount += cpu->watoms; + /* Either 1 or 0 eatoms */ + cpu->disposition = cpu->eatoms; + _stateChange( cpu, EV_CH_ENATOMS ); + _stateChange( cpu, EV_CH_WATOMS ); + retVal = TRACE_EV_MSG_RXED; + + DEBUG( "CA PHdr FMT3 (E=%d, N=%d W=%d)" EOL, cpu->eatoms, cpu->natoms, cpu->watoms ); + break; + } + + if ( ( c & 0b11111011 ) == 0b10010010 ) + { + /* Format 4 cycle-accurate P-header */ + cpu->eatoms = ( c & 0x4 ) != 0; + cpu->natoms = ( c & 0x4 ) == 0; + cpu->watoms = 0; + + /* Either 1 or 0 eatoms */ + cpu->disposition = cpu->eatoms; + _stateChange( cpu, EV_CH_ENATOMS ); + _stateChange( cpu, EV_CH_WATOMS ); + retVal = TRACE_EV_MSG_RXED; + + DEBUG( "CA PHdr FMT4 (E=%d, N=%d W=%d)" EOL, cpu->eatoms, cpu->natoms, cpu->watoms ); + break; + } + + DEBUG( "Unprocessed Cycle-accurate P-Header (%02X)" EOL, c ); + } + + break; + } + + break; + + + // ----------------------------------------------------- + // ADDRESS COLLECTION RELATED ACTIVITIES + // ----------------------------------------------------- + + case TRACE_COLLECT_BA_ALT_FORMAT: /* Collecting a branch address, alt format */ + C = c & 0x80; + /* This is a proper mess. Mask and collect bits according to address mode in use and */ + /* if it's the last byte of the sequence */ + mask = C ? 0x7f : 0x3f; + ofs = ( cpu->addrMode == TRACE_ADDRMODE_ARM ) ? 1 : ( cpu->addrMode == TRACE_ADDRMODE_THUMB ) ? 0 : -1; + + + j->addrConstruct = ( j->addrConstruct & ~( mask << ( 7 * j->byteCount + ofs ) ) ) + | ( ( c & mask ) << ( 7 * j->byteCount + ofs ) ); + /* There is exception information only if no continuation and bit 6 set */ + X = ( ( !C ) && ( c & 0x40 ) ); + j->byteCount++; + goto terminateAddrByte; + + // ----------------------------------------------------- + + case TRACE_COLLECT_BA_STD_FORMAT: /* Collecting a branch address, standard format */ + /* This will potentially collect too many bits, but that is OK */ + ofs = ( cpu->addrMode == TRACE_ADDRMODE_ARM ) ? 1 : ( cpu->addrMode == TRACE_ADDRMODE_THUMB ) ? 0 : -1; + j->addrConstruct = ( j->addrConstruct & ~( 0x7F << ( ( 7 * j->byteCount ) + ofs ) ) ) | ( c & ( 0x7F << ( ( 7 * j->byteCount ) + ofs ) ) ); + j->byteCount++; + C = ( j->byteCount < 5 ) ? c & 0x80 : c & 0x40; + X = ( j->byteCount == 5 ) && C; + goto terminateAddrByte; + + // ----------------------------------------------------- + + /* For all cases, see if the address is complete, and process if so */ + /* this is a continuation of TRACE_COLLECT_BA_???_FORMAT. */ + terminateAddrByte: + + /* Check to see if this packet is complete, and encode to return if so */ + if ( ( !C ) || ( j->byteCount == 5 ) ) + { + cpu->addr = j->addrConstruct; + + if ( ( j->byteCount == 5 ) && ( cpu->addrMode == TRACE_ADDRMODE_ARM ) && C ) + { + /* There is (legacy) exception information in here */ + cpu->exception = ( c >> 4 ) & 0x07; + _stateChange( cpu, EV_CH_EX_ENTRY ); + _stateChange( cpu, ( ( c & 0x40 ) != 0 ) ? EV_CH_CANCELLED : 0 ); + newState = TRACE_IDLE; + retVal = TRACE_EV_MSG_RXED; + + DEBUG( "Branch to %08x with exception %d" EOL, cpu->addr, cpu->exception ); + break; + } + + if ( ( !C ) & ( !X ) ) + { + /* This packet is complete, so can return it */ + newState = TRACE_IDLE; + retVal = TRACE_EV_MSG_RXED; + DEBUG( "Branch to %08x" EOL, cpu->addr ); + } + else + { + /* This packet also contains exception information, so collect it */ + j->byteCount = 0; /* Used as a flag of which byte of exception we're collecting */ + cpu->resume = 0; + _stateChange( cpu, EV_CH_EX_ENTRY ); + newState = TRACE_COLLECT_EXCEPTION; + } + } + + break; + + // ----------------------------------------------------- + + case TRACE_COLLECT_EXCEPTION: /* Collecting exception information */ + if ( j->byteCount == 0 ) + { + if ( ( ( c & ( 1 << 0 ) ) != 0 ) != cpu->nonSecure ) + { + cpu->nonSecure = ( ( c & ( 1 << 0 ) ) != 0 ); + _stateChange( cpu, EV_CH_SECURE ); + } + + cpu->exception = ( c >> 1 ) & 0x0f; + _stateChange( cpu, ( ( c & ( 1 << 5 ) ) != 0 ) ? EV_CH_CANCELLED : 0 ); + + if ( cpu->altISA != ( ( c & ( 1 << 6 ) ) != 0 ) ) + { + cpu->altISA = ( ( c & ( 1 << 6 ) ) != 0 ); + _stateChange( cpu, EV_CH_ALTISA ); + } + + if ( c & 0x80 ) + { + j->byteCount++; + } + else + { + DEBUG( "Exception jump (%d) to 0x%08x" EOL, cpu->exception, cpu->addr ); + newState = TRACE_IDLE; + retVal = TRACE_EV_MSG_RXED; + } + } + else + { + if ( c & 0x80 ) + { + /* This is exception byte 1 */ + cpu->exception |= ( c & 0x1f ) << 4; + + if ( cpu->hyp != ( ( c & ( 1 << 5 ) ) != 0 ) ) + { + cpu->hyp = ( ( c & ( 1 << 5 ) ) != 0 ); + _stateChange( cpu, EV_CH_HYP ); + } + + if ( !( c & 0x40 ) ) + { + /* There will not be another one along, return idle */ + DEBUG( "Exception jump (%d) to 0x%08x" EOL, cpu->exception, cpu->addr ); + newState = TRACE_IDLE; + retVal = TRACE_EV_MSG_RXED; + } + } + else + { + /* This is exception byte 2 */ + cpu->resume = ( c & 0xf ); + + if ( cpu->resume ) + { + _stateChange( cpu, EV_CH_RESUME ); + } + + /* Exception byte 2 is always the last one, return */ + DEBUG( "Exception jump %s(%d) to 0x%08x" EOL, cpu->resume ? "with resume " : "", cpu->exception, cpu->addr ); + newState = TRACE_IDLE; + retVal = TRACE_EV_MSG_RXED; + } + } + + break; + + + // ----------------------------------------------------- + // VMID RELATED ACTIVITIES + // ----------------------------------------------------- + case TRACE_GET_VMID: /* Collecting virtual machine ID */ + if ( cpu->vmid != c ) + { + cpu->vmid = c; + _stateChange( cpu, EV_CH_VMID ); + } + + DEBUG( "VMID Set to (%d)" EOL, cpu->vmid ); + newState = TRACE_IDLE; + retVal = TRACE_EV_MSG_RXED; + break; + + // ----------------------------------------------------- + // TIMESTAMP RELATED ACTIVITIES + // ----------------------------------------------------- + + case TRACE_GET_TSTAMP: /* Collecting current timestamp */ + if ( j->byteCount < 8 ) + { + j->tsConstruct = ( j->tsConstruct & ( ~( 0x7F << j->byteCount ) ) ) | ( ( c & 0x7f ) << j->byteCount ); + } + else + { + j->tsConstruct = ( j->tsConstruct & ( ~( 0xff << j->byteCount ) ) ) | ( ( c & 0xff ) << j->byteCount ); + } + + j->byteCount++; + + if ( ( !( c & 0x80 ) ) || ( j->byteCount == 9 ) ) + { + newState = TRACE_IDLE; + cpu->ts = j->tsConstruct; + _stateChange( cpu, EV_CH_TSTAMP ); + + DEBUG( "CPU Timestamp %d" EOL, cpu->ts ); + retVal = TRACE_EV_MSG_RXED; + } + + break; + + // ----------------------------------------------------- + // CYCLECOUNT RELATED ACTIVITIES + // ----------------------------------------------------- + + case TRACE_GET_CYCLECOUNT: /* Collecting cycle count as standalone packet */ + j->cycleConstruct = ( j->cycleConstruct & ~( 0x7f << ( ( j->byteCount ) * 7 ) ) ) | ( ( c & 0x7f ) << ( ( j->byteCount ) * 7 ) ); + j->byteCount++; + + if ( ( !( c & ( 1 << 7 ) ) ) || ( j->byteCount == 5 ) ) + { + newState = TRACE_IDLE; + cpu->cycleCount = j->cycleConstruct; + _stateChange( cpu, EV_CH_CYCLECOUNT ); + + DEBUG( "Cyclecount %d" EOL, cpu->cycleCount ); + retVal = TRACE_EV_MSG_RXED; + } + + break; + + + // ----------------------------------------------------- + // CONTEXTID RELATED ACTIVITIES + // ----------------------------------------------------- + + case TRACE_GET_CONTEXTID: /* Collecting contextID */ + j->contextConstruct = j->contextConstruct + ( c << ( 8 * j->byteCount ) ); + j->byteCount++; + + if ( j->byteCount == j->contextBytes ) + { + if ( cpu->contextID != j->contextConstruct ) + { + cpu->contextID = j->contextConstruct; + _stateChange( cpu, EV_CH_CONTEXTID ); + } + + DEBUG( "CPU ContextID %d" EOL, cpu->contextID ); + retVal = TRACE_EV_MSG_RXED; + newState = TRACE_IDLE; + } + + break; + + + // ----------------------------------------------------- + // I-SYNC RELATED ACTIVITIES + // ----------------------------------------------------- + + case TRACE_WAIT_ISYNC: + if ( c == 0b00001000 ) + { + if ( !j->rxedISYNC ) + { + retVal = TRACE_EV_SYNCED; + j->rxedISYNC = true; + } + + j->byteCount = j->contextBytes; + j->contextConstruct = 0; + newState = j->contextBytes ? TRACE_GET_CONTEXTBYTE : TRACE_GET_INFOBYTE; + } + + break; + + // ----------------------------------------------------- + + case TRACE_GET_CONTEXTBYTE: /* Collecting I-Sync contextID bytes */ + j->contextConstruct = j->contextConstruct + ( c << ( 8 * j->byteCount ) ); + j->byteCount++; + + if ( j->byteCount == j->contextBytes ) + { + if ( cpu->contextID != j->contextConstruct ) + { + cpu->contextID = j->contextConstruct; + _stateChange( cpu, EV_CH_CONTEXTID ); + } + + newState = TRACE_GET_INFOBYTE; + } + + break; + + // ----------------------------------------------------- + + case TRACE_GET_INFOBYTE: /* Collecting I-Sync Information byte */ + if ( ( ( c & 0x10000000 ) != 0 ) != cpu->isLSiP ) + { + cpu->isLSiP = ( c & 0x10000000 ) != 0; + _stateChange( cpu, EV_CH_ISLSIP ); + } + + if ( cpu->reason != ( ( c & 0x01100000 ) >> 5 ) ) + { + cpu->reason = ( c & 0x01100000 ) >> 5; + _stateChange( cpu, EV_CH_REASON ); + } + + if ( cpu->jazelle != ( ( c & 0x00010000 ) != 0 ) ) + { + cpu->jazelle = ( c & 0x00010000 ) != 0; + _stateChange( cpu, EV_CH_JAZELLE ); + } + + if ( cpu->nonSecure != ( ( c & 0x00001000 ) != 0 ) ) + { + cpu->nonSecure = ( c & 0x00001000 ) != 0; + _stateChange( cpu, EV_CH_SECURE ); + } + + if ( cpu->altISA != ( ( c & 0x00000100 ) != 0 ) ) + { + cpu->altISA = ( c & 0x00000100 ) != 0; + _stateChange( cpu, EV_CH_ALTISA ); + } + + if ( cpu->hyp != ( ( c & 0x00000010 ) != 0 ) ) + { + cpu->hyp = ( c & 0x00000010 ) != 0; + _stateChange( cpu, EV_CH_HYP ); + } + + j->byteCount = 0; + + if ( j->dataOnlyMode ) + { + DEBUG( "ISYNC in dataOnlyMode" EOL ); + retVal = TRACE_EV_MSG_RXED; + newState = TRACE_IDLE; + } + else + { + newState = TRACE_GET_IADDRESS; + } + + break; + + // ----------------------------------------------------- + + case TRACE_GET_IADDRESS: /* Collecting I-Sync Address bytes */ + j->addrConstruct = ( j->addrConstruct & ( ~( 0xff << ( 8 * j->byteCount ) ) ) ) | ( c << ( 8 * j->byteCount ) ) ; + j->byteCount++; + + if ( j->byteCount == 4 ) + { + _stateChange( cpu, EV_CH_ADDRESS ); + + if ( cpu->jazelle ) + { + /* This is Jazelle mode..can ignore the AltISA bit */ + /* and bit 0 is bit 0 of the address */ + cpu->addrMode = TRACE_ADDRMODE_JAZELLE; + cpu->addr = j->addrConstruct; + } + else + { + if ( ( j->addrConstruct & ( 1 << 0 ) ) ^ ( !cpu->thumb ) ) + { + cpu->thumb = ( c & 0x00000001 ) != 0; + _stateChange( cpu, EV_CH_THUMB ); + } + + if ( j->addrConstruct & ( 1 << 0 ) ) + { + cpu->addrMode = TRACE_ADDRMODE_THUMB; + j->addrConstruct &= ~( 1 << 0 ); + cpu->addr = j->addrConstruct; + } + else + { + cpu->addrMode = TRACE_ADDRMODE_ARM; + cpu->addr = j->addrConstruct & 0xFFFFFFFC; + } + } + + if ( cpu->isLSiP ) + { + /* If this is an LSiP packet we need to go get the address */ + newState = ( j->usingAltAddrEncode ) ? TRACE_COLLECT_BA_ALT_FORMAT : TRACE_COLLECT_BA_STD_FORMAT; + } + else + { + DEBUG( "ISYNC with IADDRESS 0x%08x" EOL, cpu->addr ); + newState = TRACE_IDLE; + retVal = TRACE_EV_MSG_RXED; + } + } + + break; + + // ----------------------------------------------------- + + case TRACE_GET_ICYCLECOUNT: /* Collecting cycle count on front of ISYNC packet */ + j->cycleConstruct = ( j->cycleConstruct & ~( 0x7f << ( ( j->byteCount ) * 7 ) ) ) | ( ( c & 0x7f ) << ( ( j->byteCount ) * 7 ) ); + j->byteCount++; + + if ( ( !( c & ( 1 << 7 ) ) ) || ( j->byteCount == 5 ) ) + { + /* Now go to get the rest of the ISYNC packet */ + /* Collect either the context or the Info Byte next */ + cpu->cycleCount = j->cycleConstruct; + j->byteCount = j->contextBytes; + j->contextConstruct = 0; + _stateChange( cpu, EV_CH_CYCLECOUNT ); + newState = j->contextBytes ? TRACE_GET_CONTEXTBYTE : TRACE_GET_INFOBYTE; + break; + } + + break; + + // ----------------------------------------------------- + + } + } + + if ( j->p != TRACE_UNSYNCED ) + { + DEBUG( "%02x:%s --> %s %s(%d)", c, ( j->p == TRACE_IDLE ) ? _protoStateName[j->p] : "", _protoStateName[newState], + ( ( newState == TRACE_IDLE ) ? ( ( retVal == TRACE_EV_NONE ) ? "!!!" : "OK" ) : " : " ), retVal ); + } + + j->p = newState; + /* Tell the caller we have information to report is something interesting has happened */ + return ( ( retVal != TRACE_EV_NONE ) && ( j->rxedISYNC ) ); +} + +// ==================================================================================================== + +static void _pumpDestroy( struct TRACEDecoderEngine *e ) + +{ + assert( e ); + free( e ); +} + +// ==================================================================================================== + +static bool _synced( struct TRACEDecoderEngine *e ) + +{ + assert( e ); + return ( ( struct ETM35DecodeState * )e )->p != TRACE_UNSYNCED; +} + +// ==================================================================================================== + +static void _usingAltAddrEncode( struct TRACEDecoderEngine *e, bool using ) + +{ + ( ( struct ETM35DecodeState * )e )->usingAltAddrEncode = using; +} + +// ==================================================================================================== + +static void _forceSync( struct TRACEDecoderEngine *e, bool isSynced ) + +{ + if ( !isSynced ) + { + ( ( struct ETM35DecodeState * )e )->asyncCount = 0; + ( ( struct ETM35DecodeState * )e )->rxedISYNC = false; + } + + ( ( struct ETM35DecodeState * )e )->p = ( isSynced ) ? TRACE_IDLE : TRACE_UNSYNCED; +} + +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== +// Publicly accessible methods +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== + +struct TRACEDecoderEngine *ETM35DecoderPumpCreate( void ) + +{ + + struct TRACEDecoderEngine *e = ( struct TRACEDecoderEngine * )calloc( 1, sizeof( struct ETM35DecodeState ) ); + e->action = _pumpAction; + e->destroy = _pumpDestroy; + e->synced = _synced; + e->forceSync = _forceSync; + e->altAddrEncode = _usingAltAddrEncode; + return e; +} + +// ==================================================================================================== diff --git a/Src/traceDecoder_etm4.c b/Src/traceDecoder_etm4.c new file mode 100644 index 00000000..d90c7f8a --- /dev/null +++ b/Src/traceDecoder_etm4.c @@ -0,0 +1,1025 @@ + +/* SPDX-License-Identifier: BSD-3-Clause */ + +/* + * ETM4 TRACE Decoder Module + * ========================= + * + * Implementation of ETM4 decode according to the specification in + * the Embedded Trace Macrocell Architecture Specification ETMv4.0 to ETMv4.6 + * ARM IHI0064H.a (ID120820) + */ + +#include +#include +#include +#include +#include +#include "msgDecoder.h" +#include "traceDecoder.h" +#include "generics.h" + + +/* Internal states of the protocol machine */ +enum TRACE_ETM4protoState +{ + TRACE_UNSYNCED, + TRACE_IDLE, + TRACE_GET_CYCLECOUNT, + TRACE_WAIT_INFO, + TRACE_GET_INFO_PLCTL, + TRACE_GET_INFO_INFO, + TRACE_GET_INFO_KEY, + TRACE_GET_INFO_SPEC, + TRACE_GET_INFO_CYCT, + TRACE_EXTENSION, + TRACE_GET_TIMESTAMP, + TRACE_GET_TS_CC, + TRACE_COMMIT, + TRACE_GET_SHORT_ADDR, + TRACE_GET_32BIT_ADDR, + TRACE_GET_64BIT_ADDR, + TRACE_GET_CONTEXT, + TRACE_GET_VCONTEXT, + TRACE_GET_CONTEXT_ID, + TRACE_GET_EXCEPTIONINFO1, + TRACE_GET_EXCEPTIONINFO2 +}; + +static const char *_protoStateName[] = +{ + "UNSYNCED", + "IDLE", + "GET_CYCLECOUNT", + "WAIT_INFO", + "GET_INFO_PLCTL", + "GET_INFO_INFO", + "GET_INFO_KEY", + "GET_INFO_SPEC", + "GET_INFO_CYCT", + "EXTENSION", + "GET_TIMESTAMP", + "GET_TS_CC", + "COMMIT", + "GET_SHORT_ADDR", + "GET_32BIT_ADDR", + "GET_64BIT_ADDR", + "GET_CONTEXT", + "GET_VCONTEXT", + "GET_CONTEXT_ID", + "GET_EXCEPTIONINFO1", + "GET_EXCEPTIONINFO2" +}; + +#define COND_LOAD_TRACED 1 +#define COND_STORE_TRACED 2 +#define COND_ALL_TRACED 7 + +/* Word-aligned ARM, Halfword Aligned Thumb, Table 6-19, Pg 6-292 */ +enum InstSet { IS0, IS1 }; + +struct ETM4DecodeState +{ + struct TRACEDecoderEngine e; /* Must be first to allow object method access */ + enum TRACE_ETM4protoState p; /* Current state of the receiver */ + + uint32_t asyncCount; /* Count of 0's in preparation for ASYNC recognition */ + bool rxedISYNC; /* Indicator that we're fully synced */ + + uint8_t plctl; /* Payload control - what sections are present in the INFO */ + bool cc_enabled; /* Indicates cycle counting is enabled */ + uint8_t cond_enabled; /* What conditional branching and loads/stores are traced */ + bool load_traced; /* Load instructions are traced explicitly */ + bool store_traced; /* Store instructions are traced explicitly */ + bool haveContext; /* We have context to collect */ + + uint32_t context; /* Current machine context */ + uint32_t vcontext; /* Virtual machine context */ + + uint32_t nextrhkey; /* Next rh key expected in the stream */ + uint32_t spec; /* Max speculation depth to be expected */ + uint32_t cyct; /* Cycnt threshold */ + + uint8_t ex0; /* First info byte for exception */ + + bool cc_follows; /* Indication if CC follows from TS */ + uint8_t idx; /* General counter used for multi-byte payload indexing */ + uint32_t cntUpdate; /* Count construction for TS packets */ + struct + { + uint64_t addr; + enum InstSet inst; + } q[3]; /* Address queue for pushed addresses */ +}; + +#define DEBUG(...) { if ( cpu->report ) cpu->report( V_DEBUG, __VA_ARGS__); } + +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== +// Internal routines - decoder support +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== + +static void _stateChange( struct TRACECPUState *cpu, enum TRACEchanges c ) +{ + cpu->changeRecord |= ( 1 << c ); +} + +// ==================================================================================================== + +static void _reportInfo( struct TRACECPUState *cpu, struct ETM4DecodeState *j ) + +{ + DEBUG( EOL "Cycle counting is %senabled" EOL, j->cc_enabled ? "" : "not " ); + DEBUG( "Conditional loads are %straced" EOL, ( j->cond_enabled & COND_LOAD_TRACED ) ? "" : "not " ); + DEBUG( "Conditional stores are %straced" EOL, ( j->cond_enabled & COND_STORE_TRACED ) ? "" : "not " ); + DEBUG( "All conditionals are %straced" EOL, ( j->cond_enabled == COND_ALL_TRACED ) ? "" : "not " ); + DEBUG( "Next RH key is %d" EOL, j->nextrhkey ); + DEBUG( "Max speculative execution depth is %d instructions" EOL, j->spec ); + DEBUG( "CYCNT threshold value is %d" EOL, j->cyct ); +} + +// ==================================================================================================== + +static void _flushQ( struct ETM4DecodeState *j ) + +{ + j->q[2].addr = j->q[1].addr = j->q[0].addr = 0; + j->q[2].inst = j->q[1].inst = j->q[0].inst = IS0; +} + +// ==================================================================================================== + +static void _stackQ( struct ETM4DecodeState *j ) +{ + j->q[2].addr = j->q[1].addr; + j->q[1].addr = j->q[0].addr; + j->q[2].inst = j->q[1].inst; + j->q[1].inst = j->q[0].inst; +} + +// ==================================================================================================== + +static bool _pumpAction( struct TRACEDecoderEngine *e, struct TRACECPUState *cpu, uint8_t c ) + +/* Pump next byte into the protocol decoder */ + +{ + + enum TRACEDecoderPumpEvent retVal = TRACE_EV_NONE; + int match; + + struct ETM4DecodeState *j = ( struct ETM4DecodeState * )e; + enum TRACE_ETM4protoState newState = j->p; + + assert( j ); + + /* Perform A-Sync accumulation check ( Section 6.4.2 ) */ + if ( ( j->asyncCount == 11 ) && ( c == 0x80 ) ) + { + DEBUG( "A-Sync Accumulation complete" EOL ); + j->rxedISYNC = true; + newState = TRACE_WAIT_INFO; + } + else + { + j->asyncCount = c ? 0 : j->asyncCount + 1; + + switch ( j->p ) + { + // ----------------------------------------------------- + case TRACE_UNSYNCED: + break; + + // ----------------------------------------------------- + case TRACE_IDLE: + switch ( c ) + { + case 0b00000001: + newState = TRACE_GET_INFO_PLCTL; + break; + + case 0b01110000: /* Ignore packet, Figure 6-30, Pg 6-289 */ + break; + + case 0b11110110 ... 0b11110111: /* Atom Format 1, Figure 6-39, Pg 6-304 */ + cpu->eatoms = ( 0 != ( c & 1 ) ); + cpu->natoms = !cpu->eatoms; + cpu->instCount += 1; + cpu->disposition = c & 1; + DEBUG( "Atom Format 1 [%b]", cpu->disposition ); + + + if ( cpu->addr != ADDRESS_UNKNOWN ) + { + retVal = TRACE_EV_MSG_RXED; + _stateChange( cpu, EV_CH_ENATOMS ); + } + + break; + + case 0b11011000 ... 0b11011011: /* Atom Format 2, Figure 6-40, Pg 6-304 */ + cpu->eatoms = ( 0 != ( c & 2 ) ) + ( 0 != ( c & 1 ) ); + cpu->natoms = 2 - cpu->eatoms; + cpu->instCount += 2; + + /* Put a 1 in each element of disposition if was executed */ + cpu->disposition = c & 3; + DEBUG( "Atom Format 2 [%02b]", cpu->disposition ); + + if ( cpu->addr != ADDRESS_UNKNOWN ) + { + retVal = TRACE_EV_MSG_RXED; + _stateChange( cpu, EV_CH_ENATOMS ); + } + + break; + + case 0b11111000 ... 0b11111111: /* Atom Format 3, Figure 6-41, Pg 6-305 */ + cpu->eatoms = ( 0 != ( c & 1 ) ) + ( 0 != ( c & 2 ) ) + ( 0 != ( c & 4 ) ); + cpu->natoms = 3 - cpu->eatoms; + cpu->instCount += 3; + + /* Put a 1 in each element of disposition if was executed */ + cpu->disposition = c & 7; + DEBUG( "Atom Format 3 [%03b]", cpu->disposition ); + + if ( cpu->addr != ADDRESS_UNKNOWN ) + { + retVal = TRACE_EV_MSG_RXED; + _stateChange( cpu, EV_CH_ENATOMS ); + } + + break; + + case 0b11011100 ... 0b11011111: /* Atom Format 4, Figure 6-42, Pg 6-305 */ + switch ( c & 3 ) + { + case 0b00: + cpu->natoms = 1; + cpu->disposition = 0b1110; + break; + + case 0b01: + cpu->natoms = 4; + cpu->disposition = 0b0000; + break; + + case 0b10: + cpu->natoms = 2; + cpu->disposition = 0b1010; + break; + + case 0b11: + cpu->natoms = 2; + cpu->disposition = 0b0101; + break; + } + + cpu->eatoms = 4 - cpu->natoms; + cpu->instCount += 4; + DEBUG( "Atom Format 4 [%04b]", cpu->disposition ); + + if ( cpu->addr != ADDRESS_UNKNOWN ) + { + retVal = TRACE_EV_MSG_RXED; + _stateChange( cpu, EV_CH_ENATOMS ); + } + + break; + + + case 0b11010101: + case 0b11010110: + case 0b11010111: + case 0b11110101: /* Atom format 5, Figure 6-43, Pg 6-306 ... use bits 5, 1 and 0 */ + switch ( ( ( 0 != ( c & ( 1 << 5 ) ) ) << 2 ) | ( ( 0 != ( c & ( 1 << 1 ) ) ) << 1 ) | ( ( 0 != ( c & ( 1 << 0 ) ) ) << 0 ) ) + { + case 0b101: + cpu->natoms = 1; + cpu->disposition = 0b11110; + break; + + case 0b001: + cpu->natoms = 5; + cpu->disposition = 0b00000; + break; + + case 0b010: + cpu->natoms = 3; + cpu->disposition = 0b01010; + break; + + case 0b011: + cpu->natoms = 2; + cpu->disposition = 0b10101; + break; + + default: + DEBUG( "Illegal value for Atom type 5 (0x%02x)" EOL, c ); + break; + } + + cpu->eatoms = 5 - cpu->natoms; + cpu->instCount += 5; + DEBUG( "Atom Format 5 [%05b]", cpu->disposition ); + + if ( cpu->addr != ADDRESS_UNKNOWN ) + { + retVal = TRACE_EV_MSG_RXED; + _stateChange( cpu, EV_CH_ENATOMS ); + } + + break; + + case 0b11000000 ... 0b11010100: + case 0b11100000 ... 0b11110100: /* Atom format 6, Figure 6-44, Pg 6.307 */ + cpu->eatoms = ( c & 0x1f ) + 3; + cpu->instCount = cpu->eatoms; + cpu->disposition = ( 1 << ( cpu->eatoms ) ) - 1; + + /* Deal with last instruction to be executed */ + if ( c & ( 1 << 5 ) ) + { + DEBUG( "Got a non-execute" ); + cpu->disposition &= ~( 1 << ( cpu->eatoms - 1 ) ); + cpu->eatoms--; + cpu->natoms = 1; + } + else + { + cpu->natoms = 0; + } + + char construct[30]; + sprintf( construct, "Atom Format 6 [%%ld %%%" PRId64 "b]", cpu->instCount ); + DEBUG( construct, cpu->instCount, cpu->disposition ); + + if ( cpu->addr != ADDRESS_UNKNOWN ) + { + retVal = TRACE_EV_MSG_RXED; + _stateChange( cpu, EV_CH_ENATOMS ); + } + + break; + + + case 0b10100000 ... 0b10101111: /* Q instruction trace packet, Figure 6-45, Pg 6-308 */ + + break; + + case 0b01110001 ... 0b01111111: /* Event tracing, Figure 6-31, Pg 6-289 */ + if ( c & 0b0001 ) + { + _stateChange( cpu, EV_CH_EVENT0 ); + } + + if ( c & 0b0010 ) + { + _stateChange( cpu, EV_CH_EVENT1 ); + } + + if ( c & 0b0100 ) + { + _stateChange( cpu, EV_CH_EVENT2 ); + } + + if ( c & 0b1000 ) + { + _stateChange( cpu, EV_CH_EVENT3 ); + } + + break; + + case 0b00000100: /* Trace On, Figure 6.3, Pg 6-261 */ + retVal = TRACE_EV_MSG_RXED; + _stateChange( cpu, EV_CH_TRACESTART ); + break; + + case 0b10010000 ... 0b10010011: /* Exact Match Address */ + match = c & 0x03; + assert( c != 3 ); /* This value is reserved */ + cpu->addr = j->q[match].addr; + retVal = TRACE_EV_MSG_RXED; + _stateChange( cpu, EV_CH_ADDRESS ); + break; + + case 0b10010101: /* Short address, IS0 short, Figure 6-32, Pg 6-294 */ + j->idx = 2; + _stackQ( j ); + newState = TRACE_GET_SHORT_ADDR; + break; + + case 0b10010110: /* Short address, IS1 short, Figure 6-32, Pg 6-294 */ + j->idx = 1; + _stackQ( j ); + newState = TRACE_GET_SHORT_ADDR; + break; + + case 0b10011010: /* Long address, 32 bit, IS0, Figure 6.33 Pg 6-295 */ + j->idx = 2; + j->haveContext = false; + _stackQ( j ); + j->q[0].inst = IS0; + j->q[0].addr &= 0xFFFFFFFC; + newState = TRACE_GET_32BIT_ADDR; + break; + + case 0b10011011: /* Long address, 32 bit, IS1, Figure 6.33 Pg 6-295 */ + j->idx = 1; + j->haveContext = false; + _stackQ( j ); + j->q[0].inst = IS1; + j->q[0].addr &= 0xFFFFFFFE; + newState = TRACE_GET_32BIT_ADDR; + break; + + case 0b10011101: /* Long address, 64 bit, IS0, Figure 6.34 Pg 6-295 */ + j->idx = 2; + j->haveContext = false; + _stackQ( j ); + j->q[0].inst = IS0; + j->q[0].addr &= 0xFFFFFFFC; + newState = TRACE_GET_64BIT_ADDR; + break; + + + case 0b10011110: /* Long address, 64 bit, IS0, Figure 6.34 Pg 6-295 */ + j->idx = 1; + _stackQ( j ); + j->haveContext = false; + j->q[0].inst = IS1; + j->q[0].addr &= 0xFFFFFFFC; + newState = TRACE_GET_64BIT_ADDR; + break; + + case 0b10000000: /* Context element with no payload, Figure 6-36, Pg 6-297 */ + /* Context is same as prevously, nothing to report */ + break; + + case 0b10000001: /* Context element with payload, Figure 6-36, Pg 6-297*/ + newState = TRACE_GET_CONTEXT; + break; + + case 0b10000010: /* Long address, 32 bit, IS0, Figure 6-37 case 1, Pg 6-299 */ + j->haveContext = true; + j->idx = 2; + _stackQ( j ); + j->q[0].inst = IS0; + j->q[0].addr &= 0xFFFFFFFC; + newState = TRACE_GET_32BIT_ADDR; + break; + + + case 0b10000011: /* Long address, 32 bit, IS1, Figure 6-37 case 2, Pg 6-299 */ + j->idx = 1; + j->haveContext = true; + _stackQ( j ); + j->q[0].inst = IS1; + j->q[0].addr &= 0xFFFFFFFE; + newState = TRACE_GET_32BIT_ADDR; + break; + + case 0b10000101: /* Long address, 64 bit, IS0, Figure 6-38 case 1, Pg 6-300 */ + j->idx = 2; + j->haveContext = true; + _stackQ( j ); + j->q[0].inst = IS0; + j->q[0].addr &= 0xFFFFFFFC; + newState = TRACE_GET_64BIT_ADDR; + break; + + + case 0b10000110: /* Long address, 64 bit, IS1, Figure 6-38 case 2, Pg 6-300 */ + j->idx = 1; + _stackQ( j ); + j->haveContext = true; + j->q[0].inst = IS1; + j->q[0].addr &= 0xFFFFFFFC; + newState = TRACE_GET_64BIT_ADDR; + break; + + case 0b00000000: + newState = TRACE_EXTENSION; + break; + + case 0b00001000: /* Resynchronisation, Figure 6-6, Pg 6-263 */ + j->rxedISYNC = false; + newState = TRACE_UNSYNCED; + break; + + case 0b00000110: /* Exception instruction trace packet Figure 6-10, Pg 6-267 */ + newState = TRACE_GET_EXCEPTIONINFO1; + break; + + case 0b00000010 ... 0b00000011: /* Timestamp, Figure 6-7, Pg 6-264 */ + newState = TRACE_GET_TIMESTAMP; + j->cc_follows = ( 0 != ( c & 1 ) ); + + if ( !j->cc_follows ) + { + cpu->cycleCount = COUNT_UNKNOWN; + } + + j->idx = 0; + break; + + case 0b10001000: /* Timestamp marker element, Figure 6-8, Pg 6-265 */ + break; + + case 0b00000101: /* Function return element, Figure 6-9, Pg 6-265 */ + retVal = TRACE_EV_MSG_RXED; + _stateChange( cpu, EV_CH_FNRETURN ); + break; + + case 0b00000111: /* Exception Return element, Figure 6-11, Pg 6-271 */ + retVal = TRACE_EV_MSG_RXED; + _stateChange( cpu, EV_CH_EXRETURN ); + break; + + case 0b00100000 ... 0b00100111: /* Data sync mark, Figure 6-15, Pg 6-275 */ + cpu->dsync_mark = c & 0x07; + retVal = TRACE_EV_MSG_RXED; + _stateChange( cpu, EV_CH_DATASYNC ); + break; + + case 0b00101000 ... 0b00101100: /* Unnumbered data sync mark, Figure 6-16, Pg 6-275 */ + cpu->udsync_mark = c & 0x07; + retVal = TRACE_EV_MSG_RXED; + _stateChange( cpu, EV_CH_UDATASYNC ); + break; + + case 0b00110000 ... 0b00110011: /* Mispredict instruction, Figure 6-21, Pg 6-279 */ + break; + + case 0b00101101: /* Commit instruction trace packet, Figure 6-17, Pg 6-277 */ + newState = TRACE_COMMIT; + break; + + default: + DEBUG( "Unknown element %02x in TRACE_IDLE" EOL, c ); + break; + } + + break; + + // ----------------------------------------------------- + case TRACE_GET_CONTEXT: /* Get context information byte, Figure 6-36, Pg 6-297 */ + cpu->exceptionLevel = c & 3; + cpu->am64bit = ( 0 != ( c & ( 1 << 4 ) ) ); + cpu->amSecure = ( 0 == ( c & ( 1 << 5 ) ) ); + j->haveContext = ( 0 != ( c & ( 1 << 7 ) ) ); + + if ( c & ( 1 << 6 ) ) + { + j->vcontext = 0; + j->idx = 0; + newState = TRACE_GET_VCONTEXT; + } + else if ( j->haveContext ) + { + j->context = 0; + j->idx = 0; + newState = TRACE_GET_CONTEXT_ID; + } + else + { + retVal = TRACE_EV_MSG_RXED; + _stateChange( cpu, EV_CH_CONTEXTID ); + newState = TRACE_IDLE; + } + + break; + + // ----------------------------------------------------- + + case TRACE_GET_EXCEPTIONINFO1: + j->ex0 = c; + newState = TRACE_GET_EXCEPTIONINFO2; + break; + + // ----------------------------------------------------- + + case TRACE_GET_EXCEPTIONINFO2: + cpu->exception = ( ( j->ex0 >> 1 ) & 0x1f ) | ( ( c & 0x1f ) << 5 ); + cpu->serious = 0 != ( c & ( 1 << 5 ) ); + _stateChange( cpu, EV_CH_EX_ENTRY ); + + /* We aren't really returning idle, but we need to collect a standard formatted address packet */ + /* Then, when the address is delivered to the CPU Processor, it will have the EV_CH_EXCEPTION set */ + /* too, which the code must recogise as setting a preferred return address. */ + newState = TRACE_IDLE; + break; + + // ----------------------------------------------------- + + case TRACE_GET_VCONTEXT: + j->vcontext |= c << j->idx; + j->idx += 8; + + if ( ( j->idx == 32 ) && ( !j->haveContext ) ) + { + cpu->vmid = j->vcontext; + retVal = TRACE_EV_MSG_RXED; + _stateChange( cpu, EV_CH_VMID ); + newState = TRACE_IDLE; + } + else + { + j->context = 0; + j->idx = 0; + newState = TRACE_GET_CONTEXT_ID; + } + + break; + + // ----------------------------------------------------- + + case TRACE_GET_CONTEXT_ID: + j->context |= c << j->idx; + j->idx += 8; + + if ( j->idx == 32 ) + { + cpu->contextID = j->vcontext; + retVal = TRACE_EV_MSG_RXED; + _stateChange( cpu, EV_CH_CONTEXTID ); + newState = TRACE_IDLE; + } + + break; + + // ----------------------------------------------------- + case TRACE_GET_SHORT_ADDR: /* Short format address for IS0 or IS1, offset set by idx. Figure 6-32, Pg 6-294 */ + if ( j->idx <= 2 ) + { + /* First byte of received data */ + j->q[0].addr = ( j->q[0].addr & ~( 0x7f << j->idx ) ) | ( ( c & 0x7f ) << ( j->idx ) ); + j->idx += 7; + } + else + { + j->q[0].addr = ( j->q[0].addr & ~( 0xff << j->idx ) ) | ( ( c & 0xff ) << ( j->idx ) ); + j->idx += 8; + } + + if ( ( !( c & 0x80 ) ) || ( j->idx > 9 ) ) + { + cpu->addr = j->q[0].addr; + retVal = TRACE_EV_MSG_RXED; + _stateChange( cpu, EV_CH_ADDRESS ); + newState = TRACE_IDLE; + } + + break; + + // ----------------------------------------------------- + case TRACE_GET_32BIT_ADDR: /* Long format 32 bit address for IS0 or IS1, offset set by idx. Figure 6-33, Pg 6-295 and Figure 6-37, Pg 6-299 */ + if ( j->idx < 3 ) + { + /* First byte of received data */ + j->q[0].addr = ( j->q[0].addr & ( ~( 0x7F << j->idx ) ) ) | ( ( c & 0x7f ) << ( j->idx ) ); + j->idx += 7; + } + else + { + if ( j->idx == 8 ) + { + /* Second byte of IS1 case - mask MSB */ + j->q[0].addr = ( j->q[0].addr & ( ~( 0x7F << j->idx ) ) ) | ( ( c & 0x7f ) << ( j->idx ) ); + j->idx = 16; + } + else + { + j->q[0].addr = ( j->q[0].addr & ( ~( 0xFF << j->idx ) ) ) | ( ( c & 0xFf ) << ( j->idx ) ); + j->idx += 8; + } + } + + if ( j->idx == 32 ) + { + cpu->addr = j->q[0].addr; + _stateChange( cpu, EV_CH_ADDRESS ); + + if ( j->haveContext ) + { + newState = TRACE_GET_CONTEXT; + } + else + { + retVal = TRACE_EV_MSG_RXED; + newState = TRACE_IDLE; + } + } + + break; + + // ----------------------------------------------------- + + case TRACE_GET_64BIT_ADDR: /* Long format 64 bit address for IS0 or IS1, offset set by idx. Figure 6-34, Pg 6-295 */ + if ( j->idx < 3 ) + { + /* First byte of received data */ + j->q[0].addr = ( j->q[0].addr & ( 0x7F << j->idx ) ) | ( ( c & 0x7f ) << ( j->idx ) ); + j->idx += 7; + } + else + { + if ( ( j->q[0].inst == IS1 ) && ( j->idx == 8 ) ) + { + /* Second byte of IS1 case - mask MSB */ + j->q[0].addr = ( j->q[0].addr & ( 0x7F << j->idx ) ) | ( ( c & 0x7f ) << ( j->idx ) ); + j->idx = 16; + } + else + { + j->q[0].addr = ( j->q[0].addr & ( 0xFF << j->idx ) ) | ( ( c & 0xFf ) << ( j->idx ) ); + j->idx += 8; + } + } + + if ( j->idx == 64 ) + { + cpu->addr = j->q[0].addr; + _stateChange( cpu, EV_CH_ADDRESS ); + + if ( j->haveContext ) + { + newState = TRACE_GET_CONTEXT; + } + else + { + retVal = TRACE_EV_MSG_RXED; + newState = TRACE_IDLE; + } + } + + break; + + // ----------------------------------------------------- + case TRACE_GET_TIMESTAMP: /* Timestamp, Figure 6-7, Pg 6-264 */ + if ( j->idx < 56 ) + { + cpu->ts = ( cpu->ts & ( 0x7F << j->idx ) ) | ( ( c & 0x7f ) << j->idx ); + } + else + { + cpu->ts = ( cpu->ts & ( 0xFF << j->idx ) ) | ( ( c & 0xff ) << j->idx ); + } + + j->idx += 7; + + if ( ( !( c & 0x80 ) ) || ( j->idx == 63 ) ) + { + if ( cpu->cycleCount != COUNT_UNKNOWN ) + { + _stateChange( cpu, EV_CH_TSTAMP ); + } + + if ( j->cc_enabled ) + { + if ( j->cc_follows ) + { + j->idx = 0; + j->cntUpdate = 0; + newState = TRACE_GET_TS_CC; + } + else + { + retVal = TRACE_EV_MSG_RXED; + newState = TRACE_IDLE; + } + } + else + { + retVal = TRACE_EV_MSG_RXED; + newState = TRACE_IDLE; + } + } + + break; + + // ----------------------------------------------------- + case TRACE_GET_TS_CC: /* Part of timestamp, Figure 6-7, Pg 6-264 */ + if ( j->idx < 2 ) + { + j->cntUpdate |= ( c & 0x7f ) << ( j->idx * 7 ); + } + else + { + j->cntUpdate |= ( c & 0x7f ) << ( j->idx * 7 ); + } + + j->idx++; + + if ( ( j->idx == 3 ) || ( c & 0x80 ) ) + { + + cpu->cycleCount += j->cntUpdate; + retVal = TRACE_EV_MSG_RXED; + _stateChange( cpu, EV_CH_CYCLECOUNT ); + newState = TRACE_IDLE; + } + + break; + + // ----------------------------------------------------- + case TRACE_EXTENSION: + switch ( c ) + { + case 0b00000011: /* Discard packet, Figure 6.4, Pg 6-262 */ + _stateChange( cpu, EV_CH_DISCARD ); + _stateChange( cpu, EV_CH_TRACESTOP ); + break; + + case 0b00000101: /* Overflow packet, Figure 6.5, Pg. 6-263 */ + _stateChange( cpu, EV_CH_OVERFLOW ); + break; + + case 0b00000111: /* Branch future flush */ + break; + + default: + DEBUG( "Reserved extension packet" EOL ); + break; + } + + retVal = TRACE_EV_MSG_RXED; + newState = TRACE_IDLE; + break; + + // ----------------------------------------------------- + case TRACE_WAIT_INFO: + if ( c == 0b00000001 ) + { + newState = TRACE_GET_INFO_PLCTL; + } + + break; + + case TRACE_GET_INFO_PLCTL: + j->plctl = c; + j->nextrhkey = 0; + _flushQ( j ); /* Reset the address stack too ( Section 6.4.12, Pg 6-291 ) */ + + if ( j->plctl & ( 1 << 0 ) ) + { + newState = TRACE_GET_INFO_INFO; + } + else if ( j->plctl & ( 1 << 1 ) ) + { + newState = TRACE_GET_INFO_KEY; + } + else if ( j->plctl & ( 1 << 2 ) ) + { + newState = TRACE_GET_INFO_SPEC; + } + else if ( j->plctl & ( 1 << 3 ) ) + { + newState = TRACE_GET_INFO_CYCT; + } + else + { + _reportInfo( cpu, j ); + retVal = TRACE_EV_MSG_RXED; + newState = TRACE_IDLE; + } + + break; + + case TRACE_GET_INFO_INFO: + j->cc_enabled = ( 0 != ( c & ( 1 << 0 ) ) ); + j->cond_enabled = ( c << 1 ) & 7; + j->load_traced = ( 0 != ( c & ( 1 << 4 ) ) ); + j->store_traced = ( 0 != ( c & ( 1 << 5 ) ) ); + + if ( j->plctl & ( 1 << 1 ) ) + { + newState = TRACE_GET_INFO_KEY; + } + else if ( j->plctl & ( 1 << 2 ) ) + { + newState = TRACE_GET_INFO_SPEC; + } + else if ( j->plctl & ( 1 << 3 ) ) + { + newState = TRACE_GET_INFO_CYCT; + } + else + { + _reportInfo( cpu, j ); + retVal = TRACE_EV_MSG_RXED; + newState = TRACE_IDLE; + } + + break; + + case TRACE_GET_INFO_KEY: + j->nextrhkey = c; // FIXME: Greater than 256 keys??? + + if ( j->plctl & ( 1 << 2 ) ) + { + newState = TRACE_GET_INFO_SPEC; + } + else if ( j->plctl & ( 1 << 3 ) ) + { + newState = TRACE_GET_INFO_CYCT; + } + else + { + _reportInfo( cpu, j ); + retVal = TRACE_EV_MSG_RXED; + newState = TRACE_IDLE; + } + + break; + + case TRACE_GET_INFO_SPEC: + j->spec = c; + + if ( j->plctl & ( 1 << 3 ) ) + { + _reportInfo( cpu, j ); + newState = TRACE_GET_INFO_CYCT; + } + else + { + _reportInfo( cpu, j ); + retVal = TRACE_EV_MSG_RXED; + newState = TRACE_IDLE; + } + + break; + + // ----------------------------------------------------- + + default: + DEBUG( "Case %d not handled in switch" EOL, j->p ); + break; + } + } + + if ( j->p != TRACE_UNSYNCED ) + { + DEBUG( "%02x:%s --> %s (%s:%d)", c, ( j->p == TRACE_IDLE ) ? _protoStateName[j->p] : "", _protoStateName[newState], + ( ( newState == TRACE_IDLE ) ? ( ( retVal == TRACE_EV_NONE ) ? "DROPPED" : "OK" ) : "-" ), retVal ); + + if ( newState == TRACE_IDLE ) + { + DEBUG( "\r\n" ); + } + } + + j->p = newState; + + /* Tell the caller we have information to report is something interesting has happened */ + return ( ( retVal != TRACE_EV_NONE ) && ( j->rxedISYNC ) ); +} +// ==================================================================================================== + +static void _pumpDestroy( struct TRACEDecoderEngine *e ) + +{ + assert( e ); + free( e ); +} + +// ==================================================================================================== + +static bool _synced( struct TRACEDecoderEngine *e ) + +{ + assert( e ); + return ( ( struct ETM4DecodeState * )e )->p != TRACE_UNSYNCED; +} + +// ==================================================================================================== +static void _forceSync( struct TRACEDecoderEngine *e, bool isSynced ) + +{ + ( ( struct ETM4DecodeState * )e )->p = ( isSynced ) ? TRACE_IDLE : TRACE_UNSYNCED; +} + +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== +// Publicly accessible methods +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== + +struct TRACEDecoderEngine *ETM4DecoderPumpCreate( void ) + +{ + + struct TRACEDecoderEngine *e = ( struct TRACEDecoderEngine * )calloc( 1, sizeof( struct ETM4DecodeState ) ); + e->action = _pumpAction; + e->destroy = _pumpDestroy; + e->synced = _synced; + e->forceSync = _forceSync; + return e; +} + +// ==================================================================================================== diff --git a/Src/traceDecoder_mtb.c b/Src/traceDecoder_mtb.c new file mode 100644 index 00000000..2bd6eaf3 --- /dev/null +++ b/Src/traceDecoder_mtb.c @@ -0,0 +1,159 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ + +/* + * TRACE Decoder Module + * ==================== + * + * Implementation of MTB decode. + */ + +#include +#include +#include +#include "msgDecoder.h" +#include "traceDecoder.h" +#include "generics.h" + +/* Internal states of the protocol machine */ +enum TRACE_MTBprotoState +{ + TRACE_UNSYNCED, + TRACE_IDLE +}; + +struct MTBDecodeState +{ + struct TRACEDecoderEngine e; /* Must be first to allow object method access */ + enum TRACE_MTBprotoState p; /* Current state of the receiver */ +}; + +#define REPORT(...) { if ( cpu->report ) cpu->report( V_DEBUG, __VA_ARGS__); } + +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== +// Externally available routines +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== + +static void _stateChange( struct TRACECPUState *cpu, enum TRACEchanges c ) +{ + cpu->changeRecord |= ( 1 << c ); +} + +// ==================================================================================================== +static bool _pumpActionPair( struct TRACEDecoderEngine *e, struct TRACECPUState *cpu, uint32_t source, uint32_t dest ) + +/* Pump next words through the protocol decoder */ + +{ + struct MTBDecodeState *j = ( struct MTBDecodeState * )e; + + enum TRACE_MTBprotoState newState = j->p; + enum TRACEDecoderPumpEvent retVal = TRACE_EV_NONE; + + REPORT( "[From 0x%08x to 0x%08x]" EOL, source, dest ); + + switch ( j->p ) + { + // ----------------------------------------------------- + + case TRACE_UNSYNCED: + /* For the first instruction we only have the destination */ + /* but we code the exception indication into here so we know we arrived via an exception */ + cpu->nextAddr = ( dest & 0xFFFFFFFE ) | ( source & 1 ); + + /* If the low bit of dest was set then this is a start of trace event */ + if ( dest & 1 ) + { + _stateChange( cpu, EV_CH_TRACESTART ); + } + + newState = TRACE_IDLE; + break; + + // ----------------------------------------------------- + + case TRACE_IDLE: + if ( cpu->nextAddr & 1 ) + { + /* If low bit of nextAddr is set then we got here via an exception */ + _stateChange( cpu, EV_CH_EX_ENTRY ); + } + + /* If low bit of dest is set then this is a start of trace */ + if ( dest & 1 ) + { + _stateChange( cpu, EV_CH_TRACESTART ); + } + + cpu->addr = cpu->nextAddr & 0xFFFFFFFE; + cpu->nextAddr = ( dest & 0xFFFFFFFE ) | ( source & 1 ); + cpu->toAddr = source & 0xFFFFFFFE; + cpu->exception = 0; /* We don't known exception cause on a M0 */ + _stateChange( cpu, EV_CH_ADDRESS ); + _stateChange( cpu, EV_CH_LINEAR ); + retVal = TRACE_EV_MSG_RXED; + break; + + // ----------------------------------------------------- + + default: + assert( false ); + break; + + // ----------------------------------------------------- + + } + + + j->p = newState; + return ( retVal != TRACE_EV_NONE ); +} +// ==================================================================================================== + +static void _pumpDestroy( struct TRACEDecoderEngine *e ) + +{ + assert( e ); + free( e ); +} + +// ==================================================================================================== + +static bool _synced( struct TRACEDecoderEngine *e ) + +{ + assert( e ); + return ( ( struct MTBDecodeState * )e )->p != TRACE_UNSYNCED; +} + +// ==================================================================================================== +static void _forceSync( struct TRACEDecoderEngine *e, bool isSynced ) + +{ + ( ( struct MTBDecodeState * )e )->p = ( isSynced ) ? TRACE_IDLE : TRACE_UNSYNCED; +} + +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== +// Publicly accessible methods +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== + +struct TRACEDecoderEngine *MTBDecoderPumpCreate( void ) + +{ + + struct TRACEDecoderEngine *e = ( struct TRACEDecoderEngine * )calloc( 1, sizeof( struct MTBDecodeState ) ); + e->actionPair = _pumpActionPair; + e->destroy = _pumpDestroy; + e->synced = _synced; + e->forceSync = _forceSync; + return e; +} + +// ==================================================================================================== diff --git a/Support/60-orbcode.rules b/Support/60-orbcode.rules index 5e33fcc2..1501072c 100644 --- a/Support/60-orbcode.rules +++ b/Support/60-orbcode.rules @@ -1,7 +1,7 @@ # Copy this to /etc/udev/rules.d # use "udevadm control --reload" if needed -ACTION!="add|change", GOTO="orb_rules_end" +ACTION!="add|change|bind", GOTO="orb_rules_end" SUBSYSTEM!="usb|tty|hidraw", GOTO="orb_rules_end" # Orbrace mini in bootloader mode diff --git a/Support/gdbinits/gdbinit-bmp b/Support/gdbinits/gdbinit-bmp index 7266fc98..41ed90b3 100644 --- a/Support/gdbinits/gdbinit-bmp +++ b/Support/gdbinits/gdbinit-bmp @@ -11,8 +11,8 @@ set print pretty load start -# Configure STM32 SWD pin -enableSTM32SWD +# Configure STM32 SWO pin +enableSTM32SWO # ==== This Section for Bluepill ======= # 2.25Mbps, don't use TPIU, don't use Manchester encoding @@ -22,19 +22,19 @@ enableSTM32SWD # (e.g. by using SystemCoreClock or similar) unless you've got the # clock running at full speed at the time when this routine is called. monitor traceswo 2250000 -prepareSWD 72000000 2250000 0 0 +prepareSWO 72000000 2250000 0 0 # ====================================== # ==== This Section for genuine BMP ======= # 200Kbps, don't use TPIU and Manchester encoding # Typically used for 'real' BMP # monitor traceswo -# prepareSWD 72000000 200000 0 1 +# prepareSWO 72000000 200000 0 1 # ========================================= dwtSamplePC 1 -dwtSyncTAP 3 -dwtPostTAP 1 +dwtSyncTap 3 +dwtPostTap 1 dwtPostInit 1 dwtPostReset 15 dwtCycEna 1 diff --git a/Support/gdbtrace.init b/Support/gdbtrace.init index 67dcb6fa..00d5b728 100644 --- a/Support/gdbtrace.init +++ b/Support/gdbtrace.init @@ -13,11 +13,14 @@ STM32; enableSTM32TRACE: Start TRACE on STM32 pins IMXRT; - enableIMXRT102XSWO : Enable SWO on IMXRT102X series pins (AD_B0_04) - enableIMXRT106XSWO : Enable SWO on IMXRT106X series pins (AD_B0_10) + enableIMXRT102XSWO : Enable SWO on IMXRT102X series pins (AD_B0_04) + enableIMXRT102XTRACE: Start TRACE on IMXRT102X series pins + enableIMXRT106XSWO : Enable SWO on IMXRT106X series pins (AD_B0_10) + enableIMXRT117XSWO : Enable SWO on IMXRT117X series pin (LPSR_11) SAM5X; enableSAMD5XSWD : Enable SWO on SAM5X output pin on SAM5X + enableSAMD5XTRACE : Enable TRACE on SAM5x pins NRF; enableNRF52TRACE : Start TRACE on NRF52 (not nrf52833 or nrf52840) pins @@ -26,6 +29,10 @@ NRF; EFR32MG12; enableEFR32MG12SWO : Start SWO on EFR32MG12 pins +S32K344; + enableS32K344SWO : Enable SWO on S32K344 pins + enableS32K344TRACE : Start TRACE on S32K344 pins + TM4C; enableTM4C123TRACE : Start TRACE on TM4C123 pins (defaults to 2 pin mode as 4 pin trace is unavailable on all) @@ -79,6 +86,10 @@ set $CPU_IMXRT106X=1 set $CPU_NRF=3 set $CPU_EFR32=4 set $CPU_TM4C=5 +set $CPU_S32K344=6 +set $CPU_IMXRT117X=7 +set $CPU_KINETIS=8 +set $CPU_SAMD5x=9 # ==================================================================== set $CDBBASE=0xE000EDF0 @@ -88,18 +99,102 @@ set $TPIUBASE=0xE0040000 set $ETMBASE=0xE0041000 define _setAddressesSTM32 - -# Locations in the memory map for interesting things on STM32 + # Locations in the memory map for interesting things on STM32 + set $RCCBASE = 0x40023800 + set $GPIOBASE = 0x40020000 end define _setAddressesIMXRT # Locations in the memory map for interesting things on IMXRT end +define _setAddressesIMXRT117X + # Locations in the memory map for interesting things on IMXRT117X. + set $TPIU_TRACE_BASE = 0xe0046000 + set $TPIU_SWO_BASE = 0xe0048000 + set $FUNNEL_CSSYS_BASE = 0xe0045000 + set $FUNNEL_M7_BASE = 0xe0043000 + + # Indicate use of IMXRT117X as the target. + set $CPU = $CPU_IMXRT117X +end + +define _setAddressesKinetis + set $SIM_BASE = 0x40047000 + # sim->sopt2 bit12 is trace clk sel (reset is system clock) + set $SIM_SOPT2 = $SIM_BASE + 0x1004 + # clkdiv4 has tracediv/tracefrac + set $SIM_CLKDIV4 = $SIM_BASE + 0x1068 + # sim->mcr has traceclk disable + set $SIM_MCR = $SIM_BASE + 0x106c + + set $MCM_BASE = 0xE0080000 + set $MCM_ETBCC = $MCM_BASE + 0x14 + + set $CPU = $CPU_KINETIS +end + define _setAddressesNRF # Locations in the memory map for interesting things on NRF end +define _setAddressesETM4 +# Locations in the memory map for ETMv4 registers + +set $ETM4BASE=0xE0041000 +# Programming Control Register +set $TRCPRGCTLR=$ETM4BASE+0x004 +# Select Control Register +set $TRCPROCSELR=$ETM4BASE+0x008 +# Trace Status Register +set $TRCSTATR=$ETM4BASE+0x00C +# Trace Configuration Register +set $TRCCONFIGR=$ETM4BASE+0x010 +# Auxiliary Control Register +set $TRCAUXCTLR=$ETM4BASE+0x018 +# Event Control 0 Register +set $TRCEVENTCTL0R=$ETM4BASE+0x020 +# Event Control 1 Register +set $TRCEVENTCTL1R=$ETM4BASE+0x024 +# Stall Control Register +set $TRCSTALLCTLR=$ETM4BASE+0x02C +# Global Timestamp Control Register +set $TRCTSCTLR=$ETM4BASE+0x030 +# Synchronization Period Register +set $TRCSYNCPR=$ETM4BASE+0x034 +# Cycle Count Control Register +set $TRCCCCTLR=$ETM4BASE+0x038 +# Branch Broadcast Control Register +set $TRCBBCTLR=$ETM4BASE+0x03c +# Trace ID Register +set $TRCTRACEIDR=$ETM4BASE+0x040 +# Q Element Control Register +set $TRCQCTLR=$ETM4BASE+0x044 +# ViewInst Main Control Register +set $TRCVICTLR=$ETM4BASE+0x080 +# ViewInst Include/Exclude Control Register +set $TRCVIIECTLR=$ETM4BASE+0x084 +# ViewInst Start/Stop Control Register +set $TRCVISSCTLR=$ETM4BASE+0x088 +# ViewInst Start/Stop PE Comparator Control Register +set $TRCVIPCSSCTLR=$ETM4BASE+0x08c +# ViewData Main Control Register +set $TRCVDCTLR=$ETM4BASE+0x0a0 +# ViewData Include/Exclude Single Address Comparator Control Register +set $TRCVDSACCTLR=$ETM4BASE+0x0a4 +# ViewData Include/Exclude Address Range Compa +set $TRCVDARCCTLR=$ETM4BASE+0x0a8 +# Device architecture register +set $TRCDEVARCH=$ETM4BASE+0xFBC +# Trace IDR base address +set $TRCIDR0=$ETM4BASE+0x1E0 +end +# Trace Address comparator Value registers +set $TRCACVR0=$ETMBASE+0x400 +set $TRCACVR1=$ETMBASE+0x400+8*1 +set $TRCACATR0=$ETMBASE+0x480 +set $TRCACATR1=$ETMBASE+0x480+8*1 + define _setAddressesNRF52 _setAddressesNRF set $NRF_P0_PIN_CNF=0x50000700 @@ -135,20 +230,127 @@ define _setAddressesTM4C set $GPIOUNLOCKKEY=0x4C4F434B end -# ==================================================================== -define startETM - set language c +define _setAddressesS32K344 + # Below are the base addresses of trace bus components that must be + # configured in S32K344. Refer to Table 695 and Figure 512 in + # NXP S32K3XXRM for info about where all these funnels are placed. + set $FUNNEL_0_BASE = 0x40241000 + set $FUNNEL_1_BASE = 0x40242000 + set $FUNNEL_2_BASE = 0x40243000 + set $ETF_CM7_CLUSTER_ETMI_BASE = 0x40244000 + set $ETF_CM7_CLUSTER_ETMD_BASE = 0x40245000 + set $ETF_SHARED_SYSTEM_BASE = 0x40247000 + set $TPIU_TRACE_BASE = 0x4024A000 + set $TPIU_SWO_BASE = 0x4024B000 - set $br_out=0 + # Indicate use of S32K344 as the target. + set $CPU = $CPU_S32K344 +end + +define _setupTraceBusS32K344 + # Configures the trace bus components in S32K344 to allow trace messages to + # flow from trace sources to TPIUs. Also configures internal trace clock to + # drive the TPIUs. Assumes that _setAdressesS32K344 has been run prior. + + # Parse divider argument. if $argc >= 1 - set $br_out=$arg0 + set $traceclk_div = $arg0 + else + # When divider is not specified, we're likely using SWO. In that case, we + # want to set the internal trace clock very fast (i.e. divider very low) to + # ensure the SWO TPIU can keep up with the trace bus and SWO data rate. + set $traceclk_div = 1 + end + + # Enable access to the funnels and ETFs. + set *($FUNNEL_0_BASE + 0xfb0) = 0xc5acce55 + set *($FUNNEL_1_BASE + 0xfb0) = 0xc5acce55 + set *($FUNNEL_2_BASE + 0xfb0) = 0xc5acce55 + set *($ETF_CM7_CLUSTER_ETMI_BASE + 0xfb0) = 0xc5acce55 + set *($ETF_CM7_CLUSTER_ETMD_BASE + 0xfb0) = 0xc5acce55 + set *($ETF_SHARED_SYSTEM_BASE + 0xfb0) = 0xc5acce55 + + # Enable all inputs of all funnels to ensure that all trace sources + # can pass. Enabling all inputs is probably not optimal, so this + # might be changed in the future. + set *($FUNNEL_0_BASE) |= 0xff + set *($FUNNEL_1_BASE) |= 0xff + set *($FUNNEL_2_BASE) |= 0xff + + # Configure all ETFs in hardware FIFO mode. This configuration is + # based on section 2.2.2 from ARM DDI0461B. + set *($ETF_CM7_CLUSTER_ETMI_BASE + 0x28) = 0x2 + set *($ETF_CM7_CLUSTER_ETMI_BASE + 0x304) = 0x3 + set *($ETF_CM7_CLUSTER_ETMI_BASE + 0x20) = 0x1 + + set *($ETF_CM7_CLUSTER_ETMD_BASE + 0x28) = 0x2 + set *($ETF_CM7_CLUSTER_ETMD_BASE + 0x304) = 0x3 + set *($ETF_CM7_CLUSTER_ETMD_BASE + 0x20) = 0x1 + + set *($ETF_SHARED_SYSTEM_BASE + 0x28) = 0x2 + set *($ETF_SHARED_SYSTEM_BASE + 0x304) = 0x3 + set *($ETF_SHARED_SYSTEM_BASE + 0x20) = 0x1 + + # Configure trace clock source (MC_CGM MUX_11_CSC) and divider (MC_CGM + # MUX_11_DC_0). PLL_PHI0_CLK is selected as the clock source in the clocking + # multiplexer, and the division factor between PLL_PHI0_CLK and the trace + # clock is derived from command arguments. + set *(0x402d85c0) = 0x08000000 + set *(0x402d85c8) = (1 << 31) | ($traceclk_div << 16) +end + +# ==================================================================== +define _startETMv4 + # Enable the return stack, global timestamping, Context ID, and Virtual context identifier tracing. + set *($TRCCONFIGR) = 0x000018C1 + + # Disable all event tracing. + set *($TRCEVENTCTL0R) = 0 + set *($TRCEVENTCTL1R) = 0 + + # Disable or enable stalling for instructions, if implemented + if ($stall!=0) + set *($TRCSTALLCTLR) = 0 + else + set *($TRCSTALLCTLR) = (1<<13)|(1<<8)|(0x0f<<0) end - set $stall = 0 - if $argc >= 2 - set $stall = $arg1 + # Trace sync every 4096 bytes of trace + set *($TRCSYNCPR) = 0x0c + + # Do we want branch broadcasting? + set *$TRCACVR0=0 + set *$TRCACVR1=0xFFFFFFFF + set *$TRCACATR0=0 + set *$TRCACATR1=0 + set *($TRCCONFIGR) |= ($br_out<<3) + set *($TRCBBCTLR) = ($br_out<<8)|0x03 + + # Trace on ID 2 + set *($TRCTRACEIDR) = 2 + + # Disable timestamp event + set *($TRCTSCTLR) = 0 + + # Enable ViewInst to trace everything + set *($TRCVICTLR) = 0x201 + + # No address range filtering for ViewInst + set *($TRCVIIECTLR) = 0 + + # No start or stop points for ViewInst + set *($TRCVISSCTLR) = 0 + + # ...and start + set *($TRCPRGCTLR) |= (1<<0) + + while (((*$TRCSTATR)&(1<<0))==1) + echo Wait for trace not idle\n end +end +# ==================================================================== +define _startETMv35 # Allow access to device set *($ETMBASE+0xfb0) = 0xc5acce55 @@ -178,83 +380,186 @@ define startETM # Essential that this bit is only cleared after everything else is done set *($ETMBASE) &= ~(1<<10) - set language auto end +# ==================================================================== + +define stopETM + _setAddressesETM4 + if (((*$TRCDEVARCH)&0xfff0ffff) ==0x47704a13) + set *($TRCPRGCTLR) &= ~(1<<0) + while ((*$TRCSTATR)&(1<<0)==0) + echo Wait for idle\n + end + else + set *($ETMBASE) |= 0x400 + end +end +document stopETM +stopETM +end + +# ==================================================================== + +define startETM + #set language c + + set $br_out=0 + if $argc >= 1 + set $br_out=$arg0 + end + + _setAddressesETM4 + stopETM + + set $br_out=0 + if $argc >= 1 + set $br_out=$arg0 + end + + set $stall = 0 + if $argc >= 2 + set $stall = $arg1 + end + + + if (((*$TRCDEVARCH)&0xfff0ffff) ==0x47704a13) + _startETMv4 + else + _startETMv35 + end + + #set language auto + +end + document startETM startETM + +Start ETMv3.5 or v4 macrocell + : 1 = Explicitly report branch events : 1 = Stall the CPU when trace buffer is full end # ==================================================================== define describeETM - set language c - set $etmval = *($ETMBASE+0x1e4) - output ((($etmval>>8)&0x0f)+1) - echo . - output (($etmval>>4)&0x0f) - echo Rev - output (($etmval)&0x0f) - echo \n - if (((($etmval)>>24)&0xff)==0x41) - echo Implementer is ARM\n - end - if (((($etmval)>>24)&0xff)==0x44) - echo Implementer is DEC\n - end - if (((($etmval)>>24)&0xff)==0x4D) - echo Implementer is Motorola/Freescale/NXP\n - end - if (((($etmval)>>24)&0xff)==0x51) - echo Implementer is Qualcomm\n - end - if (((($etmval)>>24)&0xff)==0x56) - echo Implementer is Marvell\n - end - if (((($etmval)>>24)&0xff)==0x69) - echo Implementer is Intel\n - end + #set language c + + if (((*$TRCDEVARCH)&0xfff0ffff) ==0x47704a13) + echo ETMv4. + output (((*$TRCDEVARCH)>>16)&0x0f) + echo \n + set $i=0 + while $i<8 + output $i + echo : + output/x *($TRCIDR0+4*$i) + set $i = $i+1 + echo \n + end - if ($etmval&(1<<18)) - echo 32-bit Thumb instruction is traced as single instruction\n + if (((*$TRCIDR0)>>1)&3==3) + echo Tracing of Load and Store instructions as P0 elements is supported\n else - echo 32-bit Thumb instruction is traced as two instructions\n - end - if ($etmval&(1<<19)) - echo Implements ARM architecture security extensions\n + echo Tracing of Load and Store instructions as P0 elements is not supported\n + end + + if (((*$TRCIDR0)>>3)&3==3) + echo Data tracing is supported\n else - echo No ARM architecture security extensions\n - end - if ($etmval&(1<<20)) - echo Uses alternative Branch Packet Encoding\n + echo Data tracing is not supported\n + end + + if (((*$TRCIDR0)>>5)&1==1) + echo Branch broadcast is supported\n else - echo Uses original Branch Packet Encoding\n - end + echo Branch broadcast is not supported\n + end - set language auto -end -document describeETM -Provide information about the ETM implementation on this target. -end + if (((*$TRCIDR0)>>6)&1==1) + echo Conditional Tracing is supported\n + else + echo Conditional Tracing is not supported\n + end -# ==================================================================== + if (((*$TRCIDR0)>>7)&1==1) + echo Instruction Cycle Counting is supported\n + else + echo Instruction Cycle Counting is not supported\n + end -define stopETM - set language c + if (((*$TRCIDR0)>>9)&1==1) + echo Return Stacking is supported\n + else + echo Return Stacking is not supported\n + end - set *($ETMBASE) |= 0x400 + if (((*($TRCIDR0+12))>>26)&3==3) + echo Stall is supported\n + else + echo Stalling is not supported\n + end + + else + set $etmval = *($ETMBASE+0x1e4) + output ((($etmval>>8)&0x0f)+1) + echo . + output (($etmval>>4)&0x0f) + echo Rev + output (($etmval)&0x0f) + echo \n + + if (((($etmval)>>24)&0xff)==0x41) + echo Implementer is ARM\n + end + if (((($etmval)>>24)&0xff)==0x44) + echo Implementer is DEC\n + end + if (((($etmval)>>24)&0xff)==0x4D) + echo Implementer is Motorola/Freescale/NXP\n + end + if (((($etmval)>>24)&0xff)==0x51) + echo Implementer is Qualcomm\n + end + if (((($etmval)>>24)&0xff)==0x56) + echo Implementer is Marvell\n + end + if (((($etmval)>>24)&0xff)==0x69) + echo Implementer is Intel\n + end + + if ($etmval&(1<<18)) + echo 32-bit Thumb instruction is traced as single instruction\n + else + echo 32-bit Thumb instruction is traced as two instructions\n + end + + if ($etmval&(1<<19)) + echo Implements ARM architecture security extensions\n + else + echo No ARM architecture security extensions\n + end + + if ($etmval&(1<<20)) + echo Uses alternative Branch Packet Encoding\n + else + echo Uses original Branch Packet Encoding\n + end + end + + #set language auto - set language auto end -document stopETM -stopETM + +document describeETM +Provide information about the ETM implementation on this target. end # ==================================================================== define prepareSWO - set language c + #set language c set $clockspeed=72000000 set $speed=2250000 @@ -309,7 +614,7 @@ define prepareSWO set *($DWTBASE) = 0 set *($ITMBASE+0xe80) = 0 - set language auto + #set language auto end document prepareSWO prepareSWO : Prepare output trace data port at specified speed @@ -321,7 +626,7 @@ end # ==================================================================== define enableIMXRT102XSWO - set language c + #set language c _setAddressesIMXRT @@ -336,28 +641,175 @@ define enableIMXRT102XSWO set *0x401F80E8=6 set *0x401F825C=0x6020 - set language auto + #set language auto end document enableIMXRT102XSWO enableIMXRT102XSWO Configure output pin on IMXRT102X for SWO use. end define enableIMXRT1021SWO - set language c + #set language c enableIMXRT102XSWO + #set language auto end # ==================================================================== -define enableIMXRT106XSWO +define enableIMXRT101XTRACE + set language c + + set $drive=4 + set $bits=4 + + if $argc >= 1 + set $bits = $arg0 + end + if (($bits<1) || ($bits==3) || ($bits>4)) + help enableIMXRT101XTRACE + end + + if $argc >= 2 + set $drive = $arg1 + end + + if ($drive > 7) + help enableIMXRT101XTRACE + end + + set $bits = $bits-1 + + set $CPU=$CPU_IMXRT101X + _setAddressesIMXRT + + # Ensure IOMUX clocks are on + set *0x400FC078 |= 3<<2 + + # =========== SORT OUT PINS FOR TRACE ============================ + + # Do not set drive strength to 2 or 3 here...it causes crashes. No idea why + # Mostly works set $padval = ( 0<<0 ) | (1<<12) | (0<<14) | (1<<13) | (2<<6) | ($drive<<3) + set $padval = ( 1<<0 ) | (1<<12) | (0<<14) | (1<<13) | (2<<6) | ($drive<<3) + + # TRACECLK ALT7 on GPIO_AD_02 + # TRACEDATA0 ALT7 on GPIO_AD_00 + set *0x401f8040 = 7 + set *0x401f8048 = 7 + set *0x401f80f0 = $padval + set *0x401f80f8 = $padval + + if ($bits>0) + # TRACEDATA1 on GPIO_13 + set *0x401f8088 = 7 + set *0x401f8138 = $padval + end + + if ($bits>1) + # TRACEDATA2 on GPIO_12 + set *0x401f808c = 7 + set *0x401f813c = $padval + # TRACEDATA3 on GPIO_11 + set *0x401f8090 = 7 + set *0x401f8140 = $padval + end + # =========== END IF SORTING OUT PINS FOR TRACE ================== + + # =========== SORT OUT CLOCK FOR TRACE ================= + # Turn off clock while setting up PODF (CCGR0 CG11) + set *0x400fc068 = ((*0x400fc068) & ~(3<<22)) + + # With clock gated we can safely update CSCDR1 TRACE_PODF for /4 + set *0x400fc024 = ((*0x400fc024) & ~(0xf<<25)) | (14<<25) + # ...and set source to PLL2 (can also be PLL2PFD2 PLL2PFD0 or PLL2PFD1) + set *0x400fc018 = ((*0x400fc018) & ~(3<<14)) | (0<<14) + + # Clock back on (CCGR0 CG11) + set *0x400fc068 |= (3<<22) + # =========== END OF SORTING OUT CLOCK FOR TRACE ================= + + #Enable DEMCR + set *(0xE000EDFC)|=(1<<24) + + # Set port size (TPIU_CSPSR) + set *($TPIUBASE+4) = (1<<$bits) + + # Set TPIU_SPPR to parallel trace port mode + set *($TPIUBASE+0xf0) = 0 + + set *($TPIUBASE+0x304) = 0x102 + set language auto +end + +document enableIMXRT101XTRACE +enableIMXRT101XTRACE : Enable TRACE on IMXRT1010 pins + : Number of bits wide (1,2 or 4 only) + : Drive strength (0=lowest, 7=highest) +end +# ==================================================================== +define enableIMXRT102XTRACE set language c + set $drive=1 + set $bits=1 + + set $CPU=$CPU_IMXRT102X + _setAddressesIMXRT + + set *0x400FC078 |= 3<<2 + + # =========== SORT OUT PINS FOR TRACE ============================ + + # TRACECLK ALT6 on GPIO_AD_B0_10 + # TRACEDATA0 ALT6 on GPIO_AD_B0_12 + set *0x401f80ec = 6 + set *0x401f80e4 = 6 + + # Do not set drive strength to 2 or 3 here...it causes crashes. No idea why +# Mostly works set $padval = ( 0<<0 ) | (1<<12) | (0<<14) | (1<<13) | (2<<6) | (4<<3) + set $padval = ( 0<<0 ) | (0<<12) | (0<<14) | (1<<13) | (3<<6) | (2<<3) +#set $padval = 0x10b0 + set *0x401f8258 = $padval + set *0x401f8260 = $padval + # =========== END IF SORTING OUT PINS FOR TRACE ================== + + + # =========== SORT OUT CLOCK FOR TRACE ================= + # Turn off clock while setting up PODF (CCGR0 CG11) + set *0x400fc068 = ((*0x400fc068) & ~(3<<22)) + + # With clock gated we can safely update CSCDR1 TRACE_PODF for /4 + set *0x400fc024 = ((*0x400fc024) & ~(3<<25)) | (3<<25) + # ...and set source to PLL2 (can also be PLL2PFD2 PLL2PFD0 or PLL2PFD1) + set *0x400fc018 = ((*0x400fc018) & ~(3<<14)) | (1<<14) + + # Clock back on (CCGR0 CG11) + set *0x400fc068 |= (3<<22) + # =========== END OF SORTING OUT CLOCK FOR TRACE ================= + + #Enable DEMCR + set *(0xE000EDFC)|=(1<<24) + + # Set port size (TPIU_CSPSR) + set *($TPIUBASE+4) = (1<<($bits-1)) + + # Set TPIU_SPPR to parallel trace port mode + set *($TPIUBASE+0xf0) = 0 + + set *($TPIUBASE+0x304) = 0x102 + set language auto +end +document enableIMXRT102XTRACE +enableIMXRT102XTRACE : Enable TRACE on IMXRT1020 pins (only 1-bit is supported by the chip) +end +# ==================================================================== +define enableIMXRT106XSWO + #set language c + _setAddressesIMXRT # Store the CPU we are using set $CPU=$CPU_IMXRT106X # Disable Trace Clocks while we change them (CCM_CCGR0) -# set *0x400FC068&=~(3<<22) - set *0x400FC068|=(3<<22) + set *0x400FC068&=~(3<<22) + set *0x400FC068|=(3<<22) # Set Trace clock input to be from PLL2 PFD2 (CBCMR1, 396 MHz) set *0x400Fc018&=~(3<<14) @@ -374,15 +826,60 @@ define enableIMXRT106XSWO set *0x401F80E4=9 set *0x401F82D4=0xB0A1 - set language auto + #set language auto end document enableIMXRT106XSWO enableIMXRT1021SWO Configure output pin on IMXRT1060 for SWO use. end # ==================================================================== -define enableSTM32SWO +define enableIMXRT117XSWO + #set language c + _setAddressesIMXRT117X + + # Configure trace funnels/ATB. + set *($FUNNEL_CSSYS_BASE + 0xfb0) = 0xc5acce55 + set *($FUNNEL_CSSYS_BASE) |= 0xff + + set *($FUNNEL_M7_BASE + 0xfb0) = 0xc5acce55 + set *($FUNNEL_M7_BASE) |= 0xff + + # TODO: configure trace subsystem clocks. + + # Configure GPIO_LPSR_11 mux and pad for SWO. + set *(0x40c0802c) = 0x7 + set *(0x40c0806c) = 0x2 + + # Allow access to SWO TPIU registers. + set *($TPIU_SWO_BASE + 0xfb0) = 0xc5acce55 + + # Set $TPIUBASE for use by other commands in this file. + set $TPIUBASE = $TPIU_SWO_BASE + + #set language auto +end + +# ==================================================================== + +define enableKinetisSWO + _setAddressesKinetis set language c + # itm->tpiu not disabled + set *($MCM_ETBCC) &= ~(1<<5) + # trace clk not disabled + set *($SIM_MCR) &= ~(1<<31) + + # SWO is on pin PTA2 + # set PCRA2->mux = 7 + set *0x40049008 |= (7<<8) + # set GPIOA->PDDR pta2 to be output + set *0x400FF014 |= (1<<2) + + set language auto +end + +define enableSTM32SWO + #set language c set $tgt=1 if $argc >= 1 @@ -390,20 +887,11 @@ define enableSTM32SWO end set $CPU=$CPU_STM32 - _setAddressesSTM32 + _setAddressesSTM32 + if (($tgt==4) || ($tgt==7)) - # STM32F4/7 variant. - # Enable AHB1ENR - set *0x40023830 |= 0x02 - # Set MODER for PB3 - set *0x40020400 &= ~(0x000000C0) - set *0x40020400 |= 0x00000080 - # Set max (100MHz) speed in OSPEEDR - set *0x40020408 |= 0x000000C0 - # No pull up or down in PUPDR - set *0x4002040C &= ~(0x000000C0) - # Set AF0 (==TRACESWO) in AFRL - set *0x40020420 &= ~(0x0000F000) + # STM32F4/7 variant: SWO on PB3. + enableSTM32Pin 1 3 3 else # STM32F1 variant. # RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; @@ -415,14 +903,14 @@ define enableSTM32SWO # DBGMCU->CR |= DBGMCU_CR_TRACE_IOEN; set *0xE0042004 |= 0x20 - set language auto + #set language auto end document enableSTM32SWO enableSTM32SWO Configure output pin on STM32 for SWO use. end # ==================================================================== define enableSAMD5XSWD - set language c + #set language c # Enable peripheral channel clock on GCLK#0 # GCLK->PHCTRL[47] = GCLK_PCHCTRL_GEN(0) @@ -433,15 +921,14 @@ define enableSAMD5XSWD set *(unsigned char *)0x410080BF |= 0x07 set *(unsigned char *)0x410080DE = 0x01 - set language auto + #set language auto end document enableSAMD5XSWD enableSAMD5XSWD Configure output pin on SAM5X for SWO use. end - # ==================================================================== define enableEFR32MG12SWO - set language c + #set language c _setAddressesEFR32MG12 @@ -470,12 +957,36 @@ define enableEFR32MG12SWO set *0x4000A0F4 &= ~(0xF00) set *0x4000A0F4 |= (4 << 8) - set language auto + #set language auto end document enableEFR32MG12SWO enableEFR32MG12SWO Configure output pin on EFR32MG12 for SWO use. end +# ==================================================================== +define enableS32K344SWO + #set language c + + _setAddressesS32K344 + _setupTraceBusS32K344 + + # Disable parallel trace TPIU backpressure (we only use SWO) through MDM_AP + # register. Note: uses monitor command from pyOCD, since accessing this + # register through the system bus doesn't work for some reason. + monitor wap 6 0x4 0x06100000 + + # Configure I/O pad PTA10 for SWO: output mode, high slew rate, etc. + set *(0x40290268) = 0x00200127 + + # Overwrite TPIUBASE with TPIU_SWO_BASE of S32K344 for use in subsequent + # commands. + set $TPIUBASE = $TPIU_SWO_BASE + + #set language auto +end +document enableS32K344SWO +enableS32K344SWO Configure output pin on S32K344 for SWO use. +end # ==================================================================== # Enable CORTEX TRACE on preconfigured pins @@ -491,10 +1002,58 @@ define _doTRACE # Set pin protocol to Sync Trace Port (TPIU_SPPR) set *($TPIUBASE+0xF0)=0 + + set *($TPIUBASE+0x304) = 0x102 end + +# ==================================================================== +define enableSTM32Pin + #set language c + _setAddressesSTM32 + set $_GPIOPORT = $GPIOBASE + 0x400 * $arg0 + + # Enable GPIO port in RCC + set *($RCCBASE + 0x30) |= (0x1<<$arg0) + + # MODER: Alternate Function + set *($_GPIOPORT+0x00) &= ~(0x3<<2*$arg1) + set *($_GPIOPORT+0x00) |= 0x2<<2*$arg1 + + # OTYPER: Push-Pull + set *($_GPIOPORT+0x04) &= ~(0x1<<$arg1) + + # OSPEEDR: Drive speed + set *($_GPIOPORT+0x08) &= ~(0x3<<2*$arg1) + set *($_GPIOPORT+0x08) |= $arg2<<2*$arg1 + + # PUPDR: No pullup or pulldown + set *($_GPIOPORT+0x0C) &= ~(0x3<<2*$arg1) + + # AFRL: AF0 + if ($arg1 < 8) + set *($_GPIOPORT+0x20) &= ~(0xF<<4*$arg1) + else + set *($_GPIOPORT+0x24) &= ~(0xF<<4*($arg1 - 8)) + end + + # LOCKR: lock pin until the next reset + set *($_GPIOPORT+0x1C) = 0x10000 | (0x1<<$arg1) + set *($_GPIOPORT+0x1C) = 0x00000 | (0x1<<$arg1) + set *($_GPIOPORT+0x1C) = 0x10000 | (0x1<<$arg1) + set $_null = *($_GPIOPORT+0x1C) + + #set language auto +end +document enableSTM32Pin +enableSTM32Pin : Enable TRACE function AF0 on a single STM32 pin + : Number of the port (0=A, 1=B, 2=C, 3=D, 4=E, 5=F, 6=G, ...) + : Pin number in [0, 15] + : Drive strength (0=lowest, 3=highest) +end + # ==================================================================== define enableSTM32TRACE - set language c + #set language c set $bits=4 set $drive=1 @@ -510,7 +1069,6 @@ define enableSTM32TRACE set $drive = $arg1 end -print $drive if ($drive > 3) help enableSTM32TRACE end @@ -519,46 +1077,27 @@ print $drive set $CPU=$CPU_STM32 _setAddressesSTM32 - # Enable AHB1ENR - set *0x40023830 |= 0x10 + + # Enable Trace TRCENA (DCB DEMCR) needed for clocks + set *($CDBBASE+0xC)=(1<<24) # Enable compensation cell set *0x40023844 |= (1<<14) set *0x40013820 |=1 # Setup PE2 & PE3 - # Port Mode - set *0x40021000 &= ~(0x000000F0) - set *0x40021000 |= 0xA0 - - # Drive speed - set *0x40021008 &= ~0xf0 - set *0x40021008 |= ($drive<<4)|($drive<<6) - - # No Pull up or down - set *0x4002100C &= ~0xF0 - # AF0 - set *0x40021020 &= ~0xF0 + enableSTM32Pin 4 2 $drive + enableSTM32Pin 4 3 $drive if ($bits>0) # Setup PE4 - set *0x40021000 &= ~(0x00000300) - set *0x40021000 |= 0x200 - set *0x40021008 &= ~0x300 - set *0x40021008 |= ($drive<<8) - set *0x4002100C &= ~0x300 - set *0x40021020 &= ~0x300 + enableSTM32Pin 4 4 $drive end if ($bits>1) # Setup PE5 & PE6 - - set *0x40021000 &= ~(0x00003C00) - set *0x40021000 |= 0x2800 - set *0x40021008 &= ~0x3C00 - set *0x40021008 |= ($drive<<10)|($drive<<12) - set *0x4002100C &= ~0x3C00 - set *0x40021020 &= ~0x3C00 + enableSTM32Pin 4 5 $drive + enableSTM32Pin 4 6 $drive end # Set number of bits in DBGMCU_CR @@ -576,16 +1115,16 @@ print $drive # Finally start the trace output _doTRACE - set language auto + #set language auto end document enableSTM32TRACE -enableSTM32TRACE : Enable TRACE on STM32 pins +enableSTM32TRACE : Enable TRACE on STM32 pins : Number of bits wide (1,2 or 4 only) : Drive strength (0=lowest, 3=highest) end # ==================================================================== define enableNRF52TRACE - set language c + #set language c set $bits=4 set $cspeed=1 @@ -595,7 +1134,7 @@ define enableNRF52TRACE set $bits = $arg0 end if (($bits<1) || ($bits==3) || ($bits>4)) - help enableNRF53TRACE + help enableNRF52TRACE end if $argc >= 2 @@ -644,17 +1183,17 @@ define enableNRF52TRACE # Finally start the trace output _doTRACE - set language auto + #set language auto end document enableNRF52TRACE -enableNRF52TRACE : Enable TRACE on NRF52 pins (not nrf52833 or nrf52840) +enableNRF52TRACE : Enable TRACE on NRF52 pins (not nrf52833 or nrf52840) : Number of bits wide (1,2 or 4 only) : Drive strength (0 (low), 3 (high)) : Clock Speed (0..3, 0 fastest) end # ==================================================================== define enableNRF53TRACE - set language c + #set language c set $bits=4 set $cspeed=1 @@ -732,17 +1271,17 @@ define enableNRF53TRACE # Finally start the trace output _doTRACE - set language auto + #set language auto end document enableNRF53TRACE -enableNRF53TRACE : Enable TRACE on NRF pins +enableNRF53TRACE : Enable TRACE on NRF pins : Number of bits wide (1,2 or 4 only) : Drive strength (0 (lowest), 1, 2, 3 or 11 (highest)) : Clock Speed (0..3, 0 fastest) end # ==================================================================== define enableTM4C123TRACE - set language c + #set language c set $bits=2 set $drive=2 @@ -824,16 +1363,218 @@ define enableTM4C123TRACE # Finally start the trace output _doTRACE - set language auto + #set language auto end document enableTM4C123TRACE -enableTM4C123TRACE : Enable TRACE on STM32 pins +enableTM4C123TRACE : Enable TRACE on STM32 pins : Number of bits wide (1,2 or 4 only (2 default)) : Drive strength (0=lowest, 2=highest) end + +# ==================================================================== +define enableS32K344TRACE + #set language c + + set $bits = 4 + set $drive = 1 + set $traceclk_div = 2 + set $args_valid = 1 + + # Parse width argument. + if $argc >= 1 + if (($arg0 < 1) || ($arg0 == 3) || ($arg0 > 4)) + help enableS32K344TRACE + set $args_valid = 0 + end + + # _doTRACE command (called at the end) expects bitcount to be decremented + # by 1 compared to value provided by argument, so do that here. + set $bits = $arg0 - 1 + end + + # Parse drive argument. + if $argc >= 2 + if (($arg1 < 0) || ($arg1 > 1)) + help enableS32K344TRACE + set $args_valid = 0 + end + + set $drive = $arg1 + end + + # Parse divider argument. + if $argc >= 3 + if (($arg2 < 1) || ($arg2 > 8)) + help enableS32K344TRACE + set $args_valid = 0 + end + + # Clock divider for trace clock divides by division value + 1, so we must + # write the argument provided decremented by 1 into the register. + set $traceclk_div = $arg2 - 1 + end + + # Only execute the rest if all arguments were valid. + if $args_valid + _setAddressesS32K344 + _setupTraceBusS32K344 $traceclk_div + + # Disable SWO TPIU backpressure (we only use parallel trace) through MDM_AP + # register. Note: uses monitor command from pyOCD, since accessing this + # register through the system bus doesn't work for some reason. + monitor wap 6 0x4 0x06400000 + + # Note: the configuration of the trace pins below assume that specific pins + # are used. Depending on the development kit, however, other chip pins + # could have been used to expose the parallel trace interface. + + # I/O pad PTC2 for TRACECLK (SIUL2 MSCR66). + set *(0x40290348) = 0x00204026 | ($drive << 8) + + # I/O pad PTD7 for trace D0 (SIUL2 MSCR103). + set *(0x402903dc) = 0x00200026 | ($drive << 8) + + if $bits > 0 + # I/O pad PTD12 for trace D1 (SIUL2 MSCR108). + set *(0x402903f0) = 0x00200024 | ($drive << 8) + end + + if $bits > 1 + # I/O pad PTD11 for trace D2 (SIUL2 MSCR107). + set *(0x402903ec) = 0x00200024 | ($drive << 8) + + # I/O pad PTD10 for trace D3 (SIUL2 MSCR106). + set *(0x402903e8) = 0x00200024 | ($drive << 8) + end + + # Overwrite TPIUBASE with TPIU_TRACE_BASE of S32K344 for use in subsequent + # function calls. + set $TPIUBASE = $TPIU_TRACE_BASE + + # Start the trace output. + _doTRACE + + #set language auto + end +end +document enableS32K344TRACE +enableS32K344TRACE : Enable parallel trace on S32K344 + : Number of bits wide (1, 2 or 4) + : Drive strength (0 (lowest) or 1 (highest)) + : Clock speed divider to derive TRACECLK from PLL_PHI0_CLK (0 (fastest) .. 8 (slowest)) +end + +# ==================================================================== +define enableLPC176xTRACE + set $bits=4 + + if $argc == 1 + set $bits = $arg0 + end + + if (($bits<1) || ($bits==3) || ($bits>4)) + help enableLPC176xTRACE + end + + # Enable trace pins (PINSEL10) + set *0x4002C028 = (1 << 3) + + # Enable Trace TRCENA (DCB DEMCR) + set *($CDBBASE+0xC)=(1<<24) + + # Start tracing + set $bits = $bits-1 + _doTRACE +end +document enableLPC176xTRACE +enableLPC176xTRACE Enable TRACE on LPC176x pins. + : Number of bits wide (1,2 or 4 only) +end +# ==================================================================== +define enableSAMD5XTRACE + #set language c + + set $bits=4 + set $drive=1 + + if $argc >= 1 + set $bits = $arg0 + end + if (($bits<1) || ($bits==3) || ($bits>4)) + help enableSAMD5XTRACE + end + + if $argc >= 2 + set $drive = $arg1 + end + + if ($drive > 1) + help enableSAMD5XTRACE + end + + set $bits = $bits-1 + set $CPU=$CPU_SAMD5x + + # Enable peripheral channel clock on GCLK#0 + # GCLK->PHCTRL[47] = GCLK_PCHCTRL_GEN(0) + set *(unsigned char *)0x40001D3C = 0 + # GCLK->PHCTRL[47] |= GCLK_PCHCTRL_CHEN + set *(unsigned char *)0x40001D3C |= 0x40 + + # Setup PC28 - pmux 7 + set *(unsigned char *)(0x41008000+0x80*2+0x30+28/2) &= ~0x0f + set *(unsigned char *)(0x41008000+0x80*2+0x30+28/2) |= 0x07 + set *(unsigned char *)(0x41008000+0x80*2+0x40+28) = (($drive) << 6) | 1 + + # Setup PC27 - pmux 7 + set *(unsigned char *)(0x41008000+0x80*2+0x30+27/2) &= ~0xf0 + set *(unsigned char *)(0x41008000+0x80*2+0x30+27/2) |= 0x70 + set *(unsigned char *)(0x41008000+0x80*2+0x40+27) = (($drive) << 6) | 1 + + if ($bits>0) + # Setup PC26 - pmux 7 + set *(unsigned char *)(0x41008000+0x80*2+0x30+26/2) &= ~0x0f + set *(unsigned char *)(0x41008000+0x80*2+0x30+26/2) |= 0x07 + set *(unsigned char *)(0x41008000+0x80*2+0x40+26) = (($drive) << 6) | 1 + end + + if ($bits>1) + # Setup PC25 - pmux 7 + set *(unsigned char *)(0x41008000+0x80*2+0x30+25/2) &= ~0xf0 + set *(unsigned char *)(0x41008000+0x80*2+0x30+25/2) |= 0x70 + set *(unsigned char *)(0x41008000+0x80*2+0x40+25) = (($drive) << 6) | 1 + + # Setup PC24 - pmux 7 + set *(unsigned char *)(0x41008000+0x80*2+0x30+24/2) &= ~0x0f + set *(unsigned char *)(0x41008000+0x80*2+0x30+24/2) |= 0x07 + set *(unsigned char *)(0x41008000+0x80*2+0x40+24) = (($drive) << 6) | 1 + end + + # Set number of bits in DBGMCU_CR + set *0xE0042004 &= ~(3<<6) + + if ($bits<3) + set *0xE0042004 |= ((($bits+1)<<6) | (1<<5)) + else + set *0xE0042004 |= ((3<<6) | (1<<5)) + end + + # Enable Trace TRCENA (DCB DEMCR) + set *($CDBBASE+0xC)=(1<<24) + + # Finally start the trace output + _doTRACE + + #set language auto +end +document enableSAMD5XTRACE +enableSAMD5XTRACE : Enable TRACE on SAM5x pins + : Number of bits wide (1,2 or 4 only) + : Drive strength (0=normal, 1=strong) +end # ==================================================================== define dwtPOSTCNT - set language c + #set language c if ($argc!=1) help dwtPOSTCNT @@ -846,14 +1587,14 @@ define dwtPOSTCNT end end - set language auto + #set language auto end document dwtPOSTCNT dwtPOSTCNT <0|1> Enable POSTCNT underflow event counter packet generation end # ==================================================================== define dwtFOLDEVT - set language c + #set language c if ($argc!=1) help dwtFOLDEVT @@ -866,14 +1607,14 @@ define dwtFOLDEVT end end - set language auto + #set language auto end document dwtFOLDEVT dwtFOLDEVT <0|1> Enable folded-instruction counter overflow event packet generation end # ==================================================================== define dwtLSUEVT - set language c + #set language c if ($argc!=1) help dwtLSUEVT @@ -886,14 +1627,14 @@ define dwtLSUEVT end end - set language auto + #set language auto end document dwtLSUEVT dwtLSUEVT <0|1> Enable LSU counter overflow event packet generation end # ==================================================================== define dwtSLEEPEVT - set language c + #set language c if ($argc!=1) help dwtSLEEPEVT @@ -906,17 +1647,17 @@ define dwtSLEEPEVT end end - set language auto + #set language auto end document dwtSLEEPEVT dwtSLEEPEVT <0|1> Enable Sleep counter overflow event packet generation end # ==================================================================== define dwtDEVEVT - set language c + #set language c if ($argc!=1) - help dwtCEVEVT + help dwtDEVEVT else set *($CDBBASE+0xC) |= 0x1000000 if ($arg0==1) @@ -926,14 +1667,14 @@ define dwtDEVEVT end end - set language auto + #set language auto end document dwtDEVEVT dwtDEVEVT <0|1> Enable Exception counter overflow event packet generation end # ==================================================================== define dwtCPIEVT - set language c + #set language c if ($argc!=1) help dwtCPIEVT @@ -946,14 +1687,14 @@ define dwtCPIEVT end end - set language auto + #set language auto end document dwtCPIEVT dwtCPIEVT <0|1> Enable CPI counter overflow event packet generation end # ==================================================================== define dwtTraceException - set language c + #set language c if ($argc!=1) help dwtTraceException @@ -966,14 +1707,14 @@ define dwtTraceException end end - set language auto + #set language auto end document dwtTraceException dwtTraceException <0|1> Enable Exception Trace Event packet generation end # ==================================================================== define dwtSamplePC - set language c + #set language c if ($argc!=1) help dwtSamplePC @@ -986,14 +1727,14 @@ define dwtSamplePC end end - set language auto + #set language auto end document dwtSamplePC dwtSamplePC <0|1> Enable PC sample using POSTCNT interval end # ==================================================================== define dwtSyncTap - set language c + #set language c if (($argc!=1) || ($arg0<0) || ($arg0>3)) help dwtSyncTap @@ -1003,14 +1744,14 @@ define dwtSyncTap set *($DWTBASE) |= (($arg0&0x03)<<10) end - set language auto + #set language auto end document dwtSyncTap dwtSyncTap <0..3> Set how often Sync packets are sent out (None, CYCCNT[24], CYCCNT[26] or CYCCNT[28]) end # ==================================================================== define dwtPostTap - set language c + #set language c if (($argc!=1) || ($arg0<0) || ($arg0>1)) help dwtPostTap @@ -1023,14 +1764,14 @@ define dwtPostTap end end - set language auto + #set language auto end document dwtPostTap dwtPostTap <0..1> Sets the POSTCNT tap (CYCCNT[6] or CYCCNT[10]) end # ==================================================================== define dwtPostInit - set language c + #set language c if (($argc!=1) || ($arg0<0) || ($arg0>15)) help dwtPostInit @@ -1040,14 +1781,14 @@ define dwtPostInit set *($DWTBASE) |= (($arg0&0x0f)<<5) end - set language auto + #set language auto end document dwtPostInit dwtPostInit <0..15> Sets the initial value for the POSTCNT counter end # ==================================================================== define dwtPostReset - set language c + #set language c if (($argc!=1) || ($arg0<0) || ($arg0>15)) help dwtPostReset @@ -1057,7 +1798,7 @@ define dwtPostReset set *($DWTBASE) |= (($arg0&0x0f)<<1) end - set language auto + #set language auto end document dwtPostReset dwtPostReset <0..15> Sets the reload value for the POSTCNT counter @@ -1066,7 +1807,7 @@ of sampling speeds. Lower numbers are faster. end # ==================================================================== define dwtCycEna - set language c + #set language c if ($argc!=1) help dwtCycEna @@ -1079,7 +1820,7 @@ define dwtCycEna end end - set language auto + #set language auto end document dwtCycEna dwtCycEna <0|1> Enable or disable CYCCNT @@ -1087,24 +1828,24 @@ end # ==================================================================== # ==================================================================== define ITMId - set language c + #set language c if (($argc!=1) || ($arg0<0) || ($arg0>127)) - help ITMBusId + help ITMId else set *($ITMBASE+0xfb0) = 0xc5acce55 set *($ITMBASE+0xe80) &= ~(0x7F<<16) set *($ITMBASE+0xe80) |= (($arg0&0x7f)<<16) end - set language auto + #set language auto end document ITMId ITMId <0..127>: Set the ITM ID for this device end # ==================================================================== define ITMGTSFreq - set language c + #set language c if (($argc!=1) || ($arg0<0) || ($arg0>3)) help ITMGTSFreq @@ -1114,7 +1855,7 @@ define ITMGTSFreq set *($ITMBASE+0xe80) |= (($arg0&3)<<10) end - set language auto + #set language auto end document ITMGTSFreq ITMGTSFreq <0..3> Set Global Timestamp frequency @@ -1123,24 +1864,24 @@ ITMGTSFreq <0..3> Set Global Timestamp frequency end # ==================================================================== define ITMTSPrescale - set language c + #set language c if (($argc!=1) || ($arg0<0) || ($arg0>3)) - help ITMGTSFreq + help ITMTSPrescale else set *($ITMBASE+0xfb0) = 0xc5acce55 set *($ITMBASE+0xe80) &= ~(0x3<<8) set *($ITMBASE+0xe80) |= (($arg0&3)<<8) end - set language auto + #set language auto end document ITMTSPrescale ITMTSPrescale <0..3> Set Timestamp Prescale [0-No Prescale, 1-/4, 2-/16, 3-/64 end # ==================================================================== define ITMSWOEna - set language c + #set language c if (($argc!=1) || ($arg0<0) || ($arg0>1)) help ITMSWOEna @@ -1153,7 +1894,7 @@ define ITMSWOEna end end - set language auto + #set language auto end document ITMSWOEna ITMSWOEna <0|1> 0-TS counter uses Processor Clock @@ -1161,7 +1902,7 @@ ITMSWOEna <0|1> 0-TS counter uses Processor Clock end # ==================================================================== define ITMTXEna - set language c + #set language c if (($argc!=1) || ($arg0<0) || ($arg0>1)) help ITMTXEna @@ -1174,7 +1915,7 @@ define ITMTXEna end end - set language auto + #set language auto end document ITMTXEna ITMTXEna <0|1> 0-DWT packets are not forwarded to the ITM @@ -1182,7 +1923,7 @@ ITMTXEna <0|1> 0-DWT packets are not forwarded to the ITM end # ==================================================================== define ITMSYNCEna - set language c + #set language c if (($argc!=1) || ($arg0<0) || ($arg0>1)) help ITMSYNCEna @@ -1195,7 +1936,7 @@ define ITMSYNCEna end end - set language auto + #set language auto end document ITMSYNCEna ITMSYNCEna <0|1> 0-Sync packets are not transmitted @@ -1203,7 +1944,7 @@ ITMSYNCEna <0|1> 0-Sync packets are not transmitted end # ==================================================================== define ITMTSEna - set language c + #set language c if (($argc!=1) || ($arg0<0) || ($arg0>1)) help ITMTSEna @@ -1216,14 +1957,14 @@ define ITMTSEna end end - set language auto + #set language auto end document ITMTSEna ITMTSEna <0|1> Enable local timestamp generation end # ==================================================================== define ITMEna - set language c + #set language c if (($argc!=1) || ($arg0<0) || ($arg0>1)) help ITMEna @@ -1236,14 +1977,14 @@ define ITMEna end end - set language auto + #set language auto end document ITMEna ITMEna <0|1> Master Enable for ITM end # ==================================================================== define ITMTER - set language c + #set language c if (($argc!=2) || ($arg0<0) || ($arg0>7)) help ITMTER @@ -1252,14 +1993,14 @@ define ITMTER set *($ITMBASE+0xe00+4*$arg0) = $arg1 end - set language auto + #set language auto end document ITMTER ITMTER Set Trace Enable Register bitmap for 32* end # ==================================================================== define ITMTPR - set language c + #set language c if ($argc!=1) help ITMTPR @@ -1268,9 +2009,33 @@ define ITMTPR set *($ITMBASE+0xe40) = $arg0 end - set language auto + #set language auto end document ITMTPR ITMTPR Enable block 8*bit access from unprivledged code end # ==================================================================== +define tracetest + set language c + + if ($argc!=1) + help tracetest + else + set *($TPIUBASE+0xfb0) = 0xc5acce55 + if ($arg0 == 0) + set *($TPIUBASE+0x204) = 0 + else + set *($TPIUBASE+0x204) = (1<<17) | (1 << ($arg0&0xf)) + end + end + set language auto +end +document tracetest +tracetest Switch TRACE output to specified test mode; + 0 - Normal operation + 1 - Walking 1's + 2 - Walking 0's + 3 - 0xAA / 0x55 + 4 - 0xFF / 0x00 +end +# ==================================================================== diff --git a/Tests/test_cobs.c b/Tests/test_cobs.c new file mode 100644 index 00000000..2d439e45 --- /dev/null +++ b/Tests/test_cobs.c @@ -0,0 +1,229 @@ +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== +// Test Cases +// ==================================================================================================== +// ==================================================================================================== +// ==================================================================================================== + +/* Build tests with; + * gcc Src/cobs.c Tests/test_cobs.c -IInc -ggdb + * Execute with; + * ./a.out + */ + +#include +#include + +#include "cobs.h" + +// ==================================================================================================== + +static void _printDigits( int length, uint8_t *d ) +{ + while ( length-- ) + { + fprintf( stderr, "%02x ", *d++ ); + } +} + + +struct test +{ + struct Frame dec; + struct Frame enc; +}; + +/* These tests are from https://en.wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing#Encoding_examples */ +struct test testSet[] = +{ + /* 1 */ { { 1, "\x00" }, { 3, "\x01\x01\x00" } }, + /* 2 */ { { 2, "\x00\x00" }, { 4, "\x01\x01\x01\x00" } }, + /* 3 */ { { 3, "\x00\x11\x00" }, { 5, "\x01\x02\x11\x01\x00" } }, + /* 4 */ { { 4, "\x11\x22\x00\x33"}, { 6, "\x03\x11\x22\x02\x33\x00" } }, + /* 5 */ { { 4, "\x11\x22\x33\x44"}, { 6, "\x05\x11\x22\x33\x44\x00" } }, + /* 6 */ { { 4, "\x11\x00\x00\x00"}, { 6, "\x02\x11\x01\x01\x01\x00" } }, + /* 7 */ { { 254, "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe"}, {256, "\xff\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\x00" }}, + /* 8 */ {{ 255, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe"}, {257, "\x01\xff\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\x00" }}, + /* 9 */ { {255, "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"}, {258, "\xff\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\x02\xff\x00"} }, + /* 10 */ { {255, "\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff\x00"}, {258, "\xff\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff\x01\x01\x00" }}, + /* 11 */ { {255, "\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff\x00\x01"}, {257, "\xfe\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff\x02\x01\x00" }}, +}; + +// ==================================================================================================== + +void _packetRxed ( struct Frame *p, void *param ) + +{ + struct test *t = ( struct test * )param; + int k; + + for ( k = 0; ( ( k < p->len ) && ( p->d[k] == t->dec.d[k] ) ); k++ ) {} + + if ( k != p->len ) + { + fprintf( stderr, "*********FAILED\nWanted:" ); + _printDigits( t->dec.len, t->dec.d ); + fprintf( stderr, "\nRecevd:" ); + _printDigits( p->len, p->d ); + fprintf( stderr, "\n" ); + } + else + { + fprintf( stderr, "OK\n" ); + } +} +// ==================================================================================================== + +/* These need to be global to support the callback */ + +#define TEST_PACKET_LEN (COBS_MAX_PACKET_LEN-5) + +uint8_t ipPacket[TEST_PACKET_LEN]; + +void _packetRxed2( struct Frame *p, void *param ) +{ + if ( p->len != TEST_PACKET_LEN ) + { + fprintf( stderr, "(%s) Received frame length doesn't match %d vs rxed %d\n", param, TEST_PACKET_LEN, p->len ); + } + + for ( int i = 0; i < TEST_PACKET_LEN; i++ ) + { + if ( ipPacket[i] != p->d[i] ) + { + fprintf( stderr, "\n(%s) First inconsistency at displacement %d\n", param, i ); + break; + } + } +} + +///// + +int main( int argc, void **argv ) + +{ + struct COBS *d = COBSInit( NULL ); + struct Frame o; + int i, j, k; + + int oplen; + + if ( d ) + { + fprintf( stderr, "COBS initialised to %llx\n", ( long long int )d ); + } + else + { + fprintf( stderr, "*** ERR: COBS not created\n" ); + } + + fprintf( stderr, "Testing simple decode;\n" ); + + for ( i = 0; i < sizeof( testSet ) / sizeof( struct test ); i++ ) + { + fprintf( stderr, "%d: ", i + 1 ); + + /* The +1 here is because we have a COBS_SYNC_CHAR on the end of each frame */ + if ( testSet[i].enc.len != COBSgetFrameExtent( testSet[i].enc.d, testSet[i].enc.len ) - testSet[i].enc.d + 1 ) + { + fprintf( stderr, "Failed, packet length doesn't match (%d vs wanted %d\n", COBSgetFrameExtent( testSet[i].enc.d, testSet[i].enc.len ) - o.d, testSet[i].enc.len ); + continue; + } + + if ( !COBSSimpleDecode( testSet[i].enc.d, testSet[i].enc.len, &o ) ) + { + fprintf( stderr, "Failed, Packet did not decode\n" ); + continue; + } + + for ( k = 0; ( ( k < o.len ) && ( o.d[k] == testSet[i].dec.d[k] ) ); k++ ) {} + + if ( k != o.len ) + { + fprintf( stderr, "*********FAILED\nWanted:" ); + _printDigits( testSet[i].dec.len, testSet[i].dec.d ); + fprintf( stderr, "\nRecevd:" ); + _printDigits( o.len, o.d ); + fprintf( stderr, "\n" ); + continue; + } + + fprintf( stderr, "OK %d\n", o.len ); + } + + + + fprintf( stderr, "Testing pumped decode;\n" ); + + for ( i = 0; i < sizeof( testSet ) / sizeof( struct test ); i++ ) + { + fprintf( stderr, "%d: ", i + 1 ); + COBSPump( d, testSet[i].enc.d, testSet[i].enc.len, _packetRxed, &testSet[i] ); + } + + fprintf( stderr, "\nTesting encode;\n" ); + + for ( int i = 0; i < sizeof( testSet ) / sizeof( struct test ); i++ ) + { + fprintf( stderr, "%d: ", i + 1 ); + COBSEncode( NULL, 0, testSet[i].dec.d, testSet[i].dec.len, &o ); + + if ( o.len != COBSgetFrameExtent( o.d, o.len ) - o.d + 1 ) + { + fprintf( stderr, "Static framelen assessment failed %d vs expected %d\n", o.len, COBSgetFrameExtent( o.d, o.len ) - o.d + 1 ); + continue; + } + + if ( o.len != testSet[i].enc.len ) + { + fprintf( stderr, "Length mismatch correct=%d vs actual=%d\n", testSet[i].enc.len, o.len ); + + for ( int j = 0; j < o.len; j++ ) + { + if ( o.d[j] != testSet[i].enc.d[j] ) + { + fprintf( stderr, "*********FAILED\nWanted:" ); + _printDigits( testSet[i].enc.len, testSet[i].enc.d ); + fprintf( stderr, "\nRecevd:" ); + _printDigits( o.len, o.d ); + fprintf( stderr, "\n" ); + break; + } + } + + } + else + { + fprintf( stderr, "OK\n" ); + } + } + + fprintf( stderr, "Testing multiple full packets...\n" ); + uint8_t opPacket[TEST_PACKET_LEN]; + struct Frame opFrame; + + for ( int iteration = 0; iteration < 10000; iteration++ ) + { + /* Build a random packet */ + for ( int i = 0; i < TEST_PACKET_LEN; i++ ) + { + ipPacket[i] = random() % 256; + } + + COBSEncode( NULL, 0, ipPacket, TEST_PACKET_LEN, &opFrame ); + + if ( COBSSimpleDecode( opFrame.d, opFrame.len, &d->f ) ) + { + _packetRxed2( &d->f, "COBSSimpleDecode" ); + } + else + { + fprintf( stderr, "Bad packet\n" ); + } + + // COBSPump( d, ipPacket, COBS_MAX_PACKET_LEN, _packetRxed2, "COBSPump" ); + } +} + +// ==================================================================================================== diff --git a/meson.build b/meson.build index dfad6f27..b65f96d9 100644 --- a/meson.build +++ b/meson.build @@ -1,11 +1,21 @@ -project('orbuculum', 'c') +project('orbuculum', 'c', version:'2.1.0', meson_version: '>=0.63') + +uicolours_default = declare_dependency(compile_args: ['-include', 'uicolours_default.h']) + +cc = meson.get_compiler('c') + +sockets = declare_dependency( + dependencies: host_machine.system() == 'windows' ? [cc.find_library('ws2_32')] : [] +) dependencies = [ dependency('threads'), dependency('libusb-1.0'), dependency('libzmq'), - dependency('SDL2'), - dependency('ncurses', 'ncursesw') + dependency('ncurses', 'ncursesw'), + dependency('libelf'), + uicolours_default, + sockets, ] incdirs = include_directories(['Inc', 'Inc/external']) @@ -18,10 +28,16 @@ if host_machine.system() == 'windows' ] elif host_machine.system() == 'darwin' add_project_arguments('-DOSX', language: 'c') +elif host_machine.system() == 'freebsd' + add_project_arguments('-DFREEBSD', language: 'c') + add_project_arguments('-ggdb', language: 'c') + add_project_arguments('-D_GNU_SOURCE', language: 'c') else add_project_arguments('-DLINUX', language: 'c') + add_project_arguments('-ggdb', language: 'c') add_project_arguments('-D_GNU_SOURCE', language: 'c') - install_data('Support/60-orbcode.rules', install_dir : '/etc/udev/rules.d') + + install_data('Support/60-orbcode.rules', install_dir : 'lib/udev/rules.d') install_data('Support/gdbtrace.init', install_dir : 'share/orbcode') endif @@ -29,6 +45,19 @@ add_project_arguments('-DSCREEN_HANDLING', language: 'c') add_project_arguments('-Wno-error=deprecated-declarations', language: 'c') add_project_arguments(['-include', 'uicolours_default.h'], language: 'c') +libdwarf = subproject('libdwarf').get_variable('libdwarf') +dependencies += libdwarf + +libcapstone = dependency('capstone', version: '>=4', required: false) +if not libcapstone.found() + libcapstone = disabler() +endif + +libSDL2 = dependency('SDL2', required: false) +if not libSDL2.found() + libSDL2 = disabler() +endif + if host_machine.system() == 'windows' stream_src = [ 'Src/stream_win32.c', @@ -57,13 +86,19 @@ liborb = library('orb', 'Src/itmDecoder.c', 'Src/tpiuDecoder.c', 'Src/msgDecoder.c', + 'Src/cobs.c', + 'Src/oflow.c', 'Src/msgSeq.c', + 'Src/traceDecoder_etm35.c', + 'Src/traceDecoder_etm4.c', + 'Src/traceDecoder_mtb.c', 'Src/traceDecoder.c', 'Src/generics.c', + 'Src/readsource.c' ] + stream_src, include_directories: incdirs, - dependencies: dependencies, - soversion: 0, + dependencies: sockets, + soversion: meson.project_version(), install: true, ) @@ -146,12 +181,14 @@ executable('orbstat', executable('orbmortem', sources: [ 'Src/orbmortem.c', - 'Src/symbols.c', + 'Src/loadelf.c', 'Src/sio.c', git_version_info_h, ], include_directories: incdirs, - dependencies: dependencies, + dependencies: dependencies + [ + libcapstone, + ], link_with: liborb, install: true, ) @@ -199,7 +236,9 @@ executable('orblcd', git_version_info_h, ], include_directories: incdirs, - dependencies: dependencies, + dependencies: dependencies + [ + libSDL2, + ], link_with: liborb, install: true, ) diff --git a/subprojects/.gitignore b/subprojects/.gitignore new file mode 100644 index 00000000..50455363 --- /dev/null +++ b/subprojects/.gitignore @@ -0,0 +1,2 @@ +libdwarf-* +packagecache \ No newline at end of file diff --git a/subprojects/libdwarf.wrap b/subprojects/libdwarf.wrap new file mode 100644 index 00000000..7bfd9379 --- /dev/null +++ b/subprojects/libdwarf.wrap @@ -0,0 +1,8 @@ +[wrap-file] +directory = libdwarf-0.7.0 + +source_url = https://www.prevanders.net/libdwarf-0.7.0.tar.xz +source_filename = libdwarf-0.7.0.tar.xz +source_hash = 23b71829de875fa5842e49f232c8ee1a5043805749738bc61424d9abc1189f38 + +diff_files = ./libdwarf/0001-fix-Use-project_source_root-for-subproject-compatibi.patch, ./libdwarf/0002-fix-compilation-clang.patch, ./libdwarf/0003-Fixed-calloc-arguments-order.patch diff --git a/subprojects/packagefiles/libdwarf/0001-fix-Use-project_source_root-for-subproject-compatibi.patch b/subprojects/packagefiles/libdwarf/0001-fix-Use-project_source_root-for-subproject-compatibi.patch new file mode 100644 index 00000000..a7f18132 --- /dev/null +++ b/subprojects/packagefiles/libdwarf/0001-fix-Use-project_source_root-for-subproject-compatibi.patch @@ -0,0 +1,34 @@ +From 3a91e8fbd873c35615319615ea57ef36910be258 Mon Sep 17 00:00:00 2001 +From: Maciej Nowak +Date: Sat, 29 Jul 2023 12:46:32 +0200 +Subject: [PATCH] fix: Use project_source_root for subproject compatibility + +--- + meson.build | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/meson.build b/meson.build +index 83ecd99..4d3fb4e 100644 +--- a/meson.build ++++ b/meson.build +@@ -1,7 +1,7 @@ + project('libdwarf', ['c','cpp'], + version: '0.7.0', + default_options : ['buildtype=debugoptimized', 'warning_level=3', 'werror=true'], +- meson_version : '>=0.53' ++ meson_version : '>=0.56' + ) + + v_arr = meson.project_version().split('.') +@@ -191,7 +191,7 @@ pkgconf.set('requirements_libdwarf_libs', '') + pkg_install_dir = '@0@/pkgconfig'.format(get_option('libdir')) + + configure_file( +- input : join_paths(meson.source_root(), 'libdwarf.pc.in'), ++ input : join_paths(meson.project_source_root(), 'libdwarf.pc.in'), + output : 'libdwarf.pc', + configuration : pkgconf, + install_dir : pkg_install_dir +-- +2.39.0.windows.1 + diff --git a/subprojects/packagefiles/libdwarf/0002-fix-compilation-clang.patch b/subprojects/packagefiles/libdwarf/0002-fix-compilation-clang.patch new file mode 100644 index 00000000..44afce2e --- /dev/null +++ b/subprojects/packagefiles/libdwarf/0002-fix-compilation-clang.patch @@ -0,0 +1,15 @@ +diff --git a/meson.build b/meson.build +index 83ecd99..4d3fb4e 100644 +--- a/meson.build ++++ b/meson.build +@@ -84,6 +84,10 @@ libdwarf_args = [ '-D__USE_MINGW_ANSI_STDIO=0' ] + if cc.get_id() == 'msvc' + libdwarf_args += [ '-D_CRT_NONSTDC_NO_WARNINGS', '-D_CRT_SECURE_NO_WARNINGS' ] + endif ++if cc.get_id() == 'clang' ++ add_project_arguments('-Wno-error=unused-but-set-variable', language: 'c') ++ add_project_arguments('-Wno-error=strict-prototypes', language: 'c') ++endif + + config_dir = [include_directories('.')] + diff --git a/subprojects/packagefiles/libdwarf/0003-Fixed-calloc-arguments-order.patch b/subprojects/packagefiles/libdwarf/0003-Fixed-calloc-arguments-order.patch new file mode 100644 index 00000000..209454bf --- /dev/null +++ b/subprojects/packagefiles/libdwarf/0003-Fixed-calloc-arguments-order.patch @@ -0,0 +1,157 @@ +From b92a03a9ebc35b1b26eda285cc34672384fe723c Mon Sep 17 00:00:00 2001 +From: Maciej Nowak +Date: Mon, 3 Jun 2024 20:08:06 +0200 +Subject: [PATCH] Fixed calloc arguments order + +--- + src/bin/dwarfdump/dd_tsearchbal.c | 2 +- + src/bin/dwarfdump/print_debug_names.c | 4 ++-- + src/lib/libdwarf/dwarf_frame.c | 2 +- + src/lib/libdwarf/dwarf_harmless.c | 3 +-- + src/lib/libdwarf/dwarf_machoread.c | 13 +++++++------ + src/lib/libdwarf/dwarf_ranges.c | 2 +- + src/lib/libdwarf/dwarf_tsearchhash.c | 8 ++++---- + 7 files changed, 17 insertions(+), 17 deletions(-) + +diff --git a/src/bin/dwarfdump/dd_tsearchbal.c b/src/bin/dwarfdump/dd_tsearchbal.c +index f8bce3d..23a3e82 100644 +--- a/src/bin/dwarfdump/dd_tsearchbal.c ++++ b/src/bin/dwarfdump/dd_tsearchbal.c +@@ -726,7 +726,7 @@ tdelete_inner(const void *key, + /* Allocate extra, head is on the stack we create + here and the depth might increase. */ + depth = depth + 4; +- pkarray = calloc(sizeof(struct pkrecord),depth); ++ pkarray = calloc(depth,sizeof(struct pkrecord)); + if (!pkarray) { + /* Malloc fails, we could abort... */ + return NULL; +diff --git a/src/bin/dwarfdump/print_debug_names.c b/src/bin/dwarfdump/print_debug_names.c +index a2fba1b..c16d2dc 100644 +--- a/src/bin/dwarfdump/print_debug_names.c ++++ b/src/bin/dwarfdump/print_debug_names.c +@@ -433,8 +433,8 @@ print_dnames_abbrevtable(unsigned int indent,Dwarf_Dnames_Head dn, + res = DW_DLV_OK; + abblist_count = i; + if (abblist_count) { +- abblist = calloc(sizeof(struct Dnames_Abb_Check_s), +- abblist_count); ++ abblist = calloc(abblist_count, ++ sizeof(struct Dnames_Abb_Check_s)); + if (!abblist) { + printf("ERROR: Unable to allocate %" DW_PR_DUu + "entries of a struct to check " +diff --git a/src/lib/libdwarf/dwarf_frame.c b/src/lib/libdwarf/dwarf_frame.c +index 18f9513..56a069a 100644 +--- a/src/lib/libdwarf/dwarf_frame.c ++++ b/src/lib/libdwarf/dwarf_frame.c +@@ -2955,7 +2955,7 @@ init_reg_rules_alloc(Dwarf_Debug dbg,struct Dwarf_Frame_s *f, + { + f->fr_reg_count = count; + f->fr_reg = (struct Dwarf_Reg_Rule_s *) +- calloc(sizeof(struct Dwarf_Reg_Rule_s), count); ++ calloc(count, sizeof(struct Dwarf_Reg_Rule_s)); + if (f->fr_reg == 0) { + if (error) { + _dwarf_error(dbg, error, DW_DLE_DF_ALLOC_FAIL); +diff --git a/src/lib/libdwarf/dwarf_harmless.c b/src/lib/libdwarf/dwarf_harmless.c +index 803e9a8..972ebd9 100644 +--- a/src/lib/libdwarf/dwarf_harmless.c ++++ b/src/lib/libdwarf/dwarf_harmless.c +@@ -195,8 +195,7 @@ _dwarf_harmless_init(struct Dwarf_Harmless_s *dhp,unsigned size) + unsigned i = 0; + memset(dhp,0,sizeof(*dhp)); + dhp->dh_maxcount = size +1; +- dhp->dh_errors = (char **)calloc(sizeof(char *), +- dhp->dh_maxcount); ++ dhp->dh_errors = (char **)calloc(dhp->dh_maxcount, sizeof(char *)); + if (!dhp->dh_errors) { + dhp->dh_maxcount = 0; + return; +diff --git a/src/lib/libdwarf/dwarf_machoread.c b/src/lib/libdwarf/dwarf_machoread.c +index 8fff3f1..1a5924d 100644 +--- a/src/lib/libdwarf/dwarf_machoread.c ++++ b/src/lib/libdwarf/dwarf_machoread.c +@@ -511,8 +511,8 @@ _dwarf_macho_load_segment_commands( + } + mfp->mo_segment_commands = + (struct generic_macho_segment_command *) +- calloc(sizeof(struct generic_macho_segment_command), +- (size_t)mfp->mo_segment_count); ++ calloc((size_t)mfp->mo_segment_count, ++ sizeof(struct generic_macho_segment_command)); + if (!mfp->mo_segment_commands) { + *errcode = DW_DLE_ALLOC_FAIL; + return DW_DLV_ERROR; +@@ -555,8 +555,9 @@ _dwarf_macho_load_dwarf_section_details32( + struct generic_macho_section *secs = 0; + + secs = (struct generic_macho_section *)calloc( +- sizeof(struct generic_macho_section), +- (size_t)secalloc); ++ (size_t)secalloc, ++ sizeof(struct generic_macho_section) ++ ); + if (!secs) { + *errcode = DW_DLE_ALLOC_FAIL; + return DW_DLV_OK; +@@ -643,8 +644,8 @@ _dwarf_macho_load_dwarf_section_details64( + struct generic_macho_section *secs = 0; + + secs = (struct generic_macho_section *)calloc( +- sizeof(struct generic_macho_section), +- (size_t)secalloc); ++ (size_t)secalloc, ++ sizeof(struct generic_macho_section)); + if (!secs) { + *errcode = DW_DLE_ALLOC_FAIL; + return DW_DLV_ERROR; +diff --git a/src/lib/libdwarf/dwarf_ranges.c b/src/lib/libdwarf/dwarf_ranges.c +index 4c65f73..0d8fbd4 100644 +--- a/src/lib/libdwarf/dwarf_ranges.c ++++ b/src/lib/libdwarf/dwarf_ranges.c +@@ -267,7 +267,7 @@ int dwarf_get_ranges_b(Dwarf_Debug dbg, + dwarfstring_destructor(&m); + return DW_DLV_ERROR; + } +- re = calloc(sizeof(struct ranges_entry),1); ++ re = calloc(1,sizeof(struct ranges_entry)); + if (!re) { + free_allocated_ranges(base); + _dwarf_error(dbg, error, DW_DLE_DEBUG_RANGES_OUT_OF_MEM); +diff --git a/src/lib/libdwarf/dwarf_tsearchhash.c b/src/lib/libdwarf/dwarf_tsearchhash.c +index 89476ae..a768f5f 100644 +--- a/src/lib/libdwarf/dwarf_tsearchhash.c ++++ b/src/lib/libdwarf/dwarf_tsearchhash.c +@@ -190,7 +190,7 @@ dwarf_initialize_search_hash( void **treeptr, + /* initialized already. */ + return base ; + } +- base = calloc(sizeof(struct hs_base),1); ++ base = calloc(1,sizeof(struct hs_base)); + if (!base) { + /* Out of memory. */ + return NULL ; +@@ -223,7 +223,7 @@ printf("debugging: initial alloc prime to use %lu\n",prime_to_use); + /* hashtab_ is an array of hs_entry, + indexes 0 through tablesize_ -1. */ + base->hashfunc_ = hashfunc; +- base->hashtab_ = calloc(sizeof(struct ts_entry),base->tablesize_); ++ base->hashtab_ = calloc(base->tablesize_,sizeof(struct ts_entry)); + if (!base->hashtab_) { + free(base); + return NULL; +@@ -368,8 +368,8 @@ resize_table(struct hs_base *head, + return; + } + newhead.tablesize_entry_index_ = new_entry_index; +- newhead.hashtab_ = calloc(sizeof(struct ts_entry), +- newhead.tablesize_); ++ newhead.hashtab_ = calloc(newhead.tablesize_, ++ sizeof(struct ts_entry)); + if (!newhead.hashtab_) { + /* Oops, too large. Leave table size as is, though + things will get slow as it overfills. */ +-- +2.43.0.windows.1 + diff --git a/subprojects/tomlplusplus-3.3.0/.clang-format b/subprojects/tomlplusplus-3.3.0/.clang-format new file mode 100644 index 00000000..e3c1e576 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/.clang-format @@ -0,0 +1,214 @@ +--- +Language: Cpp +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignConsecutiveMacros: Consecutive +AlignConsecutiveAssignments: Consecutive +AlignConsecutiveBitFields: Consecutive +AlignConsecutiveDeclarations: None +AlignEscapedNewlines: Right +AlignOperands: AlignAfterOperator +AlignTrailingComments: true +AllowAllArgumentsOnNextLine: false +AllowAllConstructorInitializersOnNextLine: false +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortEnumsOnASingleLine: false +AllowShortBlocksOnASingleLine: Never +AllowShortCaseLabelsOnASingleLine: true +AllowShortFunctionsOnASingleLine: None +AllowShortLambdasOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Never +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: Yes +AttributeMacros: + - TOML_ABSTRACT_INTERFACE + - TOML_CALLCONV + - TOML_CLOSED_ENUM + - TOML_CLOSED_FLAGS_ENUM + - TOML_EMPTY_BASES + - TOML_EXPORTED_CLASS + - TOML_FLAGS_ENUM + - TOML_OPEN_ENUM + - TOML_OPEN_FLAGS_ENUM + - TOML_TRIVIAL_ABI + - TOML_UNLIKELY_CASE +BinPackArguments: false +BinPackParameters: false +BraceWrapping: + AfterCaseLabel: true + AfterClass: true + AfterControlStatement: Always + AfterEnum: true + AfterFunction: true + AfterNamespace: true + AfterObjCDeclaration: false + AfterStruct: true + AfterUnion: true + AfterExternBlock: true + BeforeCatch: true + BeforeElse: true + BeforeLambdaBody: true + BeforeWhile: true + IndentBraces: false + SplitEmptyFunction: false + SplitEmptyRecord: false + SplitEmptyNamespace: true +BreakBeforeBinaryOperators: NonAssignment +BreakBeforeConceptDeclarations: true +BreakBeforeBraces: Custom +BreakBeforeInheritanceComma: false +BreakInheritanceList: BeforeColon +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: BeforeColon +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true +ColumnLimit: 120 +CommentPragmas: '^([/*!#]|\s*(===|---|clang-format))' +CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: true +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: false +DeriveLineEnding: false +DerivePointerAlignment: false +DisableFormat: false +EmptyLineBeforeAccessModifier: LogicalBlock +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: false +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +StatementAttributeLikeMacros: + - Q_EMIT +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: '^(<|"(gtest|gmock|isl|json)/)' + Priority: 3 + SortPriority: 0 + CaseSensitive: false + - Regex: '.*' + Priority: 1 + SortPriority: 0 + CaseSensitive: false +IncludeIsMainRegex: '(Test)?$' +IncludeIsMainSourceRegex: '' +IndentCaseLabels: true +IndentCaseBlocks: false +IndentGotoLabels: true +IndentPPDirectives: None +IndentExternBlock: Indent +IndentRequires: false +IndentWidth: 4 +IndentWrappedFunctionNames: false +InsertTrailingCommas: None +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: false +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: All +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 2 +ObjCBreakBeforeNestedBlockParam: true +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 1 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 1000000 +PenaltyIndentedWhitespace: 0 +PointerAlignment: Left +ReflowComments: true +SortIncludes: false +SortJavaStaticImport: Before +SortUsingDeclarations: false +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatements +SpaceAroundPointerQualifiers: Default +SpaceBeforeRangeBasedForLoopColon: true +SpaceInEmptyBlock: false +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInConditionalStatement: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +SpaceBeforeSquareBrackets: false +BitFieldColonSpacing: Both +Standard: Latest +StatementMacros: + - __pragma + - _Pragma + - TOML_ALWAYS_INLINE + - TOML_API + - TOML_ATTR + - TOML_CONST_GETTER + - TOML_CONST_INLINE_GETTER + - TOML_EXPORTED_CLASS + - TOML_EXPORTED_MEMBER_FUNCTION + - TOML_EXPORTED_FREE_FUNCTION + - TOML_EXPORTED_STATIC_FUNCTION + - TOML_EXTERN + - TOML_EXTERNAL_LINKAGE + - TOML_INTERNAL_LINKAGE + - TOML_LIKELY_CASE + - TOML_MEMBER_ATTR + - TOML_NEVER_INLINE + - TOML_NODISCARD + - TOML_NODISCARD_CTOR + - TOML_PRAGMA_CLANG + - TOML_PRAGMA_CLANG_GE_9 + - TOML_PRAGMA_CLANG_GE_10 + - TOML_PRAGMA_CLANG_GE_11 + - TOML_PRAGMA_GCC + - TOML_PRAGMA_MSVC + - TOML_PRAGMA_ICC + - TOML_PURE_GETTER + - TOML_PURE_INLINE_GETTER + - TOML_RETURNS_BY_THROWING +TabWidth: 4 +TypenameMacros: +UseCRLF: false +UseTab: Always +WhitespaceSensitiveMacros: + - STRINGIZE + - PP_STRINGIZE + - BOOST_PP_STRINGIZE + - TOML_ATTR + - TOML_CONCAT + - TOML_HAS_INCLUDE + - TOML_LIKELY + - TOML_MAKE_STRING + - TOML_PRAGMA_CLANG + - TOML_PRAGMA_CLANG_GE_9 + - TOML_PRAGMA_CLANG_GE_10 + - TOML_PRAGMA_CLANG_GE_11 + - TOML_PRAGMA_GCC + - TOML_PRAGMA_MSVC + - TOML_PRAGMA_ICC + - TOML_UNLIKELY +... + diff --git a/subprojects/tomlplusplus-3.3.0/.editorconfig b/subprojects/tomlplusplus-3.3.0/.editorconfig new file mode 100644 index 00000000..43b1c146 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/.editorconfig @@ -0,0 +1,25 @@ +root = true + +[*] +insert_final_newline = true +indent_style = tab +indent_size = 4 +tab_width = 4 +end_of_line = lf +trim_trailing_whitespace = true +charset = utf-8 + +[*.{md,markdown}] +trim_trailing_whitespace = false + +[*.{gitattributes,yaml,yml,vcxproj,vcxproj.filters,sln,rc,clang-format,toml}] +indent_style = space + +[{Doxyfile,Doxyfile-mcss}] +indent_style = space + +[*.{hlsl,rc,sln,vcxproj,vcxproj.filters}] +end_of_line = crlf + +[*.{sln,vcxproj,vcxproj.filters}] +charset = utf-8-bom diff --git a/subprojects/tomlplusplus-3.3.0/.gitattributes b/subprojects/tomlplusplus-3.3.0/.gitattributes new file mode 100644 index 00000000..bb99cdaa --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/.gitattributes @@ -0,0 +1,38 @@ +* text eol=lf encoding=UTF-8 +*.hlsl text eol=crlf encoding=UTF-8 +*.rc text eol=crlf encoding=UTF-8 +*.sln text eol=crlf encoding=UTF-8-BOM +*.vcxproj text eol=crlf encoding=UTF-8-BOM +*.vcxproj.filters text eol=crlf encoding=UTF-8-BOM + +*.cs eol=lf diff=csharp + +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain + +*.ai binary +*.bin binary +*.bmp binary +*.dat binary +*.gif binary +*.ico binary +*.jpeg binary +*.jpg binary +*.otf binary +*.png binary +*.psd binary +*.rc binary +*.ttf binary +*.woff binary +*.woff2 binary +*.xlsx binary + +vendor/* linguist-vendored diff --git a/subprojects/tomlplusplus-3.3.0/.github/FUNDING.yml b/subprojects/tomlplusplus-3.3.0/.github/FUNDING.yml new file mode 100644 index 00000000..c1c954eb --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/.github/FUNDING.yml @@ -0,0 +1 @@ +github: marzer diff --git a/subprojects/tomlplusplus-3.3.0/.github/ISSUE_TEMPLATE/bug_report.md b/subprojects/tomlplusplus-3.3.0/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..f04197a8 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,86 @@ +--- +name: Bug report +about: Regular ol' bugs. +title: '' +labels: [ "bug" ] +assignees: marzer + +--- + + + + + +## Environment +**toml++ version and/or commit hash:** + + + +**Compiler:** + + + + +**C++ standard mode:** + + + + +**Target arch:** + + + + +**Library configuration overrides:** + + + + +**Relevant compilation flags:** + + + + +## Describe the bug + + + + +## Steps to reproduce (or a small repro code sample) + + + + +## Additional information + diff --git a/subprojects/tomlplusplus-3.3.0/.github/ISSUE_TEMPLATE/config.yml b/subprojects/tomlplusplus-3.3.0/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..3ba13e0c --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: false diff --git a/subprojects/tomlplusplus-3.3.0/.github/ISSUE_TEMPLATE/feature_request.md b/subprojects/tomlplusplus-3.3.0/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..76688cda --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,38 @@ +--- +name: Feature request +about: Want to see something added or improved? Tell me all about it. +title: '' +labels: feature +assignees: marzer + +--- + + + + + +**Is your feature request related to a problem? Please describe.** + + + + +**Describe the solution you'd like** + + + + + +**Additional context** + diff --git a/subprojects/tomlplusplus-3.3.0/.github/ISSUE_TEMPLATE/spec_bug_report.md b/subprojects/tomlplusplus-3.3.0/.github/ISSUE_TEMPLATE/spec_bug_report.md new file mode 100644 index 00000000..fbb3aeac --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/.github/ISSUE_TEMPLATE/spec_bug_report.md @@ -0,0 +1,55 @@ +--- +name: TOML spec conformance bug +about: Bugs relating to the library's TOML spec conformance (or lack thereof). +title: '' +labels: [ "bug", "TOML spec" ] +assignees: marzer + +--- + + + + +## The non-conforming TOML snippet +```toml + +# your TOML here + +``` + + +## What you expected + + + +## What you got + + + +## Environment +**toml++ version and/or commit hash:** + + +**Any other useful information:** + diff --git a/subprojects/tomlplusplus-3.3.0/.github/pull_request_template.md b/subprojects/tomlplusplus-3.3.0/.github/pull_request_template.md new file mode 100644 index 00000000..1d269acb --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/.github/pull_request_template.md @@ -0,0 +1,42 @@ + + + + +**What does this change do?** + + + + +**Is it related to an exisiting bug report or feature request?** + + + + +**Pre-merge checklist** + +- [ ] I've read [CONTRIBUTING.md] +- [ ] I've rebased my changes against the current HEAD of `origin/master` (if necessary) +- [ ] I've added new test cases to verify my change +- [ ] I've regenerated toml.hpp ([how-to]) +- [ ] I've updated any affected documentation +- [ ] I've rebuilt and run the tests with at least one of: + - [ ] Clang 6 or higher + - [ ] GCC 7 or higher + - [ ] MSVC 19.20 (Visual Studio 2019) or higher +- [ ] I've added my name to the list of contributors in [README.md](https://github.com/marzer/tomlplusplus/blob/master/README.md) + + + +[CONTRIBUTING.md]: https://github.com/marzer/tomlplusplus/blob/master/CONTRIBUTING.md +[how-to]: https://github.com/marzer/tomlplusplus/blob/master/CONTRIBUTING.md#regenerating-tomlhpp +[README.md]: https://github.com/marzer/tomlplusplus/blob/master/README.md \ No newline at end of file diff --git a/subprojects/tomlplusplus-3.3.0/.github/workflows/ci.yaml b/subprojects/tomlplusplus-3.3.0/.github/workflows/ci.yaml new file mode 100644 index 00000000..0469c07c --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/.github/workflows/ci.yaml @@ -0,0 +1,191 @@ +name: ci + +on: + push: + branches-ignore: + - "gh-pages" + paths: + - "**.h" + - "**.hpp" + - "**.cpp" + - "**.inl" + - "**.py" + - "**/meson.build" + - "**/workflows/**.yaml" + pull_request: + branches-ignore: + - "gh-pages" + paths: + - "**.h" + - "**.hpp" + - "**.cpp" + - "**.inl" + - "**.py" + - "**/meson.build" + - "**/workflows/**.yaml" + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + clang_version: "14" + gcc_version: "11" + +jobs: + linux: + strategy: + fail-fast: false + matrix: + compiler: + - "clang" + - "gcc" + linker: + - "lld" + type: + - "debug" + - "release" + + runs-on: ubuntu-latest + + defaults: + run: + shell: bash + + steps: + - name: Install base dependencies + run: | + sudo apt -y update + sudo apt -y install --no-install-recommends git python3 python3-pip ninja-build libstdc++-${{ env.gcc_version }}-dev locales-all + + - uses: actions/checkout@v3 + + - name: Install python dependencies + run: | + sudo -H pip3 install --no-cache-dir --upgrade meson + sudo -H pip3 install --no-cache-dir --upgrade -r tools/requirements.txt + + - name: Check toml.hpp + run: | + cd tools + python3 ci_single_header_check.py + + - name: Install lld + if: ${{ startsWith(matrix.linker, 'lld') }} + run: | + sudo apt -y install --no-install-recommends lld-${{ env.clang_version }} + sudo update-alternatives --install /usr/bin/ld.lld ld.lld /usr/bin/ld.lld-${{ env.clang_version }} 1000 + + - name: Install clang + if: ${{ startsWith(matrix.compiler, 'clang') }} + run: | + sudo apt -y install --no-install-recommends clang-${{ env.clang_version }} + sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++-${{ env.clang_version }} 1000 + sudo update-alternatives --install /usr/bin/cc cc /usr/bin/clang-${{ env.clang_version }} 1000 + + - name: Install gcc + if: ${{ startsWith(matrix.compiler, 'gcc') }} + run: | + sudo apt -y install --no-install-recommends gcc-${{ env.gcc_version }} g++-${{ env.gcc_version }} + sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++-${{ env.gcc_version }} 1000 + sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc-${{ env.gcc_version }} 1000 + + - name: Configure locales + run: | + sudo locale-gen 'en_US.utf8' 'ja_JP.utf8' 'de_DE.utf8' 'it_IT.utf8' 'tr_TR.utf8' 'fi_FI.utf8' 'fr_FR.utf8' 'zh_CN.utf8' + + - name: Configure Meson + run: | + CXX=c++ CXX_LD=${{ matrix.linker }} meson setup build --buildtype=${{ matrix.type }} -Ddevel=true -Db_lto=false + + - name: Build + run: meson compile -C build + + - name: Test + run: meson test -C build --verbose + + windows: + strategy: + fail-fast: false + matrix: + type: + - "debug" + - "release" + + runs-on: windows-2022 + + defaults: + run: + shell: cmd + + steps: + - name: Install dependencies + run: | + python3 -m pip install -U pip + pip3 install meson ninja + + - uses: actions/checkout@v3 + + - uses: ilammy/msvc-dev-cmd@v1 + + - name: Configure Meson + run: meson setup build --vsenv --buildtype=${{ matrix.type }} -Ddevel=true -Db_lto=false + + - name: Build + run: meson compile -C build + + - name: Test + run: meson test -C build --verbose +# tipi-build-linux: +# name: tipi.build project build and dependency resolution +# runs-on: ubuntu-latest +# if: github.ref == 'refs/heads/master' +# container: tipibuild/tipi-ubuntu +# +# env: +# HOME: /root +# +# steps: +# - uses: actions/checkout@v3 +# - run: mkdir -p ~/.tipi +# +# # checking if the tomlplusplus project builds and passes tests +# - name: Build as project target linux-cxx17 (run tests 'odr_test_1' and 'main') +# run: tipi . --dont-upgrade --verbose -t linux-cxx17 --test "odr_test_1|main" +# +# - name: Build as project target linux-cxx20 (run tests 'odr_test_1' and 'main') +# run: tipi . --dont-upgrade --verbose -t linux-cxx20 --test "odr_test_1|main" +# +# - name: Cleanup project builds +# run: rm -r ./build +# +# - name: "Get branch name and save to env" +# env: +# IS_PR: ${{ github.EVENT_NAME == 'pull_request' }} +# run: | +# if ${IS_PR}; then +# BRANCH_NAME="${GITHUB_HEAD_REF}" +# else +# BRANCH_NAME="${GITHUB_REF##*/}" +# fi +# echo "BRANCH_NAME=${BRANCH_NAME}" >> $GITHUB_ENV +# +# # trying if pulling the dependency with tipi works properly +# - name: Build as dependency +# run: | +# cd examples/ +# +# # create test directory and copy the simple_parser.cpp in there +# mkdir test-as-dep +# cp examples.h test-as-dep/. +# cp simple_parser.cpp test-as-dep/. +# cd test-as-dep/ +# +# # create a deps file referencing the commit that triggered this build as dependency +# mkdir .tipi +# echo '{ "requires": { "${{ github.event.repository.full_name }}": { "@": "${{ env.BRANCH_NAME }}" } } }' > .tipi/deps +# +# # build +# tipi . --dont-upgrade --verbose -t linux-cxx17 +# ./build/linux-cxx17/bin/simple_parser ../example.toml diff --git a/subprojects/tomlplusplus-3.3.0/.github/workflows/gh-pages.yaml b/subprojects/tomlplusplus-3.3.0/.github/workflows/gh-pages.yaml new file mode 100644 index 00000000..620aa343 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/.github/workflows/gh-pages.yaml @@ -0,0 +1,43 @@ +name: gh-pages + +on: + push: + branches: + - master + paths: + - '**.h' + - '**.hpp' + - '**.dox' + - '**.md' + - 'docs/**' + workflow_dispatch: + +jobs: + gh-pages: + runs-on: ubuntu-latest + container: + image: debian:testing + + defaults: + run: + shell: bash + + steps: + - uses: actions/checkout@v3 + + - name: Install dependencies + run: | + apt -y update + apt -y install --no-install-recommends git python3 python3-pip doxygen + pip3 install --upgrade poxy + + - name: Generate docs + run: | + cd docs + poxy --verbose + + - name: Deploy + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./docs/html diff --git a/subprojects/tomlplusplus-3.3.0/.gitignore b/subprojects/tomlplusplus-3.3.0/.gitignore new file mode 100644 index 00000000..96219e78 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/.gitignore @@ -0,0 +1,372 @@ +emojis.json +UnicodeData.txt +meson-info/ +meson-logs/ +meson-private/ +*.o +.ninja_* +build.ninja +compile_commands.json +[Bb]uild*/ + +# documentation +*.xml +*.xslt +*.xsd +*.html +*.temp +docs/html +docs/xml + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +.vscode/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc +*.Designer.cs.dll +unsuccessfulbuild +*.lastbuildstate +*.psess +*.vsp +*.vspx +*.tlog + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Windows +Thumbs.db +ehthumbs.db +Desktop.ini +$RECYCLE.BIN/ +*.cab +*.msi +*.msm +*.msp +*.lnk + +# Clangd cache +/.cache/clangd diff --git a/subprojects/tomlplusplus-3.3.0/.gitmodules b/subprojects/tomlplusplus-3.3.0/.gitmodules new file mode 100644 index 00000000..e69de29b diff --git a/subprojects/tomlplusplus-3.3.0/.meson-subproject-wrap-hash.txt b/subprojects/tomlplusplus-3.3.0/.meson-subproject-wrap-hash.txt new file mode 100644 index 00000000..f1a6e4fe --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/.meson-subproject-wrap-hash.txt @@ -0,0 +1 @@ +e53a0d9379f5d224d0a9c7e1c273b53af06ef2fc26d82b8f44b7df3f2d58aebd diff --git a/subprojects/tomlplusplus-3.3.0/.runsettings b/subprojects/tomlplusplus-3.3.0/.runsettings new file mode 100644 index 00000000..aa596528 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/.runsettings @@ -0,0 +1,20 @@ + + + + + 0 + build\TestResults + 60000 + + + + + --verbosity high --list-tests * + 500 + (?i:test) + Solution + tests\ + AdditionalInfo + + + diff --git a/subprojects/tomlplusplus-3.3.0/.tipi/deps b/subprojects/tomlplusplus-3.3.0/.tipi/deps new file mode 100644 index 00000000..3944afa7 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/.tipi/deps @@ -0,0 +1,3 @@ +{ + "requires": {} +} diff --git a/subprojects/tomlplusplus-3.3.0/CHANGELOG.md b/subprojects/tomlplusplus-3.3.0/CHANGELOG.md new file mode 100644 index 00000000..849e47e4 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/CHANGELOG.md @@ -0,0 +1,725 @@ +# Changelog + + + +## v3.3.0 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v3.3.0) 2023-01-29 + +#### Fixes: + +- fixed null pointer dereference in parser when exceptions are disabled (#169) (@ncaklovic) +- fixed spurious warnings in MSVC 19.34 +- fixed `toml::parse_file()` on windows for non-ASCII paths +- fixed a spurious table redefinition error (#187) (@jorisvr) +- fixed UB edge-case in integer parsing (#188) (@jorisvr) +- fixed some build issues with Apple-flavoured Clang (#189) (@eddelbuettel) + +#### Additions: + +- added `toml::format_flags::terse_key_value_pairs` +- added `TOML_ENABLE_FLOAT16` config (#178) (@Scrumplex) + +#### Removals: + +- removed automatic detection of `_Float16` (you must explicitly set `TOML_ENABLE_FLOAT16` to enable it) (#186) (@benthetechguy) + +#### Build system: + +- re-wrote the meson scripts to fix a number of issues (#185, #186) (@Tachi107, @benthetechguy) +- increased the minimum required meson version to `0.61.0` + +

+ +## v3.2.0 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v3.2.0) 2022-08-29 + +#### Fixes: + +- fixed `[dotted.table]` source columns sometimes being off by one (#152) (@vaartis) +- fixed spurious `Wnull-dereference` warning on GCC (#164) (@zaporozhets) +- fixed `print_to_stream` ambiguity for `size_t` (#167) (@acronce) + +#### Additions: + +- added value type deduction to `emplace()` methods +- added `toml::path` utility type (#153, #156, #168) (@jonestristand, @kcsaul) +- added config option `TOML_CALLCONV` +- added missing relational operators for `source_position` + +#### Changes: + +- relaxed cvref requirements of `is_homogeneous()`, `emplace()`, `emplace_back()`, `emplace_hint()` +- relaxed mantissa and digits10 requirements of extended float support + +

+ +## v3.1.0 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v3.1.0) 2022-04-22 + +#### Fixes: + +- fixed potential segfault when calling `at_path()` with an empty string +- fixed UB in internal unicode machinery (#144) (@kchalmer) +- fixed a number of spurious warnings with Clang 10 (#145, #146) (@chronoxor) + +#### Additions: + +- added `toml::array::for_each()` +- added `toml::table::for_each()` +- added config options `TOML_EXPORTED_CLASS`, `TOML_EXPORTED_MEMBER_FUNCTION`, `TOML_EXPORTED_STATIC_FUNCTION` & `TOML_EXPORTED_FREE_FUNCTION` +- added support for escape sequence `\e` when using `TOML_ENABLE_UNRELEASED_FEATURES` ([toml/790](https://github.com/toml-lang/toml/pull/790)) +- added support for more unicode in bare keys when using `TOML_ENABLE_UNRELEASED_FEATURES` ([toml/891](https://github.com/toml-lang/toml/pull/891)) + +#### Removals/Deprecations: + +- deprecated old `TOML_API` option in favour new `TOML_EXPORTED_X` options + (it will continue to work as it did before if none of the new function export options are defined) + +#### Build system: + +- meson: added `compile_library` option (@Tachi107) +- meson: added `ubsan_tests` and `ubsan_examples` options +- meson: use system dependencies where available when building tests (@Tachi107) + +

+ +## v3.0.1 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v3.0.1) 2022-01-13 + +This is a single-bugfix release to fix an ODR issue for people using header-only mode in multiple +translation units. If you aren't seeing linker errors because of `toml::array::insert_at()`, +this release holds nothing of value over v3.0.0. + +#### Fixes: + +- fixed erroneous use of `TOML_API` causing ODR issue (#136) (@Azarael) + +

+ +## v3.0.0 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v3.0.0) 2022-01-11 + +This release will be a major version bump, so it's ABI breaks all around. +Any changes that are likely to cause migration issues (API changes, build system breakage, etc.) are indicated with âš ️. + +#### Fixes: + +- âš ️ fixed `toml::table` init-list constructor requiring double-brackets +- âš ️ fixed `TOML_API` + extern templates causing linker errors in some circumstances +- âš ️ fixed incorrect `noexcept` specifications on many functions +- âš ️ fixed missing `TOML_API` on some interfaces +- fixed `toml::json_formatter` not formatting inf and nan incorrectly +- fixed a number of spec conformance issues (#127, #128, #129, #130, #131, #132, #135) (@moorereason) +- fixed an illegal table redefinition edge case (#112) (@python36) +- fixed documentation issues +- fixed GCC bug causing memory leak during parse failures (#123, #124) (@rsmmr, @ronalabraham) +- fixed incorrect handling of vertical whitespace in keys when printing TOML to streams +- fixed incorrect source position in redefinition error messages +- fixed missing includes ``, `` +- fixed parser not correctly round-tripping the format of binary and octal integers in some cases +- fixed some incorrect unicode scalar sequence transformations (#125) +- fixed strong exception guarantee edge-cases in `toml::table` and `toml::array` + +#### Additions: + +- added value flags to array + table insert methods (#44) (@levicki) +- added support for Unicode 14.0 +- added support for ref categories and cv-qualifiers in `toml::node::ref()` +- added magic `toml::value_flags` constant `toml::preserve_source_value_flags` +- added clang's enum annotation attributes to all enums +- added `TOML_ENABLE_FORMATTERS` option +- added `toml::yaml_formatter` +- added `toml::value` copy+move constructor overloads with flags override +- added `toml::table::prune()` +- added `toml::table::lower_bound()` (same semantics as `std::map::lower_bound()`) +- added `toml::table::emplace_hint()` (same semantics as `std::map::emplace_hint()`) +- added `toml::table::at()` (same semantics as `std::map::at()`) +- added `toml::node_view::operator==` +- added `toml::key` - provides a facility to access the source_regions of parsed keys (#82) (@vaartis) +- added `toml::is_key<>` and `toml::is_key_or_convertible<>` metafunctions +- added `toml::format_flags::relaxed_float_precision` (#89) (@vaartis) +- added `toml::format_flags::quote_infinities_and_nans` +- added `toml::format_flags::indent_sub_tables` (#120) (@W4RH4WK) +- added `toml::format_flags::indent_array_elements` (#120) (@W4RH4WK) +- added `toml::format_flags::allow_unicode_strings` +- added `toml::format_flags::allow_real_tabs_in_strings` +- added `toml::format_flags::allow_octal_integers` +- added `toml::format_flags::allow_hexadecimal_integers` +- added `toml::format_flags::allow_binary_integers` +- added `toml::date_time` converting constructors from `toml::date` and `toml::time` +- added `toml::at_path()`, `toml::node::at_path()` and `toml::node_view::at_path()` for qualified path-based lookups (#118) (@ben-crowhurst) +- added `toml::array::resize()` param `default_init_flags` +- added `toml::array::replace()` (#109) (@LebJe) +- added `toml::array::prune()` +- added `toml::array::at()` (same semantics as `std::vector::at()`) +- added `parse_benchmark` example +- added `operator->` to `toml::value` for class types + +#### Changes: + +- âš ️ `toml::format_flags` is now backed by `uint64_t` (was previously `uint8_t`) +- âš ️ `toml::source_index` is now an alias for `uint32_t` unconditionally (was previously dependent on `TOML_LARGE_FILES`) +- âš ️ `toml::table` now uses `toml::key` as the key type (was previously `std::string`) +- âš ️ `toml::value_flags` is now backed by `uint16_t` (was previously `uint8_t`) +- âš ️ made all overloaded operators 'hidden friends' where possible +- âš ️ renamed `toml::default_formatter` to `toml::toml_formatter` (`toml::default_formatter` is now an alias) +- âš ️ renamed `TOML_PARSER` option to `TOML_ENABLE_PARSER` (`TOML_PARSER` will continue to work but is deprecated) +- âš ️ renamed `TOML_UNRELEASED_FEATURES` to `TOML_ENABLE_UNRELEASED_FEATURES` (`TOML_UNRELEASED_FEATURES` will continue to work but is deprecated) +- âš ️ renamed `TOML_WINDOWS_COMPAT` to `TOML_ENABLE_WINDOWS_COMPAT` (`TOML_WINDOWS_COMPAT` will continue to work but is deprecated) +- applied clang-format to all the things 🎉️ +- exposed `TOML_NAMESPACE_START` and `TOML_NAMESPACE_END` macros to help with ADL specialization scenarios +- improved performance of parser +- made date/time constructors accept any integral types +- moved all implementation headers to `/impl` +- renamed all implementation headers to `.h` and 'source' headers to `.inl` +- updated conformance tests + +#### Removals: + +- âš ️ removed `toml::format_flags::allow_value_format_flags` +- âš ️ removed `TOML_LARGE_FILES` (it is now default - explicitly setting `TOML_LARGE_FILES` to `0` will invoke an `#error`) +- âš ️ removed unnecessary template machinery (esp. where ostreams were involved) +- removed unnecessary uses of `final` + +#### Build system: + +- âš ️ increased minimum required meson version to `0.54.0` +- disabled 'install' path when being used as a meson subproject (#114) (@Tachi107) +- fixed builds failing with meson 0.6.0 (#117) (@Tachi107) +- general meson improvements and fixes (#115) (@Tachi107) +- used `override_dependency` where supported (#116) (@Tachi107) + +

+ +## v2.5.0 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v2.5.0) 2021-07-11 + +#### Fixes: + +- fixed linkage error with windows compat mode +- fixed `TOML_CONSTEVAL` broken in MSVC (again) +- fixed minor documentation bugs +- fixed cmake project version being incorrect (#110) (@GiulioRomualdi) + +#### Additions: + +- added support for lowercase 't' and 'z' in datetimes (per spec) +- added natvis file to cmake install (#106) (@Ryan-rsm-McKenzie) +- added VS cpp.hint file to cmake install +- added metafunctions `is_container`, `is_chronological`, `is_value`, `is_node`, `inserted_type_of` + +#### Changes: + +- improved debug code size by removing unnecessary std::forwards and std::moves +- modernized the CMake build files (#102, #103, #105) (@friendlyanon) +- updated conformance tests + +

+ +## v2.4.0 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v2.4.0) 2021-05-19 + +#### Fixes: + +- fixed `node::value()` not retrieving inf and nan correctly +- fixed dotted kvps being unable to add subtables (#61) (@Validark) +- fixed linker error on linux ICC (#83) (@blackwer) +- fixed segfault JSON-formatting a failed `parse_result` (#96) (@proydakov) +- fixed spurious newline after JSON formatting a table +- fixed VS intellisense not detecting `TOML_COMPILER_EXCEPTIONS` correctly +- fixed crash with pathologically-nested inputs (#100) (@geeknik) +- fixed `parse_result` natvis +- fixed false-positive `char8_t` support detection on older compilers +- fixed unnecessary `#include ` Windows builds (@BeastLe9enD) +- fixed `TOML_CONSTEVAL` breaking on VS 16.10.0pre2 +- fixed spurious warnings with MSVC /Wall +- fixed missing blank lines between consecutive empty tables/A-o-T +- fixed unnecessary `TOML_API` declarations +- fixed many small documentation issues + +#### Additions: + +- added proper cmake support (#85) (@ClausKlein) +- added cmake FetchContent information to documentation (#101) (@proydakov) + +#### Removals: + +- removed explicit `#include ` requirement for `parse_file()` + +

+ +## v2.3.0 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v2.3.0) 2020-12-29 + +#### Fixes: + +- fixed compiler errors caused by `` with Apple-flavoured clang +- fixed array and table iterators missing `iterator_category` (#77) (@HazardyKnusperkeks) +- fixed `Wuseless-cast` warnings on GCC 10 (#75) (@HazardyKnusperkeks) +- fixed formatter not correctly line wrapping in some rare circumstances (#73) (@89z) +- fixed an unnecessary global compiler flag breaking builds when used as a meson subproject (#72) (@jamabr) +- fixed link error caused by `` on emscripten (#71) (@suy) +- fixed ambiguity with the `toml::literals` inline namespace (#69) (@std-any-emplace) +- fixed formatter emitting superfluous newlines after printing tables (#68) (@std-any-emplace) +- fixed array and table iterators not converting between const and non-const versions of themselves (#67) (@std-any-emplace) +- fixed some parser crashes when given pathologically-malformed UTF-8 (#65) (@sneves) + +

+ +## v2.2.0 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v2.2.0) 2020-08-09 + +#### Fixes: + +- fixed some issues building with VS2017 (#55) (@sobczyk) +- fixed `_Float16` erroneously detected as supported on g++ (#57) (@sobczyk) +- fixed `` causing compilation failure on mingw (#63) (@rezahousseini) +- fixed CMake and pkg-config files not being installed into architecture-agnostic directories (#59) (@tambry) +- fixed memory leak during parsing (#64) (@sneves) +- fixed ambiguous `operator==` error on MSVC (#56) (@HellsingDarge) + +#### Additions: + +- added additional node_view constructors +- added ability to specify serialization format of integer values +- added integer value serialization format round trip (e.g. hex in, hex out) + +#### Changes: + +- updated conformance tests +- TOML version bump to v1.0.0-rc.3 +- refactors and cleanups based on feedback given [here](https://medium.com/@julienjorge/code-review-of-toml-f816a6071120) + +#### Build system: + +- renamed build options to `snake_case` +- tests, examples and cmake config now explicitly disabled when used as a subproject +- removed small_binaries (it's now implicit when building as release) +- bumped minimum meson version to 0.53 + +

+ +## v2.1.0 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v2.1.0) 2020-07-11 + +#### Fixes: + +- fixed inconsistent emission of leading/trailing newlines when writing a table to an ostream (#48) (@levicki) +- fixed `Wcast-align` warning spam on ARM +- fixed `array::insert` not working correctly in some cases +- fixed `node::value_or()` not having the same semantics as `node::value()` (#50) (@whiterabbit963) +- fixed 'misleading assignment' of rvalue node_views (#52) (@Reedbeta) +- fixed some issues handling infinities and NaNs (#51) (@Reedbeta) +- fixed some minor documentation issues + +#### Additions: + +- added support for `__fp16`, `_Float16`, `__float128`, `__int128_t` and `__uint128_t` +- added copy construction/assignment for arrays, tables and values +- added insert, emplace, push_back etc. compatibility with node_views +- added `node::is_homogenous` +- added `table::is_homogenous` +- added `value::is_homogenous` (just for generic code's sake) +- added `is_homogenous` overload for identifying failure-causing element +- added implicit conversion operator from `node` to `node_view` (#52) (@Reedbeta) + +#### Changes: + +- renamed `TOML_ALL_INLINE` to `TOML_HEADER_ONLY` (the old name will still work, but is no longer documented) +- general cleanup + +

+ +## v2.0.0 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v2.0.0) 2020-07-20 + +This release contains a fairly significant number of 'quality of life' improvements, yay! But also necessitates an ABI +break (hence the version number bump). Changes that might block a migration are annotated with âš ️. + +#### Fixes: + +- fixed infinity and NaN-related code breaking when using `-ffast-math` and friends +- fixed narrowing conversion warnings when constructing int values from unsigned +- fixed Visual Studio debugger native visualizations for `date`, `time`, `time_offset`, `date_time` +- fixed some static assert messages being badly formatted on clang +- fixed internal macro `assert_or_assume` leaking out of `toml_parser.hpp` + +#### Additions: + +- added additional types allowed in `node::value()` and `node::value_or()` ([see `value()` dox for examples](https://marzer.github.io/tomlplusplus/classtoml_1_1node.html#ab144c1ae90338b6b03f6af0574c87993)) +- added additional types allowed in `node_view::value()` and `node_view::value_or()` +- added `node::value_exact()` and `node_view::value_exact()` +- added support for interop with wide strings on Windows: + - added wide-string path arg overloads of `parse()` and `parse_file()` + - added wide-string support to all relevant `table` and `array` ops + - added wide-string support to `node::value(), node::value_or()` + - added wide-string support to `node_view::value(), node_view::value_or()` + - added wide-string support to `value` constructor + - added wide-string overloads of `node_view::operator[]` + - added `source_region::wide_path()` + - added `TOML_WINDOWS_COMPAT` switch for explicitly enabling/disabling this stuff +- added emission of 'literal' strings to the TOML serializer +- added lots of minor documentation fixes and improvements +- added Visual Studio debugger native visualizations for `table`, `array`, `parse_result`, and `parse_error` (#46) (@Reedbeta) +- added non-template version of `array::is_homogeneous()` +- added explicit instantiations of more template types when `!TOML_ALL_INLINE` + +#### Changes: + +- âš ️ deprecated `parse_result::get()` in favour of `parse_result::table()` +- âš ️ deprecated `node_view::get()` in favour of `node_view::node()` +- âš ️ simplified internal ABI namespaces +- improved the quality of many static_assert error messages + +#### Removals: + +- âš ️ renamed `date_time::time_offset` to just 'offset' +- âš ️ removed `TOML_CHAR_8_STRINGS` since it no longer makes sense + +

+ +## v1.3.3 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v1.3.3) 2020-06-29 + +#### Fixes: + +- fixed some minor TOML spec conformance bugs +- fixed BOM check causing EOF on very short iostream inputs +- fixed `std::numeric_limits::max()` getting broken by macros in some environments +- fixed 'unknown pragma' warning spam in older versions of GCC +- fixed a few minor documentation issues + +#### Additions: + +- added rvalue overload of `array::flatten` +- added conformance tests from `BurntSushi/toml-test` and `iarna/toml-spec-tests` +- added `toml::inserter` as a workaround for nested construction of single-element `toml::arrays` performing move-construction instead +- added license boilerplate to test files + +#### Changes: + +- refactored the parser to reduce binary size + +

+ +## v1.3.2 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v1.3.2) 2020-06-19 + +#### Fixes: + +- fixed single-digit negative integers parsing as positive +- fixed parse failure when parsing an empty file +- fixed multi-line strings being allowed in keys +- fixed overflow for very long binary integer literals + +#### Changes: + +- improved the performance of toml::parse_file +- improved the performance of printing to streams for deepy-nested TOML data + +

+ +## v1.3.0 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v1.3.0) 2020-06-02 + +#### Fixes: + +- fixed `formatter::print_inline()` causing compilation failures in DLL builds +- fixed BOMs occasionally causing overflow/crash in char8 mode +- fixed some spurious warnings in GCC 10 +- fixed clang static analyzer warning in BOM handling code + +#### Additions: + +- added `table_iterator::operator ->` +- added `array::resize()` and `array::truncate()` +- added `array::capacity()`, `array::shrink_to_fit()`, `array::max_size()` +- added non-const -> const conversion for table and array iterators + +#### Changes: + +- renamed table iterator proxy pair members to `first` and `second` to match STL + +

+ +## v1.2.5 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v1.2.5) 2020-04-24 + +#### Fixes: + +- fixed some multi-line string parsing issues +- fixed pedantic warnings on gcc 10 and clang 11 +- fixed `is_unicode_XXXXXX` functions being wrong in some cases +- fixed `TOML_LIKELY` not being correct on older versions of gcc and clang +- fixed minor documentation issues (#26, #38) (@prince-chrismc) + +#### Additions: + +- added additional error message cases to the parser +- added `error_printer` example +- added `toml_generator` example + +#### Changes: + +- improved unicode-related codegen + +

+ +## v1.2.3 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v1.2.3) 2020-04-11 + +#### Fixes: + +- fixed printing of inf and nan +- fixed parser not handling floats with leading '.' characters +- fixed pedantic vtable warnings on clang with -Weverything +- fixed a number of documentation bugs +- fixed `TOML_UNRELEASED_FEATURES` default being 1 (it should have been 0) + +#### Additions: + +- added `TOML_PARSER` configuration option +- added `TOML_LIB_SINGLE_HEADER` indicator +- added doxygen page for the configuration options +- added SPDX-License-Identifiers around the place + +#### Changes: + +- split some header files up to make future maintenance easier +- refactored and greatly simplified parser + +

+ +## v1.2.0 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v1.2.0) 2020-04-07 + +#### Fixes: + +- fixed some parsing and printing ops being locale-dependent +- fixed some parsing errors at EOF when `TOML_EXCEPTIONS = 0` +- fixed some unreferenced variable warnings on older compilers +- fixed some 'maybe-uninitialized' false-positives on GCC9 +- fixed pkgconfig subdir being wrong + +#### Additions: + +- added support for implementations without `` +- added cmake package config generator (#22) (@GiulioRomualdi) +- added build config feature option `GENERATE_CMAKE_CONFIG` +- added many new tests + +

+ +## v1.1.0 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v1.1.0) 2020-04-03 + +#### Fixes: + +- fixed some parser error paths not returning early enough `TOML_EXCEPTIONS=0` +- fixed a number of minor documentation issues + +#### Additions: + +- added support for [TOML 1.0.0-rc.1](https://github.com/toml-lang/toml/releases/tag/v1.0.0-rc.1) 🎉 +- added `operator[]`, `begin()`, `end()` to `toml::parse_result` for `TOML_EXCEPTIONS=0` +- added additional compilation speed improvements for `TOML_ALL_INLINE=0` +- added more specific error messages for parsing errors relating to prohibited codepoints +- added a large number of additional tests +- added support for installation with meson (#16) (@ximion) +- added the array and table iterators to the `toml` namespace + +

+ +## v1.0.0 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/1.0.0) 2020-03-28 + +#### Fixes: + +- fixed minor documentation issues + +#### Changes: + +- refactoring of ABI-based inline namespaces + +

+ +## v0.6.0 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v0.6.0) 2020-03-24 + +#### Fixes: + +- fixed minor preprocessor/macro issues +- fixed minor documentation issues + +#### Additions: + +- added `` include directly in 'debug' builds when `TOML_ASSERT` isn't defined +- added Clang's `[[trivial_abi]]` attribute to `date`, `time`, `time_offset` + +

+ +## v0.5.0 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v0.5.0) 2020-03-18 + +#### Fixes: + +- fixed crash when reaching EOF while parsing a string when exceptions are disabled +- fixed some attribute warnings in GCC +- fixed build with GCC 8.2.0 (#15) (@shdnx) +- fixed exception mode detection sometimes being incorrect on MSVC +- fixed compilation on older implementations without `std::launder` +- fixed `json_formatter` type deduction on older compilers + +#### Additions: + +- added support for Unicode 13.0 +- added support for `\xHH` escape sequences ([toml/pull/796](https://github.com/toml-lang/toml/pull/796)) +- added short-form license preamble to all source files +- added build configuration option for compiling examples + +

+ +## v0.4.3 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v0.4.3) 2020-03-10 + +#### Fixes: + +- fixed ICE in VS2019 when using `/std:c++17` instead of `/std:c++latest` + +#### Additions: + +- added `#error` when `TOML_EXCEPTIONS` is set to `1` but compiler exceptions were disabled + +#### Changes: + +- parsing performance improvements + +

+ +## v0.4.0 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v0.4.0) 2020-03-05 + +#### Fixes: + +- fixed `parse_file()` failing to compile with plain string literals +- fixed tests being built when used as a meson subproject (#14) (@shdnx) + +#### Additions: + +- added support for compiling into DLLs on windows (`TOML_API`) +- added support for explicitly setting the `TOML_EXCEPTION` mode +- added `TOML_OPTIONAL_TYPE` customization point +- added `node::ref()` and `node_view::ref()` + +

+ +## v0.3.0 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v0.3.0) 2020-03-01 + +#### Fixes: + +- fixed some pedantic clang warnings +- fixed some minor documentation errors + +#### Additions: + +- added `node::value()` and `node::value_or()` +- added `node_view::value()` +- added relops for the date/time classes +- added `TOML_ALL_INLINE` and `TOML_IMPLEMENTATION` options +- added preliminary support for ICC + +#### Removals: + +- removed `` dependency + +

+ +## v0.2.1 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v0.2.1) 2020-02-26 + +#### Fixes: + +- fixed minor printing bug in `operator<<(ostream, source_position)` +- fixed minor documentation issues + +#### Additions: + +- added `operator<<(ostream&, parse_error)` + +#### Changes: + +- improved quality of error messages for boolean and inf/nan parsing + +

+ +## v0.2.0 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v0.2.0) 2020-02-23 + +#### Fixes: + +- fixed truncation of floating-point values when using ostreams +- fixed missing value deduction guides for dates and times +- fixed potential ODR issues relating to exception mode handling etc. +- fixed some documentation issues + +#### Additions: + +- added serialization round-trip tests +- added `node::is_number()` +- added `node_view::is_number()` +- added `node_view::value_or()` +- added hexfloat parsing support for all implementations (not just `` ones) + +

+ +## v0.1.0 + +[Released](https://github.com/marzer/tomlplusplus/releases/tag/v0.1.0) 2020-02-20 + +- First public release, yay! 🎉️ diff --git a/subprojects/tomlplusplus-3.3.0/CMakeLists.txt b/subprojects/tomlplusplus-3.3.0/CMakeLists.txt new file mode 100644 index 00000000..1179d375 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.14) + +project( + tomlplusplus + VERSION 3.3.0 + DESCRIPTION "Header-only TOML config file parser and serializer for C++17" + HOMEPAGE_URL "https://marzer.github.io/tomlplusplus/" + LANGUAGES CXX +) + +include(cmake/project-is-top-level.cmake) +include(cmake/variables.cmake) + +# ---- Declare library ---- + +add_library(tomlplusplus_tomlplusplus INTERFACE) +add_library(tomlplusplus::tomlplusplus ALIAS tomlplusplus_tomlplusplus) + +set_property( + TARGET tomlplusplus_tomlplusplus PROPERTY + EXPORT_NAME tomlplusplus +) + +target_include_directories( + tomlplusplus_tomlplusplus + ${tomlplusplus_warning_guard} # unquoted for list expansion + INTERFACE + "$" +) + +target_compile_features(tomlplusplus_tomlplusplus INTERFACE cxx_std_17) + +# ---- Install rules and examples ---- +if(PROJECT_IS_TOP_LEVEL) + include(cmake/install-rules.cmake) + option(BUILD_EXAMPLES "Build examples tree." OFF) + if(BUILD_EXAMPLES) + add_subdirectory(examples) + endif() +endif() diff --git a/subprojects/tomlplusplus-3.3.0/CODE_OF_CONDUCT.md b/subprojects/tomlplusplus-3.3.0/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..8f30d260 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at mark.gillard@outlook.com.au. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/subprojects/tomlplusplus-3.3.0/CONTRIBUTING.md b/subprojects/tomlplusplus-3.3.0/CONTRIBUTING.md new file mode 100644 index 00000000..f1170164 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/CONTRIBUTING.md @@ -0,0 +1,81 @@ +# Contributing to toml++ + +Contributions are very welcome! Either by [reporting issues] or submitting pull requests. +If you wish to submit a PR, please be aware that: + +- The single-header file `toml.hpp` is generated by a script; make your changes in the files in + `include`, **not** in `toml.hpp`. +- Your changes should compile warning-free on at least one of: + - GCC 8 or higher + - Clang 8 or higher + - MSVC 19.2X (Visual Studio 2019) or higher +- You should regenerate the single-header file as part of your PR (a CI check will fail if you don't). + +
+ +## Regenerating toml.hpp + +1. Make your changes as necessary + - If you've added a new header file that isn't going to be transitively included by one of the + others, add an include directive to `include/toml++/toml.h` +2. Install the prerequisite python packages: `pip3 install -r tools/requirements.txt` +3. Run `tools/generate_single_header.py` + +
+ +## Building and running the tests + +Testing is done using [Catch2]. + +### Testing on Windows with Visual Studio + +Install [Visual Studio] and [Test Adapter for Catch2], then open `toml++.sln` and build the +projects in the `tests` solution folder. Visual Studio's Test Explorer should pick these up and +allow you to run the tests directly. + +If test discovery fails you can usually fix it by enabling +`Auto Detect runsettings Files` (settings gear icon > `Configure Run Settings`). + +### Testing on Linux (and WSL) + +```bash +# install ninja, meson, locales (first time only) +sudo apt update && sudo apt install -y locales python3 python3-pip ninja-build +sudo pip3 install meson +sudo locale-gen 'en_US.utf8' \ + 'ja_JP.utf8' \ + 'de_DE.utf8' \ + 'it_IT.utf8' \ + 'tr_TR.utf8' \ + 'fi_FI.utf8' \ + 'fr_FR.utf8' \ + 'zh_CN.utf8' + +# create the build configs (first time only) +meson setup build-debug --buildtype=debug -Ddevel=true +meson setup build-release --buildtype=release -Ddevel=true + +# run the tests +cd build-debug && ninja && ninja test \ + && cd ../build-release && ninja && ninja test \ + && cd .. +``` + +> ℹ️ Pass `-Duse_vendored_libs=false` to Meson if you wish to use the system-installed version +> of Catch2 rather than the vendored one. + +
+ +## Testing with the [toml-test] suite + +As an optional extra you may wish to test against the 'official' test TOML test suite, [BurntSushi/toml-test]. See the +instructions at [toml-test/README](./toml-test/README.md). Note that the toml++ tests already consume tests from the +offical suite via a C++ code-generation script so you are not expected to take this extra step as part of contributing +to the library. + +[visual studio]: https://visualstudio.microsoft.com/vs/ +[test adapter for catch2]: https://marketplace.visualstudio.com/items?itemName=JohnnyHendriks.ext01 +[reporting issues]: https://github.com/marzer/tomlplusplus/issues +[catch2]: https://github.com/catchorg/Catch2 +[toml-test]: https://github.com/BurntSushi/toml-test +[burntsushi/toml-test]: https://github.com/BurntSushi/toml-test diff --git a/subprojects/tomlplusplus-3.3.0/LICENSE b/subprojects/tomlplusplus-3.3.0/LICENSE new file mode 100644 index 00000000..261cd615 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/LICENSE @@ -0,0 +1,16 @@ +MIT License + +Copyright (c) Mark Gillard + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/subprojects/tomlplusplus-3.3.0/README.md b/subprojects/tomlplusplus-3.3.0/README.md new file mode 100644 index 00000000..117af5fb --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/README.md @@ -0,0 +1,353 @@ +[![banner](docs/images/banner.png)][homepage] +[![Releases](https://img.shields.io/github/v/release/marzer/tomlplusplus?style=flat-square)](https://github.com/marzer/tomlplusplus/releases) +[![C++17](docs/images/badge-C++17.svg)][cpp_compilers] +[![TOML](docs/images/badge-TOML.svg)][v1.0.0] +[![MIT license](docs/images/badge-license-MIT.svg)](./LICENSE) +[![ci](https://github.com/marzer/tomlplusplus/actions/workflows/ci.yaml/badge.svg?branch=master)](https://github.com/marzer/tomlplusplus/actions/workflows/ci.yaml) +[![Mentioned in Awesome C++](docs/images/badge-awesome.svg)](https://github.com/fffaraz/awesome-cpp) +[![Sponsor](docs/images/badge-sponsor.svg)](https://github.com/sponsors/marzer) +[![Gitter](docs/images/badge-gitter.svg)](https://gitter.im/marzer/tomlplusplus) +==== + +## toml++ homepage + +

+ ✨️ This README is fine, but the toml++ homepage is better. ✨️ +

+ +
+ +## Library features + +- Header-only (optional!) +- Supports the latest [TOML] release ([v1.0.0]), plus optional support for some unreleased TOML features +- Passes all tests in the [toml-test](https://github.com/BurntSushi/toml-test) suite +- Supports serializing to JSON and YAML +- Proper UTF-8 handling (incl. BOM) +- C++17 (plus some C++20 features where available, e.g. experimental support for [char8_t] strings) +- Doesn't require RTTI +- Works with or without exceptions +- Tested on Clang (6+), GCC (7+) and MSVC (VS2019) +- Tested on x64, x86 and ARM + +
+ +## Basic usage + +> ℹ️ _The following example favours brevity. If you'd prefer full API documentation and lots of specific code snippets +instead, visit the project [homepage]_ + +Given a [TOML] file `configuration.toml` containing the following: + +```toml +[library] +name = "toml++" +authors = ["Mark Gillard "] + +[dependencies] +cpp = 17 +``` + +Reading it in C++ is easy with toml++: + +```cpp +#include + +auto config = toml::parse_file( "configuration.toml" ); + +// get key-value pairs +std::string_view library_name = config["library"]["name"].value_or(""sv); +std::string_view library_author = config["library"]["authors"][0].value_or(""sv); +int64_t depends_on_cpp_version = config["dependencies"]["cpp"].value_or(0); + +// modify the data +config.insert_or_assign("alternatives", toml::array{ + "cpptoml", + "toml11", + "Boost.TOML" +}); + +// use a visitor to iterate over heterogenous data +config.for_each([](auto& key, auto& value) +{ + std::cout << value << "\n"; + if constexpr (toml::is_string) + do_something_with_string_values(value); +}); + +// you can also iterate more 'traditionally' using a ranged-for +for (auto&& [k, v] : config) +{ + // ... +} + +// re-serialize as TOML +std::cout << config << "\n"; + +// re-serialize as JSON +std::cout << toml::json_formatter{ config } << "\n"; + +// re-serialize as YAML +std::cout << toml::yaml_formatter{ config } << "\n"; + +``` + +You'll find some more code examples in the `examples` directory, and plenty more as part of the [API documentation]. + +
+ +## Adding toml++ to your project + +`toml++` comes in two flavours: Single-header and Regular. The API is the same for both. + +### ðŸ¦️ Single-header flavour + +1. Drop [`toml.hpp`] wherever you like in your source tree +2. There is no step two + +### ðŸ¨️ Regular flavour + +1. Clone the repository +2. Add `tomlplusplus/include` to your include paths +3. `#include ` + +### Conan + +Add `tomlplusplus/3.3.0` to your conanfile. + +### DDS + +Add `tomlpp` to your `package.json5`, e.g.: + +```plaintext +depends: [ + 'tomlpp^3.3.0', +] +``` + +> ℹ️ _[What is DDS?](https://dds.pizza/)_ + +### Tipi.build + +`tomlplusplus` can be easily used in [tipi.build](https://tipi.build) projects by adding the following entry to your `.tipi/deps`: + +```json +{ + "marzer/tomlplusplus": { } +} +``` + +### Vcpkg + +```plaintext +vcpkg install tomlplusplus +``` + +### Meson + +You can install the wrap with: + +```plaintext +meson wrap install tomlplusplus +``` + +After that, you can use it like a regular dependency: + +```meson +tomlplusplus_dep = dependency('tomlplusplus') +``` + +You can also add it as a subproject directly. + +### CMake FetchContent + +```cmake +include(FetchContent) +FetchContent_Declare( + tomlplusplus + GIT_REPOSITORY https://github.com/marzer/tomlplusplus.git + GIT_TAG v3.3.0 +) +FetchContent_MakeAvailable(tomlplusplus) +``` + +> ℹ️ _[What is FetchContent?](https://cmake.org/cmake/help/latest/module/FetchContent.html)_ + +### Git submodules + +```plaintext +git submodule add --depth 1 https://github.com/marzer/tomlplusplus.git tomlplusplus +git config -f .gitmodules submodule.tomlplusplus.shallow true +``` + +> âš ️ The toml++ repository has some submodules of its own, but **they are only used for testing**! +> You should **not** use the `--recursive` option for regular library consumption. + +### Other environments and package managers + +The C++ tooling ecosystem is a fractal nightmare of unbridled chaos so naturally I'm not up-to-speed with all of the +available packaging and integration options. I'm always happy to see new ones supported, though! If there's some +integration you'd like to see and have the technical know-how to make it happen, feel free to +[make a pull request](./CONTRIBUTING.md). + +### What about dependencies? + +If you just want to consume `toml++` as a regular library then you don't have any dependencies to worry about. +There's a few test-related dependencies to be aware of if you're working on the library, though. +See [CONTRIBUTING] for information. + +
+ +## Configuration + +A number of configurable options are exposed in the form of preprocessor `#defines` Most likely you +won't need to mess with these at all, but if you do, set them before including toml++. + +| Option | Type | Description | Default | +|-----------------------------------|:--------------:|----------------------------------------------------------------------------------------------------------|------------------------| +| `TOML_ASSERT(expr)` | function macro | Sets the assert function used by the library. | `assert()` | +| `TOML_CALLCONV` | define | Calling convention to apply to exported free/static functions. | undefined | +| `TOML_CONFIG_HEADER` | string literal | Includes the given header file before the rest of the library. | undefined | +| `TOML_ENABLE_FORMATTERS` | boolean | Enables the formatters. Set to `0` if you don't need them to improve compile times and binary size. | `1` | +| `TOML_ENABLE_FLOAT16` | boolean | Enables support for the built-in `_Float16` type. | per compiler settings | +| `TOML_ENABLE_PARSER` | boolean | Enables the parser. Set to `0` if you don't need it to improve compile times and binary size. | `1` | +| `TOML_ENABLE_UNRELEASED_FEATURES` | boolean | Enables support for [unreleased TOML language features]. | `0` | +| `TOML_ENABLE_WINDOWS_COMPAT` | boolean | Enables support for transparent conversion between wide and narrow strings. | `1` on Windows | +| `TOML_EXCEPTIONS` | boolean | Sets whether the library uses exceptions. | per compiler settings | +| `TOML_EXPORTED_CLASS` | define | API export annotation to add to classes. | undefined | +| `TOML_EXPORTED_MEMBER_FUNCTION` | define | API export annotation to add to non-static class member functions. | undefined | +| `TOML_EXPORTED_FREE_FUNCTION` | define | API export annotation to add to free functions. | undefined | +| `TOML_EXPORTED_STATIC_FUNCTION` | define | API export annotation to add to static functions. | undefined | +| `TOML_HEADER_ONLY` | boolean | Disable this to explicitly control where toml++'s implementation is compiled (e.g. as part of a library).| `1` | +| `TOML_IMPLEMENTATION` | define | Define this to enable compilation of the library's implementation when `TOML_HEADER_ONLY` == `0`. | undefined | +| `TOML_OPTIONAL_TYPE` | type name | Overrides the `optional` type used by the library if you need [something better than std::optional]. | undefined | +| `TOML_SMALL_FLOAT_TYPE` | type name | If your codebase has a custom 'small float' type (e.g. half-precision), this tells toml++ about it. | undefined | +| `TOML_SMALL_INT_TYPE` | type name | If your codebase has a custom 'small integer' type (e.g. 24-bits), this tells toml++ about it. | undefined | + +> ℹ️ _A number of these have ABI implications; the library uses inline namespaces to prevent you from accidentally +linking incompatible combinations together._ + +
+ +## TOML Language Support + +At any given time the library aims to support whatever the [most recently-released version] of TOML is, with opt-in +support for a number of unreleased features from the [TOML master] and some sane cherry-picks from the +[TOML issues list] where the discussion strongly indicates inclusion in a near-future release. + +The library advertises the most recent numbered language version it fully supports via the preprocessor +defines `TOML_LANG_MAJOR`, `TOML_LANG_MINOR` and `TOML_LANG_PATCH`. + +### **Unreleased language features:** + +- [#516]: Allow newlines and trailing commas in inline tables +- [#562]: Allow hex floating-point values +- [#644]: Support `+` in key names +- [#671]: Local time of day format should support `09:30` as opposed to `09:30:00` +- [#687]: Relax bare key restrictions to allow additional unicode characters +- [#790]: Include an `\e` escape code sequence (shorthand for `\u001B`) +- [#796]: Include an `\xHH` escape code sequence +- [#891]: Allow non-English scripts for unquoted keys + +> ℹ️ _`#define TOML_ENABLE_UNRELEASED_FEATURES 1` to enable these features (see [Configuration](#Configuration))._ + +### 🔹️ **TOML v1.0.0:** + +All features supported, including: + +- [#356]: Allow leading zeros in the exponent part of a float +- [#567]: Control characters are not permitted in comments +- [#571]: Allow raw tabs inside strings +- [#665]: Make arrays heterogeneous +- [#766]: Allow comments before commas in arrays + +### 🔹️ **TOML v0.5.0:** + +All features supported. + +
+ +## Contributing + +Contributions are very welcome! Either by [reporting issues] or submitting pull requests. +If you wish to submit a pull request, please see [CONTRIBUTING] for all the details you need to get going. + +
+ +## License and Attribution + +toml++ is licensed under the terms of the MIT license - see [LICENSE]. + +UTF-8 decoding is performed using a state machine based on Bjoern Hoehrmann's '[Flexible and Economical UTF-8 Decoder]'. + +### With thanks to: + +- **[@beastle9end](https://github.com/beastle9end)** - Made Windows.h include bypass +- **[@bjadamson](https://github.com/bjadamson)** - Reported some bugs and helped design a new feature +- **[@bobfang1992](https://github.com/bobfang1992)** - Reported a bug and created a [wrapper in python](https://github.com/bobfang1992/pytomlpp) +- **[@GiulioRomualdi](https://github.com/GiulioRomualdi)** - Added cmake+meson support +- **[@jonestristand](https://github.com/jonestristand)** - Designed and implemented the `toml::path`s feature +- **[@kcsaul](https://github.com/kcsaul)** - Fixed a bug +- **[@levicki](https://github.com/levicki)** - Helped design some new features +- **[@moorereason](https://github.com/moorereason)** - Reported a whole bunch of bugs +- **[@mosra](https://github.com/mosra)** - Created the awesome [m.css] used to generate the API docs +- **[@ned14](https://github.com/ned14)** - Reported a bunch of bugs and helped design some new features +- **[@okureta](https://github.com/okureta)** - Reported a bug +- **[@prince-chrismc](https://github.com/prince-chrismc)** - Added toml++ to ConanCenter, and fixed some typos +- **[@rbrugo](https://github.com/rbrugo)** - Helped design a new feature +- **[@Reedbeta](https://github.com/Reedbeta)** - Fixed a bug and added additional Visual Studio debugger native visualizers +- **[@Ryan-rsm-McKenzie](https://github.com/Ryan-rsm-McKenzie)** - Add natvis file to cmake install script +- **[@shdnx](https://github.com/shdnx)** - Fixed a bug on GCC 8.2.0 and some meson config issues +- **[@sneves](https://github.com/sneves)** - Helped fix a number of parser bugs +- **[@sobczyk](https://github.com/sobczyk)** - Reported some bugs +- **[@std-any-emplace](https://github.com/std-any-emplace)** - Reported some bugs +- **[@Tachi107](https://github.com/Tachi107)** - Made some tweaks to meson.build, added compile_library build option +- **[@traversaro](https://github.com/traversaro)** - Added vcpkg support and reported a bunch of bugs +- **[@whiterabbit963](https://github.com/whiterabbit963)** - Fixed a bug with value_or conversions +- **[@ximion](https://github.com/ximion)** - Added support for installation with meson +- **[@a-is](https://github.com/a-is)** - Fixed a bug + +
+ +## Contact + +For bug reports and feature requests please consider using the [issues] system here on GitHub. For anything else +though you're welcome to reach out via other means. In order of likely response time: + +- Gitter: [marzer/tomlplusplus](https://gitter.im/marzer/tomlplusplus) ("Discord for repos") +- Twitter: [marzer8789](https://twitter.com/marzer8789) +- Email: [mark.gillard@outlook.com.au](mailto:mark.gillard@outlook.com.au) +- Facebook: [marzer](https://www.facebook.com/marzer) +- LinkedIn: [marzer](https://www.linkedin.com/in/marzer/) + +[API documentation]: https://marzer.github.io/tomlplusplus/ +[homepage]: https://marzer.github.io/tomlplusplus/ +[unreleased TOML language features]: #unreleased-language-features +[most recently-released version]: https://github.com/toml-lang/toml/releases +[char8_t]: https://en.cppreference.com/w/cpp/keyword/char8_t +[TOML]: https://toml.io/ +[TOML master]: https://github.com/toml-lang/toml/blob/master/README.md +[TOML issues list]: https://github.com/toml-lang/toml/issues +[v1.0.0]: https://toml.io/en/v1.0.0 +[CONTRIBUTING]: ./CONTRIBUTING.md +[LICENSE]: ./LICENSE +[Flexible and Economical UTF-8 Decoder]: http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ +[cpp_compilers]: https://en.cppreference.com/w/cpp/compiler_support +[reporting issues]: https://github.com/marzer/tomlplusplus/issues/new/choose +[issues]: https://github.com/marzer/tomlplusplus/issues +[#356]: https://github.com/toml-lang/toml/issues/356 +[#516]: https://github.com/toml-lang/toml/issues/516 +[#562]: https://github.com/toml-lang/toml/issues/562 +[#567]: https://github.com/toml-lang/toml/issues/567 +[#571]: https://github.com/toml-lang/toml/issues/571 +[#644]: https://github.com/toml-lang/toml/issues/644 +[#665]: https://github.com/toml-lang/toml/issues/665 +[#671]: https://github.com/toml-lang/toml/issues/671 +[#687]: https://github.com/toml-lang/toml/issues/687 +[#766]: https://github.com/toml-lang/toml/issues/766 +[#790]: https://github.com/toml-lang/toml/pull/790 +[#796]: https://github.com/toml-lang/toml/pull/796 +[#891]: https://github.com/toml-lang/toml/pull/891 +[something better than std::optional]: https://github.com/TartanLlama/optional +[m.css]: https://mcss.mosra.cz/documentation/doxygen +[`toml.hpp`]: https://raw.githubusercontent.com/marzer/tomlplusplus/master/toml.hpp diff --git a/subprojects/tomlplusplus-3.3.0/cmake/install-rules.cmake b/subprojects/tomlplusplus-3.3.0/cmake/install-rules.cmake new file mode 100644 index 00000000..22180255 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/cmake/install-rules.cmake @@ -0,0 +1,52 @@ +include(CMakePackageConfigHelpers) +include(GNUInstallDirs) + +install( + FILES "${PROJECT_SOURCE_DIR}/toml++.natvis" "${PROJECT_SOURCE_DIR}/cpp.hint" + DESTINATION "${CMAKE_INSTALL_DATADIR}/tomlplusplus" + COMPONENT tomlplusplus_Development +) + +install( + DIRECTORY "${PROJECT_SOURCE_DIR}/include/" + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" + COMPONENT tomlplusplus_Development +) + +install( + TARGETS tomlplusplus_tomlplusplus + EXPORT tomlplusplusTargets + INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" +) + +write_basic_package_version_file( + tomlplusplusConfigVersion.cmake + COMPATIBILITY SameMajorVersion + ARCH_INDEPENDENT +) + +set( + tomlplusplus_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/tomlplusplus" + CACHE STRING "CMake package config location relative to the install prefix" +) + +mark_as_advanced(tomlplusplus_INSTALL_CMAKEDIR) + +install( + FILES + "${PROJECT_SOURCE_DIR}/cmake/tomlplusplusConfig.cmake" + "${PROJECT_BINARY_DIR}/tomlplusplusConfigVersion.cmake" + DESTINATION "${tomlplusplus_INSTALL_CMAKEDIR}" + COMPONENT tomlplusplus_Development +) + +install( + EXPORT tomlplusplusTargets + NAMESPACE tomlplusplus:: + DESTINATION "${tomlplusplus_INSTALL_CMAKEDIR}" + COMPONENT tomlplusplus_Development +) + +if(PROJECT_IS_TOP_LEVEL) + include(CPack) +endif() diff --git a/subprojects/tomlplusplus-3.3.0/cmake/project-is-top-level.cmake b/subprojects/tomlplusplus-3.3.0/cmake/project-is-top-level.cmake new file mode 100644 index 00000000..3435fc0e --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/cmake/project-is-top-level.cmake @@ -0,0 +1,6 @@ +# This variable is set by project() in CMake 3.21+ +string( + COMPARE EQUAL + "${CMAKE_SOURCE_DIR}" "${PROJECT_SOURCE_DIR}" + PROJECT_IS_TOP_LEVEL +) diff --git a/subprojects/tomlplusplus-3.3.0/cmake/tomlplusplusConfig.cmake b/subprojects/tomlplusplus-3.3.0/cmake/tomlplusplusConfig.cmake new file mode 100644 index 00000000..ec9f7a00 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/cmake/tomlplusplusConfig.cmake @@ -0,0 +1 @@ +include(${CMAKE_CURRENT_LIST_DIR}/tomlplusplusTargets.cmake) diff --git a/subprojects/tomlplusplus-3.3.0/cmake/tomlplusplusConfig.cmake.meson.in b/subprojects/tomlplusplus-3.3.0/cmake/tomlplusplusConfig.cmake.meson.in new file mode 100644 index 00000000..b007b685 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/cmake/tomlplusplusConfig.cmake.meson.in @@ -0,0 +1,29 @@ +@PACKAGE_INIT@ + +# If tomlplusplus::tomlplusplus target is not defined it will be included +if(NOT TARGET tomlplusplus::tomlplusplus) + + if (@compile_library@) + set(imported_type UNKNOWN) + else() + set(imported_type INTERFACE) + endif() + + # Import tomlplusplus interface library + add_library(tomlplusplus::tomlplusplus ${imported_type} IMPORTED) + set_target_properties(tomlplusplus::tomlplusplus PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${PACKAGE_PREFIX_DIR}/@includedir@") + + # Require C++17 + target_compile_features(tomlplusplus::tomlplusplus INTERFACE cxx_std_17) + + # Set the path to the installed library so that users can link to it + if (@compile_library@) + set_target_properties(tomlplusplus::tomlplusplus PROPERTIES + IMPORTED_LOCATION "${PACKAGE_PREFIX_DIR}/@libdir@/@lib_name@" + ) + # compile_options not quoted on purpose + target_compile_options(tomlplusplus::tomlplusplus INTERFACE @compile_options@) + endif() + +endif() diff --git a/subprojects/tomlplusplus-3.3.0/cmake/tomlplusplusConfigVersion.cmake.meson.in b/subprojects/tomlplusplus-3.3.0/cmake/tomlplusplusConfigVersion.cmake.meson.in new file mode 100644 index 00000000..16b97493 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/cmake/tomlplusplusConfigVersion.cmake.meson.in @@ -0,0 +1,48 @@ +# This is a basic version file for the Config-mode of find_package(). +# It is used by write_basic_package_version_file() as input file for configure_file() +# to create a version-file which can be installed along a config.cmake file. +# +# The created file sets PACKAGE_VERSION_EXACT if the current version string and +# the requested version string are exactly the same and it sets +# PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version. +# The variable CVF_VERSION must be set before calling configure_file(). + +set(PACKAGE_VERSION "@version@") + +if (PACKAGE_FIND_VERSION_RANGE) + # Package version must be in the requested version range + if ((PACKAGE_FIND_VERSION_RANGE_MIN STREQUAL "INCLUDE" AND PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION_MIN) + OR ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE" AND PACKAGE_VERSION VERSION_GREATER PACKAGE_FIND_VERSION_MAX) + OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE" AND PACKAGE_VERSION VERSION_GREATER_EQUAL PACKAGE_FIND_VERSION_MAX))) + set(PACKAGE_VERSION_COMPATIBLE FALSE) + else() + set(PACKAGE_VERSION_COMPATIBLE TRUE) + endif() +else() + if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION) + set(PACKAGE_VERSION_COMPATIBLE FALSE) + else() + set(PACKAGE_VERSION_COMPATIBLE TRUE) + if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION) + set(PACKAGE_VERSION_EXACT TRUE) + endif() + endif() +endif() + + +# if the installed project requested no architecture check, don't perform the check +if("True") + return() +endif() + +# if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it: +if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "" OR "8" STREQUAL "") + return() +endif() + +# check that the installed version has the same 32/64bit-ness as the one which is currently searching: +if(NOT CMAKE_SIZEOF_VOID_P STREQUAL "8") + math(EXPR installedBits "8 * 8") + set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)") + set(PACKAGE_VERSION_UNSUITABLE TRUE) +endif() diff --git a/subprojects/tomlplusplus-3.3.0/cmake/variables.cmake b/subprojects/tomlplusplus-3.3.0/cmake/variables.cmake new file mode 100644 index 00000000..3660bfbc --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/cmake/variables.cmake @@ -0,0 +1,18 @@ +# ---- Warning guard ---- + +# target_include_directories with the SYSTEM modifier will request the compiler +# to omit warnings from the provided paths, if the compiler supports that +# This is to provide a user experience similar to find_package when +# add_subdirectory or FetchContent is used to consume this project +set(tomlplusplus_warning_guard "") +if(NOT PROJECT_IS_TOP_LEVEL) + option( + tomlplusplus_INCLUDES_WITH_SYSTEM + "Use SYSTEM modifier for tomlplusplus's includes, disabling warnings" + ON + ) + mark_as_advanced(tomlplusplus_INCLUDES_WITH_SYSTEM) + if(tomlplusplus_INCLUDES_WITH_SYSTEM) + set(tomlplusplus_warning_guard SYSTEM) + endif() +endif() diff --git a/subprojects/tomlplusplus-3.3.0/cpp.hint b/subprojects/tomlplusplus-3.3.0/cpp.hint new file mode 100644 index 00000000..7dcca90c --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/cpp.hint @@ -0,0 +1,39 @@ +#define TOML_ABI_NAMESPACE_BOOL(...) static_assert(true) +#define TOML_ABI_NAMESPACE_END static_assert(true) +#define TOML_ABSTRACT_INTERFACE +#define TOML_ALWAYS_INLINE inline +#define TOML_ANON_NAMESPACE_END static_assert(true) +#define TOML_ANON_NAMESPACE_START namespace +#define TOML_API +#define TOML_ATTR(...) +#define TOML_CLOSED_ENUM +#define TOML_CLOSED_FLAGS_ENUM +#define TOML_CONST_GETTER +#define TOML_CONST_INLINE_GETTER inline +#define TOML_CONSTRAINED_TEMPLATE(cond, ...) template <__VA_ARGS__> +#define TOML_EMPTY_BASES +#define TOML_EXPORTED_CLASS +#define TOML_EXPORTED_FREE_FUNCTION +#define TOML_EXPORTED_MEMBER_FUNCTION +#define TOML_EXPORTED_STATIC_FUNCTION +#define TOML_EXTERNAL_LINKAGE +#define TOML_FLAGS_ENUM +#define TOML_HIDDEN_CONSTRAINT(cond, ...) template <__VA_ARGS__> +#define TOML_IMPL_NAMESPACE_END static_assert(true) +#define TOML_IMPL_NAMESPACE_START namespace toml::impl +#define TOML_INTERNAL_LINKAGE static +#define TOML_LIKELY(...) (__VA_ARGS__) +#define TOML_LIKELY_CASE +#define TOML_NAMESPACE_END static_assert(true) +#define TOML_NAMESPACE_START namespace toml +#define TOML_NEVER_INLINE +#define TOML_NODISCARD +#define TOML_NODISCARD_CTOR +#define TOML_OPEN_ENUM +#define TOML_OPEN_FLAGS_ENUM +#define TOML_PURE_GETTER +#define TOML_PURE_INLINE_GETTER inline +#define TOML_RETURNS_BY_THROWING +#define TOML_TRIVIAL_ABI +#define TOML_UNLIKELY(...) (__VA_ARGS__) +#define TOML_UNLIKELY_CASE diff --git a/subprojects/tomlplusplus-3.3.0/docs/images/badge-C++17.svg b/subprojects/tomlplusplus-3.3.0/docs/images/badge-C++17.svg new file mode 100644 index 00000000..14d427e4 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/docs/images/badge-C++17.svg @@ -0,0 +1 @@ + standardC++17 \ No newline at end of file diff --git a/subprojects/tomlplusplus-3.3.0/docs/images/badge-C++20.svg b/subprojects/tomlplusplus-3.3.0/docs/images/badge-C++20.svg new file mode 100644 index 00000000..92e9684c --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/docs/images/badge-C++20.svg @@ -0,0 +1 @@ + standardC++20 \ No newline at end of file diff --git a/subprojects/tomlplusplus-3.3.0/docs/images/badge-TOML.svg b/subprojects/tomlplusplus-3.3.0/docs/images/badge-TOML.svg new file mode 100644 index 00000000..01db3c41 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/docs/images/badge-TOML.svg @@ -0,0 +1 @@ +TOML: v1.0.0TOMLv1.0.0 \ No newline at end of file diff --git a/subprojects/tomlplusplus-3.3.0/docs/images/badge-awesome.svg b/subprojects/tomlplusplus-3.3.0/docs/images/badge-awesome.svg new file mode 100644 index 00000000..5d9da969 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/docs/images/badge-awesome.svg @@ -0,0 +1 @@ +Mentioned in an Awesome list diff --git a/subprojects/tomlplusplus-3.3.0/docs/images/badge-gitter.svg b/subprojects/tomlplusplus-3.3.0/docs/images/badge-gitter.svg new file mode 100644 index 00000000..08a42236 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/docs/images/badge-gitter.svg @@ -0,0 +1 @@ +chat: on gitterchaton gitter \ No newline at end of file diff --git a/subprojects/tomlplusplus-3.3.0/docs/images/badge-license-MIT.svg b/subprojects/tomlplusplus-3.3.0/docs/images/badge-license-MIT.svg new file mode 100644 index 00000000..52456a74 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/docs/images/badge-license-MIT.svg @@ -0,0 +1 @@ + licenseMIT \ No newline at end of file diff --git a/subprojects/tomlplusplus-3.3.0/docs/images/badge-sponsor.svg b/subprojects/tomlplusplus-3.3.0/docs/images/badge-sponsor.svg new file mode 100644 index 00000000..f3c196b8 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/docs/images/badge-sponsor.svg @@ -0,0 +1 @@ +sponsor: â¤sponsor⤠\ No newline at end of file diff --git a/subprojects/tomlplusplus-3.3.0/docs/images/banner.ai b/subprojects/tomlplusplus-3.3.0/docs/images/banner.ai new file mode 100644 index 00000000..dceba32a --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/docs/images/banner.ai @@ -0,0 +1,2182 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[7 0 R 8 0 R 36 0 R 37 0 R 66 0 R 67 0 R 65 0 R 97 0 R 98 0 R 99 0 R 131 0 R 132 0 R 133 0 R 164 0 R 165 0 R 166 0 R 197 0 R 198 0 R 199 0 R 231 0 R 232 0 R 233 0 R 265 0 R 266 0 R 267 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <
>stream + + + + + application/pdf + + + toml-banner + + + Adobe Illustrator CC 23.0 (Windows) + 2022-09-07T16:13:54+03:00 + 2022-09-07T16:56+03:00 + 2022-09-07T16:56+03:00 + + + + 256 + 76 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgATAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8ANs6p5t2KvD9Q/wB77n/j K/8AxI5cHHKHwodirsVdir2Hyn/yjlh/xiH6zlUubfHkm+RZPa/y0/5Q6z/1pv8Ak62aDXf3p+H3 O60f92GUZiOU7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXzZnVPNvFtXn nGq3oEjACeWgqf5zlwcc80D13OFDWKuxV2KuxVeJplFBIwA6AE4EvY/LZJ0DTyTUmBKk/wCrlR5t 8eT338tP+UOs/wDWm/5OtnP67+9Pw+53ej/uwyjMRynYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq+bM6p5tC/lJ+U3lbzv/iC61l7lZbO/aKL6vIqDi1WNeSP3zD1urniIEa3 Dk6PSxyAmXe9C/6Fh/Lf/fuo/wDI+P8A6pZhfynl8nM/k3H5u/6Fh/Lf/fuo/wDI+P8A6pY/ynl8 l/k3H5u/6Fh/Lf8A37qP/I+P/qlj/KeXyX+Tcfm+e/zU8sab5X8+6poWmGQ2Vn6HpGZg7/vbeOVq sAo+057ZuNLlOTGJHmf1up1OMQyGI5MTzIcd2KvZfLP/ACj+nf8AGCP/AIjlJ5uRHk9+/LT/AJQ6 z/1pv+TrZz+u/vT8Pud3o/7sMozEcp2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KvmzOqebYFoH5p+bPJd5q1rokkKRXd28swliEh5KxUUJO22QzaWGWjJcWpnjsRZt5F/P38w 9Z85aNpV7NbG0vruKCcJAqsUdgDQ12zEz6DHGBIuwHKw67JKYB6l9B+cNTutK8pa3qdoQLqwsLq5 tyw5KJIYWdKjuOS5p8MRKYB6kO2yyMYEjoC+X/8AoZT8z/8Af9p/0jr/AFze/wAm4vN0n8oZfJgH mjzLqnmbXbnW9UZGv7vh6zRrwX93GsS0UdPhQZmYsYhHhHIOLkyGcuI80qyxrdir2Xyz/wAo/p3/ ABgj/wCI5SebkR5Pfvy0/wCUOs/9ab/k62c/rv70/D7nd6P+7DKMxHKdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdir5szqnm3ier/8da9/4zy/8TOXBxzzT78q/wDyZHlr/to2 /wDycGUar+6l7m7Tf3kfe+wPzF/8l95n/wC2Tff9Qz5zmn/vI/1h970Go/u5f1T9z488geSLzzX5 j0/TCJraxvHdH1BIWkROCM3X4V6rTrnR6jOMcSeoefwYTOQHQpt+an5WXPknWorG0kn1O0e0W7lv fQKIhaSRChKl12EYO575XpdUMsbOxts1OmOOVDfZBflt+Xt35w8xWmmymeysLlJW/SCwmRAYkY0B JVTVl49cnqdQMcSeZ7mGnwHJIDkFX8zfy3uvJvmCXToGnv7KKGOVr8wFEBk6gkF1FD74NNqRkjfI p1OnOOVcwzDyz/yj+nf8YI/+I5YeaI8nv35af8odZ/603/J1s5/Xf3p+H3O70f8AdhlGYjlOxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV82Z1TzbxPV/+Ote/8Z5f+JnLg455 p9+Vf/kyPLX/AG0bf/k4Mo1X91L3N2m/vI+99gfmL/5L7zP/ANsm+/6hnznNP/eR/rD73oNR/dy/ qn7niX/OPf5p29mumeRDpzvLd3E7i/EoCryUyf3fGp+xT7WbTtDSk3kvk63Qamqx0yr8+/zUt9Bt 7zyc+nPcS6xpjOt4JQqx+u0kO6cTWnp165j6DSmZE75Fv12p4bhXMJN/zj1+advJbaN5A/RziaJL p/0h6o4mry3P93xr0bj9rLe0NKbOS+79TXoNTsMdd/60R/zkF+advZ22qeRDpzvLd28Li/EoCryd ZP7vjU/Yp9rI9n6UkjJfJOu1NA46Yd5Z/wCUf07/AIwR/wDEc2x5uujye/flp/yh1n/rTf8AJ1s5 /Xf3p+H3O70f92GUZiOU7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXzZn VPNvE9X/AOOte/8AGeX/AImcuDjnmn35V/8AkyPLX/bRt/8Ak4Mo1X91L3N2m/vI+99gfmL/AOS+ 8z/9sm+/6hnznNP/AHkf6w+96DUf3cv6p+58K51bzDsVdirsVey+Wf8AlH9O/wCMEf8AxHKTzciP J79+Wn/KHWf+tN/ydbOf1396fh9zu9H/AHYZRmI5TsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVfNmdU828T1f/jrXv/GeX/iZy4OOeaJ8q65+gPMmm616H1n9HXEdx9X5enz9 NuXHnR+NfGhyGWHHEx72eKfDIS7nsHmP/nJ/9M+XtU0f/DXofpK0ntPX+vc+HrxNHz4/V15ceVaV Ga3H2ZwyEuLke79rsMnaXFEjh5jv/Y8KzbOrdirsVdir2Xyz/wAo/p3/ABgj/wCI5SebkR5Pfvy0 /wCUOs/9ab/k62c/rv70/D7nd6P+7DKMxHKdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdir5szqnm0km8l+Wppnmks+UkjF3b1JRVmNSdnyXEWPCHlF5Gkd3PGgoiSMqjwAYgZY 0lRwodirsVdir0ny95Q8u3ei2dzcWnOeWMNI/qSipr4BgMrMi3RiKZVbW0Nrbx28C8IYlCRrUmij YCpqcize4flp/wAodZ/603/J1s5/Xf3p+H3O60f92GUZiOU7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXl/8AyB7/AIs/6es2/wDhX4p1n+Dfi3f8ge/4s/6esf8ACvxS/wCD fi2E3H/Qp/ryetz9Xk3qf8db7Vd+m3XJf4Z+OFr/AME/HEs/6xJ/y/8Aub4/4Z+OFf8ABPxxO/6x J/y/+5vj/hn44V/wT8cTv+sSf8v/ALm+P+GfjhX/AAT8cTv+sSf8v/ub4/4Z+OFf8E/HEy7Sv+VH fo6D9Hep9S4/uP8Aez7P+z+L78ifzX44WY/Lfi0X/wAge/4s/wCnrH/CvxSf8G/Fs78r/oX9Cwfo Wv6Oq/pcuda8zy+38X2q5rtRx8Z4/qc7Dw8Pp5JrlLa7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FX/9k= + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:1ae51725-ff00-b141-90e0-f817e42ff815 + uuid:4e43f135-b3db-4ac9-b557-bde286ffd245 + + xmp.iid:5570a217-d8c0-2f45-aba7-0d76b8c47f45 + xmp.did:5570a217-d8c0-2f45-aba7-0d76b8c47f45 + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:b83112e6-012d-3948-9314-fc73643b718f + 2020-02-25T23:22:59+02:00 + Adobe Illustrator CC 22.1 (Windows) + / + + + saved + xmp.iid:1ae51725-ff00-b141-90e0-f817e42ff815 + 2022-09-07T16:13:54+03:00 + Adobe Illustrator CC 23.0 (Windows) + / + + + + + + + EmbedByReference + + D:\Repositories\tomlplusplus\docs\images\logo.ai + xmp.did:76ecb5d0-0c0b-7e4b-b891-4dbb246228bd + uuid:9c54a817-4ce5-4a64-99ce-c0de4cc76998 + + + + + + + + D:\Repositories\tomlplusplus\docs\images\logo.ai + xmp.did:76ecb5d0-0c0b-7e4b-b891-4dbb246228bd + uuid:9c54a817-4ce5-4a64-99ce-c0de4cc76998 + + + + Web + Document + 1 + False + False + + 1280.000000 + 400.000000 + Pixels + + + + + MyriadPro-Bold + Myriad Pro + Bold + Open Type + Version 2.062;PS 2.000;hotconv 1.0.57;makeotf.lib2.0.21895 + False + MYRIADPRO-BOLD.OTF + + + MyriadPro-BoldCond + Myriad Pro + Bold Condensed + Open Type + Version 2.062;PS 2.000;hotconv 1.0.57;makeotf.lib2.0.21895 + False + MYRIADPRO-BOLDCOND.OTF + + + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 0 + 0 + 0 + + + RGB Red + RGB + PROCESS + 255 + 0 + 0 + + + RGB Yellow + RGB + PROCESS + 255 + 255 + 0 + + + RGB Green + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blue + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Grays + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Web Color Group + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + + Adobe PDF library 15.00 + 21.0.0 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 10 0 obj <>/Resources<>/ExtGState<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 273 0 R/TrimBox[0.0 0.0 1280.0 400.0]/Type/Page>> endobj 269 0 obj <>stream +H‰ÔTÛnÛ0 }×Wð1Faš”D]^ë†Å0¿­Å¤M[ I×dOûúÑvš8Žû3`^Žt¨CIPuWC5¯ ®¿Ô`næjªâªêË=ÚÕ +ì—[SÝêÈóÞ°$ðõÿîɬ ¡ËVçòj“õ=å¸-¤VIH¤£N³~°Ü˜v¨µe[gmBĘâ8³Ñ!¥¤ˆäËÜ9 Ö é#€4|Qßr\ ìÓ'r>*8‹á¬äpA£ä >¡K2ÊNB¸Ý‘ñÙ$èˆ0y”Hn¨‰îŸd­à½µ@ÈW Œ Sæ)äH*µ“§©íòì1d-Å)¡x>)+YPO»%ÂÞ¶õ<º y7Õg½*çqÉÙÊ`ærðÇÅ.#‡ñÅñ aôÚÇÝÏucª†µ 5+ÖúîÔ «îö̉4ósö§˜½mÖWWÅCóµãqÏóÒÑÔu,«· è%ìXM¡üÙÝü,ß¶÷äâ3ü^ìöO;XlAýëbýú·ˆ0ShU$]bõa›æì}±ƒ'çŸÅê% +endstream endobj 273 0 obj <>stream +8;Z\63tfLT#]-?s4rsohm<&Jt%jnK)"e-\\%PpZ7]!H9@mjg.[WeaV(@EI_E"#W6K +&JmW07P>_%K9aQHUF#_$H@JAn +endstream endobj 274 0 obj [/Indexed/DeviceRGB 255 275 0 R] endobj 275 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 265 0 obj <> endobj 266 0 obj <> endobj 267 0 obj <> endobj 280 0 obj [/View/Design] endobj 281 0 obj <>>> endobj 278 0 obj [/View/Design] endobj 279 0 obj <>>> endobj 276 0 obj [/View/Design] endobj 277 0 obj <>>> endobj 263 0 obj <> endobj 264 0 obj <> endobj 283 0 obj <> endobj 284 0 obj <> endobj 285 0 obj <>stream +H‰|T{TgŸ!™ hœm‡ìf43í¶k­ +V4.§.TÔ]NQkå¡‘MÁ’˜ B +WðτǪDTDªPA×µÊ]]këúXTv»­ìJ—­ìáýس;¡ý£í™sî¹ïûÝ{ß½ƒcÒ Çqå–ø ±Ñë–l>hÒk´ñ&ã²c†v­Ñ õG9a.Ì— + å zU}—òÝ»Üø L½øÕ‚@.“à¸ôÑ?Òvé×3E€½û,ü+–úåÊY¹z)¿bùòå³r%­5îÑñ ÍÝ~3¿Éj4eM‹NÊGgdð³fÞ¤3ëLV¿óû²x½™×é-ût&^#÷êÅû&–·˜4ZÝ~)7ú#?2ÓþO*^oàE,~›Aï·,¢ÓÌk Ú0Å8›%ÕxÀ`1éuæÐ°Ø„­3uü/y­. ÃpñÃäö +†-ñå¶ +Ãb0l{Ã6cد°KÄðæ }ñ˜û{ŒÇã­ø`@x€9àk‰Zb—ΑÆJ“¤§¤ß‰D7@F‘SCÂø.ÊW†$R¡t:~¦”„*t•A‘PKÀ‰xô[üÆLl†L™Õ!‰6)\büò[²S°«Ý +ÖG8Ô=‘@àceD@²>+d +}[‚œ)9d*9À¾¹å:¬‚7oݸëk-.jæèž èÛuöôºd)ÐK¯¡´õz ¢û{jê¼e¯‰0lï‚Br5®€E ÃHARPê†wP´uZm >%\§3k‘{¦ÕR‘ÛP)A÷ä¨sß*ˆ +,%?¼—󧃣۠ô§ˆ#éÌÄÿ¨ ’ `¯ºU=êüâgNÒãYݸ- +ˆ§ä5(n¼äyÜð¹*_{då‘w©/@ +{€Ä‡¨œŽ9…£8´y©aÌÿê9Ô@h2l@j®‘̰‡GsÐB뢄í†âW}¹ÄQíVaæá E(DSófH4æ’”Ïñ,Êê³Bá“ãÁ^xa:RÃ3ažD‹cäU¿YAxNœt÷²Ÿtµ\¾ IÊñb”tʪßm¾{®×ÛsLUEÒ‘5‰„HMÉ©²³½JÚ‹˜>¦°¼¨¬He(´Ø°¶LÏ…?þ¾ù\%G­/ž‚³S¸B$p $LQÞ¡ÒlvKÚå/G{†¯w´”vs­Ï —ÝX“Á"vÅËh +Y/ôœªu5r”cêWVAØn ADEAçBçôF•–ɺìY»Ùˆ¨Õ(’£Ñ H6y¾××íñ™[³•‚,ë/»< ÎËÄŠ™Æ^ž_Z¤Òdæ°{Mƒc[o kÉÜ„sVä*©cÅ“OAúL,š†@˜+óïdœMNïGJX¼åñË(`Õb–}ÊÁ‹u§T9'ætGûnJ×½rî©t°Òsýc¶·egGñâËðc“Sù¶àÛbõ÷!)DàGÇÔ2z¬Sv®åÌù–¦²Ãõ*ú~ó·=æÊΪֳɚÜýFN›úáŽeö¦Ð›3¼ŒBIÏ'žC÷·¯‚$ø0@ˆ`#Â"ø+C_s^¬êW!I½O”‘g²ÓÛµìÑKÑjtÉïéöœlåœûɨ¬]›tu f•ùDîG}ŽöÎ¥¶îÓ\ï™¶«ÿV"¼(r”[’¯Ê*8$r¤ËøúÏÞŸt4e[]\UÓnWR(Rl*Ïö~.nåÀlWëC„<‘à<ÙéXfoºqW%GiÊON³gOø>.çèûç ]:…Ö´[§7Úpñšd@œÓéþíûC»ÿ³p“"b¿?FŠÀeÞª–#õ*_§¹ƒ=SŸº‡C×Ä1¿%<ínèM–Τ*#éþ¢+"Hg’3i»’:㘀kþÁÒ?|¡„y=l Z‡Â? ƒ »@ Án‹G\ù"¦ß­Þ¸6?bw’ý³'·êG/pzË +qSÐ7Ëw¿˜O +!ôH?Úʈz®“´47eß{1°`ñÉi¦T'2î/„ô²3^I€ÂÌ4T6V׫:«½Þ6¶·óýÐÈœ ɹ9µ' +¸’ú²æ%õšØ¾8Û…¶c¶Îï­ô÷N’þ´Íé9âV 5õx»Xw]Ey-G×#£+EE•yì¾Tã{Vî0I-º3K@²s{¢’Š-þ†ÿ‰ùiK¼LNÇ…ü>ö_Ÿ_ž¸’yqm—|<¿±]ÙÑÜÖ}¬³0ß«ê|F4f¥×ïaÇm OiÛñ0…;gj:dR²sõìmjÈVQšŠ)èš +öÀMtèQOÜœBkªHw›÷d‹/¾ AFü ð°¤TVmûàPf =ŠäÈ@PÏ~Ø[›DBôøì6€t†Xyèp«l ­ïÎYŸÃÑ©¢G<Ï z¼!KS›Ä¢õ©ˆŠã²~XGí´ºm«‡%µ]M3ÉÕ¤æB+]3©µ½®¶zY¾{ZÝ€RÜætÏXj…·](Î5ct÷»|® Uûîõ…Mÿ•ÍÅ\PTËçUÊ)!a¾°ùŸ\•êJ +endstream endobj 282 0 obj <> endobj 286 0 obj <>stream +H‰|PoHa¾×Í;­5K=‹&Û EjÍKR¿¦ZÚH¥ÓV;u¨;wwÍ %ŠiNšÙ™fÍ@¨Ä jV…DF EDRßÚ‡„èËïÖ;¨Û$èSïžç÷üþñ"JC!„RjêÊ­î©ì6»Uà3÷óíöˆcR HIÖ*©:–ä“‘Tmð—+^$ÀÛ-_C=‰T BŸ¾•ðjcK«„s -ææE1ߌ-999QÌÃÅvþ‡«»E‰ëq¹ó4/tò‚MâìY¸¸½GGˆXàDNpG’ëç`‡ˆ9‡ÔÊ Ø¦š-µ_àìXlv®Ã&´a>âü#›ÿ³ +;œX…kŽˆª–Ô¤ˆmN{¶:…n9ÍŸqJ‚ƒ³²Ëªkº;9\€í\3¥>UIUQVª–¢ÕS©D ¡t M*žK‹Ê÷E¤âÎEÍ%­â YÃFÈK–Á•XÒ“ç,DDx” ÓQEDÕ´òŒ0Qz%8åWwM^e–%NÂeG\kà.H8p2zðO¹Cõ]h Ìš¥0‡ê‰™Ö‡~L¹=$œïJ\‚ô¿‘œšPkÒé¤Ïð€¹6> endobj 271 0 obj [/ICCBased 287 0 R] endobj 287 0 obj <>stream +H‰œ–yTSwÇoÉž•°Ãc [€°5la‘QIBHØADED„ª•2ÖmtFOE.®c­Ö}êÒõ0êè8´׎8GNg¦Óïï÷9÷wïïÝß½÷ó '¥ªµÕ0 Ö ÏJŒÅb¤  + 2y­.-;!à’ÆK°ZÜ ü‹ž^i½"LÊÀ0ðÿ‰-×é @8(”µrœ;q®ª7èLöœy¥•&†Qëñq¶4±jž½ç|æ9ÚÄ +V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚óÈtÕ;\ú” Ó¥$ÕºF½ZUnÀÜå˜(4TŒ%)ë«”ƒ0C&¯”阤Z£“i˜¿óœ8¦Úbx‘ƒE¡ÁÁBÑ;…ú¯›¿P¦ÞÎӓ̹žAü om?çW= +€x¯Íú·¶Ò-Œ¯Àòæ[›Ëû0ñ¾¾øÎ}ø¦y)7ta¾¾õõõ>j¥ÜÇTÐ7úŸ¿@ï¼ÏÇtÜ›ò`qÊ2™±Ê€™ê&¯®ª6ê±ZL®Ä„?â_øóyxg)Ë”z¥ÈçL­UáíÖ*ÔuµSkÿSeØO4?׸¸c¯¯Ø°.òò· åÒR´ ßÞô-•’2ð5ßáÞüÜÏ ú÷Sá>Ó£V­š‹“då`r£¾n~ÏôY &à+`œ;ÂA4ˆÉ 䀰ÈA9Ð=¨- t°lÃ`;»Á~pŒƒÁ ðGp| ®[`Lƒ‡`<¯ "A ˆ YA+äùCb(ЇR¡,¨*T2B-Ð +¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…寒°d¬VÖë(ëk–Íe‹Øél »—½‡}Ž}ŸCâ¸qâ9 +N'çÎ)Î].ÂuæJ¸rî +î÷ wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö +n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=GTB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîƕƩºÈº‘ºçõyõ‡Ø Ú† žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_pß¶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠnßLÝlÜ<9”úO¤[þ˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ +¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ ÷„óû +endstream endobj 270 0 obj <> endobj 288 0 obj <> endobj 289 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 17.0 +%%AI8_CreatorVersion: 23.0.1 +%%For: (Mark Gillard) () +%%Title: (banner.ai) +%%CreationDate: 9/7/2022 4:56 PM +%%Canvassize: 16383 +%%BoundingBox: 158 -1276 1215 -970 +%%HiResBoundingBox: 158 -1276 1215 -970 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%%DocumentFiles:D:\Repositories\tomlplusplus\docs\images\logo.ai +%AI5_FileFormat 13.0 +%AI12_BuildNumber: 540 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Registration]) +%AI3_Cropmarks: 0.000000000000909 -1322 1280 -922 +%AI3_TemplateBox: 640.5 -320.5 640.5 -320.5 +%AI3_TileBox: 219.055114746094 -1419.63778686523 1060.97509765625 -824.317779541016 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 6 +%AI9_ColorModel: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 3 +%AI9_OpenToView: -960 168 1 3338 1967 18 1 0 116 129 0 0 0 1 1 0 0 1 0 0 +%AI5_OpenViewLayers: 377 +%%PageOrigin:240 -620 +%AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MS +%%EndComments + +endstream endobj 290 0 obj <>stream +%%BoundingBox: 158 -1276 1215 -970 +%%HiResBoundingBox: 158 -1276 1215 -970 +%AI7_Thumbnail: 128 40 8 +%%BeginData: 4801 Hex Bytes +%0000330000660000990000CC0033000033330033660033990033CC0033FF +%0066000066330066660066990066CC0066FF009900009933009966009999 +%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 +%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 +%3333663333993333CC3333FF3366003366333366663366993366CC3366FF +%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 +%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 +%6600666600996600CC6600FF6633006633336633666633996633CC6633FF +%6666006666336666666666996666CC6666FF669900669933669966669999 +%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 +%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF +%9933009933339933669933999933CC9933FF996600996633996666996699 +%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 +%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF +%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 +%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 +%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF +%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC +%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 +%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 +%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 +%000011111111220000002200000022222222440000004400000044444444 +%550000005500000055555555770000007700000077777777880000008800 +%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB +%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF +%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF +%524C455B5A5A5A5B5A5A5A2F060D060D070D060D070D060D070D060D070D +%062F5A5A5A5B5A5A5A85FD5BFFFD085A07070607060D0607060D0607060D +%0607060D060707FD085AFD5BFF5A5A5B5A5A5A5B5A2F060D060D060D060D +%060D060D060D060D060D062F5A5B5A5A5A5B5A5AAFFD5AFF5A5A36FD055A +%070606070607060706070607060706070607060707FD055A365A5AFD5BFF +%5A5A5B5A5A0D302F2F060D070D060D070D060D070D060D070D060D062F2F +%302F5A5A5B5A5AAFFD5AFFFD045A0D0606070607060D0607060D0607060D +%0607060D0607060D060706070DFD045AFD5BFF5B5A5A5A30060D060D060D +%060D060D060D060D060D060D060D060D060D060D06305A5A5A5BFD5BFF36 +%5A5A5A0D0706070607060706070607060706070607060706070607060706 +%060DFD045AFD5BFF5B5A5A5A300607060D0607060D0607060D0607060D07 +%0D060D070D060D070D06305A5A5A85FD5BFFFD045A0D0DFD0E2F0D0D0607 +%060D0607060D06060DFD045AFD5BFF5A5A5B5A2F2FFD0FFF060D060D060D +%060D060D062F5A5B5A5AAFFD5AFF5A5A365A072FFD0FFF0D060706070607 +%060706070D5A365A5AFD5BFF5A5A5B5A2F2FFD0FFF070D070D060D070D06 +%0D062F5A5B5A5AAFFD5AFFFD045A072FA8FFA8A9A8FD05FFA8AFA8FFA80D +%060D0607060D060706070DFD045AFD5BFF5B5A5A5A30062F062F070D7EFF +%FFFF5A0D072F062F060D060D060D060D060D06305A5A5A5BFD5BFF365A5A +%5A0D07060706070684FFFFFF5A010706070607060706070607060706060D +%FD045AFD5BFF5B5A5A5A30060D060D06077EFFFFFF5A07070D060D070D06 +%0D070D060D070D06305A5A5A85FD5BFFFD045A0D070607060D0684FFFFFF +%7E060D060706070607060D0606060706060DFD045AFD5BFF5A5A5B5A2F06 +%0D060D06077EFFFFFF5A07060D2F590D0D060D062F2F35060D062F5A5B5A +%5AAFFD5AFF5A5A365A0D06060706070684FFFFFF7E060606AFFF5A010706 +%0606FFFF2F01070D5A365A5AFD5BFF5A5A5B5A2F060D070D060D84FFFFFF +%5A072F5AAFFF845A0D0D2F7EFFFF5A5A062F5A5B5A5AAFFD5AFFFD045A0D +%06060D06070684FFFFFF7E06A8FD05FF5A06FD06FF2F0DFD045AFD5BFF5B +%5A5A5A30060D060D06077EFFFFFF5907A8FD05FF590DFD06FF0D2F5A5A5A +%5BFD5BFF365A5A5A0D07060706070684FFFFFF7E012F2FAFFF842F2F062F +%53FFFF7E2F0707FD045AFD5BFF5B5A5A5A30060D060D06077EFFFFFF5A07 +%0607A9FF5A06060D062FFFFF2F0706305A5A5A85FD5BFFFD045A0D070607 +%060D0684FFFFFF7E060D062F2F2F0607060D062F2F2F06060DFD045AFD5B +%FF5A5A5B5A2F060D060D06077EFFFFFF5A07060D0607060D060D060D0607 +%060D062F5A5B5A5AAFFD5AFF5A5A365A0D06060706070684FFFFFF7E0607 +%06070607060706070607060706070D5A365A5AFD5BFF5A5A5B5A2F060D07 +%0D060D84FFFFFF5A07060D070D060D070D060D070D060D062F5A5B5A5AAF +%FD5AFFFD045A0D06060D06070684FFFFFF7E0607060D0607060D0607060D +%060706070DFD045AFD5BFF5B5A5A5A30060D060D060784FFFFFF7E07060D +%060D060D060D060D060D060D06305A5A5A5BFD5BFF365A5A5A0D07060706 +%0706597E847E2F060706070607060706070607060706060DFD045AFD5BFF +%5B5A5A5A30060D060D070D06070607062F070D060D070D060D070D060D07 +%0D06305A5A5A85FD5BFFFD045A07070606060D0607060D0607060D060706 +%0D0607060D06070607060607FD045AFD5BFF5A5A5B5A36072F0D0D060D06 +%0D060D060D060D060D060D060D060D060D0D2F0D365A5B5A5AAFFD5AFF5A +%5A36FD055A070606070607060706070607060706070607060707FD055A36 +%5A5AFD5BFF5A5A5B5A5A5A5B5A2F060D070D060D070D060D070D060D070D +%060D062F5A5B5A5A5A5B5A5AAFFD5AFF5A5A365A5A5A365A070606070607 +%0607060706070607060706070607075A365A5A5A365A5AFD5BFF855A5A5A +%855A5A5A360D2F072F0D2F072F0D2F072F0D2F072F0D2F06365A5A5A855A +%5A5A85FD5BFFA8FFA9FFA8FFA9FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF +%A8FFA8FFA8FFA9FFA8FFA9FFA8FD5AFFFF +%%EndData + +endstream endobj 291 0 obj <>stream +%AI12_CompressedDataxœì½ks7–%úÝúç~航¹SG‰7à;q#H²Æ=Ue‡íêé¹Ý +–IJÙ%‘Jªjϯ¿km<2ÈCÒ²e«»MØ’˜@H<6ösáïþ¯/¾úÍÉ‹Û?]ýÆì§Ý“OþîïÎî®.ßÞÞ}º“Ç»Ï^¾|÷æíýêË_ïTØO,uòY|VJþÃÕÝ›ëÛ›OwUìs/øþ¯~y÷—Ýo¯_¾¼¼{ñëݯ~Íœ¯¯ß¾¼BÞŸ.on®îö—׿nm¢ŽÃå[d¦§á©ž´ÞÙOß}ñ{)qyó×Ë7o®ÿò•7Ñðáéí»›×7ßœÞþžº¸ûÒÁï”Vn÷›¤£ÿýúË«7)x¸}þîÕÕÍÛ/înŸ_½ysvûòöîͧ»³ï.ov¿¿ü9—»ÿuõòåíßv§//ŸÿeùÎÅíÍ[”ýýww×—/PÁoNo_¾`ÿ»{vv{óbùâ®®^\½xï×/®_^½ùôðé?yõúöÍ5&ãúêÍ?¿½}õò5fÿÿó‹Ûçoþùú>àÍ?¿¼ýæCŽN>sÏø2&êÕåÛ22«'Ÿ)ýìôÝõËx÷êOW˜CgósóLÆãoPÆ„ÿ–çáÙg¬ú««·o1¼øÊ/{ºE<•ô«úòê›kYL˜ëùu­ùîöõ+,¾½Ÿ?iJ˜(ƒ… tœ0QZ—W¾¾zõú%֊̧·ÓÓh4ÿZþR ã;¥ Vi?9§” ÖOÉ¢r‹GÞ„}ôN›šü´OÁM)xç5jŠÚî +!$gÕ¤|©t^-W½¾úÛ§»?ÜÞ\•=¹{ûU^¨ÖNSþ³d}ùîåÕÝo®9ݹª”Gö÷·/®^⹊‹——2 ’Ôüg)ñõåÝ7Wo±¶o_¾{+Û/¶V0{¿»üîŠË×”F>}uóõí?HW“<êòõcðWòa§¢T¯·EjÍŽ ³&ÖÓZsþ–Áçw×ß\ß|ª-&Ë멬ßÞ]¿˜Hл˜ÿJ÷1ϵRIO‰ ?îI’Ÿà±™•ÕyRÃúöíÕMj,ø³ß/–ï´ÿýWüœól¶Wœá7Bi°po°¦±ƒJîü‹ä¡Šw¯Ÿ|òOO>1ééÿ~wûöê j|yµKþé7w—½â~zþîî›mZ”øÓ囫§Æ +¸¾ÉO_ü)?©¹~ýæÍ?}qùÍ7Wwå/ä?}~}‡å÷ç—WÿöôõÕÝÛooß½¹¼yñô«ç—w·7O¿Á–º_^ýùíÓÏϱ]®›PŸüsõíÛÖ¤­¿ä¬?½ÃÓ·O¯n^\¾ùöéÕ+ùë-ˆÃÕSláWܳ¨ìM×h~ùöêé‹[zlÜôô½¸¾ºÃ¿Ù=}óúò9†ÃÛ§ÏßÝÝ]Ý<ÿ¿ø§º»ýËÕÍŸ.AX°6ŸÖòOŸß¾þ®Ôy÷âÏW¯®o®oðzÐO1þ×Ï/_Þܾ}úíw¯¿½ºyz'ô/¾xúêò9»…aÅ$=%)Ä›ïÞ<}û·Û7ï0h×·wOß~{wuÕ~»|þîíÕÓWï°ÌSyöâ9æ_j{~õ‚çjÂ6oo C¯.ß<÷Rz#3ÿ÷»Ë;¼Ã~{ùòϹòð ¶š~z"ëUäO³y’Ç÷¤}ý ?àéÉùÓ³Ò…§çòúÓsyµœ/^?oï}–K}–›ølQæ³Væüí·Oÿ ¢šÏó Ÿç>_¼ðyîÓçí½Wï^¾½~ýò»§Ÿ¿yÉ5ñÇúAÌ/ÿqñòÛ[ÿ+g~ýííVËÎ,µ7O/s×õ{.o_æ¦/[%—2—WOŸ×á¸Ê¯_åÚ¯æ—QÕU{ï:—ºÎ¥®M\·2WŽ›Üàm.~[ût»xá¶iクþë5äÁx—_}—[z·êÏ»öÎw9û­ Æwõñ“O¾>ÏTÖýý³¯ßà€Yœ+晚ó›ç·de>Ý=[óûðOO»O»2eÿúÿ{"µƒ¦Õº3ë÷õw¯¯Þ»7äT6™—¡W|ütãåG÷.÷äºöVÇ[Ùðx-yñÙ/ß!ó·w·ï^vóçÛ'Ÿü*³µÿpõœÜÒÿ¹z±ûüOÿŠ_À  ++³ûú+ðæüÞÊ€gzýë*üâååÍåÝN2ðn~ø»kþ/.Ñ«]~9,xõöSçáêÏàÏæWóÓó›¿^½¼}}5?ÏåÕK¡×ø,é—”éz|OEÖcšÂA{·è£üZÿ~Ìû¿#Qíº Ï@Jÿv{÷NØ,›ì¯þíê¡¿úËÕÛçßöu–§ï]ë—o¿…D€còMÅüëüñ\ùÙc¾üìG?ÈÈëo¯ŸïNïÞ½ùv÷õííËVûF~ki™'Y|ó1~õÝ«?ݾ¼~óª5³|ò†çúùË«¯¾Ãñú¸•F6ëîæó›<>ãW”ý€óÍï|¯Þÿ´­µ·¶ZBæ¿§VÀ3rd¶ÚXgµvÊã°•:É`ƒ°y¸{Ë|õ·Kƒß]ÿéÊaþóõÍ ôû«w×o¯æ½yûê5• »¯¾½|}%;§–üj®Òñ<[žX¿ùÍýg¤²Ó›e‘ßÞ‘)ºyûéîW¿Å‰yu³û’‡º¶ühؾ¹dZü§êv÷wÏNÁqÿ7<ÞúQ‹¤ÉH²]rË„¤é9…EJ«t²H§’ÎäÿCIçòÿj¼(é|Ù1µüÑ‹dÉ®’Còæå_a‘â"%¤“òç‰:]¤³–øïCûí€Ï‘Hçêb™–Ã'Ý«?f‘œ¶HõOÏôä“ü·‹”éd‘NszòÉÿ{lNóMݬr6×ó:ί›,jìf¹Ì±Ãœ.g9MikžÓb¦ñ'j\Î9Ó<çL2ÛuÞÑqþ™¦Í9‡œ/ó­1ËyæÌ8f»Î:R?Ûœã(³<Ït›cÔÈ¿ÏËÌ®g³6kd.mINgŠ3%åÙŠœ'Ìiž+ÎÙYIIç%]0™2!\Ýœ*™-[Æ?–q=Ë#VÆÄÊ—òëø=éµ*½ôÒ£®i÷BZ1Æo‚‰&™S¤ƒ9ÇÔ+k¬µÎí Ò™=Øs{á4HÖy\r'î éà°OÑ%…·Þùà£?A:õgþà/°8 º|!†NÃY8„ ,…A²ÑECLñ$žÆC<X8øöd’M.ùD­Îi:Kçé¬N :äNÂIò‚‡ú„*“žå9ÊØð®Åd@d0ÚmüuMK™)¬’_¤¥f«\†M!ù'óü+‘xÍ-¤ÀJ:Š„˜‰ÖóRŠ<[I—§Ì¤öwìRèS‘e]“t\'óÚ&-“ÞHå5.¦1Í’ÙBJ;/òÛy“ßË™=JI¯Êz9IéhjšÔºäïM½ô:$Ñ[äÔë7JfH²4P£~dÚä„7&ã‡üÑÿ|5.ŽWÝ6ó¿•‹?””ù¶ª ©;–½s*Úìê,§W©½êcæ­ÐïíÊûžu©ìZÙÕU‹Põ +icÏú’æ;ë¥f•&kñð>å9Ù6iÑ“dMÉboÖÝy£©êXÎûó´éa¶wg¿S›NGt8ýnÝ~-¥{ö+Ï{ð{ìØ ä°7EsõÐŽ=¾Û^žõe¨q;ïûíèúslWÿ ýïaWazO‹`‹ ì„Î\KåXRáW‚p+:óƒÂ0‘#©üˆ/B¥nâÕEãJD\p%z%bQÈ‚ˆõäY³²e(d‰ˆ•…¬3Ñ:eA‹¢V´L´(jAÌ:A+fAëÉ'"l)Ù("Ø*ˆµ²°EqKgqK®C¸NEàÊ"—‡ÈER†µSÄ® »(xeÑëÄG¿œˆ_VÄ/å.°­¨U8¸"ÿB£Ð,‹BÒ‚ˆfJR¢:ì rò‰e'Ë(˜Uь™6ã›è\¸ºÌ×I¢o”ðwäð‚pyž/þ¨JÝ e?4ª>óq3 ϼš +¾¤Ý ª-ô:ë ª>7ÿ½¤É~A…_½µÛtv ¥+ÎFÒ&ƒS)bMKMù1:wÚà'~ Õø‘wuEsZjÈ–?k¥àBÕ¹ÔÉÜ#IDUDÚ9™UZëü\—ü*XiC§eŒ+ d*‚ó2ö©h4—é0¤ñçbLuµ@.Orµ‘ôf2›©jÇäŽ$45}2j ]Š÷¦ô@KÑéµ·Òé#“P|ÔxöÈtx\BãÓ­©|tBÇòÞóg8^ßûg¡ šß«‹%§ªCÍ'JÕ¯†’ªþ5•T´³¨1kkëO%óªÓRémÕW®¿jгÞë»n²ñ¦¦PRl)•tÒÒéÍÂOÓioP«‘N­(Ô6mZÛ)V4é5:F…–”çTôAÇiÏ=4gEc +]Úq³AY¢(¨ñ^:ò +ÒQ +±r5ªñÞ”b±ûÒ‰GR…‘ܳ«ïO?á®þ^jÛ•âŒÝY֥С˜¼˜±Øƒ`½ŒÉ&‚onFã 2®.†c'¦ãÆ“æãS1ŸË¡“ ÈFXVç½Ç#Œl*¦d“ÏÅœœ ʆ\hpbVΆåa•i\æfÊfš˜ÉŠ™ùÉ'bjŽäÊÅÜ| +òthFç \"9Nž³éÙ§ ,|;"Fè3óbŠžN°cÀôkaþi”v´{‹išÆéÙ< Ôç²0'1S“Ç5b¬¦¹š¼{£u„è‘Ät}rz*dò &ìsY´•W\io¥º•ÚfJ[h,èm¥®3U­Ôt¦£3õœ©æL-—42SÇU\QÙ®y²%µ[S8 hÙLÙÖ´¬£^œÑHŸ–<Ï6_sŒêt\É2¡Æ{¨ÈƒTã±§ÿûïꪧë×"œGí4þåwqÚ[ì]0{ìÍ |yö˜²§o6êdðÕÎM»¨öýñ +û‚RÛ^yȃSÂnÇ_Þ¢˜JV+U€f–”ã…\ŒÚ8¬BŽÃ“PA‘É7µr :X7¥ˆ6UiQïÍäìܵŸ´ÕüS@ý µYüïCÞÂy$‚+(#[Ã(OA3C«¤IjLÊ­°TmJò‰^>paѳŸ@÷þ³v£Œ„KÑbèŒI Ý` ‚óPñŽA¥¥ò„Q‡\n&gr˜kqí¬ƒ-¦Æ~‹Î“RëUÜ4¥å@üŒ½ø‰V¾{~›.¤Ÿrù÷MoQŽ2()íÛwŒl¬K±žÓÃìK[Ýa¸È~~÷üÛëôŽ-ÿBÅzé»÷^5p8d8œ¬OcôFGy°QUÇYÐÂõLËëËïSO}ûêwCí9Ȳ¯z7Ô\(2FBMÓr°>TeÆ~Ôê9—Öïq ì#Ö­|ÏóÕ_¾ãrá_xÙÖµòß +³³4È›æ_QÙ™ÔŒóg…i)^…1±ÍCÐWœ‡*VØRú@ž +;z!zâ̆za@O„õ<ž„®x@F°˜ÔF6ü³¯oµ±Èd%ù¿iå¤P+ŸQwWñÖO¯Üöw ¡xe"ñ"j~D‡…B;{e¢ìQT|ŠD¥}^¼ŠÎ\sT¸ß[ªùJ=ÒSªw5h¼ø’¯®3³óÌùíÂkWšÊ_§êDsh·p¼Íre¨Ùé–.·Qn))QN¢£-e£3¬ÂIl]q¯=„æÿ‘G¹¹#TO¤•/SQwOÍ&f¿¬ÀEQm‹ÉKÍfœGz“ÅÇy’5ß—jÀ±Å©DgÀâùw(Þ~ÕËo6ç¸âË—}ø&aÐÏ7‘…«us¶ÎöÖìïaš¼ëDæõb¶ˆ%%‘³Ì„Ùjp!²ð, gçiÎc–ˆ³LÜKÅY.Ö2»”Œ)ƒ<ˆ|E>®ò!KÉb5P½œ,×I\®«ÓµHÊUVÆ.[KË\%Iäå³¢";oîØºÈÊ®¤(Òò‰HÊgURÆÜgYÙ'mW$åTÕa!%+±äd ÙŠ„šóv“!G²|Ü$dµ)#»YF^Hȧ"%‹ŒÜˆÕùÂåbéà[œTúŸ·¯Ÿ–w¥Æ„2£¬ ïËßùïæ@£›É^×Àq³™CVjàÊü·YýmA õï¥ãOvòÍ´5:Ô?k°C yH-ìaüCŠË’„@Ìáç‹Ð‡9ða_q-ð!«ÄæׂT$ìàlvÐâòeÚÎóm×å}'KGLŠsXÓµ•ïïé†ïo(^¿³Çoõô->¾™JTÓ/hû©œ'²Â¢¬7_NlÖ2X“¬Ô¥9ødaöíD1X×Z†º†Ò½L73嬴³QÏF?+\¡¢ £O>)”tIK—Ôté™»öÍ]{ç6ÿÜ'ŸäÓT”$£‡î1Ý{¼tå4«Î}ïåÞ§ÚnÞòÐï=ÐïñПõûEãæ¤ÙÖ^éÇ=Ó¾é%-<ÓQãýÞéÇ×g,–’Î/+{öL_ú¥OmÍ^eÙ¡8-œ ¿SWo^¿Ih¥¬b¬ì¼’½PÒy=›â7™‰@öø©kû¼ ÙÙÂå!¯s$¬ì¼ÚCYñ^˜R9æò–•­Ÿ M¶Œçp.»@öAsÙ²Nöñ(}Ú¶êÁŽ1D¬lF®¬£(†(¬Ã!–¥‹²ØŽhé£ZZdËFÆݲŒËx(Âň{ôv”ËfœË{è@ïÍtº°ŸÍ{i¹Ÿ»jÐLî“÷Ô“`§;•lI.NÞñ|ÉwT­(ÐAÐA¨H–*¦I…ò’pd€Oʪ)³P?@ ¤¢1QÉ¥´· š MÈÏÚ¬N*PÁDч*›‚†œ&Ðvô¤hDð|TÇtj¹YÕä÷ŽPOó—~Ðfò—‹fòqSʱÔ&@°ÇñVÕ–ö³öHá¯*žš† Cîz ç÷¢Ÿš¿ë'l´èíÀ$[* }4Nt“3‡ N/Ã3´4)Ä…®p¢Š×êd-YqûÍ®ÿs`î>½ Ľ_.,ü©ÄÍ’aj’áI• %Wéò!Ùö©øçª\I"ÊHŠˆf…´å ÍÂOeB +Ù¯†­ì7V<š›ë^­œ¢È”¡¤XR*©0Ͱ±<ÍI¡ú©5ßeás2-¹–æŸÐRj餥Ó9¡ÆêºÈ4;o¬uKïáu „Y$>H»¶%·JãOìRÚHàÃÉÎŽ¤Ã=©™©ü;â1D}<˜dAC*Ð?FBÎUÙÍ5è<‡ç ýóÊ0GOyéÔ"n*ïKìÀ¢R\FN‰4xQd@î±ÙË`ö3Èšî[÷ +õ)Ø/'%4ºØIôdU—âËzŸõ'ÔžäUlDêqe}FYüÿ kqö0àŠ¢¾$ß‚ѬÉ<ŠƒnÕ–¸¦¾Íº’Ù«àBô$Ä/´MK’½ Ró%8¥.I¢ž¹jI¼p×äµOEO"^EO2{dMÉìI0û,u$”–> /Èk?¿ò&˜ý fŸ­æ£µðÎÒ%|>{c­ý°–qÁ-nya-½®š¿U‘+_›Éjå‡+ŸÜ{rŽS /©??zKsÏ<¦æß6dŽÇøP÷¥ÚòÚ<æ±yoª:µŽP¯±é³ã}ZÄ¢×8ô*…ͱçS "ùHFrk>Gï‡ZXe—9ª|O¾?ŠÔ1K³l±”Ñgù|)™7¹|)˜µ<¾­-dñN/’xñŠ\Ëâki|-¯%ò¬Y +M&‡T®¬Êå³l^¥sÝ¢§…Œ~±ÔÏÛfjAð µñù'µ[šµùv-Ù9¡F³Hs¤¥Z¥¥7üÚ¡f)ˤ‚BÎál•N‡tÒ¥­ÈÕBc×ió`ÍÛñÔ%ÔèŽ$û½“mnò#¤÷B(¸£@{±ס½#NÁ:ÀwU°D+(8¬n¿²ÂÍv¸ÃJºÒžf‹\³ÉU«ÜI›çPæ)«îÂkΞAê‚l̬A-:Ôó€µ(àT¶B*–©rS­”YŸ:Û)×–Êj«ÌØÞc唜l±œm–ÕjYì–¢o=‘%EëZõ®®ðòFô¯ÚîP +zØ‹" ÔÓ¢“=‘…:^4´9\'ìd)D à£&ÑÚ^HPv á99æT´¸'E“[ƒy–á<¾E¨1X•"-ÕHê,E­ƒ8…qž‰N¸ä¯×¸gVõX0÷œì*-A·Þ=þŒñ–Ç"ü6ŽzzÔn„ïô'ŸøØÄµÅvêÇá&,~£¸j’2&{2MdØÃDd,n¥'±ª“¦é=Q>PßSWñÇ››ËWW/vß”G;E½ÅÆÓ¥/о–uEUU0>v ì`;`‡³â5QàDÝ@‡ê¬`hðÆÚÚñ&#n-ÍÄj°í³ë4ÈÃà“¡JÏMQ¸øÖû“ÒûlÔ¼XˆjUX›¿âT ~‡¦Fy¬c¸?îŽuܾê={]G]/z¼yôZp÷ŠÚgç(j- ’mgv#Žìe&Öh]èGÃ:š1€>0vÑ/½î{½²pR4Z¬Î“ê'• X<%´ŽvJÚ:m`Bvºô«Ÿð¨'Û4ùçëivöÙ“GsŸV0eŸ¦mÚŽç¨ÞõÔ] B]ÎÄ9ƒô$Nâ™Ðn#‰¤  Y…>dǬŒ‡ˆéÎŽYB™I•ɲºCC@ôÍ1«¬¨âžE盦"A*U‰ô䓿t“ÕH'ÅáFÜm$4eLq w›˜’CSÍíLDQ*e¬:à˜"ȹªâÂ_\„­Ì?E„a²Š–+û_@çØ«˜DsS€’ÙLöHrëTDèíä¦p<‰Ù|;Å÷KYàqiCS úÓ/5+±àa*·èU9/PbF\²–¬Z¥‚P—¬òVw•¥Ã]­îŸbì)¦Ìý-‚æš+`u\„ÊAð¬.€5T®ºþÅâúwZŒçbvX‡ÊeLV_TÚâuºPmÊTÂæ&XÐEB´ *•CèÂJ“Pc£]9ͪŸÃ’–eG‘5+—–*'aµÅÙjNæžd»ä†$Ô5ú£iÃ*t$ͪ¶XÜf¾Oô^ë„(ñ}Ó£k|ôjü‘þcÔøEYÐÕĤÖ@}‘pªtIɦH– (g"ÓP¢qÇ™\ËEs'Ÿ1œ[nq,6Å”{E©4eIUÖá·}®iT%Ëp¶.œ‹—¡¸çmÉÔE5(?Ó”©³"Vè (JhÔ¦þÌËu›Æô”fEq2µ¢:S§ì^Q ÔQžN…~?U:ž” +5ŽÔëþtœ¦=LõÞ+ýRãOUã÷ŒØyôϽ5Ž7 ¬µ:a¥Õ)z(ÁwÍZHjƒZ­0©YóTù¦ê&à‹Mœl2çÔ473fýÅ +³>‡Ðœ—€‹â`Š3‰HuB¹ÈÎ%O>'€ì:BÒBAù¢/„ó¿+Þ#$;Ù’È€°L¹2G”i”TŠ’ÎJDǦbþÏ©îñ:§•€UcÞ,y‰´%àÏ Éj)9-% µüÒs·‹ŸâØH#þQ¶¬O÷&]°÷—ìcRq‘~8ùÇ&Ôøè²ÿ™j\(åšÚ]˜ u~q~D¾ ÔÄe> >/Ø{“ îŠ‚Í‹rM‰bjµTL‚¶`ëQ™F#àŒ¦—C&‚¤—%\EÐ_ƒ*ÇÎ+Áeà(jHÄc`Ê{ òU>B<ù¤çªa®åL ˆPÍwX„Eœ\5¿¹ aD'®‹+àÔLn³Á­šÛfSÛlh[šÙÌlb¯·0±­Ìk½q­7­1ª=ù¤3«3ª­Lj÷™ÓÄýkÓœ¶eJ{„ñì zÿǦ»u3•;_NÇZClØ5ýG¨q† ú…¢üBQ~¡(¿P”Zã/åŠò Eù…¢üx5v€j÷^¤ùþ™â+°E£M!LØÉ‹yÝY3áωî.t’òNùð‡µÊX ËÃ6çvŠ´ M4ï«i»÷¨'ŒS~Ë}àcêUõ( D‘2;§öhíʯ Ëjo ÈñjO†±{¯`p÷éj¨ØitmÚÂV }‘¹†¶\!–ϸ7„>â ¡é aÞÃúì´¾NgÇS=kW>gï“ZM£›úɽv§ÁFÖÀªPuššûP‚œ|ŸúÓå}›aáxÒîÌXÞ¥qÞ§¶¦%”Q]k÷d´Ùéçm1ï­Lܰ +6Ï‘ìãç»Ãêõ\GkÝ2ÃÅðÐvèG)³&ÁÆb“II£}0Æ‹ÎØ„ä3­#ƒgAð¦ \Ž„ +*–½ž|Lô=•ðáŒhõäˆ÷ÖÇң܂VÖKlªD…3 b.u7 •«¾O NÀyq™±èÌ€†T0d>ÇùÓ‚t(1ü9^_Ç‘ì6rR ט…y4°¬.k ˜¥Å7d‘ +šµ„ÍZ~è¬Ð¯vÏR üªw-=´ž¿Kú‘=ùx—ô•ÿ!]º-ô¡šÈ'2Ž5«-çPã\cõF)¼A¸•´oµû% Îd—ÁËîþ8õý` +·I@ì¡e*b½9`‰XYèÂt×¥¸¸« Ç_¬ŽOÍÝ©½sÞ\ÉgwM½rÕ Á±¦îhv˜0²¿O‹‹„‘}œBkçÈmÎGPâ~Âw–B‡f…=£¢¹Uôõy½@ý«Bou¯Bë­ÆO·ƒ· ¶±+¹(»Š®V‹؆›VHâ çª\2a¢a[Û~ÑÒ©mÙšjqÛç]›'k2Üâ¢;R\bp% +·Ý!D庣ºATëksª0žTª'ôÊ¢ýI®ÎK¢H7¨åFÕ¹©¦Âþ¢êãbs¨^ê‚õ +Éê¶{mqsÊìfYSÖ¸°k +8ÒÀ¢pØ@?©\”^…‹,?–! Gþ…SjX9£žÍ.î›´v‹Ú +žáŒ|[oˆi®¡K'Ï>üféèÝœ‚—7×T§Ù®ÛTÝ t}v¸?]8¿ž=Ýêë:\¨©jÚJY†.Tç;q½;r~¸á¡[(…8Ô9q¤;:#Nst•;÷8+Îpt€£»›—¶$Žjt@£ãXë]Á ¯¦²ÕtÓtÑ4_U.Õï}YyÁß>ý¥w?°w+æ×Þe¢5ÕA~*À~‚úEçx%7{xªV¼OóÍü–6•‚ æéüï1Of@Çsy÷ÍÇÕ­Âdƒÿża·)°Æˆï¨„7*2€ˆØaˆd¼ Åk%|³O$*Ôyé‘Y]ò¸'­G^ï!,/¤ù˜zUÔƒ?«Õ«vIíÉç|4Ƹ®[eEM“FK§…㇩âU9wÿ”Ÿ`•ëÌù1Jò䣞BP¹°n91Ã¥:?Ù–û>ŽýPÁÑnʶ·âá¨Ô;ÇXá3åW…= „ÿ¢ÊñàŽÅ{üLŽÎ|ýœ)Ï‘-bìcU7ŠºI‰º©BÃù•²©]-·¼Xn}Qç“OÖWtv—s.qã*g„„+Wϵ+9·~6ÐÜL¼7ü{ÞñøPújlªjSî}ɱd9î"G½Ç,¡`–8%#ã$ dïÍ#3xdÿO3ðb]Ôå‹P E+ èE‰²Ð§j8¨ÄZ€Õ¨*Â|7`øÌ>À³âˆŽs(Ãb)õÀšÇà27’ÛLVt†[É¿o’K(Ôôýklk$zÆrÑK6’„µ³í åó$ÿÊÏ]¹Á<ßVnÛ=å¦FæÌõâOµ¸¿|ZÜd¾Œ'z\ÜÑ{ýüRãcߘoiš°=Ï üEl_‹­ÃÏOTãýűÛxKi]¯†{ö9-Å &5)6Í@’)HEÀ:í<Ò땚…V-.ù±«K~¢yùŠŸ³CuÞðu«û>Cöˆ²;cìæ‹vR3RVÇPôVçr½.5U¼D.×m76ÿìŒôªñˆÈq$AEPÖirÖBÐB@Úºj5¶«uJ:-ÈQó:AJ0¤¦†#µÄ§›âQ¤Òãý9³îSsI˜¯¨5írÚ(È]Y[~^´åYWÅÜ|&r%g‡.S#Þ ~~FúƒÔx¯HB“Ç÷A‹™cLÖi¥êõÀµÅf­"½Ìbœ/öŠ0_cƒS»Êfy™ÍlÃX[1´¸Îšf»¨V‹X­`­‹m¶&H¢1ì´Ý‡õ—}Ðf~¨ÁÒm,]ïë¾é¶:º¿D»µKöv·úòfõå½ê:Ü ¯qõO]þœÿµäH{ͯè‚Q£íØ¥úçšmr•S]ßa]¿¿;x‘¯;éÓ9ß­’õ¬é!Mkqq_Þît±¸ýv¼Ý)-î­]ßïdÛýNèÉÑ;žÎVA™UÇ—ùñ>@‹>MSÀÚQ1‰G÷¤#†s8Ü5g²?÷4läåUJ/=¼{¬ôÓB¹4TCžæ²Åb7ÂÚñ“$b2¿¼g6ßæ9„l¥Î}þˆËûjàS†í0÷K ™ñ_â`~‰ƒùãÓ& Àãª7®¯ižî?¾Þo}^?j<êf’Å–šodœïd<-·)Ô{c»—q¾™Ñ–Û#Û½÷çç9Ö{ãƒ5Q®°î·Z/öc~èê ÛÌm¸Ûnõ½Bji<\¿´ŒÕ8m¼¾U{Ø« “6ã™ï‰b¾ÿÚ«{û|.³\î&püõrr”¶â?,n¨^_ìÑ.õxòIßÏ*Óª.}ÜåBë«…DM*,è‰Ýª 1-vK¸þ÷ŒÞ*©¡5Ðê^UÙ)?ôÅyƒ‰â½¯Î¾~ÍŠ»íT.„©šùR˜zÃ,´«a ‡$ ߪ’Èy“E¼¦»¦(Þ»ëÞ'bnyúy¾lá}cæÖC‹K«¶€§6Œ¾çšxüµ„Óu1aq¿îWÄÅêÞû~E+"˧v¾ÜãÞ5ñðëB¼~HœbOÙî‡~¯HÅ“ñŠžùž­Kl:ÀªO‚¨rÄOXã–áw©·tÓ|9Ãbu£ÆCGñ6%­Í+Ö4”ØÐ'ŸüÀèÐãCçèP¬²÷Ž-æºÓ¬!í9àT½Ðžì| ìÝLù~šßMÏ*¹âÑºßæc[=l+tía¯ÅxgÅ‘Ø6øÚãl×ðµ%ª<ÏŠ+͸ų\âJ±ÊÞ;²T¼ÊéIä‹79ýȹ·.:¹° 6÷ËšøeMü²&~Y÷®‰5àäŽt8"H~¨&>¨JOžýáö拻뛷×7ßüæ7KÀ2çÉ'x-y&ç}qùöíÕÝͧ»_¼üîÍ›KêÊ¿v)í“׉î +¦ÍN[»Ÿ’ I2à;wZù=#“u`ilÊ_p’ÿúÇ¿•_¯ø÷»üK™ü.ÿþ÷ø÷¿âéß0D»ßïþé_¦Ý‹'òö—,P{Ð7´{ÅÜû³ûÝf±ú=¿[6±ùp»ÂþñôäîíáúùÛëۛ˻ïvŸfåÌÓÓÛÛ—ËÏʸ>;qýööîÙéåó¿`ôŸ}}ýòêÙ—WÏßþz÷_ùÆÿÃ?6Æ)ÿò_ÞåZùáçy…jˆØE2uÎè¬4ŽØÚpµŸ”Ĺ[ŸRÀŽ }¯°É~iv¥ +j¸¡Ú.tÊ:¸Ý?^æ¬çÍ(µŸŒÇ B¾ã¹sqo þ”iÁèéàQ5 ›dç­*ͤölÆŒ.‘4#^]ÀܦÀìœÛ+ÌÒî¹TÝäLsæ”b5z韛fo5v%¯ážLØÙ´‡Üä‘á÷ÊÖZãôΚ=h’®õ¥ý m8),ƒÒAº¤[:î1.O{—0éšíF¬û°Çˆ©RM°{Hx;í Þx´š•¾&µ3:3èf‚ŒDGíÁ0@†(Õ WQ40 unB_í>*´åÃÌ=ª£"#):Π ƒ¥èð‚ag3´‰u°ü„V5ÃȤˆ1ñ{^^¹Ó|ŵ )o¡>µ7†-ýÆím«Mí!? ˜Äi +m´w{Ú_Ñ»z˜2PìÄÞù½U]¦ÊÂì”Ã:õ¾Öç÷ Gra[w쓊I>ÊžŒ8Wp +íÐn´ :ƒ5 #ˆÅ +ä€jõa°8c¿Q{|gÞÄýDOT“¢g¿,¦Ÿ† ôÜ{Ðo¬O 3{ìWêÁð\0vâ‘v*”Á± é‰@À LªÆÊµNž[n+Œ &MÖŒ‰©®0C²ÁTøœk·ÞIíž×Ä£“ŽŠ^cóú²XŽÎbJÜÞGS×—Q{ü2¥"ùíœßSÙŒ×Ü'_³šcå-žÃÇ[ 6ÃD‰ßytŠK4ׇݦ´ßO¨”(Sˆó¥ „]|+ªñôòÒ €Cƒeïy˜ï0i»sÞ= <w^´lÄ©ÉìÌ„¡I4š­×»h÷×%È›±9Á”†Ú{¦Th€d™ö ^ žf÷œ˜Œ-&Q½ÃvÂÂÊ»^èQ§tÞ€¹>¬PŒ±G. õŸ$xîF¼=vRÄ`ƒ6b8&RÍ£4Lêûs¦¸‡¼zã”&p«Fì Ô äæÕV&vã¼eCƒKÞ‘ˆ`KqX´ 7h¬áUÖø¾ò¼ì|SâòÂrG5¿Šdu˯µð618“ÝPö“7tÈëÛ¯óF]öz~­ƒÖÎöØÌƒ²¸× JLß`ö\yøÆ\›7&[Ør€7ÆŽFXD)Éà¹4 –lhe]a/aB‘‹… +²9¿fsGõDFW/ê3JÿJ}}®ÞƒÀºR{0[ý+¥¾þ³Úký@´†ŽŒß<Äÿåüó߃+ùìͳß_‚1<»}ýݳÛ? —òÛ»Ûw¯ [²ýÊ—W¯¯.ß^½x†Fzþ%í~õëÝ?þÏG²2XÇ ÓZ®»I– ¼vL~á7C»6#ø“‰j6p NX˜¤Vn™›,LP+>§²06îCr`H0¨ŠóE‚cË.s }D³:6¨H¢‚lƒ X>Òc Çoy\#ˆ-/€蕧;“Æ\!êhî‹\è^~-Ñî‚ËÝ2Ry#××çâ|`¶£'M”“K“Åy 9ç>:¨|)1¡ïX/º=ù 4H$ß¡DnÊòcE8%üä7*ÂæÏMr#˜Ã)òÛÙ¢8Þ‡‰Ïícú\-BL†Yˆ<Óø¼ÎÝ@ªqdbº ‡aJèý.j¬œ¯¶s!ð Ã>Ójéí¤À Ô3L‘Yâádg ÙëYûÇ}-Ë)7žàó`Ó¢™+2JŸæ•²ÊUXÁ‘}êÛ™2imš¤vü‚VºÿæVÿ‘¡êéÊ‘ ö 6#80'®+>F&ìjG¥Ÿà\%—x [î|Yú­p£ÇΑ +OVNä¶la fÓÎ\ÓäqØYJ>®Ä$ÈZ®²·…k²{qh‡Èî œï<·$9â |2ÀÇXqГrN` æ'K^BÉÚ>{‡`¼0O‹)ÙÍÓOƒ&ÈbÝ‘_xµËX^¶@U”,<*AÀúX~l@_èÖ 2ðÝÞµŒvt[9M¸>1&í5ËŽà›ECCFéßóJ+Ö¹û|ÓØæêþ•ŒrõŸÕ^ë¢6tlü)Kÿ =*z'Oš!¬êµŒC3ÜQÙåL¥Æq7[ðÀ—u¥è*{oeÁ£¦´lx+ð©Í‚—Õc!«Ç&êRÕV`¨'1òpk [ƒØ¨žŠ ­<ò#¹ä£p0WSž 2ï .Ѷ·4å ’ùª‰'e³é) Ö4X/† + Õ¦Ç ì¨µ)OiK ݵ…YMyä]Àô ï‚©ôÍ”'Ç?FžÇ?U+Kž08eªì! ÄE X5àÕ‚ »¹ké÷‚:ú¹J+šœ(“èHÜój·St&Š©"ÔÚnÇ\¬~AŠ›Á ¼“f§Vv6•Åž˜ôל nû ç·èRÎÖjpCöDäJžV(쪕Á µd*„Ån9—Õà†´'¸?¸zøšl€ìE°Œí_ÜÍ!5;Ù_Ê`5¦Ä4;›Š:ïMÈ>;zef#ÿ‡ã„ªmO}Jµ²)ˆ€Îa…:ªÚL3²%3#_(¸ + <,˜ô••mÈ­¦0®Ðè ÀxRƒÅb¦´\а²®‘Ãÿ=‘ÃãyÛÊ*Ú®)*Ðø©gÞ±²n¹Å&6´ShµS+“Ûðsé~Djýdžj} ChÃ$zž$~mts‹-Œ'ŸI®Í ÕæƒNNÖp¬lmkŒ%£8©P·‚-MXFpoókô: VüBp^ê]ŒÅŧÏH‰=jªÿ.—ädòrƒ¡MlT$HNNlD-Š#aù} cL·ª è`…Ú÷%ʈÆ} ¨Y AO SMj¨u#Žªšýb aʦsð9´Ú›Á3ŽlFœ].†b8aÁþRBw¡â•@¯£©OrL€{v$²š + ::ZÖŒ },QÖ踄3p¢ÒX‘¦ÏÏFòóþ šŸ‡dâ˜D0fT*ÙÝØuƒn©»¥6úÝ—( ô0T4Žuß™g㣕nßêÀ…P`pš˜#ŽŠÔŠÑF–l¢Ý5E¾o°“`qz{×EÊã=©2“æêúé}Á>^‹Åȫљ$<ñD9c2Å‘*’uóôFu$¡5Õ¹7ŠPJ‡W篿ù9’)Ãê„)K4öÔ;Ú%/÷™ªsPñ|¤l7%s“ÒdGHžäy0 VP²|!É0RçE¨ C‰yÛ)’ü&8Wò›A3ÜzpD‹{:7b¸HhG7IZ/0Ð<À[4gÐÞû‘ +LšÙQL3 +otœÄdã+'”ÀÄ™GJ2T¸‘ˆ³^| £;xUŠê"fŽð¿[î•´{DšöDK{ÄÏRw,Ü­½Ã%}­øH=/•ˆJõcŠç¥è÷©ù¢~?ˆ@Ùy`R”‘ ÝÍÔ†+¦ålcg@FŸíâ˜[ùd‚ï•q÷w}3ö‰Ê3.iÞ½Õ»iŠ5‡'ó]³gMN&˜6Ðø½ã&M +˜hž†¢GN.ŸÉÒ\±xv9î}9E'GK4ur¼7kpêÔ“Á¡ˆ6ƒfôîCù‘ÒdÀþm[§¸yjqX£V€Ýp÷”  CŸÞÞqE½ß'›AÓTA!1 ôíý7©\AÁ‚B¢¦ÅÛPKÝ|ã:ŸP­©·%ò½ 9Ρš,UÖ +§1z‰Ò‚"Ä +kœÝ;â.J$ûF$¹µÑo”Jd0™XBÕOit ™=IùF¦õ8T¢RÛ.¥<•¬ÅDà°£SÊè[JSq´Ž¥ô)Á™ˆ!WŒ”Kâ¥A¨p„ŒÜtc‰¢ÄŒT³Ó’Bå÷F1pràËÉì‘Öv£c‰îcJS}1 ¨hÀv9aÔ‡ÎXœ^š +SªíýÆGuž×#c2¼ÝæÐ§å‘’óÏï%OßGÙ”Iì#îòô_‘ e„I™»Îož¾a¿ÃÊŽÙp Ç.£ñ'fÀù*tžôâs“ä ¦ÖWžó<KŸSp[L©L7ùØ#>ö`{s1ôŽ_5úØcK š‹X´ò±JlûØõ>òZ¨¬agèl°á…OùJ寚¨E9âlO_á„lÞuÃTjúM ÷n¨OÝ(ѯ‰‡Ýð5ÕcZøt%°†ÛþøZSÖ¡la"Ê£cþ [Toø!cÛY|¿÷¿û0–è>fÛ‘_dLe“IËÇô¡B<§Åª +â“_>¦ÏØöñßxСÍÌGëþO>§)­ÿ“8¥m[†bÕº0øTë7­5=q¦ 3¯¬ <…1Ü´Òš„Bͺ@¸".—'0BLͺ@û\öFˆØ5Wf†Þø_­ ƒí¾š è „’ôK¤z\[h" \ÒFNMCµ)ÔßW¦„úp° ÐGÈÇ ³€x? ?¢8sÄp@“v°ÔÕ8žëv£¢a{ÃÁÃó¼a<öÙH÷ÔèÒÃÁX¬×Ú‹iU61x<Þt>èûùÀóÄô<^ƒ>b8S/•¯¢áô[©Ê¥`·ˆÕtèÌPbS¿Q¬Óäé­ãWmšÆá+fbèÌCsu<ìág𓲮ù| ]¨éZ$ZXª¥Så°Çb<Œ9R`Ï‚„’Ùâ­MuwaÈÊϪ¯3í&Ú…|CK4Ÿ*|Š£½býöX4Å–ŽcOºüîƒÚÁ¹*”h$kB º|R­»ž:9úRù¤¢øŒõßÓ—h>]«që†vèËCsôG^hž"žác ú +Ye?E)pWS•v{q;·:q´©©ÒN&PçjÄÑ +ûHQ›Äó—¶ÐóMtØäûpºH˜£‚KI±‰0ÔÍù‘ úÊZƒÖ8ºô!ÓJÖè’Ž¬"ÇàUÌ{>rw{‘xr\/ŠIŒ£‹ù¬Ðt`Æús®:àSS­ÅÝñ¦#bS>+À$MlI²”—€¬,:Ù¹‰hwAEÑ'Qdù+OÏ^š!,‰(XØÐp q”±€V¢2,。Æóc©8Hâa@[ +9ƒ4Å#ˆMmQ¢²+Õ!./;C@,;ZÓª‡Å{Åb`Ù©Á„ì§èŠI¾è*qˆk¯¦»*e¥,ee¬\ñÆ–õtk1ž|V>`Óm -œÀ¦€ìá£<%ÒÅH=D'[eê̂ڊÌ@Í4ë+”U”ŽÅ±äüw8æÛ¨)rNø8²%ô™ÃtçÁu´ ‡ÌMGj!ØAŒ‹âƒÆõ.®è.†‚ Ã&Á¤ˆE;LÙpäÎ ÝÌJŽq{ô•ÀÄSd§ -ýÕ {ï‚—ÀaÑ€C§_,úöš”Cx|22S/ïAYèºF\-Ìmµ“м¿g˜G’1i†××I“¡7W/Û ´g„|÷ð–ÿš†9M2Bš…J!BN¬4pϼ:R¬˜ +iû2:›D ã*=ÊqO)飿¾ØV¼3Êö6%Þ;qûuMKãVË5£ëy©·æÒqS‰®/Ñœ=6¨³¼áÑÆÜ¢¿]F#GÝ÷ïc6tá¡ÁÿXÕ1Ú1”‰f_²fVDY«½Z_m•JS[²*G'ª\°Û£)/`-*ÆÙOºúxrÛG/ôrí¼Ö + ”‰rØþèK9‚ò!<¥Q¬—s8‹($xNO bdŠbÖÊ0„AJ‰Òìdrw-ÃÈKR»›õŸ˜B <ÔYDÊ©7 +´À®Lƒ°îpLoÔRfè§k‚),(K$ÂïæHÑš@Üž2ÇÜ•(Ê•ªî™x¸øŠlQ†óÆ1yê’É }xH“‡ ÁEŽSÄ™OZ &+„­²õD´À1¢Ä;ñî-„P´MŽæâ²üjÆ¢­î’%Ò‘¬rGÆ¢Ô£Ëðf¾ŽÉ#ÏD<È]Å1.Šõ8•²\'n,ÑÉ\©'ˆÌŲ ãÉpŠr-Ñ ÄŠn‘^¬"÷Ec{QË—Š¶ÜÑ#¢ù¨â\ÏÁ€„¤=xÒEK9LÆ?•… F@‰k<rD½y:‡µ2ÚA”›ôðr®–˜¡¸$bÅ7‘a…ÙŽNû•%سBMeáwí³ý36~‰Y4Ùï%» »£ÌßZ(Ç-˜O#~±ÎgÝ*Ïšô‰Â(Ö‹éøD½ûn£9šÑ7YðÆª­~w%Jý÷õ C8ô塹X8³ƒ~e÷o†˜pÛ¸˜ysPÈÈ ùêH±Tœ~€dr´sv0§c¨jòr%¤¼ÛX¯q¤Ãz_ œ)ËÒßËR¨ÜPÎ A‘çñ¹Ñ—¡D÷Q­©®XÈÊ0Á„©öað=ˆ<Ý{xR÷Õ(-õƒ3Ö3 ðЗ‡fj1«XÓ {t§£4™ílúI;½N+ø@_ŒòTkö²ûÄLŒMã]6,F +ãŠÙó%šmÈhÇÞdƒ„‹3Xkë}Ë›éýE~`« C‰þ[JSC1JõdD ¯K´»±3 °´ò å÷rŒv_^ CÛ·óààÏE×(:$r°SÊÛÈSL¹>g¯Ž³Tª‰üe­ëØó––:U‘ºx—5 6žò)Ýtÿ[ž¤%Ê¡Nƒ+]i@3Å$¼]Ó†·#X;vf£D÷U¥©¡˜¦…ME†Æí6:CçMSœ7é’7~UWâyÀnx†Š†!î:óð\-æÕ0ªFžÔà;ŒÄ*“~á¥Â jž†bt¡®'€nÓ1”lÍD1ª3%YUZ2> É›è.Éë<ìXày•~y±’¨’ÚªG¢ø(Lâ[èL1ôe(ÑT+»bÅxÊ ŠÄœØ÷Tjü”ò¼ø{ö#QßǺkïÁÉøhír ¹ZãÉ»+^—Öø\dÜ©zIóFø£¨‹ü6•)ØÐä1݈ØEÃ'aï0@4¤5ɲÃî¢ÊSœ¤)*µâE8-GOœb–~?šDŸ9‹Äœúy©®`½¨4Šäù{X/. ±û€k¥9b€÷bU3ëÖÃ{‰×Ò/ŽöY?Â|‰´n²L‰3y÷EVˤcx_}Më¢g~3ÑáB c€•äDãòЄo°ÞĈŸ:ÆAlc‚Q×Ì7dô[@µDØ"´-.]×Pây[…K,¯ŠÖ(`]è +ôŸÒ´ÛëRqO‹±è8h ynöëKúMM##1¾?Œumú¡I8nyûùÇı]Ë€`&A£óƒ>+\·¼¦¿66Q”Pøåk(Q¬ªJØFEk|±¹åþy×ñR_ +™Ÿ²p&BÕØýÐè.`Ek5|IW¢Ù‡ÕVîÆØ }xhì=¾Hyó1“Ä +ÇkÀÏnÆ>½Ú.fpÒNâ¶ †”«Ò2|ššþÀ»02jqú¬P9(!XgôÇQåÓX¢S¾–®-84²Å¦¯ÈÐ//nô¡fôßÐŽyÉ¥+G4“¸r8!î}‹Üí–7€È½q£ë}‰¢éÇ`¨hÇ¡3NÈGlð¤H§]vK#d–ZCÓ‰âÂMb)¤¢Žd×݉W½)á”;¬:ꥆ [ƒ~³ªcZ'ù¬›´\b°F¯£8Î DÈ´Gqkîaì†EüÎxvãû=Bµ~Y¹çi°2%’ªªÐ@/äª¬îŠ ¿D•š ,¦FÌ;Qôˆ²Ô3ªpüŽìQV…’éiFÐacÒ#yûK1î¸ZEÿƒ¥$Jn(ái›ôŒ›-»c)ÈØŠ£µ(Ü^‡ÇXr ‰#€ôxC‰"¼¯1ðÆzzì:ÐÉyh&¬Y£6JT#&,Ú4EüPLQµ9bßiñ²¦ÂŒ^éb6í°ïîeШ5nà‰=ö]]ÅYƒnkb ï±ïè¡ÊÀ¨$ÎS±ï¨•¥`Üâ^ŠúŽqjøiè&IgúN»˜cQì:áÈ:<öVT½¼ô‘xÓóV]‚à1$‘PYûŽkËœÌ5ïR#y_,aÖiį:€ ö37ÐðÈËÇYþJjð }Ùz(6î Êò˜BLéääq‚’f,Q,¸ò{X8™ T¹ú¼mÝ(ÝüVg·ÑàP¢ëyia(¦²Ñˆ–ûªŠY÷À ‡[‚u°ñ }ÒR?c=Ã(}yh:*ÍqØTØžqÆ=ÀèúRž‰§øýbíËT%\5 ˜ªæ…bôS`Ì›l·0ãiQòª¤`Œª««Oê +”–:0ºz:<»¾ %¶?j(6ŒÎЙ~€ïŸ¦Å„ö¸nÜñAZ'š‘OGòÄÜAŸ%ÈßXŸHy*òìMb2¡8 Òõ“°´ªé¡ðÆžŒ%ºOz^ÉKWLeë²ã¤SÁõÄxʼnp–Ö[Ÿ´.P»adúj†Áí{òà,=RwöÀðmUT<¾Ÿbæ€*„¾m Šªoª0û ŠÁÁ~¨b@ñ€*8¿±bÀõÛF¬þèŠéo€®¨Ûˆö߀X1 öˆ}@À6`EEûp*|À§¢½º O1Ä C9€ð(‚[ðœàO1â +öðÀà +žbp**ÐàOÑ7Q)ô`FQ1 ŠŠF¸ =Qa 쉊O8@NT¤Âm¤‰ +Y8LTìÂW¢‚nÃI h†=®Ä€j8àJ ð†+\‰ÞpÀ•pÇØ­ñpW¢Bpâ'у!n£Iô¨ˆ˜D8`I<|lļt(€Û`Å:(‡€p¨¸…Û Üáø~”8öa,±ǰQ¬ƒu:3 CÔÙF–cãýa@û><83ks=¸-±Q¬Cz¨`‡b€F\AJ ˆŠókãFCC‰-d†bk„‡± bìùR¢}g+=ŒLßÎC#|Ìê1ÆTÐÃCf¡p¡Cu|‹ÑdH&Ãc·“vê´—M—J2@o{“õ‘–Øj£D1Ú‘íµˆ¹–±"↊ :µ[»Õ‡¡D÷1³}p] tZx8‚;ÅlËï:Sä4°M Vq뫺¥©:*ýûã€ö}xpfäò§·]õ׋Y@ð¶¸ÿm69Q^£ª +gO5ŒÅ!µ¬Ôlc—OÓk "G^êàÚ¸Ôy1ˆh¸ “ijc}9hFfQŽÓ=iµU¥©Çmv¤Ïî>çyuY—2ùn ›Ñ®vý+K3Œ¥”4¹ïé +”††qêFvèËCS´\Q?ƒ=„a“ài8+`ôᥠ2SÅ¡ý¨éÅÎöÑÑÐJx®àÈÿ¢§ì”±*2 +>ÍMn,QïS¾Ðë)›9úzÓ]pNÈQ…®Œ%ºo*œb_,eQ·!Ðaf7ôB’3燄5õßÔ—(ßÔÍXO?¼cWš§ÅÙoc‘=‰¸^"€y%yj°“aÛèŠq²Þr~QŠ¢ÂŸH:_‹Åk)´ Y0bOÉ= +ŒˆaÜ™òË03›á ŠI™ZªNœ)voôc(Ð}Oãü‡b‘ÄÛsc˜#¾î +4âøùq©µ„úÎÆ w­=4 ?ëaÒß½.V ñѧþ&”Àa â§?QuŒØ(FÜr¶–ö±|Ñ X/¾O“}(^ñÇJÀº mÙha¼+0“yÏ MEáe«š‰w °@P²ùÆž %ºOjf÷¡XÐå5ƒ×:çˆÜ›5´òý.*+²ƒH£ެèBðƒ‰ÞF ñn]Œš J7‘ &£ +ë,ïŒ-JÛ‰BHÄV-C÷Å…A®8èK´3™A¸<÷@ËÌVEœª´Õ‡šÑ}C;‚snÈz–ž§.‡ýu-Ælza4‹x>Œ]ïJ4a®ƒ¡¢a‡Î<4!?³0×/ íŠ/ï„•ÈT<€Xsuv‹Ñ+Q<·\ˆú'S$tÛäÅ]+fe™#+Ä0|صŒ¢ˆ¡Ï:ýæiºKvñÚT¼Ñm¹1~h°/Ðw¼40#Ò‡è¯0Ç!ûy¯» fažÆàç5ïÃ'ô%JSýŒ ƒ=tæ¡éø¨´Kd/|¹˜VI%x b¾Zçêb†ŠXë.£¶8Á5ÃR•+G3N=áLUÛCnýFFÑ”›½gŒ/6X ¸ñ}ÒqŠk‰‘a«C‰îšR¾+FoØ ñÍùZÔ±3~‰ZÀÉŶícºŒÒÂ0Ãûu‡¦ ÿÇEcÄöJ{?ÆpÒ6»g±™î Ê­Ëe(F{¸Ëöp[dñl¸KÂlv¡ùœ±ûžÐŸ ˜Hâˆ,w0 ʈӒ&Wà:ªu6ª™ªÑ{áÇÇž %ºOj-uÅt> ±áƾû‚41Ò11.ü¦¾D[¨ë±+ÆwèÌCõó +Œõ6Ù÷ÝSŠb(xµÎ¼fކºÉ G§ú—ˆg'AàŸmöÙíaét{Àw†±D‘ðl¾™Ò¡–û‡Š ¬óbiÁq2~«3C‰îcšYw] ëcAÕ‘×.f÷ÎugPB@¡½€&ù¯êK<¯ã¶ž±¢2²cŽLȼL~Lhôï‰xþ„ÜF‚›ÀjDVbÒ#ªaX'BŒ @j*U´‰Ÿ §GÔ4ºsL.Ž`i‹L»# i y„0b£!ƒø´#$šç-\h›Hh-êڠч”`À=£fÇàÎèË5i3¢œYÁo1#¸™#, ¸m`š¡{¼'g„2“›#hðï̈òû7ŒQ+¼²¥"†±Q¹­(L®Í¥ilŒšª€Ý®ðÁ@¤œI gw Ô; ¢qŸ :g¨ë»Þ| îËleM#¦×tÄkQ»„%Hº¬KS“x ¢‹‹–K—/é1´x;¶÷G ¸xáñV¦eø”t ܲ¥•M˜-¿õÀZ®Ìÿ€§Åà0Îÿ6Œ·7!tô,vHÖSšÅí8·ï4 õe’_À²81Fœ;Œ,¯Jý›ÐX8€œ#ç‹ÞEòV„CÉØÄ¿Rriá¬á©1à_[¶ÀzxS„Ÿ§ž²n_͹Ú”Üë[¯çoòc;sÆÔœÛaIÍ u0Tsÿ¶P¬ÚWu™ó0tí½yœiÏL[UsnU<¡)¢†c(TaOä-ð©=WÛæTÍØ†šª¹=ªSmh„*ÝÛÆ“*ßÔg΃Ð5stìæá5rõË1¨¨–ÛÃ3‘*ÞÙ#;nO¼ýmŠÆcÁUìß"‹H§³¡š± ¦4çv`Lµ‚ÞÔ:µ„zjŸP µ‘è+;6Dó(òºp5m ½ZçvˆIœHÁ´éÁ–¯)w o‚59A´¯ÑS=è†ZÆvÑœÛaÍ u°Isÿ¶`—æÏê_kÑ7tlüæ!¦¡ÐCTª™=vè ï½ahýäuäÛ°I8þ¬¹ôn,Í¡¡š±‰14ç®!ŠZ;Ó¨õj‰€Ô¾¡ªÑÕud|޹â2êCƒ `Á)Ñ«w\b,Ö;ð. •µì‚Ö!B€ÓÅ$Û#ˆ ¦Pr‰E—‹3Äfh¯elb/´Ü»¡5ÔÃ>´þmÂFô_×ǧoøáþ0j¥tãÞÑŽ¸i÷ôË«ËUµlùöîÙáúÕ³/®îž_ݼ}ö?®¾+µÛÝÓÏnÞnç_—zy•?àw·Ï/h^W y6ùõ5ÞÿŸ×/Þ~[^tÇZûâîê¯×WCc/ß Å— W×Wo–}:ZüwW~û 3qqw{óöÁÒ_ß¾ +zzÒ/ÐMÌêýßû߯®¿ùöíc?øËÛ¿½9:Ñçøíä3óìüæEy½<8½úæú¦<út÷«¿¿þëÕ¯Ÿ|’ÿÅ–°Ë¼*€LEЄºÏª¤˜òÍXJnŠMÄåçâ §Søü×?þmKÑùºu+KË´û{üû_ñôoht÷ûÝ?ýË´{ñDjù2 K¹G}ƒs¬ç}ÝÚýn«Ôðu¿[¶tîv 7ßcw—Y<½|þ—ë›oòÄyõ|س¸s÷yþ° \â~ª)ÀOö­À#€ATD9–«­ˆ³C§?MÝ'µ$º¹tPìÄ‹cûBL—¯±ð<×ñ80,ÕÕˆ[æÊ]lÈÿ 4Ò lb†c`cÜ”¯q”Qô„ ™BΘ¯m!ý‚µ£7 +syÙwŽd77•Ê/+NB2çu&û gôróöYæÕU¾ûÁñzìAÚ¼C\g ¡X¼™1D¥¤x#AÓ?ÖA w‰jl™ì¢Ù´Ÿ*¹·ÎYñÞšR,wcåqàMÚ’¡•èSƒ¿›&òåj¦|ý£#y¹½+l]QåÍØª(Jt'7k“_%4á’Ö9ÃèyÔD×r‘m0tQ";ˆ3„Љ_Ƀ43d`~ tK8¹ ‹ÁÁyÈÀBb£²Î0¨Ž™)ßì©örëWØk‰Çåïž#…> {ÁùÃùç§vÑçXÊby²” ³€p“žË#6ñ® B¯ád¥–%,ƒŸPˆ 5‰µ-mñu(Æûä˜+shÑÙ•_Ü\È*HÔ-ß'’"[й !?¶ “a×ha)Õj°ŠêN"‚+Þ–h[Ç8qÐxmš(ˆDˆf.V{í’'¸—¶#Er†ÝZQñ¹”™ó oa- ü&αÀ•ÛÝë‹æœfMjÎ çRðùŠ iÕÂ) +²Vàž°º˜ÛoËp=¡@Ò3hKgœ%/HìIå«'æB£øàHï·æ–&ƒF·… P[C̦¸Q2¤“L-6› Ž µ•äÉÊMR‚² JÈ¡J̤„š/‡•bQŠ1TŠ%BÆc)gT{vÆKü+#›¬(yÈÏåP.q} âÈ Ü3€¹/ya ãš3„ŒÑÕ‚Ú3Q¶ê²GBQ¾ê Ê×bp¼çŽo*ÄrÅ*åŠí‡N:‡íY;@a'ÆZbpdYÞ:Ãã†zFTO>#äbž©OɱÍ2 ü.²I¬p\ø‚_Ÿ7,Ñ— +C>©zäFŒp,&š’¤h©£4á@„»§6a1ŒX f’å“÷Žf@\ƒA¢?§•b^ðø¹Ê@YÌXÁ?Ô¸N'Ut¤B.ñâ$‰%h/ãòD¡¹~,k %$@.–±=x¨ð9ºs÷8¤ÐD'“šö)]nl›x¥U’. ÍÝ™Ö"ª¨èíLƒ÷›ô”HEGà pJ§èÅ5~¢ë'/y#ä£éNeg 6Å$tÐ3´ù¬µÀ8>´ÀzÒ _L?hÞE€Ö3­MôúÏhÇJn HRÃú”õí&&jA"ÑÒ¬ž2Õ©-NŸ°jÃçSÔÙÕV“‚È)®J¼½^ÔÆPof‰±öù{%Þˆt9Ó; ¦ÎðÒÜŽ|xs•<·MaE'lú§NiÌ%œ@a€¬1È+#ÊÅ‘gM¼Ž² ,Žp/þ©TåœåÎùµÀzúr¹7 +V1í+V]ëa¥"Õ¡ÖêÊÉ[\ÅU×Y±ǽ„ÀãqpF.w¥Nšñ1—‰ÖsÔÖd­pl± éá =Ža’JHx/+Ú‚@Ø4ºbƒ"ºbï.f;D1“QÑ{[¸0¨N*‘—@p wÖîc‰ïm0w «Ž*_5G˜2Wà~iF£‚™ÎÁ)_f¨Ó´A¸&AðMòœ¬÷mܧz[N µZ2M©dšœÜyt#,>š]ä~^ˆÁ$ÚÖÔ±™KšÈ\ð³Ì%ŽS~M‰[æ"3”—ðl_ +˜/õ©euS°¢øÃ”·&#Gn[†!PoÉ—LqÕå-Ì@;’¡m<:„3P•v™OV 8‚€† Œ~¾F…FŒd×i*˜ZÜ(]¯ävwðÇàb"ü4*‰ñž¨x¼:9˜|«™’¸ 7,-ì*5"ÈÉj}ž~ñ-ÐrKªÉÙQ®âq¯(f„ØŠ8!Aüß@©q27¦ BêÅjBAiaŽ, åÒ +3H€ñäâFæìM(Oºåš’ñ¼ªc„5õ v"ðÖלÎ!Ià:É%ÓX?¥r[Y=:•0¦•fQgµ:(‚ÞkžÊ)ÓZÁı⠄Ѡ5ìÊÕD/ZHCLº1(ÝpSü”÷rM2’;ÙüQTÊËG‘A]<] èÄH[©Lµ«a©{‚tD y#¹bÂö‚”.J G|MÍAˆYÓ<¡‘áók¢NÅ×+ñ>WlE¥AÄ}å²_P– !‡‘»Ÿ5½ñ7By)¦ôJœÎ2³jjp[D›ŒÈ­d¥$7„\X_#0´DC†QâÊnò‰È7h$163~eôðU‰ 6³2ñ8˜üÄŒ”dΣ!êµ"\ÚI.:EHt)Ή"ueÁ ›©8ÛLj¡"¯q‡!#Û‹= QŽ«E†¸Ü´úÊhÄ üDªÃ¤Éñ¡4)%L×$ ]-úHŠäHæÓ‚â(;M[Êý8oòQBw:Fâ*Úa#¹JÄ—²%‰¯ép´ZcΪrEq!ŽN¤®Nk2€p4NôÈrÀYAfâaÃp¢°³Š7*4-¸¸‰(yJ0_w¢2%wÙR•Åkˆ`*_™XȹŒ‹ ²ù÷yÓµÓË ¿k#Ndd8ñR¥¿%Cæé +|0ýæZ$ô +\?Sø&ŽlÎßt ƒ•A{2¨š¢ìíLK8-?“«ÊqÎeÄcÐg]‘µù‚Oñü½MHε29VÜ1éDàzÒ@I®6Äa3åã›âq=òǦìÈ›®b¾¥ÝqˆL'ƒš‘{Ú+ÞIŒ¸eXw{ |¹%ÿ ¨8 ±A13$uP RôwsK!“Êsð¼”íé±·Ãz*DOF90a „ÿ«×æ‚2l†7\7i‚¹hFœÑ'ÄVÖ­Ê·½ UK)x®+.«œ‘”ØèÈ?if€˜†¹>Úî˜KÔ$ææuÊ ÞåÆ "ÙÊäˆ,à’A_"Ɉ J ¢;#_vXÐ6«Å´|·PÿT0rý#ÿ8šT£•9…Pêy¡/Ö-fï½)·ÙzbÉYÑ ç8jÞ}CC#ã6…ßX]ñ=µÁ™§âÈëxH|ðÜvrm¸¦=tÜ1Ê â€ÎÆ ‚YJkÉà¹Á -pײַî?È̱M&ïn™=rJ å&÷‚˜ÞKÒAÊI{U–;†ç“oühŸ‹Ž\—8Å4”r¢@tˬë'7µÇeˉˆ '­ï}ÇÐ["kÒõFÝùZ MŸK3µ=t[Ë} Oúf©$#ÕïQ+1€íö ÞÎÍ3qÐåhÏn‡Jíƒ§Ž–ìMKyFg [$cF[N×Ms›ÎZdœ óÌ5*fÑÝ-Xfˆ—‰N$f¤<áf² /l„æë¬Vã*u.uªR³R2¬ç ׄ֗ռ8«xó%í ¢çÑCŸÓIV•ËW}Q%GºkD_•ÙñBߣ˜ðieu)›JÇ|Û9#XñDšÊžÒ@ +“в‹™t‰žÁBQŒ6­{$l¼¦*ÏœY®ºJùbv3£²Yæ’Ý%—Y%Éë¯TÖí µóäíÜ7×0t ×ÍKŸ|u_£R r)¥mŽ2h_ÆÑ bÃêàedˆç¡ÏÕÔ +@/B­Ê"“é Ó!¶$B;=³yç`Å_xét’×Dí쩊•[Ë¹Ê /¿ë9xÕû)áŽ-}ÑåÎ¥ q#š*3Á‰ …+%›IŽ^àME§†>DéMÄHpú’)“rM]²Ϫ‘ðSVlL’‰œK&¼qrû=àÅúC,áqA•q®M¹÷7Ôß›‰ ÷s!jIÀí -›ÚïttÍDQÒí²á. + + +ÎÙ|ÍCÙ%Ǥü…ó+o¥˜! ˆX™BÀâµ;¾è®*ü„ßçk#(ø—Á(·Ñ_Ô +B¼¡^ˆ×;k©._˜õž¼‚Ê;¹²E|Åx˜ !š‰5þ¨ø>Ø)=¨nˆ!M“•žiµÛF \T½_‹òN^'œlö„B†tñž /õ8ÈÚò…¢sÐ<…ÈÛjw3„½%ëÆ»ÅŒÍud90èÇÏMQ d1ÆÇm7EXn–prPH—cî2Öa)Á¾( ìÓ@ÔÙ87EtŽ”§¸ºžÑï\¤ç=8ÜïI°g±DIy Œ°r´dÊ/Œ˜ÉwÜY¹ŠœÇL¶˜¢oU™obÖa02S±UÑøXqGä-%Ô¡2t[ŒdÄ 5Ö‡- b—$bÖä/‘àK°9¼`à % œ¬ÜN.c«óØ’qÖ‚ýLSÆT.¼b ÚÀ9?r³·!ÿG¢IŠ*7Eë*눱¡^p© +ž'³ôˆç2âI +I%j‘·æe¾òŸ’ù…KPíÀr£“°œ~ñ1ôæÇÐ*ž/ä à “–×Å w²ˆ³» ›€Ì‚àÈ•U–¡&c–qÞHQEˆ*66M«ˆ +­Yp +ŽŸ¸ž„ÙÌrŒà7’«PAË•™TåUÞ_ÆHT•jøŽ\H:ÉÛbÁa#±ÁE™¤‰ Í»qÀ¦iØ +Ò´Ä» ½Î"AʦmÌÆ´¸&‚ƒþöÞ¥Wš¤;¯û+ï°•‘qÍ¡øÙ040`È{Fm0/ ©ÿ½c­UYu^}JðÀ@w£OETVVVf\ö~ö³ +_—t*Ë ‚Qt§b#é·jô¸eÔÅ9 +{Êa2wË\…®„u¬áÇ&ãp_,nU좪‚3º•èáFŽ Éü#O8××Í,Úƒ…sT¤‡XPŸ˜Ñ°$¬/ß“#ÆÌÍ\¹æÏaãqÎ`»é‘ â¹2†Êá[¶,=Z|)(–v868ÐÐ`Xd öøp¢4js! +ËÒ«{iké&œï58ް]î3oÂóØÃúD²¤¨èRú»²u˜ËÎËa91>’Œ>æå¼Â§ÆÍeÒ1™¡£«¼Ó?9Êwå±QâDC%|8º‹s¢ófžïgù=$ðÔÚT#š†6–¯ôú„2â@×ê5(ëX»ÇQ“Š1ºf{'=>ÛéLOÑtŽ•nëkŒ¯³G¿‹NÕ$[µÆ_?Rä- p<$ ©¾ÌÅe3ÞGØ–ºˆ,†”ø8鯔àœò/ÓžP?b|ÖÎp®ŽÇ)G‚Ä(Ù72/#$c¸¹Äž’ónÌ#`ŒJ ß}†?Æx>ñΙ§È=øËvc$U´ü•BóQI>ž±w Ö÷~û‹ÍëDԧǶãênGƵuV@žáºZiº¡zb’K|”[Pz±}™»#;UtàËñI!–$4zØ£µkCyÖK=tS§%èIEŸ_lÄH˜;g¼¥+J ‚b‡®ƒGèXË/bŸ¤’ââw¬!×0ÛR«,«kˆÃW I¹†J†‹T0æ©üé+?:4ù‡çj#ˆÑ#¹Ôº½¦õ÷(9Î'®aîáoï„2ÛY&Pcºû$pë7$)—eˆ% +ÿPCÍ||m¨ÇÆ”+CÏ^™YTÒ^BgæÇu:¿$ӥܓîžI¸ÜVZíÀ‚‘"¿Ú³Bm.F0 +)&E8—Ü|b&$Ä©„FùdÍæú:Ñ.˜wÞÔ™Òš(STí… Ü¯»ï2véë AÄ|QŒˆ¾‘´’BІ‡+ã=tÌ]¼ÀÙÖjÁ†gÇý /µF Ë@ð âÀ #.£Ï[ë±8â>1LêxìÏç• ÑEiÆabˆgÔ¿–´ÔÉÏÄ—„RxXÓíb_e~§žcw¶f9¦a¯?ªBE­#Œ“:œ³ _GK(y¢2S)×þ:­&Lø0yçg‹ääl€+£WB-Ar¸®ì;Â.M^‚9Á Kö2–fQã–›-ÿ¼vc%~4-sù7׬™Aã šZwfWžSiñ~…§¨óòÂå™H'™åºõºâ\úÛ*uNC,v-q²•Ði´eà Ct*¾ÛåËó+ú2z,ûŸùíhƒUàlN´‚½GV ª*ü:)6¦Rû^Ï" +fkcvTOÆbÀ„Ý)ÚbOÀo.mãæmÄ‚&úqÇmžD+»nZ›hZYZÒàz{6d\€¯$´.6\©Ž—K/bÂ@ï9ÉÒšÈ_{|vT³an~* î™=-tÃTl©IÛ§E·Sbá|_ã˜ç^ƒ77PàºOzù#ò˜¬&Ø­u¶ÝG©ßyEfó—`ÙJ!ç:A)å.ÊDDª£i¦ÀíÔ×Ök ó4´;µCë|‘U0Ä›½sÅçá +ÍšB M8ùzßh[‰ågkQÕð&°•ßž¯1PÇ+76Bý")æ9Íqra¦«8ŽXáìQÚ¾ˆÄ[.yxµ¨è=Âÿt·}W­g·é<N2G ÒíuRü>7º„ê•ÓݺB¶ïgL€±N“ÞU¤ë]‡§5—r)¸¡B=ÉLÍã6íæçe¶›N÷&,ñ–x¹·3ÙˆÓOý†¸ƒè¤twƒQ,=z \Tb™8ElÕe(b¹Ôœ  çr…êWÝ÷ç/8L~¥ÓÀI +D‡øJÇulSG21^š†öŒXù8#@Šã‚[÷¡Já{8*"8j` =l?MHR]ƒ7 ×Ûá°˜¡©©R•Ô‚ ¦¸½vŠà}SW)œBA@ªO“b6öÈÇ*ÌI¥Fböàöœ›xÕ\ß×Ûvþ¾`@ŠñåöR,WÖyp%lÅs}9/yÒÉiÓËgw¢*áË`Wþ¸¼í¯ª*…oT¹Q×µÐS޵ýÐue¾Íßoù˜öð15I7Tì|›òJ<•-, +i 6JªÞâCZ~ú ¾Ù>¿3(3íhÿp’÷*){«X`'Lïø¸K{HôøûÎQN’õåâÌÈ9/ªãÀ`Íœ®†5—ˆ_V´o^…õ6¬ÃŒ²·˜Ãè°š§¥Ùh›¢¸ùs´çI“F¯†`…¢¯Ï‹ÁóHÿFÄ®øZ°¾Ž‚e•)tróWõFN—·F­û~Ö q®f#/{’Bã¡"Ðïæ-P—©ºgO4xÌñŠ˜õwR±¾ctŸ×*ø5FÞ‹íŒüz,4bÉad +U,«öÓYóSP{9×÷,i(©BÁNÃXb—Š¢N‚ Á*ØHX¨X0„q$¿{}«äQÌÉVþDÄca+@â,õ“Ö+ÍûÕuÄ›Ì5\WÁE((õµ™W[dsõàóźÁÆ[Ì?¡ûx7+l>»¸¼’Jõæš}$qœ~Ô¥¯ª-nï„‘PC>’(&ÚWmtE¶ê§oÊ\ñØKôö£Xë0§2×DlDøU®»‚ÐVÔ·³µ â¥U]6:ô¤å9.jÜšÅ_ä­ È#4ˆVúëxs½éëü.WÜ,·yþ|- +y+ÆTpH(ÇÜ«¨ÅFáx kAÂn%_hŽ˜øÏ[œ7jæÆOÙÚo÷ÚÛÿª±a.ÈÊ\m̦dY IŸÃqà°ÕÂ(A«îëÖý6ŸÔö_|†Ûü|.N?è ;(ê›û°ˆ7‘{þÃn%×O+jƶ +ÇÌüFž<µ$4N´sYbáàO3kèÕ°C‹s„Ã…>“ᤵ´…‹;ÏÀdj±kŒ=^à€ƒýfB%Ê}GaÓŠ©ž:\°7ÓŠŸ!Q<阊GÈ$mŸ®•Ž[ÌAc£äõuõ>¶´,Õó¹Yæ…ùUº:$ë xTÄ#ÍšgLî5“þÔzšLF““|Ýø9µ‘0‡ÇU(Ì"=Š4Î7æû£|D«nðg«fm"Îl¸|¸&Ÿ}"ë‰Õ‚{ìsx¼a²Ÿ ‡¬ËD•ÈŸU¢±üq#ì+7•1m™?9B.MZ1L +§í<7æÚ¹f3·†z¦} ’¬œØá„±bvŽñݺڮxØÀRù +“:hçžõÍŒBÀ@4`ËJ>‹•æÅËAé蜄LÃZG†‹öv˜ð“‹‚dí¯"†Ð-ó»QÂìÙ´EŠecDCÞTIRq^ƒ?\Rð¥Ì"têBþ tÆ•<×{÷7¡Èº:ŒÌ¹m$Ë•Ì_dHX^Íïqâ6ZW‰ I*ëŽ*Þ.ê^c©†=1y=‚ð¬Ê¸5áDÜ“Ô=#•Á™I'"¡â¬óÊÒ8bŽ:,¹¢&W€9 :9Ï?.…”£D”¿JÌ¡i/[t† –ó””8Þ`râ†l5åYÚmƒKÛÌžÆ)ïÜŠ$y樛á™gVOÝ•´ËUãy˜v1%GáÍ`_ˆoä‰n ÛÞ:q¼;û +çlɽ»aÇnÏ"§¾ò–Õê‡Æa¬6Þáz9¶°5gZ‰5ÍŸŸ!ÕÕ™þ†I%x6n8^‡auFk +q©‹çɪ¦¤•;/РÂd…¸¢FÃÖøõî.™°:‰A3‰Â¤cÌeL·ªó¢hdî1åˆÁ)®åoƒš';ýcõCP¦¶7è¼Û2äŽjÄ#ª“(‰dˆŽÓ¢•åÒlí-ª|C|‰pÑb™¹fiÕ—8£+¯ g6UþxÄw§ÕÍreSש‡+ëð¡VäuýaœYrÔ$ï]o…eŒˆê@íœlI¡µ†€ù*¬´‰Z&4Jg)SØÎZLÅ`º®²¼æ(ÁOBPLjH”²…턯õ8·äŒâ§0¤™wļ‹0ïx«Ê;zS­g¢1¬xýŠ×I½Ðå:Mƒ[M=ÒÅuH±U^‡Ë!p¤H¾Íl[²|µzz•Ëù~¼9ÃXøÆR0ÎàUJÜn9£q"|ÁEŒ#¯Çœ¨ê¹JDzĆæwÉÌ…ýOwh$Îo^ +W"ÛjÁ´®—/b£®N¸MÃ>Ïš‰‚ºš´ví¤ ó÷r%v©‡?•–<ª¡¿bYvXÄœôŠšïµ£îñ°>î"ß«¡pÝ;…s)B3»Ó(mçÑgLj†Šª{gÈàwõ)/ârÍfƒ4‡­®fƒiÐÙ›ÊDZ ¤Whèc{Ô×áüŒ†yUó;`¾<;î&;Ö ±}²X”̧”|*ñðeÚú¤Ma™ÝÜX»C+J@£x,ö)T˜2-ÐøÍ'K¬GšcÄ'hÉ7»d£íQã Ãgëœã^‰\lø5$HÃ«Ž’ÉW¨N#¸¹l€H® +\D«QæEteŽSÝÇë8ˆ0çì]9”2ÐÖY¡¶2ä’V‘ÑRÊ"—«g8õ¡ Þˆ§T;úJkDE¹nI‡^ËXi°.îÇæf_'©î¶‘ AÜ”lP|GÛ´·qè³ÑÁ` &vq& Ó ÚƒÈ5ùº>Vy§âù2-~Þ=.ò°-G:¡4¨ÒwŽ¡ˆYïT½?gÖÀ ÛQOç!=8ç³Åx{F ½ïòþšï"òÇÚ'Ô†°Db‘Öhx¥-ܼÆ5˜» +V+',÷+tÅÝoypçëcôá½÷Ш(ï®Ë«£#!¬Ê ©ái ®á4’ˆÌqâ<Õ¥YÏø§$Åu {y,<„çõ„…5ʼ?ÃRº/-è±´ —xžŒ`|!AOPQ¿ Ø6À¤„¡§¬Íéè¸Dƒµã]‹`¢ ­-f´Å4Ìnò LGƒÀ›¼áÏX,?Þ£ùD¾‚e:åÌÖÂv“ â ifƒø“dbÎÏ¡ö^Nsñí5[‡cð'=W.x6âÎgXÇ‚Â(Ó P°S/ëÞü‘pô¹èŸ—ŠôeÝÅ8(ù‘ÓÌñ•Xå^1ÃjÖ—)ÇîÎØWHyœöŸK¶C‘,’©B»3ËSu™pÃI)Ä®ì0@…2š£}Â^fïXNïÙSa”ÔÄD0¹Å¥‹ÕеPë»sÑ›_²¨Q øäŒ¾|ÑØî¸ËØf\7Ûù²!#ð8ÆõÈ¡îã”f2¦‡^å±z¤}: ,–™#>hÞ÷ÝãÉjGÙ²F‹‡2”¬UëiL_<ª"#îâ*ÜÈ OìñAø+ ž ü¿¤º½¾t{U÷Ÿ³©ÌQÐŒ ¨8qê&OÒ­sÖ»æð”ÉŒBà8½’×é|/Ýõ…¢aø­FV„fôȱb^(’`q_÷ZŽVnÜÌc`£bðx—™Ð<—òå ž…QTfß`D}­†éH‡4o,áÜXò÷±ôHëï¹51²Þ½^Ì+Ú¿¶±=…}Ó©¡ +=,þϲÖ³Èn ®Cc¯·e2YÎð†KÙ¨ÛÇëW-¯£=G íÆ©ž„sÀìažœÒlŠx‘·\eë>qhè>{‘Д"tIu¥*‹\ü6¿ØfêVGä%®ú.¦Ugcžß+~É8‘ĵ¤íʾËTœ2µ^|Îqèó Û¤ÉQ€ +²¬NÎíaõ=†´ç‹]¼#Î3w¹{^c*²ƒŒƒí¢Ñ{8J …s+Cq‚–¡MµæpÆAõ·ç” oénÇ´yO:hòf"ø•GäTlz6KPRuñ;_)”™K¨üŠ+ñâ\+ø´4óˆÎW(ç¬4Ÿ^wo®™ +AÉ­¾ä£lÉ4•Ôq¿QÎÎÌ슚ñµ'‹ÃS/OCy 3üð +^ÑæuÅ»¢‰£.kŠ hëñ沩jÒÄ-1x(ÎSê:!­.çò©^o·­Õ´å˜“õ fK],F;¢,46Ê †"?A_«ÒŽÀ›\~Q~ßÈC¯™ •½e 1ÊRgõ§úºEl |??§k –GXDPû˜®(-±Q:[z=³P9è4‡Ý ëR4;–(öðV#Ât…‘íAbžd×0ÉŠ#ËÑ-æË=@‰ý¬ +á»–ÜóA(E9h_æ¿dQÜÙeÓoc=NxÒ¤8Pü'œ§=̨áƒ<ÖGo%›N%¥“hfª…7 õŸº=,Îy&"ÐÖbšÒBž¯X;ïò†Fä¾CÙr¿Ë<²åÏÇq¬m¢;–Že B~òÓJ`–¡ÒU¸1'Šòz`H½óð²a¥ÀÉ÷'fvˆVaZSÖÆÚ̈(V½–zU¢°vöh¯y‚nÜÄœHQlÜp¡è˜óä(Ô¼R¼ßlÐlÀ}7ê3™m \óºz¨š&3¼7Êc£„%@‘nØ©Î]>ÕŽ¤†™lİt¿Â< +¹5*–PÚ“ÁLw)Ý›¡Ð^Ôº(Ap¶@ÉV ûÐâ”ÈÚG0mN$µÓÚí|Mñ+æíwÃ+KgÚŠïúzÛqÞ9¿yô0§Iá?CYSú¡a!ŠñJ[kÿÝ­…Ï5{Œ¾Ò‹}¸61f$uê¿þ|xåß>²£%L„CæC¥ä3Æ£Í@´ô¾§9Z膃y¸Ž•xÍ‘ºFyIåÎejPšÆ!ÁËŠàdxÝQÉMr›:‹pƒÂ üH†ȯÆr·jËrŸ¸_B”\GdøDàØwYúV—Ù·E}¿°P¤² Ζ.hƆ²kÛi½°.oPhçŽàu<ƒp8+á+ÛöiDƒ"©×þÕÓÒÙ&B¹–sQz<È \$Û<KäZÎHÆÕ d¨ýQÐŒ +‡D2UšûQëÁÇ".&µÔsFø•Þ¢ñz)^òkãÌB}ÁmíµGkuÝõ¶O›?SŠw¼¾é¶Κ'SP6|Ö|[(ÌÎÐ ó·Þƒ *°œÍ/PN+{˜ù³bæª*Ðd*^ßn„Jõ…^Gä“â0,Ù…7 ×–É›Áƒ$NbÙ'b……~»sEl]ÅÃohsèø± Ûº–‰ÌBGêÿLš•ËF‹D ûp%dX 7à>C+¨çqà^x­ª8€¶Âtû+[Ý]–´¿1ÌÇšÐüaÄrÁAºü{ÂIs͇hhÅ©ofuŠâ»o”Â’Ï÷|*Ô°~±–{Î[³ êò22$Û—5™E6wýúËã‹TÁˆïCÞ•g5cÙ;H#'/¤ÃK ¼ž>£s¦EUjÂph²ØKÚ² n†ðbI%·=Ç’PmÇD}gê0o¤Vz.t«CF8û]õQ&’jd³÷ñúP°›1à¥uKrC¾@ŒŒ‰¼­Üº9µ3pÇæü[Œ¯L•ƒê#‰‚1¦J)H‹R€ju,^H]~ús_9L!Q¼—óZÑ4ó£åtz!m”#©>ÌÙÍE€ë Ô}5j4Q3P'žï‰ÄAå/×*5KÎŒÒçw6ˆâá]W¼FάŒp zXêЪƟôˆ$œÐF¼ í ,è±fVq,ä[8@nÍ!›(”‚e¦ê@Ì·Ÿs+Á·k`Öe°tPô+&ómK9­ +)$%fá¥põ¤Š"¯Ä´jcž3ˆ÷ˆñóùŒU -’¡S£­ú )¢ÎºK¾ÓlPÕRqKRb Ó¿Ò¦Cõ2{ µÚV~¹Uç;£Þ]-¹¦e9SëFK+ßN|ú ò£î×_n»9¢cáæ9¼SƦë”+r ó’àX«LÊ +RÖ¸™£ÏX5%y9ß:ÉÃÿ訙GÿöYi…G:zÀh¼­·ÛÚÃ’š â0¯˜ï¸ºLŠÑµªå{¼ŽÇÊã{ÎĈ*Á÷ ¾‘.”ÌãÌ[õÌ=)þ±a‡IÔI$©ÒsA:<Ñö`·³”¡Já_^²A®ppºvØ«Q_µn¶3”·ÔãÏÕ–ž€&ú)Ñ0·‘[ÕeN)%x•˜£n¥{øn¡;W“n…P¸Y•…óõÁÓUAapë”DÕU4û(,­á÷Õ´—¯!xóO-&Ý¿ñòØ‘FL½ÂQ‰Q§YÕBêþÅàÌn©ëYâ÷²,ý¥PÈíFTÛ¯»ŒÑÊsš¿Ê¡êÑXY¾¼‹©Ô,¸Ž0%FËfW޳Ûò”JÈ¥È aˆÅWr^ËKî=.¼êhÐ$…”K¬~‰ÕÑpî»,ÇšÑ +%‡`/<ßSâÚܧe³55Ëà1Ï •õù\;höÐ.„«Üs=Jªo¯ è+AuT™KÊ9ÃäåÉGcÓež2‰UŸÌ¨î»j°jò cC¬Ô5V›úÙÀÕÈ+K´W­Šž­<çËÑׇõ™á2 Ë5›Ýãï·³êaãÞ‰Þ5G}µHežh—è†_ÂÈõ*C9É’|ÌGäpD@byorˆ?(ýé¼5E¡ç±V©—2_F±eÛ´a¡hç7Ü…i_rèô¬4-FƒyìÃk|.í FfźHåÚëbYºM²*eÁѵ d¹ò¼Vx'¯(ñºUGzÀ^-^ß•+¨9WH™”8œÄ6Fêà(Jp„¹ÇOì }nñÛÞ_ 9iòê/­¹F˜bF‹’ŽÒ|=Ø(ºtžÙšóô¾ö¡jbXã=ï?}9–*‹†ðÁ£²†åâr¶Y²Õú²þÔrǬü90qÕ®…ËOýl¨Ë¹1@pÇ*êÐÓ‹§ež`_­Øð0ÃPÝÀ·î±Ïr=÷Y%–<¡zÒš\ú<©ùT;Q{Zû¬¶ý¹laÌÅ^WØ¿3ò<ÞÁླྀðãg¨^ëka‡(¹aºæX:”#Ë: ¦°+–ý&)]ï;r½‹ŸµÈ–ßÐÃÅUtÚ¼ŸQ^QƒâëJOcDÛGQ4ÞAGðØŒ0±* ex¶qcý."ðß øÀ ›2_ÈÇù ø(P÷ÓÌrĉ}2ëz eíþ­B¾˜Mê"¿Gì¹€4#y¨ý0IIK-qê™Sp+Ꭼá¿Ë*AaÔwr<Ÿ]ö_n¦uar,·ÎÂúˆ³¨wƒ ñÙ0â¬\ݧ·fåÐ¥ÇjIfƒu­¨œçÍF"-[s™ok>’¸ãK²«(”1b4¼|¼Ð‹‹°ðt{Ñ5"å>G–XÀ;ÂV]ZënXâ»c\5m¯VŠÙü9 +é0MäíG¬Ý*ù 4ÚÐp¦Û#ëŠÝ}Z+zkåC¾òǬg\VM(PáDôàzŵbI63ET© »'Îõ8÷ÛlP§‡}òs¶¼Ñƒ_oËö²J–*Ad ]$³™ìŽÎŽNe7¬üpÿ°{s<+ºÙÍ[Ø2DáφQ‡ùhEð.nsÜ+W\cI¡\ÁV#XYó™Iþß k6B懒Ìÿ~ÛņZ¤ÑP\ž,Xüj8Þê¼¾ZG[«"²ÃTOÖpCYåŽRŽ‚þ\ Õ‘Û~SŽ=¦ü|4[-µAmmá'ÔmJl ÷@¦ã¹…Í!޲gœË¿Ü¡„L,9®ùCQßé¬Åùu7÷&gÝ ëx=\åç}Ÿ„žQܧ¯kàùѸ:s-þ©¡$%®V"žK¨LQÉ|êSmÿ.+WƒÌϧiÈÅ‚.á㪆áU×ak8/Ìg¬Æ­åvüŠX¿ÖKªŸ} + í58^ËYc¶ž«q‡ZÀEÉi pª‰k«Hý!1I~l©> ]ˆ$bB½ ˜\Âý0²j\o²jéXþwž‰mþâ·£·V$u—wòœ€9±‹Qx›ºu%¼sÝšNpbh01jꔯ3N±·¥•¡t¬5¯Ç£ð€ã¡4EGá:„¤¨°4éC¹„–ËûxJs±‹Ë¡²°TK[8¾NQäÛô‘æuJÆE!ä¯`)náR SÑBF&RVNÞ +Ÿ-šçD|ƒÕ%ÞéeѮͯiäîé)ò#ÁWíýÚX>KpÜUJXØáD­Çö¼Y¦kE¹Téj÷ÚC¨Ïø—rY†zE¡2ËBï„Û‚™í´ˆ[.@˜Ë¶øÅˆÐc!­—_¾‹žm­¾Xµ/)³s1üË30ôú—¸xÕ¦æ‰ú–Ì&›1r1ßCl®‘Шõ§í‹ŸÕåµ÷ƒr+M/}uQ5Æ•Œ±D!¬JûªFzLwúði¥§Ú1Õú‚ù°ô¡ ©´>BţǴÏÒ¹žß=ÖäÑÅ[+¥Oå‡!;2WG`™L~Žeæ@”û-Eê,˜`ºYmÃ+r!Tøh’!£[ñ›*·Âª…ÑúZ8‹K/h´Mg|”Õ#ð {x ¿Y* $ξÿ” xº^›KkfZ‹5Êh¥;+KoÜY1ÿ¢G¬«°A]Ÿ SÇØZ¬áR[wc[wc_1áê¦5Ü–‘øóÂz=½›¯Ü¯æ?ôV‘4¿+à„¦Ë”‹\y*Õª7H¶ìYë(}ÄæôŒ!îäl‚üˆ~Ë.®Q&íUá¸m-¬C’ј–j_Pž#a]ibSÕT ¦wï+2ÅŽÐ~‰÷‘ëÕ†X˜é°ãÜùfõ§ä‹á5 R|pœË„–T3OÈ<ÆÈoA5ïò»ØžÑÔâŽ\¥b‹…,êà@õ˜Šè’¨7ìD÷_d¥c­Øæ’¤‘Ú>Ö"`2'ô”ð¤¦]íìµÖçc=ÉÇ 2žK´rŒ×*sˆ÷+S÷¤ÂxsAÎ&c‚Lìñ]-"ZÉßd.âÒ»5}š)’*ÚÚ§ØG‹O„²ƹ>ø&MeÑÁÙ°ŒŽ·nð"Åj|Ò쇻;%TŸ¦+î˘4á±V¨GÀ5Y[/õöxP7²èÄ˃•Òöd¨=âzGCÅŠüßÇîîOÿæûÇ(¿ÿ·:Úo–~ýû¿ú§ú¿~ýÅøÿËßüë¿þÝ¿üã_ÿÇÿû¯ÿç¿ùûüë?ýÓ?ÿ?ýOÿÇ_ÿÿùïÿõú—ú/ÿ¼úó[þÓßýóßýÍ¿þÝþëù!ŸŸ~ýú‹÷ëÿßøßÛO࿼ÿñ0 7p­†iÃ6” à¼ùæo_4ßÅuýà6š?R…°yBµÅ/àÜ&ÉÍÞa¡LÚþ/oôtÀël.moòáÂàé8؉GÍ0”"pšl}õŠ›QÖ7WfÄš²F¬§¦uäÖlË©Ô$#Ö¨/váCî Ð4 ,?Ã}䊀҈tþZP¶Ó\•×°¶\ï×q›Â·­b<1#|{J¼Y,ŽCH²F7(µ39)[îp(ó­÷µfȹc.Íûhñz¨ßz·Æ„Ú“¼–(øÿ"Þó1ç¨ß ûj}[ù ß¾¢3ÆX{jS³6ŸX{Bk^æiöw½ðÄ^ï)×ìúæj?ë ‚PVûÉ©ïì|ÚØxzÖŠGú ”Þ¥f½¾Yôú“¥ôCíë¡ÿB¯[Vj7{×´~Õoä< ãúiž½vs÷ù˜ï éÓúÁ•ï%Ì8y6ôÔißùQÿ ýµáñȘaÕ=˜ñ8.ö¨ÔÑO`þ}åQ7"ž¿S’áyqÌ„ç¸TR/<;”3þû€ÆÜ¯}ghC|ÓÞ9wÄ‹È;µRÔóßlw};³é«9µ¶Ùî®<."â' +„óÉvuIYë’tm¸» ’j!FÂyÃÝ£X,­b±ë|ÂÝ­ÃKd¶–#ªšMTS"–ꆺû÷á]À¿<¡îÞü2Ò žuCÝùùŽóué§ësç²a{3ÜcœÓ¸9Ù w—WXñ°¼"÷`¸G«KTìªú¦©Ópœú¾—EÄ‹yv„ƒ0~B`^0woÓk3Ü]¿¡Ûý;5ßµ}òoÿùÎׯ!ŒéñÆjÏ ô©ïÞ‚*Tò2á¬÷‚h£†nˆ5ìv5ª)á@VSÛgæ&U‹NÅÍùP­|ö(›KH5àÔá @4ƒ÷ƒB ¹’Æ Ÿv·v¾˜ÓàF}¸ßYÓ”éPžs³¦…ˆÖbš¿íÞÑÒ' ¹tn¢ôÉ‘›#Í{˜BÞéÑ9ǽ½ ÑHèXYÞ¬èœãª<Ñ(`ÎÈÄzCŒS É|›{•ùq49õ7h4:_wä7õùðNÈŸ´ç?”PÝ”ç3ñf;£f –òÒ†Ú_$g}ÜÞÎGT˜?¹Í¼ú ×Ì%zƒ44³ *î­Ed.A«x™‹[¡‡j2óÆÆ/“ø.íE]¾Õñ„-_±t»!Ë8 ”MV>5_½O¼(“ôâ]@e;7òdòâsßðÉ=ƨMMÆ +Ãæ›–|ÿý $ß/Þtä+2 p VÕµÒ ù\ ›»ËÚ²Üèãý÷;ñø~ñcçÂq7ßxÝr¬ñ¥ghÙ4ãú 1†û ç/ÞJöZ|¸ñ(ç†ÖN|RŠy^ÕæÞ˜â¿äcÏG–O|hÈ—ò“Kœ-”ì/1ë0þ^b“Mµ>áÃÐþpmZÌáyß86nÔ°ÑŒüAžO+OÄMÆÌP3p…•!ó{‘„1ë`ȉé-twš6F›Î'08 6éÅ >îêæ1Ëã‰&ßSÂñÐßòQó f4bü`ÿ2á°k½¡¿XÎ2Ùܬ_è΀@ˆ_–6¦U— ÿèËßCöÞ›L€åÚ7¿ V@bûÆÝõz|ñzY¸µœ6¯—KÕ©á¡Cý ‘´÷~ñ†ò"Tá[èïäU ³ÞWù0Rnn›Á‹NÁñ&ïÒ.%í¼›WXóîæåysv‘©©ó~ó>Žô}Ñuq½´Ž×ùºÞ{gé²>±ðs1tñ‡ÝxÜJ ƒ7¿3t]ìç׋ê¥Þº÷߆î~q1t+SGy¡s?—¹¯u0‰‹]yÜœ&æ’‡8ƒ4\÷Ó ›T “±”7}3tQ^²&Éõæüdè&„ÞÃÒ˜¹^&·õÉÐåý¢æFÁÍÉÍÐM<‰Ô×¶¹,÷÷ü‰¡k/*TÛ|.#Aý¶¥‡0OLrζ}0t“ÖQ¤çîÇõ†.ŠFê~ø6ŒhÕk9Ó¢À>йö +¤ 1Îß s9k?ñ‘¿ù‰Î &:𶬽?ѹ!íü®½âä\òì™úr$˜yeUdòýœ9kÚÒ¾Ù¹SG76f‹2ûÍεžûÍ‚¡üÍÎåÝ¥>‘¹¾Ðp.èXÕäß sƒ›}ùÀ72ןaø-C‚ú…Ìõ-)Þž÷‰Ìåyçy£$W ŸÌ\“ô‡ŒóÆôÜ?˜¹ÞÍ—Jk¢Îço˜¹¤ÄõÈþs´™¹Ü¿!œ¢ZùdæÆÓFlÿ˜÷•?2sÕ+œí•+~Ó_´¸ºû/T.Ÿ£÷ðüà˜Dår~ƒò=‹ÚÏôÊå 0®4Žá>Q¹ž®Í³{²ÎðGTn:– Αú7*W5<aÔðJä>Q¹¡—¿¬ èm1p¿Q¹~•û³Û8ò7)×S¾¼Êé`§üEÊ¥GŠG7eñ¦?¢rÅ»r'}rÉ&è-Ó©‰M? r¯·úD®²mù3ÛÄöÍÊ5¼y™*ùdå^óïZÒoX¹ø çº ¹°ïÎÔ¿Á¸³!„Ø?òpi-÷øâàú¦…Ç}àoù˜ëgæ-AÍÑ®oÔ­^Üæ7-eÅÐß©·\¬ÄX‚:–½ðÔÛëúC5ÿìö"€lzäƒqKT°Èh[ÂÿÇÒý?жCíñ7Ж×ÏEÛýæØâ1ßðÚ±¶_ÐZÓºýú «?ÌÚÒ7¢Öø6ÖŒb¤v~#jÕ*!>ßlç¾µ^ôÓ;”Ÿ%³j½CÀ¹CÏñªÉPô@Ô^aѵȴ„ kPl]ªów©O -¯Íépƒh9±0³ðgeQ’;zÇÎ&Åw&NÜë7v62}—Ös!tmþ,cõ‰Kk?ˆ¤ž¿áÏ:9R 8Ò7Ö£˜N·K|t¸óc™N)ênŸüY³†ÿȹù³6ÙtbAshm8Í]#=OmäÑ@Šˆ   öH‘Á^iŒVVÊ£@2å#ø¸ï)%¼–ùâxwÞZ]Ap$ä×kh¹Túcg9eRògehY+Å€77Æè‘Ã~ÕŸÏ&êQS¯O­­ñ£å€¯FñEýVæ²2øµÆ +i¨GÈ+ÏÙƒDK«`Û®6+o­ ,H;(žQ7‰ÖÓ¨ˆåz’h­Œ¢ÒY³=$‹DËü +Œáž9{#i™.N—W“¹òDÒFÍÔ¹j¦Ê JëÛ\y²î$oµ ´É¨sba—Å +=è´´ž.ˆ x– §J«x—›þ€Ó& ýɤåÅ«¬s`7z3imhªbOŠü6“Ö†®ÊÙæœ–ˆ®äˆ§ ×ÜpZêó}®È“²^pZ$\1—‡ž_ñ§¥U#½¦Ùòµá´Iœ&+Ô9Ê9Ÿ.8­ Ìí4œW{Rj£•eël%Ï}Sjý ¬¡ÂÁL{Cjy}®ý|½ž}Œ”Q]çoø´tËhÁLÊÊõO>-O5{p¶qMÀò'Ÿ6™SkŒ?ÿ†O«QˆìcÉÂ?ù´ôˆ]ÿLþݾñi #ÊÀ–4ÄNo|Új<ßê÷ɧµ‡ub,•jÿæÓþÙ@Õ[L‹UÄ N‹à|Úp FÍ…ïÃxñiY^\†Ræ\Šrsñiã™c5Å3—žxZÙ½Z–^êÆÓrT—\Ú‘eãiiÐ9 «Jw<­j@øçë°3m>­ ±œä×LP ¨Ýа' –ó›#Rá4Nl7 ÖñÈ›KËJëèí£U0SÁÈ‹˜7ŽVÕRp dË2AŽHP¾H´ÌÂ×õz8B»úÍmÌióƒ¼Y^<BË"Š?U@]–âLœœÞ¡²­„ èfÉ"a[³úð§Ðƒwrlë;á.ø­/Èëb¿öÿwN¬ÕqݯQbtÕ´ñ°÷ßïxØýÚÂÃ×¶/Î+¬R¿*l¯‘Åݤ2§Í€½ÿ~G¿î×ñuž?´›ø:“rïœW¹ùÅyÌV)o¼+sQTWÞ4‚ÂjJd,î s,ÂãM¯Tëü>& ntk_Å„7±ÇY2çP«ÄËòâ³úw*ËJ>xÙw¼h¬¼ÈópCXù»¼±WI| Wû±ÄC ¹Jšø +샨UÓÆgzVQ¾pî7X•G” +ʬÚ}RÛ“§ +a¤iXÙ•Fø§´MOm$ÌS@S}mÑJÙ¨ðDƒ7"VB Ðê.ã¹‚Ä DE”‚„‹è€+vÖ'ÿÔÊìÔöE•® + wjúörŠ ÅÈÝ›[a“\7êS³W壙¡¦=QŸ´Æ^œ= 4r“Cê>ëØ¨O·þ,væÖߪ©wÒ§@ +íð>Û‹ô©LXG×s§nÒ§ïÀ¯ÔE˜:½‘>™3/%©Øeæ´IŸl€à Ü€OtÜ;®'!öj7×ÓSw¿ŸÃPôæzºˆ2F‰GkiO®§ (¯["Švn®§k§nÁ»²²¹ž4\wæ’©/NèæzÆré\Ë¥›íÊB%á\è¢èNÝdOb=Yˆë?Éž®©«>«¢ÍöÔ–«ÕcyǨ­øÝ²ìO{åöÿ9´§I¨¡seq&| =m5ÙCj}³=#Eu¶HQ¡}[OJ”H‘ƒ:?ОƲs5Î~s£=õÅå,¸!1Â\hÏ ›Ïãz=¹ÌKI¥n¢çWhé&z’ÒÑï™âò+œ/¤§I-ê.æ½z‘¿»‘ž6øí¥]¥ô´Áìá¼TÔ ”GÒlYs8d7Ò3KdkØï´¶‘žZú$yš‹ðá¼¹HžÆLwÈsÛÛÒ&yŽ4 ‹ö$y~-þÉÓ‡Ô°[Â(á…òŒMR_›¤’çÊ’Š_qåyêJ[ÕåÙƒãi‰+kûÎ5çÍñL_u–"ìœ6Ç3 €;·þ“ãiJµôÒÿýæx½¥,zË™6È“ûÏ«¯#€†/'UÿÔ%Ý$Ol=ðXOª«®'¶¥¸"’¥¼`/Â.ü†tš1`GÚ¡ö'£Ó¨r‹àq8W/XçWaÖ ë´¡Ž'£3^,»S—; ¿ºŸJ^oV§'åNª@ikOV§)¤ªæ¿è§uC; ‘  Š]à‚vš_@móNí$@®ÅÑ‚u‹ÐQj1:­nQã ͉ÑF¹6³#Qéi9¡ÑüäpòšPÐÅáÔûlÀÂoö›Áu“šƒë,7l“?1ð¹›hö¯`q¾Ðš½†4î&jvädgÝ M¢ÑˆÉüÌnî®olfcCq¤Íl+Ýò eÂÐxÑ2ÛÊãÜLyý‰Æä51‹ˆÙ 1ß̶tWú¥ú\Vwˬ“ÿ@¶ —œ:*‹ë’rm*7âRs¾@;J¶,KøþZ*¼úæX–%7¾Ô\=?ð•„2PÝÔJv€„1oZ%³e{@*Ñ“¸Ù”hÕ%O.$%ðÂòäPbŸ„¼ìÆOVܘ6se2µ—Ô$/bM#&Q4y¿I(žÑí>€’µDÑÔÍ‘¬Å:«·÷`ñ„FbþgÉãr u·VÚFDR‘NUæƒ ‰ ,t!©A{ys ©Úgâ}ày‘§èÆ?ÖzßûÈ™ä¨hz ê(’¤zjA‘{ؽë6pžDý`;ò}¤,¤#ûaîۛ䈗Ô@>úp¼RàÞÜFMGʵqÔ‹±Pàyqa 7Xw½àŒÀ‘a~g2Z)WëF1^=„ç7‘¿ïÚFS·‡û…¹Š%´Œwnõ/â0oœ'o?™’_¼EñíژūÇÍô +’OÖˆ{‚ÅíÎï¥àd3Rõxò×üjMí2ú_ÀÍW´u„ ž%m¼bì¦!À7oãÍFºÙ¡\.n”g‘VàH&;ò‚„:}¥ü~„ÍÍY´Á=YËU™·ý1¾>li8gqŽVâ-⢅±$‚wàú<ˆ‹¬£zÉÄâ1J#e_¾A™ž ‹¸ø¥£{];“n,éÃ,4NãA;Ÿ ,ù7zñ·kñWä÷ß½x©Ê(ßH€X­¸†|qÉDÝ…ÆïxÅkÉĦ*Rª”õ¦HƒþØŸ EŽGtègt¢Ö9ùb¢§w†2ì:40M'ÓzþJŒê\mSÈÔ”Rð«æ:zô3J˜ÄÄo Ä;:ÑdQ’8×åv¢aOù‰L4O!3ÑøxçO@Ccó1̇‡@&z r©>H‰nªr +ŽV¿?°¾¨Hàn ⃔Õþ#ªýÛ¢5>‰öèÍ/ÛÂüãd¢vl:Gf3}#ýyÜcÌÕ&¢ &~¾ü&šýBæP• á L Ë0¯ä´ò&ª8 #ù L4ù ‹M$çȘHÃiAù|9-L,݉Q«<éªÀD—Ð0^ȹž}óIãêñp×ÑÖ%—Ú¬T¼D¿KΓh)ü©WÍœÙðÓX˜DËw9=¦&R²L¢­ÓÝÆ$úº÷Ò¸|mL¢3]TƒCýÀ$ºoˆo^°‚ܘDNFÏÙpZçµ0‰4äSìÔ|N)Þzç%mòä93œ77Q•¯ÑJJjÞÜDgƒ¡ŒPÓ›hÊ,ic¸¹‰Œ*ó;Z™w]Ð›Ãæ\ Ó&rŽn¢¦¬HÈÑÕ »¹‰!-ä4 o~"iØ5¹dšŸüD}z±HÃ4—A‘†P[Ž.ÜÅHë–Hë^!§ãbüB“¿ Š6¨¬Lmù&(z¸r=Á‰Hd¼fëÌÿ œ(»&Ù€~ÝäDÞá¯Óæ 9·'9Åîa¢÷ +C°›œ¨²Æo9/ Ž/7 U½B.l¤RÔ^½ê_ÁHÀ:™øëm,™|\†ô¹Šdæ}"(ãàr>Š´ðjm®7õL•¡ˆC»T¯9Ûœ¹n–"ŠŽ˜ ñ)–¢ŒcQè°GÝ,E°•¬äÍR´£ÙÐÐÙ=XŠ£«Š…ÄŠ=âb)†cú&(zžR?ÂFæEPLq¢ÔA®ÖÇ&(âyo›£m‚¢Œöà&ª%I!Y dnn¢ßY +€º467*KÇ}ªÏ-ד›HkœûqmnbÒ­›ï_µçÍM´AmÅÜËŒôÄ&ÒX¼mqn»Úæ&ú./ð|WOçæ&zªãµQÏOp"2!g:²X)ßàDîΓAƒð>ú&(~5Œp.«Ç;‡ÑâŸöëgú¢…VθÓçq<ð‹H­ 0IÖ3þ“è‹&!ÞymÎðßúÃh¦Vç$à5éÃèî”⢎ÉímёΟ«¸ÿ~b Н¯yš/èânø‘µøjý@,^-\¾‹¿ £ü7Üh~ ñNT «Á´AŠ— +Ìþâ'¶°*zb[„Å7-±E™ö†$Ž06|²ç‹]<ßBް>Û$Dºã€8Äv¾½§kgrÓGX]=i‡xY²aÓYˆ–Æ9$C‡dêÁ6¤xÛA<؆djH»ÝпÓòŠþ$òâCÒJÇ [H¡>ãÀƒVH¡wèYRÈß!e H!càò`J•Äcp! )eçvÚgG©kû ªÄ87€2m=ø–› PÔî up¿1‹fbæXÚ,È`&þ$ ² +GöqI£\¼9‚0p°®}òs}ÎÆRWN¥Ñ6[àß'-WѪܔÀœ#|¾)™ PÎpÀ|Y'(uŠžûŽAGGÄðA,>×ÿ™µ¹òæýß5ŒùÎù#d¿È­˪rAýÚ§ö`ùñbQ°›FÞtiU»Ò{†á¯'°¯öõË-NŸn‹w±ì½ºè*z]ÓÈ Æ‡ö“ÜÊÍàc¿ÅÃù@ï‘Á£~å&î!P\ª;ÃìÁ×Càw–MÕãOv¤7M÷p>hzè‚Ïð` +7¤yR% zÚ»ôeðÎÌãKâòp£ò¸>G+±FÞ‹áƒG²(×ÍÅS‡œ<Å@mY>(xMøü¹áw·iÙͼkËñº#_(¸oî¶óÔÛåe—öÛQAC4ûæÙA;Ã4naìH!2è>èuú€‚2]jü¶ïfÕU+ÆQÇ‹8ƒÝd:ì?1²¸t|R +È‹CW¬]Ï?Ç*úySç°Z)ד5§°²½sØ´ò-¶Wûë”ãE2Ø7JRà› —WÿA»íwopc_»ÀqüɶøŒã’°[¹9q¹-åâÃååøÀÂa.¢ÑL-ä3¦–‡y âƒýfåû"»1H…ÃþµIoHŒZòÝε`¸ùnüFÛX7þÆÅâs;K˜¢mŠ[Y7PÀÛªÐù„¶‘¬_^-²Ú,8n/D›ÈQŸd¶ù¢áÛN¦š“èÄFdœâÄvég—^üµ¢çÓ »ÆpÃ7ÚZL톬¥5§.¶Úˆ2àZ-J™Ó&ª ïæºAjÌš~åw~¦Ž(Žô‰&›¿A)›H†úã¨D榑5Æ@vè<Ýó‘1QX|Ç=·búBŽ…¶-^õÆà… &/ÄØ×Òøß~õ͘ÚcñB‹!Û㺉b· ÷ C—aíÈ;?ŒÐK¬†ËÙ›V—ÑÏÆuE¡É2)¼VøÝjþîýƒVÏðx¾`ˆ_HÃÞÜ/ P[yâ¾êrNº“høe3"Þ”.üJ—ôâÅôi«||‘pˆ×!œ“ðô%5úwñ¢kàîâï²)²:ð{pÉz`ºHø1;Þt.ÌÄB­NèBÐJÄ'>i7¼ó“^/@©-Ü/‚ »fã?â’”Ÿú¶JÅÜ7+à“T®p‹ýD¢&oŸT$«Wlö…ÄŽí¼!I_$2Ýá‚õ@*ã&R|ʈqîgàQM1-~qŽÔò© îað7BPÂÞð¦¹í\½Qü&Y2¤-³Äb ¯ ú`•3”Ï_ #6yÁü]Tˆs¤8Y4äsáÞAEå où¡¨`Äᩊ"Ùý}® ÿôo¾úüÿÁDÿýÀD$Y¦“dšò1Ýá3W µ—…*²ò7º„ wá†÷Ð6sHR39t.µÇÚØc4„¯” ÙOH=½‰Yæý`vŽ˜äÆ’uÍ—Z!eœ*µN²³Æ‘ Ézvu@ÊÔ,U,Cx&Èa²ÜŸ+cl1TK¡çDª“zà»Ö&”41{XfØü„ŽÿVe…-ž°G!b«"l’‡’¿{æ´ìcA2QK qç°p4×2½¬qAϪ!¡ÈÉcKn»T]¤¤–@^[ûã'(Ù@üsý +)F7 ŠZ¼ß姪ÓàE˜š *m( 3E6ŠˆÎsõ(òI¯ë¶Kš_=‹i ÎtT?©K÷cùð²9V$/{¡D¬òP:šYk–d»‰°Õ-_üdTŸÚH±ë!¶1qTµ¨œÓø\{‡~Gp#¨[é)À­¥¹;¿“쟽X·ÎɧúQmÎÍÂwnu{˜Ï-:Âä +¹ +LLÚ=zPô:{8íO²Z'áô9[çNß/û(¡AlÎý?ŸPDÂ)sàuóÜ…¼d²v1TLù+d; ‘iô]„°Ž(÷+\!ž;âõTA ˆãañ Ψ5'ƒà‰žÌ÷Ï3´9?¨4!Ê$Ræ¯Q°Àt6ÔU Þôµkÿ1øëHF¨|¤d$ŸÞ†Ìà ÇÅÄŽ‘Q­?*qਲ਼Ûy¬Q[ñýìÆöÂ)$˜=ÌÉ©/ !Çëðê\Ä$_¯Ho ~²w\È^^éÕ-Õæ@ºo>ý¸|œ·dïS ¶}þÙkñü‹ '¶Ê¬0;äùãÌ•Ð;c‘ø ‹Áèqn($ ãâãÍEŽ^©YvŸéqähSqQKÙ:†ÙƒB“è{ž_SÀâôîeÑxÒ’MÍd.áâùD#ÈÓw&ïö‚onòâOzá'e]'+,¥õ|©1}·¶¥ÛÜàÄ…Éák§µ¨²ÄÖ»)‹cÄq + +ý?¼ˆó‡?|œ¼i;ÂÂ,ðy>|—ê¼²îî+œÃ 1TH†ìüÊÔœ—xrãÖëI‡/Ë3äÏä¯Îo¼ ôž7µ+ŽÊ²Î^¦M°Å°k~6:©×a±°c‰Ö­~ŸÎßÞ÷/žŒ9ž­ÁþˆÁÓù__œ{.Å I[BÈØsé¤læö<"­/pÍu;ºBâ¤À±DŒo@°ˆYxþ"E­ÖЬ3˽õPÕõPñ#½f6œ§>jɯ/ãüB7rýs$hH·<'Þ5\°cp@Ñç\ÂÅ"sAc¨ðdæ¦ÙMJ?£raö¨Ûˆšnâk>-q w³[cYÉ·òV.+^h¤xˆ,6=ðð¡Ç)zèùÍ: ÜÑ0ÕsM&³ÝÂ%j7º<í¹IBEERröœÀUˆã¸&0Ø9åð[¬ÙíÞ/&}Mß)ć”·gLr1ôH_‰öUN¤+°‚7pBÔ“Ì=â\³Å²ïÚ‹£\m±¬™öY^Ë×®'­½{|5R-¯Å°U”îóõ2˜Ÿ°{î%Ž;xtnelû2ºõytkšÝØ ­êì&\ ÿÑOfý5æýÝ׺ØMjÄ~êZ'Ïìý^+¾Kðý\lGBö I!»ßpÆYU‡óÙ¹BN6ÜRpñOÖɸýϽìP•®;ùÏj-ýZ‚¨M(ÑzU§F㢠Ùê3~±™Wø‹Ö¹:´b•ZÓ+ "ç/„­â½]ë1"4bU.@~qb5ü±4¨ 7ÑbŽq§·>¿X¹bE5ÏIÕåŠÃ=Ûößhc{¾K‡Ïëݰ>]Z´£å©é\}‹âµï?WT¨a["XJcÜ±¢¡Û!»mm¶1-·u¢ÔÑr¢‰á× %F¼³GŒë9ÊÝÓ6gŽ2ýuFü.Љú b–+ôìmÎgJ`¯V¯k[›P/,AS®ëÂ¦ŽŸ… +Š ø3‰ ðu9SêÌϰvÅæÖßw0&ÍEw‹‚$»`ž·ÿ(aÁÑë&&*¤ µcøôbÀ1Œµ9™.}Y­,éØJÂ?ze·W1¯[V|Œ*Ú‡–ü Òæ|;K¤¸»¹GšÝBy@7Î Úå4Xde¹‹XH“è§ÁàÖ‹[íqèíÚOÌkï¬ô½b“Ûã¬ãn¸Qäø”“ôpŽÄzä¶+;ýÒƒ--»`Ÿ|ÄÈã²Ý)ÃÍòüÄÜW¢C»åFyšÒS½²y—Ñâ"·n£± ¦æmþ>¸—ï+ÂPWvãÐøý‡‘ÄglÆ‚õ n”ïJ‰°9ÕßÕçF0гÓµ/ÔmK)ê“XÊœî£iÄì9WYo6¬ ZS£ iÊP¥üxÒ—ˆjŒÆ¸‰š› +Äœ—eSCý_¿#†ªJ–'G¯Æ?{á5íÕ¡NØ«Ã^ïÇÉYp<4~Ðtm“j„5ІzweÒÕü䔼óM÷¶¤²Ý™Ãw3ÆX3[0LÃßÒpÖ\ɲ«ÔàÚ2“²ŸòS,8ȺÄ4vdn$+ + rŤ—ú<媈u¶sIC …ÃáÀíhŽs—w6Ž'½ñ0t‘f:IãæËXÝ·ºŠÆ?0U‹n«Þg΄UräŽf„(vе;wýŒuÊ` 6°›ñAÛM?˜l܉턭Ãr¾ =äòýµª³Çº=½9³ª+ñ <#ƒt$÷·{§ÙãØš¯ ÃF¥Ô€ –ÞÒ/˜JÜCÚ½/‡ÖqIk +f}(Ž­ø\aÊ‹Â#öXK=ƒVQ†´ˆ]ÚŠÌ™¬/4UœÃ¯ˆÏ®6ûíeÈÐÎíà¡Þ­¸Æ“»ìÂH¹²D…àrÕk¡eÞÎOP²9#™Ï˱ö²®Ôæ2?ïúh4,M6H5fM/g3Ò6#d+БT§`Oþó—]@Úäÿ¼—µ¬AŠ^UGH7}:tŸUæ[’L¸Ê +ƒÉvþ%;ÊsH—›+áèqņ›0Éþ¨k'=,¹Ü*í£ö­Eí[hÎ4Š8õlûìÃÄ´šÝ×ê³×X9S¥q%"Þzc›ÁLŸPIEyî(Žïö5n® t‡–¯£¬`«‹yG@¢útŽ&û‡Q/²>à³µÖÅ;œe‚˜æyâ¹Á™™‚›©ÛòÃ`†5;;^x%õUO‰.x6<ÂθâÊ0–…¼À¬Þ:qw„ C‰4ä@\í¸qFÜâ¹—µ=F°öf·|¦¸ƒ×hÐE’F¦¼ƒªõžŽ¢éžj@mhPDÌöá³·’¬Z׸­Œ¶m!®xØ8ÚE"lÕg´Å:†(ÕVz *ÿ„ƨÇvÈUr‹¥pÖ"ÊüÄ©¡@‡E„ÂEL=Haƒx’Š1V»[ë2Ÿ³of´ ›‰£ +Û©‚ƲÑ]}eÄ¡ ÏíÁe žÏ9'×+ÍœNÎ$¬®^2˜h fJ%A¡¼|°íQsô°]³¨e-ç% ˆûÛ´Lˆ³Pûß·ÉÊç¹*n5S¡GTht Æ„_¨¶ @Z +;-–=Ãõ™ŠÈl;;L‘LÃèârŽ…Ë¹b$6ãâ¿ñcÌ_ÞÃ2A6㔬£ñÌa|Ж ‰‘×óõPò[±w:ÄÜ"„Ô˜÷KÄ÷ŸœÑ„™Il›ó¢åœ‹„Xæv£-±VÃ8L1¡­µ ktNÕ¡û—˜(óœ¤X<•#\æMŒëób§ºÜC5ûã‚O¾³ý&#ÊØ‰:êk ~âÜ2:`Ò-¹k†×òÞ7ëÍlÏÀ#"uŽÿAwÄØÌ˜Èii-%eÄøf<«^ŸTzlLJVSDm ˜ä0Y2T—2Dƒ‚/›—fÞÆë›Äxv8öB©1¡[WüF½,2î%Áu> ªH[%1¶¶Øéš¬Ÿ',C7¤Ä”­,º«i¾ºé›ÝÔðXàâìkl®~fîuc ® +OHxœt¢fåµHŽqdÞðÿÓí+}fíÁƒÏ  ‡%¼,׿Y΀EÝfÍæLØB¦½–(K:5߆»9rd}ßEk¼­µ8£ÃìóVÏe9êÎ9 .¬±¬kì\žcdŠHWFÔÜĈs4ºI¦2\™“²[ü~[Ì@G•¾îÊk“Ïæ4v¹IµÄ08±»ôCqOòýŠ5;: X…·áìß ;g`åö÷Û^ŸËRËBûØCí +] ø)tÙ[ú»!¿5YŽQTÞÌ-ÏbÁ´Ÿü³!ÒWTõlRGæh›"ã|Æ2…ÙE„SOT׬ôÆ\V‡~`Q NV£l·0} b~Þ#ÿœ\ÏÓ·ØPï»”½,>L§Îl¹ „±ò{H¢‡ÃÛ¼ JfíAF‹ëžŽýQ-Ö¾YáìyFÞ&-ž,\-ÔVŒ@ÔqÁ-у…=ð¾ñ÷á¹›=Zº­4ü2$ïø2Hár…èÜ{àôâq܈–Ãîºl|'Ë^¹õ‘_7&åstmÇ=Ïú*A?^%•ÄÓV¡¾Ío÷Äp­RÆsh/¾ ¬|®bFNøX§ãÛÉ{è‚U ­yó¼ù½ ÂÕ3Hó +È›8Kø§—µ(áÛhŠ…ªT$N˜ 9›Î^ÞUÌÿÜUã.}uÄ@ë\Äárq¯Ó +ÃMqŠ¡·B5â6÷K`•µ¾`XòrõŒ²´™¿·gm}_¿#bÈ(Ù´» Ûˆn…Ý +=L(%âæ*$sR40>Ò îÊ9ôâËÌ'5]¯O0‚Ó½EÏL•¨pѳôr÷²#'S%ñ¨Œ‘ÍX_ƒ`eåÚáêvس<×ß|á¼þ Kv³ò‡,¶JÊr&} &R¼XÄB^ëô.T‰wãYßT4š×ãû«èFÆ•+ê«à¶Æ=%`NÃK–EKÒЯ­dÉ¡¤xÕ&­Ciê)*•$áa‹Ìy;èaRãØ°Û#©»™kn~.Œ!_¢“ô@‘žÑ¨ò@ +ËßÎ`TŒè7{01Ò£…-zö€Ë=aóÑÇÏ´`$S8zâ”Åošq°ŠKT|/D…bçÐò±˜.ÄýURõtøQfq+[úr+ +p¾3FèLÆgöÑc"Q:§„¼Ë¦îX¥JVˆÖ˜Iêl/¢.‹h—-ýÛª0œHµl¾M³&’jÈìÁnjö`nÏ…QG Á6eLÐßÏ·OÐjhvƒ¥h7­8Q +Zp­À=ŽÐTº<ÇUµ+g° +¼ùI¬ðéÑNˆWíõ¡< +åB‹µÎ”h;‚iVA*™ºòÇ$LQ8ŽxØÙªÂúˆÐ—oðÄÜK4ãÈsã‡á÷c°̃ì¥`´w†”z~V»b|©¤÷ùù ì!²› ð+ôg&r…Hl/„ãÖzóOŽ^h„˜•Ø"zº–¨8. Ãyä¸uîúÒV{˜i-.©÷#8»¡ñ?b®RT%aÍÝ=ÏCÝ!Ñçà´RŸð9Jý¼t[¶Š5´l„.DÕ5i#‡j¡¬íeÉÑ™š²^kP Džë€7‘_‰ƒUp\ûsáçÓÕXÜ«Pwøk}œþfÊ‘¹Æ€{î9„/Qû’dç-! lÝÝ-_Ê4E™»´ºÖt„Yt¡ˆ“µh¼¡?$=¬â¾Ë$|Ï-^O=.§ë=~ö—È+¡£BÑF|€ j~w\=…¡ <œè Ï€òi‡9íøU ¿¯çê±U~!Ñ¢l ¼ï˜Å“Ý.€E!e.E)³VÇ*@)ƒá§:¶ Ÿ™ƒ˜Y\W­§çX;¿çí¨V¸ÇB‡Ôya«“7÷‹Ù¬ß¸b)YÉÊJ)©b|Q4…ú+5¿ç¹v›ó9ªR®Ós±\¦NôPlW]1ÎkNÏÔßnñoáÇ]^H7ƺEÆxäp>çŒðx>õ49=PH;8gÙ¯ßÁ˜tæÌcÆG^úËLÒê5yëÍ>¯Ì¡@‰Ú# 0˜]*R„«¤xåÏËeÕ…Xsµ›Š.ÌY ߨ2¾£÷sE.i®™rèXc+xèìaj—˸'º2ÄT%‰o=Škùf”øûÖÊ Øœ/vëu‰‡×ª:¢S›ÔÜØfŠ ˜)w?=DX„“͵ÑÃJ Ð7ãmYíÜ1»¥ðĈrßSËœì9¡Íë;Ì{OP{¤hð\fñ­•Xhë6ǯ‡H޶i-‘Ì–Ðí\‚]DϱZ}ÍrÈÍñƒëTÈBªÝu*¶²LãýgOˆµ +I æ`ÎÁmMÁg¸Úƒ«ãw`ýF|4„í¤ýv¿?¡DDŽD`e Ær=90ž0Z¹ZŽ™zGNé­\­¹Gà;•²*rH3r=×!ºvµ+0àÁ H„dCÓʆ»€3‘ tÆžúŠ×Ut/ÀæÕ¤4•¹Cœ¶ NÊ"<§k©j¾ÄÖK]mb)åû¯ù¨Ì÷[š¦Ì:Š’W;P¶f‡æ^!0J{ûrt»b±àÅF„y²K¬KÔ5; ¹ÇÔÙƒ¹Ø¦õçWIõˆ“mµ( +çZߟ”Âwz>ªý"ú”Q-¤õþè‘©c3žÉ>»ÜŒcÄ:dN5{'gEjò8‚èUFæ=T…ç Ó£¤8N+Æ=ÂBùÏGNߢ¬,A‰n<þóX ­lº +[õeÕ€‘Û½ÎM™XTZÊ©G¥Z’f0ƒª…ÛŠ¾p e÷A ”âŠ×A¤2â +‰óöö$)y¹–­î TÔ¸˜%ÿBÑ-©–Rtž¼…=bOЈ@-1±¦Š¬g‡D4ΪvSdÔ[«Óëòá>Ö;ú3N”™K»naбj´SŽstTªÌ ÷æƒ0Íæ«TªÜeʰv R šdYU9­.G÷Aä{[T–¥ö†hRTs…7˜_!ï Š”µ~æ}n“sZzÉzÉÊÊÁoª© ªz|;cO;ðܘ=JhÃ?zÄžã!bF‘/ý¡j’¨h'Ò±rNFsé5LNPHà[ðº¢ì·(7eßõ çzµ±™ Z,®)TJ¡o·$²6C¡Q|§üî²G¥¼JB-Q¡ÏÞÍÔËO[M6MѰu½Ç*Y¥º#_KÕŸ•Ò×Üû÷ÛSsV•Ÿ„€šõ;ÿµOµÆ|€U­a3¦pÞÇ^>é¡O£dTÇ^`ÙõJŠÂ?VÐ!džNFÙûzÿŲ"äúëST¥ýùÝ‹È-"…²©¾»õX¶ò$Ù]¿¯ ߟÑ?„ý=Û2j>/ÎÆÙ¿Ö-•—“ŒgúñýZ "}8ÌVrçe'enã‡JQ[ øv÷~t+k#Q—Õ¾H?§†²*¿ÔJÍyîRßYWÜ£b‚ñ*ó¥ðåŒÖËŒŠ¦¦¼. +.ÅQ¢¨:Ô¼"âÖ;ŠÚ°^«ÎëޝûÂýö +‘»ë_Ʋ>˜ïç¼ìq²Ø˜=š?ÏXÎ>•¢¤#¯gôxÕ¯ ˜ëÚe€:£›õ%ˆâJ(8‡{à9WéQsî¡«‚eƒHd{è"Ù†Ò.tÑiNS7µZÝ/ÛйŒ<ÆQL¤«¢jô8¢Ç…H¤jmªt{\#*þŠébâ8 +å7ñV‚›´*NáVUäJõˆ‚ƨË.†;¢ ^yêܦ¦Ń¡’/k`×úóE$¹¾>*ÊÃÒ*û¹ð]‹O/|œâ:3o—ÕÑ‘¢Ë+«˜S`öæv-eñ\†™"+]»&õ¬{ÔwU‰•t¨‰›CP_ŠX'/–ãÞÝÂï_ç8žÚ*MOYÁ5d7i(¾ª¥j”ô(2'BÃsY"E²JäGó‹¼,úõxÙ_áˆd·Ý”4æÅ™H(„R|T²”2¥Ñ<;ÏIÑ[âGUvWŽJy«Êúr¸žÝ¨ Šn5DnV}.¼§`U×\(ú ÒëDiJj^e.)Œv +=ê‡Qþ§Ðæ‡D=X +õ¶E<ò„”HÝRM–âÎóqL†üd®Í^õe‹²~ž[+KióÂ`y˜žrÌ}e à;˔ȱFŸޏ`Øcy%ZÚ²8ü§Ê‹Ðäu9ãºÔ+ü«, ø¤¡ Â?çPìæÊ:k}«ñ¯P\ÚP°m\ꃺah´&fˆÇò»º$}¡®©ñþ „n±éA.óK),ýé¼È³G­¯y¼¬"@")üú+)cª0¢âX­ý\7 PÝÐR¨ó|M®¯Ç¢Ä¼.‰¹‰nOÔI+ƒ§LÍÛŒül© xŽ ²(k$¯Ø×¢o=–¾åÑcͶØ2|ø>еh~••J 8¢›±™5 w"ÿ¢Z>c}­„g ‹¿rÜ`{Ks Ý¢ÈÖuRc)ï)¶r6°e„ºq »›=Îþ¶QLcâðþFÓ;¢ÊÓJ'· qË·fÅ«åÊ"æ$/„+D¹­Q½ÈÇ…"„Ñ–e[°Ðå`£L¬Úh!ä÷gÃY‚|:'Ä~Ükžº]aèdÍDލ•>…Ú–Ü–VŒ]ÌÂ#ŒŒÙƒ ÐoQ«s¦;Ô#cÛ*0Úâ<1·¦çÍÂêÖö)ÂÉ|"iOQ‹F•$ áÛ{®Ô¾­C8Ô£`‡Þu:¼Õ.¨šÚ.']kº<‹TF…ñßÅE‹Öì‘°½ +—N)±ìtçÃe´û\qµm-ü` У[‹º‹õ/ÑÁ›G§M:XLtk½†úôÿÙ£ÊÀ"ò½kE8‘›³;”Â!GÄÐ9bD³Óz†‹´¦ÒÐ=r³(ãzýÚãPh5!Õ  3 i Çsõf<°*2±œâNšSxk«x.(WÙÞÂsÕk‚“´¾_´ºñ¹ê-q·Ä.•ì±|Kîò©ìÁ…N2sUëÒ1–3tŒ;2J,ÇÈŒÏkÝŸ5b<¨Xæëz:!RÌ!§lm}b„ƒÙ#TŠÆþšÆû‹+AT´Når:v7~ÁI3ëæÓ?œQ‘Iú¯þ´ƒa¸÷£%{GtÂxÎÑ H«˜·Å$s‘ÏAøÉá§3ŸîSÝ?!A-Ö_óI8×]ÛN«ºíIwüQ®tJÐ!ýÑD¿O dR—#µÝ ƒ,:íVøG Sé±eE dý¸í¬·  ý£þ3 ñÆw¶ZXè´dH®¢Z¾"$zžlÉçÅÖÁ•‚;|ÝÁûx|GOu•ž8}j¨u¯ß š˜ˆUž›êØ:̹H=ÜW²ª+§5WõùlBZ›|hì‹ÂìdnøÆ­þ£WD›¡uÔ(FTÆ6W2:éÑãúöp†¨KE°#„=%äbìTÈyÐ#ˇð¯·Òë€É–q–3ÍGøXŸ$éÍuFÜkU$0Õö°œ×“JôÎZBžò’/¹ ਧèùË¥ŒEEŒ‘Åí/RóA?JÄŠ–?KÖH×JV]fæ“I¤øO÷pü ımîÖÖF9nŒUÌåóZõ¨P[å¹ΩaV«?Qak! ÃúgxËí5|tku^ØD¼ö +ûª¤Û¹…Ô†橌v_š.âƒ$„ÛRk&|û£ZhOÂòß?MÐØ c‚–®õQÖ74Ya‚êò«0ª +ÛË=O²Iô@d¹Bý#ù\æ°Óô§/‚¿0HUûÏ rìv‹1¬Ð.¯o˜rîeFlà™$v—‰¸²Þ>€¼9Ý©lU?“CG°4AG„¥¸B+ãË›åÍq™šósÈc¶|á•m‰y¹»q‰{”޳—…‚¥sÛr„™23ädÂÞ|‘ +9Ç”tDMÑÔ­„{€Ó-ï&Äš¾Ø|º€yR×wô·¸‚o§Ó <ƒ™(®ÀZQfy2Æ£rL3+ôÊ–-ü ‚…9;¼î+-ÄFàñzTG™àB2LïesÇv0DÄ¢ßa³ ¡õ°ûůÓa{>F#æÞ 4²ÆÍ‡™¹{©–ðÓEý$qÏ'j³ÂÜ«Æê$Ê nsÂoe©^·ùÆÇÁý2|6§&¹¶J!“·å_Jì/ŸÃz…›œÇܽ Dºö¸gƒ¢ Ñ^¸¤j ˜ó)ŒV´záÀjÀº’ŸÈëç[À ­ƒÙ>nJ«æ/\âH’:b ´Ðè š3>A¹Ÿ5!ˆýYÇý‡§¾>Ê’¸Ši'á\¤#ê|l° +UÆüÑ]Õ-5&‘eýFpzÂ\¥ÎgžD’ûw1 ÇOÁLg$oY‘n¿,J‘Ò£r猨±yŠjùq°‚5Vøy¤·X¸øIZã-Óõ`ZâªJ^ADqYÛ°Œ)\šÔçP€Ö[Œñ«DÑùÿÒö6½º$וÞ\€þÃJ–2¾#‡RYnÓ¾jB»%Á0 +4YjÑPUd©ý{dz֎È÷žs‹ì[¤º‘q2óÍŒŒØ±÷ú8štcûA·$bO·A¥ìŽ[e®i¼™"æè¯a:²¨? rÚ=D›`™';g#-Ñ'ä5¹ÀíÌ·„*œWMDŽC¼=@8Ö™]Ëh¹õŽ"#K±µs›©NM(–ì_"b̧fžü”*E +©à&û +ýM´³@Íú +d÷›²p'¿È[Èpmu=$±ÄUièóvÓQ“÷W[ëË–ñj–ñª·¯-wJ(EÉ·>_®`ZêTŠ=ÙŠ=ÎX“("¼ž[ªBÇ~5‡ü“â …%ÀšnR*Ûq%œ Ä-„}g1 íP¨TÞ–oÉ¢èƒÙ(&¡˜Ct±êwW~$Ϫ"Ù.ØËá%ø~A(J ˆq¼H‹ÃJF]…YËgøDñ¬øQaêöÊÿ ñ`¹Þµ_çû)’ÚPlv +‚^p š$ÔIK›OêÏêp»C•1ÜHQ–ë’­ñSHÖ=Mw|q!u:^$;$㨙8ùDBÈÐMGØ» ¹z4™‰éRå²úHmq)A€u»óEøKNÄõZ0¥§/1 eùßœ2.‘2.)XAâ†_Õœð0Š@¢f¦HiÔ¬¢oˆJëëº/UçBOÈ¿jXr¢i§z;*æãÁꯊ¼øÑéÚ%4ÓyUÍ«Œt]´¹û倔€ô²ƒ’¬b YÅj•_ßÂd#kµ%²̨Ö? f#eÒÜÍÕ96ö¼Ø›A¦m"yÕ/Huëë&¥ ½nCd•qUirò³hÊ?¾|BåxHßËrQ9Õ›g|t8mgI¨æÛ_eÅ"áuGÝ\òÐM³’ vð+bɨJÝ+›åÆÖ·fy3u yÉq‚Ÿf-;æ¨Ñ->©ÛÚÐY#°…`çdù«ê`á˜5 åli?#Á×xJeD)›¯òléV·j4ðå‚Ú]£¾uaOÕü®Žõ‘N¤)O{™Q¯‚‹@Øüô'޳æì0>ZU)IÆ¡w{}Hœ£ÑìrÛœ½ÇÙõšÔµPœàMbEžŽ6´3$ $­sIHШ\ðIÞÁ|Ï.þäë²<«¦¾”Þ\å=ü?’Lš *å rsï : ·&v +•1;–+ðЂ¥lí³<~µ±Ë¦Î²f!çžL¯…¹$+Ü£Od(, 1P¸[9±$ë•g»+i7!w7IGÉuSæýÒEž-J²¯/ ùüÊ ÐcÌ­ÎÚC5¿Ð‚|Žcú͆ßTøD9òáÙÜdx¤ +|¥ù¢VãOyÜJ ‘ãœÌ»;‡á±)ºizÐH+Á_ã#YkŽn´O“˜æGb* ;ŽWÒÃIEHð¤H +1™×k¯î‰Ç÷ÌêRMa“ìaÒélQØ?ž—z?2'd'â´‹…\G“‹ VÅn«l‚¾ÛݦàPC²Õ¿5á¼× QhÕ“V’‘îAf³*OÞ®Ѓ¨”n3—¢xÀ•úAç‚©~T˜´þn²ÜSߨéµà\þ²å/î¸ÆþOyàrÁxÜ'âÝ w„ˆ§Üùn‘-Ú Ä¯»?ÈtÁ¨=$Þ`±rÕâ-É—ø}Ø +w™e~áïߥw©ÀÇ5^¨ën•SJŒìifðulHÃY@„±î¬’ꩪ¾Ð—A:š°,¾¦¯HÄ;T±UÄ6AÆñ Avi~ë¢<¨›ä#ùê,“.º©GQ‚ö¢•R=ßLVv$Ž¡ÀþS—º¶Ëš §/%Õ­¤|…æ[ 1ùÔe—ˤ¼ÝùÂLeºÛá/4Û¬•"¾Þo>€j¶ÈµXÜ”½J±Ö·€P艸÷¾‡Œ+F}Òw AÚYŒ¼½ˆ—÷ ö*ø¤‰I]ŠÐbˆH0yF›Ë#a{èÙÁöf¯íÉ+À4£¯{ðÖa­îX5sH¬MñAõ4ȶÈ4€/Ù8Hÿ¶ûfÕT¾&7iÍÍlÊìc'œI'Ë e­ Ú6ß— :à`ˆB8ÄU*Ñæíb°P® ®K6XŠtu›Q(C;ØRðÎ¥º˜%k¾iÝ—Rbz]jNA]-©Èo¡È`H ón `eUÁ–Ú%÷·ábþ-Ðhë9ìékß1œî÷ZLã6FrãP´Èß9=õ°(u÷•OéÁv Ê¡«ÜÄr©ÞKq Wc:¯dGÔöjRW€ ~qz-kÃòdgIMÊ2€¼ê4FSó¦ì…)=&td«J!÷vI­:ò4[eDœj©„cð{‰®Y(Ö " f¨±‚ô2¾²yÛ›¥.ÓM¸Br­©.Kòf€¬€•Šãþ-ÅE0˜ÚMß±­nI<%ŒÏ©šЀúF¤8UÚFp Çhܰ³‘@Z `ó>æl18FÜ,†pÚ‘Œ‰{Vj‘Š“ojÿ Ö«$±¸²8\J +¿ô ßKRõ˜Ï +a‹,´&±bï*¾ 5nö®¢oRÂÏ{}ä(ÕÛfV–ü6˜ÚÈñ†HÑŽSÄ9Á9i­7!þÚÄa5âçFæPùËaD‰ª€kšÓSéâÞðPu›]æÐ¡s”9Jü˜YžÍ(«ZŒz`èôA†×§(b=(èÓCê²Ú®ë£Îy½\AÙ8…›î%Εþœ‹o¸à85 Ÿb{&õPÑŠ‰¾ø/]𽤚§oU-cNLˆ!s¾”_Ðçæ—ÁõûßÓÈ´#ƒ/?·»¾wr!5-…“[Ø K[œbY¨¨*Œª¦ô°Þ÷ˆÉj:?—“œ5?œ¨4‹0TÄÿ\ǹyö]ã ð“"³Œ¼R;óî»^w äíµÂ ‚×zÅ C“kØm_1¾¿ÊFßS•ùEík‰H‡]UCê×ËLh ‘Ü>¡X#$,!4Kž¬.?ANd”x÷¾ª¿ *  ´{Œ0/u¨€Uÿ¹8N²Àóy®  °JaÎ=x뽜éz(üÜ"¢Šs5Ú²7nÃüQIŠçËÈŠVV”®'Dä[s@ri±¯pYЮ¬“³9]^Ð$D3ô„ñ-ø;ÜÜ‘©ÊÄŽ7ÖᙤYºNʽ´€à•ôk©]Uo¶,ܹ„( ÑOÆ;¥ï~9þ×´ +_\-ArÔ'+öâNÎqT›©"§oDþUu9Ó¾n3‹øv÷HfK}Dd›‡8?k°÷-V!͇4^9H²ˆç>DnšŒ—®?×Þfý9‘¦É’ü6T_©9å ÍóPŽ®à¶Álœi­c4Ö7‘<±êá–fqì(Ôà‚if3©é[D“Ž´´çÛ“bò3úå:%SAŽ:D]œâZ»±°ÄÈè{%)+øE™Ûß±Û¥¬—Ê+ÙØ;Ɔõ&¹€U€DxÉÚ Èlbi:‰“ˆØ\]ÞÎ2Tgß2zMö±TGð¥ÎŽ^Á3=4ÊɃßÁ,tðºÞù¼LêbQ·  æ  8¢ Læ·åȕь‚Ýf¯!c“,c£ä‰½RÓÂS±„¤âRþ^Ö9®üÈ*yJSGij*ýXʃŒc²Û·æ8Dˆ‰¡l$’04lÜ>~éF3Ë +sÍ^Xd÷¼d 7 ˜ŒýL° Þi¡á‹š½ŠœCzÇÓ¹<×,çÑÚR­³E©»RÇ<PÈÝ(ä,‘Ø—†\¥"yIlüý=»‡ŒÂrÐì}¾þa®“«QkkÕrˆ„J˜¥£FDîM«Û8·5q94"+ -r[÷lwÖÐÑÓ@… »;é%ÎÛëeKvAÀ·Kx7Xº˜êÙ¿ùh&ƒF’ä)l$6{zpÙ.m_ŸÈ *-«šÀ£Œ1Th­Ðo?ŸC1¨#ÑßBý›‘ Ö³’«[šÝ&=¦„ rùâBq@¦XO'¿7¡®H ‚-x~LÑÖp#Tenˆ½¼_><šiZ0™{¤ë+޼Dîñxg°= kÖ+žDþ¦¤··NO,¾»MO&;Ÿ!`‹¸¢`8ÄxÌÚQ-—^ȋᴠqÈ±Š‚ÆD-€ÕÚ“^¡ëºöÞðBºñ&`G)^ƒØZ¨p+¢®'ôˆËdÚDÞS)´Q.P"^¸º-9IŽ^N ®°£I¹¬wÞ«ÜlÒöç%`¬×‹ð«PxÎJ15GK-jw54WÙŠ¤Ë8`¸rËá/åÔƒeW75ç>T?I!ƒªrEå VO @(èö²ÿJvà°¢EtªòXÐP¼­×,²=æÞŽÊõ»ÈÀ‹â›õ£Íùɘì&‹†‹a+®|œ¨ç&ˆÎÚp77å€-ÌC“k1GLi1ÐÖÛ¾7èe +Ó=E7ÛrtH²å™a ?{.–Ìý +l5\„DÔE$Ž@ÐM@½>m½îrªÎHˆ­«E÷¨ñ Éä"EìsÜ÷s©1Ū Ò»¢Ë9/.|I¾¿ûDÆÎM=4õèB¡`´KIQ%Í¡óQ®î-èדHÑ„è%›n ºè3r0–zü M[&È«·÷–Á§ª¬Z_ õä»ß¨¤k»@Ck£Ò,T/ñ¦ðž‚ .$I'°Lšk%Öq‰6ÑÚ.ÅQéÿÚµµà"ÒK¼Ïj¯FucÁÅÅ¿ÈnÜ£<Ž |Ê<`YJà[¸WÚÕã9¯l(Z ZɺìÙ‹ÁxBCÒ#¸FÊ™v69ÅäRMn%Êë]~W‡ò ˜U‹.¹q£´n­f›±#B1 B¡V½€Iu¨<&í¿«· Ÿ(â#øbÈ>­#.Æõe°·t•b€j_ +ÕÝÂÐû‚TØÜÈIÉ\!1k‘=)Ç"ò²ý‹M5º !\U± ªe‘¢Ìkeã"&NÅ™$zˆL -U7“]€eäõþÊ^â/²9öì+U]Ø–Æ-k ãT„º7µ˜ÇÚâflu!1©})!Rr6"%›•£B ¾¡Bø|tHËÎø;ÅfB$ (%·|øÅòX ÷úëÜn.£c¼3íŒÄ $–£åºwôØÊÀRw‘ãn&æµíÐóÉ'»?€Y›Óö†rþ‚H-èZ&dyZ£VÑållª5´võèwXé×g²/þêøtê +Ç@‘Ng»ÃŸ}¨:·¿ËÖ²_=,_Ž—šì„Pé’Æÿí<“zì)ô%$Y†~ö$T‘ãÕL­žXéBX¾§”™.Þê¼Ìêü…Ö!¤¡% ûh¼³Z©D•H>lW ×qÕ`AoÉËÌš,à .D5 +#J¯I“7M•̘Y‘F=²  ÍbÃ6k‚³ŸhL¥BwóË;‹ ìÿ†3æ°sLÍ à:¬ÂšÀ¯ãcWÃÙ¬­ºÓ"2÷a¶E·ÏpÛðtM%á³ Zpg÷0ÔÁ¥`’¬GÞ¼ûw¦ùnIQî(á ®„™õ–ü݈IºÔ?…€+᎚‡8ÄTÒgnþ)k”\žülRpAÇ @º¶ ¢f[˜UûîiUëR/)ñSzü”#Þ/€;ÉÎz¸e³®B¼¾b¸£ +Vöû20OŽx51¢Ö®\ºÏ!Ðè`ª/Ï¥jòC·{Û¡kÆÂÎc] ±‚JB«] ÅÕ,ͦ®ãX¬Èõ deXªCÙy¼]gµF½ç“ÛÔé㨔©Ì˜§¬ eÝt—›E˜ýv© »˜²¦±ˆ)ˆ™—(f=ÝÔBëw½‰k¤ÈëÊÕ£Gêê!¿€ Ì*êV8R·KÌçâ9ò¥‰IýMà2š#I®Fص W‹–‚B–ˬØ-i;ÂA£û“´A¨8¸i·¼¬=›Ëˆ!ËèLÁÏÅ O¾]žü$†¢šÅ‘(Ƥ’Ý:Qs‰ [Ž]± ¼EæuÂöZe‚Ó{ÃjJÐ?ØQâaÞnŽ +M)^f±…}Åðã¸fXÂû&%&&TÑY݃¹“%”,Ìÿ@œüL(t›Xl®ÙNð\ö$Н¹þð¥$ã þByô¯¡ˆuqÍÜCZrͺ{ôa. aé€dµ ªþ5.¥Ì?Þ¾¹Ü(·”ùà: +í¡æ¡úê;ÅÉÓÈø¾Ë¼¹ÙPOüšµ»@^µéN×Â3ƒ<ìJ#áÚ"SnJû +µ‡ Õ”ÙG†m¶)M”±Kƒ¶\I=`”†oJ-öMÙ{²ð~PÈOu‹¹é(h3éX ÇÙ— HkC¯isõh6f¹Â?§»ü¤ßAhõÀÑ=ÒË[p +„øbè‰Jϵ#}œ"9£½íŠìkò‚Äõ.+Öp!¬þfðÐT¾˜ö‚mö‚ÕR‰è§<Ã;þéƒo]á’ö ê6R-²údçµigÚô":SòÛ¬Ýk@È­<‡°i_³Œ€ý¨:PÁXH—m"â­ÞÓ°GorˆöCBr}8¥r¢ŸˆŒØÔ¶·Uí´é–­È‰¡‘±U‡@xºÃå¿ÔʲÄ”-h“Z6Ûaú&–&â‡M¯{šFÔè• Õ'1ÚúIv»úÃùÒÿ 9Z)¹˜ÇNÉY¸1ú¾…1 Ý*»íÝqújr±-²©o>èý +¼®Pd»‰çŒÚ‘ l“ÅÖÙÍ_!À†€‚”ÈjËIˆÞüì[rJècW÷PE¥iBuëMî$ÅTË!±?+/ñpÖ^}Eô•W;Óí’Yt2z¯ñý5ŸH&ªÈæi(¼YPÆíZk­ÏhèAë”gƒ0:ÃJÌPP$˜EU•ãî¸!IF¼QZ*N¥­u…Ç}ƒÕD·é¦‘Cž|Iü‘•(`¥F£b¸Þ*ëP–º&Oªv9ã2g ) ++ÂÅŸÝÃo<»Á {§ÆVBØJpÔ¡ä—;…Å0ö&‘c~¡h^½¯ˆ¤µ¬.AZÚàˆXÝÜàÇ}rAÆ BQ°ù¢‡”°R‘ù¹‚vND}Ix£°ºAŒS¦~PP”?á7^ùã‰ÔCäùÐ&ß.EJöCó+¯M#ê/E­ rIÑL"ÒH6þFg2ŸÕzCyt1èß÷ˆÝôôÆÿÃߣ)‰<²$ì3!w¢l,ç®=Hè+Ö<Éû^à@äÊNUkÞtxÉ®›¾–L–L²Þ*dìÐ’˜!ïzDÂfù‰vîå 'ÔR ÿ¨¡]Y¶yÛ/“ØQIm§Øò¾›ÞÂwÍOÖðCô¨YyÓ*@ã² +–²YLõ†d9YjîD,dN%d†D4r³G74ISàž¤⯕ 9­*Ü6eT­²-Az(ñyGúŒA3ÛÝ(P +]&BL4 L)…BpË?’Á‚Z”©…@_1Î%e%JÞ÷ˆK [¿®˜-‰›J·ÐÕÔ&rí ez+(šL×jÕª!°†=ŠÓϵ¹’w¨Ó6…9AÌ¢ÌN‰\4r²b):d=*aãÖ]HŒIõŸ ‹ÂHô§ô,3Û¦}ûB…IýsÍ?ÍŸD‹w(^Þú·‚Ã;á81}[2_‰ÁõíŒãæ µryA±cp/ã‚Ö–@ÊBŒÄHŸò+½¿ÚÚOf½'¨‰¾…Ø0¯{z!Økc½F1x8A§„Ö\i–S®P kx bÒBìu¢ìWäÅ*±µî±tŠªTÍkê#¾2gÂBØûØ"xª ‹CMŠb–±£€ÚJª‡¸ÍÕÆéEÁÌ?Ê4íèM%'Íè&×Õ;6„M¤ÅîKUM1WŠŸ™}@ù¡uÀÄÉ;¬§)çñj³!RâQŠ 1˜Óä5ñK«ÐÞq"-Wh€ <„ÈÙeÃÌ`á.Å„º>OU?K0C@,»?£ªÍ¹a+6±Öº-o™/”’¿£üÄð•šôr¦Ð^h¼íW„®´ {hO&£ŒåÔqáú\=<]De»m€. +=Ri~‰·àA8‚’~&·~qµW7»÷` Ú`§QìrBÜç¿`áºfy~éC±'°ôMîð\A»±µ¸Nê·t³h-|¿–BVŽ£ûmä‚ÚÔè_¾ÑÏV5ªŽ²Ü&Eƒº s”O9Ê +H#óÐewÉ–ìê6ŠR"eý3©Fý~þÐ#^KRÑ[ö["¾\Â’xQ‡y &ÀN +‰²¾l‰æâÖ²·x×#–`b5Ô^š¬C¾p"‚fUJ}r$I]aÇ !NÑ|©Û»A<*ÊM/%ÛdîààËš‚Ð:t ‡÷Ã,ƾ›èÎixð +oT¬{ÔJW7… Ñ/ãÅ”Cø+1"1Ã+»ßðxNðžMe€1#\–#Ès+EýñÔcö½#F/“.E8N»ùØ Üí´çÆ1øzÜã`²Š”$å³ã^‘…Ölݰ¹—Ò¾xikŽ©—kG€ñ©RIºÌ*ïÒc¯“ú¹<¨ÕN.•"£ ØM{WòÅj3O Yβ –êB"Œ6úJÐ¥Brx»J…“ÿàÅ ò’dzUäJZ^¸+´—=KÉÊçÊòüËó¾^|ÞÕ’ñ\*Ç(ö­"ê>­}@‚„¿— ðdö”zc!*­”ô@ƒ\¨5#æÖ~çxH²Ú‚Ô£Kgo{ÊB/ãß~³Aa>JÖè×Þ vXÙUÉnØÖ£›B)ÐbW7.œA-Hj¦OÙ3Mµ©ªBBV…œ¼ønÔpÂ}Ó)@èm­°„:Æ‹€Ù —(.™‚E¡¡BþX2ûÐH %2“%Rå5à Áø(’¬Né #²]£Öî'É‹[ÕJ´–”Ò-{-³$öGÁX”6ÚŒg×Jþ? çfräDY›<™Çˆ¸å·÷Y„¯ÿäy +Kèý©Îö“'Koõ7?üð¯oñ×?ÿÅ/üñÛß}ÿÍÏÿÍßýò7ßóõ¿ýo~øçoþö׿ùñ?ýî‡ûmœôËò÷ßþöÛ_þøí¯¿Yyõûí/þòíÿÿÜš€ÿöúÏÓ›˧ÊÛ$.æëÉòÌ )ã‹@-‘ ~•R ÌGPzƨú?C#ðÑLŸ +endstream endobj 292 0 obj <>stream +«J6ÓúD®²á7·Q-î/ÓJ—$·‹a«pr’ÿLñ(Öž"JTÃÀWÇ4öþ¶ e;·Œ“v9îÅÛúZâêÓt2& ïÞ[è;%épÌ$И–iñ—l¤Ž¶â<"ÏүؒÀ½Yu¼×°¾®CÓà|b#Zè$s‡ÜÅ.±¨„°Ëñ}ïöªÄ}o}üÊ>wÆÆHZ0…¬¹ˆ±T³o„BDr PÝߊ;ìUà0­G§§¶þ¬K¯“í¶¸ˆ)®9  +`i©‡à[TU>6phÓ6Æëö‡÷ý£„œEN€ÜΛŠ&¢%äH2P,\‹Û: íaÓµSеç>_A25ù¨¬2;PêÌŸ9¦¨YVÑy€Ù­P–TI6“Løþì-Žçòõ)`JOu¨… ÂI¼d÷›âj;Ëct‘È+æ[‹ÆÅÄ+öXµ#¥ð;Uâ“ýMÒ5Hí[¢¯ ÔŸí'²fRxizŠ3þ‘Ü|_NLÔ+˜ÿ+ɉ Ä€ŽZe;¨ÉŸI®3keÔ¿,'P·É•ÚØX .øùA2–œ3OëZb²’º}O~ȶÄ8ˆÃƒ."!.ºˆ°( K*Wdo ßoý掉éŒó%ŸïðD©¡"!K bkØI¯\ÑUßxHŸ7<@¨‚I mŠ=J8±d‡ª•ºÕú-Cû.ó9lÂM8ºþŠ ù²Ù¢‡ášºŽ{´Bëf§Mådy}Í(R×Oþ³šõ>Ço#f°®äpŸ¯(Е… ¸ Ε?cBðmHuúÞŠj80%<ƒŒ«,çs¾©}= +Úº xëQKŒH4‹+Tg:îT÷Û€ x“^ÆŽƒüß×q¶û +,"KI=¿Í†¶yÞ9„vCIÆ)§ª¹DJYk.>æ»#©%GÙÄÉšfO’bešU…ímyEpbXP¿ÛâÍ"·ÇwÚÊU¨&ë¥pñ»øôá2†lZâºPq@¿ƒ¹Ï§[;D‰ Ú¥«…K×z øŠ^u!¨*µÙu¯E¯ô®á$ê„­‰sã'Ê9ªår{2!@¼¨¨-'x|".^£õóyйXCJ/y]>ºttëª{R—ò¶Ët\ò·Î#| ô@Ø$eu…”ÕtùÀvê·¯d»€Õã± Ù‰,R¯Ð¢²G ±*£C*͖ÇÉ8Ünýi)Dª”!ªB;î+„tÞÀNürùDðþ¶¶!ä™)¥1OÊ»× áÄŸì#%?ɆâÂ0Æ.²ôÎ+–Pñ!1Kýr¦²S˜¥ÊwDRǹZ¼÷ + .°*`;Lu8°.uC!†¼Xx}hÞÄQaLÕtO[*¨øw™ÒÚM¥SÚeo¹f®ãI·áƒ‚lpÐÕjfÍñz¶9y@hÊéãmø«Ô4lÊcQ=*ëEÝÂK:ã£Cƒ³íZb÷Ô°òcͺ§ÕI¹–‰PæQqiUgÁ=±¾¨÷r‚År‚m|9Êtj-ÀKžD8¿Ý;¤¡@\)?£…¥ímziÇv•¨žŽfÙtjø3 f½—Ÿº)ÖÝÖ¡[ ëÐñ4!>¥2ßPy€*õæõÍSEsJ×ó6÷†Å‰Ì£gŠÚ&J [×¢¯¥rvÂó4ŠÀ¬Ó÷W²U–ΚÄV´°¶­oöé™Ö0´7VÍg/ݤšÒ‰•ξ]Ä)³¯ÎƒˆoJá}9P¬„8¯7Õ³÷QêØ·“?+º+)3 +ð½†T:p]qW¢¬w{í}2pÉÂ#bz!úAÚ(çvÿ(urè %n×8Þ&Ù¥°a!‚ fY=ø$⥗¶",†ÀYI¸o Á* u̘€yÊÆdn˜ 0ý51ÁN\ÿ½ŠH—6` +Œ‡ JT99n)‹ÄЫª!F³ô캼90Z(žÈZþ§jNB PªYë(‰e { i­ ÜO ‰(îª!ªý›ä««í¹Ã½K i¼‰¤ÀâCèÑôº£sdTo}yézh$gÈl(GÓ°|XÓ0lKó®ÿPajIÑΰ]Þë‰ ØÂœðW{Ci¡_ærŽÁÉÆËСtrU5*8Þj§ùå êƒU/u¥lEžDÙ ¯%s5|G¯@I°Œêy J¥ Ï‹¯t½âò.\zø€V)›6)»Ñd(‘Œ.¡:± žC_š1ƒEšW­Å–Ö¤¸@Nz>Ûƒ*“žºíÅÒ%L–¯!ïC::(?¦Ÿ“³D¥¼›÷tQæìþ³âõkÝ´0-_Ý#â{ƒs/6?§<« H±T° ±Ù¬·"Œ6Ö9P\:jÊI&ä>:#[=ðìbŸÕ€qmŸÖ«)Ï»÷jŸ·ûGîÒû?Š|”te›†úàöžI߼ϲ[³Êùž¢r|\»m`¶2âõù6vŒ”=Ù#ì4Jlê%îך)¾b½Í•q…°¯7u +m~·a¢2>ÉK‰Ã!}ÁdŒª_Ý-ßWä2ùè6ÑÑ[3o@ã<ø0‹ìK–45“Ÿ]’QëDCl>( µÊ=ÊA(Ã˾<Ô½wÕEbC6³eL±Ÿ3NöèP寓оTÃñTqCîY)È­—áO¦'w¸-@!^+'BSš•Š³Ê–—‘˜Â®)l7ñ$õk¦evïxS‹#ë#ölžÔ±€‹F~ÖœïÐÂ/í¤ârÒã¦QK`b0Ý y4Ø~‹Ð‚«ÏÎx!SÎÃtmq's•o+ïHñ{ j;Ûm^Ñ‹r¬ GW +aØdÎTuTÛ7\+Öï)D aAl“§µaÏÚ¤\`K6@ï‚7ÿ +Ê’|È©–hº-kL:_“˜y ÕØ.§Äð Íy§¡IãÑîÏóR*’£¢q­8S äy›²Y!k"ºÈÉâ?œRP$äÂ:E)Ûç[(ˆà?šs¨Þ”]"N i·¨‰•€Ë¢k/uì.{ñF@~Z—ìP¦§x¥lØXƒM¡/Žú¦Í%š‡ÇÚZÑKÌ6’p\AˆbKK˜$ôQÏA©F"{)êVlpI ¦¹dNž³ G%DvÁç,aâ+ ¥[«‰UïŠUï^x£á+ÐÅþã±ßÆ«P‚—îzÕŠKuo]PXå +FšÑ³½6× ™fh‚JPŠÙéVæìÞÝè6Ý­Jš¾­|n Cø¢Iƒ‹—cb\ú4ØVivwN‰CWP»ZAJ³´©¤®]îeñ!ó;o–öaH. ·R|ú·¨ê \H>õ¸‡zœE˜ç/ð,[2'Щ$m •ÚìkQÑÜ:·G«ŠB% †¸€'Y#ü&Ÿ'£Üf¢"¥](¹7D»ËžBžœ¼»õÇR/+0]£F½»O/Sj9ª®#‰ãfMk »9.àf·(_·†ÜZ1Ša’@¢qÍÂêh’Ê€…p¸YŒ²©+FÙž'$år!E†@·Øt§®v’Û0ª)‘b—Mál"y]l¶q„€(Åo%;qÐ`ý€15£³ ê³«¢vÉ´¦iA-ÔÙ|’Ö±)áê:Yl&e>!·‚:dâÎÙê0êCUóʶG[ÔM[s;0$1d)àò>a`§0‹¸Åhê8œy*übÇBj–ͦ@_ï©tî,µ +%yÌ:-•¼<2 %Ø»;,¸Ù¢^ßk £YdÔNÓz±±~Pëd—BýsC¥‚å[¨ÍÈ\U ª¢Ð|NÇfÓ^ 5Û¿®'ÂuŒ˜b„sW°1ù÷Á°$qT~G‚ÈL3mvðt‹ü +èy=Á^ Ò¦òðŽH’Ìð¤ÞæY4ô ö²N$JBqE¢”;Œò¢\Æpé!Ó%qÉ5Å#Ö¡›‘°9øyµá¡$CùʦJ!~°êó« $ç¶÷’Ø–ÄI„ƒô d6ÐݼMÕÓ²0Ö™È@ …ôPï—+TMJØM˜XgÇk~xÍë’üb'dy.²ß­Þü†SŽ9z<Є(ƒÚÈ…‘C'~a9&öË¿x‘%D€)׳B—O»ûo4Ób±ÑZÛŠýf Ë¯‰áR·'’/ÉÑ*îV w È9’ ¼JÑ#ß¾”H±«‘Ós)¹®Ðíº·òx åñi+SÍÐÜL²$ø\Ju" ­´a^í®§L ãÖŠ·Šbm§“fÏ\BÜѹwòu5ÔqµA[“ŒØ«²¶ªë tœb}÷gâ!²¶”J“uÁ LÝÀáŒðÓÕg±~©Fy|i?>ÀŠFSµÿ¼¾¤a@q’1,­ûü¦aÙöÕ­ÜÑKÑh¹NŸÇI®5ÈJÆ=·{„Ø©á†Bj ¦¹|)ýþ\H6- ¡¤Â¡d•°Ñä倲¤|쇌ýS,76PÉudDèñX/K*YÊoñž”ìm­Tj•ÃÆŠìÈAª[Pޝ@$ÈOGºN-ð˜=ð˜ýÈÈÎ(J³¸{4£ösYHTbOÝ’G¢Ðd ÚGf¯T¸øÀ4ïå£YŒéj=õ.é÷K Œà¬»¶•³jhŸQˆ¡_!†>fTÅšª_€ã­aÎÀ&¨ÎGç’n—ñÐB“ð1§ô±ä&´·H¥U©&—ñØó[î˸ïäßËm>ï'D{釸p¤¡ÐÌîb •½$àÓcëñæP +²YdƒÕ™Ýi}­$Ê6j‹œcU©[ +)2‰%©«"àˆuÃôÞ"™Uæ€ú ÀÇ“úˆì—r.E»¥bõ-ÜídtÝÂÅ´[ÅÌÆJ€ËCå#96v$ðªs{åLÍà*Tb¸‚¹wª@ær±»f” ‰aFü½{”œ] ª’8ºP µ8wµrû¼³äf :Úí2'Èáðˆ_àKzH™‚¸ùJrêA ]”?š§|ÉiÕ]ÂI¬­Ä5£\RTÉXš;§yEU†Hÿ’Ýô&¿PtZ߈û¤!Ü•îP”²c®C~!^¦fžT”G²ˆ¢<š­;~,ÎgHd­ÚÇk‡º"žJAõ²±N½” `á%ŽdK“¯`S,Ðé%–å@û2G7ñØ•iI:Q÷6ƒÑ·Êû_=À¥G-ùfÂó—¬]z~ fIÜsÎ’± §êªì±€0O‘÷j¢!¿ØÛkX.R;‚Wå,E •Ù\¡Û8HÁ^” /B8î(4 Ojö9hïX«Œ€ßм1î/ŸKfð6º!…¾6nË~‚R>DÏ`«±pôŠJ³#g°Ôë¾8 …Gêù–f”¹Ìφ ÚLEm¨¼"ª¨4SW8Rôg®Û¿ÿ³.àä u»%—½Ð"ÓWÂü(gÊNæ Oú+ IQœnðWÞFTàûÞðS›÷Ç£“½YTmðÚhÙž-øÉ”…ëÖ<|Ž^¦ZŠýY”ÀÔFKš¶ß06ЭÄ)Xu–÷üz[€š>üÛüa¼YD+`ó²Ö’¶­¨Ïp‰£U|µ!¼‚U‡‘†˜o¸diŒ,êħ° +t§ +Ô0C"óVÉ ¨p‘𩤮DŽn]íäøÍÎ¥<§S +0LwÅ +Ý„Àøí¶ýò©z˜ ™²d8h^¼xq}ÓÑé é¯7ù†E–*ì%’yYý Â[‹ÒŠ4ƒ9ƒ’`uiÞ!©Nè@H~Hv}\Q%ŽW¨˜9ïP«’})A$ß!„ùAAVp­«Æù…ìÉ¥¿u€x2Îwm˜y +Ìò\áÏ ³å@µÿsEܘÚ²q!áÂuÙøx¬â%žÕ¶ qRè T‡25Å–¯•ÒâФÛ]¼ÐûÒ0/e—”±i+o]Øb÷²ŠC‰”r]ß–Œb’Ï`íußUŽbf û£uTÉXÎ'ý{¢&­ õà€Ëà-|V8pÜÌ»²vÍG›aì¢Rl!Ô²~ªîhŒoéõP»2ká"4H0¾ðcUý­¶ÉêRê)스TxÁ'õCc)Dxkaöy¯'Ü# lENeÁÁ,ñ#²Tïq[!—Ht¶Á"úIÅIg`1¬Š×®‰šZ a€Ýᣡ«mÛSH†˜_pÖµ™‡ëÿ&ãê«ë«$áÖÖtðz~³±¨ng!h±pBS× §n…QcÃ)µa‘Øßzù™¸ßµû£±tÚ{@!l®xŸõP/‹ ®EoíÙßPÅ’ZÜûžƒ€ÝH`ðýŸÝÊJ“ªQ) þ PøÏŠî`çíorâ½0ü"ƒEGú´2bFz$ÇÙsS›vˆ=­ªçt΋m¦”¾H+æC¿+…{† á¨þ³é›”F‹¿È: ÿyçrÙ’è¡Uë5id$'%U‘+?ÿÎ{{5;9ª§j᣷©Þ¬’¾³L)ÆÚÊm© "M¡T»ç8<¤t‡3Fsz4Aº/v6ü +béjayCÖÙÑÅIî‡%5¡Àd߀>ò©ÃÂßSR¤5¿fUçÁZh¾‚»Ö68Cú‘7vb: ´¾;`õ~Î+å‡u°å—¿”·–eŠþ\ì¥!½h£<¸ ^܆ۢ\l{ÃÒå Gå19pM*.þÉ“Ôboyª6ëÃCÃDFŠ +ÙH} °Gn¨J+GÞŠ‚ŽXºÍ¿V#\J²“E¶¬í®·&»ÆNE)B^6!/;UÛ¬E¬ ³é +61Ы>8ÀxÅ–(e£v¢ôÐV*~`Ìt¾½Š®/bÆR ^ÝŠ*¹Åߣ>(€tƒé¡™Q )õÊS1†ƒOFª¨ +BËõ œ-AJ~äÀ6‡Â/Ï{øV °xM'WÉ^¬ µùG÷j_Ÿ}•2¾¨%A˜^TyÂpƒP„ïxýÞõ¿fp’Ž€1‘ƒF1ðVøük Žbî>BÒ˜8b+úLNBÈëœV…À;~–ºÁÍáDG7­»½ê{.dÈÝH]ïÎO€W/uÐ ßGSÁá}‡§F̦x\Ðr¦ºÙ{—\RÂ=™ÏE~I2?$ÕGøækéÊ-·bͬ;ÐãuI±Ÿ}¦Ø!«›MèœIâÕî+µð~2fo’}°¿‡©®+lŸGÇ8¾Õbà ú"‹Óq› %lÃ|&Bj±a”ôþÚ0ŠüJáXæ5krã/%ˆ^.eK­Ë0Å6ŒUÇ¿=®$mny‡Ç]QJX^iä@¿âÀó­·`cb›‚9c +˜jM*ŠÝÖ¤’I¶ ‰ )»®êj” ±1÷&ÚÈ‘õ%¶£lü!ea:{ízçðÁrÍ%¡ôh±üàý`ôó—×¾f0çíj§ðw`zÍ&ë}åîéÉn:ÒÌfSi÷îdN¯ÍÒz¤‹£ƒ–†j%s!i;u’+`*êv©¾Ø˜J™ÉÕ£Éë‹é½c5U2<_=øÜ}·‚ Wö#å™ÈôKá±·P ÷ÌÇm +žw–øuwpßì*©¨¦Ly]pÁNv¤ý«“´xH‰y$áV€ú IÑùsçï°ëEEál;Íî+Àšé…í<Œ;Í‘Áâg­™‹TŒ„ðK¸³®Õ]QS%û³æ]MÐ"ðDHv®‘â­Ä)9j3tön—Vµoç0ˆÊ^Cñ²sfKÁB¹,k¹&•ëDY>ZUNªñ”ËÊ +«›=®@îPÝ„ñ +ó,&¯ÎBU 0ªg:.)é–0#ƒÀ_Ž*%øÝ{§<1zD.Œ“<+îºoÒÅ­ÎMË ¼³—73‰ êë{þ%ù‡ËƒÇ” ËU*E"U; IÖ9gÒ^c‚êQ£¥"í{RæSÔlP2Tš!ÁMûÐ8³€¾@×nä˜ +T@Cüó+Œ4’4_ó®8OWÙQy¡0¶ÎÚrÁ$gëUWz´W†æ ñDÏ!hž'Öí#P#L_£’*€Œ›Í2°·®,å ¢t‘‹åq¾f‘[w!ˆ½¤®°„­oð;Tèø¸u/dÑÕÓÑÌÑo¤ìÚ˜®ÈŸgcgƒ;fQ„Y#¹ +óGknMÌuk$v@=‹ý eXµ`SìOs¡ab³acRòøµõÈF~7Ü^ Ü¡±¨-(¢fŠ­µí”ÜY2 ªÀ×¢wgÓ»7#_ÔçÖLè’FH\ËfgnÍ„¦;’ƒÏwƒ JNÛA{JX^òŒŸkàüÅØIá\.hx6¿„­Œä$Áâ°@lu*Üð¸›í +{x=5!’nØ”R¦B£Ï¹·.çE*P…þf?Ý÷úãuvª¤ùô.Z´8 â ’… ¨¯]¸kÕ20:Út¾ý™JÎ_8Ý-õ>Ý@ Á#o¤$gW©CÞs4ÅÚ*ùU0YíB¦OOi»2%YWÍ—ųËq{äÀAS ¯Û›Áõ”W ¯5 þ¨ÈT*.%T\R=÷çÉM +,NÜJW·` ŽP”ðJոРÙk–óí%E¼¦Šýˆš´\Æ)!àí£NB›ÁåØ ‰“±±e¤–\lˆò\‰·F ?S“šªÌPX¬JáVÉ2öû«“„CßýÖmÖ¡!‹·¾>)ê²TÌ‚ åš‚=ö`) ³Ó#4Þa$¯ø +Ò¥+Òã.ï¨B¯öŠ,ªÃ"²ë€¤èVÀ°×)7µÑEŽb(8Ñ]ñgú|‘±[c–û®„½hÔú³:;SY üHU…—L´°trUjúÄn)›@À­Ã5JWA/â³Ø¦L,•}caO¯j›5'~%_tøÆú|!!“€Œ-À¿yE]­ –Šhrø¥îÅ\Ò.Ÿ)®(ah¤ ·)¯aóè”ÓMˆF\DªÇw Eœ2¤i`µU<žï’„~5ÄL)4Žö§0%tËbPžK M©Õ0Å¥¤䢒ô¸§ò…šæŽ©#sÇbÒãqe¨:I=t’ýíãý4[Í1Oe3c!åwYV)¹Œ¹æª¬4…a‹ t6Þ€vë¿y€[IŠÔ#?‰núhI°)A{ÐŽçâ"˜D˜Ñ¥6e߃ø‡J¨=ÈF9ÿlåØÌ+K3d¯n¾ç±Ý)1ʧ¥hö¨ŠPïOªü±¼ÁSÌþS ƒ†lûŽkûÏ¿šdGÛ° –üu¬#|ƒý„4ô8@‚©*FKÚ_ÔétäW9[ßø²û6oL@l±¿Ô]!–:ˆàäß¹LC8µ éù  Üa»3I!»é ´e- +}0 H ²Uù>z›#üåó¡+¾ëÑtÁI +¼wû‰R2tqí©Ù[î<+aÔhãK(ÝnP¢DP¿Þ—ÒÇF&Œ2¢å!KÈCçYÙhdÍ•èT +Š€\ò!v=-Ôó3i¾ì­bÒº§ä„Ás6Yb‚^5êUÎé)´îu€ïúŠˆ~Èlqü+( ¸ºÁ—V7et*Øä+h×”€ ¡a˜Ø-¸‡LýÖ9,ÍkÎÔ¯64ÓæšÈ +"×b@ìÂÔHÉ…µk˶ø°”ù%6ò¾Ãv‘ùzŸ?Ù,Z™eè§X7dMX¥¯f˜ÅÃêû·pz<ª¬£D§)édzëúÅå8˜_Jø³]¿{º› ·]–7ˆ`u@ Çš4?;&ÎüdA©YuâJ’²ýŪ’,ÞÕ ð¹z 5= ùÄ¥Æz©Š·¾ô`Ò²U ËW$—#)OBŽ-J¸W@èÛbÁ¥dã XŠÿ;g%yÖwé–³:^/‚o^‡$­ƒÖ2‘gjóŸk$Ãv)^\¥ {%×ÈšÛ2RVM!rNlþýইB—·2ª×ëDúöVlÅ”ì„a“E‘™.S1SKê$ï¨yE,é¥Êá dEcÂ(Ö·;l¹&´±¿ÙëÆ?¶!'Þ½º~)°«ž¦ýL ½íô^ +µ0“2‡—? B†¤‚³=µ®™”³¬É’%›`˜,M&ÿ"ž3(ÄÏ¿Þe…èj8Ù(9†ƒæœ.,šxtY®ˆÅ)^ºM¥cÑ-ÎØŽ+ÀKà$"7+Nâ]U¸בM¿ Å€¤ÝÚ4ÜU=äÊÒuç׫†ëÝÉ—Ø“e"ô;\$ésÌ,HœÂôjGî)ÀîÄ¿ÆTkoD ŒF®P}b¿—µxRfÈBp'ÈXyïW½“lh/è±ß††u9"‡ÀÊ%í™õÙ“æ¶—·£¥ðL¶ª:ˆË€¢©BÈ«t\Š@0i#Ò„ê_®Ç5(yk®¢+–/p¶¬mo{ +q¯{ 6Q*>œˆøÛ" CÂîìÚÄSÀH@ ûMi|­Q¢w‡¶™¶±`¿-øê +)öK†´ä€xm饀´Vz¡áœyKÓAu¨¤dT*~Ãö'6ɺHžßÔ¢üP@Ø©År¢@µ…n$#Ô£©ç]Qõ‰¡d±™RúeM7d+¢²‘DÖ¢ RŠ…Ìpzl;¨ëçFµj·¯Ø…ŲÙÔVWX·0CýZ)»ÕšÞD7µ~˰Fø-åÃÀL¶ÖÓBGÞ.ËÇUKewz *Ç$z„«øºM1ªgr••T¿¤–xŠÊ4Ù‰Ú>iˆæÏ³³r„<ØØï½¡ áÈx6v‹ŸÀ±+ºMÿ}³ÀŠ)Å[[8ÑPè¡léŠEgx0]2åYëÏõriìuõ°«é¿%…üùHÞ£\%–RRÓå_ë[p9í’Á[\`DŠ»Q°´×“ö=˜6Éž´ʪã +&‘óËøÏf>|<íøû}ì–]~âƒèª´(16ÄüÂ,“Há¢XΚ=×hŸõˆK]á»>gv"O”#jìŒ`ÍcP!õ=£û:¾ÔÙ<$yÖj\Ú™‹ßw»cÐ77G”3|ÏÕÒbE5o]ò}?ɪ¨G¡®þ§¸m÷d’úÚöß‚áeo@( ÛglZ~¶’üà­…».ÐÐéá#‰ FIŸgúj! ‹,Ói-$Ò¯>8e:@dq€P«Â´>UziwJÆù¦s~a,És´‰Ujøh]†“…ÒêkD_Í£ÙÖ^Wx®r +©ÿM¸#S¤PFÆ{5–(%ÒT™Ôв3AÉ÷÷õ7ˆžª.U  ±Áõz=d¬e‚Œ¿g•ëü×ûÓ´ (».È×ÐàÔ ?ìÛSqhþ%Ý¢DÏwzeV‚);$j8u\-¸8¥=Ë‹¶¶ë¨À&$˜T "»j<¦})±F}[mkG^lëM +Ï+ŒòÂjpïšÓ*YÅzVüæ)Ø`ݵaØÙÁ +º]k7ro½Y\5ˆXÏ|ÞLP4Z樂X÷J~ò¤ìÚù*Ø<+B3‰ È¢2’°UЉA6°ÇT޵*ÌiÏ—éúÅ0úžnI|i’¾J–dç½S’H=©2Ä=ª&Zsøµ`í!ÈÑÚ03Q¦òB§“o¶|·¼ý1"ÔÈܘÌo3ÕB¡jÕWÔ-䋨V5Ã¥:ñèìÓË%›qIÄŠ^Ò<Òî ú<ùkÁ’lˆ(0EçIJ÷ÑÃbR2 +L +Ìãê~™¨Gb½ï„Šæ¬LºËž Ö«_”ŠÞ9’銨!p9Ä0¹ã¢’yÂ&òZZè'A¾wÚ*Ó¾iìqh07¤„ó +Zо"Ž7-ûBÚ ÆUkI)‡£ú¾[ +ÖbeâQ^p¡!²T3‡Èßw“lonë7òÃÊÅ+Y-°ÉίÚu͹¶¬×ú#9ôG¦ `ËZ4QúC¥#â":æ·-¢Tg¨óNø‘РÁѶO’òšja_Ï´‰^Cu³¯W' ½t·‹B´&‹ž^¬ ]ÒÅÀWrųŠT€…Ý«;4µ"©à©ú)Ò3¾”?Ykr¾b<é«Au•š×Ù±)*e÷ެ©%¢1«@*åFØÃ1W¢;c¥<ÂÖ‚—õÔ¨Êv}ì±ë }8êr”҄í=Øe¥ô 9Ê–°f„sw¢ð ÓYÌü„ÝcG Y 6LRW?™ÆüŸ8•PðÕ>zV+eŠßF—ÒU Æß´ý­J†GªÑײA”ަÅÙåj&Ô‘Ûþ8 +—ìò²%Ò*¤ÕRì¸àª>ÿ'E؉_Ö8\8Š^—12úÉH`oÚ‹C8I_hÈé@ó´6BÈ'¡5øÒé†Ä}ßß…dâfÈ,ö¹=l´\˜wç¦eœ¯¤…ù-n JÚØüñÐÐ]ECeW³@™¤¾+R¨4`3@tQf¡ß¥£WBã ª½vcüðdUn + +ñÌ[ÑY¬úª?ÐOkZw÷é·œM2è‰?ŒYž2/#ÿVüpe‡É‡¼f¯s>s ’ªÎë§JÓíÃO»)GXÈvñP;â'¢›'gk&5¡–oÙÓÚûÒÜucÁp³\£·Ì`±N‹Îˆûâ0½ òa:žä¾²oô„Uè|lf¸Ž°ßù)Q–ð\b?v&H V\D0¾;Y{5ô@…“Õû"‚Ÿº{)ß +¥@ô°ù$!'OÅ´ÓžlF.‰ÎY +廉Ð(,2Ê" CVoXÇôvA“¬Ï!´õÊW"& +‹/´ò:0÷¾ +ùÉÛe,~Æ…(!P°òw_rÀ¤µ <öZg{à ƒd±Ô…D½¸aÄyp[VJâ?¤7\Ë.HÉŸ +[ pè›q~”£æÏAdq ¿Io…1š¼"Î?– Ÿð1¡˜ûœ®*íDbOÔ ¥k`s>¡£Èç ¾3]I/ %@’MÓÀ<š’mì!8b†Eh»KÛÚ»ˆkI.o¬a°æº¦xpˆn,ß@ Z9¡$!)Ëb«nvËy…ŽEoqã9´¤öêÚtØÄ`¾­íHc'©K–ÔÈaFQ¶¨(ðm@IÎ;@VÞ>Âï+ùȾL:kÊÄ)bùK-ÙÒ. úÍHÁP(„ë ?c8[""öËž %Š TNHEƂݥL°QCWèo¢(¥Ì$ÕI|:jpøj \:JP—4ÆÕM‘‚q]öÀ°È­*5TU–2[Gjü9ìkt5iÌïª9Âë÷þÂT’×= &rŽà1I?Î59ª(ÜAYbSÁ}¨ŽíRG+Û©Í)sìYàzÜv´¨dÉE0+¶¢ý¶³h([ˆë‡w†¸t$ÃVuŒÕ«\bTR†ç¥¶‹_ãyŸ‘Ñ®¶iò-ú·o&¯P2É· cD#ƒ­b :Þs™QÓµ +‚`0H“ˆ)˜)ñ±r‘-w“jD’ù)7U©û\cB…üϪ E\7[è‚TïèM +†óvKkP1$l¬„技׵1½Ó„Ö·ÉZSaˆK‘‘Ϭ‡÷h”¨·ð &®*ÄXï#;Ù­TÉ=ßÝ—´ì#Sß¾¶çÂñ\ìa5ÅÕOçÀ%§Þ€ë®2Zã€Ru}DQLÕÎg9HveFD¥ƒÂ%` Ü¥5O·pÿÃ<)²}‹Ø‘´Y_Ò|P®…¡C +“Ì à’’#ŒêÞ£ô˜2{(Ãê®òãWb(&Gå_‘y3QˆügÆý ¹s õø‘‚~ ›Ë9‚w•wÁº[3¤é—à›º¤_ +sY:ˆˆƒmíü ŒÄ +‚n­ÀuEÓì;ê°Ô·›Ö¦Ѭ• F÷çÄ‚¹Ni½aXÃ]*3!¢‚¥oeª°Y~Äj‚kÛW7¹¿}%ÐùG è¦:ÿ0£E)ª[Ø}%±^k5ûþÖ^k±nùÒ$MâW)èëß]â»äÊULCJÜŸ»3”€ŽIs ™Ê—õY‰…A«Œ+™º×.…×´èœðêÒ(Å„uÎ,œGåÝ!‚…áÝ*>†¶V±‡8ý”S¤%ªÜŸ>XIé½´Õgˆ8ŸÄþ$ +Y˜J3£ŵnyæÕ^î“® +*Ò–ý jÑ27”eEx›JE‚#¤tßAk÷¬—Ðpqг>è¬Z0̶,4’¬Š¬5\¾yåÃ_¡œU¶¤tôþ’¡YÄTR”®ÅŠÒEÍ3…X¯b#²GýYÉÆ„ÇÚ:z lÍ‡ß ´·¾wt¯(¨và¹Of¯Ä¾‡]‚2ëÀ#’·[Š©Kawr‘¤"±h^1çf™ íÛ­¾maþ†N1îæ_ *£fŠß½½œ?³ü‘`n;CB•ÎÚÓ†&cL™ø€Vø»º€äìËî7äÓÙj}_ÑwäÒðZÔ#Â<ô±. 1ÏHP›ÃˆÎÃÎöipc6¸±ØæÞÄaF+ÎÒÛ÷âA6Z·þÓ‰ƒ?}’‚¥Zy’°©Vj¢ +ïj‡^ÝÁ[_Cl{ã‚!µ|B;…ŽFµIÎzX¥ïùœÂ€6d”¶UÎYO„_ŠÁ‘6ç£Úø¡5-Qvmªq@¼} V÷ž›#í8: –C¿¢SC'ÕÈ”M](0¹5ÔذÇgI$nѪ|€,[§Æ…GœÙ‹ Ì2)ïĬU'¦•1¸ÛÖ‚ÄJ Z3GѨùæòoÏhi£åÝ8ïýˆCð½rߥ]\tÉ7Mm.6ì×›ú;tÓL»’e¨?Ü;‘ €©¶ká€ä9û|ÎçXñíu´2¹!H*û³÷FG!dïË)kBÁãŒ3g$Zf$êØF/õ7Õþæ¶gƒù‘Ä`q@óþ€·?Wì#Þí3DGfÈS2X+Ýs€2™þ‚—±÷±q* ½˜‰t»(ï +e)S`5ÄV;ƒTCÜÃbqïøç^L†õãÑÉF¦[æq}Ï?/ó* + +;·j*Z››Kf–iClm‡˜p˜F‡Bä[#Јuï;e†Þ‰¦jŽBö¤ÌÅw>Z ôa‹SnÊ%t<àû×uà>^|£…G€ …_Êb‰PR]kLxIMZ%£ÙkúßïŽZœÇ±.ù­òp˜}Ö½‡b\x}†³Å&þÞy×k›öì_)þá.ôª$ŠÍ*Ç#›6·tF{šÙ¦!®ô`ÞZËg ÂÿÖ̇>ûŽñy7èþŽšjFuºJ´`J•ò¦`Ö`yqùkf‘kÌ1ü=ís¶V3t±Þìä~«^§˜Œrœ´b&¤$ z]-Ê3Æ#b- +t¥…lÁv¬X” x¿4öXæÙ Ùš;tGíG^w2BG“ñ.ö®½L®Ã’RD%YÿöïCˆF¢d¼èá +›lH€5Åúºæ–ˆG Lsºß)"ç÷ûÎñ°ï|¹4h h,=€ý6ûjQ6‰œ¯„ÐŒÔaFÈ_uÔ+]dlýØìáËAkä^ëÖÅîÈNq@´Ôu ±Ã.0R·kwvÄjø1CZïݸHºà7óc˜‘Õ[ꄈ›®ã.VëÈζ^ªx¶Ã­Ž.9*¦7xÃ[í–6¹SaqçþÙu„ø[VÔ¶ö½®—iÔàzÑ ›ÕŽ&RgÛTîK©Î=S8à‡Vœ¨—껀¶†+¹O/•ò—U òš»S¯²ïì©ú&ñôá(Pxî‚ ¬Tÿ´ÎLKóð·a»ƒdÚI|Ê£üÀQrõü[†ñÈ` ‰Â•K”G õ]/B9òþÉ,`#tÿÙZ ©Ž øCyÄë/­¿Ž [Ø#†ÆšúeÖo.Û•!•,‚à>C1 g£ëÅù#Ž&—r%v»1¬%ú(DÄ.e ³ÀÄvÉÒ‹{oØ‹]ª˜n¬/éâFZïØº“^ÙQ$|/å¿§ê¨JŠ¥@œ8¹ eoTˆH”OŒÜPŽÊ¨ßñš¹‡Ú í£ØÊ—°ú_{"A•J\Lw±..•¼–äÕsEV„¸¼NOÃ* ˜C wlƒ“cêÕru]¿Y£Øbt)!pâL8ÀÅ _vÜåîóФA%—vyÒ®)|ÅŸú1#dO­sßo. VÚOž>p"ÞνýË´ŸÒ³.³U„1Ö+wÎÒ”Ùýð«—?J‰Ç¯=ÎÈ?yÍÿò›u‚øÍ¯ü—øËöS—ûÅï¾ýï¿ùöß×Õþõ÷û*ŸÕËOY·õ›oÿzS?ÙýÓ·ÿüã7ë ÿ¯¿ûáûÿhïÿòÃo?t~§õîÿöíoþÛ¿üø?ú{ÿþ‡ÿýO¾è¿]ÿú럗oþöû_ÇŸ«¡ÑðÍþáû_¬Áøã?ûY´ÿÍ·ÿmÝúË‘?ÿ³ÿü[›>ö7¿û·ßÿË9×_ü_ßÿËï¾ýõÛøË?¿ÞþúÏÿìzûÇçÿ"ƒóoŸýGzQ§¹Þþ÷õ_ÿßjû÷·úöwoÿ÷ÿs½ýzàÿþÏÿìg¥‡ÄºQ’™ŒÁÏÊÚP½4zß¼TðŸÞŸå§ÚÏi¾ÿìVÿÏõ¨™ã(œåb:Ñì× ‚à;É¡ô‚È7ù®„M~v,$¹*B”¤YØýÔû²”­/ùUåG /ÖÒ‚¢Ïç¿‹-È +;žÇ€5‹ÚI“¿EãèÑùb_åÆ&óÕ[¡ðÐæÅíØºµ»2.¸ÚÿÙ‡ÀNQ§¾!íb½ýÝn¯0žÔNúÍh@Åe©,»·‡¸æ,ç^ÐçnqÑ„=F4²ññOdóáÆ„ ­®u§ûå ›âæµºììý<À¤GcœíÂçiÜI†lzt¹D×ß¼ï GIÒè—òËßk¡ö³Õ75N#IˆøYñÜá“9§í­´ý êyD>Ãó Þ½‡¯ãu¸\”¬th-±Ã¯ˆö¼žw´÷øhûÅ¡–õ§ØßOËç'}®7¿ÂMˇpuØ×›gxvÛ4F#[;}‹÷=ŸÆ+E#ü³¯ÏÆ8£k…gá“âžõÅ;xn•_¿ktW×ýî´ïV|)¢ 5õh\ŸK4^~h`|ýœwç{·÷xH·7[n$qõÅ;øyS ©µ§t&¬Kdýý®Wrc.ÅÃù‡_WCñö!¾Äv&U9sÅÇÚ¢ñL2õ¤ºM‹žä¸÷è½ý5¸ÀÀ>íÜI³FãÜßúë@ûžxէݸ§¹ ó‹¿âü@>ˆÑ 1?vJ¿Ñžî˜ín1£ãUÞÉDœgœOÑÝdÑÉÑã¯xæKöËeŸ÷ïv{ºöø ¤ý*™â¢.ž_å}žígÐ'òÍq¹^c®HÙS˜öì×!—&Ñ/·ûÝïÎûÓ¸y5_ü¯Ã ]ŸD2Lg8i#ìv9?özÚû½ÇƒªJnÜ3÷‡3?¯x’ûC·ŸªÔ:îh¯š2ÔH>$ÞZü"ÌÃr¼²q§=Ö>I°ï3äí9íç÷p¾ëAÊÐ# +C½ ¶Ûk| ÷Ô‚íÆ=æáCžÆßªÙ1íÐ>}'œ!ŸÎsœËå—3¼ÞÃs{Oܽ3Í}{T¯iÚÃ8)Ïo/ù·ÝxÅÛÑ–îCcÙ+ó®¸?È\=Fí¾;íà;£}h.UãH_hÌm7Þ1¼»ë=:g8Ñ8öåô5}ñγ‚–5÷¤Aš4n¯(§'ˆH»q ¿š£±ÅÅ'YöâF{Û+øåaIc"wðÙÂôñ^¿>yòz"e9=_ß3‹¶øšò‰ƒ0ÌØg&×|{æáœëY ®½ ë±;ŸâÝ ¼>ºw?ü»/µk¾}߸"æ:Ïuh·ŸI[íwÙ]ÕT©“\{}Ûò§žŒ= {iÖ2ôÝi§^ç^ürà²ì G4Žk‡Wß^í¹ìÎ1P©û´}ZŽ·ðÜü¾'³Yv\…òôU÷ÒA9àÓnŸ=Å©&Oј÷ƒ¸ÔÛÏ|.š¡>ßù¥ÿw»}GÍé­hlg +äËsc+çämG×jÏw;·w:ç3ÝΧ1å=aÇÌ—cÒŒ3—²ï¡îc|ñW¬$m$Ü¢ÍOÿ‹wv&I*†íŠhGÑÈw»=])v2Š2£±”øÒÇ¥0L1±À=µO‡ >sÒž…Æk0.mæ¾pŸ‡”ûŠŠØÏ,¤Íæ(Fc¯±ßOM#Ñ^önV5ØhŒÈ‡3Ü{~ûÉrì^a÷ìÆ!eÅ÷æ‹¿âõ«PèêÅôõù*& ·³ãû´ÛwÀÀ7Fj¿vÖB'ùâ™ÏE[οhBêün·?{âÉ6õÓi¿êxyAq’8¿$_ûÛÏüüRU¿ðK3ÿØï}'\¿ë5¢Qö‡n¼^‡w-ÆÏÛ>eÌ}†óÕåkxSû îíõl>†÷YkÞ {¯5¿…ú#?;óÕE%BÞ™ø†WëY<" ïv{n^_åi¯ï_’ççŤB¥¦{´;#Бòª5ž»°ÐîŒÃ~@ç xïøZ¸/>g1O-Ö-Ö‰ËGo(»õºëyî´×/™W¯»sÚgЊƶ?×ûªó9Ãó½aãO¶å½áDŠ%ó•v±N¼†q—X3uï1ŽÁ|hl-ççÌ{w4²»±ô?WQ—±ìˆÓ¶çïÁîwKаs‰§Ò_Òx^J™¼ÜÁ}¶ò½>¿­žGÑT<±Y΂pïFÉd?=Ï™óµ÷@ix~âgÔ=Fç?˜jöNéÝgý¡ýeŒ^ñëð +˜{‡ƒxÚž|UÕ´³B >šxþq_eÆã!ÒMûÛa{ÎPJ=ËyëÑ9C„ö»±lׯDc/âçç +ÞØ ÃÜ[qú·ºŸåž‘; ’ݹD<Õ‘¥óÞå¼z¦g©µFמ÷M(ž‰+µÓ³÷úœ!'?I†g<^ʳmç{êÜW¿ÒKã9ÃuDý1~ˆü'ÙaaÇq¼«ùåW4ãÌùå@6:+±ófKû Ï ‰ô#í€[ÇØ>FuÊ}»^ŽñÍê'Š˜gø6‘ºNt7ç^èŸD%,ôíI¡ð2ç¨çù´@ñ óÙªÌ}CåLgm‹PEÈ¢’w‡ßpp®=üPØ}9ÁÙÁì…–ÑéŒêEœá)xa4¾ÏN&“-‚³è€Ó<Ÿ­'ºz}%ÝǘÓÎ&¤^®ÆWàIÂâ™·•&ŽÆ³[_ŸËËÚ܃D;57Ö4Ïwt΀eíËÇrÎPÇyfílDàÒ÷@ç˜= +$•+ÂŒ½ØmlûWàY¿óáÌ‘gÅdÚí%_{œÎZS†‘¨]E8~Or9v,ÜÑ^eî~>F®m§Œö¬RúÉ8Ŭû3çëg‘îÉá_QïX›Yõ ³ßUÄûbã·¾¿ ³”!™÷,Á"õi·§ó0÷j^ÊÉ›=é#LQ%!ëw^ty>޹ÿx>)•¹Ï¨ÜT|,'ÏZ`ÉíI¿woUåH²U¢¿­F¢#Ïj8˜D}ÆŒQb…’4÷§¹Ã¤L8p2×Ù@ÝÊû ©œRTÖîû|Ç—ž9ÌÌÀ°èx$d0êû‹ŸQÓ‰ö3ÙY‡Ü^òw”þs{MXÍ)Ór ϧY¤üî§ArÜÛ¾þ¤dò3#OãÂ~æÔíìgѽw=¡lÄËþ5_'½?ž¢Ø‹=F÷¤úÉIQg`=ÚéÄ]E€•zJ ={šøI<*3P Ÿç¡]yŸá¤IZ¯§±žY¬œ=Iz ­&V/nTR=â0¯Ð ’ÓžGÖÙa".÷Y™Š³@ÇÇub{7>´YŸ¢]}I²íM9Pè1Iz2„ zŠ + +±ã |Yg8o%ˆ&ýdD<¹P‚;‰Fåg_Îðì:â†QO;ûj"Úh<)+½ ç 'ˆ’ Ñ)>@6¹"ºñ:KãÕîÓ½ƒöx¹·|>Ϩ»P;öˆeD㟥NI+hoe×ïeÝ!…S ôL'¸iÙe ·ï&ÛÑv™G¾n'{r·—{xveçeÐ…}4Ç@)B+±àuÎ^ól‘µ¢ñ$œ”®ðiŸuØ:gÐÜÿY$‡IGÞ‰ÉR¢fœ@)ìgÎÆàœaC¤wçñáá@Ê>Qc{¾¸ êÍI<Åœmô'+TÛ.!å|Bb„ˆžD{|.×ka¡Äî˜Æ“.x Ÿà}Ý;kÐñƹÝ+.Ú§>Eÿë6Ž0ÚxpœO<;Û_']Hç²÷†Êä}ÚíO|$Á±Óþ$¯r{é}Lió£ã’yƒö´7Šžeƒ·^B,ìb½„UKš’õJ»s¶ Nû¬ qÅFèiÿظfŒÿº;ïðµ;’qc‰Ü׺Z/»QBOî oä\N>ÅþÅ£íËå³q(Qp¤çÉC>à@Ú¯“êQ„McÉ’1ßGc9‰ˆ—¼í}ãwåz]‘Jä.)„ìÆzJ@x Ÿ,™ÒžŸvû†vŒS' qœrGÚMwßSh^X“ÔKyÿŒéu§NÜsÃFÇëîö3Y¥¿úIY6¯hÐYžJÐ}öpÜ=+—ÝÏ1P,úå{OLšñçõÀ­˜‘â9V§Îýj b¡ÁŸ¸ë‰…®ú’+ÜÉ‘ áÁ½Pjш(_œô:sâ•Re ði·@Iõ€ôÈuq?ƒ…‹‹}÷ž¸Ÿó¦´;çäHóz]jdÀhÁÚÏP\~Yþ£sÙ”‚VMi0ÐißmÎç Íô>?|‰>íöQöLÈ«&°ÚŽüFŽç³f–˜G‚ÖpÎüÔé´ßgx ×9íÁæ¼ÛKáìrýžÆëÜC;ÀèY7œ}öWó.ªCó0<WûcÐØK4æ´Çäëf3¿ñx Äåî²ÃÔìl!ãl©ò]ós†Ñwà—ç®Ð^òðùÎOûóuHª÷´ï%–b´4зŸ:o¸ŸÆ5e”Í¥ŽÎý)q)>íÛ„#‰Ìü`ÊËK=¦Üç ¹ïé/¾ñâÛñ*0úxÎp¥t‚ØÝH””Ïwa4¶“}ª§ª§ö±gÑ 3½_‹±ç;@[ðìë €öT7`ÆŠ4_>“x?§jRF}9ÃSÎѪB#*P';áZCäJ~pä×K¢?•’¢sžŸ:^7QàçÜï}¯:ÊÏCû鸣<Æ6KÑ?Î'êŠÜK³(ÉY´H Ú[Ëþj?‡üÞåÄF=ŸÎgk€¯Ï×õ%Î-$ŸÅ(òFÙèÛÛ¡=ÏÜÞz}þ^‘˜-ÛæšÌõŠDÆOPžªéíY£óÆÿô}ZY¤Ä¯/÷ £tÿ†vø.O5²Ôx4è﹫¾P¸¦ c©¾6ßëY¹"J¥ñ©ãÉ«3Î@ÖhOv÷CÊS1ÆC 5Ôx"ÝÔÃî>èí¡¿ÜZj;•¡)î÷$^’óSyÛÛ5ìk³À¢l¢Æv¢–”ÎpŸ{®Tiè ÷Vö–¨~„¥¾´?Œ’à”!Ùs庑À7ú ûŠå…œE¶fÏ£m3zÒÁ{u‹ÁÅiÇæHæY ú…›²¤åk7Æv¿Iìg¿þüÂ*ʧH×'‰5m”ó“¯Ý¸! +*W÷—3Œý|$T‹í¡œp¢Òž'”:+sŽH¿•SÚ—»µ§´}Öõóþ²q$±o-Ò^Pö/»6¹êÎò>5Ëw=ŽnXr|ssGõ”Îæá·i(:¶C0.7ÊŽ9w`׿ºžh­êcs©ål7v I¬êhß›b—‡m‰ÆžëZ{ ö{ÝßmrþYÛ…¨WqfckÈ{h×Ë~Š ¸#̾QrÚÔ=zRI{vgù½IÚl%a?ííÛ®Œ¾PUfÝÏ8çMÛìЇbí#ßö^ï™ðÆ~¥ó³¡¼œ!†Ï˜uìÎ÷žt[›q÷P©µÅýÕ9CÚ{Ž1²’ï3t'ÈÔxç|Nûz‡K)اÝ^®=“ +=¼Ï|æ»kÎh,gލóõÌålCóŽEç!tõPÐÕ™Ѫ=gØÑÇ )tž ißåvÝØ™÷ŸÔÎPÏ"Š[½í·|BÜ/q£=í}Öä±—ÎÝ©$7ÎsÚ4Ÿ·ü¤zû†ßÑù~x³OúbƒDwÎëxýrݸ—“È‹íÆó”'ª¿]†*/ô0'F6S놉œz!=µ—3Œ{Ï—wÞJãä9ög›wc.{øå—,f÷YqªŒö{³¸7/Qú€ã|\.qÒ˜vÏ—ÓŽ[ûWå Ý>öyùç۹™1ëÙ‚Çu“c—×§Gã®tã+OÊlêº3'™÷ȬÁsòÏ +]îĸžHªÜ'Q)£qÚ}ªÌ{9×mDcÙÁjzŠtä$ïÜ€ò*/ºÈ?Eã¸whm¢çs†‡âv{GL㜛 pE2¯œJc­vÊsëYbÈ”³·ƒ’\w +6ßûAbiûd[µ—ñÀOig|7ú©m­ bÛ<;Te‚ÇáŸÂþ´Ûqâ}™é#|6©—9ø4 +Mó|:çÌsn"b)²´ƒ‘oŽ*&&ïÒÒN´÷€ö¡™ð$¹»¡¾âµž~«mgúTY8ïó¹p‘â{yž»fqõCÌŒ/…Œ¾i–m¾V^ÚánP}ÊÍU¸d7¿g‘z¨Ù>ÜÃ}¶4#î-×ð¸ŠZSÛ³îÄü|åî4õ|œ®ëå Ü †ÆtÆu|á?­Í±‹?í®yHx¤#ënÌ‘¦i¯´"ÚÛVËÐçðÔÜ®Þvÿ˜#æ){´­­âjÞfbªìxμó!¹ñΰ!¯Šª4ÆRÚ,¹éÆ"¡s>š?!Òë^W6ê‘Bh¤óBGa÷<ïíyE¨ºµ~n¸ìúªÖ#ëìK×I5†Ä9~‘{Dô]âÝ  g’À¼¦Âì}H»éza´ tâÆ½ák^<ã )ÇÝ*ºyÎpï·<¢ü¢êõ~›d²[ÙƒçºPçÒârZ$?íö½ßg:9gn-Ÿ9&¨Û‰)íôÌ/gnGÖB€†sæ½ým›·JãˆÍV3÷a7nþ²¶ Oìçl{ŸöLð1°éyï'ÿRq:ÐΧ´Q>µü¾æB?üÿŒ½xÉÖ>>w·Å²,°À"IÆ’5– ±™öž$ÄCBÜÝÝÝ•Hp—ÅwqwI‚»¬ßïÞOò¯SÓÝ3÷îÞûû?<ó$Tzª»«Nó¾çœ:e!–*Q«¥­G‘`ز­VK[Š¥,J¹”¦ 7‰+ )V8UB”L…°¿R%'›R2Àð`’¤á}Rb°C©¿BhTˆêVðÿu }»ÚR\tbr;¤½ä*µ©#7R·xUK=(Ÿ˜!k.— •z(­o´Ö2Þ«&%¾ˆ[U”ú(–Ѓ¹h¤l!¹„o”z§­ÔƒÊLÒ'JK1‹È`åÄh¹7_¸X (`LDÇ nW‹@SR°ë_d#B” +2™ Ó¡g…dý€‹ßWˆßÂo¸î€…Hp1`¾/Æò¤oÝí0CVb£¥™ˆOpÑ©8XÔ•VâãZZˆhA)èk|¥XËE!EûpR˜A¹›2ÅÔâY›\Íá’¬%Ô(%Ø£Ô/S¡Q.5 +úÚWùm†Ü¨ ó¨Dc=¨-ý#R»L0*Ü…d`„” ÈkSˆÊÈÊL¡ðv +Ñb¦wèáF ‘âˆà ºá®\ÚhO`%V°²gH)mVéë*ÌÕ§á©E´aafÈUSÁ&¼ÓvµØ®”KKYHÿ5WInM?!Ë˰3O‹d4Ôúƒq„g“胹qÎ +Þv¢oÄÛÇÄ2 ÔhC'´«$ÜÇoë­¤ +Pj +±2Ç¿-í¡2“̲TDi.Ú"¥ QêÁÊÒ0ò‰(ÄgS[HÐÜJ*Ú¥œ‡O_Ö7бeɠµÊ%Æd!É •>€-,Qýæ"H5Tȵ0\‰*˜+Œ{°—‡Ú\ÏLð©¯"ˆT©…¹³’ö–e•ô=À‰R…7±Œš…a{»pÜÎÜÿXç/ 7!YWOÁæ–J±1mF¥WBR¢¥h)eöªUÒ3 ´HKÿs'sqn°™Rô[Ê=X‰lWav s)Ù[)m‡*R8B¡R‹ÉÌY;DnäÅõ¥õ +)wÌL˜7ÈÈ–ÒŒöŠB»äŒ‚ñú‹¥ÊfB½)Hô¶”®4l›ÂÕŠÅ¢7pä®p±!ÀGY›ê¯THžd£4(Ô.æÉHõÄp·Ri/ì”Ò7Ê¥¨ ™ÚÂ(·]!dV*õ^/}£(}0?æbƾ…R4ÕjÉ–áœ}Kw +r(¥­TJÑj Ï ›`²%]¢ˆ'œ %é!5_+UŽ@ˆ×*¤X vmÎÕo\0½œ8V£oT˜‹T[®–Ð#œ$#ÅÄ +IÐ(%l`¯oså”zO¾ÔƒÁÃh&Ô°P9öffâ3¨$×§B-%…[@ª䣔 éõÂö¹‘?öj˜Iºç[H=ˆ+•ú´‡ÃRBãJþZ|¸Jý.a}£…¥Á 8: JJ)n3…ƒtÔVçÙRJèWI[-¬ð¸B#lÚz†p¡8ÄV¢A³°2 +B©ä–bøx ÁÔêëjÀ9DRÝE£ZdVz—·0 +ñ‰åfFÿÌÄ6*sÑm%” œŽ$9kpTy‰ø}µx…C®…‹Å*z%£o#·04†Lfz¯½Ð®weA¯†ñü¨ÑR%N†Ñv¸ØJ²rJÃKX‰ëMÜì&7¦ˆV†}гTõT,k)7làUé«ñè 01¶z0—ª­Öã8EÖRòÞé $B£á-”–†jlr©g0’úDE8eJ²œBðïùRŠ÷Rö ËÒ 6‘‹eÍ ¬¶9B£(†Ý}PÑL q*}þ¢¾Q £© -’"Áx_øºJªÅ£Ô'­Û-,D-%’u(Tg&RF•@äØ#*_£ VIÊZ)VP·“äÉB€Lø ±>&ÞPcèÁ\bö–J±¥¹H•äBe28=B!®` ÂGZˆzo½ÞÎJâ[ æ¢ÙCUÿl8ëG¬'h)1T¹%×{”"“ …jô׋; ¡Ð¬(Áb5¹¥¾¾x$TíJñŽB>4Š™ÿ0˜ +±[q[„R¯˜…¬ôšÈ’ªß$k6Od$V‚…DM–r¹1pÔ¶Jú—7X-¶ŒRðÉÀ±tæ’£FØ:¥0—‚sz6—r€”† ÙæúúzúÛ ^mh”,§Â`QáHVÉ{#Tö‚F¥$jb­…¹”€¡Ô«F©Ã’Å1|áí,ôÎe½ )¥½¾*‰ï %!•Ó”ëa4*Eç—B¨À¦TÂà™VªŒªúÊõêY©6Š™ eÆà`n)nŒ³„ÔFYrs=DQZJõ“•úrŽúFqo¯ÀŒ„, £Rªå ´4òÔYZ åg Qâ´b=‘+Iž0(Š#•à5Sêñ4J|Xª8b)E^©Xõ º¡„¤Qh2$SX˜Iµz”R„ßIú¾B’Q\:Ó¨èTZY( +fRPð&+Á9¡6ækúž¡Ì‘ZrD ±_84Ȧ#ìUc@Š T2“ÊÈ(õUôj ‘šë-‘ÊÌ(˜f’TfFTRÄìp¾Ž!J"”.€FI ¯Ê\ʽ6xp¡'²[¼û-Åx­$bí’ ÓJ`a*ÃîA]}”\µ R†ú¡Øîë-ÔR!U}þ~X3¨µ4zC»ˆL [¹B”Ânh¸RBt†ÒKøbÑY€)»ðÀV’?[ð©CÅ,s —šŠ +ZH¢•úmªB£BÂ¥ÂVPý™Ð³J˜Z-Ä(!Þ2»Zl7 ¥q€FIqŠê +5Šõ`5IkPÚ[!!fµx±¨W4´Hã‚zFaQ™ÃYž"’ë™T(3 ƒx€×G\g8²¨osÁ…ÐÆ¿v`ThÚÕÒJöêA£¹ä¢vÚÁ [f +Ih¬¬ =XH¸ÑR!]ü¯Avh’‹ÈÌH1âv5Jµ!åR,ûŸ{‚I؇"õ Vá0ºØÂì‹•vTFØ×ÒÂX>¬¤ð½X㺕œˆbÝ3<7b@Ô¨@ŒŽJJ+ËÊ¥pBZJ.¹~Uz£(}Ý` ¬€«Rû§,¨RÆq£úzjipTb¥BcO–™V³KJ·1äK@õAi뎅Â\¼ØJÊŒ}CÐhÈå0Tn‡ ®MK±ø ÚÒ xRùBµaz (]¥’J…LTK´U®hÑ ¬¢JJ⑾¯6JÌ4SëÍ4œ¾'ž–t(Þ±*͸TµI¥’ +yŒ4.?#²Ra71”>–r­Ä¢¦F¹†² *+ióªÁ§ JÑK‡S_…FÞecÕJIvõ£«6×{Wäz‡œ)¨‰Q*‰Zn˜,eV +éÁô +5ZR•’Ú )Å^ç"*D/¦Ô®VŠ®[QÂaR$S)TƒRc —ÜÁÒY¨Yœc‰©…•'@½³\¼ÄGPéE]­’v¨ y¯B·8áG„ò‚ÕRv›B.v‹Œèå3Ä ]Úx†çSx6(Ya%º»"R«†ÙB.Ll'‘¢Cz| VKÛ7•zù±+µåÖ_l)mØRIµWá Q- ›øÕByèƒÚRªf£’ª<©-’Ø•†€Ï8ôA.—*Þ +vTm9O,{ ÄÕj£úi–†9 Ž¥XµÉˆ8¨uK%ø€¾Jíj©.%o4ÈbA93¹p¶…ZJb0TÍRÖ©Nª¹DºÔj)$j¨ªVK§Õ`†]sâV9+CM5l¨«fá] +«ÅvµôŽj3½cL )q³°Xá®4TZ•ròõ¢(Ö2Ók C•R¡¬0jTö& +Ê„Kûw1F­¤¢ßaVCÜÁPàQr2©Uú<ý3¨Ì¤‹¥z–r•Ø­\Údf¾W«ŒŠx‹Ej0RayQ·)¥ÄRÉíG5KëñNOA©H››•BUÌÿt0ŠTwKÄ¿p>¼\œz±&ã.×Â[8–ˆŠÍJЖÒ|µÂ¸H©à €F¡>›¥¾â„A•ª¤r‹Bt4·BÜßl%ªs-Y5 81Aœ ¥p©•T€UÕÐ(÷[J…IÔ†DZµ„ÛÔs¥Ú<– +±Qa)•U+ŒzPHËû2õ†òbp[ yKb·8oSèÁ\rò«¥X:ô 6œ2 $:±Ž–¹Ú :àøoC¡5ëŸ ëI§f‰;³¡])¦ëp¹”x +>©$´éU±C ÑýdnØ"d8 â/‹û KòO%º|Åvµô¦Â=\Ì\įfRÝ.CE 9Â÷Õbõ% !ÃL-ea¨õ3ùKŒ9¡¥>mØèð/±x¥èÔø§‹Å#QþC™K1c)%«B£ÊèÒ¹ÿæ8¤¿|2i¡Ě¡ò0Ô€‘ŽŸ5“² 2첑*I ;zÿýˆZ©ÄŠX¢õ7³4²B‰•¿xiYbD'• +4—Îç4–\âx†"Ò +Â17úFQÚ•b µQáñqGã³›ÿå+†‡‘*,câhx©¸„ÂJ8ºU-Õ2ÔQùˇ‘nj¨„ŽKÿ?oª–˜¹tâ—Zª&]ø§~—G¦R¸²¹ñ‘¤?Ã5Î G’*Åú\X¡Šˆª_!ž]ý§ž êÒL_’Jÿ'•x–/´›É¥Cq-¥s-%j«?÷-½¡JízjCå.áü ýÝDÝ%8õfxj ýÒЛ]3ÃS›K11½Ù—ª1XÉ¥-¿âN{(–#ùÍ,„JæPËPô´›™ÕRöŠ§ÖšKþ1•¡ÞÒŸÍØ4© Ys +¹…Á4‰éáR|P±Áƒ­ËRÑpÕɰ¨¥´R!½7JÙeïû‹g0èx¹^ ÈEǧ¯Ôl.Ev,¥sŽ`?ª!ËÑBÜ»j!å¼ýç~ wTê³hõvRe8åJZIëRn´ÇÓRª‰ca8YæÏýÔ¬Ê(+Bix)•T]©/½.•T4d`¶°ú¯»Ymt0£Çâb ÒÉs†m‚F_ .´Üf7Ï[ÄÛôÝËÕbã¿ôl°xVRUs!:á+¶Ë•bR£G‡ŒO)ö«":Vúéÿ¿…‹ 1lñ¸KèVÚ¿*V½þÓ3 ¯™Q¸oÀòÛ ç1ãýsR’‹á(\œ?½úßô£vD§¬LgÎ2¥È?ý>}ÑJKÇe\†yÚ:»nZ»yxmøçö™Ú œ}Ý\Mq³)jŸ5ØÌt°5*L<,/<‹üá¿æ¦føÿ³F¿y£¶0Ss3Ó5¦,ofꊾNÙ£‡G¨ÔzE5¢høýÕJ8ÀÐnZý/Mp…Ðjøî_·ê¿¾?¡?~=¥ãr/·/…ßñ«Ú;¡·D/9 =#µbð€ùKÝB½\Ü–¬¡W™Rk`MPáš‹C÷PšI7åM!aY{ôJžÿ?®†¿ß~Xš*ЭÍ-ñ¸)Lñ—ÑNÇ·Ô9ØùKS…¹Je9xµrÀw+IÙ²%kd+ײ5®=lIø¬aÖ™Øh{¬µsé±ÆÆ½Çw«Ùò¥ö2ëU¬Ì^ãÙÃÁ-¾á×WãÛGãÓÇÞ5´·-`²l‘lÁ×ßÉV.§ek‰õ=ÖêLÖjÖ›,·¦dKÙɾ[n+[iCËlyO{· ÞvÎþ=µ¾I4ÞilÜ"{¯²w”­±Y'³a½M\‚{iÜRúÚ;…÷ZeçˆïmmÇ£>dˬD?íev´‡ éÓWÃõ\½Ú _cG{õ Ü#úpñ‘y£uQùcu µ“éøŠñ”WX_Ê+´/ã“8 JÊmˆÄåç’ª&ñ‰5“¹ØŠOtIµ¦|JÍ.ºdç“4ˆXЋE×2ÑÕãYŸèŒgD?.¾h®a›¼åS:®ö2$}\€Ú‹GÒÅ£H„~vü†žöÎ~=iÿøAtTù&¶j<_þ ‘3’ KŽÇ$®x“Põ œ3Œr éä eýÁ¼Žë{´“‰-ënbË{˜ØPnH9™{[{ç«l9Áõr@ó®¥}LlµHNW³²5ÖœlÕw™-íiâÀúöÔ ÷!\И¢ÿ¯¶¥eË–®–Ù:¬ë¡õJèGz¥ Ðze Ь ïmÏø˜ØhÜ{ØØ8Ë4:ïžöºõ&Ökdœ· T0ÜÎ% §õF¶x…l=Gçˆ>̆ü¡tpápÊ7u†ò3±c}LìtÁ=W¢ëV.±‘ÙjF÷çÐ2^&Ž¡½HÞ¿éÞ‡óNÈûÆbCÒ‡9ƃÌMa£‹ÇÐ’iÐû¢g0aËFq±õøÄfS.®r–7 +Éó>¦z‘= +ä‡ö ëOx…õá¢j?Aã;]ÕŸ«šÈ•Ÿ¶b‹*ø¸üñp d‡ÞÞŸö íÇd Õ%7|ʧ5¦K­ÿî 2ïY2^3˜ ȇçŒâ£sÇÀ}˜ ¤!Z¿^¤sPo­«o­Î³'áèÕ“tÙЛñE²¾>~‡d¦h¬.¶r"S:ž NºǢu>„K¨˜ÀÇ7NæÂóG1>±HÏ >´wT?&8sÈ>ᱡåЛ÷K†#ÙMÎGå³w~Áæï›Ç‡UŒa|ãR~±@ι¤úÉ\BÃd6³u:—Þ>ƒ‹(Ã¥c|Rlr ÍSØ´-ŸÑg-™šk_S¹;>§ãÊDZ!y#È€äA<š $”g,z$ωM“Ù´–©|Bõ$&4u½!fåÑŸLÁ'6L¡C2†ÑÞaýذܑ,’_˜7ÒɧëîÓ›Žiš@û&´eÜL–/´F:r¹ÌžDëíeÏø÷Ô0ëÑ\÷Ò¢=ãm²f-#[»Š’Ùiœ{htzR¾Qý ·0´æ]zØju2{¾ëe¢YØ‹rë«u‰èMú¦"×§€~lµ®=ìHvŒ[xÆ;¶?Z:’öHêïÀö„{ ýg‚t@v}â@Æ=¶žï¸þZÞ¯'Ⱦf] çדZÑõN¨áü{:pH:úõb½“ráE£ùÀÜœoÌ@n}D><´.2 íÖ‡pìCûÄ  c +Ç0Ù;?g³6ÏÐ!yCó3€ó‹óÀ¦ åÃsGqÁÙ#(¯à¾¤wh_6´l4ž§˜òqLþ÷ó¹ü£æ|rõd>"w4Æ5²`4è^ÚÒ·Ïä [ðYÛgqHFùôÖ|Lñ8Ð X"ý :ô7èLÆ/qÈ<æŠZÙBúd†KA²T6ŽKk›Îål›Å%·Nåbk' ÝŒä!}8–7¤—ùÐÜ‘\pÆp60a0è9è‹ Í‰ç<:4È“¹ezßé|êÖé°Ö¸´Vôô¬) ¦lJÛgðaR7NáâëШ¨KÚò¾×†¨l@ü &¡v"Ÿ‚ú@z•Mo™Š~NcSZ>eãÊÆ3QÅ£iÿ´Ád@Ê Ê'n凿!¾f"›X7‰.ËÄeC’†Âú¦Ñ8€^eòGÀ³:4— è}Ag€|2¡})ßÞLlÝ'T`ê`+ëå62ëÕö2ÒÙ¯—†B²ø![³Z'Ó0èûH'.½5¼» è´¶{Ñá}A~@7kœ½{n¾½4N¾=WÙhdv”« éÕ‡ôŠïOg…{ktÈ–##œÂ{Ó¾)ƒ`m1a%£Øðª1Œ_2zæÜ¡¼Ÿ_ê 64o$ã8€t ïÃd eƒóGØh8ÙÊ¥+dZÎÇ„õËÂy$Ð:ôÒrH³n&`{ÁNƒ.Á­€ìa?60e(èFÆ;º?åÓŸ ÏÉe4}Æeîžúd‹YäÍ'²7Øøê \bõ$¤+FÐÑýhïð~\XÑ(6®z‚.mË .mÇ ˜7.ºr¼4NáÒ7MCø`‡t—¹i:—»wè&.sÇLÐE|Xæ¤ Pîþ½AÇÂ:lÁxõ¥sQ9£Ù œáLDñh.¼l è=°Í OКÏe¶Í`Ó·Nç“‘,ÅU†àõç¥A‡Â³€ˆEx‰-G…e§Q¿Z„´ná½É ƒØÄMS謽Ÿ³éûf²a¥£I—àÞ4Ò¥°^`M:®Cãå7¤j ‹äÞC}Sn&€AORN½ Þ­'¬'x°Ë\fËtЗœO8Æœoü@.,{¤þ½KÇ` :2Ùò8„ ª'byF2‡¹=ˆ¯ +XˆöO„uTdÕx6¼pØoÀv0‡|té8.Ḉâ1\DÖH>$uš=l0Èè(l‘Ì ]†u,¬¡ØŠñ`Ka؈Œ|rÓ§\r£)ƒ0èoX¯°.™°œzVX7\*ÒUi?å’ê&ÃsÂØ²Qã@ùÄÍS™Œ3ØÄê‰ðŒ 0ŽÈF̤³wϤs÷Ï¦Š¿ŸOåì›IÇÔŽ§c*&®™?AgÂulæÖétâÆILPÞpÐ… k\RóÉ6YvÒ‚ËØ>ƒFº’¯‘ û)o¤SÓ1ecéô­Ÿ1íÓ˜¨Š±€-@ï1þIƒ™ÐÌáX‘̆潉ۂ“k½cû‘.H÷!¼ 8”IBk écÐ \TáÖ/e0 Xé?r}P_ø€.Ac:\·Ù d_Y´ö™õáýñØÁ3ä›×â ñzC]؆Éý~Y}ÅŠ*:>Ÿ¬<¯¤òÍf# +G±~™Cè¨ÚqtÖ‘ÙTíýoèâK +Ú7ˆ=èéõ=ÙÈ’1lÁÞ¹LñÁùlÁÁyxìR[ÑZ­Gy„õ%œ{^g}¾ Aó‚ìZ\tÕ'ºäÍÓ@WÞ¡œ<{2îÈ.^ÊØñ9U~JÎ"²‰d·?ž5’Mß<ÉÙ;æp‹ìÌ7ÈU„Ö0[Ÿ¤xLÐú€ù,ÄlHÈù'fòF`ó˜= Æ’‡îÉ ýëˆl,à~$gXfòÏer^Er +|Ïz6kÛç€!idÿI4_ØæƒíÏ<‹ÊßÿYzd>Yx`Õ†ti“)È(Q„u%þ„厠£sGÒÑz=J‡£ÿ#^HçìùœÊÜ=JjœH…æ#YI‚ß/ }(¶Ï©[§ÒȾ#}@úÄö×z†÷Ѻ`ŽÅ&7N¡ Íaãê'Rhþ<âúÁÀóÑCh¿¬!TtÉh­.µý3Ú?{èTÒÙWt]&ƶt, zq[é•ÐßÁɯ§Æ=¬7èJ° ZÿX>Ó7}fG¹÷°G¶Ü†C?Wßíh_{Ä¿4ú8"Œ¹.°7¶§`?2ͦJ/*ɺ+_2™{gÒA™CÉXç%£è0„ñï…#™ŒÓ©ü#_Ð)íŸR±Õã¨ØŠ±TTÉh*¢t_ÿ |ˆØÆñ„_ö`kXo[ÊáQÂ;uV<’ +ȬõŒèc¯ó3LŠ?âd:¤¿Ý£úà‚òG°ÁE#± [ö‘C|ëË´aì†øLTÁ(mý/©Æ®E˜{EöÇ6ͯ¶þΗÚú®¯ˆ¢£sØÄÆI ŸX¤6›‚\Ær `+Ä &ƒ®Avk(È'àD<ÿèýží˜pW3‘CóÀÆäëí,²/ ²/ ‡1æ@² ÏAÅ–ŒË Ü‚íÂ`ÿÄÖG ÀXÙNZhGédÑú™=D£ç¿ëÖèg&­ùS6É.ú~¶ôÖ©Úº{VšÆ{_ù»?ûM¹‡ôõ÷µÃ„bR7J!YÃvÎ9¸éÒÖŒ Ü“ LCs…8³£OOàŒ²wš#q½­\V뀹¬-XŸ0~lDæЧ4²±´âÈ&‘ëÑ:p‹èC {Lù!¼‡ä“ÊFú£ùDãÌ†äŒ°Õ ®B8õ_àBx6Òx»‰=íxˆ7²éˆ‹ ûƒŸðÌ3ÒY`“îÏfï› ë l3Žä40Íaú`Ðý€Içõ½´îþ½4®½°=ʪõŠè£q îmË¡µ€x¹€°iH/ðMRN!½l¯³zÚ®&ÀÇ€OÁ¸iý{Òžhm¢{O§½bú1î}ÁïƒpÝP6qÜ4G€ÓÒ·M'ëï}£mxø5^_ Çâ +Çi›nMµ½µÖlûÛ2‡†§VTZº¾ê,ƒ‘e£5n½ìh®…Þ…,ÿQA± CòGh]{ƒ‡ñ‹k€ ˆzóá¸ð¡ .]…¸EÅ$]Âþ1ƒ8¿ð€?¹¨Ì‘Àg˜Ð”¡”oüXS˜+ ®0RaSÆ/~†°edÞ(¤Æ@¿‡"Þ™‹pzéh¬k‘ÍBömÆ ÷Hg#[< +­¹itÑ¡ù âÖ°Yôl JN+¨ÖßÑÛÛ›-a²÷Ìb`lüÓ‡¾¦¼† JL…ŒÀcdäpèN°×Äú¨~À-Ht=èJð d!<£úb˜ ¤d˜; ã‚Ø„Å[Mã0這‘ކ뮦ã0&O§ %7$€µ²‰u,Z ð}ø‰ìÂÊå«d0杻ÞÀŸ2ѯŸPô_„÷Ö™hhwz}ÂÐÛ4Ò)àÿаž&3"ýÁÄ×N`’[¦0•cÐZêKºÅö%=cûi¯¶CœÆÖÁQfǸôÐòˆÓ£vÐ}”'’]·è>HÞz_·ç‘ì±=µ,Z› î‘}`jœ‚zá5†t,ø-Aw"¾× Û?lçSsÁ¹#Àx²Õ“£a]•Ü8™.;­¤ËN)ãcΈ8.YyRNn¼†ÚóÎA»ëÕDéuW:Ö1ð8ðEx˜Ð‰uµÍw¾% Ì¡‚3†‚-"\ѽ~¸ä1±Ù”? ²·à{Ò%ÔM, +ú›öÄ|½/€ð@PêPŒû‘L>[Žu(²± ËXÌ×ÓGp õ“Ùì]³Øìí31ÿ¯›Ä%×O >C.ª` ‰ø Z\lñxŒ—3[>#o|CÔ^¶¤Ãr†ƒ?d™O¯ù”ÍÞò9Y~AIlz¼„h}¶X³ùÅ"¢æ’%]tÚéÌ©ÌúôA`k ¯¨¾Z¯˜¾ldåXÀ«dÕ%5]|VAÇT|HzE÷c“7›’ÕW­ˆæŽoÏ2I-“鏯 Tlƒ#džMU^³¢ëï/dï.aêo,Bc¯Ý€íJbíDà¥Tù19ÂV³°]Нý„IÙdŠñ1ú°9¿  ŽÍ£*.ª¬×jdà˹X³J£çëH®`M/'ƒ +ð œñ'ð¬M$÷àçíŸ9„A¼…›èÙp¯vÒŸ.Q}€Ó1ÑÛETŒ¡CJ1¶füó†^¼>aͺ^ “”wò& Z=(Ú+®?˜5Œuë²I8úöÊ¥a_Sö øv±¿3¦d—½{6›µs&<Ða¸Ð”a€õØ¸Ú lpòPÎ?v“Ú0Y[wQ­ÝñÑšØýa­fËÛ…dLñh?[n½ øe ÷è¾€ã`¬`ìñ:Gzãóhà¿å±O|HYÛgaöÿT|§ ¿ å܇__øRÞ@| J ¾q>ÙTÀQ• £CX„_‘žÄ +ñu&sâ-˜sOÁ|Ý/~ ‹t#Ÿ²ù3ºèÀ|àN°®1–Š(ךÀZ C¦r†²Q5z¾š= û‘Î{A…–#<ºçs²èø<&ûàl&¬r åÞþÎDUƒ5¥‹ªŸÞX.´j ƒî¥Yç× |¬Œ/’w¤oÁG¦AÖ ëÕbB|æ&¯Ç  ö"]F§·}†}„ÀݹùSÙy>(wöÀx%ÕO®ŒýåÉCØHÄëþ} ¾A¯ŽÏ¾4&“˜Ìöéˆ;ϼ9Íü ñfìcκ&wçlàôLÞÁ9 ‰š‹jªè‡ùT`é”aâ”gd_ð}‚ð íÚ×1¹q*Qu^¥­»fEeïûœôÏ6 |×ìĽ“¶}Ê$l3;¹$²é\Æ–idí9K²ñJd³)ð? ›ÚéÒ)\í­ÅlÃý%lÆþY€1@hКGzk^×È®Q¥ÈvUÿ¨¢*ΨÀï…ñmTÍX˜3¢òœRÛòtfóÇÅö­O¿ù:`Sàëà3b×£5ï5ðƒô-S|ØŒMi4å’š¦ ü“T90(½!zöפ´}F––SùßÏ!K´ ò}yâJtâæÉtÁ‰ydÃýo_WÒ~…C±Ÿõ“ø:]´›»ï ð¿N‡µ +HÏ×a½Ä#¾ž:Ç×Ð<‚œ8&nšÊ%TMÄ|Ýñudß#c¿szÛ4Ì—¡-8v“³u&“±ù3ìgÿš{¦ùæ2¶ýž-³»SKmy±RÓpÁŠÌÝ9ƒöBc¸;Â9¬O‚ ì øs¤Ã`mÂ3p~I˜¯¦þ6d˜ ËÃ|û“<0ùGæ²9;fqI•YÌ× 0_g2·Î€gÄ||ˆÀ'€çEz˜*><Ÿ¬<­ ‹ŽÎß:ø)1WC¸sõøê c’j'R¹»°.$n|Ioì\F4u-@˜d.è=ày°N±ÏÖ'a Vçf¼‹…cbõDmݵÃÖKè„Í“í´ˆ+Ûhe¤s@/Œï}Ò³!HGEk½oÔ@X;?bZ&&&œ@¯…öæã›§°uw1Kàý(Ÿä`C)wtÿ܈³Ma +öͽJ5ß^LÔ"Žû\Ÿ±YÛfhn­m{»T³õçešš*0ŒYꎺäSÞ?eÈ&`¶è UyAM5ÞX@Õ^ú +t~OdSé²#rĉæ²i¦  ˜¦{K¹¶v06då +,ŸÙ;?‡ µ}vÌ òOÎ¥ÛM ¿´AvÕz™€~å’ZLaÁ&_ƒôŽéGù$ Ô:Gö†Ø톸šïÎ?bŽŸ üÁ‡#ÝÅ!Ýzüó tÉQsì7 +Éx”.Ü?‡Þص\ÓtÞ’Îl4eSj'³yˆGäl›©Cºs&°ÿ _¢ë0ÿc‚+Fш‹6·[«Ãì ¬G° âžÜd§‘¬a=š?Çé€Û{Gáõ„}è 5éôÓèܳõú Ý#ÆŒÑùcذÔa?Àq#Àø'èdÿ`Íb] +ºì?`ÄËuÛ€ßþü_c‰u“¨ò£tÁÉùØá?ð<ØI. s˜Î­Ï ½1o OÁ¤—M¢Ú¬Æö#¼~Ìj;^fkËɰLA<½åÝp +ëÞì`^]ZÓ4x7]PÑ(ñÆ=¦ÄXÙ¢ +>uÇç,Â.t$øH'ŸgJÛTˆU±yÛf“ÕW,Éú«_Q%‡æ³15ŸÀµ\<¡9‡gk«o«‰ÚVdÁá/¨ÔÆIà¯Â1ÀݯCÌ tŸ†Ö7Ò™à›ý ïŠì޹H¿3­WŸ-¢·¼ xˆ‡Ò)´§ooÈ•?p~Ê/k0ö?ÀïˆkÜÂ{Û8¸÷°^F‚ÏÓ„LLxE÷µç|p€Z»$Zó²íàO‚œÀQºä:S²£À‰ÀÇ€ÚûpAÀáø/¦¢jo~Íæ>p3²îêWÚÖ®EÚºëV-ßNߥ-ÂÛkW¬”ÙZÛÈ4ˆ«;N=h¿Þ|J½)èˆ]­µáev«Y,Ÿp/>­gðKº‡bß ÄÎA61¯öOLy†ö üéð£0…à»™ÊæmEµýs.ñ'ˆ•ûê}]|Fë >}ã4ˆËbù†øà´Æ¸Tô,áHgû!ùErÉû¥Áþ3°­û¿ *O)±ß>PŸ[AƒžJß6l=ø7“áy#´®þ½ 7ô3ÄUÙ@$ŸHÎ[¶ÜYIFW_ÊZk.¸'–ðCFç|χ$…9àJ&8%Õ}ê[0tç7ˆB6ŽpÚÐ äF8GT?Ê-°ö/$6Mî¾]XGàÇø7uç4,w~ÙC@0EÇ̵Í/’ÍÏ‘%?˜cHúPbó‹¥°NéÄÁ‚õËa=T:ìØVj}h?ÈáN°öP¤[X-w2Ùí3ÀÿÈ"Èþ ÈøÅ $¶pŽ£¦Ô™Bô0]zÈœÞòÀZ‹x4èmˆ¡è".ÏlžÆ¶ÜüŽßòÐÛüÔ†l}¾\[wË’Li›ë„ÎÞ1C[{a¿“ +²æªUwï[àÏo±j­£l-ëgB%´N¢ŠNÌ?Ÿµu&ŸV÷)â€Sa é’*Í ¸V›?ø¡£ÊPÊÍ…{HÒÉ«'Áz›`¼ 1adçÉšk_ÑU­h„;±Ï gÇLÐ#˜sFUŒåÒvN5?]Jo~eMl|¿üÒlòöϘØú dÛóåÄÆ‡ 1ç F6ø䇡Ä-‘¾†ó""KF/ÿpuà¿tÉ!3ÀàCãÜÃûñ~™çG €Ø'“¶y*YvEIÇmž¨õMH†•Œ ‚‹†|Ús^&+–ÙÈ-Y![¹ÂNfC{ãx(àN²é΢ñÐðòÑàÃr ­ñèƒùDÁa Èù%=CúЈKûsÍ×VP¥g•²mØ÷™? +Çÿ —#¡jðJmÓíoèMOW’m/VPEç€Ìh™u&Œ«oÎ7bçáß—÷îÇÇÖMâŠvÍcJ¾·à‚3‡ƒoÍ­'rOÖäc«'ð ¸Ñ#¼/øÚìµ¼ŒZçÓ‹ +ÍA¾ä\¤¶N]òŠõZ7lÕ)+¦ôŒZ—Øl +ó þwrÎNáÒ§"2WS}ÔŒÚÑeÃlî\óK9ûöº¶öÚ¾ý†=Óts)]yJºj¿oMçîø|—8$"äþ 1;*u‹)•±kUvÒ‚h¼÷-ÓúÒšm{lC´¿[¡ÝܱÎh›1Â3®¯Æ3¢Ö;¥?™yp†¶éþ×d]Ç×âe §ø¬Ó¹‚]óøäâ‰Ø¾#[ÆíœÃ”Wp9»¿À8ð²8·é{˜+²þâ×LÃÍ%tóµ%dóõ…0¿à{&KÏZ@ì†kœÈ¦íš¡­ðQrÎŒÊ88ƒ,8>ë¨Üý³¨â“æTÎö€é06‡8à}$«BW_ûš®¿µ8U9xÄë÷àõXòöL0•'-Ù¦»ßQíOVñûî8ó;»2ÿØddýX2¤x„60wÄ \ü{ÙQN=육@ëe*è5­oðEA¼ÈÆšÁu òÙæéÒ6OÇx&(g8äkõÈ–7\_‘ã|ˆÙ!ý*Æz™„º 4â0?Úê³Jªì{s.s×L.² +û À9GºÔêOùŒ–é|ÞÁùÓ¡Ç4M“°ïü@¡™Ã±=¶òàãØ‡’=­é¡8Æ‘9üàà[áko/c«/£çìÈ~GA~ÇžÙ|ú¦éà³gbêãй#À@G¦§ ¶Í¢¶ß]ܼíª;zm=}`Öª«e¶öœ ç²m¼º”o½»–Ù|ÇZÛxÆt +µ¥sY~QÅ$µNa¢Ñû€Ï=¦|<`ðÿãx,šSÄ©Æ@\T[¸)ÂáÜŽ‡„vó“Ešæ«_’…;fR©-Sôñ‰M“ˆ Âadxù(*ûÄl&ãûÙh­Ä<*oËLðyq)uSÀfbLþÙÊ#*ªò¬%Ø0ðçñ!ˆ$5›žÊ1‡¿ÓM·Ñï.Ãü¤¹sÄL¨âfTæžDé¡9Dí]+*ûèl:®y"èomÕEÕòbäý¬µ'e`+õy SXÈk€ûœÇÖÜXÈnìXAŸ3‡qÙÁ1!oÄ©!– +|i`GbwÝ%œþàǹíj¿íõ"X dá©yTDãX*(e0pMàK8”? ë℆IÚú3–äÆGK@Þ­´^ºZf£áeö,²ïÈÎsbêÀŽ œN­é úÌÃyÅlJéD°]8v¹eóƒì"“wà 6çÐ|bë§ü ˜†%ÄWÐ\B®èÀºpdR†b_¿g\6¤ ñèíÓØ¢£rÐ\,š§´a€k1Í;Üe"È.™ƒýêà7ÑÕ?øŽBóÁÄÕON¾(È÷q /ë8”‹ÎÃfm™l´èZ˜[m[çRÝá«nNgÏGRûi NµÆZ#Û„ùøvR[?£ò÷ÏFœ^N¶}ŒcþQ¥cÁGGù¥Æ1ØÜ3‰šój²©cø+Ž ¥6 >}p>ð MíU5“´Õ”ðM õɈdd"•¶g:“¿op:¥q•ªÉàge Ñ;ùxE»ç’U'•`³ù´öé€ýDÿ*æ´Ù[fPõWp ·–³·–’›îáøøW@‡j›Ÿ.d¶uÚ‘›Ÿ/‡ûƒ/Ö +Õt»»ƒ‚&µÕëvàݾ2v|Žsþ@ïŸE2…¹ä®$TOÄka^ð‰SE‡æ²Éõï”´éSªdßÅ}#Ý 21 ¢ú´R[yÊûM2Ú§A¾ø‘AN˜Üs¨º³_ñÙ;fãœ>ȇÜEX;™»§›^-e¶¼]äøç× Æe™íÓg0gÓšMáþX#^Ö¢ð ^GN ¼;ºj,|pN Â7€u‘~bâë'@Üb~”G¶û0ǤOx?œÛ×4b´À}ˆàÔÁ81ØÞiCOàIöŽ&Zo„¥ÛL™ÂË +ÀLlËDl›ý’ãx<ïÓã° Ñ9dA_éó%R°¿ßx+øR3w}ŽùFþÁ/ ï Ö3è>ˆMãø°à{gÐáñ GϱfÑ¢ÃfÈ&~ŽýéçJ݈d¼rÖ×ÅGlÉsàqzbí¢åîbªý™µ¶¥s±wZ0‚ò‹ÏŒpÌ7LkÇJlZhñ(ü®ð>ˆ€ì‚~ß6ô©¶ùÖð«àwJ@Ï–»{&]ˆä§ô¤®¡ ÌAm³€³A~Yõ£Šl}´TÛöh øB©ÔÍSè”M¦g¾mýu+&ÿ´9öK£µùzÀ·1ÎÍÛ9bÅÚ¦[_õ—¬@7€lÃ~ÈA}Ìa2wâ|Yˆ/@œ|CVœSí¯VjîZ1Áùà /œ+ >Eˆ]Ãzg2÷Ìdc&°Á¹#¸¨²qà+Bk`:ŽÅ–à}#8ö^1‰À…¹ì­³°íÇü£n"þûú”´wþàu¯Ä‹~4£·>§Þůø–ýz‚ÏX»!n€Ö#²riü’щ͓¨â3dÕu5¬­cH/ÄëMŽ\ ¹¹€;p¼,¦p W3òRè¢Sæú1¨6?3ä å›G–ßPµ7±˜CºäòDSš>üðB=ö}²Y‡¾€˜¢Þ°y›½u&—sh.]vN…1+à°ÈÒ±øƒóä|qø…‘½Äz!±q2È ]|JNÖœ·ÂþK$÷h\g²yûç = &›ï-"®|E–µÀ1ï¼MÓ±ObBwŸqZóŒŸ=#š¯KVŸT⸕_ú>¢x ÄùÙÂ}óÁŸF•œ’5—Ô`û‰šs*²úœš*;hz™¨EzÛ:d³ÚÍÞ1 cZd³!ç“ÉÙ3 Ûþ-ϿӴv, 2¶| +ׂÿPÓØõ5ĤȢsæÀ_´u·­˜-Ö’[^}G4<üË}ááydÕÑpã+d³T ‡!ŽŠø±|ÞlÚÖi ÀæpÙû¿ KÏÇ>ЗÐÛÚõ7¾$³¶L…¼;ˆÇÞzc{‡86Ñòb1±ñÕBªäªÆô#ä°R%ädxÅ(*ºa¾ý3rã“Ålkç¢áöWØßûº€ƒ@Ìð0ø ’7›BòL€÷ª$î˜ÊÅoš9dwG¶}ÎI\páˆãfs$ï0¥SvN¥òÎÒV¢ûf¬£ )NÄ6Ž#“¶MÑ–_“k·ÿô¹óíZ‡í¿.ÓüÇZâ‡ß‰3ב‡ÞÑäÖŸViÛ~ZJly¿ŒÞýÒ;ÖéÁÿp?€û±cuä9Gµ¾ZAW_úÊ1£qºÎ7z ø%pî*32w’Iô)8nF7w,Ñm½O8·ß`×µÜÐ:o¼fÏÖ\\2ȇŽÒÅÕã1^I4Üùü3láI9äew¾F²¬Æœa{ºíÙjªýõ*ªåí2ªéÉbˆ›À‡¬¿ñ5Ös-] ÈÖçË4;¿ÕV_Ã~iºðûù ?‰-O—n¡»"^±”m»¿äŒËÞ5ûRq¾èÞY Çà'¾c:Yrl>YyE¥m}¶˜hé\LnéüŽmï´a¶<\MnìZ¬mzð <#øoàÙµõ·¾9¹&6>]¹#äÖ×ÖÔ®.{æÀC†Ú÷LëÐòæ[MÝã/µí¿/§Ž¿rd/> ¢Ï?÷åŽwyPSÌ.ôA×ò{ï:Ò{:5ìžNô½ÇZö`‡}àE_5'Š/™i«ZÚ·ÿ¼€<ô‚æß]ϺãX†ßvWKny½RÓöxp%0{Róªò¢Ws)sà1Cïy¥¡jn}‰óa2ÚfPMkÊ/˜Yƒw“M] ÷ßruÜ{Çlýu9YtÞŒM;8“Í91ð6UŽie}?ì1öwºEö>H—\T Å8¤òª%›}t.ä¿èZîÛ²-¯V‚ŠÊØ?ñ§qdbÛ$2yëmÚ¡©¶µ÷Ím÷w/Óÿ‡†8ý¯=ÿ_ÎäÙßÜ5WþgÃnòñ/1Ì«g™Ô£ŸâÈ›¯èso}`ìt7®%s7ïÆ1'߸“Gß³äñwwòîØ=_Ç}w\t­wíùºÛËøÆûßQÍK‘îù +æ•(:6‡j|¼ÛÜeç´ù>Á6>YÎæ›\Ñ)¹~*[8Þ)(}„cÊ–éL)ÄŽO)›!yûât`©Om¨ïìèƒOhúà#†>þt{ì¾sê‰;»ý)A´½_N4<øJÓúb!½ã©=½ï E¡9Ôî{o£ÝûëZjçG;bï{;zïS’Ü÷Ò>òˆe÷wqü¡»®N§.±‡o9Q›ž.×4ßûZ»éå"ôY2Gýhr 2Fn~±œi}l ñZ¦ý)ÈæZÝÖ»„nçM†j½»œØØ¹tÝ‚ô_cçˆYh[ž-Ðny½ØaÛ‡¥äÖ·+É/×h÷¼_Mìú¸†ØóцúþŽ>þéW4qò#OÿðÚ“=ôb»½ãÞ'sèŽ;ܵŽ>üˆ#÷½°³Ã_×hþºV{ôg’>óÑCsþ´'e˜kC¸k·bœ~¸êtìÒ~ï-µµk Õöz%<]zF¶Û„ˆSyæà+žÞøn9tÁºí—èÆ'Kì×ùö´s é¥õϱPdzç#t'nø³û^92ßè¸]OY¾ý1Áo}@2-]ÖlÛ«µô–WÖtÎ÷_PQ•cè¬}Ÿ“å—UàÿA÷T~a3Ñ:/¾¬d7=µf[ž­$7¾ZâÐþË"MÝ;+ûM¿}cßþ¶ç»µöÝë5¯ÿ;œ{w/Ÿy÷"K{÷?¢ë—êíÇòíoIü‡Ë…®¯÷—{?ÙYͽ¿_À¾z–«{þ ÐéÅõrÏ'§êùû·ÒÐ8rä¿®cμòæ.?ˆÒ~Èî}ÄëöÜur>tÝwÝé3ÎG.pûïè´m¿,Ó4<þ’ÙþÂAwè®'½ë–¨¹cþ?ð3mÖ"=d«Û|Gã¼û–›ãÎ;:à›dËÓe4ÈBëóäžGöÜÁN'öÔ=oþÔC_ÍÞ¿¯ÖùEC{§cÎ? `μô¦Ž¿Ñ‘GÞÒ̉§.ôÙ'ÞÔ™ŸÜÈóï<¨«¯¨+oü© ?{çþîFüø›£æô/ qî'gêúKþɵ,þé•löÖõêÄ3grïk Ùþa¥¶éÉ7ÚÖŸ–Âz ö?'éÃO9îP§3½ÿ!Mµ?^¥Ýò| ÓöØFwä¦È·îØõõÌžG¹û¥¹ýùfÏ’;ÐáÌâLìüÕZ»÷ãz×-qð©ƒöÈK‚8õVGžùÕ¾ôÊŸ¾þ<ˆºòÒºù,˜ºõ<8ùž£½¤À6'ß°Äþgí‘·fCžít¥< +a^t¦;¾»RÊ}xX éêö·¿ÛíN<ü9”zð<Šúñ±í§•d ²¡ÑU〗ALër„KÁ>€¿Ê¾äÎ\ûíÿ»„9øœçÏßsÿþT_wo9UxdŽÃ®ßWhwÿ¶JsúgJ{ô=éÐþ·Ešê7*‡†ß¾d›>¬Ôµ=Ò:ï»í­;1ÒñÚŤuWΧ8¹ͼëÃïîdÙö§v«l~³x‰ì½éÝJ„ U\ÌæIšÚ»jÍ¡?lµ—s!ßüœÀýt%Ÿûp5ŸùéYýÇËl槇9ô¯o3©÷oS¹÷× +½·—ûuµT¦ßȯ-½žQíù|W%ñþ¿¹·…ÏÔ8½ºRν~”Ï?íÌ%ï=CãéOýøÁ>ýÁMÓöûbmËû…ü©§s×ãuß?òf~xíAø@PÇ^rܕާG— ¸k]1Ì]¾ìåÇAüÅ[‘üÕÛqN·Ïf°WºBøÓ÷üÙ ÷ü¹3ôéçîä/Öq§ y¼éËŸ½À»€tž£]ëË/rL·¯¹ka¿çÿ–Ùë¶#.¾õ`Ÿ $O¿ÒQ;ÞØhK.˜‘E?Ì'*íWA{â¡»ã顺S×ýuoºñ{:êÜvqÜ{Û™:ò„£>Ói¿¤éÓÜÙ³ý¸S÷7pG{±ß?uÑîý}öð{{ +Ù_úôcwîæÍöÞD]ç­,ç—˼Ÿímð}¼½ÁóÅZ··§«Ù÷w²¹G7ÓÙkw#ÈÞ:ÑWÐ]w^](s}sªjý“]õþ]-µ!jCïÕVv4Õ¬Ü^éøþLõáuªæî>ö‡ÿ¾ü?\PñH6aË¢ùÙrë{kzó;kÐm`»4‰'¦Ø6TQç>x:=½PäòäL¹ó½s¹nÏW¹>ÿ¡Š¹Ý­¹ø»óÚÝ‹ÒNLµwî³ÆÚQF’î&lüÎO¹ƒ÷]\žÿPéûdwcHǦM^78>¸œ vÞÝE°[;ìØƒhœ~¼êtÿLŽî‡›AôöN[~÷#ô ý´#ÙçI{5’¹êú+i•9Ws«@Ý^í«püp¶„ÿé|‘ËëÃå1÷˱L¶_M¬Øw5¡bÓ•”Jÿ®æ*É­Û˃^OvUóïnrïºò\_œ®¤¾´?Ô½šhÿ}…¦áåWTêÑäæ_¾s:v7˜?úÜK»å¿—j ¯Ì³/»=Osâ7J÷øvŽûóµžOÖ9¾¹]Êü]tQØ•jµ +ÛÜýxfÂÛi·Ü×ðMO¬éú›ßU—TÄÖ+¸Ó}o^Kæ¯ÝŒg޾vÖ´ým±¦ìò|máù¹öåWæk}Ðò÷®¥x>;^ïñòDîùµ|öÙÝtÇ×ÊB;Òîå7¦ÞËohºT“~/#ÿèr&yÿI°ó»KåI‹›3dU•>L®Úr;¡¼ýn\éΛñeè}+2oäTæ]ɩȻ™Uþ ºjÝëÃeôëשäÕw~Ô‰÷Îüñ‡>üé‡þüù;aÜñ‡^ô¾.’ÞÑeÇ~ìÈqøÐIÿú"Ó·k[]`׿&ÿ®­¾]»šøçwrÈË?¯·¿ú?¼æî?¼´·þ×ÛæB·íšSÝËmZ^*m7ü’½ô8tÝëË•®¯NUR^ÇP—_l ®> @øÙ‹kí´¥¶=[͸«c.ÝtzøcŽ×“=µ®OVx?9ÐÒÙ²)º£¼&ýNnEìƒÂ²‚[ée[n$–ï¹[væ^DñµŽ°Â‹·£JÎÝŒ.¹z7¢èÖˆ¢kèÿ7nE–\½SzèZ\Ù–kIײkü¶T;¾û¡ˆ}7×ååÑríýÿp8ÚmOø?jÏoÔá7,{äù:fëG[ªù×eÜÖ$µÿ7’¹ö<”ÓYÀ¼x”N¿x–Ê¿»WÌýt£˜|ÿ:™ùùiŽîÝÕ§7·Ê©G/bNü—ƒöø3-{ö®®óJ&ÿîv‘Ó» åÉw ›òdm îjÛìúâD%ÿæb¶Û«Õž/÷Öz¼ÜUù¨¬ºèNjå¾Û±åïE–œ{QüCGDñyôóÌýÈâ3÷"‹ßŽ);ˆÖÝÆ[I•›®'U6ÝH®L¿•W­ûél¡Íµnƶäê,‡­Ý‹˜ýïYîлuüþ—.Üù®@§«—Sœ^Ìw~z¹Œ½Ð i¿DÛúv ×Þ©áŽý‹ ÷^ZÞÍÜ wÊ7:?¾XΜy¼^»ã¿¬¨5[YN}Ã2É!MÍ>w5:½¹ˆtá™*§·—˸_¹¾:XÕYÙP/±¦ú^Jƒÿ£¶&þÝ•"úùý$¯ç{ëR:óëSäÖÔÞK,ßy;¶>{oÅ–}æéôõ˜òS—jŽ_ޝÜ{5¾¼æZj…÷ÓmìÇGyÌÓÎtÝÛÌÙ'¾ÜÕ{앇Ü;1°6Ê/g ¹Î­Ì¹‘S•r£¸&ñvqMãåÔê¼¹ ä‹×‰v?v;Øwt{{"ýTp=»®æbzÕ¦‹©•±÷+|56ßÌjôFÏF¼ÿ°æB÷›»×hº~€¾};öl,º¿-ÿNÁ6ÿÇ»ZÝ_¬¢Þˆbn\N¹W¼æ >§oE—í¼W¶éFbÙ¾»1eF”l|Wåñjo5ñÇ«$Û×Ý^voÿÏ×þ÷î0íï?%8½;Zw»¬&ïVVuÝÕ”Š-S+bnUT>ÍÒ¾þ[$õæU2ûÛíç»+]Þ)·{Ú½Þ®ëƒùìN´Çóý5Iʶ:Þ?“aóC÷ªµm¿)׿²6²q„M\㨵Mæv7þÎo^Ä­±µ¦¸#¥¦öNr¥ûË]åvë^ó¢ÛqõënnÕ»n~ÕÛnÆú]7µæC·‹Ý¯Ývÿè¡»Fÿ~;MûË/ñkus«+:?·=н‚¸ðWîrW”ÓÛÙÞö5ÄÝ©h®¸‘Ù°åzrMTGÍFþÕ­<æAG"}ÿi4{ÿVÿæaaàÃÖÆ„Ûe Q·jêwžK©i¯ íª©©~\“~?·žù©+‡xùs ñü·hû{Ý.k/v¯]µÿƒÕêâšq« +·M\y¹{‘ý‹ß7°Ü*ȼ™[Ýr9¹Ù½ò“ËÓ¯å•ùv¶–¹?ßQF½{ŸJ?xEýð“²ãtÇóx¯§{ëRï4ì;ŸX~úJlÙÁóI•{.$¡ï&•»P¾éRj•Û dcß^,ûšs3·æØ¥øò³—cKڑκz+²èCgXÁGô¹ˆt]êýÜjÍß?&¬|Ômo÷{wˆÇ‹]•›ÆW_ì />ú0ºüàÃèŠÂÎô&ö÷ëùìï·òÀ:8_îðîo¡«Nt/\…§Ï¥NÁ&ß8p2ËÅÖ2Å—ßÊTV‹eªE23Å7²¹ª…23•l6®Ç²˜£Ã—µýϬå÷»—¿ASôûì~ŸÈæ2]¶x1+[ÉجÐ%÷üòkR6cøDÙÙxtÕxÙàžcdÃL>‘ëe*›Øo†Ìtä<ÙÔ‰ +Ù¬Y dJ[Ù⬛£¿;ÙýÕšÛÝŒæÅ‡º]™ ?û;=¿TÞ~!µúÜ…¸Ò —ãJÏ^‹.9v)®¬ñFrUÕµôšÌ[y É·Šê/¤WïÆsš\^{)£ºôJfÕº7ÇʵÏÿ'ß¾IŠé(©¾Û^ôàQX!ZCuÚ¼M¶~Ømóݶ?æ}·c„udë°5ñûƬʿdj½í³•ÿWi}¸ûKëêû3Ú{ɦ™Î—M÷™ÌtÌ4ô£eƒeeƒdýeÐg(úßXÙ(™iÏѲi#MeóÕv²oJz. ?1hQ݇IË;»WØþÒ½ÁþîHÇw'‹Ø7/s™Ž)lç«tîÕÓ<¯g»ª3nç×Ö]H¯h9›úÿ±÷žaQ%ëÞw• JDDQ 0¢(&r¦»éî;A$ŠH’œQ$(A‚Š`v £Ž9svÆqÆ4y‡ÙûœõÔ]8çìÞóìs]ÏûÍÅÕ„†nV­ªºC­ºÿ¿†=Wа]lÜu¹¤éÄ܆ 7³ëvÞ(lÄö¸áô•¼† —óê.ßÌ©ëº]ØÔ8XÚúüyJ•ð&±æçWz·¶2öugè/BŒûa¡[ñÓåÊ yNnhÚT4ËÞy„¬Ñô)é3÷-Úeæ½^kÊ4 +¡áhÒAÚäC·K h ÍO?kãg q«õñ_é⟴Ès†øcüˆéhî|ZJWhºfòï®5œ­lh9]ÑØp©¼¡ùRycóõ²Æ–Ëšz.—4î¼TÜxøbaã™Kù Ç.åן8_PÏ̓7òŽ\Ëk¼:U·ñne÷Ëërþ§ÇåÔŸ~,H}Ѽõüsìƒ_¦Ö4?Ëkö~#ˆ–­Fv–vxšàó‡s†ÏJ“´úÆ?àL5пðûÿ|h’ÖÀ_†iã¯FHWÓÿ41ž…f/ Gî¥÷Ì¥°ßø(äb¡|÷¼2æÅž–Ý‹/_Ê«Ûuµ¨q÷õÂFlcêÎ^Ë©-¬n ùþdMÉíÍ­06¿¼’[èz^C˒ƘW½üŸ^Tryº)÷éæÖ{߬Û\÷<¯^ü!νé¸Ëý‘áh܆áäüuñÂ÷#p›Ìðˆ3ÁßÁ÷ÿ¥5ÿùÐ ­ûÇvkàè;}ü~£ñ\œ¹"9oz9ÚcŸ0CôAXŽþ¾TýõÝê°§ë£_ô7¥=hiIØ´õüyËâ1 }ØreCôãÑóÅMç.ç‘~[zâR~㓹ͯog×+¸Qß/ÒÿµÀIÞ ±²ß„ Ÿ›‚§“(ãú}@5?]ø¬óéš™›‚&M¡ÙžihEÁ½‘ooúÇÛ™ënulÞvnSÓÁ Åͧ.å7¼X¸õäµ¼Ö#×óšÏ^*h¾r®°ùüÅ‚Æ-×Ë +k¶n(o®¾³¡i× Î»îä4ìÈ«ï(n’þ"¬ó5¿Ϧ“— š¶]+mòû(¨æ­T¡Ñ#LÉÜúïìÂÿöø£ÿÝmÒûÔ§ºøc8iÿHü}¢‰š8Mަ;§¢Êvå»뀟„Ȉ'û7tœ)o:p¶¤ùì…–«— +¶Ý¾TØ9p#¯ãôå‚–c—ó;/—4äÜ©o„Gá`u#öï Íw‹Âߨâ; øÍœ6ÿÝŽ!k¨EÎYëúTãÓïôño ð‡±Æ4ZËÔ0ÇýdŠm’öñ©Î4R{22Ò²EÆz³Ðso4ce>rZuAÇå’0‡{{)Ç- Ø€OhÌ¿SÓ¬üa 2èÃÙêØg;°i<…me'v#`k &߉mëåÙ ÏŸ¥ÕïÃ9gúóú¦€ß„Ïîo¦.õU¡1ZFÿ—¾AÿÅVÂÏø ˜§#°U‚6Y Ÿ‚Æ-@cÍœ¥ébd1Ú™›,Df#æ"³as‰ÁldßëÏCæ†øïÌ]ÐäùáÈ1h·–{¿`'~-DG>=Pwog Äf‡Ï”4nþïå•¢žç—Jv|}½ ëíõâßß.Øñþn~ÏÛ¹ÏïfoÈm‡¼Ëõްh¤Öÿûø‡„öAœýe¡cƒŒµ-ðO#q/‚çÇþSÓ +Û’ h´¶26 ™êÙ#3ÃùhÌ8w4ÑÇ~žyh>·]c!ߥ¹´ò;〟…0þ» ¹-ç65~ñUYëõ‹-·/ç·Ü¹R°íέܖë—óZ®\Éo9|=¿ñ¶§ç®ç6ÁóM7KÜ^ .3æ¸ü¯Ûò‡Ý¡O,û°Oß'vDïÓ÷£p?ZèLBcq?Y™: qæÈrÜ +d5ÅYÛJ¥­ YN– +4z¢7Eö~5hi΋ÎW…9ÊoÎäÖ©n$qË•'.ç7àØ¬iëâg6CîqðŽ_p,vófNãÃ+yW®å6â66øÿ*„.‰Ù¬i»À ûÖQÿt»ÀN'–A›|?d‡æ >‰FF¢Ñšc¥¾²4žƒ¬Æ¬@SìUhÚâx4É!?bÕ ²šD£1S)4f‚¶ð@cÇz“ßÍ‘6£e¹Gx|#x‰Þ aO—%ÞéªÚöUEã­ÓÅ­/m»q©pöñ-®å4|s+wë‡Áì­ïd¶|x˜ÝþàVî6ˆI}T¶ ÿW}ç?’Äh#?EC>æÞÐïFàß#s]Kde0YÎ@&³±mžŽÌíñü[‚,M–! ÓeÈÌtiÛ8»`4ÎV‰&͉CÓ}Ë‘Cøa­%›ß;ì\o‹D?QQúÊ!=}¶¸åþ¥‚­q?ÝÈn|5Ûsîë‡9ݯîåv¾zœµýê@.Î%ÊkÝ +˧Ìôù_Í¡¶"ÒàÏL4-‘‰Îð¼2ÅsÎLk~n2Â}8?L‡Ù¢Ñ†³pÛæ#sËEx|ºà1)Bcç#ëE‰h¢kš"ª@Ó¹64î@óÂNi.ÛòçÑ+„yÌÛi©—·o)¾RW·éJUýM{ÝÃm;~3·éöq7rš^ äl}s'§åÕ`vËÅ+yÍÉ÷Ûê=® +K-GŽý§ûíùö<•™–²ÐˆÛ4G3üü챆~§9YèÙa{ˆûÎ`¶›ÈÊ|š0‰B¶ bÐÔéh²gšâ–&¬Ì@ÖëÑxLd'­Gsƒvh.)9Òù¤0]ü^XÅ¿¹’»öÆöª¢‹õµ_ߨ~ïtÉöGJz.^Ìo‚œaóíò–uOÛZ.ã<áñí,²©øá\™óAaŠ¥åœÚ—k“X bDì½´±/3°Á¶ßYhOÂv~‘£ÉØ4Åfšæ¸}Ñ[dj0ÛFü5™›aûoë‹lìCÍìH4q^,š¼<MÕ£‰¾•È>ò€¦céCƒ„InOgÇ©¾>S’p¿{sÍùªÆgŠÏ4=Æm»u1¯îÔ­ìúoîeÔüø0³íýóÌí·ïg·wÜ*ªüý»{EúÿµÏ†bàÿù[2 ëáÞ2ÀsÍ ÷¡%y˜iG#ç¾²°vÃcÐÅãpü|?—Å6E„¬&û"‹±.Èb¢'²˜Œ&8á9X…æÇÒZ¸åɧ>Árå 0ßePp”üò·ØÈ§}˯UÔµ]*k¶sëyKã1Úüü^ζodw¼}”½ý§GYßÝÍë|=˜kI >/±­Íâªß´þÁ>Ù#Ü}NG6ã]ÐDÜgd9Á ÛŠ•È| ¶c±ÍÄó ϵq–ËÕØÈÚ›$FÖÓ4i~4²ó(@³åhΪcšó oŸWó\ßé„0~Y÷ïc]/ ó½ÞbùOÏ3ƒ^/-¹PW·ùluË%=×.ç5Ÿ¼PØ$ø-T|Zð <‚ó‹Ë¿…r_¿, |-ÄyÞV8o¸fj1bÒÿØ®!ߦG¢C°’ú$Ê=ã~29 Ya^sF{yÍ»ÑË÷V~%ØA<¹ò„0mÙö¿[:5¼5]¼åñ’üÛ†KÒN _¾éޱË1aºûCÁ%ðG!Iò£Àÿ|­4äÝ—›“ž¶5@>99Äš' w½œßtúzNýÀ­¬ºg7³? æu<¸™ÛJýü,Û-ï¦)ذïÿÌØÔûäËa|Bdl1Ì +3ž&ÍôCö^k¦EÖ¢YÙÇ´í˯êÎßtSoAñÕásÒNjÏÉ9«³°ô¶þÂŠç† Ë.̹>|QúÅaNŃ#\Oö®…e+÷ ¶ÎÕÏÍÝú…i^/¿Ç‚Üÿ• ð&ð²BZêý­õ³@»vãØ9ïníV1#A>®ô4T{ŸñôÑŸåââcWò©¶Ó–ÿãR“ôØõÑ8ãŒÌ'x ; šæºͦJÑ,ª ÍQÔ 1{´«-ë¬WžÅýsWXèzWXöoiå#ãEѽZsÈAݨ±$nÎòü£å/L]¶þ2Îý„0Ç'Þ~‚¥¿Lá~¾Vä÷À{WÞ²öo|f'ÙrÍŽ>ü7 ë»dÅé_WÑþ&’÷üÝ…ëÿ×@ÅñßB¸S?…ðGߪÔ'îG+/½H‚ýN¢kB ³²RËLëö{°3ÍdøDëÏGãm¤hâÌ`d닦zf {i šå½Í^f:ÐhÚ,dgç‰f-âÑ"ªRcqò‰aKÖ_Ówíþ—Iž÷7ßGB`À[!„úù·Üȯ÷Õ*~º^&ûõ×tùO¿gú½8ïÞ?ÏòÝþf–ß^Á!`@ˆo ŒtP‘?ùÀ=}˜Í}s¿ üíWÍaoÎ5)~øº’yø!]zSPÉïþ¾šûöeqѽ-íƒë·V7»u|œ8ÉfÑ?1.5!kñžg¸¦“‘•Õ"4eA šï‡©b´„ÎFKcÛµ—Ô]7^yE˜áù» •×*~<•Oýy03ð_Y+ÿëý éßž¥‹þ*¬öüM{ý$Hý~Tþ¿áìoŠÞÁÞU—ÆùÅÕëyEVëú_|e·…pQÿßKòöŒ‘™×ïóc^ímz}°%ùi÷ö˜¯¶‹$ˆ ÑakÏÌSö?¦ÙSo•’îz®k7˜<})ÉÓþ»Ã÷Ûx G4Õ^†ãÜ È1î¼ÎâM_9u +xì-öþI ýÿ,„ûÿ.Døþ&(]Ÿ N.·…ß Ve<¬oè¿Wß2XØ¿º^ññ\!¬¡øâ±çyNpô:.8xß<ÅÏ„éaüÃß²”¿Þ¯æ~þfCÀqÁY£é²`1òõô@PG û©î§ÎLÝùyŠÌã”ñµÆ|Þ1[f÷_ýøc‚èÞŸ¼˜¢ýe™½~‘UÃfÍ— «“ÿËZпM-gák¤š¼GAšËª_™‚ýsÿ‰Ì—PÉoBœäOB¢èG!Âï ¶Jt[ üo +’ÇB˜üƒø­+¾-p¢3‚·¤á•½¤øµ¸ë;Ùà_#˜wßçË~Ò¥¯„ÿþ¿-’”µ‘n{¸îûÉ›ùò#'ÛzkUsfÕ~vsøA âØu¥êöµ¬Ç—*ù“߆pÝÙºAG¶êÊöØ36äÙ¹JÕw·«Ä;o)ýß¶KÛÅ‘ZãШáÖÈÄh"Σ¢‰3üМ€ ä»_ÛqÃÃeûÿe¼Û]a)žObïsÂrï’3Þq]úþùG,üÏ žì³;™1ßìmS¼´™ýð´HþîízÑeA,ÞÔh!NX¥-^»NWœWbäßtÌÖÿšàË¿yZÂ=}‘-);4ÞGª@¢ÐtmÉž¿¯ öüî#O¬6’‡fê°uó‡¿U(Ï?‹ãξ +ã®=UÞH Üýa…|ϯTïk7zçüÉoBé‹?‡úœÝ×î6˜8mɳÿñ0Á>cÖ9ZÂmÒpÉ9;Òý®àì÷ƒ üIHò/a{­”`¿Kÿük!ýëÇ"l|Ö÷/vöB‹–ÌC¢ÄdÀ#o½O¯ç­yÑÛ•þ¬e{øÛcMô +ăï»ë‡Ù~嬾œÅ瑨ëõ|IÝ©©’/÷¦¿úš¥¾x(?ø*u«©,(IË/PŽ(u¬ÑIýýüNk¦íÉRvϯ"õ…§©êËRe—Ê6¦·šø'5. HB-ˆÖ"ëéŸÆ¥¥…ýÚ˜hš£-VWj87}7ÖåŒ0Ëí±°Â÷Ï‚Zþû7Yôß^qy¼)äÃÙz¸÷ǽQÌ<|—J_ý5‚:ÿ%{íc¼òáÓ"ÕÀó<îØ%µ¾ÃÜÏÅù8-A¬ŒE°ÿ]Ú6à 9ù¯^’¶ës¤i›Œ Z¾õâ|j÷{Oæð;™|ëý…òÜÖ1\ÉöñÊMÝS¹–eA½õ•[Á×JÔgÆóG¿Vòý/¥Tï·îTË­…²Š}“ü’ á~›™ö²vðô¥ù¨éhü 74Ë/-KÜ?Ìý a¦Ï÷ƒóËU°FçûAàüß¼äpàïNþ9:>þÁÈÛM†¥Áˆ£‚5Cc2 à +:§òÍ·–s•ÇíEþRä8q,ršl…–ÁcúXäéꈨ–‹ŠóV3§^s²æKóè䊑dÿyÿ;²':&G K×-Y~ûk¾ó'[{v>ÓõÆM¹ïÇÞ{³NqíYµë/îTíy{Ùá_|éË#˜ÇoSÄß +ឃ‚ËÊ·L–Dõh-^µ[{ÙªÝ:.1ýÃ<ÓŽô(8iê½û{æã‡BØ‹“w¿võö—¬€#ÂJÉÖ7s%=?/<û~_˜Új¼l™3šc3Í·²Bro/¿F?r}Îèðì²±P'xøgæê«håà`¶ìË?Ie‡ÿä+Û÷gyå‘©òì +ªf×TúàS1Ù£yæû°ÀƒóUœ›J¯ï#ËÑ•…¥èÈ£“tHÝËî7âà“wÖ]|”JùÀJ›nΕVž˜"îþ¸HÔþn®oþ1sWežæ\g5šŠ}óØ™+Ñ$—äZ«á²ù…ç!ÁÞë‚°Âë"~Áv¿ëû©žEûM½’õE;Í·ôM ¬ì²–Ô˜,î~è îûÞIV}v:•Ù5†NÙjÊetŒaröX3™{Ç1ñ#¼Ý|DzHê‹ý•T‚”ªM¹:D“)lµ’m½üý¯ ~¢s‚_à Ÿüü7Ÿ² HÈÓ…%j†&hùúx¡%3& WGGä+!:þœq‘Ï)a™göIcÄÝú^©GGz&ï6ô9",”þ ¤Á^>é]!L”ßkîí„<œp›<Û’•ÈuÉR$OÌÔc÷¼ñýO$tÏ3gùš<}‰L &]JóH=jÑØ|‚öÝP’:Ü¢.ÐÀïx¶æU¹g +¼ÑˆÊØlÂTõ'ª®'"¨=àúŸŠU_ÝŽR{ªR}ÊízïË´½Z.ïøzÛýÑö|*®?L–ø‹§´û•µåä yÝ—3eGõ¼ü7*à.Ž©¾BE¯…Üo>„›Oö+ÔY¹RŒ¼$*$R¥iISGyø)ÐrG7äç­B^Î>Èy–òZî>Ä¢á4=½DÈe™+òñ!™˜F +u˜VHR¦Qpa×äâ¾éP¤*¬5Ž\ß+ÿCwW)£”õýä&Ïi6§‹wŽ—÷üà,o¸1Jm6•%TÊwþÍYuñy2{è-Cj]Öo³€zfjãÞITá¶±tAç8yù![Iç#É¡ßÝ÷ü²2°u`®xLJE¢¾_–ˆŽâXöš ü»*ðÚßYÿ#]*.Ùi)Îk2•ìøu }ì=Øòr$k«©|ý¶ÑòÔc ¡á¼h rœb‡–Ï]„üñ¼££s‡C-hé©RËMA‹ª;3‡îã£øâ‚?òç=gøýOeÌîw>TÝq{&¿ÍŠË¨ÍåtZ1YmØÞ¶YRz&À<”îyïF]z¬¸ò :þ“TºçW7Yï+e}?»2Ç¿g¸k/×ð_ÆÊöüæ*OÞdĬ+1¢òwŒ“¶?vdÎ|¯V=¿WýíñmÜ· +$g±è+ÁCÔônV@î1 WQ4òeÖhŠÒ:F¼dU§¦Š”k4¥a™:òà4m ½ZÓÅÉÏ¿9h%ŽGè”M£ä½ßºÀ¼qA ™ºÅlh¢¶:¥ÒLYýÕ¾{Лîp–wß[Áîxá ê÷T²þïÜè²Ý6Lnó¶¸gÔzA}<·q‡-èó„]9“ÿ¤¯mÍÓ]¡7.*v½±•§g1ÏL§v~paN¼æe]/—É÷ýäEú.€®:4ή1£òZÆH³;FKÊN×^Ÿ&Nßeê£NÓô¤â5ü”™Zb:EÓ_®!Oi2‘®­1rY)B“†™¢Ñ8ošc2¹-uGnNËP€Ÿ˜è‹åÁ”*F‹pqÖl¥ˆˆÕ¡q[ÿ¢Ž/5Ý-UR¿&Ûj†¹Þûþªcƒaʃ/ÔTí…ÙòÌsªáêö'ÀC¿xþÍ=°ÿ粊“¤Åû¬eYm£å ¥Ð/~À“(Ôæã±nN—›J­«0‚qO•œu¥²Uëuýpæ+V!¹"U‹ÉïG·>vbÛž;ƒn6è=¡CÏhùÞ÷žPÛÅ´ .¥v>u¡zŸ»A½8m +“ß1ŽMÛbJ§UÓëÌäØÏïþà,븿8pÏ{gù‘÷êü5súŠ>÷6˜»øuuì½LzàwOúÔ{…tïŸ]©¸ƒ.DC¼F ê·èÝ?ù¨N=Ztçjúæ@sö­Jrô_=e_ +"qÕÕÉ^²(4Ëb2š9bþ:yú³H½^W¶z½n`Øm*"MW¦^§íìêV`û¹b‘á±QÉFLbž4$R|Ÿª¯L)3!̨è =.,A›KÕ­¾ï‰Dyð‰’9ôm UÚ:ŽN¯2‘õ.—Ö_µ—vÿ²ΟN/)OÈÖc*O“÷~p¡v~tÝLªòàTªü‹)ò†ës¥Ýß9Iöþ¶R–Úbâ% +A ¦ÍEöf“ãä9héÜùÈÝÝùø‹»7öm8>ö 䯈AÞžbäí+A’°-yz h‚}mÐZ­?–Ó¤¤ØöPš„×|a×õÌî~îšÝTb¾S±{2»ç™HµPc—-ïµåòZÆ‚&¿÷¡\q쑊?úBÉìÿ^LõþàAíþÙ jÂèÖûKàò5–tÅN[Ù¶ëÌ·ü©Wá²ýñ’V³“W Ì’t½u ìzç$+Ý;Až­#á×húÊÃ5$¡iÚTâ#éê,Ý%óÑœñSÑÒ…®Èk¥?¶›2ŒHІWnØc§ê¸î©Øz{p×@‡ô +¥r5 +3ˆð0óê,¡Öt_øM;¦B)ö㙜 ¦¨ÝZÞñl)½ï£Õÿƒ']ó•=»¾Õ‚ÁЋgS+MHM^NËXßÔ_™Gt+ŽN§ÏÌ¥ëNÍfJû'Òå&Ëv¾^Aú^ÄúNBíøÙÚpØô2¤ê$-1³JSœ¡MÅ”·Çö9±È4õdÁ: ³úôª‚álÎv+¶ü¨ÕüpŒ/ÐüÅqÅx&©r$½¦ÜˆŽËÓ§b³†ƒv$[¼ßV¾íÉRƒ\ó¥½|û­%P[‰ý_êØÝpþè•úì`áÑ*úÐ÷ò­7°Ø÷Ë79j¡~¹ðu˜´ÿYN‡…,¹n”¼°gœ¬÷WgYß{WˆwðØt•íþÙ´ÀäQI:°¦!V†k––Ò·Žtn÷ØÀàtm×e~hÙ¬%È}©7—R$’ÑH¦ Ó”GàÜ2±ÀNÌÔ—F%iƒ’h¼„§êÐéõf\ÅÉY éº®êÔ:seTúð ¨ =®©ŠJ×StOb[–‚ÖhcÐ9[-èòÝ“¨î'+˜ÎÎìî¾PçÊUî±=Aºû©‹bïsð™T¶û­‹tßO®ô‰wŒâòÓxÅ™g«Ø½oIJÝOœÙ ½¶l^ýªæð ùþ>¤vùÄwJù¡¿á¼ãÁ|Yj1•ZoBu½_!ïy·’n¼î ßtx +Ûn)+;2Iž¶ÕÔÅE„g; Ïåþ8žÀú’ÉðWì{dêM¢ùQ²‹ht2±©Ã@3•ŒKl7ÙºCöLï×^T÷Àr>µx—˜iÀoµ¦ëOÍa·œœM7àÿ×÷ƒ‡l×·+¹ü+f}Wr`2°6èÌZ36³Éü$›·Õ’hê¬Çù`ŽÅ‹vN`s·Z-ÉŒúÑtB¦Pd@ôv6}iG¾¦l1¦¢²†Ö<¼êðA£J¶*Sê¤AoÛtl:_ùÕl:±È0 +×É‚Œg*¾Ð€Ëí°‚ù"ëÿÁM¶ÿ½µë;Wª÷ƒ‡¼óùrné í:LÏ+7ÐXí!zë†5Õ÷Ú‹ë}Àz!gO¼T1_¾àd»Þ»0›¿œ ºsà7ä[¯, ¾  öÿè#o¼1ŸÊ鲄u5yz“)]‰mf×óåCPm÷—@ý8èùƒv¤L‰çZhœµ~‹)¬ È»_-§®- ¢Š†ûzñ8òDþ~<â’7â6ôLmJ®¨g¾–æ\Z½\cYlöpYÐ:miX¼0;è¶A'`õ€&¢²oWóÕ|ÐÖ½O¢qß=´G‰–6ö²ÖË dÝO—áùèÄ4˜Ç¶\ZL·,åwÜ÷Uõ=”q=·½˜w=˜Ýß{Ó¾q'¿âïÝÏT¿¸Q¡~xµêïC.žMçŽ=Q€ÍeršÆà¹ëÀì}뵸ô¾ßýd9}–^4Zá¸Éã* ™Îo]ÙÞo}@_ŒÊï+/?:YžÒl±¨§+0[ƒèÛÝÈÒÝS 1"{¿¦ra=¬o0Myà*|úØõ(~ÿèÂ0¡QøùÒQ ‰Nïyç+Ûõִͨ­¡A‹˜L,Î+×”1ùÛ­˜Bìgq~Áb[Ád5˜s›Í˜¬Fs*çG)›™”-&̺c>¾Ð^S2‚Æ>¸¸À !Pe¼&›^kõ­TÏ{ªç•3èxp…ÛÇVQ5ÎsZ®;_ øxÀå6h ±)Å#AÃ…Ù÷µ?ü©Ryø±ŠÛ÷P9hFÃÚ ÑªØkÇ–m·­'ºáü|О6ó$ºÿƒÕÿÑKÖõb)ÌÐ0ã€?“”gȶYCÜBíüÎ-Ùo ÜÝ@œË@N ¶|×$£ ¡AÅç艤*° š ù._ª+ÉNôÇsÛ™ÛpxšH†ðä _Í–ãD¾í¦£¬ûûåòÊÓÓ¤«K†»¹Hв™‹‘Î @Ó‰øÍ5ņþÀ#V%hJB“µýÄaØn†!6,]´§Â[.øµ^t'Úi1E ÜÐÐgÓkÌèÕ)ÃÀo«¾¸£=r3†«=1té@S‰j9¿€9ôAÊþY&Ùù³SrÈ4ì™JSÖ}5—M©1 TFh@¬Ç–î³? yµ,4^´ý©µF€F µ®z”,>ÛÌB6ÛºÔM&<èMf´Œ‘G¥ê`(çè$ÆOÀ±‚µG +´„°bœ¶ŽŽ—Z8’__n +ºŒÐ.à ‚7_¾wèÕaæ2¤‘µshÝ·ˆhF¥T™Ž!h}È»¯¾aÁOµþ܈»¸Ã/H?ÐI†òàh-*8vˆÛËØWÊ· .fS›ÍÄŠ8Í@ÛF&BƒÌ>„Íi±¤SÊGJ‚âCZG®0σWkÂ.kð£ˆ$<¢C×è¿ç)æ|^­%0±ÀŸ‡•ŽËÒƒu2 £‰c yx¦.³®Ê˜‰Ê&ãbˆNZù9u\ùÎÉ8o_ º‰ìއÞLçg®îø<¢y·ù {`v»O¹ç<ôô…ug¾JÚ7¨&ÚõçÀ•·\p_Ο~Ê_{‘uzÃŽ+‚mÙj-&µûÇí㘤ª‘°VEgn5‡Á_¦á¼Ì-™¶y¬ @Òð4™*QËç®nÞKãRMøÛyˆhrƒþ4è—‚ö?–¬#££4éе:|zµS±Ø@Ðm¢o,Tí{È«ö=WØœtD¬6èb^%_  %–ñˆ Ñæ“ðK)Å&á¹”Ûj<Ð.Rl>dOt™q ͆&꽪ê£s”UìA— ˜Ult‚.èÔ±-W—ðUûf‚¾áß0×P™´aðº¯A·ßpb»ïºAlš¡„›×l:˜ŠƒOê“÷V+·Í +ÎÍÇÝÏ'11%Ôê|½@E¼&™®KŵHÕñs8çqCŽS¢%ö‹‡ èr†jHBbµèÔZfã¾ÉLJ•1èă–*á§–›(³k€Ýg ´…¸Î{n ÅLlSR¶¡¼ã¶Ñÿ9ó6„9ñ£‚j{åÌ1&±ÂÏ M?œ{ÒÆ ÝóÂM^n6ØI//9òö#à]‘>H­6îá8“Y¢ zÇ”ÉøPMÐò&Ñ Y†\bš²N‡hÊc{ȵ]^¦j?ïÊoùrŒk&2YôÁØækKØŽ+A÷‹Ë©6'±ÖÖË‹éΛˀàʯµRoŸUÅ¡Y uH·^^¢Ü}_J÷~ëŬ-3’‡ÆjÎyé¶IŠÍ}3;Èö¾õeúÞú_ßóÌ…h1•î™ÌF—ê³1¹úžRÜ +ÍU´§Ûž,ãkA+8jÐg°–ÚDì®o¼óÛ6»},›ÛiEâõêÓ³¹m/œùÎW^ªÎgþªÎGþÌö;+€…¨H¯2㊺&€–!èèÁ~Ð7fò{¬IÌ±éØ ¶ñÆ"¾ãw¾û•¯ªû¾8¸ç®T±ãžè'â¹<[QØ:^•W3VQ{t>ÛyÕopÃcÓ‘Äd8¶aJwNľn:ÑÓ‹/7&&Ýñd9ÛûÞë{ë°N +zÐLi×â÷“°Þ°g +¬Ï0¹ýãåñ è”:*±rµ*CW̆h¸,wGË–®DpOHDEiË´À˜íOAÇ—\#œ×J¤,¢#ât€Q¡¬=ëHhë*M›Ïs¸ÊžA¶éêb>¯i,èÈsÉÅFd½³hŽ»ò úøûñD¯ïà;1sä--Ý󓓹Š4ÅŠÕØ· q™u•£@'ÝphØ`'‚.=¯”Ó8N×a£Îk²†Œ;¤áç€ä\°è1‚ß½-Ðâ½a:bÑŸÜÐ7EÑ|a)×rcpYAs”0àAûǃ\y§-hiÊÚÏ/ä>¥”½$àWe ®°f˜í·WÊ{.PX!ö®sÙ[¦ýù +ÕöÇ>L×7îøõn û ^_eÁ…­ÕykNÊ-Gç1]ƒ.ÊÞ{’ ÞûŒ¢ã®Ýzs 0[¹ÚÃö uÇïµ%Ü«²/¦+z¾õãû¾‘0;~ô º^­àJN!ëÇe}¶Dß®ÿ¥X}ôN„ò‹§Aô–‹³É}Œ¤šQTâCÈuqÜu1·Jt¹u ¦<~¢# Ì<î¤l”¦¿·Œè[ô U•GçªKvNåÖU+7RdµX²íV*;ïy³µW”™[,ˆ2øWл^[`Œ3î;‹jÆqÙWåñGáDS­`»õì,ˆ£håZlã´¸DÐmµ€öªr:Æ«Òj-@UÓl z°àk sû[ÐÅ',¼ŒRc¾îª£rÛÏ ¶{¾Š–gÂò^Sj¤Îl«Útt60¾‚’±‘¦G8Øø¼TéCZÜì–¾éÜþ‡ÅùÁhõÙ  Åíãâ‹Dþôw÷€§j×@ÅÎT×µ¥D‹rÊÎg+q=4!Q®Í7¢Bql…ã_Â^Äyý hÓ«Š»'ƒ¯½@fãá©tÜ&CYXªä=À/QöOTäï™H—e{¦A¬šE$ŽØ|x\C[2.^¸|0þ•Ûî{¨ÛŸú(ËÍ‚øWÎEhÒ! ø `^«ûe¦ö(É{øäÍ& q‰¯·.p •íøzm{ê§,?9tÔáø1ŠÖdCÖè(“‹F ΦS U|‚:E ¹ :ÏÀ;¢z°=k¼á@¸ÙV L·¿\N×^Ç”™ÊTŸÃ9Õ!;vÓáéÔÎ'Ϊ“‘agΤ¨N ¬’îýèFל™Íl¾<‡]ßNl,0çà>[Ða ëzÀGý;`w°Ý/Ý{âãዼ<°]•r8 Öøƒ7§J,4b"tÀ/nÖšJc`¥Àú;aDgéÁ¼S&çä«°UÐå&ì,l¿ºîy)úHAƒíýÆWÞ‰ã`g­*Ò—…¥h[VÎÅjÉÙMÐãV%©¢ó €qB4eCSu9¢i›oH4•7öNæAŸ©¥£€Ã œõö‡ÀX!lãÄR#Â-,Ú59(¥rtp|®0U»'ÿ¡Å­(ß5•ê{é¥>q=*øÆùîÈKÆŒ¯» qš¶Ž.ÑâÞ´áaƒØñÜ‹ï* ÚùXÆu}ãÁbMØYØgÎPVËX`gÉUá„¥üv–¼ÿ7Èáþ–ÈŸ"±Ò;«„°Û&9w°)žèÒöŒýg{°³”mÝùíÏÝÉ8Æs\ÊÆiÊñØÖ<¼F ¬†õÕ£!žVvN€sâ¢rõ¸ˆ¬aÀ—Wµ>pç;_z÷€Ž‚×ÇjÊØp Âofxùî©`cˆbUÿL®þ”ƒ¢ãžèêrÝ/½@ã‘iºû<¢;OÕþÝy«ÓïùÖSuôyXØåsyÊ]ÄlÕþédÝ8Å»&Ð)µ&d]±êè,¦éüBX —F¬Ó­cÇåà×UÝÄÐç°ß +bNÂ+.0•‘š2e8‰õˆ6÷ª5ºÀE"¼àA‡'ë*âð¸I«6ísÅ®ç„U‚¯íì¬ +`gáø.1„² yhƪ2±ßûÄÎbcK ¤8p—#š ×dUø…jqaq: µÌªñØ\ ãµÒ„ðñ°#k"É¥#©èÕÚÀgMo¢{Ýtv!ÑâÎöÓðJ(¼º ¬š±Ê}v|ýÅÅhqoê›ü+å®ûbˆ‘á^“…c¦øb>zH‹›ð‡ZˆÎ,0ŸAçλú =hÖÂ~4Âï[¯7´œAê˜È¥;K$bà™¤NÜw^ø!e\šþ'vÖ`g½Ò?ØYYÃÕÙÛÇ+jÎ8¨ û§*±?#:ü« ô ·+³u,a(fn2Ž¥*¿Á´ôUYØâ~UDñ]sv¼ûÑC¯Ïz}v—5hVÃøfðXM+3Vmì™Ô1à²ížˆäMÝ÷þMwžþCw~Ï3éÕì +ºóê°÷â¥|04•ÙÛÆ)ò{&È£ÒtaMB¾zý0n]µ øxàf‰¨P 1¬!ŽZÑ[¾ööbˆsùÌαàÿ€íG‡¯×•1ÁR©áq¢M8¬k‹G{j‰±2o«µ*µfˆ×s~ãáL÷SwàÁú¢ Ç=À–ιØOŽü=¼ ;KÆ)5äÌ¿±³&ÂøD±HDRì_"5Á?©"2†«¢2õTÑézŠˆuÃøÈŒá`£ÅMøÔ¹õc•ù[­Á~² zàï ï_[®ùœ#0~ˆ>ýºM&·*q¬íÀ eÃIGÅæöŠŠý3³­¤u³óž'ì½µRÐâæRªMüžÀ7ãÚï¹@L +k€Šè<}el®ì!l¬âÞBØ¿¹ÝÖ̺#©°mÂrÂ>“øÈ?ØYÛï¹òÝ÷½a-åvø[ź-¦0žùÌJ3à•; xÉ›ý;;«pˆ¥Æù~p¬6øuJõh>,caoá×¥n6‡×ƒÞú?¾òxeÉöI ¹M˜}k4\X¢ê¸àT¶g†"«ÊtŸ÷LX°Lev¾óä{¿ƒŽ,°cG^}'¬0-_9(6îœ:Ä]OÒV"ð`=îyP<óš2’p‘;Âz¶H¦DÀÄæ°Í`k.΃X’O(( Aþ òI£ŽÒReV˜«‹·M:äå„m +~§l¿¬lÙ¾) a{ + g¥ö~ïÃÕ[¼y`g‰`¯$¤ ì,9Ã!ØYxŒƒ}"ì,üÿðØïªu¦Ê”ÂQA±éÁÑE#€Ñȇ'ê²á :Šxì?Ý…m2_Þ3ˆÀP#kçÀ5k\ÁµÝX|WEZ½¹:¯Ë|çmˆóá>ÄT ÍMø„Û'1ƒ.à[#¡ ÇùÛÆqi¸Àå较ã­WuNÃ8ULžApz½ePÎë7õÚ©zïÈÕ{(»^HhÐNn½ëHØY„ß¾g*Õz‰°³Ø–[N„•Óì,-?˜‹ÊM.o§5hu6õÆÝ„¥~2°³ +‡ØYªdg%üÁÎJÆEkQ,Î-•8n‡˜ØñyÛ¬Aßø“ L•Z†çg½°ÈëqÞÁGáׯ֢èp àRAÌ@¸?ðúÊ£3ɘ8.Ò9Þ5Y‰¯¥".Ï€ðÉ¢× æ·"k«%ÝxiÛÿÆO¾ýéRàRÁQZ°¿œÆÈÕHž·n8¦åï£@RçäÙÃàoD +ÉÔ¡šüú*3XGÿù¼/¬awš +ÇñOv³%WõÅ àU›ÛÏSŽü|äâm6:ÛãZKå¦ÝvÀò%q%öÛ<Ø“ Øæâ\†O¯!Ì?ØoEíxæÂï|îOØY ‘›®'û7vVÚ'vÖ:=5agí›­¨9å L.%“‡hÀ¹o2ëÆ(«÷Ì +*\HøÖ$ÏlCôØ[¯9^öCÀ¥!ZöÀ+ lòú1üú-8öêŸ ~m½¾Œß>èÁ´__A·œ_ x²ûsH.³ÝÚÅÕ}5´äaߣ²üÈ,à’*w>ñ _- J-1eÃbµÕ«3õq¾6ŽÛzcÄ`Îe‡ø’Cì,†°³¬àw¼öSô=„=ÈFb¾!™3L•¦CEÿƒëKÀ |¥ S”Uûí•[¬ˆ/hµá¶ì©¨;í *?4 Ø•ŠÄCØ+sÖMTù6lãñùC|ŽÓ„SÚf ¾C<®ª£sUÎPæn±[¬€×‡Fk 8÷\Ë)G¶ã¡3¬¯‘{îÀ̯Á¶·aŒ2¹ÆŒ0œc ë^]Ðn×wÙÂý r—)¸¦li— “©'c#4åAášà;Iü šþUf~ž, +”†j°aëuUqeFߪ2·Œæ ØdnóÁ™Êî‡DîU¬Ê6ŸK*3_H©´$²P ìùÁ¾b)ðcªœöñÄGb¿F8»°æ‰ó6ØŸë¥Cü’^[fË ÐÖw„œ‹©?18ªŒÆ1„–Ûj ~'¨´•Øeå‘9 +œ«Ö7‡˜ÂU&C*ìC!N­=éì7ˆ<8–û±&ì;0Œ/¨±f0\o`ÔAÂ6Ë7^^±"ÜWv3°³€ëYx|–uã6áö;«hˆÅ7~¹m¹°|YoÅ>_•ÛbMbMl÷Ùñ0Ó|ʯÁí.ëœÈ—tM$¬ù’Þ)Êú“ ¹æó‹ ×î¹$—«sq~ ¿ò>;®cÀ…ï¼ëAw,§·á÷ª>:xvÀùÞ“rÓñÙªŒ­–Ldœ_½o&¬i(÷Þ§!."k=Ïœ©¶K‹ß çX$רtdßz}ßtÙ â$±4Ñêm.$MÖ|”k +Œ€ƒªŒI×W¥n2ã¶ßr êº#!,™õ5æ Ð8 +”à|]ŽÇ6£BÀ0‚ucàÑÀº‰Áç4K_•Ó2Ø]óñyÖÀÜàKvM‚²ÎTØgËÂx…õË„}~Mž!Äa„ƒÇ’¢òÀL¸ŸAïñ#Øð4ïC ¦(=4m¾îk"Š’îIÀüÿÍbl!¸®»XØ<˜Õ¤Î¥öòB ʨ$ TUzÅhÂ`Æ}q(_‹ý6ÎÑ Þ'ˆ‹J:mX|íIn<Ü ÜN±8qÞ‡çñîvVqÇD`q0§¶ž!ŒueÑNÛ¡÷íãä‚À¡®Ü=«9l϶œsÄcl W–Ä,dͪ²o:¼aÕâqÿÄĶw +ÏQ¶ +çò]÷V*öߣéýßøQN°Çî¹++ŽÏ&û&ÓóFòûïËBŽ_[yìdbØ«‘ê]ƒLÏWœ¹À9ƒ-Ræ´[ã¾ÄmÀ×~C÷ØëÆEåW”îŸJræ–sNŠŒ:s™zµ&ƒcj°.è±î‹ÇŒq9­)—áØP†dR5b"3†A| íbš¯,„u œO“Q* ÂòÄÿK±¡ÛøV°‰0‰*OΦ›n.æ0åHÎea-ŠŠÕÖ\OEõ—sت/fÂZ>øh6:GR­ÑŽ2ÜCW”˜Fø(ä^/0©Ú&g Ö¶¡–Œ¯9ë÷¬óÖ0a\”Ÿ¡,Þ38Ôªüí6°ÿ†k87[’yÔ;UUñ…=Œ{Ò×°Þ<®ÂÖñ°vÍw?ðÅö{6—”?‚ÎÔcC“t©µ£a_»÷•Huà±B±ó±˜m\J˜=°†@¸ÓGç²í7—sm7W(7ìžF˜æÀ¼Å1‰Y+L‡ý…`ùÍVÀÀbO- w>s£Z®.„û»p¿™Ô:ÆŸT±oØyˆ¥éÅÆ$NÉn«*j·!÷„°}§[Î-¤OÌëœuÈçeŠ8MàW¦ +ö+Äæ•¶Ã–i„íÆñ#ñxÞ³UûìXŸã¼eÄRÛ'‡2QYÃà¼aï»ë¹70iX·ÞvgÛp~Ìð_ì¦[vûWØë©Ü÷˜ak/8[µÅbVx_bcp_ÂÞKà=Á¾â÷`í +òþök.`Sɽé-È{ÁÇÂû3 :°'ÖÂSįՑIƒ†˜ˆ™Mc€©m‚{cLäjí_Ó*¿ ¸Çœ¶ÙtˆgþålEÅÞé°† +÷ !fT$&öÑ#Á¹©Jû¦)êÏ,‚õE)øü”e‡§séu£aO—£¯HŽ%~°_ÙmcÁO*€eŸmë—|Ýé…À<"ü `m.³y äÙä>rî_`/¯æ =Ä#„[ Ìö’¶8G!|¸w¶œ°xÚo8»^Cò=ÈUñ¸…tdzô¶{KÁæ)*p,\%ðµ›ÙÓ]O]”»ïÉ€÷ê ë+¥Ü„ì=µFØT¾ÏŽ+Åq-ðág°OÀ]\Þ~s1Ýpn>¹§“†}Œ<džøÆ­Vä> ¬GÀÞá¬FË¡¹u<ì# Ú¯’؉/ëL…¥ëÈUkµ —nÄÀ„c3·`?Ó`Áãø“‡ýVå»§( ¬È½²†cóØŽ+¸†óŽpŸž ËÖs«5¨UØ—ï°¡Z¯:Âû“û5Ùx<äµ[ÁãJzlè-û쨎ëNTËåETóE¨Eec³ô€ÉÆ¥ë)6ì˜Bøp°‡¤`÷$~5ö¡qÊô& `*€¥ãQ®r¶¡ûg˜Ä9—!Ü{û¼)Eb†»¶ÌH‘ZiÊvcÕ>ެóᜉäøup€/-ö“¢@… ކÜò]¸î'ÁýVY.>CŒm`Lãk¦(ì{yøø,}%øóú !^ž䃰gKYÒc {7`^ÁyÀýbEZ³9äÎ`¿!Ž$Üôu›LÈž#`Á§m6Ã~ÌŒøyà½b›ÂeÔ›Ó™ð„a¿bN+av+!öÎ-¬Ñ®/7%¬&bƒ¿œG8¯°f‚ãP˜ãÜ–ãCöØ§ØÆÎ°baÏ1E*¾v…xœáüâ"ƒ8ZÀÔŸžý1!Ózz_ß·“ðÄ€ +üaXçuò´2cr¯ÇDÀgSìxutLŽ·a/m)¾nû§‹ŽðÊà>]æ&3È“€]s›\°›Ì$û7í û]› BØ/ó‹ÄøÚ‚½Råµ'~©ò=a‚ã6s·O"ã´|—-½ùäLºòøt6­Þ â9Ò6Ø÷ÒvÓ æalE%ê'\Ú÷õ +ù߈¸¾o¸Þ~tõ¾iLTª.Ô‡@ü‡ûn +pz°˜Næ#°ÊŒÈy“y}lŽðùø||>>ŸÏÇçãóñùø||>>ŸÏÇçãóñùø||>>ŸÏÇçãóñùø||>>ŸÏÇçãóñùø||>>ŸÏÇçãóñÿó1eŠG|¸{HrÈ}Ö{„þŸ…AøiÈÚ䈤ú"üTЗ¤d÷è°äè„ø¤t'òàOù¸Û8ÙØù‡¤G$Í Z4Ýf©‹Ï¼¹Aøø·ÓmfÁßÎ=ßÁfŽ4"$ÖÆnèmðïmÄIÑQÑñøIYXHlħ¿] +ŸFèSäTé¸&­[»J’Œ_ÿéY×üÂÿø¼nCž¶ÁÏÛ,œ>b®Ëý¹6l*|v‰¡¿¾™g3—|°éð“/þn5~.ÕfÞ\›…j®M8~!+¡oï¸pá<ÇÅŽólâÈOóæÎ^´xè ÿÿðÄòÕÿß_ò_žzIü8øfͧ‹îáôé{Ò¾?ºÀn:>9Ök„þ÷ˆ”è°·ÎφÅ£°±'W–4¾ù‡óY¸xö‚¹ŽŽ6*›yøçE󡵫þÙ—Ào?½ìÓ—Å6ø$æ-&—ÎÁ†¼>×)äDaô8Ù8Ì[´h1D>úÞ> òp @> +…kH˜(Mxð¡šb*DC¦ ŽÔðöã‘§»ùú)T¾JC‘« ¥•òÈl]yd–®4‘½À_«3ô‰ ‹RkVDþÊžV¥ ç#×êªã‹TIøÿ¯Ûd2(Lb¶‘cˆÈЕA3­Ö aš rLø(c„Re."Iä¹¥‡¨X-.i³1”ðÐÑëté¨$"[²_\L–”h‚l«L¬!ãC5XˆÁíOÈÐWfU[(Ëû§«òº&@ùs 2Zƒ [§r¤íe»¦¨ ´w~(E…뙴јÈ&å´[+ +wMärZÇ2ëJØäjü|)—^cÆDå TÅkT,—˜kHd:²›-ÉÖs"“SbL® ”+ä5…ò)زO¶Èƒ<þ?tPŒÍk‚$£D¥ ÒÝ ý,ŒÔHC4ü$J2O2(‡àb‰„d€¿BÁ[Ž dU¦ˆÓ’ãöÐaøšâŸA~ÓÃÝAI+HÉ2Ñ%úTt™¾<4MäÂÅ ™*Arõj-ÛôÉ”l³k«ÃÖhùðÈÕKŒ ¤6$]—¯É%o6f㊠ål‚&`!ÕÉZ>øï|Ü@8Xä‘à<@I”¢Í¨µ™È4]åê<U\®¡b]騠œs™5æ°Å]ŽÛ‹ÏAS‘¶ÅL™½ÍJ•ßiò ªÔJ3„$Zéåf0~¸ØT=::UW¹¾u,¾¾V +ÂÈi§l8·DQsÒA•Se Ãá±ÃŧéA‘C)l'¥ùC2­`ÌeÔZª×dP%¥¨Ò6™L‘X[`2LÈZ<é:(Z‹ ‹×!R”1¹úlRŽ!”pª³›ÆAi1Ÿ\h¤ˆÌÖ#²DyVPæ¥L«2ãc³õ™UkuA +Œ”ÿà±OGÅk³kt@fB‘†ÇFJ©1”é«Ê÷ÍTTž­Jm4çãr Ø„l}çP:HP~BJÓëÍIiEl‘!ŒMe^ç"µÕxi1ß2° J'¹œ!y +fM¡¡L…ûRÇ3”ü–tOù‚‹ÏÒ'å-Å&ªüö ܺ²QÜêÔá¤|Jmq¿‘ÀÈX.k»Wh á#4=}±ôDRÏ7Uж”OÔ’ó1¸/“µ)üò«5D<ù±CØu¼‘©‰HÅs>LCB©H¼ÂùD,ž3 J~˜¸RCýƒ÷‘PáL”‘nÆm€2i.¥Î”‹*Г©’´à€”=+bò @Š‚ôÏj(*ç‰K@,±1éë‹ äÊD-™ÛÑ mÅêeږѪ¤ +e\–2&]Ê_ÕUæ\”WdèBi-—µ™”§L”çãþÑ'8ÜD(­ÂL™\nåŽD¾/¥~4駬†1|Õ‰9P^ åßPþªHÇ×d/°í…Ué;ÕæãóU÷LWùˆSUYP†ŸgHl ¶ŸC¥ÂØ&c› å90®H),î+6&c8”ºÃ˜Q¥C¹,)y†r–“ œˆ”Ä®+5&ã ÛeUJ…©2¹ÌX‘”7켑â‚>Ϭ"媤´|ãÎ)ªâ¾)0×”%;&ƒ¬ÖPIa¯-)I+îš Ìmò>ê‚]¶ä”š\C>¯u”·‘ëÒîI +(#„R”œzK~}Íh"9 ’á±9úUCäÛ¬¡<ŽÏ®±P¬+ ó¤dÁ®‚Üœ+­Æ} ãJ„°Í€ñ ’lTœ”׌+_O1òõ—"’³x,zÓ(À_ä<~=¶ItX’Ž\© ö‡HD¥ ƒñ¶Y²Z‹ŽˆÓ†rk?±²ášLÄz]&:W¤tფ=Œ1:8MÊ‹anAY)¥J(Äç\1’…ö%*R*ÿkïÕ²m /Áœ#·˜sÎPÉÐÝ«WèˆbÀ**9É™¦ÉY1ÌP$ç$H2ïà>笿fá>÷¼{ïß¹ß÷àë t³¥×ªYcŽ9«jŒ) qR> ³!:<¤µ÷i¤ø¸‚ŽêvMšZI,½Šr/–ž@X!¶´ ² ¢ÓžAÞ”>æ8 +ŽAŠ/¦,€£Ò€[¬%ŠO4žø¨•Kì,‚#¼Ìa‡‘X²ì|>V(õÎ\Œg£q;Èg ò‚ä¹bŸŒ…ˆÌ#±oÆ"qàí•€MbßkK‹$ç}'ƒüma5 Có¸{ôÌ8+¶˜&:0‰µ ŸÒ#Xú ä :Êà¨Ûb8.)ñ@±Gqá(#š?XnK»¡÷ñ`©2RpM0—à(¬(ðÎJ|Ì7òå8GÖàhð,Ïã’8þm,‡c®´57t+rAqGä }/-9h‰Oö"‰cò8âþ–2Ì%8VÅZyÉz|Ìä~ÏxÇ9ÝV¦ s…:‰îý)ûÑp<c*ÂZŠ Í¬ÐøÁRÄ€uø}Ãx ÿަÃýÉu>-¶ôQ”Ž9I[ÊäìPæ€Ýpr>!ÂER|Tø —)~™[\€æ:R¿V>c±ô€“l:}Þ·& ]F¼8䮿ÛKD>w–b©9ó³Ã„¥ø8*š“&Àë@öâ×&F ŽÌó@z>¤€å NÒ¦ÖÄ’CƒRàèZ /ÃÑq,püæâ.cðÑT|Ý‘J˜F^@¹ÜqBרÙ8žA޽c8ˆ÷¼L ¸Ș`Œ²‹™¢ü ÜÆ˶8!g®„e l¼&ŠÏùOÁ’K(6£pþ=bŽ"ÆÂrŠž}ƒä•íÅÉ”ybd82ŒN¢ù +ó¤-ᨠÌ|a ‰„_à}biÄFq{ø¸¤[,> ±ñÏc±þ7—‚T3È^Ñw–‚7ÈÀÑGø +˜‰qÂñG·´9p´ÙD±r W2/ƒ2jËѽ@ñ5°dgéÓžã° ‡Ï• ûG0[î±VîãàH#ŽÓ(fÏMÆ2ðÜYqä1§‘”9Â>É…cüîhŽ!<ÆÇûA¦ì”ç8Ý"ü£,ÏŒ€{ÀtO'IO¢|ò«¤÷,/Œäþ þ“¡Î9,Yzo%Hqãc²(FŶa+ñã|àdÆ!p +ØhŽ‚Ì +¶¸µìh÷äÙXä´×x|}Ö>p~öº2$m@jŽO“Ö¸Æy$ÏeB#Ïôi4~‡GÂÀû)8 ' G*öÊ^ÀXùLé=øø˜»+ÜÛHepÕ· ïMuÅ; ‹óÃ+!W°hþãøôÉX`L[ á¡\n(F_Q­ß3'x¨þˆ­F° Ã_G_}ï/9`|¤Ö÷öR°J:||ú<âÇøûÐ)ìÅk‹èà‡+@&›vŠVb`}CÛFN¥]gÂCè”<ì—@Jì ø¨ë1‰§­/Ž›žô”pRü¢šLŠðÛÂ~p÷ ›‚ãå +ÈbTo`¼ÙÀ“.cXû©X>"¹Y×ßGíFᜈƗL¬Þòý°Ç+AZâc€Wª +`ðj—n…j‚_kPÞšñ <?X` œœxHƈÑ8€lγ(¿°(¿cÎbÛ¢8E(áã㈷à<„8–ß<ŽêKûј‹ ÜÉü|K¹€<š¿“€Cø˜òÏÿæ Ì)ÀgÖ;u–ÈB¯á÷æsi>X_€”º0øæÈß {óþÌEiÅÎs Ñ}ÐfÌ3,߀þ&X¢šÙä¸"ÔŒ4ÊwB°rãüCãg@-KšXãZ{GóîŸÈÖw2¶F@9–9Šj”“(K4Ù¢| V^ŸÌ™ ‰`W÷ŽË P­"4½$à…ðÞ(¨Û+ð˜Ã¨9¦’z`-„ûÀÏ`œfANF\x”ÈÿÎr˜_›Av–90K¢"ì~H™Y%-¬† +ZÅùàŒÿò¨ípÙéDªË¥m†Bo‚:é9Fhj3ÔêuÑIECê ÔcPOÁ}˜X)‚l$–©Eu:sÔq$Èøa"žqC5®'#ài>9‹À†Lj؉çà˜sèt2¥j'Õ«#ÈùMƒŸÔ¾ ä7±EÄ ]Ô4Á¡ÓCñ°£d¯72ayë›àÉäÁÓà‡R0Xkç±€›¸vŽ€ +ª¥cfƒt¡ô<âVŽcŧ.Œþ)¶÷õ Ø´€¤:Ì)\+ Zq¤á ¡R×’óˆ[‚üm˜HW +–ȼ9 c-ÊY`‹‚¹Ä=ÂìA À¬…LØý5,–öš€å"^n¤/uîgrZ…—[°)–“±ò™üKמñ¶øÞ£Øƒ¸ÞØ ùì0 ¶ Ž£ß¬„¾µïxáû˜‡'°‰˜ –˜8%ÍÁòÖˆã€< Æhø=Ä«ÁNKÀžõž@t s bc,š b¨÷á+Ê ÚšºŒ»ÀÔvÔÏ`e;8Î ë±0 +Œ¥ëhÀma +ô?@fsF„,HG€t…­\ Í¥ HqI¢ºÚÕ4F|˜5‚¥,Ñó€}ô»‡†ƒ\%Ôë /OŠN+‚ È +-ì†Ã<˜žŠçÂXè[v¢zo(Î8Ï{›>èG†ºåê_€£a¬ù‹¨—›°´ÈŠ@͈j\} ®¶êÓ·úøä_õ„‘eÁÊæ1Ôq†|)¶N š£B®¤Ï^œ¹HxýmeÞ +ñè–ªvWb”o¡÷$uM˜ \ðä‰Q½>BløH¼ïYk„‡Ë1†‚œ ÈîâzÝg2Èãbûÿ«Kqýë’0Gì‘8x,ô Åö!J»ˆA)G§ð˜/û¦/&—ïÂvKç&A?KNøÄÍùg.¡do7 3Z÷ +/½ßƒ-%ãÞmeÂ^®EÖÒg,äZ°Õ!:Ž+$à«TÌ»-LxþFÆ1v:ðCê¨ÃH:§bK¶ SwcW°õrNžE;% r¿Ëiyé6&±NM®ÙË&–«ƒDÊ L"Ê+nñ³¡.ÅrA “ y lW<3T0?FQ@î +&äÉj:ºp³Ž€€^Ä…¾®`°^Gqs +[ ºËÖ;?ø†jNT?Üž›(î¡ÏýÆÊw<‹êB‡¾ð^òÂOsûáPÓŒÈ16‘˜[³VA—ï@O¤â!&A:žµžvë|Ú\9ê<Š=í7QtÐy$Ä&HJ•œñƽ:‡†Þ.îw:FLûß”:ðâpç<'×Ãr)g=&`é`¯¤_È„Â-äµ:›‚Ì^5Ê1|ÄŸ‘ØRú² <î–‡yŽpós¦r“ÍÆ=}è!ù]]†ûI¸ÿ=dH¡/òÎ,ôúl —‚øª×Aúzã”S?Ú˧J!þŠp×P¾ 5xc XüßDzzP¯Ÿr#YIÏË °$–AJ›‘ ٲɴ}ØTÆÕ/çý&A•>ï=¤Ç±¥NÀe`¡Œë'¸}°lþXûÔ™Àa¼ O0÷WP)ïÕèèÊ­´Ç¥_ /² 3訇kÉÔzU° c|2æÑçB& ¡œgƒxŽwº +ÌQ|…:•X³S˜\³‹‘lÁ/'!>¼Ç‰\¦³á·VƒÅHaÉ6‹é~¨ +endstream endobj 293 0 obj <>stream +႟®†û-—l¤6íÀ2f–Σ©§†A½NC½yñ&èáÿ%©¹”mÄ4<ÐØ×  \˜¶˜ ²¬×ÏùOÄ=F„¹/@¾š½xk öt5럻œ=/W¢-.Œ€×±•zoRû¸AÙ^toÄçb”@>WplqN*‚$‹ðzdTÃÃ|¶kBߌŸõºãè×à^!Â2Æ'kîBívØfÈCl²ÐÇûiC!”=YK]k×Ýk +³>hÌî_6Œ…ËHÊ qó3C¡¦cÏ„N†¼%qŒ)e¨ÏamJŒâËf”3à§Gê<}ÅòŸÐ+€û垈%=ÊýÙ¡ºñÀ[,5X¯ƒ Þ–t‹ŸÃúf/Bµó2\7;£ñ”½š‚{ PóÖ^_5=”»0QW¸…{µ†î1í9QˆêúˆÝ,é•>ø søÜäù˜7›Áʆö¿³„² +9 z×¢“¨övϙǺæ¨@žÆµ$Êé kT(ª+Qι6ØZl©ÀºJ_¹G”T·ìI€cŽ€EÈ©ãyò‰rWìëÍtt–ÄüÖ>NÆ ¬GÀþRpùãÞ¥öÕëÀy¤èžB½Ží,,Ñœ?a?Kw"¼eìy&«ˆÝSæ¢:xÈ9 xܯ+¤¨—èàG+ÁЬ¤q݆j%Gû!*©n7ª×71§B'àþ¾èÔ?ëu&ìîj°U‚þðt˜«Àëu˜/.c@¯¯¡q„81q˘/v™ëu3T¯ƒ[ÜwöÉZˆëexî¬Óx6àÊR,©}&lC‘½ˆM­Ðe×±7›H:³S[ôv¶¡8ŠîùAÄÅ-ÏY) +ŧåVQí0 æ&¼°€z8Ô°,HdA?úI(Øà‡«D×–‰Ýå³E¸^Áõ:ÈÌÂ{Äõ:ô¡ž€:0á0X/Rò—Á2 zëЧĵ⥸V?è5¸ÇϦÁf a¡0©|;ØÙ SšU'´¡@œ æ)îÙwCJa +Ñ¿ØP€ ;ãzùcÕʆ$A™Yÿ´¡ð'²A8ì¦ 6"+û10w°Å‰kú/À‰…¦€kƒ6¢„u6¹i/\È’C¥-Ðß· œ Rg »¸ +–&ÂxTcßÃ=W,[ç—³˜LªÚIfõîk`°¢'‚{æum±Ô#IEbå9b¸ –E”¿ÝB'—«Òñïv`éK¸NÎŒz¸Á”É*X>4¥vŸ8«Þî %µǧÿõ%°FÃøÝ\‚åÝ‚Ÿ¯bܲU„§¼ÇÃú(yTðUìž®ã9 úÔ1Ç‘ cKšÙ ƒµ…Akp%¼Þüp~oÐ8‹x8Â.1ÂvÀE,÷†âÛ,Bß$öPLuÈßb +ßd•ÚP€ Eð %äÀ‡\ÿ ƒjQàæÆRÌ ÏÀ|„Ü@£Ú$Y!Ö0Nž ž‚×é ¶?fçî¡»ÆÍf|®-dï-Ä/ô÷A¾8£C°È©Áú®¡QmœÅ’‡·WÀœÅX +Ø ù8ªË¥ˆÛ`;ôÔçø÷ñZbÂieBž¯Áýˆ.c€Ïc+k߉Òãh99 ×m؆"j]¯‡óǰ¡FFbǬçX‚ܸÃ(à)`ñôÓ†bØPÀµIÿ²¡°p9(¥ùl£ÄëÚâ.ŒôHQM=OϬùØ&(g9ØŸQ‰%;èˆûkÀ&~$—™€ËÉØª-`U5(±<úUxx7âë°f%ñFóa&ôf±üX/›Ùâ57°a/5h ÓÞ«Ó¨¶Å’µˆT(` +ØpÀ^ èAÍOŸò‡ûð=ª‡‡. 3ä[ ÑÑ  ç©6Ü£#ÀŠöðÑܥМ»Hè'ÁžàQ` –PA=?ä„¡ÂkпDœŠŽ¯Ø) +|¼[ {F%”ì /5«“ eÛøéM»€§AïÒñm-mlC!@µ:_øO +ÀX»20”Æz"Ÿð·°ô%-ÎáÞ ¬Clâº$8œ=,Ô÷o ò|P‡€ä­Ä/{ Hµâµòƒ½.ÉÅK‹±Dö…°iƒÒÆçFb>€æØAÿSt +Å/ŠKÉ)Ÿñ¸¹5ä.¶_Á}ûÓƒ{+À)°PA¹úÎØjýBÐdò ÕPØ‚m*Îxü‡ EjÕ^Qzµ6å«ü— …@zVÇ ô!‚§¿ +±ë¿ÚPxÚP ‡m$PÜHmQ tØ~$}èôpÜ_pK™ µ#¶:@óúï˜ÿz]_ˆãî”ÿxÀ°g%S»Ô¨Ôu*âÕ:Üï·ñ™ ¼Ü¹æ)cã6ÖŸ`þŠ1E*cK”[iËs#aÔÔ`ÿöZ I.L¯VÃ²ë £ +µðˆ‚¡‘!a gD ºÔ9°>õ0Ô~BëÀñ€‹`Yº_‹"öm×%öìÚO€m+ôZùGÁ>,V ¬‚¡okXðïÆr¶P¿¢œ ýB°ÊöÐ „º¬BÁåLàä7 æ‰L¸/XJôRË^Á^m4§6 7ØPjƒ¹Éxð)†ÛG¨ÿAöÛPèP„ž®`Ž8Ž”‚ÝÂkÜŸhC!þW +«¿l(l†S¦G…¢c +˜ïš0ÊóT\é&¦pƒx'î\[ +8‚kNûhe±÷Í%tjû>ær·Ž0­_úÒ"« X§ÄYTV‡&X¼ášä¶¡^‚ýaèí9O{MÄû"ì"¦A]ý#¨Õ¡þÛPàÐC[\)9å;l²`í$m©¨âMŒóåÙä Ÿ1 /<6â“'>ª ¥aH¨ïÕ"´µŒ Cæ^ÞI¥T«‚Ä-H¦C‹/Ë#ëḞy°ö|AŒRGl†3¨–†k§–jÑ‘ù›Ä(·áÞ»]ðT¼þ{9\A*6]…L©ÚÅd´kcаܕ3ä?m(lÚPœ)Á67VƒŒ¿ø¬ï$è­ñÑ|ÂÞÄ5%N±³$° +xãá # ×Æ#%}àøPñù°iXþö\x]ZXñŠq$Wc^lc#ó¶HÝRU`<¡ÿv€)bŸäù £,ˆ}¼–¾ÖlÈ^nÒ…ñ;+Œµñ¥ª’ìr›R±‘¿Ø Ø@g×é€ì3ô.ñ~P ÈYuÔß°f÷— m(jw³—ºtDY­†Âì>-òr£s1k!¬ñ8±Nóõ— •иSŒê2À) XF„ÜX-ñŸó;ÊelØõ•lÄÓ‛+0>€rÞÛƒðÆŠJ,ÜÉ&UìeRK÷R©ej0¾Ð{¦"ó×ÃÚ,µ½o,&ëw# +ÖÒsS!OWbŒ +¼» l.逫‹ÓanëÀ÷Á¢Á3s![º“I¬Tƒš‡²—+AÝëõP÷àù\öí¡˜`åÏ·ŠRjöÓÙmº’;Õf’ëÍ,üde—¨LÙ„O&Oއ5¾¹ÕPcÚtˆ1ŠS¨AhÄÐ|™¸Æ¢ù ½(X/2Ôð{ØÊñB‰ÿ½ÕRïË‹0Ÿ90 ök€u…(©l/–·ïg€5;°6ý¹Ö vž`Ñ +ãCÆæo¢£­ +±] îA@öI½bçI.¦/’å®=ƒœ&eî½Cèœï$Ücw’Ï„z÷0@–÷¬÷¼Æcë;úàÐ[‘ÄWiˆb‹v Öì(ÛÃþŽ[Ë%>‹ g--ñ:tàdè€m$’³Œ¾Z£Ï>¯:(}\j ¶‘ºZzØã½li%û$—j ØËÕ:drÞVl 6ݲÂÍ ÇòØx=,­G€þÿ uªÙìÕ`]”ŒEµ)âáâk Bòr›:ØP€õ9í•>wp}"cŽðLèD°g§ýŸ-Ç6vÁSp”¹z^bÏ„¹Ø†ÂkІB$¸¬&°L?âþT¸§ª`Ë7T§bcô:“R©Î¤Õhàú$µIÖLÀ*¬ô„‘ÿ‡•ÞìZé¥wjÀ¾5(WŽ÷$ÍÁ¾øû ÇW®&JkԢ ÖÁ}€ØÁkB`çk©P£C/ ò!ª‘D7j„f_’<¬:ÈËù s +}±š¶MV¹}¨5¡^ÂëÀg‚'b,vMšòíTZË^ˆwÄuöéaKSžåw”çÅ'ÆH!€m©¥ÍÀwÉé ¼¯Xä9K0ÃÚì-ƒ=?(/² ßp…ÄíÒ郒C¦ùoìè;-X§Ò×›p½½° ¾»¬p©ô6 °ö¤RT™¨üÍ"¿ÛËDÞY °/¬ùÛG*CŽ>å5¯Áþ‹ …Õ¯x]È+i.X¦C=!ˆ/ÙVvž£ÉãÇ ™M{ßZÔØÎÞ3Õ*1¿°ÙP@ž€ýxa7WQ1Ï7AΖxg/î÷W×´þ™‹éÄbUqR¥¦(¹r•QûO+=ê/+½œ&ãÿj¥W§Vz°Ï1è¡XÄ’ôÁW—a»)”ÿaß!Øak&ïk `X2Ž2eÿÁOW³N)³ . 6£/5k1W—`ÛH¯kóÁ¢Zh=Uè9 z-°†²žÆ?d3 ÖÌX”ËG‰2uYÄ¡÷D²‡`?,ð>l‰òX¨2ô3KÄ= 1i3¸W ÷ÀÁn4ôÁ*ܧ@x6¬¬säàž¨S€³£:ïÑ…½ŒA¹«Àæï‚õXG9p~¬SÁú¬ Aö*ˆ=STð¾r°Œ€58°'óG<êBÈêÄÙx ʇP×`itÀ¨áá? ìæ W+q—Í\]û{i°Î ±šQ¥–«‚KíªxÂIϱ°Çö¨à¾cBÅv虀ì=Æv¨‰a~]¼¶ïù܇z6ì2Pí{W\cgã¹ +V–á÷Wƒ5³È#mðšÜ3æÑwV“éU»É„’-”ßõE”]ô4Ø1h„~ÆQ/6b»"§peëÇÿ6Xø@&àö2aìËM¤üÅ:Ü7ÛªS~㡌­-ï­ r‰ÿµåxO쇽‹0w|o.ftïc3{õYï{Kðþ°ì^曽Õ ëÀ:Kô£ºÍÅMÀ_ðÜ€uT¨)¡îvˆQ†ÞÓø p]°ÝqIœëž°æG¶ÇyƘ:~a$ÞÛêœ2Öh¡öž»e¹e}qØ…C¶¦ä1ĥݲTØÐ¢À;X§ôÙ87Ÿò‡×ã%Ç1;é0FŒò!– Çû%߈­·Cî­DÏ-ƒš ö‡%u©e™Õ²z¡´×幌g† +쳂^™X¶ ~¹÷¥ÑÜ€ýzPocžt})¬cKøÄwÛ ¶á¼ìAÿÆJÖ÷:Þ/ ë °Î = ØCEl¤²»µI5ÛØ³Á“„æGñ^Iè)ÂÚ5ÌwÖ÷ÖR‘cÒ,lc5zEh,Âë@NøÜ^û¿1ÛG#|û_Y†s?®?fã×-=Ç0ǼñïQ?ê6ö¢@M`rlpO½ù©¡Ð[⛜R„ž1yÒy4yØn8X—ƒ5 +ã–:‡Ï[OÅ”m¹–g¨®Wà#Œ^ {s±í¬—9†*ìKaÂ^¬¼Ñ3 §â÷ {‚ž¬¦då[À®×ó[!®aŸ¨‰gÊ\—ÿ«T‹ü5ÅÁ~Àå…`Ã%¸¿Š‰*ØŒ9+ð0»HeüÀûäî­À<úÂ(_b\pKþâ… ±ì¿pÿÅ=º¯KÁ’¬|Àlͨ¨Çëñ +Üï ŒE¸'kB°î=cïÔ¹˜?¡|&L-ÛMÅ>߄׭NùŒ{5Xç…ÞYý4:âŰq…Ü/Œ+ØŒ-£r×. ãNã\‡r _ÊÙ×–aN Ö`QpkÎý™û—Ué‹™óàw¡(HnÞ kRTXÁ:¨_È„ªmlf‹•Ù½_˜Ô°Ç}è°™Û,L*ßrÖfÀaXGEõñFèy‹¼¯,üœ#ö¿»‚‰x°÷@ÁÚújƒ‘0±|;å—9ÛK@¯êØÉa8ßmLzçaZ·Q² î#à#ìa¥#Þn .DO¥’¦3>WPim{D—šôÁ’÷á\Ô °æ |ú—U`>â9ŸUq»6_ì’1öa»!°=É€Á!¹ˆG<]‹9‡Ç5Æóú|:(w)G8«]œi1Iè”é’YŸö 3û5˜›]|ñ“¦Ã’WuÖâ×'é‡búR·ûn‡ÉÅäEÒc /÷®¢{6“hž.aCž®eR÷J¯Ô ͲËEÒËI³´Rž(®P["Û„N•:'â{ u¥0©z'ôgD¡Ï7À¾ arõN°Â5'âöLÖ{=:ûƒ.Þ«A§´íux€EƹôfU +lHÓšv“±¥¸/Í„>Zø)Ìl×l¡“›ÕÀZ¬y ÎÄþ7–ã^*Þ/z{à|e|®-¢"ž¬¡äÅ›ÉKï÷Ó›öP™MûEÙM†lfƒXK’)õ»à=BÿÞ;™X¹ââZ˜Ö®{G¨+tèÍ<°§¦ï¼'ùé=» ­ÛÉìïšôÓnQáû3Ì›Žâ§Í‡é{­4{=ÐïJnט0·š¢[Mèÿk%E¹¦Ì½NZ^²Nþn-Û°•—ýY•ºßÉHžÖXJîW›—‘äÔTæmAV«:ÔJ`¿{ hyá6qbÅ>ö^+ËÜêÐq•Û­M³Ó)-{²·k…Ö~ã î¦RšUMîV4¹]}ˆºôU“ +{³¬wEÏVcÛ·Ä:U¼¦å÷h%äcÜïc&·ar[XæiûÑ“ºÃì‹6 ÑÕv¡0«_S˜T¿Cp©S¹ÖÎcî´Ñ4CòN¿!yû«}ý£±ðv¿1s»¢îtñ™‡-"ÑÝf±ä~ÍAÓEgD*MéŒvMAjíN2£K=Ô æè°×k!.!ƨ˚ì¥VX¯e³Û!6 ¤Wj„Òë,}©FS˜Ö¤ØÇ¤#üKnR…5 2ý½*™ùa?g`u¥W›ºÞ¥OÞê×Þø¨/¼õÑ~Ô'ežö èf„Ï?J˜WŽˆîwÝD×x»MÈÞ¯—Š4`´ˆ©;<è1óï}Õä~5 ¦˜¼‡oþnJ>ÿʲ¥­6âÒJGÓWïΙ>ywRr»RJ_iÖ§³>hÃ{c"ó6B.Àyñ#á‹6·[¤õi2 \-2e’ÛöòœP46· +¶—°j’ÿÆVú¬ÜJt§Û„Í푊o´‹$Ù­BÉ•zŠMoÖeu0™Ý:LÀ£`£ÅøÝYBÉŠ6cëÒȼMÀ_D¾hž‡me´ëˆÒßkSiÝ{ùÙ_Ô }Ûxßvñ²¨½áH^g)øðçq_m0Û×éGÖ|9%lþbK÷~ô¤z¿¹KŠB~¸+;Öv=VÜ_"ê~(í¨5í,“i{‘(©«ôF÷QL½þz€Íë>&.ª·—¾l8-ºÝ"‘Þª15»_vâÀË<[³‡EÖâ»ÕR2닆 ©u;{µ“/½_s„¹ÑC +㪷AÿzÆlV‹Â!#éåjÙÍÊC&׫¥PoRéí ÄÂ¥-êV OœÛd*zQ{Lò¢á„àözäÃ/êIŸ”}ÓfÍæu£ŸöH©‡½ û¬ÝœÉo;Fç}:D½é;L—t[ÓÅ=VôÛÏG…¾þf"xù…|2£Ëº¬$m¥~’öbQe™#ýì½uûƒ€ÊÐ&SÚv‘—>íƒù@ßí ˜íbñý&3ænCg·ê’™{Ù¬VCéÊÃßÒ'e–ì­šºÙeL]íÐgoµQâ{fìÓ63áõ¯:äíúÌ6R˜ÛÎ'v …/z¥TÞ×CÌ»n+¦¬ã ]ÜuŠ®x–®ì8-|Þ/¦ïwÑ›„Ï{D»ïäÃ^{·™¥ò›Òõ-6lg“I_q¤x !DÐÌYñj8 aÃçst}‡=ýºç0ç“6r¨CÌt¨Ë`Mc9⥠_Å‹¨^Å»ú÷½ln‡Dò¦ü¼Å£ç% µštèÕüߵțßt/?Óäã~ŠŸý›º ¶g3?éÛvQÊ€¶4«…4»SuLú¦ÐΤ´Ðý@ñOÓ¼ñóšã’›M"Qv»1æ*—{´ N£Pžc2ú´'Ü,v¼¦î é']bqq£­iKQˆ¸´Ù‘}Ý|BTÔzFRXi')©r6­Ê¿(*n¶‘¼¬µ½­µç5žf^vXP¯;ˆ_Ô£x¬8!É/±TZ#Ì31¾Ôµxo/®f=ïÖ?4xO8caaïaQ[½´«,LÚ[&êjôc{›ýÄÝATë{~ÉßÌø%š’%¿Z*¾¥Þtdü%ŸªÂ-ºÄŠ?5…PïOS/»¥ôµC2âíZ*ìÕatífáÕºðœèYƒ…ÉËòsÒeVÒÜŠC’Û &Ò{Uæ&·«Ìè‡mbæñ{)ù´‹a^¶XˆòN‰_Ô?n=*zÔnNÞþ®O>èçÑ(ÿ2/[-ÄŽ¢Új7iS¥ŸYWaÔ±÷·“N´^M:Òy/þPïËXQµ¿¸¥ÂGTZcK½ê5eŠ[­™æj7Óî·Q{^ÄX¶ÝH´jN·©OŠ?W/?ݘgÙš-7éÏ £>x j~=Î{ð‡>ôÄg§ˆ\3ç +Sß«RWúu˜Ë}:€m»nÏæ¥~ÜL 1mfÞ–'3«-<Ôñ4æ`Ç«¶ªÉAPøÝÌà§Î÷~6ŸwÐa¸¾Ž AQ +"—ëóĹuææ¯ä'Ún&Û4fdmydR_äy¹Ù,]i4å¢ûôºøœi]^€ôUÅæj“‘äf‹p†ioô8Þ–‹b.6±Ø[P1x¨ûN´É@~„äÓ›0ódŽu2“Ù%nÑwJ\£3Š=åVÍ©1·‡ºr£¶Ýˆ•ôU†Šûšƒv¾”Ó ýv¼ûœž0û»– ©kíõx1uùË~Ó'5g%;Ž’™î#C‹Wó¢ªV ž}£¥­UÏâ´?N0驊d[<Äõ~ºßEK:«‚袎‚‚O&üG žv éw­ÇéŠVAÍ·#tWŒÉÁÎÇrQu©£qîoZ†—ª7eõo3¸ûCÕ Óå5ýqìDKf\Z¹Glb…g|P_¢gMhÒÙæÔ$‹®{±’/âÏ­!ì§¶ Ñ·Ö ƒÝ¢Ï4¦&kÍ‘›õ>ŠäWÿ8btë½ôµ/†âÜV”çûµXÿ+˜°Â À]éìn]œsï¶HØkˆÿ]m!M2ë’”6&±b·0æÝfá•Zâ—­'L*J=$¥.ìãf‚¬ßö¢ŠÖ¡oVñdÅkÈ'¤¤¶ÔóÈû§‰‡»ž%H;JƒEïk|LJ£Î5&%y×'{Õ'¥T¹ÇùÔ§IZŠ|©º¶³f}ïdî ᩾õ~1‘ 1™U®²ìçÈë.Qèz£}ËäAÅÑA~ò õ±1><ˆb>|ð¢JúNÑÏúÍ$OŽK^6XIÞTŸ?m8ÊÜi¦˜kÍÆ¢üÎŽùÚé{¢9'átó嫿+É'šo¤H:ª¨¢Ï–¼’¿I5?Ž’•?fø–3ÒÁi¦wm2ºüq»è]빊ä»_Èé–ŽtQçIº¤Ýñç£âKMFtÎ{=ѽ)û®ü´iÃ뀣m·â¶?Ž>Öv/ɦ)=áQçSíTRé•Yî&»Uë•Wk^Úx>´°Ê>¢ Â!¢¤Æ6¬²Ú6¬ý\^iQRây¿Ô9*³Ô=:¤Ô?Ϊ!=Ö¤ïU˜¨¿&м뱌¬ûÓšÿ˜ã ïýƒOßúƧôˆD;°W>Ñ©_5ÄW:)úî7Š-í8'éi +a;[|˜Î÷^’¾Úpñ§òpªÿƒû¹=@ÚWaÚS)£[:øÏ~ç“Oß“¢üšãÒ¦b_I_U˜iß[™GMhJP½_ÚÙæ¬Ë;ŸÉ%=…þ‡ºŸÅ麸ëFŒ]KTlXµ—üN•“¬°Ö.¢ Á6üU£møô5¯Î.<¯Ö.üi•cT.šwi•îòŒ2wyJ¹‡Ü§2(Vú)?Ô°”c"J–ñ¯pêìÝ~‘ø~ßÉÝ.sñ›æÓ¦%Ež¦ …ÁfíEQ¢·Ö‚ìþ½ä¥Þ½âì&øaÛ!É›Æs┓_~1—ÔÔzU¦¹VËÒÌZ el^«%yíw~RýÁ•/šôãÛÔèaÓ˜’z¼õF²iO!¼ÓÞ¢(ñ×ú°ƒÝ¹rû&yRb­[\l­g’UKVФ¯8Œé¨s?Úq;Á³)8Ñ«>0.¾ÖMv½Ê)·+¢¡qzYæ({Qä÷´ÈE~»ÄEWê}¬='Zô±%ˆmoò‘VW]dóÛNˆKjmEÅ ¶âòjG˜²¢‹(®åå1žåáqnUáqÉE^±AåITç7ãן×È;‚ð)¤Ì?!®Ð'&£ÐKîTâ+99¼Â/ùzoÂþWý·œ¾ákN_ÐüÝþí·Òª‚s‚«Cr¬Zo\²èÌaÊíÙò²³žµá™0NðxYéu½Ú9*£Ü-êNcTaƒmDZƒsÌáîÛ±Â_»Ý>pG{ÿq‚÷;O~ÿäjÚ÷8Ô¹**.¨Ò/6¡Ä3:³Ð+Ú±2:ƺ>%út}j̱æl™ôÛPóî§2ɇÆ0ÉûÆ`Iskûð׃Âë×eŸýzȼ©4útSVÚ©æìÄÃïoÇèy}ðÃÓöc»ùá7;º§ÛCô­*äpÇM¹yïC™q;giÜByü0ÓØár´ýv‚WuHÒ7n²—ÅNQ¹oÜå·Þº£ÿ×]öä­«,ãWÌ¡N”c{ #!¿TÆ=yç"Ë/rŠÈF˜URi6Ðt>ä#z"¬óª ŒüñÑU»…ãçlwÞ_np‰-lºþ¸ÁA–ÛàÚä“"ú^,ú^ùÐlàŒß÷Û9ÝgœšSè­#VŠûLÏ*ì⋉­{tˆÛw›·í!ÖoV'ÖnÜE¬Ú¬F¬ÝlH¨’ÎC4OÒÈúÛ2Í:NSø¥ÝÕ¥4"*㥯üúk¯èÈ‚y\ž¿<½ÀKžsq‡SYqlÏ“®ŠÈ#m·ã/J/õOL{ë—Qì!ÏA¼!¦Ü;x¿ñï–&ó"2*Üä/¾=m´¸Õj~«Ý6’ùÑà§Ÿói“¡­lâ^]±b¶ +1¨1—P"fSˆ™è¡‚¾_>r&±fæ"bÏ¡-vTÐ’z(nßI‹'Í&f3ÐoÍ Æ)*fÓ‡ª³G.&T¦¬&æÏÞH,[¦Jl2²"öøULÛÿœÛ¡_ű‚Î?m„o¹ƒìÛÏV¦ïdÙo½b Þ:G¾-rŽÌ/uˆxòÎ9*¹Ü#&¦Ô'η2(É£2,1ù­OìM<¦²øwc#‹}cô<‘‘¿^ z{Ü#bkš.„Õ·œEs(üÑë¡ÓÀîÏùuõ~çk“uì.MÔw¹£¤üNE'çËZíÜ¿oÒyÀm׉­[¬Æ;J,TYCÌŸ¾€PQZˆ®a1ŽCŒ%F£ÑcúI™˜J¨(N#NQ!Öl1&v›F(ª]x6V=a`Žf§eô…;Éû•³3é{&êé +dâîö £ïoÄ^¬ +ŽOxëžï%»úÆS†p1:³À[þ¨ÈEöºØ)òr‘G4ÂcÙ³7®²×®‘ÅΑieòè +ŸøææsÁ\—Uø—6»ä_{ÏïH4ø³Ü÷†Û´×ëõ”]b»!ë¶ï%–,V!V®ZJh˜Y+h{_QÒñÌœªqÔ^qÑ\b"1žIŒ †Cñç0t]Šès¡ðóç¡è™±èªG£ßŽ~RÄÏEŸ¿Œ[F¬]/"vöÝâV°½…ž²A²¸gѲ|YL¾tÌ»‹Ñq¾òŒïèËù^Ñwò<¢Ÿç»Éîç»E=zåuÍÍ[En²{…®ÑoK#ý*ƒ˜¯þìçzò×Oîç[bb_5£Üz><¦É5fg°Ëä±tÆR‡“Ñû‡÷6½+|06cÐÞéâ?>àõÿü¡€¯~îÀ8bÄIèëxb¸ÂxôÓ4bú¤•ÄêM‰}>UJ¼~”78„Q‡Ä½ÍA–-Wã²ó¼¢ ò]#3ßzFg¿óˆFù¢Ð9«"$ÎìÃãpï²ÐxˆÍ‡o\¢n¿s•ÅyG[¶eE³¿¶1¿7¸4†ÆW½· lv2ü;±Oþzö†]z„ÊØièFâ÷?½Cø~º¦©(â&£ïàû!ÿåjþóÇ|uÿzÝCÐ'ŒÝhôïMCsqÅîã„Z@ë4ëÜrƒ~îÓñÁGÚ^bÞò,êhKŽüBM\œm­<öÕ+ÄeQLÂƽñ•Ã8æ¾ò’¿,pÅãXú(ß-º¡È%¦£Ì)Jü±(ý{zcÔËççì´‹9ÍíÄ$4Bÿ¯?à~Þøï°Ÿ÷LiÄ"bþ|bµæb·{Õ.n¿ðS™ƒMIrhâËù­×^1OòÝäó§Ø-ªqöúÛˆA®kžTëgÞ›+CüB¬~!|ÄœÓÿïýPôø×kýë9¸^ÅŸ¯ ^÷p|gF£;4}NÀ³wQ1Hñ絎ÂóOiâzbù6Kbû±›Ã4¯s«Ýœí¡–»á§+3bdoýpžjH‹®ÉóH,.p‹©CcX_è–ØôÆ#¥©Ø5±¦Ì9æÕ[·ŸòÇîòÄB¹î'Y§*!¦›‚çÖ‡ ÿÛ¿®ó¿û€kõsL‡£Ï‘øú' O”'o$æ-ËÔÎÄICversô?s‡nø&?÷—ß|áóâµGÜÛ|÷IJ|ÔÒ"×ägîq÷ Ü¢S ¼eÎåQÑðð¨‰Fù]Sé);Øu3L§”Ó]±dýÿú:ÑP¿gÅÓ!?_^ƒ>' ™NLSœCL¢„Æi +¤Y(ÇÏ%¦ [DLº¯¸€˜4j%1]i?±\ÕØ~äõ0õ|n Ó“ï‚x‹ åÈ Ñnåá1â¥A&ý/BŽ7]’!Œ‰~‚°2¥Ààä—¶9Éš›.D]G5§ms”\ÿ;wH3ýýâ:bºâøÿËØÿ+áç¿òÌÓq•àš”G."¦ß@Ìœº˜1e+¡¤èãË‹j·¸E3f¬ù·sùP̵€#¢ì5å²1*ûÊCç#œŸ‹"rŽÍ)èsª‚º¾yÄô1 ˆ)cæ!lD‰Ë ¥©ÿè*«Ì•Õļulj…»\‰…QÄ< b•ÅM…->µcvßäæïmàÔ>!iî}ª:=4üUpôÍç^²ŠWîòztm%y®‘OJœ¢ÞWÙ…ªuHèkvH)«vJJ.ñŒ2þÑ}n•Èöÿ:fƒø?~þ K¹ð(4ZcÐ\›ŠÆp~LUü…Pž°•òœ½(u‰™(Y/!~YK#L1 f-Ô!”gªÊó4 嵦ÄÜíhÎë-o+n +k·ý +7Cµ‚[¯^Ám1úúçq‹Æ+~þ…‘ ùå;c_!.b4¦¹Ê9±³Æ)¹§Î)åscrw¥kjG…3ô’dÚ-œá•­ÿÖ¸)þ >âÇxt-ˆ}Œ]F¨ü¢NÌSÑFסF̘»a…*¡4áÇô-3Ñôzn¾q¢.+æ`罨Ùqi¯|ã’_ûÅlº’hö¡(Ú­6*­¬Ì>¬·Â.<¡È+z/'\§gý?^Ûp|=ãpnžH(cüƒ9ÿü8àåÔas™æ£21ytWxï´]W¹¹ªO¹¥À'UqKv¦ümÆvYÏ”­a]“¶¹•ÝváÑÈ]å“ÔïsËöÕrêÆŸ¸ÓFŸ¸Sì—B³Þ‡¡§dPÏAM\óÔ®nògJK#›Š¢û+\“kŠ]âÉ/MN{]‹§F¾ÿ;±9êg.‡øf¬+zöíˆð柂Œ¿©39ÿ0=ønÆ<ùlÆæöH¤ªŠó[NÃ~'ƒBÎXM¤8UñÎ{Й6yä<Äõ׿¨ðˆy+L‰[Ž‹5íˆU¿»ÈÿöÍVðù‡ƒn ÇìÏúm¥NJ×JÝkÜFýRÎȰ„£xœ™ ¡ÿÓXëļ¯v?Øó4Ƽë¥\ô±=ˆªí·åsAåcLg«—gUXRE©}˜WEHÌÞäyóU6ÿq©Uâhž¡ëœ2f!1kÖfbÑcb½Ö b éEl:;Ž' Ýùn’ên¹æŽgÄ œ}zâFþVá`ü¯gTÛñþl²5øƒ;¦ù3ÔúÌñt¿s½¯ÜAúS——~gº?8¶î‰¨QZ!Ãõ +8~wÐ çÏ­F®W§ópÆTGŸ›eÛµøÃ·âÎ6¦§X¶ßJ20Ò'胖ÃèˆçëÄ9õBúIØ(ýÓ&M›¤1 —íÀuÚ÷1Û/Ê[ˆÅ«øˆçú[N¼¶5 }üöTNÅÞÖýŸ9¡ÞoÜA½Ü!ïœxO·]½ŒÛ ÑÍièÿÁ±«’唹FÅUxÈܪC¢D/= ‡¢ƒbOó%·Eë·q§iØÄ™ñº8kAÿŸŽâoÕ!Ì—÷¾ú85Kõ [ M ÎQÂ>F2½QŠ|µNäpi¶ødÄ$Öõþ*û]ö~¿‰0ë³åycß!KY×"xÄÊõFĬq ÿK/è?bSñ,ı&,%nb‰&É +;CÚ¦þíûŒçË£ïÜ £_9+ƒOÜ!Ý„µiPÆ‘zÅœ¾Q=g.èçŒ;¹ã†ecðœÛo$k[eäu{ŽaZ÷F~ҨÞnüœ-¯³ÔËùs³‘® +/±v“ðÊçýÔÆ[²Ž ¾’Lz±™ºSc,ºÿN,)+t4«Ïbwš1ÉûèÈŠ-tð›5ôý&Ú¬ée¤»,ذ”£×íþ·×5áâÅÙÄÄ‘sˆÉãç¡:z1o¹.±FߎØrüÆÐ-¾åcwÞøû/{+¹h>îÉíÚïý\yÿ‰´Ñzn÷”õ^qštS¹ƒåûk ÒüPº¿ÑSÐÛcoPÀD+ž:2ÔðŒÍpCWïñzòû ô +9¶«Ñ›ilq2ºxûmžˆ08`;Ôèêßv“Wh ¬BÆ 8 £#ë¶²w:EâWM'˜mæLaóqqqéyãìþÝ‚«ß4È¬Ž½ÂË5ØÇïó¾Ð}Ωí;“=fޒݸÎþ×É(g¬\# ¶1CÔ_LØWÉ©é~䤯Ÿ¹Óz}œ Âk±Ê»Â/ß<„ß<õ6hÛ_™´UM‹Ø¼ma`uv˜ñ½žý¢Æw®Ö-Yi¶Mq){îË…ûÝ +8V'óãj]ÿ×sôrj†¯8ƒ´ŽõF‘O=ü±_ø´&ïö ný®MžÂ79­¨k, HéqE¬“úûn©s¨„†ôÕoÒ×ç¥5çù©;§|ÇÛÆOÖ;=v§þibÞŒ8G+â~úŸq9Œ˜¨ˆòÚô Ä’-b«4hˆš¼{¦úsnåÞzn·ÎoœTðã½£ðÏ6Oæ÷ú³þQ°öÇôµxQµ½ç…o¿"_ý.¦ NŠk=%¥Í®Ìý~1iŸ¬¤«®KhoßFÐ|š€ý$ÒFÿ¡e”ðn ïBÀx8-ˆÍ[Of÷iRwzù‚ØêM—øéŒwÊ/â€ôÅL\éN“¬:Jú¦Äδ´Ð[ú¼ö$›Û.fsZydVç>2®d?ðú|ݳÑca½mêÐq¸wð¯0–J—¿,ßK¬Ôµ"vZݱï.·BûG¡úòôètú9F¯‹cj8Sý›Û®wÈy˜¶ž)±/Ÿ0æ™ iªpÀÒa¬¹{êb6¦dô`•Ø2o&±}á,b'<–Í$4÷l!ȸ¼¢WuǨ' ?&ðlà¼ÿ<§WtE™Û-Y6¥CƒMíÒ¤#^¬§ÒºöН71tU—¨°é4™ùû>2âÕ*þ¯:‚CT}Ï9ÃNî f§®êW2yÛá Å­G²‡î<’=LÝ2g„æ…4ÜOÙŸýu5Ðï{q\«#Éž¯Žú÷8U£Ø®µF_¶Þã4Œ¯üØm|>~ÒÎjÄ•™ÄúY³Á~-âÀIëÑöÎÓ:]œ çÄŒï|Ñ Þ¶WT8ñþÊãßùU‡ý7 AнŧÀÉdxæbá­FC¼Góùsã[jð_.ÚgL˜;盟&8zz>÷’Ýehú¸ÜÚ$¯î<ù¼ŸæÉ‹×ò‚-2LØlÔ»VÇí¾Ò±«ÂZ5)±åæ™+T‰ùêfÄÆCÔCk”5os«´^s»µòÐãÂý´‹5=oLÑ:=ÚÀý²’qØ•yÆAisŒ¢n.4L¯ÝhxåÃv~È‹e¤CÚtá¹Ø)Œ]òtÊùêÊáÚlêdà¸ý{µ » žÊW<#B,1SHÍ(øYüØ‚uü¸üõüÄüÂØ‡‰¯7‘™={é{mŒðY;‹÷Uú%Ì£ÝSæ¯ôkIžT3)­p7/dRRä*É«¶á_Ѐs¤cÔTÃs¾ct<³¦iú½˜±ÛÜGqå’˜6N…˜2Õ¨]ºÖPw-˜¨ÑÄíÓùÀÑÂ/=„}¿¹ò^s´ñ5NÝÈ%~ªñt/ÏyD2D?¡a%ÝØmÏ–uœ§cgc&íSÕ&Œxf>£áÿt)øx©_Bl]´‚ؽ|a°G0›+<ç2Ùâ¬Ë”Ö®¥!Ó…ÉovÀ>_öQ½)y¿Gæ|Öâewí\LŸCæ, nt¾ZÁµo𼨶 ‚ø[„×þ®Ç‹©X'´OV&O:Ž¢¢¦ñÓvP×úõÈœ~M^rÅ&^Äëe†éÝ›îsšFw¸}9?¶é]ûûf½«ÜFÍ|n»Vg ó+'Öàôuê9=½wœ®ÁKN׸ˆc _pºz¡OTôO¹70·R4>pJQG[‹Ø¶|.±gËBÇЀí:44ÁGüExμ Òf‘èÞ +ý/ÍÃz þé‹%ÎÊô)±´mÌ4Ají2¥eåsY…rŸA¹ÉgJ^”?PòÜGø¼S,¸xk>ß!l²ÐûÞBñã–ƒ’ÊrØ)}÷κÕÇç§6o£|®Í§l"' ‚ž-5*àxäÀgàEÚO¸šN'iXeÖ:Ÿ;AólöXí{Ü&ÞGîìåãUrænYJûuM 5}tMÄÞmªÄžm;•Ã(új››Ó`$ÌhRX»Ž6âK 8“β„ô”Ó88‹F_®Ó6¹^$Æçp=ÓT@Cp©Iætu‘ð¬ßxÒ.t2’»ΟHÒ àì“Óh(yZvXt¿Q"É­;ÀdöéP m»Éí;éô Øó)zW{–wówM^zÛv2ìñrAäÃüÜozÆ’ú•ˆSµs :834núÚ7¹ ú¡õ õÌ=†©ªZFÂ@rA‘w.z¢†®ˆØµe/¡»_òÿ±÷–ÑQeí¾oE! !8ww'Xˆ'Uµ|U%!F\ˆ»Q¢@Ü —Fº¡›¦ím¥Ñ¦Ñv{uï}νûœqß3ÿO5½ß3θcÜ/÷5F:t’JªÖzæcs>ÿŸÆu·›f÷òõ×ûL,9Öü€«·ÆeûÛ~o·×(Æ ‹À„Lû€ÂÞùŧ–`6ÈPØ03ŽÒ©o</Ý?¬\þNÕúû^}ÎI'¾xp–¾ÿ¯»õÍŸ­áRNNÔÅVÑþ݆ž'Š—~hÖ%£c2晹£gçr…Óø‚žúŠKó|{¯÷½ôŸ{ýÎüÛ.¿¶;«}þ¼ÑûÔ¿mñ¾ÊrÙOþéãwïü>ùŸ¢ç•ÿ{›OÉàTŸ¼}þ} í7Þ¯õå:߬–‰úŒŽIú”ú ¾rˆÙî[4›,ÖìX½QãÉÖž;³lÐÒ3¤TL„;×xkúG7åGŠ|å+Yºô\Ï?Õ #¿ºq×WùíÓ¥ôÆIRNÏt!«ùÛö©\yÿl¬Cí™ßör~ üéQ,wýïZí™ß«þë.Ý©ì®ÿ,HŸ¼Œ—?x¥;ó{ô‰•öBR‰=—?0CÛùõ&áÖÏFÃóeá?\ï~x\àûî?}¼ßþç~ï¿.÷ʽ6yw¸Æ]ˆ7÷NíïwõŸ®ºš› ½ÕxsmP¦•> ÕÒ—0wÙêÂÖß*Í.–ðÉ•ãõÃ?¸`ÝxKþfÐÌ€n±x(ÎÒ˜\í¨Ö¾½Nî»wï½³[ß÷`§8ðâ 4 Œt§ÚË—8 ¹'§ˆÅý³1ë…ùxéèÀ<èóýéVvÌ“SíñO‡º}öA¡2ô«·XýÎráè­%ÜàŸ]„·¾—u½/·ëÏýÝ•»ô“_siŸ]ïÈåµNÑfwMò­¸8Û§áÓE>iCÝŒ©æ¸35Ó‡O6÷ô 6Ó'ŸpЩ·wÙå­™;j¢f«›V9ÌÒìݶO³wëv—‡éûèÌ8C¤qqâËÇ+!QV<{¯à¿cJí¡»eH(°—ã³Ç`fX~èi¸v/H½øÂÈ5¼¿RŸÙåÄ5¼F;üÛn¾äÂ\°º|Õ(sŽÙªrí›Cê¥~ðoûq¹ÆV …}3ùôº‰bùéùÐä®ÿæçsí¿í÷»ôoûý.ÿÇ>¿ÓÿØ©«º0W[|n¦.«}’>¶Ô÷Åü1_EƒÙ|fëN|ŵ…\R•=ìž+½8s¥ºÃÖ,s÷1hôJŠ…ß7ƒoûz«Øþ|7t³¡gDzB—žñú³¿Àl—Ð~o7øÔ…~¾óâ<ó)B~× 1µn"ŸZ;ÏhvÔgq~äÏ»u]7ûùm·þÊo¾Ü{?…w~4ð· >ø6Œ»ö›N{á?ð7S´gÿû.ºÄÎK +4ó ˆ·Àü?òw7ÃÍÇþw?.0~~'Gx÷ƒïÕÿç€îÍzûÔ|<ßU¦Y>y¾fÙØÙìó ÍOQ£ ϰÖEdXûÅ[r!©Ö:c’åî=û5;™ÿܹq+ñظÄ*{!.ÏNjŽX!ǦتÉeÄŒ +O·‘‚b-åèh%ȧžøªŸ¨Â¥ü¸Ò¶|Zƒ®ÿñVaðGWè +©ÕäìºÉBÿ㽆Ÿ†}r³ üÁ·î$ +ƒ¿¹bM*¼0Wh~´I¨¹²D,ëuæn¯j/.ayÂí©ìÖžøl•_æqmÁÐ4ßêwçé['ìÝÏê…õÛ4Û7îÕ¸l=¨ñÒ›aÎRUj³~á +Í<[GÍü±5ËÇÏÐì`ùò+ÿüî9JÝåU˜É3½¾Bj½¿Ã¿ôô9 ÖR«—5¢1Ò’´ÁÂH,¯6N—Ž__'ô|¼SßsoË¥WàþëÚî¯×]ú»›tñg^7øb8 +BBå8pø†›+¹ŽÇÛ¸®ÇÛÄ_ÒZ¯½¸X(˜Ã¼³A<ÿÒOxã¥÷Vxïû@ñ×!ü[? +,&nåŠFfꢊl|øHsׂæÀntîÃóGó uãùìþiÐâCsGùáÌwĘóG'0[˜%±ÚWbnE8õg±âÒ".*׆K(#ä÷²x~‘åƒ'œ„ôf“¬½ºŒëúr›Ðó|pö{ñÜw>üÈOûIoûÂÞÂ?é0§¡ïy¶]ßtk…öôo»1„Zg¾…w~3êþ²CÛôñ +mß¿mÃëçÓJÆéc³m„ªË‹ôÃváÿ²º™\õÅ…\Å ôÍŸ®Ööý´Õ÷ììÒ¥´:¸zjÖ-Z­Yá8W³iþ*ͶÕk5ûöíÓ¸yzköd±åÇî~’ÆÝ[Ð<à£9èî«ñ ŠµÐ§5:@{þ3ÚÐZ„ÖŸÈ™sZæ{¸sâÇ|£Ôûlß÷ÜšÝ\\¾P52_<óÌÛpþžÛ+†çIy­Ó ‰%ŸýJ¯\{l¯¾P…ó?ûpÃÝÏüÃ3a|ÛÃ-¸†rAýT¾jpž®ãÓõÂ…_üä›ßëÎÿ_®ÚšÛ‹õ5w–ûöþ²É¯÷×­ºÒ³³}ƒ³­|åxsw}°™ï¡TK.®Î^‘e½eÍ&ͪY 5Û6ìѸîòd~S§#Úðjù™Å†®O(-_îw :tÐ+Ôê?AC<̼Ʃ˜õ‡î‹\9°s¤,Ìrš' E3õ]϶ñçþâÁþë¾þíbFÛd}@/^L©v ™¼œÖi”ß4ýi é +V]]¿µšo¼¹R(==‡¯¸0_7øýNîÒÏÞÂ¥Ÿ|¹ìåÊ/σ^†Ö˜`á#6פ[r‘v~à6ÈÌ?ÇÙASOn=è?ò‡ F‹9ÝÓÅŠ«‹¹“_m„}Aó—峄„êq||…=gËEe†v¤X|~ž¾ãÉšA®s…¾û‹-˜­dñÏßpí~°|õ‰Áøî½XùýLJùK?ûé[>_'²Ø¯?öæÌ&b~MxÿÛ íésÑåtMÖ%6Ž×öÏÐ ÿûnÝ©ßö ßa¶¹G7ò=ÐÓ‡%X¡§á£›“NKëuÚž¯6ñ¹}ÓüÒ,÷l÷Ðl_¾E³oÛAf—Z·Ž×èÔ s}«-ã +Æðq™¶Ú°K0(Iã%8ÅŠOkr”ªn,‡¦t])NjXÚhÿ°tE +67„¥Ù úæŠmw¶Aë Ú|NËd¾bd.×÷d§Ðóh·8òÂs®Rõ™ÅÐäûžº(gé„‹Ï´º‘_\´çþ¾‡ëWAùèiŒrëÙañì>º‘'»Åòáyb^Ó®þòRýù¿¸Ñìò[?©úKÿƒÕÖêR'p)M\ïo;õý¿îâº^_yyŸÛ9UWve®>µe¢‹‹·fÓÊõš;<5àx‚õ¥Ó±Ï,öèŒ!æ¤ùQ2DBTÊ(h¦’]2¿)6^Z! ëÊõÝÙ!§—â2íäâ–™|ÓÍUbÝ•|3û{§þº_7ôÃ.)¿uºQï(•\˜ÖŸÙà(fž˜Œ8)æµL%M V¦²\¼hp¶˜Û2•´$Ó›&ñ±™6|l‘éíT¾¹˜>'×Mà²FAkÏÁ>4ªt‡3­1' ½=©òÚ¹úí•|\Ñ?.ØÌ[ç¯=s1…vRn×t¬Ýé¿îÕÿÍ•úi7üçýúžç;¤ò ¡í¡ÿ›½ÐXƒößbÒ°æN}ï* ¿ô/½Ð‹o½4o¾tC¿¹ÇÞ\Ý9Ä }ËŸÖqõâÎÿÍMü³µ\NïTôÕôi'&òÕÌgö>ß‚k¸óãÐó‡v¤NekíP´—Q7½}ß7;øæOÖqaE£Ý]eVÐxzÈ)±r¼TÞ?Ú”RQÿlv-¤Ô&G\c]Töh’¥6(ÆÌ¾ýÞV°z  ¤TŸZ*Õ¿½Ú:Ðû$ëü¾ÙÐ%-m+tm­Óõ=ÝÎÖãVáÄ[kÄÖ7ów¶ÉÝ §¾ÒIý_º +÷÷ #?ä/üà-ÝøÖ_~ð0Óøâ³*ãWcþ>ðƒwÓ¤kOø\!çĶv× gñÄ,.î?=t9§¦îwå5;7íÒ裫Æ=?ì‡pƒ¾—ß;M_qu¾>ù¤rÑ{Àlõ×@߆t#KG1${”_=žXÍNДW <<Ä:ãµOÃäótÐ……±¯—އ&:æWwÝÐ/.Ð6ãZoÂý…˜B«+ãËì…üîéB!‹³¬¾™¯²š¤ôcŽBÖq'.ŸÕGÉÇ&ÉuBRý9¦p _2–g1\\pCˆªÆ˜‹i Ž˜oåúsáú¿Ù ©°{±ŠjYÓúé&ðÅÀÇ—l&h ‰ÉÅã á"œûÖS¾þTU/mÎ}¥CÍhôNHC¨êìb±¬ÛZO|ó{k¡=6Ïê$þôŸÝ¸ÓqÕõ¾Ø†5 3 ü™„¼1RaûLä-ÜàOûÄ’óóÀÝõcµ j20€ÄŠ¡¹°Qhhp196ÞZ|‚94ßõ)ÖúÈÜÑ|ÁéYlmï–Ê//òö Òìßéªñô“5\P²•\Ô1 :âÐbòíÀÀ‚>¡W6Všlåê!i¼Äp3v-fB{š®|`‚%´dDÒÏšGZ*ø\~j¡\Ñ¿@®¾¸Œ´R*/.⎿»†˜"ß»ªg¿â‚Þø0<ôú­ÄÀËŸ‡HýOÜH‚ÝkéÊ3Aýèë8Ã7_”~óA=få U¢^x(b.<}óÛ+õ¬Ñw|¾I×÷ó}õ;‹´%£÷ºøj¶/Û¬qc54(nÆñØkî{(ÑÒÃ'ˆùÍ ”f í©àÖ÷ÝýÛ>ØGÚi‘EvЊ·úbZ½#‘< +qÛðÆ]ã¡+ŸGJ o­†.4•¸Ö÷Ö —þ¬.ÿCç;ø­BÉ¥yаªYNÙøöj1¹~¢Ÿb†\O,=7quµîPŒ%´ý¹#åc¡È%ÕŽ×Åä2ŸYh'F3_—Ré Co2½uŠ>,ÅÊË‹Å@½¤N21Ö˜=c…Þ#-!‡LŒÓ¶àH)…ã䌊‰ÐeÄûZÜrÅÙEЫc1ÌŤ‘58Zwà‘fTr#t ¡õ¡ïûz'øÄ‚Oµéö:ä]Òåtø„‚1ú€p . ÊÄm„Æ2‹•úŽ{›Å”“Ž>J´¹ŸÈ|£b&†¦B sZ§òÉã|ý£‰!­ Ž¦ëæ™_@„9élöÎDŒ@Žâí+køCñVà±:ÅIÎk˜ +&â98¬|t– úd¾r¤9ËÌôÁ™ÖBRÍ!,s”NŠ$" Zù9“¥ŠÁù¬nßÝDqૃBÏÝÝRãõ5¤ywì`v‚ݧžy¤?ôÎûI!·ÞNó?wÏHÚMï­ÃÕ·¾¿±\~çù!ù“±˜ÓC W! ù² !¥‘ÅÇîBBÍ8ôªøÌ'Ôžú ³ÝÛ=5[mÖìßå¥Ñ§Zé qn¬vÝ{ЗåÒ,‡T‰¿í«4ƒ&7ô§¡_ +í>(ÑJLJ™ó‡ŽXÉiµŽBÕùEðÐmâ¶Ápî+Ùpæ¹ ×¼±œ´ ‹Ûgóg¾÷ßzéÏßüo’ßÅà˯, ¸>Yfëîp¢•§¯Vî,æêÁ€Ó†eZ»ºi5ð‹Ä)cy€˜UÏbz®-Øœ|H”%t1‰WÉì šP>:Y#Š´”˜%ØZÊm›´‹”c—V.3Ë¡ÅCqV¤WU{u•Zsat¹À¬Ãc­¡S'¶~¼E®9· ú†&¾aî5¡|b ™ËŽ}šíÛvi°'äÍ…™å-0¡ûénèøÒ5bu­¯VÔð!ÑV`T¨ ïn"ZRµ±iÙ:ǵPûïyŠ'>Þ,ç˜y)±ØžúE,ïÊ·WbÓmÙ¿g‘^ßÅ_}„+¿ðÚ3ß+dÖ9B“ÑG‰`±ÍÄ9’ªÇC'],¿´¾ìDèÒK¡1Vþ9Çgóºœy'f¢ãÁû›yxziôR€ô7¡·-nè ó!ñV¤?Y~jròýmRëgÛÁe…æ(1à¡ýÊòA©¢g´4uïm.>åÔáG¾2´¸‘Ä´a÷%àÔ¢ÒßùÕ­Bÿã}ÒÙ¯|Åc×–ñÉEc¡á/&ÙƒuŒÏbl®rsô¤¢gh>#ž@gL(>=GÌ蛦ͰcÅŒñÐåã{vO<ÚÂlȵŸœÙ5´ëúïÕwßߊšÌ,ôŨW2<6oèüê´ÞÄÞç{Äö»;Á>g׬¡ûË]úþ¯v@'=ò¿¸Îegæ Ïwº¿vz¿ÛÇž¿ºÆŒšÉRÐ+¬{ôœÔº«k„Þ{.êð_ÿᇂÒu?ßöù0[¥†Ë+ u'ŸGÜ«²7–(ý?xȧ¾óþ¶Ÿëýf§TzqõËNÍ#}»Ó/}ŒWo<õçë>XIû õ㹸ò1¨uýX îºtØ :ˆRRóD™ý~Ò‘3†ÙV 3÷<¨#½c°U _h¨¾ºÚX2¸PJªš ÄUŽW²Z§Šv©=Š ¯W3ë&“2â+ô®؃q&ýÎÎâN²¼ìÂ7¾êõÇÁ¤©VÐ=ó; y¯aþ0ÚBŠƒ¦hÛd¼_CN×,CjÃdh sN΄,b-17X¼….>±ðÒK'ÈoR;ðoà®´ÞÙM,ïøR{cæñi†Ê«+ÁøòOc#Õ†8ØìuÒLZÜbÝ©%Òù¯|•÷î…ßý,ZÜn.îoOÞ¤ÅÝwç€a讟2øÈ‹ëýdiq£¦ìy¶‹ÕÐk¡9ˆzD=’oÏb¹Ë‰½Èê žÅhÓŠûæ#ÖC/P8zy!]9F”b…ºü¥ðô%ÿÌb\–Y„\šE”G»¼×¶¥“bÌÁåƒý«÷;Ÿº©×–#ÿÕK!f~| ™€¸æX ,. W©î‘9@ã’]okp ÕNv½:žz¨7VBG{Hˆcœn.Æ[©‰EãHƒóÄÍ †®Gnþ=÷¼¡¹ gðޏ~æÏ޶ž¸Ù]Ó¡Ìw¾ÜÁ7|¼F(½²P¨½ÍjªK‹ÅÊËK¸Á'» 7î„ݺ•l¸yç°öì_öòõ·V +Ç>Z%ft’sûtbA×LôõÀG€þØbßË}àž¸íw׸îg~U+±<4ÀìoÎWh/„ÆZ!.7+¾zX)è¿à <ËëNMÌ'×°8Uèr;‹ù¯Þ®Ê©GZhð‰Ãß¹ë{XvÖá"[]P²%زz)ÊB/FšCÛ[loÏ·ã„4e¥XK¤i›?†4•Ï—¡Ï DJéxp¸Á™1våÆ +±ãJí‰[X44ß?¹zR@L®=˜*ÊѾù¯´¸•Š¡…Ü©—®Æ·> øì½éÊK6ã¾ÏWcâ4µLˆ´¸+Ï/"6üÀÀsWùôS_ÿÁ¯uRïwûE£‰Åb6q†²Z§¥7;Kýv–þô_÷¢>Äþ–·'G¹’‰UB¬bÛ$掛‚Øð¤KÛ? úϰ½Wì,µýë}r÷ó}dÇlkÅhs=³-°æñ¬†ŒÚIȧ•žÙxMRX®’5 +|yCÛ£}rÏËàðax~”¹N 6#~ ˜á# ácH±æô2©éæz¥ëÁ~èêJ}/]¡ñ(t>ÝÅbéÎs ÿ›îüô?tçû8`¸ú<(è£ÛyêÐc±æüê‚óP<4›Onp ¾bÍÕå‰÷6 ® I²„Ö±ÌòrÄuCßcÜsœ·BÎI¼bppÁDTCÍuj0åz¤Í}8Þ\$âÕ€œh­D3»I­u„ö¹2ôÜ‹ØY%ìÚ¾bgUÅò»¸ü±jÁÉÐŒ5d²¸÷;;KŒ*±Ó²<ØkŸ^ÃKÁæ¢ý-ÿCRP´´–E#³ÍØkµññX£žHbé8.<Â|&hz“îõ‰w778[,NãÃ?¶l‹‡ãLÏÏ7=?»w&4«aßb,³ÕÔ² †£ý ý»î¸v<𦺩ïÁºóü+Ýù3Ï´ÿ§îü×{ ;o| g/^*ˆi`hªÙ3”üþÙú°Tkô$ô£¤¤ZÄxp³¼¹Cf>|€™µ¢3óä†/7#Ï•3{¦!þíÇgXë„3­VÑ0;±$ë‘âqÄbO)™ æµÌ4¤Ô›xmXóG//úžî—ýEË{À–çÜÇC¯ñÜØY:I5Ó °³æ G„˜èãmÔxïײøjŽødImË´1„§Ù(!I£äÐôÑðÑ`qŸ:·iššß2þSŒM·A¼'Þ»¶ÒÉÛ›Àø!}ú¤Jä­*Ëõ™Xª6ߨ¤»°B©:¿”˜m%m³…Ápö½RhqKɵûà›I\“¢¨„çÙªQ¹v87Bl¬â¾9è·û7·o¦ttkI,'3)F¾bgu?Ø#÷=<ˆ^Ê+vâ­’T7ö,gV;‚WvxɨÍþ‹UhbgY½e‰øbL®$'[cíBÃ_=Rã€>×PØ2‹xfÍSÙuS™œ‚Ø!¥"ö{¾Ê1'<zëÿú|ÔñjI÷\hn³¹Fóû[ ]ïïõ/;³Tɪq‚î3xÏÄ‚-¿°Püõ€<ü³tdÁŽžÏb'zBëÛë•£ƒ MÜõK°Á@?{^^œ¬ñ‘C̽tŠÆW +5Cíˆ~¶·NÕ€‰-1Ÿ!Ö°¹¤[6ÖÏ7Pãå)h<½µÁfaȬr2wÌu9±MwÊÎ/Fï€X°eç@Ãg +P³rgv“o¯oì,oœ•”üÍÁÎÒ ’F;‹Ù8ü±³ÜØßc`¿’ª&ªÉ…ãý£Òì‹ƂÑ(ÇY‹Á±VJ ‹Ÿ`w1Ÿ,WôÏ 5êƒkÖ~o§ÔþÙð]•Ô&'c^¯3rÏ—û‘çcŸ9´¹‰Ox´s®Ðsϱ… e,ïÈï˜!¥²÷.Gß]–oÝÙcÌižaˆÌ³ HkšêŸÅêúÊáņá»zã™GŠ2ô—‡vrÛýMÄÎ"~û™…\Û‡ÄÎ[¿ØJ쬜V°³,<°ÕXs)op&´º‰M}t„ØYð“ÁÎ*4±³ ÿÊΊ}ÅÎJ%ø‡[p"«-U–·#ç;>¯c&ô½Áß@N˜!¥Œ­Ï¦é`+ÐóYÝ!‡±çDXp|°¸TȈûƒçW_]F`j°¼Ä¤s<4_e×R‰Î³#>YxÒ(0¿•¬–©üñ׉§ôÐw?Ýþ!fóå<û@­FuBtÒh>0ÈÂÓMÑhyV“‡dÂÏxûrñ¹œQãˆ>"âê7ü^ô0Àæ‚Yþ“}rªTóÆRð*Àæö8 ×x¸é5È·Åðæ¦ª•#‹Áò¥¼’Åmþ¤œù\VËÈiõÄüÃy+nà™‹<øÜ“ØYÐHJ³ÑýÁÎJý•dc$vÖ¹•JýÍõjbÙx>Ð ¯¼mì•2§¨µg–û÷Ì÷O,$¾5Õã™Ç§{Û'[‰WÀâ¸4¤e^±É›¦Èu,÷:=qPlût»Ü}o¿ÐùéN¾õ½`ÀS/ çs¨–évÆû’ß^ -yœ{T+®,—T|ä-7¿½Á?¥d¢eiŒÈ´eõÚ ©å³íÈÁ$VËšø’&v–@ì¬G;åï=”SÏýpõ±0âòÇð¡9£´a©V\xáèWì,ô—À ¾Ryϵæü +µ n:Å÷‚6g©îì2¥ñõ†ŠKËÁ®TârÆà¬Ö8ú&†ü.gñøõµ&>Ç;ë‰SÚEìPÀ㪹ºÚpôâR5·n*|±‚ç +· œ{©õæ&±ë«Ýè¯Ñž;X‚ùõÌ÷6OQë‰áU@¬{cA§³\Ñ;ûj— _s¸¦bi¯³™i£CÌõþÁ戔ÿBÓ?½ÆÑ〨ñÓ2ƒ2¬ Ñeö¨o ™uSÀ_J(³G,ä ±¾ºCf¾8óÃbr)Ä1CNç,Š‘,®g=OV·á|ú¥&~Éð<¡î-hëoBÍ%4½µCúñ)ÄËm›‰¸ã_ÚFþA­¾²Jaµ*8èoš˜Â5&‹¡ÈSn¬û y1QÀàa¹ürMœ; ö… 0ƒq½Á¨C"6_]-ÿh rEì«€. +8?bÃõUd›`ËdQ,Z(·¹ö)õýxûujß#Àáû²Äü'¸t>^à'†šº¸{¶|¤löôqO„Øl[ìK ï¬á[>Ûv–áôA?ðr7ØYâ±sK0ó!•ŒÌ•r{g@ËZ žó­%ÄÎ+ý¬*fŸe}ì=±÷ vV‘‰%sƒØúþfÄê·²˜oÈmI¹&óû`¶ NÞ\/׳÷]Ö3G.éC¬ù’ájÓ ÒÉ÷6×{.‰¥Œ¹¬>ïâÔb©ëŽ‹Üs?ßsgßÁ~WíÕeàÙóÞ“Zy}¥!½eªm%מ[†ž†zö!¼ˆzýÏvsín$¾«±¨Ö¨¼²\nût§|⣭ȓ|´Þ˜l)¦Z£ç£Æ؃ƒªF¦ÙR*¥î/öú÷Þõ%–LF½ržÕC~¾¬^×3Û 0ŒÐ7} ÊÁˆsšekÈivj>9¯k&˜rÉÐ\̘PŸ©ðÔ<öŠþelŽ­Ÿ7y1`˜-)Õ–a?ƒï1cÅàTÊ÷‘ƒ)¥—‰'?ÝŠžˆRÒ7ÌoÄo‘ù8°…p]Q’_,<9Ìjšsiøhñ‚Ò«‰jH«šD fvo‡Ê ,n³ ù>ql•ô8‹ìÚSmn:{ŸÌNgº•Ž]^Žž†zékÕpéžQ콿Gò±Ôke ö¯ˆQ“×8_à¼!‹.Cý„ag‰Mﮣº­ u†\} òq}çƒ-¨ßõ¡éÖz–ã‹©mN`¥)e¿³8YÝÇÖñlé;«¸kØFÖTË-b¬«EƒóL¿·wìjAp¨«GIõ—Wˆ­·71Û"5½K9 õ¬ªO-Áï 6\)³{ö÷ owŠ­Q±†Õò½v)çðüùï<¸®;[qÆ{îjÕõ•tn2-oœ|þ¡.ðú'¡×nÄ]ø8Ô8tÏOè¿»‡ÕC.xÍðEjNçLv/Ù{`×¾¼oκIa¹£•Òó ©fn½½UIotÒ#Ì–Sú ßÜ-‘Ùl\/†›ëõþ,7ÔitZ£FM…üïK8ù§ èK°zr”Ž3˜Ë“ý-¥¼oøV8¿DL¢ê+ùŸosL9šs`µ,zQbX”X[¸žJ훫Ě7–¡—-†çØp†xKp”±‡®”^XD|Ú듪}68kèmc–L®w=ö¬ˆyˆ&ì¢ìúRµøÌp¨ ùÝÎ8#5ß6喴ކªÞX»§{~x\…m³Ð»–û¹3ÿ½RJÈ+‡gÚˆ‡¬””†I8×#žýÆÛpákEüÚGl½·˜=è!wúêj±óóRûç;Õò‘EÄ4ó–å|”³V_X‚ó…ðJþÉé``‰Ço®ãŸíåZ?Þ€ý]ì7Ó¬cT±ŤªsKáç‘K)iÅ(OÉ>>ÍPÔéL{BÌ¿ó­·7pÇßZ…ëÎ:êym~1UX\!ŸWÚ‰3,‹ˆ„÷ÍòGŠlÝ‹5ç‹,?guË:äZ‰ù'–‡ +aY£ðºqöLz~ @}뎻ÛÅæ÷Öa- ~‰•ýóÄî'{pÖS=÷µ 6¼¿ž|uVrVü^ò1ì^âì%xO8@q½+ÔýŸ¸À§ÒÞt`ˆê^ÄXü~!$Ö +g2Ð §H 8b¥Óú›˜ˆ™'¦€©‚÷„½1!4ÂÒËÝå´ŠF>Âì{Ì©Ç&šxæo®TªÎ.A{È•„B{bb± ¯ÍPzj‘Òtk#ú3J)³?öúÔ²ËK¤´ÆI8!FçØ*iàX²ßÿ•Ý> qRË>6ÛýK¹ñ `?¬-°á2ONAMûÈ9ìþ‚A^^ýÅÈGˆ[ f{ÉÀO©b¹¸JˆµÇ.­à{Ÿº¨#tàÄ`¯žX_Étö½Fœª8·X*ey-øÆøø'p—{ìÐw~¾™o¾½–ötRYì€í°5fâ·M§}@ô#pv8ëøTSŽÜ6 ç¸Î)w’ˆçsAiVzà ÔàV!çN̬cq¦y²ÌòOç­*F¨ÍÓi¯¬ùÚ±ë³Ró{›°O/e[ûHfÜaËŠœ¹¶7á÷Ó~M6³‡¼ÎéXcRI¿3_wn1×õéV®õ£ÜÉÖcUŒÊ²SŒN³QÊgH +FæÊ,†FØ©i'&ƒU¨€¥ÍòQ©z€ùÐóË`“¬æƒ½7ø𦔸t;ñH™½’R=Q.ìc>ªsõùXÍDõ{®øÒ>ZŸŽÓ Fm‚z×yö[%f³RLº Ù6Óìš)…]³p–GŽÉ²UÏ›ÞÚ€|<-Ôƒ8³¥–ôÏÃÙ ¬+¼ì+©'P;Ã#$nzR¥9 >õ˜#‹cŽçÁ{e>EJorÓ™xÂ8¯˜ÓFÌn¹8·èÑfTL$Vùà7×ç=–‡bKu×MþìSæãˆsV,úìl))ìÚ2;cõ ò"Ø «Ö Mï¬Á}DN(´½³Q®e¿ƒ½O≠+þ0ú<è“§–M ½R–Ϧ <öÂÊòmœ¥-e×íèé…`ѯ ût™•ލ“À®ÃÚ¦ëÿpìÊ2:\yv>λ‚›!Î b}QŽÀ®-ü•!¯sÅ¥êK+ˆ ÎÞ³t´{.ÙiÅÐ<þØe|õõ%bj“#ò9zo8÷ÒþùV¬'bl…ÅY®=õíNýßyK§¾ó’†_xðµç a)Ö˜AþÇîÝpzXXBëìÁØ2{zÝ´®¯­úçëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇëÇÿÏ öÇï L k+k»ÀÅmƒ?ûŠ6ðHbHÂX[oö%ÿU. ‰ûƒÃccÒœ·Ò×D/OÎmŸóVçÅži! þ«ý×ù/qÞæ¼ØÅmÍjö öÝ%ÎËñ³«W®]ï¼J弨ô‹Ù÷}ÂÃÂcØuAQ!¿ÿì6üg¬íŠMÖ¬Y¹vÍê Λ6¯_·rýÚM›œ£éëë6¯\·zÓÆùz}}-ý¾¾~âÕ×ÿë÷ü¿}ý_~Ïá±¶ÂXÛ˜±¶~cm·8/^â,²ÿ]íì2Ö6þ÷«s <*dëïÿÞÂÞÁ«kÅ~z³è:ÖvÕ¾äð ½^’‡³È® â¼Ú™®é?μØMì¯[½rãfgƒóößkÙwÅÃÿŸÁ~äÕ³~ÿ´Ùy={ k6³ÿ¬fÿÄ3W³Wº€^&nòVçõk6nÜÌîµ›íA7A³¯—ÆÍKÐxé‚Í|…0s|xɇÌ}¸@3o¿ 3/ŸP³ƒ²æÀ>­ÆÝCÑhõ‡Ít!¹Ö˜€Ô‡f[ëC³¬µÁÉV¾j¼ù~Í®í5n$7iæmŒ7÷ÖGšp5û\ü4øj Žæk8l® 9bågÁEØê#Jl}BÒ­<´þ/ŸC(Bé‚-õ!E£´©–~þô·Ýý ìwè4ûw¹±ÏZŸfމœ^÷ô  Ÿñ“ÂÍøÐ4k¨œÒ«'AÍȘ×6 Sö˜‚%ߨ|;LCÓÔË‘ª ˜<Åä0N%cRÓPÔ:S(˜”äÅ[*˜œ†JT¦-Tciú²öòjLlbºLŽÎ¶%u +öY‰H·Qâ ^Ò0JS¤Z‚ŸÇtÒáÔÑrèkcL±½!ýý¤J¨•qÙv¤š’n­Ã´1o4ã” s(Au@Ž·Â´!&Š¥k¨hk9IÃFYH Ç&`Ò†O²æÃH]ê\Rd– &)¡®ªÓ˜éäCf"&õ#ÙûM·U³j'«§—òzgcJÙO 7‚’¬ º@ï½lh¸‡ÙïÁÄ(®gÂÑ ¤n”Ó9S)š#å´M’JíÅÄZöõú‰RZ½£–7ÚÏcEW).w ©idŸœJ'ÄIͦd]L䜆)'œ¬§“ìPq`‡÷´à¥s('úÂÌ¡° …f¿P3_m ™‡¯ª“S R)=zy*/ê5˜,Õ)Ñzö~ø vMÙÿC%sÿ>O &O¡ø*„—Øráe¶úC©VPõö²©O FoŒ°€*¦»·NƒÉjñHí¿ x w/Y³ÇÕGã…É×À4k9¦fœ”xl‚]k¬!!ÕÎZé5Rk8R`5 !ðˆ” ¡Ãû‡[A1V¤™k+&äŒÁ¤¥1ûÄ Lˉ…öJh¶ ©åŸŽi,5µÆQŽÊ¶±†bMé0ÛçÃb,Åx+¨A(©Ì6’K'`šÞPqn™Rsy¥!帓c'ÆfÛÂÎ1á¥"L‰Ð_Z“M@Dmªy=³Iëø‡›åÖ;Û1á(å˜T$„øÂ1:»Ìh*9‘Ù3&sKúæBeHo1Y¶4…’^ì`Èïœ-%•—"RFÓ” &bÙ}£I½Ð(+)«{º]hç+‡˜ØíÎ|äV`ëÍl©•ã,ôr$»—‰–ûÐÊæ^Þ²ÆÛC4ÑmŒ1¤&’ÂÖ|™/gÔ@‰¯J®bpÎ(LæÑ¥c Î‡ßãË›ù af¤°ÌÞ¦™¥äƉRXÎ`¿Å +L'+‘ùvPŒ û)>ÓÔ5”(AB#ÓF+Åvz5ÎB§2?êk©DØ©©u“ Ujt–™fƒ)Ucz“„)ˆtkLÀJYÇhŠ j˜¢g÷Ç–¨ì>rOj•£šXဩDRÙKnšD÷)«yŠ\óÖ*LAbJSªJ»®P§`¾“$†Ò3‹ Ç®¯5=³D%•‡…†,LËç!Èü§i¢—ùdæ31E»¢‰Uv¯ÄÈôјH‡ÍRŠ&`ª•&“1uR80S?4¹šT:ìùeCrÕD5±l‚’7~¿‹³pÏ3khª”&À.0ŸZ€µ¦– ̇ú•iòoxMŽ÷ÎVsÛg@…ÇX04þâsÇÈym30…F“Ð¥}sLûab$§iªœQ?‰”¡ì•cKDR!nŸ‰)69»~²’T0ëНð«PÃkåì^Â1ÉÃ|ìÊbX´¦à »r?à£q÷Ôj î¤™-ä5^žF^fÏg>‰J°ÒBÍáH‘ ,uì¾YaÁ‡D[b*ÚÃG¯ñƒÍ… k!<׊·øÛPž‡ñ©V˜ÆÚÂôM<Ų×\5NÄû‹-£$WO„w †¡$Ö8@ñÏmŸ«†S£ÌLÔ„åÛrñ–Pî …T{I!‚ùBø52Ýê JBÑ8øF¨ŠY6˜VT˺ça¢þ¶%G2ûd÷“&¢r[¦C±“¶RXæhRK©£é?cÉÐBš¢f÷MÍ<1Õ”tÍVKûç³ü`&Ô†ÔòþjÕ¥åðMjùÙÅðE†”r¨d‰¡qV4ÑÅÖr 9üÈ(L­ª•“”#•ä´úIP!…2¨ f5c"m!¦ …Ì–01‹‰C¶~HŽØØk=¤7:Aí ï k «JÕåå4Ûx{&µ0Y† (ä3¤¢“Û1¿Êâ˜Fã1˜7FÉev‡I6ØbùÀ|¨6JG²ºfbŸý­ÉXK˜~’ãJì¡,OÓðPå=RbO1=­y2ÖŠî}l†-¦øÈ§2_ E.0ŽÝ¿Ã¤ _G¯÷ƒ=ä¸PF׉F3ÐÄp"rl¡<+ø'ZJ‡Ò­¡¸µ<žùEN 7Gþ‚©F(f@¡ j´PFÀå:Ff¿q¥cH! »yŠ˜R1SÑ˸T+!¦l T©¤£—)¥—“"\P¢•Ä|)M²5é¼ꌰߤ“N˜l×B!M 1'Õæ'Å€x+ÞbRìfïqÞ4Õ•Jy kG¤ô¾(„Le±<‡å„y-3Èž¡þ{?H?›Òì„\j#ä£ÒON¥é@¿‘Ûá’ºJ6ËãÒêH­)©x¼š\1‘”‘˜mÀGQüM`6ƒ‰AøX¬¡ìãSi:ÊTie†Âî9ja—3&{i‘­W¬K(Pb¢ëÊ, +)=´ÏÂë$(W3;„M5æ·Ð#lãéÕŠ ‹¡¨ u*±òòb(fCŠø ŸIÓ–˜RÌï‰ Tš¬d¶U ¨ŠCŤvÆ|9»̾&Â÷CVL(K´ŒÒSó Î‚IIäð{r\ÁXL’ $0›M®v 5E|-±p,‘=Zb¾j¶˜¶/`kŒùcšÂ‡šXlÑX¨ãñÌÿ ‘GFáÚ྄]Ó Æ/X|U ™jcše¯¡ææ*Z[¬€o¤õƾ_€ÜF®zk¥Ðòù±îíU¤:\}m)M6Æ–ÛKmS¤£o.Ûïê?]/Eרûhá§#-”ô'¥öÒ +¹þê*LÓµ+˜ƒÉ|(Ì‘ +"È”Ñ,¿Lb÷5‰Å/¶Õ̓ӌ…ƒóá«àwÄ€ÃPG¢|© +ï®S˜ƒmªP|M=:Šˆ4•Éî#ò šNe÷6õ š´ÆD-® [¤¨Âr!9&Ï“©¤’…û•P1×RÏ#%ò2{¬#)õ÷‹¼“£°¨&B™‰Ù髉}¼šjf9¤Äâ¿ÀîÅ|ÄþÔ +ÔYP- eÉcW–C1›¦Y™ªiuä+é#¥ÊAʬšÚü(ÔPˆPyq(bA× RîH(¶§÷_:Žâsñ©¹Pž?€",¦œ¹Ðxª±”®ÙRíµå˜LØý Ë{€×ÅL­‚DÕPµxdžWaŸ +…<ü šFÏõmœ,Áo²v n!<ÏFêDhŠ|%b…ÌÖ?Ùgiÿ³Zÿö“¢Íµ¬þÒ«&"©%¼šP-¿¶ª½4ùZ~i1ˆP‹£)ç–Ó¿M”ËÎ.kÞ\5k1»e +ˆ_ ÔˆiŽbnÇ4|ðÙ]SAI‚â9¨:V‡5w1¾l,hZc¬9rRúàYMfdþ;4cr¨ð(‰uÉX¬@|TY½Aþê~1¹vrF­#©‘'Òý©‚Å,äüȠ좲ûu9г,¾È,¾ÀSÎÁl™è%Ù N4åÍòŠC,‡ •Ì(V7DfØR.Âb§ôû×Iq*JlýÂ&á‡hšø÷ç`½`MÁ?Ë%=sHÉŠ}^[éÀ\* xÎ×\X„ø u2¬wü¬¨@AGd¶FqJÚÁIVXg¤²Àþ&ûõÁ¬fö²@Í(²xǃ¸‚©{ò¡mSQËrþñTëÑt:[Ÿ¸~JZ¹ XŒ•ÂYÍÁb’ÉÖAHš5Ïâ1ˆ[°OéHõxP%p1Õî«gµ +`†^òB¼6Áu{”¹V +cuH„9”ï@¢>ò3Üg泓Y.l£T\^Šõ…Ø uX)¡r)—2ßüPŒ´äBã,õÁñ–ŽTŒãÂÓ¬¡† …C-«ËMŠI–èM1Ev|@’¥/êu%ÆÂG6G=†z +×MïguGR“euºž5j{D ‚BL>«q‹Ø=BžVzzh \ç“í´¾àÇrŽMáºl‡uןþïûußnJ&)ùÃÓ›&éC,ý$Õ t7¡ùýõRÝk¥¤.8Á +=(V` Èñ9cà7©Îi@…ÕÒ'g@aИÂr‚¸¬1jlª-òO5£|"êÐT |Ž5Eµ«µYŽd ¥(RRXn • ´:'(LXBJ–©“Èײ˜z å°{æ³MJ}Ãó¥ºk«dRi.GªðG ·×‹?”N¿ôã_b(©¾Ä•ŽC~M +³G +Ç‚Þ@מÙìy|'â5¨¨-„(öóð•è Å—Ûó‡3FQ‚œ ©ÁäÊ ²;g’ +5Ëq ¢B>?ÇòjPH©5±dœ“o‹µÛ$ËÖ‚ŠzŸY\p;à¡Á}פY¡~qÖ´~’­@€Ú´^ +5—"ólá·%æSÐÿ€ åŒÌÈPx€ÂDÚ '¶–FAµO8œ=šcuµ«i|uþ?9ÈŒ'Ù×áûÄÃÌvC2­¡*‰z*ðœ’`Õ>¨ûñ¡éÖX‡ú€#–´Æ˜Eß¾“Õ{–ÿ(ÎM}äȨ;X¬ž…|T*šno $¨ fd5.Ô„3/½Ä‹¿é¸óÿÍ“oür=ˆXǨã|tF"œ‚ÔE8áØ›ËÅIJqˆE|0ûÛPOAÞ +{Ìïq•Jeñ½'c^ûlä¢ðßPfõú(5žåPbAÞõiæËɇBõê¸T¯—:@Å–(gSý›Û>S-ì˜<=C5£ÖÉÞ`R\Ì®ŸJùryß<¾ëî¢"¥TN@?“”!J[ç(C‹„æ7ðý/÷òßí!òcë§›¥ºÛk¡v(G–ŽA¬ý† ÏbòUáä§›¤ú×KY-S +ᙣ¡H.´|±…ïyº“ÔVAßÊéš.fwšr„£×—Š'îl‘:ï–»í•;îº@ÉĤfÈâJ~Û Ô¥¤ê5KÄ%ÐQŠú)?fJåÕeRíÍ•âñO6º{ë5èeÀ.¼<ô¦zÙÖ:XÝOêò)£‘o(¨9YýU4Z›ÌîÑçA?AŠ+·—YÝÅrôí÷r‡˜ÿ ʰFMµ'¨II”[ËqÕãá—‘ï ' EwØ$Þåøšñ ¢ëÄ s)<ÇFN8:^ Î Û„ò#òPÑêÕAŽ]êwf5LQ+.˜”>PF³.¹h:Ö6™¿•믯VŠºœÕ‚îÙ¬žÕEä Pj§~ ˆEM·×‰5o-1ÄgªÛX­CP‚„ÎÇ;Y½¾AŠ=6ŽúûJìõºT÷ÆJÐÐCžŽµŠÈT¯c½äÚA¹žöר}„øç÷ÏUóNΠz=Õë F°{K}çÒáùT/ãk‰Ùörå©Å¤|„>Ñ"FÈ=÷ö+#_ùÊžqâÐnúη-"œ]ó`–‹‡²ØÎ ÿº_£UäD¸fÅg ; qEö°Mä6¤^xâãMb×Ý]bÛ§ÛH¡ï +—Mo®“ˆÙåL*ŸÝ_íS‡¿öõN¼·žì³âÜ"ìÑHG/,"¶š[+¤üg>¶dŒöG¹psøWµ Ï÷1 } !"k4Ôf¹Àt+ì-˜õN´ß]óæzmè?$²<œù.•ùvøERecöG4Dô „Çl +„/¨Ô-¢¼ËùZD%h5&å~Äø—Ìvªÿ@‹X-ŠÜÜÏÛH9â Ö#bƒÈjO(§ÂÖÈO&×L¤}:Ôö´ž¨‡ž×:C*=;_ªº²Ôä¿Øß‡ÊrÆÌ'¨žaÿ€jhV!' Ï¤LxiÖ,ùRøNÄä¬.7²Ü†TûÙ÷PŸÓÏÓ^bûL¨©Jµ·VQ?":×ù<âËÇ£Ø8cEuÑ"šfŠ#_{RüH- ñõU5dSØÏ‰„*x¦ ò˜~§EL-ïÍøŠš5Ú¤xùÎzCñÙE +Ë]¤tôHYM„žgÑð\"µTŸ^ +J™ÐñÅ6±áÚ*ÐLð³PF–*¯/åZlQʤ„Ý5ý*Úc@ÞÍòuì™ÁGJØúf>½YR©!90öÜ@‘ž¸ñ½ß¹ˆ¬¶%eY–AÑ>´ œ•@Ÿ5¿{t,õðoVëCR­|t¡fîûô<ÍAËæÃ3Gs:¶v¶æAuD? gGîrj"ôØ×­¡ú‹ˆö8пd9•Øvo»Ruc%‘ Ø5Ú¿ØÆ t‚¤õ?Ô©‰á.h<=xt8k´T毩?y8u4î7íkÅXÑçÐ8+\+%ŠÅnc³ìø°dòC”[4¾µAi}o;ùEäœèu‚ÞÕxs­xâöFä™PPÄ=…oN¼µÖ¤Dzl +í£µ;c•”¯­‘†¾v‡B?ü6öPŒiÌ——÷ÌWúî4 =Ñ©ƒßúßàÚïo&Z['RÅÙ…\ÛD‹Z¿ØB´V?ã¼…‡·¿Æ[‰51 Aô¡ˆ˜]Ò>¢E˜hê¿Ò"â^Ñ"’¬…€p ^‰0§|{Â,Î ­w¶I'?Ù"±¼“z•gÃPÍ™q|²Zra‘Øóí>ið'w¾÷Ï.èK+…gæÉÙÓ…áï€ÄF5/T±Q/á|û ŠfBñx:‘Þ0 u9úG¨ÕQÿ‚î‰ü=454u´!¶|hVØû„ò¬Ðôù)gp]j…w>±n<ìS«†›»î÷ѸìuÕ¸¹úi|¤ÚEÞ)t?Ü%Z(›£‡¥ãA&Š·¦z¢öúZœù‚ +‡“¬%VK㽫=w\ÅÆ7¨,¶Qï=½Æ‘öÿp–#Š®}Î\÷ƒRÿ·nD‹¨»º6ÃýA‹Hû‘8Ú@´ˆó+¡¶¯&–O@oMÇÖ³',×4d·L7à,òưÔQèµi9ƒF<e©¦ÔM"•zœ¹(˜_{%?eÔ“ïn‘?ØdÌïqÆýDÿT øµ´k.ÔŽõ-7V‹gŸûȃÏzìÙ'¦¡§ÔsKÆÑOZ¹úàè­ÚìWZ>ÛaªÙYüÎÀùŽ‹K ¥ý г'ò$íCW9 º£T{z‰xæ‘—|ëA°ñÆHÐ=\=5 ÓY¶Þ/öy˃ݹ®6Ý4íæO6B5*Ö´òËÐÿ7.XÍ–Qï„}Q®…Õ¦,WÏ>á¹Áo\@‹¡\,î›mÚŸèŸÉ96u±â¥D‹H¯™HuTõÐbô¼Ô¢öÙD‹(6Ñ"”on‚ÔôYîoHbõ@A3‘ÙXJjÃìûR÷}©÷Ñ~ªOzž¹`ÏDïøÆÿx7ãâ]ßûqîÇ[+˜TÅéœAçlçð÷¡šÞzw·ÒûÔU¨ÿh ®l‡ö„@ÝÁ^*jtôÒY¤œÄÞx/Öðæƒ`íéŸ]°„cï®Óº&Cµ&ê%Ú>R3ž|q^çL¨¬ ½/öÂÞÝY>è¾Ï“È£Z…ÅwçÕ˜l;#â袑I£àß Õt®X)jœAJÉØ;ÂÙ2œùaqQ†Êråµe†ü9ØBþK„6ìQb…ÝKœƒÏA~²ž_4Žzý‡sl”¤&VGŸ™¯ÔÝXÿGÐʳAcõkõURq†íJé•ÔWGßÄØñõAë圎é¨IЋÂyÿÔºÉñùãÔÌ*'RÇÿîˆ{Ë ?Ûg¼þEHÀ‡J/¿ÐcŸÊË]¯Al¢z ½ÐkÞX +b­Ð÷Í~8…î'»¤¦7*G/-QJ†çm{þ“Ñ£c‹ÇÒì¿Ð"xV¿Ò¾PqçlÍQOèÛ¾Øâ]dËE•Ù1™!–\\R4Qç‹:X­rr–üŠ8óxuV'om@Ì6”Œ,@î÷ª¿J5mÅÐB±ãó]jçýJ×ý}BÿWï„WÄ»ÓÏüþOâÝcïp“ÖúGÌI9¾æÌ¢B±øs‡ A©äì<œYPÊjžLö_óöJ9»{:ìþµ™8ðÜUª:³ˆèŽÅgç‚$ͧwä³'¡×‚³0BÆñIº$+ì™É,–#RúŸzÈ,WDÃÌqyÑYœé Ôcô3¥H–{ ›L2U£8¨ Ç®¯ >ó ¥Ê9¦3¨S³³:ƒÎèâ,cõÕ Ðù ì7`åPŠö©°¿‡½!ô(pVA-êv¦så ;`± +–G¥ÖN¢GÑQׂ9|jF|d·M½ZCAóLµòÌRœïAwDÎ [íà2ª~àÛ]tF!¦h Î⌠+õÛïmEÏêôäÛQc}•]Dgþà÷QÏÖ€jÁjœ]Ék™AkÄÉúk+APV +{Mï© ŽØpy%×÷`'×þÅ&áè¹BúñI8a"±ÿ'’Ó»ë‰*”]?ªúô»AÚA¦òÒ¾åöîÄ»k¨oºTìQ{ô‘‰@Yue9Hᆊ³KéLÎãì"ÖNù…|ÿOûä¡_½ä’+‹è| ÈZÈËÊG°ša /¤¤Ìê +¶7 ¡µ}TÔ”¨»3ONÆéo`ù r]Ðqr;¦cß{~bXÅ}Üc!*u4mÍéž=ZÔ>|"¨È'œ„ø²± z£N}”‹`¹tþ°³|ì³õÈ;äì¾›c ÇÒ~¼!Ê‚ò°˜L;•ÅCRЧóEÔ勵ƒº½Ôòó‹¨Þ¨¹ºŒ¨&8ÎîÿQœµbqõ (;Ì>ÔÚkk”ª«+po±g½z¢J ‰ýKô qÆ}þ¢¡¹Ôž)ó½´—žÇò )µlùQГ°× ­»¾šHè§cŸ«¸w‘Ëà¯ëo¬W®¬Agê'¶Í!^ùÎë{¶ tG9¹ÖAŒÍ±ÃkfyÌaeÄ´äzGz¯x?¬6€í¿ ·Í3ÊõÜß…¾ +½§<öÚ@†?Æì§ñÖz"d×^Yξ¶5·\# ¼ØÇ ¿Ø‹^¨X<8[*êwÆ9+ôz¸Ž/·È5·×P_š­ œ×C½Mynõ¹ÅØ+&r{ǧ[à`Û˜÷Àyö;–Ëåçè¼,ö°Ï‹žÎãÇ?Z/Œüä¦ï|´EN¬™À…ÓYIô±wõ.—_\¬duN'jKFÓôŠØX@û@Ù 47B{ÿ© ŽDyfþM­8µ„b?Õí3èû‘EvRD }Ðõð|[œEAMïa:Sk‰Þ’Î?Ö=c.&Ç– K·a)¿g¦XÿÁZáä—›°@&cu½¹ŽùXäÅ8›Kt:ì—esõ çR¤ºwט®Áñ©ˆ©ôšq©úæJ¡ùî&Pe©žg¾vs¢þEÝó¨.Eþ"«‰•£×–aOÑÔœZ–Zym…ÔôÑFÊY‘‡¥7N¦:'weåAè ³xI~!¿kìEªw(]Ô¿dvÏ®ëbCAÜ­ô1¡éÆZÚCÁõ®î_@=Aì aß=ã’žÙ”?±xÆ÷|¹Sh¹µö­bKíAAÃ>¿rìò*ôÓĆw×¶J´úÖ6Ù¯éêjøe¾ùiŠu,f1ûìÊiA I¨òâŠýCßÔ<Ý%– ÍÁÏ¢¨ïz¾{RBÝGkP¿pí¶ÈC/¼…¡ŸòO¶“Ý»ÜF¾óî6³6Âc•ÕÇëÑóVJN͇ÿAÌQ+ÞX&5\_E=P¨Ï<ñå;înŽÍ% +zU1Vï@wéûaßûÓn±á‹ ¸Žð8Ã*6|¼NH=î(fvN‘JÏÌz¿Ù£ <ó9ú˜ëB ‚=OäÃè:cP<\dK³*ùg窹ý³q†Œ¨@ wàL2|píU–G¼½šrŽÂ³ÎRѹ¹bõÕ%Ü öw‘³¦·:qI øì®)BÁéÙ\óuÜ™¿Îýê­;óoûõWÿÓ›ïßýùþzH¸ö›$œú›7ü·}üП÷K~Ô©7Ÿ…Þ{¯¾ÿ4F|ó{UøÉUjùt›Y×ct¦útv•]3Ð Ù:]$×¾½Zêyº×xê18rW9Ôw— ì½£UZ?ÙEäâ¤cŽÆœºÆ¨+ù·ÛÑŸQŽÝZ‡s|×Ãí QÍÉr{iø;Oqäg±ï×ýb÷7{°o‚ŒÈÏõ=ß%€Úûl'×r‡úÒÒ±·VÁòCßî‡o»žïØ™Zq~)õRé¼è¥%ðcø,•ž] 4Ü\%œø|#7ðݾïÙaèÙAeä™<ôÄH®ûëxèßàµs÷·ÂNþkoW²î{âNâ®3q‚vÓ½´ 'JB B‚{\wH°@\‘àî\â#™={}U+3÷ì{ÏùÎÝçyn÷³¦ÎtU½õJ­U¿?²k"µW];BféR÷:yHEšÊóÓ†`ñÝJxÖ7-êù ±°ìýº´ÏZô¼óõ°›܃ü[q^“1Û s;à÷ºqaA» ý°Ÿ"B«v¡åÛñ˜¶ý¼¬OÊda?-~ÞtJ\ØhŽrqNNf é`™Ýª¨VB*IèZ*ªì€(¡NCð°[@çbTl½ÒÒÌõTr—&}·8wcª»ÉäNeãõÆy–äÍ/ZdHév¤+ô{±•UgKhQfÏiÝx²Åcv½ÓòÊDTÒae{Q eó¨ªýBß§[Ðõ/’´®0mP­AQ׬‡õÓBÒ-s鑽÷.\ÍkÙÁ}ÀhbÏ¿cÄë¯b¼ô7S²ø«Vù3~-cNvv ¾¿Nu}t&ë†ÎÑ%#§QßIj«=DuM΂—ÃVäÓ1!ù|T$zÙzZò¬ÙÚ8¿Ñ\r³‰'ŽoÐ'µ¥R:4 ï9ˆÆ•y¶™JêVÝê42¹ÕB“z´„þ϶¢ZÑÄ#aµØ)x‘ÉŸ¹ÆžëáèÜñ+VÉ )|¢ót(>Rwz9ÔÝQ#º ‡¦ ºôó^3á³–c‚W=VÂÛ½‘9¦E$¶Änö«Ðwzyt~EÁ1ÄóÇ8xÞCêî#"öÎë%Éü>ý¸K(|Ð)6Y˜¼ª¸ |ToB¥÷ja)͇ðôUx¨ ›£BÞnGv‰lŒ¼Õ¯%¸Ù­‹Î× +²z‘mJ²›ÉÝ:u³I‹HíPA¾Nƒþ/©C³ÀÓÞ+ãCjüœq 2{D‡¼;`€çŽé÷>¹8Ô“Q ý|úAšxùAL¿:.,ì7Þ‡mÌë!…­Ñ£N3úQ—ˆÌïç¡5fþÃ/XÁCüé'’.úp +ýÓùE ¨î¾$ª®w4ySnkò¬üŒ8¯^BewP™C:è·ÑáE»Q,`ã +̈WÄ‚‚A1:ªEC_`v»Â„NêQç™YË™_š€Ô)ѹPãâR{É‹Zaþ ± `X"º×+guâìVRÖ©+Ì4¤3ui¿'?#µ+úFþRZ±—U /Úƒòáu8ÏC+öÓ{u…iïuÈÔAu~ÖgU,~ô/ýëa^Öwen)ƒó:˜SØÐ—E£Í‚ÑþxÓç³Dçg{jäƒ'9òÕ]<^l1ô@z²çnŒh¬%H8øÞ_Ò×lÒ_#=Þó*AÜRï ûQD¾ýb&(<)ªh½*yÝv^˜×%–ä6™˜ÖX›½.²7}\qNô Q‚g~ÖÄ»•·ûù’¦ãô½aœˆm<€ÖÿК± ³Ëú!®äV#fz¿ÞÒøn£Õ›dZ¯&láfŸ6™ÛÅt˜_5Ÿ¿j³Æò~×ÇÆÈg£AiÏ9AÑÀIêù°„|PúHúQ¯HTØaJ?h£©¬n=<£O]ÙÍ‘<®;†ì[ò¬æ” ·‹"ï‘·û ¹=¤èa»©ày)q÷‹.ž÷Á€¾×ƒ½|üñA¼‘E_,éòAº¦ïU9p–ª{‘ªï;O¼Q…ŠMÄËa!ñà=†?Á:dq‡ÕÚuIÐßác õ*^XãÞí?Õ}bqi­Õ“Wvâøf-*øñfþ½oÚøý¯zØëOþtŒägýªŠÅ ïå'~U&ëH2»pÓü†“’Ò²+ÆÕeîf•¥ž&EU¢—M§Å÷;„¬^#6W¹5¬ê4Æ9:}Tæ„{EŽ·–aqMû°Â_¸xÅWsrø“«èce h¼*Pðñ½ýË€¯àc›ýeä:56â%«>Ù%=Û™åS^s-æxß½(bì77ÑHGð±÷cM+¥¢¡®@qo‡?ÙÜgûÓ†z;nE¿·Ä2¿©áic*âWí6&%5.’']'o†Ž‘Ç êÙ€HTÙnoÒU$ªît¼í´Vt_—Õ_W58›4_Vv^¿n¶¾k¶µŸ§_÷Y‘oûÍD¯Z¡=ÖY‹‹«Î‰JêÏAŸglts@‰ïÿp/¶i'/÷Ÿš¼gŒQ6rLØÓê#¨ ‘Œ4„ÚoF:oˆÛÈî÷üª˜ò«þ0Á«~±Âê>Ÿ ßpŒ·ùŠ?6„Z <Š}ì"ëÞŸ'_J¨;Ã<ìÝv2äÍ6"²y/qûƒzOø¢ÍÊøu­­äU¤ ÎRœ×f,yØ`nœ×`J=îÑOßKðç4ýºËJXÜvVôªåŒèi÷ á“^s<ï›þhŒGÁøK¿î¶ÕÕ9 +›Ý$õ7LÊ"N¾ÏK´î¾x¼ÿaœåÈëáX£¯¨«ÎGXÝdO¾1¡+»ÏÑn&ƒï",†_EŸê¹—`Ó™w©51ζ9.ê|{rì©î¬(ã±¢j|È kúå4ïÑïhýGt!TAèš±‚Hy¯LféÒ·Fu‘oC± s{±‚›òa/U2~ܤ÷]ˆyO‘Ô´¹Äß²ïy´Eß›hAC‡VöÍÔð!£Ê÷~±šgá0Ñ@פ•¬Ðåî*QA‹¹yß›(ëžûI—ÚÓÓOt=J4n­ðEq¾ßI³Û„°ŸÞVÚš´ùIÞÔ] owpÅ÷»„ÈÏнí§{²b ÍÅ$TzGùUùG#´Ì4/, 1z$ul‘²6™Uå™_å™^éeÓ™-†vk9Py¢ç^Œx´>X4Ú`Ñÿ:Šj»Â+dô‰¬oÚXâÀAÊëézòÖç£&Ïš.ŠŸöÀ3þÐÀƒ+·ò"¶b/¾R’î?«¾qÇ{ŸÆ7„ ºÚþ‘N­ÁAõ>µnÒÜf§ˆ¢fûÐêv»à²†«a%uaUMö!õö!Õðumý•°ª*ÇðÂj爌j÷È jßX›¶´ãÑ7!±&ó§R¼åsü§ xøO>•û•O= +÷™ ²?p©”/š¢ì~’zð•T÷ÙŠ‡;‚ý]>tÿ{/ñhs¨ècm(96ä!øÔë'­ +3®—R]ýNü¿ññçïqaqÓiIGåuñhCˆÉè;©GSpr@ëÔ‹™·,ú_D‰‡Ë|-_ÄÈ‹;6p/úJWDLH£WT~ƒ“´¬ùJXI›}è›vûÐRøXÔr%´¨ùJèóLj8ïRëÝ£ÒkÜ£’k=¢|êb$‹ƒ9ÕŒ€Vµ‰ŸÍ¨ +Œ E…£fâæ¢ÒÎó&Už&me¦½Âwíç°¬1uü戺(«=î±—¶ÛŠJ`L~ýÙ\ÜÔìPçŸêÚ(M5í.“ +ŠºOáw~Óå'¶îò?kQO‡…‚ŽvKíÉ)§»ï%™ —A_Xm2R!úÒb1Xuµ#*1¡Ù-6¦Ù3Ѧ+3Y¶Ì':½Ì+Ê©%ÚWRRhݤ“ð·cã®ïÎ[ÆëüvýÛÖí¹©! 9A96Ý÷nZõDÓmµWµ5=›C3Ð8¡ãu½CÄÝFçˆôZ·ˆü&Lj²6û°Ô6çècƒy1Ä/ƒîÜ!æ„ÑÈ?­yß;üÛGW“ѧÁÎ ±õ7bâ«<#3ʼ"ë#£Ïµ&GžoM‰>Ù™%• •›>—ЇÚCÄïÛÅÝ~‚Ç¿XwÿÔ¼øÅÒ¼£:ò|GfêÙά„cïób̆_FZ =|è½ýz…ô~m:Öw?Ê|ä±Ô¨—9eÔ9~Œ|ßèp¬ïA¬{kD¶qKÑ5ÎFÏ0óëCÿ§+ ¯$Íå8'Í3LîØaTû»îw>ÕŸÚî×èe5pOjô+sÑ Ÿ1ÖbDz£ŒXo„èŽ2”Á8cnô…9oô¹Dmð¦¿5xãŸ?»t1"ýÈŽ ܇Œ6ñî»…¨¢óªIcƒïÉ®üDçÆÈ”ÈÚë‰5±WÛcSŃõ‚Öv7º¥×AØRï.n >ßv3ɵ!"ñj}lÂÝϨÇï\#ì[ã Ï~+­ 7,‰¶(ˆ±íLJõoñKuk +O<Ý“Cý6pìës ¶CßYn5XcÝ“gÛÓêëÓ⟠øØéG |r$ú¾:ðšsÃ2ÆPïÁøýÐØ…zÁ9Ku*U^ÿ·3Â_ꃮ×ùǤUxHaÜ“Þ-óúTDXwÜŒ°ê»AŽyÑ­CW©7-a?F·÷¹œèÍ‹÷j JÌ/u“¾®tŠ((uÊ}ç¿ë.}öÎUš^îmÙcìHY8Н~uþ±ÏÊ]¤ÅNaYÐgUÕ_ ï° ú2èë¼Züc°ß?¸êt1<£oÌ¥cý÷¢nµ¹Ä”u\}Úæ -hsˆ îðI~« ~«@ñÐt¼TÊýÕVï£bè±é•Q90oˆ®õŽEy¿ýÏSÆŠÂÒëÜ¢^Cÿö¼Ý>,·Û>4·×>œþÞvà çã޽t¶ºžü¼t%X=aX€¥@,†ÇJøü§É‹Á¶Å뀚šèˆeµ%rJ‡H°~ÎR°,‚µÌ[fË. '¬K'¯+¶‚ÕKwƒM›”Á® P»Q7ÿèKæ A#Àúÿ¸D¼c,ï>Ù˜ô•K³ÞyÅ”¼sWá^\íö¬Ü9"©Ö#:ºÚ'öz}@¢G}HBÒ;Ÿ˜ûì˜zHãʯńW^6~&Åû~¹LŽ »;¶‡Å4u\ií² †s(ÿ>â¡ÛÆpŽæü²õ¨ó¹ºWnÎ6pÉ_ X¾R7çóv‚?÷è>b”tcZÖ«ðN€µ+·Õ ×€• ÖÂ6Ì3À40LSá1 ¾RóÀJ¹ù`­ÂJ°mŸ8b&§rùÅtÕøñeZŒ6÷3s†÷ sÅxôeˆpxÀ_Ð>î)ìô öœx/æZC`\ü;ŸÈ´b/éíRO)ô‹‘%ÞQO*\¤o+ÂoUxDB,}Qê*}[â^RéžZãYç×ÙiÈ Ø„~î¹’ôËÈ…€Ó})ᆿ1§4J™=ê^o‹®ÈìPRÖ¯›·lš¦çdu¼³èzfÌÓcؾSþ²¹ÌÏ‚‘2Oé«iì ÿHi±¯4ºØ72ºüZdlÉõ¨ôïÈ[Å^‘ùE‘/‹Ý¤…ÅnOÞ¸GäÁ¹™[á&}Xæù®Ú1üF}@<ý¥ÏWð©Õÿ壻]WtÌ›Nƒ»íB£;\£0†‡O‚‹6B;œ ?úm“௒e[Æf<Ð/•ÿqCŸÿŸ7Y¶5è/QÌ“dæÀÇ™`¢ìLøj>X8g3غÇhø4,àÁ¸1θ@e)é 8Õu;6«È+²¤Ø5<ãgdV¹G$ô1á¯ÊœÃ¼ê‚bM‡ž†z×Ç!Û|\ê‘Wî*­ðŽ<Õ“)ø¥+€þ­ÝÏ¥=8®áý¥àðN×ÎoŒµFÔÛ¥»냕ÓçÃ6LfÿDø Ñó°Mó ÅÍ…ÏÐs™ÿÔšÿó&öî_Û-ïhì¦Âo>œ‹?9 TüºçkÞe~2cŽÓ}C>’Þú ó®'ºr¢.7ÅÆÚ7GżysYh“h cK¯G¡q,xãõºÄ•7äKŸ»E¶U¸D÷Õ8Eˆ>TøÃÏJ¿¡¹#Ìiþ7æŠN%£¥dhæÀú}Cm”ý«GÐåÿ곓ÖÕ« ÁV­Ëàˆ{Ã,Íæ(ñ±ÆáRURpÂk¿¨Ü·^ÑÏŠÝ¢žyÄ<-s{XîýªØ=ºôµGô›"÷Èr_©{]hLpµotPíõ¨Œ:XwÕ:KïV»F$U{Eñ¾0—´Þ0{5}îÏSµº*»më^°PvkƒSØ_ñ¿Ûœ,Ûÿr¬¢Çÿ³ ?,q"ü|;÷~ÌCö9zo2¼Oƒ^uXæÈ¯K5Àƃ§À^Ó4Y­VF ÿÔïl:ø80§Ì="¨Â/êtWF$ª‡mÚR£P^†êJ˜{EúÂÇ«M‘Ñ'zr¤èýœJ·ˆZ˜³·6Ù‡ýÈuíC›ÝcÍG +¤0¿©^´lÑÂÿß¾Ÿmëßï¡öÊýõÙvOd{f*ì¡©ð>‹½?<ê$÷W[§°óoÁìà§§€ÒÉûòZw™-Ø coÙõ ô|}z´ôÝ Ö϶¥F6y$T–¸E·À1l-sKè(õHî¨tMhªqŽ~óÎ-ÚgÔÓ÷¨„2Ÿ(½qF¼CY æÏP`çÖåþ§·¿Ûù_ÝP›¦ü5¦á}2ÛþYðcâÜÝ`Õ lR±»D‰2‡3˜eŸ+˶{ד^úFÝåýê­Gì»b÷„šb”ê +פ%î±…%n‘)%ÞRçÚˆHtxÔEÂø.®÷”Z ÜÑ­fô~Þ°óÜŽÞPŽýÍrÿ2¦2}6~: ÞçÈ,óå–Y2 à8)@Ÿ´Æø@A~˜5a-˜)·Ì™²,\pü¤ì”Ž¿•W-f¶ÑÃÅ.0o‘Âx€bB¤[mh´èCu€ñØ« Ó7¥ÐÇD>ƒ¾2†äkPN~ úÖ’ +'igÇ刻°æ´ïŒˆ2øÆXj¥½_PW ÊÍü¿Œ øO¾½þ;^ y:z%Ô&ÅÉëÀ™»ÀâyJ`‘Â~ 8X0w˜7c;˜7i˜;m+˜‹žOÝL‡·@¬ÝiögÉiä09}Ì «öûÖ ·BQn–ÿÒ;2ƾîRÏôÎbåî©Ãå^·†jÜoŽÖ»¥7¹¤tÖ;%TW»$¢ºK­–Ù;KîÿüÛ¢ö¡<—¢üJ0g‚"|5 Ž"Šü0~Ê.¾d˜?a#P˜´(LÙæMß .Õ«6ÂÜOË줓eöRe Î1øÌ˜ ߺľö‹|ðüZ\y‘{lM‰[lm©{Bm•Kly‰kli©[l~¹[d1ô§¯Ë]¢ÐûQ•ÞRõFõ§mªÿã¶üí7‘˜ÊzöI=ŸÌú‘)=Ÿ ÇQQ~5X Çi‰Ân°tÁn°hé°d&X¶† ­áƒEk¹@q‰&˜¿J,Ý@-z¡à s× •wÌ6Ñû—.á/ƒ"Ù¼¥ôFä“7)ÌÍ¢b*¼¤0ÏŒFµGn1Ì_`.VYéÙ\êYZæ Û(Õÿʘ8,»f—Œ­³ÿív!?9™õ Øç?|à98•ÍFfù² Á¢©Á¢9ÛÀ’…GÀº-b°aÿ°z·›?L\–L[Mÿ (ÎÝ +}ó&°`Î8ÿ€EsE…C`žÂ¶mK7š€¥kD`õ6k°I×ì¶È—;<0G¥€Ù¨VÁì5üÀ;Ö’í‹rЯ¼b‹ÝcZá85V;EöT»Ä£9×ÛìœÖÓà’ÒÓê˜ü®ÚÖ¾aêÍÌáu?ëümóG[;~(žÍ•]æÊÁ + Î+8çæÉ­€ï­3á΂‡Â¤5`þôͰm;Á‚E{¡}ªB›4‹wš€e{mÀ*5g°ÎÐl¢ãÁ&" ì0&{(ä×ùÊÕÌr¸â²]IrˆWix¸_i`D%̽`ÛUºD=1®ºÂ9ª§Ú9f Ö9¶§Î)¶¨Ô5úbc|„æ;æà¢Y‹ÿíqû{¾!"Õ<9E 8qlÓbhóàû3`Äžùã3Ù¥@qÊFèáØMÛýæn°dÁ°b5Öì:Ö±kµÜÁ:u7°Bù +X¦y,×ty`»ñMپݳTž2›8£ÌqÁ@©Ë…Šä@Ï¢ˆ°çn$6¼ðNnyë^Tä…j†àߨKíñ±%°Nh­qd×!…^_SÉeÖ-Z´íߎåØ\ åˆ0zM€±lÚJèû×Å «¡Ÿ_-r>k› +ð>Ovlß*°pÚ 0môð˜ýX0úÿ5º`åS°r«Xµã4X{ج5Œ«tÀ«û²û|š§¹Ï¬VocT`l-î}é}¶1-8ôM`äý—^Òº7îQ­°mUE®áϪœ"Þ7\ ýØì?Úé\Ó蔘Tåaô}Ðv‹Ðþÿ:f?ràÿxý·/ù‘ O£5 εyp ±Ç<¹å@qÖ6v¬—©CÔ‹¡.ß)Ë·SЧ‚%kuâbU ¸J (n7+”àœ3 +;OåÉí i›¡”Í,R®cvªÖ1û¸_þ8mÕž}÷Ì?<¾øZô1o`. m4º³Á9¡¿É)i¸Å)ùS‹cÒ`½kJ_3ZK’êt1œ5+÷ÿ[ã&÷/þñ‡ÿ˜ Û³é›ÀÊåª`ÕJذh…:ôÊ`ÁBè?îƒ>Î38×–.:–,>–)ª€¥«9`Ù¬ÞylÔt[±°íx¡ìNšÉ;B;§*=a–Jû¾X­„Ù©=Àp°OÆ=|¼ß†‡¿ +’Öy§—•¸F?}ëůþfÆyÁè=„õEÉ73º·Ûè±Öªbލ\/SPœ±ú¿mר6…Í‘—œÊfY(B/sà8-˜µ,ñxÝ+ð“–=X·Ï¬ÛÄ«WË ¿\2w 6WÀ«0°Ù©pÂßwwúUNÙåõnò¶ËO'ls~%¿Ç§fêÿÎé{|[§ïq.Ÿ¼×¾h’’WÝ µ'̵fæò]fJPçõfƒv3£­×Ê`ú=ŒP¿ƒðÇ™Ëv1(gAíÊ‚¹³k}X ‡ä5€xâ;¢à3Æñº¿XY`'³fÃáÿÆ.eÙ1C~}¾"̇ª€+4âF.Ø vlÅ}ÀfüØ& »NÝ–ÛÔ4óP6³LùŸzfZ=sù¿ƒ-söžÈ”Û&ô»%‘2¬oËv«žyÄ·KA5æËR'ÌN˜ŸÕû…1á}·¥?—yê 2‚£UËô#;6rCÊ6ùpUƒ…/¾'îÿaˆ¥ÿC•Îù§‘ðÑ7SúÙ'SAÁ°Xò¤ñ„¨¸ë<ºÞɰŒ1RÈÍ“ûïãZA3mîäU0×ß –¯äU?›€5ûNƒõZWÀž7Ø|ôØzøøy76lÖ7jÍ{`/ ³ÿâ“I®–MUKûsµV£®Û 3¦øço.V½wğʯñ¿~µÇ>}wÐëb裙¿nÖMجw‡ÙmPÍp9U É«cL±¶±³t{³ý¾ÑÝbøy´ùÀë(á‡Þ²yÌžWɈ±úï'éþn/φĺê«!^uAÑêIã«V¯ÜûoØ¥,ªÚ`îçl§Â´µ`É’½`Ý.#°SÛìýÀ <8á@xùåRæ'­ï ËŒ_~|æ†ÿZç`ôÏ/°ß¯ðþè°7ü9©õáhbxzß±þÆ‚ú8àe0À˜ ,^ªg1EÛ*h¢~ £Ë¯a, sþØÏu½½ÿˆ1"ûFÝNõ܉;Ö—{±=-ùTon¢!×P§ä©°—;D9­õlXÄMû¸GëRâ´µ›²uÚu› Çm¹â>°~ æ¹×Á>ë7òûýzg*¥0ŠÐööýÄú¿2úßKÝoŒH­ƒQR­avi2š¿3ǯ4GHsj\#bë<¤nAÂñ×h EÚžÖkfŸö#f÷ÑF‹ÓÁ˜ò˜sØØŽ¢¯Aôç÷× 1*†Æ§dUwíºZší£D×1âií*dø›B‡›KEgÂæ\ ×Y¿ë +ÇŒ‰ÌOÚ¤ç½U|‡LE=«ÀI›wrÁ’kÿÓZÐئ̳`Ž5k#X»Gv'É +êQ@þOã;_̸ßkî/ŒáGÆR¯ ú‚f7¬apýJÆ€ÛʘccŒƒQ?sšSÃІ/™£\iÏ®WÞ2Nêàn~Ýï–äÈÿcÏëaNéçü±—ë[°’—м‡Èþt”|êýRñ¨uêT}·‡Šúo-ª£ÖáÔû;ñ’ñâ`j¬Ý¾jXÂp8~‘Šœ³Ç'p.\šÈqõž©U¸F¿ŒÑ ´{Óí]NÜkyËuxB`hf?{ûGðÛßu0› ™˜™ƒ<Þ²_ß/½é°¦_õ˜Óe§E•ÕvFYcG°Û_5ñÌ>uâÖMÁÓ÷fDÑg3½—ŒŠÆ…¬i«6aëì½Í…1có6  ýdT_ÍÒ¨gTô>0£OÌyýQÆúkÆ]âóWâ븧>ô :W³çìWÑ{ì†6å¶—»žëÊLµïˆM¶.Œ">Œ¹sênƇ­z¾o—h,¦h'ž5ªEæð±˜Æ=˜KÜBÚ;y¹È/m=[}È8³…””V]1©.ó–¼l>#(è rºyxf¿[µ‡ïwµÞÅÈéè|Û¼ 3صƒ½¡±\0{Xþ“:جgÙÜ›¤ñ€ùYgˆ!a}y­ÑéŽ1´þ#à61&÷ÿ¡¤oé,¯£oŽªóÏ艬Ù)‡éæî)ëÑU‡é€G[ õy`ߪÅ@iíp›-µ}-Ú-|Ór’|ÖGó£‹wýg±×ŸçŒè³×DŸržBšÛOD,YArŸ¦ e@‹ +{µ“LPÝí ©†K²ŽóxÆoxØ›-üü/ºDɸ%Ù:lËég,´êUåUsK—ÛüÅÑà!£ÌØÎMÿ¼ŸóÑ4Êþ~ÄÈ.nΡC*`ÛÊÅ`ç’%;ª ÌΜ›juÕy¾…ÓµÅhŸ˜QþgMò]Ï Q]ÿñ/<~þ/ºü»¿jb×cNþsñÐŒõDn;‡½Fóå¹Qîš|ÿ×뉫é 1sç‰|s[yìÄyyvßKÖÇäií9ã¢;üåÅ‹ªÜÎ x²Ž“6¾×0qd»®[á5‘«ìv Xcó⟕ÁjUS°Û,LF5¸IQ+Ù¢ý–9¢]‡Ðï§­×ò¼§ }1rª¡û­F!Ù«ŒR—q#î¯å¤5ïæd)ñƒ^mÂR¶1 +ô•¤…¤óíe¤Ã¥äÿGÕu€æ¡#€§ ã DbSYLb*KzÄ-áÇ”ìàÇïä'ï&bïÂÞîÁ3†Õ©‡=4ñ¢WÀ^Wy#~åž¼ŒÈÓ?kr›â`þŒ•@a2¬`ºq;¨º–ÌÖì`4t‡ŠøüÁƒýÕ•÷–¡Œî0ª\—¸yFÇa_ÚzÏÀžýDx¥,ƒ~`yÆ{:b +¨h­=û€¡²&P§Ø½B,;Î#k‰}øB‡ŽÂÏ ß =ã—â±Õ{ð Â¤_Þêzþaz§®yfƒ˜Ž®V¢ƒç£=dÀ½ DZŸßtˆ}¶Ëø .Îé%EC’Ž£»ªb)KøñÕ»ðgã”qG…¯ÉØ;)ý­Íÿ¹Âû•±…ñìŒNƒë0ûu.çÌVá˜mÑqƒø¶ÍTûàUAMŸùô+]Œž£¡¬¸ž3¦ÅKªÛà {»‰“6¸—[Èhqó Üïôïü¹Wÿ6³[«˜QÒe uaDÚãŒn+£¯_Îè¾fôŒ*šóŠÑÓ~¶Òà¬ëDCs9#³³rº:ÚàÀO+€Ú¾}@—c »‰Ôy×鈡‰tD¾Ïìâä/(§Ô%8ì[Â÷æ*–â›¶^ìì¯Hõ˜NÙGÏÇRšâÉ]‡IŸ[+I׸E¤[Ô" úBñ«ÚÓfU/}ˆ—ý"ìZîj¾CÈ\ÂûáZÑÓ. q}­ºRR^î@æŽòù)HŸ;«ÉKás±€¹% ÿìŒò"gÌ!-§§s4m²¦jÛÌÒº˜5]ç!³‡÷¹Œ®åãÕ3æ†n™ ŽêMØ&M ~@¨80‡)ÔíCAN—HïPÁιNåò%íIç 9ë4íE£nµèß­±ûp=SW"v³CÍ9<àö:ââ™ø•à¹dPÁOhÿ‰8µÍí= sÚ9âç5Ç„…íbqA‹1ªKÆ÷Æ’zQiãšèšOayóEÞýß´xi=JxÈÓŸ°ðÇ?ó ¾ê•üÔܪ—13ìcLá¸èÜgv·®Õ7÷WVæm®Š/Ëñl#gkê Áá}ê@ï¨h«è•Í»öaZ4‚³²ZÚ†@õÐÑ4|„s9Óó3M™5¢ƒ‡?ÚBºÅ/¡¯„ϧS–ŽñÐ߯/¯§¯@ów{T/î3–6Å}âñnUçg~PægV# ‘tY÷9AQ÷iþíojØE¿™ä%ÛÍ¥¼ÄÖ}äË!‰¸³áÚ‰þG t‹;÷Ã1|ÎhFl6p)TT3<tÉs²†—“f0ÚüÀgë Eçdyæò˜Éå \⤬ª’*œÛ€2ÌG[¿ÙXf¿*š7†´± bf n1ef3Ab0Oô|— ­î(‘Z­‚¥5¡nvE Éý1?gP¸–µ’t‰^Hy¥¯@{½ÐþxúÆÍ5ˆÏc^úÒéL[vü¹öŒ$³Š"aƈ!ðb3yãå&üÖ˜*ù¤OÀOí>„Ýý¤ç y§Ðy¸kìBžSÒ|®oî +NXùŽ}†‚Žä²¬~FFOä Ç!leõ¹2˜mÔ\ޅЙªÊ†`õ$0ÖMÛæ.ê5€ºÒ!` Ça9ÄÌDŸ’cuqÎ]Ÿ-´<-OÀ¶"ýÉŸ™ˆ»%>ï>SpÎi:Ú3Lg6ê‹ ëÌE¹]<ìíVÌ!i.}·ƒ—9ªBxß_´º¸¢Ó²8´Uaa™(¯KLÜú¨‰ú/ÚFz¤-#®„(P×sÖ"v þhÔˆSø‹¦QÞM£üoF9Ÿðýï¯æyÝ]ÆwŒŸõ™†ÆEéq…í͇¶¾€ð-\_òŸ‰ì÷É]ö•ò_¨ó0]Ž`B;9Ò-m)תDÅwª n6â±<¡¼»3ª…öv‘ñuñ[íªxf§:Ú/N@ŸBº%-¥.‡(—ƒæW¥ó°Hç³ÆTøIûnª`G¹ø› ùb@L¼6¡‹zá…£|ÞýïZijQ!ïίj¸µ÷4ÚT†krNíß"²>鈟µœ4®}ç.©¬v&_ ‹¹ÿÔâ?f 9ïÖjóÍŠkÁÏ3VÀÇ¥@KŸ¼W'òO^hd~nnyy"_ri‚Šš&8ý瑽J¬~Ñ&iã:gj%‹b…à¬ÝT‘íµ¹¬fÔ‰+Shó³ÖvS+AÝÆ嶉ȼ~#Ü'n)a8—ŸÞ¢DÞÐF\CòrÀSˆ"™Þ¢.~Zne^öÌýDÃp“—ÕÉ[£Úhíq5)mÚG>ÜD]K]I„½ÞNån‚yÂ&^ög^TÅ6#‡È¹<÷ŒÅÜ€Wkøcç¨kÂza÷Aph¯:PU: + x2hŸ%ï´Ï”Ýë·€5Sçµ3ÀæÙKÁa˜ üÊØ-y•0$Ú“'¾ñh [ØØ'g“Àäì&”äÔ–Eˆ´0.zÏz„/¡#í"SÞÁRêÂ\z ~\ýn~Þ':wˆàßê:ŒtÈó~³îöl+žÐrOj9HÝ>ÊÎõ Üäõ›«ðèê=Ô½n#òA7†Æ–|ÓgJw[OH•pϬeüÓžS8Ä)Ym-h©pqîO¸M&·Ì&œÒ#naå2‰Cž€¾ãŒ,q!|´…å¤'<‚Š·¢}+dö˜å›·?í2?ï5tK…ñ<æƒQ È+Ò>2¨àg<©æ ™Ò©FÞéÓ£î¾çYƒš,oûþ€!ù`öi`)‡°ˆ—[x9£*hªeÑ5ßä‹Q ÿæøa^Ä»-¼´/Ñï'ì½gag¦þù°Ì1UüÖ¸âfâ¹ëqßë0iùv^Ú ÷Î7e¾]ì\mCS°kÃv°eÞj°oí6ppûN ¡¡tô ÆQÛ`~¬kD]CÕ‣º\À5?+‡Ù‡ÏEìAä_ÐmÄZD¬?Š0—ÅyÐ÷à–²¬~\ôÛ½tj‡‘Ö©Š˜Ý¸Û4Ò?k-u»ÃP|¯Nˆl—òÍ\C»Æ.FL,ÁfLXØ"t‰È{C<óƒ&žõYí #â >¸‡."üo­á'”ï&ï žõXðïý¦Í |½ ¬ÞÌMÞg”:¢Ä÷¹³‚ká$Ïœ“ÕÅ,d¸f—'à6!3y''رl[¾Ü£´•õ¡ß䤉Øð¢ë·7Š“Êµ„15GîâÐ!^!“# X=L×ðEh¯?â¾ün®GûHaXN:KIÏÄeXRÇAâóA‹}¾…º§HÂñâ)»€¹ìž<çØÅl~Qºƒå +úlÂ#_n'Ÿm%}rV¾÷×òoõÁó† ɼA.~ó³:~= âeð$çå8äqYžÉ• ø)ßiFH·Aý³ç4ÄÔã›\‘Gœ=Ä$Ž»O¦œ“—P¾ñèæ½È¾óæËÉó³ˆs¾3 kשøiÇɈIyÝ[ƒ%´`÷ ‡>Þ‚%W@{+aü3Ö[ +ÚÄ’Wugo[ŽyCFXLå. +Æ~,øñ&´7í_#ßöšór¾¨ò“ùÃgcéKù™_UøÙ£j(ß¶©ÆÏú¬†X`رóòhMƒ#²e9-±Õ»x)Íû—´ÅF&öÔéC›ƒG¡]ò€!Ÿ|‘¹,f kK÷é„ÃTÞ±ó%Ëx±°“'ì#æÑþO7#¦âºJ숎ÙO6>veж³Ÿ"qO[MÅUD¬'ÄÆ œc ߬ÕxZÛ2¥I…ÊêÒEû\é€ÛOHkWÞi⓹<~Ö°*ïî'5âÉ),i?#|Ùqœº3Àágµ©P×3×P® ñÐüŸ°{ã:ìÞå'ƒ",ïXw4íäÛ…ÏÁí"æâ©£G°ôe"²|7æ—¿ŽpI\Ä¿öp5v9FAUÕìÛºhÖHÇi}ñùðƾÄR–e~xg°ŒNò´Ý$ÄLeíúM*ê`‘;qçÔEh] ³R  ÏLí<Œr<¾ñÚ?ŽxþˆÉÁ¹ff-‡_ Q@kXZÏaBZ¶ ?æ9YW[ë - ¯'ôE¿ÙôõôÕˆMI{¦¯€}¹€¾1õ1ÿ´Ód¾ñ¥ <ó3rH³ƒˆ¯SBZ=ˆ $ Èþ‰}¾±uï“e\»¥­@ìQ–¥ c?®d?­ýœJdÔ“Tlñ~"±ú àf£®8»™O§×h“7ë5ɬ¡£Äý~Cúi¯± ¡ÑAÒUá/i~ç…öß›½²§ Û„Èç’ÎQ áÜÝMÞÖG{q‰»ßõøÎÙ‹4µ pdŸ2À¬ý§“)ýjTf¿â‹án©‹1ß‚µ˜mô\”‹j©!ÍVc€ø6,7Ò'k=«Çhé4Ip.`6«õpUº1å‘®ÒÃC±NRX~Lp¯‰¸0¤Ù1ø¾ÏlÄD'nèò3†UÛ iهƱèfyÖ•ç®Í$Ý’—0ÎÂú‚‚¾‚t”. ¯Ï##àn°>² žCÚ†Ì%/…Μñ˜NœóžAÀŒtq‘n«*:#KÙ‡ÍCû[ñôQU<½Gq~ÚÐa,àÅÞIïÉêª\pèçý@ÖˆéÄÆÍs^Óõ‘±ø¬,×ìâ=Ž9ô›æ€2·ŸˆØS±ouãŠ4XvÚ)Ïiˆ…tKCŸ²Gœ´„â¶øA­Äìaå):ìÉvÄ¥CL%<öÍ.2oŒGææso}V"½óÖ †=sÊðçÛ)ÛP#‘¥ Êõ(Ÿ»kPœEu5ßìÌÄöÇ/\Ÿø¥ Ùü3.ÐgzL£¬¡¯³ó›+@¼É+± ±cvò0b4@œdVc ÚÒ±Bk8b Á8ôCã4n)Ò1 í·7¾['aÙov¡9ŠÅ¾Ýb¹àE§™ ¬ë,Ú§‡jxÄq%ML¡/;)GÚ…Ãø˜¼”<8 ­U1 P ™Ë¨Ò6ìšÊ€gqYž/¶‘Óµ«úQ.Ì¥a)<Áêos1SÄäFüiÄ/EìÂü¢<Ÿ8&K˜]ØÍ#ýïm@>q›ˆÈŠ=â»ÍñíNRø`3Ë.ôŠ_AÜîÓ<é6&žýBå2ZÄõ‡ëظƒôÉbâÇ/Êësyé΢}õHŽwÌa¢¶ ¿Èê”Á<€r …1Ýe*Òæ$,OO@\LV¯ÚbBqø@šš 8mÌÖk6uÎ%—¸%H±‹„Áy[X.3Ì¡)3y–WT°Mx âr!Í*êÄÙ‰ˆSGž; ¼û3âþÐ7t™.:}6ÒëFúDb…•V¯Žr3Ä eu³]£— ¦0·M(yÚpRx¿…"âÊ÷£9Œ´ pØ—H71SÉ+áóHkŸi˜Å%y¤•AÛ†³›ÈÆÐ¼äÒf2øIû‰¬–WÊJò‚ÏLž ÌO ¿Cì_Özl,· U@¬w‘GöVoÆ3v)Ò}b5]QûaÝ‚XéH«‹cÒÛ"/ܘE^W`5 Ü’–‰®ÝÛÈò¤Ð:gDá6AZ–(£‰+LnÔ¢¤Ïv"»À3GñœŒ)ÚO%W©¢zP˜Ùmˆ§µ+ÓNq°ŸÂç!M,±ížõI 1'øIˆëÙ«.ñKÐoÓÑЂó‰ä)ïiøI·)FÂ3²¸•ýDü4ê ;y ku°oýp`Ë^ ©Š¸œf2\ÓÓr„]Ø\òÆÝµ¤màĉG,UVGØÎw®È)i÷ÍAzæC!@Ü'VŸ ñ© E×£ ˜‡ØBtJƒ:b1³¾é¼Ót,©F‰åÿ¼6%Ÿ|âñ=JHsŒ´ñŸ 熬¬½ Œ€lHïRÇ"^oE~R[GrÒ»bÇÀ.hÒbuœ&³ÄTñŽpà ÌdË›eDŸuœNÛ\ž‚›^’g™òÐÒñ%‡Ä‰oÔ!·!»&­.Ê#>]v€JªPFÜ/Ú9h›kÅ”ì'R*!±[Ø‘Wò*¤ öÏÛŒX‡D\ÉQV#Èì×&/\›‰™žÀêœû$¬gÿŒt©Ìa]2{Xõéª,‹ÉçöZê„ÏTê”ËTÎ?Ä•¦Ÿn!âÛ ª÷!VÒQCc†ÖÒ›ˆÊx¯ÍjžBC9%.¦\R–°ùzЋ­tB—Š ¥G[œÒ¡/NiÑ'“k -D¡}à<Ú3ub"ŽºžñI·ôelÎáWøY±Wô^CÖ£+Nk䘤×ó„7ô?Îå­B¸åb×ÐŰ‚TJ…š ±ZÚæ>6'ƒ¹ éskŒu›XžÞß™H“Hj;LeŽêÑÙÃhÝ­“"4铺‚û硟¾~{ZŸ!]r–cg®O#lÃçâ63ðãW&r(SÕÃàÐAe€Î âÇd–;b‘Éí*ˆãËö¬k¹< +–ÖòH£Böj«v)`.«M ç9ê Qz>õn¿À5j1âÈÓ½f²ëž 0ïr›)<{e*|¾œåõåŽpȇÃïö'uÒ!db2r„'alû¡sH^ +˜8éÔõ¼ È7 íDÄ¥§­ÎÈ;G.•¸&­”¸F-C5a†ü¸±Œž¾ÀhÄcDqñ¶‹ñ† Ësò,òzö:aôÛƒtlÅ!¤ËŠ˜£¬H®*ÒæäѼGkN¢‚djª(³kœÙH +“ê5‰¸ÊH³•Ëß‚Xw´×5¬îÕµ›„éýz‚ì÷\òæGM<µçí“»Ž]?¾–½†åÛåts$µ–¢íÆDHÑVö<ÆùÐÙ¸Íõé¨Ö5‚5 Ò]çÐÇe‘¾$UÀŸåH"Íhw<꘬þQ>Ë;FÚ*ˆ_((Ø.ñ¾µž¾ä?Ghã7[軈JlR¥4¥ÂÞí9„(²,d_ïú‚ûL¤qFÿ¥…Güì~Wô¨Å‚eª¹'/û[; åQ„èô‡Ör´ bŠÆ)¢öŠ“–‹/‡)"ªÄ9zâÁ¢XËjnÀx‹¸ø¬ÞŸ9‚ðwûD MZÆñ ºÂØjVËûœÏL‰Cäb±_ÁV¤ñe|il\žÂê`Ãß%¶ÿÁâ¦B²7Ñ÷š¹Â7u'$¯*Î"·Žª.0Ô'~°¸ÓªµÄµFÂ[MxjÙA–ÅjÊ”eXCïDÌATˆ.¸ÍÄÍ`nó_V{ÖŒ7ˆM/öJ[‹b=â’7ò×Ö~Óùævò¨îAú%BœUB·Û«XËk·7 \1‹Ø<"8ÿ'ԇȶøôY¤Ë‡ì_”Ш)Il×ùnFù/F[ʦ2$ŠHó +i5À¸L†°uàbð\ĸ„ý=éŠa%´ë‰|ŸnEut Å1\pB–2='/ºè9‹epF=Û#NjÒ1N©3DÌ]ÄyFzGx:ôg‘»Y]§¤%ˆL$v&ÂÞí }®'ƒ^Ú*o#å—¿ ¿Õ¦"~Zmeþò¥­øYõqÞqu"ôåV2¸du5‘õ±Hs§£Ü“–¡u=¤€øwH»ƒJëÖ@º':šº@[úU óP™¿õæÄ63I«³ò(.²ºYçæ ­´þÎjœpœ‚æè¢Û,A Œƒˆ±Š¸Ü¬vô_© ÚÂì&bðQ™ïu±˜Ç í¬ãžSùæ¶¶,FŸ–èS²ˆÇ->ë5S|ÂmÒ8a™²fvi–ië6e*ßÈ\+@|n¤aç3ép#Ir³ÒXaµm|f²º…žkm曜q™‰4U„7ÒÖþÍâúf¬Ç³»µ%OÊ™T¼q¦v“Èft5¸à‡NSÌB¤ IJ¸ýîm`õ°‘¸Ù©-ÈiçßjåÓ©ï5)£Yí,³Y!ÇØÅH; [°ÚY¢ÑÎÂr>¨£úß2ÔÇÙ\é‡v–7«ÀjÛ\t™´)Xmx–K›¾ñŸ‘íý­%ŠoÕ$wj°v ç8²–Å m!­yôÒj¸4åÓB”è7ÑÇ\¦Ð–Ž“¾¼8®ICÒ­…tˆcèû§eù”… «ß‚4Ã}³Ö#Ãrs~¦#ží&5h"®.Ö­db»2Œy,wû߸óKþw>½_K\Ðin^òÚU”Ñ¡ïmb× ‘΃WÆ +Â6l.»®X°™Œz³­…ó,/M@¬cÌËQ\§µpИ£ë­PÎÉê#\¤‰(²’å‹,Ø\es?7é"±z5HÚââD¡5´›ËAóû\˜ÑiÀjgyþý[;ËigÁüÎÆm†È=z)bÆŠ`ÜûK;‹:í=ó` ´…,%†ÿ/c39ÚÜZ±–) ´Í“È^æ²úx0ޱk"}fá'NN@úLˆéÍr¯£^íaYÜHg ÆitŸ½6éÕ;†.ÝÈÞ(ˆ(ÚO#·_ö¤%Êhä Ë"aÎtÆkšàÄ7«?W§Ärf‘æ3â\£ß”»1kÑõh¬~¯õÕ)?Ö¯°’S®Ó‘v”è¬ã´ÚYá˨¬=´>HÛ!í, àrž‰Ý$¤Ó…λ!½0‡DÖ—§þ¥µig±¼Ò¿µ³,'Kœ’— C_î–xä¬ÁxÆrøOºOeu»â³Š~óŽ¥ØMº ±ôÅŽÐÂqžðœÆÚw諽èû0Îúñ}·ßwJ]†˜ÕȾ©³ÐV/_›#¾‘¾Þ8©Z×4¡Á­›Òþwžø›;»ƒ÷Ÿ¹ó­jˆ;/y‚®½è¢˜†44EN K…né+°c—'¢5 ìäÿÇÞ[†ÅµmÛ¢âF’µ’âî¶’%q#Á«¦WÁ‚Iîî…;!@ÜÝ] ’`q—¥[ŽðF$ûì}νß{÷ûîû—™¯UÅœsôÑ{ë}ŒÞšÁ+ubþðT®²ut‰P_´ ¸Ú2Ð97Ù `6®^Gµ³,YKÁýC;k jDˆ‰&ÆjÆxµ9‰/öÚˆO*;¿ž*‡€^*Gß^’WÑÞ¯'|4´¸©>uHö7rXþ(øOÞͯâ=Õ» ÷VÈ»¸?”ŸÞ+qp«L°>ñSeÍéERÚRÒþ©T³-ºp4·³i öÞ V +.na{ê Ž|&ôÍ„’¦åÀ¤¨JŽ¡z²KHoì¡ÚXQ•cPo¡Ú¿!•£8¯øþJ·nTˉÄL#¿hg•5­+ï¯C-å‹vâ­ä•>ö,$^´³ —ŒÜì¿´³"º´³Ô$ß·r醸¢Þž:T´ÝÞsþòÖ”AÀ@𹪈ü羽™¿f„:(}ñÃ;D¿T{‹¼ßÒ;Mïßú?¿y¼]6œÛT³XCsy±ªôòJËØ=S¥À}ð>Cï™jÁƘÈí|»F¬ymYhÇB¾ŸÄNÔ¸‚³ó¥ø»t×=»A+ú¨bÍËH)2&¢¶‘…Ę +öZÈQÏ6¶hb ÄgðWæKŠn±}ÍL­£³ÑØœáÔ:ª€$}uTñè #/§Ú¦ˆ;±û'£v@µ`c÷M‡=ö gUî}½^Ⱥ8zóÐÎ2Æ^IÁRÚY +N`8hg‡¢ÚYëÉß#h¿«¼’ËÛ#Xºøö¶rŒì FÑÖ½;oë¦+m!ñÚ]Ä'‹ ;ÆCj´v]³¢†Ÿ…¢Û?AßUòÉÖW‡V@£B,¿·8ëÀTàæ¦ú„ñ%c¹ò†åˆ-T#!–àŽ°â‘‚¹FèrTÖ¼U·B¬©rímå›=Â2äõ‰5“U5õ +õžfIªî0eÁ\ظˆjgQýö=•…W©v_pw ÕÎ +.€v–ÎÌEÙM[Ý9 +\ÝT›:¾–jg© Ÿ í¬ˆ.í,Õ?kg¹}ÑÎÚÞƒ³tÔQò$·” næ…v|hñ(ð{C˜Z`*ïX2?³¿…¶}?É;Dò~+'%k«]*`ªûƒ÷'›FÐÔ ¸¤‹ç¸z¼Lî¥äÚ›ê“9zõ€æ·˜?‚͹:ßýrƒ¢¬õè*­t°¿œ%äj4OpõêÉZÛèl\/1æ,ÉÉí‚zà5ƦJÆB½I[ôO‚:"âò7|.jÐVÚü”7BH92zÐæÞ°FÁlX¯`€·yGoâ3Gȉµ“¡åKq%‰Û"üIñ¹$—}3¨æö[)«Ú–‹;Û7Rí,p¤»øö²ø‡v–Ïgí,¯^jªµo¦”qf¾¼-v€…ÂZ ç½m¬•ª²†Ë©{¦[F•·ÜAõ­i>3œò±Þ\Bõ +H‚. 岇^Õ&Ï.ú§ìµ{<â _xëG±¬a5Wrëg¶àÒBhÀÓZöçÐ\¦Ì×%d .yì{”ŽN‡.©¼³ÙXÔœ]`é=˜·qé¦v +Ð#ùÚH!ÿöÀ`Ée»ô%»´³8ªÕü³Xõ|ƒ´«Ý {‘P- ÷°>¬}ps]¥cDÏ/ÚY¨/As€ê+Å•OSöÏÃÓ¿¥ñ=¼Ð@Hß;MÊ:7_•ph:´+%÷à>Ø+†9Žº‰*¬Ô€Ï91·KŸãÜ|ªSd€×"vHÐãJ96[pª’>¾XÂû79vƒþtî…‚3‹øÒËP_£kîÐ Ë ¾W3\Þ–1„j8»„S­{ux‰˜P1ër—”¸§|L…ïÐË‚·ÓVXÚj#vRü N¿”!ÖðŒ™ù&-ÞÆ¿»Ê5¶ò[U@úphžÀ' i§É•Œ(2Ö*6õ„ÏdfJòu±mNÅ@ÃucèÑ ®A1Õ9 ÔSŒ„vr>1´t47Äèê±è1¡u¦ˆ]ãxØ+ê—nÁz¢Ghà0ªClIJ>0 ëTã}Kx_ÞÖ‡â}`0)æÐ$>ïÖÔD¤èʱÐüFü扃¶î+òQê#òFB³šö¹d^[@õ‚ü’©ªÊ7i(Õ`&c*f’¸Mr4à}ªc\]nÀ“{Os#èáú‘ë$vúYÓ½¯vx:jò¡G²êPƒš¯h\!Xné¦0¬_QšÐ¬o¨ÆtÞ€Ã\#ûÐzÂ?igñÙæÑ¼-¼`¤˜qb𸢤i1òw…½_wÁø¼O¡>´Ò¤ØÏZœ$ï#óx´ðE;+ªt ´Ì©üóTc]ŽÜ9®ës+¾ƒ=Ð\:Ôɵ“„ŒÃ3ø‚‹‹ˆ-²/PÌBkVÉ»¦à3¨6\ ±{ò÷€¨oƒî™£| +Éå+š–Jû›Xvÿ³ ÊÒº%Øc‡5w9éÄLºoÒ7´¿¸ÿ¾…õ‰›NöÇO»Û¸a¯®n0ãvÔ¯ ùÐrœ3|‘\2ŠŒ%¹rïã*'`¯›àÒSŠÙ?‘æÌ—H~Yúj'mŽ`jªa¾Ãº[<±ظ‚wÔV(, 6´`,ÌÕ gï×ø×Åå]_€ºÉ'{X(UZTË“ü-)®rô­°‰j%ŸžÉæÞYÍhÊÑ>’Ë¢Å;¸èBk ÷SJ=9‹O92 µ|ÄhÞ1¸—RåÑ :ÊXC—bL¢ú(t­šTE£¡³†Ú6zÉÄŒ ó±fE5QÄ]Äž˜*Gí™jUX™ößš‹]Ø’Î£š‰ª¤#3`÷t¬Qo‚WDáw¨]‹•͆ÄÏ<ÃúŠŽ½øMžº’wæPìëá÷>1Vx$I;™ð ?PÍÔ¨îô±Ù|ÉŸ„¢;?Ëqµ“¨¦94o 棘5ùÀì/„Âò¾…Ÿsf»³m¥²àƬïb½™ö:ºDõ¦1)ißTøy`)É7j Å)A9ߨ"K èšñïlÁÅÊœS³p ³Ž|ÞBrÕ†~ÕT!q…ú¼˜ìa™DuƒpÝ?ÒAæ=Ÿ²o2Oð9É[æO˜ Ä?Ê9öÀycï_ݾ€,êÖÅõ?òšKó0¿øÄãø²–Øë)ï{Äñ™—çS_˜®ÌŠÏ¥>†Œ%ö^Bï ûhÜCí +yÉÍåð©tmÚÚNy/b,>Ÿ³sÓÅž Ô¡SÄ[mÕµ0·ìÒD ÈM\ÖÆ8{§nF†ë ¦•q+± ¬1û¤ îÒ3?9SJÚ;5T¬A3Jžý¨&‰ÑÀH87UÌ®IRöù…¨ÏH1ÄþÈùɱ‡§¾YC±'‚w Ö“|¡cI>þ+¨èÄI ZönA½Q¿³Î-€æÕ‚Ö´áò†#ϦëÈÁd|¡A½¼Œƒ3€G¨n54Û£«Æ‘…ês`í¾œjñ”Ü^í"¼‡æ{ÈU‰ÝA‚-mû™-nú>OJ"XºJˆµi‡f°­ËåÚ& èÄ`­žj}mOD÷ž Öˆ=@ û& 1×Bß?Ã?Aw¹¢é'EÉïYÍŹtMLJÄØ™c]úÆ…ßÒu@Ô#°w80gDF.üû”%7(vckÆ+m|uª­:È% [ÌM8> ÄÍ0‘àOû­j'ÈášoéZ™æø¾ôöÏ‚æÒ"¬Ós6AÝM'-åfË¢ª ”…7áóézM±‡Ð’o1Ç„èlú¾ÉÊÒ[K”×*ó®ÌG/*ïØ ú˜¼«o/)®jՇÒðÚ±¢‰¡®á½eßÜaÐ*” ¥Mð¨\E|èþi°I’sõÁÚü ô¦$w¿ÞüÖØ~’wò`1¢’ø¨’‘´ÎGr&šo÷áA_Údƒ9cf¡d€£‘› ßÅ}NÂz«@lVØâ׋Ú64¦É=“"J¿Ã^qK žŒxž}jð +ô´bÏ–½cön`^á<°^,ùäé#w†ÿޤºé^‰ƒèž#hÁû¤ !qlóÐ{%>EðËÖ‡¦3ÕÆ~ÅàBªÙ-û@ç5Zÿ„ÁT«‰úà“s¨Î+j&‡bŽ é'ºü´O‰£:WЊEÌ1ɛܻbg$?.‚ ’h—}nƘ+<·PL%ŸA®“ê‰A?úèó Nî;®•L}6©ê¡úè8‚·±—6†Ü·øÝ¡EGõʰN8y´ë0·é}€H;:îNÜ;û]¡› BìÄü¢Ü[ø+UhÉw4.%šA5ÁÉ5 ñec©&TcÓNOc“OLá}²‡ÏÑkþ—¢;K0Ÿ¨Æ–ƒ».tÂÍw=ýYqä™±°ë™‘PÓ±MÝ7‰sðîŽþà?2v ÓCâÀ:¡=èÛž7×Çgu~=¾_¯Ç×ãëñõøz|=¾_¯Ç×ãëñõøz|=¾_¯Ç×ãëñõøz|=¾_¯Ç×ãëñõøz|=¾_¯Ç×ãëñõøzüÿ|L˜°z‹í*ëmÖ}õøu}õ&,_¿À’ÇmT®_e°Ä`òFk_;OËÙ–s-§ü`0yùú9³-É;Èo§LÇkgÏœ;ß`–¹µ‹Áä®6 ¿70ñttpÜBž´°±v±ûüÚð__½‹Ìû~æ¼Ù‹,ú~Ñì™ æÎ_dàúßžŸ?oæü¹‹¸ÐççÒŸðüúŠÿùü—Ïqùß|>y~s_=®¯Þ–¾zf}õLžbÀ“•ÿú=¹Gßã­ðôÚºÙÔz¹ž-ŸŸ]aG®è_ŸŸ¬Ü²ÅÚÕÎÖ€>m@ž7X8¥ïlƒå}õfðÞø¹]_=/|3Ç`6ýÇûâ'CòyÎÛ`Îl#I5ÛÀ–¼‘7§§¿`Î|Îç›2göÌ…ßw=±ñ_ž˜G¿nü¯·ü'ºÞ²å_Nßx|¶†5Ž.vK>O¯ï‹m;2Ç€_ÛWoÖ*»íŽ6v+„ <±‰œø :è]ÿ“ŸèížKÆ¢ëª æ“X8׺ùÿÛp_>¿éó—ï æ“˜ó=½mó ð¶Ùä<'Г„I/1˜?gáÂï‰e¯×[·žcV¯4bÖqŒ‘…­–)ç ‡‘¸IÛDi­elf£edb¯µnƒÈ¬YeÎnsÅf- »îè÷TØuWØv7·Ý®k*{h¯^nÂ,ýq³~À³ÎZÆjmc…³öCžYµÜŒY·Æ”œ©j³¶¹ÝV]3kw¥k¸žÂ)ZÏÄÎOwƒ¹%cd²‰ÿ•…Ͷn +»ÈæV>Ý6˜YÒ¿mh¦"ŸaÁ¬^ºž|5gÌmô`¯þÆVô5f‚£kïÛœ.*¿ä¡ànR‡~NôüR¾b—°Þèý¦=>[“¢Ï}ÒØƒ¾TUdÁhôÜ /”ÝäÑMBŸ8¸_\ôÀ‘K{MSÏF*zéD× =ÊÅA¾JN~½$wpµd¯åhÁëÑ‹µÙ§§h¿µ»zKT?•'ùû^‰ƒÀ͹õ¦v~Ý-Ð[ͪµ”’6x™À±ÀÙz袷ýÓ‚gwp†›+Fií¢#x¦ D_ëèÕuð¤\:à"œ{¡o\² ++- q“^grýn~zr`ê09a÷UhÅhôd›ÉŽZœ—.8&èµÇVOP¡ßx3ùôÇâ~zƤ\NÁ%£¤ˆê1Bpá7œWL?~[*y>c°à›1„síi¦Ú¢þZÁ=¤å ÊA÷ÃSîžèôž ‡"4ïôt¡€îÛgù;¬¥³+Xiƒ'ÒTå  >qðQ›˜Ùk™š[km0•pOY GCp¡¼–F%ƺë úh-$W¹Ö†ÜSò38AW¯ÚÈ Ïü¶œc´žÒ1VO±ÉGæ&àq5±fj'p€[0è#ç·¦4³ñÐ14™kM#ôùZûv·¤ô¶¥ ä]£ú(x7mhU˜©·é¬'¯[¿ÅVZàlÂy€›ÉÂr{7NåÞ³÷é.;…öV¹†ô‘¼bXgÀæFKúØw¯ ×KÎA[òI"« ++7§ƒÊ;yx*)¯—oÂØàâÝ‹uôî.û~Cîï·ø9‚óFÊš‹‹¥ŒÓóUÁ)#ðØŽ°Å§z+(GKD å èâf( ›·ôË¡öì«òôé­òIîÊM±5¼¸38ë­ºàaké¨ÃÙlÑ¥ü˜Î!z¼gpô•ªƒrG¢ßYÜÑO²êE¹’Bs¾Eï™ì“2Dt Òã6oí~2Ú“DlŸuØÒ·óÐ÷…äClc{Ì@p¨öM“RÏTyçè‹®Á½y· =Ø9úÁË„žگ蛭Oû=\"ûÀ6åÐòÑ”ÿ+çê÷bAÝèç‚»838ˆ>*2Ähö6bÏèCŽ® N ªk·%PöÜøE R…•Œ¼bNÞ=iO úɸѾD{]!°ì[Á5¢·©h§½f™!ñ‘ksŽÌ7Õön梻ŽBt&c¹­›’<ÌE'm#c‘1ÞÀwiù¨·èPî;o2çm´L•j¼³8?ðÖò¶Á=ЇĹÆô!>ÇTi«eÆ9hQ>ir èݶg Â{Y¨Tå™4Hv ì-;ûöBO®Ú/E_°Aχ_wôû +i´gÜ!à ã£G5BÈ8Pž"Ÿ¤!ò¶„AèÁ¤œ‚Û³‡Òq +Ô SNÍBÏ'zÒÑ“+ù’û +.â{Ñ7£ŠÙ3Y•vb®*~Ï™rZTMT‚ ´õÄvõ/ŸL|&z†`W´?—Œïì×ý÷°•wä@ôðÒ>lôØDTEíÓõŠHíøeÕö¤Áò¶Ø’gh_ø9|娤ÐZÚï¿s‚*j×Ì59ºj<¸¾ºúkÆÑ>¹¨ŠÑrHÑHp©Ã«ÇÑ¿~>bháHôÜѾï˜Ê±zÑœ=BôÏJyÁcî¬Gõs(çrÑ(ôì‰AÃ$¯ðþ˜ßà·…_ΕU“±„=¢o‰ø Ø'x:xW]ôüve¸Æ„1Üh΀ËJÁ[\Ç2FÕŒB$ï'>‰µñÔU¨ìµá(ÿ‚ƒOØ|³ÂÚI‡µsí†ð & +ÆŒ·Õæìü»sŽ!½Àï‹¿ ž}Øk壋žgÌ-ôŠÑþ.·rÎIýy\Ÿ[Ti{ò`ð._ÜÒ¶”Aà7\¿j-£”]´%ô9„é)­<º§„òÁ’ØKù0ˆ/„ýôÀ!yFö‡oç*ïØ ½™rlÙ8ôoÃ?À¶DgbŸdíýñÖè~4¦ûj†a®p[Ƚwó×CÏ"õ©Äׂ¿BiíNÆo3åG†¯£çñ ïA¿<îxà-xµ´&xGœ‚õÀ³ËYnë&lòë~)p²Ä/*eGmàôp‚|TàÞ먉ýºÇô¡|Ašá¼wÂ@ô€+ PÚùèr[bû€ƒKˆ?4IŠ9<™òßÙlÓˆ/¥=²dNZ׋öë•§>~sðÁñvÚ”cøIÞÊC—UÙuñ““kA\F?;å0pñ¡8Pv éMûeéugéS éCby0Á„¡ù#©=ƒ#‡üc?H_ë­Ñ· +õQ~y#h/$‰ßÀvCÊ%Dpœo†>å¦òŠ oOLy ˆmÀGÑøëIlý‘ð±˜CA9#h/:x¸|c©"ÊÆÈ¥èc¦ýœd¾b^‚oý‹˜7à¡‘(¯EÑw8OÊ—žnb‡àý£=œaù´_¶ñ^Ý„“Á ..>ñðdðƒƒý˜ø +ŸI{KÑ“V1 +ý¶´”Ø84À¡î™.n7âËɽ ö5¾\¸¼gd_ª ³k¸hÐ +l¿'º‡÷EŸ%µOb³Û“QîH<·-¢¯Ò)¨'gC|¸{Á-NæñÇ”sÜin‘}ÁÈÿÇ9oí{ƒ| ¹§Õ[H¼ ñU ³O¯®^Xr)gfѹErøF:ßÈïà €mĤS3¹ü;‹ùô³³(Çròñ©´Ó-®Ÿà_8\ˆ?9•/|ø“qk¾àšÒÏÄ~ÚYGòËÔ—RÍ3ŽÍB<½wQUcÀC>=ÊùNW‚/½È¸z‘øEæ£÷:bçxø*øÞj³¸ (^ŠßÅ…yñq°Mü¶>ñƒÁÿH{PÉ8Ñ^\2Þ°pmоrôãžùAùc·„öF.å„€Âxy& À½”àó(ïzl?Ì#ÁçsŒîGŸ,l‘à¡"vú…ŸçB{¸ †HüçÈxјØï“0y8(fÚÑéà§½»ÄFeßtê+éÃ;i4Úð£à~¡š‰'AÓ/IyJ<£úÑëóˆéOãsÔ®±àÙ?ÿ-zº•ö4Ç’"JG ©Ç§£›÷$ãçÜc€ó¿zt¡»ŽT9ªvœàžÐ>|€ø´÷>÷6k˜¿IrØ-8Ç9ÇÐ^ÐØ°÷Ö…¯D¬Éü§ö³cœo¯eNb¹‰L¾’\ß› ®Úæ$ÿRÈ]ú'”âK?nÜñ©à(¦}¾q‡&C¿Üx´§Û›àcú}Ú`1vï>åä4pwóAùáo=Þ7kRü lPéhBß $ƒ¸ëyؾÐ.1W»i“ÒKr25ñßöþ=€À9$mKLí€Ä +ÄG™äÔ_‚ËpKHoÑ?uå´(m_NóoG¿^4&’ñUß_M6ýôtðÝÃ>©ˆ*7€®ç°É ¾ƒ¯!q«?ì8‘Ž?t9HÌænLÆ\z4Î’ø"’ø?L1±eªÕ”©O{Ú n¡qˆ`Ê êBòg=ŠEHì>?OùeÀEæ/l~ˆöN~æ æü³]>†òv‘ßÑs‹© =ð»³)&!~ƒ‹ ós\ à ≭Ñ8Þp[/]Ì3Ê)Aþ&ô ¶$g¶tÑAÎÈ“xÇB_Ô‡Ž@.«´ô ¹íÅ'ó÷OòDõHŒIÎAbçLæow–Äcè‹Á>…­É ¡ûŒ~SÉUX+-Ô’€ qnœ%òvmsÁä!NÚàùƒÞ­Ÿaœ‰ÏBL&X¸—”px*æb3¸pÏÄþ”§•ø~àCÎÚ¹›ÒÞ½›ÂÖ£[ú+}»ƒû|Žæ$/ïâ7ôê†Ú·%²7kåÕÍùº´EÇ„³ÕF>†| +÷Maé®.KÊKòtÁ1°'¸©6øpÂHŽIÆ8-f÷hC(KZ~¤ó ~,8m¸²¬éG¾æ­¡b÷_V[”<] NPª[ô˪°óìf&ÈZвã4—ç éWæ +^)ƒ”¶žº¨á€Ÿs@ôî¿IóáàLÔPH.7|Šjo‚ ÜûÈn>zÀŸ²Ü`ä3ÐŽÏ;æÍH®M0Rwð:€[åM°%8‘|ÓõÁ§}ÊÛé“5”úZ³ ÕB±ìžøì.^šñBúñY"夎êO9à2/Îç«^¬v?6cwvP~TÊqãÓøšòénè ­ +zï‰íÁ®»à;¯¡ÑÜ‚s!¯‡¯D]È#®»Ù¿Å!À^™ƒ sAqAPÉ(ʹM08c¨Æë®†Æå¥ÝÝŸÛ¦‡¹Û¤>–Ìù>¾’¸°~Íã®°òÕEþ }Ý®ù³]zàÖVöÚ‚s¨ü¶@| +êà>¤˜‘ø|àÓðÍÕ's©8 +¹ÍA=•$¯6#9©…%c&ÚhQ~Mò<|¿™Ø®]@wph"_ç½RòÔG!¸ Y{¿î˜‡ +«­Ýè#>uKøN’ïu£ñÆù¨¾ÐDy‰ÕߣQ_NŽì‹ (߸N3’\ÜžÇFüÁwÊýnd³î͇¾æ1ò8 5Õs…. øï¸´“Óùm±ý‹X[ò·ÁÜ +{ +7€—Lâ-jOêТÑÀ¢ðßàL&ùzÙƒàðÎ÷ƒk›øCÄrêCÁq.`š¯Ç g/ÕTHØ3™æ¿!E£äˆâÑÀ±¨Êþ©ú*¿Ì.~É Œ/ÇUŽcKë¢PÞ‰QϤ<1c¤„êIœæÆvÇã•lÕ³Tç²àÖ÷BúŹàvcú ÖBëGéØúLÀ«\Þ­EBÆÕùB`þpàCÎ1 'ø×¹ü»‹ÙòÖŸ)·,´Æ‚K¿åƒJº0Bü‰©|nÝb¡øá2±´y¥X\¿¼-]Ü$®„ŽD^J9ŒÀ݉¸-˜È +endstream endobj 294 0 obj <>stream +“‡”xlšzf&Ÿss¡¡±‚A-va´AÑ•¯»Âœ¢z$$ï§\úNÞ=7$äœ$›ÄîQçA=Apë'’¼üì¨Û÷*7ÿiãß9¸­ÀÅ$xeQl-º'€_ÞAMüõ°IðÙ‹) oÁÛh ŽÁ½DÏø’mpOØ&x.CU[£i­œÕ¨íÒzg`æp9á@¯ ò@W‚á¶GÖ£.Û"úS>㨒ï”E7)÷~4d|0VT¿]Æf …ý™ÊÎڨ˂›8÷ŠrÙcž?Añ9ø²Â4#iM5¤ø=Sh=‰Ör¾7*ê2àœQëóB-…à ’¯ƒ µq•‰©Àþ¹Ã»x—~%~’æPqà?Ü? ºCÀû”ëùº[Ho \—‘;ÇQž6ÊÍT1¼•à‘—3ïŸ>Dð%ù‹wü@ÔWyïèàC§:?‰‡§@×™æOàÝN;1Úƒ¢ù7À‚/Ä !éø4®ìÙ2>§ñ{>¢ê;ÄE1 hŸ}r¶²üÑRè˜ 1;ÆðÛS±N$æyœ]i€y 6,犛dK›4×QÞ™-°è¾RHúp1ãàLè~€_‰òÈÃzÈáRÎÎÄýVäÞ¯(oûr«9ëq›Üt‘¯óÈ×' nB ÿ Ï?ÅR¾™Cé< c¬ ,Ì{$ö—ü ºòõí h‘ø\Ä pj‹±'qéggŠ Ç¦ŠÞ¹ú¼½OüžêksSûtq “{#oÏÓ§¯b´z¶è€'I$þ52Éá1_$ÿ^XRÅíøœ¯öF½†Ö +‰/bjÆÑ!r7¯à$‡mЍã}ÖÆ`5gfs{Ÿn”޶¨Ùš×kÁýûEC°éÉY b³µr:qkÚ Ä-U`øy†!?ÇÚ”Lìry_þ3¢| ¸h)')j¸_áÅ”gô3a?ÉäuÀßR>¯®|½/r,œå² +%ÆÕN ¹óš7“ñëââLk Èùàk’öMEN/&›ŸÈÜ\ħ_šÅ'ûæ#°$à7ûõ ü•Q•c€O‡í=,#JDzy×B_‡O8<‰sO釘†Úµ´…äÞá»Çˆ¡» §i.Ib:øÜ ûÆ¥‘¼’ÄlpÈ)dheAOK.l\!•<\ Í` øè&€ãÎk×ø,»ò//äs®PÎCŠoý †aÌ ‡MNÅÎ+Ì«žþø%_æQ“{Š|jl8“9ïê¯GùD‰¿3NÌ–"K äð²Ñ$ŽI`PðÒÓz ô™²/ÎãSNM‡>$ô­iÞFr%p6B‰+yø3É×niýi}_rûG¾.¤™ ­'Ô߀Ó1WºòuÌ—Þàé§ëkda'–a;ÆÊ¡y#i¾nMòuèc±¥u瘚ñ4_ÆsÛ‚ú‰‰»&Sž'Ô™¨6Fí±¼aµTûÀT<Цä«_¬W”ÜXLµ1É=·%XÜžàÉ]‡•=uº8`IîO|æ&ÎZÈש?"P®(ðv¡žz±1åä )qï9p¥#†òöäï{% ÿ¸ÀàW¡³Â’;å(­¹R.½øÝ•%M?*kÞ®‚^1ô±e`"ܳ¨½Õ%*÷È~°M`ÊÕ˜{c_Z¿”/¼õåãÄu‚Ï3ûä<êb–PNÓ²«äšGf¸7\î¥ùÔ>öMÂ`åœK9?C«5`Ý¢û˜a}Té¨ ÿ*‡W`“P×àœ{‚[Wií§‹µ….½’ }ºÞrr=7Ô¶N|—L|;ü"å #öGµQ7ï±)虓—jcÄ•üC#Ú)]:ˆÿð/E4ÿƒ6†@rQ`s3c5Å@ˆ3˜ˆ <É=Á [£~r{Ê`ºN‡ÜÞÉŸÎ'ZC-)Äì/$Úå¿Èß§ 0c@Š>8Þ°~@sh’Я”‡ñÐ4ÌYêKá;ÿH^®&؆jß!?§¯§k‰E£À+¤žŸEë®!½ç©¾„Gܵ ™›·èÒ¼jcdâkm¤ñÃÚ*ÆÔTf¨Ma=Çè½€S ;õYc´1pmê/Úö=»ø=ÏÍWEí$ì"ø¡FJr"Ô<#kÆR]šäÝS¡ÉÆßýÏ<> Ú-x-x …ÄS•ùM‹ ŸÕÅû]: +õ*ºÆÜMð:ÖÌà£TÑd~Ÿ‰Ú,å䃴µ/]sƒŠXÕ²ž­x¶œ'¹-åÑ%xü¥ð)ÐÁ^ Ô‰óónñ}iýß“|Xaç£kba¯e¸šCÍSÚà¬c@èc`€™»™óаD= {€£ e äD¨1练ã9]ã@ý’`*¾°áG)éôLªÃ@îWt÷eUûreѽÅ•m?§¡viJð¶ñÚõTCAru öÚð X»26Q1f%jŸø[Tã +uIûí´6ƒµsØ&Í«Á ºy{Ô°$ä÷Äß ŽÎ@ä!àáUÅ×N,]+wíªu©b«&RÞnŸô¡]|ËÛ{R<@æ´’Pÿ”܈ý»T¹Åô£õ3ÄÖÔ#T†Öí=»öVðSÐu!±ugªÿ٧'Æ›®kØlÑ¥_íÝuq¯$ çëØ›uØNýÅY§H—~¤~˜µNh•e™Ëç^\œ ¾HŒ)|—{jnïjÚpºŽYd€uTÊS™u|ŽPýÈzðÛXCQû_W>^ªlX§ªn±w>5᪞¯Q5~Oµ1È<öNT^¡Ú\ÁÝÅTƒäÏØo±ÁØ’1–Ü´¡½DÔ¡¨>xtÑhÎPmŒð.m ùŸµ1Ü¿hcxuç¬uXÉI›â]¬ “8ÏÔý äÝ\,ÜIk‰{'ÃМÓ?g˜}`_þt•°ó•![ñ~9êÒRÄžqbPñ·\Íó5У9/8À‘/ayPÍPϨt_„_æPäå¨!WGþ -Sà?ÔÐd{Ÿž*·¸þÐîÂÚ'xv¹ì; „à#•®1½ÁgÏnKû4—µ×®6a–¯\ˬ_kƘNt=¸“+»¿¼»àqG Ë‚…“GwšO¤ž˜‹=_°Qn³WwäÒ¸v¹¼n-ŸuuLb­½û¥ ¡ëØË +þÚJeYÓOÂŽ§ë©6Fú±é°å?´1|?kclë©¢ÚûgB[@Þ7µ5 2ŸXì=!XS”ÿ­ +{¡€|z Öf®T1ü&—n²wúPÊÉ=QUãá«`¯Ô6ïÂb1ëÊ"uX¹ÆõwhhÀ§È1¥cÁí¬È?=›ßÛn"îlÛ€ñ…Æõµ…uKUµõæbYÃ*!÷ÂBø¾ö¡!¸¨Q»¤ûAÀ뚸{ +òäßX³û¢ÁSmŒ?‹U/ ¥šÇ&lí»µÊ­Ë„ØšñXãa7÷Plöí®tŠìõEƒ+jýQ&yü” +:©ûgª"2FÒøNb™˜¾oº˜yv¾œx`ÅÁÀ$vн=Äßc¬¸â›?Š% +…òº•\ù½e_Ôž¹¬«s±v#Aç;zÿDeñ£ØÌk³ùØc¹Ô³Ó©J:2Ú›|➉Àt›cxº‘Õã…üº…âÆeÈy8ÿ\}ä X¯GÞCç°<öí›sÏ/•5¯ãkŸlP¾o­Ú×.r)g¦q~ÅÃ8¯ŒAJϤ~Xƒ°°qïfÆ[i™;EÂ@æËXø5‘ÌoÔ¢°^dbÈ2xÕ—!¸P•pt¦:zçŠg¶&Ä~ èiH%÷VŠéWæÑý X³ƒÞêçµ^hŒB7ã£Ì¿º€Ï>5Ú²_­A €=Gê¨ü1ªØÊ ªäc³°§£ Ó”¢µwÔ¶Ç ¤5ö ÜoÓ¸‚·E÷§k<¾qƒPGmEUØ´ZÊ¿ýSWÎNâ·?öwœªŠÙ15{ª³Iס“¡-K!u÷~O³‘x¾ÉV}ºÎZ–Önd …L÷²UÜ]¥ªj6wÞ7T–^ùžjYB;\ss!4ÀÙM×# ³E0êÿ]z$góÏÐǺ¨2Ÿä¦‡Ë{[XåÎ'Ë¡=v>ªrt×úÄŽQìÖ´ÐŒçÎM¥Ú~)ƒi•\=5/9²h4ÕÆˆêÒÆrO.„þÕ Ø_åEòðrªCGòTÊ­L~/”5.*šWÓü¤¼m9ÖL _}?6ë_ôýFþC߯òÅjìû16çº8Ôé>ƒ’Ñö5àïƒ#¾ ~™TѺ–˸6÷¶Cׄ 1„µTä訥!’IÚßÌZŸ¾ä¦:Ùdk¾ûõrÌ.íÂLÞ·t4k"_¢ëÀ[SP_Z2 +œò\EÇJØ»!Áƒ†«6RUs‰Äwçå-A½Õˆ#ÐRuöêÿ®òL¦ûŠ¥È¬‘”kGØ[†=?$.Šà”N<>MV5kBÀ¿Tk”X_!c‰½bð9ÀД="ûÓZÿæà^’W6É£÷Œ—ÒOσÿ£šÐf‚vÉ_“QÎjØ®à—Hëꨛ¨‹­ãÉxˆÁÅß"'A- +û},}Ò‡Yy„õ—’ô©Àg-KŒ­²¦m•úÄ];««×ýøÃ +¬S*Ä&𝡶-Ë”#S¡ÏËU>Y ½Q®¬e©}u¡hŠ]3Žj cÍß?kjt¼[T_ºûOÚ,É_éºPTÉhè¸#ŸPÞ]}=Ö5ROéÛ›ØÈH>úàèb#w·•÷øEqûñÒÌàòÎ/@ÌVE×NöûR_¥9mBõD¾øÎR¹¤qTÚ¸ŠÛñàú~Ü}¿ÝmfÿSßïárèûa&c¨[¤<ù){¦P ,ÿ±ïZLT/*zï8쀎¢¨Fí?åìL1¨ì[Øür3¾ª}­´gÕ²ŒÚ;ºÙ¬oÎ6(k(j-Ø Ãùç µ°óÒÅš™Hb9p”´£uƒH°"jOJÑAûaû¨v%‰sÐuƒÆ3Ꙃ3Á¨ÇÃ&½ºöªÑ84PÓNÌ u +â/  +guíù@žÌNò ºG{“Í€öÝ„õ¬£lòÖÅ:Ö÷°6„ö*È‘et_9t,°Í´‚£|Rs®ÛzÐ=2$"¯¡|íð!Èñ*üx¨ÕªÂ5£äÄ=S±¿—‡–%03luG“!t`UO—Ò= +["û`!ö¨ÐºcQÃÔLÀÅO};rb̯ؽ“èž?ø}ä³)Ðð ¹ö®„æ¤súšÇgB/ZŠ¨èº¦ðcøÌÃ3••M?+‹î.ââ÷Màür†bOD—.ù™êV]˜O5”‚2†AC€~6t…PŸI<4…Í¿¸@™{a­›@KË-¾êÈTo3éèt被öN¥{ú°{1wâL`w¼Z%V¿5£N¢ûk #\W;ä s gCuàƒI^Aæâà:7°ŽŠœyw@Þ0<èžþL‚o€u¡Rü-Ö=±æÇ;øÓ¸1æ\|zÒ½­Áe#±F‹Ü‡Ý è\}Î#¶/4Ì‘'AkUéD°tX˜v{>p‡T9’Æf·ˆ¾t=^å¢CqØ–€Þ2‰‡”Ÿî—ˆ¤õ^úw·¢–·Í7RŽM£.áØNÆ?{­HœE~M!brêñ9RÒ±[¬Yc­žjh Ž‰õKÔ ±ÇuþÈê±´.„5Sâ{éZ>jXxÁ‚Oì@êG¡…µfØhú‰ÙT7õt¬sEUŒ£:mð×§çK™Gç ëª'Žf+›WðµÏ ••mK¡e)nOÄ»÷Æ9óôoEÄ´íCèµâzHnÛ…Am›%þTYÞ¸uzM¡äÜ’LÒˆýdŸOõÀSN'ÏMAΆýaÐéáª:V)k:V¢ÊGí-Dî0À>+Ôz”Å÷‹)çк4™د‡|›âÜä}“±VLuê‹o-†o€m£ßûEÈgLãöÑý²X_À:/jØÃå\›ÏÕ¾Z¯(i^,nKÈÚ8Ò½’¨)bíó]Œ;8Y +,ù–jÔøgG­ˆÌ t((“öеŸÌ!TÓšø79a×ûiþQ4’þÞ9²·àMtºc˜ö¢ Ž¦°têÚSoãÖ µ% K7ÔŒ•[‚õ”~Ý¡§½!¬|Ÿqe.—woætØH^¯mA|,p1öæR->¬—¦éCã +ûR„ô sºîAÎÄTzÎØƒ”|f&§©_ ]šÏß +»Æ>QËȲq4/þ‡þ ɉ¥øãÓ°¦ØUØ9Ú`râñBöµ…³‡ùe £ºOîè4ŠƒP&ñ’ú…°Òï`/BÆ…yÐ$£õKb÷ä¾N†N*ô… Í­5.ûô\º†‚û¼c­ bM뎨G—¦ø‰Ä3¶üÞÏ\þùtÝÊ-¦4ß°Î/¥ž…zŸya´eûÙ‚k ©Žaö±ÙðËl!ñÓ4Ö‘_CböÞ)ÓBoºI‰§ÐØ_ý|¢ªu)[=¯EýPQÚþ#Ö¤¸ôks¿(‹š‹ÕÆ\õ«ulIËÔîÓN@ûn![Rÿ‰Y ᇱŽJòãù¨yKÑ»ÆÃÿ æÈ G¦ ™'fÑ(ô¶÷´˜²ÅõK¸øê±Tóµ*§-º4ÞA˦òÅ +¶âÕ2>óîÜGøGìaå3oÌã|r†ð%Ã…˜=㸊'+¤ª6#èÄÓz#úºƒ`Íxõ‚ˆXä7GêÑ^•°½c壱‡Œj A«{’áƒSqv6Å{ „È}cùäcS”¹äï³úè+½2²A¥Ã¹ðÝ£•šºyÊ=ŸÖqûÞ[ìùmµâØßÙK¿[²W>n⎿¸]Ÿ6(k>­b«ß¯¼´Ï´9¨.=ô/·náO>—ùªWk…ü[?XÆ–NP»ôF]‚î]%÷ Ú—džNSÏÎÊ[Wªw=d­kë¥M•õJëŠ:s©àæRªÓì•6D\Lï1òJ¶äþ¨ÏHiçça_[zÿGh Ñœ“`{¡æÙF¾öõ¾òíj¾ìÉ +¬›àÝ&êç*Û—rÐF­hûY™_GëÒBÚ©YðŸlõÓÕð-|iû2è]B/v&'ìŸJk©t¿è¡)ðcø*ÄìÀež™ÅåÞY¨¬z¶‚­l[ÁU·­“jÛLÄê–лT–=ú çˆú Î]Yܸv»f+ž.ÃÞn×kC~»94³ùÃÏ”•o~V=^¢¬ýc ö•¥tóÙVáúsWùl»ô1/î'òZÕ¡fKá`›B:ØFÞ÷X)kµ޾àÙŒ»sØŒ[³•ù-ß›×þ²”;þBPmvV¿o,£Úݬäª_¯WÔ<^Ž\ šPØkÀçÞ\,7¬>…ƒ¯|Aã’.½Õš‰|YÇ +…æÆlÖ#¾/òn®¬}©å‘F[ËC÷í¸ªßÖpé×gCXJ<7“jÑ?\J×´âOMG<¦õN;¿îÈ…Ì› C)ɽû½”pzö¿¨+šJ•¯Ö£ÅÇ™Hò§á\XÍ(.b×heôñ±¦…ç˜é\­8ûw{ñw•òú_­¹«¿Û+îüû&‹úNîñ¯â«gq|ǧ`®áµ‡pí­ îº¾.BnhÏ¿±çN¿—¸³ïdùü#õ™®–‡ïÛ¨«šÍUEM«U¥×ñåm«ˆïùãʦŸ™Î—>^&ïl7³Úù•JŸ¬‘’ÎÌD®hQqâ¯|²ã®¿sàï¾òàï¼qçoüâÈ^û›{ùwKÅÅ_EöÚ'kþÞKwÕ“ºxÕÓ; Rã½@þÜ3kîÐkWûa½²ìÉOʪO«0ø#Ï9áÄSY>Þf-iøÚÇ”ÕÏWŠ5MÔ'`ßê3÷œÅƒ±f÷ýf¨<ôÑHØÿDÉ{j¡<ù’e/¼UsW~³n½rî=ßÊßyéÆ7<ÛÆ7>÷dÏ¿—ùã/yÄ&öü‰=òL¡<ùV!i¹«m¶ü£/ñE[Œå»;Yò‡–TE{§»ys§=ÛòËvþÑsþò;v÷§õ\&‰¡yÑ—aM“úr‚KP¯2ϼ?Ã|Ϭ=W©®×{ÛŸºà­*z°†O;9Ýbÿk•~ß ¸ø ¯<ýž³¨ýËrEþ›…%¿/‘Ê>¬W×t(­79©¯ßô³¬»¾éÎõH«+wäóÍ.ªm’TûÔŒb•oÖ"OãHœv¼[O0áB9pç(Eaó"Åñ?M•··áÞü*º“"¸›"~z–(üù2AüÔ’(üö6Žÿ6J~_—æô¸VãÖ^™SŸR˜u/6óóý¹ìû¿†ÉoÛÒž-°zuG#¿îHQ=mKâ<÷&÷Ó¿üÁ^¸øÁNQóÇ +eåûeª ­îV×î…¨Ou8‰—^;pG?°ü™—²|§Õתãvª\×(^nw•n?ÞªºÙ觺ÛlÕt5VºÓøÀ]ºñÀ]¾Òê)\|nÏ]~±I¾ðˆØcƒ«êê]ùZ£ñy–fU/—X$`^Ð<×üà®6?ÓiÆÞ|ë =y£~y/]ý¶)]zÙ/¾m—_µ&sŸXÜýwk‹»ÿf¥¼û§½¢áWGîÙÇ@ñCK‚êSS†ýËùò§¶T®á™'wñ•šßûÆD™yc6—~i›ó`!»çã<'k±·¼X¿]}áž»úXƒêP‹¥úh“å¡&kþäY8ýL­<ûR.vØKW[Üä ·È§;J§žÚ(ýa¤<ñÞœ'ñW¸øØ^nh”ÜS·5Æ[¿¼™íôìP‰ëã=%›_-´{{1_z?Aîhˆ‘êš}¹Ko­„;=„öûaV¯ndÛ¾¹çüd±{{e¡×£’Âí +s=[Ë +œ׿Z¾¿’Îx¥hþÓÅüÄߌPÿ‘·f –B«G³åÏ–r»Þ +;ß·!v)ÂÎ6-ÿ¸¿öa³ÕÓé6O®h¬\K²{~6Ïöù¥<±©-@qókã£Ë-¢Ï5· èndhÉpœ½¶²oŒ|ì¡ÍóK¹®O”zµîØáØq¢ÄòÑíÄ5á@;+íj5“Ž‘ûtùÎv«‡WÕ—¶ +{ÚLU:$øáik„Ë“Ú|bsùÅw¢sï&åÁí^αüp5SõézºÍëšÀ‡j“µwÃrß ÍÙq'2×½½¶&Z|èô~{çÚ¾»È³}g™{û®R×öýeªç÷¹Û¿8›ßýw•¢ùïŽÊÆÿp2¹Ñijt¡sIå˦;?.‘n=Þ¾éõí\ÛWrùŽ×üí[ø»O=~v”«ÚLùÝÏ6JG›Õâ­zO«–ˉŽOÚ>=ãôäh‰W[厀VMAÌý¤œ GiÙ©1ÙÕõašƒ‚²¯<ðͨkõN»ÙäŸy­! ón³ozã}ßô:òs}£_æÝ»YÇ낳«ëÂsRë +Ü[*ó-ß]J—Þ7'Ù¼<­Q>ü7‹ÓæìÑÿ´àþnÁŸx#I'Ÿow}4åË[-ïzÁñG~çĺçÛUoÚRÅ1‹gQªw2äOõÜû×â/OÕïîfZ½iÔð/‚,ÎýÕByö™RºÚì¢n»§z×”nõî†&¢9­,ùQ|Ŷöš¶/ÎåªÞÜL°{u.óËC…/÷çùudç§ßÊ=ܤ¹ùÀ/óZ‹oÆ¥Vߌëä땇~Wøeœm +Ì>Fæ]EcxîŽ{á¹eõ¹1ÉùêOWÓLê:EÓÌ»S,vu.¼—äãï6©Ž¼´‘¯·{ZݽiÕr3ÅúéíléF«‡¢öýJeÕÛ•rm›B>ùÄNu½u»|Ää‹¿Ú¨šD'7$U„Þ×TX?¾©¯©„{ñ:Ììr§…yk§ÓfâŸRï%ÜŒÉÛq3*7èa±¯ÒÒŒ†øR'rnìû¡F7:L.w)ÚÿðÀg»¶¬HoJÙr?u·ûãýUö/Žå -õþbý½m‘2ª1Nx\l ÈÞw?8{G}XöáæÀì›-¾™-Áy¯å³¾ +7}Ýéhöö?]ÍÿèôVþñ)ÔêÝé´à¦ì‚䯸ü¢»‘9Õ7£rsò<•åx>*Ïsj¯Õ¨__O³yuV£zÝš®zÖš¢jœ(žüÓ–Ý÷ÄsÚÙ´Õåx¶ÕT¸µ×;<;”¿éÍùÛ×góÄO㕯ÿâÇ¿y!ýÞ”êðü@®ÍÛ“³§Îfí¸g÷ž)”½Ëòá•X“KŒk~_`œtz´±_é “àÒ!ÆemsÌêÿ&±o^;¿ØUÑYPx?"×þå~Ù_:·½è´ÜøºSÞð®Sµám§hø®“7úÐicö[§§Ùß;½„ß›¢…?š¢•¿þbÔÑ)oÌi›dz´s-{ãï¶òív«ûM N‡K‚ïç”çÔÇ•Tß‹(ðo-¨P½jLµ† ŸHÃUoZÒ<[ªJC›²Kü Š÷]‹Ì=y#4Û÷Q!ñÙç +Ôïê³l^]˳y,{{iEÒÃÄŠ°æ¬—'5ùü__ÆrÏŸ‹¯Z‰ï¬Ï²u<ßõImáöö‚‚üG1“ŠÅOí‰ìË_Ù翘?è´1¾Ùi¼áȇÅ3 +†oHÛ=rýíÎåæ/þØ"ý٘ה_y;BCâžfßÍML]r¶k[U¶ýó½Ùü»÷Q£×þü¥Ov$Ž;­ÏCŸ*ŠºŸZrøz˜æâ ìc×ÃsÞ'ï ל¹ªÙq+*Ïoof!¾&6$œ¹¢¹z;(³–ø¬»~éÚ¼S?’ÇMâë¢&å+þö1t}G§¹Ù^/öçîl É¿Ùæ“qº%@s¬% '­-¦Lúã^ŠôGc2â¡õ‡ë‹wÙ¾á\ç2ã ´þk7»ë¬²Ú¦ý“…Ì|¿Â™¿ägfáâÌÜ…Ë™Ùóbf,\ÆÌ^hÂ,Uk­<=puÍ¿OYó°s ûëÓкÌìãr÷]ŽÊɺ–˜[p%!·òZ”&ãjr^,Án­5â›× –/²6?9T@pQQF]BqŘ‚w"rwÜW]œgÑúΖ¯dîh˽HüÛÙVß̃}3>õÍþÞo´ûÓ_Í€•$fÚHfl7}f4£ÏŒd3߇ù~jÏo˜YßL`V¬˜õr öZu„Î’9fâÀ‘Ì·ÌòªL_}f€ö7ÌðnÌÈžƒÁ3™±#ç3S¦,e˜º3+↮;ßùƒQS§¨xño^ìN[ñÆ/îVÏoijoDå_»œuãvpÖÕº€Ì3·‚³Kë#òòêb +â“K"Ó‹KoÄä c¡)¼›Ÿu'.oÓ›3åó?}¸·oÂ[3ó›Û|Òux§‘9T¤üûÛÖN“u»ÿœ¹.xï C¿ªF!‡õ7¤Ü20ÜýëìõÇþcá‰Î%†ù'.3wdÆÌbÆÇè'×0”éËôfú0½=òèO~Æ a t†2ã0³™1?[eê,ó9×gyчQkÚ:ךþÚ¹ÅüÏN?ËwçÓ¥7/“ÄÖ‘RÛ«ùÕÓdÇgûóc›R +‹nÄäT^Ò칩!~1§úZtî©Û!šËw‚²vÞŽÈ!þXsîz¨æòµÐ¬kw‚³*îEäæ4Ķ·oOé|éžñë¿Ò?ßnMvy^žeü×NçU×;¬Œº<ø'ÙOkÎ’•̤‰Ìô“™ÕÖÚë£wéFVYíè¯3a´3€éÇôdz0ºL7úO—\—ù§Åhþ¹y¦¹j=òªîä'ú\ò﻾S˜Ùs%æ6I{ÕÁÎiâÛ›‘š Éš‚sI9š« š¼« 9y·bs +®ÅåójTÎá+9篆iŽ_ Ë>u)<û™›o‡iŽÞ ͹Q˜ߘ\$üö.·ºä]õÁš}u¡Ù¥uQ¹æ¿uz­¹Ô¹puÌ!ËíýµgÍ\È ×îOm°=‹µ9mzÿu¨â뿆.KìN~߃ν®y¨E¿Çs=É¿ÞÄ«öe†3uÇ3ß[ÅLþÁ™Yh]©½æQçå//‚­_LÙ}3<;õvb®KGuòa÷–Š\à2ä•{å$¯þÍ9yŽOvkðüî;aÙõ³?jöÍ캾% lÞÓ|!/÷Éè1jÄðÿí½ïFÿ|­_žÃõê|þ]×uw§wFÜ!=ò¯?½]µËé|¾Ö^tþé˜ËL]ìÌ,q: »f_ç Å«N_»Ž#ž;ò47⩺µTä4_‰(¾s-,ï!ÃG7ÊۮG”µÝ -n¾œwéFX±ÏÜÓ×Âs‹oÆänøÐ©š³TÅ í;˜Î­ÿ•_ø?=¾\çÿêÀ5õú<¦ÝÉ¿žôúû“$&šÏŒ™¤`¦,ófæÉ%Z?UwŽ2ú¥ÓÞ®e\éù„Ü¢ó.\Ž(¸q5¼øÞÕˆòºÛ¡¥ç®…¿–S~-Z\ŸƒGDCj‰ïš¼ÆHíËé†u¦Mšû|]ÞP‡ž³Î?©Öçßé‘ßö&ÿj g†êŒbúké“qL|Ò·$ÆfëN`úwÏôÓÇ ì5®¿Ž™º4ŒY²ù²îò«³„7WCnÑx€˜VŸ‘'¬K¶|!Õ¥­JC|LÎâ+ËI¯&ßI|ëµÛAšö6Ÿì}$çômÏÎ5ú£ÓnM峉?ª˜á:ýþ_Ɔù¾?‰˜§}‰WÂ5 ë9ÞoóÍ%̈Áß3Æ.bô-`†ôÍ é1‹Ô{&3ßëÍaôû×é/gÆÏµeYÖê¬ÚÝ9Ùäy§£}ëצÀf‡ÏGç“Ø÷øzäŽö«ÑUOo…W¼¹µóõ½ðªwa;Þ4‡”·7×Õ…” ïZQß¹°¿ÎÿÿøÅâú€S0^Ãt ˜Ý†‘Ÿú“QDä'ñSû[âKF3C»Mf÷˜Î î5ƒÒg.3|ä*fÌd‚ýÖ„2s…2­b…öɯýÚi#¾ºRp11çÈÙØÂ[W î] +¨¿^\7¤àֵЂë×à +ß +˹JüéÅ[!¹ÿ{ïWÕµîÿNªRDQQ{/(vA¤—µXkͺ +D:Ò¥KU”j)6ìKÔÄ{ì]SLlÙi»dïsÖ¿A²Ï¾÷üï¹û¼¸ïœù¬€À*sŽg+ÙFb|ËÅ+Í_ß(Üòîvþ–·÷s[Þ=Èo»£prR¿ßôZçÙÁÿ«1ÃçïOs´þ¿g½1s¯÷wýÈo2v¦ÌP‹1ŒƒåDÆÞz*ñÍ»SÈü›Ç8X/dìm2¶6‹é¹ Ê sÖ0£¦%0üª—È£Fó6¼èv\?~é5ýœ ô11{ªƒ~z®¬åÞg«·<"ãtïfþÆ—7 ·bÎ}õ  ëåÝÂŽ—ò¶q³ÔU ô‹ÆLòý_Ûfï¹2tüϬ k#R!‘yeC札Ñò³ŒÃþäaÓÇ™d9™œÛLÆÎa±Owb“AÌ™¡ŒãœdfäÒfLP53AÜÊLàÚ™g ÖýeÐ’›úüëkY™—·×•}ÞØ¸îóÚ¦ë$÷ºKÎíäõÂM§HŒ»y­`ÓË›[^}YÐòòv~˥ϋ6§ÝÛÚäù…~Cÿ!ÿö¸ý1ßàï©lì{ӑ䜆{´%?ïG"¶Uïï ‡1öfã‰?$cg1øMf¨ÝbfÄ(–qžÇŒ]œÍŒöZÍŒñ(fF,Éa=W1Ã=s™ñŠ&fzÈÃyU/ú»ÖO½Õ/—^}^¸òÚöÚÒKM Ÿœ\Ûv÷Óòí/–w_ºT¼ 5Æ[U-éO¶¶\&u£[ytRýÃùJ·Ãú1ÓþíXnLs-äˆ$z“XfáD|¿3co<ŠøùÄ"QÛ´!ÿÙÚ‘óÉ ¶pfl,FßH&2v¶Äÿ;û1NS§©ÑÌÈñÌèEEÌè &f¤_ 3%ú¡kŋŇô£<ëÝHœ ýêlyÒ½® õj7:[Ö|ûÂêMȹݸTÔxæF~Ó×wsêÿô wëÛg¹ÛoÝËok¿QÚüÛwSÔÙÿŸcÖ›ÿ׿ÿð%½¹°- 2×lÉ:Ї­Ñpƾÿ4:VöŽÄý™!ćÏÔ2ç ħ1CGû1öCÜû‘^ŒýôPfÄ|2ç‚k™™qGŒf×=î7¿Gï°ä¶~¦ûm½«üç¿ÇG?éY[u¥ºqëg•›ˆïÜräÒÄF7?»[°íÛûùí¯æoÿña^ûwwŠ:¾¹]€µ¤fßçz™³ÓÜkÜŒþÅ?öú+r.$û°œÀ8 wgF:ù’ópcFx_±„±LüÇ`Wâ3É<#sm˜ÃBfèÅŒ£½3l”ŒqÇ3£fÆ2ã=W3SUÌ´å' g–Üê;£þ™ùüSúá »~²ô²~¦÷+½Lõã³Ü—'+Ê/66n8·¾ùËKåÝW.m>}±d“òæ¯á²Oõ~ÁÇH}qù×pñ«%Áßè¼nè»­¹bcßoÔÿx^½±ÍŒf‡ð’æ4ËB„ $ãd×23”Äã13¢™‰^ÙÌ×fÌ3jÄ"Æ‘øË¡ÖSÈ1o3lÈ\’Sʘ‘“yfät53Ö=•™TËLå[—åŸͬÿÆrîÇú!îoõK<¾Ö/ z¯–½Ölj߿)yv°!ááîÍ‘ßkJx²§¥óš–ö‹k[Ÿöl ûþÚÆâM·n­ª{s;§~ëµ²>oôÜŒ€”ÿñÜLéùô£±ycOý‡Íù-èWä ð—¶&Ž$Fæ£=cm‚‡ck5…qéÏ8/!ùqÊYãEõo-Ú§±äýxä“KNéÇ-Üþ‡ùͯmæÖ½8¯ø–弬S}­ûr û ý„eôîÁÒ§Êÿ¤O’~ºRöæã ©O¶6£žCMŽ\ój×ËÅ›>½ZÐtóF^ãÓëùßÝ.j¿½°•ýéi¾GÑuøø÷Ç6Í~å°OdÆö}†2ÃNeFMòg¦x§0ã¹f\t39ÿ„ñ”ª/Lg®»n6«ì‹¾Ó²NO+8g2»â–ùìêg–³«YÎ.¸ÚwNö¥>óËn÷[zJ?eéýÂ%ôÎnëŸÙyìÕó~ ÷ö¤W¼Ô«žê%å{}Væ½-MÈYp^{Hî\t§a‹Œ—3¾Kð4´ûŸJÜñŸT²²CC–H™ÎãýviHÇ ~}=ɇ»1v#<ûñrfÜÒf*[ÁLf+™iêzfVÜ>#×õ÷­öè—œ#ãsG?{éý<ø¿5ΉÝm4M]͸è6ÌKØg²¨ø¦Õâªç6î[~¶ì”~&ÉO|üÿ¬Uüö>CüéJ©ÿwzɧæ†cÀƧãåuWÆsGÿ.—n|—¦þô—åÜ¡¿©ºÿá.îýÏ`õÉ_ÃÄ3?†IÇ_ku§îÅj>{žŠýNAWôÁnš#[£ÿ9îa=3ͺïH’ëÏd†;)˜‘“Bg×xf¬W3EQÎLöIg¦.Še&¹pÌ¸ÉžÌøñ^Ìä93‡­1˜›vªÏ¼UWÌ—výÇ(¯»z¿‡úàÀ×ú0ö§_ £¿:Рþñj¥ò—_²U?þ–ëÿ\/úìþËd¿í¯&ûï×»ÞÔËe7ô¼â¶>Lõø]’øäA¾øõ½Õ‘¯?Ùñêü&õ_ÕðÞe+®ëµª;¿­¿}QVz·®íöÍUue·×oöh?r”ÓœÃ. Qµ‘܃Ì3rž6£™¡Cç0cf33½W¶Œ™Çå3 âÛŒç5^¸äsýD¯ßô +¹þýJõŸÎ³¹üŸ?¯Týí^ŽâïO³ƒþ¦_áõ«^æý£^áÿ«^ð³>RøÓ«²ÀWúPŸÚφù'4™yG¯7 ¸¬÷SÞÒGíýû\yѾÁÊ“ú`þ›·Åq/÷·Æ|s¸%íI×ö¸¯·É!2ÎDh8;C³÷'œy­‘wýi¶Wz›Åè hö:¬È¸ ·weÆNQ’ÊïW½féSý|÷[úYžßé=ÿ¦_žó ©yï­¢¦–Û%ÍÅ÷Ö7©ßŸ/Áб=¯ózWï“zŸ[z/ÙS}˜â•>Eõîïyš_î­úzMàI½[PHœ¡û¬¹ŒŸ—'ƒ>Jìcd»ž¸ñf¨sw Ó$6 ”ŠN8ó{þæ/xÂíþÑ›/=8R™»ÛÞ?º¶Ïä™rfh¿Ñÿm-è¿lÓˆäY$Çê?ž=[b\BÚ ®iÿ·ìG:_Âå¿êäÖ'ýIåÿ˜ø‚z6è–ž ¸®”?ÒG¨Þésƒ¿ÕÇËnéÅ ³zyóË)ò²#޲Îï\”·ÿÅ¿ù¾Xùƒ>[ñR°÷ïsäUÇÛÌæz~ôá?~/*·Ü˜Á̶֟›Ã½¬>qU£½u%/ìÑg5ÒéoÃÄö÷Ë„ÆÛ®BíçÓ„O…°§çk´ßݪ•ÝÔ 3pÿÇó2'~±¿Ñ0f@_GÆÚj$©£g3#'ú3Ós×øƒÆ®k¾´\xð?†{ÜÑ/ óIæs^¿È§ü¬½OB§y@ñ1û€ z/áé—¹q_ïߪ{ÿÙáÝ“R՛׫‚.ëe²uíeIËe+ÓMeEåV›N8\ÑûI¯ž”‹OžçË+ ÷U¨™ ðlcù¾,f÷ýæ«J^o¥ +Ï5ΕŽ~«Ö\xš ž{!^y¯¹~33xϻŪ}¿x²»¿ñàvþà)þ:œ»ôS¸ÿY½Û²•{,FŽ[Lëì=¬I̘(¨ó›™òÆ3cåÿæÃ}ò•À~ô&Xuø¯¾læeHª‘°ŠauñF”“þ~q‡#¿õñaß/Aº‹O2u—ïg*;Þ/P%­±ÎnµHÝh¹00•éàBc´]O7øÝ.M˜F$® žÅŒsU1su5n›¾â~V?Ùã‘~±ß_ô:Õo_çqY*þõѺ°wçšpïO|û¼Œð&“ûâ—(öÂ_5•÷‰šOJµ7Ÿ‰'ÞiØUívþîþŒïüyŒ ìWl½é"?ýŸÞò­W§)²ÖY¡ZµåÒLvÏ[/þè¥j˽٪ÂÖÁbùöášu]cÅ–› Cv?äuŸßÈ ½y¥\wöA¢tü+´÷…‚Ýýí2¶åÆleõQþi-q¿ÍÖ¸];ø×ci7`3|¢3Ù?™Y˜|°Ï²ô“|¿×ó¤¾\Ž5:¿wz1à•^’ßׇúÇü€¨߀PÆÇCÉ+B‘ 5 ˵ŒXÝ1VÚ|c‘XsrJP€‚q9„™?z(³ C¯¥® ÛrÉE}áá +þÌ7¢róg3¸´êþtÿùÞ7tOt\‘m +–¬´ýO©ã•—Ðpn&ßùÊCsà©(Ü}•®¾ò4•Ýõ×elÃ…)Ê£?ûq—ßGñ^gȾÕGzÝÖ»/Y{Ãz^L·ÑÜå{Œ.ßcâ··WÖÉþž«OÛøìùy +ÿþ] öâÝkØÆ¾þ9/ð˜~‰|Ë«éòîŸæÊŽé=ƒ{~[œÙ:páB7fšÓfæÐ¡ŒÊÇ› OL1^U0(2¿rúÄ‚þäÉñ2Vsûv¾òã?+”Gÿì§<ðOUͱ±ªüjk¶~×XîðÝ£yöûˆàÃ÷TVŸË­ê¬Š(0UFd˜¨bSMhßËžW²ÐÓ_¦„\z˜Éž}'(6]Ÿ®¨95FÖõ~NPÛ›é~Å'ì–jŠ §»é˜±$6™´„åƸ„7¸o¸oïuD?Åû¢~±÷%ò8Fü~ç÷c½JÚx§m4Z½Ó.¸®gdpM§£¼éÐhY×YÏ÷ó•ëÏM`s;s[lÄœöÁ|Á>G>wÿ0>±ºŸ‡/ã¹p1£ð#ñJ!g4Ú0C•.Ì/iªÜry†²å³™ÊmŸ¹p[>ž¥Úvq6»ëµ‡pì¥È}ú•D÷U®Ý:RX½Ý‘ëyç­=soEÈÍÛ«#¾¼XrãZ‘öÒ½tå¾÷žè«`óšlek,üJwòZ{ÎaqD…Ñä,3¨ŸcÓ—Ô¤?]Ƹ]àùT¿Ìï{½ÀýôC ÷ö/EŠ‹z!x¿Þ]^Øj¼œ\ËŒò~ª†3¹²GâŒùÄrK0Ý<¯Ù®LÐOFâh¯eÇ•ìqÍn,É”Œù}0ñ|éÖalËÍÙìúãùuGÆ kŽŽSw?ó‹Ø}W+n¾9_ÌÛ0=|ÍÁq\×7Kù­÷rõg¦ªvýà¡Ýû¯ùþ^îé­êàÿá®*éªÜzs{æ½òôZUè»/šÅ_¯Sþ¦ÏQüEŸAâY¢ï7zÖ÷¸~®oÖÞn²pÆ[³Ü pëãÉ“ïVI·¾ÉäOÿ"ªÒ6\¶Ä—‘+ÂÚ£QõÉx¶úôx?¥–™;f³xâ,&h©;ª‰0ŠÌ(´ŽN+´ O) Ë]?˜kÿ|öùJ§…²'¾R°{ôVìyµXUÙåÈVïuæ~#þZÕþ_¼[^ÎRµþàÊíÿÅæÛ3¸UíölbžŸÛ4HÙùx¿ÿ]»÷—¢ýölEÃÅ ²®ïæÈOè½äGõË‚öþ6/`ÿÌ Ø§wñúL?ßû­>ÈïÏz÷{} ß#}@ÀU½Ðy½ð5½(;§÷ØpÆ)0©È4("Ù(8<ÉÈÏ×›™7q³ÔÕ•ñ“1\d¦©Zd †&tD /¢O3†¿ò;‡²äÚrU;FRHU×XmAµ½Tb)do¤êx°€Ýþ|_±Ó‰/juà‹79¨ˆ/Ôžû2>üÆÙ +îì·UåáQÊÜ:k®üØhÍéç‘Ú;_–`¤îêÕ\þð[¥²ãÙ<¾bÿ(>½ÑZUóéxùe½‚}ÿSò"ß3ú…^ù§z&ï1÷Î<Þß+m¥ï1ýlÅú,ìåSÜÑGï¶óña<ÝÉ9y2ó–0Kç-`Tɹf¾—AÒÞÇr®û©›*¥È\®Ô1èIWp£KÊï‡^4açCß×4´·´Ó ÕŽ§K0çØš}c¸´µVlÎk~ýñ‰è?Ñv>Bï¸÷‰LûÉ­õ‰'Zíñ‡áâ®·~üÖ—‹Tí_-ºÞ{bϧúêƒ4Å¡¿z)º^ÎgëNOT5~Qò{Þø²'§ðÅ[‡Š9ƒÄ‚Ž¡|ÞVâo·:°kºG`*ö½õ`?û&Týùý$öä +ž_<”»X¢ìùi)ò{^¼ò"Eºô"^¹ï×¥ª´uV|z¹[¼c˜¢í‘+ö{öÙÝÊØoOn¿}¸Z~N/ úDï´éÍäÀÂöKƒb?>Å0(«}@ðq½·²öÌØ MŠ¡""×Dše,çVºÏw'óo³„ä#\ƺªÝߺcÞ‰!`f€[,„'ë2jl5ë?™%uÝöá:oº©ºî.v<÷Bwè®V¹÷;®r_¸y°PÖ=½^è×îpŸ'âó³ù‰{¶¦<ÙÕ~íR‰z×› ¡æÓÉüÚ³ØïÜùSßHÊÎ U~ôf|ÈÕÇå×Û²E-ƒùíƒäU‡GÈ®Ž“eï²ñÕez±‰þš\#—a 4Pel²V¬¬·r_ÄŒêcà "uÓ4ëáŒÇ‚eŒÇü…L ¿ŒrˆeªPVgDuqRÖ PGÅ›pä\¡ÿ¢K¬°wK›ºÚJJÉ·Dϰ¸û^€öÄíÍáç:¶áâTUn»ÛüÅ Åî·n\ù¡QÐê’kâ Yb«ê/Ã5Gžk¹òÄud/MãKº¹œ:aÍÞÑ`²'ßËNüÙ3øÈÏžÁG]¼÷§ÅÊêC£e•y[©’*,0.þГ«ôæ[·ãªNŒeÓ«­`÷lÅáQè+U._eêOò0?™–Q©3øâ®a\ë£ùÂÖgnàfƒgDyBGžrªýo½ÐÛÅo½½€ÝùÄÝýÌýâñ)|qû0!«Î†ËZ?[Õl«ÚHâüžwnÊö{sƒ÷½uS{+g/¼ÒñŸ¾Òrç_‡Š—¾ŠaO¼U*ýæÅy«VìÿËR6¡Ü"P 3‡¦¡‹Ûó£¯öÌÃ!_~±ZwýfîµV~ü?½”ëƒdµ_ŒöVÆ0“íG3“ú _‡1^£ˆ]eª\±Ê48"ŘÊ2UêÒÝ–z2‹‰ÿ\ÕccÓª­øä" EX´!b…””i®É¨´¦šQ±9fbD’±”iV‚ÔóX®9üXÃù6˜­hÆe×Z+»Îçw¾ò×Ϫ(å×ÙóÝ=´§¯FG\9³:öîG¡go¦ñ;ßz£M,94Šo¾ïÊ×› Tv:q ç§óëO yÂEÏOnŠMצçn´V¬Þ5D^sÎY™Ö2ÐÃ“Ô . ˜…s<÷ù>L "Ò}–Šø +3—±Sgs[ft?fò€aÌ"’ ¿ +)Þ>R]wtzò´kON[î, +©Ø;A +M2V¨$FÐÅS!´0ÒʨK‡ŠOÎâ;¾X¬ê¸½€äÒS0þÊÖ;.Ê#?úЇ¿ç”;Ÿ/‚ŽŸº®?t¸†3SÙm°í;^ûй¾þðx~ÍŽ‘ìæ›³…ƒ/‚ù^¨0¶ü…o„Ï^Dq§^ñ$&ÎgK÷8*ãKÍd\œ¡·Ïx¹É8÷±Å}¹Ôº\~÷p£¸èÂ>2>–øŽDCneã@b ÃùRòXÿÙTô­ð=ïü…ª#ãØøB36µÌ’/î$ñü0É7Ùñ9ͽ>rýñIlû­|dz¥üþoü…_˸=ßyRÞö¡WAüGß)ѧ¡êxºPÕtvŠbï[7ô¡–ÅžoþÓ·:åŽ÷‹M_LQtý¼ŸŸË.ï¯JÊ7㫎Sí~çÎî|¿ÜL¶æðX¶ê£1ªæ«Ó]ßÍ—ïÿu‰2³ÅÚ;(Œ™5n:3Åvã:z³`úLfÙ²eŒo@³Ì‡Ä6’û‹Œ_ÏøxÉ?9#H2Re7Zƒ=ÿ‚m°Áú¸CVA|eHõã6_œ#v>]Æu=s³›M.¶à«÷Œö= Ò¼­†í +U»Å¢–!`bIû¨Ô'j¥ãÏ5üÁïeìî<Ù=?y£'Œk½7×PZ]ïÀUïtVn»êÂz,y©<øWoEíùñªÚ›“å¯]ƒ;ßÌWVì!Ì7‘K)†~ªHyx–1›\g¥X‘g:o†+3møXfÁ쥌÷’â7• 4"Á†×¬Ù7^Û~ÕK½åÖbè®C^¡B¥c‚eµ¦?—ReÅ%™³ñy}ÁŽÊ:«¶=žG{ë?ž¢Ú~cz+Iü Ñž¸)¬Õ»$]|¸œ;ò}°jËõY‰ýª O@o"ú×ø‹_E(öþì®,h·W¦5P•tSîþÅMÙóv)òb›K•{~Z +˜*&Õk2M¤!å´´Üœ¥èxàÊv Í6^ºÐŸY8y³l±K¤ä¥&ÂPEjËäÕ–\r®¹"&Õ””ñ™iÂe7ÙŠÕ§'ƒé®«.³ÑN“Ý7$&ÇL-Fjc²Ít«»F ­7€õ6W°Åž«Ú3Šíz¼˜ï¸ï&ìyî‡>W±fßxð¹®'îêý÷•üá§ +åž×îŠ?.åN½áÕ—Ÿ$ªÏ>].ì%Sîyì&¬Ùí,5 fëNT|ïK{—O}§Qù;©;îÏTf6d3›¬Ùη‹UÝo–p¯º¨Öö9(+Rem±qwb\§º0^‹èxBëK©$_IìQê¢ )ó£|etòñ™}ÀL¥vIü¦Ðxd +¿û+o¶ëæ")³l€˜œk!•mqäšÎLêNOåšÉûõüà©Üõí±¸e(¿ªÞV,?4Z\nƒ­»ÉqR(Úâ@™:«H=˜ErñÒ#„Â-”%™Ó4ˆKÊ5ã’J-(ogÝÇãé׌ºlL^°æñôáƒQ¥\žkŠ>iðöÄu'&H5ŸLå’K-ƒÙHƒ e{fK,ÄÂö¡˜/ʽ?x(¾õfw}·”ÝýÎSÕñl‘¸æÐX°ÝÁ)à»_z€±ö·¥—aÍö|ã-î~(y®N½Ðò?•»Þºó>žîâ†jËç³ØÃoÙƒòUm¼6“-ètÀºš*{“ WC|fç³EÈ!Ø­÷æ¡<°#•2×ÂŒØUu6XPu½\Ä5_™ÅÆ”öõó–HäÅøKŒ˜¶n€¸¦{Ø”bi÷r-íĬ&[\ce|~_eHº±""ÑšÜÖÛó¡Õ&º¦g¢XÿÉL°uÀû¤Œëâ®`R–6‰ÊÖ˳”]O’ù8Ÿßtj†ÐòÙ\®íæiÇ=?mÏ¥Ø}Ë›ßqÇ“ßó½wèÛ ñôW!ÒÝ{¹ºçתu¾(Cÿ}Ø¥sÙâ‰Çjø\¾`Ó`2w]øý¯ЋËøÍ_YÐãàéÍ1‹]—0ª„jK¾ãÛ¥Âîo}Ác‹;‡¨ªŽVel¶F.굚­! ø6”Y±g,ÕcŒÊï#¥Ô  Z«šíÀ”‡®ôðët'®ÆHï+Á…áÃcÈÏ+€‰Îí{ã§ÜõÚl3vËCWŒ/XtÐ,àãI]™RiÅoÊ—8Kê ø +>¯ÙNÌÙ`Ëçm´c‹I}”±a ŸQgͧ×”K,¹”ò~‰ÁÐÅ…nÕÕ$ +Ù ¶èoe»ßº³Ý/ÝÀñK¶§ZEëIÓrÕúbÐǃ./´™À2ÊúƒáÂø*@:ùD£9úH+x Df4ÖN(C¨zÿx¡r»XO\ó…™`Ï@„#u·÷/»÷½·²óùÌ0ÌDèϤYŠ%[‘·°;¿[&”t†în0©eP“AH¨Ú5 +6 +†›X`¤ÐÂ'‚ù®Z‘iªŠ+ìË­Þ;œÌm7qÍÑqAòÆs±7,1lD†‰Tºm88âàñ‰ÅÐÀŸO®ì§ŒÎ0ñö™@!Ö€\ G°‡ÀtåÂRÁ’(?{—3e©àëšž±RU÷©æð$ÊJYwx»ñÜ ª)²ãoÍþlÄGŸÅFŸ<›vôz”ØýØ—ò(ÈX‹ÇžòšË’µ/o¬ {y©½r`•hÝЗ=Uó'SU¤Qm»îªìú~‘ªæÓqŠå}=ÜåÌÂIs_R€éDãfJ™eôˆµI†òð4cYñ›Œ‘m +öTdËE¿ÖKË(;-®Ô¬(è–€¡/d×Ûr+2ú nk?úR~ìzœØpj:¸t`*±-fñGÞ)ø£?)å;šÏ—qÞ¯!9eã'Ó…Œz›`M”r=¡â€3â,êjex¢1ØþìÊ5ýÀdÓ×P&ŸYb!$_—¹ÎZo2§e°*&Ó$0Ä@•È€“L5Öˆ=AÇ +k,XB$õjœ¶ƒŽ˜YÒ_ZUe.#Î :¨`qKUûÇWGb˜{/#kç(°î [D™Qµ¶à‚õ¡êz´úT zªMçg!ï>§ãÀ¥®¶T…Ʊ¡ñ½º`,“X©Úv{®¹ÙV¦N0 ˆoä£ „èœ>ˆ!BA‹—QÕ_’@5¤•‘ ô:@ó,8t…!ål”t:"F G ’K žbý"R§ØIE ÐÄB<‡+—g†u2¹gHrUd®)Ÿ^;Éí£ã(§H+¿ Ñ^¬Ú9šÔíKÀMv<ðá;¾tOΠ̻ Mf'´û4ûî«Â?½˜uö“ì·u” Ùtaæ¨ªå¢ b¹ôé³péÊó$ô顆Ç• #¾l…ŸÙHâãöa|jm¬Uq¹[ìP#¨" Ü0óÆÍe<—2ŠÈ,¥6ÙÈ—Ô®>r’K“RKõ·åª00¹ÁŸ¿ì."ÍDÉÅrá+M¤ìõ¶|õÁqðà6q¯ÍÖx i÷=ã¥Ú&SvaÙÖܾoü¥S/B¸3ƒ뽸5ÇÆÐ¸}²Ü–Áìò4“¹‚î,úê¡§ˆÉ5õöU0ð‹T§ŒäB^=‰é…æÐæä¢âÁŤz•ľÀ„’)%†3–R‰e” RÉ\*l +=°‹ÔŽL¡\f’C áÉ&”Wµþø4Mí¡)àrA³JˆM2§NhùbžT{`ø†½ú†…–šÔ5 × } ®íÚ|¡ëŽr30C©nvÑæ¡à`ª?VëNß]¡>ôPàZ¯Îņ6K®%tSÁLåsmù„ + Udº ´2ÄŒFª± ü”‹áìŠlSª%TÖáᬰR„’ü„ø;°yRëÑXžYoÖ»¦¤Ç™êÍ”¶ ƒîÕtÅù“º¬thu)IŒ€Þ¿rm>«Ñ†j·;j*ާ<)¬s6˜&uÝöÒìº/Wo¿ç%4Ÿ™ »”È÷ÌÏù-—æ +Ûo¸£Tï~Äv=Y"æ·’ëÔh MUÛãyìž½ÀœP¶?›Ç­é)nŠÏæ»Ì‹Ì'áãÊ-ØÅfÁêDC6:۔ǵÈ4ñ•‰¤æñ`\ÇÎfæM™ÃxºƒËn ‹7â2¬ùµFóµÁ‰K•êgVYkòë¡Ý7zæ² 5îÕgŸŠøWìGAÌ[Hì¸ë3õM©ù–ªö[ó)ÿçìë0þÔŸÔìÖ—ó¡9Æ'W[‘¹aèOj¯À`Ž rÝÏ=TMç§ÂOz{«½+:™ëm¡;Euœ É¬ 3ï8˜Õ0J)Ü,oʈNʳ“³ÌذtÊ”'þPÜzy¡¶íÂR©îãi°k>:Í|0aó•yBûµ%à~‰ëíh®µåò\®ãúBè0h‹†jʶ„€¶úÈd°¹ÖËó4{î)¸Ýßzó++­TáñÆTç¼bÛ(õ†žIÐv¿öã{^ûÓXßýÔ²˜*öb+Ì…¸Bs–Ì?p¥ÅÚÓS¸­J 7]ÁŠƒŽÆ ki` »¾ö¦š§ÄßùmC„ÂŽ¡4__ÿéTqÛs7©ã¥·¶ãi€¶ãa¿ýËÅÐBTg×ÚŠ¥#À2GûÀ7æ‹»iαîÄDaãµ9Rû×ˤ®—~Ú®{²Ðî; +õŽ»þà'’¹”²ëºz¨¶ß™ššYX£ëpå»GÂæµm¼Àz:Ÿ-¶~¹ÚÒò¼¾ÐõƒÖ ¿ýÖU÷ƒEà„bM„ú_\çÊ}Î|Û³ÅÚí|ùί—‘ç{€û [Uk/F¬4Á¼Çš“¦îø ¾ó¶»f÷]yÈî{¼ºýŽ'×z}4[ņ£SÀºËö;SÝ«Ê&¨»¿õ—z¾–ó;þäÉv¾\,VC×+{œ)ßnï ™îø—Qšž„pu—¦Òû©õØä5–¨uƒI Ýu™¸ÜD1½ÙF"¯O9’ÐŒ!v§b |””w mð µ5ǧëÊwŽÓ«ª“× Pçµ8m÷—h:îú _¸hrëì) ñ¼ë•«­ q&þ®Ån&yÙ¡—rÍɇ‘”©¶z»ãÚYÈ£8ÍJâŒÄd0E[íq¾Ú‚öáÚ¬{0Pu›ÁƒE¬¥š$Þ‚‹Oµðr*J_¸j¶Ý÷ +Ùz×OÝrÓjy§TXér7Ñ®;>_!iÐØÈ2£:Øäsi³{YÜB]Ïñà¹úÂíXݹkI`qûºû1A\/‹»ë¦—v×—Áê÷ÙÎ+ (‹5eÇÓ%¤†ž æ êÍÊb+6œäV$ÿ¥Ú‹¤ÎàH¼›^[Ö5±¼@~íѱ\Â:KeD¦ êè—¨KöŽTïI5.+÷C®fÍ#6ˆkÛRЉ†Ðåƒýk¶ÝóÔµ=ñÕT˜ŒüW%Fsa<â4¯ Õ@â2ßpœÖ=RÚk0.Éõ6…®¡¦\¯mOü5U§§‚£Ž{Hˆc¬k(„¥˜hÒJûSç¦3³µí÷}C:n¹ Î3ôŽØnâÏ6^s¡ºùíCÁæÚ^,⾘ÁW˯?Ojª#ã…uG'°;»iOߌŽ8{6C{æærÅþ÷\ýÙ©ü†ËÓ„UmÔÇBs÷é„ÕíŽX׃>øwÐîº^,ƒî‰¯§ãíIüªB$yh¨ÁzsÚä+>:Éq‘êf¥Ô „V +Öß©†Alžæ&­¸¿TKâ «àrSí,â¿:ïz«{î+Ààví§ê y ´³–—š+#2Œ¡-«ãTBœ!xÜÚ¤2+ml±4N(S6<ÓT¤LÛbKÊT^»{´>74 2+@‡:3ºí¡±Bµ“+¬¨naé®Ñ!5ƒB ­ ©¢^Û5ú·ºj×X¶ç…·îÔÕ˜Ðk +Äc/xØŒß29Ó«Ó´e0t(‹{ÝÁqT~`Ç3oiïyÈÎGJ±ókOÄhªEb6ÕÊkí,•6’jgiþE;Kµ÷Ô‡¸¿ÀÒ\©W;«œjPm›´Â~Ц Úð”KÛ=ügØÞÚYš­–IÛŸ-£vLæ¸BH0TÛ‚Ö<ž£VêõƒO«K:Fà3‰1…fbT^èËk[ï/“:^xA÷€‹Áóã •B¤ÕofxÕž±ð1”ƒX»w’ØtÆEÝ~×\]±ë…7|Û“%$æQî<ÛðãÎý'w¾û[/íñg—Ïiv=” µ'ÐuCè<”íÁe4XÓuÅÚã“ùMfc-\•n Ö±DòrÄum×CÆû­sR½bèàBQm¨ÔDÒ\²¹—§˜B‰êÕ@:2ÍT@ì&k½-Øçê]Ï©vV9¹¶hgUC;‹äwÉÅý4«73V›KâÞïÚYB|¹…‚äÁËT 'F +Zò^!áFbD‚ XË‚ŽØæ +Øk5ÕÇ#qŒ®‰¤UôgcWCŸ LoʽÞtn6eqCg‹ÄiåÌBóœk|îõ‡§€Y‹ýhT¿7a•Yï:pÕøÐÅYB;J“”gÑ«Õè(ìyèõA1ÚY:F.ƒžIfètá¾ô‡4 Yæ¿kg †vå•þ¡•×W—¿}¸ºþ¬‹®dïX ‰g”ÿbµ9ÕíÊmB5s×ÙBÇR[Üì–¾6øB2®êØR jßõçæàù$öï}~qïóó;Á¬†} IÄV³*j×v i¿é¶ín­›ºîþ“;ÏýÁß÷Tñß¹ó–‚;¯;…½/ÔˆiÐÐÔäo¦.É2Åš„jŪ>búzkÄxèf±á2.Ô@µÒ}ÎRí¹Ès¥ÜŽ!ˆÐöã"W™*ùP…BÍ;1¦:¬+ËúS-öÌòš¢-ŽÚÌú^½6ÌùµG'ò]O–A—ë‹J’÷@[:ç2àéCµ³”¢Æ@ÅÿS;k$ÖˆeA:&ÈSAâK´!â“6*§¯6&×L›m¦ŽJï#Eçô…†7Õ§.l¢)Þâÿ)$å˜!ÞS½ rmÅÍç]¡ñCùôé묑·jH®OüÀDMóiWõ†CSÔÕ'RͶòÖüλ^Ø{ƒµR°¸ÅŒõÖXKùC; ñV^g{–rkl¡Wí,è%£6û/í¬’^í,©÷Cã_tëI‘¦˜»`økVÖZ#‚ÏÕ–lNõÌV5;èò눌Ø!Eäô¡Ú[äù!™ìð|ðÖÿõù¨ã5åÛG¹M5ûk4_œ§m¿èR¹o¢:¯ÖÜgè=S-Ø5‡Æò;ßxI»¿—# íXhãÑç“Ø‰5¾åõÚc{u×S¡•ý¬âžW +12)Ê0P©fäb´jG¬g)5 4±Eâ3„úK3KJI•ý‚åaL`Ï)^c¤Í­¶Ó•m tÔåTÛq§òàx¬P-ØÊcÀ°ÇžÔ¬ìþï}ÅÆó³ 7í¬ ì•C ¡¥âE†‡v±qø'ªåKÞ< ý®M¯¶Ñd” ‰Ï¶-íF)2ÙTˆL2Q'’ø í.â“¥ªîÑÐ@„†];‡®ÙÖÛ‹Å­×AßUÕd§+êt‚F…ÔqËy>îs §››ê®mÅwÜvGl¡ •$ï(Þ6LÌ"ç]Ž®/I¾us©® y˜6®È"4»É!$Ôõëv×îþR¥Ûw_­Þõ\ÎÜzÇ•jgQýö}cÙÖϨv–Ðrc>ÕÎ*hv–‘?æ¢&ÉP,ÚéV7Õ¦^»‡jgi¡Ÿ í¬’^í,í¿jg%ý¡•ч‰5bR[jHÞŽœÚñEÛÁ÷†þrhi3+Éül +mú|RwH1äù¡+ŒX.ÒºTȨîž_s|}@Sƒä%½œã]£5äZªŠ,¨>Ylzh~«ó¶8p?›%ì}å¯ÚþdôÙÐ#ì/çȵ­ÒûraF¾jFÁ‘š<*¿þ&HÎ2J]¸¡´ªÖ눈?¨ßðºXÀî4IòŸüÍbíG¡Wmn/ãï«bo ±™Ä78hÖí-_šW’¸-ÁŸ¬!>—Ô2Rv=ÕüÃ~+vÇSwi糪Fz|¶™òŸÚYY¿kg¥›é¨vÖ©êú3.š´ÊJU˜>;ô¶q¯T›Û8X³~ß䲎Ñ!i%TßšÖã¹S{ë•ùT¯€Ä!èÒP–=ô +¨6yÓ`iUɽöŽFZ¯.”¶ßöäÛ®.æZ.Ì<] ÃþZËlwÂy‰ŸÌKû5UÇ&C—T³ó~ÔüÉìÌr!"ÞX·"לÔkÃÄ-×"I-Û«/Ù«ÅSí¬û‹¥ßø«{žc2ꪅ‘\lÉEôQÄd™°±%}ÿÐÎÂú4¨¾ÒšŽ1šÚƒS4«ë†Òø¾ºÕI¬Û?IÝø©‹¶êÈdhWª“ ,±W së&Úâv'aãÉ™½úŸºPÝ˜Š­Nø[Ä5ô¸jO×®=Å®W>¸_§éºï¶ûŽ$ÿ ]:Y ô£ ©tÙöÒÊÊþ¸§1á“òÍq_Šoüt·åÚhgi÷>æU;^¸A;KØp`z>Äò=£ÄÂÎa`YótÍù쪭¬gUû¬ì"çDÎÚY¥½ÚYÒÆg -ç"FÐõVóµ…-Ž4×$~š-ȇùÍg\¤zrÞ•#¥òΑTk¾|÷MÓéÙâæ s©®-U Ô’ú~U=ãÅö›îRÇO®ãæ"ny­õÇ'AÏ:Ð{Ò¬;9U›³ÅN0‘Ö˜„5 Íþ{ò"º¶ÑýÔÝúÙªïDj,Zk¬;6Yj½ºXÚty>ò$™"ŒátÆbX–)Ö|4)«­ ƒª‰Ë6×f®³·ßðéüRNµdVÕÛ!àH=,'õºŠØ6¯e a„ucèÑ`]ƒæ`Tç4Ï\[Ð2 Ú]¨ù¤¢vGhnHå»F¡Ç„®3•ô8 °W¬_&˜K)E–Èè ±%uÍ¡I¸ŸA5ÞW÷"³h¾L]qdœ°ùê|¬‰¨Ë»FAóñ[ >ÚB¸®¨G©_,Ù< šÕ´Ï¥áòlª”SC5PµÙÕƒ¨3ä¡R‰Û¤FC¾Oul•w8 äÚÓÚz¸9ä<‰þ®éÞOÜpt2Ö44Gi´Gnë„Î;KÅDc•BbpÿŠjÔ5¡_ÐyC–PjI×þE;Kh:7‹Öm«[†Iõ'g WµÝ‡ú]cª"9¾Õj­4uåïZœ¤î#óx„ø‡vVYûHh‰˜S[ÎRuMéNçÞ×í{ µ t¨köŒëNZλ›'6£9 ]³ªé™€× ÚpÄîÉû! ¾ ºSdŽ +µ¤–ï¼»D}ð.ÇüÚŸm¿9{ìpÏ]S}r*Ý7™]Ô_:xOvòÊŠè§“#}­Ûu;˜ïþr)©‡Üñ™á‹4mŽd,É9k¿¦k öº‰1…}ÕÇÒš¹åü|uN£R·Â'95Õ°^ÝíÝ-Øl\%ĪT!$7T2J…Žá£sú ?Æyñ›?Ÿu ROöQ²ZªåIÞK½¦ËúVØ¿D5‰jNOå6]Ÿ ÍhÊÑ>RËb-Jˆ‰7Ö®§zýÇÓ„Ú&a-1Zˆ-0cµ)ÆÐQÆ=tuÅ¡qT…Þë…&ÕÖÐYÃÚ6zɤús.¸gE5±† »¨<9QS¶o t¨µÅÛ°ÿFl>ß›[Òy´{¬¶ú£)°{:ÖXo‚WIëp¬]K]÷ýˆÿž*¦÷“bsÍ„ðTufà ìëö¿ Òz¤Vï|$Zn/ š=XC ºÓǧ m׉[¯/Ö¬Ù3ŽjšCó–ä|4g­94û áÔÅ›‡BKØxf·ó©ÛòÅlÜßÅýfÚë_fAcRõ‰ðóÈ¥ÔÙeiž’¿qˆ¶´Í‰Þ"þk9?›Ýxj®tÖQÏ+Õ †Ð¯ š*$®PŸWц=,ã¨nΛä4Fy/Ô/üœÔ-³O(DâŸHÊÇäõÁçÆÞ3a×3hrX·ÞöåB¡ùÂ,ÌÄ/a]·³°ýñRìõÔxÄ ]¨¯Î«³CΊץ>†Œ%ö^Bï ûhÜÃÚêþ¶+îð©ôÞtX”ê^ÄX¼>•d‚=X ‡N‘ºÒD©éÕDÌÝ4š*8'Üã£Wúù’œVÍH+‰]àsÖ›^=󧪫÷OÀ*îA"gT§–XQM,£‘#á³i+zÆ©›ÎÎÁúŒº‚Øù|šÊ£ÄìÆAØ!$˜«³¡cI^þ+ëÄI5´ì“ò-°~)5~:šGT?Z[ІËÝ<u6½\@ÆdÐË«?<ùÕ­†f{ùgR£P}Ü;‡/§ZO]Mr è*!Ön82…ë|â®ÙsW Ü«§Z_UÖtï Ö±¨êÀx±‚äµÐ7ƿ០»Üyw‘ªíú\®ùüLzO'‹ÄØ™c½úÆ­Cé}@¬G`ïpÞF‡Þ¹u8ö°m_ÐÜIªÜ=šÈ6QiW¡–€nrh ¹u$Î4ÛK$ÿ”°ßªjÏÍêæ¡ô^Yó‰BûµÅbóWܧç#òMeâ +v9‰ee;œØÖ/\ñúô~M>±‡¢¶¡˜cby·Ww`<Û~u>Ûry»ù’ zQ…ø<3èc + Ùfê5;ÆP}8ì!Y½g”´‚ÄЄÕšìMöÐ*TCK›ä£bÍâCN‚M’šË÷Þà_ 7¥NαVVZ©3kl¤’.â£Ú†Ñu>R3Ñzƒ<×úÒ2¬däѨMPïâº#OÂýV‘ج˜˜cFmÓäš©KÚ‡c/”˜g®AøãTçk&$ÅëNöú#hŸGu® ‹uv2ÇÔ™äÚ•;#õ ò"Ø ©fñMŸÎÀ8"'ä[?#­'¯AΓê‰A?úÃXçÁ:yVå@z¯”äDÐgSïxˆ>:>‹äÛØK[A®ÛÚ½c¡EGõÊpŸ.w-ê$h×anÓëÿ°áØ$ºxÝþÑØï +ÝDhb¿ æÍȵ…¿Òµ §q©æÈª NÎY\»}µÓª]Î܆ӓ¸š“„¬&[äsôܰïeëõù˜OTc+&Ù:ኞ¯«>ú:Hìù:PÜýÜŸ[`“iŠþädìÆ@§‡Ä t>B{0©ÒŠ~n:¯OLÓ8>ŽLJãÃñáøp|8>ŽLJãÃñáøp|8>ŽLJãÃñáøp|8>ŽLJãÃñáøp|8>ŽLJãÃñáøpüÿ|Œã™¹,,-¬Ÿ¹àÓÏ|Œ»ïìòEØÊ´¨Ô~æAäG!ÓÜSÓ–ÅF¤Å&%†¥f;ͧ?XßeNóÆ„eG¥†Lq ™à´Ài¼»ïŒé!ää·œ&ão§Oéâ4Mï4¾÷…Èïd©±1±‰ä‡Êˆ°ø¨ßÿvþ×Ï|Šë왳¦Îr9ÛÉu®ëô©.sæÍpJøü|öÜ©3gÏœáO>‹þ ?w¡ñßþÇëÄÿ¿¼>ùùò~æ|?óÄ~æÁýÌç9Ÿà$NwrêgžòûÕñŠšÿû÷K£Èüq­È_Ïp¼û™O[•å(ú; ä +ªè˜Nþ›B¿#ï>{Æ??è,'­ÓŒ9sæÌ$ ,ÿ·þ¿ûý9¿™ëäBÞ~Æ\ò¿éä[útò)ÇЈžïä2cΜ¹dœ}Í}|yÆÓ#ñ ä™@e¤œ1Ä#P +7”±aAÁ²h‰ñZ¦`üüÕŒBµÜ@UhŠîGUt¾©*:ÏT™a"פzºË˜% }_/‘ ââ ‚t)†Aª8C/?YæÌøxÉÑäÚ冊¨•&ÁaÉFlÂjsÕŠrsYTމ¿"„ ”…3 A)#ÒŒUQ¥}¡YÆþÁ!ô½ý‚µä5”Œç_òUÁ‹1†è†ÀÎõ€€Pú7Áb¬m +‰6§fHFº¢Öáè°G,¥÷Æ[ šv¼¬¬ˆ®St cG2º4µ¥-#Ђ.I.<ÅX®iPâsÍAŒ¥—ëNG·&:ˤ„|sJ¦ _Õ+rÌÔÉ —4؃2E‰%ø{t&-Ïê+E¯4Õ%–YiSÉû§¯³©„Oη Ä„¨S%:9«Ž0¥Ä>2ņè&£RMAÐV°"ÆÅ‰©¢Ë†‹M7åbR)Yd.1.Ï ]” «*U¡J)Ü@@—~9ÿ¤sMÞz{MÕÞ Ú¢ÎèPÖÄðé& .Ðs¯Ü5F‹îÛåäuÐ-Šë™ºv %´9ªKv Z‡ðéVBÚzòóz1»Þ–)ê¬M4ÍUL.´¤$üÍtw8%Ù”¤×E›‡ Ã »êé.vÈûp!qFœjj¢\cº6è̲àh¹"ÌÀ_®a@bR¢cAŒ§”ÇÀ5•ƒ®R¥:ÁHE·‹ ×”ü„LÏe ºNA{åcËÍÙØJsUx– ˆÞ2PMeaŒJ·ÂDL¿ %ƒ®jaåúÁ)F~³Ô[Æ¢ë5,ÛTJ¬í/¦m($”Yª„$C(7ëÒŒ|Éßùz€Øj‚>HEÊ c^›lÌGg™jVYh +-ÕéB +êas#Ô¹õvØ…®"çK>ƒ¡:«ÎV“¿m¨¶¸Ã „mf-¨”r•]e ûã3͸ØLSͪÖ!äúUƒVQ°y˜¦ùü$§ÁA—’×O›še¡ÍZg ’%5¬\m’¶ÒTBÐa¸X#>"Ñ„Ò"ã +Í…ÔKtYêò7 C÷¯”Vb¥ŽÎ7£ä ¢Cщ¥Éªµ•âóÍùå+MAë¢:Äö¹˜Dc!*Å$u±ŒŠè¤×V˜¤®=:U›¹ÑNJ(°’òÍaçèî¥"´{/»ÉŽv?Ä—ZÂ65E#( kãgs¥–› ÑÝ(ô$ø”K¥–Œ±Ú‘œFì]¹å]£@X *o‰yæ´%§ÌZ[Ü6BL¯ ®ÈìK;LÐ KÆvéEÇ›ˆyÛ‡Š %r)ÊÐËÍøH/FÁ“ù¦Í0VHÉF*)ŽŒeš1K +i…a`Äù ½Ê6ºD#J’‰Ê$s>Â@ÎêPXñù@q" ú +‡O¨°™¯#g# ‚ùJW&ç€Nf1£ÑFŒYm¦Ô¦á=@«@g²:®Ø´:>+ÐÁ×Ûq +%T„¸ì¾êe*M²‘RCühH’±zÅj MVÝ mjµµ&!ÏB—m†U]N­ˆSt¿ŠyhHè 'ãcN3È8PjOVµ­&­Ê‰”°—Ñ4ˆŽS^ó`©öÔ4t@¢Cªêlr]A¦ ¾]$ÚŠ}ãµNÎÔ®Ý7AC ;ÆjóÐ)_dI} ñŸ½Ý¼Ä'Ÿ‰ØíV%c%ÄåôE7:lF›Y:­´+'%;F¡ã‡v­¦W ¤öFü²6£ÚF“V9PZÔ~¯EiYóÜZÚQJ»¿×î£-냹¦)ß1ä«Þ®¿Ýδk¬¬s„¦pë0xt«w9Ó÷í ¥ÐR*j†4Ú]Ñ5JN?t‹49H«êQ*0¨ÞñæTM†ˆ·:¢ƒMʯ·W§¯îù Ú+ü*ˆ`ø¬œŽŒ%ì]<ÄgÀ>A­bLÐZìÊÏKÆø(T±EŽ Ð1*‰<Ÿø$."ÕD¥6„ÿ¡4‚˜¬>°øfUØ +#.*ÁÑþ2,DòQ«LùØB3ÐnñÞ ÎÃÆ¸Ð,tcn¡sŠv;%•Ï\Ý_Àù%•Yª3jl@!m$ uZ­5h¾Ë¼Vo¨F7ML±9šb j¥£’ØKéÄÂGhârÌANP§–ö‡oTX‘g†NEMåvgt3Ã?À¶¤8bŸd“vZ¢C±¸Óݧ´«’؈ ŠƒÄÒK:#¾œ\ b_6ðý à +©¥ý¨RFE3È,è’Dn¿'%¯î‡®Cj©Äf3j¬)I?K+éÇ®ÈïËGß’-:íW“9Fü1íÀI,©´Èxñ|ÜÊ>¸6xÀ—k:P—H≯jÐñâ²Ìz;CÉg¨=3Î-RÀ7ÒùF~_€ÜFª>5•ßr}žP÷É4J®91‘v5&­±Wµ×~RÈ+­0Ĭßc,ò~tÂf@L•‰ØéÝúø,´£™ä"‰ÿ</óû³ª¬QgX@©’ŽM-›v²Õd×Q_I™ÕÖbnµ ”.àGAB¡ +ëƒÂ°º}¥v¤–YÑóK©èOãsYÏ(Pgà@ƒE‡3Bk,uIûqý‰ÉèJRÉøÅôÅàóvƒŽU¨€ª)Ûã,&WYÁ§‚އ÷ èE¸¶ö"ü&©`· pó±EfJ(NDgšÀW"VHdþSû¬èv¢ $–Ë4ä+©Uð}°˜`¨ õ—JÓ«BI t§®91Ä^ÚõºæÈx¨€G;œ3I~L¿ß`#Uî#Ô~< $k!Ë`¨}AFÈn´ +· ÁƒËow€BhçPP’: ê` ¹ )•ý ä¡Ð%"'¥ŽÔd:â¿£WõA:­Î†Ú‰ˆRoP ²_b¡…´j½-%<´?s§õwlމd|Ùm÷惰ÏÕž ú;ì“ú€²'øäÕ À!·"5Ápø·úÃ>‘'Òñ‡J‰YÈù‘7€ê¢!ã²³$¾H$¾ÀÓœƒØ2U.Éo°£Þ$o¡qˆä”OꆸUæ4!±Süýç”¶‚™¿°Iø!ÚIüûs0_0§àŸ¥òŽ‘”bE~G?[ÅŽQP§íœ«=4ñd2Ìw¼æÈ çÄÖhœE;2ÝóŒÈ{‚Ö¯Š$5sH¼jFÄ;j+踧>´Õµ,’Bk=Ú™Næ'®Ÿ:{5U/ 1VŒ%5‰I|™QÙ¦‰ÇPÛ‚}Š+k@Q×ír©U¸P¬%!/ÄgãCP·Ç*ÄR‡¬0õê?tùÆ™ø,Äd’ ›©«ŽNÄüBlVL]ןRK‰ïG~ȇųÑÉÆªÈcVVõgc³MAÂÝPAêò^Ú_º1Ö&øÄR .4ÝXŽz]h$ã# Q¡žÂuS…$ìHI²¤Ncóú‚´G•‚@‡)&5n)#äi{Ç@)m{¼Î/ø±‚ ƒÙíw +»ßø©öþÅSÙöÕ<2)Å6˜Ó4H•j,j  ìÆ7_të.ÍÓk­ÙÈT¬á€V9 ¥XÂoÒz¸ k(¤–Þ< tA]&É ’ó,5IYæÈ?5«ÖØ ž’ +¨ç˜S´V µ6É‘LA9Z›IrK‚²ëì@—‚Z ¥Xf5¢¾–Ä,(—ÐÜvO|v/¥o÷h±îÄ4‰šËúSbüQÃyaÇ·>âÞÁÜÎç”J‰/Éý‘_SºìÊ’~Pn ×žØìy|'â5+P[ðñäïá+±.”²ÆŠ[¾ªÍC¤7XCõæùmŽÿkoW¶m ¯@ÜéwwB€àPUÛÊ€׎á.Ip§p'@ˆ ÄHÁÝ $ž–ô9gÿk.ºÏ=ïÞûßwî÷=øª*:ÔÚk®9Ç”=a ÆTˆ†ßøKë)¯1ÌQ×ápÖÀ6‰ÅgA +ù>|ÅqAOÇÁ¾‹,lAþ j³ýççÌ P¦ig­Är~›Ã>êÀH0#öb`wv Åd|–†c³ßq(…ój3œÓ˜ +Í‘™Øja›Äσïc÷cÛÝk?%!_xJrRû€Ù¶¶ çPdñó@rư…º%øNœï $ñÄyÏQ ¤uÀÈwàXý`4â«€¡"üù:Â~Ì3☘+-FìÍ^!uýC:¬t-¨mÀ9†<ÎD('ꦠÒlpLÐý¥ì©óc Ñ{ðßæÀ­`®Éj H%ÅñjOr—¸™€EÁƒ0ÎׇHO`<,,€ûyûCˆåćã 0ã’|Ý{<0Ø…Ÿ+ Iþë7Cê?p,Ô ¥v“e¶¡ýl‹Ž!S ^¾:‡N,ÛF‘ÎúŽƒz&a…ðŽ™%ñÉXÀD¼^G§µhÑéïvÕǘ7¹àç«éP|È{$ÄZP¾¡8 µ"À«LÔ› \HþZÎ!z +àCæ€ýP`#g¢‹7ÑÉ Û Ó*(o9%Ngú1ÂÅ{‹YEÉ&.¾VCœX­%Ž/Ó“~&CW\cU!/%Œ>Àd q ”Q<ÒÔ>ƉoÎ.ðÑr6²p½¾±A-ìÂÈ@ÔŸ¯c»‚3EÔ9pÞO˜åž +xC9'Ο€œMl÷PçzwüÂh1Î[€­êv€{©ÝØZÙ †œ˜ž€™ˆ;F°µø¸ÿXðË€w & lî`“Àî.>0Ñ…¬•wÀi˜øäű’=NCÁ6õp¨ìg/R«g¨í’z§Cè©Ï~–È` wÆc,`=ÂhrÊ} a÷õLø‰Š+Ü@]ý¨Oßø`,ÊèÑ`B&ý™J)A]˜ºÇÁµ"ÌîpαŸ øØ£\#TIMjH¯,"õ$Rÿ‰œL¡P—f1ÔúNC-ã œ¯;ÔÆe§qLüh§˜ÒÏB„ñ+ö“$‡ºl€×€ +à}Â|ùú1ç`~ô¸4‡°–¦¢”ÙÀâ¬êÀlÌÚOälpþröâ8¨¯²g½Æ;8Q½ñ½½TŽIþ,ÔA÷–ƒŸØ.y`AØ/ˆœ_î&éY±‘uOÿ â¢Ø>n*~%•\§ª^œwÚ,öLàxú Žy§1ÎñJUƒs ‰-×dâ«·Ò‰ÕÛ¸ˆ‚ „…å(؇×(‰sðqÈÍå ‚lC„U Ý€]r¸€ÇËáz‹ÅkEÉ[ÓØ!§áÌîcƒ _g!_‡8‰qÔðÿb½'XÊ&t9xok X˜=á;FbÓŸ¯ŸñKjŒØçB¼†iñù› ˜àÇËÅ>9‹Åg“YësCàu¢6ß›Ü.¦ŸY_陨ÉÀp+Ú Ê5G•5HŒý-ÔÈD8‡‡ó"Ùg7 zB² iæë# ^Cj…Ø—qÞ™sHr·}§‡C7ئêx*EÐV2WÛ %wëåtæ{]`ÂýK)‚³vÊXb bõó@ÈéÄ?‡¸%sˆ¶ÈÏ¡7%ÅvH˜­€mü§{ò,`f% P+€ëåOX7ÿdä-±ÅyÆào »U¾> +r,xo„ÙÑ5v†øBÖ<œ;/"y³Þ¿~fª ¤Æ9ø¿k‹!§ûç,ŸHÇn`ƒ_¬`ýûƒM{Œ¥qþÀî·BØ=Sg>áöbîž8›ŽzµÔfXŸÛ ˜ã£!¦AíZrçÞnÙ³Ä.Ùj§I.‰c:°› +„óJ³QM$=¡ ÊQ .%­Ø!I¨ÕÀàG@EÏɹÆq ñ+úåz620|k£{ê  P)ºôq‡ ½më_ù:`9¾¦¯ʼnCøÌ±NØ5±¿‡Ü[)ñHT“º%ÍÄyð`\ +,í¤^jEáÏ×°–‚Z"¨=“¼ çJÀ` +ALBívœ¯¯ãŽ!õ}ɱæë\ðå |õ7ÀépVõçëp^œGk=é¯á};1wM›-u‰R%ùº%Î×A-ï-©;{gÎ%ù2é%ÆÍ&U.ðé +R8â<ðû"yQŠŸÁfÕ’øq”"dÈÔTŠˆMA?ç0‚Ûœ*L*EL¥X›ü/¥k‡¡ýl—OÖÊ<¯.`ìÂÙBçDPóôÈœMTZü³ƒB_¼… Í]J&ð»ÀŠÌùÞ[LEWn5©~ìÄP¯"=ÀݯCÏ |”Ì Ÿoì3¡6Kê@ÙÒ†ôÜ@Dœ^¯G§¼ÓdqnKXe16Oð) ”³P'‚œŸ=vq©?À÷8í=7ÈDh=@_›š§(eÓ쇀ZÌñÙeð™EG¨'ÁÌà(PvÕȉ Æ€Ÿ Œ¿‘Ô/1¦bcË·Jü.'ªøš1qÅ[¨ô&M*®t“0µqà4¨]šb¼m¬«G”"D8WÒÿTŠPß½+c23”û„¿EŸ .i}†Ôf w¶Iòj`ÉÜfÔ°$ßcu`Ѓ<Xie³›*é•é¯uÉΧÏ',Öç‚'õ³ŸJð>c õOÉ1l¿Ø.eǼG“úÄÖÀ;D!…ÔíOöÏVpà§@åÇz¨;5ôsþã©=ÇÂlQ’øÙý?”"’+µ$©UzŒ}´Ê_J"ù)eb3P‡´˜ø”"`¤.ÿªáѯcQzÀv#·Á9Ð>»¡ìÞ“ƒI}Á5i&äŽDŸ#¨¿üëym.±»c>£Á€‚*•Ü©Á$·k2¡/V‘zÿiï1ô¥ŽpN¹Ó®£ ÿçWJüP˜ +Q­Á±•=tf(Ìð@N +m €¬átj•aF¦SÈ…èýJ&¦&ÈØÐá¼ä9Ѐ|r?ú„ßhð‹ *ºK—A;7 Ûv!PV…Z«ð(|EO5_¨›A þÀÀ„qòW3¡^jvD™j—ƒš'(5à˜ ˜âä¼Àb ×…°}¦7k‰®÷èá3µ”²A)ÂDXÂÍÀCÈp”!ÿfj¢¡Ï Cqû†ÊA‘ûkRŸÜn(ì7ékXD¾Z×JrÇP·=æ0‚Þw†ø!‚-¬“ļØJü"`N¨u‚rWØ£Õ¬âùzÀ™Àž{ +¾QÒJºÚ&HSKééš!î é‡îd’ªÔ…XÍ¡†%¤A•èÄ`’OÞ[ 3_`£ÌþÓƒ9œKÃÚ¥É%ºlXþ:)Žm¤ön0‘ôÿ`–ÃØ\SÕ¨¤Êm\Z›QŠÎY +6CýS)ÂæO¥ˆSCeD)âúr`Ú—žº0jkB|žh˜=ÁXSæ=]³P€÷µ6%CìîÃ¥gƒ'†z˜¹ðLŸ ¾ +ì•ø!`Ez¶I–·Aû õwP”Ÿ"õNœ LÇ¢è‡+Ù«M&âK°¿ 8E|ml‰º,«L N*ßÉ)ž­ßÀfÕê33Ô.É<°œúf/‚<òoèÙý¥Á¥ˆšíâôN}If‹ Õ«K]jÐàÎgÎ…½ßiˆh¿Í`ê Ç°¿”"˜¸†­Rœ—Ÿ’ªCàõå2÷Ußq,_[*}¼Vê{c ÁÁ€pì ³=ØßÃ^1ñ…[Å åZ\r‰“\ªû µg&,5ôn$ zíu}>_·…-XɞϙÏ>^J|”ßE DÉú^™˜Ž`sèCÞŒ¹\tÉV.¾BrÆN1òè×CÞCÎ`y˜ÛÃ6!V<Ý(IªÞÅfµÈnWYÊ®5‰™€GKÛxætÈxê¤ßhèA­Ž4c-˜a;…„Å8Ÿ—Ùà×Äø|C- +úE&ú4‚ß#j+Ê|î.—{]šGðÌϾã`^Ô%$ ¥Zâà¼5džzv >úg¯7AEö‡ŠÎ_dž?XJRÛ(Rƒ€ÌÉ=£gÉΧΓù笀™Ž~L“4ƒÔÞ¡tæÂ8RcwTLƒ|œÔ0€9÷”×Òã±¹0êàP[‘ÅVjK¢‹¶õçì8~ÛÁ|ÇÍÅ2ï´yP³'ª“¤í7j ìÈf/b¯T‰ŸVî‘?,9ÊŽº†”É,[JñNYzµ±øR•>•˜·‘(;‚’vDáz`ÌkÒÕ)Œ þ߯ns6»ÉÐ¥¢qnŠq¸ôj=M]jÕ¥P'g=Sgö÷'ÒfÐ?uÖçÉb¢a0äQþ ¡æ%õˆ›I”"<û•"$ŠûëA ‚0écì/;ó·d5¢Ê†óTÂ4Œ_ç’*4¹”jm’Ÿ$7jBÏÔ|@íŽû?ÔîTÿ©v—Ú¡ s?ƦŸQœÌ$Ì”À\ü}`L)Ó¤4è2!«à:€íž(î@/rt¨¥A<Ä9’äz5mùðÅ1ÙýÊ=‚ì÷šp˜ gËY›D`ć\ò%Òþ9`,ñÅ. 3€aIiÖ{×ÇxP§!QHp|Çq^zÔq„â(‹:=ü»ì¤?™+–x„©–dèÁlÌüà¸(†eßÜ%2×ôYÐüKÔÙ G ý¼—0+>ð¨êIOxŒ!µþýNÃ$§Ãq}e®$øáðD”ÊAI ç¯þ9„Ál—³õ%uu¨›Èãëvj½Ø)~:ä$P‹‚yósÁ*'\ÇHíý&fü?•ao©ÌÆò{Å{-ò_Ù²·›EЧ2Ò!ˆM$_ƒÚ(;ÜY jµLj«6¨o2Iõê\xþzÉÅ[‹$^™sˆÒ.ôüíÂT FÇóEz°ÿ¢Aãü•ô…<f‚ª9ä¢Øâ  6GñN>?Ûˆ*ëus¨DÅyxœ«Dý$þK)âÌãßXÆD=]1[æ•5°ß_õU’ÓúdÌgãߪK*t$‰;™´šªÝ1©Ýe7šýWµ»ZMP»ƒ9LrÆ ~„m‘°Æ\YD¡pü‡¹CP&"êI^WçÀŒ¨ +r*Äþ/;&M»¹›Þ¤Ëù]Y@”=¯ÎiÚ&r"í6 j-0 ÃØENî==zfbËGIÒ Ä+Bí‰ïS‚yXÀ}DÉÇ9P9Åc¨gr‡0ö€z<ØäéþY5REР{ËHû PJ;…õÏ|@ž˜çdFfýs–™‚~ôQvŸ}*èïAoj0« õHR#så ê=8PóÁ8ê\àæÈ©!dFÇCÈk{9øÈáá;á V+s‹˜!õ½²æ{YPvÌ ¶šV©ª¨¢ô6u2£pÔc$ÌÂŒ +©;Æ•o†š 0Óß91œ¯óW™?ðûÏ€¢Î=`vÅ%Z•œUP› É]êÉ÷”þ5¹¥ÍbCo/§R+·SqŘ‹×æ1¶‘“`&¢_¥ÿLTœž­%ŠBŽ!*À¨OþmPÙúŒï­Etôóu”âÙ*R7e©cGC™¨OúÝ] +*á2Ÿ«‹ÉLÌÃì"œ 7æÑi];Å=Fb¯» È| ¨j.»5ç «@Ý…°èƒÆy>‹ë¿³}TÈ)!ï¶R™éÅø°.(ã8ÇO‡¾'ôüØ}v$îÃ3‡Ï %³­NIªÐ£…܇>ŠÈŠÉ̉ó£@Ñò$P¥b,íš©&*Z ¸C옪Jbó1÷Q¤/;¬LpØQûR K<™—ð õ^òw o…Zê…ë H¾³„(š¸Á8Þÿ‹0k…ã,ä7 °ƒíC˜»Jâ—³ özÖЫ'ŠPÇ„þ%Ô aÆêü³I]z¦Ø÷’^>Ô°àÿÃ8ƒ;w~ñ£ œ½f°Ñà{+‰ŠÔÓ¡Ïå™2‡¨–¿y¸VzwäqýõÄØ™ Ïf½Ó§RÕAÙQ|&p<{Ìi¼gŒc¶¬bÚ™‰d­°œ€í‚Ú6ý)•\¡u²&üÞ@>ÛOØÓµD;ðîRüÜ"ÈÙ`> Tk˜ôæTf³ÔBYÏK3945˜³‚Z_ºIð|©Kã³ózoœëm!ôЉj{ü›MàÀ¶á~˜ÁÿÆRñ…kd^ú Ðç…šÌã0‘k™¬.=QBõ&ñ©€q´Õ2+ 5Eè]Ãy_¸¹Pâ0(¶Ø…OZ>óHÈ1”Ü7BzÿçB'…gìߤ>—‘ØOò8Uòú!ÜA/ò 3ê\‡Ã, +ÔÑDæûgê­Ž „Ú’Ðü˜2ÔŒ©£Né}¶ƒA]ÔK8×älHÞj&ªtœP%Ãy½’ûXÀÅ0›K”é _æ4Ÿ`.… ~¶ªÿDN…˜JÞ3Ì ù?ZÎD”mEY’Ïcß +v s¢æIsH^ +øÔ@pN,¹˜»zŠýõ€KsA)Kê›»Œ /XO0+à0Û0ò srw—ua/‰_pMü ì… y¶ºHýÛ=¾® A5Ôv@©”ǘð‡«I®·Úè(Á­§Ê¶à˜µü0ôQq~¼jÞ¯ËsÁÿ@Ì‘úÜYÂ…Þ[Aj  >}¥Þ”Ž/ÛÌ\̘M  Vuðè ï@Ù%µcÒ¥Á†¯ƒëþfXÙÐ×k˜s‘Yû„)œ÷•9LJëIz£¨¦“z#Ü×9ô<C½Àý’ôÙýÃɽ*®WgKÓf Qå˜I˜ƒqÄã•s¸_Uã<®ÍfýsQ +üw³ÚÆL¦N‡Ž£§0nÙ3©ˆ’5Ô•O»˜k=ÆÂ+_µE9?ŒéßÌé¼»™Ü^޹üÉ€Êü´“ÎèÓænt +¥÷É^Ôž¾l8ÊÞo—²é]º\ô›-æççÉØ€º™]Å× ” ñ9] |¼’KnÐ’_®¥-³Ê$»SË(Ë”$¦P¨Ÿš(wŠ'×òJ:¡j+Ôg$AO×À\XµHΉ±=—ùÎÍzoÀ¦öh³I­; oP1"~.µI¥Ð”ÆíTt ©KsAV€ÿ¤3Ú´Á·°‰M þê9`gRŸë‹I-•Ì‹ÞZ~ ¾rÞWç1¡V0Š·ë©ôw;èÔÆLFã.IV£‰8£ÞÔ©¤ºmð¡~ïŠ¯Ø vvM§´iÀìsù½>{½I +Òìíw”0µ{»(®e3•õ]‡}Üe.)|÷3÷ªýˆôqÓ>ön +¾Žøwe·ªÍ¹›"ÉÍFüÿµP’œ înK‡¯¢CÞ¬¤¢ë7 +²>«3¹œìqõ!Yn•`Yv5Åd¼×e¶hB® +I0kÀ* +7IãËwŠï¶ˆ¹›]"6¦bs¿úhæ|6©y‡(âõJúÄÅQw3IMêæw*ö˜ßªÚˤÕa‚_­u\‰ï“åD™-¾Vô´.>X +ñ˜Ô;÷Ú†| -\1”àEñF‰ÏÃe0ÿ"O­5•¤véA Š=g>Ο¦0®™3÷Ë3)¯ÜÙ¦±µ«LïðÚ¢Ç?Dôóo2êÕo–Lþ7kÑÛ¿í–ñVLËq×» ló''¦üý ® ç0\;yY‰»´¼ÚIü´ÛšyØ'a÷J¥OëËÕ1¿]e%O¯Èâ*µe‰µ»ØäÆØ÷l}¥ƒ-e[4¤—šÌ,.ÕÒ’ÄV‰ß£å+Z¸ÇÏ–9MµøÙ{¼¹GÆÄGöj› {­×ŒËi帜f1÷¸m·äQí>ñ³VkÉ•6šÎìÓ¡궈Ò;4¸«mîv+Ëâ=¤n÷™P·¾³×>šÑ·ú̸[m s»SÈÝo–Hî4Ie¹Õ{,žý,¹WaÁ¦µéˆ’k¶Rišø¡6Ç¿\ v 6Æ\êЧ·èC¿VœÕ¶i,¿\M˯•‹Ùôj:¥Q|—Šý_b£:ô,¨ÔwêTÆûÂì;™Ë=z̵N#êfŸ!}ý£}ó£ û WÎ=îÆ~ ‹£Ÿ~”q/Þï—ävì–ÜÀk¼ÕJ‹sëäÒ{M»¹{ÍRæv‡jÌ»_D9_©‡Ÿ.ïã>Ñ«¿[PO¿ŠÅ%-§¥%/Þœ±xôæ¨ìV…œ½ÜdÄf¾×ƒ÷Æ…å­…X@â +ÆGô³2qN—ŒKéÕá°/Ø}¥È‚KlÕì>¢lfuz (SB/Ô<ÿ•üIÙqÉí.sqN·\z½M"Ëj¡e—ëqj“¾$³Ë˜ËèÒç|,¥+îâíLDÑz¢.–·ð‹ä>ç!Eë$imú’ÔwzLJ—–0닦(®w“ íÛ6AÖuÓW<%hä‰ÞÿqNÚ[ îí¸HU9F7}±a{>z0=ßÜdŠ‚ö¼¿q°õZ´´¯6PÒõÎOÞ^dÑQ±¿õY¼¬¶Â _G)óòënq^×AiQüyýIÉ­f™üfµ…ené‘ÝÏól,ïÞ©’S™_´E -›ÅW:„òÜêýÜõnŠŽ©Úõ?¨‹3›±2•_ªYÞ¨Øk~­Jù&“Ú¦Í-¤·ë27›ÒœF ɳšƒ²gõGD·~7¤î1zåâW­'ÄyÙÇÝræ~'~ÒfÅå·dó>íe^õîc‹»N°o»³¯?  ~ßK¿üf.zþEL|²dK;ËZK.ÊÚÞúH*JØ'ï,™[ïELÖ=*©u•þi'œöN;ÃÝk“Js-¹;õ›Õb@e´k‰3[Lä÷Ë÷}Ë•ßlf™fÌ•v#ñÍVFz·ÁRü¸Õ’¾öUŸºõш»ÞJÑ9mBê~'M?ë‘3y_÷roºŽs¥í?³o;±åïN±í'é§}R6·“…ØD?í–ÐwÞ‰¨û="ñ&1“߸‡­k>-îhô6ï}&ýP(jâ ªykºþó¶®ÝŽ}Ù½—Îþ¤Ç„âj5ò2èi_Žq)ĨW B«– ®ü]KœÓ.“½*;kýàÙYY\t©ðúw]êÆ7ÑóÏ,õ°fýª)Šî^/Lø¶Y’ôAOžÙLYÞ®<(Uhk^Rè¶ûí+‹¼b{éÓêòIV›Á*—ºu!OcpœãÒzõ0&\/u¸4C[½A”û‹)UôÍŠéþì"ýô6@ú¡8@üé/÷K§øS½/÷µçÛ×ã)í+ :Ø’q¬)Uá]Vz>zûuÝ÷›«´§1hß»»1]o#¤ï›dm~LMûY|=³/?XsÏ?ìe~ßA¥öiÈž5·((u–?h>(~ñ~s÷Í>ê”Jß6ØX4JKšÄ/›ŽHŠZ~–VØÊŠ+,*óÏKÞ6–=¯9.y]s\š×p’{ÞnͼìØ-}V‡í±üˆ,¿ø„´ âöyæfé›…~wç bªW nþC[ðˆ7£ {öIZë¼å¥ÁòžÊ`IgÃEqOÓEiWƒ?ÓòÎ^Xü7KañTñ/Ö¢ò/˜wÄê}dŸ*C¬;ïEK?52åïN2Ï»äìÕn*ôõJ&øÅ +:²f=}å£<'yRomþ¼ìŒüYéqyNù^Ù­zsùÝJ+ó[•–ìýV)÷ðœzÜÉqÏ›­%ùõǤÏjJ¶_¾Žz³ž¾üQWú¼åˆyy‰»¬¤ÜYüð½¥(ó×¢ð¢TЫe‚ˆ·+¨G(YM‰Çþwã÷u>‰“·—HÞU{›( ?ÓàUèYTéã]"k.ºÀÔ¶ž²ì}áV’|¡îbTX½{TF¥KDVµSصrçp¼ÞÈ e¾ +ÿ·¾‘þåçꢣv¿¿νïÉ÷cŸôYÊ×–=¯?.{UuVú¸þw»‰á®6™I>6ø +?ð¶Ü׎ Gš²ãN6]J:Þt9ñHÓõ$Y{•/Sôù øo2QõTÅßš¼æMžñ:&©ëL/}Ü,yÓrf÷û"Åž®g +¶ù½[Ôq”-n;ñóiz£)›ýÎPr·Z.~SvÒ¢þ¥ïÖ›±{ÚFl½›pº15;!"Æ»Ê/Ò±.(<°Â;<£Ì5âfcx^MHIÃÙ ÂJ»Ð‚rûÐâj›àŠ*›àüsY…mhq±CXn‰SxF‰[d`‰OÌñúÔhóÞÁ’¾j?«Î‡Tí'„y}÷Böæ7!{¯["¹ß¾[|ù£)›üU[z¹ƒaï|cÄ%ígdÝâŽfo®ã§¬·&Dú©,„é{ï.þÜæ+ï-µè®ˆ`›;…O~RßQ’üêÃòÆ·d½•Á½¯#Ü«ƒ’üë.¦œjʼ´§ã‰BÖ]è³·ëIôþÎ[±û:¯GÙ6‡GWy*nW:FÖØ†ÔÛ„¼h° y…¿æÕÚ†äÕØ†<®tÏÁç.¥ÂM‘Vê¦H*sWxWøGË?å™”ðbÓÐâEÂ˼¦øNŸDšÛ»[v§ÓJúªé¤Eq‘‡E}a€e[Q¸äuà QVŸ•Þ£%ÍjIï·î•½j8#-À1ùù+Yu—¹_ŠKUDŠeKa„8¯åuõ7}aBÝÑå/:ìÃn‰¸±ÁýtCRòá–ë‰Ý…ØæEYô…K¿ÖïéÊQØ5*âk\c¢k<Ž7g&ÉzßsíµnÚoÅy4Ä{ÖùÅÄÖ¸F\«t ƒÇ­ +ÇðxŸž—:D<+r‰y\䬸UìSây°-;Rò±Ù_ÜÖè-¯ª®¡Ýù@Û­8ϪÀ„Û¯\#ž¿u Ïy妸ùÚ ÿ¿n^»D¤½ñŒÚÛclOaÄWßr¿˜Goœ#ò‹C³°Ï*®° þÐx6ð#~b_çYë-úý£‹^3/0ûΟÞ×q]q©Þ9º°ñ\ÈÃzûˆœzûÈ Fï$É÷ÒÉ÷ +ˆ‡–^E{=cð„×0v £»ÿ¸òN‹SJÛ„R´q‡>Z»y;Z¿iZ½^­\» -[¯V®7Aê”Óm‡‡ã´3ÿ¶H§–ס¿´¹8—„†§=¿ ¸öÒ32¬ÀW“ç£H-ðŒÉ÷:±Ã±†Ìq÷{óÎò°ý­·b0.Š )ñ‰Oyí“öÖ]‘qCT™W àôѧðÄ2÷¨¨ï˜ þ îÁñ‰¯½£o=uˆ}s>:ìí…¨ÝÝ"¨ö_Î1=Ýn ¡ÑÕç‚ëšÏá3GýèqׯçMveÿ²|—ÓÕñú¶écœoO6x£¦Ÿýe¥^Îß×éßã7ëG×Î×@sÕV ÙSæ µÉsñ&¡Qh‰†¡áø1ÿ¤‚&"5åIhî5´bƒÚnª¬qîÉH͸3ty]Ó/üQÁ/¼­yïÓ`Iw§Ÿ¸áƒ‡¤±Ë[ÚÕæàÝõèó•±q¯½#Só=#®¼òˆÀ~12£ÀKñ È9âå[ǰKEî‘ØGÍwÈÍw ðÂ-ü>›7‹\#îºD¾.q»XáÇ}m÷®ó¡~ùäv¶9*úEŽÁ-gC¢]¢vuòÆÛÌ¢…Sb;ß?¼·!ø])‘UÀÞŒÀx§Ð|ÀëÿùC‰¬~®À(4dÀ8üu4¬4ÿ4 M·-_·íô®œ,èÃqãïŒ}Ô^iO“ÿ¡æ+1Yyž‘ù.a¯="³Þ¸Gbö¬Ð)Ô³<0ÆòýïҠX°Íû¯œÃo½q‰ˆ)òŠ<Ôš)þ¥ÙŸû­Á×¹!(¶òÝé °&—p“ßø#;/U×l3Dj#'á5 %ï0~‡ðý(¼¦‰ØâÆãïàûÿe5ÿùcYÝ¿®{þ„½Žÿ½Iø,.Ù~iø¶LÒ¾Æ/6îã÷síï½åmVÍOÂ4g+ÎUÇÄØÔ(¢_¼ÀXÛ$ìaÌ« +ØÇœžŠç.dßÀ—>Èw¬/rŽj/u —~,òÃÿžµa;Ï™öð‡…ßy[½·¼Îfck4ïÐÿëX£ÒŸWþ;èÏk6yÈ<4{¶1Z®smw«£ÝÉï¢?•ÚŸ.N ŠùÒ3êQ¾«âaž{ôÃB—Ø»o\¢žå»E½zîõ"Ï-2øO„[yHtP‰OT`ÙEF9λʜ"®•¸„'–x*_ùÓ:/øõÚÞ7&jZÛ)­X¾MQClpyÿ§Í)‘ë¯Lì¾þç5ô[â`üúröúÏáò=<7ŽÀ^uš‚Æ š‹¦«ìD ·Bë-S•têxês‡“e×ý€ìB·ðÀ"_ÅáæŒHȇק(—A^‰±W¤þjWu 5;žÏ~ë^†1{]µMh?Öµ I¨q‹±êɉÀøBªy.dÈŒ©Sþ¯ý@üø×µþõ¬WùÏ×ú×=˜\™áø + ÇŸcÈéí÷¨ý>Hùϵ#çoòØÕhñ¦ChóÁƒt®ñËD]¼ÍÞæ;!'+Ò¢"^_$vx¬>%²:Ï=þmkT-ÞúB×øÆWîIo]â«K¢^¼vÂö©xXঈ/ôV|àe«ÔehÒ¨ älýw~áûñ×:ÿ»XÓ°?÷t0þJÖ?â˜8~-šµ@„iœEk¤ ¶eð3Œ>óÖ{ë¯_H|꣸ñÌ+êÙK÷˜×ùnñ¥ùîÉ%E.‰O +Übr \#“ ¼"œÊÂ#áá^‰ã{DT…GÄžÎÁú%¼Á’«ÿ×ëè÷†Êä=+ÿËžøóµáøÕøsÜ€)h’ò 4fÀd¼O°OšŽcüL4aÐ<4fà\4Zy7l)š2yZ¬îŠ6ï9H3Ÿ_Áuç;cÜãÄ„Hײ(éÇó¾g‡Ó#°‰|„}e2#àk“_¾µ È1¢©ñ\ø5œsÚ4…+Œ¾ó{uRßÍߢ/CS”Gÿ_öý_ ?ÿ/àœŽÂ^ Ö¤2tš2z š6q3š:a#R™´M¿MµM²±‡ï‡¯B“Gâß›¬‰æ®Þƒ6˜g)ïÌæš´ó¬n©¼ØìöS¯ÈxûZ^y¤5å{¥·½qKé~ãyé}©[zo…kZwµsrS…c|I‰sä];Êøõc”ÿßøÇ¿ü ¬p +ì—Ê 54n  +þi ÞEˆü8~*MǾd&š4p!š0d)š0lš8r5š¢ºÍZˆ±ŸŽ ZÍ% X'NQÚâß5Îè o%îzéóÜ7òÎãó±oòÜbJ \cÊ^¹Å—;Ǽ)p‰yõÊ5æö×È|ìOŸ¿qVÀóŠ·^Z­¼æâšÿëµüå7ÁG 'ž}ÈŸß%~dØŸßÅû¨2h6š†÷iú„µHuòZ4Uu;š>O͘cЦ΢©sM‘Êtm4i–R]À¢e!h‹Só(×ü +é»§ÎaO# nyu1òAkÆfŠè"ÏŒ3£ ÷¸™ñ Æboß:EÖ¼r‰|Uè‰×aøß½éPÒœ5›qlûo¯ üäPâ’ïû}`ÿNÐÈ4Ii +š:|!š:nš>e;š·L†l<Šf¯µÆChúb š>›FSæShÊL4IEM›¶‹¼¶B…¶:׌Ò~Çë÷ð{­nŸ?^–ÿØ/²ø‰glÝKø¢|÷xãc^:E¼+vŽî+wŒî­¶é«qL¨.vŽLªÿƒ—ÍYgö¿Ú3xÿcFó'zìypöú_…_‡&žŠ¦˜‡¦Ž\ŒTÆ/Ǿyš›ÐÔñ[‘Ê„­hâ„ídmª -ê)š½âZ¤ïƒÖî¹­¼)¨sœF¿pG¿Þø#¿o_íeÀ OžyÆTå»E×á}ª*qŒl-qŽƒ3×Vã”ÚZéœÜZçôºÄç>¡Z5ü¶yKôþ×¶Ù¿VDöâÙx¥©h¼2Î𹚀ÏÜD噸¹™h4ÞÃ1ø1aÈ4iäR¼¶ÕhòÔõØ>5±M£i«-ÐŒõÇѬNhž±ZÄÅ¡Et"ZeõHikð¯“ÔKøULwѹ³IÁž¯ÂÂ|_„¿ÅØ«¯íÞ[gÅãJŠœ­%NÑeN1­åŽ1y¯\¢NUÅ…k¿æ·L3íßÞ·¿Îø{ˆT•UÊàYxMÓ°=NÄÏÂ{tÿkJªHeØBìñÞXýæZ4}òv4s6…æ¬9„æo·AsuÜÐ<-W4SÝÍжC?iÛ£…‚p´Ò<]i“Oˇü"“^~¿¸ó•óÏEIyá¡ï]L¨|â•TûÒ+-/ÏU9CP©OÌ醸˜œ'Ô•::¤äãóó7ùyS§®ø·cù@‚µ#âè5DzjØ÷ÏA*gc??[ä$b›ðçD¥Éx}³Ð”sЄ³°oı‹Ñ䉨ÿÏÑGjË,‘Úrk4kÕa4w› škŽféû£eÖ7”6x׌Ø~ƒŸ­UÏk`|DÖöÔëXUjPÈ‹€ÈO=#Ê_¸)êðÚŠó\Â;†¿«´ ùTc×ÛdŸTZå˜Xìnö£ëÌ2‰ÍÿuÏú1ðüü—/éÇÂÃðnÀgm"Þéä1Qù'¤2fÙ+•ZØ Ð4l‡?­–¡ŸV²Ø§£ésõ‘Ê4M¤2K©¬´@37ã3g€Vº¥¼.¸~ÔæËüTõr~µf9¿Áô뇭._ô)ô ‹Ë?¯À¾3úÆÒØF£š*â;ª»k“>×:$vU¸$·—;A-)B¯™7™£¶ñßÚ7åñýþc4^ F#!µŸ4Ñ,5=¼ 4u¦öêhòì?¦lÀ>Ÿ3|ÖT§nEÓ§mG3T4êl4cƒf¯>€j»¡å¢d´b®Òj÷Ò¡«Bš†o~Àÿ´5õÇ´üjÝNÞDô¹ÉÞ¼õž·×˰° gey^i….Q_º+„%ßw›<áõÍîâü¢àûn®­Åݬ?¢SÌo׸P8AeÔìÿq]ý±mA‡à%‡”z‡÷iò˜¥h:ŽÇóVY£Å:6hÞ+4o‘Íž¹ ÍÀþrúøeø1o R¶cJ4k)ƒf­” ùš'Ñrã´œ‰Ak÷?V^Ò>rã}~šf/¯®õŽßaü·6éæqï{¼ö5]=R›µ§ãnø‘†¬˜”b_^Œ9Úx9Þò}Q¤kMxJi©]pO¹mH\‘g䮞^exâ\Û`²žQ$6E*ÄŒ ˜ù +üåÄA30QÅçQ54qô24u–š£Žññ‰§·…ôLÚv…Ÿ©þ˜_xRý¿`kÒߦnŽèž°1¸sÜ&×Ò‘›Î=ºÍ·lœf.¿hg ¯iö‰?iú‰?&þRèmÙs?èdC\äs“Ö|¹k«âɧð’b‡°Æ·Ž‘}å.‰Õoc©/ŽZ.o'€ÿþïØæ°?c9Ø' c•!Ó‘ê¸åhö´L÷ZHÛ¢Ö¡h©cîÀe>¯¯ö};lçë¡+Î=¸ÂéÙ uÞ¥Ã×ù5\çS7rÓ›¡ëmò†lö,µã¿lG ¿Uý?G#°i²V6¿@·†×5¨ãE†­¼Ä°‘ ?ðçÎVE‡fueaììRm˜"=£ø4dWÅtΑ‰çiêâ³æ,Øö?Ø¥Ù3ðë“T0ž¢&ÏÔF* MÑ‚'ÐrÊ-¥Î£’´æÐå Õ£·^æg¨?ÃûSÁ¯ÛQÁoÿ·Å¿vÜú™Ê+$~h­ óNÆ…¼™†Ô_y¢òÿ÷ 'müÐYë¯F?© Ь%hΆÃh¾Ž-Z&ðBKwFË·@KÖÒhÁRm´p¡Zº^ŒÖSþ6žz0d“]á𩟭SÉké×òfFݼ%õ廳uÛµPÉç7ç…ß¾Ùˆ>ÿ°7hæ¹]™¿.ÕOê\jp•_kT›š󌠜·Õ÷ãj¹wUn{ºGYu>WH>¶ù35}6‚·¼LTñã ×ÑâéQœP^bìY¥•øaÖlµõÿ†]*AÖ†±>gxFÌEÓ§¯GóÖ˜¡ÕºGÐÊm¢Ñ–à 7…½§þŠ_¬óƒ˜ò~–|zäJýZnoö¯?‹~¯²üÑhcü;Pç;o¢û™|çe†_ù=ì§NO£NÞbW@¾ªÁ‘ðaºÖƒ x}a)¿Ç8û¦.W¦ïñfL{¯ë¡Ö«±ûÚoÆœjHM:Ôv3ÁØÔ±{ bCŸ®’f×Ñì£n©iê§u:§FÌ]´…äiÿÝÇh¼o?©l@ó— 1ν€6y1h£oÛèÍɼ +¶½»>ó´á¯üÃü^ýï¼tG#¿Y³”_£ÝÅkýÎï·­ È.u )wp­ + —|xî5}l{:Ïù º÷øµ»Jy“FÞRÐÉŸõýá ýVÈ}ywÁè¯al~HIsÍF¤¯£à>J˜c¤R4˜°«$öéªÒ£¡ãÄ.¹s˜¬ß Ĺ}ætæg]Æãú,¡}¦ŠuÀ¥«MÑôQsÿK-è?lSã,Œ±Æ,Ds׉ÑZóD¥­­ÀÿíüLÎËnÓïüÓ_øãÆŸø½õØÔð”q)O¾åLëx+QooÖÁ6)å9ã§ü.ÓˆÖe¦ž·f˜¤t­–ÿ¾—éyï*üÈÛZùC†Ù¬7õÉQÄ׬£/ÞÅÜÿÀ £‹WQ!O—R ÏÖ3·«Í$¹o¤²ÒB˺|ñÃK.ñÃN6¬|ðj›ÛÈZ6>÷—u•˜”ðìª-ô»®áØ/ŽQVEc‡Î@ãGÏÂyô:4k±Zad‹6¾>pÃ…²‘[¯ÿý'­ +~ >O&»žóÛvy=UÙu$e¸¡ë]üÛXfèÝÕ8ù‡ü ¶¯ÁCÔÓmg\À›˜øFª˜Û?ÐäçÓƒM\¼F*rçòúâÎ/®¡ÙÑôü­Ÿôd¼Ûf é•¿m§®üÐ-Úm?ˆ «Ý(¾Ý!‘¾h<Â=kµâ +›Kß–œ5ËêÛ.ºòM›Êl×¢/}Ô?|·›Îû²Ûà)¯±ó笳l'yö¿~ŒÇ1cé +ÚÄùÐtz6fg¯að‘—›}æOöòæØ_KMqÜ¥¿|s§¿}ð0ľAÏîò¸ºhý¦UÈøø©Afw»wIÞ¸œhÎL±iŒIÚÓ« ?ö¹™”óbýŒË |^Î0ºÏk˜¼àSÚW›†=šozÿÇ.úqKÝé1ÝüM:=Ah~RÙÀL„(ùae“üû®É3˜¸ú-ì•oÆò— gåÕg…ɶˆŽ]af;ÞðdäÈ­F'Ѭ©kIŒV&õôÚå 4Vǵ)kЂ "´Qî?@CÑ5Mó)¿T«Žß®ÿ+/ýxç@ÿÑêÁýVçkÙ÷,z\o³'SÓs–~ým/õâ7)[øá¨´¦ÁCVÒäÂåöI)»ÄÉšHoó&Ä +Yó’µ¦ÿ¡k÷f…àœïh¸Z·šÊêÕan÷EÑUëDαS8¯¤Ÿ¤¾©ó¹˜’­æ™µŒüU±­EI¡—üiÍQqN›TœÝ" 2;vR1Åë„~×fœŠ ý¶‰G‘ÚÁ¿~À^N»ý´X -58޶¿>dç~‰Þ{žÁùå~¨Ñé÷ñœa'/6­æ-Œnüm³á^§Az†h—–™ ,GY(í>d?ÒÊ-y¾8ªxço™±¡m˜5 mž;m…Ç¢iHgÇDÅä­•¼¨=Èä4Œ±² \²â¤vmqr§úl5“Ò©%½Öȱ•§%…'©ŒßvR¡/– oÕ§ >ìeêºÏ˜tð{tÊyMõ‹Åã7íKSÞ¸?kàÖýYƒ4eÑ9woŒ¶Ûà »²¾.c>ô¹Ã,ŽKUh<ÕýÕÁè.¯nݹÒ4íËF“»¼¶ÙåÛÍÎÆŽÛºU­P›†VOŸŽD»tÑî£'†[Û9MÚãx~Ü'fvû‹6óºõ€´¼ÜQxÿðö/úÂk¿j‹üïÎ9ú§B2æÓ7LÈŒæÓ÷Vf7ÿÐú=ŸOÛ¥MY9 Z$:pr¹ï%«ÓÄâaÙ ó¼Ú³ÔÓ>V x»Ràÿ`žIê‡õÆ =+õ]s'ïº(­Ô£ù86O[¢ŽfkZ¢µ»ChU«èÜâ—é¾ä·ëæáÇ]ì÷SÞÏ×ñ¸>A÷Täpc·K“Í‚/Ï2óO™a~c®IjÍZ“Ëï7 Ÿ-¢ìS¦Ðg¢'p¶‰S§+3û«ªÌQ¿Q»´ôöÖíH ã•ÀIe–J"¹¥ã;]]°J“¿ZŸ¿–޾¿Fÿr•Ñ­ÅÞmåè'mb2Wy1në–4ƒ¾Ü§+{Tuм¤Üͪ쥿yq‘‹,¯ê´ðÊm¸¯‚rŸhræÂ}ÌI:ŸMÝnå­¼t …&RC†â|ç¡ Wš M—‚±ÚüNý÷|q\¤÷ˆßªãøpœöñ¬áºgsÆèœÊ©w—_'øÈŸƒY>Aoeìš9y—9ÒÖ0ÂkÒFZ›ÔÑŽM[è¸ý0öJ«±8»Þ”NkÔpn*”#¸']@‹‘ü˜ã(¸½T«g~­HJîÃõHQ Qz£:œ9ÊÿÊ<úÔÅÑ”mÐx&0g1Ü"K©7†{¸ìÙãÒ}’Ü™,§v7—Ñ«Ïĵn%¶meS?hÃ̧äMÍ)Áßt©­›©à‡‹Ea÷—s¾šüAU`LÕÆï6nç-ñ¾éÝà×ÕÍ5´r¤®n‚tMeÈXvNYp&r¬¶mÛ … vÉ®†ÒXºénÛÙ¯E#>¦¤£kŒ4·î@zÚÆHhB#‰ÜJÙò¤ýh ÷”¹–ž—Á½A2÷PU¸Ç‘»Üjhy«b¿äö;©ðòg-‘SÔdÚóÒO¢´¢ˆ¢UÔÙ¨ Âcþ#E—þÐå5bou3ä^»x¸Ÿ™ºxu6å?vKVùÜšcš\»ÖôÖ-³+_ÕÍbKVš¤÷­7¾üu“qƲ…¼‰Yùßdf…c ïþ¾ÅÄëÒTÅÓôo›èÜ^Ú,¦e©Cô‘]ü$ÑÙq¦â½4ÖoBæ-DÛV®G†øÜÑœ‡Â½lÀ¥';ë3¸Ø©°§+èìN=Éj‰øn˜»ÕĈ¯7™¬=*ìÞ2Æ5n:g6‰sJžÎ8Äa7•º6ΡàJ¯•ßn!yU}Œº÷Y ¸òMK˜ùQ]xùËæÞ{†+l9!Îk9,¼ò}‡è”ïhæ´×hÊ5]UP·yú^.kª< ã^<×QëfúŒ71~Ìk+z–9çªì0>€ô™JÆçÇšåðºÂ€Gó¥'”VöƒDçšÒ•47kâó·©cŸ¥Æ8GMa=Óf½^pMæA»X˜Ò²Utí³.u«Ëˆ¸µ€v ™H¹ÄL8&N2õ¹9Ó$ôÍ›Œ zòsJ:ÔÑR{eúŒ’¡éž¢3Šñ‚ŸCFkª£ÙC& I8oZ1þ'¤µe'ÒÚ¼˜b‘ÅJvH™è✸0V²÷ð ¯ô_äG½Gï–ì¤Ûhñ Ç‘pÏ0—Ye(Ë-·’Þl–S¡/—‹ì'S¯W 2{5h¯³A«ËTzX‰Â¶*ÉmÝ-½Õ,£/}Ò†ëH…å­`ÜSgжÁØ Ùs;º×kf’û‹¶Ù­¯Úf·¿ï4Ëþ²]èwc¶ÀóÚ ¡CÜ$Ñ1ï°/ ?f*Apo>¶õÉ´Oî|ê´ßh°{Êûæl¸¯T¸ßn°Æaú&2$’œUf\SUéØºÍl\“ðfŸáºÕH‹®öêÀ½]L\ùêRƒ&•Ù¤÷‹Óا0®‰ªì¹à ô¹Àq´]ÄDQ$ŽóY}ÂĪfWz5Dw{M©ræI§Œ~ÞmÁåµí£r{…‚?tèG½ÁÕ_wPG¼Fq–L-N(Ãý[tÖg=Ù£Úƒæe¯ÝäoKœ˜gÝ2ÓœèïóÆ&¯çê +÷¡¥*sÑ’Q3ñWU¤cÈ"Á»ÁƒvƒÍ¬N ¤öž,”Ÿ¨±CmÇþsûúÍD:å7š9î2B`i­±B|ììpé™óã‰fÔÛaœÕ±â#g‡W‚ør½©ôf½”¹ÕaFyǪÒ6ã…iµ›™KºÀkÈœó'v VaÒjµdßX[>r;Py'ÌâiÉ)æR¯.܃ƹߘÍDTo`î.bϧ¨Ñ¡ÏW27aœ°Hpù‹†@Q´ÂÌ>r¼À-cš©ÿ³9ÂS1ã´´q¾°v Úº^ inÞ…Œ{À}–‚ÃÞÃÖÎ_†æ ŸˆæŽš€–ŽUEÛ0þ|eîš4K|{Ü“'»xoS±ÍÜ;{‘ØâØ@HŒXù¡„‹´0Ny•¸‡Mç"ï­a’_o%—oÁXzì¿0¶b­ðÖg=îæ{Zx©yè(0'}Ç€îúh9_»…J¬Ý¦wï"g=ðæBæBú,*ªd{½ÅŒ¹Ó"‚½e^´[²ù-{é މ›)¬ÂÃÃLèCJº: ÒÑ0A&ÀsÀu(}2x,í˜6 x£hkç!&Ìì;Ž*Ñ?‡Ã¶ðãùËá¾ærŸëskuØyuÒs$ãš‚ãùMŒ“Ûˆ~˜³„J,ýÿØ{ïø¶ªlÔ I ¡fèA$€”ÓKB³Bˆ;V/¶‘m9Q"KF–ã8$¤N¤RHBèf˜¹Ü˜a†¡÷;3wÚ[~¿÷~ïóÞóÖÚ§èÈ’m‘D–sD±ÎÒÙûìµöÞ«ì½ÏúNöü¦ÂûÌgúžýCµçÉ?O%ù¶Ÿÿ÷ÙÞ—ÿìÄ÷4\¿¾Ñµëm{íS¿ßÂXÏ|{ú÷zçcÿ¸©v×/íµ‡ÿ×dl¿§kíÙ®ÄÝý›_ºÖuô?ÊÝÿ£ófº·¼p{ãËã\»ß§jÿyRÍ3ÿ×-ÎÎ=çMŸ.c¯¥Ê죯*¯žX6™bʦL™R6£jvÙ”ÛÀ¶|ûÙí³½e·M«.»íöš²š¦Äi®®çaîAÔ/øŽ6æZÄ\>OÓ`w-èwd0Á{èç‚ÿÐ×S<‡¿)ÇœÝî¶•#½›Ÿ¼Ú÷ô׳ëžû(ˆc×·ñèXÿŠ=—`N¬À3Ÿ¹‚¯}^xõÛ÷¹¿T»þçT÷“ÿ3ß óìýDFîÙ~±góãc¾ÏyŸÿëœÀ[ß7;Ÿû¦×n}g¼kë‡7Ôú«8çÐß&9×=sEMóÝCkw¾ÝÕ<¨¦qÑwÛ¶³jç/&ÓbÙÄ˯)›ÌW”M¿¥ +ô¦³ 1"17|hÃÓãëö¿?-øðooFÜ5ÌC‡ù +k]õesª½esÅ΋ñ]ÌûØôØ5ø)ØË½Ëv_è]½oŒkÿד=Ïþc¦û©ÿœæÙþ»ï®½zá?ÌïëÜry'oÙžKˆ³ë_i’Wpó«Ü¼Myv¾åð®{êJÏÆç¯v>þÇ›Ý/þe¶÷Å?׸ûŸJ÷†—Æb¾ŒÚúäiÕÞyƒkïX<Ľ`ãÈ9ˆÛýܶz$æÔsÞ±x(æÙÃüžy÷œá[vàR߯WÇ»úLÀñ…9Á¯¸Ü›Ür¶çÎgyZWŒpÇ–ž¹#}kžëzôK™¼ƒ¼ýÇv×ßÈøn%Ø¿†º×~ßxõ˺úŸ}”üüóyžÿ2Çõð¯YØ~×ý?ž€ï&âûkÞŸÿ[SíSÿ«Ü¹lÿ…ÎÔÎs\«Ž\æ<ú¿ouû{ú;06+œOþOæsÍMÅ5êPó`’§eχlíÁÏDÏò×̹£kHÅ3Ën¼A.›2ù6—µe³ž2g¨i°+±eÛ=gzÚ–Œ¨›‚”$ÇKsçPO×®ÑþÍoÞ€9}0¯k}çÎ Bs»Îh˜»xxÐß<¸nn×ðú{_åÛûádÌõ„¹1<˾гñɫ܇¿¼Ù{ðÓ[}O~{;¾çêßòôxÌ'è9üUyð™OÞ¾®u>ù×òÚgÿ»ÂóÆß¼Á÷¾Šßþzžï™¯v>ùå­¾ GÇúVìºÈ½ý¥ë\Ïýcywù?‡\/þw|Ê8;wžëîÜužûÐßovùÛ-žÞç\›^çY¾ïbçúW®r-zøüòòÙe¢ƒ+›vSUâx"Ö—Ó Áö8ë#ƒIεOÞXçé˜3•ŒKЛ¾/Ú½Gÿmºûð‡7:לão[22°æá1ž]oMôm{ÓáÙ Ï;öŸSOüéÿÊ=—zïÚ>Ú¿öù«kódÇhß’/D;é[ñðÅ$§Î]._|õãWø–?|1É%¹x×<‰%Ã=‰Õ#I¾M?Oþ.Üv®{îÒÓ1×<–Á÷ð1G•sÞ’aøž4æÛóozmB`ËOž¶ÕgÎq7šíl(Ãñ쎯é_¾ÿRœ/Χþ³ÒùÜß§»Ÿøs…ûèLuüæ&ÿ†ç¯ÁÜÀ{äûJ̱†¹‡<+9¬ÝÇþ8Ýô»Y¾¿uùÞø®ÎûãoýÎ'þ^î½ÿÇ×cÞ9´®‡ÿ•u¿ð·Yîçþk†ë÷²C㺚«ëÁó=[@gúæ&ô!Ü|"ãûã˜ÏsG:C0×[Osßµí|\pþþ&Ïî_±î¹«Ï¸}zâ ieU3eþÔ¦süŽ\…¹)ý«\²¼À¿h×h”±3v÷ΆŽ!µMñÓ³ÃóÈG“«s·»Î¿ý' æÖÁ|Ÿ$ÇõÊÃW`îQ’Kl…sï{¬óðW7Â|œä}ð Ú·ç_$Ͼ'ûäöºcŸ9ýG~;ÝûØï§zŸüËmžçÿ4Ûÿæ¿5>þdIý·l®ÿì—kðýûð/~ÖåíË ê\ï²/‚¹ËyŸùk¾‹ëyöÿé\vìâ©Ó=e7‹·”¹Z7Ÿé=ø§ +ßÑ?ÍÀüb.qm|õjׇÎC_tZb¶6”a~’7rÝ“×<ÆÈݧîÜrÁz¸k÷˜Sq•m]ýkïÏ <÷©óÂxç}Ý9˜Ýóôßnw>ñ×rÌmæ~øsûsÑ!f7qåëÏò®4Ðußhïæç®Eˆy›<|À×=ûY îéo¼­/ß@r®yä +ÏÓœxã»Ï[ÿ·Î ÿœæÙðÊ8bwŸlÉž‹ÜóRC«jjËwß«G ¸Ú¹K†MŸQ[†z‘à”à[ºlúòˆÍé‰Ä†`^L‚W ã sBU;eÞÆCIc לãKÂ\Z¾÷RÄ#ÀÜEÁû_´“¼ÌàCûÛ†’|U÷½:1´õy;æåBÌ*_41 óÔùöüRl}özÌo¨à.?3”Üpâu#¾†gß“|‡_‰¾æ %¸Ù+ºó`_ø2XÿæÇóƒÏîóì}_Â9ŒØn%â¦bÎTï⣽­ëFºš;†"V†áN‚±‰c çe¿q{~×0‚%´æ ÍÛ¾î¬Ú;À?}‡¹½ë[Þ¹ý|ÌõZul,Á›Y½ç2Ä}"˜®È?Ä-˜+±ºœ`#oËÛ~ïÙÞE;Ï'+÷ ­n<É'…뜻^›8üѴПÖ|2Í·û-ÇeþÃ=s´çÞ‡!ùü¦ãÁàÑïf»u‹ÿî½ §£SƵïKÙýäOÜÎýßÈž Ç® ,äRlÛŒ)Ó`>ùʼ ÖŽtÏ_9|N0>ØÝÒ5ÌCYtQ퇘§²L¼†/“íBÙÔrÌËÙ8¨&;ÍÓ¹ã<ï½Ï^í]¸õ\̹T ŽpçÆóBwoGì¾sϼzv° ó>|6ÌOúÏ£ ÍÃÜBþƒWb.f¢›’wŸéÚÿÛI$ÿÏÛ {ßø¯ û‘ï'!昷móY07Ï„ØkÖOŽAÏ‘o+]»Þq žœ>ÝUvÛmÕeˆwEú ó¾Ñˆ;Epœ“¹><óÏq‡ÊœÆÁ˜Ë›äˆN,=Óß¶h¸;Ü1”ä”}èä½ëö½[Øöã‰8®½-©¡˜Ì÷ЯdßþnÁ¼_þe÷]@|­‡ß“<}#â0Ô­ÜqihÍ+ nó‹7`®CÏÞ÷äГŸÔzŽþiº·}ýY®ÆØ‚s¾îÑ«‚÷»q}Gÿz»÷Ø_g[äër’‹iÝÓWû¢ëFø,á†ùW ýy¥ý[ß´{ùòÆÀŽĖ8jØg¸–†¹‰|Oüa:Á<}ã»{ß%¾å/%þú}?uøýöÖÀÁï§×üºªîàçUÞ¿»±ƒ][GûWºsb=<Ï€ù½+Œ!>Ǧ׮ó=ðØÿ‡)Ãßß^wø“ê;Žü¾6øØÇ31"ÌeGpÕÞËëVl¿$¸ãUÆwðƒŠÀ¾+alŠÄ'߯»îñ+ÁÖM ùôâÏBLLÏþ/oòýûLÿ±¿ÎÂu \'Å|ÐÞu‡® v? zzÃÓãp}Æ»ü©Ë]ñ #= wžçnÛ2Ê=oñ°j_xPùMSÊnœ|Kî ÍvÏ„Xî˜ Ì{à«[1/‘ĵ5µ¾2O¤u(bT„vüL$h[Î#Ø´0ÏQ¡#Uùü¥Xñà%˜GÞŸZsYï\ý(ø]+Ï +&€ï—“|}/ü­ÚûÊ_=µOÿw¥wɶј“±:8l›‚sèíØræI÷mxñZÔ ˆˆyéý-ñ¡ ˸¬~Å~[ýŠÇ` æiD=Þ0hfÕ¬2—ÿŽA˜í&æÛÂ\ܘoعs(É?¹áظàC?ŸìßóÁˆËŠ9G <æ~пñàXÌ¥éÜ÷.ïá+wèè§5ÌÅ]¿à4‚iýrÇ±ßø‚G~;èÕIÞ#ŸOñ?óYïþ×®÷,\= +søûR«ÏB¬cüëK,‰¾9®=øW?fÜÏhO0ϘwÍSWúî:|‰«å®aˆ±6ãÌËç9ô—r߃ŸÊ0†lû–ì¿”ä®;òy¥ëÀï'aÌ‹˜Y¸.FÖáÖ½Ç|ݾϦa®7ß¡o*|üîfÄ>Ì[zâú!ÖŒ÷Àooqùì&ÌŠk"Dÿ¢œ×?=ֻë|1Ã{èS |%æ}¨¿kë…þ¦ö¡8ïqÍ)´íUÚ{è£òÐÑkŽ~â îÿýTÏÞ_ˈÙêßñ’sÝù×<3–à^­yBðÈŸfŽý¡ÆûØMuúþfÿºÆ‘õãõÇÆ’üvO}W]ÿêï"¡—¿jðlû…ƒìc$·ŸãnÛp&ƺs DÜõjÿ¼A˜Ñß±ûüÔOòH"f Œ»ZßÜÁU·9I¾cÄVÁü…u[^¥ê×>~¿có¹Á¶Mç—î¹Ø·ïÓ[B?¾Í·ã—\hɶ I.d´¯˜ïºýž³ã̯bg¹¿ìùïkB¯ÞLrªÝs`Œ†…~”'Ôú°õ4æÝ{!ò[·lÿåu‹v\ˆ9Pë—=4óÁ¢­%˜`o1/>ÁÂ[¼îÜÀÎ_Š¡G?ÖðÈÇ·÷|x+Áò¾sÝYõK¸¤nÓ«ÄøjH!ÆÆ¢áÚU×¥äâöm;6ÁÿÜg5Áw?ŠÖÿìƒæâžQ~{Ùì*’‹ûð‡ÓêžøÝœàãŸÎrúÕd’‹cʃ_ß14ƒ91 µ¯<Ëݾø¿{â ØÌM_·æðÕhë1_ ÷Þ—®ñ´n:ÓÙÔ9ãÄ/ ®zêÊàʧ¯$—럾}ÌYDüˆû_ºeˆcËéF\>ÿ¡G?™Z¿ï«¡¯Ý€þ¯Ë4ÇäE»˜WˆÕvÙ»ãU÷R÷Ÿ‡9.AÞÃ×0´äõèW3Cßt`uÜCB;æDûÂw ¥VŸMrp>ø_·ÿÓ ?š9w1Ï3â¹€>{àŽà"ܽÿRÌìÙ÷ÝMž¿¤½ë^¹Æ{ß;S½8Þ·é¥ îÇ¿¼µîÍ[šÞ~{aÝ[Ϋ}敞ío;¼÷¿7Ñw×>¢cs÷é|÷ìƒëzˆ€ùï»Ãwø»)ˆ{2cêíeÓ§‚^­õƒzÇ o®®mÕYÞ–ÄP´‹7ëÎ-ç"V +®¿ ƒèÒá8ïB©•g¶‚Ä«˜—›`gþ:ôñôà±Ok1Ÿïènw?±³æ­álZ8±e]þØi.ß‚Á˜».±æ¬ºèÊ‘ˆqBrÊ6v󓜶+Ï$9•ï=zuós#Dçºs‡qfê|6 1V¶qÛº³náê'®nX¸åGwÄ—Ÿ…˜*Á{_­åân|â÷±ï¦×¿ñþÜ;>xw™ÿ•ï¼8fnŸRS¦à4=|â‘\Ü›ž»–àa£xì›é§¾ªixü §ÿЦúÀFì,°ÙghéžK;ËU×L°³Bì,×SÿY‰ñ!îoÍ®r_IÁÎZK°¶Mjù(Ħ Øð$/í‘Ë1ÿ3Ž= ;+ôÈS¾™BÆ1ÌñZ_ë`Œ-ÄšÇ2!Äj¸ë¾¡?\uð +l“îòáþÈÒÓ_¾nï§S¿›†¸ž¹X>6ØékDð[3|ã“× Ž!y·>u½×[\pÿÇS1¯®ÿðwÓ1Ç£wßW·€Í#yçÝ;2òÎ_ªç?ò§iu¯~ÓÔôÞ;+BO|^íÛúܲnˆ8kž¸Â³pÇyd]që«7x|—ǵðÚHÇÌu¿ízÝáÏ«±Ïñ¼úœ¯qp1Ô2Øj&¾ÉÍ=ïÎaˆ‹Dðjº95,Ø +ãfÑ}£1÷yð‰of쬵 [ ;k3bg×¶rT螇.ܱuKÀî©ØY¾ØÚ‘µàÏšâ*óø›ûêàY §ù›Z‡b®e_=ŒÍù8^·œGðñÀŽ‘5‘Ôº³ÝÑùCŸ sz“¼×þŒ'¹¸g ì4þ×XâÕ5,Ý~IèÞcã»~!ù1÷¦c×"þUè‰OªÑGƽ,ïRð™âkF¢J.n‚?´÷£I$Ï,b>cžkl÷}/Ø1g-žG#ø½­w WÖŒú+ÎDì¨PbéH;kçß“ŸÏÄõA'bgÕ—ÕT#žIçéˆÓ…ûnˆ†v(Ôºh„Šubg‘|¥vVdéõw¸<¸ým®~ÕSׄÀž‘<üóïAp»–콄`(.Ù4q,ëVôë–‚.„~ FW$ã{ûÏ,öðl¥üJ¥ü݇Æ`Îjß¾ŒÕEëÏ­»÷È5 û?¼=üèdzIÜtøc=ï¼GË;ÿô×µÙy翨À¼óõoàÙ‹ï‚hÓC3t÷£—W¹Â5wÑ0\“pÍ¿ëtÇ}ç¡GܬÙîÆAÕž;¹GmõÓc;~+¡ŸXrð´ˆíçi¾k˜Ó{Ç ÚÚ`Œ“!‡µ}ÍÙ‹½sí¹¡©ëÜ®àµáœ¿÷¥ë¼‡¿š‚¸D¸¾è¿±eç¼z¦«¬jêm;Ëé ryuì¬+qmbõìú²ÙSkÁ¾´ FûTY|FÝÜ%Ãë¢]ÑŽÓ-‹Ï@XÜŸzù®KB+ƒúÓ—X<í=Á»ÙúzGDŒ’Ÿ¾cÓyè·†À×=p]h÷›bðþçíÁÍÏ]G0ÛÖî½ÂûøÇÓðì ®•b.nÿÂûÎóBˆoæß÷q9ú¤¸Œ®Š-‰çF6ÖšÃWâz Áþ]~xŒ·ãÞ³ÝM‰!Ë l&±‘vÖ+‡?¹ ×R4ì,´·ÁŽmçãx,Ù2ñÊ; ñ’16Kcg­R°³ê!Þ¿#6íKýÂû~h^8 ç.æðµo=} Ô¹u«¾œà™Ýµûâú»·] :ð"´¦Å§ì-(ßÐyÿXó­ËcZ{à*̹M0ûÐרýs¹nÿÏ+Ö?}]péÖ 0ï3â=,Ø Ï_ã}üoÓGÿRyd;±ñHy°¸àÝó.xïã×(¸ëÉ!ˆ•ˆø¸ˆ{^³Ü²ê@dð,g°¬Æß2cG\Ïží •!&¶t†oû/hô%‰õ£æÔ„ËfUy˪f×–yëçžV·dóõk½qÐ1.'ئhwÖ?7×ìúgÇa{¸ ñ]ƒ‹v]P¿â 1*;ý|Üç@Ÿ +ss|Â{÷]å=øQ9Ú‚‘°üŽ•^æ_<".Çáß¿õaEý²Ý—Õ-X1òŽ®]7,…¸~ÓÑñuGçªúÓ`ð‰ok<˜;yïïE‚EðÛŸ¾Æ½÷_v–oÏo&ì¬e{;ë´™8C‰ÁþÁ\Ý›úÞ' vVâ'#vÖ*;«Îˆ•а³žîmˆžæöAl¿}^ÄŽ_ñèÌïøè“ X]çz˜Ÿ».ElRâŽÀ\(ÇüÓÜžæAˆK…>ÁýÁò[^½žü‡˜à—(yŽŸ¸:² ¶®IðÉ¢§#æwpéÃ{øÖ÷Ô¿Ïtøj2âºï˜{ž/÷À«‘8¡µã O¸é´ªÁ²ZÄä‘»OÇ{f׸˜õƒwmëˆh0~Ãzq q§ÝÍàÿÜýÐÅþ­/_‡xˆÍ=sš«læ WúÛ¾h'èã‡6=9±|‰_ v;€údè\ˆe]Û æž·r?öuyàñoªvæHu wêØY‹T쬎áõ;ëYGpû[\(µþ§+<ÛŽxÛ¸WZ·dçE¡ûž¾¡aÍÁ«R«¾5‰Ç—½9ðØg}3Ï c|@°0ÚVžéiYvzíÜECÝÑUghØY¸¾„˜_iÃÁq¡­ÏÙC÷l»”Ø÷{öÚüÛž¹>¸ó§\ÝÆo@ìÊ`Û²3ñ¬Îq\7©[¹ßæ{àuFÁçø)GpcÖ=bÃ{Ñvkë«Tݽ/\Z¾íbÔÅA,ß‚ø[ˆsïßó–èÛÿÙ­¸¾FöÜKpåvн»/ +¥¶&α{Ö}ý=ûl‡Æâþ…c—ç¿p£L}ëÙ| – wú"ƒ] ̓Ñvÿsú/Þ:zæ4_ÙœÚÆA¾¦»†Õµ®? ãÛº%Û.BÌÔÉþû_¸>tø³Y$2îUÌ»û Ôùþäú³Ðºë§Õ8Õà™°=èK¡«[¶ïrb#Á®œ]\ó„¸ Ï§áz©‚_rt¬wÛ˜[_Ę˻ë +qê?pÁ[¾w Ú†u{‰~myebbUÄÀÁõMSxëy +ØPôSw¼É!öú1xÀ—@ý€¾&ž;A,`_øŽb£¼£ýßîW©ÀïÉè+â¾ +bÇ#. +âüøv¼>‘ŒMÄ–YJlÑ5G~{+ŽOÿá¿ ÷ëB‡?>úû€ô'âÒUÏBüÄ–ÁzÍ+íëÏÆ=}ìoâî¸/åÝùSÚóðbgÕ=õ¥×õØw·"v–ïþg'à;þµO^å_~è2Ìeí%kÎoO ØYˆ‚ëY›a|®? <¿ˆµZÁÎ +<ðcÞ·ççÚ²Þ +6¿nùž1Ä×½˜-è{z‹ l¾×¼2°öЕk~íÑq¡]oòþ‡Þ•®-Ö[¿âÄðÛxl¼ÿ‡åƒ¿Ÿê9øáMžG¡®û^½ñìçñžB›^wÔ-~øboKëÐÀ}Ï^k¡g>ñ _DÖ6Ž|}«û‘¾ÄX$ÖØôÊ ½ïßxð½Iè'U׆Ë<õ ‡øÃ‹†ášOèÎ{ÎBÔЂ®u›Fûü¦²áÐïj–Ì]Û/@_ÀñМˆ×]0¶½ueˆa„ëÆˆGƒëÄ#8§KGÔ-ÛsbwaÌX± bnÖ>q¾cBÖ™VëÃñŠë—‰e#w®8ý0‚c)¸åùëq?ƒ`¼Çïåk^Dü}ôÁ‚ë^¼Ö÷Ðû“pM$¸öðUˆùöÛ:±…P®½¸ê¡Ë³š¼ç²ã=žà-ÞB0Pëº6ÿˆ`0Cß Øvb4ô÷ Ž úEkÚ| {!îbàÆ©Šé>ÊÿK7àšFèÅ/Bu/~Tï;ôû +C|ˆ«6P†ûW£fÅÎKÆ⼡ÖºúL²ž`ÀÎòíúKâ¶{ö\Øþ:þ¸kßÇ2Æï®–ÅÃ\àãûí½±Ò‚ëU,Nˆû`_á×°³Ö쿱ü8§~›`¬‡V?>V©÷Ðå8H,ˆ8Ô[ž¼Ö¿ý%»oÏ;"Œ1Ù¿ëgÄg!kV[ŽMÀ:6Ü:÷ð<ôˆnCÜ)˜£¾­Ëúø–às{<Ïýa¦{ÿ‡“ðŒ6¿î ç&»Vœxîgøõ_ÍoyíͶ¦çÙRÿÄGs¼G~WñP9¶uQhÙ¾1ЗÀÈ~ÃáqxÖÍ?wùÁuÏ]Cbæ=ïL +.Þy³~þ`/øÔÃúž#6ÄÝòÁøÁ1îòE»\ à:Ëœµõeޖŧ£Œ|yúW×% ž<Ýé®D°<áYÁ ‡Ç"¾ž_"˜D[Þtxü5˜#ˆ)GÞs€X×¢|scCk å¼ïÇ}[_¾×òÑFû¢Ë†»ëî‚8ʸ‡\÷üµ…ìõ"&Õ#W ήmã»dí?ãpÏŠ`â&Ž‹õ¯_Zóô8Ä¡®[yÀ†çoü»ßQ|K2Ž^S·ùe;Ž{Ò׸ބx\«ö^Žk×ßÞúÛáO®ˆ.îkL vîøžëñ=óýìºç¿ÿ¢Ú·ç£É³×îô«”o߯oò?òë›Cž¼–`š#æ-ø|ÄgÝòü<_ˆ: ¸ò¡KË÷À[¬çñ¯+Ý{~Éãþ.î7“wckF›´ùÙëPÏ£/ìZs.ñSî~à’ºÕûldOô»gÏ;¼û7&¢|gãyg°u0âWL°+Dç­Û‡gX®%¸AÈ7øÄFÀ¼÷m}v¼üsˆ[Xô'jý ŸÀõÎ]z:¶Ïžùžøæ6Äôàºõ£¿»Ñ·û]çÚ/ߦ#c}¾¬À³ž¡g¿ðúvüœ#ºzé¶ ÐgÅz‰Ž¾Ä³—ˆ÷„çˆÝõ+Œû÷ýªu*Ù›GNøm,Öï$†â™ \ Gœ"ßíCµ +&â’/BLä ÷Ƽ-ó‡Ìº}ø´Á²@;Œ Üc^tÿù +žùÁÍÏLÀ5T܃DŸ1˜\uÁÄ>¶­nݱkƒ»Þp}&¸Æ´/´þ¥ þ®?Â3¾Öe#‚]ˆc õ£þºû‘KÐNË>q÷H\¿ ìü)˜G?±¶nÉCaœMö‘—Aÿ"âåmÁŽþÁ­FÌöµ……àsàÞ9êr‚ųïƒIˆ]„eH¼‡±*Œ[ô³ÿë›=~<u^p3øˆ«„¶öþížC_•‡žü؉81¸WO°¾n<œ=ÁµF<´ñÙñþuà×"¾1^£~BÜåCßäÚ÷kɳû†ìé,Ûc昂o¼÷R²ˆëxvxé+>òÞËñ{ß/‰ïXôjwS×PW]ûiK núˆ ç[² ìÌî àð¼ÕÆ'Ç…îÙ})Ù+ÛýíÛÿÁÍþÝOïmº{Xµþ ÷<°ek³¹÷þRÄúÉ~ÍÝ0Vì»ç˜í›gÛ³ãÝûߟäÞóžà~辋ê‹-Žø˜¾Ö®áÁ #øpx†äž'¯ +ÌÚzÏÈP׃"Va±´Áõoy tès×㘄˜ëLÜ{Cý‚xSÁ¶Å#}íëÏ +vn9?°ê0è¨}—‘u>ˆ™H¼åPFˆ/]=³¶lŽÓ]†~4Æ&ï¢ÜÑOÂýV?ŒY|ñp2¶cd\µÿr<ˈ/B{¾ë ýÄÓÂxÏl…Ö‹g7p^a;p¿8¸è¡ 0vFý~$ÁMïØt9s„Xð‹î vl4±óˆ÷ +:Å¿x׈éLð„ñ¼â²½³;„¾âÜâí]Ï'XMDÿ˜&8¯¸f~(Îqÿ¶×}„ا ãÎbÅâ:;̱`'ÈnŒ3ˆOÐ/Â11ëÝõSû}BïÞŸ +û à“à‰!~(âã:®“/Z.Ù+ŸñÙ‚}> ߣó.ÏÒ®¹ÝûÔ5ˆEGðÊpŸnɦÑ'!vÎm"Ô÷¿r=9¼é™«ñ¼+â&"!žÄùE|-꫺û.'viË‹v‚ <ûï=p§Ÿë¹ÿÍë=[^Ÿà[´k4ús„7<÷òȯ'á|"[sÛ†"Nxí±»Ùõòfûýa–ÿè·3=÷={­wnç0|?ý?è»qˆÓv`™ˆ=˜Xi7™×¯Mü§õ±>ÖÇúXëc}¬õ±>ÖÇúXëc}¬õ±>ÖÇúXëc}¬õ±>ÖÇúXëc}¬õ±>ÖÇúXëc}¬Ï þŒ75Þ<%œ +á»mÔˆqå3ø Ô†ÛS‘䨳Ô0±<™šmJEñp²Ë6‰Ð|³ªÜ3¦Ø&ÙÆW…»"ɪn˜`›l_>ƒ¦ ü:ÁvÞK9Î6±6ŽÙÆ+Ûàw[u2:7¢³)‹¨÷NÆÿayšvÐ<ÏÙD‰— ÏжVBgX+2¼#t–\!#whôt==Ñ õÌ5Â;jD|Ôˆ9£Fȶñl>¸tg~I(£ŠdGû¼šp +ø‰§%×0;¯IFã©h|®Ý®Ò+"À©ñlù dE~tz¦O‹ÆˆÌ'êßQÔ(èÙ‰æùžÙ ½üý°¨5‡íÐÀd´±#i'"†ÎL†»ßÓ4/kNFâäÆ6qF<•þÿ—êjSzh|¢q~¤)U‘èˆ7‰ElÝñhÜä„Åçf\Žu¨%[Opoª½÷2ñp«RZ˜Qè†"ñLSÔ¸¼ÙìŒ6§æåÏ z{±X3ÁXWþLu•H_Í‹DçÎKåÏ—v ôVóÒÈÕ¢â1T>£¡<Ö6/Ü@çÍX´ní‹%¼é†üÞß,“·$â­ÕM©ðˆ }j,S¬NOu$óf2i˜¢ÚýE›¢ŠÏ›¹Æp{dZ2rgG$ÞdB½v+V,Vã g*šjêÃØØm'·»¢13#6£P1‡lG ÄÉ›Y¥p¾\êú!<нñ[iý³ˆ+O. ï½Cú¿z‰ÆûзVo.Öt&:’M‘éÉpÛ¼h“ þ̰W<îúj§¥D[$N%’ù3–.Qä V™hmK´GS¦æ× j ¬ònÇÄ)‘Ûd+8µ‚ÓþîXÁ©œž°à”³‚S•¿ü%a§ý28ÍÅŠMK$6mI†aÒÄf'¢íVtš°¢S+:µ¢Ó‚&˜ž`‘šx±š™Þ*µXÍT•L´VY‰9ç…›Ö†b7ÓL"Ùg˜óGÛSÍS" £al–ßXªX\6Æ:ú°…Ç'&-¦ó1=ÜÑÞ Ç+úäµû÷ùÈfzµ¹ˆŠÕG&,{sM»©ùT*ª0ÑÒÒIõ=}J_UTNKYIÄÐûâM‰X"9©s^ŸAW†%늙X»Qo/Ö°Ìÿ0L{G²%ÜQOçÍ^F)K£G¦ÚÛ"MÕ}L´^ Ï?D@ItÄÂÉÊD¼=Ž›à1»dѸ¥L³;uQ[")„ÝtÉ š @†OÞ[œ¿ˆ1ê§M1Uë4vÞ O¦×2ŠéèÔ$¢ñT•©•¥N\kœêÜ®R—RvÀ +[)•ͳ†»T’“· SÝV¢á[AÛLýMäoqôáf{ï-Öè3ÁQ+Bq¥àß/0¡ÙQ±›àˆ5Á[::¯tŒðÀ>NFSóZ#)¬•¢IŽES5áh_°e“ é‘þfÒ X@/`¶³—gE’s#(×Rö¼LOÉS¡“NhcúACâq°Sòe%zà3s^¬4–Vö8>ÞJæ\e"«HF"‹óßNèÇßhGþ5’áæh‡ ªÝ_Üs`íkŽÆÂ&NE”bt™§•ÚÖº‰áØlb8毅N˜CœH¶ÍKÄsó·àý0†È:ÑÒ„%¨ î+·&^ö³4a1¢¶wºyÀ)ÀÆü÷½JN=˜|O©tôCéŸÒ6Ó7%2“ò?]ªù;Mx¶%¦+(^»•½#Ÿ7#N±ìý}B–˜… Iú8(dœd&ßÌ)ò+9&Æ]É*€.Icþ°Ô ¶ Ö +P}Ea©6ÿ=³Êyáx<sFb‘&SËQÙ%‹Åmyþºs›]²ÈfmJ´½-nŠ´Fâ©Yá¶R¶m”MûÇ–õ•ÎøšwG“¯&œLíþRÐA¥b1ò_³+5‹Ñ†êò?TRq€É,ª¥TâKü³òè¹þ­,ÍtP‰h +ox—rz üWõJMš`í)þ6K[Ìîj‰Æb¦ÎˆÆŠ×ÙùÏAƒzf>òå´[±b±œŒW;n››£©èB3Œê%ŠÅc<7Á`SSGkGßç2X4”)“áXg¸«° S§ÂIsŠX)P,ùü™k6‘ÁM¹¹hLåïi'LøÙ‰âq‹Æ#áü_`j +Çšf%L¼kb(Q,©üGb#B«šØýRnïÿÞjK2Ñjª“»‹$…ãÑV3:ý†Õ“hÒ.Y'—ú}Ú4pO.™`­ÄÖsJÿä’™¾)‘™d"}]©]jÈG—,TÜž—­³K=ÇREݳ01#KÌÆ Œ³Kù»À¥uvÉ̸+™³KÐ)i¸g—L°f]²Î.Yg—NøÙ%ú”;»dF•ŠÅ°Î.•b`]êßÊÒL•ˆ¦85Î.5 ܳK&X+1¥q¶ÐJñ(–™6¯tŠÙÁ"Q¨™³ƒV÷œôî9¡yzJ®wNhcúACb×ò SHj¦“keøx²‰ÑË+6°óùŸÜcEUÏå­²ÔbjQ°Ô¢Ê_þ’°Ô¢¥-µ80ÕâÔ$P,gÑrK\+Fp[JÑRŠÇO)Z®¢å*ZJÑRŠ–R$JѸÃÖ`òðÁÖùKâ8퉗â.«5Ó +ži¢5ÓTþò—„5Ó¬™Ö÷xâ)ŸÿAUEµfΪŠË<AƒÖDEb5±pWƒÉ7‚°úŒÆ›#-ÑxŸ€ÊÇÛÚ"áÔ3¹S EŠÕÿÉHk¢¯tD%šŽ*O%då¢ÊŸQ+••‹ê80H›HT:ɨÚÛ0ySÞŒY©›úSê&=™¡l4ÿ§lðßdø'ö“ñ~Vñ§R;õ7om Ãèžô@¾8g½ûŒÜKøESÌY¯’”ÔÞV©$o07KD7öÕÎã·_Wœ÷“­m‰öh*RÝч¶;>ʱ˜z¤Rãµ”•Hþ ¤ úXj3öÞ[4‡?ŽúØÛËàˆ+¢§Ÿ?G&tû‚"ªvõq`/ƒ#¶xæÏ—Š).H­—ŠI'£©y­‘” 'ªÔMóII;ls)nÖáÖ›¯?°1ý !Ön¾µ›Ÿ7Çýi7ßdîSk7ßÚÍ·vó­Ý|k7ßÚÍ·vó- ¦ÞÍ'î-îç3Ôds®®µƒ_J+~¥±$fíà[;øÇ!¨²vð×6Hs´¥¥£=R™ˆƒç71 ³ +Íå29ÓœæÐ32 +‹Ç®H,–èÌ›ÑXtî¼Ü`oÂŒÈùóÚ½\Ñ|–ü­DG²"C“}šYª4i‰xU- Xëg–¿SÉÝZU,ýUE3VÃZZ´–­¥Å“ëçHÔzki±t—•¨dòÜd$Ÿ Þld2¸ѹ‰É £‰X$59ižœH†ã}]°Ö‹î¿ ù/ GbpenUÎP¤hÚSÊŸÃðâhkGªÐÛ û§(òòÕ”(Y‹©BG®œ‚ö`©Ju,Ky‚€.;e–_hký¥d×_ÚÛ"Mà‰'OÒk2EÚdÏ|ªâ0¿¾]²¦£Úè©‹Ú æ+„ÝtIk%ÊZ‰²V¢¬•(k%Ê$“ÖJ”µ•‹;k%êD}\wRV¢Ôe)² e­D•Z m­D¯•¨â¹nÅÞ?UÖלjÐ6Øö{î…,˔ʒÓÏå6Nî-‰ùT*ª0ÑÒÒIáôIFšÍiûUÕ„ãS8Vù]~*-ý­»NÚþLÉõ”^Záe)„—4GË›ÍÎh³™#ŽêíÅbÍNóù³fÂÏ+¢›G³&zk^ÄÔéGýþ’è/‘Fôâ•ÖþTX¼¬Å›‰ ”ÅiÀ-Þ˜àÈZ¼±o¬Å›RèòSaI ¿u—µxc-ÞX‹7¥¼xƒáe*læ°Ú@.›Nè!§þžC)ÞÑZÝ” +/4ó6¼±L±XlÊu¤Ô2`QŽüsB5†Û#Ó’‘;;"ñ&¡K·bÅâ4žp¦¢©¦>Ö‡3–@ðvW4ff¸f*«-É0L™ØìDÔÄ[WJñ|ùÔÖß'¤•6¿gUe%+ËöšŠ˜¬Ì„~µr•åϨ•«ÌÊUv©Ê(Gþ8z©„ ÷ Q<žN…ôk&¼ö–d¢Õ„$wçé˜åŸR¨1WG²±#æx,¤Ô„HfbYR9yyйô]л֊³µâÜëbä€=.h‚±9,h¦ +endstream endobj 295 0 obj <>stream +¯Jí°  ÖJæ¨`Újè#ËÅ)´£“ÿqŸRÝýHA·àýÊÚéÝÒÝIå·ýðíb:ÐVtÚÿ£SSÊÓŠO­øÔŠOûTV|š‹A+>µâS+>UâÓü}úŸæŸKÄŠOûe|šZái‰„§'ó|ž Zª Zª Zj>A?`T;=ðBT3½Uj!ª©þ*™ Õ›H4ÏM†MX¨¡lüÃ7+åJ?ÁÍå¿(- Ò’GÆJœ'GV™~“T¤Ôô`"2¥« kzœâ,+ÆÀ·´7%b‰ä¤ÆX¸iÁd›BJ´…›¢©®If“ÛS]1ëêíÅš„é;ñÌqWbónÑRžv?(­T©,›‚%b¼8àø)ä›´“4¶•YQüÖüó©¨Ñ•‰x{*Ü”cFˆÓ½`±Æ¤YôBgS،˕Q¨XreepÄ#Ó È%cŒöóp2šš×1ƒ²SŠf9MÕ„£}…È–Mî6Ù„v´lrÿ÷›JÄ&›à¨Dlraad©ØeÓ*Ý2É–I&¹—é-ìÜ’rÀN†j-¹N:¡)åÑRØZ|iØâSž4ß4K%|‚ÀÊÒÝ#»V´^ø´Ò ?Ej£Ôr}Ó)yw$ùjbÈj÷—–-9J·÷}"°„íGkªË?W *òêÛ¬<ØìßZf »¢§F* “ýºi1'Ý@Éžcxésìù ¥’?çd­¾…¹ê¢¼«^LåQú g~@Ÿ•Î.•yç¸T¦Ü?ȉÛ686]' ` mQ•N‡•Êd£M@¶—²ûoìÄü_Ü-Ñi7Püÿkãp8úZ"ÉiÑäIYÝ*Ž}Æ–ÿY*Ü‹xL.Ýf*ÖH È+€Ó:âMµ¥¬…¢²Y#q`ŒÄé%=iK%”XÑŽ‘ø ßÓw%ÃñöP9ýpvú>M©¬øä3–ŠC| +,ú(ã³?yüÖ²O/]FŽO–Çbý¥³ú›| +ÒÖ‰Þؘ~ÐÂPõƕϠ©†©ñf]Ðx$5ÌNÄk ’µÌ®Ò+"s£qã/£FÌnSêá”]­‰4©¼¹Ù6-¼0‘D¥3в•AÙ|øÿòȨ_ªáAiY–9JhŽ—l”ƒæD‰—eZ dJxåä˜.E‰ciVdxN‚ R¼$1,ÏÈMcAI‘ã)Y¢X™al¾0>E;„æë«ÛáÛ| uÚhÊ6ˬ£lÍÐN_í¨vÊÁq#É6†vH<ÇÛZH Z¦8¸ÝAó4g³3œƒ—YɆ·3´$ò@â±$k³Ë–hÁV u"Í8‰mUHä"/Ca†rPð_žÇ/¬ƒ’x-:Xa …dÚÖ¤4ƒU¢Z-ïQ(Ð\B¡9ŽOSHAÊ!K g¸Mv0È(Œƒ¡mv¨‡’°´ä iŽ%­×ea§i}#$‹u*UÁ³ ÏØô³h˜3>Z4™Åçê7ñЗ“f xå™É-ÃW”º&&ø+ ¢˜–$ö Ï2iy:Më˜*…ÆÉ¤³xæRåB 8I";I†ö ì”šdJÂÇ9XŠ”šd \!ƒÆâ0d¡vìhI”m,í`ED ‚lAB‚Ö&–aÒNm—%–Sk‚!®ÈŽÐP< !ÈJÀ@¡yìH¸•e¡QN0\iY 4Ž…ÎÂAÁ ¢BÈ襠m”Àòi "¡E|–ˆÌÛ úZ Ye˜pÐ$NÒnC&e +&_º¢ô 4<G3‘´á6hM‹évã £`Œ™ÃéÃÒ Ÿ%'0|ZJv–IÏ;BÁvêDMè8¡¬‚  %PJtJˆ–QB:ÏZ3q ÀÝ«z1"9d’&%Ý™C.iªáaØÉÙ²1P ÍOW“hGºY9‰ÅsÈ)MÌhSY›"&7!þMeÆûPZí Jbk ^Ž$ã˜5™ripm›X‘HÄ2oŠã²ûôŽh³\k೫ª…°«=•$§9 ‚ŠI.Û8˜Ÿ(rŽ}Axe8F$£}bm$SÞÀµÊÎXTÉã QÞôd´yf¤K­džQ#d}xèQ¤ûå ++:R©D¼!±ÂÔ^¢Áë:P¨SôÉÚSÈÆu‹Ø(„¢ Š(ŠF{N&­D¾‘X+ýt£ÜbWìCIhüðBTD›ê26ò3V©C_CF+r¤‰ H¾TéV.ðf0Op¡UÁÛH­èß“çT)_ð7™mjl•Å«£P, ¥[É_èNœPÿ>¥oj‹(iíÞ+bS õƒ&ƒT# ‘#U¾iµeäþÎ3¢M/ Ž–M¤ö»R½ÞbJ„H»ðR«Ÿ£Ô^©²7V4’éãŽãºD³mn2ÜÀÐf'·ËØù´áå1ÚV1u'•ñAÿ +'¿5ó'4È<˜TQyùZ³Ë¢çÅ÷QV÷ª¢©ðçVø\°Oä¹dTTÀÌpã”kȦ„Aö­™}¢}³÷ðÕØ«ý­w”]멌á’5–”aVip¹¾hC4–"ÊQdz6 õQh<ÆAe`¹©çQĘEp78´=ôˆ„½IçEÄÃï£,Z=¢|ž›kåó\I 3GQ6Êhøšè¢H¬&’l‰4¥ ®˜¢º ÈǤÑÇÛ¤q6˜À{Ò­We2ÒMÙ*ÃÉfÖ«­h2ÑW¸Œ©~Uµ#“ˆQ, ­È… ÙCŒY%>S.ኅÛÔk%Ö$ßô +Õ/X1„Eš†ÂöAo9Äô%67‡RldÞIWÆ»¨ZwAÿ«MðèG¡S¤6\i(~!ÑŸþ+ôæ=ò}Ø}˜¸(“m2Ñíà9L¦(*f#X¾¯›%î!–=¿š+ò®"× ËM$Ðj ~áT™pFêYçÃ`F6”ÙfdÃgÊFŸ¬(üÙqIH CM\úº79 rZP\nAI8 )lÏb{¸žøe{ç—R‡,£KF§Túïñ®œ˜1\¹n?HÙÜi%*r–Èf†QxQ¢eŒRÚŸã:R»±"fþkæucEì‹eGCmŒMí õÏq‚Œô:_ÎrL¹ Îú®¢;«D5¶’¿´êi•=õïñ‚\OýÆõÔo\OýÆåd† A^m¼2öXíÏñ‚\O³‰ëi6q=ͦܬð ++ªG¯v†úçxÁÜ'nC¼™µD9d†æD‚#()±¼¶Íˆ»ª4/èë96eÛ‘VNžqi6sj¦ÝYZ‹ÝðAÄ‚¶¦-¦nAiý/cˆýi[y›Ò:ΖŽÒ0€Ô޾‰zÄ–©i!\O]#özå¶!¸åÛÑg•ÁÖ£ÛE„^KËœ€øìýµ¾Ÿ-ðy.¼eÑ…hJûëP"OêÒK2ÑÖœèì{G0cq•"Ã×Ü!Þ $›<îBóä Mk6©*M² Ž|1Ò$r¦„#Û¼HŽÑpjê×ñl 9 %§«Òw5t"ža‚ûøtíiŠ`¨M#ÚÚ+M¯M{¢¬Þ¤·K#(gÓȃätEI‚VowÙ)+®¹‡ùx´@"%Ê„ôi把ò¦¦ŽÖÚD*‹ŠËÚ&ÎN¤j#M‰d3hu60þ¬D;VÀ…5V¦„ì\Y>cºª¡\-‰d«–÷N¸0›‘†òr´Ù™êŠEÒOÏßøX< +)dyÕ€¶S ãCJH/ : †‰r“èÈ:Á wf´i"%ã@©¾¨#O Rzœ é±®W…%e„rêµ°j©ûœ©Ä2YSK#i¬hÕj¼ +úKsÖ]Fù®põ2L”QÎÓÁG&QΩϳI¸ëZžÖºEⵉì#«û,>„¦•Z¥Ûs½ÔŠ+ú4ž‚2ÔZÑt"ÚZñƒÛ*ЊšéÖTÝäYŠ Ep]ž%©LIe~è®`ZÓ$£ÌRUÝTY–¾Ë°Ü%˜›˜­T»«Ý,ÝܧÂ6ZóÞhºIÈ2ݵfš´»Â5¨z”­³³¬~^§0úÖÇ üäôOJ积›Ñuœ@eècšè8ʬŽ#µ‚ÚE},k%úø¸·µâ·U rÔj)ä¾eª™Œ¨ž ei†‘D–¥ÜÓX†ådJd%ëE èf |gyIâ²… +ñ>O9gpã£ÿ—ëä†úkV;×®4ÝD§µ…¹3–«TU¯^¸6xúìkU¶¥}`È{®´þ‡¢Á³Rÿœì€wZ4ÖšWœÛSäÛk¸›u€Ä»4‹¯iëèæ)'`ìð‘ðtµJ«2Ðð yq£*]6ÍP¶E Çñ]Šh,ÙÁŒrþ@£¡Éàh¥ +Ú!á @9HZÉ^|NÉ\î™ÌHQâ(V`QÈ+:Ī «´ÄðäX:#8`êrÃã±hžœx„çó<Ì_Zf)Žžã¡å4%ЂD(¢$£Éeá‘§dŲ —E‘“YPw4yÑ„w° ÆSf8‘&o@åõ4I ï$Ð4ÇᛢÌà G‚L3²L‹Êæ ¾+$A‰)A ð€ƒc@ësÐ8ÆåÌ<ŸÆÁ|y´(6Œ4dÖA± ˜J€‰%¢Ï’ÁÉg âPñ4KE‰¦ó~+a3iŽadŽ!{MèGà5Ô¢¬´?Aâ»CÐZžYz‰œÏ Œ~ XY¾¦i|õ,”lPü¹UÝÄYáöÝ´ÞŒøÂH2iî¾BW‹¶µÆèNŸmGE¦Ýï»Iù§÷¸†üyÁ´Dd’~E4Hm¸]y1»Ú #oºb‰# £$µJ—Í7)A}& + *»zux¨ŽÅ +ß¼^nB’r£ò¯d˜[œ¬“6# šN…'Æa¤Q#|3F”ýàÏÿùgŸÿƒ¿÷üó?ÿyr~ï¡áÖïÖïeýa|öþ{_óë‡}P/€ïƒZh¶ÛtõÔ´òšÝ“v5x}²mZÇâÅ]6Ô·™¾Ö¸¢Ó.WƒïzÕeK¦º»UÑø]ÓN&7dW©¨7UjßÎT·7âÜÙ¾XÖ;sÊ]»¸®Ci)nc µZù3—P³½5|U4Û_3PÞYº†ÜÔŒZ”j²6Õà£)ïÚusÜÒDƒë6®7äÑ´ûQÂIuà @8©.¾{28|·ù$ºqÇSœù8rã¦)³GYÛPR{vâôÄDàH•ϰ•w¤6E=EGÒápöúCuc{$¹0ÒÜ`ƒrW{¦*I¿s,g½sÜÃ&exM„bqù…£ñM² @1øn30+³Ïç àé‚ô¹k–ijyP̦Á¡qµ“Àèxõ›Há› +ðW¢%"qyM‹V~Ñ•j,H±\šX¥šãŒEŒÉP»@Ú V¦ E«L'²"ÙEÕª‡/<'*µ)­Ð(¤6Z¡©{¨ +Sé¢:ßzõ +iEe.™iA²¾smЗ.×Ú¨T3ŒæMy÷ߨxИ² I™­G]'HFÆeh!‘5To¤è­OÓ­Ï ªýªV¯w›Þ +c—kÍ5ö¸Î”^4͸Z»‘ ÷x–̱Ú9¸…èLY‰ +³˜>Žg áPqb¦0y/ÉF¹U¢DÁ2”å2ÌXCõ‚.Jf¤FXÕ«Ö¥¡·À(H½­FIê,éeÓl«Õ º$³$¦J'š® I‰ê w€™âŒÒÀ5k‰ë6§p.2)I3̈† ‘¬§ë7RtY¦‰a‰„]½z]"z+24‘ÖÞ M¤±•ÖD:ëš&2Òš¨»Ôi2)iÂ4ү袠:×ÅAë™jÒ’=´›zÂ] 6C¼øzÃJ† žAÑ$i ¦%™ADVÓÕkÒH·Â I½¹Aê]³‘ É.MKËÎHCõš5hO7ˆNo¤At:'-Í«R±ñZ]–ŒT[M+9lŒ¢3Òƒ46þÊä¥ÁC–2 +S‹Ë”>Ÿ5ªKl I@¤Wm h²KÓÒ²3ÒE½fMúã“Vk¦Ax:/zA[µfõ&¼,)ivDu€Hb1IÌðepI%Õ“ î•ìÏBJ»ŒÚµÑcÔhF‡1]NuúÒ5«íñFw‘¶‚˜á-ÒŒ3«UÃ_NTy¾F0¸ŠÉè)¦ËiÐkNÈã+sHIžææ…§Ñt5J‚êh…§9dFáin›^Nsìôš5‚Qx:Í <MaQ«Z‚ö|£ðÔf…§±¢—Ó Õl èÂë.¥n¾ QxMgQs›t!hΕQzšf”žæ«éUgN¯Y½6ÊN#D—&)üiÕêОm”œÖF£è4Fô‚:ûZÕ‚.ºî2êæüeLZ•–žZª™NO>Õ“2ŠNs¹Œ¢Ó3½ æºéUk£ðtšAzšÂ£Vµ.íù³VmgÆ´U™IO[Mú´MÒÓ¶›œ2½=ƒô]V +‡š_¤‰@ó ¢Ó},ƒètOL£é¾šV±N0ˆ.MK‹ÎH#üéUkПoÖLƒä4N4“$©×p­‰­»|2Ý;ƒÔ4’ÆœæiÜkN“Ajšoešæi$Í?ÓjÕ® ÓIiH„/­VoíÁiiÍ3HKã@#éL«µ®5iu—K¦?g–FÒø’tC¡ð­ùIi©Þ”AXšÃ¥‘4‡L«T»6K'¥…e ¶´Z5¶Õçd¥5Î +)­ê IgY­Ôp­Éª»T28ƒ¬4’Æ–æòèóQu‹ ²Ò¼'ƒ°4K/¥z`z­êµAX:)-,IY˜WkÕøÖlœ‡jó ÒÒ8ÐKiLkµ¦¯5iu—KUß9ANÎÞ7¥nˆ×=p—[¦Ga©öÀõ›¤Ü¨ü?Ÿ=pIä~ð¸ºM§ýûÏôõý±,ó_í›õ±>ú'Ç*;>£¯ç ýœØfZ9 h¯Ôdƒ +lÕÉ(Ìu :È˲#­lBçÜÝéFÎGÝ6î¾Ã£ ÙãQJfíòt#›ÙçÁ¢Ù;= +Çíõä’!©1®H[Û”´Ðöýsîu#›Ø‚’¹v€\è>)š½Ôlb/ˆ0—µD¨íå’a¯¢Ï¹QÔlf«ŠæÚ,"äB¶‹HÁ¬ £Lª‰-#ÂYö¦!´m”K‚½ <×~R7²™%Ì}žcO‰ ÛU"E³÷•º‘Mì,î²÷–¹ Ý¥\RìUè¹¶2©ùoLaö–˜jfSÌàf–¥ ^¶©1ƒ3mXžÊ¤æ¿9–ö¯ «T÷š6³A–Cj½Ë8ÇΙjfïÌàNgʸ ý3ƒÏœ)ã‚öÐÒ~t¦Œ ÚGË!µü|èL´ÅfðŸ3…\À6[ÚKΔp![mÇ9SÂm·åY~Ns7MQÈNœÁaΔpA»q¯8SÈíÈ<ånº¢]¹rËËKÎrv9CÂ…mÚÜà ¶q—v3\Àæ]¶¼òr‹3„[À¾^Ú%Îm{{iÇ7C®ìï¥}á ¡°Ç—-§¼üà ¡°ý§ûÀ2-` 0íéfÈÔü6`ÚùÍi[ÙRÊËñÍi»„i§7C¦ì¦]Û ™°[˜öv3„ZÀŽa¶œzjÏÉlNÎëRoòôæþm‰Ö^Œs¿ÔѰ?XÎ!b”‡– +T:‹ˆ¤’WÎuh4„säX‚bA³½Ðy”¬“$­„,ªoó°¬rÆFy2YðdšQËX´‘ûT<1Fñc(t—2ˆ¤Fò¡ÈR +)H)Ù/ÈŒÕw€zh‡RŠ"Nœ"-«ŽJ©JSDC[%ù(-]ÒNª—Ø\$ô )NÉå¡Ë†T”˜µe†ûº56ûâ€y ¼+h`žhÚÆ‰‘Ç?<¢ªÊ'=éFM8‰5TÆí€®:ßl“?‘ÎpRÐó?âøÂ]2ô/"ÓÂÀ‘ü‹—ÊÓB)‡/UÜ ’êIùM+CîQR7ÚÔ\NÊÃÔÚÊíx™þN*•U à 64¹2fVR²ÂJp'M‚#üËav(øA"MÅ¿ +OÚ/öôívIy¶’k·Jù‚?2 +nªRDùÕ.)LÙ%…ý7CIÔ{RZó`r´Š†”;³+I–NõF÷QV¦èóÑæóÜž`Àúz.ØÜ`r¢a0«#™=i']™î.MøvUú†¿zFA·’ù'}_º°:VÔZµch¡aÚp9~@pˆÆ€ l¹¥‰ï¢ŠrY‰å¾ÊÊR# Ÿçö”‘¸Ïç +lϹ«Õ¤Ð'1×ãÈëë`àÐÏ×Njs .‚k?“ ßeÚ¦ü¨€`i_á'Æ‹r$5³ºª>R`–;ßXv­Zí1­é'æjX. ·eU×{k|œ–¹œ°ë8:´‰ \<æPÿÇßDÓýË÷9¡¬æçí$ÚÜm&€v ɦmÈ.Æ’ ¸F§¤ªS²¢+î*køÎ¤¿Û7ÙYÉ ‹—Ã<ävnW¹TßXÀïÊéò5 ÙKŠ$_¬UAÌÕ¾V¥Û§^ÁÝÄ WÕ¨ÕãIrõ¡UÚWí­(¶ÔÈ´Á?"±³2©«Uûªáé’ïi„UÌŸ­c¯*Q0uõ»&5¬Uá‰ÒdF +“²X¯¤¹nêÕF¥[¢ß„ «$s·‚¼ª ‡JKÒ»ÎðUmÞÎ*cÇSªdiòWgÛ¤ ¡RoÐqõÕÐç‘r…á3yJÂöýÛGé>Àóxv/ð¿}•î Øè³{¢5³“ŒgèSCO†€¡µNÔ†Œ>ª #º[/ûßРãê•¡wÓ£‡CÉŠ¼sô"ô•룼 Qjxy>¿‡þÎëùY`½iåÐj˜ùv}êTJz¢ÙÓ3­»‚0ªuTfh£²SOýH_˜eFè«Ʀ¯ò23(n9ýüžú1ŸçgõãÉñ¬‰Œ1¢”áF¦*­LH† oK:]OIB©UÐä j”1VÌ¥GaZ…ÜbøªÞÑbRX˜6¦3G]öl)ñ䳬C9Á= ±=wòAˆR¦=Àþ´lóÍAñøŽN«rÉ;šfïØÁR4Y)h|Ö¾W’1(bšT•&á^îIÑŒ ÁzÁv@ÂUKu¼ +ʦU¥>€Á²+9(YMa% ¢º–MnʦhõJ÷GÙ»7ÆÞ½ÁäØl¾ìFÖÕåõLÙØ’³¥Ú4Jó†@”'‹6ˆÀÍ;X‘³ù•Ÿ€Uœ>ÕjÅåä<­ }­ÔT¯u† Èy¾?]™²zo|’¡éÖU*ÃAk·‘§…iŸ.òä 8ò¬À*¯LR9Œ©’ªÒ$FT6ºªr”¬R_XÕï$œ´¦I¤sÕd +¢ÞÛF‚±z¢hWe?KUÙx›áñö ‚^Ýéôû_gVŠ ç‘«¦£ÕK­§D,­íÞä$¤ ØÓµ)WžcedÇÜ dí»>†pˆg8Ž&–*ëŠ×›”®¢[íéGWö×ývÎøyZaCbOþ®H­Ó™Û0hA?³ s›¬ûb%#AYÊDË ’ÀÉ ž¢á; Z‘ð\,©*€– >äunŠ,…›têS±”ŒG ¶„á¯x•Ð\QÆ¥%Ó+M”Š=¤‰­$)–E`1ÏòB ž±e£ÖÔMJ1m†äzVÎx6¿ŒÌê…’ˆùD<©šÝíH- ãÉ9õ¬®Wƒ›î|(–£ûÉùÞ€ò +A÷! æ­6=rHÔF¬¥[é?¥³Ç5dt÷ÉëTàÔ8.<‰\úÝŒñhp2Ÿ~[ª#{ØÊaô*M.KÉë€ßÏiÔÌj{&¶(+:ënã¡81gNâëú£Rä49…ý £U 7ÏSŒÞ3KpÕh̹M K™X^æ…˜¤:ÁÀšSâiÏ„BXÉR$V¦d<šµáá50ù<Çp’Z†Àí€([{M dzHÎ.á m0þ וJ¦!ô^4ã€pDÆÎÈ”Ë/b×CˆÖr‚ááKž‚3ÀÎɼëÁˆgh2?ßá¡"5s—¬ÿ”áe÷€ÿ…M‹&K~•ï„,ð¤c•7H0+ÌM±ÕHШQfÈ«G :p!ÃÁ YN8AK!O^EfÉ 8 @ï ¤¸úz+($1ÂI8+Iò,‰ì ü!‹¨¤Šˆ(;Fõ„ÓŠ••ý<u<[û,^ü¥‰N癦Vïíš8U”„9Â5ÎAÀÎÁé4êÅä°¡‹‹]Ï¡G‡[‰+hQœŒààxVÉ¿ÊQqþÉ)>,E6ç•·xå0¯RI‘7ö h7­±­$øz|¨©ûÕó“Ø[4§ÐE£ò£Ó=“Õ{•9z´ªï°?°¸-ç{ €#ØàÙÆ¶?¹¨S¡ 5+ÃãðÍ^Y.bxúäû¨ó$’­2œÌc ¶_®¾Òål9îšh+M­`>SŒ¾ÖDÑÆÕ FTüÒ¸wA)ûîȃŒ$%ij»4.QèŒàÛWH‘È**ÙŸ"3K§¡AT³ºI$g¤àyйŒ¬^£!„Ø žÍ’"HÐRˆ*-ÔHUF’  ×j4DQÀeNâ”õA™ÇsuðTõ…–ˆÂ®m¨­6"$DvÍ`K¸&«!ÀP%KªÔBRñáu´ +uUºÜOQêQ¦]«ëÁ +/\º* —ü´kåÅVNKŽzX79–ðŠœk*«Âyí%¯¶E¥¨m…É!« _²ä¹ÀŒF€àëŒzie,e ¬J-}¢Ì°ÄZPŠSDŽ!:8´m`By‰WÏÍ*$Ò_£œüR‹æ éµ)jQPW&´[[‰Ö%™6–N“Àß–(5G±ZRå™ bº,YKu()@·sèfàS$µJ°ï¢¨œÞÖi†vkEs´Úªô»ÄXÑi8õ jãXgȱóŒ9kxHVmi+b—ÔyL¼sÓOyލîOðˆ;iƒY) +Äô©×™q$„S)’öµ2Cˆÿ£Ô}pãɘ>¼aàdŽå#žËÞÇó¼’ÖAl¯"åô¢z?¬ÞAùÕ&Slã§ æõ4~Ì6/÷øÑ^'9Ydh"l™#¡ D)2ƒóÇIœ·ÀoòòR†#O¦ ò(ˆâi€u5¬žK¢äS­9•Šœ†¶× +ä  +µ¨bs·#¢Ý¬ö}Žú«"J@;#áÖ‰lµÛ «3;í €f¥5é6ayÀkÌZ޶^ùÅ3Ǹî‚ñlå3*’0MbRGU´&sC¥î°kx†ô¤ò–«K {Ý;‰ Jlš'N´iÿÀ|žH|º‰6õXsZ-Óú7Já}“É`Oã +ù©Š¤ÇTwþ”;kpîd‘l|.¢ÂŸ È„µ±™P=ÉädK£€Ì ¹F•CþUþK;ïTïm.ðùl÷ǃ3NÀ‡óäá8•gó6eé_&ÿžÈ'çÖ¼íóÔ.`È¿f¥PȰ‘•ß@!8S]±x gÆqr…žÇøòXW{{¸aºs‚mâlüh’'–ƒs²0¢ß4±2ÑÚ†}8-ôî“]Û”[²NTï¹c˜‰žh{RiŽJœ©pÓS•T„Û£M5$ "fª`ÈO±ê¤Zk5zc †Dª6Ò”³ßL~UnT¥a3±ÿ£íøMœi±M¶ao¨‹x?“mäá6ðlkÂÉTN.+ñæŽh*?{¯ +y7%ñ^e£»­îöÈÔ…‘xu³’ Ÿˆ8-±j} MÈR–”-HãÚ¬òùÆ xŠ€ÂtÜ<‹[T5ÔÙÚLí½á­Ýd¯·É„ä‹%.ô6(Ž–$ž“yZ"/.Q‚$‰2Ãp,/Ë¡ð‚ˆx×"Í‹²HDˆgBÕøŠÔ¤Ïä›y‘£šZÀE6<9³ûš…ɶwAWÄ"ñæã'鉤¾欧t½2e¦.Š4u`c”I9Tm”‚–=.-éÞÊÕTµnuKK{$5ôKUŒŸ‹u@4‘tDa†3Å*"º‘&Æñ5Úª@¤¶©-:Ãí®hª@­?¾º#Õa²á„Ç”h{[,Ü¥\N8á¦AWÊ +3âJ£òV`¥;¯NŒ=¦vš²Ÿ¿‘ÅÓàùê@Ò}ÙSWùÉ–ò³”߀t`ú‹"’ð]eKõ¨ˆ*bÛìH©ìjöMDŽLã> G³CËà= 7@‹,M’&‰’ Jjßæ8.-¦ÏJãzO®­ü¬Ô4Œš ø‡§éã¥òŠ&N<3„™ãešeH’,“G Ë€@i LQ4ÃP"C‹<Í)o³cš ÑQ$}²¤†¾ÙÿÏÞ{m§²$ ƒsý­µßA€„7e  „÷HÈ#¬@XaN÷9ó$s3wó&ó0ó™EQ†ª¢ÔýïÓï^G-AVFddøŒÈBî'R Ð*O©Kþ§R—aX %LJ‚\ÇT¢CÀª$p+ÃCbF’–Ó’Æ%³ê%Ë+?Ñ'&ºÁö?‘–, +†82b ’Žø2ˆn>ãH>e)F|RÙˆ)Oï²X0Н5ÑuAÿ‘ääXÝÝB3™"`ƒèšh’ ¸1€ÌEQ¬$çˆ) ÈüIÚýKÒ¤ÿët Ô A| üË`}IÓˆ¹ƒ$Á„@!ÓXó*T¯ ,T¼‹n£tð8Ò¼„YÕû/eî±´ø×9rÿ±|bhŽfÐ;ÿ@kr¸7¸…G?è +0Ñ(•,„®ž)\)W´cÀfÌߚͨÐùìd> ‚ÇC {ƒ}ŠæÀÛ§Gl#òYèÀùaX¹ÉAOr!yÆÏÈà°oFû·ðÙó-ÿ=0:%U‘­³ÁY~ü>šÂ›¿gÆâw+”1n„:’µ“?†ŸBù;ã¥vþN£›ê;a„Øö<ŸÒƒ%°Ûº:+µv9?D°ù`½V~Œ¹ë¬ÆÒE!ñ»ôðÅ”Tè¦ÄgÍ… ÿ¹j÷£Ì>“7ª£i@Þ†./ß‘¦ä•âÏsnçãÞ¢?8¡®þã—P4ø8ðX3œný7M¹Câ^ˆt°åøÛýÃ:!>­œû7±¼!î_§hÇðxeø-¼%ü5Ey>ˆ®ÓçxNøØ–eBI¸‰Š ÀÆ* ãÁ‘CC’~Ç?1âbtuÜ×xøß˜2´Ì®ÈuQÿÈ‹b>³ç,è2UôŽ„ˆ-†ëkÇ%X&?æ›%þ (™Mdzï¿Vj§§¨ÿd+µ“Å]å¿|Ò …Þ.÷_+sº•Áê’ÿ·X™ÿ¬ÂîÓ {Ðík”Öíkqäþ5|Øï\¶M©îÆû/ýû™h÷òØ¿5…þ×t«üì?ÍýøöÿoŸaJ¯˳ƨÓ_üãï™\úoaÞ‘Úo¡~ƒÂ<§ÿ@Ô¨”³½8;_º; tÚ VB¹¿qÙ ¡Nhïb÷;«‰nÑ÷Ï_ºúºîuoºR®g»Ôåät»R®|´Xý¥LGvÅ1øâ:1Â^vz.9 {ëÕîFŒñF }·g™.; ½“ƒáb58»¬Ö¿QHò{(ÿ"èøÿÞ¡õ_Åÿ¯õ1›iÞ …nÎB/ŸÆ?‰3šEïðE/þ%9]™Lüÿvh$ÃóèÔ§hôÒ +tñ5>ͧyšƒwáð,èoÐØ,E£»‹ÏpÍ'#ÿÇþˆÿ¯}\‰V·h!¹éâè®Û¿éí•éßA™þ^´Äí?sô"›Î¬M©}èÿgجëû_O÷kJú >ïl§›—¿§zþ›ÝZ$ÞtÊ¥EÿÆ’ Mæ3qŒFþÈ]Hw#ôc÷•ý×Í4Ò`øì̼/»ûømÚµÎt°Ù „ªuZ¤œOòwl¼¸0iîÿBúUùůÿ©õ´ØÄÙ7ñë7Ò@tдô#·L:ë¹äY}ÐßãC0$Gñ¡Pˆey†ÇïTñ^€ÁQ Ïq¨[gÄî'xL‘û"ÎÁP¨+Šä)ä‚:“Î(dÏäVƒÁ|ÿHˆäX ¢HwVøIùXšBwj±4Gï鸟"õgGšãh.È¡ˆ Vè³ +¡Ú!5râá7!ŸõÁîg’Ãê© ø³¸‘…dÐ+ÌYT  +IkMP鼿›Î~’áxÀ?ÄîÚ>y "IóArA†F1*O±\(D“G© p;4KA|ËèÂhcR´Ù Z´’ª¾¥(ÉÓg¹(<“ŒCÒ®;BM«»ð™bÄx,"8SŠ`X€> *t^ÐhßÑ6îŠÆK„…¼; ÏLª*êwxQ4 xQàE32ödÑ»àš 0Äîè­èåÑ<«Õˆäç•ma¸µñ€@:ˆI@„'ˆ êëehÔÿ„ß«g︯‰1âhØ EîDãx?©Ü* DØ„ !# 䀀 FD†,Ã<<ÏRdNQÙ†Ô„â^÷<ÈFÜr‘5#&£!^¢A0dI=Ž®F €Îà8IêhYÝãÈÓŠXv•œ²‡L!. 1Ð’Ôp +ἦ!" À,ˆI)€*?ÒôðT·ìÕ3+úOcØd°Êh +#Ü0Í’¨Œˆd—$`‰4º i.üÚDR~s‚ØB­0 {À j¹(Ú^f¡€5aÁ ó.(£ƒÚäIÄ&g¢wž(TVH¸üBiøµXDE½¡¤DáåN Ï‚ÿÜX,¡R`hôRTp’‚ÂëBµD•óƒ û – +‘ÆÌI‘’SN¡>(ô‚Mpa…+BPÃ0Ø 3ã#ø `6Šb%ÈÈ&£ðTñ'’ÓÌcÄaU(ÛuôƒÞŠÉï0sô†Ý­ˆuTAX6è`oXm`Ä2à§Ò'w°6—‹qHbäÁƒ¦Á‚•ù* Ø z+.'\–¢ÁTŽ<’ÎòBPg58Ž “¨—ˆûÀjáµh™%XæC§¾DD !ß 'CŒ…5Nˆ ´@jp˜]2–‰Ã&„¡YÐ `_ì°£†!½”œ*+aú€BÔ%W·â +xqˆbØž0!ç0°y¨]l€Y¼wØHpdXð•ðÆ€0ó@L@2!RP.`šÁ AÂàjzv‡½èA¹Å ±_!™:c+9; ¨Ð†Ÿð(ÎÆBM‚6#€’ƒÝÐÊÀf¸M†Å¨Âì°·â=†ÁÒáû‚‚*{‹/,Ò°H•^Øæ( -ð­hP*ð(XAÁõvæ(7ç£ku€.4GôÖXì‚B„Ë1hS@w3šÞ1}¬¨W…wŒc™Kfš,ÀöÁãÇÞRË"ã 6{¼àt€ÛÜÝvÄ¥ƒ5B‡|cµRÐ I@àI6›ƒDR°OÐ;"(€¿!œE ¡6,„ÝÜwõáfӇуÚr€×Ô›<ÚJÃ$ƒ°…Ž0%ZŠÃ"3 ½„ +GN`¿`Í$¸˜œ€ò÷Y Dáê€^êð +Eª+-Ìa4ö¼De¾«iÅù/ï™§’¥Ç´kY•Ã5&šxRÙ¡ÅbEˆ²V¬Ì@7º(^dY0ó 0¤C4IÃ#²„ÐëîÀt€Æ ±Âmoèp PâSÈ^÷ÿ)âô™PÉVµ† Aá°Lè"ÀVq¬ö'@ð “CD§…ë¹ÔË>þ‰ˆ…­;ÎiÂOIù‚AD»„ÀW‚;Ö¹É`' aJʆ8f—ÛA>Ò²,v~˜ýJÇ0D«½TŠJ˜‚૆Þ?È8™Ú}²[CHÇLhç",ôø'"*¬à0ã0‰•ìˆ<º?ìO®/‰"Hpù€ÁF aãBA0Ì/äÓ¸ý¢¤A† ~J9JU…¡40Ë“»ì9I€Ë±(ÒÆÌÅ¡W/† ¦âvyÚƒ•ÿd˜8g‰”%%jÿ½Lã|1ŽÌ‚H৤‹[ƒîYj1]¬Îr«Åv)ie¤‡X>„B^.#x`àA»ûñÜî—ƒL¥V +I}àÎÊÓû%‹âCÈ×ANð%Eí‘ ÀîãI´UBGíß³‘¥Âd/{B˜Š}~V§†â, ‰s€9Ê탂!Cví„4}(¤¦‡ØÙ!ðý@‰aOƒFœ‰sˆÈÆHR‘›Â.¦òôB‰BĤåKÿª\Ê® A³Ñ(7N£LåPPA;¬BtBmaIV$¬¤SQ’â{Ò€|´àî±Xi#ÓøÆHXMˆCì  !wùQõ%JX–µPÞr/Ù¤¼–”Îv÷'¸§½"¹<^oe.ª:Å_ò›piÜ5#+ÿ%ãòáÙ´ý‹/{& áËÆŸ³îbЦú?jÛÍf1o/þÀ¾£³Ùé&;+ߦӕ>üs“X :íᢷ]£Oj‹åíRõ "@ú Ö™¦íÔt±C«âÈÎf¦ýýÐìxŠßÅ^o` +4pŠ1©Vƒþxs–ê¬ðûÁ£År‰ê\àL¶<Ó¬ß?ËvþX¬„Co'^»K\5J±fúív; + æ@øé¢?@EèOYQþà¾R¾^ô:_GΜÿœMç0À×ÙlVã.pˆÐŽƒ+ðrÿÓüÙ8ˆ`¦ýÕ`¾%Ö Š_£›?—ƒÝ×Nû|Ýþ£³ZGd…Kò±tÐùn0úb­3µ-îÆí°Y+ÿüÛ“j¾˜ÌPiºèM}Sd‡z‹vÇó> LšY$ðLc°¹Æ«1±PùðŸdŠï…4&Š9RŒ;ÝéÀ”d˜ÙéÿåŒpºRÿa^- ±¿ãu‚Ý,f¿úû—²hxÝAo`E6äÐ<§þ;ä¦êz/|þ³Dy=üÇoÀßM¾žŽ{ÿ9j Ðþ}?…îªÿ1îã;ÀŽoûnäo¡¼}\ˆ¤Ž®íOSëúó7YÞ±£k v·¢_˜8ô·X …HüøOs*è7YÕ¾?Bw=ÝDܳò`¸©®ÆКZÞáC¿3µdc±]õIÔôóc +ó?%P¬]ç¨`v±šuô¤TAÏáx:0­ä ùðßB¯ ÜtVïƒ ¸U(¹³.¤M-óð¡ÿ¤dqTkÌ=Ài~SS>ð[p†Ó–ÅÿÌHÁì´ÕÎ~·µßÑ!nË2™’ÿMV7ž¾ÓNÏäúäË·ã›Ug¾^v`Æž9·RùÀoc¿›§oÜ­Ôô¿J‹åf<ÿ…û~+Ä ”ÿ-ð˜ 6~gÓùdøo#cëïN„LI¥l´ðøSeÐoggõÁz1Ýîš<÷% +$y¶?rfØ.ñåÇ›Á|°:«­¨‰\–Ø&¥‹Ëþ¬2XÎê5h»?Éàì¡ Å#Õíf¹Ý{ˆ Š·"h XîÌß·÷ÁYm±Ü.%.INƒ> +-îdT½¸Ôj±D'ŒÂ=Zž•Z5£°îŒcù]äZ[€nÇ;ç¬o§ƒ•"~‘.]ƽññj7ÄÚ³Îtzx¥´œ´âj‰º8îÿñæCe°"õÁ´¹¨ 8HÕë1ÂMŠSSqæ#éSž¥Ô¶±°N¬6ÝEgÕo ¦ƒÞfoÛ4Fìά¯µEƒ‰¾û–A5çûçÏ:»1g=\Bž½ãîZa0*‰ãôSg«CÔ0‰¢q6nëlg]ÔÐ-^_ ÙP4©Üºôqÿl=þk`Ý®ÄyGÇÅv2_ô& ™w¡ƫɧû‡;ÓñZ=áz¹‚(X^t.Yqáý娝~t†_{,H2#²è²ÓïK:'Q8Kl7‹½L¸UhÝËÎ4Êz<ÛN;2A?º™'í¼Œî¤î8µK„©UÝêÁªA8ËôÇ›Nw<oDÝ%¯vSŠ +)Õ™ÿÑY7¤%«¼àõ³ÛÛBú¬4øSSO5K¹šÚ§rÓE·3­–ÛéZ"–òÙ:Ê~ÉŸ>ŒÕ ˲)ñc#Û:Ë7+å³d§7Aü5ïŸÉãÙî‡Þ®g…Ò¿‰µì¹‹¦=»ð¤ðbÕFé"sÖØ€¸ÊNk¨äÊ‘Ùãâ3hQ©FÃ4!UsáÛWÐ51ÍYew±‚ÃÔƒZãyñõñ`/þ©^¸ìû±‚IUXæ½ébŽûJM´“mwˆê°Å}wŽÑÇk—z7U£Ï”öK>wj±üó;9’Wl£ó‚†n´‘–¹˜#5دéŒUuð¤ÇBâcÄI‰ö“:é)ÑrR§=Æ}mi¬hgNz*¨)|Çž"TNí±§Ög2Õxâº5×€Ñ\Lz»œŽ{ÈÌK$#˜Eʪ¨¹QED” +>¾.ÎÜC²ž ‚Ò!ÈÑEæWËÌÑII?˜î«X¿ú`è`Çu鯉ÇìDe µ~n.ÈUéT-h=ÒXvzƒÕ:3[nþL ¦SNðø3ù8G‹ù¦3ÕV™Ê‡vڛɖlÌÝ`µÆŸjJ…ò‰fº…=óòƒ4£Åcõ_é,›‡ùqM„ð-GŠt>eböò¢'w#š£Õ_ÊcDƒýÏüs¹§¬¹8“̽ÚrMÇK4@ Tö£Èƒ°ä^p,™ƒ¡Ý²Ë#sÖ’øÄKáëqûêi°g—ùçF +ãƒúƒïƃÀz!æÜtæ=qv]À¡‹wâ¼éìƒ>Õžª‡‚3"AaÎ({×÷A ÅPû`^kdNæßCz‹D#³ÀÝÒ›šÐhŽÕ›9;],Vò©uɇGŠ÷ïí6†çHŒ“Òâö#dté¢°Ó +)$uI”N +\ª=ºG–JAò%õÁ‹y¤3o¶äFž• 4”Iœ ÷I!ˆD§ãùàloÌÓõ¶U‘Pc0Íw6 ¤”/¤×òð_o,RS¤ú£å#š¨¤ ýV2è'ü„Ìo$ +Ùít*ª‡ÝUšð­FÐÍÈ–Ù™oÆg@•ޏBZ—ÎhGša¯&á6aèf’j7 HÇáNeÑÝ\|x®Ü[]–ÁúD->ûý +Õ:+áE_ëZ:«Y1:ž].kâªgfÝA¿¶Z ^)Ö_žU¹@mŒº¼ËÂä£R)“`J ×ÖhÜ⪯ƒÑf(ôµžÅ«Jjg‡4ÇʈÎ0™-Ö:WÚ7ÀWÁú!™I¬Aá­i ]…W›væ|Ó"f y0®÷&³ÁsÂyB6ê˜yÚe9æãõäÙŒ•’åe óþàŸÙñj->cÞ,b¸x‚é–Cfy”FW6›eO>¤#b“ý‡ˆ˜%AcÐ[ìcp uú@ƒæb© KšÜ>!¯±{æ±Ø¯_…),(¤·±íogÁÑ^בk#1¹žI[ŠÉ?Ô&´D}:¢ÒÇw˜Úi‰V[ÍJù6ØΗúþ€Y«³ng*óßôPí!ç´·@åÎÿ<[ ÞAÚ%O×Ib„èîÅšXDO¬ýµ…ZeÆsâK¾ÄóˆË3̲„ha,]ÔªÒb¹ªÎ Hê,Q8ÛƒB—f ‡R†ÇPÂSedQŠ=…ó¾‡çP +XäY¦Ö8˜ð˜h'Ÿz‰œUVã•}5)Ï¿ÏwŸç˜‡ÐyÃaêà0(µã´ºŠÓä>Jÿ#g)œ%é4åøÉ#cxÚ(sÐØªZ<•'&ˆÊÕ“ÕT8Y:ƒ +V.¦Â8á@#p'hR! fVÑGÖ§¤¹6bÇB”×€TtøXtýÝñfÖAºMÉe{Ö”_¾Ï&þ.ŠTá_¨Ï”2‹:ãgÕd}0žÔ@G9ýv=æÆqñÚ¥¿üÐ`ŽÜ•¾Á°Þªï߀2Úsžî\½Õbyd¢uo9íýi°aPo¾w)œ‡§º‡€qr'öMdtÚYúGÇÖ‚‰y +Àtýû±y×ûû­uˆ4]ùÁ™@ï6C§ŠFû‡x‹kg-°âÚAãìߦ}& tfZîN²R{õnHin¯5»Â ?3.—+ÿH•KÓ&o6p¦CúþY÷ϳôjŒZ•÷ž—U}’~!c:.Húy’Ç×Tè/-¹†¹ñÙR¦5‰ƒÆâsòã«]È,”ÂÝ]ѵáÒúƒõø}Þ9ºÅxC°uù~ kχ ‘³øŸ¦ÝS¤PÆÝˆV«£{.í?ÌëÕ)¸¾G•Jt;+Ã]PêßÍ^ ²”ž0.VÈÇQ‘Xƒ•ì¢xs í¡ŒƒMPb³8(ôÑ_ŸŒlGYo¦Û VóC¿C=²/”µìØ;»j—³Ö ¸÷‹@eÞñàÅ6lò‹h2—À ¾Ë>RÓ^î“Ø„.{®QîzÏœGŽÌèÖXý¨)·X>É*º0Š¥Yš2º²*×¹šN +ŒÙQ̈åa”`ÏÍo™0^Ú¤‰9ŽgÑ…´,GÒz7&’Rê +£‘2YòS!]Z)3*§š¦²˜ùÅøy± VC‡ó¿?]®† É…—\fùÈUµVRYÓ›É#û€§ìÌç £ÍŃ†Û¹¬„ã: _¿6²Ux¤ÒƒÕ‰ ÿçR®+µŒ'ŒXo—8 út½ ¡— ƒËþö؈µ‘{GôÆ#P½£Œ µ6FŠþ$ŽzŽ Ñìn2Y–GãZCW±Ž÷µ†¾k…Q‡ºaíŸÞ;²ÚRM=³†Ð Es"K¬Ñ«7 +™º^™ñQ~òˆá@'wìhm SÙiŽž8®·Ýµ¡¶1Ør:Ë:E ÈÑêlŒ¶T>ë‘ÉV T«õ¡)š:m†çs Ò»I…%L—õd¼„¨t>Ñäœâ¢[€€FÎ7ÒëÎæek¤²@E3íõà}¦¬¤·„}"²6þç`Z¬„×É òKƒr^”Æ +J^)HŽÅ½N4R…J)ð·‹%³åkÅdÛò‹Ñé@5ÏG²‹U4ÙVle:rm±¬Z„ÅÌ×ãáj|ó•翸êÃv”µçÊË¿þúËbq½¥-·Ãj±8‹V˜– •3Õ¿¤ÆBÅW7~9_¡?› öå} +¿\ÜÀ+—KÆ9#û Åï^>]ð‹Ãÿ̼õ +Eôgÿ™¤¹Èú³* n>öÂèÏþ3ÁÝÐKøÅiE“_&¸ÚÇ~sEÑŸM“sø^øÃFY빋É5 ¿y¯Ñã™ÔxÝ  ?1ª¡´¿î[Ã/>›M VŸèÏ[ô§/óût¢_:ðƒ%©Qw…ÿVÃnLh& Ȧ†/Ñ¿˜Gf9Êt›„5{™Þ&ütùÊM'¾Z¢ù¹¾Èf’n +èí|ÉtÏÃOé¡#‘.méWL5LO¦Ç;àIØ,#*] +Túü)L¼Ý‘õ¿þ²/ÏWq†)Žß™¦ïá‘ÊX|ÉÀhóˆ{£ÿöðv¸ÛB÷äQøPöíù +¨c³"Z{ÚøCô8|^„¥:J¯ðùd,¶†ÑUÛðM¡.!Ìb¦IÞ4®8úùÚOæ’õD½eOf¶ ÆÈéÿ|õ¤c“hƾ¸wç’ÏÌ[rî{ãŸ㤌£¤i«ˆßÐÌ2ôí“ÏÄlñ¾Í^f U†)õîRãh>ìÉTÊdüóªÇz2åì5CŸo{ý˜KOl³bwTšɆ7>Oßûè<‡=ÇüéÁúŠÍ<³Éxøúc( =AvöDÞªð©D +ë|5Ó%¼ÛDéÁ6„ýüð$}üÍSºÐ/8`ºä4>¥“ÓÐE—eë!Xõ +¤g¿ A±Þvy‘hl-#O2C s råóÄSŽn‚óù­é¡ï™N'+•˜zcw;úfæ¿,6鳨ÀÒY¬ýü‡Å’nyW)‹åª¸A˜Zwær¿X-®ëûO‹;Ì»1³ » CvÒë|AÙ²ÎGüÅ´|SO|ízçÐW>Ää»Åj [lÞôµåœòt-,H±=Z !)p„‰œÅy5}²¸2…Å]Šø-žkÒâ½{½³øž3×ç²ÞÇQ 1«ÝXÈ5;°Ð¶Í¹…ÞÞ2–ý²ha¼¶W K¶W.^¡-|6˜·„o-¯–H¯‡¶Éµ·XK,V¬Z®î¢ï–øœôX’awÚ’z²µ-ûêÜ’­}Æ-ù‹å³¥P]Ú,%ß6a)w.Ú–ë+ËR³3ËM71¶4 +• å–¸¿µÜm?¬–û…7cylGGÌóý-ky½™>[Þš!¯¥{WoXú÷Ës˰+[F‹ÎÆ2±yË,üðiYTý9Ëg¯õiÙx©¼ÕRèl­¶e²bµ'mv«stkõ¤®«o}ñf%*ˆ•&+3c }„‹VîÚá´FÂógkÌѹ´ÆWŸÖÔ¨Þ°f_KAká¥0µ–ŸóUkµ_ ZëÓ›¹õvs×´>0Ñsbjµ¶–¶µ;ÐÃH²Žoa‚™mùb]Ö¸³qÜ26kcun³¯F6׸۲ùLÞFÒœ-d§=6nÖYÛ.ß"C[¼þñhK_«¶|ƒÈÚÊ­IÔV{¾ ÚšQŸíÁærØ^ø¥ÕÖ©uV¶Á{cfû JÆ6¯§F¶µ=ñ~n­^ ÏÞÔû¹ç57:'"¥óåvvÎ?·?Ïc¥¥å<•&çy:á;¯xZ¡óºw=oùùóçÀ]í¼¶=+¥Ñùäm½=_nrþ Kd0öûëò…gëx¾ ¯;ó f“ð\\^ÛcIbظÈnF•RÔuÑ`ýñ‹ëæþâu:ù¼èŒ™‹ö[íb9ìÍì–~'hwLú7v¿}¶´YkÄ®‘Oöø8á0ösW²Wî's{ÓîÚor]{‡íïƒÐ“}žnùí[Ÿ«å°¯[>‡o¸wï^üŽÈMäÙ‘,-‚ŽBµÑwÔžcWŽÖعt¼nGÇyð8fåBÛ±™Ä¯6tÄ¢§Èß;ž ;£ÜÆ™ÉFîÐ‘Îæ¼aw>?wzÎ~qYvN“ãÜ$KV—#9è¹)OÍÅ–Ë1×ÕëÚïÊ}¦×®šÒwÝS-×ÛÂRrcMÆõ9åBî‹ô§Çí·?ÙÜÌKúÓ}•NÜyú|ྱ/:î‡ÅàÕ ^ϳ{2~yroí'Ëõþ⡸EÛÉ[»žô1ô\{ÓSO«r¿òt¬ë ÏG…ó{6Ö: `¼Î¶-饲…kï¥oñäͬ³coµ·¶y^j´·÷Fg¼³î¤å³Î›Ÿï"æñ±a_—¸þlùJÓáÂwz¦}oÏ­Šoâ¯|Û÷GÂïI>UüŒ½;õÇGKÆ_ºs¶üwåËs§t›÷O‹óiÀZ¤/¾z½àú¶P µÍ¿ªá x¼-¾€CÏÚk—p:—}k›W¡N–(nj6âî=Ý"º7tˆ˜`ò¢à,’¼vÈhÃ5" ¢BÞ.XŠì’©9Ï×Ïq‚¢¢[d¦T)õú@Ý»ý9 +|P–ú,Û´+ݘÓLÐõF§Bo·tMéþx¬Á{÷ù&8x8_×ôù:䙸7!¾ÅZC¹Tê"t¨ºB=ß;úôºYÆíN^1ù–g²É@ƒiÖm¦;uN™OþÁκŸƒ Ë»úYdár¯¥{ö.FMØþjáf×}dl*Õw™Ï/¹R*äc‘kn\Šð¶jœâ©A©Æ'íwKþ&3ºäßç ùÜ¥7ì?Ü„ÃY«Ô×U.ü0-Ããf4 `"ç¥é"L岑tÚ±Ž4Ó/åH¿UtD6¢uI8m¡Ëxêc|Yõ +—îÙuù9||‹ú®Rј»ïŠ^wF½hûî¼]CtÌ›+­bÑt÷%v]rbíÇ +bØr¼´_ù|©ÉUìzõrU]–kW¬7}µZvøx š Ä,íˆ7œ–x6Y&,¯/“Ýy'2ý‡÷Dë½5L|8:£¤ãrò‘äo¶³diI¬’¯Éœ-¹\õ<&å¿vÓ©UŽ¥›M15ìæîÒç÷Û~š­^¯ÓŪߟ~iéå[¥‘ ØcãL’s»2·Ï–Dfìž=d­u6ñÙëÁä6Û­nÖ9KØÍ…|Ük®àºF`r/½JîÓãZå ¾”ʧk«Iþ~”‰ågîé{ÁÛ,Å + —ë£pûÔK>øÜªèÚR×ÅØÀæ)6š£—âèn+9«OëRôñõ®:Ês¼);¹ÕC9ڦнÉå†#á.îž>*.ÒrW‰“©JóvLU>’˵‡}]'˜ÌÓu+d»¾ž]>§«þJ6RM¿TõɺõV?3GulµÂÕó¶ÖÞ¼nn,/Ãí —]Xoª¼óÀÜ =Œ«î ÔˆúýÁÖï¸ÀU}v}[löÛF.Pï6^«®eÓb}ö4¹æÕe³vV›ï›a÷ÖÝ»³Ý&ŸJáÛÇFüævÕŒLîB¯Qò®2ŠUî†öÌGË•lL+ñ>¼m=rÖÖjËÜ3ù—ûªÇ¹ŸTzž·sö!ýrÛ}xy¢¸GKg<| ÊWMoxñ8˸ÊOäpí~*Ñï¯Oý×nìÙíYžSãÇççî2öbyñÛÌKä:Ü}¹½i”_Í)ûì0¶×ªåqø:fÝ·mÿím¦]p’l»w?ò¼¹‚…í[jNNÞ^Ÿ6½Îy¡ûܹŠßµ:ñZ£³-Ônº‘z­Ö½ëßÕº+w·Þã®7w¦×X“O½E©Ðé3Þ÷þMXõgwO®A°H„µècr0MEêC:ÿÙV[÷Ûád§ßiŠ.¼Wööûd½°Œè›ydT ÌîFÓÉj5>»"ã›ÛðÓx~]FŽéSë>ÏžÙÇò½ðöir—N°“õDz3½ÌÜpÓ‡-9˜Yïg±Yü²1›½RÙâÜáäóŒƒ|ž÷Dtáeý›E1O·£nìrIUÛ²Öh¿-KÀ|ro±Ðg«Ð±®,´°Šû_îVm7›[».†üÿ“‚jÈ6o8H{„ ãåc9ç“ì-ïg²WÜŸz¤•æ@ÉZ:Û›]e PÇ+Lœê,…¾×ñaYŒj&³•lÚÙW•Êb¾èákÊÓ‹Ì…{<뢴' ÐÂ}¨ª|¾Ùí ¢Bm1ÖqˆÏ76y_êòÐÌFŠÈî¯0ž7ˆÆŠ.)…檳\‰ÀåáIé¬×h“÷<c……ç8da¯[ƒ.j;³ZÍðÓYg58ÛŒg»#´³µØ×óÑ`~¶º³:ó39ƒcAê¬Ñljþ¢;8ûÎw?nPÝàÉ•“ý¹Øž-ÉÎó³À¹´0Ý{g“É^‚¯±J¡V{<ïOÆN“*óFMI²]÷¢¨j)‡Uƒj<4åªêl— ;Ñ[-ºM¹óç`µþ‘$j¼P•„¬ô¤>p¯Mh¡ÝhÜÆ~ nMp§vŸ©ŽDé³46¿˜T*û{Ú¦$Õ¿ë˜G%çêÔBœpkÚ‰–i]£b¦À#Ã0Aï¥öѨ™cßàUÕþä¹lE‘ν·HÛ«¾d|•›ÂïsK1kñ:©qÇ¿>gnóÆŽßæb•àU¸üì¨ÄWÛ›ÍPî‚ m±N¤ß½Äy<òêwÇ/½Ëu|]¢&)[Vâ¨â&ùž¿)Ç/ƒƒFjõÒ~¿ãýV¹ÿÙtö"Ì>æ6é—dðÑçMÌåu¢ÐØŒ<1ƶͦƒç­äÇÔÑ0é!QìjÎvÎòCöîæé9ÑLùïô¡ÊÇ…_â—“ìK<¼öÏÛ\@â¾ÓßþÃééez¡gjlG.´Ý“¼ö¾¡#ÀÛlj°uÇQ¤×ëLÐocOfX  I"ÐaWãó·ðøµØON/®¾•çy›(7ìŸh®x¤8BGÇLäî%ž˜÷3O´ °³çèXq&÷SöÒÅõPŽu ØMôÃãT ›LV¢NŸwœ²µ™°†‡òE„NÓ…'ÆcS‹WÏå]ÿ)Lum/xÞØü–cÜ6´-OL‹¹™#RÅ’ãÛ1è]¿L/¶J:й´g-žÇà/^ñ,x€!ºÖBÿá‰e/w¿]¶2%a|Ê›yf£¨pð=á‰Å2^*}õÝMÔŠ^Fúׯx7÷Ã|ÕdH£’Å= +/ +¤3ZG£AüYÈ’L·1¹Ñ©qyd>z‰fúÓJŸ™NÇqždº·7—ùt;–hŽz›Dí¼WI4)±@‚}y°ÁCýÇÌýÛÕvO%yÜú:‘fã¦þU^Ü´‡EzØÈô1Iaގ˳EZÂ.¡™L¦Mzî’Áûb6¾ZnƒáJë +ï¯ØA·×“\ð¯jj*—.'½H*asÑT(éï‰nÙô”LÅP~䈱0QŒé.â‘æÆšh7ÛCjªvSFzq÷ïWôªè~úÇ 5©¶u~uÚ—®Ôˆ©?fºÄ¥;=X­¼Ä ì1(²'G9—hIÌs—¾·,Ù’?]ø`;;- ì*×øœ•Õ×d%›9‚,uûÙTö€5©Æ>ä’S&Ú’&g6åèc2ß´EUH àý šÎM.ëæ— Ãpkqˆ¯z\~ónrKk—ç=‘ൊ&‘Âz1L×c«NßSrÙ +yi]‘AØ>™®»“U<ÑâcQ„úþ :†o/Êîܦݟ%oÅt`uf… †Ž<“hVïñ»f¡“Íp7÷æÒCdž÷Yf¼‹k*kgÂ÷°ñ[>Ó›|ÚEXP¦AMÛŸeЕQG¢>]ºåãn:yP…Ž [¹ý‰ÒCݦ)Óèâ€v¼ÉÚ«©òg“T˜·==L8^&¡žÍ¶]–^(àùD+ÔU}+²0QXÙãn0«¹EÆÛìE7-ñûsO,ÊÐøÛ]qÉø¦gACšéR)ïË^fB.ü-^Í»{.ŒoVâÉi‘ð£ýz’•宯î`ü®`kùJì¾Þ&h»åS‚3NSÖ'ãhI7T0òhIbT´8!¿OT³éV;5þ`‘áìâ\_7 d‰½±l½¿@Øù$·içá6¦/ÒTˆ¡w³ýgŒ{Ÿ8ˆ¥ß}®+ {®êH<©À8 ïöKI*E¨2î÷g¥hé4ù>Ôòx *mCY†²Àû;•a¢sØc»KrPËOQà!…ÊØ@†*?”R°¤¾'ûÖŽñéÜ;„¨=CT.XQÏ{cq=«b˜§eDÀo7éá­'Z;›¦\ýŒ Š8œE&”Øë¥}¢'_löõÅmËfæÛ7ꂟq" \zÏOÛ+“7µ8¬æav½Kl.7×»lÚÕ¿x~a'ØÉ¶[#Ê¥îRФÕÉ êq‚ö&5z¶„=±\»-ò׋¶Ñ_JN*pükCIxÃ(+óšœPQ‹ôÅ>a@„û³)lÊ5"ø£”AA¡ôŸ½s ®åB¼ôßx®î:Ÿ"„&”¬bŽ,ÊÉ«‰F®ÿ{]Qñ[ ÷oBÔ¹¥ˆñ†ø ¤Ó®Fë-ÞiþT,€yíÀÍu¦½$»ñÈ­Ã/KªQ¡©52ÜÖ>ÍÛÎ@O‰ìsœtò¾½®V§:P>mš] õø†ÜmŠb,ŸÍ¤ÓŠ$¤±$“°§»ÁAã¨Ë0AbüŽ:ëªM#Ùtè‘òÄ^܇SšÈÈæ-ËÄ8Yn0IÑÞĘâ6í¯÷}¸Ùao³šŒ5;Oí²‰À‚¾åçbœÜGâ"IƒÀhðú†HºÞa—KGwê´ !ËO%gÕ2k +wä:˜¬néG w}ñ¸™¡Ì„I܇Š9·}rñpësæ»ïñð}V>• ¿…Ÿï¢<4²â—Þ&'—ÙóÝP áü¦{øI–Õ2ö1[9hCŸQéR³b•à³wÓr,ßÕy¦MÌ_ÒÃf%ˆ3ÞEe›ÅO™^mêRyQ»læûÅ´+oe×ë»D³GòÈûÑ¿tÆW>~›¨Õ/áñ+7„]o¹ÑÞȼÁ>EÀ7e7¸-Ï·ÙvdPC¥bŸ3Øéw ê}H_ ýÚ&¸îòÝOæï¼»Ï`›‘ŸÖ<ÿôe Þ¥úŽì– ”4ÇÞä"¤¯}ÉéŒÓL™X¸ú,yòpq»qxo`(ËÝ,ܺ£ðp¿ßý<òèKü£#›0“D3Ý!“SÎÆ”÷sWo¦xÓäÊæ€—ðéF´wÿ“®$êÍøç!ƒØÖ©q´²Ž‡³抹ϥ®SwW{·‘í {9î=¥ ½z-lQ›ƒÝµYÀ˜7YgñªÌ石›ƒ¼ÛH?°[‰‰”ÎÃô»í%Ȇ—þ8Ic·4•à¢Ù†ƒâ½§K×ùE1ùe¦x\*Ýr7®i?odÛ6{Vèyμ~lz8myHÒÜ&ÓMºQ›C¸â¡Ÿͦݢ`™«Â~Þò.©µã² ’Å?Ÿu¸$o˦/à;Æ (;˜M{›¡}šQÀ—Ÿ$2ÍË×ßùà[rËLºC]è XÊå›{›{· â´æÝÕ$~[¢c¢ätNØ5æ$'ŽM1|°Þæ£ÏA‡©µîü?Å,Nÿ33)\Cx’Yȉ/},âN>dÚÄ#/Í&9ËuÖõPÛ$Jd_5Zºî§û3Þ«8ñÜœ ô«“wI *yñ6 +ÉDvö!¨_Ïõâ#=ä‹Ót×=¾àËo«Ëlb:·âªŠi  Áðu*ðœ.•.‚GÝ4|Ù 9tfɺUÜÕ– A3ÀD³‰X’¹X†Ò…Îôâ@Mk. ÎK)VºT°¢D—J’.½ÛÚC6NlÚ°ñónÖâö’çÞ¢‡x +$ˆ~y¼âdóÒn§K@Ù&û*Å/TGx;:D²ÎÂ,Áž¯mÙt­ÒÈ^,ƒ gZƒ÷8| JB¹óŽà7Éï ¶aK%à¿|üÒçwiƒA£ì9”d~†QúPØl“DЙ¼Í8×ݤSH5½ˆµ÷oH°ïAL£œ¤\ææ¤£ØGu)±UÝòÐÊHd1÷ïƒBCØçíŸð Ú/*Ýiäžs¹˜f²• Þ”³/ÀñsìŸà£NìC3ñJÚ_]ʘ7ÆxY·ËË€w¼€H#>Åg–‘ß»Ûã1Å[ùZ幊+*ñZ¥8ÿÓä¦|Ùf¥/ßi̲7Ï6ôÅ4Ñè.‡B@I1Ö÷äÌÊ}Ȩx~ù¹OÉÞ`0-ú²ÃFnªµDc{K˜Ð*]˜×`Ç’3@qÊdß*¼¾WP _¢DWªÒ/Û´÷\t48~èeº‹¼ïȸ¦½õ’鼬əÇ.³Ù{N“ù$W×÷°ÝcY€j6™¬˜a62ïþw¼p½7ÒX™~¬÷Yûv9H·I… —…îxÈÌÉ:õg¦ÉZ<]èßlÒE§3‹ÎS ÂÉSbÚ™a)³±,"è":^ÕðkËZÎíÎÃ]Ùúˆû¼‰wlfoFÊ•sq»! +O¹K•Xˆ«·¥× _¿v·Ù·Wj†8ÞŸÍ?Ê*:Hʬ’xÄä lŽ3=´/m̦´‰fÛS@ füê}‡Y»Ùð«§N”<꽡]sœ„`'t8<Ù*\n½Auàè:÷ñµëÞš._>ÓƒËW«´iBDð³=\‚&y0ánÕnöqô,ÑW>Ÿmo^|Ù¸cÐTžè1X^vÊFŒj`­ã¾½¹Ü#×|Ît›‰Vú=d«4Ù^‰‰úko¸•µÛ– ÞTý€Ž2S£§ËÏl¢_†+ëíB™Md˜O’¯§{©Î$ízì%d‡…Ì>¥‰‡4@öYd«:b{öSk0hµG¶ù–dÓÛ>Þ¼7ÄáKgç‰ +XÔ¦+9‰\úvn‹jÊwPvm³/ƒšq7é5reQM¦N¿ËTçn@Ó¶£ôŽ|·‰ú¢üÆÄ>]y`Èœt\–3Þ—¤ž¥fRJÓ ¬ñó-öé.¦»÷ƒ:ˆ],Ÿ{h/ß°ÂÜ‹‘õ÷´Ë,FAû²6fu“¿‡è +vé3‰qÚ§T©çqÕ%s[ë@do½Ù Ò ÑõMÝ›.Z†„| Âà%ÉÜ}ØBd/ÊlX5ù~0â´¬ýñ}ž.^<8Ѥ™øÞiþ$‡²ÊÍÜÖ¿|M”]œÄ¨¤À‘ém­¯\5O7yÚ[ŒdÛÞ»°z5û‰š™…Ê”+'zK½²t†Î)ÞO°dr‰Åç:€JFªé—ñƒMqô-©‚p±sW‘H ¶oÀ7®d¹‹l~¶› ‚jûÓE-$=Ýœgz]o—%´¨«ÝÇ3«í~9r—Šù ¼ú¶‰fŠmCdÚ‡@<àë$‰AVÂN˜…v&"ñÈËm’šdúåý…ByÆ4gÕQëƒ Ž/aÍ +/5ƒï¿Jü;wpçżß9çß[+@6^ “$ScËêwËxܽÏ4qî›c“²¤Ü$„ 3+·ÝJ·^´²!­¸èžUqÛÈZ³íàE/óý ¬,ËKïíQM%+‚tJ=9BmºEv!ŒS_å,ŸBó +g^}¡õ²3ß_Oõ•+ŽÇóÉt½ñ÷dïBqþÿ×ÿóÿþ߯•­»ÇÖ½Õpõ©º8§0Ÿœ•ÇëüÎB—ž£Å?òã¾Æ5K΃Êvº/§ƒ„ê’¢Ã+xÒ«Î?4nPR_ÑÓ™÷F‹¾§].ô"s-;›‘ô¥CrGçøvfÞß¿?8 J’íäà}°µýF/oÂôþ‹›ýoø‹}ÕÜ$!VÌMò¶z´rþÛKy¢ufdqÑù¨Åp gŒÇäÒâº~ä-ÞÑxdqž?9-ÞÊ}ÎO—yø2º¼@]ë7>HÜ[ŒÈ¿¯v.RJVÉmÆS)· .´4ÄoÓ`ÊóoÍ:Ï´’ƒz<°~¿ ¿Ô*|ú1}5bhçÒ™z)lsÌuúÜ•¾òP+x²8ƒ9j) ¤ÛU0ÇË$\çªFZ¥†¹gK¢úÚ¼g4ø¿EYð€§¼^­¨õÌâ›ßt-^*›°x´Ü{ËÅ€,Y<=Êâ+ò÷héÅÓ—‰œQ•†¦ÝÌgú1Ê'ò¡ð¬fô”|»¦l)~å…?{>qq6ä­3D)܉Ӊkž¢\q¢@'Æ79OÊç®cL„xdCÇ–®Ë%~r‡V§žT (Àÿ„ß˃!íAjÍeçMÊÉ?œ};9—‘1€Y=¯ß9 ·õÄr{pM­+â¼\ŽnElCø37…ÇÒ"»!2GÖ«—H­J‚ §œrjŽ|ÞÊ^ À¨¯^Þ“y]¨ õ°èAí®^ž–T³æ®“.ÛírZÖZîÚöÊ$õ æc7ìüNjÐuï‰ôª UÜ ðjûvº/.-oZP‰,qu©•±s‘!¯íÍ*øðLd›ÉM"[³ËðEu\©kBÍÙe]¨Žb9XÁP‘ÜùvõÜ£Šªëpk­-ú"´qÀcÁÅÁ¾†Ïc;¨5‡C‚ +`ðÖ›lnŠ“îD7£„ú²z¹ëÖu †Û¡Ûþ{@ꫯy¡bÕ©Œ¡²aá Ôßjö¬µ¡ÖØW‘åPÌPŽØ©µ\$”#t«KNjÐõ⹌̴×jÍvB¶Of[öæ`¹D¶t“ÔÊØ.B\èJêC›È.šMTFœ;Ú˃ѭ&ÔÜ w§•ËÛ}ÿH€šyžd¶ºÖޏw5t°á>Xn¾= }º—@e—j¨åÂõËêƒÏ©Z+òûUP%C|LåÙ « µ`Ýr凧 µ:äu¡–üŸË‘ÖXnðÉC4ÊŸ[m¨%úµœÍ^Y4¡6 ã‚ +ªf¸QašozPÓÄñÊkC-ûlÍ~ÛÑ„z÷E{£»Ü;ç ½ÔƒZ!Z¾«¤ÔŒ§çV) *ª½?z›¯ºP?¬ÍrRê3C¼tÞ<ÚP¯oQä; _\{5—ûúzßÖ…º\9ßõ Vˆ·L9-Aý…Ûr$©½%­÷››‚ÔÕêÚgÛAíÒ.•ðxxw† v¬›œR=¡×­¶tŠ@€½Ë­FŸ¯™û8@®TP=áŃwu»UP/†OVÁ¶Sɲ€Íš\WÔ‰ÌõSAõèÅëkßùœŽÔjj£¦p&óá ^93^•R0޾g§¡èópª¤Ô‹O”»~BP‡P™ kô!Ÿ¨E‹ +ª…JVG;¨á?Úår?ÑÌD€zu[.+‰ ¦öc´ÀVvçJßR›™… +Ï»Zßb#Mmíº?[j?tðÄB½oÁëíVÆ:ß>ÔˆÌe5³SÎCÇä1J”ã4…¿=Ô÷WD¹~Ôû6A”û%FúVÍ)¢biqzgˆj¯P×û¶M4R“Ö·‚góä%w6‹ÎãO~¢¯8õ¾ ·–O¿ö·—bµµ°~‘hZ+OÜÝZ¢Â·j‰ >‰»wߕ޷e¢uÎ'¤oÕD{º&ZL&¥÷xx´±/zß~/÷n­o¢=³ÄËÇЫóø3O¼ÞFh½oãD›ió:ß¶W¤ß] +í‰v0 ã$ù7ª¢óm×F&í¯Y½odéÆZÔ'ZoA^O¨±Îã}ùðQ²kz7#—›G]¢QëšÅá*^ã”#æÌ+¤{°øóñ˜ð-R„JÙŸZ.ƒÅÙ·ûm 9qíŠé®m$„“Aoi¨$pß ‰µPŒÏŸàßd‘Ãꊼˆ6ŽT¶yÅ>@ùÐL?f.ýð‘M%ý½T*(yp|'Ù›·‹)ˆÊ@ÛhޱÆCqГ¤nî Ñû-’‘'ЕÃË}þÀG».%k‡Q7ášBý®¬”#Zó f…B2õ+‡¡8h¡ 5øp/Aü49`0¡ý€.Té@¯â ŽÔ]õ¦»\ðz}¼ jßn·IPql°‡J«(ŒbƒˆÌOËMD¶:åPƒs *„Œ¤_*Ž ´  +acCáÁ³¸\%ÔàÓ.T ðŒÒ…Šc¹ŸF«ˆŒbƒ¾Ô>Tîúæ^ ªFaGC—ÈÈÑhëA½9ØW[Ø»ƒY)CѸˆ©qÁç²j€Ñêª CÕA•eÚN!ÁÙí”è;žRR2{vXÏHr#—ý8é½%½ûOòdÂ.‹¶Td¶­ +ÑD7’Ãø§4™yYçd –!Ë\ì~x+ @‚K¯JåÁ °bJFF%õ“Ñ }~g^cœöCÔ8a- `”ñ +?vTò37;Üä„ߪ¯Euüc·Bˆ½±s{¸HXaÍr|…øGýÈ‚½×iÛØÞºEô…˜Gk… ¼Óº{(#Ú±m„F<'ÒKœJ•¶ÛÍæ51›)žÏ=,÷¾Àwù‹’ÖcÒ 9SÔ×åV¤Ðˆ^Ä7è¥ÔBþ…¤…v¾`ôà]* ìIpâŽdÐBr² Ð|b2E¡ˆ\vÌžÚä{ðnŒÑÁzÿØ‘/g±ë‰gæùN!žr%®-žBh£±¸+²TVŠç~GNXœÏf‚Öho5¿]8ŠÐ¤t®6;¾.»°.mžÅ!î`=i}sIÞ¥Ò`кÊ&W²«|yÅV¥&h£K˜]D€hÓ^éÑ&N 6·íZˆ`4ÉÜ]«¦ÚçÓÌͦ@ryàt©O­Uces¢fQÊ©`°›í­œÀŠw¯žö+‡ìÑÉR/ÛdIwWe?vè éëC¥JTÌæM:whÉqóè"F Sþ'­eP½ÑòÎŒ¶%øy°-n¥«vÑÞè)"-Ö†uݯõœ}WR¾7Ò&çÔZVm©7Y‡ýÙ9wä•έz“Í:UÞbl¦°«í:M E%ù¢6N{tôp’û-›.ZÒö™ÛÃɹ*"8ð6l†|‘¯gbår£O/bÐiß~‡#dFÍö1¸ûþRY¬Ó¾1ÛÐñyÿsD;âðH´aØùøCDSj·Ó‰¶Kƒ‰9›MìSÝRÉûWµ>’›µS<ç÷¼ùhl¶¶NË£š¼ÉÀGÓ{€%M¬?%žytˆR2N FZˆ³\º¢Ï#¥²Yi¡ƒ‰f¬0̨í?ª¡eކÞjŽ©‡£˜ ñdÌG5º˜êAnÌ…ú&‚Ë1VêÐ=ü©mG7±µ–ù“¢5­øoJéqÌFû:6„“”t> + :ãdŠ +®>Ð ßËzn"ý!©—ânèG»#æ£f}œ6¶cy³ª `BHœvD|Ì«‚Ã*òÔËÆã8ðZ8©¼-{£f^OÿÊ™ÞîäGÖÄ +‘ÜÛÆ‘yÉÔ ÝwA!E¹çÏ¢—†¤ke9ÌÑËÀ×=ä©ÔJ[Øý‡Â>+*…]'ŒSä¢t’)ôyØjýfÒaV”âÀý‰ÇcŽ+RH'˜H¦(s¹:‹#ßYœ`fEúê®Y9Fn£D}κëWcœ AHÌÝâ‹K’14pÊОž$º"‹[¥v§uÍÚ1Ú„NKVî¾5 tÞ1T +Š”„Ò; +×6¸vPáiÓW·&òÇÝìeIr³uåæ8ù®nÉ CtdvQÌuê™Æ’Ú4j³Å1»(ÈͲ¤4_[\Ô¥»8”~0¥¡–%u8} +»ïüu‹Ò~mIAsÙACUP:0æT¢¢K ÊøiÒæ¸›‹¨#Y>c†6åæ:P•¿Cv¨ ¿¥à3çL~UïZ§Zl!…Úþ}®63È„ž`þ°x¢Ù~(K Si‰à© yz_Ù®°Û<—ó;çûYÜÒ,ªãÕ'ò˜E;·yd]¸–ãd[¨7›ßœËaîœÃå:ôDï›ÆÇ»ãU“y2˜íkæG3öD¸œiŸêR³oÇû›Ùd™cj¤Ý ´ ¹TÚ > KaÔ÷Ü‹û[cí&…¸Ægàp~G»©’÷h¶ŸÒnw I»}ÝB mú'´:×w[ àj +“œvt"Ÿñ,{-pt"}MbþOÐ ÿ£…'*ò’¶ Ü4*ÎVqšü2 é»ìêÈv"ƒ""·ºf >S+ö/Wt¥à‹‚ }$xlú§¸÷w§Ÿ ëN…Áü„Ï/ † +*´¦"“Õ¹‡å#nåÞ ÍSÖL}E= YT^¿ŠÓN™È°ªB5‹NÎF˜H#ò>Ì Æ‡ÅFþºz6ü—V}š¡}ìXsµ}ìXËGbž]PhÂ>¶Ìzÿ†A!ŠÂ~Æû¦RG]N3cŸ?Íà;{£Ã(¤ÕL~æˆéX+?cÖ`¢#ÖȤYƒ‰~¢8 O¤ŸÜ;e]¤–qó§ÙGØ4ŸQÍÅqĉ.cûvzìcØiÆ5Œ#ª Ö³€ÌÓÆT•—TÚ¡³~´ÀM?jUPS’L½#<$´„\I›–s˜í'ø—¬Ys6Sr~”ivDc~&…ݼÓô?õÊàtÔô½aÎ[¿\O;AŒÑ2ɦ̔pôýàSYªƒzŒ/‡qØLéW©š)«*馯ã¸|ô9C…-G‚§J{Ñl¦LÍñ³4ócÉ*ù`µ›ÊCë,¨6ÔT¥¯0•~$Ý]UúÊÙÂN»l²æÄ"Û¥\ã^>æGÚùŒ{ù¢ý@;Ÿq/€ù™v>a/ß.ðø~;Ÿq/ß/¡uñûí|ZP¥^>QC»Ï¸—ï—pÌ÷ÛùŒ{ù~í»ð¾ÙÎgÜË'ßlç3îåÓ>÷üB;ßm“W?»õs6OiSE4²¨N¿éSmÖŽ¡¥“aq&8A¦ú¶” ©SŠ[Õ’Oi¥o|œTzŽqÍ!«_«¾H*eBJ£¦~G'‘ÓŒZÜ”Æÿ°ŽM‘±Ôæ¡jȾЭú;™«Z ªŽoL2ƒØÄgv…ÒùZG +MãÔ^©V¾Dx¡ðx¢Ë-ýþ=³Í{˜iå%ñz|ûš9)á¨×ò›y®êÆå'•^ftsÍ걉tókæôúQCKëƒÅ=Û¾Ýv§QpùŶ»SêKtÂ(Ôv÷­±QÎ0"0Oƒúy”"gh½@ͦÓ(f*æ zëʲ„X—Z¨<‹ãIfÓºKmOŽ5·´cmkÖiî’'õ½fÍ·SŠˆ «ÑΠÌ%õ­DÛ>Ñ(iä{••¢Mæ‹>†ªé4}wìh?š|ð„ÛèúbRó…é~´×­±…:©§ð˜Oæ–ç¸ôqX *ïMÜš¡è‘Ó¯¼¯Ö¥N/sÛx¬òþ¤žÂ£.µé=”g=u½Nó³éðÁ³ˆÑÚñÙôÏßM ¦lW€ÙŽ4üœ²LòG‰v¤ËàD¢Ñß$š2eìõÔQ½ç9òGÝÜ!Èo%Å^§3͸oï—xaÆ‘9Žé|òDšiÄ|ÏÿT<¸¹R ùa-‡êÍa7{ë*›MlM^å"Ûnmݧݲ§êX1±KªƒƒˆH¯È5Ûi[ž@ÒØZ+ÈÓ‹=u)r´]×­u¦s %Í.éX 3½Âh/ë÷Í ¡¨n¯QFÝ oÄÐÆ-P'ÅÙØÒv. ßÉ©pB¾ÀÏÈ>J_n%?Í©Ìæ‚TNøA=táÔ\©½_b×·I´q2•½‘%!Ð:){cÜì×6¾vÌ4©Lôâ ¥ÌÞD7êì j‹:Zvm.ë8+~1{£ÐôyØyþ#Ù›¢Ê}×Ïr˜ÈÞÌŠ?Qœ‹ :¿Ý¿ˆ³7ú'ì'ôÃÏÞ=GúáL×#ë6 + +`¾Ò ¤¦awTDn¢A¤”=Ó…*¢‘V:ÒCGzY:ÖkäHÿ’]˜QúNuà¾#J³þ@Qc6ª¡¯nYͬ²ô‘.éêž²8—¬8髌Z2{íٮȨÅï»×ž¡6œîþfʵø)c1U¢X2ÙÀ¢_s"‹PŸŸ~æôhŸŸª¦CJ›î>v™8ºøbgž*¾1SIþ•Î<ÝÓ¨ŸíÌ0ßî5Ñ™g®öÛyb1¬ª9ïkJA¿3ï°vðøD_èÌ;pՅ漟îÌ;ª:¦3oï~½OÄLgžä ëùVgžÆÞ æ¼ŸîÌû¥¸Œ~ßœ÷ís!œtù‰ÆdZò-öGßzîšÍT¯aé¥dÖý#¡:Øæ½ }XÔù¥«UÕ•)x¢/_¿¡˜Eb+ûoNœÈ¼‡¯_œ„'ú¡ûUS‚×ipÁñé%Öà¥ÇÜ*aÊRËŸÇýËn)/Ï:ÖPu¤ D××?LB¢ÙLI™RhÇ. üž«ž2[*qÄUGý‹ß¿êXh]ü y¼;Hy}í–<Ñ—#n™s‹'úžã¯˜J~!Î/Í[Í߉ƒVxP°„>S†Ýªó•Z¨ªn¢qâ¨Nký\“,.êû±&ÙÖ5É>þL“,iõý@“,Ìò3M²h¢i’E}¿IµÑ©›du/ºÖn3W Š* +W”@ C`¢„I!íÕ¡<¶WÆi0ó¥½ßjÊÓ2kÿ‚¦<ݽùÙ¦<¥/p,ÀÿrSž6Ñ~¼)Ïdì©£ÄL7åýú³h}«)ï ÈÂñµ¦¼#£tLFÕ@Mvû=ê¾RÔ\¨VNoñ›_êh .ú Ù>ÏŽÔʳêh¶ÍI×ÛMy²îi”‰zq/‰â`*£Ó(¤Ûg@'Ø +Á¹´TWšŸ\î*¥‹ÐoI|‰veŠüíöÎú9kñŽ>èýîe‹óµ-îR„´xÓõ–Å{÷Ú°xÛý¦ÅÝL0è·—²øJí¸Ÿ°;ã]LT™[1E¥l»s´ÝÕ„œÌŠî·µã|!{Gì/U³_häìž×': p®g£¶»WŸ.TÄiÙ$S•›aES˜¢7KÝv÷jô +=KH•LQ6ûår«‡=TuÛÁËì.-/º}h¿ð{ +ãuÙrUmw‘éíµÔÐÈo¹—z}hFÍ~@äwB*‘}Éë7û]Lw]ƒf¿ŽA³_ŽëB]­ß‹6]¨–gs«ÿžB‹×¨Å°`W1’[†›·ýCÐZµ ÌLi­F-Æã„œ j¿lOä­há^ª(Áð¸×©2°F1Wµ.•öš}ÏAÍ>Sç«“°‡u ;0&y–ºI*í‹á;½âÆwQ›m.R¿¢æXE×^¯§å ÖóG_¯§×Mtôõz&Iå°žXÑe𦸣o[QÔ¿ ï«oÖӘʫvÕ¿Ü¿xüE+n1(<ŽÖÑ’t#œd‰.„ÖIE›8©Î_—bX>›ÂIõò“jìÓBQ}ñ}Z]}¿ÔoŒù~cŸV~lç üdcßáâžm¿Ì\¤yZcŸþ¹ç6öé7bþhcß·ÒÝæû´b“C†þvcŸÜq»ú”FúGû´ºú´”Í7û´¢kÑëüÁÆ>­®>ñ÷û<]}»SÜŸlì3îaÿ±Æ>­ömìÓØa᨟mìÓÀ)®ÈCÿLcŸÖþÒº¸ù{}Š=ä/L8P_jìÓšê×ÿüxcŸ¹Ãâo7ö)§"~”hGºƒN$š™Æ>óDûVcŸVW>ÂûÙÆ>­®¾_š/üVcŸÖ¥Vßoì“#¶èv¬|½±O˯þµ»_@oŽ/4ö)&Øuõ)Ëyt·[,Ç_Õé–^¶õ³}2ÙØwõ™‹=u)b¶ÿGÿ ÿË}K +þ:íæ$½³„“QŒøK¿IV#†×íCÎôQ¿CDñHõQ8öOsa¿„»Ì©£äô?-¶Ü?ù?ÓïŠ8þ?“Ísû#))"ø*©FG-ºê £×*[#NÆIŒL¼ÀÏl¥Ö»zUþæIuR»®K_Ù ´ôË3NÃéàöQsúS2Ñçü$ L²Uñ’Ö¹§¹´ÙI/ÿÓ'šüýß*Á@/ÿSíËUÆ/ÿ3åøÞËÿD¹1~ÿŸÙž>Ýš‹Óê¡¿üò?eE—ÞûÿNk•Òxùßa2ÅduËi/ÿÛYÏ#ïÿ;ùåfï¶Kaû.G”~²ÇcY2ÑÜ´¯:Òf¾ù‰n¢’úÙ_ëéÓ-o<¡ºmüW»r)ÛJŠÍI0êå;, QYOs´9¦º‹Ôt +.Øo©©Zšœb®SÙÕÔP' ¿fùPVßó%ñ€jðHJù„R+üX©¾žà»Åñ -<™ÓP½ÿé¯à”8M5Ñw}ñ,{¨«:ÍN¤_¡uÒ;$æ=œ¿vïüÑnßSeÑjàã#§Qf3{h*MÿHt NkxÙܦ›òºÕ¹)jʃMM·b/žÈ‘;¬Ú¾[|çòu Vü»w? ¶°|¹ãí¾Üñöû7àîû_ßjÄô˜m¡0,E}ûœÏòë®1Ð1ôð%êèDÕHGËbU­$HP »(Nm¡xXbaTƒDUïýS&ˆOkT;¡¥iFÿÕ?ù®ïÿ¿·çlK&Yöûû<ü@Eòr”QP2¨¼ätÏÙ/÷·ßN3Ó3 Ãî={ÖDuwuuuÅ.Ò'¬Gº'ˆê—Ôý“ëž*¥ÿÎÉ!Ú¯û§ ´S¢qÕ¥ÒÏÙ)j  RóDtmhzëþ çÑ™íû¹ÒæŒ:yúŽäËk ?ež.íRO¶/g¦Ì¡‚uºjp>Ò‘÷¡'ó²}ßÛ¿<¢ :¦€ëàq@—¯EXç»æÙv§eßï‡ì("!OϾW9‹ækÕ”qFû±ƒúÖcg}R"•šÙN‘™&÷U—HE,Pp¤ý#?+êG™>¿‡4½g¸ChËó°­SŽ4=†6ºgg­7—Jƒ»†­îƒ;/T>)ïôéäD*OS +ý=ß-zv²ÄH7#O»îÍïiÅ0¡°Ìk9VNÍ»íoj×Òî©;ï@;ùT­CVuíwŠaB¤ôy£t¬wÛJ„t…ãy· ½y·j}Ú çAÝÒ᩵WHË8î{„ç§©âÌCi³^óÛk’0xjÀ<ÃWø'ar Ü÷0Å0ò ÝžRèZœ>Ë>ÒÈ,Gn½ánÖôB•—¦3óáÐâf‹ZfžAÌ꺧:¢ü÷á2|%½¦XMÞ°7ö—;Ø*›ûzz9ت…»ï ­¢€4<Ô*M—z¡Z•çÈm®~F‡2ó‚…øêzöAEw+Rmƒ­ Ç´Êð…Xe"n…¤ËêŒoJD<œþ0¼ñn5ïì¾ÑëF™x;²~%]ºµZ-Ý*ZE±×⦃­š-׫ljG!¡}tE&ÖngŠï@ùi{7›é¿Zµ³õòÑï|0I– Ù8a–ÎgÒ!ƒ¬7ÖÙÞfšÛ­s&ú`3šÖ}wÒGFot¦y¸ÀXå6wÀ ¥jLQÍ?ÂÁGæ´À­Ã}:µešÑ_•ÛRPN-L“93pK-U mõ:.µQ¥/J³+0Íh$íô¸#Á ú¨Š€’yÍ´#ˆðH ü^ˆ¢V²Ý~Øé}›tDOÄœ®ÀÆå3ÖMäpø;éŽj 9ëR9ß³½Ø6MTÜìå]ÇÎíQáVwFTöóM[ãVÕ‘Õ™MöÌÒ ×Õ/ØÓ²'™ÁÛÓ`JâÅþo˜·šuž—e™Ñsð*rÁÍ/œ?)´F˜îBæÂÚç– +ÑÇCó«3Sye³ÙËý¢&Ý÷˜O·!ð@Câ¯Ôµç#8õ¼$…ùe\*"MÒp¬Ä«î„6 yN×Iò¼Äcòœú «ÀL‚GŽb8!›ŠX6iÝSó(†Ãyv‡bÐ'ªËºõs0I@OµAÚ¤šW²ÿ rKUÔ\xúsK×rÿäaŠ ,PZÐŽ©1Ç:f“d´c¥ÊO¦‚ð/DÚÑl¢“vÒù(G‘vÌzÂ05¯HÛËb®ÒxO+4Hí7ç¤$êÍG¤—ç)‰{8H‹êg¤$jx±õÙ¡õ¥$êÍG”ÂSaœXhP5ÔJJ¢Þ|DƒêĺSõ¢Tm÷=õ*3ííOo*ÉÑ‚‡úë^”¢,BQ­vhØÏ[;¯à¡6”ýˆ®3 ª@q)µµ³ƒß¤‚‡GYçï<ÔÎŽ1Pg¦\TðP;Jb6—Ò.+x(ëØ^µÃ³%eÁCmÏ„AûH#ý5öŠ´›A‘÷¿QðСYí{ØO?Ùe´ç®DÏíBއޓYÙ¯Z˜QZ„Á3U-Æûï[9Ôò(åTµT˜¼ÀUÒÙÇsù¶†óÄ<¬žyž&3-@#¿ìŒÒëu¼:N0Ûè}’ ¾¿ð·qs}³º +Ž×JomºùtXLÐjdºm`¦—Éû›tDâ«#©6¯ãÉ‚Ífÿ2lö¯+Ìæž3ln1.±ùç‹-Ÿ:liöõÍ–§£öåÑb_‹ã7¶¶ùùbߨí”}kÇvì»ëÍÊ65Ûê›áhØv»þÅvªž-ÛõÔoÙî£õy½^g™õæsYï¸ùÛz× Z7· ª[˜jzë åÂSè+ñÖj~›ì–›zå:™¦n*/ù{ËÏäÆl1OÖ«éàÊÐÞ¥Üÿ[ÏDíB^¢iç\zŸºhZp^2÷úzÃ^†àYe¡ê@&sƒò]7˜àZ2¹R /*)Î ©°NÀWØ 0²[±ÝhÛ¶^?¹cõÚꎨç6ÁæR)6÷5¸‡HË—Ÿf›«¶¿óiM¤Áø*눟>X&×1Á Ég6ûè ú‡,S9«J¾Œd¥ »Ö±Cc%š**™0hdl-&[ôÉkr1·o0 8cºÎ“Ó–HÀg÷&dzù æ?Áw&WÒ349ëP¸5ÙWW`¸½U6*há‰^sö4I{ ÇÕIDJ¦5š \– ‚«—%çüþŽƒ«·ÒýYfbv£ßz®C³-ËZOCO ‡´’«¿#;øQÁ†kš~Ý®ðÖAnÃV¼u‘Û’—Á?ü`›LV!–ñÙälQÚ$Þß[l¡_¬ƒfrÛÇçdç]¡«vGÆy³ËY Å"çLßôÅNúEŠ/Üô‹ï˜Ð`¼„Í 6ò´LÜäÃ60oW6vhµ†…g ‡ØÁ6—m‡£Â‹œKz¢ìÁ³ƒe'&_f¡ùØAù^У'\ù•ë·ozB/Ÿhª¸þ’ƒ¨zv‰´t XŒÊÏnüÉÀŸæá-‹Ò¸A¡Œn1P¸ß š™¼FÎÁ<¾L<àƒW'ú€·ùÃ"n^ݸÖvdùéËMÖ²µöíšf{bú)ÒäÞ("ýŠ|ù•9¤<,Ù¼²H޹ÚDµÈÚ¯yŸ’ÖЊ¸6ok¾˜ÈÔ6>xqFºžëh´‹‰·í†aèï½@m-Sˆ¹ác7ÆR¦Yäò™AÙG®¦5ž\í>Úhã³¶^‡\ñß>À‡tš ¯éFŶøÎ´Ä +ë†ïìªx×VÿzÔä¥ñÝÈð¯øÂëÈ¾Õ p4}j4ÝwS.òˆçîu[MMÝßödeðù™‡¢éEÒ$Y¡iZ´”X(Màd)ÏÍ®8Zm1h  _ób`‰|øÈU¦7͈Ÿzȧo³¤²Gåôk+—™šÉêëçm¶ïJ¼!¡E'ø“5²]ú1Rá©´e¡dÈ¡$ÙA¡:£½8î¿Iï2Íܨž¹î²éV¾Z·Ê kö=õxŸ²M×°û ©,ë†9‘fiÏOßêŸÉ‚ßÔGÜP€{3…¹%L4¼Eì,Üàð@êÌg‘^YçØ\±ˆ¬2ß¹±R‚´Fpëµ!/мð6ìà€ìqÁ)Îþ'øÅ Ÿ¹‘VŠ™†¸|Û ƒr +Ìž­S”à ¬ + ÀVø»RòYÄ£,?«q´œ¼ÒÝIrȧšµ;Âoe}ý8Å~ó©•ÈwrAÐBcáFˆRߟ8dÁbd…O.Ô l8¿ Ã(Ÿ'FluÈh0¯röÜÕL;–©$ìzDD"¶–dGLH‚7¯ÚïødˆsL·‹Ýްéò$³¡$€gÙû~ 1ïä–>Ry)„>"Çñ¯ö>1±òOnPµ'~‚ÒWb§…¯ÄNŸõ‰Ðc¸­)F/ ÔOIßðØ¨£=Ó†QdÒì¬Á†u·¹sÜEòa"k  !õnÐÕ§×¾f6ë*Æ@WmÏÍ`æòXÞŸQWÙ/ëõlŽ“p€þÄãG£ã«ýO,{ŸÜOz‡?!ËSúÊ'tÚ²×és>!=†s£=± S‡MÀÍÁ&r…Ä 4ÎaWuøL~ŒÖ­]aJƒÊ–,5³çò8´Ò…¥nÓu¶íԒͳì´$§ÁÇ.ð8¸Ãß[ÁJ¡@ÏL[ëF„QQÀ‚¼=ïö’@&¾™gÖëØÂN‹ê@¿CÍD]ØŽ€öÞjx$šÃúÍMê:#ÀX0ÖëCàrõ<'é—'î2 ÅV¤21ãx-‹öfì ÇÑÎ#<{[ Ïkf\ž;$ H¬O² ++9Ÿ’"×M42« +jŒ­ß]©Ô­çá‰"S<$tÐŒ¬‚}Ì—#^ Î_Y 6ëÝÇTæôÂh<ò„ôÂï8ت™´:(?B ʼwÚÈV7-˜,Ö/שƇƒœœ„¶ö¯«Ÿ@M÷æqöÒ‘1Ú”BÏ‘Ф‘ºC#a\"ÓÆCÂCáá&jê +xð2`w&TOdkÔFÂ]x2G$€ñ`¿‘ãÁ%â´*ÿCTlm$ (t´v&ˆ4&ïæÃ¢‡pmDß)Ûƒˆ„BËmþ[€ög‚ÐŒD˜±Œ6›€È0w€ hJ@´+(R DI`pfÇé…Œ@ýÕyÙ@Òn—ÚÒÍè²§0#*ËÓÚÚ/!m(:TÀQ`/î1d@ñÑul ½è“Àó1傲l"ιL³û¡›œëºÈ!s¾rˆÇ7Ù?Öž•i@hµ‘Oáacâ§7Þ§Lw/ö2JÕ.¡´’×­@Iiš0Ú öbJ»ý±^FiìÜvEiš0JçQ*¡(0(­PE¨^lB“£ ŠÚ0ò%óñu«  fuPÛÚYú˜:6åSŠIàÀŒä¿½G×¾v'–a<ig ¤p`ôÒ&-rÐ)¸rç®À_â¤N¤“úNX#…»*¤k »‰ Ø»u×¢Œ~ûæ²-¡ÿíp(:Av¸{XrzHKÑ ëä××Eô=pÅÜjØÍèÝš möÈb?Î:wÅ;d¡œ oŸkIbóqV$k*|PA—iàÍÜ9:õÌ®—/¥[÷@ÆÃŽ_*…¢¥äYOˆR"yêdV´ÈîësêVÇ#GÈ7+gš¹Ækrðü”KÙþÞ¼€"…ì{Ú mfÝ'ðÉ÷#hšG¡V!¡ƒ§ºÏIЦTàW¥·ì{ÂÓ0º%tåJ¾…Ý_í+—ƒ2¹íõ$ýjcjÝfШ1Òžœ”}´·rʴЈ[¯íp¯™Xu…Duɧ‚%K„Øpmw‰ˆhõLù¶•ëQ¾ÕìÿMMƒWAh¼‚ªhÏäì _ÁŸAÓdñ½&‹o‘£‚ï PI.ÇÆ{ù)“euNpؼ³@¶Èp•nEåÂ.0¹Í5EÛQöLdiΞfn<© '6ï71ï´¾xAž! ©<(¥}D°FàQ‹Á&|§¹‰¦}œ`zYBÕÒ- ®Ÿ$vP'q#|ñ¶ªé[æSMOAêy$U}+ʃ œì}…ó;âÓ+†¿Õ'.D%&ºA4†G–[°!—Â\!ᇋz¹®Rnfœ¯å°p OçðÆãGƒ£~+XÊ|bwÌPä(¸–Y>3óþ;ä)³`hj£iÍ:÷ œ”ZËØÏ  ÇæPýns8RâƒÖl.«®¨47ÌãW,ÊgMYÐ`läç“RÆcyzAWˆÔ'° Ëj ôâõã‡Ô½GŽ;[äf3t‰pŽ;Þºƒî”`Ž ?ðvý `Ø9¯ ‹#†JJBCš¡€fjsšá/Â|k{rÜE¨âB‹Å€óA.€?­.á!,]äHÿ´ÓÒÜ O2›  :²SUe©š• äÈr˜ 2ií¡)€mCàãœU`Ð媠>XÞ…P4íÇ–RàRb +RÅþ;™1Þ r¡ko3s5JVÜ_«ª@ÏõíÅKP5‹áÏWƒ­ûnÒA¾&WؘŸ‚ù ß‹k$|È6ÏS¡VÈ—#G Íå‰ÿÆÊ9­±€Cá÷=Šáïùm-ÍzØVr»¬YðáÛ×™ÀÚdù;óbcJp+3mCŸ6mCƒ¶ôGŠÖåK!>õaocÇ]fPæÑ‚¢‚g䯒MÉGÙK{æ¼àª³Â~NG^= 1=0…É±Æ í‹­˜b¨<é. #?ïÄ47´8oeÎ¥w¡*6]¥Ý¶ý1âÕn1ý ŽœÕˆ[ Y‡Ø¯ ðƒZ¬d§›°_9⻋¼b‡|nv°“d¥ó4å&ñ@6?Þdz_Oˆ<}7ÀfÒÆÞç! ÿ~Cçzˆ–Zµ-ÊÀLê·8ßS±g1/+`"étñh04µÑŒw舜t¨Œ+&"‡7¦[ >ãpÓíÝ4䯠û×гë ØìVyÚu${Oó´~1Ìw=OU@ y?{ß$0Ü;Þæçò\ìãÝ÷œäOt´å’ÊתIÞ6|(ƒQÐÏ@lÄ~?rEØ£Eæg‘ÈCÿwâÜ*y6 +˜[ùŒØÅ±¢¬äQ*ÌË œ +E$`ÙEpv`u<ÿŽáR®I* £<š'-øNaè„3áÂÒ^kóãÂ+*x¶yCn äêE#§.º•œºè–ˆM@Ç·­Íȉ®$Ó>´Á|Sö U-:(%¶KQ3ôâ §ôlÍ¥¸ð"ç¦^´MžŽg³L‹ *ܶ0ºç‰Ž½É׬¢cø‰Ž½*¾_¹;k¡Æ-F?@ÕªxÄ×Ë2ùGo$» ‘^‚N•“¬ŒJÑ%ˆå;;a@•’}°Y߀Û* —6eì®Ô1\Àæn"ª_»mBdLáÜA‡D5ÊnŠQÚ¶¯ô?W&‚¼†¨®Ì¾¢Dõ*£¤<Ã5Vé¯ÅÂédÍé¦Ëäkrþ®ÜolƒúXŒøñˆ„Ô•"ž³é—$’é!'xVE¤í„'ÙÚðUÏü†è"þÅŽ¯ —‡ü 8d´ˆ®pÌÓÿ†›Ø• ­`Ô̤ÙožÃ(\xÒŠ¯z×陌IO +âéÓÁ“o¯ ü4}TdÌ]-W Dõ¦+Ãô¢qSÿ{t϶ÜÈ÷ì(M‘Û­yÐí$µ!ïø1Õóí·=ãS GVØ`IwüÍYašùºÙ¼&¢wu/ÞÌã¾–ªqV]3¾± „öÜÌ(%ècW·BØÉýŒ„€iÆK«g¾G³ä>y[Áúi¡$½éà-#±]pX#y’ìž0#¶Ov̺zæ/ Ö [WBðJÂ…j5@ssÓw¾­E5ÅëW-üq¨’,àmŸ$îKüƒØ´óö**6:b/´…˃ƒ~Vr@ÙñÁEâQ¾cLæ>º`%î&õ]‡&ÓÔÔ<ÏA‹¿jõdCÄ@âLJf7Ÿq}8PŒ–N þ’‡ÓSÖ…o¯[XØŠC­pÃù2‹"YÀfúEÆF"ŽŸ½‹ÿþ|>Î8#SÝMGëòzü=ž†?Ã&Yä¸Ú|¸È­G£×Ñ·™Å`7ͷư‘I¾¤‹Å /3,†#£“ÈoÊoˆY„ZØ +-3cSEæ+”Ÿ®ª±^æ‹mÄ)vDÄß×QX©cྌ““Ͻ˜¬…Þ6°k!¤wmÊqùô0d%S(k?Ps£÷‡ÎWQö4s¸36O!ƒ_«0 6jºq°o/ð6'tby£ŒW1(èóŠùŸÒC3 +óN0›a$ºšTµj?JLÒ2°®mE!2ÄÁßHîq.r³ŽÄ‚<Å–¬ú‚7¨­R[gKÖ8ÎÉgE}hoÄÊ¢´X‹píÆ°8T߸¸Óná—9FTYz=Ýþˆ±ÀÊŇERLiÊE8ä¢_´báC¿8*_Àf.1öä ´NïªðöÙ.‹÷„Ú4Äï3Y܃ë@˜lÅÎÇf W špŸw{W„˜{&pÏ5Öž‰^!®‹¢™ˆ¤áòºHô*…¹­ŠÙÔ ØÜ‹åMv¼­‹’Pù_ù\Ší›3ƒPM¾ì®ÇÙæ°c_9‰ŒÁ¶ßNBTÛ#Ù«—zæ. ÒË»‹DÙ>§!ÃgêgÒú- òÎ ÛØ;ÒpðÊ#^y1Œld懢Ù Ùo2Âo›¬xÅÉC~»|[”‹š:ø63¹&;Ýä¯O6ü§G6£ÑH;2XºEŦ{,¶2Äk üi¼ÃݺʼnW<ýÝã7Œ"oy¥î@. ôè9×}k¤3Ž -—Ë>¾É–°ùØQ?ìG’‰¨h4i† Ó°(Cm7J!YF°å¨çÅÜnÖï;§Vo€uÚ3ŽÏ˜èòÅÝfv½J¼ˆÝåB×Õaºu…jb•$3Q¯þ9Gr”¬óWåIÈ‘“À/Ë9’š9YÎy„Rn€h§ùëmD;… $„÷‰%œÔ_ú¡tR*Á¥#†VaöR§5¦‡@5È ¯ƒ¤cþ:ÄÈ0vdö1²x<_"…x¼µc//z÷B(~:Ý2ŸrÅÅk{V ¬í…ò›+:ö°Éß+bÙl´œU‹_”Œ“üN£`)ÐyAÞ)K‚ËO< “³ï,8à•[|ƈÏÀÜ8_VP\X‹Áå¬Õݤ°Y,bg8 ®…-ˆ4SG64 QÒ©¾r¹w…‹žXh§ð±öô$„9L°\[Àƒ¼œa×»º$°5³¯. |B¦KºUR2°%!6£…·C3Àò(1$v 8wg:#°™U"UÕÂTEJÛƒÑX*ˆòDŠÄ‡–NÈ"$õ‡Ëâƒt Dš%ŒþæÂüì¤POÙòÔ?#•Ï3bf ²£õâ•Îå¡›•ÑF1i²Ø¯)wéÕBca:Þ UlÄTàÊÚ,ÀhÌ$lá±1 Ûj|ŠdÜ fŸÍµ +òëÊìrJ{™_Ni£íI0öLM—SÚÛürJk,.aÄ@­`/T¾©5Ÿs±IQÚdwÙŒ4:‡×-9ôÀè¯.éÚÖ#U„ꟑÆêÚ—è +í7G2¹¾sìy¿h kåQ[ „ êÇÎ|Y'šWW:6i~ó)Á0ݾýÈ +%÷ûº·i“Vô£?ZCÆ‘NüPt¥`z‘ÑŸl.fýùöè¬jîKý•r¥«ËÐZäÙß™èÛÁ•Yvk¹2 8›¹˜ ô) +&ë‡Ý ¶u“sµ,ÁÊX:D©ù¢Ú‰òó‰Fkxe1oêçPJá‰G œtŽòœ~”€äÉl”·”C<&åö· uòæÄÓ.ÊaJ'¹Z—ìþñ2•ŒJ‚Oò1;uzl4#ø ÒNêÕt¾è†f ;Ÿª:°rÞÚüÝ¡tWìm3]%ã2I(®äØ.sAcT(JA ß—ÁꪔìD…gú€Û‡]¦ØyWùðˆ§8(3'ö 6JbºT3´»ë¨÷Í¢<*OŠ˜Îa¡áf.)ؘHÛ}ð9Ìç·£×Lq3IÑ•Ð%.Ø0é¬|Û´s%œ1ÐóRÞRŠÈúeì%®ë~!Ô߯³\¿T´«Nôî2ý6y0eýžG¸z 2¿“ª ;Qáá@à¶.$ÎO>XáªÍQÞRÊß?zèß>rù“WB6údæ?ÃM-ý!£¡m<Ûºd¢’Ù¶Y.Ï%¬àªÇ WCÉÏ; Ƨí_ï^w|Û·œÝ‡ë&ðæ2?æº7ØCê±t6;Ï_hù©()¨Óž™ÂCÕ³ø1…߀QÍâÿÅ~:”D™Åÿ‹)ü’¦x~Œ]R“!þðõÛ) ®‡Ý4pÉW#ž] ¦pΡ[´“i—(x|½Œ¶»%úÄ×I¾ÇóRïŸÑÚð‡3âXðü/ïó!øÖèƒK/Vô±‘·KsÃÖ˜„Vî“\o3ãÁv¼˜÷ÖÿÃðgdR‹ÅÔhM_rïÆì—‹õÖˆþ6ÞŒûÓ‘ñuaL¿¼Øk¶ÃÔKµbÆ6âF: ‘ü9Çv|ðŠ|¨Y"¢ƒz ÿÔÿÿâñ»àÝ=¸ú žýÇȱÆGãG‹5 àe¾ÿþŒV›±þnøSJ¤¢Æ\®£Xd!ú8>ˆ¹F£‘ûWÑÈý>¥QW¦½ÁVn<½þ³…`;ø`ݾPÀïóó>„uïòz|^wˆå=^OÀgôxù ›óá»–;û=¾1Èú=Øíïÿ°g™ðçgu´\lÆÛÅz<Ú|~n³érºÛÀ??‡‹ø;žõ¾á»éâ{áîmp¯½)ÎÓÝp;`dPd@ ‚@0üù_iâ…ñš«ê¨0Zím¶‹à#ŽV_½éˆ`ÔkdŠó-šΈ@+™\z½X¾.¤ÙQù¤:VœGÿ•OMH Q@I w;?ìkd`x “€?C·½€¶^2þÀÁÁÖcäò¤…ò.Žó3Ãç%7%á†õ¡ü™ì†|VDÝؘ‘I/æ_ãùxþ]ém`Çx#•œoǽ鸷¯H ˆ´`ý2N«‰ž„Ëñ¼G¼ÇÄùQÏÉwò;òáoªFM·~–ÄŠ,‰‡,‰ðö}Žäùÿ`ìž_âHÍØÑ剤ê÷²˜ÅÌðµ+èãx8YÖ'›è.ÈŽÜ`=< ¿ =â­ÊW‡ Dø Ý+¾3 +€xã £ vBxn¤/X7Ký/ĆĞï¿QŽì@Ò@Ñò ?/!‚WÇè‡êÜþÈ\¾@PúÞÐ=kAê\êmpp ;éuz¿\ñuÝÌPû÷¦÷?#co>_l{ÛѼ2~¯G°¶GÆÍÏâ?ð ü‘ø •s†?ÿ¯Þv +endstream endobj 7 0 obj <> endobj 8 0 obj <> endobj 36 0 obj <> endobj 37 0 obj <> endobj 66 0 obj <> endobj 67 0 obj <> endobj 65 0 obj <> endobj 97 0 obj <> endobj 98 0 obj <> endobj 99 0 obj <> endobj 131 0 obj <> endobj 132 0 obj <> endobj 133 0 obj <> endobj 164 0 obj <> endobj 165 0 obj <> endobj 166 0 obj <> endobj 197 0 obj <> endobj 198 0 obj <> endobj 199 0 obj <> endobj 231 0 obj <> endobj 232 0 obj <> endobj 233 0 obj <> endobj 246 0 obj [/View/Design] endobj 247 0 obj <>>> endobj 244 0 obj [/View/Design] endobj 245 0 obj <>>> endobj 242 0 obj [/View/Design] endobj 243 0 obj <>>> endobj 212 0 obj [/View/Design] endobj 213 0 obj <>>> endobj 210 0 obj [/View/Design] endobj 211 0 obj <>>> endobj 208 0 obj [/View/Design] endobj 209 0 obj <>>> endobj 180 0 obj [/View/Design] endobj 181 0 obj <>>> endobj 178 0 obj [/View/Design] endobj 179 0 obj <>>> endobj 176 0 obj [/View/Design] endobj 177 0 obj <>>> endobj 147 0 obj [/View/Design] endobj 148 0 obj <>>> endobj 145 0 obj [/View/Design] endobj 146 0 obj <>>> endobj 143 0 obj [/View/Design] endobj 144 0 obj <>>> endobj 114 0 obj [/View/Design] endobj 115 0 obj <>>> endobj 112 0 obj [/View/Design] endobj 113 0 obj <>>> endobj 110 0 obj [/View/Design] endobj 111 0 obj <>>> endobj 80 0 obj [/View/Design] endobj 81 0 obj <>>> endobj 78 0 obj [/View/Design] endobj 79 0 obj <>>> endobj 76 0 obj [/View/Design] endobj 77 0 obj <>>> endobj 49 0 obj [/View/Design] endobj 50 0 obj <>>> endobj 47 0 obj [/View/Design] endobj 48 0 obj <>>> endobj 20 0 obj [/View/Design] endobj 21 0 obj <>>> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 268 0 obj [267 0 R 266 0 R 265 0 R] endobj 296 0 obj <> endobj xref +0 297 +0000000004 65535 f +0000000016 00000 n +0000000515 00000 n +0000040467 00000 n +0000000005 00000 f +0000000006 00000 f +0000000009 00000 f +0000363248 00000 n +0000363318 00000 n +0000000011 00000 f +0000040519 00000 n +0000000012 00000 f +0000000013 00000 f +0000000014 00000 f +0000000015 00000 f +0000000016 00000 f +0000000017 00000 f +0000000022 00000 f +0000367316 00000 n +0000367347 00000 n +0000367200 00000 n +0000367231 00000 n +0000000023 00000 f +0000000024 00000 f +0000000025 00000 f +0000000026 00000 f +0000000027 00000 f +0000000028 00000 f +0000000029 00000 f +0000000030 00000 f +0000000031 00000 f +0000000032 00000 f +0000000033 00000 f +0000000034 00000 f +0000000035 00000 f +0000000038 00000 f +0000363388 00000 n +0000363459 00000 n +0000000039 00000 f +0000000040 00000 f +0000000041 00000 f +0000000042 00000 f +0000000043 00000 f +0000000044 00000 f +0000000045 00000 f +0000000046 00000 f +0000000051 00000 f +0000367084 00000 n +0000367115 00000 n +0000366968 00000 n +0000366999 00000 n +0000000052 00000 f +0000000053 00000 f +0000000054 00000 f +0000000055 00000 f +0000000056 00000 f +0000000057 00000 f +0000000058 00000 f +0000000059 00000 f +0000000060 00000 f +0000000061 00000 f +0000000062 00000 f +0000000063 00000 f +0000000064 00000 f +0000000068 00000 f +0000363672 00000 n +0000363530 00000 n +0000363601 00000 n +0000000069 00000 f +0000000070 00000 f +0000000071 00000 f +0000000072 00000 f +0000000073 00000 f +0000000074 00000 f +0000000075 00000 f +0000000082 00000 f +0000366852 00000 n +0000366883 00000 n +0000366736 00000 n +0000366767 00000 n +0000366620 00000 n +0000366651 00000 n +0000000083 00000 f +0000000084 00000 f +0000000085 00000 f +0000000086 00000 f +0000000087 00000 f +0000000088 00000 f +0000000089 00000 f +0000000090 00000 f +0000000091 00000 f +0000000092 00000 f +0000000093 00000 f +0000000094 00000 f +0000000095 00000 f +0000000096 00000 f +0000000100 00000 f +0000363743 00000 n +0000363816 00000 n +0000363889 00000 n +0000000101 00000 f +0000000102 00000 f +0000000103 00000 f +0000000104 00000 f +0000000105 00000 f +0000000106 00000 f +0000000107 00000 f +0000000108 00000 f +0000000109 00000 f +0000000116 00000 f +0000366502 00000 n +0000366534 00000 n +0000366384 00000 n +0000366416 00000 n +0000366266 00000 n +0000366298 00000 n +0000000117 00000 f +0000000118 00000 f +0000000119 00000 f +0000000120 00000 f +0000000121 00000 f +0000000122 00000 f +0000000123 00000 f +0000000124 00000 f +0000000125 00000 f +0000000126 00000 f +0000000127 00000 f +0000000128 00000 f +0000000129 00000 f +0000000130 00000 f +0000000134 00000 f +0000363962 00000 n +0000364036 00000 n +0000364110 00000 n +0000000135 00000 f +0000000136 00000 f +0000000137 00000 f +0000000138 00000 f +0000000139 00000 f +0000000140 00000 f +0000000141 00000 f +0000000142 00000 f +0000000149 00000 f +0000366148 00000 n +0000366180 00000 n +0000366030 00000 n +0000366062 00000 n +0000365912 00000 n +0000365944 00000 n +0000000150 00000 f +0000000151 00000 f +0000000152 00000 f +0000000153 00000 f +0000000154 00000 f +0000000155 00000 f +0000000156 00000 f +0000000157 00000 f +0000000158 00000 f +0000000159 00000 f +0000000160 00000 f +0000000161 00000 f +0000000162 00000 f +0000000163 00000 f +0000000167 00000 f +0000364184 00000 n +0000364258 00000 n +0000364332 00000 n +0000000168 00000 f +0000000169 00000 f +0000000170 00000 f +0000000171 00000 f +0000000172 00000 f +0000000173 00000 f +0000000174 00000 f +0000000175 00000 f +0000000182 00000 f +0000365794 00000 n +0000365826 00000 n +0000365676 00000 n +0000365708 00000 n +0000365558 00000 n +0000365590 00000 n +0000000183 00000 f +0000000184 00000 f +0000000185 00000 f +0000000186 00000 f +0000000187 00000 f +0000000188 00000 f +0000000189 00000 f +0000000190 00000 f +0000000191 00000 f +0000000192 00000 f +0000000193 00000 f +0000000194 00000 f +0000000195 00000 f +0000000196 00000 f +0000000200 00000 f +0000364406 00000 n +0000364480 00000 n +0000364554 00000 n +0000000201 00000 f +0000000202 00000 f +0000000203 00000 f +0000000204 00000 f +0000000205 00000 f +0000000206 00000 f +0000000207 00000 f +0000000214 00000 f +0000365440 00000 n +0000365472 00000 n +0000365322 00000 n +0000365354 00000 n +0000365204 00000 n +0000365236 00000 n +0000000215 00000 f +0000000216 00000 f +0000000217 00000 f +0000000218 00000 f +0000000219 00000 f +0000000220 00000 f +0000000221 00000 f +0000000222 00000 f +0000000223 00000 f +0000000224 00000 f +0000000225 00000 f +0000000226 00000 f +0000000227 00000 f +0000000228 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000364628 00000 n +0000364702 00000 n +0000364776 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000365086 00000 n +0000365118 00000 n +0000364968 00000 n +0000365000 00000 n +0000364850 00000 n +0000364882 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000043021 00000 n +0000043338 00000 n +0000042445 00000 n +0000042519 00000 n +0000042593 00000 n +0000367432 00000 n +0000040992 00000 n +0000050118 00000 n +0000047431 00000 n +0000047317 00000 n +0000041483 00000 n +0000041880 00000 n +0000041930 00000 n +0000042903 00000 n +0000042935 00000 n +0000042785 00000 n +0000042817 00000 n +0000042667 00000 n +0000042699 00000 n +0000046210 00000 n +0000043721 00000 n +0000043806 00000 n +0000044140 00000 n +0000046493 00000 n +0000047468 00000 n +0000050194 00000 n +0000050464 00000 n +0000051715 00000 n +0000056712 00000 n +0000122302 00000 n +0000187892 00000 n +0000253482 00000 n +0000319072 00000 n +0000367475 00000 n +trailer +<<6178408F51A1D1498CAFDCB7D06B44BC>]>> +startxref +367691 +%%EOF diff --git a/subprojects/tomlplusplus-3.3.0/docs/images/banner.png b/subprojects/tomlplusplus-3.3.0/docs/images/banner.png new file mode 100644 index 00000000..c9ee9963 Binary files /dev/null and b/subprojects/tomlplusplus-3.3.0/docs/images/banner.png differ diff --git a/subprojects/tomlplusplus-3.3.0/docs/images/banner.svg b/subprojects/tomlplusplus-3.3.0/docs/images/banner.svg new file mode 100644 index 00000000..b12d4d11 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/docs/images/banner.svg @@ -0,0 +1 @@ +banner diff --git a/subprojects/tomlplusplus-3.3.0/docs/images/favicon.ico b/subprojects/tomlplusplus-3.3.0/docs/images/favicon.ico new file mode 100644 index 00000000..518213d1 Binary files /dev/null and b/subprojects/tomlplusplus-3.3.0/docs/images/favicon.ico differ diff --git a/subprojects/tomlplusplus-3.3.0/docs/images/logo.ai b/subprojects/tomlplusplus-3.3.0/docs/images/logo.ai new file mode 100644 index 00000000..a5f4a11e --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/docs/images/logo.ai @@ -0,0 +1,2318 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[5 0 R 27 0 R 48 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + toml + + + Adobe Illustrator CC 22.1 (Windows) + 2020-02-25T22:34:07+03:00 + 2020-02-25T23:14:44+02:00 + 2020-02-25T23:14:44+02:00 + + + + 256 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8ANPK3n/zpquhwXd9rFzJc MzhnR/SqAxA+GPgO3hnSHSYh/CHQDU5COZTX/FPmX/q63f8AyPk/5qwflsf80J/MZO8u/wAU+Zf+ rrd/8j5P+asfy2P+aF/MZO8u/wAU+Zf+rrd/8j5P+asfy2P+aF/MZO8uPmjzKRT9K3m//F8n/NWH 8tj/AJoX8xk7yo/p7zB/1d9Q/wCky4/5rw/l8f8ANHyR48/5x+bv095g/wCrvqH/AEmXH/NeP5fH /NHyXx5/zj82Aec/zD8+afrbW1n5h1CKERowT6zKdyN92YnJx02P+aGqWoyA/UUj/wCVqfmR/wBT LqP/AEkSf1w/lcX80MfzOT+cVKX8y/zElYFvM2qAgU+C8nQfcrDCNNj/AJo+SnUZP5x+az/lYv5g /wDUz6t/0nXP/NeP5fH/ADY/II/MZP50vmXf8rF/MH/qZ9W/6Trn/mvH8vj/AJsfkF/MZP50vmXf 8rF/MH/qZ9W/6Trn/mvH8vj/AJsfkF/MZP50vmWm/MPz+ylW8zasysKMpvrkgg9j8eH8vj/mx+QX x8n84/ND/wCNPOP/AFfdR/6S5/8AmvD4MP5o+SPGn3n5u/xp5x/6vuo/9Jc//NePgw/mj5L40+8/ N3+NPOP/AFfdR/6S5/8AmvHwYfzR8l8afefm7/GnnH/q+6j/ANJc/wDzXj4MP5o+S+NPvPzUpfNP maZucur3sjUpya4lY0+ZbCMUe4IOWXeVn+I/MP8A1dLv/kfJ/wA1YfDj3BHiS7y7/EfmH/q6Xf8A yPk/5qx8OPcF8SXeXf4j8w/9XS7/AOR8n/NWPhx7gviS7ytfX9ddSj6ldMjbFWmkIP0FsfDj3BeO XeVH9I6h/wAtUv8AyMb+uHhHcjiLLvIFumpfX/rzST+l6Xp1lkFOXOvRh/KMjIBnA2y//Duk/wC+ n/5HS/8ANeQZ07/Duk/76f8A5HS/814rSjJ5R8uyuXksw7nqzPIT95bCCjhC3/Bnln/lhT/gn/5q w8RXhDv8GeWf+WFP+Cf/AJqx4ivCHf4M8s/8sKf8E/8AzVjxFeEIjytpGm6T+ZflCTT4FgaW8kSQ gk1Uxlf2iezHMfVb4pe5u0wrLGu9L/IP/KM2/wDrSf8AEzmRLm0w5MiyLJ2KuxV2KuxV2KvLfzC/ 5SN/+MUf6stjyaZ82M5Jg7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWefld/0s/+eH/MzK5t uNnmQbHYq7FXYq7FXYqo6Z/5MfyZ/wAxz/8AEBlOp/upe5swf3sfekfkH/lGbf8A1pP+JnMiXNph yZFkWTsVdirsVdirsVeW/mF/ykb/APGKP9WWx5NM+bGckwdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirPPyu/wCln/zw/wCZmVzbcbPMg2OxV2KuxV2KuxVR0z/yY/kz/mOf/iAynU/3Uvc2YP72 PvSPyD/yjNv/AK0n/EzmRLm0w5MiyLJ2KuxVJf8AGfln/luT/gX/AOaclwljxB3+M/LP/Lcn/Av/ AM048JXiDv8AGfln/luT/gX/AOaceErxB59501Czv9ca4tJRLCY0UOARuBv1AycRs1SNlIskxdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirL/IGs6Zpv1/69OIPV9L06hjXjzr0B/mGQkGyBpl/+ M/LP/Lcn/Av/AM05HhLPiDv8Z+Wf+W5P+Bf/AJpx4SvEFS1806BdXCW9veLJNIeKIFcVP0jBRXiC bYGTsVdiqjpn/kx/Jn/Mc/8AxAZTqf7qXubMH97H3pL5GjeLy7DG4o6SSqw9xIQcyJFpjyZBkWTs VdirwfL3GdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVTfyn/wApHYf8 ZR+o5GXJlHm9hypvdirsVQ+nyJH+Y3kxnNAb8qD7sAo/E5Vqf7qXubMH95H3pb5S/wCOSf8AmIuP +TzZc1BOsCXYq7FXg+XuM7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq m/lP/lI7D/jKP1HIy5Mo83sOVN7sVdiqAj/8mD5K/wC2nH/xNMrz/wB1L3M8P95H3oTyl/xyT/zE XH/J5stawnWBLsVdirwfL3GdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVTfyn/ykdh/xlH6jkZcmUeb2HKm92KuxVAR/wDkwfJX/bTj/wCJplef+6l7meH+8j70J5S/45J/ 5iLj/k82WtYTrAl2KuxV4Pl7jOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2Kpv5T/wCUjsP+Mo/UcjLkyjzew5U3uxV2KoCP/wAmD5K/7acf/E0yvP8A3Uvczw/3kfehPKX/ AByT/wAxFx/yebLWsJ1gS7FXYq8Hy9xn0h+Rf5Y+RPMXkGLUtZ0mO8vmuZ42mZ5VPFCAoojqNs0m u1OSGSomg7jRabHPHchu9B/5Ub+VP/Uvw/8AI2f/AKqZifns385y/wAli/mu/wCVG/lT/wBS/D/y Nn/6qY/ns385fyWL+a7/AJUb+VP/AFL8P/I2f/qpj+ezfzl/JYv5rv8AlRv5U/8AUvw/8jZ/+qmP 57N/OX8li/mu/wCVG/lT/wBS/D/yNn/6qY/ns385fyWL+a7/AJUb+VP/AFL8P/I2f/qpj+ezfzl/ JYv5rv8AlRv5U/8AUvw/8jZ/+qmP57N/OX8li/mu/wCVG/lT/wBS/D/yNn/6qY/ns385fyWL+a7/ AJUb+VP/AFL8P/I2f/qpj+ezfzl/JYv5rv8AlRv5U/8AUvw/8jZ/+qmP57N/OX8li/mu/wCVG/lT /wBS/D/yNn/6qY/ns385fyWL+ao3v5I/lZHZXEiaBEHSN2U+pPsQpI/3Zhjrct/UiWjxV9L40zpX nXYq7FXYq7FXYq7FXYq7FU38p/8AKR2H/GUfqORlyZR5vYcqb3Yq7FUBH/5MHyV/204/+Jplef8A upe5nh/vI+9T0FFS2uUQcUW8u1UDsBO4GTjyHuYHmfemeFXYq7FXg+XuM+uP+ca//JYQf8xdx/xI ZzvaX978Hf8AZ/8AdfF6nmA5zsVdirsVdirsVdirsVdirsVdiqH1H/jn3X/GKT/iJwx5hEuT8/M7 B5N2KuxV2KuxV2KuxV2KuxVN/Kf/ACkdh/xlH6jkZcmUeb2HKm92KuxVKp3dPPfkhlNCdYt1r7NP Ep/A5DN/dy/qllj/ALyPvCpon9zd/wDMdd/9RD5KPIe5ieZ96Y4VdirsVeD5e4z64/5xr/8AJYQf 8xdx/wASGc72l/e/B3/Z/wDdfF6nmA5zsVdirsVdirsVdirsVdirsVdiqH1H/jn3X/GKT/iJwx5h EuT8/M7B5N2KuxV2KuxV2KuxV2KuxVN/Kf8Aykdh/wAZR+o5GXJlHm9hypvdirsVSi6/5TryR/22 bX/qIhyGb+7l/VP3Jx/3kf6wVtE/ubv/AJjrv/qIfJR5D3IPM+9McKuxV2KvB8vcZ6t+XX59Xfkr y0mhxaNHeoksk3rtO0ZPqGtOIRunzzX6jQDLLiunP0+uOOPDVso/6Gy1D/qW4v8ApKb/AKpZR/JI /nfY3fyof5v2u/6Gy1D/AKluL/pKb/qlj/JI/nfYv8qH+b9rv+hstQ/6luL/AKSm/wCqWP8AJI/n fYv8qH+b9qpbf85WahNcxQny5EokdUr9abbkaf76wHsoAfV9iR2mSfp+19E5pnbuxV2KvIvzU/PW 78j+Zk0WLR475Wto7j1mnMZrIzLx4hG6cPHNjpdCMseK6dfqdacUuGrYf/0NlqH/AFLcX/SU3/VL Mn+SR/O+xx/5UP8AN+13/Q2Wof8AUtxf9JTf9Usf5JH877F/lQ/zftd/0NlqH/Utxf8ASU3/AFSx /kkfzvsX+VD/ADftU7j/AJyt1Ca3lhPlyJRIjJX6023IU/31iOygP4vsU9pk/wAP2vBc27qnYq7F XYq7FXYq7FXYq7FU38p/8pHYf8ZR+o5GXJlHm9hypvdirsVSi6/5TryR/wBtm1/6iIchm/u5f1T9 ycf95H+sFbRP7m7/AOY67/6iHyUeQ9yDzPvTHCrsVdirwfL3GdirsVdirsVROnf8dC1/4zR/8SGR lyLKPN+gWcg9W7FXYq+UP+cnv/JkRf8AbOg/5OS50HZn918XRdpf3nweR5sXXuxV2KuxV2KuxV2K uxV2KuxV2KuxV2Kpv5T/AOUjsP8AjKP1HIy5Mo83sOVN7sVdiqUXX/KdeSP+2za/9REOQzf3cv6p +5OP+8j/AFgiNJiaIX0T/bjv71Wp4i5cHJQPpHuCkbn3lH4UOxV2KvB8vcZ2KuxV2KuxVE6d/wAd C1/4zR/8SGRlyLKPN+gWcg9W7FXYq+UP+cnv/JkRf9s6D/k5LnQdmf3XxdF2l/efB5Hmxde7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYqm/lP/lI7D/jKP1HIy5Mo83sOVN7sVdiqTX8iRedfJcrmiJq9szH 2E8RORyj93L+qfuTD64+8Jha/wC9eq/9tO//AOoqTHH9I9wTP6j7yickxdirsVeD5e4zsVdirsVd iqJ07/joWv8Axmj/AOJDIy5FlHm/QLOQerdirsVfKH/OT3/kyIv+2dB/yclzoOzP7r4ui7S/vPg8 jzYuvdirsVdirsVdirsVdirsVdirsVdirsVTfyn/AMpHYf8AGUfqORlyZR5vYcqb3Yq7FUg1z/lK vKX/AG04f+T0WDJ9EvcVj9cfem1r/vXqv/bTv/8AqKkwY/pHuDKf1H3lE5Ji7FXYq8Hy9xnYq7FX Yq7FUTp3/HQtf+M0f/EhkZciyjzfoFnIPVuxV2KvlD/nJ7/yZEX/AGzoP+TkudB2Z/dfF0XaX958 HkebF17sVes/kh+U3lzz5a6tLq9zeQNYPCkItHiQEShy3L1I5f5NqZrtbq5YiOGt3P0eljlBu9np 3/Qq/wCX3/Vw1b/kdbf9k+YP8qZO6P2/rc3+TMffL7P1PIfzt/LbQvIuqabaaRPdTx3kDyym7eN2 DK/EcfTji2zY6LUyygmVbOBrNPHEQB1ebZnOE7FXYqrWkSzXUMTEhZHVGI60YgbYCaCQN31D/wBC r/l9/wBXDVv+R1t/2T5of5Uyd0ft/W7v+TMffL7P1IXVv+cYvIVnpd5dxX+qmS3gklQNNblSyIWF aW422yUO08hIFR+39aJdm4wCbP4+D5izeukdiqb+U/8AlI7D/jKP1HIy5Mo83sOVN7sVdiqQa5/y lXlL/tpw/wDJ6LBk+iXuKx+uPvTa1/3r1X/tp3//AFFSYMf0j3BlP6j7yickxdirsVeD5e4zsVdi rsVdiqJ07/joWv8Axmj/AOJDIy5FlHm/QLOQerdirsVfKH/OT3/kyIv+2dB/yclzoOzP7r4ui7S/ vPg8kVWZgqgszGiqNySewzYOAmH+HPMP/Vru/wDkRL/zTkfEj3hl4cu4voX/AJxY0+/s7DzELy2l ti8tsUEyNHWiyVpyArmm7UkCY15u27MiQJW91zVO0fOf/OUml6lea9obWlpNcqlrKGaKN3APqdDx BzddlyAibPV0/aUSZCh0eI/4c8w/9Wu7/wCREv8AzTm08SPeHW+HLuKXZNgirTStUvEL2lnPcIp4 s0UbuAetCVByJkBzLIRJ5BH6f5d8wC/tidMuwBKhJMEn8w/ychLJGuYZRxyvkX3lnJvUoDzArNoO pKoLM1rOFUbkkxtsMnj+oe9hk+k+58Kf4c8w/wDVru/+REv/ADTnV+JHvDzHhy7ihrvT7+zKi8tp bYvUoJkaOtOtOQFcIkDyQYkc0f5T/wCUjsP+Mo/UcZcljzew5U3uxV2KpBrn/KVeUv8Atpw/8nos GT6Je4rH64+9NrX/AHr1X/tp3/8A1FSYMf0j3BlP6j7yickxdirsVeD5e4zsVdirsVdiqJ07/joW v/GaP/iQyMuRZR5v0CzkHq3Yq7FXyh/zk9/5MiL/ALZ0H/JyXOg7M/uvi6LtL+8+DzTy5/ykOl/8 xcH/ACdXM7J9J9zhY/qHvffWci9U7FXYq7FXYq/PTOxeSfT/APzip/yh2r/9tE/8mI80Xav1j3O7 7M+g+97Zmrdk7FXYq7FXzl/zll/x0PLf/GK6/wCJRZuuyeUvg6ftTnH4vGPKf/KR2H/GUfqObWXJ 1keb2HKm92KuxVINc/5Sryl/204f+T0WDJ9EvcVj9cfensqKmsa6iAKq6xqQVR0AF5LTIYfoj/VH 3M8n1y/rH712WMHYq7FXg+XuM7FXYq7FXYqidO/46Fr/AMZo/wDiQyMuRZR5v0CzkHq3Yq7FXyh/ zk9/5MiL/tnQf8nJc6Dsz+6+Lou0v7z4PM/L7pHr2mu7BES6gZmY0AAkUkknM7J9J9zhY/qHvfcX +NPJ3/V907/pLg/5rzlvBn/NPyem8aHePmjtO1jSNSV206+t71YiBIbeVJQpPTlwLUrTISgY8xTK MxLkbReRZIHUNd0PTXRNR1G2snkHKNbiaOIsBtUBytcnHHKXIEsZTiOZpCf408nf9X3Tv+kuD/mv JeDP+afkx8aHePm+Dc6x5Z9If84ya/oWm+UtVi1HUbWyle/LJHcTRxMV9GMVAdgSKjNJ2njlKYoE 7O47OnEQNmt3sa+cvKDMFXXNPLE0AF1ASSf9nmt8Gf8ANPydj40O8fNOMrbGndI0Z3YIiAszMaAA bkknFUn/AMaeTv8Aq+6d/wBJcH/NeW+DP+afk1+NDvHzfP8A/wA5Q6xpGp3/AJebTr63vViiuRIb eVJQpLR05cC1K0zb9lwMRKxXJ1PaUxIxo28k8p/8pHYf8ZR+o5s5cnXR5vYcqb3Yq7FWM+anZNc8 tOh4ut+jKR2IkjIxl9J9yP4h72TXH/Hb1/8A7bOp/wDUZLleH+7j/VH3NmX65f1j97ssYOxV2KvB 8vcZ2KuxV2KuxVE6d/x0LX/jNH/xIZGXIso836BZyD1bsVdir5Q/5ye/8mRF/wBs6D/k5LnQdmf3 XxdF2l/efB5Hmxde7FX0d/zib/xz/Mn/ABmtf+Iy5pe1ucfi7jsvlL4Pfc1DtXzT/wA5X/8AKQ6F /wAwkv8Ayczd9lfTL3um7T+oe54Vm2dW7FXYqidO/wCOha/8Zo/+JDIy5FlHm/QLOQerS/zH/wAo 9qn/ADCT/wDJtsnj+oe9hk+k+58CZ1zyrsVTfyn/AMpHYf8AGUfqORlyZR5vYcqb3Yq7FWL+bf8A js+W/wDmOT/iceJ+k+5H8Q97KLj/AI7ev/8AbZ1P/qMlyvD/AHcf6o+5sy/XL+sfvdljB2KuxV4P l7jOxV2KuxV2KonTv+Oha/8AGaP/AIkMjLkWUeb9As5B6t2KuxV8of8AOT3/AJMiL/tnQf8AJyXO g7M/uvi6LtL+8+DyPNi692Ks+/LH83dR8gwahDZ6fDejUGjdzM7Lx9IMBTj488w9TpBlqzVOXptU cV0Ltm//AENf5h/6sVp/yNkzF/kqP84uT/Kcu4PPfzM/My+8+31ld3dlFZNZRNEqxMzBgzcqnlmZ ptMMQIBu3E1OpOUgkVTDMynGdirsVVLeUwzxzAVMbK4B78TXARaQXuP/AENf5h/6sVp/yNkzVfyV H+cXZ/ynLuChf/8AOUmv3ljc2jaHaotzE8TMJZKgOpWo+/JR7LiDdlEu0pEVQeI5tHWOxVN/Kf8A ykdh/wAZR+o5GXJlHm9hypvdirsVYv5t/wCOz5b/AOY5P+Jx4n6T7kfxD3souP8Ajt6//wBtnU/+ oyXK8P8Adx/qj7mzL9cv6x+92WMHYq7FXg+XuM7FXYq7FXYqidO/46Fr/wAZo/8AiQyMuRZR5v0C zkHq3Yq7FXyh/wA5Pf8AkyIv+2dB/wAnJc6Dsz+6+Lou0v7z4PI82Lr3Yq7FXYq7FXYq7FXYq7FX Yq7FXYq7FU38p/8AKR2H/GUfqORlyZR5vYcqb3Yq7FWL+bf+Oz5b/wCY5P8AiceJ+k+5H8Q97Kr2 Jotd15WpU6vqLbeD3UjD8DleA/u4/wBUfc25R65e8rcsa3Yq7FXg+XuM7FXYq7FXYqidO/46Fr/x mj/4kMjLkWUeb9As5B6t2KuxV8of85Pf+TIi/wC2dB/yclzoOzP7r4ui7S/vPg8jzYuvdirsVdir sVdirsVdirsVdirsVdirsVTfyn/ykdh/xlH6jkZcmUeb2HKm92KuxVivnKVYtU8vyv8AYjvFZqeA eMnCR6T7mJO497MtW/5SLXf+2nef8n2ynT/3cfcG7N9cveUPlrW7FXYq8Hy9xnYq7FXYq7FUTp3/ AB0LX/jNH/xIZGXIso836BZyD1bsVdir5Q/5ye/8mRF/2zoP+TkudB2Z/dfF0XaX958HkebF17sV dirsVdirsVdirsVdirsVdirsVdiqb+U/+UjsP+Mo/UcjLkyjzew5U3uxV2KsP8/f706L/wAxB/Wm SHIsJcwzjVv+Ui13/tp3n/J9so0/93H3BvzfXL3lD5a1uxV2KvB8vcZ2KuxV2KuxVE6d/wAdC1/4 zR/8SGRlyLKPN+gWcg9W7FXYq+UP+cnv/JkRf9s6D/k5LnQdmf3XxdF2l/efB5Hmxde7FXYq7FXY q7FXYq7FXYq7FXYq7FXYqm/lP/lI7D/jKP1HIy5Mo83sOVN7sVdirD/P3+9Oi/8AMQf1pkhyLCXM M41b/lItd/7ad5/yfbKNP/dx9wb831y95Q+WtbsVdirwfL3GdirsVdirsVVLeYw3EUwHIxur08eJ rgIsJBp71/0NlqH/AFLcX/SU3/VLNT/JI/nfY7T+VD/N+13/AENlqH/Utxf9JTf9Usf5JH877F/l Q/zftd/0NlqH/Utxf9JTf9Usf5JH877F/lQ/zfteWfmV59m88eYl1qWzWxZbdLf0VkMgpGzNy5FV 68/DM/TYPCjw3bhajP4suKqYpmQ47sVdirsVdirsVdirsVdirsVdirsVdiqb+U/+UjsP+Mo/UcjL kyjzew5U3uxV2KsP8/f706L/AMxB/WmSHIsJcwzjVv8AlItd/wC2nef8n2yjT/3cfcG/N9cveUPl rW7FXYq8Hy9xnYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FU38p/8pHY f8ZR+o5GXJlHm9hypvdirsVYf5+/3p0X/mIP60yQ5FhLmGf+Y1VfNGthQAPr05oNty1SfpOY2l/u 4+5ydR/eS96Ay9pdirsVeD5e4zsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdiqb+U/wDlI7D/AIyj9RyMuTKPN7DlTe7FXYqwj8zXZItNdSVZXkKkdQQFycWvI9H8y/8AKU61 /wAx0368xdL/AHcfc5Wo/vJe9L8vaXYq7FUP+j7D/lmi/wCAX+mG0U79H2H/ACzRf8Av9MbWnfo+ w/5Zov8AgF/pja08y8/RRReYXWNFRfSj+FQAOntlkeTVPmxzJMHYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYqzj8s7eCb9JerGsnH0ePNQ1K+p0rkJtmNnH6PsP8Almi/4Bf6ZC2ynfo+w/5Zov8A gF/pja0uSys0YMkEasOjBFBH3DFNK2BXYq7FWD/mh/caf/ryfqXJwa8j0jzL/wApTrX/ADHTfrzF 0v8Adx9zlaj+8l70vy9pdirsVdirsVdiry38wv8AlI3/AOMUf6stjyaZ82M5Jg7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FWefld/wBLP/nh/wAzMrm242eZBsdirsVdirsVdirB/wA0P7jT/wDX k/UuTg15HpHmX/lKda/5jpv15i6X+7j7nK1H95L3pfl7S7FXYq7FXYq7FXlv5hf8pG//ABij/Vls eTTPmxnJMHYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqzz8rv+ln/AM8P+ZmVzbcbPMg2OxV2 KuxV2KuxVg/5of3Gn/68n6lycGvI9E87WPnW384awtl5XvtRtZLlpYbyBGMbrIA3wnielaZg6bPj GMAyALm6jFPxDUSUrj0/8xnQOvky/APTkVU/cwBy38zi/nBq8DJ/NK79GfmP/wBSZff8Gn9MfzOL +cF8DL/NLv0Z+Y//AFJl9/waf0x/M4v5wXwMv80u/Rn5j/8AUmX3/Bp/TH8zi/nBfAy/zSui0f8A MqRuK+TbwH/KliQfe1BidVi/nBI0+X+aVb/Dv5nf9Sfcf9JNv/zVg/N4v5yfy2X+axTzH+U35p6x qbXq+WpoQUVeBmt2+z78xkhrcI/iYS0mU/wpX/yo381v+pfm/wCRsH/VTD+ew/zmP5LL/Nd/yo38 1v8AqX5v+RsH/VTH89h/nL+Sy/zVdPyB/NtlDDQTQiordWYP3GYHB+fw/wA77Cn8jl7vtDf/AEL/ APm7/wBWH/p7sv8Aqtg/lDD/ADvsP6k/kc3d9od/0L/+bv8A1Yf+nuy/6rY/yhh/nfYf1L+Rzd32 h3/Qv/5u/wDVh/6e7L/qtj/KGH+d9h/Uv5HN3faF8X/OPf5tOxDaKsQpXk91aEfL4ZWOJ7Qw9/2F RoMvd9oVf+hdfzW/6tkX/SVB/wA14P5Rw9/2J/IZe77Xf9C6/mt/1bIv+kqD/mvH+UcPf9i/kMvd 9rv+hdfzW/6tkX/SVB/zXj/KOHv+xfyGXu+13/Quv5rf9WyL/pKg/wCa8f5Rw9/2L+Qy932ohf8A nGz80CoJt7RSR0NytR9wwfyli80/yfl8m/8AoWv8z/8AfFp/0kL/AEwfyli81/k/L5O/6Fr/ADP/ AN8Wn/SQv9Mf5Sxea/yfl8nf9C1/mf8A74tP+khf6Y/yli81/k/L5L4v+cZ/zMdiGWyiAHV7ioP/ AAKtie0sXmkdnZfJkvlT8ifzF0L61zSwn+senSly604cv+KT15ZA9pYj3s49n5B3Mg/5Vj+YP/LJ Y/8ASY//AFQwfyhi82X5HJ5O/wCVY/mD/wAslj/0mP8A9UMf5Qxea/kcnk7/AJVj+YP/ACyWP/SY /wD1Qx/lDF5r+RyeSuPyn89EA/7jB7G6uP8AslyP8pY+6X2frZfkMnl+Pg3/AMqn89f9qv8A6Srj /slx/lLH3S+z9a/kMnl+Pg7/AJVP56/7Vf8A0lXH/ZLj/KWPul9n61/IZPL8fBIfNX5BefdcjtkS 40qD0CxJNxcNXkB/y7DwyQ7TxjpL7P1sZdnZD1H2/qf/2Q== + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:76ecb5d0-0c0b-7e4b-b891-4dbb246228bd + uuid:9c54a817-4ce5-4a64-99ce-c0de4cc76998 + + uuid:996d8bde-2065-4f79-8b51-b6e5ce5ecaf4 + xmp.did:d8f12d46-b4b6-fa4e-a251-43d6b2c4ec29 + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:76ecb5d0-0c0b-7e4b-b891-4dbb246228bd + 2020-02-25T22:34:05+02:00 + Adobe Illustrator CC 22.1 (Windows) + / + + + + Web + Document + 1 + False + False + + 512.000000 + 512.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 0 + 0 + 0 + + + RGB Red + RGB + PROCESS + 255 + 0 + 0 + + + RGB Yellow + RGB + PROCESS + 255 + 255 + 0 + + + RGB Green + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blue + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Grays + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Web Color Group + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + + Adobe PDF library 15.00 + 21.0.0 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 54 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 50 0 obj <>stream +H‰ÌSËn„0 ¼ç+üljó¸–]õ´ªª~êãЮÔòÿRP(dé½BLÆö0Lˆèè/ÁÝiÓOã„¢¢X€i¼šþ^'¯“Ñ ˆåz=›Cè2«0WLìgý'ØâRQµHDÆú|Á®¼kzæ›ÒKÀ쬶$at ­YÒ΢íò7ø¸IãrD‰1þj±!óAã75Ų¿ßo¢X(WóØ:Èi…«m ’¼’Î:ÞÑ:îD6ìhßž3MR\_Ó±à,ŸY…âÛ¢j’[×Îñ:ÛñŠ‹_SUý¬7Ãüž/ú[| 0i™œQ +endstream endobj 54 0 obj <>stream +8;Z]"8J6Y0$j4dLhg`'5-%=PIHIOiSa(>8iauWVEAcI,VAZh%d +rbW*$�)I^NgIjTBFi(TBFi('E252J*R(.qL@B%;?&TRrti:ukPO^4^Ak&2!%nikbQ~> +endstream endobj 55 0 obj [/Indexed/DeviceRGB 255 56 0 R] endobj 56 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 48 0 obj <> endobj 57 0 obj [/View/Design] endobj 58 0 obj <>>> endobj 53 0 obj <> endobj 52 0 obj [/ICCBased 59 0 R] endobj 59 0 obj <>stream +H‰œ–yTSwÇoÉž•°Ãc [€°5la‘QIBHØADED„ª•2ÖmtFOE.®c­Ö}êÒõ0êè8´׎8GNg¦Óïï÷9÷wïïÝß½÷ó '¥ªµÕ0 Ö ÏJŒÅb¤  + 2y­.-;!à’ÆK°ZÜ ü‹ž^i½"LÊÀ0ðÿ‰-×é @8(”µrœ;q®ª7èLöœy¥•&†Qëñq¶4±jž½ç|æ9ÚÄ +V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚óÈtÕ;\ú” Ó¥$ÕºF½ZUnÀÜå˜(4TŒ%)ë«”ƒ0C&¯”阤Z£“i˜¿óœ8¦Úbx‘ƒE¡ÁÁBÑ;…ú¯›¿P¦ÞÎӓ̹žAü om?çW= +€x¯Íú·¶Ò-Œ¯Àòæ[›Ëû0ñ¾¾øÎ}ø¦y)7ta¾¾õõõ>j¥ÜÇTÐ7úŸ¿@ï¼ÏÇtÜ›ò`qÊ2™±Ê€™ê&¯®ª6ê±ZL®Ä„?â_øóyxg)Ë”z¥ÈçL­UáíÖ*ÔuµSkÿSeØO4?׸¸c¯¯Ø°.òò· åÒR´ ßÞô-•’2ð5ßáÞüÜÏ ú÷Sá>Ó£V­š‹“då`r£¾n~ÏôY &à+`œ;ÂA4ˆÉ 䀰ÈA9Ð=¨- t°lÃ`;»Á~pŒƒÁ ðGp| ®[`Lƒ‡`<¯ "A ˆ YA+äùCb(ЇR¡,¨*T2B-Ð +¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…寒°d¬VÖë(ëk–Íe‹Øél »—½‡}Ž}ŸCâ¸qâ9 +N'çÎ)Î].ÂuæJ¸rî +î÷ wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö +n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=GTB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîƕƩºÈº‘ºçõyõ‡Ø Ú† žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_pß¶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠnßLÝlÜ<9”úO¤[þ˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ +¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ ÷„óû +endstream endobj 51 0 obj <> endobj 60 0 obj <> endobj 61 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 17.0 +%%AI8_CreatorVersion: 22.1.0 +%%For: (Mark Gillard) () +%%Title: (toml.ai) +%%CreationDate: 2/25/2020 11:14 PM +%%Canvassize: 16383 +%%BoundingBox: -7 -519 521 6 +%%HiResBoundingBox: -6.81351234153226 -518.824028253268 520.813512341534 5.8240282532679 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%AI5_FileFormat 13.0 +%AI12_BuildNumber: 312 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Registration]) +%AI3_Cropmarks: 0 -512 512 0 +%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 +%AI3_TileBox: -41.6377868652344 -676.97509765625 553.682220458984 164.944885253906 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 6 +%AI9_ColorModel: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI17_Begin_Content_if_version_gt:17 1 +%AI9_OpenToView: -625.5 234 2 3217 1931 26 1 0 68 123 0 0 0 1 1 0 1 1 0 0 +%AI17_Alternate_Content +%AI9_OpenToView: -625.5 234 2 3217 1931 26 1 0 68 123 0 0 0 1 1 0 1 1 0 0 +%AI17_End_Versioned_Content +%AI5_OpenViewLayers: 7 +%%PageOrigin:-144 -556 +%AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MS +%%EndComments + +endstream endobj 62 0 obj <>stream +%%BoundingBox: -7 -519 521 6 +%%HiResBoundingBox: -6.81351234153226 -518.824028253268 520.813512341534 5.8240282532679 +%AI7_Thumbnail: 128 128 8 +%%BeginData: 30708 Hex Bytes +%0000330000660000990000CC0033000033330033660033990033CC0033FF +%0066000066330066660066990066CC0066FF009900009933009966009999 +%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 +%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 +%3333663333993333CC3333FF3366003366333366663366993366CC3366FF +%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 +%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 +%6600666600996600CC6600FF6633006633336633666633996633CC6633FF +%6666006666336666666666996666CC6666FF669900669933669966669999 +%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 +%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF +%9933009933339933669933999933CC9933FF996600996633996666996699 +%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 +%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF +%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 +%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 +%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF +%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC +%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 +%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 +%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 +%000011111111220000002200000022222222440000004400000044444444 +%550000005500000055555555770000007700000077777777880000008800 +%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB +%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF +%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF +%524C45FFA9A984AFA8A984AFA8A984AFA8A984AFA8A984A984A984A984A9 +%84A984847EA984847EA97E7E5A845A845A845A845A845A845A845A84595A +%595A595A595A595A595A595A595A595A2F592F5A2F592F5A2F592F5A2F59 +%2F5A2F5AFD042F0DFD042F362F2F2F362F2F2F360D2F072F0D2F072F0D2F +%072F0D2F072F070DA8065A365A305A365A305A365A305A365A305A365A30 +%5A305A305A305A300D060606070606060706060607060606070606060706 +%060607060606070606060706060607060606070606060706070607060706 +%070607060706070607060706070607060D365A365A5A5A365A5A5A36FD11 +%5A06A80D305B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B +%5A5A0D0D060D060D060D060D060D060D060D060D060D060D060D060D060D +%060D060D060D060D060D060D060D060D060D060D060D060D060D060D060D +%060D060D060D060D060D06FD045A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A +%5B5A5A5A5B5A5A5A2F8406FD055A365A5A5A365A5A5A365A5A5A365A5A5A +%365A5A5A365A5A2F06070607060706070607060706070607060706070607 +%060706070607060706070607060706070607060706070607060706070607 +%06070607060706070607060706070607305A5A5A365A5A5A365A5A5A365A +%5A5A365A5A5A365A5A5A365A5A5A06A80D36855A5A5A5B5A5A5A5B5A5A5A +%5B5A5A5A5B5A5A5A5B5A5A5A5B5A5B0D0D070D060D070D060D070D060D07 +%0D060D070D060D070D060D070D060D070D060D070D060D070D060D070D06 +%0D070D060D070D060D070D060D070D060D070D060D070D065B5A5A5A5B5A +%5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5B5A2F8406FD1C5A2F06 +%0D0607060D0607060D0607060D0607060D0607060D0607060D0607060D06 +%07060D0607060D0607060D0607060D0607060D0607060D0607060D060706 +%0D0607060D060736FD1B5A06A80D5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B +%5A5A5A5B5A5A5A5B5A5A5A5B0D07060D060D060D060D060D060D060D060D +%060D060D060D060D060D060D060D060D060D060D060D060D060D060D060D +%060D060D060D060D060D060D060D060D060D060D075A5A5B5A5A5A5B5A5A +%5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A0D84065A5A5A365A5A5A36 +%5A5A5A365A5A5A365A5A5A365A5A5A36FD045A2F06070607060706070607 +%060706070607060706070607060706070607060706070607060706070607 +%0607060706070607060706070607060706070607060706070607060D365A +%365A5A5A365A5A5A365A5A5A365A5A5A365A5A5A36FD055A06A80D5A5B5A +%5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A612F0D060D07 +%0D060D070D060D070D060D070D060D070D060D070D060D070D060D070D06 +%0D070D060D070D060D070D060D070D060D070D060D070D060D070D060D07 +%0D060D075A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A +%615A2F8406FD1C5A2F0607060D0607060D0607060D0607060D0607060D06 +%07060D0607060D0607060D0607060D0607060D0607060D0607060D060706 +%0D0607060D0607060D0607060D0607060DFD1C5A06A80D365B5A5A5A5B5A +%5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A0D0D060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%FD045A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A2F8406 +%FD055A365A5A5A365A5A5A365A5A5A365A5A5A365A5A5A365A5A2F060706 +%070607060706070607060706070607060706070607060706070607060706 +%070607060706070607060706070607060706070607060706070607060706 +%0706070607305A5A5A365A5A5A365A5A5A365A5A5A365A5A5A365A5A5A36 +%5A5A5A06A80D36855A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A +%5A5B5A5B0D0D070D060D070D060D070D060D070D060D070D060D070D060D +%070D060D070D060D070D060D070D060D070D060D070D060D070D060D070D +%060D070D060D070D060D070D065B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B +%5A5A5A5B5A5A5A5B5A5B5A2F8406FD1C5A2F060D0607060D0607060D0607 +%060D0607060D0607060D0607060D0607060D0607060D0607060D0607060D +%0607060D0607060D0607060D0607060D0607060D0607060D060736FD1B5A +%06A80D5A5A5A5B5A5A5A5B5A5A5A5BFD0F5A5B0D07060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D07FD0E +%5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A0D84065A5A5A365A5A5A365A5A5A36 +%5A5A5A060D060D060D060D060D060D060D06070607060706070607060706 +%070607060706070607060706070607060706070607060706070607060706 +%07060706070607060706070607060706070607060706070607060D060D06 +%0D060D060D060D06FD055A365A5A5A36FD055A06A80D5A5B5A5B5A5A5A5B +%5A5A5A5B5A5B5A0D060D060D060D060D060D060D060D060D070D060D070D +%060D070D060D070D060D070D060D070D060D070D060D070D060D070D060D +%070D060D070D060D070D060D070D060D070D060D070D060D070D060D070D +%060D060D060D060D060D060D2F855A5A5A5B5A5A5A5B5A5A5A615A2F8406 +%FD0F5A060D0607060D0607060D0607060D0607060D0607060D0607060D06 +%07060D0607060D0607060D0607060D0607060D0607060D0607060D060706 +%0D0607060D0607060D0607060D0607060D0607060D0607060D0607060D06 +%07060D0607060D0636FD0E5A06A80D305B5A5A5A5B5A5A5A5B5A5A5A5B5A +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D305A5A5B5A5A5A5B5A5A5A5B5A5A5A2F8407FD055A365A5A5A +%36FD055A0607060706070607060706070607060706070607060706070607 +%060706070607060706070607060706070607060706070607060706070607 +%060706070607060706070607060706070607060706070607060706070607 +%0607060706070607065A5A5A365A5A5A365A5A5A365A5A5A06842F36855A +%5A5A5B5A5A5A5B5A5A5A615A0D060D070D060D070D060D070D060D070D06 +%0D070D060D070D060D070D060D070D060D070D060D070D060D070D060D07 +%0D060D070D060D070D060D070D060D070D060D070D060D070D060D070D06 +%0D070D060D070D060D070D060D070D060D365B5A5B5A5A5A5B5A5A5A5B5A +%5B5A0D7E0DFD0F5A0607060D0607060D0607060D0607060D0607060D0607 +%060D0607060D0607060D0607060D0607060D0607060D0607060D0607060D +%0607060D0607060D0607060D0607060D0607060D0607060D0607060D0607 +%060D0607060D0607060D060706FD0F5A06842F365A5A5B5A5A5A5B5A5A5A +%5B5A5A5A0D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D060D2F615A5A5A5B5A5A5A5B5A5A5A5B5A0D7E065A5A5A +%365A5A5A365A5A5A365A5A5A060706070607060706070607060706070607 +%060706070607060706070607060706070607060706070607060706070607 +%060706070607060706070607060706070607060706070607060706070607 +%060706070607060706070607060706070636FD045A365A5A5A36FD055A06 +%842F365B5A5B5A5A5A5B5A5A5A5B5A5B5A2F060D060D070D060D070D060D +%070D060D070D060D070D060D070D060D070D060D070D060D070D060D070D +%060D070D060D070D060D070D060D070D060D070D060D070D060D070D060D +%070D060D070D060D070D060D070D060D070D060D060D30855A5A5A5B5A5A +%5A5B5A5A5A615A0D7E06FD0F5A060D0607060D0607060D0607060D060706 +%0D0607060D0607060D0607060D0607060D0607060D0607060D0607060D06 +%07060D0607060D0607060D0607060D0607060D0607060D0607060D060706 +%0D0607060D0607060D0607060D0607060D0636FD0E5A06842F305B5A5A5A +%5B5A5A5A5B5A5A5A5B5A0D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D060D305A5A5B5A5A5A5B5A5A5A5B5A5A5A +%0D7E07FD055A365A5A5A36FD055A06070607060706070607060706070607 +%060706070607060706070607060706070607060706070607060706070607 +%060706070607060706070607060706070607060706070607060706070607 +%060706070607060706070607060706070607065A5A5A365A5A5A365A5A5A +%365A5A5A06842F36855A5A5A5B5A5A5A5B5A5A5A615A0D060D070D060D07 +%0D060D070D060D070D060D070D060D070D060D070D060D070D060D070D06 +%0D070D060D070D060D070D060D070D060D070D060D070D060D070D060D07 +%0D060D070D060D070D060D070D060D070D060D070D060D070D060D365B5A +%5B5A5A5A5B5A5A5A5B5A5B5A0D7E0DFD0F5A0607060D0607060D0607060D +%0607060D0607060D0607060D0607060D0607060D0607060D0607060D0607 +%060D0607060D0607060D0607060D0607060D0607060D0607060D0607060D +%0607060D0607060D0607060D0607060D0607060D060706FD0F5A06842F36 +%5A5A5B5A5A5A5B5A5A5A5B5A5A5A0D060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D2F615A5A5A5B5A5A5A5B5A +%5A5A5B5A0D7E065A5A5A365A5A5A365A5A5A365A5A5A0607060706070606 +%060706060607060606070606060706060607060606070606060706060607 +%060606070606060706060607060606070606060706070607060706070607 +%06070607060706070607060706070607060706070607060706070636FD04 +%5A365A5A5A36FD055A06842F365B5A5B5A5A5A5B5A5A5A5B5A5B5A2F060D +%060DFD332F0D070D060D070D060D070D060D070D060D070D060D070D060D +%070D060D070D060D070D060D060D30855A5A5A5B5A5A5A5B5A5A5A615A0D +%7E06FD0F5A060D060706A9FD31FFA906070607060D0607060D0607060D06 +%07060D0607060D0607060D0607060D0607060D0607060D0636FD0E5A0684 +%2F305B5A5A5A5B5A5A5A5B5A5A5A5B5A0D060D060784FD31FFA90D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D305A5A5B5A5A5A5B5A5A5A5B5A5A5A0D7E07FD055A365A5A5A +%36FD055A0607060706A8FD31FFAF06070607060706070607060706070607 +%06070607060706070607060706070607060706070607065A5A5A365A5A5A +%365A5A5A365A5A5A06842F30855A5A5A5B5A5A5A5B5A5A5A615A0D060D06 +%0D84FD31FFA90D060D070D060D070D060D070D060D070D060D070D060D07 +%0D060D070D060D070D060D070D060D365B5A5B5A5A5A5B5A5A5A5B5A5B5A +%0D7E2F36FD0E5A0607060D06A8FD31FFAF0607060D0607060D0607060D06 +%07060D0607060D0607060D0607060D0607060D0607060D060706FD0F5A06 +%7E5A305A5A5B5A5A5A5B5A5A5A5B5A5A5A0D060D060DA8FD31FFA80D060D +%060D060D060D060D060D060D060D060D060D060D060D060D060D060D060D +%060D060D060D2F615A5A5A5B5A5A5A5B5A5A5A5B5A07592F5A5A5A365A5A +%5A365A5A5A365A5A5A0607060706A8FD31FFA90607060706070607060706 +%0706070607060706070607060706070607060706070607060706070636FD +%045A365A5A5A36FD055A065A5A365B5A5B5A5A5A5B5A5A5A5B5A5B5A2F06 +%0D060DA8FD31FFA82F060D060D070D060D070D060D070D060D070D060D07 +%0D060D070D060D070D060D070D060D060D30855A5A5A5B5A5A5A5B5A5A5A +%615A0D5A2FFD0F5A060D060706A9FD31FFA906070607060D0607060D0607 +%060D0607060D0607060D0607060D0607060D0607060D0607060D0636FD0E +%5A065A532F5B5A5A5A5B5A5A5A5B5A5A5A5B5A0D060D060784FD31FFA90D +%060D060D060D060D060D060D060D060D060D060D060D060D060D060D060D +%060D060D060D060D305A5A5B5A5A5A5B5A5A5A5B5A5A5A0D5A2F36FD045A +%365A5A5A36FD055A0607060706A8FD31FFAF060706070607060706070607 +%0607060706070607060706070607060706070607060706070607065A5A5A +%365A5A5A365A5A5A365A5A5A067E5930855A5A5A5B5A5A5A5B5A5A5A615A +%0D060D060DA8FD31FFAF0D060D070D060D070D060D070D060D070D060D07 +%0D060D070D060D070D060D070D060D070D060D365B5A5B5A5A5A5B5A5A5A +%5B5A5B5A0D5A2F36FD0E5A0607060D0684A8AFA8A9A8AFA8A9A8AFA8A9A8 +%AFA8A9A8FD0FFFA8AFA8A9A8AFA8A9A8AFA8A9A8AFA8A9A8A90607060D06 +%07060D0607060D0607060D0607060D0607060D0607060D0607060D060706 +%0D060706FD0F5A067E5A305A5A5B5A5A5A5B5A5A5A5B5A5A5A0D060D060D +%060D060D070D060D070D060D070D060D07072FFD0DFF5907060D070D060D +%070D060D070D060D070D060D060D060D060D060D060D060D060D060D060D +%060D060D060D060D060D060D060D060D060D060D2F615A5A5A5B5A5A5A5B +%5A5A5A5B5A07592F5A5A5A365A5A5A365A5A5A365A5A5A06070607060706 +%070607060706070607060706070607062FA8FD0CFF5A0607060706070607 +%060706070607060706070607060706070607060706070607060706070607 +%0607060706070607060706070607060706070636FD045A365A5A5A36FD05 +%5A065A5A365B5A5B5A5A5A5B5A5A5A5B5A5B5A2F060D060D070D060D070D +%060D070D060D070D060D070D2FFD0DFF5907060D070D060D070D060D070D +%060D070D060D070D060D070D060D070D060D070D060D070D060D070D060D +%070D060D070D060D070D060D060D30855A5A5A5B5A5A5A5B5A5A5A615A0D +%5A2FFD0F5A060D0607060D0607060D0607060D0607060D0607060D062FFD +%0DFF5A0607060D0607060D0607060D0607060D0607060D0607060D060706 +%0D0607060D0607060D0607060D0607060D0607060D0607060D0607060D06 +%36FD0E5A065A532F5B5A5A5A5B5A5A5A5B5A5A5A5B5A0D060D060D060D06 +%0D060D060D060D060D060D060D060D2FFD0DFF5907060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D305A5A5B5A5A5A5B5A5A5A5B5A +%5A5A0D5A2F36FD045A365A5A5A36FD055A06070607060706070607060706 +%070607060706070607062FFD0DFF5A060706070607060706070607060706 +%070607060706070607060706070607060706070607060706070607060706 +%0706070607060706070607065A5A5A365A5A5A365A5A5A365A5A5A067E59 +%30855A5A5A5B5A5A5A5B5A5A5A615A0D060D070D060D070D060D070D060D +%070D060D070D060D2FFD0DFF5907070D060D070D060D070D060D070D060D +%070D060D070D060D070D060D070D060D070D060D070D060D070D060D070D +%060D070D060D070D060D365B5A5B5A5A5A5B5A5A5A5B5A5B5A0D5A2F36FD +%0E5A0607060D0607060D0607060D0607060D0607060D0607062FFD0DFF5A +%060D0607060D0607060D0607060D0607060D0607060D0607060D0607060D +%0607060D0607060D0607060D0607060D0607060D0607060D060706FD0F5A +%067E5A305A5A5B5A5A5A5B5A5A5A5B5A5A5A0D060D060D060D060D060D06 +%0D060D060D060D060D06072FFD0DFF5907060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D2F615A5A5A5B5A5A5A5B5A5A5A5B5A0D59 +%2F365A5A365A5A5A365A5A5A365A5A5A0607060706070607060706070607 +%0607060706070607062FA8FD0CFF5A060706070607060706070607060706 +%070607060706070607060706070607060706070607060706070607060706 +%07060706070607060706070636FD045A365A5A5A36FD055A06595A305B5A +%5B5A5A5A5B5A5A5A5B5A5B5A2F060D060D070D060D070D060D070D060D07 +%0D060D070D2FFD0DFF5907060D070D060D070D060D070D060D070D060D07 +%0D060D070D060D070D060D070D060D070D060D070D060D070D060D070D06 +%0D070D060D060D30855A5A5A5B5A5A5A5B5A5A5A615A0D532F36FD0E5A06 +%0D0607060D0607060D0607060D0607060D0607060D062FFD0DFF5A060706 +%0D0607060D0607060D0607060D0607060D0607060D0607060D0607060D06 +%07060D0607060D0607060D0607060D0607060D0607060D0636FD0E5A0659 +%5A2F5B5A5A5A5B5A5A5A5B5A5A5A5B5A0D060D060D060D060D060D060D06 +%0D060D060D060D060D2FFD0DFF5907060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D305A5A5B5A5A5A5B5A5A5A5B5A5A5A0D595336 +%FD045A365A5A5A36FD055A06070607060706070607060706070607060706 +%070607062FFD0DFF5A060706070607060706070607060706070607060706 +%070607060706070607060706070607060706070607060706070607060706 +%0706070607065A5A5A365A5A5A365A5A5A365A5A5A065A5A2F855A5A5A5B +%5A5A5A5B5A5A5A615A0D060D070D060D070D060D070D060D070D060D070D +%060D2FFD0DFF5907070D060D070D060D070D0607060706070607060D070D +%060D070D060D070D060D070D060D0607060706070607060D060D070D060D +%070D060D365B5A5B5A5A5A5B5A5A5A5B5A5B5A0D595336FD0E5A0607060D +%0607060D0607060D0607060D0607060D0607062FFD0DFF5A060D0607060D +%0607060D060D597E597E597E5A59060D0607060D0607060D0607060D0607 +%062F597E597E597E595A0607060D0607060D060706FD0F5A065A5A305A5A +%5B5A5A5A5B5A5A5A5B5A5A5A0D060D060D060D060D060D060D060D060D06 +%0D060D06072FFD0DFF5907060D060D060D060D060D2FFD07FFA807060D06 +%0D060D060D060D060D060D06072FFD07FFA80D060D060D060D060D060D2F +%615A5A5A5B5A5A5A5B5A5A5A5B5A0D532F365A5A365A5A5A365A5A5A365A +%5A5A06070607060706070607060706070607060706070607062FA8FD0CFF +%5A06070607060706070607062FFD07FFA806070607060706070607060706 +%070607062FA8FD06FFA8060706070607060706070636FD045A365A5A5A36 +%FD055A06595A305B5A5B5A5A5A5B5A5A5A5B5A5B5A2F060D060D070D060D +%070D060D070D060D070D060D070D2FFD0DFF5907060D070D060D070D060D +%2FFD07FFA80D060D070D060D070D060D070D060D070D2FFD07FF840D060D +%060D070D060D060D30855A5A5A5B5A5A5A5B5A5A5A615A0D532F36FD0E5A +%060D0607060D0607060D0607060D0607060D0607060D062FFD0DFF5A0607 +%060D0607060D0607062FFD07FFA90607060D0607060D0607060D0607060D +%062FFD07FFA8060D0607060D0607060D0636FD0E5A06595A2F5B5A5A5A5B +%5A5A5A5B5A5A5A5B5A0D060D060D060D060D060D060D060D060D060D060D +%060D2FFD0DFF5907060D060D06070607060707FD07FF840706070607060D +%060D060D0607060706070DFD07FF840706070607060D060D060D305A5A5B +%5A5A5A5B5A5A5A5B5A5A5A0D595336FD045A365A5A5A36FD055A06070607 +%060706070607060706070607060706070607062FFD0DFF5A0607060706FD +%042F592F5AA9FD06FFA9FD062F06070607062F2F592F2F2F5AFD07FFA92F +%2F2F592F2F06070607065A5A5A365A5A5A365A5A5A365A5A5A065A5A2F85 +%5A5A5A5B5A5A5A5B5A5A5A615A0D060D070D060D070D060D070D060D070D +%060D070D060D2FFD0DFF5907070D060D2FFD14FF2F060D070759FD13FFA8 +%2F060D060D365B5A5B5A5A5A5B5A5A5A5B5A5B5A0D595336FD0E5A060706 +%0D0607060D0607060D0607060D0607060D0607062FFD0DFF5A060D060706 +%59FD14FF0607060D065AFD13FFAF0607060706FD0F5A065A5A305A5A5B5A +%5A5A5B5A5A5A5B5A5A5A0D060D060D060D060D060D060D060D060D060D06 +%0D06072FFD0DFF5907060D06072FFD14FF2F060D060759FD13FFA90D060D +%060D2F615A5A5A5B5A5A5A5B5A5A5A5B5A0D532F365A5A365A5A5A365A5A +%5A365A5A5A06070607060706070607060706070607060706070607062FA8 +%FD0CFF5A06070607062FFD14FF06070607065AFD13FFAF060706070636FD +%045A365A5A5A36FD055A06597E305B5A5B5A5A5A5B5A5A5A5B5A5B5A2F06 +%0D060D070D060D070D060D070D060D070D060D070D2FFD0DFF5907060D07 +%072FFD14FF2F060D060759FD13FFA90D060D060D30855A5A5A5B5A5A5A5B +%5A5A5A615A0D2F5936FD0E5A060D0607060D0607060D0607060D0607060D +%0607060D062FFD0DFF5A0607060D062FFD14FF06070607065AFD13FFAF06 +%07060D0636FD0E5A062F7E2F5B5A5A5A5B5A5A5A5B5A5A5A5B5A0D060D06 +%0D060D060D060D060D060D060D060D060D060D2FFD0DFF5907060D06072F +%FD14FF2F060D060759FD13FFA90D060D060D305A5A5B5A5A5A5B5A5A5A5B +%5A5A5A0D2F5930FD045A365A5A5A36FD055A060706070607060706070607 +%06070607060706070607062FFD0DFF5A06070607062F7E847E847E84FD08 +%FF7E847E847E8406070607062F7E847E847EA8FD08FF7E847E847E7E0607 +%0607065A5A5A365A5A5A365A5A5A365A5A5A062F842F855A5A5A5B5A5A5A +%5B5A5A5A615A0D060D070D060D070D060D070D060D070D060D070D060D2F +%FD0DFF5907070D060D0607060D06070DFD07FF84070607060D060D060D07 +%0D060D060706072FFD07FF8407060D0607060D070D060D365B5A5B5A5A5A +%5B5A5A5A5B5A5B5A2F2F5A30FD0E5A0607060D0607060D0607060D060706 +%0D0607060D0607062FFD0DFF5A060D0607060D0607060D062FFD07FFA806 +%070607060D0607060D0607060D0607062FFD07FFA90607060D0607060D06 +%0706FD0F5A062F84305A5A5B5A5A5A5B5A5A5A5B5A5A5A0D060D060D060D +%060D060D060D060D060D060D060D06072FFD0DFF5907060D060D060D060D +%060D2FFD07FFA807060D060D060D060D060D060D060D06072FFD07FF840D +%060D060D060D060D060D2F615A5A5A5B5A5A5A5B5A5A5A5B5A0D2F59365A +%5A365A5A5A365A5A5A365A5A5A0607060706070607060706070607060706 +%0706070607062FA8FD0CFF5A06070607060706070607062FFD07FFA80607 +%0607060706070607060706070607062FA8FD06FFA8060706070607060706 +%070636FD045A365A5A5A36FD055A062F84305B5A5B5A5A5A5B5A5A5A5B5A +%5B5A2F060D060D070D060D070D060D070D060D070D060D070D2FFD0DFF59 +%07060D070D060D070D060D2FFD07FFA80D060D070D060D070D060D070D06 +%0D07072FFD07FFA80D060D060D070D060D060D30855A5A5A5B5A5A5A5B5A +%5A5A615A0D2F5936FD0E5A060D0607060D0607060D0607060D0607060D06 +%07060D062FFD0DFF5A0607060D0607060D0607062F84A884A984A8847E06 +%07060D0607060D0607060D0607060D062F84A984A884A9A87E060D060706 +%0D0607060D0636FD0E5A062F7E2F5B5A5A5A5B5A5A5A5B5A5A5A5B5A0D06 +%0D060D060D060D060D060D060D060D060D060D060D2FFD0DFF5907060D06 +%0D060D060D060D060D0607060D0607060D060D060D060D060D060D060D06 +%0D060D0607060D0607060D060D060D060D060D060D060D305A5A5B5A5A5A +%5B5A5A5A5B5A5A5A0D2F5930FD045A365A5A5A36FD055A06070607060706 +%070607060706070607060706070607062FFD0DFF5A060706070607060706 +%070607060706070607060706070607060706070607060706070607060706 +%0706070607060706070607060706070607065A5A5A365A5A5A365A5A5A36 +%5A5A5A062F842F855A5A5A5B5A5A5A5B5A5A5A615A0D060D070D060D070D +%060D070D060D070D060D070D060D2FFD0DFF5907070D060D070D060D070D +%060D070D060D070D060D070D060D070D060D070D060D070D060D070D060D +%070D060D070D060D070D060D070D060D365B5A5B5A5A5A5B5A5A5A5B5A5B +%5A2F2F5A30FD0E5A0607060D0607060D0607060D0607060D0607060D0607 +%062FFD0DFF5A060D0607060D0607060D0607060D0607060D0607060D0607 +%060D0607060D0607060D0607060D0607060D0607060D0607060D0607060D +%060706FD0F5A062F84305A5A5B5A5A5A5B5A5A5A5B5A5A5A0D060D060D06 +%0D060D060D060D060D060D060D060D06072FFD0DFF5907060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D2F615A5A5A5B5A5A5A5B5A +%5A5A5B5A0D2F59365A5A365A5A5A365A5A5A365A5A5A0607060706070607 +%0607060706070607060706070607062FA8FD0CFF5A060706070607060706 +%070607060706070607060706070607060706070607060706070607060706 +%07060706070607060706070607060706070636FD045A365A5A5A36FD055A +%062F84305B5A5B5A5A5A5B5A5A5A5B5A5B5A2F060D060D070D060D070D06 +%0D070D060D070D060D070D2FFD0DFF5907060D070D060D070D060D070D06 +%0D070D060D070D060D070D060D070D060D070D060D070D060D070D060D07 +%0D060D070D060D070D060D060D30855A5A5A5B5A5A5A5B5A5A5A615A0D2F +%5936FD0E5A060D0607060D0607060D0607060D0607060D0607060D062FFD +%0DFF5A0607060D0607060D0607060D0607060D0607060D0607060D060706 +%0D0607060D0607060D0607060D0607060D0607060D0607060D0607060D06 +%36FD0E5A062F842F5B5A5A5A5B5A5A5A5B5A5A5A5B5A0D060D060D060D06 +%0D060D060D060D060D060D060D060D2FFD0DFF5907060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D305A5A5B5A5A5A5B5A5A5A5B5A +%5A5A0D2F7E36FD045A365A5A5A36FD055A06070607060706070607060706 +%070607060706070607062FFD0DFF5A060706070607060706070607060706 +%070607060706070607060706070607060706070607060706070607060706 +%0706070607060706070607065A5A5A365A5A5A365A5A5A365A5A5A062F84 +%30615A5A5A5B5A5A5A5B5A5A5A615A0D060D070D060D070D060D070D060D +%070D060D070D060D2FFD0DFF5907070D060D070D060D070D060D070D060D +%070D060D070D060D070D060D070D060D070D060D070D060D070D060D070D +%060D070D060D070D060D365B5A5B5A5A5A5B5A5A5A5B5A5B5A2F0D7E36FD +%0E5A0607060D0607060D0607060D0607060D0607060D0607062FFD0DFF5A +%060D0607060D0607060D0607060D0607060D0607060D0607060D0607060D +%0607060D0607060D0607060D0607060D0607060D0607060D060706FD0F5A +%062F84305A5A5B5A5A5A5B5A5A5A5B5A5A5A0D060D060D060D060D060D06 +%0D060D060D060D060D06072FFD0DFF5907060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D2F615A5A5A5B5A5A5A5B5A5A5A5B5A0D07 +%7E365A5A365A5A5A365A5A5A365A5A5A0607060706070607060706070607 +%0607060706070607062FA8FD0CFF5A060706070607060706070607060706 +%070607060706070607060706070607060706070607060706070607060706 +%07060706070607060706070636FD045A365A5A5A36FD055A062FA9305B5A +%5B5A5A5A5B5A5A5A5B5A5B5A2F060D060D070D060D070D060D070D060D07 +%0D060D070D2FFD0DFF5907060D070D060D070D060D070D060D070D060D07 +%0D060D070D060D070D060D070D060D070D060D070D060D070D060D070D06 +%0D070D060D060D30855A5A5A5B5A5A5A5B5A5A5A615A2F0D7EFD0F5A060D +%0607060D0607060D0607060D0607060D0607060D062FFD0DFF5A0607060D +%0607060D0607060D0607060D0607060D0607060D0607060D0607060D0607 +%060D0607060D0607060D0607060D0607060D0607060D0636FD0E5A062F84 +%2F5B5A5A5A5B5A5A5A5B5A5A5A5B5A0D060D060D060D060D060D060D060D +%060D060D060D060D2FFD0DFF5907060D060D060D060D060D060D060D060D +%060D060D060D060D060D060D060D060D060D060D060D060D060D060D060D +%060D060D060D060D060D305A5A5B5A5A5A5B5A5A5A5B5A5A5A2F0D7E36FD +%045A365A5A5A36FD055A0607060706070607060706070607060706070607 +%0607062FFD0DFF5A06070607060706070607060706070607060706070607 +%060706070607060706070607060706070607060706070607060706070607 +%06070607065A5A5A365A5A5A365A5A5A365A5A5A062F8430615A5A5A5B5A +%5A5A5B5A5A5A615A0D060D070D060D070D060D070D060D070D060D070D06 +%0D2FFD0DFF5907070D060D070D060D070D060D070D060D070D060D070D06 +%0D070D060D070D060D070D060D070D060D070D060D070D060D070D060D07 +%0D060D365B5A5B5A5A5A5B5A5A5A5B5A5B5A2F0D7E36FD0E5A0607060D06 +%07060D0607060D0607060D0607060D0607062FA8AFA8AFA8A9A8AFA8A9A8 +%AFA859060D0607060D0607060D0607060D0607060D0607060D0607060D06 +%07060D0607060D0607060D0607060D0607060D0607060D0607060D060706 +%FD0F5A062F84305A5A5B5A5A5A5B5A5A5A5B5A5A5A0D060D060D060D060D +%060D060D060D060D060D060D060D060D070D060D070D060D070D060D060D +%060D060D060D060D060D060D060D060D060D060D060D060D060D060D060D +%060D060D060D060D060D060D060D060D060D060D060D060D060D2F615A5A +%5A5B5A5A5A5B5A5A5A5B5A0D077E365A5A365A5A5A365A5A5A365A5A5A06 +%070607060706070607060706070607060706070607060706070607060706 +%070607060706070607060706070607060706070607060706070607060706 +%070607060706070607060706070607060706070607060706070607060706 +%0706070636FD045A365A5A5A36FD055A062FA9305B5A5B5A5A5A5B5A5A5A +%5B5A5B5A2F060D060D070D060D070D060D070D060D070D060D070D060D07 +%0D060D070D060D070D060D070D060D070D060D070D060D070D060D070D06 +%0D070D060D070D060D070D060D070D060D070D060D070D060D070D060D07 +%0D060D070D060D060D30855A5A5A5B5A5A5A5B5A5A5A615A2F0D7EFD0F5A +%060D0607060D0607060D0607060D0607060D0607060D0607060D0607060D +%0607060D0607060D0607060D0607060D0607060D0607060D0607060D0607 +%060D0607060D0607060D0607060D0607060D0607060D0607060D0607060D +%0607060D0636FD0E5A062F842F5B5A5A5A5B5A5A5A5B5A5A5A5B5A0D060D +%060D060D060D060D060D060D060D060D060D060D060D060D060D060D060D +%060D060D060D060D060D060D060D060D060D060D060D060D060D060D060D +%060D060D060D060D060D060D060D060D060D060D060D060D060D060D060D +%060D305A5A5B5A5A5A5B5A5A5A5B5A5A5A2F0D7E36FD045A365A5A5A36FD +%055A06070607060706070607060706070607060706070607060706070607 +%060706070607060706070607060706070607060706070607060706070607 +%060706070607060706070607060706070607060706070607060706070607 +%060706070607065A5A5A365A5A5A365A5A5A365A5A5A062FA930615A5A5A +%5B5A5A5A5B5A5A5A615A0D060D070D060D070D060D070D060D070D060D07 +%0D060D070D060D070D060D070D060D070D060D070D060D070D060D070D06 +%0D070D060D070D060D070D060D070D060D070D060D070D060D070D060D07 +%0D060D070D060D070D060D070D060D365B5A5B5A5A5A5B5A5A5A5B5A5B5A +%2F0784FD0F5A0607060D0607060D0607060D0607060D0607060D0607060D +%0607060D0607060D0607060D0607060D0607060D0607060D0607060D0607 +%060D0607060D0607060D0607060D0607060D0607060D0607060D0607060D +%0607060D0607060D060706FD0F5A0607A9365A5A5B5A5A5A5B5A5A5A5B5A +%5A5A0D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D2F615A5A5A5B5A5A5A5B5A5A5A5B5A2F06845A5A5A365A +%5A5A365A5A5A365A5A5A0607060706070607060706070607060706070607 +%060706070607060706070607060706070607060706070607060706070607 +%060706070607060706070607060706070607060706070607060706070607 +%06070607060706070607060706070636FD045A365A5A5A36FD055A0607A9 +%365B5A5B5A5A5A5B5A5A5A5BFD045A365A305A365A305A365A305A0D0D06 +%0D070D060D070D060D070D060D070D060D070D060D070D060D070D060D07 +%0D060D070D060D070D060D070D060D070D060D070D060D070D060D070D06 +%0D070D060D075A305A365A305A365A305A365A5A615A5A5A5B5A5A5A5B5A +%5A5A615A2F0684FD1C5A2F0607060D0607060D0607060D0607060D060706 +%0D0607060D0607060D0607060D0607060D0607060D0607060D0607060D06 +%07060D0607060D0607060D0607060D0607060DFD1C5A0707A9305B5A5A5A +%5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A0D0D060D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D06FD045A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A2F +%06845A365A5A5A365A5A5A365A5A5A365A5A5A365A5A5A365A5A5A365A5A +%2F0607060706070607060706070607060706070607060706070607060706 +%070607060706070607060706070607060706070607060706070607060706 +%070607060706070607305A5A5A365A5A5A365A5A5A365A5A5A365A5A5A36 +%5A5A5A365A5A5A0607A9305B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A +%5A5B5A5A5A5B5A5B0D0D070D060D070D060D070D060D070D060D070D060D +%070D060D070D060D070D060D070D060D070D060D070D060D070D060D070D +%060D070D060D070D060D070D060D070D065B5A5A5A5B5A5A5A5B5A5A5A5B +%5A5A5A5B5A5A5A5B5A5A5A5B5A5B5A2F0684FD1C5A2F060D0607060D0607 +%060D0607060D0607060D0607060D0607060D0607060D0607060D0607060D +%0607060D0607060D0607060D0607060D0607060D0607060D0607060D0607 +%36FD1B5A0607A9365A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A +%5B5A5A5A5B0D07060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D060D060D060D060D060D060D060D060D06 +%0D060D060D060D060D060D060D075A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A +%5A5A5B5A5A5A5B5A5A5A5B5A2F06845A5A5A365A5A5A365A5A5A365A5A5A +%365A5A5A365A5A5A36FD045A2F0607060706070607060706070607060706 +%070607060706070607060706070607060706070607060706070607060706 +%07060706070607060706070607060706070607060D365A365A5A5A365A5A +%5A365A5A5A365A5A5A365A5A5A36FD055A0607A9365B5A5B5A5A5A5B5A5A +%5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A612F0D060D070D060D070D060D +%070D060D070D060D070D060D070D060D070D060D070D060D070D060D070D +%060D070D060D070D060D070D060D070D060D070D060D070D060D075A5A5B +%5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A615A2F0684FD1C +%5A2F0607060D0607060D0607060D0607060D0607060D0607060D0607060D +%0607060D0607060D0607060D0607060D0607060D0607060D0607060D0607 +%060D0607060D0607060DFD1C5A0707A9305B5A5A5A5B5A5A5A5B5A5A5A5B +%5A5A5A5B5A5A5A5B5A5A5A5B5A5A0D0D060D060D060D060D060D060D060D +%060D060D060D060D060D060D060D060D060D060D060D060D060D060D060D +%060D060D060D060D060D060D060D060D060D060D060D06FD045A5B5A5A5A +%5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A5B5A5A5A2F06845A365A5A5A365A +%5A5A365A5A5A365A5A5A365A5A5A365A5A5A365A5A2F0607060706070607 +%060706070607060706070607060706070607060706070607060706070607 +%060706070607060706070607060706070607060706070607060706070607 +%305A5A5A365A5A5A365A5A5A365A5A5A365A5A5A365A5A5A365A5A5A0607 +%A936615A5B5A615A5B5A615A5B5A615A5B5A615A5B5A615A5B5A615A5B0D +%0D070D060D070D060D070D060D070D060D070D060D070D060D070D060D07 +%0D060D070D060D070D060D070D060D070D060D070D060D070D060D070D06 +%0D070D060D070D065B5A5B5A615A5B5A615A5B5A615A5B5A615A5B5A615A +%5B5A615A5B5A2F0684FD055A365A5A5A365A5A5A365A5A5A365A5A5A365A +%5A5A365A5A2F060706070607060706070607060706070607060706070607 +%060706070607060706070607060706070607060706070606060706060607 +%06060607060606070606060706072F5A305A2F5A305A2F5A305A2F5A3036 +%2F5A30362F5A30362F5A30360606AF070D060D070D072F070D072F070D07 +%2F070D072F072F072F0D2F072F070D060D070D060D070D062F072F062F07 +%2F062F072F062F072F062F07FD122F592F592F5A2F592F5A2F592F5A2F59 +%2F5A2F5A595A597E5A7E5A7E5A7E5A7E5A7E5A7E59847E847E847E847E84 +%7E847E847E7E5AA8847E7E7EA884A87EA884A87EA884A87EA884A87EA884 +%A9A8A9A8A9A8AFA8A9A8AFA8A9A8AFA8A9A8FFA9FFA8FFA9FFA8FFA9FFA8 +%FFA9FFA8FFAFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FD36FFFF +%%EndData + +endstream endobj 63 0 obj <>stream +%AI12_CompressedDataxœì½kÇ•-ø]ÿÙ ØWÇñ~x.¨ªSåë»-Hîn ‚&Ë2Û|eç×ÏZ;™‘§ªHŠ»[É:'22;ösíø?¾øêó‹g¯ÿxû¹=ªÃ£Ïþá®ÞÜ>yûúÍ/òñá×/^|÷íÛ7üèg_þü ãQ±ÕůÓãÚò_nß|ûüõ«_Œ9êR{Ãïÿì·OÞüåð«ç/^•ò³ûòöëç²z˜ÞÿyëùÍëo^bmøm΀9ðUkûò›X ™1ãÃÑ>/­iñJej>c +)xLÃdÇpÌÑ«ƒÆ¼·ÇŒ1Êù”“Ã:ºcv.%¹Í*Ô>—Ù½ýëóÛ¿ýòðO¯_ÝÖ)¼xóö«²œSªüY«¾üîÅí›~õü-^«t•Ëþöõ³ÛøÆÒÅÍ‹'2uRôògmñû'o¾¾}‹ÍóúÅwoeg§þ¬Óožüý–Ë]:Ôññ%&ùžõê-FýøùŸÿµœˆÇ_¿ý¥Žµ]~ü»on_ýþõ¿È+}Ž áŒb™ƒ5l•­>`Gr ؆Ø~}|ºÿ©Ú#/^¼½}ó +«ÔûžqýêÙãz¶oŸmžãå9|J›‹È]ø6æïÞ<ÇdüòsÍà}¨›öWož?[öl4‡Tþ1½üÑ:•M~è'Y~bÐ>igòI%¬ÿ[¼L_Bóøê·«¥Ž¿ýŠïƒ ¸zý’[ñ[¡6\f³¯¿®µË/R‡.¾û¦NPÙع_¼yþŠ?úìŸJ]züÅ‹ïPù«7¯¿ûæ×¯þôúÑg?+¤ö7Ï_ÝJåAjA4å³'oÞþíõ›¿à×_?»}²Ðo~~O§_ýåöíÓ?ÝÖO?¤ã¹} +âÃøìð»?þ~a/¤M‡ß¿yòoŒß{›‡tˆUyÓÞß•_ÛßùþéöOüÒAùôúÕ_o_¼þfÕqi÷¿xñäÕ“7}ÒÚ*ý5O°ªK—lxûöêçåL‹ô²]”{¬ªô¨'oÿŒ èöÕ³o{ïå×eä|›òÙCz¼zòâÅó¯ß<ùæÏÏŸ.ß|÷퟿ýúEï}§¾?i]'Uüæƒvðß_þñõ‹çß¾ìYòöðó§/n¿úû·oo¶ª<üo^ýîU™Ÿù-jƒñpq”ï¼Óèاõoí= •ÿ™žòÕS™™½gl«úsêÇŸàSÚ"_?{‚xæàßÙæ«¿=ÅþÍó?ÞsP9ÍzþêÆýÕwÏßÞ.góõËoÈ ¾úó“onåä´–_-]z¹öW÷ÖçŸß}£ép¸|µnò«7Ož=Ç &ÿW¯_<»}uø’—†¶þ7<\>{ôÙ¿=úL­þÓí?wø‡Ç—àyÿ>ÞûÑ«bVÅJqCñ낽 +«W%oÊŪ\J¹’ÿOµ\Ëÿ7èñ¦–ëõÀôúǬŠ]·)%hðMò¯¸*iU2ÊEýóB_®ÊU/ü÷©ÿvB×('”k}³.ëé“áµ»*Þ8”ög`yôYùÛÄUÉ«r±*—¥<úìÿ:·¦eÊÔ°ª\ÍíºÎëë•CÃ*×5öXÓõ*g•PöÖ9¯V¢Çõš³,kÎ"«ÝÖçŸåGí®9¸OYoƒU.+ïeűÚmÕQÆÕæ'Yåe¥û£Gþ}]Wv»ší±VÖÒÕâ¥p¥¸rIJY­Äuš–µâš]Õr’r]Ë ‹­ ­1¬©–ÕruþS׫2cuNœ¼)ߎïs’Që:Ê #ºà^‘çÞÈS¬u&$ÿl/QNöK¯DMç]tÉ] \¹“»v7˜N‹â|ðÑgá¯PNçCÒxq‘4BT½@¹ Wán°94¦ÅÅ!ÆÆ/ãU<ÅlIrÉC¶\/Òe:¥ëtƒƒwÏ6»ìsÈ”5.óU¾Î7xa}a1 /ÒE¾¸¸¸D¹º8]\_Ü`+i¼‚»ô—ñ2]fT]]ž.¯/o®ÔHŸLº½r4†p•®.®.¯®®NW7ØvZÃð:§pЧtʧËÓÕéútƒM`®Ýµ¿Ž(é¹¾¼¾ºÆÉ¿¾¾¾áÖ¸ÁÔÜ¼Ö †‰r‰‚ŽoÐ`ý#kªdYûg׫rZ•«U¹\•‹MÉ­ ÇŒÇ/%®JØ¿*nUìª`7¢GSË–²©¥¬½þ9mÊU)˜2þ}¹*«’W%mJ\•°*¸t°0­¸M±«bVE¯ŠZJ›öGŸÕ­_`ýsµ*—¥´£ºYÏí*n×®­Úv¥¶«ƒAn½"«•ØÎÿvÖël3,óŠùç´Îäf·ó¶™­¾AëÃ0_Ûy)srQK–’j‰RB-¾'ÅÖ‚}'‡Q×"·B? +åÕÚÃÚÏ¥”‹Z²”T ;¼ +µÕ(ÅÖRhr»@WWkz-ëx)ë–d¼¬ WCÉìŸd¶/dßF™M'³§e¾®ev.e6Þ.Ê»óù–JÞê$oq!ãŽ2J'£ÂX°q®1¥W—— i¤-^9bg@ò0Rl©kLöˆáÈby ’ÄÒ€d*lµk,ÃéÈiʄՃÀZÜPw÷ 6Ä “u 2œƘ¨rô ÏDZãf¿ÁV9a*/ãˆx1у¬[w ^à›è„é½éϸb¸ \°¸tÀ±¥¯±ØWþGö WHð—‰ÅÍ©ÁkÜ`ã°$—¸p2.žè® ‡«ÈàBR8רW¸¤.pYaŒ¸¶î#‡KÌàÞW8ר8WrÍòâåeLÖŠWµ6Jò»bkK¶m-[Ûrõ“Ý»–0áb- ØŒ¶7Ð|ï©ÒéÒÃò}aU6ôâfu”}–±Çv—ÚÝYØW«kDn)þð¦RrW4á}Åc]n,¹³xcáJÃІÀ»±ß‹AîÅ<ÝŒVnÆv/^ð™íûǰ•ƒÏçZø ]9 ßy‹q)„ƒ3ä÷zÏ,yÁSû„ªžõ=Ê Øò +nÍdBd2ú:]ÖÆN;€,&$ÂC + UÃÊö—l¯™*+¾°Þ"²“j*ºô$BƒôQ¾¿7I}Wp)ûbZYȶŒuñÎ|ãˆr/›áëÒˆÕš\-Ûj!Yk¢%d«Ïþ1Û’²ûY_Žá(/ù²ó×­¬e¦¸)aUÖ˜krz´•”ŸÂóoDâ-O´’é¨b!ØÏk)òj#]^v2“ûßi(q,U–õ]ÒñƒÌëºD´.f§Ôô¸þQsY$³•”v]å·ë.¿×;[JTI¯Éz¥\œ)ùléšô‡î,£ô:Ñ[”2ê7î+v*²5Уy`Ù›ä‚wãC~Îè>‰W׫é[øßÆÅŸj)|[Ó…´“¿ÈÞ¥Tm +Nu‘Ó›ÔÞô1ËQÏvã}¯†RO­œê¦Ehz…¼sfC-ˉ]ôR‹ÆÊµ¸ÿœòžì‡´êIЦdu6Ûé<ÉÕÔt,W«óyÙõ0û§s<©]§#:œñ´¦á¼¦^òç•¿—3ø'vG9MÑ\ÝwbÏŸã~–}zܯ{·Ý~Îê:ÙÿNõ¦÷² +Æ© +Â^Xàµ4Ž%W~% +·b +?( 9’Æ„*Tš.^Ýt®DÄÁWb6"…,ˆX>ƒE1«Y–B–ˆXEȺ­S´(jAËVA‹¢ÖĬK´R´}&––ƒr#ò÷‰@ ¢V¶(n™"n‰Àuª×¥\Eä +¹HʰwªØu#b¯"z]„$â—ñˉø¥ý ޵ +'_å_aÃ"˦´ ¢ÙZ´èƒ®E ;‰œ|!BÙÄ2 +fM4£pf…͸Á!º®®ðuR@Á³ðwäð¢py_°üѺWÊ~êT}áã^x5'|M»WT[èuÑ4}nù{M“Ê ¿zëöéìDK7œ”]'¦QÄVÖšòstî:µÃO| ÕøžOuEKYkÈÖ?[¥àJÕ¹ÖÉÜ#ED]EÚ¥ØMÙêüüP¦€Øhã eL d®‚óº\Ž¥j4×å4•ùçf.m·@®or½SÌn±»¥içâÏ”p¶t}2zŒCIw–|OK1èµ÷Êå‹P|ôxõÀrzXAó§{Kùà‚ÏÕ½çÏt½¾÷ÏJA¤:ßkª¥”¦C-7JÓ¯ÆZšþ5×Rµ³è±hkÛO#ËjËÒèmÓ7®¿iŠ‹Þû»nŠñ¦•XKê%×rÑËåÍÂO×iïP«™Nm(Ô>mÚÚ)64é 5:G…Ö”çRôAçiÏ4gCc*]Úy³CYî£(èñN:ò +2P +±ruªñÞ”buúÏÒ‰R…™Üqªï.?à©~'µíFq ÆîªèRÅPL^Ì:œA0„A ÆdÁ7w£±‚ŒkªáØ‹é8ñ¤ùøRÌÇ×ré²–Õ‡pÇ#›«)™Æäk1'ƒ²%½˜•‹aùBXe—y˜Š™&fòŸbf~ô™˜š¹r17_‚<ºÑYK$ÇIÃs1=‡……Ï`ç/Ä}òq]MÑê'L¿æŸFiO»·˜¦iœ^ÌÓÅ@}-S‰™š<®c5ÍÕäÝ£­D,¦ë‹ËK!“'1a_˦m”¸ÑàF{ÕmÔ¶PÚJcAou]¨j£¦ ]¨çB5j¹¦‘…:®¨â†.4pË“­©Ý–Âab@Ëʶ¥eõÚáŒfú´æyöùšsTgàJÖ=ÞAEýßÿT7u8]¿Vèú`è—~HêèpvÑqZ ÓûñCÚ^~»ÓçÑ£¥W‡¤ÃùdžÒÛQȃ*ã´ã¯àÐLggtH:BHs:4/vŸ’±Þd§QãñIl¿`Œ¨ä7ö &:¯rÂ3u}¢9ZåÝ2´ô©å=UDÿ½9üïÑ;>QGAb ¸‚2òi˜e +ŒŽQF¥Wesy +[µGɇüĬ?ðq5{T {«ÿQ‡QgÂçä0uÖæŒapÁy©Ç ÒÒyƬC®Ç0³·e¬u¸¢ñNBVKã"ßÅ”E©›Í¼Ry=?â(~ o⑯ÇÇ&ó¹ýÇGïQŽ:)9qrŽll[±ŸËÓâKÛÜaϸÈþîÍÓ??FïØú/tlÖŽ±Ç´Õ*‚Ã!ÃáeZkÀ$ÝgA ·+-__ïøGê;v˜z/ÁQcׇ©çJ‘1Z©õd}¬GÔû^»çZºp´Öƒ\|´—Ø>åwÌWù;· ÿ—]Û+ÿ«2;kƒ¼íþÉÝ8U™–êeQ×=CcÀÁyèêé„-¥䥰£7¢'.lhôBXÏkáIèé«d‹ImôiÇÿ·øú6 I‹LÑQ’ÿS'…æìpÚøŒú;¼Š÷~F}ä¾÷¸_i Ѩø‰Q÷#:­ÚÅ›¨ø¢êS$*íëêUt廣ÂÝÞRÝWêžR£«AçÅ×|xsYœg®ÈoW^»9Ð4þ:7'šS_¸•ãm‘£(C-N·t¹MâpKI‰rm)]a*q°õÕ½ö»ÿG™åîŽÐ<‘6¾LUÝ­º!ÿJÌ~E«¢ÚU“—^Ì8ô&Kó$ë¾/Í€ãªS‰)€ÕóïT½ýš—ßbÎñÕ—¯øð)aЯ'7‘•«uw¶.öÖâïa»¼ëEæ b¶Hµd‘‹Ì‚Õjp#²ð" çi®c‘ˆ‹Lnò©HÉb5Уœ,×Y\®›ÓµHÊMVÆ)ÛJËÜ%Yä嫪"»îîØ¦Êʾ’¤$Òò…HÊWMRÆÚYÙV'm_%å\ Õi%%k±ä Ù‰„»óv—!GŸŠ|Ü%d½’)#ûEF^IÈ—"%‹ŒÜ‰ÕõÊåfíà[TÆ_÷o?­ß•{ÊŒ²5¼¯ç¿»é&{ÓÄÍf Yi+Ëßvó·[5´¿×Ž?Å(tÓÖèÐþlÁ-ä!÷°‡uðC ¨.K±„?\¯B–À‡%|Å÷À‡¬’º\R‘°ƒ«)ØÁˆË—í'/ôSWÎl1)žìiK×6¾¿—;¾¿±zý.¿ÍÓ·úø*ÑL¿ í—rk\ÈK²ßB½=Š!ØÈd)Ù©ksðÅÊúb±¯Lu3 Ÿdx…nÊÙhg§ž~6 +*¹BEAG}V)éš–®©éÚ3wë›»õÎíþ¹>+·©(IfÝs>ºwxéÊmÖœûÞ˽O÷Ó¼ç¡?z ßá¡¿è÷«Æ7ÌE·l½ÒÏ{¦¯|ÓkYy¦£Ç»½ÓÏïÏT-%ƒ_:vö♾öKW}ÏÞTeÙ©:-\ ¿ÓvoÙ¿Yh¥ìbì첓ƒPÒe?Ûê7Yˆ@ñøi{ûºNÙÕÊå¡ìsìì²ÛcÝñA˜R¹æÊ‘•£_M±Œ—p-§@ÎAwÙ³NŽñ(cÙ·šÉŽ1E¬ìF®l£(¦(ìÃ)–eˆ²Øh£ZzdËNÆݲŽË¸/ÂÅŠ{ô~”ËnœË=gèDïÝ“t¹²Ÿ-gi}žV§jÒLsÔ“à¤{]I.©ày?‚ä{ªV4艇 è!TdG“Ò1ƒ¼d\à“ŠjʮԩhÌgTr9¨æJò££è@†³ŽT0Qô¡JÅåh 'EÚ.à1¥ݬŽÔr‹ª)Á¤Õ›~ÔÇ”7‰-¬ +I)å\!Øãz«êꎋöHÂ)ß|d©xê6LyXé|8Š~jy¯ð¡Uo&ÙQi’õ¢ƒPÞ&\‚A@Œ¨ +-Ê3þ¿Ò*êÀó°Kê3òÑ{µQŠ|ÜǼ«Vä»—/o߈b¤üKTs‹m­h"ÿÚ±²… ‡ª€H=,¸8—^U‡ÔëÆSW'ô%˜»ñ¹…«mì°[®â-‡ºY‹@VÝ~‹ëÿ˜»„O¯qï– +*±G‹d˜»dxÑ$C)×M:„|H¶]U¿ãÒ•¯ED9IÑœ°‚®^¤EøiLH%ûͰUüƪGswÝkÝ‚S™2Ö’jɵTF »v–§;)4?µî»,œb)¶ßËò{ɽ\ôr¹ôØ\Yç­±ní=¼°«"Ói×õâ7eþICÉ;c¼˜ÊÕ™rº£t“#•g\ ¦¨{‹lhHæû(Sȹ®§¹—°ó´ÝA–è© ƒZÅM•s‰XUŠëÈ)‘oª È3¶x,~E³ÂSãÚY¡>ç墆¦S«DOÖt)¡î÷EBíIÙÅV¤_÷g’ýÈÿO²î(êKRõ-¸Íš¬£8è6m‰ïêÛ¢+Y¼ +nDOBT-×µ$Å› w_‚SUê’$á™›–$wM^ûRô$âEPõ$‹'AÑ”,ž‹/ÁZGB aíC°ò"€¬±õ#o‚ÅŸ`ñÙê>Z+ï,SÃç‹7ÖÖkíQVÜâžÖÚëªû[U)°ñµ…¬6~¸ñÉ£'çì1µò’Úðó³·Ô9÷œÉcjùmGæxˆÕy_ª=¯Ís›w–¦3ÑÛõ›¾8ÞçU,z‹CoRØ{®z¡ÈG2“ÛXó%z?öÐÂ&»,QåÛxò•üQ¥ŽEÒXd‹µŒ¾ÈçkɼËåky¼zÀlåñ}mÑ$‹rx•Ä«WäVßJã[y|+‘ÍRì29¤rpeM._dó&›%¨V2úÍJR¿î‡©ÁƒV´‡/?¹—ÔËr­-—´ïÅ-=ÚUY"-õ¦¬½á·5k1Xr!W›r9•‹¡ìý@®»-»»hÞΗÎ(¡G¦¸w.rµ ¸É÷PÞ ¡ànŒ ìŠ܆öÎ8Ûß-VÁ­ Zà°»ÃÆ +·ØáNýéF{Z,rÝ&׬r}c]§2¯f¯¹êxy²±‹µêP¯#ö¢€K9 +¹Z¦JÈM³R}êb§ÜZ*›­²`„€SCpŠÅr±Y6«eµ[оõB¶T­kÓ»úÊË[Ñ¿ºC-¬èaoª4Ðt.«NöB6ZZêÑЖp°S¤1$€R¢µ½‘ ìÂsªrÌ¥hq/ª&·ó¬ÃyB<ªPc±+EZj‘ÔEŠÚqž ã¼ðÈ ^¯‡q/¬ê¹`MYƒn1¼{þ™ã-ÏEøí\õô¨Ý çrŸ'ŸøØ¤­Å~ƒæÇá6¿ÕÜ5Y[[<™ö¨h‚LÕÃÂoô$nGuÒÕ"£'ÊGzÄ;ê*þùÕ«'/oŸ¾®4õ;Ÿ®}ö𵼨+šª‚ñ±[`7;\U¯‰ +ï ê:TC‡w0¶nÔ¶Š7qkm&†Pƒc_\§A&Ÿ ]Gn«Â%ôÑ_ÔÑ£æÍJTkÂÚò—bð;u5ÊCÃÃyÇpìãþVï9ê6ëf5âÍÌcÔ‚»WÕ>8GUëìaì;³[qd¯+±Eëú(@ßÐ(Ђô‘±‹~õ8ê…Ã’¢ÑŠà\òäÐĤt¶` ð‰(¡Mr*çŽÅé2l~âƒ>Ù§É?ÞH³‹Ïž|´ŒióáSv¥öi;>G÷~¤îFhLêr%Τ'Qp¯„v[AH$Íŵ(ʨ$ô¡8f*ÐÚ_ÁPÕ¿1¢&è#Öƒ^ÁÝÑdè!¢co04u´&ǽÆ&K1î¹B¬?ÿposÆÂЮ¼!‡õÅi}[®Î—v×n|®Þ§ôžf7õ‹;íN“¬ƒ47 æ´85¡¥„±¬ô§ë|›qåxÑsf¬si\å“íi eÔF·Ú=Ù#}uÆu[­{o“v¬‚Ýs¤û„%wXKÏÕp´VÐ- üPZ­`‡¾—6[lC4h¦l΢µAtÆ6æPh<‚§¸ ÖT,£BÊô­jøpA túäŒ÷Ö§2¢Ü£Ñ.HlªD…3 <;0«àIÁCÊ' +uÁŸ2ÁØÔ½:Á +{mƒÖÕK¹ú'[Ü0)ñ1ëpîø˜ú&ŸÀ¼~jëüá×ÏþåcÞÃÍú$&o-‰Œ§ìyâæ«*‘€Ó5çä8Çî\|YŸÔâÎo×îÕs+›(I¾ï|Âömš©«¹/oûÞ¼WM +wÒ×ïëj|¯ó+!8Z ÏG’§à 5\èž'¼ƒïöKHÒL¿ÓʵtKGÇšÆ9Õîž;ž‡ŽrfjÒê‚p–jêꋊlv]Xxƒ#âà¥àazdn˘ÐнCMß¹\Â+ôA1“*Qñs©¯¸¹¦ú¾¬8×ÕYdÁ¢³+RÁ…çO Ò©Æð—x}SGŠÛÈEE,Üb–sÐÁ²F¸¬5`–ß%# 4k ›µ +üªÐY;¡_=ÏR üj¹–îÛÏïâ’~æL>Ü%}gç d—á}¬G”ך3Žkhp¯±{«5¾A¸M轇5 Žrk„àõp¿Ÿþ>˜¤}FhÙŽŠØ2¬± ]™î¶W¹ +FüÅæøÔÝúw®»+ùâ®i6®š±"8öÛtÀ-VÎ÷eu‘°rŽsìÏ9“Íù JÜøµÐéYGa/¨h~}=E^¯PÿšÐÛ\ã›ÐºÅDkñÓýâí‚mZ®Ún¢«õ*¶ã¦U’xÁµªIæR'ŒS4lvX=i‹Ô¶~šîqÛ×Ã3/¶d¸ÇE¤¸ÆàJnÏ!D庣ºATë˜k{©1ŸTªgŒÊáùJRçeQ¤[ôr£êÜ‚TSaž±Û,™=$ø,m²:GAÌ3øßC>YÌuî›OkX•Éÿ‹uÃiÓ`%?hP‰`ub?ð`‡!’1J0ZøæIT¨3 +2"»Iò°Oúˆ‚9B X'¤ù”FUÕƒ?ªÕ« IÉç|2ƸaXuG)eð$Åeáüa©˜*â`äéWåìr£U“„ «ŒŠQCä¾åÂLIuîÿd_îû4ô¡‚£Û•ÝhÅÃUivޱÂWʯ+{+ÿM”ãŪ÷ø•\%ýœ­‰çÈ1ö±©›NUݤEÝÔ áÂFÙÔSË­Ëmu>úl›¢sHιÆEL›Pœ®¦žë)9÷~vÐÜî-ÌþŽ9ï+ŸB]UmkÞ—KVâ.JÔ{*¢A +`SR02.Š@öNÐ< +ƒGöÿ²/VØESXÄ +-ÚEoj”…‘8U×ÁA%Ö¬FS–Ü€à³8øφ#:t.¡ «­4kžƒËÜ)~·8Ñî•ð¾E’P~¯åÝ{ì{¤z¦šè¥IbÚYƒöÆšÇ<Ë¿Êç¾f0/ÙÊ]ÏSn»adÉ`nVêUþrµÊd¾Ž'zXÜÑ{ýüÔãC¿±diR8žWþޝÃQV +(dxJF$Ê”(P(ú·’ bÍûwÀs¼ÿŠûïüÿ©º´]ÔL&%ÏÉ’ÁÈJ0YË´Òr³,9]*XcÅœ¾¨ÙrÝúeƒ—ÒAñî~Uܪةœ +[ô8&ÈÚ–`Q¿ÿ»†ïJ QŒfãF›*zNÁÎé¸9wçÞªšÍÅÜÓ4Œ[SÏå +ᯙzÊßÚØ£“¶IÉÅpÝÍ>§ŠÛ|YÍ?ý¯‚R5µŸ¸µä/[7{¦˜ý"¹šöŠ~ß‚ßû»ßWÝ=k1­MdÍH6;m5—­Ôq_ט¯d2Íïuɾò¤×-Ö« Xö°BÛË:4qëe;„9î&¿–|qçÊžëÝ}媺m}åSèqÔÿøŒôGéñN‘=îלÿ¹š6È&/‹¸M,'h?ËÑ6Ç‘éBÜúTµ3E/ƒ–}/U3uè¹µ–Ü{5£Ö9O5§PÉ$Ä{ÀŠ覆Sô`ŠJÁL‚4ݤ~çüøŒôõ¸/X¸3¢HGèŸD—IȲ +¬—~›º(zÞn¹v³•»«Ü<…-* ëW¡åjÈby+8·NxB# }| †udÛ\yÄÂ%°k·–ã€B}qᯅW¼¨œbÑ.ñB` ‡(¼aåÉ ’ÿ#¿G.ïBòkÝâúãsHÿí{ÜŠv*¢º37Ø=‰‰v%Dn…ÊÅßÎWžü{®âlê"ëVmŸÄEè]‰88?ÓÏÔãÝŹl¼µˆ´n6Ó½LûRÖbPºÀ”ºf Ëä*`]é-¥fC¡Õ«$?n“ä'‰WRü\ÕªëޝÛÌØw²g”Ýc·$ÚÉÝHÙPcÕ[]Kz]jª˜D’ëöŒÍ?:#ýA=ž9Δ*¨ʶÌBÎVZ H{©vÐcO­SËeEŽZèT)ÁRGjO·Å“ Iå3Æû5rf3Üçî’°¤¨µ=9m䮢-¿®Úò¢+Obn¾ ¹ƒ³Ç©ïP?>#ýQz¼S$¡Éã]Ðb–“mYD©–^c¸Ö¢Ø" 5¤—EŒ Õ^—46è1÷T6ëd6‹ ckÅ0â:k»í¢Y-R³R€µ®N´Åš ñ,%?¼ëÙá×™áO;þ›Ñ%P2ë@Ùh£2!æ듵qq®œl¿qù•Ö¨j…ŠéHóÝ!º£öqmnýøÏ*¦Að^8ŠŒNPÞIˆ†ÒW•‡ÞdbÁA¦q~u¤gh2®<Õ®’&ò¡l˜w ·Ú\<â’X½ÞúØš¾ñ{ŸÑÆãöÍ>êc>Ô`éw –~ôußõ@Û\ÝïÑîܤ½çV_gV_çU'Ðá>}‹ãhšúçò¯5G:j~EŒÝÀ.µ?·l“oœê6‡uswwð*_Ò5–sÉ­Rô¬ù>Mkuq_gwºYe¿³;åUÞÚm~'×ó;a$gs<]m‚2›Ž¯ðãc€46}V*bïè”Å£[™„á=.wCç™âÏ­¦ƒ¼N5¡ÍÚÃ{ÄJÿ8O¨IC äin[l&p#ì?YC"&óË<³%›ç²•÷ù3.ïéLöÃ`üOq0dÆŠƒù)æ¿~LÈ»4Hl¨ÙI_Ó=Ý¿½ßö¾~ÐxPf’Õ‘Z22.9/k6…–—1õ¼ŒKfFW³Gö¼÷;÷çG¹¶gã£=¢¦°šò[m7û¹º{ã>s'îvؽgSH­"§ôKëX³ÑÆÛ¬ÚÓùØ$LÚg¾#Šùî´WwŽù|ìòùâü±9&wÞ;½yî>|»Ï”hèç»Iƒ¹„‘¢"v¶O´¯XžñÌ…Øä³¤²—Ã2^#óñ9›·~<Ÿ?Ò>J¼õ¿þùùÛÛÿy¸|ñäé_x@7¿ÿP©ÝZöøNîöè3á2kr7ãoÉ=ÈQºˆÿ´ÊP½MìÑ“z<ú¬ƒï•iS—>,¹Ð6µ¨I…ýØ­Óc·„ëÏè­Z:jP­U•ƒ²ñc'ΛLï:OøÆ=sªî¶ª&„iš%)LKã°È#=5 ä,á[M¹î²È½éa†ä0Uñ>¤oxŸˆ¹uôë’lá}cæ¶C«¤U{ÀS;Fï¸'ž–P}_‰ «ûõ¸#n6yïÇqZíˆ"Ÿº%¹Ç{âþ;ûB¼>$Nqˆ§ìù¡ß+RñbNѳ$àÙKb3V}D“#~À÷ ¿k½¥WKr†ÕîF§âíJZ»)¶ jlè£Ï>0:4–øÐ%:»ì½ãC«¹î²hˆD;dO¸ÕE/´†'»Þ(ûH™)ßOó»ëY%é ¬ûí>¶ÍöAמðZÌwQ €m‡¯==Àv _[£JÁó|P\iÁu¨žåWŠ]öÞ‘¥âUNO¢P½ÉéGγu3ÀÈÅ}°¹ŸöÄO{â§=ñÓž¸sOl'¿w¤ÃAòc=⣪äðÉãzýê‹7Ï_½}þêëÏ?_«Ö5>û§o¤Î–º/ž¼}{ûæÕ/?»xñ÷o¿}B½@ý×!çc&Ó]Ò´=çŽ*›È$ ¾ó`t820;–Æåòå¯?ü­þzË¿¿+¿´™ùÃßËïÿˆÿ>ý¦èðÛÿý»:<{$ßþ’ ÚÆ^²öÞñ~³Û¬½ÏoÖØýp¿ÃWüãoÞžž?}ûüõ«'oþ~øeQÎüâòõë˜Ë_×y}|ýìùÛ×o_>yúÌþãß?qûøËÛ§o~øŸüÆÿÉ?væ©üò?¾+½žÊ‡¿+;Ô@¼P`ÉÔykŠÒ8áhCÀ5Ai‰sw!çˆ=œúÞ`“ÃÚìJÔ”¡Ú­tÊ&úÞ”l×Íj}T6`R!_ñ<øt´ê²`öL èÆÙŒCrð™VÌfÖG>ÆGÌ.‘4¾º€µ!L=xÔX¥ÃSé&ù#È™áÊiÍnÌ1xv“ìÑœJ¦áV6\>Bn +¨Gm-û­ñæàì4É´þòQEKNŽÛÀ¢u”aD–IGÌKÂßêè3Ýð¹ û>1cºvÝÞÁE`4OÍÊ_ˆJ¬)/Á +º™ "ÓQû`1 !j7¨Õ ,HW«;&g…xsî¨ÈÈšŽ3èÁ Âb+z|Ár0žƦ6YAá©ÃÌä„9 G&¯<L¾æ^†o¡?}´–-ã7¬?ºÞ›>B~À °ˆJÅ>&ø#í¯]=Ì(Vqtáè4dWk¨²°í±OChý…cÆ•ZOØÖǤS–—r‘7#îÜB<79‡z‹= 3ˆÅ ä€îýa²¸bŸë#^‰+oÓQÑÕæ8.‡¥Ä«¡#ô;×Ȩ̀Ç×~°7ŒS¼²âAÇ:9$=s˜E5عÎËçŽÇ +ó‚E“=cSn;Ì’lp"5^çÀÞ]ðÒ{`šx ÒSÑk]Ù_ÛÑ;,‰?†dÛþ²úˆ_T®’ßÁ‡#•Íøš?Bàäלá\‡çñòÎ`G‚ͰIâÃâ-ýá´i1*%ÉâþEk aïŠn½¼ ( ÅÔ`Û^æ,ZÄé\NâéÁâµ²«05™¦Q“ æÜ‘຤åpãH&¬ '8ƒºÃðBÇÁ” + ,{ÀÄÅ‹É3ž“±Ãâº÷8NØXåÔk=êÔ£)°ô‡Š9¨Åd¡â“ÄÀӈ燎“”0Ù ˜Eªy–†I*÷Tvo:‚ÒDÕ„„„ܼܫĩbœ·BcpË{)N‹‘éµLe÷«Ÿ×s‚wÊÜ^Ø.ਖ/"¹UßòkG'ü ‡œÉaê ç)X:äÏoËA]zùÚ0ý9ûs³L"ÈâÑ0( T0s~£=rW”é›k]9¢YÔ $QC¶A.¬è±†ë·~\#ˆ-a@ô*Ë‚„Ec­Ku ÏEét¯|-Ñ¢/Ø*rýFéo¬ÅýÀjOOš$7—!ÿŠûr"î} P‡ÚBaìØ/˜º#ùL4H$.ß©Ey”ã%ÆŽpKv:Âá/©¹Ì¡J|w‚(®÷©E¦Ãs™±W‹“i/Æ<ÞÖn"Õ¸2±\ð$ôþ vn—ûµ x‡áƒéµ NipíÓd–x9¹…FC6ÆË¶ÅyÄußÚrÉm ø<Ø´d—ΧŠ:¦e§lj5vpâ˜Æç¨BZû ÔŠÔÎoÐ[ïÜû?3U#]9s‚Á>áÃaæÅu%¤„Sí©ôà'¸WÉåD^èÑÕœ/k¿ô48Rᓹ«GØ€ÙIJƒ3פ.;GÉÇ׋˜ÙH*p[¸±”;ŠC;Dváüx$É+ðQØH¨ãdÆAOê¨À@ÌÏŽ¼„–½)|,Îþ‚ñ +è9çCvG^y¨H K£rdƒü!ƒáÅZú#×b©K€Éùâv°dÉæiôD6ÃÊn¬'×Â… +ðM˜XpFMãÍ‘ª}zÍbô2x"0•”^"øCgÀÍàý9UÏ +|³ˆ +ÆGîe]ëµ`П!Ùÿ‚ÉÉ9Ëø¸+9>pü™lh¢RA”'Ú‘ÄÕŠ²ÔŸ¨°´}ªL…ƒ,ùÓ6n¨ðfË µgXºƒ¦ôKžD5Øì(/”þ @a-P¡’Aî̈¦–&âTú„Ã’ å¶!÷Öã¹¥´ny(ƒ¿d?Zj¤°­5;- „#‚eõ}èc3 :%—2aÃÈíáå¸m¼Üù¢x¡L5 —¢›dÀŒèää,OÀÆÖÆ[Ô‰0À[ÒÄÕ×T ·© qÕÿX±¶e͵Õ6?¨Íæñ­mmýmzëñµ{ÿgfë?µ‰íGPЃš2hšÚ !ÑŠÖSÊæV‘4ÿ ¡èi »1ùet*t±îƒù…+׃÷Mú¥þÉi:.àÖ¢J·â´Á ñ4 L$ÔäˆmµZ“»@CÜ'Ý#gp°¡YÊÓùeô†IªP=4ÆLàÁŒ Ec,ÕI…ºiÂ2‚{[¾F¯“èÄ/÷¥9¤T]|ÆŠœ9¢®újINTK m +`£Azpsâ Q Ë"c¢¸PA·'Ô~lQg4SDÏFzÞéhZjRC©ñTÕì´7Ãl0ˆª˜ÎÁçÐj#lï8²iq¹˜šá†ûKu +Ý…ªW½~¬¡<Ë5îÙ“È*4èèiY³F$ô¹EÝt4¢ãî@Eÿ¤¹#CŸŸ!”ÏÇ7è~R‰k#ÀœQ©äó㨄pKÝ Ø-½3î±E}À8SGó\ƒ¹w5>Yéfòí¡Ž\5·‰=ã¨H­mdÙeÚÑ}÷Xä÷-`Œ".ïèºHy²'Uf`Ò|Û?£#ØgÂk±y`=;3‚dƒ'V”#1'*ÍT‘¬[ 7ª'ŽýQƒ{£¥txõ^ðú»Ÿ#™2ì^%LY¦‰ptx¤Þ)Ò.é™ÜG5ç êùH 8ØnJæ6gåfHÞäe2 VP²™|!É0RçE¨ K‰yß)’ü&8Wò›Ñ0ÜzrÄtnÄt‘ÐÎn’´^`¢y€·èΠ£÷#˜4³£™aÞì8‰ÅÆ[*´ÀÂÙ˜fJ2T¸‘H‹Þx}L³;yUŠê"VŽð¿{î•´{$šöDK{ÆÏRwlÜ\£Ã%}øH™=/µˆJíeªç¥è÷©ù¢~?Š@9x`R”‘ ÝÍôŽ+¦ãjãd@ƘÝêšÛød‚ï•yЧ>ÏÎ™š »¢òŒ[š¹·F7M±æð&c½ïÖãâ¯Ée£ÑËÚÀ tܤI ÍÛÐbAÌìÂÉí£ÍE‹—ãÑ—Str´DS'ǼY“S§Q—z$Ú ^:ÚÙ» äGJ“ç·êæiÄa~ØnÇÝSàÙ°ôéý>é ¡;W4ú}òñ)š*($æÙ”¢]£ÿ&µ1“+(XPHÔ´x[j©»oÜàj õ¶DÞ¡÷$çÉ9Ô¢êÏ9á4f/QZP„XasxgÜEiƒäØhƒ$·6ûR‰ &[HQý”gÒ钹ד”ß(´—JÒzߥ”·’sX\vtJ™}Ki`*3ާã$Ï^žS‹}ÓŽÄ­tgõóáÖ¾¨¼ „ú„3(.ìÃã¨å/@ Eà<î©Å¾›êNGãNc¹g)îð`ÅyÂûiº Òës®¬´ÊÉh$1#ŽÞäü‰óDÏ>£­bß§uùÚàœºóÄ©Å0ô}/Wž/vo°îÚÍÞ®†z>j`§‘׊}o×åkÓ\¼oÎ’ÍßÍÃÃêêC¨ÃäÅO>ƒèv¦}óä‰U«@Élâ{Xt< ØžÊWTš×Á`x1ÀSSm¨å7¸MqÊ‘ ©‡$¯RhÒ›HWZ<É+’·xÂȘÁ<8ÑŸƒµ£&3$M¶K4ŸA† šO-1ß¡xoöçU•j«7®MJ‘2MÑé•'`#ÆPx4Ã+Ñ 3É—¨|ЊIìð' –îtäS}n[‹ò=Ë·Â÷ø yX^>Êm6Ý6è|ï +ÍJSKå,UÁàV,ûðª\Aýb7çÌÍtav‰ná8÷¶ø”Ò§w"¦\3R.‹—¡À2rÓÏ-ª3QÍNK +•ß;ÍÀÉ/'³GVظ1Ì-†—©›aBEó¶Ë £> Æáö2T˜Rmv^jhð´™“éÛãlN¸wY(9ÿø^òô}”CÉ™Ä 9ã.Oÿ9P.B˜”µüæé¦øNNÌŽ=N?©Î7¡sò¤Ÿ›,5µ¾föœçõXÇœ£ßk`k`ºÉÇžñ±Û[šat|«ÙÇ“\[Ð \Å¢ýÔbßÇ~îhô‘7Be-Cgƒ/|ÊWº¼•¢匳==~…råÔMKiè7-Ü»¥>u§Å¸'îwÃ7TáÓµÀîûãCY‡²…M4*ÏŽù“lѼ᧊}gýùû£ÿý<†¹Åð2ûŽü"›`!(›(#/3† +5òœ»*ŠO~}™±bßÇçûÓ„Nc¸oe>Y÷ò¸MiýWâ”¶o]˜š5ëÂä[Ь <´bÔ Ä™‚̼±.ðÆtÓJk3uëu⚸\À)wëísÅ!áÔ@tܘFã³2L¶ûf. ƒZÒ/‘Nèike ‰€üqû6rjšM¡ý¾1%´' }„BÚ1 ˆ÷³ðñ +ÅÛ3†š´££®Æó^w;M«8î_çãq(v@º§&ŸÏæf£Ö^L«rˆÁã1Óù¤ïç7fàõÍØz©| gØëH7.§E¬¦Ó`¦» +øfƒ&Ìh ˜ßj׬0OÏÜÑ´Ó`î[«óa?‚Ÿ”óõÊ·àcèBM×"ÑÂR-‡=7ãeÌ™{%”ÌUomª»£LCQ~&P}Sh7Ѿ(¤àÒÜ¢ûTáU<íJôÛsGÐ4[8:zÌ#ê‡êç¦Q¦A¬ 1èÊMµxêìéK²Nâ36¾ÏØ¢ûtmæeîgšÚi,÷­Ñ'yax‹†1è+•½²"ŠRàn¦*ãâvîLælS),R¥S6RçjÅÑ +çHS›ÅóI[èù&:lò}¸]$ÌSÁ¥%ØD˜êîüÈYúÊ:‹§qvéCf´ìÐ%-XMŽ!èTÎ|âé"ñ”¸(&ŠÉŒ£Kå®0t`Æþó¾9àSSmÄÝ3ÓŒ±©Ü`’Ÿ$Y:H@V‘F½œÜL´»¨“è“(²ƒ|€•§g/ÍŽD,lì8Œ„8ÊX@'QŽyo¨ñÆú8*²xЖBGÎ(âÄGmQ¢Š+Õ!¾l;K@l;ZÓš‡Å{Íf`Ù©Á„ì§éŠEŽ¡ê*qˆk¯¡»*e¥eeì\ñÆ‘ tk1V¡(°iI®‡*°) {x©@@‰t±ÒщĖ@™:³(€¶"3P3Í~À +¥gsœ¹ÿ=®ù>kšœ^Žl }æ°Üer=m±pÓ‰Avã’ø q¿‹+z¤K‡¥`ðI0)bÑŽªŽ|Ä}aºYÉ3n¾XxŠìtÁ¡…Àƒ#£¿dï#Cð28,pèô‹MCß^› b¯OFæ`éeâ( ]׈«…µmv:’÷ óÈ2'"Í0}D1Yzq÷b²mÕàÐA›qF¸Á÷ÙYñoh˜cÐ$#¤9Qè"¤b§‘gæå™fÕTHÛ—5Å$xTìQ‰{‚@HIã Õ¶Â\Q·­ñž8‰û_7´4î=¹U #¯ý¶Z:njÑõeš³çš"oM´1¿ïPÑÉÑð¾Ó÷§9›†pßäªêãÊD³/Y3'¢€ìUˆž^­/÷ZeUá–œ.ÑI–*œö$—F.؈ +€Á‘qöÊ4Oû„¾S® ×9A¢2AÇc©WPI`‹ñ!PÅ~‰©„³ˆB‚÷´ê#*ADHE+Ã)eJ³Ê–á:†5—¤v·è?±„xhŠ.ˆ”Óì4è]…aßášÞé'æÂ0ÐO×F[YP¶È„ß-‘¢5¸­ +Ç<´¨Ê•¦îQ¼\ÂNG®*ÙqL>u)ä†><¤ÉS ÐàªÇ­aãÂ'm›E[Bž‚V=z"ZàÑâ‹™»Ä!m“§¹8–«¬|µ`Ñ6wÉ +éIVy"SUêÑåNx³Ðæä‘w">(CÅ5.Šõ¤ê +9î?·è—d ®4 +"óN³âÃx2Ü¢ÜKt‚±¢›G¢»(c18^Ôòåª-÷ôˆè>ª¸×K0 áiV¦jÉ ‡Éü纱Áhqg@ލ· O—°VF;ˆr“AîÕÚ+”Ö$P¬ø61¬°ØÑi¿r{@(UÏ~7¡Ø?Ëkóâ7…˜%[ü^Š›¸;Êüý õºóiÅ/Ö‡¢[åÝC“>QÅzQV.Ñhd(åÉIstBF«M† ír¤kSbÛÏ"¤2âÂÒEÝÚDg1˱R×)ã’0RJ<#t{G¬V®ŒhÙðØXM1Ç _@lÄNòÅQ¼Þ2ñ@¾<Ó,W§ Ùí\ÌÁéXªš‚¤„”둹ÅñJ p':¬ jÀ™f°,ý°-…ÊMýàtPy^Ÿ;c™Z /Õ54‹EF#¸—0Õq0 ¾ Q {oêñ¥ÆõIãäÌýL<徕Z­*ö4èÝé(M;›Â8ig£×i›QžŠbmÃ^OŸ˜‰qh‚/†ÅDaœB‘&{“D³MýÚS.J¸8ƒµö¾ï˜éÞ_äö†0µߥ>jjF©žŒ¨eºDw˜Ã;ñ@«ïP¯×èðæ­ñ<µãsîüe¡èE‡€LVårŒuÁ”ÛésöòL3G¥šÈ_Ή°Ž3ïhY¡S©KðEój(ŸÒýÈ$ñ¿åMºÓ¢^ê4¸ÒE4»ÓLÂÛ a˜Á¹y0;-†·ªššªQø¨ÄиÃÎ`è¼i«ó&]òæ·Zà˜8¶™P̤3ÈctþaÐgƒëâ‘7ôׯ!J +?¢|M-ªUu@ Ûéh‹/¶# ?®ªç•˜âòutmÁ¥Q,6cG–~yig ­b|‡~ÍK-]9’UâÊá…¸OäiwÌ"yÓÎÐÇU=2ÎÁÔÑ4Ó`î]OØ,:áI‘Nûâ–FÈ,½…¦Å…Wb)¤¢Žd×݉©Þ´pÊVõÒÆ£A?‰EÕ±­“@‚r×)#I ¶èuÇ™@„L{·æÆnjQÅï‚g7D¨£Ö¯(÷ Vv§EÖMé…Ü”ÕC3á—¨Rs‘ÍôŒy'ŠQ–Fî€ß‘=*ªP2=Ý:¢à1lLFd³¿ä㎻Uô?ØPZ¢ä¦¶ÉÀ¸Å²;·‚ŒM 8Z‹¢Àí xŒ%—8Ù(Áˆ7µ¨ÂûoîgÄ®,‘‡VaÏZ½Ó¢1©`1¶+â§fšªÍûΈ—5fôJ³é€}Çð “F­qO±ïèê*Ît[ùˆ}GUFeqPyƾ£BV¶‚õ«¼#ôãÔ$ðÓÒM’Î#ô(v±Æ¢Øõ‘ x­¨z™ô‘xÓËQ]ƒà1$‘PY ûŽ{ÛœÌ5óé¼/¶ƒ0ë4â7À€†GûYH;hxäÎåå%5¸—ŒÍ¾l#Oey,!–T…3y\ lK îüN(Ç U®}Þî”nùÖg·óÀ©Å0òú„©™.F#Zî›*f;0l öÁÎ+Œ ê“Æ˜û™fqË}˱RiˆkD€À¡ÂñL îñF7¶šðìH<Åï{_Pí´ð Ô2`ª™všÑO1orÜâ ŒgD ÈTIÑZÝV7¯44¨OÀèvúðìvÆ2µØ©©Ù4;Ó`Æ ¾{™V :âºñÄGy:ÑŒB>'æú,AþÆþÜAÊÓ‰wo“ ¥À ‘nlЙ„  ÝÔÍ…7dn1¼ÒÓF^†fºX—=s’ª8ƒë‰ñŠ á¬÷^iÛ ^vÓÌŒÝL“;ŽäÞUz îì€áÛªhx|>ÅÌ7UL}û@TßT1aöM@“ƒý>PÅ„â7ULp~bÅ„ë·X1üMÐÒß]Ñ ÿö+&ì¿ ±bB+Æ€€}ÀІö7áTLø€NEÿê.<Åw0Må8ÁSì îÁSLp‚<ÅŒ+8ÂSLƒxŠ `p©h@ƒôDƒ%œ°'>á9Ñ +÷‘&dá0Ѱ '\‰b¸'1¡ޏªá„+1Ánp%&xà WbÂ9œc·FÄÃ}\‰}8ÁILˆœÄ†¸&1¢"N`#<â„%qÿ=°ó2 îƒIì4 & ¢áîƒHLp‡ó÷G¤Äy s‹=8†f¬Ã4˜ ¢½Ì>²Ä4;ߟ&tý+³å07ЃûØ;ͤ‡vذ!&hÄ ¤Ä„¨¸|mÀ`ÜyÐÔb™a§ÙáaBņ˜G¾†”èïÙ[O33>ç¾>gõ˜c*è¿ ³P¸0±9>ÌÍh2$“pÚI;M>Ê¡Ž„K% ·½-ú‚DGl½Ó¢íÈö‰ZÄ‚\ËÜ.qKÅÚÛÃÔbx™Å>¸m:-<ÁR±åƒ©rØ&«´÷VC‹ú¨6+ã÷ç ÇpïʬÈåo»Ó‹Y@ð¶xþ]19Q^£ª +wO3ÌÍ4!ìÔbc—OÓk$"GÙêàÚ¸Õ™D4\É µ±Œ¾œt#³(Çi‚VFïõCi@úñ»«‡×yÚG¶­lÉá +ÚÕag`ei†q”’”ßyŸ¡A}Ð4/S?ÓÌNc¹o‰Ö;êG°‡0ìA ž†wFî(P +š!3MPœšÑŸš^œla= „ç +n! ñ/JqÚ©‚UQ Pðj^ù¹EU¼«’0UÌc?‚é.8'ä¨âÎPæÃ;UNql–‹¨Îlt˜9LcAƒ˜åÎÆý!aMã;-ê; s3÷3Nï<”ûÖiu÷»TeO"®×`¦ä O v2.`C3î@KÖ[î/JQTøIÔ´XLKaÉ‚{Zò(0"†qgfª¯ÓÌ8l†€(fmwz¨:q"¤Ø½3Ž©Áð>óŸš%ïÀƒaKŒøv(tÒHó{”k¯ã$´ïìLòð´û–áG½LÆÜëbÅ}êob – ~ú5LjfÄ- gëh+‰Á"ñ}Rô¡™â-´€uY*ÚŠ'a|h°ùÀ MMáe¯Å\lµ¾y$S‹á•ºÙ}jM½¶C SÓ~о¶3ÅåA÷Íýz«üðêÄ‘ñ(ú}’\<Ò +Xø=éÑ2 `m’Ø4##ªé¥à‹ZÁQ+d•kRƒ(axÙHt,mdTêymiížTå}•½Æo§Š‰Å Y/BÖ8€¹Åð&=°hhi]dèqÆ¿ËÝP†@÷)ê/pË‹/öüC‹§ÍÆ3ÌÄÔÑ4›Óî[–O‹âІk%¯é·RÿaiÔ¬`$‹÷²Ç©NêASQYÆŠV +Ûçu2#H/•­8t8ê_",™ eé °zÊXQÇÔ ^ÛZÜ#’7kzN,ùyæÑÅub¡éjmùÚÿ8CëØS 4™Ú7K}œgÒÏ—ûµX%ñpº(=}.3‰ÁxC³ŽW¶WT&WKuØœýkŒ)$c +™®=gü¼Ž®ö6Tò€ðJžBªH}Ú4¸ZÑCY¶ïÔ¿6ÎB{йÉû´¨¬È"* +EÑ &„àŠÞF+ñnÛŒš J7‰ ¶  +›,ï­«J[E!$á¨Ö ˆ¡ûâ )ÆýNf.ï=Ð2»×—*ï¡U ïЯàR ‚ž£ç©/aÃS1½0šE<æ¡-º07ÌÁÔÑ4Ó`î[Y˜7ñÕ9!E%¢ª{nÎns3š`%Š'2Ë…¨¿q3%B·© îZ©(ËŒY1!–áþWTE }Öé7OÓ]v«¯©êîjÆøécƒqàõS3"}ˆþ +k‹Ÿ÷vbæm ~>Ró>½ÂØ¢>jœ‚¹£i²§ÁÜ·Ÿ”v‰ìE¨‰iµDP‚· †àËm­©f¨„½î j‹\3lUI9Zpê gª“ØÎrv*ª¦Üc|qÀ¢ÁÍß'§¸–9÷Æ0µÞ¡+å‡fô†ß\Ң΃ ÇDÔ^Ûö—*ê¦É˜¾ßæqzô™éÿ´hŒØ^iïÇ*ãŠ{›éžÁ Ü¶]¦f´‡ûbwU/†» !ÌGšÏ»ýÉ€‰,ŽÈ’ƒajPgœ–4Ië©ÖÙéF5cÂÏ#™Z ¯ÔŸ443å2Ägûa ZÐÄH„b\þüNc‹¾Q·s3w4Íï4˜ûêÇëm‹ï»(¦œÄPðr[›˜fކ:„Ç£ÓýKÄ3‚‹ ðÏ®Â?‡âöÀ°tº=à=ãÜ¢Jx®$@¦th$?âÔ„u&–ö• {ƒ™Z /ÓͺÛfØ'˜ ªŽ‚ñ©¸wnƒ +4)ì¼ÕØâi›·íôÌÕ™ÇpfA–mò}B£¿#âù'J@pQî«YAˆÉˆ¨†iU„›€ÔT »h?-N5ͨitçP>Í`i‘›Ìø3 i y˜„8c£¡‚ø´3$Z`–@n´]$4‚– uÐè‰CJ0ážÑ 3ÆspgôåRÆÎ(gNð[ì næ (.B;˜fóäÌPf’9‚ÿÁ,0¶M›-rY$ Í3`YÌ ôÖÎ8e¢Šù <ÝŠ$~žCÒiF'Ó8 Àuªê6¼'“€ß °ùŒ¨=Oư_C*!)KúמŒ"½3~†%;»Ï'בD7,DØ![j0lí(g#fÓGÙ³c‘~ƒôk#^U’þŽZ*öpº–ÚçkyжŒobly­ñk}"†¿ú™þÁ”gJ.Mµ?$65kHb™Ic³ïbôA”ß׸aŒZaÊ–†ÆF—g @a’6—¦±]|0zhê +v»ÁmALp^$5\Ý]40Pï,ˆÆc-蜥flDì"xó9¸/»W¥fL/uÄKͨ]Â$Ý +Öe¨I<ÑEƒÅ ËeꛌZÌŽÂ.&<Þ«t Ÿ’ €[®>ef‹ðo#°–¯ë?ái18Œë¿£ÅãM =‹’ý4‚fñ8ªêö=ƒf¡¿Bò+XÆŠóà€‘tí ×bäÜ"bÑ»H¾5a¥X+vñ¯´$Í"¼ƒ³¼5&ü«ùÈŽX÷ê‰ðóÖ@Ö]à«¥v@›’ÌÓyF§ŠbÿÝÁ¿*oè³¾÷5âü©0?g©ØÃ‚Zj,©åA Õ2¾=«þVCå2 ÃsÎÎÞ2Ï´ˆ ¦=„ª¥vƒªžPŒQã9ªx$òøÔ‘»msªUìCMµÚÕ©=h„ªÃÛÇ“ªï4V.“0<æìÜ-Ók%õË9¨¨^;Â3‘j抑@·³¿í#CÑx,¸Šã·È"ÒélzN«ØSZj0¦öœŠÞÔµ†zê¯Ðõ™;;7EË,2]¸V;ˆG/·µbR0mF°%ÆkJ.á]°&/ȃnçkôTfçA½b»h©°– °IËøö`—–׿Ö'b|йù[¦˜†BQ©UŽØE 7Ì{7ÃÑúÉtäû°I¸þœ‰;µôn,ÍéA­bch©ÝBõçTL£>ª5R‡Ö¨MÄÐ×™ù9çŠË¨6€ U¦Wï.¸ÄÜlv`. ]µâ‚6 B€ÓÅ"»3ˆ ¦Ð’Äb¨Å≠3=¯Wìb/ôÚ»¡?h„}èãÛ…ßnl4ÏÏøàû'ú㨕>(ãÞÙxuøÅ—·O6Ýòɯß<>=ùø‹Û7Oo_½}üßþ½öî¿øõ«·;Íùד?¾¸-/ð›×OW_ªÐ¼¾Bóž}äïŸãûÿúüÙÛ?×/úsOûâÍí_Ÿßþ {ñíù Z½ FõüöÛõ˜Î6ÿÍíŸÞ>ÆJܼyýêí½­ÿú›©±¥§'ý½r`Vï~ßÿ}ûüë?¿}è ùúoßž]èküvñkûøúÕ³úõúÁåí×Ï_Õ~yøÙ?>ÿëíÏ}VþÅ–°ËL@¦"BÝURÊ%3––L±™¸ü¼Cátª_þúÃßößT¡nciQ‡Ä¿ÿŸþ =üöðoÿ®ÏI/_a©Œh|àëy×°¿Ùk5½ÝoÖOº»vÿ ¯Þát×U¼|òô/Ï_}]þËÛ§Ó™}@jÌÃïÊo„å÷SC^IØ·QåXR[g‡N†ºOjILwé .Ø‹Ç~BL_ÒXÞëø82,Õ·ˆ[ÖJ.6Ô‚á?Dšé„ +6±Â3°‚± ^•4Ž2‹4*–Š%m A˜èl<½QXËdß%nÃ`Ü dT*¿œ$œ„dÎt&û g +’yûªðêºä~ðL@3ˆK›Y0ÄuÖŠ%XEˆ!*Å Å[ „Œ†þ±¹ÏTcËbWÍF¤ýTKÞ:ïÄ{KåTsc•y`&m©0Zô)¨ÀE„ßmùJ7ª¤¿ct$“Û˵§kª¼[•D‰î%³6ùUb@n!S*¬YfM@Ô˜–‹lƒ¥+ˆÙAœ T(¾%/ÒÂù%Ð-á`$ƒƒË” „ÄFeeP+sÉì©’õ+Äãò÷À™Â +нàüáþ ª'úœ[9lO¶ôo6n2prÆsmz 7+µ|láü„V)%ÖB> œh¯C3æ“c­¬Q¤iÄW~qs!« Q·ü>‘ùS†ËÇŽa2-,µ[VBSÝIDpÍ a™¶uÌ'iÓDA$B4k±ÛÛÁí¸ýp)’3ìÖ‰ŠÏçœGùöFÀwâ ¼QÍîîéX_5ç4kRsN8—ö€PRløDÛ¨NQµ"Ï„3ÕÜÎx[†ë™*žÑXºà,AbϺ¤ž`˜ Nàƒ½ßº[šLÝ¢@mI 1ŃR diqØ´Hpd¨Ä +'™¤e´¡Z̤…^’ÃJ³$Í *Í2!㱕 ª=$þ•‘MN”<äçJ(—¸>Pqäî™ +ÀÒ‚I^ØÂ†Žæ ¡…ctµ öL”­¦ž‘X•¯&ŠòµÚ#<óÜñ– +±Ò±Î¥c·Äßa„Ê”°='b(¬b¬%&G¶udÖ^7Ôë0¢Z…‚‹u¦>¥Ä6Ë„ò=¸É”Xá¸ñ¿¾X¢Dn†|Rõȃ˜(à8,4%=HÉQGiá@„»§6a1¬X Nf–íSÎŽa@\‡A¢?§“fAðø¹Ë@ÙÌ:Á?Ô¸ªŠ„ut¤J.ñE%‰-h/ãöD£¥lk %$@iV°=x©ðs =•áq2H¡‰N&- íS¦flSLi•eAww¦µˆ**z;ÓàÅó&#%R‘ÀœÇ)qWtýd’7B>Š1œêTÆâP(¡ƒ¡ÍWý ŒãÃRO:åéÍ\xz¡µ™^ÿíXKÖ $µìO»Ð31Q ’ˆ–æŒ*TW1R[*œ>c×D†ÏçdŠ«­!‘[\×x{³ê¡Þ¬Œ¸„3cíK{-Þˆt93 ¦.ðÒ<Žü82s•|îºÂŠNØôOU‘i¬%œ@a€¬1È;#IâH‚³‰&Þ$ÙWxÿTªr®ÊàBY2mé½Jû¯èLé )„\Sð·$Ž‚¿h“à/Få ‹ÞEQ«I@¿#/–O#°ž¡&·âAÁ.¦}ÅI kË&P*Òzm®œÌâ*®ºÞ‰Ý8%Go%¹+5pò˜ +pi”h=OmMÑ +§›!ÀAÀÒã8&™¡„„÷r¢-ˆ„M£+6(R¤+6ñîR±CÔ³õ£w•Kƒê¥ùäîÈÞCªQÀâ½ æ.c×Qå«—SÖ +Ü/ÍhT0Ó98—´a–:M…k¢ï$Ÿ“àï¡Ï»jÙr"­ÕRik'JyÉy¬8³¥—ÄP$.¼avéöÔ§mWh‚v‚ìªYˆØ\ ®Ÿ@‚Ë5NbÎŒ‚)–%‘~Ь_3]Gf†'ùИb?É„ûLèćnD‚ÅG³‹ä÷aB@L&ѶTGÆf-i"kÁϲ–8Nåk‚lLÜ2ŸX¡ƒ„g‡ú ˆ%ÒŸ^w§¢Åö |KÉyrÛ2 ‘zK~ÉVW]fdž#ÆõÉ£C8Uig‘õÄeU`"é€'8h˜Àè—4*4:ðb$»NSêq£t½’ìîàÁÅ$*øiTã=Qñ˜:9Ú’ÕLK\¦‹–v;åfu¡,¿øÉ’‚jKEq”kx\‘ð+šq¶"NHÿ7Pj\‚¬M¹ˆz±›XQE˜# ŸçÜab‚pµ´jѲé8AÍ_ql‰iBµÙé¬-sDË­fÄ9à‰d,C!ÿ܉X2žÛRN$†¨‹ÝÐV»!m"ÃMqœ¤I˜Aüw]å½c9 •¢)±ÿ¾&ó¢ÿ.S + ¤)4Kh(ܰ¾ìB»$BÎÌáVöŒ¤ˆÌS;@¼ 4Xa“E Y¤?‰(Á­`öq^Édôbm ` k[¾xaËŸÊÓ},Á„’IŒ$7¨ c» K1o¥< “EW±ívŽ3(À„˜Û@„žòúÕ ¢ìˬˆós™3¬«l£€ŽÓ%µ•®c–|íÁQì6Å®ˆ=B1Žwb>X:räbgœ ñ}°¢EïfQ{7/²L´{Úç¼XeÅ ,æºós+¤‘I1µ Wâv–•ÕªÃmmVY‘[ÉJImŒ¥;°¾V`h‰$† +«Å•Ý–‘ß ‘ÄºÂøÕÙÃ[enØLÌÊÌë@ø‰9Ëš'K$8:>´´"ÜÚYb$º — „D‘º²„̓T\ìcÄP‘¯ñ„¡¢Ø‹ I®«E…¸Üôþêl¤(üDnÓdÈÃñAYi-L—a®}$Eò$óyÅ?ñÔ“få~Ü7å*¡;#qµ@p£¤R#ñ¥lIâ@:<­Ö˜‡«¦\Ñ\Dˆ£ŠÔÕ‹b­@N‚Æ] ЋY.8'ÈL¼lNN3£B×2‹SDÉÓ‚ùz-­qèÌeKUÓ*ÁT_ÙTɹŒ‹¨‹ù÷i×µÓËFN~7Vœ:É z©ðâ¥JK†ÌÓVø`ú-,½Hè¸>¾¦ðMœÙR!¾)&«€öP5MÙ;˜–pZa!'N×ëœÛˆ×`(º"çJ‚@ñü½MHε²8NÜ1éDàvÓ@IRâ²Qåú¦xE\ò²¹ø2ÓU*YÚ='€xÀt2het ½âĈ[†u÷¯/wä¿")–+(¥j†¤ +TŠþn~-dRyž—²==öØOB…HâÉ(GÆ‚ƒÃ"¬ð-m.Ø)ËÇ0Ãu—&X‹Çˆ3ºâEìdßê’í]¨ZÎ1p_pY—ЬÅFGþɰÄ4.ýÑvÇZ¢&±¶ìSV0—+ˆd+‹S!² €K}‰¤"ud(]e0ˆîŒ|9`C»¢3òÞBýsÅd(ý+Fþq6©F«k +¡40¡/ö&-ï=Už#ÙzbË9Ñ —8j澡¡‘q›Âï.¬©€øÚàÂS qd:|»Ç +In¨GwÌeãFq@çà ‚Y[©à½Á +#pïìŸî?¨,©/&s·(AT™¢<äAÓÀ{ B:H9i¯.rÇô9Áä;?:V¦ª#Ä%.q$¥TBˆnYtýàäTÿ¸ù*‘ $¢í;U0ô–(št³SAw¾C3ÖÒÌ@mÝÖÊèÓ±9ªÉHgÔI `Ï~Á á<<Š“.W{q;Ôúu´´Øàl:Ê3¦hØ3êàxÝr!¸oºÛtÑ"ãÆg­Õ©¸8ˆîF hÁÚ°B¼ŒH p#±"—·Ê­¼°mšoŠZ»@Ô¹Ô©Jk¬J­p® ­/»yuW1ó%í¨SàÕCŸS%»Ê—T_TÉ‘îZÑWv¼Ò÷$&|ZY@]ê¡2©d;Çfë#žHªž)C¤¨„î],¤¤Kôô –Šb´éÃ#acšvªØ)S<¨nˆ!MÊÉÈŒ€F®m+.ºå×¢‡¼—¯N¶xB¡Cº˜'#H?²¶¼¡è o!ò6‘ÚÝaïȺ1·˜u¥Â!Gý„åQÙŒñqû",7[x¹(dÈ© û°¶àË'_THÎi$êlZEtŽ\–¸¹žÑï\d`ž÷,سآ¤ƒL#¬-™’ó…3%Ç“Tä¼fŠÅckÊ|›Šƒ‘™‚Œ­«ÆÇ‰;"³”P‡ÊÐm1’'Ô +XŽ4ˆ]–ˆY[ÞD€7Ááèð‚‘J(¨œd'—¹5enÉ8Á~¦)CÕ„WlA8×G2{[ò„ RšPTåQ´®²”:ê·ªàIp1ëˆx/ó"VYI"(Q‹ÌšWøFÈZÖGVlAµ[HF'a9ÃêeèÌ—¡U¼$ä¤à ³‘¯‹s²ˆ³»L›€Ì‚àHÊ*ÇÀP[0˸n¤¨¢Ä•ºŽ ›¡U +D…Ö‰"xÇO\OÂl9FðÉU肊`$e&UE%D•ùˉªs ߑ䀤“ÌÎ*›Ɉ .Ê$C\hæN´Ö ›¡a+Êð$æ& ¦ˆ¹˜¶±j•&‚ƒ_—æT²AŽ@Ñ‘ZðVE{ìh%Õ%r3°’°k[àO -s¢8ƒõc‡}²¸U ­éU`J3Wšu#{fr$±?ò„s~E˜¥ïAM%&T‘-ÄËTŸ£!KèÜUhÁÍ„sµºœÃÀœÊ˜™¶›-¬(‰¹’’td nYup ëÊK1‹¥4P=q ¨ DFƒ=q8éi cH*, ½j$$TKjB|Cr &U`$»6¡Qœñ «’‘L‹SQ×ßj­#¸,¦C”Ìšô‘Æh…ȩ́F„K-ˆÉ$É*›ùÇÊGq-!N¬ðT¢" +“"6Qlf|Ÿìci!x½µKB5jÓèËWZžàRé(×V‰!p‘Ðî¥Ò$':º õ‘æqÔš3eˆbŽ#b¥ˆõ¾ÐW´ˆ-˜ÁˆG„#›—Á#¥{  Iª|ÌÉ¥0S-&ÒQ1,ή<Žé‹IW~³'³~ú,p†àŽ“‘<4ŒÒúFËK*.)‰“%í)mÞ÷Ó9_p÷IþHãùÄf3×Åö +EGâ%µ|ÖÅçÃÓøhŠìÀHXù¾ãÚg +GÔXkj}b;rq$åîg•™'IGQ|¥ÙŒ^OB¬+”-T_ I'^lÀ—㓊³$U£JZ„Ðumt+vVÍ\êÅoÊHº>±øFŒs!Ê”¯DqJ,¤‹£_ªìuŸ4%•â:úâ®!Ö¦Ôrꚇs!ZÜ5Ä“$Ä1;)^ W¤øcˆÝt±&ùg>W©dŠQ¥…ÕÊT½êú{r¶ŒœH\IlO›A™â¬T2a£qÄÜm¨¸•º¤d Ct%ðÞP¨ ޝTxÕÓ”ªj¡§¬K73_$%f%®ø™‰ÃLÙÈý¢Å\Ê=)Ò3 .MÁÊZA‚‘A~¶øž9ÑÀŒj&£ ‘â¥È<—Ü|¢¥JˆC)> +¼O@š%Ðúe QóbG0ΔµšaŠâíE8Ðë(ßÝ¥|èÏé”À±çˆd-M(Ì’tçJ:^U“މ/ $·µø‚%÷w©X¼5\ dú:Ä1 RReå\Q´N5…¤û$`R$Æ>Î+¢ÌÐŒfa"‰'üZ𥠗‰/É,…Jbº…YãªàþöÞ¥Wš¤;¯û+ï°•‘qÍ¡øÙ040`È{Fm0/ ©ÿ½c­UYu^}JðÀ@w£OETVVVf\ö~ö³zŽÝÙšA昆½þü©mµŽ0NêpÎJ€b|-¡äˆÊL¥¸èN^ûëpéåÈc²š`·ÖÙ6v¥~çAšÍ_‚ g"(…œëI¤”»(©Ž¦™·S_X¯5ÌÐÐîÔ­s|ðEVÁü oöΟ‡+4k +ý-4àäë} m%–Ÿ­EUÛüÁV~{¾>Ä@G¬ÜØ5ö‹¤˜ç4ÇÉ…™®â8b…³Giû"o¹äáÕ¢¢÷ÿÓ9ÜVôa\µžÝ¦óP8É-H·×IñûÜèªWNwë +Ù¾Ÿ1Æ:MzW‘®wžÖ\Ê¥à† +õ$35Û´˜Ÿ—Ùn:Ý›°Ä[âåJÜÎXd#N?õâ ¢“ÒÝ=F±ôèa8€pQ‰eRà=²ñ„9Œ„ª÷Œ¨Ô¼d[âD·Âî}v«9 +ûT—¡ˆåRs. $œËª_ußsœ¿à0ù•N'](â+×±MÉÄxiØ3båãŒ)Ž n݇*…óT•ÚCEMÕݨA˜Óª{ÄŠgÈ5"7¾vì5Æ“t!Þ6ÃúK9Ê“®‹Éé~ ââcÅÅ1 þíÙÆ…Ì6ø­¯2çVl2®0Šˆ1X7tâãä£}±ÜÌ„1EÛ½rÂ0è×iÖž»>¼í§@‡6ÙüzÌHߓԛÝRÉQ&©Învc/î"¬§u è1'¸è1¿O§Ç|vâ}?ƒV$ßO©¸­ª;Ë"†;z$Pf9«¤60†tº’üŽ?:{‹²±Š!B7ŸÑ9âDõCDרn°qš{Ø“JKÊ€òÍ|¨9Àp§“ãtÓ= Wîóq†šB.—=Ô½ìÀ÷̵Ou5H¦7?¤…¨Ì;$›6kIC¬›Š6ä–_Ç3¨CˆuŽ 4¦µ4»b•8ï€Ó“ ±àënTZWCÑÚ[ÔQ,Eõ2ŸÓ¡· :˜>ʳ/p:RœÃÀö¡lAd™Å¤j[°«¢…ãܱÌ_Å”½*S•i'>6CÿçÕ.ï†ØCÀ‹Ê’ ý¾Z”pù­ÀAžp¬Eƒ˜Ù`ÎY]E½óö4²l¢dˆ«›#ƒ9¯»Ã©áʪÛÞ©óu–о¾1 +³ÑelE4']  æ—ûÙÙ0'¢~¿Ky$Õ‚á§s£­Ã!QB•,kO™ç‹•#š¾Z¸7LcšyÄyNQëϵåʱݙ«.pª»¯x´BÚôRý¾þ&"¼/õýLƒëç9ü¤êßÝZz‚å÷ßë‡ÊK}‚Ó^zïÍŠo]0€ò& ? +‹ëõ»?Y®÷(Q8–GÍÞ-©EX©”륕¥ÑL)«³%/oJØæ¸œ™£V\4øSΆ2<Ê[¢‹VNáZ鷱Ѝð§„Ež^ ;.3çƒÃw¼‰<Æ\> ô>ó3j|z+ ã‰÷%@sìœÌàã~47 ›sHáa-K)¹ +ÛX³ã`DhµÜy#ŽhÀQL‘áôÎ×B*Åkž0åL}3giͬ©g+‹Tld¶Í†¨ê(nÀÈd‡¡‚Šjƒ {ÃF«¢ßs‰Jûµ +ó +¾n8œõ~Ã7¦„›£ûF@¥y€*š[C4ý…¢-ígªw]õ cx•=ŒØZjŠîDÈ:oæ:';âA9ò{š`*.nÐæ]Í>û…ç1” \ü]Ú`cZ!ùPtîᨈàp¨% ô°ý4!Iu ^Ü4\o‡Ãb†F¤¦JUR 6˜âöÚ)‚÷M5^¥p +©>>ýMŠÙØc ;¨0'•‰AT؃Ûsnâ Tdp=~_oÛùû‚)Æ—ÛK±\YçÁ•X´°(¤Ø( ¨z‹iùéƒøfûüJÌt Ì´£ýÃIÞ«¤ì­b0Q¼Gàã.í!Ñãï;Gý9IÖ?b”‹_0#ä¼¨Ž ƒ5opj¸Ö`\"~YѾyÖÛ°3ÈÞb£Ãjž”f£mŠâæÏAÒþ'M>½~€9о>/[Ì#ýU»vBâkÁú: +–U¦ÐÉÍ_9Ô?9]Þ9´~ìûYG€ÄE¸š¼ìI +‡nˆ@¿›·@]¦êž=Ñà1oÄ+bÖß HÅúŽÑ}6^«à×Hy/¶3òë±Ðˆ%‡‘)T±¬ÚOgÍ;LAíå\ß³¤¡¤ +9; c‰]*Š: ‚«`#a¡bÁ>Æ‘üîõ­’G1_$[ù…=¬Mˆ³ÔOZ?R¬4ïW×o2×@p]]¡ Ô×f^\m‘ÍÕƒÏëoi0ÿ„Jdìãݬ°ùìâòJ(Õ›kjô‘ÄqúP—¾ª¶¸½FB ùH¢˜h_µÑÙªŸ¼)?rÅc/ÑÛ[Œb­ÃœÊ\±áW¹î +B[QßÎÖ‚Š—VuÙèГ–縨 ph‘·. gŒÐ Zé¯ãÍõ>¦¯ó»\q °Üæuúóu¶(ä]¬SÁA"¡s¯¢…ã}4¬ »•|! 9bâ?oqÞ\<¨™?ek¿Ý[üio?þ«Æ†¹ ?*sµ1˜’e1$}ÇÃV £­º?¬[÷_Ø|RÛ}ðnóó¹8ý / ì ¨oîsÃ"ÞDîù»•\?­¨Û*3óKy>ðÔ’Ðp8ÑÎe‰…ƒs<ͬ¡WÃ-ÎúL†“ÖÒ.î<“9¨Å®1öxö› •(ô…M+¦xêpÁÞL+~†Dñ¤#`*!“` ´}ºV:n1ò¼Ù8¯Z£UÑ›„¼¸ +ýP%9¢ÊÞwôpÛM0ÚË#)]BÁávg£zYO¢˜XÇšÑM¦ Û3¯b + jÚ0vؘM®g%öW–ã%ÁÀŽ åš3”Zómã.ï›7Ñù`××ÕûØÒ²TÏçzd™æWéê¬'àqP4kž2¹×LúSëi2MNòuãçÔbDÂ:W¡0‹ô(Ò8ߘî +\ð­¸ÁŸ­šµ‰8³áZðáš|ö‰¬'T þí°Ïáñ†É~f€r².U"?|V‰ÆòÇx°¯ÜÔœi%Ö4~†TWgø&A”àÙ¸áx†Õ­)Ä¥^,>œ'«š’Vì¼@ƒ +“9⊠[ã×»»HdÂê$9HÌ$ +“B"Œ1—1ݪ΋¢’ ¸Ç”#§¸F”¿Y jžìôCŒT\ÔA™ÚÞ ónË;ª¨N¢$’!:N‹V–K³µ·¨ò ñ%ÂE‹eæšq¤Uk\âxŒ®t¼6tžÙTùãßV7Ë•M]§®¬Ã‡Z‘×õ‡9pfÉQ“¼w½–1"ªu´s²%…Öä«°Ò&jM˜Ð(¥La;k1ƒéºjÈðB˜£? A#"Qʶ¾ÖãÜ’3ŠŸÂfÞó.¼ã­*ï èMµž‰Æ°Vàõ+^'õBC”ë4 n5õH×!ÅVy.‡TÀ‘"ù6³mÉòÕêéU.çûñæ cáKÁ8ƒW)qc¸å4ŒÆ‰ðÿ1޼bs¢ªç*é=šß%C2zô?Ý¡‘8¿y)<^‰l«ÓzT¸^¾ˆº:á6 û û¨f„þŠeÙAbsÒ+j¾×BŽºÇÃú¸‹|¯†ÂuïÎ¥ÍìN£´GŸU0©=*Bª6î!ƒWtÜÕ§¼ˆË5› Ò¶ºš ¦Agl*Ä6^¡¡eìQ_‡ó3æUÍï€ùòì<¸›ð@-.Ø®Ècúâ3sD¡ÔRFàS¢Îc8åÑšN”Á|vµ0?d ó8è[çRzžM}WÏ»#Ò77iƒÛ‡VOƒÝ[±ÏPño÷z¯ôØOŽuñ—ö§y‡þ»_ÿþý×ùûü?ýÅ_ýÕøÛ¿ý/ÿðŸþé_ÿ†ÎßVuÿÃ^'SPÐY—È#Dîó~Iíµc½á:àv£DˆT±Ò½£GX±Êʲ´ èQÃ5ÄuÅz8ã˜FfZÂE¤lh-©-ÕH½P$ÝFø^%÷Žôhž2Ï´|¯rÓ÷*­¥¬Eó¤Ç®=–JmÞ[;†ƒJ‰dª›B¥(I·³jH×úRh¦:»Œ¦Dß„«µH2Ä‘d ùÕc­Ù[Ô»|¿Ÿœ„{vQW6øv¬ÔÕMÜ:²†‘ÜÞ6Â7ÃG]ÞkWZÎj+ÞÓq Ÿ‹%éôXGÉúìX7ÄöÉbQ2ŸXPò©Ä×ië#H:h4…evsw`í~ ¬\(âu²ØW¤Pud`Ê´@ã7Ÿp,±iŽŸ %ßìv’¶G3 Ÿ­sŽ{%r±áwÔ {¬:6J&_¡:àæ²"¹FX(p­F™Ñ•9RLv¯ã œ³wåPRÈ@[g…ÚÊKZEFsHA*‹\®žáÔ‡~4x#žPíè+­åº%z-c¥Áºü¹››}¤ºÛF‚qS²AñmÓ>ÜÆ¡ÏFƒ5˜hØÅ™$Lƒj"×ä#lèúXåŠçË´øyô¸ÈÃz\´é„Ò JwÜ9†j f½SõþœYƒplG=‡ôàœÏãí5ô¾Ëûk¾‹ÈkCžP‰EZ£á•¶pó×`î*X­œ°Ü¯Ðw¿åÁ¯?ŒÑ‡#ôFtÜK@£¢¼».¯ŽŽ„°*7¤†§-¸†ÓH"N0ljóT—f=ãŸv×5V,ìä±ðžgÔÖ(óþ Ké¾´ ÇÒ‚^ây2‚ñ}<„`=AEý0@`Û“†bœ²6§£ã ÖŽw-‚‰&´¶8˜ÑÓ0»É342 oò†S±Çá¯$x‚ðkü’êöúÒíUÝΦ~0GA3‚ âÄA¨›‘ûeË9ü,óÈ–?DZ¶‰îX:–e,ùÉO+YB„JWáÆœ(Êë!õÎÈ8|”'ߟ˜Ù!Z…iMY[k3#¢pXDôZêU‰ÂÚÙ£½æ ºqs"eD±qÃ…¢cΓ£PóJñ~³A³÷ݨÏd¶-pÍëê¡jšÌðÜ(–Eº`§:wùT;’f²ÃÒý +ó(äÖ¨XBiO3Ý¥to†B{Që¢]ÀÙ%[5ìC‹S"kÁ<´9=ÔNk·ó5ů˜·ß ¯,h+¾ëëmÇyçüæ Óœ&…ÿ eM釄…(ÆC*un­ýw·>×ì1úJ/BöáÚʑԩÿúóá•ûÈŽ–0™•’Ï6ÑÒûžæh¡æá:rTâ5GêUä%•;Kh”©Ai‡/+‚“áuG%7Émê, +7‚ð#V ¿Ëݪ-Ë}â~ 5Rr‘á=‚cßAdéWX]fßuôýÂB‘<È‚8[º yÊ®m§õº¼A¡;‚×ñ Âᬄ¯lÛ§ Ф^ûWOKg›åZzÌ]Déñ 7p‘l ðl ,‘{h9#W ƒ’¡öGA3*ÉTiìG­‹¸˜ÔRÏYáWz‹Æë¥xÉcL¬3 õ·=´OÔ5®QÔu×Û>mþL)Þñúr¤ÛZ8kžLAÙðYóm¡0;CƒÌßz‚¨Àbp6¿üA9­ìaæÏŠ=š«ª@G©x}»*yÔz‘OŠÃ°PdÞ€^[&o’8‰eŸˆúívαu ¿¡Ì¡ãÇ‚lëZ&: h\0W©ÿ3iVjd,5 +,M4ìÕa5tÜ ƒú\ ]t¬ žÄ{áa´j¨âÚ +Óí¯ luwYÒþÆt0CLhBó‡Ëèòï 'Í94¢¡§¾™Õ)Šoì¾9P +;H>ßóAªPÃúÅZî9o]ÌN€¨ËËÈl_ÖdÙÜõë/?,R#¾y?xTžÕŒeïD œ¼k,ðzúŒÎ™U© áÉbs,iË>0l¸‹$•ÜölK@µõ©Ã¼‘Zé¹Ò­ápìwEÔG™Hª‘ÍÞÇëCÁnÆ€—Ö-É ù12&ò¶rëæÔÎÀ›óo1¼2uV ª$ +Ƙ*¥ -JªÕ±x!uùéÏ}å\0…Dñ^ÎkEÓÌ–Óé…´Qޤú0g7®/P÷Õ¨IpÐDÍ@üy¾'•¿\[\¨Ôü-93JwžßÙ Š‡w]ñz9³2Âêa©C«Ò#fpBñ6´4° ÇšY}ı8clá¹5‡l¢P +B–™ª1ß~έß®e€Y—ÁÒAЯ˜Ì·-å·*¤”˜i„—ÂÕ“*мÓªyÎ Þ#ÆÏç[0V5´H†Nv´êƒ¦ˆ:ë.=øN³AUcHÅ-I!ˆ]h0LÿJ›ÕËì-Ôjh[ùåVïŒz_t´äš–åHL­-­|;ñé3Ⱥ_¹í戎…›çðN›®S®È1ÌK‚c­2)+HYãfŽ>cÕ”äå|ë$ÿ££füÛg¥éè£ñ¶ÞnkKj‚ŠÃ¼bv¾ãê2I(Fת–ïñ:+CŽGì9#>¨ß/ø"DºhP23oÕ3÷¤øÇ†&Q'‘¤JÏéðxDÛƒÝÎR†*=„yÉuºfÀÁéÚa¯F}ÕºÙÎPÞR?W[zšè§DÃÜFBnU— 8¤<~”àUbŽº•îá»…î\MºBáfUZBÌ×OW…Á­SBUGTÑì£<°H´†ßWÓ^¾†àÍ?µ˜tÿÆËcG1õ +G%FfAT©ûƒ3»¥®gaˆß˲ôo”B!·Qm¿î2F+Ïiþ*‡ªGs`eù +ð.¦R³à:”-›E\9ÎnË?P*!—"3„!_Éy-/¹÷l¸ðª£A“P.±ú%VGùï²kv>D+”l‚½ð|O‰ksŸ–!ÌÖÔ,ƒÇ<7TÖçsí ÙC¸®rÏõ(]¨¾½6 ;¬ÕQe.)ç “—'M—yÊD$V}2£ºïªÁªÉ'Œ ±R×X lêgW#¯,Ñ>^µ*z¶òœ/{D_Ögf„Ë4,Ôlv¿ßΪ‡{'z×uô9Ô"•y¢]¢~ #׫ å$Kò1‘Éå½eÈ!þ ô§ó6Ö`…žÇZ¥^Ê|Å–ElÓ†…b ßp¦}ɡӳÐt´ 汯ñ¹´g4˜ ë"•k¯‹eé4ɪ”?F×&|åÊóZáD¼¢ÄëVé{µx}W® æd\!eRâp ØY¨ƒ£(Áæ?±ƒbô¹Åo{%ä¤É;¨¿´æaŠa,J:FHóõ`£`\èÒyfkÎÓûÚ‡ª‰a÷¼ÿôåXª,ÂwÊ–‹ËÙfÉVëËúS˳òçÀÄUwº.7>õ³¡.çÆÁ«¨CO/ž–y‚}µbÃà CuߺÇ>ËUôÜg•Xò„êIChréó¤æSíDIìií³Úzôç²…1{]aüFÌÈóxs€÷⟡z­¯…¢ä†é"D˜S`uèSŽ,ë|€šBÀ®Xö›¤t½ïlÈõZ,~Ö"[J|CWÑió~F=xE Н+=mEÑxÁc3ÂĪ4”áÙÆõ»ˆÀƒàSt24lÊ|!çƒâ£@ÝO3Ë'öɬë5<–µû· +ùbþ5=¨‹üZ ±ç@ÐŒä¡öÃ$%-µÄ©gNÁ­„;²†ÿ.«pD…Qß]Èñ|vÙº™Ö… ȱÜ: ë#Î¢Þ .ÄgȰruŸÞB˜•CO”«%™ Öµ¢rž7‰´lÍeZ¼­ùHâfŒ/É®¢PƈQÐüñòðB/.ÂÂÓíE׈”ûYbï[ui­»a‰ïŽpIÔ´½Z)fóç(L¤Ã4‘·±v«ä/ÐhCÙzl¬+v÷i­\è­•ùÊS³rlœ=rY5¡@…уëu׊N$ÙÌIP¥‚îž8×ãÜo³AœöÉÏÙòvDs ~½- ØË*Yr¨ t1t‘Ìf²;:;:•ݰVðÃýÃîÍñ¬èfo4oaËy„?Fyæ£Á»¸Íq¯\q%!„rY[`eÍg&ù7¬=Ø™J2ÿûm;j‘RDCqy²`ñ«áx«óújm­ŠÈS=Yà Ad•;"H9 +ús%TGnûMu:Vô˜òóÑlµHÔµµ9„ŸP·)m°Ü ˜JŒç6f„L8Êžq.ÿr‡2±ä¸æE}§³ç×=ÞÜ›œu7¬ãõp•Ÿ÷}>zFqŸ¾n¬çGgàFè̵ø§†’”¸Z‰x.¡2Eu&ó]¨Oµý»¬l\ 2?#œ¦! º„«†W]‡­á¼0Ÿ±·–Ûñ+`ýZüu.©~bô)4´×àx-gÙz®ÆUj%§-À©&®­"õ‡Äx$ù±ý¤ú€v!v’ˆ õ.`r ÷ÃȪq½Éª¥cùß9x&¶ù‹ßŽÞZ‘Ô]ÞÉs:|æÄz,FámêÖ•ðÎtk:Á‰ ÁüÅl¨u¨SPr¼Î8ÅÞ–V†Ò±Ö¼ÂއÒ…ë’¢ÂÒ¤åZ.ïã)ÍÅ..‡ÊÂR-máø:EYoÓGš×u(…¿‚¥¸…K-LE ™HY9y+|¶thžñ V—x§_”E»6¿V¤‘»§§È_µ÷kcù,ÁpW)I`a‡µÛófl˜®åR¥«Ýk¡>ã_Êeê…Ê,S½rl f¶Ó"n}¸a.Ûâ#B…´^~9|ø,z¶µúbÕ¾¤ÌÎ Äð/ÏÀ4Òë\ââU›š'ê[2›l^ÄÈÅ|±¹FB£ÖŸ>¶/~V”×ÞÊ­4½ômÔEÕ?Vv2ÆA„°*í«é1UÜ ë§•"ŸjÇTë æÃbЇ2@¤~ÐúSŒÓ>Kçz~÷X“Go­”>•„ìÈ@^e2ù9–™Q6î·©³`‚éfµ ®È…Pá£iH†pŒnÅoªÜ +«Fëká,.½ Ñ6ñQVÀƒìá5üf©08ûþKP.à ëBzm.­™i-Ö(C •î¬,½qgÅü‹±®Âu}‚N cCh±†KmÝmÝ}Å„«›Öp[FâÏ ëõôn¾r¿všÿÐ[AFÒü®€_š.S.råQ¨T«Þ Ù²g­£ô›Ó3:„¸G³ ò#ú-»¸F™·V…ã¶µ°IDcZª}AyŽ„u]¤‰MUS1˜vܽ¯È;B7ú%ÞG®Wba¦ÃŽsç›ÕŸ’/†×$€HñÁq.ZRÍÊçúà›4M”EgÃ2:ÞºÁ‹«òI[°î:ì”XhP}š®¸/cÒ „ÇZ¡×dm½ÔÛ;àAÝÈ¢/VJÛ“¡öˆë 9(ò»»?ý›ï£üþßêh¿=XúõïÿêŸþéÿúõÿá?þ/ó¯ÿúwÿòýÿï¿þŸÿæïÿñ¯ÿôOÿüÿüõ?ýý?þç¿ÿ×ÿé_þé¿üó:èÏoùO÷Ï÷7ÿúwÿù¯ç‡|~úõë/þݯÿýão?ÿòþÇÃ\€tÜÀµ¦ ÛP2€ó替}Ñ|×õƒÛhþHÂæ Õ¿€s›$7{‡…2iû ¼¼ÒÓY¯³¹´½É‡ _€§ã`'5ÃPŠÀi²õÕ+nvFAXß4^™MkʱžšÖ‘GX°-§RoŒX ?¢¾Ø…¹ƒBSÐ$°ü ÷‘+J#ÒùkE@ÙNsU~\ÃÚr½_Çm + ß¶ŠñÄŒðíM(ñrd±8ò\1ñ·ü!L×úóv"¥œ2&:F6y^s¾Á#+ub(ÔNgY¿^0º/¥—`ŸãRíoµv‘-J5tº§z¥Ý6Ðï­²ØÉt"N+ì”î+D4—e¸š(´Œœ,pWéÇ-ë¼i 0¸,æ“·e÷ÇXxŽwú9ò§=b]›ÞûW5t§kpÆ?RÅõ +'ä&ýIé&VŸ[T@el_@n‘Ž$nXMªöÔpäÔY¹æ,X“ªà Ø„åÛYˆp|øaŽXǃ"Ų͡¦â– aeO1 2ès¬ú !ÉÝ ÔÎä¤l ¸Ã¡Ì·Þך!玹4ï£Åë¡~ëÝjOò>Z¢àÿ‹xÏÇœ£~ƒî«õmå7|ûŠNÌs`í©MÍÚ|~`í ­y™¤ÙßõÂ_{½§\|°ë[˜«ýH¬'BYí'§¾³óicãéY+é7Pz—šõúfÑëO–Òw µ¯‡þg½nY©Ýìy\ÓúU¿‘ó4Œëw¤yöÚÍÝç`¾S,¤OëW¾—0O|àäÙÐS§}SäGýƒô׆Ç#c†U÷`Æã¸Ø£RG?ù÷•G݈xþNýI†ç=Ä1žãRI½@ðìDPÎ<øïs¿6ö¡ QðM{çÜ/> ïÔJQϳÝõí̦¯æ<ÔÚf»»ò¸ˆˆŸ(Î'Û=Ö%e­KÒµáî.Hªu„ ç wb±´ŠÅ®ó w·F /‘ÙZލj6QM‰Xªêî߇w[üò„º{óËHƒzrÔ uçç;ÎÔ}\¤Ÿ®̈iìÍpqNâäd3Ü]^aÅÃòŠP܃á­.Q±«ê›¦NÃqêû^z/æÙÂø y}ÀܽM¯Ípwü†n÷ïÔ|ó@Eþ`·‹ÀÃáF¶ãÐŽ ö&µcÆQWÌsÚ/¬b7•ÝhÎY7Œýb]ÛÊ“Á΋ 7zýZSÿM\ç<8È;hio®åæ«óÔí…U§Ê­„£Â¦©_9žÌ›¢î­ÊHðtV0(+Ìth΄ûnTz½‚~£Òë¢<éu!doB:~Þ|ð FÇÆ› ̃‡^ÍâÔAÇ”Oº1èüèáxDŸ1¢|Nê¹ ó´nØ9K96±ïŒs‰Wil´y }Ù 4')N¼î4×B³7Çœ”g·G@YN%j9²½+`âLBŠ&ÃÊ$¶ñd”£(é…&Çá¹ÅϬø¿à òµxóÇÕ_€ò ìx)àÆó¦oÊ8ÉbÁ¯g™[¦¸„+ß,ñsMµ7Büsýüʦ­âj–@€ÊÀp¬D")‹]¦èUñs`ÂYÌ0È?èàš[ÔPp•P”óòó¦3Ú_¾“u•wÞäo>©), rwÅ÷¨OηF!êDâE]1…˜Õ$ûÇw˜7¦µäcn†7.®qµtžC,C¥ËØ —ûkñ¸9—šÞþš{žþ¤rƒ’gR¼aÜü¯ÌÍàæoýüÞÑÛh=k¨¡”ŒúÔbôÈ¿ýç;_‡0¦Ç«=7Ч¾{ ªPÉË„³Þ ¢òÌm³³!x·£lf6‚\T6kºö>æ6cpb»ÁØ´ócN-$ómîUæÇ=8ÐäÔß Ñè|Ý‘ßÔçÃ;!ÒžÿPBuSž[Ìě팚1XÊoHg j‘œõq{8Qaþä6 óê/\3—è Ò|8ü=ÐÌ.¨¸·‘¹­âEd.n…f¨ÉÌ¿Lâ»´uù +TǶ|ÅÒí†,ã€R6Yù<Ö|õ>ñ¢LÒ‹w•í<ÜÈC’É‹Ï}Ã'÷£65O( ›oZòý÷ƒ’|¿xÓ‘¯È,À1XU×Jo0äs-lî.kËr£÷ßïÄãûÅtŒ ÇÝ|ãuË=°Æ—ž¡eÓŒsè7Äîƒ"œ¼x+ÙohñáÆ£œV|X;ñI)æyU›{cŠÿ’=Y>ñ¡!_ÊO.q¶P²¿pÄ¬Ãø{QˆM6Õú„Cûõi1‡ç}ãØ¸QÃF3òax>­<7Y3ÿAÍÀM>TB„ÌïE>ÄP¬ƒ!':@¦·ÐÝiÚ|m:ŸÀà€Ø¤'øX¸«›LÄ,'˜|O ÇCÈGÍ7˜ÑˆMðƒý˄îõ†þb9Ëds³~¡;y ~Y"ؘV]f,üo /Ù{o2”kßü^4XYˆí7v×ëñÅëeáÖrÚ¼^.uT§†‡õ7DÒtÞûÅÊ‹Pu„o¡¿“W%Ìz_åÃH¹¹mn/:=Ç›¼K»”´wòn^a͸›—gäÍÙE¦¦ÎûÍHø8Ò÷E×ÅôÒþ9^æëzï¥ËúÄÂÏÅÐeÄ#vãq+ ÞüÎÐu±Ÿ_/ª—zcèÞ?ºûÅÅЭLå…Îý\æ¾ÖÁ$,våq?rþ™˜KâÒpÝO/tnR1LÄRÞôÍÐExÉš$×›ó“¡›zKcæz™ÜÖ'C—÷‹vš7'7C7ñ$R_Ûæ²Üßó'†®½¨Pmó¹ŒõØ–Â<1É9ØöÁÐMZG‘žg¸×oº(©WøáØ0¢U¯åL‹û@çÚc(.Ä8ƒÎåD¬ýÄ{Dþæ':7@šèÀÛ²öþD熴Wð»öŠ?’sɳgêË‘`æ•!TÉ÷sæ¬iKûfçJLEÝØ˜-Êì7;×nxî7 †ò7;—t—úDæúBù cU“ƒÌ BnöUäßÈ\†á· ê2×·¤x xÞ'2—?æç’\-|2sMÒV0ÎÓsÿ`æz7_*­‰:Ÿ¿aæ’×#øÏ5Òfærü†pŠjå“™O±ýcÞ{T +üÈÌU¯p¶oT®øQLÑâêî¿P¹|ŽÞÃóƒc`þ•Ëù Ê÷,j?Ó7*—/|À¸Ò8†søDåzR¸6ÏîÉ:ÃQ¹é\X.8Gêߨ\Õð„QÃ+‘ûDå†^þ²& ·ÅÀýFåúQTîÏnãÈߤ\Oùò*§ƒò)—)ݔśþˆÊïÊôIÈ%› ·L§&6ý€Ê5¾Þêo¹Ê´åÏlÛ7+×ðæeþ©@ä“•{Í¿kI¿aåâ'œë&ä¾;SÿãΆbÿÈÃ¥µÜ7⋃ë›÷¿åc®Ÿ™·5G»¾Q·FxqG˜ß´”C§Þr±c êXöÂ?Ro¯ëÕü_°Û‹²é‘Æ-IPÁ"?¢m ÿK÷ÿ@ÛµÇß@[^?m÷›c;ˆÇ|ÃkÇÚV|AkMëöë7¬Zü0kK߈ZãÛX3Rˆ‘Úù¨U?¨„ø|³ûBÔzÑOïP~–üͪõeç=Ç7ª $CÑQ{…E×"Ó‚®A±u©Îߥ>´¼6§Ã ¢åÇÂÌŸ•EIîè;›ß™T8q¯ßØÙÈô]Zo̅еù³ŒÕ'.­ý ’zþ†?ë\ äH%àHßüYoŒb:uÞ.ñÑábÌe:¥¨»}ògÍü#kH äæÏÚpdÓ‰Í  µá4wô`<´‘GwI("6€62Ø#E{¥1ZY)oŒÉ”àã¾§”ðZæ‹gàÝyhuÁ‘ W^¯M åRé¿÷žeä”uHÉŸI”E e­ÞÜ£GûU<›¨GM½>I´¶bHÄ–¾Å?lõ[™ËÊà×+¤¡!¯L-NÙJäy´‹§Ÿ–Ÿ´û0RFu¿áÓRÐ-£3)+×?ù´<ÕìÁÙÆ5ËŸ|Úd"L­1büü>­F!n°% ÿäÓÒ#vý2ùtûƧ5ŒD([Ò;½ñiS¨ñ|ÿ©Ü'ŸÖÖ‰±Tªý›OûgUo1-VG,8-‚{ðiÃ5¾ãŧeyqJ™s)ÊÍŧgŽÕÏ\zâimd÷jYz©OËIP]riGr”§¥Aç‚®*Þñ´ªáŸw¬Ãδù´6Är’_3m@m4 v+RÀž€ZÎoŽH…Ó8 °Ý€ZÆ#o.-+­£·ŽVÁL#S,bÞ8ZUKÁ1-Ë9"Aù"Ñ2 _×ëEàíê7w¶1§Í~ðfyñ-‹(þTtYŠ3qrz‡Ê¶‚ ›%‹<„mÍêßBÞɱ­ï„»à·¾ ¯‹ýÚ[düß9±BTÇu¿F‰ÑUÓÆÃÞ¿ãa÷k ;\Û¾8¯°J ÿ>¨°½Fww’Êœ6öþûýº_[Ä×yþÐnâë8Lʽs^äæçu0[¥¼ñ®üÍE}P]yÓ +«)‘±¸7Ìu°7½R­óû˜€¸Ñ­}ÞÄVgÉœ?@­/Ë‹Ïêß©l,+ùàeßñ¢±ò"Ïà aåïòÆ^%iL<ò\íÇ-ä*iâ+°¢VMŸéIXEù¹ß`UQ*(o°j÷ImOž*„‘¦aadWáŸÒ6=µ‘0OýMõµE+e£Â{ ÞˆTX 5@«»Œä +7ýQ +.¢®ØYŸüS+W°S[ØSUº*,Ü©éw~ØwÊ)òT}aÜ´­€Ì 5å<(9{°L=,T´«›\*œeö;°T¯nÎÅ)Õ™¦ô'}äJ +^È­á‚‘ö¥l8öÓ½¤˜“V=Ús\«Jå/ûúh…|µXiuº ÆÜTQi%ˆQÞi¢½ºnˆ(ÎuņˆŽ%T|°Cy‘áãf‡Rmœô™ d((U†Õ)”ºñÃo€PÂd†Ë–9Ýý÷;t¿¶( 87mÃÔ‚ *±óóÒ7ý…ú$#won…MrݨOÍ^•f†šöD}Ò{qö€ÒÈM©û¬c£>Ýú³Ø™[«¦ÞIŸ(´Ãøl/Ò§2u`]ϺIŸ¾¿RaêôFúd씤b—™Ó&}²‚'p> Ðqï<¸ž„@Ø«Ý\OOÝý~CÑ›ëé"Ê%­¥=¹ž. ¼n‰(Ú¹¹ž®ºcìÊÊæzÒpÜ™K¦¾8¡›ëË¥s-—n¶+ •„s¡‹B¢;u“=mˆõd!®ÿ${º¦®ú¬vŠ67ÚSoX6z¬V壶âw˲?í•ÛÿçО&¡†Î•Å™ðö´Õd©õÍöŒÕÙ"E…öm!ëIôä2/<$•º‰ž_¡¥›èIJG¿gŠË¯@p¾ž&µ¨»˜÷êEþîFzÚà·—v•6ÒÓ³‡óRQ7PI³eÌá9ÜHÏH,‘­a¿ÓÚFzjU4ê“äi.Âgt~„óæ"y3=Ü!ÏmoK›äip8Ѐ,Ú“äùµø_$ORÃn £„Ê36I}m’>Hž?4*CH*|9Ä• ä©+m WZ”gާ%®¬í;;Ôœ7Ç3I|ÕYаsÚÏ0vìhÜúOާu(ÕzÐKÿ÷›ãô–²è-gÚ Oî?c¬¾Ž¾@žTýS—t“<±õÀo`<©®ºžØN”âŠH–ò‚½»ðÒiÆ€i„ÚŸŒN£Ê-‚Çá\½`_…Y7¬Ó†:žŒÎx±ìN]îX€xüê~*x½Yž”;©¥­=Y¦ªšÿ¢ŸÖ í4`D‚€(v Úi~µÍ;µ“¹G Ö /BG©Åè´º=D/4'FåÚ@ÎŽD¥§ ä„F?ò“ÃÉkBA‡Sï° ¿Ù[lÔMj®³Ü°MþÄÀçfl¢Ù¿‚ÅùBköÒ¸›¨Ù‘“uƒ4‰F#&ð3»¹»¾±™ Å‘66³­t˃– @OàEËl+sC2å ô'“×XÄ,"f3Ä|c0ÛÒ]=è—êsYÝ-°NþØ‚^rê¨,¬Kʵ¨ÜˆKÍùí(Ù²,áûh©<òê›cYz”HÜøJPsõüÀWÊ@qtS+ÙƼi•üÍ–í©DLàfS¢U—<¹”À Ë“C‰}ò²?YqcÚÌI”ÉÔ^>P“¼ˆ5ý˜DÑLäý&A¢xF·ûJÖES7G²ë¬ÞÞƒaĉùŸ%ËÖÝZiIE:U™2$.°|Ð „¤^íåͤjŸ‰÷äEž¢ÿX{è}oì#g’£¢é%¨£H’ê©yDîE`÷®ÛÀy ôƒíÈ÷5’²Žì‡¹oo’#^Rùè;ÀñJQ€{s5)ׯ5R/ÆBýkäÅ…A2Ü`Ýýõ‚3RG†ùÉh¥\­ÅxõžßFþ¾?hMÝîæ*–pÐ"0Þ¹Õ¼ˆOÀ¼qž¼EüdJ~ñÅ_´kc¯7Óƒ®H>Y#ì·;¿—‚“ÍHÕãÉ_ó«5µËè77^ÑÖ€z–´ñŠI°›†ܼW4éf‡r¹¸Q^œEZ#™ìÈ êô•jDðû667gÑCôd-WeÞöÇøú°\¤á@œÅ9Z‰·ˆ‹Æ’bÜëó .²zŒêA$‹Ç(”}!øez‚.ââ—ŽîA\tíLr¸±¤³Ð8sí|6°äßèÅß®Å_‘ßcôâ¥*£|#þaµâòÅY$u¿ã¯%ÿ™ªHý©RÖO˜" úc29Ñ¡ŸÑ‰Zç䈉žÞʰèÐÀ4LëAø#(1ªsµM!GP8PJÁ¯šëèÑÏ(a~¿%ïèDwEIâ\”؉† <å'2Ñh<…ÌDãã? ÍÇH0w +™è%ÈQ¤ú %º©Ê!L(8ZýþÀú¢"»ˆRbTû¨öo‹Öø@&Ú£7¿l ó‰رé™ÍôLôçq1W›@ˆ‚˜øùò˜hö ™#@U‚†701,ÃX¼’Óʘ¨â$,Œä'0Ñä',6‘œ#o`" §åóå´h0±t'F­ò¤«Nx]BÃx!çzöÍK$«ÇÃ]GwX?”\j³R}ðý.9oL¢¥ð§^5sfÃOca-ßåô˜šHÉ>0‰¶:Lt“èëÞSHãòµ1‰ÎtQu õ“è¾!¾yÁ +rci8=gÃi×Â$ÒO±Só9¥xë—h´ÉkçÌpÞÜDU¾F()©ys †2B On¢A(°¤áæ&2ªÌï@jeÞuAo›s5Lgh˜È9>¸‰š²"!GWG,ìæ&†´Ó8,,¼ù‰¤a×ä’i~òõéÅ" KÐ\^EBm9Bºp#­["­{…œþEPTŒ‹ñ +Nþ&(Ú ²b0µå› èáÊõ'"‘ñNh˜­3ÿ/p¢ìšdøu“y‡¿N›7äüÝžäD»‡‰Þ+ Ánr¢Ê¿å¼$8¾Ü0DTõ +¹°‘JQ{õª#Adëtd⯷±dVðpÒçb(’™÷‰ ŒƒËù`(ÒZÀ«µ¹ÞÔ3U†"íR½ælsæºYŠ(D8b‚ħŒE¡Ãu³i8ÀT²’7KÑŒfCCg÷`)jŒ®*+öˆ‹¥Žé› èQxJ9ü™A1YĉR¹Z› ˆTä½l޶ Š2BÚƒ›¨–$…de€’¹¹‰~g)`êÒØÜD¨,÷©F<·\On"­qR ìǵ¹‰I·n¾ |Õž77ѵs/3Ò›Hcñ¶Å¹íj››è»¼Àó]=››è ¨Ž×F=?Á‰È„œéÈ^`¥|ƒ¹;Ov Âûè› øÕð@)~·.¦"§QØ:Oùׂ#&ë<”4”«×“©ˆÊKôkÓÓìE\DÜߎ­¥¬ªøÝðNUüj½±ŠI€…§Q¬Ò¹±Š_é°¨.ëzqõCç§™¾§‹«¨Ìƒ)d>é„E[-oÑ@tÕtœY=E[PDS +-`+"åÈ1´¿ +Ý#¬7˜ótÍXÔ Âü‰“°hçÎ~†,Çu>I‹BP@d;zÚ¤E%2§š.YáÏñ -F‘O‹ÑwÔ¢¤ÃZšàÖ.Ô"×v›«+T²¨E2wl™Êx2%oµÈŸ-Ä5"07j‘†Øölc>X‹´fïþsŒ ]´ESkÑ7tц#T<ÌOè¢wE趨}º™‹ÊÂ,ª`¯{„ôü¹HÅÑI–yšÜ›™‹ÜÔQ}E¢]ýÛsQ³FvÏó—?ˆ ßÐE YºÃX¤Õ'tQ)ânt¤„/oú"ÛÉoIe鿾è‹<¸X4SœTüH'‰©MJËB4¾Óíáí7ÇVëÇ>é‹öˆ% u~ýL_ô|P3ãUØîá;}Ñr*Ÿ5ÊêÚ¾ÓéɹíPÿF_t‡í$3×§Vé,ü¢Ø‡÷’…Yû¡wþ¢u=&"Žëáʲù‹__üEWsWu5=î×ÑŸPN6~?ä/Ò-é1—ìÌÚ‹¿Hƒj(Š-j‹†Ñ·¢Šç­×ïð‹öò~Æz-Ÿ¿¾ð‹û`0Â]¸¬ïF‹Ú¯Ÿé‹Z9wâNŸÄñÀ/"µv‚Â$YÏøO£.š„xçµ9Ã룙Z“€×¤o £»SŠ‹:&·o´EG:®âþû‰a4(v¼^¼Jäi¾ ‹»áGÖâ«õ±xµpmøB,þ6Œòß p£ù ƒÄ;Q1¬Ó)^*0û‹ŸØÂªè‰Mlß´ÄeÚ’8ÂØðÉFœ/vñ| a8Âúl“ ëŽOâÛùöž®ÉM;auõ¤âEdÉb„MOd!Zä ’©Ûâmñ`’©!ívCÿNË+ú“dÈ‹Cd I+/l!…úŒZ!…Þ¡g H!‡”% …ü˃M(UÁ…$¤”ÛiŸ¥®íƒD¨ãÜBÊ´õà[n2@mPÿ=¸ƒÔÁýÆ,š‰™ci³ ƒ™ø“,È*ÙÇ $ŒrñæÂÀÁºöÉÌ9ô9H]9•FÛlx|Ÿ´@^E«rSsŽðù¦f2@9Àóe H@Ô](zî;ðø\ügÖæÊ›÷G|×0æ;çy@ü"·r,«ÊõkGœÚƒåÇ‹EÁrlyÓ¥UíJžÀ¾Ú×/·8}º-ÞŲ÷ê ?¨|èuM#/ÚOr+7ƒýç½Gú•›¸‡@qý©nì c°_ßY6U?Ù‘Þ4=ÞÃ]ø é¡ >Ã)ÜæI•€êiïÒ—ýÁ;3/‰ËÃÊã"ø­Äy/r„BÉ¢\7O^pòµe]ø à5áóç†ßݦe7ó®-SÄêŽ|¡à¾E¸ÛÎS l——]ÚlG Ñì›gí Ó¸…±#…È û ×é +ÊtY¨ñ7Ú¾›UW­<OD/â v“é°ÿÄÈâÒñI)T /]±v=oü«èsäMÃj¥\OÖœÂÊöBÌaÓÊs´Ør\î¯RŽÉ`ß(9HId€o‚\^9üAî¶ß½Áqü}íÇñ'Ûâ0ŽKÂnåæÄå¶–‹——à ‡¹ˆF3a´Ï˜Znæ%<Šö›•ï‹ìÆ û×&½!1jýÉw;×‚áæ»ñwmcÝø‹Îí,aж)neÝ@o«@çÚF²~yµÈj³à¸½m + G}’Ùæ‹†?n;™jN¢o‘qBŠÛ¥Ÿ]zñ׊žO/ìÃY` ßhk52µ²–ÖœºØj#Ê€hµ(eN›¨6¼›ë©1kú•ßùi˜:¢ð¼±i#J«,m„Øø‘záMFëK廀hç2yѾ ãÅA³dê ¦`þ žCÌå;‹™e#ÎÔü´ÄéN¼ïn²÷­8ò4S(œ?8f9V97¿ì\³÷-Ód¬–'­ (ƒõb”±!“$r£É0ø8Ò'šlþ¥l"ê£n™›FÖÙ¡ótÏ(Is߬€wNR¹Â-ög<ˆš¼}R‘¬^\±Ùw;¶ó†$}!Èt‡ Ö©Œ›HñA>*#ƹŸG5Å´øÅ9BFPË o¤.¸‡]À7ÞA {Ûjä¶sõFñ#˜dɶÌ‹¼.èƒaTÎP>1ŒØäEótQ!Α~àdÑÏ… x•3¼å„¢‚‡§þA(Šd÷ Lô¹6üÓ¿ùêóÿý÷‘dšN’uhÊÇt‡Ï\%Ô^ªÈnÈßè6Ü…ÞCsØÌ!IHÍ<äйÔWh`ѾR6d?!õô&f™÷€Ù9b’?KÖ5W\ji„”qªÔ:ÉÎ#D‚$ëÙÕ)S³T± á™ ‡Ér®tޱÅP-…ž©NêìZ›PÒÄìa™aó:þ[•¶xÂ…ˆ­Š°`HJþî™wÒ²ŽÉD-ÄÃÀÑ|\Ëô²Æ=«†„"',uºíRuE’ZAzmퟠdñÏõ+X¤Ý$(jñ~—cœªNƒaj.¨´¡0ÌeØ(":ÏÕ£È'½®Ûþ-i@~õ,¦58ÓQý¤n,!ÜQ äÃËæX‘¼ì…E°ÊC@éhf­Z’í&ÂV·|ñ“Q}j#Å®‡HØÆÄQÔ¢vrNãsíúÁ ne¤§·–æîüN²öbÝ:'œêGµ97 ß¹Õía>·è“C(ä*01i÷èAÑëìáT´?Éjt†Óçlÿ9}¿ìw „±9öÿ|B §Ì×UÌsCò’ ÈÚÅP1aä¯ í€F¦EÐwÂ:¢Ü¯p…xîˆ×Suv5 އÅ768óÌYêŸdÆdÌGðs§Ç_$‡ï «ngpálDñ_B-|¦ö²Y U–:Ž“ÜëI¢ Ñ÷ü92N ºªÎñâ<¼WОæìß½a-ç6ºRÅòêÄ\àlaGü†¯EÔ‡»Ý¸Ñ %ÌøƒÂá   #4™ô áëÜï€Ææëeãbl¶,ikÙçÀ~ÈOFÏ'˜© £·` Ïꃯ|r¤#9z°K¥GÝNPÍ ¿ÂЉ‰nµ¡õgÈÚ„FÃÜ‹´¹Œ5|ŒæÝ–Êún _>¡mk­ˆN h˜¨jí¦Nn^í¹Ð,Rµë h½Î=¯Á·FM&%êÊ»UklÎ+ü§SØÁ„c÷è:4z†ƒ:¯©@Ò878Hú"o{9¨šoaÍçh€bárhìýµéÅÆÝ‘>½}Ý]rnÖÅ„p“± ã&ùšÕ—Ëé 1¼ÕÒXãó|ãQd‚ŒP 9XlO3v¦è?æ¯Tÿ‚’+8µx æCzT&)O…CÁ; ¡=–Óƒûž*t‹Vû£Wºü}}ÞâœÛ1²8oìj0›¯ê=NBnؼI‘Bɸ¸û Ölœ ‚sT$z2ß?ÏÐæü Ò„(“H™¿FÁÓÙPW1xÓ׬qüÇà¯#¡ò‘’‘|z2ƒ3ws8FFµ"ü¨Ä£Înç±FmÅ÷³Û ¤`ö80'§¾€„¯Ã«s“|½"½-øÉÞq!{Ax¥W·T˜é¾ùôãòqÞ>’ñ¼DD*Ãê&uã9»¢¾;zx5^É8Ï‹ÀeG‹Õ¬ô +w½X™ ¼]Æ´Šæy#†6”ë>¼åJŽªÓ¥ gíRn[>¿)È4Ⱦ¨Û=!‘Ù³=Æ(¢åЫKTksvÊšæÙåC  ¹8pÞ˜Þ±Ðïë–÷p†ìv0ÍûEë„Ïû¼O1Øöùg¯Åó/.œØ*³Âìç3{TBï`ŒDâƒ,£Ç¹¡$Œ‹79z¥dÙ}¦Ç‘£MÅE],eëf +M¢ìyz|M‹Ó»—EãýIK65’¹„‹ç Oß™¼ÛG¾¹É‹?é…Oœ”u¬°”Öó¥Æô9Ú–nsƒ&‡_¬Ö¢ÊXï¦,ŽÇ)(ô{üð ÎþdDðqò¦í ³Àçù<ð]ªóʺ»¯p/ÄîùÙè¤^‡ÅÂŽ%Z·ú}:{ß¿DPx2æx¶û#{Lç}qî¹@ƒ&m !cÏý¥¯wGÀúdtiÑŽv”§¦sõ-Š×Ft¾ÿ\=P¡r„m‰`)qc¸óêÆŠ†n‡ì¶´ÙÆ´ÜÖ‰RGˉ&†_ƒ”ñÎ1®ç(wc6à;Ì$2üÁ×åL©3?ÃÚ›[ßÁ˜4Ý- +B’ì‚yBÞþ£„q4G¯›˜¨‚Ö:ŒáÓ‹GÄ0Öædv¸ôeµ²¤wb?* ÿ|üé•Ý^żnYñ1ªhrXò'H›óyì,‘þáîæiv åÝT870h—;Ð`a•å.b!M¢Ÿƒ[,nµÇ¡·k<1¯½³Ò÷ŠMnO°Ž»áF‘ãPNÒ#À8ë‘Û®ìôK¶´ì‚}Bò#wÈv§ 46Ëós_‰í–åiHOõÊæ]Gˆ‹ÜºrÄ.˜š·ùûàB^¾{¬C]ÙCã÷DŸ± Öƒ¸Q¾+%ÂæTWKœÁ(ÎNÔ¾\P·-¥¨Ob)sºB¤³ç\\e½Ù°f€hM‚¦Y(C•òãI_"ª1ã&jn*s^–M õÿ}ýŽª*Yž½wüì…×´W‡:a¯{½{$gÁ9òÐøAG|еM~D¨Ö@êÝ•IWó“óHUcÙ8=’%9,‹ɧXT^D«šøPòÎ7ÝÛ’Êvg ÜÍ`ÍlÀüu2Y KÃYs%Ë®RƒkË@NÊ~ÊO=F°à ëÓØ‘¹‘¬($È#^êó”« +x jÔÙÎ% 5‡·£9Î]ÞÙ8žôÆÃÐEšé$›/cußv è*CüÀT-º­zŸ9TÉ‘;š=¢ØA×îÜõ3Ö)ƒ5ØÀnfÄm?6ý`²q'¶¶Ëù2ôË÷_ÔªÎsèö÷æÌª®Ä'ðŒp Ò‘Üßîfckr¼& •R&XnxK¿`*qIh÷¾ZÇ%­)˜õ¡ð%b¡€AÅŒš€÷eÃì•^VÉtc#Øß[lÊ3­ÆÈt¨Ži„²,ëTÀCK¡3…5³Q}{c®d©vµW»W¸ Ø#6}-v—£™ï§Â™Ùcúó+ÄvN—áÙ£²Q§GÅò—i¡æX¬ÍÅTÛиßCÑYŒÛèUÄDÈ’=k”Èm8ç÷@%¬¯È¿zÉ™L‰’0™š¤m#¨ ªÓíTJÐÕó|HK +WJŒ+–U*fMÞÇe__nìóWkQZä:ÙþB‘>ˆ…Á7úÆ á<|•I.> +Í€ƒ“[#îö–aZ»—;òF^09PÆ Î^½¸†gûƧ¥ Ê Õ= Þù ÍÛ7ÅÛ)TáíÝ拏\ÿ\],f«ÌËsA‡¨…g‡¾É0ô2SÙØþÑ­x?øÃH-¢ÁH:˜Ž­ÄpGØh[[ùòB#Ôb;BÙé½jJk­É³àâj¹Ùú%šä]ÒCÊÈéò– +]²Edna'7 ħçÓUåZ6eÍJ/÷[ÇZR3ÏZÒB!§¹²¦9žú4˜É›*©CLsŒyÿxá³Ç⺓¬×¢|ð‡ÍÍv94r`SÑ\KÆ˜ÔØ›‡¨Æq¡s·£Hm+FƬӶHò£0i®EbrTäÛæ$Œ#¢Ö³ˆ•hIÌ\Ÿõ¶üçmãy$î¯2*R¹v®±v7´ÀñV2:ÃÌÁ[ßlt®©¸1»/Á¢†áÃ@~ÔÅüè"_·M= ìaA*)EY•¾¬î³>鈴›´­Ëm”(ò4ÌJÍû8¶âs…y(/ +Øc-õ ZEIÒ"vi+"0g²¾ÐTq¾">»fTØì·—!C[8·ƒ‡rx·âOî² #åÊ‚ËUs¬…–y;?y@Éæ<Œpd>/ÇÚ˺R›Ëü¼ë£Ñ°4Ù Õ˜5½œÍHÛŒ­@GRb€=møÌ_v9i“ÿó^Ö²)zU!ÝôélÐ}V™oI2á*+{ &Ûù—ì(Ï!\n®„£ÇnÂ$û£Z¬ô°är«´Ú·µo¡9Ó(â4Ö{°í³CÓjFt_«Ï^cåL•NÄ•ˆDxgèmz3|B%9ä¹£8¾Û׸¹",ÐZ¾Ž²‚ý­.æ‰êÓ=:šìzD½Èú€ÏÖZwîp– bšç‰çdd +n¦n˃Öììxá•ÔW=%BºàÙð;ãŠ+ÃXò?°rxëÄÝ2 %ÒurµãÆq‹ç^vÖöÁÚ›Ýò™â^C AwI™òz ªÖ{:Šj¤{ªµ=¢A1Û‡ÏÞJ²j]ã¶2ÚB>´…|¸âýaãphK=аyTŸÑë¢T[é%¨Hü£Û!WÉ-–bÀY‹(Gð§†JGDD1õ … âI*ÆX!ìbl­Ë|μ™9ЂnvB$Ž*lg¤ +wÊFwõ•‡‚>·—%x>çœ _®4s:9“@²ºzÉ``¢%˜)•l…òòÁ¶GÍÑÃvÍ –µœ—€V vîoÓV0!ÎBío|ß&+gœçª¸ÕL…Q¡Ñ~¡Ú2i)ì´Xö ×g*J ³íìD0EJ0E £‹Ë9.犑،‹ÿÆ1y ËÙŒS²ŽÆ3‡ñA[&$F^Ï×CÉoÅÞ5ês‹RcÞ,ßw~rF f&±m΋–s.b™Û¶ÄX ã0Å„¶Ö2¬Ñ9!T‡î_b¢Ìs’bñTŽpý™71®Ï‹êrÕtì >}øÎö›Œ(c$ꨯ,ø‰sËè€I·ä®^_È{߬7³=ˆÔ9þÝc3c"§¥µ””ã›ð¬z}Ré±ZMµ1`’cÀdÉP]Ê +¾l^B˜y¯o{àÙáØ ¥rÄ„ni\ñõ²È¸—×ù4¨"el•XÄØÚb§k²~ž@° ÝS¶²è®¦ùê¦ovSÃcu€ˆ³¯±¹ú˜¹×¸* ƒ‚v–ð²\›7f9u›5›3a ™öZ¢,éÔ|ÿºçîæÈ‘õ}­Eð +´Ö⌳Ï[=—å¨#8ç$tº°Æ²®±syŽ‘)"]]QGp#FÌÑè&™ÊpeNÊnñûm1T>úº+¯M>›ÓØåb$EÔÃàÄ~ìÒÅA<É÷+Öìè€`>܆³7윕Ûßo#x}.K- ícµ(t5à§ÐeoéïV„püÖHtFd9FQy3oüµ<‹qÓ~NðφH_QÕ³I™£mŠŒwðCÊ<fN=qPU\³ÒsYúE:Y²ÝÂôˆùyüsr=OÜbCUx¼ïRö² ddø0:³åV$ÆÊó8-BxYP€têcTXÙ¡ë£0µ¢œuÂP-sæñ’8ÑꜬ™¾ÇÌëP ÷5ß_Q¨äpÆŽãf–Áµ1]oåî&Þ;j{}‚î³ÛÜ`þæ$jÍèã ÓzFö|-Ìé†y³™ˆÀΠs‚ì¾ãGGpI@X£Ú<ÐàZTjÑŸçJ½Äxo#ÏgñRXÈòKb12)êÐÖÏ6ˆPb_'Ñ_ÌD‹1ýæ'‰\È„æasxL¤ýuzXBÎýë©’ÅšÔJäyÜ·²Ÿnš¡Ïnĩ֥Í~2Éä¬5{t«ÿò¤øì! ‰oó&8(™µ-®{:öGµXûBf…³çy›´x²pµP[a0QÇ·xDjôÀûÆß‡çnöhé¶Òð˼ãË …Ë5¢sïÓ‹Çq#Z¸ë²ñ,{åÖG~Ýü™” Ìѵ÷<ë«ýx•TO[…ú67¾ÝõJÏI ½ø‚°ò¹Ša9qàc^Œo'ï¡ V-´æÍóæ÷vt.Wϸoâ"Í+ oâ,áŸ^Ö¢„o; )ªR‘8Y`‚räl:{yW1ÿsW»ôÕ­s‡ËŽBL+ 7Å)†Þ +mÔˆÛÜ/UvÖú‚aÉËÕC2ÊÒfþÜžµõ}ýŽˆ!£dÓî‚n#ºv+ô0m ”ˆ›«ÌIÑÀøHƒº+çЋ/3ŸÔt½>ÁN÷=3U¢Â!DÏNÐsÈÝOÈŽœL•Ä£2F6c} ‚Y”Q”k‡«ÛaÏò\ó…óú3,ÙÍʲ Ø*)Ë=˜ô5˜\Hñz` y­Ó»Pa$Þg}SÑh^ﯢ»s® T®¨¯‚Û÷”‚9 /!X-IC¿¶’%‡"â5V›´¥©§¨t:T’„‡-2çí ‡IcÃn¤îf®¹ù¹0†|‰NrÐEzF£Ê),{|;ƒQ1¢ßìÁÄHJ´èÙ.wôp„ÍG[<Ó‚‘Lá8è‰S +¿iÆÁ*.Quð½ŠCËÇbº÷WJÕÓá#D™Å­léÈ­(ÀùΡ3ŸÙG‰Déœò.#4šºc•*YX!Zc&©³½ˆb¸,¢]B¶ôGlS¨Âp"Õ²ù6ÍšHª!o°»©Ùƒu¸=<FE€Û”1A?ß>A«¡Ù –¢Ý´âD)h]Àµô8BSéòWÕ®œÁ*ðæ'±Â§Gs8!^µ×‡ò(” -Ö:S¢í¦Y©dêÊ“p0Eá8âag«ë#B\¾Ás/ÑHŒ#φßÁ0²—‚ÑÞRêùYíŠñ!¤’nÜç äƒT°‡Èn.À¯ÐŸ™È"±½Ž[ëÍ?9z¡bVbgˆèéZ¢nà¸4 ç‘ãÖ¹ëK[ía¦µ¸¤Þàì†ÆGühˆ¹JQ•„5w÷<u‡D[œ‚ÓJ}Âç(õóRÐmÙ*ÔвºPUפª…²¶—%GgjÈz­A@-y®ÞDZ|%~ VÁqíÏ…KœOWcq¯BÝá¯Qôqú›5*Gæî¹çp¾DíK’·„,°uw·|)ÓeîÒêXÓfÑ…"NÖ6¢Eüñ†þôhl°Šû.;@ðu<·x=õ¸œ®÷øÙ_"¯t„Ž + Dñ‚ªùÝqpõ†6ðDp¢ƒb<ʧæ´ãWþ¾zœ«ÇVù!„D‹Z°1ð¾cOv»…”¹¥ÌZ!«¥ †ŸêØ&|fbdq]µžžcíüž·£BZá> Rç…­NÞÜ\,f²~㊥d%++¥¤ŠñEÑê¯lÔüžçjØmÎä¨J s¸NÏÅBr™þ9MÐC±]tvÅ8¯9=S»ÅS¼…cwy!ÝGèã‘Ãùœ3ÂãùÔÓäô@!íàœe¿f|cÒ™{0q yé/3I«×ä­7û¼2‡%j€ À`v©H®’â•?/—QTbÍÕn*º0g%|cËhøŽÞ̹¤¹fÊ¡c­à¡°‡©a@\.ãžèÊPI”$¾õ(®å ˜Qâ ì[+/`s¾Ø­×%^«êˆNmRscš)zdd0`¦ÜýôaN6×F+1@ߌ·eµsÇì–Â#Ê}O-s²çp„4¯ï0ïU‹5¬ÿ©œt‚}rA|~ç`éæûØ6¦µD2[B·sv=<Çjô5Ë!4{Ä®S! ©vשØÊ2÷Ÿ5>a Ö*$1˜ƒ9·5Ÿáj®ŽßõñѶ“fô;Øýþ„9•1ËõäÀxÂhåj9vdêe9¥·rµæïTZÈJ¨È!ÍÈõ\‡èÚÕ®hÀ€O4 ’ M+îÎD‚Ò{>ê;(^WÑm¼›wV“ÒTæqn`Ø‚:)‹tBòœ®ý¥ªù[/uµ‰¥”ï¿æ£2ßoiš2ë(HH^í@ÙšBš{…84Â(ííÈ5ÒíŠÅ‚æÉ.±.Q×ì0äWPfæb{˜ÖŸ_%Õ#N¶Õ¢(œk}R +ßéùðÌå]|fÎ&ìIîpùédëâcá¬Þ­èpFlœDò“ZDŒ,q¸]¿ˆÖœ±Š·Í[Hz$¢OtnIÙ*¤êÎù×Ù+Ï÷q§%ñ,0+5"ë›4ì9fdÝf£&†tCé@yÚ˜„§±ÊÆšõ4…jÆÕ#7{äKࡌ›µówÓj.ºÕUš¥z‡˜’sa å\®UVFØí 2¿ÒéOÞÉ­Ø!¾RÖªmý8 ‘1?fN§®µ)¸Ë|¥²ö°Än,Fjëù¥ì”o”‘6ƒUŒØ1B}U@hߊ_öᎪÊ¢dÏP6Ù6rªîž ö’€Ê¯dtªÇ6nNCô!QC®DÍû6Ó—‡G/Qúé +A‚[A¬Çâ9!ýæ.*¯rµL‘Â<²"0ž‡%$e}—÷¸LR–}ÉlMŽGD±pHE¢ùü©ö‹èSFµÖû£G¦ŽÍx&Køìr3Žë9Õ윩ÉãB Wu™÷Pœ#,L’â8­÷ å?9}‹²²%ºUðøÏc%´²é*lÕW”UFn÷:7qdj`Qi)¤•j5JšÁ ªn+úÂ-”Ý%\PŠ+J\‘ʈ+`$ÎÛÛ“¤äåZ¶º'PQãb–ü E·¤ZrHmÐyò~vöˆ=A#µÄ8Äš*²žÑ8«ÚM‘Qoa¬N¯Ë‡ûX[HìèÏ8QfB,íº…AǪyÐN9ÎÑQ©2ƒÞW˜Â4›¯RM¨r—)CÂÚJE,h’eU崺ݑìmQEX–RØ¢IQÍ5Þ`~…¼'(RÖú™÷¹MÎié%Sè%++¿©¦2¨êñíŒ=íÀscö(¡ ÿè{ZŒ‡ˆE¾ô‡n¨I¢¢HÇÊ!8Í¥×09A!oÁ 芲ߢܔ |׃žëÕÆf6Dh±¸¦P)…¾Ý’ÈÚ 9„Fñò»Ë•ð* µD…>{O4S/?}l5Ù4UDÃÖõ«d•êŽ|-UVJ_sïßRlOÍYU~f>>jÖïüÔ>ÕóVµ†Í˜jÀy{ù¦‡>’QKxeKÔ+) +ÿlXA‡þ9eOìëýËŠcè¯OQ•öçw|,"·ˆʦúîÖcÙÊ“dwý¾6|s|Fÿö÷l˨ù¼8SHgÿnX·T^bL2žéÇ÷k5ˆôá0[É_”Qœ”¹z(aDyl1àÛÝûÑ­¬D]Vû"ýœʪüR+5ç¹K}g]qŠ Æ«Ì—Â—3Z/3*ššòº4*¸G‰ ZèPórˆˆ[ì(jÃz­:¯k8¾î÷Û+DìZ¬Ëú`¾Ÿó²ÇÉbcöhþŠ^¨Ñãˆ"‘ªµ©Òíq¨ø+J¤‹‰ã(”ßÄ?Z nÒª8…[T‘+Õ# +£.»îˆ2xå©s›šJ†J¾¬] \èÏ‘äúú¨(K«ìçÂw->!¼@ðqŠèÌ<¼]VGG +ˆ.¯¬bBNÙ›Sصp”Ås]fЬltíšÔ³îQßU5&VÒ¡&nA})b¼XŽ{w ¾œãxj«4=eKÔݤ¡øª–ªQңȜ Ïe‰d=|È*‘Í/ò²è×ãe…#’ÝvSÒ˜g"¡JñQÉRBÊ–FóPì<'Eo‰#dUÙmp\9>*å­*ëËázv£.(ºÕ¹Yõ¹ð6ž‚U]s¡èƒH¬¥)q¨y•¹¤0FØ)ô¨FùŸB› ô`)ÔÛñ ÈP"uK5YŠ;ÏÇ0ò“¹6{Õ—-Êúyn­,¥Í ƒåazÊ1sô•1€ï,S"Ç}v8â‚aå•h=hÈâðŸ*/B“×åŒëR¯ð¯²€à“†2ÿœC±›+ë@¬õ­Æ¿B=piCÁ¶q©ꆡњx˜!RËïê’ô…º¦Æûs,ºÅ^¤w¹Ì/¥°ô§sð"ϵ¾æñ²Š‰¤ð묤Œ©ÂˆŠcµösyÜ,@uCKI< Îó5¹~¼?Šóº$æ$j¸=Q'­ ž25o3ò³¥.à9‚>Ê¢¬‘¼b_‹¾õXú–G5Ûb?Êp|Dðáû@×¢ùUV*5àˆn~ÄfÖ0܉üCŠBjùŒõµNž.þÊqƒì-Í%t‹"[×]H¥¼§ØÊÙÀ– êvÄ-ì6nö8ûÛBD1 Œ‰ÃûMïˆ*O+xÜR0Ä-ßš=Zs¬–+wˆ˜“¼®å¶Fõ"OŠF[–mÁB?–ƒAŽ2²j£…;ÜŸ g òéœûq¯y~èv…¡“59b Vúj[r[Z1vM0 0^0f&@¿E­Î™îPŒm«Àh‹óÄÜšž7 «[wØk¤#$c8ð‰¤=E-U’$„oï¹Rû¶b áPz€z×éðV» jjW¸œt­Aêò,RÆ=.6Z³G +Àö*\:¥Ä²Ó—ÑîsÅ Ô¶µðc€-@ný-ê.Ö¿D[l6é`1Ñ ¬õ>þêCÒÿg *‹È÷®áDnBÌîP +‡CäˆÍNëN,ÒšJC÷ÈÍ¢ŒëõshCY Õ|T„T/€Î0¤-ÏÕ›aðÀªÈÄrŠ;iNá­­â¹ \Qd{oÏU¯ NÒú~ÑèÆçª·ÄaܸT²Çò-¹Ë§²:ÉÌUT­KÇXÎÐ1îÈ(±#0>¯uÖˆñ b™¯ëé„H1‡œ²µõ=Š: fP)ûkï/r¬QÑ:•ËéØÝøS$ͬ#˜OÿpBDQtD&é¿pøÓN„áÞ–tìÑ ã8Gƒ"­bÞZ“ÌE>á'‡ŸÎ|ºOuÿ„µ\XÍ[$á\wm?:­ê¶'ÝñGy¸Ò)ýAB‡ôG ü>-qH]ŽÔv3 ²è´WXmà%L¥Ç–õã´³NÜ‚.ôúÏ$Äß=vÚFha¡Ó:!¹ŠjùŠèy²%Ÿ[W +î@^ðuGïãñ=ÕUzâô©¡Ö½~7hb"Vyjlªcë0ç"õp_ɪv®œÖ\ÕsäS° imò¡±/ +³“¹á·ú^m†ÖQ£QÛ\uÊè¤GëÛâ.}ÁŽö”‹±S!çAP,¿Þ>J_¬&WXÆYÎ4ác}’¤Cv6×q¯U ÀTÛÃrn\oL*Ñ#8k yÊK¾äF€€£Vœ¢Tä/—21F·¿< HÍý(+Zþ,Y#]+Yu™™O&‘â?ÝÃñ3Ƕ¹[[å¸1V1—ÏkÕ£Bm•çV8§†Y­þD…­…€$ ëŸá-·× ðÑm¬ÕyagñÚ+ì«’nçRF˜§2FØ}iºˆ’nK­™ +–vÎmËfÊÌ[u{óEr(äpSÒ4ES·îN·P¼C˜købgðéæI]ßÑß>à +¾N_€ò f¢X¸"kE™åMÈ ŽÊ1ͬÐ+[¶ð/æì𺯴ÇëQe‚ UÈ0½—ÍÛÁ‹~‡Í.„ÖÃî_¿N‡íùü™{'ÐlÈ7ofæî¥bXÂO5ösÄ=?ü¨Í>s¯B«“(3¸=Ì ¿U”9¤zÝrä÷ËðÙœš|äÚ*… LÞ–)±¿|ënrs÷6&éÚãž Š2D{á’ª%`Χ0vzXuÒêq„«ëJ~"¯Cœo'Dd´fû¸)­z˜¿p‰ MDHêˆ%ÐB£7hÎøå~Ö„ ögI÷jœúú(Kâ*¦„syލkð±Á>(TóGwU·Ô˜D–õÁé s•:ŸyIVìßÅ,?E3=¼QdEvjD¸ý²H(EJÊ3¢Ææ)ªåÇÁ +ÖXàç‘Þbáâ'iE|Œ·L׃i‰«*yÅem?À2¦piRŸCZo1Æ®EçöÔ Ûº% {Êú5È”]ëTkªš·(‹Õ¯åÈ–þTŠÓ®Õò ¦©¾£sÒ²|BÖä¼®ˆ|kTÁÍy¬b‹ã0o_"œð™Óe¹åZ3ĉ-Åí[£Ô©ªb9ã›X˜EåS:ù¡+EZVÁUüË +ý£Ð. jŽå¯@t¿…œüfo!pmvëmYbY«RñçmQŽš,¸?êœ_n¯6^åŠÏ–NIƒ!Jžõñö Q–z¬KªcÏŽ=±&PÔ-xݧ «B¿z.û'×;H +ó2«ž¤.Ûë“ X[Hõ]˜a¸C!Sy…}Ëi‰>šE(QCt0ë·ÈühÏ€ª".8¦ÃCøýá( àx‹{85³aŸøˆŸ®]æánoü‹‡°ëûužÏžVP››;A/j ª vrj`óIþÙWt(‚ázZi¹¦mM\…¾§éZO\˜¢:ío–Ú8:§8 +ºiqÞÃÈÙ£ +ÿé£òî#¥®RìéŽ7ã/I¬ë0õÓ×ÌÂ(ÿ¯ç2ÎiUY~”¨ _ ,jFZò®GÍ| ÚíÑ—Óú<UBÏ…ŸP|«–ÕêaT š;áþêÊ‹/ŽÛ£1/Æ´ª³Œ¾Š‘´9°û¥A'$½ì ´UÌËV±„ËoœÂ`#n²¹™q­]64˜•In‘ccO‘{3Ši«E^å+°þÁž¤N”×ÝY#®¦F)îOq-ªqäÇGÐá{‘ƒ˜Ê™o롃´}j¡z^ñÔ…­Ø +x]+o®=tu40hQ1`G?1WŒýØcf »±ù¬…Œ¼Féö’}/~jxÙ1Fõæ“&Øæ†.<ë2ìLÅa3¡ó k¿P‚Ïû)å¾zèl>W{K7»•P‘P»ÊÊoPºÐCOUã+ ô‘rÈs/3Öª7¾B$Àü´×:.  +ŠTn+p©¹Ü†ÿ}øŒ1Éõ~{ï’úBmv}\Ü|בœœsží®¤Ý„LÜÝ$%×M!tš÷KCyN´(ɾ¾€äñ• Ç˜[µ‡:k~¡ù4Çô› ¿©ð‰*räó#¸É&ðHøJóE­ÆŸr»•"Ç9˜wwÃcRtÓô 7­d­9:Ñ>Mbn˜‰©4ì8^I_ 'i!5À“" )Äd^¯õ~uO<>gV—j +›d{”N×Ë–…ýÃy©ñóGsBv"N»X(Àu4¹rcUì&±Ê&èûÝm +5$[mð[Î{=€…V=iõ éd6«¢ñäí*=ˆJé6óSø¥~й`j†&­¿›l÷Ô7êFzí8—¿¬Dù‹3®±ÿ“@¸œ;@ã&`ð>nñn;BÄSî|7‚ÈíâªÀî²]0j¿ o°X¹jq€–äKü¾Gl…»Ì2?ùûw€EéÝ_ªðqªÃ:[å‡#{ÚÁ€|Òpa¬;«¤ú@ªª/4ÁãeŽ&,‹¯é+±ÅUl±Mq@ã†Òj›7ð1·`‹Á1jäf1„ÓŽ`Lœ³R‹ôPœ|Sûçe½J+€ŸB‡Ÿ’Â/=È÷’T=æ³BØß" ­I¬Ø»Š/h½·{WÑ7)áç½>r”€êm3+K~LmäxC¤hÇ)✌àœ4¿­7!þÚÄa5âûFæPùËaD‰ª€kšÓSéâÜðPu›]æÐ ¡s”9J\Ì,Ïf”Õ-FÝŒ 0tú€ ÃëS±ôé!uYmW‰õQç¼^~AÙ8…›î%Εþœ‹o¸à85 Ÿb{&õPÑŠ‰¾ø/]𽤚Ã7‹ª–1 '&Ä9_ʈ/èsóËàúýoŒidÚ‘Á—ŸÓÝGß;¹š–ÂÉ ‹-ì…¥-N±,T TFUSzXï{Äd5ŸÆËIΚ*Í" ñ?×1Bnž}×ø¤~Rd–‘WjgÞ}×ën¼½VDðZ¯8ah`r »í+Æ÷WÙè{ª2¿¨}-é°«jH} ãz™ m!’ÛÀ'k„„%„fi#“Õò'èÁ‰ŒÏ^¯¯êog‚ +H (ío˜—:TÀªÿ\'Yàyœ+(¬E˜s¿¼Îõ^Ît= .·ˆ¨â\6‡ìÛ0¿DET’âùòdE++J×¢Gò©9 ¹´¿Ø¿pYЮ¬'gsº¼ Iˆfèã[ñv¸¹"S”‰o¬Ã+21H³t”{7hÁ+é×R»ªÞlY¸r Q¢Ÿ¼ï”¾ûåø_Ó:(|qµ ÉQŸ¬Ø‹;9ÇQm¦Šxœ>ùcTÕåLûºÍ,jàÛÝ#™-Yô‘mâü¬—½o± +i>¤ñÊA’E<ç!rÓä}éúsímÖŸiš,ɵq ú—‘šSžÐL18åè +nÌÆéÖ:Fc}É«nni—‘ÁŽH .˜¦i6“š®±E4éXAK{¾=)&!?£+Ð)™ +rÔ!êâ×Ú…u$ ÞŒ®w¯„ e¿(sû;v»”õRy%{ÇbÂØ°Þ$?` ^²62›Xc"M'q›  ËÛY†ê,Ãã[F¯É>–jâÞ ÔùÀÑ+x¦‡Þròàw0 ¼®çD>¯“ºXÔ-(ƒ9(ƒŽ(¨“ùm9r%F4£`·ÙkÈØ$ËØ(yFbDχ”Ç´ð”p,!©ø)/kŒë?²JžÒÔ1O[„[<:§¢‰¯¹z{(ß„u³óñ· `¹FD¡ +{Fði_ï´Ý—ÝRpº‘")Êÿ5KºÂ²— 7GŸMÕ<¹$ÕeõÉ ZP™›ýåš4— ë¨É)†\ÊQÓ/].!äe'Šñžú)iB$d,›z8HgŽÁ³ÃòãªNBrbR[ïQà)õ¨€vfÁD-Ò‚¶kµš¡„A†HÖï{<øÏ$Ö>.¶‘0(èµØÄiÖÁ“>é‘§\5cÃpR‚ºu‹1®÷xBZå°¨­ª…s¦@m0½ùÇϬJ?–2Á ã˜ìö­9bb(‰$ §_ºÑ̲Â\³Â=¯ÈM&#A?,ˆwZhøÁ¢ƒf¯¢cHïx:—çšG®Q&ž Óš´ -º½š¤w¼>WkˆN ’WýúŸjë–ÛY–º@ƒ+&…Óyüž>Ö\7מ…b +ëhðã•,£°:7>(ê¡éoè…Ëy´¶TëlÑCê®Ô1Gr7 +9K$öãOC®R‘¼$6þþœÝã°4{Ÿ¯#Ìur5jm­Z‘P ³tԈȽ iuÛç– &.‡Fd´Enëñ<€íÎ:š`¨tw'½Ä¸½^¶d4 x»„wC€¥‹©ž}ÍG34’$Oa#±ÙÓ˾qiûâÈøDQqkYÕåC…Ö +ýøóº5ˆA‰þêߤˆd°ž\ÝÒì6é1• `ËŠ2ýÀz:ù¹ uEjlÁs1E¿°^7BPæ†ØËûå홦“¹Gº.±âÈKäwÛ²f½âIäoJzxëðÄâ»Ûôd²ó¶ˆ+ +†CŒÇL¡Õré…¼N ‡«(hLÔX­=麮kï /¤ov”Bà5(€­…Ú·":àºCˆ±LA¦MAä=•Bá%‚Ðé…«ÛÑ’“äèåÔà +;š”KÁ:qæ½ÊÍ&m^Æz½¿ +…×á¬Ss´Ô¢vWCs•­HºŒƒ†+·þRN=XvuSsîCõ“2¡*WTjõ„€N/û¯d+ZD§ +! uÁÛzÍ";Ðcîí¨\¿‹ ¼(¾Y?ÚœŸŒÉn²h¸6°âÊÇ €êqn‚è¬ wóû¦\°…yhr-æh€É"à!- ÚzÚ÷½L¡`º§èf[ŽÉC¶<3 aâgÏÅ’¹_í£±†ƒ‹ƒˆºˆÄº ¨×§- ×YNÕé±uõ hãÕ ž!€B¤ˆ}Žû~~jL±ê£„ô®èr@΋ ߯A’ïïÈØ¹©›¦](Œv)i"ª¤9t>ÊÕ½ýz’)š½bcÓA}FÆRŸ¡iËyµàöÞ2øT•Uë‹¡ž|÷ƒtmhhmTš…ê%^ÃÞSpÁ…$é–Is­„Ã:.QÃ&#ZÛÀE¢8*ý_ãC»¶Ö\Dz‰çYíÕ¨n¼Apq1FÇ/²÷(#(Ÿ2$X–øî•võxÆ• E«B+ÙB—2{1OhHz×H9ÓÎ&§˜\ªÉ­Dy½ËïêP>³jÑ%7n”¶Ñ­Õl3v¤S(¦A(#Ôª0©ƒÇ¤ýwõôE|`_ Ù§uÄŸ¾ öV€ R PíËC¡º[Úb_ +›‚9)™+$f-²'åXD^¶¢©F7!„«*–Aµ,òA”y­l\ÄÄ©8“D‘‰¡¥êd² °¼y½¿²W§ø‹lŽ=ûJU¶%ñGËÅÈ8¡îÍc-æ±¶8[]HLjÿ”)9‘’ÍÊQ!ßP!|>:¤egüb 3!”’[>üby,Ð{ýuîF· —Ñ1Þ™vFbËÑòÝ;zle`©»Èq7óÚvèùä“ÝÀ¬Íi{C9A¤ t-²<­Q«èr66ÕZ»zô;¬Àtõ™là‹¿:>ú…c H§³ˆÝáÏ>T[‹ßek Y‰¯–/ÇKMvB¨tIãÿvžI=ö” ú’,¯~ö$T‘ãÕL­žXéBX¾§/ÊLo5.³:¡uih ˆ@ç>ï¬V*Q%’ÛUÁu\5XÐ[ò2³&Ë0ƒ Q¥ǤI ›¦J æ̬H£Y^ ÍbÃ6k‚³ŸhL¥BwóË;‹ ìÿ†3æ°sLÍ à:? Y…5_ÇÇ®†³-X[u§EdÎÃl‹nŸá>¶áéšJÂgAµàÎîa¨ƒKÁ$Y¼yö7îLóÝ’¢ÜQÂ\3ë-ù‰aÿ“t© +VÂ5q<†5©&¤/Ü|)ë-¹<ùÙ¤à‚Ž€tmDͶ0«öÝÓªÖ¥^RâRz\Êï€Àdg½ ÜŒ²YW!^_1ÜÑ+ûy˜'G¼‹QkW.Ýc4:˜êËóS5ù¦Û½m€Ðµca g‰±.ÐØ— ’ÐjCq5K³©ë8+r=ˆY–êPvo×Y­Qïùä65Dú8*e*3æ)+hY'Ýåff¿]jBÇ.¦¬éC,b +bæ%ŠYO75¤Ðú]ÏF¢ÄzSäu åêÑ#uõßF Àfu+©Û%æsñùÎÒĤþ¦pÍ‘$W#ìZЫEKA!Ë×2ë#vKÚŽpgPÆèþ$m*nÚ-/kÏæ2bÈ2:Sðs1G“o—'?‰‡¡¨†fq$Š1©dw‡j.ñ##a˱+¶·È|¢NØ^«LpzoXM ú;ŠB<Ìû#ÂÍQ¡)ÅË,Ö¡°o£~× KxßäÄÄ„*:«{0wÒ£„’…ùˆ“Ÿ …n‹Í5Û žËžDñ5¿?üS’q¡¼ +ú×Pĺ¸fî!­ ¹fÝ=zˆ0—…°Œt@²ÚUÿ?¥Ì?Þ¾¹Ü(·”¹‚ +ð…öPóP}õâäid|ßeÞÜl¨§~Í€Ú] ¯Út¦ká™Á@v¥‘ð@m‰"SnJû +µ‡ Õ”ÙG†m¶)M”±Kƒ¶\I=`”†oJ-öMÙ{²ð~PÈOu‹¹é(h3éX ÇÙ— HkC¯isõh6f¹Â?§»ü¤k ´z`èéå)8B|1tG¥çÚ‘>N‘œÑÞvEö5yAâz—k¸V3xh*ß L{Á6{Áj©DôSžaÈ _ú ä[¿pIûu©Y}²óÚ´3mz© +ùmÖîõBÈ­<‡°i_³Œ€ý¨:PÁXH—m"â­ÞÓ°GorˆöCBr}8¥r ÑODFljÛÛªvÚtËÖGäÄPÈXƒªCˆ N<Ýáò_jeY bJ‡´I­›í0}KñæÇ=Í£jôʆê“m]’Ý®~¾ôBŽVÊC.æ±SrFnŒ¾oD!BLC§Ê®D{wœ¾š\l‹l@êÛ…z¿¯+Ùnâ9£vdÛd±uvóW°!  %²Ær¢7?û–œúØÕ=TQišPÆzÓ€;I1•ÇrHìÏÊK<œµW_½AåÕÄt»dŒÞk|ÍÉDÒ< …7ËÊ8]Kb­5âyzÐ:åÙ ŒÎ°3 fQUåøûnH’ÑïD”Ö…ŠSi@ëA]áqß`5Ñmº€iäç_d% +X©Ñ¨®·Ê:”¥®É“ªAθÌCŠÂŠpñg÷ð“Ï®[0ÃÞ©±•v„u(ùåNa1Œ½Iä˜_èšWï+"i-+K–68"Vw 7øqž\1¨Pl¾è!%ì„Td~~A;'¢¾$¼QXÝ Æ)S?((ÊŸpWþ8zˆü ÚäÓ¥HÉ~èq~å±éfDý¥±¨5T.)šIDÚÉÆÀèLæ³Zo(.ýû±›žÞøø{Ô"%‘G–„}&äNàB”åÜõ¡ ±b͘¼ïD®ìTE±ÆáI‡—ì:iá`Éä`É$ë ©BÆ-‰ò®G$l¦‘Ÿ(`ç^>HPKü£†veÙæ}l¿LbG%µbËûnz> +ß5?YÃÑ£fåM«Ë*@ZÊf1Õ’åd©¹s±:•ÑÈýÍÝÐ$L{’zˆ¿V‚æ´z¨pÛ”QµÊ¶\é¡Äçé3^šyÜÆèFRèŠ0‘b¢©aJ)‚[þ‘¼,¨õ@™Zôã¼QRV¢ä}ø©aë׳%qS麚ÚD®¤LoE“éïZ­Z5ÖA£Gqú¹6WòuÚ¦0'ˆY”Ù)‘‹FNV,E‡¬[%lÜ: É€1©±þ“aQ‰þ”îefÛ´O_¨0©®ù§ù“hñ ÅË[ÿVpxç '¦oKæ+1¸¾qܤV./(v îe\ÐÚHYˆ·1ä§üHﯶö“Yï j¢ÏD!6Ìëž^öÚX¯·<œ SBk®Û4K€)W(еG¼1i!v:Qö#òb•Ø¿Z÷ØF:EUª‡æ5õ_3a!ì}l<Õ…Å¡&Å1ËØQ@m¥ÕCÜæŠjãô¢`æešvô¦’“ft“ëêÂ&Òb÷OUM1WŠËÌ> üÐ:`âäÖS”óxµÙ) ñÎ(EÐÌi òšø¥UhïHË`!rvÙp#ó²p–bB] Ÿ‹§ªŸ¥˜! –ÝÀŸQ տܰ›XkÝ–·ÌJÉßQ~âõ•šôr¦Ð^h¼íG„®´ {hO&£ŒåÔqáú\ýzºˆÊvÛ]z¤ÒüoÁ ( ‚p%}On]qµW7»÷` Ú`§QìrBÜç¿`áºfy~éC±'°ôMîðü‚vckqÔoéfÑZø ~,…¬F÷ Úȵ©Ñ??ÑÏVõVe¹MŠuæ(Ÿr”Fæ¦Ëî’-ÙÕm¥DÊúgRúý +ü¡G<–¤¢·ì·D|¹„%ñ¢$ózuš;5¬$Êú²%6š#ˆ[¯à½Å»±«¡öÒdòÉ@ͪ”4>ú"äH’<ºÂŽBœ¢ùR;·wƒxT”›^J·È(ÜÁÁ—5¡uè@ï‡YŒ}7Ñ ÒðË+¼QA°îQ+]ÝF€F¿ŒSà¯ÄXˆdÄ ¯ì~ÃãM8Á{6•ÆŒpYŽ #ÆVŠúã©/ÆìñöŽx{™t)Â1ìväc/p·ÓžCÇàëqŒƒÉ*R’”ÏŽ{EZ³uÃæ^Jû⥭9¦^®ƧJ%é2«¼KkŒ½Nzèçò nT;ù©mÀnÚ»¢/V›yjh$Èr–]°Ta´ÑW‚.2ûå·«T8ùœ /I¦WEÞ¡¤å… ¹òA{Ù°”¬|®,Ïï°<ïèÅç]P-ÏOåx‹}ªˆºOk áï¥0(<™=e ÞXˆJ+%=Ð j͈¹µß9’¬¶ õèÆÙÄÛž²ÐËø·ßlP˜’5úµ7ƒVvU²¶õèĦPÊE„´ØÕ 祤Fµ ӧ왦ÚTU!!«ÂN^|·aJ8/Â}Ó)@èi­°„:Þ³:6.Q\2‹BC…ü!±dö9 ‘Jd&J¤Êk:Á‚ðQ$YÒ'od»F­ÝO’ §ª•h-)¥[öZfI삱(m(´Ï®•üÜ@ÏÍä.ȉ² 7y23Žß%UqËoï³_ÿÑó–Ðûcö“ƒ¥·?ÿË~ø—·?ý‹ŸÿÍ/~üñ»ßýæÛŸÿë·ý‹_ÿæÛ¯øí|ûÃ?}ûW¿úõÿùw?üÛocÐÏÿäo¿ûíw¿øñ»_}»~äý¯ßoúgoÿð÷üçÖü·×|!˜Þ$X>UÞ&q1ßXÏH&gNH_"€h‰Lð«”b`>B€Ò3FÐÿ>`úRP²™Ö'r•¥¿¹jq™Pº$¹] […““ügŠG±öQ¢¾:¦±÷·)Û¹eœ´ËÉp/ÞÖ׿>MÇ# AHÂJw‰~­ÇDá!ÑrüžVTÇb5dP4 ©ÁëC còî½…¾S’ÇLi™ßÙxÉFê`+È#ò,ýŠ- ÜÑ›UÇ{ ëûé:4 ƃ ÉÐB'™Ó>ä.v‰E%„]ˆï{·Wí$î{ëãWö¹36FÒ‚Á(dÍEÔˆ¥š}#"’…êþÖP¬Øa¯‡i=:ݵõg]zl·Å}DLqÍUKK=/Ø¢ªò±C›¶1^·?¼Ïï%ä,rätÞT4-!G’báZÜÖi›®‚®=÷xÉÔ䣲Êì@©3V䘢fYEçMd·BYþQ%ÙL2áû³·8žË×§€)=Õ¡þ +'!ð’ÝoŠ«íÌøGróM|91Q¯`þ¯$o$2$8:j•Aì &&¹Î¬•Qÿ²œ@Ý&Wjcc¸ àCäÉX2fžÖ%´Äd%;=t*úž8üm‰q&‡]DB\taP–T®È޾ߺ掉éŒñ’Ç;<‘Fjh‡HȈØzí¤W®èªo<¤Ï›~A¨‚I mŠ=J8±d‡ª•ºÕº–¡}—ù6á&]E|ÙlѯᚺŽ{´Bëf§MådyŒ}Í(R×Oþ³šõ<Ço#f°®äpWèÊBPÜçÊŸ1!ø4¤:H}oE5˜’@žAÆU–óoj +endstream endobj 64 0 obj <>stream +_‚¶NÞãºÕ#Íâ +Õ™Ž;Õý6`ÞÁ¤—±ã ÿ÷uŒv_áeCd)©ç·ÙÐÁ6Ï["‡Ðn(É8åT5—H)kÍ%ÀÇ|v$µÄ`â(›8YÓ¬÷“¤X™fUaE{Ûc^œÔï¶x³È­Åñ¶rªÉz(üø]<|¸Œ!›–8€.TÐu0÷y¸µC”ª]ºZ¸t­Šo¡èU‚ªR›]çZôHïN¢Ž‘ñAØš87~R¡œ£Z.§'´Á‹ŠúÐr‚Ç'ââ5Š0pP0Ÿ§‹5¤ô×ïÏG—Žn]uOêRÞv™ŽK^ãÖ8—@ˆMRVWHYM÷ì`§~û—l°z¼¿­myf +@iDÌ“òîuƒDx#ñ'ûHÉO²¡¸°ŒwYzçK¨ø˜¥ +~9Ó +Ù)ÌRå;"©ã\-Þ{X°Ç¦:ˆX—º¡C^,¼>4oâ(ÈkLÕtO[*¨øw™ÒÚM¥SÚeo¹f®ãI·áƒ‚lpÐÕjfÍñ:Z‡œ< 4åôñ4üÕj6屨•€õ ná%„ñÑ¡ÁÙv­±{j X ù¶fÓ꤂\ËÎD(󨌸´ª³àžØßÔ{ 9Áb9Á¶¾e:µà%O"œŠßîÒPŽ  +®”Ëh¡Gi{›^Úq…]G%ª§£Y6…þÌ‚Yïå§nŠu·u(äVÃ:t¸ä á1½ý m”s» ”º¹ t †·ë=Þ&Ù¥°a!‚ fY=ø$⥗¶",†ÀYI¸o Á* u̘€yÊÆdn˜ 0ý51ÁN\ÿ½ŠH—6` +Œy7 ”¨r8rÜR‰W¯ª†ÍÒ³ëòNäÀh¡x"kAúŸ +¨9!õ‚RÍZGI,chØã•ÖÚÀIñäÀˆâ®¢Ú¿I¾úµ±=w8w)!7‘X|=šnCwtŽŒêí¢/]7ã ™ åh–k†miÞõ*¬C-)Ú¶Ë{=q[˜þro(-ôË\.Ã18Ùx:"”N®ªFÇ[í4?ß >øˆPõ"PWÊVäI” úZ2WÃ÷qô +„˨Α‡Á T +ò°hðú@×S!.ïÂ¥‡ÿh•²i“²M†É誋‘°à9ô¥yg°(@óªµØ2ÚWÈIÏg{PeÒ“‡éÆRÚ$œ'Òº¦Øzàßã­»ÚÇ~üP¼øFÞ•.ïm,ô>H¹ë@cj)\™žÓÊzùuŒWJ ˆìä!Ûµ9óVÉø¡lüP_¯àÝœíõ ~0E¥­uÕr|Š¥•±®£è¢Zú´Ý)Fvy´{ÃáÖQEµ|ºS¯üÙ-àRÓ>ÊzÚ "²4Æ0­dG„p•DÒ«›…PÔ»š.góThÂîúús`†1)ýþ켫Mb ¯„ÐÚc4Uá“AÝ f+p4jí‚Ä× +™CƱ‡¥“ºß®e¸ª²O£Ô~Ùê q$EÈÙ‘誖ÇEJ‘¡-°Î…Š3½IG뀊¯*w}^+kp!c–£¥¨Ù–‰"úrøÛI”2tG@ž®å¡¡§™Cy‡ c3ªä,"1!ΠBŒ¬ë¯RÈ«ºìOl½¸¬:Ž2-µ¢Ê#¹(‡Êì@¹;žž0«ù£¢éJe ŠÍ”%Ö-Ħ¹EE#‚©õ¹ÿŽÏ M­%,äëZ1¹)ªmŠYà/Üšv¯lŽe+Q/ØäHq× B‘=€€hIÆTw,oE1krÆY? èa?ãi¡  +\(€*kJ*e#´”dn’ÊOoåÚóùx*‘kc5)¢º9ï>$­ ͇í.x æ¸¯+e¿> eÐ<ÞQA‘¦ÂÚÇ0ÝÊäñ,-LK¥9h5…º‹2hªSa9iÍOª+ñù3Yh6ÁUû€&mï7ŠGBÕö;€ Cæo¥ÄSÂux‹¤âb”ÃSfC,ÜBeIŒÞ!*!•‹°³žIº?p¬B³|Ì"ûR`%MÍäg—dÔº_¢!6”…Zåå ”×˾<Ô½wÕEbC6³eL±Ÿ3NöèP寓оTÃñTqCîY)È­—áO¦'w¸-@!^+'BSš•Š³Ê–—‘˜Â®)l7ñ$õk¦evïxS‹#ë#ölžÔ±€‹F~ÖŒwhá—vRñsÒã¤QK`b0Ý y4Ø~‹Ð‚«ÏÎx!SÎÃtmq's•o+ÏHñ{ j;Ûm^Ñ‹r¬ GW +aØdÎTuTÛ7\+Öõ"а ¶ÉÓZˆ°‡gmR.°% wHÁ›eI>äTK4Ý–5&×$f^B5¶Ëi1çç(tMbk?R²óßÒéÐò:Œ5á/”Já3ëbn€™¾Ÿñô±A&q ¹‡8Û{Sñ©ü ×mâÆä ~ë3“@,ÊÜ­;yØ Ç!VÅrÇÜ®'"´eŠâL{É–ô¨»ÃéÕ:”¯0gB®³Ý"²aJšm¬ÿÂH'ZÝÎ÷ö&÷FoìÃQÁþ%µ0¬X½Þ‹ç@Þäð6J¼lÏÑjé¨õ @J6­]Õ´ tÀîxûÉÁ“M`‰‘Ú¹Š9ûC¬ÈA”´y9ìoxk’åy\GÊ$–³yÊÛËÞDzÜÐÒ(Sæõn^f:I) ªy*F*ô¬YªxƵ”À|wUf¶ˆåXìtõiÏ='ßJ1c³ÚEáÜlž‚ôW¼.eÂù”8uT:kæ3¤-T25rï1«K a“ý÷ÊÜI'^ÞŸX<ÇŸ’¥/0÷Ž•Ïâú'÷ Òµ +,×'–Ü®i‡„Ó Ó@²SŽãç³m5Kæ¦#¢fQæŒ\Hë_¯Jå†-mèX ­ñI ÙcG"S®¨v@ +ñ.ëC~*=°M¤ÈUì)åP²+W-øžE× ¦”5–¬bÎq¦¯I§ˆ·&$Ý”J‘èE‰[Z†n©˜[¼ÖÃð;É5ù¿«…"”‡é¤JÛÄ. µ;`%´&©ÂÜ4¤"“Öˆa„LÀ$X¬ÁÛkz\ñ"hý¾‡ÎÞù…›J,×ÅD2z’(Ä +&ù§ìd­7׸]VÕ°Cà”Å^w•gjÂð0ârD‚ܒ鯫ú*ÆR8—æ+XÂÀGóð»¶Vô³$WP¢ØÒÁÒ& }ÔsPª‘È^ +º\¨i.À‡“ç,èQ ‘]ð9K˜øJCéÖjbÕ»bÕ»Þhø +t±ÿ¸í·ñ*”à¥;…^µâR[Vù…‚Q fôl¯Í5C¦š ”bvz€•9»÷Fw'ºMw«’æ„o+Ÿ[¾hÒàâãå˜×> ¶UšÁSâÐ/(‚]­ ¥YZŠTR×.÷²øù7Kû0$Ð[)>}-ªzB’O=î¡gæþ |ËV€Ì t*IH¥vÞö5žQÑÜ:·G«ŠB% ^qO²Þð›|žŒr›‰Š”v¡äÞí.x +yròîÖH½¬Àt½5êÝ=¼L©å¨ºŽ$Ž›55®-ìæ¸P€›Ý¢|ÝrkÅ(¾Â$2Dãš…ÕÑ$• áp³d-RWŒ²=N +HÊåBŠ n±éN]ÿì +$!¶aTS"Å.›ÂÙDòºØlãQŠßJvâ -ÀúcjFgAÕ+fWEí’iMÓ‚Z¨5²ù$/¬cSÞÃÕ5Xl&e>!·‚:dâÎhuõ¡ªyeÛ¿£-ꦭ ‰¹’²pyž0°S˜EÜb4uÎü*übÇBj–ͦ@_ïRéÜYj5Jò˜uZ4*yyä…”`kìî°àfKˆz}¯%ŒdQC8uNëÅÆúA­“] +õÏ •B–@lu 6#sU-¨ŠBóŽÍ¦½j*¶]w„ß16bŠÎYÁÆäßÃ’ÄaPù "3Í´ÙÁÓID,ò7* çusx1H›rÈÃ;"I2Ãz{\˜gÑÐ'ØË:‘( ʼnRî0Ê‹r¯K™.‰K®)±Œ„ÍÁ÷È« %!ªÈW6U +ñk„UŸ«R80œÛÞKb['Òƒ’Ù@wó6UCNËbTÀ@Xd"B^ÒC½_~¡jRÂnÂÄ:;^s=â5¯Ÿ”à;é ƒÈs‘…ø&h8ðæbxrôÈÑã&DAÔF(Œ:ñ »È1±_øÀ‹,!L¹îº|ÚØ£™‹ÖÚVì'åIª…kuô6ä€[ÛB‹ÑspB€Kå`SIqr®/S¹Õ$å +g“³’^ýEyB\^ Œ0Û(\ï*H9$6¨9ü“]8¹¼n4Þ®ÕCÊBC>Òk ‚…óS¢íaè‹»¡vÏ©/X8Rqfœ³\é +>ôÍ=¨¯Ðc›Ñà‘5³¤W) +¸òßö®$óÕ¬Œ™±I)ì°i‹·´„‹ +GÝjoÍùu®Kݵ+DäPˆ¨†5µ š÷ +›*R NNt/’(˜œ¼)¢Ü^m:éÙdÞ¤3à\ÔyíØ¶z·Ky@½ô>¯^¶¼•Ò„ÇqºŠH6¶?0˜ÁÜ&ß5&Z±Ëù樔º£I•®£Þᜠ+äò“ó%¬Ý€ØÄô`i¢Gkþ)4ÉlÑ™ DdR¼ ZX…íDìJÌ8ÔrÀyµ½[Å¥$5åGÅGT“շ宇"Y;Äåf]>}–_Ã¥n9’/ÉÑ*îV w È9’ ¼JÑ#ßþ)‘bW"§ç§äºB·ëÞÊã%”ǧ­L5Cs2É’àwr)Õ‰,´Ò†y¶»ž2Ž °V¬¸Ukã84{æâŽÎ½“¯«¡Ž« ÚšdÄ^…씵U]Ÿ@¡cˆõÝŸ‰‡ÈÚR*MÖEƒ2u‡3ÂOWŸÅºRòøÒ~|€¦jÿy}IÀâ$!cXZ÷¹¦aÙöÕ­ÜÑKÑh¹Nã$ך d %ãžÛÆ=BìÔpC¡G5PÓ\¾”~~H6- ¡¤Â¡d•°Ñä倲¤|쇌})–¨äº2"ôx¬—% •, å§xOJö¶V*µÊacEvä Õ-(ÇW ä§#]§xÌxÌ~ddg¥Y܇½šQû¹,$*±§nÉ#Qh2í#³W*\|`Hš÷òÑŽ,Þéj=õ.é÷K Œà¬»¶•³jhŸQˆ¡_!†>fTÅšª_€ã­a΋MPÎ%Ý.ã¡…&ácNécÉMho‘J«RM.ã±æZî˸ïäkå6Ÿç¢=„ôC\8ÒPhfw±†ÊÞ?ðé¶õø‚aS(Ù,2ÁêLŽî´¾VeµEα*ˆŽÔ-…™Ä’ÔU ðFĺazo‘Ì*s@]‚ðñ¤>";Â¥ÜKÑn©X} w;]·p1íV1³±’pçàòPùHŽ ¼êÜ^9S3¸ +•®`Aî*¹\ì®åBb˜ï%g¨ª$Ž.TB-Î]­Ü>¯Ç,¹¨Žv»Ì r8|âø’R¦ nþ%9õ ….ÊÌS¾ä4‰ê.á$ÖVâšQ.)*Šd,ÍÓ¼¢*C¤Énz€ “_(:­oÄ}ÒîJw¨GÊÙ1W‹!¿/S3O*Ê#YDQÍÖ?ç3$²VíãµC]O¥ zÙX§^J°ðG2Š¥É¿`S,Ðé%–å@û2G7ñØ•iI¨{›ÁÛ§Êó_=À¥G-ùdÂó—¬]z.³$Î9gÉØ„SuUöX@˜§È{5„Ñ_7ìí5,©‰Á«r–"Êl®Ðm¤`/J†!w š„'5û ´w¬UFÀïèŒÞ÷'G±0̓nH¡¯[Çr„+@XPʇèl5Ž^Qivä –z¤ðH=ßÒŒ27ã€ùÙA›É ¨íñŠÊ+¢ŠJ3u…#Eæºýû?ërNþ¡n·ä²ZdúJƒßåLÙɼáI4)ŠÓ þÊÛè +|À~J`óþxt² 7ËŠ£ ^-Ûs ?™²pÝš‡ÏÑËTK±?‹˜ÚhIÓöƺ•8«Îòþ€o PÓ‡?c›?Œ7‹Èc,p^öÀZÒ¶Uày]âh_m¯à«±ê0Òó —,Í‘E@øVîTfHdÞ*yõ.>•Ô•ÈÑ­_ã€^‚vrüfçRžáT‚ Ó†E±B'!0~»m¿ƒ|ªn&¯LÙ²4/^¼¸¾éèôƒô׈|Ã"KöI‡¼¬‚þá­EiEšÁœAI°º4ïŽT't $ß$»>®¨GŽ+TLœw¨Uɾ” ’ïÂü  +¸ÖUHc|c!{réo žŒñ® 3OY¾ñ+ü™a¶¨ö®ˆs@[6~HF¸p]6>«x‰gµ-HœTzÕ¡L Eq…åke†´84évW ïô¾ôš—²KÊØ´•·.l±ƒ{YÅ¡DJ¹®ƒoKF1Ég°‹öºÏ*G1³…ýÑ:ªd,ãIÿž¨Ikg‚C=8à2x Ÿ7ó®¬]óÑf»¨Ûc5^YßUw4Æ7ôz(€]™Œµp$ _ø±ªþVÛdu)uŒ/스TxÁ'õMc)Dxkaöy¯;Ü# lENeÁÁ,qYª÷¸­K$:Û`]RqRÆÙX k…â±k¢æ€ÖB`·@øhèê@Ûö’!æcÆœõcmæáú¿IƸú×õU’pkk:x_Àl,ªÛYZ,œÐԵĩ[aÔØpJmX$ö·îA~&îwíþ(E,öÐA›+Þg=ÔÅbEB€kÑ[{ö7T±¤÷þ€ç `7|ÿg·²Ò¤jTÊ‚¿þ³¢;Øyû›œx/ ?HÁ`ÑÑÇ>­Œ˜…ÉqöÜÔ¦bd«êNÀy±Í”’ÂiÅ|èw¥pÏ$Õ6}“òÃhñYä?ï\.[Ý´j½&½ÉÅ AIUäÊÏ¿óÞ^ÍNŽê©Zøèmª·0«¤€¯À,Sбv§r[*ˆHBS(Õî9)ÝáŒÑ\€Mî‹ WA,]-,oÈ:;z¢8ÉýУ¤&4˜ áÐG>uXø{Ê@Š´æÇ¬êS +ìÕÍ&t·¤?ñ‰j÷•Zx?³7É>ØßÃT×¶Ï£cœߎj1ð}‘Åé¸Í…¶a>!µØ0JzmE~¥‡p,óš5¹‡ñ‡—D/?eK­Ë0Å6ŒUÇ¿=~IÚœò»¢”°¼Ò"È~Åç[oÁÆÄ6sÆV0ÕšT»­I%)’l5@Rv]ÕÕ(bcîM´‘#ëKlGÙøCÊÂtöÚõÎáƒåšKBéÑbùÁûÁè)æ/¯}Í`ÎÛÕþNáïÀ>ôšLÖûÊÝÓ“Ýt¤˜Í¦Ò†oÉœ^›¥õ6HG- ÕJ燤í4Ö WÀTÔíR}±1•2“«G“×é¹c5U2<_=øÜ}¶‚ Wö#å™Èt¥ðØ[¨„{æÆã6Ï;Kü:Š;¸oHv•TTÓ¦¼.¸`';Ò¾ê$-Þ_R@bI¸ ~@ARtþÜù{ìzcQG8Û@³û +°fza;ãNsd°¸¬5s‘Š‘~ wVÀµ:+jªdÖ¼« Z¾ƒÉÎ5R¼•8%Gíq†ÎÞíÒªöí<^¢²×P¼ìœÙR°P.ËZ®Iå:Q–VU‡“j<å²²Âêf€+;Twa¼BÄ|‹É놳PÕŒê@Á™Ï»®£‰{^-–\·`å8qÝú¬›BøF„7bé7”î[OJ?°¨¡Pÿ{ [Óß”»QÓs2¯áÉ}¿I™Ovqw`îñ'Ùö}“§áƒŠb;0og>.)é–0#ƒÀ_Ž*%øÝ{§<1zD.¼ &yVÜuߤ‹[›–Axg1.ofÔ×÷üKò—¿S‚,W©‰Ví0$Y äœI{ Œ ªßÂx[*Ò¾'å`>…@Í%C¥Ü´3 è tíF.Q©@4dÀ?¿Â(@ó'Ió5ïŠót• +ckÔ &9X×[u¥G{eh¾Oð‚æyògÝ>5ÂôõVRq³YöÖµ‘¥T”.r±<Î×,rë,ä±—Ô–ð±õ ~ç€ +½·î…,ºzúà# šy ú”]ÓùsoìlpÇ,Š0k$WaþrÍ©‰9°NĨg±?¡ « @bŠýi.4LlV"lLJ~·¢ÙÈï†Û ”;4•£EÔ¬€@±µ¢¶ã€’;ëÀAfABøZôîlz7àfä‹úÜš ]Ò kÙìÌ­™ÐtRrðx7ê¡ä´´§„à%ϸ\ç/&ÀN +çrAóù%le$ ‡b«Sá†ÇÝlWØÃë© ‘tæ”2}νué48/R*ô7 øé¼×¯Ñatª’>RäÓ»hÑ 'H@2 ¾vá®UËÀèhÓx+&*ú3•œ?î–zŸN „‚à‘7R’³«Ô!ï¹Fšbí•üªƒ¬v!Óǧ§´‚]™’¬«æŠËâÞå8=rà )Ї×éÍàzÊÇ«†×šFPTd*—*.©žóóä&'n¥«ÛF0G¨NJx¥ê@üÐ Ùk–óí%E¼¦Šýˆš´\ÞSBÀ1ÚG„6ƒÊ°'ccËH-¹Øå¹o½%\¦&4/T™¡°X•­’eì÷W' ‡¾û­Ó +¬CCo}}RÔe©˜-Ê5{ìÁR@8f§Gh¼ÃH^)ð¤KW¤ÇYÞQ…^íYT‡Ed×IÑ­€a¯ Rn>j¢‹ÅPp¢³âÏôù"c·ÞYì³ö¢QKèÏêìLeò-Uq^2ÑÂFÐÉU©é»¥l·×(]½ˆÏb›2±Vö}Ž…=¿j¨mÖœø•|Ñ=âëóa„D„L2¶ÿætµ6X*¢Éá—ºsQH»|¡¸¢„¡e.ÜJüÚH |½6N9Ý„hÄE¤úýò/¡ˆS†‚4 ¬¶Šßgã»$¡_ 1S +£ý)L ݲ”ç§„¦Ôj˜â§¤䢒ô¸§ò…šæŒ©#sÆbÒãqe¨:I=t’ýíãù4[Í1Oe3c!åº,«”\Æ\sUÖ šÂ0Å:O@»õÆß<ÀÆ­$Eê‘K¢›>Z¬DJд£Cƹ¸&ftg©MÙ7Å þ¡j²QcÎ?[96óÊÒ ™Ä«›ÏylwJEŒòi)z {TE¨÷'UþPÞà)fÿ±„AC6„}ǵýç_M²¿£í +ØKþ:Ö¾Á~Bz ÁT£%í/ê4ùUFë_vßæ è‘-ö—º+ÄR|ƒü;ç€iãQËžŸ€ÁÀ¶;“²‹‘B[Ö¢ Ðç“€Ä KP•9ŸQ>úÅw=b"š.8I÷nŸ ”’¡‹kOÍ&Ør‡äY £FŸ¡t»A ˆQ@ýzÿ”>62a”-YB²8ÏÊF#kæ¨ìD§‚TPä’‡±Óèi¡ž×;“æËÞ*&­{JNÇÌ‚Ä)L¯väžìNük|@µöFÄÀÛÈ/Tìç²vOÊ YÎ+ïýªw’ íÝöÛа.GäX¹¤=³ž {ÒœÂöò¶`´žÉ¶SUqC4Uy•ŽK&mDšPàËu»å o-ÂUtECÃòΖU ííc@!Îàu¯—M”Š[dHØ]›x + èƒa¿)¯õ–èÙ¡m¦m,دG ¾z£ƒBŠýÃ’á-9 ^[z) ­•^èD8gÞÒtP*)U†Šß°ý‰M².R…çšZ” +;µXN¨¶PÀd„z4Uâ¼+ª(J›)¥YÖtC6°"*Id- +*¥hQÈ §Ç¶ƒº~žaT«vûŠ]X,›Mmu…u +3Ô¯•²[= é=@tS[á· k„ßR>LÌdk=-täí²Ìq\µTv§¢±¡âpL¢G¸Š¯Ó£z&WYIõKj‰»¨Ls‘¨í“†hþÜ;+GXÀƒýÞÚŽŒ÷ac·¸Ž]Ñmúï›&PL)> xÜÚ‰†BeKW,:Ãé’)ÏZ®—Æ^GñX7»šþ[‚QÈŸä=ªÁUb)%õ0ýWþµ>—Ó.¼ÅŒHq7 +–özÒ¾Ó&Ù“–@Yu\Á$r~ÿùáÀŒÀ‡§¿Ý²ËO|]Õ‚%Ɔø˜e)\‹ÂÙC³çÚÃí‹ñSW¸Ä®Ï™ÈÇrD7XóTH}Ï辎Ïz ›‡$ÏZK;sñûnw¼ô ÇÍå ŸsµôXQMÆ[—|DßÏcòŸ*êQ¨«¿ð)nÛ=™¤¾¶ý·`xÙÊÂö›–Ÿ­$?xká® 4túõ‘DoIŸgúj! ‹,Ói-$Ò¯œ2 ²¸G@¨UaZŸ*½´;%ã|Ó_Kò-ÞÄ*5|´.ÃÉBiõõF_Ío³­½®ð\e©ÿM¸#S¤PFÆ{5–(%ÒT™Ôв3AÉ÷÷õ7ˆžª.U  ±Áõz=d¬e‚Œ¿g•ëü×ûÓ´ (».È×ÐàÔ ?ìÛSqhþ%¢DÏwzeV‚);$j8u\-¸8¥=Ë‹¶¶ë¨À&$˜T "»j<¦})±F}[mkG^lëM +Ï_å…Õà:ß5§U²Šõ¬¸æ)Ø`ݵaØÙÁ +º]k7ro=Y\5ˆXÏ|žLP4Z樂X÷J~ò¤ìÚù*Ø<+B3‰ È¢2’°UЉA6°ÇT޵*ÌiÏ—éúÅ0úžnI|i’¾J–dç½S’H=©2Ä=ª&Zsøµ`í!ÈÑÚ03Q¦òB§“o¶|·¼ý1"ÔÈܘÌo3ÕB¡jÕWÔ-䋨V5Ã¥:ñèìÓË%›qIÄŠ^Ò<Òî z¿ùkÁ’lˆ(0Eã$¥ûèa± +)™&æqu¿LÔ#±ÞwBEóV&ÝeHÏëщ/JEOŠÉtEÔ¸b˜Üñ QÉöØu„>u9aJiÂöì²RzeKX3¹;Qxކé,f~Âî±£„,ˆF†&©«ŸLcþOHœJ(øj=«•2Åo£KéªãoÚ‚þV%ÃoªÑײA”ަÅÙåj&Ô‘Ûþ8 +—ìò²%Ò*¤ÕRì¸àª>ÿ'E؉_Ö8\8Š^—12úÉH`oÚ‹C8I_è•Óæi!l„8OBk +"ðÙpCâ¾ïÏB²q3dûœ¶NZ.L‹»sÓ2ÎWÒÂÎü–·ˆ%ml þ¸i讉¢!²«Y LÒN_‰)T° º(3‰ÐoŒÒÑ+¡qÕ^»1.ä5{ñÌ%Hª:¯K•¦Û‡K»)GXÈvñP;âÑÍ“³5“šPË·ìií}i`¸Y®··Ì`±N‹Îˆûâ0½ òa:žä¾yeß$è#«Ðù +Ø Íð;Â~ç§DYZÀs‰ýØ™ €Xq=ÀhøîdíÕÐNVÏ#<Š~ê¾í¥l|7*”ÑÃæ“„œ<ÓN{²¹$:g)pH¼›ŠB£°È(‹€ Y½aÓÛM°>L„ÐÖ+_‰˜(,¾ÐÊëÀÜû*ä'oÿ•±ø¢„@yÀÊß}È5?’Ö‚òØk9œí7 ’ÅRõâ†käÁmY)‰ÿtÞpA.» %*l-À¡o>ÄeøQŽš?‘Åþ&½HÄhòˆ4œ/– Ÿð1¡˜û W•v"±'êÐÒõb3žÐQäóß™€®$‰—… ɦi`MÉ6ö+8b†Eh»KÛÚ»ˆkI.o¬×`ÍuMñà0ÝX.¾@$´sBIBR–Å.VÝì–ó +‹Þ âÆshIíÕµé2°‰—ù¶¶#Œ¤.YBR#‡EÙ¢~ À·%9ïYyû¿¯ä#û2é¬)C~¤ˆQä/µdCJ»4è7#C¡®7üŒ×AØé±_ö)Q¡rB*2ì.e‚ºBE)e&©NâÓQƒÃWáÒQ‚ºD 1.¨nŠŒë²_ ‹Üê RCUe)³u¤ÆŸÀ¾Þ®f"ù]5Ax=àÞ_˜JòºÄDμ &éÇy£2G…;(Kl*8 ÏÕ±]êh%p;µ9eŽ= \[ÀŽ•’,¹feÃÁV´ßv e qýðΗŽd8ÐªŽ±z‚KŒJÊð<ÔVbñ¯ó«c¼#ï32ÚÕ6"Mþ¡EÿöÉäJ&ù–aŒhd°U TÇ{†‘9]« Xƒ4‰˜‚™+Ùòp6©ö8@$™ŸrS•º_ÑÁõNè¯ßà^5¡ˆëc =#Cê½IÁpÞŽbi *†„•Ð\ðúmLï4¡õmc²ÖTâRdä3ëá=Ú%ê­<ƒÉ„« +1VãûÇÈcÇNv+UrÏ7B÷e#-{ÄÈÔ·¯í¹p<{XMñkȧsà’SoÀu×­q@©º>¢(¦jç³$ »2#¢ÒAá0îÒš§[¸ÿaž€aÙ¾EìHÚ¬¯i¾G(×ÂÐ!…IæpIÉFuïQzL™=”auVùñ+1“£Îò¯È‚¼™(Dþ3ã~†\9z\¤ _Ãær†Sð®£ò.X?ÆÖŒiú!ø¤.é—Â\–"â`»¢d;È#±‚ [+pÝ_Ñ4ûŽ:,õí¦µ)E4ke‚Ñý9±`î£SZ/@Öë.•™ QÁ‚Ò7È2UØ,?b5Áµí«›Üß¾èü£tS˜Ñ¢Õ-쉾’X¯µš}~k¯µ‰X·|i’&ñ‹«ôõï.ñ]rå*¦!%îÏÝJÀ Ǥ¹€LåŽK‰ú¬ÄBŠ UÆ•LÝk—BkZtNxui”bº g΋£òîÁBŒðnC[«ØCȾË)Ò’UîÏ ¬¤ô^Úê3ÄŒ'±?‰A¦ÒÌÛ?ƒâZ·<ój/÷IWéFË~µè™ʲ"¼M%ˆ"ÁRºï µ{ÖKh¸8èYtV-˜f[IVEÖš.ß¼òá¯PÎ*[Rº zÉÐ,b*)J×bE颿™B¬W±YŠ£‚þ¬dcÂcm½¶æÃïÚ[ß»GºWT;ðÜ'³WbßÃ.A™uàÉÛ-ÅÔ%Œ°;¹HR‘X4¯˜s³LöíVß¶0C§wó¯ ‰ÑF3EŽoÈÞ^ΟYþH0·!¡JgíiC“1¦L|@+üŠ]]@ò öe÷òélµ¾¯¿è;rix­ +êaúX—„˜g$¨ÍaDçaHgûˆ4¸1ÜXlsoâ°‹F£çéísñK6Z·þÓ‰ƒ?~’‚¥Zy’°©Vj¢ +ïj‡^Á[_¯ØöÆCj ø„v +j“œu³Jßó9…mÈ(m«œ³îWŠÁ‘6ç£Úø¡5-Qvmªq@¼} V÷ž›#í8: –C¿¢SC'ÕÈ”MýP`rk¨'°aÏ’HÜ*¢UùY¶N 8³A™eR +Þ‰Y«NL+ãån[ >C(5hÍEoýÈ4—{FK-ïÆyï[‚ï ü.(íâ K¾ijs±a¿ÞÔß¡›fÚ•,CýáÞˆl(L°] $˜ÈÙç3žcÅ;D´×ÑÊä† ©ìÏÞÿ…½/§¬ 3Μ‘h™‘¨C`½TÔßTû›Ûž æGƒÅÍûÞþ\±x´Ï™!NÉ`­tÏÊdú ÆÞÇÆAª€öb&Òí¢¼+”¥LÕ[í R q‹Å½;à˽˜ ëÇ£“L·Ìãúž^.æUv +nÕ{¨8hmn.ÝšY¦ ±µbÂa +‘o½F¬Ãxß)3ôN4Us²'e.¾óÑ¡[œ‚tS.¡ë€äïØ¿®÷ñâ-<Ò\(üRK„’êZc +ÄKjÒ*Í^Óx¼;ð~iì±Ì³9(²5wèŽÚ;·¼îd„Ž&ã]ì]{™\‡%¥ˆJ²þí=Þ†DÉxÑÃ6Ø ‘kŠõuÍ-@˜ æt¾SDÎ;î1öãa7ÞùriÐÐXzûmöÕ¢l 9_  ©ÃŒ¿ê¨WºÈØú¶Ù׃ÖȽÖÿ¬»#;ÅÑR×ÄCºÀHÝ®ÝÙ«áb†´Þ»q‘tÁoæb˜‘Õ[ꄈ›®ã.VëÈζ^ªx¶Ã­Ž.9*¦7xÃ[7í–6¹SaqçþÅïñ·¬¨mì{]/Ó¨Áõ¢6«M¤2ζ©Ü—R{¦þpÀ7­8Q/Õwm/ W:sŸ*å/ ªä5+v§^eߨSõMâéÃQ ðœX©þi™–æánÃvÉ´“ø”Gù£äêù· ã‘Á, +…+—(nêº _„r:)äý'’Y$ÀFèþ³µ@R"ð‡òˆ×_Z1¶°ñjŒx5ÖôÐ/³~sÙ® ©d÷ŠY8]/Îq4¹”+±CØa(ÑGÉ "p)K˜&¶KÖ^üØ{Ã^ìRÅtc=xI7ÒzÇÖݘôÊŽ"á{)ÿ=UGUR,âÄÉ){£ +(@D* |bä†rTFýŒ×Ì=ÔNhÅV¾„ÕÿÚÓ ªTâÇtëÇÀ¥’×’¼z¡È +‚—×éiXebsôŽmprlB½Z®®ëš%0Šý F—'΄\œðõËŽ»Ü}nš4¨äÒ.OÚ5…¯øS3BöÔ:÷ýÆáj¥ýäIá'âéÜÛ¿Lû)Ýëá2[Ec=rç,}@™-Á£×ù+ËÙ ·¯ÊHÚË.RHôÞ…š½`ê44K6Äu~ÕJîËþÜyGÓødî{ày‡-ÏŠM ,–ŠðR‘ Èoï÷ _ÿÑw9ùcö“ƒ¥·?ÿË~ø—·?ý‹ŸÿÍ/~üñ»ßýæÛŸÿë·ý‹_ÿæÛ¯øí|ûÃ?}ûW¿úõÿùw?üÛoßz¿ý韽ýÃßÿÞñÛõöçûÝ/¾øüáwßþ/¿þþÛ¿ùîw¿üî7?~û|÷1z}ûóŸÿæÇOºóÿ~ñÿþËw>¯o~øåË%‰ÄãמgäŸüÍÿúë5ÀßÿúW?þsüeû©Ÿû›ß}÷ßýÝ¿¯_û—Ý¿òñ^½\Ê:­_÷¯¯'õ“Ý¿ùîŸ~üvÝáÿõw?üæÇ?Øû¿þðÛßi`ýÞËýß¾ûõûçÿG¯÷oø÷ýÉýWë_ñóòí_ýæWñçjh4|û_~øÍ߬—ñÇõ>þìgÑþ—ßý·uê/Gþä?ý—ßêØô±¿üÝ¿ýë?Ÿ±þôÿúÍo~ñýw¿zö'×Û_üɺÞþáßù¿ÈàüÛÿ‘^Ôi®·ÿ}ý×ÿ·Úþý­¾ýõÛÿýÿ\o¿ZüÃßþÉúY½dº^ +ÿ׊¹¿_Íðç^š¿y׌:!øoÞòSíÏ0¿ùâTÿÏõ¨™ã(œåb:Ñì× ‚à;É¡ô‚È7ù®„M~v,$¹*B”¤YØýÔû²”­/ùUåG /ÖÒ‚¢Ï——Kñy…ÏmÀšEí¤Éߢqôè|±¯r#L7&bä¯÷غµ»÷7rÿàjÿ'‡œZÓ…%ÖÛßïö +ãIíÔ¡ß܈Tü,•e7âö¿9Ë9%ãGöÑÈÆÇ—ÈæÃ ZýÖî—6Å9Ìk_ºìì}?À¤Gc Švás7näèãÖå]~ó>ƒM$I£_Ê/¯…Ú÷T[œÔ8$!â²â¾¯ßlÎéD{+m_A=÷€¨Ã#<÷àÝsøz?"lÜ)YéÐZbG<"Ðë~G{g-Xô~p¨e½ÅûïûiùrÐó{¨Œ¤ý8puˆßc¯gØ4F#[;}‹÷=ŸÆ+E#ü³¯ÏcœÎѵ³ð ¸g}zÏÉa~§g½†€êºOŽM^´âKM¨©Gãú\¢ñÒMkLÌ}jt¾w{÷MÚ›-7’¸úô þGžTCê@í)Å„åö^ö³B^É5^p@ñ}þÇ5¤³Vüö6ä‚¿?íð\ÜNègâ©'Ò⊞ä¸÷Û[ü5¸ÀÀvîΤY£qîoýu }O<êÓnÜÓ\ƒ…ùéUó%¯ýþÜ8¸¿ÛÓµ_yoÑBÚ’).áâùQÞϽBYb¿ô‰|sü\¯1W¤Sõ¯k¿!—&Ñ÷ò³ß÷§qóh>½Š×× ]"¦ó:i#ìv9¿9íõ´÷{¿ª*¹qÏÜF~±2âq>`èö#†œîh¯ž2h$OÍW4%klÜiO9_´Oì{„\£±=Ã~yqzjH]o¶kBÒéE{oá&7´÷;ò4öøîPÍÖé¹}êL4B>ç8?—_Fx=‡sz/q˜µ4ãôÀ4§víáNœ”g‹§ƒ—üÛn¼âéhK÷¡±ÄÊüÙ/žä–¨]<í¾?íà;£}x.•Tú¤1·Ýxï×û¿Ò£s†cÿœ¾¦OÏáÜ+0úsO¤Iã^A“DÏßï"ÒnŒB¯_ÍÑØüAé“tq2ÚÛ^Á/½–jLä^¦ÏÎáõë“'¯'R–Óóõ=³h‹¯)Ÿ8ÃŒÝxfrÍ·gιžµàÚkº»óY ÞÀë­{wáßÖÎ|û¡qEÌÿxî?êÐnß“¶Ûï²':0]1ȵ×G±-êþû aËç½4kúþ´S¯ó /~¸öíŠ×¬ÁpÆqí0àêû…W{.»ó¨»ól{X¿Oá ]€øô=™Írâ*À)ï ;fÖø9&͹”}u“@àÓ«x.ßk¼üâ÷§ýz–¸uOÜØï½žh§cߊÛéúhg͹ï¾ùD°~!i#ám¾ûŸžÙ7gAA +ýŠhGÑÈ÷»=])v2Š2£±”øÒ2¬Ñè‰qït^TÚóŽ£&¶'n¬±vQùíÓsø2¤Ü¿¨ˆýÌBÚl>b4æñûýÔ4íeïfUƒÆˆ|án(¤ûÂ+ìžÝØ#¤dŠxûô*^¿ +…®^LoCÜ>I¸ß7»=ÚçySûµ³äÓ‘Ï–œ-®hBêü~·?{âÉ6õ›Ó~Õñò€bŸÆ«¿}:òs¥ øÚ'W +®ÇÞØû67žpý®×ˆFÙºñz}½ÓhñþÜ •¢÷äá|uùÚ/¼©=‡s{ý@›×û¬5ï^{¯5¿…ü¿ùïô£Î!ïL'­3 +}¿ÛsóúJûÔ÷/ sy1©¬Æbü©>Ú±£„&㵸ïÂB»3Z ûðÞñoá¾øŒb:îZ¬[«±­‹‰Ÿ+tJ—{7Ösßi¯;_2!EcÚ#èŠÆ¶?×ûªóáùÞ°qˆ;ÛòÞp"ÅùJ;ȈX'Ã8áK,ž4öýJµÙòçìŒ €²¿yOÅ´EÏüüüþãt½N“ÏäwÁ†¥1y»¨ÈbŽ2$Œõü|òž³ž\4îäR4ñKÞ¥Ò8Ÿ¿žªj8“Öö7OÑhîóÕJCôï1­åüŒ»#¥ï}^¥—¸\E]nIJ#†mÏ߃;ÜÏ – dçO¥=¾¤ôòz)eòr÷ÙÊ÷ú\[=¢©¸c³œáÞ’É~zž‘óµ÷@ix~â2ê~GçŒPßNéÝ{ýQûË;zÅÕ‘ž{›ƒŽâž|UÕ÷¨œÖ}ÛSl“*Ù¬;ΫLßžJ¤›ö·Ã.öŒPJ=ËyëÑ9C„ö³^¶©HBcß!~~FXñÆ^flÅÕ¿Õ}/÷Œ \¿íÎ%â)0zûÕ¹Ë~ô šË™Dj­Ñµç}Šgâ—ÚéÙ-÷ã&ßI^OßÞ*ÁÀï©s7^ýJ/g„ë:ˆúc\èèƒì°¶Òuv0ñ®Öþr ƹ¿|ˆÀFg%¶bÞlið¼$‘~¤½­»5Æ~áý¦!¢{…—ãZϧI´p^_…ïq¢»9÷µD%í·?úú¤Päú[£ñù´@ñ<#×q>­}#~jØëÜ…ÑçËuìvD+ÝøÔ ´3‰ž*Îû½.ýáÉî­n=;/Þ>Šý4²òµ1=_F¬”qÂë¾³ÛKÚ“õ šÜà)ö‡#S«H'9™ÎC}àY…Êùb®µÓU{É‚%Q÷é•ØÃˆ‘¸«3Û!Âí¥ïÏÑçjÆ¢ùqD*ÜÏÜ‘9øÀ=pü}uB¸1—t"º¤Ç!ÏÜ) tÞlð­ìv nÌgwîZÏÌÐá3ÂŽ5˜C{~BБÎ*ÍŠxÚÛ 8E±BÖŸekÞ!ÒN¤Hg?Á‘=³¸Î~QmùzÆy²·gMTéÏjéô`4^{ñ¸Æ~Ë,(ö[Gvô›Ýþ̲ÞfkHê•+ûçRÝßÎü°?ñçgp^KÝö2³N,Ÿi…??´»yZ¡sÛ{¢ýéÉåÙž¡ïÆ·ÊŠ(¾õ3_çÁQ¦Ý¯ÄžÐ¡´ýà4›Ä'E^æyG$±Ku#ûçâ}¸vŽ@“Þ ç¥ÎæÈçÜÊYÞöìmÁì£E;ö} ç±!·=òí˜"“‰H±åÔâÆ½Â-Ñ^¼Å#®¾÷¹aÁ;Q”§,8 cÄŽçj~"y‡ L+'L 5ï„´èzYó#Ø•ì(·ÅfØíõäÍûôCƒ–w ¼_ –ÏVežèjX:k[„*ÐÌNHÞ~ËÎe¿~(ì¾ pv0{áGïtFõ"Fx +^ïÚÉd²Ep}5–4Ïgë‰ǹ{¿Q½œMH®®ÆWàIâÙ™·•&ŽÆ³[§TñŒÐæ~I´SscMó|Gg,k_>–3Bçžµ³É8ì:Çì‘å+aÆ^ì@¶}xÖï‘™#ÏŠÉ üÍn/ùÚ;àtÖšœŒDèÊkqŽ+ð —cÇÌíUæîçcÌéì”ÑžUÐúŒS̺?s¹~éžþõ޵™UÏa³ŸUÄûÎD…/è,åI>Þ{–`‘úf·§s3÷jNc~Ÿ>B°ÖUF.çA§çãØgæ“R™{Då¦âc9yVì™òžô{÷VãIT‰þF£¼¿^4^à’ŒYbÆ(±Îâ³3÷§¹Ã¤D8p2×Ù`„“÷©œRTÒîû|Ç—ï9’²%ïEÇoµÍùâgÔt¢ýÀLvÖáº_òÒáqãKÂjžàù‚´¾ç¹œ#&ZÕ}n¸þ}Þòëùy&Ãqæ=çRè|"H s¢1·=wë-;#\eϼ9;odÎ3¿º{d‡#¬ô㹞Ȓ¹Ûò%CöÝùö2ư׵—óë>™¸aµ€xqËþ¹+‚<)€ía×ܲ¿ê~9Ií] +Zn¬'ì¼âg¿'Ÿˆê}9‹…çÓ‹qŸÃ¹4ô]÷¶¯?)™ë™‘³qa?sêvö³èÞ»žÐ6âeÿJJ÷ä²OÑìÅ~G÷¤úÉIQß•ÎÆ=îX†*F`=ÚéÄ]E@•ø”zŽºÊeûGßsÖïý<7íÊ{„“&i½žÆzf±rö$×kh5±zq£’ê‡ï‚@[ßóȺ!m—{oò+gÕ4~ ¦qØãÞmÖ¾KR×ÞÎ+Š(ô˜$ l»!’ŸLqM§äÌ—uö‡³ôèÜk?‘Àñeí­ˆò³/#<»Ž8aä/ξšˆ6OÊJèáQ²!:åÁÈ&WD7^gi¼ø³hŒÛŽ$Dz9·|>Ï]w¹ûË^±Œhã‹TÂ)Écí­ìú½¬["¤(ÂÓ'¸ßošî>ë}Âr;ÚîåÞEýv.mÜíåž]ÙyFtaßošQzwÛ…Vłס½æÙú}:Ÿ„“Òö‰Q€­3‚æþ—HN=ïÄd)n€ö¶wà¸[>#dAÏÂH):7"ÿ‰Û8瀚c9©ã€G M{ 5TÛ.!å|à–" +Dûþ\^ e¡EÄz¾ÏJ‰Æs+i¿ª°xöí©Rë.ÆFûŽó‰§Ùwc{àkž‹ ´÷†Êä}³ÛŸøH‚c§ýI^åöÒû>˜Ò·.Ÿ‹¼¼7Šžeƒ·Nˆ¥ö½„Uð²[¢iwîÑà´þRˆöñÚþ±qÍ·;ïðõr$ãÆ¹/ÜEËn”Г{Â9?'Ÿb_1ñ“óÙ8”ÀÈÑóä!_À0vOªG6×K–¬~¸±œDÄÉ{¸½o +(n<+’ÔÇ£ñ,h¥–òŒðdÉ”öüf·´£§¨¸qœrGÚMwßSh?.ç r*\¢ø±ˆô.§NÜ3`£œÁÞ½»ýLV)ùÚh|R–Í+Œ¹§t—þŒð€ÁÝçÍ}´Ü»±žrObÒŒ?Ÿn¥)@rÓ©sß‚ê "š{â® ©ýÉÖ@öb4XöB©7ˆÆþÕŽ¥TõŠ¿ï©B×~&zJª Ò£¦r–¸šãưïÞ“ƒ÷3nJ»sN Î×E ö¸²þ‚… 8FhÒw.Q¹îMRÞ Ûv2³)×ÖîÉEê68o=ÙÒ=WB|<Ó²Ðl4’1ÜSmy¦‘ù€)¹íÎõ̪¹ÝØNX«JKŒ_ÊÎÂÝ=_{4æ³–Kã÷Rj6£÷ÑË1=O»9øgÆÎžìN6*w(~¼Ž—á›ñî î]÷g†ÿÅ3î %yB¯¦ÔW¨ù´‡}™¸ËÁéçÚ¦4ÌósíÜÁ¹±žX91B=é+ä¼, “СÜ;Õ'XûÅå—å?:—M)h5( ÷ÙŠ¯³Íù hnÓû|ð%úf·²gz#¯ÔˆÒTÜŠøë5³Ä<´†3òS§Ó|ð0®3ìÁæ¼ï—™Ð;n¼Î9´ŒžuÃÙgE0ï¢:4€ÝÞªF£‚­Å~'_n0#ô¯À[ ~î.;L͵îsgK•Ãu1Úûüò{ÞÒ =îÎOûóuHª÷´ï%V®q>¬O7ÜiÔ”/uÅ¥ŽÎý)qþù>íM˜ 1’È|ÀXj¼ÔcÊ}ΚûžþN:|:^ÆYÈðÕHé±@GX§¼Û…Ùö̶g—Aûس虾c÷w€Qì)ç@ÚS=Ü€é)”Î#ŸI¼ŸÆS5)ÁÍpûSÎѪBc#ÐÞÙ‰\¤β›Ž|Ô—D*ÞmÁ5ŸŸ:#¼ÁϹŸûYu”Ÿ‡öÓ7p Fy¼Û,Eÿx:Ÿ¨+ÅSÆ'L^¤€öÖ²¿Ú/!¿w9±Qϧó™ÀÚàëóu}‰ …ä³åCÞ(}{Gh$÷Áø¥vRó&£XfÙ÷·xKó“”§*Ez{Öè¼ñ¿Ä}+‹”¸Úùr2J÷5´Ãwyª‘¥Æ­YÞV}¡pe ÆR}m¾×³rí(u¤—:ž¼:c²F{²»Ržòˆñ>ÜùðãžÔj61ÀAo¯ýåÔRÛ© ÍHq¾'ñ’r;ý ÁGzF¸"ÏC…¼žÅD +0qnåþü)Ç«“÷kª%ãåÕÙ‹—@’‡,Rò™ÊÛÙ®ñf_›沉Û‰Z Ä<÷\©ÒÐyÝ[Ù[¢òŒðàÇ%5àÆ‘JœCí¯ÐÔ].»L]ƼŒ½ø”ÈsÝWÑ^®yˆâ‹qoCŸ_8y£X±Çóù°ÔØ×,‚ª~­euîÆ~òß h¶º¶ãv6¸qníä¤/וÜy£¯.óÓÜsç5/4¿Þ#¨ ªvM#gä]Ü_WfÃÓþ0J6§¬×·(À+JûËCÎ’›çžG[0zèɳËbp1ìØœiÃ<«Aßoá¡,õSÎx¶ûØ¥µýøóÃ*B¿)Št—ñ$±¦r.ùÚ¢ ruaìû#¡¢Xl…ä„k•ö<¡ÌÐY™sDúÈÛ¥ýs÷¡ö”¶GÍQ?¿^·1Š$ö©í´—”}eWzèb?E8Ëûõ©›°<‚ã2,9¾¹¹£ºKg„yømzÛ!?7ÊŽ9w`w}u=“뽫¢·¥—íÆ®!‰U}í{Sìòðâ#àØs]k/Á~¯û»M‘f»õ*ÎÂ9¶Ï9´ëe„Ÿ"(îó +”œw'u¿=©¤½G»Î½<…ÆØ$m¶’0ßìí[TF_©*³î{œó¦ÀmvèC±ö‘Îßö^ï™ðF<Ò™¿˜ÊËé0|Ƭcw¾÷¤ÛêØŒ»‡J­-î/Ïiï9vÄ8¥-Ó÷’Ò÷9Èøwûz‡K)Ø7»½\{&zx|æ;B·èyæˆ:_G.gš#yºô²s«QA0þnÏ;úxH¡ ›Ï‰t®îÌû¯©¡|ç׉â&ºdû)ï÷SNc´§½Ïº‚<ötÖ°^-eùµ‡MóyÊOª÷ +ø:ßoöI_qq“èιŽ×/×±œ´È‹íÆó”Õ“éõ|¡‘´)»*ŽyÛ#ô‡žÚËãÞ³Ä;oÒ8yŽýÙæÝ˜Ë~ýòK–¬òlÏŠ{v‹´ß›Å½y‰ róq•¶Óîù’bÚqëõUù¤ÛÇ>/øt;'3f=[ðøÝæØåË»×N à2¾ò¤Ì6¬êræã$óÙ‚õòœ|à³dóg?ÌXãcäÁ§Ý#PeÞ˹N#ËVÓS¤#'yŸàFJ5>ºÈ?Eã¸whm¢ç3ÂCq»cG<‡“D±¦·Ýq/„§Úé¾ýYâ•{o'JrÝ)Ø|í“mÕ^&¨wig|ýÔî£5!wÎMl›Ï•Lð8üSXÃßìvœx_fz7>›Ô+8øsMó|:gä97±?ED ½xýÝe“ëeò.-íD{7´Oš g&“ÞèVr¹¯¨õ\¹ª9 êf×Ëó<ȵòr?wÍâꇘ¹k¼i“µÕøZyi‡º¹c·T–÷l:ò.B]iõ2ŸÖÇÑ>œÃ}¶4%òq”‰êŽ–kx\¹}#—€F%6¿r #M-½Œ39]×ËÖLÅ;ç½öþ{´9¢ø£¾í\±}â]Öݘ¦Ùoå3BÛjúžšÛÕÛî%¼Ë4†¶Šªy›‰©²ã9ò[rã÷Œˆ/¨4z)•’GÛZ ‘"Qç|4?~B ¤×½®õèB¨Óy[Ga÷<ÏíåÕ‡ë„Ë®¯j=ò{ãÄêI5†Ä¿ÈýFô]âÐË$qKùx_Ú}$qîúÂhèıáÓ—÷¡"Õg«èæáÞOyDùEÕëý,L2Qc+ûåyº ³¶h°H~³Ûc¿¯éäŒÜZ>sŒ‹^TÖ[>=óËÈíÈZÐpFŽí/íÁ[EÆÓ›-5Žr7YÛ†§À?ö}Ûl{ {&øýb7ä±<×c?‘}‹ú©å_'aú!o©’1NjDÂCÙãtž[Ê¢¶r` +}“Äëu‚6A%ö›YkÔE;)ñ¸Šú€-ÊyÓØI?#D±ƒöT¢±îévçˆ?Õ`pû˜û£ÛUL°‡KÞ#&¾ÇËt«¯úŒðlùŒUçòs‘àr¾eqÕð%¨*j›Dt8ýÜ9‡ˆo´†Ÿ° Ðuæ“Ái<«œ™håsn~töE‹ÉIœÈänšgB€õ¿w#»JuÏ—-œ¶1òÜ«/Õ>‰Y÷ßïò›n÷WÃùû]ˆÍ“#Ý®'tïÆyíøD¢7g,÷\yïÓyG mÏ×ssx–OµPØ3¹_Rlì[–£Úwó ç]ÔÜ;ìÑ +¡„Û5g7îùZ*{Í(/äóô³˜Ý‡Äù‘Ó¾‹ O@¥!γ!÷Öÿ±0Á|¹äºS!W$ôhÌ{‹³ƒ7†Ýán9;SÎàÞ +Vs?¡û…/ë* oìh#_GŒ†ö6‰iûÍnoå|Êÿ½®ÖÔ–Ê„±ë0Côà4`²1NœÛµùB×+fE´7Š>¶oPŠÆ'}!tÒÞO܃ý¶BûÏ~¿´G¿Î²|ÄAZÚkQÛByW²´c=—Õ>ë>·‘³è*[´‹_Ì&ï¼¶4RÞàL´KËÙ1åƒ&-.`Ç'jrÀÑG!C³—ûÑѲüŒ0÷ç1R ‹‹]‚âcŽgW6·¤…¬RŒPw&­m5cbûŽP¤¿ú³ß«ó!{ß·«K=a'‚Ól{„ ›¹< bÕ¤8²wôs+ZüÇÓùËAŒ ¾ÚÎëwÏX«{TöãçÚ{ë¥êÌœO9¢ö±ÁÌŸj‡Œ—Ĩô¥ÝXvìÚÏmÀE;Àƒ§/Éã£óQ6 ½)€Þóô|hS×|½Ár7:?v¬¬™^O&ùÀ Ô¾q2[OÌÃi/%¥ð~ª‚×È/Øöjd¥&ç²Gˆ·OÏ'mÄ~n{©‡÷ Ìþ|öGãÞT*¾Ï}{îÍi–• _g.©Sƒwn·OÓJÔ÷¨‚±Gø»Ý·žZR›A\H;Ë©ZkÚ[í2æa?$éñú†BÐ’vTïÆÀÊé Ɇ”^2ŒWè0ÂIìó6Gc?©Ï:(<X=9Êbx} +zÂK>T\ëÌ}Â[œ‚X©â!}¦S³l‘ÂG*çÃ(›^’ç³ <Ï$Õ6ÍTK÷ÙsÅMÎÐJb²!îÛΞï©YÚÛûß{AÃè¡z™{ÙKÄRk] ™~ïÅöÿgí«ãâJ¶u;H„¸'#™¸bŒÅÖ½}7Ü‚»»»»ÄÝ}âž"@Œ¸¹÷\^­êÞ»93sÏ{¼É¯(6{×®ZµÖ÷­µj•X‹ ·›‰åÂð!‚ª;õ©ø§'l´1ÖÜV†*e ‹ÎU^)ü½‰x…C®U«ªp¨”Œ²M¹ÅC£ÞÁd¤ôÚ«Úõ¥ª‹ÕÉDµµBŽ…&£Ïv¸ØL´rRõK˜ ëMØì¦ß—"š©÷aÀŪ§Ê²–x’°WOYGÙ¨.€‰±êR¡¶ÕJ\ o,f q£ú-¤¦êjl&±‘Tíš2U&Õ)Õ‘±PdLe0µ÷ Ã ÂÆ"¼Ö3Êš©%XªÚæ‚<ªw÷AE3%ÃÝ•ŠeÑŧn ÆûÊ?7Ðjñà‰Ô·Ï©B²®,T§'PF\®AÕh *_õè ʳ@¥þ5Ðë#O*ÈWšõ1ñ†õôEfœ(¥úUÂ$QÙ¨*X€}âF=a"¼hJñíÌD¾…Á±ªQ_0{¡¨6‰±ªÇ™šˆã¦J€Ry¤3PªQ^/ì$„B³‚ Õ< T•ðU€GDødwá‰Ê|ܨÊüǃi$ÜVµ-óoQ¬ Tš$U¹IÖh±ÀHÌT§04ì UoÔGâò…v5ƒÁ“°oEUm•¸Ö@Õ¨ +Î Hug©w0Tm”*ëë©| ÂmÕ–ÓHmQá¬^Ñ{£¬ì…¥¢¨ µN”‡í +ÔJ_´’Ò>KÇðUog¬t.+eH*îõ5ù¾²„'ÞBl /ÆŸŒÕ3gÒÇc)TÕ10¶•+åUÜÆl V©ÔSof·7CŒÄ@jMÌþ @8ÁR=a󷾚$ôÙ»¯×Ç“`¨§\K†°ýXè›TUoÌP (JÍ”ëOu±.3´›IÅ‹Mb­tP(wÿ‹.œq!ÞÁüV¿EÊúêP·Š{àöôE%nƒTè»6Äâ +úFf0Š[*kSª–¾ð8Uâ~;±à”mPO´¡¨)àì[1ø ”Á‚zRµ2UUG3îSƒ'à¨îlÜÇ)਱!U7ªj÷)Ck,F”í¢.Æ)ª¾™(Ó•ïb¨äx†øÔQÕ4«*`€§ÆTAq5Âi1F‚ê³sކÉœ>œÆ©lìST[µaÜ »àE};¸žQé]3AŽ ±Ö¿©Ò\Š6POž²8Z#„lpÞ‘òÎÐn"–Ó4TÂh” +Î/#U68¾]Á3[ÕU} UE‚ôûÄ¿ôUeÆàðN1nŒ³T7Ðï“…a¨¯„(FBýd¼ T0öö +ÌHuƒ>†Q*Ör02èã©35S•ŸF‘Ӫꑈž\3qT Åâ.ù­ÄsFª#K¬¯º¡™è±732èsÁ ¥LÅMêd +\KÙ(#´øIâ߉2ŠKgö):$–VV…F=1(5ºkjbÒ—¯©îl$ÔDc¿¸ÑH¦£ÚÿjŽ12Ô§ ’‘PF¢Òõ• 6ª¯´Dp`ªLë’ðAª•0»‘‘rc²ò®ªÒÐ(ª‘¾Ã+r¯¥jï.ô$@vï0’öÍ42‰´‹.L3 3wâÑU¶ác·…™00îÓuýPl÷•&b!U#SᮆzjPkÚ§ êv™Àm "U톆+EDgЧô’T¨X„‹ªÒ“±P@Sè°²ÑH_Ä¥z"C…vCÑAlª'–×2q©PUÊX\ÿ8/Iý÷B”o™Ý(´«Ž~©EÅ)¨+#c¡ FMê5ÚÛHDÌ&ÂÅ‚”ªª­÷ Üô)¨EÆÄ°‹ ÌáÔeªjO™ô)\k¤ðúë G•ª\p©*´ñÇô)4í&âJ5Q•>3QêS•(è ½RC!U•Kï` âFS#ñâ²+› dÖW1B»€…ÚÐh¤NÕQßA &aŠxU޾÷ûB¥˜ûšô•31|/Ô8‚ÛŠND±îÌí[ ÌDÜo¨§¬ä¨Gc½ -Rq+'6ŠâŸ« ”™ +àâÓæEÿ”©Jš +)ãØŽè÷©¯g"ޱªR¡Q_O–±Pc œ]bººÀT·îé ›‰™q‚oÕ¹êÊípµkÓT(>hbª<±|¡‰zzÕ(]ª'” +ëc" Z¢™ r‹eÅ$ñïõû$fê™(Í´T¯OáiA‡JñŽUqÆÅªMR=¡–1QSHqù•JM…r¯bâ¢PÌÒ°on‡ºl‚ÔPܼªöiC£TðÒáÔWU£úˆ5Ï€²±&RQvU5T¥JïŠÊ!§D +Ò¾ŒDL%ÁíjÀdªR6Ðhf$vLUÿÓDé™V¥H‰ hWJ„{ô“©¸OÜPz¦êv©àºt!À-1’)UUƒRJ¸è Ž¢faŽE^$¬<DQ:Ë• ^BŒ•¢®t]ª=w‚¨c¼0u‚ ˜Ýfd(ÜÁËg(†e°‡[Øx†çSuü>„Xpw‰ˆÈX¿Ï0*' +o'£CJ|`¬/lßTBPAÏãbjÊ­¼Ø@ܰ¥'Ö^…Ò‚ HÅ@™PF…<”À—õœ›B•'¡À¦ò=ÕŸÿp胡¡XñVeGq•#囫jŠë÷©Ÿfj,úôðÎ+¡jSâ€7ˈ%ø€¾Ší&b\J¾Ï åô •Ê +n¢®J§ªš…·üˆuRõEÒ%ìëS^¬ªj¬/žz¤®ÁŒwÍ [åÌŒÅ8§1l¨ªfá] +…vñMô”Ž1cðH ›…… +Ÿp¥ºÒª©ÈAŒU‰ôª÷7„¶O•RUYap<«÷&« Êá0­°) cU£™Xô[E˜qÜA]àQt2aê‚`Ç¡ªQ¬‡ajh,ÜÖPÜd&†ïU¸[Øøe¢ +cs!–t›™˜X +ò!ºÝ156Öãž*¥"nn–ªªbJÿÃÁ(bÝ-ÿJaÿº0õÊš¸Q]© oáX)(63•®0PmÁÇ}Š”ªШªÏf ¬8¡V¥Æb¹EUt4·‘°¿ÙLPçZÔ²ª6pF®°kP ¥Æâþ]uÁ(h4ö›ê¨ÿÜD,†)à6)À\±6©‘Ðhd*–51ês#q9c_¦²Q]AnñõbÉœ·©ºƒTpò ZOuõ)JĆN¨£¥o"ªh7SÊSÊžTÚ·ž¯T5;Ò>%RqÇÄ;¨w‹šˆw0 ù˜¨X°T*Xc ¬-"ÞA½ñ×ÎP6ö©f¤$öR#%öV-+þIú”Â…‰Uë ¥õU¥Â ¼±XÈPª.ý®:„Í@].üOeæi\‹^_w•€yÕ:Ûì©×_µ‹´ªo£é_´™õá4ê îBZÈ¿ÕBƇÿ-êK¿ŒUå»Ä;ˆ/ÙçbõÞä>·ýÃK¬ªücÖ)"ÞÀè%´›ˆ›»„‚¿R!7 4G(ÕWö!åz†h•ÆÄ •s ôÅÛ«ÅÅë ²ˆ·~©:&î#642îð‡·P¿ ‰R*”œì„8ff‚WÁ@£èRîhV6Š®@\'åŸï , „§'¢G©±ÈÓpÁ=5±îCÉ„T>åBe£‘ÀÂ×5nÀª±á¿ÝÁàϳ–¥ú"ßýÃ8(‡ŽÖÕ„ýOäÕKl–MUè7Š^aU.4ý[–‘šø©ÏÌQ9Èñã„d'!é?PGØ a)L EVl"òÉÿ«ÛM ÄljÄËHý"ñâù‚Ø„ò; ÒPH÷ADVÜc*¶ýõ”¿ØH¢®£Ìzøc£jçä_î—q¼æê⿘¤z©ÛÿªµqŸó18Ýø¿ÜgcŸ#ÿPÀC<2ŽqUµ«rÿ­€®Â¯j+Üê‰É˸](}` ìnÓësÔ©¸]寊ˆˆ‡þ¡ô„xˆ TD'†fb=jWO*‰A£X ÀP(ñWE-T7’¸[\0&Êv±Øš¡pF©‰H{E÷«L¨ë1ªòèñÄR }Åjúú}·¢þ{ß6ö=5ëß ë‰§f ;³¡]*¤ëªq¹˜x +>±$´ Ò«ÂÔU,”î'Uº®XNTÏLH.þsq?U÷þT¢ËKh7ßTØ£g¦/lwÙÑëv©+"ˆÙ§úâÞe(Ê Jx˜XUgÌüeVö=æHµ ”iÃ}ÿŠW +N»X8å?”¹Ž P•P5÷¹tÑÿrÒ_öL=á}Šå@ ñøY=ñ ¥AVî²+I ;zÿ×53*b¨6W›ô²B‰•?÷@½ˆ0¢Kê‹çó©4–‘ÈñÔEÄ”Çܨi— +50ôû­ø«'ö=»ù¢îŒXaGugÄâ¸]Õh"b-¡ŽÊ_uF|¨º:.Aþ}¨‰ÈÌÅ¿ôÅŠaâÑ…ºïÊ>Ç‘©¹²~ß#IE~†kœ©$• +õ¹°Bn"¨~#áìê?ÝYýP#eI*富ų|MŒ”n e»©xHmñÊ{‹/$V©ý½VWîÎ06é{òÀ©¿êšº×ÆÊ¥¡4»zê^K…˜˜Êì‹ÕÌ Å-¿ÂN{(–#úÍT…$áF¢§]O¿O-CõÞ@áÔZ©XÞLO]oéO]ëkšŒÕYsF†jÓ¤Jリ‹Õl©P¾HІ«Îˆ†ÅDL+U¦×(Åì23á»?õA »L”ZÀHp|z‰ÍúbdÇÔX܉z­Îr4ö®ˆ9/B§ÿt_õÍ”Y´J;i,žrKš‰ëÒ°ÏOS±&Žp²Ì_ÝG­fõúdEHÕÇ´ê СYOÚ§¤¢:˳…}›}fTãX\ Tá"¼ËKhWŸÇŒ÷ωI.ê£pqþôÆÿå>ÊaGtÊLwî<]ŠüÓ÷³–¯7µ]½Õq…_ ¿«¥}@€“ßVUë +'·­ÿÞ>W¾u«½—“£.nÖEíó†êé.¶F ‡å‚§b¹ü¨¯«‡ÿQ¡ð“9úεëêëénÒey=]Gôç”5꼉©¨/ôŠ&°ÿÞ};üZÃMÿÐgè*¤ïßþu«òÏ·âúàדڮqótúFõ=~Uk{ô–è%ç¡>Rk‡ê,Yåäæà´r½A—Ú®N—óÆxEéОáƒà+ë6ˆõ‰ÌFŽçãê§q‘EX¸>$o,ç2qöï¯Øš4Œ÷CÏÌŤ }¢3¾)ÃH§°þ6„c?¡è'g4¨-Z¬SàÒÑW›rñíϸ üúËŽÖrZ"·÷Ô¤ýòF2þi#·Àþ„‹Ÿ6é M ±¥="q>IÃd¶Î62»~6Ì–~”cPʽ¿w˜™;žËØ9mœF¹‡´âÜú‘Ú¬Wüüî©-³øðâ Œ+ºÆÓ/}$˜1’®Â&´L§£«¾"S†Q¹¨½`4Z0†t‰hÅoÕ´¶÷Ö¤}b†Ðá%㘨ò‰\LÉWLhæh68y$“è‚ LlùWT@æÊ1°?ç›<œõ‰óFØzh´†%ë¬aÉ»hXPNH9‰…•s?Kkû~,9 ÁùkÙ y—Óž–r$§YÉ&sN²aLbI»jذ^š2ô>„SôóFKZ²zÕF‰¥Í–~r·Ø¤[²ŽÜ-UG¶%DÛšñÔ°9÷³°°—ÈîšÖ + óÍ6Î]ƒòÏiåà«i¾‰‘¬Xk!ÙdÆÑ>´?³5g87’òJ"£¼5¬XO +E€æztÝú•K¹’ÈþÐ9ã¦ac¤Eò>Z¤sHÎ=v0ï3„ La]27(Go"Cï‹ú Á†äá¢j&ñq º\tÙ$>8{ ’çq|dÅ$>4c Èí<ˆp îÏ…W}…Æwë>ˆ.ŸÌ•œ7c NñÑ9áɽ5dí4óM®H¨Î'7|­Hª™Ï™· +œ¨ðÊû… æC2ÇðYãà9Œü0¹ƒ·iï¯-wôÑ–+\5 [7MÒa«6ã…dÝ#F‡ò‹F2“?^U6™,šÈ$ c£Ð:HÆÅ–Nâcê¦r!9cÏ(ÒÕ¿?í> H²O¸lÕ¢œ|µyï¤al’ ”‘|XÁx>cÏ6çàb>¸tã=˜òŽÒ9çâk¦r±µSÙ´æY\JÛl.´xëŸ2‚ñL²ÉÅ6Lc“[¾¦K/™2•·¿£²vÏ¡£K&°Ù£Hß„!6<š $”kê’ç¸ú©lrÓ >¶b +”4‚Þ©Cy…bÃ’FñqµÓèÀÔ´{ð@68k4‹äæ´óÔb=µéÈúI´WÂ`KÆIcÍ2s¤#×H¬I´Þø -kÆGSÆx ¹ Ð’£5ã®±i3#Ù¼’XÉìûÉ[5)¯ðA„S0Zóý,å +‰5 ë¦!Ûâ§E9F;„j“^)CH$¸¥Ü±ŸéÒÏŠqêïÀ¸G ¢ƒŠFÓ.ñƒlx?MxÒHôg=â3ÎQñü¸G’óÞš û²-ýdœ·&å:uO,ã|4m8¤Gm½µX÷øÁ\HþXÞ/kç9˜óćäŒU„匣‚ûŽaýiÏH:2o“±g›¾}¶ÉšÎ;b0Ìë—<œÉÃdŒ¢ÜîAØ â±xž"K&09'–p9'õù„Š©|hÖX6kXîXн´¥ìšËç3àÓwÍãŒò)ͳùÈ‚  °Dút.èoЙŒwÜ+Æ7a(Ìå6Búd†ND²TÚ ca¶`ÜüÐ~qC¹ð̱¬æH&´`,R<ôØfÐ'hMLäÒZg³);fñ H–¢+¾bCrñúa’†Ó C¡/ aE㘠ÌQðN°–¸¤m3جƒ ™ìýóé¢ó†dñ =6±Ý£pàøž‹©™÷¦r.bâk§P¾qC@†Ø$w©­3±,¦5ϤóŽ/áSÚfñ‘uSñÓѳÆÃZ"]‚û3>ÉÃèÜÑ úÐþ©Ãiÿäaئ‡–Œ‡µBnEcï®CyFÂ:éZÚ'~ˆÜÞÍŸ«¦ÜÖ ë:Üo˜ô7ŒsàÒ5t€ ¥ègMÚ÷£Ü]pÖ!Œ’¶Zô–0´ÞÃ2n¡ ¤圛à$ÿƒi4ß ¬×€”z>ú`¬£@òë“2„Ex‰*™@gŒ¤Ñ}å ÈB´É­©CظmÓèôsØ”ƒsÙࢱ¤C€6t)¬X“¶€ëÐxcù ,Ç"ù°æÐ½)' ÀŽ ');_m‚wÒ„õïv™Kkšú’ó Á8óŠÌgŒV¾wÑ8ŒAG† [0alÅd,ÏH&à÷0÷ ñµÁ%ã Ñ>qC°Ž ++ŸÈ†äû Øæ(šÀE!Z0Ž MÍ&à‚2Fƒ Ù…í¯’¤Ë°Ž…5U:l)Ìš:ŠO¨ŸÎ%Ôé2ƒ€þ†õ +ë’ ÎÅ¡¾Âºá’®JnœÎÅWO…~ÂØ²á¥@ù¸í3˜Ô=³Ù¸ŠÉÐG Gd#æÒûæÒY‡æS'–P™çÒ‘UéÈ2„‰+'ÁWЙp›¶c×8…ñÏ ºd‹o˜F#Ù&‹Ïp©»f³H—£±@ò5t?åŽô_âP:²x<²ãk&µm&^:°è=Æ'~(”6Ë€’Ù ìQ 7q[@ÂP¹{Ô@Òé>„—‡2ñh!} º ÏÇz'%‹"ýGzø€±è4¦#[‘½@ö•EkŸñ„Çúsj ^[ˆ€nÄë ýt`&ëÄb²â¦•z YvEJeφæa½Ó†ÑáUèôãó©ªGßÓ×h¯œaÖ §=4Ù°ÂqlîELÁ‘%lî‘Åxì’šÑZ­œ@¹ ìü´¯³^_¢y Dö ­G.¢ü+EÂö™ «@ïPv®šŒ3²Ë€—RwÏ¡JβHÇl"ÙÄ…¤fS¶Ïd2̇yÄ"»ó 2„ç£5ŒÆÖ3~0´>`> 1[cs>qCÙàôQXGÁ|ùeŒ€±dAç¡g2H¿Ã:¢CT6p?’3,3ÙÇ1™H¯"9¾€çõ…Mß90$ì?‰æ Û|°ý!£€gQ9‡EÇ—y‡Òé­H—Ö낌r¡ùXWâOpÖ(:"k4¡Ô£túñB:sÿ*mß,*¾n2”ƒd%i~?ß”áØ>'í˜A§"ûŽôé5HîÒ_îì‹9›P7Î=º®™Lù¡ùs‰sý£ýR‡ÑÞéèˆÂ± Z\RÛ×´OÆ0Щ¤;²¯è »L,ŒmÑxô&â ·4Ò-v·¦Ì9Xt%Ø +­,Ÿ)Û¾¶¢œûY#[nÁ¡¯ˆ«À÷V´—†5â_2}lÆÜâ§í)Ø´£ó©¢kR²úæ7LÚ¹´Úp2Öyá:ácü}Þh&u÷,*çø:±m:U1Š*O…Ž¥B‹ÆP15_Á‡ˆª›Hxg •9k[R®zjîI:tpÁhÊ7u¨Ü5´¿µÂ[0)þˆ“)þv€óÏÅäÆr€lØGñ ¬/“G°[c3á¹cä5w¿¡êº—cþí6ÛD4¿òšßÈkº¿%òO.dãꦀ|bÔ  :p5ËÁ€­'˜ +ºÙ­á Ÿ€ñü£÷Gxv`~À |tådÍ™£´³È¾0Ⱦ€ƘÉ2ôƒŠ*–A¸Û!„!Àþ3žˆ7x„ë`,‚l'­jGédÑú™=D£~ëÖèg&¹a:›ˆdý÷-¥y†¼ú¡™¬îá·Dξ9`¿)çÀþ°Þá9°v˜‚1LÒöé’5lçì´HÇ@mXg0.ðLÒ/Íâ̶žšÀ)dï4G$âþJZ5¸¬ÜÖs=X[°>aüØÐ´Q Oidci7Ä9M"=Ð:p +íO {Ly#¼‡ä“öÏAú ùDãÌf޲”!®BØõ_àBèi ¼ÝSÚvA<ÄÙtÄÅ|ÑóÁOø æé,°É b3·õ¶™Arê—‰æ0e(è~À‡¤½‡–ÜÙGKæè«…íÆp¹[h™S€¶%‡Öâå6¬/¦Zà› ·&&ìµ,¯³[5-HG àcÀ§`Üd¶>š´+Z›èÀÓi·ÈŒsèðû \7œC7Íà´”³Èš‡ßËkŸ|‡×è±è¼ òúöï¨Ö÷æ²[mSûÂŒJnE×—…e0¬x¬ÌÉOËŠæúQè]È’èü‹t`Î(¹£Ÿ6øpï¨Á°ßè! 71Ž. +âÒåˆ[”NQ#Là9„óÑüÉ…§>Ã%§¼bt`Ma®€¸6ÂHýI„Mï˜!|0–aÙc^D}„xOXÂéEc±®E6 Ù·1€Ü#lñ´æfÒùG—0ˆ[Ãd}Pß@ž7¢š_­£w>³"¶?]ÉdìŸÇÀØø¤ |M¹! éŸ0” +Î…ÇÉÈ5à.Ð`¯ ðÀ-HOt=èJð ù¦ #\Ã`˜ °pí—5エZ„Å›uã0)€™‘ކ뮦£1&™H$'·ÆéÀZÙÄ:­ø>|Evaýš ˜w™]¨6ðgÄ…4”ë'ýì…ðÞ í¬A{Äê€Þ¦‘Nÿ‡ŒuÕÀ˜é&¦j“Ð4 -‡ÖÒÒ)jé5PŽxµâ4–6¶+Æ¡ŸœGœµƒî£\‘ì:EôGò¦ |ÝšG²ÇúiÊY´6AœÃúÃ:”Ùùká5†t,ø-Aw"¾§…í¶óIC¹€¬QàŒ ¼ÙꩀѰ®J¨›JŸ—ÒÅ礀ñ1gD—,;kHîz¶‰ÚÿÁF¾÷÷DÑ#:ºh¬càq6à‹pÑ ãª'Ëü@æ_H¤[D8¢g#ü„q+Èc\ƒ.~doÁ÷¤ˆ­žXô7íŠùúÎáÿ¤á÷#™}¶ëPdcA—±˜¯§Œâbk¦²{ç±»æbþS=…K¨™8|†\xî8> ñ´&¸¨‚‰/§5}MÔÝýž¨ºaJgŽ&È2ŸR9Íh™C–\•Ûž­$š_®mµœ¨¼nJçŸ7@:sã‘2l-á>@î9€ +x•,¿nB\2¢#+&>$Ý"² ÛuÉŠ[fDCç€g™ø¦©ttÝ$*ªV‰ÒͧÊn›Ñ5–1u+™š»ËÑØnÀv%®j2ðRªä”!ÂVó°]Š©úŠIܦ‹ñ1ú°™Gй§S¥×ŒÍ7Ë$à˹شA¦äëH®`M/'ï‡ßƒ +ð œñ'ð¬M$÷àçí“6ŒA¼…›è6p¯| ÒŸáýÓ1Û…–Ž£‹0¶f|²G€^¼>aÙ–@-IÊ=A‡ñÍÖ‡¦ å A»EbüÒG°ŽÑA6 [/-À¡¼2öÕñ‘Å_oû;# 'pûæ³é{ærÀ½† JX®šÄ$ ç|¢†0IµSåÕ×Lä»?›û>m–µ¼_FFŒù³ä<4À/K8G cc×9ÒŸGÿ-™Œ}úàCJß5û“°ÿ§ô+> qøe(·€þ øúÁ—‚ðâëŒüPðóȦ~ /Æú üŠô$æPˆ¯3i{lœx +æëÞ1ƒY¤ùÄí_Óù‡Ã{²)3ô=Qwç;:kß\*< ŠøKpúHð¯RÁÉ#h?46H/Ñ™çщ Ó0BKç[L%´ê2á _„ù;Ag]@Ö¿\F•Þ7¥š§‚]d"ª'RÅÇõä —Êª®Ó)Û¦SA¹£wdóÎInÒ…uÀVÝ[NÖt|GÔu|O—\6÷œœ‹ÉŸÀì_L]ÌäXÀÄ7NlO#¹Å.çôboYÙ-#YC×·À«Yhr‹·6ðu +ø:ØI„›À‡Ü Ö5ÆR¡…cñ:@sX t``À”oæp6¼RÉ׃2F`#Ò¹`/¨ „G÷Ï!óO/f2ŽÌg‚ËÆQÎ!à÷LxùXSŠðJð釱á‚ÊÇ1èY²-ÞZàce¼¼#} >2âð°^X—ðAâÓ¶©øzä`ð×`_!ÒetJëרGÜÍ%p3 d“?âÄtLñ¢ä”¹ûÅFöðÑúv-W3ÖŠÌ9ní3´GÄÁ_ 8ãŸ7 +ì‰xtxÞxàç›ârA飸¨â¯€¯ð Ó9dçyÿ¬QØWã_3 ¸2ö—û& cïCøô-øU|}(p,èøИLaÒÚf!î<óæh4ð;Ä›±8蚬=óÓ3ÙG‚N$*¯™Pù–PÙ€ýA¦Gˆ?P®aÀ÷ >À'´KÐÛ„ºDùcyõm3*ãàÒ'gØ4ð]³[÷Žß9‰Ý© vsIdÓ¹Ô–™dÕeS2ñJd³)Oð?û"›¤té4®êþ +¶öÑJ6õÐ<À GdhÍ#½¥ƒ×5²kT²]?S¥Áï…ñmxåx˜3¢ì²TÞôb©lûçÖÍ/¾ø:`Sàëà3b=К÷ +×üà }ËÓcët¹øúiˆÍÄ—M JoÐÁþšÄÖ¯Éâó†TΉ…dÑTÎј·!®DÇmŸJçžYLÖ>úñu)í7û÷Yo‘¯Óù‡³Y€ÿ p:¬UÀ@J¾ë%ñõ¤‘8¾†æäÄ6nÛ .¶|2æëöˆ¯#ûûSZgb¾ mQØÌs™Ôí_c?ø7ÐÜ3 ÷V³m-™}]rªåÕzYíU32kÏlÚ ¹#ÂâÎç°>šç§ øs¤Ã`mB8ïxÌ×S2Ìgc¾ŽýIH˜œã‹ØÌÝó¸ø²É,æë¹˜¯3i;fC1_"ð ày C‘¦ +Ž-!ËΑù'ƒoü”˜«!\йzLÅ$ˆ‰1ñU“©¬½Xµw¿¡»VõÝK&Yzx¬Sì³õŒ,W8iïb!ÆW1Y^}ÕÄfÇç•tìö©VrÄ•-äÒÞW ã{Ï”¡l ÒÃùãÑGï>ÖĘئ©€‰ ;ÐkAÚ|LÃ4¶ºc9S×µÞòL 6”rFÏÌ…8Û4&÷àBЫTCû +¢ +qìœÃØç +üŒMß9[^Ûþ¼õý*ÙŽŸVË*ïs€‰`Ì’vÏV$Ôêò>‰Ã@6Û°ùGô¨²«&TÝÝ¥TÕõoAà÷D6•.>nˆ8Ñ"6¹NtSÿp×úØ +Ɔ,»`„å3cψÑÐéûÐg÷l*çì":®M—ðNbñQ¹›èW.¾Iælø5H÷È”gü`¹}˜6Äh'Ä}Ð<àxwÎq}Ü7ð? Žt‡t;èEðσüÑ…'õ±ß(0{àQ:ïÐBº±{¬þŠ)V§Ë&VMe³ÈÜ9Wt/æL`ÿA¿DTcþÇ”Ž¡lnµY1ØX`(Ä=¹­ÈN#YÃz2(g4ŽÓ·wÇë ûÐc+'Ó)»gÒY‡ç+õz>GŒ#rƱÁI# ~€94âF€ ðWÐ)ÈþÁšÅºt'ØÀˆ—+¶¿üø9¾Ç«§P%' èܳK°?Â+f0ày°“œoÚ…'Z®[µ1o IŤO¡ÚoÄö#¤fÜF+^biÉI°LA<½å1p +ë2ì`^ErýLx7…þñÆ9r ÄXÙü3F|Òî9,Â.tøH'Ÿgbë ˆU±Ù;ç“7MÉš[ßR…G—°‘•_Áµ\ ¡™ÇæË+ÚMˆª»fdî±TRÝðWáàn„×!f:ŠOFëéLðÍ‚þ„wEöÇܤߙæ'ë‰Æ—Ë)Ämïâ!†t +íê¥ ¹à'ÎOy§Åþøña™Sˆ¶…s?óÕ$ø<5¿ä¡„[ÄkÎçØ µK¢5O Ûþ$ÈY¥H¨ÖU ; +œ| ¨½?çŸ:8Žq€ÿa*ªêÞwlÖÉÅàW 1#«o}+oî^.¯¾cfÓÔõ=à4ð]Z"¼½yíz‰¥¹…D†¸º a×vðÖæktA7@ìj³/±ÚÈbù„gñ~h=ƒ_Ò9ûf v²‰yµOÒPÊ5hø°Xà÷H߀… ÍßÍ 6{¨ms¸$ÄŸ Vî¥ôuñ©Í³ù”Æ™—Åò ñ%ÀhqI¨/!Hg{#ùErÉ{§ Ãþ3°­¹‡Peç¤Øoï§Ì­ AO¥ìœ ¶ü΀›ÉìQrG-È ý qUÖÉ'’3¤ÇV²MÖ“ãÁ—²YæØO¦ÐÄ2~Ȉœ±€ïùÀ¸á0\lá$»øêévQ¹A—qÞÑC(dã»­Z 7ŠPÄ\ÂRN~ý±!®~pGðíÂ:ÿ;Æ¿I{fb¹óÎz„É?¥/ox½ŒlèYN^ÐÇþþÀ”áÄöW«`ÒqC!þë—Ãz¨h<Ø3°­”GÐ@ÈáN°öp¤[˜M–1m³ÁÿÈ"\5,,-$›7ZJïï<âÀ‡û¾YÃ@/Z±nëÖ’’Ußl¬ø~dÃ&J¾V7ÄÃÂ*ÆQ™H߆䌆Ü00Ì?æ¯Èf‚¿Ð†qÕþ†}ÀË`c«&ƒÍLv8/‡ø;ªð¤ž¼ùéJÙÞ÷ëÑš’œ—æºïVJ,Ö[HHʶ|lHZB8 qFüŸE˜b·ÍIÉÆ „„v¨)úû']CÂ|㸆ÃVmüÕÙGÆŠõDöé@Æ;r0á„õÆE'¤lå…ï°^Ì ¾N„‘é¢STÙycÀ™t`Od‘n ËN`Ÿ}TÞGM¬Ö…8*èaºè¨>ÝòØ\Žx4èmˆ¡(B‘.Ok˜É6Ý[Ç·<±á¶¿° ›{Öȫ‰­Ó`лgË«."ìwÖˆ¬¼eFU?üø3ä[lØl+ÙÌzkP±ÍS¨ü3KÀŧï˜Ë'WOGp¬!E|â£Ùã×*¢r&?´õIN¹ ¹pìOÚ¹i¬»Æ»Fvž¬¼ý-]~ÍŒF¸û 2wÏ=‚9gxéx.yߪáÅ*zûs¢ñãrðK³ »¾f¢j&‘­=kˆÆ'Ë0ç @6ø䇡Ä-‘¾ó" +Ç/ÿpuà¿táQ=ÀàCãœCòÞiç‡ê@ì“IÞ>ƒ,¾)¥£·O–{¥ &ƒ Gù#@>­97µ«-$ËW®•¬_k%± Ýq<p'Yÿ`)Q‹xhHÉXðaÙÈÖ¸øöÇ|"÷˜ä|Œ’®ýiÄ¥áݹ†Ûk©¢KRÙ6ì{˃ãË[> x¥¼¾ý{zÛ‹õd뫵Tþ‘… 3rf‹ãè£Íy…êp.>x÷€|Tõ.ïb¦ð„6|k6h={‚°&U1‰‡\(À.!À×f-ç%ÔO-.8,ùs‘Ô<tÈ+ÖChݰåç̘¢‹&Џ]˜Oð¿³s†t +—R7áE²Š“zÔîn f{ט_ÊÞK ëÚªÛKù¶»ÖLý½UtÙ9cÐ TÛ#s:k÷ð]â|М1C<ø7Ä쨤]*uïLªø¬Q÷ð¦ùµ9ÛúÌ‚hû°V¾½sÚ:b<„kô™kh¹{â 2íÈlyý£ïÈêÎï8ÄË@Oñ鳸ܽ‹ù„‚ÉØ¾#[ÆäïYÈž6â2÷-À8ð²8·é{˜+²æÚwLí½•tÃí•dÃe0¿à{&‹.@솮›Ì&ï-¯yü-QxYJ=2›Ì=½먬C󨂳úTæ®Ù€é06‡8à}$«BWÜþŽ®¹¿ 8^6xÄë÷àõXòöL0egMÙúŽuTÛó üÁöüžn†Ì9µ€ «OŒ’ûe ƒ„ƒ–e×Ï +É)p +á´^f€^cÐú_Ä‹,Ì \ºp!Ÿqx±"yû,Œgü3GB¾Yƒlyí•LþECœÏ1;¤_…X/[=‰FÜæG^qIJŸÐçÒöÎåÂʱ|s¤Hª˜Î§6Íâ³,œ%¦©Ÿ‚}ïà +J‰}ìQe_Ç>ŒÀŒ‘hMÇ1žÐ´Qàß +_Õ¾š­¸ñ½’³#ûùûçó)ÛfÏžñ¬ŒCg–2’ÎÝ9ÚÕ±‰9Ûî¨8yÛƒÎ8±m +áŸ7‚ )Ceœ™Ï¤ž˜ÖúhÌ£²[æ‚Ï‹K¬ž6c +ðÏ–7¦Ê.™‚ ˆø@|ƒ.p!à©LÁq}ø=]9ÝØ±󓆮å3¡ +ÎèQiûgEGUfTÆÉùttÃdÐßòòkFTÓ«Õ÷³Ù𔀭TæÔNc!¯žŸ{d1[ywÛØ¹–,¸¬㲃cBîˆSC,8:øÒÀ"ŽÄîí ìO^ðæ·;Zï|»Ö™wn1Z7žòO +\øŽûçŒÀº8¶vмæ¢)Ùøt%È»9ƒæ«6J,d¼ÄšEöÙynkÔ`Ø„Ó)À ßy¿lœWÌ&MÛ…cG[9?È.2Ù‡°™GðqÍÓ!&ø0 1Jˆ¯ ¹„\1Ð9€!È>ú&Ǿ~×èAl`1âÑ»f²ù' AÿqQhž“G®Åü5ûp—É »tX&ö«ƒßDQóx…惉®™œ|Qïc’?ÞÎ7n8‘5ŽMo™l´èZ˜[yk×*ű[Nv—®„QŸÊ NµÉ\&Û„ùøv’š¿¦rÍGœÞlz¾šÚö`5Yÿd)]|ɘM?0Mnýô1Žù‡å4Ç`³vÏ%*¯˜õK Ä_q\(©ñé#K€OȪn™0ñ;t ¯D¹gê`$#“©äý³˜œƒ ƒÐ‰5ˆ«”O?+›‡Ö8Ø ÈÇËß·ˆ,?+›Í'·Íì'øW1§Íh™MÕÜ\ÊÕÞ_ÃÖÝ_En{ˆãWà_*ox±ŒÙÙeEnïYÏ_$¬ªþÑrv_'y˜xÿÉ"Âm ™œ]ó€wCî.äÒ…§ô©œƒóéäÝ_CŽ”7šŽ,å?çôb&ª~ÈèàfTs÷Z:k×&¦v2•´{Öehé"ªh,øZ † /k㨠13ÙrÀQì¶Î Šà{’3. ¸ä“FvŽ°ßŠ8‘6ø3i„=À2¨ÌUÃ>ðˆâ tÞ±EØOô“¼w]¤Ìùž˜ñ œ£ ¹ŒÙGÑÙûæáü ˆ7@eK°6Ä© ¾±!ðQ@®—X¯‹óÊÄ9·{aœæ‚O‰ô +€sd=^zëàŒð‰ªšÄ#ü +¾Z>¾d +—¹k>ä÷R¥§0fYÝÖnÎìë$dÍ/–â…­‰C ÇrT°ß±úÞ7à3a’šu±nN ë+u÷œózø,’)Ì= w%¶b2^«ó‚OœÊ?ºˆMhT¾Sü¶éTáÁÅò¦öäÕ·LÈô=³È°Ò±A¡SÑÏWLqü'¾z*äpr Û¦ã{#Ý 21 ¢â¼T^vNûMRÛfB¾ø‘AN˜¬Ã ©êKßò»çãœ>ȇÜEX;iûfÛÞ¬bZÞob’ÏÁù5èƒqYZÛ,ÄôÙä]x>ÖÁˆW µ(ü‚×ÄQSïŽ(œÓ_ˆð `]¤Ÿ˜˜šI÷„˜åŽí>Ì1é2ç¶F×O†-p" i(Žú¦µ¶Ûª <ÉÚÖECt\«.“wÃpÕ4Ûfï„¡8Ï{jb¶5b0‡ì!è+e¾D"ö÷âço_jÚÞ9˜oäYyO°žA÷AlçQ¿Aö +äƒË=ªÏfYs 1kˆÕSh â—à/„_ðó'¶ÌÀ~!ˆ™"Ý‹cùà¿C8ƒI‰õhêÄšAFóé!›8ûÓ!ΕԈd¼l +Ö×'ØÂÃúÀã”þĪiDSÇ +ªí¥¹¼©k)z`6”;ŠòŽ }F8æ{¦¹s=6-¨` ~WxÄ @vA¿€o›@úTÞp)øUð;Å¢¾eí›Kç!ù):k×й‡¢¶yÀÙ ?Œ,ÿјl~ºJÞút%øB©¤íÓèÄmºg¾yÍ3&ç¼>öK£µùzÀ·1ÎÍÞ3bÅòúûß5×Í@7€lÃ~ÈA÷XȤíÁù²_€8/ø4 ‡,½lD¶½Y/«í0crFn8W|Š»†õΤíŸËFÖNb²FqáÅÀW„ÖÀ,Š*ÄûFpì?¤b“ s;æaÛùGõdü{ÄÁ´{2þàu·8ÈE?šÌÖ]™Sïà­¾%MðË·FëÈ]ÂúË!—Æ;~×0…*¸h@–ß1µ · ÔB¼^ÃéXÀÅ› ¸ÇË"óÆÑÑ•!/…Î?§¯ƒÒ‰`SqŸ!)ûÔb²ä® Quû9¤[A®!OÔ6±þkÌKÿÇÖ`ß'›~tÄ•þ€í3ÙŒs¹Ì£‹èâËÆ³ +?8OîðŒƒÀ/Œì%Ö quSA^è‚s†då3ì¿DrÆu.›}h!Ò&dÃÃåDíÍoÉâ“8†ã½mö BLâŽà3Nn˜†ñ²gDÃÈŠ³R·òNƇŒƒ8?›wp øÓ¨Âs†Dåu°ýDåec²â² U|Dô2Q…ô4¶uȦ·"›½{Æ´ÈfCÎ'“¹¶ý-=ëdÍK©Ô–ép-øeuÝßALŠÌ¿¬üE^ÝnÆ´<ÝL¶¼YGÔ>ùË}Þ±ÅdùUc¢öî·Èfƒ†8*âÇFàóf“wÌý6‡Ë8´€.<¶û@Ÿ­¤w=±$jî~C¦·Ì€¼;ˆÇî[µ±½C›hzµ‚h|³Œ*¼%…qý9¬TáUC2¤t Q;NÙõ5Ùø|Ûܵ‰¨mÿûa_pˆyAÂv]ˆR®‰:x¯JÜî\̶iCqwdÛãœdÐÁ¹GŽ8­‡1GÂn]:qÏ *ûȹ§õè†Î•Šû¶»ì–¦»rûÆÛÖlåµ¥ ƒ|`ÞEt cà•DíƒïÀ?Ãæ5„¼ ¢îÁwH–M0çDØžn}¹‘j{»jz¿šª¾â&ð!kî~‡õ\S÷R²¹gµ¬±ëyÅmì—¦óN,ýI´¼X º…ªë^†xÅ*¶õÑf3.cï|ìKÅù¢æƒ¯tÊîYdá©%dÙMcyóËDS× +²¥kÛÖeÁ´<ÙH6v¯×?þúþ軼æþ7 ' ×Dã‹e;BîxkNíí¶f?a¨ƒ/å6Mï~U?ûFÞöÛêô[öÚKúJwºÛ…:üŒbö¢º–?ÐaKïï’±û»Ðß=“³G:íèï(¢à–>Qp]O^ñÄÔºí§¥äÑW4ºÃƒ?úÀ° ¿³CN¶¼]/k}¶¸ ˜=¾aUvÍŒ«¹·Š9üŒ¡÷¿‘Q•÷¿Áù0©­³©ú§+d%Wõßô¡À»Éú‡î;ÚxàD6ÿ²†Ì¿¢Ç&™ËfžY x›ªy´Ç´ÒO,{ŒýNaý҅׌Á†bRvË”Í8¹ò_M,Ù¦7ëÁE¥šøÓ2®u +™°cš<ùè ˪Gú–‡zWËNÿSFœÿ•—_ù»=yéWgÙÍÿÞbs·×|ös$óæeõôK4yï­/}ù½'Œâîíî^G4sö3yò#KžþÀqg{*N=ô²=øÀAÑÜaÍW·¯æë­£ºV!Ýó-Ì+‘j!U÷l·½ÛÊnû#‚­{¾†Í:µ¸¢]BÍ >*o¢Ê(ÛÄ–YLÄŽÏI›!yûât`©Ý/,¨=¬è#ÏiúÈS†>ýb {ê‘ sî¹3»ëA´~\CÔ>þVÖüj½û…5}ð9E¡9”üh!?ðËfjÏg+âÀG+úÀ ’<øÚ†>þ”eusüÑG»s7üÙc÷í¨m/ÖÈ~'ßöz9ú,™£òÔ¹#·¿ZÃ4?3‡x-Óöds³bG¡Øs¡š;Ö]Ë@÷ÑMHÿÕu-…˜…¼éåRyËÛ6;?­"w¼_Oîy½I¾ÿãFbïçMÄþÏÔ‰ +úô;¤ÞÐÄÙÏ<}á­+{ôÕvzÇÏ æècw¬{ }ì)G|e >f›Ã¿l’ùe³üäO$}ñ³‹ìÊ¿ìäga˜ÛϹÛ÷#í.\²;u}+ྂÚѽ‰j}»úF]4[€í +ÂGĹϸP·ÞøR7ßùPWr#.ÿÉøñW[ÙùŸâò{êÎkþùítþÅÍ öþHêÌK{òÀ[Ùöi½¼þù÷òæ/«`=P‡zHúØ Ž;ÚeOzBSmÏ6È[zV2­Ï,Çï¹€|+NÝñ`ö?¥È}¯­È]=›˜ýÏIîp§=sú¹=±çsùÏ›è½ÏåÄ‘6ò㯠âÜ{yñ'úúúN?uóµ7uïeu¿Ç8û‘£Ž¾¦À6g߱ġ—2ùñ÷2æP7C^êr¤? d^u¥Ø~¸YÄ}z’+ëîõ±îèu&žüD=î §~|çDìü²ž,D64¢|ð2ˆib]Žp)ØðWY>Xd½ë_+™#=<ån°ó‰sÁ|õÃ5TÞñ…6{[+ß÷ëÙùŸ(ùɤMÛß–Ë*ÞÛÔþú [ÿi½¢õ©Üþ`»»âʵ0ÛÛ×â·Ü¼’hwñVw¶Ã“ß×Ųm/¬0VÙþn-ð4Ù9zÛ‡õs‘ۧȪ:LdG·”ßøÕ|÷S,÷åf÷éVóåe&ýûë æË“Lú—÷iÔÇ÷IÜÇÛyîÏÚJ¼»›ÊRîæTÝI­píÙ[F|ü{÷¾+ÏååáJ»77K¸·Osø]YäÞ`4ž>ÔŸœéóŸœd­¿­7}\ÆŸëô±»|'Fqâ©;sá­ yøAzÍq7;CížÞÈånwG2?v{±7žùó×î‡ñ·Ú£íÚ/¥²7»ùó}Ø«}¸‹~ôùgòÇW[¸s‘<Þóâ/Ýòå.ß÷E:ÏÖªùõ76Y‡gYWvXïÿŸÕÖ§z­ˆkï]ØçS¯ïä+޷糯;Ó™÷ÝéÜ›ÎlòÙË›[ÿmosë¿ìä·~w–ÝûÙ|ù9’ùô$ƒÿÒ^àüúX÷¥+—¼÷Ò<ÿFAí~g!/¼ªGæ_XB”>4&v}Þmì™'ζçï)ÎÝñQ¹çÄxb«8Üî`{ Ýž:þœ£O¾TÈO¿¦éóOÙKO¼¹s¶r'Ÿ¹±'^8Èü¶I~ì£5…ì/}þ™3wï^$ûðAœ¢ë~ºýëkÅî/Ôz=ÛUëúêp•ÓûóìÇÜÓ{)ìíŽPòÂ{;úæ3_ºûAœÝ›«ÅŽïΕ{<ß[ãÓÝTø¸¶*èaU™_g}¥Ç³¶2Ûó©Oo“d¿{ZûÇ&ðÿpþ£ÙØ–iDÃË¥äŽæôöæ ÛÀvÉâÎL³lølL]þäj÷âj¾Ãó‹%ö/g9õœ.wì¹PδwEÈ®ýf¿ùpïr›ä33¬#úo2·•¤³³g:w䑃CÏ…2¯çûê;·ms{z¬Ööñ °kô¾n‚ÝÑiÅAãôãÍ »G3îùÓ»º,ù}OYÐ3ô‹ÎÏçmHæ*jn&—eÞÊ*tzs°ÔöÓ¥BþË•|‡·ÇJ"•`™l»WzðVlé¶›‰e>Ý å<’[§×GJÝžï­à?ÜÏã>tg;¾:_F=ùf}´w#ÑöÛZYíëo©¤“³Éí?¯³;ÕÀŸìq“·ü×*yÞÍÅÖÅí‹eg~¥ÏÚ3{ÎT¹¾8Ymû®½ˆyú${õ8}Ë›ë¥ü«ölêF—ìò[›ÿ°”~CPןyR÷žÊ:~u¥^?Šƒ9q|u²Œ}p;ÒêÈßÖZ4?0´lýh¶ùÐ?—n¾Ø»Áºëî^O[*ï&TÔÜK¬ÊîH¯IìÈ« èn¨u~}¸‚ÿù^!÷Ó³\æËólö×gÙŽoŽ•úw6T»?ÛYfÿþD‘̓ºZîÿÇJj÷ÏÜ‘gÈÎ\Ëd[@ç_3ìJµ½Ù€mî¡§<³á¿]Oå¶-d|ýssºæÞDùucbÇçµÜùg^¶÷n'ð·ïÅ0'ßÚËZÿ¶BV|c‰<ïÊ"ë’›Kä§>Éù‡·]_ž®qy}¦ZÑs;‡}Ù‘bûévqPgmmòܺ¤‡9µõíñ•)sù§7ÒÈGÏì?\/‰RÐö8½¼èIByK{lI[GtÑž{1Åè}KÓîf–eßÌ,;—^ò¸¢|ËÛcÅôÛ·Iä­ÞÔ™öüé'žüù'>ü•ÁÜé'nôÁn’ÞÝmÅ~îÌ´ùÔFÿò*Í«{gµ_÷özŸîu^Ý{ëùž™äŸ<¬oý7/ëø§›üþ¿Ü-®öZn:׻ƢéµÔrûçoØëÏ‚¶¼½Qæøæ\õôm$uãÕVêÖ _„ŸÝ¸æ.KjçËìásý®ŸÝ“3Ýžï¯r|q²ÔýùáÚÀ®¦m%•)²J£ççÞO)n¹W²ÿaTñŇ¡·;ƒó®µ‡^¾Qx«#4ÿþƒÐüÛèç»÷à +oÝŠ,:z;º¸åv|iîíŒJŸ'M¶.ä³;²^Ÿ,‘?ú/_›“½ÖÄáÿ±¡öÿjC{DzÇ{¶0;>[R ¿¬æv¼"©C¿’Ìíž þ]W.óêi +ýêeÿáa÷ånùñmóÓ‹LŇ[…vïî—PO_EÙœù»üôK9{©ÃSÑu3ÿОo÷ájIBG^}öãôÆ€îÖ펯Δñï®e8½9Sáúú@•Ëë½åaO‹+ò$•l*¹ö0¬ðò“Ђ ¡WÐ׋ +.> +8ÝY|­»ÆûñeÛîÄ—ÕßM(K¹Ÿ]¡ør)Ïâv/cYxkžÍŽÞåÌ¡,wôÃþÐkîJ·ŸÝ­‰vO®åØ¿¸QÌ^íô•µ}\)o~¿’kë’qÇŸ;ñW:ƒ¸ËÈ&ŸÿÙïx˜œ}/«1öAI£ý³k%ÌÅgòÝ7·©}l"Ûñóêä;–éêLì¬oð|¶·ÎîÝ5¤ /–Û½¿QÌýò8ßñÍ‘²ð®²Úš‡q•k}ž¶ÖónæÓ=âÝzT'våÔ$=Ϊ¬zW²§=ª>îGŸ@ótþNdɹ±•§oÄ”¸SRy;©ÔýÅÎRöóÓlæEWŠâA{*sé¹wëa({óI(w÷A$¬’©H®³Ê2ïf–'Þ-¨Œk/¨¬»‘T‘}7«–|õ6ÎêÇ^ëÎ^wW¤ŸrïdTW^K)ßv-©,êQ)’¯ºº‚{éuî¨oÄÇO±›®ön²ø±w“¬û7_¸·WçþÆüöœ9rwú<ÛÛìüêH9ýän8s÷N@â˜'øœ¿Q¼çAtñ¶»qÅ;"‹¯= -l|]îòæ@ñû›xË·½nVïÿÇËú·Þ`ùo_bí>œÌ‹n/®Ì¾Ÿ^Q}+±´åZRiäýÒrßÇõ¥~ÊÝ»ÛJo¯ä9¼9]¿íÌç_væðÝÏ2™ã¿;{þµ9ó»“C×íR¿®ÖFïî¶——*¶¼;[êøöt9óùEºüíߨwoØ_Ûs]zö•9¼?^bõ¢×êû“ ùòA„KÏ¡ÊøÇÅ;l]Lµ¸Ð»asë¯ÒÍY'§m«e]7fs}—¾ÕݰĻWѯvTt&VV=H(s~½·Äêo½›^õÚn|ÛËmøÐËoxߢè¥6}êu°ú¥×Ïꟽô¯íÉôoíÉòŸŽÙô´—ÛXÚ5ÇòpïZâê?¹ÝávÚ3ÜŸ¬~PÚPz7­¶åNBexge#ÿæ~6ó¸3Ž~ô"‚}t?ž÷$ÏïIs]l{qmøýÊš=—ËŽ_-}\…tö™JŇ»Eo.—;¿>RÔ]טõ(³1®£¨Öóykõ÷שdOO4ó¦éλEÎoŽVx=o« +ꮬ¬xœP™ò(«†ùÒI¼þ)’èù5Âúa¯Ãæk½›7úd¶± r†¼“×ßè]nýê·­ìï÷sÓîeU4ÝH(Av¯dϵ„’”ÛÙÅ^]ÍÅÎ=»‹©“èÇoé _œw¡;{bÜ^¨Nz[{ðJ\Éù›QÅG®Ä—í¿þ6¾äÔÕØ’mדÊ^!ûþZØ×Ì{Y•§®Ç”\ºU؆tÖ­ûaùŸº‚s?£Ï5¤ë’eUÈþñ9výÓ^k«ßz]^í-Ûþ$¦âZWHÁÉ'%GžD”æu¥Ô³¿ÝÉa»Ÿ öÐþÓ•› Úp¦wÙæ¨¼ák]}4WÙh|oÃILW˜KŒ¾ùAbl¶Bb`¼\¢gô½d‘ñ2‰ž±…d©<ºßêÈ“#W·þ÷¼5z×?¿ˆ¹]X¼í|ZÙž“J‹.g–U^Ì(kºœTRp)»<aïÎÖJæÝÛ Û×÷Š\Ÿ¨D¸¨ºàvFMãÕ”Êm7Êv"ÜP~7¹pžMç¿v=×KÚ®&U\¾]tõFtÑ¥Û…§®G×ÝM(/¿R™v?»6á~~MÝÕ”Š}xNJª®§VÝL+ßòîT‰¼ç÷òý»øÈÎÂŠŽ®üÇOƒóЪ–ÿó}‚ù“^‹u;_¼.z÷(ó°æ›bŽÛs]×|çÏzëüKj~¬÷óŠG³—Y»Ifê.‘̘ðµDwÜLôc%C%ƒ%C$ƒ$:è3ý4^2F¢«9V2s´®d‰‰•ä»BÍe!g†,¯þ4eMWïZËŸ{·ZÿÞfûál>ûîuÓù)‘íz“½y‘íöroEj{NUõÕ”Ò¦KI%»®$– ½XÚr9¹ìĘ’oFm¿‘PŠôqÉ™+±%?^Ž-º|3º¨ñNBYé½”ªîî œÞ×>??«ûý½¶gOCÑæ¿÷z¬ºÒ+]™ôãèï¹°~ú߬”Ì™­+Y¸h®dµ½¯ÆúäãÌ[Ƭv ל5MW2B2L2P2@¢-ÑÂÿ´Ñ{i¢ý$ªŸµPËôÖ:èªþè'MÜ6ý›:tžDÏ€•|Kdi¬Úß»€y-±ä\vI噬ҒK%å—2J˯§–V^N+Ûv9¹tû¥¤ÒƒJÏ^Š+9z)®øÄ…øâhmî¿WrøZléÕÛ‘Eé÷³«é_z2˜ŸgÈÿü´¼âB7²ÁÏ‚ Ê»bË×½îÝü½­»dîĹHG¡þCß ^ià·€¹Œ>ÐÓ~õðû?þ§ß®„*Ðo$ú:LÒ_cúi¬dÂÈ…’ÅRGɪ”öqÖ‘ÝøÔƒt”÷¾;Ûãé®Ê¶‹I¥—/ŵ\M,m»žPŠtLѹkÑ…I÷r+íßž,H¾“W²yüJLñë±%•7’K=ž·–2¿?ͦÿÞ™Ó™WÕþ20¯¨;¶Øâï½^«Ê~œløýF‰î±èâþ÷G=„wƒ$nú¾ï÷§·ùãýðÛõ}ï~è̺ßX´üà)Y–ùlìê=½ó7ìu¥{Þ¦(^ÜÏuxz¦ØíéβŽÊÊЇe. ,‹dæ°òJZÌã‘ Ieç/Çây]zâR\é“1å=w¢Š¹Ï7²Ðýœ7öôÒ–ï{=m~ë [³wÍ7›%#Ñ ýÿþÞQC5"ðmÕ˜0K2cÆfÉâ5!’âÛ‡¯~Ý»Žør'"ðV]^Íù̲ý?&•Ÿú?ì½wXTÙ–ÿ½‰JT‚ ŠbÀ€E0‘3TQU'V ƒHF$IÎ(QÉQ²Š`¶ ­v›m#Š9ÛmÛmêÛé†î;S¿½6ö;ïÌ;¿;Ïó¾ÿy|J Š*NX{…}öú~.´œºXÔvêj~ÇÑkù­g/¶~u®¨õüÅÂæí×*š +GëÚ¶T´ÖÞÞÒ²{×]·s›öä7v”´ˆ~Vnò8¯\á^vÐØ9r³ê¢…+ÐdÕ ÄµÈ^üg›S%ç_Ø)|ýØ%jâ×Ç‘±76UÈ÷ðÜxüO{U=4hÌDæ¦nÈfU ZÒ¯êñHéAýømnÈwŸ× _-l¬½^Ùû|w3ÔÉûZ /ƒºç^ÍøëæûÍ­Ñ/‡›àùá·qÎþè~FýX®›Q×õ °=ìí±&œ_ÈœÓëÆYšMþ=÷êøñÏÇúÇsp¼j_;nMrf´ñÒÆÿ&Ñ;æQÇ|ÚÇcÕ"ãÏdâR4Ï!9n8¨á±_i+ùN™ñü³ºä;­MW¶;LxÜ×|ÿbÑŽ— ZâkøèjÁާ_õ<½‘¿ãþ­ÜÖóW +Z±}¶œº\زãjY‹ï¥|É:9š¤gDÆÖçþ·ÛÇùßmpLZ¯©&þ7žÿüÇDC;4}ŽÍuJCËd]*kv+-ýTFF<>°¥ûLEËÁ³¥­g/µ_¹T¸ãÖ¥¢Þ‘ëùÝ_^.l?~¹ ¹÷riSîíÆfxÖ6ãøÞÔz§¸)üõÁí>#Jßùs–þ¯c̪‘}Vû§kªòñ5müªþg 2MR³DTLðu2Â>ÉÇøiÈHcš >é«Y#­h²‰š·®9®¿ á|I¹ˆ{s)ç-M8@Lh.¸]×*ûa¤:èýÙÚØ§;›°i>}e/#àk 'ß…}ëåë9MÏž¦7îÇ5gƳÆÿ_•ýßÌ^å#G“Õôÿ/×ý_ ?ÿ/`œêa¯Çd:~š¬¿ M1vDfF+‘é${db¸ë-FÆã!C…Ⱦ×^‚Ltñï™8£™KÑ}Ð5·a¥à•2:òÉÁš¸»»ê 7;r¦´yŽ}/¾*xv©tç×× +ûÞ\+Ùõý­Âïî ¼¹Ÿ×ûìNÎŽ‘‘¼.¨»\n+WLPûÿÆ?þááø Oëeªa… ÔMñOðU„È㧪9ö%ÓÐ$ud4n2Ò²EƺKÑd 74Ýç~ùh)×£²œïS]UýÿOÊ0þ» yíç*›?û¢¼ãÚÅÂö[— ÚoU¸ãöͼök—óÛ¿úª ýȵ‚æKØŸž»–×Ï·Ü(mr}©tž·Èù},øMðÚijûøýxâG´>~?_GSh +¾NæFvÈÂÄ™Y¬Eæ³Ü‘¥µ™Y‹‘ÙL!25wG“¦{#‹9,²õ­C«rŸë9]Q.’}s&¯áLm3É[¾ÚÚ|òrAÎÍZÚ®—4á<³jC—pþ‚s±7r›|•ßüÕÕ¼f|ŒM~¿(Cb¶©Z/sıuâ¿|\à'ÇÏ N¾óccP›d#Ð$ÕÉÈLÛ™,Bæ“×¢Y¶r4ge<ša‰1È|ž™Ï ÑäÙš¿)åÖËÿW× öÉÑ&|ÌÇbŒ½±×ôð«ÈDÓ ™ëÌBfºó©áBì›ç"[<þ™ájdj´­%ÇfaŒ,¬ehÆ¢84×§Ù…QsØöÚÀé˜ÒÆåºrEÀʨ¨‡Cƒ~y¶¤ýޥ¶Gø:ÝÉi~9’× cîë¹ý/ïæõ¾|”Ýse$×õ®”kfÍ÷þ_󾯱"rý žªš!C5\!áqe„Çœ±Ú4üÜ4¤¯áü0g&é.ÀǶ™˜­ÀöéŒm2MYŒ,W$¢é.¹hV@šËu¢¹t7ZvZuõö¿LZ7¢\¼¹žžv¹g{ÉW •_Õ4ÞÀ¹×]|l'n䵜Ä1näznËˑܶ׷sÛ_Žæ´_ü*¿5å^g£ûå*³ SþåëöÇx‘ÊXÍ™jNÇÇ4Û£1~^Glý±×T-©– ö‡øÚé,Â~Ó™›¬EÓfPÈzY š½6Íô(D³\ дu™ÈÒ}3šêž…lDhqÐNU‡ŠœN)ç +Þ)×ó¯¿ÊÛx½§¦øbcý'¶vÝý²´çá…Ò‹ Z fØv«¢}Ó“Îö˸Nxt+›ÌCJ8WîtH9ËÌlÑ¿ËÕI®9"Ž^ê8–éXaßoLÕg`?? [ä$b›FøŸ±ª >¾éh²Ž52Ò™Ž}#~Lœ‡LŒ±ÿ·öAV¶!Èja$š¾$Í\“f4¢é>ÕÈ6ò ª}Ùµ•3\+p'ÿúLi½þmuçkšž)i=_ØòÛÍ‹ù §oæ4~s7³îO²:ß=Ëê¹u/§«ûfqcàoߥÚJ3þ¯×l,þŸÿð%c¹°¾Z:x¬ãkhFÆjS‘é„EäZ™ZºbôES°N]*GS³Ø§ ó™>ÈtŠ32îL£iŽxÌÖ ¥1‡Õ–o¬ç8¤4[7ª\ê<ª´þü{lä“¡­W«:/•·`ßÙvçÒØF[ŸÝÍÝñíýœî7sz~|˜ÝýÝüÞW£¹0—Ôäý\)°¶Zù/]7µòcþC Î>tç"«©Îhº•7>'d6ÍûŠuÈd2ö“í±ÏÄã 5 ³ÕÈ|ÊZdiê„,fåÍXlÜ ÑBI/Z´þ¸êÒ¢[ã—Ô=Óv<©œººÿ·).—•K=_+’Ÿe½!36gŽ, ¢ó}‘­g²¡3ÑœÈz´ 縺mÅÍ¥•7´–•\¿(ý”ú¢Ü³ËËni/¯z¦»¼â‘îòÜkãWd\çX2ªçrRiëò@¹zÝ~¥µSí3×aåÏJOßGJ‰ßK¥Ôï©’P¦§Ýkk„œŽkÎóïÔ· !òöwA §!ß÷”§ý$”œ²ŽOS±ž³æ°KUrÍÀ¯O2Åùðd'd2Í™ÚÑ—$´*C ¨r´HZ‡–ÅìU³¯½¯¿zHi¹î,¾>w”Ë]î(Àÿ­ª~h°"zPm‘´ +Ù)šUâöj¬)Ñ_[ñÜȹíg ·“Ê¥8?ñòý³2XôÛ‡Tžß)y¯ê›–~ÍOm„Û¯ÚÐG~ò7¿K‘~ùËzúàï’¿;sÃÿ(=ñkwúÇþعâä½hÙ¥çɰÞ)àª2ÐIV­f¬ö?Ç=˜‘f8~:Îõ—¢©V"4}~0²¶E³=2‘­¨-ðÚ„®‰Fóíh4g;²±ñ@ VðhU­²2åä8‡ÍWµ]úÿm†Ç]¥«ÏCe ÿeõÓ¯y‘_ﯗþx­\üË/’Ëò}®ä¼ÿ²À§çõß}J;ÿ¥PpSɈF•!’Çï¸'r¸où¢5ìõ¹é_W3Þgˆn(å’;¿mà¾}QR|w{×èÈæí%£µ­®Ý¦Ï°Zñ/Ø¥*Tm8÷Àã §‘ÎLdn¾ÍZˆ–zÆ!{ª9Ð9hUl—ºCÃ5ƒu_)çyü¦ •6Jÿtº€úËhVà¿ÿ¼Qò·{™¢ßŸfüM¹ÁãW¥ÀóG¥È÷W¥Üïge8û§×%þ¯•Á^5—,|ãµ<#k5ý.+}Ä·”áÿ¯æï,>¡ d^½+ˆy¹¯#êÕ¡ö”'ý=1_ê +ú#6¿*e.O•ŽÎ·”ËÜ¿SºûÿM¹>óAcÓð­üÆöÑ¢¦‚{µÒçŠ`ÅÛžÇ9¥½ç ¥×-¥‡à©2DôZ™$yÿ{¶ì—{µÜOßlñ?¡t +ŠQu^¶ùx¸#裄uŒTÿ'¦áüiÖN Y|½ŸÜšÙó7_þøû zðGO¦øÀtqÖ ©od͸K…È\oæ™ úÛTÃyα&Ø ™ËydÔ­ººö¥ø?·Éx þªŒþY™ð'e„ïcì (©€[JÊï†Ò_øH&y¯Ì +üV+¸¥äÎ(½„M/m…%‡-}ßÙ‰GÿÁ¼ý¾@üƒ2CôRã7üû +aÅ1+ÑŽË顽˜Ï?pâ¶›K¨º3 ¨®³+˜#÷¥Ç¯Éä·®f‡<ºTÍŸú6„ëþàÆ6ŒÚ³5_-b?eCžž«–w«F0¢d—¬¢ÿÛãÒÆ~q‚šš8ÞêOÇuôr4}ž/Z䟉ìc¨Ûo¹­»úÀ¿Mu½£\…Ç“ÀëœrWéS¯¸>m¿‚£¦~ç•ìÓÛY1ßìëT|¸´}ÿ¤XòöÍæ€ËJ ²ÙT°^]°q“¦ ¿T߯帵ßU¥ÿúI)÷äyްüðTo‘„f¨ ÷þ}-µ÷7oIb­¾$4Kƒmx¸’?ò­TvþiwöewõY¬ìÆHZàž÷k%{q§_¹Ò»~pçO}J_ü)Ô÷ŒÒÉmãésÖ’:ûŸ7C3,’ ®RÅ9÷ì·;J'ß”ŠÀ•É~ï”AØ_Ë„8îÒ?ýRDÿò¡ØûïÍC+<Ñ +‡%( 1E#ðè/é“kùIÏû2ž¶÷„¿9ÞBÿð¾P0ªä}vÿ°Ð·â‚¥ÿçJ'Áye@@ß«¥Â†Ó³…ŸÿæEñ5K}ö6Prè¯ÞTZ›‘8(YÍ7P‚(E¬ÑIýý‚^K¦óñ*vï/Š OÒ—柳{?¬’$lÑ Ìè0ôKnÖ]ퟌ¦›Ù‘­FæÓU>Ú¥š¨†ãÚäeh޽­TT«8µ|7ÅùŒrë#åZŸ¿(’߾ɦYÌýõQeÈû³pï{÷¼„yð6¾òKuþ¯2öê‡xÙƒ'Åò‘gùÜñ÷2js·‰¯³/òvt@¬˜E°þ]Ô9b'<õïžÂÎk‹Dé•úÐ-i»¸”Úó΃9òV,i»·\’×1™+í™*«ìŸÍµ¬|È(¾º™SÎ÷þ^Éàúr=ÌÑù¼Wr~¯•¼ð¾2Øÿàßý"r5¼ý‚‘—«Š‚G«†Ædé†öÎæ[o®áªOØø‰ýô)Èq¦9Z ¹S‡‹=¢Ú/ÚIÏ?ÜÀœ~ʼn[/-¡Sª&õçÃoýÈšè˜\-&,C´dùžWî|ïk¶þìR¦ïµ«lÿS޽ûz“ôêÓdj÷_ݨúó¶â#?ûЗ?D0Þ¤ +¾U†{Œ*×m½iè5 ¶rýõÕë÷h8Ç óH?1Á½ð”‘מŸm™ï‹`-Nþ½úÔ›Ÿ³ý*× Û^/ü´RpTé8ôÛÚÀ´ƒÕ«Ð"«)h©¹9’xy¢Ðø$íÈ͹“Âsʧ@ŸXà‘ŸÜ™+/£e££9âÏÿ,ù³xÿ_Ü%ÕGgKrª ©ºÝ³éCOdæ™ïÃýî.®:7›Þ<0Y–«)KÕD'k¾—=¯Á§n']|˜FyÏŠZn,UŸœ%èÿ°" ëíbŸ‚ã&.²|ÕÅN +4Çæ)óסÎ!È.´^ÅyÛ}SÃJ[Ï Êµžñã(öû}ßÏö(>`ä™Ò¬P¸Ë$pûÐôÀê>KaãÁ™‚þv‚¡ïŵgçRY}“éÔ6#.³{2“»×’ÉÚgÁÄWéy¹z#÷Õk‘ÈÇ+‘Éä!ªEˆ*SÔa.n»¼DÜ~i©xÇ%;ºíóe’–S»ß¸²G_rô—_ód]åÖÎéla%=ôÞS~úÞ† ‘ѰÛªƒn^Ï—_¼·I¼÷ƒ;ôUPÙÆ‚Ô-:>Ń“<¶ž5[V¦¶`…&éY!£ñ¸Àu¨Íbrο<Ñý©ÒÍç{%KÿôCýî/ù¢ J6pŸÒY˜×a¸ŸËÔR=IýéytI¯%öêL|©.h +ú;¹#åö(`;âÙÒ+D´ãŠöXg4Læbä…_Ä~ƒ)î´ ÚG–SµÇm˜ÊÃsØ-GæHžù„ Þ•s­#Ž\ö¶IЃÁT˜C÷¿ra:ﯦëN/”ìþÁU>ü5#ûþ^µâé­ªÀýÿæ,)ê5wŽ,£N`ƒž^¯~¥‰ûõq¥ø7e¦è/ÊTÏâ½_))ïcÊ•ÞéáÈS¶^Å¿óñöÉw›ù[¯Ò˜S¿p’”V·uÞH( +A¤G£â ªê”XŽVΚÖÎ[†\œQ°,L-<5Ï02%Ï(4)¢"«v2ÝýÕ*XçËŸ|LÿZD ÿè)Úóz­¤¼ß’ª¶f¼ÀºZɾ_BÅi…²ŸeƒÖ,^ü𸣣óÆC/héÉÓ*Œ@‹j8³ˆ~í-ýì¾”?ú€ç?cøOÄÌž·ÞTà [¦ ÓœËl˜Äåöš3ÙØßvšQ[¦Á8í}çJ]z,ýê~uâG‘hï/®âÁÖ‰‡~raN|ÏpW_$ñ_ÄŠ÷þê"I©Ôg6•êS;-D]ì™3ß+äÏî–G{b÷íÃBáY¥ à ¥{@ËÛþyÇM]¢‘“¤Þ=1ð˜ÒS\szv€,IU–¥! NWÒTñø[„Öá|„N­œ(üÖÆM¤š [̆&ª+R«eµ_,ãûG½è¾'IÿݵìÎç^ ¡8xW.þΕ.ßcÅäµNfK¦A¯ôÇs[wZƒ>OØWgrâu&=ÙÝzýb‘t÷Û¶úËÌÖ3s©]¯xqߋՒý?zR‡¿ó§kÏ¡sꌩüöÉ¢œîIŠCÓõ׿2vy+ÒU=¨x_Y–š€NUõ†«HR[ Eëô× ãŒÐ$\7-2œŠ\W¹!WÇÕÈßW@tˆ’`J£F¸8I[&J#b5h|¬ÀQÄ—éƒî–<¹PŸOÊÑ…žanðžŸüøh˜ìÐsUa¡$«Û„jº²D4øÎ‰.=8X]BY¬*…mUzüe¨ìðs9½ëOîp©†‹‹˜¢~K:s»»ex&hR'Þ +ŽÿÙ=ððÏîG~u þi­¸êà QÉ~Kqvç$IB™\_à ¥zó±­›ÐÇgS›ªôÁC3 ¯T¼~³¦/ÎÃ|r$‘¦©1ýtÇ#G¶ó™èfƒžÑ:ü”–ì{ç½]Lçè*j×gjð™+ô‹Óا0Ýlúv#:½Ö€ÞÜd,iÆq~Ï{'q÷½•{ß9I޾Rç_+˜/_Ëéso‚¹‹_GQÇ߉Eó O¿“ŠöýÅ…Š+ÕñçBT„ÁIjпEïùÑ[~úᆠÛW +7Fr™³oäÂcÿî!þ\ ¨¹2ÓS…˜ÎDóõ¦á¯ÈÃE¢èÍšâ ›5Ã’Ô©ˆtM±b“º“‹;Z‹ýçÚŽ„ÇF¥Té3‰ù:¢HUˆ|Bš¶,µÜ0£¢3µ¸°u>.M ´ø¡ÇBÙ¡Ç2æð·TY‡Qc(xèÈìzí º†LzµŸ³Ý”xè*?u-2ìêéÂ軟5ŸIav½ó„4®èà ¦é¾=Sst.[ÞgEן[ÌÔš‹ó„¹¢¡ŸœD-×f5Š +wOVŸµ§´¸ºãzÁnZ½Â9;z!Q¸ +ôYŠbË´ìfÛ"kmc4SÏ-˜hÖàüò« ‚žéÒíGAOž|ë [®ýΚ ²á¹|p‚ºHÂ#V£N´…‘R:QZÔ`Î5ŸXÆô^Y+é]…si[¸þâŽ;vâÃ?zs‡¾§Å»ž¯Ž“\9¸ týé…ÔŽ‡«¨î‡«Øo¼ÈX¯=dÃlÙ9jYÎxÈ|öB×–9ÿ*„½ô"‚>ùšÁ1Ñ‘*Þc)Ž-ÖÐ1ªž òp èÜGŒ§“·O¤s¦€n™7NÀDc߯Jol0À¶0•)ÆÚK ¡o…zïËVžCÅæiQÉ%ºLAŽç‡p>ØbÂd6ùÈÚcó©î[«˜Þg.̾W¾ìþoôžï܉ÞöÁ×Ìg߉¡OCÒûtµ¤ñŒ­høôA- k¾™/ß)Ä;?¬5^±õÿ¼ +öŸÎ( IÈÑbªŽÌ‘ ¾w¦v}pÝLªúÐlªâ³Y’¦k‹Eýß9 +÷ýºNœÖnè‚–ÍYŒlg û™‹ÐªÅK‘››òö @n^8¶áüØ'C> òò /!†%¨I2 A{ü ôhƒÖ"hý±t˜*%¾‡ŠP%ü¸Ö +¸¾§ntÿ3gÐì¦ t˜ª=3Ù½OäF¥`»lÅ 5—ß>4±ø}$Òãåü±ç2æÀ÷jðwjÏOžÐFwÜs€sÈÖ™ÑU»¬Å;®Ù1ßò§_†‹üÕSTsÎFR3²@Ø÷Æ>°ï­£¸lß4axކORõ‘„«CÓÕ©Äíú¢ ÙšKìÑ¢©³Ñªå.Èsö›bŒHІ—mÙk#ï¾æ!m»µ¸k Cz…"‰ +Dx˜ù fÐëº/|åÎÙÐGŠãÀT&·É”)î²”t?]EïÿàK ÿàA×}aËnî0eðôâÙ´jCÒ“—Û>…ä7_-!º‚UÇæRÍgÓ §2eÃÓ銃3Å»^­¥ÀþNHíüÉ•ÚrÄô2DŠd5³^Uœ©NÅTè·Çþ9±X4õÄÁ™ ³úôúÂñln9[q̆j}°ì 4q^1•I®ž@'UèÓqùÚTlöxÐŽdKXKv(*SKÊ…«Ê£2´…ý3ØŽ‘U õÚtn›)]±gÕÿx-Ó{߉ÝóÜú\¹ê½6 'H÷?q–î»/f=‰÷¼qíÿÑ…>ù–‘^~/=ót=»ïµ@¼ç±»eКÍoœLÕ™'9ðÁ›ô.ŸüN&9ü;®;î/§5Pi†Tß»µ’·ëèækv’Ê#³è¼.3qùÑ’ô6#gçd¿Ðy¬ñCÀñÖ—XŒ¿âØ#VD¨ÍÒÝD£“‰Mš©Ä.±ßdÛ2ƒ_{Rý#kø´’‰\b–_ÒfI7ž^Än?µnÂoèwñîo×qíæÌæ:c®ôàL`mÐYõÆlV‹)ÄI6¿ÍŒhêlÆõ`:ÎÅ‹wMcóÚ̈–dfã$:!K‹N(Ö!z;•ŸÛ¯©Û ¨¨ìq 5ï>|Ш¯ÏÒ„>iÐÛã*Ïå«¿XH'ëRá*â öLÅépyÝæ0^ÄÃ?¸Š¼ó¤vçB ¾w—ô>[Ãm98´ÝA§€xé +k =D·iXSC¯<¹Áþìáçöä 9óùsN¼û3³íóù ;qCÒöÕ2êÐ[êÀŸ¼%Í×—R¹}f0¯&Éh1¢«±Ïì{¶rªóžôƒž?hGŠex¬…Æ©Q›·ÁÜ€¤ÿåºéê2*ªx¼'ë äçË#.¥r"·e`hSrÅÓð¹4áÒá‹csÆ‹ƒ6©‹ÂâÕ€ÙAwŽ:«4¤ÕCó¸º/–‚¶è}ë‚þi =J´´q¬w\^&î²GG¦åä¶ýÒJºkd¿óž|蘸åÉì¼ãÎìùÞ‹>ømwêë þî½,ÅóëUŠWJ ÿ>äâÙ îøc)ø\&·e2»v̾7~ЋKïÿÍWœ;dæîI£µöë$®J—éýÖ…üÖôŨ‚¾)’Šc3%©­†‹z¸³5¾ Ñ,Û3›ð#rÆñIÕ ëas“ hÊW xxëǯEñî‹A† ÂÏ—MMtzï[ñî7ΠmFµ=´‡ë ZtÀ,`bq]™T®Ïô˜3E8Îâú‚ž‚Én2á2·3ÙÍ&T®R·0©Û ™Mu||‘.TªGã \\à†¨,^•ͨ7†þVjà35ðÒ t<¸¢ž©„UT‹ëœököÀ>pyÍCljÉÐpaöíÇŸx"“y$çö?CšÑ0wB4„ªöÙ°å=V õD7_ +Ú3À¡qD¿÷¦†?xŠûž¯‚1fðg’óu¹¢NKÈ[¨]ß¹±¥¬»ˆk¨É€ÄVìž6 +T|®V€H>A4ß%Ò4%1yãéÂá©xl;q[ŽÌ †!÷µžÈ/GTXª_¼c*舃_  ,Ð'dËõÄ‘©ž¾òg£Uð¹°í!Ðt¥C’ÕAK†%úÙ»­‰– +|Ý24›¯˜ÅWšO´R*Í¡šÏ.!L‘¯ðbzo;q '–Í»mŸÙ³Ø}²½÷%¡_^Øq拌 ý£ +¢ Ùx~ŒQIû;ˆåü—ÏBù«Ï OjxÐqe‚C°/۠Ƥ5àøØcÁ$×L€¹*:«Íj?I˜ŠÓj?ä0g%r_çDáéby¢š7®]]½„8—Æ9¤4šð·…’ÐäýiÐ/í:,ECLG©Ò¡5øŒZc¦êÀð ÛD7__.ßÿ€—ï}Æð5Ÿ- Ú…%Ó软|ù“/‚èÓæ)=è-Gg‘¸|²¬öÉÔú ?¡wúê'ŠÊÒôô!ð‹„S†ó6»ÇôO ÆÀ”‘t=v öüèšâîgô–¡é|^§9ì›·›O,bbJu¨ ZÒxU*2C“Š…s‘¦á-àpÍãŠìg/G¶+»3èr†ªCbÕè´zCfëþ™Ljèă–*á§UÊrê€Ýgö¯°bh q½w]A‹™ø¦ä]I÷-G¢ÿsæMsòORªó¥#0ǘÄ*}<6T}qíåH#°Az๫¤ñÜB𓞞äå%@À»"× ­Ö¸S„ãLfEˆ*èR2$æCUAË›hD'dër‰éZTÈ& ¢)ý!×yyµ¼ë¼ ¿ýóE`×LdŠ胱­WØîëë@÷‹Ë­5!¹VÛå•tïÕÀaÔ›ËJz¦@^uxhÒ—d{î‰èÁo=™åú’ÐXuÂ9/Û1Cºmh>pÙÁ7>ÌÐ_ëž:-¦²½3Ùè2m6&O›ÂãO„¯èJs5§léÎÇ«ùú{ЊŽ\3˜Km"v÷7ž„yŠý ›Ó5…Íë5'ùzí— ¹ÏøÞ—žòÞ§~òÞ‡~LÏíµÀB”fÔsÅ}Ó@Ëtô`=è3–$ç¨<>m¾¾‚ïþÆïé#ï¿'¸#’î¼ë ú‰x,/”uL•ç×M‘Ö[Êö^wá»F\±mÚ“œ ç6LÙ®é8ÖÍ%zzñúÀĤ»¯aßùrCoüaÞæIAš)ë›Fâ~2öÓ[ö΂ù&oxª$~‹Ú`H%VëQë35lˆŠó7´zÕ:÷„¨(`¹ƒÓóÄ t|É9Âu­PÄ":"N²ú³ö„¶©Ú°iñ8‡s!õc[®¬äó[¦€Ž<—R¢Oæ;‹w༫@_š©¿ŸJôú½0GßТ½?º2YÛA“Q Ý€cÛçÙT=tÒÙ-‡ç€ov"èÒs‘ñA¹ÍŠün+E~‹%Ô`t(øñ _?$á‚U@â&èm7è ÓIDrËÐ,ië…U\ûõÕÀeÍQ€íWœr½Ö ¥)î:¿œ;ô„’ Þò Å­ˆQ#L|]‚‡n²Ò;>د:2ݸ}„ì¶ãóéÔb=ÐðgSŠõu _Ù„<ÈÍaî+ÞišÏO@gŒ)žÎnîŸ"‰Ü¬ Œ=3&‚.Ý÷½3ÛrßÛÔ~|V·9Ñ®xè*é¹ã5/0³`^ŒÌÕN›—w=ð­7¶ï™ Ûy{-°øõÙã묦çÖ:ÉÀƒ5  +s"ÄÿÂy.ßkÍt=[+ïyäÍô}ã†ßï +ºŠÍ5¦\ØF ÷0ç$Û~l Ó7ê,¼+ ¼ÇH»ï¸Ó7€ÙÊÕ±­;®dŸ5á^•6W:ð­/?ôÙù'wªïåZ®ìÐ,2\>dMôí†_ÇnGÈ>{Do¿¸ÜÇH®›H%nÑ…Z7×€À]pëU@‘ÛÔdÄãÏ':’ÀŒÁv'b£Tý¼ÄDïØ* _(¯>¶XQºk6·©Ê@šX9QšÝnÆvÝ_'ë½ëÅÖ_±“em7%ZÈ_Aïzc¡>0θì,ªçe_ +e'†MµÂË?ØYGѲØÆ©q‰ )Úa +Ç+Ïíž*O¯7 TEn«%èÁB¬%Ì oAŸ°ð2Ë ø†+ö²÷=‚:ïúHÛGœË;©L_‘ÕnB4Æij› \ ¢Å]y`áaƒØùÌ“~" ÚõHÌõ}ãÎâMØY8fÎPvû`gIäá„%û'v–døW¨áþV€Er¥1vV)a¶MJž°)žèÒLýg°½?ØY²ÎGn|Ï37bÇxŒ‹Ø8U ¶-`ÍÃ{dÀjØ\; òiiQï4Ø'.*O‹‹È|yyÇ}7¾÷…pè(x¬ª˜ W!ü`†Wì™ >†è Ö ÏçOÛI»ïºƒ®.×ÿÂ4™®'ëpÌ#ºóTýÒ7ÿ‡îüÀ·òcÏÂÂ.ŸË—í~(`kÌ%ó†Ày(Ù=N­7$óŠ5Ç0-ç—Ã\¸(b“:hó8/‡¸.ï(€kë­ ç$¼bààQ©*–…“\hs¯OÒ.áÕ:·°³ª€…ó»Ä=Ya«hÆÊ³pÜûÈÎbcKuD8öw“ š Weåøo…ªqaq µÌ*°mn{­6$|<ÇÈœHJÙ*zƒ:ð™@Ó›è^·œ]N´¸³…ã4<‚Ê'¯.(»nŠlë ßxq%ZÜ•Cs€%Û}O92ÜËb²qÎ_¢ÃGiqþPǨ#Ñ™æ3è\Ã~ײÍZXFø½q›µÆæ3 ãC“¯ ì(YB¶Î;«Á’ÝóÐæ¹4`g)P<“´qÀé‚ûnÀ ƒ8$‹K×þÈΚ ì,¢Wú;+"{¼"§gª´îŒ¢hx¶ Ç3¢Ã¿¡P›p»²:¦†bV¥1p,åM– ¥/ÏÆ¾_Wit±±ïº³+àý8N{ÁØûsú,A³ì›MÀ¶š^n ß:0;¨{Ä'dÇÝR7õßý‡î<ý‡îüÞ§¢ÿª;ÿÈtç'aíÅ )Ä4`hÊrvXH ¦I¢Ò5aNB²aó8nS­!ÄxàfP¡*:XEµâ½Ö|ý­•çòY½S þÛ߬)f‚UD")Âv¢N8¬K&{Z©,¿ÍRžV7Ækƒ1¿õÈ<¦ÿ‰p‰`~QŒó`Ëç\à+A~î^„%æd*æì¬é0G1Q @î"_"U!>É#2ÇË£²´äÑZÒˆMãøÈÌñà£ÅMøÔySdm–à?Ù„L-ˆ÷„wÏ-×zÎ?DŸ~S¥!ä­2œëc?0OÖtÊ^ºí ­´êÀ<Âl+í˜Æìºëko`®´¸¹ÔZC&ð͸®»Î“ 4:_[›§ëF«¤:Ì·öo^¿%³ië*,A°œpÌ$1òvVÏ]¾ÿžÌ¥üÁ΂x+Ý´Ýì™Ïª6^°³€— µÙ°³ŠÆØY +\ïǪC|Q¤ÖNâÃS5a삆¿lc!ä@àsåEmS Ïls“™"g»ö“!vða™ã{ ¿?(m› ¼ôÖÿùýPÇËJ{f€æ6aöA®ÑtÁAÞ}Á5¨|ïï™°`·œÍìzëÁ~/Y`ǼÇN˜`Ú¿°“nÝ5{Œ»ž¬¬DàÀ| Üóò§x$à#TýÅR$ä"U v„ùì± ›Ã>ƒ­»¸rI>¡\/P‚üýä BŒ"JMžUe¢(Ù18èP—¶)Äò60w@X°åûg†=¬)€š•Ú÷½7×pnðæk%¹ U`gI1ÀÎÂ6þ‰°³¼ñßÃ`¿Ë7UÉR‹&ÅfèG룑OÔdÃ4¤ñ8~» ûd¾b`&0¡FæÎkÖ9º–ë¼¾ø®ÒôFE~Ÿ0*øÞ[îçÃ}È©@››ð ·vÍ`zG!¶FB9Î; +vXpéøËÑç[#.ŠÜ& yL¾NpF£YP6®ë+m䃷%н÷¥ÒÝÏ…4h'wܱ'ì,Âoß;›ê¸DØYlûMGÂÎÊmv–š/ŒEY‚*—¿Ë´º ›zëÂÎ’?ØYEcì,ù?³³þ`g¥Žc‚¢Õ(×–2œ·CÎ ìøü– ï ü ÈI€&O+Çã³ÑØ +äý¸îà£ðûƒ7¨Qt¸ +p© g Üxõ±ùäL œ—Œéïž)ÃçR—¯CødÑ›Æó[šÝfF7_ZÆ¿ö•ô\&!GîK1 _.¡Û®¯v–|ø1#Ùù ØYì¶ýs¡çƒ+Ý3ƒËë³-k†Ì9Ÿ™KØYÀ +ù¬*lŸåýø˜ðñ;«xŒÅ7¾œm¿°b™oÅ1_ž×nIrMì÷Ùù0ÓzÚŽ¯ÃÇ]Þ;/í›NX󥃳d§–s­çW®-ÜsI)3Päáú~C6\÷ˆ3ß{ÇîYCïÀŸU{l>ðì€ó¼'Y剅òÌ63&2Nƒ¯Ý?æ4dûîÑ‘¹§NT祄ï„k,RkT]Àw\[Ë·\v„pPe1Úò´Jc®ç¦kPßm!aÉl®3\€ÆõP ×ëlÛŒÃæGó$#œÓlmyn»°» æãó»-¹Á—îž=&dž©hÈš{…ùË„\m>)_ò0€Á¶$­>8îgÆ{|¡žNò}ÈÁ¤e‡ç°­×aNDZÚ?˜ß¿Yìã€-çêQâ‹Z-€YMú\ê//'¼ ÌjÂ@•gTM" f|m åëqÜÆ5äû„cyQi¯‹Ï=©€‡›‰ÛéG¦»·íȘÓ~$“U°}w\¸ xu‰ˆGpÿŠ0jò¦ÆpÞ ‹+Ö%ó ÿÄÎbÏ.#u[a»_wb äã’®»P¿K"35%8ÇgÓ;L€•&-ÿÈâÄuÇÓ¸?ØY%ÝÓmÄÁ˜j;Cë²â]ÖcŸÛ7ìÔ‚À¡®Þ3‡«;b˶Ÿ³Ç6æÀ5ž%9 ™³ªš ŸAØpeØîñ߃\€ø6àNá1ÊÖàZ¾ïî:é»4}à_ª{ÄÖØÁ=wYÕ‰…dÝdFþþÀ=qȉ«"ŸJ ;x%R±{4¸í‚ë!gØgðE²Ü.K|-ñ1às¿¥¬uã¢òÆKËÌ&5sû9Gifƒ‰X±A•Á95aXXw‹Åö6.a£U%’ œŠ‘X¤@Ldæ8ÈḘ֯–ü®'lj)¹ +ayâ¿%ÝÒo |+X¿D˜DÕ§Ò-7–s˜r¤Ïײ0ÅFÅjk Χ´öóElÍgóa.b4«Eɓԣ ÷Ð¥eç> +¹× LªÎiÀYƒ¹mè%ãëÎÚÁ=+Â<„9L°‹òód%{g‡Z^Ðcëo¸¦sc¹%Gƒ³åUŸÙ‚Ý“k óMÀã*ê˜ +s×|ÿ}ì¿rÉz|t–š¬!M«ŸëzØ}/äI¥» ØöÑU„Ùs„;}l1Ûuc ×yc­lËž9„iÌ[œó‘œµúà\X_>@ZÐj ,¶ùô2z×SWªýÊr¸¿ ÷›I¯cl‰‰IUû矇\JšQb@ò”œæ)òâ.+rOûwºýÜrªùä"8?ÀY‡z^,S~aªà¸B|^Y¬a™C¸ApÜ8$1{¶f¿ ‹ós\·,ƒ|BÄaÿ„óP&*{ì7¬=cw?ó óÖ;n¯f›Î/ƒ±ñ‹­°f{»ÀZOÙþG [ÁŽøêìí&³Â烯%¬½Þ¬ qæ® îïºê >•Ü›‰Pƒºb,|>‘ k2`.8ElðF ±(hŒ‰˜Õ2˜*pLpoŒ‰Ü îïãsZ)â7b»€{ÌéÛŒÆxæŸ/”Ví› s¨prFir‘>abá 9웼lhŽ´ñÌ +˜Ÿ‘–aûÃû'+?2—Ëh˜k"ظ\mip,ñçƒÿÊéœqR +,û„˜¿ä¾\Ì#ÂÖ°á²Z'CMî#çâë 2àåÕ²…|„p«Ù^ºÓ×(„Ï÷ÎÁ—O×uG`Á{H½µ*¶[È€Aw?]K︻ +|ž´ +çÀU‚X»í°-Ý÷ÄY¶ç®81p¯ž°¾R+ ÉÚ˜k„5@ûm¸2œ×ß~ÿÜå¾»k$]7VÒMç–’{:é8v€íà16Æ7î0'÷a>Ög7›åÈSaÕu…äN|ùàL*,CC"ߨµp« ç&›µÇ™&SçŸ<¬·ªØ3KVØdNî•5_Âv__Ë5·‡ûôLXަ€Û B­Ç±¬d§ÕqÅ>ŸÜ¯ÉÁößecŒ+°¢·ï·¡º¯9Rí—WP­í •ÍÖ>&—¡%ݲsáÃÁ’Â=3ø 8†ÆêÈ2ZLU(–6ÎG¹ê؇˜6‰k.]¸÷þxSÒÄLvc¹¾4­Úˆ/êÇ>ªË‚ÌóᚉÔø}pŽ€/-ð¡@1… †Úê]8ï'ÁýVÛ,Ÿ©ElÓøœI‹º§ÂZ>>[[ñ¼ñärÈW€§õ ¬Ù’•XÃÚ W°p¿XšÞjµ3øoÈ# 7}S¥!Ys,øômÆ8Ž“8¼WìS¸ÌF`:ž0¬WÌí Ìnä>À¹…9ÚÍF„ÕD|ðçKçæLp +cœÛ~bÌûû8¹V,̳ã1&MÃç®Û®O /Ä5Ð2¦ñË%p!'d:¾\Á×âÏÀÇIxbÀþ0ÌóÀô‡>:&çÛ°–¶ Ÿ·­Ã³EGxepŸ.«Òê$`×ÁØ&çüö£óÉzàÊ}3a½+pAëa|‘Ÿ[ðWòü®©$.U¶%Lp|ÌÜÖžÄN+v[ÓÛNͧ«OÌeÓ!Ÿ#Çë^:o8Âx"Œ­¨D à„‹†¾^+ùì›nènð¹/]»•¦ ý!ÿák7 8=8Ì%ã؃ åúd¿É¸>¾Hùiû´}Ú>mŸ¶OÛ§íÓöiû´}Ú>mŸ¶OÛ§íÓöiû´}Ú>mŸ¶OÛ§íÓöiû´}Ú>mŸ¶OÛ§íÓöiû´}Ú>mŸ¶OÛ§íÓöÿó6k–{|¸[HJˆž6륧=ËÙ{y~F²1%"YO;?´È99Å-:,%:!>$9ÃÊ‘<ÇúûQÞnVŽV6~!ÉA‹ƒV͵Zeeãì½dq~~u®ÕøÝÅ —ÚY-E„ÄZÙŒ}°~ÝJŸ‡…ÄF|üÝUðŸž6Eve%ìŠKò¦ë…!)ømñŸu‰ÀoüÏÏÛPññ!qáVäi+ü¼Õò¹z‹­œõ´[±ið¿s„žö&øf‰ÕbòÍ€Ÿ|ðwðsiVK[ù[Iå‹­ÂñY‘ž¶­½Ã²åVä¿8øi¥ƒÝÂ+Çžðûç'>~õûÇ[þËßÿŸv¾IúxÒ=¢c#?~OŽïK`3ïë©§½È-"5:,ÂÕŸóµbñ…‘ZÙ’3K¾ù§\ºtá²ÅööVr«%øçKáh×ÿ«oW?¾íã—•Vvx'–¬$§ÎΊ|Þ×YdGÁz­ì–¬X±‘·¶—7ƒÜ]ý‘·?ƒüÅá*B&Jþ|¨ª€ +Q  SñDªxùòÈÃM„||¥H$Y¯"ŽÈÓ„ÖJIdަ$2[Sžª!”%©º; кÕ^ÈÛƒCtŒJ€"I5@£êáÃ"7ç@äå!D »&”¯WElÔ IT£â +µ%Jµ™¾¢ ä/E 5%KQ—D§«û‘¿í(ÇŸ!Fîë¼ñW +ä¢T¡Õ–Åûù“ß ä¢UèÈ MO‘gVO™$E~ÇTh߇öZ" [ mÖ¤fc•´´BK2,w†Pyqû4hoL:4I] +-Ù ³›¥ r´¤­³öÈbh…¶5>.G›È^à¯Ò ™ZÒDE©7 +"‡¿mOëÓÇó‘5ñ%úòdü÷7U‚ +“˜£Cä"25ÅÐÆL+T(i˜*H œž¤mŒÐªÌE$k‚<·ˆâ«Æ%o3€:z“&•Ldk@ö‹‹ÉÖ‚MmK‚UÄ|¨ + 1øø2µeÙµ¦²Šá¹òü¾iÐþ(‹VaÂ6i€œ9öòݳäÐÚ»´¢ÂùLÞj@d“r»,¥E»§s¹S˜MeúlJ-~¾ÎˆË¨3f¢òÇÊãÕ@*–KÌÓ%29­fdé9‘É)5 çÚò[§@û,Ù'KäAÿ:(Fæ‚UA’Q(Rén~FªE!*¾B™'1´Cp±DBÒßOŠü¡à%Aв*–Æ©IðñÐaøœâŸA~ÓÝÍAK+HÉ2Ñ¥ÚTt¹¶$4]ä ™*AÅ5Ûô #hÙf7Ö†%©ùøóÈÅS€ü¡¥6$C“¯™À¥l3`ãJt%l‚*`!)jÞø÷¼]A8Xä‘`?@I”ªÎÈÕ™ÈtMÙ†|y\ž®tSÙÄ Ü:°¹iÒ¬:Xâ.ÁÇ‹÷AUš¾ÝX–³Ã\^Ðkò ò´jc„$ZÆ`?\lš¦)ÛÜ1Ÿ_s)Haä¶ZÈšÎ9HëNÙÉskÌàw8l;\|º´19”¢.Òš?&ƒÐ1 l>(³ÞL‘”­'ONב§WƒL‘ØX¨2LÈF <é:(Z ‹× R”1yÚlr®.´p*rZ, µ˜O)Ò—FæhY¢üfshó’¥×ó±9ÚÌúš FÚ°íÓQñêlD’ÈLHÓ±m¤–@›¾¼bÿ|iÍ‘…ò´f>.W‡MÈÑ;‡ÖA@‚öÒ˜ÑhBZ+b‹uÁ6eù½ÓˆÔVó¥•|ûÈjhärÇä)˜¤"]±_ l¤Ý9Û3´ü–öÏù‚‹ÏÖ&í-™%†ò‚®iܦò‰Ü†´ñ¤}Zmñu#-€‘±\v9W¤#ä#T=œ|°ô@"7yªºˆOT“ð1øZ¦¨Sø!â7¨úð(À—Ãæ(âÕˆLMDóa*BJ@âö$bÙðÜqÐòÃÄ•é‚ì|Ž +W d¢Tˆt3>h“æRŒ¸¨B-±Iž\e(‹ËÖ‘ÅdhAû«"³Æ„ ƒöŠLMh­å²·‘ö4é€ö||}´ Ž_" ”^e,K©0„vG"ß—Ú8‰\§ì¦É|ÍÉEÐ^ íßÐþ*ÍÀçd/°ï…yÙ^ù¶Kå[÷Εùˆ³åÙІŸ¯K| öŸc­ÂØ'cŸ í9`W¤_+6&s<´ºƒÍÈÓŠ  ]–´äã'B %a±-zÑÈßO$<~?öItX²†D© +þ‡HD¥ûß, Ù FGÄ©C»µ¯@‚ÙpU&b³&§Rºð·AÒlŒN×€öb[ЖEZ©Šð>WM`áøJt¥©ÕF qR> ³!M©1)Ao7ODÉbU¥ÐªU M'©ƒ$‘^ű—HO`_>B“© ² Òäâ àAޔݭm²òkh•ÿ¶ÅÇ`ûÄד´Zåµ™ƒ´ðrQYã‰dYÚvÒV¨(Ý=›´gãë&Ëj1Ë º§ÉÊfâüÀdŒd[fɪ/ß$Û²Ï|‘a³6´ŸŠ}-HEP!‰øú­'RÄàëÈ~ÃõÀïÖt8 ¹.f*€u`£q\Ø« ’¶LPŠ:š© RN ÃGc¿HÉ¢U!vIâé'¹Éx\Gí7±L—Hä4MfÓ*  ÝšÂ¹‘®ÁÄ—ë‚Ü·õðiÙ"5–¢Áa_JÚQñ˜ ‚¼dÁ~7µš@˼¤×ØU"g€ý$œ¤AË#ƤÀñ±@\†Öq"›Nò@Y\žiM%ÇÝ`Br@ð‘é8–çâœ0¿Í‚Ø3ÈÑà×áÚƒ$¿›Öd¹Ș•ÙjFÚqü†Ü®!‘mÉÁy\F ‘ÚT2Q–ZaD$—°m€"ñ7Û ´"‚…1”ÓlFÚ¾Aò*£ÜP^Ô3]VÔm-äuW— m ­‚0n@òEJ$$:§Â~iÄÆv{¤]² ´F‚mü£-¶â  H5ƒì[yĤ¸AnZá+øLÒÆ í}–ÐÚJZ6±­\È•ƒÌ˘Œöåø\`û2ß²³lr±Áp” Yƒì ´`Bn~O,Ôƒ–FbÉØfS« ‰L#<—R¤GmÈÏ„aß2¹ÐÆ_ˆÇöǤ½dÊŠõ@vÆþ‰Ù8Î <À—àsj ˆÇñÇW)HïŤkµâ}¨9½ˆŒ-\€o$ã ¿¾r¾êäB¦í†»ý‹EDθúø<Ò2™°EŸÛÜ1™Ûúù<öÿ°öpUmëÚøìN0·ØÝ€HÃZkÖ*@[AE¥;¤;݈`'!"Ý„”½Ã}ΙÿñÜçžïÞû¿ß¹¿ß¿¹µØ2çïxßçyǘÏW¿‡ }»™=8Ñ€yú„¼È&LAtg04w<ŽŽïGÆxä¤ë°¼"X^žBøÒ +«ª_h>Ší¢gKÝ®,†\y‡19*²K/]i‰›D(ÇAlŠAJö’Ï4ZÄ{¢q„{Eã 1²ønxTî šXªa!áiçqðÈ+–_€ãuÖw2ÜKä<,q~y"Ì#öÒÏ ¸I…˜9F|Bqú—œ ~\aHÕ®ùPû/ùNžrX²2øþjâÆÉ¢[‡à\‰‹þSY;ÿi`£ydV°½€ßíe`ŸÀ¸&ÍÅ’ g=&âë³ôš„ë³ÇÕ… iù¤fáñiÒÜs,‘[Ò|6(o5<òÌœEãwÄq4ŒœHéÀã°`qr¤bìE¬…ïDÈ© ½?æî ÷6\‘…¼‰8Ä-È{ÓÇœÇðÁÎÂüâÈ•P+„hþãøôJ_dĘã¡Zn F_WïØSr<Ä¿â!«,Ãð×£¯Þy+A?Rë}g9X%€ ~|ú"ÂÇøûàiÂË×—0WL6ã3¬ÄÀú†±ŸÎ8%̆ƒrHšöK ¥v|ÄÃÀz dâËËÀ&„'=#˜âdR”¿ÍmGyÑùi8P­€ú(F|çK <í4Nh4ËG$µ¨bþ}Ìf ®‰h|É„š ßO…<^ ÒòŸ8x¤(A\ òr€­'ør ª[“ >'âñ T³ónÉ1­ÃuÕ!ª/‡1æ@±ŒmQÂðãã·à:„0–ß<‰xà ۱‹ ÚÉþ|K¹€<š¿“‡ðcÊ?ÿ˜/0§ ? =S`‰,ô>7¯Œ…`}RêTà­eP¿Aö æ;ü˜; ‹Ò< Š5\ç@¢ûÕ˜gX¾ýM°BœÙø¤ƒqF9 j2ÂÂcD¾wWÂü‚Ú ²³ìY¿IXå~À‡´é‰á¤¹ÅpÁ!ËḜóD³ 2» ÈC¼|HJÐj8ô&èÓîã(«á†À×E§å èCrÀÇ€OÁ}[ȃl$–©E<=f?dü° Hϸ ŽëŽÆpšWΰa wãùyÌ1x&™\½›ÉêÓäü¦ÎOìØò›Ø"bÐ&b†àðÙáF¬xØÆÑ‘¯7³!ùY«À©ä¡³# ‡R0„–Žã!ob>ì=Ä¥£ç‚t¡ô"ÂöãÅg.ü)¶õž|lZ@Rææ +ˆk#Œ4$@êZraK²Qé*°BÁ™—Âgà\‹jØ¢`lqrö`Öb6$oË?{LÂrÂ^nf2º°9mFÔ•V,EŠåd,¼&¾ÆÒµçÜ&€-¾÷(ö ®wAî„z vÀ-è“è÷!WB_ÈÒ{"uÔvÆ!€ ¬Â¦‚¥Æ‰ó°¼5Â8 Ï‚s4üÂÕ`§€%`Ï{N¢O»Œ…¹±‰s,š bàûðÕ- Æ]`b=ø3XÙÍŸ #Àzd¬¬¹{Ây,ämåè€Ì ÆŒ(A:¤+¬e +h.9@ú¨Ãhñj#Äi ùÆ„‘Ðl–²D¯CîcŽ¢Ø=l7ä*¯ƒ¼<):+r€ H™ÛŒ„y(097Ï1”c¡o ¹ñ½á¸þá:ï1lú xªÕ¿Fù +ä/"^nÁÒJ +œq\} ¯µé1·ûùäÍ_u©ðòÍ`åóxœ_Š­SÁ¤æèà‡«™ó—'A-¢¡¿ ²,€[!]R”ÀîJŒê-ôž¤Îñó‹BþybÄ×G‰-‰Àý kò!ÔrœCANdw1_÷š +ò¸Ø¾À÷ÚrÌâç‰Ý掅ž¡Ø6HAb6$åè: ãeï´ETRÅl·tÑo +ô3±ä„Wì‘oæ2:òÍ*½MÊx¿[JƾÝΆ¼Ü2ŠÂ^ã¡Ö‚­yÌ~X!^¥£ßncC 6³ö13ÒÇìFƒÔ9SºƒJiÚ‹e\ÁÖË1iã8„|¬dde;Ø„zaR­š0¡B$R†dQ]q‰› ¼ËL&Ô%°]qOWÂø"¿ÜUlГµLTñVm}½ ˆ =Á_Gqs +[ Þeë_ xCœñ'[ÃsÅ=ôy ŸÀZxO"ÞRèзÜKDùÓÌv$p:‘Ù#Ö*ck¡EÀdÈË€w ' Rñ“ /´ œ vë|ÆLŽ=æ8FxÖg²èãhˆM”*9ç‰{u  ½]Üï´›)ö½5$!<ðÂpÜ'ÖÃr)çÝ&aé`Ä_ÈøâmäõÚÔ­A}AfŸ +m:âÏP|Bú² 8î–‡yŽòÆç Må9÷ô¡‡äsmî'áþOÔl!…¾ È; ¡×g½„7_é#èK¬PMüh+›9$q„ð+Ê“˜CyƒÔàÍe`ñxËê_?ã4N²’îWaI4,ƒ”º$"A²d“Ûé¬5â/}¦@•¹è9¤Ç±¥ŽßÝ`¡ŒùH\?X 6BÛ”Ù€a¼ N°þy«èä÷*LTÕvÆ-㨋B»øYLÄÃõdJƒ2X†±^é ˜ AS©ã¨æY!œã™¦ó@W©J'Ôj÷°‘…Û°ÄËiˆÏ "§™ÂÐÛkÁb¤Œ°dÈÅt?p¸À§ká~ d¥›)Í»°ŒÙ DZôÁ3#€¯3ÀסN"Ü=ü¿$õ1–²›çÀZCf,ý&‰lc‡øúßɸLjr.Ô ¯^¾½ŒyºVè›»RxQ¦À˜_ïc+ tnRÛØ!Ù^toÄ¢@>WplqN˃$‘å[è‘ ‡‡ù":b;Ö„$Þé?ùºý8è×à^!Êe¬WÖ"Ü#îvÄjÈCl +¡÷Ó†‚Š|²ž¾Þ¡+ºß(¥²>h‚Ìî_6¬¹ÓhÚa³sÃÓ ÏO…º%±)Eàç°6%Fqˆe³@Êò§[Ê}ÅòŸÐ+€û嚀%=ÊýMÙ ^‡ðä[,5Ä×'Ç‚sò‘.qó„ÞÙKw^y³#¿!Ù«i¸Çœrÿ•Àé…¹«!'R±ÅÛ˜Wë˜ÀþÓî“)Ę£6£°T¤GÚÀ'ì‘ £ŒÝ’RÑE[Áʆñ½»Œ¶œ5 z×¢Óˆ{»æ,:ç(AÆ\ÕtN‹5:ñJT³A®M ¶”[*°®ÇUí%Ö«= ` È#`Qrêx^£ºÆ„£Úóz+•å1¾µU„1ë°¿\ù¸—ѱû/¾˜GŠî)ðulgqÍùS¶c±t'Ê·ÂÐëEîIJb×äùˆ/9GÀ  û5`…ñrøh5X1‚•4æmˆ+<"Øщõ{_ßž ž„ûû¢3ÿäëlȽµ`«ý7Àé0W ñu˜/Nã@¯¯¡q„81vI_(vŽž‹ùº)âë`EÆ÷½²c¾ ¯w˜(ô»ºK*AŸ ÛPd/¦Tª‹²ë …·šI&³KKøf¶¡8†îù!„ÅÍÎYÈSâ³òCr«ˆû£sÎl€¯¦þ5Ë2Dô3 Ÿ„âAøpÈïú +±«l®óõ Ì×AfÎóuè!Ÿž9åa°^¤e/7ƒeôÖ¡O‰¹Â¥˜«ƒŒô\ãæ2`³„ +endstream endobj 65 0 obj <>stream +r!•X±ìì¨äe„I†l(&ƒyŠ{¶'Ç‘ÒÃØ†Bô/6`ÃÎ:_ùňD\Ù€$hSËŸ6^DV(Û…(‚ …ÈÂvÌlqâœö `bÊòÚ …(¾VU˜Ô¬×²äPCsô÷­ü§‚ÔÈnA^K*qìÀû¸çŠeë|r–’‰Õ»É¬¾ý` VÔbÀDpÏ<®/•º%*I,Ü'Bl¶Á²ˆ²7Û˜¤ +e&îí.,} × Ò™7±Ø‚2I ˇ&×íg5Á½¡e¯6ãøô½± ÖhXŸ[˰¼[àó5¬K¶uÆs¼¬’Çä ¿Š]Ó”`¡&A_ƒ>n?dlIS›°¶0d ª€×»nÀçý‡ó‡£Ü%F¹ò"–{Cñ‡m¡o{(¦À: äo± …w’Ò?m(üÀ†"pÈê?ä»xÌÿÀ†‚E\°¹‘¾c ¨30¡60ˆ{‚$+ÄΓ§áu:àöÇmñ|Â=tçØ¹¬×õŬÿý•Cù ý}ïÌh¨rj°~€94âF€ ðW,yxgÌYœK!wBýŒ€x¹al€Þ~ޝ%ÆÏ™V6èù:Ü8å4ð<¶r°ôž,=‰æÀÑÓ#0oÃ6ó˜ì]\?. …„048¦`=çÈÛœO?m(f \›ô/ +sûÑCRšÏ6K<®/!ìÂÚ@q"èyºg-Ä09+ÁþŒN(Ýń孛ø]\fý¬$cª·UÕÄvÒ<èWá5ÀݯÚä(‰'šß(gBoËßõ²©5^sÛaF£•ú^•AÜKÖ"<R¡SÀ†öJ@Ÿ8?sÆgî?À÷ˆ _aÀ7¦­NCÏSl¸©cv£ÀŠöðÑܥќ»Hè'ÁžÀQ` –À‰ Ç€^ rÂÀðô/¦bâ*w‹ü¯Å–èžÑñ¥»ÈŒU2¾|?­yà4è]"¼­¯©…m(ˆ«ó©ÚP(An€µ+} a¤+Âñ  ÛIA_ÒüîÍÀÚ9Ä&æÕ ÁyôÂ(èa‰€ß£|}ç’·Ÿìe ÕŠ×ÊO õº$—3–b‰ìK!3†¤/ŒÆxÍ1°%‚þ§è Š_—’3^qÿ jkÐ=l¿‚ûög‡öV°§ÀBÕzè;c«õKSÉCÃao¶©8çö6)Õj¢´-Ú.Fñ/ +ô¼<ŽèCÚÎ|60b絡p²¡@5ÛH ¸‘Z#tÄv4søìHÜ_pIžÜ[ yýwŒ=n,ÆqwÆw"ä°g%SºUè”NU:ìÕÜï·òšD]éÚó”µr™ëO0Å8…+bKT[™FÃàÔ`ÿöZ IN¥Õ¨`ÙuQ.D•304 ôu Äû‡ÏõàÃÀý(Kÿ‰Á²ô€&Mìß©CìÛs€ÛVèµò}XŒXCß Ö°àß Œål¿¢š ýB°ÊöÐ ^V¡`j&`r¨ÀyA"î –ÍhUÜìÓBsj Øpƒ …HƒƒO³Ø>ÿÙklC¡Mº:Áµ-»”¯qòè¥Ñ0Þx]ÃìôüÕÜbÜ+ÑITÀ:÷Œý8êÈœ‡0¶´Eûj7΋€9¡× ¶`áO62²—[g‚4#Œ)äZöhãÄiðL¼Žê¯ë¨X2AÒ–Žx·…u¼2—<å5¤ã©ó!“!>yâcršê„ªš&¡¥iD°Çñz(àN:¹F$nA2zX| +,,Gb>ô`#ìù‚¥Zd—†k§”i2á[Ĩ¶áÞ»Màt¼þ{9œA*6M‰L®ÞæwhaŠÜÕ3ä?m(¬ÚPœ-Á67ׂŒ¿ø¼÷è­ñÑ|¢`ï š‡˜9Ø ¸ñÈ¥QÐkã‘‚9xr¸øbÈ ,{.<2C®‚xÅy$W£_ì†ço“º¤(ÁxBÿì* §ˆ½’‚Œ² æñzæz‹ðJ³Œ/ØYá\W¦,É®à “+÷³²[!70ÙõÚ û ½K¼$TýrVþ kvÙP0؆¢n¯0£[[”Õf@e÷k’WšTØËY‹a‡:ê8JpÔz$yÜ}Ì_6t|Ón1âe§$`ts­Ä-t.®ï¨– Cn¬†=Ý,ö»µ +ã`À¨và½=(ßÃXÑ Å»…‰•jlJ™R®ã ½g:¼`#¬ÝˆÀRÛóæR2¡aV¸ž¹œ»”zºç(ÿ{+Àæ’ñ»¶0Ææ°x,Ü3³1e»Ù„*à<´­Lx¬×ïÁó°<ìÛC1!”=ß.J®=Àd·ëHîÖ˜Jn´éÀ'«h›EÚ*t*yÖ"¬AðÍ,†1&ÃŒPœa@óe!ä5!šßЋ‚õ"mŠ€ßÃV.J|ﯕz^Y‚ñÌ9¿)°_¬+D‰åjÂüMx?¬Ùµéϵ^°ó‹V2¦` ñhØPˆm¢qz°çHê³@r9m‰$ wìéÂ4Éópïú@¼§à»ƒl6ðqÜÃYÞóž“ðµ÷TèƒCoEW­.Š)Ù3ÄÙQý¶…ý·WJ¼Ò—@Ï[Zâuhÿ©ÐÛH6(gs­VOø¼úôqÙ °ÔÑÔ%ÀvïeK-Ý/ɨÕ^©Ñ&“ò·cÛH°éŽ,Þ +rü ×#ÀÒ +aèÿYg Îfªë¢d ⦇‹¯7Rä•vU°¡ësÆ#mþÐúDú<ê\ðd°gg|Ÿ­Ä66Ó0 +È\=/±{ü|lCá1dC!’=Ü +VX¦a‰â®)JØò ñT,cŒÞg“«TÙÔZuÌORšUaͬ‚ÀJ +ÿ?¬ôæþÓJ/­Köýèóè!¹r¼Ï q¾ö5Àß9öØ +Qj“&Z¸îÄ^;XK޽4¨‡ˆ#‰nÖR¦_‘<¬>ÄËù  +s~±–±NR¹}àšÀ—ð:ð¹ÀÉ8;'Îùv:µU â]áAíýºØÒ”'BõÕyñi‡qR¨#`[zÂjäwÉÙ¼¯Xä>K0ÃÚì-ƒ=?¨. +A¾Ù/o•Ä%c¬ þÅÖo°F ë+h,a¯äÀ`Ù'¶tŸ„{ýGLj¬"¾¶Xòxä?lï6è`S†øk@.–‡†Øemüp_ú&Ò„† ¡cÂà$Ћ‚ý>Æ—BM,]&‰íü°ìþOÛH[2«y¿ôAéa“‚"æn«Ö©ô´Ô&Ì× ·¶‘÷V‚.Ö®Öžtr£2Q°Uäsg…È3k¶ñ…5ÛpEèÑ1g<&à5ر¡ ÅëB‰óÁ2ø„ ®tXÙQ§ÜÇ’'/C12—ñ¼½,¨±½{â*Ñ¿ÿ²¡€:ûñBn­¡£Ÿoš-ñÌ^Øï¯þ*æ´¾™K™„wÊâÄ* QRÕ~:½îŸVzô_Vz9ÍFÿÕJ¯^¬ô`&žcÐ?B±ˆ%鯭ÀvS¨þþC°=ÂÖLž×Á°,dí#qü>]+tHžqù¸“Ñ¢Éú_[†m#=®/‹jÊ:j:å>z-°†¶šÁ?l5ÖÌ„¨–Ž¥7éV„Þ)<"ûa÷a›HTçÀB 씡ŸÉž@Øúñ“VC{ÕpìFƒ¬Á} +”/À†Uè>´çx +`vÄ3ð]ØË»lðþ Xo€u”ƒGÀ:¬ïÁÚô(`¯‚Ø=Y ï+ËXƒ{2_„£.M£O…÷È z¼K£C·Cܰ›ƒ^­Ä5ržØïÚJØßË€m$`fˆÕôjm°\dt(ã= +§ÝÇÃCØ£‚ûŽñ•;¡g²÷8·'†ùuùú2¼çò>ðÙ@°Ë@Üö®8ÇÌÅs¬,CóÖ‚5³È-uèš\Ó0aw×’iÕ{ÉøÒm´Ï%´MÔ Ø1d„~ÆQ/6c»"‡PEëÇÿ6Xø@ÆïÎ +*æåRöbmÕŸ‰ÐGÆÖ–þ÷Wƒ¹Ä÷úJ¼§öÃÞE˜;Þ·–Pé=û…™}zBÏûËðþ°ì\æ½q† `ƒ%ú!#^æâÀ/xnÀ:*pJàÝvÑŠpà=ýaßÖÛ§„9°î k~Ì[\÷aŒé“—Fã½­ŽÉsa¸uì–e +´åå `< lMÉãK»d) ƒK6î:¤ÍŵùŒÛ¼/9)qØi»qbT±=Þ/áŽû½øïo…^ª÷Íe˜oæ®Âv)®°¿ìµBuø Ø÷ øåmùç®±…5kX«ÇvÐÇ„õKèÂ_èó»g.Ä}!X3E¹¯åC þ?„3ØK—§à< +¶L°Ö 1ò`=¶(€~:¬sy¤.–h¯Co…Ýß%Sª”¡¯‚¯ÉXΣø ¾[oÝ_^[œ ö‡%ѺŸÌjUƒ^(ãqe>ëž®û¬ ×C&”ï¾Ü€ûÒhnÀ~=àÛçÜXkÅØ>áíÈ Ûð¼ìAÿÆj¡÷ ¼_Ö`z°‡Ž*ÜLg÷h kwÏN¡ÌŽá½’ÐS„µk˜ïBïÛËEö‰s°ŒmÄLè¡9°¯9„áçFðÚÿ¥°éØ>å7±ïÕ¸öcþ?¿Â}{Üxú1—±°úhããC{êÍÎ ‡ÞßøŒ<ôŒÉÓŽcÉ#6#Áº¬QX—”yLhþF:º|̰Xì¤`_ +òbÃÐ=ˆš5Ÿ3ìA +x²–ެØvµ˜Ï£Ü +q ûDÝ“a^ +ø¬F'ùä­‚5Å¡~À•Å`Ã%öË[ÃFnŘp˜M¸">ð>¹û«0‚¾0ª—8/¸$ýñ†¾Øö_¸‰âÝ×å`I +V>`ƒ¶ftÄãx îw@úÜ„5!Xw„ž±gÊ|ŒŸP=£RÊ÷Ò1Ï·àu«3^Á^ ÖùEÁw×A? {± l\¡öS±…[±e`DîzÈËTÊÓ¸Ö¡è“…jöõÓ‚µXùÝ^kfçAF“2s9sü.ôI-»aMŠ)Üü…Œ¯Þ!ÌlÕ§3{P‰»qÜ?›¹­TbÅ.T³¶B†uTÄ7CÏ[äyu1ä¨9bß{«Ø°ëp¬­¯5R ;iŸÌ…Ø^zUÇOÀõlcÒºöQ©=*LXé¸a+öf})j:c—8“õº¶ˆNmß'ÊhÖKvÜo„纀ƒÀš'àaè¸]Q‚u@æ¨ûXü¬ŠËõ…b§ôù°‡ Û -ìI†”‹pÄÓõs¸]WbÝo,drW2ôw³ÚÄ*VaS(‡¤™´kÎ|2²lyíÓúFŸ>ÿÚWuAî}êÕ7c*ÿãA:¯Ÿ¥¯~Ò!³>í§2ÔÙ[Ý|ñ“æ#’Wõ–â×M§™‡b&£G“y»ËørÒé)»qЗÀ{WÑ=›I4O— ƒž®gSšÔ¤Wë)Óì +ÑÁ´ +Ò4µŒ'Š-VÆ–ÈVÁÓ¥Ž ø¯¤kvCFü|ìË ’jvƒÝæœÛ³Yïu™ì:LZŸ:“ܾÖMà‹$œçÒZ”i°!MmÞKÆ”á¾4ühäO*³Cr “Ô¢Ö’`Íq&ö½¹÷Rñ~Ñ;+ ÁWÖëú:ìÉ:Zön+™ñ~•Ö¼Îl> Ên6f6ꂵ$™Ü°Îú7pîdBÕNˆˆk*µCöŽÐW?h37[x`OÍÜ}OòÓz÷ +âÛv’Ùß5˜§=Æ¢â÷çØ¢ÎSâ§-G˜ûmŒð&:ÐïJîÔ³·›¢ÛÍèÿk#E¹M&ìý.† +-Ý@…¾]OÆ4nçeV¦óºXÉÓÚ’¼3À2’œZ’Îü %ÈjS®öK°×€‘ï'TîÞo²·{LlÕÎ!kÓ¬¥Lrë>Aä›õ”¥ÏàÝtr‹²ñ½ªCÆwjÓ_5è¢õ`½+ò{¶Û¾%Ô+ã5-ŸG«¡ã~ça›‘ÀÙ°â­PC1‘•nù>^û_¤iõ†¢´-èA1—ï-Eüi&í’5v»:ŸôÌ[hW¿Áð§.xúC@½ü&!‹~7¥ ¾™ Þýí ¿‚3£Û¾Ø {Þ{3­ŸéÊ–laßI¸wÒŠ27qe­£ðy¯9ýx@D?틟7œ”>©;e|·ÆLšQË“ÄW«K’ê0)ÍûQîÙãJ…íEy ‡¥ž”°¯>åuÝB×x§æ5HÅZ²ZÅôÝ.ô˜ù÷¿ê r¿ê“?ÓlþÇ#‚¢¿›Ï¿ +…emVâ²*{“Wo/˜hÁ¹±áù›¡ຂðõâ£D˜Û#aSû5X” ^+1a“ÚÕxOÉ™Y ÛKX 5.(²–>«°Ýí1æöJÅ7;D’ì6Jrµ¦µh‹²zôÙÌmÖïÑ*°Ñb}î.£#K¶bëÒðü-€_DÞhž‡–l¥wh‹ÒÞkÑ©=jüì/ª‚øþ¼ôo{xÙ?” ‹8’×Ì|øó’¸¿.PØßåCÖ~9Cµ|±fú>ºÓ}ß\%ƒ%Á‡>Ü‹<Þ~#FÎ<í•ÒûXá³3¶ ý8“ÿé0]Ô„)í±dÞõZ0o>£ +ÿ8L½þf,xùEH~2eÊ»-$íe>’Žw¾¢ªr{æÙ{SúÎ=¨E&·ï!3>í‡ùÀÜë¤Ùbq^³){¯‘e²ÛtÈÌN5aV›ôaåˆoé“òÂÛ­ }«Ûˆ¾Ö©'¼ÝN‹ï7™ +Ÿ¶›R7¾j“w>ê±7ÛI*·ƒO>즨}R:ÿëaöm[ÞyŽy×}†©|ž©êìïµ邿CLC«•°«Ù˸ÿ]¸x°1HÐÂYðj9sªñó¦¡Ó–yÝ{˜Êù¤E‡¡j=x¬iâ\Žp)ÔèWñÂjÖð®ý]M˜Û)‘U\4ôâ¢$¾Nƒ ~¸šó»&y뛎àåg†|<@ó³SÄônå'~Û)JÔ’fµ’¦w«K‹ŠmŒËŠ]¾+r7É/µ?¯=)¹Õ,ewa¬r¥Wxê›Þ¯…0áV±ý•y‚¸Úm‚¼_ É’oftïggñ§wâÁÒ@á§÷~ì¯Ý¾ÂO~ì×>of ÏC¡ïRÌ“n±ø]“µIkI¸¬Å^øºå”¨¤íœ¤¸ÊFRZíhR]pYô®ÅJò²ÎBô¦ÎBœßt–}ÙiN¿î:(~Ñ€â±ò”¤ ÔR\Xe‰rž±QF÷N¾ÿý%¼ØÚ¼ÛÿPç=ጨâ¾#¢ö/iwyˆ´¯:DÔÝä#ìkñ÷4Ðmïíø¥3å—þiB–þj.¨ürŒ~ÿÑ^8Øè+ùTjÞý Fü©9ˆ®|–~Ù#e®÷aoÖÓ!¯ÖQQu[©kuà5ѳFsã—¤/Ê-¤¹•‡%w¥÷«ÍŒïT›2ÛÅìã÷Ròi7˾l54ž¿¨?-~ÜvLô¨ÃŒ¼ó]|0ÀcPýe_¶™‹++íEu5.Òæ*Óîâˆãïï$žj»–x´ë~Üá¾—1¢_qk¥—¨¬Öš~Õg¾k³d[j\LzÞDê}}¢ýf‚EKZœUCbÜ…º8ÙÙ¦äØmÙ2ãüfðƒ‡ öד¼èAÿG|.tšÈ9s>•ò^™¾: Í^é׆ܵKàòl¾aÊÇ­LáàQ“Ž7!fíù‘¦u…þ‡;ŸFê|-¬n¶7Õ¿Ï©ò=Ÿ-䲩§mLд¹œÈéÆqn½™Yç+Ù©ö[IVMééÇZ$7”øB]coµP¢«MF¢\tŸ^¿»`RŸï'}Uy޽Öl(¹Õ*‚<Ãv4¹lÏŽA1“ðÎSæWê 1x¸çn”ñ`A˜äSQˆÙ‡‘öõ‘8&³K]¢î–:G¥¿s—Y´¤DKPÜîÎ:Ö~3FÒ_,îo 8ÔõRÆ4Øðò8]*û»¦ ±{ãñx)}åË“'µç%;‘™î'ƒß­åET¯<ûÆHÛªýÌ;ŸÅíxoÜ[.lmtw5øìy%éª`J:O +?óýa(xÚC1oÛN2•mV‚ÚoG™îz“C]e¢š2{£Üß4 2j6f ìп÷CY?ŸÓá5ÿqüTkflj…[LB¥{\@­O‚{mpâù–”Dóîû1’/•aâÏmAÂOí¢om‡zDkJ‰?Þ–#3í{ίùqÔðöjÌõ/âÜ6Tç4…¾V±!Å›»2Ù=:¸æÞk•¯#üw­•4άH’۵لʽTôÛ­ÔÕšâ—m§Œ+ËÜ$e•NÂÇLY¿íD”¬#ƒ‹Öð"ß­#Ÿ ’’º2÷£ïŸ&é~/í, ½¯õ2,‹¸Ð”˜èY˜äQ˜˜\íëU˜*i-ñ¦ëÛÏ›ö¿tm Mñnð‰ot‹Î¬vŽÌ®u ¿Qé®7Ê»ÂOðÎ/* ÒGv©!&úà‡ì‡tiÿæÙ€©äiãIÉËF IQÍEñÓÆcìÝš½Þb$úØäÇälد]Þ§Zrâ϶\I¶h¹štªåf²¤³Æ.ù|‚Wú7‰ öÇ1²êïÇ Þp†z/8 ƒ´î-†W>î½m»pðC‰ìPÏ ÓúÁž)é:Í”vX"ü|LœÑlÈä¼×ݯ• +ßVœ5i|íw¬ývÜ¡ŽÇQÇÛï'Z5§¥Û5EÆzÕøG94GUyEdV¸DÞ®sˆÈ¯³-kº\\mVXiVZkRUcR†~®¨² +-µÏ+sŒÈ,s +*óµhL‹1î"¨õ7ë~IÖÿiÉÌñ¨ûÿà3·¿ñ™½"ÑÃ΃« ™”¯êâ«]4sï-,ë¼ émvµz±]ï=$ýu¡âO¡ôÀ7áç?ii˜IoU$ÓÚåÀö;Ÿ|úžÔž”6¿ó–ôW‡˜ô¿‰t« NhðI=ß’uåP×3™¤·Ø÷pϳ˜£ÝwâŽtߌ¶iˆ ©ñÝ­vˆ,®³ +l´}ÕdZ„¾æ×Û„æ×Ù„>­¶ÈEó.µÊU–^î*K®p“yUÄH?”qBðÒü«œªðÞ€Hœ×Pr¯ÛL\ÔrÖ¤´Äݤ±8д£$Bô¦ÉR= Ffô©‰³›â‡í‡%EMÄ…¨&¿üb&©­ó ¨ôOu®‰L5m+Žæ· ¯ÿ®ÍOlØ&¸úEƒyÜ+67¹Y5%§œl»™dÒ[Œra~´I_I„økCÈ¡ž\™m³,1¡Î%6¦Î=Ñ¢5+YÒÿ.„í¬w=Öy'Þ½90Á£Á?6®Î%òFµC8wª"¡qzYnù¢Ä9öi‰“ìN©Sdl™GÔñŽœ(ÑÇÖaG³—´¦ú²° ý”¸´ÎZô®ÑZ\Qcs#²ä2Šk™_…_´{Eh¬KuhlR‰GL@…"ÝõÁÅè5Çç5qÇ¢üTî[ì^ì!s¨Bñ•”Zé“t50è¬÷†Ó3xÍé Z¾[¿}ªévjHu`N`MPŽEÛÍ ó®Üh¶±ÂVXQ~Þ½.4Æ Ž—Uv7j#Ò+\"îÖÚG7Z‡¥6:Fé¹CýÚãjø;fÔ÷S¼ïÜEòû'g“þÇÁŽÕ±U>1ñ¥îQ™ÅQöUQÑ– ÉQgR¢·dGJ?›õ<”|h +‘¼o +”´´ù þzˆºñwá³_›5—EmÎJ=Ó’päý˜ƒ½Ï£}x-üØáC~øÍ†éíq}«:ÒyKfÖ÷0Ò¨ƒ;aÔ2x„~_cw¤ó^¬kCÄUãúü˯8ý¬o[ôýÏ×·Išjà˜4]?¹yƒQÅ"ª·ËñD×ÕØÐ&÷ظ7™y÷ÍH£ß¸óz]œ±îN¬ÓÏItú8¡v?Çè rfF_¹³F?8+ö[µ'û½Ú“üòÅI¯•ëF5/3¼ÏiRo~—´ØšÔTûo½›èX•Uá˜YîkÛ›*é© +64¹°õv¢ú*WIocðÙÆŒ$çêˆD۪؄…oœ#¬âPÎ~+í¯7ë)Œ6ïιВ”ê_ï—êRžx²=+†ù½û2ÝÙé(ìiB¹³"ܼ'/æT{vÜ…–ØØ˜·X¯zÿá§?ªû³=ÕùÍŽWÇ™ésú:÷wè†ÆÎÔ Î™«U©òº¾ŸýZä]é“Vâ‰ê^äb·H¯²€ˆSÍæ×#˜þ¶áƒ-óêÓaTǰMNÇ:îÄ{Ô%Þ-r‰|ùÎ!"·ÈUvû+ú]#Ÿ¼qŽLë}¸ ÕØ¾âp¨¯~•þ±OÞ:E”8„e£œUZe2Ø|1è#:ŠQ®ó¨÷üñÑY«•ã}笎tÝ”]itŠ)n¾ú¸Ñ.2·Ñ.*¸Ù+Yô½´Ì7!õWlú;7Y Ñž±€óøM?aü1?,½ÒEöå·§MÖa·Û¬CowX‡³?}ôr>m1°Žœ¬¦#"VÍU"W æ +Ä\b1Jèû•£gëf/!öíZb{9M©›üÎÝ4±tÊ\b1 ýÖ,b‚¼1Yn61s¸1wôRBiÚZbáÜÍÄŠÊÄC bŸOåŒϹ]zÕœPÐõ§õ†;$|óÙ¤ómdö˜Â7ŽáoJà Êìž¼uŒHªp‹Ž.óŠõ® +Ht« +IHzãs ©[dÜÛË1áï¼£ö>‰$;½D÷õºÚ7…ÅÔ6_ +ih½ŒæP<ù£ÏM»‘38óëڎקjÛdLÖsº« øVI;çËz­Ü¿oÑ~ÀíÔŽ©_ªÂ;F,VZG,œ¹ˆPRXŒ®a1GŒ'ÆcÑ1 ý¤HL'”äg‹§)ë¶{MÂäU.=¯?8O£™Ó4üÂæýÊÙ÷?õvû ›ÝEÍ=^➎€cïoÆ\®Œ‹ã•Vày­È=åŨÌBOÙ£§È×ﯔ¸E¡|ù¬È9òu¡sxá;ÇðÔr7YT¥W\KË…@®Û"ôK»MÒ¯}çNv¦„ëÿÎØ_ÄmQóx=mØf؆jIJ¥JÄê5Ë uSK9-Ï« +Úî™ÓÕÙÊ/™¯DL&&£‰QÄb8þ®K}#ä~þ<½2]õXô[#ÑOòøµñèó— +ˆõEÄ.Ê_nÿmn•°¯Ø=òE@dì3ÿ¨ÈßÈèߨ跗£b ½eé…žQW +<¢îæ»E=/p‰Ì+p‰xôÊ5âš›·K\"ï;G½)³÷© +ˆg¿vú +?7ø’¿~r½ØóªÕà¶‹¡ÑÍÎѺ9ý=ÆÇ‰å³–£8œŠÎÎm:+9|06ãÐg:Œøxÿ?Èá«ß„;05l +ú:‘)7ý4ƒ˜9e5±vË!b¿WµoÕAÎ å¨Ãâ¾–€­×b³ó=¢ + œÃ3߸Ge¿u‹B9&üE±c˜GeP¬é‡Ç¡žåÁq›‹œ"î¼uŽŒ-ñŒ:Ñž%üµ5€ý½ÉÏ©)8®ú½Upx‹s„ÁïÜ©ý²×s7íÑ%”ÆÏ@×0ŸÿHt†ðýtMÓQÄMEßÁ÷ÃþËÕüçaøêþõº‡¡O»±èß›æâª½' ¿¶ê7¸•úÜQ¶óƒ—´£*ȬõYıÖÙ¥ÚØXë:YÌ«WË¢˜„1Œ-ò–Á8æ¾ò½,tÆã¹ôQKTc‰Stg¹C„øc‰?ú÷Ìu;9Ö°;ÉÿÎÙh½ã4vê›SÐý¿þ€k”ûyGà¿#~Þ3…QKˆ… õ‰µ—ˆ½®Õ“Ô»¹Ô§r;«Ò¤à„—~²Û¯=¢Ÿ¸Èç»Å<.vŽ»ÿÖ9úEktÑK·èWù®Q!o}#]+Cc‚Ë|£ƒ*¼e™•ˆwU8FÞ(sŽH*óñ¾rV¯¸­ê^·¦«šÛÊ­[»•˜)7 Çà|ÿgÌÉáû/ã¾þçkŠÄ‘èýQxî ÍÃaø{xm4ú‡²êb&1eÄbbŽâ~bù®ÄVÓ49NƒüÜåhÚó00§Ø5"¨ÄOv²53 +ø°Ecª pðJ„½¢|ÑWÛÚ¨ècí9‘ðzÎ;—ˆ +„Ùj­Ã†°®uhbk¬Y_n$ÂbÕK¡£æÍšùÿ{ã_¯õ¯×àzå¾7tÝ#ñ‹îÐXô9 ÏÞ¡Œ:”ƒä^ë<ÿ&o$Vî8Aì<~k„Æ n ‡³>Üz/ôlUztä‡gS£jóÝÞºD×£1l(vIh.rKn~çœP[îýêK4ŠOÙãBWYB±—Lg“lP–3&LÃsë¿Ë ÿÛ¿®ó¿û€kósLG¢ÏÑøú'¡OT§n&,+T.›Ä‰Ãödróô>sæ‡oz'=÷•Ýzáýâµ[ì›ׄò·”²ç¤g…®±y….Q)…ž‘ŽQp¸UE¡ú]åy¨ûVˆv§³jÙÆÿõu eCy|Îòÿ2¦Ã~¾7½;}N6“˜!?˜4LÓ4”“æ ?Ÿ˜6b 1iøbb¢ü"bʘÕÄL…ÄJebçÑ×#T ¸uloÂ-‘¨@Mˆr©, 0xt²9#嘨'(W¦ 2¹0ù”[ K"[š/EÜ@œÓº%B¦÷;¬‘ö~é.m 1S~âÿelˆÿ’+áç¿êÌÓ (+Á5)Ž^BÌœ¸‰˜=}'1kÚvBqÆ6Baêbú„õÄôQ눩ãÖSáû±…ñè÷T‰ÅÛŒ³å÷çpË :¹cæM·OU_ lv÷¹gTª}mEîé-žo]S{ßz\ùPîšÑ_å’Þ[ë”ÒRåPV攼k_·u’üÿ›üøW„ëœã¥8B‰˜2\ý4 "T~T?åæ \2Ÿ˜1|91mÔjbÚ˜5Äôñ‰™s÷ –#ì§áLld“‡m¦Êí +虢÷…3ö¼vŠ}éuïé帷ù®±å….±E® ¥N±o c‹Š\bï¾u‰*@ùôå['¼.{ç©ÖΩ®\§ú¿¾–¿ò&䈱8³úùýhœGÆüü~2GÅ ‰ÙhœæLÛLÌUØLÌš»—˜³D˜·È˜µˆOÌZlH(ÎQ'f,Ð"æ.cˆ5:¡Ä.ÇÖ *o¸uâ÷ÏŸEaÜRäõ¨Ð%a3YL‰G$™ÑÀ=n ü‚°Ø»wŽQuEÎQEÅNQè#u¿qwœ–[´i'ª­“ÿíë‚<9g†áøû¡84Çb42‰˜!7“˜5v91kÊ:bÎ̽Ē5bÙöÓÄÂÍæè8AÌY)"æ,¤ˆ™KIbæ|b†¢:1{öüÞ:^4±Û©n‚ú{NS¿;lÖt÷²EEj`ÂSÿ¨Ògq ¯ÝJ +ÜP}]ìù¾Ô)f Ò!¦¿Ö.v Î!±¶Ô)0©öN²h‹ÑÿjÌàü'aŒ6é'zªy0÷†Þ›€ÞB(ŒœEÌ·„˜5~%¡8u-ÊÍ+…)kÐüÛAÌšº›Pœ¶›˜>m/¾¶¹ËMˆ¹‹ÄÄÂu§ˆÚ¾ÄæCwåwwOQÉå–ï+á¶ê䎩¿ê ôÙ Øšט4N5eQíeNñ0ç:êÓÚ«RÚì“ß”9!.á¦VÇíY²Jë›C×Jàñƒz6Un1U1$4¯¦¡97]~>zm>1á$tLµˆ˜1~5º¶„¬­(>UQLê³7šó¶Z ö9Kôý‰l<±‚J"6˜=‘ÛòÛ å2nÝ[rébarˆGQx¸_Q`Ä;„½ªÑµ=xç${„j\Y‰£¬½Ì1¦»Â1¶½Ò!6¿È9ú|M|„ún׬I³ÿíqûk¾A¾‡J5]^‘P¹]ÓlÓÑëPÅž8ôžÜ\BqÌr”ÑØ[‡òæfbŽÂ^bþB’X´é±t¯5±XÕX¢æBÌW¶!æ©Û¿¨ÛËyÄzã ¹¾m“Ts+ ú¹£Âî"§s%ÉîùaOø$V?óL®홞Ÿï"Î\îkÕ[ˆxBC¹=îCŠ>¾¼¬r›[2kÖº»–ÇX 0"ª^ÃQ-§„rÿ"BqøB”ç磈œcsúœ.§€®o1sÜ"bÚ¸(7¢còJBa:Êÿ‹´ ¥5¦„ÒZsbÁ†“Äâ=ÎÄbýbv±Æü–Ü6¯ºq{oq Õ9„ƒOI:ž{ž©I }uë¹Gdå+WYº¶Ò|çð'¥ï«mB?ÕÙÅ÷·Ø%—×8$&•ºGýè¹°Fdý³! ü?ÿ•K†°ð4ZãÐ\›ŽÆp>¦ËÿB(NZ‡ÇJqžŠAb6ŠÃ_6Jˆ_Ö3(§èskгU Å„âzbþN4猉'îÈo iœ°ó*7K¹’Û¨ZÉm3üúçIó¦«>¾Åþáñ—e(wƼBXÅhtKµcBW­CRo½Còçzû¤ž*ç”ÎJGè%Ejµr‹”¶ÿ[ã&ÿ/ùq(LDׂÐÇø„Ò/ªÄ%-t*Ĭùj(W( +3Qþ˜¹ åL4ÏÐ\›;k71gö^bž¢ +1w¡1oM,ÜxŒX®îJ¬¤ëŽæÉmt+½!´eìÎGÜ/»Ó~ÌÞWÈmÔìæ Ÿ[ìŒÛxy¾~Y‘ï™^\èýøµ›Œ_öý Á3NÛè>â…ß²mnFÜ)Rn¯Šwñ4Å ÿÇëªmc0:„,9£,¨Ð³‰)hœ&­&æ z¼dƒ9±RÚX²ÍŒX²‚G,œ¿‡˜‡ò圩kÐ5o1wöv„) ˆ«ibÁz±Tõ,±V?XKÇ›>•ßÚ9~ûCn¶j?§¬öžÛ§?È™ôr'Ø}žGZn†ªÏŠ>Ôu?âTSvlê+ïØ¤×>±§›¯&˜~(‰r©‹H-/· é«´ /ñˆ:ÐÇQt-ÿÇk‰¯g®Í“ Eœ?ÆaÌ? ùrúˆyƒÌEóQ‘˜:%búÄ5Ĭ:Ä"e„-ŸßÚ7cÏ5n¾òSn9àIåGܲÝÉ›µ3²wÚöî);\ÊÇï¸ôhô¿Š)ªyÜŠýuœªÑ'î¬á'îŒðK±—ißÃà³Mñ‘À瀓Ö|ܵÐEöì­cDY©}xó;‡¨Jç¤ÚwNqä—f5çwÓ G@~ÿwbsÌÏZñ ÈXqÔbÄÂU:ÄMKb9eC,3#V;ä _ãûfäF¿wc6y¼½îÒãáë_ŒØâU>v‹Ëø-¾ ã·8¾½Õ:ÔNÊ ûqköÕq»•op‹T‚ZÔr¸ešuœ¦N'ÐmçDºÍœ?È]ºX˜®+ag窰ÚÐÒÛG€ž†äz³Êý"0ð¸5[YxqØ¢e{þ‡¸”Ãcy}†"ÂÃ3U…ùê„ârCbÙ>Kb-éE¬&/ëD¡Ä¦×ä·ÕNÜ}•›§üO·e_·òß®€ú)[eɯù›¥QÃvœº6bKÙĽ¾­ÓTc¾ÎÝÿˆÛˆðÉ_9ÞÁ ì—bwNx  tžnTórÃâåÔÝ? …¥=çEϾ¥ný©/Hÿ›*›ó#уï¦ì“ϦÂÜ^‰ôQÍ1qAëYØï¤_Ì©ˆä§ËÿÏuú!0Ó¦Ž^€°þFâ%±`• ±hÛIb©† ±†çI¬>`E¬ÝsŒXµ™"–­V'–/× Vo[É€aÛÏ?µÃ¶xì¾´¿/Ô¨æÔ´ë9#½^ΔüòÝɼãF˜èóÛËüo߬ŸØé´rì¬ßVk'w¯Ö¹ÎmÖ+ã J9šWÉ™ +ΰMuìû×C½O£Íº_ÊD;èºkÞ;N"¨úqœíjóp¯I¬,³ ñ¨ ŠVK\°Pië¿—rÀÚö@ó ]ç´q‹‰9s¶K65OÛHbå@ì:™8|GøÛ)ÊEÜJÏ<'úôÄ…ü­ÒÎè_Ï þ¨±áýÙl­ÿw\ã;g ù™ãé|ç$º_¹Çn½nÎä@`Á\Sc4̓FêrÚürî~ÎŸÛ ¯Íä?àŒèÎ~—í×ãŽtÞŽ=ß”–|¢ãv¢¾¡Á:1‚ {¾AœÓ@1OzņiŸ¶hX%Ž[¼bæiÿÝÇD4n¿(n#–®á#œëMl;õjÄv¿Ž‰;S8E{Û|æ(Ý߸Cº?¸ÃÚß9ñ¾fn§j9·I½‡S×ûƒ;jS™Sî[ééR!|é=m{/¹mš¸ÍÊ9 ƒfΔ×ÍY +þ´« b¿¼÷Ö{À©èŸSÝ´ÐÖP'à9JØÇH¦5©Ðá¯6ˆì2æŠO‡M:ç-¢³ÿÐæ SYŸ5i÷› øvYŠ:æ£Vo4$æLXü_zAÿ›òg!Œ5i9±x‹Ølœ$·;¨}ä¿ýŸñ|9hø;eø+g¡ÿ‰;¬ÓˆrAGê—s¤î;Nϰ3 pvF]ÜIƒrŽÕÎ0Œl_cèqgžAjÏf~å‡é¾.üœ5¯;¡›óçVCß\%^BÝêêçôÃA–Sº }¾šL|±•¾[k$Ê{+–”Û›6w™²Iƒû™ðÊmL`Ñ:&¯™1m~ é)4(㘠»¨ÿöºÆ¢¼8I~.1yô¯;-Ìí sÚxdV×~2¶t ßÿÆBóQãa½múð ¸wð¯0– +“W¿¬T#VëX»-nŽÚ[¥õ£¿< +=:íŽÕíæ„†µœ‰Þ­¿íÔ=ì8BKׄ8 Æ'Œx&KšÈ±³Üz)±ÕæÙ«”‰…ª¦ÄæƒaÃTƒk5îpk4_s{5óÑqåýÔK5ÜoNÓ<5VßõŠ‚QÈÕF©ó #n-6H«ÛlpõÃN~Ћ¤]êLêBÌ4Ö&i&íxmmw}.}ÚÂ5-B}÷^‚§êÏKLåRS9Ú-n?¦p?¶`#?¡`3óp“ áõ2³W¹ßÎRÏ:„x_¥OüÆ5yuu@Sò¤æ¸qY¥«YÅëãÒgI~ÿÚ :ºQý¿9ó^sŒÑuNÕÐ)nºÑQt//xN„=YIy¤ÌCy`8}ÚszÊ~e-ÂgJàg4|Ÿ.'ý/׿KˆíKV{Wn"ô÷©&b3ùCœ¦šŸwšvÐÒy²Ô.h&•T´ öù +5˜y<2ç³&/»{¯àrÚ<Ò?g}³ÓöÕ +®ÓàÅ´oÄ}ÜF]ÿ»./ºre›¤Hž¶CÛEÌà§6è’9¼¤Ê-¼°×+ Òz¶æq†w¹ýú9?vè^ÿûVÝkÜfn§f?§¯ý+'Öäô´8]Ý·œŽþKNǨ„c ^p:ºÁO”ôÎ8Ô7³7:xF^[K“رr>±oÛ6BÛ@Ÿ ]Éœušà#þ"¼ƒç‡C¾`RçèÞR¾ °ˆoÚR‰£¿"sÆmBK]ŸàP„Hj&ozÖn¢‰[êbS«+àÙ ‰[Ø\xÆ‘½Ú®kz§ê¨èî{1ÿêg5c´åqåAúGAdÉòbô4þ™€ñ‚+ªHò[Î3wziü¬‹m‚"<ÏLú\_Hº%̦\Sæ +|ï,2L©ßlx燚ѵ¯ÊFqeë 2¶ê_ýºC?aÙbÎÀ¨òo£â¿1º÷ÿØeàye–³lšaÆ·T^?eÛ¶ÉÐ>fšÀ6a†àbèCááa*[wÛ–,'ö¬ßJè¢yGs ϲ–žä¢ï4Ðb'߯£rºµD÷jEÂûuBöN -¼Ùħ³û´Èðkh—ø9¬Mø Ö1emòmü,Ò;}>ÌCÞµ~5² ÓDTT{†|ð™Ç»öMŸõQ™õË>úÁš-n³æ·ä_û¾OpÞo"må9‘tɘËKlØF?ÿ •´T_>Öõ íªw5|Áè?åÔõe}«õœò÷é#´iK9ýKI“r9M~à“¥úbK9ž™ÝÉ¥á†Ôq9Õªhþ­#”¡.øMdu©Â¼Ñg‡fè3-†K/L=Ý$L«<@¥–©Òª÷2­@Bz«ZÂÏéQ£.g+ÑNÑ3ôùð¬<Ïúd,}³¢ç§¯Æ[6e&,Éweöé3ÏVÓ>ÏWWTéGB~jÛnÁÏšä=*ðÎ2Ê!t:é;“ç4ÃÐ÷ö|ƒ°·Ë ¬3§iI/Éi§‡éˆíä ¨ rº†‡† .üì½etTY»ï[QH‚{pwwA’«ªå«* 1âBÜ݈;wúÚÞVmm×·_Ù{Ÿ3ö½ãî;ÿO5½ß3Î8cÜ/÷5F:t’JªÖzæcs>ÿß1íáZ{§šÙÃÆjƳºi…à Íî-Κݛ·jÜÝOÓì= j´!©ÖºÐTkoÿK.0ÉZgŒ·Ü¹kf;óŸÛ×o&Wn/DgÛiý‚Ì+ä¨D[5¡Ø˜Q!)6’”¥‘h­ùÄS/õüSU¸ð½7WÔ2O®tÐõ>Ù,ôÿ°º†BRÅ9£f¢Ðûd·áú'AþßÈ yx©Þ÷ÖÝ8¡ÿ×}˜A“òÎÍo*//‹»ùº;+…ªó‹Xž°H{â;µÇ>]ávÔA›;0Å«âö]\ó˜Ý{X½°v‹fëúݧÍû5îÚ3ÌYjËlÖÎ_¦™c;N3wäXÍÒÑÓ4ÛXþüÊ'§s–Rsqfò G®-“šló):¹Hö²Ôêeh ³$-B°0â +G+yõS¥£×Ö]m×wÝßÂrée¸ÿº–kuþî"ÿ‰×õ¿ÜŽ‚[6 +ܾîÆr®íÉ®ãɱïçý´Ö«Î/JúfqÇï®Ͼò.½ÒãÞ +ï~ç'~ð*ûÅÄÍ\þÐt]x¾'f¾o¯ Ù»ÓSã ûœá|lÍh>£w +t£ø ¬ažBó‘æüáú1Ìfùì£êƒå˜[Nüæ&–^XÀ…gÙp±#„œnÏϳ|ðØ!¥Ñä#«®,á:¾Ø"t½Ø%œþÎM<ó­'?ôãÒÛ>÷ƒ‡péGæ4ô]Ï·ên-Óžüu'æ€PËâÌ·ðίF]ß_·i>Z¦íùç¼~>¹p”>*ÃF(¿¸@?ø›×ÿ×]ÐÍä*ÎÏçJ/ÍÓ7~²RÛóãf¯Óÿ¾C—Øì°ÏÃO³fÁJͲq³5æ®ÐlY¹Zãìì¬q9à¡qÞÏbË]½%«‡ Ù¿×S³ßÕKãåe¡O®w€ö ü f´¡µ­?‘÷7ç´Ì÷pæÄ;þÞz©û¹3ßó šÝ\tŽP>4W<õÜÃpö¾ÛKçHÙÍS ‰%ŸþR¯\}b¯¼T…³?yrƒ¿ïá†þ±3a|Ë£M¸†rníd¾¼Ž®í“µÂ¹Ÿ½å_èÎþÏ}ÚÊ; õ•w—zuÿ¼Á»û—ͺ¢Ó3½2¬¼äsW}€™×Á$K.ºÆ^šn½iÕÍŠó5[ÖíÒìÛq€ùMŒHhë%§:>Ù«4}±Ü5èÐA¯P«7j¼= ñ0³ë'cÖº/rYß|Ì‘²80CÈlœ(ä·O×w<ߟù«wò÷½|íÍebjËD}@/^L¬p ™¼Ìæ)”ß4üeé +–_YĽµ’¯¿±\(:9‹/=7W×ÿÝvîÂOÂ…½¸¾ìæJ.Î^†Öká)2×ú¦Xra¥vÞà6ÈÌ?GçÛASOç›b=è?ò‡r‡‹™SÅÒ+ ¹ã_®‡}Aó—å3„ØŠQ|L©=‘mË…§‡v¤Xpv޾íé&šA®}k™¾óóM˜­dñÏÇpõA€|å©Áxû~”üÞ“Cü…Ÿ¼õMŸ­Yì×W¿µ³‰˜_ÞûÆ_{òŸNºÌމº¸úÑú¼ÞiºÁÛ©;ñë.ä;Ì6wé†þ± Z`úàX+ô4<ÕsÒii¾»FÛõå>«gŠ·o²å®­nš­K7iœ·ìgv©ÕxèxNõ7ײÚ2:wf« ޵ƒ’4^­øä†qRùõ¥Ðô®«1±~‚œ<Ü'8ÅF‘Ì ÁÉ6ÆÜžÙbËÝ-Ðz‚6ŸÙ4‘/šÍõ<Ý.t=Þ)½tÅœ«Tqj!ôùžgNÊéÇ:áüs­nèg'홿ïâßþEP>|©Üz~H<ýƒ§nèéN±dpŽ˜Ý0‰«½¸Xö¯.4»üöªþÂÿÅêŽÇ«u‰õc¸Ä®û×íúÞ_vðG?Y«/»8ÏjŸ¬+¾<[ŸÔ4ÖÉÉC³aùZÍÞm4àx‚õ¥Ó±Ï,öèŒæ¤ùQ8@Bxâ0h¦’]2¿)Ö_X& ~³ë¹»MN,-E§ÙÉMÓù†+ÄšëËùFö÷Nü¾G7ðý)§yªZ;N*<7¬ >­nœ˜vl"⤘Ý4™4uRY=˜Ärñüþ™bVÓdÒ’LiÏG¥ÙðQùv¤·SöÖBúœP3† N­y<søÐ¨ÒJ³Æœ4ôö¤²«‹äŠ›ËùèüÞ\€™‡ÎG{æ"óì¤¬Ž©X/º“¿ïÖýu7ðã.nð·=ú®Û¤’só¡í¡÷ëÝÐXƒößdÒ°æN|·O|å.^x©ß~eÞz)é~uªßZÝ9Ä }Ó_ÖpçqçÎþÍEôÓÕ\f÷dôÕôÉÇÆòÌgv¿Ø†‚k}´ óãÐó‡v¤Nekí`„—Z3½}Ï×ÛøÆ×pÁùÃ]÷ɬÚ«9à&k¤¸²ÑRIïlhSJù½3Ùµœ %5ŒÃ5Ö…g ×ùÄ[jý#-Àìà[ïo«š@JʼnÅRíÍÕÐÖÞ'i\çôÌ„ö(ii³X¡kùp®çÙV¶7 ÇÞ^%6°‘o¿»Eî{äj8ñ¥NêýbŸÐ÷`0ôÓ~þÜ÷Òõo|ä‡ÒŒ/?-7~ùQæïýÞ¿,]}ªÀç +™Ç&±µ»V8ýóÌâògþÓM—ybòž}¼fû†}Dù¡ëû]âà÷.Ðãrº§èK¯ÌÕ'w@.ºw˜­>èÛndÑÐ|â1f “c*Fë!µq4åÁU±Îxõ“`ùìcta„ƒÁìëE£¡‰ÎŸúÅU7ð³´Í¸¦'p¡EfÎêʘb{!§sªÇâ,«/Dæ+„ôÆ RJõ8!ýè.‡ÕG Õc„„!¾vŒ™7‚)ɳ ..¸!ÄU#ÍÅäºq˜oåzuâz¿Þ )¯s±ŠªXÓüÉðÅÀÇ—l&h ‰ £ á"œùæ€|홪^üÊ ùR‡šÑè†Pùé…bq§#´žøÆwWC{lžÕIüÉß\¸“ݧë~¹kfø3±Ù#¤¼ÖéÈ[¸þųsÀÝõfµ j20€ÄÒÙ°Qhhp‘™6Z|‚94ßõ¡‰Öú°¬á|îÉlmï”J..ððò×ìÙ¾OsÀ[Öpþ Vr~Û èˆCHˆÌ± ú„BtñH]P‚Õ>7Iã.†˜±k1ÚCÐtåýb-¡%#’~öÀÒRÁç’óåÒÞyrÅù%¤•Rv~wôö*bŠô}·O=ý%ç郠k·âü.~(õ>u!= +v¯¥ËÏõï¢ _^â÷õûµ˜•ƒV‰z¹|ðô7—ëY ¢oûlƒ®ç§múŠwhC ‡ïvòÒl]²QãÂjh:QÜŒ)q±ÎA8rf®P9:ñÐR%Žpb©ƒšQ vßðÌ== tŸˆÏ}*æ_q1ÚBR×ÃÝÐb&ß›1BßñÅfÒÿ¹õ³Ÿðöß®õëÍ`Ž Ñåölm˜»±ÚËÝ›×ÀùÞ—»õ w–ÃOîÛ§×ìßï©ïŠîAbÕ8p§ˆã&³ÑÏzÇÞœªÑÉÍ¡åMÑQé#¤è$Î/ÞŠ4å™?”Z?Üjhw—\óÖ +صg}0ñøÇ›ÄŽOw@÷Kʬš@¹VÓ‡ù®Ï¶‚Ã`È©›ªtÎÀP~a)´ù–7©C´üà÷û„ÃÅöúƒá–Ä9/j›­TŸXî 8ø³«pâg7Šõ½ÏH‹©èÔ\1¤ÈV ˲åØúÓ²û]i©òú2¾õéV¹îîhÅ£†{†^´‰Äo÷ó”ù1£}Š˜Õ5•òõªw–Km/wÊ]_ï3t=?`èzr@è¼·,D%¹rœ”ß=Z†ÐÑÃyè 9½Ó)ç(»ºX<úéz¹ã[g¹çkWCÏ#OßÞZ¥ï¡ôÙZ^®äµÌ0d×NQꮬ»>Ý%·ßÝÍlsåd,·Šúg±X·ˆôô"KíÁÄä;žnu“Nü쎾ú¤ÐƒŠºgRÜe~ºäÔ<ôg„¬“3ô‘%v|B½]1’;”bí)ú™9msÖlݲCƒ=!.Ø ,wh ÏvBÇ—®«k½´¢†Œ°£B­»½hñĦeë×Bí½@<öÑF9ûØèÈKqöÔïÌocyW޽•bËþ=ƒôúÎÿâ)\þ™×žúûn!­f4=•PÛLœC!¾b4tÒÅ’ àÀN„.½iå“ytš1»Ãј}l:j0þ ü¸™Ûw^ò5ƒ#â&ô¶ Å ½a>0ÆŠô'KNÌSŽ¿·Ejþt+¸¬Ð%<´_Y>(•vÍ–¦®ýÝuÒùgœ:øØK†·1Ì‚˜6ì¾øžø\Tz¸2¿ºYè}â,þÒK¬¾º„OÈ 1.߬c|£²ì›£÷ å÷9Bóñ:cBÁÉYbjÏ}Pª5{,fŒ†.ßý““xìñ&fCލýä´Ž©¤]×ûd·¾óÁfÔ¼`f¡/F}¸ÂÁY°yCû—{¡õ&v¿Ø%¶ÞÛö|(}8¸~`Í_ìÐ÷~¹ :¡è‰ÿÅu.>5Gh±ÝÐù•‹Ðý­3{þnè>S+'Jþ‡­°îÑsRk®¬ºï;©ƒ½| Jǃ=|Ëg›Àl•ê..ƒÖTpzq¯Š/-Rz¿w“O|ë%ôým×ýõv©èü<ꟘCúv'_y¯Ü T/=óákÞ_Nû±µ£¹è’¨u½Y tÈ :ˆR|ãX™ý~Ò‘3†ÙV 6?°_GzÇ`«@¿ÐPqe¥±°¾_>F‰.­¤7OÛïP»îë>Z«¦ÕL$-dÄWè]εãLúƒÅgyÙ¹¯½ÔkOHS-·súkvò(^=Ìüa„… MÑ–‰x¿†Ìކ¤º‰Ð@5fŸ=XÄZbn°x ]|bᥑë?Ú ¶=ÞëÓúÐUi¾»“XÞ1EöÆ´£S eW–ƒñåÆF’ q°Ùë2$›´¸Åš‹¤³_z)ïÞ1Þþ4 +ZÜ.N®¼I‹»çî^ÃÀ=o¥ÿ±;×ýñÒâFMÙõ|«¡WCsõˆz8Çž;Èr+–ÿ{‘Õ<‹7Ц7ôÌE¬‡^ päâ|>¢l„Î?Ñ +uø%JÞÉYJΩYĸ,>µ¹4‹(¨¾¸×¶¥“"ÍÁåƒý«möÛŸ¹¨¥W—"ÿÕKfÞ¼Ÿ™€¸æX ,. uW¨î‘㪠qÉ®·5¸†j;»^mÏÜÔÒëË¡£Ž=$Ä1N1ýb¬Ô¸üQ¤ÁyìÆ:CÇcŸ®ûÐÜ…Î3xG\/ógG?]K\„ŒŽ©ÐæÛ_mãë>Z%]ž/TÝa5Õ……bÙÅE\ÿÓ†ëwƒüoÝJ0ܸ{H{ú¯»ùÚ[Ë…êWˆ©íäcÁœÃ>˜Û1}=ð v‡ØóÊÜ—=®š}{˜_ÕJ,õ5{Í›3DçÙ AQVˆ‹ÄÍŠ©V +úïÄ0I·ÁºSãrFÉ•,BcºÜÄÎbþ«ûá>åÄc-4øÄÁo]õ],;ëP¾­Î?ÁlY½n¡ÃÌ¡Çmˆ*°7„äØqBš²­%Ò´ÍAšÊGçÊÐç"±h48ÜàÌ;¿tc…ØÆÑEöÄ-̘ë“P1Þ72ËLåHÏÜ×ZÜJéÀ|îÄ«}Æ·? öýôÝLéò+6ãêì¥1qšš& DZÜeg~ ïÅ>ùä3/Ÿþ¯tR÷·{D£‰Åb6q†Ò›§€¥7;Kýv–þäï»QbËãG¹’‰UH¬bÛÄe›‚Øð¤KÛ;úϰ½×ì,µõ+g¹ó…3Ù1[ãZ1Â\Ïl ¬yÏ7׉fÄo3¼th>| é Vž\"5ÜX«t<Ü]]©çÕ>h< +íÏv°˜Gºó\Ýÿ¢;?õOÝùÞï÷®¼ð÷ÿðN¶:ðÄS¬<»ˆú†à< ÌäꨯXye©pìÝuè…kã-¡u,³¼qÝÐóÄ÷ç­s¯\0Õ s@¹isб‰x5àAÄY+Ìn’ªÆAû\xáNì¬Bvm_³³ÊÁÎbù]tÎH5÷ø4hÆÒXÜûƒ%†ÚiYìî¬×ðR€¹h`Ëç …äa­eÑÈl3öZá@|<Ǩ'W4Š µŸ šÞ¤{}ìö:Òâg‹Åi|øD¯Î'½vŠzäÄB¹áý´¸ËN,ÿJxä‰{YB:Ë™" ìä“7ñ‡Zîo&Y0Ÿ¡s×]u~4kqø½©6¦>p +1>ŒaÙ#ÀŽR£ÒíLì¬úéâÐ7ô¥D°³Œ/OðL‡Ó…}7ð‡Ԉ$Û?ØY“ÀÎ"½Ò×ì¬ÀôáÆŒÎJí­µÆ¼“óUÏH‡?4×–¸]i-Sˆ¡˜V6KCNãthéÒ™/d÷U É·#û®½½Ïgñp”éù9¦çgtO‡f5ì[Œb¶šT<Æp¤w¾OÇ]W¿¶‡T7õ<üSwž­;ê¹ö×ÿjtçoãìÅ+1 M5£mš’Ó;Sœdž„>4u˜_å€n–wÐÌ“÷5Óƒ£–jŽ\÷ÅFä¹rZ×Ä?°ýø€Tkàk¦Õ*f'–Äa=\0ŠX쉅cÔì¦é†ÄZ¯ kþÈÅÅBÏ3gp‰Ð_Ô±¼lpÎ=Ýôš{ö;K'©fzáOvÖ,ôˆ==Œ=Z_‚ÌŸ )à Ái6†d%0~˜”2>,nâSg5LQsš¦ÃŠQ)6ˆ÷Ä»`×V:~g?¤O_怼Ue¹>ó‹ÕÆë”êsË”ò³‹‰ÙVØ2Sè¸goÐ+…·”På °ß ¾™ÔþÐ 9)z€JH¶­že‡s#ÄÆ*è™…~ ±³z¦ ñGFqþQ–Ärb1“bäkvVçÃ]rÏ£ý襼fg!Þ*ñ5caÏrZÅ8ðÊÀÎ/µÙ³³òLì,#«÷}Ã-_Œ Uãå€k¬]hø«‡+ÁçòšfÏ,µq²1£f2ó“;dÿ”aÄÞbÏ÷I¬ž€çCoý_Ÿ:^-ìœ Ímbö!×h|o“¡ã½Ý>ŧ+é• û Þ3±`KÎÍúÙ+þä Y°cÁÆ£ç³Ø‰€Ð|s­r¤¾‰»k V"øèbÏË“5žr ¹»NÑxIAf¨ÑÏöЩ0±%æ3ÄÚ÷W!—”£ŠGz{ùiÜšZ` ¶0¤•O0´Íu9±MwŠÏ.Dï€X°ÅgæAÃg +P³r§r‘êï¬oì,œ•”|ÌÁÎÒ ’F;‹Ù8ü±³\Øßc`¿âËǪ y£}“í|CòG‚Ñ(D[‹QVJ$‹Ÿ`w1Ÿ,—öÎ 5êƒkÖz»Ôúé6ð]•¤† ÆìnG0*ä®/ö ÏÇ>r*hsŸðHûl¡ë¾b 1ŠYÞ‘Ó6MJbï\Žž{,ߺ»Ë˜Ù8Í–mç›Ü0Ù'Õõeƒ ƒ÷ôÆSeà¥íä–ˆEüöSó¹–ˆ%6¾™ØY™Í`gY¸a-ªQæRvÿthu›úȱ³ à'ƒ•gbgþ•õš•0Lð ±àDV[ª,oGÎ v|vÛtè{ƒ¿œ,0Cb1[Ÿ SÁV ç³ºCfÏ÷ µàø3p©3÷ϯ¸²„>ÀÔ`y‰Içx`®Ê®¥‘mG|²øa`~+éM“ù£¬Oþà¦ï|¶üCÎ7ØçËyöZꄈøá¼Ÿ¿ÅE£åYM˜1 ?ãáÅitƃærjå8ôP¿á÷¢‡î4ÀòŸŒã“¥ÊK‹Á«›Ûm¯^ãæ¢× ßC™?®›¬– -Ë—òJ·eø“æsY-#'×óç­¸¾çNrÿ‹Ä΂Fzx²îOvVÒì¬x#±³Î,Wjo¬UãŠGëô~fxíàmc¯ÔV?I­:µÔ§ k®O\ñ­©O;:‰ôØ[>ÞL¼‡À¥!-{ð +ˆMÞ0IN­a¹×ɹˆƒbË'[åÎû{„öO¶óÍﮞza8ŸCµL§#Þ—Ts5´äqîQ-½¼\Rµÿ±‡ÜxsObáXÑ?ÜÒšfËêµiRÓ§[‘ƒI¬–5ñ%Mì,ØY·Ë}ß¹)'^xã 2êbaDçŒàƒ2‡iƒ“¬¸¼á¯ÙYè/9@|¥’®yjåÙejnÍTŠï¹-ŽRÍé%Jý;k ¥–‚]©DgŽÀY1¬qôM 9ŽâÑk«M|ŽwÖ7¦¨Õ?‹Ø¡€ÇUye¥áÈùÅjVÍdøbÏ?b þ8÷Ró bÇ—;Ñ_£=w°sj™ïmœ¤ÆÕŽ#†sx.±î¹íŽri÷ì_¨]Î}ÅᚊEÝŽbXšN 4×û˜#vRþ Mÿ”Êqn{E·ö ™èŸjmˆ(¶G}kH«™æ |²T}~‰Úó¥;é c¯âPÆpø|)¶Ø±3DYxéšyáÌ‹=鴂 ™í3(F²¸Fœ]ô‹{Ø{bïì¬|;K>úÖ:±ù½ˆÔoe1ßÕ,¿±V®eﻸk–\Ø=‹Xó…ƒóÔ†ëë¤ãïn$®-ö\âŠÆ³X}†_鉅RÇ]'¹ëÁ¾ëî6¾ý®ª+KÀ³ç¼'µìÚrCJÓd!(ÂJ®:³= õô#yõ6zŸïäZ?XO|'VcQ­Qvy©ÜòÉvù؇›‘'yjý4¼1ÁRòK²FÏGɵU K¶5$–“:?ßíÓ}Ï‹X2©µ ð¬òöbõºžÙ¶`Ѐa„¾1x4èkPFœÓt[Cfó4°»PóÉÙÓÁÜ fcÆ„úLy'戰Wô/£2må˜ìÈÈÃlI©8·ûÄxÌ)$Q¾L)º°@<þÉfôD”žÙ`~#~‹ÌÇ-„ëŠz”übÞñi`VÓœK݇눔RA TCrùxb0³{ƒäù³ßºqw7ãŒöÜÕòkËéÜdrö(ùì#ßµCƒ®^ö?÷QqྷÐ{o«‡œðšá‹ÔÌöéì^²÷À®}IÏ<œu“‚³†+EgçSÍÜ|g³’R?Ag 5XNM ëÜ^Gp·Df?°q½b®×û°ÜP§Ñi!(eòc¼/áø_Ö¡/ÁêÉa:Î`F,Oö·”’ž9à[áü1‰*®/ç}¶Ì0åhÎÕ²èE‰ÁáV`máz*Uo­+/-A/1Z É´á 1–à(c]):·€ø(´× &UëLpÖÐÛÆ,™\{{-ö¬ˆyˆ&ì¢øÚbµàÔÊY+Î-ÂùBø%çøT0°Ä£7ÖðýÏwsÍ­Ãþ.ö›iÖ1¼ÀŽbRù™ÅðóÈ¥”ä‚1”§dbÈow¤=!æßùæ;븣o¯Àõgõ¼N‰0¿‚˜*,®Ï+jÇ–Ä Âûfù#ŶîÅÊ3 E–Ÿ³ºe ò ­ÄüËC…àôaxÝ8{&¼Ø ¾uÛ½­bã»k°¿Ä²Þ9bçÓ]8멞ùJëÞ[K¾:½frVü^ò1ì^âì%xO8@q½+Ôýí;Á§ÒÞ´_ ê^ÄXü~!0Ê +g2Ð §Hô=l¥Óú˜˜ˆiÇ&©‚÷„½1!(ÔÒÝÕ…å´ŠF>Ìì{ÌIÕcM<ó·–+å§¡‡Š=HäŒJlž=1±XŒFŽ„×f(:±@i¸µý¥ˆÙ{}jñÅERrýxœ‰#2m•dp,Ùï‡ÿÊh‚8©€e•a‡þ¥\ÿÎ:0ˆÖØpiÇ'¡Î¦}äLvÁ /¯öü2ä#Ä­³½°o«QˆÏ½sørbñ´ºì"<‡ê=ÔªÌn‘Áw<ßη=ÜŸ§”³\\%ÄÚê ËøîgNêÐC81Ø«'ÖWB©=A¯g€JÏ,”ŠX^ ¾1þþ Üåî‡ÛôíŸmäﬦ=$;`;l™øÆ-SiýœN?:Ù”#·ÌÀ9®ý#ÊäâÁ¹œ²•Þpص¸UÈ9À„ÓjXœiœ(³üSÆy«Ò¡yjnãTÚ+k¼ºJìøt»ÔøîìÓ þÖžR¨wˆÅ²‚>G®å£ øý´_“Áì!»}*Ö˜TØëÈלYÈu|²™kþp=wüýµ˜EÃÓmÀÇ#’m”’¾yćÃ’Ü¡Ùr(‹¡¹vjò±‰`*`i³|Tªèc>ôìØ$«¹F`ï þ¼)%:ÅN<\l¯$VŒ•óz˜jŸF}>V3Q½Áž‡k¾´§›Vã­ã4È£Q› ÞÅuGž„ýV‰Ù¬™bC¶ Æ4»fJ^Ç œå‘#ÓmUÄó†·×!_O õ Îl©…½spvë +¯ûÅJÒñ ¨á¿‘G7=¾ÌΟT=ŽÅ±qçÁ{e>EJi˜¦3ñ„q^1³…˜Ý*rpnÑ£M-K¬&òÁo­"Î+z&,Å—j®™üاÌÇç +¬XôÙÙSÙµËcvÆêäE°AV­ÞY…ûˆœPhyg½\Å~{ŸÄ?üaôyÐ'O*C{¥,'ŸMé{âŽ9:!‰åÛ8K[Įۑ“óÁ¢#^öéÒÊÆ¡N»k›®üCõå%t¸ìô\œw7 BœÄú¢][ø+Cvû ŠK–œ½géHçl²ÓÒ9|õõ%|ŵEbRÃ8äsôÞpî¥õ³ÍXOÄØ +޶'\{â›íúKßzH'¾u—_ºñUgÁ‰Ö˜AþÇîÝ+}Öø,rÜâ¸ÐÉeÕJö öÝEŽKñ³+—¯^ë¸Bèî¸Ðô‹Ù÷=cC‚C"Ùuþ~áüìüg¤í² 7­[¾zÕÊuŽ6­Ü°|íê #ðõM«W/_³rÃúùz8}Ýôøºé'þøú¿üžÿÓ×ÿå÷i+Œ´ië=Òv“ãÂEŽ"ûß•ŽN#mcþ¸:{CÂ7ÿñï]ì¼¾Vì§W9ŠûFÚ®pLñÜí.¹9Šì +*Ž+é˜þã¸ì¿ÿ${k—¯ßèhp\Åþ»~5û®xèÿã3ؼ~ÖŸ6:®e/aÕFöŸ•ìŸxæJöJçÑËÄMÞì¸vÕúõÙ½v±Ýï"höìv׸¸ w]€™—lŽwù ¹'çgæáíoæîd¶ßMÖìuÖj\ÝVÈL˜e H}P†µ>(ÝZ`奯˜ïqòÔìØº_ã²WÒxðafÆs}˜ù^WQãìä­Ù¿×Ku4/Ã!smàa+o¿h ."×VZhë˜bå¦õѸ{Ô@Jçg©Ì¦õM²tóö¡¿íêm`¿C§Ù³Ã…}Öj¼¥`sLDàôú¾ô3ÞRˆ”l •CJÅx¨³[f`ÊS°¤àžc‡ihšz9\>“§˜Æ©dLjò›gb +“’üÁK“ÓPC O³…j,M_V]\‰‰ML—ɶ¤NÁ>+¡)6J4ÔKê&BiŠTKðó˜N:”4\:lmŒ,°7IJ¿_æµ!:ÃŽTS¬u˜6æfœâo¥"¨1V˜6ÄD±k m-'i8¿p )¶z &møxk>8–Ôe Î%…¥Û`’êª:½¯™N>h&bR?Œ½ÿ¨[5½j¢Zzr‘!»{&¦”½Õ3Á?Þ +ª ôÞ‹æ0{ˆýLŒâzÆCêF™íÓ•¼YRfË!¾È^Œ«b_¯+%׎‚³‡{"- è*Eg 5Œã“é„8©ÙŽ¡k‚©‚ìãS0å„“õt’*ìïð>a¼äkåD/C°9¶¡Ðìédæ¥õ3sóR5PcÒajA +'¥G÷ŠÆ¤ƒýz &KuJ„…ž½ÞŸ]SöÿPÉÜã|@ƒÉS(¾ +!…¶\H±­þ`’T½=¡lêé§ÑC- Šéê¡Ó`²Z<\5ÆÛ?ÆÂÕ]ÖìÚç©qÇä«_²µY9JŠ«#FŒÐ‹Qæ 7xã,\ØÏ¹ì†j¯¯TŒð: V¤óI° Ñ–BP’µšmgˆÈ¡Äöɬ…ÍÍTÒj'à$ºž½_öÌ•¤šqjFÛTCN—#T ‰ã ÜHJWÉ¥ã`?Rx¢ ’h­¦¶La×wªÅŠÌãÓÔÆ;›”Úëk ™•“ñ3³)2ÉÓ¤Z’×Nô&µ‚–™°yŸ”ºÉƘô‘†Ø$;CRÙ8¨ZÃá\{¨I~‡­ L…Þ'ÄBð´"ÅȰ,[16s&-ǦaXŽË³W‚2lH=(ûèTLc©I•ãäð [áÐak(vÑ”³}>8ÒR Œ±‚„’Äl#¡h ¦é ¥g–(•—N#2íĨ [Ø9&ü T„)šàKn˜@áù#`›jv×LRÄ:úÁF¹ùîVL8J™& !&o„ÎÀJŽcöŒÉÜžÙPY Ò[dº-M¡¤8rÚgJñÅ£¥ÐÄá4e‚‰XvßhR/(ÜJJïœ*EäÙyÉæ{wº2¹W£Øz3$Xjåh ½Æîeœ%Ç>´r¨¹»‡¬ñpMtc¤©É&²5ïoæÅ5PbÅ냒«9 “9BDѨóá÷xqfÞB°),³÷€if)¡~¬œk£3ÄZào@±ÓÉJXŽ#èþ„bŠÏ4u %JİäáJh^¶Ð©ÌúDY*¡¹vjRÍxCl¹ƒ‘n§†%Û`JÕ˜R9AòÇDŠ5&`¥ôjš"ƒš¦èÙý±%j»¤Ü“T>N+uÀT"©ì%4Œ§û”Þ8I®|{¦ 1¥)U%™]W¨S0ß‹ICÑ©…†êk« GN-RIå¡o¾!ÓòÙ#È2ÿišèe>™ùLLÑÀ®hb•Ý+1,e8&Òa3†Äü1˜j¥ÉdLäõÍÆÔM®Æ!{c~ÙP>V+£Äf„ŸÃï"Å,Üó´Jš*¥ ð#ýó 'æa­©…}s¡~ešüœC“cÝ3Õ¬ÖiPá1æÌ¡¿Ń˜¬rvË4L¡Ñ$tQÏlÓ~˜Él˜,§ÖŽ'e`({‡gÚQ†Tˆ[§cŠMΨ¨ÄçŽÂú†â+ü*TÁðZy#»—°GLò0Ÿû„r…a…)8(FÀ®\÷zj\h5PwÒ‹Ì÷ó÷F^fÏg>‰÷µÒ‚ÌáH‘ 8iì¾YïjÁFXb*ÚÍS¯ñÌ…ÀTk!$ËŠ·øÛPž‡ñ¾IV˜ÆÚÂôMJÄû‹*¡$TŒ…w †¡ÄU:@ñÏÅyŸ†SÃÍLÔçØr¾1–Pî …T{I!‚ùBø5,Åê Jlþ(øF¨Š¡é6˜VT‹;ç`¢þ¶%‡1ûd÷“&¢²š¦B±“¶RpÚpRK¬¡é?cáÀ|š¢f÷MM;6Ù”tÌT‹zç²ü`:Ô†Ô’Þyjù…¥ðMjÉé…ðE†Ä¨d‰AÑV4ÑÅÖr 9äð0L­ª©eã•ÃecääÚñP!…2¨ ¦7b"m>¦ yÌ–01‹‰C¶~HŽØØk=¤ÔO€ÚÞÖ&V•ò‹Ki·þÎLja² PÈgHE'«m:~7”Å1*Æ`*0{„’Åì“l°Å’¾¹Pm6 Í3¤wLÇ$>û[±–0ý$GÚCYž¦á¡Ê{¸ÐžbzrãD¬!’]û¨T[Lñ‘Oe¾Šœ_4»‡H1¾Ž^7î{&Èq= Œ®f /ˆ!,.„fÚByVð‰³”¦XCq jy<ó‹œbŽüSPÌ€BÔh¡Œ€ÊuŒÌ~£‹FB@Fã$1±t ¦¢9– pIVBdñ¨RIG.,PŠ..$E8ÿ8+‰ùRšekÒyÔa¿ñÇ'`²] …41МT˜Ÿ}c¬xC I±›½ÄeLxÓTxåjD–MÒû®Ÿ@9 |d‹å™,'ÌnšFö Õö}Ü{øAúÙÄÆ È… 6B>*åødšdñ¹î!©«d°<.¹v©5ÅŒVJÇ’2³ ø(Š¿±Ìf01‹5”qt2MgC™*¹ØÁ×9KÍëpÄd/M8²õŠu JLôaÝ@™E!¥‡Öx¤ åjf‡P£©Æœ&š`„mü9½Zzn!•¡N%–]\Ål¨‚`BŸá3iÚSŠ9ÝÓ1J“•ÌÖ *Uq¨±˜ÔΘ/gׂÙ×Xø~¨Ãбù#‰–QtbÔY0)‰Ü~OŽÎ‰ÉC²Xf³ ¤¦ˆ¯ÅåäB3† þÌ÷AÍÓö¹l1LSøP‹Ê u<žù?!ìð0\|À—°k:ÆÉ⋯ +òÂ’lLÓ¡ì5TÞXAk‹Õð´ÞØ÷à ÛÈåo/š>Û$ÖÜ\AªÃWÓdcT‰½”Ú2I:òÖb±åÉ6©ö“µRD¥½§~:ÌBI©› T]X&×^Y©qºv}³0™…9RA™2‚å—ñì¾Æ³øÅÖ£šv|Š1¯.|üŽè{ÈêH”/Câö…ù8ئ +Åפ#c¡ˆHS™ì>"¢éTv¿a#PŸ IkLÔâš°õAŠ*,’#³í0™J* ðQ¸_±¥£q-ø(Þ`j$¨†ªCs¤èR{øT(äáoÐ4z6®mýD ~“Õ°[¨p !Ù6:P'‚­à++d¶þÉ>‹zçx‹AfZË=Uö™Õ*ø··a®eõ—^5AH-áõ„jÉÕÅPí¥É×’ A4€ZM9'²ü˜þ]=V.>=O¬|k ԬŌ¦I ~P#&׳ڦàƒÏè˜ JÏAб: „0¨¹‹1Å#AóУ̑“ÒÏj2#óßA©Ã@…G‰«KvÀbâ£Êê ò—P÷‹Ì²“S«Æ‘ÊCÇ 'ª¿CRl(&²û˵=Ú •}¾æúR(ÀÃ>Ét9‡ ¯† +r+VÌ€¯aqkìy"Ý*XÌBμÊ.*»P—£8Ëâ‹Ìâ ü0åÌ–‰^’Q7¦¼YÞBqˆå¤’ÎꆰT[ÊEXì”þø:)®@E‰­_Ø$üMÿñ¬¬)øg¹°k)Y±ïÑk+ê› BÏùÊs ¿¡N†õŽ¿ƒµõ(èˆÌÖ(ÎAI; Þ +ëŒTØß„b¿>€ÕÌ>á¨EïxW0uO>´e2jYÎ'†j=šNgë×OI.q ‚‹±R«9XLÂØ:L¶æY<q ö)® ª®3¦Ú½ô¬Vá}ÍÐKB^ˆ×&ø n7×JÁ¬ 5‡ò@Ô'@~†ûÌ|b2Ë…m”Ò‹‹±¾›¡+Å–"åRæû‘ +~a–\P´¥> Æ’âÁáÒQ\H²5Ôp¡p¨eu¹Iñ/Þ½ !2ߎ÷·ôB½®DZx +æ¨ÇPOáºé}¢- îHj²¬N—BÒ‡CmhAPˆÉa5n>»GÈÓŠNÎ-kº•ÖüXfõ$®óáVqðWýÉÿ±G×þÍ&¨d’’?l0¥a¼>0ÖÒ[RÍ@wß[+Õ¼¿ZНtàb­ÐÃbÖ€“9~“êáÌ:ôPX-}|‰,'ˆN¡F%Ù"ÿTSKÆ¢žMÊçXST+°Z›åHÖP:€"µ!‘å–P J®™…)KHÉ2©~<ùZ³@/¡ÜvÏ|¶I©op®Tsu…L*Í£H5þ¨îÎZ±ïûýÒÉWÞ|ÿKR %Õ—è¢QȯIaöpÞHÐèÚ3Ûƒ]#ï‚ïD¼µµ…Î~¾}¡˜{þPê0ÊCÄ×9€ü@yAFûtR¡f9TTÈGãçX^ ê)µÆŽ"sl±Ö`›äcÙZPQïã3‹ .{Ý4¸ïzßd+ÔÏ ÎšÖO‚P›ÖKAæRX¶-ü¶Ä| +úP¤œ‘ù +P˜H>6­¥aPíe çX]íÍj/Æ[ö7#ÅIöuø>ñ³ÝÀ4k¨J¢^‡ +<§ÄZ@µê~|PŠ5Ö¡Þ÷°%­1æcÑ·„ïdõž%Å?Šó#AÓC92ê«g G#_•І;ëH ê¨Y uáÔ+wñü¯:îìàë¿X âÖ1ê8O‘§ µ@N¨~k©W< +±ˆ`ê)È[a9]Ž R©,Þ¢÷dÌn‰\þ*¬^¦Æ°|J,Èû¡>Íü!b9ùP¨¾@—êõ"¨Øe ôÔBª³Z§«ym3‘Ç¢g¨¦VM0¤Ô™3j'S¾\Ò3‡ï¸·¨H‰ecÐÏ$eˆ¢æYJéÀ¡ñ£u|ï«Ý|ß·»ˆüØüÉF©æÎj¨ÊaE#kA¿áBÒ‡X„|U8þÉ©öƒµRzÓ$ä‡BHÚp(’ MŸo⻞m'µUз2;¦Ší¦áȵÅâ±»›¤¶';åŽÇ»å¶{NP21©²¸’Ó2 u)©ú@Íq t”ü^GÊÙ‡Rve‰Tuc¹xôãõ®z z° w7½©^gv…5E„V÷“º|hâpä +jNV?AÖ&³{ôyÐO¢KìeV·@±};ä½ÜAæ?ýS­QÓAí êDR|=åÖrtÅhøeä;è CÑ6 …w9¦r4¨è:Ñß\ +É´‘cŒV2‡Ã6¡üˆ<Ôp¸zuPqFo—úéu“ÔÒs&¥Ô,‡KÈ\TMâòF‘ÂoAû ®õã Üéß]ùsõÐü²SH¯ûóRÃÌÑ—…Z7ò8\+RwÇ:g~‚òs(Hå4N£ž>zHGN-¢~õŽNZ(ú2Pa–Ñë‹G/…å¬^‡Bzã†xS‘?¦›dR"bù+ó“TC•@ðìxï“úêõ¨,;êùýsH¹ŒÔŠºgCÉÊêP7SkÆIɬ~I<2ýU1±p4‰|SvqHÇT?A‰ºúÚrÐøäÔ®)Èq¿'¤ò«K„ÎowŠGlóúf .Êi­“ņ·Vr]_íÙK*ê%&T9ð¡,æÅ³<§°Çë@i¹ï$´=ÞÊw<Þ&5~¸”X"a…#•¬šIríùå a@qˆ”Õ ê…}Ôp•7—ãzë}¾Vßõ| ©…eÚ +£¬P¯‹¨×'YÞ„þkå{Ê¥’ëÆÓ:`÷¹|r`äÂbLÙ(%µÙT¯'”ަ#ó¹ˆP™–‹Ï/jn.—K¯,–Mƒ’†áûDœ`¯Í˜ÚlR×e×FM8>*·úƒ ×DZ@9Hfþ=2=«á±^”àTì Jzÿ¨×ÓíЯ¡^!óeRÑàê¢v Ž•nئŒ>Þ´¾ñÆJáô7”ËOüàOû †ûš!e üXâØ5|¸ÚqË~Š5QŸcoJevHêVP\†ÿÌëšuVRéD¯×+·”7ÿPå³WRX]Çòø[R¸2Õë#QcᵑºcNËt¹dh«QÝœÉîŸIj,õPóÁ×”ŸYŒš^®¸²>‘oþxƒXóî +±¹?l:4ÏêñPÊ0Rt,è™…üD +Næ“×1›?þ—õ Έ¥Ñ•öˆiè]+‘¬öÎ=9KÎ>éˆ8Mµ$‹éP8 M¨fu%‹ÙPUÓ«1 G0¥¶<Ø¥´?Ù Šr ø zNëšÅ5±žÅ®¦÷Ö‹Gß'@ÊoS›'âžJ¥¾ÿ÷]Ú¾o¶¾®×‘óÙ5E½NÔ‰0¶æ#RmIa“ù[¹öÚJ%¿ÃQÍíœÉêà9P]D +¥vê×€XÔpgXùöRA|¦ºÕJP1%Hh²Õë뤨êQÔßW¢þ¬×¥šKËA?Bÿ y:Ö*r S½Žõ’eåzÚ_c÷vâ“Ó;[Í>>êu?V¯ƒÁî-õ‹çR½Œ¯ÅeØËe'’òúLD‹š'wÝߣ }é%Ÿ{Ήß»èÛ?ÚD´ˆvÍX.Äò%Ú‚Wc-Lª¨¬ög> k¯êÿ¨×‘S¡~D õ$(Y¡Ÿ~³¹ò­eJÙéEjî±i +ÕëUT¯C ¯‘êuôQO Îƒe~„DáØµ ›¡·Ž>%Õj,/¥Zj{è5ä¶LACb¾o¿·Ô9¾óÅ–“˜h,'Ã:¥žmx¶g $Z„ò/´ÐÒ¥ìþÞ«•=9àó-¢h¤ÏüpZÍDÐ"”èT;¬"‘d÷Ì@NÌû¯™hJëc'¹ãùn¼?¨‡#†ŠAìïÇ—;@‘ êXð« ð-¬Æ®¼L=WR—;rr>×þp+7ø‹3¾ F«È‰pÍ +NÏ7æµ;¢óía›ÈmH½ðØGÄŽ{;Ä–O¶B%Þ'.ÞZ#)²Ã‘T>;¿tV¿òƵ޽»–ì³ôÌìÑHGÎ- ¶Ê[ˤœ!G>ªp„7öG¹søW5·Ç÷1 } !4}8Ôf9¿+ì-˜µh¿»ò­UôÚЈcy8ó]*óíð‹¤ÊÆìhˆèA Ù_P©%ZDI‡ãŸ´ˆ2Ð"*MÊýˆÿð/i­Tÿ!±Z¹¹·‡‘r ĬGđ՞PN…­‘ŸL¨Kût¨íCSi=Q=»yšTtz®T~y±É±¿•=äŒi• z†ýª¡Ym„œ€>“2á…%X³äKá;ÿ‘#°ºÜÈrRígßC}N?O{‰­Ó¡¦*UÝZAýˆˆ,;äóD\ˆ)m gkàP¤ÕmD‹h˜.}u€âGh——ª!›Â~NTÁÓl§€Äô-b2hxoÆ×´ˆ ôá&ÅËwÖ +N/PXî"¥ GÊj"ô<óg©¥âäbPÊ„¶Ï·ˆuWW€f‚Ÿ…2²Tvm1×ôpˆR&%ìŽéèWÑòn–¯cÏ >ÊPÈÖ7ó™èÍ’JÉ~É´ç:ˆÜ÷Ô…ïþÖIdµ-)˲|Šžð) eà¬úD¨ùŨ##©ÿ€³zX˜då© 2sÝ# çiZ6’6 Äœбµ+°5ª#úI8³€< +tG P¡ÇÀ¾n Õ_Ô@´Çþ%˩Ėû[•òëˉLÀ®™Ðúù®ï…×úÅ&]ÏómÈÓлôbù¶Ç>¢EèY­®ãÿ¤E8Â7`ïÊÃÓ ñ> }âoõ }É êÍ`ï¶Iu5”2% CKA}Ïü ú(PÑCeZÑ¡PT¥½òS¯ËPÜ7Ÿ”¬“jÆ›ˆ†S>ÀÖèAè*QÌ~™]¢Šì©†ØZu‰()Ô·5­à§@:a±}g"¢'U8pÑ–8B4‰ÃyÿM‹èz¸[éyä"¤5M|M‹Ðã,ÈfЇL«ü´Ü5û_iù&Z‹qD{`vcLf5Ppêp10Öšú 93Q;‘€­#ôß)ÿ-83—ì.ªÔ~U®ë‡B×wNBÝ»«¨ß_4ŠïÿÞëTŠÏ‰ý'¬_•üPýD"×°Ø*†% ÇÔÔ ´‚åp¾çÑNRG‡Ú)j!þ¹§—§Æã€—†Õýf¨s°?€zµSn¿²èþ}‚Æy³›f×¶ýÐUÑkÕ…€òÕ4D_ôͰ‡…߃˜TgQ¿²˜‰~!ˆvDç@/u9ˆž 5°˜‰œq5/”,q]Hñ³ïånýÙ_\ØšZZ6hž.P +÷1ÇN4 3¢þ‡:5Ñ"\Í7^#Jn•ƒùkêOJŽûMûþ‘Vô9(Ú +×J gñ„Û¨t;>8üåõo¯SšßÝJ~9'z wÕßX-»³y&qOá„co¯6)‘VO¢}ÔüVG죒rcýÕUÒÀW®Pè‡ßÆŠ1™ùò’®¹JÏýý†§:µÿO¡ï»½\ëƒD‹`ëD*==ŸkyŸhBó盈Áêgœ·póðÑx(Qæ & ˆ>³ [gÂB´ˆ\-BýWZDôkZD¼µàbÁ+¡æ”ïbO˜Åy¡ùîéøÇ›$–wRÏ ìôBøª9SNT Ï-»¾q–útå»sB_ZÉ;5GÎh›* ~·$6ªy¡Šz çÃØQ4c FÓ¹ˆ”ºñ¨ËÑ?B­ŽútOäè¡©AIà Q%£@³ÂÞ'”g…†ÏÖI™ýÓ¸ˆ";(¼óq5£aŸZ5Ä|ßOÓî}—}ÞO)”öC‘w +v@‰Êæèaéx‰b¬©ž¨º¶g¾`£Â¡xk‰ÕÒxïj×Ý}býëTÛ¨÷žR9Žöÿp–#Š®=Ž\çÃmRï7.D‹¨¹²6ÃýI‹Hþƒ7Ü@´ˆ³Ë¡¶¯Æ•ŒAoMÇÖ³',×4d4M5à,òÆà¤aèµi9ƒF<n©&ÖŒ'•zœ¹(è› _{%?eÔã·7Éõïo0æt9â~¢ÿª|ŠZÔ1jÇú¦ë+ÅÓ/<åþçn¸¿ N‘¯m¹»Ã0tO+wÞw–ŽÝ^ß =q…:3z—tJ§e'¡@ý=»×´‘h_n—û~pU_yòC¿îãúŸí”Šçb‡?”9L(Ùš Í·yM‹ZŸmUY]?eÙ¡êìrC^í4Šï,–É5g–Êu7תeç–PŒ|€Å:ÛÃü=î•ÐöñV¹ýþn©ëîn¡ë‹¸¿è= õ¬ÆÞòuáÙù\ÛW[øºWŠÅWæ U7—’*¿´4J±ìÔ|ät”›cù>H +ùs¥¦»[¥¶;Qó©Ç& nÀ~=êZÈåqnÙ„|ìÖF¥óñ~qèk7ÃÅG~†3/d¡òÆ!¥m¢_ëÀÅ–ÛcBçmé-úšy3;E "²<€­—Ùðk2[ßèEa¿ÈÓ•×à爸ÂòBCéååÆÂþy”Ï.ƒó L(í_ì–kÞ_Cç°gé{½ n‚¤ŠûÃ5}°Nlx{hjÊqêA €3GÆ‚¦Y†âžy†Š++p¦Ã”ÓtN§Þ;ú@ %c¨Çžql +êqêa@=7®píñ$—8 ŽÞŠ¡åá¥éÓm¦šÅïTœï8¿ØPÔ;={"OÒ>t¹z ;JU'‰§»Ë·¯ß ÝÑmß èÀt–­ûsgCßc¹ÿ‘+×ñþF¢;‚¦Ýøñz¨æCÅšö#@žb9úÿ&«ÙRk'`_”kbµ)ËÃÕÓOy®ÿk'Ð"@( zfšö'z§ó‡«Gƒ¢.–¾³˜h)•c©ŽªXˆž—šß:“h&Z„rì­õ Bš>Ëý ñ¬Èír$2«SIm˜}_ê|à$u?ÞCõI×s'와èâ_ÿ¿ï¦ýI¼ëù~Îýxh“ª83hŸ©à\þ>TÓ›ïíTºŸíj?\…ëÛ¡=!Pw°—н4ÄCV#)gó~×ß2¼õ0@{ò''¬¡úör1¹c"TñQk¢^¢}àÕ£Ég·O‡ÊºÐýr7ìݕ僮Έ<ªUX|gq^̰3"Ž€.? þÝ[A犕üúi¤”Œ½#œ-Ùe¨,—]]bÈé›…=!ä¿DhÃ%öWؽÄY1øä ë©1ù£¨×(ÓF‰o`uô©¹JÍõ5ðDa­<41V¿V\!gØ®”RF}uôMŒm_í¹^Îl›Šš½(œ÷ñIª™è“3JM+Ÿ@êøÐqo¹ÁçÎÆkŸú~ð—ñâK=ö©Ü]õÄ&ª×ÐÛݱòÒbk…ž¯÷€À)t>Ý!5|°^9ra‘R88‡h»ØóO­ŸˆU0’ö`ÿ…Á³ú•ö… +Úg‚lŽzBßòùçøˆ|[.¼ØŽÙÈ4±ðü<¢‰:ŸßÆj•ã3ä×´Ä œÇ«9·L8~kb¶¡phr¿×ýUªiKæ‹mŸíPÛìU:8 ½_þI¼^ïN>÷þ߉wOœ@¼Ã9LZcè1[$åøÊS‹ˆ +Åâ?΂ND¥ÂÓspFdA)½q"ÙåÍårFçTØüj3±ïÅ>©üÔ¢;œž ’4Ÿ|tŸQ?½œ…RŽ×Æ[aÏLf±y”ÒûÌMf¹"zOœlŽó°ÈûˆæÈâHg £Ÿ)…±ÜýxØd¼é¬õÀA­¾¶ŒúÌ_€–*gÖ›Î| NAÎÎê :£‹³ŒW–F@烰߀}”ƒ‰VاÂþö†Ð£ÀY5¿Ó‘Εƒì€=8PÄJY•T5VˆˆFgdX*jJÔÝiÇ'âƒÎô×±ü¹.è8YmS±ï‰=?18•â>4œÎ¶fvNÃ-j>Täc„˜â‘ z£N}” e¹tΠ£\ýéZärFÏ4ŠÍQy#i?ÞnAyXdšÊâ!)ÅÓy‰|ê÷ÒßAÝŠ^jÉÙToT^YBT“\œg÷ÿÎZ±8‹ú”fjÕÕUJù•e¸·Ø³Æ^=Q%ÐÇÄþ%ú…8ã‹>þÀlê aÏ”ù^ÚËG Ïcy†”T<†ü(èIØk†Ö\[I$ôÓ±ÏUÐ=‡Èeð×µ××*u—W¡Ž3õ[f‚/}ëÊõ<ߺ£œPå FeÚá5³PFÍÐÞRÝ8¢<3ÿ¦–žXD±ŸêÖiôý°|;)´>èŒzHŽ-΢ ¦÷ 5©÷²DoIçež1™i˧Xƒ0‚‰”Ó5]¬}µpü‹ X “±ºÞ\Ç|,òbœÍ%:öËÒ«'€ú„s)RÍíU¦kpt2b*½fœAª¸±\h¼·TYªç™o…]㜨O~çªK‘ÿƒÂjbåÈÕ%ØS4õúç‚–¥–]]&5|¸žrVäa)õéƒÎÉ]^ByúÂ,^’_Èé˜{‘jo¯¥‹ú—ÌîÙu]r(ˆ; •€>&4\_M{(¸Þ½ó¨'ˆ=!ì;¢g\Ø5“ò'Ïø®/¶ M·ÖѾUT‘=(hØçWª/®@?M¬»½´U¢Õ7¸žÈ~ WVÂ/ó-ÌOS¬c1ðÈ ‹Ù§QN HBeçQìøn¿¾ïÙ±x`~ýC}Ç‹­Ø“j>\…ú…k}¸Ixé! ü¸Ÿoº•ì¾úhpëùö{[XÌZ?Œ}TV¯EÏ[)<1þ1G-½´Dª»¶‚z  PŸzêÅ·ÝÛ,˜MôªB#­(ÞîÒóý.¾ûÇbÝçëpáq†U¬ûhttœ˜Ö>I*:5Gèþz—Ò÷Üätê7b® 5ö<‘£_×ïˆ}@ñP¾-ͪ䜞­fõÎÄ2¢Þ3ÉðÁUWXqs%åy§¥ü3³ÅŠ+‹¸cìï"gMižÀÅ×á3:& ¹'grw×p§þ¶_8ó‹‡îÔ?÷è¯ü§ÿî¿ùðïÿ~P¸ú«$œø›7ø7g~à·=Ò¹têçÁ†wŸÄ¨ï=‹ßúNû~Ü'5}²Å§¸cž1"Í} :»Ê®hl.«n®”ºží6žxÂû ÝSöÜãüºïj•æw¹8¾zœ1³®1êJ¾ýÑVôg”ê[kp.ƒïx´T ª9Yn/ ~{@úÉMìùeØùõ.ì›à$#òs=/v …v?ßÎ5Ý¥¾´Týö +øO~à›=ð-bÇ‹ @‚ ;SKÏ.¦^*½°~ Ÿ¥¢Óó„º+„cŸ­çú¾ÝÅ÷<ß% <߯ =÷”ž’ëüj^#ú7xí\ۃͰØ5ßýÍNœNüä*ž}¡EZ¼ø-§ëùy»¾õÕfnèß÷Š7ôQ>þö°ô—ï"Ô›/‚Å˯Dù,û`?k¸ðØG:ÿ\¯œΞ÷ŠS®<ó•./òµŸ¯âk?YÉ5=ݨúûáê÷’áæã0ÃÕGþÈe 'sÂÀO.úÁWN¨•@IÂYñØÇ›Ô¶ûÎòåW²tþG½Øü`³‰@:8_ì|¹KßøÑJ>æÈHÔÝBç‹>—ø\x(ôýs¯Pó—• ä*eï,':[Û“´§uäí¥ˆÇÔï L±F=(Õ}¼1”òcŸoTJ¯/ÃùcÏ/¥çGô ÄâKóYý4IÈœ.ä˜É^íÕòd•×¥ÿÚ£¿ùŸzþο¸¿üO?რÒöÔÝû/áÕ?Òå¿-_þ-S¸ÿSŒôá/á¸vÆ{wóÔû3å[? ×S„›¿ªê­¯Â7¾Œð¹øÈߨ÷Xkh}¸ÇÐñd¿ØõÜ™ùž-¸¯|Í¥bÇ«jÿ oßþ'¼Òñõ^¥üÆrÔŠ¾ym³ Õ“}9øäÌ“ë±w|›HN |bŸñQ<ý§xæWoéÊ×’tå¥,Ýüæ rãI°|ûë åÔ7ð½ýéaåÚ_±÷›½ú®/·r½?8±°9±æ½•°KؘÐÿý^¹ï•+ökå¡o`›Æyã™û²Ø÷x/ßý|'|ŸÔÃü_Çóسàz¾ÝÁ ü´Kwò¯Î‰_\„3?¸sç;ÀŸýÝ?ÿ»§øö¯FéæÏÌü(ñ·~ÿY{°¦šuï{hö +*öÞ{ï…"’dÕ:ŠŠbAzWé5”ЋJ±¢bï€"½wPz±?Ågï½¾™åóœ³ßsÎwÞ½¯ëM®eBBpÍÌ=w™¬ùý%Ô«þâû=–¢[°]8}¿Y*~ÐnI=èwzøhYp韛°ð+{ü™ Š>¾ù»9öü+MWvžWÖº™¿zçhþäÝqIA­”Ìk7!sú йQ1E[Q,`ã +Ìð%taŸ„ÊÒ¥ /°¼VfN¥uió-í•L­Î*#uJô]¨Yñgé³jÑ>3ºp@*¾ù^$ÉíÄ%yÍÕn(ÊéãPWû ©àGkÚuéÎ +BV¶U)Ú†òÑE8ϣʶ‰²ßв>™}Ú‚Ü/šÂä¡]üìoûø¹?ðÞ0¿9*ìÿãœx¨1Œ깄5|9·q&?úƒß|$#eÖýweGºn$Ї›ÂE}B¤ÝÍæ=U²Ã]/R$Mµ°ÅÄ믖tQßqYóyéË–S¢‚‰ôvƒ¹Åý*{Ë—EÎËNŠïÖK±œ/:ÂÔÎÝôµô~Ãaêæ†Ëëw¡õ?´fLçtp âI¯Ô -nÕژݨ—¢z“Èz¯C![¸Ü­GÜîà‹ ÛÌE/H^´Ø ~7Æ~O†¤ô›®“tQïò途x8HÑÏÞ[QÅ]GÈ¢O6Ä›¡CdEßI²|À|ûÙ/ùÝýÍLøò —|² «z$]•—$ï˃DµUnä³DA¿È1ÀÒ»öa—?Dó¼ÛMPÞ‹Å÷Û,¨»-™Ûi„]íÖ¦s:¹Ò‡5‡}KŸT¥owÄ­^SâZ· }»‹ßkµ ŸvYà7¾bM¨›]^ø^€=ìÅñƒR¢è« õ®Ïªê>M–÷ž k>œ!k»OáχÅäý^Å&üù€¿ûAˆ=ÒwÛi¢¸Íšlî8K÷´š •LjGZ…팿±Å[>;’ÍÝçÉ×6xþ'"ÆPׄ™¨.Cßi²¾æ¥(> õ*~tý:þµ¿kÓ…ÝÉ›j'ÛG/œ$ɺdÄõ‚›ßõ°[ߌ„/?“ØãaBû«¦0q`» õÛnQúˆ4§³¸SwDú¦ÔŬ²ÔDzüŸyQ…«øyÃ1É­6‘(÷½)›«\ÐCuã•=dsÂíb·+ó„I ;„÷áae߬ˆÏ^âOåa⑊0úÓ‡`ê—Þ úSK0õuð"9<è/®Œ8Ò™+;ÑžX–Su!ñp÷Íx|ø7oñ`[Ä¡÷äæ}å2qG˜ä}[ÑØíûÓ|=bK½±æ|ײ†5$/ZÌKª<¥:ŽÐ¯ú÷FpòI¯X\ÞêlÞQ.®lw£_·Û‹Ê:OKJk]$uæuÅDåíg%/DoÄE­§¨—ݶÄëKñ‹fh5ö’⊓â’Ú“Ðç™™^îÝ-¹·Œ/oØÌ¿ýþÆ/<$êj”öVEJë"E½­—èÁöKâ¾ÖP¢óƒ« âo‚Š?̱Š_l…5_ìˆÝè‘– ɧº(ÛÞ‰âOmáD͇SÄË>)y}€‹E¿ÝHD¾Ú€Ç5nǯ}4B¯‰žµØš½¬v”¾¨rÖØH +Z̤÷ê¬Ì +ê,ȇ]bêñ)ö´—¢^vØŠŠ[Nˆ_4?î´=zo…|7Á óI©—¶âš7Qc½·´­ö’Eoiì‘©ö×R÷ÜK²|™(®wÔŠ*œ‰WƒæTyçIª½ÞÛ¼ïm¬õÀ‹„£]7SÚ³’Î6§&96&ÅŸjM—íÌ7.Š$Gúý… ¿ã?øÝ­ÿˆOG©‰¼®.À3> ò† ©+C†È·¡Ø%ô~¶€—ñq;Y2rØüýÛH«®"™EcIˆM÷ÓëîW t]›«°ô»ç£)x¶˜oí:ÊÄÐ „­¢ÈóÆ"qa“•U÷«xû®[ig[³³í:¤š5—¡¸FÝjÇEy­¦¢BØO¯ËÍ›Š‚¥¯jNS×Úx’["äg¨÷­¾Çºr¡Í%¦”ÄW„$ ´é»g6R-ùô&ÒªÿÌ­IÆÚdn…wÜ +¯¸ìr¿x‡öŒ ´[›ÞÂ8»®›‰’¡ÚñP{¨uÏËx²eØ…Ÿ1Æs¿ë S{÷þ—W¾è›?i8#yÜm‡]ýã Q¾ž[·^øì)í¬ ¶í~–tøýãd³ºº£ÅWÜÓ|ɲï]œ¤§.”,ë¶–|2<ú'|Ú‡“ï:‘5g… ß“½MÞhL¬{Ç‹ê+ÝL Õã^®ßÂËÞŹû㧈1â·ý~ľãª<³Ú71¥Æ/)´áRŠ_CDê™öŒTÛÞ{‰’/5ÑâÏáô§®PÑ·ÎPë¾q§[3’tæÇ[ >ŠÔÿ8Ì»ý»6yý W\Ø ãü°ô` Yºå®dnŸsïvHèë0ÿ»Ö™]mJÒ» ©”šýx»íxÞG=ñËN{³šJ_Ie'ý¸ßB˜ó«–0¶lñf_V¾{2‚I+ýxšr¨÷Y²´»2Lô¡!Ðl¤2Ö±555 1,Í¿1,5½ÎGØ–)é(»H4u±z'ói‰Ê¸Ø|)!¦Å7áj—,·Á#æFg,loÜÅêàøÐòà¸ÐšKñçš,ûÄRýýþDÅÐ òÙ°…äiË1ÉËÉ›z'ñÓ;êN;A]o7}l Œ0.Ôמ‹öíùɧگ¤;´ç¥Ù·ßL—t×eŸò+þ&6ü°Ãjÿ~„û–ᙼ`t¹Y½ÛxW>î½ët´ì/‹·î{Ovô»‘e=ÇÉŠ÷'aþl'¾ÜÆ#ó?‹î5HéwÕ§Ì[^ÛuÝN²~ÿ8îH×½Ô³mYÙ®­2y`}Hœ{sDlxm`ìÕjoÙíF÷Ø¢Fç¨ÊV§ˆÒºóÑ%5®Ñ ΑµõΑ•ðçêZ—èŠ +·˜û•±W+}âÂ+ƒä-Y‰fC¯"Eà !V½eXÓ'>~ïòö7ù`@$zØmIç}ä‘_uÄy=y÷AWv;JÚÂ鞎@ªçƒ¿d¨1Jü©:Šî÷¥?¿–UD›ÔÊÈŽwÁ³ßØÓ˜¨¸á˜´­ü¢d¨.Ò|è­Ì·!"=´ùRæ™öœ+Ö=Ïâ%¥A6}Ï÷$ê½™àÒ›Yï§Î]VÚè]ÒâõªÕ9ê |,jr‰*jt‰zZç[ç]f­O|v•O|zµo|`mh¢ôSq·’¡yÑ«yŒ&}wX$¾?d)¹Ûk%~Ó~ʼ¢Ìϼ¥4Ìâ}Y¬èmëIaî°6vyP[œÛ&?첑¼iu—À˜üò‹•¤¡1 ´&$Ó«^–iÑY*£‹:b×3¤6ïæ}Ñ%ˆè¶Vß³­éÇ:o¦™”B_X”`>X+þÚiÝW¾->5¥Ñ[žØè—êБ“.*¤º›|ìº ’ýÚÂRü›CäIÞ²uî1è(¨u}Çée•›ìE™—üi™g|A…§L^éwä}~œècG(ý¾-PZ_w.î²W4:‹Ê[œÅÕõnhnÈÊ.@»‰®N𫎒{×EÉÓÊüC«CR‰ž~oÓ׌€ßÊ9 ýSxUP²¼40!»Ô?Þ½)ÚWZZTÍ¥´#ðÜðá/“·Œ ÷5c"lÿ~ýmûÖÛ™‘uaùaõáù7/Ûö&P-Õçéêª3~QWÑ8¡ãe­kìzØìjïØ; n±¥-ÎÑ™- ‡ú +ñ_ú|xýŒéà?ìùß'ìû'/ó¡Çu±òÐÚK‰É~qWKýãÜjãN6§ÇjÎH8Òž+“ö¿‰°ê{*“ô·FJ>´†IÚ;ƒé‡¿Xã7þnD?ûÅÆª­2îT[Næ‰öÜ”C +-žÇY÷?M ?¾¿„õÿêBôùоՅê¾o5øPfúž9jÚ>rˆøPïz¨û®Ü§96Ϭ©è÷cÄÉù¶òxÇ%M•ë‘6“Þ¶É´úw>Ðãq´'OÕê'Oª÷·í½)3ý•9cÒØ÷3b£!Fb4ÈІC i2ÂX™~eN™þ`ÎRßê¨ïuØ—/ž&ŒØ8®m¿ýa-.k?o^_t¤ãNªG}\F\õÅÔ«U¾òó­òLI_m(ÝÜêM5½w5ÕúHZ"Nµ\Nóª‹M=_+O¹Qâÿð­W¬ssôÙÏäҡ꫾’ÛÞÂDÇö´Ì¦àLÔc]9‰äo½ˆînº¯úÎêÛ¾û‰ö]¹IŽíryb³¯<°)$…þÔŒ÷~vû¿¹ò+N)Ã1º;²Ë8J>Ó("®A£Éïù~\ôKmøÅšÄ¬2_Œ{²¥¾²ÀÊÐXû¶Ë±¶Ý×cÉ¡aª¹ÿ<ùê“ Œã‡¨ÖnO»÷Éþõá©wÞxË^–»Ç¾ñ‰¿ýÖ~ÖGöä­—,û‚MŒ±ƒ¥1(¾ׄȟ¼ó”—¹GçBŸUQë9Òæþ¥Ð×ù7…$ +ÿèeÐÁðM¿3gõÜŒ¿Òâ™XÚv.êq‹«¬°Å5.¢-0]ô½*Lô½6ÅC‹‘72ÁЯŽFÏ Ž{Äd½ÃJÍÏ(îˆÁN-C°u÷~°}—ؼ]lܺ¬Û®6n炘‡‚ŽÛã©:9[¥ÛÄèâ_Þ{yVFÇf¿¼ãµ\LIp¼¼((>«Ä_Ušpæ'Zsäô@YoMÌá®9Ì‹’£*ƒR2ßʳË}ãóaÞP Gyž õïGÍ>Eg×xÇ¿„þíi«sôíNç¨Ûïc¨-—Lò?mã:˦h‰Àš¹ Ábå`˜æ50 áóÕcfƒ ³—--0»)êI}•vï%Àò©sÁ0 þÖ,0Qi˜¢8ÌT^æŽYª­‹çn«VÛx@ëRÍtýçÌ“:†öüqËXÓo?;˜w¿“å¾õO,yëó¶Ì#¦¸Ò5úÉ;Ø´jß„„Ê@ùÅÚÐTßÚÈ”´·‰·Ø1õ•%½»S~1Árà‰ ëþå18àãÖØÐv.²¹Ã)ΡdìÇ ¯a ÃÕÏÿe½¾ÇuUC—ËSL<ïÌ0 +{·Ð0ÿËFƒÂ¿o3|Àì6LlZ®Á·Kn‹g. g,…m˜&‚ñ` ÆÁc2üIL •¦ƒ¥j Á†¦`¿y´’ƹg4“Gæé¶1z¼/Ìqþ/Œ‹ÙÐóHÑ@oÝ:â'jë ÷½µûp3ñB]XRòÛÀ¸¬bÙµ7~2èã®–Ä?*ó”½.w¹Ræý±ìÙ/Ù믘’r˜Ì*ßø¸šÀ¤övÇ0¦×!êK—KÚ/ƒ§CugÄp~cŽ|ÃlÓö­¶O좰i·6X±|!X»n%б8©h7ÃÐïê4»óJË,SÀ$0Œ*@™½«Àv)Á»PüógeøÊØêqð·FÁŸ”Ø×&Àûü‰«ÀÆÍ"°Qù8u$$¾j‡1¸Ó)*¡Í+A¿—áì3;VÎZ íPž?:·Ñð¬ÙV ±t¦ +à?oèýÿzSd[ƒ~õÀD0Za*|œF)N‚?M3§®ë·Yƒƒu3øÃ0nŒ0žÐGÙˆÛCv\“çùÇ•{Å\}ë—ûÎ7ú˜˜¥Ñþ5ár‹þÇQUIÈ6¾ñŒ-xç%“—Äíʉ£é¥~k ölHªûp6"¦Ý+–ûc0þõÜ-ûŒÁ Óaưç? +ž!z>¶i´8Uø =Wøo­ù¯7¶uÿÜnxGc7þ½ép.®Ù hwN×¹Á¬æ 3‡©îþ@éûÚp«Žg±vùñçärçÆøÄW¯`. m¡üÍÅx4Ž…¯üã_–x±ã†|é£b︖2Ï„î*÷XñDzø÷l»Š7È|g\ ÊÝÝ[0ŽÐÿëj£âŸ=‚þUù³ÏfŒ^/æ€õºçÀ~ŸºÉ:½Œ>þ©ÊõlEZDÊËàøÛ¯ýž{Ç?.òM|\ê•tïW‹bŸ„7/}^ùÄE¾ ’ùÔD%FT%„W_Œ¿Zë®jÙJ¯Ø´JÿxþWæ¬î+f»Nà­iš¶ç7¬ßf*Nfmp,{ÿ§Í)²ý¯ÄÚ)zü¯møi‰£àû£Ù¹÷s*°ÏÑkcà}<ôªÁL0Ue)˜£~¬Üsl·ÈRÔmft±Ï=}ÃòK}bÃË‚ãu\Cõ°CKf<ÊËP] s¯¸ øx¾!.Á®+_†^Ï/÷Ž­†9{sƒsôÏ\×9*µÑGn5X(ƒù…Xó\Ôèy³fþÿö½2<þ¹­½†Ú«ôç{?Û=Ší™q°‡ÆÁûdvöþô¨?}ÒŸmËοS6ƒÕ»Ž‚ÝGn©èÞ`Ö ûg›Ž»Q§j³do/±vx¢%3®¡È7¥¼Ä;¡ Žas©wJÛßô¶r¯”†*„Wo½ }Æ?.ñ‰O) Œ7a$›HÀô‰jìÜúŸü¿{û«ÿÓ µiìŸc: +ÞÇ°íŸ ï0&ªn‹VÁ* '°Eœª°ï*3Ïä3ckÓróbÚó ø[/^¼ö•¿-öI©*öͨ,óJ{Vâ#¿_â—Q ó¨ŽC‡oMxŒï²„Z?™uï­HÃJÆhÍŠÍÿv;~zC%öœ•þiLþ|o|w<¼OU˜ ¦+Í“fÀqRƒ>iŒñ €šÊ20Yy)˜¤´L»Ìœ¡Vð»¿VÑ,f6PÅž0o‘Áx€bBœwuT‚øce¨Ùð‹ðcm—eÐÇÄ=¾2†äkPN~úÖ’2wY{۹ذætn7ùÎØèf}X¾ÇPf*Mú¿Œ øo¾ýüW¼@ót"ôJ¨Mêc–™“¶€ÙÓvƒYj;úô`†ê60mâF0mô :~=PEÏÇm3&Àß›¡ –n¶;Ìr•æ3+¹ÝŒmë­0ûº+Q(7»ó< .ƾÎ7~ÙíÅ—ß¿óÉx祿ÊçòP­wö@ƒgF{­{Je¥g*ª»´ª™í“•þßøÇ¿ü jÊSÐx©«,S•ÕáO“á(¢Èã§âèK€éÊ+Úèµ@mì:0mÂf0sîA°h%Ìýt½Àf*]a©¸'´oªÉÆŠî{í)w÷é…¤wE>òªoyõŸ”ê +Où»/ù›7Þò;ï¼ãŠ¡?}ùÎ3½_ Óîb4WoÐü·Ûò—ßD>bëÙGÿù| ëGÆþù| +Gu•Å`6§9j[ÁÜ[Á¬¹ûÁœe:`Þ˜µDf-åõ9:`ú"0w ÖE=5Þ2Äž{Æ<có–7—â•xË`nŸXæ/ƒyfª=nÃüæbååqo¼âÞ”zÆÁ6ÊŒ¿1–»ŽF(.Ù²ÆÖ)ÿr»ŸÃzeöùOøsŽc³‘É`ºâL0kÜJ0kê0gæ~°l¬Øy,Þj £`Îj˜³3—c`æ.˜®®fÏÖgßÛÀO{='ê|`ô8ƒŒUë Õ™a)OCâ*žù'5¿öK)+öM1^þºÔCö¡Â3q¸Æ=q¨ÁU>ÜèžÚPᙂrRÃŒdÉ6ÓkÌÐùOfs´Éf?cš{?ß›ß +fŒšæŒ_fMX ÔU×Cß¼ +̘ºο]`–ê^ ®¶LSÛ϶mîJs0w‰,Þ`V­Öw”vEôNÕ(dVj•1Û9™C‡šò‚Púì…¿¼¾Ø'±ŽS}¥{\W¥g2šsï=²ºê<3ºšÝÒßVzÂZ"(Z»‘Ù·lÁ¿m›?Û +ØñCñLUqPU‚œWjpÎMSZ_[&Á1œ µÑKÀô kaÛ6ƒ³¶CûÔ„6ɳ7›ƒyÛÀ"-°ŒVQÉ`ž6Y=QÜùëô•Ì&b ìœSIz¤ÿ›˜˜à7a±å0÷ªƒm{PîÿƸÊ2ø®JÄÞjyW»¼èW™úäX·ÌžY“gÿËãö×|CþEªiJê@}Ô"ئÙЧÁ×'ˆ=éç{Šsúؕб¿úÍ­`ÎŒý`Áb ,Ùr,ßï –êú€eÚÞ`Á0Oç<˜¯ã +VòcÁF³ËŠ»‚:'k1'è/¥ƒ#Nµ&ËP=‡jr”k>Bµk‰wü³w±•n1måîqÃ5^i åžIØ—6wm¯r5ä#ÿWls쟱Ù'ÊŒÕGÏs§®‹×uz'ÁJܬ°kÝï+¯ z;jspùØ-þoÇl8÷XyƒÇ •mUã¶…´OØÔC;ŸY¡×Èè53Bã.FdÜÆÐ‚æœS}b,ÊYP»raîìUÈ%xÀÀD ž†äz~rýoÍ>@;),Y±ï±KEvÌ_Ÿ®óá™`Æ ¾’Vhë±@°»6ˆ¢À–£×”v„7LÚ›ÇÌ;ðŽO-³M«–Ù…üߞЦ©Ûír”6ˆBÀViœÂ.ûk*û¼+'íêPÓLü:÷à#f3ÌOô~aÌù?F©/¥~F} ­Z1Ï8®m%/²t%~ç]ÑwFôìÛaüÖaöß4©ü˜Š|· ž|¶  $ÒGõvââŽSèz'N)cª!Uš¦ô¿Ç=´‚fšê˜E0×ß æ/äƒEkÌÁ’ÇÀr]°ŽÖêŸë÷Ù5[q°b­X¹R¬ÝNƒíX¨ÂÎ3Fï:_:N+ëï‹uëmÃ&ÆÔd€±À¾|÷´}#ZôùÝÁ·oÎÂÏ?\:J?ç×µ†é½k®3[M*·‚!ø5Œ…°eøÕÚèN}¨÷±xš`Õû2^ôñ}(Ñ8ìÌ/g$ÂÚG¨žN¿ºÈÔšÊó‘þ5á Úi#‹/Üþ/Ø¥"ªÚ`îçl§Úø¥`Μí`ÙS°YÏìÀüÁ.Üì9–ª¼+æÝÔo˜Õº?>9-úôÄûµÆÕô_O ¯wáÿÑæÌù9¢ûáê}føF߉ñWÆšüÔëoÒ˘ë‡Ï5²«g>ʸ„1T1Öœü?vò¼®Í<`L‰î!ï£]דuß–ŸiÍJ?úþv*‡gHë£*dôóMâüfœ|2 æe}Ú¦{6uüÒU{Ø:íºM‚ã6_}X¾NóÜ‹`‡ý+•Áï'íÎ`Ô¡ííÔÿÌàÆ¿2ÖÆ?ÃïŒX«Ù­YÅlÑéctL~g»4ÆÊò«¼bå5¾2ïúðXÑÈK_´†bmO÷%³Cï³U¿ŠÑå¶1ü^æ¤pø7ñ·úpêˇ‹& ŽÙQEÍ-;¡®@û(ÑuŒXV«ój“Èõò\ññè©´×ý%DîïFôýa3<ç³áws‘À5GÝÈ6lôÚÍ<0gâÒÿ¶ôŸ¶©ó,˜cM^ –n£ÁV³4Žá]jÈÿüÌÎKÞwÆž÷ ãÀùÄØµ@_ÐÈ`œ*3.gLxÍŒ•p˜q5íaŽq«ŠóœÑçɺÖñü æq3û¶ +j~·!û½g~sÔ8ÿí¼ Â…ü”ÆmxÞg}âá%H¬Ø„E=_‹¥¾ØNÜi0Ý'–T•ºY4‡Ò{,¨´‘ƒdLÍ2ìÍò~iÑö2TÒWÆ­dÈM{ðÿ±]ã _œ¬4L3¨NZëèm`Ñj#°ÁÄì8vSyÇÅê {oþ}¾v-³Î'®þKfŸ~Àsu}ûÌqÆÞ÷Ô_1ºd[µëÑד¥#Åäp«Ÿppà<§„árƒãÔ¹'+sOŸÅõ +˜d‰q)cH÷¶P­î¼ ó ø"À±tVæ]ûÛ~ìÚ¡Cø$¡¥« +Ó´“¾Ó#¿j³§^tYQ¥íÇÄå•N¦¹Ãû…×¾é`9ÝÚø•:ôã–xÑK£çŒÆÁÓ¹ã­ØÏÖÙÿ|S…1cí!ØE+hz¼˜|°–Ñ0úÈHM?3§Œ‡3è¯Å<wñ/ß|ño#~ÆÐ7œÏ›ºSClßµ pΨ˜Þе¾ó:Ù‘“éÜ&O·¸öáÖ0´áÕë‚^Ï3yÈhp_1Nf÷f^̓弇?ôñ§ïIìî ©ðöo˜S¢šÀì”’‘©`ÒcJ,' ñ÷½3æÉ-{Èkß8Ò×­NÒ’'AÆÈቋãM“TOÅMØkr +,šµ•ÑJìzºÂŸv©¦(Á¸6s X±CvJC4âûfk>gÖj73û e¤ÂÜð?ºü¨ßšƒ-†_Ä¢ïþ¨¡¢qÐ ûÍ{õ›˜,9.nlõ“T¶{Q÷‡ÅØù´FšFÀ`÷.@ +H€®ç'Wnå=þ‡/ùÝþ¹àIh´0±h3–;¤KÜë· =“fRéóÅÁYË)yå^³œ&Bú¦Âż²4@ú¼ñ8]ø^Lçwò±œžƒ˜¼b› äÆb£3qÐ÷mÓ”'²kÿ|Cc9cÊ*0µ6Xkäö:Ü}ð.³Æ Ÿ!`}y­Ñ3”q/Cós“[Ûmlã¡b`lôµÀ”o(Ì\Ñò¨ë+ŸŒåtBÅ>*ôÁ:Ž1ìX4ì^:ìEǪÙ@WkÀäE[E¯šŽOº)ABñ&üLÈdöúóüAcöšè£c +çQˆ%K§wëнºdô‹ÍDf¯¶øFEÖõž•¶Â®þv‹~µNpç«!^2bC48r{kÝFóÀ¥ +Õ]‡²•vÎUÞ{8WEóhþhÝs&ëøWf˜Fæ-2 ͜Nj½µ”›Õ¸•›×¿[þbæš9wLT£\Òf׿®×çÇC&êk½û߯+>ˆ%ŠB©…"á›4GX²I /Þ,H)ÞŠ'>Ü"Ly½ »: MÞë¢ðgïiöºÊKÉ‹HŸôyxÞ°žäIý³Ê«êסfe^’¢ú³‚k#:h_æ;ëxq¼¡_ÎtÝK/fí· +TZ»Ó'.jc`=ëЕ¹@Ó«dŠNsаŸ!ñ/}ñ¡_½ø¯Òô:£ÉóLšfzö¥cÀDaô“Õ¸Æ<蔉ãSÐDCènÛ8tMe÷ +±ì8ßÜ%æÎ13i®èÃ÷M¡ß ü’çbòÊmXøý•DpÁ +òâ¢ìvC«œ: •P¹›r‹˜Žö`¡7WàYÝZDrÃ^<êÉzáÕÚ’ü÷„¸¿>TÚVbzãïšBߌ9‚äÊ-ؓҬ­,È|ø­ŒúÞ,øÁ¸ðea<;nÐÍ`…ÌNƒsùS4¸–@O|XÁ$¹e-ÙÚwž®êv"£„g¦<`x| ÀîÑzº y¼ÒP ;—­ûWo-M`.¶R²vôTµ=ã©fyÒkŠÔ5|&žöfºÎ—~ÔlŽÝÏÇò?ëñs{÷ /dÍÃBò—7»¹èºZáõoºüÄ®-¤;ðë7æ'ÔlÂϧ©cÇÝÆ®±Ó™-{ˆëÃÆXþ°.?­f?úõ*nVßvÞ}F—w‡9ÈÉÿ±Ëøúß·_c¶ê3»õ†Žá/ŒXo„11lfŒß1Fœ—Œ‘iCq_0FÆOšœðűrP2µ<¡dh v­^´vì†\À­F‘§¼& †&ÒAú"|Ë3ÊÈ_î™s0Ø·xÐåE,$(k¹Ä#D<á;tN˜.Ìh܃¥wì#¯,$¼’fÞñ³„ÐJ^T³¬xˆ?ï /Ü^,pTÅî-?î°–ÔVû¢ë ¥ïÞ¹·‡‚Œö]DàõÅÄÙUa賕¼†|ñ@y‘Áf¯®ûã©:¹ãôœ +'ëžÉ`pÙÆÿÈœC×òñk+ŽwÎ }#3 £aÛ¤´wZ»ö¡ƒëXòZ‡ÎoááÙm“^ãx)@{Òù8 ¤'Ü'¢½hä•&³ebv®_æBÄÀ^n;€æzm~æÒ$Ì%B•/\öŸH2[8hï•ßÊ•<­:$ºß*‘6YRW‡ ‰ä®}´÷{ɬtͧè]ãþ­ßtùY]»±ÈÇ«…1× +¿›–ü™Ôœê=cÉéf,นÜb¶˜D4/5¶òU9p€ ôxÀ‘œSâ;ÆMÑ1};´‘¾èiµ[Þ¾ƒ?µh芺z ¹W èp€€‹‘ÔJÉâ”ë$sßÌ¥þy«ÐÞ ‰oô\´Ç‘Êë2¶(¨=,ºóA,Èû¬-ôH˜û_™/Ìþ¨!”•mœÔ'B'¯ü¡!)j?C ì^—ó)êh?3véúbÌ7e6î“1WT°„—Ñ´•WðCÛôÚצI•¹—‡·sò¾îâÂ\¶”ášÖüMbZú7ÒøÞï{¸Wfq½âÕx—¿íÂïá¦òÎ-<·D5áù”éB§¨©<ÚFAcû.°cÙJ°oãv` çnç9íeC,=‰Sb±c1Ï7àù½¢» "ú^#M´ôÍV‘;h€Å©È·rUšŸSæáG5wkÂù·€ùîmüBîBÂ3a&韽íõBûã©K—— >Õ›çîÇ[ò’O¶^M³,+ò]ä¡ÏÖ—ž¯Â® kºiAfç^áÏzXAŸ V°wš†yÉgòÝÓ¦ó‚n/àF¿[Áu¾ªf =§¨‹W0»*qqGEcžµ‚Ð1^•:j’æXé>í¦rê%÷k¬Ä·;¤XôëõB×´˜ìí&~Îpk1Òêâ‰)bÐVE÷»,ÅüÊ'ÔXLÑÂ7kî©F^Ì_ŠØØƒ!Sîý_tL ¾ê˜Þù~Ð4ÿË~AÈ­Å|ÿónÉÓ…'Ç£q1Búc<@{ó¡­ÏÀƒî/ÇΆLBvÞ^Œö• +Ÿeó0C®ENJ„wÖ\<©y7™Ü®¸ÙˆgÄò„ +Úpáõ!]´·‹H®Ùƒ]iÕÄrÚµÑ~qúÂ;m.y.R ?>?/›&Œƒq>wXCV¿ÓôÚ†ðÞ{Õ+%žõJð—æTÑûCØý!ÿÖ]üɈýW-Ì>`¼ e¡À3?©„öoṟ $OšŽ˜U¿õ‘–Wz/$¼Âè +2nØÛ¥z‚C`­úR°fâø8è“€ow~”àÈùQ¦V'•1›s£Ò³ÊZ:`?ôŸû·ïfõذ3!“¯ñ| [E+èNãÄŽTYÍ(;—±”Õ eÚÞi,b%Ðy-<ñí1QÐcŠ&ÍÅÃTÙM»‰+½zˆkHœ J»GªÙMÚ’Çïl­JŸøØÕÝ1^y†¸2¤‡ö Q¾·²†DؽUä…Ì…xôËDøíU0OXÅÏû¢Á/Û`ê§Ê÷¹:›úb‰àŒ|ª¶¬¶î{·kÍÝúÀ„o­€öYòŽÝº|X2nX:Q ¬2ìƒùʯ̼Ó‰"ïl@{ò$—¬£äµûÌóWÑæ'”ùBÒ£Ê,‹iaœ ˜"ò™CÅ=ØBd¼Ý/̨ÙséuhüIµ[Ÿ ¨Ûý¸àJÇ>¤£@œ +žŒtðè'ë±”¦=XZÓòò€>;×Ão¯$.^^„%Tn#ovšw;…hl‰WÝdq§ þ¨—€1q7æ—;OpÌo,?ª¨§K] .à"ν÷üTäÜ={6âFá¶ž£¹„ôÇñÓ1S¡-Ì'üà^¼í[!ò†È ‚Ø1ϱØ)ÿ „w&Œç·a>?ƒp‘ýô‘á…k°´ª=DF»q½Ûˆ¼ñ‹çöé°¼í[½ânŸíÓf´íÆ>_ÇÏÒ@û€P-‹®ù&ž I—Göñcß®ãg}݃Îw˜,<á>–¹³B˜3¬‰]ÑBÜL,ôör,èî2¡ìÝF~VßnÞõïNrU=Žزb#X7m1رtسq38xð 00怃ú0¶ÁüØÐ”†èër¾!ð¬N( cT{ù´G±ëÄ­1>ô=˜"«—ðz;•ÙvÏj×DÌnÌÁ{<’»”¼ÖƑܬ!Û%ƒr–P^òÙˆ‰E_oŠî7IèÂ1q³Ÿ‹å|ÔÁr¿è¡=axRý.Ô‡´OÔ,<äÊAÊ»­Ä­SúI—µàæozü°—+…a•ky™;L3w ¯/àY»«ð蓊†Bkžå9eÌ!rÿˆÛ¨]›v€ ó—ƒ=Û´€Þcè7iD"6¼øâµ•’´wº¢ÄªýHw qè¯/”S.X=L¯˜Yh¯?â¾ÐÁ——£}¤0Ì'‡ *\‰%4nGö…˜¿0¯˜Oœ +ŒŸ š„Û{ÃŽ¹AìHÒÿæaJË.vrÔÃuÂôŠ]ho%Œf’ûµÖta‹Dú¢æýºé0^Ðo*L,ßBÂØ/Œx¸ +íMDû׈×ï­øù_5iê‚31S„¾Ùs9ß4yCZ(ß¶©%Èý¢…X`ÂC§TКWl­ÈrZä•[ø;pϬ٦æÎÊZ{ÀÞµ»ÀÁ=úÐ.ù€#À@l¥(´µ¥ƒÏÜÁuÿÐ)e¤AÉ2^¬TpçØiTÈ㵈郸®R§˜âCÎc̹ŒQÖŠ’CÎc¥>Y‹É¤Ê=ˆõ„ظG¢:”»ËjÙOd4h¹†hŸ+zm%â âY­š¢ë âv_; É¿ñY 4HˆJZ‹ž·&¯÷r¹-äÅœ%¤WìL,êÎjáÍvïò£>±°àXw4l8ÅLÅœbU±Ì¡ýÂìÁxÜ»­Âà;ËpÏÔY‚ ÷ Ï%ªijrÀŽõ[î>c€t<‘Ö—@aìHmYæGÀU–ÑIs˜©¬]B¿IƬ#rÞëaY•ûh'ÿ)”ƒëxÚ?qûdùx=.ƒÿ_ÞGÁÕž”·|q>jpk)ÒÚÀ]£§‘®ñê(N’^‰³X¦ÎyXžƒ¹¸ß•¤gâ,–%é;?á:?á7žåí?\É>:FNŹF¬yô´1ª‡]G¡}Òˆ·Gß_E‡>];øM0Ŭ83€ì;î;žòL›ƒæ‹ ÿ£¶àævµO ËÖf´ï£.ÞZŽØîˆS@dwi#Æbá‰?ÖX^·•ÓiBtÉGâa%¸:¤ID<\ƒ¸s(nßlÁnš`7?ãÊ6c™³ÐºšÐ9^ …>3³}Ê!°äú]hÿ8âù#v¤@ 皥½v>R ­ ³ºöá²Ò-Ø!¿1†z4¬ƒt± ¨3ÁS¨‹Ù‹›’òË^ûru.vêcÁ1÷1³³Ê|«ãJH³O®Ù´zHš·šŠzº±uï“e\{g-@ìQ–¥ c… ©d‹ «u/œ»‰øG›HyñN<µr}¹ÞP’×( ²«ôˆËµ:Dn¿>~«‡C=~oF×Õ»J;ÊB¤oýÑþ{‹¢ÎÔýò¹„GüL8w·×ŒÑ^\üÆ#GÞ,=ìßqíC&=ZdNâ‹aÞ™³…A…K…Ž ª(ÕÕBš­fñmXnd`îrVÑÆ}4}2t +«õp^61å‘®ÒÃC±NzÿÝ!úfƒqaËCðõÀ)ˆ‰Ž_4\ÐDl3,±i_Ä¢CšÄ1XWž¼0‰ðNŸCøÂ8 ë ú +ÂM6ƒr‰˜F¸ÅÍÀ¼a}ä1•pŒT%ÎFM¥ûNÀOLÄa Fº¸H7„ÕW$£§¡ý­Xö&–Ý¥8”oú|V«(Ö9òw;¾ÒÇCº¼H› 1†HGÿɈáBÜxoL?h‹ï4K¨T# f4Z;aB!×W’Ò"Ö.{µ±g6ë$<ØËÑdvìAs1Ì(¤?sÊkå›<å-Ø•¾ƒdÀÍ%Hw×Ö2¨&C@dÐÕÅÈFC;î1–× Ÿ ˆ˜ïÂ#N£„G=Çà>ùóáÜÖ .ÞYÁáYýzÀØ”˜•£ +í—2qĈ8î=i`!>!ápa¢ÀÖQEψ&¤ì‹yˆ=„˜®¸Å)eÄ’!Y~öÕ%,K=^Ì[Ne/£Co¯aY)Á·W`q/6±š"—»õÄ×1«»Åv¶žŸ±¸SnCe·°< +8ÖÔ½6B\Òì 骸hÑU…öÊ!V‰øV=‰öå#=¡ìéz!¬A„)å;Yýû„¡ÏVðŒÑÖä½kvX ¦7OúO0FzÄ’Š<Ë3ÊF\+è7­iå< +±§¬å¯ Í’Š²ì´£~ã+ +é– †>é5 ?â8ÅmÉÝj©å½ò£Tô£ˆK‡˜J˜üÕ¢`˜OÜù"à]ù²›(X‚öD(Ì)cžn$£ÔLÅ6 +(×#o,AqÕÕËãʈí¾81±³áSÇ=¡ÏôOÚC_ç¬J#Þ¤‹|¦ð“Љ ŒB + N2«±í éX¡µG ±„`ú©qš4éPN¾“éóAjˆËˆÚ…tP‹›º¾ñê` ÓüÉȺ²±înËŒr ›†8†ˆõ!ÌjÞôX-X¤§ûr Ê»¨;ì8à§|&Íí”0óc?ucÆJaJÍNÒ)aWd¯hJBßHØ(¶.£Q !=ä³pÇ É<3{VCZ`mÏöÒ<35?¢Èr6|3ç¡r¸åI¤_ë”´Wô,¤‰…â9ÒaÅíÝÆ¢u2}Tæ +Bk×QÄÙ°©Ä!×Ñê(Ë)¢+ß#F +º²Öí7‘¼Ü¨OdTkP16±Ì»ˆ»ëf'Òî_kZ>{}ÖæùSg³5R– ûj š£Bùë­(–ÓÏÚ-éÒŽhŸªáÇ•0·€¾ìˆáãcú\âTØd´V…»&Î@5‚±ÐJAc¯1صb'Ð9`øÖçT%X»jëó`. sH‘«¿ÍZ( &7âO#~)bÿãVgTø!EÜò´ +í>¹¹ù@ÄmÂãʶIn4Ò’kívw-Ë.ôO^€_ë6¢ušáO~¡Lo3ºøÅ{ËØ¸ƒôÉ\å3±ÃgTŒy|€tgѾz¤Ç?ä:JÏ€_duÊ`@ºEÁ˜î9isâ6Ç”“Õ«„ö…˜P\ Ë£Êô)hcŽþSÈSp.y&ÍAzˆ]$Š(XÇr™aMZ:¨°¼ªð â°[ë— iV‘v'F!N)»‹»±ñ êzNŸº8éu#} <µl7™U«r3Ä eu³½æ ¦èv‹Hú¸îˆèV‰'½Û‰æ0Ò&À`_"ÝTÄL%\b¦öã…ÖgUVåÃjl"Có’GY*`GœG±ZBþ ‰Ó“øæ0?þ± Xë±±Ü)J ±ÞžyKX½?ù\¤ûÄjº¢öú±Ò‘V—Ƥ·Eœ¾4™8£Æjx§Í_¸¹’åI¡uÎØûè¬]ñÕž(½^—”=ٌ쒆úÎÅs"±h'™^¡‰êAQN'Ëj=@¹'Á~Š™†4e„©-»°ÜϺˆ9!Hkß…_Ì[D{&ÏAçfpPÎ'GÆcG¼ÇšŠŽ+b¶Î£°c¨/œT ¸¬y´ÁŽåÛÀ®uÛŽ&ârZ*ð,Ž)áNѪĥK ǰ©ˆXª¬Ž°SªØ= +i÷MEzæ\Ž î«Ï†øTп¢ëQPÌCl!*£N±˜YßtÊ}‚0­j7Ëÿy>`A<ú$Â’»v#Í1Â!dœŠF°ö21ŲA<»C[ûr=ò“zzB ¯ÏHðiHwŠÕqBšÌR EÄ;6ÅÄ@@[*"–7ˈ>á6r87³8«Â2å¡?¤’KöJR_iÑ‘7 »&lϨ >™Pº‹L+;€¸_”Gø 6×J,Ù‰g”ïE: ïè9bÿôEH@R°±ñ¤’]âÜz>žÓ£Gœ¾0IhyL™Õ9LY,ŠÈ[ƒtÉœC"oÀˆõÙmš,‹)ðÚRÒ.pyÔsçŽâJSa×áÉ-{éèʈ‡tÔИ¡µ4Ä&"¯~Ðc5O¡¿!ÝSg“žsØ|=üÙz*¥CƒÎèÒ“d´K2šŒ‰ôêýH Qä6òË\€X†ˆ£‡®g@|cÂ;{›sß_MÆ•m§Ó>¤³º %Yõ\óìZ¾èrâ'¹¼^ä›4_â5[]¸™Ì(Ó¢S+µ¡mî`s2˜ÛWÁX·Šåéš„41ñ´–}dΕ7`‚Ö-Ð:)âA™ ظ +úé‹×–¡õÂ3¾ðøÅñ¸cŒ*æ:;ì2ŠKZ(hî;öî9ÐwBìÒrG,0"½Uq|Ù>‚u-OÜÆ^iTˆ£_ì`5ÐΆª²Ú´pž£¾gדñowÒ^ñ³Gž:ã?‰]ïôKy—÷$Ñ —qðù|–×w{KÜÀù×>k®‘Ó“‘+:cÛOCâlèÄI'/¬@¾i'".=e{\ÅÌ#n®Ô+m¡Ô+~ªÁpKäÇÍŒŒM€2W@Ë‘Dš1Ðîøä!Ec}Ë;FÚ*ˆ_( -Ü( ¸²œ:2Uäig %Ö¬v–øŸ´³„ùµQ}ˆ¾ßâcl®ôS;+€Õ +`µmÎxNDÚ¬6<˥͞øÏÈöþÒÎ'7¤ÓÛ²v ç8Ÿ´WBÛBZóè3b¤Õp>|:ʧE¾ Ð9Q‡<ÇR6n£‘¾¼$©á Ñ©‹tðCèóǤµ«ß‚4Ãr—#ÃrÃò×P±O¶ŠÒêtW—ÊêÔCŒG"µõŒy,w‹þ?¸ósþƒ;ŸÝ£+)l·²*yé%¾ÚÄ%Ãn®b× ‘΃ÿÕ¸c´*»®V¸–ˆµ ­…ómÎ*#Ö1 ór×%YM\4æèz+”s²zÅHi"Šmbk6×cÙ܇OŽBºH¬^ Òƒ¶>3Jdíæ\ø4Ä>]m7aµ³`ßþ¥‚´³`~çà=Qì“01c%®0îý©E χy°ÉA!À)kERÿ/3K%ÊÊ^±–I)´Í#È^CUY}<ÇØ5‘3“1»#ÊHŸ 1½Yîuü‹m,‹élÁ8³¦ ½:3·¨ÙâKy+騢bqç­@úWâ«õ\”#£ï²7˜3÷OÛýdq³úCI5»YÎ,Ò|FœktÞá·×!f-ºÕïµ??öç:° «ñ!=ê5iG‰O¸ÿ©3Ìm2B냔ÒÎ’é™8F:]è{7¤†âØþܸ?µ³f"í,–Wú—v–Û©{ú|QÔó­RßüåbÏXÿŸq¬n—kÒlVCÑ5xÒ±”xËæ!–¾Ä úB8®";¿ñ¬}G½ØŽ>ãá䟟÷þùy÷ÌyˆYì›<mõÜ…©’KÙËÍÒ* -Rê8lÝ”U÷Üyü/îüµ6þçÎ7k!î¼ôºö¢S„bÒл§Ìyg/:7 +­IœM WE1éfq0K.n® D:j~×–ÐÑU;QžK»fÌFñiûáÖçG s>_ (³:¬§ý'³ZìNSÅ^‰ó$NQ?õÚМ¿tg5‘Õzé¡õEÌ{¶ Ò9ç ±Ž>«% Ä +Bâ?´³¡5"¹)àèða|±UDñIbã2FrÈu¬ÄÎy¬ÈæìhÚÖe òÑH‹›Õ§öŒ-öNœ‡ü'yÂe,Š÷¬Þì[*áå¤ñÃòéÏ«¢¼U s}èV‹ewˆ"n­…Ü\Íj¶$- ®Ôé¢koÐZ)bqSŽáªü›HߌJ­ÓD9)ZÙyó®aµ±ü³¡õVû×3kqöÒdÌê„2«åc&#ÿÒÎJ¯Ó¢³êõÑZÊ_ÚY(ÞŠÎFª!{¦]C§!½2¤…ô’QmöŸÚY¾?µ³¤°Þ7?¦Œâ‹Ô1|:mí8 +Í]ÄðŸSE9ò¹ßÄù¬žÙyÙ,©{ä,èg¢ØA[¹Œfµ·àçÍœ"f Ï#Þú?Õñâ€ôň¹Íjö¡\Cöz—$íµ¶Ù…k«Ena3÷é=³Z°o-'® êÒ9ý\Ä‘EÚ±Hý<Œh €?Ý*ºteùOÝõSÊH+é õ@ô— F.m£h"e«€jG´žÍˆÒĦ Ï £Š6¡\’>qa¢)ϘÀ˜Ã„ô’Ä5d†Ô?eÒAGu9«mŠâÎ…›+ÑÚ«{áÆ2İG× š»Þo@ż܂ôæ‘v]+I™)"í,!AigAGþ‰ÕÎ2€ÿ<ö»älˆšØÑwŠÙ1çñæv~‘F#mí0Š´>¡":ã'Òî‚>™Ê^Š4‘†»vŽtÍ’köSÉeû¾«è\ì ©WæB¤QAgTé <}Ïr*Äæfõ /¥.&2j4Qla5.À¼Ã;e.u¶érdUÃ|«RKê!›+9ê5ÞÜ9v–™¬ëƒsVJrª…Òk "ÑÕŽØÉIµ;Xí,V¿ýÚr,©˜ÕÎ"åÿ{ïÕ¶m /@ (fQ·ºÅœsÚ†mŽ(¹ªV¬$I’ (9çœ)rFDÌ9ç¬(D‰bÎîx ¼Ù'zÞ¹÷¾×¾{[{ß?—­Š¢j­5Ç£1çè} ÕÎ +̃v–ÖfÌEÉU“Þ; +\ÝT›:¶Šjg)¡Ÿ í¬°.í,å?kg¹~ÓÎÚÕƒµpÐ’s$·”næ…v|pá(ð{C˜Z`ÊÝÑd~fŽ€¶ý{’wöäï-µä + èR3PÝü}âéiôM ‚KºxŽ+ÇKä^Š.Á½©>™ƒgh~‹þ¹ÃY·æq^o–•´,…þ¡ÜÒ^ ûËä\æ .ž=VÖZ[6‰Œ™‚ää¶=ð#9c®Úª)ø& FñùÞ5 èNËmþ ÈÎ'œ +½ +hso^/c6o’1ÀÛœÃnâÓ‡KñU“¡åKq%‰ÛüI ñ¹$—¼Ó¨æö[É+ZW {Û¶Pí,p¤;{÷2ÿ‡v–×Wí,Ï^*ªux¦˜vq¾´3º¿¹ÌJç½m¬•*ý2†Iɧ[D”Ž·ØFõ­i>î—5Œò±çß[Bõ +H‚. 岇^Õ&Ï&ø¦ìu`<â —™PR·Ž-º¿\‘w}!4ài- ûsh.S¢ëâ3.Í—<ö=Jq§¦C—TÚÛh$¨/-°Ø9ˆ³vî¦rôÓ!ùÚH>·z0OrÙ.}É.í,–jg5.*^n÷·™b2òª…áÒGaØÃÌÞK[îÖó›vêKРúJ1¥¤¤#3¤ÐÔ4¾‡æë󩇦‰—ç+ãŽO‡v¥èØ{Å0ÇQ7Q†ësYgçvés\žOuc¢ +ôñZÄz\I§g+cM•‚R‡Ã‹øû­Ý ¿{>ïâ"®øÉJÔ×èš;´CÒˆïU“v¦ ¦ÎΡTë^Z¤/Ä•Ãú‹Üåh“÷”‹*Óçœüz™s¶š2 MÄNŠÁéï“4xózŽ15ÛªÁYûvWºD÷E~«ôKÍød>åØ4©ü‰!åAÆZŶ€žðù¼Gt_ÄB¹ÒUËÄ|«† öüØ,…8¦ ,ú‘ÆHרÎ.jž$oÃþ4ÔK»ôKöcSσ[r.6óülè(}²†Q}° üQˆ;QùÔ?H‰§f‰$W…ê›]šÂI»t¨H NM¿0ÚoÀT<KÀ?kbß ´€a_è±€f0î74ê€C8õéÙBÖíÅÀŠXWv< 5 éÐcp­mìi])/¸µê;‘‹æñ§¦ ù÷— Ù·—'›Y1 +Õ®n¼•WwÔ|$÷оÐA•œ¼u”»ãó%×X”ÕšP-ß4=`ɇLMH¾.#¶Í*h¡n =Ô5(£:§þ:ÊÀ¼‘ÐîBÎ'‚æ†Y9=&´Î¶{EýÒ5PGpîF5`ˆ-‰‰G§a=ƒj¼oÕål¼(Þ£ŽOârî/AMDŒ, ÍoÄoŽø8h á¾"¥~1,g$4«iŸKúíT/È'‘j *½†P f26À¡B:‰Û$GÞ§:6ÀE‘¥ú¹÷47‚®¹Nb§_5Ýuù”ÓQÓŽ7IÊãu*®¬~5o±½›ÌL`°~E5j‚3~ _Ðys ïCë ÿ¤Åe^Gó¶Ð¼‘BÚÙ9Àã²¢†ÅÈßev>Ýeãs^ùzÐJ£¿jq’¼ÌãÑü7í¬ˆâ1Ð6â1§r¯Pu)|︮÷-ûö@sAèP'VMâÓNÌàò®-"6¶˜Ï¼J1 ­Y%÷ ÚpQÄîÉç PßÝ)2G¹$’Ë—5¬4(G^l–×,Á;¬¹K ggÒ}“ÞÁý„#Í­ÎÞs´;sÁÍúè];Ue)»§v5ɇVáœá‹¤À¢Qd,É5{S>{Ýxû žbÔ‘‰4gλ¶DôÉÐ3W9j²SS ëÐ=úÐÝâˆýÀÆeœƒ¦LfA°¡9cn¦bX;ŸÀǸ.6çÎÔ%H>ÙÃ\®Ô Zžä³Ä˜òqзÂþ%ªI”xa¦"ûÁhŽ@SŽö9\µ(ÎÞYZ[¸Ÿbò¹Y\ÒÉi¨å#Fs½äJ÷nÐQƺutÕG¡k½Ð¤* 5Ô¶ÑK&¤]5+ªyˆ&ì"úìT)âàèP+CJô±ÿ†W_ë–t훨L89vOÇõ&èq…åÿˆÚµPÞh@ü÷LÞ#DWpðëÅmõÐw§Á¾îP‡‘òh“(îm2æòê–RÍÔ¨îôéÙ\уŸù‚Ë¥˜ªITÓš·óQÌšxt +öˆ!9# Åe]œ§ØÛºFžwwÖw±ÞL{#zÓ˜”px*ü<°”è1€â”€¬”áEútMˆøwEÞµò¬ó³p ³Ž|Þ\tÑ„~ÕT!q…ú¼¨"ìa™DuƒpÝ?ÒAæ=—tx2Gð9É[æO˜ñÄ?ÊÚû÷ÀycïWÙ¶€ +Ô­ k—qêëó0¿¸ø=㸒æÕØë)nb¹ôó©¯öOÕfÅûRCÆ{/¡÷„}4î¡v…¼¿èÞ*øTº6me«…¼1ïÏÚºjcOjáÐ)â,wh››Yti"úeƒ¦ +® kc¬c7CƒMÓŠŒ°ƒØÖ˜½Ru陟›)&š‚*Ö E°¾T‹Äh`$œ›2jÿ$1óÊBÔgÄ(bäü¤èSxïŒ!ØÁ¹êˆÞб$ïÿPðâ¤-{×€Þ¨_ +—@óˆêAk Úp~9ÃgÓuä@2¾Ð ƒ^^Ú±À#T·ší‘ãHŽBõ9°v_NµxŠª—@»Có=äªÄn ¡(n]®(lX +Ÿ'&,]%ÄÚ”ã3e-«¤ªsèÄ`­žj}íŠH÷ž Öˆ=@q‡'óQ×Bß?Ã?Aw¹¬ágYуŸêks階‰°2ǺôóGÐu@Ô#°wØ?kxFÎÿûäEw)v¢÷—[{kË”;´K@· +˜špœ_*‰3ê¡ÁŸö[ÅUMBÕ#èZ™úÌ®¸z9¯¾¾ëô¬u@wcÞQC¾Ä²ˆ +}yþÝExº^@ì!¸hæ¹G_‘zx²¼øþyÞí…òœ›óÑ‹Ê9û÷‚>&çâÝKŒ©˜@õá°‡$´j¬àHb¨KhoÉ;{(´ +Ehi<Ê'Vzdl’ä\}°öÿ½)Ñͧ7·#º¯¸;qVN|TÑHZç#9Í7ÈßáA_Úx³cj.g€£‘› ßÅ}NÂz+Ol–ßîÓ‹Ú64¦É=ÊÄ^a»¿Ž„xžy~ð +ô´bÏ–¹gön`^á<°^,zåè!w†ÿޤºéžñéž#hÁ{¥ &ql0óÐ{%>…÷ÉÔƒ¦3ÕÆ~ÅÀ|ªÙ-û@ç5Z߸AT«‰úàss¨Î+j&‡bŽó©g»ü´O‰£:WЊEÌ1q7¹waÄÎH~\$9Ð<6óòŒ#0!›y¡LÞƒ\'Õƒ~(ô‡QçAÜ+z]+%˜úlbÅSCôѱ^oc/m¹o±&B‹Žê•aÎ/~0ò$h×anÓûÿrjÝh<ö»B7„Ø/ˆùE1¹·ðWÊà¢i\J<>ƒj‚“kæcKÆR;«§H¹0M‘xv +ç•9xŽ^ö½­Ož×_8Ew¶þ*]ÙúÜnü¿ÊVWÇßÌÑŸMÿqÞøÉ€|çHžÛ­?g¶¾¡¾¨œ­oCþ3£§?o>ýÞ”ŸÏŸ¹ð§®'¶üó_¿nùÇŸü—'¾þÉöÿp"øÆý«5¬wp¶]òõ{z}ßlƒÜ‘9úÜ]Ykmw9XÛ®1ä7ësÄbDrâ3è wýO~¢·{óº>P©?‡œÄ¹¸Ömÿ½?À}ùúG_¿ü¤?ŸœÀœŸèm›¯?›MÎs=I˜ôýùs.ü‰Xö&›XfÝCf“!ËšÛh˜°öšx +[5åVF¦Ö†Æv7 ÌúµfŒÁf‘1“mÓ0· êŽ~O™]@w™w3›]Ú&’»æºUÆÌŠe™MëyÆHá¤a¤r×4’9i®7à˜µ«L™ëMpÁ™(·išÙîÐ6µrÓ’»„êÈ#uŒm}´7›Y0†Æ[ð_™[ïì&³ ïaféÕm³©ýlS%ysfÝŠMä«cÊÛk¢ÿ{õ·l±¤¯1å4vÞÝÁé¢ôIî&Upþà@Ï/å+véÞoÚã³#aúlÑ'=ØèKU†çFÏ úB[Ý»‰è÷‹³Ÿ8ri¯iò‰ÙèOE/à C¹8ÈWÑѧ—è®–ô¡àÕ¢-x=z±¶yõìvtWmè«ô Ÿï?Ü,¬[@oÊaëÓÝ½Õ +•†\´Ö/8XwmôV¢š·õèÎp39ÏÈ­œµx”è+R8xvWØ{P.p‘ñNþ½Ð7 +.Ys™¥†¹°Uƒ/¹~WÉ?y¨w`Š2¸l4z²M% ÖÚSôÚ£+'(Ño¼¼úcq?=bP.§À¢QbXå>0ÿÖ3ª/·3™<Ÿ6ˆ÷NÌÚ÷4Un×-ïÔ‡r‡ä §ûá)wOäzOÐCœózºÐG@÷탳‚|ŽÂÂIKÁ[j‚'ÒDi¯ >qðQ›Úi˜˜Yil6‘pO™£Gƒw¦¼–†[Dƺe úhÍE-¹…5¹§ägp‚®[»…AŸ-ømY‡H¹C´Žl«—68ÌÁãjlÅÈTŽZà502gÐGÎíH`jí®e`(0«73†èóµòî.lOêÇïLÀ¹Dô‘q®šÐª0UíÔÚD^·i 8Š-5ÀÙ„ó7“¹Å®n¬Ò­kçÕ]r î­t ê#zFõ·LƒÍýÒô°ï^F®—œƒ¦è•:X +(¡ )Õ§ƒrwâ`ðTR^/ï¸Á°Þyw/…Ãîî’oþäþŽÁϘ3RR_[,¦]˜¯ LŽ×ðÄvøí^½Ð[A9ZŠ(_@7Cþhؼ…Oúp•»¿®Òë·Ò+~0¸(7ŎоàÎ`­vhƒ‡|8 + -Öz»6åÇt +Òá<û ¯T=ýÎÂΰ¾¢]@/Ê•œ5½g’WÒ`Á9@‡Ý¶£;øÉhO±}…ýönœ­»6¸/D/b»¢€;@wxš˜tb¦rw–žàØ›s УŸ¼L艡ýŠÞ™z´ßÃ9¼lS +.Mù¿²ný$äÕ,C?'ØÅ™Áº‡õ1W’± ö@{°w{FrdùXpJP]»íþ:´çÆ'b 2¤h4ïÝŸwÜÝ“öÔ ÿ—ŒíK´sÖæýKFð.a½M[Íõ+ ˆ\Ϙ±d¾)wu3Ü´d‚ËÝääa&8j ŒÑf®KËGµ]‹rçØî&sÞZÃD®bÀ;‹óo-gØ}H¬KTpâ}Lä6¦¬½å“&×€Þm~WÆ Þ>´—¹ÒC Ÿ~ôb‹N!½ÁAÇÇ=‹]=æàÝ„îçäÝStŒè-“Ü´Ì%âG-\»‰Ž¡½%¯Ô!J„’‹oÉÉ»zrU>Iz¼5z>|º£ß—÷O¡=sàgªBÆòy% –vÆ D&åÜ•9„Ž“¿z˜t~z>Ñ“Žž\Ñ›ÜWpqß‹¾eÔÁÉÊ”³s•±§H”Ó¢b¢ÒÜÁ}¨$þ³«™ødâ3Ñ3»¢ý¹d¬8'Ÿžè¿‡Í(w‡@/íÃFMXÅXô8Ñ>]ϨÔÞˆ_VîJ$íŒ zëÂÏá½(?ÆÜ/‰öÐÒ~÷ؽ”û'`®I‘ãÁõÕÕç¸oí“‹(-Œç*´rý,ð;¸õ‚óG¢çŽö}G•ÑÛˆþ˜ÀÌá‚oÚʃ sç@ªŸC9— F¡gOH*z†öÃü¿-ü*8Ðp® +KØ#ú–ˆÏ€}‚§ƒ³wÑFÏø1`Wëƒ-f ¸¬d±Å +Æp‹Š‘ äï‰ORX{hË”všð?”ÁÞ«ì¾Yf娥°ué†ðÍÆ2Æ”³Ñdm}»³A½Àï‹ÏÏ>lLa饞gÌ-ôŠÑþ.×0rÎ ý8\ŸkDqWâ ð._ÜâΤà7Ü´v#—œ5EôÙ‡èÈ-Ý»§„òÁ’ØKù0ˆ/„œ|tÀ!z„÷ƒoç*çèß ½™RtÉ8ôoÃ?À¶'bŸd:ô{ÏPΠ ÂQxoð¨£÷–sGdp1ˆØúö`‹1ãÁQ­Œªš ô/ÞòYC1—Ðë%¸Eö>íýñŽÈ¾4¦{«‡b®°ÛɽwõÕAÏ"õ©Äׂ¿BnåFÆoåG†¯£çñ ƒ~yÜðÀ›s* hMp$.8ê€g—µØÙßêÓüRàT¿(—4_Ðà ~ðQ{<xP¬£"öëÕ‡ò!¨‡q»ã \N°€ÜÖK›ÝÝ\|ìñIbԉɔÿÎz§6O|)í‘%sÒ¸\”°_Ï=ôñ›޳դ ÄOr–îÚ +¥m?9¹Äeô³Sg/Š%— Þ´_–^w†Å€ð‘^$–Lœ;’Ú38rÈï1öðƒôµ»ÕzÀBàV¡>Ê'g8í…$ñØcH¹dŽóNÓ£ÜTžý¥]qƒ(± ø(=ˆÍ ?>s( k8íE—wô@eXÉ)¬X}Ì´Ÿ“ÌWÌKðm¢ó<4"åµ(øçIùÀÓMì¼´‡3$—ökÂ6þÑ«wt2ø£ÁÅÅÅŸ˜ ~pp  _á3io)z2CÊF¡ß–ö‘[‡8ÔÁ=ÓÅíF|9¹ľÁ÷ƒ —ó×¥Ú QûÇ‹}¡Àð{‚[¨.ú,© x›Ý•8rGâ¹aºrÇ€ž¬5ñ}àî·@(™cÄSÎp§¹†ë‚ PAüë´£î ð%äžPm'ñ‚ÄW|€N^½ºzaÉ9$]œEçÉàé|#¿ƒ/¶ÎÏds,æR/Í¢ˉg¦Ò>Nט¾¼oþ0>öÜT.ÿéÏ|Úýù¼KR_c3øi'-Ñ']OL>>CH;= =òôÞETŒøô(ç#t8]¾ô$ãêIâ™’_Ϊ°½ãá«àw8ËmZà‚¢x)|Wç‰ÄÇÁ6%ðÛzÅÿ#íA%ãD{qÉxÃFÀµAûÊÑ?Œ{Bæå!XHØÜ}¸”> +ãå×÷R„Ï£¼ëÑ}1x¯¯1¸}²°pD‚‡ŠØé7~œ íá&’'ñŸ%ãEc>b¿WÜ@äYàh <š)§¦ƒœöS©¯¤Ý y¿„AÐö€÷ Õ<ˆ?6 š\hñHÊSâÑ—^Ÿ{T?Ÿ#öÏüøoÑÓ-·s§9–V<šO>3}Øœ?ûÀžœø}У Ýp¤JUãx·¸¾ð©àÄgÐÞû`ÜÛŒ¡<ü&É`·àg‚{™CcÃn·6|%b…@æ?µÏ¨=ãL9; 3Ë%ò•ä*øÞ”wÑ4#ù—LêÒ?¡ÜßúqcÎLG1íó9>ú àÆ£=Ý» >¦ß§ ¢Mà’ÎMw7; úfÐãá¼3sA…?à¡(M(ð»CcÁœäaÐCw=ç­ í3•«&0)}(HN¦"þÛη08‡Ä©ƒ¨Xø(‘|ƒúKpnê-ø&¦œÅm«hþíàÓ‹ÆD2¾òÂÇK ) H½0|÷°Oê"JõáC€«ÁylEr‚ákHÜêûN¤ã]³€ùÀc#‘q—³$¾$¾ÀSÌAl™jµ¤ëÑžv‚[h"‚r‚:“¼ÁÉW‡b;ù¯ÏS~pF‘ù ›„¢½Ó_ÿós +þYˆ,Cy»Èïè¹EUŒ…øÝIG'!~ƒ‹ 󟃹®ðqÄÖhœo¸§6æå” Ÿ }™ É™-œµ3r$Þ) /ŽêCó‡#—•[¸Ó\öâ“ù‰û'zÇ ¤z $Æò$ç 1‰u"óÀÖ»»‚Äcè‹Á>ù‰ý¡¡ûŒ~ÉU–¨%âÜX äíΚf¼=ÉC5Áó½#Z'>Ã8Ÿ…˜L°p/1îÄTÌ/Äfpáòñý(O+ñýÀ‡¬•S7¹[7™{7vÄõ“;xw÷/øÍH^ÞÅoèÙ µ v{xo…¥g7äëâv-cÖFùò)Ü7™…›¸,)w.ÉÓyÿžà¤ÚHàà !9n8#à´¨  !/j^FçüX`Ê0yIÃ2nß{Ù¿¬3/z¾œ T·6è“9DfëÑÍ”—4 eǪoÌçSoÎå=“Êm<´QÃ?æ€àØ~“æÃ騡\:g$øU» &póï#¹zéJ¾1ƒÏ@;<ï˜S4W ¹6ÁHÝÁëþmån‚-Á‰äª>-è³PÞN¯Œ!Ô×’˜­Š `÷Ägwñîϧž™%PNêˆ~”#þ(ýÚ|®âÕFþÀ3SÅÞvÊJ9nÜ¢ú_S>ÝaºÐª ÷žØì¸ ¾ñÈ-XgòzøJÔ…Ücú*¶ùö 8˜À3} t.(.(E9· Æg õÑxÁÕÐx ¼´;#û±ÛCt0×`›ÔÇ’¹ !ßÇW6­ßÌ`Üe–ÞÚÈŸ¡¯Û5viCÜÚ2ÞN“w +Ößæ‰OAý܇3ÿ!€Ï|ÞÙzd.õG!»- §œäÕ¦$§11·`Lk ʯIž‡ïã¶ÛµõëMäë༗‹Zà(—¡ÂΧ;æ¡ÌrG7:LjEݾ“ä{Ýhü£q>BÚ¨##ï ±úG`4ê«ÀÉ‘ymå{× rF’ã‚‹‚=øÌ;öÁ\~äÏ-ŠŒGó¡/‚yŒ<ÎØ\Eõ\¡Kþ;6åÜtngt?Ä"… ùlpÅ·ÂCJõ¡Á%‘x‹Ú“*¸`4°(ü78“I¾ÞCr'x¼3ÀýàÚ&þ±œúPpÜ€ ˜æëQÁÙK5âN¦ùoPÁ()¬p4p,j†’o²žÒ'½‹_2 m8ÅË1åãŵ?S ¨ÝñPϤ<QycĸÊI¬úîÅžgk/VS˼û?ñ©×æ‚ÛQpŠêƒX ­¹ƒè3¯²9÷ñi·æóþ¹Ã€Y¿žà_gs.V”¶,§Ü²Ð ,Áua„سS¹ìšÅ|áÓ•Bqã¡°vx[º¸I\ ɉ¼”r»q Z0á{ô)>&1þô4>ùâL.ëÞB#ƒZìÂp³¬+_'v…9EõHHÞO¹ôw÷Þ‘s’ü ptn»GõÞ-¦¯@òð³£nÜ+ßJü§µowätà¶ï™A±µà–Ø~x5að×Ã&Ág/¸'õ‡¼9g­É;ö6‰M½4Sˆ;=UØ­ÇÙyõÀ奄97•o^—0¹7Ò®=púʶB«g»x’âoQ#“‘óE´÷í…5!eÌž¯ùºoÔkh­ø2>jß8Z#DîfïÙœä°Mu¼¯Ú +õÅÙì¡ç[ÄSÍ*ž·ÀýûMƒ· êÉZ b½£r:aGÊ@Ä-¥øy†"?ÇÚ”Dìry_þ3¬t ¸h)')j¸_¡…”gô+a_чäuÀßR>¯®|]9ÎrY† +endstream endobj 66 0 obj <>stream +äbª&Üy +Í›Éøuqq ¢5ä|ð5 ‡§"§OO‡OTäÝ[Ä¥^ŸÅ%ûæÃû+HþÀmóéAù+#ÊÇŸðö»zX„UäÜY}.îÄ$Ö-©/bj×âv’{‡#ÐGœ¦¹$‰éàsƒî›BòJ³Á!'“ܵ •=-)¿~µXôt 4S€1àG ›Žw:¯I\ã2Hìʽ±ËºI9)¾õÍŠ1ƒ +49e{?¯6«x¾ì[¾Ì£"÷ù:ÕØp"sÞÅW‡ò‰+¤-†ëK¡%£I<“À à¥§õè3e^›Ç%Ÿ}Hè[Ó¼äJàl„&[ôt9É×ð®)ýh}_týG¾Î§žœ ­'Ô߀Ó1WºòuÌ— Þàé§ëkda'!{ÆJÁ9#i¾nEòuèc±¥uç¨}ãi¾Œçvôâ÷O¦<>”øaèA²Ù׿CÇ µuÔ)i®Fp)ÍÕÁ-ˆZChþHÚOÄ*Šj—@cOQÒ¶‚`’.m ‚É0OiÍÖ9¸·\eKµ1ÄÒÆ€6<¼÷GS9É•å kåþU#JWô$~Ø/u(´1D7ßÞ˜;Tw%¸üG`b…%üZ—6†XиJ(n]ƒëW:b(gG>ß3a ø×À¿ +E>ɱ“NÑš+åÒ‹=0Q^Ô°L¾ïýZèC[&Â=‹84QV¤¯t ï Û¶¡\Ùwqŵ+¸üûK)'®|ž™çæñT³XŸrš–Æ1 u ÖÑ¿'¸uåV>ÚX[èÒ+IÓ£ëÝIçæÐsCýa'ÁáÄwIÄ·Ã/R:bTûu#ðþ›‚ž8y©6FL±þ?´1â¡‘Ô¥S€øÿâW@ó?hcð$675RQ „8ƒùˆØÀ‘Ü<±°5ê'w% ¢ëtÈí}é|¢5ô༑|Ô¡ñ|©©]þ‹|>8ý’ôÀñ†õšC“ܘ€~¥<ŒÇ§aÎR_ +߉øŒ@òrÁ6T£€üù9}=]K,îX>ùÊ,Zp ê €|¹ŸÂ=¡/ü"tT7n`™µK63«ÞÈ@KµVshšåêA¿u3¬aá}€)Ç.òW3Q/„~Õ"A-y9ôK¡MAb&09âr^ðvâ¾P~ÓŠö5²#ï7‘9µÚàÐÆ0Þ^t <ÌYž%òpqSm –Ù²YÁðÛü{ª ABü5­Onóê‰ñ¦ëÖÛµéW;7mÜ+Ñ™Äèùºú÷VØï¢~ˆb‹Œó ļë˨_æD­ZeçrÙ×g‚/c +ßÀfŸŸÛÅ»š2Œ®£†èc•òTfœ™ÃW6@~k(*oâËcJÇ‹åu••ÍæÒÞçÆlÅËõò‚úŸ¨6™'|Ü¡‰òü›TƒÍ{¸˜jcüû-6Y0F¢«&ô¡ —ˆ:Õ,ͪڥ!ý³6†Û7m Ïƒ–BtÔ¤xkÂ$γy5Kùœ{‹y‚;iÍ þÐdøšsúf •"NâJŸ¯å÷¾1P”}\…º´vpœP8‚Ý÷r=tçhÎ päKØFT3Ô#¢?Ýá“>y9êGÈÕ‘ÿBËø54ÉΫ§Ò5¦´»°ö ž]6óÁ>pïH¹KToðÙ+v¦ö‡}šIšÖ3«Öl`6m0eŒyGº +ÜÉ–<^Þ]𸣆e®€“{wšO$Ÿ‹=_°Qv›gwžäÒ¸v©´f—qkDb­½û$ ¦ëØË þÚr}yIÃÏüžç›¨6Fêéé°ù?´1¼¿jcì쩤ÚGfB[@Ú3µ5s2ŸØ{B°¦2 w„{¡€í½z Öf&W2ÜVçnÒîÔ!”“{."*ÆÃWÁ^©lÎÕÅBÆÍEªR}Œ'êïÐЀO‘¢ŠÇ‚ÛY–{a6w¨ÍXØÛºã -êkókV(«jÍ„’ºµ|öÕ…ð \ÕSpQ£vI÷ƒ€×5þÀäÈ¿±f÷Mƒ£ÚO– ¯ Ä}ÏŒU6È÷¶¬ä£÷Çb[`Ù6ïîrÇð^ß´1Ø‚–eÉË৔бH>2S–6’ÆwË„ÔÃÓ…ôKó¥ø£Ó( ±ƒîí!þcÅÞ[&Õ­áKkÖ°¥Vb|Q{f3nÍÅÚïÈ#å…MKé·gsѧ'²É—¦S•pr +´7¹øƒé(6Ç:ð>t#Â+Çó¹5ËøÂú•ÈyXßl=ä X¯GÞCç°<ö훲¯ü$–4näª:6+O<¶Rnؤ‹ÓXŸÂ¡¬gÚ@¹GB_¬A˜[»u3å,5L‰"á óe,üš@æ7jQX/26P0xÕ—!¸Pwj¦*rïŠgvÄÀ~ èiˆEÖ©7çÑý X³ƒÞê×µ^hŒB7ã#Ͻµ€Ëºk}bÏ(ÅŽ”þÐŒçâ.O¥Ú>Iƒh•X95/)¼`4ÕÆˆèÒÆ³Ï-„þÕ Ø_éIòÐR}ªCGòTÊ­L~Ï—Ô¯âË×Ñü¤´uÖL _}?EÆÐ÷ù}¿òWë°ïÇÈŒíâP§û ŠF‹Ø×€ÏG|^íJ±¬e›v{îl‡® Ack©ÈÑQKC<$9’x¤Qauẫò\ƒÙ·«0Ø”«39ïâ¡Ð@®‰|‰®ïHêO}qpÑ(pʳeík`ï¬ÝBuVÍDßIœ—¶ôV!Ž@KÕɳü»Ò#‘î+Ã3FR^h¬aoöü¸(€S:þÌ4eHŬ ÿR=:¬Qb}…Œ%öŠÁç@GPrïGkýÛ{‰ž™$>8^L½0þjN@›=Úi$M!˸úz +—p¹stob##¹Èc ‹ÜÝRDÎÂ7m Ä ìÇK=:ƒÍ¹²1[Y5Øï[}•æ´q•¹Â+¤¢úõbqýZvÏ“èû±ßôý´šþW}¿§« ï‡}˜tŽ¡~Dl‘òä'œB5°HüǾCh1Q½¨ÈCã°G:м¿z(µÿ¤K3…€’° øäf\EÛ>áà$ªeqh,t³ÞYƒCPkÁ^Ö7kˆ¹­§6ÖÌË£Ä=-›‚Q{’ öšØ ÜGµ+Iœƒ®4žQÏäö@=6éÙµWÖÀ¡šrv­SmX!0£kÏò`v’gÐ=ºØË˜xz´èþ ¬7`eënm¬Sa}kC¨Q`¯‚^¢O÷•CÇkpÐL‹#8Ê+yë²³Ý#Câ!òÊׂœ€üÐÀC­Vª%ÅœŠý½´,™a«{  +«x¾‚îQØÞ{ ±G…Ö ê– f.~êÛ‘c~EšD÷üÁï#ŸM‚†É=°w%8w$«Ð×L;3zÑbXY×5…îÃ¥Ÿ˜)/oX./x¸ˆ=<õÉ‚=]ºLägª[uu>ÕP +H + úÞÐB}&þøEîµòì«shÝZZ®±}QG¦z› §¦C]wh*ÝÓ‡}àØ»ˆ¹st‚bÏ›µBå{C!òÔ$º¿:bÀe1UHÎ0z6T7>˜äd..~¡së¨È)‘wûå ŃîéO'øXZ@A…#°î‰5?ÎÞ—Æ}Œ1ëìÕ“îm ,‰5Zä>ŠÐ€ÎÖcÝ£u¡aŽ< Z«rG‚¥Cöé )Õó;„€ò‘46»†éÒõx¥³ÅaÛýzK$R^|º_"œÖ{éç oE-5æÈ$šo$žF5\B±œŒ,öZ‘8‹üšBÄ>¤ä3sÄ„Ó30¶X³ÆZ=ÕÐ@ë—¨b/êüá•ci]k¦Ä÷Òµ|Ô°ðwgð^Ѩ…VÖša£©ggSÝÔÓ±ÎQ6Žê´Á_§]˜/¦Ÿšƒ<®«ž˜?ZQÞ¸š«za /o]-KaWò@Î5°7Î™à˜Ÿ¡+ ¦íJL¯×CrØ.ü jÛ +âOå¥õ+PW¡×LÎ-áèd>…ØOÆ•ùT<ùÔtòÜälض¢}­|_ûÔB¹ˆ½£ùð=úØg…Z¼ðÑb!éÚZ—&sûõoSœ›xx2ÖŠ©N}áýÅð °mô{`¿yéBÌaº_ë XçEMûqجÛóÙª7›dE‹…IÖt¯$jŠX»Æ|bŽMý‹FPßÌa¨‘90®¤Ó¾ºöï•>˜jZÿ&ÅíŸBc?Í? +FÒß;…÷æ#éƒîQwÑÁ^ÔÑdŽ]{ê­]»¡¶dn᪅š±|{ ŽÜÞ§;ôԡׇ”ŽâÒnÎes-Â\€Éë5͉.ÆÞ\ªÅ‡õ2ÿ=h\a_ +ŸzuN×=ÈŽ˜JÏ{/ÎdÕµ‹ ¡Kóyâ[aר'j^2Žæ¥ÀÿÐ?!9±{fÖ»ê{ÇCLŠ?3ƒÏ¼½bVà0ŸŒ¡ôA÷ÉšFqêÂ$^R¿Rü#ì…O»:šd´~IìžÜ×ÉÐI…¾´Y µÆf^˜K×Pp¿÷L 5A¬ aÝ5ãÈÒÑ?‘x¦(}´œÍ½²€®[¹Fõ…æÖùÅ”³POãү΃¶,b¿"ïöBªc˜yz6ü²"ŸøiëH ŒÝGbö¡)ÓBoºIñÇ¦ÐØ_ùr£¬¢e]9¯EýPVܶ kRlêí9È_ä ‹…Êv#¶òÍFEQó2j÷)g¡}·PQT»”Ĭ…ðÃXG%ùñ|Ô¼ÅÈýãás¤¸“Óøô³³h zÛ›M…µKØØÊ±Tóµ*ÇíÚ4ÞA˦üÕjEÙ›•\úøðØÃÊ¥ßÇze æüІñQDZe«ÅŠVCèÄÓz#úºƒ`Íxõ‚°½úXä¶…ëÐ^•Cc¥ =£±‡Œj A«{’დOqi6Åa‡ôùðÃc¹ÄÓSäÙäsY}òôäžéÅÃØÐ£åêšyòƒ_6²‡ß™ümìôß×·PÜü¼•=óg÷Ù,ß÷e­¢òã:þèkséb«½òúSwéFËvîÜK‰«x³Ï½¿Ô"ºx‚Êů7êtï*¹gо$ót’|i6_Ú²Fµÿ©ÂªªVÜZ^+·*«1óî­ :Íž)ƒU…ô#¯T=^†úŒ˜reöe(Š/ƒÍ9 ¶ç÷½ØÂU½ÝÌ•¿_Ç•t¬Æº Ðm¢~®¼m mÔ²ÖåòÜZ—æSÎÏ‚ÿTT>_ß·­„Þ%ô‚`gRÜ‘©´–J÷‹Ÿ?†¯|Ô¡ lúÅYlöƒ…òЫ孫ÙÊÖbU«±PÙ¼z—ò’¦ŸqލßàÜå…õK`'°kEÙó•Ø;ÂîkÀi3ƒf6wâ…ܼüÝrYÁ³%òª?Ös—ÞXˆ÷^ìàï¼t‘.µÙs§žqÂò ¯Uo´àµÊÄc­äïžÉÅÓ-–ü©Wœ"íáEÚýÙòÜæŸÌª~YÁžyÅ+/5:)Ï<¶–Qh”³•o7Éö=[…\ šPØkÀeß[,Ö­N=øcod\^ý’.½Õ}¹’öÕ2õÝÙ +÷X]äÝlIÛ +‹“õ6ÇÛ²¿­gSï̆°y&Õ¢+|º‚®iÅžŸŽxLë¶>Ý‘òé÷"†R’ýð'1î ìQ•?5ËßlB Š‹>9‘äOÃØ}£Ø°ý£å‘gÆšä?cr²sìÒßeŠk¿+åwþjÅÞúÝNöà_·š×vZ³Ï~õÞ¼ˆáÚ¿²uoÝùÛïqïTµ5aR]c på{á£È^ú IWšœUŸ¸Xœxl­ªh4S4¬S?ÝÈ•¶®%¾g)ÆU‘zq:Wül¥´·ÍÔrïS…Xܱ^L¸8¹¢eXáXe@ÊpËQ-Â+'X;¾Ju« gŠu:ÄGîÐscîðSþtÏŸnøKÏ·ŠŸÚ W;ìăÏŠ}×+Šš–Ê*^­ä=7ãOtpCù‰Æòã¿q‡?›*Ž4å?gÙ¯Íùsí¢x²MRži´±¼Z½C<[oÉíy¾^Vúd™|ÏëUä±6Ç¥Þ˜ »„±{_­*ž`½V¨zÛ4RíoT¨× \EãzEYëJø>¾œø¿âÖX³—¿X!¯|»ÚüÀ§µìþ÷›ØÃ¯ åÇ>nQùl¨8öÙ˜;ÿAÅ_zGüÀ^qå³’¿þv›xæÕVñ(¹Æã +áL“J:Û¶•?Û.±'^™¡Æl~ê7CÙéߌä~aù›ŸíewþÍR~å7A¨yæ)ÕÔû[^¿¿ËòâýíÊãõ*n›!·ïí&œŸqs>b+)®~V +§ß(ù²ëyâ ¶¬¶ä‹;Ö˜muÑ2µöì-N¬…Zܺ㭺\ë&žxc!œ~§’Ž<•UÏÊýM¬PÞf î{cÄW¾1àãÏOƒ¶{b«®^HõT3n.~cÈ’ÜG‰½ñÛVáæG©ºÉWu­ÙC<Þ®Tk´´:óÈeëµ›ÞVçªÝ¥“Uò}¿®“=["|e®:Ó¸?òN®È{¼õ?ÔŒ…}íFÄ™¨ö>–Y­·µ8üX…|“-¾Ž‡-T¼ÜÀk7“N·ZŠWŸ8*¯6»ÈŽÿm‹üܯ2öâ•p§Ã]¸ùÚ‘»ôNÅž{Ï —Ÿ[ó·:¹›_lÙ;칇oܹïܸ»¿8(nÿÍVqãw Ùµ_Åí/VÜ£×nÊŽšXåóqbý#îò +öø[[õi“¼¤ãgyÅ—µ˜ÜÉ—,ö¹$iµâO6ó\Õ³ÍòÊ—k„}ÏŒUçêìaߪ‹œ„cí{ôµ){ð¥¡p¬ƒ•NµX —:¬‡3ÿlÈé+N?7—Ÿ{­P\}¯boþfËßãÆ?z¹ƒ{ðÚ•«{±“«顸òQâμæ›WÞ‰Š“/dòsïeÂÉ6½ÕjÃ5µ{ +¯Z£,><È>5'ËÚ:ÝÌ;íÍ¿ìâš^úr7ÞÙ*|ÙĦ“ê—3 yÖ4©/'¸ñõ*³ôÇ3ÌþÛáôK¥òNín»óWw+ ž¬çRÎM7?òÇùÑß7Ë®ýÂÉ/|dÍ«þ²J–ûn¡yÑïKÄ’O›TûÚåV'UwîùXÔÜ ÝúàN¸å͇~Ò•FgåÑVQ¬znJ±ÊÞw§±$Îñ{>l"˜p¡ä¿w”,¿q‘ìÌŸ&òêß­Ùw¿K_$IŸ& _^Ä󾎾4Çó¿½á>¾>Ö¤8>«R»¶•gGÕ&åg<ŠÎÝöòH¶âã_C¤÷­)ö/NåY¾y –Þ¶')Ÿ·&°O^î&÷Ó»ñÉŽ¿öÉV¶ïÕòò+•W[Ü,o? +Row®¿µgO}Rp_KÒƒoËöêd©¦Í_¸Ñæ"V?Û¡¼Wï£|ØhÙp+Z|Ðæ©¼öÄM¼ûÄMºÙâÁ_{iÇÞxµUºÚDì±ÎEyë¡»t»Þø< ÓŠ×KÌNM0Ëkœkvìß×™]ì4UÜ{o/v4E©^?JU½oH_·Ä +ïÛb¥7-‰ì³~æÿÕÊüá¿XÊþi'«ûÕ}ñÙ_øÔ§üÒf÷úl®ô¥5™­{áÁ^{£â½3–§ßͦ^Ÿ¥Èz²Pqðóf<'^n¶³¸V»Kuõ‘›êt­òx³…êTƒµÅñ+î\‡Ä_x¡’_zÍó×ÚíÄ[Í®ÒÕ§Û¥ ÏÄóÏ­åÇÿ0”ŸýhÆ‘øË_{f'ÕÕù‹O‡¨Zëc­^ßËt|q¼ÈåÙÁ¢m¯NåÛ¾¿–+~|'µ×E‰5Þìõ÷–üƒgî|ÛãË7w3mÞ]Íqê8RèÖVžïÙT”¿ëI~¶GKIžÓ³ªl‹7S¹Oo#d:›ý›!ê?ÒŽ´AbpåhEé‹ìþüÞðmˆ]²Ë£MJ?/änÚfùünªuÇMµÕ“Û ¶//娼¼ž#4´úÉîýaetªs•yäå±f6~Ý ,–µÓƒ‘N?µ¶~y=Û¥ãh±gËž=íg‹,šªã×ø£m +q‹©xšÜ§vY>½¯º^·ƒ?Øj¢<Ú.ÂÏðÏ[œ;ªr‰Íå>ˆÌŽ˜´}s"ËâÓ­tå—;©ÖoϪýŸª©MV= É:ñ08kσðl·¶Ò%±[Û×§³:Žä*?Ô§HÚm^]Ëæš?ú˜éÜ¢¨úcƒ¬èõR.âÂDvï¯-/6îT^xé ¯ü—µò”3Í2fÊ.ÿΩž5ÄÛ½¼œ¿íù…‹w B{s˜ôª)vë›ûYÊW ‰\õKÙí/æçÿf"»ôFÁÝæÌÕ=ó”5þ¾{ý4cbóêB¶ø¸Æßôô_6W<žg²ïãb£“_at³s³Yëß]Ú+óÊjÃr ëÂóc ÃSŠv¶•Ù½>•«üµ.]úåY²ð¥#QüýY¢Í›³Y;ZJ Ÿȶz>Ãüñß·™ûÛîЯÆÒég$ÎÜ ÄÆ§Þ›ìÊU½ÙLcîÉv¥pˆà¿ƒír‹Ê§2eI‡_X·\‘s¡bÿç Òµg.u5aÊšº áÂ[+Ù¾¿¬–eVÏ’§Ü™a¦~0K~ñ“\ù¤&|Û‹K…ö¯/¨^Ö$‰/£,>Õdîj)*Š|’Tñ$©¨¤!4/êIR™²½:†}Ú±ÓêÃ}uhsZiLSlNFsXNeC°ºª10ãp]P&¹Þ¬˜ÚøìÄñY‰u±Ù^M¹9[ßžÍäß¾`~på.´R^jvV^kvSÞy¼[ºÔìÀŸhcùCm¦âç–xóO>üo¯b\Úx´í-qkÛ_ìÒv¤Dùòq<[ý‹“ÙÃUÊÿî ¯ÿ7Gã»&†W;×—¿^`²÷óñþ³][ßVgÛ¼¹šÍµ¿õçª_mç>w'øÙAªh5á¼Ø"žjT ÷k=,›oÄ;tË·y~!˱ãT‘gkù¿u^Ôㄬ€¦”Ìäú¨ÌÊÚõ±'™7Ÿx§Õ´ìN¹×à›~»Î/ýa£wjýcïÔòsm½OúÇþgj3+kB³’kâòÜšËs->\O?6&X¿¾ –?ýwó fŠSÿnÎûÝœ;ûNϽÜ*ìÿl•þ¶NÚÿŠåNþÎ +5/w)ßµ& ¯Ú£øW/"”ž¤I_jÓØoÄ_žÇ«>ñI»ÔàŸyšÌ»²úÐì=B³Kjò£êsU_n¥×t +&駘ïï\%œü(Jg>lUž|m-Ýió°|XnÙ|/Éêyu¦x·Å]Võq¼âý©ªU&ë°UÞiÙ%Ý&1ùÚ¯ÖÊÆ'‘‰u eÁÕeVÏî©…›Ïœä‡þj`^Ô´H¶ÿ×õÜ…w¢ÐÚæÙRRêüìH±å»{ÄÞ̱|_)ýÖ”jóæt¶okvQᓼÜ'áEníûJ”¤ò/Ÿ†:¼<^ÞšTÑ”—ÿ$D}¸! ãõ™çÉ8]{䯾Zœw©:(ûøÃ u^MD–ãóYâçöDáyk”êqC´p«ÃEzøÄ[|Ðì-Õ>öÇÜPWG»NÈŽ¯Ï ¯MË iHË+®ŽÈM¬M(b_½ 1½ÑinÖÒ鏸§äGqy÷¢röÜ‹ÈxšE쫸8­.¶Ø‘œ›âã§`û†Æ7: em¸ã½]ZŽ•¥6$Hzœ|ÀíÙ‘ +»W§søæZ_¡öÑÎð'i•'<®Õûe~˜¹§6$óD£æ½fïô²æÀû7Çs¾ 5yÛé`úþß]ÌþèÜ-ÿãK°å‡ ) ™y‰õ±¹ó*ïEdù×gå¸7•dy4•æ8¶U©Uoï¤X¿¹¤V¾mIU¾hIR¶=‹Îýi£8üo›…ËÚZ·Ödy´î+sm«*´qÙ³/ûÙ¿<™Ú”¹ßâéÍhãë›öý¾À(áÂh#ŸâÆÅƒJZç˜ÖþMT¼{èôj^ZKx^þã°l»×GÔ¦éÜiøªÓbËÛNió‡Nåæ÷‚Á‡NÎðS§µéo¦ïôäoˆäÿhˆ”ÿúka{§´%«u’É©Î Š»·‘ªÛ|-7Ä9¶Ÿ( +|œUšUSTù(,Ï·%¯Lù¦>Qhj áŸ>÷ŸÖ‡*ß5§x4W7dùÖ羞}înp¦wS>ñÙ—óTj3¬ßÜα{}:wW[qYÂÓø²ÆŒ"çŽ}¹Ü__G³/_ +oZˆï¬Í°{s&×¥£*W[^^nSX^ÔÓ„BáK[¼âõ/þŠ—¿û™=é´6º×i´ùä§Å[Òò†mN90rSuç*³Wlÿ¬OŽ©KÈ-¯S“¸§>|/LU“˜éÒZ‘i÷òP&÷ácßôÖ—»þÅ–Äq{¾åeÃóã“‹NÜ Q_{yúNhö±»¡äoCÕï«÷Üȱ}Ebìû{ˆ¯ñu yï©oU¤WŸõ°Þ'õSëîäÏäqøºˆ§ ¹²¿}ÞÔÞifúG§§ý«#Ù{›ƒrïµz¥]höSŸnöËJi*ÿx”$þQŸˆxhõéŽÚüÃ_vm¾Ü¹Ò( ¥ß†mnZk-wjþl.1?­6`æ/YÎ,\¼š™»p3{þÏÌŒ…+™Ù ™ò@uþ¬Û÷¯SÖ?í\¯øõypPMzæžk1Ù‡oDdeÜŽÏλ—]~;Bv+1'š`×–}y»·q¯ë2¶uÏ#¸¨ ­&®°ìnTÞžaÙnÈ©ÌÎ3où7'‹Ï7Ó÷Ô…d_#þíR‹wú±gÞiÇž{gðoŽ5<ðe±·ºÿšÍ"3m¤>3¶›3šÑcF2ƒ˜ÈCŸ|?µç̬&0«W‹Ì&É_sƒ*LkÉ2–™8`$3‚N^5œÑÕÒcúkþÀ ë¦ÏŒì9‘Ñ4“;r>3eÊ +f‰³:¶nÈÆ+K :Ù«ñTÜí´îþâfùò¾ºênDîí»w«3nÕø¥_¼˜Y\–“S•SŸXVŸZX|7*÷(Ó0uþýèÜŒ19[ß]TË_þéžêß’žÛØê•ÚÔ¾;…Ì¡ùß߇4wo<ðç̇øTô7 :¡·9é¾¾Á_go:ýo Îv.1È}:q¥™3^3vØ8F_o<¹†!Œ.Ó›éÃôbtÈ£ùi(3˜Ñ×ÂŒ¤ÏÌZdÊ,·L×Zéu¹Ïª‚O£Ö·vn0ùµs»ÙŸ>®¤Šï^'-ŸÂÅÖ7QÒ›ç‰/ŽäF7$åÜÊ*¿¡>x'\MübVåíÈìóÕAê2öV‡e¬¾|'X}ãvpÆíe²³ê¢òÛÚv%u¾vKûµÃ§øÏ÷;_–fýµÓiíÎk"n úYòј³d 3i¢>3}Ædf•»æ¦Èýzᕃ×9øjM­Ïôgú2=™Œ6ÓþÓ&×¥Eþi0š_îFžéC®Z‡¼ª;ùI‹>ׇüûQw +3{®È,U$h®=Ö9Mx/\}5Qw9!K}+Ns+.+ç~tVÞí˜ì=·#³öÞŠÈ:q3,ëÊ­õ™[!™ç¯‡f'sóXuˆúԽ଻5þ±õ‰üo/ã„_šâä~ ÝÝž“{½Äàg»ÓrZƒs6¾î4úÙ‘™<|2±Ãäüqn=ÈYiÒ«ÀØô&œ©ó¿üþ?šôjðJÜ]¦‡Æòµ/Ó]³/ùi3lÀtfæfmTƒžÙG7>ue+½oKtj?˜Wu3"ëö­àŒÊ»áYU÷òˆÉ¸z/0=¢.9Ïêí…´ÈG)ù°Ísw‚2ßVçUGf9uìËþlOäÿÚÔ’’ßðÂ3%£-8Óø¯.k³oŒœ÷óF¿Ïr =éùw'gˆïuÉ5 &7|‡ï5þËÕüçCƒ^Ý?_·ù‡±Ó!ï7„ÌÅiË™•ñφ¬;Ü9Õècç6þåÛ(ÕóúdëöË™í²½óò¼Ÿdç^¿N°,±IŒaÞ˜lŒãéëÙ×nÓqƒ/=+$«¹:(ç壀Lésuy?»-/;y“÷Îætúlzй~‰‘3€ŒÐÿëרùõŽàí¯÷L¯ÇfìX#fæz/fyhC¿u¯;7*¾<òó|XœRx->û؈œ‹·B²/Ü Ë½p/8ÿÔýàœ«·Bsî\ ˹~34+õ~œ:´.-7¥&.'¹6&»²Žä]µêÃ5Á™Å5Ùf¿uz®¿Þ¹p]ÔÑÁ«ì|5gÍ\È ÓìGm°=‹ÿhsšôþkQ;Å×ÿ| ]–Øü¾{]óPƒ~çz’½‰WÕe†1´Ç3#†®e&/ubZ•k®oê\/ÿåU Õ›sIî…f&WÇg;·Wf!vk.Ë.C^I°WVùêÛ˜•ãÐq@ç<ɬ%˜½©Ñ;½ ëz§= ͳ~ZMð…´Ê+­Ç¨áÃþ¯÷¾yüóµ~{׫õõw]×ÝÞr‡tÈ¿~tövyÔ.¤õõZ{Ñù§×.3u±³Äñ¨öúÃ3do:½mÛO¦yÔïÉQߥvèÚ\–Õx3¬ðÁ휧d ›î…¶Þ +i}\Øø(0çúÝbŸÙn‡fÞ‹ÊÞü©S9g…’¢;ˆÎ­ÿ“_øŸß®óÿtàšz}Óîä_OzýýÈ?ÎgÆL’1SVîfæIE?WvŽ2ü¥ÓζùHLñ•¸ì£W#s®ÞË»{+´ðÑ­°ÒšêàâË·CóÎÜÉ*½©¬ÍÌÂ#¬.9‹ÄwuN}¸ÚæõÑTƒšÎÍÓ&Íý_G—7Ô¢ç¬õOcªñõw:䷽ɿØ!Z£˜~zdœŸ4‚ÄøÑÌ í L¿n㙾Z㘽¦3Ãô62SW„0K¶ÝÐ^u«sÿîVÁ-j²BjÓr¤Ï5‰¯&;·V¨‰ÉºH|e) #ð5Àä{‰o½] nkõÊ3Bo93z¬œ7ï±÷žqU]ëþï¤*ETÀ.Šbï» ÒËZ¬5û*téHï ]”j)6ìKÔÄwÔDcïšbbÔì´]’sκã7HÎÙ÷žÿ=÷¼¹ïœù¬ ¸ÚœãOs<ß_ 3ay&3Îc3Þ­ˆ½"‹qpÏfF¹ç0“T̬ ]Æ‹ª^ôw9k˜¬xcX-¿úKÁÚ;kJ®4Ötz}ÛÝËv>¼\Ö}åJÑVÔ ›oU5§>im¾Jê„G·ré:¤æ‡‹.G ㇠›ù¿Žå¦4×BŽH¢—)‰eVŽÄ÷;1CLÇ??šXä j›vä?{ãÁäüÆ0C­œ;«1Ä7’Ç€)Ì`{âÿ|Çé!ŒãŒHfÌìXfܲBf\@#3Ƨš™yÄØ¹üÕò#†±n .$ŽÓ}y¾,á^׿ºK5[Žœ/mº}iÝÖGäÜ>¿RØpî󼯝îfÕýõANë›g9;oÝËkkÿ¼¤1ð·oÓ¦k2ÿ?Ǭ7þ¯¿ÿéKzsa 2ZVd®Ù“1Fö&£˜!ýgÒ±âàFlЗNìpÔ3j–H|J3bœ3d¸+3dŒ3dV03z1™s5Ìœ˜c&ók÷[Üc¶â¶aŽëmƒ³òçßc#Ÿô¬¯º¶±¡õ“Š­Äwn¿Drib£ÛžÝÍßñÍý¼ö×óvþø0·ýÛ;…_ßÎÇZR“÷sƒÂÉqáÿjÜLþÅ?öúr.$û°žÌ8ŽreÆ8z“ópa†v#¾b3x(ñC‰Ï$óŒÌµ‘Ö2#†/g†¸0#Ç*‡‰3vN43É}3ƒí`f®>e<§øVßÙuÏ,Ÿ1ŒZÚõÛð•W s<_ìÏr‚^ž./»Üаù¦¦/®”u_»Z¸íìåâ­ê›¿†*>6øž õÅÕ_C¥/_~mˆóøÜ°Ü¥òšÝ~cÿÇóêm4;„—´¤Y"ôpf §Áý§1#H<?;’™â‘ÉŒwcÆOV1cG/cˆ¿a;<óæ2#‡/$9¥‚3M`ÆÌÒ0\“™5Ì ¡™™·ú#“9u_[/üÐ0Üõa…ÛW†•ï ‘Š×†é»ïË¢ž®{¸w[ø7'ãžìkî¼TÙÜ~y}süÓž!ßÝØRô ±óÖ­ìÚïogÕµÞ(Ýâõ½Ÿí—ô?ž›9=Ÿ~46`†PÿaEs~+ú9ü¥½™ÉAF’ù8„±5Ãѱ·™Î ãË8­ ùqÒyÓeußZvÀ0zÅG†IÈ'Wœ1L\ºó߆-nzm·°öÕÀEE·¬eœé»lÃ]O&¯z`p ü«!YùWC‚üÓµòï?Üœü¤µ õjräšgP»^-ÚúñõüÆ›Ÿç6<ý,oËÛÛ…í÷?+há~zšçVø™|üûÿÆ6-þˆå°OdÆCúŒ`FœÁŒêËL÷Lb&ñYÌÄÈzfZÞ)ÓéUŸšÏÙð™ÅÜÒOûÎÌ8k:3ÿ‚Ùüò[–ó7>³ž_õÈz~þõ¾ 2¯ôY\z»ßÊ3†é+–®8dprÙôl°Û~ÃDÏOßGÖï¥Aã÷Ô «ß2ÒïmoD΂óÚGrçÂ;õÛ‚’ñö_É€§¡;øTæOþÄ*J _!§9M\ö?Ø¥13øõACH><Ô…<Ú2IÉL\™ÄÌàÊ™i\3SSÇÌ9`â¼é¾Í҃Ê d|î毼cXÿ·¤úáÀÑ{Mfj62óô[ŒÅ0[VtÓfyÕs;×í?\uÆ0‡ä'^¾3«~{—&ýt­Ä÷[ƒìUý¹ƒß–§“”µ×&ñÇWÊŸ›¢ùø—Õü‘ߨîs•öÿG æô¯!Ò¹C䓯uú3÷¢µŸ7H^{ÿ>Ígç«i¾ óüo”ŠÏ ‚ê¶!„}ü6Azò OúêÞºð×m {uq«æ‡/«…o3UŸtìßÖHß¼(-¹[ÛvûfvméíMÛÜÚßë¸àa—ƨÚHîAæ9O;«q̈ ˜ñs™9žqŒ3WÊ,âó˜%±m¦‹®\ñÃß *¥áÝZÍ_Ïq¿ø?¯eÿy/KõûÓÌ€ÖxüjPxþhPùþjÐùýlÿúªÔÿ•!ث擑¾qž‘›Ìý®|Ô· áû_¨,<0T}Ú(|ý¦(æåÁ–¨¯6§<éÚóåѶ¥?#†Ç˜‰õçgk÷?âÅs¯µÊ®¿Î÷Hm³7y ­ÓþO‡ ·QCœ™ ÓÕ$Ï­dœã.™-Üð¥ÍâÃb{ ½~4ð~7„ûýfˆðùÕ ]ùÔ°Øõ–a®û·wÿVg=hlÚ«°±ùvqSѽMšw‹±†âClÏã¢ÁÙó´až×-ƒ‡â©!DõÊľý=Wû˽MÒO_UúŸ6¸Å»Î]Èøx¸3è£Ä>F®ë‰‹Ðpi¶&g×Hm|ý@¹ð”“°ïŸ¾ò©·AüÞ=…’ÃcÔ9{‡øFÖô™6GÉŒè7î¿­ý—mš<‹äXý'1ãæË̼ v㥛^ÚÁÿ­ú‘ΗP密8åß ‰5Dø>&¾à ¸eàü>3ø+ÂØ·†œÀo ±Š[)à¼ÁKÙôrº²ô˜ƒ¢óÛyêÛÿŒ¾ÿ®Hýƒ!SõÒã·ÿ÷ʪ“Žªæó=?z ¾“ÔÛ?ŸÍ՟Ƶ]X ¿¨9u]«»u-7äÑ'ÕòÙoB¤öw«Ä†ÛÎbÍ_fЧžŠ!O/Vë¾½U£¸ig/áÿçeIüb“‘Ì€¾Œ­ÍRGÏgÆLñefúg1α‡M+¿°^zøßG¹Ý1,!óIáuѰ̫ìü¯¸NK¿¢Cü.<ħ_äÄ|u°Uÿî“ÍâÛ'%ì÷¯³®Š [†(V›*Ö¦š+ +Ëlü¶žrò»fð‘_=)“ž<ÏSVå­Ò0¡™¦Êÿ¶œ;ð›7›¸É† Í1.”£Ñ^z']x&]{«ýìfzྷËÙ¿¸s{¿vãwÿà.Ÿý*”¿òS¨ïyƒËªµû¬ÆL\Nëì=lI̘6“eIŒ\ó/ô_uÇàâûƒAø£!Ùï!ˆøk­’Ä]þ§_Šù_Þ•øßàÝ3p¡‹'³`Ñl& 1Å,ðÄk/Í“ë…IÏ÷vf>mÞþúÔVþ‡·ë· ²ÏžføV]vðÿÐࢸdèüz޲áÜ凿yñ})r|Èý‡7—¾ÝN”lâÈ2œ>Ö„r’Àß/êpZ/ü ¿ü$]õ~ººãÝ6¡Ò*0³ÅÖ/y‹õRÿdf̰y4F›Ðõt£?ìÒŒ`BâÚйÌDg–Y¨¯6rÙúíp×ó†in Ë}þnг¿}•Ëÿþ²DúÇ£ !o/4âÞŸôæy©ðàûtþÓ_"¸KÿЊ×ÞÅk<)ÑÝ|V(z«å²Ûûºú2Þ‹1¢Zd°ÿ]Õzsžòìx*[¯ÏTel°A4»ýÊnßáø÷jvû½ùlAËP©lç(톮 RóÍ¥A{ +ú¿|ž|óZ™þüƒxùä—Zyÿ ·÷›U\óçóÕõMÙbûmö¦ýèÚÁ¿ËÁ&3£¦¸1Ó|™¥‰‡û¬úÀ0Õû;ƒ@êËÕX£óykü^då}C°ÿ‘[ì‘oæíÌx¹©™@U0#qÁÆ¡19Öaë:&ÈÛ>_&UŸžà§bœÇ gÁ,ÅcòpÆc¥3Ã5_™§¹ôppîkI½í“Ù|ÊÆþtÿùþïýèžè˜| !,Ó,Yyç×îrÇ+±þ¡ó•›öÐSI¼û*Usíi2·ç«¸úKÓÕÇö᯾‹½NS|c÷¸mp]±þsÛEQÝ& Wï3]ºzŸ™kÌþ>§û»¯;kçµïçé»·ÅØ‹Sx¯~÷úç\ÿ†Êí¯f)»Z¨8apìùmy`zËÀ¥K]˜™ŽÃ™9#F0¬—'Ÿd™?(<¯b8úÄÿä.|ú2Z{ûvžúÿ©ÔÇÿæ£>ôww¶úÄ6o£-W·gô‰‚îÑ<ÿ]XàÑßÝÕ/Nà³»‡²aùæê°436:ÙŒö½ì{¥>ûERЕ‡éÜù·¢jëg³TÕgÆ+ºÞ-hû~–OÑ©Á+µ…Ƴ\ôÌ›‡O]ÁŒu aæ…Ö¹n¾?Äã˜aºçeÃrÏ+äq‚øýÎï&x”¶óLÙb°n÷àÀÚž1ÕÊÆ#ã]æ)z¾[¬Þta2—Ó9”OÛn'eµò89G +ñûy¹y3îK—3*¯TJF« 1fõ!ÆBqËõö«³ÕÍŸÌQïød¿ýùìŽËó¹=¯ÝÄ/%þã/eº¯r}ëqÝN¾ç­§îܽ5A7o¯ ûâruÐç7 +uW¼sG_—Ûh¯H«´ò)Ù;Ècý…aËÃÊM¦-á˜Aý»¾¤ uè¤Y +Ƶðê÷§†U>ßDþ§Šù7/T]6ˆ ®Ê‚ûÀÕäZ¦•õcëÏMáK;ˆ0âˬÁôwqg<æ;3+ÜYŒ¡½B”W¼Ï)8³a¨¬P3^ä߉ßJZGrÍ7çs›NM6›(VŸ¨é~æ¶÷®NÚvs±”»yz0„êÃù®¯W +­÷—òuçf°{~pÓíÿRÐ~w¯ZÿôÖÆÀCÿîÊwŒP·ÞœË{'=½QüöÓ&é×ÇÔ¿²T7¤‘xïýµó>iXè±€‹"”ñÔ®6òo}_ùÌ£`îÔ—*nÿžª}¯–³]ÜÆýNÂá¯ØWËüÅCµýå\¶ågþà¿û©¶ÝžÍg·áâs-„œÆAêÎÇK„ƒoý¸ýo=Tí·ç«ê/OVt}»@yÊà¡a˜¯úÁ½|ª;†°€¢½ƒ½|ƒwrNîŒÛ¢ÌÊEK61ÇB<ð2@ÞÿXÉw?ua“ +-•j=ƒžt/3ú„¼~èEw?ô:tCKûpK:ÁÀ`w=]9ÇUϧ¬·á²6Û +›NNAÿ‰®óqz¤ýOºnEiN=ÑéN> •ö¼ñZ_.cÛ¿\*v½sÇžOÍõ)ª#ÿðPu½\ÌÕžÂ6|8U}ò¿À«¿sþwHNõ¥!4àkC7ï#†¹þ›ó +6[±BÁx*uL€.ÃD•¶e€»¯†YæìÆøzéOoÆeÚ<ÆsÙª^-9ÁØÃ3€q]º’ñv`Ô +žÑèÃLB’sl‚‹;Ç…”öLFo®¸~$z¥ž—~!Çî¬ÖÿJ«îùÑÍß6˜/Ý=ŠíþÁ…mº1›Kßf§N¨¶fwÿò,E<öZ ½.Ù;† Ÿ™[p,W¼c8¿®c$[uÌIÙñpžòØon~^Ørs–b×Û=?/ +8IrÙkEàíÓ^û7ÑïÄ?—(ÊvSnµSîúeê Øüb®2w»›½c›^7P)G¹,XÄ8ŸÄ,›µ€ñ#óŽ.è‹^6°ôtéUv`±s çgòû_yk>¸¯‘O<¥cÏùðµ°ï{o®áôt¡¨u„”Õ0HÊï!ä¶Û:Œ«ìy¨:ðÆûäë`Í_î'p§T©üâ¦Þûà +uÏO+…Óß ÒµIò•±ê¿®dS6Ø©e6\Ñ®‘ª¶GÎÂùïôºgw+¢¿9½Cúæá:åƒ"à#ƒ{ÀÖï§ùœ²2 šñ’Œ2Úž4xªkÎMÐ&«ÂrÌØà S%¿ÆØu±+™3™$áÓ6 `÷~ãŠy ™n±šhªO«¶×núh®ÜuÛ‹ï¼éÂvÝ].îzî„þÈ]zÿ·n|Å>G¡`ÛP±´{4z½Ð/­ßå>OØ_ÎçÅ?îiMz²§=ôÆ•bÍžïÄê§ ëÏOæv¿uÎ|-«;_,eýèÉûÖŸ¯96‘Ï«³ç +›‡ªòÚ)«ŽŽVÔ_Ÿ¨ÈÜcç­Ï0öàâ|µ9& +>ÍØOnĦmµU­­³q]ÀŒícÇ "uÓLÛQŒÛ’UŒÛ⥌¿¯‚rˆl°§‹1¡º8I•4±f<9Wè¿èãËmÀÝÒ%¯³‘“ò¬Ñ3,í½ç§;u;L{ô¹ž«¿<ƒÍiÌ5}:[µ÷ _vd,´º”ÚXcŽØªæÔËPí±ç:~÷_Ýq¹†+3…â.>«ÖN¬Ü?ì@îô›@Å©¿¹ûÙ=ðø¯«÷ÿ´\½ñÈXUé!unë 6¡Ü +ãâ ý1¥†Ao>±õÁ|Õ© \êFØ=W~t,úJÕ«³Í}Iæ£Ð1¬&ÝD(êÉ·s7<#Ê:ö”g¾ñ@o—Ðz{ ·û‰+·÷™úÅyâS„¢ö‘bF­Ÿ±i ŸÝdÏn!q~ß[uû½…Þ¸°'Þ(¹K¯ôÂǯtüÅ×ÁÒ•/£¸SoÔª#¿yðçÞhTÿ¾’‹+³ò—BŒ”ÁI&èßâ÷ýè­;÷pMП®Óv3_¸ðZ§<ùê ŠšOÇyª£˜iCÆ1Sû&?G2~"£ŠÎ6W¯É6 K2å"2ÌÕúTS—•îÌrâ?—/XLõظ”6Bb¡•*$Ò±BNH·Ô¦UØRͨè, ),ÁTŽK·+Aîy¬Ô}¬Ž}È•·Œä3klÕÝ »_y‚k(dT”ój‡ÝÝtg¯G†];·.úî Áço¦»ßx¢M*>2Vhºï,Ôœ˜,Vt:òõg ›ŽN&yÂdUÏO.ª­7fæl±U­Û3\Y}ÁIÒ<ÐÍÔ ó–0K¸1®‹½U¸ú,U±åó&Lgœ,í™qýì˜iF2ËHþü*¨hçMíñ™èÉÓ­?=]j¾³,¨|ÿd98ÁTÅÊŒ¨1¥,Bha¤” Ð7Œ¶œž+t|ºœí¸½„äÒÓ1þê–;óÔÇ~ô–Ž~Ç«w?_!yCè.ðõçfp;.áÚ.w½ö¢s}ÓÑIBå®1ܶ›óÅÃ/…^°[áÒ×!â'/"ø3¯s%ûÔ±% +>ÆØÓC`<\Œœû袾|rí>¯{8¸Q|dA…M|G¼1¿¶a ±…QB ylúdúV„ž·¾bÕ±‰\l—\j-u’x~”äƒ[ YM½>rÓÉ©\û­%Bdz•ÂÁ¯}ÅC_)ø}ߺSÞö‘WÂߪѧÁv<]Ê6žŸ®ÚÿÆ}@¨e±ç[øø^½ëÝ2Uã§ÓU]?/Á÷ç3Ëú³ yÂÆãÙ½o]¹ÝïV‚›ÉUÀU}0žmº>KÕõíbåÁ_W¨Ó›m=B˜¹g1ÓíÇ2Îãf2KfÍaV­ZÅxû0«¼Hl#ù±O ÄøŒ—‡‚ñòQ2ʰ6³ÁìAøôhƒµ֟ȇs*â{¸cª·íò©óé*¾ë™+˜Ý\b‘•°qß8ñÀÓÝáÛØ®Xµ×I*l&–|ð«9õP'Ÿ|®§àöþàÎíûÉ=a|˽E¸†òººaüÆÝNê×ç G^Êç^†«ÿÃSUsq[ssš²óµs`ç÷‹ÕåG+ÃóÌ”r’±n¤ Í0åkmTkrÍÍvffŽšÀ,™¿’ñ\áGü¦šF$ØðÚÊ“tí×=4Ûo-‡î8tàªX=¨ª‡YØ0 ½þà¾ÈvM@)‰£„ü¦!BI›Ûþt è/·ÿ¾î£ébvË<À‹Ó«miO^~ópšß4þe6å +n<9™Ûr~ßpn†P¾ _udœz÷×˹cßǾUr»~rã*;—¡Ò'›(„ÕÆªà,S.¦Ê*º 2ñω%V`ꩃ³ÌÀÙÿ‘_½®¯˜¿s„Xur·íÁؘ¿$¯%$W÷瓪lø¸BK.6·/Ø‘béa'vÇãE´¹îÃéìÎÏ¡·’Ä¿ Ý©;áòÉÇ:ý…Û ò凫ùcß²Û?›+’ØÏnþp2zÑ¿&\þ2LµÿgWu~ûuJö¸{¤zï/.êž7+‘ïÛ\©Þ÷ÓJ°Àبd3¬i(´áÆ”ÓÒ|s®ªã3_Ð5<08ÓtåR_fé´E̪%^Ä.UL€šgÔÚ0c6‚Ô–‰ë¬ùÄKUT²)4()ã%<ÝŒÏl´—6ž¦¸®úô†Áڨ̾AQY)ÜX•i¡_×5Vl¹¹¬'°1øüíCøª}c¹®ÇË…Žû.â¾ç>ès•ªLOïzâª9x_-}ªRï{íª:ôãJþÌ÷‚æê“xÍù§«Åƒ¯ê}]ÄʽNbaãP®îøöð;oÚ»|æ[-{ìwRwÜŸ£NoÈ¥7Úro–³Ý߯à·\ŸÇn8>ž/h¦®81–ÍØnçêÀ8ϘÇx,óc ã ­/µšü$±G­0¦Ì²=”Ñ)Ħ÷3•Ú%ñ›bñéÂÞ/=¹®›ËäôÒRbŽ•\ºÝo<7S¬=;ƒo"Ÿ×óƒ»zÏ7+¤¢æBv½Tvd´6øœz{1gëÄI±pû0ÊÔÉ&õ`ÉÅKv ¶£,ɬÆA|BŽŸPbEy;>œD¦Õä¢rû€5× Œ*õêsôIƒ·'m85Y®þhŸXbÈ…¨ƒØ3_l%´À|QïÿÁM}ø'·çÛ•ÜÞ·îldzeRå‘ `»ƒS t¿tc ì!~{/ÚëùÚSÚûÂ_<öœϼР>—Ô{Þ¸ +›?œ +îâ»ý/s¹£ßûs‡ÿêÍn¹1‡Ëï†u56s«_M|fç³eÈ!¸Ö{‹Ð?ž?Ø‘j-™k¡q&\v­ÖØ®—Ëø¦ks¹¨’¾>ž2©ƒ<?_™‘R6 *»Ç‚M)•t&×r°”Ñhk¬ŽÍë«J5U…Å›@³ƒo½½Z=`iª{¦HuÍ[¼Oʸ.ê ö(ei“X¡n¹:WÝõd)™‹…­gf‹ÍŸ,äÛn.‘wÝóÑõýD«=þH'z Ff4ÖN(ChãÁIbÅNG°žø¦KsÀž6Oê$~ÿ[onÿ;Ouçó%˜3`˜IПI.´–Š[·p»¿]%–v‚în ©eP“AH¬Ú36 +†Ÿo ÒÁ'ƒùήI7gc +úòëö"sÛEª<>1@Ƹ/÷düe† K3“KvŒG !¾È +Xà +‰ýÔ‘ifž¾ã/F‘káö˜®|H²)X2"ågïq¢,ü¬ì™ Wu—«N¥¬” G'r[.̦š"»¾öÔ|À…}ðItäéó)!Ç?‹º{SkéÄSA{õQ¢îåç•!/¯Ô¡W¬í‘{"úò¡ÇÀ6}4ƒ%5»ã3gu×wËØê'ªÖ”õusU2K§.d¼IM¦›I¥Ö~Ð#Ö%+CSL}aÄo†1bX¦9ØSáÍ—}‚Z®¬¢ì´˜+°¢ [†¾˜YgϯI냸­ûà }è‰Ïb¤ú3³À¥S‰k¾4W8öV%ÿI­ÜýÓb¡ì˜öB5É)>š%¦ÕÙj#Œë‰å‡œgQW«CãMÁöçÖVö#KÝ4@_@|f±•G|]ú[¼É¬æ¡lTº™¿?‰¬Ä€“L5Öˆ=AÇ +kXB$õjœ¶Œ„Ž”^Ü_ή²—çT°¸åªƒÁ«#1̵—‘µ{,XwÐ-¢Ì¨´{p Áú`»-‡¾Õ‚…žjãŹȻ¤ãÏé8ðÉë¬Ùàh.8¶W·Œe+Ù·ŠéÛìš8ã@‘øF!ÂHŒÌêƒ"æ7ãÓªú+ƒâ¨†´:<Ž^hž¯1¦œâNÄä(J™áC“Ì _Dê”Áraý0hb!žC‡•˵À:™RŽ1&9‚žc.¤Ö ¢rú¨¥Ê)’ÀÊÏo"UíGêöà&Š»x _¸H §gSæÝæ¦C³Ú}Ú÷ÙÐ/§Fœÿ(3èÐm=eC6^š‹9Ê6_ž‡X.ü,T¾ö<}z¨áÁq‚Cˆ/[c"¤7ø¸s¤\ÓkU|ÎöÁ¨üØ0#—¥~Ì¢‰ ÷þŒ*<ÃL­K4ñ&µ«›—’äÒ$‡ÔDSým%b&7øÓà—‚ýχ¥˜©ù(c>t­™œ¹É^Øxx"| ¸Mü–óu‡ȺϹæƒi”]XÚ:š?ðµ¯|æEîoRàQƒ_yb<;Ð'ËiÊ­N1óSªè΢¯pª¨sOo¿HuÊH æÖ‘˜^` mN>"Ö\LªWIì L(…Zf„ÐS9™ØXZé1™Ì¥‚–Ð#»H³ùØtÊe&9´šhFyU›NÎÔÖ™.4«ÄèspêÄæOÉ5‡¦‚oØ«oX`­M®½nèkðm7‹]wÜ›Ju³ ·Ssô±FöîÍ‘‡"ßr}!æ0´ 8r-¡› +fªÕ`/Ä•[±á©fÐÊÒ¨Æ&l óR)…qk2Í©–Pi‡£°¶ÜFLòâïÀþH­GcyzXïÚâ'ª7SÒ<ºOTÓçOê°Ò¡Õ¥&1z[ÂÚõý…Œ;ªaPÔî ­8<‰ò¤°ÎÙxj¦ÜuÛC»ç¾R³óž‡ØtnìR&Ü3G<¶_Y(îüÜõ fï‹®ëÉ +)¯…\§{hʰmqû~ôsBÝþl_Ù3F.hïæ½ÊƒÌ'‘bʬ¸5Ešxc.2Óœ‹ÅµH7óVH¤æqcœ'ÌgM_À¸»‚Ëj¤ ‰5áÓëm…õ‡Æ i5Á‰K•ê§WÙjóê Ý7zæŠ îÕgŸŠøWìGAÌ[Hê¸ë3õMÉyÖlû­Å”ÿsþuˆp毮õåbhŽ ‰mÈÜ0ö%µ— ÏÀùîçnlãÅ𓞞,ãå¥` wEÇ }“=t§¨Ž4™õ!ÆàrZF-‡ƒåMÑ ¹ÖRb†’jF™òÄJ­W—êÚ.­”k?œ »"SÌÀ·][$¶ßXî—”¿i0͵¶_]Èw|¶: º¢úÚÒc  ÛxlX‡|ËÕEÚ}÷TüÞo<…µ6lh¬)Õ9/ß1V³¹g*tޝ}„ž×¾4Öw?u¥,¦òãÄèrK1¦À’#óOEÆ\i©æìt¾õñR¹þ¦3XqÐQØa- l"qÏWžTó”ø1¯m¸XÐ1‚æë›>ž!íxî"w¼ôÔu<õÓu<ôv~±ZˆšÌ{©¤s4X†àèa?øÆBQ·Í96œš"n¹±@nÿj•ÜõÒG×uOÜ}G¥Ùu×üD2—ghŠ[Fé +ë†kêOÎ;n¬”ÛnºÛt¦9Ém„òÝcH¬›LyzñU6ÐÄäÛ/÷¾ñ•z^ûcÝë¤àA å£iÜO&~ºòÀx¬ÏûG±ñ•V|Zƒ-—XÝ[e®CŒ\—­b–.YÁàžPe-w°À„O\Àñ¥×ˆÔµJ•ÈðqfШÐÖ_p¦h©Õ¶T›–Ìs\ m÷m?që§ å­ÃÁ‘—RJmèzgÉ’wÙh²,ÉŸGQ^ßÑï‰׼êÀnBN­=˜Œ +ÍÛzu…Ôêऋ•Ç&Â7@;\z)2Þ,(ËH}a»£¾p«j0>~<ÈÈ×ÏŸa¥`#ð7ÁÛ‹¼a>"ÉŒò'+{Æk¶]^"5ßX +]V0G©<د$”ª:œÀÒT·]š/}Âi÷ÞWÊ`qëcL¨¦ —àžÏEM÷âW ÝWI(Åͧ¦òi%ýÀðSJl uŒŸbBrs¬=H%»Á|F<gL(Ý?FÌîÎFf›CcÄŒàòñß¹Š[ï/"6äˆÚOÎiAÙuÝÝØw£æ…fÖÅè:\ÙÞ1°y]Û°ÞÄÎg+ÅÖ/–Cû@^Ûº~КvÞZÁv?XN(ÖD¨ÿÅu®8à$´=[®ÛùÈ[èüjy½¸úìš!RØZ3Ì{¬9ikOÎ:o»j÷ÞUí½'hÚï¸ó-Ÿ-‚f«T|:XwRéA'ª{UñÁdM÷7¾rÏWJa×_ݹΗ˥ò£ãéúqEåÛí¡ÐŸü"BûÁ“ ¾öÊ z#¹n—XiZ7Ô€Ð]WH«ÀA”R›ìdòþ”# Íbw*1ÊØÏKMyÇÐV¿PW}r–¾l÷)uã@Mâ†šÜæabÛýÚŽ»^bý§ó´9µC( ñ¼ëµël q&ý¡Åm#yÙ‘—Jíé‡á”©¶n§ÃŸÚYÈ£xíZâãL¤D0E[†à|uùí£tõCÀ@Õços±–jnx .>ÕÂË*(7|ê¬Ýqß#¨õ®¦ù¦ ÕòN*·Ñçl®Ûpr4¾‚R ±‘aAu°É÷Òeö²¸ÅÚžÉÒáJÍ¥ÛÑú 7Àâövõaüø^w×MÝž/5»ïûs×–P7jÊŽ§+H =ÌAÔ#ÚµE6\(É­HþKµIÁ“x6½®´kb=xÂúãø¸ Öê°t3Ô=Ð/Ñï£):0†j\V˜ˆ\Ì"šGl>>×¶¥–â¡Ëû×î¸ç®o{â­­:5 ù/+Eò!Fâ4¯ Õ@â²P’Ö=rÊf[0.Éõ6‡®¡¶\¯O|µUgg€£Ž{Hˆcœm,†$™iSJúSçÖsóuí÷½ƒ:n€¹ Î3ôޏnâ϶ܘGuòÚG€Ì·½XÆ×:[(?1AØt‘ÔTÇ&‰ŽOæv?vѽvþ|šîÜÍÕªƒïÜøºó3„ÍWgŠÙmÔÇBs÷éÄuíX׃>øwÐî»^¬‚»ãéNüªJ"yh°ÑŸzsºÄb!2Á q‘êf%U„V +Öß©†At®æ6¥¨¿\Câ «àrSí,â¿:ïzjzî«Àà÷~åÃv<ÚY«K,Õai¦Ð–e¥XVŒ1[—Pj£‹.²‚Æ eʆ¦›K”i[dM™Êë÷Ž“Áç†DzùèpCgF¿ó?4V¨¶qb¹ Õ-,Ù3.(­zPp| 4U4ë»ÆýÉâÖTí™Àõ¼ðÔŸ¹|ãR¾tâ…›ñY¥dzuš¶….eqo8<‘êaÃìzæ)ï¢ ÚýH-u~å.’Mµ³H̦:C¹ÍáÅê©v–ö_´³Øý?¸¡>Äý­?ŽæJ½ÚYeT+€jÛ¤ôƒ6Õ†§\ÚîQà?ÃöþÔÎÒ¶>Z%ï|¶ŠÚ1™ã*1Θ%¶­y¼F ­†ìMƒOkŠ;Fã;IQRDnèËëZ;^x@÷€ÂëcÕb¸ÕofxÕ¾ ð1”ƒX³ªÔxnž¦ý®;¸ºR× O0…¶'+HÌ£Üy®þÿÆñŸÜùîoÐéÂ}7è…!iã2,ÿÐÎ +í,Ê+ýS;+"·¯>oç(MÝùyúâý´$žQÿšu–T·+§e8ÕPÌÙ`K]Q“Xúº\â ɸj¢K¬¨}×]X€×“xØ¿÷õE½¯Ïët³ö-&[ͨ¨[ß=!¨ý¦OÈŽ»´nêºûŸÜyþOîü§ªÿδÜyýì½x¡ALƒ†¦6oÇHMQ÷h6*Ãkìšì>Rê&[Äxèfp¡F +>؈…ŽZÉ'¹þÖBä¹rNÇpÄ?hûñáÙæj!ØH¥Ò0ÄNL©ëÚÒþT‹=½l ¶p»ƒ.½®W¯ s~ýñ)BדUÐ%Âú¢šä=Жι—eüܽ¨v–ZÒ±ÂjgÁb¢"@ϸ«H|‰4F|ÒEdõÕEåXè¢3-4©}äȬ¾ðÑÐâ¦úÔõEÛà?Å„, Ä{ªwA®­´í¢34~(Ÿ>uƒ-òV-Éõ‰˜¢m:ë¬Ù|dºfãá)T³­¬e´°û®öÞ`­,n)m“­@ÞúfRÛ]Wä¤XÔDZjc ¬°o„jc•vÁz Õþ-èrR×÷çÂL©–‰™4Fþ©µóîJ¹ëžÖRþÔÎB¼Õ¤ÖÚÁžåœj{è•A; zɨÍþK;«¸W;KOêýàXSÄ}Ú¦Arxš9æ.þÚµ5¶ÈàsuÅÛGQ=³ì¦aú¼ÚaÄEìòúPí-òú ô̓ñzðÖÿõõ¨ãµe;Ç‚¹M5ûk4]^¤k¿ìTq`Š&·f0¸ÏÐ{¦Z°•G&»¿÷÷~§GÚ±ÐÆ£¯'±kBóGó4ëwOèÕ]O6…V"ô°ˆ{^þœÌ(äcµ†QJ‘F¨±ž Ö2ÐÄ–ˆÏë®ÌF.)'Tô T†0þ~ã b}”‰.gã`}éŽ1ÐAG]NµMw*OÂÚÕ‚­84 {ì)@ÍÊüÎ[j¸8zóÐÎ +À^I)ÈÚY¬ 1´³ˆÃ?Qí,oòyäíw]êF;mZñ€ ØL«àè’~Ðh”ÃÍÅð3M<‰ŸÐî">Y®ê Dh¨ÑµsèšµÞ^.µÞX}WMFã`}a§#4*äŽ[îÈóqŸ9ØÜTŸp}ÛX¡ã¶+b ÕH¨ yGÑŽ‘R9Gèrt}Aò­›+õùM#u1…VÁ™Ã‚rI]¿aï$ÝÞ/XýûÍžçJìä–;ÎT;‹ê·˜Àµ|Bµ³ÄæÏSí¬üfhg™øb.jŒ¥ÂÝ`uSmêõû¨v–úÉÐÎ*îÕÎÒý«vVŸÚYi}„ hN$µ¥–äíÈy¡_¸Ã|oèo '˜.½‚ÌÏÆÐV ¯'u‡E^¼Æ„ãàK…œêþàõÕ'§Ò45H^ÒË9Þ3NK®¥&®ÐŠê“E§öæ·&wû0~Ë'sÅý¯|ÙO–@ÿ Ž2Áþrž˜½ +hsûz°Œ¯7Ë ß£Ó‰?®¦Ý°o´|i^Iâ¶ RI|.©eäÌ:ªù‡ýVÜ®§®òîg~T; ŒôØL õjgeü¡•j¡§ÚY‡fhêÎÍÓ¦T P³!FøîÐÛÆ½R]NÃPí¦Ó‚J;Æ¥S}kZçlJyì-×S½‡ KCYöÐ+ ÚäCåìZ’{í‡8(¶\_*ï¼í.´]_Î7_Z xº†ý9´–Ùéˆó’>š–<ö=j«NLƒ.©v÷ý¹é£ùAéevbX¬©~MŽ%©×FJÛo,E&‘Z¶W_²W;K ÚY÷—Ë»¾öÕô< ÄdÔT #±ÈšÌÊ0㢋ûþ©…õ%hP}¥ÊŽñÚšÃÓµëjGÐø¾®ÅQª=8UÓðñ<]Õ±iЮÔ$æ[c¯æ8ÖMtEíŽâ–Ószõ9>žGucÊ[ñ\Ä ô¸jNÎÒ­?:E[P; ¾Xƒ×‡F›B :÷Ró9g±ý Ö×è=wh ÕßÛ4T›RgO5œc×Q­{ýº6G¹ªÓ ÷/Ô.Gq¸¦by§£“c¡#ŒÙ pcÄNšÿ‚éŸUcïë!2ªP#1,Û\WaƒúV—S;š'ðÉÒæ£Sµ]ü)÷*Vçõ…Ï—’+l 9]‚‰Rj¤Äž{K!ŽéòÛFÑIâÕÙÅš'©Û°? 륽ú%{„Ú3`ë;£æÏÌ‚.kËPªVÐ‸TÞBýƒ¶úÄL ©U¡ƒõÍ^MáÛ^*C‘§ÖŸí7äT<$—€@®‰}'І}¡ÇšÁ¸ÞШC"6œ%o¹º¹"î«@;º(ÐùëOϤ¶ m™\‹&È­·\`ŸR×+/ܯÓvÝ÷ Ù{G–ˆÿ„.Âú‰‘ÆTºtçhymEÜÓǘ y–¸/%4|<›ß~c´³tû ì®.ÐÎ7šŒž©lßX© s$XÖ]s>?™jgA+ëY‰}Vt‘s"ç í¬’^í,yˇóÅæË #èz+‰ùº‚fšk¿Íäösóä:rÞcä²Î1Tk¾lïxmãÙùÒ¶K ©®-”Ôú~U=“¤ö›®rÇw¾ãæ2~y¯M'§BÏ:Ð{Òn8=C—µ}˜g&o:4kÚƒ÷xäEtm£û© ×úɪïDj,Zkl81Mn¹¾\Þzu1ò$…*„áõi¦RH†9Ö|´Iël ƒªÉ´Ô¥o°—v~îÔù…’jÉd× F.À“z(PIêu–ض c a„ucèÑ`]ƒæ`Tç4×R—ß<Ú]¨ùäÂvhnÈe{ƢDŽ®3÷8‰°W¬_&ä[ÊI…ÖÈè ±%Mõ‘©¸ŸA5Þã×õÃ3h¾LS~l¢¸íúb¬‰hʺÆBóñ[$>ÚB¸®¨G©_,Þ6šÕ´Ï¥þê|ª”UM5Pu™Q f26ÈCåz·I†|ŸêØ /*ëpɵ§µôp³Èy;ýCÓ½Ÿ´ùø4¬ih=ÒêŽÝÖ‹wVJAñ¦¬JfpÿŠjÔ6 §_ÐyCWbM×þE;Kl¼0—ÖmëšGÊu§g#gÛî.BýÎFf™³$Ç3ZC+MSñ‡'©ûÈ<-ý©UÚ>ÚFæÔöóTc][²Û©÷};GÁh-êê}¥ºãÓÅæ‹ÎÄÆIhÎB׬ª{&ã=¨6\9±{òyȨoƒî™£b ©å;ï®Ð¾Ëó‡¿òåÚo.Æ;Üs×n<=ƒî›Ì,ì/¾§9}mM䩳‰aG>Ôï¹(t±’ÔC®øÎðEÚü62–äȵ¯ì½nRTA_Mùá ´fn¾¸X“Õ0X­_c,œšjX¯ëv„î–Hì6ÎŠÑÆ,DrC5£Vé!2«òcœ—°í/ó±.AêÉ>jNgDµ<Égi*»œ o…ýKT“¨úì ~ëgó¡9M9Úç@jY¬E‰Q±fÐÚÂõÔlúp¦XóÁT¬å#F‹Ñùœ.É:ʸ‡®)?2‘ê£Ð{½Ð¤j 5¬m£—L®»0÷¬¨æ!Ö0a§§hKŒ‡µ®h§#ößHM{sK:öNÐmü`:잎5Ö› ÇUÜ2 +k×r×}â¿gHÉEýäè 14ÙL“^?ûză/tGi4»)ÄæÛK¨fÖ¨îôÉYbÛgˤÖÏ–k+÷M¤šæÐ¼%9ÍY«LÆþBøMѶÐÀ·œ›Ëï~êÆ5:÷wq¿™ö:Æ–Zј´ñÐøyäRšÌÒ4OÉÛ2\WÒæHï ÿÎ7_œÏm93×:ë¨çÕš8cèWPMW¨Ï+oÖ‰T7çMòG#ȼkMI~Nê–¹È'TñO$¢rûà{cç™4y¬[ïøb©Øti.æâ—¸¡ÛIÜùx%özj=ÄúËó¨¯Î­ŒœïK} K콄Þö臵+Ôým×\áSé½éÔ½ˆ±x!"Á {2°"1x­™ZÔ«‰˜³u(4UpN¸7&D®1õ÷ñ&9­†‘×»À=æŒÍv½zæÎÐl<8k¨¸‰œQ“\lC5±HŒFŽ„ï¦+i<¿ë3šrbäûi+ŽO–2aO„—o©É„Ž%yø¯¼ÖሓhÙ'äYaýRnøx>4¨~´¶  —³m(êlz9ŸŒ/4È —Wwt:òª[ Íö²]N¤F¡ú¸w_NµxÚn,†v^Cë=ÔªÄn‘A‚oºœßqw |žf#É% «„X»ùØt¾ó‰«vß]5tbp¯žj}¥UÙÒ½'XkÄ ªC“¤r’×B߇‚îrçÝelÛg ù¦‹sè= ;`;dŽõê·Œ ÷±½Ã¹[†õæÈ-£°€kû”æNrÅÞq\X¦«[k‚ZºUÈ9  'æÔ’8Ó4D&ù§ŒýVUûÆk×5 ÷ÊšNÍÛo,—š.9ã>½–g®Öq«I,+Ýåȵ|êŒ÷§÷kòˆ=¶À“ʺùÚC“¸öë‹¹æ« ¸mWæ¡UŒÍµ€>¦—i¡©Ü5žêÃaɺ}cå5$†Æ­³Òfn­B ´´I>*Uï">ôðTØ$©¹¬qï þzSšÄ,+qm…&½ÚN.î">ªm$]ç#5­7Èëp /­ðU1jŽAÚõ.®;ò$Üo•ˆÍJñYÔ¶¡1M®™¦¸}öòÈñ¹–ZÄóÆ3ó‘¯@O õ öli˺°wó +ß÷‹5Û£v†ÿFIuÓS7ØÒ=GÐ‚ÏØlOâ˜=óÐ{%>EÊj Mgª'ŒýŠù-T³[‹Ü:·X£Í®²£ZMÔ8›ê¼b̈́䡘ãRíé^íSâã¨Î´b±ÎNæ˜&\»bbg¤>A^$5Ð\¡ñãÙGä„BËÇ äMä=ÈyR=1è‡Bë4ÉTƒ®iPbs,AŒ¥—›ŽÏB·&:Ëä¸ÅÄ›<ÏÛ ÄÞ`#Œð=@*R¥™ +ºDS!2Ã\»¦ÐJW`­I-”_›­É©Œ]è,9_òŒ5µöÚ¼#tEŽ èÒ«íAm¤”«Ì*{Ø›nÁG§›k³[†“ë;BZEþ¶‘Ú¦‹‹4ugçéòk†á9±)>ÔXRÜF»ç{I-£aóAYõÃôI¹ýtÉVºŒ ö PRÃÚu6 I!kÍ@%†Š6ÂâÍ(-2¦ÀRLηF—¥>oëHtÿÊ)Å6šÈ< J*Ü2XÚŒ{96ÏRX½Ö´.Ú¡ClŸŠ7#’Ì@‚ÐdÛH+ˆNz]Õ¡©ššã3té[ËqùVbBž%ìÝ} ¡C„vïe6¦Ý±%Ö°MmaÇhJÃÚòÉB¹ùæRt7Jù½ !©ØZ­#cAìv$§{FWnY×X¨Ê[|®%í@É*µÕµ–R+HkÒûÒtÃ’q£]z‘±fRîÎR\±•RŽ0öpñ!>ÒƒQ d¾éÒLUr¢ +DZL1åÈC%¯1ö™_±WÙFoBI2éd·)9= ++¾(®bx~tåqåÖ óá}”\¸Q eDéÊäÐÉ,¥5ØIQë,Ôºd|hèLÖÄYAÇg :øz;®A¡„ +’“ÙW³¦ÔŠÕ&š¨µÄ%˜jÖ¬³ÒfÔÒ%o´ÕÆåZic2-СªÏª,…¡"ËݯRîfÚA’:èÉøXRÅ 2”Ú“±Ñ^›Re‹ŽDJØKkDÇ)·i¨\sf&: Ñ¡UM&¹® Sß‹.]ùIºÍ§çèÖ˜¬¥„‡]t¹è”/´¦>øÏÞn^ⓉÏD ìŠv«’±c²ú¢6£K/ˆŽVÚ•ŒŽ“â]cÑñC»VSËR{#~Y—¶ÑN›R1P“\Ø~ïEiYóœÚQJ»¿×ï¯+í¹¦-Û5ä«Þ®¿½N´k¬´s´¶ u$<úu{œègvT`-¶ŒDí‚.ï«A§ºEò‡ÉÙuƒ(TïØ|Kª&C Ä­è`“óê†hR×õÇüí~D0|W^OÆöˆ.â3`Ÿ VˆQqfè€-våã¡`|üT ÈN¬HlÑ‹güýô +“ןć%›±ºHcøJ#ˆÊèûofCÖ˜ðq¦èˆöU°L n,Dd› Ñ Ýâ³A‡ñÁfèÆÜBçívJ(&ßycç—Pj­I«¶…´04)5¶ ýy¯òd8m¬±Ý4QE–\p’)¨”ŽJb/¥C_¡É²9A“\Ò¾RqM®:µ;ÐÍ ÿÛ’cˆ}’ñ¤ÝPÛG€Öƒ.[)*§/¥Š¥×ÒÎ?}Ùž ´ƒšŒ›6gë°Þ¼ }´¶¼{É@ÒVv×n<6 ¾I[yp|‘.½Ò„,12ÑŒvs‘y€ÜBŽ^Û«Úì ƒ4k7 ”3ëBéd  æ6¡m:uÅÄ–Ð-‹nC2(ŽÒ×Èw=d5 é 焹„nUÍÆãÓh'nÃŹèÒBWºŸÏP‚NÁ¼7¨âèD“ÐXh­) v‡.6Øbå®q 6ëÊ÷×å¶;  Ÿ|ÖÌ%t>ɉe6 ÊÓNxy×–ÙИžÙ4sEˆ'×>!Û|Ô§_ š’HÆo5¥Ã×Ñïñ ¯A÷8®¨èjQoå1šÄ…5ù– Î +A)¦Rh–9hK åñÄ/rÚhcä/èh-t&hAEÀƒæ:zb¿‰åÖ”×4TL¯ˆŽhŽä\D†™_a "•´þØDMùñI”–b&_J;FÉœ B^2#ì7uÛ`tµ«@G#Œ)q€øI18ÉŒ×EôҺɹ .£»›vôÇfÐ’Ú3ˆ1äß1öðƒô¹éMƒ‘ 4B}TÖ¶a´3ÄoävCJVÉ#y\fÝ`JjJ- M«²£T$bðQ4þ&›A· |,æPÞ–a´3TªÌ +[]ñÎ1ÚâvGtõÒîF2_1/AŸD7æ ¨,Jyh…ïIé V;v4m§Ý‹°ÿì\­:2 4e©Ä Ç'– "ºñ>“vZ¢C±¨Óݧ´«’؈ ŠƒÄÒK:#¾œ\ b_vðý ÊÉ%ý¨RFyÈ,è’Dn¿''®ë‡®CjÉÄfÓªm)I¿K)îÇ­Éë+„ß’-:íב9Fü1íÀI,¡¤Èx<ñBÌÚ>¸6xÀ—k:PO≯Ðñb2,z;CÉw¨97“Î-RÀ7ÒùFþ ¾¹¼ñÌ aûg‹ÄÚfRâpõ©)´«1¡ÒFÊn*­ÿpŠØòp™Tw}žWc£PÁOǘh²êk6›.ל‰ŽqzíJwAW>èr”€UÊ8’_¦’qM%ñ‹ÌGmζáúâÝãà«àwÄàÕ& #Ñ|©ô‡ s5ÄÇÁ6µ ½f¬· ‘vd’qDD;SÉxÃF@ž ]Öè¦Å5!óƒÒTH.$ÇZ¡+•à£0^ÉUp-5ðy”B^aƒy$eüc‘÷£k6b"¨LÄNÿìÖÇw¡Í$‡”HüÈxј؟Qe‹: ÄJ•Ü|bhÙ´“•ب6³–úJúHßh+ål´ƒÒü(H(T`ÃщP8×µ¤ÔŽäRz~Iåýi|.í ê üh°èpæ"“h¥)n-m:5 ]Éb2¿¨ü¾|?Ðnб +Cµ¥ûœ¤Ä*øTÐñð´½×¶aˆ¿IjØ-ÜBt¡…Š‘éfð•ˆ2™ÿÔ>Ë»ÅH#‰å +-ùIjü9PŠ3V‘ú‹ÕöªPRŸݩ•§¦€ØK»^+M‚šHq´Ã9äÇôÏ›í䊃ãÅš§‚d-æm +µ/¨Óˆ™ öbÁŽáxðyíàÚ9Ô¤ƒ:HîbRE?(y¨ô ÆÈIéƒ'5™žøïÈì>È@àѤÔÚQ; ±ñQKê ê/Aö‹/°’³7ÙSÂCû3WZGgYИHÆ—Ûqo1û|íÙi ¿Ã>©(íp„A^ r+RŒ‚¯!q«?ìy"¨T˜…œy¨.Z2 ËÑ8Kâ‹Lâ ü0Í9ˆ-Så’¼úÁ´Ã›ä-4‘‚2cIÝ“mIs;¥?~Oi+ (‘ù ›„¢Ä¼ós +þY.ëC)Väßèw+ß5ê ó5G&"~ƒL†ùŽÏÁܹô‘Øs h‡§šažQÂùLÐúÙpR3Åš fI¼ã¡¶‚Ž{êC[†¡–å‚’h­G;ÓÉüÄõÓdVÚRõc¥hRs˜$Äy‘iΓx µ-ا´¶z%pÑÑ®dI­Âa- y!¾›„º=ÖX%E‘:d1¨wPÿ¡ëÈÏ0ÎÄg!&“\ØBSu| +æb3ȰRò†þ”ZJ|?òC!$Æ”‹L4eÓLiau^_ŽÔÕ¤¦Qªƒ˜@9̈Ò&ÉïáûÄÕÄv#rÌA”D½<§I6±d?>2Ëó ^kJçñ±X·„ï$õž)4Ηöƒ’Ö#£î ±zr4ê«@¨h¼8ŸÒ@þ@ÍHj\„/üÅ£oÔÜá¿ùñ ·æAmóuœB­§ê¦Pi NØüá41¥¢?bN>ää­°Ç¢G(RiI¼ÅÚ“¾°u4rQøo„I½ÞG›DòPX÷ƒ™'ånŠüPˆÎé ¹°ýóE|Ǔ唴 +å­üöb^[oްþôqëÍEÒŽ‡.rû}7yÇ® ˜ô’ I\)j‰º”}@²D\‚2JI·#ÍÉC³áäTiÓ¹â–k |Xk° _¶·^'v…9EÕ9HÝOÉòkÒû"ßРæ$õˆhtn»Ç:Ö¤ÄJ™Ô- •cÝy/JügX¶9j:ž@&’Rhn-'V€_F¾ƒ5aÐÜa“ »ËI5 ˆ®ÃŒ¥è| 9yýMx~_Ø&¨ÈCukËèZÎXÛ¥ë¹õCµUGz)¨ãH—V2¹%š¤÷§tßÒ¶Q\ë5gîà>ü‘wìžï]„ܺA°?¥6Æë² u#õ¢dwÌsâ'h~zTQÓHº¦5¤õ&Óõ$ºþ³e8H¡X—YÆZ_*ÖRH¾AêuЉ°6®K%1ùcöÖ¡½"’¿?Ik¨JÐO„ +ò}J¾C½žP`¥ù±d·¥–QRQçXPAUÙXÌ®µ—2Iý’¾~ ÖWÅô² ƒSÕ› Ç'Cå˜ÖO Po>=J|ÿkoWå¶­OÁîÆÀ-v·b ˆt,Xk½µ +ÅÎmÒ¥ÒÝÝ &*Ø¢"ÝÒaïpŸsÞÿ/{Ÿ{¾{ïÿ~çþ~üÞ ¬ÅÆw¾sÎ1žgŒ1Ç#²N˜Xæ ü㕳†Šÿ J‡Ví S~¿(²‰žK?ÙH$4¨€ªãž¼ˆ¾ä;<Ž}ÞEŒsÜ’”`ˆ£*Õ¨˜Ú=d\í^&¤`;×…å4¬·Ib{ÿ9¢€ûëAº q]Õ £t×çób=j5†ëæèš´ð säÒç¸Ådx¡2¨ÍÐVPg}&ƒOƒØµø4æÞN™‹D™Jà§9.‰}:t74ÊóJ쳡£šPrN”£@]JUµ_[¯ +"€1ÀŽ€Št<çö5öktö]o•éÐ<® ‡o­#`Î@*…©÷óS:öüÅ×óÈð3¾Î)NœÀ{þ”õx®»&¶·¢€ÇÅ.qJ§ø…˜/Ž‹€A¡K;¯µ¢à×[hŸ§kA-Ôž9Þ†¹t0… *¶~æëÛ˜3~S¸ø¾øÌ?ù:ãÿp=(Aü p:ìUÀ@Ã|ö‹ýèZÏå×ð<Â:1qL^,qWäøºæë ç–‹;»§/åø2¼vÁv²ÈóæJ®ëÄ™8¥ˆŒe¢„J qF‘è^3A§uécßíä”"Žág~cq ŒsÄgåIÉyùᎨ˜ûc{î:ÿ_Lü|×9 ºXA<âIx=ˆ|ž¬{Þ^%q +Ss|Ý—ãëÐ î‘ãëC><l(¶Ã ŽH…½Þ +ªf[‡8%ÇÕ0.å¸:tÚƒXƒS”" JHØ’±»@qŽŒoQÁ˜dX)c2ا\Ìö¤ÃBv˜SŠÿ‹R(¥3©?˜+óD™ûS)Â}’ø"¶Ã6þ + !>k=ö§Bâô`bÒìÚ°R„8ºVM׬ãƒÎáàCi üï_ôšÝÈ 3ØUP!£0ÇöyÄÅ\¹Îr72—±Õ{ˆôþ Þ jÑÀDðÌ\o/—9Ç*IϺL†µ ؆ë\ön;W¡BG½ßÍu§„qBwËà'[N%2N‰ëð_w@’Þ` φ +{³•[ŸwV@ކ¹qo×ÍçÕ:Æ1C‰<ã6Ñò£Ä19°¯§$%˜GðI× Ž_ f 3«Q[Vï˜Íå»}žlâî â0ǶK‚m;ØE®#^œ"Ä  ^S îj9¥ˆëqJÿTŠð¥Ÿá®ýàÿÁ¾ØDsü”"ÌE›Ê8 ~ö#øsOèš +k³“—|fpy:àöÇ­¹ýÄÅÐ"÷ÛK¯G«‡íþ÷¡Ã`FŸÙÐñ ò‡ÆÜ0÷•ëJ˜µö,gKÁv‚ÿŒ€y¹ c®c?~ø9÷û\.1ztRe|_màâ§ì'žçÔÎ]Ÿ*;‰÷ÀÑÓ£8ÞÆ)E/ 3ô9ÿq”"¤ÈÈH‚¸5ùœÐÜfàPaúS)b.(EÀØd)EX\;ÜíòåV©ëíbŒ]+ˆ‘bN1O—ôÅœJ‹wæjP(£bJwÓ9@É~º"3žWÕÛAMj¸ v܈Wq9ÀݯCÎ l”Ô ïol3!6Ëu¨ud3K.çÊ ¢”F2ñƒ¹-×Uã!èæ 6”2 VâDÀùé37&qñøóaáá+£x‹ºÄ<å@)›äR¸¸ýùáÚ +쨜`_qgN ýŠ÷tâÐÙ‘PÂ)IüìüJ Õêâ¤Ê&Bá/¥¡ì‚<·f iã3 ð=(EÀHþU)ÂeX)û8N鯙%æ@G¬ÇÒ‡Ïæâ Žñ ;rjxAüÿ®w–rëîŒÇd°#  J$t«R jTà›M\¼ÿ¢û2µëìSæ¢ã$È?Áþ•pv(HS­Á¾•>qi,Ôð§…6PÀ‚®ádR*×:"ÊñŒxÈPßaÞ?xä€÷#ÏyM»ª¢ÚZ:°Kíß«@Yb­‚c ð1Ô|!n9,ø;€¹Ž³À_±Ï„x!¨ÙqÊ ^jž Ô€}&`rðÀy¡‹%<®ÛgJ«ºðn¿ÞSÛ@)”"x:Ð%Üd\ŠA Ìü:SsJºÒ×#sôêX(r`{ÍÅ'^ óÍå5ÌOâ¾ZœÏJ|ûP·=suyäg‡8lôt›8òÍÎ.æ„X'(w=ßL‡½Vœ ÝaNÁ6PaO7w!õ›ÃåQ]¢• Êum ÊÙĤ5èBw~°ÛC‘Yb[~=a©8©R[šÖ(¤vð¨”NM"ºj§÷ ãq{9•Ç)EP‘¥;9¥ÌŸ¡ÞBÏЊÏÈZ¨BŠSËv‹^ +,œR„Ó°R„ä_•"Îþ¥qq4ezLž—ãð.䄱Ÿ§"Ëv3áE;Œ;¹˜çí•`G8Îiª q»·‚Nè8À¤öè’‰ƒj—;ßZ"²™O¥wj‚ +Çy¡#6ð%¨Ã§ yÞu*Wa8 x9Ä€«ÿeOÀC“X\+=s} +(YAîºÎRÁ%Û»TEâ”ûèîN^ðŸ +ë“/9&§¥ÁCjêZHGËñ˜ã\>p'_£]h¡«9İ$¨Íñ ßÇ›¡æ Ö(uôâhsi»$¡L‹Êß&Á¾‹½[ùÌäòPËáÝ\“”ˆøê½Lr‡§៽Ö ñO¥Ë?•".Œ•rJw×C§}É…ëÓ ¶&Àû‰„ÚŒ5¥¶ó¥P ¸ñÈ•1kãRD<9RrÙסj.\S–‚­‚õÊÙ!芞»S”·]映ó ñwP”›"q[ Ž…Ï6Ò·[x¢Ôf=˜_PœâlmT™Š4£‚/Н<À„å*ƒm 3êu¡33Ä.¹zèrꙹ +xðoÈÙý¥AsJuûD)ݺâô6™1 E¤6©2×Ò—Bއ¨(¸¤-e"Êö01UªÀy(ë°ÙÀ _¼‡Û€å¡n¯ QØ«âøZm:£]Oú ÆLz§EDù<_CYÅ(P¦ç½&CB`~v¤1m:¯Sà 4Æx¿,»&ÂûbQ/âé’~S[Á¸Pêñh½Ì-u‡g~öœõ .!Ž-Wùçmáê gê£æzAqTTa~ˆˆümtðÓM !± +çb€š#™kÄ"鵤eRïì PÓ1Œiâp±wˆ]º>‹±Û†Í>ÎÅ0 sî·)\ŽÇòútˆƒClEU­!Ž(Þ;ÌÙ±ÿ¶†úŽû«¥îÉË fÏ©Nryh¯éeGÆ7s}«Ö@ôªúìYÙ PvÔÓÒG  ÌÕ²%–¦ÔŠRkt‰¸¼œ²#(i‡)CÇ|è`Íå#@u +cˆÿ«[`Îf0ò¢D榇Kn7’Dj»(E€:9íš´p8?‘¼€üÙo*(¨Ó/WsJV>38å¶b^—è…œR„ë°R„8ì‰2¨Apô1ö—^Ä|À)A‰SeÃ<•ë4Œßgâ«Ô˜ÄZ ŽŸ$4«AÎÔ|@íŽ ú?Ôîÿ©v—Ô¥u?†|j¸£8Wg»P u ðïCÇôÈ +Uqb“P° ž¬.'Š;Kޱ4ð‡˜#‰ïÖ’fÏÞœ‘>©>ÄÏìUƒ½@ùå®§-ã #>pMàK\øgŸ©œ-vˆ]Ö©ÄVuXïºêÐçTGùbìß±Ÿ—œ¶ ?Ê¢'.Žû.=ïÍÕ‹]‚¹.É;‚Ú2¨ùÁ~Q–=sÖHSANð/§Î9JȯไZ1°9€@UOrÎe +ë?j7N|1óè[KÅþ϶€ýã@©Ü”Ä0õÎæ:8ÃÚe¬<¹¸:ÄMd1 Ú Z/²‹™œbQPïcrÅ_Áôœã‰×l®3þŸÊŽ0·DzóÙãÒæù…VôƒV!ä© t…|Ç× ¶ÊŽ>WƒZ-•Ô®ê›T|£ +œ¯,¾‘µJì–¾„SÚ…œ¿uÄèè3®“¸ì¿(E˜¿ry!ר… j|BUºÔæÈS.㉓×&à5¢H»Ý_*Ñœâ¼K æ*á?‰þRŠ?õxþ÷ÖQ᯶ϖºe,ì÷W|•ã´iËé˜Il•¦8®ê•\÷Oµ;ê/µ»ÌfãÿªvW¯jwP‡Éí1ˆáµÈu÷¹µŠS„ÂþêA™ˆSOr»½j@U¹¢À­ŸëE¶ñóa]€=nF§´h1^·VpÊŽ®·ƒŠ4i:“´ 𱍅¡¬Cg _93ö倣ÄÉMz"Œ!öDˆŽÈA=,à>NÉû9P9Åcˆg2'0ö€x<¬É‹Ãµj\ Aý¯ãâØ^€RªÈ.h¸æx +`vÌ3¸]¨eôÎ^J\}ä rðò(ÈSA~rC£€Z‰K¼WWªƒ1Œ£®øÎ N]ÃÕÈ`¼†ë^68#\¶QóAbµR§Ï[«¡¾—eGÀ̰V“«uAU˜Ò¡ÂÕ(œv™5†P£ÂÅ£+wAÌ:Ós¶81ì¯k·Wp5`÷Ïú€¢æP»â¡ÈíUP› ÈYêÉbçÄá19%/¢¬'’ª÷Ñ¥Û©w–QV¡³ &bX¥ÿÌ©8ånå…l £>÷·Aeâ3žY«Èˆ×Ûˆ°ÜM\Ü”¥Îܘ qdN}ÒëÑZP —zÜ^ÍÕôA8Ô.ÂÞ¹~o™Üs@”Öo r{´‚«¯U-Àe×3–aΰ Ô]¸.ú`ƒ1¯À{qàno@8%ðn›p¸¸šþ@Œoë‚2Ž}Ì|È{BÎ>bÍù}˜cê䕱\m«]¼"ähû@9l6uîÚ$PôžÊ£ÄqŒ¥Ó•D~Å[wˆl“9ß|Æy——ž”çpØi› ì¹.ñ\½„ ïåþà­K½~wÇ7|²×pŠ&NPŽçÿÔZa? üvðúøæl{e¯ƒ¹…œ5äê9E ˆcBþâ…Pã q~—´Å\\r¦Øör¹|ˆaÁÿ‡qsåÚ4ÎŽ‚räšaú?ÞÈ©@<ò\®‰K8Õ2°×϶Šm7OŒZêðtÆ]"©Y”E—|§Ógì&À=c³Ô`EàÓ.ÌäÆ +ãÁÜÖ.؈m“Øž U*WáÆä€ï Táýðú zµ•SÇö}´¿¶ +8Ô‡j •Òz€HoU‡X(횺qIV‚:+ˆõ1å;E>¯7qqi¼7 ^ø6‡s½ï¬„\1§Úó~'ØXÛpÞêEðßX+º~‡«—…üäy!¦õ8ThÁV*£GG[»StÁgi~Œ«•„˜"ä®a¿‹®ß_)¾;ŸSl±ž±"¼–qy Û@îÜ—û¿8“SxÆöMâqsçû9þ­È½ÂesÜ»¸õcŽã¡âhB“ãÃ5õægFBlI`rFbÆÄi»ñīѠ.ê%ŒcÂ: o3^¾ö¨’a^/'À6p1ÔærÊt/»ê7Ÿ .…ñÏÝ4ü Bç‚Oåîj¼Ÿ¯§B*¶ƒ¢,Çç±m…u u¢&.ñK8^ +øÔ@0'ßÈY9Åáx@êRPÊ’xæ¬c‚ ”9Ì +8Ì*H»¸:¹Gk8qaì/9»à÷¬& w (tqñK¼îñs] ª¡ ¶J% Ð Ï/ö{°âit`îPZå”ê# ”9U¿àì`—É(l§9_‡}àtì³o¯â0-¨O€ŠçýUœïOëÔ¦4©Ð×ÒÁïBüPײrR”Á&à/DtõNQZ«!•Ö£MÆ6îáÖ½ßcP‚S&c+vcŸ¥ vò¨˜o…˜·ØíæR°?às$×07p1PPŸ¾ÕhDÆTì¢n¤-æ Vuüô(Îß²KR×~2±G•,ÝÏì#Ô°Òï¶PWBgÒ6±s÷[K¨Äöýâ”fPMçâp® 8ä<C¼À9U ò€ôQ—ñÜYÇÛ‹%öÉ ¡†ŒSå¨Iì›qÄ‹æp¾­Ä¸ÜYL{g¯"Âð¿ ˜Õ*r6q1pi7‡rÊ\H„”m!n}Ò¦îô +n}Õfÿ0$ß|3!ó>¤rêæ'="ýÓ2mPƒ¹×-"}SNò¶é4ý¤SB§ôh1ïw›\‹[&;e3â\í*~f ‰÷é +‘ï‹LB“ºìf=i–Q!>˜TA˜%–ñÅ‘E*œjñE¿™2»î¯$ckö@|Fì÷j Ôeq5{@ˆãœÛ3éôéŒ^=:©_ƒŽoßy¸@ň³sI-*(…&6ï#"ʸ¸4ã÷tØO2­Cl ×¢ +ê žëLâqw5KåêE³Vƒ¯ŒûíeTàó TX‰2‘òa?™Ô¼ŸJkÖg4óDiú þHÄ7ì…{„ø Ü;Sµ Ö ¬k2±CjG¨›½ºôÝ>(HÓ>‚¤¾}Âè¶]DÆwMúE‰¸èÃÏLaç)É‹–#ô£6Zt_øw¥Yµ&Ìýf¡ø~3þÿÚqv“)ó¨‹&J7‘ï7;øŸU¨œ.Fú¢ö„4§Æ°Œ4³– Òzu„émjÀ•@! j è°¢’˜Ê¢Gm"æ~ެÚ5¬>š¾œŽoÝ/ y·‘ÝÄ%m™(rǹœŠ¨{Bžü#}»ƒGß0f²Û&»Uļè8(~^D”Ûn!¾ÕA’郚dlÃnaJ—*s»ƒÏ¨i½û™C¨›ý:Ônâþ >y÷£yÿ#~: c^ôa;Ðï>J™7½GÅ9]Å÷ð³ÚIQNƒLò¸å ó¸UB=èâCŒYðè«0û«!ñì3Åä}<",ü»)ñê«HTÖvQRVuÕôÍûK¦Ïߟ–fUÉè›-tz¯Ü”·|çW0>"s?JEÙ=R&q@“Á¶àà­bS&®]𔼱ùÅ‘ L ¹P“üBKÙËŠ³â=&¢ì>™än‡XšÑFJo6P¢¤]qz!“Ö£Ëx>]JWÌ+¨beN]4(oàñu¼ÏŠ·‰“;tÅIt¨ÄuAÆ5aôÀN~ò·½üŒ*F…,ÁofO{ÿ¸"¨ó tÝ j¿œ![¾XÒý]¨þoNÒ¡b¿C½C޷߉ ÖûŠ{>xÉ:üL»ÊC޶çÆHë«Üðs”Po¿åõ—7XË^7žgµJe÷kMÍrÊO|giö¤øœäaŒHÿ¢!ŒmÛ%ºÕ%åÔeîöddÍNˆÿAÌX”Þjˆí‘,µFhv¯ê°ÉðM*©CƒµÒ©EÝoåK²›MŹuÇ¥¹§„Y¿ëO¾©ç2Qaû9Q^÷qúEŸŒzÒψ^v˜3ùíÇé¼O‡©Â#tiÏ9º¤ï,ýîó1²à÷ÃäÛo&Â×_DdÁ'3º¼û¬´½ì†´£ÄC\U~•~ùÁŒÊêRC:D|û^"åÓØôÃNŠyÜ!‘ä4›1:£MHëT¥·ñdO*Àú–=/?!ºßJS÷º©[¢ûí”äQ“™èE»yç«.‘õÑ€¹ÛNÙâI7Iæö˨¼¯‡™÷=g™òΟé’î3tå‡ tUçyòÕ „Îé¦Á7‘¯úÄäÃBâI¿Pô°EDå7¢Z/ŠºšÝMJ‚$C¾Âö,¿–µ ?_¢:­é·}‡ÉÌO:T ö¡6ás€—AN“³å—‚€x?°fÿÖßÕEÙRiaÅe‹§¹—¥Ñuš´ß“µ‚»ßµˆ{ßô„¯?ÓijAJñ«š0¢OYûm—8~HG–ÞJ˜=¨>.+,²2)+r:XRèbšWj#yU{Rz¯Y,Îè0æ°JjŸð4 +û9&y@cBeÉÕÔ¨Úíœ_ŒˆâoæTßgɧÉP©èÓOæ—nѧFOækÿuz°ßU2Xæw¼-#äLKR˜{…OTPùµˆ£wÃÈÁß%ýÍ~G><Š4í) ‘ô¶úH;š½¨ºÎËøyž¥ßY0¯‡ Ó¿ï'’U¥¹MgM ÊíeO[‹Þô¡ ‘ôón‰¤¤ÉÒ´µØWRÖrUô¶å”¸¸ígiQ••´´Úδ:ÿš¸¤å¢ôuÝYñ»º³’¼¦óÌëN êm×AIn^•§¤ù¥ç$Uç°Í31NéÞ%ðz´ŒY»™ÿüç¬1YÔDÜÞà.ë.÷—õWû‹»›nˆú[nHz𼩶6‚Ò¿™ Jÿ0%J±V~9F}øxU4Ôè!ýT`Ñý8Bò©Ù—ªüpžzÝ#£o÷ñˆÀw)ÿ7ÈÐ:eòÖG=xMü²ÑÂäuÅ%YnùYYvåaiV£‰ìQµ¹IVµý¤]Â<û #^t3ÌëV q~ãInýiɳ¶câ§æDÖwâñ ŸÆþ—yÝf!©¬¼*®«q”5WÝ0ë. +>þ!+öTÛ­Ø£]¢÷¿ŽÖxHZ+ÝÅeµ–Ô›~S¦¤íÓRãhÚó.øP_nø‰ö»1g[’¢.6ÄF]ª‹ +;ßy¢-#Ìd0ÏŸêuÖþr’ÿøwˆÿH~˜!vH[H&|P¡nê2©º`ÛÀw _.4Jø¨L 5íxçoÞžbVWàu¸óEø¡Î7á¢êfaÑw3ÃG¬šÀíåbþ!›Ñº&ˆ¢,äÄöwI²ëÍÍ;ß„j¿w±)9ùXëãX“†bðk̽R|³ÉXœŸÓÛ’K¦õyž²7•?3·š¤÷ZÅ`g˜Ž&ç“íxÍEÄ”¸…y–z…Ã<Üó Ôd(?Pú©Ðß¼÷qÈÕúnMf”:†>(uM.q ;Û’.Åëöpwvè±ö»Ò*?É@‹÷¡®×atã ?‡Õ'3¾k c»wӮϖS©_´MŸ×^>ë2ü½2yó£–äuÛ)“Ê2giY¥½èY¯™0ý×ýÂàâ „_á:~HÉâù!­+s9úáEÌ‘î—ѲÎ2ñ‡Zw“¡²àKM±±nu>q®u>±ñÕN‘îu>‰ÒÖâëT}û³÷!N ×n„5:‡§U;„dÔÚÝ©´Æã ½^áæ]âê]y#ìJCDøÁÞÇÁLo¯+U:p†~9h&}ÑxRúºñ¬´°æ²äEã1æA ÅÜn1lò ±VÌ×®ë§Z2£Ï·¤ÆŸm¹wªån¼´³Æ“*þ|‚_ú7©°öÇ1¢êïÇyïX#ƒ\V“—Ô½Í(õã.ñû¶K{‹Ãõä†Ñ­½Wéâ®ÓtiÇ9ŒŸIRšèÌúâGµ2ÑûŠó¦o=µß:Ôñ,ôxû£Ø‹ÍIÉ6M!‘î5^¡¶ ~Á¾UîÁiŽ!÷ëlƒóê,Êš.ûU[TÚ–ÖZúWÕXú—áŸ+ª¬KK¯å”Ù§•9…ú–yDžmLŠ0xã/¬õ2ï~BÔÿqNðŒå“þ! ïÐûÄâ'E7?Ñ _5$7»(úá7JTÖyIÚ×ì+êjugº>¸Jê$Ÿ*¨Á^gÑçOÙ@i i_UÝÚe+xù›€xñçמ”5—\—Tû›¼ q®õ‹÷n¸‘x¡%=õP×Ë0i_‘Çáž—G»³¢Žtß ·j Žð¯q {PmRTgXÐhð¦É2 Í«· +È«³ +xQ}58ï»Ä*§°är§°ø +ç0÷*ïÙ§|?^+2 +,]%¸Éª‰Š%9¥»Í%…-çMK‹]L‹|Ì:ŠƒÅïšÎ 3Õ‰”~uIF³Pò¤ý°´°é’¤ûä×_Ì¥µunÞ•^‰5!‰fmE!¢¼¶Äíßt± Û…7¿hÒÏúÄ¢æ&ç‹Mñ 'ÛîÆ™öa[˜nÚ_,ùÚà¨';̺9,6¦Î12¢Î%ölkz¼t ÄŸé¬w:Ö™íÒìãÚàUçr§Ú6®¬*Ûà§xž^—_ É-vˆ|Ql–UjYæz¼#3Tü±Õ[ÔÑì.«©¾&Êo?%)­³—4ZJ*j®ÂÞ)¾†×µW˜g…g¸KE@¤cu@d\±k„w…W,ÕÕëhü–ð›ØãG±}ò-÷ˆŽ,rO.r ³­Åë+.. òFÜq|oäàƒÁ;Ö€÷–5¶|?ûTÓýDÿjŸLŸß̳mwS,º²Ã™Æ +kQEù—º€4˜'¸^WÙß©± N®p ~P{5¸¨Ñ20±Ñ.üHOVùK“Q/{̸ÿ§øßÙËÄ÷O¦Ïü쪃#½«nDD—º„¦¹†^­ + ?×z¾!!üxKFˆ¬·ÐϼçEˆ´·É_ú¡ÉGÚÒæ)zòË!òÎßõD/9lÞ\z¾9=ñLKFÌ‘Yû^…ê}.úØqƒèýÕŠîëq«ö=Òy/̼ÿIˆq{¸eèõ¡ÆæHçÃH§†à›&õy×xoX=ÃôoÛ ½ž-4´Š›Î³‹›i߼ɸâw1Ù×ew¢ëfd@“KdTs˜E÷Ýã_Ù ]¬‰~/+Ñ`¥zý¬Hw€¥ †Xsã¯ìyãìEæ[µó½ÚøòÅÞ ••è‡6¯0zÄj‘ï~’·X›ÖT{o}kWšZq=6­Ü9Òº)2QÚSå-jhrdê;lÄõUNÒ¾F¿ó)qÕÁ±ÖU‘1w +\ž¼s¶lˆÂ6ûe¤l "ȼ§ Ü¢;;âRK\¢W½g¢cmPìÉöôú·îkTg§¨§ ÛΊ ‹žœˆSíQ—Z"##œ#Ýë½bDŸZ<ÉîÏWÉÎo6ü:Öܰˆ5Ô{8´S? rŽž_¦¢N1«Æïú~ZüK•ïõJ¯ˆ¤bçì÷Bî9‡¸—yŸjN ¶è¼L º2 ½Öô›O‡±?Â4uÚëÈŠv­ñ}PèòºÄ68»Ð)ìþ;'üÿ:…<ç’üÞ5üpö±ýEAà_=+½"Ÿ¿·É/¶ ÌÀ6«´Êʨù²ïG|a[çZï!üý£ƒN+Ë7þÎ^<Òu7,µÑ>¢¨ùJÀ³F›ìF›P¿f÷xñ÷rñ÷*oð‡fC…!‚_/é½dU mý¦h=+Àô‚Ü^íØ¯‹¶îÚ‡”wîG›•ÕÐÆ­{Ñ:eU´Q™‡T»WŸMÓHÿÛ*ÍzV“üÒá`_œüúzØ·®¡Aža‘yaI®!ùÞá×0v8Ó”)êëõ0é® :Úž‰qQt@™GLâ;÷Èäç°LŒÂ+Ü"ç šþ~Âäc^`r¥cØklß^4YÞo³ ¸ßaÄüh¼aùiÏ2dªºž­QTB‹GÎF Ñl¤ˆf yøRÂ߯;m˜· íß/F:’«rZ2gù]{(´|š"šæâßš‹&ÉÏFSåæ¡9#•âØåHiÆz´Xq+ZµJm3:‹öߨœ¥ýŠÝmPÍŠ„]\$ß±‡Dï>Ÿ5í|’ñÎ5¢à]лb» ü2›Àçïí‚ã*œÃÃËÜ#¯WyÇ:WùÇĽs¸ÇÍ©sHÔûkA%×Ãö=!:¹Bõ÷9]m +Œ¨m¾âßÐzÙï¡hâG¿³n#ËÓÎüe½¶ÝíéºV)S ìÌÖóy¯¤›ùe£Nöß·é>fwéFÔ/WåCK•6 Ås– ¥ÙKñf¡IhšˆÆ¡ñøš‚R@3‘’ü,´t†Ú°Ýí3 ”W½òr¢ZôÐÍfVËè {šÿ ke2ðÊ_Ü×í%jr7÷¸Kz:¼}¸q­Ú'*ú{hR¾kÈ­B—lCÓ +ÜžÛ‡¼-± J-vÅö8äe¡CÈÛ‡ ‚» Ärç°ÐJ÷¨––K>l÷Ù€/íVq¿ôÿì}²3!Èð7öÄBv›ºëÛ{%V#6íRG+–+¡µëV" ³sr:n7g뺤ÍÔ8f-¿l¡šŠ&£±h …FrŸ£ð¸äñç$÷çÏ#ñ+ñ¨Çãß’ç^›ˆ?š´ +mÜ,F»I/¹÷Ù5¢þ"—\ïÈ—^¡!ù!áù¡á﯅F\K.p MÍw }çú*ß1$'ß1øé§à,¼7ï;†<*r}Wv5èF•w4óµÓCô¹Áƒøå“ÓåÖðˆ7-Ø·]ov×îf ÷šG+ç®Äëp:¾¸·1ø®ä¸QÀÜLÀÜéôðþþãF¿ O`3bþ:–›Œš…æL[‹Öo;„¸WÏæb¿1ÄÚcuXÒßâ}¢õVdFžkhA¾CPÚ;—ÐŒ÷Î¡ØÆåÙºVúFšõ> p+÷‹‚µù¤Ð>8ë½CHd±[è‰öôPÑ/­ÞÌoMžöM~QÕ.úµ8ó~cO{«¸e¯>Rš8 a,wÿ£ñÂ÷“ð˜fâ7ßø/£ùÏ#¸Ñýë¸GàO˜»ñøïÍÂ{q;“HÕ³m–Ævµá {”éìu—uTùš·¾ >Öšv¥62Ò².,âÍŒeñš„9Œ,¼ó˜ýÆ5ìu7o`KŸæ;†6Û‡w–ÛK>{á¿g¡ßÉ2FýìIÁwÖJ§„ÕÜeh¦áúýc”ûó‰ÀGýùÌfY†/6Dë5¯ }NÕS4ºYmòS¹ÍÅÒ8¿˜×ža÷ߺ†?Ïw {–çñ¬È!êÑ{‡ðÜ|§ðÂ×ÎáoòœBýß{„8UDø•y„ûV\K«Ä¼«Â.äN™Cp\™kÿ+{Qó «¬á~o¦š…µÜ†õÊhŽÜn Žãîâÿ\srÜó—çÖ)|ýÏc^‰£ñûc¸½7¼GpßÃkcñçlU'¡9hÚ¨¥h¾Â´r÷ ¤l–$§ÙÀjŸ»ìÌzžød9û{†lM >|¶11 pðJŒ½B=ðWëÚÐðcí™!ðzf‰cpÆì µ–ÃX×2 ¶Î)Ò¼?;ã ‰Ú•€1 æÎùÿ}ö#ñõ¯cýë5¯üŸï {4÷dÆã'4Návï°E¶AòŽu·ÿfOÝŒVﳇï^{åv/×-<÷­sä»|§˜ò|焲b‡¸—N‘9Ž¡ n!vÁ¡p9Wú†bÿ^år¨ûž¿n«·fÅæÿõ8†­¡Ï)²¼À1²¢Ð)¦¢Ô>ò}Cda¡cäƒ÷Ž¡ùØž¾~o¯‡•¸…¨·³j«7¨ý¯Çò—Ý1ž³ìcþü~,gGÆýùýT< +££yxžæÏØŠgoEs÷¡ùË4Ђ%Fhîš»Ô)Ì×@³é Å4Z§€vÛµNR}Çn|xeôÊ7”Ã-…7BŸ8†`lQì‚qf8pûù¿`,VRbZWèZXdŠÇ¢ÿ=¸ó„ŸÜ’-»°oúo ìäXÎ2Œä¾¶Ã{p<‡F¦ YrsÐÜñ+ÑÜiÐü9ûвuR´bÇi´x«¾N ù«ÅhþbÍYN 9 yh–‚š7O›{o?í±¯›¤ñÕ2ìg›7=¸v¶"Ñ'æ…WhéKר†·.1ÅùÎ1ØÇG¾-² ùPj1Xi1Pk9Xg[[j˜T÷+]²Íø5gpÿS8Œ6åOô8ìó`ï ¿7 ¿; Í=ÍŸ° ͸)L_mó*4{Ú:¼ÿv¢¹Ó÷ …{ÐÌû¸±)®4EŠK$hñ†Sh•®ÚzèüN¿îiªÙìÊýŬ²áGöÈ‘ú›€A_æºFÖä;E4àyª)³ m/³†=×Qg—Ô^mŸÐÞp5þ]™=æêuìÞektþ×ksx¬ˆ›?ðgÓ忢éò˜!á}5ï¹™ò ñk Ñd<‡Sð5cÌ4kâZ<¶Íhö\e¼>Õðš4Dó6›¢ÊgÑ¢ývh™¡ZÅD£UdÚdþ\nÿ¯³TÊØMT_ñ•Ëñþ®…AAž…>Á%{Uã±=.±{Š}\Y±]X{™]Dw…]d{¥md^¡Cø…šè`wìî¹SæýÛóö×~{žj¦¼R½i^3ñë“°Çž<üžœ"R·ÛC»lîÜ ÿ¶/Éa-ÀˆØ{ľl‚¶ýKÂÈÅØÎ/Ä+r·6gàÏ™r³ñø¡9– aÛˆ¯©«Ñì™Øþ/ÑEJëÌÒz ´hÓI´t¯ZjŒéz£u÷ä¶»×MØw]¬ÞȪb|JÚñÊíLM’_ÀŸÐ{¯\C*ß8…5ౕæ9=/µ þPmð©Î&z Å&¾¼Æ66®Ô%ØøGÏ¥ubËÿëœ càÿøù/[2Œ…ÇáÙš€÷ÚL<‡s¹k¦üOHaÊn®¨ã5¨‡æáuøÓf)úi#mŠ!š¿T)ÌSC +‹4‘ÂFS´pÞsÆ>hó‰,ùmþ“vÝdçªT²›Õ*ÙíF_ÿ8iÑtó†G‘WPtþµ0l;#Þ`,×hxKµ]LW­m\_½müçú«q=U •vK +ÑieyK”vü[ó&ÿ/öqØ~LÆcÁècâ*¤ô“Z¤¤ƒÇ¡Šæ.TǶBÍžƒíÇœíØfâ}†÷šâÜ=hþ¼}h‚*R\ÌC VPhñæch¥†Z/L@ŽæÈmv.») eü®§ìO{’~ÌÛ_ÀnÖêfyÂÏ-6&íÝÝÞùåú†Tä¹%8„?{ë&(û~÷’Õ5~„ùEÁ÷ƒLG›³q'{J³”ݧz½h†Â¤Åÿ㸆}Û8‚•Ï¡,ðÐóÐ4h=‰¶}!¿9 sâŽ'ì<µVEý»ßpˆµàõ±'˜Þ~·#-wOÕ§‡êz|ª)#2ñÍõȸ·7"O7ߌ1ë-u¬ N,/·öﯴ +ˆ.v ÕîgÉMúçþDZæÆ3‰óÍS‘g?&p˜÷0ØË™£` ¢ˆ÷£š> +.%4sò:4w‘Z¢‚ññ¹W#÷ôÏÚ{‹]¨ò‚] xRå)»bOüßæî +雱ÿ{ÚNÇò‰;¯<»×³bšZ»ê@«fü‰=oô‰=#úRänÖÿÄï|Stð9àä€5Ÿw-p {ùÞ.¸¬ôjPs‰mè`¥C\m‰}ñ¥ÙVÝ¡dذïÿÎÚ÷§/‡õ ÈXaÌ|¤8m=Z¼F­Ó:‡V’Vh…E Zk›3rǻћ=KÆmq}7vÕg#7ØåŽÚæ^>~›WËÄm ·Ù½«l™7f—kå¤ýOÙuûëØ=*wØ%ª¾-³Õ3ÙZu¬–^+ÔogÅúͬH0Ä^¹\ ˜Æ•±³CU`2B:ûôÓÞn‘Ù_„<×{óTD—G,Y±÷X—rÜœ]Ÿ¥€ñðU4{¡RXi„Vì?‡Öîh-q m -'nÉo÷­¼ç&»@%ÏO»m»ìßnïúiÊÇÒå7ˆ½ÐVY舧nÚëX6yŸGë µˆ¯Šž²›1>ÑÖû…5åÿºÄ|)rÑëaEÚÞ¥ ôC›Wù­$üa$*í¹ ~ùí(yïCaòßԘ̋7cž6e÷IeOkŽIò[ÏC½“ak¬*ñ–Ÿ)ÿ?û=ˆ‡ÀN›>vÆú›ÑOJ|´h)Z²ý$Z®i…ÖñÝÐZí‹hýÞchÍV­X«V®ÔDk•EH™ð±ãÂÓ1;­‹ÆïOúûbÍjV]·ž56èc͈/ßí-:îŠ?¿¿&øöÍRøù‡^+Ëh§ÿºV7¾{­Þmv«AkÄ+e)~%k&l<Ã4ÕÙ2jœõ½7ï~&þØáMÕ ZòKX©°êÇq¦«ÍÕ¥Ú?¶²ÌÚßµÒ7\=nhÑb%åc]ÊkÃØï3<Ζ¢ùó•Ѳ-Æh³Ö)´pE;I[´ûdìÈAï§©²«5°|#vègñ§çŽÄ¯•6Æÿøú³ð÷+þÍ–†¿³Ç5¿³<­Ï,_ï;+ÕÿÊ¢?u»t³¦Ú>ùŠz§‚ÇiYøŽÖ/`uåì!ÃÌ?v9Üš#xÌSŽ'ÚoGé¼y¡))þDÇýXC#D:1Š|µI’Ù@ÒÏû$FIŸ¶i^Œ°tÕnާýw“ñ¼ý¤°-_'À8÷:Ú~êͨž“w%° +xííÐþÌ’ú¿²‡ô°‡u¿³’ýÍì.µrv‹F«að;{Ôª.8$³Ü!8²Ò9ıÆ7X<ôÚb(ºxíi¾f·k=f·j—³š¼fÖŒßÍžþqUò­Æ—ùòáºÁcVÕÐ䄜ږHWSÁ9J¨c$’šT© 7›Ä6)Š’ÓÓD9K¨ŒßõD9ƒ&dúg-Êåî"Mº‚ž…Ϙµ›ÐüIKÿK,è?Ö¦<ÆYcMY‰–n¡­&qr{|Ûg€ý;ð™Û/¾³§Œ~aÏ~bë5b[Pdžå,¡_Â5°æÂAÖÆ¸‹=É+gÃW¬¶QHû:#׬¼Äž­‚ÊßSý½Ž‚¬%¿=¡Ÿù‡²‘G¶?¦nyó³6õdˆD”n"^­%bs•©µÆâœ÷iyÑU³†|oѳ.3&nèT¹ö)Ü@ç4Ófͯ½¥=å>¼2–Þ´›üoÇ5ÛÅ)òŠhêØhúäE˜GoC‹Vë¡ VhûÉ»#·_¯˜¸çîßR¯bwãýÄÓ~ÍîÕv{¥ }*q¼¾ã#ý7¬&Ý\asâÃíhÙP¾=Øä"ìï³6,`y<ÏPÞ™£#y?_Ísp›¬–³D¿ˆÕu7¹1M­¶Fײ~Òá‹‘áAË‘F·þ¶¸õCGxÖw²ð Í(:¨~‡èA—Xò¦ù“Ûnεœ”””]6ÎÜ'¼õMƒHïT'S?jˆž}8Hæ}9¨÷ŠU=ðsÆ„E+öq<û_?¦cŸ±vƒídâÏu9 +M•Ç~mδb»íyP ë™§öŠ]«ÞÀîÓý•• |¸JþÑîÂüÖài6˜ ¹?f Õ•ªë¿L¾ûv˜xó›„.:-©kr‘–µ809ƒÂ:n¶žšÒÙµÑAý;?ºl«Ñ³hE¿ßÀ¿â9ÎA #ò6šÔƒ~0¢f›Ð>jãÿ“Ä3i9Y¶Ç$½ž’–Z™–¹É^ÕewHD™m|"½ëYºMàug±Þ…Љo›9r;ø×˜ËÙSW¡ŸV«£µzgÑž³wÇxÈ®Ñée)Ì/BŒNweô»Y‘Q-kjpïo»ôÛÒÑ7EÚêdÌ7E a*wð„ÍDs§„å¢ðÒ½Œ÷ãu†ú|´}Ñ<´ké|´®Uóæþ툈ÌÛ*~SœzÞÉÂó7‘¼¦põç™ýú\Mô »q”¹åhè%+ŠïÔ%tkÒ¹›©ÄnuÉf†®î¾(.j>O¤ýv€|³Nðà«.Y0t˜jè»ÄëbiV²j*7J§ï<’,¿ãhÆÈ=G3F©È£yåñ §g3´3¾®£†¡Ç¡&0†èûzÕà«bѽÑ(ùËÞ#VÃøæ}Æ—£¦íÙ£Š6(ÍC›çÏGBm-tðô¹ñÖv³Ù^›çÄŒ|Ñ Þµ“TVÚ +žüÂ<øEWpçW ¡÷£åB[¯éD@Úrò~«Ñ|Õkn|ÿ ×ëå¤uò¡¹Ýhù¥QÂcçGqç^2ºy¦Ï*ΙäÕ_&^ Òü°’|ï§ËxICʆ±ýusfï—8ÈmT•¡åØ7Ï[£‚«™¡­G¨ùÕ*hf±ë´Þ²û´òðõÛýÄÞåš.wgh]oè”:ÛØÿæ"cïÄFÁ÷–ò’ê¶ònöîøæ®"lç—"f0Vqs(»[ (›ÛŠÔi¯IÚê:HcÏ>Ä×ÅþŠo„$R39¡ÌLŽrŽš/ˆ(Ø$ˆÌß,ˆÉßJF<Ù"Œy»HëS§µ3äËWWy#zí¿€¼9¨%}^sܤ¬Òɼ⭷Ii±ƒ4¯æ¢àÖœ« ®Ïä]º>A×%}–æÜ¹ûÌÝå×î&ЬIJhÆXÌ0]¹‘‡Ô +¦j4³t{YšüòÑ™øÕÿ–¥o³jFöQ3âgyÉm’0ðùjÒ5a¶#©Ón¡§ ªÒܶªh }‚;+ÄõŽsÎXbj4GÄ mü¾1¶”K´"Y¶ðÍYIyf­ ¯?X!NnÑ5O¯–2áe»˜«~³à å}w™Ô¹ŸŠ®ÝC<_/Lû¨.Íì $½5Þ²ær/ã;W:'ÌD—m!žÑ&ÍŦƒïB˜ïž‚¬ÿWöög§u:YB'›Ý¡s%sª*ï Ò’aݸ–n걕w^¦ž}c„§PÑAF|3ÄÑðx±’ðz¶RW E;–­AûVoA†ûÕ©Ä\þÐ%ûéìg<ç0Ufã;‡Œ+Ü u¾¢§ ¦DNŸÈü¬ÅÏèÞ'¼–´€ðÊ\BÝíäA]­ðö7M~DûaÔÇíäí¿ëóÃ+7‘Öq +Äé«ã(›àY‚ÄÆÝÔíA}"sP“W¹øv/©GÙ(‡Õ4zÀ0Ìü±Sÿöß•õo±[5óÙ]Z¬¡î/¬Dkˆ5Ðm`õõß³z†¯Y=ãb–áå²zú~Ï• Î8Œ64?+o|ðŒ¼®ŽÚ¹z!Ú¿};Òå"òÐåÑôy‡‰ÐCtD@_„ðÂH°´mâ|?[Ò#e×Ä#i¹ÔÎK>ã<‘¶ Ÿ%L¨ÛMÄ·î¥ÜS•(‡¨¹”cØ\!¶…ÒÜŠ“K_¹“¯º$Âk÷ lü§“n–Jžµ’VU8C¤ìý{êþ€@в“r¿½˜º4]èýr¥QË'†¾Ø.ÒyÎîÑ´}6MãlÆx­ËÙS4/dLÔyÄnãd¯@-¿Š57tLŸ­­g‚4T ð˜4úN´çn$Þwä1û±p– zéI/{Ì€^ìDЫ df·Žøa­Xô¨NÄdµP¢»M*£_‡z¼ŽrŒžÏXÍbìæSW£±½žK\O^ûk@Èï4Öž!æóo}S¤TÜü²ŸzÜK1EmçDym'·¾ï^ðœL]t›L8¦(òc¶S¯zeÒ–êkǺÇ0]õNF¹,Ïð«aÖ¿ÖÀ>Ga¿á1¤K“3¼7Õ8›Õø<_n(9'Ç7·%4½2Òˆ<.§¶K ï¿ Hãò’çTaz—ìCÆdôÌ€¾ÅôÁ³#e—¼gJ|_l%Uj“‰eªÂ¤ê}tJ«6ô€Ý«– +2{ÔÉkJ”}øÚ5y!œõ‚óñÌ”%ПǼð•í鯛ÑçšÒâç9‹Óú iï—k©¯V©ƒjÔÓN‘ ±mðÎg-"«Ç€ôÉZAÚÌ$"çðmãfyÜ_È |¿‚g™6CGvEN“8=BOb#Ï#/Éé!¼6ÿsÀd5C´xÌ 4 ó¦ ÓBê» õ]{ëCÌšŽ ¤'ä9]œs×§ŠŸEⱂþ‹ì´ûdè»%=ï4YtÎv"œfÒkô¥9•æ’û­2"ðíz¡MÜl"äÝ&~ú€*évo1huINÊx­ŠsÚJ²Z¥dê' xŽDPÞÊ9iiå?ƒ¾ž¹zŒy9¿hg}Õ0~ðý€qæ—}¯{‹ù®w®FÏžqŸó¢úcFbgóñZŸMzä,'.zM†uO¸ß_ çJG­Gëa¦Ë“"¡ø²<嘤HF5좣[T¡o6ô3âú e5“ÂÛšp¶‹Š®ÜM¤6©é-êp^œÄ6…rŒS¤¯øÏ ¯øN#­Cf +C±ŸÏTÄÕì0¾5 *|4`D¼é–Q/»¥äë>S&¯ã‘3 àßû¡I>óoÿºŸ8å6Á€1adzNÎo‘Ÿu¤Ïë›T¼s’•”ÙQ¹}R£ìh +ž°†<ŸwKµGÐZ…¥hͤ…ø«"ÒÔ§ÿ˜õhÁqëÑÆæçF‡¯ŒÈ.ŽTݯöaû¹Oy§ÇF\ðšLu˜À7³_!:sy¼äÒµéœfÔ1«qŒù™‘¢S—ÇA¯ÑÍF#ÉýF •ÕeL¸G)’–>ÓÉõ»¨Ôn-èkH]ñž&²õW ’ëÕ¥ÏÞ[˜=w:Vý0ÈôUÙ*u@ Π1Î÷S!µÛ)ŸG«èk‰Jdàë”ïýU'¬âßü¢Ê+Þ`l:ï”6ÏÈ;w‰àBä4u ̶îF{”Õ‘Ú.mdÀ?4ÎYòOºÛº|Z2~&Z:iZ;UíÅøð•‰cü"±ÿƒ p&Ozãñ:&²j¯‰{æ*‘陑|¡Ѳ#¹^„ …qÁmªØ9h>úx •ðnŸ0¡r7ÆÒë`þQU[YŸu˜û½¤ µu/è(Pç=§€îø|=S¿›ˆ«ßM§ôis{Ý÷þJêzÊ""¼l}·Í˜zØ&„¹¥ÞtšÑùm‡É§Ýö‰»—Œ‚“.ãxä 9-M +iªòúÜsKž÷ŸJÚ&σ¾Q¤…ýu ÛŽÓräÏAÓðZø‰rÁ—oþz8·BÝÔ£=²V'íÇç]'RŽ‰ØŸßÇx0l6e2l#}³×q廩„–ýÔíN=úΙѣÁõÛ¾×mH=ìÀ9 aBóað«uüÌU8\j¾©—2AÊÐ^~ð»uü¤¯»áþIK·)Â3¶ã(¯+„éƒjDêÐ~è›Ixß_Nx<\& y¿‘ŸÔ³ËèöwÁåÈéZ†fhËŠhÝÌÅhûÒ h÷ÆÍèÀHGßÐÆ¾ ãc]céRH[“‡´u‘ùy¡eÐtè=öÎhC¯EèõG“ærÛâ°§þV™Il>@&µ¨AÏnâ¬ãÊ+c)}«ÙPz·R k—öH_Â8D΃žX¢ÛuBqN½T”Ý*¡îöòˆôDÆ-8FFÕì„g(r +˜Kz¥.ļßJÝë3=o?$¸û›ßçõJ¡OÙZ£Ä¾íƉý»î·²e$:'§+<4Âèà•‘ÄYÿÉüãWGïÜ´møi9Ú½m?ÒRÑÇvS€@#zÃK®ßZ){¯)Ž(ߺkЇúò…2dÌ£§‡é4ÎúCß‘gÊr8GŠýÀO”]ˆå»@×¼›¼3¤Gd~Ô$^¬£­£(|A¿xú²÷tîLž]ä<ßnâú +ze¯"B_m$ƒž¯§Ü3‘÷– +R;÷Y½†TV‘òE¸þ` ôËàËÎËó¨£r|S«‘Ä Æ Û Âöù¬Ëè©'0µ}ö ÿ#yÔi,m?ŸöÈ^I„×)Ãú‚ž¿WüD÷žBžó˜LžrOœ¼:zGÒ®w—cwrgž¬Ɨ•Øÿ™Hsª‰²¥²ÜÊ3¢·õGɬ^caDÉû~¡ß“Up6ίQo;Ìù™_Õvq +‚ AS…ÎÉŠ‚ôoª‚›ÿ{oÞVuí ;0˜RfÄH+g&ÇqbcY³#Ûr¢D–Œ,ÇqHÈ@È ¦2!ÌÐR +i/o[zi)C[Jéíí½·íÿøÞçù¾?î·Ö:ƒŽ,ÙÖNd9G-±ÎÒÙûìµöÞkØ{Ÿõûû ôw`lÎð¼ø?30XÓ¢ô8\Ó¨´¥<-»?â|.ûÖºøÎ»úNžqÓ¼ª›nT«fN¿ÆecÕ¯Êiۃزë¾3}]+Ç7.JŸŒ””㥽wœ¯o×ÄàCï݈9}0¯ëÂÞÇ.ˆ,ê;­eÑŠÓÃÁö±Í‹úN_xß¡«{>šŽ¹ž07†oõÓßômyñ*ï¡ßßâ?ðÙmÿx¾çÜöòdÌ'è;ôEMø•Ï<þ7þÐèyñ¯5¯þ÷ ß»ó‡?ø"þá^ù—zÏ‹¿¿-ðÀ‘«kw]èÝñÖõM¯ýÇ\zwùÝ4½ùÿAÜñçé}ì\oï®ó¼ÿ~KÓá¿Ýê{âBÓÖ·&ùÖì½È³ùÛW5-úüššU²[¨š}s]âx"Ö—ÇÁöxÆÆRÎ/PŽN¢÷TÌ™Jãôfà±7«ýGþiŽ÷ÐG7‡z7œìZyFhÃÓ—ùv}ojàÑ÷ܾÇáyGÿs–ç…¿Ü\·ûÿ=;&7¾~ bmøVîœXùä7ÑNÖ>}åÔ¹âÁåà‹ßÿü5O_D¹$Wìú†/µòt_êþ3(ßÎÖïN¦¿Ë=×»hÕ©˜kËà{ø˜£Ê³xå)øž4æÛ nýΔжï»}]÷Ÿy§·}ÌOKŽgorýÁ5û.Áùâyé?k=¯ý}Ž÷…á=òﳚ|ysðׯÅÜÀøOµ˜c sùžÖrX{þóœà‘¯æÞücSàݯšýßýcÐóÂßkü|÷Ì;‡v£ééÿÃ{ßøÛ|ïkÿ5·é‰9ïêƒáºZSß“çû¶Î<øåÍèCxŸùTÅ÷Ç1Ÿ?æŽôD`®µvžä½çÑóqm éПnö=þsÞ»èþÓ8hvUݼPU0³õœà‡¯ÂÜ”Áû_²¼ ¸|×D”±'qïiž–ž“Û’'!f‡ï™§!Væ +o;z}pÇ÷9Ì­ƒù>)ÇõºCW`îQÊ¥ ¶Â³çÞsè‹›`>Nó?ù.ØýŠoïGÓCÏ}zGóÑÏ=Áÿšãî7³ü/þÛí¾×ÿ² øÞ?µ„>ùtåÂ?~øÐÂ϶߿þôG}Áïü>Œ:׿úÉ aî +þWþZ‡ïâú^ýçyV½hÖ_Õ-ò­UMé?ð—#™‹ùżë^Ü´åíkš–=uú¢³g fkKæ·¡¼‘›^¼–ðc÷žº{Û9„õpÏã`NyÄUB<<´u ¿ó‹E¡×>ó`^ë" o:s¢û^þÛžþZƒ¹Í¼OÿVÆþÅ\tˆYàO@\y÷æ³üëö_â_vâ‹è +ÿªÇ/®xd¢Õx×A|´ì‘sýË=Ïß³ãÜPrý™¾»7Nð F\\Ä !ÐHrl oçD|¿Õ{øï5Þú óx×ᅵ°Š†8g÷/dÄC|<ÄåEl&Ì1X¶álÌáâõŸêBï|‰¼õ»æà«Ÿ{0FÀœÑ¸vB9„zer`ó~æzò=þ>‡¹gÄq’寧ë}é?æxþq:ÎÌaDü™ôÚ3ƒëŸ¹ ýïóÿ:3°ñµ«w÷Nˆe0&C  À–®Â1Š94¼ÉÕ§/hlF0s¾7-é=¥iéšÓ|÷½t9ÌíÛ‚¼uÝ‚†¶ªY·Ì©ª»3Tåm[6.tÿ³—cqÌäO®;1°0?¡¿kóODzqsæ«æâc@—aî!ÌéꋦOÆ\2ÊŸýÂÕ”Kÿ>pôÚЖÓBÛÞ¸r¥l}ã:ï?b S乞yåsoÛ·þ!ÞñÎ3Ñ·~ þý\ÊG}üöü‘~×Õü§| ú§ŸîÀwå0WIäõOø^>â14=þ}wÄ MÏþRöú·››¶ýàºÆ%O«­i¨ºé¥j.ĘӉìæÝάC<âæÔ؆ÖÌÉóêÛ@o¶UÚúNÁÜSí»rGËžŸÎ¤ÜiKï?sE!n æÐôí˜è[²ìT´ÛÍßúõÂÖoÿripç» æ¥ÃœJÞÝïóþ7ÿ½ÑÿÖÿxžÿŸiþo^9ìýÛÀ§|ìûL`ÙŽóïŒÄÆ ¯ØôêÕhg1®ö´&OÆÜþÞî&`Ž@oÏÃçx’k@g®?#Ð º®wëy!Ì7¹b÷…M‹zÇÍŸ6°)X…y’ c ÆâXáÚ£s Ò0N÷\Š8ÁÞõg‡îÙr>æeD¾sq‡¶¼ræ«V£åÈzþ*Ìu‡¸E”3jÙö‰˜Çs}4úÝ-ˆ/@X°ˆ§ºëÇ<ú]Á·þHýàKßwfÓ]ñ“¼w%4ÜF̱ ¶²éÙ•@ïSëÃcï €nôÇÆ:VœŠ6$°z÷E¾e[Înhé$ iO{'É1Ïî¼kÉXʳ±þàeh#ÐGYЪòµÞ=ñ‹ N¹ ´vçEˆ‰…öqX}«NÇu²†ÐÒ±à#Œij_yŠ¿gû¹þE+Oõ—Rž¢ æÊ_ýØ7ƒ[ž¿âö[1obà¹Ïo÷øõmÁÇÞa)çÝ#ߪFÌNÄüYSë~Òûá÷ûZ^ýx!å†Üõ>s´i÷O´å¡|ÙúùSøžÆð˜ÇÕWtÙ’“ü½}Ü©?½ýl\«ò­|úŒêšÚÆÜvS]•zR5ëÖùUíËÇyš»Nš ±kíí àKƒŽþvCSt æäÆüÓ˜¿sÿûÚ2ã<¾Ec}­ÝãB}Oô?ôÚu¨1o“ï‰ÅæW?5¿ü¥?´ý[7Rî Ï\á{ùŸç…ÞýªÅ÷½ÿ'xçÿ;Û÷À·'‘ÝA|²•»/ô.ÎŒ«kh¬BÜY|¯1à­a¬ÛwYdók“)Ÿ®sîúÎÔСgG^ø¬!¼ÿÓÙÇ¿ÇḠÁ¸gŽöÜÿôO•Àþ¬Áx0|ä«ÞC_ܼwÈ鱉ˆ)Ó´÷÷ª÷Åÿž9'<û¾T}½2´æ™K°msgΆù¨ò/Ýx†wɺÓï 'Çz;úNñ&P½ãæÖ!æ©­’¯«Ôj©jV æålÓMœäëÝyžÿÁW¯ñ/Û~.æ‰Ç\ª„#Ü»å¼È½;»ï\Ä3¯_®Â¼O„φù©@¿ây´y˜[(xà“ZÌÅLº)}ï™Mû~5òÿüð¯Qÿ»ÿö>ó§iˆ9æïzè,˜cçAì5ÿN_ŽAßá?Ö6íú±õäœ9MU·ß^_…xWÔ½ODÜ)ÂqBLæ…ѱ˜ïøNo¤Êj‹¹¼)GtjÕ™Á®å§{£=ã(§<èÃà3ÜÔ¼÷ý¡G¿;ǵ¿#3óƒžú¹Ø÷á­˜÷+¸úá È×zúÅwà—7!Cóº—D6ì¿qšzóFÌuèÛóyñÓFß‘¿Ìñwo>«©5q2áœozöªð#Go@ÜÁÀ‘¿Þá?ú×ydëÿ¡†r1mzùš@|ÓøÀÒ5ã½0ÿ¡?0¯tpû{Õ¾g~ShçG2æŠC5ì3\KÃÜDþ<‡0OAßîÝ{q`ÍKÈ_øîà³¼-tàOsšü¡®ùÀoëüû} b!†û¶O Þð +Ìeˆyôð<æ7ö¯;|ù[¿s}à‰¥Ð¾?Ï úÓ͇>­¿ëðoÃÏ}2ó'Â\v‡×ï¹¼y펋Ã;ßæ>œÚûQ-ŒM™|2ðmü›ž¿lÝʧ—ÜrbbúöýþæÀ‘¿Ï ýë|\·ÀuRÌíßtð +²ûiÐÓ¼< ×gük^º¼)ùÀ¾eçíÚ6Á»xÅ)õ蘚›gVÝ4ýÖ*ÜZà]4±Ü1˜ÿ·a_’ĵ *_¬sbTDvþH& ´žmç6-Ìs”EäðÇu'¦„Ö>y1æ‘f6œEë÷? ~׺³Â©ãáû唯ï¿Õû¿ýW_ãËÿ]ë_ùèDÌÉX^¶MÃ9ô÷l;ó¤xó:Ô ˆˆyéƒÉq-«Ÿ¸táÚ}®…kŸ¼ c0_+êñ–1óêæW5ïƒùÑnb¾-ÌÅù†}±»ÇQþÉŽN +?õ“éÁÝÞ„¸¬˜s”0à1÷+øƒÁ-®Æ\šž½ï‹Á7¾ðFŽ|ÖÂ\Ü —žD˜6Ð/wýÇ@øðoî½:Íø·3ƒ¯|Þxä;7ø–Ý?sø2÷Ÿ…XÇø7Zsúæ¸ö¼ÿ9æ|F{‚yÆü^º2pÏ¡‹›:î91öÀfœƒyù|ÿ­&ðäg*Œ!Æ~¡•û.¡Üu‡[Û´ÿ7Ó0æEÌ,\£u¸G®Ä1ß¼÷óÙ˜ë-pðËg~} b„¯: qýkÆ¿ÿW·6þüfÌŠk"¤QΛ_¾Ú¿÷Ë[š÷ÿn®ÿàŸgBùZÌû°ðžíß ¶uÃykN‘Gßfý?®‰ù¤¡åȧþð¾ßÌòíù¥Š˜­ÁoUc®»à†W®&Ü«Íßš>ü—y¡£nð?÷_³¼ÿtKpÓ“hýxóÑ«)¿ÝK_Õ/|ûױȷ¾hñ=úS7íc¤wœãízàLŒuï„q×냋Ç`Ä`Ïã燠~Ê#‰˜10î‹ÆÖÝî¡|Lj­‚ù ›·½Í,ÜøüµÁž‡Î wm='¼j÷E½ŸÝ9ðÉí?"+ý&åBFûŠù®»ï; 1΂:v–÷)ðË^ÿSCäß¶SNµûö_f`g¡å‹tƒ>ì<)Ø…9E÷|ùm^½ïòæå;¿‰9P®~ê2Ì‹¶–07ÀÞb^|ÂÂ[±éÜÐc?“#Ï~6»å™Oîïþè6Âò¾{ÓY W>qqóַ݈ñÕ’AŒå§6´«¹OËÅxôè”àkŸ7„ßÿ8¾ðG¦0÷Üš;ªÔù´\܇>šÝü¯ï ?ÿÙ|ïÁŸO§\ÜSøÃ­Cs˜sã‘H÷º³¼­à[ÿKØ‹gøÀÞ`núæ ‡®A[ùý¾u­¯s뙞¶Þq÷ ~IxýKW†×½|%a\n~ù:ô0gù¼u=ÊÇ–'˜‹¸|8þ#Ï~:káÞ/æF¶|çFô›‚±1wú¢cüh7ó +±À.ûw¾MqO(óÈy˜ãä} +âFö‚¼žýb^dË{nÌ£Ž{HhǼ¡øØ@ôîq‘ÌýgSÎ'¿'6ïûlnË`Î]ÌóŒxGÞàϞøP \„{÷]‚¹ƒ}{¿ºÙ·óg¬Ó·¯õ?ücˆ©ÞœØúÖïó¿¿­ù½:Ú~øÃeÍßûhqã+ÿQëÛñC·ÿ‘¦îÙK:1çpŸ.pß¾Ëp]ñ0ÿbw}5qOæÎº£jÎ,ЫAðCïcàÍ5w­?Ëß‘‡v‘p³îÞv.b¥àú;aÄWŽó.’Ywvh;ØA̱Šy¹ ; ô×ÁOæ„~Öˆ9øGþ|GÓðc;kñýã=mËNFlÙ¦`⤦ÀÒ±˜»9µá¬æøº3ã„rʶöž¤œ¶ëΤœÊ¹&„ù¹¢wÓ9ˆÃ83 ÷>1VÛ¸kÓY„[xÿ ×´,Ûö»’kÎBL•ðƒ‡®1rq‡·¼p­÷èWs¾û‹Ew}øþêà·¿ò㘹cfC•†Óôô…ˆ D¹¸·¾váa£xîË9¡—¾hhyþwžàÁ?Ï +€&ì,°Ù„3´j÷ňÕÔÜNØY vVÓKÿY‹ñ!îo-¨ó’¯¤agm$¬Â¶É¬™€Ø„ Oyi_ŽùŸqìØY‘g~73´ÿË™4ŽaŽ7:Ç6ÁØB¬y,A¬†{þúÓáõ®À6­9=[u*âË7ïùlfèÀW³÷À·Ë'Æzíc¿1÷¼x-êʃ¸ý¥‚»¾'„÷}2 óê}5s<ú÷~q+Ø<Ê;ïÝ™“wþ3ïüá¿Ìn~û˶¶~¼6òÂoëÛ_›B놈ó°á…+|ËvžGëŠÛß¾Ñÿäû"®…7ÆzNÆ\Ç!ðËÑ®7úm=ö9ž·BŸ“ðŠ1#c=‘vòõ(7÷â»OA\$«A<èöÌ)áN7Ëžˆ¹ÏÃ/|9Ÿ°³6‚l 쬇; ü»®u"÷=u)æŒm^ vOÇÎ +$6žÑ~ðü™MU¾`ûØ@3<«¥õ¤`[ç8̵Xcs Ž×mç>Ø1ZÉl:Û_r2â3aNoÊ{ýäDÊÅ8[`§ñ¿–Ôæs¯®eÕŽ‹#ÚõS%ˆ¹¸·½ñ¯"/|Z>2îeùWÏ”ÜpF(®åâ&ü¡=O£<³ˆùŒy®±Ý¿Q9kñ<á÷vÞsº¶¼‚0>.]{&bGER«Îа³»,ðâoçáú`°±³V5Ô#žI煮Ӆûnˆ†v(Ò¹|¼Žu!bgQ¾R;+¶ê´…÷î¿<¼ã‡ÂÂõ/]{Fyø—Ü7žp»V0Wnˆ8–Íë¿ sé7¯]ýŽßï?’°<ØÃ³µòë´ò÷¼ sVãø¤`¬.ß|n󃇯mÙ÷ÑÑg?Y@qÓ¡O̼ó>#ïüËhÌÏ;ÿ»˜w~á»xöâ«0Ú4ÄÐŒÜûì¥áu‡¯hZ´ü\“hZrÏ©Áž‡ÏC¸Y ¼­cê}wiBµû_¾:´óW +ú¹¡•.Fû‡Ø~¾ö{NñøïÓØ®‚qr2á°vo8›°Ø{7žYûôeͽ;4¼6œó¾u½ÿÐ3—×=à÷ ¶ âœ×Ïkªª›u;agy‚‘1M~;ëJ\#B›X¿`aÕ‚Y`_:Æ¢}jŽ­8­yÑÊÓ›ã}§‡c=§†:Vœ†:±¸ ŸzÍ®‹#ëž¾ õg µât´÷„w² >õc1~(?}ÏÖóÐo€¯zàúÈãïÉáG^¯?ôÚõ„Ù¶qÏþç?™gop­sq—=|žêD|³àÞOjÐ'Å5Àp|íøHbÍxn„°±6º×[ûwÍ¡Ëü=žímKLXN`3ÉFØYû?™:ôéí¸–b`g¡½ ÷ŽçÐÊm¯ ±³/c³,vÖz ;k!Äûw%NFû²pÙÃßµ/;ç.æðto?} Ô¹Í럾œðÌîyü¢…÷>zèÀ Ñv„ÚVœJØ[P¾¥÷‘ °<æ[·–Ç8>²qÿU˜s›0ûÐ×xü'jó¾ŸÔ¶l~ùúðªí`ÞgÄ{&,Ø^¿Öÿüßf‡Žü[=æ‘EìXÄÆ£ò`;q À¿ûûBøÁç¯Õp×Ó'#V"âàz îyÍ÷†ªêC±±ó=᪆`ÇŒq={'R…˜ØAÐ?eÑ— ¥6O¸³!Z5¿Î_U· ±Ê¿pÑIÍ+º`á†g¯DtŒË ÛíÎæ×&ãÚaÁn~uæ°Ç3³z_ù·¹ÁÇ~Ì#ÞúT˜››ð Ü{•ÿÀÇ5h[#a3øëž½4¸xD\ŽC¿ë£ W?~ióÒµgÜշ뢖U×o=2¹ùȯ›¾üY8üÂ|˜;yÏodÂÎ"üö—¯õîùÂÎ +ìþÇi„µz7bg4çb$56¸öùË0W7aS?ø"ag5#~2bg­×°³š­ØY);kÙ©þ–øIÞÄ–ðÛÑçEìøµÏ^†ù½}ÄkîÝ ós×%ˆ­@å!î-‚òw-9Éëkƒ¸Tè3î–ßöö ôbj€_¢å9~ášÈ2ܹö Â'‹÷œŠ˜ßáUO_ä{âøÀKÿ2¯iÿÓÿÐ{×¢“ð|¹þÃXâ„ΞÓ|Ѷ“êæ†«}“Çî=ïYÐà­ò,lºgûD\GDûƒñÖ‹kˆ;ímÿçÞ§. +nÿÖõˆWØÜóf7UÍ›ÛT…þv Þ úxçE‘­/NF,_ò+Án‡PŸ<:b™PßÂüÃóVÞçþPzþË:ÂÎÂ鉾Ó=&vÖr;«çô…„õª;¼ã{B$³ùOSt ¶ñ¶q¯´yåcF~ùÆ– ®iɬ'|kŠÇW>q!åcßóói„Wvqi(—=â6ù® C÷< +¾×K×  ìùÅM¡ýÏòïýÅ-¾ÝïKˆOkax>‡b™ý.ä+øØ÷9Ì%ç#[¾}#â’FžÿlAèñï‹-½Ï´%N^¸dåxˆ×. >ýáMèƒ!–Õð%5ì,?ag}vK蹞>úåxãÂÂèZw¦¯cõ©‹–óÆ×Ÿf`gáúb¾Ò&E¶¿V¹ïÑKȾ߷Ç|ô•Âý@hÞòæˆ]îZ}&žÃ9Žë&Íëö¹O¼Ãiø?7fÓ3.¼mGñ¸¶¿Í4?øÆõ‘5^„º8Œå[ã'#þâÜwOìûü6\_£=wÄ\·tïãF2;&†sâ>º_xß^WhËÁ«qÿ±Ëë¿ó¢L›ºKWžî ÄÆ6µ´EÛIþ/æô_±}â¼Ùª;[ÇÚî9¥¹sóYß6¯|ôBÄŸOyq¯bñ½§¡Î¦7Ÿ…¶ÐÛœ:©ÁÓ:¦Ïü€íA_ +íXóê½—“»F8»¸æ qžOÃõR ¿äÈÕþGßÅÜú2Æ\þ]ï2ˆCм≠lÍžËÐî´lÚCú!²íÛSë"®oj˜ÂÛÏÓp¨À†¢Ÿºó=±ßÐ LÄà_õúšxî±€q|á;ˆŒòFŒ:ôC¿Í„žø@E_÷U;qQç'°ó©46[fÙ¢kCÏüê6ŸÁCÿr;î×E}6/zä7¡ èOÄ¥«Ÿø‰c zÃþ+BÝ›ÏÆ=}ìêÞñ¸/åì¬ïé%ÄÎj~é÷þ¦ç¾º ±³¼:ßùn|ñªàšƒ—b.k?­9ÿp +ag!V®g=ãsó!à øEì¬û5ì¬Ðß»¢  õV°ùÍkv_F¾&è}ÄlAØÿÔ÷„Ðà{ó+C^IXóLŠìzO >õ¾B¸¶¸ç’ÙtîÂ5 †ß–£“ƒû>ª øÍ,ßnö= u=üö ˆg‡8ˆ÷ÙúŽ»yÅÓù;:Ç…~õ\Óˆ¼ò©ý"ZÛ8ü‡Û¼ÏüƒDøNcQ¬±õÛ7†öüâ–ГLC?©¾1Zå[¸ìä`tù)¸æ¹û¾³5²´o|sïÖ‰ÁýÿXÛrð× „%sÏŽ ÐðA˜ÇW ì¬ û®Dl£ Ω§Hë‘ûŸ¿Z«÷àå8(Dêm/^ÜñVu`÷ecjp×Èg¡5«mG§`„ · Æ=<}Òmˆ;s4°bùƒŸÜ~íŸïµ?Ïóîûhž±Ã=÷ÈCï¸éÜdßÚ³C¯}ꉾóó%ßy¯«íõŸu,|áã;ý‡=â¡l3ê¢Èê½—A_ ûM³nÁEkN ozíZŠ™wÿxZxÅcx.럚0¬ï;ìBÜ­ŒãMøØ¦¦ð =UžÆ…Uþާ¢Œ|ùŸú?"®K@°ýÕÉðÏ!náÑŸh ‚~?Ô¿hÕ©Øn<{xáËÛЇëÖÏþú¦Àãïó8Ð~¶¾:°ÿ÷3ð¬gäÕßù;"®^õèè³b½¤c /ñì%â=á¹²{¸v…qÿޟנN¥½éhì$Œ{ÑÆbýþXjžÉÀµpÄ) +ÜÕ=ÎÓØ¢a"®|òBÄTAžpoÌß±ääùwÌŸ6\ê†q{ÌË9_Ã3ÿ®;üÐ+Sp ÷ Ñg §×ŸE˜X`£ÑG¶5o:z]x×%\Ÿ o‚ñí‹l~kJ°ï±oà™ˆ@çêñá>ı„úQÝûÌÅh'ÈeŸº÷ \¿ =ö1?±¶nåSbœMûÈ«¡ƒ ñòv¼QþáV#fûÆç®†…ð9pïu9añìýpbaŠ÷0V…q‹>b@øöýáß³ŸLG~| ÄUB[ûțվƒ_ÔD^üă81¸WOX_˶œGgOp­ÏmyurpøµˆoŒ×¨Ÿwùà'77íý¥â{üÇíé,Ûc昆o¼çÚÄõ<;¼ê‰‹4yÏåxŽÀ»÷gä;…6¹ÆÛÖ7®©¹û$Œ%· +}Ä„ ¬|ìÌãß ÿÂóV[^œ¹ïñKh¯ìñï°}Þ|ü}÷éým÷žR\2Æ»lÙ†ç\Þ=?“±~Ú¯¹ÆÃÚ½—à n<ìò=úêdï¾_Lóîþ@ò>õSßE $VŽø˜Î¾ÓÃ<7‰ðáð É}/^Z6´ó¾3"}O~± +È¥ þhpÛs C_»Ç$Ä\gâÞêÄ› +w­8#нù¬pï¶óCëŽÚ{)­óAÌDñ”C!¾tý¼Æª;=Þ*ô£16ÁxåŽ~î·aÌ“+N§±Ó ³ðú}—ãYžPrÕøÚó]ïŠè¯ žƃxf+²ñðÕxvç¶÷‹ÃËŸºcgÔßèGnzÏÖóèÌbÁ/d"ر‰dçïtJpÅ® Ó™ð„ñ¼âê=„ÙAßqnqöž-çVéàﲄóŠk&à‡â>úަûtá\!V,®³Ã ÷‚ìÖÃ8ƒøý"ƒñþ]?`±Ñ'ôïùzê> O ñC×yp|ùæsi¯|"Äg ?÷Ûùø9øÛx–vÈíÁ—®E,:Â+Ã}º•['bœ„Øu8·I¨ùö txë+×àyWÄMD BÎÇù8çã|œóq>ÎÇù8çã|œóq>ÎÇù8çã|œóq>ÎÇù8çã|œóq>ÎÇù8çã|œÏ1þLš4+Ù>3š‰N¸}ÂøI5sÅ 4F»3±ô„ñ €Ô2µ&™oËÄSÉhºÏ5hùuÞ¹3]Ó\“ë¢}±t Ó¶LqMwM®™Ë2-P~âºïeÜœàšÚ‹&\“µŠ]ð»«>_OÑÓMÄô{§ã?ÆWËŠ*ºYQ\²ÊqnNäXW'ÒUFvó2'Zè ¢kWH×îÐé–z¢[êYÕüŽ¢FA/HµÇè{n/ òôÃòÎD~¬†¦ã­=™X7‰:3íOÛâx¢=KÒœkêÜd&û#þ“éëÒzhrªuI¬-3#Õ“l>f¤–OqMõ&ãmp“”\”[pY4Ñ£—ì žàÞL÷àe’ÑN­´0§Ðeâ™e˜IE³ÙoÏ,.žAýör±fƒ±¾â™ê«¾Z‹/Zœ)ž/ãþ +è­!楕«ååc¨fnKM¢kq´…-š±x;Ü:KxÓÅ5|¤)X®hI${:ëÛ2Ñe1úÔZ¦\žéI·Íd:ÖÝ“°1EûË6EÝŒX4s­ÑîØìtìîžX²Í†zíW¬\¬&SžL<Ó6„±³°ÛM·7ÅvFlN¡rÙžˆ;V4³Záb¹4õux`ã¡°Ò´úg±¦"¹´4|ðùê%žBßæX¼¹\CГêI·Å椣]‹ãm6ø³Ã^ù¸ª–R]±t4“JÏX¶D™'Xmª³+ÕÏØš_Ǩ1XÝŽ©3c®éNpê§#3Üq‚S'8=fÁ©à§:ÅK NGdpZü:‹›VHlÚ‘ŽÂ¤I,HÅ»è4åD§NtêD§%M0':=ÆÞ¿0j#µjnôÅjvz«Òb5[ýU1ÑڌزX³8Úžêu6û™fŠdGa.>íδό-‹G±Yv|k©rqÙšèÂOLZNçcN´§»;MÎ’בíß?"ÛmèÕö2*VÙ°ìíe4í¶æS¥¨ÂTGGw,3ôô©|UQOœV²’H ÷‡DÛR‰TzZïâ!ƒ®KÖ—°±v£ß^®aYüa˜îžtG´-¦Ÿ.š½œRŽFF¦º»bmõ=CL´ +^ />D@Iô$¢éÚT²;MÚà1¿dÙ¸el³;kyW*+…ÝlÉ + š @†OÑ[Q¼ˆV”1êgm1Uë4Õ¢žl¯e”ÓÑiHÅ“™:[+K7»Öxô¹]§;/•쀕¶&R)›1v w¥8$Ço¦"º­B÷’¶™Fš)Þâ,ÂÍ´öÞ[®Ñgƒ£!V„r8*Á¿_jC³/-£b·Áoƒ#¾rt^åáÑ}""šŽgwÆ26X«D“œˆg¢ñ¡"`Ç&—Ò##ͤ—°€^Âl-g/Ï¥ÅP®•ìyÙž’'B'ÓÆŒ€†ŒÆã`'äËJìè=gç¼Xe,­Žî#pbñ¼UÌ ¸ÚT*1#‹­(~;y´cÝÅgÔHGÛã=6tªqycÌÑy´¯=žˆÚ8Q‰ÑeñVi[ë6†c»áX¼:fq*ݵ8•H-*Þ‚Àj4ëDGV &½¯ÜÚxÙÏÑ„åˆÚFßéæQ§[‹ß÷ª8õ`ó=¥ÊÑ•JÛNßTÈL*þ4v¥æïhµáÙV˜®`lxíNöŽbÞŒ8Á²wŒô Yant$$â u’Ù|3§Ì¯äØws¨hº$­ÅÀJ3Ø6X+Aõ•…¥Æâ÷ÌjG“ÉXÂKÄÚl-Gå—,·5Åoè–Ìm~É2›µ™ñî®D´-ÖKfæG»*Ù¶1.㮼¯lÎ×¢;š¾Úp2û+AUŠÅ(~Í®Ò,Fgª+þ PEÅ6³¨VNP‹/ñÏ/¢çF¶²´ÓA¢)l¼á]ÉéŠ_Õ«4}hƒµc¤4FÚ,í°wº«#žHØ:#š(_g?- šmX@|Ëi¿båb9#W»xnÛÛã™ø2;Œš%ÊÅc2•´Á`[[OgÏÐçrX´”)“ÑDo´oˆ° Wg¢i{ŠX+P.Åâ™k·‘ÁM»¹lLïi§løÙ©òq”ˆ'cÑâ_`j‹&Úæ§l¼kb)Q.™âGb+B«ÚØýÒnùÞjG:ÕiêÓÝe ’¢Éx§~ã±jÈèI4Y­8'—F|Ú6zO.Ù`­ÂÖs*ÿä’¾©™d#}]¥]jÍG—TÜ—³KÇReݳ°1#+ÌÆŽ³KÅ»À•uvÉθ«˜³K£Ð)i½g—l°æœ]rÎ.9g—ŽùÙ%ö„;»dGUŠÅpÎ.Ubàœ]ÙÊÒNUˆ¦81Î.µÞ³K6X«0¥q ¶Ð*ñ(–¶¯tÊÙÁ£"Q¨³ƒN÷÷î9¦yz*®wŽicF@CFcך¹-3)5S‹Íµ²Q|<ÙÆ‚h…åÝùüoޱ²ªç’òV9j±µ(9jQç¯xI8jÑQ‹ŽZjqV(޳è8‹®c8Ž¥è(ÅáSŠŽ«è¸ŠŽRt”¢£I)ZwØZl>ź±xI Óžx%î²:3­ä™&;3Mç¯xI83Í™iC'‘q‰ÅTÕDÐh笪¥H¹<ÀÐ4hC|y,шöµØ|#x«Ïx²=ÖO ¨œs¼­+ÍÌ´“;ÅR¤\ýŸŽu¦†JGT¡é¨ŠTBN.ªâurQ9¹¨†AÖF + ÊIFÕÝ…É›ŠfÌIÝ4’R7¹ØéãbEø—qÁÓá;ü?¸ŽÇûYå ŸJHí4Ò¼µÑ £{Üùòœõ2r¯àIl1ç¼JRQ{[•’¼ÁÞ¬Ý8T;‡o¿®<ï'¥:»RÝñL¬¾gm7<ʱœz¤Ö൒•Hñ ¤K‡Xj³öÞ[6‡¿xކØÛËáH(£§_ÿ“wcdû£%EEñðÇíC(äœDËË7úlpT<Ú8Ý[ó©RTaª££;–Á铎µÛÓöª2ê‰ã8Vù]~"-#­»ŽÛþLÅõ”^:áe%„—¬ÀL*šÍÞx»#Žúíåb­š‹g͆ŸWF7åmôÖâ˜­ÓæýÑ_6"2ÙÅ'­ý‰°x#9‹7£$-‹7ʨ[¼±Á‘³xã,Þ8‹7•Ðå'Â’ÀHë.gñÆY¼qo*yñÃËLÔÎaµÑ\¶ÓCN#=‡R²§³¾-]fçmxk™r±ØVüêH¥eÀbÜÅç„jvÇf§cw÷Ä’m6B—~ÅÊÅi2åÉÄ3mC¬ç,àíMñ„ášS¨\¬v¤£0e Rqo]iÅ‹åÓ|ØHŸNÚüU•“¬,ßk*c²2úÕÉUV<£N®2'WÙ008*S•1îâqô2)îAª|<é×lxíéT§ Hwé›åŸR«±¦žtkOÌñ(XH­ ‘ìIJ¤rüò •s黤wggÅyÐÅÈQ{\ÐcrXÐN_UÚaA¬UÌQÁ¬7Ô2D–‹hG§øã>•ºû‘nÅûŒ³2»•»’)2nûúÛåt ètäG§¶”§Ÿ:ñ©Ÿ=¨œø´ƒN|êħN|ªÅ§Åûô£=>->—ˆŸŽÈø´øtÂÓ + Oçù<'@uT'@uT'@uÔb‚qÔ¨Õìè QíôV¥…¨¶ú«b‚T*Õ¾(µa¡F{„:ºAtŠßœ”+#4·—ÿ¢²€HGK' p‘9ydFLR‘JÓƒ©"ÈT®&Öô8åYVL€oYÝ–J¤ÒÓZѶ¥Ó])Õm‹gú¦ÙYLîÎô%l¬7ê·—khÓ£vâÙã®ÂæÝl¢•<í¾VZ©JY&¶9+ÄxrÀñÈ7é¦4¶µ£YQŽ +üÖâóé¨Ñµ©dw&:”cNˆÓ¿`¹Æ¤]ôBO[ÔŽË•S¨\<ö.¶“r$+ÊpCuæÄÊjÿråâ¶øcEÝ=éŽh[Ìf—æ–râôadÊ.}¥@»ü y‘¤â³ÓÅpeoñÝR¤lF†/^)EWÄ;{ììØšÊÅ)þ²'û:VÝÌ8y(u¶öeo<–í!R§[ÛJö3¿ÄñK*Â/éõ$¢éúžâWÖ+Í7)>2¤a?êË/Y6n‹w9ŒFÏZÞ•JÆJa7[ÒqЭLšãŸÿÌ£OúÑà îSõ¥XõJñXFù¦ÉqvÈœ…ãæ\.âVká½åÅ{DK‡8ϑÑPÙÐðK˨àmp4D®¬Žøòqd{¹bŒñè>`MÇ3‹;cvPv*Ñ,'♆h|¨Ù±É#Â&ÛÐŽŽMù~S…ØdUˆM.-Œ¬»l[¥;&Ù1É£À$Wâ2½ƒ[QØñP­×IÇ´1•§ºø€¡Ròç¯ +endstream endobj 67 0 obj <>stream +Õ·²0W_–wÕË©<*?áÌ×è³ÊÙ¥²ïWÊ”å9qÛÇfÓqÂM[T•Óa•2ÙXí•ìþ[;±øw+tÚÿôÚ8ŽŽXzv<}\V·*qoŸs¿G–‰¶&b>›K·9…Ê5¨£ypvO²­±’µ[v1.g$ŽŽ‘8§¢G"ë¨ÄÑ2gŒ„#BŸá{úMéh²»ÃTΜ¥¾OS)+>%ùŒ•⟋>ÚøI¿³ì3H—ÑñÉšDb¤tÖH“O‰CÚ9Ñû53RªÞ¤š¹,Ó2+Ùn¢ëMDRË‚T²j¡¬eÕ:}FlQ‹€9ëáE@Sy|®y“}©pYÖ€WAR¹°*|E©b‚¿Š$ËYIb¿ˆ<—•7°aÒŒŽ©Óh‚J%J¬ÈQA^”ˆÀŠB;I…ö ì´šTFÁǹyF”´šT7 \)‡Æã0ä¡vìhEV]<ëæeD ƒl$IA‚Ñ&žã8j§Iƒ¶« +/è5Á×dG4GUë(¬ˆ ·ò<ô Ê †+«JDxè,¢$k„œ>1P +ÚÆH¼˜¥ñ VÆgÉØÁ¢Ë2  ¯%–׆‰Mã6dRe`òe+ÊJËãp4“¤-·AXVζcÌÊNžåĬªQr'f¥TÍsÙyGl§I4„Ž“ÊJ ÖÍ1£U!A§¡„X%dòl4Ü-в‹S °äÜ’ Àhâ$˜E w ¦ˆ Š.˜ý /pXÂ$# O†FÃ<á­$˜¦ AkMa¡FÔ Ö ˆ·6ÆÐNPuÇ„ñ^Ôj ÀÚáA®ÉS\?hæ–‚º È¥j3(ZHŸ!¹D¦5¦$†EKÒjV¹XõÚ¤–šmR‹}Ý6©¥4íåJÒo“Z +i8j_ÇQ¹<-ÔznRKišÊÐuT[ ÚäV’¾›ÔRªÆƒ!TšÎÓÆ{)ZO›d%é=(ZHó!¹ÝCÁ¶ö›ÔR@ÿA¿åkÀI-%éÀI-It¤'×$SI—ÊIš +ìçfBM*ÌKEbX^b`‚²äj¾!ú‰ô' 'IQI]$èpUà5MJ¦[f­ÓÜZN|AjUÓ1FÑ$©¬ùzC +,©£±óI–Vôç³n#R@&Y¢UÐä’¥Z†œ/ ÕÒül‰qd›U˜S¼€œ²Äœ6•u°ibò"âßLn¼?©EÔc;ˆ’øˆ—céd#ÄJÝ™4Áh2Â<Òa03U—“Jí+ˆ0É©œÀÉ4D§6Æ¢ íø>–È©Uõ$âZòeÍæ¤ãíób}zÍ\~0#l:cy:T>#•Jäޔĥÿ9=ñv=ÀŸÔ‚cË„ñª9<Ì(Rý +…ƒ3z2™T²%µ ÂÔA¢Áë{P¨3ÍÉ:PÈ&ô‹Ø„¢ Š†E{N“V¡oke¿‚ã´[ª5{Ä1 +?¼uÑ¥;…œ‹~Æ*µbèk¨h KXréKùhíoóF¢‹jEÿžžS§}ÁßTAvé°U4¯ŽAið,”02Dp"@ýK"úŒQ¾é-b ¦ox¯ŒMÖ3š ªFB#GU߬Þ2ú†¿‹œì2 ƒ£åÒi<§Z«Þl1£GBÔ.¼4êÁçhµ×ê¬À3Ziúx“¸.ÑîZ”޶Çc0Bù)ÔáÕ*v>kyyŒuÍX„º“Éù “ÈoÍý ² +7Èè±:óË¢ç%UÔËŒ¶ÒŸ;£Ôç‚åÅçÒ˜1f†§XCÑ2%,²ïÌíã[õ_­½šÓßfGU=•3\òÆ’6Ìj­®Ðcˆ&²CD!úx6†¡9 +­ƒÇ:¨,,· <Š8û£î‡v€á°7Å‚£ˆ<ü¡ÊB_4ŠŠyn¡QTÔsaœåŒ¢m”U÷‹ ñå±DC,ÝkËh\3KMsR¼I\HB€cm½Øch½jÓ±öxÆUM·Û°^#hE““H_á2¦þUלJ;§Y@Ö Ð…dØCŒy->Ó.ኇÛôk-Ö¤of…ú¬ÈQ }ÑŒ„ñ«¥V“n#-Èm€Þ2ã›Q“…A‹ù +Štj_dÐ%àìqú_VÅðo­&øF¢Éþ\m)U­UE÷ª9­Ì¿ÔZÙaܪqÐi\JzPè§×m|¡‡JôW[µÖ*ë Ö’z…µz+²•{Ù¡Y‘añSÁEuAÐÆ²•ì”ÎŒfb³ã±Dû ~)Me‘•XUžaÃxTà9ˆÏUèoNQäÂF™…Ì€&†ØêaX5;Û¥¢(Ú\Pìl—5o±ZÒ 8 n²ùWÖÇT* Š,ª ] L‡iç$‰0¸¢Âó²ñÆ>„E††ÂöAÇ»åì%6·€R’\4ïÀ¤kã]Ö­»dþ5& xôÐ)Ò®5¿P´%fÿJƒyâv¦.Êä›Lt;TðWÀܲš™ÇVòfÑ­YØ"kžQ|ÍL®å& tZD‚_]&‚UF¥zÖÅpÀØ‘`G6Œ Ùðj®lÌÉŠ2¡à¯—ÔHJââ2¿°ƒÉIR³‚ + JÁaÈ`{`~ȸj>€gˆîµõNA1$’_ÅN^ÿ*ø~~ät–9cFçÓøË Å.X.q¸8æsïYûóCr,ê‹:ÇFÏÄ1?\üJýøìó+ Á/oŒjÖÕ¬1˜yË—aÕ‚…gTÕ9?b ‹y% +pÄé q:?ŒÎ…ñwxǬPô,š¥BѳtŽõSú˜e]F¿‡sÌÁ/Ÿ{gÁ9:¿üàü2úåôaÉéã”ÉþÆáÊæ W!÷+À›3\û•Èg†ÓxÑ¢mŒ2ÆŸá©ì@3hæ±ͼ¬h;Úhã\zgè†s²EO9v )Ç=å +±Jª±“þ²ºdüÕöDô¿Ã25¿¤@¿énb>wF‰¼~Ó~Èc†† ¨6Q{¼ñgX‡`?V„~¬˜MýX†bEÔXÑ=z½3ô?Ã8uŸx-ñfÞãV9VeŽdERxÑØfÄ]UV”Ìõ—¶íÈj'Ï„¬›;5³î,kÄnø ² Y‹iZPÖüËYbÖUÓ¥µNpe£4 £o²±åFjF7P×ÈC…^…mnyvôem° èvQ˜0hiQ1Ÿ= ¿6ô³9µÈ…×â]xx*Ëÿðnmõ°R—^Ò©®öTïÐ;‚9‹« _{„lvƒ6-DÜ…é Mg>©.Kª–Ü}±Ò:S"ж…(Ó1A¯@¿Ã à!ž-¡“Pj¶*sWÃ$â&¸OÌÖž¥H–Ú ¢¥­ƒÒÌÚŒ'ªúMf» ‚v6¤f+2x4H†ŒzûËN[q-<Ì'£’Y•¦dO3ϘQÓÖÖÓÙ˜Êds˜ãISoFK•l—¡”Q•LR»IvKôƒI°´Ì¤Y»5KÄ¢$)­jø¢÷Ù…J¶'¤ìh0«Â’œÖ‡‚.%Õ¨«VúªZ,“7ø ’ÁŠQ­Á«döA–³þ2*v ÿ#;ÁJ¼Âº%^ÂJ^e$]gk'Îà£ÒGV j¼|îKáÞ“Ñ-*á¢fhý›Ç‡°¬V«R`kZh(ËPœlÖ:£íX´uÆ×n« j±_SM£0\Såú­‹ºr^SqM]Ê4ÆÚRév>º5p´äÙ Úš¹sô!×Ô‘Jwé&µFƒAiOµÆZjæª-ÐfO¦/kÉ>½¿`é4Žh®”UM´y”)o½ÿìÌ’¬Š"o2÷›ìy!Gû[ÔDab¾Ú鯘ò´×*Íj£™J3O­ö×+èšþ*É¢ R¾V˳Eíä­±XÙ­f?xÚ¶¸ùªynRV 9‹%-ÀØÕT+#ÆR¬µ’Æö¶ÎøÚm„µ«ÊªP53Ô’\5“ÒáBžå8EæyFÂ}A‰çxAed^ÐPÆ Pâ`ÆÀw^TQ¢m8ˆEFY7Qqqæ…vÿµðÑЬÞy¸þaè&6«%ŒèÎD¡RuƒzrÆà)Ö<•áЉ[‘e<Á¬ÿaXpô?| ev<ÑYT¬4Pô4hÈ”·L1ËãQ":BÚ) +žÝœ‚'tuZ…†_èð]¶l!š¥l‡Òáyu†4–êæ$NÛÃ6hh2V«‚u+øI’QrXÐg²Px&sŠ[V†—8N–%zÍC€x‡ƒ€‡U8‘Ž6ƒî…©+0œˆ§tE:5ÏE˜¿¬Ê3ÀâAC³ŒÄJ +Q@9ò0qxøŸ,2ªfYäN–•uÇÒË +¢›ç0ž €e–Þ¢)êi²v®eOï˪ʹyQRYNUY˜¨Åñ}Ê(¼ÌHƒ;Én“EIUb¥hÞ@JŠ* + µ@±ÑZ 8<&€‘àÿd‰d·,Á³TQb9¨€*‘墬0ÀtñOã°™¬Àq¸*ƒûèGà5Ô"ÐÆO .$h­ÈÉ<§j‹îP5Ö#€%älCãëçiT‹â/¬ê¦Îv/í§õæ&—ÅÒ™X{ÿå–ÚD¼« ”OúÌx7êãþÀÍÚ¯8½'µôà?ô’.h‰Ø4óŠ4Hc´[{¹·Ú #oŽf‰cË┞£ÏX€”°9ªiSˆþiƃYðÏÿû¿Çç÷îüîü^5Æçà¿5¿¾Þõø>¨H³Ýnª/ f•ׂ´«ÅéR]³{V¬ès¡¾Íõµ&µvκ\-tï/éï½ÕÅ“KMM;*nɯRSoªÔ¡©~oUyó}±¼÷®r”»qq}ÖR\ +Gj½ögQó½5|Ý0ß_³P­ÞY¶†ÂÔœ:´jò6 Õâ£iïkõsܲD‹ë6©7äѶûNúquà Ö8®.¾Dy<8|?ö8ºqÃ)Îb¹I-³µÙ£­mh ©;qfrp¤jæºjz2)—¦žâ+bÙp8ý¡¾µ;–^ko`²E»«_$˜}oUÍ{ou€}0ÆòªÃãò‹ÀâÛ´ Àpø~,0«òŠ( àuöì.O¡q»©TX\íÀÉá t¼~ÊBdð´;üUM‰(‚B¯ú°Ú/¡V^Èë4"Ç +‚µ(LEP,µ[Ô½2ȹY(Fe&‘—i'Ψ¾ˆ‚¬Õ¦µÂ Pm¬ù(¢éûpSÙ¢&ßfõ +µ¢¶ÌŒ ÙÜý¬–ÝÐ’-×Ù¨U ®¬hm‚ìVèýqkãAcª’¢ä¶ׇ%Åʸê-$ó–ê­³õYb¶õ9D½_õêÍn3[aír£¹Ö7™2‹f×k·ÌÏ“™&Öjn$6W–V¢Æ¬¦Oy‹@Ô_‚œ+LÑ-*ªUnuDT˜B–²¢ô½u$X¦(MšE’±jVmJÃlUf[­’4Y2ËfÙÖ«·LIæIL—$N4]9’´õAï3%X¥kÖŠÐoNá\ä6W’f)‘-(2­gë·RLYf‰aZ‰Ä®Y½)³9šÈhoŽ&2ØÊj"“uCYYMÔ_jš49‹” aZiÄ+è"Õ¹)ÖÌv’•$è!0 ýÔƒ™,rÄ‹¯xp¼b™à9C’bV’9Dd5[½!l+,’4›k¤É“AËr­Õm½6¤˜'-Mˆà;¨R?!ZiĦµˆV™£À +R®–ÀÆ2œœ#CXbx‹y·$à{fÕV‚!À,-+?+ Y4k6d`>Þ"<³™ᙼ´,·ZÍÖkCxyRÒ„§€ÎàÄ\#c¥‡ŠE«’ ¨–•”áÉnŽ—ùÙ¯‰ïei’['VÌÖl%²ËÒ²²³ÒC³fCÆÓ-¢3iɉAËòªUl½6D—'#ÝV³Z«è¬4be³Æ_›¼,xÈJ®Aaqj ¹²ÃçóVu‰ ¤$6fÕ‚!»,-+;+ Y4k6d`>Þ:ifZ„gòb4¹Õk¶\ÂË“’aGtˆ’S)rŽÏ¨‚Kªèž¹Wª< %ë2×VÑ YÆl9ÝéËÖ¬ŒÇ[ÝE +l%9Ç[d9#fÖ«†¿‚¬)z¾A°¸ŠÉê)fË0kÎèñµ¤¤ Ïps¬Â3h&‹†e +Aw´¬Â32«ð ·Í,g8vfÍÁ*<“fž…¦±hTm +Áx¾Uxz3­Â3X1Ë™0j¶Láõ—R?_Ð*<ƒf²h¸M¦ çÊ*=à ³JÏðÕÌ‚º3gÖ¬_[eg,¢Ë’4þŒjM ϶JÎh£Ut#fA“}£j Á]õsþr&­NËN-ÝLg'ŸîIYEg¸\VÑŽ™YÐpÝ̪ ‚Ux&Í"= MãѨڔ‚ñüœY«·3gÚêÌd§­!sÚf ÙiÛON¹ÞžEzœ)+CÃ/2D`øNÑ™>–Et¦'fÐL_ͨØ$XD—¥eEg¥fÕ†Ìç[Dg4Ó"9ƒƒÄeIõZ® ±õ—O®{g‘šA2˜3"ƒ{Ãi²HÍð­,B3ü/ƒdøgF­ÆµEb&)+0 ‰ø2j5ø6l‘–Ñ<‹´  ’É´^«åÚV¹äúsi$ƒ/Å4߆Ÿd‘–îMY„e8\ÉpÈŒJk‹°LRVX±eÔj°­?×"+£qY)YUO$“e½R˵!«þRÉuà,²2H[†ËcÎGÝ-²ÈÊðž,Â2<,³”ê×a™¤¬°,$ma^¯ÕàÛx°uêͳHËàÀ,e0mÔš½6¤Õ_.uCç•8>{ߌ¾!2¬{àŒ‹þiÆ<3À¸y’´µ‹ÙWdákoëÛtÆÿÿ7{ýu¬Êý¿ñÍù8óS` U ÏèøÇR?Çv£™Õº&k5¹ W}:sˆ 6q”ìHk›Ðwwú‘‹ßßÑ·ûïðhäRöx´’y»<ýÈvöy°hþNÆqI{=…dH5&5i›‚ŠÑƾÁ ~d{@P²Ð.KÝ¢¢ù;AýÈ6ö‚ˆ¹¼Ý ¢–´TH†ƒŠ¾àFQ?²­"(Zh³ˆÈ¥lQÁ¼ £\ª-#â,ÓˆÈ%m’àà/´ŸÔlgG ógØS"ri»JT4_©ÙÆÎq—¿·Dä’v— +IqP¡ÚvÊ¥¿ñ„Ùœ l=Q’çÒ6Ÿ°hí§~dP˜€< +.aª€ô•u¡Ý©\jñûSøÖCþ¾6^Ê–Ëߥʥ½O…,åïT!µ„½ªRTÆ…6±r©Åocái¨¼,‚(a+ råofåR‹ÝÎB†ò7´Z–V™ î’ØëÊ¥¿Ûå +ìwµ„/*—·ç•K-z׋XÊÛ÷"ªý¯RÂæo‰Y¨v6Å,n¶eYÊâeÛÚ³8Ó–å©\jñ›cYÿÚ²Jeq¯Y;d¤6¸Œ ìœY¨vöÎ,ît®ŒKÚ?³øÌ¹2.i-ëGçʸ¤}´R+·ΕqI[lÿ9WÈ%l³e½ä\ —²Õfqœs%\Òv[™ç4÷Ó¥ìÄYæ\ —´gñŠs…\ÒŽœÅSî§+JÙ•+ ·¢¼ä!—°agñs$\ڦŠΑpiwY×8GÀ%lÞåË«(·8G¸%ìëe]âÙ–°·—u|säZÂþ^ÖÎj {|ùr*ÊÎj Û¦œ#Ó¶³žnŽLíofß‘–°˜/¥¢ß‘–°K˜uzsdZÂNaֵ͑i »…Yo7G¨%ìæËiP¡œÌæø¼~¡ ñ&oIoîßžê·ðK#?‚Ü2Fù qXUƒ1à@¥óˆúG@‡¢v®Ã !$ ÀËBCô6FÒ2RZ UÖßæáyíŒödZðä9–Ó«nXtÑ}:ž§ù1 ºK9Dª‘^8#Šª PAFË~A°Vß_ú¡F+ŠXcšTŒ¬::¥.K‘-mUtôœB´lÉjª^á ‘Ð'd-—‡)7"PYÕ "ô–Yîëר"6îmB ®'¨M‘¦=ëd·,bVá4ÕJÎTØMÆ-µ‰TwL1«/6cá×@5³$-4òüTSr*Üå `~‘ Gú?^$¦…Ò_êØ ”êIûÍ(C÷héÿ\z.'íaú mív¼Ì~§JU‡Áò@˃-M®Í¦*U´Ì¢ +ÜÉRp„Ì?(ÔTü«ñdüR½½ZÑž­åk­Ó¾àœ†½©Ñ~­V4¦ªó7KE2xbSû€d¬Ž¨S8;(%„’b‡*+ œÓ´˜ç%5äs9©0 ™lÌ$p¤"·'«©+³Ýe¿Z—¾å¯Ùß–QÐo€äþÉÞ—-¬½VcÄXZ`i˜1\†L 3ú#°WaibB@p¶Êl«UVâÅ—“ά'>޹®8·B¯¯ƒC?ß8©-p¸nüH&¾«¬KûQR2¾ÂO<ŒíHjnuuC¤À? ,w±)°ªjÇtfŸX¨a…°Ü–WÝà­¥×ÈYUøÚ »X¸DL ÿ#ŒØdÅÃàûT +«Åy;©.o— °ÖR22[²‹ñ”×è´TuZfmÍ]å-ß¹ì÷jëMÕ¼âÆ„ˆç*`Zìj²U»ÔßXÀïÚéúš…}¥â„‹µj¨«Æ×ºlûô+¸Á\á*§½zv¨ÒƒÈñìA d‡*=ˆ¬Õg³öDgn'Y;ÏÒ§–ž¶ K/h sTYFt¿^¶ö¿¥AÃê•¡w3‡£¨¼&ï ¯_CÀdC•—Õ1Š|þý]Üóû¾f•C§eæW›SߢR²­:;Óú+«êЇAmަ±* jë`¨Ùá…êe™¡ú¡P†,/Kƒ÷cϨ‹z~ÿ~<>ž5§Ð#=  7šª¬6!9BoVLº™’DGˆ¤þcM¸JÎZ±…hºÅòU¿£Ã2¤°0k)ÌæŽºüØQŽä³¼[•Amƒø! *9ßlÄ +ÛàHZ¶ÆùæfDQ¢ø/E·Ä²Å¨‡(ýUÝ¿1ÕýLoÄæóUme]_^Ï•MµUrÕV©¶MÐ ¡!iÑQœE7/ ® ö°*ÑéS£VLPNçi%ãk­Á ~m2l‘@ÁëìýÙÊ´Õ{ë“,ȶ®VF»­<-Ëúä pY¤C€àÈó¯½2ÉtS'ÕeIœ¬mtÕ(Y§¿°jÞIœtfIÔ¹z2Ùìm+ÁÚGQŒŠëòŸ¥«l¼Íòøê‚Y‹ÝÙìÃû_çVŠÀÙÉÕÐÑú¥ÑS2–6vo +²ª³µiWnQàUƒT3¸­ ¨Æws á–È K–*ïJ4›”­¢_íÙG×?`¶2YíÙ +_Ñ»"OaÃ`x#Ì ¬0ÌmZ÷Åxúr¡Få  É®í°+´×ˆ«Å*KGC4BmÔI+eïQõCf-ÁxTe»ÐhðAÐÞp¡Z° +ËfŸdÚ(σÖó&£Áf-ý¹jdpj`~wîL×4×ä¶xº-ká[¦¸èM2èo(?ö™ ûÔ¢ÂÒIx mŽqó +«ð’I¬#¢À‘–•Ý#2´£*0\nˆHÑð0ðÄ +þÅ“[mÔ ŠŠ-Þ }«‰‚ç ]`Áé¥c¹’ˆ?183Á—Õ“ŠhDÔÛ²$é¾ÐV¡`O4¹ð¯,ãR¯DV²?7µù j* zŒEP Û  ‹Eë ¢%•Á—‰ú¯f´=à7YâéT¦$ày5jVTŒækDœ–ø”-ñ4¦dãp“fÊážÇÆä6ª6¿C¸½6tGð.l®ŒËÏ,J’V9UUT*YyybÑtÛâFšRKŒjû”‰žnO¯A¥³<ªÈKäkÒ<Mï€Ó °ÚQ–uÆ +ƒ¯‚@˜(Ë„ +"ÃŒÁóS8¥xœ…X|FE‚¶”‰–$“<M9Âw´"á¹Xª*€– >8}nÊ<ƒ›túS±”ŠG ¶„á¯y•Ð\YÅ¥%ÓkM”Š=¤É «%)Ve`’D/Äà[Ž ½¦~RJ3¤Ð°jÎÛ°ÅedÖ/´DÌÇz|àIÕünGj OçÔóº^; n»ó¡Xî§ó½% í‚þC@Ï[m{ÕFÖÒ«õŸÖÙ“Zrºûøu*ðjßo‘…ì»ã±. àT1û¶"TG{ØÚaô:C.Ϩë€ß/ÔÜj&vh« &ë^ë¡8¹`NâëG¢RÝ,‚Âþ†ÑÆk†[ÎBGœ'\5ÑËö’SÉò"¸+Ä ”êkA‹§E< +a%ÏP¬Ì¨xÊ jÃÃk`òE½ 'ÛQ¶ñšŽg™ŽAá m0þ-×µZ¦!ô^ ç†pDÅΕhJ€å—±ë¡åÇ9Áðð¥OÁ™N°sª¨Åz0â9–æ§æïà "â×j®–"Ñú/LQÒvXð_ø¬hòäWKx'´À“ý×Þ Á¬807Õ A F•£W@uàB†[$ZNÉH!O¯"ót(Ðû×_o…$à/0F§s-%Ï‚a!Pd‘-¢R9);N÷„ÓŠWµý<u¢ˆ[û¼^üeI§ó̲ovŠqMN£`Žpƒ„3E’°s0A:‹:F16Ô U±ëôèp+#c xJÀ „çy-ÿ>(GÍù§S|XŠ6çµ·Dí0¯VÉÐ{Ð ,AkGlk _‚=u¿~~{‹4š¤é`T~l¶gòz¯¶@Ö öâñ×¢Õb„/ol¿¶‹ +ú¾Xó*Œ +_×µ5Nd+ÚG]œ¢DH®Úhºˆ5عúʺµ³å¸kb¬41¬†ÌpæZÃZWƒ8Y;ðËâÞ£í»#*’´xÏÄ 3‚o_!E¡UTÚŸ¢™eÒÐ êYÝ€$Ó)xŒNÕ¯ÑBìÏæ©Œ¢Z R•$iø® Qp™‚8m}Pñ\¢eàäŽå#^ÈÞÃy^Éè ~P‘*f ƒŒÞì "k“ä!ÆOIÍhüØn^Áñc¼N ªÌ±Dت@¡ D)*ƒ‹’ (‚·ÀoòŠR†#Oe ò(ˆY€M5¬ŸKbÔÓ•Šš…¶7 + Y +uèâ <Ê(Ù™W7^*ùõ Y +•éŒÄMdØé/.„!8WñÛM±å™št,ÚÒ‘jëé0î¦-îF +·™Ã·Fy…cpgkYpßzBp=ÜÆ#w’5œf%аxÜ3™ujråACæû2žÇ ¥NPæUqUm\¸2.ºµ+YvE‘Wïý †‹’½ª3®ªËWÆEw9*‹§<Àñ¤Ó.—ÊU§0ÇüüÅ0ŽSÊOÛ² •¤#yКêjNÃ×úË„ñ ºè7Eû­!ÑÿÖ·.i§—â]3Ò=Ý‹]ó£Éè¢XÚUŸnGWvˆ]Ú¯µÑD"Ö°kq¼M¿µ ¸œêâ]]·«1Õ“lŸšï´xrn –´HîÍ¢«K«JÌND3ChJõ´-ÎûY«£{±Qc}:gqNÙÚÅÑt[*špU»bɶx¸½ïÒêèW"š¹®¾'õÄŒ›õ>/P]L«è bO,Ú9uŠË­wtun§ƒЮµ&Û&ìa+xYËÑ×þãñÌ1®»àA¹°æí^¬wGÿ·+…R†ªý +Á“éKÄÀ™:/™êMÒz“k}ÝÝÑ–9ž)®© `ð£IžZÎɲ˜yÓÔÚTgöáìxÓºOÓtI<éÒnÑÈZX8U¿çFŒa¦úâÝq0÷TiJ<™hÛR[•̈vÇÛrjH§–ÆìTÁÑO‰ú´^kµzc †T¦1Ö–³ßN¿j7êÒpÙØÿ1vü¦ÎŒu¸¦»&ŒwM¶ÔEÞÏt=Ü>kjC4)Èem*ÙÞÏÇààU!ï¶$>¨lL·ÕÛ›µ,–¬o×ô“ˆ³«7Ú”|’žJõ•0g-^G+‡¶Í ç˜ǼŒÐÁ옗"© æP%™gUUX7ÿy†e$FPe0.2¡40 £ +#ª¼(ãkÁh]²f„¥\ZMYšf¸,'ɱ7޽ùºöFpìcoFè`vìcoFÉ­Ú³7*'ÀæÆÙíqv{ó7ÜæoļÚ\9ÖÎÙ,:NÖN>æÖ®°¡Ó…®ÚT:Kw‹éWcÖ® Þ7¬›Å÷šé@½k2¾.ÕÓ=È\pÎðçᾎĊP³ŽF2‘ +Áÿvæp%ÎarÈ^fdóÀ % g8Aâ\2!‚ó xbGPV5]´¢(#à„¦fmg÷¬XÑçší^:,¦v¶ö¶FñF³Cç«ÙÆ¡Œì‰«üTGù9ÊoT:0#E)˜ÊÎQD*¢‰ž˜kA¬R½MDoÔã1^å%ŽUÁ{@o€•y–rjËŠ$+zßx›^¶l`ˆŠRèM¼÷ëY,½_/‰Þ­g‡Kå•Mœ"xf Ïp¢ÊòåPç0·¸$ñ”UdÚ3b9Ž‘9VYAË›ˆY(sDÇPvKmI }3Ú3ÊÝDXºìh•®$É JEEPIJ¼C•…Ñ*©‚h¬HòVYòôFuÿ5JYÍ¥ ,L8²”QV€i 3Ç¥€‰ñVªÌIÆÄgs³fÐÙLÑJCiJ9 ¼ƒH³IJq*2Ðn"æí9¢˜PÈ¢ˆ± £èÂ1ç½3'gç9ÊAÄ' §ìFÍÉM7ð M1EE"}Éó8¸–‘DPÈún½UõjÊ¢ßØÅd¥YÝc5/S¬ê=¦ƒû»q ‹cçÈÚq'J¼Âä—eК +¥î€Ñ¢b^p3ÄFIèDÊ1R|¡C!3©¢‡':ãÌö8ÀãáÀDpoȇáx¼MpÚU6Æ8óœI¶š,©ˆÖ¿Á Ž\Ùí¸Œ3g½ÅÙ0²³TQ»8ꌹn/Zœ€ÿ2•¹b1ÒÊ ž'gˆU;k1*……ÜÑxWáõ»Év¾Î0ÆHo—\”ˆÍŒuÁpë®O'µô5?X2ÖÝK¦"¾h:žÅßfÆ¡½$ÉþÏhŒ%¢8ΚRÚüŸSߺ¤ë4—5‘k(™Nµ¦ Bl;]P¥šÛB¢åÔ=Õ›Œ·¥Úc6NÀ5{ŽÒAò?28¨¤ì[¿üNËí!£/ŒÊërúÕ,<Àˆ0JçÖ=B,¯¨;E;Ã{¸ Š¼" þ„¢ª* Ú¢¢*†­,‰Ë1”c‡Æ SÁ‘Ã[òý†¦ 6ŠY ´1|— 4-£²Å${òǒS_±û,ˆµƒšúKutg¦è£„æä’d¦‹‚qKg"Þicâ9VJ×SÜh¶Rú\ÔRY6?y‰S$ÇÊ”beH]ªÇÅÊŒ®ƒÝöö`r~®Pr~†"=?¥—ÉǶ¹~Ð Î :þƒˆÓ]ÑcH,ÏÛ*£ ÿyeØ»ÿ„_aš™Nu¹<‹£í©ÞÊ\\ræ ±„6"Á8˜—3Ò‡!jÌ9ž‹£ûÒ­‰¤&'3€\Kk¤‰NÑk¡ŽhºØíÑôÒ}?&Ï×9×ÝÝ–HçòÓÓkðÔÍHô¤s9_œJ¯È]Žl5î!\#ÂîŠþÿì½ÙvòJ²0Ø×µ–ßÁ€™' € fž10x˜AÌh†]µ÷Åÿ$}Ówý&ý0ý™h@¦Nï:ÿ©ZŸ7 TFfdÌ‘9°‹q8جù{_/4Ww{ùתÒ;ÉŽ–köºÅ®7#—äï!ü‹ ãÿçˆõÿüÿ^ “™âëè`uºgý%®iðø(´ +Ñ~ÚC‡ˆÐÿvç«d B»î!ŠFwš¢{Ñðn>¢ƒàá*œò$6:>ÈÑ¥'(?ñïPœó¿­îÐDr³å?ÑUHÿ¡[´ÿ#Lÿ„éßÀЍý2[/¢îôÚД܆þo` ë5}ÿÇÒý™~…ß{»Ù¶óŸ)žÿÃN-ÚŸtΡEÿ…)ŠÄ§c¼ÈYHÿéJ¨z´kù?fæ¿A‚á[Ò2‹aB¸#íôekµÞŒÝnYn…jýK³”íU|›kÇŽQóô’¯ÒWÿ¨ ”ÈÄÖO¶ìþñÅ•4 $­ýÄ%$¶z.y]g‡‡ñ2H…ü~?ƒnwÇWîz`\0"HBÁ ªÖáØCÏì ™/û>ªŠ"C8r‚ºö(DïäÖ,»8¼â'ƒL†ê§HWVxHpùšBgj1t>àñÐEêÏžÐC0H}ATBÞ#ÁpuV~”;D£âÀà~ó›÷€ê`=Êaöà{Ãø\ÈBÎ’AÉà~¿0Q•Þ'»Øö}`Æïgø²Ï`‘'ž ƒ¾|ÔÅý~𤂸ùÜåa þm@÷‰áóü¿¤Ìáâ¨|””ÕÝpCŠ’!ú:…w’QŸ_XU‚ +ÁJøQÑ*ï>SLÃø‰ 7RŠ`Y0|*WyIƒð +Ö-#Œ]Rx‰F!»y¥iI3êùqQ4㢂0.: "O]M¥Ð4ŒAäNø€ ‚4b” +‘† ¢×ÑÑ(Á`q∇,¯q Ñ’ÿaÞ•RÊ2…¨€Æd@ \ 2~BeÓ¸ +ƒ›´žA‚áF<¾@OT–ŠIT 0‰ÉòIÃ"ƒÈ!t(àC—ârc@µÏ )$v8Š®ûe‚'k=þ£Sa˜£e§ÄßÉÃHHB(Ð"=€Q€Ì$ Íã9   ¢ž?± Kúý> â¤HJVI81%£ ~ ~L~AÆÁø1ð£( +ðš4°¦”/! +Çãh˜WÕ +Â0HŽ ý’²LL~²£ yÀxþ>D|øBh!@|û‚„ÄWH h¢I?As„ç‡9ùè a,^)„"Ä$Bá,ZÓ%»eQ<Q„_”Ð Œ6äÈðŒ[”vJP +/¹ŸÈ#Š?Æ»¼t• «»Ç;IŠ# ëCJ—]ÄAO‚¡A0IŠ&¸,YÀ1ˆ)Ð$Er×L‚ÜB¤XB—Mâ±>Ð@@© +ÒÏÚûß{’%Àõqâa¤Š@zŒÄ@^¡}|Q0 t0£?HÓûÌ#¥4ߣ¢`Ñ IÍ0h ø ¥Ñ5Zøš`?̓£p2¦‚ž½ø €0ª} ª`4HOcQOJ+]Ñ/G‡Y˹b‚ŒÌ‡QïÛcU$é)xŸö“8É™òù|`èm„-˜!*Ê(^~¨ö^ +b!ˆTJFDH˜è2Xy?'{ýø@ ˜,Éž½P@ð_ÐËœ,“Ø–Æ:ÉãS°JP®·¬ÚƒÒ€4„ €óÀˆ6§Ë±å–Š?è š™¦ñlHT) rÛè¤qXMFãWQÂGö씃ƒxfööÀ8Œ t2heÔ…”.˜fH”ÆHð1œÉ@0E:² I. +3žøä„} µD1«å¢hmB"Ť ™àà‚0òP™<‰È„£LPƒ@É` üé2ůD"2„%µ§‘Ø( 1`ÿ#ó&Kc¨(ä¨]œÉ®` ÊŒœØ/)°”ˆ4&NŠŒr +ð®À‚·Ü!¨`tà™Æþ|#E8!Èñf@b©â_£9„%R‹BѪ‡@îHtކ³î`$ Žß°š ±Œò#%ÓÀËZH‘ Ø©4„Û‰,ÍÅlìYðèB0¤ ‘­‚€ Á)_Ô% ªÆBÜéGVª¬ÃxÕR`å~hmX 4%µÓ<2èäg‚ì‡Fú‘팘#(:߯„Ð@s¨ƒ †Kú@3± + Ð ¸@¨/6ØQÁPøÈ +ÐêCÔ‘&——ârã +"Œa}ð‹('‹‡ÊHÐÁ˜äÁz‡…C†[ / 0#ødÀOrÂT3X!¨Pl@EËî¸Ý'Ö¸~F +ÄÓ€g,qcZ “ò³1S“ ÍÀd0€ÍÊ@f¸L†ÁC…Þam D{6ޝ“öÉô->°HA QãÂÖp†¶ B€€åä¨L ç ÄÅùèXÀ Ø dîÒ:ðpƒ´( »ŠÖ1}ä¬È W‰uŒc‘Ij:£Ýë‹/|¦¤œA'` Ä™EÀè¢<þ´@.íã°áWà8dË…‚ŠÛHb»L"·ÈœAôù‚AÀ76Dvƒ(‹â\m˜ «cçëãŦ½¹æ ®(7Ch)9 + Üzä:B—!RAl !4ÚÐåØsýs&Ñ•Ü ½‡ÔŠ r'€PGø’»WÈk”XqÃÂFcËk/ÌùœVÿr]sq*QxL9—UÚ\ÒQcú§Ž÷Q+ÉkÕõ`<êx“o(¼¼ %ÇüÝ|¾²jk¨ÚQn9²‹ë:Þ8Ù›¸5×¥zv‰¨œEµäßJÌþÜlzúÞãÛî U[nÝûŸè]ûü·D19Ó";x%†‚àafCYA:ØI!샀,‡O!<6üøì “KçGž$¶Ò$¬¥ë—½‚ˆšB¼&r[!Ž-QMïµ +ÀDÎ +œ`óø ´0´¦ñc#4ŸßO0~ÆIq®üáßÞAGn’i5¿`ÇòûA)Ÿéå/æÌÀ ñCœÅM‡ÙÇøŒ•:m l!øˆõ‚d‚]¿ðÃb° DQ+Fd ]Hä/2 ¨y4 +P¤àƒ7Ià +#´Àtð›˜~†;íy† +|rÑ ßáŸÄO@‘ +thkpâÀDžv‹@u,§tUQþîCã "¤ÓÜñ\òiŸþe?4 +kwÓ„¿‚ð…ˆV ½€s +´92“AOr$2Ü(”õ|lÙp4 +Ë2Øø þI C?-·R+ü(` + +"Èi5ð]¦øù_|kpéBDÀÏ›ÈG=ýË~( g0c7‰ô°<:?ô@ˆàL_y`ò1œ&‰@ÃÂù} ˜©O þí9ða7Y(ðWˆQQV +3!’ž“ظAyÚXƒƒš£‚~@¯|ª §=šÙé_Ž c–HQB ö¿ö€i/Æž™qüdq›í_§–³åú:·^îV‚TFrˆ ùQÈÊ pV(xn@~¡ àËQ¤R)„$?×òô!„D‰¼x?²uÑtIQ‡M$p°€úB$Z*.Ž#·ï™#O„’äÀ{œ›Šm~Fä§ú ìâ( ‰s0rÛC ‚àôÚaz¿_9L¾ÒC`ûÖ^Q&Ž!"KC"IIl +›˜ÒÝ $ +!“O ì[˜ˆ0)yYAƒd£QlœF‘JO‚;,BT\mnJ$Œ SQü{pÒ}4gî1Xh!ÓøÄH˜?ˆÈ @/BòñQù!J˜—•7PÜòÀÙäx-)ìívp…M]ñvïÕ?îWüÞ0~¶ß.O6[Iš‹¬@A!OñJ|î•ÂY3¢ñƒÄ}‘ïMsÐOoO+΄$¸‡?çýå uõ ¡í¶Û墻üÛŽ¶f¯Ÿì­ÝÛ^_ø‰ý×6±f{ÝÑr°Û _jËÕãJö"B @ø¡Ö[°³nj¶Ü°\Óê¾eoËf'ìlxhšÌæè¿õÆ@ƒíQŒQµf‡“íuª·âãåj…ò\àŒ¶< ãl8¼ÎöþX®¹Mož»}?k@•dÎøãW; 3³‹- èÉÜõî@Iè«(©ÿðT)ß/‡¬Êãȵí_óÙ¸{ÛízÒ +áÊñ¡qb Vîe7‚"jÌl¸f|«}Þàþ1ú³ýsÅòm–ŦûGo½‰ˆ—Ämÿè¡ s¾1z°QiˆÊùvüh6Ò¯ÿñ¨Z,¬,Í–ƒ);Ô…¦}S×ßb‚ýÉb&õLh¦ÁnïñltLTÜü’Dñ{¤ÚHчŠI¯?cuq†ž•þÿÎ +á?ô‹ÔöïAðhž F·Ëùß@üý[I4¼éÍW3éPàCý”ú_Á7 ”×û÷Ï/VÞŒþù7 ïÿI¾™Mÿ}Ä8‰’‡UÔª“þçdˆ;½ê|Ë¿…ìv}>Æã?9»?uÍìϿɬЦ}rNc–?õôÄöMÿ³sûPüöäôþ¥OýM&u¨PO ÷¼Ì޶ÕõZ]Ó;~éocL`)ÙXîÖ6‰Š~þÖ(¹¿Å8æì¶73ëƒ ýz0¦!+ÑEs¢ÖÜë¯v8Ùͯëìf9Ûñ凎’¼>cÀjÚ­ð±€[vÁ®¯kk•W‰\>R8Ò#Q]WØÍøºÞÛlÙõä/\B!‚ÿB’Wª»íj·=õéÛ× * °Ü[|îzŸìum¹Ú­öœ#—̞釫‰‡ot¨Ú¬–[ùos|õ7æÀ~È«ÞpïÛï‡4Xò5‘¢w{³‰È–J®»íò0É=öÐ6gð0±Ðuo½í/{ëáõoPן¸¼Bgãõ!ê@ÉLêMII¿'÷â£Dí¶ëÞb³êiþ„'Ãë0³"PËUoij™Ìw³žhMO&$ê–OÒ× ’Þ–…²8Ê¡S¢©ô<],Ó%Ðå'·#$Ç}Êõî sËúöx¯3ÃɶןÌ&Û½aÂ|—{šNõô6 *9ÒKÎXvˆ´G«'?î µ^®P™+U2Õåüp˜ya“à'Ó`gì`{À:y܂ˋ$º‰áÿÁì-'‹-–d¶únÆ®%šN8žWQVö‡XÚ¸&O Ë›=2j‰ú¡SBºÎΚË:•Fm¹™ ‰ãÇäžDHêÚþè~“:’ðû!c$+.Vs¹’­•èaYqâÇÃ77[ö{³:»ÚÍ6»(™A‡8:<òfþµZ®·ÈÛMl@LoJìŸ2¼×ØõfÅb +ÉÃv1Õf½‹ +1m6¶ÀP'^ËΖ˵Æ{ÁC^QN¶œ$ä=ñ8XL6cXiÜðlQCö_ÙÉz³ƒB'\<ƒ$¶ÉÄ™zA• §z9 /ÅÎf™m-«$‡>Ž¢ v°\ Åцö82• €!u.'ŒVOÿ(ó— ‚¬„i¢Pë­¹#y7]h;»\l7u¤L" _âzt0ZV{1ŒvÃVh;j¯™q~ª®•pu´ÔŒ Â$`×X×»ÿ€^@ç?÷ƒ#ÿBöÎ`6YBAQ½öûn߈Áí'ˆÓåÏÆ,zc¦¨ÌÔþ`(HjÈ‘¤ Èpú‹–ì¨T %Øò–ù%XJËE^ìí’~µÖh]Rà¹ì[ª÷‹GP]õ‚&ö‰;oí"Åó°ë!,\—Ù?ØÙ‰¥[a6Y°×\Q¿Q“Ù2n¾·)àÙu!½ëµ¶åå 7C:QÒZÜ¢‰”½×®¤ÏCx‘<•ÝÍf{ýÁµOÌ¢€hš½Åvr XéígH«â­HCÑ"TDÜŒ¤#;‹¤º °Ìq^Le9dO..v®¥k«J2˜â³½+„.Z_‰Ô©¥³è8 `-‰§Eè¸÷œÈÎÞÏJÒqfÞg‡µõr4™±‚(SŸîU:Aå£á‚àÙ'¹2ylçKºl'ƒññXƒš‹!‘•š²G^ì(¶ •fMq4ç´jK)›iœ^–Øiê3ƃ“LÙ§Þ¸5aÿ ÌÆðV¤ô›H:ï­Óƒz+­†a6@¼n¥–bÚVg2ÔRÎc(¿T­gL‰â®OÈqþ^zŇ_ÈÄïÑá²è8à§çög4£ƒˆ¸p†fƒ{«Œ$øø-ìîG0$°ÈëL­q>0î5=ÐÎŽ—ˆäs£÷[/ovÈÞÉÙ$@𫏇Hm.–‚}u=Y`+¹O‡°ÕɸF¤V¬Iª“PL)£RF‚ï/Ö¨MUnô‰í5Ü‚ Êx[œ¡–”jz¢ehE4Cd¢ac€)då¥x+¯.³òdm«¼vlJ´£r›†ºé¡@û{QábÎÞ¯eßÓŸlç=¤:¤u BqûÕç|êé#)¹<\x{/fTÛÏÁëßµ'†#í~·aޱLÞÏÑv+8zæ´E@ÙÕ§Û± d4 O5Ãáž~o½ÑÂË`=ô n˜õVž±Þ†œ1qªÑæpPF£µèŒ›“^/"Ýbª¶¬Cv„¨P¼Ÿ¨Ô'š14\ÎJVi6[ªè,iš=íõç ¥< +t΋XNª]nIpX¾“ ÷Ðý*°W|0IkÒ«ÕڃêšÓE­ÆK±âSo÷Oy;ELÏÓZ¤ØS“XÔb ñDÃ!»™|.ÄKq‚™ÑK ‰2P@oÃI1™¨Ø¶Ïowé•r30hN£]Äz„—°$B›’8-¶žáìÔZIG»­™‘¼]®ôpš¦L“@Ò£"ñ̆>WK¨Ú˜›ÿj=Z +Ú\ÇœD vb)6Û¿«ÕPc!P»!êè£Õ› cD@Ü0´t#4âÇpBÚnÁc=2ŽeØ`±9ÕÓf°š ä1eù +mvýÍ'&ÐS¸FDÂî#‡ë6Û÷¶&Cvé­,Á=g;Ú+™± xDFšžÕãÀKOaz°0“9X×§˜Ih(¢Ð ôƒ!ÙÁIZíE‰0ö‡üT:ÈÐ Mø!µ—ÄR ½CS*R|©ú7Bñ*¡!†È.û"PU¼æ›#ÏK6Âðºÿçuz=AÕ Ú²º9Å,ˆšVi²-µøe–-2†5tÂ`îAK, +B+7ÚG”ó?ûWtŽ\!“Bg…Ü”Ga먱žœ +q³õp½9-  3‘V8AʸËÞb±Mòxq«}n³ÑX®ån18ÕFj`«xVÿ×JL Jë-6»{ýÕ›kªh¼\ w§Z –§Zl´ÈZ iOÙI•µÜ¼Ø;Ñt6ÑšPûŒàˆ¥v+¹Å%ê‚_ ÷åvÌ®Oõ';ª4\°Ÿ=ÑN5­l^CÃ͸7d׬ ¢VìQ«ˆVÉzŵ¨£d¯‚¥6xxJÍÖGŽ2Žó(5ýTò©5È@§U–X´/9$ LbßîZ´ ÍN@a åÈ4΂Ú)ZÄq®7­@ +)o|—9Fœäd`OÓ;˜ÍöÙZT…Ú#[áx?\Þj ë°Þ°¾{ ¦›édvîbªÁÞâê÷öS÷ñS[©àþAcŠ[Jɧ¸ì@Љ‡P%žæñÆM(a8,¤å ˜à1˜KÆÙ7"Ë5ðÇ[o;|°Zñ×ÌÇ PD_#øk’FîÐ×*׸ù2£¯ü5| WðÁfDß&‚µ¯|²GÑ×&€ÉY= |q VÆzÎ<½§á“뽞IM6M/úЇêO{êî |p“øi6Å®¿Ñ×GôÕùˆ}ÛЇü ù“Ô¸¿Æ_¹Ù„`lÿ\hM:Ñ¿/Õ8ÓoÆìmz—ðÐå;ôºk‰æ÷ÆœÍ$àÛÖÉôo¯é‘5oN—vô;ÆÆ' Ýãp&L†1•.Ð*}ó&>Zdý¯¿,«›u<(N>M÷ó •1¸“Þñ<æÜ¯ ¼Žþƒ-áãˆ_BÇô…ûQôôf Ø1®]ü#z~/ÂT­¥wø}:Ù76†ÑU»ð¤PÌ`¢I>4î‚ôÛ½‡Ì%Ÿ_ê‰úðÎ’ÌxM><"›çóûÝ™ŽM£ËòÉ‘K¾>’ÓðÐÿ~ž$E%t[Eô†z¡`h™~'æËÏ]ö6[¨¥A+5‰æÃÎL¥LÆ¿ïŒ3SÎÞè›Ý௿¼ÓbÉàŒm× ¥E1œh¸â‹Ôäsˆv–˜ù[Ì“f7wLæe”MÆÃ÷_Soiäô1óWòQ6žJ¤°ÉW3}µK”žM#XÏ/gÒzxM†+t—œÅgtræ7÷Æ»щõ @:§¡bãC`——‰ÆÎ0v&3Ô(— ×ngÃ#ñôhhí¾Œ†§¥+cxéFÇÌÛÓ#cx˜½>š~—¡ßª7 çÕa4Œ• ãeok˜Zˆ¼a~þ6,«žœá{Ðþ6l]TÞh(ôvFÓ*Y1Z’&‹Ñ6~z4:Sw„ѽ1‰J/b¤ÉÊÀý_á¢1xoµ#áÅ›1fíÝãëçocj\o³ï%Ÿ±Ð)ÌŒå·|ÕXV|Æúìaa|ܶšÆg:zKÌŒÆnÃÐ5öçz)PÆÉ#t07­:ÆU-X@`¶ÖÇ€ÉØXߘ,¾»±É>é·MîF o"éç Éo¡¦à¼·1Ý~DF¦xýëÅ”¾/VMù‘5•ÛÓ¨©ööà35¿¢nÓ³Én5uB+£©Wë­Mìgcnú¢J_Æ´¨§Æ¦%ñyc¬Þn¬®Ôçó=7¾!"¥¯¿áq~zë~ßÄJ+ÃM*MZoòtÂ}Sq¶ý7u×&zÓö„s7oÞVí¦6½ÞŒ*¥ñÍôc³»Yms³!²‹³åé¾lvî¬ofò¾·0¶ §ùöÞ3'‰QÜ?ŒÍ•RÔnn0ž¸ùÙ¸}2¿Ï¦ßæá×$`þê~ÔÌ«Ñ`n1 {>‹u:|°x,ó•ÅÇ#–p|µÄ' €±ä­’¥ò4]XšWÔòòë[zÄÄgùdý¯–Eºí±ìÜö¶Õ²i»­nÖûdõµ:kä!òfM––>k¡ÚZko±;k{b[YßwãŠuxvZçåB׺Æï4´Æ¢›gz²B°-úÜÚ2ÙÈ“­2ÒÖ\4,¶··ÞÀ6,®Ê¶Y’ضɒÑnM²»7å¬Ù™r9f¿{ßxì¹ïôÆ^óL‡ö§bªmÿXJöI¬‰ÀØ¿gA¿Ãœþv:<–W“#ÐI;îò¾©#Oß°Ž˲çx^²ï0ËÞÓIçÕ±]v_vûgÇI—]g$oì;ÓÄÈyïJÏœíÊÓÚÙ3nÌίJÐãÜë €qÙº¦¤‹Êî]·îå«+³ÉN\ÕÁÆäzîÔh×àƒÎ¸æýiÛm\4§n·9æt3aw¸ÿn»K³ÑÒÝò¿Ñî·vÅ=õÔÇîÝç áq&_+ž€¥?óÄÇ+ÆSjÙÚžVùöÆÓ+=æ=³âbæ5é[¯»^ï{ƒC“ß›Úåß½Õð–ö¾<ß½@Ž~ïwí½OØl‰[‚~4M‰;/K·5ÑúL·‰þí'˜4leC’÷v/mØÇd¡GTÈÇ%C‘}2µ$ùZ‹2Oµ:©Ø23£J©÷gêÉáÉQ`ž2ÔwÙd¥í鯂øìtÊÿñHטd‘î„nâôWù3è3¶«€ñy·)§/zËX|Åg§Ñ÷ä¸ÙúØç›oCßlüΩcëµ£?—J™ýÞªÝ?pþo—ƒ 8É»@üȲIo#Ь7ºþÌ6 |‡ž-ŒãÍ`Böai¸Ü{é‰iŨ)3\/Ìfˆ”M¥ÚÞæó«`)•ô_b‘ûà¤ÿ +™ªq*D±¥Z(ii­B™ñm能Î޺ŽÉóC8œ5@|ÝåÂÏìxž4£i¹)Í–_*—¤ÓÖM¤™î”#ÃvÑÙöˆö-a3ùo㩯Émm<(Üö‚oöÛïÑËGÔ}÷œŠÆC{ô¾7D»­›RtUôÓ1W®´ŽEÓýNì¾ä(ĺ/D±Õde¹s»SÓ»ØýºsW]•kw½¬+}·^õBqo5ç'ÚoØÌ†øp>]% ïi‚î½N™áóg¢ýÙ%¾¬½qÒz;ýJ†vódiE¬“ïÉœ)¹Zœ&å¹wЩUŽ¥Ûm15êçZé›§Ý0ÍTï7ébÕãIwÚãDzõQid¼–Ø$“ :ì™Ç7C"3qÌŸ³Öö×&ñŽCÙ{vú˜íW·›œ!læüîà{®`¿G`ró ’ûvÚ×y"TJåÓµõ4ÿ4ÎÄòsÇì³àj–b…„ÝþUx|¤ +_¡ÜºhßQ÷ÅkrÍq§8n±±’­úº)E_Þ[%púC <'Û²-¸~.G»:”¦Ü°&åqëõ«b' ­Jl’LUšªò•ŒîÌçø>ȼ޷ý¦ûûùí[ºê©d#Õô;AU_;Wõ;3µÖ¨qÏT+ܽíjÝíûöÁÐí‚Ù¥ñ¡²™ÌÃȰ×mÞQ¿£¿˜z+轫Ïï‹ /kylä¼õ~ã½j_5 Æ7g3ؼ»mÖ¶jós;ê?:-Ócòµ~|iÄ×ÍÈ´å’­Ê8Vi,™¯¶=Ùð˜vâsôØ~ šíõ(–y +ä;_OU§-òô9­ ž7ÌsºóØî¼RÁCo2z Ëw/MWxù2ÏØË¯ähãx-ÑŸï¯Ã÷~ìÍÞRæÉËÛ[ë: €éDîÃýÎãC£ÜY6gÌ»¯0½W /£÷ ãxìz3Ý‚dºƒ§±óÃî+ì>R rúñþºôn +ý·Þ]¼Õî½ÄkÞ®P{èGêµZ¿5lÕúkG¿>Þo[fÐØ¯ƒe©Ð\Ÿ_DZÎ[¯vÖW$ül-ú’dg©H}Dç¿£jûi7šŽâô'MÑ…ÏjÃÒýœn–†1ý°ˆŒkÞyk<›®×ß›=2yx ¿N÷ed˜~jƒÂWãÍ9ÿZ}¢Óe6œ¶Ò fºùZõf·™‡àìyG²sãÓ<6ß6æów*[\Xm!ë"c%ß/]ºÏvYÌÓí帻]QDÕ´ª5º«¥ÓP0ßÁ˜ÿ»]è×ÚîãžNkÝu0¹Ý< +ý¯˜àm+x¶i\dvñ‹ZNþÅÎjìš»ÛJW0Äö*ºBëZtع›$JÁ +¨¥³Ý}±‹ªxŽS½W÷2a5ƒngäO+‡ãöC©,Ë>*½üç‚;$á8AJ¹ +uÀ•¤¡”ÜÅ–_„…Úr6ü©ãýƶ·¢#•4vöƒ=õh÷ëCm÷é/1¦ýšëÞjuª%έM + -Z‹|ÚéhËMl²ÐÚÑÝ·ÍÂZ·Ù>JˆÜ¼šc §ëÞš½ÞŽÙk~ðzÃnIm®ÿ9f×›Þˆp{‹k1cFêmÐÏÜmsáPØå¹~Üà.᯴³?—»ëÙõrqÍr”‹AsÝ}¢Ûó&@®kvxu³½Þ.Qöz‚sàz׳ޟ¨ˆ ÖH‡+mÜìc4¼Â"S „n8h  ”Œn9ÀO6×»Å]èÑfÛýòC׃õdu*K²Võ;±Áp!þÄZkoaߺÎ~¢2/Í É0’â ÃÓÍ›š›<éÔûd ¡VÓæz2X)ö.F…<'\ uè¼]A&•&‡ªRS  5/¸äe¿æœÕÚ‘fà«Ê à +úmŠ“4Y–ÔMQ¨ ÑÞÛ²ÍñnÞ_ô&3Q‡æTDéì"´© P³`A“L¸-~´ü’üqu¼aé™Â6œ‹-RŠ;ãQŠó²² ¥€þ¹\O˺ÓTö°ù›êþÔŸÆ  ßzúÔ»ü Éuä4*º0R’§’O(gŶ8ÙÁ§¸¿&Öý‡P +B¢¿üCƒ—R™;ý*rH_Áûù[Ý2&C\8­X´XZ Ã¥Ç(ïN*Ë'½6“Î +¶Ÿ‘JaZ{2švÖÎã*ýJMŠ2¾ôk/j)ƒUkG4çÓeªª,—‹;1X/û½m¹÷'»ÖL‹SE’ Cµ'*㣙žµÂGæµ)Ä·.,`…ÉE‘êT.ÒSáˆEjÚê£J¦Ï[”ä©ìxõ(¥\•¼Š3Þ8ÓÑÒ-kdÄt|dhÆÉ½ÔÁÕ³í뻫Z^·í¨5Ò{riKÕŒ¯sóqøsa(f .›55éy67Ç|&` +Çs±Šï.\~³VâëÝ€Éf¨JÐLú|&‚ؤ¿ÒŸ.â&y÷8â·®Õ&¾)Q^” ë}«â6ù™(Ço}l#5‰ÆiÇúy«<|€L:k3/¹mú«“ô½¸]‰ù²¼IÛ±30í²ißM;ù5³¶LzDûнÝ0¡Ózx}K4Sž–:Tq»p'~;ÍvâágîL»Ì»¬-7Œ¯ì0gzÔi3hï)fSìÎkMãÈ`Л¢OgfTs IÂÛcÖ“›ðä½8LÎÌwV÷Úù¶K”–o4{üÅËÞòŸnÛ™×>åÊ|p½QÏT(ø‰pÆb•¾ûŒòµ£·‘á×ý;^ÍÈ¡¿jÒ¿­’ÅÃ:ÂH[´ŽZ±>ü›ßLw1ºÑ®±/ðø$šé/gzä-}gz=ëM2Ð|¸Í§»±Ds<Ø&j7ƒJ¢IшLçÙ/ _2Ow»–8â•PëûTè-8ó¬óûE{^¦GÌ£úíÙ1S¤Í­êÀdº¤³•ô=³ñõzüè WÚwx•‚þÉ:+èp9“Ëл›Ò©‹Q¿G·¸¨+ôwFw¶lzF&‰¢? rÄ„ë(è/ã‘æÖ˜h·»clÊVS„úýê?­ è7”ÑáûöLrTíê!6k³¬ì©q þ’é·Ž4»^»¶FÂa䀎r.Ñ-’˜ænÝYIJ%OºðÅôx)À­j°ñ=/%ªïÉJ65* ²ÔfSÃù3–¤ +ëKÎѶÐy`[޾$óMST6”#à{b«éÜÔ̬‡[œ2@ŒÂíåñxåíðɵͭŒýPÈñÝËp)l–£Ôd3 `Ñé~­QvS!/Ì+†-sàéºYÅ-¾÷P?ß@¦ÑðÔ\vä¶Ýá<Ñø(¦½“¨-Ëu0²æ‰feùo5 ½l&øð`nDæí€‘UƵ¼§²–@ø ~Ê ¦ß–=Ì(³'¦-¯Ö2Èʨ5QŸ­âv½<ˆB«©žD鹤Iô}ƒn¼ÉXª©òw“”¨‡%=JXß%*¡žÍví†1žà ¬åïËžîI5˜J4èu¨ÕÜ2ãj¢€È‡6°øÓ3 Ðø)Ÿ\2y¢ÉP“fºTÊ»³·¿?ųùt,¸öÍJÜœœ Z¯WQ™àÝÄá‹·ú^¦–¯ÔÉþûc‚¶n2”ýæ=EæRå8úJ'£Ûß‘.[êîð +µK_âšâßÐ×$’)ü&þh”©ô4Š_?@H¡ß’\W‰[w–ñ»Óuªû²Ê &·HB£öè—ôVµº:âÀ €Ò>â‡áÇoDp4œš t”àƒfÊÍ !¨‰~‹àÞ0¸9–Р• â¯{¤¡.R„â—"è)žÈ€M®1‡ÈÅgäငFéÌ­x6 +Æ4×W÷bÈVÀȃ{ áKèO£JŠ‘(ž—ðwu6™% S"<Íeá?æÅA¾ò”¦H:h5.æ%ЋœrùÙ¨â+ÊÍsÐ#QaÖ¨qU ¯2–04Fe3= %,íãN:œ”ð.~*ƒº_Et#YÚ˜@¼¸1BFBe"‡!Öb„#U~6YŒKܯ^t‹¡I4ëˆ.Ç”¤!žÜGÏ#F¼&<Ònð(ë i¯âOÜæÊZžˆó/šW„¡Ä"Q}–Àà,­dú#Ñl•Ù8INQ€9×´øm‘Ų{0ßf»Û¦#!jg¦õ”ßë6÷ÈÆY +r7JÜ4ò8£´²S休!phJÉ€lBû«ª»ÅD^ÊÙ=½)b/A:%'vLpY$˜ŒÛ5ò¥Kwß>1˜d—MÔÇDc[˜gœe¯Mút–‡Ì«½ÏQ· î¡ðÚüNTSɶlx«k.Á ¸©È:“ÎUd0‘Ác=Á¼ëéâÚñ¡ÔAŸï¥ö²¡ù±=š§¹M•]ó6a9Uþæ9¸m×BÛ¯À&ÇÞµ@½1Ìc‡-¥G›†wR{“:óâŒqš2¾j{Kª®€{K¡¢ÉqŽøS¢šMµ»©ÉWÀÍÍŸ`ú:H@KìƒaêÃ%[0›x ·1ë]!‚æ{ûïåx‡ÀA,ýé¶ßqèØpUkjì|Ny'±h˜_/)ª$®Ê¨ß“¼e$ÓÄëPËã%¨´ EÊíó4*‰šÏa‰qä.ðA-?CއàH}ÑPCS¶”‚) Ùn,”Î=3#ðÚ3Aå|y¿û›Ì‡á)-³üñ=:s µ³iÊ>Ìp¬ˆÝY¤Bœ{¿µLÕø‹É¾w¦lf±û Ì¡ypO·®ïk”‹É‡Zfó<¿ç»gsâá¾ÑʦíÃýæ—‚™îú5¢\ê¯OZœ ^¦hmRã7CØËu»{úêx`=¥ä´âÿ6˜7Œ¢2ïÉ)5"<œÏ¤SîÂ_„¸r + _4o@Ý‹™xåypÞµzß{M&)=ÁŤWÜð Ö&º¦â†^¼QÛŽbáð$ÓîÆ›^éЈXóÞƒ>š›LwEöã‘G«GT£ü3cd´«}%š½g€žÙ·8 ÃÉ»²Zê@ñ´Yv9R£òд¹gcqo:Ù˜–!µ9™  Kºïc'ÙX4ÄÆŸˆ ³öÚ,’Mû_(gì¹ã8îRG4@ÔoYÄÆÉrwŒQŠÖ&(îÒžúЋ:«0f)>š$è^}/'iïS$¾G©•õŽÙ÷„Ò ?º\:Ê‹ÓvÔ4?•œWcH­IÌ‘{_²º£_ÝõMÆéŒD*L >DPÓw0nO"£|ÿ3~ÊŠ»âä7çâ‡ú(´ø­ë9Ç‹ô9ß”°;¿À¾DÒìªZÆ6FÀTö™ÐoTºÔ¬øLkVn‚æ»»Ét‰E'=j¦Q€8ãZVv <ñšÔfv™ÅG3?ÍS®!#³ñÞ·ÍrñcÈ}<ü[[|ííµº·ž¼G°êmZ‘ÕÃ駨è¦ì³åí1ÛŒ½r¨Tì{+ýi@µ/¬ð­×.ì¯>=d¾åâƒeFvZóæÛµ-CvÙ3²_.PB•‹}ïNÎæÄˆfúˆ…«ÏñÈ*DOŽo‡×š2Á‡¥CµnûßÇM^Üi"ôbͦØÀ4ÑL÷Èä,h +”ë{WfxÑÄÂæˆ–ðîFtðô +Ì“®$êÍø÷1˜6©I´²‰‡³æ^à.ð”KݧZw³1°×7Ìídðš. 굤¯MmVÿÝdeB¨ÅÓF™Éû¯o*T’7eS‰ØŽñŠfÓ®¦ÿfäÆš&2ͪ†|É9L3I¨6Az¡‡|)»{ájÌ6ðÓš­»iü6¶BÛDÉÙ‚°(ôÁ&§Öm1é{6>æ£o>«®¹òöŸ¤›ç ƒ™îÁ=É,Å ˆ/‘~,âJ>àdÚÄKHè#L ÷Yûsm›(=“CÔhé~˜ÎC.ÉŽŒÍB¿:ý¤1'’—c¿ˆe{œøuÞ/¿Ò£Pq–î;&æPùc}›MÌFC• "´!¾OyßÒ¥Ò­—³á¨‡†;›!G¶l8Q7îWµmEÐô¢ÙD,0¯üéBof>E³š°Ó©#ÁêI— +Fè’qÒ­kW{ÎÆ‰m~ÑÏ.üÜGôRˆ¢?€ï‚¢~i‡ÍÎ9 L“yßoÅͲ-<‘¬­0O„Æo÷¦lºVidÍ+È™6û§“/>)yë> vÞL0 S*ÿòñ[·Ç® µ²äPù Zeècf3M>[ò1cÛô;H¦r|× ^à`÷³:˜F9IÙGMÅ>HkqˆëRb9®:Ä®•Ëbê?8…š pˆÛ¿â´^Tº×Ƚå̹Nˆfº5Þ–³ ø ¶OðV'¶¡ñJÚSߊˆ7p-³»+Ö‘Ï žF|†÷,#lhÐâ÷ñÅGñ\űŠ;*q?ÿ˜ÒĪ|5em¥\H¼Ò˜dÞLèÁ,Ñè¯FœCIŒŸÉ¹1ø%2 âùÕ÷=}ƒÁ´éÛy¨ÖÝ#u¬`üëta>Ù€KÎaˆ³@ö£b©[Õð- +t¥*òIyÍ÷†F0´ô2ýeÞ}¢]ÓÒîdzcrî´ˆtöÒD6ÉÝý,÷D” ëMÄ€GsE +fÔ……Ì;¾Á/Ü”4¦_këSÖ²[±Iß. ®8ä"×7™Û‚ N=™Yòë«O†ÛtÑfË¢ýÔ·ó”˜õæØbÊl-Ãtm¯*صe%ã–·pצ!¢>WâÁÑ9˜“bá\Üm‰ÂkîVÆûÙ€Ù2h†ïßû»ìÇ;5G”Föæ_Äe“"m€8žÃ„™˜¾‚®x²¥G–•)°-m£ÙîÌã•‚™¼»>aE6&üîl %§|mhû‚#Á×Kø¬Öeˆl—¼‰`n³Ey`èzOñýɘ.;ßiööÝ(,ç|ø@mV IÞ¼p¿jÑû:z7ÞW>Ÿín;îlÜÊ6¥;zÌ/¼°Ùû 5ÐÖq÷8]¹ÜK°ù–é7íô§ß2‘I²ƒÛ˯ƒâæD¿,¼(ûme¦Æ¯·ßÙD-¾ +W6»¥4š|“¡zzêMÓŽ‰wÀÜÒ6ó2*d!Mܤ¼ßÈ"]ÕÛ—g¿æ°ãV{ašyo6½KàíÍ0C¬îtv‘¨€FmÚ“ÓÈ­›7[d]~‚°kìšC!„“Œ|§ƤߞEy6™a8ý)|ƒ¦‰Ç4¾ÇD}YþľíS±cМ´Þ–3®NÒïRs!¤‹ñÚøm‚ûvÓý'¶lËçž»«,0l¤‚ýÃñ‘Å(ˆswÖX?äïÀ º]úNâ1BªÔƒm‹¨ê6ðXze]Y3iïú¡îJ #B<®ñŠ ´¾G ¬!²æ2–u~hŒ(-kyù\¤GËŽšß¼äOQT¹™ÛyVï‰Ò‹=(J)°f;ã{°š§›!ÚUŒd»®VX>›CGÍÌR¦Ê¥}¤>ÇY+ÚCJ}è`È%–ß/J©¦;“g“dë[áb¯UP q¶À6®d­9s6??øMàAµo<é¢Ó䃞mo2ƒ¾kˆÓÚÔÿóÜhA«ßE†Ü­$FÞaâ‘w÷.ÑL1]ðL‡àˆ{ݽÄ2Áf…Ñq½Ð¶D$é<&™E¡I¦;Ÿ +ų¸w߈ŽÚqr s–X©|þ…êä1XB­£3/ÃÞMè³½†ÁæÑåI251¼¢z·ŒÓ1øN7îVù~CÊA‚Ë07‚3ðØÏ¡p«™¤¥iÅeÿºŠËF6еhGG/‡l2LhŸîwÔ•( Ò&Ôäp¹}è€Þ%×N~´¸ … Q”Ä(;ÙzÕ[NDúÉÈ“Åt¶Ùz¢‹$lÿïÿùÿ?ÿ—vf+ÿÚf°­¿e'êÓëòd³Ubt2HA[Ï_pÞΞù.‹œÖõ:í'\«ûb¼ÚÄ‚ùÛ¶'»|ñµ2ë·"ý’}nf£‰è€t$˜á­²(fKÅZ=Eä?ü^êï’.ë¸%‰ÏUGŸ’ðÚ[‚CZz åo¾dCØ:Ö4eÓ²&ï&˜£îLùwøš›CËszÒòf½ŽlZë·Y°Dx}  \Nð¾ß`ÎüDÇl6x“\ ÁTL¯;)GÜC—ƒ;g,g°˜ÃP}Ëzc¡õ!­Ó7À¨Ñÿ·cE(B}¼ÔÔ æM³¾÷E€Šý/ð­áucj=×”¡>D­±p굨ÕønU ú‘c丹óU”§ë{~"²„£¢Õ˜n˜ºý^ *‘m¶ÓT´6bÀ“¹ÖH$Ô ~9ÓË£2Ôœ;n-ô=OJPÑÚ¼}õ<àšÕ*[Z:² 1T Ì~Fº´ÏëU¼GPíÇëêyõE+)'@õ¡½¿#‚z¿ÍªBõϪƭÔÞúÝbn)A0ðrvXX4,‡ºIth5¨yßòõy© õÖhÛXËCå<}1àõîƒ4Ûmw¯%¨ÎÛH]m®“é{÷Â(AÅÂÆ÷üJdK·5E$³óÙwŸ~P‚Jd—“¢*TK¥Êæ0T”Ò"Ÿ®ï™%r¦好oæ©·Õ¨ÌJucÍu÷~vÛ¨öOunº™·iVõ%F” !AuÍ5?ýf|É;ŸT¢<±*Àj°’yï«A}'ª³jCjÉúRòx–kTnThFiºj9ç+ùT ¾úˆf¡aWºÛ6ʹWt¬‰ât[Äv¢ +µÉÞ{ÇjP DëÝ“AE`8Àåµe3Üß)Bm»[U¨í„-bRƒ:!^\Q¤”§{_`¿ ‡Mj§o¬¨B†gÖ¢ *Ã~»#Þß>e¨U§qåi¯õƒ~²©B5>¿;¼œ’V˜î­Á°^gkSÕyÄõ§÷1z©…4²úލ> [VË®êSƒÅ™òïŸv×ÇH3ÜTbÓ}ƒ¾\("=—>]É|4$qêGÕ²w£b+ûí +dUeÁ ¢^=Éú(Þœ‡|´™ž’©¤·ØN›Øb#}çl4ƒnƒeŸrµ¸wkMeŸÞ²CÁ¿ƒLV‘Z¹É&ï$Ú·ÃZ3 àïêA¸6RÖhÍÍÙdÈÍ5f¢­ÐyqŽå,òƒž%vš·\XÁW~Ú!µ‚ˆlt«|˜T…Šý ¨½D®PG,úü¦ +¬Þ­ùAR‚–F®Ðçjn&†zk°‹¡ú7b ×ü”êÐb1 P‘ã܃`ZÕ?F¾ÁLªÏÞQ‡jÌö ‘]{Öîƒ)JËH°_lë|©Sš »™¶Oõ¦‹æ—d¦³É)¡“Àyôñèà êÅH“b¿»¾ £”ç@Ð?À—L +eÞb©ÊRè (8sEž]k #–à“@ÍcጵcôeÓ]½.NwgQ_qЧ¸—À±ç{†êì’%e9®Èž\Oarn£ÒäŽÙóÄäîÂÉq¼d·`^F"Ï®ÕÙ´æ•+YxP ùÌ[Ú-›’DèžòøÄä~àG ¹[Пú^ßû{†‘Æçóq#CŒ ¸ù(‡Tw'm<ñD+Þýì¹roÉ—PQÅ à»0ê½É°gÌ9¥ ˜•›j܇Hàö©6z'¦° ÿáå!ÞX‘ÐÆž a¨]ãéU5s«*Š›HöH +kƒÄ vûè=[Ÿ¶+ÒmÏX¡T§é/QÁ4!McY8R²,¹SÖ™D +ñ6´¢ ‚öÃéH~e•„ƒ©jJJÕÚ4¸ÕÖT:7†á¿ï”Ô£`WiU9¹Ô>Æ—C¬ˆ÷{kŠÃbjÚ3~Ž®1!CO]{VëQpB™à5Ô6ôN{¢öÓù‡k(ÛôâðÕr_Œ"ZœŸ¿ïÍ«=0å8£7â¢H#/‡4ê¢H£‰4^Sóäæ:ön?óÄÐÚËh;-AŸ²œ©äÓPQˆ(Ùºª2m{gÐm}+³çg^ê°ÿŠ=·w7gºÓxgW™Ò’O[óo„†c‘ GÅNÓFÁöº:‰ºúlº'xZ×H$. 69NFa$'8X6E«#³:4Ëîw +Oø=ã6§ ³ò8æ­ƒ^°ÕÉS¼S!…‰ïòΖ^³¿¦Dãíl>·z)’·l# € ¯‚ª®ì€ïE†C4›Îæ[Uï+yÍêcRB\@§(ΩVj–Mgk³\f†ô]«Yá׿Wˆ¬O+i9ñªXú¼5øÃJR­ð$‰‘õûéŒÈ‡Šë,°"‘Çãçøòé ¬¤õàK³+SpºtoíŽ,ndÌNß„V»Ón܉XL™¥Ìþƒ }¶Ý¨!í Ÿ£(ä* Ž¹ŠŠ`^”Ú÷?›œÏ&LNÊžj±¥‘È5µf D˜ŒìÉâNêvþhJ¡oZnÜ*Çõ4ƒDE¼O¬#HÄ“€nFaÛ‹Žp‰vl[6€ ðŽ’P„$¤f¶÷ØÌ^•0ÒÄ–öI*f6}÷è4â›Ó¤µ*ilkÔ‹Ò ä]øÁª#Ü«d%O.|¾Y•°VÔKî*Jc&õÌK‹ÜK‚"ö£)Éu š(àÂv*aQX*ƒt/î'¢ÅÓ4psÚÌ-i>U‚6é1sÑ~—4)äûM“ûDæà)D"ÙùC²Ç:QñO[êU¨«ðFßèˆÒ¢Þ¢ÛßKè§Æ·8d+‡·‰ÎPƒªÉ÷¥½p¾§¾Žt²¢R/‡¬!®£_ïsà^Ž¡P±r†.ä{Ky^õªUÎШ£c›ÌE¿y´9HÖ³Q‰“¡ÞˆË¨Li_¬ã”j”ïªb³±P¦ÒÚˆmSMéÖZK7øMAº ”v†yxD¾¨-Ý”·¾SG‰?—nÐUy‡“ú.°…z«~o@==þFº‰¤,Þ¤êåXº)RÚɎΖn‚%ëè÷Ò õ²—nB¬S¼uó l)ÛÒEÓò³¹íG!ª®l»¬Ä,óaw›ûO-[¹z3ºrÏ«ß8Û‡´XÕbRïÎêJ¾ïª–/pZè¢Þh½çÚ«ÄØ™·7uÏH'W·ö&Ç%:’FÀŽ{á…ÍéŽÎ̪PŒÙàŽtyÞ'‡£œÓ$Þ,Ö²×å½÷rÊòÓäúñíûX?ÂogûÞ*N!’iÞß:…)(O»SN¡~ýx:AC¬ÖNéÇž±ÿS6é›§ö%¬X9åøµ†:Ò²þu«5èèÖ¿¸—½rÔζÓÑ‘ÔúWSŽªÛDb~lëÐÚÊQ¶Søaw+èÇ'½©NªÊQd@u×úQœå¥Ã>xB‘½¼tCR<61BÎT‹m¤j_ÝÖ˜Àèàsèm¬ƒ3Õ™\~€Þ¦êøs„ø“ŒÓåH;Ëí®u™ÃBœbˆ +1…G#æ}Fòç{°4¬ÙÓF¨\Mõ725Åéo.%Fn§bìroʲãN.K£6¥J2Ï—Lí…Þ~¶ý£8°;²T¾P0¥¿Ñ‡Þ¯&£’ëˆÔ«+Ó÷¦bw B+r+! åÍÙ˜Tɂ˳9Égóì£Ì(;’º=fô:bÒ/ÙVÀĽÛd9³~vSΧ]Ë'Sk?/çÓ®åã7‹_Χ]Ëw…ë=/PΧ]Ëw%-]üy9Ÿv-€¹L9Ÿv-ßÕQéâËù´kùè¼H9Ÿv-ßÕqéâÏÊù´kù¤i ¿(çÓ®å“mHòŸ~PÎwzßó÷å|²èc~ȼw$¢«ÓαØàS¯{vçdc’©µ“ÃÚ)¥]Òd’{f¥––«Y6—I¼U +ŸF•Šœ–[Òå;„ít¡ª¡Ç&G•Ú;*q“*ÿã¬%޾zÀÆB¶Søª:•åÅÍPGÅŠVŸÞò¨ôQ ë ÄËÆ¤”@(ÛXÑø.m¾9§~OͤV$ÚãÔ^è¼ ¯Ò97Nøž‘ÉYAŸ“z C5èÝà;Hµp3LîYG5Ӊɘ³RLÔÊîN$ì.O–ÝŠ4ë £²»_G¶ž]+m@?nÔw+´½E‚N«gòèðy¤ ^޽q+±,zÙS®».A‘•yÆJÁ}Î1“Þ¢W‘„V«{íSßZ¶“®@›Èä|idè ´I7â|¢À¿ ¡§Áõel ˜×“\~‹ãigÖ£)˜cª+|u²¦PzºÂå,^›ièDý ¢`›Ž9i>¥<óþŒRG4&“ꘄ哭¡Zæ½<ê©u~ĉ5DQÏ+ÍŠ|ÝŒ:Ìi×äðVç½iÔ Ò•b>4êMû †s†TÌå¦Y±s6Ò4vR~€4™t;oš²xñ6öÍeKÊw’Oïç™”Êüµ‰ŠÅ÷Z•íUú8U·'ë@iom{§xÚ‰ÿœÕɧïÙöêýÁ¼¶?xØŠÐ +¼æå{¡ê!µÒ4–[µ<íD…^¥ýN¡µl4jØ¥†Ž2§¡J;Rà4Ft9yZÛD²‚½ÓúNmCã3Øó$Ç;tZ˜ +{¦_l^JS{µ-LõZ£SƇˆ O”@(Ô“ + #Ëò`§ÝÙ2ê:þ<;­³5˹Dl§Åû¼/Û¿QEÕÖiý ª„ +¶}‚ÿè@+zçŒèÖyћØ¤b~XgEo4ÆttÌ/P¥+z£æFI£7ôMhê•FoŠgEo®‡j+Öžà˜ÅŽÇ +„Äë@–,:£: +„n¤õ‡“ùžó⯣7¨N1BqH¸Ô_÷“èÍ•¬HÕÃý6zƒ ¥Ñ¥°.ÜøÏªB 0*I4Eí¡³ªƒðlµ­¼4öîÑ|"MG! 6žé’%½¹âŒ.5¯fUúõ±g‚’?Ø~_§–È!ujøÁ +â˜J%‰Êháuçk•ø%è*›'KüÎM˜Wp£nt°œÌï@Øaô´Î\y›Â†lCǹƒúöÛôVæ]8wðB•yün”¼8ïÒ•y? ´ŸTæ)&⚺ËVæý*VeÞÞ†Öèè•yØ)¼D•ºvežLtªõöÛʼ½¦»Näg•yj™÷®ÌSpØO¦ þ 2ïêtá¿®}¡ÔÑiÌ?®[ûEê¥ÜêDUp—J½|œí_IÖR¯q¯™A "ÉùCCÖ 2n{üîH»LØ^=ÝÑ/Ž8ø7¨#‚'ÏWÅu~f¼’v~Šõóê˜á7)3*¦%èãÇs²$ö{Ò +dߺL*4î +ƒ¹?¶”R¡Ï6ÕÎèlKLu¤Ù]¿çGÔ‹ŒäârS—©¦ÖpG¿=’÷¢#f£ÏðçzSÛÀU=0C# mU8ïUš•O˜ÙW²•U‹dß¾/S$KOù¢¿H–4Ê]Ë«_É’FŸ^GõJ«H¶gduTýh›íKɶ/U$Û¾T‘lû"E²m¥ƒ®ÅN¡ŽJ:é¢Éº–¤@(ä/—’ÈøQá kTö¨­Ñt§ö^¶(ŸM^E­]ª(ïê§]ÿ (ïêp¿§bo—*Êãb§½ü_å)ûž/ÊS ?\¾(מR£ñtQž>‹Q8!Y09Äë{Þé÷È^>qú½4ÕêtµÚ„S\èíB÷m 2:t ãe,›”‡Ñ·¥C.£ô©ž,ÚBÕjð<]Æ$" Y’Å9鮣{ô©š_þjdjóip/ºWë=cp'èwƒ»Ê {àSèÓ³Á5þj¢?qƒsà)\éz +ýAwކnKj‘˜ÿÔ]9sp__´!Ík1ÿJª¤|F*R.€»5Z´®Ðó¸eÄ’8ç-õù 5`2=®f¯jew/ZÅ~cöK«ØotßP…j!‹ÝÔá•´ØO^–lˆ ÊÊîLcVò:´Ø÷Íü0×£b?ŸýY* 9ª^ìGdCĽ +TîžÂúœzW+€Ó,öÛøÔ¡æ\-êÕñ=…¬«ÝSèÑ‚Z¶ªBE|³yŒT§kˆwÜMÉÒ²¡=|ü‰_ {êe8WmÇI}Ó÷Ý|q²Ë€éû=óT=ÙÎ?æ©O8ƒ>½%dVê~Èv|:cv§~[”R~ïÕÑipRãVa—é5}ꞃc.ŽÙH +yjÖ¬x”?¿ ›Èçdt©I­ãÓ]—¸^OÉ0ïF]èz½˜ÂÝz?Û¥õgbžÈ³A7Å9T2…ÜÁwá]ìf=ÕlmÁT×]¿9yŸÌñ ó¡ÑvÚ·+è“W¾'ýcÄëÈØÔÍ7‘“·È(dP¶äöæà ûäCDñêßÇlŽ +û”¼„ƒãq¹Â>¥ø˜$žv™Â>¥Põ!ær…}JY%G™¿/ìSªê“ðÍe +ûÎwÿ¦°O¡+R”py©Â>¥ª¾™?)ìSÚçáÃÝ—,ìSò®eÚó…}"|dªâ.îï +û”ªúT+V~^Ø'øÞ’óÓ.]ا´Â¢¸À¥ +û”ªúŽ·"~]اTÕÇ ›‹ö)­!Ç7-ì;e@]¨°O©+õÍâö)uuuúæs û.‡´“ÆâYHûYaŸÒ.\اTÕw¥»ÒKwaŸ’Œä#P—,ìSªê“+é öiT¬\²°O©Mìâ^¨°ïÔqº*ìSZ%Á¸½XaŸ^ßó—…}Zù,ìSbw‘’>UØ']%ÿY«t°¡¥™›TgÓ÷H}Ä™gN©»QÐùÂp†ìQ­¾ÊÈ‹yO™?¸ÅOÉ Ò49~v‹ŸšÉqò?½¨²ªŽI¼¥U§­ E:íxpt0ÖÑ81¦ƒPHà ò”ŽIW‹ c´†uÊ*81¦ƒ°aéfìSc*ûÞô +±ü”ºLÑ­ÜeB¥]'÷=õ…Í~wùßiÚ÷ÿc¯+^þ'CšîHó™—ÿ©D9d÷ÿý°Sàå_äCŸsùŸV>´pÿß/J¥¸Ëÿ~„ÔuùßÕ?te·üöò?!ÛŽIñþ¿_gðæ`I`øE„ÔcfçÖxÐwŒŽ‚\¹9®¼·VRÍ8>grv­ì‡3jú¤fùϲ»aáÙs¯P*è;Ú)üáµ}zªr¯N”Ç•T“ÏJRã<TôxÆ}c§Jšz]«Ì¾ân³kO\ŸæCµŠ*Üw^J|m~ÉT+èíR©Vµ¹ÞT+í“^WÏÍ™§(-ÅÕŒþR餸R»ã×øº§S¢SgG®G~HqlœSi¯š8†ºòè:«}íÇŠð©yÉã ¡7Õ.WÿÐQðÒÔ)ØÄÊLŠMéÚ -”®«‚DΦf Åá¨i ø9¬½I¨/X˜kÉàýaa 軳>™Î#íM×¼:/wÜLÕSfu_Þ$?Öùç…˜gØ飗Ø'ƽ\âÜÑ™%Š)#¸#嫯~PBáHDŽn¾8UEq‚S5PQ`juÊ¿Ñɧîý»ÒWïùÛ{ÿ®äUxº8èì{ÿ~lªŸw©Î_ý÷[6jí«¾/ÑÑ©’¦+½þ®¤éJ¸@P°Ñyë·þ{ÿdé<:«}{ƺŽC:ˆöݨö…^”‚_çftqõ<Žªsý¾ÚzÑ>Ûî¼ê{t‹ ú¦6Ÿ²Ã'À謥ê®ù~;ããЧj©¬ÑWÕ;êõRÉÔZئó€x…TÝõÑÚüøô<ÜÛiïþ` œrð»k]ñmõX§iËøž°š-÷9¾§Š{:«jFsX¿¿7@ìFY©äÓ³[^w+?ÇùGãàåênŸ•ŠnEŽÇ¹u·É§©v‚®hÇg¿6êu·òTªÅGÕQo[›ËæY©èVi7Jß‚z/ÃÔ>bÝÓw‘Ë0E²—¨»¬y”Ë[Þ(g¦ð&ª–28J ¢ÆÁÕ6 Žf"€>Õø:ÃR×OxŸ¦ ¯ˆ¢Ë©xtûX”P¾u…Jo 6õ ñ‚5/!F©ôò?ëÍr%Ö|’«élý›úTâ°KkäÞ´®á{w«B%²É@U *€áîÿ[Б®ZIà»ÔœÁ¯5—[?‹]ò’@Ów`÷¦V#§Q™|ˆ×EP5ri¸è22{T+ ôñ¶c¥V¨^…þ$¤jM^ˆØÉ«•?Læ©·ÕWƒÚS‚z… ÿ1’‰°Òtù²ÖÏ¢IªáÍxTð Cô|º‹liº1|üi_ºêh`6Áª‰ÕÓ¥±5èh·Þu§fQ¨…'è#‹tÏÄðºË&S¦ZþUµ® þä—8È Ùše.ÛQ: +¸þæZ·Õ™ÙHêõGâÃᤢó¼¸SÍròÆœý^¿M¤^_uVâ–ªŒEgÍr"—UoÜ PUSLpSN¸ÔD•õä…úËãÎKÜÒ¨Csž,;ƒª".íêÎBÅv*¹¡:f(q<а<ç#^yL’4’+Ù¡sç!ž¸ß(¥„Ø£r®Ln=»ð —2Ñ…ÂÓˆM?»Žêo~¹Íœ »Ò¾ë=s™Mð+®äרñ=19ÍÃwôÆÓž]«ß„Áöñ4T+§gŸøäEƒÊi±èÔW’ø£ÓueÚps©ó'QW‡0¥˜Þ‹ÌtŸw—•åh+o}ë6=ãÓîRžtö2'Fr{¨üO=1ï¼€AVéàñž0ŸtÏÎyœ‘0Ì) !ß#Ð[gT¿ÑXßI¢dgy„óçmWÇç§ý¢JÕ¨6$%{*µ’Û»¢š–ÓcªK‡%ÿ'ê5‹otœ/ »¶tq¢kU×U[ªR*¤ƒ"®äÅå9§ô&è_L¢®b ý‹Þžµo=?i§ª‰ÎCÚ‰Ðs¦ÉK· !U•qÉþ ×›ºå¨R’¨×ãåøæÇ%‰zëµÙódI¢ÞzÄÃFþÏJÏŒCÿ´$ñðD=â!%þg%‰zëQýÍ/JõÖ#^ýãW%‰zQÊ)é—$ê­G<ò¤Ï+IÔ°"Õ·ð´KùáÏKÇe…Wòkþ=—ÊúDñØ/+”:ÿ¶Ë +•Ãv¿¬PiÿÖË +1Òlé­Ô½øe…êa»‹^V¨\±rñË +Å™÷ÿÆË +¯dçªk Kîæ†súT«__x¨}Ûáï³íø µ 2®ôjuúÂÃ3NµúÍ…‡Âä.qª•ê…‡Ú!¤#ú§jßv¨LùÑ…‡Úá5•öó/<Ô¾íPAëJŒÔ¼íP¼Sø“8ðáÂÃ_”]"'òŠ/(»P1”Úm‡‡Åß^xxN¬óJ^ï•g_xøƒdØŸ\x¨T©#ÛîÜ Oôe.<ÔÖ|‚öË õ”Ç]àÂÃ}™òm‡G{?½ðð”ö“ •Š#/R‘/½ðP»—«Ó÷þöÒßÃ=…—¸ðP»,_Øôúå…‡ÚytWÊÇæœá¡¶/§Ýý³ •Y{Û¡Ø#øÕ…‡ÚØmHþîÂCíoiÌF»äBóÂóÊã.Ur!¿íPÝê<óÂÃ_IýjVm:÷`~Ý‘öy#Â6Ñ//<<ãžÂß—\°G·Êw +yá¡öm‡¼øý…‡Ú1´Gp‘ Õhž»íPš2òs~liï]+Ë´\xxVZÂÏ/<§lßv(óó äâžá¡z/ˆu¨5}j„ËDúFÛð×qáᙇýôÂCm·[6¿¼ððPF¦XÞ"qqõƲ•.<Ô6~¸¼Î \x¨}Ûáü…‡¨ÅÕsá¡®ZÜß_x¸ïE¹4ø¼Œ.… õ•ê+GÕpá¡v©>î¾À…‡*Êœ¿íPU¦{á¡öm‡âü_]x¨íÝ«¬Íùjßvø›X§i:.yá¡Rá•F…äO/`9¿}ªœs|H#‹NYD˜Pˆ¿jE„5òýùX§´Ž2+KJN‰C^æ™D Sî²Ì‰i v1œ·V[ +X•9¬¨ +/t,»L;Ù6Àoߤ˦Öë(•Œ=vžmó‚ñ¬a"kp,*ܨ8#³pÒ‹®qÁcil%2÷+šÈ†2q"Ûé䉜kW'ÊLò•(¿¾ ˆŠcã!«Ÿhtï’ÄãWH´¬‹1Ñ*“ßDkU¼!Úwý4Ñ©þí=YW";·ï½–ÿTd(jHÍ…2ƒ¢"Š‚ÈP‚2|ç;/÷·ß 5¤åô½/§{5T¥vvvvvöax*<ιºÐ*±cá)R Oñ&Ú…7ž³Áé,õ¨Ng“ƒÒt›ßÏöÞÒ¿9©¬/¬­¦ýI%¡ýgµt@ÔBí YÙ»¹»Nì§|þ@”[çÁ§«˜¾{}Òe™ë|%˜¸Œ›*ãlJ„Õ‹æCŽÕÊ/°[˜<Ú€Çú§ƒG>p18«bc`… ÷»†#ÃÏŒäKÏ™å¾^‘‰ÇÙšÖVÑ S¶ù@x: ]~ÞVæ°+Ão…dBÈ_ßæ…ÂÞ¤2é·=¼·ÕÝ$+‡¯™#žÅ·uî’’¹Ü ?=Lѳ½%mžŒw%ŽÞ”;G,mÙðÚ7«ˆyÌ/Ðå¡ur¿hôì¶î±í]´ï÷ý¢;G+~–?h"Ê%Ðe¤è¦QaçÊþgI¼9?Öq—¥^'åYêôö¶Éd£E>T,• ™úúo…ïOáèn(H ÙGÂÚåO{,1­Êà eyK.+Å “ÂWR$ò‹ò¡«…вÎâQ”ZÙ Ç¡,ç|É3¹›z¡ó %oÞÒ™A›ŸCùœx†0> »xbuИ·Ëþ)zÇPmˆ–™®ó‚¥_45ÓyáVøgž~Ê®ð¸„! +T`$ð…£ˆûD2àÐ*_ÈD©íýÌ‘ý¢Ä¡½šH¾Ñ+ Åé˾¨D“U br‰ï[s±ìôD›KB*ÐÝ×b/A‘H$^—=¨÷j‚n²„t ¬/.k.ÚGßCU3hû©m­í‹aVF Ø®)Úˆáäñ!ªæPJ^Ï«éפ*ÝßåìiÉåŠ=gûiÆ«õ>D£Òb¸˜ÿ3 -x—å#Zp©Ì+ûfáñNï§®ûƒÜ]¯‚¦škàtíTQšÇV4š’ÍK×2ÕôlRsøå–Å4³—t¦ñ-OVBb¶¿…À;è„Ç[`óí-ž '(%9)™ÀȾ"áxgluó¨[îœqs'8)àañIllŒî$úEv¸Ÿëß ¾(vkîT2Î…ð¾.ˆ£«@.j„›Ç‡ÂÍ>mF>…^w컾I“ÜKEs.?~äÜZ¥ƒð¢ë#üiÜ¢ðî#pR"]î¬/£g²£uz0ºÌ?Ý42YFçó¹³w­ÀÏ_ÁìÄTĨœ´?!t÷•L¥î^Ó &Çx÷IÓsqR Æ&¢ gê÷›c~É2†"Ça*~rÌÏÞ’ðÅÙIvÑ®\ÀGɼ±_íeOöð}¿elI'v³„[!–޼;y%ú1ÆC Np'a<âì"79Dæ%:a³ÚTà€D'>îþÁHÑ"¸.òJÆÀ‘iõnõ¾rÌâmîh×ä” 7Sì‚?Zœh@¿k±ûUJ8Ž{6–Y½Ñà3¿$j‘œeVˆX–HW,q¢ý#>{ŸP~æ9,a5–l5†£ôhwœì~éÙæêó0f"Î +å]N̲÷ ŽÇ î9PTËÑaaKú2’ŒçÉ÷Ñð´*.\XÊÒ¼PÑ3DHfüµŠH)•K>˜z“ìò|Ãü [t‚ÎØŽµºû»¥èD!n›y UÓU3Û ön²”¤³Å‹c:{YKa€¶¶w±®éÖ¶C½+g“L«­ñBÚàPÍ#nhñ:޶ñqÖ›ã1’zH1”e^¸ km/D¬¹f,n…æØ2¢ëCVl{Qo¿³Ä5ö8{f±#›˜R²¶Ëa¸öB(˜B!1ˆŽ¶ªA‡âOà“vó¡u\ÕwŒ/É>ÎLì> ºÖš¦úŽ'2äz"…^(³=‘±ˆÇ’¦Û8v½Žb0YNØ/,ó›¼hú¥®én…€" TŸö|É …nDZգô‹¾Üs^pØðBBI î(]Ð8Öéä®ÞžElâV2 ²¸¢ðGƒ´¬”XÛ]D¬î®”9\_U³UE¨îx˜­¸RòZÄ©¹Ï…‰„o”¢Vß0´«¶qÁáj¤´.é‡f3ü;ó¬æ/Ò#}O§ïÄ– Þg´åE<ö²¯ÊÛ1é dMp᩵£X&U;8DfTæY;}K]§Æ·8t ¦ï#Mâ¨w뎳ðZr]Ÿ´½Svù¥mñ*fí(:' û¬ði íÝÌ·ˆðW’JßIEä„kˆ‹x §¤}ãj¾‚#–?¬qh €=§ñ <")Ç7ŽY`ØŒ:°†ZÒBuØ—¿¦â´¦‡b-y‚/Ô;6Ë·ã±þ8XËÇsò‹ÇdH¨±P¿$,€V.’ŸÏ‚b±w™Ràç÷<öóT„¤r' IQ^ýy_ÂÏl—㓎'#õîµ8ÊþÌ®ãɺœ:­ {°Ô£ÇÃe3ªt0`dG/Í4-¿ÖxIßüع¸©g÷ÍÏ‹›za5Û87õ,"¢má\ÜÔ³èì¿™üObç—fHŠÿðÕÅÈœ^LýÁØG×áÎ/>U 6îMòSÓ¼6ÿ;ÏNº‹Ws<÷Å||ê*S*éJÖìNz¦ì½Už4Ê»B¤„%Wè%žà! d…aq¯zÔÎþ‰åÐbðíú…ѪT0  …ïýQ1ågQ”m &H{ߟ…L/-ünùÑ‘£Sã'ëVé/c«YLX*ùY>XE1͸?`‚S„ÛÊæm$ÞË«¨ »¡÷xj±N‘P™Eö.oÖ³{½E.óX¨ÖÕóLo×öÿ÷óÆÞ°’»=–š‡wåq¢0º©?¤Šª¿ƒÇ˜>Á ³3Ô‚xœ5š6ׯl¹"˜ITFDÈÚ1¤†5”øyq[kn s… Ú)Âf<7’áèŽ×¾GD€úÓ=ÜÎþ2ÏÛ’³(Ðã)øÜræþ%Ï>‰ NûQ•zñ®bàqjQ½Áá?Du#¨„h(ˆêFP­UB&ˆêFP‘–ùÇ‚¨níOQ=,ð炨nÕ ÿ ª‹’,ˆêFPm“öQ]CÏ6›þHÕÕs–Eç?Duõ/ üÃATWÏÕ|;ˆz†´\ͲN y–,B!Öi¡Ì Jç sÁ’¤j9Oàä"äga—ÖàyÐÐË 13~ØNb›Aøbh¹+†ÉZ9þ…q‚g‚¹«ðž¨¥RDëK;d9e>†=“W€ÒC”óøh°·"QkErNtµ¶"B»GGhïÄ“¥­‹_äV…xÉ +. cáQ<(ºaeDr¨=îÈnç"ºNö~´È ç<ãg°o¢WïH]@“4á[!ÄÝQÔ÷FܾnÃâŒÄ^±¢µcß?à ¿6Ö†_­ãâ¿ër÷zñµ‚Ÿ‡?‹½F("ÜO¥ŽM„ ,`Ñ!œ¹ë5m:pž›&žäw‡?ˆ½âjð!‚?÷Á‘¸T­Ö}›Ç 9f»ôñÂA#üúq‡ôFÁ|‡Ó>Àh¼-1å79’ÜŒg!ÜÛß^T`ßæµùªÜ7Ë0ðfƒmò¼XІÛDÛ¼G*oßgmoD=Qi­›R³bÎV…õ‘íI7$²OÁHfÞ'ÿ×H¬¤¦³Ò>Q™îÚ0¯. ¡xÖèÒu56nP½ï½E$'6lÍiWãí9Íœo³†ù·ç´›ñöœÖ˜l#ˆ!€ÎtÔ1î>kÈóO©IqÚp±]4ZëÇ-V96Ñyß <­5Ì•ݼGÏ+ǾËWÖš§O2Ü’¿ã…»ºî§ ™.‘UÄ’ëðXìn‡ÄÝÞÞ“´8{paøƒ7ÏW4ŒNgã)Á¤—ðè˜ï_ã $ž)¾Z›£3œm-:;ã¯Wœ}:/uÞ—Gújú3öì,üt¶»·ëÉìCm± Š&4c GØ`|C÷9mëþèû[Ù=«_í~D9©±Ë[ÉQC¦T"C p*h–oµ(£°2±Ý%WoÐ`í'ˆqN\šÃ]Š#±!h¥ðÄâ6Û­•z1ñ¦°µ $øŽŒâ"ƒ³xùN,Ä|Iˆªeµ×bsÛj/ ®qLÇpZØ}A·!qĸ/p Å è$2,0¥âP‰OÛàkvˆ¬Ý‚BvÛìÁ‡dͳ•cx ï¡„ÏòØ !ë¬rf ƒ¢¬CýþŽ®ÊO‚¨èÀn˜­5%Á»Ê½ÄŸ] ‘?횡ܜ$<Ø(»„y¢ªÙ<GŸCò!úf@Ç™%x°šm@Ú>& 2|¢_z!4¯³¥žul>àÜñaŠ´ûvÔÚ³˜¬Ñ–©€)Åd µB×oq§.€N¹†©{àœÉwšbÂ(‰°Ë:mÉNõd Ãêßa•%AT´ufë¼åÞ vª ¨h)ïöÐ~êòŸÎÞ¶›óUýA˜Úý±ZCûxæu×EÕµXfÞ@‡`ª ìTÏóv-çÓüEþ€Ž2¿ÉG 4n´v÷,ÿt Ré 5Ó„“£ ·¨jyýH`õlìYC~´ä—~ÛÄÊÄ"d}ÈØáT|Â?‘ZƒÝÊ#µf¶œáÈ͵ֈSä0q.:«=@qÿ ÀbÔõDÂ/n›·ˆ÷Ò¢ýèœTÇ Ñ*4tP\‘_sl@Qp<øÔùx‰úhaá“b‰XnÃL CIèS+â­á5¹§<“ÐnŠ™§aªç‘neÁöÿ-ÇjTÈ ý °êÊǯÂx™Í޵ÅË4ò˜„¤$Ãò Òë…ø)‹l0 ÜÕ8›&QÀõ9 +‹¶rã…ðÑ•9_¼á"J+möãrûosºó øÈ_þE¿šá¢îfô´ Â¥} ì+Ñ7)äænñ©é<;èΓq{ú·/†ŸÕÏʵRÖó‘oZð›C_b&´`qø*Œc²-„/œ_ +ýÔÿÂIsç×ÃCÙ ”8]‚,]T Éðˆ2 +ISTYuMUUÍÐTµ†UúŸ(‚¡ ’!EÕUQóÕÛ¨Ôjþ«ÿr'0õŸýå‚ïÌwÿ(øz;ðeuç—"B\€¤Q’1a p@•DE“UŠïuç+q@“4r†*ê +¬Óa#dAÔEEUÝW†ÅT–(ª>‘%+¸”4šêSh@°¯Ê¡KýÞùU[Ûgô>™WÍîdÚ3{¤«¾z/øøªÙùBíA,_ÍÛãþÈŒÅ2“éØœVÛ½Áb‹IVLJJãÿ´Gƒ^ØÇׯ¤¿šOãþ‡Ï«“Ÿ_\ÿýfþàsR»÷ãÍ0·ÃôÛŸÓ˜ŠßÂl‡é·?§1ßÂTØÓoNcj ||z2YéhÒþ5˜™v‹8(j ("TA—DCkZ˜BÿYßH>¾4ž(RæƒöèrÑîMÛã¹UX×,šƒþ³[Lâ êÏšon½ù³õ‰ À)ëzNæ´á?-X·%5y_üǼzn#‚VÚÓöëÌîÏÇ«;†ú¶Ø÷Fæô¼ýj®oõ»‚´a¥Ó©.œÖª“y $ïTbøBa_ý–PnQhm(¬aÁÄ5¬x½z¸Üx#‰½òÁ¿2ù_™ü¯LþW&ÿ?ËdUÿñdì’ˆpv´|hùœ +UrU“Ý0t èPO— ¨‚lhP½×4 é÷‚`Ȫ š‚õ{W‘—‘bï#ÜgÄtÑ€F&¨XãWtÖ&Y“5Å€"™••3 š¢hPV‹hnøX +Zp†’$! €ÄAÓDUtHU– i72w°ð¡ @l EÎ0›•‚S‡D×àµQ©”(oD¯¯ì ×&lýWI·Zbës£žÉ7ê­UåVõ”7õØŠr«zêõÚªr+{d%~–[Õ+Ñï Uc©ó>ï9j¼ËKã]VDh“ +T³ Ò#{‘t¨+½z +)Tº§{4(!4„®dhœ¢éPyDA–UO)E‘ec¹”?áf Ú=¡øê/Yaß,‚ˆ‰ˆ™€ì)Àòº!y{–*DØJoS,aL¾¦Ç·†Uö“a‚j.¬Ã~ JoÔmžbŸtœ“7ê:o9§ó~½A÷yŠy;üizø¤7¡ÏwÆWöëBj$ŠöH,7úë:¿Ëù%H ()P‡â4Ð1-DÝXJKJ#¡C'I $ò> endobj 27 0 obj <> endobj 36 0 obj [/View/Design] endobj 37 0 obj <>>> endobj 15 0 obj [/View/Design] endobj 16 0 obj <>>> endobj 49 0 obj [48 0 R] endobj 68 0 obj <> endobj xref +0 69 +0000000004 65535 f +0000000016 00000 n +0000000173 00000 n +0000045756 00000 n +0000000006 00000 f +0000387041 00000 n +0000000008 00000 f +0000045807 00000 n +0000000009 00000 f +0000000010 00000 f +0000000011 00000 f +0000000012 00000 f +0000000013 00000 f +0000000014 00000 f +0000000017 00000 f +0000387298 00000 n +0000387329 00000 n +0000000018 00000 f +0000000019 00000 f +0000000020 00000 f +0000000021 00000 f +0000000022 00000 f +0000000023 00000 f +0000000024 00000 f +0000000025 00000 f +0000000026 00000 f +0000000000 00000 f +0000387111 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000387182 00000 n +0000387213 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000047548 00000 n +0000387414 00000 n +0000046187 00000 n +0000050532 00000 n +0000047848 00000 n +0000047735 00000 n +0000046511 00000 n +0000046986 00000 n +0000047034 00000 n +0000047619 00000 n +0000047650 00000 n +0000047883 00000 n +0000050606 00000 n +0000050868 00000 n +0000052242 00000 n +0000083191 00000 n +0000148780 00000 n +0000214369 00000 n +0000279958 00000 n +0000345547 00000 n +0000387439 00000 n +trailer +<]>> +startxref +387647 +%%EOF diff --git a/subprojects/tomlplusplus-3.3.0/docs/images/logo.svg b/subprojects/tomlplusplus-3.3.0/docs/images/logo.svg new file mode 100644 index 00000000..5941d793 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/docs/images/logo.svg @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/subprojects/tomlplusplus-3.3.0/docs/pages/main_page.dox b/subprojects/tomlplusplus-3.3.0/docs/pages/main_page.dox new file mode 100644 index 00000000..c0909579 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/docs/pages/main_page.dox @@ -0,0 +1,597 @@ +/*! + +\mainpage toml++ +\image html banner.svg width=1280px +\tableofcontents + + + +\section mainpage-features Features +- Header-only (optional!) +- Supports the latest [TOML](https://toml.io/) release ([v1.0.0](https://toml.io/en/v1.0.0)), plus + optional support for some unreleased TOML features +- Passes all tests in the [toml-test](https://github.com/BurntSushi/toml-test) suite +- Supports serializing to JSON and YAML +- Proper UTF-8 handling (incl. BOM) +- C++17 (plus some C++20 features where available, e.g. experimental support for char8_t strings) +- Doesn't require RTTI +- Works with or without exceptions +- Tested on Clang (6+), GCC (7+) and MSVC (VS2019) +- Tested on x64, x86 and ARM + + + +\section mainpage-api-documentation API documentation +You're looking at it! Browse the docs using the links at the top of the page. +You can search from anywhere by pressing the TAB key. + + + +\section mainpage-example Basic examples + + + +\subsection mainpage-example-parsing-files Parsing files +Call toml::parse_file() and work with the toml::table you get back, or handle any toml::parse_error that gets thrown: + +\cpp +#include +#include + +int main(int argc, char** argv) +{ + toml::table tbl; + try + { + tbl = toml::parse_file(argv[1]); + std::cout << tbl << "\n"; + } + catch (const toml::parse_error& err) + { + std::cerr << "Parsing failed:\n" << err << "\n"; + return 1; + } + + return 0; +} + +\endcpp + +\see +- toml::parse_file() +- toml::table +- toml::parse_error + + + +\subsection mainpage-example-parsing-strings Parsing strings and iostreams + +Call toml::parse() and work with the toml::table you get back, or handle any toml::parse_error that gets thrown: + +\godbolt{NsR-xf} + +\cpp +#include +#include +#include +using namespace std::string_view_literals; + +int main() +{ + static constexpr std::string_view some_toml = R"( + [library] + name = "toml++" + authors = ["Mark Gillard "] + cpp = 17 + )"sv; + + try + { + // parse directly from a string view: + { + toml::table tbl = toml::parse(some_toml); + std::cout << tbl << "\n"; + } + + // parse from a string stream: + { + std::stringstream ss{ std::string{ some_toml } }; + toml::table tbl = toml::parse(ss); + std::cout << tbl << "\n"; + } + } + catch (const toml::parse_error& err) + { + std::cerr << "Parsing failed:\n" << err << "\n"; + return 1; + } + + return 0; +} +\endcpp + +\out +[library] +authors = [ 'Mark Gillard ' ] +cpp = 17 +name = 'toml++' + +[library] +authors = [ 'Mark Gillard ' ] +cpp = 17 +name = 'toml++' +\endout + +\see +- toml::parse_file() +- toml::table +- toml::parse_error + + + +\subsection mainpage-example-parsing-without-exceptions Handling errors without exceptions +Can't (or won't) use exceptions? That's fine too. You can disable exceptions in your compiler flags and/or +explicitly disable the library's use of them by setting the option #TOML_EXCEPTIONS to `0`. In either case, +the parsing functions return a toml::parse_result instead of a toml::table: + +\cpp +#include + +#define TOML_EXCEPTIONS 0 // only necessary if you've left them enabled in your compiler +#include + +int main() +{ + toml::parse_result result = toml::parse_file("configuration.toml"); + if (!result) + { + std::cerr << "Parsing failed:\n" << result.error() << "\n"; + return 1; + } + + do_stuff_with_your_config(std::move(result).table()); // 'steal' the table from the result + return 0; +} +\endcpp + + + +\subsection mainpage-example-custom-error-formatting Custom error formatting +The examples above use an overloaded `operator<<` with ostreams to print basic error messages, and look like this: +\out +Error while parsing key: expected bare key starting character or string delimiter, saw '?' + (error occurred at line 2, column 5) +\endout + +The library doesn't natively support error colouring in TTY environments, but instead provides the requisite information +for you to build that and any other custom error handling yourself if necessary via toml::parse_error's source() +and description() members: + +\cpp +toml::table tbl; +try +{ + tbl = toml::parse_file("configuration.toml"); +} +catch (const toml::parse_error& err) +{ + std::cerr + << "Error parsing file '" << *err.source().path + << "':\n" << err.description() + << "\n (" << err.source().begin << ")\n"; + return 1; +} +\endcpp + +\see +- toml::parse_error +- toml::source_region +- toml::source_position + + + +\subsection mainpage-example-manipulations Working with TOML data +A TOML document is a tree of values, arrays and tables, represented as the toml::value, toml::array +and toml::table, respectively. All three inherit from toml::node, and can be easily accessed via +the toml::node_view: + +\godbolt{TnevafTKd} + +\cpp +#include +#include +using namespace std::string_view_literals; + +int main() +{ + static constexpr auto source = R"( + str = "hello world" + + numbers = [ 1, 2, 3, "four", 5.0 ] + vegetables = [ "tomato", "onion", "mushroom", "lettuce" ] + minerals = [ "quartz", "iron", "copper", "diamond" ] + + [animals] + cats = [ "tiger", "lion", "puma" ] + birds = [ "macaw", "pigeon", "canary" ] + fish = [ "salmon", "trout", "carp" ] + + )"sv; + toml::table tbl = toml::parse(source); + + // different ways of directly querying data + std::optional str1 = tbl["str"].value(); + std::optional str2 = tbl["str"].value(); + std::string_view str3 = tbl["str"].value_or(""sv); + std::string& str4 = tbl["str"].ref(); // ~~dangerous~~ + + std::cout << *str1 << "\n"; + std::cout << *str2 << "\n"; + std::cout << str3 << "\n"; + std::cout << str4 << "\n"; + + // get a toml::node_view of the element 'numbers' using operator[] + auto numbers = tbl["numbers"]; + std::cout << "table has 'numbers': " << !!numbers << "\n"; + std::cout << "numbers is an: " << numbers.type() << "\n"; + std::cout << "numbers: " << numbers << "\n"; + + // get the underlying array object to do some more advanced stuff + if (toml::array* arr = numbers.as_array()) + { + // visitation with for_each() helps deal with heterogeneous data + arr->for_each([](auto&& el) + { + if constexpr (toml::is_number) + (*el)++; + else if constexpr (toml::is_string) + el = "five"sv; + }); + + // arrays are very similar to std::vector + arr->push_back(7); + arr->emplace_back(8, 9); + std::cout << "numbers: " << numbers << "\n"; + } + + // node-views can be chained to quickly query deeper + std::cout << "cats: " << tbl["animals"]["cats"] << "\n"; + std::cout << "fish[1]: " << tbl["animals"]["fish"][1] << "\n"; + + // can also be retrieved via absolute path + std::cout << "cats: " << tbl.at_path("animals.cats") << "\n"; + std::cout << "fish[1]: " << tbl.at_path("animals.fish[1]") << "\n"; + + // ...even if the element doesn't exist + std::cout << "dinosaurs: " << tbl["animals"]["dinosaurs"] << "\n"; //no dinosaurs :( + + return 0; +} +\endcpp + +\out +hello world +hello world +hello world +hello world +table has 'numbers': 1 +numbers is an: array +numbers: [ 1, 2, 3, 'four', 5.0 ] +numbers: [ 2, 3, 4, 'five', 6.0, 7, [ 8, 9 ] ] +cats: [ 'tiger', 'lion', 'puma' ] +fish[1]: 'trout' +dinosaurs: +\endout + +\see +- toml::node +- toml::node_view +- toml::value +- toml::array +- toml::table + + + +\subsection mainpage-example-serialization Serializing as TOML, JSON and YAML +All toml++ data types have overloaded `operator<<` for ostreams, so 'serializing' a set of TOML data to actual +TOML is done just by printing it to an ostream. Converting it to JSON and YAML is done in much the same way, +but via a toml::json_formatter and toml::yaml_formatter. + +\godbolt{srdfoWMq6} + +\cpp +#include +#include + +int main() +{ + auto tbl = toml::table{ + { "lib", "toml++" }, + { "cpp", toml::array{ 17, 20, "and beyond" } }, + { "toml", toml::array{ "1.0.0", "and beyond" } }, + { "repo", "https://github.com/marzer/tomlplusplus/" }, + { "author", toml::table{ + { "name", "Mark Gillard" }, + { "github", "https://github.com/marzer" }, + { "twitter", "https://twitter.com/marzer8789" } + } + }, + }; + + // serializing as TOML + std::cout << "###### TOML ######" << "\n\n"; + std::cout << tbl << "\n\n"; + + // serializing as JSON using toml::json_formatter: + std::cout << "###### JSON ######" << "\n\n"; + std::cout << toml::json_formatter{ tbl } << "\n\n"; + + // serializing as YAML using toml::yaml_formatter: + std::cout << "###### YAML ######" << "\n\n"; + std::cout << toml::yaml_formatter{ tbl } << "\n\n"; + + return 0; +} +\endcpp + +\out +###### TOML ###### + +cpp = [ 17, 20, 'and beyond' ] +lib = 'toml++' +repo = 'https://github.com/marzer/tomlplusplus/' +toml = [ '1.0.0', 'and beyond' ] + +[author] +github = 'https://github.com/marzer' +name = 'Mark Gillard' +twitter = 'https://twitter.com/marzer8789' + +###### JSON ###### + +{ + "author" : { + "github" : "https://github.com/marzer", + "name" : "Mark Gillard", + "twitter" : "https://twitter.com/marzer8789" + }, + "cpp" : [ + 17, + 20, + "and beyond" + ], + "lib" : "toml++", + "repo" : "https://github.com/marzer/tomlplusplus/", + "toml" : [ + "1.0.0", + "and beyond" + ] +} + +###### YAML ###### + +author: + github: 'https://github.com/marzer' + name: 'Mark Gillard' + twitter: 'https://twitter.com/marzer8789' +cpp: + - 17 + - 20 + - 'and beyond' +lib: 'toml++' +repo: 'https://github.com/marzer/tomlplusplus/' +toml: + - '1.0.0' + - 'and beyond' +\endout + +\see +- toml::toml_formatter +- toml::json_formatter +- toml::yaml_formatter + + + +\subsection mainpage-example-speed-up-compilation Speeding up compilation +Because toml++ is a header-only library of nontrivial size you might find that compilation times noticeably +increase after you add it to your project, especially if you add the library's header somewhere that's visible from +a large number of translation units. You can counter this by disabling header-only mode and explicitly controlling +where the library's implementation is compiled. + +Step 1: Set #TOML_HEADER_ONLY to [code]0[/code] before including toml++ + +This must be the same everywhere, so either set it as a global `#define` in your build system, or +do it manually before including toml++ in some global header that's used everywhere in your project: +\cpp +// global_header_that_includes_toml++.h + +#define TOML_HEADER_ONLY 0 +#include +\endcpp + +Step 2: Define #TOML_IMPLEMENTATION before including toml++ in one specific translation unit + +\cpp +// some_code_file.cpp + +#define TOML_IMPLEMENTATION +#include "global_header_that_includes_toml++.h" +\endcpp + +Bonus Step: Disable any library features you don't need + +Some library features can be disabled wholesale so you can avoid paying their the compilation cost if you don't need them. +For example, if all you need to do is serialize some code-generated TOML and don't actually need the parser at all you, can +set #TOML_ENABLE_PARSER to `0` to disable the parser altogether. This can yield fairly significant compilation +speedups since the parser accounts for a good chunk of the library's code. + + +\see \ref configuration + + + +\section mainpage-adding-lib Adding toml++ to your project + +\m_class{m-note m-default} + +The library comes in two flavours, [emoji icecream] Single-header +and [emoji sundae] Regular. The API is the same for both. + + + +\subsection mainpage-adding-lib-old-school "The old fashioned way" + +

[emoji icecream] Single-header flavour

+1. Drop [toml.hpp](https://raw.githubusercontent.com/marzer/tomlplusplus/master/toml.hpp) wherever you like in your source tree +2. There is no step two + +

[emoji sundae] Regular flavour

+1. Clone \github{marzer/tomlplusplus, the repository} from GitHub +2. Add `tomlplusplus/include` to your include paths +3. `#include ` + + + +\subsection mainpage-adding-lib-conan Conan +Add `tomlplusplus/3.3.0` to your conanfile. + + + +\subsection mainpage-adding-lib-dds DDS +Add `tomlpp` to your `package.json5`, e.g.: +\json +depends: [ + 'tomlpp^3.3.0', +] +\endjson + +\see [What is DDS?](https://dds.pizza/) + + + +\subsection mainpage-adding-lib-meson Meson +You can install the wrap with: + +\shell +meson wrap install tomlplusplus +\endshell + +After that, you can use it like a regular dependency: + +\meson +tomlplusplus_dep = dependency('tomlplusplus') +\endmeson + +You can also add it as a subproject directly. + +\subsection mainpage-adding-lib-tipi Tipi.build + +`tomlplusplus` can be easily used in [tipi.build](https://tipi.build) projects by adding the following entry to your `.tipi/deps`: + +\json +{ + "marzer/tomlplusplus": { } +} +\endjson + +\subsection mainpage-adding-lib-vcpkg Vcpkg +\shell +vcpkg install tomlplusplus +\endshell + + + +\subsection mainpage-adding-lib-cmake-fetch-content CMake FetchContent +\cmake +include(FetchContent) +FetchContent_Declare( + tomlplusplus + GIT_REPOSITORY https://github.com/marzer/tomlplusplus.git + GIT_TAG v3.3.0 +) +FetchContent_MakeAvailable(tomlplusplus) +\endcmake + +\see [What is FetchContent?](https://cmake.org/cmake/help/latest/module/FetchContent.html) + + + +\subsection mainpage-adding-lib-git-submodules Git submodules +\shell +git submodule add --depth 1 https://github.com/marzer/tomlplusplus.git tomlplusplus +\endshell + + + +\subsection mainpage-adding-lib-other Other environments and package managers +The C++ tooling ecosystem is a fractal nightmare of unbridled chaos so naturally I'm not up-to-speed with all of the +available packaging and integration options. I'm always happy to see new ones supported, though! If there's some +integration you'd like to see and have the technical know-how to make it happen, feel free to make a pull request. + + + +\subsection mainpage-adding-lib-python Special mention: Python +There exists a python wrapper library built around toml++ called +\github{bobfang1992/pytomlpp, pytomlpp} which is, at the time of writing, one of only two natively-compiled +TOML libraries available for python, and thus one of the fastest options available: + +\out +Parsing data.toml 5000 times: + pytomlpp: 0.694 s + rtoml: 0.871 s ( 1.25x) + tomli: 2.625 s ( 3.78x) + toml: 5.642 s ( 8.12x) + qtoml: 7.760 s (11.17x) + tomlkit: 32.708 s (47.09x) +\endout + +Install it using `pip`: + +\shell +pip install pytomlpp +\endshell + +Note that I'm not the owner of that project, so if you wish to report a bug relating to the python +implementation please do so at their repository, not on the main toml++ one. + + + +\section mainpage-configuration Library configuration options +The library exposes a number of configuration options in the form of compiler `#defines`. Things like +changing the `optional` type, disabling header-only mode, et cetera. The full list of +configurables can be found on the \ref configuration page. + +\see \ref configuration + + + +\section mainpage-contributing Contributing +Contributions are very welcome! Either by \github{marzer/tomlplusplus/issues, reporting issues} +or submitting pull requests. If you wish to submit a pull request, +please see \github{marzer/tomlplusplus/blob/master/CONTRIBUTING.md, CONTRIBUTING} +for all the details you need to get going. + + + +\section mainpage-license License + +toml++ is licensed under the terms of the MIT license - see +[LICENSE](https://github.com/marzer/tomlplusplus/blob/master/LICENSE). + +\m_class{m-note m-default} + +If you're using the single-header version of the library you don't need to explicitly distribute the license file; +it is embedded in the preamble at the top of the header. + + + +\section mainpage-contact Contacting the author +For bug reports and feature requests please use the \github{marzer/tomlplusplus/issues, Github Issues} +system. For anything else you're welcome to reach out via other means. In order of likely response speed: +- Gitter: [marzer/tomlplusplus](https://gitter.im/marzer/tomlplusplus) ("Discord for repos") +- Twitter: [marzer8789](https://twitter.com/marzer8789) +- Email: [mark.gillard@outlook.com.au](mailto:mark.gillard@outlook.com.au) +- Facebook: [marzer](https://www.facebook.com/marzer) +- LinkedIn: [marzer](https://www.linkedin.com/in/marzer/) + +*/ diff --git a/subprojects/tomlplusplus-3.3.0/docs/poxy.toml b/subprojects/tomlplusplus-3.3.0/docs/poxy.toml new file mode 100644 index 00000000..2ca04553 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/docs/poxy.toml @@ -0,0 +1,104 @@ +# this is a config file for Poxy - a Doxygen + m.css front-end written in Python. +# https://github.com/marzer/poxy +# +# config reference: https://github.com/marzer/poxy/wiki/Configuration-options + +name = 'toml++' +author = 'Mark Gillard' +description = 'TOML for C++' +cpp = 17 +github = 'marzer/tomlplusplus' +license = [ 'MIT', 'https://github.com/marzer/tomlplusplus/blob/master/LICENSE' ] +show_includes = false +changelog = true +logo = 'images/logo.svg' +favicon = 'images/favicon.ico' +navbar = [ 'namespaces', 'annotated' ] +theme = 'dark' +extra_files = [ + 'images/badge-awesome.svg', + 'images/badge-TOML.svg', + 'images/badge-gitter.svg', + 'images/badge-sponsor.svg', +] + + + +[warnings] +enabled = true +treat_as_errors = false +undocumented = true + + + +[sources] +paths = [ 'pages' ] +recursive_paths = [ '../include' ] +patterns = [ '*.h', '*.dox' ] +strip_paths = [ '../include' ] + + + +[images] +paths = [ 'images' ] + + + +[macros] +'TOML_ASYMMETRICAL_EQUALITY_OPS(...)' = 'static_assert(true)' +'TOML_ABI_NAMESPACE_START(...)' = 'static_assert(true)' +'TOML_ABI_NAMESPACE_BOOL(...)' = 'static_assert(true)' + + + +[meta_tags] +'google-site-verification' = 'gbtcNgKlNiPSMKkYMw4zWFVWGPH_oU93m9n_-nb4qK8' + + + +[code_blocks] +macros = [ 'TOML_[A-Z0-9_]+?', 'print_value' ] + + + +[badges] +'1. TOML v1.0.0' = [ + 'badge-TOML.svg', + 'https://toml.io/en/v1.0.0' +] +'2. CI' = [ + 'https://github.com/marzer/tomlplusplus/actions/workflows/ci.yaml/badge.svg?branch=master', + 'https://github.com/marzer/tomlplusplus/actions/workflows/ci.yaml' +] +'3. Mentioned in Awesome C++' = [ + 'badge-awesome.svg', + 'https://github.com/fffaraz/awesome-cpp' +] +'4. Sponsor' = [ + 'badge-sponsor.svg', + 'https://github.com/sponsors/marzer' + ] +'5. Gitter' = [ + 'badge-gitter.svg', + 'https://gitter.im/marzer/tomlplusplus' + ] + + + +[autolinks] +'(?:toml::)?date[_-]times?' = 'structtoml_1_1date__time.html' +'(?:toml::)?default[_ ]formatters?' = 'classtoml_1_1default__formatter.html' +'(?:toml::)?json[_ ]formatters?' = 'classtoml_1_1json__formatter.html' +'(?:toml::)?node[_ ]views?' = 'classtoml_1_1node__view.html' +'(?:toml::)?parse[_ ]errors?' = 'classtoml_1_1parse__error.html' +'(?:toml::)?parse[_ ]results?' = 'classtoml_1_1parse__result.html' +'(?:toml::)?path[_ ]components?' = 'classtoml_1_1path__component.html' +'(?:toml::)?source[_ ]positions?' = 'structtoml_1_1source__position.html' +'(?:toml::)?source[_ ]regions?' = 'structtoml_1_1source__region.html' +'(?:toml::)?time[_ ]offsets?' = 'structtoml_1_1time__offset.html' +'(?:toml::)?toml[_ ]formatters?' = 'classtoml_1_1toml__formatter.html' +'(?:toml::)?yaml[_ ]formatters?' = 'classtoml_1_1yaml__formatter.html' +'toml::dates?' = 'structtoml_1_1date.html' +'toml::keys?' = 'classtoml_1_1key.html' +'toml::times?' = 'structtoml_1_1time.html' +'toml::values?' = 'classtoml_1_1value.html' diff --git a/subprojects/tomlplusplus-3.3.0/examples/CMakeLists.txt b/subprojects/tomlplusplus-3.3.0/examples/CMakeLists.txt new file mode 100644 index 00000000..5cc5fe25 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/examples/CMakeLists.txt @@ -0,0 +1,27 @@ +cmake_minimum_required(VERSION 3.14) + +project(Examples LANGUAGES CXX) + +include(../cmake/project-is-top-level.cmake) + +if(PROJECT_IS_TOP_LEVEL) + find_package(tomlplusplus REQUIRED) +endif() + +add_custom_target(run_examples COMMENT "Running all examples") + +function(add_example name) + cmake_parse_arguments(PARSE_ARGV 1 "" "" "" ARGS) + add_executable("${name}" "${name}.cpp") + target_link_libraries("${name}" PRIVATE tomlplusplus::tomlplusplus) + target_compile_features("${name}" PRIVATE cxx_std_17) + add_custom_target("run_${name}" COMMAND "${name}" ${_ARGS} VERBATIM) + add_dependencies(run_examples "run_${name}") +endfunction() + +add_example(error_printer) +add_example(parse_benchmark) +add_example(simple_parser) +add_example(toml_generator) +add_example(toml_merger) +add_example(toml_to_json_transcoder ARGS "${PROJECT_SOURCE_DIR}/example.toml") diff --git a/subprojects/tomlplusplus-3.3.0/examples/benchmark_data.toml b/subprojects/tomlplusplus-3.3.0/examples/benchmark_data.toml new file mode 100644 index 00000000..78a653bb --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/examples/benchmark_data.toml @@ -0,0 +1,578 @@ +boiling-morning = 947 +capable-adhesive = 09:20:44 +cure = 0.4747 # broken +deserted = 0.3939 +finger-surprise = true +flimsy-hook = { wistful-vengeful-complex = [ 2012-06-01T14:49:11+09:41 ] } # experience +naughty = 1928-08-08T22:22:07+06:02 +remarkable-umbrella-flagrant = 1910-09-26 +silky-ski-threatening = 'bore regret' # reject +soap-decisive = '' +want = 0.4848 + +[[babies-lewd-relation.playground-snow-rotten]] +addition-cobweb = 0.8157 +bore = 'acceptable stale adhesive stale curtain deserted' +close-hard-to-find = {} # finicky righteous +contain-train = { ball-license-babies = 22:44:01, string-cross = 0.4102, used-rest = 2014-09-05T17:02:28 } +flat-cheerful = {} +license-gleaming-laughable = 2009-06-03 +rich-title-fuel = 'close tacky stale bake' + + [babies-lewd-relation.playground-snow-rotten.aromatic-overjoyed] + whip-addition = {} # insidious + + [babies-lewd-relation.playground-snow-rotten.morning-adorable-gleaming] # deeply spicy + legal-imperfect-worried = 06:23:39 + modern = 1968-01-21 + skip-sprout-zealous = '' + step-history = {} + +[[babies-lewd-relation.playground-snow-rotten]] +draconian-addition-threatening = 'behave experience impossible' # high-pitched unbecoming +stingy-equable-clean = 1975-03-17 # protective +versed-bake = 505 + +[[babies-lewd-relation.playground-snow-rotten]] +night = 0.778 +prefer-torpid-ski = [ 0.6483, false, 1982-01-23T16:10:13-01:55 ] +soap = { fix = 2019-07-24T07:38:55+01:19, umbrella = 1947-02-13T18:02:46 } +soap-blind = 1964-05-23 # run prefer +used-ancient-delightful = false +worried-string = [ [ 'borrow unbecoming geese' ] ] + +# title tacky dull draconian lewd dreary +# deeply anxious surprise torpid unite relation kindhearted +# skip dull room train experience +# borrow satisfy scintillating neck impossible aromatic high-pitched +# week respect ghost capable +# satisfy deserted capable rabbit string threatening + + [babies-lewd-relation.playground-snow-rotten.protective-kindhearted-train] # best + hard-to-find = 'terrible' + picture = 'ball history' + step-decisive = 02:54:51 + + [babies-lewd-relation.playground-snow-rotten.protective-kindhearted-train.crowded-protective] # leather unbecoming + blind = 1905-03-22 + clean-wilderness-leather = 09:45:08 # scatter + impossible-ski = 536 # sprout + license = [ 1952-02-22T17:07:05.000005978+10:25, 1996-07-04T14:01:50 ] # stale stingy + surprise-fuel = { borrow-kindhearted = 1986-03-23T20:44:26+07:51 } # playground + + [babies-lewd-relation.playground-snow-rotten.protective-kindhearted-train.playground-bore] # hook flagrant + addition-scatter-tacky = 02:17:38 + close = { crown-respect-prefer = 03:27:27 } + incandescent = 10:04:01 + march-dreary-room = true + mark-influence = true + picture-squirrel-surprise = 901 + scene-rest-capable = [ 'torpid light attempt', 12:09:26.000008459 ] # addition + unbecoming-decisive = { bat = [ 1913-12-15T13:13:49, '' ], march-experience-tank = 1911-12-04T18:29:34-04:06, relation-remarkable = false } + whip-actually = [ [], [ 1996-05-28 ] ] # umbrella imperfect + +# stale voyage run popcorn threatening bore +# fabulous respect chubby ancient wistful creature +# surprise prefer dull curious whip +# used blue-eyed furtive torpid selfish chubby nondescript +# curious complex geese jail + + [[babies-lewd-relation.playground-snow-rotten.protective-kindhearted-train.playground-bore.influence-scintillating-vengeful]] + babies-surprise-stingy = { surprise-contain-weary = 14:56:22 } + borrow = 1996-06-04 # ancient + fuel-miss-rich = [ 0.1081, 0.8454 ] + grandfather = false + haircut-versed-innocent = { boiling-innocent-blue-eyed = { blood-capable = 853, overjoyed-kindhearted = 0.2161 }, regret-ignore = 1905-02-06 } + step-insidious-adhesive = [ 1950-01-06, {}, false ] + unbiased = 784 # unite title + uptight-itch-curtain = false + + [[babies-lewd-relation.playground-snow-rotten.protective-kindhearted-train.playground-bore.influence-scintillating-vengeful]] # title relation + deadpan = 1958-06-22T18:31:51+10:16 + fix = 0.3198 # heavy sulky + page-stingy-selfish = 1930-06-19T02:38:48.000016194 + picture-lackadaisical = false # ghost + tank-contain = 'memory consist helpless' + versed-leather-ghost = 'influence wistful flat' + wretched-march = 'place enthusiastic decisive' + + [babies-lewd-relation.playground-snow-rotten.protective-kindhearted-train.vengeful-worried] + capable-bake-room = 1988-10-22 # actually unite + cycle = false + high-pitched-vengeful = 0.0822 + tank-license = 1953-02-12T14:43:36.00003003-00:35 + threatening = 03:43:23 + +# vessel remarkable pumped step draconian scary +# pear selfish birds regret license stingy playground +# pear babies geese rice ignore +# run reject rapid reject + + [babies-lewd-relation.playground-snow-rotten.protective-kindhearted-train.vengeful-worried.ghost-heavy] # respect + advise-bore = true + broken-lewd = true + scatter = 6 # neck + scintillating-regret-unadvised = 1936-07-25T17:22:32-05:14 + versed-miss = 0.9028 + weary = [] + + [babies-lewd-relation.playground-snow-rotten.protective-kindhearted-train.vengeful-worried.pumped-wistful] + contain-modern = 1923-09-23T01:22:09-02:20 + curious-silky-borrow = 1959-11-06T04:37:54-02:58 # rotten + hilarious = 1903-12-02 + insidious-tacky = 'harm spiritual laughable cycle influence messy enthusiastic' + wall-sprout-scary = 10:44:31 + week-dull = {} # leather enthusiastic + + [babies-lewd-relation.playground-snow-rotten.protective-kindhearted-train.vengeful-worried.unadvised-gold-unadvised] + attempt = 1957-09-11 + flagrant-miss-tent = 0.8814 + legal-versed-sprout = false + + [[babies-lewd-relation.playground-snow-rotten.protective-kindhearted-train.vengeful-worried.scene-naughty-spare]] + deserted-hilarious = {} + scatter-attempt = 'blind pear' + + [[babies-lewd-relation.playground-snow-rotten.protective-kindhearted-train.blue-eyed]] # blue-eyed run + borrow-run-mark = 0.5925 + complex-profuse = 1907-02-26T23:54:24.000028223+10:35 + crown-ticket = 'babies helpless' + dull = 1942-11-26 + furtive = 816 + respect = 20:07:11 + string-cheerful-satisfy = 10:15:06 + unbecoming-furtive-unite = 2008-09-02T16:34:04+08:40 + + [[babies-lewd-relation.playground-snow-rotten.protective-kindhearted-train.blue-eyed.naughty-laughable-actually]] + legal-attempt-light = 1934-09-24T20:24:29-10:18 + remarkable = 2020-10-02T19:53:38 + three-cure-innocent = [ 0.2179 ] + versed-attempt = 1917-11-11 + week-draconian = 797 + + [[babies-lewd-relation.playground-snow-rotten.protective-kindhearted-train.blue-eyed.naughty-laughable-actually]] # skip + fabulous-ignore = 2005-08-06 + messy = 242 # gusty worried + + [[babies-lewd-relation.playground-snow-rotten.protective-kindhearted-train.blue-eyed]] + fabulous = 0.8882 + fix = 1928-07-04T15:46:25-06:46 + rabbit-gold = 0.8035 + royal = 1989-09-26T07:06:21-08:43 # complex borrow + terrible-capable-crowded = {} + unbecoming = 201 + view = 12:19:31 # ignore + wilderness-tent-week = [ 384 ] + + [babies-lewd-relation.playground-snow-rotten.whip-enthusiastic-ignore] + afraid = 2010-08-09 + ball = 17:51:13 # vengeful + blind-heavy = 'cheerful profuse innocent dreary' # legal hard-to-find + deserted-itch = 1984-03-02 + skip-protective = 22:27:14 + spare-view-hook = { flimsy-partner-fuel = 727, memory-blue-eyed = 0.9457 } + + [[babies-lewd-relation.playground-snow-rotten.whip-enthusiastic-ignore.skip-bake-incandescent]] + + [babies-lewd-relation.playground-snow-rotten.whip-enthusiastic-ignore.skip-bake-incandescent.influence-bat-actually] + broken-surprise = 21:24:24.000002983 + leather-taboo-dull = { deeply = [ 813, 07:48:43.000014695 ], run-bake = 'march used scatter attempt close chubby innocent', tacky-party = 2005-02-06 } # cross + productive = { page = 361, three-tank-wistful = [ 2016-07-20, 13:18:08, 'light curtain morning rabbit harm sisters high-pitched' ] } + terrible-partner-room = 1915-06-07 + train = 0.4414 + +# innocent string contain regret crime decisive wall +# spiritual naughty tacky stale attempt +# deadpan cure experience royal ancient cure voyage +# remarkable whip ski best haircut + + [babies-lewd-relation.playground-snow-rotten.whip-enthusiastic-ignore.skip-bake-incandescent.rice-skip-used] + bake-pear-train = 813 # vengeful + clean-ancient = 2012-11-13 + complex = { naughty-deadpan-actually = 06:52:59, room-boiling = 0.1027 } + haircut = true # tacky prefer + rejoice-uptight = 0.6769 + spicy = true + surprise = false # deadpan worried + threatening = 1978-02-04 + title-acceptable = 1956-02-22 + + [[babies-lewd-relation.playground-snow-rotten.whip-enthusiastic-ignore.skip-bake-incandescent.selfish]] # license incandescent + acceptable-decisive = 'skip flat gold influence morning unbiased' + deadpan = 0.7201 # finicky + dull-borrow = 1900-12-08 # dreary capable + hilarious-vengeful = {} # furtive + jail-consist-scatter = 0.1787 + scene-vessel-complex = 1971-02-15 + taboo-dull = 0.1922 + taboo-ignore = 2019-04-22 # deadpan + unadvised-scene = 03:16:52 + + [[babies-lewd-relation.playground-snow-rotten.whip-enthusiastic-ignore.skip-bake-incandescent]] + contain = false + legal-hilarious = [] + rejoice = [ 1979-08-21T05:58:09-06:39, 'creature memory' ] + wall-flagrant-self = 0.4976 + + [[babies-lewd-relation.playground-snow-rotten.wall]] # protective + capable = [] # wilderness snow + clean = 1963-02-17 + complex-umbrella = { familiar-innocent-consist = 175, stale = 07:03:20.00002881 } + creature-gleaming-sisters = 1984-05-19 # gleaming + crowded-squirrel = 1974-10-07 + enthusiastic-three-tent = { capable-crowded = 1931-03-05T09:28:53-07:42, flat-broken-clean = {} } + light-snow = false # silky + wilderness-light-curious = 989 # actually + + [babies-lewd-relation.playground-snow-rotten.wall.threatening] + chubby-overjoyed = 0.7252 # cheerful + cream-addition = 0.8832 + familiar-high-pitched = 2013-11-10 + laughable-geese-borrow = {} + overjoyed-bake = 1919-07-25 + respect-umbrella = 1947-09-18 # charming + scene-rapid = false + surprise-delightful-stingy = { creature-pause = 0.9945, room-advise = '', tent-snow = '' } # rabbit + + [[babies-lewd-relation.playground-snow-rotten.wall]] + crown-unbiased = 06:10:11 # jail + impossible-flimsy = 1992-09-13T01:39:28.000005689-05:33 + rejoice = [ false ] + ski-ball-run = 'finicky haircut vessel spicy' + tacky = 9 # ignore + vengeful-rabbit = true # lackadaisical fix + +# jail excuse enthusiastic cream complex +# train satisfy fix broken +# threatening boiling attempt train delightful cheerful vengeful +# rich actually fabulous contain deadpan harm curious +# fabulous scene furtive acceptable blood +# meaty used curious mark surprise curtain hard-to-find + + [babies-lewd-relation.playground-snow-rotten.wall.terrible] + aromatic = 1937-12-11T00:23:12 # addition whip + glorious-wretched = { tank-adorable-gold = false, wilderness-cure-history = [ 1957-11-25T20:10:27.000016213+04:26, 2008-02-17, 20:40:09 ] } + squirrel-flagrant-boiling = { skip-room = { nondescript-morning-excuse = 1904-05-01T16:47:38+10:26 } } + surprise = 0.3398 + worried = 'wretched experience ancient' + +# week hilarious miss sprout + + [babies-lewd-relation.playground-snow-rotten.wall.terrible.anxious] # crown tacky + fabulous-impossible = false # spare + fuel = 1908-09-09 # stale charming + license-ticket = [] # regret rejoice + sprout-mark-selfish = { page = 23:36:46.0000114, weary-deserted-history = [ true ] } + voyage = { meaty-helpless = 1980-04-20 } + +# bore babies influence overjoyed advise light +# righteous remarkable leather stingy partner actually advise +# scary familiar deadpan gleaming adhesive broken experience +# mark unbiased popcorn squirrel close capable +# scintillating ski productive unbecoming haircut +# tank attempt scene rabbit high-pitched sprout +# gusty attempt flimsy ski pear terrible rice + + [babies-lewd-relation.playground-snow-rotten.wall.terrible.boiling] # flimsy glorious + charming-royal = 04:14:31.000005876 + curtain = 2005-08-17T06:45:00 # equable + draconian-clean-enthusiastic = 'history' + fix = 19:53:23 + influence-week-reject = 581 # spiritual bore + self-protective = 2004-01-19T01:00:26.000016471+00:16 + step-overjoyed-history = [ 'curious satisfy', [ 'overjoyed bat advise grandfather', 0.5762 ], 1947-06-28T09:03:40-08:39 ] + + [babies-lewd-relation.playground-snow-rotten.wall.terrible.laughable-crime] # babies + umbrella = 1938-06-10 + +# furtive actually cross creature +# rest ghost mark selfish deadpan wistful torpid + + [[babies-lewd-relation.playground-snow-rotten.wall.terrible.versed-overjoyed]] # hilarious + blind-familiar = 73 # gold respect + clean-train = { borrow-flagrant = 0.6438, unbecoming-fabulous-cheerful = false } # week + flimsy-pumped-umbrella = { string-boiling = { insidious-sisters = 10:33:25 }, weary = { behave-rejoice-threatening = 0.9151, protective-grandfather = 'haircut', view-regret-partner = false } } # unadvised finger + modern = 0.1885 + place-cross = [ {} ] + tank = false + terrible-enthusiastic = 'hook' # train + threatening-best = 1908-09-20 # ticket + unbecoming-high-pitched = 09:47:03 # selfish productive + + [[babies-lewd-relation.playground-snow-rotten.wall.terrible.versed-overjoyed]] + anxious = [] # equable + clean-satisfy = [ 0.8894, 153 ] + scene = 17:37:43 # clean ancient + +# voyage wall deserted furtive rest aromatic +# cross flat cure productive cheerful + + [[babies-lewd-relation.playground-snow-rotten.wall.terrible.versed-overjoyed]] # charming laughable + ball-deserted = 'voyage' # crown + deadpan-prefer-deeply = 104 + fabulous-influence-wall = 0.0613 + ignore = 1982-07-11 + modern = { helpless-imperfect-leather = [ 'unbiased familiar place', 06:33:07.00002173, 0.5918 ], worried-crowded = false } # helpless want + party-complex-laughable = 11:39:52 # rice light + rich-three = 1929-11-07T03:53:23 + royal-behave-babies = { fabulous-mark = [ 659, true ], unbecoming-messy = [] } # rich broken + spare = [ 1935-09-28T14:49:51-02:02 ] + + [[babies-lewd-relation.playground-snow-rotten.wall]] # threatening + contain = [ 1918-09-06 ] + haircut-selfish-gusty = 976 # spicy stale + rotten = [ true, 'afraid overjoyed kindhearted threatening jail deadpan cure' ] + scene-charming-delightful = 'rice crown room' + scintillating-umbrella-crowded = true + selfish = 1986-11-28 + stale = 0.3828 + title-equable-partner = 508 # zealous + +[[terrible]] +boiling-anxious-heavy = 1975-02-23 + + [terrible.capable-tent] + behave-ski-geese = true + borrow = true + capable-blue-eyed = 0.96 + delightful-fabulous = 14:05:34 + glorious = [ # finger spicy + { best = 0.3935, cycle-acceptable = 05:55:20, spiritual-zealous-high-pitched = 'borrow actually taboo unadvised deadpan' }, + false + ] + hilarious = [ 0.0929 ] + spiritual-tank-sprout = 1969-10-20 + week = false + wretched-step = { close-reject-excuse = 'taboo popcorn party', finger-soap-best = 0.5234 } + + [terrible.capable-tent.contain-spiritual-squirrel] + delightful-torpid-three = 'rejoice' + haircut-regret-curious = 0.7427 + morning-babies = 'hilarious voyage royal complex crown complex' + rest-impossible-borrow = '' # deserted behave + scatter-rest-impossible = { rich-close-actually = 878, vengeful = 0.2007 } # tank run + tacky-neck-cheerful = [ {}, [] ] + + [terrible.capable-tent.week-week-zealous] + bat-zealous = 'morning lewd consist familiar morning crowded laughable' # uptight ski + delightful-tank = 1948-04-17 # charming + excuse = 1939-09-20T05:39:20.000019588+07:59 + gold = 1901-05-16T23:53:21-05:25 + royal = '' # remarkable + self = { train-birds-stingy = 'insidious scene gold', vessel = 0.5759 } + soap = { dull-history = false, scary = false } + taboo-ancient-itch = { gusty-snow-pear = { protective-scatter-high-pitched = 1996-11-03 }, rejoice-ignore-finger = 1918-11-22T19:37:38, squirrel-high-pitched-nondescript = 1995-07-17T04:54:13 } + umbrella-partner = [] + + [terrible.capable-tent.wilderness-aromatic] + attempt-night = 23:28:50 # borrow + cross-spare-hook = [ 1919-06-28T19:24:17-04:44, 08:23:11 ] + pear-helpless-profuse = true + productive-whip = 349 + rapid-scary = 23:34:33 + rotten-wistful = 1944-11-27 + threatening = false # chubby + view-afraid = false + +# neck draconian innocent innocent unbecoming advise +# voyage aromatic train gold broken harm memory +# fuel broken string unbecoming +# party party stale ski advise lewd + + [terrible.capable-tent.wilderness-aromatic.tank] + cheerful-zealous-experience = 41 + memory = 890 # deadpan + naughty = 1991-07-27T16:21:58+02:12 + sisters = true # royal + tent-threatening-threatening = 0.1835 + +# attempt rabbit boiling train laughable wistful +# soap excuse spare neck babies unbiased fix +# legal unbecoming flagrant rest excuse uptight royal + + [[terrible.capable-tent.wilderness-aromatic.tank.terrible]] + birds = [ true, 12:01:59, 1993-12-06 ] + scintillating-vengeful = 'snow party train unbiased innocent' + sulky = 'popcorn' + + [[terrible.capable-tent.wilderness-aromatic.tank.terrible]] + wistful-innocent-morning = 482 + + [[terrible.capable-tent.wilderness-aromatic.tank.terrible]] + adorable = [ false, [ 1986-08-22T06:58:04, 211 ] ] + crowded = [ 06:00:22, 15:39:55 ] + dreary-decisive = 1937-08-23 + familiar-taboo-unite = false + glorious = true # room messy + license-anxious-prefer = '' + pumped = 2010-02-06T18:30:43-07:27 + royal = 1949-03-01T15:27:36 + + [[terrible.capable-tent.wilderness-aromatic.birds]] + hook-dull-familiar = 2020-05-09T10:12:18-00:21 + imperfect = false + pear = 'vengeful worried self close worried' + + [[terrible.capable-tent.wilderness-aromatic.birds]] + bore-unite-flimsy = { finicky-legal-view = [ 749 ] } + grandfather-unbiased = 'modern delightful actually cream' # versed + haircut-soap = 2004-05-01T21:12:27+01:34 + innocent-crime-unbiased = 'three flimsy' + lewd-adorable = 05:25:31 # best fuel + neck = 17:07:42 + rabbit-versed = 11:23:17.000021208 + step-overjoyed-anxious = 0.2862 + weary-creature-itch = [ 2012-05-13T05:12:55+10:38, 1983-01-06T06:23:03-04:47 ] # skip ticket + + [[terrible.capable-tent.wilderness-aromatic.birds]] + hook-rest-impossible = [ 21:02:47.000007906, 0.9952, [ 1977-05-22, true, true ] ] + sisters-rotten = 276 + + [terrible.capable-tent.wilderness-aromatic.birds.naughty-blind] + bake-scatter-cross = [ + 234, + { attempt-selfish-ghost = 08:43:45, draconian-ski-scintillating = 1911-03-24T12:01:06-01:20, dreary = 266 }, + 'innocent broken equable adhesive spiritual title respect' + ] # hard-to-find protective + ticket-enthusiastic-delightful = [ 428, 12:49:26, [ 07:10:40, 'neck unadvised finicky stale rest', true ] ] + + [terrible.capable-tent.wilderness-aromatic.birds.popcorn-cross-unbecoming] + capable-best = [ { fabulous = 0.0328 }, 1959-07-11T18:30:11-10:19, [ false, 1943-02-01T14:46:20+04:32 ] ] + contain = { harm-babies-actually = 1927-05-26, lackadaisical-cobweb-ticket = { license-stale = true }, zealous = 14:34:49 } + dreary-rejoice = false + ignore-cobweb = true + jail = false + legal = {} + + [terrible.capable-tent.wilderness-aromatic.birds.rotten] + innocent = 2012-07-13 + stingy = 12:22:46 + wilderness = true + + [[terrible.capable-tent.taboo-snow-fix]] + consist = 0.5019 + deadpan-title-equable = [] + enthusiastic = 'jail step deserted' # neck + high-pitched-ski-jail = {} + lackadaisical-page = 2011-04-21 + leather-grandfather-lackadaisical = 'kindhearted kindhearted rich babies' # umbrella + relation-high-pitched = 1995-11-05 # blue-eyed cream + self-deeply-crown = 0.6038 # pumped relation + spare-behave-royal = 1955-01-15T04:19:40.000024836-03:27 + + [terrible.history-wistful-insidious] + deadpan-run = 1961-12-04T21:19:22 + impossible-itch-hilarious = [] + wall-silky-zealous = false + + [terrible.history-wistful-insidious.broken-bore] + decisive-spicy = 01:43:10 + finger-deeply = 03:52:20 + jail = [ 'week title curtain week snow' ] + jail-borrow = true # flimsy + kindhearted-tent-harm = 1979-06-03 + playground-unbecoming = 0.3341 + used-unbecoming-cobweb = 0.7474 + + [terrible.history-wistful-insidious.broken-bore.draconian.silky] # afraid unbiased + bat-vessel-enthusiastic = 1988-05-20T20:51:44+00:23 + decisive-close-rest = 1979-07-27T21:30:02-07:46 + messy = 0.2638 # excuse + stingy-self-rejoice = 0.0179 + tacky-mark = 'wilderness furtive incandescent delightful close rotten' # best + vessel = 2006-06-28T20:54:53 # umbrella + + [[terrible.history-wistful-insidious.cobweb-finicky]] + attempt-selfish-skip = [] + ball-ball = 0.1378 # aromatic best + blind-curtain = 06:26:13 + fuel-fix-geese = 1918-06-21T14:07:38 + high-pitched-three = 16:58:45 + innocent-rabbit = 'train' + miss = 'glorious chubby cobweb skip dreary scene ball' + morning = 'unbiased ticket deeply anxious skip terrible dreary' + playground = 'sisters run' # scene cycle + + [[terrible.history-wistful-insidious.cobweb-finicky]] + fabulous = [ 'flimsy spare tent rejoice curtain mark', true ] + rabbit = {} + ticket = false + +# unadvised sulky acceptable righteous broken profuse terrible +# ancient crown gleaming wistful ball rest +# picture deadpan mark flimsy scatter decisive +# close memory skip bat tent haircut +# run attempt morning vengeful delightful legal itch + + [terrible.productive] + itch = '' + +[[terrible]] +babies-sisters = 62 +boiling = { deserted = 'adorable', lackadaisical-wilderness = 671 } +decisive-itch = 1943-07-24 # cross rest +ignore-best = [ 1916-02-18T15:56:45+02:04 ] +overjoyed = 17:49:57 +place-familiar = true +sisters = [] +used-rotten = 1985-08-10T07:39:42+05:17 + + [[terrible.regret-sisters-terrible]] + + [[terrible.regret-sisters-terrible]] + bake = 0.8399 + cross = 427 + leather = [ 02:56:44.000030194, 1974-09-24 ] + nondescript-attempt-bore = 1900-07-03T04:56:46.000004029+07:22 + rejoice = true + +# geese snow relation worried + + [terrible.regret-sisters-terrible.ancient] + boiling-messy-stingy = { fabulous-wretched-mark = [], wall-familiar-furtive = 2003-09-16 } + cobweb-fix = 1988-05-07T07:01:15-10:34 + excuse-gleaming = { familiar = [ true, 1929-01-01T13:47:11+02:44, 04:04:47.00000846 ] } # heavy cheerful + fix-acceptable-string = 15:39:49.000006614 # actually imperfect + hard-to-find = false + imperfect = 1960-11-24T22:00:37 # overjoyed + rabbit-terrible-innocent = [] # threatening + rabbit-train-ski = 0.6229 # profuse + wilderness-advise = 1982-08-20 + + [[terrible.regret-sisters-terrible.ancient.umbrella-worried]] + afraid = true # dreary + + [terrible.regret-sisters-terrible.ancient.umbrella-worried.uptight-sisters-leather] + bore-tank-afraid = true # wretched curtain + + [[terrible.regret-sisters-terrible.terrible-scene-surprise]] + prefer-legal = 428 + relation-license-partner = [ true ] # playground + + [[terrible.regret-sisters-terrible]] + glorious-adorable = 206 # curtain + grandfather = 76 + ignore-cycle = 1956-07-22T01:39:24+03:39 + messy = {} # draconian + + [[terrible.regret-sisters-terrible.memory]] # curious memory + kindhearted-anxious-rotten = true + march-cheerful-view = { best-rice-want = 1978-08-26T22:05:21-00:49, spiritual = 1951-01-22T09:45:33-07:27, vessel-insidious = true } # gold + mark-sulky = 0.0597 + pear = 1986-10-18T13:04:43-01:01 # three itch + remarkable-wistful = 1901-10-01 + scatter-furtive-versed = 01:16:52 + tank-reject = [ 12:09:18, {} ] # wall finger + + [[terrible.regret-sisters-terrible.memory]] + babies-memory = [ { decisive = 15:35:50.000020612, stale-spicy = 0.1702 } ] # adhesive + blue-eyed-aromatic = 'curious birds terrible crowded' + close-cobweb-satisfy = [ {} ] + license = 0.9682 # lewd + reject-spiritual-taboo = '' + sulky-afraid = false + train-ghost-week = [ [ 0.6958, true ], 1942-02-15 ] + + [[terrible.regret-sisters-terrible.memory]] + imperfect = [ 0.0689 ] # harm + three-string-tacky = 0.2109 diff --git a/subprojects/tomlplusplus-3.3.0/examples/error_printer.cpp b/subprojects/tomlplusplus-3.3.0/examples/error_printer.cpp new file mode 100644 index 00000000..9c5430fb --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/examples/error_printer.cpp @@ -0,0 +1,159 @@ +// This file is a part of toml++ and is subject to the the terms of the MIT license. +// Copyright (c) Mark Gillard +// See https://github.com/marzer/tomlplusplus/blob/master/LICENSE for the full license text. +// SPDX-License-Identifier: MIT + +// This example shows the error messages the library produces by forcing a set of specific parsing +// failures and printing their results. + +#include "examples.h" +#include + +using namespace std::string_view_literals; + +namespace +{ + inline constexpr auto invalid_parses = std::array{ + "########## comments and whitespace"sv, + "# bar\rkek"sv, + "# bar\bkek"sv, + "# \xf1\x63"sv, + "# val1 = 1\fval2 = 2"sv, + "foo = 1\n\u2000\nbar = 2"sv, + + "########## inline tables"sv, + "val = {,}"sv, + "val = {a='b',}"sv, // allowed when TOML_ENABLE_UNRELEASED_FEATURES == 1 + "val = {a='b',,}"sv, + "val = {a='b',"sv, + "val = {a='b',\n c='d'}"sv, // allowed when TOML_ENABLE_UNRELEASED_FEATURES == 1 + "val = {?='b'}"sv, + "foo = {} \n [foo.bar]"sv, + + "########## tables"sv, + "[]"sv, + "[foo"sv, + "[foo] ?"sv, + "[foo] [bar]"sv, + "[foo]\n[foo]"sv, + "? = 'foo' ?"sv, + "[ [foo] ]"sv, + + "########## arrays"sv, + "val = [,]"sv, + "val = ['a',,]"sv, + "val = ['a',"sv, + + "########## key-value pairs"sv, + "val = 'foo' ?"sv, + "val = "sv, + "val "sv, + "val ?"sv, + "val = ]"sv, + "[foo]\nbar = 'kek'\nbar = 'kek2'"sv, + "[foo]\nbar = 'kek'\nbar = 7"sv, + "[foo.bar]\n[foo]\nbar = 'kek'"sv, + "[foo]\nbar = 'kek'\nbar.kek = 7"sv, + "[foo]\nbar.? = 'kek'"sv, + R"('''val''' = 1)"sv, + R"(a."""val""" = 1)"sv, + "1= 0x6cA#+\xf1"sv, + R"(😂 = 3)"sv, // allowed when TOML_ENABLE_UNRELEASED_FEATURES == 1 + + "########## values"sv, + "val = _"sv, + "val = G"sv, + "PATHOLOGICALLY_NESTED"sv, // generated inline + + "########## strings"sv, + "val = \" \r \""sv, + R"(val = ")"sv, + R"(val = "\g")"sv, + R"(val = "\x20")"sv, // allowed when TOML_ENABLE_UNRELEASED_FEATURES == 1 + R"(val = "\uFFF")"sv, + R"(val = "\uFFFG")"sv, + R"(val = "\UFFFFFFF")"sv, + R"(val = "\UFFFFFGF")"sv, + R"(val = "\uD801")"sv, + R"(val = "\U00110000")"sv, + R"(val = """ """""")"sv, + R"(val = ''' '''''')"sv, + "val = '\n'"sv, + + "########## integers"sv, + R"(val = -0b0)"sv, + R"(val = -0o0)"sv, + R"(val = -0x0)"sv, + R"(val = +0b0)"sv, + R"(val = +0o0)"sv, + R"(val = +0x0)"sv, + R"(val = 1-)"sv, + R"(val = -1+)"sv, + R"(val = -+1)"sv, + R"(val = 1_0_)"sv, + R"(val = 1_0_ )"sv, + R"(val = 01 )"sv, + R"(val = 0b10000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000 )"sv, + R"(val = 0o1000000000000000000000 )"sv, + R"(val = 9223372036854775808 )"sv, + R"(val = 0x8000000000000000 )"sv, + + "########## floats"sv, + R"(val = 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0)"sv, + }; + + inline constexpr auto divider = + "################################################################################"sv; +} + +int main() +{ + const auto parse_and_print_if_error = [](std::string_view str) + { +#if TOML_EXCEPTIONS + try + { + auto result = toml::parse(str); + static_cast(result); + } + catch (const toml::parse_error& err) + { + std::cout << err << "\n\n"sv; + } +#else + if (auto result = toml::parse(str); !result) + std::cout << result.error() << "\n\n"sv; +#endif + }; + + for (auto str : invalid_parses) + { + if (str.empty()) + continue; + + // section headings + if (str.substr(0, 10) == "##########"sv) + { + std::cout << divider << '\n'; + std::cout << "# "sv << str.substr(11) << '\n'; + std::cout << divider << "\n\n"sv; + } + + // error messages + else + { + toml::parse_result result; + + if (str == "PATHOLOGICALLY_NESTED"sv) + { + std::string s(1000u, '['); + constexpr auto start = "array = "sv; + memcpy(s.data(), start.data(), start.length()); + parse_and_print_if_error(s); + } + else + parse_and_print_if_error(str); + } + } + return 0; +} diff --git a/subprojects/tomlplusplus-3.3.0/examples/error_printer.vcxproj b/subprojects/tomlplusplus-3.3.0/examples/error_printer.vcxproj new file mode 100644 index 00000000..a7ad5b6f --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/examples/error_printer.vcxproj @@ -0,0 +1,61 @@ + + + + + Debug + x64 + + + Release + x64 + + + + 16.0 + {DAB4634D-8145-4860-AE45-5198E76FF324} + 10.0 + + + + Application + true + v143 + MultiByte + + + Application + false + v143 + true + MultiByte + + + + + + + + + Console + + + + ..\examples + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/subprojects/tomlplusplus-3.3.0/examples/example.toml b/subprojects/tomlplusplus-3.3.0/examples/example.toml new file mode 100644 index 00000000..9612b530 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/examples/example.toml @@ -0,0 +1,102 @@ +# This is a TOML document. Boom. + +title = "TOML Example" + +# plain signed integers +int1 = -9223372036854775808 +int2 = 9223372036854775807 + +# floats +flt1 = 0.00000000001 +flt2 = 1e-11 +flt3 = 11.0 +flt4 = +1.0 + +# hexadecimal with prefix `0x` +hex1 = 0xDEADBEEF +hex2 = 0xdeadbeef +hex3 = 0xdead_beef + +# octal with prefix `0o` +oct1 = 0o01234567 +oct2 = 0o755 # useful for Unix file permissions + +# binary with prefix `0b` +bin1 = 0b11010110 # 214 + +# local dates and times +tim1 = 07:32:00 +tim2 = 00:32:00.100000000 +dat1 = 1979-05-27 + +# offset date-times +odt1 = 1979-05-27T07:32:00Z +odt2 = 1979-05-27T00:32:00-07:00 +odt3 = 1979-05-27T00:32:00.999999-07:00 + +# strings +str1 = """ +This is a +multi-line +string. +""" +str2 = "This is also\na multi-line\nstring." +str3 = 'C:\highway\to\the\danger\zone' +kosme = "κόσμε" # unicode! + +arr = [ 'this', 'is', 'a', 'long', 'array', 'with', 16, 'elements.', 'it', 'should', 'be', 'printed', 'as', 'a', 'multiline', 'array.'] + +tab = { this = 'is', an = 'inline', table = 'yay'} + +dotted.keys.are = "supported" +dotted.and = "implemented as tables" + +[owner] +name = "Mark Gillard" +dob = 1987-03-16 10:20:00+09:30 + + [[owner.pets]] + name = "Brian" + species = "cat" + + [[owner.pets]] + name = "Skippy" + species = "kangaroo" + +[database] +server = "192.168.1.1" +ports = [ 8001, 8001, 8002 ] +connection_max = 5000 +enabled = true + +[servers] + + # You can indent as you please. Tabs or spaces. TOML don't care. + [servers.alpha] + ip = "10.0.0.1" + dc = "eqdc10" + + [servers.beta] + ip = "10.0.0.2" + dc = "eqdc10" + country = "中国" # This should be parsed as UTF-8 + +[clients] +data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it + +# Line breaks are OK when inside arrays +hosts = [ + "alpha", + "omega" +] + +# Products + + [[products]] + name = "Hammer" + sku = 738594937 + + [[products]] + name = "Nail" + sku = 284758393 + color = "gray" diff --git a/subprojects/tomlplusplus-3.3.0/examples/examples.h b/subprojects/tomlplusplus-3.3.0/examples/examples.h new file mode 100644 index 00000000..7dc81800 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/examples/examples.h @@ -0,0 +1,62 @@ +//# This file is a part of toml++ and is subject to the the terms of the MIT license. +//# Copyright (c) 2019-2020 Mark Gillard +//# See https://github.com/marzer/tomlplusplus/blob/master/LICENSE for the full license text. +// SPDX-License-Identifier: MIT + +// this file is for boilerplate unrelated to the toml++ example learning outcomes. + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Weverything" +#elif defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wall" +#pragma GCC diagnostic ignored "-Wextra" +#elif defined(_MSC_VER) +#pragma warning(push, 0) +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#ifdef _MSC_VER +extern "C" __declspec(dllimport) int __stdcall SetConsoleOutputCP(unsigned int); +#pragma comment(lib, "Kernel32.lib") +#else +#include +#endif +#endif + +namespace +{ + static const auto initialize_environment_automagically = []() noexcept + { +#ifdef _WIN32 + SetConsoleOutputCP(65001); // CP_UTF8 +#endif + + std::ios_base::sync_with_stdio(false); + std::cout << std::boolalpha; + + srand(static_cast(time(nullptr))); + + return true; + }(); +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#elif defined(__GNUC__) +#pragma GCC diagnostic pop +#elif defined(_MSC_VER) +#pragma warning(pop) +#endif diff --git a/subprojects/tomlplusplus-3.3.0/examples/merge_base.toml b/subprojects/tomlplusplus-3.3.0/examples/merge_base.toml new file mode 100644 index 00000000..a863b27e --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/examples/merge_base.toml @@ -0,0 +1,5 @@ +[section1] +key1="value1" +key2="value2" + +[section1.child1] diff --git a/subprojects/tomlplusplus-3.3.0/examples/merge_overrides.toml b/subprojects/tomlplusplus-3.3.0/examples/merge_overrides.toml new file mode 100644 index 00000000..792396e3 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/examples/merge_overrides.toml @@ -0,0 +1,8 @@ +[section1] +key2="value3" + +[section1.child1] +foo="bar" + +[section1.child2] +foo2="bar2" diff --git a/subprojects/tomlplusplus-3.3.0/examples/meson.build b/subprojects/tomlplusplus-3.3.0/examples/meson.build new file mode 100644 index 00000000..366f37c7 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/examples/meson.build @@ -0,0 +1,30 @@ +# This file is a part of toml++ and is subject to the the terms of the MIT license. +# Copyright (c) Mark Gillard +# See https://github.com/marzer/tomlplusplus/blob/master/LICENSE for the full license text. +# SPDX-License-Identifier: MIT + +example_args = [] +example_args += global_args + +examples = [ + 'simple_parser', + 'toml_to_json_transcoder', + 'toml_generator', + 'error_printer', + 'parse_benchmark', + 'toml_merger', +] + +example_executables = [] +foreach example : examples + example_executables += [[ + example, + executable( + example, + [ example + '.cpp' ], + cpp_args: example_args, + dependencies: tomlplusplus_dep, + override_options: global_overrides + ) + ]] +endforeach diff --git a/subprojects/tomlplusplus-3.3.0/examples/parse_benchmark.cpp b/subprojects/tomlplusplus-3.3.0/examples/parse_benchmark.cpp new file mode 100644 index 00000000..6d974717 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/examples/parse_benchmark.cpp @@ -0,0 +1,81 @@ +// This file is a part of toml++ and is subject to the the terms of the MIT license. +// Copyright (c) Mark Gillard +// See https://github.com/marzer/tomlplusplus/blob/master/LICENSE for the full license text. +// SPDX-License-Identifier: MIT + +// This example is just a short-n-shiny benchmark. + +#include "examples.h" +#include + +using namespace std::string_view_literals; + +static constexpr size_t iterations = 10000; + +int main(int argc, char** argv) +{ + const auto file_path = std::string(argc > 1 ? std::string_view{ argv[1] } : "benchmark_data.toml"sv); + + // read the file into a string first to remove file I/O from the benchmark + std::string file_content; + { + std::ifstream file(file_path, std::ifstream::in | std::ifstream::binary | std::ifstream::ate); + if (!file) + { + std::cerr << "File '"sv << file_path << "'could not be opened for reading\n"sv; + return -1; + } + + const auto file_size = file.tellg(); + if (file_size == -1) + { + std::cerr << "File '"sv << file_path << "' could not be opened for reading\n"sv; + return -1; + } + file.seekg(0, std::ifstream::beg); + + file_content.resize(static_cast(file_size)); + file.read(file_content.data(), static_cast(file_size)); + if (!file.eof() && !file) + { + std::cerr << "Failed to read contents of file '"sv << file_path << "'\n"sv; + return -1; + } + } + + // parse once to make sure it isn't garbage + { +#if TOML_EXCEPTIONS + try + { + const auto result = toml::parse(file_content, file_path); + } + catch (const toml::parse_error& err) + { + std::cerr << err << "\n"; + return 1; + } +#else + const auto result = toml::parse(file_content, file_path); + if (!result) + { + std::cerr << result.error() << "\n"; + return 1; + } +#endif + } + + // run the benchmark + std::cout << "Parsing '"sv << file_path << "' "sv << iterations << " times...\n"sv; + + const auto start = std::chrono::steady_clock::now(); + for (size_t i = 0; i < iterations; i++) + std::ignore = toml::parse(file_content, file_path); + const auto cumulative_sec = + std::chrono::duration_cast>(std::chrono::steady_clock::now() - start).count(); + const auto mean_sec = cumulative_sec / static_cast(iterations); + std::cout << " total: "sv << cumulative_sec << " s\n"sv + << " mean: "sv << mean_sec << " s\n"sv; + + return 0; +} diff --git a/subprojects/tomlplusplus-3.3.0/examples/parse_benchmark.vcxproj b/subprojects/tomlplusplus-3.3.0/examples/parse_benchmark.vcxproj new file mode 100644 index 00000000..927aa4e0 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/examples/parse_benchmark.vcxproj @@ -0,0 +1,62 @@ + + + + + Debug + x64 + + + Release + x64 + + + + 16.0 + {407FCAA8-FC2C-424D-B44B-C6A1AFAD757A} + 10.0 + + + + Application + true + v143 + MultiByte + + + Application + false + v143 + true + MultiByte + + + + + + + + + Console + + + + ..\examples + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/subprojects/tomlplusplus-3.3.0/examples/simple_parser.cpp b/subprojects/tomlplusplus-3.3.0/examples/simple_parser.cpp new file mode 100644 index 00000000..ec771110 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/examples/simple_parser.cpp @@ -0,0 +1,36 @@ +// This file is a part of toml++ and is subject to the the terms of the MIT license. +// Copyright (c) Mark Gillard +// See https://github.com/marzer/tomlplusplus/blob/master/LICENSE for the full license text. +// SPDX-License-Identifier: MIT + +// This example demonstrates how to parse TOML from a file or stdin and re-serialize it (print it out) to stdout. + +#include "examples.h" +#include + +using namespace std::string_view_literals; + +int main(int argc, char** argv) +{ + const auto path = argc > 1 ? std::string_view{ argv[1] } : "example.toml"sv; + + toml::table tbl; + try + { + // read directly from stdin + if (path == "-"sv || path.empty()) + tbl = toml::parse(std::cin, "stdin"sv); + + // read from a file + else + tbl = toml::parse_file(path); + } + catch (const toml::parse_error& err) + { + std::cerr << err << "\n"; + return 1; + } + + std::cout << tbl << "\n"; + return 0; +} diff --git a/subprojects/tomlplusplus-3.3.0/examples/simple_parser.vcxproj b/subprojects/tomlplusplus-3.3.0/examples/simple_parser.vcxproj new file mode 100644 index 00000000..14d2b0f6 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/examples/simple_parser.vcxproj @@ -0,0 +1,62 @@ + + + + + Debug + x64 + + + Release + x64 + + + + 16.0 + {259FCEE5-3442-4076-9547-2BA793ECA1CB} + 10.0 + + + + Application + true + v143 + MultiByte + + + Application + false + v143 + true + MultiByte + + + + + + + + + Console + + + + ..\examples + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/subprojects/tomlplusplus-3.3.0/examples/toml_generator.cpp b/subprojects/tomlplusplus-3.3.0/examples/toml_generator.cpp new file mode 100644 index 00000000..5a51d77b --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/examples/toml_generator.cpp @@ -0,0 +1,322 @@ +// This file is a part of toml++ and is subject to the the terms of the MIT license. +// Copyright (c) Mark Gillard +// See https://github.com/marzer/tomlplusplus/blob/master/LICENSE for the full license text. +// SPDX-License-Identifier: MIT + +// This example demonstrates the use of some more advanced features to generate a tree of random TOML data. + +#include "examples.h" +#include + +using namespace std::string_view_literals; + +namespace +{ + namespace random + { + inline constexpr std::string_view words[] = { + "acceptable"sv, "contain"sv, "ghost"sv, "mark"sv, "respect"sv, "taboo"sv, + "actually"sv, "cream"sv, "gleaming"sv, "meaty"sv, "rest"sv, "tacky"sv, + "addition"sv, "creature"sv, "glorious"sv, "memory"sv, "rice"sv, "tank"sv, + "adhesive"sv, "crime"sv, "gold"sv, "messy"sv, "rich"sv, "tent"sv, + "adorable"sv, "cross"sv, "grandfather"sv, "miss"sv, "righteous"sv, "terrible"sv, + "advise"sv, "crowded"sv, "gusty"sv, "modern"sv, "room"sv, "threatening"sv, + "afraid"sv, "crown"sv, "haircut"sv, "morning"sv, "rotten"sv, "three"sv, + "ancient"sv, "cure"sv, "hard-to-find"sv, "naughty"sv, "royal"sv, "ticket"sv, + "anxious"sv, "curious"sv, "harm"sv, "neck"sv, "run"sv, "title"sv, + "aromatic"sv, "curtain"sv, "heavy"sv, "night"sv, "satisfy"sv, "torpid"sv, + "attempt"sv, "cycle"sv, "helpless"sv, "nondescript"sv, "scary"sv, "train"sv, + "babies"sv, "deadpan"sv, "high-pitched"sv, "overjoyed"sv, "scatter"sv, "umbrella"sv, + "bake"sv, "decisive"sv, "hilarious"sv, "page"sv, "scene"sv, "unadvised"sv, + "ball"sv, "deeply"sv, "history"sv, "partner"sv, "scintillating"sv, "unbecoming"sv, + "bat"sv, "delightful"sv, "hook"sv, "party"sv, "self"sv, "unbiased"sv, + "behave"sv, "deserted"sv, "ignore"sv, "pause"sv, "selfish"sv, "unite"sv, + "best"sv, "draconian"sv, "imperfect"sv, "pear"sv, "silky"sv, "uptight"sv, + "birds"sv, "dreary"sv, "impossible"sv, "picture"sv, "sisters"sv, "used"sv, + "blind"sv, "dull"sv, "incandescent"sv, "place"sv, "ski"sv, "vengeful"sv, + "blood"sv, "enthusiastic"sv, "influence"sv, "playground"sv, "skip"sv, "versed"sv, + "blue-eyed"sv, "equable"sv, "innocent"sv, "popcorn"sv, "snow"sv, "vessel"sv, + "boiling"sv, "excuse"sv, "insidious"sv, "prefer"sv, "soap"sv, "view"sv, + "bore"sv, "experience"sv, "itch"sv, "productive"sv, "spare"sv, "voyage"sv, + "borrow"sv, "fabulous"sv, "jail"sv, "profuse"sv, "spicy"sv, "wall"sv, + "broken"sv, "familiar"sv, "kindhearted"sv, "protective"sv, "spiritual"sv, "want"sv, + "capable"sv, "finger"sv, "lackadaisical"sv, "pumped"sv, "sprout"sv, "weary"sv, + "charming"sv, "finicky"sv, "laughable"sv, "rabbit"sv, "squirrel"sv, "week"sv, + "cheerful"sv, "fix"sv, "leather"sv, "rapid"sv, "stale"sv, "whip"sv, + "chubby"sv, "flagrant"sv, "legal"sv, "regret"sv, "step"sv, "wilderness"sv, + "clean"sv, "flat"sv, "lewd"sv, "reject"sv, "stingy"sv, "wistful"sv, + "close"sv, "flimsy"sv, "license"sv, "rejoice"sv, "string"sv, "worried"sv, + "cobweb"sv, "fuel"sv, "light"sv, "relation"sv, "sulky"sv, "wretched"sv, + "complex"sv, "furtive"sv, "march"sv, "remarkable"sv, "surprise"sv, "zealous"sv, + "consist"sv, "geese"sv + }; + + [[nodiscard]] static bool boolean() noexcept + { + return std::rand() % 2 == 0; + } + + template + [[nodiscard]] static T integer(T excl_max) noexcept + { + return static_cast(static_cast(std::rand()) % excl_max); + } + + template + [[nodiscard]] static T integer(T incl_min, T excl_max) noexcept + { + return static_cast(incl_min + integer(excl_max - incl_min)); + } + + [[nodiscard]] static bool chance(float val) noexcept + { + val = (val < 0.0f ? 0.0f : (val > 1.0f ? 1.0f : val)) * 1000.0f; + return static_cast(integer(0, 1000)) <= val; + } + + [[nodiscard]] static toml::date date() noexcept + { + return toml::date{ integer(1900, 2021), // + integer(1, 13), + integer(1, 29) }; + } + + [[nodiscard]] static toml::time time() noexcept + { + return toml::time{ integer(24), // + integer(60), + integer(60), + boolean() ? integer(1000000000u) : 0u }; + } + + [[nodiscard]] static toml::time_offset time_offset() noexcept + { + return toml::time_offset{ integer(-11, 12), integer(-45, +46) }; + } + + [[nodiscard]] static toml::date_time date_time() noexcept + { + return boolean() ? toml::date_time{ date(), time() } // + : toml::date_time{ date(), time(), time_offset() }; + } + + [[nodiscard]] static std::string_view word() noexcept + { + return words[integer(std::size(words))]; + } + + [[nodiscard]] static std::string string(size_t word_count, char sep = ' ') + { + std::string val; + while (word_count-- > 0u) + { + if (!val.empty()) + val += sep; + val.append(word()); + } + return val; + } + + [[nodiscard]] static std::string key() + { + return random::string(random::integer(1u, 4u), '-'); + } + + } + + template + static auto add_to(toml::table& tbl, T&& val) -> toml::inserted_type_of& + { + while (true) + { + auto key = random::key(); + auto it = std::as_const(tbl).lower_bound(key); + if (it == tbl.cend() || it->first != key) + { + return *tbl.emplace_hint(it, std::move(key), static_cast(val)) + ->second.template as>(); + } + } + } + + template + static auto add_to(toml::array& arr, T&& val) -> toml::inserted_type_of& + { + return arr.emplace_back(static_cast(val)); + } + + template + static void add_value_to(Container& container) + { + static_assert(toml::is_container); + + switch (random::integer(7)) + { + case 0: add_to(container, random::string(random::integer(8u))); break; + case 1: add_to(container, random::integer(1000)); break; + case 2: add_to(container, random::integer(10001) / 10000.0); break; + case 3: add_to(container, random::boolean()); break; + case 4: add_to(container, random::date()); break; + case 5: add_to(container, random::time()); break; + case 6: add_to(container, random::date_time()); break; + default: break; + } + } + + static constexpr int max_inline_nesting = 2; + static constexpr int default_max_inline_values = 4; + + template + static void populate_inline_container(Container& container, + int& budget, + int inline_nesting = 0, + int max_values = default_max_inline_values) + { + static_assert(toml::is_container); + + auto values = random::integer(max_values); + while (budget && values) + { + // inline array/table + if (inline_nesting < max_inline_nesting && random::chance(0.25f)) + { + // array + if (random::boolean()) + { + auto& arr = add_to(container, toml::array{}); + populate_inline_container(arr, budget, inline_nesting + 1, default_max_inline_values); + } + + // table + else + { + auto& tbl = add_to(container, toml::table{}); + tbl.is_inline(true); + populate_inline_container(tbl, budget, inline_nesting + 1, default_max_inline_values); + } + } + + // regular value + else + { + add_value_to(container); + budget--; + } + + values--; + } + } + + static constexpr int max_top_level_nesting = 5; + static constexpr int max_array_of_tables_children = 4; + static constexpr int max_table_children = 4; + + static void populate_table(toml::table& tbl, int& budget, int nesting = 0) + { + assert(!tbl.is_inline()); + + // do simple values + inline tables/arrays first + populate_inline_container(tbl, budget, 0, 10); + + // add a nested array-of-tables + if (budget && nesting < max_top_level_nesting && random::chance(0.33f)) + { + auto& arr = add_to(tbl, toml::array{}); + // note we don't subtract from the budget for the outer array; + // it's "invisible" from a topological perspective when reading the output TOML + + auto children = random::integer(1, max_array_of_tables_children); + while (budget && children) + { + auto& sub_tbl = add_to(arr, toml::table{}); + budget--; + children--; + + populate_table(sub_tbl, budget, nesting + 1); + } + } + + // add nested tables + if (budget && nesting < max_top_level_nesting && random::chance(0.33f)) + { + auto children = random::integer(1, max_table_children); + while (budget && children) + { + auto& sub_tbl = add_to(tbl, toml::table{}); + budget--; + children--; + + populate_table(sub_tbl, budget, nesting + 1); + } + } + } +} + +int main(int argc, char** argv) +{ + int budget{}; + bool comments = true; + for (int i = 1; i < argc; i++) + { + const auto arg = std::string_view{ argv[i] }; + if (arg == "--nocomments"sv) + comments = false; + else + { + std::istringstream ss{ std::string(arg) }; + int num; + if ((ss >> num)) + budget += num; + else + { + std::cerr << "Unknown argument '"sv << arg << "'\n"; + return 1; + } + } + } + if (budget <= 0) + budget = 100; + + toml::table root; + while (budget > 0) + populate_table(root, budget); + + if (comments) + { + std::stringstream src; + src << root; + + std::string line; + std::ostringstream dest; + while (std::getline(src, line)) + { + if (line.empty()) + { + // occasionally dump a paragraph comment at the top-level of the document + if (random::chance(0.20f)) + { + auto lines = random::integer(1, 8); + while (lines--) + dest << "\n# "sv << random::string(random::integer(4u, 8u)); + dest << "\n"sv; + } + } + else + { + dest << line; + + // occasionally add short comments at end of non-blank lines + if (random::chance(0.30f)) + dest << " # "sv << random::string(random::integer(1u, 3u)); + } + + dest << "\n"sv; + } + std::cout << dest.str(); + } + else + { + std::cout << root << "\n"; + } + return 0; +} diff --git a/subprojects/tomlplusplus-3.3.0/examples/toml_generator.vcxproj b/subprojects/tomlplusplus-3.3.0/examples/toml_generator.vcxproj new file mode 100644 index 00000000..3b4e0b22 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/examples/toml_generator.vcxproj @@ -0,0 +1,62 @@ + + + + + Debug + x64 + + + Release + x64 + + + + 16.0 + {23CE3B73-FEE7-436C-9B4E-3DFB202EE9A2} + 10.0 + toml_generator + + + + Application + true + v143 + MultiByte + + + Application + false + v143 + true + MultiByte + + + + + + + + + Console + + + + ..\examples + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/subprojects/tomlplusplus-3.3.0/examples/toml_merger.cpp b/subprojects/tomlplusplus-3.3.0/examples/toml_merger.cpp new file mode 100644 index 00000000..99bcde2c --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/examples/toml_merger.cpp @@ -0,0 +1,101 @@ +// This file is a part of toml++ and is subject to the the terms of the MIT license. +// Copyright (c) Mark Gillard +// See https://github.com/marzer/tomlplusplus/blob/master/LICENSE for the full license text. +// SPDX-License-Identifier: MIT + +// This example demonstrates a method of merging one TOML data tree into another. + +#include "examples.h" +#include + +using namespace std::string_view_literals; + +namespace +{ + // recursively merge 'rhs' into 'lhs'. + // + // note that this implementation always prioritizes 'rhs' over 'lhs' in the event of a conflict; + // extending it to handle conflicts in some other manner is left as an exercise to the reader :) + + static void merge_left(toml::table& lhs, toml::table&& rhs); + + static void merge_left(toml::array& lhs, toml::array&& rhs) + { + rhs.for_each( + [&](std::size_t index, auto&& rhs_val) + { + // rhs index not found in lhs - direct move + if (lhs.size() <= index) + { + lhs.push_back(std::move(rhs_val)); + return; + } + + // both elements were the same container type - recurse into them + if constexpr (toml::is_container) + { + using rhs_type = std::remove_cv_t>; + if (auto lhs_child = lhs[index].as()) + { + merge_left(*lhs_child, std::move(rhs_val)); + return; + } + } + + // replace lhs element with rhs + lhs.replace(lhs.cbegin() + static_cast(index), std::move(rhs_val)); + }); + } + + static void merge_left(toml::table& lhs, toml::table&& rhs) + { + rhs.for_each( + [&](const toml::key& rhs_key, auto&& rhs_val) + { + auto lhs_it = lhs.lower_bound(rhs_key); + + // rhs key not found in lhs - direct move + if (lhs_it == lhs.cend() || lhs_it->first != rhs_key) + { + using rhs_type = std::remove_cv_t>; + lhs.emplace_hint(lhs_it, rhs_key, std::move(rhs_val)); + return; + } + + // both children were the same container type - recurse into them + if constexpr (toml::is_container) + { + using rhs_type = std::remove_cv_t>; + if (auto lhs_child = lhs_it->second.as()) + { + merge_left(*lhs_child, std::move(rhs_val)); + return; + } + } + + // replace lhs value with rhs + lhs.insert_or_assign(rhs_key, std::move(rhs_val)); + }); + } +} + +int main(int argc, char** argv) +{ + const auto base_path = argc > 1 ? std::string_view{ argv[1] } : "merge_base.toml"sv; + const auto overrides_path = argc > 2 ? std::string_view{ argv[2] } : "merge_overrides.toml"sv; + + toml::table tbl; + try + { + tbl = toml::parse_file(base_path); + merge_left(tbl, toml::parse_file(overrides_path)); + } + catch (const toml::parse_error& err) + { + std::cerr << err << "\n"; + return 1; + } + + std::cout << tbl << "\n"; + return 0; +} diff --git a/subprojects/tomlplusplus-3.3.0/examples/toml_merger.vcxproj b/subprojects/tomlplusplus-3.3.0/examples/toml_merger.vcxproj new file mode 100644 index 00000000..cb93dbbc --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/examples/toml_merger.vcxproj @@ -0,0 +1,63 @@ + + + + + Debug + x64 + + + Release + x64 + + + + 16.0 + {E467EB97-B066-4D38-B3DB-60961E3F96A1} + 10.0 + + + + Application + true + v143 + MultiByte + + + Application + false + v143 + true + MultiByte + + + + + + + + + Console + + + + ..\examples + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/subprojects/tomlplusplus-3.3.0/examples/toml_to_json_transcoder.cpp b/subprojects/tomlplusplus-3.3.0/examples/toml_to_json_transcoder.cpp new file mode 100644 index 00000000..881bcd55 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/examples/toml_to_json_transcoder.cpp @@ -0,0 +1,36 @@ +// This file is a part of toml++ and is subject to the the terms of the MIT license. +// Copyright (c) Mark Gillard +// See https://github.com/marzer/tomlplusplus/blob/master/LICENSE for the full license text. +// SPDX-License-Identifier: MIT + +// This example demonstrates how to use the toml::json_formatter to re-serialize TOML data as JSON. + +#include "examples.h" +#include + +using namespace std::string_view_literals; + +int main(int argc, char** argv) +{ + const auto path = argc > 1 ? std::string_view{ argv[1] } : ""sv; + + toml::table table; + try + { + // read directly from stdin + if (path == "-"sv || path.empty()) + table = toml::parse(std::cin, "stdin"sv); + + // read from a file + else + table = toml::parse_file(argv[1]); + } + catch (const toml::parse_error& err) + { + std::cerr << err << "\n"; + return 1; + } + + std::cout << toml::json_formatter{ table } << "\n"; + return 0; +} diff --git a/subprojects/tomlplusplus-3.3.0/examples/toml_to_json_transcoder.vcxproj b/subprojects/tomlplusplus-3.3.0/examples/toml_to_json_transcoder.vcxproj new file mode 100644 index 00000000..6ff8538c --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/examples/toml_to_json_transcoder.vcxproj @@ -0,0 +1,62 @@ + + + + + Debug + x64 + + + Release + x64 + + + + 16.0 + {BE34AA99-BEE6-4B50-B237-217E7C88FCB5} + 10.0 + toml_to_json_transcoder + + + + Application + true + v143 + MultiByte + + + Application + false + v143 + true + MultiByte + + + + + + + + + Console + + + + ..\examples + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/subprojects/tomlplusplus-3.3.0/include/meson.build b/subprojects/tomlplusplus-3.3.0/include/meson.build new file mode 100644 index 00000000..206dc6f5 --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/include/meson.build @@ -0,0 +1,52 @@ +# This file is a part of toml++ and is subject to the the terms of the MIT license. +# Copyright (c) Mark Gillard +# See https://github.com/marzer/tomlplusplus/blob/master/LICENSE for the full license text. +# SPDX-License-Identifier: MIT + +include_dir = include_directories('.') + +if not is_subproject + install_subdir('toml++', install_dir: get_option('includedir')) +endif + +if not build_lib # header-only mode + + tomlplusplus_dep = declare_dependency(include_directories: include_dir) + + if not is_subproject + import('pkgconfig').generate( + name: meson.project_name(), + description: 'Header-only TOML config file parser and serializer for C++', + install_dir: get_option('datadir')/'pkgconfig', + url: 'https://marzer.github.io/tomlplusplus' + ) + endif + + # cmake + if get_option('generate_cmake_config') and not is_subproject and not is_devel + cmake = import('cmake') + # Can't use until Meson 0.62.0, see https://github.com/mesonbuild/meson/pull/9916 + # and https://github.com/marzer/tomlplusplus/issues/140 + #cmake.write_basic_package_version_file( + # name: meson.project_name(), + # version: meson.project_version(), + # install_dir: get_option('datadir')/'cmake'/meson.project_name(), + # arch_independent: true + #) + # In the meantime, install a pre-generated Package Version file + configure_file( + configuration: {'version': meson.project_version()}, + input: '..'/'cmake'/'tomlplusplusConfigVersion.cmake.meson.in', + output: 'tomlplusplusConfigVersion.cmake', + install_dir: get_option('datadir')/'cmake'/meson.project_name() + ) + + cmake.configure_package_config_file( + name: meson.project_name(), + input: '..'/'cmake'/'tomlplusplusConfig.cmake.meson.in', + configuration: configuration_data({'includedir': get_option('includedir')}), + install_dir: get_option('datadir')/'cmake'/meson.project_name(), + ) + endif + +endif diff --git a/subprojects/tomlplusplus-3.3.0/include/toml++/impl/array.h b/subprojects/tomlplusplus-3.3.0/include/toml++/impl/array.h new file mode 100644 index 00000000..dd217c7a --- /dev/null +++ b/subprojects/tomlplusplus-3.3.0/include/toml++/impl/array.h @@ -0,0 +1,1727 @@ +//# This file is a part of toml++ and is subject to the the terms of the MIT license. +//# Copyright (c) Mark Gillard +//# See https://github.com/marzer/tomlplusplus/blob/master/LICENSE for the full license text. +// SPDX-License-Identifier: MIT +#pragma once + +#include "std_utility.h" +#include "std_vector.h" +#include "std_initializer_list.h" +#include "value.h" +#include "make_node.h" +#include "header_start.h" + +/// \cond +TOML_IMPL_NAMESPACE_START +{ + template + class TOML_TRIVIAL_ABI array_iterator + { + private: + template + friend class array_iterator; + + using mutable_vector_iterator = std::vector::iterator; + using const_vector_iterator = std::vector::const_iterator; + using vector_iterator = std::conditional_t; + + mutable vector_iterator iter_; + + public: + using value_type = std::conditional_t; + using reference = value_type&; + using pointer = value_type*; + using difference_type = ptrdiff_t; + using iterator_category = typename std::iterator_traits::iterator_category; + + TOML_NODISCARD_CTOR + array_iterator() noexcept = default; + + TOML_NODISCARD_CTOR + explicit array_iterator(mutable_vector_iterator iter) noexcept // + : iter_{ iter } + {} + + TOML_CONSTRAINED_TEMPLATE(C, bool C = IsConst) + TOML_NODISCARD_CTOR + explicit array_iterator(const_vector_iterator iter) noexcept // + : iter_{ iter } + {} + + TOML_CONSTRAINED_TEMPLATE(C, bool C = IsConst) + TOML_NODISCARD_CTOR + array_iterator(const array_iterator& other) noexcept // + : iter_{ other.iter_ } + {} + + TOML_NODISCARD_CTOR + array_iterator(const array_iterator&) noexcept = default; + + array_iterator& operator=(const array_iterator&) noexcept = default; + + array_iterator& operator++() noexcept // ++pre + { + ++iter_; + return *this; + } + + array_iterator operator++(int) noexcept // post++ + { + array_iterator out{ iter_ }; + ++iter_; + return out; + } + + array_iterator& operator--() noexcept // --pre + { + --iter_; + return *this; + } + + array_iterator operator--(int) noexcept // post-- + { + array_iterator out{ iter_ }; + --iter_; + return out; + } + + TOML_PURE_INLINE_GETTER + reference operator*() const noexcept + { + return *iter_->get(); + } + + TOML_PURE_INLINE_GETTER + pointer operator->() const noexcept + { + return iter_->get(); + } + + TOML_PURE_INLINE_GETTER + explicit operator const vector_iterator&() const noexcept + { + return iter_; + } + + TOML_CONSTRAINED_TEMPLATE(!C, bool C = IsConst) + TOML_PURE_INLINE_GETTER + explicit operator const const_vector_iterator() const noexcept + { + return iter_; + } + + array_iterator& operator+=(ptrdiff_t rhs) noexcept + { + iter_ += rhs; + return *this; + } + + array_iterator& operator-=(ptrdiff_t rhs) noexcept + { + iter_ -= rhs; + return *this; + } + + TOML_NODISCARD + friend array_iterator operator+(const array_iterator& lhs, ptrdiff_t rhs) noexcept + { + return array_iterator{ lhs.iter_ + rhs }; + } + + TOML_NODISCARD + friend array_iterator operator+(ptrdiff_t lhs, const array_iterator& rhs) noexcept + { + return array_iterator{ rhs.iter_ + lhs }; + } + + TOML_NODISCARD + friend array_iterator operator-(const array_iterator& lhs, ptrdiff_t rhs) noexcept + { + return array_iterator{ lhs.iter_ - rhs }; + } + + TOML_PURE_INLINE_GETTER + friend ptrdiff_t operator-(const array_iterator& lhs, const array_iterator& rhs) noexcept + { + return lhs.iter_ - rhs.iter_; + } + + TOML_PURE_INLINE_GETTER + friend bool operator==(const array_iterator& lhs, const array_iterator& rhs) noexcept + { + return lhs.iter_ == rhs.iter_; + } + + TOML_PURE_INLINE_GETTER + friend bool operator!=(const array_iterator& lhs, const array_iterator& rhs) noexcept + { + return lhs.iter_ != rhs.iter_; + } + + TOML_PURE_INLINE_GETTER + friend bool operator<(const array_iterator& lhs, const array_iterator& rhs) noexcept + { + return lhs.iter_ < rhs.iter_; + } + + TOML_PURE_INLINE_GETTER + friend bool operator<=(const array_iterator& lhs, const array_iterator& rhs) noexcept + { + return lhs.iter_ <= rhs.iter_; + } + + TOML_PURE_INLINE_GETTER + friend bool operator>(const array_iterator& lhs, const array_iterator& rhs) noexcept + { + return lhs.iter_ > rhs.iter_; + } + + TOML_PURE_INLINE_GETTER + friend bool operator>=(const array_iterator& lhs, const array_iterator& rhs) noexcept + { + return lhs.iter_ >= rhs.iter_; + } + + TOML_PURE_INLINE_GETTER + reference operator[](ptrdiff_t idx) const noexcept + { + return *(iter_ + idx)->get(); + } + }; + + struct array_init_elem + { + mutable node_ptr value; + + template + TOML_NODISCARD_CTOR + array_init_elem(T&& val, value_flags flags = preserve_source_value_flags) // + : value{ make_node(static_cast(val), flags) } + {} + }; +} +TOML_IMPL_NAMESPACE_END; +/// \endcond + +TOML_NAMESPACE_START +{ + /// \brief A RandomAccessIterator for iterating over elements in a toml::array. + using array_iterator = POXY_IMPLEMENTATION_DETAIL(impl::array_iterator); + + /// \brief A RandomAccessIterator for iterating over const elements in a toml::array. + using const_array_iterator = POXY_IMPLEMENTATION_DETAIL(impl::array_iterator); + + /// \brief A TOML array. + /// + /// \detail The interface of this type is modeled after std::vector, with some + /// additional considerations made for the heterogeneous nature of a + /// TOML array. + /// + /// \godbolt{sjK4da} + /// + /// \cpp + /// + /// toml::table tbl = toml::parse(R"( + /// arr = [1, 2, 3, 4, 'five'] + /// )"sv); + /// + /// // get the element as an array + /// toml::array& arr = *tbl.get_as("arr"); + /// std::cout << arr << "\n"; + /// + /// // increment each element with visit() + /// for (auto&& elem : arr) + /// { + /// elem.visit([](auto&& el) noexcept + /// { + /// if constexpr (toml::is_number) + /// (*el)++; + /// else if constexpr (toml::is_string) + /// el = "six"sv; + /// }); + /// } + /// std::cout << arr << "\n"; + /// + /// // add and remove elements + /// arr.push_back(7); + /// arr.push_back(8.0f); + /// arr.push_back("nine"sv); + /// arr.erase(arr.cbegin()); + /// std::cout << arr << "\n"; + /// + /// // emplace elements + /// arr.emplace_back("ten"); + /// arr.emplace_back(11, 12.0); + /// std::cout << arr << "\n"; + /// \ecpp + /// + /// \out + /// [ 1, 2, 3, 4, 'five' ] + /// [ 2, 3, 4, 5, 'six' ] + /// [ 3, 4, 5, 'six', 7, 8.0, 'nine' ] + /// [ 3, 4, 5, 'six', 7, 8.0, 'nine', 'ten', [ 11, 12.0 ] ] + /// \eout + class TOML_EXPORTED_CLASS array : public node + { + private: + /// \cond + + using vector_type = std::vector; + using vector_iterator = typename vector_type::iterator; + using const_vector_iterator = typename vector_type::const_iterator; + vector_type elems_; + + TOML_NODISCARD_CTOR + TOML_EXPORTED_MEMBER_FUNCTION + array(const impl::array_init_elem*, const impl::array_init_elem*); + + TOML_NODISCARD_CTOR + array(std::false_type, std::initializer_list elems) // + : array{ elems.begin(), elems.end() } + {} + + TOML_EXPORTED_MEMBER_FUNCTION + void preinsertion_resize(size_t idx, size_t count); + + TOML_EXPORTED_MEMBER_FUNCTION + void insert_at_back(impl::node_ptr&&); + + TOML_EXPORTED_MEMBER_FUNCTION + vector_iterator insert_at(const_vector_iterator, impl::node_ptr&&); + + template + void emplace_back_if_not_empty_view(T&& val, value_flags flags) + { + if constexpr (is_node_view) + { + if (!val) + return; + } + insert_at_back(impl::make_node(static_cast(val), flags)); + } + + TOML_NODISCARD + TOML_EXPORTED_MEMBER_FUNCTION + size_t total_leaf_count() const noexcept; + + TOML_EXPORTED_MEMBER_FUNCTION + void flatten_child(array&& child, size_t& dest_index) noexcept; + + /// \endcond + + public: + using value_type = node; + using size_type = size_t; + using difference_type = ptrdiff_t; + using reference = node&; + using const_reference = const node&; + + /// \brief Default constructor. + TOML_NODISCARD_CTOR + TOML_EXPORTED_MEMBER_FUNCTION + array() noexcept; + + TOML_EXPORTED_MEMBER_FUNCTION + ~array() noexcept; + + /// \brief Copy constructor. + TOML_NODISCARD_CTOR + TOML_EXPORTED_MEMBER_FUNCTION + array(const array&); + + /// \brief Move constructor. + TOML_NODISCARD_CTOR + TOML_EXPORTED_MEMBER_FUNCTION + array(array&& other) noexcept; + + /// \brief Constructs an array with one or more initial elements. + /// + /// \detail \cpp + /// auto arr = toml::array{ 1, 2.0, "three"sv, toml::array{ 4, 5 } }; + /// std::cout << arr << "\n"; + /// \ecpp + /// + /// \out + /// [ 1, 2.0, 'three', [ 4, 5 ] ] + /// \eout + /// + /// \remark \parblock If you need to construct an array with one child array element, the array's move constructor + /// will take precedence and perform a move-construction instead. You can use toml::inserter to + /// suppress this behaviour: \cpp + /// // desired result: [ [ 42 ] ] + /// auto bad = toml::array{ toml::array{ 42 } } + /// auto good = toml::array{ toml::inserter{ toml::array{ 42 } } } + /// std::cout << "bad: " << bad << "\n"; + /// std::cout << "good:" << good << "\n"; + /// \ecpp + /// + /// \out + /// bad: [ 42 ] + /// good: [ [ 42 ] ] + /// \eout + /// + /// \endparblock + /// + /// \tparam ElemType One of the TOML node or value types (or a type promotable to one). + /// \tparam ElemTypes One of the TOML node or value types (or a type promotable to one). + /// \param val The node or value used to initialize element 0. + /// \param vals The nodes or values used to initialize elements 1...N. + TOML_CONSTRAINED_TEMPLATE((sizeof...(ElemTypes) > 0 || !std::is_same_v, array>), + typename ElemType, + typename... ElemTypes) + TOML_NODISCARD_CTOR + explicit array(ElemType&& val, ElemTypes&&... vals) + : array{ std::false_type{}, + std::initializer_list{ static_cast(val), + static_cast(vals)... } } + {} + + /// \brief Copy-assignment operator. + TOML_EXPORTED_MEMBER_FUNCTION + array& operator=(const array&); + + /// \brief Move-assignment operator. + TOML_EXPORTED_MEMBER_FUNCTION + array& operator=(array&& rhs) noexcept; + + /// \name Type checks + /// @{ + + /// \brief Returns #toml::node_type::array. + TOML_CONST_INLINE_GETTER + node_type type() const noexcept final + { + return node_type::array; + } + + TOML_PURE_GETTER + TOML_EXPORTED_MEMBER_FUNCTION + bool is_homogeneous(node_type ntype) const noexcept final; + + TOML_PURE_GETTER + TOML_EXPORTED_MEMBER_FUNCTION + bool is_homogeneous(node_type ntype, node*& first_nonmatch) noexcept final; + + TOML_PURE_GETTER + TOML_EXPORTED_MEMBER_FUNCTION + bool is_homogeneous(node_type ntype, const node*& first_nonmatch) const noexcept final; + + /// \cond + template + TOML_PURE_GETTER + bool is_homogeneous() const noexcept + { + using type = impl::remove_cvref>; + static_assert(std::is_void_v || toml::is_value || toml::is_container, + "The template type argument of array::is_homogeneous() must be void or one " + "of:" TOML_SA_UNWRAPPED_NODE_TYPE_LIST); + + return is_homogeneous(impl::node_type_of); + } + /// \endcond + + /// \brief Returns `false`. + TOML_CONST_INLINE_GETTER + bool is_table() const noexcept final + { + return false; + } + + /// \brief Returns `true`. + TOML_CONST_INLINE_GETTER + bool is_array() const noexcept final + { + return true; + } + + /// \brief Returns `true` if the array contains only tables. + TOML_PURE_GETTER + bool is_array_of_tables() const noexcept final + { + return is_homogeneous(node_type::table); + } + + /// \brief Returns `false`. + TOML_CONST_INLINE_GETTER + bool is_value() const noexcept final + { + return false; + } + + /// \brief Returns `false`. + TOML_CONST_INLINE_GETTER + bool is_string() const noexcept final + { + return false; + } + + /// \brief Returns `false`. + TOML_CONST_INLINE_GETTER + bool is_integer() const noexcept final + { + return false; + } + + /// \brief Returns `false`. + TOML_CONST_INLINE_GETTER + bool is_floating_point() const noexcept final + { + return false; + } + + /// \brief Returns `false`. + TOML_CONST_INLINE_GETTER + bool is_number() const noexcept final + { + return false; + } + + /// \brief Returns `false`. + TOML_CONST_INLINE_GETTER + bool is_boolean() const noexcept final + { + return false; + } + + /// \brief Returns `false`. + TOML_CONST_INLINE_GETTER + bool is_date() const noexcept final + { + return false; + } + + /// \brief Returns `false`. + TOML_CONST_INLINE_GETTER + bool is_time() const noexcept final + { + return false; + } + + /// \brief Returns `false`. + TOML_CONST_INLINE_GETTER + bool is_date_time() const noexcept final + { + return false; + } + + /// @} + + /// \name Type casts + /// @{ + + /// \brief Returns `nullptr`. + TOML_CONST_INLINE_GETTER + table* as_table() noexcept final + { + return nullptr; + } + + /// \brief Returns a pointer to the array. + TOML_CONST_INLINE_GETTER + array* as_array() noexcept final + { + return this; + } + + /// \brief Returns `nullptr`. + TOML_CONST_INLINE_GETTER + toml::value* as_string() noexcept final + { + return nullptr; + } + + /// \brief Returns `nullptr`. + TOML_CONST_INLINE_GETTER + toml::value* as_integer() noexcept final + { + return nullptr; + } + + /// \brief Returns `nullptr`. + TOML_CONST_INLINE_GETTER + toml::value* as_floating_point() noexcept final + { + return nullptr; + } + + /// \brief Returns `nullptr`. + TOML_CONST_INLINE_GETTER + toml::value* as_boolean() noexcept final + { + return nullptr; + } + + /// \brief Returns `nullptr`. + TOML_CONST_INLINE_GETTER + toml::value* as_date() noexcept final + { + return nullptr; + } + + /// \brief Returns `nullptr`. + TOML_CONST_INLINE_GETTER + toml::value