martian-full-20080625/0000755000175000017500000000000011034654741013056 5ustar marvmarvmartian-full-20080625/martian.h0000644000175000017500000001141511030572346014660 0ustar marvmarv/* martian.h: * modem program/module common data structure * shared bamil_d7, BaseAddressIndex, BaseAddress * program to module connection ioctl */ #ifndef __MARTIAN_DRIVERHELPER_COMMON #define __MARTIAN_DRIVERHELPER_COMMON #ifndef __KERNEL__ #define LOCK "lock; " typedef struct { volatile int counter; } atomic_t; #else #include #endif struct mcirc { int head; int tail; }; /* martian program/module shared structure, * mapped into user space via mmap call on device file */ #define MARTIAN_SIGNATURE "Martian" // signature at the page start #define MARTIAN_TSIGNATURE "martiaN" /* terminating signature */ #define DECLARE_FIFO(type, fifo, size, bname) \ type fifo##_##bname[size]; \ __u32 fifo##_wptr, fifo##_rptr; \ __u32 fifo##_buff_um; struct martian_common { char signature[sizeof MARTIAN_SIGNATURE]; /*** core relocated symbols ***/ __u16 BaseAddressIndex; __u16 BaseAddressData; /* TODO: to be removed */ __u8 BaseValue; __u8 dp_bamil_rd7; __u8 dp_byte_f; __u8 x_dsp_mars; /* TODO: to be removed */ __u8 x_dsp_mars3; /* TODO: to be removed */ __u8 dp_version; /* TODO: to be removed */ __u16 BaseAddress; /* TODO: to be removed */ __u16 BaseAddress2; /* TODO: to be removed */ __u8 x_chip_version; DECLARE_FIFO (__u16, io_dce_tx, 0x400, buff); DECLARE_FIFO (__u16, io_dce_rx, 0x800, buff); DECLARE_FIFO (__u8, io_pdm_rx, 0x4b0, buff); __u16 V34Mode; __u8 S[0x12c]; __u8 dp_dsp_data_in_progress; __u16 init_RBS_tick_flag; __u8 RBS_tick_rx; __u8 dp_ring_int_count; __u8 dp_sleep; /* TODO: to be removed */ __u8 rd7_isr; __u8 byte_c; __u8 byte_d; __u8 byte_e; //__u8 byte_f; struct mcirc dcp_circ; __u8 dcp_buf[0x40]; __u32 OverlappedIrqs; /* those came in the middle previous * were served in UM */ __u32 RepeatedIrqs; /* those came before previous * were served in UM */ atomic_t UnservedIrqs; atomic_t UnpassedIrqs; int rx_overrun, pdm_rx_overrun; int rx_incorrespondence, tx_incorrespondence; int pdm_rx_incorrespondence; int rx, tx, pdm_rx; int dual_port_rx, dual_port_tx, io_dual_port_rx; int dirty, pdm_dirty; __u32 latest_rptr, latest_wptr; char write_check; char kstamp[9]; char tsignature[sizeof MARTIAN_TSIGNATURE]; }; struct martian_conf { __u16 BaseAddress; __u16 CommAddress; __u8 irq; unsigned short vendor, device; unsigned subsys_vendor; unsigned subsys_device; unsigned flags; int index; // device index; to find slot in ; can be derived }; #define IR 0xd7 #define IR_SIGNIFICANT 0x0e #define MARTIAN_DEV_TOSHIBA 0x00000001 struct irqcount { int b, f, n, i, o; }; struct martian_irq_state { char string[11]; struct irqcount counts; int count; }; struct _mstore { unsigned short addr; unsigned short val; }; struct _andor_params { __u8 reg; __u8 mask_and; __u8 mask_or; }; struct _command_params { __u8 cmd; __u8 a1; __u8 a2; }; struct _longcmd_params { __u8 cmd; __u8 a1; __u8 a2; __u8 a3; __u8 a4; }; struct _mdsp { __u16 *data; __u16 num; /* environment */ __u8 DCPAudioOn; __u8 *pdp_byte_f; }; enum _rw_type { Byte = 0, Word = 1, Dword = 2 }; struct _read_params { __u16 addr; enum _rw_type type; }; struct _write_params { __u16 addr; __u32 val; enum _rw_type type; }; #define MARTIAN_CONF_GET _IOR ('S', 0, struct martian_conf) #define MARTIAN_IRQ_STATE _IOR ('S', 1, struct martian_irq_state) #define MARTIAN_IOCTL_CMD_READ_DSP _IOW ('S', 10, unsigned short ) #define MARTIAN_IOCTL_CMD_WRITE_DSP _IOW ('S', 11, struct _mstore ) #define MARTIAN_IOCTL_CMD_CLEAR_DSP _IO ('S', 12) #define MARTIAN_IOCTL_CMD_DLOAD_DSP _IOW ('S', 13, struct _mdsp ) #define MARTIAN_IOCTL_CMD_READREG _IOW ('S', 14, unsigned char ) #define MARTIAN_IOCTL_CMD_WRITEREG _IOW ('S', 15, struct _mstore ) #define MARTIAN_IOCTL_CMD_REGANDOR _IOW ('S', 16, struct _andor_params ) #define MARTIAN_IOCTL_CMD_COMMAND _IOW ('S', 17, struct _command_params ) #define MARTIAN_IOCTL_CMD_LONGCMD _IOW ('S', 18, struct _longcmd_params ) #define MARTIAN_IOCTL_CMD_READ _IOW ('S', 19, struct _read_params ) #define MARTIAN_IOCTL_CMD_WRITE _IOW ('S', 20, struct _write_params ) #define MARTIAN_IOCTL_CMD_INIT _IO ('S', 30) #define MARTIAN_IOCTL_CMD_DEINIT _IO ('S', 31) #define MARTIAN_IOCTL_CMD_DCPAUDIO _IO ('S', 32) #define MARTIAN_IOCTL_CMD_CSUM _IO ('S', 33) #define MARTIAN_IOCTL_CMD_OUTINIT _IO ('S', 34) #define MARTIAN_DUMP_VARS _IO ('S', 2) #define MARTIAN_SERVE_IRQS _IO ('S', 3) #define MARTIAN_MODEM_READY _IO ('S', 4) #define MARTIAN_CHECK_SMP _IOW ('S', 5, int) #define MARTIAN_TRUE_SMP _IO ('S', 6) #define MARTIAN_SCREWUP_DCE_RX _IO ('S', 7) #define MARTIAN_FIFO_FAULT _IO ('S', 8) #define MARTIAN_KDEBUG _IO ('S', 9) /* next is 14 */ #undef DECLARE_FIFO /* static */ #endif /* __MARTIAN_DRIVERHELPER_COMMON */ martian-full-20080625/Makefile0000644000175000017500000000121111033011170014467 0ustar marvmarv KERNEL_DIR:=/lib/modules/$(shell uname -r)/build SUBLEVEL:=$(shell echo $(KERNEL_DIR) | cut -d. -f3 | cut -d. -f1 | cut -d- -f1) # support begins at SUBLEVEL 20 after20:=$(shell if [ "$(SUBLEVEL)" -gt 20 ] ;then echo OK; fi) ifdef after20 all: $(MAKE) -C kmodule/ modules $(MAKE) -C modem/ all # $(MAKE) -C utils/ ptytosock install: $(MAKE) -C kmodule/ install $(MAKE) -C modem/ install else 20less: @echo "The martian_dev.ko driver and the complementary helper martian_helper are for use with kernels after 2.6.20. Use the martian-20080407.tar.gz for earlier kernels." endif clean: $(MAKE) -C kmodule/ clean $(MAKE) -C modem/ clean martian-full-20080625/INSTALL0000644000175000017500000000267210534304710014106 0ustar marvmarv================= Building ================= In root directory run $ make all ================== Installation ================== In root directory run $ su # make install ============== Running ============== Load module and run martian_modem first. # modprobe martian_dev # martian_modem [Options] [Tty] Now Tty is the name of the device file to represent your modem. You'll supply it to the dialer. /dev/ttySM0 if argument omitted. Left martian_modem running and start the dialer. See options available # martian_modem --help ============== Auto ============== In scripts/ directory run automate.sh. $ cd scripts/ $ ./automate.sh You can supply the option to be passed to martian_modem on loading like $ ./automate --mode 0660 See ./automate.sh --help for more options. ============== Notes ============== 'martian_modem' program is a crucial part of the driver. It should be running as long as you access the modem. For technical reasons carrier status support is not available for the modem client. Configure dialer respectively. For wvdial add "Check Carrier = No" line to the configuration file. x86_64 platform. ---------------- martian_modem is a 32-bit application. It can be built on x86_64 the way prescribed, but you need 32-bit development environment for that. Second option is to use binary built on i386. To compile and install module only do $ make -C kmodule/ modules $ su # make -C kmodule/ install martian-full-20080625/Concept0000644000175000017500000000254110524362060014367 0ustar marvmarvMartian divided in two parts. Those are kernel module martian_dev, and user-space program martian_modem. Being a pci driver martian_dev serves 164x like devices. Each found device is imported to user space as file node. Currently proc entries are used. This module responsibility is to serve device irqs. There are two possibilities: 1) Module's ISR only checks the destination and clears device bits to stop irqs. When actual irq is detected then client on device file is released. The mechanism supports read/poll blocking. 2) ISR fully processes device events in module. To process irqs correctly driver need to know some core runtime data. This makes program/module to have common block mmaped in. martian_modem opens device, reads configuration and then mmaps the common block. After mapping it has to relocate shared variables to the common block. Then core is initialized, interrupt serving thread springs off and main thread dives in duplex data fetching loop. Further interrupt processing is done by a separate thread. To reduce latency thread scheduling policy is FIFO and given highest priority. To relocate shared variables some core relocation info should be left in executable. This is -Wl,-q switch for. Binary can be further processed. Either to strip all unneeded info or to extract needed relocs to a separate file and drop all symbolic info. martian-full-20080625/Makefile~0000644000175000017500000000126211033011170014673 0ustar marvmarv KERNEL_DIR:=/lib/modules/$(shell uname -r)/build SUBLEVEL:=$(shell echo $(KERNEL_DIR) | cut -d. -f3 | cut -d. -f1 | cut -d- -f1) # support begins at SUBLEVEL 20 after20:=$(shell if [ "$(SUBLEVEL)" -gt 20 ] ;then echo OK; fi) ifdef after20 all: $(MAKE) -C kmodule/ modules $(MAKE) -C modem/ all # $(MAKE) -C utils/ ptytosock install: $(MAKE) -C kmodule/ install $(MAKE) -C modem/ install else 20less: @echo "$(SUBLEVEL)" @echo "$(after20)" @echo "The martian_dev.ko driver and the complementary helper martian_helper are for use with kernels after 2.6.20. Use the martian-20080407.tar.gz for earlier kernels." endif clean: $(MAKE) -C kmodule/ clean $(MAKE) -C modem/ clean martian-full-20080625/Cleaning.txt0000644000175000017500000000022011030573106015320 0ustar marvmarvFor reasons obscure: $ make clean fails on some systems. Thus do NOT reuse this package. Just delete and unpack a fresh copy. MarvS 6/25/2008 martian-full-20080625/README0000644000175000017500000000114110524362060013724 0ustar marvmarvMartian is an alternative to the ltmodem and provides Linux support for Agere WinModem hardware. Major difference is that core moved to the user space. Driver comprises two parts: martian_dev - kernel module to configure devices, and serve irqs from it martian_modem - user mode application to supply major IO, buffers, user level streams. For specific details concerning distribution and usage look in directories. When configuring wvdial add "Carrier Check = no" line. No modem status is checked yet. Kernel mode part is linux-2.6 module. Project has a site http://martian.barrelsoutofbond.org/. martian-full-20080625/kmodule/0000755000175000017500000000000011041225757014515 5ustar marvmarvmartian-full-20080625/kmodule/Makefile0000644000175000017500000000131111030573242016142 0ustar marvmarvKRELEASE = $(shell uname -r) ifdef KERNEL_DIR KBUILD_DIR = $(KERNEL_DIR) else KBUILD_DIR = /lib/modules/$(KRELEASE)/build endif MSRC_DIR = $(shell pwd) martian_cppflags = -DKMARTIAN_STAMP=20080620 EXTRA_CFLAGS += $(martian_cppflags) ccflags-y += $(martian_cppflags) # kbuild martian_dev-objs = martian.o marsio.o mfifo.o obj-m = martian_dev.o all: modules modules: $(MAKE) -C $(KBUILD_DIR) M="$(MSRC_DIR)" modules clean: $(MAKE) -C $(KBUILD_DIR) M="$(MSRC_DIR)" clean install: $(MAKE) -C $(KBUILD_DIR) M="$(MSRC_DIR)" modules_install if ! /sbin/modprobe -nq martian_dev ; then /sbin/depmod -a; fi # # dependencies martian.o: martian_ids.c marsio.h ../martian.h martian_dev-objs: kmartian.h mfifo.h martian-full-20080625/kmodule/marsio.h0000644000175000017500000000226611024421502016151 0ustar marvmarv/* marsio.h: martian device driver private declarations * IO & ISR */ #ifndef __MARSIO_H #define __MARSIO_H u8 mars_read_register(struct martian *mdev, u8 reg); void mars_write_register(struct martian *mdev, u8 reg, u8 val); int process_stream (struct martian *mdev); void process_ring(struct martian *mdev); u8 mars_read_register_safe(struct martian *mdev, u8 reg); void mars_write_register_safe(struct martian *mdev, u8 reg, u8 val); void mars_reg_andor (struct martian *mdev, u8 reg, u8 val_and, u8 val_or); void mars_write_word(struct martian *mdev, u16 addr, u16 val); void mars_write_byte(struct martian *mdev, u16 addr, u8 val); void mars_write_dword(struct martian *mdev, u16 addr, u32 val); void mars_write_dsp_ram (struct martian *mdev, u16 addr, u16 val); u16 mars_read_dsp_ram (struct martian *mdev, u16 addr); void mars_clear_dsp_ram (struct martian *mdev); int mars_download_dsp_user (struct martian *mdev, u16 __user *data, u16 num); void mars_command (struct martian *mdev, u8 cmd, u8 arg1, u8 arg2); int mars_command_long (struct martian *mdev, u8 cmd, u8 arg1, u8 arg2, u8 arg3, u8 arg4); u16 mars_dsp_rom_checksum (struct martian *mdev); #endif // __MARSIO_H martian-full-20080625/kmodule/kmartian.h0000644000175000017500000000561311025647417016504 0ustar marvmarv #ifndef __KMARTIAN_H #define __KMARTIAN_H #include // pci_driver #include /*** proc entry */ #include /*** wait_queue */ #include #include "../martian.h" #include "fifo.h" #include "mfifo.h" #define MPREFIX __stringify (KBUILD_MODNAME) #define MINFO(fmt...) printk (KERN_INFO MPREFIX ": " fmt) #define MERROR(fmt...) printk (KERN_ERR MPREFIX ": " fmt) #define MARTIAN_DEBUG #ifdef MARTIAN_DEBUG # define MDEBUG(fmt...) printk (KERN_DEBUG MPREFIX ": " fmt) # define ASSERT(cond, action) do {if (! (cond)) { action }} while (0) #else # define MDEBUG(arg...) do {} while (0) # define ASSERT(cond, action) do {} while (0) #endif struct martian_metrics { unsigned BaseAddress; unsigned CommAddress; unsigned int irq; unsigned short vendor, device; unsigned short subsystem_vendor; unsigned short subsystem_device; unsigned flags; // void * unsigned char s7e, s75; unsigned short s82, s84, s86, s88; unsigned char dsp_mars; unsigned char dsp_mars3; }; struct martian { struct pci_dev *dev; struct proc_dir_entry *entry; unsigned long state; wait_queue_head_t wq; /* to wait in read/poll */ /* core variables; side-effect of some marsio */ /* changes are done on kernel leaving */ /* with this approach no trailing pointers in calls * for all dependencies, and no overhead for * numerous changes */ //u8 byte_f; /* isr data */ mfifo_t dce_tx; mfifo_t dce_rx; mfifo_t pdm_rx; atomic_t count; /* interrupt counter */ /* stats */ struct irqcount icounts; /* resources */ spinlock_t lock; /* common data pointer */ struct martian_common *common; int index; // configuration info struct martian_metrics metrics; /* hardware */ struct mparams { unsigned long flags; u8 dsp_mars; u8 dsp_mars3; u8 dp_version; u8 chip_version; u32 checksum; unsigned BaseAddress; unsigned BaseAddressData; unsigned BaseAddressIndex; unsigned BaseAddress2; unsigned short s82, s84, s86, s88; unsigned char s7e, s75, s7f; unsigned char DCPAudioOn; /* unsigned char scb; */ /* unsigned char sa6, sa7; unsigned char s7f; unsigned char sdf, se0, se1, se2; unsigned char se3, se4, se5; unsigned char se6; // flags */ } params; }; enum _mparams_flags { MPF_CPQ = 1, MPF_TOSHIBA = 2, }; #define mars_lock(dev, flags) spin_lock_irqsave (&dev->lock, flags) #define mars_unlock(dev, flags) spin_unlock_irqrestore (&dev->lock, flags) static inline void mars_copy_mcb_dynamic(struct martian *mdev) { struct martian_common *mcb = mdev->common; mcb->x_dsp_mars = mdev->params.dsp_mars; mcb->x_dsp_mars3 = mdev->params.dsp_mars3; mcb->x_chip_version = mdev->params.chip_version; } #define MARTIAN_STATE_OPEN 0 #define KMSTATE_UREADY 1 #define KMSTATE_FIFO_FAULT 2 #define KMSETTING_SERVE_IRQS 16 #define KMSETTING_TRUESMP 17 #define KMSETTING_DEBUG 18 #endif /* __KMARTIAN_H */ martian-full-20080625/kmodule/martian_ids.c0000644000175000017500000000673110510370246017154 0ustar marvmarv/* martian_ids.c * pci ids table for device * included into martian.c */ #define PCI_SUBVENDOR(_subvendor) \ .vendor = PCI_ANY_ID, .device = PCI_ANY_ID, \ .subvendor = (_subvendor), \ .subdevice = PCI_ANY_ID __devinitdata static struct pci_device_id martian_ids[] = { { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x440) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x441) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x442) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x443) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x444) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x445) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x446) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x447) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x448) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x449) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x44a) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x44b) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x44c) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x44d) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x44e) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x44f) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x450) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x451) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x452) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x453) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x454) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x455) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x456) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x457) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x458) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x459) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x45a) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x45b) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x45c) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x45d) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x45e) }, { PCI_DEVICE (PCI_VENDOR_ID_ATT, 0x45f) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x440) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x441) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x442) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x443) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x444) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x445) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x446) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x447) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x448) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x449) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x44a) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x44b) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x44c) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x44d) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x44e) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x44f) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x450) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x451) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x452) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x453) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x454) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x455) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x456) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x457) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x458) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x459) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x45a) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x45b) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x45c) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x45d) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x45e) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, 0x45f) }, { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, PCI_ANY_ID) }, /*** alternatively { PCI_DEVICE (PCI_VENDOR_ID_XIRCOM, PCI_ANY_ID), .class = PCI_CLASS_COMMUNICATION_SERIAL << 8, .class_mask = 0xffff00 }, and for MULTISERIAL/MODEM classes */ /*********** Toshibas **********/ { PCI_SUBVENDOR (PCI_VENDOR_ID_XIRCOM) }, /*** fin ***/ { 0, } }; martian-full-20080625/kmodule/fifo.h0000644000175000017500000000360010460620074015603 0ustar marvmarv#include typedef struct _fifo { /* struct circ_buf header; */ u16 *buf; int head; int tail; int size; int mask; } fifo_t; static inline void fifo_init (fifo_t *fifo, u16 *buf, int _size) { fifo->buf = buf; fifo->size = _size; fifo->mask = fifo->size - 1; } static inline void fifo_next (fifo_t *fifo) { fifo->tail++; fifo->tail &= fifo->mask; } static inline int fifo_full (fifo_t *fifo) { return 0 == CIRC_SPACE (fifo->head, fifo->tail, fifo->size); } static inline int fifo_empty (fifo_t *fifo) { return fifo->head == fifo->tail; } static inline u8 fifo_data (fifo_t *fifo) { return cpu_to_le16 (fifo->buf[fifo->tail]) & 0xff; /*return * (u8 *) (fifo->buf + tail);*/ } static inline u8 fifo_crl (fifo_t *fifo) { return cpu_to_le16 (fifo->buf[fifo->tail]) >> 8; /*return * 1 + (u8 *) (fifo->buf + tail);*/ } static inline void fifo_put (fifo_t *fifo, u16 c) { fifo->buf[fifo->head++] = c; fifo->head &= fifo->mask; } static inline u16 *fifo_last_written (fifo_t *fifo) { return &fifo->buf[ (fifo->head - 1) & fifo->mask ]; } static inline void fifo_flush (fifo_t *fifo) { fifo->head = fifo->tail = 0; } /* byte fifo */ typedef struct _fifo8 { /* struct circ_buf header; */ u8 *buf; int head; int tail; int size; int mask; } fifo8_t; static inline void fifo8_init (fifo8_t *fifo, u8 *buf, int _size) { fifo->buf = buf; fifo->size = _size; fifo->mask = fifo->size - 1; } static inline void fifo8_next (fifo8_t *fifo) { fifo->tail++; fifo->tail &= fifo->mask; } static inline int fifo8_full (fifo8_t *fifo) { return 0 == CIRC_SPACE (fifo->head, fifo->tail, fifo->size); } static inline int fifo8_empty (fifo8_t *fifo) { return fifo->head == fifo->tail; } static inline void fifo8_flush (fifo8_t *fifo) { fifo->head = fifo->tail = 0; } static inline void fifo8_put (fifo8_t *fifo, u8 c) { fifo->buf[fifo->head++] = c; fifo->head &= fifo->mask; } martian-full-20080625/kmodule/Files.txt0000644000175000017500000000036711034655012016317 0ustar marvmarvfifo.h Files.txt kmartian.h kmodulefiles.txt Makefile marsio.c marsio.h marsio.o martian.c martian_dev.ko martian_dev.mod.c martian_dev.mod.o martian_dev.o martian_ids.c martian.o mfifo.c mfifo.h mfifo.o mixspinlock.h modules.order Module.symvers martian-full-20080625/kmodule/mfifo.h0000644000175000017500000000500211024666141015760 0ustar marvmarv#ifndef __MFIFO_H #define __MFIFO_H #include #include #include #include #define MFIFO_OK 0 #define MFIFO_BINARY 1 #define MFIFO_U8 8 #define MFIFO_U16 9 #define MFIFO_U32 10 typedef struct _mfifo mfifo_t; struct mfifo_ops { void (*set) (mfifo_t *fifo, void *el); void (*get) (mfifo_t *fifo, void *el); void (*wrap) (mfifo_t *fifo, int *ending); int (*space) (mfifo_t *fifo); }; struct _mfifo { /* struct circ_buf header; */ char *buf; int head; int tail; int size; int esize; int mask; struct mfifo_ops ops; unsigned long flags; }; static inline int mfifo_ok (mfifo_t *fifo) { return test_bit (MFIFO_OK, &fifo->flags); } static inline void mfifo_next (mfifo_t *fifo) { fifo->tail++; fifo->ops.wrap (fifo, &fifo->tail); } static inline void mfifo_put (mfifo_t *fifo, void *el) { if (! mfifo_ok (fifo) || ! el) return; fifo->ops.set (fifo, el); fifo->head++; fifo->ops.wrap (fifo, &fifo->head); } static inline void mfifo_flush (mfifo_t *fifo) { fifo->head = fifo->tail = 0; } static inline int mfifo_full (mfifo_t *fifo) { return 0 == fifo->ops.space (fifo); } static inline int mfifo_empty (mfifo_t *fifo) { return fifo->head == fifo->tail; } static inline void *mfifo_tail (mfifo_t *fifo) { return mfifo_ok (fifo) ? fifo->buf + fifo->esize * fifo->tail : NULL; } static inline void mfifo_get (mfifo_t *fifo, void *el) { if (! mfifo_ok (fifo) || ! el) return; fifo->ops.get (fifo, el); /* fifo->next (fifo);*/ fifo->tail++; fifo->ops.wrap (fifo, &fifo->tail); } /* precond: ! mfifo_empty (fifo) */ static inline void *mfifo_lastwr (mfifo_t *fifo) { int lastwr = fifo->head - 1; fifo->ops.wrap (fifo, &lastwr); return fifo->buf + lastwr * fifo->esize; } static inline void *mfifo_head (mfifo_t *fifo) { return mfifo_ok (fifo) ? fifo->buf + fifo->head * fifo->esize : NULL; } void mfifo_init (mfifo_t *fifo, void *_buf, int _size, int _esize); #define MFIFO_INIT(fifo, buffer) \ mfifo_init (fifo, buffer, \ (sizeof buffer / sizeof buffer[0]), \ sizeof buffer[0]); #define MFIFO_DUMP(mdev, fifo) \ MINFO (#fifo ": %dx%d %s%s -> (%d, %d)\n", (mdev)->fifo.size, (mdev)->fifo.esize,\ test_bit (MFIFO_BINARY, &(mdev)->fifo.flags) ? "b | " : "", \ test_bit (MFIFO_U8, &(mdev)->fifo.flags) ? "u8" : \ test_bit (MFIFO_U16, &(mdev)->fifo.flags) ? "u16" : \ test_bit (MFIFO_U32, &(mdev)->fifo.flags) ? "u32" : \ "any", \ (mdev)->fifo.head, (mdev)->fifo.tail); #endif martian-full-20080625/kmodule/martian.c0000644000175000017500000006131211030572346016314 0ustar marvmarv/* martian.c: pci kernel mode driver module * * description: * driver takes control over 164x Agere devices * real work only in pair with martian_modem * * author(s): * A. Chentsov * * copying: GPLv2 * * * provides some inevitable low-level support for the user space modem driver (martian_modem) * * communication actions: * - pass device configuration information to the martian_modem * - process interrupts, notify driver through poll/read * * implementation details: * every device is represented by the node in the vfs * currently proc entries are used * module and martian_modem have the common block of information * the data is mapped into martian_modem process by mmap call * this is forced by isr dependance on run-time core state * * based on practices and ideas people worked out in linux kernel * * changes: * 06/2008 Added all IO routines. Exported to martian_modem through ioctl service. * 12/2006 Smp support with intermode synchronization. { Infidel idea. Abandoned. } * 07/2006 All data-related interrupt processing moved to kernel * 12/2005 First release. Minimal work in kernel: disabling further interrupt and relaying to martian_modem */ #include #include #include #include #include #include "kmartian.h" #include "../martian.h" #include "marsio.h" /***** Driver globals *****/ struct proc_dir_entry *martians_proc_dir = NULL; /**************************/ // statistics unsigned int interrupt_counter = 0; static char irqstring[11] = "|\0\0\0\0\0\0\0\0\0\0"; static int irqptr = 0; #define MARTIAN_IRQ_ACCOUNT(letter, count_letter) \ irqstring[irqptr] = letter; mdev->icounts.count_letter++; #define MARTIAN_IRQ_ACCOUNT_FIN \ do { \ if (++irqptr == 10) irqptr = 0; \ irqstring[irqptr] = '|'; \ } while (0) /***** ISR *****/ /* martian_isr * do data processing * relate ring and dcp to the martian_modem */ static irqreturn_t martian_isr (int irq, void *dev) { struct martian *mdev = (struct martian *) dev; struct martian_common *mcb = mdev->common; u8 rd7; irqreturn_t retval = IRQ_NONE; interrupt_counter++; if (test_bit (KMSTATE_UREADY, &mdev->state) && mcb->dp_bamil_rd7 == 0xff) { MARTIAN_IRQ_ACCOUNT('b', b); MARTIAN_IRQ_ACCOUNT_FIN; return IRQ_NONE; } spin_lock(&mdev->lock); rd7 = mars_read_register(mdev, 0xd7); if (rd7 == 0) { MARTIAN_IRQ_ACCOUNT('n', n); } else if (rd7 == 0xff) { MARTIAN_IRQ_ACCOUNT('f', f); } else if (rd7 & IR_SIGNIFICANT) { if (! test_bit (KMSTATE_UREADY, &mdev->state)) { mars_write_register(mdev, IR, 0xff); retval = IRQ_HANDLED; MARTIAN_IRQ_ACCOUNT('i', i); goto fin; } if (mdev->params.dsp_mars == 1) mars_write_word(mdev, 0x3c, 0x101); /* disabling */ mars_write_register(mdev, IR, 0xff); /* check not fully served yet by user */ if (atomic_read (&mcb->UnservedIrqs) > 0) { mcb->OverlappedIrqs++; atomic_set (&mcb->UnservedIrqs, 0); } atomic_inc (&mcb->UnservedIrqs); /* check not passed yet to user */ if (atomic_read (&mcb->UnpassedIrqs) > 0) mcb->RepeatedIrqs++; atomic_inc (&mcb->UnpassedIrqs); if (test_bit (KMSETTING_SERVE_IRQS, &mdev->state)) { if (rd7 & 2) process_ring(mdev); if (rd7 & 4) process_stream (mdev) && (rd7 &= ~4); if (rd7 & 8) { mars_write_register(mdev, 0xd8, 8); mcb->byte_c = mars_read_register(mdev, 0x32); mcb->byte_d = mars_read_register(mdev, 0x33); mcb->byte_e = mars_read_register(mdev, 0x34); mcb->dp_byte_f = mars_read_register(mdev, 0x35); rd7 &= ~8; } } if ((rd7 & IR_SIGNIFICANT) || test_bit (KMSTATE_FIFO_FAULT, &mdev->state)) { mcb->rd7_isr = rd7; /* notify readers */ atomic_inc (& mdev->count); wake_up_interruptible (& mdev->wq); } else { mars_write_register(mdev, IR, mcb->dp_bamil_rd7); atomic_dec (&mcb->UnservedIrqs); atomic_dec (&mcb->UnpassedIrqs); } retval = IRQ_HANDLED; MARTIAN_IRQ_ACCOUNT('i', i); } else { mars_write_register(mdev, IR, mcb->dp_bamil_rd7); retval = IRQ_HANDLED; MARTIAN_IRQ_ACCOUNT('o', o); } fin: spin_unlock(&mdev->lock); MARTIAN_IRQ_ACCOUNT_FIN; return retval; } /***** file operations on device node *****/ static int martian_open (struct inode *inode, struct file *filp) { // allow single open struct proc_dir_entry *entry = PDE (inode); struct martian *mdev = (struct martian *) entry->data; if (test_and_set_bit (MARTIAN_STATE_OPEN, &mdev->state)) { // already opened return -EBUSY; } filp->private_data = mdev; clear_bit (KMSTATE_FIFO_FAULT, &mdev->state); atomic_set (&mdev->count, 0); return 0; } void dump_core_vars_common (struct martian_common *common); /* clean up */ static int martian_release (struct inode *inode, struct file *filp) { // struct martian *mdev = (struct martian *) PDE(inode)->data; struct martian *mdev = (struct martian *) filp->private_data; int debug; atomic_set (&mdev->common->UnservedIrqs, 0); clear_bit (MARTIAN_STATE_OPEN, &mdev->state); clear_bit (KMSETTING_SERVE_IRQS, &mdev->state); mars_write_register_safe(mdev, IR, 0xff); mdev->common->dp_bamil_rd7 = 0xff; debug = test_and_clear_bit (KMSETTING_DEBUG, &mdev->state); clear_bit (KMSTATE_UREADY, &mdev->state); /* reset core related params */ mdev->params.DCPAudioOn = 0; pr_info("martian_modem is detached\n"); if (debug) { dump_core_vars_common (mdev->common); MFIFO_DUMP (mdev, dce_rx); MFIFO_DUMP (mdev, pdm_rx); MFIFO_DUMP (mdev, dce_tx); } atomic_set (&mdev->count, 0); /* check with wq */ mars_write_register(mdev, IR, 0xff); return 0; } /* poll&select */ static unsigned int martian_poll(struct file *filp, struct poll_table_struct *wait) { struct martian *mdev = (struct martian *) filp->private_data; if (atomic_read (& mdev->count) > 0) return POLLIN | POLLRDNORM; /* readable */ poll_wait (filp, & mdev->wq, wait); if (atomic_read(& mdev->count) > 0) return POLLIN | POLLRDNORM; /* readable */ return 0; } /* ioctl logger(s) */ #define DUMP_CORE_COMMON(fmt, var) pr_info("martian:" fmt, #var, common->var) void dump_core_vars_common (struct martian_common *common) { pr_info("martian: Core vars:\n"); pr_info("martian: Variable\t\t\tValue\n"); DUMP_CORE_COMMON ("%s\t\t\t0x%x\n", BaseAddress); DUMP_CORE_COMMON ("%s\t\t\t0x%x\n", BaseAddress2); DUMP_CORE_COMMON ("%s\t\t0x%x\n", BaseAddressIndex); DUMP_CORE_COMMON ("%s\t\t\t0x%x\n", BaseValue); DUMP_CORE_COMMON ("%s\t\t\t0x%x\n", BaseAddressData); DUMP_CORE_COMMON ("%s\t\t\t0x%x\n", dp_bamil_rd7); DUMP_CORE_COMMON ("%s\t\t\t%d\n", x_dsp_mars); } /* ioctl getters */ static void fill_martian_conf (struct martian_conf *conf, struct martian *mdev) { struct martian_metrics *metrics = &mdev->metrics; conf->BaseAddress = metrics->BaseAddress; conf->CommAddress = metrics->CommAddress; conf->irq = metrics->irq; conf->device = metrics->device; conf->vendor = metrics->vendor; conf->subsys_vendor = metrics->subsystem_vendor; conf->subsys_device = metrics->subsystem_device; conf->flags = metrics->flags; conf->index = mdev->index; } static void fill_martian_irq (struct martian_irq_state *state, struct martian *mdev) { memcpy (state->string, irqstring, sizeof state->string); state->count = interrupt_counter; state->counts = mdev->icounts; } /* * sys_ioctl: * unlocked_ioctl * * compat_sys_ioctl: * compat_ioctl * * no conventional */ typedef long martian_ioctl_result_t; #define copy_struct_to_user(dst, s) \ copy_to_user ((void __user *) dst, &s, sizeof s) ? -EFAULT : 0 /* martian_ioctl: * for unlocked and compat ioctl calls * no presumption about BKL */ static martian_ioctl_result_t martian_ioctl (struct file *filp, unsigned int cmd, unsigned long arg) { struct martian *mdev = (struct martian *) filp->private_data; /* void *buf; int size; */ switch (cmd) { case MARTIAN_CONF_GET: { struct martian_conf conf; fill_martian_conf (&conf, mdev); return copy_struct_to_user (arg, conf); } case MARTIAN_IRQ_STATE: { struct martian_irq_state irq_state; fill_martian_irq (&irq_state, mdev); return copy_struct_to_user (arg, irq_state); } case MARTIAN_DUMP_VARS: dump_core_vars_common (mdev->common); return 0; case MARTIAN_MODEM_READY: if (mdev->common->write_check != 'm') { MERROR("common block failure\n"); return -EFAULT; } if (! test_bit (KMSETTING_SERVE_IRQS, &mdev->state)) { unsigned long flags; pr_debug("martian: serving irqs in module\n"); mars_lock(mdev, flags); mfifo_flush (&mdev->dce_rx); mfifo_flush (&mdev->dce_tx); mfifo_flush (&mdev->pdm_rx); mars_unlock(mdev, flags); set_bit (KMSETTING_SERVE_IRQS, &mdev->state); } set_bit (KMSTATE_UREADY, &mdev->state); pr_info("martian_modem is attached.\n"); return 0; case MARTIAN_KDEBUG: set_bit (KMSETTING_DEBUG, &mdev->state); pr_info("martian: debug option is enabled.\n"); return 0; case MARTIAN_TRUE_SMP: case MARTIAN_CHECK_SMP: pr_info("martian: smp ioctls are obsolete\n"); return -ENOIOCTLCMD; case MARTIAN_IOCTL_CMD_READ_DSP: return mars_read_dsp_ram (mdev, (u16 ) arg); case MARTIAN_IOCTL_CMD_WRITE_DSP: { struct _mstore a; if (copy_from_user (&a, (void __user *) arg, sizeof a)) return -EFAULT; mars_write_dsp_ram (mdev, a.addr, a.val); return 0; } case MARTIAN_IOCTL_CMD_CLEAR_DSP: mars_clear_dsp_ram (mdev); return 0; case MARTIAN_IOCTL_CMD_DLOAD_DSP: { struct _mdsp bundle; int res; if (copy_from_user (&bundle, (void __user *) arg, sizeof bundle)) return -EFAULT; //mdev->params.DCPAudioOn = bundle.DCPAudioOn; res = mars_download_dsp_user (mdev, (u16 __user *) bundle.data, bundle.num); if (copy_to_user ((void __user *) bundle.pdp_byte_f, &mdev->common->dp_byte_f, sizeof mdev->common->dp_byte_f)) { MERROR ("DLOAD: Failed to update byte_f\n"); if (res >= 0) res = -EFAULT; } return res; } case MARTIAN_IOCTL_CMD_READREG: return mars_read_register_safe(mdev, (u8 ) arg); case MARTIAN_IOCTL_CMD_WRITEREG: { struct _mstore a; if (copy_from_user (&a, (void __user *) arg, sizeof a)) return -EFAULT; mars_write_register_safe(mdev, a.addr, a.val); return 0; } case MARTIAN_IOCTL_CMD_WRITE: { struct _write_params a; if (copy_from_user (&a, (void __user *) arg, sizeof a)) return -EFAULT; switch(a.type) { case Byte: mars_write_byte(mdev, a.addr, a.val); break; case Word: mars_write_word(mdev, a.addr, a.val); break; case Dword: mars_write_dword(mdev, a.addr, a.val); break; } return 0; } case MARTIAN_IOCTL_CMD_REGANDOR: { struct _andor_params a; if (copy_from_user (&a, (void __user *) arg, sizeof a)) return -EFAULT; mars_reg_andor(mdev, a.reg, a.mask_and, a.mask_or); return 0; } case MARTIAN_IOCTL_CMD_COMMAND: { struct _command_params a; if (copy_from_user (&a, (void __user *) arg, sizeof a)) return -EFAULT; mars_command (mdev, a.cmd, a.a1, a.a2); return 0; } case MARTIAN_IOCTL_CMD_LONGCMD: { struct _longcmd_params a; if (copy_from_user (&a, (void __user *) arg, sizeof a)) return -EFAULT; if (mars_command_long (mdev, a.cmd, a.a1, a.a2, a.a3, a.a4) == -1) { MERROR("long cmd failure\n"); return 1; } return 0; } case MARTIAN_IOCTL_CMD_CSUM: return mars_dsp_rom_checksum(mdev); case MARTIAN_IOCTL_CMD_DCPAUDIO: mdev->params.DCPAudioOn = (mdev->params.DCPAudioOn == 0) ? 1 : 0; return 0; case MARTIAN_IOCTL_CMD_OUTINIT: mdev->params.dsp_mars = mdev->common->x_dsp_mars; mdev->params.dsp_mars3 = mdev->common->x_dsp_mars3; return 0; default: return -ENOIOCTLCMD; } } /* martian_mmap: * maps common data into martian_modem process space * * we prefer vm_insert_page method to remap_pfn_range */ static int martian_mmap(struct file *filp, struct vm_area_struct * vma) { struct martian *mdev = (struct martian *) filp->private_data; unsigned long uaddr; void *kaddr; int size; size = PAGE_ALIGN(sizeof *mdev->common); if (vma->vm_end - vma->vm_start != size) return -EINVAL; uaddr = vma->vm_start; kaddr = mdev->common; for (; size > 0; size -= PAGE_SIZE) { int res = vm_insert_page(vma, uaddr, vmalloc_to_page(kaddr)); if (res) return res; uaddr += PAGE_SIZE; kaddr += PAGE_SIZE; } mdev->common->write_check = '\0'; return 0; } /* single reader only; * it won't function correctly with more */ static ssize_t martian_read (struct file *filp, char __user *buf, size_t count, loff_t *ppos) { struct martian *mdev = (struct martian *) filp->private_data; unsigned int pulses; int ret; if (count < sizeof mdev->count) return -EINVAL; // NONBLOCK to be added ret = wait_event_interruptible ( mdev->wq, (pulses = atomic_read (&mdev->count)) > 0 ); if (ret == 0) { atomic_dec (&mdev->common->UnpassedIrqs); atomic_sub (pulses, &mdev->count); if (put_user (pulses, (unsigned int __user *) buf) != 0) return -EFAULT; *ppos += sizeof pulses; return sizeof pulses; } return ret; } struct file_operations martian_fops = { .owner = THIS_MODULE, .open = martian_open, .release = martian_release, .read = martian_read, .poll = martian_poll, .mmap = martian_mmap, .unlocked_ioctl = martian_ioctl, #if HAVE_COMPAT_IOCTL .compat_ioctl = martian_ioctl, #endif }; /***** martian devices management *****/ static int dev_idx = 0; static void __devinit martian_configure_isr (struct martian *mdev) { struct martian_common *mcb = mdev->common; clear_bit (KMSTATE_UREADY, &mdev->state); clear_bit (KMSETTING_SERVE_IRQS, &mdev->state); init_waitqueue_head (& mdev->wq); atomic_set (&mdev->count, 0); /* register settings */ mcb->BaseAddress = mdev->metrics.BaseAddress; mcb->BaseAddressData = mdev->metrics.BaseAddress + 1; mcb->BaseAddress2 = mdev->metrics.BaseAddress + 2; mcb->BaseAddressIndex = mdev->metrics.BaseAddress; /* mcb->BaseValue - defined by first nonint reg{read,write} */ mars_write_register_safe(mdev, IR, 0xff); mcb->dp_bamil_rd7 = 0xff; } static void __devinit martian_configure_params (struct martian *mdev) { mdev->params.dsp_mars = mdev->metrics.dsp_mars; mdev->params.dsp_mars3 = mdev->metrics.dsp_mars3; if (mdev->metrics.flags & MARTIAN_DEV_TOSHIBA) mdev->params.flags = MPF_TOSHIBA; mdev->params.s82 = mdev->metrics.s82; mdev->params.s84 = mdev->metrics.s84; mdev->params.s86 = mdev->metrics.s86; mdev->params.s88 = mdev->metrics.s88; mdev->params.s75 = mdev->metrics.s75; mdev->params.s7e = mdev->metrics.s7e; mdev->params.checksum = 0; mdev->params.chip_version = 0; mdev->params.BaseAddress = mdev->metrics.BaseAddress; mdev->params.BaseAddressData = mdev->metrics.BaseAddress + 1; mdev->params.BaseAddressIndex = mdev->metrics.BaseAddress; mdev->params.BaseAddress2 = mdev->metrics.BaseAddress + 2; } static void martian_init_mcb(struct martian *mdev) { struct martian_common *mcb = mdev->common; strcpy (mcb->signature, MARTIAN_SIGNATURE); strcpy (mcb->tsignature, MARTIAN_TSIGNATURE); strcpy (mcb->kstamp, __stringify (KMARTIAN_STAMP)); MFIFO_INIT (&mdev->dce_rx, mcb->io_dce_rx_buff); MFIFO_INIT (&mdev->dce_tx, mcb->io_dce_tx_buff); MFIFO_INIT (&mdev->pdm_rx, mcb->io_pdm_rx_buff); mcb->tx_incorrespondence = mcb->rx_incorrespondence = mcb->pdm_rx_incorrespondence = 0; mcb->pdm_rx_overrun = mcb->rx_overrun = 0; /* core variables */ *(u16 *)&mcb->S[0x82] = mdev->metrics.s82; *(u16 *)&mcb->S[0x84] = mdev->metrics.s84; *(u16 *)&mcb->S[0x86] = mdev->metrics.s86; *(u16 *)&mcb->S[0x88] = mdev->metrics.s88; mcb->S[0x75] = mdev->metrics.s75; mcb->S[0x7e] = mdev->metrics.s7e; mcb->S[0xa6] = 0x12; mcb->S[0xa7] = 0x50; mcb->x_dsp_mars = mdev->params.dsp_mars; mcb->x_dsp_mars3 = mdev->params.dsp_mars3; } void mars_report_config(struct martian *mdev) { pr_debug("martian: chip version %d, dp version 0x%x, checksum 0x%x\n", mdev->params.chip_version, mdev->params.dp_version, mdev->params.checksum); } struct martian *martian_add (struct martian_metrics *metrics, int *error) { struct martian *mdev; int ret; char name[20] = "driver/mars/0"; struct martian_common *mcb = NULL; mdev = kzalloc (sizeof *mdev, GFP_KERNEL); if (!mdev) { *error = -ENOMEM; return NULL; } mdev->metrics = *metrics; /*** allocate pages for common data ***/ mcb = vmalloc_32(sizeof *mcb); if (! mcb) { MERROR ("page allocation failure\n"); ret = -ENOMEM; goto err_free_mdev; } memset (mcb, 0, sizeof *mcb); spin_lock_init (&mdev->lock); // as soon interrupt allocated we should be ready to handle it mdev->common = mcb; martian_configure_isr (mdev); martian_configure_params (mdev); // claim resource ret = request_irq( metrics->irq, martian_isr, IRQF_SHARED | IRQF_DISABLED, "164x", mdev ); if (ret < 0) { MERROR ("failed to request irq\n"); goto err_free_common; } // just to be explicit clear_bit (MARTIAN_STATE_OPEN, &mdev->state); clear_bit (KMSETTING_DEBUG, &mdev->state); // create proc entry for this device name[ strlen(name) - 1 ] = '0' + dev_idx; mdev->entry = create_proc_entry (name, 0400, NULL); if (! mdev->entry) { MERROR ("martian: failed to create /proc/%s\n", name); ret = -ENOMEM; goto err_free_irq; } martian_init_mcb(mdev); // set an index mdev->index = dev_idx; mdev->entry->proc_fops = & martian_fops; mdev->entry->data = mdev; pr_info("martian: added device %x:%x " "BaseAddress = 0x%x, CommAddres = 0x%x, irq = %d%s\n", metrics->vendor, metrics->device, metrics->BaseAddress, metrics->CommAddress, metrics->irq, (metrics->flags & MARTIAN_DEV_TOSHIBA) ? ", Toshiba" :"" ); mars_report_config(mdev); dev_idx++; return mdev; err_free_irq: free_irq (metrics->irq, mdev); err_free_common: vfree(mcb); err_free_mdev: kfree (mdev); *error = ret; return NULL; } void martian_del (struct martian *mdev) { char name[20] = "driver/mars/0"; name[ strlen(name) - 1 ] = '0' + mdev->index; remove_proc_entry (name, NULL); free_irq(mdev->metrics.irq, mdev); vfree(mdev->common); kfree(mdev); } /***** PCI Driver Interface *****/ static int __devinit martian_device_gatherinfo (const struct pci_dev *dev, const struct pci_device_id *ent, struct martian_metrics *metrics) { int bar; unsigned short id; memset(metrics, 0, sizeof *metrics); /*** common setting ***/ metrics->subsystem_device = dev->subsystem_device; metrics->subsystem_vendor = dev->subsystem_vendor; metrics->device = dev->device; metrics->vendor = dev->vendor; metrics->irq = dev->irq; if (ent && ent->subvendor == PCI_VENDOR_ID_ATT) { /* Toshibas */ switch (dev->class >> 8) { case PCI_CLASS_COMMUNICATION_SERIAL: case PCI_CLASS_COMMUNICATION_MULTISERIAL: case PCI_CLASS_COMMUNICATION_MODEM: case PCI_CLASS_COMMUNICATION_OTHER: break; default: return -ENODEV; } if (PCI_FUNC (dev->devfn) != 0) { pr_info ("martian: Toshiba outside the range\n"); return -ENODEV; } metrics->device = 0x440; metrics->vendor = PCI_VENDOR_ID_ATT; metrics->CommAddress = pci_resource_start (dev, 1); metrics->BaseAddress = pci_resource_start (dev, 2); metrics->flags |= MARTIAN_DEV_TOSHIBA; pr_debug ("martian: Toshiba device\n"); return 0; } // check range for xircom if (ent && ent->vendor == PCI_VENDOR_ID_XIRCOM && ent->device == PCI_ANY_ID) switch (dev->class >> 8) { case PCI_CLASS_COMMUNICATION_SERIAL: case PCI_CLASS_COMMUNICATION_MULTISERIAL: case PCI_CLASS_COMMUNICATION_MODEM: case PCI_CLASS_COMMUNICATION_OTHER: if (! (dev->device <= 0x3ff)) { MERROR ("XIRCOM outside the range\n"); return -ENODEV; } break; default: return -ENODEV; } // all ids added through sysfs come here /* Base/Common Addresses */ for (bar = 5; bar >= 0; bar--) if ( pci_resource_start (dev, bar) != 0 && (pci_resource_flags (dev, bar) & IORESOURCE_IO) ) { metrics->BaseAddress = pci_resource_start (dev, bar); break; } // continue for (bar--; bar >= 0; bar--) if ( pci_resource_start (dev, bar) != 0 && (pci_resource_flags (dev, bar) & IORESOURCE_IO) ) { metrics->CommAddress = pci_resource_start (dev, bar); break; } if (! metrics->BaseAddress) { MERROR ("base address not found\n"); return -ENODEV; } id = metrics->device; metrics->dsp_mars = 1; metrics->dsp_mars3 = 0; metrics->s88 = metrics->vendor; /* metrics!!! */ metrics->s86 = metrics->device; metrics->s82 = dev->subsystem_vendor; metrics->s84 = dev->subsystem_device; metrics->s75 = 0; metrics->s7e = metrics->device & 0xf; if (dev->subsystem_vendor == PCI_VENDOR_ID_NEC) metrics->s75 = 0x70; if (dev->vendor == PCI_VENDOR_ID_XIRCOM && dev->subsystem_vendor == PCI_VENDOR_ID_INTEL) { metrics->s82 = PCI_VENDOR_ID_XIRCOM; metrics->dsp_mars = 0; metrics->s7e = 0xa0; } if (dev->vendor == PCI_VENDOR_ID_XIRCOM || dev->subsystem_vendor == PCI_VENDOR_ID_XIRCOM) { if (dev->subsystem_device == 0x45b) { metrics->s86 = id = 0x45b; } } switch (id) { case 0x443: metrics->s7e = 0; break; case 0x45b: metrics->dsp_mars3 = 4; case 0x444: metrics->dsp_mars = 0; metrics->s7e = 0xa0; break; case 0x45c: metrics->dsp_mars3 = 3; case 0x445: metrics->dsp_mars = 0; metrics->s7e = 0xa0; metrics->s75 = 0x50; break; case 0x446: metrics->dsp_mars = 0; metrics->s7e = 0; break; case 0x447: metrics->dsp_mars = 0; metrics->s7e = 0; metrics->s75 = 0x50; break; case 0x44b: case 0x457: metrics->s7e = 8; break; case 0x44d: case 0x455: case 0x456: metrics->dsp_mars3 = 4; metrics->s7e = 0; break; case 0x44e: metrics->dsp_mars3 = 3; metrics->s7e = 1; break; case 0x450: metrics->dsp_mars3 = 3; metrics->s7e = 9; break; case 0x453: case 0x451: metrics->dsp_mars3 = 3; metrics->s7e = 0; break; case 0x454: case 0x452: metrics->dsp_mars3 = 3; metrics->s7e = 8; break; case 0x458: metrics->dsp_mars3 = 3; metrics->s7e = 2; break; case 0x45a: case 0x44c: metrics->dsp_mars3 = 4; metrics->s7e = 2; break; case 0x45d: case 0x459: metrics->dsp_mars3 = 3; metrics->s7e = 0xa; break; } return 0; } static int __devinit mars_device_probe (struct pci_dev *dev, const struct pci_device_id *ent) { int ret; struct martian *mdev; struct martian_metrics metrics; ret = pci_enable_device (dev); if (ret != 0) { MERROR ("failed to enable device\n"); pr_debug("martian: res %d\n", ret); return -ENODEV; } // initialize data ret = martian_device_gatherinfo (dev, ent, &metrics); if (ret < 0) { MERROR ("failed to gather device info\n"); goto err_disable_pci; } mdev = martian_add (&metrics, &ret); if (! mdev) { goto err_disable_pci; } pci_set_drvdata (dev, mdev); dev_idx++; return 0; err_disable_pci: pci_disable_device (dev); return ret; } static void __devexit mars_remove (struct pci_dev *dev) { martian_del (pci_get_drvdata (dev)); pci_disable_device (dev); } #include "martian_ids.c" // the device struct pci_driver martian_driver = { .name = "martian", .probe = mars_device_probe, .remove = __devexit_p (mars_remove), .id_table = martian_ids }; #define for_each_pci_dev_in_class(_class, mask, dev) \ while ((dev = pci_get_device (PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) \ if ((dev->class ^ _class) & mask) \ continue; \ else // ^ pci_get_class won't do cause we need a mask #define SERIAL_DRIVER "serial" static void __devinit detach_from_serial_class (unsigned int class, unsigned int mask) { struct pci_dev *dev = NULL; const struct pci_device_id *entry; for_each_pci_dev_in_class (class, mask, dev) { if (! dev->driver || ! dev->driver->name || strcmp (SERIAL_DRIVER, dev->driver->name) ) continue; entry = pci_match_id (martian_ids, dev); if (entry && entry->vendor != PCI_ANY_ID) { pr_debug("martian: detaching %x:%x from %s\n", dev->vendor, dev->device, dev->driver->name); device_release_driver (& dev->dev); } } } static void __devinit detach_from_serial(void) { detach_from_serial_class (PCI_CLASS_COMMUNICATION_SERIAL << 8, 0xffff00); detach_from_serial_class (PCI_CLASS_COMMUNICATION_MODEM << 8, 0xffff00); detach_from_serial_class (PCI_CLASS_COMMUNICATION_MULTISERIAL << 8, 0xffff00); detach_from_serial_class (PCI_CLASS_COMMUNICATION_OTHER << 8, 0xffff00); } /***** kernel module interface *****/ static int __init martian_init (void) { pr_info("martian loaded - " __stringify (KMARTIAN_STAMP) "\n"); // allocate proc directory for martians martians_proc_dir = proc_mkdir ("driver/mars", NULL); if (! martians_proc_dir) { MERROR ("cannot create dir\n"); return -ENOMEM; } detach_from_serial(); return pci_register_driver (&martian_driver); } static void __exit martian_exit(void) { pci_unregister_driver (&martian_driver); remove_proc_entry ("driver/mars", NULL); } module_exit (martian_exit); module_init (martian_init); /***** module info *****/ MODULE_LICENSE ("GPL"); MODULE_AUTHOR ("A. Chentsov"); MODULE_DESCRIPTION ("Agere 164x dsp driver"); MODULE_DEVICE_TABLE( pci, martian_ids ); martian-full-20080625/kmodule/kmodulefiles.txt0000644000175000017500000000016411033004432017724 0ustar marvmarvfifo.h kmartian.h kmodulefiles.txt Makefile marsio.c marsio.h martian.c martian_ids.c mfifo.c mfifo.h mixspinlock.h martian-full-20080625/kmodule/marsio.c0000644000175000017500000004505211025434573016161 0ustar marvmarv#include #include #include #include "kmartian.h" #include "../martian.h" #include "marsio.h" u8 mars_read_register (struct martian *mdev, u8 reg) { outb ( reg, (reg < 0x80) || ((reg >= 0xa0) && (reg < 0xd0)) ? mdev->params.BaseAddress : mdev->params.BaseAddress2 ); return inb(mdev->params.BaseAddressData); } void mars_write_register(struct martian *mdev, u8 reg, u8 val) { outb(reg, mdev->params.BaseAddress); return outb(val, mdev->params.BaseAddressData); } void mars_write_byte(struct martian *mdev, u16 addr, u8 val) { outb(val, mdev->params.BaseAddress + addr); } void mars_write_word(struct martian *mdev, u16 addr, u16 val) { outw(val, mdev->params.BaseAddress + addr); } void mars_write_dword(struct martian *mdev, u16 addr, u32 val) { outl(val, mdev->params.BaseAddress + addr); } #define CHECK_FIFO_CORRESPOND_HEAD(fifo) \ ({ \ int incor = 0; \ int size = sizeof mcb->io_##fifo##_buff \ / sizeof mcb->io_##fifo##_buff[0]; \ int uhead = (mcb->io_##fifo##_wptr - mcb->io_##fifo##_buff_um) \ / sizeof mcb->io_##fifo##_buff[0]; \ int utail = (mcb->io_##fifo##_rptr - mcb->io_##fifo##_buff_um) \ / sizeof mcb->io_##fifo##_buff[0]; \ if (uhead != mdev->fifo.head) { \ mdev->fifo.head = uhead; \ incor = 1; \ } \ (!incor) && (utail >= 0) && (utail < size); \ }) #define KFIFO_UPDATE_TAIL(fifo) \ mdev->fifo.tail = (mcb->io_##fifo##_rptr - mcb->io_##fifo##_buff_um) \ / sizeof mcb->io_##fifo##_buff[0]; #define UFIFO_UPDATE_HEAD(fifo) \ mcb->io_##fifo##_wptr = mcb->io_##fifo##_buff_um + \ (sizeof mcb->io_##fifo##_buff[0]) * mdev->fifo.head; static inline unsigned char mdual_port_rx (struct martian *mdev) { struct martian_common *mcb = mdev->common; register __u16 *startptr; __u8 reg, rb0; int num; mcb->dual_port_rx++; rb0 = mars_read_register(mdev, 0xb0); num = rb0 & 0x1f; if (num == 0) return mars_read_register(mdev, 0xb0); ASSERT (CHECK_FIFO_CORRESPOND_HEAD (dce_rx), mcb->rx_incorrespondence++;); KFIFO_UPDATE_TAIL (dce_rx); mcb->rx += num; startptr = (u16 *) mfifo_head (&mdev->dce_rx); reg = 0x90; while (--num != -1) { u16 val = mars_read_register(mdev, reg++); /* on BE should be transformed to LE */ val = cpu_to_le16 (val); mfifo_put (&mdev->dce_rx, &val); if (mfifo_empty (&mdev->dce_rx)) mcb->rx_overrun++; } /* update modem's */ UFIFO_UPDATE_HEAD (dce_rx); if (rb0 & 0x20) *startptr |= cpu_to_le16 (0x4000); if ((rb0 & 0xc0) && ! mfifo_empty (&mdev->dce_rx)) { u16 *lastptr = (u16 *) mfifo_lastwr (&mdev->dce_rx); if (rb0 & 0x80) *lastptr |= cpu_to_le16 (0x8000); if (rb0 & 0x40) *lastptr |= cpu_to_le16 (0xa800); } // ASSERT (mfifo_ok (&mdev->dce_rx), mcb->kfifo_rx_bad++;); return mars_read_register(mdev, 0xb0); } static __u8 Last_rbs_tick; static inline int mio_dual_port_rx (struct martian *mdev) { struct martian_common *mcb = mdev->common; u8 rb0 = mars_read_register(mdev, 0xb0); u8 reg = 0x90; u8 num = 16; u32 io_dce_rx_rptr = mcb->io_dce_rx_rptr; u32 io_dce_rx_wptr = mcb->io_dce_rx_wptr; if (mcb->init_RBS_tick_flag) { rb0 &= 0x7; mcb->RBS_tick_rx = rb0; mcb->init_RBS_tick_flag = 0; } else if ((Last_rbs_tick + 4) % 6 != rb0) return mars_read_register(mdev, 0xb0); Last_rbs_tick = rb0; ASSERT (CHECK_FIFO_CORRESPOND_HEAD (pdm_rx), mcb->pdm_rx_incorrespondence++;); KFIFO_UPDATE_TAIL (pdm_rx); do { u8 val = mars_read_register(mdev, reg++); mfifo_put (&mdev->pdm_rx, &val); /* if (mfifo_full (&mcb->pdm_rx)) */ if (mfifo_empty (&mdev->pdm_rx)) mcb->pdm_rx_overrun++; } while (--num); UFIFO_UPDATE_HEAD (pdm_rx); if (test_bit (KMSETTING_DEBUG, &mdev->state)) { if (io_dce_rx_rptr != mcb->io_dce_rx_rptr) { mcb->pdm_dirty++; mcb->latest_rptr = mcb->io_dce_rx_rptr; } if (io_dce_rx_wptr != mcb->io_dce_rx_wptr) { mcb->pdm_dirty += 0x1000; mcb->latest_wptr = mcb->io_dce_rx_wptr; } if ((io_dce_rx_wptr != mcb->io_dce_rx_wptr) || (io_dce_rx_wptr != mcb->io_dce_rx_wptr)) set_bit (KMSTATE_FIFO_FAULT, &mdev->state); } mcb->io_dual_port_rx++; mcb->pdm_rx += (16 - num); return mars_read_register(mdev, 0xb0); } #define CRL_BYTE(w) ((w) >> 8) #define CHECK_FIFO_CORRESPOND_TAIL(fifo) \ ({ \ int incor = 0; \ int size = sizeof mcb->io_##fifo##_buff \ / sizeof mcb->io_##fifo##_buff[0]; \ int uhead = (mcb->io_##fifo##_wptr - mcb->io_##fifo##_buff_um) \ / sizeof mcb->io_##fifo##_buff[0]; \ int utail = (mcb->io_##fifo##_rptr - mcb->io_##fifo##_buff_um) \ / sizeof mcb->io_##fifo##_buff[0]; \ if (utail != mdev->fifo.tail) { \ mdev->fifo.tail = utail; \ incor = 1; \ } \ (!incor) && (uhead >= 0) && (uhead < size); \ }) #define KFIFO_UPDATE_HEAD(fifo) \ mdev->fifo.head = (mcb->io_##fifo##_wptr - mcb->io_##fifo##_buff_um) \ / sizeof mcb->io_##fifo##_buff[0]; #define UFIFO_UPDATE_TAIL(fifo) \ mcb->io_##fifo##_rptr = mcb->io_##fifo##_buff_um + \ (sizeof mcb->io_##fifo##_buff[0]) * mdev->fifo.tail; #define CF_CRL_BYTE(w) (le16_to_cpu (w) >> 8) #define CF_DATA_BYTE(w) (le16_to_cpu (w) & 0xff) static inline void mdual_port_tx (struct martian *mdev) { struct martian_common *mcb = mdev->common; unsigned char reg; unsigned char crl, num; mcb->dual_port_tx++; mars_read_register(mdev, 0x32); reg = 0x80; crl = CF_CRL_BYTE (*(u16 *) mfifo_tail (&mdev->dce_tx)); crl &= (crl & 0x20) ? 0x20 : 0x40; ASSERT (CHECK_FIFO_CORRESPOND_TAIL (dce_tx), mcb->tx_incorrespondence++;); KFIFO_UPDATE_HEAD (dce_tx); while (reg <= 0x85 && ! mfifo_empty (&mdev->dce_tx)) { u16 val; mfifo_get (&mdev->dce_tx, &val); mars_write_register(mdev, reg++, CF_DATA_BYTE(val)); if (CF_CRL_BYTE (val) & 0x80) { crl |= 0x80; break; } if (0x40 & CF_CRL_BYTE (* (u16 *) mfifo_tail (&mdev->dce_tx))) break; } UFIFO_UPDATE_TAIL (dce_tx); num = reg - 0x80; if (num != 0) { crl |= num; mcb->tx += num; mcb->dp_dsp_data_in_progress = 1; mars_write_register(mdev, 0xb0, crl); } else { mcb->dp_dsp_data_in_progress = 0; mars_write_register(mdev, 0xb7, 1); } // ASSERT (mfifo_ok(&mdev->dce_tx), mcb->kfifo_tx_bad++;); } int process_stream (struct martian *mdev) { struct martian_common *mcb = mdev->common; u32 io_dce_rx_rptr = mcb->io_dce_rx_rptr; u32 io_dce_rx_wptr = mcb->io_dce_rx_wptr; if (mars_read_register(mdev, 0xb6) & 0x10) { if (mcb->S[0x6b] == 1 && ! mcb->V34Mode && mcb->S[0x96] == 0) /* return 0; */ mio_dual_port_rx (mdev); else { mdual_port_rx (mdev); io_dce_rx_wptr = mcb->io_dce_rx_wptr; } } if (mars_read_register(mdev, 0xb6) & 0x1) mdual_port_tx (mdev); if (test_bit (KMSETTING_DEBUG, &mdev->state)) { if (io_dce_rx_rptr != mcb->io_dce_rx_rptr) { mcb->dirty++; mcb->latest_rptr = mcb->io_dce_rx_rptr; } if (io_dce_rx_wptr != mcb->io_dce_rx_wptr) { mcb->dirty += 0x1000; mcb->latest_wptr = mcb->io_dce_rx_wptr; } if ((io_dce_rx_wptr != mcb->io_dce_rx_wptr) || (io_dce_rx_wptr != mcb->io_dce_rx_wptr)) set_bit (KMSTATE_FIFO_FAULT, &mdev->state); } if (mars_read_register(mdev, 0xb6) & 0x20) { u8 reg = 0xb3; u8 buf[3]; struct mcirc *circ = &mcb->dcp_circ; int i, c, written; for (i = 0; reg >= 0xb1; reg--) buf[i++] = mars_read_register(mdev, reg); c = CIRC_SPACE_TO_END(circ->head, circ->tail, sizeof mcb->dcp_buf); if (c > 3) c = 3; for (i = 0; i < c; i++) mcb->dcp_buf[circ->head + i] = buf[i]; written = c; circ->head = (circ->head + c) & (sizeof mcb->dcp_buf - 1); if (3 - written) { c = CIRC_SPACE(circ->head, circ->tail, sizeof mcb->dcp_buf); if (c > 3 - written) c = 3 - written; for (i = 0; i < c; i++) mcb->dcp_buf[i] = buf[written + i]; circ->head = c; } mars_read_register(mdev, 0xb1); return 0; } return 1; } void process_ring(struct martian *mdev) { struct martian_common *mcb = mdev->common; if (mcb->dp_sleep == 1) { mars_write_register(mdev, 0xcb, 0x1d); mcb->dp_bamil_rd7 = 0xff; } mcb->dp_ring_int_count++; if (mdev->params.dsp_mars3 == 4) mars_write_register(mdev, 0xad, 0x21); if (mcb->dp_ring_int_count <= ((mdev->params.dsp_mars3 == 4) ? 1 : 2)) { mars_write_register(mdev, 0xd8, 0xff); if (mdev->params.dsp_mars3 == 4) mars_write_register(mdev, 0xad, 1); } else { mcb->dp_bamil_rd7 |= 2; //mcb->dp_ring_int_count = 0; } } static u8 mars_read_register_rem(struct martian *mdev, u8 reg) { mdev->common->BaseValue = reg; mdev->common->BaseAddressIndex = (reg < 0x80) || ((reg >= 0xa0) && (reg < 0xd0)) ? mdev->params.BaseAddress : mdev->params.BaseAddress2; outb(reg, mdev->common->BaseAddressIndex); return inb(mdev->params.BaseAddressData); } static void mars_write_register_rem(struct martian *mdev, u8 reg, u8 val) { mdev->common->BaseValue = reg; mdev->common->BaseAddressIndex = mdev->params.BaseAddress; outb(reg, mdev->params.BaseAddress); outb(val, mdev->params.BaseAddressData); } u8 mars_read_register_safe (struct martian *mdev, u8 reg) { u8 val; unsigned long flags; mars_lock(mdev, flags); val = mars_read_register/*_rem*/(mdev, reg); mars_unlock(mdev, flags); return val; } void mars_write_register_safe (struct martian *mdev, u8 reg, u8 val) { unsigned long flags; mars_lock(mdev, flags); mars_write_register/*_rem*/(mdev, reg, val); mars_unlock(mdev, flags); } void mars_reg_andor (struct martian *mdev, u8 reg, u8 val_and, u8 val_or) { u8 val; unsigned long flags; mars_lock (mdev, flags); val = mars_read_register (mdev, reg); mars_write_register (mdev, reg, val_or | (val_and & val)); mars_unlock (mdev, flags); } #define DSP_TIMEOUT 19 /* ms */ #define UDELAY 1 int wait_for_core_read (struct martian *mdev) { unsigned dls = (DSP_TIMEOUT * 1000) / UDELAY; do { if (mars_read_register_safe (mdev, 0xd8) & 0x10) return 0; udelay (UDELAY); } while (--dls); return -1; } u8 mars_read_dsp_reg (struct martian *mdev, u8 reg) { unsigned long flags; unsigned dls = (DSP_TIMEOUT * 1000) / UDELAY; u8 byte_e; mdev->common->dp_byte_f = 0; mars_lock (mdev, flags); mars_write_register(mdev, 0xd8, 0x18); mars_write_register(mdev, 0x36, reg); mars_write_register(mdev, 0x37, 0x6); mars_unlock (mdev, flags); do { mdev->common->dp_byte_f = mars_read_register_safe (mdev, 0x35); if (mdev->common->dp_byte_f == 2) break; udelay (UDELAY); } while (--dls); byte_e = mars_read_register_safe (mdev, 0x34); if (mdev->common->dp_byte_f != 2) { mars_write_register_safe (mdev, 0xd8, 0xff); byte_e = 0; } return byte_e; } u8 mars_readpoll_dsp_reg (struct martian *mdev, u8 type, u8 reg, u8 exp) { unsigned dls; u8 byte_f = 0; //dp_cmd_timer = x_current_time(); mars_write_register_safe (mdev, 0x18, 0xd8); mars_write_register_safe (mdev, 0x36, reg); mars_write_register_safe (mdev, 0x37, type); dls = (199 * 1000) / UDELAY; do { byte_f = mars_read_register_safe (mdev, 0x35); if (byte_f == exp) break; udelay (UDELAY); } while (--dls); mdev->common->dp_byte_f = byte_f; return byte_f; } void mars_write_dsp_ram (struct martian *mdev, u16 addr, u16 val) { unsigned long flags; mars_lock (mdev, flags); mars_write_register(mdev, 0xd8, 0x18); mars_write_register(mdev, 0x32, val & 0xff); mars_write_register(mdev, 0x33, (val >> 8) & 0xff); mars_write_register(mdev, 0x34, addr & 0xff); mars_write_register(mdev, 0x35, (addr >> 8) & 0xff); mars_write_register(mdev, 0x37, 1); mars_unlock (mdev, flags); wait_for_core_read (mdev); } /* side-effect: mdev->byte_f */ u16 mars_read_dsp_ram (struct martian *mdev, u16 addr) { struct martian_common *mcb = mdev->common; unsigned long flags; unsigned dls = (DSP_TIMEOUT * 1000) / UDELAY; u8 byte_d, byte_e; mars_lock (mdev, flags); mars_write_register(mdev, 0xd8, 0x18); mars_write_register(mdev, 0x34, addr & 0xff); mars_write_register(mdev, 0x35, (addr >> 8) & 0xff); /* cmd */ mars_write_register(mdev, 0x37, 4); mars_unlock (mdev, flags); /* inline wait but 0x8 */ do { if (mars_read_register_safe (mdev, 0xd8) & 0x8) break; udelay (UDELAY); } while (--dls); mars_write_register_safe (mdev, 0xd8, 0x8); byte_d = mars_read_register_safe (mdev, 0x33); byte_e = mars_read_register_safe (mdev, 0x34); mcb->dp_byte_f = mars_read_register_safe (mdev, 0x35); if (mcb->dp_byte_f == 1) return byte_d + (byte_e << 8); else { mars_write_register_safe (mdev, 0xd8, 0xff); if (mcb->x_dsp_mars == 1) mars_write_word(mdev, 0x3c, 0x1ff); return 0; } } /* side-effect: mdev->byte_f */ void mars_command (struct martian *mdev, u8 cmd, u8 arg1, u8 arg2) { struct martian_common *mcb = mdev->common; unsigned long flags; if (cmd == 0xe || cmd == 0xc) { if ((mars_read_dsp_reg (mdev, 0xb5) & 1) == 0) mars_read_register_safe (mdev, 0xb0); if ((mars_read_dsp_reg (mdev, 0xb5) & 0x10) == 0) { mars_write_register_safe (mdev, 0xb6, mdev->params.DCPAudioOn ? 0xcf : 0xef); mars_read_dsp_reg (mdev, 0xb0); mars_write_register_safe (mdev, 0xb0, 0); } mars_write_register_safe (mdev, 0xb7, 0xff); if (mdev->params.DCPAudioOn) { mars_write_register_safe (mdev, 0xb6, 0xce); mars_read_register_safe (mdev, 0xb1); } else mars_write_register_safe (mdev, 0xb6, 0xee); mars_write_register_safe (mdev, 0xd7, 0xfb); mcb->dp_bamil_rd7 = 0xfb; mcb->dp_dsp_data_in_progress = 0; } mars_lock (mdev, flags); mars_write_register(mdev, 0xd8, 0x18); mars_write_register(mdev, 0x35, arg2); mars_write_register(mdev, 0x36, arg1); mars_write_register(mdev, 0x37, cmd); mars_unlock (mdev, flags); wait_for_core_read (mdev); } int mars_command_long (struct martian *mdev, u8 cmd, u8 arg1, u8 arg2, u8 arg3, u8 arg4) { unsigned long flags; mars_lock (mdev, flags); mars_write_register(mdev, 0xd8, 0x18); mars_write_register(mdev, 0x33, arg4); mars_write_register(mdev, 0x34, arg3); mars_write_register(mdev, 0x35, arg2); mars_write_register(mdev, 0x36, arg1); mars_write_register(mdev, 0x37, cmd); mars_unlock (mdev, flags); return wait_for_core_read (mdev); } void mars_clear_dsp_ram (struct martian *mdev) { u16 addr = 0x1000; do mars_write_dsp_ram (mdev, addr, 0x0); while (++addr < 0x4000); } static inline void mars_dld_dsp_begin (struct martian *mdev, struct martian_common *mcb) { u8 bamil_rd7 = mdev->params.DCPAudioOn ? 0xfb : 0xff; mars_write_register_safe (mdev, 0xd8, 0xff); mars_write_register_safe (mdev, IR, bamil_rd7); mcb->dp_bamil_rd7 = bamil_rd7; mars_command_long (mdev, 0x29, 0, 0, 0, 0); mars_write_dsp_ram (mdev, 0x39, 0); } static inline void mars_dld_dsp_end (struct martian *mdev, struct martian_common *mcb) { { unsigned dls = (9 * 1000) / UDELAY; do { if (mars_read_register_safe (mdev, 0xd8) & 0x8) break; udelay (UDELAY); } while (--dls); } mars_write_dsp_ram (mdev, 0x3d, 0x186); if (mdev->params.DCPAudioOn) { mars_write_register_safe (mdev, 0xb7, 0xdf); mars_write_register_safe (mdev, 0xd8, mcb->dp_bamil_rd7); } else { mars_write_register_safe (mdev, 0xb7, 0xff); mars_write_register_safe (mdev, 0xd8, 0xff); } } static inline void mars_dld_dsp_chunk_header (struct martian *mdev, u16 *dptr) { unsigned long flags; int idx; mars_lock (mdev, flags); mars_write_register(mdev, 0x30, 1); for (idx = 0; idx <= 5; idx += 2) { u16 val = *dptr; mars_write_register(mdev, 0x31 + idx, val & 0xff); mars_write_register(mdev, 0x32 + idx, (val >> 8) & 0xff); dptr++; } mars_write_register(mdev, 0xd8, 0x18); mars_write_register(mdev, 0x37, 0x1a); mars_unlock (mdev, flags); wait_for_core_read (mdev); } static inline void mars_dld_dsp_chunk_transfer (struct martian *mdev, u16 *dptr, int bytes, int chunk) { unsigned long flags; int idx = 0; mars_lock (mdev, flags); while (idx < bytes) { mars_write_register(mdev, 0x30 + idx, *dptr & 0xff); mars_write_register(mdev, 0x31 + idx, (*dptr >> 8) & 0xff); idx += 2; dptr++; } mars_write_register(mdev, 0xd8, 0x18); mars_write_register(mdev, 0x37, bytes | (chunk ? 0xc0 : 0xc8)); mars_unlock (mdev, flags); wait_for_core_read (mdev); } /* side-effect: mdev->byte_f */ int mars_download_dsp (struct martian *mdev, u16 *dptr, u16 num) { struct martian_common *mcb = mdev->common; u16 rd7_bamil_save = mcb->dp_bamil_rd7; int res = 0; mars_dld_dsp_begin (mdev, mcb); while (num != 0) { int chunk = dptr[1]; if (chunk + 3 > num) { res = -EFAULT; break; } num -= (chunk + 3); mars_dld_dsp_chunk_header (mdev, dptr); dptr += 3; while (chunk > 2) { chunk -= 3; mars_dld_dsp_chunk_transfer (mdev, dptr, 6, chunk); dptr += 3; } mars_dld_dsp_chunk_transfer (mdev, dptr, chunk << 1 , chunk); } mars_dld_dsp_end (mdev, mcb); mcb->dp_bamil_rd7 = rd7_bamil_save; mars_write_register_safe (mdev, 0xd7, mcb->dp_bamil_rd7); return res; } /* side-effect: mdev->byte_f */ int mars_download_dsp_user (struct martian *mdev, u16 __user *dptr, u16 num) { struct martian_common *mcb = mdev->common; u16 rd7_bamil_save = mcb->dp_bamil_rd7; int res = 0; mars_dld_dsp_begin (mdev, mcb); while (num != 0) { int chunk; u16 kdata[3]; if (copy_from_user (kdata, dptr, sizeof kdata)) { res = -EFAULT; break; } chunk = kdata[1]; if (chunk + 3 > num) { res = -EFAULT; break; } num -= (chunk + 3); mars_dld_dsp_chunk_header (mdev, kdata); dptr += 3; while (chunk > 2) { if (copy_from_user (kdata, dptr, 6)) { res = -EFAULT; goto finalize; } chunk -= 3; dptr += 3; mars_dld_dsp_chunk_transfer (mdev, kdata, 6, chunk); } if (copy_from_user (kdata, dptr, (chunk << 1))) { res = -EFAULT; goto finalize; } mars_dld_dsp_chunk_transfer (mdev, kdata, chunk << 1 , chunk); } /* while (num) */ finalize: mars_dld_dsp_end (mdev, mcb); mcb->dp_bamil_rd7 = rd7_bamil_save; mars_write_register_safe (mdev, 0xd7, mcb->dp_bamil_rd7); return res; } u16 mars_dsp_rom_checksum (struct martian *mdev) { u8 byte_d, byte_e; u8 byte_f = 0; unsigned dls; mars_command (mdev, 0x10, 0, 0); dls = (99 * 1000) / UDELAY; do { byte_f = mars_read_register_safe (mdev, 0x35); if (byte_f == 5) break; udelay (UDELAY); } while (--dls); byte_d = mars_read_register_safe (mdev, 0x33); byte_e = mars_read_register_safe (mdev, 0x34); if (byte_f == 5) mdev->params.dp_version = byte_d + (byte_e << 8); else { mdev->params.dp_version = 0; MERROR("dp version failure\n"); } mdev->common->dp_version = mdev->params.dp_version; byte_f = 0; mars_command (mdev, 0x14, 0, 0); dls = (199 * 1000) / UDELAY; do { byte_f = mars_read_register_safe (mdev, 0x35); if (byte_f == 3) break; udelay (UDELAY); } while (--dls); mdev->common->dp_byte_f = byte_f; if (byte_f != 3) { MERROR("dp version failure\n"); return 0; } return mars_read_dsp_ram (mdev, 0x49); } martian-full-20080625/kmodule/mfifo.c0000644000175000017500000000510311024666141015755 0ustar marvmarv#include "mfifo.h" #include static void mfifo_wrap_bin (mfifo_t *fifo, int *ending) { *ending &= fifo->mask; } static int mfifo_space_bin (mfifo_t *fifo) { return CIRC_SPACE (fifo->head, fifo->tail, fifo->size); } static void mfifo_wrap_gen (mfifo_t *fifo, int *ending) { if (*ending >= fifo->size) *ending %= fifo->size; else if (*ending < 0) *ending = (*ending % fifo->size) + fifo->size; } static int mfifo_space_gen (mfifo_t *fifo) { int head = fifo->head + 1; int tail = (fifo->tail >= head) ? fifo->tail : fifo->tail + fifo->size; return tail - head; } /* set to the head */ static void mfifo_setu8 (mfifo_t *fifo, void *e) { ((u8 *) fifo->buf) [fifo->head] = * (u8 *) e; } static void mfifo_setu16 (mfifo_t *fifo, void *e) { ((u16 *) fifo->buf) [fifo->head] = * (u16 *) e; } static void mfifo_setu32 (mfifo_t *fifo, void *e) { ((u32 *) fifo->buf) [fifo->head] = * (u32 *) e; } static void mfifo_setgen (mfifo_t *fifo, void *e) { memcpy (fifo->head * fifo->esize + (char *) fifo->buf, e, fifo->esize); } /* get from tail */ static void mfifo_getu8 (mfifo_t *fifo, void *e) { * (u8 *) e = ((u8 *) fifo->buf) [fifo->tail]; } static void mfifo_getu16 (mfifo_t *fifo, void *e) { * (u16 *) e = ((u16 *) fifo->buf) [fifo->tail]; } static void mfifo_getu32 (mfifo_t *fifo, void *e) { * (u32 *) e = ((u32 *) fifo->buf) [fifo->tail]; } static void mfifo_getgen (mfifo_t *fifo, void *e) { memcpy (e, fifo->tail * fifo->esize + (char *) fifo->buf, fifo->esize); } void mfifo_init (mfifo_t *fifo, void *_buf, int _size, int _esize) { if (_size <= 0 || ! _buf) { fifo->size = 1; fifo->mask = 0; set_bit (MFIFO_BINARY, &fifo->flags); clear_bit (MFIFO_OK, &fifo->flags); return; } fifo->flags = 0; set_bit (MFIFO_OK, &fifo->flags); fifo->buf = _buf; fifo->size = _size; if ((1 << (ffs (_size) - 1)) == _size) { set_bit (MFIFO_BINARY, &fifo->flags); fifo->mask = _size - 1; fifo->ops.wrap = mfifo_wrap_bin; fifo->ops.space = mfifo_space_bin; } else { fifo->ops.wrap = mfifo_wrap_gen; fifo->ops.space = mfifo_space_gen; } fifo->esize = _esize; switch (_esize) { case 1: set_bit (MFIFO_U8, &fifo->flags); fifo->ops.set = mfifo_setu8; fifo->ops.get = mfifo_getu8; break; case 2: set_bit (MFIFO_U16, &fifo->flags); fifo->ops.set = mfifo_setu16; fifo->ops.get = mfifo_getu16; break; case 4: set_bit (MFIFO_U32, &fifo->flags); fifo->ops.set = mfifo_setu32; fifo->ops.get = mfifo_getu32; break; default: fifo->ops.set = mfifo_setgen; fifo->ops.get = mfifo_getgen; break; } mfifo_flush (fifo); } martian-full-20080625/kmodule/modules.order0000644000175000017500000000010511033437763017221 0ustar marvmarvkernel//usr/src/modules/martian-full-20080625/kmodule/martian_dev.ko martian-full-20080625/kmodule/mixspinlock.h0000644000175000017500000000242210516321432017217 0ustar marvmarv#ifndef __MIXSPINLOCK_H #define __MIXSPINLOCK_H /*#include */ typedef struct _mspinlock { volatile __s32 lock; } mspinlock_t; #ifdef CONFIG_SMP #if defined(__i386__) || defined(__x86_64__) static inline void mspin_lock_init (mspinlock_t *lock) { lock->lock = 1; } static inline void mspin_lock (mspinlock_t *lock) { __asm__ __volatile__( "1:\n" "\tlock; decl %0\n" "\tjs 2f\n\n" LOCK_SECTION_START("") "2:\n" "\t\tpause\n" "\tcmpl $0,%0\n" "\tjle 2b\n" "jmp 1b\n" LOCK_SECTION_END :"=m" (lock->lock) : : "memory" ); } static inline int mspin_trylock (mspinlock_t *lock) { __s32 old; __asm__ __volatile__( "xchgl %0,%1" :"=q" (old), "=m" (lock->lock) : "0" (0) : "memory" ); return old > 0; } static inline void mspin_unlock (mspinlock_t *lock) { __asm__ __volatile__( "movl $1, %0" :"=m" (lock->lock) : : "memory" ); } static inline int mspin_is_locked (mspinlock_t *lock) { return lock->lock <= 0; } #endif #endif /* CONFIG_SMP */ /* static inline void mspin_lock (mspinlock_t *lock) { __asm__ __volatile__( "1:\n" "\tlock; decl %0\n" "\tjs 2f\n\n" LOCK_SECTION_START("") "2:\n" "\t\tpause\n" "\tcmpl $0,%0\n" "\tjle 2b\n" "jmp 1b\n" LOCK_SECTION_END :"=m" (lock->lock) : : "memory" ); } */ #endif martian-full-20080625/scripts/0000755000175000017500000000000011025647435014547 5ustar marvmarvmartian-full-20080625/scripts/martian0000755000175000017500000000276510524740466016143 0ustar marvmarv#!/bin/bash # # Init file for martian_modem # # chkconfig: 2345 45 60 # description: martian_modem # # processname: martian_modem # ### BEGIN INIT INFO # Provides: martian_modem # Default-Start: 2 3 4 5 # Short-Description: martian_modem # Description: martian_modem # Author: Stefan Puch # Adjustments for 2006/11 release A. Chentsov ### END INIT INFO #VPNCLIENT="/opt/cisco-vpnclient/bin/vpnclient" NAME="martian_modem" MARTIANMOD="martian_dev" USER_DRIVER="/usr/sbin/martian_modem" # edit to set other name DEVICE="/dev/ttySM0" if [ `/sbin/lsmod | grep -c ${MARTIANMOD}` -lt "1" ]; then echo "kernel module is not loaded!" exit 0 fi # See how we were called. case "$1" in start) echo -n "Starting ${NAME}: " if [ `ps -A | grep -c ${NAME}` -gt "0" ]; then echo "${NAME} is already running. Use restart instead." exit 1 fi if [ ${DEVICE} != "/dev/ttySM0" ]; then ARGDEV=${DEVICE} else ARGDEV= fi /usr/sbin/martian_modem --daemon ${ARGDEV} echo "Done" ;; stop) echo -n "Shutting down ${NAME}: " if [ `ps -A | grep -c "martian_modem"` -lt "1" ]; then echo "${NAME} is not running." exit 1 fi PID=`/sbin/pidof ${NAME}` # cease now /bin/kill ${PID} if [ -L ${DEVICE} ]; then rm -f ${DEVICE} fi echo "Done" ;; status) PID=`/sbin/pidof ${NAME}` if [ -n "${PID}" ] ; then echo ${NAME} "(PID ${PID}) is running..." else echo ${NAME} "is stopped" fi ;; restart|reload) $0 stop $0 start ;; *) echo "Usage: $0 {start|stop|restart|reload|status}" exit 1 esac exit 0 martian-full-20080625/scripts/remove_outdated.sh0000755000175000017500000000043410524740466020276 0ustar marvmarv# program was renamed if [ -f /usr/sbin/martian_helper ]; then echo "RM martian_helper" rm -f /usr/sbin/martian_helper fi # modules were too moddir=/lib/modules/`uname -r` files=`find $moddir -name martian_drv.ko` if [ "$files" != "" ]; then echo "RM $files" rm -f $files fi martian-full-20080625/scripts/martian.in0000755000175000017500000000301011024435304016514 0ustar marvmarv#!/bin/bash # # Init file for martian_modem # # chkconfig: 2345 45 55 # description: martian_modem # # processname: martian_modem # ### BEGIN INIT INFO # Provides: martian_modem # Default-Start: 2 3 4 5 # Short-Description: martian_modem # Description: martian_modem # Author: Stefan Puch # Adjustments for 2006/11 release A. Chentsov ### END INIT INFO NAME="martian_modem" MARTIANMOD="martian_dev" USER_DRIVER="/usr/sbin/martian_modem" # edit to set other name DEVICE=%TTY% if [ `/sbin/lsmod | grep -c ${MARTIANMOD}` -lt "1" ]; then echo "kernel module is not loaded!" exit 0 fi start() { echo -n "Starting ${NAME}: " if [ `ps -A | grep -c ${NAME}` -gt "0" ]; then echo "${NAME} is already running. Use restart instead." exit 1 fi [ "${DEVICE}" == "/dev/ttySM0" ] && DEVICE= /usr/sbin/martian_modem --daemon %Options% $DEVICE [ -d /var/lock/subsys ] && touch /var/lock/subsys/martian echo "Done" } stop() { echo -n "Shutting down $NAME: " if [ `ps -A | grep -c "martian_modem"` -lt "1" ]; then echo "$NAME is not running." exit 1 fi PID=`/sbin/pidof $NAME` # cease now /bin/kill $PID rm -f /var/lock/subsys/martian if [ -L $DEVICE ]; then rm -f $DEVICE fi echo "Done" } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) PID=`/sbin/pidof $NAME` if [ -n "$PID" ] ; then echo $NAME "(PID $PID) is running..." else echo $NAME "is stopped" fi ;; restart|reload) stop start ;; *) echo "Usage: $0 {start|stop|restart|reload|status}" exit 1 esac exit 0 martian-full-20080625/scripts/wv.conf0000644000175000017500000000042210533707655016054 0ustar marvmarv[Dialer Defaults] Modem = /dev/ttySM0 Baud = 460800 Init1 = ATZ Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 ISDN = 0 Modem Type = Analog Modem Carrier Check = No ; Dial Command = ATDP ; Phone = ; Username = ; Password = martian-full-20080625/scripts/automate.sh0000755000175000017500000000560311024435304016716 0ustar marvmarv#!/bin/bash # from martian.spec function usage { echo "Usage: " echo "$0 [-u ] [-g ] [-m ] [-c ] [-d ] [--smp] [--hide-pty]" #echo -e "$0 [-u ] [--group ] [--mode 0###] [--country ] [--debug ] " exit 0 } function to_num { echo -n `echo $1 | grep -e '^\([^0][[:digit:]]*\|0[0-7]*\|0x[[:xdigit:]]*\)$'` } tty= options= while [ $# -gt 0 ]; do arg=$1 shift case "$arg" in -c | --country) country=$1 shift fullname=`/usr/sbin/martian_modem --info countries | awk --assign country=$country \ 'BEGIN { FS = "\t"}; { if (tolower (country) == tolower($1) || tolower (country) == tolower($2)) { print $2; exit; } } '` if [ "$fullname" != "" ]; then options="$options --country \"$fullname\"" else echo "Country $country is not supported" fi ;; --hide-pty | --smp | --realtime) options="$options $arg" ;; -d | --debug) raw=$1 level=$(to_num $1) shift if [ "$level" == "" ]; then echo "Bad argument \`$raw' for option $arg" continue elif [ $level -gt 0 -a 6 -gt $level ]; then options="$options --debug $level" else echo "debug level should be in the range [0..6]" fi ;; -m | --mode) # local mode # to_num $1 mode=$(to_num $1) #echo $mode shift if [ "$mode" != "" ]; then if (( $mode < 01000 )); then options="$options --mode $(printf "0%o" $mode)" fi fi ;; -u | --user) user=$1 shift if [ "$user" != "" ]; then options="$options --user $user" fi ;; -g | --group) group=$1 shift if [ "$group" != "" ]; then options="$options --group $group" fi ;; -h | --help | --usage) usage ;; -*) echo "Unknown option $arg ignored" ;; *) if [ "$tty" == "" ]; then tty=$arg else echo "unbound argument $arg ignored" fi ;; esac done if [ "$tty" != "" ]; then echo "Modem access name $tty" #options="$options $tty" fi if [ "$options" != "" ]; then echo "Options: $options $tty" fi echo "Module:" # modload=/etc/modprobe.preload result="none" for modload in /etc/modprobe{,.preload}; do if [ -f $modload ]; then if ! grep -q -s "martian-dev" $modload; then echo -e "# martian configuration" \ "\nmartian-dev" >>$modload; fi [ $? == "0" ] && echo -e "\tAdded to $modload" result="success" #echo "result: $result" break; fi done #last resort if [ "success" != $result ]; then rc=/etc/rc.local if ! grep -q -s "/sbin/modprobe martian_dev" $rc; then echo -e "\n\n# martian configuration" \ "\n/sbin/modprobe martian_dev" >> $rc; fi [ $? == "0" ] && echo -e "\tAdded to $rc" fi echo -ne "Daemon:\n\t" service=martian sed -e "s/%Options%/$options/" -e "s/%TTY%/$tty/" martian.in > martian install -m 744 -D $service /etc/init.d/$service /sbin/chkconfig --add $service /sbin/chkconfig $service on martian-full-20080625/ChangeLog0000644000175000017500000000510611025434573014631 0ustar marvmarv06/2008: All device IO moved to kernel module 29.11.06: owner/group, permissions for pty country 28.11.06: Separate build of debug info binary and executable. Fixes addresses being doubled in gdb. ioctl for debug setting on user request 27.11.06: Minor fixes. tweakcore.sh error -- "(" unexpected. "--isr core" was ignored. forgotten forced relocation of io_dce ring by overriden io_init_dce_rx_fifo. obsolete linux/config.h 22.11.06: control channel on /dev/martian to do requests to martian_modem. some debug scripts. 2006/11/20: relaying fault to user, detectlet for common data overwrite ioctls for simulating module failures 10.11.06: incorporated some scripts from Stefan Puch in scripts/. 6.11.06: Naming user-space part 'helper' was not correct and confused users. Not anymore - program renamed to "martian_modem". It's the most significant part of agere modem software indeed. 31.10.06: migrated to subversion. 22.10.06: SMP support. Regards to Bjorn (B.W.) for help with testing/debugging. fixed uni simulation. added mixed mode spin lock for full SMP. 2006/10/02: martian devices create/delete separated from pci driver interface strenthened conditions for xircom devices vma flags correction for different kernel versions 5.10.06: hidden pty option to fill the gap while old descriptor io settles. Needed for quick reopen like in callback scenario. 3.10.06: In kernel module introduced routines martian_add, martian_del for busindependent device manipulation. Main target PCMCIA support. 2006/07/23: Rewritten fifos handling 20.7.06: Processing interrupt io in kernel module. Fixes abrupt disconnect when X loaded. Regards to Stefan Puch, Tom Cada for help with testing/debugging of pdm mode. 2006/07/17: Added full irq servicing for tx/rx 1.7.06: restructured code: port, monitor, session entities. 23.2.06: Added logging modules and debug level option. Syslog to be added. 23.1.06: Processing of hang-up. Done by additional timer bound to the pin/pty. It uses posix realtime timer and usual implementation should directly use linux systems calls. Also carrier lost processed. 21.1.06: Fixed SEGV exception for dynamic relocation when place where fixing is crossing the page 6.1.06: implementation of streams moved to separate module. Added module for direct PTY support which is now default. In case the unix socket is used in helper additional utility is needed to talk to it. There's ptytosock which is aware of socket used. ptytosock your_path_to_dev_link 21.12.05: Added code to stick to the same cpu on SMP 20.12.05: Workaround for serial greed martian-full-20080625/modem/0000755000175000017500000000000011041225472014150 5ustar marvmarvmartian-full-20080625/modem/Makefile0000644000175000017500000001070111030572346015612 0ustar marvmarv SHELL := /bin/bash CC := gcc CFLAGS := -Wall #CPPFLAGS += -DMSTAMP=20080620 HOST := $(shell uname -i) ifeq ("$(HOST)", "x86_64") MCMACHFLAGS += -m32 CORELDFLAGS := -m elf_i386 OCFLAGS := -O elf32-i386 endif #CFLAGS += -DMARTIAN_CORE_DEBUG #CFLAGS += -DDYNAMICRELOC_DEBUG #CFLAGS += -DRELOCFIX_DEBUG # to debug elf386tweakrelocs # leave the relocations in MLDFLAGS := $(MCMACHFLAGS) -lpthread -lrt MCFLAGS += $(MCMACHFLAGS) ifeq ("y","$(DEBUG)") MLDFLAGS += -g CFLAGS += -g endif %.o: %.c @set -e; \ echo -e " CC\t$@"; \ gcc -c $(CPPFLAGS) $(CFLAGS) $< mmodem_source_objs := main.o \ dumpers.o log.o \ session.o mport.o \ pty.o sysdep.o \ isr.o smp.o \ core_if.o coresubst.o \ link.o tweakrelocsdynamic.o martian_modem_OBJS := $(mmodem_source_objs) marscore.o #$(mmodem_source_objs) coreadd.o: %.o: %.c # $(CC) $(CPPFLAGS) $(MCFLAGS) $(CFLAGS) -c $< notify-obj: $(martian_modem_OBJS) @echo "Objects:" $(mmodem_source_objs) coreadd.o: CFLAGS += $(MCMACHFLAGS) core_if.o main.o session.o mport.o sysdep.o pty.o: sysdep.h main.o pty.o session.o mport.o: mport.h sysdep.h main.o mport.o link.o dumpers.o isr.o coresubst.o: ../martian.h session.o main.o smp.o: watch.h common.h log.o main.o coresubst.o link.o mport.o pty.o: common.h main.o pty.o mport.o link.o dumpers.o isr.o smp.o log.o session.o tweakrelocsdynamic.o sysdep.o: log.h common.h core_if.o coresubst.o: overriden_core.h main.o: CPPFLAGS += -DMSTAMP=20080620 overriden_core.h: overriden_core_functions @set -e; \ > $@; \ for sym in `> $@; \ fi \ done marscore.o: ltmdmobj.o coreadd.o elf386tweakrelocs overriden_core_functions @set -e; \ echo -e " LD\t$@"; \ overriden_funcs=` $@; fi ifeq ("y","$(DEBUG)") all: debug_script endif elf386tweakrelocs: elf386tweakrelocs.c @set -e; \ echo -e " CC\t$@"; \ gcc -o $@ $(CFLAGS) $(CPPFLAGS) $< .PHONY: clean all install uninstall install-program install-debug debug-dir clean: @echo -e " RM\tOBJS"; rm -f $(martian_modem_OBJS) coreadd.o @echo -e " RM\tBINS"; rm -f martian_modem{,.stripped,.debug} @echo -e " RM\tTOOLS"; rm -f relocs.sym elf386tweakrelocs @rm -f overriden_core.h relocs.sym @rm -f debug_script relocs.sym: link.c @awk '/SYMBOL \(/ { sub (/^.*SYMBOL \(/,""); sub (/[,)].*/,""); print }\ /SYMBOL_TO_MEMBER \(/ { sub (/^.*SYMBOL_TO_MEMBER \(/,""); sub (/[,)].*/,""); print }' \ $< > $@ martian_modem.debug: $(martian_modem_OBJS) @set -e; echo -e " LD\t$@"; gcc -g -o $@ $(martian_modem_OBJS) $(MLDFLAGS) @set -e; echo -e " STRIP\t$@"; strip --only-keep-debug -o $@ $@ || rm $@ martian_modem.stripped: martian_modem martian_modem.debug relocs.sym @echo -e " STRIP\t$@"; \ objcopy --keep-symbols relocs.sym --add-gnu-debuglink=$<.debug --strip-all $< $@ all: martian_modem install-program: target := /usr/sbin/martian_modem install-program: martian_modem.stripped martian_modem.debug @echo -e " INSTALL\t$(target)" @install $< $(target) debug-dir: @[ -d /usr/lib/debug/usr/sbin ] || mkdir -p /usr/lib/debug/usr/sbin install-debug: target := /usr/lib/debug/usr/sbin/martian_modem.debug install-debug: martian_modem.debug debug-dir @echo -e " INSTALL\t$(target)" @install $< $(target) install: install-program install-debug #//usr//sbin//martian_modem: martian_modem.stripped martian_modem.debug /usr/sbin/martian_modem: martian_modem.stripped martian_modem.debug @echo -e " INSTALL\t$@" @install $< $@ #install: /usb/sbin/martian_modem uninstall: rm /usr/sbin/martian_modem test: echo $(DEBUG) $(CFLAGS) martian-full-20080625/modem/tweakcore.sh0000755000175000017500000000200510533130476016474 0ustar marvmarv#!/bin/bash function failure { echo $1 rm -f marscore.o exit 3 } #declare -a dp_dsp_isr_sym dp_dsp_isr_sym=(`nm -S ltmdmobj.o | grep dp_dsp_isr`) #echo ${dp_dsp_isr_sym[0]} ${dp_dsp_isr_sym[1]} dp_dsp_isr_start=$(( 0x${dp_dsp_isr_sym[0]} )) dp_dsp_isr_stop=$(( 0x${dp_dsp_isr_sym[0]} + 0x${dp_dsp_isr_sym[1]} )) #echo $dp_dsp_isr_start $dp_dsp_isr_stop set -o pipefail relentries=(` objdump --start-address=$dp_dsp_isr_start \ --stop-address=$dp_dsp_isr_stop \ --reloc \ ltmdmobj.o \ | awk 'BEGIN { syms[0] = "dp_int_regread"; syms[1] = "dp_int_regwrite"; syms[2] = "Write_mdm_word"; count = 0 } { if ($3 == syms[count]) { print $1; count++; if (count == 3) exit; } }' `) \ || failure "search symbols failure" # entries pattern # (dp_int_regread dp_int_regwrite Write_mdm_word) = $relocation_entries # ./elf386tweakrelocs $1 \ 0x${relentries[0]}=mars_read_reg_subst \ 0x${relentries[1]}=mars_stub \ 0x${relentries[2]}=mars_stub || failure "tweakrelocs failure" martian-full-20080625/modem/main.c0000644000175000017500000006321511025434573015255 0ustar marvmarv/* main.c: * * part of the martian_modem * * description: * parsing args, signals handling, monitoring * pty/port/session loop * named pipe /dev/martian for commands on the fly * * Author: A. Chentsov * Copying: LGPL * */ #include #include /*** mlockall */ #include /*** memcmp */ #include #include "../martian.h" #include /*** kbd interrupt */ #include // close #include // exit #include #include /*** isdigit */ #include /*** sched fifo... */ #include /*** uintxx_t */ #include /*** option parse */ #include #include #define _GNU_SOURCE #include #include /*** cmds: kdce_rx */ #include "sysdep.h" #include "main.h" #define PREFIX NULL #include "log.h" #include "mport.h" #include "common.h" #include "core.h" #ifndef __stringify #define __stringify_nomacro(x) #x #define __stringify(x) __stringify_nomacro (x) #endif /***** global vars *******/ struct _config config; struct martian_common *Mcb; struct _port mport; int worker_tid; /*************************/ /***** some signatures *****/ void setup_kbd_interrupt (void); static void setup_daemon_signals (void); static void setup_segv (void); static int check_procfs (void) { return system ("grep -q '/proc ' /proc/mounts 2> /dev/null"); } /*** setup for tsc ***/ void watch_setup (void ) { config.haveTSC = 0; if (check_procfs() != 0) { LOGWARN ("procfs on /proc is not found. No TSC.\n"); return; } int status = system ("cat /proc/cpuinfo | grep flags | grep -q tsc 2> /dev/null"); LOGDEBUG (3, "check tsc status %d\n", status); if (status == 0) { FILE *fp = popen ("grep '^cpu M' /proc/cpuinfo 2>/dev/null", "r"); if (! fp) return ; int c; while ((c = fgetc (fp)) != EOF) if (isdigit (c)) { ungetc (c, fp); break; } fscanf (fp, "%lf", & config.freq); LOGDEBUG (2, "TSC: %lf MHz\n", config.freq); pclose (fp); if (config.freq == 0) return; config.haveTSC = 1; } } static const char *sched_policy_text[] = { "normal", "FIFO", "RR" }; static int realtime_setup (void) { if (mlockall(MCL_CURRENT) != 0) { LOGSYSERR (Debug, "mlockall"); LOGWARN ("cannot lock pages\n"); } struct sched_param p; p.sched_priority = sched_get_priority_min (SCHED_FIFO) + 1; /* after this if we screw up we'd hog the cpu * either we should run interactively * or have shell with priority FIFO_MIN+1 */ if (sched_setscheduler (0, SCHED_FIFO, &p) != 0) { LOGSYSERR (Debug, "sched_setscheduler"); LOGWARN ("cannot raise priority\n"); return -1; } else { sched_getparam (0, &p); LOGDEBUG (2, "main thread scheduled %s with prio %d\n", sched_policy_text[sched_getscheduler (0)], p.sched_priority); } return 0; } void usage (char *argv[]) { fprintf (stdout, "Usage: %s [Options] [TTY]\n", argv[0]); fprintf (stdout, "Options:\n"); fprintf (stdout, " --daemon \tRun as daemon\n"); fprintf (stdout, " --log=FILE \tLog to FILE\n"); fprintf (stdout, " --syslog \tUse syslog for logging\n"); fprintf (stdout, " --realtime \tRaise priority of threads to realtime\n"); fprintf (stdout, " --smp \tTrue smp mode\n"); fprintf (stdout, " --user= \tGive tty ownership to user \n"); fprintf (stdout, " --group= \tChange tty group to \n"); fprintf (stdout, " --country=\n"); fprintf (stdout, " --no-cdclose \tKeep working with client when carrier lost.\n"); fprintf (stdout, " --hide-pty \tSave pty from others as soon its open. Client should notify he's here writing to device. For callback feature.\n"); fprintf (stdout, " --debug=LEVEL \tEnable debugging. LEVEL = 1..5\n"); fprintf (stdout, " --info countries \tPrint support info\n"); fprintf (stdout, " --help, --usage \tPrint this message \n"); fprintf (stdout, "TTY is the file name to access the modem, /dev/ttySM0 by default\n"); /* for good */ exit (1); } static void fix_id_to_code (void ) { extern __u16 OldCountryIdToCountryCode[0x56]; struct { __u16 code; __u8 id; } IdtoCodeFix[] = { { 0xfe, 0x15 }, /* Taiwan */ { 0xc6, 0x26 }, /* Slovenia */ { 0xc5, 0x27 }, /* Slovakia */ { 0xd0, 0x2a }, /* Europe */ { 0xfa, 0x3e }, /* Virgin Islands, U.S. */ { 0x1e, 0x4e }, /* Belarus */ { 0xc7, 0x4f }, /* Croatia */ { 0xf7, 0x50 }, /* Lithuania */ { 0xf8, 0x51 }, /* Estonia */ { 0xf9, 0x52 } /* Latvia */ }; int idx; for (idx = 0; idx < sizeof IdtoCodeFix / sizeof IdtoCodeFix[0]; idx++) OldCountryIdToCountryCode[IdtoCodeFix[idx].id] = IdtoCodeFix[idx].code; } /* { "Slovenia", "si", 0xc6, 0x26 } { "Slovakia", "sk", 0xc5, 0x27 } { "Europe", 0xd0, 0x2a } { "VIRGIN ISLANDS, U.S.", "vi", 0xfa, 0x3e } { "Belarus", 0x1e, 0x4e } { "Croatia", "hr", 0x4f } { "Lithuania", "lt", 0xf7, 0x50 } { "Estonia", "ee", 0xf8, 0x51 } { "Latvia", "lv", 0xf9, 0x52 } { "Taiwan", "tw", 0xfe, 0x15 } */ const struct { char *country; char element[3]; unsigned char code; } countries[] = { { "Japan", "jp", 0 }, { "Argentina", "ar", 7 }, { "Australia", "au", 9 }, { "Austria", "at", 0x0a }, { "Bangladesh", "bd", 0x0d }, { "Barbados", "bb", 0x0e }, { "Belarus", "by", 0x1e }, { "Bolivia", "bo", 0x14 }, { "Brazil", "br", 0x16 }, { "Bulgaria", "bg", 0x1b }, { "Canada", "ca", 0x20 }, { "Chile", "cl", 0x25 }, { "China", "cn", 0x26 }, { "Colombia", "co", 0x27 }, { "Costa Rica", "cr", 0x2b }, { "Croatia", "hr", 0x4f }, { "Cyprus", "cy", 0x2d }, { "Czech Republic", "cz", 0x2e }, { "Denmark", "dk", 0x31 }, { "Ecuador", "ec", 0x35 }, { "Egypt", "eg", 0x36 }, { "Estonia", "ee", 0xf8 }, { "Europe", "eu", 0xd0 }, /* pseudo */ { "Finland", "fi", 0x3c }, { "France", "fr", 0x3d }, { "Germany", "de", 0x42 }, { "Greece", "gr", 0x46 }, { "Guam", "gu", 0x48 }, { "Guatemala", "gt", 0x49 }, { "Hong Kong", "hk", 0x50 }, { "Hungary", "hu", 0x51 }, { "Iceland", "is", 0x52 }, { "India", "in", 0x53 }, { "Indonesia", "id", 0x54 }, { "Ireland", "ie", 0x57 }, { "Israel", "il", 0x58 }, { "Italy", "it", 0x59 }, { "Korea, Republic of", "kr", 0x61 }, { "Kuwait", "kw", 0x62 }, { "Latvia", "lv", 0xf8 }, { "Lebanon", "lb", 0x64 }, { "Liechtenstein", "li", 0x68 }, { "Lithuania", "lt", 0xf7 }, { "Luxembourg", "lu", 0x69 }, { "Malaysia", "my", 0x6c }, { "Malta", "mt", 0x70 }, { "Mexico", "mx", 0x73 }, { "Morocco", "ma", 0x77 }, { "Netherlands", "nl", 0x7b }, { "New Zealand", "nz", 0x7e }, { "Nicaragua", "ni", 0x7f }, { "Norway", "no", 0x82 }, { "Oman", "om", 0x83 }, { "Pakistan", "pk", 0x84 }, { "Panama", "pa", 0x85 }, { "Paraguay", "py", 0x87 }, { "Peru", "pe", 0x88 }, { "Philippines", "ph", 0x89 }, { "Poland", "pl", 0x8a }, { "Portugal", "pt", 0x8b }, { "Puerto Rico", "pr", 0x8c }, { "Romania", "ro", 0x8e }, { "Russia", "ru", 0xb8 }, { "Saudi Arabia", "sa", 0x98 }, { "Singapore", "sg", 0x9c }, { "Slovakia", "sk", 0xc5 }, { "Slovenia", "si", 0xc6 }, { "South Africa", "za", 0x9f }, { "Spain", "es", 0xa0 }, { "Sri Lanka", "lk", 0xa1 }, { "Sweden", "se", 0xa5 }, { "Switzerland", "ch", 0xa6 }, { "Taiwan", "tw", 0xfe }, { "Thailand", "th", 0xa9 }, { "Tunisia", "tn", 0xad }, { "Turkey", "tr", 0xae }, { "Ukraine", "ua", 0xb2 }, { "United Arab Emirates", "ae", 0xb3 }, { "United Kingdom", "uk", 0xb4 }, { "United States", "us", 0xb5 }, { "Uruguay", "uy", 0xb7 }, { "Venezuela", "ve", 0xbb }, { "Viet Nam", "vn", 0xbc }, { "Virgin Islands, U.S.", "vi", 0xfa }, { .country = NULL } }; static int mcountry_match (char *test, const char *country) { char *p = strchr (country, ','); if (p) { int idx = p - country; if (strncasecmp (country, test, idx) != 0) return 0; return (test[idx] == '\0') || (strcasecmp (country + idx, test + idx) == 0); } else return strcasecmp (test, country) == 0; } #define OptItemMax 17 static int optslot (int opt) { int shift = 0; if (opt > 7) { shift++; } return opt - 2 + shift; } int parse_arguments (int argc, char *argv[]) { static struct option options[] = { { "debuglevel", required_argument, NULL, 2 }, { "realtime", no_argument, NULL, 3 }, { "syslog", no_argument, NULL, 4 }, { "daemon", no_argument, NULL, 5 }, { "log", required_argument, NULL, 6 }, { "help", no_argument, NULL, 7 }, { "usage", no_argument, NULL, 7 }, { "no-cdclose", no_argument, NULL, 9 }, { "hide-pty", no_argument, NULL, 10 }, { "smp", no_argument, NULL, 11 }, { "user", required_argument, NULL, 13 }, { "group", required_argument, NULL, 14 }, { "mode", required_argument, NULL, 15 }, { "country", required_argument, NULL, 16 }, { "info", required_argument, NULL, 17 }, /* when adding new - update OptItemMax above */ { NULL, } }; config.debuglevel = 0; config.realtime = 0; config.syslog = 0; config.daemon = 0; config.logfile = 0; config.check_carrier = 1; config.symlink_name = "/dev/ttySM0"; config.hide_pty = 0; config.true_smp = 0; config.permissions = 0; config.mode = 0; config.uid = -1; config.gid = -1; fix_id_to_code(); opterr = 0; do { int optindex; int choice = getopt_long (argc, argv, "", options, &optindex); switch (choice) { case 3: config.realtime = 1; break; case 6: if (config.syslog) { LOGERR ("--log `file' conflicts with --syslog\n"); return 0; } config.logfile = 1; switch (log_redirect_to_file (optarg)) { case -1: log_setup (Syslog); LOGWARN ("Failed to redirect to file. Using syslog\n"); break; case -2: /**/ LOGWARN ("Bad filename %s. Log is not redirected.\n", optarg); break; case 0: /* OK */ ; } config.logfilename = optarg; break; case 2: config.debuglevel = atoi (optarg); if (config.debuglevel < 0) { LOGWARN ("wrong log level %d, ignored\n", config.debuglevel); config.debuglevel = 0; } break; case 5: config.daemon = 1; /* implies syslog unless --log file*/ break; case 4: if (config.logfile) { LOGERR ("--syslog conflicts with --log `file'\n"); return 0; } config.syslog = 1; break; case 7: /* may be usage as well */ usage (argv); return 1; case 9: config.check_carrier = 0; break; case 10: config.hide_pty = 1; break; case 11: config.true_smp = 1; break; case 13: { struct passwd *user = getpwnam (optarg); if (! user) { LOGWARN ("bad user name '%s', ignored\n", optarg); } else config.uid = user->pw_uid; break; } case 14: { struct group *group = getgrnam (optarg); if (! group) LOGWARN ("bad group '%s', ignored\n", optarg); else config.gid = group->gr_gid; break; } case 15: config.mode = strtol (optarg, NULL, 0); if (config.mode & ~(S_IRWXU | S_IRWXG | S_IRWXO)) { LOGWARN ("wrong mode for tty 0%o\n", config.mode); config.permissions = 0; } else { config.permissions = 1; } break; case 16: { int i = 0; while (countries[i].country) { if (mcountry_match (optarg, countries[i].country) || strcasecmp (optarg, countries[i].element) == 0) { extern __u16 OldCountryIdToCountryCode[0x56]; int id = 0; /*config.country_code = countries[i].code;*/ for (; id < 0x56; id++) { if (OldCountryIdToCountryCode[id] == countries[i].code) { LOGDEBUG (Note, "country %s, set code %x, id %x\n", countries[i].country, countries[i].code, id); config.country_id = id; break; } } if (id == 0x56) { LOGWARN ("unsupported country %s\n", optarg); config.country_id = 0x19; } break; } i++; } if (! countries[i].country) { LOGWARN ("unsupported country %s, code not found\n", optarg); config.country_id = 0x19; } break; } case 17: LOGDEBUG (Note, "optarg: %s\n", optarg ? optarg : "NULL"); if (optarg && (strcmp (optarg, "countries") == 0)) { int idx; printf ("Supported countries:\n"); for (idx = 0; countries[idx].country; idx++) printf ("%s\t%s\n", countries[idx].element, countries[idx].country); } else LOGWARN ("unrecognized %s\n", optarg); /* for good */ exit (1); case -1: if (optind + 1 == argc) config.symlink_name = argv[optind]; else if (optind != argc) LOGWARN ("trailing arguments ignored\n"); return 1; /* option error */ case ':': if (optind < 1 || argc < optind) ; else if (optopt != 0) { if (optopt <= OptItemMax && options[optslot (optopt)].has_arg == required_argument) fprintf (stderr, "%s: needed parameter for option --%s\n", argv[0], options[optslot(optopt)].name); } return 0; case '?': /* may be usage as well */ LOGDEBUG (Note, "optind: %d, optopt: '%c'=%d\n", optind, optopt, optopt); if (optind < 1 || argc < optind) ; else if (optopt != 0) { if (optopt <= OptItemMax && options[optslot (optopt)].has_arg == required_argument) fprintf (stderr, "%s: needed parameter for option --%s\n", argv[0], options[optslot (optopt)].name); else fprintf (stderr, "%s: unknown option -%c\n", argv[0], optopt); } else if (!strncmp (argv[optind-1], "--", 2)) { fprintf (stderr, "%s: unknown option %s\n", argv[0], argv[optind-1]); } else fprintf (stderr, "%s: unexpect arg %s\n", argv[0], argv[optind - 1]); fprintf (stderr, "Do `%s --help' for usage\n", argv[0]); return 0; // default: } } while (1); } static void *serve_port (void *arg); #ifndef sigev_notify_thread_id # define sigev_notify_thread_id _sigev_un._tid #endif #define SIG_PTY_TIMER SIGRTMIN mtimer_t ptytimer; /* pin_setup_timer * set up for periodic task on pty * called the do_io starts */ static int setup_pin_timer () { struct sigevent ptyevent; /* set up event */ memset (&ptyevent, 0, sizeof ptyevent); // ptyevent.sigev_value.sival_int = pty; ptyevent.sigev_signo = SIG_PTY_TIMER; /* works with syscalls but fails with glibc implementation */ ptyevent.sigev_notify = SIGEV_THREAD_ID; ptyevent.sigev_notify_thread_id = worker_tid; /* gettid(); */ int res = mtimer_create (CLOCK_REALTIME, &ptyevent, &ptytimer); if (res >= 0) { LOGDEBUG (2, "set timer for thread\n"); return 0; } LOGWARN ("setting timer 0x%x by thread %d failed\n", ptytimer.id, mgettid()); LOGSYSERR (Debug, "timer"); /*** second try ***/ memset (&ptyevent, 0, sizeof ptyevent); // ptyevent.sigev_value.sival_int = pty; ptyevent.sigev_signo = SIG_PTY_TIMER; ptyevent.sigev_notify = SIGEV_SIGNAL; /***/ res = mtimer_create (CLOCK_REALTIME, &ptyevent, &ptytimer); if (res < 0) { LOGERR ("cannot setup timer 0x%x, hangup won't work\n", ptytimer.id); return res; } LOGDEBUG (2, "set timer signal\n"); return 0; } struct _state { uint8_t dp_dsp_status; uint16_t io_uart_msr; uint16_t io_uart_status; unsigned x_modem_state; unsigned x_modem_mode; unsigned io_app_tx_count; unsigned x_line_rate; /* fifo sizes */ int io_dte_tx_bytes; int io_dte_rx_bytes, io_dce_tx_bytes, io_dce_rx_bytes, io_app_tx_bytes; } corestate; extern unsigned x_modem_state; extern unsigned x_modem_mode; extern unsigned x_line_rate; extern uint8_t dp_dsp_status; extern uint16_t dp_wDspRetrainState; //extern char *sRate[]; unsigned first (unsigned ov, unsigned nv) { return ov; } unsigned second (unsigned ov, unsigned nv) { return nv; } char *rate1 (unsigned or, unsigned nr) { return sRate[or]; } char *rate2 (unsigned or, unsigned nr) { return sRate[nr]; } unsigned bits_set (unsigned oval, unsigned nval) { return ~oval & nval; } unsigned bits_cleared (unsigned oval, unsigned nval) { return (oval & ~nval); } #define CHECK_TRANSITION(var, fmt, diff1, diff2) \ if (var != corestate.var) { \ if (c) { ptr += sprintf (ptr, ", "); } else {ptr += sprintf (buf, "monitor: "); c = 1; } \ ptr += sprintf (ptr, __STRING (var) ": " fmt, diff1 (corestate.var, var), diff2 (corestate.var, var)); \ corestate.var = var; \ } \ #define CFIFO_DECLARE(fifo,type) \ extern type *fifo##_wptr, *fifo##_rptr, *fifo##_eptr, *fifo##_sptr #define CFIFO_SIZE(fifo) (fifo##_eptr - fifo##_sptr) #define CFIFO_BYTES(fifo) \ (fifo##_wptr >= fifo##_rptr) ? \ (fifo##_wptr - fifo##_rptr) : \ (fifo##_eptr - fifo##_rptr) + \ (fifo##_wptr - fifo##_sptr) #define CFIFO_CHANGED(fifo) (fifo##_bytes != corestate.fifo##_bytes) #define CHECK_CFIFO_TRANSITION(fifo) \ { \ fifo##_bytes = CFIFO_BYTES (fifo); \ if (CFIFO_CHANGED(fifo)) { \ if (c) { ptr += sprintf (ptr, ", "); } else {ptr += sprintf (buf, "monitor: "); c = 1; } \ ptr += sprintf (ptr, __STRING (fifo) " %d/%d", fifo##_bytes, CFIFO_SIZE (fifo)); \ corestate.fifo##_bytes = fifo##_bytes; \ } \ } CFIFO_DECLARE (io_dte_tx, unsigned char); CFIFO_DECLARE (io_dte_rx, unsigned char); CFIFO_DECLARE (io_app_tx, unsigned char); CFIFO_DECLARE (io_dce_rx, unsigned short); CFIFO_DECLARE (io_dce_tx, unsigned short); static int io_dte_tx_bytes, io_dte_rx_bytes, io_dce_tx_bytes, io_dce_rx_bytes, io_app_tx_bytes; void monitor_state (void ) { int c = 0; char buf[1024], *ptr = buf; CHECK_TRANSITION (io_uart_msr, "+%x -%x", bits_set, bits_cleared); CHECK_TRANSITION (io_uart_status, "+%x -%x", bits_set, bits_cleared); CHECK_TRANSITION (x_modem_state, "%d->%d", first, second); CHECK_TRANSITION (x_modem_mode, "%d->%d", first, second); CHECK_TRANSITION (x_line_rate, "%s->%s", rate1, rate2); CHECK_TRANSITION (dp_dsp_status, "+%x -%x", bits_set, bits_cleared); CHECK_TRANSITION (io_app_tx_count, "%d->%d", first, second); if (c == 1) { ptr += sprintf (ptr, "\n"); LOGDEBUG (Event, buf); } /* fifos */ ptr = buf; c = 0; CHECK_CFIFO_TRANSITION (io_app_tx); CHECK_CFIFO_TRANSITION (io_dte_tx); CHECK_CFIFO_TRANSITION (io_dte_rx); CHECK_CFIFO_TRANSITION (io_dce_tx); CHECK_CFIFO_TRANSITION (io_dce_rx); if (c == 1) { ptr += sprintf (ptr, "\n"); LOGDEBUG (Event, buf); } } extern unsigned pin_check_mctrl (int changes); static void pty_pulse (int signum) { static unsigned count = 0; logdebugadd (5, "pty<%d>\n", mgettid()); mport_mctrl_flipflop (&mport, pin_check_mctrl (1)); if (Debugged (Event)) monitor_state(); if (++count == 2) { //monitor_state(); count = 0; } } void setup_pin_watcher (void) { struct sigaction timer_action; timer_action.sa_handler = pty_pulse; timer_action.sa_flags = 0; sigemptyset (&timer_action.sa_mask); sigaction (SIG_PTY_TIMER, &timer_action, NULL); } #include #include #include int get_cmd (FILE *control, char *cmd, int size) { char *ptr = cmd; int skipping = 0; int left = size - 1; int c; if (left < 0) return left; while (1) { errno = 0; c = getc (control); switch (c) { case ' ': case '\t': continue; case EOF: logdebugadd (Note, "EOF"); if (errno == EINTR) { logdebugadd (2, "wa"); continue; } if (feof (control)) return 0; LOGSYSERR (Warning, "unexpected gets"); continue; case '\n': if (skipping) { ptr = cmd; left = size - 1; skipping = 0; continue; } if (ptr == cmd) continue; *ptr = '\0'; return ptr - cmd; default: if (skipping) continue; if (left == 0) { LOGWARN ("too long cmd, skipping\n"); skipping = 1; } else { *ptr++ = c; left--; } } } } int main (int argc, char *argv[]) { log_setup (Std); /* to std */ if (! parse_arguments (argc, argv)) return 1; if (config.syslog) log_setup (Syslog); if (config.daemon) { if (daemon (1, config.logfile) == -1) { /* log_setup (Std); */ /* default */ LOGSYSERR (Debug, "daemon"); LOGWARN ("failed to go daemon\n"); config.daemon = 0; } else { if (config.daemon && ! config.logfile) { config.syslog = 1; log_setup (Syslog); } LOGDEBUG (2, "went daemon\n"); /* set up signal */ setup_daemon_signals(); } } #ifndef MSTAMP # warning "MSTAMP undefined. Badly released." #endif LOGDEBUG (Note, "source stamp `%s'\n", __stringify (MSTAMP)); if (argc > 0) { int ai, quote; char cmd[256], *ptr; int size; size = sizeof cmd; ptr = cmd; quote = 0; SPRINTF_ADJUST (ptr, size, "%s", argv[1]); for (ai = 2; size && (ai < argc); ai++) { if (quote) { SPRINTF_ADJUST (ptr, size, " `%s'", argv[ai]); quote = 0; } else SPRINTF_ADJUST (ptr, size, " %s", argv[ai]); if (strncmp (argv[ai], "--country", strlen (argv[ai])) == 0 || strncmp (argv[ai], "--log", strlen (argv[ai])) == 0) quote = 1; } LOGDEBUG (Note, "arguments \"%s\"\n", cmd); } LOGDEBUG (Note, "configuration: debuglevel=%d%s\n", config.debuglevel, config.realtime ? ", realtime" : "" ); watch_setup(); int res = mport_init (&mport); if (res != PortOk) return res; /* for clean-ups */ setup_kbd_interrupt(); setup_segv(); worker_tid = mgettid(); /* setup in worker context */ setup_pin_timer(); setup_pin_watcher(); /* launch communication thread */ if (mthread_create (serve_port, NULL) == -1) { LOGERR ("Cannot create servicing thread.\n"); return 4; } LOGDEBUG (Note, "servicing thread launched\n"); // process_timer(); // smp case #ifdef MARTIAN_CORE_DEBUG ask_driver_vars (dev_fd); #endif /* ready to serve */ LOGINFO ("Your port is %s\n", config.symlink_name); /* worker */ LOGDEBUG (2, "worker thread going into loop (tid = %d)\n", worker_tid); /* test spurious */ /* sleep (3); */ /* lt_add_timer ();*/ #define MARTIAN_CONTROL "/dev/martian" if (mkfifo (MARTIAN_CONTROL, 0600) == -1) { if (errno == EEXIST) LOGDEBUG (Note, MARTIAN_CONTROL " already exists\n"); else LOGSYSERR (Warning, "mkfifo"); } FILE *control; do { control = fopen (MARTIAN_CONTROL, "r"); if (control || errno != EINTR) break; logdebugadd (Mechanism,"ci"); } while (1); if (! control) { LOGSYSERR (Warning, "open"); LOGWARN ("Cannot setup controlling node. No commands to be processed\n"); } while (1) { char cmd[256]; if (control) { int num = get_cmd (control, cmd, sizeof cmd); logdebugadd (Note, "out"); if (num == 0) { LOGDEBUG (Note, "Reopenning control stream\n"); fclose (control); do { control = fopen (MARTIAN_CONTROL, "r"); if (control || errno != EINTR) break; logdebugadd (Mechanism,"ci"); } while (1); if (! control) { LOGSYSERR (Warning, "open"); LOGWARN ("Cannot setup controlling node. No commands processed\n"); } continue; } if (strcmp ("debug:dce_rx", cmd) == 0) { extern void iopl (int ); LOGINFO ("misusing io_dce_rx_rptr\n"); /*void *(*ptr) = &io_dce_rx_rptr;*/ char *ptr = (char *) &io_dce_rx_rptr; iopl (3);asm volatile ("cli"); //*(ptr + 2) = '\0'; *((__u32 *)(ptr+1)) = 0; *((__u16 *)(ptr+3)) = '\0'; asm volatile ("movl %esi,%esi"); asm volatile ("sti"); iopl (0); } else if (strcmp ("debug:kdce_rx", cmd) == 0) { extern int mfd; LOGINFO ("misusing io_dce_rx_rptr through kernel\n"); int result = ioctl (mfd, MARTIAN_SCREWUP_DCE_RX); if (result != 0) LOGSYSERR (Warning, "ioctl"); } else if (strcmp ("debug:ff", cmd) == 0) { extern int mfd; LOGINFO ("initiating kmodule fifo fault\n"); int result = ioctl (mfd, MARTIAN_FIFO_FAULT); if (result != 0) LOGSYSERR (Warning, "ioctl"); } else { LOGDEBUG (Note, "unknown cmd <%s>\n", cmd); } } else pause(); logdebugadd (5, "wa"); } return 0; } extern void pin_reset (int pin); extern int pin_setup (int pin); static void *serve_port (void *arg) { int server = -1; // setup_pin_watcher(); LOGDEBUG (2, "servicing thread started (tid = %d)\n", mgettid()); if (config.realtime) realtime_setup(); mport_tinit (&mport); while (1) { int client; server = pin_setup (server); if (server == -1) { LOGERR ("cannot setup streams on user side\n"); exit (1); } client = accept_client (server); if (client < 0) { LOGERR ("accept"); continue; //?? } LOGDEBUG (Sequence, "got a client\n"); session_run (client); pin_close (client); LOGDEBUG (Sequence, "disconnected\n"); #ifdef MARTIAN_CORE_DEBUG print_core_vars_common (common); ask_driver_vars (mfd); // let's kernel driver dump them too #endif } /* Never happen */ pin_reset (server); } static void dump_global () { mport_dump_summary (&mport); /* */ } static void mexit (void ) { extern void dump_isr (void); extern void show_ioctl_profile(void); extern void dump_dspop_profile(void ); /* clean up */ pin_reset (-1); if (Debugged (Stats)) { dump_global(); dump_isr(); show_ioctl_profile(); } if (config.daemon) LOGINFO ("Daemon stopped.\n"); else LOGINFO ("Bye.\n"); exit (0); } extern int gettid(void); /*** keyboard interrupt setup/handler ***/ void kbdint_handler (int sig_num) { LOGDEBUG (2, "Intr in thread <%d>\n", mgettid()); mexit(); } void setup_kbd_interrupt (void) { struct sigaction timer_action; timer_action.sa_handler = kbdint_handler; timer_action.sa_flags = 0; sigemptyset (&timer_action.sa_mask); sigaction (SIGINT, & timer_action, NULL); } static void sigterm_handler (int sig_num) { LOGDEBUG (2, "TERM signal in thread <%d>\n", mgettid()); mexit(); } static void setup_daemon_signals (void) { struct sigaction timer_action; timer_action.sa_handler = sigterm_handler; timer_action.sa_flags = 0; sigemptyset (&timer_action.sa_mask); sigaction (SIGTERM, &timer_action, NULL); } /* segmentation fault hanling: dump common structure and dump core */ static void segv_handler (int sig_num); static void setup_segv (void) { struct sigaction action; action.sa_handler = segv_handler; action.sa_flags = 0; sigemptyset (&action.sa_mask); sigaction (SIGSEGV, & action, NULL); } static void segv_handler (int sig_num) { struct sigaction action; print_core_vars_common (Mcb); printf ("restarting\n"); action.sa_handler = SIG_DFL; action.sa_flags = 0; sigemptyset (&action.sa_mask); sigaction (SIGSEGV, & action, NULL); } martian-full-20080625/modem/debug_script.in0000644000175000017500000000040110533130476017151 0ustar marvmarvecho backtrace\n backtrace echo mcb:\n print * (struct martian_common *) &mcb_dump echo \n echo registers:\n info registers echo \n disassemble echo \n printf "exception at 0x%x\n", $eip disassemble $eip-0x20 $eip+0x20 echo \nthreads:\n info threads #quit martian-full-20080625/modem/ltmdmobj.o0000644000175000017500000204274310446367405016167 0ustar marvmarvELF|C4( ŠD$¶ƒàƒút%ƒúJt¶ÀöÀ¶€ÃƒúuêƒÈ€ëå‰ö¶À¶€ÃS‹T$ ƒú‹\$‹L$‹D$t>ƒúwJt[÷À‰D$‰L$ ‰\$[éüÿÿÿvƒúuá·À‰D$‰L$ ‰\$[éüÿÿÿ‰ö·À‰D$‰L$ ‰\$[éüÿÿÿvSƒì ‹\$jjSèüÿÿÿƒÄ jjSèüÿÿÿƒÄ jjSèüÿÿÿƒÄ[ÃvƒìjèüÿÿÿƒÄÉöƒì èüÿÿÿPjjjèüÿÿÿƒÄ jjjèüÿÿÿƒÄéüÿÿÿ‰öƒì èüÿÿÿRjjjèüÿÿÿƒÄ jjjèüÿÿÿƒÄ jD$Pjèüÿÿÿèüÿÿÿjjjjèüÿÿÿ¶D$+ƒÄ,ÃSƒì‹\$f¡f‰·Pèüÿÿÿf‰CƒÄ[ÃSƒì‹\$f9t?ƒì ·Pèüÿÿÿ‰ÚÁêƒÄf9Ðrf¡f)Ø·ÀƒÄ[ÉØ÷Ðfëêv1ÀëæWVS‹|$·ƒì P‰þèüÿÿÿÁîƒÄf9ð‰Ãr6·×·)Ð À ˆ·Û H)ó¸…ëQ÷ë‰ÐÁøÁû)Ø È[^·Á_÷׷)Ð À ˆ H·Ã‰ó)ø…ëQ÷ë‰ÐÁøÁûÁá)Øf)ÁëÃvVSR‹t$èüÿÿÿ·Øƒì SèüÿÿÿƒÄf9ðrïX[^Ãv‹T$Š„À‹L$t ‰öˆBŠA„ÀuöÆÉöSŠT$„Ò‹\$‹L$ t vŠˆACþÊuöÆ[ËT$Š1ÉB„Àt vŠAB„Àuø·ÁÃVSƒì‹\$‹t$ Sèüÿÿÿ·ÀʃĄÀt vˆFŠC„ÀuöÆY[^ÃvS‹T$f…Ò‹\$‹L$ t ‰öŠˆACfJuö[ÃÆš'Æ›=Æ¡ÈÆ¢ÿÆÏÆ¥ÿƪƫ<Æ­Æ®<ư ÆÂÆÃÿÆÐÆÔÆ×ÿÆ߯Ø ÃÆÏÆÕ(Æ¢ ÆÔÆÆÑÆÈ ÆžZÆŸZÆÀÆÁÆÄÆÅƬƠ&Æ£PƤƥƿ ư ƱƲƳƴƵÆÍÿÆÉÆâÆáÃƒì €=Æš!Æ›@ÆÆžPÆŸ–Æ¢dÆ£PƤƥƦƧ\ƯƱƲ ƵxtcƾƒìhhïÆ¿ ÆÀÆÁÆÂÆÃ<ÆÅÆÈ ÆàÆâÆì èüÿÿÿƒÄÃÆ¾ë›vƒìÆš!Æ›CÆÆžZÆŸZÆ %ƢƣPƤƥƪ(Æ«<Æ­(Æ®<ưƱƲƶƹÆÀÆÁÆ¿ ÆÄÆÅÆÈ ÆÏÆÔÆÕÆÖÆØ ÆÉÆÂÆÃ=Ot-=O|=huˆf=„Pt‰ƒÄ éüÿÿÿ€ @éiÿÿÿƒÄ éüÿÿÿ‰ö=ht-=h=…FÿÿÿƒÄ éüÿÿÿ=†€…3ÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿèüÿÿÿéÔþÿÿ‰öèüÿÿÿéÈþÿÿ‰ö= t=Ð…´þÿÿèüÿÿÿéªþÿÿèüÿÿÿé þÿÿ‰öèüÿÿÿé”þÿÿ‰ö€=…?þÿÿ€ €é3þÿÿvf¡‚f=t\f=àt*f=6tÃvf=„@uñ€=™ uèÆÚ2ëßv¶™ƒú tƒúuÅÆë¼Æ ŒÆ묉ö€=™u›€=Æu‹Æ(낉öÃvUWVSQ‹\$‹D$ f‰D$ˆØ‹L$$ƒà‹T$¢~fù3‹D$ ‰Ý‰Ö‰ÏÆÆÆf‰ˆf‰†f‰ ‚f£„Æu„xfþ]„Mfÿ]„"·Å-Cƒøwÿ$…ðÆvÆ~Z[^_1À]ÃÆÆ~ ëèÆÆ~ ÆuPëÑÆëÀÆÆ~ëÞÆÆ~ë¨ÆÆëÆÆ~ëˆÆÆ~ éuÿÿÿÆéaÿÿÿÆë¯ÆëâÆë寯~é;ÿÿÿÆëëÆé.ÿÿÿÆé2ÿÿÿÆÆ~ éÿÿÿvf|$[…Ñþÿÿ½[fdž[é¾þÿÿfÿ†€uÙfÇ‚]ÆÆ~ ëÀÆupé|þÿÿ¶D$‹…ÃvÃv¸ÉöSƒì‹L$Æ™1Ò³¸;t`BƒÀ€úUvóƒù*ˆ™tBù§t1èüÿÿÿ„ÀuÆ™ƒì¶™PjèüÿÿÿèüÿÿÿƒÄ¸[ÃÆ™BëÆÆ™(뵈Óëœƒì  uƒàðÿfÇ<¸ŠtèüÿÿÿèüÿÿÿèüÿÿÿÆƒÄ ÃfÇ<ëÛWVSƒìjUh,èüÿÿÿ¿-¾ƒÄ³‡vƒì¶P·ÇPKèüÿÿÿFGƒÄ€ûÿuå[^_éüÿÿÿWVSƒì ˆD$h,èüÿÿÿƒÄLt4ƒìVhèüÿÿÿƒÄèüÿÿÿjjjh…f£èüÿÿÿƒÄé@ÿÿÿ€~uÆ€=tÎÆëÅÇÇèüÿÿÿf£éÿÿÿèüÿÿÿ„À„÷þÿÿÇèüÿÿÿ€=f£t'€=½„ÿÿÿÇÇD$^[^éüÿÿÿ ì„ÀuEèüÿÿÿ€=ìdf£ÆÇH†€þÿÿPjjjèüÿÿÿèüÿÿÿf£éÿÿÿ¶ÐÁâf¡f)Ѓì·ÀPh“èüÿÿÿƒÄë–vèüÿÿÿèüÿÿÿ€=±tƒ=t ƒ=t?èüÿÿÿ€=ÆDÇÇÇ„àýÿÿ[[^éüÿÿÿƒìjhèüÿÿÿƒÄë­€=±„Ÿ¡ƒøt^ƒ=tzƒøtPƒ=t3èüÿÿÿÇ"Çèüÿÿÿf£Çécýÿÿ…ÀuÉ€=ruÀèüÿÿÿë¾èüÿÿÿÇÇÇ븃ìjhèüÿÿÿƒÄ¡éjÿÿÿ¡ƒøt<ƒø t7ƒø t ƒø…ñüÿÿjjjÇjbéýÿÿÇX[^éüÿÿÿÇÇ"ÇZ[^éüÿÿÿÇÇèüÿÿÿX[^éüÿÿÿÇ ÇjjjjéýÿÿÇëçÇ Y[^éüÿÿÿÇD$X[^éüÿÿÿÇD$ëîÇD$ ëäÇD$ ëÚÇD$ ëЀ=ru9èüÿÿÿƒûÇ"tÇ Æ(éÃüÿÿÇé´üÿÿèüÿÿÿëÅ¡ƒøBt;ƒøAt&ƒ=†¥ûÿÿƒø…œûÿÿÇD$^[^éüÿÿÿÇD$X[^éüÿÿÿÇD$X[^éüÿÿÿèüÿÿÿÇéDüÿÿƒ=t!èüÿÿÿƒì jèüÿÿÿƒÄÇéüÿÿ¡9uÒëâÇÇèüÿÿÿèüÿÿÿ€=3f£f£uX[^éüÿÿÿX[^éüÿÿÿèüÿÿÿèüÿÿÿÇ èüÿÿÿf£¶€Ñàf£éªúÿÿƒìV·ÀPÆYèüÿÿÿf‰FéEûÿÿÆÇÆÆèüÿÿÿÇD$Y[^éüÿÿÿèüÿÿÿ€=…GúÿÿÇé8úÿÿƒì ¶PèüÿÿÿˆFéÜúÿÿ¶F‰D$¶‰D$Z[^éüÿÿÿƒì ·Pèüÿÿÿf‰FƒÄƒ=뤷FƒìP·Pèüÿÿÿëáèüÿÿÿf‰ëÚèüÿÿÿëôƒ=†Àùÿÿ¡ƒøBt+ƒøAtèüÿÿÿÇ é‰úÿÿƒì jèüÿÿÿƒÄéwúÿÿƒì jèüÿÿÿëìèüÿÿÿ[[^éüÿÿÿƒ=†eùÿÿ¡ƒøBtƒøAtèüÿÿÿ룃ì jë°ƒì jë»X[^éüÿÿÿX[^éüÿÿÿX[^éüÿÿÿX[^éüÿÿÿ^[^éüÿÿÿèüÿÿÿþÈ”é ùÿÿ€=•éúøÿÿèüÿÿÿX[^éüÿÿÿÆÇÆÆÇD$é`þÿÿƒì ¡…Àu‹…Òt4…Àt'ƒì h3èüÿÿÿ·ÀÀPÁâƒÄ9:¡…Àu ¸ƒÄ Ãì h4èüÿÿÿ·ÀÀPÁâƒÄ9~Ï1ÀëЃìhÑ=jèüÿÿÿXZhpïjèüÿÿÿYXhUjèüÿÿÿXZ¶ÈPjèüÿÿÿƒÄ jjjèüÿÿÿƒÄÉöƒìhl4jèüÿÿÿYXhµ$jèüÿÿÿXZhôjèüÿÿÿYX¶ÈPjèüÿÿÿƒÄ jjjèüÿÿÿƒÄÉöSƒìŠ\$jh fÇèüÿÿÿƒÄ€=„ëèüÿÿÿƒìh"j<ÆèüÿÿÿXZh#jGèüÿÿÿYXjjÆèüÿÿÿXZjjèüÿÿÿYXjj èüÿÿÿXZhj9èüÿÿÿYXhÐjHèüÿÿÿXf¶݃èZ·ÀPj7èüÿÿÿ¶ȉ$èüÿÿÿ‹ƒÄƒú fÇd‡Äÿ$•| ¸ƒúv ‹…Òuyƒì·ÀPjèüÿÿÿ¡ƒèƒÄƒøvG¡Hƒøw4èüÿÿÿ¡ƒøtƒøtP¶ÃPjjèüÿÿÿƒÄ[ÃP¶ÃPjëêvèüÿÿÿëʃìhj9èüÿÿÿƒÄ륃ì·ÀPj èüÿÿÿƒÄƒ=t ƒìhëЃìh ëÆ‰ö¸é>ÿÿÿ¸é4ÿÿÿ¡…Àt ¸é!ÿÿÿ¸éÿÿÿ‹ …Ét ¸éÿÿÿ¸éùþÿÿ¸fÇÂéæþÿÿ¸fÇÜéÓþÿÿvèüÿÿÿÆéþÿÿvƒìhŽèüÿÿÿƒàƒÄf…ÀuP ™<t<t< t<t uƒàð<0t1ÀƒÄ Ãì j;èüÿÿÿ%ƒÄf…ÀtâǸëÓƒì j2èüÿÿÿ¢Ç$2èüÿÿÿƒÄ:u«ƒà„Àu¤ 7<t<u¿ƒì jèüÿÿÿƒÄë°vƒìhŽèüÿÿÿƒàƒÄf…À¹u‰ÈƒÄ Ãì ·PèüÿÿÿƒÄfƒø2w1Éë܃ì h­èüÿÿÿƒÄfHtc€%þ€=™t èüÿÿÿf£ë˃=t4ƒì jLèüÿÿÿƒÄf;rŠB€ú ¢¹‡pÿÿÿë¶Æë­ŠˆÐƒà„À„&¡…À„¬ƒì hèüÿÿÿƒÄf;††ŠˆÐƒà„Àtaƒì ·PèüÿÿÿƒÄfƒøxv!ŠˆÐƒà„À… ÿÿÿƒÊˆéÿþÿÿƒì ·PèüÿÿÿƒÄf=˜¹‡½þÿÿé÷þÿÿƒÊˆèüÿÿÿf£ë‰€%÷뺃ì j(èüÿÿÿƒàƒÄf…ÀtLŠˆÐƒà„Àt'ƒì ·PèüÿÿÿƒÄfƒø<¹‡Sþÿÿé ÿÿÿƒÊˆèüÿÿÿf£ëÀ%ûéçþÿÿƒÊƒâýˆèüÿÿÿƒì j^€%óf£èüÿÿÿ‹ fÑèƒÄ…Éf£…¥þÿÿƒìjhªèüÿÿÿƒÄéþÿÿ‰öƒì èüÿÿÿf£ƒÄ Éöƒì ÇèüÿÿÿÆZƒÄ Ãvƒì ÇèüÿÿÿÆZƒÄ ÃvÃv1ÀÃìjj'èüÿÿÿYXjj(èüÿÿÿXZ¶ÛPj&èüÿÿÿYXhx:jèüÿÿÿXZhÜ6jèüÿÿÿYXh =jèüÿÿÿXZhW;jèüÿÿÿYXh›<j èüÿÿÿXZhpïj#èüÿÿÿYXhÎèj$èüÿÿÿXZh‚çj%èüÿÿÿYXhñ j!èüÿÿÿXZhù)j"èüÿÿÿYXh,ýhÀèüÿÿÿXZhQhÁèüÿÿÿƒÄ jj jèüÿÿÿƒÄÃƒì ƒ=w €=€uƒÄ Ãvƒìj(j&èüÿÿÿXZhÊ#jèüÿÿÿYXhQ$jèüÿÿÿXZhž%jèüÿÿÿƒÄ jjjèüÿÿÿfÇfÇÇèüÿÿÿf£ƒÄë‰Sƒìƒ=w €=€u ¸ƒÄ[áƒø„xƒø„#f‹‚pþÿÿf=,wf¡f=Ûv f= †—fúíw f=Ñve ˆ$ ˆD$j\$Sjj!èüÿÿÿjhßjj!èüÿÿÿƒÄ jSjj!èüÿÿÿÇƒÄ jjjèüÿÿÿ¸ƒÄéDÿÿÿƒì ·PèüÿÿÿƒÄf=‡w‚1Àé$ÿÿÿ ˆ$ ˆD$j\$Sjj!ÇÇÇèüÿÿÿjhäjj!èüÿÿÿƒÄ jSjj!èüÿÿÿébÿÿÿƒì j(èüÿÿÿƒàƒÄf…À„Äþÿÿƒì ·Pèüÿÿÿf£èüÿÿÿf£ÇƒÄé‘þÿÿƒì j(èüÿÿÿƒàƒÄf…À…xþÿÿƒì ·Pèüÿÿÿf£èüÿÿÿf£Çë²¶D$À‹…ƒøtƒøt1À¶Ààµëô ³ëìƒì 1ÒÆÆ1ÀvBƀǀÆ€ƒÀ$€úvßfÇèüÿÿÿf£èüÿÿÿ£ƒÄ ÃÆÆ1Ò1À‰öBƀǀÆ€ƒÀ$€úvßÉöVS‹L$ Š1Û„Ò‰Öt6BÐ< v=€ú*t8€ú#t3€úAt.€úBt)€úCt$€úDtvAŠ„Ò‰Öt€ûvʶÃ[^ƀöÉòˆCëÖ‰öUWVSQ‹D$ŠˆD$€|$¸ÿtBÆD$1ÿ1í1ö‰öŠ–1Û„Ò†‹L$u&ÆD$G‰øEƒÆ$<vÚ€t$¶D$þZ[^_]Ã8T$t‹L$Š„Òu€8t€ûuʼnèëÛ‰ö€|$tßA@ŠC:uÜ„ÒtÜ€ûvîëÑVSV¶t$ö… Ì8‚w 1À[[^Ãvƒì ÿ²èüÿÿÿ‰Ã‰4$èüÿÿÿf¶ÀƒÄf9Ã’À¶Àëωöƒì  Í<ÿt8s9ƒì ÿt$èüÿÿÿÇ$èüÿÿÿƒÄ1Ò<ÿt'<þtK¶ÈÉ ²8•rǺ‰ÐƒÄ Ãì QèüÿÿÿƒÄ„Àt Ç ëÙ1ÒëÚ‰öÇëÇVSPŠD$€=™‹\$ˆD$„ìŠÍ€úÿt€|$„Ê @8Тƒ‹ƒì SèüÿÿÿÇ$èüÿÿÿƒÄ€=ˆÂt6<ÿ„¼€|$u-¶ÀÀÁàþ ƀǀÆ€X[^Éö¶ÀÀ¾ …Š\ :Ìta¶D$€|$‰tCCˆD €=™tº¶ÚÛf¡¾Áãf‰Dƒì ·PèüÿÿÿƒÄf‰Dë‡Έ\ ë¸þë—€|$„gÿÿÿ1Ò1Û€»tBƒÃ$€úvîéKÿÿÿƒìhƒPèüÿÿÿ¶D$ƒÄ€|$‰ƒtFƃf¡ƒì f‰ƒ·PèüÿÿÿƒÄ€=Ìf‰ƒ …çþÿÿþéÜþÿÿ Îˆƒë´f¡ƒì f£·PèüÿÿÿƒÄf£éKþÿÿ‰öÆé=þÿÿ€=² †þÿÿ„À…ÿýÿÿX[^éüÿÿÿvUWVSƒì  ¶<ÿtH€=™„´¶À€Ñàf‰D$  Í<ÿt8sn1ö1Û1ÿv€»uF‰ðƒÃ$G<vìƒÄ [^_]Ãì WèüÿÿÿƒÄ„ÀuÝƒì ½ÿtèüÿÿÿƒÄf;D$ rÂÆD ƃǃþ 뤃ì ÿ5èüÿÿÿƒÄf;D$ ‚vÿÿÿÆéjÿÿÿf¶ÀéKÿÿÿ‰öUWVSƒì8ŠD$LˆD$ŠD$P¶ØÛÁ㳈D$Vèüÿÿÿ·ÀƒÄPVjj!èüÿÿÿƒì Vèüÿÿÿ²(ƒÄ¶ÒRhjj!èüÿÿÿƒÄ·Pèüÿÿÿ‰Æf‹ƒ ƒÄf9Ɔ f)ð°`êÿÿ€|$„p€=™„S¶¶€¶D$ÀŠÌ8…†#€|$u €=¶ÿ„ûƒì ¶D$Àÿ4…èüÿÿÿf)ÃÄf…ötKPj |$W·ÃPèüÿÿÿƒì Wèüÿÿÿ·ÀƒÄPWjj!èüÿÿÿƒÄ jhèjj!èüÿÿÿƒÄf…Û‰ýu fþçw¾èfÁîP·ÆÅ)ÂÐÒj ÁêWRèüÿÿÿƒì Wèüÿÿÿ·ÀƒÄPWjj!èüÿÿÿƒÄ jhêjj!èüÿÿÿƒÄ ˆD$ ˆD$ÆD$jUjj!èüÿÿÿƒÄ<[^_]Ãjhïjj!èüÿÿÿƒÄl$뻉öf¶¶é­þÿÿvƒì ¶D$Pèüÿÿÿf¶ØƒÄéþÿÿ‰öf)ð‰Æé_þÿÿ‰öUWVSƒì ŠD$ ˆD$ ˆD$ ˆD$ ÆD$ ÆD$1Û1ö1ÿv€¾t+€|$u` ²8†rS€|$t"ƒìWjèüÿÿÿƒÄ‰öCƒÆ$G€ûvÂƒÄ [^_]Ãj h÷jj!èüÿÿÿjD$Pjj!èüÿÿÿÆD$&ƒÄ ë´€|$„€|$u² ²8†s¥ƒì WèüÿÿÿƒÄ„Àu•€|$t8ƒì ®Uèüÿÿÿ·ÀƒÄPUjj!èüÿÿÿjD$Pjj!èüÿÿÿƒÄ éVÿÿÿjhjj!èüÿÿÿjD$Pjj!èüÿÿÿÆD$&ƒÄ ëž ²8†ƒbÿÿÿƒì WèüÿÿÿƒÄ„À„Nÿÿÿ€|$t ƒìWjéëþÿÿjh jj!èüÿÿÿjD$Pjj!èüÿÿÿÆD$&ƒÄ ëËvSƒì ˆD$ ˆD$ÆD$\$jSjj!èüÿÿÿ ÍƒÄ<ÿt8s-ƒì jèüÿÿÿÇ$èüÿÿÿÇ$èüÿÿÿƒÄƒÄ[Ãvj hjj!èüÿÿÿjSjj!èüÿÿÿƒÄ ë×vSƒì¶ Š\$PjèüÿÿÿXZ¶ PjèüÿÿÿYX¶PjèüÿÿÿXZf¶f¶ÑзÀPjèüÿÿÿƒÄ j¶ÛSj èüÿÿÿƒÄ[ÃvVSQ ƒà@„À¶t$ŠšŠ›tÐê³2(Óƒì¶ÂPjèüÿÿÿXZ¶ÃPjèüÿÿÿ ™ƒÄ<„‹<„ƒ<t<%t{<(tw<'ts<"toƒìhóvjèüÿÿÿƒÄ€=tS‰òj¶ÂPj èüÿÿÿƒÄY[^Éöƒìhh¯èüÿÿÿ‰ò¶ÂÇ$Ph©hÚjèüÿÿÿƒÄ ëÅvƒìh„ë’‰öW V<"Sw{f¶ÀƒìƒÀ·ÀPh`èüÿÿÿ¶ÔƒÄƒøw<ÿ$…  1À¶À1ÿœ¾dvƒì·PVGèüÿÿÿ‰øƒÄFƒÃ<vå[^_ðëɰ ëŰ0ëÁ°@ë½°Pë¹°`ëµf¶ÀƒìƒÀ냃ì èüÿÿÿƒì¶ÛPj&èüÿÿÿYXh›+jèüÿÿÿXZhÍjèüÿÿÿYXh =jèüÿÿÿXZhW;jèüÿÿÿYXhQj èüÿÿÿXZhñj!èüÿÿÿYXhÈíj"èüÿÿÿXZhpïj#èüÿÿÿYXhÎèj$èüÿÿÿXZh‚çj%èüÿÿÿƒÄ jj jèüÿÿÿèüÿÿÿf£èüÿÿÿf£èüÿÿÿf£ÇÇfÇfǃÄÃWVSƒì hTèüÿÿÿ‰ÃÇ$”èüÿÿÿ‰Æ¡1ÿƒÄƒø„ƒø‚0ƒø„C‰øþÈtuƒì ·Pèüÿÿÿ¶Ï’’ÁâƒÄf9Ðs 1À[^_Ãvƒì j:èüÿÿÿ%ƒÄf…Àtà¶Ü€Ñàf9ÆvÏ€=™t¸ëÁ€=w¶ëîèüÿÿÿf£f‹f¶¢f9†hÿÿÿ€=™t€=étèüÿÿÿf£éFÿÿÿ‚âþÿÿf=v/fú©v(fúƒw!f‹ ÿÿÿf=*vfù©vfù¨vèüÿÿÿf£f‹‚Pÿÿÿfƒø0‡éþÿÿf¡f=¯†Ùþÿÿf=à‡ÏþÿÿþéÄþÿÿƒì j:èüÿÿÿ%ƒÄf…Àt}f¡fÑèf9Æw9 ™ƒè<†ˆþÿÿƒì ·PèüÿÿÿƒÄf=ô†kþÿÿf‰5é_þÿÿƒì ·Pèüÿÿÿ¿ƒÄf£ÇfÇé)þÿÿƒì ·PèüÿÿÿƒÄ€=™‰Ât€=ét f¶¢f9Âw fúâ†êýÿÿèüÿÿÿf£éÙýÿÿƒì j:èüÿÿÿ%ƒÄf…ÀtÙfÇfÇÆèüÿÿÿf£Ç멃ì j:èüÿÿÿ%ƒÄf…Àtf‹ ‰ÈfÑèf9Æs/ƒì ·Pèüÿÿÿf£Ç¿ƒÄf‹ €=™t‰ÈfÁèf9Æv·Ö·ÃB‰Ó™÷ûƒøf9Îéœþÿÿèüÿÿÿf£f‰5‰ñëâ‰öSƒìj(èüÿÿÿ1ۃĩðt ©üu³¡ƒøtjƒørIƒøt 1҃ĉÐ[ÃvþËuðƒì ·PèüÿÿÿƒÄfƒø2w ÇëËèüÿÿÿf£ëç‰öþËu¸èüÿÿÿf£èüÿÿÿf£ëÉþËtèüÿÿÿf£Çë…ƒì ·PèüÿÿÿƒÄfƒøcº‡eÿÿÿé^ÿÿÿ‰öUWVSƒìhTèüÿÿÿ‰ÃÇ$”èüÿÿÿ‰Ç¡1íƒÄƒø„Ѓø‚Oƒø„áƒì ·PèüÿÿÿƒÄf=„v ÆfÇfÇf‰=‰èþÈtG :¬r¸ÆƒÄ [^_]Éö ™<t<tf;=vf‰=1ÀëÕvèüÿÿÿf£ ™<„ð<„芫„Ò„€¶ª€Ñàf‹ f9Á‚oÿÿÿ¶Â€Ñàf9Á‡^ÿÿÿ¶­€Ñàf‹f9‚Bÿÿÿ¶®€Ñàf9‡-ÿÿÿ @¢fÇfÇéÿÿÿf‹ Aœf=î‡÷þÿÿfù–w·Á·Ð=ú°fù•†Òþÿÿf‹·Á·ÊfÑê·ÒL K9ȳþÿÿë„f¡‰Â‚ÿÿÿfƒønwf¡f=•v f=†Zÿÿÿ‚/þÿÿf= ‡wþÿÿf¡f=v†gþÿÿf=é+ÿÿÿƒì j:èüÿÿÿ%ƒÄf…Àtf¡fÑèf9Çwèüÿÿÿf£éêýÿÿƒì ·Pèüÿÿÿf£Ç½ƒÄé½ýÿÿvƒì ·PèüÿÿÿƒÄfƒø†ýÿÿƒì j:èüÿÿÿ%ƒÄf…Àt!ÇfÇfÇéeýÿÿÇfÇfÇéDýÿÿ‰öƒì j:èüÿÿÿ%ƒÄf…Àtf¡fÑèf9Çsƒì ·PèüÿÿÿƒÄfƒø‡šƒ=t €=#tB·ó·ß[9Æ(€=™…Ôüÿÿ›9ÆŽÉüÿÿèüÿÿÿf£é¹üÿÿèüÿÿÿf£ëË€=uµƒì ·PèüÿÿÿƒÄf=vœƒì ·Pèüÿÿÿf£½ƒÄéyÿÿÿƒì ·Pèüÿÿÿf£Çéwþÿÿvƒì èüÿÿÿf£èüÿÿÿf£èüÿÿÿf£ÇfÇfÇÆƒÄ ÃSƒìj:èüÿÿÿ‰Á1ۃċá”Àƒúf¶À„ƒú„½þË„ „Àt<ƒì ·Pèüÿÿÿ¶E’’·À•–ƒÄ9й=€=u2ƒì ·Pèüÿÿÿ¶F’’’·ÀÁâƒÄ9й1ɃĉÈ[Ãf¡-!f=–‡jÿÿÿf=è†[ÿÿÿ @¢éPÿÿÿf…É„:ÿÿÿƒì ·PèüÿÿÿƒÄf=ôf£wdzèüÿÿÿf£éÿþÿÿèüÿÿÿf£ë×vf…Àuƒì ·PèüÿÿÿƒÄf=ȆÍþÿÿ뼃ì ·Pèüÿÿÿf£Çèüÿÿÿ³f£ƒÄ믉öƒìj'èüÿÿÿƒÄf…Àtèüÿÿÿf£1ÀƒÄ Ãì ·PèüÿÿÿƒÄf=ˆ“À¶ÀëÜƒì  ƒàþÈtQƒìh:jèüÿÿÿXZh jèüÿÿÿYXhbjèüÿÿÿXZ¶ÈPjèüÿÿÿƒÄ jjjèüÿÿÿƒÄÃvƒìhÑ=jèüÿÿÿYXhë­VSQ‹\$Š„Àtv€úPt9€úTt4€ú!t/€ú;t*€ú,t%€ú@t €ú>t€ú^t€úVt€úWt AŠ„ÀˆÂu 1ÀøËD$ŠBÐ< ‹L$w ƒâˆ¸Àú*t7€ú#t*€úAt €úBt€úCt 1À€úDu߯ëÕÆëÐÆ ëËÆ ëÆÆ ëÁvÆ ë¹vƒìj(èüÿÿÿƒàƒÄf…Àt#ƒì ·PèüÿÿÿƒÄf£1Ò‰ÐƒÄ Ã‰öƒì j(èüÿÿÿƒÄƒà täfƒ=1vÚƒì ·Pèüÿÿÿ·À·)ЃÄƒøcº³ë¯Sƒìj èüÿÿÿÇ$èüÿÿÿY[h1jèüÿÿÿXZh#)jèüÿÿÿY[hÑ=jèüÿÿÿXZhjèüÿÿÿY[h#)j èüÿÿÿXZhúÎj èüÿÿÿY[jjèüÿÿÿXZjjèüÿÿÿY[jjèüÿÿÿXZjjèüÿÿÿƒÄ jjjèüÿÿÿèüÿÿÿ·ØƒÄƒì SèüÿÿÿƒÄf=ÏvîSjjjèüÿÿÿƒÄ[Ãƒì €=ítƒìjjèüÿÿÿƒÄÃèüÿÿÿëéSƒì€=·Š\$uƒÄ[Éöƒì jBèüÿÿÿƒÄ„ÀtWƒì ·Pèüÿÿÿ¶·’·ÀÑâƒÄ9Ð|Â1À„Û•ÀHƒì ƒàùƒÀ j£Ç!èüÿÿÿƒÄ[éüÿÿÿèüÿÿÿf£ë„vSƒìh¡ƒø ‡:ÿ$…¼ ÆÇfÇèüÿÿÿƒì hf£èüÿÿÿƒÄ„ÀuǺvƒÄh‰Ð[À=ÉÇ„°¹€9T„–€9P„tƒ=wC€=zu €=±…3‹ …Éu# ™<»ˆ„ <t €=„Ùèüÿÿÿf£¡…À„…Htqƒ=t"€=7uPƒì jèüÿÿÿÇ$èüÿÿÿƒÄÇèüÿÿÿ€=7f£t v1Òéÿÿÿƒì jèüÿÿÿƒÄëêƒì jèüÿÿÿƒÄë¡èüÿÿÿÇë©èüÿÿÿ„ÀuÇéÂþÿÿÇèüÿÿÿf£Çéwÿÿÿƒì ·PèüÿÿÿƒÄ1Òf9Ø‚ˆþÿÿéÿÿÿ»pééþÿÿƒì hèüÿÿÿƒÄ„Àº…\þÿÿé«þÿÿ€=Ó…þÿÿÆ/ésþÿÿÆ/é^þÿÿƒì hèüÿÿÿƒÄ„ÀuÆÇ‹ ŠèüÿÿÿþÈt5èüÿÿÿþÈ„Úþÿÿƒì ÿ5èüÿÿÿ¶’·ÀÑâƒÄ9ÐŒDûÿÿÇéEúÿÿèüÿÿÿþÈ„´þÿÿèüÿÿÿþÈt"ƒì ·PèüÿÿÿƒÄf=OÆûÿÿé<ûÿÿfÇèÇ éåúÿÿ€=„èüÿÿÿf£‹ ¶ƒø^‰Êw ÿ$…è €=Tt €=ÞuÆ/€9„”úÿÿA£é‡úÿÿ€=t ºéŒùÿÿ€=7tí 6<t<tƒì j èüÿÿÿƒÄëуì j ëïƒì j ëè€=¿tš€=/u €=™uˆƒì jèüÿÿÿǃċ éfÿÿÿfÇèüÿÿÿÇëÛ ×<ÿtY¶À€€f‹€·ÓÁà9Â}1¶€€€Áàf£f£Ç éõþÿÿfÇëæ¶€€€Áàf£ëË€=/t>ƒ=„Hÿÿÿƒ=„;ÿÿÿjjjjÇèüÿÿÿºƒÄé=øÿÿƒì jèüÿÿÿƒÄ€=u¬ƒìhh¯èüÿÿÿƒÄ jjjèüÿÿÿƒÄ뇉öèüÿÿÿƒì hÇèüÿÿÿé¶þÿÿ€=ÖtŠƒèA<wAéþÿÿ€=/uxŠBÐ< ‡úýÿÿ¶œƒâƒøˆT$tLƒø~ƒøt4€|$uÆD$ èüÿÿÿƒì f£¶D$PèüÿÿÿÇ é5þÿÿ„Òtϰ (ЈD$ëÊ€ú Buò뻉ö€=u €=t!ƒìD$Pÿ5èüÿÿÿX¶D$Pèüÿÿÿ뤃ì j èüÿÿÿƒÄf=ṽìhj èüÿÿÿƒÄ븉ö€=Ó…&ýÿÿ€=Pt €=Þ…ýÿÿÆ/€z„ÿüÿÿƒì jèüÿÿÿ ™ƒÄ<t<…pýÿÿfÇúÇ éXýÿÿ‰ö€y=t Æéµüÿÿf¶AƒìBƒè0R·ÀPèüÿÿÿƒÄ‹ ëÓ€=„‡üÿÿÇéxüÿÿƒ=tèüÿÿÿ€=/t‹ ÇéLüÿÿƒì jèüÿÿÿƒÄëÜ€=¸…0üÿÿÆé$üÿÿ ˆD$ ˆD$ÆD$ƒìh!\$SÆèüÿÿÿXZÿ5Sèüÿÿÿƒì Sèüÿÿÿ·ÀƒÄPSjj!èüÿÿÿƒÄ éˆûÿÿƒì ·PèüÿÿÿƒÄf;r4€=/Ç…-öÿÿ¡Š„ÀtèüÿÿÿÇ$èüÿÿÿƒÄéCÿÿÿƒìjÆÆÆèüÿÿÿƒÄ‹D$…À„"èüÿÿÿ <„´„ÀuL€=tCfƒ=‚t9€=ttƒìhÿhØÆÿèüÿÿÿXZhÿh×èüÿÿÿƒÄvPjjj.ÆèüÿÿÿƒÄ jjj,èüÿÿÿƒÄ jjjèüÿÿÿYXjhËèüÿÿÿƒÄƒÄ Ãì jjhÿhÀjèüÿÿÿƒÄ élÿÿÿ€=„?ÿÿÿ€=tf=‚ytƒìjh¤èüÿÿÿƒÄƒìjj>ÆèüÿÿÿƒÄÆÿ éòþÿÿ‰öƒìhÿhØÆÿèüÿÿÿYXhÿh×èüÿÿÿƒÄf=‚àu¼€=u³é:ÿÿÿ‰öƒì èüÿÿÿƒì jèüÿÿÿƒÄéüÿÿÿ‰öVSP¾»vƒìjSFèüÿÿÿCƒÄfþÿ?véX[^Ãƒì ÆÆÆÿÆèüÿÿÿƒìhÿhØèüÿÿÿYXhÿh×èüÿÿÿƒÄ€=„™€=…|ƒìjjèüÿÿÿXZhÿh¼ÆÿèüÿÿÿYXhÿh½èüÿÿÿXZjh½èüÿÿÿYXjh¾èüÿÿÿXZhÿh·èüÿÿÿYXhÿhØèüÿÿÿXZhîh¶èüÿÿÿƒÄ€=„°ƒì jjj@jj1èüÿÿÿƒÄ €=…zƒì jhåjjj.èüÿÿÿƒÄjjjjj1èüÿÿÿƒÄj:ÆèüÿÿÿÇ$:èüÿÿÿƒÄ€=t1ÀƒÄ Ãèüÿÿÿf=]ñÆ„øf=žä„Ûf=¤„½f=Qè„ f=å³uÀfƒ=Gu¶f=Qè„sf=峄if=¤„FÆ€=„‡€=…cQjjjèüÿÿÿƒÄ jjjèüÿÿÿÇ$h‡jhÿj)èüÿÿÿƒÄjèüÿÿÿƒÄ€=t €=Ë…æƒì¶¦Pj@èüÿÿÿXZ¶§PjAèüÿÿÿXZjjCèüÿÿÿƒÄ€=u €=t{ÆÆèüÿÿÿèüÿÿÿ <t>„ÀÆt€=t€=tÆ€=u ¸é‡þÿÿèüÿÿÿëïƒìhhèèüÿÿÿƒÄ ë¦ƒì hÞèüÿÿÿƒÈZY¶ÀPhÞèüÿÿÿƒÄé]ÿÿÿ ¦Ðèƒì¶ÀPj@èüÿÿÿYX §Ðè¶Àéÿÿÿèüÿÿÿƒì jCèüÿÿÿƒÄé†þÿÿƒì j èüÿÿÿÀèƒÄ<¢t:€=„`þÿÿƒìjh¤èüÿÿÿƒÄ€=„Aþÿÿ€=t›ëžvf=ˆÁu»f=†Lu°f=‚Áu¥f=„Lušƒì h¹èüÿÿÿƒàƒÄ„ÀuƒÆ€ @épÿÿÿ‰ö€=…´ýÿÿÆé¨ýÿÿf=峯…†ýÿÿëÔfƒ=H…Rýÿÿé]ýÿÿf=ˆ…4ýÿÿéIýÿÿfƒ=F…ýÿÿé6ýÿÿfƒ=9…úüÿÿé#ýÿÿvƒì jhçjéüÿÿvPjjj-èüÿÿÿƒÄ€=uƒì jjj#jj.éjüÿÿ‰öƒì jj j9ëêèüÿÿÿèüÿÿÿéuûÿÿèüÿÿÿèüÿÿÿƒì jèüÿÿÿƒÄ€=uƒì jjjhÀjèüÿÿÿƒÄ é7ûÿÿƒì jjhëá‰öƒì ‹D$f=Ä!t f=@!tƒÄ Ãì jèüÿÿÿƒÀ ZY·ÀPjèüÿÿÿƃÄëÕ‰öƒìhèüÿÿÿYZ%ÿPhèüÿÿÿXf¡%ÿûÿÿZ·ÀPh#èüÿÿÿÇ$ èüÿÿÿZY%ÿßPh èüÿÿÿƒÄÃWVSƒì h€èüÿÿÿ‰Ãf¡ƒÄf9Ãt1fûb–„1fû£’„&f9Ãtfûœ‘„²fû[•„§€=t fû™„Cf9Øt€=f‰„ <„…¶ƒøwÿ$…˜Iƒì hÜèüÿÿÿƒÄfHt‰ö[^1À_À=u €=St Æë߯ëÖ‰ö€=Ut Æëƒì h~ èüÿÿÿƒÄfƒøu¬ë߉ö€=tdfûÌZu˜ƒìh(Bh èüÿÿÿƒÄ j(hhÑèüÿÿÿƒÄ h‚hh5èüÿÿÿXZhÑÎh èüÿÿÿƃÄé;ÿÿÿfû[…0ÿÿÿƒìhøBh èüÿÿÿƒÄ j(hhÑèüÿÿÿƒÄ h‚hë–vƒì hÒèüÿÿÿƒÄfƒø…Þþÿÿéñþÿÿƒì h)èüÿÿÿƒÄfƒø…¿þÿÿƒì h èüÿÿÿ‰ÃÇ$ƒèüÿÿÿƒÄf…Àt1f¡ƒèã?üÿÿÁà Ãì·ÃPh èüÿÿÿÆé(ÿÿÿf¡ƒèƒãÃÁàëЉöfûJ˜t fûŸ”…Fþÿÿ€=„Ѓì hÒ èüÿÿÿ‰Æ·ØÇ$Ð èüÿÿÿ·À)ÉðfÁèƒÄûfƒøw Æéóýÿÿf¡%ÿóÿÿ ƒìf£·ÀPh!èüÿÿÿÇ$èüÿÿÿƒàÀZƒÈY·ÀPhèüÿÿÿ^_h h%èüÿÿÿƒÄ€=tƒìh_qh€èüÿÿÿƒÄétÿÿÿƒìhaqëäƒì hèüÿÿÿ‰Æ[‰ð_%ÿïPhèüÿÿÿƒÄéÿÿÿ€=u!fû—…*ýÿÿƒì h èüÿÿÿƒÄfƒøt Æéýÿÿƒì jèüÿÿÿ‰ÆYî[·ÆPjèüÿÿÿƒÄëЀ=…Ï „ÀuÆþÈ…¿üÿÿfû½…´üÿÿƒì hÆèüÿÿÿ% ƒÄf…À…üÿÿƒì h èüÿÿÿ‰ÃÇ$ èüÿÿÿ·ÀƒèƒÄƒøw ãÿÏÿÿ¿ ƒì·ÃPh èüÿÿÿÇ$ èüÿÿÿ‰Ãƒàf¡%f…Àu&f¡f£f¡f£èüÿÿÿ¸ƒÄ ÃèüÿÿÿëÓfƒ=u¸1Àëæ‰öÆë—vƒì jèüÿÿÿƒÄé?ÿÿÿ‰öƒìjh` èüÿÿÿƒÄéÿÿÿ¡£èüÿÿÿ¡€=+Æ£u€=*u 9uˆ‰öƒì j5èüÿÿÿf£ƒÄé¨þÿÿƒì fƒ=uƒÄ Ãvƒì hèüÿÿÿƒàƒÄf…À…„ƒì·PhšèüÿÿÿXZ·Ph›èüÿÿÿYX·PhœèüÿÿÿXZ·PhèüÿÿÿYX·PhžèüÿÿÿXZ· PhŸèüÿÿÿƒÄé\ÿÿÿvƒÄ éüÿÿÿƒì èüÿÿÿf¡f9tf=–„ f=V’„ƒì hŽf£èüÿÿÿƒàƒÄ1Òf…Àu ‰ÐƒÄ Ãvƒì j:èüÿÿÿƒàƒÄf…Àu1ÒëÞƒì j2èüÿÿÿ¢ƒàƒÄ„Àuãƒì hÆÆèüÿÿÿƒÄf…Àf£t:€=tCƒì h€èüÿÿÿƒÄf=èpu›ƒì hÏèüÿÿÿƒÄf=%ku…èüÿÿÿèüÿÿÿèüÿÿÿ¶ÐéPÿÿÿƒì h€èüÿÿÿƒÄf=êp…Tÿÿÿƒì hÏèüÿÿÿƒÄf=ikë·fƒ=9„ñþÿÿ€=k„äþÿÿ€=tHƒìhhèüÿÿÿƒÄ€=t ƒìhæh èüÿÿÿƒÄf¡éþÿÿƒìhØëÞƒìhh붃ì èüÿÿÿÆÆfÿ$èüÿÿÿQjjjèüÿÿÿƒÄÉöƒì Š„Ò‰‡fƒ=Æu ƒ=v @<¢wƒÄ Éöƒì jÆÆèüÿÿÿÇ2èüÿÿÿf£Ç$!èüÿÿÿ ZY%÷ÿPh!èüÿÿÿƒÄë¥v „Àt H¢ë‘v€=t…€=8„N¡…À„kÿÿÿ€=}…^ÿÿÿfƒ=„ž¡9ƒ?ÿÿÿƒì hèüÿÿÿƒÄf…À‰&ÿÿÿƒì hèüÿÿÿ‹ ƒé·ÀÓøƒÄƒà„ÿþÿÿŠƒâ@„Òt) @¢t f=ÿtfÑèˆFf9ûvØëΉöSƒìèüÿÿÿƒìhÿhØèüÿÿÿXZhÿh×èüÿÿÿÇ$ÞèüÿÿÿˆÃYƒËX¶ÃPhÞèüÿÿÿƒãßXZ¶ÃPhÞèüÿÿÿÇ$èüÿÿÿYX‰Ø%þPhÞèüÿÿÿÇ$èüÿÿÿƒÄ€=tèüÿÿÿSjh÷hÚèüÿÿÿƒÄ[Ãf‹ƒì¶ÃPhÅfÇ`fÇ`fÇaèüÿÿÿXZ¶ÇPhÆèüÿÿÿf‰f‰Cf‰ƒÄ놉öƒì €=7t8 6<t'<tƒì j èüÿÿÿÇ$èüÿÿÿƒÄÃì j ëãƒì j ëÛƒìjj èüÿÿÿëÝƒì €=tƒÄ Ãìjh°ÆèüÿÿÿƒÄëáWVSƒì j2èüÿÿÿ‹ f‹‰Ð% ƒÄf…À³€‰Î¿ uâ@f…Ò•À‰ÇÁç€û…wf;5t^ƒì¶P¶ÃPèüÿÿÿ¡CƒÄfƒ8x|H; ‰ r ‹ ‰ ‹f‹%@f…À‰Ñu €û…w;u¢ˆØ,€t$ ljúƒì¶ÂPh°ÆèüÿÿÿƒÄ[^_ÃìjÆh·ëàH; ‰ r ‹ ‰ ƒÏ€ë¡vUWVSƒìh°èüÿÿÿˆD$ƒÄƒà‰Æ„­N‰ò¡þ¿ÿÿÿ‰D$‰ÃtN‰ö‰úƒì ¶ÂPèüÿÿÿf¶À‹-f‰]GƒÄ;‰r ‹‰N‰ðþÀt ‹ëµöD$ àtAŠD$ ƒà „Àt ‹T$f @öD$ Àt&‹U‰Ð€d$ @ €ÿÿ€|$ f‰Et ʨÿÿf‰U‰öƒì h°èüÿÿÿƒÄ[^_]ÃvWV€=ÿS„ìƒì h×èüÿÿÿƒÄ„ÀˆÃ„²<ÿ„ª€=„…ƒìhÿh×èüÿÿÿˆØƒàƒÄ„ÀtN€=„< @€=¢„ó<†­€ ÆÆÆèüÿÿÿˆØƒà„À…$ƒã„Ûu8ƒì¶Ph×èüÿÿÿXZ¶P·Pèüÿÿÿ¸ƒÄ[^_Ãì h¶èüÿÿÿƒàƒÄ„Àt€=k„›èüÿÿÿƒì h¶èüÿÿÿƒàƒÄ„Àuxƒì h¶èüÿÿÿƒà ƒÄ„À„mÿÿÿ¿³ÿÿÿ‰úƒì ¶ÂP‹5‹èüÿÿÿˆ3¡@ƒÄ=ÿJ£~ ÇO‰ø<°u½ƒì h±èüÿÿÿƒÄéÿÿÿèüÿÿÿëfƒ=…Wÿÿÿ€=–…JÿÿÿèüÿÿÿéEÿÿÿƒìjhØèüÿÿÿÇ$2èüÿÿÿ¢Ç$3èüÿÿÿ¢Ç$4èüÿÿÿ¢Ç$5èüÿÿÿ¢ƒÄéþÿÿƒìhÿhØèüÿÿÿèüÿÿÿƒÄ€=…Mþÿÿƒìjh­èüÿÿÿƒÄé6þÿÿƒìj!h­èüÿÿÿƒÄ€= …éýÿÿ<‡éýÿÿéÜýÿÿƒìjhËèüÿÿÿÆÿƒÄé¦ýÿÿƒìhj<èüÿÿÿƒÄédýÿÿƒì¶P·Pèüÿÿÿ1Àéõýÿÿ1ÀéðýÿÿWVSƒì¶|$ ¶t$$Š\$(ÆèüÿÿÿƒìjhØf£èüÿÿÿX‰ðZ¶ð‰t$Vj6èüÿÿÿY‰ú^¶ÂPj7èüÿÿÿ ƒÄ8Øt/ƒì ·PèüÿÿÿƒÄf=Çwƒì j5èüÿÿÿ¢ëÊ ƒÄ[^¶À_ÃvSƒì€=„f‹QjBhßhËf£Bf‰f£ÆèüÿÿÿÇ$èüÿÿÿXZjhËèüÿÿÿÇ$èüÿÿÿƒÄ€=„˜€=…cfƒ=‚…)PjhÀjèüÿÿÿƒÄ<tƒÄ[Ãì j4èüÿÿÿƒàƒÄþÈt]¶ƒøtKƒø0ƒøuѰ³ ƒì¶ÀPhÌèüÿÿÿYX¶ÃPhÖèüÿÿÿƒÄ릃ø t ƒø uœ° ³ëɰ³ ëÃ1À³ë½PjjjèüÿÿÿƒÄ<…sÿÿÿPjj jèüÿÿÿƒÄ<…\ÿÿÿƒì j4èüÿÿÿÀèƒÄfƒ=‚¢th 8t0€=tƒìj hÌéhÿÿÿƒìj hÌèüÿÿÿY[jéKÿÿÿ€=t ƒìjëÎvƒìjhÌèüÿÿÿXZj é ÿÿÿƒìjjèüÿÿÿƒÄë‡vƒìj hÌèüÿÿÿY[j hÖèüÿÿÿXZjjééþÿÿƒÄ[éüÿÿÿvf‹f9t%fúì„Ùýÿÿfú¼„Îýÿÿƒâøf‰é¿ýÿÿf¡xf=°Ìtf=°ÍtºìfÇìéšýÿÿº¼fǼé‡ýÿÿvÃvƒìjhÖèüÿÿÿƒÄ j0hÿhÍèüÿÿÿƒÄ€=tƒÄ Ãìhÿj<èüÿÿÿXZjj>èüÿÿÿƒÄëÜÃvÃv‹D$f¶T$·À‰T$‰D$éüÿÿÿƒìf¡D$·ÀPèüÿÿÿ¶ÀƒÄÃv‹D$f·T$·À‰T$‰D$éüÿÿÿƒìf¡D$·ÀPèüÿÿÿ·ÀƒÄÃv‹D$f·À‰D$éüÿÿÿƒìf¡D$·ÀPèüÿÿÿƒÄÉöƒìj"j7èüÿÿÿYXjj0èüÿÿÿXZhÿj<èüÿÿÿYXjj>èüÿÿÿƒÄÃì·D$PèüÿÿÿƒÄÉö·D$‰D$éüÿÿÿ‰ö·D$¶T$‰T$‰D$éüÿÿÿƒì·D$Pèüÿÿÿ¶ÀƒÄÃvƒìjPjpèüÿÿÿÇ$qèüÿÿÿƒàƒÄ1ÒþÈt‰ÐƒÄ ÉöƒìjQjpèüÿÿÿÇ$qèüÿÿÿ‰ÂƒâƒÄƒú„ƒúŽïƒú„؃ú„ÁƒàÀè¶À1Òƒøw¤ÿ$…TJƃìjRjpèüÿÿÿÇ$qèüÿÿÿƒàƒÄƒøtHƒø~4ƒøt$ƒøt ¢ºéPÿÿÿfÇëáfÇëÖ…ÀuÒfÇëÇfÇë¼ÆëÆéuÿÿÿÆ éiÿÿÿÆ é]ÿÿÿfÇèé1ÿÿÿfÇèé#ÿÿÿ…Ò…ÿÿÿfÇøé ÿÿÿfÇøéÿþÿÿÃvƒì €=„Ä ~ƒà„ÀuhèüÿÿÿXZhäõhŽèüÿÿÿYXhñþhèüÿÿÿƒÄ€=[wSƒìj hèüÿÿÿYXhëZh‘èüÿÿÿƒÄ€=áuƒÄ Ãvƒì jèüÿÿÿXZhsMh’èüÿÿÿƒÄëÙƒìj뫃ìhàh‰èüÿÿÿXZj hŠétÿÿÿƒìh»èüÿÿÿƒàf…À•À¶ÀƒÄÃvƒì €=tPƒì jèüÿÿÿXZjh¸èüÿÿÿYXjhºèüÿÿÿXZjhÛèüÿÿÿ¶æPjjjèüÿÿÿƒÄ ƒÄ Éöƒìjh¸èüÿÿÿXZjhºèüÿÿÿYXjhÛèüÿÿÿƒÄëʃìjjj'èüÿÿÿÇ$èüÿÿÿƒÄ€=7t" 6<„ë<„Ùƒì j èüÿÿÿƒÄƒì jjjjj1èüÿÿÿƒÄhýjèüÿÿÿƒÄ hKjhèüÿÿÿÇ$±ÇÇÇÇÀèüÿÿÿÇ$±èüÿÿÿXZhÎh¶èüÿÿÿYXhûhׯûèüÿÿÿƒÄƒ=tÆƒÄ Ãvƒìjh=èüÿÿÿƒÄëÞƒì j é"ÿÿÿƒì j éÿÿÿƒìhîh¶èüÿÿÿƒÄ hKjhÆèüÿÿÿÇÇǃÄÃìh»hèüÿÿÿƒÄéüÿÿÿ‰öƒìh<h9èüÿÿÿYXh;h:èüÿÿÿƒÄÃƒì ‹D$ƒè9ƒø wAÿ$…Ø`Š1ÀþÊtƒì h èüÿÿÿƒÄ„Àt ¸ƒÄ Ãì h èüÿÿÿƒÄ1Àëèƒì h èüÿÿÿƒÄ„ÀtÎëÖƒì hèüÿÿÿ¶ÀƒÄë½ uƒà¶Àë°€=tL€=tƒì h@èüÿÿÿƒÄ„Àu„ƒì h@댃ì h@èüÿÿÿƒÄ„À…bÿÿÿƒì h@égÿÿÿèüÿÿÿëŸƒì ‹D$ƒøDw$ÿ$…aèüÿÿÿèüÿÿÿ€=t ƒÄ éüÿÿÿ‰öƒÄ ÃƒÄ éüÿÿÿ <t)„ÀuRjjjèüÿÿÿvƒÄëÓƒìj8jèüÿÿÿƒÄëÛPh£hÚjèüÿÿÿƒÄ jhÿjèüÿÿÿYXj!h­èüÿÿÿèüÿÿÿÇ$dèüÿÿÿƒÄ ë‹PjjjèüÿÿÿƒÄ€=…ZÿÿÿPjhïjèüÿÿÿénÿÿÿPjjj'èüÿÿÿƒÄ€=u&ƒì jèüÿÿÿÇ$jjjj1èüÿÿÿƒÄ éÿÿÿèüÿÿÿëÓ€=uPjjj'èüÿÿÿ¸ƒÄé¶þÿÿPjjj'èüÿÿÿƒÄéüÿÿÿv€=u"€=tƒìj@j èüÿÿÿéÌþÿÿƒìj`ëíƒìhëã€=u€=täƒìjpëʃìhëÀ€=u ƒìh0ë­ƒìh룃ìh뙊ˆÐƒà@„ÀuO„Òx)€=tƒìjhvèüÿÿÿé>þÿÿƒìjj@ëí æƒÈ¶ÀP¶åPjjèüÿÿÿéþÿÿ æƒÈ ¶ÀP¶åPjëÜöÀu€=tƒìjë’ƒìjë¢ƒÄ éüÿÿÿ€=¾„žýÿÿ <„‘ýÿÿ€=„„ýÿÿ€=u„Àt ƒìjjéKÿÿÿƒìjh€é<ÿÿÿƒìjhé-ÿÿÿ€=¾„@ýÿÿ <„3ýÿÿ€=„&ýÿÿ€=u„Àtƒìjë ƒìj륃ìjë­ƒìjhÿÿèüÿÿÿƒÄ€=…åüÿÿƒìjhé¶þÿÿƒìjhÿÿèüÿÿÿƒÄ€=…·üÿÿƒìjëР<„„À…ë€=„уìhŸhÚèüÿÿÿƒÄ jhóhËèüÿÿÿ ƒÄ<tz„Àufƒ=‚u €=t ƒì jèüÿÿÿƒÄƒìjhÿÿèüÿÿÿƒÄ€=t'f=‚yt €=…üÿÿƒìjh@éÖýÿÿƒìjh€èüÿÿÿƒÄëŃì jjhŸhÀjèüÿÿÿƒÄ  éaÿÿÿƒìh—é*ÿÿÿƒìh•éÿÿÿf=‚yë þÈ„$ƒìjhÿÿèüÿÿÿƒÄ€=„îf=‚y„È€=„» <„Cûÿÿ„Àufƒ=‚u €=t!PjhóhËèüÿÿÿÇ$èüÿÿÿƒÄQjj?hÏèüÿÿÿXZh‘hÚèüÿÿÿƒÄ jhÿhËèüÿÿÿÇ$hêjhÑjèüÿÿÿƒÄ €=…­úÿÿƒì jj`hÿhÀjé€ûÿÿƒìjh@èüÿÿÿƒÄé.ÿÿÿƒìjh€èüÿÿÿƒÄéûþÿÿf=‚y…ßþÿÿƒìjh@éÈþÿÿ€=t ƒìjjéüÿÿƒìjh€éüÿÿ€=tƒìjëÚƒìjë߀=tƒìjhéÕûÿÿƒìh)#h‘é5ûÿÿ€=tƒìjëÔƒìhëZë܃ìjhéšûÿÿƒìjëïƒìjhé„ûÿÿƒìjëïƒìjhénûÿÿƒìjëïƒìjhéXûÿÿƒìjëï€=„dùÿÿƒì h¹èüÿÿÿYZ%ðPh¹èüÿÿÿXZj h¸èüÿÿÿÇ$¹èüÿÿÿZY%ðPh¹èüÿÿÿé<ùÿÿ€=„ùÿÿƒìjh¸ëÝQjjj'èüÿÿÿƒÄf=‚y…ÝøÿÿƒìjéÓüÿÿ€=tƒÄ éüÿÿÿƒÄ éüÿÿÿ€=t+ ~ƒà„À„¡øÿÿ æƒàþ¶ÀP¶åPj éúÿÿ u<tÜ<@tØ‹l$‹T;ƒ~@;ƒúF‹T$ ƒþ‰Š~Ýÿ$ƒï€ƒ<$~ÌX[^_]ûë¶UWVSƒì‹l$DÇD$ÇD$ÇD$Ç$‰ö‹T$‹L$<‹‘H‹t$‹T$H‹|$‰²Áç1ö1ۉ‰ЈÙÓø…Àt‰ÞCƒû~îF‹T$H‹t$‰D²ƒÆ‰t$ 1Û‰ö;C‹L$@ƒûÇÇD…~ä1Û‹t$‹D$<;°‹$Ø‹T$8‹4‚‰òÁú‰ñƒáƒâ¸Óà:‹L$@ ‘‹T$ò‹L$ ‹t$0‹–Ù‹t$H‰Žƒ|$(‹D$4‹4tj‹T$(…Òuƒ|$,tR‰òÁúƒæƒâ‰ñ¸Óà: D•C‹t$‹D$<;°ŒrÿÿÿÿD$ƒl$€ƒD$dƒ$bƒ|$ŽÕþÿÿƒÄ[^_]Ë4µë¥‹L$,…ÉuŽ‹4µë”v‹L$¸wºw‰öƒ¼‘ c~Jƒúð@ÉÐëú‰öUWVSƒì8ƒ|$\ÿtV‹D$XÁà‰D$ ÇD$4ÇD$ÇD$ ‹D$4‹T$Tƒ<‚ÇD$(ÇD$$ÿÿÿÿtÿD$4ƒl$€ƒD$ dƒ|$4~̓Ä8[^_]Ët$ ‹l$d‹DµD‰Dµ‹D$4‹L$Áà‰L$ÿDµÇD$0‰D$‹T$‹L$$‹t$$T$0L$t$ ÇD$,‰T$‰ $‰t$‰ö‹l$‹T$`‹ªŠL$,Óøÿ$ÿD$ÿD$$ƒà„¡‹L$$‹4$…É‹<µ~>‹l$ ‹T$Ll$(‹D$‚‰l$µv9:uI‹‹t$‹l$dƒëƒê…ɉDµã‹L$$ÿD$(ƒùw@‹D$ ‹T$D$(‹t$L‹,$–‰D$­9:uA‹‹t$‹l$dƒÃƒÂƒùw‰Dµ~âÿD$(ÿD$,ƒ|$,Ž+ÿÿÿÿD$0ƒ|$0ŽïþÿÿéšþÿÿvUWVSƒì ÇD$ÿÿÿÿ1öv‹D$(‹°…Ûu‹T$0‰2Fƒþ~é1ö1í‹\$,ƒ<³tsFƒí€ƒþ~í‹\$‹D$ 1í¼˜8C¾tE‹ƒì +GPèüÿÿÿ‰Ã‹+Gü‰$èüÿÿÿƒÄ9ÃxƒÇƒîyÔ1ÀƒýÀ‹T$4‰ƒÄ [^_]ÃEëß‹D$4Çÿÿÿÿëé‹T$0‹‹\$$Áà Œ«@”@1ÿ»‹9t2ƒÁƒÂKyñƒÿ~‹D$,‹T$(ǰDzé;ÿÿÿ‰l$é2ÿÿÿGëËUWVSƒìÇD$Ç$‹D$‹T$ ƒ<‚tÿD$ƒ,$€ƒ|$~ãƒÄ[^_]Ã1À‹<$1ö½>‹L$‹™;T…~¹v@;úF‹T$$ƒþO‰š~Õ¾P½>‹L$‹™;T…~ ¹‰ö@;úF‹T$$ƒþw‰š~ÖéxÿÿÿUWVSì̺ü¼$ ¾b‰Ñó¥‰L$81À¼$€‰Ñó«¼$`‰Ñó«¾,b¼$@¹ó¥¼$ ¾@b‰Ñó¥¼$¾Xb‰Ñó¥¸ ¼$à¾pb‰Ñó¥¼$°¾ˆb‰Áó¥¼$€¾¸b‰Áó¥1ÿ¾G™÷þ‡§ƒì ·ÀP‰ÓGèüÿÿÿ·À‹Œ$ôƒÄƒÿ‰D™D~ÏÇD$ 1ÿ‹œ$äƒ|»D„ÖGƒÿ~èƒ|$ ~ÇÄÌ[^_]Ãì hèüÿÿÿÇD$TƒÄ1ÿ1í‹´$à‹†@…À~¾‹„$äƒ|¸D„åPhh€ÿ5èüÿÿÿj\üdSÿ¶@hèüÿÿÿ·ÀƒÄ …À£…vÿÿÿÇD$H‹T$H‰è„” ‹Œ$à‹£PhhSÇèüÿÿÿjhÿ5hèüÿÿÿ·ÀƒÄ …À£… ÿÿÿ‹‹D$H+”„ˆ­‹L$H‹„ŒàÁà9ÂÿD$DÿD$Hƒ|$HŽcÿÿÿGƒí€ÆƒÿŽìþÿÿ‹œ$äǃŒ ™1Ò<„9<„1…Ò„ƒ|$D~‹¬$äÇ…Œƒ|$D…Òtƒ|$D*…Ò„"‹”$ä1ÿÇ‚Œÿ€}ǽǽGëß1ÿ¸Ç¸Gƒÿ@|óÇD$HÇD$‹D$H‹”$äƒ|‚D„ü1ÿ‹\$‹ ‹¬$à‹´……öŽ»ýÿÿ‰È™÷þ‰½Gƒÿ|ÕÇD$L‰ö¡‹T$L¯•‰ÁÁù £‰Å‰È-*=Ök‰L$$‡yÇD$<¿‹D$HÁà‹”$à‹\$$ø¯œ‚jj@ÁûhSèüÿÿÿ‹½‰Ó¯…ƒÄ…À‰\$Dt ¯…üÿÿÿ‰T$D‹D$D¯Ç‰Æ)îˆÅ ‰ø¯Ã‰Á)鈮 9ñ}‰Î‰\$Dƒÿ»'1~1ÛƒÿžÃKã¶óýÿÃÝ$¯ß9Þm ‹L$D‰ ½G̓ÿŒ?ÿÿÿ‹D$<…À„Ÿ‰è»™÷û‰Á‹D$HÁàD$L‰ …ÇD$D1ÿº‰ö‹º9ÁŒ ‰Í)ʼnèGD$Dƒÿ|å‹D$D™»÷û‰D$D‹D$HÁàD$L‹|$Dùffæ‰<…¦ ÿ®GŽŠ Ç…Ç…ÿD$Lƒ|$L@ŒEþÿÿÿD$Hƒl$€ƒ|$HŽÚýÿÿ»1íÇD$ÇD$<ÇD$,€ÇD$(dÇD$L+\$ ºÿÿÿÿ1ÿ‹D$Lƒ<…ý GƒÀ@ƒÿ~é…Òˆ•‹L$L9Œ„<•33³~w1ö1ÉÇD$H‹D$L‹|$H‹”$äƒ|ºDt‹……Òt Ö …ÿD$HƒÀ@ƒ|$H~Ì‹D$L‹<…‰ð™÷ÿ‰Æ‰È™÷ÿ;D$(}‰õ‰D$‰t$,‰D$(ÇD$<ÿD$Lƒ|$L@Œ2ÿÿÿ|$(ü©~ÇD$<1íÇD$,ÇD$(‹D$<…ÀÇD$ÇD$„÷ •š™ÿú433‰T$‡õ»ÇD$,€ÇD$(dÇD$L+\$ ºÿÿÿÿ1ÿ‹D$Lƒ<…  GƒÀ@ƒÿ~é…Òˆ›‹|$L9½ŒŠ‹•-43s=ÿÿ?ww1ö1ÉÇD$H‰ø‹T$H‹¼$äƒ|—Dt‹……Òt Ö …ÿD$HƒÀ@ƒ|$H~Ì‹D$L‹<…‰ð™÷ÿ‰Æ‰È™÷ÿ;D$(}‰t$‰D$‰t$,‰D$(ÇD$<ÿD$Lƒ|$L@Œ,ÿÿÿ|$333v‹D$-33s=™™‡Ž‹”$䃺Œ„sƒì ÿ´$ìèüÿÿÿ‰ÆƒÄ…ö„7‹D$…À„‹L$‹\$‰L$,‰\$(‹l$<…í…ý½ÇD$dÇD$L+l$ ºÿÿÿÿ1ÿ‹D$Lƒ<…½GƒÀ@ƒÿ~é…Òˆ’‹|$L¸9,¸Œ€<•33ss1ö1ÉÇD$H‰ø‹T$H‹œ$äƒ|“Dt‹……Òt Ö …ÿD$HƒÀ@ƒ|$H~Ì‹D$L‹<…‰ð™÷ÿ‰Ã‰È™÷ÿ;D$}‰D$‰\$,‰D$(ÇD$<ÿD$Lƒ|$L@Œ5ÿÿÿ‹|$<…ÿu‹‰T$,Æ‹Œ$ä‹™€…Ût(‹5¹ÓMb‰ð÷é‰ðÁúÁø)¯ډ\$,ÇD$(‹T$,¿Áú ‹Œ$à‰Ð¯¹Áø‰¹Gÿÿ~ä¿L½È‹„$àÇD$L‰î¸‹T$L‹Œ$äƒ|‘Dt"jj@hÿ3èüÿÿÿ‰Â‰ðD$\‰…àøÿÿƒÄÿD$LÃ|$L~»GƒÅƒÿS~žº1ÿ‹œ$äƒ|»Dt‹´¼ …öˆbGƒÿ~Ý1ÿ‹œ$äƒ|»Dt;‹„¼ ƒø„0ƒø„ƒø„ƒø„ñƒø „Üÿ„$tGƒÿ~±ºÿÿÿÿÇD$4ÿÿÿÿ1ÿ‹„¼`9Ð~‰|$4‰ÂGƒÿ~éºÿÿÿÿÇD$0ÿÿÿÿ1ÿ;|$4t‹„¼`…À~ 9Ð~‰|$0‰ÂGƒÿ~ߺÿÿÿÿ¾ÿÿÿÿ1ÿ;|$4t;|$0t‹„¼`…À~9Ð~‰þ‰ÂGƒÿ~Û‹T$4‹L$01ÿƒÂƒÁ^‹¬$äƒ|½Dt‹„¼ 9Є9È„ð9Ø„ØGƒÿ~Í¿N‹„$àÇD$L¸‹T$L‹Œ$äƒ|‘Dt/jj8hÿ3èüÿÿÿ@ÿº‰Õ™÷ýƒÄ…Òu ‹D$Lÿ„„€ÿD$LÃ|$L~®GƒÿQ~–1ÿƒ¼¼€C‹”$äƒ|ºD„!Gƒÿ~ÚÇD$4ÇD$01ÿ‹Œ$äƒ|¹Dt‹„¼ …À…ÜÿD$4Gƒÿ~Ù¿‹¬$àÇD$D1ÛÇD$@1öÇD$LT½‹L$L‹„Œ …À……‹*l$DÿD$Lƒ|$L~Öƒ|$4~<‹D$D™÷|$4‰ÅÇD$L‰þ‰ö‹T$L‹„” …À„ÿD$Lƒî€ƒ|$L~ß‹t$4ƒ|$0~8‰Ø™÷|$0‰ÅÇD$L‰û‹T$Lƒ¼” „¥ÿD$Lƒë€ƒ|$L~àt$0ƒþŽs‹L$@‹”$䯊‰È™÷þ‹”$ä‰D$@‹Œ$è‹‚ŒA …Àt‹D$@ÁèD$@Ñ|$@¸ÓMb÷l$@‰Ñ‹D$@™Áù)Ñ‹”$à‰Œº Gƒÿw޲þÿÿ‹T$,Áú „Ëóÿÿ¡‰Ó™‹¼$è÷û‰‡L 1ÿ‹„¼ …À‹¬$ä‰D½(•À¶ÀH% þÿÿ܉D½dGƒÿ~ÑÁ|$( ‹D$(‰…„‹D$,Áø …À‰…€•À¶ÀHƒÈ ‰E$‹”$à‹‚ ‰‚ 1ÿ¹‹œ$àÇD$D‹ÇD$L‹(l$DƒÀÿL$Lyñ‹D$D…Àx0‰Â‹œ$àÁú‹ÇD$L‰ƒÀÿL$LyõGƒÁƒÿ~¤éçòÿÿƒÀëË‹Œ$àÇ„¹ éÞþÿÿƒì ‹Œ$ì‹™)èPèüÿÿÿD$P‹„$ð‰,˜ƒÄé0þÿÿƒì ‹Œ$싱)èPèüÿÿÿD$P‹„$ð‰,°ƒÄéÆýÿÿvH…zýÿÿésýÿÿH…!ýÿÿÿD$0éýÿÿÇ„¼ éÏüÿÿÇ„¼ éÅüÿÿÇ„¼ éüÿÿÇ„¼ éüÿÿÇ„¼ éøûÿÿÿ„$péûÿÿÿ„$léûÿÿÿ„$héûÿÿÿ„$déûúÿÿÿ„$`éïúÿÿBƒÿ‰”¼ ‰|$L‰úÿÿ4½‹l$L‹„$äƒ|¨Dt ‹œ¬ …ÛxÿD$Lƒ|$L~ØéUúÿÿÇD$DÇD$H­Ž‹9u&ÿD$HƒÃƒÁƒ|$H~é‹L$D…Ét´‹L$L‰”Œ ë§ÇD$Dëá‰ö‰ÂéEøÿÿ‹=Ñÿ‰|$,ÇD$(éå÷ÿÿ…ít‰l$,‹l$‰l$(éÐ÷ÿÿ¡‰D$,ëÓ1öéš÷ÿÿ…íu‹D$…À~‹T$‹L$‰T$,‰L$(é÷ÿÿ…펕÷ÿÿ‰l$,‹\$é„÷ÿÿv‰Âéböÿÿš™ÿ‰L$éöÿÿ‰ö‰Âéõÿÿ‹l$Lÿ­é}ôÿÿ|$D-Xôÿÿ‹D$Lÿ…é_ôÿÿv)ÈéöóÿÿÇD$<éóÿÿ÷ÙéKóÿÿ÷Þé4óÿÿ‹Œ$äÇŒ1ÿ‹œ$äÇ„¼ ÇD»(ÇD»dÜGƒÿ~ØÇD$LP¾‹l$L‹®‹”$àX€1ÿƒè€ ª‹9Ú| 9Â}ÿ„¼ GÁƒÿ~ãÿD$Lƒ|$LY~¿ÇD$@1ÿƒ¼¼  ~‹Œ$äÇD¹(ÇD¹dèÿD$@Gƒÿ~Õ¿‹¬$àÇD$D1ÛÇD$LD½‹T$L‹Œ$ä‹T‘(…Ò„­ÿD$Lƒ|$L~׋D$@…ÀÇD$Lt ‹D$D™÷|$@‰D$Dƒ|$@t‰Ø‹T$@)T$L™÷|$L‰Ã1íÇD$L‰þ‰ö‹T$L‹Œ$ä‹D‘(…À„ƒì ‹”$싲)ØPèüÿÿÿÅ‹Œ$ð‰±ƒÄÿD$Lƒî€ƒ|$L~·‹”$䋊¯Í¸ñv÷é‰ÕÁùÁý)͉èÁè(Ñø‹Œ$à‰„¹ GƒÿwŽêþÿÿ‹ ‰ 1ÿ¹‹œ$àÇD$D‹ÇD$Lv‹(l$DƒÀÿL$Lyñ‹D$D…ÀxS‰Â‹œ$àÁú‹ÇD$L‰ö‰ƒÀÿL$LyõGƒÁƒÿ~Ÿ¡‹¼$䉇€‹¬$èÑø‰…L éÃíÿÿƒÀë¨ƒì ‹”$싲+D$PPèüÿÿÿÅ‹Œ$ð‹D$T‰±éàþÿÿ‹(l$DéJþÿÿƒ|$DŽ ïÿÿ‹„$äÇ€Œéïîÿÿ‹¼$è‹O …É…½îÿÿºé³îÿÿ÷ÚéLîÿÿÿD$ é!íÿÿvUWVSƒì|ü|$P¾èb¹ó¥|$0¾c¹ó¥ÇD$(PÇD$,`ÇD$‹D$ÇD$‹\„(ÇD$‹¬$ÇD$ ‹•8…ÒŽ6Phh'ÿ5èüÿÿÿjT$4Rÿµ8hèüÿÿÿ·ÀƒÄ 1Ò…À£…ωމò)Ú‰ÐÁè<‹D$ ‹Œ$ð‹£PhhD$,PÇèüÿÿÿjhÿ5hèüÿÿÿ·ÀÑÿƒÄ …À£…‚‹D$…À‹ue‹D¼P-ª9Â~ÿD$ƒÆC 9ÆŒgÿÿÿÿD$Ńl$ €ƒ|$Žûþÿÿƒ|$ÿD$ƒ|$޾þÿÿ1À‰ÂƒÄ|[^_‰Ð]øëí‹D¼0J9Â}Ÿë™1ÒëÛÇëðUWVS‹l$‹|$‹D$;l‡ü‹T$ ~ ‰Æ[‰ð^_]Ã1ö9Ö‰Á}ð‰Ó‰ö‰ÊÑùƒâ1Â;,‡~‰ÖKuêëÔ‹T$…Ò‰ÐxÉÐ÷Øëø‰öS€=‹L$„" –ƒà„À„‹…Û„í‹‘8 1À…Ò”ÀÅH‰A ƒú„Áƒú„¬ƒú„—ÇA$‹L …Û‰A(ÇA,@ÇA0uDÇA42ÇA8TÇ 71Ò‰ö‹„‘ü9D‘hèüÿÿÿY[hahèüÿÿÿXZhfhèüÿÿÿƒÄé÷þÿÿƒìjhð'èüÿÿÿY[jhèüÿÿÿXZj>hèüÿÿÿ^XhahèüÿÿÿY[hfhèüÿÿÿXZhLhë˜VSƒìh!èüÿÿÿ÷ЃàƒÄƒ=Œ¢t¡€€€€ÁàxeÁèf=uÆ0w7Æ01Û1Ò¾1ɉö‹(…Àt‰ðÓà ÃBAfƒúvç‰,X[^Ãf=èw Æ0ëÁf=Gw»Æ0ë²ÿ?ë”Æ0ë¢vƒìh3èüÿÿÿ·ÀƒÀ£·ƒÀ!ƒÄ€=md£t ƒÄ éüÿÿÿÇëëSƒìŠ\$jhòfÇèüÿÿÿXZhæ6hóèüÿÿÿƒÄ€=…Š€=u €=ulƒìhå7hôèüÿÿÿYXhäh èüÿÿÿXZjj èüÿÿÿYX¶ÃPj4èüÿÿÿƒÄ jhÐjèüÿÿÿXZhûhׯûèüÿÿÿƒÄ[Ãvƒìh 9ë’‰öƒìhå$놉öƒìj:èüÿÿÿƒàƒÄ1Òf…À„¯€=u €=…Ÿƒìj høèüÿÿÿf¡f£¡@ ‰ÂÁêÐÑøƒÄfƒøf£w fÇ ƒì·Ph¹ èüÿÿÿXZjhWèüÿÿÿYXjhD!èüÿÿÿÇ$°ÆèüÿÿÿÇ$°èüÿÿÿºƒÄ‰ÐƒÄ Ãìj é\ÿÿÿ‰öƒì èüÿÿÿƒì j èüÿÿÿYXhÔÎh èüÿÿÿƒÄ hÀhÎjèüÿÿÿƒÄÃƒì €=„¸èüÿÿÿƒìhÿh#fÇèüÿÿÿƒÄ€=%tpƒìjhðèüÿÿÿÇ$ èüÿÿÿƒÄ€=t=ƒìh(Bh èüÿÿÿƒÄ hÀhÎjèüÿÿÿXZjj èüÿÿÿfÿ$ƒÄÃìhøBëÁ‰öƒìhÿŸh èüÿÿÿƒÄévÿÿÿ‰öƒìjh°èüÿÿÿƒÄé1ÿÿÿƒì €=~fÇ„ƒèüÿÿÿƒì h°èüÿÿÿ ƒÄ<ÆtR<tBÇèüÿÿÿf£èüÿÿÿƒì h°f£èüÿÿÿÆÆƒÄÃvÇ ë²Ç2ë¦èüÿÿÿéxÿÿÿ‰öƒì èüÿÿÿèüÿÿÿƒì hf£èüÿÿÿèüÿÿÿƒÄ€=7Æt ¸ƒÄ Ãvèüÿÿÿëíƒì èüÿÿÿèüÿÿÿèüÿÿÿf£èüÿÿÿf£fÿ$ÆèüÿÿÿǸƒÄ Ãvƒì èüÿÿÿQjhÐjf£èüÿÿÿÇfÿ$ƒÄÉöƒì ‹1ÀƒúŠL$vƒút#„Éu ¸ƒÄ Éöjjjj%èüÿÿÿƒÄëã‰ö¶Áƒø„܃ø~'ƒøuË <Æt f¶ÀHf£èüÿÿÿë©…Àu¥f¡fƒøÆ‡€fƒøwgfƒø wNfƒøw5fƒøvèüÿÿÿfÇécÿÿÿƒìh$h%èüÿÿÿèüÿÿÿé_ÿÿÿèüÿÿÿfÇé4ÿÿÿèüÿÿÿfÇ é!ÿÿÿèüÿÿÿfÇéÿÿÿèüÿÿÿfÇéûþÿÿ‰ö€=Æt èüÿÿÿéßþÿÿèüÿÿÿéÕþÿÿƒì €=8„€€=tw€=tnfƒ=9tdƒì hÆèüÿÿÿèüÿÿÿf£ÇèüÿÿÿèüÿÿÿƒÄ€=tƒì jèüÿÿÿƒÄèüÿÿÿ¸‰öƒÄ Ãì jëá1Àëðƒì ¡…ÀÆkÆuÇƒÄ ÃÇèüÿÿÿëávƒì  <„°f¶ÀH€=f£u €=…ƒƒìjhøèüÿÿÿXZjhðèüÿÿÿƒÄ€=™tRƒì jèüÿÿÿYXhh#èüÿÿÿXZ·8 Phü'èüÿÿÿYXjh÷èüÿÿÿXZhÿÿhïèüÿÿÿƒÄÃì j묃ìjéxÿÿÿ‰ö€=fÇu €=u ƒìjéQÿÿÿƒìjéGÿÿÿVSP‹ƒú¸t1ƒú@¸t'ƒú,¸tƒì h€èüÿÿÿƒÄ€=‰Ãt1ÀY[^Ãì hÏèüÿÿÿ‰Æf¡ƒÄf9Ãtfûœ‘t=fû[•t6f9Øt&f£èüÿÿÿf£f‰f‰5¸ë¦f95uÑëîPh@hz hk èüÿÿÿƒÄ hVh• h èüÿÿÿƒÄf¡ë“ƒìhD!èüÿÿÿƒÄfHt`ƒì hWèüÿÿÿƒÄfHt1ÀƒÄ ÉöƒìjhWèüÿÿÿÇ$èüÿÿÿèüÿÿÿèüÿÿÿf£èüÿÿÿǸƒÄ붃ìjhD!èüÿÿÿÇëÛƒìjLèüÿÿÿf‹ ƒÄf9ȉÂf£v3¡…Àt  <vƒì jÆèüÿÿÿƒÄƒÄ Ã@¢ëó „ÀtHëí·9sØ€=uÏfÁéf9Ês8f¡@f=Èf£v³f¡@f£ÆfÇƒÄ éüÿÿÿfÇ냃ìhšèüÿÿÿf£Ç$›èüÿÿÿf£Ç$œèüÿÿÿf£Ç$èüÿÿÿf£Ç$žèüÿÿÿf£Ç$Ÿèüÿÿÿf£ ƒÄÃvƒìjhzèüÿÿÿXZjh{èüÿÿÿYXjh|èüÿÿÿXZjh}èüÿÿÿYXjh~èüÿÿÿXZjhèüÿÿÿƒÄÃvƒì·PhzèüÿÿÿYX·Ph{èüÿÿÿXZ·Ph|èüÿÿÿYX·Ph}èüÿÿÿXZ·Ph~èüÿÿÿYX· PhèüÿÿÿƒÄÃvSƒìèüÿÿÿ„Àtk¡ƒø"w|ÿ$…l܃ì hñèüÿÿÿ‰ÃÇ$(èüÿÿÿƒãƒÄf…À„„fƒût~fKtFƒì ÿ5èüÿÿÿ¶’·ÀÑâƒÄ9Ð|‰öÇ!Ç Æ(ƒÄ[ÃèüÿÿÿèüÿÿÿÇ"ÆkÆÆÆ눉ö€=t`ƒìh(Bh èüÿÿÿXZjj èüÿÿÿèüÿÿÿÇ Çèüÿÿÿf£èüÿÿÿf£Ç$°èüÿÿÿƒÄéÿÿÿƒìhøB란=„ ƒì hð'èüÿÿÿƒàƒÄf…Àtƒì hñèüÿÿÿƒÄfHt1ƒì ·PèüÿÿÿƒÄf=ˆ‚þþÿÿèüÿÿÿÇéêþÿÿ€=tmƒìh€hèüÿÿÿXZj?hèüÿÿÿY[j|hèüÿÿÿXZjhèüÿÿÿÇ$ð'èüÿÿÿƒÈZY·ÀPhð'èüÿÿÿǃÄétþÿÿƒìh€hèüÿÿÿY[j?hèüÿÿÿXZj|hèüÿÿÿ[Xjhë‘€=…çþÿÿƒì h€èüÿÿÿƒÄf=„Ð…Íþÿÿƒìjh°èüÿÿÿƃÄé¯þÿÿvƒì hð'èüÿÿÿƒàƒÄf…Àtz€=tQƒìhÉhèüÿÿÿY[h8hèüÿÿÿÇ$ð'èüÿÿÿƒÈY[·ÀPhð'èüÿÿÿÇ éÿÿÿƒìhÉhèüÿÿÿXZh8hë­f=Ð…7þÿÿƒì ·PèüÿÿÿƒÄf=ç†þÿÿèüÿÿÿÇéþÿÿ‰öƒì hð'èüÿÿÿƒàƒÄf…À„èýÿÿ€=t/ƒìhYhèüÿÿÿƒÄèüÿÿÿf£Ç é°ýÿÿƒìhYhëσì hÃ'èüÿÿÿƒÄf=xV…‡ýÿÿƒìjhÃ'èüÿÿÿèüÿÿÿèüÿÿÿÇ$ð'èüÿÿÿƒÈ [Z·ÀPhð'èüÿÿÿèüÿÿÿf£Ç ƒÄé2ýÿÿƒì hð'èüÿÿÿƒà@ƒÄf…À„ãèüÿÿÿˆÃèüÿÿÿèüÿÿÿƒì h°èüÿÿÿÇ$°èüÿÿÿƒÄ€=„—ƒìhhèüÿÿÿƒÄèüÿÿÿƒì hð'èüÿÿÿ €ZY·ÀPhð'èüÿÿÿèüÿÿÿƒÄ„Ûf£„¬üÿÿƒì hèüÿÿÿƒÄf=P‡’üÿÿ¡…À……üÿÿÇèüÿÿÿf£ƒÄ[éüÿÿÿƒìhhédÿÿÿƒì ·PèüÿÿÿƒÄf=ˆƒ8üÿÿé,ûÿÿƒì hð'èüÿÿÿƒàƒÄf…Àtz€=tQƒìhÉhèüÿÿÿXZh8hèüÿÿÿÇ$ð'èüÿÿÿƒÈ[Z·ÀPhð'èüÿÿÿÇé>üÿÿƒìhÉhèüÿÿÿY[h8hë­ƒì ·PèüÿÿÿƒÄf=ˆ‚}úÿÿèüÿÿÿ€=uƃÄ[éüÿÿÿƒì hð'èüÿÿÿƒàƒÄf…Àt­€=t/ƒìhYhèüÿÿÿƒÄèüÿÿÿf£ÇéúÿÿƒìhYhëσì hÃ'èüÿÿÿƒÄf=xVt0ƒì ·PèüÿÿÿƒÄf=ˆƒPÿÿÿ‹…Û…BÿÿÿéºùÿÿƒìjhÃ'èüÿÿÿèüÿÿÿèüÿÿÿÇ$ð'èüÿÿÿƒÈ ZY·ÀPhð'èüÿÿÿèüÿÿÿf£ÇƒÄé{ÿÿÿƒì hð'èüÿÿÿƒà@ƒÄf…À„ÃèüÿÿÿˆÃèüÿÿÿèüÿÿÿƒì h°èüÿÿÿÇ$°èüÿÿÿƒÄ€=t~ƒìhhèüÿÿÿƒÄèüÿÿÿƒì hð'èüÿÿÿ €ZY·ÀPhð'èüÿÿÿƒÄ„Û„Tþÿÿƒì hèüÿÿÿƒÄf=P‡:þÿÿ‹…Û…,þÿÿÇé,ýÿÿƒìhh뀃ì ·PèüÿÿÿƒÄf=ˆƒñýÿÿédøÿÿèüÿÿÿèüÿÿÿþÈ„êèüÿÿÿfH„ǃì ·PèüÿÿÿƒÄf=ç†(øÿÿƒì·Ph¹ èüÿÿÿèüÿÿÿf£Ç$JèüÿÿÿƒÄfƒø?f£wbƒì ·Pèüÿÿÿ¶ ’’·ÀÁâƒÄ9Ð|"Ç!Ç Æ<<Æ(€=*…”÷ÿÿƒÄ[éüÿÿÿèüÿÿÿf£ë݃ì jÆèüÿÿÿéìøÿÿfÿ&èüÿÿÿf£ÆéJ÷ÿÿèüÿÿÿèüÿÿÿþÈ…êûÿÿèüÿÿÿ…Àu Æ<nÇ!Ç é÷ÿÿÇèüÿÿÿèüÿÿÿf£èüÿÿÿf£èüÿÿÿf£ÆÇÆèüÿÿÿf¡f£f¡f£èüÿÿÿjjjjèüÿÿÿ 7ƒÄ<t<tfÇèüÿÿÿƒÄ[éüÿÿÿƒì jèüÿÿÿƒÄëÚvèüÿÿÿèüÿÿÿÇ ÆÇèüÿÿÿèüÿÿÿf£èüÿÿÿf£èüÿÿÿƒì h°f£èüÿÿÿé†÷ÿÿƒì hñèüÿÿÿƒÄf…ÀuKèüÿÿÿÇ ÆÇèüÿÿÿèüÿÿÿf£èüÿÿÿf£èüÿÿÿf£é¢õÿÿƒì hð'èüÿÿÿƒàƒÄf…ÀuIf=–…áúÿÿf=J˜…Òúÿÿ€=„ÅúÿÿƒìhÔÎh èüÿÿÿÆéÅöÿÿƒì hñèüÿÿÿƒÄfHu£€=tuƒìh€hèüÿÿÿY[j?hèüÿÿÿXZj|hèüÿÿÿY[jhèüÿÿÿÇ$ð'èüÿÿÿƒÈY[·ÀPhð'èüÿÿÿÇèüÿÿÿf£é3öÿÿƒìh€hèüÿÿÿXZj?hèüÿÿÿY[j|hèüÿÿÿXZjhë‰vƒì hð'èüÿÿÿƒà@ƒÄf…Àt{èüÿÿÿˆÃèüÿÿÿèüÿÿÿƒì h°èüÿÿÿÇ$°èüÿÿÿèüÿÿÿÇ$ð'èüÿÿÿ €ZY·ÀPhð'èüÿÿÿèüÿÿÿƒÄ„Ûf£t ¡…À„HûÿÿÆéxùÿÿƒì ·PèüÿÿÿƒÄf=ˆ‚ÃóÿÿƃÄ[éüÿÿÿèüÿÿÿèüÿÿÿþÈt7ƒì ·PèüÿÿÿƒÄf=ˆ‚ˆóÿÿ€=uÆèüÿÿÿénóÿÿÇÇèüÿÿÿf£èüÿÿÿf£èüÿÿÿ€=~f£ÆtDèüÿÿÿèüÿÿÿjjjh‚èüÿÿÿƒÄ€=t Æéoüÿÿjjjj%èüÿÿÿƒÄëâèüÿÿÿëºvf=„Ð…~÷ÿÿƒì h4èüÿÿÿ¢¶ÀƒÄƒøt:ƒøt5ƒì hèüÿÿÿ‰ÃYX‰Ø%ÿïPhèüÿÿÿƒÄÇé'÷ÿÿƒìh$h%èüÿÿÿƒÄë´vUWVSƒì ¡…Àu‹ …Étz…Àt6ƒì h3èüÿÿÿ·ÀÀPÁâƒÄ9~1ÒƒÄ [^_‰Ð]Ãv‹…Ût6·€€€Áà°`ðÿÿ¹VUUU‰ð÷é‰ðÁø)‰Ð`m1Ò9óºë¬UWVSƒì4‹|$Hf‹ƒÇf‹f‰T$&f‰D$jh°èüÿÿÿ^]¶D$Pj3èüÿÿÿY[‹T$¶ÆPj4èüÿÿÿXZh¡j5èüÿÿÿ^]hØj6èüÿÿÿY[jj7èüÿÿÿèüÿÿÿƒÇƒÄ·Øƒì h·èüÿÿÿƒàƒÄ„Àuƒì SèüÿÿÿƒÄfƒø1v׃Ä,[^_]Ãfƒ|$tð¾€ÿÿÿ1íf‹ƒì‰ò¶ÃP¶ÂPèüÿÿÿFXZ¶ß‰òS¶ÂPEèüÿÿÿ‰èfÿL$.ƒÇFƒÄ<wfƒ|$u¾‰ê¶ÂƒìPh°èüÿÿÿY[¶D$Pj3èüÿÿÿXZ‹T$¶ÆPj4èüÿÿÿ^]h¡j5èüÿÿÿY[hØj6èüÿÿÿXZjj7èüÿÿÿfƒD$èüÿÿÿ·ØƒÄvƒì h·èüÿÿÿƒàƒÄ„Àuƒì SèüÿÿÿƒÄfƒø1v×é ÿÿÿfƒ|$…ÿÿÿéúþÿÿSƒì€=Š\$t èüÿÿÿ„ÀuƒÄ[ÃìjhèüÿÿÿXZjhèüÿÿÿYXjhèüÿÿÿXZh$hèüÿÿÿYXhŒhèüÿÿÿXZj0hèüÿÿÿYXh´hèüÿÿÿXZhÅhèüÿÿÿYXh¶hèüÿÿÿXZh†hèüÿÿÿYXh;hèüÿÿÿXZh‡hèüÿÿÿYXjhèüÿÿÿXZhhèüÿÿÿYXjþÿÿvƒìjLèüÿÿÿf‹ ƒÄf9ȉÂf£v3‹ …Ét  <vƒì jÆèüÿÿÿƒÄƒÄ Ã@¢ëô „ÀtHëí·9sÙ€=uÐfÁéf9Ês8f¡@f=Èf£v´f¡@f£ÆfÇƒÄ éüÿÿÿfÇë„ƒì ƒ=t8ƒìh$hèüÿÿÿYXh´hèüÿÿÿXZhñhèüÿÿÿƒÄÃèüÿÿÿƒìjhð'èüÿÿÿYXjhèüÿÿÿXZjhèüÿÿÿYXjhèüÿÿÿXZj0hèüÿÿÿYXhŒhèüÿÿÿXZh›hèüÿÿÿƒÄéRÿÿÿ‰ö€=8t'€=t€=t€=t€=tv1ÀøÉöWVSƒìjh Æ–èüÿÿÿŠ’ˆÐƒàƒÄ„À¾@u €=—„ãƒâ„Òu f=l4ta€=8v΀=ît=€=tƒÎ €=u1öƒì·ÆPhòèüÿÿÿƒÄ[^€%“?_Æ•ÃÆëºv€=—u–΀€ – »¿nƒì·PƒI!·ÀPCèüÿÿÿƒÇƒÄfƒû vÝ΀=•„Iÿÿÿƒìh€h èüÿÿÿƒÄé/ÿÿÿ€=•t ¾@é ÿÿÿ¾@éÿÿÿvƒì èüÿÿÿ1Ò„Àu‰ÐƒÄ Ãì jjj@jj1èüÿÿÿƒÄjhçjjj.èüÿÿÿƒÄjjjjj1èüÿÿÿƒÄ €=„¾ƒì hÆ–ÆÆèüÿÿÿèüÿÿÿf£èüÿÿÿf£ÇèüÿÿÿèüÿÿÿèüÿÿÿèüÿÿÿYXjhñÆfÇèüÿÿÿXZjj èüÿÿÿƒÄ€=t,ƒìjj4èüÿÿÿƒÄ jhÐjèüÿÿÿºƒÄéüþÿÿ‰öƒìjëÒƒìjh°èüÿÿÿƒÄé+ÿÿÿ‰öƒì ¶ƒøw'ÿ$…ØÙƒìjh|$èüÿÿÿXZjh}$èüÿÿÿƒÄƒÄ ÃìjëÚƒìhÿëЃìhÿëÆƒìhÿ?뼃ìj:èüÿÿÿƒàƒÄf…À„f¡f£¡@ ‰ÂÁêÐÑø€%“?fƒøÆf£w fÇ ƒìj høèüÿÿÿXZ·Ph¹ èüÿÿÿYXjhWèüÿÿÿXZjhD!èüÿÿÿÇ$èüÿÿÿ·‰$èüÿÿÿƒÄ€=8f£„v €=uIèüÿÿÿƒì h°ÆèüÿÿÿÇ$°èüÿÿÿYXhûhׯûèüÿÿÿ¸ƒÄƒÄ Ãèüÿÿÿëµ1Àëð Ðè¶ÀƒÀ'£·ƒÀ!€=md£téüÿÿÿÇëîƒìjÆèüÿÿÿƒÄÃvƒìj:èüÿÿÿƒàƒÄf…Àu1ÀƒÄ Ãì j2èüÿÿÿƒàƒÄ„Àuåƒì h€èüÿÿÿƒÄf=èpuσì hÏèüÿÿÿƒÄf=%ku¹€=8v €=…íèüÿÿÿƒì ·PÆèüÿÿÿf£„èüÿÿÿ 7ƒÄ<„¤<„œÆÆÆèüÿÿÿèüÿÿÿf£èüÿÿÿf£ –ƒì ƒàéjƒÈ@Æ¢–€%“?èüÿÿÿÇ$°ÆèüÿÿÿÇ$°èüÿÿÿYXhûhׯûèüÿÿÿ¸ƒÄéÊþÿÿƒì jèüÿÿÿƒÄéRÿÿÿèüÿÿÿéÿÿÿvƒìj2èüÿÿÿƒÄ„Ày7 @<—ƒ=¢—À!Ѓàt¸ÆƒÄ Éö1Àëö „ÀtóH¢ëëvSƒìh€èüÿÿÿƒÄ€=‰Ãu f=b–tjf=£’tdfû™tf¡f9Øtf‰ƒÄ[Éöf¡f=™táƒì h èüÿÿÿƒÄfƒøuŃì jèüÿÿÿ-ZY·ÀPjèüÿÿÿƒÄë¤ÆèüÿÿÿQj(hhèüÿÿÿXZhØh èüÿÿÿƒÄéeÿÿÿVSPèüÿÿÿ„Àu0èüÿÿÿÇÇ!Ç Æ([[^Éöƒìhðhéèüÿÿÿ¡ƒÄƒøIwÛÿ$…ôÙƒì hñèüÿÿÿ‰ÃÇ$(èüÿÿÿƒãƒÄf…À„£fƒû„™fKt-ƒì ÿ5èüÿÿÿ¶’·ÀÑâƒÄ9ÐYÿÿÿéoÿÿÿèüÿÿÿèüÿÿÿƒì hòÆkÆèüÿÿÿ%ƒÄf…ÀuÇ"é.ÿÿÿƒìjj fÇèüÿÿÿÇ>ƒÄéÿÿÿƒìh(Bh èüÿÿÿ^Xjj èüÿÿÿèüÿÿÿY[jhéèüÿÿÿÇ Çèüÿÿÿf£èüÿÿÿf£Ç$°èüÿÿÿÇ$°èüÿÿÿXZhûhׯûèüÿÿÿéiÿÿÿƒì hð'èüÿÿÿ%ƒÄf…ÀtTƒìhhèüÿÿÿY[h›hèüÿÿÿÇ$ð'èüÿÿÿ ^Z·ÀPhð'èüÿÿÿÇéüþÿÿƒì ·PèüÿÿÿƒÄf=ˆ‚íýÿÿÇ=éÞýÿÿƒì hð'èüÿÿÿ%ƒÄf…Àtºƒìh•hèüÿÿÿY[h€hèüÿÿÿXZhahèüÿÿÿ^XjhèüÿÿÿÇ$ð'èüÿÿÿ Y[·ÀPhð'èüÿÿÿƒÄ€=tÇéFýÿÿƒìjh°èüÿÿÿƒÄë݃ì hð'èüÿÿÿƒàƒÄf…À„ ÿÿÿ –ƒà „Àu5fÇl4»¾nƒI!ƒì ·ÀPèüÿÿÿCf‰ƒÄƒÆfƒû vÞƒìh€hèüÿÿÿXZj?hèüÿÿÿ[^j|hèüÿÿÿÇ$ð'èüÿÿÿƒÈZY·ÀPhð'èüÿÿÿÇéjýÿÿƒì hð'èüÿÿÿƒàƒÄf…À„SþÿÿƒìhÉhèüÿÿÿ[^hQhèüÿÿÿÇ$ð'èüÿÿÿƒÈZY·ÀPhð'èüÿÿÿÇ éýüÿÿƒì hð'èüÿÿÿƒàƒÄf…Àt=ƒìh2hèüÿÿÿ[^hhèüÿÿÿèüÿÿÿf£Ç é¨üÿÿƒì ·PèüÿÿÿƒÄf=ˆ‚šûÿÿèüÿÿÿé£ýÿÿƒì hÃ'èüÿÿÿƒÄf=xVuÃìjhÃ'èüÿÿÿèüÿÿÿèüÿÿÿÇ$ð'èüÿÿÿƒÈ ZY·ÀPhð'èüÿÿÿèüÿÿÿf£Ç éüÿÿƒì hð'èüÿÿÿƒà@ƒÄf…À„ýÿÿèüÿÿÿƒìh;hˆÃèüÿÿÿ^XhBhèüÿÿÿèüÿÿÿÇ$ð'èüÿÿÿ €ZY·ÀPhð'èüÿÿÿèüÿÿÿƒÄ„Ûf£„¹üÿÿƒì hèüÿÿÿƒÄf=P‡Ÿüÿÿ‹5…ö…‘üÿÿÇèüÿÿÿ€ –f£é]úÿÿvƒì hð'èüÿÿÿƒàƒÄf…ÀtQƒìhÉhèüÿÿÿ[^hQhèüÿÿÿÇ$ð'èüÿÿÿƒÈZY·ÀPhð'èüÿÿÿÇéâúÿÿƒì ·PèüÿÿÿƒÄf=ˆ‚Ôùÿÿ€=uÆ€=tY[^éüÿÿÿ^[^éüÿÿÿƒì hð'èüÿÿÿƒàƒÄf…Àt=ƒìh2hèüÿÿÿ[^hhèüÿÿÿèüÿÿÿf£ÇéGúÿÿƒì ·PèüÿÿÿƒÄf=ˆ‚9ùÿÿèüÿÿÿé[ÿÿÿƒì hÃ'èüÿÿÿƒÄf=xVt'ƒì ·PèüÿÿÿƒÄf=ˆsÇ¡…Àu¾éòøÿÿƒìjhÃ'èüÿÿÿèüÿÿÿèüÿÿÿÇ$ð'èüÿÿÿƒÈ ZY·ÀPhð'èüÿÿÿèüÿÿÿf£ÇƒÄ뇃ì hð'èüÿÿÿƒà@ƒÄf…À„“þÿÿèüÿÿÿƒìh;hˆÃèüÿÿÿY^hBhèüÿÿÿèüÿÿÿÇ$ð'èüÿÿÿ €^Z·ÀPhð'èüÿÿÿƒÄ„Û„Uþÿÿƒì hèüÿÿÿƒÄf=P‡;þÿÿ‹…Û…-þÿÿÇéò÷ÿÿèüÿÿÿ„ÀˆÃ„¡Æ “ƒàþÈtg€=AtMèüÿÿÿƒì jèüÿÿÿèüÿÿÿf£èüÿÿÿƒÄ€ûtÇ9é‘÷ÿÿèüÿÿÿÇ8é}÷ÿÿvèüÿÿÿÆéi÷ÿÿÇ!Æ<<Ç Æ(éB÷ÿÿ “ƒà@„Àt4 –ƒà„À„&÷ÿÿèüÿÿÿèüÿÿÿèüÿÿÿf£Ç<é÷ÿÿèüÿÿÿþÈ„êèüÿÿÿfH„ǃì ·PèüÿÿÿƒÄf=ç†Ëöÿÿƒì·Ph¹ èüÿÿÿèüÿÿÿf£Ç$JèüÿÿÿƒÄfƒø?f£wbƒì ·Pèüÿÿÿ¶ ’’·ÀÁâƒÄ9Ð|"Ç!Ç Æ<<Æ(€=*…7öÿÿ^[^éüÿÿÿèüÿÿÿf£ë݃ì jÆèüÿÿÿéüöÿÿfÿ&èüÿÿÿf£ÆéíõÿÿvèüÿÿÿþÈ…Ó÷ÿÿèüÿÿÿ…Àu Æ<nÇ!Ç é´õÿÿÇèüÿÿÿf£èüÿÿÿf£èüÿÿÿŠ–ƒâƒòf£°(ТÆÇèüÿÿÿf¡f£f¡f£èüÿÿÿèüÿÿÿ€=tBjjjjèüÿÿÿ 7ƒÄ<t<tfÇèüÿÿÿX[^éüÿÿÿƒì jèüÿÿÿƒÄëÛjjjj%èüÿÿÿÆ뵃ì hð'èüÿÿÿ%ƒÄf…À„ËúÿÿƒìhhèüÿÿÿY[h›hèüÿÿÿÇ$ð'èüÿÿÿ ^Z·ÀPhð'èüÿÿÿÇéZõÿÿƒì hð'èüÿÿÿ%ƒÄf…À„Zúÿÿƒìh•hèüÿÿÿY[h€hèüÿÿÿXZhahèüÿÿÿ^XjhèüÿÿÿÇ$ð'èüÿÿÿ Y[·ÀPhð'èüÿÿÿÇéÊôÿÿƒì hñèüÿÿÿƒàƒÄf…À„Ÿƒì hð'èüÿÿÿƒàƒÄf…À„°ùÿÿƒì hñèüÿÿÿƒàƒÄf…À„”ùÿÿƒìh€hèüÿÿÿXZj?hèüÿÿÿ[^j|hèüÿÿÿÇ$ð'èüÿÿÿƒÈZY·ÀPhð'èüÿÿÿÇèüÿÿÿf£éôÿÿèüÿÿÿèüÿÿÿf£èüÿÿÿf£èüÿÿÿf£é8ùÿÿƒì hð'èüÿÿÿƒà@ƒÄf…ÀtYèüÿÿÿˆÃèüÿÿÿƒì hð'èüÿÿÿ €ZY·ÀPhð'èüÿÿÿèüÿÿÿƒÄ„Ûf£t ¡…À„úÿÿÆéÇøÿÿƒì ·PèüÿÿÿƒÄf=ˆ‚eòÿÿÆ馸ÿÿèüÿÿÿþÈ…[øÿÿÇÇèüÿÿÿf£èüÿÿÿf£èüÿÿÿŠ–ƒâƒòf£°(Тèüÿÿÿèüÿÿÿjjjh‚èüÿÿÿƒÄ€=t Æéºüÿÿjjjj%èüÿÿÿƒÄëâƒì hð'èüÿÿÿ%ƒÄf…À„–óÿÿƒì hT!èüÿÿÿ¢¶ÀƒÄƒøt ƒø„Ѓìh4h%èüÿÿÿÇ$èüÿÿÿ‰Ã^X‰Ø%ÿïPhèüÿÿÿƒÄ€=„€ƒì h èüÿÿÿƒÄf…À‰Ãy €=tÇéýòÿÿŠ–ˆÐƒÈ¢–‰Ø%f…Àt ƒÊ ˆ–€=tÃã f…Ût¸€ –Ç#é®òÿÿ‰ö€ –étÿÿÿƒìh$é+ÿÿÿvƒì hð'èüÿÿÿ%ƒÄf…À„ròÿÿƒìhÅhèüÿÿÿY[h¶hèüÿÿÿXZh†hèüÿÿÿÇ$èüÿÿÿ[^jh9èüÿÿÿÇ$ð'èüÿÿÿ ZY·ÀPhð'èüÿÿÿÇ$éïðÿÿƒì hð'èüÿÿÿ%ƒÄf…À„Öñÿÿƒìh;hèüÿÿÿ^XhhèüÿÿÿY[h‡hèüÿÿÿXZjhèüÿÿÿ^Xjìÿÿèüÿÿÿ<¢t<…¢ãÿÿÇé“ãÿÿèüÿÿÿX[^éüÿÿÿèüÿÿÿèüÿÿÿ€%–鯯Ç>éXãÿÿèüÿÿÿèüÿÿÿþÈt9ƒì ÿ5èüÿÿÿ¶’·ÀÑâƒÄ9ÐŒ"ãÿÿèüÿÿÿÆ(éDíÿÿƒì h èüÿÿÿƒÄf…Ày €=tuf¡f£f¡f£èüÿÿÿÇèüÿÿÿ€=t*jjjjèüÿÿÿƒÄèüÿÿÿf£Ç@é”âÿÿjjjj%èüÿÿÿÆëÍ€ –ë‚vèüÿÿÿ„ÀˆÃ„w “ƒàþÈ„@€=A„éèüÿÿÿƒì jèüÿÿÿèüÿÿÿèüÿÿÿf£èüÿÿÿƒÄ€ûf£„ŸÇD€=*…ùáÿÿèüÿÿÿfH…ìáÿÿƒìh$h%èüÿÿÿfÿ$èüÿÿÿƒÄ häjcjèüÿÿÿèüÿÿÿf£èüÿÿÿf£Ç$!èüÿÿÿ‰ÃX‰Ø Z%÷ÿPh!èüÿÿÿÇIébâÿÿèüÿÿÿÇCéWÿÿÿèüÿÿÿPhäjcjèüÿÿÿfÿ$èüÿÿÿf£èüÿÿÿf£ÆƒÄÇHé ÿÿÿÇ!Æ<<Ç Æ(éæþÿÿ “ƒà@„Àt/ –ƒà„À„Êþÿÿèüÿÿÿèüÿÿÿf£ÇFé«þÿÿƒì ·PèüÿÿÿƒÄf=ó†Žþÿÿƒì j2èüÿÿÿƒàƒÄ„Àt=èüÿÿÿfÿ&èüÿÿÿf£èüÿÿÿf£PhäjcjÆèüÿÿÿéÿÿÿèüÿÿÿþÈ„ €=*tèüÿÿÿf£éþÿÿèüÿÿÿþÈuçƒìh$h%èüÿÿÿfÿ$èüÿÿÿƒÄ häjcjèüÿÿÿèüÿÿÿf£èüÿÿÿf£Ç$!èüÿÿÿ‰Ã‰ØY ^%÷ÿPh!èüÿÿÿÇIƒÄéiÿÿÿƒì ·Pèüÿÿÿ¶ ’’·ÀÁâƒÄ9ÐŒbýÿÿéPþÿÿ€%–鯯ÇBé>ßÿÿèüÿÿÿèüÿÿÿ„ÀuLƒì ·PèüÿÿÿƒÄf=‡v Æ<?é>éÿÿƒì ·PèüÿÿÿƒÄf=/uwÛ€=uÒéäÞÿÿèüÿÿÿèüÿÿÿ€=…*üÿÿjjjj%èüÿÿÿƒÄéüÿÿèüÿÿÿ„À…«Þÿÿèüÿÿÿèüÿÿÿèüÿÿÿèüÿÿÿf£ÇEé‚Þÿÿƒì ·PèüÿÿÿƒÄfƒød†eÞÿÿ븃ì ·PèüÿÿÿƒÄfƒød†FÞÿÿèüÿÿÿ€=‘f£t –ƒà„Àt  “ƒà@„ÀuÇGé ÞÿÿèüÿÿÿÇFé÷Ýÿÿèüÿÿÿ<¢…:úÿÿ€=uÆèüÿÿÿèüÿÿÿƒì hòèüÿÿÿ ZY·ÀPhòèüÿÿÿé”ÞÿÿƒìhkhÏèüÿÿÿ^Xh_qh€èüÿÿÿfÿ$èüÿÿÿf£èüÿÿÿf£ÆÇHé>Þÿÿèüÿÿÿèüÿÿÿ„À„ þÿÿèüÿÿÿéRþÿÿèüÿÿÿƒì h)èüÿÿÿƒÄfƒøtHèüÿÿÿ„À„Ùýÿÿèüÿÿÿƒì h!èüÿÿÿƒÈ[^%ÿïPh!èüÿÿÿèüÿÿÿÇ@é¿Ýÿÿ€=u¯ƒì h Æèüÿÿÿ‰ÃÇ$ƒèüÿÿÿƒÄf…Àt-f¡ƒèã?üÿÿÁà Ãì·ÃPh èüÿÿÿƒÄéXÿÿÿf¡ƒèƒãÃÁàëÔvUWVSƒì ‹…Ûu‹…Òt{…Ût7 –ƒà„Àt}¶€€4€Á湫ªª*‰ð÷é‰ðÑúÁø)Â1É9ÓE‹…Ût6·€€€Áà°`ðÿÿ¹VUUU‰ð÷é‰ðÁø)‰Ð`m1É9ùƒÄ [^_‰È]Ãvƒì h3èüÿÿÿ·ÀÀPÁâƒÄ‹ëƒì €=™fǼ"°tƒÄ Ãvƒìhå6jfǼ"hèüÿÿÿYXhËjèüÿÿÿXZhÑ=j èüÿÿÿYXh ;j!èüÿÿÿƒÄ벃ìjhèüÿÿÿƒÄÃVSƒìh·èüÿÿÿƒàƒÄ„ÀuX[^Ãvƒì h°èüÿÿÿˆÃƒÄƒãt:K€ûÿ¾ÿÿÿt/‰ö‰òƒì ¶ÂPèüÿÿÿ‹ˆKFÿfÿƒÄ€ûÿuÓƒì h°èüÿÿÿƒÄë–ƒì ÇÇfÇèüÿÿÿèüÿÿÿƒìh”hèüÿÿÿƒÄÃSƒì¡ƒøw6ÿ$…˜Þƒì jjjjj1èüÿÿÿƒÄ èüÿÿÿèüÿÿÿf£Ç¸ƒÄ[Ãì ·PèüÿÿÿƒÄfƒø2v Çfƒ=tɃì h) èüÿÿÿ‰ÃÇ$, èüÿÿÿƒÄf…Ût¦f…Àu¡ë•vèüÿÿÿƒìhØ.jèüÿÿÿY[h›+jèüÿÿÿXZhR?jèüÿÿÿY[hK jèüÿÿÿXZj jèüÿÿÿY[jjèüÿÿÿXZjþÿÿ‰öSPŠL$ŠD$„É‹\$ ˆD$t#‹Šˆ‹BC€|$‰tþÉuãX[ÃCëö¡Šˆ‹B£ ˆBÿÉöSƒìèüÿÿÿf£èüÿÿÿf¡fƒø v-1Ûf…À‰Át$‹·Ãf¶€f‰CBfI‰Âuè£ÇƒÄ[Ãìjjh,ƒèüÿÿÿƒÄ jjÿ5èüÿÿÿƒèüÿÿÿƒÄ jjh2èüÿÿÿƒÄ jjÿ5èüÿÿÿƒèüÿÿÿƒÄ jjh8èüÿÿÿ ƒè ƒÄ¢þÀt2‹¡Šˆ ‹HBƒ¢þÀ‰uÔƒÄ éüÿÿÿƒì  „À¢Ç„¡¶ƒÀƒú£‡7ÿ$•¬ÞRjjh,èüÿÿÿƒÄ j¡ƒÀjP£èüÿÿÿƒèüÿÿÿƒÄ jjh2èüÿÿÿƒÄ jjÿ5èüÿÿÿƒèüÿÿÿ ƒè ƒÄ¢„À…dÿÿÿƒÄ ÃPjjh8èüÿÿÿ¡ŠƒÀ£ (ÈIƒèƒÄ€ùÿ¢t)‹¡Šˆ‹IBƒ€ùÿ‰uÝèüÿÿÿ ë‰Pjjh8èüÿÿÿ‹B£ŠR¡ˆƒÿ€-èüÿÿÿƒÄë´ ƒà<t H¢é(ÿÿÿ¡ŠƒÀ£ (ȃèëÛPjjh>èüÿÿÿ¡ŠƒÀ£ (ÈIƒèƒÄ€ùÿ¢„>ÿÿÿ‹¡Šˆ‹IBƒ€ùÿ‰uÝéÿÿÿPjjh>éÿÿÿSƒì€=At'f¡fƒøtfƒÀ€tƒÄ[ÃèüÿÿÿëôèüÿÿÿëìQjjhDèüÿÿÿ HƒÄ¢þÀtdv¡ŠƒÀ£ˆØÀèƒì ¶ÀPèüÿÿÿ‹ˆD$ƒãˆÿ‰$èüÿÿÿ‹ˆD$ˆ HÿƒÄ¢þÀuŸèüÿÿÿé\ÿÿÿSƒì€=A„Sjjh8èüÿÿÿ ƒà¢  ƒÄ<Ç t<‚t<„t èüÿÿÿƒÄ[Ãv¡ŠHƒáIƒÀ€ùÿ£tÚ‹Šƒàˆ¡‹IƒÀB€ùÿ£‰uÙëªPjjhDèüÿÿÿ ƒàƒÀƒÄ¢þÀÇ„vÿÿÿv¡ŠƒÀ£ˆØÀèƒì ¶ÀPèüÿÿÿ‹ˆD$ƒãˆÿ‰$èüÿÿÿ‹ˆD$ˆ HÿƒÄ¢þÀuŸé ÿÿÿ‰öSƒìèüÿÿÿ¡‹ 9ÈÇt*‰ö‹ŠƒÀƒú£wÿ$•ÐÞ€û‡tv9ÈuØ1ÀƒÄ[Ãì h‡fLJÇfÇèüÿÿÿljöƒÄ¡‹ ë°€ûu«¡ƒì fǃÀh£èüÿÿÿÇëÀ€û‚…wÿÿÿ¡ƒì fÇ‚ƒÀh‚£èüÿÿÿ¡ŠƒÀ£f¶Ó¡f‰ƒÀ£¶Ã‰$èüÿÿÿÇé[ÿÿÿ¡f¶Óf‰ƒÀ£ƒì ¶ÃPƒãèüÿÿÿC¢Çé!ÿÿÿ¡f¶Óf‰ƒÀƒì £¶ÃPèüÿÿÿ HƒÄ„À¢…îþÿÿfƒ=…¡þÿÿèüÿÿÿèüÿÿÿ¸éþÿÿWVSèüÿÿÿ¡‹=9øÇt-p¡‰óƒøŠNþ‰v„ÀƒøwGƒøt 9ûuÖ1À[^_Àùt€ù€uìf¶Áƈ f£ÇÇ뿃øu¹¡f¶Ñ f‰ƒÀ£ H„À¢u€=At+ ƒÀ¢Çèüÿÿÿèüÿÿÿ¸ébÿÿÿ€=…SÿÿÿëÆv¡f¶Ñ f‰ƒÀ£A¢ÇéÿÿÿvSƒì ˆD$¸(D$€|$t1Û:\$rƒÄ[Éö¶Ãƒì ¶€PèüÿÿÿCƒÄ:\$rãëÚS¸Š(ÄÛt&1Éf¶Ã8Ùf£s‰ö¶ÑAŠ‚8Ùˆ‚rì[Ãì ÇfÇÆèüÿÿÿ€=7f£tèüÿÿÿjjjh‹èüÿÿÿƒÄÉöèüÿÿÿëÞVSƒì$€= ŠD$0ÇD$t$ÇD$ ÇD$ÇD$ÇD$ÇD$\$wV„ÀtRƒìhJSèüÿÿÿƒÄ j V¶PèüÿÿÿXZVSèüÿÿÿ‰$ÇèüÿÿÿZY·ÀPSèüÿÿÿƒÄƒÄ$[^Ãèüÿÿÿëòƒì €=t ƒì jèüÿÿÿYZ%ïPjèüÿÿÿƒÄÃvƒì jèüÿÿÿëíƒì €=t ƒì jèüÿÿÿƒÈYZ¶ÀPjèüÿÿÿƒÄÉöQjhÿjèüÿÿÿƒÄ jjjèüÿÿÿëÛƒ=t1ÀøÇÃì jjjhŒèüÿÿÿèüÿÿÿÇ!Ç Æ(Æ<QƒÄÉö‹ƒú t1ÀƒútÃÇ ¸ëívÇ ëêSƒì¡ƒøwjÿ$…0ßèüÿÿÿƒì jjjjj1èüÿÿÿƒÄj èüÿÿÿXZhÄjhÏèüÿÿÿf¡YƒÀ[·ÀPhèüÿÿÿèüÿÿÿf£ÇƒÄ1ÀƒÄ[ÃìhÌäh"èüÿÿÿXZjhÐ$èüÿÿÿY[h_qh€èüÿÿÿèüÿÿÿf£Ç뮃ì ·PèüÿÿÿƒÄf=Ÿv Ç댃ì hÒ$èüÿÿÿƒàƒÄf…À„pÿÿÿƒìhÌhÑ$èüÿÿÿXZjhÐ$èüÿÿÿèüÿÿÿf£Çé3ÿÿÿ‰öƒì ·PèüÿÿÿƒÄf=Ÿwƒƒì hÒ$èüÿÿÿƒàƒÄf…À„ÿþÿÿƒì hÓ$èüÿÿÿ‰ÃƒàƒÄfƒø t\ƒìh»hÑ$èüÿÿÿY[jhÐ$èüÿÿÿèüÿÿÿf£Ç$èüÿÿÿƒÄ…ÀtÇé—þÿÿƒì jèüÿÿÿƒÄëâƒìjhÐ$fÁëèüÿÿÿ‰Úƒâf‹„f£Š‚¢èüÿÿÿ£Ç$èüÿÿÿƒÄ…Àtèüÿÿÿf£Çé þÿÿƒì jèüÿÿÿƒÄë×èüÿÿÿèüÿÿÿf£Çéñýÿÿƒì ·Pèüÿÿÿ¶¿’·ÀÑâƒÄ9ÐŒÇýÿÿèüÿÿÿƒì jèüÿÿÿèüÿÿÿƒÄ€=f£ÇtÆÇéýÿÿÇ érýÿÿƒì ·PèüÿÿÿƒÄf=ç†UýÿÿÇ éFýÿÿƒì j:èüÿÿÿƒàƒÄf…À…-ýÿÿëÖ¡¶ƒøD‡“ÿ$…ˆßƒìD$Pÿ5èüÿÿÿXZ¶ PjèüÿÿÿY[¶ PjèüÿÿÿXZ¶Pjèüÿÿÿ[Xf¶Ñf¶Ð·ÀPjèüÿÿÿƒÄ j¶D$Pj èüÿÿÿÇÿé„üÿÿ€=„ùþÿÿèüÿÿÿf£éÄýÿÿfƒ=„\üÿÿƒì ÿ5èüÿÿÿ·’’’’ÁâƒÄ9Ђ-üÿÿéüÿÿèüÿÿÿèüÿÿÿèüÿÿÿf£Ç éüÿÿƒì ·PèüÿÿÿƒÄf='†çûÿÿÇ éØûÿÿèüÿÿÿþÈtAƒì ·PèüÿÿÿƒÄf=φ²ûÿÿèüÿÿÿèüÿÿÿèüÿÿÿf£ÇéŽûÿÿÇéûÿÿƒì ·Pèüÿÿÿ¶¿’·ÀÑâƒÄ9ÐŒUûÿÿèüÿÿÿƒì jèüÿÿÿƒÄ€=u.€=Ç„©þÿÿèüÿÿÿf£Æé|ýÿÿÆèüÿÿÿf£Çéëúÿÿvƒì ·PèüÿÿÿƒÄf=ç†Ëúÿÿèüÿÿÿèüÿÿÿèüÿÿÿf£Çé§úÿÿèüÿÿÿþÈ„ ÿÿÿƒì ·PèüÿÿÿƒÄf=φ}úÿÿéàúÿÿèüÿÿÿÇédúÿÿƒì ·PèüÿÿÿƒÄf=W†GúÿÿëÒjjjhŒèüÿÿÿÇ$èüÿÿÿÇ!Æ<<Ç Æ(¸ƒÄéüùÿÿjjjhŒèüÿÿÿ¸ëáƒì ·PèüÿÿÿƒÄf=ç†Æùÿÿéþÿÿƒì 1Ò1ÀBÇ…Ç…Ç…@fúÿvÖ1Ò¸vBÆ@fúßvôPhhhÇÇüÇüÇÇüÇüÇÇüÇüÇÇàÇÇÆÆÆÆÇèüÿÿÿƒÄÃv‹S1À1Û÷ŠL$t³÷Ât°1Ø1ȃàÑê<‰tâÿÿ¿ÿ¶À[‰ÃÊ@ëìVS¶5‹ŠD$ ‰ò‰Ù1ÂÁé1ʶÒÁâƒá Ñ1È1ð¶À‰ÂÁâÁë Ó‰[^á9r#f‹f¡f+f+f)·ÂÃf‹f+ëëUWVSƒì¶t$,1Ò¸BÆ@€úvö‰ðÀèf¶ÀŠf‰D$¡‰D$½¶Â‹ )Å¡ÇD$ˆT$¶=‰L$‰D$ ¡;D$„ Š@;D$£r ‹L$ ‰ ‰ÓÁã·Ã‰Ã‰é‰úÓûf¶Â ËL$ˆ‰ØfÁèAƒîfÿL$‰L$‰Ç¢u¡‰ð„À„‰:D$†‹¡;D$t|Š@;£r ¡£‰ÓÁã·Ó¶D$¹)Á‰Ó‰úÓûf¶Â ÉñŠD$(ȃÀ¢‰ð¶Ð¹)ѸÿÓø!Ø‹L$ˆ·Ã‰ÃˆÑÓûˆƒÄ[^_]ò~뚉ò(T$‰øŠL$f¶Øˆ 벉ö²~éÿÿÿUWVSƒì ¶|$$‰ûÀë‹t$ vƒì ¶PèüÿÿÿˆƒïFƒÄþËuç‰ø„Àt1í‰ê1Û8Âr‰êˆƒÄ [^_]ÃvŠˆÂƒàƒì Ðê¶ÀˆPèüÿÿÿ¶ÀˆÙÓà ÅC‰øƒÄ8ÃrÖëÅUWVSƒì,‹l$D‹D$HÇ@ÇÇEÇEfÇD$|$\$ 1öRT$$R‹L$H·qPÿuèüÿÿÿ‹D$0‰E‹D$4‰D$(ƒÄ ÇGS‹T$H·rPÿuèüÿÿÿƒÄ L$QSWèüÿÿÿ¶Ð‹D$ ‰E‹D$$‰D$(ƒÄ ‰WS‹T$H·rP‹L$Tÿ1èüÿÿÿƒÄ D$PSWèüÿÿÿ¶Ð‹L$X‹D$ ‰‹D$$‰D$(ƒÄ ‰WS‹T$H·rPÿqèüÿÿÿƒÄ L$QSWèüÿÿÿ‹D$ ‹T$XƒÄfÿD$Ffƒ|$ ‰B†ÿÿÿ‹E…Àt H‰EƒÄ,[^_]ËE…ÀÇEÿÿÿÿtH‰Eëä‹L$H‹…ÀÇEÿÿÿÿtH‰ë΋D$HÇÿÿÿÿ‰Â‹@…ÀtH‰B뵋L$HÇAÿÿÿÿë¨UWVSƒìd‹D$x‹0‰t$X‹H‰L$\‹X‰\$P‹x ‰|$T‹„$€‹P‹‰D$@‰T$D‹„$„‹P‹‰D$H‰T$L‹D$X‹T$\‰D$ ‰T$$‹D$P‹T$TÑæ‰D$‰T$¶l$|‰t$X‹D$ ÁèÑá Á‹D$$ÁèÑã ËD$ÁèÑçT$P lj\$P‰L$\‰|$TR\$LSèüÿÿÿƒÄ…À²x …À„.1Ò1êˆT$‰êþÊt4‹D$‹T$£‰‹D$‹T$£‰¶D$ƒÄ\[^_]ËD$÷ЉD$(‹D$÷Ðt$(‰D$,ÇD$0ÇD$4QD$TPVD$ÃÇ-öƒø wxÿ$…€ãÇ ÃÇ ÃÇÃÇ ÃÇ ÃÇÃÇÃÇÃÇÃÇÃvÇÃSƒì‹\$Æ€=t)¡ƒøt$ƒìÿ5SèüÿÿÿXZháSèüÿÿÿƒÄ¡ƒìÿ4ÅSèüÿÿÿƒÄ[ÃSƒì¡ƒø‹T$tQj R¶ÅPèüÿÿÿ‰ÃƒÄ·Ã[ÉöPjhãR»èüÿÿÿëávUWVS윋¬$°…틼$´„«Š2€ú\$ÆD$„x…í„®P·÷VUSèüÿÿÿƒÄó ˆGC€=2t…ít ˆC€=2tqGÆ f €ˆD$€|$ \$¢tŠD$ƒì ¶ÀPèüÿÿÿˆCŠƒÄ„ÀuèŠD$¢·ÇPD$Pjj!èüÿÿÿƒÄÄœ[^_]ÃÇë‹€=1t&ƒ=tƒì Sèüÿÿÿ‰Çƃķðé2ÿÿÿ„Òuƒì SèüÿÿÿƒÄëуì Sèüÿÿÿ‰$èüÿÿÿƒÄ€=t´€=,u«·ÀÆ¡ƒøwÿ$…´ã¸çƒìPSèüÿÿÿ문ìëí¸òëæ¸÷ë߸ÿëØ¸ëѸ ëʸëàˆD$ ˆD$\$émþÿÿ€=1…Hþÿÿéÿÿÿvƒì €=1tL€=,ÆuÇÆƒÄ Ãv€=puƒì ÿ5èüÿÿÿƒÄëÝƒÄ éüÿÿÿÆÇ?ëƒì‹D$ ƒø*‹T$$w ÿ$…ÔãèüÿÿÿƒÄÃ=t$Æ<-ljöƒìjjèüÿÿÿƒÄëÏf¡N% f…Àt¿Æ$ÆD$RjD$Pjj!èüÿÿÿëÐèüÿÿÿëƒ=t0€=2t €=Šuèüÿÿÿjjjj&èüÿÿÿƒÄë‹èüÿÿÿëâ¡9tÇéhÿÿÿ€=3Ç…QÿÿÿèüÿÿÿéGÿÿÿv¡ƒøwCÿ$…€äÇé$ÿÿÿÇéÿÿÿÇéÿÿÿÇé÷þÿÿÇéèþÿÿÇéÙþÿÿÇéÊþÿÿÇ é»þÿÿv€=t5Šƒà<t èüÿÿÿé|þÿÿƒìjjÇèüÿÿÿÆé†þÿÿƒì ¶PèüÿÿÿéuþÿÿÇéZþÿÿ¡ƒøt ƒø…#ÿÿÿjjjj-èüÿÿÿƒÄéÿÿÿjjjj-èüÿÿÿXÇZéþÿÿVSRèüÿÿÿf£‹¶Jƒø\‰ ‡—ÿ$…Àäƒ=?tƒìjjèüÿÿÿƒÄÇX[^ÃÇë×èüÿÿÿëßèüÿÿÿëØèüÿÿÿëÑèüÿÿÿëÊŠqPtD€>Ct&€>F…Vÿÿÿ€~C…LÿÿÿV‰èüÿÿÿéÁþÿÿ€~FuÔV‰èüÿÿÿé¨þÿÿ€~Ru¶V‰èüÿÿÿéþÿÿ€~Ru˜€~Ru’ƒì Qj‰éoÿÿÿ€yC…fþÿÿ€~I…\þÿÿQ‰èüÿÿÿéIþÿÿŠAB…¨þÿÿV‰èüÿÿÿéþÿÿ€~BuÞ€~MuØQ‰èüÿÿÿéþýÿÿ‰öQ‰€yRt èüÿÿÿéãýÿÿQ‰èüÿÿÿéÐýÿÿƒì Qj‰é¼þÿÿ€yCt4Šüÿÿèüÿÿÿé4üÿÿèüÿÿÿé*üÿÿ‰öŠS¹1Û„Ò‰ t&€ú tBŸ<wƒâ߷ÈCŠA„Ò‰ uÚ·Ã[Æ€ÇÃSƒì‹D$ˆÃƒã€=WˆD$t¡…Àu€ûAt,€ûat'ƒøt7ƒøt ƒÄ¶Ã[Ã:tðfƒ=;wæ‰öjD$ Pjj!èüÿÿÿƒÄëÏ€ûTtæ€ûttá€ûAtÜ€ûat×€û/u°ëÐWVSƒì‹\$,¶ÃPèüÿÿÿˆÁ¡ƒÄƒø‰Þ„äƒø‚·ƒøt ƒÄ[^_Ãv: tl: t1f¡fƒø;w·Ð¡ˆ fÿëÆèüÿÿÿÇëµf¡f…ÀtªHf£ˆ $ÆD$ ˆL$jD$Pjj!èüÿÿÿƒÄë‚·¡Æf €Ç?èüÿÿÿèüÿÿÿéPÿÿÿ‰ö€ùAt €ùa…@ÿÿÿˆÇé+ÿÿÿ€ùTtw€ùttr€ù/t*€ùAtÜ€ùatנLj$ÆD$ ˆD$éZÿÿÿjhjj!èüÿÿÿÇ$Çèüÿÿÿf£Ç?èüÿÿÿé*ÿÿÿv€=…ÓŠ €útBÆ€út €=t)°¢ÇfÇÇéXþÿÿ°ÿëÕŠˆØƒàÿ$…èvB€=™£tvéüÿÿÿ€%¿€%ëëvB£€=™u×€%¿€ €ëÇvB€=™£u³€ @붉öéüÿÿÿv¡‰Â¶ƒè0ƒø w+ÿ$…<èéüÿÿÿB£Æ8véüÿÿÿB£Æ8ëêB£ $„Àt<t<t <t Æ8ëÄÆ8ë»B£ $„Àt <t<t<u”Æ8ë•ƒì ¡¶ƒú0t4ƒú1tÆQjjjjèüÿÿÿƒÄéüÿÿÿv@£ÆQëÙ@£ëÉƒì ¡¶ƒú0t0ƒú0|ƒú9~èüÿÿÿ…ÀtÇƒÄ éüÿÿÿvƒÄ éüÿÿÿ@£ëÒSƒì‹Š ¶Áƒè0ƒøwf¶ÁXÐB£€z=t ƒÄ[éüÿÿÿvƒì BP£èüÿÿÿƒÄfƒø(wÚƒìÿ5·ÃPèüÿÿÿƒÄ„ÀtÁƒìjjÇèüÿÿÿƒÄ[Éöƒì ¡¶ƒê&@ƒú4£wÿ$•dèƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿèüÿÿÿƒÄ ÃƒÄ éüÿÿÿƒÄ éüÿÿÿv‹¶ƒè0Jƒø ‰Ê‰ wÿ$…8éÆw€‰öéüÿÿÿQ‰JÆw@‰ëâÆwÀëÙÆwúëÐéüÿÿÿv‹¶HЃù B£w?ÿ$`éÆ8éüÿÿÿÆ8ëòÆ8ëéÆ8ëàÆ8ë×éüÿÿÿ‰öÆ8‰ëÁ‹¶ƒè0Jƒø ‰Ê‰ wÿ$…ˆéÆ,éüÿÿÿQ‰J‰Æ,ëâvéüÿÿÿvƒìj D$Pÿ5èüÿÿÿƒÄf|$ ÿw¶ÀŠD$ ¢èüÿÿÿƒÄ Ãèüÿÿÿëõ¡¶ƒú1t+ƒú1ƒú0t Ævéüÿÿÿ@£ëëƒú9æéüÿÿÿ‰ö@£Ævë×ƒì ¡¶ƒêA@ƒú£wOÿ$•°éƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿèüÿÿÿƒÄ ÃƒÄ éüÿÿÿƒÄ éüÿÿÿvƒì €=±t¡Šƒè1<w ƒÄ éüÿÿÿ‰öjjjjrèüÿÿÿ¡ƒÄ€8tH£ƒÄ éüÿÿÿ¡¶‰Á@ƒú1£t7ƒú1&ƒú0tHÆ9£éüÿÿÿvA£ëá‰öƒú9Úéüÿÿÿ‰öÆ9ë×v‹¶ƒè0Jƒø ‰Ê‰ w%ÿ$…êÆ}Æ*éüÿÿÿQ‰JÆ}Æ*‰ëÚÆ}ëÊvéüÿÿÿvéüÿÿÿv¡¶@ƒú1£t9ƒú1(ƒú0tH£€=¸téüÿÿÿvÆ#ëïvƒú9Øéüÿÿÿ‰ö€=¸uׯ#ëΉöƒì ¡¶ƒêB@ƒú£w'ÿ$•@êƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿƒÄ éüÿÿÿèüÿÿÿƒÄ ÃvƒÄ éüÿÿÿƒì ¡¶@ƒúH£t èüÿÿÿƒÄ ÃƒÄ éüÿÿÿƒì ¡¶@ƒú1£„úƒú1Q…Òtƒú0t èüÿÿÿƒÄ Ãv¡ƒøtƒø tƒìjjÇèüÿÿÿƒÄjjjj èüÿÿÿƒÄ뿉öƒú3tOƒú6u®ƒ=u‹…Òu ¡…Àt ‰öƒÄ éüÿÿÿjjjjèüÿÿÿjjjj%èüÿÿÿƒÄ ékÿÿÿ‰ö¡ƒøt8ƒøuÅ¡…Àu¼‹ …Éu²ƒìjjÇèüÿÿÿjjjj ë¯jjjj éQÿÿÿƒ=…wÿÿÿjjjj é6ÿÿÿ‰öUWVSƒì ‹D$,‹\$$‰D$‹D$0‰D$‹t$ ‹D$4…Û‹|$(f‰D$Ætƒìh VèüÿÿÿY]SVèüÿÿÿƒÄ1íƒÿwuÿ$½,ëƒì Vèüÿÿÿ·ÀƒÄ 0j S·D$Pèüÿÿÿ‰Å·ÀÃÄÆ ÆC‹T$…Ò„—Eƒìÿt$Vèüÿÿÿ[ÿt$èüÿÿÿ·ÝZ·ÀYœÿÿÿÿSVèüÿÿÿƒÄ‹D$…Àtƒìÿt$ VèüÿÿÿƒÄƒì Vèüÿÿÿ·À0 ˆ CˆC‰Øf)ð·ÀƉt$8‰D$<ÇD$4ÇD$0!ƒÄ[^_]éüÿÿÿƒìP놃ì Vèüÿÿÿ·ÀƒÄ 0jéÿÿÿƒìÿt$éaÿÿÿƒì Vèüÿÿÿ·ÀƒÄ j 0Sf‹T$fÁê·ÒÕ)ЂÂÀ‚ÁèPèüÿÿÿ·ÀƒÄ ÃÆ.j CSf‹D$¹è1Òf÷ñ·ÒRèüÿÿÿƒÄfƒø‰Åt5fƒøt!ƒÃÆ ÆC‹|$…ÿ…¬þÿÿƒì·Åé;ÿÿÿŠˆCÆC0Æ0ëÑŠCˆCŠˆCëî‰öƒìd ·T$p¶ÈRÁáÿ±ÿt$tÿt$tÿ±@¢D$PèüÿÿÿƒÄ|Ãìjÿ5jèüÿÿÿƒÄÉö€|$t¸£éüÿÿÿ‰ö¸ëí¶D$ƒøwÿ$…¨ìÇéüÿÿÿÇëïÇëãÇë×ÇëËÇë¿Çë³Çë§vƒì·D$Pÿt$jèüÿÿÿƒÄÃì·D$PjèüÿÿÿƒÄÃìdjjjjÿt$xD$PèüÿÿÿƒÄ|ÃvÆÆfÇfÇfÇfÇfÇfÇfÇfÇfÇfÇfÇfÇfÇ fÇ"fÇ$fÇ&Æ(Ç,Æ0fÇ2fÇ4Ç8Æ<Æ=Æ>Æ?Æ@ÆVfÇ„ÉöSf‹f9N¹.ºNs¹-ƒêf9s ‰ÈIfƒøwï·Á[ÉöWVSìœjèüÿÿÿÇ$èüÿÿÿÇ$€èüÿÿÿÇ$ÀèüÿÿÿƒÄƒ=„Lèüÿÿÿ ¶Ðƒú „nƒú tU< vÆèüÿÿÿÄ[^_Ãvƒìh\$ @S¢èüÿÿÿƒì Sèüÿÿÿ·ÀƒÄPSjj!èüÿÿÿƒÄ ë¼ <t <t„À…¹³ ‰çvƒìjjhôj¶Ãÿ4…€îWCèüÿÿÿƒÄ €û vÙƒì·PjjjhÀWèüÿÿÿƒÄ·PjjjhWèüÿÿÿƒÄ· Pjjjh@WèüÿÿÿƒÄ·"Pjjjh€WèüÿÿÿƒÄ·$PjjjhÀWèüÿÿÿƒÄ·&PjjjhWèüÿÿÿƒÄ¶(Pjjjh@Wèüÿÿÿ ƒÄ <t{<tw³¾Ðîƒìjjhôjÿ6WCèüÿÿÿƒÆƒÄ €ûvÞƒìjjhôjhWèüÿÿÿf¡„ƒÄ f…Àu  é:þÿÿƒì·ÀPjjjh@WèüÿÿÿƒÄ ëÙƒì·,Pjjjh€WèüÿÿÿƒÄ¶0PjjjhÀWèüÿÿÿƒÄ érÿÿÿƒì¶Pjjjh@|$WèüÿÿÿƒÄ¶Pjjjh€WèüÿÿÿƒÄ é1þÿÿ‰ö <„«<„”<„}<„f<„O<„8Çôƒìjjÿ5jh€t$VèüÿÿÿƒÄ €=u^³ƒìjjhôj¶Ãÿ4…€îVCèüÿÿÿƒÄ €û vÙ€=uƒìjjhôjhVé»þÿÿƒì·Pjjjëâƒìjj»·ÿ4ƒjhÀVèüÿÿÿƒÄjj·ÿ4ƒjhVèüÿÿÿƒÄjj·ÿ4ƒjh@VèüÿÿÿƒÄjj·ÿ4ƒjh€Vèüÿÿÿ¡ ƒÄ ƒø‡Åÿ$…àîÇ ¸ ƒìjjPjhÀVèüÿÿÿƒÄjjÿ5jhVèüÿÿÿƒÄ·Pjjjh@VèüÿÿÿŠƒÃƒÄ €=t<ƒì¶ÃPjjjh€VèüÿÿÿƒÄ·PjjjhÀVèüÿÿÿƒÄ é‹þÿÿfƒ=uºèüÿÿÿˆÃë±Ç ¸ é=ÿÿÿÇ é)ÿÿÿÇ% éÿÿÿÇ ¸, é ÿÿÿÇ0 ëêÇ5 éÄýÿÿÇ: éµýÿÿÇ? é¦ýÿÿÇG é—ýÿÿÇK éˆýÿÿÇP éyýÿÿèüÿÿÿé¯úÿÿ‰öUWVSƒì\ < ‡\<„&ƒì jèüÿÿÿÇ$èüÿÿÿÇ$@èüÿÿÿÇ$€èüÿÿÿŠ¶ÂƒÄƒø„ƒøŽ8ƒø„ƒøtQ€út>ƒìBˆh\$ Sèüÿÿÿƒì Sèüÿÿÿ·ÀƒÄPSjj!èüÿÿÿƒÄ ƒÄ\[^_]ÃÆèüÿÿÿëê1Û‰æl$ 1ÿ1Ò‰àvBÆ @fƒú võº ·ÂBfƒú5ÆvòC0ÆD$&ÆD$ZˆD$ÆD$=ƒìUWèüÿÿÿ‰4$èüÿÿÿ·ÀŠˆT‰4$èüÿÿÿ·ÀŠˆT‰4$èüÿÿÿ·ÀÆDƒì Vèüÿÿÿ·ÀƒÄPVjj!CèüÿÿÿGƒÄ fƒû†XÿÿÿŠéòþÿÿ¶ €€Áàƒì·ÀÆPhèüÿÿÿ_]¶ Phèüÿÿÿ¶ [€^ÁàPhèüÿÿÿ¶#‰$èüÿÿÿ\$€=‰‰Ü…” %„Àt{Rj ¶ÀS·…Pèüÿÿÿ %ƒÄ<tB¶Àƒøtƒøt èüÿÿÿé6ÿÿÿ€=:uƒìhU ÿ5èüÿÿÿƒÄëÕƒìh[ ëæƒìhb SèüÿÿÿƒÄ %ë¦Qj ShKèüÿÿÿëæ %ékÿÿÿ…À…Îýÿÿ€=:Æ„®¸j £èüÿÿÿƒì ¶WPèüÿÿÿ¶6ƒÄƒøŽmƒø„UÇo èüÿÿÿ¶7…À„(ƒø„Çv èüÿÿÿƒì 1À€=1”ÀPèüÿÿÿƒÄ€=/„Ò¸… £èüÿÿÿ€=2„¬¸Š £èüÿÿÿƒì ¶,Pèüÿÿÿ¶-‰$èüÿÿÿ¶.‰$èüÿÿÿƒÄ€=3t\¸£èüÿÿÿ 4<t5<t"<tÇ éSþÿÿÇ– éDþÿÿÇé5þÿÿÇ  é&þÿÿ¸­ 뢸· éOÿÿÿ¸¾ é)ÿÿÿÇÄ éëþÿÿÇÇ éÜþÿÿÇË é¦þÿÿÇÐ é—þÿÿ¸Ô éMþÿÿ 5<„²<„›Çèüÿÿÿ X<„p<„YÇèüÿÿÿ¶8ƒø‹t‡ÿ$…ïÇÚ ƒìjRÿ5jÿ5pD$PèüÿÿÿƒÄ¶9ÆPèüÿÿÿ¶‰$èüÿÿÿ¶‰$èüÿÿÿ¶‰$èüÿÿÿ¶‰$èüÿÿÿ¶‰$èüÿÿÿ^_¶PhèüÿÿÿY[¶PhèüÿÿÿXZ¶PhèüÿÿÿƒÄéÒûÿÿÇå é-ÿÿÿÇð éÿÿÿÇý éÿÿÿÇ éÿÿÿÇ éñþÿÿº! Ç% éÝþÿÿÇ2 é¢þÿÿÇ; é“þÿÿÇD é`þÿÿÇL éQþÿÿƒì jèüÿÿÿÇ$èüÿÿÿÇ$S èüÿÿÿÇ$h éÕùÿÿèüÿÿÿé7úÿÿ‰öƒì ¡¶ƒú0t$ƒú0|ƒú9~ÆèüÿÿÿƒÄ ÉöƒÄ éüÿÿÿ@£ëÞŠD$<w ¶À¶€Ã1ÀÃUWVSƒì‹l$,Uèüÿÿÿ1ö1ۃĄÀ¿ˆÁt(¶ÁŠT(ÿBÐ< w.ƒâ„ÛtÁçf¶Âf¯ÇÆCþÉuÙ‹D$$f‰0¸ƒÄ [^_]ÃB¿<vBŸ<w ˆÐƒàP ë½1Àëۃ졀8?t èüÿÿÿƒÄÉö@£ ™ÀèÆ$0ÆD$1¶Àƒì PèüÿÿÿˆD$ ™ƒà¶À‰$èüÿÿÿˆD$ÆD$XZjD$ PèüÿÿÿƒÄ량öƒì ¡¶@ƒúN£t èüÿÿÿƒÄ ÃƒÄ éüÿÿÿVSƒì$fÇD$ÿÿfÇD$ t$ Pj D$Pÿ5èüÿÿÿ·Ð‰ƒÄ€:,„׋€:,tl·D$ PVjjeèüÿÿÿf‹D$ƒÄfƒøÿt@fÁèƒì ¶ÀPèüÿÿÿˆD$ ^f‹D$ƒà¶ÀPèüÿÿÿˆD$!ÆD$"Y[jD$PèüÿÿÿƒÄèüÿÿÿƒÄ$[^ÃvB£1Û€zt#L$¡ŠˆP‰AC€xt€ûvá¶ÃÆDƒìFPD$PèüÿÿÿƒÄ„À…=ÿÿÿèüÿÿÿ뙉öB£ŠB1Û„Àt,<,t(L$¡ŠˆP‰Š@AC„Àt <,t€ûvÜ¶ÃÆDf|$ ‚tƒìVD$PèüÿÿÿƒÄ„À…ÂþÿÿëŽPj FPD$PèüÿÿÿƒÄé§þÿÿ‰öéüÿÿÿvƒì ‹ ¶AƒúU£t èüÿÿÿƒÄ Éö¶QAƒúD£t ƒÄ éüÿÿÿvPjjjèüÿÿÿƒÄëÍvWVSƒìP‰ç‰âŠ\$`Æ$ƒìh} Rèüÿÿÿ‰<$èüÿÿÿ·ÀƒÄ j8R¶ÛSèüÿÿÿXZh Wèüÿÿÿ‰<$èüÿÿÿ·ÀƒÄ 8jRÿt$pèüÿÿÿ[Xh‘ Wèüÿÿÿ‰<$èüÿÿÿ·À8 ˆ BˆBÆ‹ ƒÄ…ÉtVˆÐ‰ù(ȶȋ9Ês7 Ç¶ØRSWÿ5èüÿÿÿ¡ƒÄ`[^_Ãv)ʉëΉö‰Ðf)ø·ÀPWjj!èüÿÿÿëÕvUWVSƒì|‹´$1íþ@‰ã‰çÆ$„<ƒìh“ Wèüÿÿÿ‰$èüÿÿÿ·ÀʃĄÀt ‰ê€ú†Õ‰è„À„«ƒìh© Wèüÿÿÿ‰<$èüÿÿÿ·À8 ˆ CˆCÆ‹5ƒÄ…ötW‰úˆØ(жȋ9Ês8 Ç¶ØQSWÿ5èüÿÿÿ¡ÄŒ[^_]Ã)ʉë͉ö‰Øf)ø·ÀPWjj!èüÿÿÿëÔvƒìh¬ Wèüÿÿÿ‰<$èüÿÿÿƒÄé7ÿÿÿ‰öRjS¶ÀPèüÿÿÿ‰<$èüÿÿÿF·À8ŠEƒÄ„À„ÿÿÿ‰ê€úvÏéõþÿÿ‰öƒìh® é¿þÿÿvVSV‹T$‹t$‹D$…Ò‰5£t ‰Ç…ö„˜ƒ=„èüÿÿÿƒìj jèüÿÿÿƒÄ€=…0¡8…À„Š€)ï„À…í€=(„ö =„À…Ó¡ƒø„½…À„¡ƒì h@èüÿÿÿÇ$VèüÿÿÿƒÄƒ=tHÆ<ƒì¶<Pj`èüÿÿÿƒÄ…ötY[^ÃÇÇD$ÇD$[[^éüÿÿÿ‰ö¶(Š€$ï„Àt¢<ë§€=už¡8…Àu•Æ<댃ìjjèüÿÿÿƒÄéKÿÿÿƒìjëêƒì¶ÀPjèüÿÿÿƒÄéÿÿÿƒìjëêvƒìjëà =„À… ¡ƒø„õ…À„ÙƒìjjèüÿÿÿÇ$@èüÿÿÿÇ$Vèüÿÿÿf¶ƒÀƒÄ€=„‚ƒì·ÀPjèüÿÿÿY[·PjèüÿÿÿXZ·Pjèüÿÿÿ ƒÄ<t <t„À…ƒì·Pjèüÿÿÿ ¶ÐƒÄƒúw&ÿ$•Hïƒìj j èüÿÿÿXZj j!èüÿÿÿƒÄ <„ø<„Ú<„ª»·ƒì·CPj&èüÿÿÿX·Z·CPj'èüÿÿÿYX·$Pj2èüÿÿÿXZ·&Pj3èüÿÿÿYX··CPj4èüÿÿÿX·Z·CPj5èüÿÿÿ¡ ƒÄƒø‡ÿ$…dïƒìjj@èüÿÿÿY[¶PjAèüÿÿÿXZ·PjCèüÿÿÿY[jjDèüÿÿÿXZ¶>PjBèüÿÿÿY[·PjVèüÿÿÿXZ· PjWèüÿÿÿY[·PjXèüÿÿÿXZ·"PjYèüÿÿÿéýÿÿvƒìjj@èüÿÿÿY[j늃ìjj@èüÿÿÿY[¶PjAèüÿÿÿXZ·PjCëʃìjëÓƒìjj@èüÿÿÿXZ¶PjAèüÿÿÿY[·PjCèüÿÿÿXZh€éÿÿÿ‰öƒìh€ j"èüÿÿÿY[h@j#èüÿÿÿƒÄé1þÿÿv –ƒà„Àt̃ìh@ëʃì h èüÿÿÿƒÄfƒøv+ƒì h èüÿÿÿƒÄfƒø‡èýÿÿ·Àƒì·„:ïPë—·Àƒì·„:ïPj"èüÿÿÿƒÄ뺃ìj j èüÿÿÿY[j é€ýÿÿƒìj j èüÿÿÿXZhéhýÿÿƒìj j èüÿÿÿY[jéSýÿÿ –ƒà„Àtƒìjj èüÿÿÿXZjé2ýÿÿƒìj ëéƒì¶PjèüÿÿÿY[¶PjèüÿÿÿƒÄéÇüÿÿfƒ=…püÿÿèüÿÿÿéfüÿÿƒìjjèüÿÿÿƒÄéüÿÿƒìjëêƒì¶ÀPjèüÿÿÿƒÄéßûÿÿ‰öèüÿÿÿézúÿÿƒì jèüÿÿÿƒÄéVúÿÿSƒì8‹‰ÐƒÂ‰¶HXƒù=‰Ú‰toƒù?tSÿ‰èüÿÿÿƒÄ8[Ãv <v °Æƒì¶Àÿ4…\$Sèüÿÿÿ‰$ÇèüÿÿÿZY·ÀPSèüÿÿÿèüÿÿÿƒÄë§v€x?tOSj D$PRèüÿÿÿƒÄf…À‰Âtfƒ|$vƒìjjÇèüÿÿÿ뺊D$¢·ÂéJÿÿÿƒìhé \$Sèüÿÿÿ‰$ÇèüÿÿÿZY·ÀPSèüÿÿÿÿécÿÿÿSƒì(¡¶‰Ãƒú=@£„™ƒú?t€xÿ;Pÿt‰èüÿÿÿƒÄ([Ãvƒì‹D$8ÿ4…\$ SèüÿÿÿŠL$@¶ŠÓøƒÄƒàtAƒìh* Sèüÿÿÿ‰$ÇèüÿÿÿZY·ÀPSèüÿÿÿ¡ƒÄ€8;u@£ë…ƒìh¬ 뽊C<1„Á<0„Ž SèüÿÿÿƒÄéNÿÿÿƒìhB ë衃øvƒø w ƒìhF ëσìhK ëŃø…ÿÿÿƒìhO ë²=‡tÃ=‡ =‚éÛþÿÿ=ˆt=‰ëʃìhS 낃ìhX Sèüÿÿÿƒì Sèüÿÿÿ·ÀƒÄPSjj!èüÿÿÿƒÄéÉþÿÿƒìhG ë΃ìh\ ëăìh` 뺉öƒìhð \$ Sèüÿÿÿ¡ƒÄƒø‰Þt-ƒø…Öýÿÿƒìh Vèüÿÿÿƒì Vèüÿÿÿ·ÀƒÄPVé™ýÿÿƒìhd ëÚƒìhõ \$ Sèüÿÿÿ^X¶ÿ4…üÿÿÿéQýÿÿSƒì(‹¶Jƒø=‰Ó‰ „׃ø?t€yÿ;Aÿt£èüÿÿÿƒÄ([Éöƒìhi \$ Sèüÿÿÿ 9ƒàƒÄ„À„†ƒìho SèüÿÿÿŠ9ˆÐƒàƒÄ„Àt\ƒâ„ÒtKƒìhr Sèüÿÿÿ‰$ÇèüÿÿÿZY·ÀPSèüÿÿÿ¡ƒÄ€8;…kÿÿÿP‰é]ÿÿÿƒìh* 볃ìh¬ 멃ìht éuÿÿÿŠCƒè0<w€y,tv€9?tƒìjjÇèüÿÿÿƒÄéÿÿÿƒìhw \$ Sèüÿÿÿ‰$ÇèüÿÿÿZY·ÀPSèüÿÿÿ¡P‰ƒÄ€x;…¾þÿÿPéNÿÿÿŠAƒè0<w€S‰€{0t^€ 9‹J‰ ŠB<0t8<1t"€ 9 Q‰€y;…bþÿÿQéòþÿÿ 9ƒÈƒà÷¢9ëÓ€%9óëÊ€%9ýë ‰öSƒì(¡¶Hƒú4‰Ã‰ „¸ƒú4|ƒú=„†ƒú?t€yÿ;Aÿt£èüÿÿÿƒÄ([Ãìhˆ \$ Sèüÿÿÿ 9ƒàƒÄ„Àt<ƒìh Sèüÿÿÿ‰$ÇèüÿÿÿZY·ÀPSèüÿÿÿ¡ƒÄ€8;uœ@딃ìh¬ ë‰ö€{3„â€90„¢€90tv€9?tƒìjjÇèüÿÿÿƒÄéWÿÿÿƒìh‘ \$ Sèüÿÿÿ‰$ÇèüÿÿÿZY·ÀPSèüÿÿÿ‹B£ƒÄ€z;…ÿÿÿBéúþÿÿ€y,t„A€%9ý£€y;…àþÿÿAéÓþÿÿ€y,…Tÿÿÿ€y0…JÿÿÿA€%9ý£€y;…«þÿÿAéžþÿÿ‰ö€y,…ÿÿÿ€y0… ÿÿÿC€ 9£€{;…tþÿÿCégþÿÿvC£€{4…çþÿÿèüÿÿÿéRþÿÿSƒì8¡¶Pƒù=‰Ã‰„ˆƒù?t€zÿ;Bÿt£èüÿÿÿƒÄ8[ÃvƒìhŸ \$ Sèüÿÿÿ 9ƒàƒÄ„Àt<ƒìh Sèüÿÿÿ‰$ÇèüÿÿÿZY·ÀPSèüÿÿÿ¡ƒÄ€8;u™@둃ìh¬ ë€{3„Ò€:0„’€:0tv€:?tƒìjjÇèüÿÿÿƒÄéUÿÿÿƒìh¦ \$ Sèüÿÿÿ‰$ÇèüÿÿÿZY·ÀPSèüÿÿÿ‹B£ƒÄ€z;…ÿÿÿBéøþÿÿ€z,t„B€%9û£ë×€z,…dÿÿÿ€z0…ZÿÿÿB€%9û£€z;…¹þÿÿBé¬þÿÿ‰ö€z,…$ÿÿÿ€z0…ÿÿÿC€ 9£€{;…‚þÿÿCéuþÿÿvSƒìH¡¶Hƒú=‰Ã‰ „̃ú?t€yÿ;Aÿt£èüÿÿÿƒÄH[Ãvƒìh¶ \$ Sèüÿÿÿ¶8ƒÄƒøwCÿ$… ïƒìh» Sèüÿÿÿ‰$ÇèüÿÿÿZY·ÀPSèüÿÿÿ¡ƒÄ€8;u’@늃ìhÁ ëƒìhÇ ë¸ƒìhÍ ë®ƒìhÓ ë¤ƒìh٠뚃ìhß ëƒìhå 놉ö€{1„2€90„õ€94„¸Šƒè2<w €y,„y€94„<€92„ÿ€93„€93tv€9?tƒìjjÇèüÿÿÿƒÄéÚþÿÿƒìhÀ\$ Sèüÿÿÿ‰$ÇèüÿÿÿZY·ÀPSèüÿÿÿ‹B£ƒÄ€z;…ŠþÿÿBé}þÿÿ€y,u„€y2…zÿÿÿ€y,…pÿÿÿ€y4…fÿÿÿÆ8A£€y;…EþÿÿAé8þÿÿ‰ö€y,…4ÿÿÿ€y0…*ÿÿÿ€y,… ÿÿÿ€y2…ÿÿÿÆ8ë³v€y,…÷þÿÿ€y0…íþÿÿ€y,…ãþÿÿ€y2…ÙþÿÿÆ8é|ÿÿÿ€y,…ºþÿÿ€y0…°þÿÿ€y,…¦þÿÿ€y6…œþÿÿÆ8éHÿÿÿ€y3…}þÿÿ€y,…sþÿÿ€y5…iþÿÿÆ8éÿÿÿ‰ö€y,…>þÿÿ€y4…4þÿÿ€y,…*þÿÿ€y6… þÿÿÆ8éèþÿÿ€y,…þÿÿ€y1…÷ýÿÿ€y,…íýÿÿ€y0…ãýÿÿÆ8é´þÿÿ€y,…Äýÿÿ€y0…ºýÿÿ€y,…°ýÿÿ€y1…¦ýÿÿCÆ8£€{;…ÊüÿÿCé½üÿÿvSƒì(¡¶Hƒú=‰Ã‰ „°ƒú?t€yÿ;Aÿt£èüÿÿÿƒÄ([Ãvƒìhë \$ Sèüÿÿÿ¶XƒÄƒøtPƒø~ƒøt<ƒìhñ Sèüÿÿÿ‰$ÇèüÿÿÿZY·ÀPSèüÿÿÿ¡ƒÄ€8;u@뇃ìhõ ë€=vu ƒìhù 믃ìhý 륉ö€{0„€91„Ù€93„¬€92tv€9?tƒìjjÇèüÿÿÿƒÄé$ÿÿÿƒìh \$ Sèüÿÿÿ‰$ÇèüÿÿÿZY·ÀPSèüÿÿÿ‹B£ƒÄ€z;…ÔþÿÿBéÇþÿÿ€y,u„€y2…zÿÿÿÆXA£€y;…£þÿÿAé–þÿÿ€y,…Jÿÿÿ€y1…@ÿÿÿÆXÆvë€y,…ÿÿÿ€y1…ÿÿÿÆXÆv란y,…ðþÿÿ€y0…æþÿÿCÆX£€{;…&þÿÿCéþÿÿvUWVSVŠD$ ˆD$¶À1Û1Òƒø ‹t$tgƒøt‹D$‰·Ã[[^_]ÊAÐ< w>½¿A¿<w!¯Õ¶ÁTÉCŠ 3AÐ< väA¿<vÝë¹v¯×¶ÁTÐëÝA¿<v»ë¡vŠAÐ1Û< w“¶|$¶Á¯×CTЊ3ˆÁAÐ< véérÿÿÿS숋ÇD$ ¶Jƒû=‰Ð‰ ‰Êt~ƒû?t€yÿ;Aÿt£èüÿÿÿĈ[Ãìh \$SèüÿÿÿXZ¶ÿ4…üÿÿÿSèüÿÿÿ‰$ÇèüÿÿÿZY·ÀPSèüÿÿÿ¡ƒÄ€8;u P‰땊@ûÿÿ…Ûtò‹ƒÿÿ¸ÓMb÷é‰ÐÁøÁù)ȃÀˆD$+éûÿÿ‰è„À…Rÿÿÿ€|$+…Aÿÿÿû@ƒ{þÿÿû_ …Û…kþÿÿ‰ò¶Êéâþÿÿû°„Ðúÿÿ…Û„ÈúÿÿéHþÿÿû,ëå‰ê„Ò…Ž€|$+u‰ø„Àu ‰ò€ú„k‰ê„Òup€|$+ui‰ø„ÀucFù<w\|$$Köýÿÿ|$$¿ ‹D$$…À…àýÿÿ|$$@8~ ‰ò€ú „Ëýÿÿ¸µN÷l$$‰Ñ‹D$$™Áù)ÑA¢éüüÿÿ‰úþÊ„©‰ê„ÒtL|$$ÀÚŠýÿÿ|$$_m ‹D$$…À…týÿÿ‹L$$é`m¸û*1÷é‰ÐÁøÁù)ȃÀ¢éŸüÿÿ€|$+„”üÿÿ|$$ÀÚ3ýÿÿ|$$ÿ| ‹D$$…À…ýÿÿ‹L$$é}¸ÓMb÷é‰ÐÁøÁù)ȃÀ¢éHüÿÿ‰è„À…Sÿÿÿ€|$+…Bÿÿÿ|$$@ƒÒüÿÿ|$$_ ùþÿÿ‹D$$…À…¸üÿÿéèþÿÿ|$$°t ‹D$$…À…üÿÿ‰ðéãþÿÿ=,tò…Àëèv‰Ó‰é×ûÿÿû` …àúÿÿéãúÿÿû°…ÄúÿÿéÒúÿÿ‰è„À…ƒ€|$+u‰ú„Òu ‰ð<„¬‰ê„Òuf€|$+u_‰ø„ÀuYFù<wRûKüÿÿû¿…Û…üÿÿû@8~ ‰ò€ú „îûÿÿ1ö…Û„]úÿÿ¸µN÷ë‰Ö‰ØÁþ™)ÖƒÆéDúÿÿ‰úþÊt‰è„Àu €|$+„-úÿÿû@ƒ¨ûÿÿû_ …Û…˜ûÿÿ1öé úÿÿ…Ûu©ëóû°é ÿÿÿû,éÿÿÿù` …ùÿÿéùÿÿù°…úøÿÿéùÿÿv‰è„À…€|$+u‰ú„Òu ‰ð<„«‰è„Àup€|$+ui‰ú„ÒucFù<w\ùK ûÿÿù¿…É…ùúÿÿù@8~ ‰ð< „çúÿÿ¸µN÷é‰D$‰T$ ‰ÈÁú‰T$™)T$ŠD$ƒÀ¢éuøÿÿ‰úþÊt‰è„Àu €|$+„^øÿÿù@ƒ–úÿÿù_ §…É…†úÿÿëù°é ÿÿÿ=,t…À…júÿÿ‰ð룉ö‰Ë‰ éøÿÿƒú1…"÷ÿÿÆD$)é&÷ÿÿÆD$)é÷ÿÿ€z5…röÿÿ€z6…höÿÿÆD$+1í¿1öÆD$*Z‰éköÿÿ€z2…4öÿÿ€z1…*öÿÿ1í1ÿ¾ÆD$+ëÉ€z2…öÿÿ€z2…üõÿÿZÆD$+ÆD$*‰1í1ÿ€zB¾… öÿÿ¾Z대z2…¹õÿÿ€z3…¯õÿÿ1í1ÿ¾ÆD$+é]ÿÿÿ€z3…ˆõÿÿ€z2…~õÿÿZÆD$+ÆD$*‰1í1ÿ€zB¾ … õÿÿ¾ ë’v€z3…;õÿÿ€z4…1õÿÿ1í1ö¿ÆD$+éñþÿÿ€z9… õÿÿ€z0…õÿÿZ‰€zCt½1ö¿ÆD$+ÆD$*é*õÿÿZ‰ëÚv€z9…µôÿÿ€z2…«ôÿÿY½1ö¿‰ÆÆD$+ÆD$*éãôÿÿƒìh \$fƒûUuƒìhá WèüÿÿÿXZPWèüÿÿÿZY·ÀPWèüÿÿÿYXhÓ WèüÿÿÿƒÄéXÿÿÿfƒûUtÂfÇD$ ƒìëÆƒìh¬ WèüÿÿÿƒÄénÿÿÿfƒûU…%ÿÿÿƒì Wèüÿÿÿ·ÀƒÄ€|,t4ƒìhá WèüÿÿÿXZhã Wèüÿÿÿ‰<$èüÿÿÿZY·ÀPWèüÿÿÿé{ÿÿÿƒì Wèüÿÿÿ·ÀÆD/)ëÇf¡„f=t f=…Fþÿÿf=†R…7þÿÿéþÿÿWVS‹T$·ú1öƒÿ[‹L$»ÿwÿ$½$ðf…Éf¶5¤f¶¥u1öf9ñs‰ñf9Ùv‰Ùfƒú+vfƒúYt B¥fƒøwfƒút fƒútˆfƒú„‘fƒú[t[^_Ãv [€=™¢Ètj uƒàð< ¢vÇÆ<]é–úÿÿ€=…‰úÿÿˆé~úÿÿRjjjëšèüÿÿÿf…À…Lÿÿÿ €=u €=t$R¶ÀPjjèüÿÿÿƒÄÆÆéÿÿÿS¶ÀPjjëÚèüÿÿÿèüÿÿÿéØþÿÿèüÿÿÿéÁþÿÿ…À…¹þÿÿ€=tÆèüÿÿÿéŸþÿÿèüÿÿÿëè‰ö€=t ÆéþÿÿèüÿÿÿëíƒøSt^ƒøS+ƒø …gþÿÿ ¢èüÿÿÿfÿÆéEþÿÿƒøt=¯…5þÿÿèüÿÿÿé+þÿÿQjjjsèüÿÿÿƒÄéþÿÿSjjjsÇÆ<_èüÿÿÿƒÄ jjjsèüÿÿÿƒÄ jjjsèüÿÿÿƒÄ jjjsèüÿÿÿèüÿÿÿëªèüÿÿÿÆÆé±ýÿÿèüÿÿÿèüÿÿÿ‰ð¢ Ñà€|$Æ¢tÆZ[^éüÿÿÿ‰öƒÈ¢ëå‰ö‰ð€|$Æ¢u΃Ήð¢ëÂvÆéyÿÿÿ€=uëédÿÿÿ‰öèüÿÿÿ€=…;ÿÿÿX[^ÉöUWVSV‹L$‹D$y‹\$ 1öˆ1íO1À‰Úâÿf‰T$u‰ê„ÒtfÁl$ŠT$ˆ½AF@Áã<vЉðˆ[[F^_¶À]ÃVSPŠD$€=ˆD$¾„“þÈ„{€=„bƶÁà ˆFÆF¯ÆF‚ÆF€ÆFÆF ÆF Š€|$…€=„ ÆF ÆF P¶ÁàPjh èüÿÿÿX ¶ƒÄ ÁàP¶ÃjPèüÿÿÿÃÄ€=k„™P¶P¶ÃjPèüÿÿÿÃƒÄ ¶P¶ÃjPèüÿÿÿÃCúƒÄÆFˆF€|$„=€=„0€=„# –ƒà„À…Š9ˆÐƒà„À…ƒâ„Ò„Ö¶ÃCÆD0ð¶ÃCÆD0¶ÃCÆD0¶ÃCÆD0¶ÃCÆD0¶ÃCÆD0V¶ÃCÆD04¶ÃCÆD02¶ÃCÆD0¶ÃÆD0C€|$„‚¶Ó ˆD2C¶ÃCÆD0¶ÃÆD0C€|$„B¶Óf¶ˆD2C¶Ó ˆD2C¶ÃCÆD0¶ÃÆD0C€|$„û¶Ó ˆD2C€|$u <„Î<„ºv€|$t €=„ð –ƒà„À…ˆŠ9ˆÐƒà„À„̓â„҄¶ÃCÆD0ÿ¶ÃCÆD0@¶ÃCÆD0¶ÃCÆD0V¶ÃCÆD04¶ÃCÆD04¶ÃCÆD0A¶ÃCÆD0¶ÃCÆD0¶ÃCÆD0B¶ÃÆD0C€|$„ú„Ñ€ú„º¶ÃˆT0C¶ÃCÆD0C¶ÃÆD0C€|$„¶Óf¶ˆD2C¶Ó ˆD2C¶ÃCÆD0D¶ÃÆD0C€|$„/¶Óf¶ˆD2C¶Ó ˆD2C¶ÃCÆD0E¶ÃÆD0C€|$„è¶Ó ˆD2C¶ÃCÆD0F¶ÃÆD0C€|$„±¶Ó ˆD2C¶ÃCÆD0G¶ÃÆD0C€|$tx¶Óf¶ˆD2C¶Ó ˆD2C¶ÃCÆD0H¶ÃÆD0C€|$t/¶Óf¶ˆD2C¶Ó ˆD2Cˆ^ÆX[^éüÿÿÿ¶ÃCÆD0?¶ÃÆD0ÿëÚ¶ÃCÆD0?¶ÃÆD0ÿë‘¶ÃÆD0ÿéNÿÿÿ¶ÃÆD0ÿéÿÿÿ¶ÃCÆD0¶ÃÆD0ÿé×þÿÿ¶ÃCÆD0¶ÃÆD0ÿé‡þÿÿ²Æé8þÿÿ²Æé*þÿÿ¶ÃÆD0é$þÿÿŠ9é€ýÿÿÆé=ýÿÿÆé1ýÿÿ¶ÃÆD0 éýÿÿ¶ÃCÆD0¶ÃÆD0éÄüÿÿ¶ÃÆD0é}üÿÿŠ9éõûÿÿPj¶ÃjPèüÿÿÿƒÄ ÃjénûÿÿÆF ‰éïúÿÿvÆé™úÿÿ€=uëé„úÿÿ‰öX[^à9ƒà„À‹T$tŠB<@tÃBŠBf‰T$f‹Ff…Òf‰uÕ„Û„6ûÿÿ€=u f;… ûÿÿ1ÿ1Ûéûÿÿ‰öf…ÒtҷŠL$8ˆuóë¿f‹ë߃ì ¶D$PèüÿÿÿˆD$ƒÄé«úÿÿUWVSƒìŠD$8„À‹l$4ˆD$tofƒý vi‹T$0ÆD$ÆD$f¶BþL$€=¾f‰D$‰T$0„Ñ€=„x¶D$ƒø„&ƒø~/ƒøuèüÿÿÿ€|$tfƒý w—¶D$ƒÄ[^_]Ã1ÀÆëí…Àuñ 1ö8ÆD$ÆD$ÆrÆf¡f£Æ€|$…1f¡f…À…–f¶D$ff¶Ðf£fÇD$ÆD$ÆÆ€|$…à‰ó„Û„<f‹·ÃŠT$ˆŠT$ˆ‹T$âÁâf‰”f‹f‰”‹D$f9D$‰Ù„È·D$f‰œ¶5‰ò„Òf‰ u9Y·· ·ÃTÿ9Ðf‰~ ¾Æ‰ñ„É„æf¡·È·f¿L ÿf‰D$C·Ã9Èf‰~ f‹\$f‰·óf‹”6‰Ð%ÿf…Àt fOuÊéDþÿÿf…ÿ„;þÿÿâðÿÿfÁêf¶† ·Ñf‹¼‰ø%ÿf9Ø„º‰Ááÿf9œ ¿t¿¸· Hf9Ht fOuòé×ýÿÿf…ÿ„Îýÿÿ¸·Óf‹Pf‰H·Ãf¤ÿÆ€€=t&f¶D$ff¶Ðf£Æ‰ö€|$„Výÿÿf¡€=f£”é7ýÿÿçðÿÿf ¼6f‰¼éxÿÿÿ·T$f‹„%ðÿÿ Øf‰„é$þÿÿfÇé]ÿÿÿf‰D$f‰D$·Àf‹„Š %ÿAf…ÀˆL$ ˆ f£¿t=¿¹f‹·ÂŠ\$8˜sf‹Af…Àf‰T$f£t fOuÒéüÿÿf…ÿ„†üÿÿf¡f…À‰Ât·ÀŠL$8ˆt]€=t;€|$tf;t"€|$…ËþÿÿŠ\$ :†Ðüÿÿ1öéÉüÿÿ1öÆD$ëÕ€|$t ÆëµÆD$1öëîÆD$ëœv ‹ˆ¡@;£r ¡£Š ˆÈƒÀ3MˆL$¢éüÿÿŠ\$:ˆ\$t0¡ŠT$ˆ¡@;£r ¡£MéÊûÿÿ‰öÆéYûÿÿƒì D$&PèüÿÿÿƒÄ„À„Aûÿÿf¶f‹\$f9Ãsb·ÃƒøÆD$tKƒø~(ƒø…Èûÿÿ @:¢†±ûÿÿéûÿÿv…À…¡ûÿÿÆD$èüÿÿÿÆé‹ûÿÿèüÿÿÿéûÿÿ ˆD$‰Ø%ÿff‹‰Áf£·f‰T$H·Ó9©úÿÿfûv*·Áf‹”âðÿÿfÁê¶€â„xúÿÿ¶1öƘÿÿÿÿ¿‰ö·ÉŠˆf‹OâðÿÿfÁêf¶‰ÑKFfÁtûsÎû‰ñ’ˆ CŠˆÂˆD$:„ô¡ˆ¡@C;£r ¡£¶ÿÿÿÿM9ÃwŠ뺀|$…„ýÿÿfƒ|$„xýÿÿ·D$f‹„%ÿ‹T$f…Àf£f‰T$¿t=¿¹f‹·ÂŠ\$8˜sf‹Af…Àf‰T$f£t fOuÒéFùÿÿf…ÿ„=ùÿÿf¡f…Àt·ÀŠT$8tŠL$ƒñ‰Îé¯ùÿÿÆD$ëëvB3¢éÿþÿÿÃvƒìhjhÇfÇÇç?ÆfÇ@fÇÇÆèüÿÿÿÆÇƒÄÃì èHÆÆÇÆfÇ ÆÇÇƒÄ é=ÿÿÿÆÃSƒì¡ƒø‡6ÿ$…(öv¡…À„äƒì P芃ĄÒu8f¡f9rǃÄ[Ãvƒìj·Pè^ƒÄë×f¶Âf‹f)Ãì ¶ÂP计‹ƒÄ…Àthƒì£·Û¶PƒP赃ăì¶PSèý‰Á¡‹ƒÄ…Òt‹…Òu‰¡‰AéRÿÿÿ‰Jëî‰éFÿÿÿ·Û뵡ƒì ¶@ÿP襃Äéÿÿÿ f¶Ðf‹f)Óƒì ¶ÀéFÿÿÿ‰öƒì jè¦þÿÿéÿÿÿƒì €=tƒÄ Ãè“þÿÿ @ƒì¶ÀPjèÇ ƒÄ€=ÆtСŠˆ¡ÿþ@ÇÆ뢉öSƒìŠ€úŠ\$tA€=t,f¶Ã …Bƃì¶ÀP·ÁPèC ƒÄ[Éöf¶Ã BëÝ„Ûy» @ƒì¶ÀPjÆè ƒÄÆŠëŽvSƒìºó?+T$Áú’‚‚‰ÁÁáȉÁÁáÈBXf;riŠBƒì¶ÀPjè¯ ·ŠÑàBƒÄf9ÃÆˆf£sÄBƒì¶ÀP·ÃÑàƒÈ·ÀPèi ƃÄ[Êëуì f‹Bàfƒø± vfƒúN± vfúޱ v fúÿ± w A¢ƒÄ Ãì jè¾üÿÿƒÄëíƒì ŠT$€útxBþ<w-f¶ÂTþ°ÁâƒìƒÊ¶ÀP·ÂPèÕ ÆƒÄÉöBû<wf¶ÂPûÁâ° ëÈvBó<ðwf¶ÂTæƒÊÁâ ë©ÇD$ƒÄ é4üÿÿº°ëv¡‹T$ÇÇ@f‰P‹T$ˆP fÿƒ- ÃSƒì¶\$‹…Àt8Ç£ÆÇÇfǃÄ[Ãìj·Pèrÿÿÿ‰‰\$ ƒÄ[éRýÿÿ‰öUWVSSŠD$‹ˆD$·C¸Ç¶l$ŠC :D$r_‹t$‰éü9íó¦’À—Â(¾…Àºt81Ò…Àx2‹C…Àt‰£‰Ã·@¸ë²1Ò‰ÇY[^_‰Ð]öȋt$ü9Éó¦—À’Â(Ð1Ò©€t©ëÙVSQ‹·B‹L$Š€8Á‰ÎtWÇ1Ò8Ár<8Á„¡‹P…Òt£·BŠ€‰ëÏ1ңDŽÒtU‹‹fÿ…À‰t£ÇÇ^[^Ãì RèwüÿÿƒÄÇÆëÝ¡ƒì ¶XþSèÇûÿÿXf¡ZHj·ÀPè¿ýÿÿ‰Â‹ƒÄ…Àu"‰‰ò¶ÂljD$X[^é½ýÿÿ¡…Àu‰¡‰BëˉPëñºé&ÿÿÿSƒì‹·B‹L$Š€8ÁˆËtVÇ1Ò8Ár<8Á„Ì¡‹P…Òt£·BŠ€‰ëÏ1ңDŽÒte‹fÿ€z tÆÇƒÄ[Ë…À‰t£ÇëÞƒì Rè#ûÿÿƒÄÇÆ뿃ì ÿ5èÿúÿÿ¶ÃÇÆ‰D$ ƒÄ[éêºé^ÿÿÿWVS¶t$‹Š·{¶Ê‰ð:„9t+Bƒì¶À÷ÑP Qè¾üÿÿƒÄ„Àto‹ŠBˆfÿ:S r,‹…À‰t$£ÇÆÇ[^_Ãì Sè7úÿÿƒÄÇÆë݃ì ÿ5èúÿÿ‰òƒÄ¶Â‰D$[^_Çé¼Sƒì‹f¶B fBŠ\$·À:˜tnf¡f9r¶ÃljD$ƒÄ[é]ûÿÿf¡ƒìHj·ÀPèûÿÿ‰Á¡‹ƒÄ…Òt‹…Òu ‰¡‰A몉Jëñ‰ë¡f¡f;s’@f£ÆÇƒÄ[ÃVSP¡f¶P Š fPf¶Á¶t$·Ò‰ð:‚„­ƒì ¶Áf¶ÙP÷Ófèàùÿÿ¡‹ƒÄ…Àt~ƒì£·Û¶PƒPèçúÿÿƒÄƒì¶PSè/úÿÿ‰Á¡‹ƒÄ…Ût7‹…Òu%‰¡‰A‰ò¶ÂljD$Y[^é úÿÿ‰JëØv‰ëÙ·ÛëŸvf¡f;ƒ@ÿÿÿ@f£A¢^[^Éö¡£¡W£¡V£1ÿ €=Spôt €= „1¡‰ò8Pƒ;¡;„!‰öŠ@;£r ¡£…ÿ…Ö¡ˆ¡ÿfÿfÿ…À„šƒø„}ƒø„cƒø„Iƒø„/ƒø„ƒì jè÷ôÿÿƒÄ€=t!¡ˆ¡ÿþ@:„º‹¡ƒê@9Âv.··H9Â}·· ·)Ê9Ð|aèŒôÿÿ€=t3è²óÿÿ¡‰ò8Ps¡;…áþÿÿ[^_£Ã¡ëð @ƒì¶ÀPjè„ƒÄÆë­f¡f9v£è뜉ö¡Æ¡ÿþ@€3é$ÿÿÿ‰öƒì ¶ÃPèüüÿÿéäþÿÿƒì ¶ÃPè/üÿÿéÓþÿÿƒì ¶ÃPè>ûÿÿéÂþÿÿƒì ¶ÃPè!úÿÿé±þÿÿƒì ¶ÃPèÌøÿÿé þÿÿvƒì ¶ÃPè÷ÿÿéŒþÿÿvƒì ¶ÃPèüÿÿÿˆÃƒÄéþÿÿ¿éÅýÿÿfÇÆfÇ@fÇÆÇÃì è8ÇÆÇÆÆƒÄ ë–‰öÆÃì f‹Bàfƒøw ÆƒÄ ÉöfƒúNw ÆëëfúŽw ÆëÚfúÿw Æëʃì jèžÿÿÿƒÄë»WVS‹T$‹\$¶D$fúþ4v,9ófÇs·úf¡·À‰ú)Âúþ ‰ð(ضÀ[^_ÉöŠƒì ¶ÀPCèMƒÄ9ósÝf¡·À‰ú)ÂúþÕëÆvƒìh@jhèüÿÿÿƒÄ h@jhèüÿÿÿƒÄ hþjhèüÿÿÿƒÄ hÿjhèüÿÿÿƒÄèdñÿÿƒÄ é„þÿÿ€=‹D$ŠT$t3 Ð<¢vf‹ƒèB<¢f‰wìÃvÃvŠ ·ÀÓà  <¢vßv¡Šˆ¡ÿþ@ ƒèÁ-fÿ<¢wÆë ƒì ·€=…›·ƒè9Â|fÇfÇƒÄ ÃfÇ èÂðÿÿ @ƒì¶ÀPjèöþÿÿƒÄ€=Æt,¡Šˆ¡ÿþ@ÇÆÆé|ÿÿÿv·ƒÀ9ÂŽaÿÿÿfÇènïÿÿ¡ŠÇƈ¡ÿþ@¡Æ¡ÿþ@ÆéÿÿÿSƒì¡ƒøŠT$†Ž¶ÚŠˆÑÓãƒÂ  8‰ˆˆD$rWv¶L$¸ÓàHf#*T$·Àƒì ÓëPˆ‰èúŠ ˆD$ƒÄ8Á¢ˆÊr ‹뮉öƒÄ[Ãv…ÀuG:t3¡ˆ¡@;£r ¡£f¡@f£ë¹Çë­Huª„ÒtbþÊuM ‹ˆ¡@;£r ¡£f¡@€3f£ÇéUÿÿÿÇD$ ƒÄ[é˜ûÿÿè'ûÿÿÇÆé)ÿÿÿSƒì¡ƒø‹T$w6ÿ$…@öf…Òu¶ÇƒÄ[öÇëèƒì jè*ûÿÿ¸ƒÄëÔf‹1Éfûÿ?w-·ÃˆCf£¡;r ;‚ž1É1À…Ét¡ƒøthƒøt(Ǹ…Àt‡Ç¸éZÿÿÿ·f¶€Hf; w½f¡·Ðf‰œˆŠ@f£ëfƒ=v“f¡·Ðf‰œÆ‚ëÓˆ¡@;£r ¡£f¡@f£¹é.ÿÿÿfƒúv6f;‡Êþÿÿfúþ‡¿þÿÿƒì ·ÂPÇèQƒÄé%ÿÿÿ·ÂƒøÇtYƒø~'ƒøtƒø…ÿÿÿè?ùÿÿéöþÿÿÇéçþÿÿ…À…ßþÿÿÇÆè ùÿÿÇéºþÿÿ ˆÂƒâ„ªþÿÿ¶Ê(ÐÓ-¢é•þÿÿf…Ò…ôýÿÿÇ é|þÿÿf…Òt2 @fÑ%<¢wǶÀé³ýÿÿƒì jéÆýÿÿ @<¢w ÇëÓƒì jé¡ýÿÿf…Ò„iýÿÿÇ éþÿÿf…Òu¸Ç éSýÿÿ·ƒì·„jPè ƒÄƒ=tÇÇé«ýÿÿ·f¶€Hf‹Kf; wÄf¡·Ð@f‰œˆŠf£ë¤f…ÒuÇ éTýÿÿZ·ƒì·”¶ÃÂPRèjƒÄƒ=…Zÿÿÿ·f¶f¶Ã éjÿÿÿf…Òt¶ÇéLüÿÿ¸Ç é8üÿÿZé|ÿÿÿZ étÿÿÿWVSQŠD$ˆD$¡;‹\$r ‹9Ðr 1ÀZ[^_Éöf‹5£ ‰$¶D$·ÖŠÂ<1Àúÿ?‰=(‰ ,¾9ûsFŠ¡,ˆÿ,Š¡ ˆ¡ @C;$£ r ¡£ ;(rÂf‹5¡ f¶T$£f¡ÐÖf£f‰5¸éCÿÿÿ‰öVSP‹\$f¡f9Ãf‹5‚çf9Ã…"¡ƒø„ƒøtVƒøtf‰Ç[[^÷f¶€Hf; wÏf¡·Ðf‰´ˆŠ@f£ë¯·Æ1Òfþÿ?Šˆÿÿÿÿw*ˆˆFf£¡;r ;‚Å1Ò…Òtyf‹1Àfúÿ?w)·ÂˆˆBf£¡;r;rR1À…Àt<¡ƒø…ÿÿÿfƒ=†ÿÿÿf¡·Ðf‰´Æ‚éAÿÿÿvÇD$^[^é4õÿÿˆ¡@;£r ¡£f¡@f£¸ézÿÿÿˆ¡@;£r ¡£f¡@f£ºéÿÿÿ·¶·„ƒì)ÐRPè-ýÿÿƒÄ…À„Rÿÿÿ·ÆŠˆéËþÿÿ·Ã¶·„ƒì)ÐRPèñüÿÿƒÄéÙþÿÿƒì èüÿÿÿf¶wÆÆÆÆÆÆÆÆÆÆÆÆf£ÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÇƒÄ ÉöS1ÉŠ8Ùs&v¶Ñ’BÂ…)€ºt A8ÙrÝ1À[ÚÆ‚ÆC€=tG€‚ÆCÆC ˆC¶Ñ@¢’BÂ…)Š‚@ˆ‚‚ë ˆCëÆ‰öWVSQ€=„ƒ¿€=tF1ö ‰ò8ˆD$s5 ˆD$v‰ð¶Ð’BÂ…)À»tF‰ð:D$r×1ÀZ[^_Éú¶Â¶T$B‰Ñá)Ê8”uÒƒëÕ‰ö¿éxÿÿÿ‰ö€=t Æ1ÀÀ= t€=uêÆëá€= uåŠBþ<wØ 8ƒȈ „Àt¼:s¢€=„“€=„†Æ€=tm€=tdÆ€=tK€=tBÆ€=Æu €=t ƸÀ=•°(ТëåÆë¼ÆëšÆéuÿÿÿ¢é4ÿÿÿƒì èüÿÿÿf£ƒÄ ÉöSƒì·‹\$Pèüÿÿÿf9Ø“ÀƒÄ¶À[Ãì èüÿÿÿèüÿÿÿjjjjuèüÿÿÿƒÄ€=tÇƒÄ éüÿÿÿèüÿÿÿèüÿÿÿÇëâ‰öÇ éüÿÿÿSƒì¡ƒø w"ÿ$…€öèüÿÿÿèüÿÿÿèüÿÿÿljöºƒÄ‰Ð[ÃèüÿÿÿèüÿÿÿˆÃþËt]ƒì hèèüÿÿÿƒÄþÈuЊ  8A<ˆÊˆ t*<t&€ùw Çë£1ÒÆÇë“€úvÚëÓèüÿÿÿþÈtƒì jèüÿÿÿèüÿÿÿ1ÒƒÄéjÿÿÿ€=umÆÆÆÆÆÆÆÆ  @¢Æèüÿÿÿèüÿÿÿ1À€=•ÀƒÀ£éïþÿÿÆÆÆÆë­€=tèüÿÿÿèüÿÿÿ<ˆÃt/þÃtƒì hˆèüÿÿÿƒÄ1ÒþÈ„žþÿÿé”þÿÿÆé ÿÿÿèüÿÿÿþÈ…ýþÿÿèüÿÿÿèüÿÿÿèüÿÿÿÇé]þÿÿƒì h,èüÿÿÿƒÄ„À„Dþÿÿ ÇÆ¢ƒì jèüÿÿÿèüÿÿÿjjj¶j£èüÿÿÿƒÄ éùýÿÿèüÿÿÿèüÿÿÿ<ˆÃtkƒì hˆèüÿÿÿƒÄþÈtL€ût-ƒì hˆèüÿÿÿƒÄþÈt þÃ…´ýÿÿé1þÿÿÆé%þÿÿèüÿÿÿèüÿÿÿþèüÿÿÿé‰ýÿÿ€=tÝë© €=ÆÆÆÆÆ¢¢t-ƒì jÆèüÿÿÿèüÿÿÿÇèüÿÿÿƒÄéýÿÿjjjjyèüÿÿÿƒÄëÁèüÿÿÿþÈ…÷üÿÿƒì hèüÿÿÿƒÄ„À„ßüÿÿjjjjyèüÿÿÿÇ먉ö ÇÆÆÆÆÆ¢¢¢éUþÿÿèüÿÿÿèüÿÿÿ<ˆÃ„-€=„€=„úèüÿÿÿ€û„݃ì h¸ èüÿÿÿƒÄþÈ„‚ƒì hˆèüÿÿÿƒÄþÈ…üÿÿèüÿÿÿ€=…üÿÿ Š8Єíûÿÿ8Ðs:f¶À(Р@< ¢vÇ éºûÿÿˆé¯ûÿÿf¶ÀëÉ€=u €=t%ƃì jèüÿÿÿÆèüÿÿÿƒÄéGÿÿÿ ¢ëÖ€=…ÿÿÿë®èüÿÿÿéÿÿÿèüÿÿÿèüÿÿÿéàþÿÿÇ èüÿÿÿé¿þÿÿƒì jèüÿÿÿÇ$ÈèüÿÿÿƒÄþÈ…ûÿÿjjjj Ç èüÿÿÿéÎýÿÿƒì jèüÿÿÿÇ$dèüÿÿÿƒÄþÈ…ËúÿÿjjjÇ jëÁvSƒì¡‹ 9Ètjf‹ƒÀ;£r ¡£··ƒÀ9Â~ÇfÇ¡ƒø‡éÿ$…°öfƒût¡9Èu—ƒÄ[ÃÇëæfƒût1Àfƒû”À£ëÐÇëÄfƒûuÞfÇfÇ2fÇ0Æ4Çëf¡·Ð@fƒûˆšf£t.ƒì·2P¶ÃPèüÿÿÿf£2ƒÄ‹ ˆ4éFÿÿÿ€=4ÇuâÆ5ëÙfƒû„fƒûtUfƒûtCfƒûtÇÆ5éøþÿÿ€=5uáfÇfÇ2ÇëÍÇëÁƒì·2Pjfÿ èüÿÿÿf£2ǃċ ëƒì·2Pjèüÿÿÿf£2Çëш4f‰0ÇéQþÿÿ·ÃÁàf 0f;2f£0t.fƒû„9þÿÿfƒûtÇéþÿÿ€=4uèé7þÿÿÆÇéúýÿÿƒìjèüÿÿÿƒÄéüÿÿÿ S¢1Û €=¹ÆÆÆÆÆÆÆÆÆÆ Æ Æ Æ ÿÆ ÆÆÆ¢ÆÆÆ@ƲtF€=t @ˆA[ÆÃv ƒÀˆA¶ÂBÆD ¶ÂBÆD¶ÂÆDëÄ€=ÆÆÆt³€=tƒËˆ²넉ö‹D$¢¶ÀƒøÆÆ„áƒøpƒøtŠB¸ˆPÆà¢þÀÆÆÆtÆÆë¶ ÆÆ¢ Æëσøt+ƒøu‹ HÆÆÆ¢éfÿÿÿ ¢ÆÆÆÆÆ ¢ é)ÿÿÿ€=Æt H¢ ¢éÿþÿÿ‰ö H¢ ÆÆÆÆÆë•vUWVSƒì €=„˜ <ˆD$tf‹èüÿÿÿŠˆT$¶D$ƒø‡§ÿ$…Ìöf¶‰Ãfƒë±t@„Ûx<‰ö¶Á¶€ƒø ‡¹ÿ$…ìöA¶Á€¸u!ƒëƒÁvAf…Ût„ÛyƶD$ƒÄ [^_]øþëñA¶Á€¸uìA¶ÁŠ€ƒë¢ëÀA¶Á€¸uËA¶ÁŠ€ƒë¢ëŸA¶Á€¸uªA¶ÁAf¶¶Á¶€Áà ƒëf‰égÿÿÿvA¶ÁŠf¶Âf)ÉØXþÑéGÿÿÿA¶Á€¸…NÿÿÿA¶ÁŠ€ˆÂƒàƒâƒë„Àƈ•éÿÿÿA¶Á€¸… ÿÿÿA¶ÁŠ€ƒë¢éÞþÿÿfƒûtfƒû¸þ…Ùþÿÿ  ¢þÀ…Áþÿÿ  ¢é²þÿÿ¸ÿé®þÿÿ€=t'€=tèüÿÿÿŠˆT$é‚þÿÿèüÿÿÿé†þÿÿèüÿÿÿëÒfƒûtfƒû¸þ…bþÿÿ€=„S  Š ˆD$ ˆT$ ½ Š 8ȉǃf¶À˜8L$ ƒþf¶D$ f¶Áf9‚þÿÿf9Ú‡úýÿÿˆÐ(È€|$ ‰Æˆ…ÆÆN‰ðþÀ„¼ýÿÿŠ1É8шT$ s/‰è¶Ø¶Ñ’BÂ…)ŠD$ 8„t!A:L$ r×Nèüÿÿÿ‰òþÂuµ ˆD$écýÿÿþL$ ƂƂÆëˉú:T$ s*f¶ÂˆÐ*D$ (D$ ŠT$ ˆÆéOÿÿÿf¶ÒëÚf¶T$ éÿÿÿf¶Øéäþÿÿ Š ½ˆD$ ˆT$ é¨þÿÿfƒû¸þ…Öüÿÿƒì   @j¢èüÿÿÿèüÿÿÿƒÄ€= …þÿÿ ÆÆÆÆ¢¢¢èüÿÿÿéûþÿÿ‰öfƒû¸þ…aüÿÿ  :…Jüÿÿ@¢é?üÿÿƒì¶D$PèüÿÿÿƒÄ€=t ƒÄ éüÿÿÿ‰öƒÄ éüÿÿÿƒì ‹ …É„c€=t €= „¹ŠA@8Asg‹;tYŠ¡ˆ¡ÿÿþ@¡9r ‹‰‹ ŠA@8As‹;u§f¶Af¶Q@f9Âv/Æfÿ€=ÇtƒÄ éüÿÿÿƒÄ éüÿÿÿ‰öƒÄ ÊA@8As®‹;t vƒì ¶PB‰èüÿÿÿ‹ˆ¡ÿþ@¡ƒÄ9r ‹‰‹ ŠA@8Aƒ?ÿÿÿ‹;u”é,ÿÿÿvèüÿÿÿ…À‰Á£„Tÿÿÿ¶@D£éwþÿÿ‰öWVS‹|$€?„Øf‹O·G·Ñ)Ðt8‰Ëèüÿÿÿf…À‹‰Á‰„¡f…Ût0Šˆ‹BF;‰r ‹‰KfItf…ÛuЀ=t €= t1f…Û‰uÆfÇGþ¸[^_ÃvÆf‰_1Àëî¡9ÐtÆ€ @;r¡‹9Ðuåë©v‹ëŒfÿ €=t4ŠG:t fÿ"딊Wf¶Ú¶Â÷Óf_t8Æé÷þÿÿŠG ëÊvWVSQ¸1É1Ò€ºtiA€ùvæ ˆD$ 1ɺ1ö¿ˆD$€:t8AÂÆ€ùvé1ɸvAÆ€ùvòÆ1ÀZ[^_À|$t ŠZ:\$‰Ðu¶ëçŠ\7ëð‰öSƒì€=t3€=tƒÄ[Ãì hèüÿÿÿƒÄ„ÀuæèüÿÿÿÆë؉öèüÿÿÿ…À‰Ãtƒì PèüÿÿÿƒÄþÈ”À¶ÀH!À=tÅ…Ûu§èüÿÿÿ<wžƒì  j¢èüÿÿÿèüÿÿÿƒÄÆévÿÿÿUWVSƒì èüÿÿÿf=††1í€=„Ÿ€=„ƒ€=„e…í„U‹¶}¡fǃÃ1É9Ãur‹fǃÃ9Ãr‹fǃÃ9Ãr‹O‰úþÂt?ƒì·ÁP¶Pèüÿÿÿ‰Áf¶f‰ƒÃ¡ƒÄ9Ãr‹€>„±O‰úFþÂuÁfǃÃ9Ãr‹ƒì·ÁPjèüÿÿÿfÇ‹ƒÃƒÄ9Ó‰Ár‹f¶Áf‰ƒÃ9Ór‹fÁéf‰ ƒÃ9Ór‹€|$ uÆEÆE‰ƒÄ [^_]éüÿÿÿèüÿÿÿþ €=t ŠE¢ëЊEëôfǃÃ9Â?ÿÿÿ‹é4ÿÿÿƒÄ [^_]Ãèüÿÿÿ‰ÅÆD$ éŠþÿÿ½ÆD$ é{þÿÿ½ëïSƒìèüÿÿÿf=v€=tR€=tƒÄ[Éöèüÿÿÿ…À‰Ãtîƒì@P¶CPèüÿÿÿèüÿÿÿþ ƒÄ€=t ŠC¢ë¼ŠCëôƒìh¶PèüÿÿÿƒÄÆÆë‰ö€=t€=téüÿÿÿéüÿÿÿƒì ÆÆÆÆÆÆ`Æ0fÇ8ÇD%ÆèüÿÿÿƒÄ éüÿÿÿƒì €=‹D$yf¾·ÀƒÄ Ãì·ÀPÿt$èüÿÿÿ·ÀƒÄëã€=yf¾·ÀÃv¡;t'Š@;£r ¡£þ¶ÂÃv1ÒëõUWVSƒì  ƒà1ÿ„À‹l$ ‹t$$t31Ûf9÷r¸ƒÄ [^_]Ãv·Ãƒì ¶(PCèüÿÿÿƒÄf9órçëÕƒì·ÆPUèüÿÿÿ‰ÇƒÄÇD%èüÿÿÿ·Ç볉öƒì ‹D$€=f‰D$ yŠD$ ¢¸ƒÄ àƒà„Àtƒì ¶D$Pèüÿÿÿ¸ƒÄë׃ìjD$PèüÿÿÿÇD%èüÿÿÿ1ÀëÙ‰ö€=yf¾ ·ÀÃvf¾ëï‰öSƒì€=‹\$yˆ ƒÄ¸[Ãv‰Øƒàf…Àu ˆëá‰öèüÿÿÿ ƒà„ÀuåÇD%ëÙvƒì  ƒà„ÀÆtÆÀŠˆÐƒà„ÀˆÑt&f¡ƒà@f…Àt ƒÈ¢f˜·ÀƒÄ ÉöˆÈƒà„Àt#€=ùw¡9t  ƒÈëÇvƒá„Éu=ƒâ„Òt ƒà„Àtf¾¢ë¢v ƒÈ¢Æ뇉öèüÿÿÿf=¾w ƒ=D%tŠë§ ÇD%ƒÈéMÿÿÿ‹T$ˆÐƒà„ÀˆtN‰Ð%Àƒø@„ƒø@~=€tg=ÀtUfÇ8‰Ðƒà0ƒøt7ƒø~ ƒø tƒø0tfÇ:¸ÃfÇ:ëïfÇ:ëävfÇ:ëÖfÇ8ë©fÇ8ëžvfÇ8ëf¾·ÀÀ= ~ ÆÃv <~W<Æ Ã<Æ Ã<Æ Ã< ÆÃ<ÆÃ<0ÆÃ<`ŸÂ°(ТÃÆ ÃSƒì‹\$„Ûˆyƃĸ[À=„܉؃àƒø„ăøŽ©ƒø„–ƒì jèüÿÿÿ‰Øƒà8ƒÄƒøtxƒø[…ÀtƒøtIƒì jèüÿÿÿ‰ØƒàƒÄf…Àt+ƒì jƒã@èüÿÿÿƒÄf…Ût èüÿÿÿémÿÿÿèüÿÿÿécÿÿÿ‰öƒì jëÓƒì j뵉öƒø(t ƒø8u¤ƒì j뢃ì j뛃ì j딃ì jéeÿÿÿ…À…Xÿÿÿƒì jéSÿÿÿƒì jéIÿÿÿÆèüÿÿÿéÿÿÿ‰öf¾·ÀÃSƒì‹\$‰Øƒàf…Àtn‰Øƒàf…Àt\èüÿÿÿ‰Øƒàf…ÀtEèüÿÿÿ‰Øƒàf…Àt.èüÿÿÿ‰Øƒàf…ÀtèüÿÿÿˆƒÄ¸[ÉöèüÿÿÿëçèüÿÿÿëÐèüÿÿÿë¹èüÿÿÿ뢉؃àf…Àtèüÿÿÿ‰Øƒàf…Àtèüÿÿÿë®èüÿÿÿë§èüÿÿÿëàSƒìèüÿÿÿ1Ûf=¾w»`€=ùw¡9tƒËf¡ƒà@f…Àu ƒÄ·Ã[ÃvƒËèüÿÿÿëë‰ö¸Éö ˆÂƒâð¶ÀˆøÉöf¾·ÀËD$¢¸ËT$ƒúŠD$wCÿ$•÷¶À‰D$éüÿÿÿ¶À‰D$éüÿÿÿ¶À‰D$éüÿÿÿ¶À‰D$éüÿÿÿ¶À‰D$éüÿÿÿÃvƒì ‹T$1Àƒúwÿ$•(÷èüÿÿÿ‰ö¶ÀƒÄ ÃèüÿÿÿëòèüÿÿÿëëèüÿÿÿëäèüÿÿÿëÝèüÿÿÿëÖèüÿÿÿëσìÿt$èüÿÿÿ¶ÀƒÄöD$‰D$éüÿÿÿ‰öƒì ÆÆÆfÇÆuÆ~Æèüÿÿÿ¢èüÿÿÿ¢èüÿÿÿ¢èüÿÿÿ£èüÿÿÿ¢ƒÄ ÃìhÅÆfÇøÆÆfÇ`fÇaèüÿÿÿƒàøƒÄ<`„©ƒì hÅfÇìfÇíèüÿÿÿƒàüƒÄ<ìt`ƒì hÅfǼfǽèüÿÿÿƒàüƒÄ<¼t1ÀƒÄ Ãì hÆèüÿÿÿƒÄ„Àu寯 Æ ¸ë˃ì hÆèüÿÿÿƒÄ„ÀuŒÆëÜvƒì hÆèüÿÿÿƒÄ<…?ÿÿÿëÚ‰öUWVSƒì ÆD$Æl$ 1Û¶|$‰öUÝj,¶ðVWèüÿÿÿƒÄf|$ ÁtC€ûvÚþD$€|$vÆ1ÀƒÄ [^_]ÃD$Pj.VWèüÿÿÿh¶PVWèüÿÿÿƒÄ h¶PVWèüÿÿÿf¡hf!¶PVWèüÿÿÿƒÄ f¡f!·D$ P·D$ PhÁh@èüÿÿÿ¸ƒÄÆé_ÿÿÿUWVSƒìLèüÿÿÿèüÿÿÿ‰ÃK¿ÿÿÿÿtX…ÿu0f¡f…Àt Š„Òu¿ÿÿÿÿƒÄL[^‰ø_]ËL$`f‰ˆQëêèüÿÿÿþÈ”À¶ÀH!Çt¾èüÿÿÿþÈ”À¶ÀH!Ç묻@t$QShÁVèüÿÿÿƒÄ…À…Cû\~ß…ÿtX1ÛRSh]VèüÿÿÿƒÄ…À…^CûÔ~ß…ÿt0»@‰öPSh]VèüÿÿÿƒÄ…À…+Cû\~ß…ÿ…ŠD$‹L$¢f‹D$f‰D$ f‰L$ ‹D$f‹L$f‰D$f‰L$ŠD$ŠL$f‹-ˆL$ˆD$»fÇfǶf‰l$1É1ö‹Dœ …Ât f…Éu}f‹L$!ÁKyéD$Pjf‰5¶t$ V¶\$Sf‰ èüÿÿÿf‹D$‰ÂƒÊf‰T$ƒÄf9Ât·ÂPjVSèüÿÿÿƒÄ·D$ P·D$P·D$P·D$PèüÿÿÿƒÄé,þÿÿf…öuˆ‰î!Æé|ÿÿÿèüÿÿÿþÈ”À¶ÀH!Çéþÿÿ1ÿé×þÿÿ1ÿé¤þÿÿ1ÿéuþÿÿ‹D$…Àt €=tÉöÆÇD$éüÿÿÿÆëàvƒì €=tƒÄ Ãì jèüÿÿÿƒÄëíƒìjèüÿÿÿ¸ƒÄËD$f=íw·À¶€Ãv1ÀËD$f=í‹T$w ·ÀˆÃƒì ƒ=t(ƒ=ÇtƒÄ Ãì jèüÿÿÿƒÄëì ™¢ë̃ì èüÿÿÿƒÄ éüÿÿÿƒì èüÿÿÿ1Ò„Àu‰ÐƒÄ Ãì jèüÿÿÿºƒÄëæƒì €=uƒÄ Ãèüÿÿÿ€=tîèüÿÿÿ „Àtà‹…Òu„ÀtÒÇD$ƒÄ éüÿÿÿÿÒ ëãÆéüÿÿÿƒì èüÿÿÿ·ÀƒÄ ÃSƒì‹\$èüÿÿÿf)؃Ä·À[Ãéüÿÿÿvƒì èüÿÿÿ+D$ƒÄ øÿÿÉöÃvÃv1ÀÃÃvÃvƒì¶P·Pèüÿÿÿ·‰$èüÿÿÿ¶ÀƒÄÉöƒì ‹D$„À¢xf¡f£èüÿÿÿ¶ÀƒÄ Ã@`‹L$‰ÃŠ ™8ÐtˆÐˆ™KAfƒû¢vŠƒëAжÀAfƒûˆ™wè[ÉöVSV‹…Û‹T$u ¸ÿÿÿÿY[^ËD$×Áûƒø‡¶ÿ$…D÷¡‰1ÀëØ€zU‰ÓuôŠˆD$1ö‰öƒì¶P·ÆPFèüÿÿÿCƒÄþí~ã€|$tÆŠD$¢™èüÿÿÿ붉Ó1öІFˆC1ÀþívÿÿÿëæÇîëƒì·PRèüÿÿÿ1ÀƒÄéQÿÿÿ‹£éiÿÿÿÇèüÿÿÿë›é/ÿÿÿSƒì‹\$ƒìShèüÿÿÿèüÿÿÿèüÿÿÿƒÄHuâƒÄ1À[Ãvƒì ‹…Ò‹D$u ºÿÿÿÿ‰ÐƒÄ Ãøtƒø t£èüÿÿÿ‹ëÞèüÿÿÿëñƒìhhôþÇèüÿÿÿƒÄ1Ò…À£x­ëÅUWVS‹|$‹D$‹7‰ò‹âÿÿ·Ã,‰éÁétåÿÿÁîÁë3‰ÑÁétâÿÿÁâÕ‹‹T$‰ø‹Z%ÿÿ·ÓÐ4‰ð%‰ÁÁétæÿÿÁïÁë;‰Ð%‰ÁÁétâÿÿÁâ‹D$Ö‰(‰p[^_¶Á]ÃVS‹D$ ‹T$‹H‹‹R9Ñ‹0¸w9ʸÿÿÿÿw9Þ¸w 1À9ó–ÀH[^ÃUWVSR‹L$‹T$·Ù·ÂÁêÁé‰ß¯Ú¯ø¯Á¯Ê‰ÚÁêãÿÿ‰Å‰$%ÿÿ‰úÁê‰Ø%‰ÆÁíÁîtãÿÿ‰Ú‰ø%ÿÿÁâ ÂD $ ‹D$ ‰‰HX[^_]ÃvUWVSƒì0D$$‹t$D‹\$HPÿ3ÿ6èüÿÿÿƒÄ l$Uÿsÿ6èüÿÿÿƒÄ |$Wÿ3ÿvèüÿÿÿ‹D$(‰D$,‹D$ ÇD$(‰D$$ÇD$ ƒÄ \$ SWUèüÿÿÿƒÄ ÿt$LD$(PSèüÿÿÿƒÄ<[^_]ÉöUWVSƒì‹D$(‹‹l$,‰T$1Ò…ífÇD$ÇD$ ÇD$‹@u3fÇD$‹L$4…Ét‹D$4‰‹D$ ‹T$0‰‹D$‰B·D$ƒÄ[^_]Ã1Ò‰Á÷õ…À‰D$t‰Ñý€‰Êw8³¾ ¿‰ö¶Ã‰ñ)Á‹D$ÓèÑâƒà Â9êr ‰øÓà D$ )êC€û vØë‚‰èÑ賉$¿¾v…Òy8¹ )ñ‹D$+$ÓèÑâƒà Â÷ÅtJ¸Óà D$ CGF€û vÉé0ÿÿÿ¹ )ù‹D$ÓèÑâƒà Â9êrÛ¸Óà D$ )êëÌ‚„‡ˆ ‹ Ž“•–™šœŸ !"£$¥¦'(©ª+¬-.¯0±²3´56·¸9:»<½¾?ÀABÃDÅÆGHÉÊKÌMNÏPÑÒSÔUVרYZÛ\ÝÞ_`áâcäefçèijëlíîoðqrótõöwxùú{ü}~ÿ€ƒ…†‰Š Œ ‘’”—˜›ž ¡¢#¤%&§¨)*«,­®/°12³4µ¶78¹º;¼=>¿@ÁÂCÄEFÇÈIJËLÍÎOÐQRÓTÕÖWXÙÚ[Ü]^ßàabãdåæghéêkìmnïpñòsôuv÷øyzû|ýþ¤!T!¤!¨!¤!j!‡!¨!¤!¤!¤!¤!¨!¨!Ú!""œ"œ"##œ"####œ"œ"œ"###########œ"##############œ"œ"###A#_#i#€#¡#•#«#Å#Ñ#ë#ÿ###!$#######-$#N$##############~$‹$š%š%À$À$À$À$À$À$À$š%À$À$À$À$À$À$š%š%š%š%š%š%š%š%À$š%À$š%š%š%š%š%š%À$š%š%š%š%š%š%š%À$À$š%š%š%À$š%š%š%š%š%š%š%š%š%š%š%š%š%š%š%š%š%š%š%À$À$ &ú%1& & &9& & & &A& &§& &¯& & &Ä&è& & &ð&' & & & & & & & & & & &'' & & & & & & & & & & & & & & & & &/'¬(æ'¬(K(¬(õ' (=(¬(¬(}(£(K(K(K(…(”(¬(¬(¬(¬(¬(¬(¬(£(¬(­(,)á(,)-),)ð( )-),),),),)-)-)-)_)g)¾)*************Í)*************Õ)ù)**/*E*T*0-0-à*.+g+0-Ç+×-0-.,•,0-×-1-×- .t.V3p3€3—3 3h3h3h3°3-4À3Ð3h3à3ó3ÿ344Ç3Ç3·34N4-464B4N4¬: 8B9L99‹9•9Ÿ9Ä9Î9Ø9â9ì9:;:E:O:Y:c:m:w::‹:•:¢:¬:¸:Â:Ì:Ö:à:ê:ô:þ:;;;&;0;:;D;N;[;m;w;;‹;•;Ÿ;©;³;½;Ç;Ñ;Û;å;ï;ù;< <<!<+<5<?<I<S<]<g<q<{<…<<™<£<­<·<Á<Ë<Õ<ß<é<ó<ý<==À=²=À=k>>>J>k>k>À=w>ƒ>>›>À=§>À=í>À=º>À=À=À=À=À=Ú>í>ù>øFœF1G0H¼HSI±I(JøF~JïJ£LßLaMøFNO©O|PQIQSQøFƒQ´QåQRBRS–SWTsTÄT8ULUøFøFøFøFøFøFøFøFøFøFøFøFøFøFøF¦UVøFøFøFøFøFøFøFøFøFøFøFøFøF,W5WøFøFøFøFøF>W ZMZ‚Zø`ŠZ[$[ì[(Zd\]†]§]È]Ô]æ]ö]^ ^^(Z(Z(Z(Z(Z(Z^^(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Zg^(Z(Z¼^Ð^ _L_(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z~_›_Ï_ð_``(Z7`J`T`[`©`¶`è`ð`(ZŸ]ø`(Zaa(Z(Z(Z(Z(Z(Z(Z(Z(Zaa(Z(Z.a(Z(Z(Z(Z(Z;a(d(d(d(d(dkc2dÚîH H *†æ>>¥C.C.€$‹é<þããŒj>Léq q 4ˆ¾>*³£'£'€1_‹*;7üÉ@*=¦ù  †+>+¶6%6% [Š¿>Sÿ­ºŠ^?.äÄÄÞˆl?½³Û'Û'P1í‘7Nø²®—µ:&úc‡==´·‘$‘$`<Âý>–ŽE>¸ÞSS懽>ÂAAwGwKwOwSwWw[w‘†‰w‰ÔŠ_‹¹‹,ŒŒßŒd‘Ó‘=''''''''''''''''''''''''''''''''„'ýŽÁ'''''ýŽ'Û'''ýŽýŽýŽýŽýŽýŽýŽýŽýŽýŽ'XŽ''''ÜŽýŽýŽýŽýŽ'''''''''''ô''`'“¯''''''êx$9ž`0QÀRÀ€PXNÃÑÁúÿàJ€Põ;Ø<QÀ1`1ЀPõ8ž`0QMCž`0QËixŰ`ظ@0P`€xïÐ ¯Ô<—ÐàQ€P¢ÃÐ@€PgÀPÉeò—Ð<€PIäÃPy Ðf€PïãÃÕàÕ €P-ÃP„€PqÃP¸ÒàÐ €P/äÀP!äÀPœ¦ÃP«cÐ<Ô¸à1ÐwÐàIˆÐOˆ€Pý¤Ã0Q¸ PÔظÐ<à1ÐÐà€Pð¤Ã§ÑàÑ €P~¥Ãf‚0Qý¸Ð<Q`1И€P’Týƒ¸Ð<Q`1ÐÔƒ€PæÃÐýž`0Q€PæÃЯ€¶FPmи@1Ѐ PÔظÐ<à1ÐÊ}Ø<Q¥Ð`1ÐýPy Ðý¦Ðà€PfFÀP†äÀP¶¤Ã€PÍåÃØ€PqÃÑ ÐàPÍP`€PŽŸÃ€P"®Ã€PèäÀPÀP_ÃPÍP`CˆÐû€PºäÃPÊÐ<Qà1ÐàÐâP`€PæÃЀFPmи@1Ѐ€Pôåú‚ô‚ýž`0QIΙà™IˆÐ,Ð%˜,Q«*@0™à™.˜.˜ P)ظ 1ØàP!€Phî˜.˜.˜0Q`PÎpPç PèxÕà` P¹ˆxcØ<.™ØàÍ0œx`PÎpPç Pèxøaø—p!ø 0—Ðà¸Ð<.™Ðà P¹€DQ_à`1Ðl€Pàˆ`ÀQà1ØàÀÐ<ƒp˜ÅøFøƒreødèÈ'è&øn˜.˜Àž`0QXØ<ΙÐÐ<ƒp˜ ÐàCˆÐ€PÉã.ŸЗ€PÍãÐ<II@0™¯þ€Pàãq΀PÑãq€PÅãIY@0™‚p.˜PÀž`PQÿÿ)PÏÑ<Õ¸à1Ðà и€PÉuÃýQü€PÂuÃÐý€PÉuÃ(Ø<Q`1ИÀ1ÐâØ<Q`1ØÀ1Ðß¿QéCˆQÐéQ;Ø<1Øàýž`PÍÐ<ΙÐýCˆÐYP½F…Ô8QÀ7Ô 6Ð<Qà1ЀP ãΟЀP ã€PãΟЀP ã%qÀÈ aM0QPQþÿP½ PÚPÛÿP`Ø<œY 1IÐ8šÐàNž 7QÀ7žž®žØ<˜QÿÀÙ1Øà Ð(Q À1ÔàÐý%‚qØ<î™Úàý`P pPP x PØ<Õà$qÙ<Õàp` PÎØ<.™Øàýž`XØ8Q`3Ðý ÙàÊàIˆÐwÐ.˜Iî˜ IŽ™ 1 1 1†.˜Iî˜ IŽ™ 1 1ٸʸ 5Ù Ê ŒXy з Ù<ÊCˆÐ=€P·CÞP`XP`ýCˆÐQP´Ð<Øà€PÖJÃÿXP`PPžP`Q·Ð<PÙÔàÐCˆÐ[àQ2Q`ÖÐPÒÔ¸€PÑrÃÐuPÌÐ<.™ÐàQ`1Ð~ý· PÙÔ8ظ`3ÐýQCˆÐPÙÐÇÙû]8þÿ‚Œÿ6ÎÿðÿðÿÎÿ6Œÿ‚ÿ8þ]ÙûÇ#>,ù:ÓýIùþ’‚ÿ;ËÿðÿÙÿ)…ÿ†áþE·ýÀoûA‚ô·¶1zòïûéŸýSÙþŠƒÿ*ÙÿÙÿ*ƒÿŠÙþSŸýéûïzò¶1·‚ôAoûÀ·ýEáþ†…ÿ)ÙÿsÿLù < «ûž†ÿÿþ”¥õ''¥õ”ÿþ†ÿž«û ÿŠ\Lÿ´–ÿÔÿîÿìÿôÿôÿüÿ øÿöÿ&úÿòÿîÿ´ÿàÿLÿšÀÿòÿòÿ’¢þèN&bþžÖX ¦ô´ ó ó²ëT²þ óö ¦ôLûöùÖ¨ÿbþbþNÚüè’^òÿš@´´ÿ úÿ& ˜ÿ¶:sSÚ¡j&ØýqÂÿ­?úbñûqüÀö×·óýï³ @æô³ À·óÀö)þñû?úžýÂÿSüØýþjÚüÚ_ÿs­þ¶Æÿ˜ã     }¥Ðj‚ibÿÿŒÿÿ56~ЀXÕŸ†—…`à;+"ÒÓÿÙþÿ©§èÎ!@(@¹à&s¥«þÿ¯XS¸ÞXÿc#")€ùÕ#'[•ÿÿª  ! Š ž žóÅŠÅÊ×úîúúúîîâîîîâ™ ™ ÌÌ™ fö3ãfö™ föfö3ã7ë7ë›â›â7ëÉeÉ7ëÉÉeøïïïøøïø  f™÷f ü   Ì3ýf™÷fÌÌfff3ýÌ™÷f™÷ÿñ3ý3ý™÷™÷™÷ÿñÌ3ýf™÷   ü  üôüüôüøP P ø°ôøø°ôø  `ù `ù`ù `ùã U‚SÚÿUæM(BP;¯9[Þ:µ$pïÙÿÿ{&w¥6Ž æôÿêüÿ•ýÿ¶âÿµ€;@Ž0 €?€Àÿl7”È<-<-ÄÒ'ì>Fùº‘*î>‘þow(Þ=Õÿ+.‡ö>ŸúazˆÞ>aþŸшØ=Ðÿ00Q`Pé—Ð<x6Ø8Qà7ЀP•ápP .ŸÐ€PEáÑà`€øaøÎ#q øaþ€PÝápPÑà`€øaøÎq øaþïÑàÒ À0Q P¸ïÅøÊ°T¸øÉ°¼ 0à6À0QÓPƒÑ<и¸¹À1ÐàPµÐ<.™ÑàÒ¸`1ÐÀî™ÐàPƒÑ<ÐàÀPËÐ<ΙЅ`P"pPÉ P* xx0QѸŰ``@0™rѸŰ@0 0—Ô8Ð PÝØ8Οã™P,ÔàPÑ· P,Ø<иt9Ð|.ŸÔ …Pàи`3‚…·P`À0Q x `PžpPÍPQÿÿqÕ¸Ù ‚pÅ06Ð<Qà1Тp.™Тp Б ``P]pPôPx qÙ<Õà`ˆpÅ0`a`p`À0QÃØ<Qs`1ÐÀ PÊØ<ΙÐÀ `P pPP!xÕ<Øà$qÕ<Ùàp` `P]pPôØ<HˆpÅ0`a`p`À0QÃØ<Qs€PîÑ`1ÐÂQt`1ÐþQõ`1ÐþÌ6Ð8Qà7#Ú<ٸΟÐ.ŸÐ1.ŸÐR©PQûÿà1Ð# 1 1ЀP3ãQãr€P+ãQãr 1 1Ð,€P;ãQãr€P#ãQãrPQþÿà1ÐD 1 1Ð?€PXãQKãr€PTãQIãr 1 1ÐM€P\ãQMãr€PPãQGãrPQþÿà1Ðe 1 1Ð`€PsãQfãr€PoãQdãr 1 1Ðn€PwãQhãr€PkãQbã Pºˆ` P»aQÿ?P¼Ô °P`Qÿÿ#ÂøEáùAðÏIPØ™YT¸ 0à5À—™Ôà ЂpEÎ.˜ Pºظ 1€H%qÀÈa P»ظ 7€XPÓÀÈaÌ#Ú<ΙкØ<Ιж€PãÅ€PãÅØ<ΙЀPƒãÅ€P}ãPÓP`%qÀÈaÀÐP¿„xPÀPÈ0QþÙ8Ê8nŸÀØEøsT¨à2à1àÉW¨Ñà0QPÈѸƒp±¹ÓØи¸¹À1ÐàÀ0Q# qÖ<Ñà ‚qÑ<˜ÖàÀ P¹ˆx€@Qà`3ÀµØ8ŽžNžQÀ7YÀ1Qâ 1€HÀøaÀ0Q‚?Ô<ΙÐ%Q`R` P¸jxÅøÊ°T¸øÉ°¼`0µæÖ ³ˆxÅøV¸0.˜.žn™nŸ Ø P±XyP5x6Ø8 Qà7Ј.ŸÐlØ8`P6pP?ÑàÑ ` P‡€PSá°Pøqøq!ø1ø 0 0.˜Ùà°P®ÿÐø Ð[£Ø8`P6pPAÑàÑ ` P‡€PŸá°P øqøq!ø1ø 0 0Ùà°P¶ÿÐø Ðx£Ø8`P6pPEÑàÑ ` P‡€Pãá°Pøqøq!ø1ø 0 0Ùà°P¾ÿÐø Д P±hy P‡`PpPžPŸxÙ<Ñà Я` P±hy P…ˆx P†x°Pÿÿ`PpPž€DQxà`1ÐÍÁ0€P`àã@øaø‡p!ø 0ÐÈXÁ0ž£™é°qT¨©°@0 0ixÕà` п P…ˆ` P†`iQbРÀž>*^€ÐÇÙû]8þÿ‚Œÿ6ÎÿðÿðÿÎÿ6Œÿ‚ÿ8þ]ÙûÇ#>,ù:ÓýIùþ’‚ÿ;ËÿðÿÙÿ)…ÿ†áþE·ýÀoûA‚ô·¶1zòïûéŸýSÙþŠƒÿ*ÙÿÙÿ*ƒÿŠÙþSŸýéûïzò¶1·‚ôAoûÀ·ýEáþ†…ÿ)ÙÿsÿLù < «ûž†ÿÿþ”¥õ''¥õ”ÿþ†ÿž«û ÿŠ\Lÿ´–ÿÔÿîÿìÿôÿôÿüÿ øÿöÿ&úÿòÿîÿ´ÿàÿLÿšÀÿòÿòÿ’¢þèN&bþžÖX ¦ô´ ó ó²ëT²þ óö ¦ôLûöùÖ¨ÿbþbþNÚüè’^òÿš@´´ÿ úÿ& ˜ÿ¶:sSÚ¡j&ØýqÂÿ­?úbñûqüÀö×·óýï³ @æô³ À·óÀö)þñû?úžýÂÿSüØýþjÚüÚ_ÿs­þ¶Æÿ˜ã     }c1j‚ibÿÿŒÿÿ56~Ü0€6Ÿ†—…`Ð;+"ÒÓÿÙþÿ©§èÎ!@(@¹Ð&_¥«þÿ¯XS¸ÞXÿc#")€µ6#'[•ÿÿª  ! Š ž žóÅŠÅÊ×úîúúúîîâîîîâ™ ™ ÌÌ™ fö3ãfö™ föfö3ã7ë7ë›â›â7ëÉeÉ7ëÉÉeøïïïøøïø  f™÷f ü   Ì3ýf™÷fÌÌfff3ýÌ™÷f™÷ÿñ3ý3ý™÷™÷™÷ÿñÌ3ýf™÷   ü  üôüüôüøP P ø°ôøø°ôø  `ù `ù`ù `ùã U±SÚÿUæMøB¢;ì9[Þ:µ$pïÙÿÿ{&c¥6Ž æôÿêüÿ•ýÿ¶âÿµ€;@Ž0ð0Q`Pé—Ð<x6Ø8Qà7Ð!€PÄÑpP .ŸÐ€PtÑÑà`€øaøÎ#q øaþ-€P ÒpPÑà`€øaøÎq øaþïÑàÒ À0Q P¸ïÅøÊ°T¸øÉ°¼ 0à6À0QÓPƒÑ<и¸¹À1ÐàPµÐ<.™ÑàÒ¸`1ÐÀî™ÐàPƒÑ<ÐàÀPËÐ<ΙЖ`P"pPÉ P* xx0QѸŰ``@0™rѸŰ@0 0—Ô8Ð PÝØ8Οã™P,ÔàPÑ· P,Ø<иt9Ð.ŸÔ –Pàи`3“–·P`À0Q x `PžpPÍPQÿÿqÕ¸Ù ‚pÅ06Ð<Qà1гp.™гp Т ``P]pPôPx qÙ<Õà`ˆpÅ0`a`p`À0QÃØ<Qs`1ÐÀ PÊØ<ΙÐÀ `P pPP!xÕ<Øà$qÕ<Ùàp` `P]pPôØ<HˆpÅ0`a`p`À0QÃØ<Qs€Pª2`1ÐÂQt`1ÐQõ`1ÐÝ6Ð8Qà7#Ú<ٸΟÐ!.ŸÐB.ŸÐcºPQûÿà1Ð4 1 1Ð/€PbÓQHÓƒ€PZÓQDÓƒ 1 1Ð=€PjÓQLÓƒ€PRÓQ@ÓƒPQþÿà1ÐU 1 1ÐP€P‡ÓQzÓƒ€PƒÓQxÓƒ 1 1Ð^€P‹ÓQ|Óƒ€PÓQvÓƒPQþÿà1Ðv 1 1Ðq€P¢ÓQ•Óƒ€PžÓQ“Óƒ 1 1ЀP¦ÓQ—Óƒ€PšÓQ‘Ó Pºˆ` P»aQÿ?P¼Ô °P`Qÿÿ#ÂøEáùAðÏIPØ™YT¸ 0à5À—™Ôà ГpEÎ.˜ Pºظ 1€H%qÀÈa P»ظ 7€XPÓÀÈaÝ#Ú<ΙÐËØ<ΙÐÇ€P°ÓÖ€P®ÓÖØ<ΙÐÓ€P²ÓÖ€P¬ÓPÓP`%qÀÈaÀÐP¿„xPÀPÈ0QþÙ8Ê8nŸÀØEøsT¨à2à1àÉW¨Ñà0QPÈѸƒp±¹ÓØи¸¹À1ÐàÀ0Q# qÖ<Ñà ‚qÑ<˜ÖàÀ P¹ˆx€@QÐ`3ÀµØ8ŽžNžQÀ7YÀ1QLÒ 1€HÀøaÀ0Q‚?Ô<ΙÐ6Q`R` P¸jxÅøÊ°T¸øÉ°¼`0µæÖ ³ˆxÅøV¸0.˜.žn™nŸ Ø P±XyP5x6Ø8 Qà7Й.ŸÐ}Ø8`P6pP?ÑàÑ ` P‡€P‚ѰPøqøq!ø1ø 0 0.˜Ùà°P®ÿÐø Ðl´Ø8`P6pPAÑàÑ ` P‡€PÎѰP øqøq!ø1ø 0 0Ùà°P¶ÿÐø Љ´Ø8`P6pPEÑàÑ ` P‡€PÒ°Pøqøq!ø1ø 0 0Ùà°P¾ÿÐø Ð¥ P±hy P‡`PpPžPŸxÙ<Ñà ÐÀ` P±hy P…ˆx P†x°Pÿÿ`PpPž€DQxÐ`1ÐÞÁ0€P`Ðô@øaø‡p!ø 0ÐÈXÁ0ž£™é°qT¨©°@0 0ixÕà` ÐÐ P…ˆ` P†`iQbРÀž`P1ZPQ€PM×ßPQ€PM×ÃP PQ¹ÿ€PM×ÃPØ PQ¹ÿ€PM×ÃÔPQ€PM×ÀPýמ`P1ZPQ€PT×ßPQ€PT×ÃP PQ¹ÿ€PT×ÃPØ PQ¹ÿ€PT×ÃÔPQ€PT×ÀPý×ÂÑ<Õà ÐM0QÀÕ<Ñà ÐTÀÍ0œxÀž>ò^€ЖÂÐÌ€Pd–ÂÞ†€P •ЀPs–ÂÐÞ†€P •ЀP¸–ž`PØ Ð<ΙÐÿ PÝ X`ƒÔ<ΙÐð€PrÃPÜ Ñ<и`1ÐüΙPØ )ÁÐà€PýÂ7ô€ЖÂÐÌ€Pd–ÂÞˆ€P •ЀPs–ÂÐ Þˆ€P •ЀP¸–ž`PØ Ð<ΙÐ ÿ PÝ X`ƒÔ<ΙÐð€PtÃPÜ Ñ<и`1ÐüΙ PØ )ÁÐà€PýÂÑ(lÕçÿ€Ða0Q"Ù8È8Šø@0nŸY4Ξ 2Í0Í<€P‹ÚP±€Ø„p`è`0à0îÀP¼Ð<±ÁÐàÐ S8ûÐàP·SÐàSÙP`Ðà P¼Ð<±ÁÐàqÁÐ P`SÙÐàP8Q(BÔ ž`ªŒÍ0œx P¼Ð<±ÁÐàÐ SPþÐàP¶SÐàSeÜP`Ðà ž`€S RH R`SÀApS‡pR€Q|°QS€ S¬À$ýPèPPP`P¶…pQ`P7PP ÛQ`PPÛQ`PPCÜQ`PPþÛQ`P$PPÄÙP`ž`€P=ÜÃÍ0œxÀž`€X S¬ÀSâ$ S¨ÀÀÈE$Sæ$ÀÈE$Ž˜$ S¬ÀS¢$`EqÁýÿÐ PQªÿ Ðè ýS! S S­Àž`$ýPQþÿS¹þ±ÁÐ Ð ÀÀZ‚pÀ0àJÀ0.ŸÀž`ÀZ€PXNÃýP‰Ð<P³ÐàPŠÐ<P±ÐàPÐ<ÑÁn˜ÁP‰Ð8ΟÐM ÁPµÐàÀP`Q”ÜÔ P¼Q¸ÿÔ PºÔ<P¹ÔàP»Ô8QÃÐÀPˆÔ¸à1PæÔàÀž`PQ÷ÿ S~Ý`QæŒÍ0œxÀž`€PÂÜꌀP1Ýà S¬Ú`Qüÿ挀PQÝÃýž`ªŒÂŒÍ0œx€P°dž`Q wÐ<Ι‚™Øà€PõdÃQ¸Ý|Ø €PvÃPæиP·РÍ0œx€P°dž`Ø<ΙКØ<SqÁÐÏ P»Ø<ÑÁýÿØà€PpÝÃظ€P jÚØ<.™Øà`1ÐJØ<Q`1ЙØ<SqÁÐù P»Ø<ÁØà P·Ø< PæØà€P€ÝÃظ€P jÙØ<.™Øà`1ÐJØ<Qà1ØàšX`™X`JX`™X`J™Ø<SqÁÐ. P»Ø<ÁØà P·Ø< PæØà€P€ÝÃظ€P jÙØ<.™Øà`1ÐJ€PjÃX` P»Ø<ÑÁýÿØàQ(B|Ø Í0œxÀž` SVÞ`Q€PæÜÃJž`€PÝÃPQûÿ€PÝÀPÂÜÀPªÜÀP1ÝÃPµÐ<ÁÐà S¬Ú`Qüÿ€PæÜÃP`Q{ÜÔ P¼QüÔ P8Q‘ÞÔ P“U`T`P—T`Í0œx€P°dÂ-ÇP5Q„qÕ<`1¡ŸP5Qþ„qÕ<`1±Ÿ_qÁÐÊP¼Ðan`~```PtxÅ0`axqxx$j$j$j$j`Í0x x}xmx=yMyÀ`)&ÙíØüØ(ÚàØÚ€ÝpÝÓ8.àÿÿÈXᯆ¤‡³ááýQˆÍ0œxÀnK½ù¶·X¼(B(Bµõ¸¶¶ Ôož`S€ S¬À€P$ÝÀPÝà S%à`Q€PæÜÃP:PP'àP`Í0œx€P°dÂQ(BPkР€P°dÂP5Ð<P ÐàÀž`怭€P Ð8 P¬ Ø<Ø éÇ}€ P¹Ø `P!pP;!Pan`~```PtxÅ0`axqxx$j$j$j$j`Í0x x}xmx=yMyÀ`@‡ÙíØüØ(ÚàØÚíÚàÚÓ8ºAÿÿÈXᯆ¤‡³áánK½ù¶·X¼(B(Bµõ¸¶¶ýQˆÍ0œxÀ&ØdØ`Ø`Ø`Ø`ØzØ`ØØœØ Ù,Ù4Ù²Ù(Ù(Ù(ÙâÙ'Ú`Ú•Ú¸ÚÕÚßÚUÛ}ÛÛÛ$ÜRÜ(Ù(Ù(Ù(ÙxÜÝàÞßßEß_ßnßCÜqÜ(Ù(Ùuß„ß(Ù(ًߚߡ߰߷ßà(Ù(Ù(Ù(Ù(Ù(Ù(Ù(Ù(Ù(Ù-à(Ù(Ù(Ù(Ù(Ù(Ù(Ù(Ù(Ù(Ù(ÙUànàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ `bfhjn!%-15= ä'k¯ó7¬ 4 ¼ C Ë S Ê MŽÐz ý  ‡ ´+1R6¡;ð@?FºPÔZîdo"y;ƒ             "!$#&%('*),+.-0/21436587:9<;>=@?BADCFEHGJILKNMPORQTSVUXWZY\[^]`_badcfehg      "!$#&%('*),+.-0/21436587:9<;>=@?BADCFEHGJILKNMPORQTSVUXWZY\[^]`_badcfehgji   #!'%+)/-1032547698;:=A@CBEDGFIHKJMLONQPSRUTWVYX[Z]\_^a`cbed #!'%+)/-21436587:9<;>=@?BADCFEHGJILKNMPORQTSVUXWZY\[^]`_ba    %"+(1.5397=;@?BADCFEHGJILKNMPORQTSVUXWZY\[^]`_ba  "*&1.5397=;A?CBEDGFIHKJMLONQPSRUTWVYX[Z]\   "*&1.5397=;A?CBEDGFIHKJMLONQPSRUTWVYX   &!0+63<9A?ECIGMKPORQTSVUXWZY\[^]`_ 0(84@6GCOKTRXV\Z^  ,?6IDQNWT]Z`  3E>QLXU`\dbg  2D=OIUR[X`]dbg    ,>6HCPLTRYW_\bagd%60A;HDMJQPWTYX]\a`cb   %60A;HDMJQPWTYX]\a`cb   %60A;HDMJQPWTYX]\a`cbedhg  !2+;7B@FDLIQOTSXW[Y]\a`cbedhg    ("2-95>;CAHEJIMLQPSRUTXW[Y]\a`cbed ("2-95>;CAHEJIMLQPSRUTXW[Y]\a`cbedhgki  #,(2074=:A@EDHFJIMLQPSRUTXW[Y]\a`cbedhgki  $!+(0-4276;:@>BADCFEIHLJOMQPSRUTXW[Y]\a`cbedhgkinlpo  #!&%)(-,10325476;:@>BADCFEIHLJOMQPSRUTXW[Y]\a`cbedhgkinl     ! #"%$(&+)-,10325476;:@>BADCFEIHLJOMQPSRUTXW[Y]\a`cbedhgkinlporq :$NEXSa]gdmjp  :$MEVR^Zdbhfljn  4 F@QLWT]Zcagekiom,>6GCOKSQWU[Y`]badcfe  ,>6GCOKSQWU[Y`]badcfe  ,>6GCOKSQWU[Y`]badcfehgji    ,>6GCOKSQWU[Y`]badcfehgjilknm  #4.>9EBKHPNTRXV\Z`^badcfehgjilknmpo 0(84@=A@CBEDGFIHKJMLONQPSRUTWVYX[Z]\`^badcfehgjilknmporqts   !%#)',+0.21436587:9<;>=A@CBEDGFIHKJMLONQPSRUTWVYX[Z]\`^badcfehgjilknmporqtsvuxwzy    "!$#&%('*),+0.21436587:9<;>=A@CBEDGFIHKJMLONQPSRUTWVYX[Z]\`^badcfehgjilknmporqtsvuxw    ýQˆÍ0œxÀ¯R€P¯vÀPÍvÀPÛwÀPéwÂY`wÔ¸ƒÑ P`:Ð<ÑÁÿÏÐàPP` P®X`€Pc€ÐaP!QNРP!QРÚQÿÿРƒQР¬QРPH Q`P`€PÇLÃÍ0a0Ql†P!и PE Ø<ΙÐef€PâÆÃÍ0a PD Ø €PêLÃÍ0nn.^^^^N=mm-]]]]M a0Q1ÁÿSNœÑDZÇ@ZÑÅ.ž±Ç!€p.žñÇ„QÁ€ãŸÎ›Í0a0Q1ÁÕSNœQÀ7ÐÕ@ZÑÅ.ž±Ç!€p.žÚÑÅ.ž.Ÿ.žQÁ€ãŸ.š.˜Í0ÓøÄ#Î#Ø#â#ì#ö#V¸æPßÐ!Ø<•‚ P>!Ø<˜Øà P?!Ø8±ÇØ Ðr P;!Ø<•‚ P;!Ø<˜Øà Pa0Q`QÿÿPÙ Q`QÕ Ð PÝ Ô<Qø 1Q 5Ð à5Ї QØ 1ÔàPÊ x€P0ÚÃh Q0 1Ôà­ŠŒ Ôà­Š€P0Úà Ðh PÙ Ú<PÔ Ð8©ÇРΙЧ @J`PÌ pPÑ PÓ x PÕ qÙ<Õà`Í0a0Q`P pP¡ P÷ x P« Ø8QÃÐV Õ<Õa0Q`P pP¡ P÷ xÕ<Õ< Pú Ø8QÃÐm Pl …´ú¾PtÙa0QP« Ða0Q`P¢ pP© Pø x€P­Ë°PÕøUø‡puþà6Í0a0Q@@IÀHD­ÁñÁHÕ<Ô¸ 1˜yÁÐ9 @BMÃÐ9 SEÀH@FIÁÐ9 ñÁ@JYPX@DÑŘ@H 1©ÇY@­ÁHÕ<Ô8­Á˜P@à0€ YÍ0a0Q`QPÐQ`QÌРPÔÔ<Qø 1Q 5Ð.à5Ð4QØ 1ÔàPÁx PýØan`~```PtxÅ0`axqxx$j$j$j$j`Í0x x}xmx=yMyÀΙà™à1Ž˜N˜˜ 1ÀÍ0œxÀõÖ€P·vÀPàvÀPîwÀPüwÂY`wÔ¸ƒÑ P`:Ð<ÑÁÿÏÐàPP` P®X`€Püb€ÐaP!QNРP!QРÚQÿÿРƒQР¬QРPH Q`P`€P NÃÍ0a0Ql†P!и PE Ø<ΙÐef€PâÆÃÍ0a PD Ø €P0NÃÍ0nn.^^^^N=mm-]]]]M a0Q1ÁÿSNœÑDZÇ@ZÑÅ.ž±Ç!€p.žñÇ„QÁ€ãŸÎ›Í0a0Q1ÁÕSNœQÀ7ÐÕ@ZÑÅ.ž±Ç!€p.žÚÑÅ.ž.Ÿ.žQÁ€ãŸ.š.˜Í0ÓøÄ#Î#Ø#â#ì#ö#VíPßÐ!Ø<•‚ P>!Ø<˜Øà P?!Ø8±ÇØ Ðr P;!Ø<•‚ P;!Ø<˜Øà PP`QEäR…OP– Ô8 XØà.ŸÔ OP Ð<ÑÁÿïÁÐà€PpÃ7P Ð<ÑÁÿïÁÐàQ€åR…P~ P`}QǪР€P‡tž`Q(BR…«P`Pc"P`Q´Qiå€PsÃ}Q åРPi"QåРPPäýQdäLÐO€PÉuÃQläLP,Ð<±ÁXÐw€PÉuÃOPSÐ<.™ÐàqÁÜÐOP!иQ¯@0™P/Ðà€PÉuÃQäLP,Ð<ñÁXÐOPc"Ð<±ÁÐàqÁÐfPP0ýQ¦äLÐO«P`PúQ@Ñ P`–P`QþРQM0Ñ Qý)Р8QÃäLÐO€PÉuÃPPàãQÍäLÐ#P,Ð<Ιà™qÁèÐÜ€PÉuÃOPSÐ<.™ÐàqÁ ÐOªP`}QǪР€P§^ÃPÐ<ÁÐà0P Ð Ôö)ü+f’ýóõãï-ãïóõý’f+)üÔö> }ž`ƒÐ8ΟÐǀРSظ 7YÐ8 7Ð ÄàýÐ8à7Ð ñÇÐ ÎžÔ P€PBlà P)Ø8qÃÐT`PQ@@ 7pX PW xظ`3ÐfPpPÅà`Ø8qÃÐý€P*kÃÐý€Pønà PS X` P !X` PØ8ÑÇ€Ðý PT X`ýqÃQÔ Ð PX Ø  PW QØ ý›ÎQ`aý‚$øÿDñ¼$}äozÀww€pÇqà8Žã €øÿÿÿÿÿÿÿ;;''' ?oo/____O>nn.^^^^N=mm-]]]]M a0Q1ÁÿSNœÑDZÇ@ZÑÅ.ž±Ç!€p.žñÇ„QÁ€ãŸÎ›Í0a0Q1ÁÕSNœQÀ7ÐÕ@ZÑÅ.ž±Ç!€p.žÚÑÅ.ž.Ÿ.žQÁ€ãŸ.š.˜Í0Ó˜Ä#Î#Ø#â#ì#ö#/vôPßÐ!Ø<•‚ P>!Ø<˜Øà P?!Ø8±ÇØ Ðr P;!Ø<•‚ P;!Ø<˜Øà P‚]‚Pµ3Ð<±ÁQ`1Ð6ÐàÍ0œxÀSÐà°ÿÍ0œxÀP˜3QÀ¸Pc3Õ8Æ8P¿3Ð<ñÁî™Pj3@J€p.ž7Â Ò Æ0Õ8Æ8@J€p.žÐ Àž`Ph3Pe3qÑ<ÕàPm3Ð<PÀ3ÐàñÁЬÐàPM øP`PL ÿP`Pg3Ð<ÑÁÿPJ Ðà€P#MÃPK Ða0Q`QÿÿPÙ Q`QÕ Ð PÝ Õ<Æ<Qø 1Q 5ÐÆ à5ÐÍ QØ 1ÕàÆàPÊ x€Pvêë Q0 1ÕàÆàôŠÓ ÕàÆàôŠ€Pvêà Ы PÙ Ú<PÔ Ð8©ÇРΙÐî @J`PÌ pPÑ PÓ x PÕ qÙ<Õà`Í0a0Q`P pP¡ P÷ x P« Ø8QÃÐ Õ<Õ< >a0Q`P pP¡ P÷ xÕ<Õ< Pú Ø8QÃд Pl …´ú¾PtÙa0QP« Ða0Q`P¢ pP© Pø x€P­Ë°PÕøUø‡puþà6Í0a0Q@@IÀHD­ÁñÁHÕ<Ô¸ 1˜yÁÐ` @BMÃÐ` SEÀH@FIÁÐ` ñÁ@JYPX@DÑŘ@H 1©ÇY@­ÁHÕ<Ô8­Á˜P@à0€D YÍ0a0Q`QPQ`QРPÔ<Qø 1Q 5ÐUà5Ð[QØ 1ÔàPx PóØ5;ž`PQøÿP­ PÁİո€PÝfÃPVÀ°Q33@0™I@0™›ÙàÊàPÁÑ8Ѹ`3Y`1ÐãÑ<Ñ8mÁÀ›Qý#@0yÁÐãÑ<Ñ8mÁÀ›Q=@0yÁÐãSP`Ð<ΙÐ PaÔ8ΟÐqÁÐqÁ ÐPbÐ<.™Ðà:Ð8ǀРéÁP`Ðà éÁP`Ð8±ÇÐ PaÐàÙ<Ê<PÇѸ`1Ð1Ñ<Ð8mÁÀ›Q% @0`1Ð1PÃÑ<Ð8mÁÀ›Qý#@0`1Ð1SUPdÒ<ΙÐ[qÁPÐOqÁÐOPeqÁÐGPfÐ<.™Ðà:Ð8ǀРéÁPdÐà[éÁPdÐ8±ÇÐ PcÐàQ@PVРéÁŒÐà€P¿fÃÍ0œxÀž`PQïÿP­Ñ8ΟàŸqÃÍ,Ð{ Ðq†@RP­€qÐ<˜ÑàPVpÍ0œxÀ ®þêž`:Ð<ÑÁÿÐà~P Ð<±Ácà€HÀøÐ<P$ an˜˜ 1±Áià€HP qÀøaP% ƒpQ`Q@Ñ pP"S„áÐàP S(BÐàÍ0œxÀ\ikszƒÓíÐÐÁøÊ#)¦;>‘7rü´ß5­×<.k©<~>‚9þâÿÙê.ÅË<>Ä9[ê.ôá1 4=½>:@ xñauéÆ2Ž#Š=ä>5; ùsXñn4÷&Û=?Ò;ž`PQøÿP P P İո€PÝfÃP( À°Q33@0™I@0™›ÙàÊàP Ñ8Ѹ`3Y`1ÐÛÑ<Ñ8mÁÀ›Qý#@0yÁÐÛÑ<Ñ8mÁÀ›Q=@0yÁÐÛSÿP' Ð<ΙÐP& Ô8ΟÐþqÁÐùqÁ ÐùP) Ð<.™Ðà:Ð8ǀРéÁP' ÐàéÁP' Ð8.ŸÐ P& ÐàÙ<Ê<P Ѹ`1Ð(Ñ<Ð8mÁÀ›Q% @0`1Ð(P Ñ<Ð8mÁÀ›Qý#@0`1Ð(SLP+ Ð<ΙÐQqÁPÐFqÁÐFP, qÁÐ>P- Ð<.™Ðà:Ð8ǀРéÁP+ ÐàQéÁP+ Ð8.ŸÐ P* ÐàQ@P( РP% P`~Í0œxÀž`PQïÿP Ñ8ΟàŸqÃÍ,Ðp Ðf{@RP €qÐ<˜ÑàP( pÍ0œxÀ P ’pY`Àž`0Q°À°P( и@0™©Á›ÙàÊàþP PQøÿP ѸÕ<€PÐfÃP% Ð<.™Òàи`1Ъa«Ÿ€Í0œxÀý?QˆÍ0œxÀ8`P4pP¦4P4xÕàÕ `À>a0Q`P4pP¦4P4x P« Ø8QÃÐ+Õ<Õ<+>a0Q`P4pP¦4P4xÕ<Õ< Pú Ø8QÃÐB P0…´ú¾PtÙa0QP« Ða0Q`P§4pP®4P4x€PDñ°PÕøUø‡puþà6Í0a0Q`QÿÿPÙ Q`QÕ Ð PÝ Ô<Qø 1Q 5Ðj à5Ðp QØ 1ÔàPÊ x€PÚÃQ Q0 1Ôà–Šu Ôà–Š€PÚà ÐQ PÙ Ú<PÔ Ð8©ÇРΙÐ @J`PÌ pPÑ PÓ x PÕ qÙ<Õà`Í0a0Q`P pP¡ P÷ x P« Ø8QÃÐ; Õ<Õ<; >a0Q`P pP¡ P÷ xÕ<Õ< Pú Ø8QÃÐR Pl …´ú¾PtÙa0QP« Ða0Q`P¢ pP© Pø x€P­Ë°PÕøUø‡puþà6Í0a0Q@@IÀHD­ÁñÁHÕ<Ô¸ 1˜yÁÐþ @BMÃÐþ SEÀH@FIÁÐþ ñÁ@JYPX@DÑŘ@H 1©ÇY@­ÁHÕ<Ô8­Á˜P@à0€â YÍ0an`~```PtxÅ0`axqxx$j$j$j$j`Í0x x}xmx=yMyÀΙà™à1Ž˜N˜˜ 1Àž` QÿÿРPƒ$Õ<Øà€PlÃÕ<ØàQ„$@D 1I@`3ÐâÆ0PGÔ8иà7Í0œxÀž` QÿÿРP$Õ<Øà€PlÃÕ<ØàQ$@D 1I@`3ÐÆ0P~$иԠýÍ0œxÀòÎ’€P·vÀPàvÀPîwÀPüwÂY`wÔ¸ƒÑ P`:Ð<ÑÁÿÏÐàPP` P®X`P QgåР€Püb€ÐP`Q?ä9…6P– Ô8 XØà.ŸÔ 6P Ð<ÑÁÿïÁÐà€PpÃ1P Ð<ÑÁÿïÁÐàQgå9…P~ P`}QŠ«Ð €PŽtž`QøB9…«P`Pc"P`Q´QPå€PsÃ}QòäРPi"QåРPPäýQ^ä3Ð6€PÕuÃQfä3P,Ð<±ÁXÐq€PÕuÃ6PSÐ<.™ÐàqÁÜÐ6P!иQ¯@0™P/Ðà€PÕuÃQŠä3P,Ð<ñÁXÐ6Pc"Ð<±ÁÐàqÁÐ`PP0ýQ ä3Ð6«P`PúQ@Ñ P`–P`QþРQM0Ñ Qý)Р8Q½ä3Ð6€PÕuÃPPàãQÇä3ÐP,Ð<Ιà™qÁèÐÖ€PÕuÃ6PSÐ<.™ÐàqÁ Ð6ªP`}QŠ«Ð €PÞ^ÃPÐ<ÁÐà0 †6ž`Pi"€xFQÁÐÃ6ž`€PCPÀPÂvÃ6ž`Q«Ð<ΙЀP· ÃI0QËظ@0€PӦïÑ Ð ªØ Ôö)ü+f’ýóõãï-ãïóõý’f+)üÔö> }ž`ƒÐ8ΟЮ€ÐÕ€XÀÈ@0™P!Ðà“ÐàQÿÿ±РQP–PYÑ P`QþP9Ñ QøРý@ 9Ö2N-b(ý# 3zµ= TÅ a Lظ@0™n˜Q= 4Ð8qÃÐ]Q= `1™PHÀž`PúÐ8ÎŸàŸ€Pì¤Ã0QýÎÐ<ΙÀ Ð8ΟàŸ.ž.ž`P #pP·#P¸#xÐ<éÇNž©ÇÑ `ÀPQûÿ SQ # 3HÓ¸Ð<à1à™ñÁ€ЧÃ0Ð<à1à™ñÁ€ЧÃ0Ð<à1à™ñÁ€ЧÒÐ<`1еPº#˜˜ÖàŽ™˜˜Ôà¾P¹#˜˜ÕàŽ™˜˜ÔàQ§ 3HP`QÅ'.š.˜ 1HP¹#ŰԸÁ0Á0aÑ .Ÿ ЊÀP #PÝ'qQxU`Pé'Ð<.˜.˜IPÝ' Pã'PQûÿÕ<à1à™Ùà ÐéP§Pã'QPQûÿÑ<Ô8qÁ‚Õ Ð÷Pã'Õ<S SPQüÿ®ŸÕ¸`1ÐŽ™_ ÐPê'ÑàÁàqÁ€Ð5 OQ§ 3HÐaP!QNРP!QРÚQÿÿРƒQР¬QРPH Q`P`€P NÃÍ0a0Qp†P!и PE Ø<ΙÐij€PâÆÃÍ0a PD Ø €P0NÃÍ0nn.^^^^N=mm-]]]]M pÀ0À0>pÀ0À0tø`0ø¨P !`Р P»ظà1P¼Ðàî™P»ÐàPµÐ<ΙÐUP¼P¶Űи@0™®˜n˜Iİ@0™.˜P¸ÐàP¹Ð<0Q±ÁQ@`1™ÐàP·Ô8Q¸ `1žQp`1žÔ 0QP `P6pP´ P xظþ°P€PZã P¸ȰQ<Á<sŽœ°ØH°µ¸S,Ã,?pÀ0À0?p0QÍ0œxÀÿÿM"ZJæPè–pQ`PþQèРÀÚÿÏÿBX‹ÿgÿFúÆþzþãTýmü~ÇDøØô÷u9u9÷ØôDøÇ~müýTãzþÆþúÄgÿ‹ÿXBÏÿÚÿž`>a0QPPÐ8`PèpPýPþ PÀ€PXâxÕ `ÄøEøøüq$ø%þÙ ØàÍ0a0Q1ÁÿSNœÑDZÇ@ZÑÅ.ž±Ç!€p.žñÇ„QÁ€ãŸÎ›Í0a0Q1ÁÕSNœQÀ7ÐÕ@ZÑÅ.ž±Ç!€p.žÚÑÅ.ž.Ÿ.žQÁ€ãŸ.š.˜Í0!Ø<9ƒ P>!Ø<˜Øà P?!Ø8±ÇØ Ð P;!Ø<9ƒ P;!Ø<˜Øà P7<#9ž`PQøÿP­ PÁİո€PüfÃPVÀ°Q3@0™I@0™›ÙàÊàPÂÒ8mÁÐ7PÅÖ¸`1Ð7Ž™`3À›`3€YQ¤@0à0Ð7Ñ8ѸÐa0Q`QÿÿPÙ Q`QÕ Ð PÝ Õ<Æ<Qø 1Q 5Ð à5Ð$ QØ 1ÕàÆàPÊ x€PÍéà Q0 1ÕàÆàKŠ* ÕàÆàKŠ€PÍéà Ð PÙ Ú<PÔ Ð8©ÇРΙÐE @J`PÌ pPÑ PÓ x PÕ qÙ<Õà`Í0a0Q`P pP¡ P÷ x P« Ø8QÃÐð Õ<Õ<ð >a0Q`P pP¡ P÷ xÕ<Õ< Pú Ø8QÃÐ Pl …´ú¾PtÙa0QP« Ða0Q`P¢ pP© Pø x€P­Ë°PÕøUø‡puþà6Í0a0Q@@IÀHD­ÁñÁHÕ<Ô¸ 1˜yÁг @BMÃг SEÀH@FIÁг ñÁ@JYPX@DÑŘ@H 1©ÇY@­ÁHÕ<Ô8­Á˜P@à0€— YÍ0pÀ0À0>pÀ0À0tø`0ø¨P !`Р P»ظà1P¼Ðàî™P»ÐàPµÐ<ΙÐØP¼P¶Űи@0™®˜n˜Iİ@0™.˜P¸ÐàP¹Ð<0Q±ÁQ@`1™ÐàP·Ô8Q¸ `1žQp`1žÔ 0QP `P6pP´ P xظþ°P€PÝî P¸ȰQ<Á<sŽœ°ØH°µ¸S,Ã,?pÀ0À0?p0QÍ0œxÀÿÿž`>a0QPPÐ8`PèpPýPþ PÀ€P…âxÕ `ÄøEøøüq$ø%þÙ ØàÍ0a0Q PD Ø €PêLÃP!и PE Ø<ΙÐñò€PâÆÃÍ0nn.^^^^N=mm-]]]]M a0Q1ÁÿSNœÑDZÇ@ZÑÅ.ž±Ç!€p.žñÇ„QÁ€ãŸÎ›Í0a0Q1ÁÕSNœQÀ7ÐÕ@ZÑÅ.ž±Ç!€p.žÚÑÅ.ž.Ÿ.žQÁ€ãŸ.š.˜Í0!Ø<9ƒ P>!Ø<˜Øà P?!Ø8±ÇØ Ð P;!Ø<9ƒ P;!Ø<˜Øà Pa0QP‚8ŒpQ`P(=ÀpQ`@p@p@pPŽ8†pQ`P(>§pQ`PQöÿ'p ÐP9Ð<HÐ<Ž˜˜ÑÁP7 ÐàP9Ð<Q 5XÔ8YQ¼@0žžPÄ8Ñ À P9Ð<P‚8Q 5XPQûÿÕ8ÑÃÿÑàŽžÑÃÿÑà ÐHP9Ð<Q  5XÔ8P½8Ð ñÇ@ZQ  5XP¨=Õ8Ñ qÕ8Ñ Q  5XÐ8P¼8Ð ñÇ@ZP(=Õ8Ñ qÕ8Ñ Õ8Pü8PQýÿÑÃÑàNž ЂÕ8PQÿÿÑÃÑàNž ЋP9`QþÿÕ8PQÿÿÑÃÿÑàŽž И ЕP9`@P9PQüÿÕ¸ 7Ñ Ð¨ P˜8PQûÿPü8PŽ8Ѹ`P9D 1H@zEbP9D 1Hx`xqÑ8Õ x x еÍ0=y-xœxÀž`ÞàÎà^aPÔ8Pà8éÁíÇPQûÿÑ<˜ÎŸÐç OÑÁÿê OÁ€ÕàéÁ ÐÞÍ0]yÍ<Ý<œxÀ0QØ8ΟÐÑÇÿY@0Až 6Y@0PÓ8À<©ÇÊ Ð Àž`na`P‚8pP8PÒ8xŰ`PÓ8SÐà PÙ8`Qûÿô€ Ð!Í0myœxÀž`>a0QP‚8PÙ8Á°Ñ¸@0™ÆàS…pÖàPÒ8P„8``Q÷ÿ Ð@€PtñÃPÚ8S…pÑàSÐàPí8STÐà€P˜ñÃPæ8PÔ8qÑ<ÕàÒ€Í0=yœxÀž`PÒ8DPú8@éñÁ@JéÁ€pÑàÍ0œxÀž`U S`QþÿPQìÿPÔ8Ñ<Áa0Q P§8PÚ8qÑ<Õà€PÏñÃPò8Ð 0SPô8Ð<S)ÇPó8РΙÐä€P˜ñÃPæ8P¡8qÑ<ÕàëPÚ8P¡8qÑ<ÕàPô8Põ8Ð<ÔàPó8Pô8Ð<ÔàÍ0=yœxÀž`P¾8Ða0QP½8Ð<ñÁ@J€P¨ýP8ø€paø`0à0î™n™PÈ8ÐàÍ0=yœxÀž`>a0QÎP¼8Ð<ñÁ@J€P(ýP8€Ø€p`è`0à0înŸ0QPÄ8Y€Phà OPÉ8Ð Í0=yœxÀž`P9QРP”8SÐàP8ÀpQ`@pSƒ$P9Ðà{P`PP`€PeõÀPcñÀP‘õÀPðÀP(ñÀP¸õÀPvõÀPiòÃÍ0œxÀž`Pž8DPÐ8@éñÁ@JéÁ€pÑàÍ0œxÀPí8Ð< S±ÇñÁÐ{î›±ÁPŸ8ÐàSíÅS¡8­ÁP 8ÐàÀP¾8P`Q‚8P¹8РPº8РQ­8P•8РQŽ8P–8РP—8Q˜8РP˜8S(>PQûÿÑà±ÁN вÀž`Pž8Ð<Pí8±ÁÐàñÁqÁÐÊñÁÃP9Ðà S0SÿÿqÁÐ×ñÁΙÐÞ.žñÁ×P9Ð Í0œxÀž``P‚8pP8Pº8xѸ`PŸ8Ð7<#9ž`PQøÿP­ PÁİո€PÝfÃPVÀ°Q3@0™I@0™›ÙàÊàPÂÒ8mÁÐ7PÅÖ¸`1Ð7Ž™`3À›`3€YQ¤@0à0Ð7Ñ8ѸÐ@VXnp†ˆž ¶ºÐÒèþ*-CF\_uxŽ‘§ªÀÃÙÜòõ $'=@VYorˆŒ¢¦¼ÀÖÚð ññ%ñ1ñ=ñIñUñañ6UòK°CS<Ä5ë/µ*&ì!<òg' º …˜Å`ËEÎd²g$賄Z4õô÷úþ !'-39?EKQW]ciou{‡“™Ÿ¥«±·½WÃÉcÏÕoÛá{çí‡óù“ÿ Ÿô9  ±·½WÃÉcÏÕoÛá{ç퇀À@€À@€À@€À@€À@€À@ß÷ó÷ø!÷øøø%øqý?þNþ]þlþlþlþ{þŠþ,=[` · ð ¸ € e z[Ö ë z  ¼Î&&ùùù ¨LV`@JT^hr|9"K"K"K"i"®!s"’""‹"’"¼%'&¼%1&¼%;&'¤'¤'¤'r&Â'Ì'Ö'?y?@#@#@/@J@m@‚@4?‘@¦@4?4?4?4?4?4?4?4?4?4?4?4?”B4?4?4?Ô@4?4?4?4?»@4?Ç@à@ì@4?4? AAÔ@Ô@4?4?4?4?ÐA4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?4?”B4?°B2A>A>A>A>A>A>ALA_AA‹A”AªAªA¶AÂAK,X°` À €%à.@8 AK`TÀ] g€pày@ƒ}Є Œp”@œ¤à«°³€»Pà ËðÒÀÚâ`ê`m•rÊw}5‚j‡ ŒÕ‘ —@œu¡ª¦à«±J¶€»µÀêÅ ËUЊÕÀÚÀ]õb*h`m•rÊw}5‚j‡ ŒÕ‘ —@œu¡ª¦à«±J¶€»ÔU'VÔUòUÔUòU]V|VWfW¸WíWeXÐX YˆYtVèZtVúZtV«[Û[\\Q\Y\|\„\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\ê\>^¶^x\x\x\x\x\ù^_7_x\Y_x\a_w__x\x\x\x\x\x\x\ª_Ù_é_x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\ó_ `%`x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\9`x\x\A`x\x\x\x\x\P```x\j`Ü“ÝÐݼØvÞ–Þ¸ÞìÞRßà+à,åŒãöä,å6åmåÿætçpä¾ãóãä5äpäpäpääÎäXõdõpõ|õˆõ­õ»õÂõÉõÐõ×õÞõ?þJþÑþþ®þ¶þÑþÝþAustraliaBelgiumDenmarkFinlandFranceGermanyNetherlandsItalyNew ZealandNorwaySpainSwedenSwitzerlandUnited KingdomAustriaJapanPRCKoreaSingaporeMalaysiaTaiwanThailandPortugalIrelandHong KongCanadaMexicoIndiaVietnamPhilippinesGreeceHungaryTurkeySouth AfricaPolandSloveniaSlovakiaCzech RepublicLuxembourgBrazilBulgariaCyprusIcelandRussiaIsraelSaudi ArabiaPakistanArgentinaBoliviaChileColombiaEcuadorPanamaPeruVenezuelaParaguayUruguayPuerto RicoUS Virgin IslandsGuatemalaCosta RicaNicaraguaLiechtensteinUAEUkraineEgyptBarbadosGuamKuwaitRomaniaSri LankaOmanBangladeshLebanonBelarusCroatiaLithuaniaEstoniaLatviaMaltaMoroccoTunisiaEuropeNorth AmericaIndonesiaDATAFAX: minForeverBlacklisted:Failed:Delayed:BlacklistedDialing...DATE=TIME=NMBR=NAME=MESG=+PMHR: OKCONNECTRINGNO CARRIERERROR1200NO DIALTONEBUSYNO ANSWER753006002400480072009600120001440016800192002160024000264002880031200336003840057600115200+FCERRORDELAYEDBLACKLISTEDBLACKLIST FULL320003400036000380004000042000440004600048000500005200054000560005800060000280002933330666333333466637333386664133342666453334666649333506665333354666 +F4 V44 NoEC V42 V42bis MNP2 MNP3 MNP4 MNP5Ver 0.208.30,Comm Standard BCommandCharEcho ESpeaker Volume LSpeaker Control MResult Codes QDialer Type T/PResultCode Form VExtendResultCode DialTone Detect BusyTone Detect LSD Action &CDTR Action &DV22b Guard Tone &GFlow Control &KError Control Mode \NData Compression %CAutoAnswerRing# S0AT Escape Char S2CarriageReturn Char S3Linefeed Char S4Backspace Char S5Blind Dial Pause S6NoAnswer Timeout S7"," Pause Time S8No Carrier Disc S10DTMF Dial Speed S11Escape GuardTime S12Data Calling Tone S35Line Rate S37NA7530060012002400480072009600120001440016800192002160024000264002880031200336003200034000360003800040000420004400046000480005000052000540005600058000600002800029333306663333334666373333866641333426664533346666493335066653333546662533326666V44LAPMNONEV42bisMNPMNP5V.92V.90Failure56KV.34V.32(V22)(Bell)1200/75BellMediumOnUntilCarrierToneTextIgnoreOff=ResetCommand ModeAlways OnNumberPulseOnOffHighLowCCITTBufferModeDirectModeMNP or Disc.V42 or Disc.V42,MNP,BufferV42,MNP+ESSyncBufferedHardwareSoftware1800 Hz550 HzStored Phone Numbers--------------------DIAG <2A4D3263 = >DIAG <2A4D3263 05 = "">0DIAG <2A4D3263 04 = "0 (Disabled)001 (Auto Rate)002 (28000)003 (29333)004 (30666)005 (32000)006 (33333)007 (34666)008 (36000)009 (37333)010 (38666)011 (40000)012 (41333)013 (42666)014 (44000)015 (45333)016 (46666)017 (48000)018 (49333)019 (50666)020 (52000)021 (53333)022 (54666)023 (56000)[0-23]+DR:+ILRR:+MR:+ER:(0,1)11038400576001152002304001ALT+MCR:+MRR:,V21V23V32BV32V22V22BV34V90V92V42B+DCS:1,20,+DCS:(0-1),(0-2)+DS:3,0+DS:(3,0),(0)+DS44:+DS44:(3,0),(0)+ES:0,1,01,0,14,4,63,3,54,0,62,0,23,0,23,2,4+IFC:0,02,21,13,1+IFC:(0-3),(0-2)+IPR:+ICF:6,0,3,2,1543+ICF:(0-6),(0-3)+ESR:0+ESR:(0)+ETBM:0,0,0+ETBM:(0),(0),(0)+EB:0,0,3,0,2,0,1,0,+MS:300,1200,V21,V23,V22,V22B,V32,V32B,V34,V90,V92,+MA:K56,+GCI:+GCI:() 0,1Data/Fax/Voice/VoiceViewData/FaxLucent Data/Fax8.30018012345678910111213+PMH: (0,1)+PMH: 1+PMH: 0+PMHT: +PSS: (0,1,2)+PSS: 2+PSS: 0+PSS: 1+PQC: (0,1,2,3)+PQC: 3+PQC: 2+PQC: 0+PQC: 1+PCW: (0,1,2)+PCW: 2+PCW: 0+PCW: 1+PIG: (0,1)+PIG: 0+PIG: 1 LT V.92 Data+Fax Modem Version 8.30Last Connection Initial Transmit Carrier Rate Initial Receive Carrier Rate Final Transmit Carrier Rate Final Receive Carrier Rate Protocol Negotiation Result Data Compression Result Estimated Noise Level Receive Signal Power Level (-dBm) Transmit Signal Power Level (-dBm) Round Trip Delay (msec) Near Echo Level (-dBm) Far Echo Level (-dBm) Transmit Frame Count Transmit Frame Error Count Receive Frame Count Receive Frame Error Count Retrain by Local Modem Retrain by Remote Modem Call Termination Cause Robbed-Bit Signaling Digital Loss (dB) Remote Server ID Connection Time (sec) Description Status--------------- ------------ Press any key to continue; ESC to quit.Option Selection AT Cmd--------------- ------------ --------+ES:(0,1,2,3,4,6),(0-4),(0,1,2,4,5,6,8)+IPR:(0,110,300,600,1200,2400,4800,9600,14400,19200,38400,57600,115200)+EB:(0,1,2,3),(0),(10,20,30,40,50,60,70,80,90)+MS:(V21,V22,V22B,V23,V32,V32B,V34,V90,V92),(0,1),(0,300-33600),(0,300-33600),(0,300-56000),(0,300-56000)Lucent Data/Fax/Voice/VoiceView3,24,48,72,73,74,96,97,98,121,122,145,146+PMHT: (0,1,2,3,4,5,6,7,8,9,10,11,12,13)= -f!1'@/".),+QVR<AvB>_aTk4[T?$Z0‚¥¤`7gebÌÆ\6O89Qû3:SV!{öúùOË|h|Å(^ÈpÁwrtsdÔØÿ(8HXhxˆ˜¨¸ÈØèø(8HXhxˆ˜¨¸ÈØèø0Pp°Ðð0Pp°Ðð ` à ` à ` à ` à@À@ À @ À @ À @ À @ À @À@À€€€€€€€€€€€€€€€€!#%')+-/13579;=?BFJNRVZ^bfjnrvz~ (08@HPX`hpx„”¤´ÄÔäô$4DTdtŒ¬Ìì ,LlŒ¬Ìì ,LlœÜ\œÜ\œÜ\œÜ\¼<¼< ¼ < ¼ < ¼ < ¼ < ¼ <¼<üüüüüüüüüüüüüüüü| |"|$|&|(|*|,|.|0|2|4|6|8|:|<|>|A|E|I|M|Q|U|Y|]|a|e|i|m|q|u|y|} 0@P`p€ °ÀÐàð 0@P`p€ °ÀÐàð @`€ Àà @`€ Àà@€À@€À@€À@€À€ € € € € € €€ @ "$&(*,.02468:<>€@DHLPTX\`dhlptx|ÿÿ $,4<DLT\dlt~Œœ¬¼ÌÜìü ,<L\l€œ¼Üü<\|œ¼Üü<\„¼ü<|¼ü<|¼ü<|¼ü<Œü|ü| ü | ü | ü | ü | ü |üœ|||||||||||||||¼|!|#|%|'|)|+|-|/|1|3|5|7|9|;|=ü?|C|G|K|O|S|W|[|_|c|g|k|o|s|w|{ÿÿ !"#$%&'()*+,.0123456789:;<=>@ABCDEFGHIJKLMNOQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€  !!""##$%&'()*+,-./001123456789:;<=>?@@ABCDEFGHIJKLMNOOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  $).3:@HQ[€€€@@@€€€€€@@@ €€€€/EQW@LL - ver 1.34, 2/11/2000¬Ìü,L|¬Ìü,L|¬Ìü,L|¬Ìü,LŒÜ|Ü | Ü  | Ü  | Ü  | Ü  | Ü |Üœ=¼|<¾|<¼0P€°Ð0P€°Ð0P€°Ð0P€°Ð`  `   `   `   `   `   ` `  À@À@À@Œ¬Ìì ,LlŒ¬Ìì ,LlœÜ\œÜ\œÜ\œÜ\¼<¼< ¼ < ¼ < ¼ < ¼ < ¼ <¼<üüüüüüüüüüüüüüüü0Pp°Ðð0Pp°Ðð ` à ` à ` à ` à@À@ À @ À @ À @ À @ À @À@À€€€€€€€€€€€€€€€€œ¼Üü<\|œ¼Üü<\„¼ü<|¼ü<|¼ü<|¼ü<Œü|ü| ü | ü | ü | ü | ü |üœ|||||||||||||||¼ @`€ Àà @`€ Àà@€À@€À@€À@€À€ € € € € € €€ @ ‚‚‚‚‚ ‚‚‚‚‚ €€€€ ‚€ €€€€ ‚€ €€€€ ‚€ €€€€ ‚€ lllll9 óóóóóÿddddl9 óóóóóÿ°        Ä Ñ á í ù    ) 5 A M Y e q } ‰ • ¡ ­ ¹ Å Ñ Ý ð õ ü      úþ !-   # 1<=B{Y~‚ ¥¦´ &alœ©T‹µWP sS¼‰FQ®ŸŠ.i-R¸X˜„%'5…ˆ»‡·ŒI+h³²6HbŽ¡ƒ dpw­&(*,.02468:=@Cÿÿÿÿÿÿÿ?ÿ/sbin/ltmdmappGCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5).symtab.strtab.shstrtab.rel.text.rel.rodata.rodata.str1.1.rodata.str1.32.rel.data.bss.comment4¿ ¬EàÍ )d÷ % ŒÐJ 12dú@2€ © T@¨% P \^@ Zè8<_è8) ChœdÐs y lØwm±&Î>Ò¾ŽËPØê­øƒŽ$Ä0Ž>POTma9u’Ž©Pƒz´„ÇŠÓ£´¯ÇµÓÈ´ß´öÇÓ´N´ˆõ•Óñb±i±p±w±~±…±Œ±“±š±¡±¨±¯±¶±½±Ä±Ë±Ò±Ù±â±é±ð±÷±þ±± ±±±!±(±/±6±=±D±K±R±Y±`±g±n±u±|±ƒ±Š±‘±˜±Ÿ±¦±±•¸±¿±Æ±Í±Ô±Û±â±é±ð±÷±þ±± ±±±#±,1±7±>±E±L±S±Z±a±h±o±v±|熱•±œ±£±ª±±±¸±¿±Æ±Í±Ô±Û±â±é±ð±÷±þ±± ±±±!±(±/±6±=±D±K±R±Y±`±g±n±u±{€±…ç”™±Ÿ±¦±­±´±»±Â±É±Ð±×±Þ±å±ì±ó±ú±±±±±±$±+±2±9±@±G±N±U±\±c±içx}±ƒ±Š±‘±˜±Ÿ±¦±­±´±»±Â±É±Ð±×±Þ±å±ì±ó±ú±±±±±±$±+±2±9±@±G±Mç]±d±k±r±y±€±‡±Ž±•±œ±£±ª±±±¸±¿±Æ±Í±Ô±Û±â±é±ð±÷±þ± ± ± ± ±! ±( ±/ ±6 ±= ±C H ±N ±U ±\ ±c ±j ±q ±x ± ±† ±Œ ç™ ±  ±§ ±® ±µ ±¼ ±à ±Ê ±Ñ ±Ø ±ß ±æ ±í ±ô ±û ± ± ± ± ± ±% ±, ±3 ±: ±A ±H ±O ±V ±] ±d ±k ±r ±y ± „ ±Š ±‘ ±˜ ±Ÿ ±¥ çµ •¼ ±à ±Ê ±Ñ ±Ø ±ß ±æ ±í ±ô ±û ± ± ± ± ± ±% ±, ±3 ±: ±A ±H ±O ±V ±] ±f ±o t ±z ± ±ˆ ± ±– ± ±¤ ±« ±² ±¹ ±À ±Ç ±Î ±Ô çÞ ±ì ñ ±÷ ±þ ± ± ± ± ±! ±( ±/ ±6 ±= ±D ±K ±R ±Y ±` ±g ±n ±u ±| ±ƒ ±Š ±‘ ±˜ ±Ÿ ±¦ ±­ ±´ ±» ±Á çÑ •Ø ±ß ±æ ±í ±ô ±û ± ± ± ± ± ±% ±, ±3 ±: ±A ±H ±O ±V ±] ±d ±k ±v { ±€ çŠ ±™ ±  ±§ ±® ±µ ±¼ ±à ±Ê ±Ñ ±Ø ±ß ±æ ±í ±ô ±û ±± ±±±±%±,±3±:±A±H±O±V±]±d±k±r±y±„±Š±‘±—礩±¯±¶±½±Ä±Ë±Ò±Ù±à±ç±î±õ±ü±± ±±±±&±-±4±;±B±I±P±W±^±e±l±r籈±±–±±¤±«±²±¹±À±Ç±Î±Õ±Ü±ã±ê±ñ±ø±ÿ±± ±±±"±)±0±7±>±E±L±S±Z±a±gl±r±y±€±‡±Ž±•±œ±£±ª±±±¸±¾çͱԱ۱â±é±ð±÷±þ±± ±±±!±(±/±6±=±D±K±R±Y±`±g±n±u±|±ƒ±Š±‘±˜±Ÿ±¦±­±³¸±¾±Å±Ì±Ó±Ú±á±è±îçü±±±±±#±*±1±8±?±F±M±T±[±b±i±p±w±~±…±Œ±“±š± ç¬±±·±¾±Å±Ì±Ó±Ú±á±è±ï±ö±ý±± ±±± ±'±.±5±<±C±J±Q±X±_±f±m±t±z爱“±š±¡±¨±¯±¶±½±Ä±Ë±Ò±Ù±à±ç±î±õ±ü±± ±±±±&±-±3çA•LQ±W±^±dçn±u±|±ƒ±Š±‘±•¦±­±´±»±Â±ËбÕçá’ìñ±÷±þ±± ±±±!±(±/±6±=±D±K±R±Y±`±g±n±u±{çˆ{•±›±¡ç°µ±»±Â±É±Ð±×±Þ±äçðõ±û±± ±±±±%±,±3±:±A±H±Nç\a±g±n±u±|±ƒ±Š±‘±˜±Ÿ±¦±­±´±»±Â±É±Ð±×±Þ±å±ì±ó±ú±±±ç…$)±/±6±=±D±K±R±Y±`±g±n±t瀅±Šç˜’ ¥±ªç¸½±ÂçÐÕ±Úçèí±òç± ±ç %±*ç8=±C±J±Q±X±_±f±m±t±{±‚±‰±±—±ž±¥±¬±³±º±Á±È±Ï±Ö±Ý±ä±ë±ò±ù±±±±ç %±+±2±9±@±G±N±U±\±c±j±q±x±~猑±—±ž±¥±¬±³±º±ÀçÌѱױޱå±ì±ó±ú±±±±±±$±+±2±9±@±G±N±U±\±c±j±q±w焉±Žçœ¡±¦ç´¹±¿±Æ±Í±Ô±Û±â±é±ð±÷±þ±± ±±±!±(±/±6±=±D±K±R±Y±`±g±n±u±|±ƒ±Š±çœ¡±¦ç´¹±¿±ÅçÔÙ±Þçìñ±öç ±ç!±&ç49±>çLQ±Vçdi±nç|±†ç”™±žç¬±±¶çÄɱÎçÜá±æçôù±þç ±ç$)±.ç<A±FçTY±^çlq±v焉±Žçœ¡±¦ç´¹±¾çÌѱÖçäé±îçü±ç±ç,1±6çDI±Nç\a±fçty±~猑±–礩±®ç¼Á±ÆçÔÙ±Þçìñ±öç ±ç!±&ç49±>çLQ±Vçdi±nç|±†ç”™±žç¬±±¶çűϱB ±K ±R ±Y ±` ±g ±n ±~ ȃ ±“ ±š ±¡ ±¨ ±¯ ±¶ ±½ ±Ä ±Ë ±Ò ±Þ ±ê ±ö ±ý ± !±!±!±*!±6!±D!±P!V!±]!±d!±l!±s!±z!±!±‰!±!±—!±ž!±ª!±±!±¸!±¿!±Æ!±Í!±Ô!±Ü!±ã!±ê!±ñ!±ø!±ÿ!±"±"±"±"±&"±1"±B"‚I"XP"•W"±^"±e"±q"±ƒ"±•""…£"±ª"±±"±¸"±¿"±Æ"±Í"±Ô"±Û"±â"±é"±ð"±÷"±þ"± ##±#±%#±,#±3#±:#±E#K#±Q#±V#çc#k#±r#±y#±‚#±‰#±#±—#±¥#­#±´#±»#±Ç#±Ó#±Ú#±á#±ï#õ#±$ $±$±$±#$±/$±6$±=$±D$±R$X$±_$±f$±m$±t$±‚$$š$±¦$±¹$Á$•É$±Ð$±×$±Þ$±å$±õ$±ü$±%± %±%±%±%±&%±/%±8%±?%±F%±M%±T%±[%±b%±i%±p%±w%±~%±…%±Œ%±“%±ž%±¨%±¯%±¸%±¿%±Æ%±Í%±Ô%±ã%±ì%±ö%ü%•&±&±&±&±$&±+&±3&±;&±C&•J&±Q&±X&±a&±i&±p&±w&±~&±…&±Œ&±“&±š&±¡&±©&±±&•¾&±Æ&±Í&±Ô&±Û&±â&±ê&±ò&•û&±'± '±'±'±!'±)'±1'±8'±?'±N'±Y'±k'•~'±'±–'±¢'±«'±²'±¾'±Ë'±Ô'±â'è'±ï'±÷'±þ'±(± (±(±(±"(±)(±0(±7(±?(±F(±M(±T(±[(±b(±i(±p(±w(±(±‡(±Ž(±–(±(±¥(±¯(±»(±Ê(±Ó(±Ý(ã(±ê(±ò(±ù(±)±)±)±)±)±$)±/)±6)±=)±D)±K)±R)±Y)±a)±i)±p)±‚)±)±©)±°)±º)À)±Ç)±Ï)±×)±Þ)±å)±ì)±ó)±û)±*± *±*±*±"*±)*±1*±8*±?*±G*±N*±V*±]*±d*±k*±r*±y*±€*±‡*±š*•§*±Ì*±Ü*â*±é*±ð*±÷*±þ*±+± +±+±+±!+±(+±0+±7+±>+±E+±L+±S+±Z+±a+±i+±p+±w+±~+±…+±Œ+±“+±š+±¡+±¨+±¯+±¶+±½+±É+±Ð+±×+±Þ+±å+±ì+±ó+±ú+±,±,±,±,±,±$,±0,±7,±>,±E,±L,±S,±Z,±a,±h,±o,±v,±},±„,±‹,±—,±ž,±¥,±¬,±³,±º,±Á,±È,±Ï,±Ö,±Ý,±ä,±ë,±ò,±ù,±-±-±-±-±-±#-±3-±:-±A-±H-±O-±V-±]-±d-±k-±r-±y-±€-±‡-±Ž-±•-±œ-±£-±ª-±±-±¸-±¿-±Æ-±Í-±Ù-±à-±ç-±î-±õ-±ü-±.±.±.±.±$.±+.±2.±9.±@.±G.±N.±U.±\.±c.±j.±v.±}.±„.±‹.±’.±™.± .±§.±®.±µ.±¼.±Ã.±Ê.±Ñ.±Ø.±ß.±æ.±í.±ö.±/±/±/±/±(/±:/±A/±H/±R/±Z/±a/±h/±o/±z/±Ž/±•/±ž/±¦/•¯/±¶/±½/±Ä/±Ë/±Ò/±Û/±æ/±í/±ö/±ý/±0±0±0±(0±P0‚b0«k0±q0±¥0±R1±d1±Å1 Ñ1Ëï1Óù1þ2ç2«2±.2±K2±U2±^2±k2±{2±„2±‹2±–2±Ÿ2•¦2±¯2±Ü2±ñ2‚ø2Xÿ2•3±3±3±3±!3±R3X3Xb3±r3‚y3±‚3‚‰3±3±™3‚¢3‚©3±²3X¹3±Â3XÉ3•Ò3•Ù3±â3•é3±õ3•4• 4X4X4•#4±/4•84•D4•P4•W4±y4±Ž4±–4‚4±¦4±¸4Ö4±à4ö4±5B5±5±"5,'5à75±@5±P5±[5±b5±i5±p5±w5±~5±…5±Œ5±“5±š5±¡5±¨5±¯5±¶5±½5±Ê5±Ñ5±Ø5±ß5±æ5±í5±ô5±û5±6± 6±6±6±6±%6±,6±36±:6±A6±H6±O6±V6±]6±d6±k6±r6±y6±€6±‡6±Ž6±•6±œ6±£6±ª6±±6±¸6‚Â6±Ï6±Ù6±à6±ç6±î6±õ6±ü6±7± 7±7±7±7±&7±-7±47±;7±B7±I7±P7±W7±^7±e7±l7±s7±z7±7±ˆ7±7±–7±7±¤7±«7±²7±¹7±À7±Æ7Ë7±Ñ7±Ø7±Þ7çê7Èï7±8 8¬8±8]#8›*8±U8ÐZ8Ð`8±j8±o8±u8•ƒ8±Œ8±™8®¢8±­8Ý·8±É8±Ö8Ý8±ç8Mî8±÷8±9c 9±9±+9±99’C9¨M9±Y9­c9…k9p9±u9ç‚9ãŒ9Q–9< 9±¬9¤¶9…¾9Å9Ï9Ù9’ã9 í9±ù9ë:… ::± :k*:…2:<:…F:P:KZ:ïd:‰n:àx:{‚:hŒ:E™:£:è®:±¹:)Ã:iÍ:C×:wá:fë:Õõ:ÿ:¾ ;J;™;î';È1;à;;™E;R;\;3d;n;8x;V‚;ØŒ;~–;  ;<ª;ô;Œ¾;È;nÒ;ÃÜ;®æ;Ñð;žú;·<†< <È"<†,<o6<þ@<J<ÒT<¡^<>h<Fr<!|<†<'<Íš<r¤<®<¸<òÂ</Ì<1Ö<¯à<Wê<Ôô<Îþ<è==ß=±*=±8=±>=±D=±L=±S=±`=±p=±v=±|=±ˆ=±Ž=±š=±Ÿ=±®=´=±»=±Á=\Æ=±Ì=±Ø=±Þ=±è=±í=±ó=±ÿ=±>±>±>±>±&>±,>±6>±@>±L>±S>±Z>±a>±m>±y>±…>±‘>±>±©>±°>±¼>•É>±Ð>±Ü>±ã>±ï>±û>±?±?±?±%?±,?±3?±:?±A?±H?±O?±V?±]?±d?±k?±r?±y?±€?±‡?±?È’?±˜?±Ÿ?±¦?±­?±´?±»?±Â?±É?±Ð?±×?±Þ?±å?±ì?±ó?±ú?±@±@±@±@±@±$@±+@±2@±9@±@@±G@±N@±U@±\@±c@±j@±q@±{@±‚@±‰@±@±—@±ž@±¥@±¬@±³@±º@±Á@±È@±Ï@±Ö@±Ý@±ä@±ë@±ó@±û@±A± A±A±A±A±&A±.A±5A±B±FB3QB•XB”bBÒlB!vB€BŠB ”B›B\¢B±©B±°B±·B±¾B±ÅB1ÍB±ÖB±ßBeäB'éBÍïBWûB±C,C5C,SCaCÈzCˆCÈžCµCÈÝCÈöCÈ D,DàD±2D;D±PD±WD±^D±iD®pD±uD±ˆD,D±®D,ÉD,ÔD,ÙDàÞD'EÈ4EÈ}E,¢E,ÄE,ÉEàÙEy)c‘*·E0ïß0ôç0ï1Ê1413$1 ^1·r1ž•1Q¨1 °1‹¸1ƒÀ1ÝGCàíETôE”þE!FÜF¨F¾"FÊ*Fé0FI7Fî>F‡EF‚LFåSFî]F3cFTrFmwFùŒFܘFžF±§F}±F±¸FÜÂFÜÉFaÐF¨ÖFõÜFáF±æF©ëF!ñFðG± G9GÜG±$G”3GÜ@G±IG•RGW_GeGÓGW‰GmGóžGÿ¯Gÿ¹GGÁG±ÊGªÚG9àGÜéGõòG•ùGÿG}H(H1H4;H±HHNHÓaHgHÓzHîHÜ‹H”™HõŸH¥HܯH”½H‡ßHÜíHõóHøHõIåI I±I©IÜIª(I±9IIFIÜYI?nItIÓ‡IܘI9¢Iõ¨I·I½IÓÌI±ÕIÜÞI7çIäðIöI•J'JÜJÜ)Jó;J!JJPJ“UJõ[J`JõfJåkJ’qJÜ€J•J'•J¯£J ¶J9¼JÜÅJõËJÒJ×JªâJÜñJ¢ýJÌ K±K$K)KÏ0K±EKLK±SKÜ]K!mK¢zKDK ”K±¡K§KÓºK±ÇK¨ÓKØKõÞKéK±öKüKÓ LLÜL±%LÜ/L!DLKLÜTL7]LäfLðlL±ƒLÜLÜšL?¤L“®L´LÓÃLÜÑLáÖL­àL“êLáïL­ôLM MÓMÜ(M/M!>MÜHMaNMõTMbMÛoMtMÏ{M±”M›MÜ¥M!³M™½MÄMËMÜÚMÜäM”íMõóMøMõN N9N$NÓ3N±HNMNVNî`N±hNõnNuNŒN‡NÓŽN±§NܱN¸N!ÂNÍNaÔNÚN‡áNaèNÜñNõOO9 OO•'O'0O 9O±BO¨JOJOOyUOÜ^OõdOnOJsOyxO€O±OÜ”Oy™OÈŸOܪO4¼OÂOÓÎO±çO±ïOõõOûOÜPæ PõPPPÓ&P±CPîJPÜTP”}P4P•PÓœP±¼P±ÁP9ÆP±ÑPÜÝP±äP“éPõïPùP¯Q” QÜQ$QÓ6QJT”MTÜ]TcTÓuTÒT¼ŽT›œTܦT­T!¶T9ÆTÓTÙTÓãTÉ÷TÜU9 U9U?,Uõ2U9UZ?UÜMUñ[UaUÓtU”}UZ‹UÜ”U9™US§U“±Uá¶U­»UÓU?ÝU¾éUïUÓÿU±V± V&VÓ8VUV?[V¾`VõfVpVõvV|V܆Va‘V“›V¡VÓ»V?ÐVóÕVÞVaèVØûV9WÜWÂWÂ#W9@W•MW±ZWðjW?{WðŒW?šWð Wð²Wi¸WÓÏWiÕWÓôWóX XðX±%Xð8X?GXðWX?eXð}XIŽXóœX¥X±®Xð»XIÃXðÏXIàXóîX÷X±þXðYI%Y9:Y?MYSYÓhY±oYm€YóYõ“Y©Y´ÈYqÒYm×YõàYÇZ ZZZ”0Ze5Z'?ZIDZMOZªWZÝ]Z gZqZÜ|ZZŒZÜ–ZØ Z”ªZ¹ZD¾ZçÆZõ×ZÜZ9ðZDùZ‚[Ü [”[õ[%[ó3[”<[õB[•I[åQ[±^[Üj[w[±€[õ†[±[i“[ðš[ܰ[µ[õ»[Ì[mà[óí[Sò[Ýø[±\  \”\Z\•\±&\”0\Ü:\V\D[\ f\±r\ }\”‹\”“\Z™\Ü£\!¬\õ²\¸\Ë\±Ó\1Ú\Zà\ ê\”ô\Ü]D ] ] ]”?]”P]”b]”l]Üv]!ˆ]”’]Ü›]÷©]”³]ÜÊ]”Ö]” ^±(^11^Ü=^!G^S^!a^Zh^Üx^Ò½^›Ã^ÜÒ^ÜÚ^›ä^fí^Üû^½_Ò _Ü__›#_õ)_±0_6_M_›R_ZX_Üa_õg_u_Ɉ_±Ž_õ_a¤_Ü®_ܵ_¨»_!Ð_Ö_Üã_Üø_á#`?0`ÜD`óK`ÍU`Ô]`Òi`Üx`°~`Ü‘`L£`Yª`…¸`ÒÄ`ÜÓ`Qa€!aÂ/a=aaDaÜNaÜUa¨lava¸‹a?£aªa¸Åa?Ýa¸]M CNfaP“¢UÝ1Wâ:Wù†Z¹r[ªL\|\]õ‚]›£]Ûâ]wò]I˜^Û¨^L¸^Y@_bH_Ë_z`ÿ²`þì`Šô`©ü`½a% aÆ7a!óaóbóbób± bó.bCbóQbó_bóhb±pbó~bšbØ¡bóªbî¶b#Æb§ÌbóÚbóæbúìbó÷bócócócó'c±6có=c±EcœKc½Xcgcwc+‰cóŽc½žc©cÆ®cÆcÝcsïcódó d+=d+[d+d’d¡d§dî½d?Íd±âd±úd? eÒ"eá'e­3eáqQHqñYq9bqñrq{q9…qÇ‹qÓ”qQºq±Èq±Üq±ãqQöq±rQr21r}:rñKr9Ur^r9r}¦rñ·r9ÁrÊr9Òr±Ûr±ðr9ÿrs9s±2s¶`s±is±†sQ•s±›sQ¯s«ÍsÖs9æs9t± tQt"/tQ5tñFt9Vt9etnt9~t9t±“tQ¢t"ÆtÏt9ßt9õt±þt±u9u±)uÅ5uÆAuÆMuÆ_uhu9tu9‡u±“uóœu±¤uó­u±µuó¿u±Çu±Ôuóäuôu±v± v± vó-vó2v±kvótv•‡v¢vóÀv Úv©øvóÿv±ww¦2wópwBzw±‚wówóžwó¬wóºwóÈwóÖwóäwóòwóxóxóx!xõ'x´,xõ2x87xõ=x¶Cx·MxTXxpaxxx?†x?xT½x´ÃxÓÊx±îx?y±y±"y{-yõ3y(:yDBy±Qy±Zy±byõhy´Žy‰­yõ³y´ºyDÐy‰êy{úy? zpz±/z(5zÓIzpXz(^zÓlzDrzT}zpŽz(”zÓz±¨z±³z±ÉzõÏz´Þz?òz‰ûzD{{ {õ{({T&{?:{pN{(T{ÓZ{‰`{Ts{py{±¥{õ«{´²{pÃ{?Ý{ï|U |Ó|ï&|õ,|9|õ?|D|õJ|UU|õ[|Ua|ïq|w|Ó¡|?¯|?¶|·à|¶æ|Óõ|4ý|S}Ð}}4 }±-}4=}±L}U}a}õg}¶l}±‚}±‘}±}S¾}±Ê}ÐÚ}±í}4ó}4ú}S~Ð~S/~ÐJ~Ðj~S~~Ф~ÐÁ~?Ô~á~õç~©ö~¶ü~Óз&¶,ÓC?V·aSjÐw·‚S‹О?±Ã¶ÉÓÜ å±û±€õ€¶"€õ(€©0€¨=€C€ÓV€¶\€Ób€Sz€¶€€Ó†€SŒ€· €õ¦€Ÿ«€õ±€Ä¶€õ¼€K€ßÍ€5Ö€JÞ€¢ï€?ü€ß(¢6K<ÓC±e¢rŸxÓ±ª5ÀJÍ¢Ó¢ëKñÓþJ‚ß‚õ‚K!‚õ'‚Ä;‚ÄA‚ÓZ‚Ä`‚Óf‚5l‚ßu‚õ}‚ÄŽ‚?›‚õ¡‚8²‚8¸‚ÓЂ0æ‚óô‚óƒó ƒ±ƒó!ƒ7ƒóˆƒv„?‹„8‘„Óš„;®„?½„;Ê„8ЄÓÚ„;÷„I…I…ó…ó-…ó;…óI…óW…ób…óm…óx…óƒ…ó‘…–…õ¥…Óº…É…±Ø…ká…`î…±†Ž†å†Ó$†±K†!Q†ÜZ†Ii†õo†å}†؆“†4š†ï¥†&¬†õ´†Dº†©¿†¾̆!冱ì†zð†Dû†D‡ ‡±%‡±2‡};‡±R‡å^‡õd‡8i‡}z‡ ƒ‡±‡Iœ‡I¥‡Ø®‡õ´‡±»‡8чIà‡Iê‡óð‡}û‡óˆ!ˆ}ˆõ#ˆå)ˆØ<ˆBˆÓgˆDlˆø‡ˆ±”ˆ± ˆ±®ˆD³ˆØÀˆDLjzˈDшzòˆz‰z‰8‰Ó*‰z9‰J?‰ØH‰õN‰8X‰'c‰}m‰Øy‰±‚‰±“‰8™‰Ó ‰±¹‰±‰±ω8Õ‰Ó䉱õ‰8û‰ÓŠ!б%Š 6ŠD;Š HŠVŠ!aŠxŠ8~ŠÓ…б¥Š±­Šõ³Š¾Š ËŠIÕŠ±ÛбâŠëŠùŠ8ÿŠÓ‹±+‹±4‹ØG‹IR‹!e‹8k‹Ór‹±‹I•‹Ø¥‹Iª‹õ°‹8¿‹8ŋӨ‹8Þ‹Ó勱Œ8 ŒÓ ŒI-Œ:ŒCŒÌLŒ¹]ŒbŒÏiŒ±‚Œ!ŒŒê«Œ8±ŒÓʌҌØáŒ‚íŒõóŒ8ùŒz D±"±4z?‚R±Z±lI†±±˜±¥I«ظzÄ;ËJÑØÜ±ð&Ž±ŽŽ&%ŽØ5Ž@ޱRŽZޱcŽ}pŽ …Ž”ŽŽ9¥ŽI®Ž•ÃŽóÑŽÝŽJåŽëŽØôŽªÿޱ±0±Wõ`8k0qØšÁ£‚´z¹ ÅóÑ?éóö±D ±±.I3±IQØh‚„z•‚¢}± ¹J¿±ÈzÎØáIì±ù¨‘±‘±‘*‘‚0‘É8‘z>‘ÉG‘ñX‘9j‘8p‘Óz‘‚‘±‰‘ؘ‘zº‘À‘ÓÙ‘?ú‘z ’±’$’•,’õ2’8I’óW’c’n’=pšc†y‚’‹’•›’F ’¬’‹±’¿’Ñ’Òâ’ë’•ø’ý’“ó“*“Ù5“•J“ÿ\“®b“ÿn“W€“ÿ‘“ÿ©“ýµ“[ÓÿÏ“[Ý“ÿé“[÷“ÿ”[”•”[,”ÿ8”[F”ÿR”[`”ÿl”[…”ý©”j»”ÿÌ”óÝ”•ï”Sù”l•••ó>•ÿL•ÿ]•ÿl•Y€•®Œ•­Ÿ•ª­•峕IÇ•!Ì•‚Þ•Ç蕱ñ••–® –ÿ–ÿ1–Ç7–E–S–a–ÿ€– Ž–Ç›–«¥–±¸–ÿÈ–ÇΖ®×–®Ý–‚÷–®ý–ÿ—ÿ—±"—•4—>—zd—ó}—w„—ª‹—®’—"˜—þª—ÿ»—ÿÄ—‚Ñ—•ä—ÿö—Dü—ÿ ˜ÿ˜ÿ)˜ÿ:˜ÿK˜ÿ\˜ÿe˜•~˜ ‡˜Á£˜ µ˜ À˜;Ƙ?Ò˜?Û˜;é˜*ó˜‚%™ L™•S™‚`™•s™™›™ ¥™I®™•·™±È™±ЙóÙ™±á™óì™óõ™«þ™‚šIšîšãš•š•*š+3š«<š‚EšÁLšÁ^šršózš•‰šáœšÿ©š±¹šóÀš±Ïš¨ÙšI뚟øš«›«›ÿ›•,›«;›±F›±Q›±\›±m›á}›•„›±’›•Ÿ›•¯›‚¿› Ò› æ› ù› (œ1œÁYœj^œjiœjnœjxœ­œ•™œ Μ?Þœó䜇ùœ? ó˜&ó2?DóX?`ퟕ¸•ÀíËÚ‡æó?žž±ž‡#ž‡.ž±7ž‡Gž?Zž•vžó€ž·Šžl—žé¡žl²žó¸ž‡ÞžóèžËòžlÿžÊŸ?0Ÿ?JŸ?XŸ?fŸÒ…Ÿó‹Ÿ‡—ŸÒ¼Ÿ•П?áŸ? ‡ P" P0 ó< ?R óc ól • ó  ?¶ óÄ •ß ?î ‡þ ?¡ó¡•*¡4¡‡V¡‡\¡?z¡?ˆ¡?²¡ó¾¡?ï¡óú¡‡¢!¢?7¢‡R¢óx¢•Œ¢?ª¢ó¸¢óÉ¢ó×¢•è¢r£?£í%£?:£óF£O£^£Žf£u£Ž~£íŠ£™£Ž¡£ª£k¶£a¼£•Ç£~Ñ£lâ£óë£íø£ë¤•¤ó#¤•>¤ó`¤ón¤±‡¤±”¤±¹¤Ê¿¤  ¥±¥˜¥±*¥?¥±`¥k¥Òv¥±‡¥± ¥ó­¥ó³¥±¿¥PÎ¥PÔ¥Pߥ±æ¥Pò¥”ÿ¥˜¦ó$¦˜/¦ó?¦óH¦PS¦óa¦óo¦ó¦P¤¦˜¹¦˜ǦPõ¦±þ¦± §Ò§±.§óA§±W§±_§˜u§±ЧÒ¢§±º§ÒÛ§±ç§Òù§˜ ¨±¨Ò>¨±V¨Òq¨±‰¨Ò¤¨±¼¨Òר±ï¨Ò ©±"©Ò=©±U©Òp©±ˆ©Òž©±¶©ÒÌ©±ä©Òú©±ªÒ)ª±uª ˜ªó¬ªó·ªóŪóΪ±ÖªóÛª…⪱«± «ó%«½6«ó<«±C«±‹«óŸ«ó­«ó¶«±ë±É«œÔ«óÚ«‡é«±ò«”ú«±#¬±:¬±U¬±_¬±e¬±l¬±r¬M~¬ˆ¬±¬±¤¬9¸¬9ʬÓ¬•è¬ó­õ­ ­4­!­Ó0­•=­±J­IS­±[­±u­Iƒ­­Iœ­I¨­I´­I½­±Æ­}Ó­ é­Iò­ïÿ­±®õ ®®±®±2®}@®F®ÓX®I`®ãe®Úo®½u®匮Iž®I£®Í©®¶®I®IÇ®õͮҮõÛ®•õ®Ó¯Ž¯õ¯%¯Ó,¯±E¯IR¯9Z¯yg¯±p¯±¯I“¯IȯÚ¯Øç¯@í¯ó¯Òü¯°° °!°°?°)°?/°;°?A°M°?S°_°?e°q°?w°ƒ°?‰°•°?›°¥°º°ưIÒ°IÞ°Iê°Ió°±±±±• ±ó1±ÿB±ÿK±±R±IY±îe±ék±@q±w±Ò}±‚±‡±±“±!𱨡±©±±²± »±-ı±ѱ´Ú±à± å±Úî±±õ±±²I"²I.²I@²E²…Q²`²e²…q²‚²?’²Ò£²Ø²²˲óâ²?ñ²Ò³³M!³6³;³MI³Z³áz³á’³?®³Øµ³aÁ³ÂdzÒܳâ³?ë³Øþ³ß ´ß#´ß)´ß2´Ò9´qE´±Z´ d´±u´?ˆ´?—´±ž´±§´±°´˜À´@Æ´Ì´ÒÒ´×´«å´Ïï´Øþ´±µI'µó5µÒ:µß?µDµÒJµ±QµWµ@_µ±hµßvµ?|µº޵Ø¥µ?¾µ.ɵóÒµ.ݵóæµ.ñµóúµ.¶ó¶.¶ó"¶.-¶óH¶“N¶íU¶y¶~¶?ž¶?·¶á¼¶­Ô¶qÛ¶aá¶?í¶Øõ¶•·?·?)·\.·3·þH·?b·?s· €·±·•·6¢·«·•À·óÉ·íå·0ð·aö·aý·a¸ ¸¸%¸­4¸Ø;¸aD¸ÒL¸aT¸ag¸qn¸‡t¸Ûz¸Üƒ¸õ‰¸•¸?¬¸ó¹¸aøaθ+׸±ã¸ñ¸±ÿ¸Ø ¹ß¹Ò$¹?=¹?C¹Ò]¹­i¹ao¹a¹Û‡¹q’¹až¹a«¹º¹qιÒ2ºqMº?eº­~ºá…º­ºÒ«ºq´ºq¼ºØĺ­ÒºÒ׺@ݺaêºq»Ê » &»Ê,» C»ÊI» i»Êo» z»Ê‰»•»Ê¥» ±»a¹»jûlÔ»óå»±ù»;ÿ» ¼;¼z¼Ó/¼á4¼;@¼áE¼ Q¼áZ¼;`¼ s¼ ¼Ø•¼?¯¼;µ¼Á¼;μzÔ¼Óç¼áì¼;ø¼áý¼  ½á½;½ !½ 0½;6½A½;N½zT½Óg½ál½;t½;‡½?š½ ¢½ ±½”¹½*ʽ?ݽwä½Êú½?¾?.¾@3¾ÒC¾J¾ýV¾¦^¾ae¾–n¾±¾†¾€޾š•¾š¢¾š®¾€¶¾šÁ¾ý̾šÓ¾à¾šë¾šö¾šþ¾¿ý ¿€¿¿ý"¿)¿š1¿€<¿áK¿Ø`¿ói¿Òw¿q~¿‡…¿+‹¿Û‘¿Üš¿õ ¿¬¿?ÿóô¿?À›/Àÿ@ÀÿLÀáaÀÿtÀÿ€À[”Àÿ À[©Àï±ÀÃÀýÏÀ âÀ ëÀìôÀTûÀÿ ÁÿÁ Áì!ÁT1Á±9Á±KÁIWÁIxÁóš”ÏF—@¶\€»sË¿…ÁwœÁw¢ÁÿµÁ6»Á{òÁ$Âô Â{Âö"Â{*Â"0Â{6Â{PÂ$nÂwtÂô‡Âw˜ÂöžÂ{¦Â"¬Â{ÅÂ6ßÂ%þÂ6Ã%ÃÃ%&Ãe,Ã%9Ã%‘Ã6¤Ã®¹Ã6ÔÂíÃôÿê ÄîÄ•Äî,Ä®3ÄÙ:ÄîAÄÜGÄãeÄ®pÄôyÄ—Äì‡Ä’ Ä6°Ä±¼ÄÏÉÄ6àÄ6Å5Å Å6Å#Å+ÅCÅ6PÅœYÅØfűrއÅô“Å6˜Åo¤Å6©Å µÅ6ºÅ ÆÅ6ËÅ;åÅôêÅXóÅ• Æô Æô)Æ•/ÆîQÆôWÆ®oÆ®‚Æ—ŠÆìÆ’ºÆ;ÀÆõÐÆzÕÆÿèÆÿ÷ÆÿýÆ;ÇzÇÓ'Çá,Ç;3Ç;JÇïXÇ nÇTxÇì~lj„Ç«ŠÇý–Ç[¤Çÿ°Ç[¹Ç‚ÆÇ•ÔDZêÇàÈáÈÁ5ÈÿFÈÿsÈàŠÈàŸÈá¬È±²È«¹ÈÁ¿ÈLÇÈ«èÈÿ÷È«Éÿ(Éÿ?ÉÿMÉÿkÉ rɤ”É ŸÉ±·É ÊÉ çÉÿûÉýʂʮ&Ê®?Ê ]Ê jÊ5Ê Ê ªÊ3¿Ê ÕÊ âÊËôÊ»ÿÊ® ˮˮ*Ë×fË5|Ë©ˆËë¨Ë©´Ëë÷ËýËL Ì©Ìë5ÌL:ÌÁKÌ VÌ eÌ pÌ zÌLƒÌLÌL›ÌL¨Ì¤¶Ì¤Ì̤Ṳ́aÉTÊ’”ÊdËÊ>ËWË’ñÌ‚ý̱ ͱͱ,ͱ9ÍIEͱPͱYͱ`ͱgͱpͱyͱ†ÍIšÍIªÍI¶Í±ÁͱÎõÎá(ÎÓAÎÿ}Îý‹ÎÉÎõ¡ÎÓ¼ÎýÙÎÉäÎÉòÎÉÏÉÏõÏá,ÏÓGÏý[ÏýwÏ•¡Ï±°Ï±ÿÏárÐážÐá¸Ð•ùЂѕÑÿ&Ñÿ4ÑÿBÑÿPÑÿ^ÑÿzÑÿ‹ÑÿœÑÿ­Ñÿ»Ñÿ×ÑÿåÑÿóÑÿÒÿ Ò•Òÿ*Òÿ4Ò±>Òê^ÒÿnÒCsÒ|ÒöÒÒÞ’Ò›Ò˜ Ò©Òb®Ò¿ÒóÐÒóÙÒ0ÞÒçÒ³ìÒúÒÓÓ*Ó¹/Ó;Ó@ÓIÓDNÓZÓ_ÓhÓåmÓvÓ {Ó„ÓŸ‰Ó’Óc—Ó£Ó}¨Ó¼ÓÊÓÿÖÓ[çÓ±îÓmüÓó ÔóÔó/Ôó@ÔóNÔó_ÔópÔóÔó’Ôó—Ô±·ÔóÈÔóÙÔóêÔóûÔó ÕóÕó&Õ±8ÕóIÕóRÕ±fÕIwÕó–Õó±Õ?ÍÕ•ÚÕIèÕÿöÕÿÖÿ Ö±Ö—/Öÿ=ÖÿKÖÿ^ÖjÖIsÖ±{Ö±•ÖIªÖ ¹ÖóÈÖžÍÖÀÚÖ5ÞÖžäÖîÖdøÖ»×á ×á×ÿ0×®6×ÿ?×”H×_×óŠ×ÿ™×žŸ×¥×À«×5¯×žµ×¿×dÕ×¼Ú×ö×óØó"Ø(Ø‚;Ø–YØ–mØ–ƒØ–رžØ•§Ø‚·Ø–ÕØ–òØÇÙ Ù“ÙÙ•5Ù•IÙ]ÙËtÙ…Ùý“Ùÿ˜Ù»¤Ù[¬Ù•ºÙÃÙ•ÙÙýêÙóÙÁÚIÚ !Úq)ÚÁ8ÚQÚbÚÁkÚ‚{Úó—ÚÁ Ú‚ºÚÁáÚ±ôÚ‚ ÛÛ±*Û±4Û—>Û±LÛ±WÛ±`Û‚Û±‹Û•™Ûï¦Û‚ÝÛ±éÛ•÷ÛïÜ‚/Ü8Üï]ÜfÜïy܂ܕ¨Üÿ¼ÜýÁÜ‚ÓܱÜÜ•éÜEûÜÝïݱÝê=ÝZÝ bÝ‚ˆÝ±‘Ý‚¨Ý±Ýï¿Ý±ÍÝêÙÝ‚ìݱõÝ• ÞýÞE(Þý9ÞÿMÞýgÞ pÞ‚žÞµÞÄÞ±âނ߂ߕGß•¹ß‚Íßáßßÿíßÿùßá àÿà‚5à?à±Wà•pà‚xైౖౣà±]Îÿ§Ï•ŽÐÿÑÐòâ×W"Ù|0ÙˆYÚ yÛ•bà'jà)ÈàõÎàzÝàáñàz÷àÓá;áÿ,áÿ7áÿ<áõBázMá;Záz`áÓsááxá;„ááá;“á §áÿ­á ¸á êáÿùáÿâÿâÿ-âŸHâŸXâqâÿ}⟋âÿ âÿ©â¾âÿÐâ®ÖâÿÜâwúâÿãá%ãá^ãÿkãÿzãÿ‰ãÿ˜ãÿ§ãÿúãÿäÿäÿ%äÿ4äÿCäÿRäÿaäÿpäÿ•äÿ¢äÿ¯äÿ¾äÿÍäÿØäÿùä;ÿäÿ åÿåÿ$åÿ)åõ/åzAåáUåz[åÓsåÿåá„å åá•å ¡åá¦å;¿åÿÈå‚Ïå Öå ßå"æå íå æ®æ"3æódæó…æ®‹æ¥æ®¸æÿÁæ®Ìæÿàæ ìæóçõçzçá'çz-çÓEçóNçcçÿtçÿ}箪çÿ³ç®Ýçÿøçÿ èÿ)èÿ4èÿ9è;tèÿ’èÿšè;Òèÿçèÿé®6éá^éáléá|éáŒéáœéáªéá¸éáÆéá=ê•Gê±Oê±Wê±_ê±eê—xê•¥êÿÂê õêóëóVëÿcëÿpëÿëÿŠëÿ â;³ã;|ä;âä;˜çÿPéÿÖê?3ë”ë;šëû¤ëû®ëû¸ëûÂëûÌëûÖëûàëûêëûôëûþëûìûìûìû&ìû0ìû:ìûDìûNìûXìûbìûlìûvìû€ìûŠìû”ìûžìû¨ìû²ìû¼ìûÆìûÐìûÚìûäìûîìûøìûíû íûíû íû*íû4íû>íûHíûRíû\íûfíûpíûzíû„íûŽí˜í¢í¬í¶íÀíÊíÔíÞíèíòíüíîîî$î.î8îBîLîVî`îjîtî~îˆî’îœî¦î°îºîÄîÎîØîâîìîöîï ïïï(ï2ï<ïFïPïZïdïnïxï‚ïŒï–ï ïªï´ï¾ïÈïÒïÜïæïðïúïððð"ð,ð6ð@ðJðTð^ðhðrð|ð†ððšð¤ð®ð¸ðÂðÌðÖðàðêðôðþðñññ&ñ0ñ:ñDñNñXñbñlñvñ€ñŠñ”ñžñ¨ñ²ñ¼ñÆñÐñÚñäñîñøñò òò ò*ò4ò>òHòRò\òfòpòzò„òóÓ<óÐIóЛó.Èóôô.!ô²GôŠ“ô.œô.±ô.åô.ìô.ÿô.õ.õ."õ.Cõ|õŠõ’õ7É÷ìÞ÷èå÷ìò÷2^øcø.}ø²Fùнùýäù`øù_'úì<úèCúìPú2ÄúÉú.ãú²‹ûœû.ÍûìâûèòûìÿûJü°€üìŽüì–üìŸüèµüû¼ü2–ý.æý.øýÃHþ.Oþ.uþ.|þ.“þ. þêþ.ýþý<ÿ`Nÿ_^ÿlÿtÿÚÿÅâÿ*Jµ[_‰.©.÷.ªV¹V“éÃÉ*Þ*9Scxˆ˜¿?ŠÄ!YìdõiÙ{ì€ŸŠ·ì½ìÂìÉìÒèÙìßõäìéŸöŠìa±Ó‘Þ¬ìr+ÕPÿeÿqï{¤ÈïÎVÕÿßïòïU ¤‹ ‘š ¤ã ¬ü ‘ ¬t ‘— r¤ ‘Ó ‘à ¬ù r¹ ‘Ü ré ‘ ‘) ¬B r¼  ‘= rM ‘z ‘‡ ¬  rã Õí ƒÕ‰.VŸ&6û=V9ÕTVV¢&¨&íÕÕŠr¨r7LV%õcVåõOìZõ_ÙqìvŸ…Š®ì´ì¹ìÄìÍèÔìÚõßìäŸóŠì…Šï±ÿ± ì%Ù.ì5ŠŸ¥ŠÔ1Ú)ä)î)ø)§ ŠƒUóp§{§‡§‘§›§¥§¯§¹§Ã§Í§×§á§ë§õ§ÿ§ §))')1);)E)O)Y)ból§vý€xŠý”bžý®ÌºÌÅÌÓÌåýýÌ Ì Ì Ì* ý2 §> óL óV §` ýi )t ó— )¨ ó¼ )Ç óò ?ü ú !?!ú(!?2!úC!?M!ú^!?h!úy!?„!ú !)ª!ú´!ú¾!úÈ!úÒ!úÜ!úæ!úð!§ù!?"§""§"?'"§/"§@"?H"§M"±a"±n"§x"§}")‚"ú‡""Š")¤"§·")Í"õÝ"ƒé")#A#§#§"#§,#.1#ú7#)<#7E#ŠR#.W#)\#úa#j#Šy#)~#)ƒ#)ˆ#)#.’#ú—#ûŸ#)¤#§©#§®#§³#§¸#§¾#)Ä#)É#)Î#)Ô#§Ú#§à#§æ#§ì#§ö#)ü#§$ú$Î$Š$§ $§%$§+$)1$)6$);$)@$úE$/N$Š]$§b$rk$Šz$)$§„$Z$Š›$§©$ó³$§½$ýÇ$§Ñ$ýÛ$§å$ýõ$§%§ %§%§,%ýD%§P%§Z%§g%§q%ýz%§…%ó“%ó%§§%ý°%)»%óÜ%)í%ó&) &ó-&?8&§C&§T&äZ&Šz&&§„&±Œ&§œ&§­&§¶&)Ã&.Í&úØ&)à&7é&Šö&.û&)'ú''Š')"')''),')1'.6'ú;'ûD'ŠQ')V'§['§`'§e'§j'§p')v'){')€')†'§Œ'§’'§˜'§ž'§¨')®'§³'ú¸'ÎË'Š×'§Ü'§á'§ç')í')ò')÷')ü'ú(/ (Š(§(r'(Š6();(§@(ZI(ŠZ(§e(óo(§u(§€(…(ý(§™(ý£(§­(ý½(§É(§Ô(§â(§ô(ý )§)§")§/)§9)ýC)§M)ý\)§e)¹r)§~)Ã…)))ó©)§º)§Â)É))Ó))ä)ì)§þ)ÿ*?*§"*±l&/*ÕJ*FS*…[*»a*‚n*&t*_y*?›*×¢*Ü©*$®*P·*7Ê*?å*Õ-+5+Ï<+$A+¡M+6W+œ^+…k+0u+ +‚¨+ù¯+¶+ À+‘Ì+ Õ+ Þ+ ç+ ð+0ú+0,  , ,0, +,7G,],çc,o,çu,m‡,,ç—,ç®,ù·,¼,‹Å,ùÔ,‹ê,ùï,(%-ç--?-_K-\[-2Œ-v•-2­-_Î-£ã-\è-éí-Ïò-¡ù-$þ-6.- .0. . @.vK. b. p. ‚.v. ’.gŸ.7¬.Õº.…Å.gÍ.gÿ.v/ /$/P(/éc/…o/ ƒ/‚²/ à/ ò/ #0ºK0‘e0‘~0‘³0ˆç0‘1‘"1‘×3 4ùH4`4ùo4ù…4ù4ù¥4¯4ü¿4+Æ4ôÔ4§Ú4å4¯ï4yõ4¼ 5¹5¼5¼(5ù/565 @5‘U5ç[5g5çm5m5…5ç5ç¦5ù¯5´5÷½5ùÌ5®â5ùç5(ù5ü&6+06+56ÛA6+^6ü6Û™6+¶6üÌ6+ò6yø627¯7u%7247¯L7ýU72y7Š7“7¼Ä7¼É7Ùâ7¹ì7¼ñ7Ùù7ì8ì 8ì8ì8 8ì&8ì+808ì58ý=8ìB8uj8y¥8ô¶8ô¿8ôà8ôî8ô9R&9RS9‘a9‘~9‘‡9‘•9‘²9‘½9ÿÊ9•Ú9ß9ë9ð9ù9|þ9 :È:":È':3:8:A:ÊF:R:MY:›_:•x:ó:3•:ž:Æ£:¯:E´:À:%Å:Ü:óå:5ê:ó:+ø:;{ ;;ï;&;«7;?E;)K;%R;)m;v;‹;)£;³;Â;Ò;å;?ð;@÷;<± <Ò<Ò6<Ø=<óN<óW<•d<«m<‚‚<ó“<óž<ó«<ÿ¼<Î<®Ô<ÿþ<?=«=‚4=ó:=@=E=§[=¸d=¸p=¸{=ó‰=ó—=ó¤=wª=á¶=áØ=Çâ=œó=ó>>•!>5>Ø<>óE>±W>óc>œl>•>ó•> >ó§>Ê>óã>óõ>Êý>Ø ?½?á?d'?‡4?ÿ=?õC?H?õV?[?áa?ah?av?Ü‚?Ü?Æœ?í¡?õ©?¯?H´?ª¹?hÂ?±É?kÝ?Óè?Îí?ò?õø?Hý?õ@ @@Ä@@ÿ4@õD@I@O@ÿZ@i@ÿ•@9·@±¿@dÍ@Ò@ÜÞ@è@d AìA,Aó1A¿;AìBANAìUAaAìhAtAì{AŠA±‘Ad™Aì£A¿±A±¾A±ÇA•ÑA ÜAâAdèAªíAõóAHùAÿBBMBB%BÇDBÿLB±SBk\BÿjB”sB´€B±“B«šB¢B‚¸BóÆBóÏB±ÜBœíBóöB§CóCó Có>C«FCPC‚qCÿœC?¥C;½C?ÅCíæCwëCõñCHøCíÿC DD&DŽ.D=DŽFDíUD?iD?‡DóŽD“Dª˜DÎDõ£DH¨D®DÿËDóÑDÿâD?éDÃ÷DþDEaEaEL*Ea1Ea?EEEÒME±_E¦jE¦rEyEEd‡E¦˜E¦©E?¯E.»E?ÁE.ÍE?ÓE.ßE?åE.ñE?÷E.F? F.Fó-Fó;FóIFóWFóeFóvF.FóŠF.•FóžF.©Fó²F.½FóÆF.ÑFóÚF.åFóõF—þFÿ GG?%G?GGLGÏSG±jGÜtG!~G‰GŽGÏ”GÿžG±¥Gk¬G+³G¾G•ÓGóÞGóãG½éGÜóGÿüGõHHõ HHá1H•EH?]H?nHHtHÓ†HlŒHÿ›H•«H.°H¹Hu¾HÇHÌHÕHmÚHæH?ùHóÿHÿIiI&I>+I4Iµ9IBI JI^I?zIó€I™I?ªI•ºIN¿IËIõÐIÜI?ïIóõIÿ J+JJa%J7JH=JÓOJlUJÿmJ?‚J•’JÆ—JŸJõ¥J«JÿÁJ1ÐJ?ìJóñJÁöJlK?KóKõ K&Kÿ?K?SK)ZK¢_KãlKáxKáK••KNšK¢K¯K?ÄKóÉKõÔKçK?ùKŠLÿLõL,LÍ;LHALÓ`L?qL•LN†L’Lõ—L£L?¶Ló¼LÿÒL+×LãLaïLHõLÓMl MdMd-M?>M•NMÆSM[MõaMgMÿ}M1ŒM?ŸMH¥MÓ¸MŠÔMóÙMÁÞMlêM?ýMóNõNNÿ'N?;N)BN¢GNãTNá`NáiN•yNN~N†N©“N?¨NóÀN?ÓNŠáNÿ÷NÍOH OÓ OŠ%O¢2OáDOHJOÓaO¸lOóqOõwOHƒO?OœO¢OÓ©O±ÂOÜÌO!ÖOÝOäO±ùOõÿO PaPLP#Põ)P/Pd:PŠ?PÌLPUVP]PÜgP!vPÿP½„PõŠPHPõ•PšPõ P¦Pa­P”·P½P°ÃP@ÉPÏPÒÕPÚP«çP9ìP±þP¦QQI%Qí*QŽ0QÜ:Q‡AQÿJQ½OQõUQHZQõ`QeQõsQxQáŠQ?—QlQܧQ‡®Qÿ·Q½¼QõÂQHÇQõÍQÒQõØQêQ?üQí RwRÄ2Ró8RÄKR?XR•hR.mRvRu{R„R‰R’Rm—R£R?¶Ró¼RÿÅRõËRHÝRiâRëR>ðRùRµþRS S?)S)0S¢5SãBSáNSáSS©_S?tSóySõ„S‹SŠ™Sa©SH¯SÓÂSaÑSŠÖSÌäSHêSÓýSdTd T¿Tÿ!T”*Tõ0TH5Tõ;T@TõFTÊMTST[T½`T°pT9yTd‚Ta•T9ŸTÆ«TíÀT?ÅTAâT?øTóUÿUó0U:U¸OU?gU~U¸‰U<«‘EÜLŠ M¿ôOqQ\ÌSìêUÿùUÿ VÿVÿ&Vÿ1Vÿ6VõMVá`VÓ•Vÿ¨VÿÕVÿäVÿõVÿWÿWÿWÿ'Wõ=WáPWÓzW•†WOšWŸW¨W>­W¶W³»WÇW¢ÌWØW‘ÝWæW¿ëW÷WTüWX~ XXäX*Xz/X;X‡@XLXòQXZXú_XkX}pXyX!~X“XœŸXI¤X›µXóÏX äX  Yó%Y.Y®9Y®DYÿUYófYórY®ŠYó—Yõ¡Y$«YlµY$ÆYóÏY±×YôYûYó ZóZó.Zó@Z?FZˆRZ?XZˆdZ?jZˆvZ?|ZˆˆZ?ŽZˆšZ? Zˆ¬Z?²Zˆ¾Z?ÄZˆÐZ?ÖZˆâZ?èZˆôZ?úZˆ[? [ˆ[?[ˆ*[?0[ˆ<[?B[ˆN[?T[ˆ`[?f[ˆr[?x[ˆ„[?Š[ˆ–[?œ[ˆ¦[ˆº[?Ü[ˆä[óí[ˆõ[óþ[ˆ\ó\ˆ\ó \ˆ+\ó4\ˆ?\óH\ˆS\ó\\ˆg\óp\ˆ{\ó„\ˆ\ó˜\ˆ£\ó¬\ˆ·\óÀ\ˆË\óÔ\ˆß\óè\ˆó\óü\ˆ]ó]ˆ]ó$]ˆ/]ó8]ˆ@]óI]ˆT]ó^]ˆw]ó]t–]•¢]¶]ؽ]óÆ]±Ø]óä]œø]^ó ^"^ó7^óS^ÊY^ y^Ê^ Œ^R‘^õ™^Ÿ^H¤^ª©^õ¯^´^õ½^±Ä^Ê^aÑ^ÿå^Óð^Çý^?_ó_œ!_t5_A_¢F_R_TW_c_‘h_t_Fy_‰_••_“š_Ÿ_õ¥_Hª_õ°_±¶_Â_Ê_£Þ_±ã_?õ_ó`ó `ÿ"`±+`ÿC`óT`õZ`_`td`±q`ÿ„`‹`¢`ó°`ó¹`ÿÈ`ÿù`9a±#ad5atAaHaMaõSaXaõ^aHdaÿya~a ‘a›ad¿aUÆaßaóäaPîaUõabUbbUb'bU.b>b±EbdabtubPbU‘b?©b?·bÆbÐbõÖbäbÓõbúbªÿbõcH c“c±-c±2c?DcóUcó[cÿic|c±…cÿ›có ct¥c±¿cÿÌc¤êc¤óc?d±dó"d*d¤?dØIdRd[dcdidõodud¤‚d‹d”d¢d¨d?ºdËdÑdÓÛdådïd¤ee?e e?8e>eóEeKeSeÓbejeõpe{eŠeeó–eœeõ¢e´eºeÓØeÞeóìe¤f? fÃff(fa7fa=fYJfaQfa_fefÒmf±f¦Šf¦’f™fŸfd§f¦¸f¦ÅfÿÕf¢ÚfæfTëf÷fFüfg›góg"g+g>0g9g³>gGg¿LgXg‘]gigëng~g±‡g±g•™g«¢g‚Çg±ÍgóÓg±êg±ÿg h±h±!h±-h±ChóNh±Vh±^h±jh±yh±„h›hó³h±ÌhóÚh±ühOi /i Ai Ji•Yi_i±fidmi£siªxiõ~iHƒiõ‰iÓiÿ˜iuiM¢i§iǶiv¾iØÅióÐióÙièiÿùijó2j±>jMjó[jó’j?§j­j²j§Áj±Ìj£Ój¸Üj¸íjóöj¸kókókó)k½0kÓ8kÓAk±HkPkXksfkwlkáxkáŠk®kÿ¡k­kÁºk@ÁkÊk±ÐkÒÞkÒïkØõk½l?"lá9l?Ol?^l±glsls}lÓ„lŠlÓl•l«šl±³lîºl–Ál£ÇlÌlõÒl×lõÝlâl±ólaùl±ÿl±m½mwmá$má6m®xÓEx±^xÜhx!rxyx€x±•xõ›x¨xa®xYºx¿xõÅxËxdÙxqæxÚðx÷xÜy!yÿyõyH$yõ*y/yõ5y±AyJyPyaWy”`y°fy@lyryÒxy}y«‚yˆyؘy9y±¯y¦¶yÈyIÚy9àyØñy?zz zë%z1z?FzóLzÿbz?€zã…z‘zz–z¢z§§z°zµzÁz?ÖzóÜzÿòz?{?*{?F{OK{T{ùY{b{Òg{s{?†{óŒ{ÿ•{õ›{H¥{lª{õ°{Hµ{õ»{À{õÆ{Ø{?è{)ï{©ü{?|ó|õ!|(|Š6|aF|HL|Ó_|aj|qx|ÿ‚|”‹|õ‘|H–|õœ|¡|õ§|±³|¼|Á|°Æ|Ö|9ß|dè|aû|9 }?+}?0}AV}ób}?x}ó}Ø•}?¥}±®}ÿ½}±Ç}±Ü}±â}±ö}±ý}ÿ~±1~?O~~T~`~äe~q~zv~‚~œ~óœ~?±~ó·~ÿÍ~?ë~‡ð~ü~} òú )!.3??TóZÿp?„±’ž°?ÍòÒÛ|àé îú? €ó€ÿ)€?E€TJ€V€[€g€?z€ó€€ÿ–€?²€·€À€&ŀʀõÜ€á€óç€ÿý€?óÁ#l/?BóGõMSÿi?})Š ›² ¬#±½ûÂËÚÐÙlÞê?ÿó‚õ ‚‚ÿ&‚?D‚úI‚)P‚õV‚b‚?w‚ó‚?¡‚Н‚ÿ¸‚õ¾‚É‚qÖ‚Úä‚ÿí‚õó‚Hø‚õþ‚ƒõ ƒƒaƒ” ƒ&ƒp,ƒ@2ƒ8ƒÒ>ƒCƒ«HƒNƒØ^ƒ9cƒ±uƒ¦‰ƒI›ƒ9¡ƒØ©ƒÆŃ?߃~äƒðƒäõƒ„z„„œ „ó,„?A„óG„ÿZ„H`„Ór„lx„d…„d˜„?²„‡·„Ä}ȄԄòÙ„â„úç„ð„!õ„ú„…?…ó!…ÿ7…?S…òX…a…|f…o… t…€…?“…ó™…ÿ¯…?Ë…TÐ…Ü…á…í…?†ó†ÿ†?8†=†F†&K†P†õW†g†óm†ÿƒ†?Ÿ†ó¤†Á©†lµ†?Ȇó͆õÓ†Ù†ÿï†?‡)‡ ‡!‡²&‡2‡#7‡C‡ûH‡Q‡ÚV‡_‡ld‡p‡?…‡óЇõ‡–‡ÿ¬‡?ʇúχ)Ö‡õ܇è‡?ý‡óˆ?(ˆŠ6ˆÿEˆqSˆÿ\ˆõbˆHgˆõmˆrˆõxˆ~ˆ”ˆˆŽˆp“ˆ£ˆ9¬ˆdµˆaȈ9݈?ñˆ)þˆ ‰‰²‰ ‰#%‰1‰û6‰?‰ÚD‰M‰lR‰^‰?s‰óx‰õ~‰„‰ÿš‰?´‰ú¹‰)ʉŠ×‰õå‰ê‰?ÿ‰óŠÿŠHŠÓ1Ša7ŠUAŠNŠ“SŠXŠõ^ŠdŠÿwŠ}ŠÓ–ŠœŠÓ®Šõ´Š±»ŠŠ±Ί±ÛŠÿéŠGõŠûб‹› ‹‘‹Ø"‹ÿ0‹t=‹RB‹ŽH‹±O‹îV‹–]‹ÿk‹p‹H}‹‚‹Ï‰‹±¡‹t§‹º‹?È‹±Ñ‹@׋Ý‹Òã‹è‹\î‹”÷‹ˆý‹Ø Œ9ŒõŒ!Œÿ7Œ9=ŒØFŒ±QŒÆ`Œ±qŒ±}Œæ‡Œ½ŒŒs‘Œõ—ŒœŒõ¨ŒH´Œÿ¾Œ±ÊŒáäŒóëŒðŒtõ õH#?>óDÿR Xÿftu|õ‡Œõ’H˜d¢ÿ±Ü»Â!Ì×±ã±óGøõþHŽÿŽŽÓ4ŽáCŽtJŽOŽõUŽZŽõ`ŽHpŽdvŽ€ŽîŽŽ±–ŽõœŽ¦Ž^¼ŽóÃŽÈŽtÙŽÞŽõäŽHéŽõïŽûŽ?óÿ28Ó?±b±iîp–wÿ…ŠH˜HžÓ­½ÃÓÒ"ß\äˆêdþ9 “›"'õ-3ÿFLÓekÓ}õƒ±Š‘±±ªÿ¸G¾ÿÍ‘ÔØà±é±ïtô7‘?‘ó-‘ó>‘óE‘J‘õP‘U‘õ[‘Ha‘dh‘ÿv‘{‘Hˆ‘ ’‘Ÿ‘?­‘Hº‘ Ç‘?Ü‘óᑈç‘ÿö‘î’î ’?’?)’ÒH’óV’Òq’{’¸ˆ’±–’ÁÀ’¸Ë’“?1“=“±E“a“h“óv“ó„“ó’“󢓳§“±f ×k« uPuUx§¾y\ƒ8‹7»“áÙ“áþ“ᔎ”Ž”2*”á9”…C”ŽG”N”2U”›Z”tg”ñl”y”……”—” Ÿ”t¤”õª”°”…È”ΔÓÝ”…è”Øø”?•?•›,•ó:•óH•óV•óa•ól•ów•ó…•‹•…¡•?µ•›º•sÄ•³É•Õוóå•óö•û•õ––…––Ó-–25–›:–t?–H–6Q–]–¾g–½q–0”–[ž–[«–[½–[ֱ˖[Ó–[Ø–±á–[í–õó–Äø–€þ–2—%—1—%7—[;—‚L—R—3X—Oe—3j—Op—3v—”‚—‡—O”—3™—OŸ—3¥—”±—¶—O»—áÆ—áЗ[Õ—3Þ—áä—[ì—3ò—áú—[ ˜Ð˜á˜3˜Ð)˜37˜3D˜N˜S˜O]˜3h˜3m˜Os˜3y˜”…˜Š˜O—˜3œ˜O¢˜3¨˜”­˜á¸˜áΘÓ˜Oؘ3â˜3ç˜áø˜á™[™3™[™3!™[(™”-™á9™>™OD™3L™3T™[\™3c™[i™áo™”y™±…™á‹™á•™3Ÿ™3¤™áµ™º™O¿™3É™3Ιáß™áë™[ñ™3û™[š3 š[š.š±7šÐMšUšfbšgšOlšáušáš3‹š3œšü¢š[±š[¹šü¿š[ÊšáÑš[Ùšáâš”òš±››O ›Ð›á›Ð%›3)›Ð8›”E›3W›3_›[l›3r›[›3…›[“›˜›O›Ð«›á³›3·›ÐÅ›3Ï›3à›üæ›[õ›[ý›üœ[œáœ[œá1œÉ6œ<œ%DœˆRœˆ_œhœŠœÐ’œ3–œÐœß¤œ£ªœˆ¸œ¾œ%Êœ3ßœ3䜣꜈þœ33£'03;3F£LˆZ3i3x£€á†ˆ”3¦3¯£´á¿áÌߨ”ÝcðÉõû%žˆžˆžPžáWž$]žÐcž3gžÐmžˆ~ž3ˆž$“ž3˜žá žá¨ž±°žÐ¸žá¾ž3žÐÇž”ÌžhÜž$íž3÷ž$Ÿ3 ŸáŸˆ%Ÿ[.Ÿ‚UŸ‚[ŸúnŸ‚tŸ[ˆŸ2–Ÿ‚žŸ˜”­Ÿ¸Ÿ ÀŸÐÆŸõÌŸ±ÓŸÎÚŸtêŸ9õŸÓ ÐN T ça Ðg }p Éy o‚ ñŽ . :© •¶ áÅ ÿÖ Iá •î áþ ÿ¡ý!¡*¡;¡S¡9X¡›^¡Üh¡!r¡y¡†¡š¡®¡½¡É¡Ρ›à¡ ê¡œû¡ó¢4¢4¢¢õ¢Î%¢E¢óS¢ód¢ói¢õo¢Îu¢…¢Î‹¢Ó𢭢?΢óÜ¢óá¢õç¢Îí¢£Î£Ó£?:£?Z£óh£óm£õs£Î£½Œ£Ÿ£×·£óÄ£8Ê£ УþÕ£ÐÚ£qߣ룽÷£õý£Î¤¤×!¤¸&¤õ,¤Î2¤E¤ÎK¤ÓR¤±j¤‡t¤Iy¤õ‚¤v‰¤†¤“¤v›¤)¢¤±¤Ĥ†Ê¤Óݤð¤?¥¥'¥,¥ 5¥±=¥óF¥±N¥óW¥±_¥ói¥±q¥±~¥ó¥–¥ ¥«¥)·¥õ½¥ÎÉ¥ Ù¥Þ¥ùå¥  ¦›¦J¦õ¦Î¦2¦Î8¦ÓK¦Y¦Ìg¦Îm¦Ó¦›„¦¸‰¦õ¦Î•¦¤¦·¦Î½¦ÓĦ±ܦ‡æ¦Iï¦ø¦vÿ¦§v§õ§†§)&§,§õ2§Î8§N§ÎT§Óf§›k§Jp§õv§Î|§ЧÌœ§Î¢§Ó¹§›¿§Ò§ÎاÓ÷§9¨½ ¨Ü¨¨!$¨B¨9S¨ÎY¨Ó|¨À‡¨ô’¨C¥¨Sº¨æ¿¨"ĨŸʨΨÀÔ¨bبÀÞ¨³â¨Àè¨ì¨ôò¨tö¨ôü¨£©ô©ü ©C©â©C©©C$©Â(©S.©2©S8©”<©SB©F©SL©/S© Z©µa©ih©,q©~©,¬©,¾©,Ñ©,ש,ª,ª”ª ª&ª-ªÂ4ª”Cª”Jª_ªˆyª/ƒª¬•ªïœª¼¤ªˆ¯ª ½ª~Óª~ߪ~« 0«~?«ïD«~K«¼P«~€«/ª« Ì«/ü«C?¬Z§¬ÙÒ¬Ùᬭ٭J­ÙY­‘®2½®îЮÌ̯֮S¯f¯”¯Ÿ¯¬¯²¯¯ÌȯÌâ¯2ý¯° °Ì°ÌM°Ÿ~°Ÿ²°Ÿã°Ÿ&±:N±³S±:[±ba±·±8α²Ô±£Ü±tâ±r²˜²1¯²V¹²VݲŸø² ³Ÿ³V=³³1†³V³V¸³ŸÓ³ݳ³æ³ì³³ô³bú³³ ´£´´£´t#´£H´t´ ´È´1ß´Vé´V µŸ)µAµŸPµVtµ³µ1ºµVĵV쵟¶r¶Vy¶D¶Ùâ¶èù¶ôÿ¶£·t ·c·<v·~·´‹·â“·üá·é·âï·¸Þ ¸ü-¸ü3¸‚¸€Џ€’¸Ø§¸­¸³¸øθÓ¸Ú¸ú¸¹ ¹¹"¹-¹6¹G¹V¹\¹l¹s¹z¹¹ˆ¹¹œ¹¢¹ª¹°¹¸¹¾¹Ź˹Þ¹Áé¹³ò¹Áø¹ˆý¹ºˆº@ºŸ"º‘+ºN0º‘Aº‘Fº–WºŒ_ºkºtº|ºŠº’º™ºÂžºµºéÔº:ߺ²êºôõº´»ß»](»æ4»?D»éV»æp»v»æ|»Á‚»DŽ»梻Ÿª»Ÿ·»æÂ»8È»æÔ»æà»èæ»æõ»:û»<¼8$¼è:¼<V¼?\¼g¼én¼}¼Œ¼œ¼¦¼®¼?´¼¿¼éƼà¼ç¼ø¼?½é½%½G½_½g½t½t½?™½]¯½´½ν1Ô½ßô½t¾?¾ß,¾é7¾J¾?W¾éi¾<p¾´ƒ¾?¾é¢¾è©¾ô¼¾?ɾéÛ¾8â¾²õ¾?¿é¿:¿:5¿]\¿]h¿±x¿t}¿Ñ‰¿æŽ¿"•¿i›¿‹ ¿i¹¿”È¿”Ñ¿ôÞ¿ä¿”ë¿Âð¿”ú¿µÀw ÀôÀµ&Àµ2À²<ÀoFÀ­JÀsPÀsXÀ×`ÀKgÀêoÀ¦wÀÀO|ÂÃoÃo˜Ão£Ão®Ão¹ÃoÄÃoÏÃoÚÃoåÃoðÃoûÃoÄoÄoÄo'Äo2Äo=ÄoHÄoSÄo^ÄoiÄotÄoÄoŠÄo•Äo Äo«Äo¶ÄoÁÄoÌÄo×ÄoâÄoíÄoøÄoÅoÅoÅo$Åo/Åo:ÅoEÅoPÅo[ÅofÅoqÅo|Åo‡Åo’ÅoŸÅ±«Å±Åo¼ÅoÇÅoÒÅoÝÅoèÅoóÅoþÅo ÆoÆo"Æo9ÆKAÆoOÆGUÆÉ\ÆbÆÉjÆotÆGzÆÉ‰ÆožÆG¤Æ}¸ÆÃÆpîÆ±ÇpDZ(DZ4DZ=DZIDZPÇÃ`ÇqiDZ|ÇϑDZ£Ç9¼Ç±ÅÇ ÑÇñÙÇKòÇoÈXÈñÈKȱ)È5È:ÈDÈÉKÈRÈYÈ`ÈgÈnÈuÈ}ȱ†È±™È±±È±ºÈ±ÁÈKÊÈoÔÈKâȱîÈÒóÈ÷ÉK Éo+É0É}:É CÉJÉo\É.gɱŠÉ9‘Éc™É ¢É±«É±³ÉÇÀÉ9ÊÉèÑÉÒ×ɽßÉoîɱõÉoÊbÊ!Ê#Êo2ÊoAÊoPÊo_ÊonÊo}ÊoŒÊožÊê¯Ê(ÁÊoÊÊ.ÐÊêâÊÅíÊoûÊË9+Ë92ËoÉ,DËõJ˦PË­_Ë­lËrËoË.ŠË²˜Ëo£ËâªË±Ë¸ËäÇË­Ì:Ì­ ÌY.Ì­3ÌÖ9ÌoFÌ0MÌWÌÿ^ÌeÌ•ḽ̸ˆÌ¹Ì­¾ÌÒÌ­×Ì÷ëÌ­ðÌaÍ­1Í­6Íã]Í­bÍ|Í­Íš‘Í­œÍ~ªÍ­¯ÍÂÍ­åÍ­êÍÂýͭέΪ!ÎÄ+Î>?έX΃Î,ÎŽ—΋¡Îó«Î3µÎ&¿Î@ÉÎÓÎ ÝÎdçÎKñÎÓû΄ÏèÏ7ϼ#Ï--Ïk7ÏßAÏKÏ UÏÇbÏshÏsrÏ­ŒÏs˜Ï­¤Ïs«Ï­¯ÏsÃϱÏϲöϱÿÏ×Ð9GÐ Nвzб‚бŠÐטЭ¢ÐשÐ:¯Ð²»Ð×ÇÐ×ãÐ9ïÐ×ôЭÿÐÃÑoÑžÑc0ј6Ѳ^ѱdѲ€Ñ±‰Ñ9Ñs–Ñ­šÑsŸÑñ¥Ñ׫Ño´ÑcÂѱÏѱÚÑqæÑqðÑ1öѲÒ× Ò­ ÒsÒ˜IÒq\ÒqzÒqÒ˜¢Ò±»Ò9ÂÒÇÒñÒÒ×Ò.éÒoòÒ.Ó­Óª&Ó­6Ó­>Ó­XÓ­aÓªmÓ­xÓ­Ó­¡Ó¬Ó­²Ó±ÄÓ­ÊÓ±ØÓ­ÞÓ±ñÓ­ Ô±Ô­*Ô­0Ô±DÔ­IÔ×]Ô gÔ”wÔo€Ô.ŒÔ­ Ô±¥Ô­ªÔ9¯Ôc¹Ô:ÁÔ­ÕÔÝÔ­ãÔ±ñÔ­úÔ±Õ­ Õ±Õ­Õ±'Õ­-Õ±8Õ­>Õ±MÕ­aÕlÕ­rÕ±„Õ­ŠÕ±˜Õ­žÕ±µÕ”ÈÕ ÐÕ¯éÕ9öÕÖ½ Ö+Ö­0Ö8Ö­EÖªQÖ­cÖ­iÖ±pÖ±ŠÖ±“Ö±ŸÖ­¦Ö­°Ö­¶Ö±½Ö±ÈÖ­ÎÖ±R×ñw×ñŠ×O‘×Oµ×ñÓ×OØ”7Ø JØ:YØ­uØ¯Ø­šØ­½Ø ÓØ9èØ~Ù­ÙŽ#Ù-Ù½7Ù+JÙŽ[Ù fÙ qÙ­‰Ù±–Ù­ªÙ­°Ù±¼Ù­ÛÙ éÙ”òÙúÙq Ú9Ú­"ÚpEÚ9RÚ­oÚ±uÚ­|Ú”Ú9¦Ú­«Ú×ÎÚ:ÚÚ­ðÚøÚ­Û­ Û95Û}?Û.GÛcUÛ­[ÛêaÛ°tÛzÛ­ÛñŠÛ›Û­ Û9¸Û­½ÛÜÎÛ­ÓÛ9èÛ}ûÛÜ­ ÜçÜÜÉ!Ü'ÜÉ3ÜŽOÜü`ÜüvÜÉ}܃ÜÉܱ–Ü}¤ÜÉ­Ü‚·Ü±ÆÜÌÜÉÙܱßÜ}íÜÉôÜúÜÉݱ Ý}ÝÉ"Ý(ÝÉ5ݱ;Ý}IÝÉPÝVÝÉcݱiÝ}wÝɃÝñÝü´Ý­ÄݱÉÝ­ÎÝñÙݱçݱüÝ­Þ!Þ±'Þ­,Þ9<Þ­IÞ9OÞ±eÞ±kÞ­Þ±…Þ­œÞ­°Þ¸Þ­¾Þ±ÐÞ­ÖÞ ÝÞ±íÞ9úÞ­ÿÞ”ß±ß +ß­1ß±Aß­Yß±`ß±nß­‚ß­ˆß±ß±ß”¯ß­Õß„êß9à±à±)à­Aà±Nà­bà­hà±rà±}୕౜౪୿à±Åà­Ëà±Õà­éàõà±üà±á­á­á±!á±,á­2á±9á±Iá­]áfá±lá­rá±{᱂᱋᱑ᱜᱩ᭲ᱹá±Âá±Éá±Òá±Ùá±åá±ëá­ñá±øá±â±â±â±â­$â±-â±3â±<â±Kâ±Tâ­Zâ±aâ±hâ±vâ­|ⱊⱑâ0˜â±¡â±¨â±±â±¹â±Ãâ±Êâ±Ôâ±Üâ±äâ±îâ±ûâ±ã±ã±ã±ã±,ã­KãePã'Uã cã”sã9…ã9™ã ¢ã9¯ã9¼ãoÅã.Öã­äã­üã± ä9ä­2ä­8ä±Aä­Uä]ä­cä±qä­w䱂䭈䱓䭙䱬äe±ä Æä”Öä9Ûä­òä  å9å­$å­8åHå­Måñ^å9qå­…å‘屗孟屰孶屿å±Íå±Óå­Ûå±íå­æ±æ­!æ­5æAæ±Gæ­Wæ±^æ±læ­ræ±{求汑汗歟汱æ­ÅæÒæ­Øæ±éæ­ïæ±úæ­ÿæ±ç±ç±)ç­.ç±Dç±Pç­cç±qç9‚筈籒筜筳白çoÚç­æç­è­ è­%èñ7è­@è`Tèo]è.lè­{è­„èé:é­2é­;éAé±Ré­Yé±`é­hé±q鱂魓魜é¢é±¯é±¸é±Áé±Êé±Úé±áé­êé­þé­êê±ê­$ê­*ê±Hê­Mê×bê­kê±pêcyê:ꭙ걦ꭺê­Àê±Ìê­Ûê­äê1ë:Që±Yë­yë9~뭌뭙뭧뭺ë±Àë­Ðë­æë±òë­ì­ìì±ì±-ì­4ì±;ì±Bì­Jì±eì­q쭃쭉챚챲챻ì±Èì­×ì­àìí:í­(í­/í:.ÓcHÓ:MÓc€ÓcˆÓ:¹ÓcéÓ:Ôc"Ô:éÔcFÕ:yÕc©Õ:ÜÕ:|Öc„Ö:Ùc¢Ù:+ÚceÚ:4Þc”Þ:ÈÞc<ß:fßczß:Íß:!àcGàcZà:xàc¢àc¶à: ácAá:¡ác„â:$ãÏã:äc)ä:iäc¡ä:@å:fåc¥åcåå: æcæ:Qæc©æ:Êæ:áæcyçcÉçcÔç:è:Œè+”è/œè&¤è-¬èæ´èª¼èÕÄèÌè.ÔèÑÜè÷äè|ìè®ôè<üèå éé‘Iécyé:©écÒé:êc5ê:Ÿêc²ê:ìêëôê“üêÞëN ë¿ëbë$ëS,ë=ë£Eë÷jë:”ëcÅëcÞë:#ìcUì:]ì:‘ìcªì:èìðìpøì¿íjí <íDí­Pí­ií:u플ío•í.¥í9¼í”Åí Îíéí9öí9î”î î/îo8î.Vî”§î–­îɶîÉÇîÐîñçî}ïÉïñ+ï–2ïÉJïÉVïñaï±hﱣïñÔïñ ð}1ð}ˆð<šð™¨ð™®ð<¸ð‹ÇðŠÎðºàðÞåðŠñðÙñ ñŠñÙñŠñ˜'ñŠ+ñ 3ñŠ7ñ?ñŠCñ´KñŠOñIWñŠ[ñhcñŠgñ“€ñº”ñ7±ñ‹¾ñÅñÍñÖñßñèñññúñò òòò'ò0ò9òBòKòTò\òcòmòuò~ò†òò—òžò¥ò¬ò³ò»òÈòÏòÚÙòÚó›ó›ó ó›'ó,ó›5ó”AóEFóêaóêgóc|ó‡óêŒóç•óñ¦ó9±óÔóàóçó‹ùóô ô‹ô!ô'ô‹1ô=ôCô‹MôYô_ô‹iôuô{ô‹…ô‘ô—ô‹¡ô­ô³ô‹¸ôÊôÖôáô‹øôÿôõ‹ õõê/õ5õ‹DõPõVõ‹`õlõrõ‹„õõšõ‹¤õ°õ¶õ‹ÅõûõŠÿõ öŠöö‹'ö8öDöKö‹Yöhöoöö”ö¨›ö¥ö«ö‹¹öÃöÉö‹×öáöçö‹õöÿö÷‹ ÷÷#÷Š'÷,÷;÷A÷‹N÷ŠU÷[÷‹e÷q÷w÷‹}÷‰÷ž÷¤÷‹®÷º÷À÷‹Ï÷Ø×÷Aá÷Šå÷ê÷õ÷Šù÷øŠøøŠøø'øŠ+ø3øŠ7øBøŠFøQøŠUø`øŠdøoøŠsø~øŠ‚øø« øêºø›Æø›ÍøÒø›ÙøÞø›äøêùêù(ùç1ùñBù9SùêYùcªù²ùñ»ù±ÇùñÐù±Üùñíùñÿù9úêú±4ú<;úh@ú7Iú±OúhTú7[ú±iúhnú7uú±}ú¤‡ú±ŽúŠ›ú±®ú„´ú}¹ú±ÒúÖÝú±èúîúŠóúÉû ûûçû±(û}/û±Bû±Iû<UûZûŠ_ûÖiû±oû¤vû±‘ûŠ•ûšûÖ¡û±¸ûмûÁûÖÌû±Öû¤ßû±ëûðûŠõûÖûû±ü üŠüÖü±!ü¤(ü±0ü¤7ü±?ü¤Hü±Pü±UüŠZüÖ_ü±qüŠuü€üŠ„üüŠ“ü±žüŠ¢ü¬ü³ü½üÈüŠÌü×üŠÛüæüŠêüõüŠùüý ý±#ýŠ'ýÙ,ýÖ1ý±GýŠKýÙPýÖWý±`ý™mýsýŠwýƒýŠ‹ý™•ý‹Ÿý±¥ý<¬ýƒ³ý±»ý³Âý±Êý³Ñý±Ùý³àý±èý³ïý±÷ý³þ±þh þ7þ±þhþ7(þ±.þh3þ7AþŠEþPþŠTþ_þŠcþnþŠrþ}þŠþ‹þ‘þŠ•þ þФþ¯þгþ¾þŠÂþÍþŠÑþàþ›ìþ›óþøþ›ÿþ ÿ°ÿ­0ÿê6ÿ(Jÿ­^ÿ>uÿñèÿ­òÿcþÿ­±ü$±2üI.X­d­k:­¢×«­±­Ã­Ø9öü ü#.+c<­M­Z­€“:œ­²­¿­ð“×)­7­>:S­l›Ž”Éœñ±n¸¾ÉÆñÛnâèÉðñû±±f%.4DfIN Vfh9š°¶É¾ñéïÉ÷ñ± ±f,5;KfPU ]fp‡9”šÉ¢ñ¹nÁñì f ,”8EDMYguŽ §¬³¸Á”ÊÕÝîo"*2<Lj‰– ³º¿ÆËÓßôý8@EWcnv“Òš©±¾ÇÏØàéõý ".7?HP[dlu}†Ž—Ÿ¨°ÄÖßçð   " * G U e ±ƒ ?™ ?´ Å Í Þ ó   ±, F N W _ o Ø{ AŒ ª ¹ «È ›Ú ­å ­÷ ­ ­ c ±% ±3 = çF oO ñ[ .` c| ×› o¤ .¯ ±¸ ­Å Ï çØ oá ñí .ó ­ ­ ­+ ­0 cF P ç[ ±m s É| o… ñ‘ .– ­¤ ­® Ô oÝ .ó ý ç • É o" ñ. .4 ­< ­b ±j ­ ±› ›© ›³ ±Ñ ûç8>ÉGñX9b›pz„Žç•¤®?æ±ÿñ9›#)ç0@7¨=ÉB@KÒU[ÉbÒi¨oÉ{ñŒ9š É°·ÒÉÓæ &É/ñ@9PZdpzçš É©ñ¾ÈÒçÛ±âœò­­­!c0:ç?±U[Éa±|‚É‹o”ñ .¥­º­ÇÑÛo .%ç.o7ñC.H­Q­y­…±Œ­•­¦±°­Ç±Ò±Ú±ã±ñ­­)­.c;EçJ±\bÉkotñ€.…­˜ÆoÏ.ßéçòoûñ. ­­9±?­n±t­¥±«­È­×Eå­ö­­c$.ç3±EKÉTo]ñi.n­®o·.ÇÑçÚoãñï.õ­ý­!±'­F±L­}±ƒ­¡­²­Ë­Ðcàêçñ±Éo ñ,.1­DNXblv€åoî.þçoñ&.,­4­s±|­¾±ò±&±P±†±º±ñ±÷­­&­?­DcT^çe±…ÉŽo—ñ£.¨­»Ã±ÎØo.(2ç;oDñP.V­^­‰±’­¾±Å±â±é± ±­á­ú­­c&0ç9±@œFÉOoXñd.i­z­´­¾­æü± ­±+±;±K±[±k±{±‹±ž±±±Æ±Ùoâ.­ç&o/ñ;.@­I­l­~±…±‹±­ª­¯cÀÊçϱæìÉõoþñ . ± ±/ ±8 ±I ±R ±] c Éj ±„ o ñ™ .¡ ­½ à ÉÚ ä î ø !!±!±*!±3!±D!±Q!±`!m!z!!­ª!¼!­Å!­Ô!­â!úï!Cú!B "o3"­;"­B"­T"o]".j"­¢"¬"çµ"o¾"ñÊ".Ï"­Ø"­ù"­ #­#­$#c4#>#çG#oP#ñ\#.a#­o#­‚#­•#ož#.»#Å#çÎ#o×#ñã#.é#­ñ#­$­"$­9$­>$cL$V$ç_$oh$ñt$.y$­ž$­©$­¶$­Ä$­Î$­Ø$­â$ì$çõ$oþ$ñ %.%­%­;%­e%±j%­„%­‰%c˜%¢%ç©%±¸%À%Æ%ÉÓ%±ã%}ì%Éõ%oþ%ñ &.&­+&5&?&a&­n&v&­&­‘&oš&.´&­Ì&oÕ&.Þ&­ç&­'±"'­D'­I'üo'±v'±{'­†'­‘'­˜'­­'o¶'.ä'î'ç÷'o(ñ (.(­(­9(±B(±K(±T(±](±f(±k(­~(­(­¡(­¼(­Á(cÔ(Þ(çç(±ô(±)± )±N)±])c)Éi)y)0£)±Í)¸Ú)ç)•ô)ÿ!*±6*¨<*ÉI*oR*ñ^*.c*­x*­…*Œ*±¡*¨¨*±Å*Ò*ä*¨ñ*÷*É++¨+É#+-+<+¨K+¨U+[+Ék+z+¨€+ɇ+‘+›+¡+ɱ+À+¨Æ+ÉÍ+×+á+î+ô+É,,,",,,6,@,J,[,±d,±m,±w,0~,ˆ,ÿ,–,•,¸§,±³,±º,±Á,±-o!-.*-­3-­?-­k-±„-­ž-­¦-­«-­´-­É-­å-­î-­ó-ü.­ .­€.0†..­¦.ü¶.­¾.­È.F/­a/­}/­†/­‹/ü›/­£/­0ÿ 0¸)0­@0üP0­]0¸Ñ0oÚ0.3ÿs3Ê3•D4­60h6­º6­ 7­w7­Ù7­8­18­78±O8Y8çb8ok8ñw8.|8­…8­¨8­»8cÌ8­Ø8­î8ø8ç9±9± 9±-9±°9­½9­Ù9oâ9.÷9­:±:o$:ñ0:.5:­D:J:ÉZ:`:Éi:±v:|:É…:±’:˜:É¡:±®:´:ɽ:±Ê:Ð:ÉÙ:±æ:ì:Éõ:±;±;;É5;­Y;c;çj;t;çz;­;­§;­¬;cÄ;Ê;çÖ;±ß;%å;}í;ñ<É<ñ<.<­1<7<ÉE<­W<]<çl<­u<­z<×…<­¡<%Æ<ðÒ<:â<,ç<àò<±ú<±ÿ<e=± =3=­=±,=±5=±F=L=ÉT=±_=±x=%Œ=ð¤=±º=%À=}È=ñÛ=Éì=ò=É >>É>ñ&>.->3>çU>[>Éw>ñŒ>’>É™>Ÿ>ɧ>ñ³>.Á>ñÑ>±è>±Üí:›ï9êðÖñÖDÿ:xÛ:]: .u(c?$?±,?±e?±?±‡?±?±”?±¡?±®?Ⱥ?±É?ÈÙ?±á?,î?,þ?®@±A@±N@±S@±q@±y@±†@±‹@±•@±@±ª@±²@±É@±.A4A±CA±NA±UA±aA±nA±uA±A±A±–A±£A±¬A±¸A±ÄA±âA±B±B±$B±-B±6B±b±FbùKbÖPbõVbM\bnbùsbÖ‚b±ŠbÖbõ•bM¡bM§bÓ®b±ÆbÒbÛbõábMæbÖíbÀòbÖýb*cÖ cÖcù c±*c6cMuŒGuŒiu=tu?|u‚u%“u™u¡ue§uµuÁ¼uÉuÏu%Øu?êuðu%þuÁvvv%,v1v8ve=vDv®`v®ivßzvv®”v£¡v§v%Ãv®ÎvßÔvßäv®êvývßwß w®wßw®/w®:w®Gw®Rw®_w®yw®w®‡wßw®–w£w®ªwß±w®ÁwÎw®Öw®äw=ëw® xxÝx®1x{8x®@xDx2JxŒPx¢Uxõ^xÄgxlx”rxs†xs’xsžxsªxs¶xsÄx{Êx¢Ñx¢ÖxõÜxÄêxÄðxÓy9 yøy€ys-yByúNyú\ysey9uy9„ysy•ySšyéŸys°ySºyúÆyúÔysÝy9çyñysüy:zsz9$zš-z8zsAzõGzÄNzvWzù]z¸dzõjzÄyzÄzÓ™z9¤zs¸zsÆz¹Ózæz®ïzs{9 {s{õ{Ä${®1{$F{9L{sW{®j{v{s‚{m†{nŒ{ç{n–{š{n {ç¤{nª{¼®{Ú´{ï¸{Ú¾{¬Â{ÚÈ{~Ì{ÚÓ{¼Û{Vã{9ò{e| |ë3|ë9|«B|ëV|ëj|±s|«||«|%’|%œ|%£|ë«|«¶|«Í|ëþ|ë}à }«}ë}à"}ëJ}øW}«^}€c}£h}€y}%}¯}“}%›}e¡}%¦}4«}¯°}µ}4º}«¿}Å}«Í}ëÜ}¯â}%ò}€ú}%~~%~e~%"~ë(~à/~ø6~€A~àL~ëV~à]~ëi~€t~ß~~%Œ~’~%š~e ~%¦~«®~ë·~ß¿~øÆ~€Õ~¯Û~%í~¯ó~%Ê=6G9[gb9i z6€‡“›ç¢m§´6Æ á~ç¬ðïö¬ý¼€~€~€¬,€<3€<D€<S€<r€¼x€V~€¼Œ€¼™€VŸ€¬¦€¬­€ï²€¬¹€¼¾€¬Å€¼Í€Vꀼð€ö€Vü€¼¼"¼.5¼<VB¬I¬PïU¬\¼a¬h¼pVyV¬†¬ï’¬™¼ž¬¥¼­VºÈãÙ{ß$÷öü{‚"‚{+‚<3‚;‚¼C‚VR‚Z‚m‚{s‚$‡‚<‘‚<—‚ž‚<©‚µ‚÷Á‚÷Ö‚÷¥,*à‚Œå‚þ‚ƒÂƒ9ƒÂ1ƒÂ:ƒæHƒæVƒædƒætƒ\yƒä†ƒ9Žƒ˜ƒÂ´ƒÂ¹ƒÂŃ˃±Óƒ¶܃øéƒ9îƒáôƒÂ„„„0„±'„±7„äC„$L„QT„±]„Âf„Al„Þˆ„䟄ݨ„±µ„-Æ„äׄ±å„Âï„Þù„ …Ö …á… …$.…äG…ÂP…9b…äw…|…á……±Œ…¹“…¢…«¨…@®…´…Òº…¿…Ò…Øß…í…^ò…†Â††ä*†03†±<†±D†¹W†¹c†æh†ár†¹†¨††^‹†›†0¤†±´†äц#冞ê†áø†æý†á‡Â‡^‡&‡,‡ä9‡0B‡±K‡±S‡¹k‡¹p‡u‡á|‡¹Їž–‡æ›‡á¡‡¹¨‡Â¶‡^»‡Ö‡äó‡äˆÖ ˆøˆžˆáˆÂ,ˆÂ;ˆµBˆÂNˆ_ˆ9dˆtˆÍ~ˆ…ˆ^ŠˆÀˆp̈¨Ñˆ߈ðˆöˆä‰á ‰–‰‰p+‰æ1‰):‰™E‰¹L‰S‰¹[‰Âe‰q‰†~‰™‘‰Ÿ‰¥‰–®‰p¿‰æȉω剞ê‰!ô‰ŠpŠŠ# Šž*І3І>ŠáXŠ)]Š™bŠáiŠoŠ†ŠŠž›Šæ°ŠÂºŠÀŠæΊæÜŠæêŠæïŠáöŠáüІ‹¹‹^‹(‹ä5‹?A‹#T‹Â]‹9l‹ä…‹ÂŽ‹9ž‹™µ‹Â‹Â΋Â׋Âlƒá ƒá¦‹Žä‹™í‹)ŒI7Œ[RŒ[iŒ™pŒ[€Œ[œŒ¨Œ¯±Œ†ºŒ:ÉŒ:ÐŒ:ÖŒ˜ÜŒ:ãŒ:ñŒñ˜ á!¯(¯.˜4¯;¯L=aÐkÐuÐЉГХЬ¬¼=ÑÐÛÐåÐïÐùÐŽÐŽÐŽ¬)Ž/Ž%:ŽHŽOŽeTŽYŽ iŽyŽ‡Ž “Ž ¨Ž ÅŽ ñŽ  ‘%&4‘;e@‘E Ue‘s  ” Ÿ ªe¯‘Ë Ú èEð?ìŒáI w/[BI[R[p[uÔÔ‡[[•[ ö­µ½ùøËwÑ”×öæöñà ‘™‘%‘ö2‘w:‘@‘wI‘ÍU‘ù[‘¸c‘wi‘Wv‘w‚‘ÊŠ‘±“‘± ‘ö¥‘´‘¸º‘ùÇ‘„ΑöÔ‘¸Ú‘„â‘À葸ð‘*ö‘¸ü‘ö’’¸’ù#’ö(’7’¸=’ùQ’¸V’Ï\’„c’öi’„q’Àz’¸‚’*ˆ’¸Ž’ö“’¢’¸¨’ùµ’t¼’öÊ’„ø’=ÿ’µ“?“É“Í>“ÉF“ÁL“ÉT“Z“Éj“±s“±“?¥“?¶“Á½“ÓÉÒ“Éã“öþ“ù””[”IH”U”–h”æo”x”‰”[”ª”̲”ÌË”[Ö”ÌÞ”Ìú”Ì•Œ"•Ì>•ŒG•?U•?^•we•?t•?y•‘• •´•?À•›ЕæÖ•–ä•?í•wô•?––›–– –æ‘މ•/–[6–[=–[S–Ì[–Ìm–?u–?~–?‘–0œ–¯£–¯ª–:±–:¸–w¿–ðÆ–ÔÍ–)Ô–[Û–™â–†é–óð–Iø–——e—¹—†—–#—*—1—Œ8—öB—wI—„S—-Z—Âd— m—‘t—€—õ†—Ä——Ä¡—Ó¶—?¾—?Ï— Ó—ÌÙ— í— ú—?˜? ˜p˜Œ!˜ÌI˜?V˜\˜%f˜l˜e˜?”˜?¤˜¸˜?˜?Ϙ?ݘ?é˜?ú˜?™?™?™?*™?5™?>™wF™?N™?—™)¢™™Ø™I㙹ÿ™[š¹š)šá&š)>š[Rš[Yš[jš?rš?†š?‘šw˜š?¬š´š#Äš?ÖšÛšÞìšöš#üš?›?k›?q›Þ†›?“››?§›?¯›·›õ› œœ¯£œ°œ¯¸œwÁœ¯Ñœ¯Öœ[㜯霯ñœ¯¯¯¯'¯2¯>M¨S¯Í:×:ëø:žw ž:5žRLžWž:\žðfžwž:}žðˆž±—žI¢ž:¨žð´žI¿ž:ÅžðåžÍòžµþž±Ÿ±”ŸÍÁŸ…Ο…øŸG  Í) µ5 ±F ±Ò µ¡ð!¡ðN¡2[¡2…¡¯¡¥Ø¡Þå¡Þ¢.¢.)¢:¦¢µ´¢µ΢±Ù¢Íå¢Í"£±5£:;£ðZ£:f£y£±·£È£µé£2ò£2¤ð¤ð:¤¥Y¤v¤2ƒ¤.¤.°¤ð½¤ÞʤÞ ¥.¥R?¥±F¥ÍN¥…V¥G]¥µs¥±~¥µ†¥ð¥˜¥Þ¡¥2ª¥¥³¥.¼¥±Ó¥µó¥_¦…d¦¼z¦Í¦G¨¦G §"§R§Ij§Iz§?‰§?–§¡§?¦§—´§?¹§—ŧΧÞ§:æ§ï§:÷§w¨: ¨†¨:*¨:6¨?¨:G¨wP¨:\¨ór¨:¨?’¨š¨?®¨ó·¨óÀ¨óʨ?ݨ†è¨™í¨@ö¨?þ¨©†©I©ä©¼$©.©Â8©I=©†H©†R©úœ¨2¢¨â¥H"¨¨l©…}©—‹©þ£©¨«©º¸©—½©2É©(é©gï©„ô©²ú©ºª¨ ªmª½ª%#ª¾+ª4ªÜ<ªÍCª{Jª¿RªkZª*`ªmªÍuªÕ€ªÕ‡ªg“ª=™ª²¢ªªª¡±ªŸ¹ª’Àª€Ǫ±ΪcÕªbܪƒãªÔëª òªþª…«Õ«…)«Ù=«ÙC«²K«¨S«º[«gc«1m«št«ü~«Ë„«ò‰«§« ™« £« ­« ·« Á« Ë« Õ« 櫚ó«ºù«1¬š ¬„¬1¬š¬ö%¬„.¬š4¬1B¬šJ¬„P¬1W¬ö]¬„f¬1m¬š|¬Ë†¬¡¬ü™¬üŸ¬Ë¬¬ ³¬ü¼¬¡ĬüʬËÙ¬Ëé¬üï¬Ëþ¬ü­Ë­Í"­*0­%:­Ù@­ºI­½X­*^­­f­ºm­kz­­Ž­­•­½ž­%¤­º°­½Å­Í­öÛ­¸á­ùú­À®¸®*®¸®±#®±0®%G®ºR®%X®¾`®n®*z®Í‡®Ù®º›®½¯®­¸®ÍÄ®ºË®kÑ®mØ®%䮾ê®Gø®ÿ®Ü¯k¯²K¯„Q¯{X¯Üa¯ög¯„o¯„w¯ö}¯„‹¯Í’¯¾˜¯GŸ¯k¨¯Á¯„ίþæ¯(ó¯—ÿ¯% °2°2"°¿+°m7°…D°„N°¿^°…e°ºu°„|°¨•°—¤°—«°„Á°þå°2÷°2±23±%9±¾F±„Q±öW±„`±{h±n±*w±ö±¸‡±ù𱄢±ö¨±„°±{¾±{α2Ö±—㱺õ±—²—²m9²Ü@²­E²ZP²Í_²¾e²Gv²­}²½ˆ²º“²½¡²Í±²ÍѲ—ݲ¾ç²%î²2÷²%³(³%)³*3³mV³(c³%s³Ïº³€Õ³cù³§´-'´G/´’?´ƒH´ƒO´ŸU´ [´cm´Ÿƒ´Õ‹´º“´Ÿ¥´ƒ¬´’É´=Ö´(à´þõ´—ü´Ÿµ2"µ2)µb4µ@µÕGµ…Wµ=dµbuµÕµ…†µg¡µ=¯µ=ºµ—êµþøµ—¶2)¶2J¶2`¶—h¶þo¶€¶Õ‡¶º¶Ÿ•¶’©¶ ¯¶€¶¶Ÿ½¶€ж2ض—ê¶—ù¶—·!·—'·’:·’@·ŸQ·2X·Ÿe·(y·Ÿ“·Ÿ§·(¯·ÔÀ·×·Gú·Ô¸±¸É"¸É)¸Á.¸É5¸:¸É@¸±O¸±^¸±i¸Ét¸É{¸Á€¸É‡¸Œ¸Éš¸c­¸À¸ºê¸¡ñ¸Ùö¸¡¹Š¹Ô'¹Š1¹ƒC¹ÕJ¹ R¹ Y¹…|¹—¹þ¢¹Gª¹’±¹}¶¹—Á¹(Ù¹þè¹}ð¹}ù¹ƒÿ¹’º±ºÉ ºÉ(ºÁ-ºÉ4º9ºÉ@ºGEº}rº—„ºŸšº2¡ºŸ®º(ºŸܺŸîº(»±‚­Z+»‰1»'<»=D»«H»vN»LV»µ_»ñg»õk»vq»öw»À}»„»9𻩡»d¨»Á²»øº»º»É»ÔÓ»¹æ»-ñ»'¼ ¼  ¼-¼4¼A<¼'T¼ñj¼ñ¼ ¼Ü𼡼v´¼¼ Ѽ9ܼÜú¼õ½ ½ñI½©Z½Lr½øy½½„‡½Á޽ö”½„½Á§½ø¶½öŽܽ ¾L¾ö(¾/¾ö=¾vh¾µp¾Lˆ¾µ޾L¾¤¾Lª¾µ;Ù¾L澿9a¿š¿9½¿«à¿=æ¿«ø¿‰À' ÀÜÀÀ "À9-ÀA@ÀñMÀ‰kÀÜyÀvÀ9ÃÀ9ÈÀÜÔÀvÞÀ9äÀÜÁÜ'Áv3Á9KÁÜWÁ9aÁvgÁÜpÁ9vÁÜ„ÁÜÁA•Á œÁÜ¢Á9¬Á'ÆÁ'ÐÁØÁõìÁñ‰‰Â'0Â9;‰@ÂÜ^ÂÜlÂvxÂ9ÂÜ›Â9¥Âv«ÂÜ´Â9ºÂÜÈÂÜÏÂAÛÂâÂ'õ üÂÜÃ9Ã'$Ã0à>Ã'HÃnÃÜtÄÃv˜Ãõ«ÃܱøÿÃAÎàÕÃÜÛÃ9åÃìÃ'Ä'ÄÄ 7Ä'JÄ `ÄvhÄoÄAzÄ'’Äñ¨Ä ·Ä9ÂÄÜÖÄAÝÄæÄAìÄóÄ'Å Å)ÅvCÅñMÅ ^ÅÜhÅoÅv‚ÅÅ ŸÅ9ªÅܸÅ'âÅAéÅöÅAþÅ ÆùÆ Æ¸Æ ÆÀ$Æ +Æ1Ʊ>ƱJÆöZÆ `Æ qÆ vÆ }Æ*‚Æ Æõ–Æ'œÆõ£ÆñªÆ>òÆ©úÆ„ÇöÇ„ÇdÇ«!Çõ0Çð7Ç=CÇÞJÇQÇñbÇ©oÇö{Ç Ç Ç¸•Ç ÇLµÇ¾ÇºÅÇ>ÕÇ„ÝÇöãÇ„ìÇdlÈχȚÈ^—Èò ÈA¨Èz¯ÈcÂÈòÌÈYÓÈÓÝÈ äÈòÈ-þÈ¥ ɳ ɳ1ɳAɳwÉB„ÉB¼ÉBßÉväÉÀóɘøÉÀÊ\ ÊÀÊ  ÊÀ6Ê©FÊøOÊøXÊåcÊøjÊåzÊø…ÊÁÊø™Ê„ŸÊÁ¦Êö¬Ê„´Êø½ÊÁÅÊåÌÊøÚÊ>àÊÔæÊ©ôÊåúʹË>Ëå˺+ËLCËøJËRË„XËÁ_ËöeË„nËÁxËøË©Ëå˜Ë¹§Ëº³Ë„¹Ëd¿ËÁÉËøÑËö×Ë„ßË„çËöíË„öË©ÌòÌ 'Ì-ÌÓ5ÌÓ;Ì XÌÓkÌ qÌÓ|Ì ŠÌ”ÌÓªÌY±ÌɸÌÉ¿ÌÁÄÌÉËÌÐÌÉÖÌBÝÌBåÌòûÌYÍÉÍÉÍÁÍÉÍ ÍÉ&ÍB-ÍY4ÍB:Íò_ÍòiÍyÍò‰Í•Íz›Íò¬Í^²ÍòÓÍAå͘îÍAóÍÉùÍÎÁÎc$Îc7ÎòMÎ;UÎ _Î¥gΚrÎ\xΠΚˆÎ¥‘ΚœÎ\¢Î ¬ÎɳÎÁ¸ÎÉ¿ÎÄÎÉÊÎBÑÎBèΚÏò#ÏòLÏòcÏÓmÏ yÏò‡Ï ÏÓ¢Ï ·ÏòÊÏ^ÒÏòÙÏ^áÏòüÏzÐz Ðò+ÐòDÐòTÐ;_Ð\dИuÐc~ÐcˆÐò˜Ð; Ð ªÐA²Ð¥ºÐšÆÐ\ÌÐ ÒКßÐòóÐ;þÐ\јÑc%Ñ;-Ñ EѳKÑò_Ñò‰ÑÉÑ›ÑÁ¯ÑA´Ñ ºÑ ÈјÛÑ áÑ ïÑ ÷Ñ þÑ Ò Ò Ò ÒÒ $Ò -ÒA2Ò =ÒÉCÒBMÒBTÒAmÒšwÒA‹Òc¥Ò;«Òc»Ò;ÃÒ ÍÒ¥ÕÒšàÒ\æÒ íÒšÿÒ˜Ó˜ÓAÓÉÓ#ÓÁ6ÓAHÓ˜QÓAVÓÉ\ÓdÓÁqÓcÓ¥ŽÓš™Ó\ŸÓ ¿ÓÉÆÓÁËÓÉÒÓ×ÓÉÝÓBäÓBõÓÉüÓÁÔÉÔ ÔÉÔBÔB+Ô;2Ô :Ô\EÔ˜_Ô˜nÔ vÔ\Ô˜˜Ôä Ô±¦ÔU­Ô´Ôö»Ô-ÂÔ‚ÉÔvÐÔâ×Ô]ÞÔåÔììÔ§óÔ…úÔ#ÕàÕÕæÕ_ÕJ#Õr*Õ1Õ@8Õ°?ÕFÕêMÕ’TÕ:[Õ bÕÖiÕpÕÀwÕ~Õ ‘Õ…³Õ[ÅÕ[ËÕ[ÖÕæßÕ[íÕUùÕUÖ[Ö[Ö[%ÖU6ÖæHÖìRÖ…aÖ…Ö[´Ö[¼Ö[ÒÖ?ÛÖræÖ?ïÖøÖr×? × ×§$×’)×½3×…:×…@×:M×àZ×àa× j×s×z×Öƒ×æŒ×æ“׿š×_£×¬×s¹×’Æ×sÎ׿××à×àë×’ø×õþ×9Ø9ØÓ0Ø\5ØøBØ9KØTØ eØ8jضpØ ~Ø ‘Ø Ø¢Ø8§Ø¶¬Øá²Ø ÉØzÎØÍáØäîØ@óرþØ@Ù Ù@$Ù 6Ù$DÙUIÙ¶YÙæbÙ¯iÙ¯pÙ¯wÙ¯~Ù¯…Ù¯ŒÙ¯“Ù¯™Ù¯ŸÙ¯¥Ù¯«Ù¶°Ùá¸Ù’ÄÙ ÏÙ¯ÖÙ¯ÝÙ¯äÙ¯îÙ?öÙzûÙÍÚä*Úr5Ú$BÚ8GÚ¶LÚáRÚ iÚäyÚìÚ ‰Ú°Ú…™ÚlžÚì«Ús²Ú·Ú9ÄÚzÉÚÍÜÚäõÚäÛ@Û8Û¶%Û@*Ûá5Û@?Û…EÛ’LÛ@SÛvZÛ-aÛöhÛUnÛìsÛ]€Û…†Ûl‹Ûì‘Û šÛá¯Û9¹Û$ÎÛäæÛ9ìÛ ùÛ…ÿÛ  ܰÜ-ÜvÜU%Üö+Üì0Ü]5Ü?ÜzDÜÍTÜpaÜ’mܶƒÜ|›Üä«Üá±Ü†½ÜÃÜàÜìåܹíܹõÜ ÝÝ–Ýp(Ý3Ýl9Ýê?ÝìLÝ]QÝYÝêgÝ4qÝÆvÝ±Ý ŠÝá™Ýl¥Ýä¾Ý ÇÝ9ÖÝlâÝäùÝ  ÞÞ%$Þ)Þ0Þe5Þ<Þ#CÞ?PÞ [Þ?bÞ rÞ}ÞŒÞ ¦Þ ®Þ ÁÞ?ÊÞ ÓÞ ÛÞ âÞ îÞ?üÞ?ß?ß ßQß 'ß%-ß 8ß ?ß Kß pß zß †ß ß?™ß ¡ß ­ß ½ß Çß?ÌßQÒß Øß åß%ñß ùßQÿß à à à à 4à ;à Aà Zà ià wà?~à ’àl`Øá‡ØášàŽ¡à§§à:®à…´ààºà:Àà:Çà:Îà:Õà:Üà:ãà:êà:ñà:øà:ÿà:á: á:á:á:"á:)á:0á:6á:<á:Cá:Já:Qá:\á_dá:oá:yá:¢á©á:°á:·á:ÂáæÎá:Ýá¯éá¯ðá¯â¯ â¯â¯âr"â¯*â¯1â¯8â¯AârHâPâVâ¯]â¯câ¯iâ¯{âv‚⯉â¯â¯–⯡â-¦â¯¬â¯³â¯ºâ¯Áâ¯Èâ¯ÎâJÓâ¯Þâæåâ¯íâöóâ¯øâý⯠ãöã¯ãã¯!ã¯(ã¯/ã¯6ã¯Iã?Uã?dã?iã#oã?ˆãã?ªã?ºãÄã?ùã?ä?ä ä?'ä?/ä½;ä?Kä?Uä?däÅvä?“ä?¤ä?·ä:¾ä ÅäÖÔä?åä?íä å?åÀå?#å8åpAå–Iå#Oå?]å#g寄å?å?–å?¨å®åÿå æ†æì$æ…Tæ[cæánæ?æ[ˆæ[湸æì¾æ†ãæ?éæ?ç?çvçl$ç@-ç?9ç…?çUFçMçöTçZç]_çdçìiçä„ç?Šç-–ç-ªçU³ç’¾ç¶Èç4Ñçößç±èç±øç#è¸ èùè„èö è¸&è„.èÀ4è¸<è*Bè¸HèöQè#]è¸cèùè…è’Œèö±è#½è¸ÃèùÖè¸ÛèÏáè„èèöîè„öèÀÿè¸é* é¸éöé#,é¸2éùAéJéö]鄌é=•é?éɲéɺéÁÀéÉÈéÎéÉÞé±çé±óé?êö ê?.êÁ5ê;êÉJêÉSêYêæeêönêŠêê¡êÌ«êÌÄêæÍêöÔêÌÛêÌýêÌëŒBëŒKë?\ë?aëmësë–}뿌ë ë?¬ë›¸ë]¿ëÄëlÉëìÒë–šè¶¢è4äë=öë:ì¯ì†%ì$.ìöEì"Wì"iì"€ìQ‘ìöžì"Áì"ÏìQÚìöìì"í"í")í$:íá@íìFíæQíní"íì’í¯¡í:­í=¹í¯Âí†Ñíìèí˜ííáóíìüíæîî¯î¯#î˜,î¯3î¯>î’Gî°5íÂOî^UîEaî‡hî‡oî‡vî‡}î‡„î‡‹î‡“î ›î¥î «î̽î‡Ìî‡äîãòî‡ýî‡ ïï?ïÁï&ï+ï1ï Hï‡ïú™ï¤ï­ïXÁï‡Òï‡áï‡öïúðððX*ð‡5ð‡Dð‡Rð‡_ð‡|ð‡…ðXŠð‡—ð¨ð‡³ð‡¼ð‡Ãð‡ÔðÃáð‡éð‡ñ  ñ?ññ‡3ñiBñ‡Gñ‡Qñ‡Yñ‡_ñ iñKuñ~ñ‡…ñ‡‹ñ©ñ‡Õñ ÷ñ ò ò ò *ò 5ò Cò Pò‡Zò‡cò±mò‡{ò±‡ò±“ò±Ÿò±«ò±·ò±Çò±Îò±àò‡èòËúòË+óúPóBjóCwóÐóŽãóËéóDøó‡ôV,ôí;ôæJôbPô‡aôiô“qôxyôo‹ô‰šôÌ¡ôg©ôfµôKÈô Ðô?ÖôáôÃüôÀ õiõi,õ‡9õ‡Tõ©õ®õ¼õ»Ãõ=ÊõÑõjØõ6ßõ]³î‰`õølõrxõÇ„õ^õYðõæöïöêöÁ'ö /ö±6ö±=ö‚Cö;Hö”MöÀRöîWö#\öuaö£fö¾köpöR‚öïŠö¤’öÁ™öL¡ö ªöT±öáÎö ×öTÞöá÷ö ÷T÷á%÷á2÷ï9÷Á@÷LU÷áb÷ïu÷á–÷ê¸÷aí÷aò÷Áù÷”ø’ ø øuø¦ø¾#ø¤*ø 1øî9ø¦Bø¾Iø¤dø/røê„øP‰ø?ø ¨øÁÌøGÞø¨ù)ùUù~ùÁ¯ù¾Ãù¤Ìù ÕùRú¤ú úa?úÁ_ú/{úí®ú‰ºú‰ÃúôÎú‰Ýú‰îúxþúxû<;û<EûœNûŒUûœjûWuû±zû<„û”ûyªûx½û‰Éû°Ïû‰×û°Üû‰æûöûôü‰ü‰üL1üLLüLzü—‚üìˆü’üT—ü5®ü—¶ü ¼üìÁüüÕü‰ãü—ïüìõü’ýTý’ý—ý %ýìMý Sý’ZýTbý5ý‰™ý Ÿý’©ýTÓý±ßý±êý<þ±þŒ;þ@þviþ,…þ±Šþe–þ<¼þ¦Ãþ&Ôþ¦ßþœèþ™ÿ˜ÿi ÿRÿY)ÿŒKÿvPÿVÿÅ]ÿ¶gÿ‚lÿrÿv{ÿi‡ÿÅö"ÈúyŒûþûyüúAüL3ýeºý’Ù+Ù=Ùl~  $(,048<@DHLPTX\`dhlptx|€„ˆŒ”˜œ ¤¨¬°´¸¼ÀÄÈÌÐÔØÜàäèìðôøü  $(,048<@DHLPTX\`dhlptx|€„ˆŒ”˜œ ¤¨¬°´¸¼ÀÄÈÌÐÔØÜàäèìðôøü  $(,048<@DHLPTX\`dhlptx|€„ˆŒ”˜œ ¤¨¬°´¸¼ÀÄÈÌÐÔØÜàäèìðôøü  $(,048<@DHLPTX\`dhlptx|€„ˆŒ”˜œ ¤¨¬°´¸¼ÀÄÈÌÐÔØÜàäèìðôøü  $(,048<@DHLPTX\`dhlptx|€„ˆŒ”˜œ ¤¨¬°´¸¼ÀÄÈÌÐÔØÜàäèìðôøü  $(,048<@DHLPTX\`dhlptx|€„ˆŒ”˜œ ¤¨¬°´¸¼ÀÄÈÌÐÔØÜàäèìðôøü  $(,048<@DHLPTX\`dhlptx|€„ˆŒ”˜œ ¤¨¬°´¸¼ÀÄÈÌÐÔØÜàäèìðôøü  $(,048<@DHLPTX\`dhlptx|€„ˆŒ”˜œ ¤¨¬°´¸¼ÀÄÈÌÐÔØÜàäèìðôøü         $ ( , 0 4 8 < @ D H L P T X \ ` d h l p t x | € „ ˆ Œ  ” ˜ œ   ¤ ¨ ¬ ° ´ ¸ ¼ À Ä È Ì Ð Ô Ø Ü à ä è ì ð ô ø ü          $ ( , 0 4 8 < @ D H L P T X \ ` d h l p t x | € „ ˆ Œ  ” ˜ œ   ¤ ¨ ¬ ° ´ ¸ ¼ À Ä È Ì Ð Ô Ø Ü à ä è ì ð ô ø ü          $ ( , 0 4 8 < @ D H L P T X \ ` d h l p t x | € „ ˆ Œ  ” ˜ œ   ¤   ¤ ¨ ¬ ° ´ ¸ ¼ À Ä È Ì Ð Ô Ø Ü à ä è ì ð ô ø ü          $ ( , 0 4 8 < @ D H L P T X \ ` d h l p t x | € „ ˆ Œ  ” ˜ œ   ¤ ¨ ¬ ° ´ ¸ ¼ À Ä È Ì Ð Ô Ø Ü à ä è ì ð ô ø ü   $(,048<@DHLPTX\`˜IœI I¤I¨I¬I°I´I¸I¼IÀIÄIÈIÌIÐIÔIØIÜIàIäIèIìIðIôIøIüIJJJ JJJJJ J$J(J,J0J4J8Jì¿r[ÁDyX ›Dļ½dÃààÅü   ÔÊ,2„È4G¸È6WøÈ_vðȇ  ’$ ( ¨, ³ÌsÊtÍâdÒ/þ|Ñæñÿñÿ(0 12 ?4 K5 Xñÿbñÿlñÿvñÿñÿ†D%–8 £: ¯ñÿ¹ôþ-ÃñÿÌòÿÚàœ ïòÿ­~ §-œqAìeVòÿe¦ix dòÿ†òÿ™òÿ§ü¤r¶òÿÈÜ KØ|Y»ôòÿ  pî ¸"Ü«|0k @òÿX$<Òl¸¡·€” ŒôÐtšòÿ«`vº(x˜Æ òÿÌ@`"Ûhaï $%þòÿtW|ÐÚ'`ÏT56W CòÿZ  òÿ]LDqòÿ„ pòÿ‰ì{앲˜ÊÀ˜Œ°ÓDËÛpåyäòÿóÔlJ á @í.  òÿ-   d3 4(PD òÿQ Pª‹f òÿs (l† ÜëË™ CV¤ Tòÿ¯  òÿ¼ °/PÅ (ð"Õ òÿê  f,ø òÿ òÿ ddˆ1 N ¾+_ Hk üny 8Ðs‡ ôº” ¨Õ« l(¹ è–\Æ fhÙ `FPã ¼{Öû ÀÙ* ` ðœ\& òÿ: q,H æh[ ˜ßv` òÿh ät Œl‡ õ˜ òÿ¦ òÿ° °òÿÁ ì·2Ô òÿè èkô ðÓG Há@ @û@ (¡' í(; táG `™l\ òÿj òÿx ¸ãÈŠ òÿ” \¸x£ òÿ° àHV¸ ä?IÑ ¸hCÝ òÿð €) òÿ T³8& òÿ0 ØW5 ˆý6E XüQ \ºa ð5ín òÿx °òÿ‡ d"š D ¥ òÿ¸ d¼ DÇ‘Ì diß @ë û òÿ€ÙVÄám&òÿ0ØdCòÿMòÿ\òÿq òÿ€òÿŠ€­ø òÿ¶Tm3ÍÚiÛèÌç m üNsN#!$Q*HVé;d¿EJòÿ\Ä´jòÿyÀ¶¤òÿ— p¬ ˆòÿµ»Xà òÿ×Lkêœ7üòÿ "ˆm874»I\cQòÿhÀZ` y$Óºˆòÿ—àÊ’¥Ô (¬|àV±@‰ÁŒµÑòÿÚ˜ëõë<;ú€¡¨í’À> +øh27òÿEòÿXòÿmTq”} îòÿ„òÿŽ`É~òÿ¬òÿ»,ØNÄòÿÛ”kê <òÿùdÎõtËq+äg@ë L Mö _Ì4€ud@H‰´k —ô¯'¦Àùµˆ^cÌX<ØŒ]·îdu¨òÿØáe-H5œ“@ViNô¯_Êjt c òÿˆòÿ“òÿšòÿ¨òÿ½Y¸Î€ÐpÜ`ÀéÈ'îòÿ ”øÌ(òÿ2Îo@òÿQ ”‚^hür 4Ôƒòÿ$ÂK˜„ÆE¯èaNÃòÿÓ òÿØ8ZšènfýÀfº òÿòÿ*Ök?L<îXòÿiˆz0ÀaŒ˜òÿ§ln†³ÄìT¾òÿÉTéâßòÿëø°öh òÿ  òÿ òÿ'òÿ2Ô¹êAòÿVòÿf,ÁRytŽ˜Ú`“òÿ¡òÿµ8Ô‡ÄòÿÒO#áòÿðØÉþ òÿ,t5(¤$:6à#4Ep¨ S Kòÿ]òÿkˆµ¼ƒòÿòÿ¢€êG±òÿ½„0YÌòÿÜòÿíòÿòÿp'+n>òÿMä«[\òÿoÄj"€òÿ’ÒꟀÁ@ ³¶`ôd±Ú  âòÿõ„»Y H#òÿ+òÿ=>cEòÿQh¤”dòÿ}€ê`òÿ¤P& ´¸g=ÇòÿÓòÿèòÿôÈc1œñ¯P#òÿ1­¬>@ëXR(™.gòÿq`\|  òÿ„†°æ›@ýø d&©HµòÿÃÔfÕÚòÿâ¾h÷`ü `7ïòÿ'L'y>òÿGòÿXòÿj|—{òÿƒ¬4˜Jj­òÿ¿òÿØòÿçòÿï eHýòÿ \Ë0Öž#òÿ-Dº=òÿEòÿOàq@]€¤s€äf„ òÿ•¬¬ªòÿ±`€t»¸ïnÌÀü~Ü|k ë€ ¼ú(°¤ü7 òÿM#1ü>õ;`tL¿"eüÙmà}X}òÿ‡ ´†›òÿ§4%ÿ´òÿÃòÿÍ´Ï„Ûòÿèn%ü°è òÿòÿ òÿ/ÀmP=TT‚RHß bòÿkòÿzÈmÃÐ"x—6«òÿºòÿÉÆgÜòÿçØ·ô„Dr %  m„1ÀÍ4EÜpZ µÌjÀýJ{X‡0™òÿ¡&j¯òÿ¾òÿÏòÿÝ ä@p~öòÿ òÿ òÿ  òÿ+ òÿB °ôRR  òÿ^ °j òÿy òÿ òÿ— òÿª žj¸ òÿË èä0Û k3í òÿ÷ ên !”!òÿ&!ÞƒB!„gU!DpÚk!ÔÉ`~!òÿ…!>o“!äe§!¾!@ÅÎ!ÀÔŠÝ!|g:î!òÿü!Ø/,"òÿ%"òÿ8"€®’L"òÿ`"Ðl"0x"¤oƒ‹"òÿ›"Œ=¤"òÿ²",2ŠÉ"œeHÛ"òÿå"òÿì" dñ"òÿþ"LÕa #BW#˜Þ¨!#ìd05#j›B#òÿN#ãêW#|c#4lbw#lUÜ…#òÿ•# ‰¦#,*&¶#€Â#òÿÎ#@üâ#°œ>÷#òÿ$òÿ"$$l16$ @òÿE$˜¬]$thCj$´j}$òÿ‰$蛕$Àkx¨$`W@¸$@IVÂ$Î$øk)â$áêè$`%@ö$gå %„¡4%òÿ %òÿ1%žvE%à0PP%˜O\% p²f%€æ v%òÿˆ%lxNž%òÿª%d©€»% XÌ%àç†Õ%òÿã%ì^•û%òÿ&8ê8"&(p8&lCàO&òÿY&|Dvo&òÿ&øÜ&Ì2›&,q®&ðº&òÿÀ& r Ó&ÀàÚ&€{jæ&èq=õ&Hd'òÿ'òÿ' l òÿ*'@í00'òÿ='8sP' q.b'¬áo'°1‡'P93—'òÿ¦'€o´' ,òÿ¶'òÿ¿'`Þ8Ñ'òÿÞ'øhó'ß#+Ìf6+ ;+òÿL+ìU+tÏV_+à¢n+à%i…+òÿ“+òÿ+pÃ+¯+Œm½+ŒnÙ#Ï+Àºfà+Ô¶ô+òÿ ,òÿ,˜&,îd;,òÿN,üZ,òÿf,òÿ, dòÿ,õê œ,Phª,èéQ¹,òÿÃ,CG×,P`sï,À4ÿ,€/- -òÿ- òÿ$-òÿ.-ØnA-À"T-`l,b-Àk o- €=-TÓ8†-òÿ—- vÓ®-hé1Â-D^Ó-òÿÞ-,j_ù-°4 .òÿ.òÿ-.@.@ÆO.0“jb.DõQq.´—….òÿ”.8i©. €òÿ­.òÿº.€yåÌ. œòÿÔ.òÿã.òÿú.¤ƒó /01š/ òÿ /¼2ô./à@ 5/ òÿC/˜TU/pÙGZ/œ/q/@ïv‰/  òÿŒ/pñŸ/ß ª/Di¶/àjÄ/Û/òÿã/òÿï/ÀM“ö/ òÿ 0à­0òÿ.0Øv“?0Ì©CM0òÿZ0ìjf0€öv0@þ’…0 p(“0øØÉœ0òÿ´0@ßV¹0òÿË0òÿÛ0LUä0|–?ð0É(ø0\² 1òÿ1€D: 1°r31(U›H1ØM1¬‹4V1ˆb=i1àGür1hèˆ1€%1 òÿ¡1L0ݰ1€sh¾1 dÃ10ÊÌ1òÿÕ1€`6æ1@Ëò1òÿ2Üü528¿— 2Tf32(šÃG2òÿT2 ib2òÿo2Hæ/‚2òÿ–2 °òÿ§20hC´2òÿÅ2òÿÏ2ˆÛ2 ?òÿæ2 YY3òÿ3(r*3òÿB3@r W3œ€Kh3òÿr3òÿ3Ø#˜3òÿª3ØÖ=º3ìå4Ã3òÿÏ3òÿÖ3òÿÝ3Èpð3`ëP4òÿ4êi$4òÿ34òÿA4¸j M4L5¤]4ø,»i4`rPw4òÿˆ4Øè4¢ø 4òÿ®4òÿº4Ö4ëè4¼–*ö4Ð#5òÿ5Bq(5òÿ45j@5ük6S5À¬:e5¬Á r5òÿ~58•î’5Œ3 5ˆjµ5òÿ¼5(õ Ì5é5èõù5òÿ6òÿ6òÿ6ý+6òÿC6òÿL6òÿZ6 òÿ]6”k6¸2|6ˆ6ô*˜6òÿ©6òÿ³6òÿÎ6òÿÝ6òÿä6í6¸(Å7ÄU¯7@s¼/7zn=7ì`BK7òÿZ7düo7{7œêž”7«7òÿº7òÿÆ7¨Ò7LB·ê7òÿ8€º|8ÐO8È·)8528òÿA8@%L8 ` ^8à»Ám8ý#€8¸Ê8¤C¥8ر8àñ˜¾8òÿÓ8\já8¨å8òÿõ8€c^ý8œƒs9âf%9À×Ð894=ÛU9òÿa9û(m9h¶o…9òÿ—9¤Æ«9<¾Ø¿9¨hÒ9à@â9—#õ9 òÿ:ÔiG:òÿ:(àG#:(¿9/:òÿD:òÿQ:ŒØy`:rjs:òÿ…:òÿ•:d_®:à‹¸Â:ÐÎ:`q4Ü:òÿá:`“pñ:Xlg;d; òÿ;òÿ+;òÿ4;Ü >;tü.I; G[;¨³àt;{;òÿ‡;à$8;D#Ÿ; òÿ¦;Ì Å±;¤”’Ë;ÀŒøÝ; é;è áõ;òÿ<òÿ<\ì%< Ú1<òÿC<òÿR< 0 òÿV<òÿ`<Fns<˜‰<§<Lò ·<`#`Â<ÜÉSÓ<dºÞ<D½jï<Ô[·=òÿ=ô"=òÿ'=òÿ5=˜ëUB=t”M=òÿW=À¨xm=€*„~=h”=ðX/¬=òÿ³=€dXÁ=è…Ø= òÿß=p&»î=¤¼>àã_ >üõ>ä1> æ:>€m M>ðuæ_>òÿp>Ì3ß}> k[>òÿž> XB°>€5v¾>Œÿ\Í>òÿã>XÊñ>àÒ?vp?0!?¤ð÷1? ê=?耞R?¸ÙàW?Äò6d?ˆk p?x» ‚? S6‘?`¡? 0â³?¨ŸSÃ?jkØ?òÿê?4èö?òÿ @Šn@pªß7@ œ*G@ ðòÿU@ ölc@X™-k@òÿ…@@B9’@àêh¡@òÿ¨@ òÿ·@¼­ÇÅ@,ÆWÚ@í@|©Pú@òÿAòÿAAdpQATE”^A¤RtAòÿ‡Aìš> Aòÿ¯Aòÿ¾A@#ÌA¸a/ØAë æAñAÀE’BÈ. B,;­8BòÿGB dòÿOB k$]B¬k<zB|×OƒB쟎Bòÿ›BĦB d´¹B òÿÌB´ØB ÀåBÄ…#ûBÀø CòÿCèg3C òÿACÀ‰ŠUC,³%cCؽ5tC0n;…C`jD˜C0¯CD¡>¼CòÿÃC ÏCgâCàˆÆòCòÿÿCج6DH0;Dض„0D7hADпFODÌ‚xcDòÿtD`ß …D`Dhÿ|šDÆ|¥DøDg´D±ê¿DÔ¤ŸÚDïêãDا¡óDòÿE˜'ET¤,Eòÿ>E˜*hUEòÿ`E4ãƒvE e@„Eòÿ—Eòÿ¤Eòÿ¯EoÂEòÿÒEhª¥åExöíEpF}Fòÿ Fàž˜F¸î81FòÿJü¬ØMJTo`JüoJ„³•}J0pmJòÿ¢JXÉy­JާÂJ ÈòÿÇJòÿ×JòÿçJ„93÷JKx’_K/Z.KÜ‚;9K °òÿFKìY{NKòÿ^KòÿrK–g‡Kòÿ£K8¯KèêºKøÝ ¿KËK`w€ÜKt¬dêKÿ¬÷KýKdšLòÿ#Lx .LhjFL¸RLÀ#^LòÿeLòÿqL€-‚LÀl8Ldì^—Lòÿ¯L Jr¾L˜ÊLèa;ÝL4”@íLòÿýL8mR MÀ€¤MÐÖ$2Mòÿ@MòÿMMhÒ¼\M˜øzdM@luMØ|&€M`}|‘MœÅ£M€¯Mòÿ¹MòÿÌM°“ƒ×MÓ²åMòÿïMlüN@%8N`g$N,œ¿,NT,¤7Nòÿ?NòÿXNàwHoNòÿyNÿ<‚N m4–N% §NhºN$nÏNòÿÛNÀ4îN\þNòÿOà¹O c%Oòÿ/Oòÿ:O f4HOlwÿ\OòÿqOÔhO´o”OÀ’¤O’h²OòÿÇOHoÙOàÌçO àòÿòOòÿP„_ËPìgC$P$ÿk.PØú7PÄ`ÄJP°°ŠXPàrXfP EqwP õ‡PlmY˜P   P Kê²PØŠ¾PDiGÉPòÿÚPòÿìP?<QD—ÄQàe +Q¬@7Q`ÆEQ|žRQÔàqWQ ç,lQ\î[xQL5èQòÿœQ@ ¥QŒj ÁQòÿÕQ» âQ òÿêQ@Œ~ûQ % RòÿR¤ú1+RÄk>RòÿKR@m@YRìÌpR”qƒR8n‘R¤Rà"§R̰RòÿºRøðuÌRÀq’ÝRòÿçRòÿðRòÿÿRòÿ SòÿSôn®2SÖÁ7SòÿCSðîPSS°ÕdXSˆmgSÈ#tS òÿwS|SL²ŽSòÿšS¨g¨SÌÏL°SpêÐÇSÀmoØS˜éSòÿóSÐÊT¤%TÀxc0TjoETá¹TTòÿhTbd}T`kT€;žTØð®TÀiÃTòÿÒTàõÂãTòÿíTòÿUüÒUÔ¯Ú%Uòÿ.Uòÿ_ØTrK_òÿ[_òÿm_t_ 8ž‡_@¬3œ_òÿ¤_”Ôö·_òÿÂ_ÔòÓ_òÿæ_ð„Óû_`òÿ)`òÿ:`@`(gS`ˆb)b`èj o`ð>¦€`òÿŒ`ôó œ`òÿ®` ØÆÁ`òÿÐ`Ü`òÿæ`LëLó`ÜDÄ aLðUad^#,aü @aòÿPaòÿXaòÿiaf ~a Nˆa˜•––a@…¨aLçL±ahÁ¹¹aòÿÈa`SPØaòÿíaxºyûaòÿbòÿbàbÄr/b 5bx†þ =bÈÕŒMbòÿabðtsbx/$Šb`–bòÿ§b4\Z¯bg(½bÈ—TÕb 0òÿÛbøhŒëbŒiG÷büs/ cc±J&còÿ0c @òÿ?cÀëèHcòÿ_cœñkc6h€cìÊ4Šct§c›còÿ°còÿÆcàÒcÝHâc(.Uðc° 5ýcidÀ àdüeÄ-dL—+:d€Á+Ldìþ^dòÿmdÜ*xd˜i†d“dòÿŸdÜ;H½d0a†ËdèÿyÓdˆñädÀïdàÉøÿdpk/ eòÿeòÿ)eˆ‚CBeòÿTeòÿae Zvneòÿzeòÿˆe˜?K eTk ³eòÿÉeÀlße@ˆ„ïeòÿûeòÿfjf¬Èk-f ±ð‚Kg4ÊUgT»#hg0@2g$d=“gà\P¤g¨°g€ÁgòÿÑg hçg´ghhè±hÀV"hxœê/hòÿ@h” FOh`C [hp„qh|J}hô×’h þç¤hòÿ¶h<\ÂhÄ4×h¨äxåhòÿòh€umi¸ûSi¤iòÿ*i Ó&3i@Ü*;iHüOi]iÆnkiPÿiòÿ‹i ß—iòÿ¥i4ˬiòÿ¸ixæ¨ÈiÌ×Ñi~ÜiX¬ˆìiòÿûi8“cj¨n4jòÿGjW6Wjòÿcj„]vjòÿ„jòÿjpƒ4šj òÿ©jòÿ·jäÂjòÿÖjòÿåj ó4õjkì1kòÿ#kòÿ7kÍ"Ekˆâ{Wk|BïlkŒÕ¢k$b¯–kòÿ¥k ŸK´k(Àk 2ÏkØ’Xãkòÿôk $¬l€½v$l¨CÓ:lòÿHlÌ"Wl ]là6€lle,€l@äe‰lÌÆÝ—lè£lÌ` ²l|²‡ÃlÀpøÖll"8ílòÿm@t m8ýO m ,m à6?m@!¼Nm òÿ\mòÿkm” llmain.cllutil.cllutil1.cdpmain.cdpfax.cdpcall.cdpdspinc.cdpcntl.cdpisr.cdpio.cdpcmd1.cdpllcnst.cdpllgain.cdpllhost.cdpshmap.ck56b_rx_bitLocation.0dpvpcm.cdpv92.ccas_det_timeoutsas_addr.0ssas_addr.1cas_addr.2cas_det_timer.3cw_cnt.4dpv92cid.cdpv92moh.cdpv92tx.catmain.catparse.catcmd.catcmd1.csDiag.0T_Causeud_CSud_SYM_RATEats.catfax.catv92.ciomain.ciodte.ciodte1.ciodce.ciodata.ciofax.ciopdm.cLast_rbs_tick.0lapm_bg.clapm_dce.clapm_adp_state.0lapm_odp_state.1lapm_dte.clapm_lib.cfptr.0lapm_ctl.clapm_rad.cv42bis.cv44.cv44_encode_dict_initv44_encode_initv44_encode_set_ext_field_widthv44_encode_errorv44_encode_completev44_encode_send_codewordv44_encode_get_nodev44_encode_send_str_extv44_encode_match_right_node_stringv44_encode_send_ordinalv44_encode_pack_bitsv44_encode_process_root_bytev44_encode_process_first_bytev44_encode_process_first_seg_bytev44_encode_process_ext_start_bytev44_encode_process_middle_seg_bytev44_encode_process_ext_bytewptr.0rptr.1eptr.2v44_encode_check_compressibilityv44_decode_dict_initv44_decode_initv44_decode_set_ext_field_widthv44_decode_errordte_wptr.3dte_eptr.4val_eptr.5hist_ptr.6v44_decode_unpack_bitsv44_decode_process_bitsv44_decode_process_codewordv44_decode_write_blockmnp_lib.cmnp_bg.crx_crc.0receive_crc.1last_char.2reset_flag.3mnp_ctl.cmnp_dte.cmnp_dce.cmnp_5a.cuart.cv16550_thre_irqrcvFIFOleveltxFIFOlevellinuxif.cmodem_appmath64.cnum_sign_bitswDspM32V92_Ph302_pcmdp_dialtone_cycleswDspM32V92_P4Tbl_pcmwDspM32V92_Diltbl_pcmat_error_control_swUART_CommWriteStringio_rx_byte_cntring_order_32k_3Dbv92_cid_x_bufv42bis_DeBuff_fulllapm_data_ptrdp_update_ratedp_moh_dial_timerdp_v92_off_hookdp_v34_start_detect_castoneio_app_tx_countfails_printfdp_auto_ratedp_v92_scramblerUART_stop_breakmnp_rx_data_compressiondp_vpcm_startup_cmddp_moh_initiator_bgll_init_norx_output_initcd_dropout_timerwDspm3V92_RCHGio_fax_initchildwDspCore_McVecCheckMinimumV34Rateat_data_remainio_dte_rx_old_ptrdp_v92_fcc_txwritebioat_cmd_filterwDspCore_dPopmnp_rx_stream_opt_flagg4vpcm_retrain_detectv92_precoder_x_ptrgbufio_rx_asynclt_pcibios_read_config_dwordRead_mdm_wordlapm_tx_hdlc_framedp_outpat_and_gio_rx_cur_byteio_write_dce_fifoll_init_denat_and_tlapm_control_frameMMCL0at_set_rate_parav92_LP1_coefdp_v92_bytes_to_bitsv92_LP2_coefring_order_48k_3Dbmnp_tx_octet_framewDsp_V8PATcpcpt_addrVpcm_M_LevelscrambitV16550_Read_IERio_tx_hdlc_bit_countconst_50k_0Dbdp_wDspRetrainStatev42bis_EnDictFullUART_CommReadCountlt_pcibios_write_config_worddp_get_line_ratell_init_sauconst_38k_6Dbatparse_statedp_hdlc_modedp_over_current_detectconst_48k_3Dbv92_cid_initring_order_40k_0DbwV8WkRnd1dp_answer_tone_detectedwDspVpcm_RCHGll_init_latdp_disable_33600dp_busy_off_cadenceconst_50k_6Dbring_order_36k_0Dbat_olapm_vsll_init_viering_order_50k_3DbV16550_Write_MSRdp_dial_statev42bis_N1io_pdm_tx_bufferdp_rate_change_cmdv42bis_EnTest_delaydp_v92_idleat_backslash_jat_xUpdateEEPROMdp_v92_hook_flashat_data_compressionll_init_finwDspM32V92_Ph301_pcmdp_first_calldp_v92_cpd_hddp_apollo_commanddp_byte_bdp_v92_trellislast_fax_v17RtDelaydp_vpcm_retrain_cmd_vpcmUART_cts_onpci_base_address_1ll_init_subvendor_0e11io_app_tx_sptrdp_line_connectv44_de_c3at_ddp_int_regwritedp_test_cmdwDspCore_mcCoredp_demod_cnvio_rx_sofdp_desc_bufferio_put_dte_tx_charAltRbsInitio_dte_inact_timerdd0dp_board_enablering_order_32k_0Dbll_init_barlt_rs_interruptx_modem_ecm3RtDelay_copydp_modem_commanddp_timer1ring_order_58k_0Dblapm_pollio_dce_rx_eptrdp_local_phone_statev44_de_str_lendp_byte_dwDspM32V92_PcmSub_pcmk56b_rx_rPatternArrayio_get_dce_queue_countconst_34k_3Dbset_boardidring_deorder_54k_3Dbring_deorder_58k_6DbMinDownVpcmRateat_poundio_periodic_taskdp_v92_encoderdp_moh_timer_longlapm_send_xidio_pdm_rx_wptrwDspM32V92_Ph42_pcmv44_en_n7ring_deorder_44k_6Dbx_statuswDspVpcm_Ph31dp_v92_ConTbl_indexring_order_44k_3Dblapm_build_iframeio_dce_tx_sptrGet_PCI_BASE_ADDRESS_2io_dce_tx_fifo_emptydp_sync_mode_hdlck_tabledp_dsp_cmd_in_progresswDspV92_Ph31_pcmdp_init_lcodecio_dte_rx_sptrwDspVpcm_Robbat_v90at_vwDspm3Vpcm_Ph32AltRbsSlicerTblETC_modedp_ll_init_arrayW64W64_ComparewDspVpcm_Coremnp_tx_hdlc_frameinpRT_FIX_MARS3dp_v92_initdp_dial_timerinit_RBS_tick_flagmnp_rx_data_opt_flagio_dce_loopbackeepromv44_en_c1wDspVpcm_P4Tblio_dte_tx_wptrmnp_retransmitmnp_initv44_de_dte_write_countUART_stop_bitsdp_dial_stringinit_1027V16550_Write_LSRread_Blacktip_Resourcering_deorder_44k_0Dbstr_V44MNP5wDspV92_V90Wk1_pcmll_set_TAPI_CountryIddp_vpcm_retrain_cmdUART_xoff_offdp_v92_moduluswDspm3V92_Ph32dp_v92_retrain_cmd_v34ll_init_fradp_v92_to_v34_retrainio_fax_sync_dce_to_dteBaseAddressDatamnp_build_control_frameUpLevelLoadPop16kconst_32k_0DbV16550_Write_MCRring_deorder_40k_3Dblapm_transmit_framex_dma_xfermnp_rkdp_mse_threshmnp_data_compressionwDspV92_Ph30_pcmwDspVpcm_Ph41rxBM_defaultll_init_subvendor_1468_440DCPrIndexdp_mars_sleepll_init_indv42bis_N5const_44k_6Dbdp_invalid_timerdp_reset_dspLaunchTapiMsgAppletwDspm3V92_v34dwrdp_dc_offsetat_dtoaat_numericFormatResultdp_fax_ced_tone_cmddp_bFallForwardpassdp_save_ram_locring_deorder_52k_0Dbdp_download_v92k56b_rx_dataQprev_vpcm_sptrring_deorder_46k_3Dblt_add_timermnp_rx_datav42bis_EnEscCharwDspm3Vpcm_TrnTbat_init_variablesll_init_iceio_app_tx_eptrio_tx_breakat_percentx_dsp_marsdp_read_constellationv42bis_EnC1ll_init_ukll_init_pertregistersdsp_ram_valuev44_en_rootat_printCpdp_v92_processlapm_iframe_on_queuedp_moh_dial_ptrdp_56k_speaker_cmdring_deorder_60k_6Dbat_ilapm_odp_rptrmnp_negotiated_modeat_backslash_bx_modem_stateMinDown56kRatedp_v34_dnflag2dp_dma_enablefunction_2lapm_nsio_fax_sync_dte_to_dcell_init_ctr21DteRate_Stringdp_v92tx_initDCPBufferv42bis_DeSptrdp_restore_precoder_v34v42bis_DeC2dp_ringback_cyclesat_backslash_xdp_cw_statedp_descramblergood_ff56_countmnp_framing_modedp_calling_tone_disablev44_en_transparentx_set_current_timering_order_56k_3Dbio_pdm_tx_wptrv42bis_bitpackio_hdlc_byte_countUART_dtr_blockedmnp_first_lt_flagstr_stdrs232wDspM32V92_Ph44_pcmwDspCore_mPdmDPdp_fax_connect_successA2MuTbldp_busy_tone_timerdp_hdlc_mode_no_crcMinDownStreamRatelapm_retransmitv44_en_test_delayr_tablevpcmModulusdp_async_user_modepci_base_address_io_maskwDspm3V92_Mi2RTmnp_rx_disconnect_codedp_download_cptdp_set_v92_optionsVpcmMinDistdp_ringback_on_timerdp_failuresdp_cidtone_detectV16550_Write_FCRll_init_urulapm_dte_wptrv42bis_flushdp_dsp_int_regwritelapm_clean_rcv_framev42bis_P0UART_Flushz8cptTblat_and_qwDspm3V92_PcmSubMaxLevelll_init_estv42bis_DeBasewDspV92_TrnTb_pcminpdV34Modering_deorder_38k_0DbGetAndSignalEventvpcm_RxSymbolBitProcdp_statell_init_subvendor_144dio_statedp_max_line_ratemnp_data_opt_flaglapm_reset_timermnp_nradp_init_vpcm_decoderring_deorder_36k_3Dbv44_en_comp_bytesmnp_fixed_field_opt_flagio_pdm_rx_eptrv92_LZ2const_56k_0DbToshibaFlagdp_inpmnp_next_tx_rframevpcm_sptrdp_carrier_lossCpqFlagv44_en_n2const_54k_6DbwDspM32V92_ComSec_pcmdp_write_dsp_ramv92_precoder_bufdp_v54_terminate_cmdmnp_vrtx_1_byteV16550_Write_THRwDspm3V92_P4TblUART_data_bitsconst_addr_tblat_atointdp_regread_nonintparentMinDownDialLineRateat_SrangewDspm3Vpcm_Mi2Wkdp_lapm_error_check_initGetGainwDspm3Vpcm_Ph31DCP_timerwDspM32V92_Ph41_pcmv92_vn_wptrat_break_seldp_moh_timeoutmnp_stateget_next_charx_modem_modedp_update_blacklistll_init_czechdp_timermnp_last_acklapm_rx_iframeconst_56k_3Dbio_detect_inactivitywDspm3V92_Pop8kVpcmRatev42bis_DePreC1dp_rtdelay_workarounddp_moh_statedp_init_modemv44_en_seg_lenio_dte_tx_sptrring_order_44k_0Dblo_bit_ctrDetAMuMix6dBGetReadOnlySRegmaskring_deorder_52k_3Dbdp_readram_failcntwDspM32V92_Ph45_pcmring_deorder_48k_6DbwDspVpcm_V90Wk1lin_homol_updatell_init_gumio_pdm_backgroundlapm_vaconst_36k_3Dbstored_K_bytesdp_v92_scramLonglapm_v42b_errsMuLinwDspV92_P4Tbl_pcmk56b_rx_bMinusKx_parity_maskrightinpwio_rx_byte2dp_ringback_on_cadenceV16550_Read_LSRRBS_patternll_init_bramnp_flow_timerv92_LZ1dp_bong_tone1_on_timeat_currentViewLineconst_40k_3Dbv44_en_trans_bytesdp_read_dsp_ramUART_dce_break_onv44_de_c4ring_deorder_36k_6Dbll_init_canv92_cons_gainmnp_read_octet_from_dce_bufring_order_46k_0Dbdp_blacklist_periodicv44_init_variableslapm_kconst_40k_6DbUART_CommWriteCountVMODEM_Get_System_TimewDspVpcm_Diltblat_backslash_kdp_v92_dsp_checkdp_wV34Optionll_init_subvendor_158Dlapm_extended_fcsdp_busy_on_cadencewDspM32V92_Robb_pcmdp_answer_off_timerll_init_bulll_init_litio_dce_to_dte_datav44_de_esc_charGetMdistold_app_cbqTxll_init_vendor_defaultUART_CommFindBytev44_de_c2k56b_Kdd11dp_bGoodAutoat_backslash_qwDspCore_PdmDPat_mio_get_dte_rx_bytesUART_dtr_offRBS_tick_rxstr_msecll_init_hondp_filter_modifiersio_send_breakio_break_lengthwDspm3Vpcm_DLossdp_init_decoderll_init_virpeak_energyx_current_time_longdp_v32_ac_workaroundmnp_negotiated_servicev92_precoder_x_eptrio_get_dce_rx_countv44_en_historydp_rem_digital_loop_cmdUART_cts_offring_order_40k_3Dbdp_dial_ptrll_init_sngwDspV92_V92com_pcmwDspCore_pRing2m3RtDelaylin_wake_upio_init_dce_rx_fifostr_xltconfig_pathUART_CopyDteTxDatadp_terminate_mohmnp_klapm_remote_busywDspM32V92_Ph31_pcmdescrambitll_init_korio_tx_v54wDspFax_apofax5io_dte_rx_last_chdp_dial_tone_detectedv92_cid_ptrv42bis_init_dictTAPICountryTableat_and_zv42bis_DeSlendp_retrain_download_v92pci_interrupt_linedp_set_mercury_gainio_tx_dce_to_dte_datadp_vpcm_print_dsp_sptrat_char_all_save_modem_optionsdp_fax_tone_stateud_responseform_g2_g4_z8ring_order_50k_6Dbll_init_panv92_Mring_order_54k_6DbsALinBio_init_pdmio_compute_crcring_order_60k_0Dbv44_de_n7cell_activecpcpt_valuesRatedp_thresholdring_order_58k_6Dbdp_display_numberll_init_austx_send_cmd_to_all_tasksdescrambyte_pcmvpcm_rx_K_sizeconst_42k_6DbSat_statev92_caller_id_tabdp_v23_statering_deorder_36k_0Dbring_deorder_48k_0Dbll_init_perMin_distwDspCore_pInitv42bis_EnC2io_dte_tx_old_ptrat_tmnp_rx_kring_order_42k_3Dbring_deorder_32k_6Dbv92_modulus_bufio_dte_tx_eptrat_comp_swuI2LinTblio_timermnp_tx_breakmnp_process_lt_framex_minute_timerwDspm3Vpcm_Diltblci_timer1wDspVpcm_TrnTbinp_dUART_rts_onat_init_diagnosticsx_odd_parityPciPME_enable_NTdp_moh_time_indexdual_port_tx_pcmwDspFaxv44_de_bitbuffdp_dsp_checksumring_deorder_52k_6Dbmnp_rx_fixed_field_opt_flaglucent_init_modemSYdp_polarity_intrcv_lvl_tblat_and_and_nring_deorder_tbldp_deinit_modemv44_en_n8v21_valid_timerll_init_maldp_regreadv92_prefilter_v_eptrUART_CommReadStringlapm_init_variablesat_and_wREAD_UART_REGll_init_vendor9ll_init_mltk56b_rx_mArraydp_search_listwDspm3V92_Coremnp_skdp_vpcm_to_v34_retrainring_order_50k_0DbuLindp_invalid_countx_strlenwritebiomwDspm3V92_Ph41ll_init_subvendor_1014v44_en_c4_ptrv44_en_c5at_dce_speed_codedp_check_listdp_v92_backgroundDSP_CPd_DownLoadwDspM32V92_RCHG_pcmv92_prefilter_v_sptrvpcm_D_high_bitsll_init_guaring_deorder_58k_0Dbv92_modulus_u_sptrll_init_phiv92_vn_eptrmnp_user_disconnect_codeio_v92cid_bufstr_V42bisMNP5const_40k_0Dbat_backslash_vlapm_n401ll_save_diagnosticsdp_v92_fast_rate_changell_init_vendor7ResetFramedUdCountv92_trellis_paraDCPwIndexring_order_36k_6Dbvpcm_retrain_timerconst_50k_3DbUART_xoff_onio_tx_compute_crcat_yIBMBlacktip1Flagio_fax_hdlc_dce_to_bufmnp_decode_lt_framedp_v92_hdlc_modeio_fax_bufdp_v92_limit_upstream_ratell_get_TAPI_CountryIdvpcm_rptrv42bis_EnTest_countlt_pci_find_devicewDspVpcm_DLossdp_enable_ring_intWRITE_UART_REGlapm_clear_rx_frameio_dce_tx_wptrring_deorder_34k_0Dblrnv44_en_stateio_fax_backgroundll_parav42bis_flusheddp_disable_fallforwardlapm_backgroundShellDemapperlrnTblill_set_pci_idRT_FIXv92_con_tablex_elapsed_minutesat_ell_init_subvendor_141BV16550_Write_THR_bufferg2printViewLineUnNumtime_tablex_send_mailconst_42k_3DbGet_PCI_INTERRUPT_LINEv92_LP2v42bis_DeC1at_v92lapm_receive_framedp_v92_diffencodedp_auto_rate_statedp_set_lb_filterv92_scrambytedp_bamil_rbcll_init_thawDspFax_apofax4wDspm3V92_Robbconst_48k_6Dbx_outputdp_ringback_off_cadenceat_nV16550_IRQ_Numberio_at_esc_timerio_sleepv92_put_msgat_taskdp_fast_retrain_cmdppj1_5wDspCore_pmering_order_56k_6DbCheckMinimumVPCMRateiabslapm_mohv92_retrain_detectpciresetdp_fax_silence_detectx_sleepv44_de_str_indexll_init_vendorconst_60k_6Dbdd23x_enabledp_countwDspCore_mMClkTbatparse_cmdv44_en_esc_chardp_out_portdp_lapm_auto_ratering_order_52k_0Dbv92cid_process_datasign_encodedconst_34k_0Dbdp_vpcm_flagdp_write_dsp_arrayx_minute_timer_longio_pdm_rx_bufferUART_dsr_offio_at_esc_detectat_parityll_init_romat_cmd_bufdp_v92_disable_workaroundpci_base_address_2io_fax_hdlc_dte_to_bufdp_dsp_data_in_progressring_deorder_54k_6Dbdp_ringback_initv44_de_c5io_dce_tx_rptrmnp_flow_timer_expireddp_dialing_statusat_valid_numberat_and_mlapm_framesmnp_nsk56b_rring_order_48k_6Dbat_dialLineRatesdp_mohcid_statering_order_34k_3Dbdp_bV34WkStatev92_cid_stateUART_dtr_ondp_vpcm_decoderdp_demapperconst_56k_6Dblapm_reject_sentx_inputwDspm3V92_TrnTbdp_dial_pausedescramLonglt_pcibios_read_config_bytestr_V44V42bisMNP5v92_put_cr_lfRANGE_Stringlapm_local_busyring_deorder_50k_6DbwSymbolRatell_init_turdp_clear_blacklistdp_modem_idle_cmddual_port_txio_rx_byte1lapm_process_iframeW64W32_Dividering_deorder_38k_3Dbdp_crcV16550_Read_SCRGet_PCI_BASE_ADDRESS_IO_MASKread_vuart_portio_app_tx_rptrat_timerfax_mse_countll_init_beldp_continous_busy_timerdp_sleepv44_en_c1_ptrdaPciPME_enablell_init_tx_indiall_init_croUART_backgroundv42bis_DeEscCharv42bis_N3v44_de_ext_len_field_widthx_minute_countv44_P0lin_killll_init_subvendor_1468dp_download_dsp_V92io_fax_hdlc_buf_to_dceconst_34k_6DbUART_SetRxQueio_pdm_tx_sptrGetAndSignalMohEventll_init_gremnp_get_frame_from_queueGet_PCI_BASE_ADDRESS_1v44_en_bitbuffv92_vn_sptrll_init_chill_init_modem_variablesmnp_rx_max_info_octetswDspVpcm_Mi2RTinit_ll_parall_init_polx_strcatDpIdleFillCharDLAB_latchcpt_table_defaultdp_dsp_versiondp_regwrite_nonintWrite_mdm_Dwordll_update_parametersll_init_ecuio_line_ratev92_connection_timerconst_38k_3DbQ24io_esc_dte_wptrm_tabledp_test_dialstringring_deorder_50k_0DbwDspM32V92_Ret_pcmx_init_international_defaultdp_ring_intvxdPortOpendp_v92_prefilter_outputdp_ringback_statedp_dsp_regread_polldp_lapm_error_checkring_order_38k_0Dbio_pdm_tx_countlapm_timer_expiredio_dte_tx_buffUART_ri_onio_pdm_rx_rptrat_qcrc_computemnp_seq_recover_flagio_start_bitmnp_backgroundring_order_38k_3Dbdp_fax_downloadeddp_answer_statelapm_build_xid_parameterlapm_next_tx_rframell_init_banconst_52k_6Db_SJ1wDspm3Vpcm_Ph41io_read_dce_fifoat_data_fmtio_dce_tx_bufflo_demap_datacl1_flagat_reportdp_in_portdp_download_arraydp_init_modem_connectionat_prnx_fax_statecstringMinUpStreamRatePowDevll_init_nzlapm_get_frame_from_queuewDspm3Vpcm_PcmSubll_init_srill_init_itav92_byte_leftv44_de_bitbuff_countat_percent_xll_init_spauart_dte_tx_countio_app_tx_wptrtbllapm_t401ring_order_32k_6Dbv92cid_multi_data_msgGet_PCI_BASE_ADDRESS_SPACE_IOV16550_Read_LCRat_v90_strdp_board_disabledp_retrainv44_encode_flushdp_restore_ram_locio_hdlc_tx_ones_cntat_srejpre_sptrdialed_numberat_percent_cdp_v92_ciddp_byte_ewDspM32V92_V92com_pcmwDspm3V92_CasDetdp_report_voice_eventdp_download_large_arrayMu_Lawconst_58k_0Dbdp_detect_over_currentsymboldp_download_cpdp_dsp_rom_checksumat_and_cwrite_vuart_portlapm_mnp_lr_detectedat_and_pring_order_54k_3Dbdp_pulse_dial_cmdv42bis_EnBitbuffpack_KQ_bitsdp_init_blacklistdp_busy_cycleswDspV92_Mi2RT_pcmwDspm3V92_DcpGetLrnTblIndexdp_quiet_answer_timerRead_mdm_byteat_cmd_err_retring_deorder_46k_6Dbll_init_isrV16550_Read_IIRstr_convertdp_ringback_detectedat_hdp_lin_to_dbUART_paritydp_sync_mode_markwDspCore_pHomowDspVpcm_ComSecwDspm3V92_DualEqudp_v92_moh_initring_deorder_44k_3Dbdp_tad_downloadedll_init_hundp_ringback_off_timerring_order_34k_6Dbdp_update_modem_optionswDspm3Vpcm_RCHGvalid_numbersInitVariablesmnp_crcpci_base_address_space_iodp_vpcm_idlewDspm3V92_Ph30mnp_vsio_dte_rx_buffv42bis_encodeat_form_connect_ratelin_signal_pendingv92_scrambitv92_cid_x_ptrk56b_rx_dataKring_deorder_48k_3Dblapm_rx_hdlc_framering_order_46k_6Dbstore_numberdp_disable_workaroundv92_modulus_u_eptrv92cid_process_jcid_datadp_fax_tone_onio_dce_rx_sptrlpUdOutBufferUART_SetQuestr_V44V42bisfunction_1wVibCRCdisablell_init_swidp_vpcm_get_digital_loss_and_rob_bit_statusv42bis_EnPreC1sBufferconst_46k_3Dbdp_v92_update_connect_statusStop_DCPHeaderInitio_fax_stateio_tx_hdlcwDspV92_ComSec_pcmdp_moh_dial_stringll_init_mextxBM_defaultdp_over_current_alertwDspm3V92_Diltbldp_wAgcGaindp_init_local_phone_onhookv42bis_DeBuffwDspM32V92_Core_pcmdp_answer_cmddp_tx_fifo_emptyio_tx_hdlc_flagswDspV92_V92src_pcmll_init_subvendor_155Ddp_drop_datak56b_qll_init_venwDspV92_Diltbl_pcmwDspV92_Frc_pcmBaseAddress2v42bis_unpack_flushdescrambytedp_v92_prefilterwDspm3V92_V92Pdmdp_copy_CM_JMdp_calling_tone_cmddUdOutBufferSizewDspm3V92_V90Wk1ll_init_naat_atohexv44_encodeat_get_faxratestr_blankslapm_process_xid_parameterstr_MNP5lapm_send_breaklapm_counterlapm_no_of_rx_frames_fulldp_transmit_levelcd_returned_timerll_init_subvendor_144Ffprsettingdp_modem_command_longconst_54k_0Dbio_dce_tx_rptr_oldv92_cid_doneComAddressring_order_38k_6DbltmodemAppCountv42bis_init_decodeFindCpqdp_restore_precoderpre_ptrwDspm3Vpcm_Core2V16550_Read_RBR_bufferat_cmd_ptrll_init_colring_deorder_40k_0Dbat_diagnosticsmnp_build_lt_framedp_dsp_isrwDspm3V92_Pop16kdp_dial_tone_timerv44_en_c3ring_order_36k_3Dbdp_dsp_sleepdp_v92_on_hookv44_en_output_byte_countv42bis_N6Write_mdm_bytedp_fax_carrier_lossx_fax_ratedp_stored_numberat_backslash_nmemsetIrqlapm_statelapm_disconnectat_faxg_piddp_show_numbersat_backslashdp_fax_cng_tone_cmdwriteciocring_order_56k_0Dbv42bis_DeBitbuff_countlapm_receive_queuemnp_rx_frame_typeVpcmDesFrmConsTblx_parityio_dce_bufinit_landline_ETCll_init_nicx_elapsed_timev44_displaydp_write_dsp_blockat_modulationat_atoiv92_moh_statusstr_disableCheckMinimumV92RatewDspm3V92_Ph42v44_en_last_node_ptrring_order_52k_3Dblapm_process_ackdp_v92_con_tblio_rx_ones_cntring_deorder_56k_0Dbconst_60k_0Dbat_GCI_numdp_vpcm_initdp_ocp_timerat_and_fx_strcpyW64W64_Multiplydp_init_local_phone_stateio_fax_disconnectaLinBaseAddressIndexconst_46k_6Dbll_init_sawDspm3Vpcm_V90Wk1lapm_dsvd_dlciwDspM32V92_ALL_CIDv42bis_init_encodedp_offhook_cmdring_order_40k_6Dbx_current_timev42bis_decodeio_dte_loopbackv44_en_bitbuff_countv44_decodewDspM32V92_TrnTb_pcmMMCLold_K_bytes_numcall_func_statedescramword_pcmdp_regwritedp_download_faxll_init_subvendor_144F_449lapm_abortdp_sh_bufferdp_taskdp_v92_diff_lowmnp_stream_opt_flagring_deorder_46k_0Dbmnp_rx_user_disconnect_codell_init_parstr_V42bisat_lll_init_ruswDspV92_Ph41_pcmv42bis_unpacklongLong_Addoutpdlapm_rx_frame_typedp_answer_on_timerud_displaydp_download_default_cptll_init_omaHEAD_Stringmnp_nkB_frame_56kwDspm3Fax_V17WKconst_52k_3Dbat_dashv44_de_next_bits_lengthwDspCore_pCorell_init_luxio_get_dte_rx_chardp_v92_cid_initx_dial_residualdp_check_delaywDspV92_Ph43_pcmmnp_negotiate_paramsv42bis_EnSptrdp_max_pausedp_init_mcodecat_viewwDspV92_Ph32_pcmio_rx_hdlcwDspm3Vpcm_Mi2RTat_dte_speed_codeNTPortClosev44_de_n8v92_bit_left_countv92_cid_rxwDspVpcm_Ph42v44_de_n2vxdDosChangeQueuewDspm3V92_mhwkconst_46k_0Dbdpv92_rx_jciddp_decoderv92_LP1v44_en_old_last_node_ptrio_fax_hdlc_buf_to_dtedp_byte_fat_and_vio_get_dce_tx_countwDspm3V92_Pop12kring_order_42k_0Dbring_deorder_56k_3Dbdp_loop_numll_country_enabledwDspCore_mcInitdp_tone_off_timeat_compV44_swq_tablev42bis_N7vpcm_timerconst_52k_0Dbdp_detect_tones_cmdat_connect_code_flagconst_36k_0Dbring_deorder_42k_6DbwDspm3Vpcm_Robbconst_38k_0Dbdp_local_phone_timerlapm_transmit_odpll_init_tbr21v92_vn_bufdp_tone_statedp_v92_retrain_cmd_vpcmUART_dsr_oncall_funcx_wakeupdp_v92_retrain_cmddp_onhook_cmdconst_58k_6Dbdp_save_precoderV16550_Read_MSRdp_v34_auto_rateMu2ATblwDspV92_Mi2Wk_pcmat_dte_rateUART_cd_onv44_de_str_statevpcm_retrain_flagx_init_modem_optionsv92cid_single_data_msgring_order_54k_0Dbll_init_taiwDspVpcm_Ph32at_percent_tat_wmnp_tx_control_frameV16550_Initx_init_internationalat_result_codex_memcpydp_v92_dial_connect_successmnp_disconnect_codedp_sync_modeLC_tempwDspm3Vpcm_P4Tblglt_ioctl_cmdlapm_data_dlciVMODEM_Start_Timerring_order_46k_3Dbdp_cmd_timerconst_54k_3Dbx_set_hardware_optionsring_order_52k_6Dbconst_32k_6Dbat_flow_control_swWSToMsgBoxdp_redialprintViewLineCompwDspV92_Robb_pcmv42bis_N2lapm_vrbdp_fdsp_recordv92_bits_bufdp_tone_on_timeio_tx_dte_to_dce_dataat_beeprom_flagV16550_Read_RBRat_aud_cjm_displayx_strcpy_lengaoutpdp_v34_workaroundv92_vn_rptrconst_44k_0Dbreadbiodp_change_mercury_gainio_tx_hdlc_framell_init_slovakiav44_de_c1Read_mdm_Dwordglt_create_nvram_flagio_fax_inactivity_checkring_deorder_40k_6Dbdp_dsp_regreadmnp_rx_framing_modering_deorder_60k_0DbUART_get_statuswDspV92_Core_pcmprintViewLineEDring_deorder_32k_3Dbsaved_io_statewDspm3V92_ComSecv42bis_N4io_remote_control_modeat_isdegitdp_update_diagnosticsdp_reg2bdp_dsp_statusWrite_mdm_wordlook_4_cngdp_retrain_cmdconst_42k_0DbV16550_Write_SCRv92_modulus_u_ptrstr_V44dp_v92_frame_countlapm_adp_detectedring_deorder_42k_3Dbring_order_60k_6Dbdp_periodic_taskprintViewLinedp_set_homol_optionsv42bis_init_variablesio_dual_port_rxv92_cid_copybackat_percent_eio_dte_rx_eptrDigitalCallProgressdp_blacklist_callsio_uart_statusVersionaSTblwDspm3Vpcm_Ph42D3Flagread_eepromdp_interruptwV8WkRnd2vxdPortClosedp_v92_diff_highv42bis_EnTransparentdp_vpcm_retrain_jumpx_elapsed_long_timeUART_start_breakio_vn_tx_countx_even_parityResetV34CPAudioPointersv44_en_input_byte_countat_and_kprintViewLineStrat_cmd_lenll_init_cyplongLong_Multiplyring_deorder_38k_6Dbdp_dial_connect_successdisplay_idlapm_odp_detectedstr_enableio_crcscrambyteio_send_break_to_remotedp_vpcm_backgroundwDspm3V92_Ph31dp_download_runtime_cptSetDCP_timerdp_v92_M_highRxSymbolBitProcll_init_porio_fax_monitor_dteat_view_moreat_backslash_aLdValFindTosdp_v34_dnflag1io_pdm_tx_eptrdp_originate_cmdv44_en_c4wDspM32V92_Ph32_pcmlapm_vsbv92_LZ2_coefwDspm3V92_v34cwio_dce_tx_eptrdp_analog_loopback_cmdio_init_dce_tx_fifoio_dte_rx_wptrlrnTblsMuLinBv42bis_DeBitbuffdp_regandorll_init_vendorAxidp_clear_precoder_storagelapm_process_breakmnp_disconnectat_report_swio_at_esc_stateat_vsm_formatdp_init_variablesload_numberlucent_detect_modemwDspM32V92_Ph43_pcmat_zscramLongdp_versionll_init_subvendor_8086dp_hybrid_downloadedcell_ring_intAltRbsLrnTbliUART_cd_offwDspV92_Ph42_pcmll_init_cosdp_download_vpcmll_init_argx_sleep_modezero_insertx_modem_originatelapm_decode_iframev92_trellisdp_busy_tone_detectedlapm_process_v44_xidx_test_mode_onll_init_ausv92_LCStart_DCPring_deorder_50k_3Dbdp_v92_M_lowmnp_max_info_octetsk56b_Mio_dce_rx_wptrat_flapm_tx_breakring_order_42k_6Dbll_init_ireold_app_pqTxx_fax_v17write_eeprommnp_vsadp_precoderat_and_andMinUpDialLineRatell_init_blsv92cid_counterio_cid_ptr_v92dp_ring_detectedDCPBufferStartio_app_tx_data_updateat_sdp_fax_tone_offv44_en_ext_len_field_widthv92_LZ1_coefwait_for_core_readio_tx_crcio_get_dte_tx_countll_init_uaelt_pci_presentx_line_rate_txv44_en_str_lenwDspV92_V92ec_pcmv92_prefilter_bufV16550_baudrate_updatell_load_diagnosticsll_init_ukrresult_msgdp_v92_v34_connectring_deorder_32k_0Dbmnp_attention_typell_init_jpnv44_en_c2ll_init_subvendor_144F_441wDspV92_V92int_pcmwDspV92_RCHG_pcmk56b_ringDeorderPtrdp_blacklistlin_interruptible_sleep_onat_backslash_tdp_blacklist_initializedio_init_taskio_tx_hdlc_bytedp_dc_offset_flagx_hbspat_auto_modulationv42bis_bitpack_flushlapm_vrmnp_init_variablesv92_tx_crcV16550_Write_LCRdp_rx_signal_leveldp_over_current_tonelt_pcibios_read_config_wordv42bis_DeDictFullv42bis_DeEscModeoutpwring_order_48k_0Dbdp_fax_startupUART_rts_offdp_vpcm_v34_initio_uart_msrV16550_Read_MCRv42bis_EnCompBitswDspM32V92_Frc_pcmio_pdm_rx_sptrll_init_boldp_byte_cat_percent_bdp_vpcm_fall_fb_checkV16550_Write_IERdp_v92_async_modelapm_next_tx_wframevpcm_D_low_bitsmnp_vralapm_rx_dte_charring_deorder_54k_0DbUART_initdp_sleep_modewDspm3Vpcm_ComSecat_and_sat_itoaio_pdm_tx_rptrwDspCore_mpCorev42bis_DeTransparentdp_modem_ratemnp_nsadigloss_detect_okat_pring_deorder_56k_6DbsALindp_dialx_output_deinitVMODEM_Timer_Activedp_show_blacklistll_init_subvendor_1668ll_init_pakpeak_busy_energyio_taskconst_48k_0Dblapm_put_frame_on_queuev92_Vinit_cng_detectUART_ri_offio_fax_sync_tx_inix_dsp_mars3dp_v92_precoderBaseValuev44_de_historyviewLinev42bis_EnBitbuff_countat_putsCrLfring_deorder_42k_0DbInit_Marslapm_process_xiddp_no_ringback_timerv44_en_last_match_ptrll_init_liewDspm3V92_Mi2WkQM_bit_decodell_init_nethring_order_34k_0Dbiircoefdp_v92_fall_fb_checkdp_clear_ramdp_start_transmitat_comp_select_swx_chip_versionphase3tapsconst_32k_3Dbdp_bamil_rd7io_rx_byte3dp_vpcm_update_connect_statusUART_SetTxQuePackBMSprintViewLineNumdp_run_romwDspVpcm_PcmSubdp_get_delaydp_busy_stateio_dte_rx_rptrdp_quiet_answer_detecteddp_wV32bisRcvRateDCPThresholdwDspCore_Dcpv42bis_EnC3v42bis_EnSlendp_vpcm_retrain_cmd_v34UART_dce_break_offdp_v92_bits_per_frameio_start_dce_transmitwDspV92_Ret_pcmDSP_ER_flagio_old_statering_deorder_34k_3Dbat_connect_codewDspVpcm_Mi2WkwDspV92_V92ph4_pcmll_init_subvendor_115Dll_init_vendor0dp_vpcm_dial_connect_successll_init_kuwdp_moh_timerdual_port_rxring_order_44k_6Dbdp_byte_ax_line_ratell_init_vendorDv42bis_mode_swk56b_MP24lapm_transmit_adpdp_v92_moh_reportconst_44k_3DbwDspFax_V17WKx_disabledp_async_8bit_modedp_vpcm_fast_rate_changeio_write_dte_fifowDspCore_mmpCorell_init_tunll_init_sloveniav92_cid_msg_lendp_local_phone_detectdp_init_local_phone_timerat_andwDspCore_PsVeclapm_send_control_framefax_cd_thresholdat_v25t_reportwDsp_V8PAT2dp_bong_tone_detectedll_init_swemnp_reset_flow_timerapp_ioctl_handlerdp_ring_int_countll_init_prcll_country_enabled_1init_defaultsv44_de_statedp_DTMF_dial_cmdtimertick_functionQ14lapm_iframe_ptrat_dummyV34tapsx_elapsed_time_longlt_init_timerconst_36k_6Dbdecdigit_to_hexcharlapm_errorsindex_tabledp_vpcm_stateoutp_dVpcmMaxRatedp_download_dspLoad_DCPDCPAudioOndp_v92_diff_iniio_dte_tx_rptrdp_set_special_v92castone_detectionring_deorder_34k_6Dbmnp_rx_octet_statewDspCore_MClkTbBaseAddressconvert_dtmf_digitv42bis_DeCptrdsp_cpd_addlapm_initio_dce_rx_buffdp_long_timerUART_resetv92_precoder_x_sptrfax_mse_threshwDspm3V92_Ph301ll_init_mordpv92_rx_cidv44_en_sent_codewordv92_prefilter_v_ptrmoh_orig_flaginit_ETC_defaultsdp_vpcm_options_initmnp_next_tx_wframeio_at_esc_seq_detectedio_dce_rx_rptrv92_cid_outputll_init_egywDspm3V92_Ph43dp_download_fax_v17v92_cid_checksumOldCountryIdToCountryCodewDspM32V92_V92ph4_pcmll_load_modem_optionsdp_tone_timermoh_start_flaguSTblpack_vpcm_bitsio_get_dte_rx_countat_and_dat_output_msgll_init_lebwDspCore_mdPopdp_cleardown_cmdwDspV92_PcmSub_pcmll_init_subvendor_13E0dp_time_blacklistedwDspm3Vpcm_dPopdp_int_regreadaI2LinTablemnp_build_lr_frameRING_ORDER_TBLlapm_ui_framev44_de_last_cwll_init_germartian-full-20080625/modem/watch.gdb0000644000175000017500000000055710533130476015747 0ustar marvmarvset args --debug 3 --log m.log handle SIG35 nostop noprint handle SIG34 nostop noprint break mport_tinit run watch (void *)Mcb->io_dce_rx_rptr if Mcb->io_dce_rx_rptr < Mcb->io_dce_rx_buff continue info registers info threads backtrace printf "at 0x%x\n", $eip disass $eip-30 $eip+20 thread 1 backtrace thread 2 backtrace thread 3 backtrace print *Mcb signal SIGINT martian-full-20080625/modem/sysdep.h0000644000175000017500000000107510533130476015637 0ustar marvmarv#ifndef __MARTIAN_SYSDEP_H #define __MARTIAN_SYSDEP_H #include typedef struct _timer { timer_t id; typeof (timer_settime) *settime; } mtimer_t; long mtimer_create (clockid_t clock, struct sigevent *ev, mtimer_t *timer); #ifndef sigev_notify_thread_id # define sigev_notify_thread_id _sigev_un._tid #endif int mthread_create (void *(*run) (void *arg), void *arg); struct _mutex; typedef struct _mutex mutex_t; mutex_t *mutex_create (void ); int mutex_lock (mutex_t *m); int mutex_unlock (mutex_t *m); int mgettid (void); #endif /*__MARTIAN_SYSDEP_H */ martian-full-20080625/modem/watch3.gdb0000644000175000017500000000061010533130476016020 0ustar marvmarvset args --isr core --move-fifos --debug 3 --log m.log handle SIG35 nostop noprint handle SIG34 nostop noprint break mport_tinit run watch (void *)Mcb->io_dce_rx_rptr if Mcb->io_dce_rx_rptr < Mcb->io_dce_rx_buff continue info registers info threads backtrace printf "at 0x%x\n", $eip disass $eip-30 $eip+20 thread 1 backtrace thread 2 backtrace thread 3 backtrace print *Mcb signal SIGINT martian-full-20080625/modem/dumpers.c0000644000175000017500000000536111023420373015775 0ustar marvmarv/* dumpers.c: * * part of the martian_modem * * description: * functions to initiate/do dump different core information * * Author: A. Chentsov * Copying: LGPL */ #include #include #include #include "../martian.h" /*#define PREFIX "coredump"*/ #define PREFIX NULL #include "log.h" void ask_driver_vars (int dev_fd) { int result = ioctl (dev_fd, MARTIAN_DUMP_VARS); if (result != 0) { LOGERR ("Failed to ask device to dump\n"); } } void print_irq_state (int dev_fd) { struct martian_irq_state irqstate; int result = ioctl (dev_fd, MARTIAN_IRQ_STATE, &irqstate); if (result != 0) { LOGERR ("Failed to get device irq state\n"); return; } LOGQ (Debug, "Irq: string %s, pulses %d\n", irqstate.string, irqstate.count); LOGQ (Debug, "Irq: b: %d, n: %d, f: %d, i: %d, o: %d\n", irqstate.counts.b, irqstate.counts.n, irqstate.counts.f, irqstate.counts.i, irqstate.counts.o ); } #define DUMP_CORE(fmt, var) LOGINFO (fmt, #var, var) #define DUMP_CORE_COMMON(fmt, var) LOGINFO (fmt, #var, common->var) void print_core_vars (void ) { extern __u16 BaseAddress, BaseAddress2; extern __u16 BaseAddressIndex, BaseAddressData; extern __u8 BaseValue, dp_bamil_rd7, x_dsp_mars; extern __u8 Irq; LOGINFO ("Core vars:\n"); LOGINFO ("Variable\t\t\tValue\n"); DUMP_CORE ("%s\t\t\t0x%x\n", BaseAddress); DUMP_CORE ("%s\t\t\t0x%x\n", BaseAddress2); DUMP_CORE ("%s\t\t0x%x\n", BaseAddressIndex); DUMP_CORE ("%s\t\t\t0x%x\n", BaseValue); DUMP_CORE ("%s\t\t\t0x%x\n", BaseAddressData); DUMP_CORE ("%s\t\t\t0x%x\n", dp_bamil_rd7); DUMP_CORE ("%s\t\t\t%d\n", x_dsp_mars); DUMP_CORE ("%s\t\t\t\t%d\n", Irq); } #define DUMP_FIFO(mcb, fifo) \ LOGINFO (#fifo":\n"); \ LOGINFO ("\tbuf at 0x%x\n", mcb->io_##fifo##_buff); \ LOGINFO ("\trptr -> 0x%x\n", mcb->io_##fifo##_rptr); \ LOGINFO ("\twptr -> 0x%x\n", mcb->io_##fifo##_wptr); \ LOGINFO ("\tum = 0x%x\n", mcb->io_##fifo##_buff_um); struct martian_common mcb_dump __attribute__ ((aligned (0x1000))); void print_core_vars_common (struct martian_common *common) { LOGINFO ("Core vars (mcb at 0x%x):\n", common); LOGINFO ("Variable\t\t\tValue\n"); DUMP_CORE_COMMON ("%s\t\t\t0x%x\n", BaseAddress); DUMP_CORE_COMMON ("%s\t\t\t0x%x\n", BaseAddress2); DUMP_CORE_COMMON ("%s\t\t0x%x\n", BaseAddressIndex); DUMP_CORE_COMMON ("%s\t\t\t0x%x\n", BaseValue); DUMP_CORE_COMMON ("%s\t\t\t0x%x\n", BaseAddressData); DUMP_CORE_COMMON ("%s\t\t\t0x%x\n", dp_bamil_rd7); DUMP_CORE_COMMON ("%s\t\t\t%d\n", x_dsp_mars); DUMP_FIFO (common, dce_rx); DUMP_FIFO (common, dce_tx); DUMP_FIFO (common, pdm_rx); mcb_dump = *common; LOGINFO ("mcb dump %d bytes at 0x%x \n", sizeof mcb_dump, &mcb_dump); } void dump_common_hex (struct martian_common *mcb) { } martian-full-20080625/modem/elf386tweakrelocs.c0000644000175000017500000001463610533707655017616 0ustar marvmarv/* elf386tweakrelocs.c: * for elf386 object tweaks given by address relocation to the given symbol * * usage: * elf386tweakrelocs objfile (entry=symbol)+ * * Author: A. Chentsov * Copying: LGPL * * ToDo: RELA sections, section names to search rel entry as an argument */ #include #include #include #include #include #include #include #include // ULONG_MAX #include // mmap/munmap #include struct reloc_pair { __u32 entry; union { char *symbol; int sym_idx; }; }; int verbose; void err_usage(char *program) { fprintf (stderr, "Usage: %s [--verbose] objfile relocentry=newsymbol\n", program); } int acceptable_objectfile (void *file) { return 1; } void *mapfile (char *filename); int fixrelocs (char *file, struct reloc_pair *rpairs, int relocsnum); int main(int argc, char *argv[]) { // process args if (argc < 3) { err_usage (argv[0]); return 1; } #ifdef RELOCFIX_DEBUG verbose = 1; #else verbose = 0; #endif char *filename = NULL; struct reloc_pair *relocs; int rnum = 0; relocs = calloc (argc - 2, sizeof (struct reloc_pair)); char **next = argv + 1; do { char *eqptr = strchr (next[0], '='); if (! eqptr) { if (strcmp (*next, "--verbose") == 0) verbose = 1; else if (filename) { fprintf (stderr, "%s: pair expected\n", argv[0]); err_usage (argv[0]); return 2; } else filename = *next; } // or pair else { char *ptr; unsigned long relocentry; *eqptr = '\0'; relocentry = strtoul (next[0], &ptr, 0); if ( ptr != eqptr || relocentry == ULONG_MAX || strchr (next[0], '-') ) { *eqptr = '='; printf ("skipping bad relocentry %s\n", next[0]); continue; } *eqptr = '='; relocs[rnum].entry = relocentry; relocs[rnum].symbol = eqptr + 1; rnum++; } } while (*++next); #ifdef RELOCFIX_DEBUG printf ("%d relocations\n", rnum); for (argc = 0; argc < rnum; argc++) printf ("\t%d = %s\n", relocs[argc].entry, relocs[argc].symbol); #endif // let's proceed with substitution // open & map the object file void *file = MAP_FAILED; file = mapfile (filename); if (file == MAP_FAILED) return 3; #ifdef RELOCFIX_DEBUG printf ("%s mapped at 0x%x\n", filename, file); #endif if (! acceptable_objectfile (file)) { fprintf (stderr, "%s: file %s\n", argv[0], filename); return 4; } return fixrelocs (file, relocs, rnum); } // do the thing int fixrelocs (char *file, struct reloc_pair *rpairs, int relocsnum) { Elf32_Ehdr *elf_header = (Elf32_Ehdr *) file; int result = 0; // Ok // drop unknown symbols? // fill in indeces and filter unneeded // dup relocs struct reloc_pair *reloc_symunknown[relocsnum]; int unknown_num = relocsnum; // when pair comes to the next list the sym_idx field becames effective not symbol name struct reloc_pair *reloc_symresolved[relocsnum]; int resolved_num = 0; { int count; for (count = 0; count < relocsnum; count++) reloc_symunknown[count] = &rpairs[count]; } Elf32_Shdr *section_headers = (Elf32_Shdr *) (file + elf_header->e_shoff); Elf32_Shdr *symbols_hdr; Elf32_Sym *syms; char *strtab; char *sec_strings = file + section_headers[elf_header->e_shstrndx].sh_offset; int section; // in the manner of linux/kernel/module.h for (section = 1; section < elf_header->e_shnum; section++) if (section_headers[section].sh_type == SHT_SYMTAB) { symbols_hdr = section_headers + section; syms = (Elf32_Sym *) (file + symbols_hdr->sh_offset); strtab = file + section_headers[symbols_hdr->sh_link].sh_offset; break; } #ifdef RELOCFIX_DEBUG printf ("found symsection %s\n", sec_strings + symbols_hdr->sh_name); fflush (stdout); #endif // resolve symbol indeces int idx, number = symbols_hdr->sh_size / sizeof (Elf32_Sym); for (idx = 0; idx < number; idx++) { // looking for symbol index char *symbol = strtab + syms[idx].st_name; int u_idx; #ifdef RELOCFIX_DEBUG // printf ("processing symbol %s\n", symbol); // fflush (stdout); #endif u_idx = 0; while (u_idx < unknown_num) { if (! strcmp (symbol, reloc_symunknown[u_idx]->symbol)) { // resolve reloc_symunknown[u_idx]->sym_idx = idx; // moving to resolved reloc_symresolved[resolved_num++] = reloc_symunknown[u_idx]; // delete from unknown if (u_idx != --unknown_num) reloc_symunknown[u_idx] = reloc_symunknown[unknown_num]; #ifdef RELOCFIX_DEBUG printf ("resolved %s, ndx %d\n", symbol, idx); #endif // symbol can occur more than once // break; // from unknown reloc enum // redo continue; } u_idx++; } } #ifdef RELOCFIX_DEBUG printf ("syms done\n"); fflush (stdout); #endif // linux/arch/i386/kernel/module.c, apply_relocate function for (section = 1; section < elf_header->e_shnum; section++) { unsigned int info = section_headers[section].sh_info; if (info >= elf_header->e_shnum) continue; if ( (section_headers[section].sh_type == SHT_REL) && (section_headers[info].sh_flags & SHF_ALLOC) ) { Elf32_Rel *entry = (Elf32_Rel *) (file + section_headers[section].sh_offset); int entries_num = section_headers[section].sh_size / sizeof (Elf32_Rel); int entry_idx; if (verbose) printf ("processing relocation section %s\n", sec_strings + section_headers[section].sh_name); for (entry_idx = 0; entry_idx < entries_num; entry_idx++, entry++) { int fix_idx; for (fix_idx = 0; fix_idx < resolved_num; fix_idx++) { switch (ELF32_R_TYPE(entry->r_info)) { case R_386_32: case R_386_PC32: if (entry->r_offset == reloc_symresolved[fix_idx]->entry) { // fixing entry->r_info = ELF32_R_INFO (reloc_symresolved[fix_idx]->sym_idx, ELF32_R_TYPE (entry->r_info)); if (verbose) { printf ("\t0x%x:", entry->r_offset); printf ("\t%s\t ->", strtab + syms[ELF32_R_SYM(entry->r_info)].st_name ); printf (" %s\n", strtab + syms[ELF32_R_SYM(entry->r_info)].st_name ); } } break; // default: // wrong relocation } } } } } return result; } void *mapfile (char *filename) { int fd = open (filename, O_RDWR); if (fd < 0) { fprintf (stderr, "Bad file name %s\n", filename); return MAP_FAILED; } void *file = mmap ( NULL, lseek (fd, 0, SEEK_END), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0 ); if (file == MAP_FAILED) { perror ("mmap"); } close (fd); return file; } martian-full-20080625/modem/log.h0000644000175000017500000000437610533130476015120 0ustar marvmarv/*** Don't forget to add dependancy on log.h for the modules using it ***/ #ifndef __MARTIAN_LOG_H #define __MARTIAN_LOG_H #include #include "common.h" #define PROGPREFIX "martian" #ifndef PREFIX # define PREFIX NULL #endif /*extern int debuglevel;*/ typedef enum { Std, Syslog } logdev_t; typedef enum logtypes { Error = 0, Warning = 1, Info = 2, Debug = 3, Assertion = 4 } logtypes_t; typedef enum _debuglevels { Sequence = 1, Note = 2, Stats = 2, Timings = 2, NonCriticalSysErrors = 2, Session = 3, Event = 3, Dump = 4, Mechanism = 5 } debuglevel_t; static inline int Debugged (debuglevel_t level) { return level <= config.debuglevel; } extern int log_setup (logdev_t where); extern int log_redirect_to_file (char *file); extern void (*logmsg) (enum logtypes type, char *prefix, char *format, ...); extern void (*logdebugadd) (debuglevel_t level, char *format, ...); extern void (*logdebug) (debuglevel_t level, char *prefix, char *format, ...); extern void (*loginfo) (char *prefix, char *format, ...); extern void (*logwarn) (char *prefix, char *format, ...); extern void (*logerr) (char *prefix, char *format, ...); extern void (*logsyserror) (logtypes_t type, char *prefix, char *str); void logassertion (char *expr, char *file, int line, const char *func); /* macros for fixed prefix in a module */ /*#define DOLOG(fmt...) do_logmsg (PROGPREFIX PREFIX fmt) */ #define LOG(type, fmt...) logmsg (type, PREFIX, fmt) #define LOGQ(type, fmt...) logmsg (type, NULL, fmt) #define LOGERR(fmt...) logerr (PREFIX, fmt) #define LOGWARN(fmt...) logwarn (PREFIX, fmt) #define LOGINFO(fmt...) loginfo (PREFIX, fmt) #define LOGDEBUG(level, fmt...) logdebug (level, PREFIX, fmt) #define LOGSYSERR(type, str) logsyserror (type, PREFIX, str) #define LOGQDEBUG(level, fmt...) logdebug (level, NULL, fmt) #define ASSERT(expr, action) \ if (! (expr)) { \ logassertion (__STRING(expr), __FILE__, __LINE__, __FUNCTION__);\ action; \ } /* SPRINTF_ADJUST macro, prints safe to ptr and update ptr&size */ #define SPRINTF_ADJUST(ptr, size, fmt...) \ do { \ int written; \ written = snprintf (ptr, size, fmt); \ if (written > 0) { \ size -= written; \ ptr += written; \ } \ } while (0) #endif /*__MARTIAN_LOG_H */ martian-full-20080625/modem/core_if.c0000644000175000017500000001700711025435277015737 0ustar marvmarv/* core_if.c: * linux user mode interface for mars core * */ #include #include #include "sysdep.h" #include /* Mcb */ #include #include "common.h" #include "../martian.h" #include "watch.h" #include "core.h" #include "overriden_core.h" /* gives errors on suse 10.1 */ /* #include */ #include #include #include "log.h" extern mtimer_t vitimer; void lt_add_timer(void (*timerfunction)(unsigned long)) { const struct timespec delay = { .tv_sec = 0, .tv_nsec = 10 * 1000000 }; const struct itimerspec vi_delay = { .it_value = delay, .it_interval = {0, 0} }; int res = vitimer.settime (vitimer.id, 0, &vi_delay, NULL); if (res < 0) { LOGERR ("start timer error %d\n", res); } } void lt_add_timer_old(void (*timerfunction)(unsigned long)) { struct itimerval next_pulse; /*extern int pulse_core; pulse_core = 0;*/ /* printf ("a"); fflush (stdout); */ next_pulse.it_value.tv_sec = 0; next_pulse.it_value.tv_usec = 10000; next_pulse.it_interval.tv_sec = 0; next_pulse.it_interval.tv_usec = 0; setitimer (ITIMER_REAL, &next_pulse, NULL); } unsigned VMODEM_Get_System_Time(void) { struct timeval time; gettimeofday (&time, NULL); return time.tv_usec / 1000 + time.tv_sec * 1000; } // memory /***** IO functions *****/ /* those are not stubs * those are principle */ // low level io __u8 inp (__u16 addr) { return inb (addr); } __u16 inpw (__u16 addr) { return inw (addr); } __u32 inpd (__u16 addr) { return inl (addr); } void outp (__u16 addr, __u8 value) { outb (value, addr); } void outpw (__u16 addr, __u16 value) { outw (value, addr); } void outpd (__u16 addr, __u32 value) { return outl (value, addr); } typedef unsigned char uint8_t; extern void do_dp_modem_command (uint8_t cmd, uint8_t arg1, uint8_t arg2); int ioctl_cmd = 0; int ioctl_longcmd = 0; int ioctl_regw = 0; int ioctl_regr = 0; int ioctl_regao = 0; int ioctl_writew = 0; int ioctl_writeb = 0; void dp_modem_command_long (uint8_t cmd, uint8_t arg1, uint8_t arg2, uint8_t a3, uint8_t a4) { int res; struct _longcmd_params a = { .cmd = cmd, .a1 = arg1, .a2 = arg2, .a3 = a3, .a4 = a4 }; res = ioctl(mfd, MARTIAN_IOCTL_CMD_LONGCMD, &a); if (res != 0) LOGWARN("%x %x %x %x %x failed\n", cmd, arg1, arg2, a3, a4); ioctl_longcmd++; } void dp_modem_command (uint8_t cmd, uint8_t arg1, uint8_t arg2) { struct _command_params a = { .cmd = cmd, .a1 = arg1, .a2 = arg2 }; ioctl(mfd, MARTIAN_IOCTL_CMD_COMMAND, &a); ioctl_cmd++; } typedef unsigned short uint16_t; void dump_dspop_profile(void ) { } __u8 dp_regread_kernel(__u8 reg) { ioctl_regr++; return ioctl(mfd, MARTIAN_IOCTL_CMD_READREG, reg); } void dp_regwrite_kernel(__u8 reg, __u8 val) { struct _mstore arg = { .addr = reg, .val = val }; ioctl(mfd, MARTIAN_IOCTL_CMD_WRITEREG, &arg); ioctl_regw++; } void dp_regandor_kernel(__u8 reg, __u8 mand, __u8 mor) { struct _andor_params arg = { .reg = reg, .mask_and = mand, .mask_or = mor }; ioctl(mfd, MARTIAN_IOCTL_CMD_REGANDOR, &arg); ioctl_regao++; } __u8 dp_regread(__u8 reg) { return dp_regread_kernel(reg); } void dp_regwrite(__u8 reg, __u8 val) { dp_regwrite_kernel(reg, val); } void dp_regandor(__u8 reg, __u8 mask_and, __u8 mask_or) { dp_regandor_kernel(reg, mask_and, mask_or); } void Write_mdm_byte(uint16_t addr, uint8_t val) { struct _write_params arg = { .addr = addr, .val = val, .type = Byte }; ioctl(mfd, MARTIAN_IOCTL_CMD_WRITE, &arg); ioctl_writeb++; } void Write_mdm_word(uint16_t addr, uint16_t val) { struct _write_params arg = { .addr = addr, .val = val, .type = Word }; ioctl(mfd, MARTIAN_IOCTL_CMD_WRITE, &arg); ioctl_writew++; } #define DUMP_CORE_VAR(var) LOGINFO("\t" #var "\t= %d\n", var) void dump_core_vars2(void ) { LOGINFO("core vars:\n"); LOGINFO("\ts_x82\t= %x\n", *(__u16 *)(&S[0x82])); LOGINFO("\ts_x84\t= %x\n", *(__u16 *)(&S[0x84])); LOGINFO("\ts_x86\t= %x\n", *(__u16 *)(&S[0x86])); LOGINFO("\ts_x88\t= %x\n", *(__u16 *)(&S[0x88])); DUMP_CORE_VAR(x_dsp_mars); DUMP_CORE_VAR(x_dsp_mars3); DUMP_CORE_VAR(BaseAddress); DUMP_CORE_VAR(ComAddress); DUMP_CORE_VAR(Irq); DUMP_CORE_VAR(S[0x7e]); } int dp_dsp_rom_checksum() { return ioctl(mfd, MARTIAN_IOCTL_CMD_CSUM); } unsigned ioctl_read = 0; unsigned ioctl_write = 0; unsigned ioctl_clear = 0; unsigned ioctl_dload = 0; int read_failure = 0; uint16_t dp_read_dsp_ram (uint16_t addr) { int res; res = ioctl (mfd, MARTIAN_IOCTL_CMD_READ_DSP, addr); //dp_byte_f = Mcb->byte_f; if (res >= 0) { ioctl_read++; return res; } read_failure++; return do_dp_read_dsp_ram (addr); } #undef TEST_CORE_IF void dp_write_dsp_ram (uint16_t addr, uint16_t val) { extern void do_dp_write_dsp_ram (uint16_t addr, uint16_t val); struct _mstore opd = { .addr = addr, .val = val }; if (ioctl (mfd, MARTIAN_IOCTL_CMD_WRITE_DSP, &opd) < 0) do_dp_write_dsp_ram (addr, val); else ioctl_write++; } void dp_clear_ram (void ) { extern void do_dp_clear_ram (void ); if (ioctl (mfd, MARTIAN_IOCTL_CMD_CLEAR_DSP) < 0) do_dp_clear_ram(); else ioctl_clear++; } void dp_download_dsp (uint16_t *data, uint16_t num) { //extern uint8_t DCPAudioOn; struct _mdsp bundle = { .num = num, .data = data, .pdp_byte_f = &dp_byte_f, //.DCPAudioOn = DCPAudioOn }; if (ioctl (mfd, MARTIAN_IOCTL_CMD_DLOAD_DSP, &bundle) < 0) do_dp_download_dsp (data, num); else { ioctl_dload++; LOGDEBUG (Event, "Successfully downloaded to dsp %d words\n", num); } } void x_output_init(void ) { ioctl(mfd, MARTIAN_IOCTL_CMD_OUTINIT); do_x_output_init(); } static void DCPCheck(void) { static uint8_t DCPAudioOn_cached = 0; if (DCPAudioOn_cached != DCPAudioOn) { ioctl(mfd, MARTIAN_IOCTL_CMD_DCPAUDIO); DCPAudioOn_cached = DCPAudioOn; } } void Start_DCP(void ) { do_Start_DCP(); DCPCheck(); } void Stop_DCP(void ) { do_Stop_DCP(); DCPCheck(); } #define SHOW_IOCTL_VAR(var) LOGINFO("\t%s\t%d\n", #var, ioctl_##var) void show_ioctl_profile(void ) { LOGINFO("redefined calls\n"); SHOW_IOCTL_VAR(regr); SHOW_IOCTL_VAR(regw); SHOW_IOCTL_VAR(regao); SHOW_IOCTL_VAR(cmd); SHOW_IOCTL_VAR(longcmd); SHOW_IOCTL_VAR(read); SHOW_IOCTL_VAR(write); SHOW_IOCTL_VAR(dload); SHOW_IOCTL_VAR(writew); SHOW_IOCTL_VAR(writeb); } /**************************/ /* */ // stubs for pci routines int lt_pci_present() { return 1; } #define EMIT_PCI_FUNC_COUPLE(dim, type) \ int lt_pcibios_read_config_##dim (__u8 bus, __u8 dev_fn, __u8 where, type *val) \ { return 0; } \ int lt_pcibios_write_config_##dim (__u8 bus, __u8 dev_fn, __u8 where, type *val) \ { return 0; } EMIT_PCI_FUNC_COUPLE (byte, __u8); EMIT_PCI_FUNC_COUPLE (word, __u16); EMIT_PCI_FUNC_COUPLE (dword, __u32); void lt_init_timer (void ) { // initialize timer } unsigned char Get_PCI_INTERRUPT_LINE(void) { return PCI_INTERRUPT_LINE; } unsigned char Get_PCI_BASE_ADDRESS_1 (void) { return PCI_BASE_ADDRESS_1; } unsigned char Get_PCI_BASE_ADDRESS_2 (void) { return PCI_BASE_ADDRESS_2; } unsigned Get_PCI_BASE_ADDRESS_IO_MASK (void) { return PCI_BASE_ADDRESS_IO_MASK; } unsigned char Get_PCI_BASE_ADDRESS_SPACE_IO (void) { return PCI_BASE_ADDRESS_SPACE_IO; } /// int function_1(int (*fn)(void *), char *a) {return 0;} void lin_interruptible_sleep_on(void) {} int lin_signal_pending(void) {return 0;} void lin_kill(void) {} void lin_wake_up(void) {} int function_2(char *p) {return 0;} struct lt_pci_dev_info; int lt_pci_find_device(struct lt_pci_dev_info *lt_dev, unsigned int id, unsigned int num) { LOGERR ("Unexpected call lt_pci_find_device\n"); return 0; } martian-full-20080625/modem/coreadd.c0000644000175000017500000000054111024421502015706 0ustar marvmarv/* coreadd.c: * add hoc substitution functions */ unsigned char *rd7_isr; /* function which user mode isr dp_dsp_isr will call on entrance * It's purpose not to read the reg but the value saved by true isr instead */ unsigned char mars_read_reg_subst (unsigned char reg) { return *rd7_isr; } void mars_stub (void *arg1, void *arg2) {} martian-full-20080625/modem/mport.h0000644000175000017500000000254610533130476015475 0ustar marvmarv#ifndef __MARTIAN_MPORT_H #define __MARTIAN_MPORT_H #include "sysdep.h" #ifndef TIOCM_DTR # define TIOCM_DTR 0x002 # define TIOCM_RTS 0x004 # define TIOCM_CTS 0x020 #endif typedef struct _port mport_t; struct _port { mutex_t *lock; unsigned mctrl; unsigned carrier; void (*do_pulse) (mport_t *port); unsigned room; unsigned available; int tid; unsigned has_data : 1; unsigned ready : 1; unsigned pulse : 1; unsigned in_pulse : 1; unsigned pulsesAll; }; enum _carrier { CLost, COk }; typedef enum _port_status { PortOk = 0x10000 } port_status_t; extern port_status_t mport_init (mport_t *port); extern void mport_tinit (mport_t *port); extern void mport_dump_summary (mport_t *port); extern void mport_open (mport_t *port); extern void mport_close (mport_t *port); extern int mport_write (mport_t *port, char *buffer, int count); extern int mport_read (mport_t *port, char *buf, int bytes); extern void mport_mctrl_flipflop (mport_t *port, unsigned mask); extern void mport_mctrl_set (mport_t *port, unsigned mctrl); extern void mport_vi (mport_t *port); /* int mport_has_data (mport_t *port); int mport_ready (mport_t *port); int mport_available (mport_t *port); */ static inline int mport_lock (mport_t *port) { return mutex_lock (port->lock); } static inline int mport_unlock (mport_t *port) { return mutex_unlock (port->lock); } #endif martian-full-20080625/modem/coresubst.c0000644000175000017500000000556611024421502016332 0ustar marvmarv#include #include #include "../martian.h" #include "common.h" #include "log.h" #include #include "core.h" #include "overriden_core.h" #define CIRC_CNT(head,tail,size) (((head) - (tail)) & ((size)-1)) #define CIRC_CNT_TO_END(head,tail,size) \ ({int end = (size) - (tail); \ int n = ((head) + end) & ((size)-1); \ n < end ? n : end;}) static __inline__ void atomic_dec(atomic_t *v) { __asm__ __volatile__( LOCK "decl %0" :"=m" (v->counter) :"m" (v->counter)); } extern struct _stats { int cring, cstream, cbit3; int dual_port_tx, dual_port_rx, io_dual_port_rx; int tx, rx, pdm_rx; int dcp; } stats; struct core_stats core; unsigned char *rd7_isr; #define DECLARE_FIFO(type, fifo) \ extern type *fifo##_rptr, *fifo##_wptr; \ extern type *fifo##_sptr, *fifo##_eptr static inline void copy_dcp_block(int c, struct mcirc *circ) { int cnt_room = sizeof DCPBuffer - DCPwIndex; if (cnt_room <= c) { memcpy(&DCPBufferStart[DCPwIndex], &Mcb->dcp_buf[circ->tail], cnt_room); memcpy(DCPBufferStart, &Mcb->dcp_buf[circ->tail + cnt_room], c - cnt_room); DCPwIndex = c - cnt_room; } else { memcpy(&DCPBufferStart[DCPwIndex], &Mcb->dcp_buf[circ->tail], c); DCPwIndex += c; } circ->tail = (circ->tail + c) & (sizeof Mcb->dcp_buf - 1); } static inline void process_dcp(void) { struct mcirc *circ = &Mcb->dcp_circ; int c = CIRC_CNT_TO_END(circ->head, circ->tail, sizeof Mcb->dcp_buf); copy_dcp_block(c, circ); c = CIRC_CNT(circ->head, circ->tail, sizeof Mcb->dcp_buf); copy_dcp_block(c, circ); } static inline void post_process_ring (void ) { char dig_str[] = ""; dig_str[2] = '0' + dp_ring_int_count; logdebugadd (Event, dig_str); if (dp_ring_int_count <= 1) { x_wakeup(); io_timer = x_current_time(); } else { dp_polarity_int = 0; dp_ring_int_count = 0; dp_ring_int = 1; dp_init_local_phone_timer(); /* stub */ LOGDEBUG(Event, "ring\n"); } } int isr_defered(void ) { __u8 rd7 = *rd7_isr; if (rd7 & 0x2) post_process_ring(); if (rd7 & 0x4) process_dcp(); atomic_dec (&Mcb->UnservedIrqs); return 1; } /* hooked */ #ifndef UART_MSR_DCD #define UART_MSR_DCD 0x80 #endif #ifndef UART_MSR_DDCD #define UART_MSR_DDCD 0x01 #endif void UART_cd_on() { extern void do_UART_cd_on (void ); do_UART_cd_on(); } int core_carrier_lost; void UART_cd_off() { extern void do_UART_cd_off (void ); if (io_uart_msr & UART_MSR_DCD) core_carrier_lost = 1; do_UART_cd_off(); } void io_init_dce_rx_fifo () { DECLARE_FIFO (__u16, io_dce_rx); extern __u16 io_dce_rx_buff[]; extern struct martian_common *Mcb; io_dce_rx_sptr = io_dce_rx_rptr = io_dce_rx_wptr = io_dce_rx_buff; /*io_dce_rx_wptr = Mcb->io_dce_rx_buff;*/ /* in case that dce_rx should be always in common */ /*io_dce_rx_eptr = Mcb->io_dce_rx_buff +*/ io_dce_rx_eptr = io_dce_rx_buff + (sizeof Mcb->io_dce_rx_buff / sizeof Mcb->io_dce_rx_buff[0]); } martian-full-20080625/modem/ASWMLICENSE0000644000175000017500000001307110446366513015661 0ustar marvmarvAgere Systems WinModem End User SOFTWARE LICENSE AGREEMENT YOU SHOULD READ THE TERMS AND CONDITIONS OF THIS AGREEMENT BEFORE YOU DOWNLOAD AND USE THE AGERE SYSTEMS WINMODEM LICENSED SOFTWARE. ONCE YOU HAVE READ THIS LICENSE AGREEMENT AND AGREE TO ITS TERMS, YOU MAY DOWNLOAD AND USE THE AGERE SYSTEMS WINMODEM LICENSED SOFTWARE. DOWNLOADING OR USING THE AGERE SYSTEMS WINMODEM LICENSED SOFTWARE SHOWS YOUR ACCEPTANCE OF THE TERMS OF THIS LICENSE AGREEMENT. The terms and conditions of this Agreement will apply to the Agere Systems WinModem Software (hereafter "Software") supplied under this Agreement and any derivatives obtained therefrom, including any copy. The term Software includes programs and related documentation supplied herewith. The following file is made available under the standard Linux license, a copy of which may be found at . serial26.c These additional files are not derived from any Linux open source content, and are subject to the following restrictions. ltmarsmodem.c linuxif.h ltmdmobj.o Makefile ltinst ltuninst README 1.0 TITLE AND LICENSE GRANT 1.1 The Software is copyrighted and/or contains proprietary information protected by law. All Software and all copies thereof are and will remain the sole property of Agere Systems or its suppliers. Agere Systems hereby grants you a non-exclusive right to use the Software, in whatever form recorded, which is furnished to you under or in contemplation of this Agreement, in an Agere Systems winmodem. Any other use of the Software or removal of the Software from a country in which use is licensed shall automatically terminate this license. 1.2 You agree to use your best efforts to see that any user of the Software licensed hereunder complies with the terms and conditions of this Agreement. 2.0 SOFTWARE USE 2.1 You are permitted to make copies of the Software provided that any such copy shall contain the same copyright notice and proprietary marking included on the original Software. 2.2 You agree not to merge or combine any portion of the Software with any other software, other than the Linux operating system, unless expressly permitted by the laws of the jurisdiction where you are located. Any portion of the Software merged or combined with the other software will continue to be the subject of the terms and conditions of this Agreement and you agree to reproduce on the merged or combined portion of the Software the copyright and other proprietary rights notices included in the original Software. 2.3 Redistribution and Usage Agere permits use and limited redistribution of this Licensed Software in source and binary forms, with or without modification, subject to the following terms and conditions, in addition to the terms mentioned in this agreement. 2.3.1 Agere Systems reserves the right not to allow a third party to reuse or redistribute the software, at its sole discretion. 2.3.2 User hereby agrees not to remove or alter any copyright, trademark, credits and other proprietary notices contained within or associated with the Licensed Software, and shall include all such unaltered copyright, trademark, credits and other proprietary notices on or in every copy of the Software. 2.3.3 Notwithstanding any other provisions in this Agreement to the contrary, any modifications or alterations made to the Licensed Software shall cause any warranties and intellectual property indemnifications to become null and void and of no further effect. 3.0 DISCLAIMER OF WARRANTY 3.1 You understand and acknowledge that the Software may contain errors, bugs or other defects. The Software is provided on AS-IS basis, without warranty of any kind. 3.2 Agere Systems has used reasonable efforts to minimize defects or errors in the Software. HOWEVER, YOU ASSUME THE RISK OF ANY AND ALL DAMAGE OR LOSS FROM USE OR INABILITY TO USE THE SOFTWARE. Specifically, but not in limitation of the foregoing disclaimers, Agere Systems does not warrant that the functions of the Software will meet your requirements or that the Software operation will be error-free or uninterrupted. 3.3 Agere Systems bears no responsibility for supplying assistance for fixing or for communicating known errors to you pertaining to the Software supplied hereunder. 3.4 YOU UNDERSTAND THAT AGERE SYSTEMS, ITS AFFILIATES, CONTRACTORS, SUPPLIERS, AND AGENTS MAKE NO WARRANTIES, EXPRESS OR IMPLIED, AND SPECIFICALLY DISCLAIM ANY WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. 4.0 EXCLUSIVE REMEDIES AND LIMITATION OF LIABILITIES 4.1 Regardless of any other provisions of this Agreement, neither Agere Systems nor its affiliates, contractors, suppliers, or agents shall be liable for any indirect, incidental, or consequential damages (including lost profits) sustained or incurred in connection with the use, operation, or inability to use the Software or for damages due to causes beyond the reasonable control of Agere Systems, its affiliates, contractors, suppliers, and agents attributable to any service, products, or action of any other person. 4.2 This Agreement shall be construed in accordance with and governed by the laws of the State of New York. YOU ACKNOWLEDGE THAT YOU HAVE READ THIS AGREEMENT AND UNDERSTAND IT, AND THAT BY DOWNLOADING OR USING THE SOFTWARE, YOU AGREE TO BE BOUND BY ITS TERMS AND CONDITIONS. YOU FURTHER AGREE THAT THIS AGREEMENT IS THE COMPLETE AND EXCLUSIVE STATEMENT OF THE RIGHTS AND LIABILITIES OF THE PARTIES. THIS AGREEMENT SUPERCEDES ALL PRIOR ORAL AGREEMENTS, PROPOSALS OR UNDERSTANDINGS, AND ANY OTHER COMMUNICATIONS BETWEEN US RELATING TO THE SUBJECT MATTER OF THIS AGREEMENT. martian-full-20080625/modem/README0000644000175000017500000000165410523745017015044 0ustar marvmarvDescription. ~~~~~~~~~~~~ martian_modem is user mode part of martian software. Martian is an alternative to the ltmodem and provides Linux support for Agere WinModem hardware (DSP 164x). Targets. ~~~~~~~~ i386, x86-64. Copyright notice. ~~~~~~~~~~~~~~~~~ User mode application martian_modem contains and makes use of Agere Systems WinModem licensed Software. ltmdmobj.o is the sole property of Agere Systems (see ASWMLICENCE). All parts of martian_modem software other than ltmdmobj.o can be redistributed and used under the terms of the GNU Lesser General Public License. To remind you software is distributed without warranty of any kind. Status. ~~~~~~~ This code is alpha-software and is on its testing stage. Build & Install. ~~~~~~~~~~~~~~~~ See INSTALL file in martian root directory. Running. ~~~~~~~~ # martian_modem --help Testing. ~~~~~~~~ Use --debug switch to enable debugging. Appropriate verbosity level 3. martian-full-20080625/modem/mport.c0000644000175000017500000002316011030572346015462 0ustar marvmarv#include #include "mport.h" #include "common.h" #include #include /*** mmap */ #include /*** memcmp */ #include #include #include #include #include #include /** MIN */ #include /*** sigaction */ #include #include "sysdep.h" #include "log.h" #include "core.h" #include "watch.h" #include "../martian.h" #define MSIGVI (SIGRTMIN + 1) extern int pin_thread (void); extern int smp_setup (int irq, int dev_fd); void *serve_interrupts (void *arg); extern int setup_virtual_irq (mport_t *port); extern int link_to_driver (char *program, struct martian_common *common); extern void print_core_vars_common (struct martian_common *common); extern void ask_driver_vars (int dev_fd); extern void print_irq_state (int dev_fd); #define MSR_DDCD 0x008 #define MSR_DCD 0x080 /*** module vars ***/ int mfd; /**************************/ static void init_martian_core (struct martian_conf *mconf) { BaseAddress = mconf->BaseAddress; ComAddress = mconf->CommAddress; Irq = mconf->irq; if (mconf->flags & MARTIAN_DEV_TOSHIBA) ToshibaFlag = 1; { extern char eeprom[]; eeprom[0] = config.country_id; } lucent_init_modem(); } static int vuart_tid; // timer tick handler; call core's function static void softirq_handler (int sig_num, siginfo_t *info, void *ctx) { extern struct _actionwatch pulse_latency; mport_t *port = info->si_value.sival_ptr; if (sig_num == MSIGVI) logdebugadd (5, "t"); else if (sig_num == SIGALRM) logdebugadd (5, "a"); if (port->in_pulse) { logdebugadd (2, "e"); /* re-enter */ } if (port->pulse) logdebugadd (2, "r"); /* repeated */ if (vuart_tid != mgettid()) { /* different thread */ logdebugadd (2, "."); /* vuart_tid = gettid(); */ } port->pulsesAll++; port->pulse = 1; if (Debugged (Timings)) watch_start (&pulse_latency); } static void inline do_pulse_core (mport_t *port) { extern struct _actionwatch pulse_latency; port->pulse = 0; port->in_pulse = 1; if (Debugged (Timings)) watch_stop (&pulse_latency); mport_lock (port); timertick_function (0); mport_unlock (port); port->in_pulse = 0; } mtimer_t vitimer; /* virtual interrupt in session & we already have exlusive access */ extern void virtual_rs_interrupt (int ); static int setup_vi_timer (mport_t *port) { struct sigevent vievent; /* set up event */ memset (&vievent, 0, sizeof vievent); // ptyevent.sigev_value.sival_int = pty; vievent.sigev_signo = MSIGVI; /* works with syscalls but fails with glibc implementation */ vievent.sigev_notify = SIGEV_THREAD_ID; vievent.sigev_notify_thread_id = mgettid(); vievent.sigev_value.sival_ptr = port; int res = mtimer_create (CLOCK_REALTIME, &vievent, &vitimer); if (res >= 0) { LOGDEBUG (2, "set timer for thread\n"); return 0; } LOGWARN ("setting timer 0x%x by thread %d failed\n", vitimer.id, mgettid()); LOGSYSERR (Debug, "timer"); /*** second try ***/ memset (&vievent, 0, sizeof vievent); vievent.sigev_signo = MSIGVI; vievent.sigev_notify = SIGEV_SIGNAL; /***/ res = mtimer_create (CLOCK_REALTIME, &vievent, &vitimer); if (res < 0) { LOGERR ("cannot setup timer 0x%x, won't work\n", vitimer.id); return res; } LOGDEBUG (2, "virtirq: set timer\n"); return 0; } void (*lt_rs_interrupt) (int ); int setup_virtual_irq (mport_t *port) { struct sigaction timer_action; if (setup_vi_timer (port) != 0) return -1; //timer_action.sa_handler = softirq_handler; timer_action.sa_sigaction = softirq_handler; timer_action.sa_flags = SA_SIGINFO; sigemptyset (&timer_action.sa_mask); sigaction (SIGALRM, & timer_action, NULL); sigaction (MSIGVI, & timer_action, NULL); vuart_tid = mgettid(); lt_rs_interrupt = virtual_rs_interrupt; LOGDEBUG (2, "virtirq: set handler\n"); return 0; } static inline int mport_has_data (mport_t *port) { return port->available > 0; } static inline int mport_ready (void ) { return io_app_tx_count <= 0x7be; } static inline int mport_available (void ) { return UART_CommReadCount(); } static size_t page_align(size_t size) { size_t npagemask = sysconf(_SC_PAGESIZE) - 1; return (size + npagemask) & ~npagemask; } /*** port interface ***/ port_status_t mport_init (mport_t *port) { port->lock = mutex_create(); if (! port->lock) { LOGERR ("Cannot create mutex\n"); return 5; } port->mctrl = 0; port->carrier = COk; if (system ("grep -q '/proc ' /proc/mounts 2> /dev/null") != 0) { LOGERR ("procfs on /proc is not found\n"); return 1; } char *device_path = "/proc/driver/mars/0"; // dev_name int dev_fd = open (device_path, O_RDWR); if (dev_fd < 0) { LOGSYSERR (Error, "open"); if (errno == EACCES) return 1; else if (errno == EBUSY) { /* for multiple device this should iterate next */ LOGINFO ("martian is already running.\n"); return 0; } else if (errno == ENOENT) { /* check driver loaded */ if (system ("grep -q '^martian_dev' /proc/modules 2> /dev/null") != 0) { LOGINFO ("kernel part is not loaded i.e.\n"); LOGINFO ("\tmodprobe martian_dev\n"); } else { LOGINFO ("Mars DSP164x device is not detected\n"); } } return 1; } mfd = dev_fd; // get parameters struct martian_conf mconf; int result = ioctl (dev_fd, MARTIAN_CONF_GET, &mconf); if (result != 0) { LOGERR ("Failed to get device information.. quitting\n"); return 1; } smp_setup (mconf.irq, dev_fd); if (Debugged (Note)) { result = ioctl (dev_fd, MARTIAN_KDEBUG); if (result != 0) LOGWARN ("Failed to enable debug in kernel module\n"); } /* mmap common block */ struct martian_common *common; common = (void *) mmap ( NULL, page_align(sizeof *common), PROT_WRITE | PROT_READ, MAP_SHARED, dev_fd, 0x0 ); if (common == MAP_FAILED) { LOGSYSERR (Error, "mmap"); LOGERR ("Failed to map device common data block\n"); /* flee */ return 2; } /*** check signature ***/ result = memcmp ( common->signature, MARTIAN_SIGNATURE, sizeof MARTIAN_SIGNATURE - 1 // MIN (sizeof MARTIAN_SIGNATURE, sizeof (struct martian_common)) ); if (result != 0) { LOGERR ("Common area unrecognized\n"); return 3; } result = memcmp ( common->tsignature, MARTIAN_TSIGNATURE, sizeof MARTIAN_TSIGNATURE - 1 ); if (result != 0) { LOGERR ("Common area unrecognized, no terminating signature\n"); return 3; } LOGDEBUG (Note, "Kernel module stamp `%s'\n", common->kstamp); /*** find the slot ***/ //common += (mconf.index + 1); result = link_to_driver ("/proc/self/exe", common); /* not argv[0] */ if (! result) { LOGERR ("Failed to link to driver\n"); return 3; } Mcb = common; /* core statistics in coresubst */ memset (&core, 0, sizeof core); /*** pass to the core and initialize it ***/ init_martian_core (&mconf); #ifdef MARTIAN_CORE_DEBUG print_core_vars_common (common); print_core_vars(); #endif // print_irq_state (dev_fd); Mcb->write_check = 'm'; LOGDEBUG (Note, "Notifying kernel READY\n"); if (ioctl (dev_fd, MARTIAN_MODEM_READY) != 0) { LOGERR("common area failure\n"); return 4; } /*** start isr thread ***/ /*launch_isr_thread (dev_fd);*/ if (mthread_create (serve_interrupts, (void *) dev_fd) == -1) { LOGERR ("Cannot create isr thread\n"); } else LOGDEBUG (Note, "isr thread launched\n"); port->do_pulse = do_pulse_core; return PortOk; } void mport_tinit (mport_t *port) { port->tid = mgettid(); pin_thread(); /* if (config.realtime) realtime_setup();*/ /* setup timer and handler */ setup_virtual_irq (port); } void mport_dump_summary (mport_t *port) { /* interrupts */ print_irq_state (mfd); if (Mcb->RepeatedIrqs) LOGQ (Debug, "Irq: %d repeated\n", Mcb->RepeatedIrqs); if (Mcb->OverlappedIrqs) LOGQ (Debug, "Irq: %d overlapped\n", Mcb->OverlappedIrqs); } void mport_mctrl_set (mport_t *port, unsigned mctrl) { mport_mctrl_flipflop (port, mctrl ^ port->mctrl); } void mport_mctrl_flipflop (mport_t *port, unsigned mctrl) { port->mctrl ^= mctrl; mport_lock (port); if (mctrl & TIOCM_DTR) { if (port->mctrl & TIOCM_DTR) { UART_dtr_on(); LOGDEBUG (Event, "dtr on\n"); } else { UART_dtr_off(); LOGDEBUG (Event, "dtr off\n"); } } if (mctrl & TIOCM_RTS) { if (port->mctrl & TIOCM_RTS) { UART_rts_on(); LOGDEBUG (Event, "rts on\n"); } else { UART_rts_off(); LOGDEBUG (Event, "rts off\n"); } } if (mctrl & TIOCM_CTS) { if (port->mctrl & TIOCM_CTS) UART_cts_on(); else UART_cts_off(); } mport_unlock (port); } int mport_write (mport_t *port, char *buff, int count) { int written = V16550_Write_THR_buffer (buff, count); port->ready = mport_ready(); return written; } int mport_read (mport_t *port, char *buf, int bytes) { V16550_Read_RBR_buffer (buf, bytes); port->available -= bytes; ASSERT (port->available == UART_CommReadCount(), ); port->has_data = mport_has_data (port); return bytes; } /*** virtual interrupt ***/ void mport_vi (mport_t *port) { port->available = UART_CommReadCount(); port->has_data = mport_has_data (port); port->ready = mport_ready(); /* check carrier */ if ((io_uart_msr & MSR_DDCD) && !(io_uart_msr & MSR_DCD)) { port->carrier = CLost; io_uart_msr &= ~MSR_DDCD; } } void mport_open (mport_t *port) { port->carrier = COk; port->mctrl = 0; port->ready = 0; port->has_data = 0; port->room = 64; port->available = 0; port->pulsesAll = 0; ASSERT (! port->pulse, port->pulse = 0); vxdPortOpen(); UART_dtr_on(); UART_rts_on(); port->mctrl = TIOCM_DTR | TIOCM_RTS; } void mport_close (mport_t *port) { /* clearing core fifos should be added */ /* flush */ port->carrier = COk; port->mctrl = 0; vxdPortClose(); port->pulse = 0; /*UART_dtr_on(); UART_rts_on();*/ } martian-full-20080625/modem/isr.c0000644000175000017500000000660111024421502015105 0ustar marvmarv/* isr.c: * Does device servicing work while irq was cleared * implemented as a thread polling the low level driver node representing device * it's ll driver's responsibility to disable the device interrupts * before program serve it. * Author(s): * A. Chentsov * evolution: * 11/23/05 first release to work * 11/09/05 creation */ #include #include #include #include #include #include #include #include "../martian.h" #include "sysdep.h" #define PREFIX "isr" #include "log.h" int isr_tid; struct _stats { int cring, cstream, cbit3; int dual_port_tx, dual_port_rx, io_dual_port_rx; int tx, rx, pdm_rx; int dcp; } stats; static __inline__ void atomic_dec(atomic_t *v) { __asm__ __volatile__( LOCK "decl %0" :"=m" (v->counter) :"m" (v->counter)); } static __inline__ void atomic_set (atomic_t *v, int i) { v->counter = i; } extern struct martian_common *Mcb; extern int isr_defered(void ); extern void pin_thread (void); void *serve_interrupts (void *arg) { extern unsigned char *rd7_isr; int devfd = (int ) arg; isr_tid = mgettid(); LOGDEBUG (2, "thread started (tid = %d)\n", isr_tid); { struct sched_param p; p.sched_priority = sched_get_priority_max (SCHED_FIFO); sched_setscheduler (0, SCHED_FIFO, &p); sched_getparam (0, &p); LOGDEBUG (2, "scheduler: policy %d, priority %d\n", sched_getscheduler (0), p.sched_priority); } stats.cring = stats.cstream = stats.cbit3 = 0; stats.dual_port_tx = stats.dual_port_rx = 0; stats.dcp = 0; /* smp, pin isr thread to cpu */ pin_thread(); // polling loop while (1) { int irqs[2], size; /*** number of interrupts to be returned */ size = read (devfd, irqs, sizeof irqs); if (size == -1) { /* read might be interrupted by timer */ if (errno == EINTR) continue; LOGSYSERR (Error, "dev read"); LOGERR ("quitting"); return NULL; } else if (size != sizeof (int) && size != sizeof irqs) { /* report wierd thing happened :*/ LOGWARN ("unexpected dev read size %d\n", size); continue; } ASSERT((*rd7_isr & ~6) == 0, *rd7_isr &= 6); if (*rd7_isr & 2) stats.cring++; if (*rd7_isr & 4) stats.cstream++; if (*rd7_isr & 8) stats.cbit3++; if (irqs[0] & 0x1000) { LOGDEBUG (Note, "read: %db of %x %x\n", size, irqs[0], irqs[1]); LOGERR ("fifo fault in kmodule is detected\n"); atomic_dec (&Mcb->UnservedIrqs); atomic_set (&Mcb->UnservedIrqs, 0); /* exit graciously letting debugger intrude */ kill (getpid(), SIGINT); } isr_defered(); logdebugadd (5, "i"); } return NULL; } void dump_isr (void) { LOGQ (Debug, "interrupts: ring=%d, stream=%d (dcp=%d, trx=%d), bit3=%d\n", stats.cring, stats.cstream, stats.dcp, stats.tx+stats.rx, stats.cbit3); LOGQ (Debug, "calls: tx: %d, rx: %d, pdm; bytes: tx: %d, rx: %d, pdm: %d\n", stats.dual_port_tx, stats.dual_port_rx, stats.io_dual_port_rx, stats.tx, stats.rx, stats.pdm_rx); LOGQ (Debug, "mcb: calls: tx: %d, rx: %d, pdm: %d;" "bytes: tx: %d, rx: %d, pdm: %d\n", Mcb->dual_port_tx, Mcb->dual_port_rx, Mcb->io_dual_port_rx, Mcb->tx, Mcb->rx, Mcb->pdm_rx); LOGQ (Debug, "overrun: dce = %d, pdm = %d; " "incorrespondence: tx = %d, rx = %d, pdm = %d\n", Mcb->rx_overrun, Mcb->pdm_rx_overrun, Mcb->tx_incorrespondence, Mcb->rx_incorrespondence, Mcb->pdm_rx_incorrespondence); } martian-full-20080625/modem/core.h0000644000175000017500000000347511025434573015270 0ustar marvmarv/***** core's symbols *****/ #include extern uint8_t x_dsp_mars; extern uint8_t x_dsp_mars3; extern uint8_t Irq; extern uint8_t dp_bamil_rd7; extern uint16_t BaseAddress; extern uint16_t ComAddress; extern uint16_t BaseAddressIndex; extern uint8_t BaseValue; extern uint8_t ToshibaFlag; extern uint8_t dp_sleep; extern uint8_t dp_ring_int, dp_ring_int_count, dp_polarity_int; extern uint8_t dp_dsp_data_in_progress; extern uint8_t dp_byte_c, dp_byte_d, dp_byte_e, dp_byte_f; extern uint8_t DCPBuffer[0x4b00], *DCPBufferStart; extern uint8_t DCPAudioOn; extern uint8_t S[]; extern uint16_t V34Mode; extern uint32_t DCPwIndex; extern uint16_t io_timer; extern uint16_t x_status[]; extern char *sRate[]; extern void x_wakeup (void); extern uint16_t x_current_time(); extern void dp_init_local_phone_timer (void); extern int dual_port_rx (void); extern void dual_port_tx (void); extern int io_dual_port_rx (void); extern uint8_t dp_regread_nonint (uint8_t reg); extern void dp_regwrite_nonint (uint8_t reg, uint8_t value); extern void InitVariables (void); extern void lucent_init_modem (void); extern void ll_set_pci_id (unsigned, unsigned, unsigned, unsigned); extern void vxdPortOpen (void); extern void vxdPortClose (void); extern void timertick_function (int num); extern short UART_CommReadCount (void); extern void V16550_Read_RBR_buffer (char *buf, unsigned bytes); extern short V16550_Write_THR_buffer (char *buf, unsigned received); extern short UART_CommReadCount (void); extern uint16_t io_uart_msr; extern uint16_t io_uart_status; extern uint16_t io_app_tx_count; //extern short UART_CommReadCount (void); extern void UART_dtr_on (void ); extern void UART_dtr_off (void ); extern void UART_rts_on (void ); extern void UART_rts_off (void ); extern void UART_cts_on (void ); extern void UART_cts_off (void ); martian-full-20080625/modem/watch2.gdb0000644000175000017500000000142010533130476016017 0ustar marvmarvset args --isr core --debug 3 --log m.log handle SIG35 nostop noprint handle SIG34 nostop noprint break mport_tinit run #p io_dce_rx_rptr #p io_dce_rx_buff #p &io_dce_rx_rptr p (unsigned short []) io_dce_rx_buff #set io_dce_rx_rptr=&io_dce_rx_buff p io_dce_rx_rptr watch (unsigned short *) io_dce_rx_rptr if (unsigned short *) io_dce_rx_rptr < (unsigned short []) io_dce_rx_buff #watch io_dce_rx_rptr if io_dce_rx_rptr < &io_dce_rx_buff #watch *&io_dce_rx_rptr if *&io_dce_rx_rptr < io_dce_rx_buff continue info registers info threads backtrace printf "at 0x%x\n", $eip disass $eip-30 $eip+20 thread 1 backtrace thread 2 backtrace thread 3 backtrace print *Mcb p (void *) io_dce_rx_rptr p (void *) io_dce_rx_wptr p (void *) io_dce_rx_sptr p (void *) io_dce_rx_eptr signal SIGINT martian-full-20080625/modem/tweakrelocsdynamic.c0000644000175000017500000002136611030572346020217 0ustar marvmarv/* tweakrelocsdynamic.c: * support code to relocate symbols dynamically to needed place. * Mainly for symbols in binary files which location found run-time * * Author: A. Chentsov * Copying: LGPL * * Exports: * initialize_map (char *prog), * relocate_symbol (char *name, void *newval); * * ToDo: * add support for RELA sections */ #include #include #include #include #include #include #include #define PREFIX "dynreloc" #include "log.h" static Elf32_Ehdr *image_header; static Elf32_Shdr *section_headers; static Elf32_Shdr *symbols_hdr; static Elf32_Sym *syms; static char *strtab; static char *sec_strings; #ifdef DYNAMICRELOC_DEBUG # define DEBUG_DRELOCS(args...) LOGDEBUG (2,args) #else # define DEBUG_DRELOCS(args...) do {} while (0) #endif struct symbol { char *name; int idx; }; static void *mapimage (char *filename) { int fd = open (filename, O_RDONLY); if (fd < 0) { LOGERR ("Bad file name %s\n", filename); return MAP_FAILED; } void *file = mmap ( NULL, lseek (fd, 0, SEEK_END), PROT_READ, MAP_SHARED, fd, 0 ); if (file == MAP_FAILED) { LOGSYSERR (Error, "mmap"); } close (fd); return file; } /* image initialiazation * takes program name, returns 1 if successful and 0 otherwise */ int initialize_map (char *image) { // map image_header = (Elf32_Ehdr *) mapimage (image); if (image_header == MAP_FAILED) return 0; section_headers = (Elf32_Shdr *) ( (char *) image_header + image_header->e_shoff ); sec_strings = (char *) image_header + section_headers[image_header->e_shstrndx].sh_offset; // we need symbol table to go int section; for (symbols_hdr = NULL, section = 1; section < image_header->e_shnum; section++) if (section_headers[section].sh_type == SHT_SYMTAB) { symbols_hdr = section_headers + section; break; } if (! symbols_hdr) { LOGERR ("%s: no symbols\n", image); return 0; } // symbols' shortcuts syms = (Elf32_Sym *) ((char *) image_header + symbols_hdr->sh_offset); strtab = (char *) image_header + section_headers[symbols_hdr->sh_link].sh_offset; // are there any relocs for (section = 1; section < image_header->e_shnum; section++) { unsigned int info = section_headers[section].sh_info; if (info >= image_header->e_shnum) continue; if (section_headers[section].sh_type == SHT_REL) break; } if (section == image_header->e_shnum) { LOGWARN ("Nothing to relocate\n"); return 0; } return 1; } static int symbol_to_idx (char *unknown_symbol) { // iterate symbols int idx, number = symbols_hdr->sh_size / sizeof (Elf32_Sym); for (idx = 0; idx < number; idx++) { // looking for symbol index char *symbol = strtab + syms[idx].st_name; DEBUG_DRELOCS ("processing symbol %s\n", symbol); if (! strcmp (symbol, unknown_symbol)) { // resolved DEBUG_DRELOCS ("resolved %s, ndx %d\n", symbol, idx); return idx; } } return -1; } /* to fill indeces for a number of symbols in a single pass * number of symbols to be returned * * not used currently, each symbol to have a pass */ void fill_idx_symbols (struct symbol *unknown_symbols, int unknown_num) { // iterate symbols int idx, number = symbols_hdr->sh_size / sizeof (Elf32_Sym); for (idx = 0; idx < number; idx++) { // looking for symbol index char *symbol = strtab + syms[idx].st_name; int u_idx; DEBUG_DRELOCS ("processing symbol %s\n", symbol); for (u_idx = 0; u_idx < unknown_num; u_idx++) if (! strcmp (symbol, unknown_symbols[u_idx].name)) { // resolved unknown_symbols[u_idx].idx = idx; DEBUG_DRELOCS ("resolved %s, ndx %d\n", symbol, idx); break; // from unknown reloc enum } } } void tweak_areloc (Elf32_Rel *entry, Elf32_Sym *sym, Elf32_Addr val) { Elf32_Addr oldval = * (Elf32_Addr *) (entry)->r_offset; int set_new = 0; if (oldval == sym->st_value) { * (Elf32_Addr *) entry->r_offset = val; return; } if (oldval == sym->st_value + sym->st_size) { DEBUG_DRELOCS ("On the +border offset %d for sym %s\n", oldval - sym->st_value, strtab + sym->st_name); set_new = 1; } else if (oldval + 1 == sym->st_value) { DEBUG_DRELOCS ("On the -border offset at %x for sym %s\n", entry->r_offset, strtab + sym->st_name); set_new = 1; } else if (oldval < sym->st_value) { LOGWARN ("Bad reloc at 0x%x: negative offset %d original value 0x%x for sym %s. " "Not setting.\n", entry->r_offset, oldval - sym->st_value, oldval, strtab + sym->st_name); } else if (oldval > sym->st_value + sym->st_size) { int overflow = oldval - sym->st_value - sym->st_size; LOGWARN ("Bad reloc at 0x%x: " "beyond range +%d original value 0x%x for sym %s.\n", entry->r_offset, overflow, oldval, strtab + sym->st_value); if (overflow <= 3 * sym->st_size || overflow <= 0x1000) set_new = 1; else LOGWARN ("Not setting\n"); } else { DEBUG_DRELOCS ("Offset %d for sym %s\n", oldval - sym->st_value, strtab + sym->st_name); set_new = 1; } if (set_new) * (Elf32_Addr *) entry->r_offset = val + (oldval - sym->st_value); } inline void tweak_relocs_in_section (unsigned section, unsigned sym_idx, Elf32_Addr newval) { Elf32_Rel *entry = (Elf32_Rel *) ( (char *) image_header + section_headers[section].sh_offset ); int entries_num = section_headers[section].sh_size / sizeof (Elf32_Rel); size_t pagesize = sysconf(_SC_PAGESIZE); size_t pagemask = ~(pagesize - 1); int entry_idx; DEBUG_DRELOCS ("processing relocation section %s (%d entries)\n", sec_strings + section_headers[section].sh_name, entries_num); for (entry_idx = 0; entry_idx < entries_num; entry_idx++, entry++) { switch (ELF32_R_TYPE(entry->r_info)) { case R_386_32: // case R_386_PC32: if (ELF32_R_SYM(entry->r_info) == sym_idx) { // entry->r_offset == reloc_symresolved[fix_idx]->entry) { int wa_length = ( (pagemask & (entry->r_offset + 3)) > entry->r_offset ) ? 2 * pagesize : pagesize; DEBUG_DRELOCS ("\tfound entry 0x%x\n", entry->r_offset); DEBUG_DRELOCS ("\tsanity check symbol %s\n", strtab + syms[ELF32_R_SYM(entry->r_info)].st_name ); int res = mprotect ( (void *) (pagemask & entry->r_offset), wa_length, PROT_READ | PROT_WRITE | PROT_EXEC ); if (res != 0) { LOGSYSERR (Debug, "mprotect"); DEBUG_DRELOCS ("mprotect: code %d\n", res); } else tweak_areloc (entry, &syms[sym_idx], newval); res = mprotect ( (void *) (pagemask & entry->r_offset), wa_length, PROT_READ | PROT_EXEC ); // tweak in the position where relocation is DEBUG_DRELOCS ("\ttweaked to 0x%x\n", newval ); } continue; // default: // wrong relocation } } } // tweak relocations for symbol with given idx to newval static void tweak_relocs (int sym_idx, Elf32_Addr newval) { int section; // multiple relocation sections for (section = 1; section < image_header->e_shnum; section++) { unsigned int info = section_headers[section].sh_info; if (info >= image_header->e_shnum) continue; if (section_headers[section].sh_type == SHT_RELA) DEBUG_DRELOCS ("rela section\n"); if ( (section_headers[section].sh_type == SHT_REL) && (section_headers[info].sh_flags & SHF_ALLOC) ) tweak_relocs_in_section (section, sym_idx, newval); } } void relocate_symbol (char *symbol, void *newval) { // find symbol idx int idx = symbol_to_idx (symbol); if (idx == -1) return; DEBUG_DRELOCS ("got sym %s idx %d\n", symbol, idx); tweak_relocs (idx, (Elf32_Addr ) newval); } void dump_range (void *addr, int num) { char *ptr = addr; addr = (char *) addr + num; for (ptr = (char *) addr; ptr < (char *) addr; ptr++) putchar (*ptr); } void *locate_map_using_proc (char *progname) { char cmd[256]; FILE *p; Elf32_Addr addr; // sprintf (cmd, "grep %s /proc/%d/maps skip=%d count=1", getpid(), 0x1000, 0x8048); sprintf (cmd, "printf 0x; grep %s /proc/%d/maps | grep '^[0-9a-f-]* rw'", progname, getpid()); // printf ("cmd: %s\n", cmd); p = popen (cmd, "r"); fscanf (p, "%x", & addr); fclose (p); // printf ("addr: 0x%x\n", addr); return (void *) addr; } #ifdef DYNAMICRELOCS_SELFCONTAINED extern void reloc_call(); extern int reloc_val; int reloc_val_subst = 4; main (int argc, char *argv[]) { getchar (); if (! initialize_map (argv[0])) return 1; printf ("Original reloc_val: %d, subst: %d\n", reloc_val, reloc_val_subst); printf ("changing sym to 0x%x\n", & reloc_val_subst); change_module_symbol ("reloc_val", (Elf32_Addr) &reloc_val_subst); printf ("now reloc_val: %d, subst: %d\n", reloc_val, reloc_val_subst); reloc_call(); int s = reloc_val; printf ("reloc_val: %d\n", reloc_val); printf ("reloc_val_subst: %d\n", reloc_val_subst); printf ("& reloc_val: 0x%x, & subst: 0x%x\n", & reloc_val, & reloc_val_subst); } #endif // DYNAMICRELOCS_SELFCONTAINED martian-full-20080625/modem/log.c0000644000175000017500000002037210533707655015116 0ustar marvmarv#include #include #include #include #include "log.h" #include "common.h" /*** debuglevel */ #include #include /*** close, dup2 */ #include /*** open for log */ #include static char *typenames[] = { "error", "warning", "info", "D2", /* default level for debugged syserror */ "assertion" }; static int log_volatile; void (*logmsg) (logtypes_t type, char *prefix, char *format, ...); void (*logdebugadd) (debuglevel_t level, char *format, ...); void (*logdebug) (debuglevel_t level, char *prefix, char *format, ...); void (*loginfo) (char *prefix, char *format, ...); void (*logwarn) (char *prefix, char *format, ...); void (*logerr) (char *prefix, char *format, ...); void (*logsyserror) (logtypes_t type, char *prefix, char *str); static void do_logmsg_std (logtypes_t type, int level, char *prefix, char *format, va_list fargs) { FILE *fp; switch (type) { case Error: case Warning: case Assertion: fp = stderr; break; case Info: case Debug: default: fp = stdout; break; } if (log_volatile) { fputc ('}', fp); fputc ('\n', fp); } //fprintf (fp, PROGPREFIX ": "); fprintf (fp, PROGPREFIX); /* time stamp */ if (type == Debug && level >= Session) { struct timespec t; static long prev_sec = -1, prev_msec = 0; static int rep = 0; long sec, msec; clock_gettime (CLOCK_REALTIME, &t); sec = t.tv_sec % 1000; msec = t.tv_nsec / 1000000; if (t.tv_nsec >= msec * 1000000 + 500000) msec++; if (sec == prev_sec && msec == prev_msec && rep < 5) { fprintf (fp, " %% --- "); rep++; } else { prev_sec = sec; prev_msec = msec; rep = 0; fprintf (fp, " %% %02ld.%03ld", t.tv_sec % 60, msec); } } fprintf (fp, ": "); switch (type) { case Debug: if (level > 0) fprintf (fp, "D%d: ", level); else fprintf (fp, "D: "); break; case Error: case Warning: case Assertion: case Info: fprintf (fp, "%s: ", typenames[type]); } if (prefix) fprintf (fp, "%s: ", prefix); vfprintf (fp, format, fargs); log_volatile = 0; } void logdebugadd_std (debuglevel_t level, char *format, ...) { va_list fargs; if (level > config.debuglevel) return; if (level >= Event && ! log_volatile) putchar ('{'); va_start (fargs, format); vprintf (format, fargs); if (level >= Event) log_volatile = 1; } void logdebug_std (debuglevel_t level, char *prefix, char *format, ...) { va_list fargs; if (! Debugged(level)) return; va_start (fargs, format); do_logmsg_std (Debug, level, prefix, format, fargs); } void loginfo_std (char *prefix, char *format, ...) { va_list fargs; va_start (fargs, format); do_logmsg_std (Info, 0, prefix, format, fargs); } void logwarn_std (char *prefix, char *format, ...) { va_list fargs; va_start (fargs, format); do_logmsg_std (Warning, 0, prefix, format, fargs); } void logerr_std (char *prefix, char *format, ...) { va_list fargs; va_start (fargs, format); do_logmsg_std (Error, 0, prefix, format, fargs); } static void logsyserror_std (logtypes_t type, char *prefix, char *str) { FILE *fp; switch (type) { case Error: case Warning: case Assertion: fp = stderr; break; case Debug: /* don't forget this if change case to table */ if (! Debugged (NonCriticalSysErrors)) return; case Info: default: fp = stdout; break; } fprintf (fp, PROGPREFIX ": %s: ", typenames[type]); if (prefix) fprintf (fp, "%s: ", prefix); if (str) fprintf (fp, "%s: ", str); fprintf (fp, "%s\n", strerror (errno)); } extern void logmsg_std (logtypes_t type, char *prefix, char *format, ...) { va_list fargs; va_start (fargs, format); do_logmsg_std (type, -1, prefix, format, fargs); } /* void logwarn_std (char *prefix, char *format, ...) { va_list fargs; int size; va_start (fargs, format); size = 2 + sizeof PROGPREFIX + strlen(format) + sizeof "warning: " + strlen (prefix) + 2 + 1; fmt = malloc (size); if (fmt == 0) return; snprintf (fmt, size, PROGPREFIX ": warning: %s: %s", prefix, format); vfprintf (stderr, fmt, fargs); free (fmt); } */ static void do_logmsg_syslog (logtypes_t type, int level, char *prefix, char *format, va_list fargs) { unsigned priority; switch (type) { case Error: priority = LOG_ERR; break; case Warning: case Assertion: priority = LOG_WARNING; break; case Info: priority = LOG_INFO; break; case Debug: priority = LOG_DEBUG; break; default: /* wrong log type */ break; } int size; char *fmt, *ptr; size = 0; if (type == Debug) size += (sizeof "Dn: " - 1); else if (type >= 0) size += (strlen(typenames[type]) + sizeof ": " - 1); size += (prefix ? strlen(prefix) + sizeof ": " - 1 : 0); size += (sizeof ": " - 1 + strlen (format)); size += (sizeof ""); fmt = malloc (size); if (fmt == 0) return; ptr = fmt; if (type == Debug) { if (level >= 0) SPRINTF_ADJUST (ptr, size, "D%d: ", level); else SPRINTF_ADJUST (ptr, size, "Dn: "); } else if (type >= 0) SPRINTF_ADJUST (ptr, size, "%s: ", typenames[type]); if (prefix) SPRINTF_ADJUST (ptr, size, "%s: ", prefix); SPRINTF_ADJUST (ptr, size, "%s", format); vsyslog (priority, fmt, fargs); } static void logdebugadd_syslog (debuglevel_t level, char *format, ...) { va_list fargs; if (level > config.debuglevel) return; va_start (fargs, format); vprintf (format, fargs); if (level >= Event) log_volatile = 1; } static void logdebug_syslog (debuglevel_t level, char *prefix, char *format, ...) { va_list fargs; if (level > config.debuglevel) return; va_start (fargs, format); do_logmsg_syslog (Debug, level, prefix, format, fargs); } static void loginfo_syslog (char *prefix, char *format, ...) { va_list fargs; va_start (fargs, format); do_logmsg_syslog (Info, 0, prefix, format, fargs); } static void logwarn_syslog (char *prefix, char *format, ...) { va_list fargs; va_start (fargs, format); do_logmsg_syslog (Warning, 0, prefix, format, fargs); } static void logerr_syslog (char *prefix, char *format, ...) { va_list fargs; va_start (fargs, format); do_logmsg_syslog (Error, 0, prefix, format, fargs); } static void logsyserror_syslog (logtypes_t type, char *prefix, char *str) { unsigned priority; switch (type) { case Error: priority = LOG_ERR; break; case Warning: case Assertion: priority = LOG_WARNING; break; case Info: priority = LOG_INFO; break; case Debug: /* don't forget this if change case to table */ if (! Debugged (NonCriticalSysErrors)) return; priority = LOG_DEBUG; break; default: /* wrong log type */ break; } syslog (priority, "%s: %s%s%s%s%m", typenames[type], prefix ? prefix : "", prefix ? ": " : "", str ? str : "", str ? ": " : "" ); } static void logmsg_syslog (logtypes_t type, char *prefix, char *format, ...) { va_list fargs; va_start (fargs, format); do_logmsg_syslog (type, -1, prefix, format, fargs); } void logassertion (char *expr, char *file, int line, const char *func) { logmsg (Assertion, NULL, "\"%s\" in function %s(), file <%s>, line %d\n", expr, func, file, line); } int log_setup (logdev_t where) { log_volatile = 0; switch (where) { case Std: logmsg = logmsg_std; logerr = logerr_std; logwarn = logwarn_std; loginfo = loginfo_std; logdebug = logdebug_std; logdebugadd = logdebugadd_std; logsyserror = logsyserror_std; break; case Syslog: openlog (PROGPREFIX, 0, LOG_DAEMON); logmsg = logmsg_syslog; logerr = logerr_syslog; logwarn = logwarn_syslog; loginfo = loginfo_syslog; logdebug = logdebug_syslog; logdebugadd = logdebugadd_syslog; logsyserror = logsyserror_syslog; break; } return 1; } /* duping stdout/err to file */ int log_redirect_to_file (char *file) { int fd = open (file, O_WRONLY | O_APPEND | O_CREAT, 0640); if (fd == -1) { LOGSYSERR (Debug, "log_redirect: open"); return -2; } close (1); close (2); if (dup2 (fd, 1) != -1) { if (dup2 (fd, 2) == -1) close (1); else { close (fd); LOGDEBUG (2, "log to file %s\n", file); /* success */ return 0; } } /* failure to dup */ close (fd); /* try to restore link to tty */ int tty = open ("/dev/tty", O_WRONLY); if (tty != -1) { if (tty != 1) dup2 (tty, 1); if (tty != 2) dup2 (tty, 2); if (tty != 1 && tty != 2) close (tty); } else { log_setup (Syslog); } return -1; } martian-full-20080625/modem/session.c0000644000175000017500000003624311025434573016015 0ustar marvmarv/* session.c: * core <------> stream channels * * part of the martian_modem * * description: * an implementation of reader/writer part of modem * * note: * both terms reader/writer related to modem and its core * * * current implementation: * * core state checked. if there's something to read from core * out-stream is added to watchlist, if there's a room to transmit * in-stream is added to watchlist. * * Next wait on watched streams, pause if none to watch. * * This wait either succeeds resulting in streams io operations * or might be interrupted by core initiated timer tick. * In the latter case core state is rescanned. * * * supposed multithreaded implementation for SMP: * * supposed to be 2 threaded thing * * reader: listens to virtual uart, reads from core internal * buffers and writes to socket, * * writer: listens to pty if anything to be written it will pass * the data in chunks to the virtual uart * * for reader core virtual interrupt will pulse data here event * * access to core should be serialized for MT implementation * * created 6.11.2005 * * Author: A. Chentsov * Copying: LGPL * */ /*** pselect implies */ #define _GNU_SOURCE #include #include /*** close, unlink */ #include /*** for gettid() definition */ #include /*** fd sets, pselect */ #include /*** MIN */ #include /*** __u-types */ #include /*** sigaction */ #include /*** errno, EINTR */ #include /*** nanosleep */ #include #include #include #define MSIGVI (SIGRTMIN + 1) #define CORE_USLICE (10 * 1000) #define CORE_SLICE (1000 * CORE_USLICE) #define PULSE_CHECK 1 #include "mport.h" extern mport_t mport; #define PREFIX "session" #include "log.h" #include "sysdep.h" #include "watch.h" #include "core.h" #include #include "../martian.h" /***** core's symbols *****/ //extern void timertick_function (int num); /**************************/ /***** pin symbols *****/ extern int pin_recv (int pin, char *buf, int length); extern int pin_send (int pin, char *buf, int length); extern int pin_get_send_size (int pin); extern int pin_check_hangup (int pin); /**************************/ struct _actionwatch pulse_latency; struct _actionwatch core_virtual_watch; struct _actionwatch write_watch, read_watch; struct _actionwatch read_dsp_watch; struct _stream { int bytes, calls; }; static struct { time_t start; /* statistics */ int pulsesAll, pulsesDone; struct _stream up, down; struct _stream vi_up, vi_down; int pin; fd_set vi_readers, vi_writers; struct timeval immediately; unsigned in_vi : 1; unsigned in_pulse : 1; unsigned closed : 1; } session; /*** timer processing ***/ /*int pulse_core; int no_irq = 0; int pending = 0;*/ static void inline do_pulse_port (mport_t *port) { session.in_pulse = 1; session.pulsesDone++; if (Debugged (Timings)) watch_start (&core_virtual_watch); port->do_pulse (port); if (Debugged (Timings)) { watch_stop (&core_virtual_watch); if ((watch_nsec (core_virtual_watch, last)) > 100000000) logdebugadd (2, "d"); } session.in_pulse = 0; } typedef enum event_t { Fault, Pulse, RW, Closed, CarrierLost } event_t; #define CHECKDOPULSE(port) \ do if ((port)->pulse) { \ /*(port)->do_pulse (port);*/ \ do_pulse_port (port); \ logdebugadd (Mechanism, "p"); \ if (session.closed) \ return Closed; \ if ((port)->carrier == CLost) \ return CarrierLost; \ /* update sets after timer */ \ return Pulse; \ } while (0) static inline event_t wait_events (int fd, fd_set *preaders, fd_set *pwriters) { struct timespec timeout; timeout.tv_sec = 0; timeout.tv_nsec = PULSE_CHECK * CORE_SLICE; CHECKDOPULSE (&mport); /* if (mport.pulse) { do_pulse_port (&mport); mport.do_pulse (&mport); if (mport.carrier == CLost) return CarrierLost; } */ /* there's very little chance that pulse come between this point * and the point when we enter the kernel in syscall * for this reason there's a timeout latency comes into play */ if (preaders || pwriters) { int num; logdebugadd (5, "s"); while ( (num = pselect (fd + 1, preaders, pwriters, NULL, & timeout, NULL)) <= 0) { if (num == 0) logdebugadd (5, "0"); if ((num == -1 && errno == EINTR) || (num == 0)) { /* check & pulse core */ CHECKDOPULSE (&mport); if (!mport.pulse && num != 0) LOGDEBUG (2, "interrupted spuriously\n"); if (preaders) FD_SET (fd, preaders); if (pwriters) FD_SET (fd, pwriters); } // that's bad thing with io else if (errno == EIO) { LOGERR ("pty io error; closing session\n"); return Fault; } else { LOGSYSERR (Error, "select"); LOGERR ("closing session\n"); return Fault; } } logdebugadd (5, "e"); return RW; } /* no descriptors to watch */ /* no core room to write or carrier lost */ else { /* assert */ ASSERT (mport.carrier == COk, return CarrierLost); while (1) { int result = nanosleep (&timeout, NULL); logdebugadd (Mechanism, "n"); if (result == 0 || (result == -1 && errno == EINTR)) { CHECKDOPULSE (&mport); } else { LOGSYSERR (Error, "nanosleep"); LOGERR ("closing session\n"); return Fault; } } } } /*** pty <-- core ***/ static inline int downstream (int fd) { char buf[0x400]; int bytes = MIN (mport.available, sizeof buf); mport_read (&mport, buf, bytes); /* write to stream; what to do if it block? * well waterline do the trick * there's always enough room */ char *ptr = buf; int left = bytes; do { int sent = pin_send (fd, ptr, left); if (sent == -1) { if (errno == EINTR) { if (mport.carrier == CLost) return -1 /*out*/; continue; } /* otherwise */ LOGSYSERR (Debug, "write"); session.closed = 1; return -1; } else if (sent == 0) { LOGDEBUG (2, "downstream: written 0\n"); session.closed = 1; return -1; } LOGQDEBUG (3, " <-- %d\n", sent); LOGQDEBUG (4, " <-- %*.*s\n", sent, sent, ptr); /*LOGQDEBUG (3, "pty <-- core: %d\n", sent); LOGQDEBUG (4, "pty <-- core: %*.*s\n", sent, sent, ptr); */ /* logdebugadd (3, "<%d<", sent); logdebugadd (4, "%*.*s<", sent, sent, ptr); */ /* statistics */ session.down.bytes += sent; session.down.calls++; if (session.in_vi) { session.vi_down.bytes += sent; session.vi_down.calls++; } left -= sent; if (left) LOGDEBUG (2, "downstream: sent less than supplied. repeat\n"); ptr += sent; } while (left); /* perhaps check the pulse */ return bytes; } /*** pty --> core ***/ static inline int upstream (int fd) { char buf[0x100]; // we prefer to jump int received, bytes; bytes = MIN (mport.room, sizeof buf); while ( (received = pin_recv ( fd, buf, bytes)) == -1) { if (errno == EINTR) continue; else if (errno == EIO) { /* client closed */ session.closed = 1; LOGDEBUG (2, "reader: EIO\n"); return -1; } else { /* error, quit */ LOGSYSERR (Debug, "upstream:"); return -1; } } if (received == 0) { /* client closed */ session.closed = 1; LOGDEBUG (2, "reader closed\n"); return -1; } /* precond: received <= bytes */ bytes = mport_write (&mport, buf, received); if (received != bytes) { LOGWARN ("upstream: written to core %d < %d (supplied)\n", bytes, received); } /* statistics */ session.up.bytes += bytes; session.up.calls++; /*LOGQDEBUG (3, "pty --> core: %d\n", bytes); LOGQDEBUG (4, "pty --> core: %*.*s\n", bytes, bytes, buf);*/ LOGQDEBUG (3, " --> %d\n", bytes); LOGQDEBUG (4, " --> %*.*s\n", bytes, bytes, buf); /* logdebugadd (3, ">%d>", bytes); logdebugadd (4, "%*.*s", bytes, bytes, buf); */ return bytes; } static inline void session_init (int pin, fd_set *preaders, fd_set *pwriters) { FD_ZERO (preaders); FD_ZERO (pwriters); FD_ZERO (&session.vi_readers); FD_ZERO (&session.vi_writers); session.pin = pin; session.immediately.tv_sec = session.immediately.tv_usec = 0; session.in_vi = session.closed = 0; session.in_pulse = 0; /* reset statistics */ session.pulsesAll = session.pulsesDone = 0; session.down.bytes = 0; session.down.calls = 0; session.up = session.down; session.vi_down = session.down; session.vi_up = session.down; if (Debugged (Timings)) { watch_init (&pulse_latency); watch_init (&core_virtual_watch); watch_init (&write_watch); watch_init (&read_watch); watch_init (&read_dsp_watch); watch_set_thresh (&core_virtual_watch, 100 * 1000000); } } /*** two funcs to decide what should be watched ***/ static inline fd_set *checkset_upstream (int fd, fd_set *preaders) { if (mport.carrier == CLost) return NULL; if (mport.ready) { FD_SET (fd, preaders); return preaders; } else return NULL; } static inline fd_set *checkset_downstream (int fd, fd_set *pwriters) { if (mport.has_data) { FD_SET (fd, pwriters); return pwriters; } else return NULL; } void virtual_rs_interrupt (int a) { fd_set *pwriters; session.in_vi = 1; /* notify port */ mport_vi (&mport); if (session.pin < 0) return ; /* watching only for writing - downstream */ pwriters = checkset_downstream (session.pin, &session.vi_writers); /*** pick events ***/ if (select (session.pin + 1, NULL, pwriters, NULL, &session.immediately) <= 0) goto l_quit; /*** write ***/ if ( pwriters && FD_ISSET (session.pin, pwriters) ) { if (Debugged(Timings)) watch_start (&write_watch); if (downstream (session.pin) == -1) goto l_quit /*out*/; if (Debugged(Timings)) { watch_stop (&write_watch); unsigned ms = watch_nsec (write_watch, last) / 1000000; if (ms > 5) logdebugadd (Timings, "w%dms", ms); } } if (mport.carrier == CLost) { LOGDEBUG (Note, "virtual int: carrier lost\n"); goto l_quit /*out*/; } /* Usually CTS also checked. * This bits are not set in UART layer of core. */ /* perhaps gather some statistics or monitor modem state */ l_quit: session.in_vi = 0; } #define SHOW_TIMINGS(w, str) \ LOGQ (Debug, str " min = %.2f %s, max = %.2f %s; %.2f %s average\n", \ watch_format(&w,Min), \ watch_unit (w,Min), \ watch_format(&w,Max), \ watch_unit (w,Max), \ watch_format (&w, Avg), \ watch_unit (w, Avg) \ ); /*** diagnostics, chronometry */ static void dump_stats () { if (config.debuglevel < Stats) return; LOGQ (Debug, "\n"); LOGQ (Debug, "\t\t*** session stats ***\n"); LOGQ (Debug, "\n"); { char timestr[25], *ptr; unsigned duration, seconds; struct timeval now; gettimeofday (&now, NULL); ptr = timestr; duration = now.tv_sec - session.start; seconds = duration % 60; duration = duration / 60; if (duration) { int minutes = duration % 60; duration /= 60; if (duration) ptr += sprintf (ptr, "%d h ", duration); ptr += sprintf (ptr, "%d min ", minutes); } ptr += sprintf (ptr, "%d sec", seconds); LOGQ (Debug, "duration %s\n", timestr); } // LOGQ (Debug, "Pulses, effective/total : %d/%d\n", session.pulsesDone, session.pulsesAll); LOGQ (Debug, "Pulses, effective/total : %d/%d\n", session.pulsesDone, mport.pulsesAll); LOGQ (Debug, ">>> out: %d bytes in %d chunks, %d average\n", session.up.bytes, session.up.calls, session.up.calls ? session.up.bytes / session.up.calls : 0); LOGQ (Debug, "in <<< : %d bytes in %d chunks, %d average\n", session.down.bytes, session.down.calls, session.down.calls? session.down.bytes / session.down.calls : 0); /* LOGQ (Debug, "(%db / %d inside virtual interrupt)\n", session.vi_down.bytes, session.vi_down.calls); */ SHOW_TIMINGS (pulse_latency, "Pulse latency"); /* LOGQ (Debug, "Pulse latency min = %.2f %s, max = %.2f %s; %.2f %s average\n", watch_format(&pulse_latency,Min), watch_unit (pulse_latency,Min), watch_format(&pulse_latency,Max), watch_unit (pulse_latency,Max), watch_format (&pulse_latency, Avg), watch_unit (pulse_latency, Avg)); */ LOGQ (Debug, "Servicing virtual irq min = %.2f %s, max = %.2f %s; %.2f %s average, with %d threshed\n", watch_format(&core_virtual_watch,Min), watch_unit (core_virtual_watch,Min), watch_format(&core_virtual_watch,Max), watch_unit (core_virtual_watch,Max), watch_format (&core_virtual_watch, Avg), watch_unit (core_virtual_watch, Avg), core_virtual_watch.threshnum); SHOW_TIMINGS (write_watch, "Write expenses"); SHOW_TIMINGS (read_watch, "Read expenses"); LOGQ (Debug, "Rates: connection/last. Up: %s/%s. Down: %s/%s\n", sRate[x_status[1]], sRate[x_status[3]], sRate[x_status[2]], sRate[x_status[4]]); if (x_status[0x12] + x_status[0x13] != 0) LOGQ (Debug, "Retrains: %d local, %d remote\n", x_status[0x12], x_status[0x13]); LOGQ (Debug, "Frames: total/erronous. Transmit: %d/%d. Receive: %d/%d\n", x_status[0xe], x_status[0xf], x_status[0x10], x_status[0x11]); LOGQ (Debug, "\n"); LOGQ (Debug, "\t\t*********************\n"); LOGQ (Debug, "\n"); } extern void pin_start_timer (void ); extern void pin_stop_timer (void ); extern unsigned pin_check_mctrl (int changes); /***** session_run: the engine *****/ void session_run (int fd) { fd_set readers, writers; fd_set *preaders, *pwriters; session_init (fd, &readers, &writers); mport_open (&mport); /*, &session);*/ /* perhaps should be in mport_open) */ mport_mctrl_set (&mport, pin_check_mctrl (0)); pin_start_timer(); /* stream output buffer is expected to be more than 0x1000 i.e. core read ring */ { struct timeval now; gettimeofday (&now, NULL); session.start = now.tv_sec; } LOGINFO ("Started %s", ctime (&session.start)); while (1) { /*** set up sets to watch ***/ /* check on cts to be added */ preaders = checkset_upstream (fd, &readers); /* * writer depends on data availability in core * this way it will be checked only on the second encounter * so check in virtual interrupt is more effective * unless we are absolutely sure that with main loop * the buffering is better */ /* pwriters = checkset_downstream (fd, &writers); */ pwriters = NULL; /*** wait on pin for events ***/ switch (wait_events (fd, preaders, pwriters)) { case Closed: LOGINFO ("client's gone\n"); goto l_escape; case CarrierLost: LOGINFO ("carrier lost\n"); if (config.check_carrier) goto l_escape; else { LOGINFO ("ignoring\n"); mport.carrier = COk; continue; } case Fault: goto l_escape; case Pulse: continue; case RW: break; default: LOGWARN ("wait_events: unexpected result\n"); continue; } /*** write ***/ /* assert */ if ( pwriters && FD_ISSET (fd, pwriters) ) { LOGDEBUG (2, "mainloop: down is available!!!!!\n"); if (downstream (fd) == -1) break /*out*/; } /*** read ***/ if (preaders && FD_ISSET (fd, preaders)) { if (Debugged(Timings)) watch_start (&read_watch); if (upstream (fd) == -1) { if (session.closed) LOGINFO ("client's gone\n"); break /*out*/; } if (Debugged(Timings)) { watch_stop (&read_watch); unsigned ms = watch_nsec (read_watch, last) / 1000000; if (ms > 5) logdebugadd (Timings, "r%dms", ms); } } } l_escape: pin_stop_timer(); session.pin = -1; mport_close (&mport); { struct timeval now; gettimeofday (&now, NULL); LOGINFO ("Closed %s", ctime (&now.tv_sec)); } dump_stats(); } martian-full-20080625/modem/watch4.gdb0000644000175000017500000000060210533130476016022 0ustar marvmarvset args --isr helper --move-fifos --debug 3 --log m.log handle SIG35 nostop noprint handle SIG34 nostop noprint break mport_tinit run watch Mcb->io_dce_rx_rptr if Mcb->io_dce_rx_rptr < Mcb->io_dce_rx_buff continue info registers info threads backtrace printf "at 0x%x\n", $eip disass $eip-30 $eip+20 thread 1 backtrace thread 2 backtrace thread 3 backtrace print *Mcb signal SIGINT martian-full-20080625/modem/pty.c0000644000175000017500000001504311024421502015124 0ustar marvmarv/* readwrite.c: * stream channels routines * * part of the martian_modem * * description: * stream implemented as pty * * * Author: A. Chentsov * Copying: LGPL * */ #define _GNU_SOURCE #include #include // close, unlink // sigaction #include #include #include #include // fd sets #include // posix timers #include "sysdep.h" #include /*** (p)select */ // errno, EINTR #include #include /*** memset, memcmp */ #include /*** pty major */ #include "mport.h" #define PREFIX "pty" #include "log.h" #include "common.h" void pin_reset (int pin) { if (pin != -1) close (pin); unlink (config.symlink_name); } /* no file or broken link */ static int check_symbolic_link (char *symlink) { struct stat sl_stats; LOGDEBUG (Note, "checking file %s\n", symlink); if (stat (symlink, &sl_stats) == -1) { LOGSYSERR (Debug, "stat"); if (errno == ENOENT) return 1; } else { /* file exists */ if (! S_ISCHR (sl_stats.st_mode) || major (sl_stats.st_rdev) != UNIX98_PTY_SLAVE_MAJOR) { LOGDEBUG (2, "%ld\n", sl_stats.st_dev); LOGERR ("File %s exists\n", config.symlink_name); return 0; } } if (lstat (symlink, &sl_stats) == 0) if ( ! S_ISLNK(sl_stats.st_mode) ) { LOGERR ("File %s exists and not a symlink\n", symlink); return 0; } return 1; } static int timer_pty, next_pty; static char next_name[256]; static int pty_chown (int ptm) { char pts_name[256]; if (ptsname_r (ptm, pts_name, sizeof pts_name - 1) == 0) { LOGDEBUG (Note, "chowning %s\n", pts_name); if (chown (pts_name, config.uid, config.gid) < 0) { LOGWARN ("failed to set tty owner\n"); LOGSYSERR (Warning, "pty_chown"); return -1; } else return 0; } else return -1; } static int pty_chmod (int ptm) { char pts_name[256]; if (ptsname_r (ptm, pts_name, sizeof pts_name - 1) == 0) { LOGDEBUG (Note, "chmoding %s\n", pts_name); if (chmod (pts_name, config.mode) < 0) { LOGWARN ("failed to set tty permissions\n"); LOGSYSERR (Warning, "pty_chmod"); return -1; } else return 0; } else return -1; } static int setup_symbolic_link (char *path, int ptm) { char pts_name[256]; char *name = (timer_pty == -1) ? pts_name : next_name; if (ptsname_r (ptm, name, sizeof pts_name - 1) == 0) { LOGDEBUG (2, "%s %s\n", (timer_pty == -1) ? "using" : "exporting", name); } else return -1; unlink (path); return symlink (name, path); } extern mtimer_t ptytimer; #define SIG_PTY_TIMER SIGRTMIN int pin_check_dtr (void ) { struct termios term; tcgetattr (timer_pty, &term); return ! (cfgetospeed (&term) == B0 || cfgetispeed (&term) == B0); } static unsigned previous_dtr; unsigned pin_check_mctrl (int changes) { struct termios term; unsigned dtr, mask = 0; if (! changes) { struct termios term; tcgetattr (timer_pty, &term); previous_dtr = ! (cfgetospeed (&term) == B0 || cfgetispeed (&term) == B0); if (previous_dtr) mask |= (TIOCM_DTR | TIOCM_RTS); return mask; } tcgetattr (timer_pty, &term); dtr = ! (cfgetospeed (&term) == B0 || cfgetispeed (&term) == B0); if (dtr ^ previous_dtr) { mask |= (TIOCM_DTR | TIOCM_RTS); previous_dtr = dtr; LOGDEBUG (Event, "hang-up %s\n", (!dtr) ? "on" : "off"); } return mask; } /* pin_start_timer * set to pulse every num ms and go */ void pin_start_timer (void ) { const struct timespec interval = { .tv_sec = 0, .tv_nsec = 200000000 }; const struct itimerspec pty_slice = { .it_value = interval, .it_interval = interval }; int res = ptytimer.settime (ptytimer.id, 0, & pty_slice, NULL); if (res < 0) { LOGERR ("start timer error %d\n", res); } } void pin_stop_timer (void ) { struct itimerspec disarm; memset (&disarm, 0, sizeof disarm); ptytimer.settime (ptytimer.id, 0, & disarm, NULL); } static int create_pty (void ) { int res; int ptm = getpt(); if (ptm < 0) { LOGSYSERR (Error, "getpt"); LOGERR ("devpts is possibly not mounted\n"); return -1; } grantpt (ptm); unlockpt (ptm); if (config.uid != -1 || config.gid != -1) pty_chown (ptm); if (config.permissions) pty_chmod (ptm); // now set up symlink if (! check_symbolic_link (config.symlink_name)) return -1; res = setup_symbolic_link (config.symlink_name, ptm); if (res != 0) { LOGSYSERR (Error, "symlink"); return res; } return ptm; } /* pin_setup (pty) * prepare master pty for connection * pty - previous fd, * pty == -1 --> initialize * ! config.hide_pty || next_pty < 0 --> create pty, set link * config.hide_pty && next_pty --> return prepared pty descriptor */ int pin_setup (int pty) { int ptm = -1; // reset_pin (-1); if (pty == -1) { /* pre set */ next_pty = timer_pty = -1; } /* ASSERT (timer_pty == -1) */ if (pty == -1 || !config.hide_pty || next_pty < 0) { ptm = create_pty (); } else { /* implies (config.hide_pty && next_pty >= 0) */ ptm = next_pty; next_pty = -1; LOGDEBUG (Note, "attaching %s\n", next_name); } if (ptm < 0) return ptm; /* prepare the timer */ else { struct termios term; timer_pty = ptm; /* not really necessary */ /* timer will be started by mport anyway */ /* and before this it prepares mctrl */ tcgetattr (timer_pty, &term); previous_dtr = ! (cfgetospeed (&term) == B0 || cfgetispeed (&term) == B0); } return ptm; } int accept_client (int ptm) { struct termios startterm; struct timespec timeout; fd_set catch_set; int num; FD_ZERO (&catch_set); FD_SET (ptm, &catch_set); tcgetattr (ptm, &startterm); timeout.tv_sec = 0; timeout.tv_nsec = 200 * 1000000; /* return ptm; */ while (select (ptm + 1, &catch_set, NULL, NULL, NULL) == -1) { // while ((num = pselect (ptm + 1, &catch_set, NULL, &catch_set, &timeout, NULL)) <= 0) { continue; if (num == 0 || errno == EINTR) { struct termios term; tcgetattr (ptm, &term); if (memcmp (&term, &startterm, sizeof term) == 0) continue; LOGDEBUG (Event, "termios changed\n"); continue; break; } LOGSYSERR (Error, "select"); return -1; } if (config.hide_pty) { next_pty = create_pty(); if (next_pty < 0) ; /* we'll retry to create it later in pin_setup */ } return ptm; } /* pin_close * client's off notification */ int pin_close (int pty) { /* pin_stop_timer(); */ timer_pty = -1; return close (pty); } int pin_recv (int pin, char *buf, int length) { return read (pin, buf, length); } int pin_send (int pin, char *buf, int length) { return write (pin, buf, length); } int pin_get_send_size (int pty) { return 0x4000; } martian-full-20080625/modem/sysdep.c0000644000175000017500000000344310534406750015635 0ustar marvmarv#include #include #include #include #include "log.h" #include "sysdep.h" #include #include #include #include struct _mutex { pthread_mutex_t obj; }; static long linux_timer_create (clockid_t clock, struct sigevent *ev, timer_t *timerid) { return syscall (__NR_timer_create, clock, ev, timerid); } static long linux_timer_settime (timer_t id, int flags, const struct itimerspec *ts, struct itimerspec *ots) { return syscall (__NR_timer_settime, id, flags, ts, ots); } /* _syscall3 (long, timer_create, clockid_t, clock, struct sigevent *, ev, timer_t *, timerid); */ long mtimer_create (clockid_t clock, struct sigevent *ev, mtimer_t *timer) { long result; result = linux_timer_create (clock, ev, &timer->id); if (result == 0) { timer->settime = (typeof (timer_settime) *) linux_timer_settime; return 0; } LOGDEBUG (2, "linux_timer_create: %s\n", strerror (-result)); result = timer_create (clock, ev, &timer->id); if (timer_create (clock, ev, &timer->id) == 0) { timer->settime = timer_settime; return 0; } LOGSYSERR (Debug, "timer_create"); return result; } int mthread_create (void *(*run) (void *arg), void *arg) { pthread_attr_t attr; pthread_t id; pthread_attr_init (& attr); if (pthread_create (&id, &attr, run, arg) != 0) { LOGSYSERR (Debug, "pthread_create"); return -1; } return 1; /*gettid();*/ } mutex_t *mutex_create (void ) { mutex_t *m = malloc (sizeof (mutex_t)); if (! m) { LOGSYSERR (Error, "malloc"); return m; } pthread_mutex_init (&m->obj, NULL); return m; } int mutex_lock (mutex_t *m) { return pthread_mutex_lock (&m->obj); } int mutex_unlock (mutex_t *m) { return pthread_mutex_unlock (&m->obj); } int mgettid (void ) { return syscall (__NR_gettid); } martian-full-20080625/modem/common.h0000644000175000017500000000147211024421502015606 0ustar marvmarv#ifndef __MARTIAN_MODEM_COMMON_H #define __MARTIAN_MODEM_COMMON_H #include struct _config { /* box */ char affinity_cpu; double freq; /* in MHz */ /* user */ char *symlink_name; unsigned debuglevel; char *logfilename; uid_t uid; gid_t gid; mode_t mode; unsigned char country_id; /*** flags ***/ /* box */ unsigned haveTSC : 1; unsigned smp : 1; /* user */ unsigned realtime : 1; unsigned syslog : 1; unsigned daemon : 1; unsigned logfile : 1; unsigned check_carrier : 1; unsigned hide_pty : 1; unsigned true_smp : 1; unsigned permissions : 1; }; extern struct _config config; extern struct martian_common *Mcb; extern int mfd; extern int worker_tid; struct core_stats { int rx_hdlc; int rx_hdlc_of; }; extern struct core_stats core; #endif /*** __MARTIAN_MODEM_COMMON_H */ martian-full-20080625/modem/main.h0000644000175000017500000000070611023420373015245 0ustar marvmarv#ifndef __MARTIAN_MAIN_H #define __MARTIAN_MAIN_H /*** called functions ***/ extern void print_core_vars (void ); extern int accept_client (int sockfd); extern int pin_close (int pin); extern void session_run (int fd); extern int pin_thread (void); void *serve_interrupts (void *arg); extern void print_core_vars_common (struct martian_common *common); extern void ask_driver_vars (int dev_fd); extern void print_irq_state (int dev_fd); #endif martian-full-20080625/modem/smp.c0000644000175000017500000001710011023420373015107 0ustar marvmarv#define _GNU_SOURCE #include #include #include #include #include #include #include "sysdep.h" #include #include #include "../martian.h" #define PREFIX "smp" #include "log.h" static int cpu = -1; static int set_irq_affinity (int irq) { int fd, res; int counter, num, _cpu; char path[256]; char buf[256]; char *ptr; sprintf (path, "/proc/irq/%d/smp_affinity", irq); fd = open (path, O_RDWR); if (fd < 0) { if (errno == ENOENT) { LOGDEBUG (2, "%s not found\n", path); } else { LOGSYSERR (Debug, "open"); LOGDEBUG (2, "failed to open %s\n", path); } return -1; } num = read (fd, buf, sizeof buf); if (num < 0) { LOGSYSERR (Debug, "read"); close (fd); return -1; } buf[sizeof buf - 1] = '\0'; LOGDEBUG (Note, "initial irq affinity in proc %s\n", buf); /* parsing to find the first available processor */ ptr = buf + num - 2; /* check '\n' at the end */ _cpu = counter = 0; while (ptr > buf) { switch (*ptr) { case '0': /* skip */ _cpu += 4; break; case '3': case '5': case '7': case '9': case 'b': case 'd': case 'f': *ptr = '1'; case '1': goto l_escape; case '6': case 'a': case 'e': *ptr = '2'; case '2': _cpu++; goto l_escape; case 'c': *ptr = '4'; case '4': _cpu += 2; goto l_escape; case '8': _cpu += 3; goto l_escape; case ',': if (counter != 8) { LOGWARN ("wrong separator placement\n"); goto l_cleanup; } counter = 0; ptr--; continue; default: LOGWARN ("unexpected symbol %c\n", *ptr); goto l_cleanup; } counter++; ptr--; if (counter > 8) { LOGWARN ("too many digits in a chunk\n"); goto l_cleanup; } } LOGWARN ("no processors available"); l_cleanup: close (fd); return -1; l_escape: if (counter == 8) { LOGWARN ("too many digits in a chunk\n"); goto l_cleanup; } res = write (fd, ptr, num - (ptr - buf) - 1); if (res <= 0) LOGSYSERR (Debug, "write"); else { if (res != num - (ptr - buf) - 1) LOGWARN ("write inconsistency\n"); cpu = _cpu; } close (fd); LOGDEBUG (2, "using cpu %d\n", cpu); if (Debugged (Note)) { fd = open (path, O_RDWR); num = read (fd, buf, sizeof buf); buf[sizeof buf - 1] = '\0'; LOGDEBUG (2, "irq affinity set %s\n", buf); } return cpu; } const char keyword[] = "processor\t:"; static int get_cpu_number (void) { int counter; char buf[] = "processor\t:"; FILE *fp = fopen ("/proc/cpuinfo", "r"); if (fp == 0) { LOGDEBUG (2, "Cannot open /proc/cpuinfo (%s)\n", strerror(errno)); return -1; } counter = 0; /* inv: no '\n' in buf && fp -> line start */ do { char *ptr; if (fgets (buf, sizeof buf, fp) == NULL) break; if (strcmp (buf, keyword) == 0) { counter++; } else if ((ptr = (char *) memchr (buf, '\n', sizeof buf)) != NULL) { *ptr = '\0'; /* we are on the next line start && no '\n' in buf */ continue; } /* move to next line */ int c; do { c = fgetc (fp); if (c == EOF) goto l_quit; } while (c != '\n'); } while (1); l_quit: fclose (fp); if (counter == 0) LOGDEBUG (2, "get_cpu_num: unexpected end of file\n"); return (counter == 0) ? -1 : counter; } void test_affinity_dump (void ); int smp_setup (int irq, int dev_fd) { int num = get_cpu_number(); config.affinity_cpu = -1; /*test_affinity_dump ();*/ /* if (num == -1) num = 1;*/ if (num <= 1) { config.smp = 0; if (config.true_smp) { LOGWARN ("--smp ignored: UP box.\n"); config.true_smp = 0; } return 0; } config.smp = 1; if (config.true_smp) { if (ioctl (dev_fd, MARTIAN_TRUE_SMP) == 0) { LOGINFO ("running in true smp mode -- EXPERIMENTAL.\n"); return 1; } LOGERR ("Kernel module denied running in true smp mode\n"); config.true_smp = 0; } LOGINFO ("configuring\n"); /* */ config.affinity_cpu = set_irq_affinity (irq); ioctl (dev_fd, MARTIAN_CHECK_SMP, config.affinity_cpu); return 1; } static inline int bits_range_zero (unsigned long val, int start, int end) { if (start > end) return 1; return ((val >> start) & ((1 << (1 + end - start)) - 1)) == 0; } static inline int bits_range_set (unsigned long val, int start, int end) { if (start > end) return 1; else { unsigned mask = ((1 << (1 + end - start)) - 1); return ((val >> start) & mask) == mask; } } #undef PREFIX #define PREFIX "smp: affinity" static void dump_affinity (cpu_set_t *cpus) { int _cpu, _cpul, _cpur, next_to_check; __cpu_mask cpus_unit = cpus->__bits[0], cpus_unit_copy; cpus_unit_copy = cpus_unit; _cpu = 0; next_to_check = 0; if (cpus_unit) while (1) { _cpul = __builtin_ctzl (cpus_unit); logdebugadd (Note, "%d", _cpu + _cpul); ASSERT (bits_range_zero (cpus_unit_copy, next_to_check, (_cpu + _cpul) - 1), break); _cpul++; cpus_unit >>= _cpul; /* assert (~cpus_unit != 0) */ /* cpus_unit & 0x1 - unknown */ _cpu += _cpul; next_to_check = _cpu - 1; _cpur = __builtin_ctzl (~cpus_unit); switch (_cpur) { case 0: break; case 1: logdebugadd (Note, ", %d", _cpu); break; default: logdebugadd (Note, "..%d", _cpu + _cpur - 1); } ASSERT (bits_range_set (cpus_unit_copy, next_to_check, (_cpu + _cpur) - 1), break); next_to_check = _cpu + _cpur; _cpur++; _cpu += _cpur; cpus_unit >>= _cpur; /* cpus_unit & 0x1 - unknown */ if (! cpus_unit) { logdebugadd (Note, ".\n"); break; } logdebugadd (Note, ", "); } else { logdebugadd (Note, "none\n"); } } #include static unsigned my_rand (unsigned start, unsigned end) { unsigned long long range = 1 + (unsigned long long ) end - start; return start + (unsigned ) ((rand() * range) / (RAND_MAX + 1UL)); } void test_affinity_dump (void ) { int cpur, cpul, _cpu; cpu_set_t cpus; __cpu_mask *cpus_unit = &cpus.__bits[0]; CPU_ZERO (&cpus); /* generate sequence */ LOGDEBUG (Note, "Testing affinity dump.\n"); int testc; for (testc = 1; testc < 10; testc++) { srand (testc); _cpu = 0; *cpus_unit = 0; LOGDEBUG (Note, "generated: "); while (_cpu < 8 * sizeof *cpus_unit) { int i; cpul = my_rand (_cpu, 8 * sizeof *cpus_unit - 1); cpur = my_rand (cpul, 8 * sizeof *cpus_unit - 1); for (i = cpul; i <= cpur; i++) *cpus_unit |= (1 << i); _cpu = cpur + 2; logdebugadd (Note, "%d:%d, ", cpul, cpur); } logdebugadd (Note, "got: "); { dump_affinity (&cpus); } } } int pin_thread (void) { if (!config.smp || config.true_smp || config.affinity_cpu == -1) return 0; else { int res; cpu_set_t cpus; res = sched_getaffinity (mgettid(), sizeof cpus, & cpus); if (res != 0) { LOGSYSERR (Debug, "sched_getaffinity"); LOGDEBUG (Note, "failed to get affinity for thread %d\n", mgettid()); } else { LOGDEBUG (Note, "hard initial affinity cpus: "); dump_affinity (&cpus); } CPU_ZERO (&cpus); CPU_SET (config.affinity_cpu, &cpus); res = sched_setaffinity (mgettid(), sizeof cpus, &cpus); if (res < 0) { LOGSYSERR (Debug, "sched_setaffinity"); LOGWARN ("failed to pin thread %d\n", mgettid()); } res = sched_getaffinity (mgettid(), sizeof cpus, & cpus); if (res != 0) { LOGSYSERR (Debug, "sched_getaffinity"); LOGDEBUG (Note, "failed to get affinity for thread %d\n", mgettid()); } else { LOGDEBUG (Note, "hard set affinity cpu: "); dump_affinity (&cpus); } return res; } } #ifdef MARTIAN_HELPER_TESTS int pin_thread_test (void) __attribute__ (( alias ("pin_thread") )); int set_irq_affinity_test (int irq) __attribute__ (( alias ("set_irq_affinity") )); int get_cpu_number_test (void) __attribute__ (( alias ("get_cpu_number") )); #endif martian-full-20080625/modem/modemfiles.txt0000644000175000017500000000057111033004367017037 0ustar marvmarvASWMLICENSE common.h coreadd.c core.h core_if.c coresubst.c debug_script.in dumpers.c elf386tweakrelocs.c isr.c link.c log.c log.h ltmdmobj.o main.c main.h Makefile mixspinlock.h modemfiles.txt mport.c mport.h overriden_core_functions profile.c pty.c README session.c smp.c sysdep.c sysdep.h tweakcore.sh tweakrelocsdynamic.c watch2.gdb watch3.gdb watch4.gdb watch.gdb watch.h martian-full-20080625/modem/watch.h0000644000175000017500000001264010533130476015436 0ustar marvmarv#ifndef __MARTIAN_WATCH_H #define __MARTIAN_WATCH_H #include #include "common.h" /* config */ typedef enum { Min = 0, Max = 1, Avg = 2 } watchparam_t; #define WParams 3 struct _actionwatch { union { struct { unsigned long long save_start; unsigned long long all, min, max, last; unsigned long long thresh; } tsc; struct { struct timespec save_start; struct timespec all, min, max, last; struct timespec thresh; } conv; }; unsigned started; unsigned num, threshnum; /* cached unit */ char units[WParams][3]; }; typedef struct _actionwatch actionwatch_t; static inline unsigned long long tsc_to_nsec (unsigned long long tsc) { return (tsc * 1000) / config.freq; } static inline unsigned long long nsec_to_tsc (unsigned long long nsec) { return (nsec * config.freq) / 1000; } static inline unsigned long long conv_to_nsec (const struct timespec *t) { return 1000000000 * t->tv_sec + t->tv_nsec; } static inline void nsec_to_conv (struct timespec *t, unsigned long long nsec) { t->tv_sec = nsec / 1000000000; t->tv_nsec = nsec % 1000000000; } static inline void conv_set (const struct timespec *t0, struct timespec *var) { var->tv_sec = t0->tv_sec; var->tv_nsec = t0->tv_nsec; } static inline int conv_less (const struct timespec *t1, const struct timespec *t2) { return (t1->tv_sec < t2->tv_sec) || (t1->tv_sec == t2->tv_sec && t1->tv_nsec < t2->tv_nsec); } static inline void conv_sub (const struct timespec *t1, const struct timespec *t2, struct timespec *res) { if (t2->tv_nsec < t1->tv_nsec) { res->tv_nsec = t2->tv_nsec + 1000000000 - t1->tv_nsec; res->tv_sec = t2->tv_sec - t1->tv_sec - 1; } else { res->tv_nsec = t2->tv_nsec - t1->tv_nsec; res->tv_sec = t2->tv_sec - t1->tv_sec; } } static inline void conv_add (const struct timespec *t1, const struct timespec *t2, struct timespec *res) { res->tv_sec = t2->tv_sec + t1->tv_sec; res->tv_nsec = t2->tv_nsec + t1->tv_nsec; if (res->tv_nsec >= 1000000000) { res->tv_nsec -= 1000000000; res->tv_sec--; } } #define rdtsc(cnt) __asm__ __volatile__ ("rdtsc" : "=A" (cnt)) static inline void watch_init (struct _actionwatch *watch) { if (config.haveTSC) { watch->tsc.all = watch->tsc.max = 0; watch->tsc.min = watch->tsc.thresh = -1; } else { watch->conv.all.tv_sec = watch->conv.all.tv_nsec = watch->conv.max.tv_nsec = watch->conv.max.tv_sec = 0; watch->conv.min.tv_sec = -1; watch->conv.thresh.tv_sec = -1; } watch->num = 0; watch->threshnum = 0; watch->started = 0; } static inline void watch_set_thresh (actionwatch_t *w, unsigned long long nsec) { if (config.haveTSC) { w->tsc.thresh = nsec_to_tsc (nsec); } else { nsec_to_conv (&w->conv.thresh, nsec); } } static inline void watch_start (struct _actionwatch *watch) { if (watch->started) return; if (config.haveTSC) rdtsc (watch->tsc.save_start); else clock_gettime (CLOCK_REALTIME, &watch->conv.save_start); watch->started = 1; } static inline void watch_stop (struct _actionwatch *watch) { if (! watch->started) return; watch->started = 0; if (config.haveTSC) { unsigned long long end, thetime; rdtsc (end); thetime = end - watch->tsc.save_start; watch->tsc.last = thetime; if (watch->tsc.thresh <= thetime) { watch->threshnum++; return; } watch->tsc.all += thetime; if (thetime < watch->tsc.min) watch->tsc.min = thetime; if (thetime > watch->tsc.max) watch->tsc.max = thetime; } else { struct timespec end, *thetime = &watch->conv.last; clock_gettime (CLOCK_REALTIME, &end); conv_sub (&watch->conv.save_start, &end, thetime); if (! conv_less (thetime, &watch->conv.thresh)) { watch->threshnum++; return; } conv_add (thetime, &watch->conv.all, &watch->conv.all); if (conv_less (thetime, &watch->conv.min)) conv_set (thetime, &watch->conv.min); if (conv_less (&watch->conv.max, thetime)) conv_set (thetime, &watch->conv.max); } watch->num++; } #define watch_nsec(watch, member) \ (config.haveTSC ? \ (unsigned )((watch.tsc.member * 1000.0) / config.freq) : \ watch.conv.member.tv_nsec) #define watch_unit(watch, member) &watch.units[member][0] static inline double watch_format (struct _actionwatch *watch, watchparam_t member) { unsigned nsec; /* up to 4 sec */ char *unit = &watch->units[member][0]; if (config.haveTSC) { unsigned long long t; switch (member) { case Min: t = (watch->tsc.min != -1) ? watch->tsc.min : 0; break; case Max: t = watch->tsc.max; break; case Avg: t = (watch->num == 0) ? 0 : watch->tsc.all / (double ) watch->num; break; } t = tsc_to_nsec (t); if (t >= 1000000000) { unit[0] = 's'; unit[1] = '\0'; return 1.e-9 * t; } nsec = t; } else { struct timespec *ts, tmp; switch (member) { case Min: ts = (watch->conv.min.tv_sec == -1) ? &watch->conv.min : &watch->conv.max; break; case Max: ts = &watch->conv.max; break; case Avg: if (watch->num == 0) break; nsec_to_conv (&tmp, conv_to_nsec (&watch->conv.all) / watch->num); ts = & tmp; break; } if (ts->tv_sec != 0) { unit[0] = 's'; unit[1] = '\0'; return ts->tv_sec + ts->tv_nsec * (double ) 1.e-9; } nsec = ts->tv_nsec; } double val = nsec; if (nsec < 1000) unit[0] = 'n'; else if (nsec < 1000000) { unit[0] = 'u'; val *= 1e-3; } else { unit[0] = 'm'; val *= 1e-6; } unit[1] = 's'; unit[2] = '\0'; return val; } #endif /*__MARTIAN_WATCH_H */ martian-full-20080625/modem/overriden_core_functions0000644000175000017500000000050011024426406021164 0ustar marvmarvUART_cd_on UART_cd_off io_init_dce_rx_fifo lapm_rx_hdlc_frame dp_modem_command dp_read_dsp_ram dp_write_dsp_ram dp_clear_ram dp_download_dsp dp_modem_command_long dp_regandor Write_mdm_byte Write_mdm_word dp_regandor dp_dsp_rom_checksum Start_DCP Stop_DCP x_output_init dp_periodic_task dp_init_variables dp_sleep_mode martian-full-20080625/modem/profile.c0000644000175000017500000000032510446366513015766 0ustar marvmarv struct _timedsection { unsigned long long ticks; unsigned runs; unsigned long long stamp; }; { /* */ rdtsc (readerwatch.stamp); /*reader*/ rdtsc (cur); readerwatch.ticks += (cur - readerwatch.stamp) ; martian-full-20080625/modem/link.c0000644000175000017500000000701511024421502015245 0ustar marvmarv/* link.c: * link user mode server's lt core to the low level driver * shared are bamil_d7, BaseAddressIndex, BaseAddress... * * Author: A. Chentsov * Copying: LGPL */ #include #include #include #include "../martian.h" #include "common.h" #define PREFIX "ld" #include "log.h" #include "core.h" extern __u8 *rd7_isr; /*** imported from relocator ***/ extern int initialize_map (char *program); extern void relocate_symbol (char *symbol, void *newptr); #define CHECK_COMMON_SYMBOL(symbol) \ { \ extern typeof (common->symbol) symbol; \ if (& symbol != & common->symbol) { \ LOGERR ("failed to relocate %s\n", #symbol); \ return 0; \ } \ } #define CHECK_COMMON_ARRAY_SYMBOL_TO_MEMBER(symbol, member) \ { \ extern typeof (common->member) symbol; \ if (& symbol != & common->member || \ &symbol[0] != &common->member[0] || \ &symbol[sizeof symbol / sizeof symbol[0]] != \ &common->member[sizeof symbol / sizeof symbol[0]]) { \ LOGERR ("failed to relocate %s\n", #symbol); \ return 0; \ } \ } #define CHECK_COMMON_ARRAY_SYMBOL(symbol) \ CHECK_COMMON_ARRAY_SYMBOL_TO_MEMBER(symbol, symbol) #define RELOCATECHECK_SYMBOL(symbol) \ relocate_symbol (#symbol, & common->symbol); \ CHECK_COMMON_SYMBOL(symbol) #define RELOCATECHECK_ARRAY_SYMBOL(symbol) \ relocate_symbol (#symbol, & common->symbol); \ CHECK_COMMON_ARRAY_SYMBOL(symbol) int test_S (struct martian_common *common) { extern typeof (common->S) S; unsigned char c = S[0x12b]; common->S[0x12b] ^= 0xff; if (c != (unsigned char)~S[0x12b]) { LOGDEBUG(Note, "c: %d, S[0x12b]: %d, common->S[0x12b]: %d\n", c, S[0x12b], common->S[0x12b]); common->S[0x12b] ^= 0xff; LOGDEBUG (Note, "S: %x, common->S: %x\n", S, common->S); LOGDEBUG (Note, "&S: %x, &common->S: %x\n", &S[0], &common->S[0]); LOGERR ("Failed check of array\n"); return 0; } S[0x12b] ^= 0xff; return 1; } int link_to_driver (char *image, struct martian_common *common) { if (! initialize_map (image)) return 0; RELOCATECHECK_SYMBOL (BaseAddress); RELOCATECHECK_SYMBOL (BaseAddress2); RELOCATECHECK_SYMBOL (BaseValue); RELOCATECHECK_SYMBOL (BaseAddressIndex); RELOCATECHECK_SYMBOL (BaseAddressData); RELOCATECHECK_SYMBOL (dp_bamil_rd7); RELOCATECHECK_SYMBOL (dp_byte_f); RELOCATECHECK_SYMBOL (x_dsp_mars); RELOCATECHECK_SYMBOL (x_dsp_mars3); /* TODO: should be set after conf call */ RELOCATECHECK_SYMBOL (dp_version); RELOCATECHECK_SYMBOL (x_chip_version); LOGDEBUG (Note, "Relocating isr symbols\n"); RELOCATECHECK_SYMBOL (V34Mode); RELOCATECHECK_SYMBOL (dp_dsp_data_in_progress); RELOCATECHECK_SYMBOL (dp_ring_int_count); RELOCATECHECK_SYMBOL (dp_sleep); RELOCATECHECK_ARRAY_SYMBOL (S); RELOCATECHECK_ARRAY_SYMBOL (io_dce_tx_buff); RELOCATECHECK_SYMBOL (io_dce_tx_wptr); RELOCATECHECK_SYMBOL (io_dce_tx_rptr); common->io_dce_tx_buff_um = (__u32 ) common->io_dce_tx_buff; RELOCATECHECK_ARRAY_SYMBOL (io_dce_rx_buff); RELOCATECHECK_SYMBOL (io_dce_rx_wptr); RELOCATECHECK_SYMBOL (io_dce_rx_rptr); common->io_dce_rx_buff_um = (__u32 ) common->io_dce_rx_buff; if (test_S (common) == 0) return 0; relocate_symbol ("io_pdm_rx_buffer", &common->io_pdm_rx_buff); CHECK_COMMON_ARRAY_SYMBOL_TO_MEMBER (io_pdm_rx_buffer, io_pdm_rx_buff); RELOCATECHECK_SYMBOL (io_pdm_rx_wptr); RELOCATECHECK_SYMBOL (io_pdm_rx_rptr); common->io_pdm_rx_buff_um = (__u32 ) common->io_pdm_rx_buff; RELOCATECHECK_SYMBOL (RBS_tick_rx); RELOCATECHECK_SYMBOL (init_RBS_tick_flag); rd7_isr = & common->rd7_isr; return 1; // done } martian-full-20080625/modem/mixspinlock.h0000644000175000017500000000115710515711715016672 0ustar marvmarv#ifndef __MIXSPINLOCK_H #define __MIXSPINLOCK_H #ifdef KERNEL # error "This module for user mode apps. Kernel module use synonym header" #endif typedef struct _mspinlock { volatile __s32 lock; } mspinlock_t; static inline void mspin_lock (mspinlock_t *lock) { __asm__ __volatile__( "1:\n" "\tlock; decl %0\n" "\tjns 3f\n\n" "2:\n" /*"\t\trep; nop\n"*/ "\t\tpause\n" "\tcmpl $0,%0\n" "\tjle 2b\n" "jmp 1b\n" "3:" :"=m" (lock->lock) : : "memory" ); } static inline void mspin_unlock (mspinlock_t *lock) { __asm__ __volatile__( "movl $0x1, %0" :"=m" (lock->lock) : : "memory" ); } #endif