From 3e4abc9b019857dccf329473dc0a1c9a8b0cef43 Mon Sep 17 00:00:00 2001 From: david Date: Sat, 14 Feb 2009 17:52:52 +0100 Subject: [PATCH] o add fat filesystem test for arm lpc2148 --- poc/lpc2148_efsl/Makefile | 26 + poc/lpc2148_efsl/conf/config-sample-at91.h | 151 + poc/lpc2148_efsl/conf/config-sample-avr.h | 157 + poc/lpc2148_efsl/conf/config-sample-linux.h | 129 + poc/lpc2148_efsl/conf/config-sample-lpc2000.h | 153 + poc/lpc2148_efsl/conf/config-sample-nios2.h | 133 + poc/lpc2148_efsl/conf/config.h | 153 + poc/lpc2148_efsl/docs/Makefile | 13 + .../docs/arm_info_also_in_pages_arm.txt | 1 + poc/lpc2148_efsl/docs/manual.pdf | Bin 0 -> 346004 bytes poc/lpc2148_efsl/docs/manual.tex | 132 + poc/lpc2148_efsl/docs/pages/arm7.tex | 223 ++ poc/lpc2148_efsl/docs/pages/avr.tex | 190 + poc/lpc2148_efsl/docs/pages/config.tex | 194 + poc/lpc2148_efsl/docs/pages/dateandtime.tex | 34 + poc/lpc2148_efsl/docs/pages/debug.tex | 40 + poc/lpc2148_efsl/docs/pages/driver.tex | 165 + poc/lpc2148_efsl/docs/pages/efs_init.tex | 45 + poc/lpc2148_efsl/docs/pages/file_fclose.tex | 43 + poc/lpc2148_efsl/docs/pages/file_fopen.tex | 70 + poc/lpc2148_efsl/docs/pages/file_read.tex | 51 + poc/lpc2148_efsl/docs/pages/file_write.tex | 52 + poc/lpc2148_efsl/docs/pages/freespace.tex | 35 + poc/lpc2148_efsl/docs/pages/ioman.tex | 236 ++ poc/lpc2148_efsl/docs/pages/lgpl.txt | 489 +++ poc/lpc2148_efsl/docs/pages/license.tex | 12 + poc/lpc2148_efsl/docs/pages/linux.tex | 138 + poc/lpc2148_efsl/docs/pages/lsgetnext.tex | 52 + poc/lpc2148_efsl/docs/pages/lsopendir.tex | 42 + poc/lpc2148_efsl/docs/pages/mkdir.tex | 47 + poc/lpc2148_efsl/docs/pages/plibc.tex | 62 + poc/lpc2148_efsl/docs/pages/preface.tex | 31 + poc/lpc2148_efsl/docs/pages/rmfile.tex | 42 + poc/lpc2148_efsl/docs/pages/tms6713.tex | 98 + poc/lpc2148_efsl/docs/pages/types.tex | 26 + poc/lpc2148_efsl/docs/pages/utils.tex | 84 + poc/lpc2148_efsl/docs/pics/sdcard.eps | 3501 +++++++++++++++++ poc/lpc2148_efsl/docs/pics/sdconnection.eps | 2938 ++++++++++++++ poc/lpc2148_efsl/docs/readme_arm7.txt | 223 ++ .../docs/schematics/objectmodel.dia | Bin 0 -> 1198 bytes .../docs/schematics/objectmodel.eps | 1158 ++++++ poc/lpc2148_efsl/docs/schematics/sdcard.dia | Bin 0 -> 2594 bytes poc/lpc2148_efsl/docs/schematics/sdcard.eps | 1844 +++++++++ poc/lpc2148_efsl/docs/schematics/sector.dia | Bin 0 -> 1263 bytes poc/lpc2148_efsl/docs/schematics/sector.eps | 1407 +++++++ poc/lpc2148_efsl/inc/debug.h | 128 + poc/lpc2148_efsl/inc/dir.h | 88 + poc/lpc2148_efsl/inc/disc.h | 93 + poc/lpc2148_efsl/inc/efs.h | 63 + poc/lpc2148_efsl/inc/error.h | 123 + poc/lpc2148_efsl/inc/extract.h | 74 + poc/lpc2148_efsl/inc/fat.h | 62 + poc/lpc2148_efsl/inc/file.h | 95 + poc/lpc2148_efsl/inc/fs.h | 216 + poc/lpc2148_efsl/inc/interface.h | 56 + .../inc/interfaces/AT91SAM7S_regs.h | 301 ++ .../inc/interfaces/LPC2000_regs.h | 72 + poc/lpc2148_efsl/inc/interfaces/arm_spi.h | 65 + poc/lpc2148_efsl/inc/interfaces/atmega128.h | 70 + poc/lpc2148_efsl/inc/interfaces/dsp67xx.h | 61 + .../inc/interfaces/efsl_dbg_printf_arm.h | 7 + poc/lpc2148_efsl/inc/interfaces/helper.h | 49 + poc/lpc2148_efsl/inc/interfaces/linuxfile.h | 67 + poc/lpc2148_efsl/inc/interfaces/nios2.h | 62 + poc/lpc2148_efsl/inc/interfaces/sd.h | 66 + poc/lpc2148_efsl/inc/ioman.h | 135 + poc/lpc2148_efsl/inc/ioman_v2.h | 123 + poc/lpc2148_efsl/inc/ls.h | 68 + poc/lpc2148_efsl/inc/mkfs.h | 48 + poc/lpc2148_efsl/inc/partition.h | 77 + poc/lpc2148_efsl/inc/plibc.h | 48 + poc/lpc2148_efsl/inc/time.h | 70 + poc/lpc2148_efsl/inc/types.h | 106 + poc/lpc2148_efsl/inc/ui.h | 48 + poc/lpc2148_efsl/src/debug.c | 332 ++ poc/lpc2148_efsl/src/dir.c | 369 ++ poc/lpc2148_efsl/src/disc.c | 68 + poc/lpc2148_efsl/src/efs.c | 68 + poc/lpc2148_efsl/src/extract.c | 191 + poc/lpc2148_efsl/src/fat.c | 607 +++ poc/lpc2148_efsl/src/file.c | 510 +++ poc/lpc2148_efsl/src/fs.c | 523 +++ poc/lpc2148_efsl/src/interfaces/at91_spi.c | 270 ++ poc/lpc2148_efsl/src/interfaces/atmega128.c | 110 + poc/lpc2148_efsl/src/interfaces/dsp67xx.c | 93 + .../src/interfaces/efsl_dbg_printf_arm.c | 243 ++ poc/lpc2148_efsl/src/interfaces/helper.c | 94 + poc/lpc2148_efsl/src/interfaces/linuxfile.c | 112 + poc/lpc2148_efsl/src/interfaces/lpc2000_spi.c | 291 ++ poc/lpc2148_efsl/src/interfaces/nios2.c | 124 + poc/lpc2148_efsl/src/interfaces/sd.c | 350 ++ poc/lpc2148_efsl/src/ioman.c | 611 +++ poc/lpc2148_efsl/src/ioman_v2.c | 402 ++ poc/lpc2148_efsl/src/ls.c | 140 + poc/lpc2148_efsl/src/mkfs.c | 301 ++ poc/lpc2148_efsl/src/partition.c | 152 + poc/lpc2148_efsl/src/plibc.c | 82 + poc/lpc2148_efsl/src/regressiontest.c | 352 ++ poc/lpc2148_efsl/src/time.c | 89 + poc/lpc2148_efsl/src/ui.c | 230 ++ poc/lpc2148_efsl/test/Makefile | 437 ++ poc/lpc2148_efsl/test/crt.s | 110 + poc/lpc2148_efsl/test/flash.ocd | 7 + poc/lpc2148_efsl/test/inttypes.h | 150 + poc/lpc2148_efsl/test/lpc2148-ram.ld | 197 + poc/lpc2148_efsl/test/lpc2148-rom.ld | 197 + poc/lpc2148_efsl/test/lpc214x.h | 364 ++ poc/lpc2148_efsl/test/lpcUART.h | 86 + poc/lpc2148_efsl/test/lpc_config.h | 52 + poc/lpc2148_efsl/test/main.bin | Bin 0 -> 23076 bytes poc/lpc2148_efsl/test/main.c | 167 + poc/lpc2148_efsl/test/startup.c | 129 + poc/lpc2148_efsl/test/startup.h | 1 + poc/lpc2148_efsl/test/uart.c | 168 + poc/lpc2148_efsl/test/uart.h | 74 + 115 files changed, 26014 insertions(+) create mode 100644 poc/lpc2148_efsl/Makefile create mode 100644 poc/lpc2148_efsl/conf/config-sample-at91.h create mode 100644 poc/lpc2148_efsl/conf/config-sample-avr.h create mode 100644 poc/lpc2148_efsl/conf/config-sample-linux.h create mode 100644 poc/lpc2148_efsl/conf/config-sample-lpc2000.h create mode 100644 poc/lpc2148_efsl/conf/config-sample-nios2.h create mode 100644 poc/lpc2148_efsl/conf/config.h create mode 100644 poc/lpc2148_efsl/docs/Makefile create mode 100644 poc/lpc2148_efsl/docs/arm_info_also_in_pages_arm.txt create mode 100644 poc/lpc2148_efsl/docs/manual.pdf create mode 100644 poc/lpc2148_efsl/docs/manual.tex create mode 100644 poc/lpc2148_efsl/docs/pages/arm7.tex create mode 100644 poc/lpc2148_efsl/docs/pages/avr.tex create mode 100644 poc/lpc2148_efsl/docs/pages/config.tex create mode 100644 poc/lpc2148_efsl/docs/pages/dateandtime.tex create mode 100644 poc/lpc2148_efsl/docs/pages/debug.tex create mode 100644 poc/lpc2148_efsl/docs/pages/driver.tex create mode 100644 poc/lpc2148_efsl/docs/pages/efs_init.tex create mode 100644 poc/lpc2148_efsl/docs/pages/file_fclose.tex create mode 100644 poc/lpc2148_efsl/docs/pages/file_fopen.tex create mode 100644 poc/lpc2148_efsl/docs/pages/file_read.tex create mode 100644 poc/lpc2148_efsl/docs/pages/file_write.tex create mode 100644 poc/lpc2148_efsl/docs/pages/freespace.tex create mode 100644 poc/lpc2148_efsl/docs/pages/ioman.tex create mode 100644 poc/lpc2148_efsl/docs/pages/lgpl.txt create mode 100644 poc/lpc2148_efsl/docs/pages/license.tex create mode 100644 poc/lpc2148_efsl/docs/pages/linux.tex create mode 100644 poc/lpc2148_efsl/docs/pages/lsgetnext.tex create mode 100644 poc/lpc2148_efsl/docs/pages/lsopendir.tex create mode 100644 poc/lpc2148_efsl/docs/pages/mkdir.tex create mode 100644 poc/lpc2148_efsl/docs/pages/plibc.tex create mode 100644 poc/lpc2148_efsl/docs/pages/preface.tex create mode 100644 poc/lpc2148_efsl/docs/pages/rmfile.tex create mode 100644 poc/lpc2148_efsl/docs/pages/tms6713.tex create mode 100644 poc/lpc2148_efsl/docs/pages/types.tex create mode 100644 poc/lpc2148_efsl/docs/pages/utils.tex create mode 100644 poc/lpc2148_efsl/docs/pics/sdcard.eps create mode 100644 poc/lpc2148_efsl/docs/pics/sdconnection.eps create mode 100644 poc/lpc2148_efsl/docs/readme_arm7.txt create mode 100644 poc/lpc2148_efsl/docs/schematics/objectmodel.dia create mode 100644 poc/lpc2148_efsl/docs/schematics/objectmodel.eps create mode 100644 poc/lpc2148_efsl/docs/schematics/sdcard.dia create mode 100644 poc/lpc2148_efsl/docs/schematics/sdcard.eps create mode 100644 poc/lpc2148_efsl/docs/schematics/sector.dia create mode 100644 poc/lpc2148_efsl/docs/schematics/sector.eps create mode 100644 poc/lpc2148_efsl/inc/debug.h create mode 100644 poc/lpc2148_efsl/inc/dir.h create mode 100644 poc/lpc2148_efsl/inc/disc.h create mode 100644 poc/lpc2148_efsl/inc/efs.h create mode 100644 poc/lpc2148_efsl/inc/error.h create mode 100644 poc/lpc2148_efsl/inc/extract.h create mode 100644 poc/lpc2148_efsl/inc/fat.h create mode 100644 poc/lpc2148_efsl/inc/file.h create mode 100644 poc/lpc2148_efsl/inc/fs.h create mode 100644 poc/lpc2148_efsl/inc/interface.h create mode 100644 poc/lpc2148_efsl/inc/interfaces/AT91SAM7S_regs.h create mode 100644 poc/lpc2148_efsl/inc/interfaces/LPC2000_regs.h create mode 100644 poc/lpc2148_efsl/inc/interfaces/arm_spi.h create mode 100644 poc/lpc2148_efsl/inc/interfaces/atmega128.h create mode 100644 poc/lpc2148_efsl/inc/interfaces/dsp67xx.h create mode 100644 poc/lpc2148_efsl/inc/interfaces/efsl_dbg_printf_arm.h create mode 100644 poc/lpc2148_efsl/inc/interfaces/helper.h create mode 100644 poc/lpc2148_efsl/inc/interfaces/linuxfile.h create mode 100644 poc/lpc2148_efsl/inc/interfaces/nios2.h create mode 100644 poc/lpc2148_efsl/inc/interfaces/sd.h create mode 100644 poc/lpc2148_efsl/inc/ioman.h create mode 100644 poc/lpc2148_efsl/inc/ioman_v2.h create mode 100644 poc/lpc2148_efsl/inc/ls.h create mode 100644 poc/lpc2148_efsl/inc/mkfs.h create mode 100644 poc/lpc2148_efsl/inc/partition.h create mode 100644 poc/lpc2148_efsl/inc/plibc.h create mode 100644 poc/lpc2148_efsl/inc/time.h create mode 100644 poc/lpc2148_efsl/inc/types.h create mode 100644 poc/lpc2148_efsl/inc/ui.h create mode 100644 poc/lpc2148_efsl/src/debug.c create mode 100644 poc/lpc2148_efsl/src/dir.c create mode 100644 poc/lpc2148_efsl/src/disc.c create mode 100644 poc/lpc2148_efsl/src/efs.c create mode 100644 poc/lpc2148_efsl/src/extract.c create mode 100644 poc/lpc2148_efsl/src/fat.c create mode 100644 poc/lpc2148_efsl/src/file.c create mode 100644 poc/lpc2148_efsl/src/fs.c create mode 100644 poc/lpc2148_efsl/src/interfaces/at91_spi.c create mode 100644 poc/lpc2148_efsl/src/interfaces/atmega128.c create mode 100644 poc/lpc2148_efsl/src/interfaces/dsp67xx.c create mode 100644 poc/lpc2148_efsl/src/interfaces/efsl_dbg_printf_arm.c create mode 100644 poc/lpc2148_efsl/src/interfaces/helper.c create mode 100644 poc/lpc2148_efsl/src/interfaces/linuxfile.c create mode 100644 poc/lpc2148_efsl/src/interfaces/lpc2000_spi.c create mode 100644 poc/lpc2148_efsl/src/interfaces/nios2.c create mode 100644 poc/lpc2148_efsl/src/interfaces/sd.c create mode 100644 poc/lpc2148_efsl/src/ioman.c create mode 100644 poc/lpc2148_efsl/src/ioman_v2.c create mode 100644 poc/lpc2148_efsl/src/ls.c create mode 100644 poc/lpc2148_efsl/src/mkfs.c create mode 100644 poc/lpc2148_efsl/src/partition.c create mode 100644 poc/lpc2148_efsl/src/plibc.c create mode 100644 poc/lpc2148_efsl/src/regressiontest.c create mode 100644 poc/lpc2148_efsl/src/time.c create mode 100644 poc/lpc2148_efsl/src/ui.c create mode 100644 poc/lpc2148_efsl/test/Makefile create mode 100644 poc/lpc2148_efsl/test/crt.s create mode 100644 poc/lpc2148_efsl/test/flash.ocd create mode 100644 poc/lpc2148_efsl/test/inttypes.h create mode 100644 poc/lpc2148_efsl/test/lpc2148-ram.ld create mode 100644 poc/lpc2148_efsl/test/lpc2148-rom.ld create mode 100644 poc/lpc2148_efsl/test/lpc214x.h create mode 100644 poc/lpc2148_efsl/test/lpcUART.h create mode 100644 poc/lpc2148_efsl/test/lpc_config.h create mode 100755 poc/lpc2148_efsl/test/main.bin create mode 100644 poc/lpc2148_efsl/test/main.c create mode 100644 poc/lpc2148_efsl/test/startup.c create mode 100644 poc/lpc2148_efsl/test/startup.h create mode 100644 poc/lpc2148_efsl/test/uart.c create mode 100644 poc/lpc2148_efsl/test/uart.h diff --git a/poc/lpc2148_efsl/Makefile b/poc/lpc2148_efsl/Makefile new file mode 100644 index 0000000..53ecea0 --- /dev/null +++ b/poc/lpc2148_efsl/Makefile @@ -0,0 +1,26 @@ +# efsl library makefile for LPC2000 +# by Martin Thomas +# (based on the efsl avr- and the WinARM-template makefiles) + +MCU = arm7tdmi +#THUMB = -mthumb -mthumb-interwork + +COPT= -mcpu=$(MCU) $(THUMB) -gdwarf-2 -Wall -Os +INCLUDEDIRS=-Iinc -Iconf +CFLAGS=$(COPT) $(INCLUDEDIRS) +CC=arm-elf-gcc +AR=arm-elf-ar +OBJCOPY=arm-elf-objcopy +OBJ=src/efs.o src/plibc.o src/disc.o src/partition.o src/time.o src/fs.o src/fat.o src/file.o src/dir.o src/mkfs.o src/debug.o src/ioman.o src/ui.o src/extract.o src/interfaces/sd.o +OBJ+=src/ls.o +OBJ+=src/interfaces/efsl_dbg_printf_arm.o +OBJ+=src/interfaces/lpc2000_spi.o + +all: lib + +lib: $(OBJ) + $(AR) rcs libefsl.a $(OBJ) + +clean : + rm -f $(OBJ) libefsl.a + diff --git a/poc/lpc2148_efsl/conf/config-sample-at91.h b/poc/lpc2148_efsl/conf/config-sample-at91.h new file mode 100644 index 0000000..54a4b96 --- /dev/null +++ b/poc/lpc2148_efsl/conf/config-sample-at91.h @@ -0,0 +1,151 @@ +#ifndef __EFSL_CONFIG_H__ +#define __EFSL_CONFIG_H__ + +/* Hardware target + --------------- + + * Here you will define for what hardware-endpoint EFSL should be compiled. + * Look in interfaces.h to see what systems are supported, and add your own + * there if you need to write your own driver. Then, define the name you + * selected for your hardware there here. Make sure that you only select one + * device! +*/ + + /*#define HW_ENDPOINT_LINUX*/ + /*#define HW_ENDPOINT_ATMEGA128_SD*/ + + /*#define HW_ENDPOINT_DSP_TI6713_SD*/ + + /*#define HW_ENDPOINT_LPC2000_SD*/ + /* defines the interface for LPC213x (0=SPI0 1=SPI1) */ + /*#define HW_ENDPOINT_LPC2000_SPINUM (0)*/ + /*#define HW_ENDPOINT_LPC2000_SPINUM (1)*/ + + #define HW_ENDPOINT_AT91_SD + /* define the chip-select line in at91_spi.c */ + +/* Memory configuration + -------------------- + + * Here you must configure wheter your processor can access memory byte + * oriented. All x86 processors can do it, AVR's can do it to. Some DSP + * or other microcontrollers can't. If you have an 8 bit system you're safe. + * If you are really unsure, leave the setting commented out, it will be slower + * but it will work for sure. +*/ + + /* disabled for ARM (mt): #define BYTE_ALIGNMENT */ + +/* + * mthomas: define the attribute for packed structures + * to avoid alignment problems with ARM controllers +*/ + #define ATTR_PACKED __attribute__((packed)) /* ARM */ + + +/* Cache configuration + ------------------- + + * Here you must configure how much memory of cache you can/want to use. + * The number you put at IOMAN_NUMBUFFER is multiplied by 512. So 1 means + * 512 bytes cache, 4 means 2048 bytes cache. More is better. + * The number after IOMAN_NUMITERATIONS should be untouched. + * The last field (IOMAN_DO_MEMALLOC) is to tell ioman to allocate it's + * own memory in it's structure, or not. If you choose to do it yourself + * you will have to pass a pointer to the memory as the last argument of + * ioman_init. +*/ + /*#define IOMAN_NUMBUFFER 1*/ + #define IOMAN_NUMBUFFER 6 /* 32kB RAM on the LPC2138 - let's use 3 kB */ + #define IOMAN_NUMITERATIONS 3 + #define IOMAN_DO_MEMALLOC + +/* Cluster pre-allocation + ---------------------- + + * When writing files, the function that performs the actual write has to + * calculate how many clusters it will need for that request. It then allocates + * that number of new clusters to the file. Since this involves some calculations + * and writing of the FAT, you might find it beneficial to limit the number of + * allocations, and allow fwrite to pre-allocate a number of clusters extra. + * This setting determines how many clusters will be extra allocated whenever + * this is required. + * Take in carefull consideration how large your clustersize is, putting 10 here + * with a clustersize of 32kb means you might waste 320 kb. + * The first option is for preallocating files, the other is used when enlarging + * a directory to accomodate more files +*/ + /*#define CLUSTER_PREALLOC_FILE 0*/ + #define CLUSTER_PREALLOC_FILE 1 + #define CLUSTER_PREALLOC_DIRECTORY 0 + + +/* Endianess configuration + ----------------------- + + * Here you can configure wheter your architecture is little or big endian. This + * is important since all FAT structures are stored in intel little endian order. + * So if you have a big endian system the library has to convert all figures to + * big endian in order to work. + */ + #define LITTLE_ENDIAN + + +/* Date and Time support + --------------------- + + * Here you can enable or disable date and time support. If you enable + * it you will have to create 6 functions, that are described in the + * EFSL manual. If the functions are not present when linking your + * program with the library you will get unresolved dependencies. + */ + /*#define DATE_TIME_SUPPORT*/ + +/* Error reporting support + ----------------------- + + * When you receive an error in userland, it usually only gives limited + * information (most likely, fail or success). If error detection and + * reporting is important for you, you can enable more detailed error + * reporting here. This is optional, the costs are 1 byte per object, + * and a small increase in code size. + * You can enable error recording for all object, or you can select the + * object manually. + * For full error reporting use FULL_ERROR_SUPPORT + * For only the base-core of the library use BASE_ERROR_SUPPORT + * For IO/Man use ERRSUP_IOMAN + * For Disc use ERRSUP_IOMAN + * For Part use ERRSUP_PARTITION + * For Fs use ERRSUP_FILESYSTEM + * For File use ERRSUP_FILE +*/ + + #define FULL_ERROR_SUPPORT + /*#define BASE_ERROR_SUPPORT*/ + +/* List options + ------------ + + * In this section youcan configure what kind of data you will get from + * directory listing requests. Please refer to the documentation for + * more information +*/ + +#define LIST_MAXLENFILENAME 12 + + + + +/* Debugging configuration + ----------------------- + + * Here you can configure the debugging behaviour. Debugging is different + * on every platform (see debug.h for more information). + * If your hardware has no means of output (printf) dont define any anything, + * and nothing will happen. For real world use debugging should be turned off. +*/ + + #define DEBUG + + +#endif diff --git a/poc/lpc2148_efsl/conf/config-sample-avr.h b/poc/lpc2148_efsl/conf/config-sample-avr.h new file mode 100644 index 0000000..3f5ef39 --- /dev/null +++ b/poc/lpc2148_efsl/conf/config-sample-avr.h @@ -0,0 +1,157 @@ +#ifndef __EFSL_CONFIG_H__ +#define __EFSL_CONFIG_H__ + +/* Hardware target + --------------- + + * Here you will define for what hardware-endpoint EFSL should be compiled. + * Look in interfaces.h to see what systems are supported, and add your own + * there if you need to write your own driver. Then, define the name you + * selected for your hardware there here. Make sure that you only select one + * device! +*/ + + /*#define HW_ENDPOINT_LINUX*/ + #define HW_ENDPOINT_ATMEGA128_SD + /*#define HW_ENDPOINT_DSP_TI6713_SD*/ + + +/* Memory configuration + -------------------- + + * Here you must configure wheter your processor can access memory byte + * oriented. All x86 processors can do it, AVR's can do it to. Some DSP + * or other microcontrollers can't. If you have an 8 bit system you're safe. + * If you are really unsure, leave the setting commented out, it will be slower + * but it will work for sure. +*/ + + #define BYTE_ALIGNMENT + +/* Cache configuration + ------------------- + + * Here you must configure how much memory of cache you can/want to use. + * The number you put at IOMAN_NUMBUFFER is multiplied by 512. So 1 means + * 512 bytes cache, 4 means 2048 bytes cache. More is better. + * The number after IOMAN_NUMITERATIONS should be untouched. + * The last field (IOMAN_DO_MEMALLOC) is to tell ioman to allocate it's + * own memory in it's structure, or not. If you choose to do it yourself + * you will have to pass a pointer to the memory as the last argument of + * ioman_init. +*/ + #define IOMAN_NUMBUFFER 1 + #define IOMAN_NUMITERATIONS 3 + #define IOMAN_DO_MEMALLOC + +/* Cluster pre-allocation + ---------------------- + + * When writing files, the function that performs the actual write has to + * calculate how many clusters it will need for that request. It then allocates + * that number of new clusters to the file. Since this involves some + * calculations and writing of the FAT, you might find it beneficial to limit + * the number of allocations, and allow fwrite to pre-allocate a number of + * clusters extra. This setting determines how many clusters will be extra + * allocated whenever this is required. + * Take in carefull consideration how large your clustersize is, putting 10 here + * with a clustersize of 32kb means you might waste 320 kb. + * The first option is for preallocating files, the other is used when enlarging + * a directory to accomodate more files +*/ + #define CLUSTER_PREALLOC_FILE 0 + #define CLUSTER_PREALLOC_DIRECTORY 0 + + +/* Endianess configuration + ----------------------- + + * Here you can configure wheter your architecture is little or big endian. This + * is important since all FAT structures are stored in intel little endian + * order. So if you have a big endian system the library has to convert all + * figures to big endian in order to work. + */ + #define LITTLE_ENDIAN + + +/* Date and Time support + --------------------- + + * Here you can enable or disable date and time support. If you enable + * it you will have to create 6 functions, that are described in the + * EFSL manual. If the functions are not present when linking your + * program with the library you will get unresolved dependencies. + */ + /* #define DATE_TIME_SUPPORT */ + +/* Error reporting support + ----------------------- + + * When you receive an error in userland, it usually only gives limited + * information (most likely, fail or success). If error detection and + * reporting is important for you, you can enable more detailed error + * reporting here. This is optional, the costs are 1 byte per object, + * and a small increase in code size. + * You can enable error recording for all object, or you can select the + * object manually. + * For full error reporting use FULL_ERROR_SUPPORT + * For only the base-core of the library use BASE_ERROR_SUPPORT + * For IO/Man use ERRSUP_IOMAN + * For Disc use ERRSUP_IOMAN + * For Part use ERRSUP_PARTITION + * For Fs use ERRSUP_FILESYSTEM + * For File use ERRSUP_FILE +*/ + + #define FULL_ERROR_SUPPORT + /*#define BASE_ERROR_SUPPORT*/ + +/* List options + ------------ + + * In this section you can configure what kind of data you will get from + * directory listing requests. Please refer to the documentation for + * more information +*/ + +#define LIST_MAXLENFILENAME 12 + + +/* Debugging configuration + ----------------------- + + * Here you can configure the debugging behaviour. Debugging is different + * on every platform (see debug.h for more information). + * If your hardware has no means of output (printf) dont define any anything, + * and nothing will happen. For real world use debugging should be turned off. +*/ + + #define DEBUG + + +/* Debugging configuration - AVR Specific: PORT + -------------------------------------------- + + * Here you can select which UART you want to use for debugging. + * If you did not define DEBUG, this setting has no effect. + * Note that it is not a good idea to use a port that you use in userspace. +*/ + + #define DEBUG_PORT 0 /* Select UART0 */ + /*#define DEBUG_PORT 1*/ /* Select UART1 */ + + +/* Debugging configuration - AVR Specific: UBRR + -------------------------------------------- + + * Here you can set UBRR, this value will select the serial clock speed. + * This value depends on your baudrate and clockrate. U2X is by standard 0, + * if you would want this 1 for some reason, this can be done in debug.c. +*/ + + #define DEBUG_UBRR 51 /* 9600bps on 8Mhz */ + /*#define DEBUG_UBRR 95*/ /* 9600bps on 14.7456Mhz */ + /*#define DEBUG_UBRR 103*/ /* 9600bps on 16Mhz */ + + +#endif diff --git a/poc/lpc2148_efsl/conf/config-sample-linux.h b/poc/lpc2148_efsl/conf/config-sample-linux.h new file mode 100644 index 0000000..8ad8473 --- /dev/null +++ b/poc/lpc2148_efsl/conf/config-sample-linux.h @@ -0,0 +1,129 @@ +#ifndef __EFSL_CONFIG_H__ +#define __EFSL_CONFIG_H__ + +/* Hardware target + --------------- + + * Here you will define for what hardware-endpoint EFSL should be compiled. + * Look in interfaces.h to see what systems are supported, and add your own + * there if you need to write your own driver. Then, define the name you + * selected for your hardware there here. Make sure that you only select one + * device! +*/ + + #define HW_ENDPOINT_LINUX + /*#define HW_ENDPOINT_ATMEGA128_SD*/ + /*#define HW_ENDPOINT_DSP_TI6713_SD*/ + +/* Memory configuration + -------------------- + + * Here you must configure wheter your processor can access memory byte + * oriented. All x86 processors can do it, AVR's can do it to. Some DSP + * or other microcontrollers can't. If you have an 8 bit system you're safe. + * If you are really unsure, leave the setting commented out, it will be slower + * but it will work for sure. +*/ + + /*#define BYTE_ALIGNMENT*/ + +/* Cache configuration + ------------------- + + * Here you must configure how much memory of cache you can/want to use. + * The number you put at IOMAN_NUMBUFFER is multiplied by 512. So 1 means + * 512 bytes cache, 4 means 2048 bytes cache. More is better. + * The number after IOMAN_NUMITERATIONS should be untouched. + * The last field (IOMAN_DO_MEMALLOC) is to tell ioman to allocate it's + * own memory in it's structure, or not. If you choose to do it yourself + * you will have to pass a pointer to the memory as the last argument of + * ioman_init. +*/ + #define IOMAN_NUMBUFFER 100 + #define IOMAN_NUMITERATIONS 3 + #define IOMAN_DO_MEMALLOC + +/* Cluster pre-allocation + ---------------------- + + * When writing files, the function that performs the actual write has to + * calculate how many clusters it will need for that request. It then allocates + * that number of new clusters to the file. Since this involves some + * calculations and writing of the FAT, you might find it beneficial to limit + * the number of allocations, and allow fwrite to pre-allocate a number of + * clusters extra. This setting determines how many clusters will be extra + * allocated whenever this is required. + * Take in carefull consideration how large your clustersize is, putting 10 here + * with a clustersize of 32kb means you might waste 320 kb. + * The first option is for preallocating files, the other is used when enlarging + * a directory to accomodate more files +*/ + #define CLUSTER_PREALLOC_FILE 50 + #define CLUSTER_PREALLOC_DIRECTORY 5 + +/* Endianess configuration + ----------------------- + + * Here you can configure wheter your architecture is little or big endian. This + * is important since all FAT structures are stored in intel little endian + * order. So if you have a big endian system the library has to convert all + * figures to big endian in order to work. + */ + #define LITTLE_ENDIAN + +/* Date and Time support + --------------------- + + * Here you can enable or disable date and time support. If you enable + * it you will have to create 6 functions, that are described in the + * EFSL manual. If the functions are not present when linking your + * program with the library you will get unresolved dependencies. + */ + /* #define DATE_TIME_SUPPORT */ + +/* Error reporting support + ----------------------- + + * When you receive an error in userland, it usually only gives limited + * information (most likely, fail or success). If error detection and + * reporting is important for you, you can enable more detailed error + * reporting here. This is optional, the costs are 1 byte per object, + * and a small increase in code size. + * You can enable error recording for all object, or you can select the + * object manually. + * For full error reporting use FULL_ERROR_SUPPORT + * For only the base-core of the library use BASE_ERROR_SUPPORT + * For IO/Man use ERRSUP_IOMAN + * For Disc use ERRSUP_IOMAN + * For Part use ERRSUP_PARTITION + * For Fs use ERRSUP_FILESYSTEM + * For File use ERRSUP_FILE +*/ + + #define FULL_ERROR_SUPPORT + /*#define BASE_ERROR_SUPPORT*/ + + +/* Debugging configuration + ----------------------- + + * Here you can configure the debugging behaviour. Debugging is different + * on every platform (see debug.h for more information). + * If your hardware has no means of output (printf) dont define any anything, + * and nothing will happen. For real world use debugging should be turned off. +*/ + + #define DEBUG + /*#define DO_FUNC_DEBUG*/ + +/* List options + ------------ + + * In this section you can configure what kind of data you will get from + * directory listing requests. Please refer to the documentation for + * more information +*/ + + #define LIST_MAXLENFILENAME 12 + +#endif diff --git a/poc/lpc2148_efsl/conf/config-sample-lpc2000.h b/poc/lpc2148_efsl/conf/config-sample-lpc2000.h new file mode 100644 index 0000000..8610c94 --- /dev/null +++ b/poc/lpc2148_efsl/conf/config-sample-lpc2000.h @@ -0,0 +1,153 @@ +#ifndef __EFSL_CONFIG_H__ +#define __EFSL_CONFIG_H__ + +/* This is for the LPC2000 SD-Card SPI interface (M. Thomas) */ + + +/* Hardware target + --------------- + + * Here you will define for what hardware-endpoint EFSL should be compiled. + * Look in interfaces.h to see what systems are supported, and add your own + * there if you need to write your own driver. Then, define the name you + * selected for your hardware there here. Make sure that you only select one + * device! +*/ + + /*#define HW_ENDPOINT_LINUX*/ + /*#define HW_ENDPOINT_ATMEGA128_SD*/ + + + #define HW_ENDPOINT_LPC2000_SD + /* defines the interface for LPC213x (0=SPI0 1=SPI1) */ + // #define HW_ENDPOINT_LPC2000_SPINUM (0) + #define HW_ENDPOINT_LPC2000_SPINUM (1) + + /*#define HW_ENDPOINT_DSP_TI6713_SD*/ + + +/* Memory configuration + -------------------- + + * Here you must configure wheter your processor can access memory byte + * oriented. All x86 processors can do it, AVR's can do it to. Some DSP + * or other microcontrollers can't. If you have an 8 bit system you're safe. + * If you are really unsure, leave the setting commented out, it will be slower + * but it will work for sure. +*/ + + /* disabled for ARM (mt): #define BYTE_ALIGNMENT */ + +/* + * mthomas: define the attribute for packed structures + * to avoid alignment problems with ARM controllers +*/ + #define ATTR_PACKED __attribute__((packed)) /* ARM */ + + +/* Cache configuration + ------------------- + + * Here you must configure how much memory of cache you can/want to use. + * The number you put at IOMAN_NUMBUFFER is multiplied by 512. So 1 means + * 512 bytes cache, 4 means 2048 bytes cache. More is better. + * The number after IOMAN_NUMITERATIONS should be untouched. + * The last field (IOMAN_DO_MEMALLOC) is to tell ioman to allocate it's + * own memory in it's structure, or not. If you choose to do it yourself + * you will have to pass a pointer to the memory as the last argument of + * ioman_init. +*/ + /*#define IOMAN_NUMBUFFER 1*/ + #define IOMAN_NUMBUFFER 6 /* 32kB RAM on the LPC2138 - let's use 3 kB */ + #define IOMAN_NUMITERATIONS 3 + #define IOMAN_DO_MEMALLOC + +/* Cluster pre-allocation + ---------------------- + + * When writing files, the function that performs the actual write has to + * calculate how many clusters it will need for that request. It then allocates + * that number of new clusters to the file. Since this involves some calculations + * and writing of the FAT, you might find it beneficial to limit the number of + * allocations, and allow fwrite to pre-allocate a number of clusters extra. + * This setting determines how many clusters will be extra allocated whenever + * this is required. + * Take in carefull consideration how large your clustersize is, putting 10 here + * with a clustersize of 32kb means you might waste 320 kb. + * The first option is for preallocating files, the other is used when enlarging + * a directory to accomodate more files +*/ + /*#define CLUSTER_PREALLOC_FILE 0*/ + #define CLUSTER_PREALLOC_FILE 2 + #define CLUSTER_PREALLOC_DIRECTORY 0 + + +/* Endianess configuration + ----------------------- + + * Here you can configure wheter your architecture is little or big endian. This + * is important since all FAT structures are stored in intel little endian order. + * So if you have a big endian system the library has to convert all figures to + * big endian in order to work. + */ + #define LITTLE_ENDIAN + + +/* Date and Time support + --------------------- + + * Here you can enable or disable date and time support. If you enable + * it you will have to create 6 functions, that are described in the + * EFSL manual. If the functions are not present when linking your + * program with the library you will get unresolved dependencies. + */ + /*#define DATE_TIME_SUPPORT*/ + +/* Error reporting support + ----------------------- + + * When you receive an error in userland, it usually only gives limited + * information (most likely, fail or success). If error detection and + * reporting is important for you, you can enable more detailed error + * reporting here. This is optional, the costs are 1 byte per object, + * and a small increase in code size. + * You can enable error recording for all object, or you can select the + * object manually. + * For full error reporting use FULL_ERROR_SUPPORT + * For only the base-core of the library use BASE_ERROR_SUPPORT + * For IO/Man use ERRSUP_IOMAN + * For Disc use ERRSUP_IOMAN + * For Part use ERRSUP_PARTITION + * For Fs use ERRSUP_FILESYSTEM + * For File use ERRSUP_FILE +*/ + + #define FULL_ERROR_SUPPORT + /*#define BASE_ERROR_SUPPORT*/ + +/* List options + ------------ + + * In this section youcan configure what kind of data you will get from + * directory listing requests. Please refer to the documentation for + * more information +*/ + +#define LIST_MAXLENFILENAME 12 + + + + +/* Debugging configuration + ----------------------- + + * Here you can configure the debugging behaviour. Debugging is different + * on every platform (see debug.h for more information). + * If your hardware has no means of output (printf) dont define any anything, + * and nothing will happen. For real world use debugging should be turned off. +*/ + + #define DEBUG + + +#endif diff --git a/poc/lpc2148_efsl/conf/config-sample-nios2.h b/poc/lpc2148_efsl/conf/config-sample-nios2.h new file mode 100644 index 0000000..60ca5c4 --- /dev/null +++ b/poc/lpc2148_efsl/conf/config-sample-nios2.h @@ -0,0 +1,133 @@ +#ifndef __EFSL_CONFIG_H__ +#define __EFSL_CONFIG_H__ + +/* Hardware target + --------------- + + * Here you will define for what hardware-endpoint EFSL should be compiled. + * Look in interfaces.h to see what systems are supported, and add your own + * there if you need to write your own driver. Then, define the name you + * selected for your hardware there here. Make sure that you only select one + * device! +*/ + + /*#define HW_ENDPOINT_LINUX*/ + /*#define HW_ENDPOINT_ATMEGA128_SD*/ + /*#define HW_ENDPOINT_DSP_TI6713_SD*/ + #define HW_ENDPOINT_NIOS_2_SD + + +/* Memory configuration + -------------------- + + * Here you must configure wheter your processor can access memory byte + * oriented. All x86 processors can do it, AVR's can do it to. Some DSP + * or other microcontrollers can't. If you have an 8 bit system you're safe. + * If you are really unsure, leave the setting commented out, it will be slower + * but it will work for sure. +*/ + + /*#define BYTE_ALIGNMENT*/ + +/* Cache configuration + ------------------- + + * Here you must configure how much memory of cache you can/want to use. + * The number you put at IOMAN_NUMBUFFER is multiplied by 512. So 1 means + * 512 bytes cache, 4 means 2048 bytes cache. More is better. + * The number after IOMAN_NUMITERATIONS should be untouched. + * The last field (IOMAN_DO_MEMALLOC) is to tell ioman to allocate it's + * own memory in it's structure, or not. If you choose to do it yourself + * you will have to pass a pointer to the memory as the last argument of + * ioman_init. +*/ + #define IOMAN_NUMBUFFER 1 + #define IOMAN_NUMITERATIONS 3 + #define IOMAN_DO_MEMALLOC + +/* Cluster pre-allocation + ---------------------- + + * When writing files, the function that performs the actual write has to + * calculate how many clusters it will need for that request. It then allocates + * that number of new clusters to the file. Since this involves some + * calculations and writing of the FAT, you might find it beneficial to limit + * the number of allocations, and allow fwrite to pre-allocate a number of + * clusters extra. This setting determines how many clusters will be extra + * allocated whenever this is required. + * Take in carefull consideration how large your clustersize is, putting 10 here + * with a clustersize of 32kb means you might waste 320 kb. + * The first option is for preallocating files, the other is used when enlarging + * a directory to accomodate more files +*/ + #define CLUSTER_PREALLOC_FILE 0 + #define CLUSTER_PREALLOC_DIRECTORY 0 + + +/* Endianess configuration + ----------------------- + + * Here you can configure wheter your architecture is little or big endian. This + * is important since all FAT structures are stored in intel little endian + * order. So if you have a big endian system the library has to convert all + * figures to big endian in order to work. + */ + #define LITTLE_ENDIAN + + +/* Date and Time support + --------------------- + + * Here you can enable or disable date and time support. If you enable + * it you will have to create 6 functions, that are described in the + * EFSL manual. If the functions are not present when linking your + * program with the library you will get unresolved dependencies. + */ + /* #define DATE_TIME_SUPPORT */ + +/* Error reporting support + ----------------------- + + * When you receive an error in userland, it usually only gives limited + * information (most likely, fail or success). If error detection and + * reporting is important for you, you can enable more detailed error + * reporting here. This is optional, the costs are 1 byte per object, + * and a small increase in code size. + * You can enable error recording for all object, or you can select the + * object manually. + * For full error reporting use FULL_ERROR_SUPPORT + * For only the base-core of the library use BASE_ERROR_SUPPORT + * For IO/Man use ERRSUP_IOMAN + * For Disc use ERRSUP_IOMAN + * For Part use ERRSUP_PARTITION + * For Fs use ERRSUP_FILESYSTEM + * For File use ERRSUP_FILE +*/ + + #define FULL_ERROR_SUPPORT + /*#define BASE_ERROR_SUPPORT*/ + +/* List options + ------------ + + * In this section you can configure what kind of data you will get from + * directory listing requests. Please refer to the documentation for + * more information +*/ + +#define LIST_MAXLENFILENAME 12 + + +/* Debugging configuration + ----------------------- + + * Here you can configure the debugging behaviour. Debugging is different + * on every platform (see debug.h for more information). + * If your hardware has no means of output (printf) dont define any anything, + * and nothing will happen. For real world use debugging should be turned off. +*/ + + #define DEBUG + + +#endif diff --git a/poc/lpc2148_efsl/conf/config.h b/poc/lpc2148_efsl/conf/config.h new file mode 100644 index 0000000..02d0d88 --- /dev/null +++ b/poc/lpc2148_efsl/conf/config.h @@ -0,0 +1,153 @@ +#ifndef __EFSL_CONFIG_H__ +#define __EFSL_CONFIG_H__ + +/* This is for the LPC2000 SD-Card SPI interface (M. Thomas) */ + + +/* Hardware target + --------------- + + * Here you will define for what hardware-endpoint EFSL should be compiled. + * Look in interfaces.h to see what systems are supported, and add your own + * there if you need to write your own driver. Then, define the name you + * selected for your hardware there here. Make sure that you only select one + * device! +*/ + + /*#define HW_ENDPOINT_LINUX*/ + /*#define HW_ENDPOINT_ATMEGA128_SD*/ + + + #define HW_ENDPOINT_LPC2000_SD + /* defines the interface for LPC213x (0=SPI0 1=SPI1) */ + // #define HW_ENDPOINT_LPC2000_SPINUM (0) + #define HW_ENDPOINT_LPC2000_SPINUM (1) + + /*#define HW_ENDPOINT_DSP_TI6713_SD*/ + + +/* Memory configuration + -------------------- + + * Here you must configure wheter your processor can access memory byte + * oriented. All x86 processors can do it, AVR's can do it to. Some DSP + * or other microcontrollers can't. If you have an 8 bit system you're safe. + * If you are really unsure, leave the setting commented out, it will be slower + * but it will work for sure. +*/ + + /* disabled for ARM (mt): #define BYTE_ALIGNMENT */ + +/* + * mthomas: define the attribute for packed structures + * to avoid alignment problems with ARM controllers +*/ + #define ATTR_PACKED __attribute__((packed)) /* ARM */ + + +/* Cache configuration + ------------------- + + * Here you must configure how much memory of cache you can/want to use. + * The number you put at IOMAN_NUMBUFFER is multiplied by 512. So 1 means + * 512 bytes cache, 4 means 2048 bytes cache. More is better. + * The number after IOMAN_NUMITERATIONS should be untouched. + * The last field (IOMAN_DO_MEMALLOC) is to tell ioman to allocate it's + * own memory in it's structure, or not. If you choose to do it yourself + * you will have to pass a pointer to the memory as the last argument of + * ioman_init. +*/ + /*#define IOMAN_NUMBUFFER 1*/ + #define IOMAN_NUMBUFFER 6 /* 32kB RAM on the LPC2138 - let's use 3 kB */ + #define IOMAN_NUMITERATIONS 3 + #define IOMAN_DO_MEMALLOC + +/* Cluster pre-allocation + ---------------------- + + * When writing files, the function that performs the actual write has to + * calculate how many clusters it will need for that request. It then allocates + * that number of new clusters to the file. Since this involves some calculations + * and writing of the FAT, you might find it beneficial to limit the number of + * allocations, and allow fwrite to pre-allocate a number of clusters extra. + * This setting determines how many clusters will be extra allocated whenever + * this is required. + * Take in carefull consideration how large your clustersize is, putting 10 here + * with a clustersize of 32kb means you might waste 320 kb. + * The first option is for preallocating files, the other is used when enlarging + * a directory to accomodate more files +*/ + /*#define CLUSTER_PREALLOC_FILE 0*/ + #define CLUSTER_PREALLOC_FILE 2 + #define CLUSTER_PREALLOC_DIRECTORY 0 + + +/* Endianess configuration + ----------------------- + + * Here you can configure wheter your architecture is little or big endian. This + * is important since all FAT structures are stored in intel little endian order. + * So if you have a big endian system the library has to convert all figures to + * big endian in order to work. + */ + #define LITTLE_ENDIAN + + +/* Date and Time support + --------------------- + + * Here you can enable or disable date and time support. If you enable + * it you will have to create 6 functions, that are described in the + * EFSL manual. If the functions are not present when linking your + * program with the library you will get unresolved dependencies. + */ + /*#define DATE_TIME_SUPPORT*/ + +/* Error reporting support + ----------------------- + + * When you receive an error in userland, it usually only gives limited + * information (most likely, fail or success). If error detection and + * reporting is important for you, you can enable more detailed error + * reporting here. This is optional, the costs are 1 byte per object, + * and a small increase in code size. + * You can enable error recording for all object, or you can select the + * object manually. + * For full error reporting use FULL_ERROR_SUPPORT + * For only the base-core of the library use BASE_ERROR_SUPPORT + * For IO/Man use ERRSUP_IOMAN + * For Disc use ERRSUP_IOMAN + * For Part use ERRSUP_PARTITION + * For Fs use ERRSUP_FILESYSTEM + * For File use ERRSUP_FILE +*/ + + #define FULL_ERROR_SUPPORT + /*#define BASE_ERROR_SUPPORT*/ + +/* List options + ------------ + + * In this section youcan configure what kind of data you will get from + * directory listing requests. Please refer to the documentation for + * more information +*/ + +#define LIST_MAXLENFILENAME 12 + + + + +/* Debugging configuration + ----------------------- + + * Here you can configure the debugging behaviour. Debugging is different + * on every platform (see debug.h for more information). + * If your hardware has no means of output (printf) dont define any anything, + * and nothing will happen. For real world use debugging should be turned off. +*/ + +#define DEBUG + + +#endif diff --git a/poc/lpc2148_efsl/docs/Makefile b/poc/lpc2148_efsl/docs/Makefile new file mode 100644 index 0000000..b1636f9 --- /dev/null +++ b/poc/lpc2148_efsl/docs/Makefile @@ -0,0 +1,13 @@ +all: manual.tex + latex manual.tex + latex manual.tex # Needs to be done a second time to make sure that the contents table is correct + dvips -o manual.ps manual.dvi + dvipdfm manual.dvi + +clean: + rm -f manual.aux + rm -f manual.dvi + rm -f manual.log + rm -f manual.pdf + rm -f manual.ps + rm -f manual.toc diff --git a/poc/lpc2148_efsl/docs/arm_info_also_in_pages_arm.txt b/poc/lpc2148_efsl/docs/arm_info_also_in_pages_arm.txt new file mode 100644 index 0000000..c1bbc84 --- /dev/null +++ b/poc/lpc2148_efsl/docs/arm_info_also_in_pages_arm.txt @@ -0,0 +1 @@ +see pages/arm7.tex \ No newline at end of file diff --git a/poc/lpc2148_efsl/docs/manual.pdf b/poc/lpc2148_efsl/docs/manual.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ef27246562c7c7afc37b5a314cd12efbc29acc3b GIT binary patch literal 346004 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

*M6;? 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

KhLTkCYAIrIpZ}B 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

733_ABr~@0X?)GD_1B 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%0DZ1bY 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 TXKSE$3K`2GCZ>E?h2#GLOQe1L literal 0 HcmV?d00001 diff --git a/poc/lpc2148_efsl/docs/manual.tex b/poc/lpc2148_efsl/docs/manual.tex new file mode 100644 index 0000000..14e0184 --- /dev/null +++ b/poc/lpc2148_efsl/docs/manual.tex @@ -0,0 +1,132 @@ +\documentclass[a4paper,fleqn]{article} + +\usepackage{listings} +\usepackage{graphicx} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{color} +\usepackage{array} +\usepackage{verbatim} +\usepackage{longtable} + +\newcommand{\filename}[1]{ + \textsf{#1} +} +\newcommand{\code}[1]{ + \texttt{#1} +} +\newcommand{\external}[1]{ + \textbf{#1} +} + +\newcommand{\thead}[1]{ + \textbf{#1} +} + +%\usepackage[latin1]{inputenc} +%\usepackage[T1]{fontenc} + +\lstset{language=C} + +\begin{document} +\title{\Huge{EFSL}\\\Large{Embedded Filesystem Library}} +\author{Lennart Ysboodt - Michael De Nil} +\date{$\copyright$ 2005} +\maketitle + +\newpage +\tableofcontents + +\setlength{\parindent}{0pt} +\setlength{\parskip}{1ex plus 0.5ex minus 0.2ex} + +\newpage +\section{Preface} +\input{pages/preface} + +\newpage +\section{Getting started} +\subsection{On Linux (file)} + \input{pages/linux} +\newpage +\subsection{On AVR (SD-Card)} + \input{pages/avr} +\newpage +\subsection{On DSP (SD-Card)} + \input{pages/tms6713} +\newpage +\subsection{On ARM7 (SD-Card)} + \input{pages/arm7} +\newpage +\section{Configuring EFSL} + \input{pages/config} + +\newpage +\section{EFSL Functions} +\subsection{Date and time support} + \input{pages/dateandtime} + \newpage +\subsection{efs\_init} + \input{pages/efs_init} + \newpage +\subsection{file\_fopen} + \input{pages/file_fopen} + \newpage +\subsection{file\_fclose} + \input{pages/file_fclose} + \newpage +\subsection{file\_read} + \input{pages/file_read} + \newpage +\subsection{file\_write} + \input{pages/file_write} + \newpage +\subsection{mkdir} + \input{pages/mkdir} + \newpage +\subsection{ls\_openDir} + \input{pages/lsopendir} + \newpage +\subsection{ls\_getNext} + \input{pages/lsgetnext} + \newpage +\subsection{rmfile} + \input{pages/rmfile} + \newpage +\subsection{Getting the free space} + \input{pages/freespace} + \newpage + +\newpage +\section{EFSL utilities} + \input{pages/utils} + \newpage + +\newpage +\section{Developer notes} +\subsection{Integer types} + \input{pages/types} +\subsection{Debugging} + \input{pages/debug} +\subsection{Adding support for a new endpoint} + \input{pages/driver} +\subsection{I/O Manager} + \input{pages/ioman} +\subsection{C library for EFSL} + \input{pages/plibc} + +\newpage +\section{Legal notes} + \input{pages/license} + +%\newpage +%\section{Internals} +%\subsection{Overview} +%\subsection{Flowcharts} +%\subsection{Portability} +% +%\section{Examples} +%\subsection{Example 1} +%\subsection{Example 2} +% +\end{document} diff --git a/poc/lpc2148_efsl/docs/pages/arm7.tex b/poc/lpc2148_efsl/docs/pages/arm7.tex new file mode 100644 index 0000000..4617dcb --- /dev/null +++ b/poc/lpc2148_efsl/docs/pages/arm7.tex @@ -0,0 +1,223 @@ +This section describes how the ARM7 port of EFSL works. This documentation was written +by Martin Thomas, as is the port to the ARM7 and the examples included with EFSL. +The examples are pretty large, so we will not print them here, they have their own +subdirectory in the examples sections and should be quite understandable. + +Please note that the LPC2000 and AT91SAM7 interfaces are Copyright (c) by Martin Thomas, Kaiserslautern, Germany. + +\subsubsection{License} +The LPC2000- and AT91SAM7-interface inherit the license from the main efsl-source. + +\subsubsection{General information about the ARM interfaces} + \begin{itemize} + +\item The current version of the EFSL includes SD-interfaces +for the LPC2000 ARM7TDMI-S controllers from NXP(Philips) and +the AT91SAM7 ARM7TDMI controllers from Atmel. The ARM-core +of these devices is basicly the same but the integrated +SPI-hardware from NXP and Atmel is not compatible. So +a different set of interface-functions is needed for each +family. + +\item A GNU arm-elf toolchain/cross-compiler +must be available to build the examples +and the library. + +\item \code{\#define BYTE\_ALIGNMENT} is disabled +for the LPC-interace in config.h +It didn't work with alignment enabled. + +\item Buffers can be configured as +described in the efsl-manual. + +\item The hardware connection is similar +to the connection described +in this manual for Atmel AVRs. +(I (M.~Thomas) have mounted the pullups in some of my +test-systems but tests have been done +successfully without pull-up resistors) + \end{itemize} + +\subsubsection{Additional information about the LPC2000 interface} + \begin{itemize} + +\item The interface supports SD-Cards +connected to the LPC2000 SPI ("SPI0") +and SSP ("SPI1") interface. The SPI- +interface is hardcoded by the value +defined in config.h and can not be +changed during runtime. + +\item Only some parts of the LPC2000-family +have the fast SSP-Interface (i.e. LPC213x, +LPC214x) others only provide the slower +SPI interface. + +\item To build the library create the file +conf/config.h based on the template +config-sample-lpc2000.h and use the +makefile Makefile-LPC2000 in the +efsl-root-directory for LPC2000s +(ARM7TDMI-S). + +\item So far the interface has only been +tested with LPC2138- and LPC2148-controllers +and the SPI(0) and SSP-Interface. +Other LPC2000-ARM7 controllers +should be supported too. Verify +that the register-adresses in +inc/interfaces/LPC2000\_regs.h +match the used controller and the +maximum speed defined in lpc2000\_spi.c +is available for the part. +Verify the pin-connections in lpc2000\_spi.c. + \end{itemize} + + +\subsubsection{Additional information about the AT91SAM7 interface} + \begin{itemize} + +\item The interface supports SD-Cards connected +to the AT91SAM7 SPI interface. + +\item To build the library create a file +conf/config.h based on the template +config-sample-at91.h and use the +makefile Makefile-AT91 in the +efsl-root-directory for AT91 (ARM7TDMI). + +\item The AT91SAM7 offers 4 chip-select +signals which can be mapped to +different pins. Chip-select is done +by the hardware. See at91_spi.c +for configuration options. +Chip-Select can be fixed or variable +(Fixed or variable peripheral select - see +option in AT91\_spi.c, further information +in the datasheet). + +\item I have tested the interface with AT91SAM7S256 +and SAM7S64 controllers. Other AT91-ARM7 controllers +should be supported too. +To adapt the code for another AT91 with SPI: + \begin{itemize} +\item check if the register-defintions in AT91SAM7S\_regs.h +are valid for the target. The file can be replaced +by header file provided by Atmel for the used part +(see at91.com) +\item verify the maximum speed in at91_spi.c +\item verfiy the pin-connections in at91_spi.c +\item Check the memory-settings in the linker-script of +the example. + \end{itemize} + \end{itemize} + + +\subsubsection{Example code} + +For each interface an example application is provided in the +examples-directory. The examples can be build with the library +libefsl.a or with the efsl source-code. + +\begin{enumerate} + +\item using the EFSL source-code in the project: + + \begin{itemize} + +\item Verfiy that conf/config.h is present +and the settings match the used +interfaces (see templates). + +\item Modify the line in the example's +Makefile to: EFSL_AS_LIB = 0 + +\item "make all" in the example's directory. + + \end{itemize} + + +\item using the EFSL library (libefsl.a) in the project: + + \begin{itemize} + +\item Verfiy that conf/config.h is present +and the settings match the used +interfaces (see templates). + +\item Build the library libefsl.a with +the Makefile from the efsl root- +directory for the used interface. +(i.e. "make --makefile=Makefile-AT91 lib" +or "make --makefile=Makefile-LPC2000 lib" ) + +\item Modify the line in the example's +Makefile to: EFSL\_AS\_LIB = 1 + +\item "make all" in the example's directory + \end{itemize} + +\end{enumerate} + + +The example-applications demonstrate: + \begin{itemize} +\item Init of the EFSL ARM debug-system +\item Init of the EFSL +\item List contents of the SD-Card's +root directory +\item Open a file and type the content +\item Append a line of text to a file +\item "cat/type" the file's content again + \end{itemize} + +The example applications print status- and +debug-messages to the UART1 on LPC2000 or DBGU on AT91SAM7 +(115200,8,N,1,no FC). + + +\subsubsection{Test Hard- and Software} + \begin{itemize} + +\item Keil (keil.com) MCB2130 board with LPC2138 +with additional SD/MMC-connector (from Buerklin.de) + +\item Atmel AT91SAM7S-EK board with AT91SAM7S64 +with additional SD/MMC-connector + +\item SAM7-P board with AT91SAM7S256 +with on-board SD/MMC-connector + +\item SanDisk "standard" SD-Card 256MB +(not the "highspeed"-version) + +\item WinARM (arm-elf GNU toolchain) + +\item Bray++ Terminal + + \end{itemize} + + +\subsubsection{Credits} + +\begin{itemize} + +\item The code in efsl_debug_printf_arm.c is +based on code from Holger Klabunde +and has been modified to support +a "fdevopen"-function (efsl_debug_devopen_arm). +The original code has no copyright-notice and +is derived from an free code by Volker Oth. + +\item Register-definitions for LPC213x are +based on a header-file from Keil (an ARM-company) +(supplied with the DKARM trial-version). + +\item Register-definitions for AT91SAM7 are from +at91.com (provided by Atmel). + +\item The basic method to handle the SPI interface +on AT91 has been found in a free example from +olimex.com. + +\end{itemize} diff --git a/poc/lpc2148_efsl/docs/pages/avr.tex b/poc/lpc2148_efsl/docs/pages/avr.tex new file mode 100644 index 0000000..cace85d --- /dev/null +++ b/poc/lpc2148_efsl/docs/pages/avr.tex @@ -0,0 +1,190 @@ +This section describes how to implement Efsl on a AVR $\mu C$ connected to +an SD-Card (SPI). For getting efsl to compile, the avr-gcc compiler and +avr-libc library are required. On Windows you should install WinAVR +(http://winavr.sourceforge.net/), on Linux you can install the packages +separately (see http://www.nongnu.org/avr-libc/user-manual/install\_tools.html +for a nice howto). +\subsubsection{Hardware} +First, you need set up a prototype in which you connect the CD, CMD, DAT0 +\& CLK lines from the SD-Card to /CS, MOSI, MISO \& SCK from the Atmega. +\newline +\includegraphics[scale=0.65]{pics/sdcard.eps} +\newline +%\parbox[c]{.4\textwidth}{\begin{center}\includegraphics[width=.4\textwidth]{pics/sdconnection}\end{center}} +\parbox[c]{.5\textwidth}{ +Connect the following lines on the SD-card: +\begin{itemize} + \item{Pin 9 (DAT2) - NC\\(or pull-up to 3.3V)} + \item{Pin 1 (CD) - Any pin on the Atmega128} + \item{Pin 2 (CMD) - MOSI\\(pin 12 on the Atmega128)} + \item{Pin 3 (Vss) - GND} + \item{Pin 4 (Vdd) - +3.3V} + \item{Pin 5 (CLK) - SCK\\(pin 11 on the Atmega128)} + \item{Pin 6 (Vss) - GND} + \item{Pin 7 (DAT0) - MISO\\(pin 12 on the Atmega128)} + \item{Pin 8 (DAT1) - NC\\(or pull-up to 3.3V)} +\end{itemize} +} +\parbox[c]{.5\textwidth}{\begin{center} + \includegraphics[width=.5\textwidth]{pics/sdconnection} + \newline\newline + Remark: this schematic includes pull-up's to 3.3V, which + can be left off. +\end{center}} +\newline +Remark 1: Make sure that your $\mu C$ is running on 3,3V, so you don't +damage your SD-Card.\newline +\newline +Remark 2: CD is currently static set to PB0, but will become variable +in future releases. +\subsubsection{Download \& Compile} +Let's get started: +\begin{enumerate} + \item{Get the latest release of efsl on http://www.sf.net/projects/efsl/} + \item{Unpack the library (on Windows, you can use WinACE or WinRAR)} + \item{Copy \filename{Makefile-AVR} to \filename{Makefile}} + \item{Copy \filename{conf/config-sample-avr.h} to \filename{conf/config.h}} + \item{Compile the library (\code{make lib})} +\end{enumerate} +Now you should have \filename{libefsl.a} in the efsl directory. +\subsubsection{Example} +Since Efsl itself is only a library, it's not supposed to do anything out of +the box, than just compile. To get started, we'll show here a small example +program that opens an existing file and writes the content to a new file. +\newline\newline +First, create a new directory in which you put the compiled efsl-library +(\filename{libefsl.a}) and create a new file called \filename{avrtest.c} containing: +\lstset{numbers=left, stepnumber=1, numberstyle=\small, numbersep=5pt, tabsize=4} +\begin{lstlisting} + #include + + void hang(void); + + void main(void) + { + EmbeddedFileSystem efs; + EmbeddedFile file_r, file_w; + unsigned short i,e; + char buf[512]; + + if(efs_init(&efs,0)!=0){ + hang(); + } + + if(file_fopen(&file_r,&efs.myFs,"orig.txt",'r')!=0){ + hang(); + } + + if(file_fopen(&file_w,&efs.myFs,"copy.txt",'w')!=0){ + hang(); + } + + while(e=file_read(&file_r,512,buf)){ + file_write(&file_w,e,buf); + } + + file_fclose(&file_r); + file_fclose(&file_w); + + fs_umount(&efs.myFs); + + hang(); + } + + void hang(void) + { + while((1)) + _NOP(); + } +\end{lstlisting} +$ $\newline +Some extra information on the code above: +\begin{itemize} + \item{Line 1: The header file for efsl is included here. When using the + basic efsl functions, \filename{efs.h} is the only header file on the + efsl library that needs to be included.} + \item{Line 7: The object efs is created, this object will contain + information about the hardware layer, the partition table and + the disc.} + \item{Line 8: The objects \code{file\_r} and \code{file\_w} are created, these objects + will contain information about the files that we will open on the + efs-object.} + \item{Line 9: A buffer of 512 bytes is allocated. This buffer will be + used for reading and writing blocks of data.} + \item{Line 12: Call of \code{efs\_init()}, which will initialize the efs-object. + To this function we pass: + \begin{enumerate} + \item{A pointer to the efs-object.} + \item{A pointer to the file that contains the partition table / + file system (in this example, we select a device as file).} + \end{enumerate} + If this function returns 0, it means that a valid fat partition is + found on the SD-card connected. + If no valid fat-filesystem is found, or the file does not exist, the + function returns a negative value. In this example we then go to an + infinite loop to prevent the program to continue.} + \item{Line 16 \& 20: Call of \code{file\_fopen()}, which will initialize the + file-objects. To this function we pass: + \begin{enumerate} + \item{A pointer to the file-object.} + \item{A pointer to the filesystem-object.} + \item{A pointer to the filename.} + \item{A char containing the the mode (read, write, append).} + \end{enumerate} + If this function returns 0, it means the file has successfully been + opened for reading / writing / appending. + If the file could not be opened (because for example a file already + exists), a negative value is returned.} + \item{Line 24: Call of \code{file\_read()}, which will read a given value of + bytes (in this example 512) from a file and put it's content into + the buffer passed (in this example called buf). This function returns + the amount of bytes read, so the while-loop will be executed as long + as there are bytes left in the file.} + \item{Line 25: Call of \code{file\_write()}, which will write a given value + of bytes (in this example, the amount of bytes that was read + by \code{file\_read()}) from the buffer passed to a file. This function returns + the amount of bytes written.} + \item{Line 28 \& 29: Call of \code{file\_fclose()}, which will close the + file-objects.} + \item{Line 31: Call of \code{fs\_umount()}, which will write all buffers to + the the SD-card.} +\end{itemize} +\subsubsection{Testing} +So now let's test the program: +\begin{enumerate} + \item + { + Make sure that your directory contains both the example from above + called \filename{avrtest.c} and the library \filename{libefsl.a}. + } + \item + { Compile the program: + \begin{itemize} + \item{On Linux (with avr-gcc): avr-gcc -I/home/user/efsl/inc/ + -I/home/user/efsl/conf -ffreestanding -mmcu=atmega128 -Os -o + avrtest.o avrtest.c -L./ -lefsl} + \item{On Windows (with WinAVR): avr-gcc + -Ic:$\backslash$efsl$\backslash$inc + -Ic:$\backslash$efsl$\backslash$conf + -ffreestanding -mmcu=atmega128 -Os -o + avrtest.o avrtest.c -L.$\backslash$ -lefsl} + \end{itemize} + } + \item{Generate a hexfile + (avr-objcopy -j .text -j .data -O ihex avrtest.o avrtest.hex)} + \item{Connect an SD-card to your Atmega128 with a file called + \filename{orig.txt} on it.} + \item + { + Flash the hex file into your $\mu C$. + \begin{itemize} + \item{On Linux: avrdude -P /dev/ttyUSB0 -c stk500 -p m128 -Uflash:w:avrtest.hex} + \item{On Windows: use Atmel AVR-Studio} + \end{itemize} + } + \item{Reset your $\mu C$ and wait some time (depending on how big + the file \filename{orig.txt} is).} + \item{Disconnect the SD-card, so you can put it in your card reader + and find out if the file \filename{orig.txt} is copied to + \filename{copy.txt}.} +\end{enumerate} diff --git a/poc/lpc2148_efsl/docs/pages/config.tex b/poc/lpc2148_efsl/docs/pages/config.tex new file mode 100644 index 0000000..f91ba0f --- /dev/null +++ b/poc/lpc2148_efsl/docs/pages/config.tex @@ -0,0 +1,194 @@ +In this section we're going to talk about the configuration file (\filename{config.h}), +that defines the behavior of the library. In the configuration files there are many +settings, most of which default to safe or 'standard' compliant settings. + +For every platform we try to deliver a sample configuration, with setting tweaked for +that architecture. This documentation only refers to the general elements which are +tied to the library rather that the target hardware. + +\subsection{Hardware target} +Here you will define what kind of hardware you will be using. Please refer to +section \ref{hwdriver} to learn how to write a hardware endpoint. +Here you must \code{\#define} the name of your hardware endpoint. +The following list contains the endpoints that the library ships with.\\ +\begin{tabular}{|l|p{8cm}|} + \hline + \code{HW\_ENDPOINT\_LINUX}& This endpoint uses a regular file as + a "disc" containing a filesystem. This is a great endpoint for + testing and debugging. All development is done using this emulation.\\ + \code{HW\_ENDPOINT\_ATMEGA128\_SD}& This endpoint is for the Atmel ATMega 128 + with an SD card attached to the SPI pins of the device. Several settings + that are specific for this endpoint can be found in the AVR sample + configuration. A Makefile is also provided for compiling the EFSL library + using avr-gcc.\\ + \code{HW\_ENDPOINT\_DSP\_TI6713\_SD}& This endpoint is for a TI DSP, it should + work with any McBSP port, due to the infinite amount of options, you should + refer to the source code of this endpoint for fine tuning, or selecting what + port to use (defaults to McBSP0).\\ + \hline +\end{tabular} + +\subsection{Memory configuration} +This section only has one option, called \code{BYTE\_ALIGNMENT}. If you define +this keyword the library will assume that your CPU is capable of accessing the +memory in any way it sees fit. This is the case on AVR, because they are 8 bit +processors, and it is also the case on Intel x86 hardware. Both architectures can +read and write words, or double words on any location in memory, be it word aligned +or not. + +However, some CPU's, are not capable of doing this, and require that all double words +are aligned on a double word boundary, and all word are aligned on a word boundary. +This causes problems with some of the casts that are performed in EFSL. If you have such +a CPU, then you must comment this option out. The effect is that special functions +will be used to copy or cast memory. These functions work around the problem by +using memCpy, or manually copying elements of the structs that are normally cast when +\code{BYTE\_ALIGNMENT} is defined. + +If you have an 8 bit architecture, or are running on PC, there is no need to turn this +off. If you do, the library will work fine, and maybe even without slowdown. +On architectures that do have the alignment problem, you should turn this flag off. +Failure to do so will result in undefined behavior. + +\subsection{Cache configuration} +This section is dedicated to configuring the cache memory for the library. Caching +is performed by the IOMan object, see section \ref{ioman}. +\subsubsection*{IOMAN\_NUMBUFFER} +This number determines how much memory will be used for caching. Since this +is sector based one \code{IOMAN\_NUMBUFFER} equals to 512 byes of memory, plus +a small overhead in settings (approximately 8 bytes). This number is also affected +by \code{IOMAN\_NUMITERATIONS}. + +You should carefully consider how much memory you will dedicate to caching. A too +low number will cause excessive data transfer to and from the disc, where a too high +number will simply be a waste of memory. + +A good rule of thumb is to use 1 buffer per filesystem you create, and 2 buffers +per file you want to use simultaneously. So for a simple application with +one filesystem, and one file operation, 2 or 3 buffers will be fine. If you have memory +to spare, you can use 6 buffers. Using more buffers will have a minimal effect on +performance. + +If you want to seek and rewrite portions of a file, add an extra buffer for that file. +Using the list function or creating directories will be disc intensive, try to smoothen +it by using an extra 3 buffer for either operation. + +It is perfectly possible to have multiple files op for reading and writing, on different +filesystems, with listing etc and only using 1 buffer. It will be a tough blow on +performance though. +\subsubsection*{IOMAN\_NUMITERATION} +This number controls how many stack places each cache place gets. Refer to the IOMan +section for an explanation. In short, if you only have 1 buffer, leave it at 3. If you +use more than 4 buffers try decreasing the number to 2 or 1 for a small memory gain. + +If you get errors, it means you have set it too low (see error support). It is best +to leave this at the default setting (do not increase it), unless you know what you +are doing. +\subsubsection*{IOMAN\_DOMEMALLOC} +This configures how IOMan will get it's memory. If you leave it enable, the memory +will be allocated by IOMan itself. That means that when you declare the IOMan object +it will have a member the size of $512 \cdot \mathrm{IOMAN\_NUMBUFFER}$. +That also means that that huge lump of memory will reside on the stack. On a true embedded platform with no malloc, this is your best option. +The last argument of \code{ioman\_init} will be ignored. + +If you comment this out,IOMan will take a \code{euint8*} pointer as it's third +argument to \code{ioman\_init}. It will use the memory pointed to as cache. +You will have to make sure it's reserved and of the correct size. +This allows you to put the memory on the heap, or perform special tricks like +deallocating it without having to umount your filesystem and open files. +On systems with malloc, this is the recommended setting. + +If you use the efs wrapper object, please look at the \code{efs\_init} documentation +on how to pass the ioman pointer. + +\subsection{Pre-allocation} +Our VFAT module supports the concept of pre-allocation. When writing files, for +example log files, it is usually done with tiny bits a time. That is not the +most efficient way, but it is usually the only solution that works on embedded +systems. Every time you cross a cluster boundary with your write, the library +has to search a new cluster (reading the FAT), allocate it (write to the FAT). + +Clearly, this is a waste. The solution we came up with was preallocating. This means +that when you write to a file, and fwrite sees that it needs to allocate more clusters, +it will allocate too many of them. Since this is done in one operation, it requires +usually only one read and one write to the FAT. This can save up to 50\% disc I/O +in some applications. + +The drawback is that the allocation happens in larger chunks, if you do this with +many files, you might end up with larger than normal amounts of slackspace. + +We have also implemented this feature for directories. This is very useful if you +have to create a lot of small files, since the directories grow by larger portions +then. + +\subsubsection*{CLUSTER\_PREALLOC\_FILE} +This number determines the default value of extra clusters that will be allocated +with every sizeincrease. For example, if fwrite calculates that it needs 7 clusters, +and \code{CLUSTER\_PREALLOC\_FILE} is 30 then efsl will allocate 37 clusters. +This means (assuming every write needs 7 clusters) that the next 4 writes won't +require any write operation to the FAT (and due to the cluster cache the FAT will probably have to be read only once). + +The value you put here will be the default value, it can be changed per file +object. (not yet implemented). + +\subsubsection*{CLUSTER\_PREALLOC\_DIRECTORY} +The same explanation as above counts, only this value is used for directories. +Generally you should not put this above 10 (unless your speed tests prove otherwise +off course). + +\subsection{Endianness} +The Microsoft FAT filesystem was originally created to be run on Intel compatible hardware. +Therefore the Microsoft programmers decided to record all data on the disc in little endian +format. Our library supports running on big endian devices. Here you can select whether your +target CPU is little or big endian. + +Running on big endian will cause some performance lose because (rather simple) calculations have +to be made to all numbers that have to interpreted by the library. This does not apply to +data within the files off course. + +If the flag \code{\#LITTLE\_ENDIAN} is set, efsl will assume that your hardware is little endian. +If you have a big endian system, you should comment this out. The function \code{fs\_checkEndian} +will tell you if you have selected the right endianness, this is a check you might want to use. + +\subsection{Date and time} +This flag determines if you want to have date and time support. With date and time support we +mean that when you create or update a file the directory entry will receive the correct date and +time stamp. + +Please refer to section \ref{dateandtime} to learn more about how this works. + +If you disable date and time support by commenting the \code{\#DATE\_TIME\_SUPPORT} then +all dates and times that need to be created or updated will be set to zero, which in FAT land corresponds to the first of January of the year 1970. + +\subsection{Errors} +When the library encounters an error, there be an error cascade moving from the error-causing object +to the topmost object where the request started. Seen from userland this gives you extremely little +information, usually nothing more than fail or success. + +Every object in the library has an optional error field, that contains a unique number that +corresponds to a specific error. If you examine every error field you can see exactly where the +error was started and what the effect was on the higher level objects. + +In a more practical sense you can display an error number or explanation to your users, giving +yourself or them a better chance to correct or avoid the problem. +Please see the section on error on what every value means. + +\subsection{Debug} +In the config, debugging can be turned on or off by defining DEBUG. This can be +very useful when hacking on the efsl library, or when something goes wrong. +In applications this option should be turned off. + +The debugging behaviour will depend on the platform you are using: +\begin{itemize} + \item{On Linux debug lines will printed to the console} + \item{On AVR debug will be sent over a selected UART\\ + Make sure you set the following two values in your config.h: + \begin{itemize} + \item{DEBUG\_PORT: here you need to set which UART the library + may use} + \item{DEBUG\_UBRR: here you need to select the UBRR-value + (see the avr-datasheets for these values)} + \end{itemize} + } + \item{On DSP debug will call the printf function + (can only be used with a dsk-board)} +\end{itemize} diff --git a/poc/lpc2148_efsl/docs/pages/dateandtime.tex b/poc/lpc2148_efsl/docs/pages/dateandtime.tex new file mode 100644 index 0000000..7239020 --- /dev/null +++ b/poc/lpc2148_efsl/docs/pages/dateandtime.tex @@ -0,0 +1,34 @@ +\label{dateandtime} +The EFSL library supports setting and updating all date and time fields +supported by the filesystem. In order to do this the library must +know the current time and date at all times. Since it has to run everywhere, +there is no standard mechanism to get the date/time, and some systems do +not have a clock. + +With default configuration there is no date or time support, you have to +turn it on manually in the configuration file \filename{config.h}. +You will have to uncomment the field named \code{\#define DATE\_TIME\_SUPPORT}, +in order to activate date/time support. + +Furthermore you will have to provide the library with date and time information. +A set of defines was used for this, when date/time support is not enabled, +the defines automatically return \code{0x0000} for all time and date fields, +so there is no performance suffer when you do not need date/time support. +If you do need it you will have to provide 6 functions to the library +that will tell it the time. Since these functions may get called often, +it is highly recommended that you cache the time result somewhere so +you can serve the library directly from ram. If you do not do this and +your RTC request take a lot of time, you may suffer large losses in read +or write operations depending on your hardware. + +The six functions are: +\begin{itemize} + \item\code{euint16 efsl\_getYear(void)} + \item\code{euint8 efsl\_getMonth(void)} + \item\code{euint8 efsl\_getDay(void)} + \item\code{euint8 efsl\_getHour(void)} + \item\code{euint8 efsl\_getMinute(void)} + \item\code{euint8 efsl\_getSecond(void)} +\end{itemize} +Internally the library will recalculate these numbers to match the +filesystem that is currently in use. diff --git a/poc/lpc2148_efsl/docs/pages/debug.tex b/poc/lpc2148_efsl/docs/pages/debug.tex new file mode 100644 index 0000000..c07ca24 --- /dev/null +++ b/poc/lpc2148_efsl/docs/pages/debug.tex @@ -0,0 +1,40 @@ +Since debugging on every device is completely different, a DBG macro is +implemented. On Linux for example, this macro will print the string given +to the screen (using printf). On AVR, it will send debug strings through the +UART. For compatibility with other devices, it is necessary that you always use +the DBG-macro instead of a device-specific debugging commands.\newline +\newline +Because AVR-GCC puts strings in sram memory by default, every string should be +surrounded by the TXT-macro. On AVR, this macro will put the string in program +memory (flash), on any other device, this macro will be ignored.\newline +\newline +Example of a debug string:\\ +\code{DBG((TXT("This is test nr \%d of \%d.$\backslash$n"),id,total));} + +\subsubsection{Debugging on Linux} +On linux, debugging strings are sent to stdout using printf.\newline +\newline +To enable debugging, set DEBUG in \filename{config.h}. +\subsubsection{Debugging on AVR} +On AVR, debugging strings are sent through the UART and can be read using +a terminal like minicom (linux) or hyperterminal (windows). Standard, the +first UART is used, but this can be changed in \filename{debug.c} to the +second UART.\newline +\newline +To enable debugging: +\begin{itemize} + \item{Set DEBUG in \filename{config.h}} + \item{Set DEBUG\_PORT to the number of the UART efsl may use for debugging + in \filename{config.h}} + \item{Set DEBUG\_UBRR according to your baudrate \& clock speed in + \filename{config.h} (see the avr datasheet for this value)} + \item{Initialize debugging in your program by calling \code{debug\_init()}} +\end{itemize} +Remark: when you use the serial port in your main program, make sure you +use a different UART than the one efsl is using when sending debug string. +\subsubsection{Debugging on DSP} +On DSP, debugging strings are sent to Code Composer using the printf function. +\newline\newline +To enable debugging, set DEBUG in \filename{config.h}.\newline +\newline +Remark: this will only work when using a DSK-kit. diff --git a/poc/lpc2148_efsl/docs/pages/driver.tex b/poc/lpc2148_efsl/docs/pages/driver.tex new file mode 100644 index 0000000..67b4b93 --- /dev/null +++ b/poc/lpc2148_efsl/docs/pages/driver.tex @@ -0,0 +1,165 @@ +\label{hwdriver} +This section will describe step by step how to write an hardware endpoint. +You will be required to write your own endpoint in case non of the existing endpoints +matches your hardware. + +First let's have a look at how EFSL is structured internally.\\\\ +\includegraphics[scale=0.4]{schematics/objectmodel.eps}\\ + +As you can see we have created a linear object model that is quite simple. +The file en filesystem object deal with handling the filesystem specific stuff. +Below that we find the Partition object that is responsible for translating partition +relative addressing into disc-based LBA addressing. + +The Disc object hold the partition table, and has a direct link to a cache manager, IOMan. +In IOMan, all requests for disc sectors come together. IOMan will perform checks to see +if sectors have to be read from disc (or from memory), or written back to disc. +In the latter case (reading or writing to disc), a request is made to the hardware layer. + +The hardware interface has 3 responsibilities : +\begin{itemize} + \item Initialize the hardware + \item Read sectors from disc + \item Write sectors to disc +\end{itemize} + +All requests are \textsl{sector}based, a sector is a 512 byte piece from the disc, that is aligned to +a 512 byte boundary.\\\\ +\includegraphics[scale=0.4]{schematics/sector.eps} + +In this example we will create a new endpoint that will add support for data over pigeon carrier +for the EFSL. Initializing the hardware will require feeding the pigeon and telling it where the +data is. Reading/Writing will entail giving the bird the sector and letting it fly. + +Perform the following steps: +\begin{enumerate} + + \item Choose a name for your endpoint\\ + You will need this name to create the required defines in the source code. + For our example I've chosen the name \code{PIGEON\_CARRIER}. + For consistency the final name is then \code{HW\_ENDPOINT\_PIGEON\_CARRIER}. + + \item Verify the sizes of integers\\ + Open \filename{inc/types.h} and create a new entry for pigeon carriers. Perhaps + one of the existing sets is identical to yours and you can copy-paste it. + + \item Add your endpoint to \filename{interface.h}\\ + Locate the file \filename{interface.h} located in the directory \filename{inc/} + Add a pigeon entry (located above the \code{\#else ... NO INTERFACE DEFINED}) +\begin{lstlisting} +#if defined(HW_ENDPOINT_0) + #include "interfaces/0.h" +#elif defined(HW_ENDPOINT_1) + #include "interfaces/1.h" +#elif defined(HW_ENDPOINT_PIGEON_CARRIER) + #include "interfaces/pigeon.h" +#else + #error "NO INTERFACE DEFINED - see interface.h" +#endif +\end{lstlisting} + + \item Select your endpoint in \filename{conf/config.h} + + \item Create your sourcefiles\\ + Create a header file in \filename{inc/} and a sourcefile in \filename {src/interfaces}. + In this example I'm using \filename{pigeon.h} and \filename{pigeon.c}. + + \item Add your object file to the Makefile + Take the Makefile that works best on your platform (they should all work with + GNU/Make), or create a new one, using the existing one's as a template. + Make sure to include your new pigeon object to the library. + If you have an 'ar' like utility you can create a static library, else you may + have to create a new project containing all required source files. + +\end{enumerate} + +The basic framework is now complete, now all that's left to do is to write the code +that will perform the actual flying work. + +\subsubsection{hwInterface} +This structure represents the underlying hardware. There are some field that are required +to be present (because EFSL uses them), but you may put in as much or a little as +your driver requires to access the hardware. + +As always in embedded design it is recommended to keep this structure as small +as possible. + +Example: +\begin{lstlisting} +struct hwInterface{ + /* Field created for THIS hardware */ + Pigeon pigeon; + + /* Obligatory fields */ + euint32 sectorCount; +}; +typedef struct hwInterface hwInterface; +\end{lstlisting} + +\subsubsection{if\_initInterface} +This function will be called one time, when the hardware object is initialized by +\code{efs\_init()}. This code should bring the hardware in a ready to use state. + +The function's prototype is\\ +\code{esint16 if\_initInterface(hwInterface *hw, euint8* opts);} + +Optionally but recommended you should fill in the hw->sectorCount field with the number +of sectors. This field is used to validate sectorrequests. + +An example of a initInterface function : +\begin{lstlisting} +esint16 if_initInterface(hwInterface *hw, euint8* opts) +{ + /* Parse options */ + parse_options(opts); /* Your application may not need options */ + + /* Check hardware state */ + if(!alive(hw->pigeon)){ + //printf("Pigeon died! :-(\n"); + return(DEAD_PIGEON); /* #define DEAD_PIGEON -1 */ + } + + /* Initialize hardware */ + feed(hw->pigeon); + pet (hw->pigeon); + + /* Get sectors count */ + hw->numSectors = ask_pigeon_num_sectors(hw->pigeon); + + return(0); +} +\end{lstlisting} + +\subsubsection{if\_readBuf} +This function is responsible to read a sector from the disc and store it in a user supplied buffer. You will receive the hardware object, an address and a pointer to memory for storing +the buffer. + +Please be very careful to respect the boundaries of the buffers, since it will usually be IOMan +calling this function, and if you have a buffer overflow you might corrupt the cache of the +the next buffer, which in turn may produce extremely rare and impossible to retrace behavior. + +The function prototype is:\\ +\code{esint16 if\_readBuf(hwInterface *hw,euint32 address, euint8* buf);} + +The address is an LBA address, relative to the beginning of the disc. Should you be +accessing an old hard disc, or a device which uses some other form of addressing you will have to +recalculate the address to your own addressing scheme. Please note that there is no support +for sectors that are not 512 bytes large. + +\begin{lstlisting} +esint8 if_readBuf(hwInterface* hw,euint32 address,euint8* buf) +{ + Message new_message; + + new_message.address = address; + new_message.command = READ; + + pigeon_send(hw->pigeon,new_message); /* Launches the pigeon */ + while(!pigeon_returned(hw->pigeon)); /* Wait until the bird is back */ + memcpy(new_message.data,buf,512); /* Copy buffer */ + return(0); +} +\end{lstlisting} + +\subsubsection{if\_writeBuf} +The function \code{if\_writeBuf} works exactly the same as it's reading variant. diff --git a/poc/lpc2148_efsl/docs/pages/efs_init.tex b/poc/lpc2148_efsl/docs/pages/efs_init.tex new file mode 100644 index 0000000..5bedf02 --- /dev/null +++ b/poc/lpc2148_efsl/docs/pages/efs_init.tex @@ -0,0 +1,45 @@ +\subsubsection*{Purpose} +Initializes the hardware and the software layer. +\subsubsection*{Prototype} +\code{esint8 efs\_init(EmbeddedFileSystem *efs, eint8* opts);} +\subsubsection*{Arguments} +Objects passed to \code{efs\_init}: +\begin{itemize} + \item{\code{efs}: empty EmbeddedFileSystem object} + \item + { + \code{opts}: character string containing options, depending on what + interface you are using: + \begin{itemize} + \item{Linux: opts points to the path to the device} + \item{AVR: opts points to the card enable pin (TODO)} + \item{DSP: opts points to the card enable memory address (TODO)} + \end{itemize} + } +\end{itemize} +\subsubsection*{Return value} +Returns 0 if no errors are detected.\\ +\newline +Returns non-zero if a low-level error is detected: +\begin{itemize} + \item{Returns -1 if the interface could not be initialized.} + \item{Returns -2 if the filesystem could not be initialized.} +\end{itemize} +\subsubsection*{Example} +\lstset{numbers=left, stepnumber=1, numberstyle=\small, numbersep=5pt, tabsize=4} +\begin{lstlisting} + #include "efs.h" + + void main(void) + { + EmbeddedFileSystem efsl; + esint8 ret; + + DBG((TXT("Will init efsl now.\n"))); + ret=efs_init(&efsl,"/dev/sda"); + if(ret==0) + DBG((TXT("Filesystem correctly initialized.\n"))); + else + DBG((TXT("Could not initialize filesystem (err \%d).\n"),ret)); + } +\end{lstlisting} diff --git a/poc/lpc2148_efsl/docs/pages/file_fclose.tex b/poc/lpc2148_efsl/docs/pages/file_fclose.tex new file mode 100644 index 0000000..fb0eaaf --- /dev/null +++ b/poc/lpc2148_efsl/docs/pages/file_fclose.tex @@ -0,0 +1,43 @@ +\subsubsection*{Purpose} +Updates file records and closes file object. +\subsubsection*{Prototype} +\code{esint8 file\_fclose(File *file);} +\subsubsection*{Arguments} +Objects passed to \code{file\_fopen}: +\begin{itemize} + \item{\code{file}: pointer to a File object} +\end{itemize} +\subsubsection*{Return value} +Returns 0 if no errors are detected.\\ +\newline +Returns non-zero if an error is detected. +\subsubsection*{Example} +\lstset{numbers=left, stepnumber=1, numberstyle=\small, numbersep=5pt, tabsize=4} +\begin{lstlisting} + #include "efs.h" + + void main(void) + { + EmbeddedFileSystem efsl; + File file; + + /* Initialize efsl */ + DBG((TXT("Will init efsl now.\n"))); + if(efs_init(&efsl,"/dev/sda")!=0){ + DBG((TXT("Could not initialize filesystem (err \%d).\n"),ret)); + exit(-1); + } + DBG((TXT("Filesystem correctly initialized.\n"))); + + /* Open file for reading */ + if(file_fopen(&file, &efsl.myFs, "read.txt", 'r')!=0){ + DBG((TXT("Could not open file for reading.\n"))); + exit(-1); + } + DBG((TXT("File opened for reading.\n"))); + + /* Close file & filesystem */ + fclose(&file); + fs_umount(&efs.myFs); + } +\end{lstlisting} diff --git a/poc/lpc2148_efsl/docs/pages/file_fopen.tex b/poc/lpc2148_efsl/docs/pages/file_fopen.tex new file mode 100644 index 0000000..58700f6 --- /dev/null +++ b/poc/lpc2148_efsl/docs/pages/file_fopen.tex @@ -0,0 +1,70 @@ +\subsubsection*{Purpose} +Searches for file and initializes the file object. +\subsubsection*{Prototype} +\code{esint8 file\_fopen(File *file, FileSystem *fs, eint8 *filename, eint8 mode);} +\subsubsection*{Arguments} +Objects passed to \code{file\_fopen}: +\begin{itemize} + \item{\code{file}: pointer to a File object} + \item{\code{fs}: pointer to the FileSystem object} + \item{\code{filename}: pointer to the path + filename} + \item + { + \code{mode}: mode of opening, this can be: + \begin{itemize} + \item{'r': open file for reading} + \item{'w': open file for writing} + \item{'a': open file for appending} + \end{itemize} + } +\end{itemize} +\subsubsection*{Return value} +Returns 0 if no errors are detected.\\ +\newline +Returns non-zero if an error is detected: +\begin{itemize} + \item{Returns -1 if the file you are trying to open for reading could not + be found.} + \item{Returns -2 if the file you are trying to open for writing already + exists.} + \item{Returns -3 if no free spot could be found for writing or appending.} + \item{Returns -4 if mode is not correct (if it is not 'r', 'w' or 'a').} +\end{itemize} +\subsubsection*{Example} +\lstset{numbers=left, stepnumber=1, numberstyle=\small, numbersep=5pt, tabsize=4} +\begin{lstlisting} + #include "efs.h" + + void main(void) + { + EmbeddedFileSystem efsl; + File file_read, file_write; + + /* Initialize efsl */ + DBG((TXT("Will init efsl now.\n"))); + if(efs_init(&efsl,"/dev/sda")!=0){ + DBG((TXT("Could not initialize filesystem (err \%d).\n"),ret)); + exit(-1); + } + DBG((TXT("Filesystem correctly initialized.\n"))); + + /* Open file for reading */ + if(file_fopen(&file_read, &efsl.myFs, "read.txt", 'r')!=0){ + DBG((TXT("Could not open file for reading.\n"))); + exit(-1); + } + DBG((TXT("File opened for reading.\n"))); + + /* Open file for writing */ + if(file_fopen(&file_write, &efsl.myFs, "write.txt", 'w')!=0){ + DBG((TXT("Could not open file for writing.\n"))); + exit(-2); + } + DBG((TXT("File opened for writing.\n"))); + + /* Close files & filesystem */ + fclose(&file_read); + fclose(&file_write); + fs_umount(&efs.myFs); + } +\end{lstlisting} diff --git a/poc/lpc2148_efsl/docs/pages/file_read.tex b/poc/lpc2148_efsl/docs/pages/file_read.tex new file mode 100644 index 0000000..0770980 --- /dev/null +++ b/poc/lpc2148_efsl/docs/pages/file_read.tex @@ -0,0 +1,51 @@ +\subsubsection*{Purpose} +Reads a file and puts it's content in a buffer. +\subsubsection*{Prototype} +\code{euint32 file\_read (File *file, euint32 size, euint8 *buf);} +\subsubsection*{Arguments} +Objects passed to \code{file\_read}: +\begin{itemize} + \item{\code{file}: pointer to a File object} + \item{\code{size}: amount of bytes you want to read / put in buf} + \item{\code{buf}: pointer to the buffer you want to store the data} +\end{itemize} +\subsubsection*{Return value} +Returns the amount of bytes read. +\subsubsection*{Example} +\lstset{numbers=left, stepnumber=1, numberstyle=\small, numbersep=5pt, tabsize=4} +\begin{lstlisting} + #include "efs.h" + + void main(void) + { + EmbeddedFileSystem efsl; + euint8 buffer[512]; + euint16 e, f; + File file; + + /* Initialize efsl */ + DBG((TXT("Will init efsl now.\n"))); + if(efs_init(&efsl,"/dev/sda")!=0){ + DBG((TXT("Could not initialize filesystem (err \%d).\n"),ret)); + exit(-1); + } + DBG((TXT("Filesystem correctly initialized.\n"))); + + /* Open file for reading */ + if(file_fopen(&file, &efsl.myFs, "read.txt", 'r')!=0){ + DBG((TXT("Could not open file for reading.\n"))); + exit(-1); + } + DBG((TXT("File opened for reading.\n"))); + + /* Read file and print content */ + while((e=file_read(&file,512,buffer))){ + for(f=0;f + #include "efs.h" + + void main(void) + { + EmbeddedFileSystem efsl; + euint8 *buffer = "This is a test.\n"; + euint16 e=0; + File file; + + /* Initialize efsl */ + DBG((TXT("Will init efsl now.\n"))); + if(efs_init(&efsl,"/dev/sda")!=0){ + DBG((TXT("Could not initialize filesystem (err \%d).\n"),ret)); + exit(-1); + } + DBG((TXT("Filesystem correctly initialized.\n"))); + + /* Open file for writing */ + if(file_fopen(&file, &efsl.myFs, "write.txt", 'w')!=0){ + DBG((TXT("Could not open file for writing.\n"))); + exit(-1); + } + DBG((TXT("File opened for reading.\n"))); + + /* Write buffer to file */ + if( file_write(&file,strlen(buffer),buffer) == strlen(buffer) ) + DBG((TXT("File written.\n"))); + else + DBG((TXT("Could not write file.\n"))); + + /* Close file & filesystem */ + fclose(&file); + fs_umount(&efs.myFs); + } +\end{lstlisting} diff --git a/poc/lpc2148_efsl/docs/pages/freespace.tex b/poc/lpc2148_efsl/docs/pages/freespace.tex new file mode 100644 index 0000000..05988bc --- /dev/null +++ b/poc/lpc2148_efsl/docs/pages/freespace.tex @@ -0,0 +1,35 @@ +\hyphenation{count-Free-Clusters File-System} + +To get the free space left on EFSL 0.2 is a bit tricky. This +feature was implemented after it had gone into stable, so it +couln't interfere with other library functions. + +If the filesystem type is FAT12 of FAT16, you must call\\ +\code{euint32 fat\_countFreeClusters (FileSystem *fs)} to know +the amount of free clusters. Please note that this is an expensive +function call in terms of speed. It will also work on FAT32 volumes, +but there is a better alternative for that. + +Usually FAT32 volumes are substantially larger than FAT12 of FAT16 volumes. +Microsoft, in it's infinite wisdom, decided to use the second sector of +the partition to dump various statistics about the filesystem. Problem +is they are inaccurate, so if you want to be really sure, always use the +beforementioned countFreeClusters function. + +To save time, you can also use \code{esint8 fs\_getFsInfo(FileSystem *fs,euint8 force\_update)}. +If force\_update is set to 0, this function will simply gather the data +that is stored on the disc regarding free space. If you call it with +force\_update set to 1, it will gather this data, but correct the result +with a call to countFreeClusters. +After that you will find the result in fs->FreeClusterCount. + +To save time, call getFsInfo after you mounted the filesystem, +and just before you umount the filesystem give a call to setFsInfo. +This will make the updated clustercount get written to disc, so you +don't have to go through the lenghty verification everytime. +The functions that have the largest impact on free space (allocClusterChain +and unlinkClusterChain) keep track of the changes they make and they update +the fs->FreeClusterCount field accordingly. + +This is an ugly ``add-on'', and will be replaced by a decent implementation +in the 0.3/0.4 series. diff --git a/poc/lpc2148_efsl/docs/pages/ioman.tex b/poc/lpc2148_efsl/docs/pages/ioman.tex new file mode 100644 index 0000000..cb14b2a --- /dev/null +++ b/poc/lpc2148_efsl/docs/pages/ioman.tex @@ -0,0 +1,236 @@ +\label{ioman} +The IOManager that is the second lowest layer of the embedded filesystems library is +responsible for coordinating disk input and output, as well as managing a caching +system. This documentation describes the second implementation of IOMan, which includes +features such as : +\begin{itemize} + \item Delayed write + \item Buffer reference statistics + \item Buffer exportable to users + \item Support for cached direct I/O as well as indirect I/O + \item Can allocate memory itself (on the stack), or you can do it yourself (heap) +\end{itemize} + +\subsubsection{General operation} +Because of the limited memory nature of most embedded devices for which this library is +intended several design decisions were made to minimize memory usage. Some of these required +that some concessions be made. One of them is that there is no memory protection, since +most devices don't have the memory to support this, or lack the ability to protect memory. + +When IOMan receives a request for a sector, it will make sure it has the sector in it's +own memory cache and then give the caller a \code{euint8*} pointer to that cache. The +user is then free to do operations on that memory, and when it is done it should tell +IOMan so. Several things can go wrong with this: you can request a sector for reading, +and then write in the cache, thereby corrupting it. Or you can request a sector, but never +release it (sort of a memory leak), which may result in very bad performance, and a deadlocked +I/O manager. + +But, taking into account that very little memory is required for operation, if you follow the I/O man rules, you will get a pretty clever caching object that will make writing new filesystems +a simple job. + +\subsubsection{Cache decisions} +Whenever ioman receives a request to fetch a sector, be it read or write, it will have to make sure +it has, or can get the sector you want. It follows a certain path to do this.\label{cachemethod} +\begin{enumerate} + \item First of all it will scan it's cache range to see if it already has the sector. + If it is found, and it was a write request, the cache is marked writable. Usage and + reference get incremented and a pointer is then returned to the requester. If the + buffer cannot be found, ioman proceeds to step 2. + \item When an item is not in cache, it has to be fetched from the disc, the best place to + store it is in memory that does not contain anything useful yet. Ioman will search for + a place that is currently not occupied by anything. If it is found, the sector will be + placed on that spot and a pointer returned. Else, ioman proceeds to step 3. + \item Since there is no other choice than to overwrite an already existing cache, ioman will + try to find one that is the least interesting. First it will search for caches that + are marked not writable, and have no users. Ioman will then select the one that has the + least references. If there are none, it will search for caches that don't have users and + are writable. Once again the one with the least references is returned. Since it is + writable ioman will flush it to disc first. After that the requested sector is put there + and a pointer returned. If it cannot find any caches that have no users it will go to + step 4. + \item Since every cache spot is in use ioman will have to select one for overallocation. + Since this selection is dependant on many factors and is rather complex, a points + system is used. The algorithm considers every cache place and allocated a certain number + of points to it, lower means that it is a better candidate for overallocation. Fifty + percent of the points goes to the cache being marked writable, since having to write + a sector is expensive. Another 35 percent goes to how many overallocations have + already been done on that spot. It doesn't make sense to always overalloc the same buffer, + it is better to spread this. The remaining 15 percent is determined by the number of + references to the sector. + + After a function has selected the best candidate, ioman will overwrite that spot with + the new sector. It will also push the status and sectornumber onto that cache's + retrieval stack, so that when the sector is released, the older sector can be retrieved. + If this fails go to step 5. + \item When ioman gets here it will return a (nil) pointer and flag an error. +\end{enumerate} + +\subsubsection{Functions} + +\begin{longtable}{|p{0.35\textwidth}|p{0.65\textwidth}|} + + \hline + \multicolumn{2}{|c|}{ + \textbf{I/O Manager Functions} + } \\ + \multicolumn{2}{|c|}{} \\ + \hline + \hline + \endfirsthead + + \hline + \multicolumn{2}{|c|}{\textbf{I/O Manager Functions (continued)}} \\ + \hline + \endhead + + \hline + \endfoot + + \hline + \endlastfoot + + \code{ioman\_init} & \code{esint8 (IOManager *ioman, hwInterface *iface, euint8* bufferarea)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function is called to initialize the internal state of the I/O manager. It should be the + first function you call on an ioman object. Failure to do so will result in undefined behavior. + The function clears all internal variables to a default safe state, and sets up it's memory region. + + There are two possibilities, if you supply a 0 pointer then a function will be called that contains + a static variable with a size of 512 * \code{IOMAN\_NUMBUFFERS}, else, it will be assumed that + you allocated that memory yourself and the pointer you provided will be used. + }\\ + \hline + + \code{\external{ioman\_reset}} & \code{void (IOManager *ioman)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function is called from the initialization function, it does the actual reset of all variables. + }\\ + \hline + + \code{ioman\_pop} & \code{esint8 (IOManager *ioman,euint16 bufplace)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function fetches settings (sector number, usage and status register) from stack \code{bufplace} + and puts it back on the main registers. It will return 0 on succesful pop, and -1 on error, or when + there are no elements to pop. + }\\ + \hline + + \code{ioman\_push} & \code{esint8 (IOManager *ioman,euint16 bufplace)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function pushes the settings of cache \code{bufplace} onto that cache's stack. It does not + destroy the data in the main registers. It will return 0 for a successful push, and -1 on error, or + when there is no more space to push a new element. + }\\ + \hline + + \code{ioman\_readSector} & \code{esint8 (IOManager *ioman,euint32 address,euint8* buf)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function does the actual reading from the hardware, it is the one and only function that + calls \code{if\_readBuf()}, here a retry on failure policy could be implemented. This function + will correctly stream errors upwards. All calls made to this function in the iomanager are checked + for their return value, so errors propagate correctly upwards. + + The address it receives is relative to the beginning of the disc, no assumptions about \code{buf} + may be made, it can be withing ioman's cache memory range, but it could also be a buffer from userspace. + + The function will return 0 on success and -1 on failure. + }\\ + \hline + + \code{ioman\_writeSector} & \code{esint8 (IOManager *ioman, euint32 address, euint8* buf)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function does the actual writing to the hardware, it is the one and only function that + calls \code{if\_writeBuf()}, here a retry on failure policy could be implemented. This function + will correctly stream errors upwards. All calls made to this function in the iomanager are checked + for their return value, so errors propagate correctly upwards. + + The address it receives is relative to the beginning of the disc, no assumptions about \code{buf} + may be made, it can be withing ioman's cache memory range, but it could also be a buffer from userspace. + + The function will return 0 on success and -1 on failure. + }\\ + \hline + + \code{\external{ioman\_getSector}} & \code{euint8* (IOManager *ioman,euint32 address, euint8 mode)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function is the one that is called most from the higher library routines. It is the function + that will present you with a pointer to memory containing sector number \code{address}. There are + several modes that you can select or combine.\newline + \begin{tabular}{|l|p{.6\textwidth}|} + \hline + \code{IOM\_MODE\_READONLY} & This attribute says to ioman that it needs a buffer only for reading. + This does not mean that you are allowed to write to it, doing so results in undefined behavior. + You cannot combine this option with the \code{IOM\_MODE\_READWRITE} option.\\ + \code{IOM\_MODE\_READWRITE} & This attribute says to ioman that it would like not only to read from + but also to write to that buffer. When you release the sector your changes will be written to disc. + This may not happen immediately though, if you want to force it take a look at the + \code{ioman\_flushRange()} function. This option cannot be combined with the + \code{IOM\_MODE\_READONLY} option.\\ + \code{IOM\_MODE\_EXP\_REQ} & This option tell the iomanager that the request is exceptional, for + example that the request is unlikely to happen again. The library adds this flags to the options + when requesting the bootrecord, to prevent it from getting a high rating, which should prevent it + from being removed from the cache.\\ + \hline + \end{tabular}\newline + These options can be combined by ORing them together. + }\\ + \hline + + \code{ioman\_releaseSector} & \code{esint8 (IOManager *ioman,euint8* buf)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function tells ioman that you are done with one of the cache elements and that it can do + it's bidding with it. Forgetting to call this function may result in deadlocked iomanagers. + }\\ + \hline + + \code{ioman\_directSectorRead} & \code{esint8 (IOManager *ioman,euint32 address, euint8* buf)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This is a variant of the normal getsector. Sometimes you need a sector from the disc, but all + you want to do with it is export it directly to userbuffers. It would be foolish to force a + caching of that sector if there is external space available for it. + + This function will fetch sector \code{address} from disc and place it in the memory pointed to + by \code{buf}. Should there be a free spot available the sector will be cached there, so that + it may be used in the future. If the sector was available from cache in the first place, it + will simply be \code{memCpy()}'d from the cache to the userspace buffer. + }\\ + \hline + + \code{ioman\_directSectorWrite} & \code{esint8 (IOManager *ioman,euint32 address, euint8* buf)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function is based on the same philosophy as \code{ioman\_directSectorRead()}, however, + contrary to what the name may lead to believe it also passes through a caching layer. If + there is an unused spot (or the sector is in cache), the userbuffer will be copied to that + spot and will remain there until the space is needed or a flush is forced. + }\\ + \hline + + \code{ioman\_flushRange} & \code{esint8 (IOManager *ioman,euint32 address\_low, euint32 address\_high)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function is used to ask ioman to flush all sectors to disc that are in a specific + range. For example you might want to flush a specific range of your filesystem without + needlessly disturb other parts. The range is \code{address\_low <= n => address\_high}. + Off course only sectors that are marked as writable are flushed to disc. + }\\ + \hline + + \code{ioman\_flushAll} & \code{esint8 (IOManager *ioman)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function will cause ioman to flush out all cache units that are marked writable. If + they do not have any users, they will lose their writable mark. + }\\ + \hline +\end{longtable} + diff --git a/poc/lpc2148_efsl/docs/pages/lgpl.txt b/poc/lpc2148_efsl/docs/pages/lgpl.txt new file mode 100644 index 0000000..487ce55 --- /dev/null +++ b/poc/lpc2148_efsl/docs/pages/lgpl.txt @@ -0,0 +1,489 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + diff --git a/poc/lpc2148_efsl/docs/pages/license.tex b/poc/lpc2148_efsl/docs/pages/license.tex new file mode 100644 index 0000000..3ed94f0 --- /dev/null +++ b/poc/lpc2148_efsl/docs/pages/license.tex @@ -0,0 +1,12 @@ +This library is subject to the Lesser General Public License version 2.1. +We have chosen this license in stead of the BSD license because we feel strongly +that more effort was needed in the field of quality software in the embedded field. + +Please note that if you make changes to the library itself, those modifications must be +made public, but that writing support for new hardware and linking it into the library, +does not fall under this category. However, we would off course appreciate it tremendously +if you would send us in code to support new hardware. + +\subsection{GNU Lesser General Public License} +\verbatiminput{pages/lgpl.txt} + diff --git a/poc/lpc2148_efsl/docs/pages/linux.tex b/poc/lpc2148_efsl/docs/pages/linux.tex new file mode 100644 index 0000000..7cc6a67 --- /dev/null +++ b/poc/lpc2148_efsl/docs/pages/linux.tex @@ -0,0 +1,138 @@ +Debugging efsl on embedded devices is a rather hard job, because +you can't just printf debug strings or watch memory maps easily. +Because of that, core development has been performed under the +Linux operating system. Under Linux, efsl can be compiled as +library and used as a userspace filesystem handler. On Unix- +style operating system (like Linux), all devices (usb stick, disc, \ldots) +can be seen as a file, and as such been opened by efsl.\newline +\newline +In the following section, we will explain how to get started using +efsl as userspace filesystem handler. However, please note that the main +focus for efsl is to support embedded systems, which usually don't even +have 1\% of the memory you have on a PC. Accessing files on a FAT-filesystem +with efsl will be much slower than when accessing these files with the Linux +FAT kernel modules. +\subsubsection{Download \& Compile} +Let's get started: +\begin{enumerate} + \item{Get the latest release of efsl on http://www.sf.net/projects/efsl/ + and put it in your homedir} + \item{Unpack the library (tar xvfj efsl-version.tar.bz2)} + \item{Get inside the directory (cd $\sim$/efsl)} + \item{Create a symlink from \filename{Makefile-LINUX} to \filename{Makefile} + (ln -s Makefile-LINUX Makefile)} + \item{Copy \filename{conf/config-sample-linux.h} to \filename{conf/config.h} + (cp conf/config-sample-linux.h conf/config.h)} + \item{Compile the library (make lib)} + \item{Find the compiled filesystem library (libefsl.a) in the current + directory} +\end{enumerate} +If you got any errors with the steps above, please check that that you have +the following packages installed: tar, gcc, libgcc, binutils \& make. +\subsubsection{Example} +Since efsl itself is only a library, it's not supposed to do anything +out of the box, than just compile. To get started, we'll show here a small +example program that opens a file on a disc/usb-stick/floppy that contains +a FAT-filesystem and prints it's content to stdout.\newline +\newline +First, create a new directory in which you put the compiled efsl-library +(\filename{libefsl.a}) and create a new file called \filename{linuxtest.c} containing: +\lstset{numbers=left, stepnumber=1, numberstyle=\small, numbersep=5pt, tabsize=4} +\begin{lstlisting} + #include + #include + + int main(void) + { + EmbeddedFileSystem efs; + EmbeddedFile file; + unsigned short i,e; + char buf[512]; + + if(efs_init(&efs,"/dev/sda")!=0){ + printf("Could not open filesystem.\n"); + return(-1); + } + + if(file_fopen(&file,&efs.myFs,"group",'r')!=0){ + printf("Could not open file.\n"); + return(-2); + } + + while(e=file_read(&file,512,buf)){ + for(i=0;icurrentEntry}. +\subsubsection*{Prototype} +\code{esint8 ls\_getNext(DirList *dlist);} +\subsubsection*{Arguments} +Objects passed to \code{ls\_getNext}: +\begin{itemize} + \item{\code{dlist}: pointer to a DirList object} +\end{itemize} +\subsubsection*{Return value} +This function will return 0 when it has found a next file in the directory, and +was successful in copying it to \code{dirlist->currentEntry}. It will return -1 +when there are no more files in the directory. + +\subsubsection*{Example} +To browse through a directory you should first open it with \code{ls\_openDir} and +then you can call \code{ls\_getNext} in a loop to iterate through the files. Please +note that they are unsorted. +\lstset{numbers=left, stepnumber=1, numberstyle=\small, numbersep=5pt, tabsize=4} +\begin{lstlisting} +#include "efs.h" +#include "ls.h" + + void main(void) +{ + EmbeddedFileSystem efsl; + DirList list; + + /* Initialize efsl */ + if(efs_init(&efsl,"/dev/sda")!=0){ + DBG((TXT("Could not initialize filesystem (err \%d).\n"),ret)); + exit(-1); +} + + /* Open the directory */ + ls_openDir(list,&(efsl.myFs),"/usr/bin/"); + + /* Print a list of all files and their filesize */ + while(ls_getNext(list)==0){ + DBG((TXT("%s (%li bytes)\n"), + list->currentEntry.FileName, + list->currentEntry.FileSize)); + } + + /* Correctly close the filesystem */ + fs_umount(&efs.myFs); +} +\end{lstlisting} + +Please note that it is not required to close this object, if you wish to switch +to another directory you can just call \code{ls\_openDir} on the object again. diff --git a/poc/lpc2148_efsl/docs/pages/lsopendir.tex b/poc/lpc2148_efsl/docs/pages/lsopendir.tex new file mode 100644 index 0000000..9154bc8 --- /dev/null +++ b/poc/lpc2148_efsl/docs/pages/lsopendir.tex @@ -0,0 +1,42 @@ +\subsubsection*{Purpose} +This function opens a directory for viewing, allowing you to iterate through +it's contents. +\subsubsection*{Prototype} +\code{esint8 ls\_openDir(DirList *dlist,FileSystem *fs,eint8* dirname);} +\subsubsection*{Arguments} +Objects passed to \code{ls\_openDir}: +\begin{itemize} + \item{\code{dlist}: pointer to a DirList object} + \item{\code{fs}: pointer to the FileSystem object} + \item{\code{dirname}: C string containing the directorypath} +\end{itemize} +\subsubsection*{Return value} +This function will return 0 when it has opened the directory, and -1 on error.\\ + +\subsubsection*{Example} +\lstset{numbers=left, stepnumber=1, numberstyle=\small, numbersep=5pt, tabsize=4} +\begin{lstlisting} +#include "efs.h" +#include "ls.h" + + void main(void) + { + EmbeddedFileSystem efsl; + DirList list; + + /* Initialize efsl */ + if(efs_init(&efsl,"/dev/sda")!=0){ + DBG((TXT("Could not initialize filesystem (err \%d).\n"),ret)); + exit(-1); + } + + /* Open the directory */ + ls_openDir(list,&(efsl.myFs),"/usr/bin/"); + + /* Correctly close the filesystem */ + fs_umount(&efs.myFs); + } +\end{lstlisting} + +Please note that it is not required to close this object, if you wish to switch +to another directory you can just call \code{ls\_openDir} on the object again. diff --git a/poc/lpc2148_efsl/docs/pages/mkdir.tex b/poc/lpc2148_efsl/docs/pages/mkdir.tex new file mode 100644 index 0000000..8264430 --- /dev/null +++ b/poc/lpc2148_efsl/docs/pages/mkdir.tex @@ -0,0 +1,47 @@ +\subsubsection*{Purpose} +Creates a new directory. +\subsubsection*{Prototype} +\code{esint8 mkdir(FileSystem *fs,eint8* dirname);} +\subsubsection*{Arguments} +Objects passed to \code{mkdir}: +\begin{itemize} + \item{\code{fs}: pointer to the FileSystem object} + \item{\code{dir}: pointer to the path + name of the new directory} +\end{itemize} +\subsubsection*{Return value} +Returns 0 if no errors are detected.\\ +\newline +Returns non-zero if an error is detected: +\begin{itemize} + \item{Returns -1 if the directory already exists.} + \item{Returns -2 if the path is incorrect (parent directory does not exists).} + \item{Returns -3 if no free space is available to create the directory.} +\end{itemize} +\subsubsection*{Example} +\lstset{numbers=left, stepnumber=1, numberstyle=\small, numbersep=5pt, tabsize=4} +\begin{lstlisting} + #include "efs.h" + + void main(void) + { + EmbeddedFileSystem efsl; + + /* Initialize efsl */ + DBG((TXT("Will init efsl now.\n"))); + if(efs_init(&efsl,"/dev/sda")!=0){ + DBG((TXT("Could not initialize filesystem (err \%d).\n"),ret)); + exit(-1); + } + DBG((TXT("Filesystem correctly initialized.\n"))); + + /* Create new directories */ + if(mkdir(&efsl.myFs,"dir1")==0){ + mkdir(&efsl.myFs,"dir1/subdir1"); + mkdir(&efsl.myFs,"dir1/subdir2"); + mkdir(&efsl.myFs,"dir1/subdir3"); + } + + /* Close filesystem */ + fs_umount(&efsl.myFs); + } +\end{lstlisting} diff --git a/poc/lpc2148_efsl/docs/pages/plibc.tex b/poc/lpc2148_efsl/docs/pages/plibc.tex new file mode 100644 index 0000000..90e5212 --- /dev/null +++ b/poc/lpc2148_efsl/docs/pages/plibc.tex @@ -0,0 +1,62 @@ +This section of the manual describes the minimalistic C library functions that were +created for EFSL. Since EFSL was designed for ultimate portability, no assumptions about the +workings or even the presence of a C library could be made. Fortunately only very few functions +had to be created that mimicked the operations of well known C library functions. +\\ +\begin{longtable}{|p{0.35\textwidth}|p{0.65\textwidth}|} + + \hline + \multicolumn{2}{|c|}{ + \textbf{PLibC Functions} + } \\ + \multicolumn{2}{|c|}{} \\ + \hline + \hline + \endfirsthead + + \hline + \multicolumn{2}{|c|}{\textbf{PLibC Functions (continued)}} \\ + \hline + \endhead + + \hline + \endfoot + + \hline + \endlastfoot + + \code{strMatch} & \code{euint16 strMatch(eint8* bufa, eint8*bufb,euint32 n)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function compares the strings \code{bufa} and \code{bufb} for \code{n} bytes. + It will return the number of bytes in that section that does not match. So if you + want to compare two strings the return value should be 0, for the strings to match over + the entire \code{n} area. + }\\ + \hline + + \code{memCpy} & \code{void memCpy(void* psrc, void* pdest, euint32 size)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function will copy the contents at location \code{psrc} to location \code{pdest} over + a range of \code{size} bytes. + }\\ + \hline + + \code{memClr} & \code{void memClr(void *pdest,euint32 size)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function will set the memory at \code{pdest} to value \code{0x00} for a range of + \code{size} bytes. + }\\ + \hline + + \code{memSet} & \code{void memSet(void *pdest,euint32 size,euint8 data)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function will set the memory at \code{pdest} to value \code{data} for a range of + \code{size} bytes. + }\\ + \hline +\end{longtable} + diff --git a/poc/lpc2148_efsl/docs/pages/preface.tex b/poc/lpc2148_efsl/docs/pages/preface.tex new file mode 100644 index 0000000..6130249 --- /dev/null +++ b/poc/lpc2148_efsl/docs/pages/preface.tex @@ -0,0 +1,31 @@ +\subsection{Project aims} +The EFSL project aims to create a library for filesystems, to be used on +various embedded systems. Currently we support the Microsoft FAT filesystem +family. It is our intention to create pure ANSI C code that compiles on +anything that bears the name 'C compiler'. We don't make assumptions about +endianness or how the memory alignment is arranged on your architecture. +\newline\newline +Adding code for your specific hardware is straightforward, just add code that +fetches or writes a 512 byte sector, and the library will do the rest. +Existing code can be used, writing your own code is only required when you +have hardware for which no target exists. +\subsection{Project status} +Efsl currently supports FAT12, FAT16 and FAT32. Read and write has been tested +and is stable. Efsl runs on PC (GNU/Linux, development environment), +TMS C6000 DSP's from Texas instruments, and ATMega's from Atmel. +You can use this code with as little as 1 kilobyte RAM, however if you have +more at your disposal, an infinite amount can be used as cache memory. +The more memory you commit, the better the performance will be. +\subsection{License} +This project is released under the Lesser General Public license, which +means that you may use the library and it's sourcecode for any purpose you want, +that you may link with it and use it commercially, but that ANY change to the +code must be released under the same license. We would appreciate if you would send +us a patch when you add support for new hardware, but this is not obligatory, since it +falls under linking as far as the LGPL is concerned. +\subsection{Contact} +You can reach us by email:\\ +\begin{tabular}{ll} + Michael De Nil & michael@flex-it.be\\ + Lennart Yseboodt & len@belf.be\\ +\end{tabular} \ No newline at end of file diff --git a/poc/lpc2148_efsl/docs/pages/rmfile.tex b/poc/lpc2148_efsl/docs/pages/rmfile.tex new file mode 100644 index 0000000..cda7a55 --- /dev/null +++ b/poc/lpc2148_efsl/docs/pages/rmfile.tex @@ -0,0 +1,42 @@ +\subsubsection*{Purpose} +Deletes a file. +\subsubsection*{Prototype} +\code{esint16 rmfile(FileSystem *fs,euint8* filename);} +\subsubsection*{Arguments} +Objects passed to \code{rmfile}: +\begin{itemize} + \item{\code{fs}: pointer to the FileSystem object} + \item{\code{filename}: pointer to the path + name of the file to be removed} +\end{itemize} +\subsubsection*{Return value} +Returns 0 if no errors are detected.\\ +\newline +Returns non-zero if an error is detected, most likely that the file does not exist. +\subsubsection*{Note} +If you have opened a file with \code{fopen()}, and you wish to delete it, first +close all instances of that file. If you do not, you may corrupt the filesystem. +\subsubsection*{Example} +\lstset{numbers=left, stepnumber=1, numberstyle=\small, numbersep=5pt, tabsize=4} +\begin{lstlisting} + #include "efs.h" + + void main(void) + { + EmbeddedFileSystem efsl; + + /* Initialize efsl */ + DBG((TXT("Will init efsl now.\n"))); + if(efs_init(&efsl,"/dev/sda")!=0){ + DBG((TXT("Could not initialize filesystem (err \%d).\n"),ret)); + exit(-1); + } + DBG((TXT("Filesystem correctly initialized.\n"))); + + /* Delete some files */ + rmfile(&efsl.myFs,"file0.txt"); + rmfile(&efsl.myFs,"dir0/file0.txt"); + + /* Close filesystem */ + fs_umount(&efsl.myFs); + } +\end{lstlisting} diff --git a/poc/lpc2148_efsl/docs/pages/tms6713.tex b/poc/lpc2148_efsl/docs/pages/tms6713.tex new file mode 100644 index 0000000..17bc124 --- /dev/null +++ b/poc/lpc2148_efsl/docs/pages/tms6713.tex @@ -0,0 +1,98 @@ +This section will tell you everything you need to know to start using the +embedded filesystems library on a TMS Digital Signal Processor from Texas Instruments. +The only thing that is required is that you have a McBSP port available, and that your DSP +support CLOCKSTOP mode, which is required to connect a SPI compatible device. + +There are special DSP's from TI which have a special MMC/SD card controller, if you want to +use this special interface you will have to create a hardware endpoint for it. This section only +describes connecting an SD card to a normal McBSP port, since every TI DSP has at least one of them. + +\subsubsection{Hardware} +Connecting the SD card to the McBSP is straightforward, you will have to make 4 data related +connections, Vcc and ground, resulting in a 6 wire interface.\\ +\begin{tabular}{|l|l|l|l|l|} + \hline + \multicolumn{3}{|c|}{SD Card Interface}&\multicolumn{2}{|c|}{McBSP Interface}\\ + \hline + 1 & CS & Chip select & FSX & Frame Sync Transmit \\ + 2 & MOSI & Master out Slave In & DX & Data transmit \\ + 3 & GND & Supply Ground &&\\ + 4 & Vcc & Supply voltage (3.3 Volt) &&\\ + 5 & Clk & Clock & CLKX & Clock Transmit\\ + 6 & GND & Supply ground &&\\ + 7 & MISO & Master in Slave out & DR & Data receive \\ + 8 & NC & Not connected &&\\ + 9 & NC & Not connected &&\\ + \hline +\end{tabular}\\ +You can optionally pull the DataIn and DataOut lines up to Vcc with a $10k\Omega$ resistor, but +we found that this was not required for operation.\\ +\includegraphics[scale=0.4]{schematics/sdcard.eps}\\ +The frame sync from the McBSP port is used to select the card whenever a databyte has to be transferred, it is connected to the chip select of the SD card. The DX and DR pins are connected to the SDcard's DataIn and DataOut lines respectively. Finally the McBSP will have to generate a clock for +the SDcard so that it can perform operations, this is accomplished by connecting the clock transmit +line of the McBSP port to the CLK pin of the SDCard. + +\subsubsection{McBSP configuration} +\begin{longtable}{|p{0.13\textwidth}|p{0.1\textwidth}|p{0.06\textwidth}|p{0.75\textwidth}|} + + \hline + \multicolumn{4}{|c|}{ + \textbf{McBSP Register Explanations} + } \\ + \hline + \hline + \endfirsthead + + \hline + \multicolumn{4}{|c|}{\textbf{mcbsp registers (continued)}} \\ + \hline + \endhead + \hline + \endfoot + + \hline + \endlastfoot + + \multicolumn{3}{|c|}{SPCR}& + \multicolumn{1}{c|}{Serial Port Control Register}\\ + \hline + Name & Bit & Value &\multicolumn{1}{c|}{Value \code{(0x00001800 | 0x00410001)}}\\ + \hline + RRST&\code{0}&\code{1b} & The serial port receiver is enabled \\ + XRST&\code{16}&\code{1b} & The serial port transmitter is enabled \\ + CLKSTP&\code{12:11}&\code{11b} & Clock starts on falling edge without delay(see CLKXM) \\ + GRST&\code{22}&\code{1b} & Sample rate generator is pulled out of reset \\ + \hline + + \multicolumn{3}{|c|}{PCR}& + \multicolumn{1}{c|}{Pin Control Register}\\ + \hline + Name &Bit & Value &\multicolumn{1}{c|}{Value \code{0x00000A0C}}\\ + \hline + CLKXP&\code{1} &\code{0b} & Transmit data on the rising edge ofthe clock\\ + FSXP&\code{3} &\code{1b} & Frame Sync (Chip select on SD card) is active low\\ + CLKXM&\code{9} &\code{1b} & McBSP is a master in SPI mode and generates the clock based on + the sample rate generator\\ + FSXM&\code{10} &\code{1b} & Frame sync is determined by tge sample rate generator\\ + \hline + + \multicolumn{3}{|c|}{RCR/XCR}& + \multicolumn{1}{c|}{Receive/Transmit Control Register}\\ + \hline + Name &Bit & Value &\multicolumn{1}{c|}{Value \code{0x00010000}}\\ + \hline + RWDLEN&\code{7:5} &\code{000b} & Receive element is 8 bits (1byte) large\\ + XDATDLY&\code{17:16} &\code{01b} & 1 bit data delay (after frame sync)\\ + \hline + + \multicolumn{3}{|c|}{SRGR}& + \multicolumn{1}{c|}{Sample Rate Genrator}\\ + \hline + Name &Bit & Value &\multicolumn{1}{c|}{Value \code{0x20000002}}\\ + \hline + CLKSM&\code{29} &\code{1b} & The sample rate generator clock is derived from the internal clock\\ + FSGM&\code{28} &\code{0b} & The transmit frame sync signal is generated on every DXR to XSR copy\\ + CLKGDV&\code{7:0}&\code{0x02h} & The clock divider\\ + \hline + +\end{longtable} diff --git a/poc/lpc2148_efsl/docs/pages/types.tex b/poc/lpc2148_efsl/docs/pages/types.tex new file mode 100644 index 0000000..d6a4470 --- /dev/null +++ b/poc/lpc2148_efsl/docs/pages/types.tex @@ -0,0 +1,26 @@ +Standard C data types have the annoying tendency to have different sizes on difference compilers +and platforms. Therefore we have created 9 new types that are used everywhere throughout the library. +When you implement your platform you should check if any of the existing one matches your hardware, +or create a new one.\\ +\\ +Here's an overview:\\\\ +\begin{tabular}{|p{4cm}|l|l|} + \hline + \textbf{Type} & \textbf{Size} & \textbf{Signedness}\\ + \hline + \hline + \texttt{eint8} & 1 byte & default to platform \\ + \texttt{esint8} & 1 byte & signed \\ + \texttt{euint8} & 1 byte & unsigned \\ + \hline + \texttt{eint16} & 2 bytes & default to platform \\ + \texttt{esint16} & 2 bytes & signed \\ + \texttt{euint16} & 2 bytes & unsigned \\ + \hline + \texttt{eint32} & 4 bytes & default to platform \\ + \texttt{esint32} & 4 bytes & signed \\ + \texttt{euint32} & 4 bytes & unsigned \\ + \hline +\end{tabular} +$ $\\\\\\ +You will find the relevant code in the file \filename{types.h} in the directory \filename{inc/}. diff --git a/poc/lpc2148_efsl/docs/pages/utils.tex b/poc/lpc2148_efsl/docs/pages/utils.tex new file mode 100644 index 0000000..5757ab0 --- /dev/null +++ b/poc/lpc2148_efsl/docs/pages/utils.tex @@ -0,0 +1,84 @@ +\subsection{Notations} +The utilities can be compiled and run on any POSIX compliant system. +Although not tested on Windows, they should work there as well. In order +to be able to make the utilities, you should have run make in the main directory, +so that an libefsl.a has been made. These utilities link against that library. + +You can run the binaries without arguments to get a short help, which is repeated +here in the 'usage` section of the utilities. + +All utilities take an image, or a device as their first argument. If the image/device +is a partition, and hence does not contain a partition table, it will be recognised and treated +as such. +If a partition table is found, the first partition with a FAT signature will be used. + +Arguments between $<>$ brackets are mandatory, arguments between $[]$ brackets are optional. + + +\subsection{cpo} + \subsubsection*{Usage} + cpo $<$fs$>$ $<$file\_read$>$ $<$local\_write$>$ [bufsize] + \subsubsection*{Operation} + Cpo copies a file residing in a fat filesystem to your local file system. It copies + outwards. The first argument \code{fs} is the image or device on which the source + filesystem resides. The second argument (\code{file\_read} is the path and filename + of the sourcefile in \code{fs}. The third argument (\code{local\_write}) is the + local file to which you want to write the contents. + + The fourth, optional, arguments (\code{bufsize}) says cpo what size of copy buffers + to use. This operates the same as dd. This is used in testing the library, the + default value is 4096 bytes. + +\subsection{cpi} + \subsubsection*{Usage} + cpi $<$fs$>$ $<$local\_read$>$ $<$file\_write$>$ [bufsize] + \subsubsection*{Operation} + Cpi copies a file from your local filesystem to a fat filesystem. It copies inwards. + The first argument \code{fs} is the image or device on which the source + filesystem resides. The second argument (\code{local\_read} is the path and filename + of the sourcefile on your local filesystem. The third argument (\code{file\_write}) is the + path and filename to which you want to write the contents. + + Cpi will bail out when the destination target already exists. + + The fourth, optional, arguments (\code{bufsize}) says cpi what size of copy buffers + to use. This operates the same as dd. This is used in testing the library, the + default value is 4096 bytes. + +\subsection{cpa} + \subsubsection*{Usage} + cpa $<$fs$>$ $<$local\_read$>$ $<$file\_append$>$ [bufsize] + \subsubsection*{Operation} + Cpa copies a file from your local filesystem to a fat filesystem. It copies inwards. + The first argument \code{fs} is the image or device on which the source + filesystem resides. The second argument (\code{local\_read} is the path and filename + of the sourcefile on your local filesystem. The third argument (\code{file\_append}) is the + path and filename to which you want to write the contents. + + Cpa will append to the destination target, or create it if it doesn't exist yet. + + The fourth, optional, arguments (\code{bufsize}) says cpi what size of copy buffers + to use. This operates the same as dd. This is used in testing the library, the + default value is 4096 bytes. + +\subsection{list} + \subsubsection*{Usage} + list $<$fs$>$ $<$directory$>$ + \subsubsection*{Operation} + List will give a listing of existing files on a given filesystem \code{fs}, that + reside in the directory \code{directory}. To get the contents of the root directory, + give a forward slash (/) as the directory argument. + +\subsection{mkdir} + \subsubsection*{Usage} + mkdir $<$fs$>$ $<$dirname$>$ + \subsubsection*{Operation} + Mkdir will create a new directory in the filesystem \code{fs}. You must provide the full path + of the new directory as an argument. + +\subsection{rmfile} + \subsubsection*{Usage} + rmfile $<$fs$>$ $<$filename$>$ + \subsubsection*{Operation} + Rmfile will delete a file from a filesystem \code{fs}. + diff --git a/poc/lpc2148_efsl/docs/pics/sdcard.eps b/poc/lpc2148_efsl/docs/pics/sdcard.eps new file mode 100644 index 0000000..8d4118c --- /dev/null +++ b/poc/lpc2148_efsl/docs/pics/sdcard.eps @@ -0,0 +1,3501 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner +%%Title: sdcard.eps +%%CreationDate: Tue May 24 14:52:01 2005 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 647 607 +%%EndComments +%%BeginPreview: 256 239 1 239 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000015554000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 000000000000000000000000000000a040000000000000000000000000000000 +% 0000000000000000000000000000008010000000000000000000000000000000 +% 0000000000000000000000000000020080000000000000000000000000000000 +% 0000000000000000000000000000004010000000000000000000000000000000 +% 0000000000000000000000000000020000000000000000000000000000000000 +% 000000000000000000000000000000add4000000000000000000000000000000 +% 0000000000000000000000000000000000003000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000040000000000000000000000000000000000 +% 0000000000000000000000000000010254000000000000000000000000000000 +% 0000000000000000000000000000044000000000000000000000000000000000 +% 0000000000000000000000000000010410000000000000000000000000000000 +% 0000000000000000000000000000040010000400000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000040000000000000000000000000000000000 +% 000000000000000000000000001fd555557c0000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000040000000000000000000000000000 +% 0000000000000000000000000005b80000000000000000000000000000000000 +% 00000000000000000000000000000000000400102a1400000000000000000000 +% 0000000000000000000000850801200000000010000c00000000000000000000 +% 0000000000000000000002310401300000040010280400000000000000000000 +% 0000000000000000000000800080080000000012000400000000000000000000 +% 0000000000000000000000020401200001245100a01400000000000000000000 +% 0000000000000000000000000000000000200000000000000000000000000000 +% 0000000000000000040000000000000010240000000000000000000000000000 +% 00000000000000000400000000000152e0200000000000000000000000000000 +% 0000000000000000000000000000000010240020680400000000000000000000 +% 00000000000000000000000000000000002000080a0400000000000000000000 +% 00000000060000a0000000000000000010240000100400000000000000000000 +% 0000000000000a24000000000000000000000032480400000000000000000000 +% 00000000064009a8000400000000000010250000000000000000000000000000 +% 0000000000000082000000000006b56a80048100000000000000000000000000 +% 0000000000080020000400000000000090240000000000000000000000000000 +% 0000000000000000018470000000005880040100000000000000000000000000 +% 0000000000000000000000000001001890240000000000000000000000000000 +% 0000000000000000000440000000400080040100040000000000000000000000 +% 0000000000000d00000040000001916a80240000040000000000000000000000 +% 000000000104a100000440000000000090040100042000000000000000000000 +% 0000000000020100000040000006aaaa80240000444000000000000000000000 +% 0000001001000d00000440000000000010040100040000000000000000000000 +% 0000000000000009024040000000000000240000042000000000000000000000 +% 0000000000000000000040000000000000040100a88000000000000000000000 +% 0000000000000000020000000000000000240000040000000000000000000000 +% 0000003018360401000040000000000010040100a4d000000000000000000000 +% 000000000000a500020040000000000000240000244000000000000000000000 +% 0000000000200000000400000000000010040100848000000000000000000000 +% 0000002000009540020040000000000000240000040000000000000000000000 +% 00000000000000010204000000000000000401012d5000000000000000000000 +% 0000000000000003160040000000000010240000045000000000000000000000 +% 0000000000000000020400000000000000040000040000000000000000000000 +% 0000000000000000020000000000000010240900040000000000000000000000 +% 0000000000000000020440000000000000040000040000000000000000000000 +% 0000000000000001020000000000000010240000040000000000000000000000 +% 0000002000000000420400000000000000040800c40000000000000000000000 +% 000000100000000002000000000000001024010004f000000000000000000000 +% 0000000000000000420440000000000000040800940000000000000000000000 +% 0000000000000000020000000000000000040000040000000000000000000000 +% 0000000000000001420440000000000000000800040400000000200000000000 +% 0000000000000000020000000004008000042000040000000000000000000000 +% 0000ffffd556baab6b76daaaaaad55aa9024a800040000000000000000000000 +% 0000800000000000434040020044480101000018040008001000001800808000 +% 0000800000000000024440020044088800440814040004001000000400808000 +% 000080000000000046404002004448090100a01004000c101000001200818000 +% 00008c0000000000084440020044088800440912040000001000000200808000 +% 000082000000000052404002004448010100a112040020001000401000000000 +% 000000000000000020444003fe7ffbdf556ead56840000001000000200800000 +% 000084000000000042684a9302444db15b7fbfbb56fca0000000401000008000 +% 0000040000000000c061485386644a9922229112040000001000000200800000 +% 00008a0200000001024248130274cc090365ab12040000001000001100000000 +% 000e88000000000242604813864048912a16b1120400b0000000000200800000 +% 00008800000000040254cc13026448118660ab10000000001000001000008000 +% 00008400000000084240489322424c290224a1120000a0001000000200800000 +% 00008502000000100254cd13126548910264a312000001801000001000000000 +% 0000840000000020404048330264cc091265ab10000040201000001200800000 +% 000a84000000006002614813864448912300b9120000a1800000000100000000 +% 00008144045000a06a404c13026448119260ab00000010000000201200800000 +% 000a800000000120c660489322444c2b0254a912000140001000000004800000 +% 00048000000001214244c913126548090264ab10000050021000201200800000 +% 0000800000000123024848130264cc291244ab02000000003000200008800000 +% 80008000000001201241491386644a130268ab1000000d00000000120a800000 +% 000880000000012122424c130254c8131365a912000000418000201004800000 +% 8000800000000121927fcff3fe7fcff9fe7ebf1200000800000000020a800000 +% 0000800000000121024040020040400201400810000000008000001000800000 +% 8000800000000121864040020040480800440802000000000000001200800000 +% 000080000000012002554aa2aa7fcff3fe7fff10000000000000001000800000 +% 8000800000000123024040020040480800400802000000000000201200800000 +% 0000800000000120122a8fe2ea7fcff3fe7fff1000000000000020100a960000 +% 8000800000000123220000000000000000000012000000000000001200800000 +% 000080000000012006000180300201c0100a0810000000000000201004980000 +% 00008000000001230a0801405006010050020412000000001000001200800000 +% 800080000000012002000080200201c010040410000000100000001000800000 +% 8000000000000120aa000100580c01406804100200000011a000001200800000 +% 0000000000000123fe0000c0300201c010080c10000000100000401200800000 +% 8000000000000120000000000000000000000012000000000000001400140000 +% 00000000000001236a1643a83e1b4399a92d6990000000000000001200840000 +% 8000000000000120000c40801413619140a10a91000000000000001200040000 +% 0000000000000120000400e84a0a609028a15948000000000000001000800000 +% 8000000000000120701683485e0b439048c12410000000000000801200000000 +% 00000000000001204012c0000000000000000004800000000000001000800000 +% 8000000000000120300a40000000000000000014820200000001001200000000 +% 0000000000000120700e48000000000000000010080080000000001200800000 +% 8000000000000120000c48000000000000000000400840000000001000000000 +% 0000000000000062080000000000000000000022040100000000001200010000 +% 800000000000002220000000000000000000001e3ffec0000000001200800000 +% 0000000000000062610000000000000000000020000000000002001200810000 +% 8000000000000022400000000000000000000010000000001000001400800000 +% 0000000000000060000000000000000000000020000000001004001000010000 +% 8000000000000020000000000000000000000010000000000004001000000000 +% 0000000000000120000000000000000000000034089155555000001000010000 +% 8000000000000120000000000000000000000014000000000000001000000000 +% 0000000000000120000000000000000000000022000000000000001000010000 +% 8000000000000100000000000000000000000010000000000000001000000000 +% 0000000000000120000000000000000000000022000000000000001000010000 +% 8000000000000100000000000000000000440010000000000000001000000000 +% 0000000000000120000000000000000006920022000000000008001000010000 +% 8000000000000100000000000000000000000010000000000000001000000000 +% 0000000000000120000000000000000000009020000800000008001000010000 +% 80000000000001000000000000000000009084801b4a00000000001000000000 +% 00000000000001200000000000000000044091300a4400000008001000010000 +% 8000000000000100000000000000000000100404000000000000001000010000 +% 0000000000000120000000000000000000000024000000000008001000010000 +% 8000000000000100000000000000000000000014080800000000001e55550000 +% 0000000000000120000000000000000000000020030080000000001200000000 +% 8000000000000100000000000000000000000000184a00000000001200000000 +% 0000000000000120000000000000000000000020000000000000001200000000 +% 8000000000000100000000000000000000000000000000000004001200000000 +% 0000000000000120000000000000000000000020000000000000001200000000 +% 8000000000000100000000000000000000000000000000000000001200000000 +% 0000000000000120000000000000000000000020000000000000001200000000 +% 8000000000000100000000000000000000000000000000000000001200000000 +% 0000000000000120000000000000000000000020000000000000001200000000 +% 8000000000000100000000000000000000000000000000000000001200000000 +% 0000000000000120000000000000000000000020000000000000000200000000 +% 8000000000000100000000000000000000000000000000000000001200000000 +% 000000000000012000000000000000000000002000000000000001be00000000 +% 8000000000000100000000000000000000000000000000000000000000000000 +% 0000000000000120000000000020000000000020000000000000000000000000 +% 8000000000000100000000000000000000000000000000000000000000000000 +% 0000000000000120000000000000000000000020000000000000000000000000 +% 8000000000000100000000000020000000000000000000000000000000000000 +% 0000000000000120000000000000000000000020000000000000000000000000 +% 8000000000000100000000000000000000000000000000000000000404000000 +% 0000000000000120000000000000000000000020000000000000003000000000 +% 8000000000000100000000000000000000000000000000000000000004000000 +% 0000000000000120000000000000000000000020000000000000000000000000 +% 8000000000000100000000000020000000000020000000000000000024000000 +% 0000000000000120000000000000000000000020000000000000003111800000 +% 80000000000001000000000000000000000000000000000000000000b4000000 +% 0000000000000120000000000020000000000020000000000000000000000000 +% 8000000000000100000000000000000000000020000000000000000000000000 +% 0000000000000120000000000000000000000020000000000000000000000000 +% 8000000000000100000000000020000000000020000000000000000000000000 +% 0000000000000020000000000000000000000020000000000000000000000000 +% 8000000000000100000000000000000000000020000000000000000000000000 +% 0000000000000020000000000000000000000020000000000000000000000000 +% 8000000000000100000000000000000000000020000000000000000000000000 +% 0000000000000020000000000000000000000020000000000000000000000000 +% 8000000000000100000000000000000000000020000000000000000000000000 +% 0000000000000020000000000020000000000020000000000000000000000000 +% 8000000000000100000000000000000000000020000000000000000000000000 +% 0000000000000020000000000020000000000020000000000000000000000000 +% 8000000000000100000000000000000000000020000000000000000000000000 +% 0000000000000000000000000020000000000020000000000000000000000000 +% 8000000000000100000000000000000000000020000000000000000000000000 +% 0000000000000000000000000020000000000020000000000000000000000000 +% 8000000000000100000000000000000000000020000000000000000000000000 +% 0000000000000000000000000020000000000020000000000000000000000000 +% 8000000000000100000000000000000000000020000000000000000000000000 +% 0000000000000000000000000020000000000020000000000000000000000000 +% 8000000000000220000000000000000000000020000000000000000000000000 +% 0000000000000100000000000020000000000020000000000000000000000000 +% 8000000000000100000000000000000000000020000000000000000000000000 +% 0000000000000000000000000000000000000020000000000000000000000000 +% 8000000000000200000000000020000000000020000000000000000000000000 +% 0000000000000000000000000000000000000020000000000000000000000000 +% 8000000000000200000000000020000000000020000000000000000000000000 +% 0000000000000000000000000000000000000020000000000000000000000000 +% 8000000000000200000000000020000000000020000000000000000000000000 +% 0000000000000000000000000000000000000020000000000000000000000000 +% 8000000000000200000000000020000000000020000000000000000000000000 +% 0000000000000000000000000020000000000020000000000000000000000000 +% 8000000000000200000000000000000000000020000000000000000000000000 +% 0000000000000000000000000020000000000020000000000000000000000000 +% 8000000000000200000000000020000000000020000000000000000000000000 +% 0000000000000000000000000000000000000020000000000000000000000000 +% 8000000000000200000000000020000000000020000000000000000000000000 +% 0000000000000000000000000000000000000020000000000000000000000000 +% 8000000000000200000000000020000000000020000000000000000000000000 +% 0000000000000000000000000020000000000020000000000000000000000000 +% 8000000000000200000000000020000000000020000000000000000000000000 +% 0000000000000000000000000020000000000020000000000000000000000000 +% 8000000000000200000000000020000000000020000000000000000000000000 +% 0000000000000100000000000020000000000024000000000000000000000000 +% 8000000000000100000000000020000000000024000000000000000000000000 +% 0000000000000070000000000020000000000028000000000000000000000000 +% 800000000000001555556b5555bfffffffffffe0000000000000000000000000 +% 0000000000000000000000000020000000000000000000000000000000000000 +% 8000000000000000000000000020000000000000000000000000000000000000 +% 0000000000000000000000000020000000000000000000000000000000000000 +% 8000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 8000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000020000000000000000000000000000000000000 +% 8000000000000000000000000020000000000000000000000000000000000000 +% 0000000000000000000000000020000000000000000000000000000000000000 +% 8000000000000000000000000020000000000000000000000000000000000000 +% 0000000000000000000000000020000000000000000000000000000000000000 +% 800000000000000000000000002000000000003000006000000000a000000000 +% 0000000000000000000000000020000000000040000001000000020000000000 +% 800000000000000000000000002000000000000d504015609182002000000000 +% 000000000000000000000000002000000000000820c000009100020000000000 +% 8000000000000000000000000020000000000000000000000000000000000000 +% 0000000000000000000000000020000000000000000000000000000000000000 +% 8000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 8000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 8000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 8000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 8000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 8000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +%%EndPreview +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228346456694 14.173228346456694 translate +% Translate to begin of first scanline +0 592 translate +631.99999999999989 -592 scale +% Image geometry +632 592 8 +% Transformation matrix +[ 632 0 0 592 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 632 string def +/gstr 632 string def +/bstr 632 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 180734 ASCII Bytes +colorimage +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$qYpSKeUdaOs-!D4~> +JcC<$qYpSIeq*jPs-!D4~> +JcC<$qYpSKeUdaOs-!D4~> +JcC<$qYpSKXF^D&s-!D4~> +JcC<$qYpSIWe(2$s-!D4~> +JcC<$qYpSKXF^D&s-!D4~> +JcC<$qYpSKXF^D&s-!D4~> +JcC<$qYpSIWe(2$s-!D4~> +JcC<$qYpSKXF^D&s-!D4~> +JcC<$qYpSKXQKN_^&.j0^&%a/KD#6O^&S,GK@RZKs8Tc`s+14#s*t~> +JcC<$qYpSIWoj<]^AIs1^A@j0JbB$M^An5IJ_%QLs8Tfas+14#s*t~> +JcC<$qYpSKXQKN_^&.j0^&%a/KD#6O^&S,GK@RZKs8Tc`s+14#s*t~> +JcC<$qYpSKXQKN_!8E/+6%T&es474#~> +JcC<$qYpSIWoj<]!8E))5_8rds474#~> +JcC<$qYpSKXQKN_!8E/+6%T&es474#~> +JcC<$qYpSKXQKN_KA->*!.k0$s474#~> +JcC<$qYpSIWoj<]J_L,(!.k0$s474#~> +JcC<$qYpSKXQKN_KA->*!.k0$s474#~> +JcC<$qYpSKXQKN_KA->*!.k0$s474#~> +JcC<$qYpSIWoj<]J_L,(!.k0$s474#~> +JcC<$qYpSKXQKN_KA->*!.k0$s474#~> +JcC<$qYpSKXQKN_KA->*!.k0$s474#~> +JcC<$qYpSIWoj<]J_L,(!.k0$s474#~> +JcC<$qYpSKXQKN_KA->*!.k0$s474#~> +JcC<$qYpSKXQKN_KDkfQK)e2iXS2Yp]i+f]!knWIr.>!_rVlitJcC<$f)L7~> +JcC<$qYpSIWoj<]Jc5TOJH.rdWqQGn^/b,_!l"]Kr.+j^rVlitJcC<$f)L7~> +JcC<$qYpSKXQKN_KDkfQK)e2iXS2Yp]i+f]!knWIr.>!_rVlitJcC<$f)L7~> +JcC<$qYpSKXQKN_KDtlO6,!9t!JA)Vrr`>8s+>t!rr<%Ms+14$s*t~> +JcC<$qYpSIWoj<]Jc>ZM5ed6t!J.uUrr`>9s+,arrr<%Ms+14$s*t~> +JcC<$qYpSKXQKN_KDtlO6,!9t!JA)Vrr`>8s+>t!rr<%Ms+14$s*t~> +JcC<$qYpSKXQKN_KDtlN!;uis61Y$YKE(t(KD>HHK7X&Rs474#~> +JcC<$qYpSIWoj<]Jc>ZL!;uis5k=pXJcGb$Jb]6FJV!iPs474#~> +JcC<$qYpSKXQKN_KDtlN!;uis61Y$YKE(t(KD>HHK7X&Rs474#~> +JcC<$qYpSKXQKN_KDtlO6,!9t!NZ:mrr>@arrIa +JcC<$qYpSIWoj<]Jc>ZM5ed6t!NH.krr>=`rrI[9rdjtH!!%TMJcF=$J,~> +JcC<$qYpSKXQKN_KDtlO6,!9t!NZ:mrr>@arrIa +JcC<$qYpSKe`Ql3KDkfR!/%t;!($5V!($S`!58Aa!E-W0rr<%Ms+14$s*t~> +JcC<$qYpSIf&lu4Jc5TP!.hk8!'p/U!'pM_!5AG`!EHl4rr<%Ms+14$s*t~> +JcC<$qYpSKe`Ql3KDkfR!/%t;!($5V!($S`!58Aa!E-W0rr<%Ms+14$s*t~> +JcC<$qYpSKe`Zu4KDb`P]n=#u61k0X6,!*o!S'L7rr<%Ms+14$s*t~> +JcC<$qYpSIf'!)5Jc,NN^4F#u5kP'W5ed'o!S0O7rr<%Ms+14$s*t~> +JcC<$qYpSKe`Zu4KDb`P]n=#u61k0X6,!*o!S'L7rr<%Ms+14$s*t~> +JcC<$qYpSKe`Zu4KDGNJeH#:B!PLenrr<&trr>?9s+14$s*t~> +JcC<$qYpSIf'!)5JbfCC!PUhnrr<&trr><8s+14$s*t~> +JcC<$qYpSKe`Zu4KDGNJeH#:B!PLenrr<&trr>?9s+14$s*t~> +JcC<$qYpSKXQTW`KDGNJ;QTQk!@cRorrM72rVljHJcC<$f)L7~> +JcC<$qYpSIWosE^Jbf`l!@ZOorrM+-rVljGJcC<$f)L7~> +JcC<$qYpSKXQTW`KDGNJ;QTQk!@cRorrM72rVljHJcC<$f)L7~> +JcC<$qYpSKXQTW`KDkfQ]g78NXSi)!K>%0^!/(4L"hd2fK7bWNrr@\&s+14$s*t~> +JcC<$qYpSIWosE^Jc5TO^-I5LWr2ktJ\M$]!.k(J"hm5eJUo6Irr@V$s+14$s*t~> +JcC<$qYpSKXQTW`KDkfQ]g78NXSi)!K>%0^!/(4L"hd2fK7bWNrr@\&s+14$s*t~> +JcC<$qYpSKXQTW`KAun3K>%0^!/#k&JcF=$J,~> +JcC<$qYpSIWosE^J`?\1J\M$]!.f_$JcF=$J,~> +JcC<$qYpSKXQTW`KAun3K>%0^!/#k&JcF=$J,~> +JcC<$qYpSKXQTTa]n>&=!/#k&JcF=$J,~> +JcC<$qYpSIWosB_^4G# +JcC<$qYpSKXQTTa]n>&=!/#k&JcF=$J,~> +JcC<$qYpSKXQTW`KA->*K7X&Rs474#~> +JcC<$qYpSIWosE^J_L,(JV!iPs474#~> +JcC<$qYpSKXQTW`KA->*K7X&Rs474#~> +JcC<$qYpSKXQTTcK0b.'h>[MhK7X&Rs474#~> +JcC<$qYpSIWosBaJO"e#h>[MiJV!iPs474#~> +JcC<$qYpSKXQTTcK0b.'h>[MhK7X&Rs474#~> +JcC<$qYpSKe`Qo%K)e4:K)e4:KDn17K*">k;Z24K!57=j!53s`JcGNFJ,~> +JcC<$qYpSIf&m#&JH.t7JH.t7Jc7q4JHA)f +JcC<$qYpSKe`Qo%K)e4:K)e4:KDn17K*">k;Z24K!57=j!53s`JcGNFJ,~> +JcC<$qYp\N;M0TfrVuparVll!ir9"lci +JcC<$qYp\L +JcC<$qYp\N;M0TfrVuparVll!ir9"lci +JcC<$qYpPJq#Ku +JcC<$qYpPHq#Ku:!WYJcp433Dl[]':5lQ<9!'ig+!!'`as+14Gs*t~> +JcC<$qYpPJq#Ku +JcC<$qYpSKXSi(u]rD&3!<7ZSXT,s6]n-37s7u\F~> +JcC<$qYpSIWr2ks^8_/4!<7TQWrKd5^4H<8s7u\F~> +JcC<$qYpSKXSi(u]rD&3!<7ZSXT,s6]n-37s7u\F~> +JcC<$qYpSKXIT:jK7X&Rs7lVE~> +JcC<$qYpSIWgs(hJV!iPs7lVE~> +JcC<$qYpSKXIT:jK7X&Rs7lVE~> +JcC<$qYpSKXIT:j6%T&es7lVE~> +JcC<$qYpSIWgs(h5_8rds7lVE~> +JcC<$qYpSKXIT:j6%T&es7lVE~> +JcC<$qYpSKXR#leeLC8ks+C8J!N^qCXT*nSXG^!2rrFS!JcC<$q>Ys~> +JcC<$qYpSIWpBZcegU;ns+1,K!NL_?WrIVOWf:$5rrFP!JcC<$q>Ys~> +JcC<$qYpSKXR#leeLC8ks+C8J!N^qCXT*nSXG^!2rrFS!JcC<$q>Ys~> +JcC<$qYpQ/lMpm:g]%7>g]%6RJcC<$q#>j~> +JcC<$qYpQ0lMpm8g]%7=g]%6RJcC<$q#>j~> +JcC<$qYpQ/lMpm:g]%7>g]%6RJcC<$q#>j~> +JcC<$irB%2g]%8+g]%6RJcC<$q#>j~> +JcC<$irB%0g]%8)g]%6RJcC<$q#>j~> +JcC<$irB%2g]%8+g]%6RJcC<$q#>j~> +JcC<$qYpQ/lMpm:g]%8+g]%6RJcC<$q#>j~> +JcC<$qYpQ0lMpm8g]%8)g]%6RJcC<$q#>j~> +JcC<$qYpQ/lMpm:g]%8+g]%6RJcC<$q#>j~> +JcC<$qYpSKea*88KDkiKK)iUWs8R]O^&J'0K)kt)rr<"Nh#@@?JcC<$q#>j~> +JcC<$qYpSIf'EA9Jc5WIJH3FVs8RWM^Ae01JH5b%rr<"Lh#@@>JcC<$q#>j~> +JcC<$qYpSKea*88KDkiKK)iUWs8R]O^&J'0K)kt)rr<"Nh#@@?JcC<$q#>j~> +JcC<$qYpSKXR#odKDtlS6%f3NK)kWF%)"s?]g:3KrrBb4]tO@Ds+B,,!'u29JcGNFJ,~> +JcC<$qYpSIWpB]bJc>ZQ5_8sLJH5ED%),!@^-L9LrrBe5^:sOFs+/u*!'l,8JcGNFJ,~> +JcC<$qYpSKXR#odKDtlS6%f3NK)kWF%)"s?]g:3KrrBb4]tO@Ds+B,,!'u29JcGNFJ,~> +JcC<$qYpSKea*88KE(uOKDkiMKD5BG62gfcKE(rOq#:AI^"iVf!.k0$s7lVE~> +JcC<$qYpSIf'EA9JcGcMJc5WKJbT0E5lL]bJcG`Mq#:AG^>/_g!.k0$s7lVE~> +JcC<$qYpSKea*88KE(uOKDkiMKD5BG62gfcKE(rOq#:AI^"iVf!.k0$s7lVE~> +JcC<$irB%2rr2sarVlj`p\t9-!<)p"KE(rOq#CAHh#@?SJcC<$q#>j~> +JcC<$irB%0rr2s`rVlj_p\t9.!<)p"JcG`Mq#CAFh#@?SJcC<$q#>j~> +JcC<$irB%2rr2sarVlj`p\t9-!<)p"KE(rOq#CAHh#@?SJcC<$q#>j~> +JcC<$irB%2rr3.S!/#n(KD5EGKDkfPXM+YIr.FtJ!JA)@rrE,5JcC<$q>Ys~> +JcC<$irB%0rr3.Q!.f\$JbT3EJc5TNWkSMIr.4hH!J.u?rrE,6JcC<$q>Ys~> +JcC<$irB%2rr3.S!/#n(KD5EGKDkfPXM+YIr.FtJ!JA)@rrE,5JcC<$q>Ys~> +JcC<$qYpQ/lMpm:rr3-%KE(tb!;HNnKDkfNXFpEM!PLeurr@]+rrE,5JcC<$q>Ys~> +JcC<$qYpQ0lMpm8rr3-%JcGba!;HNnJc5TLWe('I!PUhurr@W)rrE,6JcC<$q>Ys~> +JcC<$qYpQ/lMpm:rr3-%KE(tb!;HNnKDkfNXFpEM!PLeurr@]+rrE,5JcC<$q>Ys~> +JcC<$qYpSKXR#odKE(rP]n?:`s+C+H!PLetrr>smrr<&urr@]+rr>?9s+14Fs*t~> +JcC<$qYpSIWpB]bJcG`N^4H7_s+0tF!PUhtrr?'prr<&urr@W)rr><8s+14Fs*t~> +JcC<$qYpSKXR#odKE(rP]n?:`s+C+H!PLetrr>smrr<&urr@]+rr>?9s+14Fs*t~> +JcC<$qYpSKXR#odKE(rP]n?:`!JA)[rr>@`rr@]Irr>@arr@]+rrGEYs~> +JcC<$qYpSIWpB]bJcG`N^4H7_!J.uZrr>=_rr@WGrr>=`rr@W)rrGB9JcC<$q>Ys~> +JcC<$qYpSKXR#odKE(rP]n?:`!JA)[rr>@`rr@]Irr>@arr@]+rrGEYs~> +JcC<$qYpSKXR#odKDtlS!/%tuK0fG8!/(4L$,&X +JcC<$qYpSIWpB]bJc>ZQ!.hkuJO'/5!.k(J$,/[=s$2/8s+.o`rrI\brr2tLg]%9S^4H<8s7u\F~> +JcC<$qYpSKXR#odKDtlS!/%tuK0fG8!/(4L$,&X +JcC<$qYpSKXR#odKDkfMec)ZIrrB.ss8T/#ec,RPeZ;YHXO[:L!/'&+!!%TMJcGNFJ,~> +JcC<$qYpSIWpB]bJc5TKf)D]HrrB(qs8T)!f)G[QeuD_MWn..K!.io)!!%TMJcGNFJ,~> +JcC<$qYpSKXR#odKDkfMec)ZIrrB.ss8T/#ec,RPeZ;YHXO[:L!/'&+!!%TMJcGNFJ,~> +JcC<$qYpSKXR#odKA6D+KA6D+!.k0$s7lVE~> +JcC<$qYpSIWpB]bJ_U2)J_U2)!.k0$s7lVE~> +JcC<$qYpSKXR#odKA6D+KA6D+!.k0$s7lVE~> +JcC<$qYpSKea*88KA6D+6/2D?!/#k&JcGQGJ,~> +JcC<$qYpSIf'EA9J_U2)5hl;>!.f_$JcGQGJ,~> +JcC<$qYpSKea*88KA6D+6/2D?!/#k&JcGQGJ,~> +JcC<$qYpSKea*88KA6D+!8IMR!.k0$s7lVE~> +JcC<$qYpSIf'EA9J_U2)!8IMR!.k0$s7lVE~> +JcC<$qYpSKea*88KA6D+!8IMR!.k0$s7lVE~> +JcC<$qYpSKea*58^$,LsKDkiN62gid5lcO'r;bUP!'u29JcGNFJ,~> +JcC<$qYpSIf'E>9^?GUtJc5WL5lL`c5QH@#r;bUP!'l,8JcGNFJ,~> +JcC<$qYpSKea*58^$,LsKDkiN62gid5lcO'r;bUP!'u29JcGNFJ,~> +JcC<$qZ$SJ!<<"M"@7\?s1Q5J!kj5=r;QbLnG`K@JcC<$q#>j~> +JcC<$qZ$SH!<<"K"@.PJcC<$q#>j~> +JcC<$qZ$SJ!<<"M"@7\?s1Q5J!kj5=r;QbLnG`K@JcC<$q#>j~> +JcC<$qYpPJq#LF\rr<:V!!*&4]n8WFK)e4:K)e3iK)e48!<7ZO!:^!g6%T&es7lVE~> +JcC<$qYpPHq#LF[rr<:T!!*&5^4AQDJH.t7JH.sfJH.t5!<7TM!:^!g5_8rds7lVE~> +JcC<$qYpPJq#LF\rr<:V!!*&4]n8WFK)e4:K)e3iK)e48!<7ZO!:^!g6%T&es7lVE~> +JcC<$qYpYMXT/>!K)iU"rrTm8KDkiN62lK:!:^!g!.k0$s7lVE~> +JcC<$qYpYKWrN+tJH3F!rrTp7Jc5WL5lQ<7!:^!g!.k0$s7lVE~> +JcC<$qYpYMXT/>!K)iU"rrTm8KDkiN62lK:!:^!g!.k0$s7lVE~> +JcC<$qYpPJXoABRnG`IgJcC<$q#>j~> +JcC<$qYpPHXoABPnG`IgJcC<$q#>j~> +JcC<$qYpPJXoABRnG`IgJcC<$q#>j~> +JcC<$qYpSKeZSoPKCJm@!.k0$s7lVE~> +JcC<$qYpSIeuo#QJai[>!.k0$s7lVE~> +JcC<$qYpSKeZSoPKCJm@!.k0$s7lVE~> +JcC<$qYpSKXKMR'KCJm@!.k0$s7lVE~> +JcC<$qYpSIWil@%Jai[>!.k0$s7lVE~> +JcC<$qYpSKXKMR'KCJm@!.k0$s7lVE~> +JcC<$qYpSKXKMR'KCJm@6%T&es7lVE~> +JcC<$qYpSIWil@%Jai[>5_8rds7lVE~> +JcC<$qYpSKXKMR'KCJm@6%T&es7lVE~> +JcC<$qYpSKk-"^aKCJm@!.k0$s7lVE~> +JcC<$qYpSIii`:]Jai[>!.k0$s7lVE~> +JcC<$qYpSKk-"^aKCJm@!.k0$s7lVE~> +JcC<$qYpbPec5XL!($O8!^S78rdt1Nre(5:s+:>$6-0'+KCJm@!.k0$s7lVE~> +JcC<$qYpbNf)PaM!'pI5!^J.6rdb%Lrdk)7s+(2!5fis*Jai[>!.k0$s7lVE~> +JcC<$qYpbPec5XL!($O8!^S78rdt1Nre(5:s+:>$6-0'+KCJm@!.k0$s7lVE~> +JcC<$qYp\Nec5Y8li-qbaSu6mnG`JSoDej(nc&U&rVll2r;Qc1rr3)6K7gl4rrB``s0_lW~> +JcC<$qYp\Lf)Pb8li-qbaSu6knG`JRoDej)nc&U'rVll3r;Qc2rr3)7JUtQ1rrBcas0_lW~> +JcC<$qYp\Nec5Y8li-qbaSu6mnG`JSoDej(nc&U&rVll2r;Qc1rr3)6K7gl4rrB``s0_lW~> +JcC<$qYpPJrr2ruli-qbaSu6mnG`K@oDegjo)J_UrVllu^&J$4]`A$2!J<]:rrGE +JcC<$qYpPHrr2ruli-qbaSu6knG`K>oDegjo)J_TrVllu^Ae-5^&\-3!J*N7rrGB9rVlitJcE.X +J,~> +JcC<$qYpPJrr2ruli-qbaSu6mnG`K@oDegjo)J_UrVllu^&J$4]`A$2!J<]:rrGE +JcC<$qYpPJrr2ruli-qbaSu6mnG`IgoD\j)!:p-j]n?:`s$?Ya!J:CNs8R`MrrPId^&J$3!.k0X +s*t~> +JcC<$qYpPHrr2ruli-qbaSu6knG`IgoD\j*!:p-j^4H7_s$6S`!J(7Ls8RZKrrPFc^Ae-4!.k0X +s*t~> +JcC<$qYpPJrr2ruli-qbaSu6mnG`IgoD\j)!:p-j]n?:`s$?Ya!J:CNs8R`MrrPId^&J$3!.k0X +s*t~> +JcDhO"2-,`KCo3B!!%ZFrr>@_!!'_,rr@]Nrr<&ls8.HIrr<&?rr@]@rr<&irr@]Arr@]Mrs")U +KE(rO!<)rtKDkfO62s7Mrr<%Ms0_lW~> +JcDhO"26/`Jb9!@!!%TDrr>=^!!'b-rr@WLrr<&ls8.BGrr<&?rr@W>rr<&irr@W?rr@WKrs"#S +JcG`M!<)rtJc5TM5lX+Krr<%Ms0_lW~> +JcDhO"2-,`KCo3B!!%ZFrr>@_!!'_,rr@]Nrr<&ls8.HIrr<&?rr@]@rr<&irr@]Arr@]Mrs")U +KE(rO!<)rtKDkfO62s7Mrr<%Ms0_lW~> +JcDkP"hd5%s+:=FrrE,5rr +JcDkP"hm8%s+(1DrrE,6rr +JcDkP"hd5%s+:=FrrE,5rr +JcDkP!/'hA!58=1!!)cn!!)Qh!/(:N!($M^!C;A;s8R`Hrr<&?rr@]@rr<&irr<&hrr@]Mrs",U +K)e4;KDkiMKDkfS!<<(OKDtq&s0_lW~> +JcDkP!.j\?!5AC2!!)cn!!)Qh!.k.L!'pG]!C258s8RZFrr<&?rr@W>rr<&irr<&hrr@WKrs"&S +JH.t8Jc5WKJc5TQ!<<(MJc>_$s0_lW~> +JcDkP!/'hA!58=1!!)cn!!)Qh!/(:N!($M^!C;A;s8R`Hrr<&?rr@]@rr<&irr<&hrr@]Mrs",U +K)e4;KDkiMKDkfS!<<(OKDtq&s0_lW~> +JcDkP!/(+I!58C3!/(+I!PO-[rrE+PqYpQ/rIY3cs8N)urr>@^s8R`NrrIa +JcDkP!.jtG!5AI4!.jtG!PX-ZrrE+NqYpQ0rIG'bs8N)urr>=]s8RZLrrI[9q#: +JcDkP!/(+I!58C3!/(+I!PO-[rrE+PqYpQ/rIY3cs8N)urr>@^s8R`NrrIa +JcDkPrIY*`rVunM!rkPPqYpW1!58.,!58Aa!<@cGrr<&urr<&rs8R`Nrs$/&!'pSb^&@s2!6G0? +KCJm@!:p-i!:g'hKDkfM!;uisKDkiMKDkfM!<)ou.0+r![Jta~> +JcDkPrIFs_rVunK!rkMNqYpW2!5A4-!5AG`!<@]Err<&urr<&rs8RZLrs$2&!'gMa^A\'3!6G0? +Jai[>!:p-i!:g'hJc5TK!;uisJc5WKJc5TK!<)ou-iehu[Jta~> +JcDkPrIY*`rVunM!rkPPqYpW1!58.,!58Aa!<@cGrr<&urr<&rs8R`Nrs$/&!'pSb^&@s2!6G0? +KCJm@!:p-i!:g'hKDkfM!;uisKDkiMKDkfM!<)ou.0+r![Jta~> +JcDkP#(o4C]n6HI6,!9t!!(+?!/'e@!($5V +!J:CKrr@]JrrKf!rVlkMr;QbLrVunMrVlitrVlnN!.k0Xs*t~> +JcDkP#(]%>^4?9urr3$b!.k%I!eC?cnG`N?^A%X-Jc>ZL5l:T]Jb]6G5ed6t!!(+?!.jY>!'p/U +!J(7Irr@WHrrKi!rVlkKr;QbJrVunKrVlitrVlnL!.k0Xs*t~> +JcDkP#(o4C]n6HI6,!9t!!(+?!/'e@!($5V +!J:CKrr@]JrrKf!rVlkMr;QbLrVunMrVlitrVlnN!.k0Xs*t~> +JcDkP!JA)bs8R`NrrI`Pqu6[_KC8a?XFpNPrIb+L!!*#u!!)ors+C+H!J<];rr<&?rr@]@rr@]C +s8R]O^&.g0KDPWJK)iU[rrBb2s8N'!^&J$3KDb`L6%T'Ds*t~> +JcDkP!J.uas8RZLrrIZNqu6[^JaWO=We(0LrIOtJ!!*#u!!)ors+0tF!J*N8rr<&?rr@W>rr@WA +s8RWM^AIp1JboEHJH3FZrrBe3s8N'!^Ae-4Jc,NJ5_8sCs*t~> +JcDkP!JA)bs8R`NrrI`Pqu6[_KC8a?XFpNPrIb+L!!*#u!!)ors+C+H!J<];rr<&?rr@]@rr@]C +s8R]O^&.g0KDPWJK)iU[rrBb2s8N'!^&J$3KDb`L6%T'Ds*t~> +JcDkP!JA)bs8R`NrrPK=62gfaK0eo)!N^qJrr>@arr<&rs8R`HrrKfcrr2rufDbl(^&7m1KDPTJ +KDPTJKD>HH6%T&es7lVE~> +JcDkP!J.uas8RZLrrPH:5lL]`JO&W&!NL_Frr>=`rr<&rs8RZFrrKibrr2rufDbl&^AS!2JboBH +JboBHJb]6F5_8rds7lVE~> +JcDkP!JA)bs8R`NrrPK=62gfaK0eo)!N^qJrr>@arr<&rs8R`HrrKfcrr2rufDbl(^&7m1KDPTJ +KDPTJKD>HH6%T&es7lVE~> +JcDkP%Fn@7XK5=Ms8T1%s+@EPrr<&sX8pfLrrB.urrLZ&ri?*XpAY-Crr2sIr;QlL;GuZVrr@]M +X9!t(rr2ruf`(r(r;cgp!!*!r%"hHZeL=CK;M3O";?6Yn#:TWQ.>''IK>XbjeUdb2s*t~> +JcDkP%G"O=WiB(Ms8T+!s+.3Lrr<&sWW:WKrrB(srrL]%ri,sXpAY-Drr2sHr;QlM +JcDkP%Fn@7XK5=Ms8T1%s+@EPrr<&sX8pfLrrB.urrLZ&ri?*XpAY-Crr2sIr;QlL;GuZVrr@]M +X9!t(rr2ruf`(r(r;cgp!!*!r%"hHZeL=CK;M3O";?6Yn#:TWQ.>''IK>XbjeUdb2s*t~> +JcDbM!/'qDrk8;`!58(*s+Bh@!/(4L"20>>ec#OIK)iU_rr<&OrrBb2K*/geeH#IG!/(.J!!)hI +!WN/us8R`O]aobG]n??u^&PcuK>%;;]tO;q!588^!rordqu6`!]tOFF!58&XJcE:\J,~> +JcDbM!.jeBrkAA_!5A.+s+0\>!.k(J"29>;f)>XJJH3F^rr<&OrrBe3JHNXdec>RH!.k"H!!)hG +!WN/us8RZM^(5eG^4H]!roucqu6_t^:sUH!5A,WJcE:\J,~> +JcDbM!/'qDrk8;`!58(*s+Bh@!/(4L"20>>ec#OIK)iU_rr<&OrrBb2K*/geeH#IG!/(.J!!)hI +!WN/us8R`O]aobG]n??u^&PcuK>%;;]tO;q!588^!rordqu6`!]tOFF!58&XJcE:\J,~> +JcC<$qYpQ/rr2tNli-qbd/O(GqYpPJqYpNqq#:>HJcC<$q#>j~> +JcC<$qYpQ0rr2tLli-qbd/O(GqYpPHqYpNqq#:>FJcC<$q#>j~> +JcC<$qYpQ/rr2tNli-qbd/O(GqYpPJqYpNqq#:>HJcC<$q#>j~> +JcC<$qYpZuXT/j~> +JcC<$qYpZuWrN*Mli-qbd/O(GqYpPHqYpNqq#:=ZJcC<$q#>j~> +JcC<$qYpZuXT/j~> +JcC<$qYpNqrr2sali-qbd/O(GqYpPJqYpNqq#:=[JcC<$q#>j~> +JcC<$qYpNqrr2s`li-qbd/O(GqYpPHqYpNqq#:=ZJcC<$q#>j~> +JcC<$qYpNqrr2sali-qbd/O(GqYpPJqYpNqq#:=[JcC<$q#>j~> +JcFR+!7d_A!/(:N"bT*n!'rpL!!PZ@!'u6'r;ZpcK2R?Krr<&qrr@]Jrr<&orr@\&s+14Fs*t~> +JcFR+!7meB!.k.L"bApi!'igJ!!PW=!'l*#r;ZpbJQ79Jrr<&qrr@WHrr<&orr@V$s+14Fs*t~> +JcFR+!7d_A!/(:N"bT*n!'rpL!!PZ@!'u6'r;ZpcK2R?Krr<&qrr@]Jrr<&orr@\&s+14Fs*t~> +JcFR+!@e'JK*+C>!53s`o`"sBKDY]KKCSsA!;c]qKDPTJ!;QQoK7X&Rs7lVE~> +JcFR+!@\!IJHJ.;!5=$ao`"sCJc#KIJara?!;c]qJboBH!;QQoJV!iPs7lVE~> +JcFR+!@e'JK*+C>!53s`o`"sBKDY]KKCSsA!;c]qKDPTJ!;QQoK7X&Rs7lVE~> +JcFR+q#CC\pO`H3r;Zg`gAh4>rVupapAb1ZpAb7\!/'eAs$?Va#=3up!'u6i60*Xu.Js/J6%]/i +nc&RhqYpPJqYpNqq#:j~> +JcFR+q#CC[pON<0r;Zg_gAh4=rVup`pAb1YpAb7[!.jY?s$6P`#=*ik!'l*d5idIr./X&I5_/od +nc&RhqYpPHqYpNqq#:j~> +JcFR+q#CC\pO`H3r;Zg`gAh4>rVupapAb1ZpAb7\!/'eAs$?Va#=3up!'u6i60*Xu.Js/J6%]/i +nc&RhqYpPJqYpNqq#:j~> +JcFR+!%IpI!58AaVZ-Yse`Zr4^& +JcFR+!%@jH!5AG`VZ-Ysf'!&5^AWTe^Aib8s+.o_JcEFfJ\H^8^/b(2"$hE&Jara?!;c]qJboBH +!;QQo5_8rds7lVE~> +JcFR+!%IpI!58AaVZ-Yse`Zr4^& +JcFR+!)fHh!("p1!58:0s+BkA!!)lq!/(.J!!)fo!/#k&JcGNFJ,~> +JcFR+!*,Zk!'nj0!5A@1s+0_?!!)lq!.k"H!!)fo!.f_$JcGNFJ,~> +JcFR+!)fHh!("p1!58:0s+BkA!!)lq!/(.J!!)fo!/#k&JcGNFJ,~> +JcFR+!)fHh!("[*s+BkA!($J]!/(.J!!)fo!/#k&JcGNFJ,~> +JcFR+!*,Zk!'nU)s+0_?!'pD\!.k"H!!)fo!.f_$JcGNFJ,~> +JcFR+!)fHh!("[*s+BkA!($J]!/(.J!!)fo!/#k&JcGNFJ,~> +JcFR+!)fHh!!((>s+BkA!!)lq!/(.J!!)fo!/'qD"9=(f!58++#e^4jK)i"Qs$?S_!($Va"2+[7 +^&J$3KDb`LK7X'1s*t~> +JcFR+!*,Zk!!((>s+0_?!!)lq!.k"H!!)fo!.jeB"9="e!5A1,#eg:iJH2_Ms$6M^!'pP`"24a8 +^Ae-4Jc,NJJV!j/s*t~> +JcFR+!)fHh!!((>s+BkA!!)lq!/(.J!!)fo!/'qD"9=(f!58++#e^4jK)i"Qs$?S_!($Va"2+[7 +^&J$3KDb`LK7X'1s*t~> +JcFR+!)fHh!!((>s+BkA!%IdE!/(.J!!)fo!/'tE"tA+&s4&RKq#:BF;Z6UuXO[=N;Z?[s;?6[q +s+C:M!WX\"rr2ruJcE.XJ,~> +JcFR+!*,Zk!!((>s+0_?!%@^D!.k"H!!)fo!.jhC"t8(&s4/ULq#:BG +JcFR+!)fHh!!((>s+BkA!%IdE!/(.J!!)fo!/'tE"tA+&s4&RKq#:BF;Z6UuXO[=N;Z?[s;?6[q +s+C:M!WX\"rr2ruJcE.XJ,~> +JcFR+!)fHh!!((>s+BkA!/(.J!/(.J!!)fo!/("F!PO-as8R`HrrKf!rVm2*KE"5'KE&VN62gi` +KDkfS!<5?us8N(Ms0_lW~> +JcFR+!*,Zk!!((>s+0_?!.k"H!.k"H!!)fo!.jkD!PX-`s8RZFrrKi!rVm2(Jc@u#JcEGL5lL`_ +Jc5TQ!<5 +JcFR+!)fHh!!((>s+BkA!/(.J!/(.J!!)fo!/("F!PO-as8R`HrrKf!rVm2*KE"5'KE&VN62gi` +KDkfS!<5?us8N(Ms0_lW~> +JcFR+!)fHh!!((>s+BkA!/(.J!/(.J!($D[!/("F!JA)as8R`Grr>@`K*`uZs+C>;K)koOrVunM +rVm'%s8Te4rr@WM[Jta~> +JcFR+!*,Zk!!((>s+0_?!.k"H!.k"H!'p>Z!.jkD!J.u`s8RZErr>=_JI*`Us+128JH5]MrVunK +rVm'%s8Th5rr@WM[Jta~> +JcFR+!)fHh!!((>s+BkA!/(.J!/(.J!($D[!/("F!JA)as8R`Grr>@`K*`uZs+C>;K)koOrVunM +rVm'%s8Te4rr@WM[Jta~> +JcFR+!)fHh!!((>s+BkA!/(.J!/(.J!!)fo!/("Fs+C:Ms+C%F%D@CH]rZkdKE&Ub^&LCss8R`M +rrrK's1Q,G!.k0Xs*t~> +JcFR+!*,Zk!!((>s+0_?!.k"H!.k"H!!)fo!.jkDs+1.Ks+0nD%DICE^8cbaJcEFa^AgIss8RZK +rrrK's1Z5I!.k0Xs*t~> +JcFR+!)fHh!!((>s+BkA!/(.J!/(.J!!)fo!/("Fs+C:Ms+C%F%D@CH]rZkdKE&Ub^&LCss8R`M +rrrK's1Q,G!.k0Xs*t~> +W;d%O5la1N61k0X]`@R%!/(:Ns+C:M!PLeurrRfQ62plb]g;Vs!581-!)fHh!!((>s+BkA!!)lq +!/(.J!!)fo!/("F!PLetrrGE +W;d%P5QF%L5kP'W^&[[&!.k.Ls+1.K!PUhurrR`O5lUca^-MYs!5A7.!*,Zk!!((>s+0_?!!)lq +!.k"H!!)fo!.jkD!PUhtrrGB9o)B#rJcC<$s1\O5Jc5WKJc5TK!<3!"JZ8^$s0_lW~> +W;d%O5la1N61k0X]`@R%!/(:Ns+C:M!PLeurrRfQ62plb]g;Vs!581-!)fHh!!((>s+BkA!!)lq +!/(.J!!)fo!/("F!PLetrrGE +W;lmMrr3"O^%MC+5lgHT!keTIrr3!!^&J$45lgl`!!)ut!eUKdrr<"Nq>UGITDnlka8c0lnc&Rh +qYpPJqYpO]q#:>Hp&>!lrVlitnc&]D^&N`_rr<&ts8R`Mrr<&ts8N(Ms0_lW~> +W;lmKrr3"M^@hL,5QL?S!knZKrr3!!^Ae-55QLc_!!)ut!eC?crr<"Lq>UGGTDnlka8c0jnc&Rh +qYpPHqYpO\q#:>Fp&>!lrVlitnc&]B^Aic^rr<&ts8RZKrr<&ts8N(Ms0_lW~> +W;lmMrr3"O^%MC+5lgHT!keTIrr3!!^&J$45lgl`!!)ut!eUKdrr<"Nq>UGITDnlka8c0lnc&Rh +qYpPJqYpO]q#:>Hp&>!lrVlitnc&]D^&N`_rr<&ts8R`Mrr<&ts8N(Ms0_lW~> +W;ciqmf*8Qo)B045uN@8s+:<(s8Tb4KDkfM!<)p&]`8&Gs8R_bq>UFmTDnole]@djKCSsAKDPTJ +KDPTJ62:H[KD#6J]`<\;!58=1!/(1K#D9_iK7j4(KDb`LKDkfNK0fJ9!!)ut!NZ9Ps0_lW~> +W;citmf*8Po)B055ZNC8s+(0$s8Te5Jc5TK!<)p&^&S/Is8RYaq>UFpTDnolf#[mkJara?JboBH +JboBH5kt?ZJbB$H^&W_8!5AC2!.k%I#D'VhJV!k$Jc,NJJc5TLJO'26!!)ut!NH-Ns0_lW~> +W;ciqmf*8Qo)B045uN@8s+:<(s8Tb4KDkfM!<)p&]`8&Gs8R_bq>UFmTDnole]@djKCSsAKDPTJ +KDPTJ62:H[KD#6J]`<\;!58=1!/(1K#D9_iK7j4(KDb`LKDkfNK0fJ9!!)ut!NZ9Ps0_lW~> +W;ciqmf*9>o)B.!]rZkds+UFmkl1Xr\c2X0a8c0lnc&TA +qYpO]qYpPJq#:>HoDeiC!58:0!/(1Krdt3arr2u3q#:H0K7gl:rr@]MrrLZ`JcE.XJ,~> +W;citmf*9LJc5TK!<)p&^4F!`s8RY$q>UFpkl1Xs\c2X0a8c0jnc&T? +qYpO\qYpPHq#:>FoDeiA!5A@1!.k%Irdb'`rr2u4q#:H1JUtQ7rr@WKrrL]bJcE.XJ,~> +W;ciqmf*9>o)B.!]rZkds+UFmkl1Xr\c2X0a8c0lnc&TA +qYpO]qYpPJq#:>HoDeiC!58:0!/(1Krdt3arr2u3q#:H0K7gl:rr@]MrrLZ`JcE.XJ,~> +W;ciqr;Zi2rVlu5!!#porr@]Crsh?.s/^kQs+>s;5s^/'KDkfM!<)rtK*D:-KE$S;q>UGrl2Le7 +K=V!^!6>->KCSsAKDPTJ!<)rsK)e49rr@]Mrr@]Ms8Tc`s+14Ls*t~> +W;citr;Zi3rVlu6!!$$rrr@WArsh<.s/LYMs+,a85X9o#Jc5TK!<)rtJHc()JcC;8q>UGpl2Le8 +J[td\!6>->Jara?JboBH!<)rsJH.t6rr@WKrr@WKs8Tfas+14Ls*t~> +W;ciqr;Zi2rVlu5!!#porr@]Crsh?.s/^kQs+>s;5s^/'KDkfM!<)rtK*D:-KE$S;q>UGrl2Le7 +K=V!^!6>->KCSsAKDPTJ!<)rsK)e49rr@]Mrr@]Ms8Tc`s+14Ls*t~> +W;clrKDtlO6%eh0!!)Zk!/(1L$%r81KDtoOs8R`Mrr@]Ms8R`OrrQ*uKD>HHXQf`cX8og2!!((> +s+BkA!/(.J!!*#u!/(1Ls+:MA!55JI]g;Vs"+rmlKDY_#s+UK'~> +W;cluJc>ZM5_8S-!!)Zk!.k%J$%`,-Jc>]Ms8RZKrr@WKs8RZMrrQ4#Jb]6FWp0NaWW9U0!!((> +s+0_?!.k"H!!*#u!.k%Js+(A>!5>JI^-MYs"+`^gJc#M!s+UK'~> +W;clrKDtlO6%eh0!!)Zk!/(1L$%r81KDtoOs8R`Mrr@]Ms8R`OrrQ*uKD>HHXQf`cX8og2!!((> +s+BkA!/(.J!!*#u!/(1Ls+:MA!55JI]g;Vs"+rmlKDY_#s+UK'~> +W;ciqr;Q`so`"mknG`lt63$t;KE&Wus8PC`rr@]Ms8R`OrrRhdKD>HHXQf`cX8og2!!((>s+BnB +!S)i!rr>@`s7cTnK)n7Le!'u29\c70~> +W;citr;Q`so`"mknG`lr5l^k8JcEHus8P@_rr@WKs8RZMrrRbcJb]6FWp0NaWW9U0!!((>s+0b@ +!S2hurr>=_s7cTnJH8"9rIFr6q#L5A!%@gH!C24n!!>Id!'l,8\c70~> +W;ciqr;Q`so`"mknG`lt63$t;KE&Wus8PC`rr@]Ms8R`OrrRhdKD>HHXQf`cX8og2!!((>s+BnB +!S)i!rr>@`s7cTnK)n7Le!'u29\c70~> +W;clr^&J$4]`@^)!!)Ng"g!@Vs+>t%rr>@`rr@]Ms8R`NrrGCcq#:>ql2LdcK=V!^!<)rtK*FUA +!/#n(;Z;:O6%aeU62cE9!;_ +W;clu^Ae-5^&[g*!!)Ng"fd.Rs+,b!rr>=_rr@WKs8RZLrrG@bq#:>ol2LdaJ[td\!<)rtJHe@> +!.f\$ +W;clr^&J$4]`@^)!!)Ng"g!@Vs+>t%rr>@`rr@]Ms8R`NrrGCcq#:>ql2LdcK=V!^!<)rtK*FUA +!/#n(;Z;:O6%aeU62cE9!;_ +W;d(P!/%t;6+usk!PJL0rrBb-rroKVs8R_(r;QbLrVlitrVunMrr3#4!;QQoXQf`ceUtF4!!)ut +!($#P!7gfC!7h&J!584.!J:CMs8R`BrrK2eqYpO]qYpPJrVlkMrVlkMrVunMJcC<$rr7K~> +W;d(Q!.hk85ecpk!PSR1rrBe.rroERs8RY$r;QbJrVlitrVunKrr3#5!;QQoWp0Naeq(C3!!)ut +!'orO!7plD!7q,K!5A:/!J(7Ks8RZ@rrK,bqYpO\qYpPHrVlkKrVlkKrVunKJcC<$rr7K~> +W;d(P!/%t;6+usk!PJL0rrBb-rroKVs8R_(r;QbLrVlitrVunMrr3#4!;QQoXQf`ceUtF4!!)ut +!($#P!7gfC!7h&J!584.!J:CMs8R`BrrK2eqYpO]qYpPJrVlkMrVlkMrVunMJcC<$rr7K~> +V>gRteareBK<20OrrB.qrrD3\s8UXIrrCUKrrT9"ec#LJec#LJebT4GeZA!7!/%i^!!)ut!/&`" +!!)rss+BnB!QB]frr=MErr>sqrr@]Mrr@]Ms8R_&s+14Ls*t~> +V>gRrf(8nCJZ>aIrrB(orrD'Xs8U[JrrCXLrrT3#f)>UKf)>UKf(o=HeuIs6!.h]\!!)ut!.iSu +!!)rss+0b@!QK]err=JDrr?'trr@WKrr@WKs8RY$s+14Ls*t~> +V>gRteareBK<20OrrB.qrrD3\s8UXIrrCUKrrT9"ec#LJec#LJebT4GeZA!7!/%i^!!)ut!/&`" +!!)rss+BnB!QB]frr=MErr>sqrr@]Mrr@]Ms8R_&s+14Ls*t~> +JcFU,!J@KKs8R]O^&@s2!;ZWpKDGNIKDbcLK?=,n!<)otK@9c"!;ulsKC]$CeV!_u!!)lq!/(7M +!/(7M!/(7Ms+>n&JcG`LJ,~> +JcFU,!J.9Gs8RWM^A\'3!;ZWpJbf +JcFU,!J@KKs8R]O^&@s2!;ZWpKDGNIKDbcLK?=,n!<)otK@9c"!;ulsKC]$CeV!_u!!)lq!/(7M +!/(7M!/(7Ms+>n&JcG`LJ,~> +XT&:6pk/T4"+pS>^#K)%6%_H'!/!Ri.>*7=K0fHgs$6[<;Z;=K62uQC6%aeU!'ro'62cE9621HY +K*)*>.003sp]/G9!!)ut!/(:NrW!%Q!!%ZFrrbUf!(" +XT&:7pjrH1"+^G;^>f2&5_20#!.dCd."Qq7JO'0bs$-U9 +XT&:6pk/T4"+pS>^#K)%6%_H'!/!Ri.>*7=K0fHgs$6[<;Z;=K62uQC6%aeU!'ro'62cE9621HY +K*)*>.003sp]/G9!!)ut!/(:NrW!%Q!!%ZFrrbUf!(" +JcFU,!J=;KrrBb3rr]q7!($R9!@arr<&hrs;T:s8TdG +s8R_(rr3,762uR'q#: +JcFU,!J+8LrrBe4rr]t8!'pL6!=`rr<&hrs;]>s8TgI +s8RY$rr3,85lZC#q#: +JcFU,!J=;KrrBb3rr]q7!($R9!@arr<&hrs;T:s8TdG +s8R_(rr3,762uR'q#: +JcFU,s+BkA!!)ip!/(+I!/&/g!!)ut!/(:N!!)Qh!3Ghm!s&@RKD>HH!;ulsKC]$CXFpBL!($J] +!/(7M!/(7M!/(7Ms+>n&JcG`LJ,~> +JcFU,s+0_?!!)ip!.jtG!.i#e!!)ut!.k.L!!)Qh!35\k!s&@PJb]6F!;ulsJb&gAWe($H!'pD\ +!.k+K!.k+K!.k+Ks+,b$JcG`LJ,~> +JcFU,s+BkA!!)ip!/(+I!/&/g!!)ut!/(:N!!)Qh!3Ghm!s&@RKD>HH!;ulsKC]$CXFpBL!($J] +!/(7M!/(7M!/(7Ms+>n&JcG`LJ,~> +JcFR+!)i@e!!)ip!/(+I!/&/g!!)ut!/(:N!!)tMp&>#np&>0.63"UurIb%J!!)rss+BnB!S)i! +rr>@]rr<&trr@]Mrr@]Ms8R_&s+14Ls*t~> +JcFR+!*/Rh!!)ip!.jtG!.i#e!!)ut!.k.L!!)tKp&>#lp&>0/5l\OurIOnH!!)rss+0b@!S2hu +rr>=\rr<&trr@WKrr@WKs8RY$s+14Ls*t~> +JcFR+!)i@e!!)ip!/(+I!/&/g!!)ut!/(:N!!)tMp&>#np&>0.63"UurIb%J!!)rss+BnB!S)i! +rr>@]rr<&trr@]Mrr@]Ms8R_&s+14Ls*t~> +JcFR+!3G_j!!)ip!($G\!/&/g!!)ut!/(.J!S%2Drr>sq!!'_0rrLY9qYpSK!<)ot!;uitK>$jU +!S)i!rr<&qrr@]Mrr>@`rr@]Ms8R`/rr@]?rrCT#s0VfV~> +JcFR+!35Sh!!)ip!'pA[!.i#e!!)ut!.k"H!S.8Err?'t!!'b1rrL\9qYpSI!<)ot!;uitJ\L^T +!S2hurr<&qrr@WKrr>=_rr@WKs8RZ-rr@W=rrCW$s0VfV~> +JcFR+!3G_j!!)ip!($G\!/&/g!!)ut!/(.J!S%2Drr>sq!!'_0rrLY9qYpSK!<)ot!;uitK>$jU +!S)i!rr<&qrr@]Mrr>@`rr@]Ms8R`/rr@]?rrCT#s0VfV~> +JcFR+!3G_j!<@cKrr@]Irr<&9rr<&trr@]IrrKfcp\t7l^&J$46,!9t!kgn$q#:B.62pla!;uis +KCSsBeV!_u!!)lq!/(7M!/(7M!/(7Ms+B5/!!)Kf!3CbO[/YX~> +JcFR+!35Sh!<@]Irr@WGrr<&9rr<&trr@WGrrKibp\t7o^Ae-55ed6t!kpq"q#:B/5lUc`!;uis +Jara@eq*\t!!)lq!.k+K!.k+K!.k+Ks+0)-!!)Kf!31VM[/YX~> +JcFR+!3G_j!<@cKrr@]Irr<&9rr<&trr@]IrrKfcp\t7l^&J$46,!9t!kgn$q#:B.62pla!;uis +KCSsBeV!_u!!)lq!/(7M!/(7M!/(7Ms+B5/!!)Kf!3CbO[/YX~> +JcFR+!3G_j!@`rr@]Mrr@]Ms8R`/rr<&frr@\&s0VfV~> +JcFR+!35Sh!=_rr@WKrr@WKs8RZ-rr<&frr@V$s0VfV~> +JcFR+!3G_j!@`rr@]Mrr@]Ms8R`/rr<&frr@\&s0VfV~> +JcFR+!3G_j!UEp_Z'T9rr<"Nq>UI]KD5BGKDkiMKE(rO61t6Y]g;Yt!!)rss+BnB +!N^qMrr<&qrr@]Mrr@]Mrr@]Ms8R`/rr<&frrB-Os0VfV~> +JcFR+!35Sh!UEp_Z'T9rr<"Lq>UI\JbT0EJc5WKJcG`M5kY-X^-M\t!!)rss+0b@ +!NL_Irr<&qrr@WKrr@WKrr@WKs8RZ-rr<&frrB'Ms0VfV~> +JcFR+!3G_j!UEp_Z'T9rr<"Nq>UI]KD5BGKDkiMKE(rO61t6Y]g;Yt!!)rss+BnB +!N^qMrr<&qrr@]Mrr@]Mrr@]Ms8R`/rr<&frrB-Os0VfV~> +UAk7H^$u%%KDtlN^&7m162plc5l^o`rr@]Lrr@];rrB.jrr<&qrrLZ&q>UEp_Z'T9rr<"Nrr2sa +rdt5L62^``K>%6`$A1XXs+: +UAk7F^@;.&Jc>ZL^AS!25lUcb5QCf_rr@WJrr@W9rrB(hrr<&qrrL]%q>UEp_Z'T9rr<"Lrr2s` +rdb)M5lCW_J\M*_$@tIVs+(0as+*H8rdb?hs8N)5^Ai`arVlitr;QeK^@M:)We($H!!)lq!.k+K +!.k+K!.k+Ks+0)-!!)Kf!31VM[/YX~> +UAk7H^$u%%KDtlN^&7m162plc5l^o`rr@]Lrr@];rrB.jrr<&qrrLZ&q>UEp_Z'T9rr<"Nrr2sa +rdt5L62^``K>%6`$A1XXs+: +U]1D/6%e_-#!i7hs1JEGrr3"O!<3!!]`A!1!<>Farr<&crrKg7nc&RhqYpTHKDGNI6,NX%KDtoN +KDkiM^%).&K)iU`s8.HJrr]reK>%3_!!)rs!JA)VrrK3RqYpNqqYpPJrVlkMrVlkMrVunMmJd6? +5sb=!rr2run,EBhJcE+WJ,~> +U]1D05_8J*#!`1gs1SKIrr3"M!<3!!^&\*2!<>C`rr<&crrKj6nc&RhqYpTIJbf]L +Jc5WK^@D7'JH3F_s8.BHrr]udJ\M'^!!)rs!J.uUrrK-NqYpNqqYpPHrVlkKrVlkKrVunKmJd6= +5X>-rrr2run,EBfJcE+WJ,~> +U]1D/6%e_-#!i7hs1JEGrr3"O!<3!!]`A!1!<>Farr<&crrKg7nc&RhqYpTHKDGNI6,NX%KDtoN +KDkiM^%).&K)iU`s8.HJrr]reK>%3_!!)rs!JA)VrrK3RqYpNqqYpPJrVlkMrVlkMrVunMmJd6? +5sb=!rr2run,EBhJcE+WJ,~> +UAt7GoD]9M;QNdrs4&Prs8UUL!<3!!eH#OI!WX[Nrr2rum/I+:Mt-fI!;c]rXFp?K!)gQ2!J@K% +rr<&ss8R`BrrK3RqYpNqqYpPJrVlkMrVlkMrVunMli7"8#-@jTXE,hlrr2rur;QeUKDb`ReUo=$ +s8T0Os0VfV~> +UAt7EoD]9NXJ!WXXKrr2rum/I+;NUd#K!;c]rWe(!G!*-c5!J.9! +rr<&ss8RZ@rrK-NqYpNqqYpPHrVlkKrVlkKrVunKli7"9#-.^SWc9Gerr2rur;QeWJc,NPeq#7# +s8T*Ms0VfV~> +UAt7GoD]9M;QNdrs4&Prs8UUL!<3!!eH#OI!WX[Nrr2rum/I+:Mt-fI!;c]rXFp?K!)gQ2!J@K% +rr<&ss8R`BrrK3RqYpNqqYpPJrVlkMrVlkMrVunMli7"8#-@jTXE,hlrr2rur;QeUKDb`ReUo=$ +s8T0Os0VfV~> +\GlO/m/R*K)koN!PJL2rrrK'6,! +\GlO/m/R*:o`#015ed8us8Th4JHPp;JH5]L!PSR3rrrK'5ed9u!:0XbJara?!;c]rWe(!G!'n9u +!.iPt!!)rss+0b@!NL_Irr<&qrr@WKrr@WKrr@WKs8RZ5rrTo"f)5OJ!;ld$^-I8Ls+*GLrVlkt +JcE+WJ,~> +\GlO/m/R*K)koN!PJL2rrrK'6,! +\GlO/m/I'%% +\GlO/m/I':oD\qY!<<'Irr3"Ms8G7arrE#t!!)rs"p"]'!<<'!li-sbnc&RhqYpTIJbf +\GlO/m/I'%% +\GlO/m/I' +\GlO/m/I':o`#!,5_8n7$%`,jJcEGLs8N)trr<&srrrK's1X'a!:0XbWq$)h!;c]rWe(!G!!'n9 +!!)ut!knX7eq!m&!.k(Js+0b@!NL_Irr<&qrr@WKrr@WKrr@WKs8RZ8rrToc^A7d/!;c]q^AWT_ +^AS!2 +\GlO/m/I' +\GlO/m/R*UGI_Z'T9rdt2: +rVusbKDkfMKD,K)bm;K>% +\GlO/m/R*:nG`WBs8Tfar;Q`srVlitr;Q`srr3&"^&[O"!J.9@rr<&qrrK-Nq>UGG_Z'T9rdb&7 +rVusaJc5TKJbK*Df'32?JH,[8J\M0a!:g'iWe($H!!)lq!.k+K!.k+K!.k+Ks+0P:!knZKp\t3n +qu6[^Jc5WK5lL]_JV!j.s*t~> +\GlO/m/R*UGI_Z'T9rdt2: +rVusbKDkfMKD,K)bm;K>% +\GlO/m/R*UGI_Z'YM.Jj)F +60j.'62LW^;X=A`^%21(XFpBL!!)lq!/(7M!/(7M!/(7Ms+B_=!^Qedq1J\H!!)ut!PMD-rrKe5 +rr2srJcE+WJ,~> +\GlO/m/R*:nG`Wks8RY$r;Q`srVlitr;Q`srr3&N!!)Bc!J.9@rr<&qrrK-Nq>UGG_Z'YN./NuE +5jNt$5l1N] +\GlO/m/R*UGI_Z'YM.Jj)F +60j.'62LW^;X=A`^%21(XFpBL!!)lq!/(7M!/(7M!/(7Ms+B_=!^Qedq1J\H!!)ut!PMD-rrKe5 +rr2srJcE+WJ,~> +_Z'bPK=unir;Q`smJd7$5lgf^s1S4-"P*PP]tO@D!/(:N!eUJ=rVlj`rVlo361"UPK<4VC!!)lq +!N^qLrr>?ts8R`&rrCUKK)iUarrGE +_Z'bQJ\H\dr;Q`smJd7%5QL]]s1\:."P3VQ^:sOF!.k.L!eC>:rVlj_rVlo45j\LOJZA8?!!)lq +!NL_Hrr> +_Z'bPK=unir;Q`smJd7$5lgf^s1S4-"P*PP]tO@D!/(:N!eUJ=rVlj`rVlo361"UPK<4VC!!)lq +!N^qLrr>?ts8R`&rrCUKK)iUarrGE +_Z'ak.>%U#r;Q`sW;cmNXRZ;j!;c]rXFp?K!("L%!56GQ!C;A/rrK3RqYpNqqYpPJrVlkMrVlkM +rVunMhu +_Z'ai."M?ur;Q`sW;cmLWq$)h!;c]rWe(!G!'nF$!5?MR!C25,rrK-NqYpNqqYpPHrVlkKrVlkK +rVunKhu +_Z'ak.>%U#r;Q`sW;cmNXRZ;j!;c]rXFp?K!("L%!56GQ!C;A/rrK3RqYpNqqYpPJrVlkMrVlkM +rVunMhu +\GlO/\GuM["MOj8K7j%#!J@KMs8R`NrrCUKK)boJrrK3Rq>UF\_Z'T9a8Z/?KC]$CXFpBL!!)lq +!/(7M!/(7M!($S`s+B5/!!)cn"MKG?6%f1:!)eCJ[/YX~> +\GlO/\GuMY"MXp9JV![t!J.9Is8RZLrrCXLJH,]HrrK-Nq>UF[_Z'T9a8Z/?Jb&gAWe($H!!)lq +!.k+K!.k+K!'pM_s+0)-!!)cn"MTG<5_8q7!*+UM[/YX~> +\GlO/\GuM["MOj8K7j%#!J@KMs8R`NrrCUKK)boJrrK3Rq>UF\_Z'T9a8Z/?KC]$CXFpBL!!)lq +!/(7M!/(7M!($S`s+B5/!!)cn"MKG?6%f1:!)eCJ[/YX~> +\GlO/o)J<6r^$8Y!/(4M!/(1L"=\s'!($G]!E&pqrr>@[!;qHS6%].;6%]/'re'qFqYpStKDGNI +6,NX%!6>->KC]$CXFpBL!($J]!/(7M!/(7M!/(7Ms+B5/!!)lq"MKFR!58:0!)eCJ[/YX~> +\GlO/o)J<4r]p2X!.k(K!.k%J"=Sg$!'pA\!EB-trr>=Z!;qBQ5_/n85_/o#rdjeDqYpSrJbf->Jb&gAWe($H!'pD\!.k+K!.k+K!.k+Ks+0)-!!)lq"MTFP!5A@1!*+UM[/YX~> +\GlO/o)J<6r^$8Y!/(4M!/(1L"=\s'!($G]!E&pqrr>@[!;qHS6%].;6%]/'re'qFqYpStKDGNI +6,NX%!6>->KC]$CXFpBL!($J]!/(7M!/(7M!/(7Ms+B5/!!)lq"MKFR!58:0!)eCJ[/YX~> +\GlO/\GuR/rIY1O5sbAIs+C1Js$?U9r;cZn!584.!("L%!/&>ls+BnB!N^qMrr<&qrr@]Mrr@]M +rr@]Ms8R`=rsh>IK=unis8R_(6%f4;!;uj#K0b.i]n?1]!)eCJ[/YX~> +\GlO/\GuR/rIG%M5X>2Gs+1%Hs$6O6r;cZn!5A:/!'nF$!.i2js+0b@!NL_Irr<&qrr@WKrr@WK +rr@WKs8RZ;rsh;FJ\H\ds8RY$5_8t8!;uj#JO"ed^4H.\!*+UM[/YX~> +\GlO/\GuR/rIY1O5sbAIs+C1Js$?U9r;cZn!584.!("L%!/&>ls+BnB!N^qMrr<&qrr@]Mrr@]M +rr@]Ms8R`=rsh>IK=unis8R_(6%f4;!;uj#K0b.i]n?1]!)eCJ[/YX~> +^Ae1cr;Q`s\GlQBqu6\L^&%a0K<4qLs+C7Ls1JC4nG`JS_Z'T9a8Z0m^%21(XFpBL!!)lq!/(7M +!/(7M!/(7Ms+B_=!($C4"@7\?s+C:M#/*o#^&PcuqYpOnJcE+WJ,~> +^Ae1ar;Q`s\GlQCqu6\J^A@j1JZASHs+1+Js1SI5nG`JR_Z'T9a8Z0k^@M:)We($H!!)lq!.k+K +!.k+K!.k+Ks+0S;!'p=1"@.P +^Ae1cr;Q`s\GlQBqu6\L^&%a0K<4qLs+C7Ls1JC4nG`JS_Z'T9a8Z0m^%21(XFpBL!!)lq!/(7M +!/(7M!/(7Ms+B_=!($C4"@7\?s+C:M#/*o#^&PcuqYpOnJcE+WJ,~> +\GlO/Z2XiW^&%a0K<4qLs+C1J!!)Ng!!'n9!!((>!/'hA!N^qMrr<&qrr@]Mrr@]Mrr@]Ms8R`3 +rrBb3rr<&rrrg#f5la4Irr>rJs0VfV~> +\GlO/Z2XiU^A@j1JZASHs+1%H!!)Ng!!'n9!!((>!.j\?!NL_Irr<&qrr@WKrr@WKrr@WKs8RZ1 +rrBe4rr<&rrrg&e5QF(Grr?&Ms0VfV~> +\GlO/Z2XiW^&%a0K<4qLs+C1J!!)Ng!!'n9!!((>!/'hA!N^qMrr<&qrr@]Mrr@]Mrr@]Ms8R`3 +rrBb3rr<&rrrg#f5la4Irr>rJs0VfV~> +_>aPueb]:G!3uP)K@Thu!J@KMs8R`Jrr=MErrL*?q>UGI_Z'T9a8Z0mXRcAlXFpBL!!)lq!/(7M +!/(7M!/(7Ms+B5/!/(%G#h?#/XK9tPs&+FJ[/YX~> +_>aPqf)#CH!3uP)J_'\t!J.9Is8RZHrr=JDrrL->q>UGG_Z'T9a8Z0kWq-/jWe($H!!)lq!.k+K +!.k+K!.k+Ks+0)-!.jnE#hH#,WiFYMs&FXM[/YX~> +_>aPueb]:G!3uP)K@Thu!J@KMs8R`Jrr=MErrL*?q>UGI_Z'T9a8Z0mXRcAlXFpBL!!)lq!/(7M +!/(7M!/(7Ms+B5/!/(%G#h?#/XK9tPs&+FJ[/YX~> +_Z'a);M+t%r;Q`sZ2XiW^&%d/KDPWJKDPTJ!;c]rXFp?K!!'n9!!((>!JA)VrrK3RqYpNqqYpPJ +rVlkMrVlkMrVunMhu<\/oDej(s8N'sJcE+WJ,~> +_Z'a(!J.uUrrK-NqYpNqqYpPH +rVlkKrVlkKrVunKhu<\-oDej)s8N(!JcE+WJ,~> +_Z'a);M+t%r;Q`sZ2XiW^&%d/KDPWJKDPTJ!;c]rXFp?K!!'n9!!((>!JA)VrrK3RqYpNqqYpPJ +rVlkMrVlkMrVunMhu<\/oDej(s8N'sJcE+WJ,~> +_Z'`=s8R^;r;Q`sZ2aiVqYpSKXSVtsKDPTJ!;c]rXFp?K!!'n9!!((>s+BnB!N^qMrr<&qrr@]M +rr@]Mrr@]Ms8R`=s7V*Err<&ss7_-J^&S+1JcE+WJ,~> +_Z'`=s8RX8r;Q`sZ2aiTqYpSIWqubqJboBH!;c]rWe(!G!!'n9!!((>s+0b@!NL_Irr<&qrr@WK +rr@WKrr@WKs8RZ;s7V$Crr<&ss7_'H^An45JcE+WJ,~> +_Z'`=s8R^;r;Q`sZ2aiVqYpSKXSVtsKDPTJ!;c]rXFp?K!!'n9!!((>s+BnB!N^qMrr<&qrr@]M +rr@]Mrr@]Ms8R`=s7V*Err<&ss7_-J^&S+1JcE+WJ,~> +_Z'a)K7cJ'r;Q`sp&>,H!!#pirs+/VK7cJ's8W(N#!i4h^&PdZrVlkMrr3)6K0d3Ms8Te2rr@]E +s8R`JrrIbRqZ$SJqYpNqnG`Ig_Z'T9a8c0lo)A`lKDPTJ!;c]qKDkfMKDkfMKDkiMKC/[G]g2Wa +]tK'us+>t'rr<&srrQ'u62H65rr>rJs0VfV~> +_Z'a(JUp)#r;Q`sp&>,F!!$$lrs+)TJUp)#s8W(L#!`.g^Akp]rVlkKrr3)7JO$sKs8Th3rr@WC +s8RZHrrI\NqZ$SHqYpNqnG`Ig_Z'T9a8c0jo)A`jJboBH!;c]qJc5TKJc5TKJc5WKJaNIE^-DZ` +^:o0us+,b#rr<&srrQ1#5l-'2rr?&Ms0VfV~> +_Z'a)K7cJ'r;Q`sp&>,H!!#pirs+/VK7cJ's8W(N#!i4h^&PdZrVlkMrr3)6K0d3Ms8Te2rr@]E +s8R`JrrIbRqZ$SJqYpNqnG`Ig_Z'T9a8c0lo)A`lKDPTJ!;c]qKDkfMKDkfMKDkiMKC/[G]g2Wa +]tK'us+>t'rr<&srrQ'u62H65rr>rJs0VfV~> +_>jOf!58:0!!)`ms+C@Os+C%F!/(:N"MFg8rrDoqs+C=N!PJL3rrIa]n:sNq>UEp +qu6`26%et4!)eCJ[/YX~> +_>jOd!5A@1!!)`ms+14Ms+0nD!.k.L"MOm9rrDoqs+11L!PSR4rrI[9rVlqM!5AI4!!)]ls+1%H +!J.9Is8RZHrr<&hrrKi!_Z'T9a8c0jo)A`jJboBH!;c]qJc5TK5lL]_Jc5WKJa<=<^4CjLq>UEp +qu6`35_8_1!*+UM[/YX~> +_>jOf!58:0!!)`ms+C@Os+C%F!/(:N"MFg8rrDoqs+C=N!PJL3rrIa]n:sNq>UEp +qu6`26%et4!)eCJ[/YX~> +_>aSes1S=0!!)`m!($Va!S)hmrrW9$rrDoq!J:COrrRfQ^&J'3KDkfOK)e4:rr<&ls8R`JrrIbR +qZ$SJqYpNqnc&WB6,NX%!6>->KC]$CXFpBL!!)lq!/(7M!/(7M!/(7Ms+BP8s$6Xuqu6Wrq>UN0 +6%f%6!)eCJ[/YX~> +_>aSfs1\C1!!)`m!'pP`!S2hlrrW9$rrDoq!J(7MrrR`O^Ae04Jc5TMJH.t7rr<&ls8RZHrrI\N +qZ$SHqYpNqnc&W@5f3O$!6>->Jb&gAWe($H!!)lq!.k+K!.k+K!.k+Ks+0D6s$-Ruqu6Wrq>UN1 +5_8e3!*+UM[/YX~> +_>aSes1S=0!!)`m!($Va!S)hmrrW9$rrDoq!J:COrrRfQ^&J'3KDkfOK)e4:rr<&ls8R`JrrIbR +qZ$SJqYpNqnc&WB6,NX%!6>->KC]$CXFpBL!!)lq!/(7M!/(7M!/(7Ms+BP8s$6Xuqu6Wrq>UN0 +6%f%6!)eCJ[/YX~> +_Z'_O.7!t2rr<&ns8R`Mrr<&irrg#$s8N)uK)jI$rs+/V63"Uu!/(:Ns+C:MrdtrJs0VfV~> +_Z'_P-pRe0rr<&ns8RZKrr<&irrg&$s8N)uJH4:#rs+)T5l\Ou!.k.Ls+1.Krdb0cs8N)ls8RZH +rrI\NqZ$SHqYpNqqYpSrJboBIJO%*P!'nU)s+0b@!NL_Irr<&qrr@WKrr@WKrr@WKs8RZ6rrTn7 +^AIp1!;QQq^&UFqrr?&Ms0VfV~> +_Z'_O.7!t2rr<&ns8R`Mrr<&irrg#$s8N)uK)jI$rs+/V63"Uu!/(:Ns+C:MrdtrJs0VfV~> +_>aR7K0fD7!!)cns+C:M!s+BnB!N^qMrr<&qrr@]Mrr@]Mrr@]Ms8R`;rr]re +]tO7A!!)lqre(%H!)eCJ[/YX~> +_>aR:JO',4!!)cns+1.K!r8p&G&C +qYpSIWqubqJboBH!;c]rWe(!G!.i#e!!((>s+0b@!NL_Irr<&qrr@WKrr@WKrr@WKs8RZ9rr]ud +^:sFC!!)lqrdjnF!*+UM[/YX~> +_>aR7K0fD7!!)cns+C:M!s+BnB!N^qMrr<&qrr@]Mrr@]Mrr@]Ms8R`;rr]re +]tO7A!!)lqre(%H!)eCJ[/YX~> +\GlO/p](8GrVllu^%VL+5leUnrsFCls+C@O!/(;;^&J'3KDkiMKE(rQ.K9D@rrIbcqYpSKXSVts +KDPTJ!;c]rXFp?K!/&/g!("[*s+BnB!N^qMrr<&qrr@]Mrr@]Mrr@]Ms8R`=rrp)g!/%tuq>UEp +r;Qi"!/(%G!/#k&[/YX~> +\GlO/p](8ErVllu^@qU,5QJOnrsF=ks+14M!.k/8^Ae04Jc5WKJcG`O./s;?rrI\bqYpSIWqubq +JboBH!;c]rWe(!G!.i#e!'nU)s+0b@!NL_Irr<&qrr@WKrr@WKrr@WKs8RZ;rrp,f!.hkuq>UEp +r;Qhu!.jnE!.f_$[/YX~> +\GlO/p](8GrVllu^%VL+5leUnrsFCls+C@O!/(;;^&J'3KDkiMKE(rQ.K9D@rrIbcqYpSKXSVts +KDPTJ!;c]rXFp?K!/&/g!("[*s+BnB!N^qMrr<&qrr@]Mrr@]Mrr@]Ms8R`=rrp)g!/%tuq>UEp +r;Qi"!/(%G!/#k&[/YX~> +\GlO/p\t9-62gf`62(%!Ys+:CQK>%6`!/(7M!PO-as8R`OrrT8f!;6BlKDPTKK<4qLs+C1J +!!)lq!N^qLrr@\grr<&>rrGE +\GlO/p\t9.5lL]_5kb3YJ\LjXs+(7OJ\M*_!.k+K!PX-`s8RZMrrT2c!;6BlJboBIJZASHs+1%H +!!)lq!NL_Hrr@Verr<&>rrGB9o)A`jJboBH!;c]qJc5TKJc5TKJc5WKJaNL2Jc>ZL!<)ot^A +\GlO/p\t9-62gf`62(%!Ys+:CQK>%6`!/(7M!PO-as8R`OrrT8f!;6BlKDPTKK<4qLs+C1J +!!)lq!N^qLrr@\grr<&>rrGE +_Z0Xgs8W+O!58C3!!)`m"[Tj%s+>strr@]JrrBb2rrdtfs+>t&s8R`Ns8R`Ms8R`Ns8N)lrrIbc +qYpSKXSVtsKDPTJ!;c]rXFp?K!/&/g!!((>s+BnB!N^qMrr<&qrr@]Mrr@]Mrr@]Ms8R`/rr>@R +rr>rJs0VfV~> +_Z0Xes8W+M!5AI4!!)`m"[Kg%s+,aprr@WHrrBe3rrdnes+,b"s8RZLs8RZKs8RZLs8N)lrrI\b +qYpSIWqubqJboBH!;c]rWe(!G!.i#e!!((>s+0b@!NL_Irr<&qrr@WKrr@WKrr@WKs8RZ-rr>=Q +rr?&Ms0VfV~> +_Z0Xgs8W+O!58C3!!)`m"[Tj%s+>strr@]JrrBb2rrdtfs+>t&s8R`Ns8R`Ms8R`Ns8N)lrrIbc +qYpSKXSVtsKDPTJ!;c]rXFp?K!/&/g!!((>s+BnB!N^qMrr<&qrr@]Mrr@]Mrr@]Ms8R`/rr>@R +rr>rJs0VfV~> +_uKa&#uX&TK7a0;s8N)lrrYQ>K.6]t!($P_!%Ihus8N'brdtAPKE(t(^&@s96%f4;]g2Y3rr3"O +^&J$4]`@a*!/(+I!J@KMs8R`Jrr<&qrrK3Rq>UGI_Z'T9a8Z0m^%21(XFpBL!!)lq!/(7M!/(7M +!/(7Ms+B_="G9!m5sbGKs+C@O!!)rs!7h&Jr]pPb^&J$3XF^DYs*t~> +_uKa%#us5UJUmg8s8N)lrrYN;JLLEq!'pJ^!%@brs8N'ardb5QJcGb$^A\':5_8t8^-D\4rr3"M +^Ae-5^&[j+!.jtG!J.9Is8RZHrr<&qrrK-Nq>UGG_Z'T9a8Z0k^@M:)We($H!!)lq!.k+K!.k+K +!.k+Ks+0S;"G&gh5X>8Is+14M!!)rs!7q,Kr]gJa^Ae-4We(2Ws*t~> +_uKa&#uX&TK7a0;s8N)lrrYQ>K.6]t!($P_!%Ihus8N'brdtAPKE(t(^&@s96%f4;]g2Y3rr3"O +^&J$4]`@a*!/(+I!J@KMs8R`Jrr<&qrrK3Rq>UGI_Z'T9a8Z0m^%21(XFpBL!!)lq!/(7M!/(7M +!/(7Ms+B_="G9!m5sbGKs+C@O!!)rs!7h&Jr]pPb^&J$3XF^DYs*t~> +_uC)Es8N(Os8Tbus8N)ks8Te/rrBb1s8.HJs8IWNXSDeq^&J$6]n:sNli-s;q#:>qqZ$SJqYpNq +qYpStKDPTK]n=3%!!((>!JA)VrrK3RqYpNqqYpPJrVlj`rr3#4KDkiMKC/[=62plb]g;Vss+C@O +!!)ut!PO-brrn%gs8Tb4rr2srJcE+WJ,~> +_uC)Es8N(Ms8Teus8N)ks8Th0rrBe2s8.BHs8IQLWqcSo^Ae-7^4CjLli-s9q#:>oqZ$SHqYpNq +qYpSrJboBI^4F0$!!((>!J.uUrrK-NqYpNqqYpPHrVlj_rr3#5Jc5WKJaNI;5lUca^-MYss+14M +!!)ut!PX-arrmtfs8Te5rr2suJcE+WJ,~> +_uC)Es8N(Os8Tbus8N)ks8Te/rrBb1s8.HJs8IWNXSDeq^&J$6]n:sNli-s;q#:>qqZ$SJqYpNq +qYpStKDPTK]n=3%!!((>!JA)VrrK3RqYpNqqYpPJrVlj`rr3#4KDkiMKC/[=62plb]g;Vss+C@O +!!)ut!PO-brrn%gs8Tb4rr2srJcE+WJ,~> +`;^!n;ZHcuXT&5%!<<'!ZMt$..>-1Mrrgl)s/_.Xs8B#!.J`uD!;c]rXFpBLs+A2g!/&>l!J@KE +rrK3RqYpNqqYpPJrVljqrr3#LKDkiMKC8a>KDb`MXFpNPs+C@O!!)ut!E/(Zrr<&trrc6$s8PuJ +s0VfV~> +`;^!l +`;^!n;ZHcuXT&5%!<<'!ZMt$..>-1Mrrgl)s/_.Xs8B#!.J`uD!;c]rXFpBLs+A2g!/&>l!J@KE +rrK3RqYpNqqYpPJrVljqrr3#LKDkiMKC8a>KDb`MXFpNPs+C@O!!)ut!E/(Zrr<&trrc6$s8PuJ +s0VfV~> +`;]kOKDPTM!<<'!qu6bN!!%ZN!!>Le!($D\!(#?>#=26R!/#ni62Q97;YU4mK0f84!587/!!)lq +!N^qMrrIbc_Z'T9a8c0lo)A`lKDPTJ!;c]qKDkfMKDkfMKDkiMKC8d>KDb`TK>% +`;]kPJboBK!<<'!qu6bL!!%TL!!>Id!'p>[!'o9=#=)9S!.f\d5l6*4 +`;]kOKDPTM!<<'!qu6bN!!%ZN!!>Le!($D\!(#?>#=26R!/#ni62Q97;YU4mK0f84!587/!!)lq +!N^qMrrIbc_Z'T9a8c0lo)A`lKDPTJ!;c]qKDkfMKDkfMKDkiMKC8d>KDb`TK>% +_uB^&qYpWts8N))s8E!(6%ag']g;[N.K4r"62^c`KDPTJ!;c]rXFpBL!PO-&rr@\ls8R`BrrK3R +qYpNqqYpPJrVlkMrVlkMrVunMmf*=$62UZe!7h+%KE(s;rVlnNXT&5"62gfd6,! +_uB^%qYpWts8N))s8E!(5_4L#^-M^L./nbt5lCZ_JboBH!;c]rWe($H!PX-%rr@Vjs8RZ@rrK-N +qYpNqqYpPHrVlkKrVlkKrVunKmf*=%5l:Qd!7q1$JcGa8rVlnLWrE"u5lL]c5ed9u +_uB^&qYpWts8N))s8E!(6%ag']g;[N.K4r"62^c`KDPTJ!;c]rXFpBL!PO-&rr@\ls8R`BrrK3R +qYpNqqYpPJrVlkMrVlkMrVunMmf*=$62UZe!7h+%KE(s;rVlnNXT&5"62gfd6,! +]`/,JKE(rOZ2Xhj^&7m4KE$S*qYpQrKDPTJ!;c]rXFpBLs+A2g!/&>ls+BnB!N^qMrr<&qrr@]M +rr@]Mrr@]Ms8R`=s8PC^rrsp)6%f4;!;uis;Z?\"K0fP;K0fM:!/#k&[/YX~> +]`/,KJcG`MZ2Xhi^AS!5JcC;$qYpQrJboBH!;c]rWe($Hs+/&e!.i2js+0b@!NL_Irr<&qrr@WK +rr@WKrr@WKs8RZ;s8P@]rrsm&5_8t8!;uis +]`/,JKE(rOZ2Xhj^&7m4KE$S*qYpQrKDPTJ!;c]rXFpBLs+A2g!/&>ls+BnB!N^qMrr<&qrr@]M +rr@]Mrr@]Ms8R`=s8PC^rrsp)6%f4;!;uis;Z?\"K0fP;K0fM:!/#k&[/YX~> +\GlO/Z2XfVqu6bNs1PN1rrGF!qYpNqqYpStKDPWJK>RWgK?+#lKC]$CXFpBL!!)lq!/(7M!/(7M +!/(7M!(#rN!584.!58C3!!)orqL\d]rVljqJcE+WJ,~> +\GlO/Z2XfTqu6bLs1YN0rrGC!qYpNqqYpSrJboEHJ\qEeJ]IfjJb&gAWe($H!!)lq!.k+K!.k+K +!.k+K!'olM!5A:/!5AI4!!)orqLJX\rVljtJcE+WJ,~> +\GlO/Z2XfVqu6bNs1PN1rrGF!qYpNqqYpStKDPWJK>RWgK?+#lKC]$CXFpBL!!)lq!/(7M!/(7M +!/(7M!(#rN!584.!58C3!!)orqL\d]rVljqJcE+WJ,~> +\GlO/Z2XfVr;Qo5KE(tQqYpO]q>UF\qYpStKDPWJK>RWgK?+#lKC]$CXFpBL!!)lq!/(7M!/(7M +!/(7M!JA)Crr>@Rrr>rJs0VfV~> +\GlO/Z2XfTr;Qo6JcGbMqYpO\q>UF[qYpSrJboEHJ\qEeJ]IfjJb&gAWe($H!!)lq!.k+K!.k+K +!.k+K!J.uBrr>=Qrr?&Ms0VfV~> +\GlO/Z2XfVr;Qo5KE(tQqYpO]q>UF\qYpStKDPWJK>RWgK?+#lKC]$CXFpBL!!)lq!/(7M!/(7M +!/(7M!JA)Crr>@Rrr>rJs0VfV~> +\GlO/Z2XfVqu6bNs+@ELrr<&prr>@]rrK3RqYpSK]u'dLK?+#lKC]$CXFpBL!!)lq!/(7M!/(:N +!PO-as8R`/rr<&frrB-Os0VfV~> +\GlO/Z2XfTqu6bLs+.3Hrr<&prr>=\rrK-NqYpSI^;BmMJ]IfjJb&gAWe($H!!)lq!.k+K!.k.L +!PX-`s8RZ-rr<&frrB'Ms0VfV~> +\GlO/Z2XfVqu6bNs+@ELrr<&prr>@]rrK3RqYpSK]u'dLK?+#lKC]$CXFpBL!!)lq!/(7M!/(:N +!PO-as8R`/rr<&frrB-Os0VfV~> +\GlO/Z2XfVqu6bNs+@ELrr<&prr<&qrrK3RqYpSK]u'dLK?+#lKC]$CXFpEM!PJL0rr@]Mrr@]N +s8R`Ms8R`/rr<&frr@\&s0VfV~> +\GlO/Z2XfTqu6bLs+.3Hrr<&prr<&qrrK-NqYpSI^;BmMJ]IfjJb&gAWe('I!PSR1rr@WKrr@WL +s8RZKs8RZ-rr<&frr@V$s0VfV~> +\GlO/Z2XfVqu6bNs+@ELrr<&prr<&qrrK3RqYpSK]u'dLK?+#lKC]$CXFpEM!PJL0rr@]Mrr@]N +s8R`Ms8R`/rr<&frr@\&s0VfV~> +\GlO/Z2XfVqu6bNs+@ELrr>@\rr<&qrrK3RqYpSK]u'dLK?*umK>$jU!N^qMrr<&qrr@]Mrr>@a +rrKfcrVunMhu +\GlO/Z2XfTqu6bLs+.3Hrr>=[rr<&qrrK-NqYpSI^;BmMJ]IckJ\L^T!NL_Irr<&qrr@WKrr>=` +rrKibrVunKhu +\GlO/Z2XfVqu6bNs+@ELrr>@\rr<&qrrK3RqYpSK]u'dLK?*umK>$jU!N^qMrr<&qrr@]Mrr>@a +rrKfcrVunMhu +]Dhtcs8N)(rr@]Krr[oRK<4qL!/(+I!!)lq!N^qMs8R_grr>@*s8R`BrrK3RqYpNqqYpPJrVlkM +rVlkMrVlkMir9"2rr2ruoD\qZ^&S+bJcE+WJ,~> +]Dhtas8N)(rr@WIrr[iPJZASH!.jtG!!)lq!NL_Is8RYerr>=)s8RZ@rrK-NqYpNqqYpPHrVlkK +rVlkKrVlkKir9"0rr2ruoD\qY^An4aJcE+WJ,~> +]Dhtcs8N)(rr@]Krr[oRK<4qL!/(+I!!)lq!N^qMs8R_grr>@*s8R`BrrK3RqYpNqqYpPJrVlkM +rVlkMrVlkMir9"2rr2ruoD\qZ^&S+bJcE+WJ,~> +\GlO/Z2XfVqu6bNs+@ELrrE+PqYpNqqYpStKDPWJK89L,KC]$CXFpBL!!)lq!/(7M!/(7M!/(7M +s+B5/!!)Kf!/#k&[/YX~> +\GlO/Z2XfTqu6bLs+.3HrrE+NqYpNqqYpSrJboEHJVX:*Jb&gAWe($H!!)lq!.k+K!.k+K!.k+K +s+0)-!!)Kf!.f_$[/YX~> +\GlO/Z2XfVqu6bNs+@ELrrE+PqYpNqqYpStKDPWJK89L,KC]$CXFpBL!!)lq!/(7M!/(7M!/(7M +s+B5/!!)Kf!/#k&[/YX~> +\GlO/Z2XiW^&7m462uS=qYpNqq>UEpqYpStKDPWJK89L,KC]$CXFpBL!!)lq!/(7M!/(:Ns+C:M +!/'/.!!)Kf!)eCJ[/YX~> +\GlO/Z2XiU^AS!55lZD8qYpNqq>UEpqYpSrJboEHJVX:*Jb&gAWe($H!!)lq!.k+K!.k.Ls+1.K +!.j#,!!)Kf!*+UM[/YX~> +\GlO/Z2XiW^&7m462uS=qYpNqq>UEpqYpStKDPWJK89L,KC]$CXFpBL!!)lq!/(7M!/(:Ns+C:M +!/'/.!!)Kf!)eCJ[/YX~> +\GlO/Z2aiVr;QkOs+@ELrrE,$qYpNqqYpStKDPWJK>RWge]7^iKC]$CXFpEM!NZ:trr@]Mrr>sr +s8R`Mrr>sRrr<&frr>rJs0VfV~> +\GlO/Z2aiTr;QkMs+.3HrrE,"qYpNqqYpSrJboEHJ\qEef#RgjJb&gAWe('I!NH.rrr@WKrr?'u +s8RZKrr?'Urr<&frr?&Ms0VfV~> +\GlO/Z2aiVr;QkOs+@ELrrE,$qYpNqqYpStKDPWJK>RWge]7^iKC]$CXFpEM!NZ:trr@]Mrr>sr +s8R`Mrr>sRrr<&frr>rJs0VfV~> +\GlO/Z2XfVr;ZeL!rmnSqYpO]q>UEpqYpStKDPTKK>#/%!/&>l!JA)VrrK47qYpNqqYpPJrVlj` +rr<"NrVlitl2Lasre((I!($)R!)eCJ[/YX~> +\GlO/Z2XfTr;ZeJ!rmhOqYpO\q>UEpqYpSrJboBIJ\K#$!.i2j!J.uUrrK.6qYpNqqYpPHrVlj_ +rr<"LrVlitl2LatrdjqG!'p#Q!*+UM[/YX~> +\GlO/Z2XfVr;ZeL!rmnSqYpO]q>UEpqYpStKDPTKK>#/%!/&>l!JA)VrrK47qYpNqqYpPJrVlj` +rr<"NrVlitl2Lasre((I!($)R!)eCJ[/YX~> +_uBgk!/%u`rr]t7rrB>(s+C:Ms+:CQK<4qL!!)ip!!)lq!N^qMrr@\frr@\lrr@]ArrB.rrr<&q +rr@]Mrr>@as8R`Mrr<&brs45WK7gjiK2TD]rr<&frr>rJs0VfV~> +_uBgi!.hl_rr^"8rrB>(s+1.Ks+(7OJZASH!!)ip!!)lq!NL_Irr@Vdrr@Vjrr@W?rrB(prr<&q +rr@WKrr>=`s8RZKrr<&brs4/UJUtOdJQ9G_rr<&frr?&Ms0VfV~> +_uBgk!/%u`rr]t7rrB>(s+C:Ms+:CQK<4qL!!)ip!!)lq!N^qMrr@\frr@\lrr@]ArrB.rrr<&q +rr@]Mrr>@as8R`Mrr<&brs45WK7gjiK2TD]rr<&frr>rJs0VfV~> +_uBf=s4%,JrrYRerrB>(!JA)as8R]Qs+@ELrr<&prr<&qrrK3RqYpSK]u'dL]uU-QKCSsBXM+K1 +!!)lq!/(7M!/(:Ns+C:M!/'Y +_uBf=s4.2KrrYOdrrB>(!J.u`s8RWOs+.3Hrr<&prr<&qrrK-NqYpSI^;BmM^;p6RJara@WkS?0 +!!)lq!.k+K!.k.Ls+1.K!.jM:!C254rrGB9rr2run,EAfJcE+WJ,~> +_uBf=s4%,JrrYRerrB>(!JA)as8R]Qs+@ELrr<&prr<&qrrK3RqYpSK]u'dL]uU-QKCSsBXM+K1 +!!)lq!/(7M!/(:Ns+C:M!/'Y +`;fjis8W+Orr3'#s8N)(rrIbcrVunM!rmnSqYpNqq>UEpqYpStKDPTJK80C+KCSsBXFpEM!J<]7 +rr@]Mrr@]Ns8R`MrrIbcmJd.dq#: +`;fjgs8W+Mrr3'#s8N)(rrI\brVunK!rmhOqYpNqq>UEpqYpSrJboBHJVO1)Jara@We('I!J*N4 +rr@WKrr@WLs8RZKrrI\bmJd.dq#: +`;fjis8W+Orr3'#s8N)(rrIbcrVunM!rmnSqYpNqq>UEpqYpStKDPTJK80C+KCSsBXFpEM!J<]7 +rr@]Mrr@]Ns8R`MrrIbcmJd.dq#: +`;]girVm*g^&S*4s8N)(rr@]Ls8R]Qs+@ELrr<&prr<&qrrK3RqYpSK]ncXfKC]$CXFpBL!($J] +!/(7M!/(:Ns+C:Ms+Bb>!PO-\rr<&urr<&trrBb,!!@lRs&+FJ[/YX~> +`;]ggrVm*f^An35s8N)(rr@WJs8RWOs+.3Hrr<&prr<&qrrK-NqYpSI^5)agJb&gAWe($H!'pD\ +!.k+K!.k.Ls+1.Ks+0V +`;]girVm*g^&S*4s8N)(rr@]Ls8R]Qs+@ELrr<&prr<&qrrK3RqYpSK]ncXfKC]$CXFpBL!($J] +!/(7M!/(:Ns+C:Ms+Bb>!PO-\rr<&urr<&trrBb,!!@lRs&+FJ[/YX~> +`;]jj^&J$:K0fP;!<<'!Z2XfVr;ZeL!rmnSqYpNqq>UEpqYpStKDPTJK>IQf]uU0QKC]$CXM+N2 +!PJL0rr@]Mrr@]Mrr@]Mrr@]@\rrKf!rr2rur;Qapq>UT2KE(sLJcE+WJ,~> +`;]jh^Ae-;JO'88!<<'!Z2XfTr;ZeJ!rmhOqYpNqq>UEpqYpSrJboBHJ\h?d^;p9RJb&gAWkSB1 +!PSR1rr@WKrr@WKrr@WKrr@W:rr>=[rrKi!rr2rur;Qasq>UT3JcGaMJcE+WJ,~> +`;]jj^&J$:K0fP;!<<'!Z2XfVr;ZeL!rmnSqYpNqq>UEpqYpStKDPTJK>IQf]uU0QKC]$CXM+N2 +!PJL0rr@]Mrr@]Mrr@]Mrr@]@\rrKf!rr2rur;Qapq>UT2KE(sLJcE+WJ,~> +`;]kO!<)rt5m72fs8N)(rrIbcrVunM!rmnSqYpNqq>UEpqYpStKDPWJK>[]i]n=B*!JA)VrrB.s +rrIa +`;]kP!<)rt5Qq)es8N)(rrI\brVunK!rmhOqYpNqq>UEpqYpSrJboEHJ]%Kg^4F?)!J.uUrrB(q +rrI[9qYpPHrVlkKrr<"LrVlkKm/I1%5_6ZJrrI[9rVlitn,EAfJcE+WJ,~> +`;]kO!<)rt5m72fs8N)(rrIbcrVunM!rmnSqYpNqq>UEpqYpStKDPWJK>[]i]n=B*!JA)VrrB.s +rrIa +_uBai62gfe]`:@urrB>(!JA)as8R]Qs+@ELrr<&prr<&qrrK3RqZ$SJ_Z'Uga8Z-lnc&TjqYpT0 +KDY]KKDkfMKDtoNKDkfMKBiL6K)i"Nrr<&frr>rJs0VfV~> +_uBag5lL]d^&UFurrB>(!J.u`s8RWOs+.3Hrr<&prr<&qrrK-NqZ$SH_Z'Uea8Z-jnc&ThqYpT1 +Jc#KIJc5TKJc>]LJc5TKJa3:4JH2_Jrr<&frr?&Ms0VfV~> +_uBai62gfe]`:@urrB>(!JA)as8R]Qs+@ELrr<&prr<&qrrK3RqZ$SJ_Z'Uga8Z-lnc&TjqYpT0 +KDY]KKDkfMKDtoNKDkfMKBiL6K)i"Nrr<&frr>rJs0VfV~> +\GlO/Z2XfVr;ZeL!rmnSqYpNqq>UEpnc/WA_Z'Uga8Z-lnc&WkKDPTJKDPTJKDkfMKDtoNKDkfM +!8d_UKCAg?;M"kTs*t~> +\GlO/Z2XfTr;ZeJ!rmhOqYpNqq>UEpnc/W?_Z'Uea8Z-jnc&WiJboBHJboBHJc5TKJc>]LJc5TK +!8d_UJa`U= +\GlO/Z2XfVr;ZeL!rmnSqYpNqq>UEpnc/WA_Z'Uga8Z-lnc&WkKDPTJKDPTJKDkfMKDtoNKDkfM +!8d_UKCAg?;M"kTs*t~> +\GlO/Z2XiW^&A!2K*)(*XSVqs!;ZWp!:g'iK>#/%!/&>l!!)Qh!3H%s!J:CKrr@]Mrr@]Ns8R`M +rr<&Urr>@Rrr@\&s0VfV~> +\GlO/Z2XiU^A\*3JHGk&Wqu_q!;ZWp!:g'iJ\K#$!.i2j!!)Qh!35nq!J(7Irr@WKrr@WLs8RZK +rr<&Urr>=Qrr@V$s0VfV~> +\GlO/Z2XiW^&A!2K*)(*XSVqs!;ZWp!:g'iK>#/%!/&>l!!)Qh!3H%s!J:CKrr@]Mrr@]Ns8R`M +rr<&Urr>@Rrr@\&s0VfV~> +\GlO/Z2aiVrVunM!rmnSqYpNqq>UEpnc/WA_Z'Uga8Z-*nc&TjqZ$SJqYpPJrVlkMrr<"NrVlit +hZ!QUnG`R'!5590!/$F6J,~> +\GlO/Z2aiTrVunK!rmhOqYpNqq>UEpnc/W?_Z'Uea8Z-)nc&ThqZ$SHqYpPHrVlkKrr<"LrVlit +hZ!QUnG`R(!5>?1!.g:4J,~> +\GlO/Z2aiVrVunM!rmnSqYpNqq>UEpnc/WA_Z'Uga8Z-*nc&TjqZ$SJqYpPJrVlkMrr<"NrVlit +hZ!QUnG`R'!5590!/$F6J,~> +\GlO/Z2aiVrVunM!rmnSqYpNqq>UEpqYpStKDPWJKCSsA^"!&_]n=B*!!)Qh!3H%ss+C1J!/(7M +!/(:Ns+C:M!!(mU!!)Ng!eUK*VuQdLOoKq~> +\GlO/Z2aiTrVunK!rmhOqYpNqq>UEpqYpSrJboEHJara?^= +\GlO/Z2aiVrVunM!rmnSqYpNqq>UEpqYpStKDPWJKCSsA^"!&_]n=B*!!)Qh!3H%ss+C1J!/(7M +!/(:Ns+C:M!!(mU!!)Ng!eUK*VuQdLOoKq~> +\GlO/Z2XiWec#OJK*)(*XSVqs!;ZWp!;c]rXFpBL!J@KDrr<&_s8R`?rrLZ&r;Q`skl:[8kl1X8 +nc&Tjq>UGIqu?\KrVlkMrr<"NrVlithZ!RRnG`QB!/%3L!)epYJ,~> +\GlO/Z2XiUf)>XKJHGk&Wqu_q!;ZWp!;c]rWe($H!J.9@rr<&_s8RZ=rrL]%r;Q`skl:[6kl1X6 +nc&Thq>UGGqu?\IrVlkKrr<"LrVlithZ!RUnG`Q@!.h'J!*,-\J,~> +\GlO/Z2XiWec#OJK*)(*XSVqs!;ZWp!;c]rXFpBL!J@KDrr<&_s8R`?rrLZ&r;Q`skl:[8kl1X8 +nc&Tjq>UGIqu?\KrVlkMrr<"NrVlithZ!RRnG`QB!/%3L!)epYJ,~> +\GlO/Z2XfVr;ZeL!rmnSqYpNqq>UEpqYpTH^&%a/KCJm@!9jI_KCAg@]n?7_!!)6_s+BP8!($/T +!3H%s!PO-^rr@]Mrr@]Ns8R`Mrr<&Urr>@SrrI`PVZ-W^OT0h~> +\GlO/Z2XfTr;ZeJ!rmhOqYpNqq>UEpqYpTI^A@j0Jai[>!9jI_Ja`U>^4H4^!!)6_s+0D6!'p)S +!35nq!PX-]rr@WKrr@WLs8RZKrr<&Urr>=RrrIZNVZ-W]OT0h~> +\GlO/Z2XfVr;ZeL!rmnSqYpNqq>UEpqYpTH^&%a/KCJm@!9jI_KCAg@]n?7_!!)6_s+BP8!($/T +!3H%s!PO-^rr@]Mrr@]Ns8R`Mrr<&Urr>@SrrI`PVZ-W^OT0h~> +\GlO/Z2XfVr;ZeL!rmnSqYpNqq>UEpnc&TAnG`Igkl:[8mf*9>r;Q`skl:[8kl1X8nc&TjqZ$SJ +qu6]1KDtoNKDtoNKDkfM!8d_U!:^!h]`=u1!PO,Is*t~> +\GlO/Z2XfTr;ZeJ!rmhOqYpNqq>UEpnc&T?nG`Igkl:[6mf*9]LJc>]LJc5TK!8d_U!:^!h^&Y)2!PX,Hs*t~> +\GlO/Z2XfVr;ZeL!rmnSqYpNqq>UEpnc&TAnG`Igkl:[8mf*9>r;Q`skl:[8kl1X8nc&TjqZ$SJ +qu6]1KDtoNKDtoNKDkfM!8d_U!:^!h]`=u1!PO,Is*t~> +\c2`E!55]r;Q`skl:[8kl1X8nc&Tj +qZ$SJqYpPJrr3#4KDtoNKDkfM6/MVA!:Tpf!2oksK96+`~> +\c2`F!5>c=!J.u`s8RWOs+.3Hrr<&prr<&hrrI\bnc&Rhkl:[6mf*9]LJc5TK5i2M@!:Tpf!2oksJWTn^~> +\c2`E!55]r;Q`skl:[8kl1X8nc&Tj +qZ$SJqYpPJrr3#4KDtoNKDkfM6/MVA!:Tpf!2oksK96+`~> +g]%7>gAhCTK0]J;60!Rt62lK<6%_K%K*20?K.-faKE"79KE"4=K0`E3K)boJK)e4:!<7ZT6%aef +K7j.hre(4N$A26/K0]J;6%aeUrIY,:!;qKL619F,5lgA+!C6_`K)bo8KE"7.K*Ar@ec18Srr3#4 +!<.TNeb/qB;Z27Is8PC^s8PCarrGE +g]%7=gAhCWJNs285i[Cq5lQ<95_23!JHPs +g]%7>gAhCTK0]J;60!Rt62lK<6%_K%K*20?K.-faKE"79KE"4=K0`E3K)boJK)e4:!<7ZT6%aef +K7j.hre(4N$A26/K0]J;6%aeUrIY,:!;qKL619F,5lgA+!C6_`K)bo8KE"7.K*Ar@ec18Srr3#4 +!<.TNeb/qB;Z27Is8PC^s8PCarrGE +gA_-Qnc&[(!/'nC!!'e6!e\2"pAY.ZKDkiM5m%'PKDPTM!58F4qZ$[`K7j.h!eUIQqL\u!%IXB!'u/9rW)59#QKDVK7j4(^& +gA_-Qnc&[)!.jbA!!'e6!eJ)"pAY.YJc5WK5Q^sNJboBK!5AL5qZ$[_JV!ec!eC=OqLJi9!!$#M +JO'27!eET:rIOqJqLS5TJV!k$^AWT_^ANNa^AknInUU\SrVll3^&J'4 +O8j_~> +gA_-Qnc&[(!/'nC!!'e6!e\2"pAY.ZKDkiM5m%'PKDPTM!58F4qZ$[`K7j.h!eUIQqL\u!%IXB!'u/9rW)59#QKDVK7j4(^& +gA_-QnG`LhKCf*C!3uP(KDbcLK*)(*XSVr'!<<)4!%IpJ!/(.J!N^qMrrRfQ!<)ouK)k]H!!)ip +!keTIrr3&5!/(+Is+C.I!<>F`rr`=Ss1O'_rr<&prrPId^&@s35lg`\!C;A7rrTk6!<)p!K)e45 +rsM-+s8T2#K>%:N!($R9!C6_^KE"77KE"7:KE"7:KE"79KDbfIKDY]LKC8aB]`>bGs71dB!:YUB +5la4GK)e49KDY]L62U]_62U]_KDbf.rr@]9!:PO?^&EWaXT&5"^&7m1^&@s2^& +gA_-QnG`LhJb/mA!3uP(Jc,QJJHGk&Wqu`%!<<)5!%@jI!.k"H!NL_IrrR`O!<)ouJH5KF!!)ip +!knZKrr3&6!.jtGs+1"G!<>C_rr`=Qs1X'^rr<&prrPFc^A\'45QLW[!C254rrTn7!<)p!JH.t2 +rsM*+s8T,!J\M.L!'pL6!C-Y]JcA"4JcA"7JcA"7JcA"6Jc,TGJc#KJJaWO@^&YnIs71^@!:YO@ +5QF(EJH.t6Jc#KJ5l:T^5l:T^Jc,T,rr@W7!:PI=^A`Z`WrE"u^AS!2^A\'3^AWT_^AWTcf"V0u +^=rU;~> +gA_-QnG`LhKCf*C!3uP(KDbcLK*)(*XSVr'!<<)4!%IpJ!/(.J!N^qMrrRfQ!<)ouK)k]H!!)ip +!keTIrr3&5!/(+Is+C.I!<>F`rr`=Ss1O'_rr<&prrPId^&@s35lg`\!C;A7rrTk6!<)p!K)e45 +rsM-+s8T2#K>%:N!($R9!C6_^KE"77KE"7:KE"7:KE"79KDbfIKDY]LKC8aB]`>bGs71dB!:YUB +5la4GK)e49KDY]L62U]_62U]_KDbf.rr@]9!:PO?^&EWaXT&5"^&7m1^&@s2^& +gA_-QnGiLgoD\djZ2XiW^&A!2K*)(*eb]:P!<7ZO63$rb!($J]!N^qMrrRfQ!<)ouK)k]H!($D[ +!!)rs!<@cJs8R`IrrE+Pr;Qm"KE&W;r;Q`sq>UJJ!;uitK)k`Is+C.I!<@cMrrE+Pq>UGIq#:?p +KDkfNK)kcJs+C4Ks+C:M!/(:Ns+C:M",$UR62UZcK)gN(!($#P!!)Kf!)i=d!J:CCrrTk6XRZ;k +]`?si!PLerrrBb'rr>@`!!'^qs8PC_s8Te-rr]q76+u%QJ,~> +gA_-QnGiLgoD\djZ2XiU^A\*3JHGk&f)#CQ!<7TM5l^ia!'pD\!NL_IrrR`O!<)ouJH5KF!'p>Z +!!)rs!<@]Hs8RZGrrE+Nr;Qm"JcEH8r;Q`sq>UJH!;uitJH5NGs+1"G!<@]KrrE+Nq>UGGq#:?p +Jc5TLJH5QHs+1(Is+1.K!.k.Ls+1.K"+gIP5l:QbJH16$!'orO!!)Kf!*/Og!J(7ArrTn7Wq$)i +^&['j!PUhrrrBe(rr>=_!!'ars8P@^s8Th.rr]t85ec"QJ,~> +gA_-QnGiLgoD\djZ2XiW^&A!2K*)(*eb]:P!<7ZO63$rb!($J]!N^qMrrRfQ!<)ouK)k]H!($D[ +!!)rs!<@cJs8R`IrrE+Pr;Qm"KE&W;r;Q`sq>UJJ!;uitK)k`Is+C.I!<@cMrrE+Pq>UGIq#:?p +KDkfNK)kcJs+C4Ks+C:M!/(:Ns+C:M",$UR62UZcK)gN(!($#P!!)Kf!)i=d!J:CCrrTk6XRZ;k +]`?si!PLerrrBb'rr>@`!!'^qs8PC_s8Te-rr]q76+u%QJ,~> +gA_0R^%21)]`8'(rr<&(rr@]Ls8R]Ps+C.Is+:=P62poa!!%ZJrrK3RqYpVL!!)ut!J:CIrr>@[ +rr<&srrE+Pq>^JIq>UHqKDb`P!/(=OKDb`L!;ZWqK)kiL!J:CJs8R`IrrE+Pr;QctKDGNIKD>HI +!/(7M!J:CKs8R`Jrr@]NrrKfcrr<"NrVltPrr<&rrs")Us8Tb4614aQ!:TpfXRQ5jK)kHA!!)Kf +!!(pVs+BY;"bQf-K)e4#s8R`@rrE+PgAc[~> +gA_0R^@M:*^&S0)rr<&(rr@WJs8RWNs+1"Gs+(1N5lUf`!!%THrrK-NqYpVJ!!)ut!J(7Grr>=Z +rr<&srrE+Nq>^JGq>UHqJc,NN!.k1MJc,NJ!;ZWqJH5WJ!J(7Hs8RZGrrE+Nr;QctJbfrrE+NgAc[~> +gA_0R^%21)]`8'(rr<&(rr@]Ls8R]Ps+C.Is+:=P62poa!!%ZJrrK3RqYpVL!!)ut!J:CIrr>@[ +rr<&srrE+Pq>^JIq>UHqKDb`P!/(=OKDb`L!;ZWqK)kiL!J:CJs8R`IrrE+Pr;QctKDGNIKD>HI +!/(7M!J:CKs8R`Jrr@]NrrKfcrr<"NrVltPrr<&rrs")Us8Tb4614aQ!:TpfXRQ5jK)kHA!!)Kf +!!(pVs+BY;"bQf-K)e4#s8R`@rrE+PgAc[~> +gA_0RKC]$DK)boCrr<&(rr@]Ls8R]Qs+@ELrrPId!<)rt!!%ZJrrK3RqYpVL!!)ut!J:CIrr@]H +rr<&srrE+Pq>^JIq>UHqKDb`P!/(=OKDb`L!;ZWqK)kiL!J:CJs8R`IrrE*cr;QctKDGNIKD>HI +!/(7M!J:CKs8R`KrrKfcrr3#4KDtoNKDkfP62pq;qu6\L!<3!"]`<]Rrr<&frr>sdrrRfQKCf*E +]`>/(rrI`Phu<\/lMpm:s8N/6!(#iK!<@cArrE+PgAc[~> +gA_0RJb&gBJH,]Arr<&(rr@WJs8RWOs+.3HrrPFc!<)rt!!%THrrK-NqYpVJ!!)ut!J(7Grr@WF +rr<&srrE+Nq>^JGq>UHqJc,NN!.k1MJc,NJ!;ZWqJH5WJ!J(7Hs8RZGrrE*br;QctJbf]LJc5TN5lUh8qu6\J!<3!"^&W`Qrr<&frr?'grrR`OJb/mC +^&Y2'rrIZNhu<\-lMpm8s8N/7!'ocJ!<@]?rrE+NgAc[~> +gA_0RKC]$DK)boCrr<&(rr@]Ls8R]Qs+@ELrrPId!<)rt!!%ZJrrK3RqYpVL!!)ut!J:CIrr@]H +rr<&srrE+Pq>^JIq>UHqKDb`P!/(=OKDb`L!;ZWqK)kiL!J:CJs8R`IrrE*cr;QctKDGNIKD>HI +!/(7M!J:CKs8R`KrrKfcrr3#4KDtoNKDkfP62pq;qu6\L!<3!"]`<]Rrr<&frr>sdrrRfQKCf*E +]`>/(rrI`Phu<\/lMpm:s8N/6!(#iK!<@cArrE+PgAc[~> +gA_0RKC]$DK)boCrr<&(rr@]Ls8R]Qs+Al!rr[lR!($S`rr<%OqYpStKDPTLK)boMrrI`Pq#:>H +q#:^JIq>UHq62^``!/(+I!!)fo +!<@cNrrI`PqZ$SJqu?\Krr<"Nrr<"NrVltPrr@]KrrI`PrVlo3!:TpfKCAg?;Xj\fK)gPqrrRfQ +XRZ>j!!'^jrr<&as8R`NrrTk660\CM!/'e@!<@c+s*t~> +gA_0RJb&gBJH,]Arr<&(rr@WJs8RWOs+/burr[fP!'pM_rr<%MqYpSrJboBJJH,]KrrIZNq#:>F +q#:^JGq>UHq5lCW_!.jtG!!)fo +!<@]LrrIZNqZ$SHqu?\Irr<"Lrr<"LrVltNrr@WIrrIZNrVlo4!:TpfJa`U=!<@])s*t~> +gA_0RKC]$DK)boCrr<&(rr@]Ls8R]Qs+Al!rr[lR!($S`rr<%OqYpStKDPTLK)boMrrI`Pq#:>H +q#:^JIq>UHq62^``!/(+I!!)fo +!<@cNrrI`PqZ$SJqu?\Krr<"Nrr<"NrVltPrr@]KrrI`PrVlo3!:TpfKCAg?;Xj\fK)gPqrrRfQ +XRZ>j!!'^jrr<&as8R`NrrTk660\CM!/'e@!<@c+s*t~> +g]%>-!($P_!PO-`rrp)gs+::OoD\djZ2aiVrVunM!WRfLrr@]N!!%ZMs8N'!KDPTKXFpBL!eUIQ +rVlnN!;QQo62:H[!;uit!/(+Is+C.I!<@cMrr`=Ss8R`Lrr<&prrI`Pr;QeM!;ZZpKDGNJ!/(4L +!<@cJrr<&orrE+PrVlnN!;c`qKDY]KKDtoNKDtoNKDkfPKDtq(qu6\L!;uit;F0jQ!PO-SrrB.i +rrPIdKCf*EK)i"Cs8N'!KAcb0KBiL:KDkfO]`>b2s8N)hrrTk6!8@I'~> +g]%>+!'pJ^!PX-_rrp,fs+(.MoD\djZ2aiTrVunK!WR`Jrr@WL!!%TKs8N'!JboBIWe($H!eC=O +rVlnL!;QQo5kt?Z!;uit!.jtGs+1"G!<@]Krr`=Qs8RZJrr<&prrIZNr;QeK!;ZZpJbf]LJc>]LJc5TNJc>_$qu6\J!;uit +g]%>-!($P_!PO-`rrp)gs+::OoD\djZ2aiVrVunM!WRfLrr@]N!!%ZMs8N'!KDPTKXFpBL!eUIQ +rVlnN!;QQo62:H[!;uit!/(+Is+C.I!<@cMrr`=Ss8R`Lrr<&prrI`Pr;QeM!;ZZpKDGNJ!/(4L +!<@cJrr<&orrE+PrVlnN!;c`qKDY]KKDtoNKDtoNKDkfPKDtq(qu6\L!;uit;F0jQ!PO-SrrB.i +rrPIdKCf*EK)i"Cs8N'!KAcb0KBiL:KDkfO]`>b2s8N)hrrTk6!8@I'~> +g]%?*3NW,X$`m7-s8R.ms8UUuKCf*C!3uP(KDbcLK*)(*`W#lAePZC".0(gqs8N'!KDPTKXFpBL +!eUIQrVlnN!;QQo!;QQo!<)p!eGt6ts8R`IrrE*tr;Qm"KE(t(r;Q`sq>UJJ!;uitK)k`Is+C.I +!<=SHrrE+Pq>UEpq#:?pKDkfNK)kcJs+C4Ks+C=Ns+C=Ns+C:M",$URKDYZLK)kiL!cn@lo)Ab? +!)i=d!'0QKrr<$JoDegj!3G_jrr<%Oi;We0lMpm:r;Qgr!7gH9!iuA%nc&ZC!!(aQJ,~> +g]%?+33)lU$`[4,s8R(is8UXuJb/mA!3uP(Jc,QJJHGk&`r>uBel;^$-ib[os8N'!JboBIWe($H +!eC=OrVlnL!;QQo!;QQo!<)p!ec:9ss8RZGrrE+"r;Qm"JcGb$r;Q`sq>UJH!;uitJH5NGs+1"G +!<=PGrrE+Nq>UEpq#:?pJc5TLJH5QHs+1(Is+11Ls+11Ls+1.K"+gIPJc#HJJH5WJ!c\4ko)Ab> +!*/Og!''KJrr<$IoDegj!35Shrr<%Mi;We.lMpm8r;Qgu!7pN:!ic5#nc&ZA!!(aQJ,~> +g]%?*3NW,X$`m7-s8R.ms8UUuKCf*C!3uP(KDbcLK*)(*`W#lAePZC".0(gqs8N'!KDPTKXFpBL +!eUIQrVlnN!;QQo!;QQo!<)p!eGt6ts8R`IrrE*tr;Qm"KE(t(r;Q`sq>UJJ!;uitK)k`Is+C.I +!<=SHrrE+Pq>UEpq#:?pKDkfNK)kcJs+C4Ks+C=Ns+C=Ns+C:M",$URKDYZLK)kiL!cn@lo)Ab? +!)i=d!'0QKrr<$JoDegj!3G_jrr<%Oi;We0lMpm:r;Qgr!7gH9!iuA%nc&ZC!!(aQJ,~> +gA_/Sq#C@[!UJJ^%q[/!/(4L"9=)Ss+C7L!!)ip!J:CMrrI`Pq>^JIq>UHqKDb`M +!/(+I!!)fo!<@cNrrI`PqZ$SJqu?\Krr<"Nrr<"NrVltP]`<]^rrI`Pqu6ZsKC]'B!!#=SrrB.j +rr]q7!/'nCrr<%Onc/Rgi;We0lMpm:qu6ZsKC&U?K)bn(o)J[h!/'&+J,~> +gA_/Qq#C@Z!UJH^A7d0!.k(J"9=#Qs+1+J!!)ip!J(7KrrIZNq>^JGq>UHqJc,NK +!.jtG!!)fo!<@]LrrIZNqZ$SHqu?\Irr<"Lrr<"LrVltN^&W`]rrIZNqu6ZsJb&j@!!#:RrrB(h +rr]t8!.jbArr<%Mnc/Rgi;We.lMpm8qu6ZsJaEC=JH,\$o)J[h!.io)J,~> +gA_/Sq#C@[!UJJ^%q[/!/(4L"9=)Ss+C7L!!)ip!J:CMrrI`Pq>^JIq>UHqKDb`M +!/(+I!!)fo!<@cNrrI`PqZ$SJqu?\Krr<"Nrr<"NrVltP]`<]^rrI`Pqu6ZsKC]'B!!#=SrrB.j +rr]q7!/'nCrr<%Onc/Rgi;We0lMpm:qu6ZsKC&U?K)bn(o)J[h!/'&+J,~> +gA_.Nq#:GK!!(RJrr@]Brr<&(rr@]Ls8R][s+@EQ]`8&Gs8R]OKDkiM!!%ZJrrK3RqYpVL!!)ut +!J:CIrr@]Hrr<&srrE+Pq>^JIq>^Hpr;Qm"KE(t(r;Q`sq>UJJ!;uitK)k`Is+C.I!<>F`rrE+P +q>UEpq#:?pKDkfNK)kcJs+C4Ks+C=Ns+C=Ns+C:Ms+:=PKDYZLK)kfK!<@cCs8N'!^$u%%;XaVc +61OsT61=gR!8meVKBiL:KDYZLK)k6;s$?2T!keS"gAc[~> +gA_.Qq#:GI!!(UKrr@W@rr<&(rr@WJs8RWYs+.3M^&S/Is8RWMJc5WK!!%THrrK-NqYpVJ!!)ut +!J(7Grr@WFrr<&srrE+Nq>^JGq>^Hpr;Qm"JcGb$r;Q`sq>UJH!;uitJH5NGs+1"G!<>C_rrE+N +q>UEpq#:?pJc5TLJH5QHs+1(Is+11Ls+11Ls+1.Ks+(1NJc#HJJH5TI!<@]As8N'!^@;.& +gA_.Nq#:GK!!(RJrr@]Brr<&(rr@]Ls8R][s+@EQ]`8&Gs8R]OKDkiM!!%ZJrrK3RqYpVL!!)ut +!J:CIrr@]Hrr<&srrE+Pq>^JIq>^Hpr;Qm"KE(t(r;Q`sq>UJJ!;uitK)k`Is+C.I!<>F`rrE+P +q>UEpq#:?pKDkfNK)kcJs+C4Ks+C=Ns+C=Ns+C:Ms+:=PKDYZLK)kfK!<@cCs8N'!^$u%%;XaVc +61OsT61=gR!8meVKBiL:KDYZLK)k6;s$?2T!keS"gAc[~> +gA_.NqYpc56,!.X"!/'kB!!';(!JA)as8R]Us+@Dd!!'_3rrRfQ62gi`!!%ZJrrK3RqYpYM +!!(RKrrI`Pq#:^JIq>UHq +KDb`M!/(+I!!)fo!<@cNrrI`PqZ$SJqu?\Krr<"Nrr<"NrVunM!<@cLrrI`Pqu6Zs61Y$V5lgBR +!)i:c!/'hA!/'b?!!(sWs+BV:s+C4K!J:C +gA_.QqYpc65ed9u."VBt!.j_@!!';(!J.u`s8RWSs+.2a!!'b4rrR`O5lL`_!!%THrrK-NqYpYK +!!(ULrrIZNq#:^JGq>UHq +Jc,NK!.jtG!!)fo!<@]LrrIZNqZ$SHqu?\Irr<"Lrr<"LrVunK!<@]JrrIZNqu6Zs5k=pU5QL9Q +!*/Lf!.j\?!.jV=!!(sWs+0J8s+1(I!J(7:s8RZ>rr@W's*t~> +gA_.NqYpc56,!.X"!/'kB!!';(!JA)as8R]Us+@Dd!!'_3rrRfQ62gi`!!%ZJrrK3RqYpYM +!!(RKrrI`Pq#:^JIq>UHq +KDb`M!/(+I!!)fo!<@cNrrI`PqZ$SJqu?\Krr<"Nrr<"NrVunM!<@cLrrI`Pqu6Zs61Y$V5lgBR +!)i:c!/'hA!/'b?!!(sWs+BV:s+C4K!J:C +gA_.Nqu6`2!58@2s$?\b!/'kB!(!mi!/(4Ls+:LTK<,%Q^&@s4K)boMs8N'!KDPTKXFpBL"+pRR +ec,RLK)k]H!/((H!!)rs!<@cJrr@]HrrE+Pr;Qm"KE(t(r;Q`sq>UJJ!;uitK)k`Is+C.I!<@cM +rrE+Pq>UEpq#:?pKDkfNK)kcJs+C4Ks+C=Ns+C=Ns+C:M"+pRRKDYZLK)kfKrrDWi!J:C@rr@]K +rr>@\!<2uu!:g'hKCAg?6/_eCKBiL:KDYZMK)jHgrr@]?rr@])s*t~> +gA_.Qqu6`3!5AF3s$6Va!.j_@!'mgh!.k(Js+(@RJZ8\M^A\'5JH,]Ks8N'!JboBIWe($H"+^FP +f)G[MJH5KF!.jqF!!)rs!<@]Hrr@WFrrE+Nr;Qm"JcGb$r;Q`sq>UJH!;uitJH5NGs+1"G!<@]K +rrE+Nq>UEpq#:?pJc5TLJH5QHs+1(Is+11Ls+11Ls+1.K"+^FPJc#HJJH5TIrrDWi!J(7>rr@WI +rr>=[!<2uu!:g'hJa`U=5iD\BJa3:8Jc#HKJH49frr@W=rr@W's*t~> +gA_.Nqu6`2!58@2s$?\b!/'kB!(!mi!/(4Ls+:LTK<,%Q^&@s4K)boMs8N'!KDPTKXFpBL"+pRR +ec,RLK)k]H!/((H!!)rs!<@cJrr@]HrrE+Pr;Qm"KE(t(r;Q`sq>UJJ!;uitK)k`Is+C.I!<@cM +rrE+Pq>UEpq#:?pKDkfNK)kcJs+C4Ks+C=Ns+C=Ns+C:M"+pRRKDYZLK)kfKrrDWi!J:C@rr@]K +rr>@\!<2uu!:g'hKCAg?6/_eCKBiL:KDYZMK)jHgrr@]?rr@])s*t~> +gA_.Nqu6Z0qYpYMs8R`Brr<&(rr@]Ls8R]Ss+::O^&7m3K)boMs8N'!KDPTKXFpBL!eUIQrVlnN +!;QQoKD>HH!;uit!/(+I!/((H!<@cMrr`=Ss1O'_rr<&prrI`Pr;ZeLq>^JIq>UHqKDb`M!/(+I +!!)fo!<@cNrrI`PqZ$SJqu?\Krr<"Nrr<"NrVltP!!%ZKrrI`Pqu?Zro)A`C!:TpfKD#6GK)iUa +rr<&hrr@]?rr>@CrrIbclMgm;!;lctK)i">rrIbcnG`K@g&HR~> +gA_.Qqu6Z1qYpYKs8RZ@rr<&(rr@WJs8RWQs+(.M^AS!4JH,]Ks8N'!JboBIWe($H!eC=OrVlnL +!;QQoJb]6F!;uit!.jtG!.jqF!<@]Krr`=Qs1X'^rr<&prrIZNr;ZeJq>^JGq>UHqJc,NK!.jtG +!!)fo!<@]LrrIZNqZ$SHqu?\Irr<"Lrr<"LrVltN!!%TIrrIZNqu?Zro)A`A!:TpfJbB$EJH3F` +rr<&hrr@W=rr>=BrrI\blMgm9!;lctJH2_:rrI\bnG`K>g&HR~> +gA_.Nqu6Z0qYpYMs8R`Brr<&(rr@]Ls8R]Ss+::O^&7m3K)boMs8N'!KDPTKXFpBL!eUIQrVlnN +!;QQoKD>HH!;uit!/(+I!/((H!<@cMrr`=Ss1O'_rr<&prrI`Pr;ZeLq>^JIq>UHqKDb`M!/(+I +!!)fo!<@cNrrI`PqZ$SJqu?\Krr<"Nrr<"NrVltP!!%ZKrrI`Pqu?Zro)A`C!:TpfKD#6GK)iUa +rr<&hrr@]?rr>@CrrIbclMgm;!;lctK)i">rrIbcnG`K@g&HR~> +gA_.NnG`K@o)A[iZ2XfVr;ZeL"91Xe^&.g2K)boMs8N'!KDPTKXFpBL!eUIQrVlnN!;QQoKD>HH +!;uls!;V6J!($I6!`B#Nr;R-)6%_HhXFl0*]`<]]rrPId^&@s36%f"5s+C.I!<@cNrrTk6KDGNI +!;ZWr]`<]`rrI`PqZ$SJqu?\Krr<"Nrr<"NrVltP!!%ZKrrI`Pqu6\L!:p-jK)kB?!)iOj!j"]$ +rVlitnc&TAn,EB?i;We0l2Ld:62UZ`K)jHgrr@]?rr@])s*t~> +gA_.QnG`K>o)A[iZ2XfTr;ZeJ"91Ud^AIp3JH,]Ks8N'!JboBIWe($H!eC=OrVlnL!;QQoJb]6F +!;uls!;V0H!'pC3!`]5Or;R-)5_20cWe#a$^&W`\rrPFc^A\'45_8b2s+1"G!<@]LrrTn7Jbf +gA_.NnG`K@o)A[iZ2XfVr;ZeL"91Xe^&.g2K)boMs8N'!KDPTKXFpBL!eUIQrVlnN!;QQoKD>HH +!;uls!;V6J!($I6!`B#Nr;R-)6%_HhXFl0*]`<]]rrPId^&@s36%f"5s+C.I!<@cNrrTk6KDGNI +!;ZWr]`<]`rrI`PqZ$SJqu?\Krr<"Nrr<"NrVltP!!%ZKrrI`Pqu6\L!:p-jK)kB?!)iOj!j"]$ +rVlitnc&TAn,EB?i;We0l2Ld:62UZ`K)jHgrr@]?rr@])s*t~> +gA_/*o`#*.KE(t(^%;7(!3uP(KDbcLK*"==KDPTLK)boMs8N'!KDPTKXFpBL!eUIQrVlnN!;QQo +KDGNJ]`A!1li7$@CrrIbclMpm:qu6_M!7gH9s+Bh@!JA)>s*t~> +gA_/(o`#*/JcGb$^@V@)!3uP(Jc,QJJHA(:JboBJJH,]Ks8N'!JboBIWe($H!eC=OrVlnL!;QQo +Jbf]M5lH96!!#:]JcA"4 +JcA"7Jc@t@^4Ci#5_4LdJc5WL5l6*55QL\4rrDnHrr2uLrVlqM!5@t&!*/dn!PVS2rr<&hrr@W= +rr>=BrrI\blMpm8qu6_K!7pN:s+0\>!J.u=s*t~> +gA_/*o`#*.KE(t(^%;7(!3uP(KDbcLK*"==KDPTLK)boMs8N'!KDPTKXFpBL!eUIQrVlnN!;QQo +KDGNJ]`A!1li7$@CrrIbclMpm:qu6_M!7gH9s+Bh@!JA)>s*t~> +gA_/Sp\tK3K.2Gds8R`Drr]r#!("b[s8N)4nG`L%rr3!b^&@s2KDkiNXSVtr!<)rt!!#=]K)mDe +qL\i8!!)ut!eUJ=rdtQkK7h^,63"Xu]tOFF!J:CMs8Duu^&J$9.KBE6]tFFDs8N'!62^c^!!5Fd +XT&5%5lcPNrdt2:r;Zi2rVlma!;ZZp!;c]sK)e49rrTk6KDGNJ!587/!^Qg=rVlpb!/(7M$bcR+ +!/(=O]n:q;62lK@5lcOi5l^oaKDbcM62Q<7!!#=_KDtrBKDtoOKCJm@;Y^:l62LT]!:g'hKCAg? +KAcb1K>$RMs$?P^!eUKSm/I' +gA_/Qp\tK4JLH)`s8RZBrr]u#!'n\Xs8N)5nG`L&rr3!a^A\'3Jc5WLWqubp!<)rt!!#:\JH7/a +qLJ]5!!)ut!eC>:rdbEjJUuC'5l\Ru^:sUH!J(7Ks8Duu^Ae-:.0'<4^:jUFs8N'!5lCZ]!!5Cc +WrE##5QHALrdb&7r;Zi3rVlm`!;ZZp!;c]sJH.t6rrTn7Jbf`@Jc>]MJai[> +gA_/Sp\tK3K.2Gds8R`Drr]r#!("b[s8N)4nG`L%rr3!b^&@s2KDkiNXSVtr!<)rt!!#=]K)mDe +qL\i8!!)ut!eUJ=rdtQkK7h^,63"Xu]tOFF!J:CMs8Duu^&J$9.KBE6]tFFDs8N'!62^c^!!5Fd +XT&5%5lcPNrdt2:r;Zi2rVlma!;ZZp!;c]sK)e49rrTk6KDGNJ!587/!^Qg=rVlpb!/(7M$bcR+ +!/(=O]n:q;62lK@5lcOi5l^oaKDbcM62Q<7!!#=_KDtrBKDtoOKCJm@;Y^:l62LT]!:g'hKCAg? +KAcb1K>$RMs$?P^!eUKSm/I' +gA_/Sq>^JIs$6Y8rVlkMoD\hW!;(mG^&N_uc[u3`on*8F62lK?5l^mN!)iZGrVupare'M:rVlkM +li?t`rW)os#D5>BKE(tb62gi`!!#=_s8E!"s$8+4rrE*crVll2r;ccq!/'Y=!/(4Lli7$s8R`@s8R`*s*t~> +gA_/Qq>^JGs$-S8rVlkKoD\hV!;(gE^Aibuc[c']omm,D5lQ<<5QCdL!*/lHrVup`rdjA8rVlkK +li?t`rW)os#D#/?JcGba5lL`_!!#:^s8E!"s$/"2rrE*brVll3r;ccq!.jM;!.k(Jli7$:rVlkK +n,NH>rr2tLo)S[frr<&5r;Zcs!5A()!J(7>rr=JDrrTn7^A7d/!:g'hJa`U=J`-S.Ja3:8Jc#HK +JH2_:s8RZ>s8RZ(s*t~> +gA_/Sq>^JIs$6Y8rVlkMoD\hW!;(mG^&N_uc[u3`on*8F62lK?5l^mN!)iZGrVupare'M:rVlkM +li?t`rW)os#D5>BKE(tb62gi`!!#=_s8E!"s$8+4rrE*crVll2r;ccq!/'Y=!/(4Lli7$s8R`@s8R`*s*t~> +gA_/*qu6i5!($YbKDb`LKCf*DK)i1V!/(7M"@3#Rs+C.I!eUIQrVufr!58C3$:+Y@KE&VN63$tu +rW)os%>+W\63"Va63$tu!!%ZMrr>@a!;ulr!!#=`s8IZMrrKf!rr;uu!/(4Lrr<1Ss8UV8rr3!! +^&7m1KDklKrr@]M!<%NO5la4LK*;7-5l^n;r;Zcs!%Io"#=/?BK)e2i!<%QL!!%ZMrr@]?!<2uu +KCf-D62Q<7!;hEK!!#=VK)n7K)e2i!!%X;!!)rs!eUJ=qh+nJ!!)Qh!/'b?!/'50s+BV: +!J:CLrrI`Pli-s;n,NE?gAc[~> +gA_/(qu6i6!'pSaJc,NJJb/mBJH2tT!.k+K"@)rPs+1"G!eC=OrVufr!5AI4$:"S>JcEGL5l^ku +rW)os%=nKZ5l\P`5l^ku!!%TKrr>=`!;ulr!!#:_s8ITKrrKi!rr;uu!.k(Jrr<1Qs8UY8rr3!! +^AS!2Jc5ZIrr@WK!<%HM5QF(JJHZ%)5QCe8r;Zcs!%@ht#=&9?JH.rd!<%KJ!!%TKrr@W=!<2uu +Jb/pB5l6-4!;h?I!!#:UJH8"9pjic;JH.rd!!%R8!!)rs!eC>:qgnbH!!)Qh!.jV=!.j).s+0J8 +!J(7JrrIZNli-s9n,NE=gAc[~> +gA_/*qu6i5!($YbKDb`LKCf*DK)i1V!/(7M"@3#Rs+C.I!eUIQrVufr!58C3$:+Y@KE&VN63$tu +rW)os%>+W\63"Va63$tu!!%ZMrr>@a!;ulr!!#=`s8IZMrrKf!rr;uu!/(4Lrr<1Ss8UV8rr3!! +^&7m1KDklKrr@]M!<%NO5la4LK*;7-5l^n;r;Zcs!%Io"#=/?BK)e2i!<%QL!!%ZMrr@]?!<2uu +KCf-D62Q<7!;hEK!!#=VK)n7K)e2i!!%X;!!)rs!eUJ=qh+nJ!!)Qh!/'b?!/'50s+BV: +!J:CLrrI`Pli-s;n,NE?gAc[~> +gA_.NqYp]3!/!Rir;QbLoD\iD!3uP(KDtlQ5l^n;p\t;I!!)utr;Zi2rVlpb!58C3"$sX#s8E#s +rr[lR!/(:N#!os&s+A";r;Z`rr;Z`r!J:CMrrIbcrr32963$rb!/(4Lrr<%Orr<#3s8N0$s1O'` +s8E#rrrn#T!<7\(rVlmaKDkfRK=um;!/(4Lrr<$srVm*g^&J*4s1PN5s8DuuKDkfYK)e4;s$;;; +s1Q*3KDtlP]`:@trsFAY63$t;5s`3a^&A!3KDYZLK)kfKrrDWi!J:C@rr<&rs7h3K^&S*4nc&TA +n,E@fi;`h0lMgm;62UZ`K)jHgrrIbcnGiN@gAc[~> +gA_.QqYp]4!.dCdr;QbJoD\iB!3uP(Jc>ZO5QCe8p\t;G!!)utr;Zi3rVlpa!5AI4"$jU#s8E#s +rr[fP!.k.L#!fp&s+.n8r;Z`rr;Z`r!J(7KrrI\brr32:5l^ia!.k(Jrr<%Mrr<#4s8N0$s1X'_ +s8E#rrrmrR!<7V$rVlm`Jc5TPJ\H[8!.k(Jrr<%!rVm*f^Ae35s1YN4s8DuuJc5TWJH.t8s$2/8 +s1Z34Jc>ZN^&UFtrsF;W5l^k85X<'`^A\*4Jc#HJJH5TIrrDWi!J(7>rr<&rs7h-I^An35nc&T? +n,E@fi;`h.lMgm95l:Q_JH49frrI\bnGiN>gAc[~> +gA_.NqYp]3!/!Rir;QbLoD\iD!3uP(KDtlQ5l^n;p\t;I!!)utr;Zi2rVlpb!58C3"$sX#s8E#s +rr[lR!/(:N#!os&s+A";r;Z`rr;Z`r!J:CMrrIbcrr32963$rb!/(4Lrr<%Orr<#3s8N0$s1O'` +s8E#rrrn#T!<7\(rVlmaKDkfRK=um;!/(4Lrr<$srVm*g^&J*4s1PN5s8DuuKDkfYK)e4;s$;;; +s1Q*3KDtlP]`:@trsFAY63$t;5s`3a^&A!3KDYZLK)kfKrrDWi!J:C@rr<&rs7h3K^&S*4nc&TA +n,E@fi;`h0lMgm;62UZ`K)jHgrrIbcnGiN@gAc[~> +gA_/*p\t;I!3H/!!/'nC!eUKdZMt/^s8P@b5s^.trrRfQKDkiL!<5=b^&@s2.K'2I6,!t(6+su2!!%ZKrrIa +gA_/(p\t;G!36"t!.jbA!eC?cZMt/\s8P=a5X9nprrR`OJc5WJ!<5:a^A\'3./a)H5ed9t!<)p" +JH,\$rr35;!<<(Ms8RZKrrR`O!;ulr!!E885ed6t!J*N7rrp,%rr<%Mr;Z`r!.k%I"@3"e5X>>K +rW)lr#(ZaSs8P?8rr3"M5lCW^5lL``Jc,QI!!'b4rr]u#JH5]L!%@jHrVuqLrVlqM!.k.L!C4Bt +rrGC9rr3!!Jc>ZVJO"dds+,b$5eau3!!%TIrrI[9qu?Zro)A`A!:Tpf +gA_/*p\t;I!3H/!!/'nC!eUKdZMt/^s8P@b5s^.trrRfQKDkiL!<5=b^&@s2.K'2I6,!t(6+su2!!%ZKrrIa +gA_/2p&G#ms8N(OoD\k@!/%TW$%o<.!3H3QKE&%KrrRfQ.K0;G!<<*!KDtlPX=;]urrIaMrW)os +"G6[S.Fn@r$`o!\s/],Ks8R]O!;ulr!<<'"ePcDH"+sK#ec,ROePZAIKDbcK!!+NHrVlmI!<3!# +eZAfNrW)lr!`B!urr34UXT/s&,rueUo=M!!%ZKrrI`Pqu6[G;Y'hg;?64d!NZ:irr<&hrr>sc +rr@]0s8R`:rrI`Pqu6\L!:0XbKCAj?KA-?U~> +gA_/4p&G#ks8N(MoD\k?!.hHU$%]*)!36'MJcDbGrrR`O./j2F!<<*!Jc>ZNW[QHsrrI[NrW)os +"G$OQ.+\=r$`\dXs/K)Ms8RWM!;ulr!<<'"elD_L"+aH#f)G[Pel;\MJc,QI!!+KJrVlmH!<3!# +euJcMrW)lr!`]4#rr34SWrN*MJcC<"rrZ7$!.k(Jrr<+?O +rVlktr;Qq?f)PaMJc>]LJI);8s&H*!eq#7K!!%TIrrIZNqu6[F +gA_/2p&G#ms8N(OoD\k@!/%TW$%o<.!3H3QKE&%KrrRfQ.K0;G!<<*!KDtlPX=;]urrIaMrW)os +"G6[S.Fn@r$`o!\s/],Ks8R]O!;ulr!<<'"ePcDH"+sK#ec,ROePZAIKDbcK!!+NHrVlmI!<3!# +eZAfNrW)lr!`B!urr34UXT/s&,rueUo=M!!%ZKrrI`Pqu6[G;Y'hg;?64d!NZ:irr<&hrr>sc +rr@]0s8R`:rrI`Pqu6\L!:0XbKCAj?KA-?U~> +gA_/*nG`K@oDegj!/%TW$%i3X^&S+bKE$T"rrRfQ!<)rs!"+AYs1O'bs/c5dKDkfMKDklLrrn#T +!'roarVlnN62gfeKE(t(!!)rsrW)fp"9AK%6%f.9rr<%Or;Z`r!keSdrVllu^&7m1ec#RHs8Duu +^&.j0K*)(d62pldK)bn(r;Zcs"0DMg62gi`62gf`KDbcM^&@s5K)bnbp\t@^KDtq(rr3-fKE(t( +!<)ot62giaKDYZLK)kfKrrDWirr<%Onc&WB!:Tpf!:g'h61=gRKAce0KBiI;K)kfK!eUKSm/I'< +n,NE?gAc[~> +gA_/(nG`K>oDegj!.hHU$%W'V^An4aJcC;srrR`O!<)rs!"+;Ws1X'as/Q)aJc5TKJc5ZJrrmrR +!'if`rVlnL5lL]dJcGb$!!)rsrW)fp"9AK%5_8n6rr<%Mr;Z`r!knYcrVllu^AS!2f)>[Is8Duu +^AIs1JHGkc5lUccJH,\$r;Zcs"02Ad5lL`_5lL]_Jc,QK^A\'6JH,\ap\t@]Jc>_$rr3-eJcGb$ +!<)ot5lL``Jc#HJJH5TIrrDWirr<%Mnc&W@!:Tpf!:g'h5k"^QJ`-S.Ja379JH5TI!eC?Om/I': +n,NE=gAc[~> +gA_/*nG`K@oDegj!/%TW$%i3X^&S+bKE$T"rrRfQ!<)rs!"+AYs1O'bs/c5dKDkfMKDklLrrn#T +!'roarVlnN62gfeKE(t(!!)rsrW)fp"9AK%6%f.9rr<%Or;Z`r!keSdrVllu^&7m1ec#RHs8Duu +^&.j0K*)(d62pldK)bn(r;Zcs"0DMg62gi`62gf`KDbcM^&@s5K)bnbp\t@^KDtq(rr3-fKE(t( +!<)ot62giaKDYZLK)kfKrrDWirr<%Onc&WB!:Tpf!:g'h61=gRKAce0KBiI;K)kfK!eUKSm/I'< +n,NE?gAc[~> +gA_.Nqu6Z0q1J_I!/'nCrr<%OZi:-@!!'_3s8R]Qs+AkurrRfQ!<)rs!!'_0rrc65s$=?ss8E#s +rs")U!/(;;62gfa!58@2s1SC3r;Z`r!58@2!e\/drr2u3rVult!/(4Lrr<-es8OPHs8N'!^&@s2 +.K0>Fs8;otec#LVK)gQ(s1JF4s+::OKDbcL!!B>&s1S@1!PLetrrBb3!!%ZMrrdrS5s`3_rrIa< +rVum`!<@cOrrE*crr3!!KDtlNKDkiNKDYZLK)kfKrrDWirr<%Onc&WB!;lcr^%q[1^&S+bnc&TA +n,EARhu<[BlMgm;62UZ`K)i">rr@]?rrIbcgAc[~> +gA_.Qqu6Z1q18SG!.jbArr<%MZi:-A!!'b4s8RWOs+/btrrR`O!<)rs!!'b1rrc?9s$4UWJH19$s1SL5s+(.MJc,QJ!!B8$s1\F2!PUhtrrBe4!!%TKrrdlQ5X<'^rrI[9 +rVum_!<@]MrrE*brr3!!Jc>ZLJc5WLJc#HJJH5TIrrDWirr<%Mnc&W@!;lcr^A7d2^An4anc&T? +n,EAQhu<[AlMgm95l:Q_JH2_:rr@W=rrI\bgAc[~> +gA_.Nqu6Z0q1J_I!/'nCrr<%OZi:-@!!'_3s8R]Qs+AkurrRfQ!<)rs!!'_0rrc65s$=?ss8E#s +rs")U!/(;;62gfa!58@2s1SC3r;Z`r!58@2!e\/drr2u3rVult!/(4Lrr<-es8OPHs8N'!^&@s2 +.K0>Fs8;otec#LVK)gQ(s1JF4s+::OKDbcL!!B>&s1S@1!PLetrrBb3!!%ZMrrdrS5s`3_rrIa< +rVum`!<@cOrrE*crr3!!KDtlNKDkiNKDYZLK)kfKrrDWirr<%Onc&WB!;lcr^%q[1^&S+bnc&TA +n,EARhu<[BlMgm;62UZ`K)i">rr@]?rrIbcgAc[~> +gA_.Nqu6c35la4KKE(rOKCf*EK)iTlrr^dO!58@2s+:@P^%q^-!<)rs!!#=_rrIa$rr2tNrVuis +rVm+T!!%ZOs$;;:rrTk6^&@s262gl^s8E!!6%f.9!C;A6s8N'!KDbcL!!%ZHrrGF!rr2uKrW)lr +rVutO.K08JK)iU^rr[lR!/(4Lrr<&#q#:AI62gi_!!%ZMrrn#TKE"5irr3%P!($S`!eUK*rr;uu +rr3/86,! +gA_.Qqu6c45QF(IJcG`MJb/mCJH3Ekrr^gP!5AF3s+(4N^A7g.!<)rs!!#:^rrI[!rr2tLrVuis +rVm+R!!%TMs$2/7rrTn7^A\'35lLc]s8E!!5_8n6!C253s8N'!Jc,QJ!!%TFrrGC!rr2uLrW)lr +rVutM./j/IJH3F]rr[fP!.k(Jrr<&!q#:AG5lL`^!!%TKrrmrRJc@udrr3%N!'pM_!eC?&rr;uu +rr3/95ed9uJc5WLJc#HJJH5TIrrDWirr<%Mnc&YU!5AC2!!)kH"@.P +gA_.Nqu6c35la4KKE(rOKCf*EK)iTlrr^dO!58@2s+:@P^%q^-!<)rs!!#=_rrIa$rr2tNrVuis +rVm+T!!%ZOs$;;:rrTk6^&@s262gl^s8E!!6%f.9!C;A6s8N'!KDbcL!!%ZHrrGF!rr2uKrW)lr +rVutO.K08JK)iU^rr[lR!/(4Lrr<&#q#:AI62gi_!!%ZMrrn#TKE"5irr3%P!($S`!eUK*rr;uu +rr3/86,! +k5Pk?5l^n;6%]/iKE(sLq>UN0!/(1Ks+BqC!!'A*!`B!ur;ZeLp\t:\!!)utr;Zg`rVlo3!;ZZo +!<)p"K)bn(q>UN0!58@2rW)lrrW!"P5sbJL!C=Etrrk]@rr<%Or;Zcs!/(%G!58@2rW)lr"[N+g +s/\NbrrRfQ^&A!262pobKDbcL!!#pprrn&TKE(t(rVuis!/(7M"bQf-s8R`Nrr@]N62gfa!/(:N +rr<$bqYpPJrVuqNqu6\L!;lcs!($5V"20>>^%)+(5lcQ8s7q9M6%f4;!:g'hKCAg?KAZ\/KBiI; +K)kfK!eUKSm/I' +k5Pk@5QCe85_/odJcGaMq>UN1!.k%Is+0eA!!'A*!`]4#r;ZeJp\t:[!!)utr;Zg_rVlo4!;ZZo +!<)p"JH,\$q>UN1!5AF3rW)lrrW!"N5X>;J!C4BtrrkZ=rr<%Mr;Zcs!.jnE!5AF3rW)lr"[E%f +s/J?_rrR`O^A\*35lUfaJc,QJ!!$$srrmuRJcGb$rVuis!.k+K"b?Z)s8RZLrr@WL5lL]`!.k.L +rr<$aqYpPHrVuqLqu6\J!;lcs!'p/U"29>;^@D4)5QHB5s7q3K5_8t8!:g'hJa`U=J`$J-Ja379 +JH5TI!eC?Om/I':n,EB=g&HR~> +k5Pk?5l^n;6%]/iKE(sLq>UN0!/(1Ks+BqC!!'A*!`B!ur;ZeLp\t:\!!)utr;Zg`rVlo3!;ZZo +!<)p"K)bn(q>UN0!58@2rW)lrrW!"P5sbJL!C=Etrrk]@rr<%Or;Zcs!/(%G!58@2rW)lr"[N+g +s/\NbrrRfQ^&A!262pobKDbcL!!#pprrn&TKE(t(rVuis!/(7M"bQf-s8R`Nrr@]N62gfa!/(:N +rr<$bqYpPJrVuqNqu6\L!;lcs!($5V"20>>^%)+(5lcQ8s7q9M6%f4;!:g'hKCAg?KAZ\/KBiI; +K)kfK!eUKSm/I' +hu?lrrYOe]`A!1s+C(GrW)osrW!#55sbJL!JA)arrRhds8E#s +rr[lR!/(1Ks1JL6]tOCE!eUIQr;Z`rs8W*brr3%P!58@2"@7Y?!/(4Lr;ZhMrr3!!KDGQH!;uj$ +5l^obs$;;9rrPId^&J$3^&A!3KDbcK!!'_2rrTk6!;c`p!;uiuK)gQ$s8R]Ps1SC2!<@cOrrW6e +K2V[Js1JDbrVuqNqu6\L!;lcs!/&Jp!!)Qh!/'b?!/'2/!/'S:!J:CLrrRfQea3;9KCAg@K>$"= +J,~> +hu;J!J.u`rrRbcs8E#s +rr[fP!.k%Is1SR7^:sRG!eC=Or;Z`rs8W*arr3%N!5AF3"@.Mn!!)Qh!.jV=!.j&-!.jG8!J(7JrrR`Of'ND:Ja`U>J\Kk< +J,~> +hu?lrrYOe]`A!1s+C(GrW)osrW!#55sbJL!JA)arrRhds8E#s +rr[lR!/(1Ks1JL6]tOCE!eUIQr;Z`rs8W*brr3%P!58@2"@7Y?!/(4Lr;ZhMrr3!!KDGQH!;uj$ +5l^obs$;;9rrPId^&J$3^&A!3KDbcK!!'_2rrTk6!;c`p!;uiuK)gQ$s8R]Ps1SC2!<@cOrrW6e +K2V[Js1JDbrVuqNqu6\L!;lcs!/&Jp!!)Qh!/'b?!/'2/!/'S:!J:CLrrRfQea3;9KCAg@K>$"= +J,~> +i;Wh162gf`;YU1mK0e&drr@]Brr<&,rrbUf!<3&ss8R]Ps1S7.!^QedrVuiss8N*cKDtlPX8os4 +rrGE +i;Wh/5lL]_ZNWW9d3 +rrGB9rW)os!.k+L!5AF3!`_L:qYpVJ!!)rsrW)rt!.k.Ls+(1N^A\'65QCe8r;Z]q!.k.L!knY" +rVlp!^An04r;Z`rqZ$SH!PX-`rr[fP!.k(Jrr<+O5X>;J!PSR4rrRcOs8Duu^A\'5JH19!rrToc +Jc#HJ!.k.L!<@]Mrrdnes8P@_!!%TIrrIZNqu6ZsJ]n&n!:g'h5k"^QJ]IckJO',4!J(7:rr@W= +rrI\bgAc[~> +i;Wh162gf`;YU1mK0e&drr@]Brr<&,rrbUf!<3&ss8R]Ps1S7.!^QedrVuiss8N*cKDtlPX8os4 +rrGE +iVrq262^`_;Yg=o]g9@/rr@]Brr<&-rr>@a!!3*"r;ZeL!rmo'qYpU_!!)utrW)rt!/(:N"4`#( +^&@s262gl_rrn#T!'ro'rr3&M!/(7M"bXMgK)boLs8E#prr>@\s8N'!KDbcL!!@ke!7h)K!keTI +rr3&56.Pr7r;Z`r!58@2"24_e^&.g3K)bn(r;Zcs"0DMg62gfa6%f1:!kgmPrVur3rVlqO!!)rs +!^Qg=rr3*e^&J(brr30&KE(t(!/(:N!($Sa!/(1K!J:CLrrE+PbPqPBnc&TAn,EB?hu<\ilMpm: +qu6\L!:0XbKCAj?KA-?U~> +iVrq05lCW^=`!!3*"r;ZeJ!rmi&qYpU^!!)utrW)rt!.k.L"4i#' +^A\'35lLc^rrmrR!'if#rr3&N!.k+K"bFDfJH,]Js8E#prr>=[s8N'!Jc,QJ!!@ed!7q/L!knZK +rr3&65h>o7r;Z`r!5AF3"2=ed^AIp4JH,\$r;Zcs"02Ad5lL]`5_8q7!kppNrVur4rVlqM!!)rs +!^Ha:rr3*d^Ae1arr30&JcGb$!.k.L!'pM`!.k%I!J(7JrrE+NbPqPBnc&T?n,EB=hu<\jlMpm8 +qu6\J!:0XbJa`X=J_L-S~> +iVrq262^`_;Yg=o]g9@/rr@]Brr<&-rr>@a!!3*"r;ZeL!rmo'qYpU_!!)utrW)rt!/(:N"4`#( +^&@s262gl_rrn#T!'ro'rr3&M!/(7M"bXMgK)boLs8E#prr>@\s8N'!KDbcL!!@ke!7h)K!keTI +rr3&56.Pr7r;Z`r!58@2"24_e^&.g3K)bn(r;Zcs"0DMg62gfa6%f1:!kgmPrVur3rVlqO!!)rs +!^Qg=rr3*e^&J(brr30&KE(t(!/(:N!($Sa!/(1K!J:CLrrE+PbPqPBnc&TAn,EB?hu<\ilMpm: +qu6\L!:0XbKCAj?KA-?U~> +ir9$F^&.g0;Z$Iq]`8'1K*/ges+BnB!("*o#!i5T5lgobr;ZeL!WRfJrrPId!<)rs!;QQo^&.j/ +!<)p%K)bn(s$=?trrTk6^&J$5]n=#t!;ulr!;uiu^&PeAs8N'!KDbcL!!@lR5uR[]!eWePrr3#4 +.K0>FrrdrS!(#07rrRg=62gffKE(t(!!%ZLs8N'$XT/$"=J,~> +ir9$E^AIp1ZM!'pP`!<@]Mrr@WL!!%TIs8RZIrrE+NbPqQnnc&T?n,EAQhu<\-lMpm8qu6\J +!:0[bJai[?J\Kk +ir9$F^&.g0;Z$Iq]`8'1K*/ges+BnB!("*o#!i5T5lgobr;ZeL!WRfJrrPId!<)rs!;QQo^&.j/ +!<)p%K)bn(s$=?trrTk6^&J$5]n=#t!;ulr!;uiu^&PeAs8N'!KDbcL!!@lR5uR[]!eWePrr3#4 +.K0>FrrdrS!(#07rrRg=62gffKE(t(!!%ZLs8N'$XT/$"=J,~> +jSo7o62CN\;Yg@iK*/ges+BnB!!'P/#=/>Us+:=O!;ulsK)u")q>UL^!!)utrVuqNr;Qa_q#C@ +jSo7p5l(E[e%q>UL]!!)utrVuqLr;Qa^q#CZM^&\04!.k+L!.k%Is+1(I!<@]&rrBe/Jc>ZL!:g'hJa`U=5i;SAJa3:8Jc#HJJH5$9 +!J.uSrr>=;s*t~> +jSo7o62CN\;Yg@iK*/ges+BnB!!'P/#=/>Us+:=O!;ulsK)u")q>UL^!!)utrVuqNr;Qa_q#C@ +jo5C7!/(7Ms1SI4!)i=d!/'kB!/%i^#_N+Cs8R]OrrDuss+:@PKDGNKK)boMs8;ot^&@s3]i+h/ +!/(:NrW)os"+pRRKDGQI^&@s2^&A$0s8E!"K)iUarrKf!r;Qpd^&J'4KDbcL!<.WCs8E#rs8E!" +s+A#`s8PC`s8IZN!!%ZLs8N'!;Z-Or^&N`]s8E#rrrn#TKE(s;rr3%P6%f+8!<@cOrrPId^&@s5 +^&S+brVuqNqu?\Kqu6ZsK@g,)]`8'0KDtlN!:g'hKCAg?KAZ\/KBiI;K0fD7!eUKSm/I' +jo5C5!.k+Ks1\O5!*/Og!.j_@!.h]\#_;t@s8RWMrrDuss+(4NJbfZL!:g'hJa`U=J`$J-Ja379JO',4!eC?Om/I':n,EE> +^=rU;~> +jo5C7!/(7Ms1SI4!)i=d!/'kB!/%i^#_N+Cs8R]OrrDuss+:@PKDGNKK)boMs8;ot^&@s3]i+h/ +!/(:NrW)os"+pRRKDGQI^&@s2^&A$0s8E!"K)iUarrKf!r;Qpd^&J'4KDbcL!<.WCs8E#rs8E!" +s+A#`s8PC`s8IZN!!%ZLs8N'!;Z-Or^&N`]s8E#rrrn#TKE(s;rr3%P6%f+8!<@cOrrPId^&@s5 +^&S+brVuqNqu?\Kqu6ZsK@g,)]`8'0KDtlN!:g'hKCAg?KAZ\/KBiI;K0fD7!eUKSm/I' +k5PG3pk/VH!)i=d!JA)Wrr@\_rrPId62pldK)koOr;ZeL!WRfJrrRfQ!<)rs!<5=b^&@s3.D>`\ +"2."6s8E#srr[lR!/(1Ks1S:/!^Qedr;Z`r"96&#^&J'362^`c6%].;KDbcK!!,B +k5PG4pjrJF!*/Og!J.uVrr@V]rrPFc5lUccJH5]Mr;ZeJ!WR`HrrR`O!<)rs!<5:a^A\'4.),]\ +"27%7s8E#srr[fP!.k%Is1\@0!^H_cr;Z`r"96)#^Ae045lCWb5_/n8Jc,QI!!,?9rr3$bs1\L4 +!5AI4rW)lrrW)uu!C4BurrR`O5lL]_5lL``Jc,QI!!'b3s8P=a!<2uuJc>]K!!%TKrrR`OJc#KI +Jc#HJ!.k.Lrr<'bJc5TM^Aic`!!%TIs8RZIrrE*bec,]%5ed*p!!)or!5AI4s1\I3!.jV=!'oHA +!.jG8!J*N5rrR`Of'ND:Ja`X=J_L-S~> +k5PG3pk/VH!)i=d!JA)Wrr@\_rrPId62pldK)koOr;ZeL!WRfJrrRfQ!<)rs!<5=b^&@s3.D>`\ +"2."6s8E#srr[lR!/(1Ks1S:/!^Qedr;Z`r"96&#^&J'362^`c6%].;KDbcK!!,B +gA_.Nqu7,U;M2'P.O!/(7M"+pUR!;ulsK)u")q>ULo!!)utrW)uu +!E+RLrrT8%KDtlPeUpd!!<)p#K)bm#KDkfOF")b@rs#RTs8R]O!;ulr!<2uuXT&5%;M.lKrr3,O +;?-]Lr;Z]q!)igr!n@:'rr3)N;UtgH!;ulr!;c`qK)i"NrrZ.!!/(4Lrr<*u.>.U!#_N--s8V4Z +ec5UK!3H/!!eUJ%r;R,*;M5#L`RY"g!/(:N"TX2T`W*%=rrK2MrVuqNqu6\L;Z$Ip!)h>H!nDpE +qu6Wrr;R.GX=7%FXK5=Ms8Q!crr=M*s8R`;rrIa$qu6_M!6+=)!JAqlrr@])s*t~> +gA_.Qqu7,Ve%q>ULr!!)utrW)uu +!EF^MrrT2#Jc>ZNeq$j#!<)p#JH,ZuJc5TME@?D;rs#LSs8RWM!;ulr!<2uuWrE##"r;R,( +gA_.Nqu7,U;M2'P.O!/(7M"+pUR!;ulsK)u")q>ULo!!)utrW)uu +!E+RLrrT8%KDtlPeUpd!!<)p#K)bm#KDkfOF")b@rs#RTs8R]O!;ulr!<2uuXT&5%;M.lKrr3,O +;?-]Lr;Z]q!)igr!n@:'rr3)N;UtgH!;ulr!;c`qK)i"NrrZ.!!/(4Lrr<*u.>.U!#_N--s8V4Z +ec5UK!3H/!!eUJ%r;R,*;M5#L`RY"g!/(:N"TX2T`W*%=rrK2MrVuqNqu6\L;Z$Ip!)h>H!nDpE +qu6Wrr;R.GX=7%FXK5=Ms8Q!crr=M*s8R`;rrIa$qu6_M!6+=)!JAqlrr@])s*t~> +gA_.NqYp^b^&S+bec,RMK)boDs8N'!K>.?f]`8&Gr;QkO!<3&ss8R]Ps+C.I!eUIQrVuisq>UN0 +K>%6`!58@3rVm%R!!#<;62gfa6%f.9"[Tj%K)boLs8E#prr<&ps8N'!KDbcL!!@ke!/(:N!keTI +rVlmaXSr4ts8DuuKDkfO^&N`]rr[lR!/(4Lrrrr@]?rr@])s*t~> +gA_.QqYp^a^An4af)G[NJH,]Bs8N'!J\M-d^&S/Ir;QkM!<3&ss8RWNs+1"G!eC=OrVuisq>UN1 +J\M*_!5AF4rVm%P!!#985lL]`5_8n6"[Kg%JH,]Js8E#prr<&ps8N'!Jc,QJ!!@ed!.k.L!knZK +rVlm`Wr<"rs8DuuJc5TM^Aic\rr[fP!.k(Jrr +gA_.NqYp^b^&S+bec,RMK)boDs8N'!K>.?f]`8&Gr;QkO!<3&ss8R]Ps+C.I!eUIQrVuisq>UN0 +K>%6`!58@3rVm%R!!#<;62gfa6%f.9"[Tj%K)boLs8E#prr<&ps8N'!KDbcL!!@ke!/(:N!keTI +rVlmaXSr4ts8DuuKDkfO^&N`]rr[lR!/(4Lrrrr@]?rr@])s*t~> +gA_.Nq>UR`^&N`8rr3%P!!)Zkrr<%O^]+DL!!%ZKrr[lRrrDuss+:@PKDGNKK)boMs8Duu^%24& +!<)p%K)bn(s1L_trrRfQKDkfN6%f.:r;Z`r!58@2!kj3dq>^Eor;Zcs",$V>KDtlQ]`8&GrVljH +rW)lrr;ZiJrr3&55lgl`#(usUK)bn(r;Zcs!3H%s!W[kdrVll2rW)lr!C6_b62gfb]g9@2rr[m> +!/(:N!<@cOs8PCarr@]N!!%ZKrrIa$dS!/&u)J,~> +gA_.Qq>UR_^Aic8rr3%N!!)Zkrr<%M^]+DM!!%TIrr[fPrrDuss+(4NJbf^Eor;Zcs"+gJ;Jc>ZO^&S/IrVljG +rW)lrr;ZiKrr3&65QLc_#(cgSJH,\$r;Zcs!35nq!W[ecrVll3rW)lr!C-Ya5lL]a^-KF3rr[g; +!.k.L!<@]Ms8P@`rr@WL!!%TIrrI[9qu6ZsJ_'i'^-FrtqYpNqr;Ql!s8RZKrrW9$s+0Y=!!(mU +!.jJ9!C-Y^rrR`OWpK`dJ\LXR!.ii'J,~> +gA_.Nq>UR`^&N`8rr3%P!!)Zkrr<%O^]+DL!!%ZKrr[lRrrDuss+:@PKDGNKK)boMs8Duu^%24& +!<)p%K)bn(s1L_trrRfQKDkfN6%f.:r;Z`r!58@2!kj3dq>^Eor;Zcs",$V>KDtlQ]`8&GrVljH +rW)lrr;ZiJrr3&55lgl`#(usUK)bn(r;Zcs!3H%s!W[kdrVll2rW)lr!C6_b62gfb]g9@2rr[m> +!/(:N!<@cOs8PCarr@]N!!%ZKrrIa$dS!/&u)J,~> +k5PI`62cE?s+>qiKE"jErrTl"!;uls!;-9m5lcPQrrBb3!!%ZKrr[lRrrDuss+:@PKDGNKK)boM +s8Duu62gfa]g;Sr!58C3rW)os%>+W\KE(t(^&S+b5s^/%rr>@a!;ulq!!%ZMrrGCcrVm(S63$rb +!/(4Lrr<+Qs+C7L!e\1=rVllJrW)lrrVutO;Z6Us]`<]`rrjkOK)bn(r;Zcs!3H%s!!)lqrVur3 +rVult",$V>62gfa]`A$2!keSdrr3!!62plfK)iUbs+C:N!/(1Ks+C4K!<@c(rrPId!<.WM^&J$3 +!;uj!;ZHb_rr3,763$t;n,EB?hZ!S.li.!s8R`@rr<&Ps*t~> +k5PI^5lH6=`!;ulq!!%TKrrG@brVm(Q5l^ia +!.k(Jrr<+Os+1+J!eJ(:rVllKrW)lrrVutMrr<&Ps*t~> +k5PI`62cE?s+>qiKE"jErrTl"!;uls!;-9m5lcPQrrBb3!!%ZKrr[lRrrDuss+:@PKDGNKK)boM +s8Duu62gfa]g;Sr!58C3rW)os%>+W\KE(t(^&S+b5s^/%rr>@a!;ulq!!%ZMrrGCcrVm(S63$rb +!/(4Lrr<+Qs+C7L!e\1=rVllJrW)lrrVutO;Z6Us]`<]`rrjkOK)bn(r;Zcs!3H%s!!)lqrVur3 +rVult",$V>62gfa]`A$2!keSdrr3!!62plfK)iUbs+C:N!/(1Ks+C4K!<@c(rrPId!<.WM^&J$3 +!;uj!;ZHb_rr3,763$t;n,EB?hZ!S.li.!s8R`@rr<&Ps*t~> +k5PI`62H39!/(;Lp\t9-!;uls!;-9lK)i^e"ks8E#srr[lR!/(1Ks+C1J!^Qedr;Z`r!rkPPrVlluKDkfR]g;Yu!/(4LrrE%N +rVlo3KDPWI!;ulr!!E8O!58C3!J<]:rrpq=5l^n;r;Zcs!)iap!^Zhdrr2uKrr;rt!/(7M!eUK* +oD\gkKDtoN!!>O;rrE#t!/(7N!/(1K!J:CLrrE+Pf)Gc'^&*H]rr<&srsMa)K)e4;s+A#b]n>eR +!/'/.!/'V;!J<]8rrRfQXR,rfK>$dS!!(^PJ,~> +k5PI^5l-$6!.k/Mp\t9.!;uls!;-9lJH3Lc"kEYR5QHB4rr[fPrrDuss+(4NJbf]L!!>L;rrE#t!.k+L!.k%I!J(7JrrE+Nf)Gc%^AEK\rr<&srsMj,JH.t8s+.oa^4GbQ +!.j#,!.jJ9!J*N5rrR`OWpK`dJ\LXR!!(^PJ,~> +k5PI`62H39!/(;Lp\t9-!;uls!;-9lK)i^e"ks8E#srr[lR!/(1Ks+C1J!^Qedr;Z`r!rkPPrVlluKDkfR]g;Yu!/(4LrrE%N +rVlo3KDPWI!;ulr!!E8O!58C3!J<]:rrpq=5l^n;r;Zcs!)iap!^Zhdrr2uKrr;rt!/(7M!eUK* +oD\gkKDtoN!!>O;rrE#t!/(7N!/(1K!J:CLrrE+Pf)Gc'^&*H]rr<&srsMa)K)e4;s+A#b]n>eR +!/'/.!/'V;!J<]8rrRfQXR,rfK>$dS!!(^PJ,~> +k5PG3q>^K.!WQ'errE+Po`"rE!5SU<.0.&6!/(1K"+pUR!;ulsK)u")q>UL^!!)utrW!$"K0fJ9 +s+C:Ms$6XurW)os"+pRRKDb`NXFl0%s8E#rs8E#us8PCarrRfQ62gf`^&A!3KDbcJ!!%ZNs8P@b +KDtoN^&S-3!;ulr!<<*!^&J$5K)e49rrBb3!!%ZLs8Duu62gfb]`8'3s8R`Os8E#rrrRfQKCf*D +!/(:N$35^l;Z?ass+rr@]?rr<&Ps*t~> +k5PG4q>^K/!WQ0hrrE+No`"rC!5SU<-igu4!.k%I"+^IP!;ulsJH>e%q>UL]!!)utrW!$"JO'26 +s+1.Ks$-RurW)os"+^FPJc,NLWe#`ts8E#rs8E#us8P@`rrR`O5lL]_^A\*4Jc,QH!!%TLs8P=a +Jc>]L^An64!;ulr!<<*!^Ae-6JH.t6rrBe4!!%TJs8Duu5lL]a^&S04s8RZMs8E#rrrR`OJb/mB +!.k.L$35Xk +k5PG3q>^K.!WQ'errE+Po`"rE!5SU<.0.&6!/(1K"+pUR!;ulsK)u")q>UL^!!)utrW!$"K0fJ9 +s+C:Ms$6XurW)os"+pRRKDb`NXFl0%s8E#rs8E#us8PCarrRfQ62gf`^&A!3KDbcJ!!%ZNs8P@b +KDtoN^&S-3!;ulr!<<*!^&J$5K)e49rrBb3!!%ZLs8Duu62gfb]`8'3s8R`Os8E#rrrRfQKCf*D +!/(:N$35^l;Z?ass+rr@]?rr<&Ps*t~> +gA_.NnG`MTKCo0EK)idg#JED'^&N]bKDYZNK)koOr;ZeL!WRfJs8E#ss8E!#^&N^Nrr3&$!/(7M +!/(4MrVlkMrVur3rVlqO6%f1:s1SI4!eUIQr;Z`rrr2tNrr3$c]n?7_"+pRR62^c_!<,:_rrGE< +rVlpb^&S'3r;Z`rqZ$SJqu6bN!!%ZLs8N'#X?hL;rrTk6^&J'3K)krN!;uiuK)e48rr@]Mrrprd +s8N(Orr3!!KDtlN!<2uu^&7p2KDYZLK0fD7!<@c$rrg"a6%clMrr<&hrr@]?rr<&Urr@];s8R`K +rrRfQXR,reKCAg?!87C&~> +gA_.QnG`MSJb8sCJH3Re#JNG'^Ai`aJc#HLJH5]Mr;ZeJ!WR`Hs8E#ss8E!#^AiaLrr3&"!.k+K +!.k(KrVlkKrVur4rVlqM5_8q7s1\O5!eC=Or;Z`rrr2tLrr3$b^4H4^"+^FP5lCZ^!<,7^rrGB9 +rVlpa^An04r;Z`rqZ$SHqu6bL!!%TJs8N'#W^).6rrTn7^Ae04JH5`L!;uiuJH.t5rr@WKrrpuf +s8N(Mrr3!!Jc>ZL!<2uu^AS$3Jc#HJJO',4!<@]"rrg%a5_6ZKrr<&hrr@W=rr<&Urr@W9s8RZI +rrR`OWpK`cJa`U=!87C&~> +gA_.NnG`MTKCo0EK)idg#JED'^&N]bKDYZNK)koOr;ZeL!WRfJs8E#ss8E!#^&N^Nrr3&$!/(7M +!/(4MrVlkMrVur3rVlqO6%f1:s1SI4!eUIQr;Z`rrr2tNrr3$c]n?7_"+pRR62^c_!<,:_rrGE< +rVlpb^&S'3r;Z`rqZ$SJqu6bN!!%ZLs8N'#X?hL;rrTk6^&J'3K)krN!;uiuK)e48rr@]Mrrprd +s8N(Orr3!!KDtlN!<2uu^&7p2KDYZLK0fD7!<@c$rrg"a6%clMrr<&hrr@]?rr<&Urr@];s8R`K +rrRfQXR,reKCAg?!87C&~> +gA_.Nnc&ZC!!)kJrr3\GK7cGi^&S,6s8Te4s1SGb]tOHIre(6a"G=Dfs1SDa#JL.iKE&W;^&J$3 +ea*5?5lag_s+:;;qu6eO!<3&4rVum`!J:CMK*)(*62gl_s8E#trrBb3rrT;%62^`_^&A$1rrRfQ +!<,:_rrGEFarrIa +rr<&frr<&Ps*t~> +gA_.Qnc&ZA!!)kHrr3\HJUp&d^An55s8Th5s1\Ma^:sWIrdk*`"G+;es1\J`#JU4hJcEH8^Ae-4 +f'E>@5QFgas+(/8qu6eM!<3&5rVum_!J(7KJHGk&5lLc^s8E#trrBe4rrT5#5lCW^^A\-2rrR`O +!<,7^rrGB9rVm$d^Ai`a!;ulr!;c]q!;ZZp!!#:^s8N*!JH5b%rVllu^A\'45cXe`r;Z`r!5AF3 +"2=ed^AIp4JH,\$rVm)9!!'&!5ed3s!<>C`rrI[9rW)lr"$chd^A\'4JO'26"@.PAniJaEF:Jc#HKJH2_: +rr<&frr<&Ps*t~> +gA_.Nnc&ZC!!)kJrr3\GK7cGi^&S,6s8Te4s1SGb]tOHIre(6a"G=Dfs1SDa#JL.iKE&W;^&J$3 +ea*5?5lag_s+:;;qu6eO!<3&4rVum`!J:CMK*)(*62gl_s8E#trrBb3rrT;%62^`_^&A$1rrRfQ +!<,:_rrGEFarrIa +rr<&frr<&Ps*t~> +gA_.Nnc/WA!<<"M!588^!58>`!579B!($U:!E&psK)ksFs8;otec,RM +K)boMrrtdhs+::OKDkfSK)bnQs8R`MrrN0dKDkfMKDkiNKDkfMKDkiNKDkfNK0fJ9"$lneKDtlO +!/(:N!<@cOrr@]N!!%ZKrrIa +gA_.Qnc/W?!<<"K!5A>]!5AD_!5@?A!'pO7!EB.!JH5a9b5hM@rW)fp!35kprW)os#(ZaSJc@u# +rr3%N!5AF3!C258!;ulr!!'b3rrTq7!;ZZp!!#:^s8N*!JH8"arVllu5lCW^./j5Es8;otf)G[N +JH,]Krrtags+(.MJc5TQJH,\Ms8RZKrrN0cJc5TKJc5WLJc5TKJc5WLJc5TLJO'26"$chdJc>ZM +!.k.L!<@]Mrr@WL!!%TIrrI[9qu6ZsJ_:#&JcG`M5lL`_JcG`M!:g'hJa`U=J_pG,JaEC;5_8h4 +!eC@&m/I%cn,ECg^=rU;~> +gA_.Nnc/WA!<<"M!588^!58>`!579B!($U:!E&psK)ksFs8;otec,RM +K)boMrrtdhs+::OKDkfSK)bnQs8R`MrrN0dKDkfMKDkiNKDkfMKDkiNKDkfNK0fJ9"$lneKDtlO +!/(:N!<@cOrr@]N!!%ZKrrIa +jo>+.s8N'sUAk:I!/(7M!eUK*qu6bN!<3&ursM*m6%f2'!58F4]g;Ss!($S`rVuparVlr4K7j"" +rW)os%>+W\KE(s;KE(t(!!'_2rr>@a!;ulq!!'_3rrTk6!<)p%6%f4;!!%ZLs8N*!K)iU_rrPL" +KDkfMec#RHs8E!!K.6d!!C6_ars$/hs+::OKDkfPK)bnQqYpO]qZ$Np!/(7M"[N-@s$8sMrrRfQ +62gfbK)gQ'rrE*crr;uurr2tNrVuqNqu?\Kqu6ZsK@p5(KE(rOKDkiM^&S*4!:g'hKCAg?KAHP- +KC&X +jo>+,s8N(!UAk:G!.k+K!eC?&qu6bL!<3&ursM'l5_8r#!5AL5^-MVs!'pM_rVup`rVlr5JV!Xs +rW)os%=nKZJcGa8JcGb$!!'b3rr>=`!;ulq!!'b4rrTn7!<)p%5_8t8!!%TJs8N*!JH3F^rrPI" +Jc5TKf)>[Is8E!!JLLKs!C-Y`rs$2gs+(.MJc5TNJH,\MqYpO\qZ$Np!.k+K"[E'=s$/jKrrR`O +5lL]aJH19#rrE*brr;uurr2tLrVuqLqu?\Iqu6ZsJ_:#&JcG`MJc5WK^An35!:g'hJa`U=J_g>+ +JaEF:Jc#HJJH5ED$\A?X^-I7#5ed9u!:Tpf!87C&~> +jo>+.s8N'sUAk:I!/(7M!eUK*qu6bN!<3&ursM*m6%f2'!58F4]g;Ss!($S`rVuparVlr4K7j"" +rW)os%>+W\KE(s;KE(t(!!'_2rr>@a!;ulq!!'_3rrTk6!<)p%6%f4;!!%ZLs8N*!K)iU_rrPL" +KDkfMec#RHs8E!!K.6d!!C6_ars$/hs+::OKDkfPK)bnQqYpO]qZ$Np!/(7M"[N-@s$8sMrrRfQ +62gfbK)gQ'rrE*crr;uurr2tNrVuqNqu?\Kqu6ZsK@p5(KE(rOKDkiM^&S*4!:g'hKCAg?KAHP- +KC&X +jo5F8!'u86rr>rkrrE*cr;QhN!/(1K#_N-WKE(tb!!*#u!eVr8rVlkMrVuqNrVufr!($S`!C6_a +rrYR#s8W&urVltP!!%ZKs8R`O^&7m35l^o`rrBb3!!9i"KDtlP]`>bFrs$/&^&J'4KDbcL!!,@c +r;Qf2KDPWI!;ulr!!<1Q62gfa!($S`"bXKS!!%ZMrr[lR!)iap!e^LQqZ$Npr;Zcs",$WeKDtlP +K0b.frrE+Prr;uu"G?aS!58C3!/(7N!/(1Ks+C4K!<@c)rr@]Nrr<&ts8R`Orr<&hrr@]KrrBb2 +rrTldKDkfM^"r\gKC&X +jo5F6!'l,3rr?&nrrE*br;QhL!.k%I#_ZN^&YnHrs$2&^Ae05Jc,QJ!!,=b +r;Qf3JboEG!;ulr!!<1O5lL]`!'pM_"bFBQ!!%TKrr[fP!*/ss!eL@OqZ$Npr;Zcs"+gKdJc>ZN +JO"earrE+Nrr;uu"G-UQ!5AI4!.k+L!.k%Is+1(I!<@]'rr@WLrr<&ts8RZMrr<&hrr@WIrrBe3 +rrTocJc5TK^>8ehJaEF:Jc#HKJH49qrsODXs+.oas1X'as$6&Q!!(^PJ,~> +jo5F8!'u86rr>rkrrE*cr;QhN!/(1K#_N-WKE(tb!!*#u!eVr8rVlkMrVuqNrVufr!($S`!C6_a +rrYR#s8W&urVltP!!%ZKs8R`O^&7m35l^o`rrBb3!!9i"KDtlP]`>bFrs$/&^&J'4KDbcL!!,@c +r;Qf2KDPWI!;ulr!!<1Q62gfa!($S`"bXKS!!%ZMrr[lR!)iap!e^LQqZ$Npr;Zcs",$WeKDtlP +K0b.frrE+Prr;uu"G?aS!58C3!/(7N!/(1Ks+C4K!<@c)rr@]Nrr<&ts8R`Orr<&hrr@]KrrBb2 +rrTldKDkfM^"r\gKC&X +j8T1o6,!0q!)fQk!<@cMrrRfQKDYZYK)kq(s+::O6%f4;KE&X_rr>@a!<)rs!!<0d62gfa.D>`\ +"2."6s8E#srr[lR!/(1Ks+C1J!eUIQrVll2rW!$"]`A$2!J:CMs8PCb!!%ZLs8;otKDtoN5lcQ6 +s8E#rs8E#urr@]MrrPId62gf`KDkiNKDkfMKDkiN^&@s45l^oarrZ04s8W&u!58@2rr<%Oqu?\K +qu6ZsKDtlX!'rp$rrE*!]tK't!!%ZKrrI`Pqu6ZsK@p5(KE(rO!<)p#K>% +j8T1p5ed-q!*,cn!<@]KrrR`OJc#HWJH5_$s+(.M5_8t8JcEI^rr>=`!<)rs!!<0c5lL]`.),]\ +"27%7s8E#srr[fP!.k%Is+1%H!eC=OrVll3rW!$"^&\-3!J(7Ks8P@a!!%TJs8;otJc>]L5QHB3 +s8E#rs8E#urr@WKrrPFc5lL]_Jc5WLJc5TKJc5WL^A\'55QCf`rrZ98s8W&u!5AF3rr<%Mqu?\I +qu6ZsJc>ZV!'ig#rrE*!^:o0t!!%TIrrIZNqu6ZsJ_:#&JcG`M!<)p#J\M0a!;6BlJcG`MJc#KI +JcG`Q^4F"u5hZ/;5j\ONJc#HKJH49qrr[iPs+1.K"$lndJa`U=!87C&~> +j8T1o6,!0q!)fQk!<@cMrrRfQKDYZYK)kq(s+::O6%f4;KE&X_rr>@a!<)rs!!<0d62gfa.D>`\ +"2."6s8E#srr[lR!/(1Ks+C1J!eUIQrVll2rW!$"]`A$2!J:CMs8PCb!!%ZLs8;otKDtoN5lcQ6 +s8E#rs8E#urr@]MrrPId62gf`KDkiNKDkfMKDkiN^&@s45l^oarrZ04s8W&u!58@2rr<%Oqu?\K +qu6ZsKDtlX!'rp$rrE*!]tK't!!%ZKrrI`Pqu6ZsK@p5(KE(rO!<)p#K>% +ir9(n6%f+8!)fQk!<@cMrrRfQKDYZ[K2V`%5l^nus$8sNKE(s;^&J$6K)bn(rVuiss8N(OrVlr# +!58@2!C;A;!<)p"K)bm;r;Qgr6%f1:s1SI4!eUIQr;Z`rqYpVL5lgi_"$lneKDbcJ!!%ZNrrTk6 +KDtlQ]g;\urW)lrrW)fp!^Zj=r;QkO!!%ZMrrdrS!%C53rrGCcrVlp!s8W&u!58@2rr<%Oqu?\K +s8N)Lrr3!!KDtlS!/(=%rrE&u!($P`!/(1K!J:CLrrE+Pf`1u(s8N'!rVlitrr2sanc&TAqu6eO +^&S*urr3*e^&S+bh>[J-m/R* +ir9(o5_8k5!*,cn!<@]KrrR`OJc#HYJQ;`$5QCeus$/jLJcGa8^Ae-7JH,\$rVuiss8N(MrVlr! +!5AF3!C258!<)p"JH,[8r;Qgu5_8q7s1\O5!eC=Or;Z`rqYpVJ5QL`^"$chdJc,QH!!%TLrrTn7 +Jc>ZO^-M_urW)lrrW)fp!^Qd:r;QkM!!%TKrrdlQ!%:,1rrG@brVlp!s8W&u!5AF3rr<%Mqu?\I +s8N)Mrr3!!Jc>ZQ!.k1$rrE&u!'pJ_!.k%I!J(7JrrE+Nf`1u&s8N'!rVlitrr2s`nc&T?qu6eM +^An3urr3*d^An4ah>[J+m/R*:qu6\J!;?EpJcGb$rVlsbs8RZ=rr<&Ps*t~> +ir9(n6%f+8!)fQk!<@cMrrRfQKDYZ[K2V`%5l^nus$8sNKE(s;^&J$6K)bn(rVuiss8N(OrVlr# +!58@2!C;A;!<)p"K)bm;r;Qgr6%f1:s1SI4!eUIQr;Z`rqYpVL5lgi_"$lneKDbcJ!!%ZNrrTk6 +KDtlQ]g;\urW)lrrW)fp!^Zj=r;QkO!!%ZMrrdrS!%C53rrGCcrVlp!s8W&u!58@2rr<%Oqu?\K +s8N)Lrr3!!KDtlS!/(=%rrE&u!($P`!/(1K!J:CLrrE+Pf`1u(s8N'!rVlitrr2sanc&TAqu6eO +^&S*urr3*e^&S+bh>[J-m/R* +ir9(];M4oI!)fQk!<@cMrrRfQKDYZQK)kpL!!(RKs8R]Z;ZHdIK7j4(K)bmLrVuisqZ$Ss!)iap +!/(7NrVm%R!!"HGXT&5$jsbr]rrl;Qs+::Or;Z`rrVltXec,XFs8N'!KDbcL!!7dN!<)p!X=;^! +rrU_"`Vol8s8DuuXT&5%eUuC$qYpYM!!%ZMrroJ(!3H4Nr;QctKDkfNK2V[K!7h&J"+pRRXSr/+ +K)gQ(s5kb_rr@]NrrrIUs8R]Oec,RK;Z6XrKDYZLK)kfK!<@c)rrB/!;Z?[sXO[=M!!)Ti!S)i" +s8R`Orr>sqrr[oRs+B/-!%I:7s+C4K!eUKSp\t>Js8Q!qrr[oRrrDNf!!(^PJ,~> +ir9([Hs8Q*trr[iPrrDNf!!(^PJ,~> +ir9(];M4oI!)fQk!<@cMrrRfQKDYZQK)kpL!!(RKs8R]Z;ZHdIK7j4(K)bmLrVuisqZ$Ss!)iap +!/(7NrVm%R!!"HGXT&5$jsbr]rrl;Qs+::Or;Z`rrVltXec,XFs8N'!KDbcL!!7dN!<)p!X=;^! +rrU_"`Vol8s8DuuXT&5%eUuC$qYpYM!!%ZMrroJ(!3H4Nr;QctKDkfNK2V[K!7h&J"+pRRXSr/+ +K)gQ(s5kb_rr@]NrrrIUs8R]Oec,RK;Z6XrKDYZLK)kfK!<@c)rrB/!;Z?[sXO[=M!!)Ti!S)i" +s8R`Orr>sqrr[oRs+B/-!%I:7s+C4K!eUKSp\t>Js8Q!qrr[oRrrDNf!!(^PJ,~> +jo5FrK)iU]rr>rkrrE+Pr;QhN!/(1K#(lo.!'u6'r;QeMebf@HKDklLs8Duu^&@s46+sAqs8E#s +rr[lR!/(1K!eUKdrVlo362gl^s8Duu^&J$6eNpkKrVlkMrr;uu!/(4Lrr<+Q6,!6s"+pRRKDkfM +KDklKs8;otec,RM]`8'2rrrIUs+::OKDkfP]`8&6rr2tNrr3$"K>%6`!58@3r;Zcs!e\0PrVlqO +!58C3"2+[7KDtlO!/(:N!<>Fbrr@]N!!%ZKs8R`KrrE+PbPqQ.o)Aa(KDY]KKE(rOKDtlR]n??u +!8[YT!:9^dK0fD7!eUL'p\t +jo5FsJH3F\rr?&nrrE+Nr;QhL!.k%I#(Zc*!'l*#r;QeKf),IIJc5ZJs8Duu^A\'55ea8os8E#s +rr[fP!.k%I!eC?crVlo45lLc]s8Duu^Ae-7ej-qLrVlkKrr;uu!.k(Jrr<+O5ed3s"+^FPJc5TK +Jc5ZIs8;otf)G[N^&S03rrrISs+(.MJc5TN^&S/5rr2tLrr3$"J\M*_!5AF4r;Zcs!eJ'NrVlqM +!5AI4"24a8Jc>ZM!.k.L!<>Carr@WL!!%TIs8RZIrrE+NbPqQ-o)Aa)Jc#KIJcG`MJc>ZP^4H +jo5FrK)iU]rr>rkrrE+Pr;QhN!/(1K#(lo.!'u6'r;QeMebf@HKDklLs8Duu^&@s46+sAqs8E#s +rr[lR!/(1K!eUKdrVlo362gl^s8Duu^&J$6eNpkKrVlkMrr;uu!/(4Lrr<+Q6,!6s"+pRRKDkfM +KDklKs8;otec,RM]`8'2rrrIUs+::OKDkfP]`8&6rr2tNrr3$"K>%6`!58@3r;Zcs!e\0PrVlqO +!58C3"2+[7KDtlO!/(:N!<>Fbrr@]N!!%ZKs8R`KrrE+PbPqQ.o)Aa(KDY]KKE(rOKDtlR]n??u +!8[YT!:9^dK0fD7!eUL'p\t +jo5^U`s8PukrrE+Pr;QhN!/(1K#D3#i!/(+W\KE(tbKE(t(K0d3LrrBb3!;ulq!!'_2rrGCcrVum`s8W*!!/(4LrrE(Os8N3f +^&N_;qu6ZHrW)lrrVutOec#LL]`>bErrl<6K)bn(rVltP!!',"rrg#$^&J*/s8E#rs8N'!KDYZM +K)boMrrTk6KDtoN!!L"8rr<&urr@]N!!%ZKrrGCcqu6ZsK?X>s5leUhrr@]Krrds?s1O'arrbXf +s1L_Srr>@OrrI`Pqu6\L!:0Xb!:Tpf!87C&~> +jo5^U_s8Q)nrrE+Nr;QhL!.k%I#Culh!.k0a5lL]`JLLHr!J*N8!<)rs!!,@!rr3&65UcU2 +!.k.LrW)os%=nKZJcGbaJcGb$JO$sJrrBe4!;ulq!!'b3rrG@brVum_s8W*!!.k(JrrE(Ms8N3e +^Aib8qu6ZIrW)lrrVutMf)>UM^&YnGrrlE:JH,\$rVltN!!'%urrg&$^Ae30s8E#rs8N'!Jc#HK +JH,]KrrTn7Jc>]L!!L%9rr<&urr@WL!!%TIrrG@bqu6ZsJ^",q5QJOhrr@WIrrdm=NrrIZNqu6\J!:0Xb!:Tpf!87C&~> +jo5^U`s8PukrrE+Pr;QhN!/(1K#D3#i!/(+W\KE(tbKE(t(K0d3LrrBb3!;ulq!!'_2rrGCcrVum`s8W*!!/(4LrrE(Os8N3f +^&N_;qu6ZHrW)lrrVutOec#LL]`>bErrl<6K)bn(rVltP!!',"rrg#$^&J*/s8E#rs8N'!KDYZM +K)boMrrTk6KDtoN!!L"8rr<&urr@]N!!%ZKrrGCcqu6ZsK?X>s5leUhrr@]Krrds?s1O'arrbXf +s1L_Srr>@OrrI`Pqu6\L!:0Xb!:Tpf!87C&~> +gA_.NUAk5oKDb`NK)gQ$rs45WK)gQ(s1JF3rrRgN62gfa]g;VtrVucq!58@2!%ImHs$?\brW)os +"+pRRKDtoNK*)(*KDPTL5l^o`rrBb3!;c]r!/(7Ms$6b#!!%ZLs8N')5lgrb]g9>aKDPWI!;ulr +!<<'!^&@s35lgl`"k>n)!!%ZMrr[lR!%ImH"2.!Q!<2uuXT&8!!;uls!!%ZNrrRiQs8IZKrrE+P +rr;uu"$tK;!<)otKDkiNKDYZLK0fD7!<@bsrr[lR!/(7M!/(%G!/(1K!58Aa!58C3!58C3!/',- +!/'Y +gA_.QUAk5oJc,NLJH18urs4/UJH19$s1SL4rrRaO5lL]`^-MYtrVucq!5AF3!%@gGs$6VarW)os +"+^FPJc>]LJHGk&JboBJ5QCf_rrBe4!;c]r!.k+Ks$-\#!!%TJs8N')5QLia^-KD`JboEG!;ulr +!<<'!^A\'45QLc_"kGq(!!%TKrr[fP!%@gG"27$O!<2uuWrE%t!;uls!!%TLrrRcOs8ITIrrE+N +rr;uu"$kH;!<)otJc5WLJc#HJJO',4!<@\qrr[fP!.k+K!.jnE!.k%I!5AG`!5AI4!5AI4!.iu+ +!.jM:s+1(I!J(7:rr<&frr<&Ps*t~> +gA_.NUAk5oKDb`NK)gQ$rs45WK)gQ(s1JF3rrRgN62gfa]g;VtrVucq!58@2!%ImHs$?\brW)os +"+pRRKDtoNK*)(*KDPTL5l^o`rrBb3!;c]r!/(7Ms$6b#!!%ZLs8N')5lgrb]g9>aKDPWI!;ulr +!<<'!^&@s35lgl`"k>n)!!%ZMrr[lR!%ImH"2.!Q!<2uuXT&8!!;uls!!%ZNrrRiQs8IZKrrE+P +rr;uu"$tK;!<)otKDkiNKDYZLK0fD7!<@bsrr[lR!/(7M!/(%G!/(1K!58Aa!58C3!58C3!/',- +!/'Y +gA_.NUAk5oKDb`NK)gQ$rrds'rr@]NrrBb3rr[oR5lgl`"+pRRKDkiL!!<1Q!<)otXSi+u5leUt +!<)p"K)bn(rVlj`re((I!^QedrVlkMrW)uu!C=EurrGF!r;QbLrVuqNr;Z]q#/1':]g4r:rr<#3 +s8W&ur;Z`rs8N;:6,!%3_!58@3!/(7M!/(7N!($S`!keR6rr3)%63$ua!;uls!!%ZNrrg"8 +s+>t$rrE+Prr3<*K>#h8!<<(OK0fJ:!/(1K!C;A8rrE+Pc2RmZ!!%ZNrr[mO6%f"5!/'b?!574g +!/'Y +gA_.QUAk5oJc,NLJH18urrdm$rr@WLrrBe4rr[iP5QLc_"+^FPJc5WJ!!<1O!<)otWr2ns5QJOt +!<)p"JH,\$rVlj_rdjqG!^H_crVlkKrW)uu!C4BurrGC!r;QbJrVuqLr;Z]q#/:-;^-Fr7rr<#4 +s8W&ur;Z`rs8N;;5ed9uJ\M'^!5AF4!.k+K!.k+L!'pM_!knX7rr3)#5l^l`!;uls!!%TLrrg%9 +s+,aurrE+Nrr3<*J\K_8!<<(MJO'27!.k%I!C255rrE+Nc2Rm[!!%TLrr[gP5_8b2!.jV=!5@:h +!.jM:!<@]JrrI[9pAY0-5lQ<95_23"rr<&frr<&Ps*t~> +gA_.NUAk5oKDb`NK)gQ$rrds'rr@]NrrBb3rr[oR5lgl`"+pRRKDkiL!!<1Q!<)otXSi+u5leUt +!<)p"K)bn(rVlj`re((I!^QedrVlkMrW)uu!C=EurrGF!r;QbLrVuqNr;Z]q#/1':]g4r:rr<#3 +s8W&ur;Z`rs8N;:6,!%3_!58@3!/(7M!/(7N!($S`!keR6rr3)%63$ua!;uls!!%ZNrrg"8 +s+>t$rrE+Prr3<*K>#h8!<<(OK0fJ:!/(1K!C;A8rrE+Pc2RmZ!!%ZNrr[mO6%f"5!/'b?!574g +!/'Y +k5POb!/%u\rr>rkrrE+Pr;QhN!/(1K"G9Uc!!)lq"G?aSK>%9a"+pRRKDkiL!<<'"]g;Yt!3H(t +!58=2rVlkMrVuparVlr#K7j1'#!os&s+::Or;Z`rrr3*eKE(s;qYpYM!!%ZLs8N'#5lcQ:rrTl" +KDkiM5lgra!;ulr!<3!$]`A*462LT`K)bn(rVm%R!!')d62gfa]`A$2!kgo"rVur3rVult!/(7M +$b\h+KE(tQ^&S*4KDtlS!/( +k5PO`!.hl[rr?&nrrE+Nr;QhL!.k%I"G'Re!!)lq"G-UQJ\M-`"+^FPJc5WJ!<<'"^-M\t!35qr +!5AC3rVlkKrVup`rVlr!JV!h##!fp&s+(.Mr;Z`rrr3*dJcGa8qYpYK!!%TJs8N'#5QHB7rrTo" +Jc5WK5QLi`!;ulr!<3!$^&\355l1K_JH,\$rVm%P!!'#a5lL]`^&\-3!kpr"rVur4rVult!.k+K +$bek+JcGbM^An35Jc>ZQ!.k0M5QLf`!.k(K!.k%I!<@]JrrE+Nbl@\C!.k.L"bE]R^-I8Hrr@W> +rrBdgrr@W:s8RZIrrIZNpAYL#s8RX8s8Tfas8N)frr<&Ps*t~> +k5POb!/%u\rr>rkrrE+Pr;QhN!/(1K"G9Uc!!)lq"G?aSK>%9a"+pRRKDkiL!<<'"]g;Yt!3H(t +!58=2rVlkMrVuparVlr#K7j1'#!os&s+::Or;Z`rrr3*eKE(s;qYpYM!!%ZLs8N'#5lcQ:rrTl" +KDkiM5lgra!;ulr!<3!$]`A*462LT`K)bn(rVm%R!!')d62gfa]`A$2!kgo"rVur3rVult!/(7M +$b\h+KE(tQ^&S*4KDtlS!/( +k5PF_rIY*`qu6XoUAk5oKDb`NK)gQ$rrn#Trr<$br;Qd`!;c]qKDklLs8E#trs-5's8T2#]n?:` +!58@3rVm%R!!%X;62gi`KDkfR6,!;N!!)ut!58@3qYp[as8PBurVult!/(4Lrr<.R5lcQ9rrGF! +rVlmaKDklKs8Duu^&.g;!<<)46,! +k5PF]rIFs_qu6XrUAk5oJc,NLJH18urrmrRrr<$ar;Qd_!;c]qJc5ZJs8E#trs-8's8T,!^4H7_ +!5AF4rVm%P!!%R85lL`_Jc5TP5ed8L!!)ut!5AF4qYp[`s8P?urVult!.k(Jrr<.P5QHB6rrGC! +rVlm`Jc5ZIs8Duu^AIp +k5PF_rIY*`qu6XoUAk5oKDb`NK)gQ$rrn#Trr<$br;Qd`!;c]qKDklLs8E#trs-5's8T2#]n?:` +!58@3rVm%R!!%X;62gi`KDkfR6,!;N!!)ut!58@3qYp[as8PBurVult!/(4Lrr<.R5lcQ9rrGF! +rVlmaKDklKs8Duu^&.g;!<<)46,! +k5PI`KDtoN5leUsrr>rkrrE+Pr;QhN!/(1K#(lo.!'u6'rVlr4!7h)K"2.##KDklLs8E#srs-5' +s/c8#K7j.&rW)os#(lmUKE$QirVllu^&@s36%f.:rVll2rVur3rVuo2!!*#u!C=Eus8N'!KDbcL +!<7ZQs+A#arrPId^&@s2.K0>Fs8;otec#OJ!<3!']`?U_K)bn(rVm+T!!',#s1L_trrW7R!58C3 +!58@3!/(7MrrE$arVlnN62gfc]`8%brr3!!KDtlO!58C3!/(7N!/(1K!C;A8rrE+Pbl7]r!<)ou +K<5"N!PO-brr@]Js8P@g]n8VaXFo4+!/'Yt$rr<&frr<&Ps*t~> +k5PI^Jc>]L5QJOsrr?&nrrE+Nr;QhL!.k%I#(Zc*!'l*#rVlr5!7q/L"27&#Jc5ZJs8E#srs-8' +s/Q,!JV!e"rW)os#(ZaSJcC9drVllu^A\'45_8n7rVll3rVur4rVuo3!!*#u!C4Bus8N'!Jc,QJ +!<7TOs+.o`rrPFc^A\'3./j5Es8;otf)>XK!<3!'^&ZaaJH,\$rVm+R!!'&!s1UbtrrW7P!5AI4 +!5AF4!.k+KrrE$`rVlnL5lL]b^&S.arr3!!Jc>ZM!5AI4!.k+L!.k%I!C255rrE+Nbl7]p!<)ou +JZAYJ!PX-arr@WHs8P=f^4AP`We&k'!.jM:s+1(I!J(7ErrdoQs+,aurr<&frr<&Ps*t~> +k5PI`KDtoN5leUsrr>rkrrE+Pr;QhN!/(1K#(lo.!'u6'rVlr4!7h)K"2.##KDklLs8E#srs-5' +s/c8#K7j.&rW)os#(lmUKE$QirVllu^&@s36%f.:rVll2rVur3rVuo2!!*#u!C=Eus8N'!KDbcL +!<7ZQs+A#arrPId^&@s2.K0>Fs8;otec#OJ!<3!']`?U_K)bn(rVm+T!!',#s1L_trrW7R!58C3 +!58@3!/(7MrrE$arVlnN62gfc]`8%brr3!!KDtlO!58C3!/(7N!/(1K!C;A8rrE+Pbl7]r!<)ou +K<5"N!PO-brr@]Js8P@g]n8VaXFo4+!/'Yt$rr<&frr<&Ps*t~> +k5PI`KDb`QK)iUbs&,Tk!<@cMrrRfQKDYZRK)koOKE"5'rVlnN.K08M]`:=u!/(7MrW!Hps1SI4 +5sZs5s+:;;KE&Xa!<)p,K)bm;s8N'bs8P@b!/(:N!58=2r;Z]q!/(:N"$lne^&J$9!/(BrrE(O +!<)rs!!%ZMs8N'$KE"5'rr3%P!($S`!eUK*rr3!!62poa!!@lRs+C:N!/(1Ks+C4K!<@brrrI`P +rVlnNXS;_pKDGNL!<<(Of)Pc&mJm3=qu6_M!7giD"@<(f6%f1:"24a7!:Tpf!87C&~> +k5PI^Jc,NOJH3Fas&Gfn!<@]KrrR`OJc#HPJH5]MJc@u#rVlnL./j/L^&UCu!.k+KrW!Hos1\O5 +5X6a3s+(/8JcEI`!<)p,JH,[8s8N'as8P=a!.k.L!5AC3r;Z]q!.k.L"$chd^Ae-:!.k0a!!%TJ +s8N',5l^ka!5AKI5_/pLrr2turW)lrr;ZgGrVlnL!<)p%^*s#4!!%TKrr[fP!36%u#D#/?rrE(M +!<)rs!!%TKs8N'$Jc@u#rr3%N!'pM_!eC?&rr3!!5lUf`!!@fPs+1.L!.k%Is+1(I!<@\prrIZN +rVlnLWqZMnJbf +k5PI`KDb`QK)iUbs&,Tk!<@cMrrRfQKDYZRK)koOKE"5'rVlnN.K08M]`:=u!/(7MrW!Hps1SI4 +5sZs5s+:;;KE&Xa!<)p,K)bm;s8N'bs8P@b!/(:N!58=2r;Z]q!/(:N"$lne^&J$9!/(BrrE(O +!<)rs!!%ZMs8N'$KE"5'rr3%P!($S`!eUK*rr3!!62poa!!@lRs+C:N!/(1Ks+C4K!<@brrrI`P +rVlnNXS;_pKDGNL!<<(Of)Pc&mJm3=qu6_M!7giD"@<(f6%f1:"24a7!:Tpf!87C&~> +k5PI`KDPTMKE(sLUAk5oKDb`NK)gQ$rs45W]`<]bs$8sMrrTl362^c^!!%ZMs6B[`rr@]_Ps+C4K!J:CGrrKf!r.>,<^&S*4n,E@fg&HR~> +k5PI^JboBKJcGaMUAk5oJc,NLJH18urs4/U^&W`as$/jKrrTo75lCZ]!!%TKs6B[`rr@W:!;ul` +!!%TJs6Ka`s6K^cJc5TKJa<@:^A\*(!<.NN5QHB7s8N'#5_4Lc!!,?9r;ZhKqu?Zrqu6Zs5g96/ +JO&c*!.jqF!s&@P^=WAc^4G\Os+1(I!J(7ErrKi!r.+u9^An35n,E@fg&HR~> +k5PI`KDPTMKE(sLUAk5oKDb`NK)gQ$rs45W]`<]bs$8sMrrTl362^c^!!%ZMs6B[`rr@]_Ps+C4K!J:CGrrKf!r.>,<^&S*4n,E@fg&HR~> +k5PI`KD5BG;PO0l!/(4L!eUK*qu6eO!5/Abq#:>Hr;QkO!!%ZMrrE*cq>^JIqYpW1!!)ut!J:CJ +KE"7:KE(rS^&Pc3!<)p!K)e4:rt)krs+>q(K>%;us8Te4K)gQ%s8N'$5l^m_re(4NqL\i8!!)rs +rrDnJ!^Qedqh"u:!!%ZMrr@]@PrrGE +k5PI^JbT0EFr;QkM!!%TKrrE*bq>^JGqYpW2!!)ut!J(7H +JcA"7JcG`Q^Ako4!<)p!JH.t7rt)nqs+,_$J\M/us8Th5JH19!s8N'$5QCdardk(LqLJ]5!!)rs +rrDnH!^H_cqgei7!!%TKrr@W:!!%TKs6fpf^Ae-45k=sZJLCKuJO',5!'pG^!'o!5#=&7hJUme$ +5k=pTJbT0GJO"ebrrBdfrr>=OrrGB9qu6\J5k4mSJc5TK!:Tpf!87C&~> +k5PI`KD5BG;PO0l!/(4L!eUK*qu6eO!5/Abq#:>Hr;QkO!!%ZMrrE*cq>^JIqYpW1!!)ut!J:CJ +KE"7:KE(rS^&Pc3!<)p!K)e4:rt)krs+>q(K>%;us8Te4K)gQ%s8N'$5l^m_re(4NqL\i8!!)rs +rrDnJ!^Qedqh"u:!!%ZMrr@]@PrrGE +k5PG3pAY+jUAk5o62^`aK)gQ$rrdsPrr>@Urr[lR!/(7M!<@cJrr@]Hs8N)trrI`Pq>^JIq>UJJ +!<)ouK)k]H!!)fo!<@cNrrdrS^&N`^rr@]Is8N)srrE+Pq>UGIq>UMK!/(7M!eUKdqYpT0KDGNK +5lcQ9rrE*tqZ$SJnc&Ui^&7m3K)iU^rrE*cqu6ZsK=_'_KD5BH]g;Sr!/'&+!/'\=!<@cLrrIa< +li-qbn,E@fg&HR~> +k5PG4pAY+mUAk5o5lCW`JH18urrdmQrr>=Trr[fP!.k+K!<@]Hrr@WFs8N)trrIZNq>^JGq>UJH +!<)ouJH5KF!!)fo!<@]LrrdlQ^Aic]rr@WGs8N)srrE+Nq>UGGq>UMI!.k+K!eC?cqYpT1Jbf +k5PG3pAY+jUAk5o62^`aK)gQ$rrdsPrr>@Urr[lR!/(7M!<@cJrr@]Hs8N)trrI`Pq>^JIq>UJJ +!<)ouK)k]H!!)fo!<@cNrrdrS^&N`^rr@]Is8N)srrE+Pq>UGIq>UMK!/(7M!eUKdqYpT0KDGNK +5lcQ9rrE*tqZ$SJnc&Ui^&7m3K)iU^rrE*cqu6ZsK=_'_KD5BH]g;Sr!/'&+!/'\=!<@cLrrIa< +li-qbn,E@fg&HR~> +gA_.NUAk5o;Z-OrK)gQ$rs"*Rrr<$Jec#LK;CVSE##a"OK)bn(rVlluKDGNIF85e8!<)ouK)k`I +s+C.I!J:CNrrRfQKDGNI!;QQp!/(4L!s&B$KDb`MeV!\t!E&pqrrE+Pq>UFDq>UMK!/(7M!J:CI +rr@]IrrRfQKDkfN!3H%ss+BkA!!)lq!!)lq!E+RIrrE+P])Mb_nG`NAe_L0)KC/[>!/(1K!J:C< +rr<&frr<&Ps*t~> +gA_.QUAk5oUL<@IhG#$'7SJH,\$rVlluJbfUFCq>UMI!.k+K!J(7G +rr@WGrrR`OJc5TL!35nqs+0_?!!)lq!!)lq!EF^JrrE+N])Mb]nG`N?f%g9*JaNI +gA_.NUAk5o;Z-OrK)gQ$rs"*Rrr<$Jec#LK;CVSE##a"OK)bn(rVlluKDGNIF85e8!<)ouK)k`I +s+C.I!J:CNrrRfQKDGNI!;QQp!/(4L!s&B$KDb`MeV!\t!E&pqrrE+Pq>UFDq>UMK!/(7M!J:CI +rr@]IrrRfQKDkfN!3H%ss+BkA!!)lq!!)lq!E+RIrrE+P])Mb_nG`NAe_L0)KC/[>!/(1K!J:C< +rr<&frr<&Ps*t~> +gA_.NUAk5oKDb`NK)gQ$rs+0*rr@\b!58@2!C>98rs$.:]n6:bKDkfN!/(+I!3GtqrrE#t!J:CJ +s8R`IrrI`PrVlqO!/(+I!($D[!<@cMrrW9$s1S@1s+C.I!C6_`rrE+Pq>UEpq>UMK!/(7M!J:C@ +rrRfQKDkfN!/(.Js+BkA!!)lq!!)lqs+C4K!<@b`rr@]?rr@],rr@]=rrGE +gA_.QUAk5oJc,NLJH18urs+*'rr@Va!5AF3!C568rs$1;^4?7aJc5TL!.jtG!35horrE#t!J(7H +s8RZGrrIZNrVlqM!.jtG!'p>Z!<@]KrrW9$s1\F2s+1"G!C-Y_rrE+Nq>UEpq>UMI!.k+K!J(7> +rrR`OJc5TL!.k"Hs+0_?!!)lq!!)lqs+1(I!<@\^rr@W=rr@W*rr@W;rrGB9qu6\J!:0Xb!:Tpf +!87C&~> +gA_.NUAk5oKDb`NK)gQ$rs+0*rr@\b!58@2!C>98rs$.:]n6:bKDkfN!/(+I!3GtqrrE#t!J:CJ +s8R`IrrI`PrVlqO!/(+I!($D[!<@cMrrW9$s1S@1s+C.I!C6_`rrE+Pq>UEpq>UMK!/(7M!J:C@ +rrRfQKDkfN!/(.Js+BkA!!)lq!!)lqs+C4K!<@b`rr@]?rr@],rr@]=rrGE +gA_.NUAk5oKDb`NK)gQ$rs+/V]`<]b]`A$2!J;j"rrBb2!!%ZMs8N)prr@]Hs8N)trrI`Pn,EE@ +!<)p!]`<]SrrU^NKDb`M!587/s1S7.rrDusrrDlp!584.!eUK*rVlnN!:TpgK)kiL!@]rrE+Pqu6ZsKDYZL!/%l_!/'b?!574g!PO-Qs8R`KrrI`Pli-rNn,E@fg&HR~> +gA_.QUAk5oJc,NLJH18urs+)T^&W`a^&\-3!J)ZtrrBe3!!%TKs8N)prr@WFs8N)trrIZNn,EE> +!<)p!^&W`RrrUaOJc,NK!5A=0s1\=/rrDusrrDlp!5A:/!eC?&rVlnL!:TpgJH5WJ!=\rrE+Nqu6ZsJc#HJ!.h`]!.jV=!5@:h!PX-Ps8RZIrrIZNli-rMn,E@fg&HR~> +gA_.NUAk5oKDb`NK)gQ$rs+/V]`<]b]`A$2!J;j"rrBb2!!%ZMs8N)prr@]Hs8N)trrI`Pn,EE@ +!<)p!]`<]SrrU^NKDb`M!587/s1S7.rrDusrrDlp!584.!eUK*rVlnN!:TpgK)kiL!@]rrE+Pqu6ZsKDYZL!/%l_!/'b?!574g!PO-Qs8R`KrrI`Pli-rNn,E@fg&HR~> +gA_.NUAk5oKDb`NK)gQ$rs46+rr@]Os1JF2rrIa^LErVusb +KDkiS5la1N!($P_qu?aH62^c`621HXs8N)sK)e42K*"==KDkfOK)e4,K*"==KDkfZ!%GUpK7j3; +]g4rt]n?7_"24_e^%VI-5lcQ7rrGE!/(1K!J:C?rr]t7rrDNf!!(^P +J,~> +gA_.QUAk5oJc,NLJH18urs40(rr@WMs1SL3rrI[9r;Z`r!.k+KlN$n`!.jJ:rVlkKq>^LDrVusa +Jc5WQ5QF%L!'pJ^qu?aG5lCZ_5kk?Ws8N)sJH.t/JHA(:Jc5TMJH.t)JHA(:Jc5TX!%>RqJV!j8 +^-Frt^4H4^"2=ed^@qR.5QHB4rrGB9qu6ZsJ\(j]J][olJaNI +gA_.NUAk5oKDb`NK)gQ$rs46+rr@]Os1JF2rrIa^LErVusb +KDkiS5la1N!($P_qu?aH62^c`621HXs8N)sK)e42K*"==KDkfOK)e4,K*"==KDkfZ!%GUpK7j3; +]g4rt]n?7_"24_e^%VI-5lcQ7rrGE!/(1K!J:C?rr]t7rrDNf!!(^P +J,~> +gA_.NUAk5oKDb`NK)gQ$rrdsPrr@]Hrr@]Lrr[lR!/(7MrrDkI!%I\qrrE#t!J:CJKE"75K)n7< +rVlqO!($F5!!)hI!`B#Nr;Z*`r;Z*`!/(7M!/'V!/(1K!J:C +gA_.QUAk5oJc,NLJH18urrdmQrr@WFrr@WJrr[fP!.k+KrrDkG!%@VnrrE#t!J(7HJcA"2JH8"9 +rVlqM!'p@2!!)hG!`]5Or;Z*`r;Z*`!.k+K!.jJ:!5AF3h#R +gA_.NUAk5oKDb`NK)gQ$rrdsPrr@]Hrr@]Lrr[lR!/(7MrrDkI!%I\qrrE#t!J:CJKE"75K)n7< +rVlqO!($F5!!)hI!`B#Nr;Z*`r;Z*`!/(7M!/'V!/(1K!J:C +gA_.NUAk5oKDb`NK)gQ$rrdsPrr>@]rrBb/rr[lR!/(7M!<>F]rr>sls8N)trrGCcq>^JIq>UJJ +!<)p!K)gQ"rr@]IrrT8%KDkfRK)iUb6,!6s!PO-]s8N)srrE*cq>UF\q>UL^!/(7M!eUKdqYpT0 +62CN^5leUsrrE*tqZ$R]o`#-/K7a0;s8W(N!C6_^rrE*cqu6ZsK=_'_KCf-C]`J/Hh#@A,m/I(d +62UZ_K)k6;!!)Kf!!(^PJ,~> +gA_.QUAk5oJc,NLJH18urrdmQrr>=\rrBe0rr[fP!.k+K!<>C\rr?'os8N)trrG@bq>^JGq>UJH +!<)p!JH18srr@WGrrT2#Jc5TPJH3Fa5ed3s!PX-\s8N)srrE*bq>UF[q>UL]!.k+K!eC?cqYpT1 +5l(E]5QJOsrrE+"qZ$R\o`#-0JUmg8s8W(L!C-Y]rrE*bqu6ZsJ\(j]Jb/pA^&e8Jh#@A*m/I(d +5l:Q^JH5$9!!)Kf!!(^PJ,~> +gA_.NUAk5oKDb`NK)gQ$rrdsPrr>@]rrBb/rr[lR!/(7M!<>F]rr>sls8N)trrGCcq>^JIq>UJJ +!<)p!K)gQ"rr@]IrrT8%KDkfRK)iUb6,!6s!PO-]s8N)srrE*cq>UF\q>UL^!/(7M!eUKdqYpT0 +62CN^5leUsrrE*tqZ$R]o`#-/K7a0;s8W(N!C6_^rrE*cqu6ZsK=_'_KCf-C]`J/Hh#@A,m/I(d +62UZ_K)k6;!!)Kf!!(^PJ,~> +gA_.NUAk5oKDb`NK)gQ$rrn$Qrr<$brVlr4!!)ut#!r:hK)bn(rVlluKDGNIXSDhq!<)rt!;ZZp +KDGNJK)klM!eUK*q>UGIq#:?pKDkfQK)krOKDYZKKDGQI!;uit!/(+I!!)ip!eUK*rVlnN!;QQo +KDGNKK)iU`rrE,$qYpQ/nG`Igqu6\L!;c]r!/(1K!<@b`rr@]@s8R`-rr@] +gA_.QUAk5oJc,NLJH18urrmsRrr<$arVlr5!!)ut#!i4gJH,\$rVlluJbfUGGq#:?pJc5TOJH5`MJc#HIJbf?G!;uit!.jtG!!)ip!eC?&rVlnL!;QQo +Jbfs8RZ+rr@W:rrE+Nqu6\J!:0Xb +!:Tpf!87C&~> +gA_.NUAk5oKDb`NK)gQ$rrn$Qrr<$brVlr4!!)ut#!r:hK)bn(rVlluKDGNIXSDhq!<)rt!;ZZp +KDGNJK)klM!eUK*q>UGIq#:?pKDkfQK)krOKDYZKKDGQI!;uit!/(+I!!)ip!eUK*rVlnN!;QQo +KDGNKK)iU`rrE,$qYpQ/nG`Igqu6\L!;c]r!/(1K!<@b`rr@]@s8R`-rr@] +gA_.NUAk5oKDb`NK)gQ$rs+0SK)e3N!58C3!keTarr32962uQ;!/(7M!<>FSs8N)ts8N)prrIbc +q>UJJ!<)p!K)gQ"rr@]IrrT8%KDkfQK)iUbKDb`M]n?.\rrDus!<@cJrr<&prrRfQKDkfNK)kB? +!J:CMrrE+Pkl1V_qu6\L!;c]r!/(1K!<@b`rr@]@s8Tdgrr@] +gA_.QUAk5oJc,NLJH18urs+*TJH.sL!5AI4!knZcrr32:5lZB8!.k+K!<>CRs8N)ts8N)prrI\b +q>UJH!<)p!JH18srr@WGrrT2#Jc5TOJH3FaJc,NK^4H+[rrDus!<@]Hrr<&prrR`OJc5TLJH50= +!J(7KrrE+Nkl1V_qu6\J!;c]r!.k%I!<@\^rr@W>s8Tghrr@W:rrE+Nqu6\J!:0Xb!:Tpf!87C&~> +gA_.NUAk5oKDb`NK)gQ$rs+0SK)e3N!58C3!keTarr32962uQ;!/(7M!<>FSs8N)ts8N)prrIbc +q>UJJ!<)p!K)gQ"rr@]IrrT8%KDkfQK)iUbKDb`M]n?.\rrDus!<@cJrr<&prrRfQKDkfNK)kB? +!J:CMrrE+Pkl1V_qu6\L!;c]r!/(1K!<@b`rr@]@s8Tdgrr@] +gA_.NUAk5oKDb`NK)gQ$rs46Trr@]O]`>bFrrIa$rVll2r;ZhMrVuis!eWc=pO`W8K7cGi!<)p! +5l^o^K)egK!<,:`!!5Fd!<)p!K)e45K)boIK*!J%KDkfRK)e2i!($R9s$?I5rrDusrr<&4rr<#3 +s8N*"^&%a15lcQ9rrRfQ^$u(%!!'_2rrE*tkl1V_qu6\L!;c`q!;lcs!/%l_!/'e@!/'),!/'Y< +!<@cLrrIa +gA_.QUAk5oJc,NLJH18urs40Urr@WM^&YnHrrI[!rVll3r;ZhKrVuis!eET:pONK5JUp&d!<)p! +5QCf]JH/^L!<,7_!!5Cc!<)p!JH.t2JH,]GJH@5"Jc5TPJH.rd!'pL6s$6C2rrDusrr<&5rr<#4 +s8N*"^A@j25QHB6rrR`O^@;1&!!'b3rrE+"kl1V_qu6\J!;c`q!;lcs!.h`]!.jY>!.ir*!.jM: +!<@]JrrI[9li-qbn,E@fg&HR~> +gA_.NUAk5oKDb`NK)gQ$rs46Trr@]O]`>bFrrIa$rVll2r;ZhMrVuis!eWc=pO`W8K7cGi!<)p! +5l^o^K)egK!<,:`!!5Fd!<)p!K)e45K)boIK*!J%KDkfRK)e2i!($R9s$?I5rrDusrr<&4rr<#3 +s8N*"^&%a15lcQ9rrRfQ^$u(%!!'_2rrE*tkl1V_qu6\L!;c`q!;lcs!/%l_!/'e@!/'),!/'Y< +!<@cLrrIa +gA_.NUAk5oKDb`NK)gQ$rs46Trr@]Os1Q,FrrRg%62gf`^&A!3KDki9KDkfY]n8TN!'u6'!!#<; +!<,7bK0fHgr;QeM62lN:5l^o]K)e4:K*!Jf^&7m1KC/^>62^cL!!'_2rr@]>^&J$3!;c]qKDtlUK0b,Uec5XLg&HR~> +gA_.QUAk5oJc,NLJH18urs40Urr@WMs1Z5HrrRa"5lL]_^A\*4Jc5W7Jc5TW^4ANL!'l*#!!#98 +!<,4aJO'0br;QeK5lQ?75QCf\JH.t7JH@5b^AS!2JaNL<5lCZK!!'b3rr@W:!;ulQ!;c`q!;lcs +!.h`]!.jY>s1[=h!!)Bc!<@]JrrIZNp&G#B"29>;^Ae-4!;c]qJc>ZSJO"cOf)PaMg&HR~> +gA_.NUAk5oKDb`NK)gQ$rs46Trr@]Os1Q,FrrRg%62gf`^&A!3KDki9KDkfY]n8TN!'u6'!!#<; +!<,7bK0fHgr;QeM62lN:5l^o]K)e4:K*!Jf^&7m1KC/^>62^cL!!'_2rr@]>^&J$3!;c]qKDtlUK0b,Uec5XLg&HR~> +gA_.NUAk5oKDb`NK)gQ$rrds']`<]]rrRiQ^&7m4K)bn(WrE)cKBiL:^%;7(^%q[.^$UIMrrBah +KDPWJ!;lcs!/%l_!/&Go!/'Y +gA_.QUAk5oJc,NLJH18urrdm$^&W`\rrRcO^AS!5JH,\$WrE)bJa3:8^@V@)^A7d/^?pLLrrBdi +JboEH!;lcs!.h`]!.i;m!.jM:!<@]JrrIZNpAY.YJc,NN5ed9u!;c^'JcGbaJcGba +gA_.NUAk5oKDb`NK)gQ$rrds']`<]]rrRiQ^&7m4K)bn(WrE)cKBiL:^%;7(^%q[.^$UIMrrBah +KDPWJ!;lcs!/%l_!/&Go!/'Y +gA_.NUAk5oKDb`NK)gQ$rrdsPK)e48s8Tb462LT`K)bn(WrE*P]o;sl!($M^!<@b`rr@]@rr@], +rr<&crrE+Pqu6\L!;?EmKDYZO]g;\u!;c]uKE(t(^&J$6;ZHasg&HR~> +gA_.QUAk5oJc,NLJH18urrdmQJH.t5s8Te55l1K_JH,\$WrE*N^5W'm!'pG]!<@\^rr@W>rr@W* +rr<&crrE+Nqu6\J!;?EmJc#HM^-M_u!;c]uJcGb$^Ae-7 +gA_.NUAk5oKDb`NK)gQ$rrdsPK)e48s8Tb462LT`K)bn(WrE*P]o;sl!($M^!<@b`rr@]@rr@], +rr<&crrE+Pqu6\L!;?EmKDYZO]g;\u!;c]uKE(t(^&J$6;ZHasg&HR~> +gA_.NUAk5oKDb`NK)iU^rrn$QK)bm;rVlr4!!*#us1SI4"+pRRK<"tOK8fg2!/(1K!<@b`rr@]B +rrTn6KA?J,KC&U=!/(1K!J:CGrr@]JrrYRerrDrrs+C@O!/(7M"&f1!!87C&~> +gA_.QUAk5oJc,NLJH3F]rrmsRJH,[8rVlr5!!*#us1\O5"+^FPJZAbMJW0U0!.k%I!<@\^rr@W@ +rrTq7J_^8*JaEC;!.k%I!J(7Err@WHrrYOdrrDrrs+14M!.k+K"',C$!87C&~> +gA_.NUAk5oKDb`NK)iU^rrn$QK)bm;rVlr4!!*#us1SI4"+pRRK<"tOK8fg2!/(1K!<@b`rr@]B +rrTn6KA?J,KC&U=!/(1K!J:CGrr@]JrrYRerrDrrs+C@O!/(7M"&f1!!87C&~> +g]%?*(k\Xa!iuBSr;QhN!7guH#(og+!/#p*rVlrL!3H2"s+:ISK)bn(WrN*ON;inY;Z$Ip!/%l_ +!/(.JrDNZJ"EQ#Es+B,,!/'Y +g]%?+*.apc!ic6Or;QhL!7q&I#(]d*!.f^$rVlrM!36%us+(=QJH,\$WrN*MN;inYi@s+/u*!.jM:!<@]JrrI[!pAY.Af)>UPelAaMrrDrr"kJ8)s&H)urr[9@rrCaP +J,~> +g]%?*(k\Xa!iuBSr;QhN!7guH#(og+!/#p*rVlrL!3H2"s+:ISK)bn(WrN*ON;inY;Z$Ip!/%l_ +!/(.JrDNZJ"EQ#Es+B,,!/'Y +g]%>g!!&hp!keSdr;QhN!/(1K"+sL(!<)ot^&J$4!%ImH!PLeu!!%ZDrrGCcl2Lla!.t9bm/I7& +!/#ni^%).&KDYZM]`8'"s8)cr^$Yh"^&EWa^$bn#^&!BRs8IZCs8N)rrrE+P])Mb_qYpPJqYpW1 +s+B/-s+B\3/;M0TfKDkfM!;c^'!/#n(^&S,GKE(rOg&HR~> +g]%>h!!&hp!knYcr;QhL!.k%I"+aI'!<)ot^Ae-5!%@gG!PUhu!!%TBrrG@bl2Lld!.b-am/I7' +!.f\d^@D7'Jc#HK^&S0#s8)cr^?tq#^A`Z`^@)"$^A30 +g]%>g!!&hp!keSdr;QhN!/(1K"+sL(!<)ot^&J$4!%ImH!PLeu!!%ZDrrGCcl2Lla!.t9bm/I7& +!/#ni^%).&KDYZM]`8'"s8)cr^$Yh"^&EWa^$bn#^&!BRs8IZCs8N)rrrE+P])Mb_qYpPJqYpW1 +s+B/-s+B\3/;M0TfKDkfM!;c^'!/#n(^&S,GKE(rOg&HR~> +gA_0RK;8GI!/(4L!eUK*qu6bN;M+uKrs-4;^&S+be\1n\"$lneKD#6G6%agTrs$.c!/!Q;^$bn) +eNj1fK=q9Ts8R`Lrr]q7K)k?>#JGaU!'pSb^$bn)]g4pa5leUerr@]M!!5H=!;?EseNj08K0d3E +s8N)rrrE+P])Mb_nG`K@h>[J-li-tcKDYZLK)k6;!!)Kf!!(^PJ,~> +gA_0RJYW5G!.k(J!eC?&qu6bLh>[J+li-tcJc#HJJH5$9!!)Kf!!(^PJ,~> +gA_0RK;8GI!/(4L!eUK*qu6bN;M+uKrs-4;^&S+be\1n\"$lneKD#6G6%agTrs$.c!/!Q;^$bn) +eNj1fK=q9Ts8R`Lrr]q7K)k?>#JGaU!'pSb^$bn)]g4pa5leUerr@]M!!5H=!;?EseNj08K0d3E +s8N)rrrE+P])Mb_nG`K@h>[J-li-tcKDYZLK)k6;!!)Kf!!(^PJ,~> +gA_0RK;8GI!/(4L!eUKdqu6bN;M+uJrrg"8^&N`]rr[lR!/("F"+pTeKBiI@!/%ub5la4=rs)GS +6%_Hh!/'kBs+C7Ls$6\c!:KmeK)e4:K)iUPrrrJ:!.t7O61=gR^&EWd5la2KpAY.B!<,7bK0f52 +rrDrr!<@b`rr@]@s8R`.rrIbcm/I(dKDY]KKBrO;!:Tpf!87C&~> +gA_0RJYW5G!.k(J!eC?cqu6bL!.hla5QF(;rs)PT +5_20c!.j_@s+1+Js$-Vb!:KmeJH.t7JH3FOrrrJ;!.b+M5k"^Q^A`Zc5QF&LpAY.A!<,4aJO&r/ +rrDrr!<@\^rr@W>s8RZ,rrI\bm/I(dJc#KIJa<=9!:Tpf!87C&~> +gA_0RK;8GI!/(4L!eUKdqu6bN;M+uJrrg"8^&N`]rr[lR!/("F"+pTeKBiI@!/%ub5la4=rs)GS +6%_Hh!/'kBs+C7Ls$6\c!:KmeK)e4:K)iUPrrrJ:!.t7O61=gR^&EWd5la2KpAY.B!<,7bK0f52 +rrDrr!<@b`rr@]@s8R`.rrIbcm/I(dKDY]KKBrO;!:Tpf!87C&~> +gA_-QUAk5oKDb`MK)kcJ"G9U)!($S`"2.##!<2uuKDtlQK)bn(pAY6.!!#p^rrrHPs8R]O!:Kjl +;?2@Lrr<%Oo)J`BrVlj`r;c9c!eUJ=lMpg8"94!>KBrO>K)bo%pAb-ms8W+O!!)`mrrDrr!<@ba +rrKfcnGiN@hZ!QUli-tcKDYZLK)k6;!!)Kf!!(^PJ,~> +gA_-QUAk5oJc,NKJH5QH"G'R(!'pM_"27&#!<2uuJc>ZOJH,\$pAY6/!!$$arrrHOs8RWM!:Kjl +<<.UMrr<%Mo)J`@rVlj_r;c9c!eC>:lMpg6"93p;Ja<=hZ!QUli-tcJc#HJJH5$9!!)Kf!!(^PJ,~> +gA_-QUAk5oKDb`MK)kcJ"G9U)!($S`"2.##!<2uuKDtlQK)bn(pAY6.!!#p^rrrHPs8R]O!:Kjl +;?2@Lrr<%Oo)J`BrVlj`r;c9c!eUJ=lMpg8"94!>KBrO>K)bo%pAb-ms8W+O!!)`mrrDrr!<@ba +rrKfcnGiN@hZ!QUli-tcKDYZLK)k6;!!)Kf!!(^PJ,~> +gA_-QUAk5oKDb`MK)kcJ"bT^*!!#=^rr<&urs+0Bs8R]O!/'qD!$sX"t9P)rr>=bpAb-mqu6ZsK=q3d]`8&_nc&WB +^#&bhKBrO +gA_-QUAk5oJc,NKJH5QH"bB[)!!#:]rr<&urs+*?s8RWM!.jeB!ZL^AJ!!rr@WJ!!'b$s8RZK!!#:Mrr]u#J\LgW"t0J&rr>:apAb-mqu6ZsJ\;!b^&S/anc&W@ +^>AkiJa<=:!.k%I!J(7:rr<&frr<&Ps*t~> +gA_-QUAk5oKDb`MK)kcJ"bT^*!!#=^rr<&urs+0Bs8R]O!/'qD!$sX"t9P)rr>=bpAb-mqu6ZsK=q3d]`8&_nc&WB +^#&bhKBrO +gA_-QUAk5oKDb`MK)kcJ#(og+!51ZarVlr4!7h)K#/*>&5l^n;o`"pl;X",\^&A#trrdrSKDtrA +s8R`Ors$.:!54!b!:Kjl!'rmN!51\3n,NE?"oeQ&5s^.irrPK=!;-9k;Z24K!/("F!<@cLrrE+P +]Dqm2!3G_j!/'/.s+BY;!<@cLrrI`Pmf*C&s8N)frr<&Ps*t~> +gA_-QUAk5oJc,NKJH5QH#(]d*!5:]`rVlr5!7q/L#/3A&5QCe8o`"pl`? +s8RZMrs$1;!5=!a!:Kjl!'idL!5:_4n,NE="oeQ&5X9nerrPH:!;-9k +gA_-QUAk5oKDb`MK)kcJ#(og+!51ZarVlr4!7h)K#/*>&5l^n;o`"pl;X",\^&A#trrdrSKDtrA +s8R`Ors$.:!54!b!:Kjl!'rmN!51\3n,NE?"oeQ&5s^.irrPK=!;-9k;Z24K!/("F!<@cLrrE+P +]Dqm2!3G_j!/'/.s+BY;!<@cLrrI`Pmf*C&s8N)frr<&Ps*t~> +gA_HZ^&PeG^&S+b]r_58K)gQ%rrRfQ^&.g7K)e1;^&J'urr3&5!%ImH!($P`!/'qD!F_K*+F>rrDWi",$XR!87C&~> +gA_HZ^AkqI^An4a^9%>9JH19!rrR`O^AIp8JH.q8^Ae0urr3&6!%@gG!'pJ_!.jeB!% +5QJOarrp,f!.b-$o)J`@s8N9'JH5_$5QL6P#JPc's1SIu5k"aNJHA*N!:Bdd^A`]Urrsm&JO"bd +5kb3Y!.k%I!<@\_s8N)grr@W,rrI\bli-tcJc#HJ5QLNX!<>C^JHJ1;rrDWi"+gLP!87C&~> +gA_HZ^&PeG^&S+b]r_58K)gQ%rrRfQ^&.g7K)e1;^&J'urr3&5!%ImH!($P`!/'qD!F_K*+F>rrDWi",$XR!87C&~> +g]-&]!^VH:T`>(Fo`"pl;X+2_!'rp:rrH"`rr3$"K0f).s+:=Ore(1M!eUJ=lMgp +g]-&[!^M<:T`>(Do`"pl:lMgp:!'p#Qs+(=R +s8RWM!:BgdJH.t-rs-7d!5AIu5QLNXrrDrr!<@\_s8N)js8RWNs+0&,!'oiL!<@]Js8P@XrrBe- +rr@W=rr<&Ps*t~> +g]-&]!^VH:T`>(Fo`"pl;X+2_!'rp:rrH"`rr3$"K0f).s+:=Ore(1M!eUJ=lMgp +JcGWI!keSdr;QhN!58:0!C9W_s8%?J!;V6K5lcQ0rrE*tlMgoOK)k3:#>tPSs8N(O61Y'UK*)(* +62gid62s4Nn,NCf"hjs9!!%Z?s8R]T63$t;!!)EdrW)Tjre(7Nre'qE!<@cLrrE+P]Dhm362UZ` +]`8'1K*)++s+B2.!/'S:!<@cLs8R`;rr>@Rrr<&Ps*t~> +JcGWI!knYcr;QhL!5A@1!C0Zas8%9H!;V0I5QHB-rrE+"lMgoNJH5!8#?:bTs8N(M5k=sTJHGk& +5lL`c5lX(Ln,NCf"ht$:!!%T=s8RWR5l^k8!!)EdrW)Tjrdk+LrdjeC!<@]JrrE+N]Dhm35l:Q_ +^&S02JHGn's+0&,!.jG8!<@]Js8RZ9rr>=Qrr<&Ps*t~> +JcGWI!keSdr;QhN!58:0!C9W_s8%?J!;V6K5lcQ0rrE*tlMgoOK)k3:#>tPSs8N(O61Y'UK*)(* +62gid62s4Nn,NCf"hjs9!!%Z?s8R]T63$t;!!)EdrW)Tjre(7Nre'qE!<@cLrrE+P]Dhm362UZ` +]`8'1K*)++s+B2.!/'S:!<@cLs8R`;rr>@Rrr<&Ps*t~> +JcGTH!<@cMrrI`PqYpSK;Y^7n]g:3FrrRfQKCo0E!/'S:! +JcGTH!<@]KrrIZNqYpSIhZ!S,lMgkbJc#HJ5_88$!!)Kf!!(^PJ,~> +JcGTH!<@cMrrI`PqYpSK;Y^7n]g:3FrrRfQKCo0E!/'S:! +JcGTH!<@cMrrI`PqYpPJo)JbVq>^MJo`+pklMgqdK0_g&!:BdiK)bn(!/'hAs+C4K!eUIQmf*L) +6%].;5sao<#!mkA!'roamf*BA5s^.prrFR$r;ZhMpAY-n62^``.0-sZs+Bh@!/'2/s+BV:!<@cM +rrTk6KBrO;61=gR!87C&~> +JcGTH!<@]KrrIZNqYpPHo)JbUq>^MHo`+pklMgqdJNuL"!:BdiJH,\$!.j\?s+1(I!eC=Omf*L* +5_/n85X=`:#!d_>!'if`mf*B?5X9nlrrFO!r;ZhKpAY-n5lCW_-igjYs+0\>!.j&-s+0J8!<@]K +rrTn7Ja<=95k"^Q!87C&~> +JcGTH!<@cMrrI`PqYpPJo)JbVq>^MJo`+pklMgqdK0_g&!:BdiK)bn(!/'hAs+C4K!eUIQmf*L) +6%].;5sao<#!mkA!'roamf*BA5s^.prrFR$r;ZhMpAY-n62^``.0-sZs+Bh@!/'2/s+BV:!<@cM +rrTk6KBrO;61=gR!87C&~> +JcGTH!<@cMrrRfQebf@IK,FBb!eUK2qQ'`r!/&u)s/Z:PXOZY:s/b\hs+C1J!Nai=rrCUKX8pf: +rrfEUK<3Vjrr^eL;UtC="m2ma;M2(Ds7u]s;?/0EXT!hUXAZ-X;M4qLs+C-Ks+;"`K2Se'XK7&, +XK;H'XFjF$;GsSordtYXXAX\PXAZ.$;M0U"KDqtP.0-I>rr@]/rrFS!lMgkb.K-=LK)eg7rr=M@ +rrCUIrr<&Ps*t~> +JcGTH!<@]KrrR`Of),IJJK4Hb!eC?2qPjTs!.ii's/H.OWn-M9s/PPfs+1%H!NO` +JcGTH!<@cMrrRfQebf@IK,FBb!eUK2qQ'`r!/&u)s/Z:PXOZY:s/b\hs+C1J!Nai=rrCUKX8pf: +rrfEUK<3Vjrr^eL;UtC="m2ma;M2(Ds7u]s;?/0EXT!hUXAZ-X;M4qLs+C-Ks+;"`K2Se'XK7&, +XK;H'XFjF$;GsSordtYXXAX\PXAZ.$;M0U"KDqtP.0-I>rr@]/rrFS!lMgkb.K-=LK)eg7rr=M@ +rrCUIrr<&Ps*t~> +JcGWI!eUK*r;QhN!/(1K!J=;Err<&prrTk6K<"tOK8fj1!;lcs]n=Q/s1SC2!PR%Frr@]/rr>@L +s7u]qKB`C9!;c`qK*f6kK)gOVec5XLg&HR~> +JcGWI!eC?&r;QhL!.k%I!J+8Frr<&prrTn7JZAbMJW0X/!;lcs^4FN.s1\I3!P[.Hrr@W-rr>=K +s7u]qJa*17!;c`qJI0'jJH17Pf)PaMg&HR~> +JcGWI!eUK*r;QhN!/(1K!J=;Err<&prrTk6K<"tOK8fj1!;lcs]n=Q/s1SC2!PR%Frr@]/rr>@L +s7u]qKB`C9!;c`qK*f6kK)gOVec5XLg&HR~> +JcGWI!eUK*r;QeM!;c]rK2VID!!)ip!eUK*WrE)cK8fj1!;c]q6)ae`KAZ\/KB`C:!($U:!C6_L +rr@]Js8PCarr<&srr<&Ps*t~> +JcGWI!eC?&r;QeK!;c]rJQ;IE!!)ip!eC?&WrE)bJW0X/!;c]q5cF\_J`$J-Ja*18!'pO7!C-YK +rr@WHs8P@`rr<&srr<&Ps*t~> +JcGWI!eUK*r;QeM!;c]rK2VID!!)ip!eUK*WrE)cK8fj1!;c]q6)ae`KAZ\/KB`C:!($U:!C6_L +rr@]Js8PCarr<&srr<&Ps*t~> +JcGTH!UR`^&S*4r;Q`sg&HR~> +JcGTH!UR_^An35r;Q`sg&HR~> +JcGTH!UR`^&S*4r;Q`sg&HR~> +JcGWI!eUK*r;QeM!;c]qKDklIK*"==;Yl%G!!%ZIrsHF>K0b.iK)e1;^&7m2K)kZGr]q#lrr<'! +s+:<(s1JC]!584.%_Vkm!($Yb5l^nurr<%Op\tMO5lcOi!58CurW!"Ps4.)K!C=Eprs+0B5lgq; +!!*#u!3H,!!/(4L%RC)r!!*'!K)gQ(s+$7D!(#iK!<@cNrrW6eK>$UN!/((Hs+:@P!;uis +6.u9g~> +JcGWI!eC?&r;QeK!;c]qJc5ZGJHA(:]K!!,@! +rr<"Lrr3#55lCZff)L=$rr<$aqu6]2JZ8YMJ\L+C!'ocJ!<@]LrrW6dJ\LIM!.jqFs+(4N!;uis +5hZ0f~> +JcGWI!eUK*r;QeM!;c]qKDklIK*"==;Yl%G!!%ZIrsHF>K0b.iK)e1;^&7m2K)kZGr]q#lrr<'! +s+:<(s1JC]!584.%_Vkm!($Yb5l^nurr<%Op\tMO5lcOi!58CurW!"Ps4.)K!C=Eprs+0B5lgq; +!!*#u!3H,!!/(4L%RC)r!!*'!K)gQ(s+$7D!(#iK!<@cNrrW6eK>$UN!/((Hs+:@P!;uis +6.u9g~> +JcGWI!eUK*r;QeM!;c]q^&EWa62Q9>5laf8K0]K'rdt4O^%q^.5mdRDKE&"Qs+:HZ +]`>bG;ZB#_^&N]bKE(rOX?cj]rs\u.!58F4!5/AbK)gO%p](8G"&ac(!<3!*!56&G^&J'4]`:@p +rs7-TKDtrOrr>@`rrW6e!($M^%_Vkm6,!rrVm!d!/!R'rr3!s!<3#u62pooK)gP* +!!'_4s+:<(5sbMMrrE&u$A1W1!/!S=K)krOrW)fp!!'"u!JA)Err@]8rrE+PrVltP5lcQ'rr@]G +rrTld62^`_!87C&~> +JcGWI!eC?&r;QeK!;c]q^A`Z`5l6*;5QFf8JNs3#rdb(M^A7g/5RIIAJcD_Ms+(0arVlluJb]6X +^&YnI;a^Ai`aJcG`MW^$RZrs\u.!5AL5!58GaJH17$p](8E"''o'!<3!*!5?/I^Ae05^&UFp +rs70UJc>`Mrr>=_rrW6d!'pG]%__qo5ed9u!.b-$^&UDurVm!c!.dC#rr3"!!<3#u5lUfnJH18$ +!!'b5s+(0$5X>>KrrE&u$@tH-!.dD8JH5`MrW)fp!!'"u!J.uDrr@W6rrE+NrVltN5QHB$rr@WE +rrToc5lCW^!87C&~> +JcGWI!eUK*r;QeM!;c]q^&EWa62Q9>5laf8K0]K'rdt4O^%q^.5mdRDKE&"Qs+:HZ +]`>bG;ZB#_^&N]bKE(rOX?cj]rs\u.!58F4!5/AbK)gO%p](8G"&ac(!<3!*!56&G^&J'4]`:@p +rs7-TKDtrOrr>@`rrW6e!($M^%_Vkm6,!rrVm!d!/!R'rr3!s!<3#u62pooK)gP* +!!'_4s+:<(5sbMMrrE&u$A1W1!/!S=K)krOrW)fp!!'"u!JA)Err@]8rrE+PrVltP5lcQ'rr@]G +rrTld62^`_!87C&~> +JcGWI!eUK*r;QhN!57k$!!)He$NPhZs+C?Q!<7ZOKDkfM!;HNn63$rpKE$Q(KDtoOKE(rOXM"W/ +rrN2%!<3!'!<7\bK)kq(p](8G!)ifKrr3<*s8N(Orr>@bK)kcJ#cn$>s$?\b!/(7Mrr<$bq>U[" +X8r;#K)krNK)u&Q;Z6UuK)kqb!<3#u!<3!662uQ;s+A!_K)gQ(s+:=Orr@]Orr<&ursh?.K)kq( +XFgNQrr>>NKDY]KK<"qOKAlh2eV!)c!<@cLrrE+Pli-s;pAY0,62^`_!87C&~> +JcGWI!eC?&r;QhL!5@q%!!)He$NPbXs+13M!<7TMJc5TK!;HNn5l^ioJcC9$Jc>]MJcG`MWkJK. +rrN2#!<3!'!<7VaJH5_$p](8E!*0#Lrr3<*s8N(Mrr>=aJH5QH#c[m=s$6Va!.k+Krr<$aq>U[" +WW<)!JH5`LJH>iO;LJc#KIJZA_MJ`6V0eq*&b!<@]JrrE+Nli-s9pAY0-5lCW^!87C&~> +JcGWI!eUK*r;QhN!57k$!!)He$NPhZs+C?Q!<7ZOKDkfM!;HNn63$rpKE$Q(KDtoOKE(rOXM"W/ +rrN2%!<3!'!<7\bK)kq(p](8G!)ifKrr3<*s8N(Orr>@bK)kcJ#cn$>s$?\b!/(7Mrr<$bq>U[" +X8r;#K)krNK)u&Q;Z6UuK)kqb!<3#u!<3!662uQ;s+A!_K)gQ(s+:=Orr@]Orr<&ursh?.K)kq( +XFgNQrr>>NKDY]KK<"qOKAlh2eV!)c!<@cLrrE+Pli-s;pAY0,62^`_!87C&~> +JcGWI!eUKdr;QeM!:Kje!:Kjf!/(7M"fq_(]`<]arrI`Pp\t6oKDkfZK)e4;!!%ZOrrB/#!/(+I +!eUJ=rr30&6,!Y"hjqg!'u8:rsAc+s+ +JcGWI!eC?cr;QeK!:Kje!:Kjf!.k+K"f_S&^&W``rrIZNp\t6oJc5TXJH.t8!!%TMrrB)!!.jtG +!eC>:rr30&5ed9u!'p8X"ht"f!'l,7rsAc+s+*H8!'pR8!;c]rW^-L^!<@]Ls8N'!Jbf +JcGWI!eUKdr;QeM!:Kje!:Kjf!/(7M"fq_(]`<]arrI`Pp\t6oKDkfZK)e4;!!%ZOrrB/#!/(+I +!eUJ=rr30&6,!Y"hjqg!'u8:rsAc+s+ +JcGWI!eUK*r;QeM!:KjeKC8a?!/(7M"fq_(rr@]NrrE+Pp\t6oKDkfMKDY]SKE(rOXM"Udq>UN0 +!/(:N#D3"Bs8P@bXS)SpeGoUJrsAc+s+>t(!!*%O!;c]rX8r1u!<@cNs8N'!KDGNKK)gQ'rs+/V +63$sN!3H/!$A/?Yrr@]Orr<&4rVlnN!<3!0;ZDB%s8R]Os8N(Os+::OKDkfNK)koN#_N-Wrr@]O +6,!0q!(!Xb!/'81!7g94!<@cLrrI`Pli-s;n,E@fg&HR~> +JcGWI!eC?&r;QeK!:KjeJaWO=!.k+K"f_S&rr@WLrrE+Np\t6oJc5TKJc#KQJcG`MWkJIaq>UN1 +!.k.L#Cuk?s8P=aWqHAnec5^KrsAc+s+,b$!!*%M!;c]rWW;ts!<@]Ls8N'!Jbf +JcGWI!eUK*r;QeM!:KjeKC8a?!/(7M"fq_(rr@]NrrE+Pp\t6oKDkfMKDY]SKE(rOXM"Udq>UN0 +!/(:N#D3"Bs8P@bXS)SpeGoUJrsAc+s+>t(!!*%O!;c]rX8r1u!<@cNs8N'!KDGNKK)gQ'rs+/V +63$sN!3H/!$A/?Yrr@]Orr<&4rVlnN!<3!0;ZDB%s8R]Os8N(Os+::OKDkfNK)koN#_N-Wrr@]O +6,!0q!(!Xb!/'81!7g94!<@cLrrI`Pli-s;n,E@fg&HR~> +JcGWI!eUK*r;QeM!8@G`!/(=O^&P/6s1JDbs8Tb4pAY>L63$tds+C4L#D<'V!3CeQKD>HI!/(:N +#JG`i]tOG3;Y:"h!<)p)!<<(OKDtoOs+:=JrrK2$r;QctKDkiM!!#=\rrTk6KDtlU]g2Y3s1JD1 +rVm4W!<<'!KE&Ub!/(7M!J<];rt&*.K7j4(K)krO!/(;;!!%ZMrrI`Prr37V!<<'!KE&W;qu6\L +]rV/5KAlh1e`Zr5!58:0!J:C +JcGWI!eC?&r;QeK!8@G`!.k1M^Ak25s1SJas8Te5pAY>J5l^kas+1(J#D)pT!31SMJb]6G!.k.L +#JP`h^:sV4]Ms+(1HrrK,"r;QctJc5WK!!#:[rrTn7Jc>ZS^-D\4s1SJ5 +rVm4U!<<'!JcEFa!.k+K!J*N8rt&31JV!k$JH5`M!.k/8!!%TKrrIZNrr37T!<<'!JcEH8qu6\J +^8q86J`6V/f'!&6!5A@1!J(7:rr@W=rr<&Ps*t~> +JcGWI!eUK*r;QeM!8@G`!/(=O^&P/6s1JDbs8Tb4pAY>L63$tds+C4L#D<'V!3CeQKD>HI!/(:N +#JG`i]tOG3;Y:"h!<)p)!<<(OKDtoOs+:=JrrK2$r;QctKDkiM!!#=\rrTk6KDtlU]g2Y3s1JD1 +rVm4W!<<'!KE&Ub!/(7M!J<];rt&*.K7j4(K)krO!/(;;!!%ZMrrI`Prr37V!<<'!KE&W;qu6\L +]rV/5KAlh1e`Zr5!58:0!J:C +JcGWI!eUK*r;QeM!:^!gKDkiN^$u%/K0fNiKE&"Qs+:=NrrI`PpAYeY!58D1s+NqYpu*!/(:Os8N(Os+>t(rVuqN +q>Uj'^&S+bKDtq(6%]/8rVm4W!<9_4^&N_d!!)ut!J:COrt&)A6%f4;K)krO!/(:O]g7;LrrI`P +rr37V!<<'!KE(s;qYpNqX8`3Q^#K%lKBN78!58:0s+BY;!/'b?!!(^PJ,~> +JcGWI!eC?&r;QeK!:^!gJc5WL^@;.0JO'6dJcD_Ms+(1LrrIZNpAYeW!5AJ5s+*E8!.b-$s8N)! +JH3FZrr<&trs+,T!.b-$JQ;IE"G+;e!'pM_$3:,+!.k.M!<5;LqYpu(!.k.Ms8N(Ms+,b$rVuqL +q>Uj'^An4aJc>_$5_/o8rVm4U!<9b5^Aiba!!)ut!J(7Mrt&2E5_8t8JH5`M!.k.M^-I8JrrIZN +rr37T!<<'!JcGa8qYpNqX8`3O^>f.mJ`m%6!5A@1s+0M9!.jV=!!(^PJ,~> +JcGWI!eUK*r;QeM!:^!gKDkiN^$u%/K0fNiKE&"Qs+:=NrrI`PpAYeY!58D1s+NqYpu*!/(:Os8N(Os+>t(rVuqN +q>Uj'^&S+bKDtq(6%]/8rVm4W!<9_4^&N_d!!)ut!J:COrt&)A6%f4;K)krO!/(:O]g7;LrrI`P +rr37V!<<'!KE(s;qYpNqX8`3Q^#K%lKBN78!58:0s+BY;!/'b?!!(^PJ,~> +JcGWI!eUK*r;QeM!:g'i6%f+9!57q&!58@3#/1&ps +KD5BG.K08O!.t:OK0_e$p](8G!rkQ=rr3A>!54!bs8N'!K)iU\s8P@o]`A*4!($WN^&J'u!!)ip +!%IpI#_PGC!/#n(!)idq$A/?YK)krO62uQ;rVlnN!<3!0;F(;rs8R]Os+t$rrGF!XT&9QiVrn1kPkP_^&.j0KBrO;KC]$EKE(t(g&HR~> +JcGWI!eC?&r;QeK!:g'i5_8k6!5A"'!5AF4#/:,;!58Garr3!!JbB'B5RrAF5_/n8JH19$rr?%! +JbT0E./j/N!.b.MJNuJ#p](8E!rkN:rr3A?!5=!as8N'!JH3F[s8P=n^&\35!'pQL^Ae0u!!)ip +!%@jH#_>8@!.f\$!*0!t$@r3WJH5`M5lZB8rVlnL!<3!0`$!<)p-JH3Fa +s+(1Mrr@WMs+,aurrGC!XT&9OiVrn/kPkP_^AIs1Ja<=9Jb&gCJcGb$g&HR~> +JcGWI!eUK*r;QeM!:g'i6%f+9!57q&!58@3#/1&ps +KD5BG.K08O!.t:OK0_e$p](8G!rkQ=rr3A>!54!bs8N'!K)iU\s8P@o]`A*4!($WN^&J'u!!)ip +!%IpI#_PGC!/#n(!)idq$A/?YK)krO62uQ;rVlnN!<3!0;F(;rs8R]Os+t$rrGF!XT&9QiVrn1kPkP_^&.j0KBrO;KC]$EKE(t(g&HR~> +JcGWI!eUK*r;QhN!57t'#!ml-s![r#nG`[*K>%%9a!/(7N!knWarVupap\t@^!58Dbr;['%X8i76!!)lq!3H2" +!/(7N"TO)S!3H/!r;[)9s1JDb5la4Ms8N'&^&S,6!($Va$UFcF!/( +JcGWI!eC?&r;QhL!5A%(#!d`)s!RkunG`[+J\M0aWr@SJrr@WBrt)nqJcGa8!'n7`!.k0$!!#:X +rrB(trs(dhJcC9$!7poEs+(7OJ\M-`!.k+L!l"]crVup`p\t@]!5AJar;['%WW3%5!!)lq!36%u +!.k+L"TO#Q!36"tr;[):s1SJa5QF(Ks8N'&^An55!'pP`$U=]C!.k0M!<7TMJc>ZZJH19$s+(1M +rr@WMs1SL1rrKibXT&9Oir9%nf'!&6!.k%I!C25%rr@WHrrE*brIG-dJQ;aM5hZ0f~> +JcGWI!eUK*r;QhN!57t'#!ml-s![r#nG`[*K>%%9a!/(7N!knWarVupap\t@^!58Dbr;['%X8i76!!)lq!3H2" +!/(7N"TO)S!3H/!r;[)9s1JDb5la4Ms8N'&^&S,6!($Va$UFcF!/( +JcGWI!eUK*r;QeM!:g*gK*2.T.0/o +JcGWI!eC?&r;QeK!:g*gJHPqP-iif;ri5nrs47/K!7q/L!91ut!7o9l!S4:LrrCXJs8K"uf)G[P +WoC%Yf)G[NeuI=#rrCXKs8K#(f)Pd0WrLYMf)G[VeuI=$s444Mrr@WLrrH-"qu6XEXT&9Oir9"0 +k5PG^Jc#HJ +JcGWI!eUK*r;QeM!:g*gK*2.T.0/o +JcGWI!eUK*r;QeM!:g'n6%agiK=q9Trr>@a!!'_3rrGE@IrrE,5qu?\Kli-s;n,EB?g&HR~> +JcGWI!eC?&r;QeK!:g'n5_4LdJ\D-Srr>=`!!'b4rrGB9rr2tLquH`r!C-X9s3puK!.k.L!PSR2 +s8RYPrr@W0rr>=HrrE,6qu?\Ili-s9n,EB=g&HR~> +JcGWI!eUK*r;QeM!:g'n6%agiK=q9Trr>@a!!'_3rrGE@IrrE,5qu?\Kli-s;n,EB?g&HR~> +JcGWI!eUK*r;QhN!57t'"os8U!%IpJnc&`E!<5>Nrr;uurr<"N"2+]J;Z?[sK)j'o!54@[rrBb262( +JcGWI!eC?&r;QhL!5A%("os2S!%@jInc&`C!<5;Lrr;uurr<"L"24cL=ZrrBe35kb3Y^-M[Krr<-#^&\.`!C-Y8rr@W1s8RZ4rrE+Nqu?\Ili-s9n,EB=g&HR~> +JcGWI!eUK*r;QhN!57t'"os8U!%IpJnc&`E!<5>Nrr;uurr<"N"2+]J;Z?[sK)j'o!54@[rrBb262( +JcGWI!eUK*r;QhN!57t'!/(.Knc&`E!<7ZOrr;uurr3.S^&J*4KDkfM!6YsprrfF:s+>sNrr@]3rr@]6rrRfQKDYZL!/'V;!/'e@s1R+cJ,~> +JcGWI!eC?&r;QhL!5A%(!.k"Inc&`C!<7TMrr;uurr3.Q^Ae35Jc5TK!6Ys1[1dJ,~> +JcGWI!eUK*r;QhN!57t'!/(.Knc&`E!<7ZOrr;uurr3.S^&J*4KDkfM!6YsprrfF:s+>sNrr@]3rr@]6rrRfQKDYZL!/'V;!/'e@s1R+cJ,~> +JcGWI!eUK*r;QeM!:g'n]g4saK)boArsFAYs+:<(s+::O^&7m1!;lcr!6Y3!/'G6!eUK*qu6ZsKBrO;^$kt$^"NF9~> +JcGWI!eC?&r;QeK!:g'n^-Fs`JH,]?rsF;Ws+(0$s+(.M^AS!2!;lcr!6Y +JcGWI!eUK*r;QeM!:g'n]g4saK)boArsFAYs+:<(s+::O^&7m1!;lcr!6Y3!/'G6!eUK*qu6ZsKBrO;^$kt$^"NF9~> +JcGWI!eUK*r;QeM!:g*h!!GT?.7&UVrsFAYs+:<(s$6VbKDb`L!;uiuK)iU.rr<%XrrRfQKDb`L +KDPTJ!;c`qKDkfMKC]$F;ZHcL62lMcrr@]4rrKfck5PL8!58:0!<@c +JcGWI!eC?&r;QeK!:g*h!!GQ<-pW@RrsF;Ws+(0$s$-PaJc,NJ!;uiuJH3F-rr<%XrrR`OJc,NJ +JboBH!;c`qJc5TKJb&gD`rr@W2rrKibk5PL6!5A@1!<@]:rr@Vis*t~> +JcGWI!eUK*r;QeM!:g*h!!GT?.7&UVrsFAYs+:<(s$6VbKDb`L!;uiuK)iU.rr<%XrrRfQKDb`L +KDPTJ!;c`qKDkfMKC]$F;ZHcL62lMcrr@]4rrKfck5PL8!58:0!<@c +JcGWI!eUK*r;QeM!:g'h62gib;F0gP#(lpUK)gQ(rVupar;Q`squ6[_K?O8p!/pjX!/(4L!)i[n +!C=Ers8R`Ms8R`DrrIbRrVukLs$>38!/'A4!JA)JrrKe5qYpR^KBrO;K?!qA~> +JcGWI!eC?&r;QeK!:g'h5lL`a +JcGWI!eUK*r;QeM!:g'h62gib;F0gP#(lpUK)gQ(rVupar;Q`squ6[_K?O8p!/pjX!/(4L!)i[n +!C=Ers8R`Ms8R`DrrIbRrVukLs$>38!/'A4!JA)JrrKe5qYpR^KBrO;K?!qA~> +JcGWI!eUK*r;QeM!:^!k]`8$]^$u%/K)kq(!<<'!s+:=Lrr<&rs8R_prr@\0rrE+Pr;Qf!^&.g1 +]n?4^s+C:M!JA)Xrr<&os8R`&rr@]4rr@]5rrTk6^&.g16%eM'!/'b?!/&u)J,~> +JcGWI!eC?&r;QeK!:^!k^&S-]^@;.0JH5_$!<<'!s+(1Jrr<&rs8RYnrr@V.rrE+Nr;Qet^AIp2 +^4H1]s+1.K!J.uWrr<&os8RZ$rr@W2rr@W3rrTn7^AIp25_88$!.jV=!.ii'J,~> +JcGWI!eUK*r;QeM!:^!k]`8$]^$u%/K)kq(!<<'!s+:=Lrr<&rs8R_prr@\0rrE+Pr;Qf!^&.g1 +]n?4^s+C:M!JA)Xrr<&os8R`&rr@]4rr@]5rrTk6^&.g16%eM'!/'b?!/&u)J,~> +JcGWI!eUK*r;QeM!8@G\K)kp;63""ds+:bCs8R`;rr@]?rr@])s*t~> +JcGWI!eC?&r;QeK!8@G\JH5^85l[has+(0arVlitrVltNrr@Vnrr@V.rrE+Nr;QfK5l1K\!;lfr +Jc5TK5kP*VJbT0E!7q/MJ`Qh25ir"I^&YnEs8RZ9rr@W=rr@W's*t~> +JcGWI!eUK*r;QeM!8@G\K)kp;63""ds+:bCs8R`;rr@]?rr@])s*t~> +JcGWI!/(4M!%IjHgA_OH!!#=bs/Z5#5la4MrrTk6KDtlP5l^o-rr@\1rrRfQKDYZK62LT]KDPTJ +62plbK0f21!PJL-rrI`Pf)G`&jSo44jo5@6!;c]r6%eP(s+Be?!/&u)J,~> +JcGWI!.k(K!%@dGgA_OG!!#:as/H)!5QF(KrrTn7Jc>ZN5QCf,rr@V/rrR`OJc#HI5l1K\JboBH +5lUcaJO&o.!PSR.rrIZNf)G`$jSo42jo5@4!;c]r5_8;%s+0Y=!.ii'J,~> +JcGWI!/(4M!%IjHgA_OH!!#=bs/Z5#5la4MrrTk6KDtlP5l^o-rr@\1rrRfQKDYZK62LT]KDPTJ +62plbK0f21!PJL-rrI`Pf)G`&jSo44jo5@6!;c]r6%eP(s+Be?!/&u)J,~> +JcGTHr.=u8rW([P!kj5=rr3/P^&S+b^&@s2K>[]h!0$pZK)gQ$rrKfcqu6]162UZc]g7:'6,!6s +s1S=0s+C:M#JEEUs1O$b^"32`KB3%4^#f7pK)kcJ!<@c +JcGTHr.+i5rW([P!ks5:rr3/Q^An4a^A\'3J]%Kf!0$pZJH18urrKibqu6]25l:Qb^-I7#5ed3s +s1\C1s+1.K#JNHSs1X$a^=N;aJ`Qh2^?,@qJH5QH!<@]:rrBe%rr@W's*t~> +JcGTHr.=u8rW([P!kj5=rr3/P^&S+b^&@s2K>[]h!0$pZK)gQ$rrKfcqu6]162UZc]g7:'6,!6s +s1S=0s+C:M#JEEUs1O$b^"32`KB3%4^#f7pK)kcJ!<@c +JcGEC!/(7Nq>UPL!("@]rr<&qrrTldKDY]K^&.g0^&.g0 +^& +JcGEC!.k+Lq>UPJ!'n9rs8Th4rrBe2JZ&MJ!0$pZJH18trr>=\rr<&qrrTocJc#KI^AIp1^AIp1 +^AWW4rr@W3rr@W2rrIZNqYpQrJ_C)'J_C'R~> +JcGEC!/(7Nq>UPL!("@]rr<&qrrTldKDY]K^&.g0^&.g0 +^& +JcGEC!/(7Nq>UHFrVuparVlluKDtoJ!<<*!!!#?Crr`=S]g7;Lrr<&qrrIbcr;ZeL!55rC +!/'D5!!)*[!eUKdqu6ZsKC&X<^$kt$KA$9T~> +JcGEC!.k+Lq>UHGrVup`rVlluJc>]H!<<*!!!#9crr> +JcGEC!/(7Nq>UHFrVuparVlluKDtoJ!<<*!!!#?Crr`=S]g7;Lrr<&qrrIbcr;ZeL!55rC +!/'D5!!)*[!eUKdqu6ZsKC&X<^$kt$KA$9T~> +JcGEC!7h&Kq#:X#K@KtPs8T/#.K9>T!<3$!s!duuK@Kt@XoAA$N;j"1!.u`s!!=[&K2V]M!`B"r +qZ$UFi_ff0XP3[SKBE17eZ@j3!eUK*qu6ZsKC/[@eGoT%nG`L=g&HR~> +JcGEC!7q,Lq#:X#J^shPs8T)!./s5S!<3$!s![ouJ^sh@XoAA$N;j"2!.cQp!!=X#JQ;]L!`]5# +qZ$UEi`-#1WnRIQJ`ct5euIg2!eC?&qu6ZsJaNI>ec5]$nG`L>g&HR~> +JcGEC!7h&Kq#:X#K@KtPs8T/#.K9>T!<3$!s!duuK@Kt@XoAA$N;j"1!.u`s!!=[&K2V]M!`B"r +qZ$UFi_ff0XP3[SKBE17eZ@j3!eUK*qu6ZsKC/[@eGoT%nG`L=g&HR~> +JcGBBrW)`n$35_Y!/(=OK)bnbrVllu62UZ_!7e4O!!%uX#(lo.K0b-BrVlj`qZ$SJ#62AhK0]LN +\c2Y^k5PEIj8T15!58:0!C;A)s8N'!^%).&KA$9T~> +JcGBBrW)`n$35YW!.k1MJH,\arVllu5l:Q^!7n:P!!%uX#(Zc*JO"d;rVlj_qZ$SH#62DgJNs4L +\c2Y\k5PEHj8T13!5A@1!C25&s8N'!^@D7'J_C'R~> +JcGBBrW)`n$35_Y!/(=OK)bnbrVllu62UZ_!7e4O!!%uX#(lo.K0b-BrVlj`qZ$SJ#62AhK0]LN +\c2Y^k5PEIj8T15!58:0!C;A)s8N'!^%).&KA$9T~> +JcGBBrW)`n"os;U!/(=OrVuqNrVlluKDb`MK)i"Q!!%uX!eUK*T`4ulk5PF6j8T15!/(1K!<@c= +s8N)gs8R`)s*t~> +JcGBBrW)`n"os5S!.k1MrVuqLrVlluJc,NKJH2eO!!%uX!eC?&T`4ulk5PF4j8T13!.k%I!<@]; +s8N)gs8RZ's*t~> +JcGBBrW)`n"os;U!/(=OrVuqNrVlluKDb`MK)i"Q!!%uX!eUK*T`4ulk5PF6j8T15!/(1K!<@c= +s8N)gs8R`)s*t~> +JcGEC!/(7Nq>U]M!<<'!KE(uN!!%ZMs8N)srrE,5XT&8#N;is3!/$sE!!)3^s+BA3!eUKdrVlu5 +K)gPjs8N)gs8R`)s*t~> +JcGEC!.k+Lq>U]N!<<'!JcGcL!!%TKs8N)srrE,6XT&8#N;is1!.ggC!!)3^s+051!eC?crVlu6 +JH18fs8N)gs8RZ's*t~> +JcGEC!/(7Nq>U]M!<<'!KE(uN!!%ZMs8N)srrE,5XT&8#N;is3!/$sE!!)3^s+BA3!eUKdrVlu5 +K)gPjs8N)gs8R`)s*t~> +JcGEC!/(7Nq>Ui(!/(:OKE&Ubs$;;9s8N)trrIa +JcGEC!.k+Lq>Ui&!.k.MJcEFas$2/6s8N)trrI[9X8`/"N;is1!.ggC!!)3^!J.uFrrR`O^A\*2 +!!'b"s8N)gs8RZ's*t~> +JcGEC!/(7Nq>Ui(!/(:OKE&Ubs$;;9s8N)trrIa +JcGEC!/(7Nq>Ui(!<9_4s8R_(s+:=Ms8N)trrE,5X8`/"N;is3!/%!F!keSdkl1X8ir9%3!<)ou +K)k09s+Bh@s+B#)J,~> +JcGEC!.k+Lq>Ui&!<9b5s8RY$s+(1Ks8N)trrE,6X8`/"N;is1!.gjD!knYckl1X6ir9%1!<)ou +JH4s7s+0\>s+/l'J,~> +JcGEC!/(7Nq>Ui(!<9_4s8R_(s+:=Ms8N)trrE,5X8`/"N;is3!/%!F!keSdkl1X8ir9%3!<)ou +K)k09s+Bh@s+B#)J,~> +JcGEC"+pRRKDGNUX8kNd63$sN62s4Nec,UK!<3!#K)bm;XT&8#N;is3!/%!F!eUIQkl1X8ir9(4 +!($U:!C6_Ms8R`@s8R`)s*t~> +JcGEC"+^FPJbfs8RZ's*t~> +JcGEC"+pRRKDGNUX8kNd63$sN62s4Nec,UK!<3!#K)bm;XT&8#N;is3!/%!F!eUIQkl1X8ir9(4 +!($U:!C6_Ms8R`@s8R`)s*t~> +JcGEC"+pRR62CN\XT!kOs8R]Rs+>sSrr<"Nrr3)6K0_f)rr<%XrrRfQK;&;HK)bo9rrKfcir9"2 +q>gJH!($F5rr2u"rr3/8K>%:NKCJp@KA$9T~> +JcGEC"+^FP5l(E[Wr@SKs8RWPs+,aPrr<"Lrr3)7JNuK%rr<%XrrR`OJYE)FJH,]7rrKibir9"0 +q>gJF!'p@2rr2turr3/9J\M.LJai^>J_C'R~> +JcGEC"+pRR62CN\XT!kOs8R]Rs+>sSrr<"Nrr3)6K0_f)rr<%XrrRfQK;&;HK)bo9rrKfcir9"2 +q>gJH!($F5rr2u"rr3/8K>%:NKCJp@KA$9T~> +JcGEC!/(7NMuNbWN;is3!/%!F!eUIQl2Ud9ir9(4!(#$4s+B#)J,~> +JcGEC!.k+LMuNbWN;is1!.gjD!eC=Ol2Ud7ir9(2!'ns3s+/l'J,~> +JcGEC!/(7NMuNbWN;is3!/%!F!eUIQl2Ud9ir9(4!(#$4s+B#)J,~> +JcGEC!/(7NMuNbWN;is3!/%!F!eUIQl2Ld:^#K%mK)j9us+B#)J,~> +JcGEC!.k+LMuNbWN;is1!.gjD!eC=Ol2Ld8^>f.nJH4'ss+/l'J,~> +JcGEC!/(7NMuNbWN;is3!/%!F!eUIQl2Ld:^#K%mK)j9us+B#)J,~> +JcGEC!/(7NMuNbWN;is3!/$sE!<@c:rr>@DrrI`Pd/X,ug&HR~> +JcGEC!.k+LMuNbWN;is1!.ggC!<@]8rr>=CrrIZNd/X,sg&HR~> +JcGEC!/(7NMuNbWN;is3!/$sE!<@c:rr>@DrrI`Pd/X,ug&HR~> +JcGEC!/(7NMuNbWN;is3!/$sE!!)6_!(#TD!J:C!s8R`)s*t~> +JcGEC!.k+LMuNbWN;is1!.ggC!!)6_!'oNC!J(6ts8RZ's*t~> +JcGEC!/(7NMuNbWN;is3!/$sE!!)6_!(#TD!J:C!s8R`)s*t~> +JcGWI"0;J&.K*-F!)eaT!!%uX!eUIQr)2m_s+C?Q!/piXs+AOss4..N"m5jbeH".bs8T1ZrrRfQ +XO7(JKA$9T~> +JcGWI"0)>$./d-H!*+sW!!%uX!eC=Or)N*`s+13M!0-uXs+/Cos474M"lfR^ec=:ds8T+XrrR`O +WmUkHJ_C'R~> +JcGWI"0;J&.K*-F!)eaT!!%uX!eUIQr)2m_s+C?Q!/piXs+AOss4..N"m5jbeH".bs8T1ZrrRfQ +XO7(JKA$9T~> +JcGWI!eUKdr;Qd`!/pjW!0$pZK)e49K)ktRp](9,#H[s=KE(t(^&@s3eV!f"rdtHhK7j3;K>"tp +K*'U'^%d3[^#jqI^&EZLrr@]0rrRfQK@0`!KA$9T~> +JcGWI!eC?cr;Qd_!/pjW!0$pZJH.t6JH5bNp](9-#HIg +JcGWI!eUKdr;Qd`!/pjW!0$pZK)e49K)ktRp](9,#H[s=KE(t(^&@s3eV!f"rdtHhK7j3;K>"tp +K*'U'^%d3[^#jqI^&EZLrr@]0rrRfQK@0`!KA$9T~> +JcGWI!eUKdr;QeM!/pjW!0$pZK)gQ&rrE,$NW/tYi;Wh1!7:cGKA$9T~> +JcGWI!eC?cr;QeK!/pjW!0$pZJH19"rrE,"NW/tYi;Wh/!7:cGJ_C'R~> +JcGWI!eUKdr;QeM!/pjW!0$pZK)gQ&rrE,$NW/tYi;Wh1!7:cGKA$9T~> +JcGWI!eUK*r;QeM!/pjW!0$pZK)gQ&s8Duu]oW0n!9!kYK)gPOs8R`)s*t~> +JcGWI!eC?&r;QeK!/pjW!0$pZJH19"s8Duu^5r9o!9!kYJH18Ks8RZ's*t~> +JcGWI!eUK*r;QeM!/pjW!0$pZK)gQ&s8Duu]oW0n!9!kYK)gPOs8R`)s*t~> +JcGWI!eUK*r;QeM!/pjW!0$pZK)gQ&rr]r4!/$@4!(#QC!J:C!s8R`)s*t~> +JcGWI!eC?&r;QeK!/pjW!0$pZJH19"rr]u8!.g42!'oKB!J(6ts8RZ's*t~> +JcGWI!eUK*r;QeM!/pjW!0$pZK)gQ&rr]r4!/$@4!(#QC!J:C!s8R`)s*t~> +JcGWI!J:CLrrE*cMuNd0N;is3!/(4L!iuBSO8f2Gi;Wh1!7:cGKA$9T~> +JcGWI!J(7JrrE*bMuNd.N;is1!.k(J!ic6OO8f2Fi;Wh/!7:cGJ_C'R~> +JcGWI!J:CLrrE*cMuNd0N;is3!/(4L!iuBSO8f2Gi;Wh1!7:cGKA$9T~> +JcGWI!eUKdr;QctK7X&frrRfQKDb`NX8mm7rrKfci;Wh1!7:`HK>#t +JcGWI!eC?cr;QctJV!idrrR`OJc,NLWW7U3rrKibi;Wh/!7:`HJ\Kh;J,~> +JcGWI!eUKdr;QctK7X&frrRfQKDb`NX8mm7rrKfci;Wh1!7:`HK>#t +JcGWI!eUKdr;QctK7X&frrRfQKDb`NX8mm7rrIbci;Wh1!7:cGKA$9T~> +JcGWI!eC?cr;QctJV!idrrR`OJc,NLWW7U3rrI\bi;Wh/!7:cGJ_C'R~> +JcGWI!eUKdr;QctK7X&frrRfQKDb`NX8mm7rrIbci;Wh1!7:cGKA$9T~> +JcGWI!J:CLrrGE +JcGWI!J(7JrrGB9MuNd.N;is1!.k(J!ic6OOT,<3hu<_.!7:cGJ_C'R~> +JcGWI!J:CLrrGE +JcGWI!J:CLrrE+PMuNbW_>aK8mf*9>iVrt3!/(4L!iuBSOT, +JcGWI!J(7JrrE+NMuNbW_>aK8mf*9 +JcGWI!J:CLrrE+PMuNbW_>aK8mf*9>iVrt3!/(4L!iuBSOT, +JcGWI!J:CLrrE+PMuNbW_>aK8mf*7eiVrt3!/(4L!iuC8OT, +JcGWI!J(7JrrE+NMuNbW_>aK8mf*7eiVrt1!.k(J!ic77OT, +JcGWI!J:CLrrE+PMuNbW_>aK8mf*7eiVrt3!/(4L!iuC8OT, +JcGWI!J:CLrrE+PMuNd0_>aK8mf*7eiVrt3!/(4L!iuBSOT,<5hu<_0!7:cGKA$9T~> +JcGWI!J(7JrrE+NMuNd._>aK8mf*7eiVrt1!.k(J!ic6OOT,<3hu<_.!7:cGJ_C'R~> +JcGWI!J:CLrrE+PMuNd0_>aK8mf*7eiVrt3!/(4L!iuBSOT,<5hu<_0!7:cGKA$9T~> +JcGWI!eUKdr;Qd`K7X'Frr<&qrt#0_6,! +JcGWI!eC?cr;Qd_JV!jDrr<&qrt#0]5ed9u5X9lcs8N*!^-L92rrR`OJc,NLWW7U3rr@W-rrIZN +d/X,sg&HR~> +JcGWI!eUKdr;Qd`K7X'Frr<&qrt#0_6,! +JcGWI!J:CLrrFR$MuNe-_>aK8qu6nRXT-gKs+=5IrrW7!K@T&_!eUK*r;Qi"!/$F6!N^q2rrI`P +d/X,ug&HR~> +JcGWI!J(7JrrFO!MuNe._>aK8qu6nPWrLXMs++2JrrW7$J_&o^!eC?&r;Qhu!.g:4!NL_.rrIZN +d/X,sg&HR~> +JcGWI!J:CLrrFR$MuNe-_>aK8qu6nRXT-gKs+=5IrrW7!K@T&_!eUK*r;Qi"!/$F6!N^q2rrI`P +d/X,ug&HR~> +JcGWI!J:CLrrE+PMuNbW_>aK8qu6nR^&Pc3s+>t%s8N'!^#T+oK)gQ%rrT8%K9?36KAZ\0K)j9u +s+B#)J,~> +JcGWI!J(7JrrE+NMuNbW_>aK8qu6nP^Ako4s+,b!s8N'!^>o4pJH19!rrT2#JW^!4J`$J.JH4's +s+/l'J,~> +JcGWI!J:CLrrE+PMuNbW_>aK8qu6nR^&Pc3s+>t%s8N'!^#T+oK)gQ%rrT8%K9?36KAZ\0K)j9u +s+B#)J,~> +JcGWI!J:CLrrE+PMuNbW_>aK8qu75@62s6's8N*!s1SI4!/!RijSo:6!/(4L!iuBSOoPH6hu +JcGWI!J(7JrrE+NMuNbW_>aK8qu75A5lX*#s8N*!s1\O5!.dCdjSo:4!.k(J!ic6OOoPH4hu +JcGWI!J:CLrrE+PMuNbW_>aK8qu75@62s6's8N*!s1SI4!/!RijSo:6!/(4L!iuBSOoPH6hu +JcGWI!C6__rrE+PMuNbW_>aO%!<%QMrrRfQKDtlQ]`8$ur;Qa_jSo:6!/(4L!iuBSOoGE6hZ!V/ +!7:cGKA$9T~> +JcGWI!C-Y^rrE+NMuNbW_>aO$!<%KKrrR`OJc>ZO^&S-ur;Qa^jSo:4!.k(J!ic6OOoGE4hZ!V- +!7:cGJ_C'R~> +JcGWI!C6__rrE+PMuNbW_>aO%!<%QMrrRfQKDtlQ]`8$ur;Qa_jSo:6!/(4L!iuBSOoGE6hZ!V/ +!7:cGKA$9T~> +JcGWI!eUKdr;QctK8]a0!0$pZK)gQ%rrT8%]oi?pKAZ\0K)j9us+B#)J,~> +JcGWI!eC?cr;QctJW'O.!0$pZJH19!rrT2#^6/HqJ`$J.JH4'ss+/l'J,~> +JcGWI!eUKdr;QctK8]a0!0$pZK)gQ%rrT8%]oi?pKAZ\0K)j9us+B#)J,~> +JcGWI!J:CLrrE+PMuNbWN;is3!/(4L!NZ9_rr@].rrI`Pd/X,ug&HR~> +JcGWI!J(7JrrE+NMuNbWN;is1!.k(J!NH-]rr@W,rrIZNd/X,sg&HR~> +JcGWI!J:CLrrE+PMuNbWN;is3!/(4L!NZ9_rr@].rrI`Pd/X,ug&HR~> +JcGWI!J:CLrrE+PMuNbWN;is3!/(4L!NZ9_rrBahrrI`Pd/X,ug&HR~> +JcGWI!J(7JrrE+NMuNbWN;is1!.k(J!NH-]rrBdirrIZNd/X,sg&HR~> +JcGWI!J:CLrrE+PMuNbWN;is3!/(4L!NZ9_rrBahrrI`Pd/X,ug&HR~> +JcGWI!J:CLrrE+PMuNbW_>jFcnG`K@r;Qc1qu6Z0nG`QB!/(4L!NZ:`rr@]Ls8R_Xrr@].rrI`P +d/X,ug&HR~> +JcGWI!J(7JrrE+NMuNbW_>jFanG`K>r;Qc2qu6Z1nG`Q@!.k(J!NH.^rr@WJs8RYVrr@W,rrIZN +d/X,sg&HR~> +JcGWI!J:CLrrE+PMuNbW_>jFcnG`K@r;Qc1qu6Z0nG`QB!/(4L!NZ:`rr@]Ls8R_Xrr@].rrI`P +d/X,ug&HR~> +JcGWI!C6__rrE+PMuNbW_>aK8rr@ArrI`P +d/X,ug&HR~> +JcGWI!C-Y^rrE+NMuNbW_>aK8rr=@rrIZN +d/X,sg&HR~> +JcGWI!C6__rrE+PMuNbW_>aK8rr@ArrI`P +d/X,ug&HR~> +JcGWIrrDrr!<@b1rr<&8rr<&trrE,5m/I%cl2Ld:!;lcsX8qqn$,-APs8Te4]tK'rrrBb1s8N)t +rrIbc\c2XqhZ!V/!7:cGKA$9T~> +JcGWIrrDrr!<@\/rr<&8rr<&trrE,6m/I%cl2Ld8!;lcsWW;_l$,6GRs8Th5^:o0rrrBe2s8N)t +rrI\b\c2XphZ!V-!7:cGJ_C'R~> +JcGWIrrDrr!<@b1rr<&8rr<&trrE,5m/I%cl2Ld:!;lcsX8qqn$,-APs8Te4]tK'rrrBb1s8N)t +rrIbc\c2XqhZ!V/!7:cGKA$9T~> +JcGWIrrDrr!<@b1rr<&8rr<&trriE&s+:<(rr3'd!/%u`rr@]MrrTk6KDb`L^&J$6]n:sNrr;tM +!7h)K!eUKdr;Qf!!;6@!62s6']n?=b6%]19rr<&ss8PCarrYQ>6+sl0!/'/.!J:C!s8R`)s*t~> +JcGWIrrDrr!<@\/rr<&8rr<&trriE&s+(0$rr3'c!.hl_rr@WKrrTn7Jc,NJ^Ae-7^4CjLrr;tK +!7q/L!eC?cr;Qet!;6@!5lX*#^4H:a5_/q6rr<&ss8P@`rrYN;5eai0!.j#,!J(6ts8RZ's*t~> +JcGWIrrDrr!<@b1rr<&8rr<&trriE&s+:<(rr3'd!/%u`rr@]MrrTk6KDb`L^&J$6]n:sNrr;tM +!7h)K!eUKdr;Qf!!;6@!62s6']n?=b6%]19rr<&ss8PCarrYQ>6+sl0!/'/.!J:C!s8R`)s*t~> +JcGWI!C6__rrE+PMuNbW_>aK8rdtYGKE&VNs$;;;s+C?bKDkfM!;uit!58=1!!*#us$6pC63$t; +!/#o%rr3%P!/(4L!NZ:ors(ji!'ro'rrDrr!J:CMs8R`Orrg"8K0]L'rrI`Pd/X,ug&HR~> +JcGWI!C-Y^rrE+NMuNbW_>aK8rdbMDJcEGLs$2/8s+13aJc5TK!;uit!5AC2!!*#us$-j@5l^k8 +!.f]$rr3%N!.k(J!NH.mrs(gh!'if#rrDrr!J(7Ks8RZMrrg%9JNs4$rrIZNd/X,sg&HR~> +JcGWI!C6__rrE+PMuNbW_>aK8rdtYGKE&VNs$;;;s+C?bKDkfM!;uit!58=1!!*#us$6pC63$t; +!/#o%rr3%P!/(4L!NZ:ors(ji!'ro'rrDrr!J:CMs8R`Orrg"8K0]L'rrI`Pd/X,ug&HR~> +JcGWI!J:CLrrE+PMuNbW_>aT;K<20Rrs=>.s/],us&+KNr;Q`sr;Q`squ6Wrrr3t( +s&/jr!eUK*r;Qf!!;6?sK./5L!<<(OqYpNqr;ZeLs8N4S;QQtM])Mb_hZ!Y0!7fKs!E+R's*t~> +JcGWI!J(7JrrE+NMuNbW_>aT;JZ>aLrs=8-s/K*!s&FWMr;Q`sr;Q`squ6Wrrr3 +JcGWI!J:CLrrE+PMuNbW_>aT;K<20Rrs=>.s/],us&+KNr;Q`sr;Q`squ6Wrrr3t( +s&/jr!eUK*r;Qf!!;6?sK./5L!<<(OqYpNqr;ZeLs8N4S;QQtM])Mb_hZ!Y0!7fKs!E+R's*t~> +JcGWI!J:CLrrE+PMuNbW_>aK8qu?\K!rmn*rr3&56%f.9!!)rs!!)or!!*#u$:4^l]n??;^&S+1 +rr3%P!/(4L!NZ:ors+/Vs+ +JcGWI!J(7JrrE+NMuNbW_>aK8qu?\I!rmh&rr3&65_8n6!!)rs!!)or!!*#u$:+Xk^4H<8^An45 +rr3%N!.k(J!NH.mrs+)Ts+*H8s+1(I!PX-_s8RZMrrKi!\,ZJZhu +JcGWI!J:CLrrE+PMuNbW_>aK8qu?\K!rmn*rr3&56%f.9!!)rs!!)or!!*#u$:4^l]n??;^&S+1 +rr3%P!/(4L!NZ:ors+/Vs+ +JcGWI!J:CLrrE+PMuNbW_>aK8qu7#:6%_J:s8PB;6%f.9!!)rs!!)or!!*#u$:0=E!<<(OKE(sL +rr3"O!;lcsX8qnm#(urh^&S,GqYpQ/r;Zf1rr3'd!!# +JcGWI!J(7JrrE+NMuNbW_>aK8qu7#;5_227s8P?85_8n6!!)rs!!)or!!*#u$:'1B!<<(MJcGaM +rr3"M!;lcsWW;\k#(cfg^An5IqYpQ0r;Zf2rr3'c!!#9qs8RZ-rrIZNdJj9!!!(^PJ,~> +JcGWI!J:CLrrE+PMuNbW_>aK8qu7#:6%_J:s8PB;6%f.9!!)rs!!)or!!*#u$:0=E!<<(OKE(sL +rr3"O!;lcsX8qnm#(urh^&S,GqYpQ/r;Zf1rr3'd!!# +JcGWI!J:CLrrE+PMuNbW_>aMKqYpT0KDkfO]n:t8rr@]LrrBb0rrBb2s8R`JrrCUKrrI`Pr;QhN +.0,J0!JA)CrrGCcdJj9#!!(^PJ,~> +JcGWI!J(7JrrE+NMuNbW_>aMLqYpT1Jc5TM^4Ck5rr@WJrrBe1rrBe3s8RZHrrCXLrrIZNr;QhL +-ifA/!J.uBrrG@bdJj9!!!(^PJ,~> +JcGWI!J:CLrrE+PMuNbW_>aMKqYpT0KDkfO]n:t8rr@]LrrBb0rrBb2s8R`JrrCUKrrI`Pr;QhN +.0,J0!JA)CrrGCcdJj9#!!(^PJ,~> +JcGWI!J:CLrrE+PMuNbWN;ip2!;uiu!%EP^s8R`/rrI`PdJj9]!!(^PJ,~> +JcGWI!J(7JrrE+NMuNbWN;ip0!;uiu!% +JcGWI!J:CLrrE+PMuNbWN;ip2!;uiu!%EP^s8R`/rrI`PdJj9]!!(^PJ,~> +JcGWI!J:CLrrE+PMuNbWN;is3!58C3!keTaO8o64hu<_0!7:`H!(#< +JcGWI!J(7JrrE+NMuNbWN;is1!5AI4!knZcO8o62hu<_.!7:`H!'o6;J,~> +JcGWI!J:CLrrE+PMuNbWN;is3!58C3!keTaO8o64hu<_0!7:`H!(#< +JcGWI!J:CLrrE+PMuNbWN;im1r;Zmb!!(mU!JA)TrrBaOs8R`/rrI`Pd/X+Gg&HR~> +JcGWI!J(7JrrE+NMuNbWN;im/r;Zma!!(mU!J.uSrrBdPs8RZ-rrIZNd/X+Gg&HR~> +JcGWI!J:CLrrE+PMuNbWN;im1r;Zmb!!(mU!JA)TrrBaOs8R`/rrI`Pd/X+Gg&HR~> +JcGWI!J:CLrrE+PMuNbWN;im1q>^MshuE_/nG`NA]uL*PKAZ\1K)iU4rrE*cg&HR~> +JcGWI!J(7JrrE+NMuNbWN;im/q>^MqhuE_-nG`N?^;g3QJ`$J/JH3F3rrE*bg&HR~> +JcGWI!J:CLrrE+PMuNbWN;im1q>^MshuE_/nG`NA]uL*PKAZ\1K)iU4rrE*cg&HR~> +JcGWI!C6__rrE+PMuNbWN;is3!($R9!^Qh"oD\fCpAY-+qu?[^pAY-+rVlr4!/&;ks+B5/!/(.K +$UKDt^"*/_]n:sNs5AS3!(" +JcGWI!C-Y^rrE+NMuNbWN;is1!'pL6!^Hb"oD\fApAY-,qu?[]pAY-,rVlr5!.i/is+0)-!.k"I +$UB8o^=N>a^4CjLs5AM1!'n9Ps*t~> +JcGWI!C6__rrE+PMuNbWN;is3!($R9!^Qh"oD\fCpAY-+qu?[^pAY-+rVlr4!/&;ks+B5/!/(.K +$UKDt^"*/_]n:sNs5AS3!(" +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs.7*Y,"+rml62poa!<5@brr[m>6,!9t!keR6rr3'd!(" +JcGWIrrDrr!<@\0rrKh6N;ip0!;lcs-p[J*"+`^g5lUf`!<5=arr[g;5ed6t!knX7rr3'c!'n9t +rs1ji!7q2MJH.sTrrKh6hu<_.!;qBL5QHB.rrBe3rrBe2rrBe4JH3F`JcGcFJH3F;s*t~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs.7*Y,"+rml62poa!<5@brr[m>6,!9t!keR6rr3'd!(" +JcGWI!J:CLrrE+PMuNbWN;ip2!;lcs;?6Ci&;1#_K7j4(!58Dbs8PCbrrE#ts+C@O#e^5OK0fP; +K7j($!<@bkrr<&VrrGCcqu?ZrY5a"~> +JcGWI!J(7JrrE+NMuNbWN;ip0!;lcs<<2^l&:sl]JV!k$!5AJas8P@arrE#ts+14M#eg;QJO'88 +JV!^u!<@\irr<&VrrG@bqu?ZrY5a"~> +JcGWI!J:CLrrE+PMuNbWN;ip2!;lcs;?6Ci&;1#_K7j4(!58Dbs8PCbrrE#ts+C@O#e^5OK0fP; +K7j($!<@bkrr<&VrrGCcqu?ZrY5a"~> +JcGWI!J:CLrrE+PMuNbWN;ip2!;lcs;?6Ci#D<'VK7j4(KDb`OKE(s;rVunMs8N(OrW!'es8R_b +qu6ZsK>mijKAZ_/!;lctK)gP-s*t~> +JcGWI!J(7JrrE+NMuNbWN;ip0!;lcs<<2^l#D)pTJV!k$Jc,NMJcGa8rVunKs8N(MrW!'ds8RYa +qu6ZsJ]7WhJ`$M-!;lctJH18)s*t~> +JcGWI!J:CLrrE+PMuNbWN;ip2!;lcs;?6Ci#D<'VK7j4(KDb`OKE(s;rVunMs8N(OrW!'es8R_b +qu6ZsK>mijKAZ_/!;lctK)gP-s*t~> +JcGWI!C6__rrE*cMuNbWN;ip2!;lcs;?6Ci#D<'VK7j4(KDb`P63$sNKDtoNKE(rPK>%3_!/(.J +!!'t;!/'2/!J:CKrrE,5YQ'+~> +JcGWI!C-Y^rrE*bMuNbWN;ip0!;lcs<<2^l#D)pTJV!k$Jc,NN5l^jLJc>]LJcG`NJ\M'^!.k"H +!!'t;!.j&-!J(7IrrE,6YQ'+~> +JcGWI!C6__rrE*cMuNbWN;ip2!;lcs;?6Ci#D<'VK7j4(KDb`P63$sNKDtoNKE(rPK>%3_!/(.J +!!'t;!/'2/!J:CKrrE,5YQ'+~> +JcGWIrrDrr!<@b1rr<%XrrRfQeboFJX8qqn"+r%#XT&5"KDbcL;?;D!rVunMs8NGV.BKW$s8T/u +XK;C#!!'t;!/'2/!J:CKrrE+PYQ'+~> +JcGWIrrDrr!<@\/rr<%XrrR`Of)5OKWW;_l"+_k#WrE"uJc,QJ<<7Y!rVunKs8NGW.&s;us8T*! +WiH$t!!'t;!.j&-!J(7IrrE+NYQ'+~> +JcGWIrrDrr!<@b1rr<%XrrRfQeboFJX8qqn"+r%#XT&5"KDbcL;?;D!rVunMs8NGV.BKW$s8T/u +XK;C#!!'t;!/'2/!J:CKrrE+PYQ'+~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!;6?lKCo3DKD5BJ]n:sNrr3&5K7j.&!56>Ns1R@j!J:CK +rr<&%s*t~> +JcGWIrrDrr!<@\/rr<%XrrIZNqu6[s!;6?lJb9!BJbT0H^4CjLrr3&6JV!e"!5?DOs1[Fk!J(7I +rr<&%s*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!;6?lKCo3DKD5BJ]n:sNrr3&5K7j.&!56>Ns1R@j!J:CK +rr<&%s*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6\L!;6?l]po$%6/_eC!;c]q!3Z?P~> +JcGWIrrDrr!<@\/rr<%XrrIZNqu6\J!;6?l^75-&5iD\B!;c]q!3Z?P~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6\L!;6?l]po$%6/_eC!;c]q!3Z?P~> +JcGWIrrDrr!<@b1rr<%XrrGCcqu6[p!07'Z!9!nW!;c]q!3Z?P~> +JcGWIrrDrr!<@\/rr<%XrrG@bqu6[s!07'Z!9!nW!;c]q!3Z?P~> +JcGWIrrDrr!<@b1rr<%XrrGCcqu6[p!07'Z!9!nW!;c]q!3Z?P~> +JcGWIrrDrr!<@b's- +JcGWIrrDrr!<@\%s- +JcGWIrrDrr!<@b's- +JcGWIrrDrr!<@b's- +JcGWIrrDrr!<@\%s- +JcGWIrrDrr!<@b's- +JcGWI!J:CLrrE+PMuNdjN;ip2!;lcsK)go2!(#TDrrDrr!eUKdYQ'+~> +JcGWI!J(7JrrE+NMuNdkN;ip0!;lcsJH1]0!'oNCrrDrr!eC?cYQ'+~> +JcGWI!J:CLrrE+PMuNdjN;ip2!;lcsK)go2!(#TDrrDrr!eUKdYQ'+~> +JcGWI!C6__rrE+PMuNbWN;ip2!;lcs;?2^Vs+B>2rrDrr!J:BTs*t~> +JcGWI!C-Y^rrE+NMuNbWN;ip0!;lcs< +JcGWI!C6__rrE+PMuNbWN;ip2!;lcs;?2^Vs+B>2rrDrr!J:BTs*t~> +JcGWI!J:CLrrE+PMuNbWN;ip2!;lcs;?2^V!PO-Fs8N)rrrI`PY5a"~> +JcGWI!J(7JrrE+NMuNbWN;ip0!;lcs< +JcGWI!J:CLrrE+PMuNbWN;ip2!;lcs;?2^V!PO-Fs8N)rrrI`PY5a"~> +JcGWI!C6__rrE+PMuNcCN;ip2!;lcs;?2[U!/';2rrDrr!J:BTs*t~> +JcGWI!C-Y^rrE+NMuNcBN;ip0!;lcs< +JcGWI!C6__rrE+PMuNcCN;ip2!;lcs;?2[U!/';2rrDrr!J:BTs*t~> +JcGWIrrDrr!<@b's- +JcGWIrrDrr!<@\%s- +JcGWIrrDrr!<@b's- +JcGWIrrDrr!<@b's- +JcGWIrrDrr!<@\%s- +JcGWIrrDrr!<@b's- +JcGWIrrDrr!<@b1rr@\1rrI`Pqu6[p!/pjXXOZD3rrDrr!J:BTs*t~> +JcGWIrrDrr!<@\/rr@V/rrIZNqu6[s!/pjXWn-82rrDrr!J(6Rs*t~> +JcGWIrrDrr!<@b1rr@\1rrI`Pqu6[p!/pjXXOZD3rrDrr!J:BTs*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/gdV60/(G!;lcsK)i(SJ,~> +JcGWIrrDrr!<@\/rr<%XrrIZNqu6[s!/gdV5ihtF!;lcsJH2kQJ,~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/gdV60/(G!;lcsK)i(SJ,~> +JcGWIrrDrr!<>EDrr<%XrrI`Pqu6[p!/^^U^#f:o!;lcsK)i(SJ,~> +JcGWIrrDrr!<>BCrr<%XrrIZNqu6[s!/^^U^?,Cp!;lcsJH2kQJ,~> +JcGWIrrDrr!<>EDrr<%XrrI`Pqu6[p!/^^U^#f:o!;lcsK)i(SJ,~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/^^V6+uF\rrDrr!J:BTs*t~> +JcGWIrrDrr!<@\/rr<%XrrIZNqu6[s!/^^V5ecC\rrDrr!J(6Rs*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/^^V6+uF\rrDrr!J:BTs*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/^^V]n>JIrrDrr!J:BTs*t~> +JcGWIrrDrr!<@\/rr<%XrrIZNqu6[s!/^^V^4GGHrrDrr!J(6Rs*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/^^V]n>JIrrDrr!J:BTs*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/UXU]g:i]!<@cLrrI`PY5a"~> +JcGWIrrDrr!<@\/rr<%XrrIZNqu6[s!/UXU^-Ll]!<@]JrrIZNY5a"~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/UXU]g:i]!<@cLrrI`PY5a"~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/LRT]n>PKrrDrr!J:BTs*t~> +JcGWIrrDrr!<@\/rr<%XrrIZNqu6[s!/LRT^4GMJrrDrr!J(6Rs*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/LRT]n>PKrrDrr!J:BTs*t~> +JcGWIrrDrr!<@b2rrI`PN;ip2!;lcs;?2IO!Na!!rrE*cqu6\L!3Z?P~> +JcGWIrrDrr!<@\0rrIZNN;ip0!;lcs<<.dR!NNlurrE*bqu6\J!3Z?P~> +JcGWIrrDrr!<@b2rrI`PN;ip2!;lcs;?2IO!Na!!rrE*cqu6\L!3Z?P~> +JcGWIrrDrr!<@b1rr>?DrrI`Pqu6[p!/:FR6+uR`!<>F_rrI`PY5a"~> +JcGWIrrDrr!<@\/rr>C^rrIZNY5a"~> +JcGWIrrDrr!<@b1rr>?DrrI`Pqu6[p!/:FR6+uR`!<>F_rrI`PY5a"~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/1@Q6+uUa!<@cLrrRfQ]s%Hd~> +JcGWIrrDrr!<@\/rr<%XrrIZNqu6[s!/1@Q5ecRa!<@]JrrR`O^9@Qe~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/1@Q6+uUa!<@cLrrRfQ]s%Hd~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2@L!PLecrrE+Pqu6\L!3Z?P~> +JcGWIrrDrr!<@\0rrKh6N;ip0!;lcs<<.[O!PUhcrrE+Nqu6\J!3Z?P~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2@L!PLecrrE+Pqu6\L!3Z?P~> +JcGWIrrDrr!<@b1rr>?DrrI`Pqu6[p!.t4P]n:t*rrE+Pqu6\L!3Z?P~> +JcGWIrrDrr!<@\/rr> +JcGWIrrDrr!<@b1rr>?DrrI`Pqu6[p!.t4P]n:t*rrE+Pqu6\L!3Z?P~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2:J!<<%NnG`LhKDYZLK)i(SJ,~> +JcGWIrrDrr!<@\0rrKh6N;ip0!;lcs<<.UM!<<%LnG`LhJc#HJJH2kQJ,~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2:J!<<%NnG`LhKDYZLK)i(SJ,~> +JcGWIrrDrr!<@b2rrLXMN;ip2!;lcs;?2:Jrr3,OXK9t7o`"plKDYZLK)kfK!7eLWJ,~> +JcGWIrrDrr!<@\0rrL[NN;ip0!;lcs<<.UMrr3,PWiFY0o`"plJc#HJJH5TI!7nRXJ,~> +JcGWIrrDrr!<@b2rrLXMN;ip2!;lcs;?2:Jrr3,OXK9t7o`"plKDYZLK)kfK!7eLWJ,~> +JcGWIrrDrr!<@b2rrIa +JcGWIrrDrr!<@\0rrI[9N;ip0!;lcs<<.UMqYpYK5X9nprrE+Nqu6hN!.k0$^A`Z`^:+&l~> +JcGWIrrDrr!<@b2rrIa +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!.k1Ds8R]X5la3'K0b,=!!*!a!J<];!!,B +JcGWIrrDrr!<@\/rr<%XrrIZNqu6[s!.k1Ds8RWV5QF'#JO"c7!!*!`!J*N8!!,?9YlB4~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!.k1Ds8R]X5la3'K0b,=!!*!a!J<];!!,B +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!.k02s*t~> +JcGWIrrDrr!<@\/rr<%XrrIZNqu6[s!.k02s*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!.k02s*t~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2:JO8j_~> +JcGWIrrDrr!<@\0rrKh6N;ip0!;lcs<<.UMO8j_~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2:JO8j_~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!.k02s*t~> +JcGWIrrDrr!<@\/rr<%XrrIZNqu6[s!.k02s*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!.k02s*t~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2:JO8j_~> +JcGWIrrDrr!<@\0rrKh6N;ip0!;lcs<<.UMO8j_~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2:JO8j_~> +JcGWIrrDrr!<@b2rrI`PN;is3!58=1!E&oKs,[21~> +JcGWIrrDrr!<@\0rrIZNN;is1!5AC2!EB,Ns,[21~> +JcGWIrrDrr!<@b2rrI`PN;is3!58=1!E&oKs,[21~> +JcGWIrrDrr!<@b2rrKf!N;ip2!;lcs;?2:JO8j_~> +JcGWIrrDrr!<@\0rrKi!N;ip0!;lcs<<.UMO8j_~> +JcGWIrrDrr!<@b2rrKf!N;ip2!;lcs;?2:JO8j_~> +JcGWIrrDrr!<@b1rr@\1rrI`Pqu6[p!.k02s*t~> +JcGWIrrDrr!<@\/rr@V/rrIZNqu6[s!.k02s*t~> +JcGWIrrDrr!<@b1rr@\1rrI`Pqu6[p!.k02s*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!.k02s*t~> +JcGWIrrDrr!<@\/rr<%XrrIZNqu6[s!.k02s*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!.k02s*t~> +JcGWIrrDrr!<@b2rrKf!N;rp1qu6[p!.k02s*t~> +JcGWIrrDrr!<@\0rrKi!N;rp/qu6[s!.k02s*t~> +JcGWIrrDrr!<@b2rrKf!N;rp1qu6[p!.k02s*t~> +JcGWIrrDrr!<@b2rrK2$N;ip2!;lcs;?2:JO8j_~> +JcGWIrrDrr!<@\0rrK,"N;ip0!;lcs<<.UMO8j_~> +JcGWIrrDrr!<@b2rrK2$N;ip2!;lcs;?2:JO8j_~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2:JO8j_~> +JcGWIrrDrr!<@\0rrKh6N;ip0!;lcs<<.UMO8j_~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2:JO8j_~> +JcGWIrrDrr!<@b2s8R_1rrI`Pqu6[p!.k02s*t~> +JcGWIrrDrr!<@\0s8RY/rrIZNqu6[s!.k02s*t~> +JcGWIrrDrr!<@b2s8R_1rrI`Pqu6[p!.k02s*t~> +JcGWIrrDrr!<@b1rrB`krrI`Pqu6[pK7X&`s*t~> +JcGWIrrDrr!<@\/rrBclrrIZNqu6[sJV!i^s*t~> +JcGWIrrDrr!<@b1rrB`krrI`Pqu6[pK7X&`s*t~> +JcGWIrrDrr!<@b's- +JcGWIrrDrr!<@\%s- +JcGWIrrDrr!<@b's- +JcGWIrrDrr!<@b's- +JcGWIrrDrr!<@\%s- +JcGWIrrDrr!<@b's- +JcGWIrrDrr!<@b2s8Tcks8N)rrrH!tJcFF's+@l^J,~> +JcGWIrrDrr!<@\0s8Tfls8N)rrrH+"JcFF's+.`\J,~> +JcGWIrrDrr!<@b2s8Tcks8N)rrrH!tJcFF's+@l^J,~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2:Jmf*WHs+C@O^&N^N!58@2!58=1!<>Fbrr^f(K>#)# +J,~> +JcGWIrrDrr!<@\0rrKh6N;ip0!;lcs<<.UMmf*WFs+14M^AiaL!5AF3!5AC2!<>Carr^i'J\Jr" +J,~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2:Jmf*WHs+C@O^&N^N!58@2!58=1!<>Fbrr^f(K>#)# +J,~> +JcGWIrrDrr!<@b2rrKf!N;ip262UZ_;?2:Jmf*PYrrB`bKDtqbqu6Wrr;ZeLrr3'us8R_es*t~> +JcGWIrrDrr!<@\0rrKi!N;ip05l:Q^<<.UMmf*PXrrBcaJc>_aqu6Wrr;ZeJrr3(#s8RYcs*t~> +JcGWIrrDrr!<@b2rrKf!N;ip262UZ_;?2:Jmf*PYrrB`bKDtqbqu6Wrr;ZeLrr3'us8R_es*t~> +JcGWIrrDrr!<@b's-@_rrIbcrr3'u!!'^Js*t~> +JcGWIrrDrr!<@\%s-=^rrI\brr3(#!!'aKs*t~> +JcGWIrrDrr!<@b's-@_rrIbcrr3'u!!'^Js*t~> +JcGWIrrDrr!<@b's-@_rrIbc\c70~> +JcGWIrrDrr!<@\%s-=^rrI\b\c70~> +JcGWIrrDrr!<@b's-@_rrIbc\c70~> +JcGWIrrDrr!<@b's-surr@]Lrr@]Mrr@\bs*t~> +JcGWIrrDrr!<@\%s- +JcGWIrrDrr!<@b's-surr@]Lrr@]Mrr@\bs*t~> +JcGWIrrDrr!<@b2rrKfcN;rp1qu6[p!.k1;rrUaN^%VI+^&7m1^&@s5eUp0$_#Jo~> +JcGWIrrDrr!<@\0rrKibN;rp/qu6[s!.k1;rrUdO^@qR,^AS!2^A\'6eq$*#_#Jo~> +JcGWIrrDrr!<@b2rrKfcN;rp1qu6[p!.k1;rrUaN^%VI+^&7m1^&@s5eUp0$_#Jo~> +JcGWIrrDrr!<@b2rrIa$N;rp1qu6[pK7X&`s*t~> +JcGWIrrDrr!<@\0rrI[!N;rp/qu6[sJV!i^s*t~> +JcGWIrrDrr!<@b2rrIa$N;rp1qu6[pK7X&`s*t~> +JcGWIrrDrr!<@b1rr@\1rrE+Pqu6[pK7X&`s*t~> +JcGWIrrDrr!<@\/rr@V/rrE+Nqu6[sJV!i^s*t~> +JcGWIrrDrr!<@b1rr@\1rrE+Pqu6[pK7X&`s*t~> +JcGWIrrDrr!<@b2rrKf!N;inYKDYZL;M0Q#O8j_~> +JcGWIrrDrr!<@\0rrKi!N;inYJc#HJ +JcGWIrrDrr!<@b2rrKf!N;inYKDYZL;M0Q#O8j_~> +JcGWIrrDrr!<@b2rrKe5N;rnXqu6[pK7X'Ws8R`KrrKfc^]/f~> +JcGWIrrDrr!<@\0rrKh6N;rnXqu6[sJV!jUs8RZIrrKib^]/f~> +JcGWIrrDrr!<@b2rrKe5N;rnXqu6[pK7X'Ws8R`KrrKfc^]/f~> +JcGWIrrDrr!<@b2rrI`PN;inY62UZ_;M0Q#g].;+qu?\K^]/f~> +JcGWIrrDrr!<@\0rrIZNN;inY5l:Q^ +JcGWIrrDrr!<@b2rrI`PN;inY62UZ_;M0Q#g].;+qu?\K^]/f~> +JcGWI!<@cLrrE+PN;ip26&bgE!/(1K!E+Q$s6]gfK0d3MrrRg=62gfh]n:t;s+ +JcGWI!<@]JrrE+NN;ip05`G^D!.k%I!EF]%s6]gfJO$sKrrRa:5lL]g^4Ck8s+*FdJc5WKJc5TM +^4F# +JcGWI!<@cLrrE+PN;ip26&bgE!/(1K!E+Q$s6]gfK0d3MrrRg=62gfh]n:t;s+ +JcGWI!<@cMrrTk6K8]a0K8fj1KDYZL;F,m6mJd6?s$?Ya&4-?0!<<)#^&J(bs+#>*J,~> +JcGWI!<@]KrrTn7JW'O.JW0X/Jc#HJ +JcGWI!<@cMrrTk6K8]a0K8fj1KDYZL;F,m6mJd6?s$?Ya&4-?0!<<)#^&J(bs+#>*J,~> +JcGWI!<>F_rrE+PMuNbWN;rp1qu6[p!.k1;ru3D>!/(=OKE(s;s8Q!ss+C@OK7j4(K>% +JcGWI!<>C^rrE+NMuNbWN;rp/qu6[s!.k1;ru3A;!.k1MJcGa8s8Q+!s+14MJV!k$J\M0aJV!h# +"G&gh5X +JcGWI!<>F_rrE+PMuNbWN;rp1qu6[p!.k1;ru3D>!/(=OKE(s;s8Q!ss+C@OK7j4(K>% +JcGWIrrDrr!<@b2rrKe5N;inYKDYZL;M0Q#mf*=$KDb`a^&S*us8Q!ss+C@OK7j4(K7j4(K7j1' +rIY*`a8^Y~> +JcGWIrrDrr!<@\0rrKh6N;inYJc#HJ +JcGWIrrDrr!<@b2rrKe5N;inYKDYZL;M0Q#mf*=$KDb`a^&S*us8Q!ss+C@OK7j4(K7j4(K7j1' +rIY*`a8^Y~> +JcGWI!<>F_rrE+PN;iplK8fg2K)kfK!E+Q$s6]gdKDb`]KE(s;s8T2#s+A#bK7j4(6,!9t!/(:N +!56;MJ,~> +JcGWI!<>C^rrE+NN;ipmJW0U0JH5TI!EF]%s6]gdJc,N[JcGa8s8T,!s+.oaJV!k$5ed6t!.k.L +!5?ANJ,~> +JcGWI!<>F_rrE+PN;iplK8fg2K)kfK!E+Q$s6]gdKDb`]KE(s;s8T2#s+A#bK7j4(6,!9t!/(:N +!56;MJ,~> +JcGWI!<>F_rrE+PN;ip2!0$pY6%f(7!E+Q$s6]h%.D8$\s8Te4s$?\beNngR63"UuK0d3Lrr@]N +rrg#$]n=#=s*t~> +JcGWI!<>C^rrE+NN;ip0!0$pY5_8h4!EF]%s6]h%.)%s\s8Th5s$6Vaej+dO5l\OuJO$sJrr@WL +rrg&$^4F#=s*t~> +JcGWI!<>F_rrE+PN;ip2!0$pY6%f(7!E+Q$s6]h%.D8$\s8Te4s$?\beNngR63"UuK0d3Lrr@]N +rrg#$]n=#=s*t~> +JcGWI!<>F_rrE+PN;rp1N;inYKDYZL;?2:JO8j_~> +JcGWI!<>C^rrE+NN;rp/N;inYJc#HJ<<.UMO8j_~> +JcGWI!<>F_rrE+PN;rp1N;inYKDYZL;?2:JO8j_~> +JcGWIrrDrr!<@b2s8R_1rrE+Pqu6[pK7X&`s*t~> +JcGWIrrDrr!<@\0s8RY/rrE+Nqu6[sJV!i^s*t~> +JcGWIrrDrr!<@b2s8R_1rrE+Pqu6[pK7X&`s*t~> +JcGWIrrDrr!<@b2rrKfcN;inYKDYZL;M0Q#O8j_~> +JcGWIrrDrr!<@\0rrKibN;inYJc#HJ +JcGWIrrDrr!<@b2rrKfcN;inYKDYZL;M0Q#O8j_~> +JcGWIrrDrr!<@b2rrIa +JcGWIrrDrr!<@\0rrI[9N;ioDJc#HJ +JcGWIrrDrr!<@b2rrIa +JcGWI!<>F_rrE+PN;rp1N;ioEKDYZL;M0Q#O8j_~> +JcGWI!<>C^rrE+NN;rp/N;ioDJc#HJ +JcGWI!<>F_rrE+PN;rp1N;ioEKDYZL;M0Q#O8j_~> +JcGWIrrDus!keSdMuNd0N;inYKDYZL;M0Q#O8j_~> +JcGWIrrDus!knYcMuNd.N;inYJc#HJ +JcGWIrrDus!keSdMuNd0N;inYKDYZL;M0Q#O8j_~> +JcGWIrrDrr!<@b2rrKfcN;inYKDYZL;M0Q#O8j_~> +JcGWIrrDrr!<@\0rrKibN;inYJc#HJ +JcGWIrrDrr!<@b2rrKfcN;inYKDYZL;M0Q#O8j_~> +JcGWIrrDrr!<@b2s8R_1rrE+Pqu6[pK7X&`s*t~> +JcGWIrrDrr!<@\0s8RY/rrE+Nqu6[sJV!i^s*t~> +JcGWIrrDrr!<@b2s8R_1rrE+Pqu6[pK7X&`s*t~> +JcGWI!<>F_rrE+PN;rp1N;inY62UZ_;F,m6O8j_~> +JcGWI!<>C^rrE+NN;rp/N;inY5l:Q^ +JcGWI!<>F_rrE+PN;rp1N;inY62UZ_;F,m6O8j_~> +JcGWI!<>F_rrE+PN;rp1N;inYKDYZL;M0Q#O8j_~> +JcGWI!<>C^rrE+NN;rp/N;inYJc#HJ +JcGWI!<>F_rrE+PN;rp1N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cLrrE+PN;ip2]o;sl!($M^!E+Q$s,[21~> +JcGWI!<@]JrrE+NN;ip0^5W'm!'pG]!EF]%s,[21~> +JcGWI!<@cLrrE+PN;ip2]o;sl!($M^!E+Q$s,[21~> +JcGWI!<@cLrrE+PN;im1MuNeXKDYZL;M0Q#O8j_~> +JcGWI!<@]JrrE+NN;im/MuNeXJc#HJ +JcGWI!<@cLrrE+PN;im1MuNeXKDYZL;M0Q#O8j_~> +JcGWI!<@cLrrE+PN;im1MuNeXKDYZL;M0Q#O8j_~> +JcGWI!<@]JrrE+NN;im/MuNeXJc#HJ +JcGWI!<@cLrrE+PN;im1MuNeXKDYZL;M0Q#O8j_~> +JcGWI!<@cLrrE+PN;iplK8fg2!/(1K!E+Q$s,[21~> +JcGWI!<@]JrrE+NN;ipmJW0U0!.k%I!EF]%s,[21~> +JcGWI!<@cLrrE+PN;iplK8fg2!/(1K!E+Q$s,[21~> +JcGWI! +JcGWI! +JcGWI! +JcGWI!<@cLrrE+PN;rpkN;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]JrrE+NN;rplN;inYJc#HJ +JcGWI!<@cLrrE+PN;rpkN;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cLrrE+PJcD#8!<@cLrrH#MJcCf2J,~> +JcGWI!<@]JrrE+NJcD#8!<@]JrrH,NJcCf2J,~> +JcGWI!<@cLrrE+PJcD#8!<@cLrrH#MJcCf2J,~> +JcGWI!<@cLrrE+PJcD#8!<@cLrrH!tJcCf2J,~> +JcGWI!<@]JrrE+NJcD#8!<@]JrrH+"JcCf2J,~> +JcGWI!<@cLrrE+PJcD#8!<@cLrrH!tJcCf2J,~> +JcGWI!<@cLrrE+PN;imkMuNeXKDYZL;M0Q#O8j_~> +JcGWI!<@]JrrE+NN;imlMuNeXJc#HJ +JcGWI!<@cLrrE+PN;imkMuNeXKDYZL;M0Q#O8j_~> +JcGWI!<@cLrrE+PN;rp1N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]JrrE+NN;rp/N;inYJc#HJ +JcGWI!<@cLrrE+PN;rp1N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cLrrE+PN;rp1N;inY62UZ_;M0Q#O8j_~> +JcGWI!<@]JrrE+NN;rp/N;inY5l:Q^ +JcGWI!<@cLrrE+PN;rp1N;inY62UZ_;M0Q#O8j_~> +JcGWI!<@cLrrE+PN;rpkN;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]JrrE+NN;rplN;inYJc#HJ +JcGWI!<@cLrrE+PN;rpkN;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cMrrTk6K7X&frrE+Pqu6[pK7X&`s*t~> +JcGWI!<@]KrrTn7JV!idrrE+Nqu6[sJV!i^s*t~> +JcGWI!<@cMrrTk6K7X&frrE+Pqu6[pK7X&`s*t~> +JcGWI!<@cMrrTk6K7X&frrE+Pqu6[pK7X&`s*t~> +JcGWI!<@]KrrTn7JV!idrrE+Nqu6[sJV!i^s*t~> +JcGWI!<@cMrrTk6K7X&frrE+Pqu6[pK7X&`s*t~> +JcGWI!<@cMrrRfQK8fg1]o2mk!/(1K!E+Q$s,[21~> +JcGWI!<@]KrrR`OJW0U/^5N!l!.k%I!EF]%s,[21~> +JcGWI!<@cMrrRfQK8fg1]o2mk!/(1K!E+Q$s,[21~> +JcGWI!<@cLrrE+PN;rp1N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]JrrE+NN;rp/N;inYJc#HJ +JcGWI!<@cLrrE+PN;rp1N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cMrrT8%K8fj1K8fg2!/(1K!E+Q$s,[21~> +JcGWI!<@]KrrT2#JW0X/JW0U0!.k%I!EF]%s,[21~> +JcGWI!<@cMrrT8%K8fj1K8fg2!/(1K!E+Q$s,[21~> +JcGWI!<@cMrrTk6K8fg1K8]a1!/(1K!E+Q$s,[21~> +JcGWI!<@]KrrTn7JW0U/JW'O/!.k%I!EF]%s,[21~> +JcGWI!<@cMrrTk6K8fg1K8]a1!/(1K!E+Q$s,[21~> +JcGWI!<@cMrrTk6]o;slK>!6D!<>F_rrH#MJcCf2J,~> +JcGWI!<@]KrrTn7^5W'mJ\I*C!<>C^rrH,NJcCf2J,~> +JcGWI!<@cMrrTk6]o;slK>!6D!<>F_rrH#MJcCf2J,~> +JcGWI!<@cLrrE+PN;rp1N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]JrrE+NN;rp/N;inYJc#HJ +JcGWI!<@cLrrE+PN;rp1N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cLrrE+PN;rp1N;inYKDYZL;F,m6O8j_~> +JcGWI!<@]JrrE+NN;rp/N;inYJc#HJ +JcGWI!<@cLrrE+PN;rp1N;inYKDYZL;F,m6O8j_~> +JcGWI!<@cMrrKe5MuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]KrrKh6MuWg.N;inYJc#HJ +JcGWI!<@cMrrKe5MuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cMrrTk6]o;slK>!6D!<@cLrrH!tJcCf2J,~> +JcGWI!<@]KrrTn7^5W'mJ\I*C!<@]JrrH+"JcCf2J,~> +JcGWI!<@cMrrTk6]o;slK>!6D!<@cLrrH!tJcCf2J,~> +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;F,m6O8j_~> +JcGWI!<@]KrrIZNMuWg.N;inYJc#HJ +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;F,m6O8j_~> +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]KrrIZNMuWg.N;inYJc#HJ +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]KrrIZNMuWg.N;inYJc#HJ +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]KrrIZNMuWg.N;inYJc#HJ +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cMrrI`PMuWg0N;inY62UZ_;M0Q#O8j_~> +JcGWI!<@]KrrIZNMuWg.N;inY5l:Q^ +JcGWI!<@cMrrI`PMuWg0N;inY62UZ_;M0Q#O8j_~> +JcGWI!<@cMrrI`PMuNd0MuNeXKDYZL;M0Q#O8j_~> +JcGWI!<@]KrrIZNMuNd.MuNeXJc#HJ +JcGWI!<@cMrrI`PMuNd0MuNeXKDYZL;M0Q#O8j_~> +JcGWI!<@cMrrI`PMuNg1XGm/[!/(1K!E+Q$s,[21~> +JcGWI!<@]KrrIZNMuNg/Wf6rY!.k%I!EF]%s,[21~> +JcGWI!<@cMrrI`PMuNg1XGm/[!/(1K!E+Q$s,[21~> +JcGWI!<@cMrrI`PMuNg1]o;sl!/(1K!E+Q$s,[21~> +JcGWI!<@]KrrIZNMuNg/^5W'm!.k%I!EF]%s,[21~> +JcGWI!<@cMrrI`PMuNg1]o;sl!/(1K!E+Q$s,[21~> +JcGWI!<@cMrrI`PMuNg1]o;sl!/(1K!E+Q$s,[21~> +JcGWI!<@]KrrIZNMuNg/^5W'm!.k%I!EF]%s,[21~> +JcGWI!<@cMrrI`PMuNg1]o;sl!/(1K!E+Q$s,[21~> +JcGWI!<>F`rrI`PMuNg1]o;sl!/(1K!E+Q$s,[21~> +JcGWI!<>C_rrIZNMuNg/^5W'm!.k%I!EF]%s,[21~> +JcGWI!<>F`rrI`PMuNg1]o;sl!/(1K!E+Q$s,[21~> +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]KrrIZNMuWg.N;inYJc#HJ +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]KrrIZNMuWg.N;inYJc#HJ +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cMrrI`PMuWg0N;inYKDYZK;M"k.s*t~> +JcGWI!<@]KrrIZNMuWg.N;inYJc#HI +JcGWI!<@cMrrI`PMuWg0N;inYKDYZK;M"k.s*t~> +JcGWI!<@cMrrKe5MuWg0N;inYKDYZL;S@Y]O8j_~> +JcGWI!<@]KrrKh6MuWg.N;inYJc#HJ +JcGWI!<@cMrrKe5MuWg0N;inYKDYZL;S@Y]O8j_~> +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]KrrIZNMuWg.N;inYJc#HJ +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]KrrIZNMuWg.N;inYJc#HJ +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cMrrPId]o +JcGWI!<@]KrrPFc^5W*lJW0U0!.k%I!EHjbs,[21~> +JcGWI!<@cMrrPId]o +JcGWI!<@cMrrRfQ]o +JcGWI!<@]KrrR`O^5W*lJW0U0!.k%I!EHjbs,[21~> +JcGWI!<@cMrrRfQ]o +JcGZJ!keSdr;QeM!/pjXK>!6D!<@cLrr>rJs,R,0~> +JcGZJ!knYcr;QeK!/pjXJ\I*C!<@]Jrr?&Ms,R,0~> +JcGZJ!keSdr;QeM!/pjXK>!6D!<@cLrr>rJs,R,0~> +JcGZJ!S%2IrrI`PMuNe-MuNeXKDYZL;Up?uO8j_~> +JcGZJ!S.8JrrIZNMuNe.MuNeXJc#HJ +JcGZJ!S%2IrrI`PMuNe-MuNeXKDYZL;Up?uO8j_~> +JcGZJ!eUKdr;QhN!/#k&Q2^jbKDYZL;S@Y]O8j_~> +JcGZJ!eC?cr;QhL!.f_$Q2^jbJc#HJ +JcGZJ!eUKdr;QhN!/#k&Q2^jbKDYZL;S@Y]O8j_~> +JcGWI!<@cMrrI`PJcCu7!<@cLrr=L!s,R,0~> +JcGWI!<@]KrrIZNJcCu7!<@]Jrr=Hus,R,0~> +JcGWI!<@cMrrI`PJcCu7!<@cLrr=L!s,R,0~> +JcGZJ!keSdr;QeM!/pjXK>!6D!<@cLrr=L!s,R,0~> +JcGZJ!knYcr;QeK!/pjXJ\I*C!<@]Jrr=Hus,R,0~> +JcGZJ!keSdr;QeM!/pjXK>!6D!<@cLrr=L!s,R,0~> +JcGZJ!eUKdr;QeM!/pmWK8fg2!/(1K!!%TMNrOV~> +JcGZJ!eC?cr;QeK!/pmWJW0U0!.k%I!!%TMNrOV~> +JcGZJ!eUKdr;QeM!/pmWK8fg2!/(1K!!%TMNrOV~> +JcGWI! +JcGWI! +JcGWI! +JcGZJ!keSdr;QeM!.k07rrE+Pqu6[pK7X&`s*t~> +JcGZJ!knYcr;QeK!.k07rrE+Nqu6[sJV!i^s*t~> +JcGZJ!keSdr;QeM!.k07rrE+Pqu6[pK7X&`s*t~> +JcGZJ!keTIr;QeM!.k07rrE+Pqu6XFJcCc1J,~> +JcGZJ!knZKr;QeK!.k07rrE+Nqu6XEJcCc1J,~> +JcGZJ!keTIr;QeM!.k07rrE+Pqu6XFJcCc1J,~> +JcGWI!!)or!J:B's-3Na!/(1K! +JcGWI!!)or!J(6%s-3Na!.k%I! +JcGWI!!)or!J:B's-3Na!/(1K! +JcGZJ!eUK*r;QhN!54?k!/$40!<@cLrrFR$JcCf2J,~> +JcGZJ!eC?&r;QhL!5=El!.g(.!<@]JrrFO!JcCf2J,~> +JcGZJ!eUK*r;QhN!54?k!/$40!<@cLrrFR$JcCf2J,~> +JcGZJ!eUK*r;QeM!/pmWK8fg2!/(1K!%EL!NrOV~> +JcGZJ!eC?&r;QeK!/pmWJW0U0!.k%I!% +JcGZJ!eUK*r;QeM!/pmWK8fg2!/(1K!%EL!NrOV~> +JcGZJ!J:CLrrI`PMuWg0N;inYKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuWg.N;inYJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuWg0N;inYKDYZK!.k01s*t~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZL(tF3;O8j_~> +JcGZJ!J(7JrrIZNMuNd.MuNeXJc#HJ*7f]@O8j_~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZL(tF3;O8j_~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuNd.MuNeXJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZK!.k01s*t~> +JcGZJ!PJL1rrI`PMuWg0N;inYKDYZK!.k01s*t~> +JcGZJ!PSR2rrIZNMuWg.N;inYJc#HI!.k01s*t~> +JcGZJ!PJL1rrI`PMuWg0N;inYKDYZK!.k01s*t~> +JcGZJ!J:CLrrI`PMuNg1]o;sl!/(1K!!%TMNrOV~> +JcGZJ!J(7JrrIZNMuNg/^5W'm!.k%I!!%TMNrOV~> +JcGZJ!J:CLrrI`PMuNg1]o;sl!/(1K!!%TMNrOV~> +JcGZJ!eUKdr;ZcsMuNd0MuNeXKDYZK!.k01s*t~> +JcGZJ!eC?cr;ZcsMuNd.MuNeXJc#HI!.k01s*t~> +JcGZJ!eUKdr;ZcsMuNd0MuNeXKDYZK!.k01s*t~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuNd.MuNeXJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZK!.k01s*t~> +JcGZJ!J:CLrrI`PMuWg0N;inYKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuWg.N;inYJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuWg0N;inYKDYZK!.k01s*t~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuNd.MuNeXJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZK!.k01s*t~> +JcGZJ!eUK*r;QeM!/pjXK>!9E!eUK*qu6WrJcCc1J,~> +JcGZJ!eC?&r;QeK!/pjXJ\I-D!eC?&qu6WrJcCc1J,~> +JcGZJ!eUK*r;QeM!/pjXK>!9E!eUK*qu6WrJcCc1J,~> +JcGZJ!J:CLrrI`PMuWg0N;inYKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuWg.N;inYJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuWg0N;inYKDYZK!.k01s*t~> +JcGZJ!J:CLrrI`PMuNg1]o;sl!/(1K! +JcGZJ!J(7JrrIZNMuNg/^5W'm!.k%I! +JcGZJ!J:CLrrI`PMuNg1]o;sl!/(1K! +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZL!/#k&O8j_~> +JcGZJ!J(7JrrIZNMuNd.MuNeXJc#HJ!.f_$O8j_~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZL!/#k&O8j_~> +JcGZJ!J:CLrrI`PMuNg1]o;sl!/(1K! +JcGZJ!J(7JrrIZNMuNg/^5W'm!.k%I! +JcGZJ!J:CLrrI`PMuNg1]o;sl!/(1K! +JcGZJ!iuBSr;QeM!/pjXK<1%3!<@cLrrE,MJcCf2J,~> +JcGZJ!ic6Or;QeK!/pjXJZ=\/!<@]JrrE,NJcCf2J,~> +JcGZJ!iuBSr;QeM!/pjXK<1%3!<@cLrrE,MJcCf2J,~> +JcGZJ!eUK*r;QeM!/pjWK8]a1!/(1K! +JcGZJ!eC?&r;QeK!/pjWJW'O/!.k%I! +JcGZJ!eUK*r;QeM!/pjWK8]a1!/(1K! +JcGZJ!J:CLrrI`PMuNbWN;ism!/(1K!!%TMNrOV~> +JcGZJ!J(7JrrIZNMuNbWN;isn!.k%I!!%TMNrOV~> +JcGZJ!J:CLrrI`PMuNbWN;ism!/(1K!!%TMNrOV~> +JcGZJ!J:CLrrI`PMuNcCMuNeXKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuNcBMuNeXJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuNcCMuNeXKDYZK!.k01s*t~> +JcGZJ!eUKdr;QeM!/pjW6&YaD!/(1K!<@b's,[21~> +JcGZJ!eC?cr;QeK!/pjW5`>XC!.k%I!<@\%s,[21~> +JcGZJ!eUKdr;QeM!/pjW6&YaD!/(1K!<@b's,[21~> +JcGZJ!J:CLrrI`PMuNcCMuNeXKDYZL!/#k&O8j_~> +JcGZJ!J(7JrrIZNMuNcBMuNeXJc#HJ!.f_$O8j_~> +JcGZJ!J:CLrrI`PMuNcCMuNeXKDYZL!/#k&O8j_~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZL!53s`O8j_~> +JcGZJ!J(7JrrIZNMuNd.MuNeXJc#HJ!5=$aO8j_~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZL!53s`O8j_~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuNd.MuNeXJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZK!.k01s*t~> +JcGZJ!eUKdr;QeM!/pjW6&YaD!/(1K!!%TMNrOV~> +JcGZJ!eC?cr;QeK!/pjW5`>XC!.k%I!!%TMNrOV~> +JcGZJ!eUKdr;QeM!/pjW6&YaD!/(1K!!%TMNrOV~> +JcGZJ!J:CLrrI`PMuNcCMuNeXKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuNcBMuNeXJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuNcCMuNeXKDYZK!.k01s*t~> +JcGZJ!J:CLrrI`PMuNbWN;ism!/(1K!<@b's,[21~> +JcGZJ!J(7JrrIZNMuNbWN;isn!.k%I!<@\%s,[21~> +JcGZJ!J:CLrrI`PMuNbWN;ism!/(1K!<@b's,[21~> +JcGZJ!J:CLrrI`PMuNbWMuNeXKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuNbWMuNeXJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuNbWMuNeXKDYZK!.k01s*t~> +JcGZJ!J:CLrrI`PJcD#8!iuBSqu6WrJcCc1J,~> +JcGZJ!J(7JrrIZNJcD#8!ic6Oqu6WrJcCc1J,~> +JcGZJ!J:CLrrI`PJcD#8!iuBSqu6WrJcCc1J,~> +JcGZJ!J:CLrrI`PJcCu7!<@cLrr<%Ms,R,0~> +JcGZJ!J(7JrrIZNJcCu7!<@]Jrr<%Ms,R,0~> +JcGZJ!J:CLrrI`PJcCu7!<@cLrr<%Ms,R,0~> +JcGZJ!eUK*r;QeM!/pjWK8]a1!/(1K!<@b's,[21~> +JcGZJ!eC?&r;QeK!/pjWJW'O/!.k%I!<@\%s,[21~> +JcGZJ!eUK*r;QeM!/pjWK8]a1!/(1K!<@b's,[21~> +JcGZJ!eUKdr;QeM!/pjW!/pjX!/(1K!<@b's,[21~> +JcGZJ!eC?cr;QeK!/pjW!/pjX!.k%I!<@\%s,[21~> +JcGZJ!eUKdr;QeM!/pjW!/pjX!/(1K!<@b's,[21~> +JcGZJ!eUKdr;QeM!/pjW!/pjX!/(1K!!%TMNrOV~> +JcGZJ!eC?cr;QeK!/pjW!/pjX!.k%I!!%TMNrOV~> +JcGZJ!eUKdr;QeM!/pjW!/pjX!/(1K!!%TMNrOV~> +JcGZJ!J:CLrrI`PMuNdjMuNeXKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuNdkMuNeXJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuNdjMuNeXKDYZK!.k01s*t~> +JcGZJ!J:CLrrI`PJcCu7!<@cLrr<%Ms,R,0~> +JcGZJ!J(7JrrIZNJcCu7!<@]Jrr<%Ms,R,0~> +JcGZJ!J:CLrrI`PJcCu7!<@cLrr<%Ms,R,0~> +JcGZJ!J:CLrrI`PJcCu7!<@cLrr<%Ms,R,0~> +JcGZJ!J(7JrrIZNJcCu7!<@]Jrr<%Ms,R,0~> +JcGZJ!J:CLrrI`PJcCu7!<@cLrr<%Ms,R,0~> +JcGZJ!eUKdr;QeM!/pjWK8]a1!/(1K!!%TMNrOV~> +JcGZJ!eC?cr;QeK!/pjWJW'O/!.k%I!!%TMNrOV~> +JcGZJ!eUKdr;QeM!/pjWK8]a1!/(1K!!%TMNrOV~> +JcGZJ!eUK*r;QeM!/pjW!0$pZ]`<]^rrE,5JcCf2J,~> +JcGZJ!eC?&r;QeK!/pjW!0$pZ^&W`]rrE,6JcCf2J,~> +JcGZJ!eUK*r;QeM!/pjW!0$pZ]`<]^rrE,5JcCf2J,~> +JcGZJ!eUK*r;QeM!/pjW!/pjX!/(1K!<@b's,[21~> +JcGZJ!eC?&r;QeK!/pjW!/pjX!.k%I!<@\%s,[21~> +JcGZJ!eUK*r;QeM!/pjW!/pjX!/(1K!<@b's,[21~> +JcGZJ!eUKdr;QeM!/pjW!0$pZK)gQ$rrE+PJcCf2J,~> +JcGZJ!eC?cr;QeK!/pjW!0$pZJH18urrE+NJcCf2J,~> +JcGZJ!eUKdr;QeM!/pjW!0$pZK)gQ$rrE+PJcCf2J,~> +JcGZJ!J:CLrrI`PMuNbWN;ism!/(1K!<@b's,[21~> +JcGZJ!J(7JrrIZNMuNbWN;isn!.k%I!<@\%s,[21~> +JcGZJ!J:CLrrI`PMuNbWN;ism!/(1K!<@b's,[21~> +JcGZJ!eUKSr;QeM!/pjW!0$pZX8mnMrr<%Ms,R,0~> +JcGZJ!eC?Or;QeK!/pjW!0$pZWW7VIrr<%Ms,R,0~> +JcGZJ!eUKSr;QeM!/pjW!0$pZX8mnMrr<%Ms,R,0~> +JcGZJ!J:CLrrI`PMuNbWN;ism!/(1K! +JcGZJ!J(7JrrIZNMuNbWN;isn!.k%I! +JcGZJ!J:CLrrI`PMuNbWN;ism!/(1K! +JcGZJ!J:CLrrI`PMuNbWMuNeXKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuNbWMuNeXJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuNbWMuNeXKDYZK!.k01s*t~> +JcGZJ!J:CLrrI`PMuNbWMuNeXKDYZL!53s`O8j_~> +JcGZJ!J(7JrrIZNMuNbWMuNeXJc#HJ!5=$aO8j_~> +JcGZJ!J:CLrrI`PMuNbWMuNeXKDYZL!53s`O8j_~> +JcGZJ!J:CLrrI`PMuNbWMuNeXKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuNbWMuNeXJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuNbWMuNeXKDYZK!.k01s*t~> +JcGZJ!eUKdr;QeM!/pjW!/pjX!/(1K!!%TMNrOV~> +JcGZJ!eC?cr;QeK!/pjW!/pjX!.k%I!!%TMNrOV~> +JcGZJ!eUKdr;QeM!/pjW!/pjX!/(1K!!%TMNrOV~> +JcGZJ!keSdr;ZcsMuNbWN;ism!/(1K!%EL!NrOV~> +JcGZJ!knYcr;ZcsMuNbWN;isn!.k%I!% +JcGZJ!keSdr;ZcsMuNbWN;ism!/(1K!%EL!NrOV~> +JcGWIrrDus!J:B1rr<%XrrTk6KDb`M]d\O4NrOV~> +JcGWIrrDus!J(6/rr<%XrrTn7Jc,NK^*nR4NrOV~> +JcGWIrrDus!J:B1rr<%XrrTk6KDb`M]d\O4NrOV~> +JcGWI!^Qh"rVlnN!/pjW!/pjX!/(4L!J=:$s,R,0~> +JcGWI!^Hb"rVlnL!/pjW!/pjX!.k(J!J+7%s,R,0~> +JcGWI!^Qh"rVlnN!/pjW!/pjX!/(4L!J=:$s,R,0~> +JcGTH!<>FarrI`PMuNbWMuNeXKDb`M5uN:6NrOV~> +JcGTH!<>C`rrIZNMuNbWMuNeXJc,NK5ZNC8NrOV~> +JcGTH!<>FarrI`PMuNbWMuNeXKDb`M5uN:6NrOV~> +JcGTH!^Qh"rr3"O!/pjW!/pjX!/(7M!eUL'JcCc1J,~> +JcGTH!^Hb"rr3"M!/pjW!/pjX!.k+K!eC@&JcCc1J,~> +JcGTH!^Qh"rr3"O!/pjW!/pjX!/(7M!eUL'JcCc1J,~> +JcGQGrr<59s8Tb4K8fg1!0$pZ]`<]arrTk6!.k00s*t~> +JcGQGrr<5:s8Te5JW0U/!0$pZ^&W``rrTn7!.k00s*t~> +JcGQGrr<59s8Tb4K8fg1!0$pZ]`<]arrTk6!.k00s*t~> +JcGQG#h=P-F4L:>!3D1[!!%uX!@\$Jrr[lR.Fj"LNW4M~> +JcGQG#hFP,ERt. +JcGQG#h=P-F4L:>!3D1[!!%uX!@\$Jrr[lR.Fj"LNW4M~> +JcGKE"2-,`62glaK9-$4!0.!`5lcQ;]`8%bJcCZ.J,~> +JcGKE"26/`5lLc`JWKg2!0.!`5QHB8^&S.aJcCZ.J,~> +JcGKE"2-,`62glaK9-$4!0.!`5lcQ;]`8%bJcCZ.J,~> +JcGHD!nDohnc/YUqZ$YL62cE961TX.62H3662#p2!<.WN62uQ=;?-^r62^f`K)eg,K)ks<\:ah] +rIaD8!581-s+:PB!!#;N!(";Ls,-i,~> +JcGHD!nMofnc/YTqZ$YJ5lH665k9I+5l-$35k]a/!<.QL5lZB:<<*$u5lC]_JH/^-JH5a9\:O\[ +rIO86!5A7.s+(D?!!#8L!'n8Ls,-i,~> +JcGHD!nDohnc/YUqZ$YL62cE961TX.62H3662#p2!<.WN62uQ=;?-^r62^f`K)eg,K)ks<\:ah] +rIaD8!581-s+:PB!!#;N!(";Ls,-i,~> +JcG<@b(K]ordt:QK7a1#K*"r'!<.TN6/I4r5lcOirW!%Q;M.8r!<7\&s+p]*~> +JcG<@b(9Qmrdb.OJUmgtJHAi&!<.NL5i.%o5QH@drW!%O +JcG<@b(K]ordt:QK7a1#K*"r'!<.TN6/I4r5lcOirW!%Q;M.8r!<7\&s+p]*~> +JcC<$r;Q`sd/X)t!7h)K`.J''JcCH(J,~> +JcC<$r;Q`sd/X)r!7q/L`.7p&JcCH(J,~> +JcC<$r;Q`sd/X)t!7h)K`.J''JcCH(J,~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;QbLJcC<$O8j_~> +JcC<$r;QbJJcC<$O8j_~> +JcC<$r;QbLJcC<$O8j_~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;QbLJcC<$O8j_~> +JcC<$r;QbJJcC<$O8j_~> +JcC<$r;QbLJcC<$O8j_~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$r;QbLJcC<$O8j_~> +JcC<$r;QbJJcC<$O8j_~> +JcC<$r;QbLJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sNW0!lr]pPb^"WJd621B[]g;Ss!/(%G!7f!es1Rq%qh(^EJ,~> +JcC<$r;Q`sNW0!mr]gJa^=rSe5kk9Z^-MVs!.jnE!7o'fs1\"&qgkRCJ,~> +JcC<$r;Q`sNW0!lr]pPb^"WJd621B[]g;Ss!/(%G!7f!es1Rq%qh(^EJ,~> +JcC<$r;Q`sNW0.^^&S,GKA->*!;-9k!;-9k;T/S;K=un'pAY.Z^&J$36(e1-~> +JcC<$r;Q`sNW0.^^An5IJ_L,(!;-9k!;-9kJ\H\#pAY.Y^Ae-45bJ(,~> +JcC<$r;Q`sNW0.^^&S,GKA->*!;-9k!;-9k;T/S;K=un'pAY.Z^&J$36(e1-~> +JcC<$r;Q`sNrT-3ec,ULo`"mko`"oDao;@Srr3.Sec5Z_KD5BH6%f1:!/$pDJ,~> +JcC<$r;Q`sNrT-1ec,ULo`"mko`"oBao;@Trr3.Qf)PcaJbT0F5_8q7!.gdBJ,~> +JcC<$r;Q`sNrT-3ec,ULo`"mko`"oDao;@Srr3.Sec5Z_KD5BH6%f1:!/$pDJ,~> +JcC<$r;Q`sNrK*3q>Udf!!'_4]`8%b!($Va$G?E>^&S+b]`8$urr2u3rW)lr!!)Zk!!)ut"2+\# +^&7m1;Z-Or5leUtrr^f(6,!6s$,$=k^&S+b5s^/%rrTldKDkfO]n=#ks8R`OrrKfcrVlj`p\t5G +rVlj`TDsE~> +JcC<$r;Q`sNrK*1q>Ude!!'b5^&S.a!'pP`$GHK?^An4a^&S-urr2u4rW)lr!!)Zk!!)ut"24b# +^AS!2 +JcC<$r;Q`sNrK*3q>Udf!!'_4]`8%b!($Va$G?E>^&S+b]`8$urr2u3rW)lr!!)Zk!!)ut"2+\# +^&7m1;Z-Or5leUtrr^f(6,!6s$,$=k^&S+b5s^/%rrTldKDkfO]n=#ks8R`OrrKfcrVlj`p\t5G +rVlj`TDsE~> +JcC<$r;Q`sNrK*3qZ$SJ"okYis1JF3rt[nQs+>t(rrE*!K)iUb]n?@b!58C4KDkfM!;-9k!<)p# +!56'3^&@s2;Z6V&!<<'b^&S*462s7MrsQM+s$;;;X8orI6%f1:$37blec5Z_KE"6NpAY;K63$t; +KDkiMKD>HHKDkiL!<7ZOeYN4q~> +JcC<$r;Q`sNrK*1qZ$SH"okSfs1SL4rt[kNs+,b$rrE*!JH3Fa^4H=a!5AI5Jc5TK!;-9k!<)p# +!5?04^A\'3 +JcC<$r;Q`sNrK*3qZ$SJ"okYis1JF3rt[nQs+>t(rrE*!K)iUb]n?@b!58C4KDkfM!;-9k!<)p# +!56'3^&@s2;Z6V&!<<'b^&S*462s7MrsQM+s$;;;X8orI6%f1:$37blec5Z_KE"6NpAY;K63$t; +KDkiMKD>HHKDkiL!<7ZOeYN4q~> +JcC<$r;Q`sNrK*3rr3,OX8r8#r_`iNs8N)us8R]Xs+;bAK2VaL;Ut^F"g$8Ss+>t&rr<&krr<&u +rrl +JcC<$r;Q`sNrK*1rr3,PWW<&!r`'&Os8N)us8RWVs+)S +JcC<$r;Q`sNrK*3rr3,OX8r8#r_`iNs8N)us8R]Xs+;bAK2VaL;Ut^F"g$8Ss+>t&rr<&krr<&u +rrl +JcC<$r;Qa_NrT-3rVunM!!)or!!*#us+:CQK7j+%!/(1K!3H2"s+C:M!!)Zk!!*#us+C@O!PO-a +rr@]NrrIbcr;QeMXS`"t62plc63"%brrW9$rrDrr!($2Us1SI4!PO-arrIbcq#:>Hq#:>qV#Pr~> +JcC<$r;Qa^NrT-1rVunK!!)or!!*#us+(7OJV!b!!.k%I!36%us+1.K!!)Zk!!*#us+14M!PX-` +rr@WLrrI\br;QeKWr)er5lUcb5l[k_rrW9$rrDrr!'p,Ts1\O5!PX-`rrI\bq#:>Fq#:>oV#Pr~> +JcC<$r;Qa_NrT-3rVunM!!)or!!*#us+:CQK7j+%!/(1K!3H2"s+C:M!!)Zk!!*#us+C@O!PO-a +rr@]NrrIbcr;QeMXS`"t62plc63"%brrW9$rrDrr!($2Us1SI4!PO-arrIbcq#:>Hq#:>qV#Pr~> +JcC<$r;Qa_NW/uErVls"s+>t%rr@]Ns8R]Qs+Uec5Z_621BZKD>HIXFmALJ,~> +JcC<$r;Qa^NW/uDrVls"s+,b!rr@WLs8RWOs+*H5rr@WHrrbUes$/jJrr<&krr<&urrms=s8RY$ +rVlktrr3#5Jc,NKJZAVI!'pP`!s&A$Jc>ZO!<<(Mqu6X]mJd>Tf)Pca5kk9YJb]6GWe%#HJ,~> +JcC<$r;Qa_NW/uErVls"s+>t%rr@]Ns8R]Qs+Uec5Z_621BZKD>HIXFmALJ,~> +JcC<$r;Q`sNW0L%K)bm;^&S+b5uN@8s1SF3$A6%ls+=4%KE(t(qZ$O\!J<]:rr<&krr>@`rrYQ> +K0fG8!3H/!!58Aa"24_eXS`#&]g;Za!($X;rr2rurr3"sN +^%_O-K>%9a!58@2!)fWmJ,~> +JcC<$r;Q`sNW0L&JH,[8^An4a5ZNC8s1\L4$A#qks++1$JcGb$qZ$O[!J*N7rr<&krr>=_rrYN; +JO'/5!36"t!5AG`"2=edWr)f$^-M]`!'pR8rr2rurr3 +JcC<$r;Q`sNW0L%K)bm;^&S+b5uN@8s1SF3$A6%ls+=4%KE(t(qZ$O\!J<]:rr<&krr>@`rrYQ> +K0fG8!3H/!!58Aa"24_eXS`#&]g;Za!($X;rr2rurr3"sN +^%_O-K>%9a!58@2!)fWmJ,~> +JcC<$r;Q`sJcF0u!58=1s1S=0!7h#I!kj5=rr2uKqYp]3KE(t(r;QbLrVunM!7h)K"20>>^$u%' +eUrMPs8Te1s8R`Mrrds?K7h^Ms*t~> +JcC<$r;Q`sJcF0u!5AC2s1\C1!7q)J!ks5:rr2uLqYp]4JcGb$r;QbJrVunK!7q/L"29>;^@;.( +eq&DMs8Th2s8RZKrrdm +JcC<$r;Q`sJcF0u!58=1s1S=0!7h#I!kj5=rr2uKqYp]3KE(t(r;QbLrVunM!7h)K"20>>^$u%' +eUrMPs8Te1s8R`Mrrds?K7h^Ms*t~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/poc/lpc2148_efsl/docs/pics/sdconnection.eps b/poc/lpc2148_efsl/docs/pics/sdconnection.eps new file mode 100644 index 0000000..8f95f7a --- /dev/null +++ b/poc/lpc2148_efsl/docs/pics/sdconnection.eps @@ -0,0 +1,2938 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner +%%Title: sdconnection.eps +%%CreationDate: Tue May 24 15:13:23 2005 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 408 515 +%%EndComments +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228346456694 14.173228346456694 translate +% Translate to begin of first scanline +0 499.99398930095566 translate +392.99527559055116 -499.99398930095566 scale +% Image geometry +393 500 8 +% Transformation matrix +[ 393 0 0 500 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 393 string def +/gstr 393 string def +/bstr 393 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 167760 ASCII Bytes +colorimage +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +N;inWJcC<$mf.e~> +N;inWJcC<$mf.e~> +N;inWJcC<$mf.e~> +QN-s`#6"T$s8N&trqultrdk*#s762?~> +QN-s`#6"T$s8N&trqultrdk*#s762?~> +QN-s`#6"T$s8N&trqultrdk*#s762?~> +R/[Nms8N#ts8N&ts8Mus"9&9!rdk*#s7H>A~> +R/[Nms8N#ts8N&ts8Mus"9&9!rdk*#s7H>A~> +R/[Nms8N#ts8N&ts8Mus"9&9!rdk*#s7H>A~> +RK!lus8N&ulg=`Ns8DudR*"Xnr.4m!s762?~> +RK!lus8N&ulg=`Ns8DudR*"Xnr.4m!s762?~> +RK!lus8N&ulg=`Ns8DudR*"Xnr.4m!s762?~> +R/[csrpu_-Rf33ar;P&bD1q$NrIP!"s7?8@~> +R/[csrpu_-Rf33ar;P&bD1q$NrIP!"s7?8@~> +R/[csrpu_-Rf33ar;P&bD1q$NrIP!"s7?8@~> +RK* +RK* +RK* +Rf<]nrVaTPUA"Wdrql^![r@T-rV_ +Rf<]nrVaTPUA"Wdrql^![r@T-rV_ +Rf<]nrVaTPUA"Wdrql^![r@T-rV_ +Rf<]mrq:hlmJm(`s8Dp%rVQVpET$lpJcC<$p&BO~> +Rf<]mrq:hlmJm(`s8Dp%rVQVpET$lpJcC<$p&BO~> +Rf<]mrq:hlmJm(`s8Dp%rVQVpET$lpJcC<$p&BO~> +Rf +Rf +Rf +RfEEe"o!M8s8;lmrs&B#\8UC+rIP!"s7QDB~> +RfEEe"o!M8s8;lmrs&B#\8UC+rIP!"s7QDB~> +RfEEe"o!M8s8;lmrs&B#\8UC+rIP!"s7QDB~> +RfC3jrVuos#5e>(DrCZnJcC<$p&BO~> +RfC3jrVuos#5e>(DrCZnJcC<$p&BO~> +RfC3jrVuos#5e>(DrCZnJcC<$p&BO~> +Rf +Rf +Rf +RK!Hgs2f,XlhUPbo;-Z1s8;kIs+14Cs*t~> +RK!Hgs2f,XlhUPbo;-Z1s8;kIs+14Cs*t~> +RK!Hgs2f,XlhUPbo;-Z1s8;kIs+14Cs*t~> +Rf +Rf +Rf +R/[?hrVsHSDZ,@tM1KDbS_a>Err.KKJcGECJ,~> +R/[?hrVsHSDZ,@tM1KDbS_a>Err.KKJcGECJ,~> +R/[?hrVsHSDZ,@tM1KDbS_a>Err.KKJcGECJ,~> +Qi@TqrVtuqOH#9]MR1@Vs8W%Ks+14@s*t~> +Qi@TqrVtuqOH#9]MR1@Vs8W%Ks+14@s*t~> +Qi@TqrVtuqOH#9]MR1@Vs8W%Ks+14@s*t~> +R/[9fs8W)mrr`9!s8ITLJcG?AJ,~> +R/[9fs8W)mrr`9!s8ITLJcG?AJ,~> +R/[9fs8W)mrr`9!s8ITLJcG?AJ,~> +QiI'a$N0f#rr;utrVl]mrr.KKJcG?AJ,~> +QiI'a$N0f#rr;utrVl]mrr.KKJcG?AJ,~> +QiI'a$N0f#rr;utrVl]mrr.KKJcG?AJ,~> +R/[6es8N#t!WN,urWiE!s8W&ts8ITLJcGBBJ,~> +R/[6es8N#t!WN,urWiE!s8W&ts8ITLJcGBBJ,~> +R/[6es8N#t!WN,urWiE!s8W&ts8ITLJcGBBJ,~> +RK"!#s8N&of\ul/s8Du^K +RK"!#s8N&of\ul/s8Du^K +RK"!#s8N&of\ul/s8Du^K +Rf=*$s8Dr[N,OmWrVl`od"H7^eGoIGJcC<$o`'F~> +Rf=*$s8Dr[N,OmWrVl`od"H7^eGoIGJcC<$o`'F~> +Rf=*$s8Dr[N,OmWrVl`od"H7^eGoIGJcC<$o`'F~> +RK* +RK* +RK* +Rf<]nrVWp>Z2ak'rql^!b'/a8rVc9ds8E0"r;Q`qJcC]/J,~> +Rf<]nrVWp>Z2ak'rql^!b'/a8rVc9ds8E/uqYgHnJcC]/J,~> +Rf<]nrVWp>Z2ak'rql^!b'/a8rVc9ds8E/uqYgHnJcC]/J,~> +Rf=-$s7Leqo_n[es8N&ts8MlpZYn\#r.4m!s7QDB~> +Rf=-$s7Leqo_n[es8N&ts8MlpZYn\#r.4m!s7QDB~> +Rf=-$s7Leqo_n[es8N&ts8MlpZYn\#r.4m!s7QDB~> +RfEEe#5 +RfEEe#5 +RfEEe#5 +Rf +Rf +Rf +Rf!E8U]noD]-rrVsrdJV<"^rIP!.s*t~> +Rf!E8U]noD]-rr;Vi`#nt5Vqgnd,s*t~> +Rf!E8U]noD]-rr;Vi`#nt5Vqgnd,s*t~> +Rf +Rf +Rf +RK!Hgs3l(WgA1aQk)skos8;lhs8W',r;W:3J:E,m^&S!0rdk*2s*t~> +RK!Hgs3l(WgA1aQk)skos8;lhs8W'"qYrVU!!WH(HN3g@rdk*2s*t~> +RK!Hgs3l(WgA1aQk)skos8;lhs8W'"qYrVU!!WH(HN3g@rdk*2s*t~> +Rf3~> +Rf3~> +Rf3~> +RK*L;Ds,d82~> +RK* +RK* +Rf=*$s8Mups7P$BUnsr]b22Ias8N&tpAb0l&GuF#FG0)!C?F,oFM\"Trr.KKP5g%~> +Rf=*$s8Mups7P$BUnsr]b22Ias8N&tpAb0l&Gc2k!"[t@!6q\I!/1CKrr.KKP5g%~> +Rf=*$s8Mups7P$BUnsr]b22Ias8N&tpAb0l&Gc2k!"[t@!6q\I!/1CKrr.KKP5g%~> +QN%!bqtL*mrVlirpAYd)s8;o;G'_")\Sg1%UO%=Ms87HJOoKq~> +QN%!bqtL*mrVlirpAYj+s7u\U!!.]OFTAuP7fib:s8)cpJcCr6J,~> +QN%!bqtL*mrVlirpAYj+s7u\U!!.]OFTAuP7fib:s8)cpJcCr6J,~> +Rf +Rf+Y!':/YHN:YTl3m\HpAFl?s-!D4~> +Rf+Y!':/YHN:YTl3m\HpAFl?s-!D4~> +Rf +RftuJcGWHrdk*6s*t~> +RftuJcGWHrdk*6s*t~> +Rf^Kor;Q]grttb8r;Xr^HH-!]s1E7+s8;kqG^S`SrVukJs- +Rf^Kor;Q]grttb8qYuo_!0.$Ps*=[Ys7uUk!!(IGr;ZbIs- +Rf^Kor;Q]grttb8qYuo_!0.$Ps*=[Ys7uUk!!(IGr;ZbIs- +R/[Kls6e3sFE!5Bl2L__rVuljrtbS4m=9PQs8Dlq]l)^,r;Q5@HB\C-rdk*6s*t~> +R/[Kls6e3sFE!5Bl2L__rVullrttb8r;PIX"$$>Xq>YdA]`7g,jUqYEs82bGs-3P6~> +R/[Kls6e3sFE!5Bl2L__rVullrttb8r;PIX"$$>Xq>YdA]`7g,jUqYEs82bGs-3P6~> +Qi@Hls8W#ZY^^V;RE+^orrE#lrttb6rLeFcn,<4_s1N=,s8Dlqdrp)Ns8;kIs- +Qi@Hls8W#ZY^^V;RE+^orrE#lrttb4q`k,_i;ENLs*FaZs82ZmVuQgCs82eHs- +Qi@Hls8W#ZY^^V;RE+^orrE#lrttb4q`k,_i;ENLs*FaZs82ZmVuQgCs82eHs- +R/d0b!<)os$hV]@GAD`6eb/tBrql^6rr;rsbBJ-Ps8;ops1N=,s8;lorMt$jjo540s- +R/d0b!<)os$hV]@GAD`6eb/tBrql`qrYbV5QN.#Ms82ils*FaZs8)`kr)j")c2[_@JcD&9J,~> +R/d0b!<)os$hV]@GAD`6eb/tBrql`qrYbV5QN.#Ms82ils*FaZs8)`kr)j")c2[_@JcD&9J,~> +QN-s`s8Drs$0&dXCNbEJs8DrqruM+=rVc59Gb=p4rr;or]l)^,rVuiqmYZ1RrVZZoJcD):J,~> +QN-s`s8Drs$0&dXCNbEJs8DrqruM+=r;>RY!'pAXrVu`oHN:bZqu?TnhAcMJqtg9jJcD):J,~> +QN-s`s8Drs$0&dXCNbEJs8DrqruM+=r;>RY!'pAXrVu`oHN:bZqu?TnhAcMJqtg9jJcD):J,~> +PlL^]s8;os#QESOFHlh'rVZ[9rr)keH@Y>\rVulps1N=,s8Drsr;Y)fH+X+Ss8ITLR/_[~> +PlL^]s8;os#QESOFHlh'rVZ[9rqudW!t*][r;Zcms*FaZs82fqqZ!,e!-\D=s8ITLR/_[~> +PlL^]s8;os#QESOFHlh'rVZ[9rqudW!t*][r;Zcms*FaZs82fqqZ!,e!-\D=s8ITLR/_[~> +PQ1[^!<)os#kQQHM/Ssbr;QZp*WH!:a*VsOs8;lqs8;o1DVkEls8N#ps/C*liW&k-s-Nb9~> +PQ1[^!<)os#kQQHM/Ssbr;QZp*WGs9NrT0Fs8)`os8)bB!58F0s8N#ns&&h)_uKUbs-Nb9~> +PQ1[^!<)os#kQQHM/Ssbr;QZp*WGs9NrT0Fs8)`os8)bB!58F0s8N#ns&&h)_uKUbs-Nb9~> +QiI'as8Dut$iAq\KPkt#^[_@'rr)j&rVl5=GG>!5rr2p%r;XHJhZ*QRrs8T&mYl=ZqYgDEs-Wh:~> +QiI'as8Dut$iAq\KPkt#^[_@'rr)j&r;PL`"%W.`rr2p%qYtmB^&S!/s8W!$h\lMTpAFo@s-Wh:~> +QiI'as8Dut$iAq\KPkt#^[_@'rr)j&r;PL`"%W.`rr2p%qYtmB^&S!/s8W!$h\lMTpAFo@s-Wh:~> +R/[6erVc`q#P#utF`E8ImJ$VcrVkVnGN]#(rVm*"s1N=,s8Dor#Q4VBCkVN]rdk*:s*t~> +R/[6erVc`q#P#utF`E8ImJ$Vcqu45.!71]BrVmN,s*FaZs82irrr;ipO8oUSrr%EJR/_[~> +R/[6erVc`q#P#utF`E8ImJ$Vcqu45.!71]BrVmN,s*FaZs82irrr;ipO8oUSrr%EJR/_[~> +Q2_EncDH&/Ha)-"s8W)rrr;usrVuos"97''s8N#srs&E$]l)^,rVlirrWN#?jo>:1s-Nb9~> +Q2_EncDH&/Ha)-"s8W)rrr;usrVuos#62$-s8N&trr33!s*FaZs82fqs8E3#ntXG/rIP!8s*t~> +Q2_EncDH&/Ha)-"s8W)rrr;usrVuos#62$-s8N&trr33!s*FaZs82fqs8E3#ntXG/rIP!8s*t~> +Rf<`os81W[Nc/oub3Ap*!<)lqp&>$kqu6lts1E1(s87HJN;nD~> +Rf<`os81W[Nc/oub3Ap*!<)lqp&>$jqu6lss*FaZs8.BIN;nD~> +Rf<`os81W[Nc/oub3Ap*!<)lqp&>$jqu6lss*FaZs8.BIN;nD~> +Rf +Rf +Rf +RfUBorVlf[rs&B#YWU_@r.4m,s*t~> +RfUBorVlf[rs& +RfUBorVlf[rs&?"HN:bZqgnd+s*t~> +RfYdA^An(]s,?u.~> +Rf +Rf +Qi@*cr;Q]Urs&?"H3(\YqLS[*s*t~> +Qi@*cr;Q]Urs&B#[S,NXrIP!-s*t~> +Qi@*cr;Q]Urs&?"HN:bZqgnd+s*t~> +R/d3chu +R/d3chu +R/d3chu +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5eG5Cu53jJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5nM7DVkElJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5nM7DVkElJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5nM7DVkElJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5nM7DVkElJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5nM7DVkElJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5nM7DVkElJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5nM7DVkElJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5nM7DVkElJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5nM7DVkElJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5nM7DVkElJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5nM7DVkElJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\=F!5/@/g]% +JcGBB#5nJ5DVb?kg&M'NnG`Ogs8Dots8MTh!WN,trpTmcrW3&uJcG]KJ,~> +JcGBB#5\=F!5/@/g]% +JcGKEs8E?)q"oC<]_hR)rnmbTrW)iprr`/ts8M`lrr*3%qu?]pr;ZcqpAb-k#Q+N#s82fqrq?Bl +rX&W'qu?]qqu?ZpJcGcMJ,~> +JcGKEs8E?)qu+3Gh>R9Nrnm_Xrr;urrr3)urr;uks8W')s8Muss8Musrr2Wkrr*0$rr<#srr;uk +s8W')s8Muss8Musrr.KKs8RT~> +JcGKEs8E?)q"oC<]_hR)rnmbTrW)iprr`/ts8M`lrr*3%qu?]pr;ZcqpAb-k#Q+N#s82fqrq?Bl +rX&W'qu?]qqu?ZpJcGcMJ,~> +JcGKE$3'u&rVq0D_#O2drs\o,rVuosq>C9krr;ujrsAW's7uKjs8;orp\t[$s8N#ts7uNks8N&t +p\tR!s8;osqYC0kr.4nHs*t~> +JcGECs8<-$]PZU,qqh>Srr;usrs&B"s8N#trq69rrVuopqu?]pp&>I"s8N#ts82`os8N&tp&>9q +s8W#os8W%Ks8DtJ~> +JcGKE$3'u&rVq0D_#O2drs\o,rVuosq>C9krr;ujrsAW's7uKjs8;orp\t[$s8N#ts7uNks8N&t +p\tR!s8;osqYC0kr.4nHs*t~> +JcGNF%K?D+s7;-_!\^MPqu6TSrs\o,rr;ee/fH('s8Drks8W'+r;YSf(`H/js82iqq>Us(s8N#r +Z9K6IIJa'Cs8Mcm$iU+mJK5XkZ2ab$rdk(Ls*t~> +JcGNF%0$;+s7sThHBZkYrVkdU%0$;+s8:0,LlfdZrr2Wks8EB*m^%e-U?)@Qs8Mio!WN,urX%2G +LlB"Fs8N&tq>Um&s8N&m^Q"&;g&M$MJcGcMJ,~> +JcGNF%K?D+s7;-_!\^MPqu6TSrs\o,rr;ee/fH('s8Drks8W'+r;YSf(`H/js82iqq>Us(s8N#r +Z9K6IIJa'Cs8Mcm$iU+mJK5XkZ2ab$rdk(Ls*t~> +JcGKE"8r2D*rH!>Q2ga>rWE)sj=gE2!c\/9pAP0ks.K\r!!<\Ms82Qi"9&/m:&Ftn:AOhdp\k9l +s2,ZN!!8trqsXNHs*t~> +JcGKE$iU+fM0=;uHZmR3rS[\Tr<`%[G'eXbEju)IpAPHus3Z:>I=??jirAuNrX/W$Uiq$3I;u+] +rV$3urVtl3G'n^`GgcWjn,AILJ,~> +JcGKE"8r2D*rH!>Q2ga>rWE)sj=gE2!c\/9pAP0ks.K\r!!<\Ms82Qi"9&/m:&Ftn:AOhdp\k9l +s2,ZN!!8trqsXNHs*t~> +JcGNF%K?7r2#mg\!!39'Zi9g[rWN)q?N:9/!<`T,M?!GIrXJc(\c;^5!or:0agr;ZfrPlH7~> +JcGNF%K?>%R<=.4It<,mg&Cp.rXA`'YB#8HJ:W>n`;fc1rXJf)gj":"J:N5uKCJm=q#1^#s/gQ@q#1a$rpG>aJq/B&I=q4lrUKjhrVuosPlH7~> +JcGNF%K?7r2#mg\!!39'Zi9g[rWN)q?N:9/!<`T,M?!GIrXJc(\c;^5!or:0agr;ZfrPlH7~> +JcGNF"T8;V!!3#u!WiBZhZ!]Q%fue2!!<6''CPVp"TA@g!!W<$"9SXCs8Mcm!mh&Pqu?d#"k35G +"TJF +JcGNF$iU+nI"?ctJ:E,qRGRrNqhKWMJ:N-"I>IUkrser,b]SMeJ:N-#G.@SOp\tB[I"6`srI=or +kkG)brr9ELJq&<$It;j=mJd1cPQ-.~> +JcGNF"T8;V!!3#u!WiBZhZ!]Q%fue2!!<6''CPVp"TA@g!!W<$"9SXCs8Mcm!mh&Pqu?d#"k35G +"TJF +JcGNF"T/1j!"Si$!)BU$r*s*K*(&@n4!='\fq&]YZ*tn>K!Ylduq&]\[*s)K>!!!)j +*sEi7L&_)MPlH7~> +JcGNF"8r/EHMi!"J:ERONrb,fqg\]sKCt9-M1'o(rdY*#J: +JcGNF"T/1j!"Si$!)BU$r*s*K*(&@n4!='\fq&]YZ*tn>K!Ylduq&]\[*s)K>!!!)j +*sEi7L&_)MPlH7~> +JcGNF"T&.`!!;ush@BSrp](:'oa_$+p]0st!>5J0!!!8r&,H8,! +JcGNF"oSDCG_(ADJ-(4NJ),k]It3%JJ-1:OItmWO!J5guJH(,lLBEBaIt.HJ"+PiMKCjp#It3%J +J-(4NIdr0sLiej\rr&)]J,~> +JcGNF"T&.`!!;ush@BSrp](:'oa_$+p]0st!>5J0!!!8r&,H8,! +JcGNF"oSA`!WW9#!!NH*/c5D@j88lQ"7mN7!r`0'!1 +JcGNF%fQCuIslltJ:E,rQMpaZj8K#U!r7k(rdY3&JUW@Er;?Bh%Jp%QGCk +JcGNF"oSA`!WW9#!!NH*/c5D@j88lQ"7mN7!r`0'!1 +JcGKEs835/!rrB&!rr>$s8:jU%/p4H!!!'#!<<,)s8;Wk$iL$4!!<3$!rsS@rqHF$rVsY5! +JcGKEs8<;VH[UHpJph^is8CpV%0$:eG^k9oJUVXls8D]l$iU+0Ee8glJom+PrqHF$rr:l"IY!!" +HZda9rV-=#rVrs?JUi6$FHQ4prq69rrr;bDR/d0bPlH7~> +JcGKEs835/!rrB&!rr>$s8:jU%/p4H!!!'#!<<,)s8;Wk$iL$4!!<3$!rsS@rqHF$rVsY5! +JcGNFs8EB&s0;t3!<=+%s8:dR!rN"?r;Zs4H2IO +JcGNFs8EB(s4MmKJTcjjrr(aR$N0q8H$k0hKY79^pAY*j$1X.(IXl^.h#@9GrX&Q'c$XkgG`]H8 +p&>!i$2L9?I=QX?oDed]rWiE$pOAV2rr//^J,~> +JcGNFs8EB&s0;t3!<=+%s8:dR!rN"?r;Zs4H2IO +JcGEC#lO_\4TJF9s8:aRs8E<(hI-CZkl:Y]p\t^%s8Dug`>JZKrVuirrqHF!rr)lUKE*Uhs8)Bf +$i^2%e1q#Rs8W&trq69rrVuBf1B7:OPlH7~> +JcGHD$3'o'n==d#mJm.As8W'(s6d+4V=X`drq6:!rr;fPMgE\Js8N&tp](9m#QO;0Fd2S!r:L!s +rr;oZR<64Drr2rsp&>9rs7h,4s8N"^s*t~> +JcGEC#lO_\4TJF9s8:aRs8E<(hI-CZkl:Y]p\t^%s8Dug`>JZKrVuirrqHF!rr)lUKE*Uhs8)Bf +$i^2%e1q#Rs8W&trq69rrVuBf1B7:OPlH7~> +JcGBB#l"@P!6kK;s8LsV%0$;+q>[c$RK)sZs8Mcm$i^2(rr5(\q>^]7NB`IeursSi+ +rqcY4!8.5Gs8MZj#Q=\m!&FTPrfmG5~> +JcGBB#5\A9D!(cph#@`\r;YGbc2[V=s8Mcm$i^2)rr8R +JcGBB#l"@P!6kK;s8LsV%0$;+q>[c$RK)sZs8Mcm$i^2(rr5(\q>^]7NB`IeursSi+ +rqcY4!8.5Gs8MZj#Q=\m!&FTPrfmG5~> +JcGHDs8E9"rHJ=QrVQTNs8W'(qYd8kNW&_Qrq69trr)`l2?<%Ar;QBh$3'u%rQYCMrVHNcs8W'' +q>=e(ao;2:oD]'os7$(Es8;k\s*t~> +JcGHDs8E9$rk!('rr)iQs8W'(r;P,\`r>o8rq69trr)cnRsal-rVlKi$3'u&roS7)rqucfs8W'' +qu*g?j8T#VoD]'ps7h,4s8N"^s*t~> +JcGHDs8E9"rHJ=QrVQTNs8W'(qYd8kNW&_Qrq69trr)`l2?<%Ar;QBh$3'u%rQYCMrVHNcs8W'' +q>=e(ao;2:oD]'os7$(Es8;k\s*t~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3k`'s8;Hf#QFZ$RsXl/rpp'nrVu)#YQ+Ojrs&E$Z>\k)rUTsnrr;bB +R/d-aPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3l#0s82Be#QF]%Sq6S7rpp'nrVu&)Z2aalrs&E$[!(O1rUTsnrr;_G +S,`KePlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/5s[s8) +JcGBB#5nM7DVkElg]%KUs3slbs8;Hf#QFZ$OD+Iirpp'nrVu1cWW2kcrs&B#X]O]crUU!grWW.6 +N;rkUPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KSs/?!Zs8) +JcGBB#5nM7DVkElg]%KTs0)Kjs8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KUs33=3s82Be#QFZ$HV=/6rUTsmr;YtBRK*0Srs&B#SiPp4r:9jmrVlXg +FoVC=PlH7~> +JcGBB#5nM7DVkElg]%KSs/,mXs7u6c#QFZ$2?<+Dr:9jlqu=tB?iTrlrs& +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs4)56s8;Hf#QF]%TnN+=rpp'nrVu)-ZiBsnrs&E$[X%!7rUTsnrr;_J +T)\fhPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KUs3k`'s82Be#QFZ$RX=c.rUTsmr;Yr!YQ+Lirs&B#Z>\h(r:9jmrVlS@ +QiI$`PlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cli..fs8N#trilEQ~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cqu6m"s8Murs8Mio"oeQ#s8W)%s*t~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cp\t?orr;uqrs8W(s8Dulrr;u%s*t~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cqu?]q#4p(=rVlirrr3<(s8MrriM$5LrNQ +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cqu6p"s7UZTs8;lqrsJc*rVuo1Fd)k(rilEQ~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%QXs3kf(r;-Bko`#9trVi:7o_n^es8M]k#lXedEj,E;rVlEg#Q4S,ET@#p +rU^$lrVuVAR/[!brr;usrs8W&qk.cGs8;lqrsAZ(m]CJbiVrfTYlB4~> +JcGBB#5nM7DVkElg]%QVs/,jVqY0peo`#9sr;JVTl21>Us8M]k$N'kL!+5Trr;Q`qpAYL!qYk%+ +aSYf2rr2Tj$N0qm!&=?Fqu-Qorr39'rVN7(a8c):rr3<'s6d"/LuJ@3rilEQ~> +JcGBB#5\@H!58F0g]%QVs/,jVqY0peo`#9sr;JVTl21>Us8M]k$N'kL!+5Trr;Q`qpAYL!qYk%+ +aSYf2rr2Tj$N0qm!&=?Fqu-Qorr39'rVN7(a8c):rr3<'s6d"/LuJ@3rilEQ~> +JcGBB#5\@H!58F0g]%ESs4M24rr2utrr)lrq>UWtr;W@9rr2rsrVlflrri<#m;]K2s8MurrqZQs +qu=-Em/I%arVlflrri?$r.1=8s8MusrY,>2rV<%$a8c&9rqufYNFo6es8K2$J,~> +JcGBB#5nM7DVkElg]%EQs0D]orr30#r;6EkrqZQtrql^X!<)oss82urrVlflrri9"g&PdarrW,q +r;Q]krri/tDZJMjs8W!!qu-Nnq>UTrs7lXPrVm`4qtpBls8MumSnuIIqu6Tms5o;QX82epY5a"~> +JcGBB#5\@H!58F0g]%EQs0D]orr30#r;6EkrqZQtrql^X!<)oss82urrVlflrri9"g&PdarrW,q +r;Q]krri/tDZJMjs8W!!qu-Nnq>UTrs7lXPrVm`4qtpBls8MumSnuIIqu6Tms5o;QX82epY5a"~> +JcGBB#5\@H!58F0h#@ZZrVrj?S#OltrVuos!WW/rrs8T&l%=Pa[GgTQs8W'!s8Moq#lO_9Fd/fH +iqr`Ts8E'!rql`qrW`(XH_R\!l2CY^rW3&uqu6s"s3c+MW57EcrVmQ0s8W&sqOVNDs82ir`H$CM +rVuhus*t~> +JcGBB#5nM7DVkElh#@ZZr;TXp2HZs#rVm!!rVulors8Q%e.2[\CWPE3rr`6!s8Moq#l=RJ!%;!9 +aSGi8"9/9!rql`qr +JcGBB#5\@H!58F0h#@ZZr;TXp2HZs#rVm!!rVulors8Q%e.2[\CWPE3rr`6!s8Moq#l=RJ!%;!9 +aSGi8"9/9!rql`qr +JcGBB#5\@H!58F0h#@f^rViX:F)Q;KRA\Trp\td&roelXDKBuVR_@8Ds8W)prsnu+\TW.5GBT7E +d,+g&rqcZprXJOZG].SGJ= +JcGBB#5nM7DVkElh#@KUr;K@e!!>,TYfc_?"8r/H$N0r0%R,6Eli7"aqYpWnrcJ&<"tW';^An64 +qZ$To!UUg(!!`NfBX-Cns8Mlp!rDqiqu@WX5*iSRs8N#trVl\cCrZMJUNDUOs8Drsrr0,$J,~> +JcGBB#5\@H!58F0h#@KUr;K@e!!>,TYfc_?"8r/H$N0r0%R,6Eli7"aqYpWnrcJ&<"tW';^An64 +qZ$To!UUg(!!`NfBX-Cns8Mlp!rDqiqu@WX5*iSRs8N#trVl\cCrZMJUNDUOs8Drsrr0,$J,~> +JcGBB#5\@H!58F0g]. +JcGBB#5nM7DVkElg].aB0s8W'&s5Kbb2A-,k!!F9Ao)8Rbs8W'%rR5t# +'GC?E""^/Fqtg +JcGBB#5\@H!58F0g].aB0s8W'&s5Kbb2A-,k!!F9Ao)8Rbs8W'%rR5t# +'GC?E""^/Fqtg +JcGBB#5\@H!58F0hu +JcGBB#5nM7DVkElhuE]Ts82lorVluJUEorWE,squ-No"QHm.#6k),"Q]R\s8W)t +s82lorVluKFTi'M!!6!sq>UEnrr2iprrh`/.L$1X!!9t8qu6WqrW<&rqu-O3fp)dJ!WW3Fs8;lq +s8DrnSoK&(rVlcqri?'L~> +JcGBB#5\@H!58F0huE]Ts82lorVluJUEorWE,squ-No"QHm.#6k),"Q]R\s8W)t +s82lorVluKFTi'M!!6!sq>UEnrr2iprrh`/.L$1X!!9t8qu6WqrW<&rqu-O3fp)dJ!WW3Fs8;lq +s8DrnSoK&(rVlcqri?'L~> +JcGBB#5\@H!58F0iW&rWs8;rsrr3W#j0b))I!KjlP/[:srr;usrVc]p%Hu6=LP0nsH]auYrVccq +rr;rrrt=td]U=G&H$+k'\F]_!s8N#rrVca)lJ&M$Km@rfNg\JtrVc`qrVlg,pu]PfKRnAkJWR#" +rVc`pr +JcGBB#5nM7DVkEliW&rW!rVrorr3,[b\JX?I]#lXf,.7q8OrVlct +r;6EkrrhT8GrQB7!"'/aGNf#(s8N#pr;HWuf!o9.%/p50+ulb)rVlctrVQNlrsnYLMF\6Z!!!*M +A(UYWrr2j$qu$5OFNjd^r;EbtJ,~> +JcGBB#5\@H!58F0iW&rW!rVrorr3,[b\JX?I]#lXf,.7q8OrVlct +r;6EkrrhT8GrQB7!"'/aGNf#(s8N#pr;HWuf!o9.%/p50+ulb)rVlctrVQNlrsnYLMF\6Z!!!*M +A(UYWrr2j$qu$5OFNjd^r;EbtJ,~> +JcGBB#5\@H!58F0jSo>]s8DoprsRl;Vh]Y?FEWG6dI[A;s8E&trr2p1p"dEQI\lrr<#t +s8MuqrsS&EX,MCJEd*,,b3]--"9/?!rr2p+qVK>eJ9u3XGE/fWqYgEprr)fq$glcVPC%LmG^Z!s +jo58[rqZQrie2EmVuM8~> +JcGBB#5nM7DVkEljSo>]s8;iorr^trVlg"pVE(d!W +JcGBB#5\@H!58F0jSo>]s8;iorr^trVlg"pVE(d!W +JcGBB#5\@H!58F0j8TYhs8W)X^6j:lDg6Yp[bpQQrrW2urr)j@q:)F'G'7ePJtpTLr;Zfrrr)lr +s8W)_`ghU(EHQYiYMJLCrrW2urr)j*rReE +JcGBB#5nM7DVkElj8T>_s8W);KfJu1"#4]5i;W`Xrql]nrr_nm@$Ns=ra8>o:rr)cprr2p" +eStQrr3*!qu?Zprr_;V64Wqo!u"bBbl7VIrqu`o +rqtI#rmqV0gTc-R^t7,ge_gE+rilEQ~> +JcGBB#5\@H!58F0j8T>_s8W);KfJu1"#4]5i;W`Xrql]nrr_nm@$Ns=ra8>o:rr)cprr2p" +eStQrr3*!qu?Zprr_;V64Wqo!u"bBbl7VIrqu`o +rqtI#rmqV0gTc-R^t7,ge_gE+rilEQ~> +JcGBB#5\@H!58F0jo5hirVbrZNIZ1nItFK +JcGBB#5nM7DVkEljo5M`rVY)K-2dfH$W32CpAY'nr;6Hlrr;ouV_K4k!!ENED8G$+rrN#prr2rr +"6=AG$2so-$:'6smf*4fr;6HlrWN2t\3VD>!!EE7A?X_crrN&prVcrunq85"rW!'-/p,V*rr3?' +qu$Hms8DujF)(\j%;fm$G'7b>Ci3gAs8Do#s*t~> +JcGBB#5\@H!58F0jo5M`rVY)K-2dfH$W32CpAY'nr;6Hlrr;ouV_K4k!!ENED8G$+rrN#prr2rr +"6=AG$2so-$:'6smf*4fr;6HlrWN2t\3VD>!!EE7A?X_crrN&prVcrunq85"rW!'-/p,V*rr3?' +qu$Hms8DujF)(\j%;fm$G'7b>Ci3gAs8Do#s*t~> +JcGBB#5\@H!58F0jo5\erVqmrIt<3Mh#76P!ri/srr2os$2jeYCj^_^OLOr^rrr?!rVlirrr3<& +s.sI[J:F9=r;HWsr;HTnrr<#urWr":GCG(!ZL.Yjs8Mrurr;usrsAT&]kDnGJ!n4QrVm'!rVc`q +rr2p#rr;l9_u.FS_ns:i`!+,sd/X+EYlB4~> +JcGBB#5nM7DVkEljo5\erVmo=!!3@2\c)O-"oeDsrVlfqrrW&r]`%m5"sIpRrVlrqqu$Hmrr3<$ +s%<=l!*hs8Vrur;HWorr3&qs*O_F!sUiBrr)j#qY^9j +s8N#t"TJGua2@hn!lMmlrknuZ_U/>^rilEQ~> +JcGBB#5\@H!58F0jo5\erVmo=!!3@2\c)O-"oeDsrVlfqrrW&r]`%m5"sIpRrVlrqqu$Hmrr3<$ +s%<=l!*hs8Vrur;HWorr3&qs*O_F!sUiBrr)j#qY^9j +s8N#t"TJGua2@hn!lMmlrknuZ_U/>^rilEQ~> +JcGBB#5\@H!58F0jo6"nrVjTbGBn[oT"X7bs8W)srVlfqrsSf)nXt5RH%_3Yd-Uc3!WN&srr2p* +rVk3$GBnUlRC;)Mrr<#srr2rt$i^,"XF5>=Jr?MIkl1S_rr)iqrr3B)ro&r`H$b:1ZJ5!Ms8W&s +rg3Y8~> +JcGBB#5nM7DVkEljo5J_r;D3\rW! +JcGBB#5\@H!58F0jo5J_r;D3\rW! +JcGBB#5\@H!58F0jT#8Z$ifY?TnIW/F*sChiVifVrVuj,s8N&uhR\tuG&DJXV9n`1rt>8.rr2rs +s7Y!?M0F#\HBbemrVlg0rqucps8N&ujhmO8GA_PSTZQHss8W&trXSu-s8:QPNd#VaG`JlZq>UBp +rqu`o"onT"r;6Efrr`8squ-NnYlB4~> +JcGBB#5nM7DVkEljSoG`rVtcN6jW_k!^(nLrVm6'qu6Tprr<#5G;T6u!t@r'ir/laqY^?ls8Dub +YtYr2!!=lg]D_a/$N9i"rr;uts3$?br;Zp%8X\*,rsJZ$rr2rss7j!,,5hKD+^)DKrr3'!qYgEm +"onT"r;6Efrr`8squ-NnYlB4~> +JcGBB#5\@H!58F0jSoG`rVtcN6jW_k!^(nLrVm6'qu6Tprr<#5G;T6u!t@r'ir/laqY^?ls8Dub +YtYr2!!=lg]D_a/$N9i"rr;uts3$?br;Zp%8X\*,rsJZ$rr2rss7j!,,5hKD+^)DKrr3'!qYgEm +"onT"r;6Efrr`8squ-NnYlB4~> +JcGBB#5\@H!58F0jo5G^s8W&srsS5QZBBQRFFBOlir&fU'E.q1rr2rtroDG(KQhBXLni;grr2p" +rVliqrr3AsijtM*EccVk\(gfZrri<"s8MurrsS#BXGV:AFG$.+mJ[%a"9&6!rr2p*p>Wu]J95gU +Nj%"0rr3B*rVulsrr2rtl-RrYdfe(ks8W)#s*t~> +JcGBB#5nM7DVkEljo5G^s8W#rrr_#rAgdNW"#bqSqu6U'qu-QnrVuosbbA/FrW!':8>GJKrr3)t +rr;oqrrhH,FZ0@#!!=lr\,61)"T85urqucq"4+>['E.t7#s4[4r;Q]uqu6Worr3,ib_JXkrW!$I +@&s)%rsSi(s8N&trr<#_d+&$C"OZoBs8K/#J,~> +JcGBB#5\@H!58F0jo5G^s8W#rrr_#rAgdNW"#bqSqu6U'qu-QnrVuosbbA/FrW!':8>GJKrr3)t +rr;oqrrhH,FZ0@#!!=lr\,61)"T85urqucq"4+>['E.t7#s4[4r;Q]uqu6Worr3,ib_JXkrW!$I +@&s)%rsSi(s8N&trr<#_d+&$C"OZoBs8K/#J,~> +JcGBB#5\@H!58F0j8],Xs8Drs'):@nO*kneJ;^JTp&G'ks8MuqrVm8obGU&:Ec[,$^#]+irrW2u +rVlg1rT:_WIrKFUMkeDcs8W)urr)fprr3W%e#nOPEcQnp[G1NWs8N&trVc]p($r`,JT>gUN17cQ +s8W)urr)lEQ$I-AC]oU+j8](\s*t~> +JcGBB#5nM7DVkElj8]/Y!r`#nrr3)l`-!1$!"8lM>bUQbs8N&tr;6Kmrr_2G +JcGBB#5\@H!58F0j8]/Y!r`#nrr3)l`-!1$!"8lM>bUQbs8N&tr;6Kmrr_2G +JcGBB#5\@H!58F0i;WrZs8Muqrr3Q*g:!&lH?a^hZLe(ps8N&trr)ir'(X,=LO+;iIZVkQrVlir +s8Muqrr3E)ik:P-H$OUdVWn*Yrr3*"rVcZnrtG(OX,;:OFaT+cqu-Norr;urrVlfr*pUV1KQqfd +JXkTqrVZ]4E-A8&a2l?BaLZq?Ja*14YQ'+~> +JcGBB#5nM7DVkEli;WrZs8Dlmrr3)l[WWkn!"09Nkl(J[rr;uqqtpBm"6kt@)#aLC""Tu>r;Q`q +s8Dlmrr3,saFklErW!<9oikD$QP*!rVlirs8DlmrVlg!fo%TqrW!!- +7)&Zu&c]^eG,iX(aN2EC\q+aMl2LXbs*t~> +JcGBB#5\@H!58F0i;WrZs8Dlmrr3)l[WWkn!"09Nkl(J[rr;uqqtpBm"6kt@)#aLC""Tu>r;Q`q +s8Dlmrr3,saFklErW!<9oikD$QP*!rVlirs8DlmrVlg!fo%TqrW!!- +7)&Zu&c]^eG,iX(aN2EC\q+aMl2LXbs*t~> +JcGBB#5\@H!58F0h>dNS!r`#nrVm/CRX]s?A\A'?r;Zfr!rVrorr3;o[>BKdG]`HSrVccqrW2ro +rVm/NU4@lHBr(e+r;Zfr!r`#orr3<$\r_GoHthF9r;HZprW<#prr2p,hl;<]JSpJIr;OlYPN;Q> +#4AO1X8i.tYlB4~> +JcGBB#5nM7DVkElh>dNS!rVihrVm._4U;5m!.+\@rr;rr!rD]irr3;dF;"l[!!)'Yr;HZqrW<&o +q#13uV,7L'!!#Riq>C9mrW;ulqYpL$q/mke!rr>6rql]prVcloq#13l%DQ?W#64`Bs8)` +JcGBB#5\@H!58F0h>dNS!rVihrVm._4U;5m!.+\@rr;rr!rD]irr3;dF;"l[!!)'Yr;HZqrW<&o +q#13uV,7L'!!#Riq>C9mrW;ulqYpL$q/mke!rr>6rql]prVcloq#13l%DQ?W#64`Bs8)` +JcGBB#5\@H!58F0iW&oV!WDrprt>:aZCd#(G'eV/lMgb]s8N#rrVca(nBReuJpV]gKY70[r;H]o +r;RAe\t4t5GC"V$h>[BPs8N#rrVca(pXZ:6Kme,kJ?\bGr;H`prr)j/k/3dUJ9cEeNR.V$s0Zap +s82]k#Q+PjH^=[1rNQ +JcGBB#5nM7DVkEliW&oV!W;fmrrrA0B1 +JcGBB#5\@H!58F0iW&oV!W;fmrrrA0B1 +JcGBB#5\@H!58F0jT#5Y!WDrqrtG>%c(^GKFDZ5VWn-D6s8N&tr;HWp')LS#QA]j*E-mkZjmiBN +rr2lorVmN)dA`@ZFDc5QUs8'#s8N&tr;?Qo'Dq%5R?)K3DL.>Ji9gRErr;rprr2p6qU`$:KQD'Q +J"FR>q#C?krjm%-rVZZorr;us"o*V9s8Dr$s*t~> +JcGBB#5nM7DVkEljT#5Y!W2`mrri5_SOG+.!"'-?Y1!@Mrr;rnqu6Tupr%h?)#XF@/T9"rs8W)t +r;-Bl"7i3f0`:tY"]Lo +JcGBB#5\@H!58F0jT#5Y!W2`mrri5_SOG+.!"'-?Y1!@Mrr;rnqu6Tupr%h?)#XF@/T9"rs8W)t +r;-Bl"7i3f0`:tY"]Lo +JcGBB#5\@H!58F0jo5>[r;R3&ik1G2F)u;MQFbH7rr<#t!WW/urs\MFWeu@IEcm,:]]B"irrE#q +rs\nl_3g+'F)QGe\]OC?rrW0!rr2p+p=HU/KlM0SK;,s4q#:9qrVlirrr3Aq`Lr*8Ec?;][)280 +rs8T'qu3s?k5P8Tr +JcGBB#5nM7DVkEljo5>[r;Qooaak`QrW!'(/UaDXrr<#s!WW,trrhSY>TNtG!!Es8IEhTerrN#r +rVm$"fnM4"r;Zp@Ga%7frrW,urr2p#m]^RM$iU,/%RbcYnc&Ojqu6Wprr3)]N'\Q`!!=$RL#N"1 +#lO`"rj6S*rqlTk#Q4PuJX6?8rNQ +JcGBB#5\@H!58F0jo5>[r;Qooaak`QrW!'(/UaDXrr<#s!WW,trrhSY>TNtG!!Es8IEhTerrN#r +rVm$"fnM4"r;Zp@Ga%7frrW,urr2p#m]^RM$iU,/%RbcYnc&Ojqu6Wprr3)]N'\Q`!!=$RL#N"1 +#lO`"rj6S*rqlTk#Q4PuJX6?8rNQ +JcGBB#5\@H!58F0jSo_hrVXsFP^ICjEf$^6ir/lVrr)iq%0,n0XbCtoX^rr;ur&,uV.s7X:5MKs)[G)iuOmJ[%tr;HWps8N&ZZ_W.nEc?Pr`74V^rsJc( +rVlirrVtJk\bH+-eodVbrVj&$J,~> +JcGBB#5nM7DVkEljSoD^r;!%$.K'5L),QU=qu6U&qu$Bks8N&ZG?tXT!!=ZtRI'nP$Ms]!s8Mus +[;%`*rW!'35F&bPrr3?'qu$HnrVu;ABbgRH"!hWIhYmH]qY^ +JcGBB#5\@H!58F0jSoD^r;!%$.K'5L),QU=qu6U&qu$Bks8N&ZG?tXT!!=ZtRI'nP$Ms]!s8Mus +[;%`*rW!'35F&bPrr3?'qu$HnrVu;ABbgRH"!hWIhYmH]qY^ +JcGBB#5\@H!58F0jo5_frViO5H$k.2_qOYZrr`2trr2os$iU(eJ9Zd+nKsrrW2trVlfrrsJ]'b]\8XI$(Vek5G;\rVZWn +rr<#t&b^p!T#TgNjQ,@^eYRJ?nc&Kjs*t~> +JcGBB#5nM7DVkEljo5G^r;K1b!!EgKnrWN9"rTP-t!!E[$Tt0psrsJc%r;HWos8VrpRJd*f-ss[4rVlrrqYgEm +rr<#t&b^p!T#TgNjQ,@^eYRJ?nc&Kjs*t~> +JcGBB#5\@H!58F0jo5G^r;K1b!!EgKnrWN9"rTP-t!!E[$Tt0psrsJc%r;HWos8VrpRJd*f-ss[4rVlrrqYgEm +rr<#t&b^p!T#TgNjQ,@^eYRJ?nc&Kjs*t~> +JcGBB#5\@H!58F0jo5\erViO5H@LO9_<1as!ri,rrr2os$N9tdIs?BjMl,%trr3#tr;HWorsAW& +[rcnFJ![Y'rr3'!r;HWorr<#t#kNsuI"$jFcL:c4!WN#qrr2p0r;Oo`H%1:+YMK-Vs8Muqrr2co +"TA>YQur1D#&eRYjT#5YYQ'+~> +JcGBB#5nM7DVkEljo5G^r;K1b!!rqcQkrr2oss8;u_(B+:9%SWYUrr3&uqYgEmrr3&rrgE`c$N_eb^AIs1rVQKj +rqcWtrVkcCFS]q\Df_`8s8N#$s*t~> +JcGBB#5\@H!58F0jo5G^r;K1b!!rqcQkrr2oss8;u_(B+:9%SWYUrr3&uqYgEmrr3&rrgE`c$N_eb^AIs1rVQKj +rqcWtrVkcCFS]q\Df_`8s8N#$s*t~> +JcGBB#5\@H!58F0jSo\grVOm=KR%KVHBZ#!qu6Trr;HQm$if_,R!s*rEJ1"-nG`FhrVZWkrX.>] +LjEu[GE0&^q>UC,r;HWos8W)uotd8NG&MANRDnIjrrW2trVld*s8N&YZAsd.mV?rr!<* +s8N&ts8N&ul+44/[JmN +JcGBB#5nM7DVkEljSoD^r:m!i$N0r,.Y5G2rr3B&r;HWos8N&XFu0=#!!<`tQKJ2H!rVomrVcru +s0ZDMr;ZpHDm8m5rsS]#r;Q`rrVu5=7L8tn!sCEDf`(mQrqcQkrr*'!s2Sdnr;Zp?>GC`gs8Vrr +r;Q[&s8N&ts8V>pZaI4?Zj3nrs8W)us8K8&J,~> +JcGBB#5\@H!58F0jSoD^r:m!i$N0r,.Y5G2rr3B&r;HWos8N&XFu0=#!!<`tQKJ2H!rVomrVcru +s0ZDMr;ZpHDm8m5rsS]#r;Q`rrVu5=7L8tn!sCEDf`(mQrqcQkrr*'!s2Sdnr;Zp?>GC`gs8Vrr +r;Q[&s8N&ts8V>pZaI4?Zj3nrs8W)us8K8&J,~> +JcGBB#5\@H!58F0jo5>[r;R/sbe0*fEH-Gj]Arbes8W$/rr;uts8M2rXb_.AFG6L1nGW@frVl`p +$h_u^R=K9sH]>Ddp\t3mr;uuurr2p)m_cGkH#dnVSAFRjs8W&trso&.s7tE^Tn@B+GD`QOoD\aq +rr)irs8MuprqHEpr;HZpY5a"~> +JcGBB#5nM7DVkEljo5>[r;Ql`R=?L\!!=NrbP2#9$iBl$s8Dutr6p:')#aL;&knAIrVloqrVZZu +mAY^n#Q=]*)KWIXrr3-!qu6Wprr3)ZLM\"0!! +JcGBB#5\@H!58F0jo5>[r;Ql`R=?L\!!=NrbP2#9$iBl$s8Dutr6p:')#aL;&knAIrVloqrVZZu +mAY^n#Q=]*)KWIXrr3-!qu6Wprr3)ZLM\"0!! +JcGBB#5\@H!58F0jT#5Ys8Drs')^UuP^IRlI@%(^nGiOfs8W)rrVmN(c_u_DEd!)6[,_)as8N&t +rVZZp$i];+R"06rH]P>Llhpbarr)iqrt>1XY` +JcGBB#5nM7DVkEljT#5Y!W2forr`)3IkUa#""n/[iV`]VrVHKm"7Vp[*<#pG#ZGK^q>^Kos8Mrn +rr3-"c]9a\rW!$BAWPOBrrW/rrr2p"pSqdOrW!<16tO(#s8W)urquWkrr_/J3t2)g!tf!ke+s"S +rr)cmrVu3Hl/qU;rVlirYQ'+~> +JcGBB#5\@H!58F0jT#5Y!W2forr`)3IkUa#""n/[iV`]VrVHKm"7Vp[*<#pG#ZGK^q>^Kos8Mrn +rr3-"c]9a\rW!$BAWPOBrrW/rrr2p"pSqdOrW!<16tO(#s8W)urquWkrr_/J3t2)g!tf!ke+s"S +rr)cmrVu3Hl/qU;rVlirYQ'+~> +JcGBB#5\@H!58F0irAuV!WDrprsISlP^%7iH%r*Hs82crr;HWp'(jYLLNIKYHBYZ%rr2rtrr2lo +rVm5b_4#anE-[#-bkq;:!W;oqrs\_TXGh:AFErkHkPtMZrW<&rrr2p=lH,WJFDlDPS&"^qs8&S# +s8Murr5sJ1F``ATs8Dr"s*t~> +JcGBB#5nM7DVkElirB#W!r`#mrVlr3F>Edp":Ro,s8Doq!r_unrr3)cY"KE+!"(Aqg]%0Os8Muo +qYgEqaG<"X!!EBqSG3!\rW<&pqu6Ttos7gDr;ZsC>0d0HrVclrqYpKo!nNi.qu@KtM!Y'=qPCY# +rr)iob'nGTFG@[4rViu"J,~> +JcGBB#5\@H!58F0irB#W!r`#mrVlr3F>Edp":Ro,s8Doq!r_unrr3)cY"KE+!"(Aqg]%0Os8Muo +qYgEqaG<"X!!EBqSG3!\rW<&pqu6Ttos7gDr;ZsC>0d0HrVclrqYpKo!nNi.qu@KtM!Y'=qPCY# +rr)iob'nGTFG@[4rViu"J,~> +JcGBB#5\@H!58F0hu +JcGBB#5nM7DVkElhum`s8W&s +!rVljrr3;^KKo\C!!$I-qYpNnrr;fpr;Q]uc!24jrW!#@rqucqrr)utq>1*j*9Wed"p4i*2ZNdN +G`i%)rVWF1JZ,WBH>gLsrVj##J,~> +JcGBB#5\@H!58F0hum`s8W&s +!rVljrr3;^KKo\C!!$I-qYpNnrr;fpr;Q]uc!24jrW!#@rqucqrr)utq>1*j*9Wed"p4i*2ZNdN +G`i%)rVWF1JZ,WBH>gLsrVj##J,~> +JcGBB#5\@H!58F0i;Wu[s8MuprVlg+pXdQ`N-fenJCa_ts8W)t!WDrprt"SA_3fk$G'KDJrr2rs +s8N#rrr3H'hT;j[I!Kp__uBT6s8MuurVZWo'(sVkS;2E7G`:tfrVulsrr)fnrr3`2jiOooIsQ +JcGBB#5nM7DVkEli;Wu[s8Mrmr;Q^!n?JKT*W?$G%^#a-s8W)trVZNjrrhALJi3i4!"(IKrVccq +s8Mrnqu6TuoY6o!-iO)Q#)<-Rs8W)trVZNjrrhb`O>d^L!"'n%rVZ]ps8MrnqYpKtq9PLE0DtkZ +@/g0#JXQQ8s3bb`n,E=kmAY!Ss8Dr$s*t~> +JcGBB#5\@H!58F0i;Wu[s8Mrmr;Q^!n?JKT*W?$G%^#a-s8W)trVZNjrrhALJi3i4!"(IKrVccq +s8Mrnqu6TuoY6o!-iO)Q#)<-Rs8W)trVZNjrrhb`O>d^L!"'n%rVZ]ps8MrnqYpKtq9PLE0DtkZ +@/g0#JXQQ8s3bb`n,E=kmAY!Ss8Dr$s*t~> +JcGBB#5\@H!58F0j8],Xs8Dor&+@KFNI,M^Fc*KBnGiLfrr2lqrtG7f\Yk($E,U2j^sN&[rr;ur +rVlfr%.VTOPC7=gF,$^1k5YG[rr)ir&H:n,Y(q1=E-dSWb5;5 +JcGBB#5nM7DVkElj8]/Y!r`#nrVluYN,]a6!"'ZWLu872s8Mrnqu6TuouD;Q&,cJ8.u:)#s8N&s +qtpBlrr_>PGUNFi$5HNrcN!kBrqu]krr3-#epCa;r;[0GI$XL+rr;upqu$Hn"R<.72[KB_)@f)j +]`7p/pje_1qYm^ +JcGBB#5\@H!58F0j8]/Y!r`#nrVluYN,]a6!"'ZWLu872s8Mrnqu6TuouD;Q&,cJ8.u:)#s8N&s +qtpBlrr_>PGUNFi$5HNrcN!kBrqu]krr3-#epCa;r;[0GI$XL+rr;upqu$Hn"R<.72[KB_)@f)j +]`7p/pje_1qYm^ +JcGBB#5\@H!58F0jo5G^s8W&srs\e`Z_i:sDKLDpXjm1Grr`9#rr2os%.DKBQ@*XlFcDd)jSo/Y +!ri5urVm8e\uLI/D01,jV9nl6rr`9#rr)ir%.r,QSpk^!FGQ6nh>I9P!ri6!rVm8h_Q/WADKC#d +T$6X%s8W'4s7h,2rV6?"E9$rqs8DrjJ=$<8rilEQ~> +JcGBB#5nM7DVkEljo5G^s8W#rrri/>BM\j2!!E<[?E3_urr`6"rVc`q"5]_Z/c>YP*&WYsrVlfu +rr;oprr^Ph>7:B0"# +JcGBB#5\@H!58F0jo5G^s8W#rrri/>BM\j2!!E<[?E3_urr`6"rVc`q"5]_Z/c>YP*&WYsrVlfu +rr;oprr^Ph>7:B0"# +JcGBB#5\@H!58F0jT#8Z%0,bI[#oQPDKh&4^uYIo')hb-s8N&ui6n?QFDZ)GS#=d-rVmK-rVlir +s7P$YQ?mRgGD;d#hu3Qfrqu`orr<#[f;OOKDfL&gU;.rr;utr7]5^IWK=JJ=s.$r;Q^% +rqu`orVuYCRK!3qZZ,+,r;QZnq14n4rr0/%J,~> +JcGBB#5nM7DVkEljSoG`rVt``C+K5_!uXacb5M>Ir;-Blrr<#7WC70m!!>2UYj),d$2XPus8Du` +[sg:7!! +JcGBB#5\@H!58F0jSoG`rVt``C+K5_!uXacb5M>Ir;-Blrr<#7WC70m!!>2UYj),d$2XPus8Du` +[sg:7!! +JcGBB#5\@H!58F0jo5bgrVjWcGBnOjTruf5rr3Z2rVc`ps8W&sntCDTGCbdV\)[Gdrt>>0rVlfr +s8DrEM0F2iL7>?fli-ncrr)fprXJo,rV3IBG^+^rWNt@Urr3?)rVc`ps8W&siK=+a"GE&D_<:ds +!WN&srr +JcGBB#5nM7DVkEljo5J_r;D6]rW!'96Y37Wrr3?(r;6Kms8W&rj[f@N"To]ME6J4ZrsJ`%r;Q]q +s8;kl+8u6C&N46eg&D!QrquZmrWW?$r:4"orW!'=<+Wl:rr3?(r;6Kms8W#r_^tce":Q_kL!]eu +)?'I2rr2rtrr;_FIDa=nj`JcIrVulslZnotrilEQ~> +JcGBB#5\@H!58F0jo5J_r;D6]rW!'96Y37Wrr3?(r;6Kms8W&rj[f@N"To]ME6J4ZrsJ`%r;Q]q +s8;kl+8u6C&N46eg&D!QrquZmrWW?$r:4"orW!'=<+Wl:rr3?(r;6Kms8W#r_^tce":Q_kL!]eu +)?'I2rr2rtrr;_FIDa=nj`JcIrVulslZnotrilEQ~> +JcGBB#5\@H!58F0jo>AZ#QKg&J:iHPg]%3SrqlWmrr)j'r;PMgI"?g0\+Tb#!rVrorr2lr#lO_! +C4CkcU!EW:!W2forr)j'rVl;0GCb=%ZL%Sj!r`#orr2lr$2ab9B7GP`R`#.(s8VrtrVlfortYP5 +pPsrJBmu"jIF\>ppuS,ad/X(DYlB4~> +JcGBB#5nM7DVkEljo>AZ#QGeE!!W[8\c2U1rqQ +JcGBB#5\@H!58F0jo>AZ#QGeE!!W[8\c2U1rqQ +JcGBB#5\@H!58F0jo5ehrVboYM0F5eI>tVkq>UEorVlcrs8N!(d?T9+G]nV/_X%4$rr)iq%KHG, +n?e."G]\:gYLiFGs8MusrXJo,rVbH?KQVQ_I[@\1rr3'!rVc`p%KHG,pqVr +JcGBB#5nM7DVkEljo5M`rVY#H*;oj>*,`^drr3B(qu-Nns8MuqV(`,Q!! +JcGBB#5\@H!58F0jo5M`rVY#H*;oj>*,`^drr3B(qu-Nns8MuqV(`,Q!! +JcGBB#5\@H!58F0j8TVgs8VfAVjMjRE-mbRi;ETS"TJB!s8N#t$Ko?rO*5McJYC*IrVuor&H;_/ +s8VuJYEsf_Dg@;Dg@kOG"9/8urr)j(m`_8eGB7hSS%[n]s8W$/rr;uts8LiaQ\T^%G_`9InG`Fh +rr)fprqcX%im-`ds0n'"s8N##s*t~> +JcGBB#5nM7DVkElj8T>_s8VVg:cA7P""@j%qYpKrrVQQkrr^W13$8,"!s2/Ye,B:Sr;6Knrr<#p +Y[TTprW!$=>.a8&rr`8trVlcq"5fb7.fKDM!C)"TrVm9'qu6Wps8W&1FuU$3!!<^6XQ'6Z!ri)p +rr2co$KB@orr9Hg\c;[.Y5a"~> +JcGBB#5\@H!58F0j8T>_s8VVg:cA7P""@j%qYpKrrVQQkrr^W13$8,"!s2/Ye,B:Sr;6Knrr<#p +Y[TTprW!$=>.a8&rr`8trVlcq"5fb7.fKDM!C)"TrVm9'qu6Wps8W&1FuU$3!!<^6XQ'6Z!ri)p +rr2co$KB@orr9Hg\c;[.Y5a"~> +JcGBB#5\@H!58F0jSo>]s8MuqrsIbuR=0-tHBYeemf*4hrr;urrr2p1p=QC'G]._VT$5pes8W)t +s8MuqrsIr-T7D'(GE/fTkPkJarr;urrr2p*qq\K=H>n"UR`!bOrr3*"s8MuqrsJ/ +JcGBB#5nM7DVkEljSo>]s8DlorrU/c4T,6^05[uOrr3-"s8Moprr3)f[oF=F!"/orR^W1ps8N#t +rVZWo!mclsr;ZpE>HuTTrri<#rqu`orr`)3@OM*S"$MIFo)AXkrVulorVluSU/2-p!! +!r`0!rr)rsr;?Tprr2rtrW3&uYQ'+~> +JcGBB#5\@H!58F0jSo>]s8DlorrU/c4T,6^05[uOrr3-"s8Moprr3)f[oF=F!"/orR^W1ps8N#t +rVZWo!mclsr;ZpE>HuTTrri<#rqu`orr`)3@OM*S"$MIFo)AXkrVulorVluSU/2-p!! +!r`0!rr)rsr;?Tprr2rtrW3&uYQ'+~> +JcGBB#5\@H!58F0j8])Ws8;rsrr3Vo\sRnbEcZr.b4Yf6s8N#rrVlfr'D'eXM0NoZH&f;bs8W)u +rr2lprr2p,l+rsAEcH,ORE"Xorr;uss8Drs'DUChO*Y\bG)EBKrr;utrr2lprr2p0m)l/WF`;AM +PecA[rVlisrr;us$N9o$s8W)srVlirY5a"~> +JcGBB#5nM7DVkElj8])W!rMoorr3)LF>O'u!"0?)R-FYLs8N#qqu$Hn"6d%%')_e<-?6Bls8N&t +rqlWkrr3)MKLH.F!"/ufQ.u?;s8N#rqu$Hn"7j +JcGBB#5\@H!58F0j8])W!rMoorr3)LF>O'u!"0?)R-FYLs8N#qqu$Hn"6d%%')_e<-?6Bls8N&t +rqlWkrr3)MKLH.F!"/ufQ.u?;s8N#rqu$Hn"7j +JcGBB#5\@H!58F0huE]Ts8 +JcGBB#5nM7DVkElhuE]T$2j]"s8ViEMEMjV!!=%Frql]ps8E)ur;6Kn"R!%2/dVFV"[DJSrVuos +rW<#prVlg!iJpPRrW!$0OoG7Ws8Muur;6Kn"RO!T0+Rs]""rF.rVlisrW<&qqu6U'k*fL%!<<*( +D#XA3pAb-kX8d\~> +JcGBB#5\@H!58F0huE]T$2j]"s8ViEMEMjV!!=%Frql]ps8E)ur;6Kn"R!%2/dVFV"[DJSrVuos +rW<#prVlg!iJpPRrW!$0OoG7Ws8Muur;6Kn"RO!T0+Rs]""rF.rVlisrW<&qqu6U'k*fL%!<<*( +D#XA3pAb-kX8d\~> +JcGBB#5\@H!58F0huE]Trr)ir$Mj8*Q@=71CrHAOrr;uss8Dor%.`G[LjserIe*L;s8W)trr)ir +$N0G7SUZ*:D63d7rr;uss8;rsrr3>ul`lFuI!Thlrqucqs8N#rrVm5pe"_MEI;kMPrViAfJ,~> +JcGBB#5nM7DVkElhuE]Ts8)forr3,ll$5)grW!"Vs8)`ps8E-!qu$HmrrhK*@1WM>!!MH`rVuos +rr;iqr;Q^!q< +JcGBB#5\@H!58F0huE]Ts8)forr3,ll$5)grW!"Vs8)`ps8E-!qu$HmrrhK*@1WM>!!MH`rVuos +rr;iqr;Q^!q< +JcGBB#5\@H!58F0j8T;^s8N#rrVca(kLutpH$+1QP+9ntr;H`prr2p1qVTDeIX5sVJ"!D$rr)lr +rr)forsS2LZ]TNWEd*J2_ta0/!WE#rrs[l6V1X)7FaKIMiW&lUrW<&rrr2p,o%gpEH?jIRLRG[C +rVi>eJ,~> +JcGBB#5nM7DVkElj8T;^s8N#pr;HWtd(39sr;ZsH4JD]Orr)utqYgEn"8BZr8c/Pp4^HJ7rVulr +r;6Hm"5CY(.K'5L)Ej&MrVc]rqu-Kn"2q'6#Q4W*1ebgerVlctr;6Kmrr_E"GW>X%"V*\?jo#(I +s*t~> +JcGBB#5\@H!58F0j8T;^s8N#pr;HWtd(39sr;ZsH4JD]Orr)utqYgEn"8BZr8c/Pp4^HJ7rVulr +r;6Hm"5CY(.K'5L)Ej&MrVc]rqu-Kn"2q'6#Q4W*1ebgerVlctr;6Kmrr_E"GW>X%"V*\?jo#(I +s*t~> +JcGBB#5\@H!58F0jSo>]s8Drrrs\hXb++$,EHZ_jYMK'Ss8W&urVca(mF&D*G^"%PJ"FO>rr3*" +s8MuqrsR]0Tn[`4F+&nFf(8n@!ri5urVm8te%V,pGAhbTQau,Trr`9#rr)fq$fo^6Mfs5^I=nEB +mJd+crgWq<~> +JcGBB#5nM7DVkEljSo>]s8;lqrri5)QTPBK!!=BO_"I^,s8E#qrVluUX(sOnqu?dWF2e.Y"9/?"qu-Nsb,\AZr;Zp*<28:KrrE%f +s*t~> +JcGBB#5\@H!58F0jSo>]s8;lqrri5)QTPBK!!=BO_"I^,s8E#qrVluUX(sOnqu?dWF2e.Y"9/?"qu-Nsb,\AZr;Zp*<28:KrrE%f +s*t~> +JcGBB#5\@H!58F0j8TYhs8ViGZ]B?QE-m5/_Wgdns8W&trrTOL=-: +rr<#s!ri6!SH"*~> +JcGBB#5nM7DVkElj8T>_s8VYpDC,5]":dePg$eq?!rVrprr3,rk)hqCrW!')&neH&rr;uq#QOf' +s74$V-iF#J%5N+VkPkM]quH`qrri8hS5UF,!##AD>+OCDs8W)rr;Zcrs7=]u/d2.R":HDlaP[!s +s82rss8JPgJ,~> +JcGBB#5\@H!58F0j8T>_s8VYpDC,5]":dePg$eq?!rVrprr3,rk)hqCrW!')&neH&rr;uq#QOf' +s74$V-iF#J%5N+VkPkM]quH`qrri8hS5UF,!##AD>+OCDs8W)rr;Zcrs7=]u/d2.R":HDlaP[!s +s82rss8JPgJ,~> +JcGBB#5\@H!58F0jo5ehrVbZHKm\)cJr?k_oDS^hrVZX&r5XbMG'J.dQGD_Wrr3Z2rVc`qs8Dr_ +WJ5nGFa]+Fc1Cl4s8W&rrXAc'd?B<0G]SY%]&E;[s8W$/rr<#trq*URJou9_MP.uYq>UEorVlea +s*t~> +JcGBB#5nM7DVkEljo5M`r;=B$'`J(8"W_9WlM^_`qu$El"TA.Y*tJ8M";WPDeF!88$N9l"rr2rr +rRY3dr;Zs? +JcGBB#5\@H!58F0jo5M`r;=B$'`J(8"W_9WlM^_`qu$El"TA.Y*tJ8M";WPDeF!88$N9l"rr2rr +rRY3dr;Zs? +JcGBB#5\@H!58F0jo>AZ#QK^#JV&B^mf!.hrqucps8N#t$2jhYBmkP^OOF.,s8W&trW3&urr39% +s.X4YJpj`_r;Qotrr2rsrr3<'rpOoQJUrU!q>L?nrVuits8N#t#lFY6Aq5J]TATSH"8r,srg!M6~> +JcGBB#5nM7DVkEljo>AZ#QGV@!!NORh>R?WrqcTls8N#t$2XY4!!!$(,GtJ=s8VrurVlirrr39# +s$cth"U/;Zr;QorrVccqrr3&tro*hV!sTF.oDS[mr;6Hls8N#t#l4LE!!*3,7)&U!"8_rorg!M6~> +JcGBB#5\@H!58F0jo>AZ#QGV@!!NORh>R?WrqcTls8N#t$2XY4!!!$(,GtJ=s8VrurVlirrr39# +s$cth"U/;Zr;QorrVccqrr3&tro*hV!sTF.oDS[mr;6Hls8N#t#l4LE!!*3,7)&U!"8_rorg!M6~> +JcGBB#5\@H!58F0jo5\erVjrsGC"\$`T7$u!r`/uqu?]q%eZoPGC4q?f(/k@rVlirqu73*rn3HZ +G^PF`hu52dqZ$Tos8W(_s*t~> +JcGBB#5nM7DVkEljo5J_r;Dp)rW!!QO3.D$!rW)tqu?]p%dRC%!!!."[-.Jhr;Q`qqu6crrNn3V +!!46k_#F?8r;Zcnrt,2-okt9>!!5QcgAh3OrVulorr`2ucT_=.#nUsep](9ks8W(_s*t~> +JcGBB#5\@H!58F0jo5J_r;Dp)rW!!QO3.D$!rW)tqu?]p%dRC%!!!."[-.Jhr;Q`qqu6crrNn3V +!!46k_#F?8r;Zcnrt,2-okt9>!!5QcgAh3OrVulorr`2ucT_=.#nUsep](9ks8W(_s*t~> +!rr9"qu6Tp!WN,qrW3&uq>UQrs8MuorqcZnrW<-!s8Dots8Mus!WN,trW3&urr3#us82f:rs&?" +HN:bZqr@\crr;].Sq(m&J!e4Ns8Mio%fZM.jfa_kEHR/6hZ*TSq>Up's8:*:K6;3]Q+HPdrqZTo +rXAho[?Z,ZF,$79s8W)orso&.s4=6*GAqehYj)2drfdA4~> +!rr9"qu6Tp!WN,qrW3&uq>UQrs8MuorqcZnrW<-!s8Dots8Mus!WN,trW3&urr3#us82f:rs&E$ +]l)^,rT!n]rVu5@7K`Vi">u21s8Mio"oeQ%b[;Un!!O<:^]4<4q>UWss7i-_"o\K)1OS9`rV?Hs +rr<#RD__4k"V3i#s8W)orrrE%s0,Z:rW!*PB\!.]rfdA4~> +!rr9"qu6Tp!WN,qrW3&uq>UQrs8MuorqcZnrW<-!s8Dots8Mus!WN,trW3&urr3#us82f:rs&?" +HN:bZqr@\[rVu5@7K`Vi">u21s8Mio"oeQ%b[;Un!!O<:^]4<4q>UWss7i-_"o\K)1OS9`rV?Hs +rr<#RD__4k"V3i#s8W)orrrE%s0,Z:rW!*PB\!.]rfdA4~> +!rr8tr;Qltrr;unrr`5tr;HWoo`"pjqYpQpp\tErs8N&urqQKqrr;uqr;Qltrr;u@rs&?"HN:bZ +qrRh[rr<#srr3;m^P[AWFc,/WrVQU+rr;urs8ViMUkEi1Gc1B9rql]srr;rrrsA/9OFD.jK$aMp +qu76,s8Muss8:u^L3IW]RI^=Uqu76,s8N#ts7+L&JT5aY^Ae*1PlH7~> +!rr8tr;Qltrr;unrr`5tr;HWoo`"pjqYpQpp\tErs8N&urqQKqrr;uqr;Qltrr;u@rs&E$]l)^, +rT4%]rr<#rrr3&XJ/S=d"!5D[r;6L#rr;ups8VQ':D!L*"&JRerql]srr;oqrs@VI-3=/I&Yf:% +qu7!%s8Moqs7t&M')hk53T^5 +!rr8tr;Qltrr;unrr`5tr;HWoo`"pjqYpQpp\tErs8N&urqQKqrr;uqr;Qltrr;u@rs&?"HN:bZ +qrRh[rr<#rrr3&XJ/S=d"!5D[r;6L#rr;ups8VQ':D!L*"&JRerql]srr;oqrs@VI-3=/I&Yf:% +qu7!%s8Moqs7t&M')hk53T^5 +&,uV/qsX(Eo)Jags8N&pmeuYQrri?$rr<#trW_u\oD\1GnbE+lo'Q&Krr;ZZmJ6e]rVuos'`@@d +qZ$Qos8N&uqXiW&iPrt#,/rr)cps8M6"R!4eprr&)]J,~> +&,uV/qsX(Eo)Jags8N&pmeuYQrri?$rr<#trW_u\oD\1GnbE+lo'Q&Krr;ZZmJ6e]rVuos'`@@d +qZ$Qos8N&uqX(4s7uEh!W;iors._L70`hV +s8;`nrr2rps8N>u`.B36<<)dirr`9#rVQTo#O\-b&-0ZKqtg?lrXA`$s8W&JNA(>]s82bZs*t~> +&,uV/qsX(Eo)Jags8N&pmeuYQrri?$rr<#trW_u\oD\1GnbE+lo'Q&Krr;ZZmJ6e]rVuos'`@@d +qZ$Qos8N&uqX(4s7uEh!W;iors._L70`hV +s8;`nrr2rps8N>u`.B36<<)dirr`9#rVQTo#O\-b&-0ZKqtg?lrXA`$s8W&JNA(>]s82bZs*t~> +.f]7KNcfVkHF*#=rVccNG^Xg]GGM@>e,TIIs8N&ur;WL3k4!bLHdhulrr4DErnr6NScATeY]tS` +q>LbPqeCs*FaZs81dTrVcfqrr3,MD92bTp](6l!WE#s +rreg?pAY'bs8W&urVlg"kAmj,r:g6jrr;rrrrfTIjo55Ps8W&urVlfupjeh4rfmG5~> +.f]7KNcfVkHF*#=rVccNG^Xg]GGM@>e,TIIs8N&ur;WL3k4!bLHdhulrr4DErnr6NScATeY]tS` +q>LbPqeEs1N=,s8CpVrr)rsqu6TuVZDqZqY1$hrW2rq +rr3*\"7?*dq#:Krs8Muorr3,J!Fu-*p](6ls8;lr"D._[rquKi!ri/qrr3/m!&X]QrfmG5~> +.f]7KNcfVkHF*#=rVccNG^Xg]GGM@>e,TIIs8N&ur;WL3k4!bLHdhulrr4DErnr6NScATeY]tS` +q>LbPqeCs*FaZs81dTrr)rsqu6TuVZDqZqY1$hrW2rq +rr3*\"7?*dq#:Krs8Muorr3,J!Fu-*p](6ls8;lr"D._[rquKi!ri/qrr3/m!&X]QrfmG5~> +=RVboOJJYITQ>SdNS#5eAKCWQPRp&G$j#Q=Mu +S:(&1rq-6jrW`8tk]*j,r:L$grW`5tZZ,%+rUp3irr;m"pjeb3rr//^J,~> +=RVboOJJYITQ>SdNS#5A"o!0I6Wp&G$j#Q4>p +2ur@GrUg-irW`2qd/[VTqXsmerW`)pB)p0Ur:U*hrWi>snGk +=RVboOJJYITQ>SdNS#5A"o!0I6Wp&G$j#Q4>p +2ur@GrUg-irW`2qd/[VTqXsmerW`)pB)p0Ur:U*hrWi>snGk +"/'kVqYgF"_JYS3r;YVj^]+6omc`Z.CnCP&rr;orj)2+#l?B"_PQ1X]s8DrqP'M;Cs82i"H`qP? +rqufqrVk2eIsBZHrVZ]6Bsd=-rrqMICqK`Ebl7nDs*FaZs81RN#6"PMCrlYSo)AsorVi:7pAb-_ +rs&H$kAmg,r:0dkr;O!Ajo>;Mrs/Q'pOAV2rr//^J,~> +"/'kVqYgF"_JYS3r;YVj^]+6omc`Z.CnCP&rr;orj)2+#l?B"_PQ1X]s8DrqP'M;Cs82i"H`qP? +rqufqrVk2eIsBZHrVZ]6Bsd=-rrqMICqK`Ebl7nFs1N=,s8C^P#5eCu!0I6Wo)Asor;JVTmJm.U +rs&E#ci@MSqXORiqYk(,bl@V3rs/N&n,P6Dr;Mr\J,~> +"/'kVqYgF"_JYS3r;YVj^]+6omc`Z.CnCP&rr;orj)2+#l?B"_PQ1X]s8DrqP'M;Cs82i"H`qP? +rqufqrVk2eIsBZHrVZ]6Bsd=-rrqMICqK`Ebl7nDs*FaZs81RN#5eCu!0I6Wo)Asor;JVTmJm.U +rs&E#ci@MSqXORiqYk(,bl@V3rs/N&n,P6Dr;Mr\J,~> +'7,9*s8;inrVDn6mJm4BDS,lDrVca]\o#@ar;QWoZu=.elZ9;;Fm8r(s8DrVG+!lMs82i"G11l< +s8Drrr;WRARWR9`qu>#_P4ekQrVHQBFH#qlrltHIqYtmB^&Ruars&H%e835+r:9jmrr)keIJ3^? +o)Apms6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +'7,9*s8;inrVDn6mJm4BDS,lDrVca]\o#@ar;QWoZu=.elZ9;;Fm8r(s8DrVG+!lMs82i"G11l< +s8Drrr;WRARWR9`qu>#_P4ekQrVHQBFH#qlrltHIr;XHJhZ*Q/rs&B#W;r%[qXXXkrqudU!:Bgb +o)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +'7,9*s8;inrVDn6mJm4BDS,lDrVca]\o#@ar;QWoZu=.elZ9;;Fm8r(s8DrVG+!lMs82i"G11l< +s8Drrr;WRARWR9`qu>#_P4ekQrVHQBFH#qlrltHIqYtmB^&Ruars&B#W;r%[qXXXkrqudU!:Bgb +o)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +s*dZ,s8;iorr;unrr)lRDS6#Is8MuprVr+>s8Mupr1\T/s6Og4hJC.0r;QWo\T,KAR/d'`Z#K'" +Jb]9DrVl> +s*dZ,s8;iorr;unrr)lRDS6#Is8MuprVr+>s8Mupr1\T/s6Og4hJC.0r;QWo\T,KAR/d'`Z#K'" +Jb]9DrVl> +s*dZ,s8;iorr;unrr)lRDS6#Is8MuprVr+>s8Mupr1\T/s6Og4hJC.0r;QWo\T,KAR/d'`Z#K'" +Jb]9DrVl> +",hB)p&4n\rVlisr;YVk]`7p0s8N&qrlK6=s8;ofGbP-:m<,H.J!U-6rVcMRJ*DHPs82i#E:D"c +ec,LErmY_taD9T2s6t90s8;orrr2utrr2utbl7nDs*FaZs81RN#6"SOCrlYSo)AsorVrC9pAb-_ +rs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +",hB)p&4n\rVlisr;YVk]`7p0s8N&qrlK6=s8;ofGbP-:m<,H.J!U-6rVcMRJ*DHPs82i#E:D"c +ec,LErmY_taD9T2s6t90s8;orrr2utrr2utbl7nFs1N=,s8C^P#5eG"!0I6Wo)Asor;S_VmJm.U +rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +",hB)p&4n\rVlisr;YVk]`7p0s8N&qrlK6=s8;ofGbP-:m<,H.J!U-6rVcMRJ*DHPs82i#E:D"c +ec,LErmY_taD9T2s6t90s8;orrr2utrr2utbl7nDs*FaZs81RN#5eG"!0I6Wo)Asor;S_VmJm.U +rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +'%)>POIaJFqu?]os8;oRDS6#Irr5=ar;OiRc2RS>`c/Hfs6Oj*ri1/+rquc[Ei&V[S,`BcZ#K%" +G,YH>r;Wd7lGRJms8MP5U]15ks8W)urr2lqs8L:C#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2 +rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +'%)>POIaJFqu?]os8;oRDS6#Irr5=ar;OiRc2RS>`c/Hfs6Oj*ri1/+rquc[Ei&V[S,`BcZ#K%" +G,YH>r;Wd7lGRJms8MP5U]15ks8W)urr2lqs8L:C#5nM7DVkElg]%KTs/?![s8) +'%)>POIaJFqu?]os8;oRDS6#Irr5=ar;OiRc2RS>`c/Hfs6Oj*ri1/+rquc[Ei&V[S,`BcZ#K%" +G,YH>r;Wd7lGRJms8MP5U]15ks8W)urr2lqs8L:C#5\@H!58F0g]%KTs/?![s8) +'*$[RF`)8DNj8'QrVccQDS6#IrVneRs2f*)s8)]#E97*!m<,?+e8N8)qu>#^c2N'[s82i$ET[:e +KCf*@q36X4^hhg+s7(?/rr)`os8L1@#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)% +YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +'*$[RF`)8DNj8'QrVccQDS6#IrVneRs2f*)s8)]#E97*!m<,?+e8N8)qu>#^c2N'[s82i$ET[:e +KCf*@q36X4^hhg+s7(?/rr)`os8L1@#5nM7DVkElg]%KTs/?![s8) +'*$[RF`)8DNj8'QrVccQDS6#IrVneRs2f*)s8)]#E97*!m<,?+e8N8)qu>#^c2N'[s82i$ET[:e +KCf*@q36X4^hhg+s7(?/rr)`os8L1@#5\@H!58F0g]%KTs/?![s8) +')V_/e\7N1F`!/brqufQDS6#IrVnhSs2f*)s8MqNP5G1Wm<,B-omrJ,qu!15oD*d's82i$Eod5: +DV+mfk&R[)]PZI(rpb6.rr)iqrs&K&rr)irrltHIqYtmB^&Ruars&H%e835+r:9jmrr)keIJ3^? +o)Apms6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +')V_/e\7N1F`!/brqufQDS6#IrVnhSs2f*)s8MqNP5G1Wm<,B-omrJ,qu!15oD*d's82i$Eod5: +DV+mfk&R[)]PZI(rpb6.rr)iqrs&K&rr)irrltHIr;XHJhZ*Q/rs&B#W;r%[qXXXkrqudU!:Bgb +o)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +')V_/e\7N1F`!/brqufQDS6#IrVnhSs2f*)s8MqNP5G1Wm<,B-omrJ,qu!15oD*d's82i$Eod5: +DV+mfk&R[)]PZI(rpb6.rr)iqrs&K&rr)irrltHIqYtmB^&Ruars&B#W;r%[qXXXkrqudU!:Bgb +o)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +s8N)urr3E%d\q/2jSo29DS6#Irr4qVr;OfSdJs7"FJ]$7s6Xs-s8B!?lMg@$TDeD0SH&KdZ#Sn) +lZK3,rk!+(rk*(&s8VS1VZ6S2rs&?"HN:bZqqM,TrVtA`aT)2/rs/Q%s."N2s8MTh#6"ScEj5TA +nc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +s8N)urr3E%d\q/2jSo29DS6#Irr4qVr;OfSdJs7"FJ]$7s6Xs-s8B!?lMg@$TDeD0SH&KdZ#Sn) +lZK3,rk!+(rk*(&s8VS1VZ6S2rs&E$]l)^,rS.>VquUs8;Hf#Q=\m!&FTPrfmG5~> +s8N)urr3E%d\q/2jSo29DS6#Irr4qVr;OfSdJs7"FJ]$7s6Xs-s8B!?lMg@$TDeD0SH&KdZ#Sn) +lZK3,rk!+(rk*(&s8VS1VZ6S2rs&?"HN:bZqqM,TquUs8;Hf#Q=\m!&FTPrfmG5~> +"J+KMqu$Hn;#S@R[f?BaDS6#Is8W)uqu=rVci=!_C=N7[s6Xs.s8U\h^]2Gobl@9_SH&KdZ#]", +qO)p-s,N!1s1W@*s8;_^PPG+Urr;urroqYorr11B#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2 +rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +"J+KMqu$Hn;#S@R[f?BaDS6#Is8W)uqu=rVci=!_C=N7[s6Xs.s8U\h^]2Gobl@9_SH&KdZ#]", +qO)p-s,N!1s1W@*s8;_^PPG+Urr;urroqYorr11B#5nM7DVkElg]%KTs/?![s8) +"J+KMqu$Hn;#S@R[f?BaDS6#Is8W)uqu=rVci=!_C=N7[s6Xs.s8U\h^]2Gobl@9_SH&KdZ#]", +qO)p-s,N!1s1W@*s8;_^PPG+Urr;urroqYorr11B#5\@H!58F0g]%KTs/?![s8) +&nJ*Cqu?ZpqYo\r\,QE`DS,oFrr,7^rUl;,oD\cXK_>BCs6Xs.s8DSAQMI8%mf)j+SH&KdZ#]%- +s2/a/luKB2s1`F+s8)bsE:!W%s8N&rs352arqjt?#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2 +rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +&nJ*Cqu?ZpqYo\r\,QE`DS,oFrr,7^rUl;,oD\cXK_>BCs6Xs.s8DSAQMI8%mf)j+SH&KdZ#]%- +s2/a/luKB2s1`F+s8)bsE:!W%s8N&rs352arqjt?#5nM7DVkElg]%KTs/?![s8) +&nJ*Cqu?ZpqYo\r\,QE`DS,oFrr,7^rUl;,oD\cXK_>BCs6Xs.s8DSAQMI8%mf)j+SH&KdZ#]%- +s2/a/luKB2s1`F+s8)bsE:!W%s8N&rs352arqjt?#5\@H!58F0g]%KTs/?![s8) +&:KB+s82`mqZ#Mn]DhieD8#fG5e:X?s8M81PQ1X\s6Xs.s8)bpGiXCGs8Ve@SH&KdZ#]%-rp+U3 +`GFB0s1W@*s82i6E2E@0r;?HkqiH$cs8C4B#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'n +rVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +&:KB+s82`mqZ#Mn]DhieD8#fG5e:X?s8M81PQ1X\s6Xs.s8)bpGiXCGs8Ve@SH&KdZ#]%-rp+U3 +`GFB0s1W@*s82i6E2E@0r;?HkqiH$cs8C4B#5nM7DVkElg]%KTs/?![s8) +&:KB+s82`mqZ#Mn]DhieD8#fG5e:X?s8M81PQ1X\s6Xs.s8)bpGiXCGs8Ve@SH&KdZ#]%-rp+U3 +`GFB0s1W@*s82i6E2E@0r;?HkqiH$cs8C4B#5\@H!58F0g]%KTs/?![s8) +"+tQdo)8SXo9+4[s8Uqp[drnXnaYkIFar?Js4(o%rqu`pm<5N0qu5,iN-EGDs7Uo4s82i%F6ET$ +r0`%fN;NPQ^M_j,r;HATC:a':rs&D>ELlq(rltHIqYtmB^&Ruars&H%e835+r:9jmrr)keIJ3^? +o)Apms6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +"+tQdo)8SXo9+4[s8Uqp[drnXnaYkIFar?Js4(o%rqu`pm<5N0qu5,iN-EGDs7Uo4s82i%F6ET$ +r0`%fN;NPQ^M_j,r;HATC:a':rs&D>ELlq(rltHIr;XHJhZ*Q/rs&B#W;r%[qXXXkrqudU!:Bgb +o)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +"+tQdo)8SXo9+4[s8Uqp[drnXnaYkIFar?Js4(o%rqu`pm<5N0qu5,iN-EGDs7Uo4s82i%F6ET$ +r0`%fN;NPQ^M_j,r;HATC:a':rs&D>ELlq(rltHIqYtmB^&Ruars&B#W;r%[qXXXkrqudU!:Bgb +o)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +&ELHCJ?Q/YY`*\*q#(0FDgM>,6$R=-h>dEPVK1l"rVZ]]Cnq%-rptk`JF5X +_f0P#s8)c-AD."\rVlDPEepp$YEs'bq#:9:rs&?"HN:bZqqM,TrVtA`aT)2/rs/Q%s."N2s8MTh +#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +&ELHCJ?Q/YY`*\*q#(0FDgM>,6$R=-h>dEPVK1l"rVZ]]Cnq%-rptk`JF5X +_f0P#s8)c-AD."\rVlDPEepp$YEs'bq#:9:rs&E$]l)^,rS.>VquUs8;Hf#Q=\m!&FTPrfmG5~> +&ELHCJ?Q/YY`*\*q#(0FDgM>,6$R=-h>dEPVK1l"rVZ]]Cnq%-rptk`JF5X +_f0P#s8)c-AD."\rVlDPEepp$YEs'bq#:9:rs&?"HN:bZqqM,TquUs8;Hf#Q=\m!&FTPrfmG5~> +s8NSKQ#gtfE/E-Frr)lYSYQ+W6D)Ets8DrsY,2*srr)leR_\t$rr9HsZ2ah'pn5+rr;Xd(mJm+` +kan="rql`BQ0&&Es8DuiU3^j$Ed4VJs8Dusc2S"Es*FaZs81RN#6"SOCrlYSo)AsorVrC9pAb-_ +rs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +s8NSKQ#gtfE/E-Frr)lYSYQ+W6D)Ets8DrsY,2*srr)leR_\t$rr9HsZ2ah'pn5+rr;Xd(mJm+` +kan="rql`BQ0&&Es8DuiU3^j$Ed4VJs8Dusc2S"Gs1N=,s8C^P#5eG"!0I6Wo)Asor;S_VmJm.U +rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +s8NSKQ#gtfE/E-Frr)lYSYQ+W6D)Ets8DrsY,2*srr)leR_\t$rr9HsZ2ah'pn5+rr;Xd(mJm+` +kan="rql`BQ0&&Es8DuiU3^j$Ed4VJs8Dusc2S"Es*FaZs81RN#5eG"!0I6Wo)Asor;S_VmJm.U +rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +s8DutrojRJqu?Woo`"pir;Qcrp\t6mrr2utkPl%ks8N&ukih9pli7"as8L7B#5\@H!58F0g]%KV +s3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +s8DutrojRJqu?Woo`"pir;Qcrp\t6mrr2utkPl%ks8N&ukih9pli7"as8L7B#5nM7DVkElg]%KT +s/?![s8) +s8DutrojRJqu?Woo`"pir;Qcrp\t6mrr2utkPl%ks8N&ukih9pli7"as8L7B#5\@H!58F0g]%KT +s/?![s8) +s8N,urqud"rVulrs8Muq"T8/pr;6Ejs8;cm!W2fnr;uoor;HTor;QWqr;6Ejs8)forqulqqtg6k +r;?Tpr;HQqrr;uErs&?"HN:bZqqM,TrVtA`aT)2/rs/Q%s."N2s8MTh#6"ScEj5TAnc&gks0H_, +s8DNg#QFbuJ=6H:rfmG5~> +s8N,urqud"rVulrs8Muq!;l`k!;l`ms8)Wj!W)]lquZclqYgVquUs8;Hf#Q=\m!&FTPrfmG5~> +s8N,urqud"rVulrs8Muq!;l`k!;l`ms8)Wj!W)]lquZclqYgUs8;Hf#Q=\m!&FTPrfmG5~> +rr2utrVZfss8Mrr!ri5u])Mj2s8LFG#5\@H!58F0g]%KVs3ti*s8;Hf#QF]%Rsar0rpp'nrVu)$ +YQ+Ojrs&E$Z>eq*rUTsnrr;bCR/d0bPlH7~> +rr2utrVZfss8Mrr!ri5t])Mj2s8LFG#5nM7DVkElg]%KTs/?![s8) +rr2utrVZfss8Mrr!ri5t])Mj2s8LFG#5\@H!58F0g]%KTs/?![s8) +nG`Uis6SaZj9+B>s8LCF#5\@H!58F0g]%KUs3kc(s82Be#QF]%Rsao/rUTsmr;Yr"YQ+Lirs&B# +Z>en)r:9jmrVuV@R/d0bPlH7~> +nG`Xjs4PK8^rQZ#aSZ#9d/O=Js1N=,s8C^P#5eG"!0I6Wo)Asor;S_VmJm.Urs&E$d/[VTqXORi +qYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nG`Xjs4PK8^rQZ#aSZ#9d/O=Hs*FaZs81RN#5eG"!0I6Wo)Asor;S_VmJm.Urs&E$d/[VTqXORi +qYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&dkrn2aGHbaq2HZZ(YrVk4E#5\@H!58F0g]%KVs4;/3s8;Hf#QFZ$TRlk;rpp'nrVu/*[/^'o +rs&E$[r^a4rUU!grWW(NScA]gPlH7~> +nc&^hrj)jB!!>mar;P+D#5nM7DVkElg]%KTs/?![s8) +nc&^hrj)jB!!>mar;P+D#5\@H!58F0g]%KSs/5pYs7u6c#QFW#2ZW4Er:9jlqu>"C@/p&mrs& +nc&gjs.sjiJ:YRh#(_;UG38i&dJjFIs*FaZs81RN#5eG:'!2-1o)Asoqu9tLpAb*^rs&E$iYmIL +qXORiqYuBhhZ*NErs/N%paK>Fr;Mr\J,~> +nc&ghs%<=q!<^1A"p+f-!7(WAdJjFKs1N=,s8C^P#5\@r!0$sRo)Asor;SMPli6nRrs&B#c2_,L +q=4Ihq>Xn(aoD8/rs/K%n,P$>qu2i[J,~> +nc&ghs%<=q!<^1A"p+f-!7(WAdJjFIs*FaZs81RN#5eG"!0I6Wo)Asor;S_VmJm.Urs&E$d/[VT +qXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&gkriCXn(aoD8/rs/K%n,P$>qu2i[J,~> +nc&agr`B.%^&S9:!n%#FdJjFKs1N=,s8C^P#5eG6$E*q#o)Asoqu9V7p&G!]rs&E$h[k/7qXORi +qYu*Wg].3Brs/N%pDm$/r;Mr\J,~> +nc&agr`B.%^&S9:!n%#FdJjFIs*FaZs81RN#5eG"!0I6Wo)Asor;S_VmJm.Urs&E$d/[VTqXORi +qYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&gks/U?pIZ)(,#(h>TI-CV/dJjFIs*FaZs81RN#5eG"!0I6Wo)Asor;SbXmJm.Urs&E$d/d_V +qXORiqYt40bl@V3rs/N&nGtHGr;Mr\J,~> +nc&mks&K+%!#I"0`$Y`l!!*)Is8::E#5nM7DVkElg]%KVs4:r-s8;Hf#QFZ$SpgA5rpp'nrVu/% +ZN'jmrs&E$[Vk:.rUU!grWW+KS,`HdPlH7~> +nc&mks&K+%!#I"0`$Y`l!!*)Is8::E#5\@H!58F0g]%KTs/?![s8) +nc&mms/U?sFj0ma`;^%'H\$S.s8C@F#5\@H!58F0g]%KTs/?![s8) +nc&mks&K+*!1Elc`;^#a!!3/Js8::E#5nM7DVkElg]%KUs3kf)s82Be#QF]%Rsju0rUTsmr;Yr# +YQ+Lirs&B#Z>nt*r:9jmrVuVAR/d0bPlH7~> +nc&mks&K+*!1Elc`;^#a!!3/Js8::E#5\@H!58F0g]%KTs/?![s8) +nc&mms/U?rG09g]i;N`Sl2D"frr%n*JUH\]rR(WLqYtmB^&Ruars&B#W;r%[qXXXkrqudU!:Bgb +o)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+)!1*W[i;N`Sl2D"frr!o=! +o)Apms6+I+s8;Ee#5nM,E97,uo)Asos7h)2s8Dq]s*t~> +nc&mks&K+)!1*W[i;N`Sl2D"frr!o=! +nc&mms/U?sG09g]j8K)Zrr2r_rX&Q&rJu>WI-CV/dJjFIs*FaZs81RN#5eG"!0I6Wo)Asor;S_V +mJm.Urs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;P4G#lX]#s8N&trVc]m!ri6!r;QfsrVcWr +rVliri;\<~> +nc&mks&K+)!1*W[iVriVlM_+grr!o=! +nc&mks&K+)!1*W[iVriVlM_+grr!o=! +nc&mms/U?sG0Bp`jo5Vcs8Mup`VKQ5m/ICks8J+-JUH\]rR(WLqYtmB^&Ruars&B#W;r%[qXXXk +rqudU!:Bgbo)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lBs8W)qs8W'!s8N#ts8Mlp!<(gT +J,~> +nc&mks&K+*!13`^jo5Vcs8Mup`VKQ5m/ICks8F,@!W^XJr6bNKr;XHJhZ*Q/rs&H%e835+r:9jm +rr)keIJ3^?o)Apms6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N#Ds8W)qs8W'!s8N#ts8Mlp!<(gT +J,~> +nc&mks&K+*!13`^jo5Vcs8Mup`VKQ5m/ICks8F,@!W^XJr6bNKqYtmB^&Ruars&B#W;r%[qXXXk +rqudU!:Bgbo)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lBs8W)qs8W'!s8N#ts8Mlp!<(gT +J,~> +nc&mms/U?sG0Bp`k5Pbes8DorY'9[@rTsOjrr;tZI"?\/s8C@F#5\@H!58F0g]%KTs/?![s8) +nc&mks&K+*!13`^k5Pbes8DorY'9[@rTsOjrr;s?!!3/Js8::E#5nM7DVkElg]%KVs3tl+s8;Hf +#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cfDkjL*kSK;rr)lslG0O,Y.Xf7 +rVulsrr<#_]<8E@_"Ia,i;\<~> +nc&mks&K+*!13`^k5Pbes8DorY'9[@rTsOjrr;s?!!3/Js8::E#5\@H!58F0g]%KTs/?![s8) +nc&mms/U?sG0Bp`jo5Vcs8UAmL\LiJm/ICks8J+-JUH\]rR(WLqYtmB^&Ruars&B#W;r%[qXXXk +rqudU!:Bgbo)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lKru:t9rVq\#qZ$Hl]Q/"4EcH#a +jT#2Yrr)c"Dfbnu"`T17rr)iUs*t~> +nc&mks&K+*!13`^jo5Vcs8UAmL\LiJm/ICks8F,@!W^XJr6bNKr;XHJhZ*Q/rs&H%e835+r:9jm +rr)keIJ3^?o)Apms6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N#Mru:t9rVq\#qZ$Hl]Q/"4EcH#a +jT#2Yrr)c"Dfbnu"`T17rr)iUs*t~> +nc&mks&K+*!13`^jo5Vcs8UAmL\LiJm/ICks8F,@!W^XJr6bNKqYtmB^&Ruars&B#W;r%[qXXXk +rqudU!:Bgbo)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lKru:t9rVq\#qZ$Hl]Q/"4EcH#a +jT#2Yrr)c"Dfbnu"`T17rr)iUs*t~> +nc&mms/U?sG0Bp`k5Pbdr9:"qIY[Xsrp9Xkrr;tZI"?\/s8C@F#5\@H!58F0g]%KTs/?![s8) +nc&mks&K+*!13`^k5Pbdr9:"qIY[Xsrp9Xkrr;s?!!3/Js8::E#5nM7DVkElg]%KVs3tl+s8;Hf +#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cfDd)oroA43s8)cDD3r!"kMN+Y +K]W43r;XZQU#"nokLP-)f`(g.s*t~> +nc&mks&K+*!13`^k5Pbdr9:"qIY[Xsrp9Xkrr;s?!!3/Js8::E#5\@H!58F0g]%KTs/?![s8) +nc&mms/U?sG0Bp`kPtS]#lB6l^R9WIs8MBb$3'u(OF2V,kl:V/rs&?"HN:bZqqM,TquUs8;Hf#Q=\m!&FTPrn.5Yrr)i.DTMkUk(eKRr;R%m +D7KTCrqV;1qu6iBB9N;nro=$/~> +nc&mks&K+*!13`^kPtS]#lB6l^R9WIs8MBb$3'u(+92HCdJs-lrs&E$]l)^,rS.>VrVtA`aT)2/ +rs/Q%s."N2s8MTh#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn.5Yrr)i.DTMkUk(eKRr;R%m +D7KTCrqV;1qu6iBB9N;nro=$/~> +nc&mks&K+*!13`^kPtS]#lB6l^R9WIs8MBb$3'u(+92HCdJs-lrs&?"HN:bZqqM,TquUs8;Hf#Q=\m!&FTPrn.5Yrr)i.DTMkUk(eKRr;R%m +D7KTCrqV;1qu6iBB9N;nro=$/~> +nc&mms/U?sG0Bp`pAb-krr)lrqYpp%s7WYWs-J93s8MBb$3'u(OF2V,kl:V/rs&?"HN:bZqqM,T +quUs8;Hf#Q=\m!&FTPrn.5jrquebH1Cq7 +SS?:IqYgBjrT\cur;Q`kJ!p?5qu6Ntqo?t]rr1sXJ,~> +nc&mks&K+*!13`^pAb0l"9&,or;Q]mrsJc*p93QWQ[no3rp9Xkrr;s?!!3/Js8::E#5nM7DVkEl +g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cf`)rjr;W42 +nc/W[C!6PQrVcZml?o#trr;bCRK*-\rr!#ta3FY`ro=$/~> +nc&mks&K+*!13`^pAb0l"9&,or;Q]mrsJc*p93QWQ[no3rp9Xkrr;s?!!3/Js8::E#5\@H!58F0 +g]%KTs/?![s8) +nc&mms/U?sG0Bp`q>^Kos8;rsrVuos"9&6!rr)lsrrUs8;Hf#Q=\m!&FTPrn.5m +rVl>;UAY&VIAZr?rr<#trr:dJs8DulKRrRks8N#qh>`!~> +nc&mks&K+*!13`^qZ$Qo!rVrorVm'"rql]prr)lsrrVrVtA`aT)2/rs/Q%s."N2s8MTh#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn.5m +rVl>;UAY&VIAZr?rr<#trr:dJs8DulKRrRks8N#qh>`!~> +nc&mks&K+*!13`^qZ$Qo!rVrorVm'"rql]prr)lsrrUs8;Hf#Q=\m!&FTPrn.5m +rVl>;UAY&VIAZr?rr<#trr:dJs8DulKRrRks8N#qh>`!~> +nc&mms/U?sG0Bp`qu6cts8W)trr_uKgZ&54s8E'!rqufrr!!(dJGK6Em/ICks8J+-JUH\]rR(WL +qYtmB^&Ruars&B#W;r%[qXXXkrqudU!:Bgbo)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lL +rs\o)rm5Mls8Unk^An*.rrE&trs/Q$rMje&d,"[#!W2foro=$/~> +nc&mks&K+*!13`^qu6cts8Murrr_Z"]#OaL"9/9!rqufrr!!(dJGK6Em/ICks8F,@!W^XJr6bNK +r;XHJhZ*Q/rs&H%e835+r:9jmrr)keIJ3^?o)Apms6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N#N +rs\o)rm5Mls8Unk^An*.rrE&trs/Q$rMje&d,"[#!W2foro=$/~> +nc&mks&K+*!13`^qu6cts8Murrr_Z"]#OaL"9/9!rqufrr!!(dJGK6Em/ICks8F,@!W^XJr6bNK +qYtmB^&Ruars&B#W;r%[qXXXkrqudU!:Bgbo)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lL +rs\o)rm5Mls8Unk^An*.rrE&trs/Q$rMje&d,"[#!W2foro=$/~> +nc&mms/U?sG0Bp`qZ$Tp%KGP-Q%s0mGa"B7s8W&qrs8W&rr8=9q>^H\rsA])rfDMYI-CV/dJjFI +s*FaZs81RN#5eG"!0I6Wo)Asor;S_VmJm.Urs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;P@K% +/g.)ET-rti,?1*r;QWo'E.q1s8DrbO`>GfPGHLss8N&uro=$/~> +nc&mks&K+*!13`^qYpd!rVt-&/.VXZ#:D$hs8W#srr2p'rr)irQ\"u4rp9Xkrr;s?!!3/Js8::E +#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9c +f`)BXs/C"ss8V"q\c2O+r;RH/rr<#srpGngF*WtFcLq5:s8W)Ys*t~> +nc&mks&K+*!13`^qYpd!rVt-&/.VXZ#:D$hs8W#srr2p'rr)irQ\"u4rp9Xkrr;s?!!3/Js8::E +#5\@H!58F0g]%KTs/?![s8) +nc&mms/U?sG0Bp`r;Zfrs83G:H>Rtp^:p.gIVH%_s8N&trr<#t"ojp?q>^H\rsA])rfDMYI-CV/ +dJjFIs*FaZs81RN#5eG"!0I6Wo)Asor;S_VmJm.Urs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?E +r;PCL%0$5#OcT;9s57h+s8;iq'`S.3rr;utrVu`:Ob[srEJN0Fr;P^UJ,~> +nc&mks&K+*!13`^r;Zfr')MKB!<<*PI=4-^!!$I"s8Dusrr<#t"ojp?q>^H\rsA])rZD1B!7CiE +dJjFKs1N=,s8C^P#6"SOCrlYSo)AsorVrC9pAb-_rs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4 +rr1UN%0$5#OcT;9s57h+s8;iq'`S.3rr;utrVu`:Ob[srEJN0Fr;P^UJ,~> +nc&mks&K+*!13`^r;Zfr')MKB!<<*PI=4-^!!$I"s8Dusrr<#t"ojp?q>^H\rsA])rZD1B!7CiE +dJjFIs*FaZs81RN#5eG"!0I6Wo)Asor;S_VmJm.Urs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?E +r;PCL%0$5#OcT;9s57h+s8;iq'`S.3rr;utrVu`:Ob[srEJN0Fr;P^UJ,~> +nc&mms/U?sG0Bp`qu6p!s4;1?ZKhGgrs/>`X`''Zs8Dors8E3%Q\"u4rp9Xkrr;tZI"?\/s8C@F +#5\@H!58F0h#@ZZqu*AlNW&_QoD]'pr;S_VmJm.Urs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?E +r;PCL%/g.cEN&p6s5%V'rquWms8E'!rr)j(rUe=IP'V/Rs8DrWs*t~> +nc&mks&K+*!13`^rVm3's8)bs!"3Pnrr2p&o[I7K)UAB\rVuos"ojp?q>^H\rsA])rZD1B!7CiE +dJjFKs1N=,s8CaQ#laf%dVQr&r;QZCro=$/~> +nc&mks&K+*!13`^rVm3's8)bs!"3Pnrr2p&o[I7K)UAB\rVuos"ojp?q>^H\rsA])rZD1B!7CiE +dJjFIs*FaZs81UO#la`"V>uVSqYp*d#QFZ$2ur@GrUTsmr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf +1B7:Og&DKYs5S*ts8)cPD7TZDqZ$Tp!WW/trsJ_sbe90cEj>ZCro=$/~> +nc&mms/U?sG0Bp`r;Qs!ro8K]jo5;[r;HX!\U0)&rr)irs8E3%Q\"u4rp9Xkrr;tZI"?\/s8C@F +#5\@H!58F0h>[l^s7lW#!1El\s8N#jrs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m +!&FTPrn7;[qu=3DcMm_?k'"?8qu-QprWr/rs8N&Yk5YDYrs&JALO8.^rT!p.~> +nc&mks&K+*!13`^r;Qrurl>Tabl7YBqYgF*EsNEArVc`qs8N#tQ\"u4rp9Xkrr;s?!!3/Js8::E +#5nM7DVkElh>[i]s82iLC +nc&mks&K+*!13`^r;Qrurl>Tabl7YBqYgF*EsNEArVc`qs8N#tQ\"u4rp9Xkrr;s?!!3/Js8::E +#5\@H!58F0h>[l^s7lW#!1El\s8N#jrs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m +!&FTPrn7;[qu=3DcMm_?k'"?8qu-QprWr/rs8N&Yk5YDYrs&JALO8.^rT!p.~> +nc&mms/U?sG0Bp`rr<#t#5nIgIcpb.rr*Z4rr2lns4hM,s8;ors8DorQ%/T/rTsOjrr;tZI"?\/ +s8C@F#5\@H!58F0hZ"#`s82i_Eroh7s82iqp&>9rr;S_VmJm.Urs&E$d/[VTqXORiqYt1.bl@V3 +rs/N&nGk?Er;PFM%K?;'Ujhh4rVcb]NrAqUrYGP3s3-8Lrr96>iVrcSr;HQn_JIp*r8[g-~> +nc&mks&K+*!13`^rr<#t+8c!o'$gOQrVlfrrr2iks0r&Ws8)cps8DorQ%/T/rTsOjrr;s?!!3/J +s8::E#5nM7DVkElhZ!r^s8Duk[WASCs8DQh#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsn +rr;bDRK*9cgA_W]r;<@>nG`Cbs-8WCrVld3s8;o@LXuJ)Z#&Cur;QWmr;XWMg&M!1s*t~> +nc&mks&K+*!13`^rr<#t+8c!o'$gOQrVlfrrr2iks0r&Ws8)cps8DorQ%/T/rTsOjrr;s?!!3/J +s8::E#5\@H!58F0hZ"#`s82i_Eroh7s82iqp&>9rr;S_VmJm.Urs&E$d/[VTqXORiqYt1.bl@V3 +rs/N&nGk?Er;PFM%K?;'Ujhh4rVcb]NrAqUrYGP3s3-8Lrr96>iVrcSr;HQn_JIp*r8[g-~> +nc&mms/U?sG0Bp`rVm0%s4VDDs82iqrVmQ1s8MooR=Fo/rr<#trr8F@q>^H\rsA])rfDMYI-CV/ +dJjFIs*FaZs81^R%fZM*s/6_6!WX[Ts8;orpAYBsr;S_VmJm.Urs&E$d/[VTqXORiqYt1.bl@V3 +rs/N&nGk?Er;PIN&,uP-o6Qi)r;HTnR +nc&mks&K+*!13`^rVm0#s0Vj1s7lWnrVmQ1s8Mim3!ejLrVuosrr8F@q>^H\rsA])rZD1B!7CiE +dJjFKs1N=,s8CjT%fZM+s3udKJp*:0s8DuspAYBsrVrC9pAb-_rs&H%k]3p-r:0dkr;X*Cjo>;M +rs/Q'pjee4rr1[P&,uP-o6Qi)r;HTnR +nc&mks&K+*!13`^rVm0#s0Vj1s7lWnrVmQ1s8Mim3!ejLrVuosrr8F@q>^H\rsA])rZD1B!7CiE +dJjFIs*FaZs81^R%fZM*s/6_6!WX[Ts8;orpAYBsr;S_VmJm.Urs&E$d/[VTqXORiqYt1.bl@V3 +rs/N&nGk?Er;PIN&,uP-o6Qi)r;HTnR +nc&mms/U?sG0Bp`rr3<(r;E^JnbrFcrqud,rr;rsgMjk)qYgBjqtp!Tl2(e`qtc>!IsU5RqU,0E +p\T49])29[q[WQ!qmZV+!rrB&!2TSfr:^!mqYC"I!:'IXo(rXeqp#1KqtKXX#5A"+!6P-6o(r[g +qsFG=qt^*Cq[WQ"r5WZ_qt^-cr6K52m/6kienpHGqu$5;IHpb1"oOs=lMLG +nc&mks&K+*!13`^rr3<(qYXJ2jS\rTrqud,rr;lq[K1aPp\XjcrVcB[l2:qdrVR`;! +nc&mks&K+*!13`^rr3<(qYXJ2jS\rTrqud%rr;lq[K1aPp\amhoC;)B$2XPq*rlc +!&=BHqV1lWr;$92D79?;qtg6:D1V'Ors@7nNrAkQpjISUr;QruSpTc"qW%I'~> +nc&mms/U?sG0Bp`rr<#t"o[VEJr#$Nc2Rir!6 +nc&mks&K+*!13`^rr36%rq6FEs8;llrrrE#rVn,Mh>[U#!!3/Oc2Rj\D<'@M$(6$iIt3$#H]S-q +rrSa=r9jRdm;]H!rrTTIlL+ZRrd^HfrrT]NlMLSg^NGs]l0% +nc&mks&K+*!13`^rr36%rq6FEs8;llrrrE#rVn,Mh>[U$!!3/Uc2Rir!6 +nc&mms/U?sG0Bp`rr36%s6FsFrr)ikrseu+rf_oiiS`_8`5KR2l,3nG`5?J"@pcO[_U6:+^r0OZ +Oi5)n`!!opNrT7X!!9=A_Y1nQ_nj8A!4Kh_o#(aK`1R*&`5(o]#/J/Q!1_!Do#(dM`45jp`50@G +`!!ur_J*ug_uI[T_ZRo1=^M):'OP"'aMGg5_TANW?=I>P@p=Jk_SbBOJ,~> +nc&mks&K+*!13`^rr36$s4IC&rVQThrsJc(r[%ia`5BO6io]2+i8NT6!!*)1ini)A#2eCBEld4t +hr+ariQ$:rJ,Xs%It3%"iSaFgs54(>Q$qBFi:>h2i8N%*UuC5$ih3i8NIAPMtHX +gYiCqiS]HNiS`Yni<8*"T6GY]Ig^XJXQJF!iS`k5H@,X@"b:lhe)0*CiIC~> +nc&mks&K+*!13`^rr36$s4IC&rVQThrs/Q%r[%ia`5DPls24*>$,a^!(]XR:TZ"[o`!4#q?3$,+ +_;E06_8MB7!r;luY/J3N`!=2r`%(hr`5;)`#/S6N!(t2Fn\bXI`(pB'`52#_#K"Ei!%,Y#_qW*4 +_o0E+E;mcT`;d^W`e%?"raHRK=cUS>`5KO7U0M#6@:E_NJ@383il$?~> +nc&mms/U?sG0Bp`rr33"rkiO-s8;Wk#lXc%P^.7bG=-o]rVup!q>^KrJH37]J,~> +nc&mks&K+*!13`^rr32ureU]hs8)Ki"9&5t.f02I7s8_4DZalqD@QRF!aBeacYil0JofXaqg\cu +J:MY0DZY<:E:.WGEe/N'DZY38EpdiIE.E>dDZP$(qJQIRG'A00G5laeEc1ho")`4)GPu^bG5u[A +Dh%~> +nc&mks&K+*!13`^rr32ureU]hs8)Ki"9&5t.Y.Tq!!!&r!!!%N!4i/\~> +nc&mms/U?sG0Bp`rr36%s7(BDrr)ikrsA]'s-A&A\@Sebj`1ZIEcF?'3B(SkERAe2DfRc:<,us8 +EWU6$D>F58!WZkQEV=DXEH#q9!,?Oono=qREa8YqEc:Jg#&eN7!*aJ_no=tTEbbXjEc?$NErU+T +EWC+TDuanTEWC+TDuan9Ee"~> +nc&mks&K+*!13`^rr36$s5X0"rVQThrs\o*s!n(gEcH,CY.D++\-]XS[hf#F!11=+dC9Ci\=7]B +\@:>)"M(siIt.EI!e5[*o=+q4\;YmDn@/\3\?:+B\@;"<#.M+.H*+Tcn@/P-J;_sfs0qg6pp^.1 +pp].jJ,~> +nc&mks&K+*!13`^rr36$s5X0"rVQThrs/Q%s!n(gEcL,["*&@$%fQG0?#jo3EX$H&2ZQftE8P[; +EH5pm!!E?'B5qqbEX-T'EZ"jlEcLYj#&nTg!%W).nT"hPE\7>rEcCSi#B=d"!#BToES,=3E;FST +EVXPREVjbVEVXPREStkf~> +nc&mms/U?sG0Bp`rr39'rV`+Gs8DrrqYp`urVl8:N8=L:RtZcSqT]$AKE06Mrs2X*"T\W+"TXeV +rrG4^mJd7H!,1d"!cJ(omJd1e23Ioh~> +nc&mks&K+*!13`^rr39'r;/,ks8;lqqYp`ur;GLb(u>2p+TMQDg!0Nu_//5ers5WLJq/B&K659* +rrJ^=mJd7WE3ns3!k3+8mJd3;S!!`$~> +nc&mks&K+*!13`^rr39'r;/,ks8;lqqYp`ur;GLb(u>2p+ohZEiQ_B(KE06Mrs2X*"T\W+"TXeV +rrG4^mJd7H!,1d"!cJ(omJd1e23Ioh~> +nc&mms/U?sG0Bp`rVm0$s203RrqufqqYpj!s0c^ar;$9gjSB2YqY?+rIX0uMpsJpBp%in5\bc$V +q?-Nhn-o3p"$lYVq=XRhq=j_D!9j:So(iRbqTT"IqXsCT#5.h(!6G$2o(iUdqWn2:qY0fMqLA~> +nc&mks&K+*!13`^rVm0"s+h!Arql`pqYpcrs(_UsqXsjajnoG^r;.Q9!@jBh#.$* +r!`K#pP!a;I&r;-!^#Q+GlJ=-93qiq#/~> +nc&mks&K+*!13`^rVm0"s+h!Arql`pqYpcrs(_UsqXrkE$2OGn*rl;Np>5WJ +q"jIgqu?gaq"X[Xq?QijqDJ?;qY9XX#5@u=!+5TqnbNI_qIKZJqY0RW#Pe/^!&=?Eq3:`+~> +nc&mms/U?sG0Bp`rr<#t#6"4FV>pMlrr)otrr*3$rU,,mp\t0lrr2lo!ri6!mJdLls8J+-JUH\] +rR(WLqYtmB^&Ruerso&.rVY37,o9$Tp&=pirq??srqudU!:Bgbo)Apls3UgTs8)9c#5\@4!6kK@ +o)Asns7$(Es8;lLrrN-!rVcitrr)itrr;rr!WW/ss82crs8Moq!WN,rrWW?$s8W)urr)rurq?AB~> +nc&mks&K+*!13`^rr39'rVc$k;uZ[krr)otrr*3"r8%etnbrFdrr2lo!ri6!mJdLls8F,@!W^XJ +r6bNKr;XHJhZ*Q3rs\o,rr)-(Nf0R1qYpHcrs/Q%s."N2s8MTh#6"ScEj5TAnc&gks0H_,s8DNg +#QFbuJ=6H:rn7;Prr;rr!WW/trrN-!rVcitrqufnrW3&uqu6]rs82d!s8N&urr;us!WW/ms*t~> +nc&mks&K+*!13`^rr39'rVc$k;uZ[krr)otrr*3"r8%etnbrFdrr2lo!ri6!mJdLls8F,@!W^XJ +r6bNKqYtmB^&Ruerso&.rVY37,o9$Tp&=pirq??srqudU!:Bgbo)Apls3UgTs8)9c#5\@4!6kK@ +o)Asns7$(Es8;lLrrN-!rVcitrr)itrr;rr!WW/ss82crs8Moq!WN,rrWW?$s8W)urr)rurq?AB~> +nc&mms/U?sG0Bp`r;Qots28ZPrr3E*rr2lorr<#-CWQPRrr2usr;Zfr!WW/ersA])rfDMYI-CV/ +dJjFIs*FaZs81[Q#6+Z%s8VZPrr3'!s8M]k#QFZ$2ur@GrUTsmr;Y.E@K62ors&?"B)p0Ur:9jm +rVuBf1B7:Oe,K^Qs8N&urr<#tqYpZss8Doprr`9!s8Muss8N&srVuor!WW/es*t~> +nc&mks&K+*!13`^r;Qors+p_Xrr3E(rVcWirVun:!0R9rrVrC9pAb-_rs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q' +pjee4rr1CH#lal's8W)us8Mlp"9/?!rVc`urr)lrrVuoss8Dors8;uurpKf:~> +nc&mks&K+*!13`^r;Qors+p_Xrr3E(rVcWirVun:!0R +nc&mms/U?sG0Bp`rVuos#5nM0Co-.fqu7;dTlQ:irVlfrrVu<(`l-"!s8MEc$3'u(OF2V,kl:V/ +rs&?"HN:bZqq_;PrWrK"s8Vuorr;uirs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m +!&FTPrn7;Vrr;igp&4pirVuos'*%\!r;Zcqs8Muss7c9_p&G'jrr3`4s8W&ts7Z6_p](9ls8W)u +qXsddrq?AB~> +nc&mks&K+*!13`^rVuos#5eF:!)gl1qu7;F8cU1+r;HWprVu<(`l-"!s8MEc$3'u(+92HCdJs-l +rs&E$]l)^,rS@J\rr;urs8W&rrr;uirs/Q%s."N2s8MTh#6"ScEj5TAnc&gks0H_,s8DNg#QFbu +J=6H:rn7;Vrr;igp&4pirVuos'*%\!r;Zcqs8Muss7c9_p&G'jrr3`4s8W&ts7Z6_p](9ls8W)u +qXsddrq?AB~> +nc&mks&K+*!13`^rVuos#5eF:!)gl1qu7;F8cU1+r;HWprVu<(`l-"!s8MEc$3'u(+92HCdJs-l +rs&?"HN:bZqq_;PrWrK"s8Vuorr;uirs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m +!&FTPrn7;Vrr;igp&4pirVuos'*%\!r;Zcqs8Muss7c9_p&G'jrr3`4s8W&ts7Z6_p](9ls8W)u +qXsddrq?AB~> +nc&mms/U?sG0Bp`qu?]p*qPA.G`9f6n'&/;FF(1\rr)lsrVt2mD/='-Yl=V#mf*Ums8J+-JUH\] +rR(WLqYtmB^&RuarrrE%rVccqnc&jnr;S_VmJm.Urs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?E +r;PCL3W/odI=n'brVlisrr)l&J:?,MrVulrs4XQ)It3$@irArUrr;urs3.9eJ:N'IkPtM[r;XNR +huEZKs*t~> +nc&mks&K+*!13`^qu7f:rTGC)!$RWbi0nX_!!$]krqufrrVt2mD/='-Yl=V#mf*Ums8F,@!W^XJ +r6bNKr;XHJhZ*Q/rrrE%rr2rsnc&jnrVrC9pAb-_rs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4 +rr1UN3W/odI=n'brVlisrr)l&J:?,MrVulrs4XQ)It3$@irArUrr;urs3.9eJ:N'IkPtM[r;XNR +huEZKs*t~> +nc&mks&K+*!13`^qu7f:rTGC)!$RWbi0nX_!!$]krqufrrVt2mD/='-Yl=V#mf*Ums8F,@!W^XJ +r6bNKqYtmB^&RuarrrE%rVccqnc&jnr;S_VmJm.Urs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?E +r;PCL3W/odI=n'brVlisrr)l&J:?,MrVulrs4XQ)It3$@irArUrr;urs3.9eJ:N'IkPtM[r;XNR +huEZKs*t~> +nc&mms/U?sG0Bp`r;Rr>s8Due[$Q;]G^"1GEL,khs8N&ur;PMrI)XXaO)MQ.r9jRkrr;tZI"?\/ +s8C@F#5\@H!58F0`W$2Br;S_VmJm.Urs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;PCL3W&i_ +F*rN2s8N#trVlMJI!*s=r;QZlcZjN!R$`bJIcCD*s8Mus_ejagR$a:eGKKm`r;XBFh>dEHs*t~> +nc&mks&K+*!13`^r;R$$s8;oTEAmpq!#%3=s8W&ts8;lPGC7B[dZ8=Vs8; +nc&mks&K+*!13`^r;R$$s8;oTEAmpq!#%3=s8W&ts8;lPGC7B[dZ8=Vs8; +nc&mms/U?sG0Bp`qu6`ss8N#t''m`8U<;HPs8W&ss8N#qs0QRYrr3,^FeSg5mf*Ums8J+-JUH\] +rR(WLqYtmB^&RuKrs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;hr;X-K +X*2tkr;Zcprn2LFGLc`lr;Y&YOlHB?%._u)J)^M,rVl)+T^2RV$eT`Rm/Hn^]PcU+r:^/@~> +nc&mks&K+*!13`^qu6`ss8Drs'%i^J9:!N3s8Vups8N#qs0QRYrr3,^FeSg5mf*Ums8F,@!W^XJ +r6bNKr;XHJhZ*Pnrs/Q%s."N2s8MTh#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn7;hr;X-K +X*2tkr;Zcprn2LFGLc`lr;Y&YOlHB?%._u)J)^M,rVl)+T^2RV$eT`Rm/Hn^]PcU+r:^/@~> +nc&mks&K+*!13`^qu6`ss8Drs'%i^J9:!N3s8Vups8N#qs0QRYrr3,^FeSg5mf*Ums8F,@!W^XJ +r6bNKqYtmB^&RuKrs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;hr;X-K +X*2tkr;Zcprn2LFGLc`lr;Y&YOlHB?%._u)J)^M,rVl)+T^2RV$eT`Rm/Hn^]PcU+r:^/@~> +nc&mms/U?sG0Bp`qYp]ts8MurqZ$Tp&c_k1s8N&ulKJ'Br;?87U]15[rsA])rfDMYI-CV/dJjFI +s*FaZs80e8#QFZ$2ur@GrUTsmr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Og&F)1s0QpqI]3;F +rr;orXF$:Uec5RHm +nc&mks&K+*!13`^qYp]ts8DloqYq6.rVulss8N&ulKJ'Br;?87U]15[rsA])rZD1B!7CiEdJjFK +s1N=,s8Bq:#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cg&F)1s0QpqI]3;F +rr;orXF$:Uec5RHm +nc&mks&K+*!13`^qYp]ts8DloqYq6.rVulss8N&ulKJ'Br;?87U]15[rsA])rZD1B!7CiEdJjFI +s*FaZs80e8#QFZ$2ur@GrUTsmr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Og&F)1s0QpqI]3;F +rr;orXF$:Uec5RHm +nc&mms/U?sG0Bp`q>^Em!;ufms8;ipq#:Qqs4VIjs8;^ +s8)`#ER=a_s8N!:qu+$@\c2I)a)''$qu-KmrVl?arql`.DVkElpA]X~> +nc&mks&K+*!13`^q>^Em#5\,hp\=R[rVlTl#5eGSEMrj7mf*Ums8F,@!W^XJr6bNKr;XHJhZ*Pn +rs/Q%s."N2s8MTh#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn7;ir;X0Ckam>"s8DrqoS8I? +DV+pbrj$Ojs82iqrYtb5\88_TqYnNOcN!e?rVlcpnb`=_s1E7+s8DZkJ,~> +nc&mks&K+*!13`^q>^Em#5\,hp\=R[rVlTl#5eGSEMrj7mf*Ums8F,@!W^XJr6bNKqYtmB^&RuK +rs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;ir;X0Ckam>"s8DrqoS8I? +DV+pbrj$Ojs82iqrYtb5\88_TqYnNOcN!e?rVlcpnb`=_s1E7+s8DZkJ,~> +nc&mms/U?sG0Bp`qYpZss8Mums8W'1s8N&urr2rsrVl`pplL$qrr)9b$3'u(OF2V,kl:V/rs&?" +HN:bZqo/R?rqudU!:Bgbo)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lLru1h8[;P?TCXrF] +r;PGe[``F;s8MY;T)\`grr2p*rVtl%Nr/eTc>f3BrVlosrr2p%r;XEIhZ*QJs*t~> +nc&mks&K+*!13`^qYpZss8DijrtGD1s8N&urr2rsrVl`pplL$qrr)9b$3'u(+92HCdJs-lrs&E$ +]l)^,rPedArr)keIJ3^?o)Apms6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N#Nru1h8[;P?TCXrF] +r;PGe[``F;s8MY;T)\`grr2p*rVtl%Nr/eTc>f3BrVlosrr2p%r;XEIhZ*QJs*t~> +nc&mks&K+*!13`^qYpZss8DijrtGD1s8N&urr2rsrVl`pplL$qrr)9b$3'u(+92HCdJs-lrs&?" +HN:bZqo/R?rqudU!:Bgbo)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lLru1h8[;P?TCXrF] +r;PGe[``F;s8MY;T)\`grr2p*rVtl%Nr/eTc>f3BrVlosrr2p%r;XEIhZ*QJs*t~> +nc&mms/U?sG0Bp`qu7<.s8N&urSl/!VR,=Bs8W#ss8N#ts8E<&s65qhcN!kBmf*Ums8J+-JUH\] +rR(WLqYtmB^&RuKrs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;gr;X3D +kOEbps8DipY\`=AC=rRdoR!50r;HZqrYkb7OG<]5rq_^qN2=JLp](9krr;lq]PcU+rV$8A~> +nc&mks&K+*!13`^qu7<.s8DutrPkL+:M.Yds8Vrqrr2oss8E<&s65qhcN!kBmf*Ums8F,@!W^XJ +r6bNKr;XHJhZ*Pnrs/Q%s."N2s8MTh#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn7;gr;X3D +kOEbps8DipY\`=AC=rRdoR!50r;HZqrYkb7OG<]5rq_^qN2=JLp](9krr;lq]PcU+rV$8A~> +nc&mks&K+*!13`^qu7<.s8DutrPkL+:M.Yds8Vrqrr2oss8E<&s65qhcN!kBmf*Ums8F,@!W^XJ +r6bNKqYtmB^&RuKrs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;gr;X3D +kOEbps8DipY\`=AC=rRdoR!50r;HZqrYkb7OG<]5rq_^qN2=JLp](9krr;lq]PcU+rV$8A~> +nc&mms/U?sG0Bp`r;RK1s8Due\!(iQG'7kDEgZ1mr;Q`qrr39%s3u78bl@V?mJdLls8J+-JUH\] +rR(WLqYtmB^&RuKrs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;gr;X3E +j8YEso`"dcRt1CUCY8[dn9U`+rVZ]prYU]OrVl`olCW< +nc&mks&K+*!13`^r;R!#s8;oUFYERk"uk06qu6Wprr39%s3u78bl@V?mJdLls8F,@!W^XJr6bNK +r;XHJhZ*Pnrs/Q%s."N2s8MTh#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn7;gr;X3Ej8YEs +o`"dcRt1CUCY8[dn9U`+rVZ]prYU]OrVl`olCW< +nc&mks&K+*!13`^r;R!#s8;oUFYERk"uk06qu6Wprr39%s3u78bl@V?mJdLls8F,@!W^XJr6bNK +qYtmB^&RuKrs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;gr;X3Ej8YEs +o`"dcRt1CUCY8[dn9U`+rVZ]prYU]OrVl`olCW< +nc&mms/U?sG0Bp`qu?]p&G2!"GGE7Hm`Vo5EJ`3Frr2os$N0qRE00;`r;Q`qmf*Ums8J+-JUH\] +rR(WLqYtmB^&RuKrs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;gr;X3D +i;UW1f)G^9FJo,SD:nmggi]:irVZ]prYU]Or;Z`ns8Ui[T7V<(KZO)jqu= +nc&mks&K+*!13`^qu?]o&EtG?!)Ja4hNr(S!#_d9rVlfr$N0qRE00;`r;Q`qmf*Ums8F,@!W^XJ +r6bNKr;XHJhZ*Pnrs/Q%s."N2s8MTh#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn7;gr;X3D +i;UW1f)G^9FJo,SD:nmggi]:irVZ]prYU]Or;Z`ns8Ui[T7V<(KZO)jqu= +nc&mks&K+*!13`^qu?]o&EtG?!)Ja4hNr(S!#_d9rVlfr$N0qRE00;`r;Q`qmf*Ums8F,@!W^XJ +r6bNKqYtmB^&RuKrs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;gr;X3D +i;UW1f)G^9FJo,SD:nmggi]:irVZ]prYU]Or;Z`ns8Ui[T7V<(KZO)jqu= +nc&mms/U?sG0Bp`r;R!#r;X6BUu;+L%GQ;I_#F<3s8DuIFd;acrsA])rfDMYI-CV/dJjFIs*FaZ +s80h9s8E6!q_nN>r;H3d#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;hr;X3EirA@hVuQb5 +DUna'CtSdep3`J1rVlcqs8E0"O,*]5rr3T0s8W)he$!t5aoD5;]PcU+rV$8A~> +nc&mks&K+*!13`^rVuos"oJ=;!)LN/rscI?!.b%Frr;rse9.&Okl1tgs8F,@!W^XJr6bNKr;XHJ +hZ*Pos8W'&r;E+5o_nd[rs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr1UN)>sNCE8poaGGkK? +_J[p'_JIm)rq:`2rVc`os8W'$rJua4rr2p0rr<#to$addDTVqTs1E7+s8DZkJ,~> +nc&mks&K+*!13`^rVuos"oJ=;!)LN/rscI?!.b%Frr;rse9.&Okl1tgs8F,@!W^XJr6bNKqYtmB +^&RuLs8W'&qYN2Ol2:MNrs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;PCL)>sNCE8poaGGkK? +_J[p'_JIm)rq:`2rVc`os8W'$rJua4rr2p0rr<#to$addDTVqTs1E7+s8DZkJ,~> +nc&mms/U?sG0Bp`r;RrUs8;Hf#Q=\m!&FTPrn7<$ +r;X3Ej8]"EJb8u.K_,5\D:nmgnp$o/r;Zcrs8N#rs,r'4s6Qc5rqu]mrsI5+PQ1O[]PcU+rV$8A~> +nc&mks&K+*!13`^r;Rr:s,-kWrr;onrVcWir;Xo4!6>*9r;PZ#LZ%O_lfmp=rpKdmrr;s?!!3/J +s8::E#5nM7DVkEla8ZJFs8DutSUCD9r:9jlrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cg&EQ" +s0cn,s8/48o`(51oDc[Ef`2!BGbY69s8N&urr2lrP(``4m&JJ4r;?Nn$IaQis82i/DVkElpA]X~> +nc&mks&K+*!13`^r;Rr:s,-kWrr;onrVcWir;Xo4!6>*9r;PZ#LZ%O_lfmp=rpKdmrr;s?!!3/J +s8::E#5\@H!58F0a8ZMGs8;os3ro0XqYp*d#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7<$ +r;X3Ej8]"EJb8u.K_,5\D:nmgnp$o/r;Zcrs8N#rs,r'4s6Qc5rqu]mrsI5+PQ1O[]PcU+rV$8A~> +nc&mms/U?sG0Bp`rr<#t#lXFKV>gGkrr2oss8E]0s71H1rqu`pQ>V%mF*)P?S,`ESrsA])rfDMY +I-CV/dJjFIs*FaZs80n;%0$;(s4_E'!)CQ6rVlHh#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTP +rn7<3r;X3EjT#7tD;+T)WW3"9D:nmcqjr2prqufqrr;orfQOCrr;D/"s8Doqrqu`pL6;N6s1E7+ +s8DZkJ,~> +nc&mks&K+*!13`^rr39'rVc$n<;lalrr)otrr*T-s5aSXrqlZoQ>V%mF*)P?S,`ESrsA])rZD1B +!7CiEdJjFKs1N=,s8C%=%0$;*s6d4II\l*)rr2Qi#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H: +rn7<3r;X3EjT#7tD;+T)WW3"9D:nmcqjr2prqufqrr;orfQOCrr;D/"s8Doqrqu`pL6;N6s1E7+ +s8DZkJ,~> +nc&mks&K+*!13`^rr39'rVc$n<;lalrr)otrr*T-s5aSXrqlZoQ>V%mF*)P?S,`ESrsA])rZD1B +!7CiEdJjFIs*FaZs80n;%0$;(s4_E'!)CQ6rVlHh#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTP +rn7<3r;X3EjT#7tD;+T)WW3"9D:nmcqjr2prqufqrr;orfQOCrr;D/"s8Doqrqu`pL6;N6s1E7+ +s8DZkJ,~> +nc&mms/U?sG0Bp`rVm0$s2Js=s8;orr;R6*s82i'E97,us0\l.XT#=(W5S`7mf*Ums8J+-JUH\] +rR(WLqYtmB^&RuMrr`3!bRsaQ!h0/do`#-ns3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lLru(b7 +[W(:,rp=d5c>(r0s2&X*s8)c;DjgS'rVRW7pl0CIs8)c0FPd≺?Hjre6R9r;XEIhZ*QJs*t~> +nc&mks&K+*!13`^rVm0"s,I*(s8)cpr;R6*s7lV,!6bE>s0\l.XT#=(W5S`7mf*Ums8F,@!W^XJ +r6bNKr;XHJhZ*PprsSf*k(Il+J9Z:^s8DTi#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn7;h +r;X3Ej8],GF0j/,f)G]dD:nmbs2f2IrVlcn)uo\mFP$Qhs1WU3s82`lqu-MJPQ1R\]PcU+rV$8A~> +nc&mks&K+*!13`^rVm0"s,I*(s8)cpr;R6*s7lV,!6bE>s0\l.XT#=(W5S`7mf*Ums8F,@!W^XJ +r6bNKqYtmB^&RuMrr`3!bRsaQ!h0/do`#-ns3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lLru(b7 +[W(:,rp=d5c>(r0s2&X*s8)c;DjgS'rVRW7pl0CIs8)c0FPd≺?Hjre6R9r;XEIhZ*QJs*t~> +nc&mms/U?sG0Bp`rr39'rVDqBqYgBlqYpj#rVl86T_nWaq#B^W$2OGnNHotujSJZ!q?HWhGQ>;N +p;m(>q"`AO!!E9%!s&DCqY9a[#5@u=!+5TqnbNI_qIKZJqY0RW#Pe/^!&=?Eq:YT^p\M15i;33B +Q%"I?oD/6tCXi4Uq"pXsVY'ie$h'QuXo.qfqT*6,kktGf[:m;Np%l17gA:U +nc&mks&K+*!13`^rr39'r:Vrkp&+dfqYpj#r;GOc6ML6Nq#:BmrU0Riqu$=5!!*)Gr;"b<#5S2/ +DVY0daSZMEr98l]Jq/?&IsL,Qqt9jkqY]JrYPe4dr!)upZ>nq&qXXOhqu$/ +nc&mks&K+*!13`^rr39'r:Vrkp&+dfqYpj#r;GOc6ML6Nq#B^W$2OGn*rl;N +p;m(>q"`AO!!E9%!s&DCqY9a[#5@u=!+5TqnbNI_qIKZJqY0RW#Pe/^!&=?Eq:YT^p\M15i;33B +Q%"I?oD/6tCXi4Uq"pXsVY'ie$h'QuXo.qfqT*6,kktGf[:m;Np%l17gA:U +nc&mms/U?sG0Bp`rr36&s87; +nc&mks&K+*!13`^rr36%s7cRZs8;lkrri?"s!Ij'rraJF!W^ltrrU#QjM_')`H-Z]J:N-#G-UT; +!q1*7mJd6rDsZlk!J$WgrrTcLli-ndb]e69rr3&@CYo$i$hp'3N4HI/[>/n"rVZ[&bCkAL\[]2L +Ga@n!rrTuPjn/S'~> +nc&mks&K+*!13`^rr36%s7cRZs8;lkrri?"s!Ij'rraMG!W_0'rrRiRbJaD^M?!hY!!36&A+BR# +huIHXrrR' +nc&mms/U?sG0Bp`rr36$rmc&;rr)ikrsAZ'rf_f4XKS1$i`cUC/1rJP>?]EY#$G.]!(0soaBJaM +>7pu7!!E<&*a;e?>6\888cU&>=n,]#=^*-O8R#Bh>6\881d$s>$F9@;-R4.;_9Ll>?P0" +-V[fK>?Y?-.kLZF"XP`O;dET*>6AA".OP-?$RRQ0?<^T;6RY`7>4u0N~> +nc&mks&K+*!13`^rr36"ri6*urql]irrrB#r?qhQr`]J4T2nZ<"sXce"+XfV#o!ipj-eu]gkXcn(+XfSY%IsmihX0%b7 +T<52sXK\=FIf=KoGCP( +nc&mks&K+*!13`^rr36"ri6*urql]irrrB#r?qhQhHKsfrW!!l>?]EY#$G.]!(0soaBJaM>7pu7 +!!E<&*a;e?>6\888cU&>=n,]#=^*-O8R#Bh>6\881d$s>$F9@;-R4.;_9Ll>?P0"-V[fK +>?Y?-.kLZF"XP`O;dET*>6AA".OP-?$RRQ0?<^T;6RY`7>4u0N~> +nc&mms/U?sG0Bp`rr33#s3P]7rquNj#laf%Q$ILlHV&bgk5YJ_JH3dlJ,~> +nc&mks&K+*!13`^rr33!s.]RrrqcBh"9/8u/,K;J:3ppDEs$H(EXr'K!ag4md;oM6F*`C]F*,KE +"E\^4JUdZLs*k-$H?43$Es?`-G(G!]FRaDVFE;e[G&qcpErpH6IF`HWFE;\TF`VYGFa\[]F*)JJ +IWfdSF*)JHI=;'Cs*XrkF*.A%!c`L6r-f!#FE;MFF*N+VF*.+sJ,~> +nc&mks&K+*!13`^rr33!s.]RrrqcBh"9/8u.tI][!!!%N!6G4k~> +nc&mms/U?sG0Bp`rr36&s87JCs8DrlrsA]'rf_iolKR]fime6XBP_A!e^W!s#1:t6!1q`haOLF@ +eq3r+r;Zs%!3"Gsp!j8qeZSsMe^ +nc&mks&K+*!13`^rr36%rqQXas8;llrs\o*rVn2FcdpUrf^7qdl3Z_?koBa)!5Rp`dHUr"lEbHT +lKH=S%Hm#mFG#*nJ:E)reEZ8jl3?J;f6!tVkjdpBkj#0heEZ8gl3HS=jFEK[l06gb!U8hGlMp&J +l2KrLl0.C0l2^)EkQ'lDl2^)Fkks]Hl0.a(J,~> +nc&mks&K+*!13`^rr36%rqQXas8;llrs8W&rVn2FcdpV(eHQol!\ieHXORaoEm@e(3%MeC4?Gs3gttrm_&!e,%Vj +e+qMoeG@YleH+1Ko@8?~> +nc&mms/U?sG0Bp`rr39'r;ERQrr)fpq>UTrs4hUch>[VDJVJaGc2Riq!5uhU#l-^c!WrN/!'B]M +!ndQbmJd6'!7^H:!rDsSOoKq~> +nc&mks&K+*!13`^rr39'qYX52rVQQmq>UTps0r(nh>[U#!!3/Nc2Rj[D;iG5#lC37JV&H*Fe/%% +!pjp4mJd6qE9Zfj!r[Y +nc&mks&K+*!13`^rr39'qYX52rVQQmq>UTps0r(nh>[U$!!3/Rc2Riq!5uhU#l-^c!WrN/!'B]M +!ndQbmJd6'!7^H:!rDsSOoKq~> +nc&mms/U?sG0Bp`rVm0%s4DDJs8;orqu7!%qu3(1j8JlRrT*k_qu$>OH@L8&r;+h=#5A%@!5&1( +a8?)9s2l_jrW!$Dh#7*Ar!)upcN%ANp[S.cp\\V'b5D)+r!3)rmJo!>q>6ESJ,~> +nc&mks&K+*!13`^rVm0#s0;X7s7u]orVm3's8Mim4:'"*q>U!7:]@dJX:GrOd%( +rVO\7%0$/(jc4h6G]Jc1rVZ +nc&mks&K+*!13`^rVm0#s0;X7s7u]orVm3's8Mim4:'"*q;V;Yqu$=5!!*)Gr;"b<#5A%@!5&1( +a8?)9s2l_jrW!$Dh#7*Ar!)upcN%ANp[S.cp\\V'b5D)+r!3)rmJo!>q>6ESJ,~> +nc&mms/U?sG0Bp`rr<#t(]=9!Id$h/rVlfrrr2lns4qS-s82iqs8;irrVlf`rsA])rfDMYI-CV/ +dJjFIs*FaZs80n;%K?D,s8U)mQ)imDr;Zchrs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\ +J,~> +nc&mks&K+*!13`^rr<#t#Q+HT'%$[Squ$F#r;$B)!.4bBs8N&rrW)orrpB^lrr;s?!!3/Js8::E +#5nM7DVkElaSu_Ks8N&uikNX`nGiIerq69qrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^rr<#t#Q+HT'%$[Squ$F#r;$B)!.4bBs8N&rrW)orrpB^lrr;s?!!3/Js8::E +#5\@H!58F0aSu_Ks8N&u`eB\YiW&iUrq69qr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`r;R0'ro/B\k5YJ\r;?Qnrs65^L%>3@rr;umrrE&drsA])rfDMYI-CV/dJjFI +s*FaZs80k:"9/?!rquctrVulhrs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mks&K+*!13`^r;R-%rl,E`ci=%EqYL0j#^6=^k55,Vs8Mfn!<2Ed$3'u(+92HCdJs-lrs&E$ +]l)^,rQ"p?rr;usr;Qits8MZj#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^r;R-%rl,E`ci=%EqYL0j#^6=^k55,Vs8Mfn!<2Ed$3'u(+92HCdJs-lrs&?" +HN:bZqoA^=rr;rrr;Qiss8MZj#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rVm3's8;oJDh>@Hrr2p3q

    +nc&mks&K+*!13`^rVm0&s8)bq!" +nc&mks&K+*!13`^rVm0&s8)bq!" +nc&mms/U?sG0Bp`r;Zfrs83nEH#7Ph^qlLlIW;Rks8Dusrr)ksDLmRkG1$ +nc&mks&K+*!13`^r;Zfrs7u_0rW!fkJUo`g!!$I-s8Dusrr)ksDLmRkG1$ +nc&mks&K+*!13`^r;Zfrs7u_0rW!fkJUo`g!!$I-s8Dusrr)ksDLmRkG1$ +nc&mms/U?sG0Bp`qZ$Tp*WP0BW.Ji$KT_DNs8;iqrr;org2)r?r8W'js8DrbrsA])rfDMYI-CV/ +dJjFIs*FaZs8/u!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^qYqZ:rVss/:^d=(#ULk0s82`orr;org2)r?r8W'js8DrbrsA])rZD1B!7CiE +dJjFKs1N=,s8B,##6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^qYqZ:rVss/:^d=(#ULk0s82`orr;org2)r?r8W'js8DrbrsA])rZD1B!7CiE +dJjFIs*FaZs8/u!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`qu6cts8N#srr_oGf^o+Bs8ET0rr;urrk" +nc&mks&K+*!13`^qu6cts8Murrr_Sr[cdYi')hh0rr;urrk";Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^qu6cts8Murrr_Sr[cdYi')hh0rr;urrk" +nc&mms/U?sG0Bp`qZ$Qo!r`&rrVuos!<)ors8N)ur;R$$s3PP_s8DrbrsA])rfDMYI-CV/dJjFI +s*FaZs8/u!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^qZ$Qo!rVonrVuos!;uiqs8N)ur;R$$s3PP_s8DrbrsA])rZD1B!7CiEdJjFK +s1N=,s8B,##6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^qZ$Qo!rVonrVuos!;uiqs8N)ur;R$$s3PP_s8DrbrsA])rZD1B!7CiEdJjFI +s*FaZs8/u!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`q>UWts8Muprr2rtquQcqr;R0(s8MrqmZr@$s8N#brsA])rfDMYI-CV/dJjFI +s*FaZs8/u!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^q>^Ko"9&/orVlisq?$Torr)j)rr;uqrpH)%W;lkrmJdLls8F,@!W^XJr6bNK +r;XHJhZ*PWrs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^q>^Ko"9&/orVlisq?$Torr)j)rr;uqrpH)%W;lkrmJdLls8F,@!W^XJr6bNK +qYtmB^&Ru4rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`qu?]q!WW,ss8VThp&=snrVlirr;R*%rn`6KS_j/@rpKdmrr;tZI"?\/s8C@F +#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^qu?]q!WW)rs8V3]m/I"er;Q`qr;R*%rn`6KS_j/@rpKdmrr;s?!!3/Js8::E +#5nM7DVkElY5\_)s6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^qu?]q!WW)rs8V3]m/I"er;Q`qr;R*%rn`6KS_j/@rpKdmrr;s?!!3/Js8::E +#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`q>V!(s7b +nc&mks&K+*!13`^q>V!(s6m[149,?k?XLkRr;HZprX8c)r;HZnf9gL:rr)9b$3'u(+92HCdJs-l +rs&E$]l)^,rN?/)rVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^q>V!(s6m[149,?k?XLkRr;HZprX8c)r;HZnf9gL:rr)9b$3'u(+92HCdJs-l +rs&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`r;Zfr&H)OOMK<]fU8!H_EH9)!s8Mio#6+YbFgV2Hmf*Ums8J+-JUH\]rR(WL +qYtmB^&Ru4rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mks&K+*!13`^r;Zfr$2X[i+TMKF6UVLb!!A5\s8Dcn#6+YbFgV2Hmf*Ums8F,@!W^XJr6bNK +r;XHJhZ*PWrs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^r;Zfr$2X[i+TMKF6UVLb!!A5\s8Dcn#6+YbFgV2Hmf*Ums8F,@!W^XJr6bNK +qYtmB^&Ru4rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`qu7<,s5S9FRagm-s75:%P]NPkrr)iq$JEVnrVHEdH(Y*7mf*Ums8J+-JUH\] +rR(WLqYtmB^&Ru4rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mks&K+*!13`^rVmT2s82i9!!#'_jT#8Ad&So%8*p9Rrr*8XbOYW.qtPH/rr)9b$3'u(+92HC +dJs-lrs&E$]l)^,rN?/)rVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^rVmT2s82i9!!#'_jT#8Ad&So%8*p9Rrr*8XbOYW.qtPH/rr)9b$3'u(+92HC +dJs-lrs&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`r;Zfq#k3t#d/O(FrVc`q$i6N6Qh^OYqu=08Z2Xb+eT@birU0[lrr;tZI"?\/ +s8C@F#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^r;Zfq#i[E9V#C>nqtpBm$hZpg1%P5?qu=08Z2Xb+eT@birU0[lrr;s?!!3/J +s8::E#5nM7DVkElY5\_)s6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^r;Zfq#i[E9V#C>nqtpBm$hZpg1%P5?qu=08Z2Xb+eT@birU0[lrr;s?!!3/J +s8::E#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`rVm<*r;WX4eGoLGrr<#trr!K0b%o9%r;HWYKm'N,[XN>Vrr)9b$3'u(OF2V, +kl:V/rs&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rVn)@qYs=kVuQ\lrVliqr;6ElQ2m?QqYgEWKm'N,[XN>Vrr)9b$3'u(+92HC +dJs-lrs&E$]l)^,rN?/)rVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^rVn)@qYs=kVuQ\lrVliqr;6ElQ2m?QqYgEWKm'N,[XN>Vrr)9b$3'u(+92HC +dJs-lrs&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`rVm3&s5\:Fs82fqrr2p4rr;rqr/HI"rr)fqjF_AiDM6+1rVl6b$3'u(OF2V, +kl:V/rs&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rr3?)r;Oh=QN-aZs8N#t(&n73rV.]Xi;NTPs5\fNE,L?Mrr)iarsA])rZD1B +!7CiEdJjFKs1N=,s8B,##6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^rr3?)r;Oh=QN-aZs8N#t(&n73rV.]Xi;NTPs5\fNE,L?Mrr)iarsA])rZD1B +!7CiEdJjFIs*FaZs8/u!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rr36&qu3jUqu-Kirt>>2r;Y)YXS_klqYoa4h:_8sq<[qaq>0oHH%(&!qY9.J +!;lcpo)Apjs*FaZs8/u!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr39'q>FkAq"t$hqu7<.s8)bd!*]0kqY:'UgYgiVs820\$2aYt*rl;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rr39'q>FkAq"t$hqu7<.s8)bd!*]0kqY:'Sg"k?Ms7u$X$2OGn*rlgElrpp'nqYtmB^&Ru4rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`rr<#t"oX:Gs8DrmrrrE#rVMV-h>[VIKo:Z]ci44Gs*FaZs8/u!#5nMK!+Gp( +nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr36%rqm<_s8;llrrrE#rV%B[U$!!3/Rci44Is1N=,s8B,##6"ScEj5TA +nc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^rr36%rqm<_s8;llrrrE#rV%B[U%!!3/Zci44Gs*FaZs8/u!#5nMK!+Gp( +nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rr36$s4q_>rr)ikrsJc(s-/#L_8Ej?L&QbfKa(196U?!OK][slL4c2srVlBf +#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^rr36#s1A?$rql]irrrE#s!\,(re1N5]#)7u_ +nc&mks&K+*!13`^rr36#s1A?$rql]irrrE#s!\,(rIt3'k(O!N!!*(:KnSTB"bqZ'qu-Nbrs&?" +HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`rr33#rlK'2rquNj#lXc%P^%(\F[*M=!n[GLo)Apjs*FaZs8/u!#5nMK!+Gp( +nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr33!rfmPmrqcBh"9&5t/,K;J7!*2-D$+TkC^p@D!a0PZj_Y-?GO#2+o)Apl +s1N=,s8B,##6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^rr33!rfmPmrqcBh"9&5t/%5K[fDb^=rs&?"HN:bZql]r'r;Y.E@K62ors&?" +B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`rr36%s7q&Brr)ikrsA]'s-/&bg"=rcjg,9!Za+.D>$%K*ZKJOuYd6Lpf`1j> +rs&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rr36$s764jrqucjrsJc(s!\,TZa-pHf]Linf\+mr!!*)*g=GH?#1qP#GjGD- +o)Apls1N=,s8B,##6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^rr36$s764jrqucjrs/Q%s!\,TZa/Vt$*pnC('"@8PI%OWZNdY?4p'C:qssak +qYtmB^&Ru4rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`rr<#t!r@t@rquirqYp`urVcGHL>Dk4R=pEMpZ)8V=od:Ur:9jlqYtmB^&Ru4 +rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mks&K+*!13`^rr<#s#5'&arVZWnqYp`urVc.&%,Lpd+TMQDfAll6XE;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rr<#s#5'&arVZWnqYp`urVc.&%,Lpd+ohZEhW+V==od:Ur:9jlqYtmB^&Ru4 +rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`rVm*!s1EF=rVcTm$NC)'s28W^r;-BjrVQWklMCnaqtc:uIsU2Qq<.VZpA7bg +g&M!@rs&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rVm)ts*Fn"r;6?j#lal"s+UMpqY1!drr)lplMV%erVR`;! +nc&mks&K+*!13`^rVm)ts*Fn"r;6?j#lal"s+UMpqY0mas8)$X$2XPq*rl +nc&mms/U?sG0Bp`rr;us#OH`Js8;lrrr2p(rr;rsq1Fk)rVlfr!ri6!kl1tgs8J+-JUH\]rTF1b +qYsOqgAh*Ars&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rr3?)rVkLQHiNp?s8N#t$3'u%s7.!Xn,3.`rrW3"roj@grr;s?!!3/Js8;'[ +#5nM$FmT/,o)Apls1N=,s8B,##6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^rr3?)rVkLQHiNp?s8N#t$3'u%s7.!Xn,3.`rrW3"roj@grr;s?!!3/Js8;'[ +#5\@"!8@JNo)Apjs*FaZs8/u!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`r;RK/s0HFUs8W&rrr2lpr;ZN$CtSdcr;Zfr"S_0\s8MEc$3'u(OF2V,kl:VE +rs&?"<<1bQr:9jlqYtmB^&Ru4rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mks&K+*!13`^r;RK-s(DCbs8W#prr2imqZ#u+!3cG!r;Zfr"S_0\s8MEc$3'u(+92HCdJs.- +rs&E$Wcd\.rUTsmr;XHJhZ*PWrs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^r;RK-s(DCbs8W#prr2imqZ#u+!3cG!r;Zfr"S_0\s8MEc$3'u(+92HCdJs.- +rs&?"<<1bQr:9jlqYtmB^&Ru4rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`r;R!#rV<1,]_)(#'(CosW;HPmrr<#trquf%KE(uMmJdLls8J+-JUH\]rTF1b +qYsOqgAh*Ars&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^r;R!#r:C%frr<#trquf%KE(uMmJdLls8F,@!W^XJr9+(a +r;Wd>m/R%Trs&E$]l)^,rN?/)rVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^r;R!#r:C%frr<#trquf%KE(uMmJdLls8F,@!W^XJr9+(a +qYsOqgAh*Ars&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`qu7<-s6P2QLns&0s5_PCIsBB>rr2os$3'u&s4qaXrr;ubrsA])rfDMYI-CV/ +kPkb_s&B'Qs8;Hf#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^qu7<+s4@VX(/VsKs2_-k$NR(%rVc`q$3'u&s4qaXrr;ubrsA])rZD1B!7CiE +kPkbas/L5.s8DNg#5nM7DVkElY5\_)s6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^qu7<+s4@VX(/VsKs2_-k$NR(%rVc`q$3'u&s4qaXrr;ubrsA])rZD1B!7CiE +kPkb_s&B'Qs8;Hf#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`r;Zfr')hjeS:Pa(N/W!sCQmNQrr2rsrr39&rq2@tO8]+XmJdLls8J+-JUH\] +rTF1bqYsOqgAh*Ars&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^r;R-'s82i0643bn(`3/O"um/R%Trs&E$]l)^,rN?/)rVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^r;R-'s82i0643bn(`3/O"u +nc&mms/U?sG0Bp`q>VK6s8VcDY_\(=a2IiSr;Q`qs8W)tr;O0HH]S.*rpB^lrr;tZI"?\/s8D-\ +#5\@"!8@JNo)Apjs*FaZs8/u!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^qu7c;s8Dutn#g:>(1E;`p&Fmfs8N&urr2ip[rZnWrVularsA])rZD1B!7CiE +kPkbas/L5.s8DNg#5nM7DVkElY5\_)s6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^qu7c;s8Dutn#g:>(1E;`p&Fmfs8N&urr2ip[rZnWrVularsA])rZD1B!7CiE +kPkb_s&B'Qs8;Hf#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`qYpZss8Drrs8W)srrW0!rr2p*rr;oqiGb6DMuNbUmJdLls8J+-JUH\]rTF1b +qYsOqgAh*Ars&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^qYpZss8;lkrrW,urr2p*rr;oqiGb6DMuNbUmJdLls8F,@!W^XJr9+(ar;Wd> +m/R%Trs&E$]l)^,rN?/)rVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^qYpZss8;lkrrW,urr2p*rr;oqiGb6DMuNbUmJdLls8F,@!W^XJr9+(aqYsOq +gAh*Ars&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`q>Up's8N#qr;HTkr;?Qorqud'rr)\OIGp +nc&mks&K+*!13`^q>^Hn$N9hsqtp0aq>L?mr;R-'rVDG#iK8uss8MEc$3'u(+92HCdJs.-rs&E$ +Wcd\.rUTsmr;XHJhZ*PWrs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^q>^Hn$N9hsqtp0aq>L?mr;R-'rVDG#iK8uss8MEc$3'u(+92HCdJs.-rs&?" +<<1bQr:9jlqYtmB^&Ru4rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`qZ$Qos8Dfo"9&6!rr2p+rquf(C:XA"MuUs8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^qZ$Qo!W2fkrr`/ss8N#t%0$2)[;*8PLPu*/rr2?c$3'u(+92HCdJs.-rs&E$ +Wcd\.rUTsmr;XHJhZ*PWrs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^qZ$Qo!W2fkrr`/ss8N#t%0$2)[;*8PLPu*/rr2?c$3'u(+92HCdJs.-rs&?" +<<1bQr:9jlqYtmB^&Ru4rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`qu6`ss8N#t)><4/_ThiKs8W&trr<#ss5J(*s8S"8s8W&brsA])rfDMYI-CV/ +kPkb_s&B'Qs8;Hf#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^qu6`ss8N#t)=Gb+M4 +nc&mks&K+*!13`^qu6`ss8N#t)=Gb+M4 +nc&mms/U?sG0Bp`qZ$Tp*W49bJU)'JEINGDq>^Bms8Dr[K6jK*[Y0@?bPqJ.rsA])rfDMYI-CV/ +kPkb_s&B'Qs8;Hf#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^qYp`ts7rL!"T/66"D[Q.qu?]pro\o[W403gKsJo$rU0[lrr;s?!!3/Js8;'[ +#5nM$FmT/,o)Apls1N=,s8B,##6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^qYp`ts7rL!"T/66"D[Q.qu?]pro\o[W403gKsJo$rU0[lrr;s?!!3/Js8;'[ +#5\@"!8@JNo)Apjs*FaZs8/u!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`r;Zfr+8kr/EGg`Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^r;Rr>rVH.V!!"-IY-2Co+944Js8Drps3GS1Ec5oGIqP/Kr9jRkrr;s?!!3/J +s8;'[#5nM$FmT/,o)Apls1N=,s8B,##6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^r;Rr>rVH.V!!"-IY-2Co+944Js8Drps3GS1Ec5oGIqP/Kr9jRkrr;s?!!3/J +s8;'[#5\@"!8@JNo)Apjs*FaZs8/u!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rVm0&s8;o=Clla5r;RK)`eSfis8Drrp#"]dio5cMiTgFAmf*Ums8J+-JUH\] +rTF1bqYsOqgAh*Ars&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rVm0&s8)bW!%=0(r;RK"OVn2%s82fpp#"]dio5cMiTgFAmf*Ums8F,@!W^XJ +r9+(ar;Wd>m/R%Trs&E$]l)^,rN?/)rVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^rVm0&s8)bW!%=0(r;RK"OVn2%s82fpp#"]dio5cMiTgFAmf*Ums8F,@!W^XJ +r9+(aqYsOqgAh*Ars&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`r;R$"rml+Ro`+shrVum%q4VrurVc`ms8S)YrrE#brsA])rfDMYI-CV/kPkb_ +s&B'Qs8;Hf#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^r;RK.ri?)Ql2Ue]qtpm/R%Trs&E$]l)^,rN?/)rVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^r;RK.ri?)Ql2Ue]qtp +nc&mms/U?sG0Bp`rr<#t#6"FXNqNGLrr)otrr*H*s6"F.s8;orrVcZmrIKP!r;cibrsA])rfDMY +I-CV/kPkb_s&B'Qs8;Hf#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^rr<#t#5n3 +nc&mks&K+*!13`^rr<#t#5n3 +nc&mms/U?sG0Bp`rVm0$s3>cMs8;orr;Zfr#5nM!ES1O=n +g&Cm>rW`2tH2tVXql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rVm0"s.9>;s7u]or;R'%s8)al!3uP"qu6WBlM_+grr!o=! +nc&mks&K+*!13`^rVm0"s.9>;s7u]or;R'%s8)al!3uP"qu6WBlM_+grr!o=!O=n +g&Cm>rW`2tH2tVXql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`rr39'r;E=Ls8Doqq>UWsroJBiqu6TUrsA])rfDMYI-CV/kPkb_s&B'Qs8;Hf +#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^rr39'qti`&s82fpq>Ug!rlYQtq>L;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rr39'qti`&s82fpq>U]srlYQtq>L +nc&mms/U?sG0Bp`rr36&s7q)Drr)ikrs/Q%s-/*3s8LsV"He+aIHoqo#5nL$!8RVRo)Apls*Xs_ +rqiku#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr36$s764lrqucks8W'$rVn5IqYL6lroa:c+92HCdf9:/rs&H%Wc[Y.rpp'n +rVsQLhZ!JVrs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rr36$s764lrqucks8W'$rVn5IqVM5V+92HCe,TF1rs&E$<<1hSrpp'nr;V0H +^Ae#4rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`rr33#rlAs1rquNj$N9u'P^AFKP&MH^iu7t/rXAiEjVn=@)[QK\n/DQM)[l_P +s8&nu#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr33!rf[AkrqcBh%/p2).0:J.)]Tr@P)JO`$&jk&&HDh3FHVRDN<4c^MscQ- +KlPcFr3$&(rVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^rr33!rf[AkrqcBh"o\H".0:LG)ZU!>!!!er)[%&u#lke2)[73"$imU5qQBi& +r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`rr36%rnhkArr)ikrsJ`(rfhbeLQ6*b']Ti,$N:>3&`jZ/&ebHL&FU89'H&R[ +rqrr!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr36#rkJQ%rql]irs\l*r[Is`',)&rD2sD8M$\upL_0Uf!-!sRjbX%kIu*QM +"cA/$mf*0frs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rr36#rkJQ%rql]irrrB#r[Is`h@fkjrVup/jV%b0'*\FJmh5j=))'hFr3$&( +r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`rr36&s87>7s8DrlrsA]'s-/'1rqufqjo#M`rVV_'J:$GWqrdn^q#+.lf_t[9 +r<)uts8K/##5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr36%s7cRNs8;lkrsSi)s!ImArqu`os8D-[$2sl%*rl +nc&mks&K+*!13`^rr36%s7cRNs8;lkrs/Q%s!ImArqtgT$2jc"*rl +nc&mms/U?sG0Bp`rr39'r;<7FpAOshq>Ua!ro\I+rr)lriVs+DI"?\0s8M3]#5eF#!8IPPmf*@e +s8K2$#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr39'qtWZ$mem%_q>UZrrm(pTrqucq!<2-\$3'u(+92HCdJs.-rs&E$Wc[V- +rU9ddrW3&uY5\_)s6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^rr39'qtWZ$mem%_q>UZrrm(pTrqt[R"s +nc&mms/U?sG0Bp`rVm0$s3GQAs8;orr;R'%s82eoFm]2,rr2fmli%4hrr%n)J:$JYr9+%`q>O=n +g&Cm:ri?&'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rVm0"s.9;/s7u]or;Zfr#5J0p!8IMMrr2fmli%4hrr!o=! +nc&mks&K+*!13`^rVm0"s.9;/s7u]or;Zfr#5J0p!8IMMrr2fmli%4hrr!o=!O=n +g&Cm:ri?&'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`rr<#t#6"CWPP5%Srr*9)rr;ups6Fa0s8:jU$3'u(OF2V,kl:VErs&?"<<1bQ +r0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OfDc!Qs8Muqrqlcprr2lrrr)orrVR'%s8N&t +rr;rqrr;uss8W'$rVZZprp9Z8~> +nc&mks&K+*!13`^rr<#t(&[_G2=:G>rVlfrrr;uns4%0Xs8)`SrsA])rZD1B!7CiEkPkbas/L5. +s8A>b#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn%/Qrr;urrVl]prVlfps8MutrVcX%rVuls +rr2rrrVlirrr<#t"TA8ts8MBbJ,~> +nc&mks&K+*!13`^rr<#t(&[_G2=:G>rVlfrrr;uns4%0Xs8)`SrsA])rZD1B!7CiEkPkb_s&B'Q +s888a#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn%/Qrr;urrVl]prVlfps8MutrVcX%rVuls +rr2rrrVlirrr<#t"TA8ts8MBbJ,~> +nc&mms/U?sG0Bp`r;R$"s3kqRpAb0jrVum1du8P;rr)lrs7a%4\[f/hs8N#crsA])rfDMYI-CV/ +kPkb_s&B'Qs888a#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn.5Prr;unrs/N&rr2rss8Mlp +!WE#lrr`9#s8Drs!<2 +nc&mks&K+*!13`^r;Rr;s/#cRmJm4aqtp +nc&mks&K+*!13`^r;Rr;s/#cRmJm4aqtp +nc&mms/U?sG0Bp`rVm0&s8;o:Cm3-0r;RK,a)cp^rr)lrrr;V9F)Q#2MuWbSmf*Ums8J+-JUH\] +rTF1bqYsOqgAh) +nc&mks&K+*!13`^rVm0&s8)bR!%jhrr;RK'OoQ5mrql`prr;V9F)Q#2MuWbSmf*Ums8F,@!W^XJ +r9+(ar;Wd>m/R$Ors&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr1UN)ufm:s81cZWiW/9p](3l +s8N&ts7P'GXKAAOs8Dp.s0f01s8N#trqufBSB1a/rpB`9~> +nc&mks&K+*!13`^rVm0&s8)bR!%jhrr;RK'OoQ5mrql`prr;V9F)Q#2MuWbSmf*Ums8F,@!W^XJ +r9+(aqYsOqgAh) +nc&mms/U?sG0Bp`r;Zfr&H) +nc&mks&K+*!13`^r;RE/rVQ1O!!!%2\%$3;-NH'os8Drs$iU(bH^WjNhrk%=rpKdmrr;s?!!3/J +s8;'[#5nM$FmT/,R/[Bhs6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N#Ms8W$"pRc;FrcBK,LX#kt +rr;rqmZ)+)FEMMIYPeCurVq\&r;Z`qrql`?DNF;drVl3aJ,~> +nc&mks&K+*!13`^r;RE/rVQ1O!!!%2\%$3;-NH'os8Drs$iU(bH^WjNhrk%=rpKdmrr;s?!!3/J +s8;'[#5\@"!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lKs8W$"pRc;FrcBK,LX#kt +rr;rqmZ)+)FEMMIYPeCurVq\&r;Z`qrql`?DNF;drVl3aJ,~> +nc&mms/U?sG0Bp`qZ$Tp(Al:XO`PAUG'nVSqZ$Norr<#qs1<-skPkkfs8J+-JUH\]rTF1bqYsOq +gAh) +nc&mks&K+*!13`^qYp`ts7`$q,5V?KNqNGLs8N&uqu=9Fe*$`;rr;s?!!3/Js8;'[#5nM$FmT/, +R/[Bhs6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N#Ns"= +nc&mks&K+*!13`^qYp`ts7`$q,5V?KNqNGLs8N&uqu=9Fe*$`;rr;s?!!3/Js8;'[#5\@"!8@JN +R/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lLs"= +nc&mms/U?sG0Bp`qu6`ss8N#t'D^V#]\rGQs8W)urr<#tr;OgGbb09$+j`Bs8;im +]Q:1PrtX[BHKkJ.s,`$7s8Dipb\igCrr)lrm/MS~> +nc&mks&K+*!13`^qu6`ss8N#t'D9CrJALL4s8W&trr<#tr;Om/R$Ors&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr1UN"TA>gGbb09$+j`Bs8;im +]Q:1PrtX[BHKkJ.s,`$7s8Dipb\igCrr)lrm/MS~> +nc&mks&K+*!13`^qu6`ss8N#t'D9CrJALL4s8W&trr<#tr;OgGbb09$+j`Bs8;im +]Q:1PrtX[BHKkJ.s,`$7s8Dipb\igCrr)lrm/MS~> +nc&mms/U?sG0Bp`qZ$Qo!WDrmrr`6!s8N#ts8E?$Mh/sVZap&7rpB^lrr;tZI"?\/s8D-\#5\@" +!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lLrs/K%m<,N/q>C6j,P]=3rqucYEejGf +r;HTkrk +nc&mks&K+*!13`^qZ$Qo!W2`irr`2ts8N#ts8E?$Mh/sVZap&7rpB^lrr;s?!!3/Js8;'[#5nM$ +FmT/,R/[Bhs6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N#Nrs/K%m<,N/q>C6j,P]=3rqucYEejGf +r;HTkrk +nc&mks&K+*!13`^qZ$Qo!W2`irr`2ts8N#ts8E?$Mh/sVZap&7rpB^lrr;s?!!3/Js8;'[#5\@" +!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lLrs/K%m<,N/q>C6j,P]=3rqucYEejGf +r;HTkrk +nc&mms/U?sG0Bp`q>^EmrVQ`qr;?QnrVm<)s7h"kK5GUHU\k#hmf*Ums8J+-JUH\]rTF1bqYsOq +gAh) +nc&mks&K+*!13`^q>^Hn$N9erqYL*bq>Lm/R$Ors&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr1UN"oSDdHAqRsrrN,srVmr;s1 +nc&mks&K+*!13`^q>^Hn$N9erqYL*bq>L +nc&mms/U?sG0Bp`qYpZss8Drlrt>8/s8N&urVkoVUX.u]YA;>]r9jRkrr;tZI"?\/s8D-\#5\@" +!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lLrs/Q%qODPqd,"[#$2a]$r;WU:nG`Cb +rrE&ts8W',s,`!6s3,SVq#C +nc&mks&K+*!13`^qYpZss8;ijrt>5.s8N&urVkoVUX.u]YA;>]r9jRkrr;s?!!3/Js8;'[#5nM$ +FmT/,R/[Bhs6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N#Nrs/Q%qODPqd,"[#$2a]$r;WU:nG`Cb +rrE&ts8W',s,`!6s3,SVq#C +nc&mks&K+*!13`^qYpZss8;ijrt>5.s8N&urVkoVUX.u]YA;>]r9jRkrr;s?!!3/Js8;'[#5\@" +!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lLrs/Q%qODPqd,"[#$2a]$r;WU:nG`Cb +rrE&ts8W',s,`!6s3,SVq#C +nc&mms/U?sG0Bp`q>V$*s8VW3Z@n+'b00JXrr)lrrr2utr;QocGG+s6mf*Ums8J+-JUH\]rTF1b +qYsOqgAh) +nc&mks&K+*!13`^qu7<.s8Dutk*BQi(c%ACli6q]s8N#t!<2or"RC9)rr)9b$3'u(+92HCdJs.- +rs&E$Wcd\.rL!ThrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cf`)Zas6#>\EdEkFbkV5;s8Dts +FmT/,rr3T0s8MurrVlhXMY3`fDmTK@roa<3~> +nc&mks&K+*!13`^qu7<.s8Dutk*BQi(c%ACli6q]s8N#t!<2or"RC9)rr)9b$3'u(+92HCdJs.- +rs&?"<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Of`)Zas6#>\EdEkFbkV5;s8Dts +FmT/,rr3T0s8MurrVlhXMY3`fDmTK@roa<3~> +nc&mms/U?sG0Bp`r;RE/s8DuVT7(UA]qBsuCPTb+s8Dip#laf#r:"s-s8DBc$3'u(OF2V,kl:VE +rs&?"<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OgAh0O"oSDs`fQ#UE=.W]s8Dlq +WHRY.rVlftrr;us%fQD,OG03?T +nc&mks&K+*!13`^r;RK1s8;o78Hf)CH9_r?!"jqbs8DusrVm0&rVZT_GbtH=mf*Ums8F,@!W^XJ +r9+(ar;Wd>m/R$Ors&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr1XOrr**!s8'`sM#MB$Mr4R5 +r;Wa>m/R%`rrN-!rr*E+rr8(6S84b$DS#lHrr20^J,~> +nc&mks&K+*!13`^r;RK1s8;o78Hf)CH9_r?!"jqbs8DusrVm0&rVZT_GbtH=mf*Ums8F,@!W^XJ +r9+(aqYsOqgAh)m/R%`rrN-!rr*E+rr8(6S84b$DS#lHrr20^J,~> +nc&mms/U?sG0Bp`qu6m!s6Y>VRbIc@#lEDfJnph8rr)iq$H04FrqufjGbG'7mf*Ums8J+-JUH\] +rTF1bqYsOqgAh) +nc&mks&K+*!13`^qu6lts4[q^34Jne#l;,W%KJ]5rqucp$H04FrqufjGbG'7mf*Ums8F,@!W^XJ +r9+(ar;Wd>m/R$Ors&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr1UN!<2or&,l+E]97AY^&Rs/ +V02/)r;HWsrr<#trXJmkH#T2Hs+u!\rqufqlMlA~> +nc&mks&K+*!13`^qu6lts4[q^34Jne#l;,W%KJ]5rqucp$H04FrqufjGbG'7mf*Ums8F,@!W^XJ +r9+(aqYsOqgAh) +nc&mms/U?sG0Bp`rVuos$2s^tDSQ5OrqucprtFk3HA(kgrVQW2@B';,o=8nIs8;rVlisrr;rfs8DorP'j5's8;#1Jb9!@l2Q8~> +nc&mks&K+*!13`^rVuos$2aEl!.OtJrqcWnrtF:7!tXMlr;6N1@B';,o=8nIs8;rVlisrr;rfs8DorP'j5's8;#1Jb9!@l2Q8~> +nc&mks&K+*!13`^rVuos$2aEl!.OtJrqcWnrtF:7!tXMlr;6N1@B';,o=8nIs8;rVlisrr;rfs8DorP'j5's8;#1Jb9!@l2Q8~> +nc&mms/U?sG0Bp`r;R$"s0cXUs8;iorr;rsrt3.a^&S$0rUZA"R?reJPPb@Xmf*Ums8J+-JUH\] +rTF1bqYsOqgAh)tr;QWmr;Ws@ +l2UeGE5_eRs8N#rrr&=RqZ$SVL]@DQr;XcRX8;_mlMlA~> +nc&mks&K+*!13`^r;R#us)%gas8)WkrY>A.s8RiSHN3j@rUZA"R?reJPPb@Xmf*Ums8F,@!W^XJ +r9+(ar;Wd>m/R$Ors&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr1XO0)keHT5s>tr;QWmr;Ws@ +l2UeGE5_eRs8N#rrr&=RqZ$SVL]@DQr;XcRX8;_mlMlA~> +nc&mks&K+*!13`^r;R#us)%gas8)WkrY>A.s8RiSHN3j@rUZA"R?reJPPb@Xmf*Ums8F,@!W^XJ +r9+(aqYsOqgAh)tr;QWmr;Ws@ +l2UeGE5_eRs8N#rrr&=RqZ$SVL]@DQr;XcRX8;_mlMlA~> +nc&mms/U?sG0Bp`rr;us#OZlHs8;lrrr2rtrWW8uoS.thrr*0&p6^5ZI];r +kl:YCFI`7*r;HTkrSDXaqu-PVLAUuL#5nM0B>X]GlMlA~> +nc&mks&K+*!13`^rr3?)rVkXUErYt7s8N#ts8ET,qW\e'kPkGZs7Vh-Jps]jrr2?c$3'u(+92HC +dJs.-rs&E$Wcd\.rL!ThrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cg&D9Ss3l#4s82fo)>aB< +E9R?$jE-phqu$Ekqu,AnRJZs_OG +nc&mks&K+*!13`^rr3?)rVkXUErYt7s8N#ts8ET,qW\e'kPkGZs7Vh-Jps]jrr2?c$3'u(+92HC +dJs.-rs&?"<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Og&D9Ss3l#4s82fo)>aB< +E9R?$jE-phqu$Ekqu,AnRJZs_OG +nc&mms/U?sG0Bp`rVm*!rjmXSrVcNk&H)RECV9TArVZWko_%hSrqc!Y$2XPqNd?2$jSSc9qZcck +;ZPGHpmCp_q"r>:?i0QeqZcckAH9jLq"":eq>9OZ1&LbBg%tsKqs8 +nc&mks&K+*!13`^rVm0!rc\qAr;?ToqYq-(s+15rqY0m`rVcE`p&G'im/77grVR`;!j8JlGr7H"oJ8cEf'AbrsA@YMY$cBqk%W& +qu7>&BZL,KrJu^1rVZWkr:>emgAh'9rI=~> +nc&mks&K+*!13`^rVm0!rc\qAr;?ToqYq-(s+15rqY0m`rVQ6[oDS[bm/%+cqt_B7!$B#X]Cqi6C+qtg3dqXKAef_t[4qg\~> +nc&mms/U?sG0Bp`rr39'rV_kCs8DrrqYp`urVcDEL>Dk4R"L3Ip#H&R=od`MrrV!VB'oU"D#i5U +rrE*We,KN]L6L'bliZOFG/=+V$(upThUJONTpIn~> +nc&mks&K+*!13`^rr<#s#5fVls8;lqqYp`ur;Gt!%Gh$e+92HCfAll4XE=#trrVV.ZL.Yn[W(R" +rrIY=eGfpUZ@@eTjQ,F^QuBP6rsJOgI&PTWjklnYYl4S&OGE]4"8@>#qs+33~> +nc&mks&K+*!13`^rr<#s#5fVls8;lqqYp`ur;Gt!%Gh$e+TMQDh;eM:=od`MrrV!VB'oU"D#i5U +rrE*We,KN]L6L'bliZOFG/=+V$(upThUJONTpIn~> +nc&mms/U?sG0Bp`rr36%s64[Crr)ikrsA]'s-/&fh;$i#ik#D0>@(O6]=R1;#.V9/!2-s7R(ER5 +]9rXh]=@CC#.V9]]=HJ("2U+#>5_\C=G=)m]=YYgY@1I8>[1K9?*LuQ]=Vlj +])9/E\\3\rK=e_]]79~> +nc&mks&K+*!13`^rr36$s3q%&rVQThrrrE#s!\,\rjr3Gh>Z3oh$Mlmg`$4o!4C\;kM6?sh4Ai: +h;"CR#2J%YFeddIn_FE(h5,59h;%SW#Me.fJ +nc&mks&K+*!13`^rr36$s3q%&rVQThrrrE#s!\,\hR`t.!!*(f]=I+:#.V9/!2-s7R(ER5]9rXh +]=@CC#.V9]]=HJ("2U+#>5_\C=G=)m]=YYgY@1I8>[1K9?*LuQ]=Vlj])9/E +\\3\rK=e_]]79~> +nc&mms/U?sG0Bp`rr33"rkiO,s8;Wk#lXc%P^.1_F[:QYJH2hQJ,~> +nc&mks&K+*!13`^rr32ureU]gs8)Ki"9&5t.f02I7 +nc&mks&K+*!13`^rr32ureU]gs8)Ki"9&5t.Y.SN!3#sK~> +nc&mms/U?sG0Bp`rr36%s7:TFrr)ikrsA]'s-.rE]t^q(ja7A]I!\=F5!3h4Hfob\H$h%@C4(>p +Hj4nEAH4B2H1?7dH$h@I@siUnHj>"GFT<8+H@+1ipj)per-SKkq0E$frI"Wkq0`3g!.4!YJ,~> +nc&mks&K+*!13`^rr36$s6'H!rqucjrsSi)s![toI!^6k[D1n<$,!sa(B=I9S%uZ!]`u-_P^9^M +]U6A:]Y1UrQbC'%]`u-_R!>mL]^WT9\q#af^%f8:^%o>=^&Pb@^&Pb0]mp~> +nc&mks&K+*!13`^rr36$s6'H!rqucjrs/Q%s![toI!an$"+,EB&,lP1AUJgeHj4kD.0++1HC0'a +H@09(078'8Hj4kD1&tg3HLcFgH[Kr9(jpXVeU7. +nc&mms/U?sG0Bp`rr<#t"o="=s8DolrrrE#rVVV3h>[VIKo:Z]j8T0b!:,mL!oX,mmJd6+!8QuA +!<>$?s*t~> +nc&mks&K+*!13`^rr36%rq-aKs8;llrrrE#rV@WOh>[U$!!3/Rj8T1_FS(gt!q:08mJd6sDscrl +!J$Z%s*t~> +nc&mks&K+*!13`^rr36%rq-aKs8;llrrrE#rV@WOh>[U%!!3/Zj8T0b!:,mL!oX,mmJd6+!8QuA +!<>$?s*t~> +nc&mms/U?sG0Bp`rVm-"rj-q=rVc`mrsJc*r;Y/]b5D)5r8d\\q>0oHH%(&!qY97M#5.gk!7gr? +R/.$]qTT"IqXsCT#5.h(!6G$2o(iUdqWn2:qY0fMqLA~> +nc&mks&K+*!13`^rVm,urb2hur;6Kjrs8W(qZ!2gQ2:1QqW7V]qu$=5!!*)Gr;#OR#5S1rFm8i# +R/@0br8r%'r;#m\#5S2&ET?uno)&air:PT-r;6AUr."~> +nc&mks&K+*!13`^rVm,urb2hur;6Kjrs8W(qZ!2gQ2:15q?cuoq&]S;!6tB7kP>DUqGRCEqY-BR +#5@u=!+5TqnbNI_qIKZJqY0RW#Pe/^!&=?Eq3:`+~> +nc&mms/U?sG0Bp`rVm*#s5S1Fs82fprr3?)s8MupNemN1rr;usrqlcprr2 +nc&mks&K+*!13`^rVm*"s2P,.s7lTmrr3?)s8Dlk-PuFRrVulrrqlcprr2 +nc&mks&K+*!13`^rVm*"s2P,.s7lTmrr3?)s8Dlk-PuFRrVulrrqlcprr2 +nc&mms/U?sG0Bp`rVmW3r;WR4fDkdHrr2rsrr)fqc"tQ&r;Q]rrT4%crr;tZI"?\/s8D-\#5\@" +!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^rVmW3qYs.fY5eCrrVliqrVQNmSH+rTqYpKprT4%crr;s?!!3/Js8;'[#5nM$ +FmT/,R/[Bhs6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^rVmW3qYs.fY5eCrrVliqrVQNmSH+rTqYpKprT4%crr;s?!!3/Js8;'[#5\@" +!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`r;Zfq"7D1oe,KCIrVlg0r1n4pq#13lrr)l_^VRS;r;HW^rsA])rfDMYI-CV/ +kPkb_s&B'Qs888a#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^r;Zfq"5YC-X8`/!qu6U.q+Ui>nbi@brr)l_^VRS;r;HW^rsA])rZD1B!7CiE +kPkbas/L5.s8A>b#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^r;Zfq"5YC-X8`/!qu6U.q+Ui>nbi@brr)l_^VRS;r;HW^rsA])rZD1B!7CiE +kPkb_s&B'Qs888a#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rVn)@s8;oUFEa=jo`+sakh25>[e'Lts8MusbBn)CDfsA*rVl6b$3'u(OF2V, +kl:VErs&?"<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rVn)@s8)c4!!#?;l2UeMf +nc&mks&K+*!13`^rVn)@s8)c4!!#?;l2UeMf +nc&mms/U?sG0Bp`r;Zfr+8l,[LN79dVPf2iEIPn,s8N&trVl83L>(@qFa3$IrU0[lrr;tZI"?\/ +s8D-\#5\@"!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^r;Zfr+8Yu")ZTjF9hc,u!"+V`s8DusrVl83L>(@qFa3$IrU0[lrr;s?!!3/J +s8;'[#5nM$FmT/,R/[Bhs6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^r;Zfr+8Yu")ZTjF9hc,u!"+V`s8DusrVl83L>(@qFa3$IrU0[lrr;s?!!3/J +s8;'[#5\@"!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`q>V6/s7G9aQ$%28X/G@br;Q`qs82i9FO^ +nc&mks&K+*!13`^q>V6/s6.RQ1B7D-<`RoSq>L?ms82i9FO^ +nc&mks&K+*!13`^q>V6/s6.RQ1B7D-<`RoSq>L?ms82i9FO^ +nc&mms/U?sG0Bp`qu6cts8W&rrrVWUrr2p,rVuoss8MusQA>M=p\3qP$3'u(OF2V,kl:VErs&?" +<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^qu6cts8W#qs8UsVrr2p,r;Zfrs8MusQA>M=p\3qP$3'u(+92HCdJs.-rs&E$ +Wcd\.rL!ThrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^qu6cts8W#qs8UsVrr2p,r;Zfrs8MusQA>M=p\3qP$3'u(+92HCdJs.-rs&?" +<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`q>Up's8MuprVuorqu$Hnrr2p,rVlhTMsldYK:h-&rVl6b$3'u(OF2V,kl:VE +rs&?"<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^q>Up's8Dllqu?]oq"t$irr2p,rVlhTMsldYK:h-&rVl6b$3'u(+92HCdJs.- +rs&E$Wcd\.rL!ThrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^q>Up's8Dllqu?]oq"t$irr2p,rVlhTMsldYK:h-&rVl6b$3'u(+92HCdJs.- +rs&?"<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`q>^Hn!<)fp!ri/trVuos$ic9AMM7=ND1_0SrU0[lrr;tZI"?\/s8D-\#5\@" +!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^q>^Kos8;co!r`#qrVuos$ic9AMM7=ND1_0SrU0[lrr;s?!!3/Js8;'[#5nM$ +FmT/,R/[Bhs6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^q>^Kos8;co!r`#qrVuos$ic9AMM7=ND1_0SrU0[lrr;s?!!3/Js8;'[#5\@" +!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`qu7''s8W&ts80s-_V=8QrrW/us8N!*s-.N/q#BinEjPfDmf*Ums8J+-JUH\] +rTF1bqYsOqgAh) +nc&mks&K+*!13`^qu7''s8W#ss7i!OKtYk4rrDuprX8ajEO,B>n@3MFs8; +nc&mks&K+*!13`^qu7''s8W#ss7i!OKtYk4rrDuprX8ajEO,B>n@3MFs8; +nc&mms/U?sG0Bp`qZ$Tp*WP?)KQ29_E-78crr;rrs8MusOb3E/qu?D8U&P#YrsA])rfDMYI-CV/ +kPkb_s&B'Qs888a#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^qYp`urVt;Q'`7qF,FSH/rVlirrVr"3q>^?lpNWD2rU0[lrr;s?!!3/Js8;'[ +#5nM$FmT/,R/[Bhs6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^qYp`urVt;Q'`7qF,FSH/rVlirrVr"3q>^?lpNWD2rU0[lrr;s?!!3/Js8;'[ +#5\@"!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`r;Zfr+8l)JF`jJ(naXr5U2u@Vs8Drqrr7k5rr)`ln9C`.rU0[lrr;tZI"?\/ +s8D-\#5\@"!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^r;Zfr&Gl9D!!#c_j5chR7fXm\s8Drr$ic*Arr)`ln9C`.rU0[lrr;s?!!3/J +s8;'[#5nM$FmT/,R/[Bhs6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^r;Zfr&Gl9D!!#c_j5chR7fXm\s8Drr$ic*Arr)`ln9C`.rU0[lrr;s?!!3/J +s8;'[#5\@"!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`rVm-%s8;oLCo-7irsR_3FhI\OrqubrJGoKI"R^E4s8; +nc&mks&K+*!13`^rVm-%s8)c!!)^u:rsQXF!-eA;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rVm-%s8)c!!)^u:rsQXF!-eA +nc&mms/U?sG0Bp`r;Rr=roSTss8W&rrr2lorVu)IET-oprVu;/V!$jaOF$$frU0[lrr;tZI"?\/ +s8D9`s8EB*qu?[u!9!ePs8JJe#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^r;Rr&#!6"m6rVu;/V!$jaOF$$frU0[lrr;s?!!3/J +s8;3_%0$;,rVunuFmo;,s8JJe#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^r;Rr&#!6"m6rVu;/V!$jaOF$$frU0[lrr;s?!!3/J +s8;3_s8EB*qu?[u!9!ePs8JJe#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rr<#t#5nIgHfk;(rr*`6rr2rps4_Ogrqucos1rSmEcGp6s8DrbrsA])rfDMY +I-CV/l2M.is5%c5!4`(*rr;ters&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mks&K+*!13`^rr<#t#5eBX%aP%Krr)otrr*T+s0_nrrVQTms1rSmEcGp6s8DrbrsA])rZD1B +!7CiEl2M.js6m=MHJAJtrr;ters&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rr<#t#5eBX%aP%Krr)otrr*T+s0_nrrVQTms1rSmEcGp6s8DrbrsA])rZD1B +!7CiEl2M.is5%c5!4`(*rr;ters&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`rVm0%s4VPJs8;orr;Zfrs83CsF5m5trr)l +nc&mks&K+*!13`^rVm0#s0_p6s8)cpr;Zfrs8!6b!65'9rr)l;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rVm0#s0_p6s8)cpr;Zfrs8!6b!65'9rr)l +nc&mms/U?sG0Bp`rr3-#r;EUQrquirq>Ud"s4MFdqYU3gqY^?nr9O4dqYU,KH@L8%qt]RT"o%l# +!!!-"!!?m0r;N2c#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr39'qYX>5rVQQmq>Ucus0MnrpA"L]qY^?nrp0Lhr;HO8!!*)GrVGjY%K$(V +F+&XjJ:D[Hr;HVars&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rr39'qYX>5rVQQmq>Ucus0MnrpA"L]qY^?nr9O4dqYU+2!!*)EqtTLS"o%l# +!!!-"!!?m0r;N2c#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rr<#t"oO"Gs8DrmrrrE#rVhq1h>[VGKSbBWkPkTV!X/H%"9ee3s8/;c#5nMK +!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr36%rqZdas8;llrrrE#rVe#Dh>[U$!!3/QkPkpdG_1EqIt3,kg&Lu>rs&H% +k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rr36%rqZdas8;llrrrE#rVe#Dh>[U%!!3/XkPkTV!X/H%"9ee3s8/;c#5nMK +!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rr33#s3bi8rr)Tk$NC#(P^]R/X-Q^_j&$"4-RgE8;,HRU!`2`.qZ$a$!jM\$ +S,W]js3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^rr33!s/,jsrqcBh%0$5*.0NIE;,UG^X/G0[$)a`"'`\77MQ;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rr33!s/,jsrqcBh"oeK#.0NK(;#gt&!!5Ja;!Us[:f.r(!!EB*Yl=Nhrs&E$ +d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`rr33#rmPl:rquNj#lXc%P^7OpI8.U +s8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr36"rhomurqcWhrri<"r@.jG!!6#FF6IcLF`qm;rW!".HZ\Lq!e,ZLrI>$% +GLuimS,W]ks6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^rr36"rhomurqcWhrri<"r@.iW!!EB(Yl=Kgrs&E$d/[VTqXORiqYt1.bl@V3 +rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`rr36&s8.5Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr36%s7cR]s8;lkrsSi)s!Rluh;$fCna5N-$170J*<6*?_sZjVmLAONQ[+.3 +J:N-#GM3#pS,W]ks6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^rr36%s7cR]s8;lkrs/Q%s!Rluh;%&H$/F@l)ZTm=[GBR&h#uEe0*)1R!!EE) +ZiBolrs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`rr39'rVDk@qYgBlqYp`urVl>9T&'DLQ%4R=nE9fZM#[MX!!!0&.J`r@S,W]j +s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^rr39&r:VfgpAFmgqYp`ur;GUg52H5A+92HCeE?i>`,pH[J:E2rPPkCYS,W]k +s6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^rr39&r:VfgpAFmgqYp`ur;GUg52H5A+TMQDf]W8BM#[MX!!!0&.J`r@S,W]j +s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`rVm0$s2Ap>rqufqr;R-'s82i)Dr^iorquZj!W)][r!E8uqi6#QHfk8&lMM%d +s+:g^!!*'9df966rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mks&K+*!13`^rVm0"s,-m&rqcZor;R0(s7lV0!6>'6rVQKiquQ]mm/77grVR`;! +nc&mks&K+*!13`^rVm0"s,-m&rqcZor;R0(s7lV0!6>'6rVQHhqZ6Qjm/.1er;.Q9! +nc&mms/U?sG0Bp`rr;us"n[AFs8DoqrXAi+rr;oroQm51r;Q]UrsA])rfDMYI-CV/lMh:lqZ#)8 +(BJ+'s8DusS,W]js3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lLrrrE%rVZTlrr2rts8EK-rVZTm +s8N&sr;Q`qs8DrqquH]prr)lqrW)orquH]prq$/?~> +nc&mks&K+*!13`^rr39'rVbsj>6"KsqYgcss6'kYrql]oj8TGbs8F,@!W^XJr9F:hrquf]T8Rut +n,N?Srs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr1UN"oeQ#r;?Nmrr<#urXJo+r;?Qorr;rp +rr;utrVlcn!<)orrVuiq!<)op!<)oroDa=~> +nc&mks&K+*!13`^rr39'rVbsj>6"KsqYgcss6'kYrql]oj8TGbs8F,@!W^XJr9F:jrqcZF7Mc): +h>dHRrgWolr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Og&D6Ts8DlnrVlfrs8W'-s8Dlnrr;ut +rVZZprr;rrrVQZorr2lrrVcfqrqlcprr2NhJ,~> +nc&mms/U?sG0Bp`r;Qots2&KOrr3Q.rr2lorVu)VE8gforr:a%r7(nrhuE]DrsA])rfDMYI-CV/ +li.Cms8W#ss&f?as7u]oRf +nc&mks&K+*!13`^r;Qors+LGXrr3Q,rVcWiqu>#6s82iqRf +nc&mks&K+*!13`^r;Qors+LGXrr3Q,rVcWiqu># +nc&mms/U?sG0Bp`r;R$$r;X-?W9!jQrr_/-EkMAL"93paD>n>SD/PmDr9jRkrr;tZI"?\/s8D3^ +s8E8ur)<[JrVZY_rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;PCL3;rm5_Sk4-rVlisrr)iX +_o(j@r;YQeo`+pjrr<#faN2KAjT#8Zs8N#trr)lld)O2HfDkjLs8M]kJ,~> +nc&mks&K+*!13`^rVuos#5eF6!*78:qu7&>#69&Iqu-KnJS&cuC]nTmSH&NTrsA])rZD1B!7CiE +l2Ue_#Q+J!FmAu)rgEcjrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cg&F&1s4tQ1g\q*Ms8W)s +roM&8m/R"`gqWL]rr;uts7"+Nai*9?s8N&trr;urs7js\ai2m3rr2rsp&BO~> +nc&mks&K+*!13`^rVuos#5eF6!*78:qu7&>#69&Iqu-KnJS&cuC]nTmSH&NTrsA])rZD1B!7CiE +l2Ue_#Pe3r!8%2IrgEcjr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Og&F&1s4tQ1g\q*Ms8W)s +roM&8m/R"`gqWL]rr;uts7"+Nai*9?s8N&trr;urs7js\ai2m3rr2rsp&BO~> +nc&mms/U?sG0Bp`qu?]p&+b]rH&g/=n^"YEEeWZUrVld(s3AR'a2Z-:HE.#Dmf*Ums8J+-JUH\] +rTF1bqYsOqgAh)[L,jo>8XrVNI;rbNBdGGsm-rVuosr;XT]E,09+EM!"*rVuljs*t~> +nc&mks&K+*!13`^qu79+rT>7&!%+/pjI^Tr!#*ZXrVld(s3AR'a2Z-:HE.#Dmf*Ums8F,@!W^XJ +r9+(ar;Wd>m/R$Ors&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr1UN*rGu?CN4q"rr2rtrr)k` +E,F#&q>[L,jo>8XrVNI;rbNBdGGsm-rVuosr;XT]E,09+EM!"*rVuljs*t~> +nc&mks&K+*!13`^qu79+rT>7&!%+/pjI^Tr!#*ZXrVld(s3AR'a2Z-:HE.#Dmf*Ums8F,@!W^XJ +r9+(aqYsOqgAh)[L,jo>8XrVNI;rbNBdGGsm-rVuosr;XT]E,09+EM!"*rVuljs*t~> +nc&mms/U?sG0Bp`r;RE/s8DucZBTfWH$OFJDQ<('rVlQk"PInXrr)9b$3'u(OF2V,kl:VErs&?" +<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Og&EGts0[*3Ja3:6rr2lql@OY6ec5LG +ZZG=0rVcbtE1bV-dF>.5P5,"SrX>lLNQT`!`KtY8qZ$Qfs*t~> +nc&mks&K+*!13`^r;R!#s8;oQCbkhe"C9[[qu6?i"PInXrr)9b$3'u(+92HCdJs.-rs&E$Wcd\. +rL!ThrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cg&EGts0[*3Ja3:6rr2lql@OY6ec5LGZZG=0 +rVcbtE1bV-dF>.5P5,"SrX>lLNQT`!`KtY8qZ$Qfs*t~> +nc&mks&K+*!13`^r;R!#s8;oQCbkhe"C9[[qu6?i"PInXrr)9b$3'u(+92HCdJs.-rs&?"<<1bQ +r0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Og&EGts0[*3Ja3:6rr2lql@OY6ec5LGZZG=0 +rVcbtE1bV-dF>.5P5,"SrX>lLNQT`!`KtY8qZ$Qfs*t~> +nc&mms/U?sG0Bp`q>UHorr3;iaIo0Hhq\83rVlisrX8c)r;?HimXV/6rVl6b$3'u(OF2V,kl:VE +rs&?"<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Og&E)js0R$aEl%bPs8W#sa**&Y +eGoCFZ>o(-r;Pf"Y5J;-rgIE6s8;iq`,;=Gr;QuBDOpM"rr2ZlJ,~> +nc&mks&K+*!13`^qu6`ss8Drs$IkD47ZkHus8VurrVd3)rVZTjr9f*3s8DrbrsA])rZD1B!7CiE +kPkbas/L5.s8A>b#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn7;lr;X-K]lLsgqu?]os2T;7 +GLZZhs0?Y-s8;lXFKYQA$iZT+_#O?2s28fLqY^?taDRRBrVlfjs*t~> +nc&mks&K+*!13`^qu6`ss8Drs$IkD47ZkHus8VurrVd3)rVZTjr9f*3s8DrbrsA])rZD1B!7CiE +kPkb_s&B'Qs888a#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;lr;X-K]lLsgqu?]os2T;7 +GLZZhs0?Y-s8;lXFKYQA$iZT+_#O?2s28fLqY^?taDRRBrVlfjs*t~> +nc&mms/U?sG0Bp`qYp]ts8MurqZ$Tp!WW/rs8W'&r;EXHqu6Q]rsA])rfDMYI-CV/kPkb_s&B'Q +s888a#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;Vr;X-Dh2@Ksrr2rr/=V0kERt0ds0?Y- +s82iNCrQ>Ir;HNmjJ:0&qu?23M#IANrVcZms.=24s8;TjJ,~> +nc&mks&K+*!13`^qYp]ts8DloqYpZsrVulos8W'&r;EXHqu6Q]rsA])rZD1B!7CiEkPkbas/L5. +s8A>b#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn7;Vr;X-Dh2@Ksrr2rr/=V0kERt0ds0?Y- +s82iNCrQ>Ir;HNmjJ:0&qu?23M#IANrVcZms.=24s8;TjJ,~> +nc&mks&K+*!13`^qYp]ts8DloqYpZsrVulos8W'&r;EXHqu6Q]rsA])rZD1B!7CiEkPkb_s&B'Q +s888a#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;Vr;X-Dh2@Ksrr2rr/=V0kERt0ds0?Y- +s82iNCrQ>Ir;HNmjJ:0&qu?23M#IANrVcZms.=24s8;TjJ,~> +nc&mms/U?sG0Bp`q#C?m$2jc%rqlTjrr;unrs/K$ghOY)r;Q*`$3'u(OF2V,kl:VErs&?"<<1bQ +r0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Og&E)js0Zb1Z?>F3r;HW^GbDrjfDk^IZ>o(- +qu>>gVZ-Ssr;HTnrtGD0s0-\%s8;lqs8W&sm +nc&mks&K+*!13`^q#CBn$N9ets8D]eq>UEnq>U]trnM8(s8;l`rsA])rZD1B!7CiEkPkbas/L5. +s8A>b#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn7;lr;X0Bl`tZts8;ipm +nc&mks&K+*!13`^q#CBn$N9ets8D]eq>UEnq>U]trnM8(s8;l`rsA])rZD1B!7CiEkPkb_s&B'Q +s888a#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;lr;X0Bl`tZts8;ipm +nc&mms/U?sG0Bp`qYpZss8MurrrMHarr3-#rVuosr;R$$rVs0GjSo)DrsA])rfDMYI-CV/kPkb_ +s&B'Qs888a#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;or;X3Cm+cEprqu]n`GET>C"WI^ +s0?Y-s8;lbJpY2so`"mjr;Z`qrWJ:9s8N#ss8W'&rV2k'k5YARs*t~> +nc&mks&K+*!13`^qYpZss8DiorrM$Srr3-#qu?]qr;R$$rVs0GjSo)DrsA])rZD1B!7CiEkPkba +s/L5.s8A>b#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn7;or;X3Cm+cEprqu]n`GET>C"WI^ +s0?Y-s8;lbJpY2so`"mjr;Z`qrWJ:9s8N#ss8W'&rV2k'k5YARs*t~> +nc&mks&K+*!13`^qYpZss8DiorrM$Srr3-#qu?]qr;R$$rVs0GjSo)DrsA])rZD1B!7CiEkPkb_ +s&B'Qs888a#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;or;X3Cm+cEprqu]n`GET>C"WI^ +s0?Y-s8;lbJpY2so`"mjr;Z`qrWJ:9s8N#ss8W'&rV2k'k5YARs*t~> +nc&mms/U?sG0Bp`qu7<.s8N&un^NnENha,Fs8W&ss8Mus#lXc#KqeVFrr2o(-rVZ]9F`DehVo@p#s8Drqs-J?4s8Drqrs&B#Z#f1/rV->B~> +nc&mks&K+*!13`^qu7<.s8DutjK1o(-rVZ]9F`DehVo@p#s8Drqs-J?4s8Drqrs&B#Z#f1/rV->B~> +nc&mks&K+*!13`^qu7<.s8DutjK1o(-rVZ]9F`DehVo@p#s8Drqs-J?4s8Drqrs&B#Z#f1/rV->B~> +nc&mms/U?sG0Bp`r;Ri;s8Dug\USRPW1nrdFdCe^s8N&ts8W)srl]<,rqu*^$3'u(OF2V,kl:VE +rs&?"<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Og&E]&s0cn*s/U;+rr2\IOo3+5 +f`1gJZ>o(-rVlcqi1k[FD/t'*q>^Emo8/1ss8Mus#QFZ#X`N_+rV->B~> +nc&mks&K+*!13`^r;Ri;s8DuYGR4?Y9gf9f!&1n^s8Duss8W)srl]<,rqu*^$3'u(+92HCdJs.- +rs&E$Wcd\.rL!ThrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cg&E]&s0cn*s/U;+rr2\IOo3+5 +f`1gJZ>o(-rVlcqi1k[FD/t'*q>^Emo8/1ss8Mus#QFZ#X`N_+rV->B~> +nc&mks&K+*!13`^r;Ri;s8DuYGR4?Y9gf9f!&1n^s8Duss8W)srl]<,rqu*^$3'u(+92HCdJs.- +rs&?"<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Og&E]&s0cn*s/U;+rr2\IOo3+5 +f`1gJZ>o(-rVlcqi1k[FD/t'*q>^Emo8/1ss8Mus#QFZ#X`N_+rV->B~> +nc&mms/U?sG0Bp`qu?]p&FYTrS(RB5s7Y^0P&Ic"rr2lr#5nLsFRoJ2li.:js8J+-JUH\]rTF1b +qYsOqgAh)3I<15%s8;VNK_bZIr;R!!riL8+s8D]lJ,~> +nc&mks&K+*!13`^qu7<,qqiUu4LOGRs6eLD/HBbQrr)fq#5nLsFRoJ2li.:js8F,@!W^XJr9+(a +r;Wd>m/R$Ors&H%kAda+r:0dkr;X*Cjo>;Mrs/Q'pjee4rr1UN0)YaXE8gfHDo2PSgMjb(_/7j) +qZ!j@kPtJ[s8N&ulI`>3I<15%s8;VNK_bZIr;R!!riL8+s8D]lJ,~> +nc&mks&K+*!13`^qu7<,qqiUu4LOGRs6eLD/HBbQrr)fq#5nLsFRoJ2li.:js8F,@!W^XJr9+(a +qYsOqgAh)3I<15%s8;VNK_bZIr;R!!riL8+s8D]lJ,~> +nc&mms/U?sG0Bp`r;Qs"rVrI2ec,UKrVlg.rM=Itp\k*ks8N#iN0Us8;Hf#Q=\m!&FTPrn7;mr;X3Ej8\h)QMg`dF6*>; +CtSdas0?Y-s8Di`r;HTnrs\kjS914srVr(6qu?Znrs&B"YAre+r:g5A~> +nc&mks&K+*!13`^r;Qs"qu8q^Y5\J$qu6U,qb7&@nbi@bs8N#iN0; +CtSdas0?Y-s8Di`r;HTnrs\kjS914srVr(6qu?Znrs&B"YAre+r:g5A~> +nc&mks&K+*!13`^r;Qs"qu8q^Y5\J$qu6U,qb7&@nbi@bs8N#iN0Us8;Hf#Q=\m!&FTPrn7;mr;X3Ej8\h)QMg`dF6*>; +CtSdas0?Y-s8Di`r;HTnrs\kjS914srVr(6qu?Znrs&B"YAre+r:g5A~> +nc&mms/U?sG0Bp`rVmrrr39's82hnHgLb1p]#a~> +nc&mks&K+*!13`^rVmr;Mrs/Q'pjee4rr1UN*W5rGE9$usX*!_. +KTc95_JRs*qZ!j@kPtMSNfs5;r=/](s8J@6p](5`JG&m>rr39's82hnHgLb1p]#a~> +nc&mks&K+*!13`^rVmrrr39's82hnHgLb1p]#a~> +nc&mms/U?sG0Bp`rVm*#ro.mnq>C6krr3W1s8DraI>mt#rr;oql#*I!qu5p]$3'u(OF2V,kl:VE +rs&?"<<1bQr0mWmrr<"Q)Zh*]jo>8Mrs&?"B)p0Ur:9jmrVuBf1B7:Og&E`'s0cn-s8U_galIo(-qu +nc&mks&K+*!13`^rVm3%rl+q4o_JIbrr2p1rr;logBnkirVccoron=!rql]\rsA])rZD1B!7CiE +kPkbas/L5.s8ADd$NC)*_MEQ!Vt0ldoD]$ms0H_,s8DNg#QFbuJ=6H:rn7<)r;X3EjT#84D9:jU +^An5ND:nmbs0?Y-s82i$Ep3N#rr2los-nH2s8UD\V>pJlrr*,us3PYVs8;TjJ,~> +nc&mks&K+*!13`^rVm3%rl+q4o_JIbrr2p1rr;logBnkirVccoron=!rql]\rsA])rZD1B!7CiE +kPkb_s&B'Qs88>c$NC)*L)U19Us8;Hf#Q=\m!&FTPrn7<)r;X3EjT#84D9:jU +^An5ND:nmbs0?Y-s82i$Ep3N#rr2los-nH2s8UD\V>pJlrr*,us3PYVs8;TjJ,~> +nc&mms/U?sG0Bp`rr3<(qu3pKnGiIerqud-rr;orZtmh`qu6QmpttE9r9F4er;HPSH[pJ*rVPdV +#5J-r!8.8HS,EHdr8C!?!!=_3rVQ6c#5J./!6Y9:o)/gjrU0_@rVHHFr>kb5Zu=t&r:>E/Z#f"( +rP<=$rV6>qE97&prRu%drVm9)s7_D5q#('\Q#k.Irs/Q'lA'Z=rVQ +nc&mks&K+*!13`^rr3<(q>P(=iW&fTrqud-rr;ipB)n7rq#1-hq;:QL9_Q#k1Hrrq_EHJADrpATR~> +nc&mks&K+*!13`^rr3<(q>P(=iW&fTrqud-rr;ipB)n7rq#1-hpttE9r9F4er;HO8!!*)GrVG^U +#5J-r!8.8HS,EHdr8C!?!!=_3rVQ6c#5J./!6Y9:o)/gjrU0_@rVHHFr>kb5Zu=t&r:>E/Z#f"( +rP<=$rV6>qE97&prRu%drVm9)s7_D5q#('\Q#k.Irs/Q'lA'Z=rVQ +nc&mms/U?sG0Bp`rr<#t#5X+>s8DrrqYpd!rVl27N;h]6"I"=gJ*u@s!`oBZQi@=W!!E<&! +nc&mks&K+*!13`^rr39&rq-^Js8;lqqYpd!r;GC_)ZJUn"<[[G!7U!.!ipG2Qi@>bEIr^jJ:i!9 +nG`QsE9HZh!rIM9eGfiaDs%*!s/^?eQN$mi`,+0-rVs3Cl2L\jm>Z:jl1auJnXF7/rVm8aH[<9n +q"OR3N,Z?!s*t~> +nc&mks&K+*!13`^rr39&rq-^Js8;lqqYpd!r;GC_)ZJUn"<[[G!7p31!`oBZQi@=W!!E<&! +nc&mms/U?sG0Bp`rr36%s7:TFrr)ikrs\o*s-80(oC;Pl_CtjRVI=jlb=t/a)3Wg#k?UkG;h:kN(dDEGr#BiodRW +`96.CU1hs;jlYdbQ=bAjI=?N\TA&GikN(m>EGTuNI=?-OR-*Jlp#gi~> +nc&mks&K+*!13`^rr36$s6'H!rqucjrs\o*s!S$.kN:pkp@.Y:o*P!Znf@c3!6=^#kOSoIo;6]i +oC8@B%e9,OLjjl(J:N-#HJ.lZp%&CWo<*,goC;DC#P.KQJ +nc&mks&K+*!13`^rr36$s6'H!rqucjrs\o*s!S$.kN:sjk2kahk6^;6jr=@%!57RVkN<'/k=krq +kN&/r"m"gh('=U9!!EB)Zf^?Ak6Br/>l_CtjRVI=jlb=t/a)3Wg#k?UkG;h:kN(dDEGr#BiodRW +`96.CU1hs;jlYdbQ=bAjI=?N\TA&GikN(m>EGTuNI=?-OR-*Jlp#gi~> +nc&mms/U?sG0Bp`rr33"rkiO,s8;Wk#lXc$P^7\$JQ%+"JH2hQJ,~> +nc&mks&K+*!13`^rr32ureUWes8)Ki"TA>t.KTGI!`snsk^!>VH?g&#!!6\\Gia5QIXld4H38A= +JUdQI!.46^!e#TGm +nc&mks&K+*!13`^rr32ureUWes8)Ki"TA>t.KP)#JH2\MJ,~> +nc&mms/U?sG0Bp`rr36%s6=jFrr)ikrsJc(s-A&*T;7E86fUK9,p4?R4QSm65sc=e3'op"630Ia +qZ$a"!&-`*og/jK65fh]6:(*-"?lep6:'0hs$Q]Ns$Q]N!(6]Os$QZM!($HK!'pEJ!($EJ!($0B +J,~> +nc&mks&K+*!13`^rr36$s4%+&rVQThrri?"s""3M63KYGNhi<2Ta@BcTG.A,!/./>kFi*QTo+8g +TqIpLs.BFeLOT2P"b2&NR%^2GTa%0`NI71gT^nc]TV8!.L7t95]qPJ!qk=.cT:l+U!hc6\rLsCf +U7e1NTn!~> +nc&mks&K+*!13`^rr36$s4%+&rVQThrri?"s""3,63%;j!!5&F60CQ=5sc=e3'op"630IaqZ$a" +!&-`*og/jK65fh]6:(*-"?lep6:'0hs$Q]Ns$Q]N!(6]Os$QZM!($HK!'pEJ!($EJ!($0BJ,~> +nc&mms/U?sG0Bp`rr36&s8.A6s8DrmrrrE#rUkr#h>[VFK8>0Qj8T0a!9TXJ!]C#]rW!$&!%7d9 +rrR$;f^8\>!&Ti +nc&mks&K+*!13`^rr36%s7ZOFs8;llrrrE"rTk@1h>[U#!!3/Pj8T1^FRkdu$(H0kJ:E*$H'/*r +rrTWJlL"TPJ=;W#J,~> +nc&mks&K+*!13`^rr36%s7ZOFs8;llrrrE"rTk@1h>[U$!!3/Vj8T0a!9TXJ!]C#]rW!$&!%7d9 +rrR$;f^8\>!&Ti +nc&mms/U?sG0Bp`rr39'r;EXJo)8Odq>U`us1rK`r;-BijSK8[qtc>!IsU5Rq<.VZpA7bgfDG?4 +qZ?QiT)J`i"9\],`rGl,qZcckAH9jLq"":eq>9R[1&LbBPl#t~> +nc&mks&K+*!13`^rr39'qYXA1k5>/Vq>UZrs+15rqY1!d!;u!X$2jc"*rlj8JlGr +nc&mks&K+*!13`^rr39'qYXA1k5>/Vq>UZrs+15rqY0"H$2XPq*rl +nc&mms/U?sG0Bp`rVm0$s4D,@s82iqqu7'&r:G_qoD\^grr;usrVlf_rsA])rfDMYI-CV/kPkb_ +s&B'Qs88Ad%0$2'^*Wj\!#fkWr;Q?g#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^rVm0#s0;X2s7lWnrVm?+s8DfZ'as4(r;Zcrrr2lqrp9Xkrr;s?!!3/Js8;'[ +#5nM$FmT/,S,WorrVkW5Iroph\GuO,o`#-ns0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^rVm0#s0;X2s7lWnrVm?+s8DfZ'as4(r;Zcrrr2lqrp9Xkrr;s?!!3/Js8;'[ +#5\@"!8@JNS,Worr;F>V!<<*t9o`#-ls(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rr<#ts8<5"K'NC5rVlfrrr*9%s2/Wcs8;ors8Dlq"9&9"rpKdmrr;tZI"?\/ +s8D-\#5\@"!8@JNSGrTgr;R&BVQ'7gqu6Wpp&>6ms(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr<#t#Q+Ep(tAT]qu$F$rV6DI!.+\As8N&sr;Qlts8W)drsA])rZD1B!7CiE +kPkbas/L5.s8AJf!<2or#ia1[q>^Ems8M]k#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^rr<#t#Q+Ep(tAT]qu$F$rV6DI!.+\As8N&sr;Qlts8W)drsA])rZD1B!7CiE +kPkb_s&B'Qs88De!<2or#f`a@p&Fpgs8M]k#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`r;R0(rVhb*lMpn`r;?Qnrt2qiK_#-@s8W)uqqBiXnGiLemJdLls8J+-JUH\] +rTF1bqYsOqgAh)?s8MutrVZZtrVuoso`#-ls(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^r;R0'r;@fNf)PdLqYL3jrt0SZ&*m/R$Rs8;lprr`9#s8MZj#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^r;R0'r;@fNf)PdLqYL3jrt0SZ&*Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rVm0&s8DrVI!N0RrVmW/mB:DrjSo,Xrr)iQNGi]OJA_?arpKdmrr;tZI"?\/ +s8D-\#5\@"!8@JNR/d3c!rVrmrVlEg#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^rVm0&s82f4"p&YLrVmW-g1:7JaSu,;rr)iQNGi]OJA_?arpKdmrr;s?!!3/J +s8;'[#5nM$FmT/,R/d3c!r`&qrr2Kg#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^rVm0&s82f4"p&YLrVmW-g1:7JaSu,;rr)iQNGi]OJA_?arpKdmrr;s?!!3/J +s8;'[#5\@"!8@JNR/d3c!rVrmrVlEg#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`r;RH0s8DuWST8V;_o&(!J8hXjs8DusrX/LYFg/WnKll;QrU0[lrr;tZI"?\/ +s8D-\#5\@"!8@JNJc>rNs(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^r;RH0s8;o870!rPs0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^r;RH0s8;o870!rNs(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`q>V6/s8UodJS]+ROH%rnrVccqs8DuoKp2N9"M&O0s8DBc$3'u(OF2V,kl:VE +rs&?"<<1bQr.4kPqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mks&K+*!13`^qu7N4s8;os^3g4e!!OJh[f?7&s8N&ss8%G5rr3,3ESpfpmf*Ums8F,@!W^XJ +r9+(ar;Wd>m/R$8rs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^qu7N4s8;os^3g4e!!OJh[f?7&s8N&ss8%G5rr3,3ESpfpmf*Ums8F,@!W^XJ +r9+(aqYsOqgAh)%rs&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`qu?]q#ljl&s8V]Af(&b>s8E<(rr<#srqh)(rr3,5B& +nc&mks&K+*!13`^qu?]q#lji$s8V;gZK2#bs8E<(rr<#srqh)(rr3,5B&m/R$8rs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^qu?]q#lji$s8V;gZK2#bs8E<(rr<#srqh)(rr3,5B& +nc&mms/U?sG0Bp`q>^Hns8Dors8E#srr2os%0$5'`KcscSs-APrr2?c$3'u(OF2V,kl:VErs&?" +<<1bQr.4kPqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mks&K+*!13`^q>^Hn!W;inrrW0!r;Q]prs\o*r5FqkT:V7Mp\t0[rsA])rZD1B!7CiEkPkba +s/L5.s8@NK#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^q>^Hn!W;inrrW0!r;Q]prs\o*r5FqkT:V7Mp\t0[rsA])rZD1B!7CiEkPkb_ +s&B'Qs87HJ#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`q>^Hns8Dlq!W;oqrr)j(rr)l+D/j6as8W)crsA])rfDMYI-CV/kPkb_s&B'Q +s87HJ#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^q>^Hn!W2inrrMuorr2lr$NC#([r$+uU]:AnmJdLls8F,@!W^XJr9+(ar;Wd> +m/R$8rs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^q>^Hn!W2inrrMuorr2lr$NC#([r$+uU]:AnmJdLls8F,@!W^XJr9+(aqYsOq +gAh)%rs&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`qu?]q!WW,tru'h*h"(7?s8Drsrr<#trVra3[)0S/N:QuHmf*Ums8J+-JUH\] +rTF1bqYsOqgAh)%rs&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^qu?]q!WW)sru&n.\`r_cs8;iqrr<#trVra3[)0S/N:QuHmf*Ums8F,@!W^XJ +r9+(ar;Wd>m/R$8rs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^qu?]q!WW)sru&n.\`r_cs8;iqrr<#trVra3[)0S/N:QuHmf*Ums8F,@!W^XJ +r9+(aqYsOqgAh)%rs&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`q>V6/s7s^+F_l2FLTKV;s8Duss8;oQE4GoI"P[k)s8; +nc&mks&K+*!13`^q>UTps72@Ar;[9;>K[!Gr;Zcrr;YSl\GlL2gMaV%r9jRkrr;s?!!3/Js8;'[ +#5nM$FmT/,Jc>rPs0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^q>UTps72@Ar;[9;>K[!Gr;Zcrr;YSl\GlL2gMaV%r9jRkrr;s?!!3/Js8;'[ +#5\@"!8@JNJc>rNs(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`r;Zfr+8l/cLMhsTgY0$%M0,]js8Dutqu4ZPeGT.?oQd/0rU0[lrr;tZI"?\/ +s8D-\#5\@"!8@JNJc>rNs(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^r;Zfr+8c)0)?:ah\$]p2'`_;'s8Dutqu4ZPeGT.?oQd/0rU0[lrr;s?!!3/J +s8;'[#5nM$FmT/,Jc>rPs0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^r;Zfr+8c)0)?:ah\$]p2'`_;'s8Dutqu4ZPeGT.?oQd/0rU0[lrr;s?!!3/J +s8;'[#5\@"!8@JNJc>rNs(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rVm0&s8;oFEf83>r;RK.`c$RZrr)lorlAm&s8DuhGbP-8mf*Ums8J+-JUH\] +rTF1bqYsOqgAh)%rs&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rVm0&s82hi!$\$1r;RK+OT65nrql`mrlAm&s8DuhGbP-8mf*Ums8F,@!W^XJ +r9+(ar;Wd>m/R$8rs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^rVm0&s82hi!$\$1r;RK+OT65nrql`mrlAm&s8DuhGbP-8mf*Ums8F,@!W^XJ +r9+(aqYsOqgAh)%rs&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`r;R$#rq(i$q#C?kr=o82e:i26rr)cphK>"Iq":b-]`7otrsA])rfDMYI-CV/ +kPkb_s&B'Qs87HJ#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^r;Zfq+6jXenGiLcqtprPs0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^r;Zfq+6jXenGiLcqtprNs(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rr<#t#6"@`FP$Qhrr*`6rr;uos3GPes8;lps/^$bJq7g!o`"gWrsA])rfDMY +I-CV/kPkb_s&B'Qs87HJ#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^rr<#t#5n*F!3cFsrr*`6rr;uls.03us8)`ns/^$bJq7g!o`"gWrsA])rZD1B +!7CiEkPkbas/L5.s8@NK#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^rr<#t#5n*F!3cFsrr*`6rr;uls.03us8)`ns/^$bJq7g!o`"gWrsA])rZD1B +!7CiEkPkb_s&B'Qs87HJ#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`rVm0$s3>H(s8;orr;Zfr&cDHcHL1\1rr)f:Q'[Z@nGiLTrsA])rfDMYI-CV/ +kPkb_s&B'Qs87HJ#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^rVm0"s.04Ts7u]orVulr&c)#C!SRMNrr)f:Q'[Z@nGiLTrsA])rZD1B!7CiE +kPkbas/L5.s8@NK#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^rVm0"s.04Ts7u]orVulr&c)#C!SRMNrr)f:Q'[Z@nGiLTrsA])rZD1B!7CiE +kPkb_s&B'Qs87HJ#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`rr39'r;<7Fqu-Kmq>V$(s35D`qtg6gqZ$Qprr;rmm.q%aqY?+rIX0uMpuhJX +p%hSef)#,lq?HWhAH9pRr:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rr39'qtWZ%p\Xpgq>UZqs-`pop\+U_qu6Znm/.1er;.Q9!@47 +lMUL0r!)upZ>nt*rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^rr39'qtWZ%p\Xpgq>UZqs-`pop\+U_#64]&rr;rmm.q%aqY;35! +nc&mms/U?sG0Bp`rr36&s87>7s8DrmrrrE#rVDM+h>[VIKo:Z]j8T0b!:,49rVm" +nc&mks&K+*!13`^rr36%s7cRNs8;llrrrE#rUq9:h>[U$!!3/Rj8T1_FS(.arVm#/E97,uo)Aso +s7h,4s8N"^s*t~> +nc&mks&K+*!13`^rr36%s7cRNs8;llrrrE#rUq9:h>[U%!!3/Zj8T0b!:,49rVm" +nc&mms/U?sG0Bp`rr36%rnhkArr)ikrsA]'s-/#N`5]NOjbjG&Mi(7s7RMW_MW]m%Ll3kcGDh +nc&mks&K+*!13`^rr36#rkJQ%rql]irs\o*s!\,-Mi*FR^W+4U`H#/eENFlWN"o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^rr36#rkJQ%rql]irs/Q%s!\,-Mi-PQ$&XXu&HDh3Ef5e;M["uq/c^*RM1LQh +Ll4=paT)/.rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`rr33#rlK$2rquNj#lXc%P^..\F?Y6U[/^9Srqu?e#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr33!rfdGlrqcBh"9&5t/,K;J6Zd),C]eHhCCU7C!a0PYkA1?>CjCSMCi+`> +s(qmZGio#(o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^rr33!rfdGlrqcBh"9&5t.tI])!!:LGr:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`rr36%s7q&Crr)ikrsA]'s-8&_f%/?UjfSolY,u/4=B(lpXllhkX0+J`Q*.3> +Xp(u3X1nW4nc&jms7$(Es8;k\s*t~> +nc&mks&K+*!13`^rr36$s764lrqucks8W')rVn8GWNNA+ZIS*g$.[VW)?9d +nc&mks&K+*!13`^rr36$s764lrqucks8W'&rVn8GWNNA`XpM55XVCg:!0=:akH5#iXuZQJY,m2W +"g5&0^An0%rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`rr<#t#5X@Cs8Doqq>UTrroJEkh>[VGKSbBVj8T0a!9f"6l2M"es7$(Es8;k\ +s*t~> +nc&mks&K+*!13`^rr<#s#5&u_s82fpq>UTprlYX"h>[U$!!3/Qj8T1^FRt(`l2M"fs7h,4s8N"^ +s*t~> +nc&mks&K+*!13`^rr<#s#5&u_s82fpq>UTprlYX"h>[U%!!3/Xj8T0a!9f"6l2M"es7$(Es8;k\ +s*t~> +nc&mms/U?sG0Bp`rVm0#s1EI;s8;orr;Zfr#lO\#DV"d_rVYaR$2XPqNI$)#jSSc9qZcck;ZPDG +pjr>AqZ-Qnrpp'orVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rVm0!s*4gps82iqr;R'%s8)ak!3Z7nrqkgU$2jc"*rl +nc&mks&K+*!13`^rVm0!s*4gps82iqr;R'%s8)ak!3Z7niqj&Yqt_B7! +nc&mms/U?sG0Bp`rr3?)rVl,-P4AJKs8N#t%0$;)s5eEjqu-Nns8Mrp!ri6!mJdLls8J+-JUH\] +rTF1bqYsOqgAh)%s6K[irVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rr3?)r;P:J/EH[)s8N#t%0$;'s2tKrq>C6ks8Mrp!ri6!mJdLls8F,@!W^XJ +r9+(ar;Wd>m/R$8s6K[irr;bDRK*9cPlH7~> +nc&mks&K+*!13`^rr3?)r;P:J/EH[)s8N#t%0$;'s2tKrq>C6ks8Mrp!ri6!mJdLls8F,@!W^XJ +r9+(aqYsOqgAh)%s6K[irVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`r;RW4s3bhcs8Muqrr2lpr;ZPhCtAXas8W)tr;Qcqli.:js8J+-JUH\]rTF1b +qYsOqgAh)%s6K[irVuBf1B7:OPlH7~> +nc&mks&K+*!13`^r;RW2s.fWrs8W#prr2imqZ$%^!3Q:ts8W)tr;Qcqli.:js8F,@!W^XJr9+(a +r;Wd>m/R$8s6K[irr;bDRK*9cPlH7~> +nc&mks&K+*!13`^r;RW2s.fWrs8W#prr2imqZ$%^!3Q:ts8W)tr;Qcqli.:js8F,@!W^XJr9+(a +qYsOqgAh)%s6K[irVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`qu6its/p7SpA4e%nW7[dqu-Norr)lKVl$HQs8DrarsA])rfDMYI-CV/kPkb_ +s&B'Qs87HJli.4gs7$(Es8;k\s*t~> +nc&mks&K+*!13`^qu6iss',PVmeZqrj +nc&mks&K+*!13`^qu6iss',PVmeZqrj +nc&mms/U?sG0Bp`r;Zfr+8kr.CkeeHs8V61`.<-Xr;Q]qrr)l,EcH;HEm+L]rpKdmrr;tZI"?\/ +s8D-\#5\@"!8@JNJcG'9#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^r;Rr>rVH+T!#/;Os8U +nc&mks&K+*!13`^r;Rr>rVH+T!#/;Os8U +nc&mms/U?sG0Bp`qZ$Tp*W4 +nc&mks&K+*!13`^qYpj"s7rQF!!!uYrW!TaZN'n&s8Musj`uHtmHg9ln,E:RrsA])rZD1B!7CiE +kPkbas/L5.s8@NKli.4hs7h,4s8N"^s*t~> +nc&mks&K+*!13`^qYpj"s7rQF!!!uYrW!TaZN'n&s8Musj`uHtmHg9ln,E:RrsA])rZD1B!7CiE +kPkb_s&B'Qs87HJli.4gs7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`qu7N4s8N&urp$Y@Krr>1q>^Bls8N&qrl/farr3,lFf#-9mf*Ums8J+-JUH\] +rTF1bqYsOqgAh)%s6K[irVuBf1B7:OPlH7~> +nc&mks&K+*!13`^qu7N4s8N&ur7>Ek&mUm/R$8s6K[irr;bDRK*9cPlH7~> +nc&mks&K+*!13`^qu7N4s8N&ur7>Ek&mU +nc&mms/U?sG0Bp`qZ$Qo!<)oss8Dor!r`/urr3E)s3,<-r;-B\Gbb9:mf*Ums8J+-JUH\]rTF1b +qYsOqgAh)%s6K[irVuBf1B7:OPlH7~> +nc&mks&K+*!13`^qZ$Qo!;lcqs8;iq!rW)trr3E)s3,<-r;-B\Gbb9:mf*Ums8F,@!W^XJr9+(a +r;Wd>m/R$8s6K[irr;bDRK*9cPlH7~> +nc&mks&K+*!13`^qZ$Qo!;lcqs8;iq!rW)trr3E)s3,<-r;-B\Gbb9:mf*Ums8F,@!W^XJr9+(a +qYsOqgAh)%s6K[irVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`q#C?ms8;os"o\;orVlfprs\f(a(s0(r;ZJ7V#UD]rsA])rfDMYI-CV/kPkb_ +s&B'Qs87HJli.4gs7$(Es8;k\s*t~> +nc&mks&K+*!13`^q#CBn$N9kts8W#ip&+ggrVm<'rl8g's8;ojGGP9;mf*Ums8F,@!W^XJr9+(a +r;Wd>m/R$8s6K[irr;bDRK*9cPlH7~> +nc&mks&K+*!13`^q#CBn$N9kts8W#ip&+ggrVm<'rl8g's8;ojGGP9;mf*Ums8F,@!W^XJr9+(a +qYsOqgAh)%s6K[irVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`qZ$Qo"o\H#s8N#rrt>;1s8N&ur;YJmR.:.QZZ;oBrU0[lrr;tZI"?\/s8D-\ +#5\@"!8@JNJcG'9#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^qZ$Qo!;lcqs8Mus')_e/rr<#rs4VR^nbrBlEi&g7mf*Ums8F,@!W^XJr9+(a +r;Wd>m/R$8s6K[irr;bDRK*9cPlH7~> +nc&mks&K+*!13`^qZ$Qo!;lcqs8Mus')_e/rr<#rs4VR^nbrBlEi&g7mf*Ums8F,@!W^XJr9+(a +qYsOqgAh)%s6K[irVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`qu7f +nc&mks&K+*!13`^qu7fm/R$8s6K[irr;bDRK*9cPlH7~> +nc&mks&K+*!13`^qu7f +nc&mms/U?sG0Bp`qZ$Tp*W4BNF`r_&HYRDIf`1pLs8N&ts8SsRLniXMU]:;\rsA])rfDMYI-CV/ +kPkb_s&B'Qs87HJli.4gs7$(Es8;k\s*t~> +nc&mks&K+*!13`^qYpj#s8&cO!!!iQrW!T=YlF\$s8N&ts8SsRLniXMU]:;\rsA])rZD1B!7CiE +kPkbas/L5.s8@NKli.4hs7h,4s8N"^s*t~> +nc&mks&K+*!13`^qYpj#s8&cO!!!iQrW!T=YlF\$s8N&ts8SsRLniXMU]:;\rsA])rZD1B!7CiE +kPkb_s&B'Qs87HJli.4gs7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`r;Zfr+8ku1D1oU^rr;$*_1I!BrVlfrrr;NIr;HNmq08S3rU0[lrr;tZI"?\/ +s8D-\#5\@"!8@JNJcG'9#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^r;Rr>rVH1Z!"jb#rr:$ +nc&mks&K+*!13`^r;Rr>rVH1Z!"jb#rr:$ +nc&mms/U?sG0Bp`qu6its0$=Qp%n[rmuM=aqu-Nms6Om%rr3,CD9r7[mf*Ums8J+-JUH\]rTF1b +qYsOqgAh)%s6K[irVuBf1B7:OPlH7~> +nc&mks&K+*!13`^qu6iss'GbUlh^Vhi$8;!q"t'hs6Om%rr3,CD9r7[mf*Ums8F,@!W^XJr9+(a +r;Wd>m/R$8s6K[irr;bDRK*9cPlH7~> +nc&mks&K+*!13`^qu6iss'GbUlh^Vhi$8;!q"t'hs6Om%rr3,CD9r7[mf*Ums8F,@!W^XJr9+(a +qYsOqgAh)%s6K[irVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`r;Rr=s3u"es8Muqrr2lpr;ZMfCtJ^brr)kcFMQ5JJYN,ArpKdmrr;tZI"?\/ +s8D-\#5\@"!8@JNJcG'9#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^r;Rr;s/5ots8Vuorr2imqZ#tZ!3cG!rr)kcFMQ5JJYN,ArpKdmrr;s?!!3/J +s8;'[#5nM$FmT/,JcG'9#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^r;Rr;s/5ots8Vuorr2imqZ#tZ!3cG!rr)kcFMQ5JJYN,ArpKdmrr;s?!!3/J +s8;'[#5\@"!8@JNJcG'9#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rr3?)rVl//ORW2Hs8N#t'`S.1s5\?jr;HWmrnDs?D/+Rfs8D?b$3'u(OF2V, +kl:VErs&?"<<1bQr.4n6rs/N&nGk?Er;Mr\J,~> +nc&mks&K+*!13`^rr3?)rVkIM.cU=%s8N#t'`S./s2b?rq>C6irnDs?D/+Rfs8D?b$3'u(+92HC +dJs.-rs&E$Wcd\.rIP"7rs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rr3?)rVkIM.cU=%s8N#t'`S./s2b?rq>C6irnDs?D/+Rfs8D?b$3'u(+92HC +dJs.-rs&?"<<1bQr.4n6rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`rVm*!s1EF9s8;`ns8ET-rhjYcs8;ors74:U`omC#m/@=irr%n)J:$JYr9+%` +q>O=ng&Cl"rp0Ogr;Q0c1B7:OPlH7~> +nc&mks&K+*!13`^rVm)ts*Fpos8)Tl')qq-r_* +nc&mks&K+*!13`^rVm)ts*Fpos8)Tl')qq-r_*O=ng&Cl"rp0Ogr;Q0c1B7:OPlH7~> +nc&mms/U?sG0Bp`rr<#t#5XCDs8Doqq>Ud"roA!7#Q4Sj!&FTPrfmG5~> +nc&mks&K+*!13`^rr<#s#5'#`s82fpq>UcurlGL!q#(*irVZZrrr;?a$2sl%*rl +nc&mks&K+*!13`^rr<#s#5'#`s82fpq>UcurlGL!q#(*irVZZqrTjFhrVla;!!*)HrqkmX#5S6t +!87AKJc>!7#Q4Sj!&FTPrfmG5~> +nc&mms/U?sG0Bp`rr36&s7q&Brr)ikrrrE#s-/*4hZ!_AIY3+9jo5J_s&K-VJcFp5"n_mQs8;k\ +s*t~> +nc&mks&K+*!13`^rr36$s764jrqucks8W'$rVn2Hr;?Qrrr;u[rrsSG!W^[Kroa:arr9!?m=G<# +rrr7LRfEBdPlH7~> +nc&mks&K+*!13`^rr36$s764jrqucks8W'$rVn2Hr8.GV+92HCeE-]5rr6"!hLY^irrr&r2#mLQ +PlH7~> +nc&mms/U?sG0Bp`rr33#rlK$1rquNj$N9u'PC/IPP]J&mjrasP+ +nc&mks&K+*!13`^rr33!rfmMlrqcBh%/p2(.0:Y8+!DnQP`Fsg$'((,&c_q4G*J!JNrk#aNId/Q +Ns'Wjs8Mt]s*t~> +nc&mks&K+*!13`^rr33!rfmMlrqcBh#Q=Z#.0:Y8+6+IG+!;X.rW!!<+4~> +nc&mms/U?sG0Bp`rr36$rn_eArr)ikrsJc(s-7qeKoBUV&E=6##lY&/%H@p""98j]%d+<*&f>ln +qu2i[J,~> +nc&mks&K+*!13`^rr36#rk/?$rql]irs\o*s""0^%Ls$`C5dl1LC&]jL(F=c!,mgMjbEnhItiN0 +kD'4tKY.9_rfmG5~> +nc&mks&K+*!13`^rr36#rk/?$rql]irrrE#s""0^h@9MdrVup,isl+n!"=Dgk7.Y.(jQ)XrfmG5~> +nc&mms/U?sG0Bp`rr36&s87>8s8DrmrsJc(rVMS+q#1*ir8me^qYU,KH@L8%qt]FP#57pm!7q&B +Jc"[."8VusrfdA4~> +nc&mks&K+*!13`^rr36%s7lXPs8;llrs\o*rV%B;oDAC]r;Z]Xr<`E#r#Yn>!71W?kPYV]rMar) +rVM0EkktV\s8W(^s*t~> +nc&mks&K+*!13`^rr36%s7lXPs8;llrs8W&rV%B;oDACEq[*,rqB#\ +kkbJXs8W(^s*t~> +nc&mms/U?sG0Bp`rr39'r;3.Equ-Kmq>UZss3>Marr(aS#*F:aI-L\1kPkb`s&B'Rs8@NKkPkY_ +s8W(_s*t~> +nc&mks&K+*!13`^rr39'qtNN"q"t$hq>UZqs.'-prr(jV$3'u(+92HCdJs.-rs&E$Wc[V-rIP"3 +rr`9#s8J8_J,~> +nc&mks&K+*!13`^rr39'qtNN"q"t$hq>UZqs.'-prr(aS"s +nc&mms/U?sG0Bp`rVm0$s35B(s8;orrVulr#5n:YH0bM/ir08_rr%n)J:$JYr9+%`q>O=ng&Cl" +roX1\s8J5^J,~> +nc&mks&K+*!13`^rVm0"s.'.Vs7u]orVulr#5Rm:!8.;Jir08_rr!o=! +nc&mks&K+*!13`^rVm0"s.'.Vs7u]orVulr#5Rm:!8.;Jir08_rr!o=!O=ng&Cl" +roX1\s8J5^J,~> +nc&mms/U?sG0Bp`rr<#t#6"@^FP6]jrr*?+rr;uos3PVes8;orj8TGbs8J+-JUH\]rTF1bqYsOq +gAh)%s+14Ds*t~> +nc&mks&K+*!13`^rr<#t#Q40C!3uRurVc^&s8McmTE& +nc&mks&K+*!13`^rr<#t#Q40C!3uRurVc^&s8McmTE& +nc&mms/U?sG0Bp`r;R$#rpt`$q>^Kmr +nc&mks&K+*!13`^r;R$#rob(Co)Jahq[*2trr8u:!7q/IiVs5`s8F,@!W^XJr9+(ar;Wd>m/R$8 +s+14Ds*t~> +nc&mks&K+*!13`^r;R$#rob(Co)Jahq[*2trr8u:!7q/IiVs5`s8F,@!W^XJr9+(aqYsOqgAh)% +s+14Ds*t~> +nc&mms/U?sG0Bp`rVm0&s8;oDEK/?5r;Qutb&`3^rr(dT$3'u(OF2V,kl:VErs&?"<<1bQr.4m! +s7ZJC~> +nc&mks&K+*!13`^rVm0&s82hf!%+Gsr;QupQN.bnrqkXR$3'u(+92HCdJs.-rs&E$Wcd\.rIP!" +s7ZJC~> +nc&mks&K+*!13`^rVm0&s82hf!%+Gsr;QupQN.bnrqkXR$3'u(+92HCdJs.-rs&?"<<1bQr.4m! +s7ZJC~> +nc&mms/U?sG0Bp`r;Zfr&H)RRKl;7Eh;5W3Q#)c[s8CjT$3'u(OF2V,kl:VErs&?"<<1bQr.4m! +s7ZJC~> +nc&mks&K+*!13`^r;Zfr&GuKs(B=GN]Y&2N.f_Bms8CjT$3'u(+92HCdJs.-rs&E$Wcd\.rIP!" +s7ZJC~> +nc&mks&K+*!13`^r;Zfr&GuKs(B=GN]Y&2N.f_Bms8CjT$3'u(+92HCdJs.-rs&?"<<1bQr.4m! +s7ZJC~> +nc&mms/U?sG0Bp`q>Us's7aI(FDbr +nc&mks&K+*!13`^q>UTps6u%=qZ$_To)JUDrsA])rZD1B!7CiEkPkbas/L5.s8@NKJcGHDJ,~> +nc&mks&K+*!13`^q>UTps6u%=qZ$_To)JUDrsA])rZD1B!7CiEkPkb_s&B'Qs87HJJcGHDJ,~> +nc&mms/U?sG0Bp`qu?]q!WW,trsIYp\_coIs8W)urnm_^rr;tZI"?\/s8D-\#5\@"!8@JNJcC<$ +pA]X~> +nc&mks&K+*!13`^qu?]q!WW)srsHViHG/J$s8W&trnm_^rr;s?!!3/Js8;'[#5nM$FmT/,JcC<$ +pA]X~> +nc&mks&K+*!13`^qu?]q!WW)srsHViHG/J$s8W&trnm_^rr;s?!!3/Js8;'[#5\@"!8@JNJcC<$ +pA]X~> +nc&mms/U?sG0Bp`q>^Hn!WE#prr`6!s8LmT$3'u(OF2V,kl:VErs&?"<<1bQr.4m!s7ZJC~> +nc&mks&K+*!13`^q>^Ko!r`#pqu6crrVulRrsA])rZD1B!7CiEkPkbas/L5.s8@NKJcGHDJ,~> +nc&mks&K+*!13`^q>^Ko!r`#pqu6crrVulRrsA])rZD1B!7CiEkPkb_s&B'Qs87HJJcGHDJ,~> +nc&mms/U?sG0Bp`p](6l"9&/qrVlfNrsA])rfDMYI-CV/kPkb_s&B'Qs87HJJcGHDJ,~> +nc&mks&K+*!13`^p](6l#lOPqr;HTns8LjS$3'u(+92HCdJs.-rs&E$Wcd\.rIP!"s7ZJC~> +nc&mks&K+*!13`^p](6l#lOPqr;HTns8LjS$3'u(+92HCdJs.-rs&?"<<1bQr.4m!s7ZJC~> +nc&mms/U?sG0Bp`a8ZJFs8J+-JUH\]rTF1bqYsOqgAh)%s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(ar;Wd>m/R$8s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(aqYsOqgAh)%s+14Ds*t~> +nc&mms/U?sG0Bp`a8ZJFs8J+-JUH\]rTF1bqYsOqgAh)%s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(ar;Wd>m/R$8s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(aqYsOqgAh)%s+14Ds*t~> +nc&mms/U?sG0Bp`a8ZJFs8J+-JUH\]rTF1bqYsOqgAh)%s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(ar;Wd>m/R$8s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(aqYsOqgAh)%s+14Ds*t~> +nc&mms/U?sG0Bp`a8ZJFs8J+-JUH\]rTF1bqYsOqgAh)%s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(ar;Wd>m/R$8s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(aqYsOqgAh)%s+14Ds*t~> +nc&mms/U?sG0Bp`a8ZJFs8J+-JUH\]rTF1bqYsOqgAh)%s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(ar;Wd>m/R$8s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(aqYsOqgAh)%s+14Ds*t~> +nc&mms/U?sG0Bp`a8ZJFs8J+-JUH\]rTF1bqYsOqgAh)%s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(ar;Wd>m/R$8s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(aqYsOqgAh)%s+14Ds*t~> +nc&mms/U?rG00[Xa8?8@r;2P&J:-S\rTF1bqYsOqgAh)%s+14Ds*t~> +nc&mks&K+)!0m?Qa8-,m/R$8s+14Ds*t~> +nc&mks&K+)!0m?Qa8-, +nc&gks/U?sFjS#*#*F7`I-CV/kPkb_s&B'Qs87HJJcGHDJ,~> +nc&gis&K+*!2@@1"sO$K!7CiEkPkb`s/C)+s8@NKJcGHDJ,~> +nc&gis&K+*!2@@1"sO$K!7CiEkPkb_s&B'Qs87HJJcGHDJ,~> +nc&mms/U?qI%7CC`30B"IXlh0s8D-\#5\@"!8@JNJcC<$pA]X~> +nc&mks&K+&!'+Fna']3\?sa +nc&mks&K+&!'+Fna']3\?sa +nc&mms/^EpJ9lB_`-)?6J:Dt1rr)$[#5\@"!SRMNJcC<$pA]X~> +nc&agr`B.%]`8-8dJj(,rs&B#U0[6frIP!"s7ZJC~> +nc&agr`B.%]`8-8dJj(,rs&?"<<1bQr.4m!s7ZJC~> +nc&gjs/(!mJqLpns+1B+Gio&(kPkb^s&&jNs87HJJcGHDJ,~> +nc&ghs%EJ!":)dL"pG,5!6tQ@kPkb_s',Q^s87HJJcGHDJ,~> +nc&ghs%EJ!":)dL"pG,5!6tQ@kPkb_s&B'Qs87HJJcGHDJ,~> +nc&^hrl/umFTlr.Nq3/IkPkb`s,]G4s87HJJcGHDJ,~> +nc&[frf+Mi"!Qe(rTF1bq>X@nf`1i"s+14Ds*t~> +nc&[frf+Mi"!Qe(rTF1bqYsOqgAh)%s+14Ds*t~> +nc/Xg!rp]d^;^8kn,N@Krs&E$Y'o[:rIP!"s7ZJC~> +nG`Xis.t[7^l/DVN8Xa6k5PY^s&B'Qs87HJJcGHDJ,~> +nG`Xis.t[7^l/DVN8Xa6k5PY^s&B'Qs87HJJcGHDJ,~> +n,ECe])Mj2s8M3]#5eG"F6rr*JcC<$pA]X~> +n,ECd])Mj2s8M3]#5\@"!8@JNJcC<$pA]X~> +n,ECd])Mj2s8M3]#5\@"!8@JNJcC<$pA]X~> +nGiOf!<'S.!ri6!k5PY`s/L5.s8@NKJcGHDJ,~> +nc/Uf!;jG*!r`/uk5PY^s&B'Qs87HJJcGHDJ,~> +nc/Uf!;jG*!r`/uk5PY^s&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +RK)jW#5eD!FmK&)oDX=@K`?Q~> +S,WNgs76*mq#+.lf_t[ +S,WNgs76*mq#+.lf_t[ +Rf +SGrZis8DHe!`oB\nc&[hs8ITLL];l~> +SGrZis8DHe!`oB\nc&[hs8ITLL];l~> +SH&Wg!rqlYo^2qLm\G$^md0W7"RP^Zrr.KKL];l~> +S,WWjs5r+mp"Tc(gdqLYgtMJW"Pqkps8ITLLAuc~> +S,WWjs5r+mp"Tc(gdqLYgtMJW"Pqkps8ITLLAuc~> +SGrckro\oaK(=HmK(FNsJq/I7rr%EJL];l~> +SGrcjrm)2\"S)Wp"S2^!"9f@Zrqq?IL];l~> +SGrcjrm)2\"S)Wp"S2^!"9f@Zrqq?IL];l~> +SGr`is4;+3iH>?JCt/L_JcCN*J,~> +SGrZes01;Z!ic4rJcCN*J,~> +SGrZes01;Z!ic4rJcCN*J,~> +SH&Wg!r9I3iN`Tj](u@)JcCN*J,~> +SGrckrq(MJB(BL5AFj@9An?2Xrr%EJL];l~> +SGrckrq(MJB(BL5AFj@9An?2Xrr%EJL];l~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +SGrZis8LjP!ri6!JcCN*J,~> +SH&Tfh>.3Ps8ITLL];l~> +SH&Tfh>.3Ps8ITLL];l~> +S,`Hdr;?Hk"onQ!rr;usrs/Q'rqucqs8Mro!<)or!WW.Ms,$c+~> +S,`Hdr;?Hk"onQ!rr;usrs/Q'rqucqs8Mro!<)or!WW.Ms,$c+~> +S,`Hdr;?Hk"onQ!rr;usrs/Q'rqucqs8Mro!<)or!WW.Ms,$c+~> +SGr]js8N#os8W)prrW3"rpTjfrr)iqJcCZ.J,~> +SGr]js8N#os8W)prrW3"rpTjfrr)iqJcCZ.J,~> +SGr]js8N#os8W)prrW3"rpTjfrr)iqJcCZ.J,~> +Sc9/us8Musp +Sc9/us8Musp +Sc9/us8Musp +SGt2?rVs3RDJX-)Dh5M"rr)fqOD(Kgr;Q`rqu=WCcN!q;HZ +SGt2?rVs3RDJX-)Dh5M"rr)fqOD(Kgr;Q`rqu=WCcN!q;HZ +SGt2?rVs3RDJX-)Dh5M"rr)fqOD(Kgr;Q`rqu=WCcN!q;HZ +Sc8omrq2t&LsH"H-Hh$\W:p5hs-\:Uc2[_@rquf=DUSRbp4JLTcI&_SQ?I5Os8;lqJcC`0J,~> +Sc8omrq2t&LsH"H-Hh$\W:p5hs-\:Uc2[_@rquf=DUSRbp4JLTcI&_SQ?I5Os8;lqJcC`0J,~> +Sc8omrq2t&LsH"H-Hh$\W:p5hs-\:Uc2[_@rquf=DUSRbp4JLTcI&_SQ?I5Os8;lqJcC`0J,~> +TE"rj"oSA)Cp3:)rtt(!Drq#ss-8(lId[46s8;o>Csr@`pO8S.rrq;@G1uupJcC]/J,~> +TE"rj"oSA)Cp3:)rtt(!Drq#ss-8(lId[46s8;o>Csr@`pO8S.rrq;@G1uupJcC]/J,~> +TE"rj"oSA)Cp3:)rtt(!Drq#ss-8(lId[46s8;o>Csr@`pO8S.rrq;@G1uupJcC]/J,~> +T)UPDs4q[ds8W#qr;HNmnTCB"r;Vt;icCjlrVl]ob&#N+s7Ur0r;- +T)UPDs4q[ds8W#qr;HNmnTCB"r;Vt;icCjlrVl]ob&#N+s7Ur0r;- +T)UPDs4q[ds8W#qr;HNmnTCB"r;Vt;icCjlrVl]ob&#N+s7Ur0r;- +TDp;fDb[Irr;usrVsm[rVcb]Jc +TDp;fDb[Irr;usrVsm[rVcb]Jc +TDp;fDb[Irr;usrVsm[rVcb]Jc +TE"rj#Pa+1nc&Lds8;iqs8W'?s-804q1j=frVQW;Csr@`pOAV2rVlisrr)i_FKtiCJcC`0J,~> +TE"rj#Pa+1nc&Lds8;iqs8W'?s-804q1j=frVQW;Csr@`pOAV2rVlisrr)i_FKtiCJcC`0J,~> +TE"rj#Pa+1nc&Lds8;iqs8W'?s-804q1j=frVQW;Csr@`pOAV2rVlisrr)i_FKtiCJcC`0J,~> +TDo/ps7h,3s8Drlrtk\5s-/02s3GeZs82i=Csr@`pOAV2rVlfr#5nMaEioB=JcC`0J,~> +TDo/ps7h,3s8Drlrtk\5s-/02s3GeZs82i=Csr@`pOAV2rVlfr#5nMaEioB=JcC`0J,~> +TDo/ps7h,3s8Drlrtk\5s-/02s3GeZs82i=Csr@`pOAV2rVlfr#5nMaEioB=JcC`0J,~> +TE"rj$2K1 +TE"rj$2K1 +TE"rj$2K1 +TE"rj-M`7Zs8Drps-e"VH[Bsdp&G&WKDPTGp47bdrlAp(s8VhCRK*6brr33$s6+L+s87HJNW4M~> +TE"rj-M`7Zs8Drps-e"VH[Bsdp&G&WKDPTGp47bdrlAp(s8VhCRK*6brr33$s6+L+s87HJNW4M~> +TE"rj-M`7Zs8Drps-e"VH[Bsdp&G&WKDPTGp47bdrlAp(s8VhCRK*6brr33$s6+L+s87HJNW4M~> +TDp> +TDp> +TDp> +TE"rj#Pj@%jSo)Wrqud6R=G#3s-865s8DorVf(bHC"!%]pOAV2rVlfr#5nJ]E4,`DJcC`0J,~> +TE"rj#Pj@%jSo)Wrqud6R=G#3s-865s8DorVf(bHC"!%]pOAV2rVlfr#5nJ]E4,`DJcC`0J,~> +TE"rj#Pj@%jSo)Wrqud6R=G#3s-865s8DorVf(bHC"!%]pOAV2rVlfr#5nJ]E4,`DJcC`0J,~> +T)U29s2Ju[s8Doqrr)cls-eK5rr879qZ$QnrptT)`,3p%s7Ur0r;- +T)U29s2Ju[s8Doqrr)cls-eK5rr879qZ$QnrptT)`,3p%s7Ur0r;- +T)U29s2Ju[s8Doqrr)cls-eK5rr879qZ$QnrptT)`,3p%s7Ur0r;- +T)\ii"8@jrXnr&6p5jass8S@:qZ$Nor;Y5eO*&bKs7^u3qYp]0DP@+.JcC]/J,~> +T)\ii"8@jrXnr&6p5jass8S@:qZ$Nor;Y5eO*&bKs7^u3qYp]0DP@+.JcC]/J,~> +T)\ii"8@jrXnr&6p5jass8S@:qZ$Nor;Y5eO*&bKs7^u3qYp]0DP@+.JcC]/J,~> +Sc9H&s5A?IWTX-SqtA!fDO^J#s-AB8s8N#tr!B?GHI2]lp4JIOrlkDe#+BL`i;W]SJcC`0J,~> +Sc9H&s5A?IWTX-SqtA!fDO^J#s-AB8s8N#tr!B?GHI2]lp4JIOrlkDe#+BL`i;W]SJcC`0J,~> +Sc9H&s5A?IWTX-SqtA!fDO^J#s-AB8s8N#tr!B?GHI2]lp4JIOrlkDe#+BL`i;W]SJcC`0J,~> +T)\iis8=)%Me[ZoKS>(sFgUi@r;V_$q>^Ems8DudLM>$5s7LbZr+lURG,+-urVleIs,I&/~> +T)\iis8=)%Me[ZoKS>(sFgUi@r;V_$q>^Ems8DudLM>$5s7LbZr+lURG,+-urVleIs,I&/~> +T)\iis8=)%Me[ZoKS>(sFgUi@r;V_$q>^Ems8DudLM>$5s7LbZr+lURG,+-urVleIs,I&/~> +S,XZ1s6RalOckog[FkNZrr2rJcMdeBs8N&ss6@Pis8VuAbl#cibM`F#rIP!+s*t~> +S,XZ1s6RalOckog[FkNZrr2rJcMdeBs8N&ss6@Pis8VuAbl#cibM`F#rIP!+s*t~> +S,XZ1s6RalOckog[FkNZrr2rJcMdeBs8N&ss6@Pis8VuAbl#cibM`F#rIP!+s*t~> +ScA`h!WW,nrrN)tp\t +ScA`h!WW,nrrN)tp\t +ScA`h!WW,nrrN)tp\t +S,WTis8Mrorr;rqrWW?#r;Q`qrr36&s8Dlps8W)oquZirrdk*+s*t~> +S,WTis8Mrorr;rqrWW?#r;Q`qrr36&s8Dlps8W)oquZirrdk*+s*t~> +S,WTis8Mrorr;rqrWW?#r;Q`qrr36&s8Dlps8W)oquZirrdk*+s*t~> +R/d$^JcC<$kl6/~> +R/d$^JcC<$kl6/~> +R/d$^JcC<$kl6/~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/poc/lpc2148_efsl/docs/readme_arm7.txt b/poc/lpc2148_efsl/docs/readme_arm7.txt new file mode 100644 index 0000000..d00731f --- /dev/null +++ b/poc/lpc2148_efsl/docs/readme_arm7.txt @@ -0,0 +1,223 @@ +* +* efsl SD-Card SPI-Interface for +* - Philips LPC2000 ARM7TDMI-S +* - Atmel AT91SAM7S ARM7TDMI +* +* The LPC2000 and AT91SAM7 interfaces are +* Copyright (c) 2005, 2006 +* by Martin Thomas, Kaiserslautern, Germany +* +* http://www.siwawi.arubi.uni-kl.de/avr_projects +* + +All interfaces inherit the license from the +main efsl-source. + +------------------------------------------------- + +Changelog: + +20060910 mthomas +* bug-fix in AT91SAM7-interface (for CS with GPIO during init) +* variable Chip-Select in AT91SAM7-interface +* applied more patches, sync with efsl 0.2.8 + (just one instruction) +* modified AT91SAM7 example + +20060531 mthomas +* applied patches found in the efsl sf.net project-pages. + The patches are marked with #warning in the source since + they are not part of the "official" efsl source-code + +------------------------------------------------- + +Common "ARM7" Interface Information: + +- A GNU arm-elf toolchain/cross-compiler + must be available to build the examples + and the library. + Ready-made toolchains: i.e. WinARM or + GNUARM + Other ARM-compilers may work too but + have not been tested. + +- #define BYTE_ALIGNMENT is disabled + for the ARM-interfaces in config*.h + It didn't work with alignment enabled. + +- The hardware connection is similar + to the connection described + in the efsl-manual for Atmel AVRs. + Pullup-Resistors should be optional. + Tests did work without pullups. + +------------------------------------------------- + +For each interface an example application +is provided in the examples-directory. The +examples can be build with the library +libefsl.a or with the efsl source-code. + +(1) To use the efsl-source "directly" + +- Verfiy that conf/config.h is present + and the settings match the used + interfaces (see templates). +- Modify the line in the example's + Makefile to: EFSL_AS_LIB = 0 +- "make all" in the example's directory. + +(2) To use the efsl-library (libefsl.a) + +- Verfiy that conf/config.h is present + and the settings match the used + interfaces (see templates). +- Build the library libefsl.a with + the Makefile from the efsl root- + directory for the used interface. + (i.e. "make --makefile=Makefile-AT91 lib" + or "make --makefile=Makefile-LPC2000 lib" ) +- Modify the line in the example's + Makefile to: EFSL_AS_LIB = 1 +- "make all" in the example's directory + + +The example-applications demonstrate: + +- Init of the efsl ARM debug-system +- Init of the efsl +- List contents of the SD-Card's + root directory +- Open a file and type the content +- Append a line of text to a file +- "cat/type" the file's content again + +The applications print status- and +debug-messages to the UART1 on +LPC2000 or DBGU on AT91SAM7 +(115200,8,N,1,no FC). + +------------------------------------------------- + +Additional Information for the LPC2000 Interface + +- The efsl-interface supports SD-Cards + connected to the LPC2000 SPI ("SPI0") + and SSP ("SPI1") interface. The used + SPI-interface is hardcoded by the value + defined in config.h and can not be + changed during runtime. + +- Only some parts of the LPC2000-family + have the fast SSP-Interface (i.e. LPC213x, + LPC214x) others only provide the slower + SPI interface. + +- To build the library create the file + conf/config.h based on the template + config-sample-lpc2000.h and use the + makefile Makefile-LPC2000 in the + efsl-root-directory for LPC2000s + (ARM7TDMI-S). + +- I have tested the interface with a + LPC2138-controller and the SPI(0) + and SSP/SPI1-Interface. Other + LPC2000-ARM7 controllers should be + supported too. (I have got positive + feedback from LPC2148-users). + Verify that the register-adresses in + inc/interfaces/LPC2000_regs.h + match the used controller and the + maximum speed defined in lpc2000_spi.c + is available for the part. Verify the + pin-connections in lpc2000_spi.c. + Adjust the memory-setting in the linker-script. + +- LPC2000 TODO: 16bit, FIFO (patches available at sf.net) + +------------------------------------------------- + +Additional Information for the AT91 Interface + +- The interface supports SD-Cards connected + to the AT91SAM7 SPI interface. + +- To build the library create a file + conf/config.h based on the template + config-sample-at91.h and use the + makefile Makefile-AT91 in the + efsl-root-directory for AT91 (ARM7TDMI). + +- The AT91SAM7 offers 4 chip-select + signals which can be mapped to + different pins. Chip-select is done + by the hardware. See at91_spi.c + for configuration options. + Chip-Select can be fixed or variable + (Fixed or variable peripheral select - see + option in AT91_spi.c, further information + in the datasheet). + +- I have tested the interface with AT91SAM7S256 + and SAM7S64 controllers. Other AT91-ARM7 controllers + should be supported too. + To adapt the code for another AT91 with SPI: + - check if the register-defintions in AT91SAM7S_regs.h + are valid for the target. The file can be replaced + by header file provided by Atmel for the used part + (see at91.com) + - verify the maximum speed in at91_spi.c + - verfiy the pin-connections in at91_spi.c + - Check the memory-settings in the linker-script of + the example. + +- AT91 TODO: PDC/"DMA", 16bit-transfer, SSC-support, + +------------------------------------------------- + +Test Hard- and Software: + +- Keil (keil.com) MCB2130 board with LPC2138 + with additional SD/MMC-connector (from Buerklin.de) +- Atmel AT91SAM7S-EK board with AT91SAM7S64 + with additional SD/MMC-connector +- SAM7-P board with AT91SAM7S256 + with on-board SD/MMC-connector + +- SanDisk "standard" SD-Card 256MB + (not the "highspeed"-version) + +- WinARM (arm-elf GNU toolchain) +- Bray++ Terminal + +WinARM is available at: +http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects + +------------------------------------------------- + +Credits: + +- The code in efsl_debug_printf_arm.c is based + on code from Holger Klabunde and has been + modified to support a "fdevopen"-function + (efsl_debug_devopen_arm). + The original code has no copyright-notice and + is derived from an free code by Volker Oth. + +- Register-definitions for LPC213x are + based on a header-file from Keil GmbH + (supplied with the DKARM trial-version). + +- Register-definitions for AT91SAM7 are from + at91.com (provided by Atmel). + +- The basic method to handle the SPI interface + on AT91 has been found in a free example from + Olimex.com. + +------------------------------------------------- + + +I hope the ARM-interfaces are useful for you. +Martin Thomas 9/2006 diff --git a/poc/lpc2148_efsl/docs/schematics/objectmodel.dia b/poc/lpc2148_efsl/docs/schematics/objectmodel.dia new file mode 100644 index 0000000000000000000000000000000000000000..2af6d52d6fb0a7c035c5494ffd7db00c490c9025 GIT binary patch literal 1198 zcmV;f1X24RiwFP!000001MQn#kJ>mChVSQBM48(*Bu>JFQmA&ds2Kuk$ej`QpnsqtYPFNQ9I3_!z(EF(kbI@Dvg45wQfvbfQ~^scVS(ae!$! z(Z7HD_}0@uOz++Y7`_vKA%l@7&Y(&9Y@#nYU%eX)Hk*w>wh81hGYDQA2^#zl34sF< zG|;Danzk=yT}*2wA+Qfu2VdaehoqhmuyIQf zEh-xv@a61D(RAhNTSe-RIKgv*nnsT)znc8^I`Y+bC+pt3(EVFV zHZj$mnQ2~@Vu1-cAw_v#d0q;Rp16LbRaIiz$eZo$N^zBK;73eQ%SP}(_iUS+nDVA% z>2YlVBTTkpOpqqJmhf$AbK%+i)V~pVL>&8YzZ;!Dg4)VzSY4*!ndOHgm$ckXnyl!h zX1CWP)-5R6QCmk*s=rwj#>g_`eWcJCxApDJpq0j0{n#&zXyP70Dxf+ zfQ|s*$O6Ff)B+&W9|NEq01}1t0QhYH@DF4hb77&L0?H|1_7v!d0^kw# z=zs%2@pS@F_7Uj8a4Xl2lWoFL)RRFq87#-JdNy2*4T1_ZfGiMz_$++iz=xqUAJXsF zjgdk^jEs?+=5WU1pP5}lx^T~-bhdR;AF4)i|0H6ObYK6YNm$DZ^R z8|5wr)(eY)(~*n8aSvx#czO@tnui?;58JQf;gPh5J>?#Lc=51pcI9F3sE2K{_wWsR z*p~1xcpVR0(!Z>+9n~hb?VX8-9htaRRm+{&y@_wl#6ZHtmaK{M=h-jmrgx>E+D-3% M0+E65GS! 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 Zs?X(bwoD%yKk71l_zyKH2!!}e005#5ZMpye literal 0 HcmV?d00001 diff --git a/poc/lpc2148_efsl/docs/schematics/sector.eps b/poc/lpc2148_efsl/docs/schematics/sector.eps new file mode 100644 index 0000000..1146c2e --- /dev/null +++ b/poc/lpc2148_efsl/docs/schematics/sector.eps @@ -0,0 +1,1407 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/len/DSR-X20/len/efsl/docs/schematics/sector.dia +%%Creator: Dia v0.94 +%%CreationDate: Mon May 2 13:27:40 2005 +%%For: len +%%Orientation: Portrait +%%Magnification: 1.0000 +%%BoundingBox: 0 0 910 202 +%%BeginSetup +%%EndSetup +%%EndComments +%%BeginProlog +[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright +/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon +/less /equal /greater /question /at /A /B /C /D /E +/F /G /H /I /J /K /L /M /N /O +/P /Q /R /S /T /U /V /W /X /Y +/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c +/d /e /f /g /h /i /j /k /l /m +/n /o /p /q /r /s /t /u /v /w +/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright +/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior +/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf +/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla +/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde +/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex +/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring +/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis +/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave +/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def +/cp {closepath} bind def +/c {curveto} bind def +/f {fill} bind def +/a {arc} bind def +/ef {eofill} bind def +/ex {exch} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth pop} bind def +/tr {translate} bind def + +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse +{ ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def /savematrix mtrx currentmatrix def + x y tr xrad yrad sc + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def + +/mergeprocs { +dup length +3 -1 roll +dup +length +dup +5 1 roll +3 -1 roll +add +array cvx +dup +3 -1 roll +0 exch +putinterval +dup +4 2 roll +putinterval +} bind def +/dpi_x 300 def +/dpi_y 300 def +/conicto { + /to_y exch def + /to_x exch def + /conic_cntrl_y exch def + /conic_cntrl_x exch def + currentpoint + /p0_y exch def + /p0_x exch def + /p1_x p0_x conic_cntrl_x p0_x sub 2 3 div mul add def + /p1_y p0_y conic_cntrl_y p0_y sub 2 3 div mul add def + /p2_x p1_x to_x p0_x sub 1 3 div mul add def + /p2_y p1_y to_y p0_y sub 1 3 div mul add def + p1_x p1_y p2_x p2_y to_x to_y curveto +} bind def +/start_ol { gsave 1.1 dpi_x div dup scale} bind def +/end_ol { closepath fill grestore } bind def +28.346000 -28.346000 scale +-6.950000 -16.050000 translate +%%EndProlog + + +1.000000 1.000000 1.000000 srgb +n 7.000000 9.000000 m 7.000000 16.000000 l 39.000000 16.000000 l 39.000000 9.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 7.000000 9.000000 m 7.000000 16.000000 l 39.000000 16.000000 l 39.000000 9.000000 l cp s +1.000000 1.000000 1.000000 srgb +n 8.000000 11.000000 m 8.000000 15.000000 l 23.000000 15.000000 l 23.000000 11.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 8.000000 11.000000 m 8.000000 15.000000 l 23.000000 15.000000 l 23.000000 11.000000 l cp s +1.000000 1.000000 1.000000 srgb +n 9.000000 13.000000 m 9.000000 14.000000 l 13.000000 14.000000 l 13.000000 13.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 9.000000 13.000000 m 9.000000 14.000000 l 13.000000 14.000000 l 13.000000 13.000000 l cp s +gsave 10.100000 13.700000 translate 0.035278 -0.035278 scale +start_ol +896 1600 moveto +896 384 lineto +1632 384 lineto +2007 384 2187 534 conicto +2368 684 2368 993 conicto +2368 1304 2187 1452 conicto +2007 1600 1632 1600 conicto +896 1600 lineto +896 2944 moveto +896 1984 lineto +1575 1984 lineto +1911 1984 2075 2102 conicto +2240 2221 2240 2464 conicto +2240 2705 2075 2824 conicto +1911 2944 1575 2944 conicto +896 2944 lineto +448 3328 moveto +1608 3328 lineto +2127 3328 2407 3117 conicto +2688 2906 2688 2517 conicto +2688 2216 2546 2037 conicto +2404 1859 2129 1815 conicto +2455 1743 2635 1514 conicto +2816 1286 2816 943 conicto +2816 492 2514 246 conicto +2212 0 1654 0 conicto +448 0 lineto +448 3328 lineto +end_ol grestore +gsave 10.514867 13.700000 translate 0.035278 -0.035278 scale +start_ol +1477 -262 moveto +1305 -695 1142 -827 conicto +980 -960 707 -960 conicto +384 -960 lineto +384 -640 lineto +622 -640 lineto +789 -640 881 -555 conicto +974 -471 1085 -156 conicto +1159 33 lineto +128 2496 lineto +590 2496 lineto +1361 544 lineto +2131 2496 lineto +2560 2496 lineto +1477 -262 lineto +end_ol grestore +gsave 10.878933 13.700000 translate 0.035278 -0.035278 scale +start_ol +832 3200 moveto +832 2496 lineto +1664 2496 lineto +1664 2176 lineto +832 2176 lineto +832 804 lineto +832 495 914 407 conicto +997 320 1248 320 conicto +1664 320 lineto +1664 0 lineto +1248 0 lineto +793 0 620 173 conicto +448 347 448 804 conicto +448 2176 lineto +128 2176 lineto +128 2496 lineto +448 2496 lineto +448 3200 lineto +832 3200 lineto +end_ol grestore +gsave 11.116000 13.700000 translate 0.035278 -0.035278 scale +start_ol +2624 1352 moveto +2624 1152 lineto +704 1152 lineto +731 715 960 485 conicto +1189 256 1597 256 conicto +1834 256 2056 320 conicto +2278 384 2496 512 conicto +2496 128 lineto +2273 34 2039 -15 conicto +1805 -64 1565 -64 conicto +961 -64 608 284 conicto +256 632 256 1225 conicto +256 1839 595 2199 conicto +934 2560 1509 2560 conicto +2024 2560 2324 2235 conicto +2624 1910 2624 1352 conicto +2240 1472 moveto +2235 1822 2043 2031 conicto +1852 2240 1537 2240 conicto +1180 2240 965 2038 conicto +750 1836 718 1470 conicto +2240 1472 lineto +end_ol grestore +gsave 11.488533 13.700000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 11.683267 13.700000 translate 0.035278 -0.035278 scale +start_ol +1471 3008 moveto +1120 3008 944 2672 conicto +768 2336 768 1663 conicto +768 992 944 656 conicto +1120 320 1471 320 conicto +1824 320 2000 656 conicto +2176 992 2176 1663 conicto +2176 2336 2000 2672 conicto +1824 3008 1471 3008 conicto +1472 3392 moveto +2033 3392 2328 2949 conicto +2624 2506 2624 1663 conicto +2624 822 2328 379 conicto +2033 -64 1472 -64 conicto +911 -64 615 379 conicto +320 822 320 1663 conicto +320 2506 615 2949 conicto +911 3392 1472 3392 conicto +end_ol grestore +1.000000 1.000000 1.000000 srgb +n 13.000000 13.000000 m 13.000000 14.000000 l 17.000000 14.000000 l 17.000000 13.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 13.000000 13.000000 m 13.000000 14.000000 l 17.000000 14.000000 l 17.000000 13.000000 l cp s +gsave 14.100000 13.700000 translate 0.035278 -0.035278 scale +start_ol +896 1600 moveto +896 384 lineto +1632 384 lineto +2007 384 2187 534 conicto +2368 684 2368 993 conicto +2368 1304 2187 1452 conicto +2007 1600 1632 1600 conicto +896 1600 lineto +896 2944 moveto +896 1984 lineto +1575 1984 lineto +1911 1984 2075 2102 conicto +2240 2221 2240 2464 conicto +2240 2705 2075 2824 conicto +1911 2944 1575 2944 conicto +896 2944 lineto +448 3328 moveto +1608 3328 lineto +2127 3328 2407 3117 conicto +2688 2906 2688 2517 conicto +2688 2216 2546 2037 conicto +2404 1859 2129 1815 conicto +2455 1743 2635 1514 conicto +2816 1286 2816 943 conicto +2816 492 2514 246 conicto +2212 0 1654 0 conicto +448 0 lineto +448 3328 lineto +end_ol grestore +gsave 14.514867 13.700000 translate 0.035278 -0.035278 scale +start_ol +1477 -262 moveto +1305 -695 1142 -827 conicto +980 -960 707 -960 conicto +384 -960 lineto +384 -640 lineto +622 -640 lineto +789 -640 881 -555 conicto +974 -471 1085 -156 conicto +1159 33 lineto +128 2496 lineto +590 2496 lineto +1361 544 lineto +2131 2496 lineto +2560 2496 lineto +1477 -262 lineto +end_ol grestore +gsave 14.878933 13.700000 translate 0.035278 -0.035278 scale +start_ol +832 3200 moveto +832 2496 lineto +1664 2496 lineto +1664 2176 lineto +832 2176 lineto +832 804 lineto +832 495 914 407 conicto +997 320 1248 320 conicto +1664 320 lineto +1664 0 lineto +1248 0 lineto +793 0 620 173 conicto +448 347 448 804 conicto +448 2176 lineto +128 2176 lineto +128 2496 lineto +448 2496 lineto +448 3200 lineto +832 3200 lineto +end_ol grestore +gsave 15.116000 13.700000 translate 0.035278 -0.035278 scale +start_ol +2624 1352 moveto +2624 1152 lineto +704 1152 lineto +731 715 960 485 conicto +1189 256 1597 256 conicto +1834 256 2056 320 conicto +2278 384 2496 512 conicto +2496 128 lineto +2273 34 2039 -15 conicto +1805 -64 1565 -64 conicto +961 -64 608 284 conicto +256 632 256 1225 conicto +256 1839 595 2199 conicto +934 2560 1509 2560 conicto +2024 2560 2324 2235 conicto +2624 1910 2624 1352 conicto +2240 1472 moveto +2235 1822 2043 2031 conicto +1852 2240 1537 2240 conicto +1180 2240 965 2038 conicto +750 1836 718 1470 conicto +2240 1472 lineto +end_ol grestore +gsave 15.488533 13.700000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 15.683267 13.700000 translate 0.035278 -0.035278 scale +start_ol +576 384 moveto +1344 384 lineto +1344 2944 lineto +512 2752 lineto +512 3136 lineto +1330 3328 lineto +1792 3328 lineto +1792 384 lineto +2560 384 lineto +2560 0 lineto +576 0 lineto +576 384 lineto +end_ol grestore +1.000000 1.000000 1.000000 srgb +n 18.000000 13.000000 m 18.000000 14.000000 l 22.000000 14.000000 l 22.000000 13.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 18.000000 13.000000 m 18.000000 14.000000 l 22.000000 14.000000 l 22.000000 13.000000 l cp s +gsave 19.100000 13.700000 translate 0.035278 -0.035278 scale +start_ol +896 1600 moveto +896 384 lineto +1632 384 lineto +2007 384 2187 534 conicto +2368 684 2368 993 conicto +2368 1304 2187 1452 conicto +2007 1600 1632 1600 conicto +896 1600 lineto +896 2944 moveto +896 1984 lineto +1575 1984 lineto +1911 1984 2075 2102 conicto +2240 2221 2240 2464 conicto +2240 2705 2075 2824 conicto +1911 2944 1575 2944 conicto +896 2944 lineto +448 3328 moveto +1608 3328 lineto +2127 3328 2407 3117 conicto +2688 2906 2688 2517 conicto +2688 2216 2546 2037 conicto +2404 1859 2129 1815 conicto +2455 1743 2635 1514 conicto +2816 1286 2816 943 conicto +2816 492 2514 246 conicto +2212 0 1654 0 conicto +448 0 lineto +448 3328 lineto +end_ol grestore +gsave 19.514867 13.700000 translate 0.035278 -0.035278 scale +start_ol +1477 -262 moveto +1305 -695 1142 -827 conicto +980 -960 707 -960 conicto +384 -960 lineto +384 -640 lineto +622 -640 lineto +789 -640 881 -555 conicto +974 -471 1085 -156 conicto +1159 33 lineto +128 2496 lineto +590 2496 lineto +1361 544 lineto +2131 2496 lineto +2560 2496 lineto +1477 -262 lineto +end_ol grestore +gsave 19.878933 13.700000 translate 0.035278 -0.035278 scale +start_ol +832 3200 moveto +832 2496 lineto +1664 2496 lineto +1664 2176 lineto +832 2176 lineto +832 804 lineto +832 495 914 407 conicto +997 320 1248 320 conicto +1664 320 lineto +1664 0 lineto +1248 0 lineto +793 0 620 173 conicto +448 347 448 804 conicto +448 2176 lineto +128 2176 lineto +128 2496 lineto +448 2496 lineto +448 3200 lineto +832 3200 lineto +end_ol grestore +gsave 20.116000 13.700000 translate 0.035278 -0.035278 scale +start_ol +2624 1352 moveto +2624 1152 lineto +704 1152 lineto +731 715 960 485 conicto +1189 256 1597 256 conicto +1834 256 2056 320 conicto +2278 384 2496 512 conicto +2496 128 lineto +2273 34 2039 -15 conicto +1805 -64 1565 -64 conicto +961 -64 608 284 conicto +256 632 256 1225 conicto +256 1839 595 2199 conicto +934 2560 1509 2560 conicto +2024 2560 2324 2235 conicto +2624 1910 2624 1352 conicto +2240 1472 moveto +2235 1822 2043 2031 conicto +1852 2240 1537 2240 conicto +1180 2240 965 2038 conicto +750 1836 718 1470 conicto +2240 1472 lineto +end_ol grestore +gsave 20.488533 13.700000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 20.683267 13.700000 translate 0.035278 -0.035278 scale +start_ol +448 3328 moveto +2240 3328 lineto +2240 2944 lineto +896 2944 lineto +896 2172 lineto +994 2206 1092 2223 conicto +1190 2240 1288 2240 conicto +1845 2240 2170 1929 conicto +2496 1618 2496 1088 conicto +2496 542 2158 239 conicto +1820 -64 1205 -64 conicto +993 -64 773 -32 conicto +554 0 320 64 conicto +320 512 lineto +523 415 740 367 conicto +957 320 1200 320 conicto +1591 320 1819 527 conicto +2048 734 2048 1089 conicto +2048 1443 1817 1649 conicto +1587 1856 1192 1856 conicto +1008 1856 824 1809 conicto +640 1762 448 1664 conicto +448 3328 lineto +end_ol grestore +gsave 21.072733 13.700000 translate 0.035278 -0.035278 scale +start_ol +576 384 moveto +1344 384 lineto +1344 2944 lineto +512 2752 lineto +512 3136 lineto +1330 3328 lineto +1792 3328 lineto +1792 384 lineto +2560 384 lineto +2560 0 lineto +576 0 lineto +576 384 lineto +end_ol grestore +gsave 21.462200 13.700000 translate 0.035278 -0.035278 scale +start_ol +576 384 moveto +1344 384 lineto +1344 2944 lineto +512 2752 lineto +512 3136 lineto +1330 3328 lineto +1792 3328 lineto +1792 384 lineto +2560 384 lineto +2560 0 lineto +576 0 lineto +576 384 lineto +end_ol grestore +gsave 14.000000 12.000000 translate 0.035278 -0.035278 scale +start_ol +2496 3200 moveto +2496 2752 lineto +2234 2882 2001 2945 conicto +1768 3008 1552 3008 conicto +1175 3008 971 2863 conicto +768 2718 768 2452 conicto +768 2228 905 2113 conicto +1042 1999 1426 1929 conicto +1708 1873 lineto +2210 1778 2449 1540 conicto +2688 1303 2688 903 conicto +2688 427 2358 181 conicto +2029 -64 1392 -64 conicto +1152 -64 881 -15 conicto +610 33 320 128 conicto +320 576 lineto +603 448 875 384 conicto +1147 320 1409 320 conicto +1807 320 2023 465 conicto +2240 610 2240 878 conicto +2240 1113 2084 1245 conicto +1928 1378 1572 1444 conicto +1288 1497 lineto +776 1599 548 1817 conicto +320 2035 320 2424 conicto +320 2874 636 3133 conicto +952 3392 1507 3392 conicto +1744 3392 1991 3344 conicto +2238 3297 2496 3200 conicto +end_ol grestore +gsave 14.389467 12.000000 translate 0.035278 -0.035278 scale +start_ol +2624 1352 moveto +2624 1152 lineto +704 1152 lineto +731 715 960 485 conicto +1189 256 1597 256 conicto +1834 256 2056 320 conicto +2278 384 2496 512 conicto +2496 128 lineto +2273 34 2039 -15 conicto +1805 -64 1565 -64 conicto +961 -64 608 284 conicto +256 632 256 1225 conicto +256 1839 595 2199 conicto +934 2560 1509 2560 conicto +2024 2560 2324 2235 conicto +2624 1910 2624 1352 conicto +2240 1472 moveto +2235 1822 2043 2031 conicto +1852 2240 1537 2240 conicto +1180 2240 965 2038 conicto +750 1836 718 1470 conicto +2240 1472 lineto +end_ol grestore +gsave 14.762000 12.000000 translate 0.035278 -0.035278 scale +start_ol +2240 2432 moveto +2240 2048 lineto +2066 2144 1892 2192 conicto +1718 2240 1541 2240 conicto +1143 2240 923 1979 conicto +704 1718 704 1248 conicto +704 778 923 517 conicto +1143 256 1541 256 conicto +1718 256 1892 304 conicto +2066 352 2240 448 conicto +2240 64 lineto +2068 0 1883 -32 conicto +1698 -64 1490 -64 conicto +924 -64 590 290 conicto +256 645 256 1248 conicto +256 1859 593 2209 conicto +931 2560 1517 2560 conicto +1707 2560 1888 2528 conicto +2070 2496 2240 2432 conicto +end_ol grestore +gsave 15.100667 12.000000 translate 0.035278 -0.035278 scale +start_ol +832 3200 moveto +832 2496 lineto +1664 2496 lineto +1664 2176 lineto +832 2176 lineto +832 804 lineto +832 495 914 407 conicto +997 320 1248 320 conicto +1664 320 lineto +1664 0 lineto +1248 0 lineto +793 0 620 173 conicto +448 347 448 804 conicto +448 2176 lineto +128 2176 lineto +128 2496 lineto +448 2496 lineto +448 3200 lineto +832 3200 lineto +end_ol grestore +gsave 15.337733 12.000000 translate 0.035278 -0.035278 scale +start_ol +1409 2240 moveto +1083 2240 893 1974 conicto +704 1709 704 1248 conicto +704 787 892 521 conicto +1081 256 1409 256 conicto +1733 256 1922 522 conicto +2112 789 2112 1248 conicto +2112 1705 1922 1972 conicto +1733 2240 1409 2240 conicto +1408 2560 moveto +1946 2560 2253 2212 conicto +2560 1864 2560 1248 conicto +2560 634 2253 285 conicto +1946 -64 1408 -64 conicto +869 -64 562 285 conicto +256 634 256 1248 conicto +256 1864 562 2212 conicto +869 2560 1408 2560 conicto +end_ol grestore +gsave 15.710267 12.000000 translate 0.035278 -0.035278 scale +start_ol +1920 2112 moveto +1848 2178 1764 2209 conicto +1680 2240 1578 2240 conicto +1218 2240 1025 2001 conicto +832 1763 832 1317 conicto +832 0 lineto +448 0 lineto +448 2496 lineto +832 2496 lineto +832 2112 lineto +965 2339 1180 2449 conicto +1396 2560 1702 2560 conicto +1747 2560 1799 2560 conicto +1852 2560 1917 2560 conicto +1920 2112 lineto +end_ol grestore +gsave 15.964267 12.000000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 16.159000 12.000000 translate 0.035278 -0.035278 scale +start_ol +1471 3008 moveto +1120 3008 944 2672 conicto +768 2336 768 1663 conicto +768 992 944 656 conicto +1120 320 1471 320 conicto +1824 320 2000 656 conicto +2176 992 2176 1663 conicto +2176 2336 2000 2672 conicto +1824 3008 1471 3008 conicto +1472 3392 moveto +2033 3392 2328 2949 conicto +2624 2506 2624 1663 conicto +2624 822 2328 379 conicto +2033 -64 1472 -64 conicto +911 -64 615 379 conicto +320 822 320 1663 conicto +320 2506 615 2949 conicto +911 3392 1472 3392 conicto +end_ol grestore +1.000000 1.000000 1.000000 srgb +n 23.000000 11.000000 m 23.000000 15.000000 l 38.000000 15.000000 l 38.000000 11.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 23.000000 11.000000 m 23.000000 15.000000 l 38.000000 15.000000 l 38.000000 11.000000 l cp s +1.000000 1.000000 1.000000 srgb +n 24.000000 13.000000 m 24.000000 14.000000 l 28.000000 14.000000 l 28.000000 13.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 24.000000 13.000000 m 24.000000 14.000000 l 28.000000 14.000000 l 28.000000 13.000000 l cp s +gsave 25.100000 13.700000 translate 0.035278 -0.035278 scale +start_ol +896 1600 moveto +896 384 lineto +1632 384 lineto +2007 384 2187 534 conicto +2368 684 2368 993 conicto +2368 1304 2187 1452 conicto +2007 1600 1632 1600 conicto +896 1600 lineto +896 2944 moveto +896 1984 lineto +1575 1984 lineto +1911 1984 2075 2102 conicto +2240 2221 2240 2464 conicto +2240 2705 2075 2824 conicto +1911 2944 1575 2944 conicto +896 2944 lineto +448 3328 moveto +1608 3328 lineto +2127 3328 2407 3117 conicto +2688 2906 2688 2517 conicto +2688 2216 2546 2037 conicto +2404 1859 2129 1815 conicto +2455 1743 2635 1514 conicto +2816 1286 2816 943 conicto +2816 492 2514 246 conicto +2212 0 1654 0 conicto +448 0 lineto +448 3328 lineto +end_ol grestore +gsave 25.514867 13.700000 translate 0.035278 -0.035278 scale +start_ol +1477 -262 moveto +1305 -695 1142 -827 conicto +980 -960 707 -960 conicto +384 -960 lineto +384 -640 lineto +622 -640 lineto +789 -640 881 -555 conicto +974 -471 1085 -156 conicto +1159 33 lineto +128 2496 lineto +590 2496 lineto +1361 544 lineto +2131 2496 lineto +2560 2496 lineto +1477 -262 lineto +end_ol grestore +gsave 25.878933 13.700000 translate 0.035278 -0.035278 scale +start_ol +832 3200 moveto +832 2496 lineto +1664 2496 lineto +1664 2176 lineto +832 2176 lineto +832 804 lineto +832 495 914 407 conicto +997 320 1248 320 conicto +1664 320 lineto +1664 0 lineto +1248 0 lineto +793 0 620 173 conicto +448 347 448 804 conicto +448 2176 lineto +128 2176 lineto +128 2496 lineto +448 2496 lineto +448 3200 lineto +832 3200 lineto +end_ol grestore +gsave 26.116000 13.700000 translate 0.035278 -0.035278 scale +start_ol +2624 1352 moveto +2624 1152 lineto +704 1152 lineto +731 715 960 485 conicto +1189 256 1597 256 conicto +1834 256 2056 320 conicto +2278 384 2496 512 conicto +2496 128 lineto +2273 34 2039 -15 conicto +1805 -64 1565 -64 conicto +961 -64 608 284 conicto +256 632 256 1225 conicto +256 1839 595 2199 conicto +934 2560 1509 2560 conicto +2024 2560 2324 2235 conicto +2624 1910 2624 1352 conicto +2240 1472 moveto +2235 1822 2043 2031 conicto +1852 2240 1537 2240 conicto +1180 2240 965 2038 conicto +750 1836 718 1470 conicto +2240 1472 lineto +end_ol grestore +gsave 26.488533 13.700000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 26.683267 13.700000 translate 0.035278 -0.035278 scale +start_ol +1471 3008 moveto +1120 3008 944 2672 conicto +768 2336 768 1663 conicto +768 992 944 656 conicto +1120 320 1471 320 conicto +1824 320 2000 656 conicto +2176 992 2176 1663 conicto +2176 2336 2000 2672 conicto +1824 3008 1471 3008 conicto +1472 3392 moveto +2033 3392 2328 2949 conicto +2624 2506 2624 1663 conicto +2624 822 2328 379 conicto +2033 -64 1472 -64 conicto +911 -64 615 379 conicto +320 822 320 1663 conicto +320 2506 615 2949 conicto +911 3392 1472 3392 conicto +end_ol grestore +1.000000 1.000000 1.000000 srgb +n 28.000000 13.000000 m 28.000000 14.000000 l 32.000000 14.000000 l 32.000000 13.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 28.000000 13.000000 m 28.000000 14.000000 l 32.000000 14.000000 l 32.000000 13.000000 l cp s +gsave 29.100000 13.700000 translate 0.035278 -0.035278 scale +start_ol +896 1600 moveto +896 384 lineto +1632 384 lineto +2007 384 2187 534 conicto +2368 684 2368 993 conicto +2368 1304 2187 1452 conicto +2007 1600 1632 1600 conicto +896 1600 lineto +896 2944 moveto +896 1984 lineto +1575 1984 lineto +1911 1984 2075 2102 conicto +2240 2221 2240 2464 conicto +2240 2705 2075 2824 conicto +1911 2944 1575 2944 conicto +896 2944 lineto +448 3328 moveto +1608 3328 lineto +2127 3328 2407 3117 conicto +2688 2906 2688 2517 conicto +2688 2216 2546 2037 conicto +2404 1859 2129 1815 conicto +2455 1743 2635 1514 conicto +2816 1286 2816 943 conicto +2816 492 2514 246 conicto +2212 0 1654 0 conicto +448 0 lineto +448 3328 lineto +end_ol grestore +gsave 29.514867 13.700000 translate 0.035278 -0.035278 scale +start_ol +1477 -262 moveto +1305 -695 1142 -827 conicto +980 -960 707 -960 conicto +384 -960 lineto +384 -640 lineto +622 -640 lineto +789 -640 881 -555 conicto +974 -471 1085 -156 conicto +1159 33 lineto +128 2496 lineto +590 2496 lineto +1361 544 lineto +2131 2496 lineto +2560 2496 lineto +1477 -262 lineto +end_ol grestore +gsave 29.878933 13.700000 translate 0.035278 -0.035278 scale +start_ol +832 3200 moveto +832 2496 lineto +1664 2496 lineto +1664 2176 lineto +832 2176 lineto +832 804 lineto +832 495 914 407 conicto +997 320 1248 320 conicto +1664 320 lineto +1664 0 lineto +1248 0 lineto +793 0 620 173 conicto +448 347 448 804 conicto +448 2176 lineto +128 2176 lineto +128 2496 lineto +448 2496 lineto +448 3200 lineto +832 3200 lineto +end_ol grestore +gsave 30.116000 13.700000 translate 0.035278 -0.035278 scale +start_ol +2624 1352 moveto +2624 1152 lineto +704 1152 lineto +731 715 960 485 conicto +1189 256 1597 256 conicto +1834 256 2056 320 conicto +2278 384 2496 512 conicto +2496 128 lineto +2273 34 2039 -15 conicto +1805 -64 1565 -64 conicto +961 -64 608 284 conicto +256 632 256 1225 conicto +256 1839 595 2199 conicto +934 2560 1509 2560 conicto +2024 2560 2324 2235 conicto +2624 1910 2624 1352 conicto +2240 1472 moveto +2235 1822 2043 2031 conicto +1852 2240 1537 2240 conicto +1180 2240 965 2038 conicto +750 1836 718 1470 conicto +2240 1472 lineto +end_ol grestore +gsave 30.488533 13.700000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 30.683267 13.700000 translate 0.035278 -0.035278 scale +start_ol +576 384 moveto +1344 384 lineto +1344 2944 lineto +512 2752 lineto +512 3136 lineto +1330 3328 lineto +1792 3328 lineto +1792 384 lineto +2560 384 lineto +2560 0 lineto +576 0 lineto +576 384 lineto +end_ol grestore +1.000000 1.000000 1.000000 srgb +n 33.000000 13.000000 m 33.000000 14.000000 l 37.000000 14.000000 l 37.000000 13.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 33.000000 13.000000 m 33.000000 14.000000 l 37.000000 14.000000 l 37.000000 13.000000 l cp s +gsave 34.100000 13.700000 translate 0.035278 -0.035278 scale +start_ol +896 1600 moveto +896 384 lineto +1632 384 lineto +2007 384 2187 534 conicto +2368 684 2368 993 conicto +2368 1304 2187 1452 conicto +2007 1600 1632 1600 conicto +896 1600 lineto +896 2944 moveto +896 1984 lineto +1575 1984 lineto +1911 1984 2075 2102 conicto +2240 2221 2240 2464 conicto +2240 2705 2075 2824 conicto +1911 2944 1575 2944 conicto +896 2944 lineto +448 3328 moveto +1608 3328 lineto +2127 3328 2407 3117 conicto +2688 2906 2688 2517 conicto +2688 2216 2546 2037 conicto +2404 1859 2129 1815 conicto +2455 1743 2635 1514 conicto +2816 1286 2816 943 conicto +2816 492 2514 246 conicto +2212 0 1654 0 conicto +448 0 lineto +448 3328 lineto +end_ol grestore +gsave 34.514867 13.700000 translate 0.035278 -0.035278 scale +start_ol +1477 -262 moveto +1305 -695 1142 -827 conicto +980 -960 707 -960 conicto +384 -960 lineto +384 -640 lineto +622 -640 lineto +789 -640 881 -555 conicto +974 -471 1085 -156 conicto +1159 33 lineto +128 2496 lineto +590 2496 lineto +1361 544 lineto +2131 2496 lineto +2560 2496 lineto +1477 -262 lineto +end_ol grestore +gsave 34.878933 13.700000 translate 0.035278 -0.035278 scale +start_ol +832 3200 moveto +832 2496 lineto +1664 2496 lineto +1664 2176 lineto +832 2176 lineto +832 804 lineto +832 495 914 407 conicto +997 320 1248 320 conicto +1664 320 lineto +1664 0 lineto +1248 0 lineto +793 0 620 173 conicto +448 347 448 804 conicto +448 2176 lineto +128 2176 lineto +128 2496 lineto +448 2496 lineto +448 3200 lineto +832 3200 lineto +end_ol grestore +gsave 35.116000 13.700000 translate 0.035278 -0.035278 scale +start_ol +2624 1352 moveto +2624 1152 lineto +704 1152 lineto +731 715 960 485 conicto +1189 256 1597 256 conicto +1834 256 2056 320 conicto +2278 384 2496 512 conicto +2496 128 lineto +2273 34 2039 -15 conicto +1805 -64 1565 -64 conicto +961 -64 608 284 conicto +256 632 256 1225 conicto +256 1839 595 2199 conicto +934 2560 1509 2560 conicto +2024 2560 2324 2235 conicto +2624 1910 2624 1352 conicto +2240 1472 moveto +2235 1822 2043 2031 conicto +1852 2240 1537 2240 conicto +1180 2240 965 2038 conicto +750 1836 718 1470 conicto +2240 1472 lineto +end_ol grestore +gsave 35.488533 13.700000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 35.683267 13.700000 translate 0.035278 -0.035278 scale +start_ol +448 3328 moveto +2240 3328 lineto +2240 2944 lineto +896 2944 lineto +896 2172 lineto +994 2206 1092 2223 conicto +1190 2240 1288 2240 conicto +1845 2240 2170 1929 conicto +2496 1618 2496 1088 conicto +2496 542 2158 239 conicto +1820 -64 1205 -64 conicto +993 -64 773 -32 conicto +554 0 320 64 conicto +320 512 lineto +523 415 740 367 conicto +957 320 1200 320 conicto +1591 320 1819 527 conicto +2048 734 2048 1089 conicto +2048 1443 1817 1649 conicto +1587 1856 1192 1856 conicto +1008 1856 824 1809 conicto +640 1762 448 1664 conicto +448 3328 lineto +end_ol grestore +gsave 36.072733 13.700000 translate 0.035278 -0.035278 scale +start_ol +576 384 moveto +1344 384 lineto +1344 2944 lineto +512 2752 lineto +512 3136 lineto +1330 3328 lineto +1792 3328 lineto +1792 384 lineto +2560 384 lineto +2560 0 lineto +576 0 lineto +576 384 lineto +end_ol grestore +gsave 36.462200 13.700000 translate 0.035278 -0.035278 scale +start_ol +576 384 moveto +1344 384 lineto +1344 2944 lineto +512 2752 lineto +512 3136 lineto +1330 3328 lineto +1792 3328 lineto +1792 384 lineto +2560 384 lineto +2560 0 lineto +576 0 lineto +576 384 lineto +end_ol grestore +gsave 29.000000 12.000000 translate 0.035278 -0.035278 scale +start_ol +2496 3200 moveto +2496 2752 lineto +2234 2882 2001 2945 conicto +1768 3008 1552 3008 conicto +1175 3008 971 2863 conicto +768 2718 768 2452 conicto +768 2228 905 2113 conicto +1042 1999 1426 1929 conicto +1708 1873 lineto +2210 1778 2449 1540 conicto +2688 1303 2688 903 conicto +2688 427 2358 181 conicto +2029 -64 1392 -64 conicto +1152 -64 881 -15 conicto +610 33 320 128 conicto +320 576 lineto +603 448 875 384 conicto +1147 320 1409 320 conicto +1807 320 2023 465 conicto +2240 610 2240 878 conicto +2240 1113 2084 1245 conicto +1928 1378 1572 1444 conicto +1288 1497 lineto +776 1599 548 1817 conicto +320 2035 320 2424 conicto +320 2874 636 3133 conicto +952 3392 1507 3392 conicto +1744 3392 1991 3344 conicto +2238 3297 2496 3200 conicto +end_ol grestore +gsave 29.389467 12.000000 translate 0.035278 -0.035278 scale +start_ol +2624 1352 moveto +2624 1152 lineto +704 1152 lineto +731 715 960 485 conicto +1189 256 1597 256 conicto +1834 256 2056 320 conicto +2278 384 2496 512 conicto +2496 128 lineto +2273 34 2039 -15 conicto +1805 -64 1565 -64 conicto +961 -64 608 284 conicto +256 632 256 1225 conicto +256 1839 595 2199 conicto +934 2560 1509 2560 conicto +2024 2560 2324 2235 conicto +2624 1910 2624 1352 conicto +2240 1472 moveto +2235 1822 2043 2031 conicto +1852 2240 1537 2240 conicto +1180 2240 965 2038 conicto +750 1836 718 1470 conicto +2240 1472 lineto +end_ol grestore +gsave 29.762000 12.000000 translate 0.035278 -0.035278 scale +start_ol +2240 2432 moveto +2240 2048 lineto +2066 2144 1892 2192 conicto +1718 2240 1541 2240 conicto +1143 2240 923 1979 conicto +704 1718 704 1248 conicto +704 778 923 517 conicto +1143 256 1541 256 conicto +1718 256 1892 304 conicto +2066 352 2240 448 conicto +2240 64 lineto +2068 0 1883 -32 conicto +1698 -64 1490 -64 conicto +924 -64 590 290 conicto +256 645 256 1248 conicto +256 1859 593 2209 conicto +931 2560 1517 2560 conicto +1707 2560 1888 2528 conicto +2070 2496 2240 2432 conicto +end_ol grestore +gsave 30.100667 12.000000 translate 0.035278 -0.035278 scale +start_ol +832 3200 moveto +832 2496 lineto +1664 2496 lineto +1664 2176 lineto +832 2176 lineto +832 804 lineto +832 495 914 407 conicto +997 320 1248 320 conicto +1664 320 lineto +1664 0 lineto +1248 0 lineto +793 0 620 173 conicto +448 347 448 804 conicto +448 2176 lineto +128 2176 lineto +128 2496 lineto +448 2496 lineto +448 3200 lineto +832 3200 lineto +end_ol grestore +gsave 30.337733 12.000000 translate 0.035278 -0.035278 scale +start_ol +1409 2240 moveto +1083 2240 893 1974 conicto +704 1709 704 1248 conicto +704 787 892 521 conicto +1081 256 1409 256 conicto +1733 256 1922 522 conicto +2112 789 2112 1248 conicto +2112 1705 1922 1972 conicto +1733 2240 1409 2240 conicto +1408 2560 moveto +1946 2560 2253 2212 conicto +2560 1864 2560 1248 conicto +2560 634 2253 285 conicto +1946 -64 1408 -64 conicto +869 -64 562 285 conicto +256 634 256 1248 conicto +256 1864 562 2212 conicto +869 2560 1408 2560 conicto +end_ol grestore +gsave 30.710267 12.000000 translate 0.035278 -0.035278 scale +start_ol +1920 2112 moveto +1848 2178 1764 2209 conicto +1680 2240 1578 2240 conicto +1218 2240 1025 2001 conicto +832 1763 832 1317 conicto +832 0 lineto +448 0 lineto +448 2496 lineto +832 2496 lineto +832 2112 lineto +965 2339 1180 2449 conicto +1396 2560 1702 2560 conicto +1747 2560 1799 2560 conicto +1852 2560 1917 2560 conicto +1920 2112 lineto +end_ol grestore +gsave 30.964267 12.000000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 31.159000 12.000000 translate 0.035278 -0.035278 scale +start_ol +576 384 moveto +1344 384 lineto +1344 2944 lineto +512 2752 lineto +512 3136 lineto +1330 3328 lineto +1792 3328 lineto +1792 384 lineto +2560 384 lineto +2560 0 lineto +576 0 lineto +576 384 lineto +end_ol grestore +gsave 22.000000 10.000000 translate 0.035278 -0.035278 scale +start_ol +896 2944 moveto +896 384 lineto +1454 384 lineto +2160 384 2488 692 conicto +2816 1001 2816 1667 conicto +2816 2329 2488 2636 conicto +2160 2944 1454 2944 conicto +896 2944 lineto +448 3328 moveto +1383 3328 lineto +2355 3328 2809 2925 conicto +3264 2523 3264 1667 conicto +3264 807 2807 403 conicto +2350 0 1383 0 conicto +448 0 lineto +448 3328 lineto +end_ol grestore +gsave 22.465667 10.000000 translate 0.035278 -0.035278 scale +start_ol +448 2496 moveto +832 2496 lineto +832 0 lineto +448 0 lineto +448 2496 lineto +448 3520 moveto +832 3520 lineto +832 3008 lineto +448 3008 lineto +448 3520 lineto +end_ol grestore +gsave 22.635000 10.000000 translate 0.035278 -0.035278 scale +start_ol +2048 2432 moveto +2048 2048 lineto +1868 2144 1674 2192 conicto +1480 2240 1273 2240 conicto +957 2240 798 2144 conicto +640 2048 640 1856 conicto +640 1709 757 1625 conicto +875 1542 1229 1467 conicto +1380 1435 lineto +1812 1341 1994 1170 conicto +2176 999 2176 692 conicto +2176 343 1899 139 conicto +1622 -64 1137 -64 conicto +936 -64 717 -32 conicto +498 0 256 64 conicto +256 512 lineto +490 385 718 320 conicto +947 256 1170 256 conicto +1470 256 1631 358 conicto +1792 461 1792 647 conicto +1792 820 1670 912 conicto +1549 1004 1141 1089 conicto +988 1123 lineto +600 1203 428 1369 conicto +256 1535 256 1824 conicto +256 2177 510 2368 conicto +765 2560 1233 2560 conicto +1466 2560 1670 2528 conicto +1875 2496 2048 2432 conicto +end_ol grestore +gsave 22.956733 10.000000 translate 0.035278 -0.035278 scale +start_ol +2240 2432 moveto +2240 2048 lineto +2066 2144 1892 2192 conicto +1718 2240 1541 2240 conicto +1143 2240 923 1979 conicto +704 1718 704 1248 conicto +704 778 923 517 conicto +1143 256 1541 256 conicto +1718 256 1892 304 conicto +2066 352 2240 448 conicto +2240 64 lineto +2068 0 1883 -32 conicto +1698 -64 1490 -64 conicto +924 -64 590 290 conicto +256 645 256 1248 conicto +256 1859 593 2209 conicto +931 2560 1517 2560 conicto +1707 2560 1888 2528 conicto +2070 2496 2240 2432 conicto +end_ol grestore +gsave 23.295400 10.000000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 23.490133 10.000000 translate 0.035278 -0.035278 scale +start_ol +1471 3008 moveto +1120 3008 944 2672 conicto +768 2336 768 1663 conicto +768 992 944 656 conicto +1120 320 1471 320 conicto +1824 320 2000 656 conicto +2176 992 2176 1663 conicto +2176 2336 2000 2672 conicto +1824 3008 1471 3008 conicto +1472 3392 moveto +2033 3392 2328 2949 conicto +2624 2506 2624 1663 conicto +2624 822 2328 379 conicto +2033 -64 1472 -64 conicto +911 -64 615 379 conicto +320 822 320 1663 conicto +320 2506 615 2949 conicto +911 3392 1472 3392 conicto +end_ol grestore +showpage diff --git a/poc/lpc2148_efsl/inc/debug.h b/poc/lpc2148_efsl/inc/debug.h new file mode 100644 index 0000000..a9b4a79 --- /dev/null +++ b/poc/lpc2148_efsl/inc/debug.h @@ -0,0 +1,128 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------------------------------------------- * +* * +* Filename : debug.h * +* Description : Headerfile for debug.c * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/* Contributions + * LPC2000 ARM7 Interface (c)2005 Martin Thomas * + */ + +#ifndef __DEBUG_H__ +#define __DEBUG_H__ + +/*****************************************************************************/ +#include "types.h" +#include "config.h" +/*****************************************************************************/ + +#ifndef DEBUG + #define TXT(x) ; + #define DBG(x) ; + #define FUNC_IN(x) ; + #define FUNC_OUT(x) ; +#endif + +#ifdef DEBUG + #if defined(HW_ENDPOINT_LINUX) || defined(HW_ENDPOINT_LINUX64) + #define HW_ENDPOINT_LINUX_ALL + #endif + + #ifdef HW_ENDPOINT_ATMEGA128_SD + #include + #include + #include + #include + + #define TXT(x) PSTR(x) + #define DBG(x) debug x + #define FUNC_IN(x) ; + #define FUNC_OUT(x) ; + #endif + + #ifdef HW_ENDPOINT_LINUX_ALL + #include + #include + + #define TXT(x) x + #define DBG(x) debug x + #define FUNC_IN(x) debug_funcin(x) + #define FUNC_OUT(x) debug_funcout(x) + #endif + + #ifdef HW_ENDPOINT_DSP_TI6713_SD + #include + #include + + #define TXT(x) x + #define DBG(x) printf x + #define FUNC_IN(x) ; + #define FUNC_OUT(x) ; + #endif + #ifdef HW_ENDPOINT_NIOS_2_SD + #include + #include + + #define TXT(x) x + #define DBG(x) printf x + #define FUNC_IN(x) ; + #define FUNC_OUT(x) ; + #endif + #if defined(HW_ENDPOINT_LPC2000_SD) || defined (HW_ENDPOINT_AT91_SD) + #include "interfaces/efsl_dbg_printf_arm.h" + + #define TXT(x) x + #define DBG(x) debug x + #define FUNC_IN(x) ; + #define FUNC_OUT(x) ; + #define debug efsl_debug_printf_arm + #else + void debug(const eint8 *format, ...); /* This is messy FIXME */ + #endif + + void debug_init(void); + void debug_end(void); + + #ifdef HW_ENDPOINT_LINUX_ALL + FILE* debugfile; + volatile euint8 tw; + void debug_funcin(const eint8 *format, ...); + void debug_funcout(const eint8 *format, ...); + euint8 debug_getByte(); + euint8 debug_getString(euint8 *data,euint16 length); + #endif + + #ifdef HW_ENDPOINT_ATMEGA128_SD + void debug_initUART(euint16 baudrate ); + void debug_sendByte(euint8 data ); + #endif + +#endif + +#endif diff --git a/poc/lpc2148_efsl/inc/dir.h b/poc/lpc2148_efsl/inc/dir.h new file mode 100644 index 0000000..b7119f6 --- /dev/null +++ b/poc/lpc2148_efsl/inc/dir.h @@ -0,0 +1,88 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : dir.h * +* Description : Headerfile for dir.c The files are an extend of the fs.c fs.h * +* pair. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __DDIR_H__ +#define __DDIR_H__ + +/*****************************************************************************/ +#include "config.h" +#include "error.h" +#include "fat.h" +#include "plibc.h" +#include "types.h" +#include "ioman.h" +#include "time.h" +#include "fs.h" +/*****************************************************************************/ + +#define ATTR_READ_ONLY 0x01 +#define ATTR_HIDDEN 0x02 +#define ATTR_SYSTEM 0x04 +#define ATTR_VOLUME_ID 0x08 +#define ATTR_DIRECTORY 0x10 +#define ATTR_ARCHIVE 0x20 + +#define OFFSET_DE_FILENAME 0 +#define OFFSET_DE_ATTRIBUTE 11 +#define OFFSET_DE_NTRESERVED 12 +#define OFFSET_DE_CRTIMETNT 13 +#define OFFSET_DE_CREATETIME 14 +#define OFFSET_DE_CREATEDATE 16 +#define OFFSET_DE_LASTACCESSDATE 18 +#define OFFSET_DE_FIRSTCLUSTERHIGH 20 +#define OFFSET_DE_WRITETIME 22 +#define OFFSET_DE_WRITEDATE 24 +#define OFFSET_DE_FIRSTCLUSTERLOW 26 +#define OFFSET_DE_FILESIZE 28 + +#define DIRFIND_FILE 0 +#define DIRFIND_FREE 1 + +void dir_getFileStructure(FileSystem *fs,FileRecord *filerec,FileLocation *loc); +void dir_createDirectoryEntry(FileSystem *fs,FileRecord *filerec,FileLocation *loc); +void dir_createDefaultEntry(FileSystem *fs,FileRecord *filerec,eint8* fatfilename); +void dir_setFirstCluster(FileSystem *fs,FileLocation *loc,euint32 cluster_addr); +void dir_setFileSize(FileSystem *fs,FileLocation *loc,euint32 numbytes); +euint32 dir_findinRoot(FileSystem *fs,eint8 * fatname, FileLocation *loc); +euint32 dir_findinDir(FileSystem *fs, eint8 * fatname, euint32 startCluster, FileLocation *loc, euint8 mode); +euint32 dir_findinBuf(euint8 *buf,eint8 *fatname, FileLocation *loc, euint8 mode); +euint32 dir_findinCluster(FileSystem *fs,euint32 cluster,eint8 *fatname, FileLocation *loc, euint8 mode); +euint32 dir_findinRootArea(FileSystem *fs,eint8* fatname, FileLocation *loc, euint8 mode); +esint8 dir_getFatFileName(eint8* filename, eint8* fatfilename); +esint8 dir_updateDirectoryEntry(FileSystem *fs,FileRecord *entry,FileLocation *loc); +esint8 dir_addCluster(FileSystem *fs,euint32 firstCluster); + +euint32 dir_findFileinBuf(euint8 *buf, eint8 *fatname, FileLocation *loc); +euint32 dir_findFreeEntryinBuf(euint8* buf, FileLocation *loc); + +#endif diff --git a/poc/lpc2148_efsl/inc/disc.h b/poc/lpc2148_efsl/inc/disc.h new file mode 100644 index 0000000..28fdefc --- /dev/null +++ b/poc/lpc2148_efsl/inc/disc.h @@ -0,0 +1,93 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : disc.h * +* Description : This is the header file for disc.c * +* * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __DISC_H_ +#define __DISC_H_ + +/*****************************************************************************/ +#include "config.h" +#include "error.h" +#include "interface.h" +#include "ioman.h" +#include "types.h" +#include "debug.h" +/*****************************************************************************/ + +#define LBA_ADDR_MBR 0 +#define PARTITION_TABLE_OFFSET 0x1BE + +/**********************************************************\ + PartitionField + ------------ +* uchar type Type of partition +* ulong LBA_begin LBA address of first sector. +* ulong numSectors Number of 512byte sectors +This structure is a literal representation of a 16 byte +partitionfield. Direct I/O is possible. + +(mthomas reminder: for non-bytealigned the "byte array" +is converted to the struct with extract.c/ex_getPartitionField +-> "packed" not needed) +\**********************************************************/ + +struct PartitionField{ + euint8 bootFlag; + euint8 CHS_begin[3]; + euint8 type; + euint8 CHS_end[3]; + euint32 LBA_begin; + euint32 numSectors; +}; +typedef struct PartitionField PartitionField; + +#define SIZE_PARTITION_FIELD 16 + +/***************************************************************************************\ + Disc + -- +* CompactFlash* sourcedisc Pointer to the hardwareobject that this disc is on. +* PartitionField* partitions Array of PartitionFields, containing the partition info +\***************************************************************************************/ +struct Disc{ + IOManager *ioman; + DISC_ERR_EUINT8 + PartitionField partitions[4]; +}; +typedef struct Disc Disc; + +void disc_initDisc(Disc *disc,IOManager *ioman); +void disc_loadMBR(Disc *disc); + +#include "extract.h" + +#endif diff --git a/poc/lpc2148_efsl/inc/efs.h b/poc/lpc2148_efsl/inc/efs.h new file mode 100644 index 0000000..b8bc20d --- /dev/null +++ b/poc/lpc2148_efsl/inc/efs.h @@ -0,0 +1,63 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : efs.h * +* Description : Headerfile for efs.c * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __EFS_H__ +#define __EFS_H__ + +/*****************************************************************************/ +#include "types.h" +#include "config.h" +#include "interface.h" +#include "disc.h" +#include "partition.h" +#include "fs.h" +#include "file.h" +#include "time.h" +#include "ui.h" +/*****************************************************************************/ + +typedef File EmbeddedFile; + +struct EmbeddedFileSystem{ + hwInterface myCard; + IOManager myIOman; + Disc myDisc; + Partition myPart; + FileSystem myFs; +}; +typedef struct EmbeddedFileSystem EmbeddedFileSystem; + +esint8 efs_init(EmbeddedFileSystem * efs,eint8 * opts); + + +#endif + diff --git a/poc/lpc2148_efsl/inc/error.h b/poc/lpc2148_efsl/inc/error.h new file mode 100644 index 0000000..237b807 --- /dev/null +++ b/poc/lpc2148_efsl/inc/error.h @@ -0,0 +1,123 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : error.h * +* Description : Header file containing error-defines. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ +#ifndef __ERROR_H_ +#define __ERROR_H_ + +/*****************************************************************************/ +#include "config.h" +#include "interface.h" +/*****************************************************************************/ + +#if defined (FULL_ERROR_SUPPORT) + #define ERRSUP_IOMAN + #define ERRSUP_DISC + #define ERRSUP_PARTITION + #define ERRSUP_FAT_FILESYSTEM + #define ERRSUP_FAT_FILESYSTEM +#elif defined (BASE_ERROR_SUPPORT) + #define ERRSUP_IOMAN + #define ERRSUP_DISC + #define ERRSUP_PARTITION +#endif + +#if defined (HWINT_HAS_ERROR_SUPPORT) && defined (INTERFACE_ERROR_SUPPORT) + #define ERRSUP_HWINTERFACE +#endif + +#ifdef ERRSUP_IOMAN + #define IOMAN_ERR_EUINT8 euint8 error; + #define ioman_setError(ioman,errval) ioman->error = errval + #define ioman_getError(ioman) ioman->error +#else + #define IOMAN_ERR_EUINT8 + #define ioman_setError(ioman,errval) + #define ioman_getError(ioman) 0 +#endif + +#ifdef ERRSUP_DISC + #define DISC_ERR_EUINT8 euint8 error; + #define disc_setError(disc,errval) disc->error = errval + #define disc_getError(disc) disc->error +#else + #define DISC_ERR_EUINT8 + #define disc_setError(disc,errval) + #define disc_getError(disc) 0 +#endif + +#ifdef ERRSUP_PART + #define PART_ERR_EUINT8 euint8 error; + #define part_setError(part,errval) part->error = errval + #define part_getError(part) part->error +#else + #define PART_ERR_EUINT8 + #define part_setError(part,errval) + #define part_getError(part) 0 +#endif + +#ifdef ERRSUP_FAT_FILESYSTEM + #define FILESYSTEM_ERR_EUINT8 euint8 error; + #define fs_setError(fs,errval) fs->error = errval + #define fs_getError(fs) fs->error +#else + #define FILESYSTEM_ERR_EUINT8 + #define fs_setError(fs,errval) + #define fs_getError(fs) 0 +#endif + +#ifdef ERRSUP_FILE + #define FILE_ERR_EUINT8 euint8 error; + #define file_setError(file,errval) file->error = errval + #define file_getError(file) file->error +#else + #define FILE_ERR_EUINT8 + #define file_setError(file,errval) + #define file_getError(file) 0 +#endif + +#define IOMAN_NOERROR 0 +#define IOMAN_ERR_SETATTROUTOFBOUNDS 1 +#define IOMAN_ERR_GETATTROUTOFBOUNDS 2 +#define IOMAN_ERR_READFAIL 3 +#define IOMAN_ERR_WRITEFAIL 4 +#define IOMAN_ERR_OPOUTOFBOUNDS 5 +#define IOMAN_ERR_PUSHBEYONDSTACK 6 +#define IOMAN_ERR_POPEMPTYSTACK 7 +#define IOMAN_ERR_CACHEPTROUTOFRANGE 8 +#define IOMAN_ERR_WRITEREADONLYSECTOR 9 +#define IOMAN_ERR_NOMEMORY 10 + +#define DISC_NOERROR 0 + +#define PART_NOERROR 0 + + +#endif diff --git a/poc/lpc2148_efsl/inc/extract.h b/poc/lpc2148_efsl/inc/extract.h new file mode 100644 index 0000000..acd838f --- /dev/null +++ b/poc/lpc2148_efsl/inc/extract.h @@ -0,0 +1,74 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : extract.h * +* Description : Headerfile for extract.c * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __EXTRACT_H_ +#define __EXTRACT_H_ + +/*****************************************************************************/ +#include "config.h" +#include "disc.h" +#include "types.h" +/*****************************************************************************/ + +#ifdef BIG_ENDIAN + +#define ltb_end16(x) ((((uint16)(x) & 0xff00) >> 8) | \ + (((uint16)(x) & 0x00ff) << 8)) +#define ltb_end32(x) ((((uint32)(x) & 0xff000000) >> 24) | \ + (((uint32)(x) & 0x00ff0000) >> 8) | \ + (((uint32)(x) & 0x0000ff00) << 8) | \ + (((uint32)(x) & 0x000000ff) << 24)) + +#else + +#define ltb_end16(x) (x) +#define ltb_end32(x) (x) + +#endif + +#define btl_end16 ltb_end16 +#define btl_end32 ltb_end32 + + +/*****************************************************************************/ + +euint16 ex_getb16(euint8* buf,euint32 offset); +void ex_setb16(euint8* buf,euint32 offset,euint16 data); + +euint32 ex_getb32(euint8* buf,euint32 offset); +void ex_setb32(euint8* buf,euint32 offset,euint32 data); + +void ex_getPartitionField(euint8* buf,PartitionField* pf, euint32 offset); +void ex_setPartitionField(euint8* buf,PartitionField* pf, euint32 offset); + +#endif + diff --git a/poc/lpc2148_efsl/inc/fat.h b/poc/lpc2148_efsl/inc/fat.h new file mode 100644 index 0000000..f2134a9 --- /dev/null +++ b/poc/lpc2148_efsl/inc/fat.h @@ -0,0 +1,62 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : fat.h * +* Description : Headerfile for fat.c The files are an extend of the fs.c fs.h * +* pair. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __FAT_H_ +#define __FAT_H_ + +/*****************************************************************************/ +#include "config.h" +#include "error.h" +#include "file.h" +#include "debug.h" +#include "types.h" +/*****************************************************************************/ + +euint32 fat_getSectorAddressFatEntry(FileSystem *fs,euint32 cluster_addr); +euint32 fat_getNextClusterAddress(FileSystem *fs, euint32 cluster_addr, euint16 *linear); +void fat_setNextClusterAddress(FileSystem *fs,euint32 cluster_addr,euint32 next_cluster_addr); +eint16 fat_isEocMarker(FileSystem *fs,euint32 fat_entry); +euint32 fat_giveEocMarker(FileSystem *fs); +euint32 fat_findClusterAddress(FileSystem *fs,euint32 cluster,euint32 offset, euint8 *linear); +euint32 fat_getNextClusterAddressWBuf(FileSystem *fs,euint32 cluster_addr, euint8 * buf); +void fat_setNextClusterAddressWBuf(FileSystem *fs,euint32 cluster_addr,euint32 next_cluster_addr,euint8 * buf); +esint16 fat_getNextClusterChain(FileSystem *fs, ClusterChain *Cache); +void fat_bogus(void); +esint16 fat_LogicToDiscCluster(FileSystem *fs, ClusterChain *Cache,euint32 logiccluster); +eint16 fat_allocClusterChain(FileSystem *fs,ClusterChain *Cache,euint32 num_clusters); +eint16 fat_unlinkClusterChain(FileSystem *fs,ClusterChain *Cache); +euint32 fat_countClustersInChain(FileSystem *fs,euint32 firstcluster); +euint32 fat_DiscToLogicCluster(FileSystem *fs,euint32 firstcluster,euint32 disccluster); +euint32 fat_countFreeClusters(FileSystem *fs); + +#endif diff --git a/poc/lpc2148_efsl/inc/file.h b/poc/lpc2148_efsl/inc/file.h new file mode 100644 index 0000000..2511d80 --- /dev/null +++ b/poc/lpc2148_efsl/inc/file.h @@ -0,0 +1,95 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : file.h * +* Description : Headerfile for file.c * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __FILE_H_ +#define __FILE_H_ + +/*****************************************************************************/ +#include "config.h" +#include "error.h" +#include "time.h" +#include "fs.h" +#include "dir.h" +#include "plibc.h" +#include "debug.h" +#include "types.h" +#include "fat.h" +/*****************************************************************************/ + +#define MODE_READ 0x72 +#define MODE_WRITE 0x77 +#define MODE_APPEND 0x61 + +#define FILE_STATUS_OPEN 0 +#define FILE_STATUS_WRITE 1 + +/*****************************************************************************\ + * File + * ------ + * FileRecord DirEntry Copy of the FileRecord for this file + * FileLocation Location Location of the direntry + * FileSystem *fs Pointer to the filesystem this file is on + * FileCache Cache Pointer to the cache object of the file + * euint8 FileStatus Contains bitfield regarding filestatus + * euint32 FilePtr Offsetpointer for fread/fwrite functions + * euint32 FileSize Working copy of the filesize, always use this, + it is more up to date than DirEntry->FileSize, + which is only updated when flushing to disc. +\*****************************************************************************/ +struct File{ + FileRecord DirEntry; + FileLocation Location; /* Location in directory!! */ + FileSystem *fs; + ClusterChain Cache; + euint8 FileStatus; + euint32 FilePtr; + euint32 FileSize; +}; +typedef struct File File; + + +esint8 file_fopen(File *file, FileSystem *fs,eint8 *filename, eint8 mode); +esint8 file_fclose(File *file); +esint16 file_setpos(File *file,euint32 pos); +euint32 file_fread(File *file,euint32 offset, euint32 size,euint8 *buf); +euint32 file_read (File *file,euint32 size,euint8 *buf); +euint32 file_fwrite(File* file,euint32 offset,euint32 size,euint8* buf); +euint32 file_write (File* file,euint32 size,euint8* buf); +eint8* file_normalToFatName(eint8* filename,eint8* fatfilename); +euint8 file_validateChar(euint8 c); +void file_initFile(File *file, FileSystem *fs, FileLocation *loc); +eint16 file_allocClusterChain(File *file,euint32 num_clusters); +void file_setAttr(File* file,euint8 attribute,euint8 val); +euint8 file_getAttr(File* file,euint8 attribute); +euint32 file_requiredCluster(File *file,euint32 offset, euint32 size); + +#endif diff --git a/poc/lpc2148_efsl/inc/fs.h b/poc/lpc2148_efsl/inc/fs.h new file mode 100644 index 0000000..429e9d7 --- /dev/null +++ b/poc/lpc2148_efsl/inc/fs.h @@ -0,0 +1,216 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : fs.h * +* Description : Headerfile for fs.c * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +* * +* mthomas: ATTR_PACKED * +\*****************************************************************************/ +#ifndef __FS_H_ +#define __FS_H_ + +/*****************************************************************************/ +#include "config.h" +#include "error.h" +#include "partition.h" +#include "types.h" +#include "debug.h" +#include "time.h" +/*****************************************************************************/ + +#define FAT12 1 +#define FAT16 2 +#define FAT32 3 + +#define FS_INFO_SECTOR 1 +#define FSINFO_MAGIC_BEGIN 0x41615252 +#define FSINFO_MAGIC_END 0xAA550000 + +/*****************************************************************************************\ + VolumeId + ------ +* ushort BytesPerSector Must be 512 or shit happens. +* uchar SectorsPerCluster Must be multiple of 2 (1,2,4,8,16 or 32) +* ushort ReservedSectorCount Number of sectors after which the first FAT begins. +* uchar NumberOfFats Should be 2 +* ushort RootEntryCount Number of filerecords the Rootdir can contain. NOT for FAT32 +* ushort SectorCount16 Number of Sectors for 12/16 bit FAT +* ushort FatSectorCount16 Number of Sectors for 1 FAT on FAT12/16 bit FAT's +* ulong SectorCount32 Number of Sectors for 32 bit FAT +* ulong FatSectorCount32 Number of Sectors for 1 FAT on FAT32 +* ulong RootCluster Clusternumber of the first cluster of the RootDir on FAT 32 +This is NOT a complete volumeId copy, no direct I/O is possible. +\*****************************************************************************************/ +struct VolumeId{ + euint16 BytesPerSector; + euint8 SectorsPerCluster; + euint16 ReservedSectorCount; + euint8 NumberOfFats; + euint16 RootEntryCount; + euint16 SectorCount16; + euint16 FatSectorCount16; + euint32 SectorCount32; + euint32 FatSectorCount32; + euint32 RootCluster; +}; +typedef struct VolumeId VolumeId; + +/**************************************************************************************************\ + FileSystem + -------- +* Partition* part Pointer to partition on which this FS resides. +* VolumeId volumeId Contains important FS info. +* ulong DataClusterCount Number of dataclusters. This number determines the FATType. +* ulong FatSectorCount Number of sectors for 1 FAT, regardless of FATType +* ulong SectorCount Number of sectors, regardless of FATType +* ulong FirstSectorRootDir First sector of the RootDir. +* uchar type Determines FATType (FAT12 FAT16 or FAT32 are defined) + +\**************************************************************************************************/ +struct FileSystem{ + Partition *part; + VolumeId volumeId; + euint32 DataClusterCount; + euint32 FatSectorCount; + euint32 SectorCount; + euint32 FirstSectorRootDir; + euint32 FirstClusterCurrentDir; + euint32 FreeClusterCount; + euint32 NextFreeCluster; + euint8 type; +}; +typedef struct FileSystem FileSystem; + +/**************************************************************************************************\ FileLocation + ---------- +* euint32 Sector Sector where the directoryentry of the file/directory can be found. +* euint8 Offset Offset (in 32byte segments) where in the sector the entry is. + +\**************************************************************************************************/ +struct FileLocation{ + euint32 Sector; + euint8 Offset; + euint8 attrib; +}; +typedef struct FileLocation FileLocation; + +/*****************************************************************************\ +* FileCache +* ----------- +* This struct acts as cache for the current file. It contains the current +* FATPointer (next location in the FAT table), LogicCluster +* (the last part of the file that was read) and DataCluster +* (the last cluster that was read). +* euint8 Linear For how many more clusters the file is nonfragmented +* euint32 LogicCluster This field determines the n'th cluster of the file as current +* euint32 DiscCluster If this field is 0, it means the cache is invalid. Otherwise + it is the clusternumber corresponding with + logic(FirstCluster+LogicCluster). +* euint32 FirstCluster First cluster of the chain. Zero or one are invalid. +* euint32 LastCluster Last cluster of the chain (is not always filled in) +\*****************************************************************************/ +struct ClusterChain{ + euint8 Linear; + esint32 LogicCluster; + euint32 DiscCluster; + euint32 FirstCluster; + euint32 LastCluster; + euint32 ClusterCount; +}; +typedef struct ClusterChain ClusterChain; + +/*****************************************************************************\ +* FileRecord * +* ------------ * +* This struct represents a 32 byte file entry as it occurs in the data area * +* of the filesystem. Direct I/O is possible. * +\*****************************************************************************/ +#if !defined(ATTR_PACKED) +struct FileRecord{ + euint8 FileName[11]; + euint8 Attribute; + euint8 NTReserved; + euint8 MilliSecTimeStamp; + euint16 CreatedTime; + euint16 CreatedDate; + euint16 AccessDate; + euint16 FirstClusterHigh; + euint16 WriteTime; + euint16 WriteDate; + euint16 FirstClusterLow; + euint32 FileSize; +}; +#else +#warning "mt ATTR_PACKED active" +struct FileRecord{ + euint8 FileName[11]; + euint8 Attribute; + euint8 NTReserved; + euint8 MilliSecTimeStamp; + euint16 CreatedTime; + euint16 CreatedDate; + euint16 AccessDate; + euint16 FirstClusterHigh; + euint16 WriteTime; + euint16 WriteDate; + euint16 FirstClusterLow; + euint32 FileSize; +} ATTR_PACKED; +#endif +typedef struct FileRecord FileRecord; + + +eint16 fs_initFs(FileSystem *fs,Partition *part); +eint16 fs_isValidFat(Partition *part); +void fs_loadVolumeId(FileSystem *fs, Partition *part); +esint16 fs_verifySanity(FileSystem *fs); +void fs_countDataSectors(FileSystem *fs); +void fs_determineFatType(FileSystem *fs); +void fs_findFirstSectorRootDir(FileSystem *fs); +void fs_initCurrentDir(FileSystem *fs); +euint32 fs_getSectorAddressRootDir(FileSystem *fs,euint32 secref); +euint32 fs_clusterToSector(FileSystem *fs,euint32 cluster); +euint32 fs_sectorToCluster(FileSystem *fs,euint32 sector); +euint32 fs_getNextFreeCluster(FileSystem *fs,euint32 startingcluster); +euint32 fs_giveFreeClusterHint(FileSystem *fs); +esint16 fs_findFreeFile(FileSystem *fs,eint8* filename,FileLocation *loc,euint8 mode); +esint8 fs_findFile(FileSystem *fs,eint8* filename,FileLocation *loc,euint32 *lastDir); +esint8 fs_findFile_broken(FileSystem *fs,eint8* filename,FileLocation *loc); +euint32 fs_getLastCluster(FileSystem *fs,ClusterChain *Cache); +euint32 fs_getFirstClusterRootDir(FileSystem *fs); +euint16 fs_makeDate(void); +euint16 fs_makeTime(void); +void fs_setFirstClusterInDirEntry(FileRecord *rec,euint32 cluster_addr); +void fs_initClusterChain(FileSystem *fs,ClusterChain *cache,euint32 cluster_addr); +esint8 fs_flushFs(FileSystem *fs); +esint8 fs_umount(FileSystem *fs); +esint8 fs_clearCluster(FileSystem *fs,euint32 cluster); +esint8 fs_getFsInfo(FileSystem *fs,euint8 force_update); +esint8 fs_setFsInfo(FileSystem *fs); + +#endif diff --git a/poc/lpc2148_efsl/inc/interface.h b/poc/lpc2148_efsl/inc/interface.h new file mode 100644 index 0000000..fd2c0eb --- /dev/null +++ b/poc/lpc2148_efsl/inc/interface.h @@ -0,0 +1,56 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* -------------------------------------------------------- * +* * +* Filename : interface.h * +* Description : This headerfile includes the right interface headerfile * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __TYPES_H__ +#define __TYPES_H__ + +/*****************************************************************************/ +#include "types.h" +#include "config.h" +/*****************************************************************************/ + +#define HW_ENDPOINT_LPC2000_SD + +#if defined(HW_ENDPOINT_LINUX) || defined(HW_ENDPOINT_LINUX64) + #include "interfaces/linuxfile.h" +#elif defined(HW_ENDPOINT_ATMEGA128_SD) + #include "interfaces/atmega128.h" +#elif defined(HW_ENDPOINT_DSP_TI6713_SD) + #include "interfaces/dsp67xx.h" +#elif defined(HW_ENDPOINT_LPC2000_SD) || defined(HW_ENDPOINT_AT91_SD) + #include "interfaces/arm_spi.h" +#else + #error "NO INTERFACE DEFINED - see interface.h" +#endif + +#endif + diff --git a/poc/lpc2148_efsl/inc/interfaces/AT91SAM7S_regs.h b/poc/lpc2148_efsl/inc/interfaces/AT91SAM7S_regs.h new file mode 100644 index 0000000..7aa8fb5 --- /dev/null +++ b/poc/lpc2148_efsl/inc/interfaces/AT91SAM7S_regs.h @@ -0,0 +1,301 @@ +/* This is a reduced version of the AT91SAM7S*.h files provided by + ATMEL Microcontroller Software Support - ROUSSET - + + This file is used by the EFSL-interface to reduced the + size of the distribution-archive. It can be replaced + by the files from Atmel. + + Done by Martin Thomas, 2006 +*/ + +#ifndef AT91SAM7S64_REGS_H +#define AT91SAM7S64_REGS_H + +typedef volatile unsigned long AT91_REG;// Hardware register definition + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Serial Parallel Interface +// ***************************************************************************** +typedef struct _AT91S_SPI { + AT91_REG SPI_CR; // Control Register + AT91_REG SPI_MR; // Mode Register + AT91_REG SPI_RDR; // Receive Data Register + AT91_REG SPI_TDR; // Transmit Data Register + AT91_REG SPI_SR; // Status Register + AT91_REG SPI_IER; // Interrupt Enable Register + AT91_REG SPI_IDR; // Interrupt Disable Register + AT91_REG SPI_IMR; // Interrupt Mask Register + AT91_REG Reserved0[4]; // + AT91_REG SPI_CSR[4]; // Chip Select Register + AT91_REG Reserved1[48]; // + AT91_REG SPI_RPR; // Receive Pointer Register + AT91_REG SPI_RCR; // Receive Counter Register + AT91_REG SPI_TPR; // Transmit Pointer Register + AT91_REG SPI_TCR; // Transmit Counter Register + AT91_REG SPI_RNPR; // Receive Next Pointer Register + AT91_REG SPI_RNCR; // Receive Next Counter Register + AT91_REG SPI_TNPR; // Transmit Next Pointer Register + AT91_REG SPI_TNCR; // Transmit Next Counter Register + AT91_REG SPI_PTCR; // PDC Transfer Control Register + AT91_REG SPI_PTSR; // PDC Transfer Status Register +} AT91S_SPI, *AT91PS_SPI; + +// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- +#define AT91C_SPI_SPIEN ((unsigned int) 0x1 << 0) // (SPI) SPI Enable +#define AT91C_SPI_SPIDIS ((unsigned int) 0x1 << 1) // (SPI) SPI Disable +#define AT91C_SPI_SWRST ((unsigned int) 0x1 << 7) // (SPI) SPI Software reset +#define AT91C_SPI_LASTXFER ((unsigned int) 0x1 << 24) // (SPI) SPI Last Transfer +// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- +#define AT91C_SPI_MSTR ((unsigned int) 0x1 << 0) // (SPI) Master/Slave Mode +#define AT91C_SPI_PS ((unsigned int) 0x1 << 1) // (SPI) Peripheral Select +#define AT91C_SPI_PS_FIXED ((unsigned int) 0x0 << 1) // (SPI) Fixed Peripheral Select +#define AT91C_SPI_PS_VARIABLE ((unsigned int) 0x1 << 1) // (SPI) Variable Peripheral Select +#define AT91C_SPI_PCSDEC ((unsigned int) 0x1 << 2) // (SPI) Chip Select Decode +#define AT91C_SPI_FDIV ((unsigned int) 0x1 << 3) // (SPI) Clock Selection +#define AT91C_SPI_MODFDIS ((unsigned int) 0x1 << 4) // (SPI) Mode Fault Detection +#define AT91C_SPI_LLB ((unsigned int) 0x1 << 7) // (SPI) Clock Selection +#define AT91C_SPI_PCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select +#define AT91C_SPI_DLYBCS ((unsigned int) 0xFF << 24) // (SPI) Delay Between Chip Selects +// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- +#define AT91C_SPI_RD ((unsigned int) 0xFFFF << 0) // (SPI) Receive Data +#define AT91C_SPI_RPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- +#define AT91C_SPI_TD ((unsigned int) 0xFFFF << 0) // (SPI) Transmit Data +#define AT91C_SPI_TPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- +#define AT91C_SPI_RDRF ((unsigned int) 0x1 << 0) // (SPI) Receive Data Register Full +#define AT91C_SPI_TDRE ((unsigned int) 0x1 << 1) // (SPI) Transmit Data Register Empty +#define AT91C_SPI_MODF ((unsigned int) 0x1 << 2) // (SPI) Mode Fault Error +#define AT91C_SPI_OVRES ((unsigned int) 0x1 << 3) // (SPI) Overrun Error Status +#define AT91C_SPI_ENDRX ((unsigned int) 0x1 << 4) // (SPI) End of Receiver Transfer +#define AT91C_SPI_ENDTX ((unsigned int) 0x1 << 5) // (SPI) End of Receiver Transfer +#define AT91C_SPI_RXBUFF ((unsigned int) 0x1 << 6) // (SPI) RXBUFF Interrupt +#define AT91C_SPI_TXBUFE ((unsigned int) 0x1 << 7) // (SPI) TXBUFE Interrupt +#define AT91C_SPI_NSSR ((unsigned int) 0x1 << 8) // (SPI) NSSR Interrupt +#define AT91C_SPI_TXEMPTY ((unsigned int) 0x1 << 9) // (SPI) TXEMPTY Interrupt +#define AT91C_SPI_SPIENS ((unsigned int) 0x1 << 16) // (SPI) Enable Status +// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- +// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- +// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- +// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- +#define AT91C_SPI_CPOL ((unsigned int) 0x1 << 0) // (SPI) Clock Polarity +#define AT91C_SPI_NCPHA ((unsigned int) 0x1 << 1) // (SPI) Clock Phase +#define AT91C_SPI_CSAAT ((unsigned int) 0x1 << 3) // (SPI) Chip Select Active After Transfer +#define AT91C_SPI_BITS ((unsigned int) 0xF << 4) // (SPI) Bits Per Transfer +#define AT91C_SPI_BITS_8 ((unsigned int) 0x0 << 4) // (SPI) 8 Bits Per transfer +#define AT91C_SPI_BITS_9 ((unsigned int) 0x1 << 4) // (SPI) 9 Bits Per transfer +#define AT91C_SPI_BITS_10 ((unsigned int) 0x2 << 4) // (SPI) 10 Bits Per transfer +#define AT91C_SPI_BITS_11 ((unsigned int) 0x3 << 4) // (SPI) 11 Bits Per transfer +#define AT91C_SPI_BITS_12 ((unsigned int) 0x4 << 4) // (SPI) 12 Bits Per transfer +#define AT91C_SPI_BITS_13 ((unsigned int) 0x5 << 4) // (SPI) 13 Bits Per transfer +#define AT91C_SPI_BITS_14 ((unsigned int) 0x6 << 4) // (SPI) 14 Bits Per transfer +#define AT91C_SPI_BITS_15 ((unsigned int) 0x7 << 4) // (SPI) 15 Bits Per transfer +#define AT91C_SPI_BITS_16 ((unsigned int) 0x8 << 4) // (SPI) 16 Bits Per transfer +#define AT91C_SPI_SCBR ((unsigned int) 0xFF << 8) // (SPI) Serial Clock Baud Rate +#define AT91C_SPI_DLYBS ((unsigned int) 0xFF << 16) // (SPI) Delay Before SPCK +#define AT91C_SPI_DLYBCT ((unsigned int) 0xFF << 24) // (SPI) Delay Between Consecutive Transfers + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Parallel Input Output Controler +// ***************************************************************************** +typedef struct _AT91S_PIO { + AT91_REG PIO_PER; // PIO Enable Register + AT91_REG PIO_PDR; // PIO Disable Register + AT91_REG PIO_PSR; // PIO Status Register + AT91_REG Reserved0[1]; // + AT91_REG PIO_OER; // Output Enable Register + AT91_REG PIO_ODR; // Output Disable Registerr + AT91_REG PIO_OSR; // Output Status Register + AT91_REG Reserved1[1]; // + AT91_REG PIO_IFER; // Input Filter Enable Register + AT91_REG PIO_IFDR; // Input Filter Disable Register + AT91_REG PIO_IFSR; // Input Filter Status Register + AT91_REG Reserved2[1]; // + AT91_REG PIO_SODR; // Set Output Data Register + AT91_REG PIO_CODR; // Clear Output Data Register + AT91_REG PIO_ODSR; // Output Data Status Register + AT91_REG PIO_PDSR; // Pin Data Status Register + AT91_REG PIO_IER; // Interrupt Enable Register + AT91_REG PIO_IDR; // Interrupt Disable Register + AT91_REG PIO_IMR; // Interrupt Mask Register + AT91_REG PIO_ISR; // Interrupt Status Register + AT91_REG PIO_MDER; // Multi-driver Enable Register + AT91_REG PIO_MDDR; // Multi-driver Disable Register + AT91_REG PIO_MDSR; // Multi-driver Status Register + AT91_REG Reserved3[1]; // + AT91_REG PIO_PPUDR; // Pull-up Disable Register + AT91_REG PIO_PPUER; // Pull-up Enable Register + AT91_REG PIO_PPUSR; // Pull-up Status Register + AT91_REG Reserved4[1]; // + AT91_REG PIO_ASR; // Select A Register + AT91_REG PIO_BSR; // Select B Register + AT91_REG PIO_ABSR; // AB Select Status Register + AT91_REG Reserved5[9]; // + AT91_REG PIO_OWER; // Output Write Enable Register + AT91_REG PIO_OWDR; // Output Write Disable Register + AT91_REG PIO_OWSR; // Output Write Status Register +} AT91S_PIO, *AT91PS_PIO; + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Power Management Controler +// ***************************************************************************** +typedef struct _AT91S_PMC { + AT91_REG PMC_SCER; // System Clock Enable Register + AT91_REG PMC_SCDR; // System Clock Disable Register + AT91_REG PMC_SCSR; // System Clock Status Register + AT91_REG Reserved0[1]; // + AT91_REG PMC_PCER; // Peripheral Clock Enable Register + AT91_REG PMC_PCDR; // Peripheral Clock Disable Register + AT91_REG PMC_PCSR; // Peripheral Clock Status Register + AT91_REG Reserved1[1]; // + AT91_REG PMC_MOR; // Main Oscillator Register + AT91_REG PMC_MCFR; // Main Clock Frequency Register + AT91_REG Reserved2[1]; // + AT91_REG PMC_PLLR; // PLL Register + AT91_REG PMC_MCKR; // Master Clock Register + AT91_REG Reserved3[3]; // + AT91_REG PMC_PCKR[3]; // Programmable Clock Register + AT91_REG Reserved4[5]; // + AT91_REG PMC_IER; // Interrupt Enable Register + AT91_REG PMC_IDR; // Interrupt Disable Register + AT91_REG PMC_SR; // Status Register + AT91_REG PMC_IMR; // Interrupt Mask Register +} AT91S_PMC, *AT91PS_PMC; + +// ***************************************************************************** +// PIO DEFINITIONS FOR AT91SAM7S256 +// ***************************************************************************** +#define AT91C_PIO_PA0 ((unsigned int) 1 << 0) // Pin Controlled by PA0 +#define AT91C_PA0_PWM0 ((unsigned int) AT91C_PIO_PA0) // PWM Channel 0 +#define AT91C_PA0_TIOA0 ((unsigned int) AT91C_PIO_PA0) // Timer Counter 0 Multipurpose Timer I/O Pin A +#define AT91C_PIO_PA1 ((unsigned int) 1 << 1) // Pin Controlled by PA1 +#define AT91C_PA1_PWM1 ((unsigned int) AT91C_PIO_PA1) // PWM Channel 1 +#define AT91C_PA1_TIOB0 ((unsigned int) AT91C_PIO_PA1) // Timer Counter 0 Multipurpose Timer I/O Pin B +#define AT91C_PIO_PA10 ((unsigned int) 1 << 10) // Pin Controlled by PA10 +#define AT91C_PA10_DTXD ((unsigned int) AT91C_PIO_PA10) // DBGU Debug Transmit Data +#define AT91C_PA10_NPCS2 ((unsigned int) AT91C_PIO_PA10) // SPI Peripheral Chip Select 2 +#define AT91C_PIO_PA11 ((unsigned int) 1 << 11) // Pin Controlled by PA11 +#define AT91C_PA11_NPCS0 ((unsigned int) AT91C_PIO_PA11) // SPI Peripheral Chip Select 0 +#define AT91C_PA11_PWM0 ((unsigned int) AT91C_PIO_PA11) // PWM Channel 0 +#define AT91C_PIO_PA12 ((unsigned int) 1 << 12) // Pin Controlled by PA12 +#define AT91C_PA12_MISO ((unsigned int) AT91C_PIO_PA12) // SPI Master In Slave +#define AT91C_PA12_PWM1 ((unsigned int) AT91C_PIO_PA12) // PWM Channel 1 +#define AT91C_PIO_PA13 ((unsigned int) 1 << 13) // Pin Controlled by PA13 +#define AT91C_PA13_MOSI ((unsigned int) AT91C_PIO_PA13) // SPI Master Out Slave +#define AT91C_PA13_PWM2 ((unsigned int) AT91C_PIO_PA13) // PWM Channel 2 +#define AT91C_PIO_PA14 ((unsigned int) 1 << 14) // Pin Controlled by PA14 +#define AT91C_PA14_SPCK ((unsigned int) AT91C_PIO_PA14) // SPI Serial Clock +#define AT91C_PA14_PWM3 ((unsigned int) AT91C_PIO_PA14) // PWM Channel 3 +#define AT91C_PIO_PA15 ((unsigned int) 1 << 15) // Pin Controlled by PA15 +#define AT91C_PA15_TF ((unsigned int) AT91C_PIO_PA15) // SSC Transmit Frame Sync +#define AT91C_PA15_TIOA1 ((unsigned int) AT91C_PIO_PA15) // Timer Counter 1 Multipurpose Timer I/O Pin A +#define AT91C_PIO_PA16 ((unsigned int) 1 << 16) // Pin Controlled by PA16 +#define AT91C_PA16_TK ((unsigned int) AT91C_PIO_PA16) // SSC Transmit Clock +#define AT91C_PA16_TIOB1 ((unsigned int) AT91C_PIO_PA16) // Timer Counter 1 Multipurpose Timer I/O Pin B +#define AT91C_PIO_PA17 ((unsigned int) 1 << 17) // Pin Controlled by PA17 +#define AT91C_PA17_TD ((unsigned int) AT91C_PIO_PA17) // SSC Transmit data +#define AT91C_PA17_PCK1 ((unsigned int) AT91C_PIO_PA17) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PA18 ((unsigned int) 1 << 18) // Pin Controlled by PA18 +#define AT91C_PA18_RD ((unsigned int) AT91C_PIO_PA18) // SSC Receive Data +#define AT91C_PA18_PCK2 ((unsigned int) AT91C_PIO_PA18) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PA19 ((unsigned int) 1 << 19) // Pin Controlled by PA19 +#define AT91C_PA19_RK ((unsigned int) AT91C_PIO_PA19) // SSC Receive Clock +#define AT91C_PA19_FIQ ((unsigned int) AT91C_PIO_PA19) // AIC Fast Interrupt Input +#define AT91C_PIO_PA2 ((unsigned int) 1 << 2) // Pin Controlled by PA2 +#define AT91C_PA2_PWM2 ((unsigned int) AT91C_PIO_PA2) // PWM Channel 2 +#define AT91C_PA2_SCK0 ((unsigned int) AT91C_PIO_PA2) // USART 0 Serial Clock +#define AT91C_PIO_PA20 ((unsigned int) 1 << 20) // Pin Controlled by PA20 +#define AT91C_PA20_RF ((unsigned int) AT91C_PIO_PA20) // SSC Receive Frame Sync +#define AT91C_PA20_IRQ0 ((unsigned int) AT91C_PIO_PA20) // External Interrupt 0 +#define AT91C_PIO_PA21 ((unsigned int) 1 << 21) // Pin Controlled by PA21 +#define AT91C_PA21_RXD1 ((unsigned int) AT91C_PIO_PA21) // USART 1 Receive Data +#define AT91C_PA21_PCK1 ((unsigned int) AT91C_PIO_PA21) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PA22 ((unsigned int) 1 << 22) // Pin Controlled by PA22 +#define AT91C_PA22_TXD1 ((unsigned int) AT91C_PIO_PA22) // USART 1 Transmit Data +#define AT91C_PA22_NPCS3 ((unsigned int) AT91C_PIO_PA22) // SPI Peripheral Chip Select 3 +#define AT91C_PIO_PA23 ((unsigned int) 1 << 23) // Pin Controlled by PA23 +#define AT91C_PA23_SCK1 ((unsigned int) AT91C_PIO_PA23) // USART 1 Serial Clock +#define AT91C_PA23_PWM0 ((unsigned int) AT91C_PIO_PA23) // PWM Channel 0 +#define AT91C_PIO_PA24 ((unsigned int) 1 << 24) // Pin Controlled by PA24 +#define AT91C_PA24_RTS1 ((unsigned int) AT91C_PIO_PA24) // USART 1 Ready To Send +#define AT91C_PA24_PWM1 ((unsigned int) AT91C_PIO_PA24) // PWM Channel 1 +#define AT91C_PIO_PA25 ((unsigned int) 1 << 25) // Pin Controlled by PA25 +#define AT91C_PA25_CTS1 ((unsigned int) AT91C_PIO_PA25) // USART 1 Clear To Send +#define AT91C_PA25_PWM2 ((unsigned int) AT91C_PIO_PA25) // PWM Channel 2 +#define AT91C_PIO_PA26 ((unsigned int) 1 << 26) // Pin Controlled by PA26 +#define AT91C_PA26_DCD1 ((unsigned int) AT91C_PIO_PA26) // USART 1 Data Carrier Detect +#define AT91C_PA26_TIOA2 ((unsigned int) AT91C_PIO_PA26) // Timer Counter 2 Multipurpose Timer I/O Pin A +#define AT91C_PIO_PA27 ((unsigned int) 1 << 27) // Pin Controlled by PA27 +#define AT91C_PA27_DTR1 ((unsigned int) AT91C_PIO_PA27) // USART 1 Data Terminal ready +#define AT91C_PA27_TIOB2 ((unsigned int) AT91C_PIO_PA27) // Timer Counter 2 Multipurpose Timer I/O Pin B +#define AT91C_PIO_PA28 ((unsigned int) 1 << 28) // Pin Controlled by PA28 +#define AT91C_PA28_DSR1 ((unsigned int) AT91C_PIO_PA28) // USART 1 Data Set ready +#define AT91C_PA28_TCLK1 ((unsigned int) AT91C_PIO_PA28) // Timer Counter 1 external clock input +#define AT91C_PIO_PA29 ((unsigned int) 1 << 29) // Pin Controlled by PA29 +#define AT91C_PA29_RI1 ((unsigned int) AT91C_PIO_PA29) // USART 1 Ring Indicator +#define AT91C_PA29_TCLK2 ((unsigned int) AT91C_PIO_PA29) // Timer Counter 2 external clock input +#define AT91C_PIO_PA3 ((unsigned int) 1 << 3) // Pin Controlled by PA3 +#define AT91C_PA3_TWD ((unsigned int) AT91C_PIO_PA3) // TWI Two-wire Serial Data +#define AT91C_PA3_NPCS3 ((unsigned int) AT91C_PIO_PA3) // SPI Peripheral Chip Select 3 +#define AT91C_PIO_PA30 ((unsigned int) 1 << 30) // Pin Controlled by PA30 +#define AT91C_PA30_IRQ1 ((unsigned int) AT91C_PIO_PA30) // External Interrupt 1 +#define AT91C_PA30_NPCS2 ((unsigned int) AT91C_PIO_PA30) // SPI Peripheral Chip Select 2 +#define AT91C_PIO_PA31 ((unsigned int) 1 << 31) // Pin Controlled by PA31 +#define AT91C_PA31_NPCS1 ((unsigned int) AT91C_PIO_PA31) // SPI Peripheral Chip Select 1 +#define AT91C_PA31_PCK2 ((unsigned int) AT91C_PIO_PA31) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PA4 ((unsigned int) 1 << 4) // Pin Controlled by PA4 +#define AT91C_PA4_TWCK ((unsigned int) AT91C_PIO_PA4) // TWI Two-wire Serial Clock +#define AT91C_PA4_TCLK0 ((unsigned int) AT91C_PIO_PA4) // Timer Counter 0 external clock input +#define AT91C_PIO_PA5 ((unsigned int) 1 << 5) // Pin Controlled by PA5 +#define AT91C_PA5_RXD0 ((unsigned int) AT91C_PIO_PA5) // USART 0 Receive Data +#define AT91C_PA5_NPCS3 ((unsigned int) AT91C_PIO_PA5) // SPI Peripheral Chip Select 3 +#define AT91C_PIO_PA6 ((unsigned int) 1 << 6) // Pin Controlled by PA6 +#define AT91C_PA6_TXD0 ((unsigned int) AT91C_PIO_PA6) // USART 0 Transmit Data +#define AT91C_PA6_PCK0 ((unsigned int) AT91C_PIO_PA6) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PA7 ((unsigned int) 1 << 7) // Pin Controlled by PA7 +#define AT91C_PA7_RTS0 ((unsigned int) AT91C_PIO_PA7) // USART 0 Ready To Send +#define AT91C_PA7_PWM3 ((unsigned int) AT91C_PIO_PA7) // PWM Channel 3 +#define AT91C_PIO_PA8 ((unsigned int) 1 << 8) // Pin Controlled by PA8 +#define AT91C_PA8_CTS0 ((unsigned int) AT91C_PIO_PA8) // USART 0 Clear To Send +#define AT91C_PA8_ADTRG ((unsigned int) AT91C_PIO_PA8) // ADC External Trigger +#define AT91C_PIO_PA9 ((unsigned int) 1 << 9) // Pin Controlled by PA9 +#define AT91C_PA9_DRXD ((unsigned int) AT91C_PIO_PA9) // DBGU Debug Receive Data +#define AT91C_PA9_NPCS1 ((unsigned int) AT91C_PIO_PA9) // SPI Peripheral Chip Select 1 + +// ========== Register definition for PDC_SPI peripheral ========== +#define AT91C_SPI_PTCR ((AT91_REG *) 0xFFFE0120) // (PDC_SPI) PDC Transfer Control Register +#define AT91C_SPI_TNPR ((AT91_REG *) 0xFFFE0118) // (PDC_SPI) Transmit Next Pointer Register +#define AT91C_SPI_RNPR ((AT91_REG *) 0xFFFE0110) // (PDC_SPI) Receive Next Pointer Register +#define AT91C_SPI_TPR ((AT91_REG *) 0xFFFE0108) // (PDC_SPI) Transmit Pointer Register +#define AT91C_SPI_RPR ((AT91_REG *) 0xFFFE0100) // (PDC_SPI) Receive Pointer Register +#define AT91C_SPI_PTSR ((AT91_REG *) 0xFFFE0124) // (PDC_SPI) PDC Transfer Status Register +#define AT91C_SPI_TNCR ((AT91_REG *) 0xFFFE011C) // (PDC_SPI) Transmit Next Counter Register +#define AT91C_SPI_RNCR ((AT91_REG *) 0xFFFE0114) // (PDC_SPI) Receive Next Counter Register +#define AT91C_SPI_TCR ((AT91_REG *) 0xFFFE010C) // (PDC_SPI) Transmit Counter Register +#define AT91C_SPI_RCR ((AT91_REG *) 0xFFFE0104) // (PDC_SPI) Receive Counter Register +// ========== Register definition for SPI peripheral ========== +#define AT91C_SPI_CSR ((AT91_REG *) 0xFFFE0030) // (SPI) Chip Select Register +#define AT91C_SPI_IDR ((AT91_REG *) 0xFFFE0018) // (SPI) Interrupt Disable Register +#define AT91C_SPI_SR ((AT91_REG *) 0xFFFE0010) // (SPI) Status Register +#define AT91C_SPI_RDR ((AT91_REG *) 0xFFFE0008) // (SPI) Receive Data Register +#define AT91C_SPI_CR ((AT91_REG *) 0xFFFE0000) // (SPI) Control Register +#define AT91C_SPI_IMR ((AT91_REG *) 0xFFFE001C) // (SPI) Interrupt Mask Register +#define AT91C_SPI_IER ((AT91_REG *) 0xFFFE0014) // (SPI) Interrupt Enable Register +#define AT91C_SPI_TDR ((AT91_REG *) 0xFFFE000C) // (SPI) Transmit Data Register +#define AT91C_SPI_MR ((AT91_REG *) 0xFFFE0004) // (SPI) Mode Register + +// ***************************************************************************** +// (some) PERIPHERAL ID DEFINITIONS FOR AT91SAM7S256 +// ***************************************************************************** +#define AT91C_ID_SPI ((unsigned int) 5) // Serial Peripheral Interface + +// ***************************************************************************** +// (some) BASE ADDRESS DEFINITIONS FOR AT91SAM7S256 +// ***************************************************************************** +#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) // (PIOA) Base Address +#define AT91C_BASE_PMC ((AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address +#define AT91C_BASE_PDC_SPI ((AT91PS_PDC) 0xFFFE0100) // (PDC_SPI) Base Address +#define AT91C_BASE_SPI ((AT91PS_SPI) 0xFFFE0000) // (SPI) Base Address + + +#endif diff --git a/poc/lpc2148_efsl/inc/interfaces/LPC2000_regs.h b/poc/lpc2148_efsl/inc/interfaces/LPC2000_regs.h new file mode 100644 index 0000000..2f1bca1 --- /dev/null +++ b/poc/lpc2148_efsl/inc/interfaces/LPC2000_regs.h @@ -0,0 +1,72 @@ +/* based on LPC213x.h from Keil GmbH (keil.com/arm.com) */ + +#ifndef LPC2000_regs_h +#define LPC2000_regs_h + +/* Pin Connect Block */ +#define PINSEL0 (*((volatile unsigned long *) 0xE002C000)) +#define PINSEL1 (*((volatile unsigned long *) 0xE002C004)) +#define PINSEL2 (*((volatile unsigned long *) 0xE002C014)) + +/* General Purpose Input/Output (GPIO) */ +#define IOPIN0 (*((volatile unsigned long *) 0xE0028000)) +#define IOSET0 (*((volatile unsigned long *) 0xE0028004)) +#define IODIR0 (*((volatile unsigned long *) 0xE0028008)) +#define IOCLR0 (*((volatile unsigned long *) 0xE002800C)) +#define IOPIN1 (*((volatile unsigned long *) 0xE0028010)) +#define IOSET1 (*((volatile unsigned long *) 0xE0028014)) +#define IODIR1 (*((volatile unsigned long *) 0xE0028018)) +#define IOCLR1 (*((volatile unsigned long *) 0xE002801C)) + +/* SPI0 (Serial Peripheral Interface 0) */ +#define S0SPCR (*((volatile unsigned char *) 0xE0020000)) +#define S0SPSR (*((volatile unsigned char *) 0xE0020004)) +#define S0SPDR (*((volatile unsigned char *) 0xE0020008)) +#define S0SPCCR (*((volatile unsigned char *) 0xE002000C)) +#define S0SPTCR (*((volatile unsigned char *) 0xE0020010)) +#define S0SPTSR (*((volatile unsigned char *) 0xE0020014)) +#define S0SPTOR (*((volatile unsigned char *) 0xE0020018)) +#define S0SPINT (*((volatile unsigned char *) 0xE002001C)) + +/* SSP Controller */ +#define SSPCR0 (*((volatile unsigned short* ) 0xE0068000)) +#define SSPCR1 (*((volatile unsigned char * ) 0xE0068004)) +#define SSPDR (*((volatile unsigned short* ) 0xE0068008)) +#define SSPSR (*((volatile unsigned char * ) 0xE006800C)) +#define SSPCPSR (*((volatile unsigned char * ) 0xE0068010)) +#define SSPIMSC (*((volatile unsigned char * ) 0xE0068014)) +#define SSPRIS (*((volatile unsigned char * ) 0xE0068018)) +#define SSPMIS (*((volatile unsigned char * ) 0xE006801C)) +#define SSPICR (*((volatile unsigned char * ) 0xE0068020)) +#define SSPDMACR (*((volatile unsigned char * ) 0xE0068024)) + +/* Real Time Clock */ +/* maybe useful for the efsl time-handling : */ +#define ILR (*((volatile unsigned char *) 0xE0024000)) +#define CTC (*((volatile unsigned short*) 0xE0024004)) +#define CCR (*((volatile unsigned char *) 0xE0024008)) +#define CIIR (*((volatile unsigned char *) 0xE002400C)) +#define AMR (*((volatile unsigned char *) 0xE0024010)) +#define CTIME0 (*((volatile unsigned long *) 0xE0024014)) +#define CTIME1 (*((volatile unsigned long *) 0xE0024018)) +#define CTIME2 (*((volatile unsigned long *) 0xE002401C)) +#define SEC (*((volatile unsigned char *) 0xE0024020)) +#define MIN (*((volatile unsigned char *) 0xE0024024)) +#define HOUR (*((volatile unsigned char *) 0xE0024028)) +#define DOM (*((volatile unsigned char *) 0xE002402C)) +#define DOW (*((volatile unsigned char *) 0xE0024030)) +#define DOY (*((volatile unsigned short*) 0xE0024034)) +#define MONTH (*((volatile unsigned char *) 0xE0024038)) +#define YEAR (*((volatile unsigned short*) 0xE002403C)) +#define ALSEC (*((volatile unsigned char *) 0xE0024060)) +#define ALMIN (*((volatile unsigned char *) 0xE0024064)) +#define ALHOUR (*((volatile unsigned char *) 0xE0024068)) +#define ALDOM (*((volatile unsigned char *) 0xE002406C)) +#define ALDOW (*((volatile unsigned char *) 0xE0024070)) +#define ALDOY (*((volatile unsigned short*) 0xE0024074)) +#define ALMON (*((volatile unsigned char *) 0xE0024078)) +#define ALYEAR (*((volatile unsigned short*) 0xE002407C)) +#define PREINT (*((volatile unsigned short*) 0xE0024080)) +#define PREFRAC (*((volatile unsigned short*) 0xE0024084)) + +#endif diff --git a/poc/lpc2148_efsl/inc/interfaces/arm_spi.h b/poc/lpc2148_efsl/inc/interfaces/arm_spi.h new file mode 100644 index 0000000..cf4e5f5 --- /dev/null +++ b/poc/lpc2148_efsl/inc/interfaces/arm_spi.h @@ -0,0 +1,65 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : arm_spi.h * +* Description : Headerfile for at91_spi.c and lpc2000_spi.c * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* AT91 and LPC2000 Interfaces (c)2005 Martin Thomas * +\*****************************************************************************/ + +#ifndef __ARM_SPI_H_ +#define __ARM_SPI_H_ + +#ifndef FALSE +#define FALSE 0x00 +#define TRUE 0x01 +#endif + +#include "../debug.h" +#include "config.h" + + +/*************************************************************\ + hwInterface + ---------- +* FILE* imagefile File emulation of hw interface. +* long sectorCount Number of sectors on the file. +\*************************************************************/ +struct hwInterface{ + /*FILE *imageFile;*/ + eint32 sectorCount; +}; +typedef struct hwInterface hwInterface; + +esint8 if_initInterface(hwInterface* file,eint8* opts); +esint8 if_readBuf(hwInterface* file,euint32 address,euint8* buf); +esint8 if_writeBuf(hwInterface* file,euint32 address,euint8* buf); +esint8 if_setPos(hwInterface* file,euint32 address); + +void if_spiInit(hwInterface *iface); +void if_spiSetSpeed(euint8 speed); +euint8 if_spiSend(hwInterface *iface, euint8 outgoing); + +#endif diff --git a/poc/lpc2148_efsl/inc/interfaces/atmega128.h b/poc/lpc2148_efsl/inc/interfaces/atmega128.h new file mode 100644 index 0000000..cf4c08f --- /dev/null +++ b/poc/lpc2148_efsl/inc/interfaces/atmega128.h @@ -0,0 +1,70 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : atmega128.h * +* Description : Headerfile for atmega128.c * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __ATMEGA128_SD_H_ +#define __ATMEGA128_SD_H_ + +#define __AVR_ATmega128__ 1 +#define FALSE 0X00 +#define TRUE 0x01 + +#define DDR_SPI DDRB +#define DD_MOSI DDB2 +#define DD_SCK DDB1 + +#include +#include +#include "../debug.h" +#include "config.h" + + +/*************************************************************\ + hwInterface + ---------- +* FILE* imagefile File emulation of hw interface. +* long sectorCount Number of sectors on the file. +\*************************************************************/ +struct hwInterface{ + /*FILE *imageFile;*/ + eint32 sectorCount; +}; +typedef struct hwInterface hwInterface; + +esint8 if_initInterface(hwInterface* file,eint8* opts); +esint8 if_readBuf(hwInterface* file,euint32 address,euint8* buf); +esint8 if_writeBuf(hwInterface* file,euint32 address,euint8* buf); +esint8 if_setPos(hwInterface* file,euint32 address); + +void if_spiInit(hwInterface *iface); +euint8 if_spiSend(hwInterface *iface, euint8 outgoing); + +#endif diff --git a/poc/lpc2148_efsl/inc/interfaces/dsp67xx.h b/poc/lpc2148_efsl/inc/interfaces/dsp67xx.h new file mode 100644 index 0000000..be9ed47 --- /dev/null +++ b/poc/lpc2148_efsl/inc/interfaces/dsp67xx.h @@ -0,0 +1,61 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : dsp67xx.h * +* Revision : Initial developement * +* Description : Headerfile for dsp67xx.h * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __DSP67XX_H_ +#define __DSP67XX_H_ + +#include "config.h" +#include "mcbsp/mcbsp.h" + +/*************************************************************\ + hwInterface + ---------- +* FILE* imagefile File emulation of hw interface. +* long sectorCount Number of sectors on the file. +\*************************************************************/ +struct hwInterface{ + /*FILE *imageFile;*/ + long sectorCount; + BspPort *port; +}; +typedef struct hwInterface hwInterface; + +short if_initInterface(hwInterface* file,char* opts); +short if_readBuf(hwInterface* file,euint32 address,unsigned char* buf); +short if_writeBuf(hwInterface* file,unsigned long address,unsigned char* buf); +short if_setPos(hwInterface* file,unsigned long address); + +signed char if_spiInit(hwInterface *iface); +unsigned char if_spiSend(hwInterface *iface,euint8 outgoing); + +#endif diff --git a/poc/lpc2148_efsl/inc/interfaces/efsl_dbg_printf_arm.h b/poc/lpc2148_efsl/inc/interfaces/efsl_dbg_printf_arm.h new file mode 100644 index 0000000..7cf70ef --- /dev/null +++ b/poc/lpc2148_efsl/inc/interfaces/efsl_dbg_printf_arm.h @@ -0,0 +1,7 @@ +#ifndef debug_printf_arm_h_ +#define debug_printf_arm_h_ + +extern void efsl_debug_devopen_arm( int(*put)(int) ); +extern void efsl_debug_printf_arm( char const *format, ... ); + +#endif diff --git a/poc/lpc2148_efsl/inc/interfaces/helper.h b/poc/lpc2148_efsl/inc/interfaces/helper.h new file mode 100644 index 0000000..4f3b62f --- /dev/null +++ b/poc/lpc2148_efsl/inc/interfaces/helper.h @@ -0,0 +1,49 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : helper.h * +* Description : Headerfile for helper.c * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __HELPER_H__ +#define __HELPER_H__ + +/*****************************************************************************/ +#include +#include +#include "../debug.h" +#include "../types.h" +#include "config.h" +/*****************************************************************************/ + +void* Malloc(eint32 size); +void Fopen(FILE **f,eint8* filename); +void MMap(eint8* filename,void**x,eint32* size); +int getFileSize(FILE* file); + +#endif diff --git a/poc/lpc2148_efsl/inc/interfaces/linuxfile.h b/poc/lpc2148_efsl/inc/interfaces/linuxfile.h new file mode 100644 index 0000000..ef6e564 --- /dev/null +++ b/poc/lpc2148_efsl/inc/interfaces/linuxfile.h @@ -0,0 +1,67 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------------------------------------------- * +* * +* Filename : linuxfile.h * +* Description : Headerfile for linuxfile.c * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __LINUXFILE_H__ +#define __LINUXFILE_H__ + +/*****************************************************************************/ +#include +#include +#include "helper.h" +#include "../debug.h" +#include "../types.h" +#include "config.h" +/*****************************************************************************/ + +#define _LARGEFILE_SOURCE +#define _GNU_SOURCE +#define _FILE_OFFSET_BITS 64 + +/*************************************************************\ + hwInterface + ---------- +* FILE* imagefile File emulation of hw interface. +* long sectorCount Number of sectors on the file. +\*************************************************************/ +struct hwInterface{ + FILE *imageFile; + eint32 sectorCount; + euint32 readCount,writeCount; +}; +typedef struct hwInterface hwInterface; + +esint8 if_initInterface(hwInterface* file,eint8* fileName); +esint8 if_readBuf(hwInterface* file,euint32 address,euint8* buf); +esint8 if_writeBuf(hwInterface* file,euint32 address,euint8* buf); +esint8 if_setPos(hwInterface* file,euint32 address); + +#endif diff --git a/poc/lpc2148_efsl/inc/interfaces/nios2.h b/poc/lpc2148_efsl/inc/interfaces/nios2.h new file mode 100644 index 0000000..417261c --- /dev/null +++ b/poc/lpc2148_efsl/inc/interfaces/nios2.h @@ -0,0 +1,62 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : nios2.h * +* Description : Headerfile for nios2.c * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2005 Marcio Troccoli * +\*****************************************************************************/ + +#ifndef __NIOS_2_SD_H_ +#define __NIOS_2_SD_H_ + +#define FALSE 0X00 +#define TRUE 0x01 + +#include "../debug.h" +#include "config.h" + + +/*************************************************************\ + hwInterface + ---------- +* FILE* imagefile File emulation of hw interface. +* long sectorCount Number of sectors on the file. +\*************************************************************/ +struct hwInterface{ + /*FILE *imageFile;*/ + eint32 sectorCount; +}; +typedef struct hwInterface hwInterface; + +esint8 if_initInterface(hwInterface* file,eint8* opts); +esint8 if_readBuf(hwInterface* file,euint32 address,euint8* buf); +esint8 if_writeBuf(hwInterface* file,euint32 address,euint8* buf); +esint8 if_setPos(hwInterface* file,euint32 address); + +void if_spiInit(hwInterface *iface); +euint8 if_spiSend(hwInterface *iface, euint8 outgoing); + +#endif diff --git a/poc/lpc2148_efsl/inc/interfaces/sd.h b/poc/lpc2148_efsl/inc/interfaces/sd.h new file mode 100644 index 0000000..2a009aa --- /dev/null +++ b/poc/lpc2148_efsl/inc/interfaces/sd.h @@ -0,0 +1,66 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------------------------------------------- * +* * +* Filename : sd.h * +* Revision : Initial developement * +* Description : Headerfile for sd.c * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __SD_H_ +#define __SD_H_ + +#include "config.h" +#include "types.h" +#include "../debug.h" + +#ifdef HW_ENDPOINT_ATMEGA128_SD + #include "interfaces/atmega128.h" +#endif +#ifdef HW_ENDPOINT_DSP_TI6713_SD + #include "interfaces/dsp67xx.h" +#endif +#if defined(HW_ENDPOINT_LPC2000_SD) | defined(HW_ENDPOINT_AT91_SD) + #include "interfaces/arm_spi.h" +#endif + +#define CMDREAD 17 +#define CMDWRITE 24 +#define CMDREADCSD 9 + +esint8 sd_Init(hwInterface *iface); +void sd_Command(hwInterface *iface,euint8 cmd, euint16 paramx, euint16 paramy); +euint8 sd_Resp8b(hwInterface *iface); +void sd_Resp8bError(hwInterface *iface,euint8 value); +euint16 sd_Resp16b(hwInterface *iface); +esint8 sd_State(hwInterface *iface); + +esint8 sd_readSector(hwInterface *iface,euint32 address,euint8* buf, euint16 len); +esint8 sd_writeSector(hwInterface *iface,euint32 address, euint8* buf); +esint8 sd_getDriveSize(hwInterface *iface, euint32* drive_size ); + +#endif diff --git a/poc/lpc2148_efsl/inc/ioman.h b/poc/lpc2148_efsl/inc/ioman.h new file mode 100644 index 0000000..83d93e8 --- /dev/null +++ b/poc/lpc2148_efsl/inc/ioman.h @@ -0,0 +1,135 @@ +/*****************************************************************************\ +* libfat - General purpose FAT library * +* ---------------------------------- * +* * +* Filename : ioman.h * +* Description : Header file for ioman.c * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __IOMAN_H__ +#define __IOMAN_H__ + +/*****************************************************************************/ +#include "interface.h" +#include "error.h" +#include "plibc.h" +#include "debug.h" +#include "types.h" +#include "config.h" +/*****************************************************************************/ + +#define IOMAN_STATUS_ATTR_VALIDDATA 0 +#define IOMAN_STATUS_ATTR_USERBUFFER 1 +#define IOMAN_STATUS_ATTR_WRITE 2 + +#define IOM_MODE_READONLY 1 +#define IOM_MODE_READWRITE 2 +#define IOM_MODE_EXP_REQ 4 + +struct IOManStack{ + euint32 sector; + euint8 status; + euint8 usage; +}; +typedef struct IOManStack IOManStack; + +struct IOManager{ + hwInterface *iface; + + euint8 *bufptr; + euint16 numbuf; + euint16 numit; + + IOMAN_ERR_EUINT8 + + IOManStack stack[IOMAN_NUMBUFFER][IOMAN_NUMITERATIONS]; + + euint32 sector[IOMAN_NUMBUFFER]; + euint8 status[IOMAN_NUMBUFFER]; + euint8 usage[IOMAN_NUMBUFFER]; + euint8 reference[IOMAN_NUMBUFFER]; + euint8 itptr[IOMAN_NUMBUFFER]; +#ifdef IOMAN_DO_MEMALLOC + euint8 cache_mem[IOMAN_NUMBUFFER * 512]; +#endif +}; +typedef struct IOManager IOManager; + +#define IOBJ ioman + +#define ioman_isValid(bp) ioman_getAttr(IOBJ,bp,IOMAN_STATUS_ATTR_VALIDDATA) +#define ioman_isUserBuf(bp) ioman_getAttr(IOBJ,bp,IOMAN_STATUS_ATTR_USERBUFFER) +#define ioman_isWritable(bp) ioman_getAttr(IOBJ,bp,IOMAN_STATUS_ATTR_WRITE) + +#define ioman_setValid(bp) ioman_setAttr(IOBJ,bp,IOMAN_STATUS_ATTR_VALIDDATA,1) +#define ioman_setUserBuf(bp) ioman_setAttr(IOBJ,bp,IOMAN_STATUS_ATTR_USERBUFFER,1) +#define ioman_setWritable(bp) ioman_setAttr(IOBJ,bp,IOMAN_STATUS_ATTR_WRITE,1) + +#define ioman_setNotValid(bp) ioman_setAttr(IOBJ,bp,IOMAN_STATUS_ATTR_VALIDDATA,0) +#define ioman_setNotUserBuf(bp) ioman_setAttr(IOBJ,bp,IOMAN_STATUS_ATTR_USERBUFFER,0) +#define ioman_setNotWritable(bp) ioman_setAttr(IOBJ,bp,IOMAN_STATUS_ATTR_WRITE,0) + +#define ioman_isReqRo(mode) ((mode)&(IOM_MODE_READONLY)) +#define ioman_isReqRw(mode) ((mode)&(IOM_MODE_READWRITE)) +#define ioman_isReqExp(mode) ((mode)&(IOM_MODE_EXP_REQ)) + +esint8 ioman_init(IOManager *ioman, hwInterface *iface, euint8* bufferarea); +void ioman_reset(IOManager *ioman); +euint8* ioman_getBuffer(IOManager *ioman,euint8* bufferarea); +void ioman_setAttr(IOManager *ioman,euint16 bufplace,euint8 attribute,euint8 val); +euint8 ioman_getAttr(IOManager *ioman,euint16 bufplace,euint8 attribute); +euint8 ioman_getUseCnt(IOManager *ioman,euint16 bufplace); +void ioman_incUseCnt(IOManager *ioman,euint16 bufplace); +void ioman_decUseCnt(IOManager *ioman,euint16 bufplace); +void ioman_resetUseCnt(IOManager *ioman,euint16 bufplace); +euint8 ioman_getRefCnt(IOManager *ioman,euint16 bufplace); +void ioman_incRefCnt(IOManager *ioman,euint16 bufplace); +void ioman_decRefCnt(IOManager *ioman,euint16 bufplace); +void ioman_resetRefCnt(IOManager *ioman,euint16 bufplace); +esint8 ioman_pop(IOManager *ioman,euint16 bufplace); +esint8 ioman_push(IOManager *ioman,euint16 bufplace); +euint8* ioman_getPtr(IOManager *ioman,euint16 bufplace); +esint16 ioman_getBp(IOManager *ioman,euint8* buf); +esint8 ioman_readSector(IOManager *ioman,euint32 address,euint8* buf); +esint8 ioman_writeSector(IOManager *ioman, euint32 address, euint8* buf); +void ioman_resetCacheItem(IOManager *ioman,euint16 bufplace); +esint32 ioman_findSectorInCache(IOManager *ioman, euint32 address); +esint32 ioman_findFreeSpot(IOManager *ioman); +esint32 ioman_findUnusedSpot(IOManager *ioman); +esint32 ioman_findOverallocableSpot(IOManager *ioman); +esint8 ioman_putSectorInCache(IOManager *ioman,euint32 address, euint16 bufplace); +esint8 ioman_flushSector(IOManager *ioman, euint16 bufplace); +euint8* ioman_getSector(IOManager *ioman,euint32 address, euint8 mode); +esint8 ioman_releaseSector(IOManager *ioman,euint8* buf); +esint8 ioman_directSectorRead(IOManager *ioman,euint32 address, euint8* buf); +esint8 ioman_directSectorWrite(IOManager *ioman,euint32 address, euint8* buf); +esint8 ioman_flushRange(IOManager *ioman,euint32 address_low, euint32 address_high); +esint8 ioman_flushAll(IOManager *ioman); + +void ioman_printStatus(IOManager *ioman); + +#endif diff --git a/poc/lpc2148_efsl/inc/ioman_v2.h b/poc/lpc2148_efsl/inc/ioman_v2.h new file mode 100644 index 0000000..ab6bf39 --- /dev/null +++ b/poc/lpc2148_efsl/inc/ioman_v2.h @@ -0,0 +1,123 @@ +/*****************************************************************************\ +* libfat - General purpose FAT library * +* ---------------------------------- * +* * +* Filename : ioman.h * +* Description : Header file for ioman.c * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __IOMAN_H__ +#define __IOMAN_H__ + +/*****************************************************************************/ +#include "interface.h" +#include "plibc.h" +#include "debug.h" +#include "types.h" +#include "config.h" +/*****************************************************************************/ + +#define IOMAN_STATUS_ATTR_VALIDDATA 0 +#define IOMAN_STATUS_ATTR_USERBUFFER 1 +#define IOMAN_STATUS_ATTR_WRITE 2 + +#define IOM_MODE_READONLY 0 +#define IOM_MODE_READWRITE 1 + +struct IOManStack{ + euint32 sector; + euint8 status; + euint8 usage; +}; +typedef struct IOManStack IOManStack; + +struct IOManager{ + hwInterface *iface; + + euint8 *bufptr; + euint16 numbuf; + euint16 numit; + + IOManStack stack[IOMAN_NUMBUFFER][IOMAN_NUMITERATIONS]; + + euint32 sector[IOMAN_NUMBUFFER]; + euint8 status[IOMAN_NUMBUFFER]; + euint8 usage[IOMAN_NUMBUFFER]; + euint8 reference[IOMAN_NUMBUFFER]; + euint8 itptr[IOMAN_NUMBUFFER]; +}; +typedef struct IOManager IOManager; + +#define IOBJ ioman + +#define ioman_isValid(bp) ioman_getAttr(IOBJ,bp,IOMAN_STATUS_ATTR_VALIDDATA) +#define ioman_isUserBuf(bp) ioman_getAttr(IOBJ,bp,IOMAN_STATUS_ATTR_USERBUFFER) +#define ioman_isWritable(bp) ioman_getAttr(IOBJ,bp,IOMAN_STATUS_ATTR_WRITE) + +#define ioman_setValid(bp) ioman_setAttr(IOBJ,bp,IOMAN_STATUS_ATTR_VALIDDATA,1) +#define ioman_setUserBuf(bp) ioman_setAttr(IOBJ,bp,IOMAN_STATUS_ATTR_USERBUFFER,1) +#define ioman_setWritable(bp) ioman_setAttr(IOBJ,bp,IOMAN_STATUS_ATTR_WRITE,1) + +#define ioman_setNotValid(bp) ioman_setAttr(IOBJ,bp,IOMAN_STATUS_ATTR_VALIDDATA,0) +#define ioman_setNotUserBuf(bp) ioman_setAttr(IOBJ,bp,IOMAN_STATUS_ATTR_USERBUFFER,0) +#define ioman_setNotWritable(bp) ioman_setAttr(IOBJ,bp,IOMAN_STATUS_ATTR_WRITE,0) + +esint8 ioman_init(IOManager *ioman, hwInterface *iface, euint8* bufferarea); +void ioman_reset(IOManager *ioman); +euint8* ioman_getBuffer(IOManager *ioman,euint8* bufferarea); +void ioman_setAttr(IOManager *ioman,euint16 bufplace,euint8 attribute,euint8 val); +euint8 ioman_getAttr(IOManager *ioman,euint16 bufplace,euint8 attribute); +euint8 ioman_getUseCnt(IOManager *ioman,euint16 bufplace); +void ioman_incUseCnt(IOManager *ioman,euint16 bufplace); +void ioman_decUseCnt(IOManager *ioman,euint16 bufplace); +void ioman_resetUseCnt(IOManager *ioman,euint16 bufplace); +euint8 ioman_getRefCnt(IOManager *ioman,euint16 bufplace); +void ioman_incRefCnt(IOManager *ioman,euint16 bufplace); +void ioman_decRefCnt(IOManager *ioman,euint16 bufplace); +void ioman_resetRefCnt(IOManager *ioman,euint16 bufplace); +esint8 ioman_pop(IOManager *ioman,euint16 bufplace); +esint8 ioman_push(IOManager *ioman,euint16 bufplace); +euint8* ioman_getPtr(IOManager *ioman,euint16 bufplace); +esint16 ioman_getBp(IOManager *ioman,euint8* buf); +esint8 ioman_readSector(IOManager *ioman,euint32 address,euint8* buf); +esint8 ioman_writeSector(IOManager *ioman, euint32 address, euint8* buf); +void ioman_resetCacheItem(IOManager *ioman,euint16 bufplace); + +esint32 ioman_findSectorInCache(IOManager *ioman, euint32 address); +esint32 ioman_findFreeSpot(IOManager *ioman); +esint32 ioman_findUnusedSpot(IOManager *ioman); +esint32 ioman_findOverallocableSpot(IOManager *ioman); + +esint8 ioman_putSectorInCache(IOManager *ioman,euint32 address, euint16 bufplace); +esint8 ioman_flushSector(IOManager *ioman, euint16 bufplace); + +euint8* ioman_getSector(IOManager *ioman,euint32 address, euint8 mode); +esint8 ioman_releaseSector(IOManager *ioman,euint8* buf); + +void ioman_printStatus(IOManager *ioman); + +#endif diff --git a/poc/lpc2148_efsl/inc/ls.h b/poc/lpc2148_efsl/inc/ls.h new file mode 100644 index 0000000..2ca7500 --- /dev/null +++ b/poc/lpc2148_efsl/inc/ls.h @@ -0,0 +1,68 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : ls.h * +* Description : Headerfile for ls.c * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __LS_H__ +#define __LS_H__ + +/*****************************************************************************/ +#include "config.h" +#include "fs.h" +#include "dir.h" +#include "fat.h" +/*****************************************************************************/ + +struct ListDirEntry{ + euint8 FileName[LIST_MAXLENFILENAME]; + euint32 FileSize; + euint8 Attribute; +}; +typedef struct ListDirEntry ListDirEntry; + +struct DirList{ + FileSystem *fs; + euint16 cEntry,rEntry; + /*FileRecord currentEntry;*/ + ListDirEntry currentEntry; + ClusterChain Cache; +}; +typedef struct DirList DirList; + +esint8 ls_openDir(DirList *dlist,FileSystem *fs,eint8* dirname); +esint8 ls_getNext(DirList *dlist); + +esint8 ls_getDirEntry(DirList *dlist); +esint8 ls_getRealDirEntry(DirList *dlist); +esint8 ls_getRootAreaEntry(DirList *dlist); +esint8 ls_isValidFileEntry(ListDirEntry *entry); +void ls_fileEntryToDirListEntry(DirList *dlist, euint8* buf, euint16 offset); + +#endif diff --git a/poc/lpc2148_efsl/inc/mkfs.h b/poc/lpc2148_efsl/inc/mkfs.h new file mode 100644 index 0000000..182d7ae --- /dev/null +++ b/poc/lpc2148_efsl/inc/mkfs.h @@ -0,0 +1,48 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------------------------------------------- * +* * +* Filename : mkfs.h * +* Description : Headerfile for mkfs.c * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __MKFS_H_ +#define __MKFS_H_ + +/*****************************************************************************/ +#include "partition.h" +#include "plibc.h" +#include "debug.h" +#include "types.h" +#include "config.h" +/*****************************************************************************/ + +#define MKFS_ERR_TOOLITTLESECTORS 1 + +signed short mkfs_makevfat(Partition *part); + +#endif diff --git a/poc/lpc2148_efsl/inc/partition.h b/poc/lpc2148_efsl/inc/partition.h new file mode 100644 index 0000000..b58387e --- /dev/null +++ b/poc/lpc2148_efsl/inc/partition.h @@ -0,0 +1,77 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------------------------------------------- * +* * +* Filename : partition.h * +* Description : Headerfile for partition.c * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __PARTITION_H__ +#define __PARTITION_H__ + +/*****************************************************************************/ +#include "config.h" +#include "error.h" +#include "interface.h" +#include "disc.h" +#include "types.h" +/*****************************************************************************/ + +#define PT_FAT12 0x01 +#define PT_FAT16A 0x04 +#define PT_FAT16 0x06 +#define PT_FAT32 0x0B +#define PT_FAT32A 0x5C +#define PT_FAT16B 0x5E + +/*************************************************************************************\ + Partition + ------- +* Disc* disc Pointer to disc containing this partition. +* eint8 activePartition Array subscript for disc->partitions[activePartition] +\*************************************************************************************/ +struct Partition{ + Disc *disc; + esint8 activePartition; +}; +typedef struct Partition Partition; + +void part_initPartition(Partition *part,Disc* refDisc); +eint16 part_isFatPart(euint8 type); +esint8 part_readBuf(Partition *part, euint32 address, euint8* buf); +esint8 part_readPartBuf(Partition *part, euint32 address, euint8* buf, euint32 offset, euint16 len); +eint16 part_writeBuf(Partition *part,euint32 address,euint8* buf); +euint8* part_getSect(Partition *part, euint32 address,euint8 mode); +esint8 part_relSect(Partition *part, euint8* buf); +esint8 part_flushPart(Partition *part,euint32 addr_l, euint32 addr_h); +esint8 part_directSectorRead(Partition *part, euint32 address, euint8* buf); +esint8 part_directSectorWrite(Partition *part, euint32 address, euint8* buf); +euint32 part_getRealLBA(Partition *part,euint32 address); + +#include "extract.h" + +#endif diff --git a/poc/lpc2148_efsl/inc/plibc.h b/poc/lpc2148_efsl/inc/plibc.h new file mode 100644 index 0000000..ab6990b --- /dev/null +++ b/poc/lpc2148_efsl/inc/plibc.h @@ -0,0 +1,48 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------------------------------------------- * +* * +* Filename : plibc.h * +* Description : Headerfile for plibc.c * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __PLIBC_H__ +#define __PLIBC_H__ + +/*****************************************************************************/ +#include "debug.h" +#include "types.h" +#include "config.h" +/*****************************************************************************/ + +euint16 strMatch(eint8* bufa, eint8*bufb,euint32 n); +void memCpy(void* psrc, void* pdest, euint32 size); +void memClr(void *pdest,euint32 size); +void memSet(void *pdest,euint32 size,euint8 data); + + +#endif diff --git a/poc/lpc2148_efsl/inc/time.h b/poc/lpc2148_efsl/inc/time.h new file mode 100644 index 0000000..c711ceb --- /dev/null +++ b/poc/lpc2148_efsl/inc/time.h @@ -0,0 +1,70 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : types.h * +* Description : Headerfile for types.c * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ +#ifndef __TIME_H_ +#define __TIME_H_ + +/*****************************************************************************/ +#include "types.h" +/*****************************************************************************/ + +#ifdef DATE_TIME_SUPPORT + #define time_getYear(void) efsl_getYear() + #define time_getMonth(void) efsl_getMonth() + #define time_getDay(void) efsl_getDay() + #define time_getHour(void) efsl_getHour() + #define time_getMinute(void) efsl_getMinute() + #define time_getSecond(void) efsl_getSecond() + #define time_getDate(void) fs_makeDate() + #define time_getTime(void) fs_makeTime() +#else + #define time_getYear(void) 0x0; + #define time_getMonth(void) 0x0; + #define time_getDay(void) 0x0; + #define time_getHour(void) 0x0; + #define time_getMinute(void) 0x0; + #define time_getSecond(void) 0x0; + #define time_getDate(void) 0x0; + #define time_getTime(void) 0x0; +#endif + +#ifdef DATE_TIME_SUPPORT +euint16 efsl_getYear(void); +euint8 efsl_getMonth(void); +euint8 efsl_getDay(void); +euint8 efsl_getHour(void); +euint8 efsl_getMinute(void); +euint8 efsl_getSecond(void); +#endif + +euint8 fs_hasTimeSupport(void); + +#endif diff --git a/poc/lpc2148_efsl/inc/types.h b/poc/lpc2148_efsl/inc/types.h new file mode 100644 index 0000000..cac904e --- /dev/null +++ b/poc/lpc2148_efsl/inc/types.h @@ -0,0 +1,106 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------------------------------------------- * +* * +* Filename : types.h * +* Description : This file contains the crossplatform data types * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/* Contributions + * (c)2005 Marcio Troccoli * + */ + +#ifndef __EFS_TYPES_H__ +#define __EFS_TYPES_H__ + +/*****************************************************************************/ +#include "config.h" +/*****************************************************************************/ + +#if defined(HW_ENDPOINT_LINUX) + typedef char eint8; + typedef signed char esint8; + typedef unsigned char euint8; + typedef short eint16; + typedef signed short esint16; + typedef unsigned short euint16; + typedef long eint32; + typedef signed long esint32; + typedef unsigned long euint32; +#elif defined(HW_ENDPOINT_LINUX64) + typedef char eint8; + typedef signed char esint8; + typedef unsigned char euint8; + typedef short eint16; + typedef signed short esint16; + typedef unsigned short euint16; + typedef int eint32; + typedef signed int esint32; + typedef unsigned int euint32; +#elif defined (HW_ENDPOINT_ATMEGA128_SD) + typedef char eint8; + typedef signed char esint8; + typedef unsigned char euint8; + typedef short eint16; + typedef signed short esint16; + typedef unsigned short euint16; + typedef long eint32; + typedef signed long esint32; + typedef unsigned long euint32; +#elif defined(HW_ENDPOINT_DSP_TI6713_SD) + typedef char eint8; + typedef signed char esint8; + typedef unsigned char euint8; + typedef short eint16; + typedef signed short esint16; + typedef unsigned short euint16; + typedef int eint32; + typedef signed int esint32; + typedef unsigned int euint32; +#elif defined(NIOS_2) + typedef char eint8; + typedef signed char esint8; + typedef unsigned char euint8; + typedef short eint16; + typedef signed short esint16; + typedef unsigned short euint16; + typedef int eint32; + typedef signed int esint32; + typedef unsigned int euint32; +#else + typedef char eint8; + typedef signed char esint8; + typedef unsigned char euint8; + typedef short eint16; + typedef signed short esint16; + typedef unsigned short euint16; + typedef long eint32; + typedef signed long esint32; + typedef unsigned long euint32; +#endif + +#endif diff --git a/poc/lpc2148_efsl/inc/ui.h b/poc/lpc2148_efsl/inc/ui.h new file mode 100644 index 0000000..8f16305 --- /dev/null +++ b/poc/lpc2148_efsl/inc/ui.h @@ -0,0 +1,48 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------------------------------------------- * +* * +* Filename : ui.h * +* Description : Headerfile for ui.c * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __UI_H__ +#define __UI_H__ + +/*****************************************************************************/ +#include "fs.h" +#include "types.h" +#include "fat.h" +#include "dir.h" +#include "config.h" +/*****************************************************************************/ + +short listFiles(FileSystem *fs, char *dir); +esint16 rmfile(FileSystem *fs,euint8* filename); +esint8 mkdir(FileSystem *fs,eint8* dirname); + +#endif diff --git a/poc/lpc2148_efsl/src/debug.c b/poc/lpc2148_efsl/src/debug.c new file mode 100644 index 0000000..d3ef43d --- /dev/null +++ b/poc/lpc2148_efsl/src/debug.c @@ -0,0 +1,332 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------------------------------------------- * +* * +* Filename : debug.c * +* Description : These functions are used for debugging output on different * +* environments * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/* COMMENT REGARDING FUNCTION COMMENTS IN THIS FILE + * Only the linuxfile debug functions are commented since all functions + * perform the same logical task. +*/ + +/*****************************************************************************/ +#include "debug.h" +/*****************************************************************************/ + + +/*****************************************************************************/ +#ifdef DEBUG +#ifdef HW_ENDPOINT_LINUX_ALL +/*****************************************************************************/ + +/* **************************************************************************** + * void debug(const eint8 *format, ...) + * Description: This function prints debug output to the screen (target dependant) + * and if DO_FUNC_DEBUG is defined also to a localfile. + * Return value: void +*/ + +void debug(const eint8 *format, ...) +{ + va_list ap; + #ifdef DO_FUNC_DEBUG + euint8 c; + extern FILE* debugfile; + extern volatile euint8 tw; + #endif + + va_start(ap, format); + vprintf(format,ap); + #ifdef DO_FUNC_DEBUG + for(c=0;c0)tw--; + + for(c=0;c=90) + debug(PSTR("\n")); +} +/*****************************************************************************/ + +void debug_init(void) +{ + unsigned short ubrr; + + ubrr = ((unsigned short)DEBUG_UBRR); + + switch(DEBUG_PORT){ + case 0: + UBRR0H = (euint8) (ubrr>>8); + UBRR0L = (euint8) (ubrr); + UCSR0B = ( (1<>8); + UBRR1L = (euint8) (ubrr); + UCSR1B = ( (1<FirstSectorRootDir;c<(fs->FirstSectorRootDir+fs->volumeId.RootEntryCount/32);c++){ * +* + for(c=fs->FirstSectorRootDir;c<(fs->FirstSectorRootDir+fs->volumeId.RootEntryCount/16);c++){ * +* * +* mthomas: testing - modified byte-array access to use extract.h-functions * +* to avoid aligment warnings with arm-elf-gcc * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "dir.h" +/*****************************************************************************/ + +/* **************************************************************************** + * void dir_getFileStructure(FileSystem *fs,FileRecord *filerec,FileLocation *loc) + * Description: This function stores the filerecord located at loc in filerec. + * It fetches the required sector for this. + * Return value: void +*/ +void dir_getFileStructure(FileSystem *fs,FileRecord *filerec,FileLocation *loc) +{ + euint8 *buf; + + buf=part_getSect(fs->part,loc->Sector,IOM_MODE_READONLY); + *filerec=*(((FileRecord*)buf)+loc->Offset); + part_relSect(fs->part,buf); +} + +/*****************************************************************************/ + +/* **************************************************************************** + * void dir_createDirectoryEntry(FileSystem *fs,FileRecord *filerec,FileLocation *loc) + * Description: This function writes the filerecord stored in filerec to disc at + * location loc. + * Return value: void +*/ +void dir_createDirectoryEntry(FileSystem *fs,FileRecord *filerec,FileLocation *loc) +{ + euint8 *buf; + + buf = part_getSect(fs->part,loc->Sector,IOM_MODE_READWRITE); + memCpy(filerec,buf+(loc->Offset*sizeof(*filerec)),sizeof(*filerec)); + part_relSect(fs->part,buf); +} +/*****************************************************************************/ + +/* **************************************************************************** + * void dir_createDefaultEntry(FileSystem *fs,FileRecord *filerec,eint8* fatfilename) + * Description: This function fills in a filerecord with safe default values, and + * a given fatfilename. If your system has a means of knowing time, here is an + * excellent place to apply it to the filerecord. + * Return value: void +*/ +void dir_createDefaultEntry(FileSystem *fs,FileRecord *filerec,eint8* fatfilename) +{ + memCpy(fatfilename,filerec->FileName,11); + filerec->Attribute=0x00; + filerec->NTReserved=0x00; + filerec->MilliSecTimeStamp=0x00; + filerec->CreatedTime=time_getTime(); + filerec->CreatedDate=time_getDate(); + filerec->AccessDate=filerec->CreatedDate; + filerec->FirstClusterHigh=0x0000; + filerec->WriteTime=filerec->CreatedTime; + filerec->WriteDate=filerec->CreatedDate; + filerec->FirstClusterLow=0x0000; + filerec->FileSize=0x00000000; +} +/*****************************************************************************/ + +/* **************************************************************************** + * void dir_setFirstCluster(File *file,euint32 cluster_addr) + * Description: This function requires modification to release it from + * depending on the file object. + * Return value: +*/ +void dir_setFirstCluster(FileSystem *fs,FileLocation *loc,euint32 cluster_addr) +{ + euint8 *buf; + + buf = part_getSect(fs->part,loc->Sector,IOM_MODE_READWRITE); + (((FileRecord*)buf)+loc->Offset)->FirstClusterHigh=cluster_addr>>16; + (((FileRecord*)buf)+loc->Offset)->FirstClusterLow=cluster_addr&0xFFFF; + part_relSect(fs->part,buf); +} +/*****************************************************************************/ + +/* **************************************************************************** + * void dir_setFileSize(FileSystem *fs, FileLocation *loc,euint32 numbytes) + * Description: This function changes the filesize recorded at loc->Sector + * to 'numbytes'. + * Return value: void +*/ +void dir_setFileSize(FileSystem *fs, FileLocation *loc,euint32 numbytes) +{ + euint8 *buf; + + buf = part_getSect(fs->part,loc->Sector,IOM_MODE_READWRITE); + (((FileRecord*)buf)+loc->Offset)->FileSize=numbytes; + part_relSect(fs->part,buf); +} +/*****************************************************************************/ + +/* **************************************************************************** + * esint8 dir_updateDirectoryEntry(FileSystem *fs,FileRecord *entry,FileLocation *loc)) + * This function changes the entire entity stores at loc to the data recorded + * in entry. This is for custom updates to the directoryentry. + * Return value: 0 on success, -1 on failure +*/ +esint8 dir_updateDirectoryEntry(FileSystem *fs,FileRecord *entry,FileLocation *loc) +{ + euint8 *buf; + + buf = part_getSect(fs->part,loc->Sector,IOM_MODE_READWRITE); + memCpy(entry,buf+(loc->Offset*sizeof(*entry)),sizeof(*entry)); + part_relSect(fs->part,buf); + return(0); +} + +/* **************************************************************************** + * euint32 dir_findFileinBuf(euint8 *buf, eint8 *fatname, FileLocation *loc) + * This function searches for a given fatfilename in the buffer provided. + * It will iterate through the 16 direntry's in the buffer and searches + * for the fatfilename. If found, it will store the offset and attribute + * entry of the directoryrecord in the loc structure. + * If loc is 0, then it's members are not touched. + * Return value: This function returns 0 when it cannot find the file, + * if it can find the file it will return the first cluster number. +*/ +euint32 dir_findFileinBuf(euint8 *buf, eint8 *fatname, FileLocation *loc) +{ + FileRecord fileEntry; + euint8 c; + + for(c=0; c<16; c++) + { + fileEntry = *(((FileRecord*)buf) + c); + /* Check if the entry is for short filenames */ + if( !( (fileEntry.Attribute & 0x0F) == 0x0F ) ) + { + if( strMatch((eint8*)fileEntry.FileName,fatname,11) == 0 ) + { + /* The entry has been found, return the location in the dir */ + if(loc)loc->Offset = c; + if(loc)loc->attrib = fileEntry.Attribute; + if((((euint32 )fileEntry.FirstClusterHigh)<<16)+ fileEntry.FirstClusterLow==0){ + return(1); /* Lie about cluster, 0 means not found! */ + }else{ + return + ( + (((euint32 )fileEntry.FirstClusterHigh)<<16) + + fileEntry.FirstClusterLow + ); + } + } + } + } + return(0); +} + +/* **************************************************************************** + * euint32 dir_findFreeEntryinBuf(euint8* buf, FileLocation *loc) + * This function searches for a free entry in a given sector 'buf'. + * It will put the offset into the loc->Offset field, given that loc is not 0. + * Return value: 1 when it found a free spot, 0 if it hasn't. +*/ +euint32 dir_findFreeEntryinBuf(euint8* buf, FileLocation *loc) +{ + FileRecord fileEntry; + euint8 c; + + for(c=0;c<16;c++){ + fileEntry = *(((FileRecord*)buf) + c); + if( !( (fileEntry.Attribute & 0x0F) == 0x0F ) ){ + if(fileEntry.FileName[0] == 0x00 || + fileEntry.FileName[0] == 0xE5 ){ + if(loc)loc->Offset=c; + return(1); + } + } + } + return(0); +} + +/* **************************************************************************** + * euint32 dir_findinBuf(euint8 *buf, eint8 *fatname, FileLocation *loc) + * Description: This function searches for a given fatfilename in a buffer. + * Return value: Returns 0 on not found, and the firstcluster when the name is found. +*/ +euint32 dir_findinBuf(euint8 *buf, eint8 *fatname, FileLocation *loc, euint8 mode) +{ + switch(mode){ + case DIRFIND_FILE: + return(dir_findFileinBuf(buf,fatname,loc)); + break; + case DIRFIND_FREE: + return(dir_findFreeEntryinBuf(buf,loc)); + break; + default: + return(0); + break; + } + return(0); +} +/*****************************************************************************/ + +/* **************************************************************************** + * euint32 dir_findinCluster(FileSystem *fs,euint32 cluster,eint8 *fatname, FileLocation *loc, euint8 mode) + * This function will search for an existing (fatname) or free directory entry + * in a full cluster. + * Return value: 0 on failure, firstcluster on finding file, and 1 on finding free spot. +*/ +euint32 dir_findinCluster(FileSystem *fs,euint32 cluster,eint8 *fatname, FileLocation *loc, euint8 mode) +{ + euint8 c,*buf=0; + euint32 fclus; + + for(c=0;cvolumeId.SectorsPerCluster;c++){ + buf = part_getSect(fs->part,fs_clusterToSector(fs,cluster)+c,IOM_MODE_READONLY); + if((fclus=dir_findinBuf(buf,fatname,loc,mode))){ + if(loc)loc->Sector=fs_clusterToSector(fs,cluster)+c; + part_relSect(fs->part,buf); + return(fclus); + } + part_relSect(fs->part,buf); /* Thanks Mike ;) */ + } + return(0); +} + +/* **************************************************************************** + * euint32 dir_findinDir(FileSystem *fs, eint8* fatname,euint32 firstcluster, FileLocation *loc, euint8 mode) + * This function will search for an existing (fatname) or free directory entry + * in a directory, following the clusterchains. + * Return value: 0 on failure, firstcluster on finding file, and 1 on finding free spot. +*/ +euint32 dir_findinDir(FileSystem *fs, eint8* fatname,euint32 firstcluster, FileLocation *loc, euint8 mode) +{ + euint32 c=0,cluster; + ClusterChain Cache; + + Cache.DiscCluster = Cache.FirstCluster = firstcluster; + Cache.LogicCluster = Cache.LastCluster = Cache.Linear = 0; + + if(firstcluster <= 1){ + return(dir_findinRootArea(fs,fatname,loc,mode)); + } + + while(!fat_LogicToDiscCluster(fs,&Cache,c++)){ + if((cluster=dir_findinCluster(fs,Cache.DiscCluster,fatname,loc,mode))){ + return(cluster); + } + } + return(0); +} + +/* **************************************************************************** + * euint32 dir_findinDir(FileSystem *fs, eint8* fatname,euint32 firstcluster, FileLocation *loc, euint8 mode) + * This function will search for an existing (fatname) or free directory entry + * in the rootdirectory-area of a FAT12/FAT16 filesystem. + * Return value: 0 on failure, firstcluster on finding file, and 1 on finding free spot. +*/ +euint32 dir_findinRootArea(FileSystem *fs,eint8* fatname, FileLocation *loc, euint8 mode) +{ + euint32 c,fclus; + euint8 *buf=0; + + if((fs->type != FAT12) && (fs->type != FAT16))return(0); + +#warning "inofficial find in root patch included" +/* for(c=fs->FirstSectorRootDir;c<(fs->FirstSectorRootDir+fs->volumeId.RootEntryCount/32);c++){*/ + for(c=fs->FirstSectorRootDir;c<(fs->FirstSectorRootDir+fs->volumeId.RootEntryCount/16);c++) { + buf = part_getSect(fs->part,c,IOM_MODE_READONLY); + if((fclus=dir_findinBuf(buf,fatname,loc,mode))){ + if(loc)loc->Sector=c; + part_relSect(fs->part,buf); + return(fclus); + } + part_relSect(fs->part,buf); + } + part_relSect(fs->part,buf); + return(0); +} + +/* **************************************************************************** + * esint8 dir_getFatFileName(eint8* filename, eint8* fatfilename) + * This function will take a full directory path, and strip off all leading + * dirs and characters, leaving you with the MS-DOS notation of the actual filename. + * Return value: 1 on success, 0 on not being able to produca a filename +*/ +esint8 dir_getFatFileName(eint8* filename, eint8* fatfilename) +{ + eint8 ffnamec[11],*next,nn=0; + + memClr(ffnamec,11); memClr(fatfilename,11); + next = filename; + + if(*filename=='/')next++; + + while((next=file_normalToFatName(next,ffnamec))){ + memCpy(ffnamec,fatfilename,11); + nn++; + } + if(nn)return(1); + return(0); +} + +/* **************************************************************************** + * esint8 dir_addCluster(FileSystem *fs,euint32 firstCluster) + * This function extends a directory by 1 cluster + optional the number of + * clusters you want pre-allocated. It will also delete the contents of that + * cluster. (or clusters) + * Return value: 0 on success, -1 on fail +*/ +esint8 dir_addCluster(FileSystem *fs,euint32 firstCluster) +{ + euint32 lastc,logicalc; + ClusterChain cache; + + fs_initClusterChain(fs,&cache,firstCluster); + if(fat_allocClusterChain(fs,&cache,1)){ + return(-1); + } + lastc = fs_getLastCluster(fs,&cache); + if(CLUSTER_PREALLOC_DIRECTORY){ + if(fat_allocClusterChain(fs,&cache,CLUSTER_PREALLOC_DIRECTORY)){ + return(-1); + } + logicalc = fat_DiscToLogicCluster(fs,firstCluster,lastc); + while(!fat_LogicToDiscCluster(fs,&cache,++logicalc)){ + fs_clearCluster(fs,cache.DiscCluster); + } + }else{ + fs_clearCluster(fs,lastc); + } + return(0); +} + + diff --git a/poc/lpc2148_efsl/src/disc.c b/poc/lpc2148_efsl/src/disc.c new file mode 100644 index 0000000..8657f0b --- /dev/null +++ b/poc/lpc2148_efsl/src/disc.c @@ -0,0 +1,68 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : disc.c * +* Description : This file contains the functions regarding the whole disc * +* such as loading the MBR and performing read/write tests. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "disc.h" +/*****************************************************************************/ + +/* **************************************************************************** + * void disc_initDisc(Disc *disc,hcInterface* source) + * Description: This initialises the disc by loading the MBR and setting the + * pointer to the hardware object. +*/ +void disc_initDisc(Disc *disc,IOManager* ioman) +{ + disc->ioman=ioman; + disc_setError(disc,DISC_NOERROR); + disc_loadMBR(disc); +} +/*****************************************************************************/ + +/* **************************************************************************** + * void disc_loadMBR(Disc *disc) + * Description: This functions copies the partitiontable to the partitions field. +*/ +void disc_loadMBR(Disc *disc) +{ + euint8 x; + euint8 *buf; + + buf=ioman_getSector(disc->ioman,LBA_ADDR_MBR,IOM_MODE_READONLY|IOM_MODE_EXP_REQ); + for(x=0;x<4;x++){ + ex_getPartitionField(buf,&(disc->partitions[x]),PARTITION_TABLE_OFFSET+(x*SIZE_PARTITION_FIELD)); + } + ioman_releaseSector(disc->ioman,buf); +} +/*****************************************************************************/ + + diff --git a/poc/lpc2148_efsl/src/efs.c b/poc/lpc2148_efsl/src/efs.c new file mode 100644 index 0000000..f67eef9 --- /dev/null +++ b/poc/lpc2148_efsl/src/efs.c @@ -0,0 +1,68 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : efs.h * +* Description : This should become the wrapper around efs. It will contain * +* functions like efs_init etc. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "efs.h" +/*****************************************************************************/ + +/* **************************************************************************** + * esint8 efs_init(EmbeddedFileSystem * efs,eint8* opts) + * Description: This function initialises all subelements of a filesystem. + * It sets the pointerchain and verifies each step. + * Return value: 0 on success and -1 on failure. +*/ +esint8 efs_init(EmbeddedFileSystem * efs,eint8* opts) +{ + if(if_initInterface(&efs->myCard, opts)==0) + { + ioman_init(&efs->myIOman,&efs->myCard,0); + disc_initDisc(&efs->myDisc, &efs->myIOman); + part_initPartition(&efs->myPart, &efs->myDisc); + if(efs->myPart.activePartition==-1){ + efs->myDisc.partitions[0].type=0x0B; + efs->myDisc.partitions[0].LBA_begin=0; + efs->myDisc.partitions[0].numSectors=efs->myCard.sectorCount; + /*efs->myPart.activePartition = 0;*/ + /*efs->myPart.disc = &(efs->myDisc);*/ + part_initPartition(&efs->myPart, &efs->myDisc); + } + /*part_initPartition(&efs->myPart, &efs->myDisc);*/ + if(fs_initFs(&efs->myFs, &efs->myPart)) + return(-2); + return(0); + } + return(-1); +} +/*****************************************************************************/ + + diff --git a/poc/lpc2148_efsl/src/extract.c b/poc/lpc2148_efsl/src/extract.c new file mode 100644 index 0000000..314aff5 --- /dev/null +++ b/poc/lpc2148_efsl/src/extract.c @@ -0,0 +1,191 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : extract.c * +* Description : This file contains functions to copy structures that get * +* corrupted when using direct memory copy * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "extract.h" +/*****************************************************************************/ + +/*****************************************************************************/ +#ifdef BYTE_ALIGNMENT +/*****************************************************************************/ + +euint16 ex_getb16(euint8* buf,euint32 offset) +{ + return(ltb_end16(*((euint16*)(buf+offset)))); +} +/*****************************************************************************/ + +euint32 ex_getb32(euint8* buf,euint32 offset) +{ + return(ltb_end32(*((euint32*)(buf+offset)))); +} +/*****************************************************************************/ + +void ex_setb16(euint8* buf,euint32 offset,euint16 data) +{ + *((euint16*)(buf+offset)) = btl_end16(data); +} +/*****************************************************************************/ + +void ex_setb32(euint8* buf,euint32 offset,euint32 data) +{ + *((euint32*)(buf+offset)) = btl_end32(data); +} +/*****************************************************************************/ + +void ex_getPartitionField(euint8* buf,PartitionField* pf, euint32 offset) +{ + *pf=*((PartitionField*)(buf+offset)); +} +/*****************************************************************************/ + +void ex_setPartitionField(euint8* buf,PartitionField* pf, euint32 offset) +{ + +} +/*****************************************************************************/ + + + + +/*****************************************************************************/ +/*****************************************************************************/ +#else +/*****************************************************************************/ +/*****************************************************************************/ + +#if 0 + +euint16 ex_getb16(euint8* buf,euint32 offset) +{ + return(ltb_end16(((*(buf+offset+1))<<8) + ((*(buf+offset+0))<<0))); +} + +euint32 ex_getb32(euint8* buf,euint32 offset) +{ + return(ltb_end32(((euint32)buf[offset+3]<<24)+ + ((euint32)buf[offset+2]<<16)+ + ((euint32)buf[offset+1]<<8)+ + ((euint32)buf[offset+0]<<0))); +} + +#else +#warning "mthomas - modification enabled" + +euint32 ex_getb32(euint8* buf,euint32 offset) +{ +#ifdef BIG_ENDIAN + return ((euint32)*(euint8*)(buf+offset)<<24UL) | + ((euint32)*(euint8*)(buf+offset+1)<<16UL) | + ((euint16)*(euint8*)(buf+offset+2)<<8UL) | + (*(euint8*)(buf+offset+3)) ; +#else + return ((euint32)*(euint8*)(buf+offset+3)<<24UL) | + ((euint32)*(euint8*)(buf+offset+2)<<16UL) | + ((euint16)*(euint8*)(buf+offset+1)<<8UL) | + (*(euint8*)(buf+offset)) ; +#endif +} + +euint16 ex_getb16(euint8* buf,euint32 offset) +{ +#ifdef BIG_ENDIAN + return ((euint16)*(euint8*)(buf+offset)<<8UL) | + (*(euint8*)(buf+offset+1)) ; +#else + return ((euint16)*(euint8*)(buf+offset+1)<<8UL) | + (*(euint8*)(buf+offset)) ; +#endif +} + +#endif +/* end mod mthomas */ + + +/*****************************************************************************/ + +void ex_setb16(euint8* buf,euint32 offset,euint16 data) +{ +#ifdef BIG_ENDIAN + *(buf+offset+1) = data>>0; + *(buf+offset+0) = data>>8; +#else + *(buf+offset+0) = data>>0; + *(buf+offset+1) = data>>8; +#endif +} +/*****************************************************************************/ + +void ex_setb32(euint8* buf,euint32 offset,euint32 data) +{ +#ifdef BIG_ENDIAN + *(buf+offset+3) = data>> 0; + *(buf+offset+2) = data>> 8; + *(buf+offset+1) = data>>16; + *(buf+offset+0) = data>>24; +#else + *(buf+offset+0) = data>> 0; + *(buf+offset+1) = data>> 8; + *(buf+offset+2) = data>>16; + *(buf+offset+3) = data>>24; +#endif +} +/*****************************************************************************/ + +void ex_getPartitionField(euint8* buf,PartitionField* pf, euint32 offset) +{ + pf->bootFlag = *(buf + offset); + pf->CHS_begin[0] = *(buf + offset + 1); + pf->CHS_begin[1] = *(buf + offset + 2); + pf->CHS_begin[2] = *(buf + offset + 3); + pf->type = *(buf + offset + 4); + pf->CHS_end[0] = *(buf + offset + 5); + pf->CHS_end[1] = *(buf + offset + 6); + pf->CHS_end[2] = *(buf + offset + 7); + pf->LBA_begin = ex_getb32(buf + offset,8); + pf->numSectors = ex_getb32(buf + offset,12); +} +/*****************************************************************************/ + +void ex_setPartitionField(euint8* buf,PartitionField* pf, euint32 offset) +{ + +} +/*****************************************************************************/ + + + +/*****************************************************************************/ +#endif +/*****************************************************************************/ + diff --git a/poc/lpc2148_efsl/src/fat.c b/poc/lpc2148_efsl/src/fat.c new file mode 100644 index 0000000..248223c --- /dev/null +++ b/poc/lpc2148_efsl/src/fat.c @@ -0,0 +1,607 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : fat.c * +* Description : This file contains all the functions dealing with the FAT * +* in a Microsoft FAT filesystem. It belongs under fs.c * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +* * +* mthomas: testing aligments * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "fs.h" +#include "fat.h" +/*****************************************************************************/ + + +#define MT_MOD +#ifdef MT_MOD +#warning "mthomas alignment tests" +#endif + +/* **************************************************************************** + * unsigned long fat_getSectorAddressFatEntry(FileSystem *fs,unsigned long cluster_addr) + * Description: Returns the sectornumber that holds the fat entry for cluster cluster_addr. + * This works for all FAT types. + * Return value: Sectornumber, or 0. Warning, no boundary check. +*/ +euint32 fat_getSectorAddressFatEntry(FileSystem *fs,euint32 cluster_addr) +{ + euint32 base = fs->volumeId.ReservedSectorCount,res; + + switch(fs->type){ + case FAT12: + res=(cluster_addr*3/1024); + if(res>=fs->FatSectorCount){ + return(0); + }else{ + return(base+res); + } + break; + case FAT16: + res=cluster_addr/256; + if(res>=fs->FatSectorCount){ + return(0); + }else{ + return(base+res); + } + break; + case FAT32: + res=cluster_addr/128; + if(res>=fs->FatSectorCount){ + return(0); + }else{ + return(base+res); + } + break; + } + return(0); +} +/*****************************************************************************/ + + +/* **************************************************************************** + * unsigned long fat_getNextClusterAddress(FileSystem *fs,unsigned long cluster_addr + * Description: This function loads the sector of the fat which contains the entry + * for cluster_addr. It then fetches and (if required) calculates it's value. + * This value is the EoC marker -or- the number of the next cluster in the chain. + * Return value: Clusternumber or EoC +*/ +euint32 fat_getNextClusterAddress(FileSystem *fs,euint32 cluster_addr,euint16 *linear) +{ + euint8 *buf; + euint8 hb,lb; + euint16 offset; + euint32 sector; + euint32 nextcluster=0; + + sector=fat_getSectorAddressFatEntry(fs,cluster_addr); + if( (fs->FatSectorCount <= (sector-fs->volumeId.ReservedSectorCount)) || sector==0 ) + { + return(0); + } + + buf=part_getSect(fs->part,sector,IOM_MODE_READONLY); + + switch(fs->type) + { + case FAT12: + offset = ((cluster_addr%1024)*3/2)%512; + hb = buf[offset]; + if(offset == 511){ + part_relSect(fs->part,buf); + buf=part_getSect(fs->part,sector+1,IOM_MODE_READONLY); + lb = buf[0]; + }else{ + lb = buf[offset + 1]; + } + if(cluster_addr%2==0){ + nextcluster = ( ((lb&0x0F)<<8) + (hb) ); + }else{ + nextcluster = ( (lb<<4) + (hb>>4) ); + } + break; + case FAT16: + offset=cluster_addr%256; +#ifndef MT_MOD + nextcluster = *((euint16 *)buf + offset); +#else + nextcluster = ex_getb16( buf, offset*sizeof(euint16) ); +#endif + break; + case FAT32: + offset=cluster_addr%128; +#ifndef MT_MOD + nextcluster = *((euint32 *)buf + offset); +#else + nextcluster = ex_getb32( buf, offset*sizeof(euint32) ); +#endif + break; + } + + part_relSect(fs->part,buf); + + return(nextcluster); +} +/*****************************************************************************/ + + +/* **************************************************************************** + * void fat_setNextClusterAddress(FileSystem *fs,unsigned long cluster_addr,unsigned long next_cluster_addr) + * Description: This function makes an entry in the fattable for cluster_addr. The value it puts there + * is next_cluster_addr. +*/ +void fat_setNextClusterAddress(FileSystem *fs,euint32 cluster_addr,euint32 next_cluster_addr) +{ + euint8 *buf,*buf2; + euint16 offset; + euint32 sector; + + sector=fat_getSectorAddressFatEntry(fs,cluster_addr); + if(( fs->FatSectorCount <= (sector - fs->volumeId.ReservedSectorCount )||(sector==0))){ + DBG((TXT("HARDERROR:::fat_getNextClusterAddress READ PAST FAT BOUNDARY\n"))); + return; + } + + buf=part_getSect(fs->part,sector,IOM_MODE_READWRITE); + + switch(fs->type){ + case FAT12: + offset = ((cluster_addr%1024)*3/2)%512; + if(offset == 511){ + if(cluster_addr%2==0){ + buf[offset]=next_cluster_addr&0xFF; + }else{ + buf[offset]=(buf[offset]&0xF)+((next_cluster_addr<<4)&0xF0); + } + buf2=part_getSect(fs->part,fat_getSectorAddressFatEntry(fs,cluster_addr)+1,IOM_MODE_READWRITE); + if(cluster_addr%2==0){ + buf2[0]=(buf2[0]&0xF0)+((next_cluster_addr>>8)&0xF); + }else{ + buf2[0]=(next_cluster_addr>>4)&0xFF; + } + part_relSect(fs->part,buf2); + }else{ + if(cluster_addr%2==0){ + buf[offset]=next_cluster_addr&0xFF; + buf[offset+1]=(buf[offset+1]&0xF0)+((next_cluster_addr>>8)&0xF); + }else{ + buf[offset]=(buf[offset]&0xF)+((next_cluster_addr<<4)&0xF0); + buf[offset+1]=(next_cluster_addr>>4)&0xFF; + } + } + part_relSect(fs->part,buf); + break; + case FAT16: + offset=cluster_addr%256; +#ifndef MT_MOD + *((euint16*)buf+offset)=next_cluster_addr; +#else + ex_setb16( buf, offset*sizeof(euint16), next_cluster_addr ); +#endif + part_relSect(fs->part,buf); + break; + case FAT32: + offset=cluster_addr%128; +#ifndef MT_MOD + *((euint32*)buf+offset)=next_cluster_addr; +#else + ex_setb32( buf, offset*sizeof(euint32), next_cluster_addr ); +#endif + part_relSect(fs->part,buf); + break; + } + +} +/*****************************************************************************/ + + +/* **************************************************************************** + * short fat_isEocMarker(FileSystem *fs,unsigned long fat_entry) + * Description: Checks if a certain value is the EoC marker for the filesystem + * noted in fs->type. + * Return value: Returns 0 when it is the EoC marker, and 1 otherwise. +*/ +eint16 fat_isEocMarker(FileSystem *fs,euint32 fat_entry) +{ + switch(fs->type){ + case FAT12: + if(fat_entry<0xFF8){ + return(0); + } + break; + case FAT16: + if(fat_entry<0xFFF8){ + return(0); + } + break; + case FAT32: + if((fat_entry&0x0FFFFFFF)<0xFFFFFF8){ + return(0); + } + break; + } + return(1); +} +/*****************************************************************************/ + + +/* **************************************************************************** + * unsigned long fat_giveEocMarker(FileSystem *fs) + * Description: Returns an EoC markernumber valid for the filesystem noted in + * fs->type. + * Note, for FAT32, the upper 4 bits are set to zero, although they should be un + * touched according to MicroSoft specifications. I didn't care. + * Return value: The EoC marker cast to an ulong. +*/ +euint32 fat_giveEocMarker(FileSystem *fs) +{ + switch(fs->type) + { + case FAT12: + return(0xFFF); + break; + case FAT16: + return(0xFFFF); + break; + case FAT32: + return(0x0FFFFFFF); + break; + } + return(0); +} +/*****************************************************************************/ + +/* **************************************************************************** + * euint32 fat_getNextClusterAddressWBuf(FileSystem *fs,euint32 cluster_addr, euint8* buf) + * Description: This function retrieves the contents of a FAT field. It does not fetch + * it's own buffer, it is given as a parameter. (ioman makes this function rather obsolete) + * Only in the case of a FAT12 crosssector data entry a sector is retrieved here. + * Return value: The value of the clusterfield is returned. +*/ +euint32 fat_getNextClusterAddressWBuf(FileSystem *fs,euint32 cluster_addr, euint8* buf) +{ + euint8 *buf2; /* For FAT12 fallover only */ + euint8 hb,lb; + euint16 offset; + euint32 nextcluster=0; + + switch(fs->type) + { + case FAT12: + offset = ((cluster_addr%1024)*3/2)%512; + hb = buf[offset]; + if(offset == 511){ + buf2=part_getSect(fs->part,fat_getSectorAddressFatEntry(fs,cluster_addr)+1,IOM_MODE_READONLY); + lb = buf2[0]; + part_relSect(fs->part,buf2); + }else{ + lb = buf[offset + 1]; + } + if(cluster_addr%2==0){ + nextcluster = ( ((lb&0x0F)<<8) + (hb) ); + }else{ + nextcluster = ( (lb<<4) + (hb>>4) ); + } + break; + case FAT16: + offset=cluster_addr%256; +#ifndef MT_MOD + nextcluster = *((euint16*)buf + offset); +#else + nextcluster = ex_getb16( buf, offset*sizeof(euint16) ); +#endif + break; + case FAT32: + offset=cluster_addr%128; +#ifndef MT_MOD + nextcluster = *((euint32*)buf + offset); +#else + nextcluster = ex_getb32( buf, offset*sizeof(euint32) ); +#endif + break; + } + return(nextcluster); +} +/*****************************************************************************/ + +/* **************************************************************************** + * void fat_setNextClusterAddressWBuf(FileSystem *fs,euint32 cluster_addr,euint32 next_cluster_addr,euint8* buf) + * Description: This function fills in a fat entry. The entry is cluster_addr and the + * data entered is next_cluster_addr. This function is also given a *buf, so it does + * not write the data itself, except in the case of FAT 12 cross sector data, where + * the second sector is handled by this function. + * Return value: +*/ +void fat_setNextClusterAddressWBuf(FileSystem *fs,euint32 cluster_addr,euint32 next_cluster_addr,euint8* buf) +{ + euint16 offset; + euint8 *buf2; + + switch(fs->type) + { + case FAT12: + offset = ((cluster_addr%1024)*3/2)%512; + if(offset == 511){ + if(cluster_addr%2==0){ + buf[offset]=next_cluster_addr&0xFF; + }else{ + buf[offset]=(buf[offset]&0xF)+((next_cluster_addr<<4)&0xF0); + } + buf2=part_getSect(fs->part,fat_getSectorAddressFatEntry(fs,cluster_addr)+1,IOM_MODE_READWRITE); + if(cluster_addr%2==0){ + buf2[0]=(buf2[0]&0xF0)+((next_cluster_addr>>8)&0xF); + }else{ + buf2[0]=(next_cluster_addr>>4)&0xFF; + } + part_relSect(fs->part,buf2); + }else{ + if(cluster_addr%2==0){ + buf[offset]=next_cluster_addr&0xFF; + buf[offset+1]=(buf[offset+1]&0xF0)+((next_cluster_addr>>8)&0xF); + }else{ + buf[offset]=(buf[offset]&0xF)+((next_cluster_addr<<4)&0xF0); + buf[offset+1]=(next_cluster_addr>>4)&0xFF; + } + } + break; + case FAT16: + offset=cluster_addr%256; +#ifndef MT_MOD + *((euint16*)buf+offset)=next_cluster_addr; +#else + ex_setb16( buf, offset*sizeof(euint16), next_cluster_addr ); +#endif + break; + case FAT32: + offset=cluster_addr%128; +#ifndef MT_MOD + *((euint32*)buf+offset)=next_cluster_addr; +#else + ex_setb32( buf, offset*sizeof(euint32), next_cluster_addr ); +#endif + break; + } +} +/*****************************************************************************/ + +/* **************************************************************************** + * esint16 fat_getNextClusterChain(FileSystem *fs, ClusterChain *Cache) + * Description: This function is to advance the clusterchain of a Cache. + * First, the function verifies if the Cache is valid. It could correct it if it + * is not, but this is not done at the time. If the cachen is valid, the next step is + * to see what the next cluster is, if this is the End of Clustermark, the cache is + * updated to know the lastcluster but will remain untouched otherwise. -1 is returned. + * If there are more clusters the function scans the rest of the chain until the next + * cluster is no longer lineair, or until it has run out of fat data (only 1 sector) is + * examined, namely the one fetched to check for EoC. + * With lineair is meant that logical cluster n+1 should be 1 more than logical cluster n + * at the disc level. + * Return value: 0 on success, or -1 when EoC. +*/ +esint16 fat_getNextClusterChain(FileSystem *fs, ClusterChain *Cache) +{ + euint32 sect,lr,nlr,dc; + esint16 lin=0; + euint8 *buf; + + if(Cache->DiscCluster==0) + { + return(-1); + } + + sect=fat_getSectorAddressFatEntry(fs,Cache->DiscCluster); + buf=part_getSect(fs->part,sect,IOM_MODE_READONLY); + dc=fat_getNextClusterAddressWBuf(fs,Cache->DiscCluster,buf); + if(fat_isEocMarker(fs,dc)) + { + Cache->LastCluster=Cache->DiscCluster; + part_relSect(fs->part,buf); + return(-1); + } + + Cache->DiscCluster=dc; + Cache->LogicCluster++; + + lr=Cache->DiscCluster-1; + nlr=lr+1; + + while(nlr-1==lr && fat_getSectorAddressFatEntry(fs,nlr)==sect) + { + lr=nlr; + nlr=fat_getNextClusterAddressWBuf(fs,lr,buf); + lin++; + } + + Cache->Linear=lin-1<0?0:lin-1; + + part_relSect(fs->part,buf); + return(0); +} +/*****************************************************************************/ + + +/* **************************************************************************** + * esint16 fat_LogicToDiscCluster(FileSystem *fs, ClusterChain *Cache,euint32 logiccluster) + * Description: This function is used to follow clusterchains. When called it will convert + * a logical cluster, to a disc cluster, using a Cache object. All it does is call + * getNextClusterChain in the proper manner, and rewind clusterchains if required. + * It is NOT recommended to go backwards in clusterchains, since this will require + * scanning the entire chain every time. + * Return value: 0 on success and -1 on failure (meaning out of bounds). +*/ +esint16 fat_LogicToDiscCluster(FileSystem *fs, ClusterChain *Cache,euint32 logiccluster) +{ + if(logicclusterLogicCluster || Cache->DiscCluster==0){ + Cache->LogicCluster=0; + Cache->DiscCluster=Cache->FirstCluster; + Cache->Linear=0; + } + + if(Cache->LogicCluster==logiccluster){ + return(0); + } + + while(Cache->LogicCluster!=logiccluster) + { + if(Cache->Linear!=0) + { + Cache->Linear--; + Cache->LogicCluster++; + Cache->DiscCluster++; + } + else + { + if((fat_getNextClusterChain(fs,Cache))!=0){ + return(-1); + } + } + } + return(0); +} +/*****************************************************************************/ + +/* **************************************************************************** + * eint16 fat_allocClusterChain(FileSystem *fs,ClusterChain *Cache,euint32 num_clusters) + * Description: This function extends a clusterchain by num_clusters. It returns the + * number of clusters it *failed* to allocate. + * Return value: 0 on success, all other values are the number of clusters it could + * not allocate. +*/ +eint16 fat_allocClusterChain(FileSystem *fs,ClusterChain *Cache,euint32 num_clusters) +{ + euint32 cc,ncl=num_clusters,lc; + euint8 *bufa=0,*bufb=0; + euint8 overflow=0; + + if(Cache->FirstCluster<=1)return(num_clusters); + + lc=fs_getLastCluster(fs,Cache); + cc=lc; + + while(ncl > 0){ + cc++; + if(cc>=fs->DataClusterCount+1){ + if(overflow){ + bufa=part_getSect(fs->part,fat_getSectorAddressFatEntry(fs,lc),IOM_MODE_READWRITE); + fat_setNextClusterAddressWBuf(fs,lc,fat_giveEocMarker(fs),bufa); + Cache->LastCluster=lc; + part_relSect(fs->part,bufa); + fs->FreeClusterCount-=num_clusters-ncl; + return(num_clusters-ncl); + } + cc=2; + overflow++; + } + bufa=part_getSect(fs->part,fat_getSectorAddressFatEntry(fs,cc),IOM_MODE_READONLY); + if(fat_getNextClusterAddressWBuf(fs,cc,bufa)==0){ + bufb=part_getSect(fs->part,fat_getSectorAddressFatEntry(fs,lc),IOM_MODE_READWRITE); + fat_setNextClusterAddressWBuf(fs,lc,cc,bufb); + part_relSect(fs->part,bufb); + ncl--; + lc=cc; + } + part_relSect(fs->part,bufa); + if(ncl==0){ + bufa=part_getSect(fs->part,fat_getSectorAddressFatEntry(fs,lc),IOM_MODE_READWRITE); + fat_setNextClusterAddressWBuf(fs,lc,fat_giveEocMarker(fs),bufa); + Cache->LastCluster=lc; + part_relSect(fs->part,bufa); + } + } + if(Cache->ClusterCount)Cache->ClusterCount+=num_clusters; + return(0); +} + +/* **************************************************************************** + * eint16 fat_unlinkClusterChain(FileSystem *fs,ClusterChain *Cache) + * Description: This function removes a clusterchain. Starting at FirstCluster + * it follows the chain until the end, resetting all values to 0. + * Return value: 0 on success. +*/ +eint16 fat_unlinkClusterChain(FileSystem *fs,ClusterChain *Cache) +{ + euint32 c,tbd=0; + + Cache->LogicCluster=0; + Cache->DiscCluster=Cache->FirstCluster; + + c=0; + + while(!fat_LogicToDiscCluster(fs,Cache,c++)){ + if(tbd!=0){ + fat_setNextClusterAddress(fs,tbd,0); + } + tbd=Cache->DiscCluster; + } + fat_setNextClusterAddress(fs,Cache->DiscCluster,0); + fs->FreeClusterCount+=c; + return(0); +} + +euint32 fat_countClustersInChain(FileSystem *fs,euint32 firstcluster) +{ + ClusterChain cache; + euint32 c=0; + + if(firstcluster<=1)return(0); + + cache.DiscCluster = cache.LogicCluster = cache.LastCluster = cache.Linear = 0; + cache.FirstCluster = firstcluster; + + while(!(fat_LogicToDiscCluster(fs,&cache,c++))); + + return(c-1); +} + +euint32 fat_DiscToLogicCluster(FileSystem *fs,euint32 firstcluster,euint32 disccluster) +{ + ClusterChain cache; + euint32 c=0,r=0; + + cache.DiscCluster = cache.LogicCluster = cache.LastCluster = cache.Linear = 0; + cache.FirstCluster = firstcluster; + + while(!(fat_LogicToDiscCluster(fs,&cache,c++)) && !r){ + if(cache.DiscCluster == disccluster){ + r = cache.LogicCluster; + } + } + return(r); +} + +euint32 fat_countFreeClusters(FileSystem *fs) +{ + euint32 c=2,fc=0; + + while(c<=fs->DataClusterCount+1){ + if(fat_getNextClusterAddress(fs,c,0)==0)fc++; + c++; + } + return(fc); +} diff --git a/poc/lpc2148_efsl/src/file.c b/poc/lpc2148_efsl/src/file.c new file mode 100644 index 0000000..0d8db67 --- /dev/null +++ b/poc/lpc2148_efsl/src/file.c @@ -0,0 +1,510 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : file.c * +* Description : This file contains functions dealing with files such as: * +* fopen, fread and fwrite. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +* Revisions by Mike Anton: * +* 26. May 2006 - Fixed a bug in file_initFile() that left the ClusterCount * +* value uninitialized. * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "file.h" +/*****************************************************************************/ + +/* **************************************************************************** + * euint32 file_fread(File *file,euint32 offset, euint32 size,euint8 *buf) + * Description: This function reads 'size' bytes from 'file' starting at + * 'offset' and puts the result in '*buf'. + * Return value: amount of bytes actually read (can differ from the given + * size when the file was smaller +*/ +euint32 file_fread(File *file,euint32 offset, euint32 size,euint8 *buf) +{ + euint32 bytes_read=0,size_left=size,coffset=offset; + euint32 cclus,csec,cbyte; + euint32 rclus,rsec; + euint32 btr; + euint8 *tbuf; + + if(!file_getAttr(file,FILE_STATUS_OPEN))return(0); + + if(offset>=file->FileSize) + size_left=0; /* Offset check */ + + if( (offset+size > file->FileSize) && size_left!=0) + size_left=file->FileSize-offset; + + while(size_left>0){ + + cclus = coffset/(512*file->fs->volumeId.SectorsPerCluster); + csec = (coffset/(512))%file->fs->volumeId.SectorsPerCluster; + cbyte = coffset%512; + + if(cbyte!=0 || size_left<512){ + btr = 512-(coffset%512)>=size_left?size_left:512-(coffset%512); + }else{ + btr = 512; + } + + if((fat_LogicToDiscCluster(file->fs,&(file->Cache),cclus))!=0){ + return(0); + } + rclus=file->Cache.DiscCluster; + rsec=fs_clusterToSector(file->fs,rclus); + + + if(btr==512){ + /*part_readBuf(file->fs->part,rsec+csec,buf+bytes_read);*/ + part_directSectorRead(file->fs->part,rsec+csec,buf+bytes_read); + }else{ + /*part_readBuf(file->fs->part,rsec+csec,tbuf);*/ + tbuf = part_getSect(file->fs->part,rsec+csec,IOM_MODE_READONLY); + memCpy(tbuf+(coffset%512),buf+bytes_read,btr); + part_relSect(file->fs->part,tbuf); + } + + coffset+=btr; + bytes_read+=btr; + size_left-=btr; + } + + return(bytes_read); +} +/*****************************************************************************/ + +/* **************************************************************************** + * euint32 file_read (File *file,euint32 size,euint8 *buf) + * Description: This function reads from a file, taking the FilePtr into account + * and advancing it according to the freadcall. + * Return value: Value obtained from fread +*/ +euint32 file_read(File *file,euint32 size,euint8 *buf) +{ + euint32 r; + + r=file_fread(file,file->FilePtr,size,buf); + file->FilePtr+=r; + return(r); +} +/*****************************************************************************/ + +/* **************************************************************************** + * euint32 file_write(File *file, euint32 size,euint8 *buf) + * Description: This function writes to a file, taking FilePtr into account + * and advancing it according to the fwritecall. + * Return value: Value obtained from fread +*/ +euint32 file_write(File *file, euint32 size,euint8 *buf) +{ + euint32 r; + + r=file_fwrite(file,file->FilePtr,size,buf); + file->FilePtr+=r; + return(r); +} +/*****************************************************************************/ + +/* **************************************************************************** + * esint16 file_setpos(File *file,euint32 pos) + * Description: This function does a sanity check on the requested position + * and changes the fileptr accordingly. + * Return value: 0 on success and -1 on failure. +*/ +esint16 file_setpos(File *file,euint32 pos) +{ + if(pos<=file->FileSize){ + file->FilePtr=pos; + return(0); + } + return(-1); +} +/*****************************************************************************/ + +/* **************************************************************************** + * euint32 file_fwrite(File* file,euint32 offset,euint32 size,euint8* buf) + * Description: This function writes to a file, at offset 'offset' and size 'size'. + * It also updates the FileSize in the object, and discstructure. + * Return value: Bytes actually written. +*/ +euint32 file_fwrite(File* file,euint32 offset,euint32 size,euint8* buf) +{ + euint32 need_cluster; + euint32 cclus,csec,cbyte; + euint32 size_left=size,bytes_written=0; + euint32 rclus,rsec; + euint32 coffset=offset; + euint16 btr; + euint8 *tbuf; + + if(!file_getAttr(file,FILE_STATUS_OPEN) || !file_getAttr(file,FILE_STATUS_WRITE))return(0); + + if(offset>file->FileSize){ + offset=file->FileSize; + } + + need_cluster = file_requiredCluster(file,offset,size); + + if(need_cluster){ + if(fat_allocClusterChain(file->fs,&(file->Cache),need_cluster+CLUSTER_PREALLOC_FILE)!=0){ + return(0); + } + } + + while(size_left>0){ + + cclus = coffset/(512*file->fs->volumeId.SectorsPerCluster); + csec = (coffset/(512))%file->fs->volumeId.SectorsPerCluster; + cbyte = coffset%512; + + if(cbyte!=0 || size_left<512){ + btr = 512-(coffset%512)>=size_left?size_left:512-(coffset%512); + }else{ + btr = 512; + } + + if((fat_LogicToDiscCluster(file->fs,&(file->Cache),cclus))!=0){ + file->FileSize+=bytes_written; + dir_setFileSize(file->fs,&(file->Location),file->FileSize); + return(bytes_written); + } + rclus=file->Cache.DiscCluster; + rsec=fs_clusterToSector(file->fs,rclus); + + if(btr==512){ + /*part_writeBuf(file->fs->part,rsec+csec,buf+bytes_written);*/ + part_directSectorWrite(file->fs->part,rsec+csec,buf+bytes_written); + }else{ + /*part_readBuf(file->fs->part,rsec+csec,tbuf);*/ + tbuf = part_getSect(file->fs->part,rsec+csec,IOM_MODE_READWRITE); + memCpy(buf+bytes_written,tbuf+(coffset%512),btr); + /*part_writeBuf(file->fs->part,rsec+csec,tbuf);*/ + part_relSect(file->fs->part,tbuf); + } + + coffset+=btr; + bytes_written+=btr; + size_left-=btr; + } + + if(bytes_written>file->FileSize-offset){ + file->FileSize+=bytes_written-(file->FileSize-offset); + } + + return(bytes_written); +} + +/* ***************************************************************************\ + * signed eint8 file_fopen(FileSystem *fs,File* file,eint8* filename) + * Description: This functions opens a file. + * This function is about to be redesigned. No Docs. + * Return value: +*/ +esint8 file_fopen(File* file,FileSystem *fs,eint8* filename,eint8 mode) +{ + FileLocation loc; + FileRecord wtmp; + eint8 fatfilename[11]; + euint32 sec; + + dir_getFatFileName(filename,fatfilename); + + switch(mode) + { + case MODE_READ: + if(fs_findFile(fs,filename,&loc,0)==1) + { + dir_getFileStructure(fs,&(file->DirEntry), &loc); + file_initFile(file,fs,&loc); + file_setAttr(file,FILE_STATUS_OPEN,1); + file_setAttr(file,FILE_STATUS_WRITE,0); + return(0); + } + return(-1); + break; + case MODE_WRITE: + if(fs_findFile(fs,filename,&loc,&sec)) /* File may NOT exist, but parent HAS to exist */ + { + return(-2); + } + if(sec==0){ /* Parent dir does not exist */ + return(-4); + } + if(fs_findFreeFile(fs,filename,&loc,0)) + { + dir_createDefaultEntry(fs,&wtmp,fatfilename); + dir_createDirectoryEntry(fs,&wtmp,&loc); + memCpy(&wtmp,&(file->DirEntry),sizeof(wtmp)); + file_initFile(file,fs,&loc); + sec=fs_getNextFreeCluster(file->fs,fs_giveFreeClusterHint(file->fs)); + dir_setFirstCluster(file->fs,&(file->Location),sec); + fs_setFirstClusterInDirEntry(&(file->DirEntry),sec); + fs_initClusterChain(fs,&(file->Cache),sec); + fat_setNextClusterAddress(fs,sec,fat_giveEocMarker(fs)); + file_setAttr(file,FILE_STATUS_OPEN,1); + file_setAttr(file,FILE_STATUS_WRITE,1); + return(0); + } + else + { + return(-3); + } + break; + case MODE_APPEND: + if(fs_findFile(fs,filename,&loc,0)==1) /* File exists */ + { + dir_getFileStructure(fs,&(file->DirEntry), &loc); + file_initFile(file,fs,&loc); + if(file->Cache.FirstCluster==0){ + sec=fs_getNextFreeCluster(file->fs,fs_giveFreeClusterHint(file->fs)); + dir_setFirstCluster(file->fs,&(file->Location),sec); + fs_setFirstClusterInDirEntry(&(file->DirEntry),sec); + fat_setNextClusterAddress(fs,sec,fat_giveEocMarker(fs)); + file_initFile(file,fs,&loc); + } + file_setpos(file,file->FileSize); + file_setAttr(file,FILE_STATUS_OPEN,1); + file_setAttr(file,FILE_STATUS_WRITE,1); + } + else /* File does not excist */ + { + if(fs_findFreeFile(fs,filename,&loc,0)) + { + dir_createDefaultEntry(fs,&wtmp,fatfilename); + dir_createDirectoryEntry(fs,&wtmp,&loc); + memCpy(&wtmp,&(file->DirEntry),sizeof(wtmp)); + file_initFile(file,fs,&loc); + sec=fs_getNextFreeCluster(file->fs,fs_giveFreeClusterHint(file->fs)); + dir_setFirstCluster(file->fs,&(file->Location),sec); + fs_setFirstClusterInDirEntry(&(file->DirEntry),sec); + fs_initClusterChain(fs,&(file->Cache),sec); + fat_setNextClusterAddress(fs,sec,fat_giveEocMarker(fs)); + file_setAttr(file,FILE_STATUS_OPEN,1); + file_setAttr(file,FILE_STATUS_WRITE,1); + } + else + { + return(-3); + } + } + return(0); + break; + default: + return(-4); + break; + } + return(-5); +} +/*****************************************************************************/ + +/* **************************************************************************** + * esint8 file_fclose(File *file) + * Description: This function closes a file, by clearing the object. + * Return value: 0 on success. +*/ +esint8 file_fclose(File *file) +{ + if(fs_hasTimeSupport()){ + file->DirEntry.AccessDate = time_getDate(); + if(file_getAttr(file,FILE_STATUS_WRITE)){ + file->DirEntry.FileSize = file->FileSize; + file->DirEntry.WriteDate = file->DirEntry.AccessDate; + file->DirEntry.WriteTime = time_getTime(); + } + dir_updateDirectoryEntry(file->fs,&(file->DirEntry),&(file->Location)); + }else{ + if(file_getAttr(file,FILE_STATUS_WRITE)){ + dir_setFileSize(file->fs,&(file->Location),file->FileSize); + } + } + + memClr(file,sizeof(*file)); + file_setAttr(file,FILE_STATUS_OPEN,0); + file_setAttr(file,FILE_STATUS_WRITE,0); + return(0); +} + + +/* **************************************************************************** + * void file_initFile(File *file, FileSystem *fs, FileLocation *loc) + * Description: This function initialises a new file object, by filling in + * the fs pointer, filesize (note, that DirEntry must already be filled in) + * and known cache parameters. + * Return value: void +*/ +void file_initFile(File *file, FileSystem *fs, FileLocation *loc) +{ + file->fs=fs; + file->FileSize=file->DirEntry.FileSize; + file->FilePtr=0; + file->Location.Sector=loc->Sector; + file->Location.Offset=loc->Offset; + file->Cache.Linear=0; + file->Cache.FirstCluster=(((euint32)file->DirEntry.FirstClusterHigh)<<16)+ + file->DirEntry.FirstClusterLow; + file->Cache.LastCluster=0; + file->Cache.LogicCluster=0; + file->Cache.DiscCluster=file->Cache.FirstCluster; + +#warning "non-official ClusterCount=0 patch by Mike Anton active" + file->Cache.ClusterCount=0; /* 0 means NOT known (added by Mike Anton) */ +} +/*****************************************************************************/ + +/* **************************************************************************** + * euint8* file_normalToFatName(eint8* filename,eint8* fatfilename) + * Description: This function converts a human readable filename (limited to + * 8.3 eint8 character) to a valid FAT (not VFAT) filename. Invalid characters are + * changed to capital X and only the first 11 characters are used. + * Furthermore all letters are capitalised. + * Return value: pointer after the filename +*/ +eint8* file_normalToFatName(eint8* filename,eint8* fatfilename) +{ + euint8 c,dot=0,vc=0; + + for(c=0;c<11;c++)fatfilename[c]=' '; + + c=0; + + if(*filename == '.'){ + fatfilename[0]='.'; + vc++; + if(*(filename+1) == '.'){ + fatfilename[1]='.'; + filename+=2; + }else{ + filename++; + } + }else{ + while(*filename != '\0' && *filename != ' ' && *filename != '/'){ + if(*filename=='.' && !dot){ + dot=1; + c=8; + }else{ + if(dot){ + if(c<=10){ + fatfilename[c]=file_validateChar(*filename); + c++; + } + }else{ + if(c<=7){ + fatfilename[c]=file_validateChar(*filename); + c++; vc++; + } + } + } + filename++; + } + } + + if(vc>0){ + if(*filename=='\0'){ + return(filename); + }else{ + return(filename+1); + } + }else{ + return(0); + } +} +/*****************************************************************************/ + +/* **************************************************************************** + * + * Description: This function takes the character c, and if it is not a * + * valid FAT Filename character returns X. If it is a lowercase letter the * + * uppercase equivalent is returned. The remaining characters are returned * + * as they are. + * Return value: The validated char +*/ +euint8 file_validateChar(euint8 c) +{ + if( (c<0x20) || (c>0x20&&c<0x30&&c!='-') || (c>0x39&&c<0x41) || (c>0x5A&&c<0x61&&c!='_') || (c>0x7A&&c!='~') ) + return(0x58); + if( c>=0x61 && c<=0x7A ) + return(c-32); + + return(c); +} +/*****************************************************************************/ + +/* **************************************************************************** + * void ioman_setAttr(IOManager *ioman,euint16 bufplace,euint8 attribute,euint8 val) + * Description: This sets the attribute of 'bufplace' to the given value (binary). + * + * Return value: void +*/ +void file_setAttr(File* file,euint8 attribute,euint8 val) +{ + if(val){ + file->FileStatus|=1<FileStatus&=~(1<FileStatus&(1<file->FileSize){ + if(file->Cache.ClusterCount==0){ /* Number of cluster unknown */ + hc = fat_countClustersInChain(file->fs,file->Cache.FirstCluster); + file->Cache.ClusterCount = hc; + }else{ + hc = file->Cache.ClusterCount; /* This better be right */ + } + clustersize = file->fs->volumeId.BytesPerSector * file->fs->volumeId.SectorsPerCluster; + if((size-file->FileSize+offset)> + ((hc-((file->FileSize+clustersize-1)/clustersize))*clustersize)){ + clusters_required = (((offset+size)-(hc*clustersize))+clustersize-1)/clustersize; + }else{ + clusters_required = 0; + } + }else{ + clusters_required = 0; + } + return(clusters_required); +} diff --git a/poc/lpc2148_efsl/src/fs.c b/poc/lpc2148_efsl/src/fs.c new file mode 100644 index 0000000..f5c2b27 --- /dev/null +++ b/poc/lpc2148_efsl/src/fs.c @@ -0,0 +1,523 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : fs.c * +* Description : These are general filesystem functions, supported by the * +* functions of dir.c and fat.c file.c uses these functions * +* heavily, but is not used by fs.c (not true anymore) * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "fs.h" +#include "fat.h" +#include "dir.h" +/*****************************************************************************/ + +/* **************************************************************************** + * eint16 fs_initFs(FileSystem *fs,Partition *part) + * Description: This functions glues the initialisation of the filesystem together. + * It loads the volumeID, computes the FS type and searches for the rootsector. + * Return value: Returns 0 on succes and -1 on error (if magic code is wrong) +*/ +eint16 fs_initFs(FileSystem *fs,Partition *part) +{ + if(!fs_isValidFat(part)){ + return(-1); + } + fs->part=part; + fs_loadVolumeId(fs,part); + if(!fs_verifySanity(fs))return(-2); + fs_countDataSectors(fs); + fs_determineFatType(fs); + fs_findFirstSectorRootDir(fs); + fs_initCurrentDir(fs); + return(0); +} +/*****************************************************************************/ + +/* **************************************************************************** + * eint16 fs_isValidFat(Partition *part) + * Description: This functions loads the volumeID and checks if the magic + * value is present. + * Return value: returns 0 when magic code is missing, 1 if it is there. +*/ +eint16 fs_isValidFat(Partition *part) +{ + euint8 *buf; + + buf=part_getSect(part,0,IOM_MODE_READONLY|IOM_MODE_EXP_REQ); /* Load Volume label */ + if( ex_getb16(buf,0x1FE) != 0xAA55 ){ + return (0); + } + part_relSect(part,buf); + return(1); +} +/*****************************************************************************/ + +/* **************************************************************************** + * void fs_loadVolumeId(FileSystem *fs, Partition *part) + * Description: This function loads all relevant fields from the volumeid. +*/ +void fs_loadVolumeId(FileSystem *fs, Partition *part) +{ + euint8 *buf; + + buf=part_getSect(part,0,IOM_MODE_READONLY|IOM_MODE_EXP_REQ); + + fs->volumeId.BytesPerSector=ex_getb16(buf,0x0B); + fs->volumeId.SectorsPerCluster=*((eint8*)(buf+0x0D)); + fs->volumeId.ReservedSectorCount=ex_getb16(buf,0x0E); + fs->volumeId.NumberOfFats=*((eint8*)(buf+0x10)); + fs->volumeId.RootEntryCount=ex_getb16(buf,0x11); + fs->volumeId.SectorCount16=ex_getb16(buf,0x13); + fs->volumeId.FatSectorCount16=ex_getb16(buf,0x16); + fs->volumeId.SectorCount32=ex_getb32(buf,0x20); + fs->volumeId.FatSectorCount32=ex_getb32(buf,0x24); + fs->volumeId.RootCluster=ex_getb32(buf,0x2C); + + part_relSect(part,buf); + +} +/*****************************************************************************/ + +/* **************************************************************************** + * esint16 fs_verifySanity(FileSystem *fs) + * Description: Does some sanity calculations. + * Return value: 1 on success, 0 when discrepancies were found. +*/ +esint16 fs_verifySanity(FileSystem *fs) +{ + esint16 sane=1; /* Sane until proven otherwise */ + /* First check, BPS, we only support 512 */ + if(fs->volumeId.BytesPerSector!=512)sane=0; + /* Check is SPC is valid (multiple of 2, and clustersize >=32KB */ + if(!((fs->volumeId.SectorsPerCluster == 1 ) | + (fs->volumeId.SectorsPerCluster == 2 ) | + (fs->volumeId.SectorsPerCluster == 4 ) | + (fs->volumeId.SectorsPerCluster == 8 ) | + (fs->volumeId.SectorsPerCluster == 16) | + (fs->volumeId.SectorsPerCluster == 32) | + (fs->volumeId.SectorsPerCluster == 64) ))sane=0; + /* Any number of FAT's should be supported... (untested) */ + /* There should be at least 1 reserved sector */ + if(fs->volumeId.ReservedSectorCount==0)sane=0; + if(fs->volumeId.FatSectorCount16 != 0){ + if(fs->volumeId.FatSectorCount16 > fs->part->disc->partitions[fs->part->activePartition].numSectors)sane=0; + }else{ + if(fs->volumeId.FatSectorCount32 > fs->part->disc->partitions[fs->part->activePartition].numSectors)sane=0; + } + return(sane); +} +/*****************************************************************************/ + +/* **************************************************************************** + * void fs_countDataSectors(FileSystem *fs) + * Description: This functions calculates the sectorcounts, fatsectorcounts and + * dataclustercounts. It fills in the general fields. +*/ +void fs_countDataSectors(FileSystem *fs) +{ + euint32 rootDirSectors,dataSectorCount; + + rootDirSectors=((fs->volumeId.RootEntryCount*32) + + (fs->volumeId.BytesPerSector - 1)) / + fs->volumeId.BytesPerSector; + + if(fs->volumeId.FatSectorCount16 != 0) + { + fs->FatSectorCount=fs->volumeId.FatSectorCount16; + fs->volumeId.FatSectorCount32=0; + } + else + { + fs->FatSectorCount=fs->volumeId.FatSectorCount32; + fs->volumeId.FatSectorCount16=0; + } + + if(fs->volumeId.SectorCount16!=0) + { + fs->SectorCount=fs->volumeId.SectorCount16; + fs->volumeId.SectorCount32=0; + } + else + { + fs->SectorCount=fs->volumeId.SectorCount32; + fs->volumeId.SectorCount16=0; + } + + dataSectorCount=fs->SectorCount - ( + fs->volumeId.ReservedSectorCount + + (fs->volumeId.NumberOfFats * fs->FatSectorCount) + + rootDirSectors); + + fs->DataClusterCount=dataSectorCount/fs->volumeId.SectorsPerCluster; +} +/*****************************************************************************/ + +/* **************************************************************************** + * void fs_determineFatType(FileSystem *fs) + * Description: This function looks af the Dataclustercount and determines the + * FAT type. It fills in fs->type. +*/ +void fs_determineFatType(FileSystem *fs) +{ + if(fs->DataClusterCount < 4085) + { + fs->type=FAT12; + fs->volumeId.RootCluster=0; + } + else if(fs->DataClusterCount < 65525) + { + fs->type=FAT16; + fs->volumeId.RootCluster=0; + } + else + { + fs->type=FAT32; + } +} +/*****************************************************************************/ + +/* **************************************************************************** + * void fs_findFirstSectorRootDir(FileSystem *fs) + * Description: This functions fills in the fs->FirstSectorRootDir field, even + * for FAT32, although that is not necessary (because you have FirstClusterRootDir). +*/ +void fs_findFirstSectorRootDir(FileSystem *fs) +{ + if(fs->type==FAT32) + fs->FirstSectorRootDir = fs->volumeId.ReservedSectorCount + + (fs->volumeId.NumberOfFats*fs->volumeId.FatSectorCount32) + + (fs->volumeId.RootCluster-2)*fs->volumeId.SectorsPerCluster; + else + fs->FirstSectorRootDir = fs->volumeId.ReservedSectorCount + + (fs->volumeId.NumberOfFats*fs->volumeId.FatSectorCount16); +} +/*****************************************************************************/ + +void fs_initCurrentDir(FileSystem *fs) +{ + fs->FirstClusterCurrentDir = fs_getFirstClusterRootDir(fs); +} +/*****************************************************************************/ + +/* **************************************************************************** + * long fs_clusterToSector(FileSystem *fs,euint32 cluster) + * Description: This function converts a clusternumber in the effective sector + * number where this cluster starts. Boundary check is not implemented + * Return value: A long is returned representing the sectornumber. +*/ +euint32 fs_clusterToSector(FileSystem *fs,euint32 cluster) +{ + eint32 base; + + if(fs->type==FAT32) + { + base= + fs->volumeId.ReservedSectorCount+ + fs->FatSectorCount*fs->volumeId.NumberOfFats; + } + else + { + base= + fs->volumeId.ReservedSectorCount+ + fs->FatSectorCount*fs->volumeId.NumberOfFats+ + fs->volumeId.RootEntryCount/16; + } + return( base + (cluster-2)*fs->volumeId.SectorsPerCluster ); +} +/*****************************************************************************/ + +/* Function is unused, but may be usefull */ +euint32 fs_sectorToCluster(FileSystem *fs,euint32 sector) +{ + eint32 base; + + if(fs->type==FAT32) + { + base= + fs->volumeId.ReservedSectorCount+ + fs->FatSectorCount*fs->volumeId.NumberOfFats; + } + else + { + base= + fs->volumeId.ReservedSectorCount+ + fs->FatSectorCount*fs->volumeId.NumberOfFats+ + fs->volumeId.RootEntryCount/16; + } + return(((sector-base)-((sector-base)%fs->volumeId.SectorsPerCluster))/fs->volumeId.SectorsPerCluster+2 ); +} +/*****************************************************************************/ + +/* **************************************************************************** + * euint32 fs_getNextFreeCluster(FileSystem *fs,euint32 startingcluster) + * Description: This functions searches for a free cluster, starting it's search at + * cluster startingcluster. This allow to speed up searches and try to avoid + * fragmentation. Implementing rollover search is still to be done. + * Return value: If a free cluster is found it's number is returned. If none is + * found 0 is returned. +*/ +euint32 fs_getNextFreeCluster(FileSystem *fs,euint32 startingcluster) +{ + euint32 r; + + while(startingclusterDataClusterCount){ + r=fat_getNextClusterAddress(fs,startingcluster,0); + if(r==0){ + return(startingcluster); + } + startingcluster++; + } + return(0); +} +/*****************************************************************************/ + +/* **************************************************************************** + * euint32 fs_giveFreeClusterHint(FileSystem *fs) + * + * Description: This function should return a clusternumber that is free or + * lies close before free clusters. The result MUST be checked to see if + * it is free! Implementationhint: search the largest clusternumber in the + * files in the rootdirectory. + * + * Return value: Returns it's best guess. +*/ +euint32 fs_giveFreeClusterHint(FileSystem *fs) +{ + return(2); /* Now THIS is a hint ;) */ +} +/*****************************************************************************/ + +/* **************************************************************************** + * esint8 fs_findFile(FileSystem *fs,eint8* filename,FileLocation *loc,euint32 *lastDir) + * + * Description: This function looks if the given filename is on the given fs + * and, if found, fills in its location in loc. + * The function will first check if the pathname starts with a slash. If so it will + * set the starting directory to the rootdirectory. Else, it will take the firstcluster- + * currentdir (That you can change with chdir()) as startingpoint. + * The lastdir pointer will be the first cluster of the last directory fs_findfile + * enters. It starts out at the root/current dir and then traverses the path along with + * fs_findFile. + * It is set to 0 in case of errors (like dir/dir/dir/file/dir/dir...) + * Return value: Returns 0 when nothing was found, 1 when the thing found + * was a file and 2 if the thing found was a directory. +*/ + +esint8 fs_findFile(FileSystem *fs,eint8* filename,FileLocation *loc,euint32 *lastDir) +{ + euint32 fccd,tmpclus; + eint8 ffname[11],*next,it=0,filefound=0; + + if(*filename=='/'){ + fccd = fs_getFirstClusterRootDir(fs); + filename++; + if(lastDir)*lastDir=fccd; + if(!*filename){ + return(2); + } + }else{ + fccd = fs->FirstClusterCurrentDir; + if(lastDir)*lastDir=fccd; + } + + + while((next=file_normalToFatName(filename,ffname))!=0){ + if((tmpclus=dir_findinDir(fs,ffname,fccd,loc,DIRFIND_FILE))==0){ + /* We didn't find what we wanted */ + /* We should check, to see if there is more after it, so that + * we can invalidate lastDir + */ + if((file_normalToFatName(next,ffname))!=0){ + if(lastDir)*lastDir=0; + } + return(0); + } + it++; + if(loc->attrib&ATTR_DIRECTORY){ + fccd = tmpclus; + filename = next; + if(lastDir)*lastDir=fccd; + if(filefound)*lastDir=0; + }else{ + filefound=1; + if((file_normalToFatName(next,ffname))!=0){ + if(lastDir)*lastDir=0; + return(0); + }else{ + filename=next; + } + } + } + + if(it==0)return(0); + if(loc->attrib&ATTR_DIRECTORY || !filefound)return(2); + return(1); +} +/*****************************************************************************/ + +esint16 fs_findFreeFile(FileSystem *fs,eint8* filename,FileLocation *loc,euint8 mode) +{ + euint32 targetdir=0; + eint8 ffname[11]; + + if(fs_findFile(fs,filename,loc,&targetdir))return(0); + if(!dir_getFatFileName(filename,ffname))return(0); + if(dir_findinDir(fs,ffname,targetdir,loc,DIRFIND_FREE)){ + return(1); + }else{ + if(dir_addCluster(fs,targetdir)){ + return(0); + }else{ + if(dir_findinDir(fs,ffname,targetdir,loc,DIRFIND_FREE)){ + return(1); + } + } + } + + return(0); +} +/*****************************************************************************/ + +/* **************************************************************************** + * euint32 fs_getLastCluster(FileSystem *fs,ClusterChain *Cache) + * Description: This function searches the last cluster of a chain. + * Return value: The LastCluster (also stored in cache); +*/ +euint32 fs_getLastCluster(FileSystem *fs,ClusterChain *Cache) +{ + if(Cache->DiscCluster==0){ + Cache->DiscCluster=Cache->FirstCluster; + Cache->LogicCluster=0; + } + + if(Cache->LastCluster==0) + { + while(fat_getNextClusterChain(fs, Cache)==0) + { + Cache->LogicCluster+=Cache->Linear; + Cache->DiscCluster+=Cache->Linear; + Cache->Linear=0; + } + } + return(Cache->LastCluster); +} +/*****************************************************************************/ + +euint32 fs_getFirstClusterRootDir(FileSystem *fs) +{ + switch(fs->type){ + case FAT32: + return(fs->volumeId.RootCluster); + break; + default: + return(1); + break; + } +} +/*****************************************************************************/ + +void fs_initClusterChain(FileSystem *fs,ClusterChain *cache,euint32 cluster_addr) +{ + cache->FirstCluster=cluster_addr; + cache->DiscCluster=cluster_addr; + cache->LogicCluster=0; + cache->LastCluster=0; /* Warning flag here */ + cache->Linear=0; + cache->ClusterCount=0; /* 0 means NOT known */ +} +/*****************************************************************************/ + +void fs_setFirstClusterInDirEntry(FileRecord *rec,euint32 cluster_addr) +{ + rec->FirstClusterHigh=cluster_addr>>16; + rec->FirstClusterLow=cluster_addr&0xFFFF; +} +/*****************************************************************************/ + +esint8 fs_flushFs(FileSystem *fs) +{ + return(part_flushPart(fs->part,0,fs->SectorCount)); +} +/*****************************************************************************/ + +esint8 fs_umount(FileSystem *fs) +{ + return(fs_flushFs(fs)); +} +/*****************************************************************************/ + +esint8 fs_clearCluster(FileSystem *fs,euint32 cluster) +{ + euint16 c; + euint8* buf; + + for(c=0;c<(fs->volumeId.SectorsPerCluster);c++){ + buf = part_getSect(fs->part,fs_clusterToSector(fs,cluster)+c,IOM_MODE_READWRITE); + memClr(buf,512); + part_relSect(fs->part,buf); + } + return(0); +} + +esint8 fs_getFsInfo(FileSystem *fs,euint8 force_update) +{ + euint8 *buf; + + if(!fs->type==FAT32)return(0); + buf = part_getSect(fs->part,FS_INFO_SECTOR,IOM_MODE_READONLY); + if(ex_getb32(buf,0)!=FSINFO_MAGIC_BEGIN || ex_getb32(buf,508)!=FSINFO_MAGIC_END){ + part_relSect(fs->part,buf); + return(-1); + } + fs->FreeClusterCount = ex_getb32(buf,488); + fs->NextFreeCluster = ex_getb32(buf,492); + part_relSect(fs->part,buf); + if(force_update){ + fs->FreeClusterCount=fat_countFreeClusters(fs); + } + return(0); +} + +esint8 fs_setFsInfo(FileSystem *fs) +{ + euint8* buf; + + if(!fs->type==FAT32)return(0); + buf = part_getSect(fs->part,FS_INFO_SECTOR,IOM_MODE_READWRITE); + if(ex_getb32(buf,0)!=FSINFO_MAGIC_BEGIN || ex_getb32(buf,508)!=FSINFO_MAGIC_END){ + part_relSect(fs->part,buf); + return(-1); + } + ex_setb32(buf,488,fs->FreeClusterCount); + ex_setb32(buf,492,fs->NextFreeCluster); + part_relSect(fs->part,buf); + return(0); +} + diff --git a/poc/lpc2148_efsl/src/interfaces/at91_spi.c b/poc/lpc2148_efsl/src/interfaces/at91_spi.c new file mode 100644 index 0000000..0248a5d --- /dev/null +++ b/poc/lpc2148_efsl/src/interfaces/at91_spi.c @@ -0,0 +1,270 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------------------------------------------- * +* * +* Filename : at91_spi.c * +* Description : This file contains the functions needed to use efs for * +* accessing files on an SD-card connected to an AT91(SAM7) * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Martin Thomas * +\*****************************************************************************/ + +/* +TODO: +- Driver uses simple mode -> implement "DMA" +- use 16-bit mode +- check CPOL +*/ + +/*****************************************************************************/ +#include "interfaces/AT91SAM7S_regs.h" +#include "config.h" +#include "interfaces/arm_spi.h" +#include "interfaces/sd.h" +/*****************************************************************************/ + +/* Define the following to enable fixed peripheral chip-select. + This is not a config.h-value since variable peripheral select + is prefered so other devices can be attached to the AT91 SPI-interface. */ +/* #define FIXED_PERIPH */ + +/* + AT91SAM7S64 SPI Pins: Function (A/B) + PA12 - MISO - AT91C_PA12_MISO (1/0) + PA13 - MOSI - AT91C_PA13_MOSI (1/0) + PA14 - SCK - AT91C_PA14_SPCK (1/0) + + Chip-Selects (available on different pins) + PA11 - NPCS0 - AT91C_PA11_NPCS0 (1/0) + PA31 - NPCS1 - AT91C_PA31_NPCS1 (1/0) + PA09 - NPCS1 - AT91C_PA9_NPCS1 (1/0) + ...AT91C_PA3_NPCS3 (0/1) + ...AT91C_PA5_NPCS3 (0/1) + ...AT91C_PA10_NPCS2 (0/1) + ...AT91C_PA22_NPCS3 (0/1) + ...AT91C_PA30_NPCS2 (0/1) +*/ + +/* here: use NCPS0 @ PA11: */ +#define NCPS_PDR_BIT AT91C_PA11_NPCS0 +#define NCPS_ASR_BIT AT91C_PA11_NPCS0 +#define NPCS_BSR_BIT 0 +#define SPI_CSR_NUM 0 + +/* PCS_0 for NPCS0, PCS_1 for NPCS1 ... */ +#define PCS_0 ((0<<0)|(1<<1)|(1<<2)|(1<<3)) +#define PCS_1 ((1<<1)|(0<<1)|(1<<2)|(1<<3)) +#define PCS_2 ((1<<1)|(1<<1)|(0<<2)|(1<<3)) +#define PCS_3 ((1<<1)|(1<<1)|(1<<2)|(0<<3)) +/* TODO: ## */ +#if (SPI_CSR_NUM == 0) +#define SPI_MR_PCS PCS_0 +#elif (SPI_CSR_NUM == 1) +#define SPI_MR_PCS PCS_1 +#elif (SPI_CSR_NUM == 2) +#define SPI_MR_PCS PCS_2 +#elif (SPI_CSR_NUM == 3) +#define SPI_MR_PCS PCS_3 +#else +#error "SPI_CSR_NUM invalid" +// not realy - when using an external address decoder... +// but this code takes over the complete SPI-interace anyway +#endif + +/* in variable periph. select PSDEC=1 is used + so the already defined values for SPC_MR_PCS can be + reused */ +#define SPI_TDR_PCS SPI_MR_PCS + +/* SPI prescaler lower limit (the smaller the faster) */ +#define SPI_SCBR_MIN 2 + + +esint8 if_initInterface(hwInterface* file, eint8* opts) +{ + euint32 sc; + + if_spiInit(file); + + if(sd_Init(file)<0) { + DBG((TXT("Card failed to init, breaking up...\n"))); + return(-1); + } + + if(sd_State(file)<0){ + DBG((TXT("Card didn't return the ready state, breaking up...\n"))); + return(-2); + } + + /* file->sectorCount=4; */ /* FIXME ASAP!! */ + /* mthomas: - somehow done - see below */ + + sd_getDriveSize(file, &sc); + file->sectorCount = sc/512; + if( (sc%512) != 0) { + file->sectorCount--; + } + DBG((TXT("Card Capacity is %lu Bytes (%lu Sectors)\n"), sc, file->sectorCount)); + + if_spiSetSpeed(SPI_SCBR_MIN); + // if_spiSetSpeed(100); /* debug - slower */ + + return(0); +} + +/*****************************************************************************/ +/* parts of this function inspired by a spi example found at olimex.com + not much (nothing?) left from the olimex-code (since too many hardcoded values) +*/ +void if_spiInit(hwInterface *iface) +{ + euint8 i; + + AT91PS_SPI pSPI = AT91C_BASE_SPI; + AT91PS_PIO pPIOA = AT91C_BASE_PIOA; + AT91PS_PMC pPMC = AT91C_BASE_PMC; + // not used: AT91PS_PDC pPDC_SPI = AT91C_BASE_PDC_SPI; + + // disable PIO from controlling MOSI, MISO, SCK (=hand over to SPI) + // keep CS untouched - used as GPIO pin during init + pPIOA->PIO_PDR = AT91C_PA12_MISO | AT91C_PA13_MOSI | AT91C_PA14_SPCK; // | NCPS_PDR_BIT; + // set pin-functions in PIO Controller + pPIOA->PIO_ASR = AT91C_PA12_MISO | AT91C_PA13_MOSI | AT91C_PA14_SPCK; /// not here: | NCPS_ASR_BIT; + /// not here: pPIOA->PIO_BSR = NPCS_BSR_BIT; + + // set chip-select as output high (unselect card) + pPIOA->PIO_PER = NCPS_PDR_BIT; // enable GPIO of CS-pin + pPIOA->PIO_SODR = NCPS_PDR_BIT; // set high + pPIOA->PIO_OER = NCPS_PDR_BIT; // output enable + + // enable peripheral clock for SPI ( PID Bit 5 ) + pPMC->PMC_PCER = ( (euint32) 1 << AT91C_ID_SPI ); // n.b. IDs are just bit-numbers + + // SPI enable and reset + pSPI->SPI_CR = AT91C_SPI_SPIEN | AT91C_SPI_SWRST; + +#ifdef FIXED_PERIPH + // SPI mode: master, fixed periph. sel., FDIV=0, fault detection disabled + pSPI->SPI_MR = AT91C_SPI_MSTR | AT91C_SPI_PS_FIXED | AT91C_SPI_MODFDIS; + // set PCS for fixed select + // pSPI->SPI_MR &= 0xFFF0FFFF; // clear old PCS - redundant (AT91lib) + pSPI->SPI_MR |= ( (SPI_MR_PCS<<16) & AT91C_SPI_PCS ); // set PCS +#else + // SPI mode: master, variable periph. sel., FDIV=0, fault detection disabled + // Chip-Select-Decoder Mode (write state of CS-Lines in TDR) + pSPI->SPI_MR = AT91C_SPI_MSTR | AT91C_SPI_MODFDIS | AT91C_SPI_PCSDEC ; +#endif + + // set chip-select-register + // 8 bits per transfer, CPOL=1, ClockPhase=0, DLYBCT = 0 + // TODO: Why has CPOL to be active here and non-active on LPC2000? + // Take closer look on timing diagrams in datasheets. + // not working pSPI->SPI_CSR[SPI_CSR_NUM] = AT91C_SPI_CPOL | AT91C_SPI_BITS_8 | AT91C_SPI_NCPHA; + // not working pSPI->SPI_CSR[SPI_CSR_NUM] = AT91C_SPI_BITS_8 | AT91C_SPI_NCPHA; + pSPI->SPI_CSR[SPI_CSR_NUM] = AT91C_SPI_CPOL | AT91C_SPI_BITS_8; + // not working pSPI->SPI_CSR[SPI_CSR_NUM] = AT91C_SPI_BITS_8; + + // slow during init + if_spiSetSpeed(0xFE); + + // enable + pSPI->SPI_CR = AT91C_SPI_SPIEN; + +#if 0 + // a PDC-init has been in the Olimex-code - not needed since + // the PDC is not used by this version of the interface + // (Olimex did not use PDC either) + // enable PDC transmit and receive in "PERIPH_PTCR" (SPI_PTCR) + pPDC_SPI->PDC_PTCR = AT91C_PDC_TXTEN | AT91C_PDC_RXTEN; + pSPI->SPI_PTCR = AT91C_PDC_TXTEN | AT91C_PDC_RXTEN; +#endif + + /* Send 20 spi commands with card not selected */ + for(i=0;i<21;i++) { + if_spiSend(iface,0xFF); + } + + /* enable automatic chip-select */ + // reset PIO-registers of CS-pin to default + pPIOA->PIO_ODR = NCPS_PDR_BIT; // input + pPIOA->PIO_CODR = NCPS_PDR_BIT; // clear + // disable PIO from controlling the CS pin (=hand over to SPI) + pPIOA->PIO_PDR = NCPS_PDR_BIT; + // set pin-functions in PIO Controller (function NCPS for CS-pin) + pPIOA->PIO_ASR = NCPS_ASR_BIT; + pPIOA->PIO_BSR = NPCS_BSR_BIT; +} +/*****************************************************************************/ + +void if_spiSetSpeed(euint8 speed) +{ + euint32 reg; + AT91PS_SPI pSPI = AT91C_BASE_SPI; + + if ( speed < SPI_SCBR_MIN ) speed = SPI_SCBR_MIN; + if ( speed > 1 ) speed &= 0xFE; + + reg = pSPI->SPI_CSR[SPI_CSR_NUM]; + reg = ( reg & ~(AT91C_SPI_SCBR) ) | ( (euint32)speed << 8 ); + pSPI->SPI_CSR[SPI_CSR_NUM] = reg; +} +/*****************************************************************************/ + +euint8 if_spiSend(hwInterface *iface, euint8 outgoing) +{ + euint8 incoming; + + AT91PS_SPI pSPI = AT91C_BASE_SPI; + + while( !( pSPI->SPI_SR & AT91C_SPI_TDRE ) ); // transfer compl. wait +#ifdef FIXED_PERIPH + pSPI->SPI_TDR = (euint16)( outgoing ); +#else + pSPI->SPI_TDR = ( (euint16)(outgoing) | ((euint32)(SPI_TDR_PCS)<<16) ); +#endif + + while( !( pSPI->SPI_SR & AT91C_SPI_RDRF ) ); // wait for char + incoming = (euint8)( pSPI->SPI_RDR ); + + return incoming; +} +/*****************************************************************************/ + +esint8 if_readBuf(hwInterface* file,euint32 address,euint8* buf) +{ + return(sd_readSector(file,address,buf,512)); +} +/*****************************************************************************/ + +esint8 if_writeBuf(hwInterface* file, euint32 address, euint8* buf) +{ + return( sd_writeSector(file, address, buf) ); +} +/*****************************************************************************/ + +esint8 if_setPos(hwInterface* file,euint32 address) +{ + return(0); +} +/*****************************************************************************/ diff --git a/poc/lpc2148_efsl/src/interfaces/atmega128.c b/poc/lpc2148_efsl/src/interfaces/atmega128.c new file mode 100644 index 0000000..eb4e856 --- /dev/null +++ b/poc/lpc2148_efsl/src/interfaces/atmega128.c @@ -0,0 +1,110 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : atmega128.c * +* Description : This file contains the functions needed to use efs for * +* accessing files on an SD-card connected to an ATMega128. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "interfaces/atmega128.h" +#include "interfaces/sd.h" +/*****************************************************************************/ + +esint8 if_initInterface(hwInterface* file, eint8* opts) +{ + if_spiInit(file); + if(sd_Init(file)<0) { + DBG((TXT("Card failed to init, breaking up...\n"))); + return(-1); + } + if(sd_State(file)<0){ + DBG((TXT("Card didn't return the ready state, breaking up...\n"))); + return(-2); + } + file->sectorCount=4; /* FIXME ASAP!! */ + DBG((TXT("Init done...\n"))); + return(0); +} +/*****************************************************************************/ + +esint8 if_readBuf(hwInterface* file,euint32 address,euint8* buf) +{ + return(sd_readSector(file,address,buf,512)); +} +/*****************************************************************************/ + +esint8 if_writeBuf(hwInterface* file,euint32 address,euint8* buf) +{ + return(sd_writeSector(file,address, buf)); +} +/*****************************************************************************/ + +esint8 if_setPos(hwInterface* file,euint32 address) +{ + return(0); +} +/*****************************************************************************/ + +void if_spiInit(hwInterface *iface) +{ + euint8 i; + + /* Unselect card */ + PORTB |= 0x01; + + /* Set as master, clock and chip select output */ + DDR_SPI = (1< +/*****************************************************************************/ + +short if_initInterface(hwInterface* file, char* opts) +{ + file->sectorCount=0; + return(if_spiInit(file)); +} +/*****************************************************************************/ + +short if_writeBuf(hwInterface* file,unsigned long address,unsigned char* buf) +{ + return(0); +} +/*****************************************************************************/ + +short if_setPos(hwInterface* file,unsigned long address) +{ + return(0); +} +/*****************************************************************************/ + +signed char if_spiInit(hwInterface *iface) +{ + return(sd_Init(iface)); +} +/*****************************************************************************/ + +unsigned char if_spiSend(hwInterface *iface, euint8 outgoing) +{ + unsigned char r; + +/* while((*(unsigned volatile long*)McBSP0_SPCR & 0x20000)==0); + *(unsigned volatile char*)McBSP0_DXR=outgoing; + while(((*(unsigned volatile long*)McBSP0_SPCR & 0x2)==0)); + r=*(unsigned volatile char*)McBSP0_DRR; */ + + while(!MCBSP_xrdy(iface->port->hBsp)); + MCBSP_write(iface->port->hBsp,outgoing); + while(!MCBSP_rrdy(iface->port->hBsp)); + r=MCBSP_read(iface->port->hBsp); + + return(r); +} +/*****************************************************************************/ + +short if_readBuf(hwInterface* file,euint32 address,unsigned char* buf) +{ + short r; + r=sd_readSector(file,address,buf,512); + if(r!=0)printf("ERROR READING SECTOR %i\n",address); + return(r); +} +/*****************************************************************************/ + diff --git a/poc/lpc2148_efsl/src/interfaces/efsl_dbg_printf_arm.c b/poc/lpc2148_efsl/src/interfaces/efsl_dbg_printf_arm.c new file mode 100644 index 0000000..ed3e501 --- /dev/null +++ b/poc/lpc2148_efsl/src/interfaces/efsl_dbg_printf_arm.c @@ -0,0 +1,243 @@ +//######################################################################### +// printf.c +// +// *** printf() based on sprintf() from gcctest9.c Volker Oth +// +// *** Changes made by Holger Klabunde +// Now takes format strings from FLASH (was into RAM ! before) +// Fixed bug for %i, %I. u_val was used before it had the right value +// Added %d, %D (is same as %i, %I) +// Support for long variables %li, %ld, %Lu, %LX .... +// %x, %X now gives upper case hex characters A,B,C,D,E,F +// Output can be redirected in a single function: myputchar() +// Make printf() smaller by commenting out a few #defines +// Added some SPACE and ZERO padding %02x or % 3u up to 9 characters +// +// Todo: +// %f, %F for floating point numbers +// +// *** Changes made by Martin Thomas for the efsl debug output: +// - removed AVR "progmem" +// - added function pointer for "putchar" +// - devopen function +// +//######################################################################### + +#include +#include +#include "interfaces/efsl_dbg_printf_arm.h" + +#define SCRATCH 12 //32Bits go up to 4GB + 1 Byte for \0 + +//Spare some program space by making a comment of all not used format flag lines +#define USE_LONG // %lx, %Lu and so on, else only 16 bit integer is allowed +//#define USE_OCTAL // %o, %O Octal output. Who needs this ? +#define USE_STRING // %s, %S Strings as parameters +#define USE_CHAR // %c, %C Chars as parameters +#define USE_INTEGER // %i, %I Remove this format flag. %d, %D does the same +#define USE_HEX // %x, %X Hexadezimal output +#define USE_UPPERHEX // %x, %X outputs A,B,C... else a,b,c... +#ifndef USE_HEX + #undef USE_UPPERHEX // ;) +#endif +#define USE_UPPER // uncommenting this removes %C,%D,%I,%O,%S,%U,%X and %L.. + // only lowercase format flags are used +#define PADDING //SPACE and ZERO padding + + +static int (*putcharfunc)(int c); + +void efsl_debug_devopen_arm( int(*put)(int) ) +{ + putcharfunc = put; +} + +static void myputchar(unsigned char c) +{ + if(c == '\n') putcharfunc('\r'); + putcharfunc(c); +} + +void efsl_debug_printf_arm(char const *format, ...) +{ + unsigned char scratch[SCRATCH]; + unsigned char format_flag; + unsigned short base; + unsigned char *ptr; + unsigned char issigned=0; + va_list ap; + +#ifdef USE_LONG + unsigned char islong=0; + unsigned long u_val=0; + long s_val=0; +#else + unsigned int u_val=0; + int s_val=0; +#endif + + unsigned char fill; + unsigned char width; + + va_start (ap, format); + for (;;){ + while ((format_flag = *(format++)) != '%'){ // Until '%' or '\0' + if (!format_flag){va_end (ap); return;} + myputchar(format_flag); + } + + issigned=0; //default unsigned + base = 10; + + format_flag = *format++; //get char after '%' + +#ifdef PADDING + width=0; //no formatting + fill=0; //no formatting + if(format_flag=='0' || format_flag==' ') //SPACE or ZERO padding ? + { + fill=format_flag; + format_flag = *format++; //get char after padding char + if(format_flag>='0' && format_flag<='9') + { + width=format_flag-'0'; + format_flag = *format++; //get char after width char + } + } +#endif + +#ifdef USE_LONG + islong=0; //default int value +#ifdef USE_UPPER + if(format_flag=='l' || format_flag=='L') //Long value +#else + if(format_flag=='l') //Long value +#endif + { + islong=1; + format_flag = *format++; //get char after 'l' or 'L' + } +#endif + + switch (format_flag) + { +#ifdef USE_CHAR + case 'c': +#ifdef USE_UPPER + case 'C': +#endif + format_flag = va_arg(ap,int); + // no break -> run into default +#endif + + default: + myputchar(format_flag); + continue; + +#ifdef USE_STRING +#ifdef USE_UPPER + case 'S': +#endif + case 's': + ptr = (unsigned char*)va_arg(ap,char *); + while(*ptr) { myputchar(*ptr); ptr++; } + continue; +#endif + +#ifdef USE_OCTAL + case 'o': +#ifdef USE_UPPER + case 'O': +#endif + base = 8; + myputchar('0'); + goto CONVERSION_LOOP; +#endif + +#ifdef USE_INTEGER //don't use %i, is same as %d + case 'i': +#ifdef USE_UPPER + case 'I': +#endif +#endif + case 'd': +#ifdef USE_UPPER + case 'D': +#endif + issigned=1; + // no break -> run into next case + case 'u': +#ifdef USE_UPPER + case 'U': +#endif + +//don't insert some case below this if USE_HEX is undefined ! +//or put goto CONVERSION_LOOP; before next case. +#ifdef USE_HEX + goto CONVERSION_LOOP; + case 'x': +#ifdef USE_UPPER + case 'X': +#endif + base = 16; +#endif + + CONVERSION_LOOP: + + if(issigned) //Signed types + { +#ifdef USE_LONG + if(islong) { s_val = va_arg(ap,long); } + else { s_val = va_arg(ap,int); } +#else + s_val = va_arg(ap,int); +#endif + + if(s_val < 0) //Value negativ ? + { + s_val = - s_val; //Make it positiv + myputchar('-'); //Output sign + } + + u_val = (unsigned long)s_val; + } + else //Unsigned types + { +#ifdef USE_LONG + if(islong) { u_val = va_arg(ap,unsigned long); } + else { u_val = va_arg(ap,unsigned int); } +#else + u_val = va_arg(ap,unsigned int); +#endif + } + + ptr = scratch + SCRATCH; + *--ptr = 0; + do + { + char ch = u_val % base + '0'; +#ifdef USE_HEX + if (ch > '9') + { + ch += 'a' - '9' - 1; +#ifdef USE_UPPERHEX + ch-=0x20; +#endif + } +#endif + *--ptr = ch; + u_val /= base; + +#ifdef PADDING + if(width) width--; //calculate number of padding chars +#endif + } while (u_val); + +#ifdef PADDING + while(width--) *--ptr = fill; //insert padding chars +#endif + + while(*ptr) { myputchar(*ptr); ptr++; } + } + } +} diff --git a/poc/lpc2148_efsl/src/interfaces/helper.c b/poc/lpc2148_efsl/src/interfaces/helper.c new file mode 100644 index 0000000..ccbd095 --- /dev/null +++ b/poc/lpc2148_efsl/src/interfaces/helper.c @@ -0,0 +1,94 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : helper.c * +* Description : These functions may NOT BE USED ANYWHERE ! They are helper * +* functions for the Linux based developement. They use the GNU * +* C library and headers. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#include "interfaces/helper.h" + +void* Malloc(eint32 size) +{ + void*x; + + if((x=malloc(size))==NULL){ + perror("Malloc: "); + exit(-1); + } + return(x); +} + +void Fopen(FILE **f,eint8* filename) +{ + *f=fopen(filename,"r+"); + if(*f==NULL){ + perror("Fopen: "); + exit(-1); + } +} + +void MMap(eint8* filename,void**x,eint32 *size) +{ + FILE *tmp; + eint32 filesize,c; + + Fopen(&tmp,filename); + filesize=getFileSize(tmp); + *x=Malloc(filesize); + for(c=0;c=32?buf[c*16+cc]:'*'); + } + } + printf("\n"); +} diff --git a/poc/lpc2148_efsl/src/interfaces/linuxfile.c b/poc/lpc2148_efsl/src/interfaces/linuxfile.c new file mode 100644 index 0000000..60ef93e --- /dev/null +++ b/poc/lpc2148_efsl/src/interfaces/linuxfile.c @@ -0,0 +1,112 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : linuxfile.c * +* Description : This file contains the functions needed to use efs for * +* accessing files under linux. This interface is meant * +* to be used for debugging purposes. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ +/*****************************************************************************/ +#include "interfaces/linuxfile.h" +/*****************************************************************************/ + +/* **************************************************************************** + * short if_initInterface(hwInterface* file, char* fileName) + * Description: This function should bring the hardware described in file in a + * ready state to receive and retrieve data. + * Return value: Return 0 on succes and -1 on failure. +*/ +esint8 if_initInterface(hwInterface* file, eint8* fileName) +{ + eint32 sc; + Fopen(&(file->imageFile),fileName); + sc=getFileSize(file->imageFile); + file->sectorCount=sc/512; + file->readCount=file->writeCount=0; + if(sc%512!=0) + file->sectorCount--; + return(0); +} +/*****************************************************************************/ + +/* **************************************************************************** + * short if_readBuf(hwInterface* file,unsigned long address,unsigned char* buf) + * Description: This function should fill the characterpointer buf with 512 + * bytes, offset by address*512 bytes. Adress is thus a LBA address. + * Return value: Return 0 on success and -1 on failure. +*/ +esint8 if_readBuf(hwInterface* file,euint32 address,euint8* buf) +{ + /*printf("READ %li\n",address);*/ + if(if_setPos(file,address))return(-1); + if( fread((void*)buf,512,1,file->imageFile) != 1) return(-1); + file->readCount++; + return(0); +} +/*****************************************************************************/ + +/* **************************************************************************** + * short if_writeBuf(hwInterface* file,unsigned long address,unsigned char* buf) + * Description: This function writes 512 bytes from uchar* buf to the hardware + * disc described in file. The write offset should be address sectors of 512 bytes. + * Return value: Return 0 on success and -1 on failure. +*/ +esint8 if_writeBuf(hwInterface* file,euint32 address,euint8* buf) +{ + /*printf("WRITE %li\n",address);*/ + if_setPos(file,address); + if((fwrite((void*)buf,512,1,file->imageFile))!=1){ + perror("cf_writeBuf:"); + exit(-1); + } + fflush(file->imageFile); + file->writeCount++; + return(0); +} +/*****************************************************************************/ + +/* **************************************************************************** + * short if_setPos(hwInterface* file,unsigned long address) + * Description: This function may or may not be required. It would set the write + * or read buffer offset by 512*address bytes from the beginning of the disc. + * Return value: Return 0 on success and -1 on failure. +*/ +esint8 if_setPos(hwInterface* file,euint32 address) +{ + if(address>(file->sectorCount-1)){ + DBG((TXT("Illegal address\n"))); + exit(-1); + } + if((fseek(file->imageFile,512*address,SEEK_SET))!=0){ + perror("cf_setPos:"); + exit(-1); + } + return(0); +} +/*****************************************************************************/ + diff --git a/poc/lpc2148_efsl/src/interfaces/lpc2000_spi.c b/poc/lpc2148_efsl/src/interfaces/lpc2000_spi.c new file mode 100644 index 0000000..23d4fa2 --- /dev/null +++ b/poc/lpc2148_efsl/src/interfaces/lpc2000_spi.c @@ -0,0 +1,291 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : lpc2000_spi.c * +* Description : This file contains the functions needed to use efs for * +* accessing files on an SD-card connected to an LPC2xxx. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2005 Martin Thomas * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "interfaces/LPC2000_regs.h" +#include "interfaces/arm_spi.h" +#include "interfaces/sd.h" +#include "config.h" +/*****************************************************************************/ + +#ifndef HW_ENDPOINT_LPC2000_SPINUM +#error "HW_ENDPOINT_LPC2000_SPINUM has to be defined in config.h" +#endif + +#if ( HW_ENDPOINT_LPC2000_SPINUM == 0 ) +// LPC213x ### SPI0 ### + +// SP0SPCR Bit-Definitions +#define CPHA 3 +#define CPOL 4 +#define MSTR 5 +// SP0SPSR Bit-Definitions +#define SPIF 7 + +#define SPI_IODIR IODIR0 +#define SPI_SCK_PIN 4 /* Clock P0.4 out */ +#define SPI_MISO_PIN 5 /* from Card P0.5 in */ +#define SPI_MOSI_PIN 6 /* to Card P0.6 out */ +#define SPI_SS_PIN 7 /* Card-Select P0.7 - GPIO out */ + +#define SPI_PINSEL PINSEL0 +#define SPI_SCK_FUNCBIT 8 +#define SPI_MISO_FUNCBIT 10 +#define SPI_MOSI_FUNCBIT 12 +#define SPI_SS_FUNCBIT 14 + +#define SPI_PRESCALE_REG S0SPCCR +#define SPI_PRESCALE_MIN 8 + +#define SELECT_CARD() IOCLR0 = (1<sectorCount=4; /* FIXME ASAP!! */ + + sd_getDriveSize(file, &sc); + file->sectorCount = sc/512; + if( (sc%512) != 0) { + file->sectorCount--; + } + DBG((TXT("Drive Size is %lu Bytes (%lu Sectors)\n"), sc, file->sectorCount)); + + /* increase speed after init */ +#if ( HW_ENDPOINT_LPC2000_SPINUM == 1 ) + SSPCR0 = ((8-1)<<0) | (0<sectorCount=4; /* FIXME ASAP!! */ + DBG((TXT("Init done...\n"))); + return(0); +} +/*****************************************************************************/ + +esint8 if_readBuf(hwInterface* file,euint32 address,euint8* buf) +{ + return(sd_readSector(file,address,buf,512)); +} +/*****************************************************************************/ + +esint8 if_writeBuf(hwInterface* file,euint32 address,euint8* buf) +{ + return(sd_writeSector(file,address, buf)); +} +/*****************************************************************************/ + +esint8 if_setPos(hwInterface* file,euint32 address) +{ + return(0); +} +/*****************************************************************************/ + +void if_spiInit(hwInterface *iface) +{ + euint8 i; + + printf("\n spi ini"); +} +/*****************************************************************************/ + +euint8 if_spiSend(hwInterface *iface, euint8 outgoing) +{ + euint8 incoming=0; + alt_u8 SD_Data=0,status; + + IOWR_ALTERA_AVALON_SPI_SLAVE_SEL(SD_SPI_BASE, 1 ); + /* Set the SSO bit (force chipselect) */ + IOWR_ALTERA_AVALON_SPI_CONTROL(SD_SPI_BASE, 0x400); + + do{ + status = IORD_ALTERA_AVALON_SPI_STATUS(SD_SPI_BASE);//get status + }while (((status & ALTERA_AVALON_SPI_STATUS_TRDY_MSK) == 0 ) && + (status & ALTERA_AVALON_SPI_STATUS_RRDY_MSK) == 0); + /* wait till transmit and ready ok */ + + IOWR_ALTERA_AVALON_SPI_TXDATA(SD_SPI_BASE, outgoing); + + /* Wait until the interface has finished transmitting */ + do{status = IORD_ALTERA_AVALON_SPI_STATUS(SD_SPI_BASE);} + while ((status & ALTERA_AVALON_SPI_STATUS_TMT_MSK) == 0); + + /* reciver ready */ + if (((status & 0x80) != 0) ){ + SD_Data = IORD_ALTERA_AVALON_SPI_RXDATA(SD_SPI_BASE); + } + else{ + printf("\n no recive after transmit"); + } + + IOWR_ALTERA_AVALON_SPI_SLAVE_SEL(SD_SPI_BASE, 1); + IOWR_ALTERA_AVALON_SPI_CONTROL(SD_SPI_BASE, 0); + + if( (status & 0x100) !=0) + printf("\n error in spi error in spi"); + + return (SD_Data); +} +/*****************************************************************************/ + diff --git a/poc/lpc2148_efsl/src/interfaces/sd.c b/poc/lpc2148_efsl/src/interfaces/sd.c new file mode 100644 index 0000000..11aa221 --- /dev/null +++ b/poc/lpc2148_efsl/src/interfaces/sd.c @@ -0,0 +1,350 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : sd.c * +* Revision : Initial developement * +* Description : This file contains the functions needed to use efs for * +* accessing files on an SD-card. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +* * +* in Driver-Size: use if_spiSend instead for sd_Resp8b as proposed in * +* sf.net bug-tracker (applied by mthomas) * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "interfaces/sd.h" +/*****************************************************************************/ + +esint8 sd_Init(hwInterface *iface) +{ + esint16 i; + euint8 resp; + + /* Try to send reset command up to 100 times */ + i=100; + do { + sd_Command(iface, 0, 0, 0); + resp=sd_Resp8b(iface); + } + while(resp!=1 && i--); + + if(resp!=1){ + DBG((TXT("CMD0 fail.\n"))); + if(resp==0xff){ + return(-1); + } + else{ + sd_Resp8bError(iface,resp); + return(-2); + } + } + + /* Wait till card is ready initialising (returns 0 on CMD1) */ + /* Try up to 32000 times. */ + i=32000; + do{ + sd_Command(iface,1, 0, 0); + + resp=sd_Resp8b(iface); + if(resp!=0) + sd_Resp8bError(iface,resp); + } + while(resp==1 && i--); + + if(resp!=0){ + sd_Resp8bError(iface,resp); + return(-3); + } + + return(0); +} +/*****************************************************************************/ + +void sd_Command(hwInterface *iface,euint8 cmd, euint16 paramx, euint16 paramy) +{ + if_spiSend(iface,0xff); + + if_spiSend(iface,0x40 | cmd); + if_spiSend(iface,(euint8) (paramx >> 8)); /* MSB of parameter x */ + if_spiSend(iface,(euint8) (paramx)); /* LSB of parameter x */ + if_spiSend(iface,(euint8) (paramy >> 8)); /* MSB of parameter y */ + if_spiSend(iface,(euint8) (paramy)); /* LSB of parameter y */ + + if_spiSend(iface,0x95); /* Checksum (should be only valid for first command (0) */ + + if_spiSend(iface,0xff); /* eat empty command - response */ +} +/*****************************************************************************/ + +euint8 sd_Resp8b(hwInterface *iface) +{ + euint8 i; + euint8 resp; + + /* Respone will come after 1 - 8 pings */ + for ( i=0; i<8; i++ ) { + resp = if_spiSend(iface,0xff); + if(resp != 0xff) + return(resp); + } + + return(resp); +} +/*****************************************************************************/ + +euint16 sd_Resp16b(hwInterface *iface) +{ + euint16 resp; + + resp = ( sd_Resp8b(iface) << 8 ) & 0xff00; + resp |= if_spiSend(iface,0xff); + + return(resp); +} +/*****************************************************************************/ + +void sd_Resp8bError(hwInterface *iface,euint8 value) +{ + switch(value) + { + case 0x40: + DBG((TXT("Argument out of bounds.\n"))); + break; + case 0x20: + DBG((TXT("Address out of bounds.\n"))); + break; + case 0x10: + DBG((TXT("Error during erase sequence.\n"))); + break; + case 0x08: + DBG((TXT("CRC failed.\n"))); + break; + case 0x04: + DBG((TXT("Illegal command.\n"))); + break; + case 0x02: + DBG((TXT("Erase reset (see SanDisk docs p5-13).\n"))); + break; + case 0x01: + DBG((TXT("Card is initialising.\n"))); + break; + default: + DBG((TXT("Unknown error 0x%x (see SanDisk docs p5-13).\n"),value)); + break; + } +} +/*****************************************************************************/ + +esint8 sd_State(hwInterface *iface) +{ + eint16 value; + + sd_Command(iface,13, 0, 0); + value=sd_Resp16b(iface); + + switch(value) + { + case 0x000: + return(1); + break; + case 0x0001: + DBG((TXT("Card is Locked.\n"))); + break; + case 0x0002: + DBG((TXT("WP Erase Skip, Lock/Unlock Cmd Failed.\n"))); + break; + case 0x0004: + DBG((TXT("General / Unknown error -- card broken?.\n"))); + break; + case 0x0008: + DBG((TXT("Internal card controller error.\n"))); + break; + case 0x0010: + DBG((TXT("Card internal ECC was applied, but failed to correct the data.\n"))); + break; + case 0x0020: + DBG((TXT("Write protect violation.\n"))); + break; + case 0x0040: + DBG((TXT("An invalid selection, sectors for erase.\n"))); + break; + case 0x0080: + DBG((TXT("Out of Range, CSD_Overwrite.\n"))); + break; + default: + if(value>0x00FF) + sd_Resp8bError(iface,(euint8) (value>>8)); + else + DBG((TXT("Unknown error: 0x%x (see SanDisk docs p5-14).\n"),value)); + break; + } + return(-1); +} +/*****************************************************************************/ + +/* **************************************************************************** + * WAIT ?? -- FIXME + * CMDWRITE + * WAIT + * CARD RESP + * WAIT + * DATA BLOCK OUT + * START BLOCK + * DATA + * CHKS (2B) + * BUSY... + */ + +esint8 sd_writeSector(hwInterface *iface,euint32 address, euint8* buf) +{ + euint32 place; + euint16 i; + euint16 t=0; + + /*DBG((TXT("Trying to write %u to sector %u.\n"),(void *)&buf,address));*/ + place=512*address; + sd_Command(iface,CMDWRITE, (euint16) (place >> 16), (euint16) place); + + sd_Resp8b(iface); /* Card response */ + + if_spiSend(iface,0xfe); /* Start block */ + for(i=0;i<512;i++) + if_spiSend(iface,buf[i]); /* Send data */ + if_spiSend(iface,0xff); /* Checksum part 1 */ + if_spiSend(iface,0xff); /* Checksum part 2 */ + + if_spiSend(iface,0xff); + + while(if_spiSend(iface,0xff)!=0xff){ + t++; + /* Removed NOP */ + } + /*DBG((TXT("Nopp'ed %u times.\n"),t));*/ + + return(0); +} +/*****************************************************************************/ + +/* **************************************************************************** + * WAIT ?? -- FIXME + * CMDCMD + * WAIT + * CARD RESP + * WAIT + * DATA BLOCK IN + * START BLOCK + * DATA + * CHKS (2B) + */ + +esint8 sd_readSector(hwInterface *iface,euint32 address, euint8* buf, euint16 len) +{ + euint8 cardresp; + euint8 firstblock; + euint8 c; + euint16 fb_timeout=0xffff; + euint32 i; + euint32 place; + + /*DBG((TXT("sd_readSector::Trying to read sector %u and store it at %p.\n"),address,&buf[0]));*/ + place=512*address; + sd_Command(iface,CMDREAD, (euint16) (place >> 16), (euint16) place); + + cardresp=sd_Resp8b(iface); /* Card response */ + + /* Wait for startblock */ + do + firstblock=sd_Resp8b(iface); + while(firstblock==0xff && fb_timeout--); + + if(cardresp!=0x00 || firstblock!=0xfe){ + sd_Resp8bError(iface,firstblock); + return(-1); + } + + for(i=0;i<512;i++){ + c = if_spiSend(iface,0xff); + if(iif_spiSend" + /* iob[i] = sd_Resp8b(iface); */ + iob[i] = if_spiSend(iface,0xff); + DBG((TXT(" %02x"), iob[i])); + } + DBG((TXT("\n"))); + + if_spiSend(iface,0xff); + if_spiSend(iface,0xff); + + c_size = iob[6] & 0x03; // bits 1..0 + c_size <<= 10; + c_size += (euint16)iob[7]<<2; + c_size += iob[8]>>6; + + by= iob[5] & 0x0F; + read_bl_len = 1; + read_bl_len <<= by; + + by=iob[9] & 0x03; + by <<= 1; + by += iob[10] >> 7; + + c_size_mult = 1; + c_size_mult <<= (2+by); + + *drive_size = (euint32)(c_size+1) * (euint32)c_size_mult * (euint32)read_bl_len; + + return 0; +} diff --git a/poc/lpc2148_efsl/src/ioman.c b/poc/lpc2148_efsl/src/ioman.c new file mode 100644 index 0000000..dca0a3b --- /dev/null +++ b/poc/lpc2148_efsl/src/ioman.c @@ -0,0 +1,611 @@ +/*****************************************************************************\ +* libfat - General purpose FAT library * +* ---------------------------------- * +* * +* Filename : ioman.c * +* Description : The IO Manager receives all requests for sectors in a central * +* allowing it to make smart decision regarding caching. * +* The IOMAN_NUMBUFFER parameter determines how many sectors * +* ioman can cache. ioman also supports overallocating and * +* backtracking sectors. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/* +* Revisions applied by Mike Anton: +* 06/05/26 - In ioman_writeSector(): return value of if_writeBuf() +* is zero if the function succeeded, but the test done is +* less than or equal to zero, so it always fails. +* 06/08/25 - In ioman_flushSector(): the test on ioman_writeSector() is +* incorrect now that ioman_writeSector() return value has +* been corrected. Interestingly the call to +* ioman_writeSector() in ioman_directSectorWrite() is correct. +*/ + +/*****************************************************************************/ +#include "ioman.h" +/*****************************************************************************/ + +esint8 ioman_init(IOManager *ioman, hwInterface *iface, euint8* bufferarea) +{ + ioman->iface=iface; + + ioman->bufptr = ioman_getBuffer(ioman,bufferarea); + ioman->numbuf = IOMAN_NUMBUFFER; + ioman->numit = IOMAN_NUMITERATIONS; + + ioman_reset(ioman); + return(0); +} +/*****************************************************************************/ + +void ioman_reset(IOManager *ioman) +{ + euint16 nb,ni; + + memClr(ioman->sector,sizeof(euint32)*ioman->numbuf); + memClr(ioman->status,sizeof(euint8) *ioman->numbuf); + memClr(ioman->usage ,sizeof(euint8) *ioman->numbuf); + memClr(ioman->itptr ,sizeof(euint8) *ioman->numbuf); + ioman_setError(ioman,IOMAN_NOERROR); + + for(nb=0;nbnumbuf;nb++){ + for(ni=0;ninumit;ni++){ + ioman->stack[nb][ni].sector=0; + ioman->stack[nb][ni].status=0; + ioman->stack[nb][ni].usage =0; + } + } +} +/*****************************************************************************/ + +euint8* ioman_getBuffer(IOManager *ioman,euint8* bufferarea) +{ +#ifdef IOMAN_DO_MEMALLOC + return(ioman->cache_mem); +#else + return(bufferarea); +#endif +} +/*****************************************************************************/ + +void ioman_setAttr(IOManager *ioman,euint16 bufplace,euint8 attribute,euint8 val) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_SETATTROUTOFBOUNDS); + return; /* Out of bounds */ + } + + if(val){ + ioman->status[bufplace]|=1<status[bufplace]&=~(1<=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_GETATTROUTOFBOUNDS); + return(0xFF); /* Out of bounds */ + } + + return(ioman->status[bufplace]&(1<=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_OPOUTOFBOUNDS); + return(0x00); + } + return(ioman->usage[bufplace]); +} +/*****************************************************************************/ + + +void ioman_incUseCnt(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_OPOUTOFBOUNDS); + return; + } + if(ioman->usage[bufplace]==0xFF)return; + else ioman->usage[bufplace]++; +} +/*****************************************************************************/ + +void ioman_decUseCnt(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_OPOUTOFBOUNDS); + return; + } + if(ioman->usage[bufplace]==0x0)return; + else ioman->usage[bufplace]--; +} +/*****************************************************************************/ + +void ioman_resetUseCnt(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_OPOUTOFBOUNDS); + return; + } + ioman->usage[bufplace]=0x00; +} +/*****************************************************************************/ + +euint8 ioman_getRefCnt(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_OPOUTOFBOUNDS); + return(0x00); + } + return(ioman->reference[bufplace]); +} +/*****************************************************************************/ + +void ioman_incRefCnt(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_OPOUTOFBOUNDS); + return; + } + if(ioman->reference[bufplace]==0xFF)return; + else ioman->reference[bufplace]++; +} +/*****************************************************************************/ + +void ioman_decRefCnt(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_OPOUTOFBOUNDS); + return; + } + if(ioman->reference[bufplace]==0x00)return; + else ioman->reference[bufplace]--; +} +/*****************************************************************************/ + +void ioman_resetRefCnt(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_OPOUTOFBOUNDS); + return; + } + ioman->reference[bufplace]=0x00; +} +/*****************************************************************************/ + +esint8 ioman_pop(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_POPEMPTYSTACK); + return(-1); + } + if(ioman->itptr[bufplace]==0 || ioman->itptr[bufplace]>IOMAN_NUMITERATIONS)return(-1); + ioman->sector[bufplace] = ioman->stack[bufplace][ioman->itptr[bufplace]].sector; + ioman->status[bufplace] = ioman->stack[bufplace][ioman->itptr[bufplace]].status; + ioman->usage[bufplace] = ioman->stack[bufplace][ioman->itptr[bufplace]].usage; + ioman->itptr[bufplace]--; + return(0); +} +/*****************************************************************************/ + +esint8 ioman_push(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_OPOUTOFBOUNDS); + return(-1); + } + if(ioman->itptr[bufplace]>=IOMAN_NUMITERATIONS){ + ioman_setError(ioman,IOMAN_ERR_PUSHBEYONDSTACK); + return(-1); + } + ioman->itptr[bufplace]++; + ioman->stack[bufplace][ioman->itptr[bufplace]].sector = ioman->sector[bufplace]; + ioman->stack[bufplace][ioman->itptr[bufplace]].status = ioman->status[bufplace]; + ioman->stack[bufplace][ioman->itptr[bufplace]].usage = ioman->usage[bufplace]; + return(0); +} +/*****************************************************************************/ + +euint8* ioman_getPtr(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_OPOUTOFBOUNDS); + return(0); + } + return(ioman->bufptr+bufplace*512); +} +/*****************************************************************************/ + +esint16 ioman_getBp(IOManager *ioman,euint8* buf) +{ + if(buf<(ioman->bufptr) || buf>=( ioman->bufptr+(ioman->numbuf*512) )){ + ioman_setError(ioman,IOMAN_ERR_CACHEPTROUTOFRANGE); + return(-1); + } + return((buf-(ioman->bufptr))/512); +} +/*****************************************************************************/ + +esint8 ioman_readSector(IOManager *ioman,euint32 address,euint8* buf) +{ + esint8 r; + + if(buf==0){ + return(-1); + } + + r=if_readBuf(ioman->iface,address,buf); + + if(r!=0){ + ioman_setError(ioman,IOMAN_ERR_READFAIL); + return(-1); + } + return(0); +} +/*****************************************************************************/ + +esint8 ioman_writeSector(IOManager *ioman, euint32 address, euint8* buf) +{ + esint8 r; + + if(buf==0)return(-1); + + r=if_writeBuf(ioman->iface,address,buf); + +#warning "M. Anton: Unofficial ioman_writeSector() patch active if(r<=0){ -> if(r!=0){" + // if(r<=0){ + if(r!=0){ + + ioman_setError(ioman,IOMAN_ERR_WRITEFAIL); + return(-1); + } + return(0); +} +/*****************************************************************************/ + +void ioman_resetCacheItem(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_OPOUTOFBOUNDS); + return; + } + ioman->sector[bufplace] = 0; + ioman->status[bufplace] = 0; + ioman->usage[bufplace] = 0; + ioman->reference[bufplace] = 0; +} +/*****************************************************************************/ + +esint32 ioman_findSectorInCache(IOManager *ioman, euint32 address) +{ + euint16 c; + + for(c=0;cnumbuf;c++){ + if(ioman_isValid(c) && ioman->sector[c] == address)return(c); + } + return(-1); +} +/*****************************************************************************/ + +esint32 ioman_findFreeSpot(IOManager *ioman) +{ + euint16 c; + + for(c=0;cnumbuf;c++){ + if(!ioman_isValid(c))return(c); + } + return(-1); +} +/*****************************************************************************/ + +esint32 ioman_findUnusedSpot(IOManager *ioman) +{ + esint32 r=-1; + euint16 c; + euint8 fr=0,lr=0xFF; + + for(c=0;cnumbuf;c++){ + if(ioman_getUseCnt(ioman,c)==0){ + if(!ioman_isWritable(c) && !fr){ + fr=1; + lr=0xFF; + r=-1; + } + if(ioman_isWritable(c) && !fr){ + if(ioman_getRefCnt(ioman,c)<=lr){ + r=c; + lr=ioman_getRefCnt(ioman,c); + } + } + if(fr && !ioman_isWritable(c)){ + if(ioman_getRefCnt(ioman,c)<=lr){ + r=c; + lr=ioman_getRefCnt(ioman,c); + } + } + } + } + return(r); +} +/*****************************************************************************/ + +esint32 ioman_findOverallocableSpot(IOManager *ioman) +{ + euint8 points,lp=0xFF; + euint16 c; + esint32 r=-1; + + for(c=0;cnumbuf;c++){ + if(ioman->itptr[c]numit){ + points = 0; + if(ioman_isWritable(c))points+=0x7F; + points += ((euint16)(ioman->itptr[c]*0x4D))/(ioman->numit); + points += ((euint16)(ioman_getRefCnt(ioman,c)*0x33))/0xFF; + if(pointssector[bufplace]=address; + return(0); +} +/***************** if(bufplace>=ioman->numbuf)return; +************************************************************/ + +esint8 ioman_flushSector(IOManager *ioman, euint16 bufplace) +{ + euint8* buf; + + if((buf = ioman_getPtr(ioman,bufplace))==0){ + ioman_setError(ioman,IOMAN_ERR_CACHEPTROUTOFRANGE); + return(-1); + } + if(!ioman_isWritable(bufplace)){ + ioman_setError(ioman,IOMAN_ERR_WRITEREADONLYSECTOR); + return(-1); + } + +#warning "M. Anton: Unofficial ioman_flushSector() patch active - ioman_writeSector() test was incorrect" + // if(!(ioman_writeSector(ioman,ioman->sector[bufplace],buf))){ + if(ioman_writeSector(ioman,ioman->sector[bufplace],buf)){ + ioman_setError(ioman,IOMAN_ERR_WRITEFAIL); + return(-1); + } + if(ioman->usage==0)ioman_setNotWritable(bufplace); + return(0); +} +/*****************************************************************************/ + +esint8 ioman_flushRange(IOManager *ioman,euint32 address_low, euint32 address_high) +{ + euint32 c; + + if(address_low>address_high){ + c=address_low; address_low=address_high;address_high=c; + } + + for(c=0;cnumbuf;c++){ + if((ioman->sector[c]>=address_low) && (ioman->sector[c]<=address_high) && (ioman_isWritable(c))){ + if(ioman_flushSector(ioman,c)){ + return(-1); + } + if(ioman->usage[c]==0)ioman_setNotWritable(c); + } + } + return(0); +} +/*****************************************************************************/ + +esint8 ioman_flushAll(IOManager *ioman) +{ + euint16 c; + + for(c=0;cnumbuf;c++){ + if(ioman_isWritable(c)){ + if(ioman_flushSector(ioman,c)){ + return(-1); + } + if(ioman->usage[c]==0)ioman_setNotWritable(c); + } + } + return(0); +} +/*****************************************************************************/ + +euint8* ioman_getSector(IOManager *ioman,euint32 address, euint8 mode) +{ + esint32 bp; + + if((bp=ioman_findSectorInCache(ioman,address))!=-1){ + if(ioman_isReqRw(mode)){ + ioman_setWritable(bp); + } + ioman_incUseCnt(ioman,bp); + if(!ioman_isReqExp(mode))ioman_incRefCnt(ioman,bp); + return(ioman_getPtr(ioman,bp)); + } + + if((bp=ioman_findFreeSpot(ioman))==-1){ + if(((bp=ioman_findUnusedSpot(ioman))!=-1)&&(ioman_isWritable(bp))){ + ioman_flushSector(ioman,bp); + } + } + + if(bp!=-1){ + ioman_resetCacheItem(ioman,bp); + if((ioman_putSectorInCache(ioman,address,bp))){ + return(0); + } + if(mode==IOM_MODE_READWRITE){ + ioman_setWritable(bp); + } + ioman_incUseCnt(ioman,bp); + if(!ioman_isReqExp(mode))ioman_incRefCnt(ioman,bp); + return(ioman_getPtr(ioman,bp)); + } + + if((bp=ioman_findOverallocableSpot(ioman))!=-1){ + if(ioman_isWritable(bp)){ + ioman_flushSector(ioman,bp); + } + if(ioman_push(ioman,bp)){ + return(0); + } + ioman_resetCacheItem(ioman,bp); + if((ioman_putSectorInCache(ioman,address,bp))){ + return(0); + } + if(ioman_isReqRw(mode)){ + ioman_setWritable(bp); + } + ioman_incUseCnt(ioman,bp); + if(!ioman_isReqExp(mode))ioman_incRefCnt(ioman,bp); + return(ioman_getPtr(ioman,bp)); + } + ioman_setError(ioman,IOMAN_ERR_NOMEMORY); + return(0); +} +/*****************************************************************************/ + +esint8 ioman_releaseSector(IOManager *ioman,euint8* buf) +{ + euint16 bp; + + bp=ioman_getBp(ioman,buf); + ioman_decUseCnt(ioman,bp); + + if(ioman_getUseCnt(ioman,bp)==0 && ioman->itptr[bp]!=0){ + if(ioman_isWritable(bp)){ + ioman_flushSector(ioman,bp); + } + ioman_pop(ioman,bp); + ioman_putSectorInCache(ioman,ioman->sector[bp],bp); + } + return(0); +} +/*****************************************************************************/ + +esint8 ioman_directSectorRead(IOManager *ioman,euint32 address, euint8* buf) +{ + euint8* ibuf; + esint16 bp; + + if((bp=ioman_findSectorInCache(ioman,address))!=-1){ + ibuf=ioman_getPtr(ioman,bp); + memCpy(ibuf,buf,512); + return(0); + } + + if((bp=ioman_findFreeSpot(ioman))!=-1){ + if((ioman_putSectorInCache(ioman,address,bp))){ + return(-1); + } + ibuf=ioman_getPtr(ioman,bp); + memCpy(ibuf,buf,512); + return(0); + } + + if(ioman_readSector(ioman,address,buf)){ + return(-1); + } + + return(0); +} +/*****************************************************************************/ + +esint8 ioman_directSectorWrite(IOManager *ioman,euint32 address, euint8* buf) +{ + euint8* ibuf; + esint16 bp; + + if((bp=ioman_findSectorInCache(ioman,address))!=-1){ + ibuf=ioman_getPtr(ioman,bp); + memCpy(buf,ibuf,512); + ioman_setWritable(bp); + return(0); + } + + if((bp=ioman_findFreeSpot(ioman))!=-1){ + ibuf=ioman_getPtr(ioman,bp); + memCpy(buf,ibuf,512); + ioman_resetCacheItem(ioman,bp); + ioman->sector[bp]=address; + ioman_setWritable(bp); + ioman_setValid(bp); + return(0); + } + + if(ioman_writeSector(ioman,address,buf)){ + return(-1); + } + + return(0); +} +/*****************************************************************************/ + +void ioman_printStatus(IOManager *ioman) +{ + euint16 c; + + DBG((TXT("IO-Manager -- Report\n====================\n"))); + DBG((TXT("Buffer is %i sectors, from %p to %p\n"), + ioman->numbuf,ioman->bufptr,ioman->bufptr+(ioman->numbuf*512))); + for(c=0;cnumbuf;c++){ + if(ioman_isValid(c)){ + DBG((TXT("BP %3i\t SC %8li\t\t US %i\t RF %i\t %s %s\n"), + c,ioman->sector[c],ioman_getUseCnt(ioman,c),ioman_getRefCnt(ioman,c), + ioman_isUserBuf(c) ? "USRBUF" : " ", + ioman_isWritable(c) ? "WRITABLE" : "READONLY")); + } + } +} +/*****************************************************************************/ + diff --git a/poc/lpc2148_efsl/src/ioman_v2.c b/poc/lpc2148_efsl/src/ioman_v2.c new file mode 100644 index 0000000..82001d2 --- /dev/null +++ b/poc/lpc2148_efsl/src/ioman_v2.c @@ -0,0 +1,402 @@ +/*****************************************************************************\ +* libfat - General purpose FAT library * +* ---------------------------------- * +* * +* Filename : ioman.c * +* Description : The IO Manager receives all requests for sectors in a central * +* allowing it to make smart decision regarding caching. * +* The IOMAN_NUMBUFFER parameter determines how many sectors * +* ioman can cache. ioman also supports overallocating and * +* backtracking sectors * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "ioman_v2.h" +/*****************************************************************************/ + +esint8 ioman_init(IOManager *ioman, hwInterface *iface, euint8* bufferarea) +{ + ioman->iface=iface; + + ioman->bufptr = ioman_getBuffer(ioman,bufferarea); + ioman->numbuf = IOMAN_NUMBUFFER; + ioman->numit = IOMAN_NUMITERATIONS; + + ioman_reset(ioman); + return(0); +} + +void ioman_reset(IOManager *ioman) +{ + euint16 nb,ni; + + memClr(ioman->sector,sizeof(euint32)*ioman->numbuf); + memClr(ioman->status,sizeof(euint8) *ioman->numbuf); + memClr(ioman->usage ,sizeof(euint8) *ioman->numbuf); + memClr(ioman->itptr ,sizeof(euint8) *ioman->numbuf); + + for(nb=0;nbnumbuf;nb++){ + for(ni=0;ninumit;ni++){ + ioman->stack[nb][ni].sector=0; + ioman->stack[nb][ni].status=0; + ioman->stack[nb][ni].usage =0; + } + } +} + +euint8* ioman_getBuffer(IOManager *ioman,euint8* bufferarea) +{ + static euint8 buf[512 * IOMAN_NUMBUFFER]; + return(buf); +} + +void ioman_setAttr(IOManager *ioman,euint16 bufplace,euint8 attribute,euint8 val) +{ + if(bufplace>=ioman->numbuf)return; /* Out of bounds */ + + if(val){ + ioman->status[bufplace]|=1<status[bufplace]&=~(1<=ioman->numbuf) + return(0xFF); /* Out of bounds */ + + return(ioman->status[bufplace]&(1<=ioman->numbuf)return(0x00); + return(ioman->usage[bufplace]); +} + +void ioman_incUseCnt(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf)return; + if(ioman->usage[bufplace]==0xFF)return; + else ioman->usage[bufplace]++; +} + +void ioman_decUseCnt(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf)return; + if(ioman->usage[bufplace]==0x0)return; + else ioman->usage[bufplace]--; +} + +void ioman_resetUseCnt(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf)return; + ioman->usage[bufplace]=0x00; +} + +euint8 ioman_getRefCnt(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf)return(0x00); + return(ioman->reference[bufplace]); +} + +void ioman_incRefCnt(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf)return; + if(ioman->reference[bufplace]==0xFF)return; + else ioman->reference[bufplace]++; +} + +void ioman_decRefCnt(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf)return; + if(ioman->reference[bufplace]==0x00)return; + else ioman->reference[bufplace]--; +} + +void ioman_resetRefCnt(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf)return; + ioman->reference[bufplace]=0x00; +} + +esint8 ioman_pop(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf)return(-1); + if(ioman->itptr[bufplace]==0 || ioman->itptr[bufplace]>IOMAN_NUMITERATIONS)return(-1); + ioman->sector[bufplace] = ioman->stack[bufplace][ioman->itptr[bufplace]].sector; + ioman->status[bufplace] = ioman->stack[bufplace][ioman->itptr[bufplace]].status; + ioman->usage[bufplace] = ioman->stack[bufplace][ioman->itptr[bufplace]].usage; + ioman->itptr[bufplace]--; + return(0); +} + +esint8 ioman_push(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf)return(-1); + if(ioman->itptr[bufplace]>=IOMAN_NUMITERATIONS)return(-1); + ioman->itptr[bufplace]++; + ioman->stack[bufplace][ioman->itptr[bufplace]].sector = ioman->sector[bufplace]; + ioman->stack[bufplace][ioman->itptr[bufplace]].status = ioman->status[bufplace]; + ioman->stack[bufplace][ioman->itptr[bufplace]].usage = ioman->usage[bufplace]; + return(0); +} + +euint8* ioman_getPtr(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf)return(0); + return(ioman->bufptr+bufplace*512); +} + +esint16 ioman_getBp(IOManager *ioman,euint8* buf) +{ + if(buf<(ioman->bufptr) || buf>=( ioman->bufptr+(ioman->numbuf*512) )){ + return(-1); + } + return((buf-(ioman->bufptr))/512); +} + +esint8 ioman_readSector(IOManager *ioman,euint32 address,euint8* buf) +{ + esint8 r; + + /*DBG((TXT("ioman_readSector::Requesting address %u to be put in %p.\n"),address,buf));*/ + if(buf==0){ + /*DBG((TXT("Refused to read sector, buf=0\n")));*/ + return(-1); + } + + r=if_readBuf(ioman->iface,address,buf); + + if(r!=0){ + return(-1); + } + return(0); +} + +esint8 ioman_writeSector(IOManager *ioman, euint32 address, euint8* buf) +{ + esint8 r; + + if(buf==0)return(-1); + + r=if_writeBuf(ioman->iface,address,buf); + + if(r<=0){ + return(-1); + } + return(0); +} + +void ioman_resetCacheItem(IOManager *ioman,euint16 bufplace) +{ + ioman->sector[bufplace] = 0; + ioman->status[bufplace] = 0; + ioman->usage[bufplace] = 0; + ioman->reference[bufplace] = 0; +} + +esint32 ioman_findSectorInCache(IOManager *ioman, euint32 address) +{ + euint16 c; + + for(c=0;cnumbuf;c++){ + if(ioman_isValid(c) && ioman->sector[c] == address)return(c); + } + return(-1); +} + +esint32 ioman_findFreeSpot(IOManager *ioman) +{ + euint16 c; + + for(c=0;cnumbuf;c++){ + if(!ioman_isValid(c))return(c); + } + return(-1); +} + +esint32 ioman_findUnusedSpot(IOManager *ioman) +{ + esint32 r=-1; + euint16 c; + euint8 fr=0,lr=0xFF; + + for(c=0;cnumbuf;c++){ + if(ioman_getUseCnt(ioman,c)==0){ + if(!ioman_isWritable(c) && !fr){ + fr=1; + lr=0xFF; + r=-1; + } + if(ioman_isWritable(c) && !fr){ + if(ioman_getRefCnt(ioman,c)<=lr){ + r=c; + lr=ioman_getRefCnt(ioman,c); + } + } + if(fr && !ioman_isWritable(c)){ + if(ioman_getRefCnt(ioman,c)<=lr){ + r=c; + lr=ioman_getRefCnt(ioman,c); + } + } + } + } + return(r); +} + +esint32 ioman_findOverallocableSpot(IOManager *ioman) +{ + euint8 points,lp=0xFF; + euint16 c; + esint32 r=-1; + + for(c=0;cnumbuf;c++){ + if(ioman->itptr[c]numit){ + points = 0; + if(ioman_isWritable(c))points+=0x7F; + points += ((euint16)(ioman->itptr[c]*0x4D))/(ioman->numit); + points += ((euint16)(ioman_getRefCnt(ioman,c)*0x33))/0xFF; + if(pointssector[bufplace]=address; + return(0); +} + +esint8 ioman_flushSector(IOManager *ioman, euint16 bufplace) +{ + euint8* buf; + + if((buf = ioman_getPtr(ioman,bufplace))==0)return(-1); + if(!ioman_isWritable(bufplace))return(-1); + if(!(ioman_writeSector(ioman,ioman->sector[bufplace],buf)))return(-1); + return(0); +} + +euint8* ioman_getSector(IOManager *ioman,euint32 address, euint8 mode) +{ + esint32 bp; + + if((bp=ioman_findSectorInCache(ioman,address))!=-1){ + if(mode==IOM_MODE_READWRITE){ + ioman_setWritable(bp); + } + ioman_incUseCnt(ioman,bp); + ioman_incRefCnt(ioman,bp); + return(ioman_getPtr(ioman,bp)); + } + + if((bp=ioman_findFreeSpot(ioman))==-1){ + if(((bp=ioman_findUnusedSpot(ioman))!=-1)&&(ioman_isWritable(bp))){ + ioman_flushSector(ioman,bp); + } + } + + if(bp!=-1){ + ioman_resetCacheItem(ioman,bp); + if((ioman_putSectorInCache(ioman,address,bp))){ + return(0); + } + if(mode==IOM_MODE_READWRITE){ + ioman_setWritable(bp); + } + ioman_incUseCnt(ioman,bp); + ioman_incRefCnt(ioman,bp); + return(ioman_getPtr(ioman,bp)); + } + + if((bp=ioman_findOverallocableSpot(ioman))!=-1){ + if(ioman_isWritable(bp)){ + ioman_flushSector(ioman,bp); + } + if(ioman_push(ioman,bp)){ + return(0); + } + ioman_resetCacheItem(ioman,bp); + if((ioman_putSectorInCache(ioman,address,bp))){ + return(0); + } + if(mode==IOM_MODE_READWRITE){ + ioman_setWritable(bp); + } + ioman_incUseCnt(ioman,bp); + ioman_incRefCnt(ioman,bp); + return(ioman_getPtr(ioman,bp)); + } + return(0); +} + +esint8 ioman_releaseSector(IOManager *ioman,euint8* buf) +{ + euint16 bp; + + bp=ioman_getBp(ioman,buf); + ioman_decUseCnt(ioman,bp); + + if(ioman_getUseCnt(ioman,bp)==0 && ioman->itptr!=0){ + if(ioman_isWritable(bp)){ + ioman_flushSector(ioman,bp); + } + ioman_pop(ioman,bp); + ioman_putSectorInCache(ioman,ioman->sector[bp],bp); + } + return(0); +} + + +void ioman_printStatus(IOManager *ioman) +{ + euint16 c; + + DBG((TXT("IO-Manager -- Report\n====================\n\n"))); + DBG((TXT("Buffer is %i sectors, from %p to %p\n"), + ioman->numbuf,ioman->bufptr,ioman->bufptr+(ioman->numbuf*512))); + for(c=0;cnumbuf;c++){ + if(ioman_isValid(c)){ + DBG((TXT("BP %3i\t SC %i\t\t US %i\t RF %i\t %s %s\n"), + c,ioman->sector[c],ioman_getUseCnt(ioman,c),ioman_getRefCnt(ioman,c), + ioman_isUserBuf(c) ? "USRBUF" : " ", + ioman_isWritable(c) ? "WRITABLE" : "READONLY")); + } + } +} diff --git a/poc/lpc2148_efsl/src/ls.c b/poc/lpc2148_efsl/src/ls.c new file mode 100644 index 0000000..a116868 --- /dev/null +++ b/poc/lpc2148_efsl/src/ls.c @@ -0,0 +1,140 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : ls.c * +* Description : This file contains functions to list the files in a directory * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "ls.h" +/*****************************************************************************/ + +esint8 ls_openDir(DirList *dlist,FileSystem *fs,eint8* dirname) +{ + FileLocation loc; + euint32 fc; + + dlist->fs=fs; + + if(fs_findFile(dlist->fs,dirname,&loc,&fc)!=2) + { + return(-1); + } + + fs_initClusterChain(dlist->fs,&(dlist->Cache),fc); + memClr(&(dlist->currentEntry),sizeof(dlist->currentEntry)); + dlist->rEntry=0; + dlist->cEntry=0xFFFF; + + return(0); +} +/*****************************************************************************/ + +esint8 ls_getDirEntry(DirList *dlist) +{ + if(dlist->Cache.FirstCluster == 1){ + return(ls_getRootAreaEntry(dlist)); + }else if(dlist->Cache.FirstCluster){ + return(ls_getRealDirEntry(dlist)); + } + return(-1); +} +/*****************************************************************************/ + +esint8 ls_getNext(DirList *dlist) +{ + do{ + if(ls_getDirEntry(dlist))return(-1); + dlist->rEntry++; + }while(!ls_isValidFileEntry(&(dlist->currentEntry))); + dlist->cEntry++; + return(0); +} +/*****************************************************************************/ + +esint8 ls_getRealDirEntry(DirList *dlist) +{ + euint8* buf; + + if(dlist->Cache.FirstCluster<=1)return(-1); + + if(fat_LogicToDiscCluster(dlist->fs, + &(dlist->Cache), + (dlist->rEntry)/(16 * dlist->fs->volumeId.SectorsPerCluster))){ + return(-1); + } + + buf = part_getSect(dlist->fs->part, + fs_clusterToSector(dlist->fs,dlist->Cache.DiscCluster) + (dlist->rEntry/16)%dlist->fs->volumeId.SectorsPerCluster, + IOM_MODE_READONLY); + + /*memCpy(buf+(dlist->rEntry%16)*32,&(dlist->currentEntry),32);*/ + ls_fileEntryToDirListEntry(dlist,buf,32*(dlist->rEntry%16)); + + part_relSect(dlist->fs->part,buf); + + return(0); +} +/*****************************************************************************/ + +esint8 ls_getRootAreaEntry(DirList *dlist) +{ + euint8 *buf=0; + + if((dlist->fs->type != FAT12) && (dlist->fs->type != FAT16))return(-1); + if(dlist->rEntry>=dlist->fs->volumeId.RootEntryCount)return(-1); + + buf = part_getSect(dlist->fs->part, + dlist->fs->FirstSectorRootDir+dlist->rEntry/16, + IOM_MODE_READONLY); + /*memCpy(buf+32*(dlist->rEntry%16),&(dlist->currentEntry),32);*/ + ls_fileEntryToDirListEntry(dlist,buf,32*(dlist->rEntry%16)); + part_relSect(dlist->fs->part,buf); + return(0); +} +/*****************************************************************************/ + +esint8 ls_isValidFileEntry(ListDirEntry *entry) +{ + if(entry->FileName[0] == 0 || entry->FileName[0] == 0xE5 || entry->FileName[0] == '.')return(0); + if((entry->Attribute&0x0F)==0x0F)return(0); + return(1); +} +/*****************************************************************************/ + +void ls_fileEntryToDirListEntry(DirList *dlist, euint8* buf, euint16 offset) +{ + if(offset>480 || offset%32)return; + + buf+=offset; + memCpy(buf+OFFSET_DE_FILENAME,dlist->currentEntry.FileName,LIST_MAXLENFILENAME); + dlist->currentEntry.Attribute = *(buf+OFFSET_DE_ATTRIBUTE); + dlist->currentEntry.FileSize = ex_getb32(buf,OFFSET_DE_FILESIZE); +} +/*****************************************************************************/ + diff --git a/poc/lpc2148_efsl/src/mkfs.c b/poc/lpc2148_efsl/src/mkfs.c new file mode 100644 index 0000000..b2ef194 --- /dev/null +++ b/poc/lpc2148_efsl/src/mkfs.c @@ -0,0 +1,301 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : mkfs.c * +* Description : These functions are used for creating an empty filesystem. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +* * +* mthomas: testing: alignment modifications for arm-elf-gcc * +* - should be portable * +\*****************************************************************************/ + +#define MT_MOD + +/*****************************************************************************/ +#include "mkfs.h" +/*****************************************************************************/ + +#ifndef MT_MOD +signed short mkfs_makevfat(Partition *part) +{ + unsigned long c,cc,ret; + unsigned long ns,fs,ds,dc; + unsigned char buf[512]; + + ns=part->disc->partitions[part->activePartition].numSectors; + + if( ns < 66581 ){ + DBG((TXT("This is not possible due to insufficient sectors. Sorry\n"))); + return(MKFS_ERR_TOOLITTLESECTORS); + } + + ret=0; + + for(c=1<<6;c>=1;c>>=1){ + + /* First guess */ + ds = ns - 32; + fs = ((ds/c)+127)/128; + /* ds was guess too large, so fs is too large now too. */ + + for(cc=0;cc<2;cc++){ + + /* Round 2, error round */ + ds = ns - 32 - 2*fs; + fs = ((ds/c)+127)/128; + /* Since fs was too large, ds became too small. So the fs for this small ds is too small as well. */ + + /* Round 3, correction round */ + ds = ns - 32 - 2*fs; + fs = ((ds/c)+127)/128; + /* The fs was too small, so ds was too large. The calculated fs should be slightly too large. */ + + } + + /* Round 4, finalise */ + ds = ns - 32 - 2*fs; + + dc = ds / c; + if(ret<(fs*128-dc)/128)ret=(fs*128-dc)/128; + + /* Check if with current setting we have a valid fat ? */ + + if(dc >= 65525 + 16){ + break; + } + } + + /* Generate BPB */ + memClr(buf,512); + + /* Boot code */ + *(buf+0)=0xE9; *(buf+1)=0x00; *(buf+2)=0x00; /* RESET */ + + /* OEM name */ + memCpy("DSCOSMSH",buf+3,8); + + /* Bytes/Sector */ + *((unsigned short*)(buf+11)) = 512; + + /* Sectors/Cluster */ + *(buf+13) = c; + + /* Reserved Sectors */ + *((unsigned short*)(buf+14)) = 32; + + /* Number of FAT Tables */ + *(buf+16) = 2; + + /* RootEntryCount */ + *((unsigned short*)(buf+17)) = 0; + + /* Total Sector Count __16 */ + *((unsigned short*)(buf+19)) = 0; + + /* Media (crap) */ + *(buf+21) = 0xF8; + + /* FAT size 16 */ + *((unsigned short*)(buf+22)) = 0; + + /* Total Sector Count __32 */ + *((unsigned long*)(buf+32)) = ns; + + /* Fat Size 32 */ + *((unsigned long*)(buf+36)) = fs; + + /* First Cluster Root Dir */ + *((unsigned long*)(buf+44)) = 2; + + /* VolumeID */ + *((unsigned long*)(buf+67)) = 0x13371337; + + /* Volume Label */ + memCpy("DISCOSMASH!",buf+71,11); + + /* Filesystemtype */ + memCpy("FAT32 ",buf+82,8); + + /* Magic */ + *(buf+510) = 0x55; *(buf+511) = 0xAA; + + part_writeBuf(part,0,buf); + + memClr(buf,512); + for(c=32;c<(32+2*fs);c++){ + part_writeBuf(part,c,buf); + } + *(((unsigned long*)buf) )=0x0FFFFFF8; + *(((unsigned long*)buf)+1)=0x0FFFFFFF; + *(((unsigned long*)buf)+2)=0x0FFFFFF8; + part_writeBuf(part,32,buf); + part_writeBuf(part,32+fs,buf); + + return(0); +} + + +#else +#warning "mthomas - modifications alignment" + +signed short mkfs_makevfat(Partition *part) +{ + unsigned long c,cc,ret; + unsigned long ns,fs,ds,dc; + unsigned char buf[512]; + + ns=part->disc->partitions[part->activePartition].numSectors; + + if( ns < 66581 ){ + DBG((TXT("This is not possible due to insufficient sectors. Sorry\n"))); + return(MKFS_ERR_TOOLITTLESECTORS); + } + + ret=0; + + for(c=1<<6;c>=1;c>>=1){ + + /* First guess */ + ds = ns - 32; + fs = ((ds/c)+127)/128; + /* ds was guess too large, so fs is too large now too. */ + + for(cc=0;cc<2;cc++){ + + /* Round 2, error round */ + ds = ns - 32 - 2*fs; + fs = ((ds/c)+127)/128; + /* Since fs was too large, ds became too small. So the fs for this small ds is too small as well. */ + + /* Round 3, correction round */ + ds = ns - 32 - 2*fs; + fs = ((ds/c)+127)/128; + /* The fs was too small, so ds was too large. The calculated fs should be slightly too large. */ + + } + + /* Round 4, finalise */ + ds = ns - 32 - 2*fs; + + dc = ds / c; + if(ret<(fs*128-dc)/128)ret=(fs*128-dc)/128; + + /* Check if with current setting we have a valid fat ? */ + + if(dc >= 65525 + 16){ + break; + } + } + + /* Generate BPB */ + memClr(buf,512); + + /* Boot code */ + *(buf+0)=0xE9; *(buf+1)=0x00; *(buf+2)=0x00; /* RESET */ + + /* OEM name */ + memCpy("DSCOSMSH",buf+3,8); + + /* Bytes/Sector */ + // mtmt *((unsigned short*)(buf+11)) = 512; + ex_setb16(buf, 11, 512); + + /* Sectors/Cluster */ + *(buf+13) = c; + + /* Reserved Sectors */ + // mtmt *((unsigned short*)(buf+14)) = 32; + ex_setb16(buf, 14, 32); + + /* Number of FAT Tables */ + *(buf+16) = 2; + + /* RootEntryCount */ + // mtmt *((unsigned short*)(buf+17)) = 0; + ex_setb16(buf, 17, 0); + + /* Total Sector Count __16 */ + // mtmt *((unsigned short*)(buf+19)) = 0; + ex_setb16(buf, 19, 0); + + /* Media (crap) */ + *(buf+21) = 0xF8; + + /* FAT size 16 */ + // mtmt *((unsigned short*)(buf+22)) = 0; + ex_setb16(buf, 22, 0); + + /* Total Sector Count __32 */ + // mtmt *((unsigned long*)(buf+32)) = ns; + ex_setb32(buf, 32, ns); + + /* Fat Size 32 */ + // mtmt *((unsigned long*)(buf+36)) = fs; + ex_setb32(buf, 26, fs); + + /* First Cluster Root Dir */ + // mtmt *((unsigned long*)(buf+44)) = 2; + ex_setb32(buf, 44, 2); + + /* VolumeID */ + // mtmt *((unsigned long*)(buf+67)) = 0x13371337; + ex_setb32(buf, 67, 0x13371337); + + /* Volume Label */ + memCpy("DISCOSMASH!",buf+71,11); + + /* Filesystemtype */ + memCpy("FAT32 ",buf+82,8); + + /* Magic */ + *(buf+510) = 0x55; *(buf+511) = 0xAA; + + part_writeBuf(part,0,buf); + + memClr(buf,512); + for(c=32;c<(32+2*fs);c++){ + part_writeBuf(part,c,buf); + } + + /* mtmt + *(((unsigned long*)buf) )=0x0FFFFFF8; + *(((unsigned long*)buf)+1)=0x0FFFFFFF; + *(((unsigned long*)buf)+2)=0x0FFFFFF8; + */ + ex_setb32(buf, 0, 0x0FFFFFF8); + ex_setb32(buf, 4, 0x0FFFFFFF); + ex_setb32(buf, 8, 0x0FFFFFF8); + + + part_writeBuf(part,32,buf); + part_writeBuf(part,32+fs,buf); + + return(0); +} + +#endif + diff --git a/poc/lpc2148_efsl/src/partition.c b/poc/lpc2148_efsl/src/partition.c new file mode 100644 index 0000000..ecbf97c --- /dev/null +++ b/poc/lpc2148_efsl/src/partition.c @@ -0,0 +1,152 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : partition.c * +* Description : These functions are partition specific. Searching FAT type * +* partitions and read/write functions to partitions. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "partition.h" +/*****************************************************************************/ + +/* **************************************************************************** + * void part_initPartition(Partition *part,Disc* refDisc) + * Description: This function searches the 4 partitions for a FAT class partition + * and marks the first one found as the active to be used partition. +*/ +void part_initPartition(Partition *part,Disc* refDisc) +{ + eint16 c; + + part->disc=refDisc; + part->activePartition=-1; /* No partition selected */ + part_setError(part,PART_NOERROR); + for(c=3;c>=0;c--){ + if(part_isFatPart(part->disc->partitions[c].type)) + part->activePartition=c; + } +} +/*****************************************************************************/ + + +/* **************************************************************************** + * eint16 part_isFatPart(euint8 type) + * Description: This functions checks if a partitiontype (eint8) is of the FAT + * type in the broadest sense. I + * Return value: If it is FAT, returns 1, otherwise 0. +*/ +eint16 part_isFatPart(euint8 type) +{ + if(type == PT_FAT12 || + type == PT_FAT16A || + type == PT_FAT16 || + type == PT_FAT32 || + type == PT_FAT32A || + type == PT_FAT16B ) + { + return(1); + } + return(0); +} +/*****************************************************************************/ + +esint8 part_readBuf(Partition *part, euint32 address, euint8* buf) +{ + return(if_readBuf(part->disc->ioman->iface,part_getRealLBA(part,address), buf)); +} + +/* **************************************************************************** + * eint16 part_writeBuf(Partition *part,euint32 address,euint8* buf) + * Description: This function writes 512 bytes, from buf. It's offset is address + * sectors from the beginning of the partition. + * Return value: It returns whatever the hardware function returns. (-1=error) +*/ +eint16 part_writeBuf(Partition *part,euint32 address,euint8* buf) +{ + /*DBG((TXT("part_writeBuf :: %li\n"),address));*/ + return(if_writeBuf(part->disc->ioman->iface,part_getRealLBA(part,address),buf)); +} +/*****************************************************************************/ + + +/* **************************************************************************** + * euint32 part_getRealLBA(Partition *part,euint32 address) + * Description: This function calculates what the partition offset for + * a partition is + the address. + * Return value: Sector address. +*/ +euint32 part_getRealLBA(Partition *part,euint32 address) +{ + return(part->disc->partitions[part->activePartition].LBA_begin+address); +} +/*****************************************************************************/ + +/* **************************************************************************** + * euint8* part_getSect(Partition *part, euint32 address, euint8 mode) + * Description: This function calls ioman_getSector, but recalculates the sector + * address to be partition relative. + * Return value: Whatever getSector returns. (pointer or 0) +*/ +euint8* part_getSect(Partition *part, euint32 address, euint8 mode) +{ + return(ioman_getSector(part->disc->ioman,part_getRealLBA(part,address),mode)); +} + +/* **************************************************************************** + * esint8 part_relSect(Partition *part, euint8* buf) + * Description: This function calls ioman_releaseSector. + * Return value: Whatever releaseSector returns. +*/ +esint8 part_relSect(Partition *part, euint8* buf) +{ + return(ioman_releaseSector(part->disc->ioman,buf)); +} + +esint8 part_flushPart(Partition *part,euint32 addr_l, euint32 addr_h) +{ + return( + ioman_flushRange(part->disc->ioman,part_getRealLBA(part,addr_l),part_getRealLBA(part,addr_h)) + ); +} + +esint8 part_directSectorRead(Partition *part,euint32 address, euint8* buf) +{ + return( + ioman_directSectorRead(part->disc->ioman,part_getRealLBA(part,address),buf) + ); +} + +esint8 part_directSectorWrite(Partition *part,euint32 address, euint8* buf) +{ + return( + ioman_directSectorWrite(part->disc->ioman,part_getRealLBA(part,address),buf) + ); +} + + diff --git a/poc/lpc2148_efsl/src/plibc.c b/poc/lpc2148_efsl/src/plibc.c new file mode 100644 index 0000000..6c0db11 --- /dev/null +++ b/poc/lpc2148_efsl/src/plibc.c @@ -0,0 +1,82 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : plibc.c * +* Description : This file contains replacements of common c library functions * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "plibc.h" +/*****************************************************************************/ + +/* **************************************************************************** + * unsigned short strMatch(char* bufa, char*bufb, unsigned long n) + * Description: Compares bufa and bufb for a length of n bytes. + * Return value: Returns the number of character NOT matching. +*/ +euint16 strMatch(eint8* bufa, eint8*bufb,euint32 n) +{ + euint32 c; + euint16 res=0; + for(c=0;c0){ + *((eint8*)pdest+size-1)=*((eint8*)psrc+size-1); + size--; + } +} +/*****************************************************************************/ + +void memClr(void *pdest,euint32 size) +{ + while(size>0){ + *(((eint8*)pdest)+size-1)=0x00; + size--; + } +} + +void memSet(void *pdest,euint32 size,euint8 data) +{ + while(size>0){ + *(((eint8*)pdest)+size-1)=data; + size--; + } +} + + diff --git a/poc/lpc2148_efsl/src/regressiontest.c b/poc/lpc2148_efsl/src/regressiontest.c new file mode 100644 index 0000000..2a4ccac --- /dev/null +++ b/poc/lpc2148_efsl/src/regressiontest.c @@ -0,0 +1,352 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : regressiontest.c * +* Description : This file contains a regressiontest (obsolete) * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include +#include +#include "config.h" +#include "interfaces/helper.h" +#include "interfaces/linuxfile.h" +#include "disc.h" +#include "partition.h" +#include "fs.h" +#include "file.h" +#include "mkfs.h" +#include "ioman.h" +#include "debug.h" +#include "extract.h" +#include "plibc.h" +/*****************************************************************************/ + +int main(int argc, char** argv) +{ + hwInterface *lfile=0; + IOManager *ioman=0; + Disc *disc=0; + Partition *part=0; + FileSystem *fs=0; + File *fr=0; + File *fw=0; + FILE *out=0; + unsigned char buf[4096]; + + int c,r,ir; + + /*debug_init();*/ + + switch(argv[1][0]){ + case '0': + lfile = malloc(sizeof(*lfile)); + ioman = malloc(sizeof(*ioman)); + disc = malloc(sizeof(*disc)); + part = malloc(sizeof(*part)); + + if_initInterface(lfile,"regtest.16"); + ioman_init(ioman,lfile,0); + disc_initDisc(disc,ioman); + memClr(disc->partitions,sizeof(PartitionField)*4); + disc->partitions[0].type=0x0B; + disc->partitions[0].LBA_begin=0; + disc->partitions[0].numSectors=lfile->sectorCount; + part_initPartition(part,disc); + + fs = malloc(sizeof(*fs)); + if( (fs_initFs(fs,part)) != 0){ + printf("Unable to init the filesystem\n"); + return(-1); + } + + fr = malloc(sizeof(*fr)); + if ( (file_fopen(fr,fs,"file.r",MODE_READ)) != 0){ + printf("Unable to open the file file.r\n"); + return(-1); + } + + out=fopen("REG_FILE_16_OUT","w"); + + c=0; + while( (r=file_fread(fr,c,4096,buf)) != 0){ + c+=r; + fwrite(buf,r,1,out); + } + file_fclose(fr); + fclose(out); + fs_umount(fs); + break; + + case '1': + + lfile = malloc(sizeof(*lfile)); + ioman = malloc(sizeof(*ioman)); + disc = malloc(sizeof(*disc)); + part = malloc(sizeof(*part)); + + if_initInterface(lfile,"regtest.32"); + ioman_init(ioman,lfile,0); + disc_initDisc(disc,ioman); + memClr(disc->partitions,sizeof(PartitionField)*4); + disc->partitions[0].type=0x0B; + disc->partitions[0].LBA_begin=0; + disc->partitions[0].numSectors=lfile->sectorCount; + part_initPartition(part,disc); + + fs = malloc(sizeof(*fs)); + if( (fs_initFs(fs,part)) != 0){ + printf("Unable to init the filesystem\n"); + return(-1); + } + fr = malloc(sizeof(*fr)); + if ( (file_fopen(fr,fs,"file.r",MODE_READ)) != 0){ + printf("Unable to open the file file.r\n"); + return(-1); + } + + out=fopen("REG_FILE_32_OUT","w"); + + c=0; + while( (r=file_fread(fr,c,4096,buf)) != 0){ + c+=r; + fwrite(buf,r,1,out); + } + file_fclose(fr); + fclose(out); + fs_umount(fs); + + break; + + case '2': + + lfile = malloc(sizeof(*lfile)); + ioman = malloc(sizeof(*ioman)); + disc = malloc(sizeof(*disc)); + part = malloc(sizeof(*part)); + fs = malloc(sizeof(*fs)); + fr = malloc(sizeof(*fr)); + fw = malloc(sizeof(*fw)); + + if_initInterface(lfile,"regtestrw.32"); + ioman_init(ioman,lfile,0); + disc_initDisc(disc,ioman); + memClr(disc->partitions,sizeof(PartitionField)*4); + disc->partitions[0].type=0x0B; + disc->partitions[0].LBA_begin=0; + disc->partitions[0].numSectors=lfile->sectorCount; + part_initPartition(part,disc); + + fs = malloc(sizeof(*fs)); + if( (fs_initFs(fs,part)) != 0){ + printf("Unable to init the filesystem\n"); + return(-1); + } + + if((file_fopen(fr,fs,"file.r",'r'))!=0){ + printf("Unable to open %s for reading...\n","file.r"); + exit(0); + } + if((file_fopen(fw,fs,"file.w",'w'))!=0){ + printf("Unable to open %s for writing...\n","file.w"); + exit(0); + } + + ir = atoi(argv[2]); + + while((r = file_read(fr,ir,buf))>0){ + file_write(fw,r,buf); + } + + file_fclose(fr); + file_fclose(fw); + + if((file_fopen(fr,fs,"file.w",'r'))!=0){ + printf("Unable to open %s for reading...\n","file.w"); + exit(0); + } + + out=fopen("REG_FILE_RW32_OUT","w"); + + while((r = file_read(fr,ir/2+3,buf))>0){ + fwrite(buf,1,r,out); + } + + fclose(out); + file_fclose(fr); + fs_umount(fs); + + break; + + case '3': + lfile = malloc(sizeof(*lfile)); + ioman = malloc(sizeof(*ioman)); + disc = malloc(sizeof(*disc)); + part = malloc(sizeof(*part)); + + if_initInterface(lfile,"regtest.12"); + ioman_init(ioman,lfile,0); + disc_initDisc(disc,ioman); + memClr(disc->partitions,sizeof(PartitionField)*4); + disc->partitions[0].type=0x0B; + disc->partitions[0].LBA_begin=0; + disc->partitions[0].numSectors=lfile->sectorCount; + part_initPartition(part,disc); + + fs = malloc(sizeof(*fs)); + if( (fs_initFs(fs,part)) != 0){ + printf("Unable to init the filesystem\n"); + return(-1); + } + + fr = malloc(sizeof(*fr)); + if ( (file_fopen(fr,fs,"file.r",MODE_READ)) != 0){ + printf("Unable to open the file file.r\n"); + return(-1); + } + + out=fopen("REG_FILE_12_OUT","w"); + + c=0; + while( (r=file_fread(fr,c,4096,buf)) != 0){ + c+=r; + fwrite(buf,r,1,out); + } + file_fclose(fr); + fclose(out); + fs_umount(fs); + + break; + + case '4': + + lfile = malloc(sizeof(*lfile)); + ioman = malloc(sizeof(*ioman)); + disc = malloc(sizeof(*disc)); + part = malloc(sizeof(*part)); + fs = malloc(sizeof(*fs)); + fr = malloc(sizeof(*fr)); + fw = malloc(sizeof(*fw)); + + if_initInterface(lfile,"regtestrw.12"); + ioman_init(ioman,lfile,0); + disc_initDisc(disc,ioman); + memClr(disc->partitions,sizeof(PartitionField)*4); + disc->partitions[0].type=0x0B; + disc->partitions[0].LBA_begin=0; + disc->partitions[0].numSectors=lfile->sectorCount; + part_initPartition(part,disc); + + fs = malloc(sizeof(*fs)); + if( (fs_initFs(fs,part)) != 0){ + printf("Unable to init the filesystem\n"); + return(-1); + } + + if((file_fopen(fr,fs,"file.r",'r'))!=0){ + printf("Unable to open %s for reading...\n","file.r"); + exit(0); + } + if((file_fopen(fw,fs,"file.w",'w'))!=0){ + printf("Unable to open %s for writing...\n","file.w"); + exit(0); + } + + ir = atoi(argv[2]); + + while((r = file_read(fr,ir,buf))>0){ + file_write(fw,r,buf); + } + + fflush(stdout); + + file_fclose(fr); + file_fclose(fw); + + if((file_fopen(fr,fs,"file.w",'r'))!=0){ + printf("Unable to open %s for reading...\n","file.w"); + exit(0); + } + + out=fopen("REG_FILE_RW12_OUT","w"); + + while((r = file_read(fr,ir/2+3,buf))>0){ + fwrite(buf,1,r,out); + } + + fclose(out); + file_fclose(fr); + fs_umount(fs); + + break; + + default: + printf("Unknown test\n"); + + } + return(0); +} +/*****************************************************************************/ + +euint16 efsl_getYear(void) +{ + return(2005); +} +/*****************************************************************************/ + +euint8 efsl_getMonth(void) +{ + return(5); +} +/*****************************************************************************/ + +euint8 efsl_getDay(void) +{ + return(11); +} +/*****************************************************************************/ + +euint8 efsl_getHour(void) +{ + return(13); +} +/*****************************************************************************/ + +euint8 efsl_getMinute(void) +{ + return(14); +} +/*****************************************************************************/ + +euint8 efsl_getSecond(void) +{ + return(40); +} +/*****************************************************************************/ + + diff --git a/poc/lpc2148_efsl/src/time.c b/poc/lpc2148_efsl/src/time.c new file mode 100644 index 0000000..1c79409 --- /dev/null +++ b/poc/lpc2148_efsl/src/time.c @@ -0,0 +1,89 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : time.c * +* Description : This file contains functions for time support * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "time.h" +#include "fs.h" +/*****************************************************************************/ + +euint16 fs_makeDate(void) +{ +#ifndef DATE_TIME_SUPPORT + return(0); +#else + euint8 m,d; + euint16 y; + + y = time_getYear()-1980; + m = time_getMonth(); + d = time_getDay(); + + return( + (y>127?127<<9:(y&0x3F)<<9) | + ((m==0||m>12)?1:(m&0xF)<<5) | + ((d==0||d>31)?1:(d&0x1F)) + ); +#endif +} +/*****************************************************************************/ + +euint16 fs_makeTime(void) +{ +#ifndef DATE_TIME_SUPPORT + return(0); +#else + euint8 s,m,h; + + s = time_getSecond(); + m = time_getMinute(); + h = time_getHour(); + + return( + (h>23?0:(h&0x1F)<<11) | + (m>59?0:(m&0x3F)<<5) | + (s>59?0:(s-s%2)/2) + ); +#endif +} +/*****************************************************************************/ + +euint8 fs_hasTimeSupport(void) +{ +#ifdef DATE_TIME_SUPPORT + return(1); +#else + return(0); +#endif +} +/*****************************************************************************/ + + diff --git a/poc/lpc2148_efsl/src/ui.c b/poc/lpc2148_efsl/src/ui.c new file mode 100644 index 0000000..9d2c13b --- /dev/null +++ b/poc/lpc2148_efsl/src/ui.c @@ -0,0 +1,230 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : ui.c * +* Description : This file contains functions which will be presented to the * +* user of this library. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * + * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "ui.h" +/*****************************************************************************/ + +/***************************************************************************** + * short listfiles(char *dir) + * + * Deschription: This function returns the number of files / directories + * inside the given directory. + * + * Return value: number of files/directories in the given directory or -1 + * if directory does not exist. +\*****************************************************************************/ + +short listFiles(FileSystem *fs, char *dirname) +{ + unsigned long startCluster; + unsigned char fileEntryCount; + unsigned short counter=0; + unsigned long offset=0; + FileRecord fileEntry; + FileLocation loc; + unsigned char buf[512]; + File dir; + unsigned short i; + + /* Find out if we are searching in the root dir or in */ + if(dirname[0]=='/' && dirname[1]=='\0') + { + if( (fs->type == FAT12) || (fs->type == FAT16) ) + { + for(i=0;i<=(fs->volumeId.RootEntryCount/16);i++) + { + loc.Sector=fs->FirstSectorRootDir + i; + part_readBuf(fs->part,loc.Sector,buf); + /* I STOPPED HERE*/ + /* FIXME */ + } + } + } + else /* Normal directory */ + { + /* Check if path given is a directory */ + if(fs_findFile(fs,dirname,&loc,0)!=2) + { + FUNC_OUT((TXT(""))); + return(-1); + } + + /* Find out what the startcluster of the directory is */ + part_readBuf(fs->part,loc.Sector, buf); + fileEntry = *(((FileRecord*)buf) + loc.Offset); + startCluster = (((unsigned long)fileEntry.FirstClusterHigh)<<16) + + fileEntry.FirstClusterLow; + + /* Init of dir */ + dir.fs=fs; + dir.Cache.LogicCluster=-1; + dir.Cache.FirstCluster=startCluster; + dir.DirEntry.Attribute=ATTR_DIRECTORY; + + while((file_fread(&dir,offset,512,buf))) + { + DBG((TXT("Read 512 bytes from dir with offset %li.\n"),offset)); + for(fileEntryCount=0;fileEntryCount<16;fileEntryCount++) + { + fileEntry = *(((FileRecord*)buf) + fileEntryCount); + if( !( (fileEntry.Attribute & 0x0F) == 0x0F ) ) + { + if + ( + (fileEntry.FileName[0]>='A' && fileEntry.FileName[0]<='Z') + || + (fileEntry.FileName[0]>='0' && fileEntry.FileName[0]<='9') + ) + { + DBG((TXT("Filename: %s\n"),fileEntry.FileName)); + counter++; + } + } + } + offset+=512; + } + } + + FUNC_OUT((TXT(""))); + return(counter); + + return(-1); +} +/*****************************************************************************/ + +/* **************************************************************************** + * esint16 rmfile(FileSystem *fs,euint8* filename) + * Description: This function takes a filename as argument and deletes it, + * by freeing it's clusterchain, and deleting it's entry from the directory. + * Return value: 0 on success, -1 on errors, like file not found. +*/ +esint16 rmfile(FileSystem *fs,euint8* filename) +{ + FileLocation loc; + ClusterChain cache; + euint8* buf; + euint32 firstCluster=0; + + if((fs_findFile(fs,(eint8*)filename,&loc,0))==1){ + buf=part_getSect(fs->part,loc.Sector,IOM_MODE_READWRITE); + firstCluster = ex_getb16(buf,loc.Offset*32+20); + firstCluster <<= 16; + firstCluster += ex_getb16(buf,loc.Offset*32+26); + /* Bugfix: + * By clearing the entire structure, you mark end of directory. + * If this is not the case, files that are further away cannot + * be opened anymore by implementations that follow the spec. */ + /*memClr(buf+(loc.Offset*32),32);*/ + *(buf+(loc.Offset*32)+0) = 0xE5; /* Mark file deleted */ + part_relSect(fs->part,buf); + cache.DiscCluster = cache.LastCluster = cache.Linear = cache.LogicCluster = 0; + cache.FirstCluster = firstCluster; + fat_unlinkClusterChain(fs,&cache); + return(0); + } + return(-1); +} + +/*****************************************************************************/ +esint8 mkdir(FileSystem *fs,eint8* dirname) +{ + FileLocation loc; + FileRecord direntry; + euint32 nc,parentdir; + euint8* buf; + eint8 ffname[11]; + + if( fs_findFile(fs,dirname,&loc,&parentdir) ){ + return(-1); + } + if(parentdir==0)return(-2); + + if(!fs_findFreeFile(fs,dirname,&loc,0))return(-3); + + /* You may never search for a free cluster, and the call + * functions that may cause changes to the FAT table, that + * is why getNextFreeCluster has to be called AFTER calling + * fs_findFreeFile, which may have to expand a directory in + * order to store the new filerecord !! + */ + + nc = fs_getNextFreeCluster(fs,fs_giveFreeClusterHint(fs)); + if(nc==0)return(0); + + fs_clearCluster(fs,nc); + + buf = part_getSect(fs->part,loc.Sector,IOM_MODE_READWRITE); + + dir_getFatFileName(dirname,ffname); + memClr(&direntry,sizeof(direntry)); + memCpy(ffname,&direntry,11); + direntry.FileSize = 0; + direntry.FirstClusterHigh=nc>>16; + direntry.FirstClusterLow=nc&0xFFFF; + direntry.Attribute = ATTR_DIRECTORY; + memCpy(&direntry,buf+(32*loc.Offset),32); + + part_relSect(fs->part,buf); + + buf = part_getSect(fs->part,fs_clusterToSector(fs,nc),IOM_MODE_READWRITE); + + memClr(&direntry,sizeof(direntry)); + memCpy(". ",&direntry,11); + direntry.Attribute = ATTR_DIRECTORY; + direntry.FileSize = 0; + direntry.FirstClusterHigh=nc>>16; + direntry.FirstClusterLow=nc&0xFFFF; + memCpy(&direntry,buf,32); + + if(fs->type == FAT32 && parentdir == fs->volumeId.RootCluster){ + parentdir = 0; + } + if(fs->type != FAT32 && parentdir<=1){ + parentdir = 0; + } + + memClr(&direntry,sizeof(direntry)); + memCpy(".. ",&direntry,11); + direntry.Attribute = ATTR_DIRECTORY; + direntry.FileSize = 0; + direntry.FirstClusterHigh=parentdir>>16; + direntry.FirstClusterLow=parentdir&0xFFFF; + memCpy(&direntry,buf+32,32); + + part_relSect(fs->part,buf); + + fat_setNextClusterAddress(fs,nc,fat_giveEocMarker(fs)); + + return(0); +} diff --git a/poc/lpc2148_efsl/test/Makefile b/poc/lpc2148_efsl/test/Makefile new file mode 100644 index 0000000..c08bbda --- /dev/null +++ b/poc/lpc2148_efsl/test/Makefile @@ -0,0 +1,437 @@ +# +# Changelog: +# - 17. Feb. 2005 - added thumb-interwork support (mth) +# - 28. Apr. 2005 - added C++ support (mth) +# - 29. Arp. 2005 - changed handling for lst-Filename (mth) +# - 15. Nov. 2005 - added library-search-path (EXTRA_LIBDIRS) +# + +FLASH_TOOL = ULINK + +# 0 - standalone: compiler with efsl sources +# 1 - use libefsl.a +EFSL_AS_LIB = 1 + + +# MCU name and submodel +MCU = arm7tdmi +SUBMDL = LPC2138 +#THUMB = -mthumb +#THUMB_IW = -mthumb-interwork + + +## Create ROM-Image (final) +RUN_MODE=ROM_RUN +## Create RAM-Image (debugging) +#RUN_MODE=RAM_RUN + + +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + + +# Target file name (without extension). +TARGET = main + + +# List C source files here. (C dependencies are automatically generated.) +# use file-extension c for "c-only"-files +SRC = $(TARGET).c +SRC += uart.c startup.c + +ifeq ($(EFSL_AS_LIB),0) +SRC += ../src/efs.c ../src/plibc.c ../src/disc.c ../src/partition.c +SRC += ../src/time.c ../src/fs.c ../src/fat.c ../src/file.c ../src/dir.c ../src/ls.c +SRC += ../src/mkfs.c ../src/debug.c ../src/ioman.c ../src/ui.c ../src/extract.c +SRC += ../src/interfaces/sd.c +SRC += ../src/interfaces/efsl_dbg_printf_arm.c +SRC += ../src/interfaces/lpc2000_spi.c +endif + +# List C source files here which must be compiled in ARM-Mode. +# use file-extension c for "c-only"-files +SRCARM = + +# List C++ source files here. +# use file-extension cpp for C++-files +CPPSRC = + +# List C++ source files here which must be compiled in ARM-Mode. +# use file-extension cpp for C++-files +#CPPSRCARM = $(TARGET).cpp +CPPSRCARM = + +# List Assembler source files here. +# Make them always end in a capital .S. Files ending in a lowercase .s +# will not be considered source files but generated files (assembler +# output from the compiler), and will be deleted upon "make clean"! +# Even though the DOS/Win* filesystem matches both .s and .S the same, +# it will preserve the spelling of the filenames, and gcc itself does +# care about how the name is spelled on its command-line. +ASRC = + +# List Assembler source files here which must be assembled in ARM-Mode.. +ASRCARM = crt.s + +# Optimization level, can be [0, 1, 2, 3, s]. +# 0 = turn off optimization. s = optimize for size. +# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) +OPT = s +#OPT = 0 + +# Debugging format. +# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2. +# AVR (extended) COFF requires stabs, plus an avr-objcopy run. +DEBUG = stabs +#DEBUG = dwarf-2 + +# List any extra directories to look for include files here. +# Each directory must be seperated by a space. +EXTRAINCDIRS = ../inc ../conf + + +ifeq ($(EFSL_AS_LIB),1) + +# List any extra directories to look for library files here. +# Each directory must be seperated by a space. +EXTRA_LIBDIRS = -L../ +# extra libraries ( to add libxyz.a and libabc.a: -lxyz -labc ) +EXTRA_LIBS = -lefsl + +endif + + +# Compiler flag to set the C Standard level. +# c89 - "ANSI" C +# gnu89 - c89 plus GCC extensions +# c99 - ISO C99 standard (not yet fully implemented) +# gnu99 - c99 plus GCC extensions +CSTANDARD = -std=gnu99 + +# Place -D or -U options for C here +CDEFS = -D$(RUN_MODE) + +# Place -I options here +CINCS = + +# Place -D or -U options for ASM here +ADEFS = -D$(RUN_MODE) + + +# Compiler flags. +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +# +# Flags for C and C++ (arm-elf-gcc/arm-elf-g++) +CFLAGS = -g$(DEBUG) +CFLAGS += $(CDEFS) $(CINCS) +CFLAGS += -O$(OPT) +CFLAGS += -Wall -Wcast-align -Wcast-qual -Wimplicit +CFLAGS += -Wpointer-arith -Wswitch +CFLAGS += -Wredundant-decls -Wreturn-type -Wshadow -Wunused +CFLAGS += -Wa,-adhlns=$(subst $(suffix $<),.lst,$<) +CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) + +# flags only for C +CONLYFLAGS = -Wstrict-prototypes -Wmissing-declarations +CONLYFLAGS += -Wmissing-prototypes -Wnested-externs +CONLYFLAGS += $(CSTANDARD) + +# flags only for C++ (arm-elf-g++) +# CPPFLAGS = -fno-rtti -fno-exceptions +CPPFLAGS = + +# Assembler flags. +# -Wa,...: tell GCC to pass this to the assembler. +# -ahlms: create listing +# -gstabs: have the assembler create line number information; note that +# for use in COFF files, additional information about filenames +# and function names needs to be present in the assembler source +# files -- see avr-libc docs [FIXME: not yet described there] +##ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs +ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:.S=.lst),-g$(DEBUG) + +#Additional libraries. + +#Support for newlibc-lpc (file: libnewlibc-lpc.a) +#NEWLIBLPC = -lnewlib-lpc + +MATH_LIB = -lm + +#CPLUSPLUS_LIB = -lstdc++ + +# Linker flags. +# -Wl,...: tell GCC to pass this to linker. +# -Map: create map file +# --cref: add cross reference to map file +LDFLAGS = -nostartfiles -Wl,-Map=$(TARGET).map,--cref +LDFLAGS += -lc +LDFLAGS += $(NEWLIBLPC) $(MATH_LIB) +LDFLAGS += -lc -lgcc +LDFLAGS += $(CPLUSPLUS_LIB) +LDFLAGS += $(EXTRA_LIBS) +LDFLAGS += $(EXTRA_LIBDIRS) + +# Set Linker-Script Depending On Selected Memory +#ifeq ($(RUN_MODE),RAM_RUN) +#äLDFLAGS +=-T$(SUBMDL)-RAM.ld +#else +#LDFLAGS +=-T$(SUBMDL)-ROM.ld +#endif +LDFLAGS +=-Tlpc2148-rom.ld + + + +# --------------------------------------------------------------------------- +# Flash-Programming support using lpc21isp by Martin Maurer + +# Settings and variables: +#LPC21ISP = lpc21isp +LPC21ISP = lpc21isp +LPC21ISP_PORT = com1 +LPC21ISP_BAUD = 38400 +LPC21ISP_XTAL = 12000 +LPC21ISP_FLASHFILE = $(TARGET).hex +# verbose output: +#LPC21ISP_DEBUG = -debug +# enter bootloader via RS232 DTR/RTS (only if hardware supports this +# feature - see Philips AppNote): +LPC21ISP_CONTROL = -control + + +# --------------------------------------------------------------------------- + +# Define directories, if needed. +## DIRARM = c:/WinARM/ +## DIRARMBIN = $(DIRAVR)/bin/ +## DIRAVRUTILS = $(DIRAVR)/utils/bin/ + +# Define programs and commands. +SHELL = sh +CC = arm-elf-gcc +CPP = arm-elf-g++ +OBJCOPY = arm-elf-objcopy +OBJDUMP = arm-elf-objdump +SIZE = arm-elf-size +NM = arm-elf-nm +REMOVE = rm -f +COPY = cp + + +# Define Messages +# English +MSG_ERRORS_NONE = Errors: none +MSG_BEGIN = -------- begin -------- +MSG_END = -------- end -------- +MSG_SIZE_BEFORE = Size before: +MSG_SIZE_AFTER = Size after: +MSG_FLASH = Creating load file for Flash: +MSG_EXTENDED_LISTING = Creating Extended Listing: +MSG_SYMBOL_TABLE = Creating Symbol Table: +MSG_LINKING = Linking: +MSG_COMPILING = Compiling C: +MSG_COMPILING_ARM = "Compiling C (ARM-only):" +MSG_COMPILINGCPP = Compiling C++: +MSG_COMPILINGCPP_ARM = "Compiling C++ (ARM-only):" +MSG_ASSEMBLING = Assembling: +MSG_ASSEMBLING_ARM = "Assembling (ARM-only):" +MSG_CLEANING = Cleaning project: +MSG_LPC21_RESETREMINDER = You may have to bring the target in bootloader-mode now. + + +# Define all object files. +COBJ = $(SRC:.c=.o) +AOBJ = $(ASRC:.S=.o) +COBJARM = $(SRCARM:.c=.o) +AOBJARM = $(ASRCARM:.S=.o) +CPPOBJ = $(CPPSRC:.cpp=.o) +CPPOBJARM = $(CPPSRCARM:.cpp=.o) + +# Define all listing files. +LST = $(ASRC:.S=.lst) $(ASRCARM:.S=.lst) $(SRC:.c=.lst) $(SRCARM:.c=.lst) +LST += $(CPPSRC:.cpp=.lst) $(CPPSRCARM:.cpp=.lst) + +# Compiler flags to generate dependency files. +### GENDEPFLAGS = -Wp,-M,-MP,-MT,$(*F).o,-MF,.dep/$(@F).d +GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mcpu=$(MCU) $(THUMB_IW) -I. $(CFLAGS) $(GENDEPFLAGS) +ALL_ASFLAGS = -mcpu=$(MCU) $(THUMB_IW) -I. -x assembler-with-cpp $(ASFLAGS) + + +# Default target. +all: begin gccversion sizebefore build sizeafter finished end + +build: elf hex lss sym bin + +elf: $(TARGET).elf +hex: $(TARGET).hex +lss: $(TARGET).lss +sym: $(TARGET).sym +bin: $(TARGET).bin + +# Eye candy. +begin: + @echo + @echo $(MSG_BEGIN) + +finished: + @echo $(MSG_ERRORS_NONE) + +end: + @echo $(MSG_END) + @echo + + +# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex +ELFSIZE = $(SIZE) -A $(TARGET).elf +sizebefore: + @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi + +sizeafter: + @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi + + +# Display compiler version information. +gccversion : + @$(CC) --version + + +ifeq ($(FLASH_TOOL),ULINK) +# Program the device with Keil's ULINK (needs configured uVision-Workspace). +program: $(TARGET).hex + @echo + @echo "Programming with ULINK" + C:\Keil\uv3\Uv3.exe -f ulinkflash.Uv2 -oulinkflash.txt +else +# Program the device. +program: $(TARGET).hex + @echo + @echo $(MSG_LPC21_RESETREMINDER) + $(LPC21ISP) $(LPC21ISP_CONTROL) $(LPC21ISP_DEBUG) $(LPC21ISP_FLASHFILE) $(LPC21ISP_PORT) $(LPC21ISP_BAUD) $(LPC21ISP_XTAL) +endif + +# Create final output files (.hex, .eep) from ELF output file. +# TODO: handling the .eeprom-section should be redundant +%.hex: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O $(FORMAT) $< $@ + +%.bin: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O binary $< $@ + +# Create extended listing file from ELF output file. +# testing: option -C +%.lss: %.elf + @echo + @echo $(MSG_EXTENDED_LISTING) $@ + $(OBJDUMP) -h -S -C $< > $@ + + +# Create a symbol table from ELF output file. +%.sym: %.elf + @echo + @echo $(MSG_SYMBOL_TABLE) $@ + $(NM) -n $< > $@ + + +# Link: create ELF output file from object files. +.SECONDARY : $(TARGET).elf +.PRECIOUS : $(AOBJARM) $(AOBJ) $(COBJARM) $(COBJ) $(CPPOBJ) $(CPPOBJARM) +%.elf: $(AOBJARM) $(AOBJ) $(COBJARM) $(COBJ) $(CPPOBJ) $(CPPOBJARM) + @echo + @echo $(MSG_LINKING) $@ + $(CC) $(THUMB) $(ALL_CFLAGS) $(AOBJARM) $(AOBJ) $(COBJARM) $(COBJ) $(CPPOBJ) $(CPPOBJARM) --output $@ $(LDFLAGS) +# $(CPP) $(THUMB) $(ALL_CFLAGS) $(AOBJARM) $(AOBJ) $(COBJARM) $(COBJ) $(CPPOBJ) $(CPPOBJARM) --output $@ $(LDFLAGS) + +# Compile: create object files from C source files. ARM/Thumb +$(COBJ) : %.o : %.c + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(THUMB) $(ALL_CFLAGS) $(CONLYFLAGS) $< -o $@ + +# Compile: create object files from C source files. ARM-only +$(COBJARM) : %.o : %.c + @echo + @echo $(MSG_COMPILING_ARM) $< + $(CC) -c $(ALL_CFLAGS) $(CONLYFLAGS) $< -o $@ + +# Compile: create object files from C++ source files. ARM/Thumb +$(CPPOBJ) : %.o : %.cpp + @echo + @echo $(MSG_COMPILINGCPP) $< + $(CPP) -c $(THUMB) $(ALL_CFLAGS) $(CPPFLAGS) $< -o $@ + +# Compile: create object files from C++ source files. ARM-only +$(CPPOBJARM) : %.o : %.cpp + @echo + @echo $(MSG_COMPILINGCPP_ARM) $< + $(CPP) -c $(ALL_CFLAGS) $(CPPFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. ARM/Thumb +## does not work - TODO - hints welcome +##$(COBJ) : %.s : %.c +## $(CC) $(THUMB) -S $(ALL_CFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. ARM/Thumb +$(AOBJ) : %.o : %.S + @echo + @echo $(MSG_ASSEMBLING) $< + $(CC) -c $(THUMB) $(ALL_ASFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. ARM-only +$(AOBJARM) : %.o : %.S + @echo + @echo $(MSG_ASSEMBLING_ARM) $< + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + + +# Target: clean project. +clean: begin clean_list finished end + + +clean_list : + @echo + @echo $(MSG_CLEANING) + $(REMOVE) $(TARGET).hex + $(REMOVE) $(TARGET).obj + $(REMOVE) $(TARGET).elf + $(REMOVE) $(TARGET).map + $(REMOVE) $(TARGET).obj + $(REMOVE) $(TARGET).a90 + $(REMOVE) $(TARGET).sym + $(REMOVE) $(TARGET).lnk + $(REMOVE) $(TARGET).lss + $(REMOVE) $(COBJ) + $(REMOVE) $(CPPOBJ) + $(REMOVE) $(AOBJ) + $(REMOVE) $(COBJARM) + $(REMOVE) $(CPPOBJARM) + $(REMOVE) $(SRC:.c=.d) + $(REMOVE) $(SRCARM:.c=.d) + $(REMOVE) $(CPPSRC:.cpp=.d) + $(REMOVE) $(CPPSRCARM:.cpp=.d) + $(REMOVE) .dep/* + + +# Include the dependency files. +-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) + + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion \ +build elf hex lss sym clean clean_list program + diff --git a/poc/lpc2148_efsl/test/crt.s b/poc/lpc2148_efsl/test/crt.s new file mode 100644 index 0000000..78de943 --- /dev/null +++ b/poc/lpc2148_efsl/test/crt.s @@ -0,0 +1,110 @@ +/* *************************************************************************************************************** + + crt.s STARTUP ASSEMBLY CODE + ----------------------- + + + Module includes the interrupt vectors and start-up code. + + *************************************************************************************************************** */ + +/* Stack Sizes */ +.set UND_STACK_SIZE, 0x00000040 /* stack for "undefined instruction" interrupts is 4 bytes */ +.set ABT_STACK_SIZE, 0x00000040 /* stack for "abort" interrupts is 4 bytes */ +.set FIQ_STACK_SIZE, 0x00000040 /* stack for "FIQ" interrupts is 4 bytes */ +.set IRQ_STACK_SIZE, 0X00000040 /* stack for "IRQ" normal interrupts is 4 bytes */ +.set SVC_STACK_SIZE, 0x00000400 /* stack for "SVC" supervisor mode is 4 bytes */ + + + +/* Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs (program status registers) */ +.set MODE_USR, 0x10 /* Normal User Mode */ +.set MODE_FIQ, 0x11 /* FIQ Processing Fast Interrupts Mode */ +.set MODE_IRQ, 0x12 /* IRQ Processing Standard Interrupts Mode */ +.set MODE_SVC, 0x13 /* Supervisor Processing Software Interrupts Mode */ +.set MODE_ABT, 0x17 /* Abort Processing memory Faults Mode */ +.set MODE_UND, 0x1B /* Undefined Processing Undefined Instructions Mode */ +.set MODE_SYS, 0x1F /* System Running Priviledged Operating System Tasks Mode */ + +.set I_BIT, 0x80 /* when I bit is set, IRQ is disabled (program status registers) */ +.set F_BIT, 0x40 /* when F bit is set, FIQ is disabled (program status registers) */ + + +.text +.arm + +.global Reset_Handler +.global _startup +.func _startup + +_startup: + +# Exception Vectors + +_vectors: ldr PC, Reset_Addr + ldr PC, Undef_Addr + ldr PC, SWI_Addr + ldr PC, PAbt_Addr + ldr PC, DAbt_Addr + nop /* Reserved Vector (holds Philips ISP checksum) */ + ldr PC, [PC,#-0xFF0] /* see page 71 of "Insiders Guide to the Philips ARM7-Based Microcontrollers" by Trevor Martin */ + ldr PC, FIQ_Addr + +Reset_Addr: .word Reset_Handler /* defined in this module below */ +Undef_Addr: .word UNDEF_Routine /* defined in main.c */ +SWI_Addr: .word SWI_Routine /* defined in main.c */ +PAbt_Addr: .word UNDEF_Routine /* defined in main.c */ +DAbt_Addr: .word UNDEF_Routine /* defined in main.c */ +IRQ_Addr: .word IRQ_Routine /* defined in main.c */ +FIQ_Addr: .word FIQ_Routine /* defined in main.c */ + .word 0 /* rounds the vectors and ISR addresses to 64 bytes total */ + + +# Reset Handler + +Reset_Handler: + + /* Setup a stack for each mode - note that this only sets up a usable stack + for User mode. Also each mode is setup with interrupts initially disabled. */ + + ldr r0, =_stack_end + msr CPSR_c, #MODE_UND|I_BIT|F_BIT /* Undefined Instruction Mode */ + mov sp, r0 + sub r0, r0, #UND_STACK_SIZE + msr CPSR_c, #MODE_ABT|I_BIT|F_BIT /* Abort Mode */ + mov sp, r0 + sub r0, r0, #ABT_STACK_SIZE + msr CPSR_c, #MODE_FIQ|I_BIT|F_BIT /* FIQ Mode */ + mov sp, r0 + sub r0, r0, #FIQ_STACK_SIZE + msr CPSR_c, #MODE_IRQ|I_BIT|F_BIT /* IRQ Mode */ + mov sp, r0 + sub r0, r0, #IRQ_STACK_SIZE + msr CPSR_c, #MODE_SVC|I_BIT|F_BIT /* Supervisor Mode */ + mov sp, r0 + sub r0, r0, #SVC_STACK_SIZE + msr CPSR_c, #MODE_SYS|I_BIT|F_BIT /* User Mode */ + mov sp, r0 + + /* copy .data section (Copy from ROM to RAM) */ + ldr R1, =_etext + ldr R2, =_data + ldr R3, =_edata +1: cmp R2, R3 + ldrlo R0, [R1], #4 + strlo R0, [R2], #4 + blo 1b + + /* Clear .bss section (Zero init) */ + mov R0, #0 + ldr R1, =_bss_start + ldr R2, =_bss_end +2: cmp R1, R2 + strlo R0, [R1], #4 + blo 2b + + /* Enter the C code */ + b main + +.endfunc +.end diff --git a/poc/lpc2148_efsl/test/flash.ocd b/poc/lpc2148_efsl/test/flash.ocd new file mode 100644 index 0000000..e0c547b --- /dev/null +++ b/poc/lpc2148_efsl/test/flash.ocd @@ -0,0 +1,7 @@ +halt +wait_halt +sleep 10 +poll +flash erase_sector 0 0 14 +flash write_bank 0 /Users/david/Devel/arch/arm/code/snesram/poc/lpc2148_efsl/test/main.bin 0 +reset run diff --git a/poc/lpc2148_efsl/test/inttypes.h b/poc/lpc2148_efsl/test/inttypes.h new file mode 100644 index 0000000..330c6bd --- /dev/null +++ b/poc/lpc2148_efsl/test/inttypes.h @@ -0,0 +1,150 @@ +/* Copyright (c) 2002, Marek Michalkiewicz + All rights reserved. + + 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. */ + +/* $Id: inttypes.h,v 1.5.2.1 2003/09/18 18:41:17 troth Exp $ */ + +/* + inttypes.h + + Contributors: + Created by Marek Michalkiewicz + */ + +#ifndef __INTTYPES_H_ +#define __INTTYPES_H_ + +/** \defgroup avr_inttypes Integer Types + \code #include \endcode + + Use [u]intN_t if you need exactly N bits. + + Since these typedefs are mandated by the C99 standard, they are preferred + over rolling your own typedefs. + + \note If avr-gcc's \c -mint8 option is used, no 32-bit types will be + available. + + \todo There is a pending patch that may go into gcc to change the + behaviour of the -mint8 option. The current (2003-09-17) situation for + -mint8 is sizeof(int) == 1, sizeof(long) == 2 and sizeof(long long) == 8. + Note the absence of a 4-byte, 32-bit type. The patch proposes to change + sozeof(long long) to be 4 bytes (32 bits). When and if the patch is + included in gcc, we will need to change avr-libc accordingly. */ + +#if __INT_MAX__ == 127 +# define __USING_MINT8 1 +#endif + +/** \name 8-bit types. */ + +/*@{*/ + +/** \ingroup avr_inttypes + 8-bit signed type. */ + +typedef signed char int8_t; + +/** \ingroup avr_inttypes + 8-bit unsigned type. */ + +typedef unsigned char uint8_t; + +#if __USING_MINT8 + +typedef long int16_t; +typedef unsigned long uint16_t; + +#else /* no -mint8 */ + +/*@}*/ + +/** \name 16-bit types. */ + +/*@{*/ + +/** \ingroup avr_inttypes + 16-bit signed type. */ + +typedef int int16_t; + +/** \ingroup avr_inttypes + 16-bit unsigned type. */ + +typedef unsigned int uint16_t; + +/*@}*/ + +/** \name 32-bit types. */ + +/*@{*/ + +/** \ingroup avr_inttypes + 32-bit signed type. */ + +typedef long int32_t; + +/** \ingroup avr_inttypes + 32-bit unsigned type. */ + +typedef unsigned long uint32_t; + +#endif + +/*@}*/ + +/** \name 64-bit types. */ + +/*@{*/ + +/** \ingroup avr_inttypes + 64-bit signed type. */ + +typedef long long int64_t; + +/** \ingroup avr_inttypes + 64-bit unsigned type. */ + +typedef unsigned long long uint64_t; + +/*@}*/ + +/** \name Pointer types. + These allow you to declare variables of the same size as a pointer. */ + +/*@{*/ + +/** \ingroup avr_inttypes + Signed pointer compatible type. */ + +typedef int16_t intptr_t; + +/** \ingroup avr_inttypes + Unsigned pointer compatible type. */ + +typedef uint16_t uintptr_t; + +/*@}*/ + +#endif diff --git a/poc/lpc2148_efsl/test/lpc2148-ram.ld b/poc/lpc2148_efsl/test/lpc2148-ram.ld new file mode 100644 index 0000000..4555cce --- /dev/null +++ b/poc/lpc2148_efsl/test/lpc2148-ram.ld @@ -0,0 +1,197 @@ +/* ****************************************************************************************************** */ +/* demo2148_blink_flash.cmd LINKER SCRIPT */ +/* */ +/* */ +/* The Linker Script defines how the code and data emitted by the GNU C compiler and assembler are */ +/* to be loaded into memory (code goes into FLASH, variables go into RAM). */ +/* */ +/* Any symbols defined in the Linker Script are automatically global and available to the rest of the */ +/* program. */ +/* */ +/* To force the linker to use this LINKER SCRIPT, just add the -T demo2148_blink_flash.cmd directive */ +/* to the linker flags in the makefile. */ +/* */ +/* LFLAGS = -Map main.map -nostartfiles -T demo2148_blink_flash.cmd */ +/* */ +/* */ +/* The Philips boot loader supports the ISP (In System Programming) via the serial port and the IAP */ +/* (In Application Programming) for flash programming from within your application. */ +/* */ +/* The boot loader uses RAM memory and we MUST NOT load variables or code in these areas. */ +/* */ +/* RAM used by boot loader: 0x40000120 - 0x400001FF (223 bytes) for ISP variables */ +/* 0x40007FE0 - 0x4000FFFF (32 bytes) for ISP and IAP variables */ +/* 0x40007EE0 - 0x40007FE0 (256 bytes) stack for ISP and IAP */ +/* */ +/* */ +/* MEMORY MAP */ +/* | |0x40008000 */ +/* .-------->|---------------------------------| */ +/* . | variables and stack |0x40007FFF */ +/* ram_isp_high | for Philips boot loader | */ +/* . | 32 + 256 = 288 bytes | */ +/* . | | */ +/* . | Do not put anything here |0x40007EE0 */ +/* .-------->|---------------------------------| */ +/* | UDF Stack 4 bytes |0x40007EDC <---------- _stack_end */ +/* .-------->|---------------------------------| */ +/* | ABT Stack 4 bytes |0x40007ED8 */ +/* .-------->|---------------------------------| */ +/* | FIQ Stack 4 bytes |0x40007ED4 */ +/* .-------->|---------------------------------| */ +/* | IRQ Stack 4 bytes |0x40007ED0 */ +/* .-------->|---------------------------------| */ +/* | SVC Stack 4 bytes |0x40007ECC */ +/* .-------->|---------------------------------| */ +/* . | |0x40007EC8 */ +/* . | stack area for user program | */ +/* . | | | */ +/* . | | | */ +/* . | | | */ +/* . | V | */ +/* . | | */ +/* . | | */ +/* . | | */ +/* . | free ram | */ +/* ram | | */ +/* . | | */ +/* . | | */ +/* . |.................................|0x40000234 <---------- _bss_end */ +/* . | | */ +/* . | .bss uninitialized variables | */ +/* . |.................................|0x40000218 <---------- _bss_start, _edata */ +/* . | | */ +/* . | .data initialized variables | */ +/* . | |0x40000200 <---------- _data */ +/* .-------->|---------------------------------| */ +/* . | variables used by |0x400001FF */ +/* ram_isp_low | Philips boot loader | */ +/* . | 223 bytes |0x40000120 */ +/* .-------->|---------------------------------| */ +/* . | |0x4000011F */ +/* ram_vectors | free ram | */ +/* . |---------------------------------|0x40000040 */ +/* . | |0x4000003F */ +/* . | Interrupt Vectors (re-mapped) | */ +/* . | 64 bytes |0x40000000 */ +/* .-------->|---------------------------------| */ +/* | | */ +/* */ +/* */ +/* */ +/* | | */ +/* .--------> |---------------------------------| */ +/* . | |0x0001FFFF */ +/* . | | */ +/* . | | */ +/* . | | */ +/* . | | */ +/* . | | */ +/* . | unused flash eprom | */ +/* . | | */ +/* . |.................................|0x0000032c */ +/* . | | */ +/* . | copy of .data area | */ +/* flash | | */ +/* . |---------------------------------|0x00000314 <----------- _etext */ +/* . | | */ +/* . | |0x00000180 main */ +/* . | |0x00000278 feed */ +/* . | main() |0x000002c4 FIQ_Routine */ +/* . | |0x000002d8 SWI_Routine */ +/* . | |0x000002ec UNDEF_Routine */ +/* . | |0x000002b0 IRQ_routine */ +/* . |---------------------------------|0x000001cc initialize */ +/* . | |0x000000D4 */ +/* . | Startup Code | */ +/* . | (assembler) | */ +/* . | | */ +/* . |---------------------------------|0x00000040 Reset_Handler */ +/* . | |0x0000003F */ +/* . | Interrupt Vector Table (unused) | */ +/* . | 64 bytes | */ +/* .--------->|---------------------------------|0x00000000 _startup * +/* */ +/* */ +/* The easy way to prevent the linker from loading anything into a memory area is to define */ +/* a MEMORY region for it and then avoid assigning any .text, .data or .bss sections into it. */ +/* */ +/* */ +/* MEMORY */ +/* { */ +/* ram_isp_low(A) : ORIGIN = 0x40000120, LENGTH = 223 */ +/* */ +/* } */ +/* */ +/* */ +/* Author: James P. Lynch */ +/* */ +/* ****************************************************************************************************** */ + + +/* identify the Entry Point */ + +ENTRY(_startup) + + + +/* specify the LPC2148 memory areas */ + +MEMORY +{ + flash : ORIGIN = 0, LENGTH = 512K /* FLASH ROM */ + ram_isp_low(A) : ORIGIN = 0x40000120, LENGTH = 223 /* variables used by Philips ISP bootloader */ + ram : ORIGIN = 0x40000200, LENGTH = 32513 /* free RAM area */ + ram_isp_high(A) : ORIGIN = 0x40007FE0, LENGTH = 32 /* variables used by Philips ISP bootloader */ + ram_usb_dma : ORIGIN = 0x7FD00000, LENGTH = 8192 /* on-chip USB DMA RAM area (not used) */ +} + + + +/* define a global symbol _stack_end */ + +_stack_end = 0x40007EDC; + + + +/* now define the output sections */ + +SECTIONS +{ + . = 0; /* set location counter to address zero */ + + startup : { *(.startup)} >ram /* the startup code goes into FLASH */ + + + + .text : /* collect all sections that should go into FLASH after startup */ + { + *(.text) /* all .text sections (code) */ + *(.rodata) /* all .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* all .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* all .glue_7 sections (no idea what these are) */ + *(.glue_7t) /* all .glue_7t sections (no idea what these are) */ + _etext = .; /* define a global symbol _etext just after the last code byte */ + } >ram /* put all the above into FLASH */ + + + + + .data : /* collect all initialized .data sections that go into RAM */ + { + _data = .; /* create a global symbol marking the start of the .data section */ + *(.data) /* all .data sections */ + _edata = .; /* define a global symbol marking the end of the .data section */ + } >ram AT >ram /* put all the above into RAM (but load the LMA copy into FLASH) */ + + .bss : /* collect all uninitialized .bss sections that go into RAM */ + { + _bss_start = .; /* define a global symbol marking the start of the .bss section */ + *(.bss) /* all .bss sections */ + } >ram /* put all the above in RAM (it will be cleared in the startup code */ + + . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ + _bss_end = . ; /* define a global symbol marking the end of the .bss section */ +} + _end = .; /* define a global symbol marking the end of application RAM */ + diff --git a/poc/lpc2148_efsl/test/lpc2148-rom.ld b/poc/lpc2148_efsl/test/lpc2148-rom.ld new file mode 100644 index 0000000..5be7ede --- /dev/null +++ b/poc/lpc2148_efsl/test/lpc2148-rom.ld @@ -0,0 +1,197 @@ +/* ****************************************************************************************************** */ +/* demo2148_blink_flash.cmd LINKER SCRIPT */ +/* */ +/* */ +/* The Linker Script defines how the code and data emitted by the GNU C compiler and assembler are */ +/* to be loaded into memory (code goes into FLASH, variables go into RAM). */ +/* */ +/* Any symbols defined in the Linker Script are automatically global and available to the rest of the */ +/* program. */ +/* */ +/* To force the linker to use this LINKER SCRIPT, just add the -T demo2148_blink_flash.cmd directive */ +/* to the linker flags in the makefile. */ +/* */ +/* LFLAGS = -Map main.map -nostartfiles -T demo2148_blink_flash.cmd */ +/* */ +/* */ +/* The Philips boot loader supports the ISP (In System Programming) via the serial port and the IAP */ +/* (In Application Programming) for flash programming from within your application. */ +/* */ +/* The boot loader uses RAM memory and we MUST NOT load variables or code in these areas. */ +/* */ +/* RAM used by boot loader: 0x40000120 - 0x400001FF (223 bytes) for ISP variables */ +/* 0x40007FE0 - 0x4000FFFF (32 bytes) for ISP and IAP variables */ +/* 0x40007EE0 - 0x40007FE0 (256 bytes) stack for ISP and IAP */ +/* */ +/* */ +/* MEMORY MAP */ +/* | |0x40008000 */ +/* .-------->|---------------------------------| */ +/* . | variables and stack |0x40007FFF */ +/* ram_isp_high | for Philips boot loader | */ +/* . | 32 + 256 = 288 bytes | */ +/* . | | */ +/* . | Do not put anything here |0x40007EE0 */ +/* .-------->|---------------------------------| */ +/* | UDF Stack 4 bytes |0x40007EDC <---------- _stack_end */ +/* .-------->|---------------------------------| */ +/* | ABT Stack 4 bytes |0x40007ED8 */ +/* .-------->|---------------------------------| */ +/* | FIQ Stack 4 bytes |0x40007ED4 */ +/* .-------->|---------------------------------| */ +/* | IRQ Stack 4 bytes |0x40007ED0 */ +/* .-------->|---------------------------------| */ +/* | SVC Stack 4 bytes |0x40007ECC */ +/* .-------->|---------------------------------| */ +/* . | |0x40007EC8 */ +/* . | stack area for user program | */ +/* . | | | */ +/* . | | | */ +/* . | | | */ +/* . | V | */ +/* . | | */ +/* . | | */ +/* . | | */ +/* . | free ram | */ +/* ram | | */ +/* . | | */ +/* . | | */ +/* . |.................................|0x40000234 <---------- _bss_end */ +/* . | | */ +/* . | .bss uninitialized variables | */ +/* . |.................................|0x40000218 <---------- _bss_start, _edata */ +/* . | | */ +/* . | .data initialized variables | */ +/* . | |0x40000200 <---------- _data */ +/* .-------->|---------------------------------| */ +/* . | variables used by |0x400001FF */ +/* ram_isp_low | Philips boot loader | */ +/* . | 223 bytes |0x40000120 */ +/* .-------->|---------------------------------| */ +/* . | |0x4000011F */ +/* ram_vectors | free ram | */ +/* . |---------------------------------|0x40000040 */ +/* . | |0x4000003F */ +/* . | Interrupt Vectors (re-mapped) | */ +/* . | 64 bytes |0x40000000 */ +/* .-------->|---------------------------------| */ +/* | | */ +/* */ +/* */ +/* */ +/* | | */ +/* .--------> |---------------------------------| */ +/* . | |0x0001FFFF */ +/* . | | */ +/* . | | */ +/* . | | */ +/* . | | */ +/* . | | */ +/* . | unused flash eprom | */ +/* . | | */ +/* . |.................................|0x0000032c */ +/* . | | */ +/* . | copy of .data area | */ +/* flash | | */ +/* . |---------------------------------|0x00000314 <----------- _etext */ +/* . | | */ +/* . | |0x00000180 main */ +/* . | |0x00000278 feed */ +/* . | main() |0x000002c4 FIQ_Routine */ +/* . | |0x000002d8 SWI_Routine */ +/* . | |0x000002ec UNDEF_Routine */ +/* . | |0x000002b0 IRQ_routine */ +/* . |---------------------------------|0x000001cc initialize */ +/* . | |0x000000D4 */ +/* . | Startup Code | */ +/* . | (assembler) | */ +/* . | | */ +/* . |---------------------------------|0x00000040 Reset_Handler */ +/* . | |0x0000003F */ +/* . | Interrupt Vector Table (unused) | */ +/* . | 64 bytes | */ +/* .--------->|---------------------------------|0x00000000 _startup * +/* */ +/* */ +/* The easy way to prevent the linker from loading anything into a memory area is to define */ +/* a MEMORY region for it and then avoid assigning any .text, .data or .bss sections into it. */ +/* */ +/* */ +/* MEMORY */ +/* { */ +/* ram_isp_low(A) : ORIGIN = 0x40000120, LENGTH = 223 */ +/* */ +/* } */ +/* */ +/* */ +/* Author: James P. Lynch */ +/* */ +/* ****************************************************************************************************** */ + + +/* identify the Entry Point */ + +ENTRY(_startup) + + + +/* specify the LPC2148 memory areas */ + +MEMORY +{ + flash : ORIGIN = 0, LENGTH = 512K /* FLASH ROM */ + ram_isp_low(A) : ORIGIN = 0x40000120, LENGTH = 223 /* variables used by Philips ISP bootloader */ + ram : ORIGIN = 0x40000200, LENGTH = 32513 /* free RAM area */ + ram_isp_high(A) : ORIGIN = 0x40007FE0, LENGTH = 32 /* variables used by Philips ISP bootloader */ + ram_usb_dma : ORIGIN = 0x7FD00000, LENGTH = 8192 /* on-chip USB DMA RAM area (not used) */ +} + + + +/* define a global symbol _stack_end */ + +_stack_end = 0x40007EDC; + + + +/* now define the output sections */ + +SECTIONS +{ + . = 0; /* set location counter to address zero */ + + startup : { *(.startup)} >flash /* the startup code goes into FLASH */ + + + + .text : /* collect all sections that should go into FLASH after startup */ + { + *(.text) /* all .text sections (code) */ + *(.rodata) /* all .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* all .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* all .glue_7 sections (no idea what these are) */ + *(.glue_7t) /* all .glue_7t sections (no idea what these are) */ + _etext = .; /* define a global symbol _etext just after the last code byte */ + } >flash /* put all the above into FLASH */ + + + + + .data : /* collect all initialized .data sections that go into RAM */ + { + _data = .; /* create a global symbol marking the start of the .data section */ + *(.data) /* all .data sections */ + _edata = .; /* define a global symbol marking the end of the .data section */ + } >ram AT >flash /* put all the above into RAM (but load the LMA copy into FLASH) */ + + .bss : /* collect all uninitialized .bss sections that go into RAM */ + { + _bss_start = .; /* define a global symbol marking the start of the .bss section */ + *(.bss) /* all .bss sections */ + } >ram /* put all the above in RAM (it will be cleared in the startup code */ + + . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ + _bss_end = . ; /* define a global symbol marking the end of the .bss section */ +} + _end = .; /* define a global symbol marking the end of application RAM */ + diff --git a/poc/lpc2148_efsl/test/lpc214x.h b/poc/lpc2148_efsl/test/lpc214x.h new file mode 100644 index 0000000..497ef3b --- /dev/null +++ b/poc/lpc2148_efsl/test/lpc214x.h @@ -0,0 +1,364 @@ +/***********************************************************************/ +/* This file is part of the uVision/ARM development tools */ +/* Copyright KEIL ELEKTRONIK GmbH 2002-2005 */ +/***********************************************************************/ +/* */ +/* LPC214X.H: Header file for Philips LPC2141/42/44/46/48 */ +/* */ +/***********************************************************************/ + +#ifndef __LPC214x_H +#define __LPC214x_H + +/* Vectored Interrupt Controller (VIC) */ +#define VICIRQStatus (*((volatile unsigned long *) 0xFFFFF000)) +#define VICFIQStatus (*((volatile unsigned long *) 0xFFFFF004)) +#define VICRawIntr (*((volatile unsigned long *) 0xFFFFF008)) +#define VICIntSelect (*((volatile unsigned long *) 0xFFFFF00C)) +#define VICIntEnable (*((volatile unsigned long *) 0xFFFFF010)) +#define VICIntEnClr (*((volatile unsigned long *) 0xFFFFF014)) +#define VICSoftInt (*((volatile unsigned long *) 0xFFFFF018)) +#define VICSoftIntClr (*((volatile unsigned long *) 0xFFFFF01C)) +#define VICProtection (*((volatile unsigned long *) 0xFFFFF020)) +#define VICVectAddr (*((volatile unsigned long *) 0xFFFFF030)) +#define VICDefVectAddr (*((volatile unsigned long *) 0xFFFFF034)) +#define VICVectAddr0 (*((volatile unsigned long *) 0xFFFFF100)) +#define VICVectAddr1 (*((volatile unsigned long *) 0xFFFFF104)) +#define VICVectAddr2 (*((volatile unsigned long *) 0xFFFFF108)) +#define VICVectAddr3 (*((volatile unsigned long *) 0xFFFFF10C)) +#define VICVectAddr4 (*((volatile unsigned long *) 0xFFFFF110)) +#define VICVectAddr5 (*((volatile unsigned long *) 0xFFFFF114)) +#define VICVectAddr6 (*((volatile unsigned long *) 0xFFFFF118)) +#define VICVectAddr7 (*((volatile unsigned long *) 0xFFFFF11C)) +#define VICVectAddr8 (*((volatile unsigned long *) 0xFFFFF120)) +#define VICVectAddr9 (*((volatile unsigned long *) 0xFFFFF124)) +#define VICVectAddr10 (*((volatile unsigned long *) 0xFFFFF128)) +#define VICVectAddr11 (*((volatile unsigned long *) 0xFFFFF12C)) +#define VICVectAddr12 (*((volatile unsigned long *) 0xFFFFF130)) +#define VICVectAddr13 (*((volatile unsigned long *) 0xFFFFF134)) +#define VICVectAddr14 (*((volatile unsigned long *) 0xFFFFF138)) +#define VICVectAddr15 (*((volatile unsigned long *) 0xFFFFF13C)) +#define VICVectCntl0 (*((volatile unsigned long *) 0xFFFFF200)) +#define VICVectCntl1 (*((volatile unsigned long *) 0xFFFFF204)) +#define VICVectCntl2 (*((volatile unsigned long *) 0xFFFFF208)) +#define VICVectCntl3 (*((volatile unsigned long *) 0xFFFFF20C)) +#define VICVectCntl4 (*((volatile unsigned long *) 0xFFFFF210)) +#define VICVectCntl5 (*((volatile unsigned long *) 0xFFFFF214)) +#define VICVectCntl6 (*((volatile unsigned long *) 0xFFFFF218)) +#define VICVectCntl7 (*((volatile unsigned long *) 0xFFFFF21C)) +#define VICVectCntl8 (*((volatile unsigned long *) 0xFFFFF220)) +#define VICVectCntl9 (*((volatile unsigned long *) 0xFFFFF224)) +#define VICVectCntl10 (*((volatile unsigned long *) 0xFFFFF228)) +#define VICVectCntl11 (*((volatile unsigned long *) 0xFFFFF22C)) +#define VICVectCntl12 (*((volatile unsigned long *) 0xFFFFF230)) +#define VICVectCntl13 (*((volatile unsigned long *) 0xFFFFF234)) +#define VICVectCntl14 (*((volatile unsigned long *) 0xFFFFF238)) +#define VICVectCntl15 (*((volatile unsigned long *) 0xFFFFF23C)) + +/* Pin Connect Block */ +#define PINSEL0 (*((volatile unsigned long *) 0xE002C000)) +#define PINSEL1 (*((volatile unsigned long *) 0xE002C004)) +#define PINSEL2 (*((volatile unsigned long *) 0xE002C014)) + +/* General Purpose Input/Output (GPIO) */ +#define IOPIN0 (*((volatile unsigned long *) 0xE0028000)) +#define IOSET0 (*((volatile unsigned long *) 0xE0028004)) +#define IODIR0 (*((volatile unsigned long *) 0xE0028008)) +#define IOCLR0 (*((volatile unsigned long *) 0xE002800C)) +#define IOPIN1 (*((volatile unsigned long *) 0xE0028010)) +#define IOSET1 (*((volatile unsigned long *) 0xE0028014)) +#define IODIR1 (*((volatile unsigned long *) 0xE0028018)) +#define IOCLR1 (*((volatile unsigned long *) 0xE002801C)) +#define IO0PIN (*((volatile unsigned long *) 0xE0028000)) +#define IO0SET (*((volatile unsigned long *) 0xE0028004)) +#define IO0DIR (*((volatile unsigned long *) 0xE0028008)) +#define IO0CLR (*((volatile unsigned long *) 0xE002800C)) +#define IO1PIN (*((volatile unsigned long *) 0xE0028010)) +#define IO1SET (*((volatile unsigned long *) 0xE0028014)) +#define IO1DIR (*((volatile unsigned long *) 0xE0028018)) +#define IO1CLR (*((volatile unsigned long *) 0xE002801C)) +#define FIO0DIR (*((volatile unsigned long *) 0x3FFFC000)) +#define FIO0MASK (*((volatile unsigned long *) 0x3FFFC010)) +#define FIO0PIN (*((volatile unsigned long *) 0x3FFFC014)) +#define FIO0SET (*((volatile unsigned long *) 0x3FFFC018)) +#define FIO0CLR (*((volatile unsigned long *) 0x3FFFC01C)) +#define FIO1DIR (*((volatile unsigned long *) 0x3FFFC020)) +#define FIO1MASK (*((volatile unsigned long *) 0x3FFFC030)) +#define FIO1PIN (*((volatile unsigned long *) 0x3FFFC034)) +#define FIO1SET (*((volatile unsigned long *) 0x3FFFC038)) +#define FIO1CLR (*((volatile unsigned long *) 0x3FFFC03C)) + +/* Memory Accelerator Module (MAM) */ +#define MAMCR (*((volatile unsigned char *) 0xE01FC000)) +#define MAMTIM (*((volatile unsigned char *) 0xE01FC004)) +#define MEMMAP (*((volatile unsigned char *) 0xE01FC040)) + +/* Phase Locked Loop 0 (PLL0) */ +#define PLL0CON (*((volatile unsigned char *) 0xE01FC080)) +#define PLL0CFG (*((volatile unsigned char *) 0xE01FC084)) +#define PLL0STAT (*((volatile unsigned short*) 0xE01FC088)) +#define PLL0FEED (*((volatile unsigned char *) 0xE01FC08C)) + +/* Phase Locked Loop 1 (PLL1) */ +#define PLL1CON (*((volatile unsigned char *) 0xE01FC0A0)) +#define PLL1CFG (*((volatile unsigned char *) 0xE01FC0A4)) +#define PLL1STAT (*((volatile unsigned short*) 0xE01FC0A8)) +#define PLL1FEED (*((volatile unsigned char *) 0xE01FC0AC)) + +/* VPB Divider */ +#define VPBDIV (*((volatile unsigned char *) 0xE01FC100)) + +/* Power Control */ +#define PCON (*((volatile unsigned char *) 0xE01FC0C0)) +#define PCONP (*((volatile unsigned long *) 0xE01FC0C4)) + +/* External Interrupts */ +#define EXTINT (*((volatile unsigned char *) 0xE01FC140)) +#define INTWAKE (*((volatile unsigned short*) 0xE01FC144)) +#define EXTMODE (*((volatile unsigned char *) 0xE01FC148)) +#define EXTPOLAR (*((volatile unsigned char *) 0xE01FC14C)) + +/* Reset */ +#define RSID (*((volatile unsigned char *) 0xE01FC180)) + +/* Code Security / Debugging */ +#define CSPR (*((volatile unsigned char *) 0xE01FC184)) + +/* System Control Miscellaneous */ +#define SCS (*((volatile unsigned long *) 0xE01FC1A0)) + +/* Timer 0 */ +#define T0IR (*((volatile unsigned long *) 0xE0004000)) +#define T0TCR (*((volatile unsigned long *) 0xE0004004)) +#define T0TC (*((volatile unsigned long *) 0xE0004008)) +#define T0PR (*((volatile unsigned long *) 0xE000400C)) +#define T0PC (*((volatile unsigned long *) 0xE0004010)) +#define T0MCR (*((volatile unsigned long *) 0xE0004014)) +#define T0MR0 (*((volatile unsigned long *) 0xE0004018)) +#define T0MR1 (*((volatile unsigned long *) 0xE000401C)) +#define T0MR2 (*((volatile unsigned long *) 0xE0004020)) +#define T0MR3 (*((volatile unsigned long *) 0xE0004024)) +#define T0CCR (*((volatile unsigned long *) 0xE0004028)) +#define T0CR0 (*((volatile unsigned long *) 0xE000402C)) +#define T0CR1 (*((volatile unsigned long *) 0xE0004030)) +#define T0CR2 (*((volatile unsigned long *) 0xE0004034)) +#define T0CR3 (*((volatile unsigned long *) 0xE0004038)) +#define T0EMR (*((volatile unsigned long *) 0xE000403C)) +#define T0CTCR (*((volatile unsigned long *) 0xE0004070)) + +/* Timer 1 */ +#define T1IR (*((volatile unsigned long *) 0xE0008000)) +#define T1TCR (*((volatile unsigned long *) 0xE0008004)) +#define T1TC (*((volatile unsigned long *) 0xE0008008)) +#define T1PR (*((volatile unsigned long *) 0xE000800C)) +#define T1PC (*((volatile unsigned long *) 0xE0008010)) +#define T1MCR (*((volatile unsigned long *) 0xE0008014)) +#define T1MR0 (*((volatile unsigned long *) 0xE0008018)) +#define T1MR1 (*((volatile unsigned long *) 0xE000801C)) +#define T1MR2 (*((volatile unsigned long *) 0xE0008020)) +#define T1MR3 (*((volatile unsigned long *) 0xE0008024)) +#define T1CCR (*((volatile unsigned long *) 0xE0008028)) +#define T1CR0 (*((volatile unsigned long *) 0xE000802C)) +#define T1CR1 (*((volatile unsigned long *) 0xE0008030)) +#define T1CR2 (*((volatile unsigned long *) 0xE0008034)) +#define T1CR3 (*((volatile unsigned long *) 0xE0008038)) +#define T1EMR (*((volatile unsigned long *) 0xE000803C)) +#define T1CTCR (*((volatile unsigned long *) 0xE0008070)) + +/* Pulse Width Modulator (PWM) */ +#define PWMIR (*((volatile unsigned long *) 0xE0014000)) +#define PWMTCR (*((volatile unsigned long *) 0xE0014004)) +#define PWMTC (*((volatile unsigned long *) 0xE0014008)) +#define PWMPR (*((volatile unsigned long *) 0xE001400C)) +#define PWMPC (*((volatile unsigned long *) 0xE0014010)) +#define PWMMCR (*((volatile unsigned long *) 0xE0014014)) +#define PWMMR0 (*((volatile unsigned long *) 0xE0014018)) +#define PWMMR1 (*((volatile unsigned long *) 0xE001401C)) +#define PWMMR2 (*((volatile unsigned long *) 0xE0014020)) +#define PWMMR3 (*((volatile unsigned long *) 0xE0014024)) +#define PWMMR4 (*((volatile unsigned long *) 0xE0014040)) +#define PWMMR5 (*((volatile unsigned long *) 0xE0014044)) +#define PWMMR6 (*((volatile unsigned long *) 0xE0014048)) +#define PWMPCR (*((volatile unsigned long *) 0xE001404C)) +#define PWMLER (*((volatile unsigned long *) 0xE0014050)) + +/* Universal Asynchronous Receiver Transmitter 0 (UART0) */ +#define U0RBR (*((volatile unsigned char *) 0xE000C000)) +#define U0THR (*((volatile unsigned char *) 0xE000C000)) +#define U0IER (*((volatile unsigned long *) 0xE000C004)) +#define U0IIR (*((volatile unsigned long *) 0xE000C008)) +#define U0FCR (*((volatile unsigned char *) 0xE000C008)) +#define U0LCR (*((volatile unsigned char *) 0xE000C00C)) +#define U0MCR (*((volatile unsigned char *) 0xE000C010)) +#define U0LSR (*((volatile unsigned char *) 0xE000C014)) +#define U0MSR (*((volatile unsigned char *) 0xE000C018)) +#define U0SCR (*((volatile unsigned char *) 0xE000C01C)) +#define U0DLL (*((volatile unsigned char *) 0xE000C000)) +#define U0DLM (*((volatile unsigned char *) 0xE000C004)) +#define U0ACR (*((volatile unsigned long *) 0xE000C020)) +#define U0FDR (*((volatile unsigned long *) 0xE000C028)) +#define U0TER (*((volatile unsigned char *) 0xE000C030)) + +/* Universal Asynchronous Receiver Transmitter 1 (UART1) */ +#define U1RBR (*((volatile unsigned char *) 0xE0010000)) +#define U1THR (*((volatile unsigned char *) 0xE0010000)) +#define U1IER (*((volatile unsigned long *) 0xE0010004)) +#define U1IIR (*((volatile unsigned long *) 0xE0010008)) +#define U1FCR (*((volatile unsigned char *) 0xE0010008)) +#define U1LCR (*((volatile unsigned char *) 0xE001000C)) +#define U1MCR (*((volatile unsigned char *) 0xE0010010)) +#define U1LSR (*((volatile unsigned char *) 0xE0010014)) +#define U1MSR (*((volatile unsigned char *) 0xE0010018)) +#define U1SCR (*((volatile unsigned char *) 0xE001001C)) +#define U1DLL (*((volatile unsigned char *) 0xE0010000)) +#define U1DLM (*((volatile unsigned char *) 0xE0010004)) +#define U1ACR (*((volatile unsigned long *) 0xE0010020)) +#define U1FDR (*((volatile unsigned long *) 0xE0010028)) +#define U1TER (*((volatile unsigned char *) 0xE0010030)) + +/* I2C Interface 0 */ +#define I2C0CONSET (*((volatile unsigned char *) 0xE001C000)) +#define I2C0STAT (*((volatile unsigned char *) 0xE001C004)) +#define I2C0DAT (*((volatile unsigned char *) 0xE001C008)) +#define I2C0ADR (*((volatile unsigned char *) 0xE001C00C)) +#define I2C0SCLH (*((volatile unsigned short*) 0xE001C010)) +#define I2C0SCLL (*((volatile unsigned short*) 0xE001C014)) +#define I2C0CONCLR (*((volatile unsigned char *) 0xE001C018)) + +/* I2C Interface 1 */ +#define I2C1CONSET (*((volatile unsigned char *) 0xE005C000)) +#define I2C1STAT (*((volatile unsigned char *) 0xE005C004)) +#define I2C1DAT (*((volatile unsigned char *) 0xE005C008)) +#define I2C1ADR (*((volatile unsigned char *) 0xE005C00C)) +#define I2C1SCLH (*((volatile unsigned short*) 0xE005C010)) +#define I2C1SCLL (*((volatile unsigned short*) 0xE005C014)) +#define I2C1CONCLR (*((volatile unsigned char *) 0xE005C018)) + +/* SPI0 (Serial Peripheral Interface 0) */ +#define S0SPCR (*((volatile unsigned short*) 0xE0020000)) +#define S0SPSR (*((volatile unsigned char *) 0xE0020004)) +#define S0SPDR (*((volatile unsigned short*) 0xE0020008)) +#define S0SPCCR (*((volatile unsigned char *) 0xE002000C)) +#define S0SPINT (*((volatile unsigned char *) 0xE002001C)) + +/* SSP Controller (SPI1) */ +#define SSPCR0 (*((volatile unsigned short*) 0xE0068000)) +#define SSPCR1 (*((volatile unsigned char *) 0xE0068004)) +#define SSPDR (*((volatile unsigned short*) 0xE0068008)) +#define SSPSR (*((volatile unsigned char *) 0xE006800C)) +#define SSPCPSR (*((volatile unsigned char *) 0xE0068010)) +#define SSPIMSC (*((volatile unsigned char *) 0xE0068014)) +#define SSPRIS (*((volatile unsigned char *) 0xE0068018)) +#define SSPMIS (*((volatile unsigned char *) 0xE006801C)) +#define SSPICR (*((volatile unsigned char *) 0xE0068020)) + +/* Real Time Clock */ +#define ILR (*((volatile unsigned char *) 0xE0024000)) +#define CTC (*((volatile unsigned short*) 0xE0024004)) +#define CCR (*((volatile unsigned char *) 0xE0024008)) +#define CIIR (*((volatile unsigned char *) 0xE002400C)) +#define AMR (*((volatile unsigned char *) 0xE0024010)) +#define CTIME0 (*((volatile unsigned long *) 0xE0024014)) +#define CTIME1 (*((volatile unsigned long *) 0xE0024018)) +#define CTIME2 (*((volatile unsigned long *) 0xE002401C)) +#define SEC (*((volatile unsigned char *) 0xE0024020)) +#define MIN (*((volatile unsigned char *) 0xE0024024)) +#define HOUR (*((volatile unsigned char *) 0xE0024028)) +#define DOM (*((volatile unsigned char *) 0xE002402C)) +#define DOW (*((volatile unsigned char *) 0xE0024030)) +#define DOY (*((volatile unsigned short*) 0xE0024034)) +#define MONTH (*((volatile unsigned char *) 0xE0024038)) +#define YEAR (*((volatile unsigned short*) 0xE002403C)) +#define ALSEC (*((volatile unsigned char *) 0xE0024060)) +#define ALMIN (*((volatile unsigned char *) 0xE0024064)) +#define ALHOUR (*((volatile unsigned char *) 0xE0024068)) +#define ALDOM (*((volatile unsigned char *) 0xE002406C)) +#define ALDOW (*((volatile unsigned char *) 0xE0024070)) +#define ALDOY (*((volatile unsigned short*) 0xE0024074)) +#define ALMON (*((volatile unsigned char *) 0xE0024078)) +#define ALYEAR (*((volatile unsigned short*) 0xE002407C)) +#define PREINT (*((volatile unsigned short*) 0xE0024080)) +#define PREFRAC (*((volatile unsigned short*) 0xE0024084)) + +/* A/D Converter 0 (AD0) */ +#define AD0CR (*((volatile unsigned long *) 0xE0034000)) +#define AD0GDR (*((volatile unsigned long *) 0xE0034004)) +#define AD0STAT (*((volatile unsigned long *) 0xE0034030)) +#define AD0INTEN (*((volatile unsigned long *) 0xE003400C)) +#define AD0DR0 (*((volatile unsigned long *) 0xE0034010)) +#define AD0DR1 (*((volatile unsigned long *) 0xE0034014)) +#define AD0DR2 (*((volatile unsigned long *) 0xE0034018)) +#define AD0DR3 (*((volatile unsigned long *) 0xE003401C)) +#define AD0DR4 (*((volatile unsigned long *) 0xE0034020)) +#define AD0DR5 (*((volatile unsigned long *) 0xE0034024)) +#define AD0DR6 (*((volatile unsigned long *) 0xE0034028)) +#define AD0DR7 (*((volatile unsigned long *) 0xE003402C)) + +/* A/D Converter 1 (AD1) */ +#define AD1CR (*((volatile unsigned long *) 0xE0060000)) +#define AD1GDR (*((volatile unsigned long *) 0xE0060004)) +#define AD1STAT (*((volatile unsigned long *) 0xE0060030)) +#define AD1INTEN (*((volatile unsigned long *) 0xE006000C)) +#define AD1DR0 (*((volatile unsigned long *) 0xE0060010)) +#define AD1DR1 (*((volatile unsigned long *) 0xE0060014)) +#define AD1DR2 (*((volatile unsigned long *) 0xE0060018)) +#define AD1DR3 (*((volatile unsigned long *) 0xE006001C)) +#define AD1DR4 (*((volatile unsigned long *) 0xE0060020)) +#define AD1DR5 (*((volatile unsigned long *) 0xE0060024)) +#define AD1DR6 (*((volatile unsigned long *) 0xE0060028)) +#define AD1DR7 (*((volatile unsigned long *) 0xE006002C)) + +/* A/D Converter Global */ +#define ADGSR (*((volatile unsigned long *) 0xE0034008)) + +/* D/A Converter */ +#define DACR (*((volatile unsigned long *) 0xE006C000)) + +/* Watchdog */ +#define WDMOD (*((volatile unsigned char *) 0xE0000000)) +#define WDTC (*((volatile unsigned long *) 0xE0000004)) +#define WDFEED (*((volatile unsigned char *) 0xE0000008)) +#define WDTV (*((volatile unsigned long *) 0xE000000C)) + +/* USB Controller */ +#define USBIntSt (*((volatile unsigned long *) 0xE01FC1C0)) +#define USBDevIntSt (*((volatile unsigned long *) 0xE0090000)) +#define USBDevIntEn (*((volatile unsigned long *) 0xE0090004)) +#define USBDevIntClr (*((volatile unsigned long *) 0xE0090008)) +#define USBDevIntSet (*((volatile unsigned long *) 0xE009000C)) +#define USBDevIntPri (*((volatile unsigned char *) 0xE009002C)) +#define USBEpIntSt (*((volatile unsigned long *) 0xE0090030)) +#define USBEpIntEn (*((volatile unsigned long *) 0xE0090034)) +#define USBEpIntClr (*((volatile unsigned long *) 0xE0090038)) +#define USBEpIntSet (*((volatile unsigned long *) 0xE009003C)) +#define USBEpIntPri (*((volatile unsigned long *) 0xE0090040)) +#define USBReEp (*((volatile unsigned long *) 0xE0090044)) +#define USBEpInd (*((volatile unsigned long *) 0xE0090048)) +#define USBMaxPSize (*((volatile unsigned long *) 0xE009004C)) +#define USBRxData (*((volatile unsigned long *) 0xE0090018)) +#define USBRxPLen (*((volatile unsigned long *) 0xE0090020)) +#define USBTxData (*((volatile unsigned long *) 0xE009001C)) +#define USBTxPLen (*((volatile unsigned long *) 0xE0090024)) +#define USBCtrl (*((volatile unsigned long *) 0xE0090028)) +#define USBCmdCode (*((volatile unsigned long *) 0xE0090010)) +#define USBCmdData (*((volatile unsigned long *) 0xE0090014)) +#define USBDMARSt (*((volatile unsigned long *) 0xE0090050)) +#define USBDMARClr (*((volatile unsigned long *) 0xE0090054)) +#define USBDMARSet (*((volatile unsigned long *) 0xE0090058)) +#define USBUDCAH (*((volatile unsigned long *) 0xE0090080)) +#define USBEpDMASt (*((volatile unsigned long *) 0xE0090084)) +#define USBEpDMAEn (*((volatile unsigned long *) 0xE0090088)) +#define USBEpDMADis (*((volatile unsigned long *) 0xE009008C)) +#define USBDMAIntSt (*((volatile unsigned long *) 0xE0090090)) +#define USBDMAIntEn (*((volatile unsigned long *) 0xE0090094)) +#define USBEoTIntSt (*((volatile unsigned long *) 0xE00900A0)) +#define USBEoTIntClr (*((volatile unsigned long *) 0xE00900A4)) +#define USBEoTIntSet (*((volatile unsigned long *) 0xE00900A8)) +#define USBNDDRIntSt (*((volatile unsigned long *) 0xE00900AC)) +#define USBNDDRIntClr (*((volatile unsigned long *) 0xE00900B0)) +#define USBNDDRIntSet (*((volatile unsigned long *) 0xE00900B4)) +#define USBSysErrIntSt (*((volatile unsigned long *) 0xE00900B8)) +#define USBSysErrIntClr (*((volatile unsigned long *) 0xE00900BC)) +#define USBSysErrIntSet (*((volatile unsigned long *) 0xE00900C0)) + +#endif // __LPC214x_H diff --git a/poc/lpc2148_efsl/test/lpcUART.h b/poc/lpc2148_efsl/test/lpcUART.h new file mode 100644 index 0000000..162f351 --- /dev/null +++ b/poc/lpc2148_efsl/test/lpcUART.h @@ -0,0 +1,86 @@ +/****************************************************************************** + * + * $RCSfile: $ + * $Revision: $ + * + * Header file for Philips LPC ARM Processors. + * Copyright 2004 R O SoftWare + * + * No guarantees, warrantees, or promises, implied or otherwise. + * May be used for hobby or commercial purposes provided copyright + * notice remains intact. + * + * reduced to learn what is needed for "minimal" uart0-operation + *****************************************************************************/ +#ifndef INC_LPC_UART_H +#define INC_LPC_UART_H + +/////////////////////////////////////////////////////////////////////////////// +// UART defines + +// Interrupt Enable Register bit definitions +#define UIER_ERBFI (1 << 0) // Enable Receive Data Available Interrupt +#define UIER_ETBEI (1 << 1) // Enable Transmit Holding Register Empty Interrupt +#define UIER_ELSI (1 << 2) // Enable Receive Line Status Interrupt +#define UIER_EDSSI (1 << 3) // Enable MODEM Status Interrupt + +// Interrupt ID Register bit definitions +#define UIIR_NO_INT (1 << 0) // NO INTERRUPTS PENDING +#define UIIR_MS_INT (0 << 1) // MODEM Status +#define UIIR_THRE_INT (1 << 1) // Transmit Holding Register Empty +#define UIIR_RDA_INT (2 << 1) // Receive Data Available +#define UIIR_RLS_INT (3 << 1) // Receive Line Status +#define UIIR_CTI_INT (6 << 1) // Character Timeout Indicator +#define UIIR_ID_MASK 0x0E + +// FIFO Control Register bit definitions +#define UFCR_FIFO_ENABLE (1 << 0) // FIFO Enable +#define UFCR_RX_FIFO_RESET (1 << 1) // Reset Receive FIFO +#define UFCR_TX_FIFO_RESET (1 << 2) // Reset Transmit FIFO +#define UFCR_FIFO_TRIG1 (0 << 6) // Trigger @ 1 character in FIFO +#define UFCR_FIFO_TRIG4 (1 << 6) // Trigger @ 4 characters in FIFO +#define UFCR_FIFO_TRIG8 (2 << 6) // Trigger @ 8 characters in FIFO +#define UFCR_FIFO_TRIG14 (3 << 6) // Trigger @ 14 characters in FIFO + +// Line Control Register bit definitions +#define ULCR_CHAR_5 (0 << 0) // 5-bit character length +#define ULCR_CHAR_6 (1 << 0) // 6-bit character length +#define ULCR_CHAR_7 (2 << 0) // 7-bit character length +#define ULCR_CHAR_8 (3 << 0) // 8-bit character length +#define ULCR_STOP_1 (0 << 2) // 1 stop bit +#define ULCR_STOP_2 (1 << 2) // 2 stop bits +#define ULCR_PAR_NO (0 << 3) // No Parity +#define ULCR_PAR_ODD (1 << 3) // Odd Parity +#define ULCR_PAR_EVEN (3 << 3) // Even Parity +#define ULCR_PAR_MARK (5 << 3) // MARK "1" Parity +#define ULCR_PAR_SPACE (7 << 3) // SPACE "0" Paruty +#define ULCR_BREAK_ENABLE (1 << 6) // Output BREAK line condition +#define ULCR_DLAB_ENABLE (1 << 7) // Enable Divisor Latch Access + +// Modem Control Register bit definitions +#define UMCR_DTR (1 << 0) // Data Terminal Ready +#define UMCR_RTS (1 << 1) // Request To Send +#define UMCR_LB (1 << 4) // Loopback + +// Line Status Register bit definitions +#define ULSR_RDR (1 << 0) // Receive Data Ready +#define ULSR_OE (1 << 1) // Overrun Error +#define ULSR_PE (1 << 2) // Parity Error +#define ULSR_FE (1 << 3) // Framing Error +#define ULSR_BI (1 << 4) // Break Interrupt +#define ULSR_THRE (1 << 5) // Transmit Holding Register Empty +#define ULSR_TEMT (1 << 6) // Transmitter Empty +#define ULSR_RXFE (1 << 7) // Error in Receive FIFO +#define ULSR_ERR_MASK 0x1E + +// Modem Status Register bit definitions +#define UMSR_DCTS (1 << 0) // Delta Clear To Send +#define UMSR_DDSR (1 << 1) // Delta Data Set Ready +#define UMSR_TERI (1 << 2) // Trailing Edge Ring Indicator +#define UMSR_DDCD (1 << 3) // Delta Data Carrier Detect +#define UMSR_CTS (1 << 4) // Clear To Send +#define UMSR_DSR (1 << 5) // Data Set Ready +#define UMSR_RI (1 << 6) // Ring Indicator +#define UMSR_DCD (1 << 7) // Data Carrier Detect + +#endif diff --git a/poc/lpc2148_efsl/test/lpc_config.h b/poc/lpc2148_efsl/test/lpc_config.h new file mode 100644 index 0000000..3b4e0fe --- /dev/null +++ b/poc/lpc2148_efsl/test/lpc_config.h @@ -0,0 +1,52 @@ +/* System Config */ + +/* + PLL + + - Main clock F_OSC=12,0MHz @ Keil MCB2130) [limits: 10 MHz to 25 MHz] + - System should run at max. Frequency (60MHz) [limit: max 60 MHz] + - Choose multiplier M=5 + so cclk = M * F_OSC= 5 * 12000000 = 60000000 Hz + - MSEL-Bit in PLLCFG (bits 0-4) MSEL = M-1 + - F_CCO must be inbetween the limits 156 MHz to 320 MHz + datasheet: F_CCO = F_OSC * M * 2 * P + - choose devider P=2 => F_CCO = 12000000Hz * 5 * 2 * 2 + = 240 MHz + - PSEL0 (Bit5 in PLLCFG) = 1, PSEL1 (Bit6) = 0 (0b01) +*/ +#define FOSC 12000000 +#define PLL_M 5 +#define MSEL (PLL_M-1) +#define PSEL0 5 +#define PSEL1 6 + +#define PLLE 0 +#define PLLC 1 + +#define PLOCK 10 + +#define PLL_FEED1 0xAA +#define PLL_FEED2 0x55 + + +/* + MAM(Memory Accelerator Module) + - choosen: MAM fully enabled = MAM-Mode 2 + - System-Clock cclk=60MHz -> 3 CCLKs are proposed as fetch timing +*/ +#define MAM_MODE 2 +#define MAM_FETCH 3 + +/* + VPB (V... Pheriphal Bus) + - choosen: VPB should run at full speed -> devider VPBDIV=1 + => pclk = cclk = 60MHz +*/ +#define VPBDIV_VAL 1 + +/* + SCB +*/ +#define MEMMAP_BOOT_LOADER_MODE 0 // Interrupt vectors are re-mapped to Boot Block. +#define MEMMAP_USER_FLASH_MODE (1<<0) // Interrupt vectors are not re-mapped and reside in Flash. +#define MEMMAP_USER_RAM_MODE (1<<1) // Interrupt vectors are re-mapped to Static RAM. diff --git a/poc/lpc2148_efsl/test/main.bin b/poc/lpc2148_efsl/test/main.bin new file mode 100755 index 0000000000000000000000000000000000000000..61c3bfb77c9681b7cbb3f1c00a568b1640f56505 GIT binary patch literal 23076 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πxhsImg@uT9onS-2&K^z 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 literal 0 HcmV?d00001 diff --git a/poc/lpc2148_efsl/test/main.c b/poc/lpc2148_efsl/test/main.c new file mode 100644 index 0000000..fd18b06 --- /dev/null +++ b/poc/lpc2148_efsl/test/main.c @@ -0,0 +1,167 @@ +/****************************************************************************** + + efsl Demo-Application for Philips LPC2138 ARM7TDMI-S + + Copyright (c) 2005 + Martin Thomas, Kaiserslautern, Germany + + *****************************************************************************/ + +#include + +#include "lpc214x.h" +#include "lpc_config.h" + +#include "uart.h" + +#include "startup.h" +#include "efs.h" +#include "ls.h" +#include "mkfs.h" +#include "interfaces/efsl_dbg_printf_arm.h" + +#define rprintf efsl_debug_printf_arm + +#define BAUD 115200 + +#define BIT(x) ((unsigned long)1<40MHz + MAMTIM = MAM_FETCH; + // c. enable MAM + MAMCR = MAM_MODE; + + // --- set VPB speed --- + VPBDIV = VPBDIV_VAL; + + // --- map INT-vector --- + #if defined(RAM_RUN) + MEMMAP = MEMMAP_USER_RAM_MODE; + #elif defined(ROM_RUN) + MEMMAP = MEMMAP_USER_FLASH_MODE; + #else + #error RUN_MODE not defined! + #endif +} +*/ +static void gpioInit(void) +{ + LEDSET = BIT(LED1PIN); // set Bit = LED off (active low) + LEDDIR |= BIT(LED1PIN); // define LED-Pin as output +} static void ledToggle(void) +{ + static unsigned char state = 0; + state = !state; + if (state) + LEDCLR = BIT(LED1PIN); // set Bit = LED on + else + LEDSET = BIT(LED1PIN); // set Bit = LED off (active low) +} + + +#if 0 +static void hang(void) +{ + while (1); +} + + +#endif /* */ +EmbeddedFileSystem efs; +EmbeddedFile filer, filew; +DirList list; +unsigned short e; +unsigned char buf[513]; +int main(void) +{ + int ch; + int8_t res; + Initialize(); + gpioInit(); + uart0Init(UART_BAUD(BAUD), UART_8N1, UART_FIFO_8); // setup the UART + uart0Puts("\r\nMMC/SD Card Filesystem Test (P:LPC2148 L:EFSL)\r\n"); + + /* init efsl debug-output */ + efsl_debug_devopen_arm(uart0Putch); + ledToggle(); + rprintf("CARD init..."); + if ((res = efs_init(&efs, 0)) != 0) { + rprintf("failed with %i\n", res); + } + rprintf("Press Command: d r a \n"); + while (1) { + if ((ch = uart0Getch()) >= 0) { + uart0Puts("You pressed : "); + uart0Putch(ch); + uart0Puts("\r\n"); + if (ch == 'M') { + rprintf("Creating FS\n"); + fs_umount(&efs.myFs); + mkfs_makevfat(&efs.myPart); + } + if (ch == 'd') { + rprintf("Directory of 'root':\n"); + ls_openDir(&list, &(efs.myFs), "/"); + while (ls_getNext(&list) == 0) { + list.currentEntry.FileName[LIST_MAXLENFILENAME - 1] = '\0'; + rprintf("%s ( %li bytes )\n", list.currentEntry.FileName, list.currentEntry.FileSize); + } + } + if (ch == 'r') { + if (file_fopen(&filer, &efs.myFs, LogFileName, 'r') == 0) { + rprintf("File %s open. Content:\n", LogFileName); + while ((e = file_read(&filer, 512, buf)) != 0) { + buf[e] = '\0'; + uart0Puts((char *) buf); + } rprintf("\n"); + file_fclose(&filer); + } + } + if (ch == 'a') { + if (file_fopen(&filew, &efs.myFs, LogFileName, 'a') == 0) { + rprintf("File %s open for append. Appending...", LogFileName); + strcpy((char *) buf, "Append Dummy Data to File\r\n"); + if (file_write(&filew, strlen((char *) buf), buf) == strlen((char *) buf)) { + rprintf("ok\n\n"); + } else { + rprintf("fail\n\n"); + } + file_fclose(&filew); + fs_umount(&efs.myFs); + } + } + ledToggle(); + } + } + return 0; /* never reached */ +} diff --git a/poc/lpc2148_efsl/test/startup.c b/poc/lpc2148_efsl/test/startup.c new file mode 100644 index 0000000..d1521e7 --- /dev/null +++ b/poc/lpc2148_efsl/test/startup.c @@ -0,0 +1,129 @@ +/* + Initialisation functions for exception handlers, PLL and MAM + + Partially copied from Jim Lynch's tutorial +*/ + +/********************************************************** + Header files + **********************************************************/ + +#include "startup.h" + + +#define MAMCR *(volatile unsigned int *)0xE01FC000 +#define MAMTIM *(volatile unsigned int *)0xE01FC004 + +#define PLLCON *(volatile unsigned int *)0xE01FC080 +#define PLLCFG *(volatile unsigned int *)0xE01FC084 +#define PLLSTAT *(volatile unsigned int *)0xE01FC088 +#define PLLFEED *(volatile unsigned int *)0xE01FC08C + +#define VPBDIV *(volatile unsigned int *)0xE01FC100 + +void IRQ_Routine(void) __attribute__ ((interrupt("IRQ"))); +void FIQ_Routine(void) __attribute__ ((interrupt("FIQ"))); +void SWI_Routine(void) __attribute__ ((interrupt("SWI"))); +void UNDEF_Routine(void) __attribute__ ((interrupt("UNDEF"))); + + +/* Stubs for various interrupts (may be replaced later) */ +/* ---------------------------------------------------- */ + +void IRQ_Routine(void) +{ + while (1); +} + +void FIQ_Routine(void) +{ + while (1); +} + + +void SWI_Routine(void) +{ + while (1); +} + + +void UNDEF_Routine(void) +{ + while (1); +} + + +/********************************************************** + Initialize +**********************************************************/ + +#define PLOCK 0x400 + +static void feed(void) +{ + PLLFEED = 0xAA; + PLLFEED = 0x55; +} + + +void Initialize(void) +{ + + + // Setting the Phased Lock Loop (PLL) + // ---------------------------------- + // + // Olimex LPC-P2148 has a 12.0000 mhz crystal + // + // We'd like the LPC2148 to run at 60 mhz (has to be an even multiple of crystal) + // + // According to the Philips LPC2148 manual: M = cclk / Fosc where: M = PLL multiplier (bits 0-4 of PLLCFG) + // cclk = 60000000 hz + // Fosc = 12000000 hz + // + // Solving: M = 60000000 / 12000000 = 5 + // + // Note: M - 1 must be entered into bits 0-4 of PLLCFG (assign 4 to these bits) + // + // + // The Current Controlled Oscilator (CCO) must operate in the range 156 mhz to 320 mhz + // + // According to the Philips LPC2148 manual: Fcco = cclk * 2 * P where: Fcco = CCO frequency + // cclk = 60000000 hz + // P = PLL divisor (bits 5-6 of PLLCFG) + // + // Solving: Fcco = 60000000 * 2 * P + // P = 2 (trial value) + // Fcco = 60000000 * 2 * 2 + // Fcc0 = 240000000 hz (good choice for P since it's within the 156 mhz to 320 mhz range) + // + // From Table 22 (page 34) of Philips LPC2148 manual P = 2, PLLCFG bits 5-6 = 1 (assign 1 to these bits) + // + // Finally: PLLCFG = 0 01 00100 = 0x24 + // + // Final note: to load PLLCFG register, we must use the 0xAA followed 0x55 write sequence to the PLLFEED register + // this is done in the short function feed() below + // + + // Setting Multiplier and Divider values + PLLCFG = 0x24; + feed(); + + // Enabling the PLL */ + PLLCON = 0x1; + feed(); + + // Wait for the PLL to lock to set frequency + while (!(PLLSTAT & PLOCK)); + + // Connect the PLL as the clock source + PLLCON = 0x3; + feed(); + + // Enabling MAM and setting number of clocks used for Flash memory fetch + MAMTIM = 0x3; + MAMCR = 0x2; + + // Setting peripheral Clock (pclk) to System Clock (cclk) + VPBDIV = 0x1; +} diff --git a/poc/lpc2148_efsl/test/startup.h b/poc/lpc2148_efsl/test/startup.h new file mode 100644 index 0000000..9c414b3 --- /dev/null +++ b/poc/lpc2148_efsl/test/startup.h @@ -0,0 +1 @@ +void Initialize(void); diff --git a/poc/lpc2148_efsl/test/uart.c b/poc/lpc2148_efsl/test/uart.c new file mode 100644 index 0000000..09ab4a1 --- /dev/null +++ b/poc/lpc2148_efsl/test/uart.c @@ -0,0 +1,168 @@ +/****************************************************************************** + * + * $RCSfile: $ + * $Revision: $ + * + * This module provides interface routines to the LPC ARM UARTs. + * Copyright 2004, R O SoftWare + * No guarantees, warrantees, or promises, implied or otherwise. + * May be used for hobby or commercial purposes provided copyright + * notice remains intact. + * + * reduced to see what has to be done for minimum UART-support by mthomas + *****************************************************************************/ + +// #warning "this is a reduced version of the R O Software code" + +#include "lpc214x.h" +#include "uart.h" + +/* on LPC210x: UART0 TX-Pin=P0.2, RX-Pin=P0.1 + PINSEL0 has to be set to "UART-Function" = Function "01" + for Pin 0.0 and 0.1 */ + +#define PINSEL_BITPIN0 0 +#define PINSEL_BITPIN1 2 +#define PINSEL_BITPIN8 16 +#define PINSEL_BITPIN9 18 +#define PINSEL_FIRST_ALT_FUNC 1 +#define PINSEL_SECOND_ALT_FUNC 2 +#define PINSEL_THIRD_ALT_FUNC 3 + +// Values of Bits 0-3 in PINSEL to activate UART0 +#define UART0_PINSEL ((PINSEL_FIRST_ALT_FUNC<> 8); // set for baud high byte + + // set the number of characters and other + // user specified operating parameters + // Databits, Parity, Stopbits - Settings in Line Control Register + U0LCR = (mode & ~(1 << UART0_LCR_DLAB)); // clear DLAB "on-the-fly" + // setup FIFO Control Register (fifo-enabled + xx trig) + U0FCR = fmode; +} int uart0Putch(int ch) +{ + while (!(U0LSR & ULSR_THRE)) // wait for TX buffer to empty + continue; // also either WDOG() or swap() + U0THR = (uint8_t) ch; // put char to Transmit Holding Register + return (uint8_t) ch; // return char ("stdio-compatible"?) +} +const char *uart0Puts(const char *string) +{ + char ch; + while ((ch = *string)) { + if (uart0Putch(ch) < 0) + break; + string++; + } + return string; +} +int uart0TxEmpty(void) +{ + return (U0LSR & (ULSR_THRE | ULSR_TEMT)) == (ULSR_THRE | ULSR_TEMT); +} +void uart0TxFlush(void) +{ + U0FCR |= UFCR_TX_FIFO_RESET; // clear the TX fifo +} + +/* Returns: character on success, -1 if no character is available */ +int uart0Getch(void) +{ + if (U0LSR & ULSR_RDR) // check if character is available + return U0RBR; // return character + return -1; +} + + +/* baudrate divisor - use UART_BAUD macro + * mode - see typical modes (uart.h) + * fmode - see typical fmodes (uart.h) + * NOTE: uart0Init(UART_BAUD(9600), UART_8N1, UART_FIFO_8); + */ +void uart1Init(uint16_t baud, uint8_t mode, uint8_t fmode) +{ + + // setup Pin Function Select Register (Pin Connect Block) + // make sure old values of Bits 0-4 are masked out and + // set them according to UART0-Pin-Selection + PINSEL0 = (PINSEL0 & ~UART1_PINMASK) | UART1_PINSEL; + U1IER = 0x00; // disable all interrupts + U1IIR = 0x00; // clear interrupt ID register + U1LSR = 0x00; // clear line status register + + // set the baudrate - DLAB must be set to access DLL/DLM + U1LCR = (1 << UART1_LCR_DLAB); // set divisor latches (DLAB) + U1DLL = (uint8_t) baud; // set for baud low byte + U1DLM = (uint8_t) (baud >> 8); // set for baud high byte + + // set the number of characters and other + // user specified operating parameters + // Databits, Parity, Stopbits - Settings in Line Control Register + U1LCR = (mode & ~(1 << UART1_LCR_DLAB)); // clear DLAB "on-the-fly" + // setup FIFO Control Register (fifo-enabled + xx trig) + U1FCR = fmode; +} int uart1Putch(int ch) +{ + while (!(U1LSR & ULSR_THRE)) // wait for TX buffer to empty + continue; // also either WDOG() or swap() + U1THR = (uint8_t) ch; // put char to Transmit Holding Register + return (uint8_t) ch; // return char ("stdio-compatible"?) +} +const char *uart1Puts(const char *string) +{ + char ch; + while ((ch = *string)) { + if (uart1Putch(ch) < 0) + break; + string++; + } + return string; +} +int uart1TxEmpty(void) +{ + return (U1LSR & (ULSR_THRE | ULSR_TEMT)) == (ULSR_THRE | ULSR_TEMT); +} +void uart1TxFlush(void) +{ + U1FCR |= UFCR_TX_FIFO_RESET; // clear the TX fifo +} + +/* Returns: character on success, -1 if no character is available */ +int uart1Getch(void) +{ + if (U1LSR & ULSR_RDR) // check if character is available + return U1RBR; // return character + return -1; +} diff --git a/poc/lpc2148_efsl/test/uart.h b/poc/lpc2148_efsl/test/uart.h new file mode 100644 index 0000000..280039b --- /dev/null +++ b/poc/lpc2148_efsl/test/uart.h @@ -0,0 +1,74 @@ +/****************************************************************************** + * based on software from: + * Copyright 2004, R O SoftWare + * No guarantees, warrantees, or promises, implied or otherwise. + * May be used for hobby or commercial purposes provided copyright + * notice remains intact. + * + * reduced to learn what has to be done to enable and use UART0 + *****************************************************************************/ +#ifndef INC_UART_H +#define INC_UART_H + +#include "inttypes.h" + +#include "lpc214x.h" +#include "lpcUART.h" +#include "lpc_config.h" + +/////////////////////////////////////////////////////////////////////////////// +// use the following macros to determine the 'baud' parameter values +// for uart0Init() and uart1Init() +// CAUTION - 'baud' SHOULD ALWAYS BE A CONSTANT or +// a lot of code will be generated. +// Baud-Rate is calculated based on pclk (VPB-clock) +// the devisor must be 16 times the desired baudrate +#define UART_BAUD(baud) (uint16_t)(((FOSC*PLL_M/VPBDIV_VAL) / ((baud) * 16.0)) + 0.5) + +/////////////////////////////////////////////////////////////////////////////// +// Definitions for typical UART 'baud' settings +#define B1200 UART_BAUD(1200) +#define B9600 UART_BAUD(9600) +#define B19200 UART_BAUD(19200) +#define B38400 UART_BAUD(38400) +#define B57600 UART_BAUD(57600) +#define B115200 UART_BAUD(115200) + +/////////////////////////////////////////////////////////////////////////////// +// Definitions for typical UART 'mode' settings +#define UART_8N1 (uint8_t)(ULCR_CHAR_8 + ULCR_PAR_NO + ULCR_STOP_1) +#define UART_7N1 (uint8_t)(ULCR_CHAR_7 + ULCR_PAR_NO + ULCR_STOP_1) +#define UART_8N2 (uint8_t)(ULCR_CHAR_8 + ULCR_PAR_NO + ULCR_STOP_2) +#define UART_7N2 (uint8_t)(ULCR_CHAR_7 + ULCR_PAR_NO + ULCR_STOP_2) +#define UART_8E1 (uint8_t)(ULCR_CHAR_8 + ULCR_PAR_EVEN + ULCR_STOP_1) +#define UART_7E1 (uint8_t)(ULCR_CHAR_7 + ULCR_PAR_EVEN + ULCR_STOP_1) +#define UART_8E2 (uint8_t)(ULCR_CHAR_8 + ULCR_PAR_EVEN + ULCR_STOP_2) +#define UART_7E2 (uint8_t)(ULCR_CHAR_7 + ULCR_PAR_EVEN + ULCR_STOP_2) +#define UART_8O1 (uint8_t)(ULCR_CHAR_8 + ULCR_PAR_ODD + ULCR_STOP_1) +#define UART_7O1 (uint8_t)(ULCR_CHAR_7 + ULCR_PAR_ODD + ULCR_STOP_1) +#define UART_8O2 (uint8_t)(ULCR_CHAR_8 + ULCR_PAR_ODD + ULCR_STOP_2) +#define UART_7O2 (uint8_t)(ULCR_CHAR_7 + ULCR_PAR_ODD + ULCR_STOP_2) + +/////////////////////////////////////////////////////////////////////////////// +// Definitions for typical UART 'fmode' settings +#define UART_FIFO_OFF (0x00) +#define UART_FIFO_1 (uint8_t)(UFCR_FIFO_ENABLE + UFCR_FIFO_TRIG1) +#define UART_FIFO_4 (uint8_t)(UFCR_FIFO_ENABLE + UFCR_FIFO_TRIG4) +#define UART_FIFO_8 (uint8_t)(UFCR_FIFO_ENABLE + UFCR_FIFO_TRIG8) +#define UART_FIFO_14 (uint8_t)(UFCR_FIFO_ENABLE + UFCR_FIFO_TRIG14) +void uart0Init(uint16_t baud, uint8_t mode, uint8_t fmode); +int uart0Putch(int ch); +uint16_t uart0Space(void); +const char *uart0Puts(const char *string); +int uart0TxEmpty(void); +void uart0TxFlush(void); +int uart0Getch(void); +void uart1Init(uint16_t baud, uint8_t mode, uint8_t fmode); +int uart1Putch(int ch); +uint16_t uart1Space(void); +const char *uart1Puts(const char *string); +int uart1TxEmpty(void); +void uart1TxFlush(void); +int uart1Getch(void); + +#endif /* */