From 443bcf2178edbeb3849fd28fb8db3c91b22a22d3 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Wed, 21 Sep 2016 03:38:20 -0400 Subject: [PATCH] Huge reworking to get shared libraries (and native replacements) working. Not there yet, but the framework is pretty close to what I want. --- lx_dump.c | 28 +++ lx_loader.c | 489 +++++++++++++++++++++++++++++++++------------- lx_loader.h | 80 ++++++++ make.sh | 17 +- native/doscalls.c | 7 + native/kbdcalls.c | 7 + native/msg.c | 16 ++ native/nls.c | 7 + native/quecalls.c | 7 + native/sesmgr.c | 7 + native/viocalls.c | 7 + tests/emx.dll | Bin 0 -> 91198 bytes tests/hello.c | 5 + tests/helloc.exe | Bin 0 -> 60171 bytes 14 files changed, 536 insertions(+), 141 deletions(-) create mode 100644 native/doscalls.c create mode 100644 native/kbdcalls.c create mode 100644 native/msg.c create mode 100644 native/nls.c create mode 100644 native/quecalls.c create mode 100644 native/sesmgr.c create mode 100644 native/viocalls.c create mode 100755 tests/emx.dll create mode 100755 tests/hello.c create mode 100755 tests/helloc.exe diff --git a/lx_dump.c b/lx_dump.c index 3d9f20c..ac27eeb 100644 --- a/lx_dump.c +++ b/lx_dump.c @@ -62,6 +62,7 @@ static void parseExe(const char *exefname, uint8 *exe, uint32 exelen) { printf("%s\n", exefname); + const uint8 *origexe = exe; if (!sanityCheckExe(&exe, &exelen)) return; @@ -444,6 +445,33 @@ static void parseExe(const char *exefname, uint8 *exe, uint32 exelen) printf("%u: %s\n", (unsigned int) i+1, name); } + const uint8 *name_table; + + printf("Resident name table:\n"); + name_table = exe + lx->resident_name_table_offset; + for (uint32 i = 0; *name_table; i++) { + const uint8 namelen = *(name_table++); + char name[256]; + memcpy(name, name_table, namelen); + name[namelen] = '\0'; + name_table += namelen; + const uint16 ordinal = *((const uint16 *) name_table); name_table += 2; + printf("%u: '%s' (ordinal %u)\n", (unsigned int) i, name, (unsigned int) ordinal); + } // for + + printf("Non-resident name table:\n"); + name_table = origexe + lx->non_resident_name_table_offset; + const uint8 *end_of_name_table = name_table + lx->non_resident_name_table_len; + for (uint32 i = 0; (name_table < end_of_name_table) && *name_table; i++) { + const uint8 namelen = *(name_table++); + char name[256]; + memcpy(name, name_table, namelen); + name[namelen] = '\0'; + name_table += namelen; + const uint16 ordinal = *((const uint16 *) name_table); name_table += 2; + printf("%u: '%s' (ordinal %u)\n", (unsigned int) i, name, (unsigned int) ordinal); + } // for + #if 0 const uint8 *fixup_record_table = exe + fixup_record_table_offset; const uint8 *import_proc_table = exe + lx->import_proc_table_offset; diff --git a/lx_loader.c b/lx_loader.c index 2de3fdc..03f2762 100644 --- a/lx_loader.c +++ b/lx_loader.c @@ -8,19 +8,23 @@ #include #include #include +#include + #include "lx_loader.h" +static LxModule *GLoadedModules = NULL; + // !!! FIXME: move this into an lx_common.c file. -static int sanityCheckExe(uint8 **_exe, uint32 *_exelen) +static int sanityCheckLxModule(uint8 **_exe, uint32 *_exelen) { if (*_exelen < 196) { - fprintf(stderr, "not an OS/2 LX EXE\n"); + fprintf(stderr, "not an OS/2 LX module\n"); return 0; } const uint32 header_offset = *((uint32 *) (*_exe + 0x3C)); //printf("header offset is %u\n", (unsigned int) header_offset); if ((header_offset + sizeof (LxHeader)) >= *_exelen) { - fprintf(stderr, "not an OS/2 LX EXE\n"); + fprintf(stderr, "not an OS/2 LX module\n"); return 0; } @@ -30,7 +34,7 @@ static int sanityCheckExe(uint8 **_exe, uint32 *_exelen) const LxHeader *lx = (const LxHeader *) *_exe; if ((lx->magic_l != 'L') || (lx->magic_x != 'X')) { - fprintf(stderr, "not an OS/2 LX EXE\n"); + fprintf(stderr, "not an OS/2 LX module\n"); return 0; } @@ -40,7 +44,7 @@ static int sanityCheckExe(uint8 **_exe, uint32 *_exelen) } if (lx->lx_version != 0) { - fprintf(stderr, "Program is unknown LX EXE version (%u)\n", (unsigned int) lx->lx_version); + fprintf(stderr, "Program is unknown LX module version (%u)\n", (unsigned int) lx->lx_version); return 0; } @@ -62,7 +66,7 @@ static int sanityCheckExe(uint8 **_exe, uint32 *_exelen) // !!! FIXME: check if EIP and ESP are non-zero vs per-process library bits, etc. return 1; -} // sanityCheckExe +} // sanityCheckLxModule /* this algorithm is from lxlite 138u. */ static int decompressExePack2(uint8 *dst, const uint32 dstlen, const uint8 *src, const uint32 srclen) @@ -167,40 +171,23 @@ static int decompressExePack2(uint8 *dst, const uint32 dstlen, const uint8 *src, return 1; } // decompressExePack2 -void missing_ordinal_called(const char *module, const uint32 ordinal) +static void missingEntryPointCalled(const char *module, const char *entry) { fflush(stdout); fflush(stderr); - fprintf(stderr, "\n\nMissing ordinal '%u' in module '%s' called!\n", ordinal, module); + fprintf(stderr, "\n\nMissing entry point '%s' in module '%s' called!\n", entry, module); fprintf(stderr, "Aborting.\n\n\n"); //STUBBED("output backtrace"); fflush(stderr); _exit(1); } // missing_ordinal_called -static uint32 DosPutMessage(uint32 handle, uint32 msglen, const char *msg) +static uint32 generateMissingTrampoline(const char *_module, const char *_entry) { - // !!! FIXME: this isn't right, but good enough for now. - fwrite(msg, msglen, 1, stdout); - fflush(stdout); - return 0; -} // DosPutMessage - -static uint32 getModuleProcAddrByOrdinal(const LxHeader *lx, const char * const * const modules, const uint16 moduleid, const uint32 importid) -{ - if (moduleid == 0) { - fprintf(stderr, "uhoh, looking for module ordinal 0, which is illegal.\n"); - return 0; - } else if (moduleid > lx->num_import_mod_entries) { - fprintf(stderr, "uhoh, looking for module ordinal %u, but only %u available.\n", (unsigned int) moduleid, (unsigned int) lx->num_import_mod_entries); - return 0; - } // else if - - //fprintf(stderr, "importid == %u\n", (unsigned int) importid); - static void *page = NULL; static uint32 pageused = 0; static uint32 pagesize = 0; + if (pagesize == 0) pagesize = getpagesize(); @@ -213,28 +200,22 @@ static uint32 getModuleProcAddrByOrdinal(const LxHeader *lx, const char * const pageused = 0; } // if - // !!! FIXME: obviously, this is going to have to be more robust. - if (strcmp(modules[moduleid-1], "MSG") == 0) - { - if (importid == 5) - return (uint32) (size_t) DosPutMessage; - } // if - void *trampoline = page + pageused; char *ptr = (char *) trampoline; - const uint32 ordinal = importid; + char *module = strdup(_module); + char *entry = strdup(_entry); *(ptr++) = 0x55; // pushl %ebp *(ptr++) = 0x89; // movl %esp,%ebp *(ptr++) = 0xE5; // ...movl %esp,%ebp *(ptr++) = 0x68; // pushl immediate - memcpy(ptr, &ordinal, sizeof (uint32)); + memcpy(ptr, &entry, sizeof (char *)); ptr += sizeof (uint32); *(ptr++) = 0x68; // pushl immediate - memcpy(ptr, &modules[moduleid-1], sizeof (uint32)); + memcpy(ptr, &module, sizeof (char *)); ptr += sizeof (uint32); *(ptr++) = 0xB8; // movl immediate to %eax - const void *fn = missing_ordinal_called; + const void *fn = missingEntryPointCalled; memcpy(ptr, &fn, sizeof (void *)); ptr += sizeof (void *); *(ptr++) = 0xFF; // call absolute in %eax. @@ -247,13 +228,164 @@ static uint32 getModuleProcAddrByOrdinal(const LxHeader *lx, const char * const if (pageused % 4) // keep these aligned to 32 bits. pageused += (4 - (pageused % 4)); + printf("Generated trampoline %p for module '%s' export '%s'\n", trampoline, module, entry); + return (uint32) (size_t) trampoline; +} // generateMissingTrampoline + +static __attribute__((noreturn)) void runLxModule(const LxModule *lxmod, const int argc, char **argv) +{ + // !!! FIXME: right now, we don't list any environment variables, because they probably don't make sense to drop in (even PATH uses a different separator on Unix). + // !!! FIXME: eventually, the environment table looks like this (double-null to terminate list): var1=a\0var2=b\0var3=c\0\0 + // The command line, if I'm reading the Open Watcom __OS2Main() implementation correctly, looks like this... + // \0programname\0argv0\0argv1\0argvN\0 + size_t len = 0; + for (int i = 0; i < argc; i++) { + len += strlen(argv[i]) + 1; + } + + const char *tmpenv = "IS_2INE=1"; + const size_t envlen = strlen(tmpenv); + len += envlen; + len += 4; // null terminators. + + char *env = (char *) malloc(len); + if (!env) { + fprintf(stderr, "Out of memory\n"); + exit(1); + } // if + + strcpy(env, tmpenv); + char *ptr = env + envlen; + *(ptr++) = '\0'; + *(ptr++) = '\0'; + char *cmd = ptr; + strcpy(ptr, argv[0]); + ptr += strlen(argv[0]); + *(ptr++) = '\0'; + for (int i = 0; i < argc; i++) { + strcpy(ptr, argv[i]); + ptr += strlen(argv[i]); + *(ptr++) = '\0'; + } // for + *(ptr++) = '\0'; + + // ...and you pass it the pointer to argv0. This is (at least as far as the docs suggest) appended to the environment table. + printf("jumping into LX land...! eip=0x%X esp=0x%X\n", (unsigned int) lxmod->eip, (unsigned int) lxmod->esp); fflush(stdout); + + // !!! FIXME: need to set up OS/2 TIB and put it in FS register. + __asm__ __volatile__ ( + "movl %%esi,%%esp \n\t" // use the OS/2 process's stack. + "pushl %%eax \n\t" // cmd + "pushl %%ecx \n\t" // env + "pushl $0 \n\t" // reserved + "pushl $0 \n\t" // module handle !!! FIXME + "leal 1f,%%eax \n\t" // address that entry point should return to. + "pushl %%eax \n\t" + "pushl %%edi \n\t" // the OS/2 process entry point (we'll "ret" to it instead of jmp, so stack and registers are all correct). + "xorl %%eax,%%eax \n\t" + "xorl %%ebx,%%ebx \n\t" + "xorl %%ecx,%%ecx \n\t" + "xorl %%edx,%%edx \n\t" + "xorl %%esi,%%esi \n\t" + "xorl %%edi,%%edi \n\t" + "xorl %%ebp,%%ebp \n\t" + // !!! FIXME: init other registers! + "ret \n\t" // go to OS/2 land! + "1: \n\t" // ...and return here. + "pushl %%eax \n\t" // call _exit() with whatever is in %eax. + "call _exit \n\t" + : // no outputs + : "a" (cmd), "c" (env), "S" (lxmod->esp), "D" (lxmod->eip) + : "memory" + ); + + __builtin_unreachable(); +} // runLxModule + +static void freeLxModule(LxModule *lxmod) +{ + if (!lxmod) + return; + + // !!! FIXME: mutex from here + lxmod->refcount--; + printf("unref'd module '%s' to %u\n", lxmod->name, (unsigned int) lxmod->refcount); + if (lxmod->refcount > 0) + return; // something is still using it. + + if (lxmod->next) + lxmod->next->prev = lxmod->prev; + + if (lxmod->prev) + lxmod->prev->next = lxmod->next; + + if (lxmod == GLoadedModules) + GLoadedModules = lxmod->next; + // !!! FIXME: mutex to here + + for (uint32 i = 0; i < lxmod->lx.num_import_mod_entries; i++) + freeLxModule(lxmod->dependencies[i]); + free(lxmod->dependencies); + + for (uint32 i = 0; i < lxmod->lx.module_num_objects; i++) { + if (lxmod->mmaps[i].addr) + munmap(lxmod->mmaps[i].addr, lxmod->mmaps[i].size); + } // for + free(lxmod->mmaps); + + free(lxmod->exported_names); + free(lxmod->exported_ordinals); + + if (lxmod->nativelib) + dlclose(lxmod->nativelib); + + free(lxmod); +} // freeLxModule + +static LxModule *loadLxModuleByModuleNameInternal(const char *modname, const int dependency_tree_depth); + +static uint32 getModuleProcAddrByOrdinal(const LxModule *module, const uint32 ordinal) +{ + fprintf(stderr, "lookup module == '%s', ordinal == %u\n", module->name, (unsigned int) ordinal); + + const LxExportedOrdinal *expord = module->exported_ordinals; + for (uint32 i = 0; i < module->num_ordinals; i++, expord++) { + if (expord->ordinal == ordinal) + return expord->addr; + } // for + + #if 1 + char entry[128]; + snprintf(entry, sizeof (entry), "ORDINAL_%u", (unsigned int) ordinal); + return generateMissingTrampoline(module->name, entry); + #else + return 0; + #endif } // getModuleProcAddrByOrdinal +#if 0 +static uint32 getModuleProcAddrByName(const LxModule *module, const char *name) +{ + fprintf(stderr, "lookup module == '%s', name == '%s'\n", module->name, name); + + const LxExportedName *expname = module->exported_names; + for (uint32 i = 0; i < module->num_names; i++, expname++) { + if (strcmp(expname->name, name) == 0) + return expname->addr; + } // for + + #if 1 + return generateMissingTrampoline(module->name, name); + #else + return 0; + #endif +} // getModuleProcAddrByName +#endif static void doFixup(uint8 *page, const uint16 offset, const uint32 finalval, const uint16 finalval2, const uint32 finalsize) { - #if 0 + #if 1 if (finalsize == 6) { printf("fixing up %p to to 0x%X:0x%X (6 bytes)...\n", page + offset, (unsigned int) finalval2, (unsigned int) finalval); } else { @@ -279,9 +411,9 @@ static void doFixup(uint8 *page, const uint16 offset, const uint32 finalval, con } // switch } // doFixup -static void fixupPage(const LxHeader *lx, const char * const * const modules, const LxObjectTableEntry *obj, uint8 *page) +static void fixupPage(const uint8 *exe, LxModule *lxmod, const LxObjectTableEntry *obj, uint8 *page) { - const uint8 *exe = (const uint8 *) lx; // this is the start of the LX EXE (past the DOS stub, etc). + const LxHeader *lx = &lxmod->lx; const uint32 *fixuppage = (((const uint32 *) (exe + lx->fixup_page_table_offset)) + (obj->page_table_index - 1)); const uint32 fixupoffset = *fixuppage; const uint32 fixuplen = fixuppage[1] - fixuppage[0]; @@ -372,7 +504,13 @@ static void fixupPage(const LxHeader *lx, const char * const * const modules, co importid = (uint32) *((uint16 *) fixup); fixup += 2; } // else - finalval = getModuleProcAddrByOrdinal(lx, modules, moduleid, importid); + if (moduleid == 0) { + fprintf(stderr, "uhoh, looking for module ordinal 0, which is illegal.\n"); + } else if (moduleid > lx->num_import_mod_entries) { + fprintf(stderr, "uhoh, looking for module ordinal %u, but only %u available.\n", (unsigned int) moduleid, (unsigned int) lx->num_import_mod_entries); + } else { + finalval = getModuleProcAddrByOrdinal(lxmod->dependencies[moduleid-1], importid); + } // else break; } // case @@ -421,41 +559,74 @@ static void fixupPage(const LxHeader *lx, const char * const * const modules, co } // while } // fixupPage -static __attribute__((noreturn)) void loadExe(const char *exefname, uint8 *exe, uint32 exelen) +static LxModule *loadLxModule(uint8 *exe, uint32 exelen, int dependency_tree_depth) { + LxModule *retval = NULL; const uint8 *origexe = exe; //const uint32 origexelen = exelen; - if (!sanityCheckExe(&exe, &exelen)) - exit(1); + if (!sanityCheckLxModule(&exe, &exelen)) + goto loadlx_failed; const LxHeader *lx = (const LxHeader *) exe; - // !!! FIXME: recursively load all external dependencies from lx->import_module_table_offset, here. - char **modules = malloc(sizeof (char *) * lx->num_import_mod_entries); - if (!modules) { + retval = (LxModule *) malloc(sizeof (LxModule)); + if (!retval) { fprintf(stderr, "Out of memory!\n"); - exit(1); - } + goto loadlx_failed; + } // if + memset(retval, '\0', sizeof (*retval)); + retval->refcount = 1; + retval->dependencies = (LxModule **) malloc(sizeof (LxModule *) * lx->num_import_mod_entries); + retval->mmaps = (LxMmaps *) malloc(sizeof (LxMmaps) * lx->module_num_objects); + if (!retval->dependencies || !retval->mmaps) { + fprintf(stderr, "Out of memory!\n"); + goto loadlx_failed; + } // if + memset(retval->dependencies, '\0', sizeof (LxModule *) * lx->num_import_mod_entries); + memset(retval->mmaps, '\0', sizeof (LxMmaps) * lx->module_num_objects); + memcpy(&retval->lx, lx, sizeof (*lx)); + + if (lx->resident_name_table_offset) { + const uint8 *name_table = exe + lx->resident_name_table_offset; + const uint8 namelen = *(name_table++); + char *ptr = retval->name; + for (uint32 i = 0; i < namelen; i++) { + const char ch = *(name_table++); + *(ptr++) = ((ch >= 'a') && (ch <= 'z')) ? (ch + ('A' - 'a')) : ch; + } // for + *ptr = '\0'; + } // if + + const char *modname = retval->name; + printf("ref'd new module '%s' to %u\n", modname, 1); + + // !!! FIXME: apparently OS/2 does 1024, but they're not loading the module into RAM each time. + if (++dependency_tree_depth > 32) { + fprintf(stderr, "Likely circular dependency in module '%s'\n", modname); + goto loadlx_failed; + } // if const uint8 *import_modules_table = exe + lx->import_module_table_offset; for (uint32 i = 0; i < lx->num_import_mod_entries; i++) { const uint8 namelen = *(import_modules_table++); - // !!! FIXME: name can't be more than 127 chars, according to docs. Check this. - char *str = (char *) malloc(namelen + 1); - if (!str) { - fprintf(stderr, "Out of memory!\n"); - exit(1); + if (namelen > 127) { + fprintf(stderr, "Import module %u name is > 127 chars (%u). Corrupt file or bug!\n", (unsigned int) (i + 1), (unsigned int) namelen); + goto loadlx_failed; } - memcpy(str, import_modules_table, namelen); + char name[128]; + memcpy(name, import_modules_table, namelen); import_modules_table += namelen; - str[namelen] = '\0'; - modules[i] = str; + name[namelen] = '\0'; + retval->dependencies[i] = loadLxModuleByModuleNameInternal(name, dependency_tree_depth); + if (!retval->dependencies[i]) { + fprintf(stderr, "Failed to load dependency '%s' for module '%s'\n", name, modname); + goto loadlx_failed; + } // if } // for const LxObjectTableEntry *obj = ((const LxObjectTableEntry *) (exe + lx->object_table_offset)); for (uint32 i = 0; i < lx->module_num_objects; i++, obj++) { - if (obj->object_flags & 0x8) // !!! FIXME: resource object; ignore this until resource support is written, later. continue; @@ -467,17 +638,20 @@ static __attribute__((noreturn)) void loadExe(const char *exefname, uint8 *exe, ((obj->object_flags & 0x2) ? PROT_WRITE : 0) | ((obj->object_flags & 0x4) ? PROT_EXEC : 0); - const int mmapflags = MAP_ANON | MAP_PRIVATE | MAP_FIXED; void *base = (void *) ((size_t) obj->reloc_base_addr); + const int mmapflags = MAP_ANON | MAP_PRIVATE | MAP_FIXED; void *mmapaddr = mmap(base, vsize, PROT_READ|PROT_WRITE, mmapflags, -1, 0); // we'll mprotect() these pages to the proper permissions later. if (mmapaddr == ((void *) MAP_FAILED)) { fprintf(stderr, "mmap(%p, %u, RW-, ANON|PRIVATE|FIXED, -1, 0) failed (%d): %s\n", base, (unsigned int) vsize, errno, strerror(errno)); - exit(1); + goto loadlx_failed; } // if + retval->mmaps[i].addr = mmapaddr; + retval->mmaps[i].size = vsize; + const LxObjectPageTableEntry *objpage = ((const LxObjectPageTableEntry *) (exe + lx->object_page_table_offset)); objpage += obj->page_table_index - 1; @@ -508,18 +682,18 @@ static __attribute__((noreturn)) void loadExe(const char *exefname, uint8 *exe, src = origexe + lx->data_pages_offset + (objpage->page_data_offset << lx->page_offset_shift); if (!decompressExePack2(dst, lx->page_size, src, objpage->data_size)) { fprintf(stderr, "Failed to decompress object page (corrupt file or bug).\n"); - exit(1); + goto loadlx_failed; } // if break; case 0x08: // !!! FIXME: this is listed in lxlite, presumably this is exepack3 or something. Maybe this was new to Warp4, like exepack2 was new to Warp3. Pull this algorithm in from lxlite later. default: fprintf(stderr, "Don't know how to load an object page of type %u!\n", (unsigned int) objpage->flags); - exit(1); + goto loadlx_failed; } // switch // Now run any fixups for the page... - fixupPage(lx, modules, obj, dst); + fixupPage(exe, retval, obj, dst); dst += lx->page_size; } // for @@ -538,68 +712,131 @@ static __attribute__((noreturn)) void loadExe(const char *exefname, uint8 *exe, (prot&PROT_WRITE) ? "W" : "-", (prot&PROT_EXEC) ? "X" : "-", errno, strerror(errno)); - exit(1); + goto loadlx_failed; } // if - } // for // All the pages we need from the EXE are loaded into the appropriate spots in memory. - //printf("mmap()'d everything we need!\n"); + printf("mmap()'d everything we need!\n"); - uint32 eip = lx->eip; + retval->eip = lx->eip; if (lx->eip_object != 0) { const LxObjectTableEntry *targetobj = ((const LxObjectTableEntry *) (exe + lx->object_table_offset)) + (lx->eip_object - 1); - eip += targetobj->reloc_base_addr; + retval->eip += targetobj->reloc_base_addr; } // if // !!! FIXME: esp==0 means something special for programs (and is ignored for library init). - uint32 esp = lx->esp; - assert(esp != 0); + // !!! FIXME: "A zero value in this field indicates that the stack pointer is to be initialized to the highest address/offset in the object" + retval->esp = lx->esp; if (lx->esp_object != 0) { // !!! FIXME: ignore for libraries const LxObjectTableEntry *targetobj = ((const LxObjectTableEntry *) (exe + lx->object_table_offset)) + (lx->esp_object - 1); - esp += targetobj->reloc_base_addr; + retval->esp += targetobj->reloc_base_addr; } // if - // !!! FIXME: right now, we don't list any environment variables, because they probably don't make sense to drop in (even PATH uses a different separator on Unix). - // !!! FIXME: eventually, the environment table looks like this (double-null to terminate list): var1=a\0var2=b\0var3=c\0\0 - // The command line, if I'm reading the Open Watcom __OS2Main() implementation correctly, looks like this... - // \0programname\0argv0\0argv1\0argvN\0 - static char *env = "TEST=abc\0\0hello.exe\0hello.exe\0\0"; - char *cmd = env + 10; // !!! FIXME + // module is ready to use, put it in the loaded list. + // !!! FIXME: mutex this + if (GLoadedModules) { + retval->next = GLoadedModules; + GLoadedModules->prev = retval; + } // if + GLoadedModules = retval; - // ...and you pass it the pointer to argv0. This is (at least as far as the docs suggest) appended to the environment table. - //printf("jumping into LX land...! eip=0x%X esp=0x%X\n", (unsigned int) eip, (unsigned int) esp); fflush(stdout); + return retval; - // !!! FIXME: need to set up OS/2 TIB and put it in FS register. - __asm__ __volatile__ ( - "movl %%esi,%%esp \n\t" // use the OS/2 process's stack. - "pushl %%eax \n\t" // cmd - "pushl %%ecx \n\t" // env - "pushl $0 \n\t" // reserved - "pushl $0 \n\t" // module handle !!! FIXME - "leal 1f,%%eax \n\t" // address that entry point should return to. - "pushl %%eax \n\t" - "pushl %%edi \n\t" // the OS/2 process entry point (we'll "ret" to it instead of jmp, so stack and registers are all correct). - "xorl %%eax,%%eax \n\t" - "xorl %%ebx,%%ebx \n\t" - "xorl %%ecx,%%ecx \n\t" - "xorl %%edx,%%edx \n\t" - "xorl %%esi,%%esi \n\t" - "xorl %%edi,%%edi \n\t" - "xorl %%ebp,%%ebp \n\t" - // !!! FIXME: init other registers! - "ret \n\t" // go to OS/2 land! - "1: \n\t" // ...and return here. - "pushl %%eax \n\t" // call _exit() with whatever is in %eax. - "call _exit \n\t" - : // no outputs - : "a" (cmd), "c" (env), "S" (esp), "D" (eip) - : "memory" - ); +loadlx_failed: + freeLxModule(retval); + return NULL; +} // loadLxModule - __builtin_unreachable(); -} // loadExe +static LxModule *loadLxModuleByPathInternal(const char *fname, const int dependency_tree_depth) +{ + const char *what = NULL; + uint8 *module = NULL; + uint32 modulelen = 0; + FILE *io = NULL; + // !!! FIXME: locate correct file (case-insensitive checking, convert '\\' to '/' etc)... + + #define LOADFAIL(x) { what = x; goto loadmod_failed; } + + if ((io = fopen(fname, "rb")) == NULL) LOADFAIL("open"); + if (fseek(io, 0, SEEK_END) < 0) LOADFAIL("seek"); + modulelen = ftell(io); + if ((module = (uint8 *) malloc(modulelen)) == NULL) LOADFAIL("malloc"); + rewind(io); + if (fread(module, modulelen, 1, io) != 1) LOADFAIL("read"); + fclose(io); + + #undef LOADFAIL + + LxModule *retval = loadLxModule(module, modulelen, dependency_tree_depth); + free(module); + return retval; + +loadmod_failed: + fprintf(stderr, "%s failure on '%s: %s'\n", what, fname, strerror(errno)); + if (io) + fclose(io); + free(module); + return NULL; +} // loadLxModuleByPathInternal + +static inline LxModule *loadLxModuleByPath(const char *fname) +{ + return loadLxModuleByPathInternal(fname, 0); +} // loadLxModuleByPath + +static LxModule *loadNativeReplacement(const char *fname) +{ + // !!! FIXME: mutex this. + void *lib = dlopen(fname, RTLD_LOCAL | RTLD_NOW); + if (lib == NULL) + return NULL; + + LxNativeReplacementEntryPoint fn = (LxNativeReplacementEntryPoint) dlsym(lib, "loadNativeLxModule"); + if (!fn) { + dlclose(lib); + return NULL; + } // if + + LxModule *retval = fn(); + if (retval) { + printf("Loaded native replacement library '%s' (%u exports).\n", fname, (unsigned int) retval->num_ordinals); + retval->nativelib = lib; + } // if + + return retval; +} // loadNativeReplacement + +static LxModule *loadLxModuleByModuleNameInternal(const char *modname, const int dependency_tree_depth) +{ + // !!! FIXME: mutex this + for (LxModule *i = GLoadedModules; i != NULL; i = i->next) { + if (strcasecmp(i->name, modname) == 0) { + i->refcount++; + printf("ref'd module '%s' to %u\n", i->name, (unsigned int) i->refcount); + return i; + } // if + } // for + + // !!! FIXME: decide the right path to the file, or if it's a native replacement library. + char fname[256]; + snprintf(fname, sizeof (fname), "%s.dll", modname); + LxModule *retval = loadLxModuleByPathInternal(fname, dependency_tree_depth); + if (!retval) { + snprintf(fname, sizeof (fname), "native/%s.so", modname); + for (char *ptr = fname; *ptr; ptr++) { + *ptr = (((*ptr >= 'A') && (*ptr <= 'Z')) ? (*ptr - ('A' - 'a')) : *ptr); + } // for + retval = loadNativeReplacement(fname); + } // if + return retval; +} // loadLxModuleByModuleNameInternal + +static inline LxModule *loadLxModuleByModuleName(const char *modname) +{ + return loadLxModuleByModuleNameInternal(modname, 0); +} // loadLxModuleByModuleName int main(int argc, char **argv) { @@ -608,36 +845,12 @@ int main(int argc, char **argv) return 1; } - const char *exefname = argv[1]; - FILE *io = fopen(exefname, "rb"); - if (!io) { - fprintf(stderr, "can't open '%s: %s'\n", exefname, strerror(errno)); - return 2; - } - - if (fseek(io, 0, SEEK_END) < 0) { - fprintf(stderr, "can't seek in '%s': %s\n", exefname, strerror(errno)); - return 3; - } - - const uint32 exelen = ftell(io); - uint8 *exe = (uint8 *) malloc(exelen); - if (!exe) { - fprintf(stderr, "Out of memory\n"); - return 4; - } - - rewind(io); - if (fread(exe, exelen, 1, io) != 1) { - fprintf(stderr, "read failure on '%s': %s\n", exefname, strerror(errno)); - return 5; - } - - fclose(io); - - loadExe(exefname, exe, exelen); - - free(exe); + const LxModule *lxmod = loadLxModuleByPath(argv[1]); + if (lxmod) { + argc--; + argv++; + runLxModule(lxmod, argc, argv); + } // if return 0; } // main diff --git a/lx_loader.h b/lx_loader.h index 7396b67..8993765 100644 --- a/lx_loader.h +++ b/lx_loader.h @@ -3,7 +3,10 @@ #define _GNU_SOURCE 1 +#include +#include #include +#include typedef uint8_t uint8; typedef uint16_t uint16; @@ -89,6 +92,83 @@ typedef struct LxResourceTableEntry #pragma pack(pop) + +typedef struct LxMmaps +{ + void *addr; + size_t size; +} LxMmaps; + +typedef struct LxExportedOrdinal +{ + uint32 ordinal; + uint32 addr; +} LxExportedOrdinal; + +typedef struct LxExportedName +{ + char name[128]; // !!! FIXME: allocate this. + uint32 addr; +} LxExportedName; + +struct LxModule; +typedef struct LxModule LxModule; +struct LxModule +{ + LxHeader lx; + uint32 refcount; + char name[256]; // !!! FIXME: allocate this. + LxModule **dependencies; + LxMmaps *mmaps; + uint32 num_ordinals; + LxExportedOrdinal *exported_ordinals; + uint32 num_names; + LxExportedName *exported_names; + void *nativelib; + uint32 eip; + uint32 esp; + LxModule *prev; // all loaded modules are in a doubly-linked list. + LxModule *next; // all loaded modules are in a doubly-linked list. +}; + +typedef LxModule *(*LxNativeReplacementEntryPoint)(void); + +// !!! FIXME: this is nasty for several reasons. +#define NATIVE_REPLACEMENT_TABLE(modname) \ + LxModule *loadNativeLxModule(void) { \ + LxModule *retval = (LxModule *) malloc(sizeof (LxModule)); \ + if (!retval) goto loadnative_failed; \ + memset(retval, '\0', sizeof (LxModule)); \ + retval->refcount = 1; \ + strcpy(retval->name, modname); \ + +#define NATIVE_REPLACEMENT(fn, ord) { \ + void *ptr = realloc(retval->exported_names, (retval->num_names+1) * sizeof (LxExportedName)); \ + if (!ptr) { goto loadnative_failed; } \ + retval->exported_names = (LxExportedName *) ptr; \ + strcpy(retval->exported_names[retval->num_names].name, #fn); \ + retval->exported_names[retval->num_names].addr = (uint32) ((size_t) fn); \ + retval->num_names++; \ + ptr = realloc(retval->exported_ordinals, (retval->num_ordinals+1) * sizeof (LxExportedOrdinal)); \ + if (!ptr) { goto loadnative_failed; } \ + retval->exported_ordinals = (LxExportedOrdinal *) ptr; \ + retval->exported_ordinals[retval->num_ordinals].ordinal = ord; \ + retval->exported_ordinals[retval->num_ordinals].addr = (uint32) ((size_t) fn); \ + retval->num_ordinals++; \ + } + +#define END_NATIVE_REPLACEMENT_TABLE() \ + return retval; \ + \ + loadnative_failed: \ + if (retval) { \ + free(retval->exported_ordinals); \ + free(retval->exported_names); \ + free(retval); \ + } \ + return NULL; \ + } + #endif // end of lx_loader.h ... diff --git a/make.sh b/make.sh index 17c9130..ffda5b1 100755 --- a/make.sh +++ b/make.sh @@ -10,7 +10,18 @@ # 32-bit Linux totally lets me have that space, though. :) #clang -pagezero_size 0x1000 -image_base 0x100000000 -Wall -O0 -ggdb3 -o lx_loader lx_loader.c && ./lx_loader ./cmd.exe -gcc -std=c99 -Wall -O0 -ggdb3 -o lx_dump lx_dump.c && -gcc -m32 -std=c99 -Wall -O0 -ggdb3 -o lx_loader lx_loader.c && -./lx_dump tests/hello.exe && +set -x +set -e + +gcc -m32 -std=c99 -Wall -O0 -ggdb3 -fPIC -shared -Wl,-soname,msg.so -o native/msg.so native/msg.c +gcc -m32 -std=c99 -Wall -O0 -ggdb3 -fPIC -shared -Wl,-soname,doscalls.so.so -o native/doscalls.so native/doscalls.c +gcc -m32 -std=c99 -Wall -O0 -ggdb3 -fPIC -shared -Wl,-soname,nls.so -o native/nls.so native/nls.c +gcc -m32 -std=c99 -Wall -O0 -ggdb3 -fPIC -shared -Wl,-soname,quecalls.so -o native/queecalls.so native/quecalls.c +gcc -m32 -std=c99 -Wall -O0 -ggdb3 -fPIC -shared -Wl,-soname,viocalls.so -o native/viocalls.so native/viocalls.c +gcc -m32 -std=c99 -Wall -O0 -ggdb3 -fPIC -shared -Wl,-soname,kdbcalls.so -o native/kbdcalls.so native/kbdcalls.c +gcc -m32 -std=c99 -Wall -O0 -ggdb3 -fPIC -shared -Wl,-soname,sesmgr.so -o native/sesmgr.so native/sesmgr.c + +gcc -std=c99 -Wall -O0 -ggdb3 -o lx_dump lx_dump.c +gcc -m32 -std=c99 -Wall -O0 -ggdb3 -o lx_loader lx_loader.c -ldl +./lx_dump tests/hello.exe ./lx_loader tests/hello.exe diff --git a/native/doscalls.c b/native/doscalls.c new file mode 100644 index 0000000..bdb9d04 --- /dev/null +++ b/native/doscalls.c @@ -0,0 +1,7 @@ +#include "../lx_loader.h" + +NATIVE_REPLACEMENT_TABLE("doscalls") +END_NATIVE_REPLACEMENT_TABLE() + +// end of doscalls.c ... + diff --git a/native/kbdcalls.c b/native/kbdcalls.c new file mode 100644 index 0000000..479773b --- /dev/null +++ b/native/kbdcalls.c @@ -0,0 +1,7 @@ +#include "../lx_loader.h" + +NATIVE_REPLACEMENT_TABLE("kbdcalls") +END_NATIVE_REPLACEMENT_TABLE() + +// end of kbdcalls.c ... + diff --git a/native/msg.c b/native/msg.c new file mode 100644 index 0000000..23c36ce --- /dev/null +++ b/native/msg.c @@ -0,0 +1,16 @@ +#include "../lx_loader.h" + +static uint32 DosPutMessage(uint32 handle, uint32 msglen, const char *msg) +{ + // !!! FIXME: this isn't right, but good enough for now. + fwrite(msg, msglen, 1, stdout); + fflush(stdout); + return 0; +} // DosPutMessage + +NATIVE_REPLACEMENT_TABLE("msg") + NATIVE_REPLACEMENT(DosPutMessage, 5) +END_NATIVE_REPLACEMENT_TABLE() + +// end of msg.c ... + diff --git a/native/nls.c b/native/nls.c new file mode 100644 index 0000000..c4c8631 --- /dev/null +++ b/native/nls.c @@ -0,0 +1,7 @@ +#include "../lx_loader.h" + +NATIVE_REPLACEMENT_TABLE("nls") +END_NATIVE_REPLACEMENT_TABLE() + +// end of nls.c ... + diff --git a/native/quecalls.c b/native/quecalls.c new file mode 100644 index 0000000..33271aa --- /dev/null +++ b/native/quecalls.c @@ -0,0 +1,7 @@ +#include "../lx_loader.h" + +NATIVE_REPLACEMENT_TABLE("quecalls") +END_NATIVE_REPLACEMENT_TABLE() + +// end of quecalls.c ... + diff --git a/native/sesmgr.c b/native/sesmgr.c new file mode 100644 index 0000000..b2b3d16 --- /dev/null +++ b/native/sesmgr.c @@ -0,0 +1,7 @@ +#include "../lx_loader.h" + +NATIVE_REPLACEMENT_TABLE("sesmgr") +END_NATIVE_REPLACEMENT_TABLE() + +// end of sesmgr.c ... + diff --git a/native/viocalls.c b/native/viocalls.c new file mode 100644 index 0000000..fe53863 --- /dev/null +++ b/native/viocalls.c @@ -0,0 +1,7 @@ +#include "../lx_loader.h" + +NATIVE_REPLACEMENT_TABLE("viocalls") +END_NATIVE_REPLACEMENT_TABLE() + +// end of viocalls.c ... + diff --git a/tests/emx.dll b/tests/emx.dll new file mode 100755 index 0000000000000000000000000000000000000000..342b073f5970356ae63d199ff3ac92a6d3629736 GIT binary patch literal 91198 zcmeFadwf(y(l_4S=bSlbX3oq62pBNnpg|xY5^g3yB$**x6flr*QMn4ifZT+cfC`v6 zK^ewiR8(|vMNt=B9z{inEK0a6LB%zTsI1~HDB_7hHwt2e$h_a`nS|&A`#kSIzt8)} zkB=vPy1Tlny1Kf$y1LIe@)pJ}V~nYIqEUk}ffxMCl7Ij6pJG(Iuh{NpTkIcntl%R) z=$KzPYms-s!uhu^oHo}xecHTv^8?=73cL%0^Sra>d8c^?-<0QFRIq5#toieLxLl4D z#zstt(GZM-v|zSkmem?X#71&rtWN$-V9bt}<*Bi zn~L`eJg;_V%!d3wk;;EP;^_>|u8+Se@$`S2JSqV>)4(IK(a6e@-t;Dz=8g5Iu{$Tn zQUjGKJsE35ukn9|mtHh>71HMAR7wJoc;j+lNLx@j(zfxmV?6B|Pt)RQMm)`qr^Dmv z=y-Z_Je?L#XT{Sy3`N-RtLHXgMhUatUpx55L@^4D(r^YgA{qk?>-AjpO@`sHb zbz_=_(NhGIBcxa$tE}(InX-odY@$Ew<}!8{;{>y#74e0CSK{%a16B*7xd1< zSOa7?t|enFF)(#dxODJPPP2*6n1xy^}2G8QWfEy*u&A;waBKV2X`jdJ~R?m57rYM#E zEHTh{*wLBw6_vJtSR$5+2gO?Pyx1ri)wL592Q5!QE^;Y;-sh( zr$xPJKp$1bP)sFJNmjf{iqc)_sq|6Om4Ql@GE7;iJgAf_Ym{}$MrD(-S=pjgC_5CL ztq~$i)mbrQWYgJ7LsU9+mTVW5E}hM=3+B<;5~l1OtFwMw4CXp3RK#Eng^Jj#b!I}S z?ls0{LubbgvDegDf?brN=>)sj>jrkaP!n{v7da$Bms0A}**YQifmUy(?Dy;JX|5Oy zh?HTzUZMvO%@JZh7)w&bN-!2c0&?pWF$`^<=Zb^rtc@<-NA4l6n8=k1VFEH=5eJZ{ zb}<4B3`7D3R@%h@bm4KXxIsiw5-@fC$hM-@a;8+HSH(h9gId54x#;*(LzE*~kDOCy zn+#En0Q?K=A{Y3dM}iJ+wu^Ekhfvo-XSX^<^<bl0>^$1DsyFID}*=a=^LPE)s!^Ih8};bAb?_C?uu{ zzV}%rFsu|J3Ha6vF#*Y5U0Dkvg@!n6*V%r%IEL?q86f$R?G z$~rVCHpDt~_(4M)L1Ng&L@W}kduZuj-&xO;0@Tt3<%>vyEu+yon53P&^TKDU)Xql5A?B85ryc_G(!}U z@)*JbwZV2#2r|WXu@S8f*oB2wLOGc~njOK|&lF;gKsge~XM`d)A(^3w?vT#{Ma)4` ziX6~xF~mu*R&9tm;3>&2Hi4%UyEuuYk6m;Jkxh0n2c5W+DVs4)ll^p^-C0A2eWg(FYVvy9gjDw~N#0#(ET@ z-A<-dfY3xm)PvAcBw%-mA(nvNIzyy`-P4As2bMW@k&brNc2O_8pYFTM@c>3mQ7Zh8 zIX5^r1M~`*Mn4tp7@Nw5v5z2~93dJY*aSr^1%X^e>_DPMnmjCs|rIjAUR}+ zrJ&QrE*ijQx?K!J_lDWUQY1@|fOx50?C==;1|0^_C>bDx-h~U^f=|_6GmMf~UHtC` zpJ?!QsQgstUy*72dX@6BLQr@d=?;TORo)90^tg?ua~j5C-%;&#$c*bSoSoT?qWFpi zCo@&kFikVTOf-|sWYcS=m|e{7W>2$^nQjg=v&_NfFmr^NYv!91%!%eybB0-H&M_C5 z0dtAD)GRhj%?HhLbB(#qeBRt>ZZbEUTg(b`hgoUvHTRp<<{|U2dBi+w9ycxXq*-U4 zHtWp>Q*{}x1Xq$P+2wVmxVpG{y85`XT*F)=T)B|RV3%MWboP!*sl=GA=EC2CdN9~G zPMfNe*h_t%+rG8=(3^w0P}|5#*2)+|<86w;SLm$2N7)NI`4N(_R6WeM+9*QxV23c; z$pUtV;}wiXx=ZYDkHL2-`$21xM-0DQXJ6~W*+ysYxs(Ga%vYr?`h%`i1Lay%Y*SI&h&$ty-d@Zm<669K+ zOTQAGXwa3zpu=2Z0#JT0ly*?4FI43S$W>^t9Xe}EmIrObk+$dTJ)pD)OfeB`Jf|r~ zF`5E)LQTOe~)Ii3H$+DYrJ9oC5PidH9-Qwo*W=YOrX)JnA1(e$iMS%NmIA*bhi zNWk?er>Ms$tTaXX6~yii{|NOdwNk&s9>8orpeX}M6v|THkG4CZ4+7KhpGHqqb$5v! z?P(I^@a@V;IUR=ZjoKR;l?~%Rs!wYMH#9yR6Jv{=PoT-dZ|2kO$Lt1w!@+Nn1>Lx= zuR*~*3h#jeh4~vPJIpSZ`2l8iZ%ve>=xmTG zd{>dC?j4)P7Qyi$Fow3TOavk4hKr;#72=eWMcbLzaFPp!ZX|A_iUEMw0#qPE4 zm)s{|n10d3GbuE9>sgMy#JpJ49b8&Y&_egi1dzL%we%Ae!oA7U9e$UIE&ddSTOJP1%!0uzOu@j8L>P_JDAUZoV zwVmoW3(VDKH&>=>h0Ai?indN=Gy8*WyRF(*rmxpG>Id|%_3!jnMt1{vMX#&&DfNoZ zMw`%Io$WS6U$Fl&hnf=E`uqfSIL3K_s-&YpgT5|N|K`eZ-|o2!+z2I|U1sZGBS}@T z_iStQkMs_N7s_gi;R3Uaw3P}5vaYstEDi(RP-oJzp?r$^FXM7YOji>`x}ehGJgmNL z-{3Gxwrh&rD4C`!PJ$T4e=x2AtjTZUpY#3V3gv#~b>$z*cH4u-Ec?s$`y8L4&F3~H z!Qk^%o+LHHdE0W^(-7VdHj&qlhGC8G8vZwBk*NUuSLaTkNE6*LO0Pj912A0xvuS-+9$S&s5Epj zQPNu9_OG@N!KR`dZEM*^=wngYK^M36)7c75q)3>J>}vK3COItEO9KewCWHiDK*2z4 zs-)ta^k<4fj6W>H$=*8CP4U_Q_+d7Y4*m@#o&TVp)h{#BjZwyUW0~=oVQ`0&mVe&S z;5w4$9MBMhS2$qE41S{nn$ZOnH}OMamim@DSev44)jo97=v|J{d)RH1WU6W>gQpAL z4UWRS20v-=92f77b{cHjJ>n&7h=!`2VQ>tL^H%Ypn4xY_2WhWq4%d5fmSypYu2Rh6 zA}qyzolSQs*>G}ZxfCCg1un&py0JwfMv8qC`R_AR5@ex36v=XT^xrLL3R-rk;SzutbUeYJg? zeW!i8Gwi&>^Ac)>ve`G^{iIuG86FrK7!0OtLAM5T5dedVa=KG%`vQ9vY(=J1IgK8q zagmN10h3X}zi<)3`c5hK9Q$MT+0KO?on7lx>f2J&`uwe~uAbf~`q%|CqqBS6a+S2% zU^{g74-*zcXK*HVfZ%eMST@4oZ!)L?4Sqg!L`lx1qu^9V#QSWIUb>*&QMnRY~nsqBW5a3DBmjy z>Q9(=)7{E&u#gLP2{1w#;p-`G5STO`@gUlkdxRUwFptPZ@>ebrN0aA}@B5V(iPhLl z>uQQx13b(l)&OFqMcm{-CuOE>yn*%6Bhmo7*&|L(q1r8ew zkMP&{3_BJykH|pnMvwRfZH3a%bu^#Lu@CZyWhh_o5z#3IALrr>^Y|h1OAH?37(Ih8 zbn&)GKH~hjxV`?_J-}m>JmieUKWcx~6JQu__wc&`HViHbl98M*Me-o$%Q$IIrGK;7 zr}soJmLdZY?e-wpqq8axXN(vc>>KTxi-GoXu^)X`6eBf{FX!u_Z#jx|XBF(h|Ezyv z>_B(w1dJ;|9rl-sO}5p5`m+ZcYMtGH3F-$zv2N}U?!K54u#jU{i8pMI1E!N(I;JXS z?Rm{%OTxwi-kwKEfzRUL;!jfOC;e*?g=wK(VM~Kpd%2~pR7Bn6%Xy*NOFBYz`GZ{p zFw49SaeA`O6pz?4PiHqN;tX>A?b2WLyD??tOgJ~k;5RdA8U;_}FFLO_jgn8C{0jq% zB%jP_x%*e4yVPy)p^V=Kv90F(N=%dI1^>$6UI$N+FehBbowV3uaWr@>!+L1&M;s6m zcA!G~ajTfHEr5pTVpy;xB-tjUPUUN) zQ>ZG5sdw=b{$KoUjJS$<^{K<=?C7cm_G3&WEuc|ON?pJkP%Xsaw{LZa3swUxb>o!(CR7h$SnMmm%^=!}k;wbS7;`o?EWQy!$xwcTYp-BG z+zSrI=kU~18E=IVI_SWdcPUZ%(Pbi69cOd9jFRs)vVXZ6|H&xnY4Wq!ZDDu08m7lB zijkbNiTm&G%sOBIdtxd+!9V0jct?0Ve2+kM`Bz2`RRh|(VOta>$^16>!Z?#JwNivtg#vm*B)uRF!v1)WXO#iJmm zU`yD7wPSwPnYF;^4dQ>{pYn+EC*>ja3-w{gD-M^lqqEHYmis5ntD8N~V(@zE;t3!f z=oV{%ltM^b_0w3-T8WhM?(UxMKJIjPmV2;!n0tgf*PZX4;GXE7>Ym{)bkA`wa0lE= zKt91OtkvYE&GD7;ulWt)1@R^JFnti;{7xZGH?3CPhT8;avRiZq9S=tDI^IPTh@X`e z4(=>)-sybZ`FCf%^Q0Mat#!Q#jhlsq4+Cw(pytAEZB-snw>eUsq+TWg*`O69Z7qGyU|>O zDx6~1^0mCR_(e7NRy+4dYni}rvb|t~dDNg927lZMXVl<7*`;ng&Y&9xzfDAMTGDl(q(v73Kpl#Fun&yAAK4t~TaS#0nxjgoE}9PW~K8b4)}4AJ;m zqvVW@pEpWALZk&EzlU4f0*Z78Yt08ijn4C%#2W}Zx574TyOOE4wB2v}%+}Vu z8gqcurLFk}jAB$3tJWX_p~5?&)g<4ylmEg$6b|Jz42pmmO;rx!O~bIg&Aw-;{864D zIx`o>W+5BG@8BQsabml8K^d&JwUyb9*}U$@B!w;hmAt-@f!<@xB+L2Kg zhY5ZZI{`zz+Tas(o+;;j=?m?g6cPKYDsrAD7FPONiWMrRjzg?`0S<^NMxh)bhOwLZ zTYMKURmzmdz@iN-wG|JlFTf%FK&^o|Y+}g^pV(?_x7))G4LePpwRB6H{hBHUK5y_} zWQdE;Ft}fi;Sm0g>ma7>VUswT;U?FWU*?7@1KsB$>ov>-hhT5Z)oU+u>0Fc|sZ)fy z1-ngz&bNbOQM%o5nAm!3HQ}66!TxRQu-iiz64rM+!Z%!)ucNg?i~z1=E~VxTt%L#<*wdEB3AS@9mn~ zMKjhR>cDLmhX{bN?hdhK2eqs4-;RjyGT2*PRJ?BR1i8QK4k`74oR})oA&cjAv7|zp z`-aUlxd(1Jjh$@+>6BRdw(7`&b$wWqTZ~(su)E|u4#sZt&nms;@Lz1Lbb1@gor+)X z3WxE_MS*-9&c7CSVXAF#fVRO0JLQa?-M)6cfT}YZ_9Ij>NN8NaJ4ey5t#|y z_PHo>fFpubuj4DntL8_Ng^ArhaXkd?rr4z)r72TW+c|0+x0o}{e@cL<-Tvk(l?{)l z_I3<(yy-XvypKDT8L7nFjBf9^=Ar%1s@S+&XWKnWp)Bv7>SbN9?kMoJwmRQ5u_1Ef{T@Y>u(cr+b@|7fsZxpyy1nF1lC=7yZnLj;zU2DW4M*20PQOQhr}Jx_ zeI#I@+gX@V4$b`bsa)I;`-&LY{F`uv}q z*MpPxrgW)=vZUKqR|Y5|pwg{}dotb>Wnk*x?3aGShPX=FS zU_BtkZ^xaE3>j=m=I4wX?Nm0IzvzAwq4_N~c#l+YC13410T+F|LLrq_3jfw9Db&er z?82exG_aL}uHr?uTlDF$1&AE_viQH$E3`jp*V^FzXiD(_>`nHB*hWT1d2ql#G#ko=a$t~6ZwXuX zrKYS#%UVq-M{-(I9vMK@`M#U@T6p%qB5Z>4K3q(whEs176F#Bp!~T~M*^x($N1!qe zW!)f?f5$a34kxTD#KYntRo6ZSNkmHqM8rMnNst=Al%oLFm8rfzv%PGQ`w90Go)6#o?wpqXNxSg1as{;Gb6;M>o{zBu~D>+W3`N>!QRdz5uo1}h_F zXPzIVD|xbmg}(1t3S1tiveEZ5JIa&AjpAi7UVTNi)Gpd?{Z~L~%Em!gDVw#uTBdCX z+GC49=u@2fwo$Lf`jxE9y&q1G=6y1KQht5{rYwgH?NXB*M9$q=MYe><)S+{qpi7*{fiw} zw`-R{(@L>Y0+|EuW`9=Ay7JXpPunuvkG7ZfurU)oTEN8?DVZ%}7kl0YqIC$o01*xz z202|FTmxPAxe#*TqTyH<_(j?L9@jc-&i?6&y1ede_igTw`+4_Y-6!0-r;BH}XSOHe z+2r}a^Sy_ryN|Dj_iyk{3f4+07{aTR+YnOy#t>K!k7-ygsrW`dPz*-FBpV+AoAS7Z zZMwnNQ{2|zPdMamf4GWBDFNs4TD2bx5}BOk{3)2CIvbw|!2O(ez~*$f4OWF~4tb!r z*De=Ghmw^|6JV+cXv?)y?HO&hZILYkl~)v&?T14)NvbmQz3qsgzw=yT_cK`j>#{6H;+W#1wm)>hbbw#=a#4BF&S3?GflN}tnts}q4(hm80nd&CV5G$;@H z`rGns_u3w|JwjUK5(j{NAwqlE@SKGB+Yg9)dBja1vdN{CqwrC;QjKJ>TeLvoXhj_S z5gv^y4xW;szBQ=Z;#LkJxtob`bvk>^B|Zht?_J7T6n^Yh4kMY2z!2zT|C4>tamKAP zk6T%X^0jW!9%v7`#6QvIUWAAw)Oz1t{4r@Vre>$86V$ot%j!P$fcll%O6!1mGzb&t zGLLc;7}7n;aU=-O%s^8`Da^iIeN9aR0M0%({sh0%t!xCqTW-+>ly1hM8FI6P_!eE= zzF@NSQC5{0K+;(KuMnOpQgVNexyrwHSMZ020)d>F#~144#?>+KS+0WQ%kPMt%a z#OZ$zvQ3aiZ;S7Jqa{pq8z$==M&^^h$-2IHZ(tXS=JXd)JdkQ@Fd;a9v@2SDu7!7Y6 zm~nzvk7T4vyak5(y2Uv#QuxF+(gAC1N$oW-I9!C!8fR==Qrz z?17Z7Kv)`GDgt#BrZ9286qez;f+fQ24&=&yVA7S9*}ZYE!KSoS?!s>0kKQFi=?5yK zlqKq&+7pOfO~$38bNU8jr_ly6j+gEGZ~%LQ<8{a199ho$otMKSbGRnC`nn%>-vd*t zVE+814Yz#`TXi$;+JN|EY&L$?*(l5!ki<&uJEz@&xt7DkYH<236V*uI>6N4Ua+vB_ zYMHtTCpBgICVi{%xzW`=)c!Ui9odd42r(UXEOY+JImvw39PRppYlZu`d!Z-nIfv2w z76%{b^C`QWGW8BQWo9DY1N4irkfToL;$O&R;pPc)JDpPZry;nG+)D_nBYA*{mjQAg zjxN9tZ98?`sv4yq({%`Lt4r$m2He~LYznL~rP;zommQ*RQvZa_ig-npECc;b;kV&WNTLfIDg=d6$p2I?A&Rdb@`yjh_y1Y63nOCzu}djy-yRJaQuKvW!(_*DL^CwXY#nwf$n5;aUNY)n7Frrq6FFe ztSb=*p`?*Mp6TA`ZdJ0;!;vTFaWean&38tedz`IGGCUk^;pZ+GXK11wYO1rx45@-| z(+w^(T!#@n@rp`h(SW{ZJ zOy5a3H#ZoQ&nd${eMWHe7p4`$8LOyTkSm+iBa) z`eMBmz}q3}1f)+np&}%zMBfk`(5`dq3DqvKwtY-gNxoXwD2&h>2nhm8D9JvXdkPBf z;4vdm9HXmB^qd4Y?};fw4G zHj&q3S2{*Jp#^Ne+KTlQXG}Rt_+W9Trr92~wbP%`ueRR@8;XMhGM@e6F(5H@Y3Ux) zrQO?Z$FRfmcVMJxj0f|NY)`xBEr)Nm9l)D{6~3E(z0P2ZZgD!a8e{F$-xS{&dp~S^ z-*D`9e&c-KbmKOS91#C~uAQz^^1X|1m1B_e8OTRdy8G_K207ii(YXSoR0z9H<=Q`u z;lQRSJ$*VZH;t1uTl}M0H`_U5CTfJz$G6?y&OvWmd|lxVwJN!dYig^KYOdK^m0T?} zN2`*%g@#%1j?i4FRcx(WmADnHjlrK}{3QtM1;$_IE!laTdEf>!U2M%$MvcfbMvu*r z8CzaX-pHY2j2nG}W!@M!{3iK=i>LpO{~H@Q*`b25)rZ}MxB%PqpUP&d(IVSZ#C>Fx zVPQp@^q$Hhm7euz5jv@cjyKE<4{3<(ZIk<8^)5@9x$9^`WN);e$!6xx^lUr6`f4{@ zZF8{I9Sk-zGNj@5nV#2EQf7X8lnX*xnJbA-h!|2fANr506oUorxz-cF7uu^fmfsxdTR{lEH$o>G z!hI*82diw2tk@!biIvES=&?OLB9-f=Mou=&i1anVOQc_<&zlx{vEmH+V+#*atLT#e z=GmIle&D?UbF6g+IS`um^q#TS3Dn`e_Q!H)e%`q8(V$s47+M?+8k-f1+J*L-QzqX! zY0r#jC3Y53S4ixY0lvq&900Rfu62730UE!9X=+0}&U~=7i4M<*SsEJ@h?5Ne%s7TnCoQJ==EWT0c*h zU64}{b93gmONedODcIk;=&nW6r_Gt;?bM^!5|@LOj}3o~*_{UpRT$#BXp{i)dieX; z>ltkr#B2nTJX`(kbEADLA;!W6h{O8vCn<^I>E3s!Zdj;(oacc_(3xn;3S97JW&QT! z#`!0BaBrmPsYc#Z1xvz1(w8Q`;=2}Od!Q?vz8f8UPFJa33$+?#E8^%^tdRF`ub;UP& zvubt_P(O(ScxoL@?@YpfegcTrN|@-PL~A3oz9t;U%j1}t^(LTJ`jczsqozE@!HbVE zw$Go;YHp=6YYMUiF*4RR&w3dzHG`-w&pJWxy<_iJVjZaIOz&tNt!a-p^nqxn;A5Mb zZ(yO~`302!^g@0I<*Q=(vYdw8=%OTQ_GSpmSsx8vS=0GK9e7LzK%zCiRMvV*9jFY0 z!A%6zFS;nfGRuH(@r5=qd{i@vY7Ss_lwY7jXpRLbpmFYYB1{ zAkmlNdy-kOT?|vA_1qfbBPo*8P;;)So_kiffhgW14`f;MPpa%kZ3Ff^i@t$^rJ^At zMvmQ2ND@P+^^|@FNDMWv`Fji>QJNjC)th)vu=;`(bUw7K0q`#a4CIlQt^R;)Y)qqz zRO?#Mt}UQElxbXDOjc^dpANpCGZNR&z$LMi^`m}_G$O6n!XkUN9(;Bk(oV$iuA_#1cgcH<70eBfPM%qn zjpYD;v3kC{r@Xwpx!u2RX58|}Cl}8eJUj4I#j_3%;oppOFPFyU@I%6~NEXA`14=!3EK!!B~&v87b@u&&t8=e$AeemSsnTlr)o^m|v@odIJwCLH3 z_rrKBJoR`IP)4(@dnY-6YR2JImGX7S*M48tk0xrp5->ycqXV65CX#XL7s|wCYWR1a zXDN+jsWlzp_muTZtE@@FOL=4cWs%krz-L6ps9kr5t80GI;&63%DG%L~q!igB{)8&% zA(Y~tB;9lW$G|{ES)c%`wGY{6(?JH4JK|6Lxw@l9xtdp~oE(apA<<~GtY6HKC0g}; z(T|)4tXQQHfHc~qd+}Z#vmj*S$-*R96JG%VothV6?Mi}$!9wWliNYVx6HeHV85uo# zR{0aW4zQPb2o59*=#+QE(eWo`g2O7m{8Y21JtzQAUd$v}3nl^0p9u|c!+tiFn-fvK zjl@ty9Zp_sLc+xr)sr#w!8V`>cA`K{hO6e?7#!LrSr6Sxv|_%pKjtgHjOu4AAOk6z zq@Sy=(kK_nOS~#C$zHvIGBqn=IA*h`bb77nKSiT83#hQ)8Lb?m6v0+`)(g96*b}U0 z-^Q?y18*ROFCSyefRCW%`q*e~N0orPA0Q36ZsA5TtJ(Rh>?`R`3UsLE)uue*?HXGz zXjo38nOrAosr_&9?p}tLPsZ@dwfLHqD1cRn(@(H^0#VIkK#*K9W_i~4gHVzUYLXWN z!%*{ZygtUWW#pm^vY5_A0|ZD>NGHJeu6j;M+8gR%tc4A#{eS5sMRrRi<8 zA_mUD=ZLpoq!NNjSgdM}qErrlg7r4>or~Ern^`a2A@wj^opumQY|UxemKv>@4WO?n zTg09{0_BS7_y&5d`5<0i8lPfQ8shSma#=>bc$q+C9~0sW{aHBcH8-QUQLa{U217s8Z?xl!AptRM8fu`-*AoN@X| zK#!G@lxQ@t#3xJ52B=3tWi-QSwkHCDV#G~bNjZ!CMAXeP=s z=w34l%QViUTSpeFS@|zi{uRdK0yB3b2wYQ*qGo+rsH1F0tc*lzeMbdq0Fx;QO~_!uE>7lXAPq>PL7N6J18ox+f(9fV`2Z716p&P%R&jhZ)(Z=y8;!%#c3 zaSRfzsSrJkSZsdBI`c8{<5%H>3miuIkH7oEHaZ;SyoVg>*QG9F71HNtkM#h%C3YJ zE2J08=jF_^O-sUiSiws>dhx4~Ney6}{Ac*PmmHGWEWA7Pr5Hnh`Iudn=)*%td2U%w zG}n6fQ|eIA9_xs$tRG@W5WU1HWpQyqtoS_8Z??y}39~%BFMN2{QLXFYGBvd8s1n;a zAV35$T@H}$0O?wnv1g&#bx-(kt&u0ieL)WW(i&qmd2=S@cxTRh6(nMiBG7P>nL zd(na5D|9#QVtdhB<|g1rfU*-Z5ns}VItugok~f@28oJvHu#eD>h%aTs5n{;a-B6F3 zs+m zOES4D>?%gtg{|@Y1#&}--(u-eu%w`IB=Exv&Tn?`nV2dQcH8Z`P7P%bL=FRX17T)EZcKfth z_`w$kyL5B!mA`F#rT4du+4TAIXnl}#HgWvL^|E1~cATVT&4VvkNM05VwH)L~Yw2|P z%neIX9PuS=SVF1TK>Ll^PHV@%5bdUo^la1GOz-RP9@?7_%A~@?#qOXMs&_2b_i2ZS zf*jmJ4!J)|c%uspNd=|?%5*RQFdBV~&S0v=zuDXhPJ>pqCi3A=e>49^p5*U^KW#Q4 zWkKs|5JEVoxc}s!eT?<01FFAQtj@lO<5nS8{DK#w`XmPlBxl*m$cy z+yF2bi?FmnB&$3YTjqh@m{7aWfyN0{ms?1u6NN7|@0k~3c2qSTTU5zy5_Q{p0e+;F zj-hEh3ec>15ME@N^&i*9+s2`78vS_?{8$eW$&jRDtCh3RXonbuH3UndjBQ=K zZM5$&=#_Qg6B<{mBisP;Q?Phl9Gn7MZPN~>MT-aY3|13Qi@DvX~WTbe2H{d89U=L_k8vujDaNBTw zS;1+!Uc!8Nd-lkf;q9`ppvc=Vt*iH%YrOvX3+`Gt>-NHcx6Aad-n5L2Uf1;M*|Vqj zw!6GJw-qcboVIX=cjUA{pa8~F$^&b84(6wMaiMG=5h8w*W2{Pu<`|_1J*BiiEk5fF z)E1w$2Tl~9y$0MZ!3=GLSy`?A%kxfUsD8ZXfpWm&FsA-;gpuZ4Az1PMLr?nec*%|D z2mh}8Kk+>A{{prV&jg$;G``P>zn3>FYpkPmN3-(%cs~@+vkn(<5L|aW`?Oq`EMC)* zwx~g4oaMoi6y5_1zT$IFDT0@XbTni(U@Cd;{}r~X<`n)wuO;kPhzo@Gl=;s9Jo8Kx zez0b3Kv~QQL}AT)fG*#sRl;)fnzxbJryY>*ui;&eJqCW~z_vvu(q{&?^*r!syaK0B z`vD2{saX*#Do$t6>vV5GD^9luTUKcl6N7?BYw(+B#1rrpr(fe)u^w|C?PRuj6HlxO zYFQ0_|0+g5uAd!|hkklWljMutQ%WCl#+fr>%q?yc{(I=y6%|n1=tq?uCH>mVaISIo z+Mu(z6R~q%+S+Ge*<;i_rTak*OnXYdhhT{Dusmm$eFyE|QAmtY0BQEoQG1L+>ll6) z;pYGGYHPhQ&{?}fuL)2z>M z;({ToZC5VGRtJp@bcRZ0w({6IKmtZru8NWKl(v&E40CxCmWgJ2AMDShzklhyR+UCa z>-4WmqqBDU7g?5AJZO1vQ8btk$w`E>&_6*g-nYG8Qk+SBVgd1bab#p-HbLHtJyU5R z4OhnUAkU6UG}yT)D_i-a5ByKJ{5cV##(I^U#a+4@$Ayd;J3vYEV!$N&Z8nD z6PiHOeM<2K44TByRQa3swLH5x!y7nToM8|A1Z1Al!{|nMQbQB?#c);S)XUzEt%vSp zTp1i1I?I91{3UL36FbOMGw^|FRy4^KN- z3sxou6<=)zJdO(uB(58R{|0w~tBF|+%m!_tW%Vr3rU`AVSJ^dlq1xq*rJm9&klm*+ ze+?}p0v&;e?oD7z;S48)D%DyQy5>Vw z@T~lM6gBpE_`Op7Pd*O8oFAb)RJT3nyTryMnek%d049pW{fPD%aFebTiKkVf_Z^FTVLbWNp@+xwnl)p9Z4LP>3<&pNpRm87u$d_r#h7m{$=??~pSd2Bltgx4Cz8CU} zxzoE3f_=D12 zq0!zU(5BD_!oYk(6P{rbPr`=%7y_K_Y>;n|If^!Pku#qx7;8L^{$s)(3j^OcR!XQ|1a4n!hX`BOhCl-cZJyE%Kwh&DlLhB&e^~;eEO1$# zmGOmK7_f{531BSq~(%xh?Y>xz-!d7RkKi?_tT`w)Y$PdlP*x z$DS|4uX;*P(jvP^%`JQeP}cPrtr+cc0EO-`Ss+agZ#s3i)dos(E%PeuhX>*nOO}Lj zg)%7%v;4F~XUGV$YHdJ77F(2>2T+Q>%TsxrH|HZ#Fn8L#yS#G?=FUerVE%2h3#JFi z<&`m@i_hXv=4Oz%qNq*bjH|)v8ptNb>4^`eZo8m^B2#Hch%de@op8l_ZRPP+UFVViTR?-w^L6t z)TaV=f2?TnkMXokZsAbeim@KRV8w*-4_J)yScD_qyzN`myu2)rN7RSI>XYG*;*GzH zN|9Z#pBLvNCU+KSi*>Uvp|Wz&RT_CYAS_t(?w-7YKzuCeT1EPj3x6=CHw6RU`7^zX z7EfD%pJ13aonn2M)Mx|i>76+Z(Z3npy#)&w&R^)In;G6rZ_g!!rBNUL=Ru1F3e-RX z2B@%a7f2)srGROo0V9Qo4dr#%7DoeV899l8?xA`k=qVgSu*3Juc~|SsEu2aD4B6I* z33MeaS>u)tHav9Fl8@iq+8iyBOE*px#16m82daumE=bZg?E9a zl3xfsxah{azKFjThBB$G=iVu^l|uS0Uy9&dXt3hl;O!K*`4sM;te)+nY$L)1)DMkO zk7|S`l2ad6CDF3+#+b6P4PzRS0rGOFYj}wo-W`d7ApDPM^9k0*aL@4mvI0wb9t#%E zDw-B3n1Z<8{OSM0Xi52~7gr-363B@~PJL{ZYMon{kP30X*R)n7!-RsV##l2p)ECE9 zHo6`s6`@KacTDuoSoa&-T)Y96tc@i3dj*Fvh{qWsV=sX|cH?1zQ8utwM*8A@8B5fK zY2j1hA4-nV^~!*!f`Y(Z_h(cu>d?QC{c~YpW}Bi42_C9QA9eUx~TQ+=xncy4_8Ai zeoK3Tq}?q3(_{lL&O)RwMUTV5h81UmlOydZw7BB)p!OGNn8^57ky-W(Mg2;?!ZI0! zXQ<>^&tpF#m3hUxo>IDw7Isk>I_#o2HvdOh2A(ejrK_3()vJN|Cl0UL0ssSy!D+3rfL^7Z|+k)A+r0_GB7T79^hF#^1t)%Zq7f} z-esl{w9RI8zfp=dxH54yJbJ+?U$$w zx`$WFk{b+k`v!Hq^%zv4aXlcNi_1QE3AH1GPXvlmw-X+$mu2d$AeGT4VX-YEkYFq# z`%e&yPsCFPZsXw4m0%lH1NUMio5M2p1g6T1BcY?Fr}Q|)Bg@0PhGiTs>a|mn$c}D^ zcPZNE0c$S09cdja7*nOv@dmB%;lJOI@!8^!8arR6t~d_%HqbCgq8UAdv!Em`i!%qJ zhy^E}k)c;JkQZa5k;Gq!WVBDn(tb-P6sLp8v?DCViHm*xE=Df0z=$9A1QHwj+qEv& z+8EP&rP=y>=`+tp3?1SZmk__W!RWdxygx%McH~<5uus@P;hvL>U0(WZ@!}I`v$$W| z1XDAR2QEXHEq6ALS)SLOdgIH!Of7b__{p^YRUwbrC)+S9;oqT=FvaC5T<<)8)~Z;}b)m4hEmj3>7loh;SJL~j z*n26xe~kCEgKrgcim{fdm=Y*p%vW+2Hjov4SEa2Xg~z|xn$jE=C%B=3*rgg8HHVMb z*y<}%Ebtm1hu^iym}scM1Zo*@#9GoAHn#mdt@3{!!)RaGsm+xPo9V};8pVr1O891#p%G+AIeof zRL_GRiYP?;5~%g>UX8N5#D*=-`ByuE<0;I{c)&E!u1X=vlf&XytNaF0$0a@N(STa^ zpGxAI;Kb|yT5d}~D$kl6^HM_TYS0#ooHRq*h)bU9U-FIvlyGpoQ3`N|KZ9T{=o0iJ zBVb_l!B~rcFFwM{zivhb@R+xG@sgwO5MTSSq{KIN!Pd=SYr99FIkmg!EFdB5OQ;eG zi9#x9GcfGT`=Dpd;)jsnnJm>7Y!_jf_+M^RE^d*@ku1bX+8WFO`X?1Ob~hsF62lY^ zwBbnoBrfbX`K;(c*(8hZ+MLGudXqZQnRs1po{TIJfzaOM%wnX$%L-TG1icv~>|gC} z^eIn`&pBKV0$?P^f+htL7dq(Ls;jmY=1902mz-)JrU!nt=|OIx@efjbLm zv*%w}fK5b93{BbmLX^&k?fEYulH$yAlBQ<`xp(_C%5bXy(<=hN7qkWsyvKc>dyOelwEsL9ja@k>^O2_)d0!fk9^pbIl8gxYjzSZJI z*`fYwVBmIIzp69|g)vBb7y3j{m&KtpK#|`@0Jsd;FFUk5spJ=_K!+QV_lzNrnI;@& zhJ7YN+%1|Lsag|wpCu&4!xGhICJXx2h{j3B3^*&k6aHi4p?3Vv7VXI|~VIEn7L;KB4$kXKkf7IKfqr^KneQ5<^(%p|CwP6 zc8T~BLq~Z~ghkXv&H(O_M3$Lhz4q1^fPTi8s0Od|H?RSRk{V@gB)V=ipvT55Vk>jVZ9k%$cyeb(%SIfF)q)SY`&@uyOZcv%rF=Zo-(bnC- zSDP@KT`1{JR<_<5bXL&{j>Q*eP`{yQ5JkjDrq7*0ceYrc`HOnVm-zj;1k8n1Ims(? zq8IN>H0ZS+Jq5$Qrz)q8NEE&_K)|)Q?roG&RBFY$ftH1@$+D|ZCiN+(0~qTHiv$y3 zxu8;k{zJk)uRPp%Nh$o{&z}}Ai?U!xbP>VAjAf?hz6J2duu$^DN$WQX0%Ujb)_HIP(W@T;k*9IU~gby!E0nEI+hK-BG!wA zfG-=$b7xPKGRU=N{U{|+Ht`Bxn^1iH#Gq5Q(}v1@TU0hrY?MJCv|eQcy_IS!{}50M zJ|>wOB*EI3saHr*;dhtW_$CT^i~>LRTY1vL0v;gGEB!;FIrWjTi5X+-J@*wu`+f@v zCo>Mo{4|`N6@NsDG$Ez!FOzrq`Vn3i2 zU%x!qMw0WyI=PU7-(YIFKm7BB`){O45-KUy$A#B4sZjn8O)AvXi-pfg;LBnt7a0{; z9HO;OoNo|n<_{k(D>yDAnN#4JOj$JR_Dph2`qQ7L^P)bqeq3tyORL-tv$}X`D=2sZ z^1LW9vJCkF=dn+#XoG&s&nPYDZkUICRXK=bGWHgR261Kq?<^CiU&*ycAsr01bNmYnALJy9&Ecx@t0Nxj>shVOYKL{*Hy|&8}w-a3;q;) zt$iD^s?I7~b~qPb+W+ux8szGIgWGV}p0a|<*zt4Ixf*C*+^kq1rb*S=@I0153T3TC zT69hMvsvs)%Y4@Zv*szfYcFk!ifDULL6I z!k0akvQ@^o$lSrshEC>R+K2wlN9yYu@7nF%8~)~ZeE;_TV!`IBoI^Bfm~ozMH?#|n zte6?PyB&iW+vZEg%4^?+B2=y#({AP1ZJw>WL-n@Bx8U|vdba$YF&|0e6Ttg^JTv0y zzMNNa-I%_qX0;132Jt*}g4N!Jd}L(B&$}4ITxuPQo%IZwF|EQ+Y`{N8TUrbvV=HL# z0Swl72fl%lh>A1m;t3131(q{^&GM|-y>jfUwJ>S))dE3q#L=U7V%^zn-Ixh;zb=a| ze{Qzi-@%OzZpKCRS97C5>KnS+GB?^wZXGsb9)iDq&t}~g~vpOqG0+8QTHK#BV6tY1fZCo^1ZHp<%edK+U0Ujr{xRYSc5RW&q)5|pLNzuo0uT+&2IPx%)i zkgB15VzB9yfLterU2G&aIzaMi$^8eF4=i24JHlkFrl~6t%Hnvb&8UVs+~$v z61-~xUu{15vInd&cT-2KtH2}t>;jU+NHfggZQe>gP2+F75U7H^YrITAzJ1~+gOG5V;QN$Y-#Xf6*KIB=qd@s2FggRbiRN!Hmwq$?VxOV`|Sh({xZz_u!p7TTkFhgz+`KoQ`*{|d_nv8E)N zB}xvo{TLgG$r5^h7#rGi3y z$%5}uNM7Vgz$66yG#FB%8Ne6QI5fzpsE3q-$&qrYeZ{AdlPB@_zd{p&cwE#d%J)L& zZNa%|2QymBLB0AdsU$d8qHl7Edd5Hl=3X@@>x)6%dyL>E-Of_MrNPs~U#x$F7BWX!A3 z?!@re2CUV%l!4zPhiL9n!|ze)=!D2vZ+Nu%mzpSN8UI`)!lwWfzS+pbPh&M$&tPST z5HIl2hIXCuC=|bs-}Rrt{~|*bi%CtUU75T*6!Y`5F74;%RDuV#lWbt@;E^v*iBF*5 zSGLbavQP8HGJYhnJzz9= zq;S~?M4bnt$f6(I2_GvtMwdMP4{PrN7*%!cjh~s!B$H&qOkfg%1`;742vtx(qC}HS zCV&tKObBRssE`<=BEmTdR00DhU{1!-X=__-{aPuu*Y>tw@o^FG789@uif!>xONCmh zUOjPWO%+3gl=*&Z?QL+ks@ABrib*)4+2d2yB9d>Bg zoz!wL5d&zH)~R+nU|J8OxwV6EmzZER`tKebcc>ptxpo(Zgy#sDpXFlN)s zgno{Qj3@Zg*3<3=s)1w=qf0Pnc#-?{AA%G`(Jb)dSQZ(4kvJN@@P**L{-cQ$6&cwm zqvLw;$D9#+ImqiReM6j=RTPJQpyKp9KzSfNuICw9g}f>_R*+VlUwQZ18WQlP{XQ`c z!N#m=A<_&DzRlADMST-!z%PS6mFok1DVVW%)ie{;aiPjTtkG8}yNkIV@N z=jI28?V?c4_G-|dA57{jJBHlQsos1TLL;=B6Pw!i3|7JG^DHEu)^C0Ub!>uY7vVm@ zj|PYKyQ(ljgU)ba1`}^?4Q4U%#x^Hp+ght`I^>Zy`2r7)l$4u|=D8q@j3m0co3JK1 zMO1u@s5gZSTJMoKXKN})zieENO%q*9IcqTF&bO|X;yjF*23vpiR60dJLqe5BP3%V4#E}8)ZT9Y&_3bq z(9~x`w$CvPWDklsKIM~wb8K7NKf<1S;LVCV-P)0}AGe=NZvP^0!mCN()>KcDUG+os zcd-h!Lt6D@tasvs%X2`o%-ie*{AsjlO1JjT_7hD>A%9-`IlJ~J(nX`Oe)CjN=^kVI zuAJ>Bl=Ja^VGP&yZiIUa^R~RCZUN-Ig|j1Fu;46*=KFGf2RXkFgTC%DQ^Q7ne~QoV z$^QHx)L72>6;pnV&VOCMpAcx7~LBz&PP8LmU}k)=xcU<&>ft1itvD` zuLdjggA#!lsvKfP%k%54(dp5Ke6=H|TK^xMKFC;zl8%%e#iK0RG1!QpW1>l7NBuCr z)YFqrs`cetMOF}D5cNOx z?__nV3(27u5BTCG(T{4q{Rri^c|G^V$$uxWlaU!%>PjJ}JpS*bJPrt>Ehz}q9N`Vp z;5)Khd?JG{aS+DUOa~qm4cvg({WzFdGPfsL@sIm+1Y7d&C^_Xe&12bh|WNhWAi$jkjYfoLl=P}fiMW#fX%7o2a+_goVKRI!|PKZO-r(^6AlNO&Vt*Bh!e@B+`!b3XhV)p zeMUVF0*ewTI!+Wzco*1WbHGhtISa-$O33W{aj4*Zsx^W>Sa%%&fckHsJO#B63-|Im*%65com2jPt;B?Gi*A& zWx}&qyk?456}^JPL#26GK1rd{o3KIQXr_7HL05@3*Q564ZDBi;6wT`nO)U}&GM=pE3-93U@k z!uRj!C}(`%t3FsDf$Z`i=C%`I@6qTRVU-+qOOJgHa9OKT!YkVqUGJ_YurcrTey{;+ za|BxfGNzlpShS|EQ_mN^e*Gg%R(%J!k<`#B+)z|133{&PNgyoYvYw0nh>6L67R>P< z-)?3159p2mj~VZW`3_ zye;^ifH#bxOIH~0%Z#@NZ~7ZzyzTVH|L98L|Aq1X%y|FJcz7#G|t$u#_W>wR>bTNO``5wTR6dlf?^<`qefcDHdiR<;$ekAM{Y^LQx7HmY-{A~q2quAk zI(QxgF&Q#Pr#Wc7=3_Y;=dXlmjHop1vE)XYOVrgR58skX3_mC7&8WRua(cuahSm1u z`lN`p-o~{+Hr(dKbc>$DRyhqunjQsU24FdRnA8v9lchHapPo(l6zH3Ydy0*%^# zX=!>-ewBrzjDfa}+$);_&+qL`1`VlJ38F*So(iRrw zLy57s*$SD!q>R%4{6o}^WWSkT1lkFi>(XzAtOF>b`j4nMVeSZZOWam$Lw5ZpM1~|S zfRVI0l~or4v$L%nv;;wdXkwn1Va%`zHuVxH4g2+90us?#@_ed1EKo$IUL@tJ9^0RL zFlQ`s{`RPxwnQ(e$7FJ1FYb{quhtjcgRSP9cTvqDtRQ1MCF?DcoC+IEL%&UXwh6>| zuI3Lu&!S2}^q3fnL=ixH2U(NY0Cic83%{!SHht5szGsDMEjqxqZ|mK2fj7TX;JDW2Rq@PCPIj{&K0!IS8`x($7X{hyYg;WN&hLkZ;g z^?!UH{d!n`6}SRyVFL#;tiEEKVOgJ_8ly<$~bAr}D5`HGjxsoV5pS%F|TGDil;gXj!W|~EH>hv!$+5(mH z;V9o+ykg7^J{xBPn>vG62ej~lYJJqJti_wA<#iDw66rfrK+X~(4P9s8!Z0_c23{2Q z#D@w_y}d*=)Za#0|lL{Ak8`Zd1?Wnojk6mU5LSNgmB70C+?1j$pe%xe-Xe z9U=iGkZngH?s^O6?R`9Np$jRG#<+tf68na_*gl*+49Nku3Ec_oj-)!wCB$$l=TdMA z3)iNs4$VT#FLyme?G3!dUFB+~1CU<3lW@{d?v~IKKP2d-PwS0Fd%RG*OVL-r8QHW% zZ^b*bAZl8mDtGH;@WFIf+|_y^ra#0^BDVqvXp7Gna;}B~XOf&rJ)Q$yC|dcEY#Kjb zAIc#$V|K%d{auI5)EUT3U5+ns15%*W#IoraB+Q+Yg0y1L(*$iL0k#qrzDQ8GgFV?8v>gC4ZXF7?7t087XUp}S~5B#j0S zX&FHn1NH^TTrf$-lsfd!aEzc~?LXfEEGCi%(w~7Qqt>CfB2lo~J*L{D4bz`7a$xoL z{{4%$>cJP7UN5roifq8p#>VWY>72VIO+9acF4-82k$OH!9v&HibGbV`FETP5OgVc@ zJ3MBE8?yMpyogi39_a;Az34N*5e+0k4M;9QjX0{vLhd!9Q(lYfFgwf>jRO@|^ zdhDOgOgkIAuBbm!C25cSvGjN)0|pK$L9BuI(QqWzbp#@?u+K zVG$6?HkY~$enk*pYm*xrGoaxq1?1^nw6}+gMpA@_{)-~yl5^Y7;fyRT0=KnIp0jR2 z5iXx^ldHOr5#wW}IZ$jv(?G)sz{})_Hwv4@jrSMYi67o@7x<5W>pY+^mN&gV9p@1T zoktcf(#IeqGApcp1JL0nQV)WF;;2UGV1cg&TkUEu@VLm>@Io9%Rs)rS!Pw~wVFR0N ziACJx&SE z`7U5?Nf4nR5{3S98#k&_Z~RqUTN3H}77%?2f7Aqn$Qd)jWzhH&>_Em2h;8oV{c(z` zfP+FeEuRj+l(j$z@}tw(rvf5r^`K`lPPykF1SOo2-xK@=C9|_G8R|nAn5~>F@&f!( zE1^hgXpUlC4!#o5V_d>8^phy_IzzLwvMvYN)=^uH8WCU`QuhQG_U!-AR- zo60yuhXL(80c;htLfmtPNx&qLy1Ui^K;pv~)_Vz>l9buPCc{gH)Iu{rE^v*)Qkyat zdvM?zjvJIxR+lb?0?jx?MITH79unA)DJkPwQAax(!e0L7sWHAYvOAbXa}ugM+7rBs zu(r-$`Iapz`#u2BcdU{$8$nx<-<=O_rqYDU!7OI!StUsw7=MU6Ousy(A4Sl%y>; zNYd#WCF!;zP^@o~q^ZTA{gwb?dnIX88Kl;H!0l&A(#x~4+HaAhAI_De^a@GZIA4-J zT!5WvAz=R^NxB*&>>n(K#>o;)>!p(P{;fdmzb;9?UM5Lbt&pUhD<#Q(ha|1LQ5N>DiNzgLn@-X}?O?w6z&)=E;rI!XHGdP%w1B)t)oq~eey z{qhk>x-2Y74}re+`L`tL&c`I__urAEnctJ7pYN2U;op~}<{wDXKc0}JmDtl>`w?ic zyCmtSKb9oVQ_yMoi6s5~r;_ybrvV~=CP~x(6AR%NpnXAtbMvnN4)%bi`>Z7W<~d2a z4!h)&dnGAjpCo-_za)KhK$5Ed8`rD-8h!PWBt6k4NvVebn(-&$FAoofLAnjk20W;e zge;`D@O*|R(;`We@yy2)pJpb)(9IIMMM4uK6p1_NCFu;Fp@=&L&jKS2uOFMBD3m*) zxIL=z8g(=F)d~1@Hjdf4+4BshXTxQ1K=xN^%v5i>u@O8d+l`IM>So9A2I3K+195H) zt^nWRM96kHd2Zwiz+uD#k%4#_I54ygKk(bvUVH8A zd+i@50imAoI-rhjwY2Zc+a6hX_Wkyc?Ibr^wkQd{6WT)$&vCf_0*S`HV6`LUd6kN= zO*j^;wuL;~%#Un#Gg=n6M}i~Q)1IW8uD;KPA-qm6=aLE_LAHto%Q|M~Nu|D2j{ z3r&TH&gcDUA))x@lvl84VkS#3<*&CAtg;*dgZE=gVea=DQg6`~_eLV<=g=+ic(mbE z=-Fp6gg`^IwVsK&-=QSc40p9d`)4aw2^Prg`!~S>Y2jOKjVYyt%f4xA_##wlp}Lm4 zC+2=rJ6^1nJ7eZ#jdNu|;u9BvOPwkWb&?*DsZ{ zcHItn!S`?0mY>En(bEw`ay3WQ_w%&nXS5?`1ednFx3;}275CiQ{~NuADN1K;{Vh7Q zFaMyw>`UBf3m)vR0fr#!aze?Qm^B{T;=cGfuDuR}07tZUNGD4Z!PHtn1B?>gJc+U6 zbvc>Qg@h(zVtq_fI=1a^xV8h(Nc+@xFZZ6k$JTyssJ8eR4(IK?XzFq8*hJs)q$E%c zAYgn0db!o7xA=NneWzP|UqFtiR`Z?f@LiBveIK;=&b0bYwfH`7^_^_-^#s2Tk(Fcn zei=MbcQ&HE-u?x6-^g=p_g37op?tPs`-EgF2FEDs?xkbWgV+p!MN&W3 zk;Ge!3nBy?ht$pf2B9sdv2Osa3l?!48=x=tC4KX+U`U$J6LWD*}_G{Ic-eUzPlP-9vK?O_HBiPg$+BBwuAhFn{Ae} z+Cj2$9y~}MAu*{e<+drW6n?S(!C(#59|FgUdS0_#QOG4B8$YON|mOvop0nxPvO8<+hX*K0*~~ z+-*|G%=RT-Lt;Gu#_aNBKw2{oO7p9_i4u571E$R zWjoP|Y(sl{PRR4kp!0{?ykliVtD!Nd0tCVcdkfF6dn#`35@8mXPc^xNN&+Hx^%53Z zqP0WJi}M!6Bh0rJ%jt1pCQ*jw2}mqpK1EAfzRsZ~xx6F!hH|y@ zg7_}TbL~9>=skpk%ftAak$ zVRRbrg`eQC#B!`e9T3v$be}|UB*7g4PeRV$pf{n^mkuSgp43BTzm{Rst~W&2o!sD_vON~7lEv(^X0k+5t&@s(7oAaz zLMEUUbX8y<(>SOC4aLU30>*Ax*y2{QX*LmVv54_amSjtYK9;Yq80ier_t)@gIAQmW zJBaGPF9$zeILgtUr@=T>wf-3nbTmhW@UV6m6kq)>@FN2nCuC1tV!u8YhttSiYzsX_ z9vK&8n)l}XSqFeQ8AHkcLzITrXorQ($rEwO;7$50qG-^y!Rt43BJF3v>R?*hCC1J@82gIQ)5tw!jPNt4hx#DoNJmEJ+LRoUyMo&N`U3qw zeo8m0GTwqHaTVv`?6l#m`=vSIPJBi%_Fw0|WF+fSFzST&jH2~p00~oD6O?b)_9{fc zQHQNh5~o_A8}~t{jSj&CLx;LSoX~g8L)zsAwT--f2QS!^_8HYTUE zDUW8NU*G?I8e~$_8M3uP#3Jxa?OSvwk3WK5^6O(k_MlO3Q=X;VKGp1^=`R$a5?=X!{cSMs@oAwLLy%{O_$Jl? z4W4qwudjy}>C&7w&a^aE2~M=;h*0xLy8bg}bfZ$p43=eZ4H@pkgghqU^OgFwpx$Un zOuFRUP5LkMT@#cb)Q)+HL)N13Len_2Omh}ML^TBokZE-CVS@rOdIJS<|i)0JwPub4nc_nbSQ~rhk3i{_qQM5ynN2Fl9VqgU=_RT zrG<-7Temr~RB@z5+w;}lHOi1my|zQg*8xEt#1Wi z&``sK%|Rr|1NIQfLLAekJ$v#bG`C)39x{&4Xy!$OZOHOoR z(c|&G2T7En^+REr)NG&t<)m+l^;)T4hPGe|V1DG70V*cKP#+2K4i} z&3%^8YlX<|3q) zz|M7L4Y%Z~{&t+h1T@FvE4G7aXgF9Tx}T0gdpV$bBczlpuIBToS{F=c0*(^P&jm)G zt9cuFUIEXrvGdLDM=s=<19w5!juFU>1ZY6o0a06QgL{Pjo3R;|wU>4M4Y7pnLURBC z%3a%Ui%$%Upqw1U-IV%wG=UE1#ojf4Oev9vo@4 z+&usr#l+%$91(gBJLIVbS%xYJ>r;JFfSTGD*Sm6NrGEZSvG`NE=+qPrHuZ{p+@R(W-wN;5Hb5BPU`8j$yfGAy!A1j*;!pzaWr&DHfq$Bi!act%?=_S zzSu$pZNp)p=Yy{<1DhUU3_}vdCQgF@zLL##O10MC*)AF>*DwU6|0@ z`v$HKlZUMvp`Npv5@hYCQX;8@Q>v$2&VVrE$Q*pC8=sF!_AlZ2SY=WJ8K8OvaLYK9 zo1?rF_;O}va{mx(R;(K_#-5!$9gsn+X6ZnE!*+DjJqX3T>FKb={QJHGf4}g@x&^}^ z&-Ktme8ZHP^oUgo;Q2+|qr*KlES^b^g8CNs6u>|J*@>|D?|;|*8q%LVmjo1fP-KveQYOO)vs?rUR~*M(t6~&$|jsJ@XCe)6f}bB_yMMr5yw5S44C^J zq5E#fd@`&CwIeEIukuxNU z3?VBSQu7;4b~gHky$>|+&gA~Zl8$~5MxOcwX&6TndcKM8B`jnrZNufpD%^)v2)k}> zNKY;V&9dupRJ-u30=rv%reQH(H^WrfR*AOJ1x{2oFs!?XAFC<7#(8G%9c0dbiT?5T zFi1FB8kSsq-Ssf)@&|ar-Z&xKazWeyh!B|~ur!gavBbNEBUiu}@R5b~^+>@Fsh4yQ zBF3eSkR8xMrI*AZ8T}QsP(B@lrltS03B5}F#5e)$V__}=c*KF9GD0}$0NlVE2eIfU zng~Q(K`8q1C1g#5oi>PK?;js=!j||lJ{Z|LX2D3kiq?qp4|F#MJL3cp=^-s}W z6EVRKEhks%FD#=L(j`D7|7FO{0>?;%D;a&BE`VU}o=8%7%89dw35v+ZiO;#mX#2SM zwi^}=aHjVV$gI{a6{y!es26QkdB#FBbnhE5H;rgLG@NCI5EQhW$oRrKC`Dj$@?_<_ zXl4q5uQXU&CDF&e2yo$dz}Dq&11S_{Z~EKGvWp4T42;cSk}-3rJM%As2X0goR8;*B zR7o$|V%9Sa3+px9I%(9B;v}f!^h?xH?5hbVyT-nn6*sX{JCjDDn8<`Mbq#t3E8N^w zvHL@Yg)VK0xI)t_^@CuO$IhH!Q(QwNTec@pj`hNxJe&qEiQ!8kedB=}|55|3R$mU_ zqVjQo4^comG9ORBahCb~b*+!lz2zx5)q`$SU1tf9BMt_^WC?UNmBlf#4m`;8pJVI! zE;Lk`N@AYI)o=)cDIMhs94azRTwGAPOiPJu#|DaRMhd|4ThUo72q*7GZ}sW5Kmkmg zd|D9vPG6rHct)QS7ns9=puhIf@fy?Z3?yv{R-1W)Ucdw1Zx7d4UpbfNQ5tj36F27! z`y|uC^*O{^C2m0fR2osJoN1&x^Rgk+X$BZe`{YtUR3f4pa&?On$defp$t;r)G^5Pn zVay?O0vWmPK(0*x_$o->AbE}sn;8-rCq+v#XdqW3-`ISNgGWTVORxe4PP-~&+HHM# z6VO%dJ?(uU&dum5noo2(vtTtCT}M)AIA0#Xey=6t65;8!!K7NX?VqrhWNAnj8*b!l zSkJB(yf#>VZnzu{Yp5(K74yWQuhaD z<}escC3#sYfT0=z>LI9WOuyoPpZ5ze6lLa28y|9h9$1>#0+`40zt8*YU(S2!|6h4W zVfOQ)diO0JQ143-%P!gJA6_z)hNM~#pm@OWjZ_Qs6h;=J(R~W4VY1JR^Uy^Z8WWS| zVT_g2>g&C5glV&;{KDXgAcg|2n3xGzFjSxo1;+MkLpLL#(8EQ!UNqg7=wFASHG-*a zvO^eyjZ8v2zX{)daP#f=DGre>$;Ll6kn}M4|5dbh2n#ioCj|aL@Ga5R5SOk?wf=i9 zhwCCx=i)G6ntecBQet%(iSrZzXsN%VqMK-OqnrNhkAXiEx4EbS#<_--Jidc`%rO$@$pqO9RBj#E(;w+8Y5wb&7HGp$lFSk1i7kk_o2H@DKXSV~IhZfIG$ z{ramYv0AT0iDauOWfOXoXjnwxqriSci?+6onWV@SQiWUP?Q>Qv3{XHd&HXbzBv!CN{QZYMNgW`GuI z-~nPErAs8}CejhE7Z!g?OTrCDH(mY$?aN3i+Obf7qte*3)zgpxOGL>}jC>>%qa)(*3;^# zn`J4@oz&@_EZTFSHmZE8zD%!f{dSDC=7qUR2e@)N1WNGw z7&ehL?|449ig+K3m#$CY=;KB7(=hOY=zj+RFX%0Z3=@(5E?%c~JIBojchW6G2R4^V z$NhED5{wh^KQwPH!YtqodL0E@;mJCKUdLXz1-%36ts;?!Ub{$s4APZR79<0Mk>BVX z395ah3+rSzbsk0U-yM0b70_J6+4>T!6ytcEYvBK2_{;7km{60}f=ClU=2*{S09r%% z@O^+Ob1J6)Nn7-qpzoBy^R+h413tTM7RfN0GYMF{GPlQfG6iQjv>7?Z+6;G~3D+y7 z1m>pZN9V5ro({$fInBEc!j*lSFhH_3=(bXsCG z@5tR^F51FwIdx&(%%^ZK!8kz!@3Do8$(h@y?`iW_g6C!!Bbu3=fIKc6Q*6rA7E3RJgzb#?LqKmJL7hr!@^J5Y{Q6 zZ=!<|z3WcAL0jXrgj#vvSB!T64}BAPHwS(*@oqN!=+H>??iqOF5XtfA^q3F7sdzta z_&M;V#Yz45u;E8TG9G@D@P5qjBMfR1{Kn%=jiPeX@erN80PhyVZwTHq;Wr!aCk#Iq z-o^045lwm$54FvWrwo2&ct3@Q@+0>3Z1~03Zz%lc!4DXe^b0(c7UM?91@2hg@Dm8t z!8Y!bo00Gz^krY>YGsQ9kY4N02j6IZbVYL-Q9v(#ERffNQKD zA4O1z09tNPJ%bv+4oirmU36f2a~7c>CQX6r2+ZZ8&CoatXzDQ(Lo}81nP9>989+-5^)t$oFO(+1BMJnY(_nQ^UV=8Swz1SL_8Uo>mH2Y7?% zkI6=*l`DhKQC)H6q}plKVlj6h<{)hYelDue{+=7nOMP3L+|OlTctUL)yyIX)N~eD6 zP?KqW#M2W*e-lPA@Pss=%QbF$JuW)vf~YGhH^l6CJ9m8l_=!z)@Vp?-QTWJdOasu>Q;r&|xTQB`d-;2kPU9={MQft7#=5G{di z4|l`wke&9(%ZO8-44h8XD@Q#jCWNRLYMR`#!-h6rL<8VqOE6|o!%+8AH6bWg_&7Nf zx?6lL78L4>(7=AmQ38wR846vf+c0Y|w)OMsG4UK~+xSXd+m3pf-*TnC5#LCvJsVLZshA;(q*d!###Tu1=iModZ2tAw9^CB-b~H{?MYNeUcj!Jycb3Bgt_+Xj4ws~9S?jIRuCYer~NNj|J1_HsL5brR~fq1?Ug z?^}Z^g`zkSVGBnH{($rG{2$5(!c`X#u9c+$d2nuzDp_2`0Q`cGO+xjyQpb|rX~D@h zVG*?7VT~b?&bJn(#iq3!$8TrgB!1}+yOes=s_mquR-aR;UkN#}{`s1C&2*|f2au{m zwbOXl<4pW96#d02PJv+DS^(d;wFJE367&^ybG{@i9Xmu`_kxnXgMsmtzVm)ULgu=Psz8Q93}kl3<1z%%m= z@b_D|CE77wS%%ErrP|+LiTb2!eHR--pzUF!k+-ro_(R&@G1i2W`C$n4G)DrZN2zM{ zMGHQfIZplnH}S2O-^Fi@d>p^EGUS+}cge5eSC_wr-|x#;;y0>X#ko}L|A9=9!%)g$ z#!R3|!jYq-3T`mlq&6C1&a*^t)UazZS?$eNMq}}!$LOy<$*&*78CJ}U*rsGd?i=JfV0X*d(+bj?Ap!_ELCPp^jy!bq;|)8W|qBF&8-LH!kX z1gj~igatM~gzuB^b!{g+t3&1L)zKwX(DT9G#fDc#-D@?!W_xigs;9_UIqTji9%+j_p0J?R4i&;6<8S z*qBCB@!s1zRN7uGT_kVd*9*{H zT1OYD6hl_{V{AZdJt{0xYAUr8_5eo>__jrch_$MzN4OlnUWWeeI*Pi{{ITLrEqt>D zPxZn%rSYQm52Y4>nb_h_Ihc)vk%jSjf(bpn-tN~=V~At=fLslG)o zb{#WZe!T|Ujn<)cM{Y!Y2Clnubnrg(aWs;Lu;_C%s&(JTIO-dGaFNun{;HSy(;$`h z%U>mcIx0;(zU>tBrV3Bt++5kP&HOu52zSfA$fzXb7Mq+YB&hQs3ELP}jxMjGO@?`T ze!Y~}7R$GN8%fm%VfeXFWT|9@9vmN9FPlinL0&}mgBUT4CQpM-Z$9b)x==2?BKCtc zl>#pc3~YGxIohQC`Zg{c+liP`qH`<)YN0nT+Q~!Z$+!W|^-wo*#C$*f9OnBko(H~z zXJ*_p18%dO5R-AHD%pO07;j2MheM-xVARp*U`37=q}>2e9y0IsX_4Cp&W>kUgoL)c z*aS%vF=%wv3;$GHoeY=pB}GWDT)og|`ti7Cz)wV}t9?MKzud2{F!PkJi4=ti8xEdC zXONYp;3;-^wBQHqK<#umupfCaeL(mBkZ=aD0c>5}CZxj2oA(Z;gC&9&q6SoF%xk0yi+`lFzn`axO*2a zR*osR0A6q7wsVy22qntMP)EK-oqUBfe53@-e-m>GN|)~z7N*HB*-Zd z?nZb;EWC<{j$Afve$(KOnTeh6RH5(Wy6Yi60W=#j6Tynp6WX;~a3I%lGg7eP1Nw3! znpO&!aFV`qdZ6i{*aElYT0=Dk@hwhPNyzXdI$Q=`WFP}sU68*l1TPteb(Ny4gS`Ji zB-7@4XbirwP9J*#>-1^-&~wCiHh{xKx^x8M)N@;0J9^*gFx=0R%^w(U?e}QZ3 zITbm%cDxC+xN(YDHDoPu9#_p$diZ8c#dBiJ6 zycklcFVg;jT^lB1 zcR)T`N|3h%ZI&ab(vE9aUVMepwe#%}aL%HU$^7c)cwlnhO#K8>Q~Rb-IuO8I z4{e1{wBS27sCvnt?x*0wo+WG+bP@59>xPn# zsJ(TKQ_M_oeai13>qwW+;uJ%}-!+^nfcvi8!R8@EfraP*Z0M6nP+0^qu~ph=5r2dr zkfUc9ErdjwoGvnW8zEt%XxH9Z?%>TK&#zGfDO8m`zLKTb^($m74H|dy2b$mYQ@E&% zQy<65P*Pr`6Kv1xrX zieV-lBm>A+b4s*Bgx)@ zW$KJ1^BaP|b-+OAjx)~vE>OzjQ@A6kT$$LGa1ks^gr30eW*TkTb_P^fP-2@zvyzbt?)AN|B^H-81vJELt%hh`CH*g0t>`TWblGs5pqsAp~b;G z*1>9me0KtX$7V?_jVUmgIR)j^536$;OFM3>!Bw%HlQD`!mO%N-`@j}Mc?P>gTW{<1 zihah*`;0-Aibrl4DISP0ck(t$*>o5f{ROLXO?{?czaE?oCRmWH-Fy^W*|i1H)ECd7 z^CXxkdyX6|&kZBijqB-5>IF=9lfmK`>7ySZtk3f6MbJm1nbyCNw6+i=`5WW_FVM(Xm$d%ut`>-r@;K@$QA zdN*9G4B7Pq@)LPt_V(x5Uz@nx2R-PB#Frznm^X0rXA?`zrD3G6#@31%c%@P1Ano9o zXf(;WllGBoyB+8Vkr@5}@Irg3PDQM*S=UgrZsi?o);HFyyMZVsmG`fgO@og4wRhZo zZ_VmS`Ri5{ja5K3Av^|j{K1DWx+flx00qjftUJ<Ly?3w9Usv;hQnOyp=h_0E{7af2^+df5 z7DTBxru0BMAY30E048y8gMMn=O^47D-!woWaY6xAIv$t;`RvA+sJ%nwxs4gPzEt*f zLDYnChu&fGlCEv^K}eQ|FLmo=&L0&DQz>+QC6EHF4+FFl%N!%uC1b$iC$YwHKqKOC zM^_cX`?K-ux5Ixv5~?ruA}@^ib%+2Rbw;smUBH8);plTz%eqEt%!a89=DM6z4jH!v zYkqy*9qVfDtGQ1I)XVGcSXCn=>hF+OQCqk_omi4zO;&QJ!7Ec=Zqwe6?j?M^?vIB_ z75eCPm=gln`w5Zb{wMN&F3gl=EYkmY6?%F<_ZjdJ=&j%;bLuUOmIcQ%JMCj2aK)0j zv8p#CATZluh0rubq1gz`gHln(6l0l)0h#JWqBbno>IdDzjBx|_L$H}|q;Vk4c*7mW$HnM6hVV@Ez(D$(!ex(^#?%MVGd19-c|HjLfHxRLARtN!(85gErhm& zZ<)8qD_5JF#@NsfI^3A&vQwxmSI9hIMB?E^lDJkxe*ehye!fX7M(t;ra45ysPuv-DRI`yMzC6{j%?%co#MB@LW^ zU@w7ZPEb6ugmI0)D#vFb_2T(PGvg}kY>tq6(LAFNH$q^++@a;*@|3jOog`zmk{6-gH-Ypje8Y_O(j-5j4EGC`1J+G+E$F{% zflgkAwJUT^-ZtogCuE#hGAVzU9O1=}wS7rh0G42|19NUj6*8UBZ`Z&ap@r<%tpX}x zuv`K^^6U4Ys7MNAuG6l>W)^o2PRLWYWNo-n*mHwO3|&ZK%xjQHNhb3U1Y(#LM+a#_ zDxD#LNDRIq4fK^x2@?qT}8Ec5v zJ>fX!%#AY`cNAYsbmDdJkO{h^C}Ut-j~j5elPiw7EY(#K?41g9Y>D2;L&YRQIvho( z&4hP!+6?|J<|xHnBc@F6<0zFJSjNBeILgTWD8zn(p=l1hoqv~clyh7Va#0%8q7UFD z$#+Djkz!4kStW;ZeY#i&94K8gqPzxchS{XJW7p4FW+&+42w&uW9@G33Fh zAxU;>!bCeY=as{&?q63U(NF$r<-WBw%s>+GCjlauj&SL00t z3cjd3Sn1HRXiS5}p4~LUh7ERQOsAd3k^VaEvtuqAVftel`>yUPo3xvv?K(p)ipJN+ z@1|&GJB%g}3?It3#P6=6c>5r1ihjgi8!Wc57dsuhsbfR9NfZB%6xu0nV|JmPeAf*z z?y%3G4v(bq80;o@r@a`z68;CdHD}*Q%A(e6eUGi_w@NtqX&E#ncTsiE9!s)Q6~}Vu zV{Vcr)3RtRMe{*4`VeMU5f(=!DJ*oXYYj7KNq*iv5Ex3(35-vw@8=1a`3&2_) z7xG3it%LJsIJdS_;Slk$p^a5D+@gh+*R^>!InCL9k)6N9>`PwnXdq1uJ)0Wn&ELI& zs_o6)y_(>lN&z=mF@ zJQTk}WcUD=PR8%`%DBLWFP>NO0~^k5Q7#K?z8Ip-n=OSkIg60nTTLApacJKJMRfSNfx;@s6L4a#QhLde?d-ek@^HV zskor}G&!jfL3JlNsRM)RQ{uINc}$iqAAb(j#*m+r-H zXuYj(Kb<%~`w1~(>R$Mr6%@2k(-}kWROrGeD?n9SqQAKk#}~RwxDI3hkOsSrwNENM zQ=-pN<4FNx2{JH*yP^3IJtowzz!*8R`y`449N2w|DiBL=(?{Yw8mf6q*vuQmc0Y7K z1_yjF-#-s4P_G(I$AY@m&L?jMNWx#I{RzWmoD&GDyls{0+Td+; z(s%&K^tz?TKo{4mk-EcPjErz|0H3E98yDMq!iGrmodfK(*$(08W5v<1vzRCyc)5R# zqC1N{HwKVZaZXZ4@rc}x;>&Q^_T^a}#ksbQV%$brJSw@PIM32ioDcUE!#avbXLb}% zMY8dfiGiyp*ixd?xS`+9r&({?MGY+E1~;Z_hbNAtrbmW{**};?UlR`PBM7Y>p75rT zmI^VnM5Si@8MEnmc<7hGvI8Jjpy(-% zkDH8)lPGL{?IkazC{Xk?hg}t&#uM`)Ou*wrW2an- ziC>bZieW#Fd1mBbtGCv}-MUZ#mJZzA65?+2K zMR?gouaRI~X1EzD(#AK7qx94ASdV1z{x=3Im*u1B$dk&$7`X}OFrEw8FR$89;~mBs z%W;6_NyHkyrI1Hoc4-`GZmaFO7F(Kf61tV971BVVq>BXFcr zkzqKv65oP@EAbdRPzj2xe~l|4&O4W`N51|~;JD_>7%FOjRly5{I*HGAI5sD`dxk(N z{gHKkUdQU`ME5QAUpBK8z&NJ9tUt&n2Ah5syH3mDX4qZOPqP!F>xY9zvQ35o`@@yG z7vGULz&|}g<;pI27TU?JfM6KOR*PO^f7r~0Ke@q!N-{30NeS|qE%M#abk6H6afx;i zydS)eI_v~XENT(Ak*+}@2LpuIJv(uii6fs&%hc*Woq%n1x^eloYkL6QX28cjOlM+F)sfVe$R1hZ>Hyfmq&wI9?}`|_u8H!ydtiRRjcN;h=hl;KtP{Gh=cs@QhcsN< z%5y!T(rv$<(*$AW#S@OVbO!@A?H;Mgj%-JT^%PJhVZ)Kr1a0B5G$eBJBDNPD>lYGI z@HxMNdRTPbOk;|Q_0RZpLY;oZ>G4`D^3dw&`WgC2tVE)^I>fzhSK;7KpSH7y=#~@Z z7H}u?-J{9t? zP$PbtW(83@x1Oh&s-#C7X6Tm#8b|WOKoBNToaT$-bXMylG0QtsXtUUdmPNb9B5hbb zpC$tkl#eVttPF!aRLC(X=mWeyL=KSx1mz-Va$xgRNx7Zs1X-UHst&mR@8gBJ1~X1> zw76P-6DbXQ!AN%*(&cly@!XbXqMudk?;>B!=&oz=Mf*Vc<%m~C@#LY@_0@V6vO(** z+=$Ux&e%gwxhEe&TL`GnsMhbn(X~FUT3^Ln9CsJpqlJ2K9^X%jP{}<(m20aBA z8kEHa=XC8yY_xlsG7M4aQq?}r#?kd80z?hI#Zetyk5I<3yQFari@Vay*lQEhpfI?u zz4J#w^~SY#b6!umrC2V3Za*YbNS@UZePD)ugV-rJM8gTOZxB`{OeUaM? zOZzOq_y+`TJ;$?h8j!zHxG%s7a;=_a3fy9{VrhMgKOry(IX;?@FJh#lT|^cDoNUQ1 z*KjvMw8HJ$dx%T=I(L(U?T9y^@qvw_ApgxueUS3G4QbIGuI7bs!1O)|BN$epFwcxW z%7tvmCAx!X>1KDl0=en_?&vztbAa<5X69>T+L2(YF6#G86?*s^;q4CRXeVg&SYHTdhIjl74(#Ptn!d0)mU?j^yknw5hwKd z`Ri^>TmlVl{Xe(ECAb)*Bnxk4r8j=f(_nh zE`zcJ`f(z6h!c8R24tLjsBk?7t;R}ZxTSO<(WmNrE?D+}#fQQ}uI56tKj?)WdmZwB zu7`Ti8<4WA`zwr$y$88Eyr0L@hUYar$MJlCryEZn9tYxh@Z{r}gl7hxGCY-dI(_=J z$c>MQaL*<8_wWNZsRpw!6WmZ9lvu_E?(f1KX+V47K0{7;ityM3T4OVi<2A^Ttp+a?5#*shHZCk%=e=YDn^MwRf_7StPf^ z*KH>|V|XXiJq~!MM3VXK&^`r~6__o?Vl2H255X382QO+|O7Ra^qX|vNH<~Lu={r#I z4`{SdT6SA$Ad7h*i;*;oc-I}iPZ8}?E6`2oBG5-uw;ig!zHW#c&a^7Xha*@>Plm$e zp+=ZRL75_PNa+qexO6`O3^pw;PwMo2KwtemQg0)wU43bMmvn31rRWk!3l`3GD8m7C zT1%2=ctMN-aH`;9P}>Z`KNPU#qva1*(UOiRz4UaLw~rdZSU` zo6C+s#TORpvp~%kMkFFtQzX0*$%RNMh-4-E3pHQ-v%h4AC|RBfufWD+Ny!OpOaZSu zP;o9fa%HRUT)`Jk8_xmZwzl}rA*yR{NeaNYrENB9*ArTNMteK-;IjR+MTib5M2FB< zT!*ADs)y|n6GvzHBx3k$-rK2-#PpPSEOIs~n6sM>gK&)4O{YJaW1V~sM72OB;8P=9wdzLT-?zM8<=j{xZ!;pzPSPs!PT;u0~m5^Y04(yI} zctKF~f}rRfoe3uB3$$ezHzQ-d$NE%&LR&cGDGqtU#sxvgK;+jf!BVGIg8RbVT8SfA z>d{J^oh6t>m`|lST8SrEnyZ!Mh<;!kxx)EXGrP?b_-KoEtCKTwb4H%pU}=6WGHfj! z-BNNHBe|lU|GPdOq;n^E2k%_B*|~>VFJ_R=o$n0%&lYViU6aWDi(byHMK@!v=C_t# z*5VzF9$t)n&g@~@+i>nj)h{(MzPtg=JXD_pwc3@%uw6A9LTe-@NjDz?X<7s`_WW;E z|I#7-m&w?L?}B6$QZ4oCZ_T1TgYT#3!?w*#b?28;T~nW49a_1}um4CSqE*U?(*4!d z)%EM+Q_$VabhCr7aBAS0m(rCrHt;)#aqwOzT|5D3Exg4+PiS6dM;Vc!Tt8< z?D902K7s$a6gq1=Q+XGR(0yNc%uZl)7~M(D`QJtuSydySAW< zElPUe_eq?8;P(~;-9{$RotqH^Go5VTOFdeQ|67j+0HLb&Pho^H!Qg7Qx;sleQb3Yg zOKMw6u4pZ(X(<`qQ*ws|d(NCx8|^uFq@IU|6`aC3sqTmk-=DOW+*y$9+IvhrXOo9- zDMG=@jE<5~(b}yWSA3q@;3j=ld`sfH(c^ldWQE$6cHpks+S;=pw|{Jf?Bui2mW6q+ z|3UFOO7d9LiG^jtVX+p)9TN#SR8v5rI)iX1#T8; zF|{q;@DR{@?xSoGMf4G5&`~ZLNct@grgJrV$2h>0j0xIXLaG$lAmxb|Kjnq{r7tm{Sg`l(Xx7l;9T)|9)Cynrjs zOv3pLzZtUKTlm?gPw-f$oY+sH9k%og?H#sP(#LFZpkS$sfuty87?Q!|LVZ{nW$LDO zq_|#Ket~UPx2&{Kxm;|eUWal!%JQrkCJ4p6%+9u2b23uxPJ6Z^8z1hW)=_rjFBk8O z4E`Wz+@D*xbKxz*?RFzorrk=Z|8TDlXJ&d3~^je>G0k6g4O zKYMgW_SkI6^5tlrEF;>;QQ7%dP&9(a*uxWx9q510B)8}kGPd7d{7&eV(hQW?} z9+EW(Wc_;&!7tZd^@+b(frADje}|!>;r-u3Kf!m3@om!fz*}+c&Ei~uuM50m$% zyrI3>I;6bi2;FAXXm5dHS{NU=(x`!G+Ls5~e+F?Y*WUKjLoid5viVJt_jEH*G-!pB zr(Ap8)M?YNpHX+x1NZ9-)%pPVzn$Czzd2vT`5-dB>MZw)r&#dT%9Y)*a7Tb+p?RAi<-eH0H!gscK zAfSZ&k54$(YIETBz|z8ZHvc2e9Ci%HO+-T8-qw`WVg1_K<1p4~sno#9p~T2HdJZ8kom zcJd^?K;6g4#IIk0ev46*FS&lOzUpHJmmO;F-Eud0PjZA;K&+iL4K-`z1no4H5B_C4 z`-*Y+Lp%3=igr%4$F-9v#1}PmR4{|$$2C;qhLR^}T6J$A6Te=F(^Pyr(a(tlC#JL& z+9`2E;eN^q?KTV)73QWXxlt}HIE~8`SCR*94$YPpNedT?gpI!!`dY@yiS>=aWlYdJ z19^~_oCmj~S{C%r8=s+n(t#d`dEgU@a~JiI2a^GPL}}vssE+%HJgJYmk&&Ni+y6!% zQDXEF<@BXKqOjmJF7wNMMBW$m5yQGf)1Kl>@&f4XaVvsZB43h?m7;s7d|quhgR4ax zS9v>fg)vT9Vw{Y)(tx-WBq?u;btTCY!%z&}l~j;zB5F-P51b7wZUvogAdW zYpHt}0Ico|_7tPG?jkZDpbY&|0HjKlD-CGUh^fKN^@ON9cTpzspu)JE;XPD~We5^4 z8~u0hf(dCeK`t zvrFpC)pB9iR%AF+k;`Uoke5apu}}NlU@N$T3;WdbQN{iuf{Oz;Nb<7nCpIr_wYH>` z&YBzfdn{h`fxabrF-Q?)m&ZuUen-G8vvlI55g8pe^DHs)bRbhd>~+f&=P$tg%e(SW z>2OC1P8Sn>4wEo}IfdPP@TC#*ff6F5`P%{C%svDiBk>i>7v=P^kk^L=H1Myq_d`Bd zjH2u99w2ymh{wnuzc=>ZUru*GUX+<38(&9MUYvcNrycdoba45=Z#o@Xd|JB=qmFBK z>V-jd?N6cQX96=vNKlvAge#roiP~RWdp#pUB^Is2wbzzYc&O3cv5m5^l;ZoQ!b1(+ zYP(haBCX*FDFle?fK5CJb{{I7z~$oasMg+g?ahp5Sa(l21|1SySe=fWs^w&FN#u6} z?9@Bevfffxpo(KK|J{yZkQyj#%PAZsB|twd~Ntp7RMauAK^ zb`taETxPE+Fsa=;)}0UdH>t<>MKR1)kTq+IJPMK>IE@xA?`t6W0~ch%`z#$34l6Gh zXdmc4j9XqBr_dkA!UirUfHaP|c1fLydoEL>PPZxJMIgZhfT-!!)w>+$M#5Pm zdhB!H;gH?CBn~K=ex-nG5L-#B-gOcnGkT21ONa^xJbhqynranl(OLqqn{Oi(g%;%2 zPzktd3SE3XWK%<)-(cmyMq}n!351~{`cX!!n=)~c=H;C>u-!mUE5jH5qH<=jPOLXn z)V!?zIYFpQEH9?7z%n%Jk>6?O3Q=a$Hkdm>blN7<`O0Dcg6pm=n>SCY@>U9me}Q-I z$~p7rR7vdeEm|~xfmGu4`YNlWlCm=L^i@?Ym^a5?C6&&ZUnY4M%%AV`R!OsbRkIiP ztLBuEtJ3FNG{2<6M{Y_I?_PkM<}C15&66k--+XD2uVO*9Pvl&_Xh8+%y~yXSMu@kX zd?deb9+lzup+NenT7VblOu6}IFRm(Euw*`0*~c}Xx4_SZQ=HeT%C5gT+_nf<;x*?3JSPFoy@9E_E~{bwgR@1$b90E1sgBUHDaLdKaPB>P1Px+YKr8)jGC|7-4gprfkJd?qtV1~NFYBtTh^ zaT~VaA0P@WfkcP=;opJ@q$F*XvMOY!qpccd610RQ3<8g5bb4x!(c|u#)$OsCy1HvM zO6x+P3A(6=?Jj%jq3E*mrpa+r%z-p!o&Ejpz3Q4JV}60>;cvi;8_BEY7a1v09^#2SEo%c`~)~kfGh0*Ao^y6juBwGJ-}N8_!R+W z*#qn&zzG7(u?Nrzz&#?gz#bq>fKvomWe>2D0H+C1We+fm00sfRZV$jX{h@vWY_tdX z2q#)-fB>890e(q48|wS9R<=rCUn*uJa`9pTH*Y+ud_`A9k6|B7`mnlRDaPHqOtV^9DgC*fAqBB++O z&C6o|2Lr;;^!ep45Hmv@wkf{L$!1m^C(VrM+lyj2)65e_>8@YI(>M=*h52qY$haG~ zm*5`F(jM@#aQC|x?aSDnBQ3b=!$>agx||Oy_Ey4Xb;rW6ZDFI83`6w z4m2V$HiCx@01`xld+VU_&JK{Ea-dfvj%546ft~~p3KA3_^0z;TC&dC$V>2w3bkF0( zo}Up-G^>1B-|g}ClD}mkeLY@HR<9bDfulWur!rm=sX)qxUd(ixYm5$u0q|$2ve@H~ z7KrjsAfTD%*}GI*(_hYee$1aa#Ty3vk9-f4$@p_R$oGKR+0eheAdUjb`A?XBx5%{U-4`8VH+y+;Hz^Xgb|@f@WA1Cp^%CBW839aKaICWShDX0zHuW zSNC+u6q}8WMdw0fsNnwz5S7g`|5bG*xMoBzeF={0+Uj0pFE*21TCe51NN)wHd~(Ya zTq)>nYz6WVj}&hk@IO+ z5%KdeF$yq1s(90r6fKA?_jrx3U}5XG2HQPio+Vq!cc-O61iQLSHEj2H1QBpEw(*kk z_y1sbI$rz(B5u6;Rn|$~IVPG=am<4--btUgOae5WNy8^t;z_PaZqKCbNt1ZzFyRXP zk^fAMegL}r!m^vcI&1bd*Isx1oVh8L^5P{Wr8oUWaOqdfB95O~7tv`b;o<2BhAeB~ z1oo?;O-;Bzg=vc$F*t?V+>)mp*FamdH;Ef!#FfQRs$FX)tUnll#A6ONsg9X+@Jy!G zJOUailerg!%?(UR_!FOK|eyc5F{hMnrfpHl9IT4HtHz- zy9FL8E?K&Hgwq$>Y@?ZwhRGq#tAuPVa*e2yNGlJ8AW3*XIk)EhYGWo;G!fCM}L% zqD>uUn=n#dG5`CrZFthQ4OL%c8y12N%HU|UAB7kgiU^#IR8Hnd zB4iow2(_cK&B5-E6D7*)Dt&{4U4Y6n>{FZg9#-{2yUH> zOq7-PW^qsBzrG1^<5RL{a-J!79MwPNwqQTq^zk-bo6D{tQCPCUlioeVRy+G4OrduG zV?5QrW~csbgz;FZ>|vMaVMBhhAurhgRbYe1v8NQcgc~w@S}>-kv|%y)slG~;w$hQ4 zhhbI)xB=M4DUUkp2C zM-qd>9-U@P#7%}6HtDb@}G?xNs zhQlXCvwu)!z4}TIf=(1A*_Ll0a?WDj|?s zf-xCdXde`r>z;`W)iupePP;O(uBPPagZqc zn46N#3K+GOOgD})+Pm6HumbX}6#zPmy(Gs~IWoH^`WW6xJ}Wi%xRa#We>zV+nLu#m zbcjhvi+7M8(>R`LSHGN$hj4Ra4Y2DI93mZP!}?d0{#P#4SM_XcwO z-EjV&9=i$t`GS9HUESddGJb;mwW-7PuL!yZ+mW=m>E@*l?^CcY9FFt#d9e>YFpI_@ z^I!^*JiH690oE^q$Gw@vTLu17#SXq0qj^kCBSb33{ZMMLfRJ9$!?^YLfBH5JUZPFC z&=-7RbSk@)JaSaEMhJ#bcADHPC3k+3&9w5bQ-pusO8)|CWe;tcs|K`{#)@}F@O&uCv!S0Thdsh89Q{FJ7zk)y#PfeIhSdeB{S-O#=t8;%Vh*N0**QFxD^bMx4~wdetHo z>c2YKv?AG5Z5R`U-8(L)n<|n`!DLejo^~2)jADloAGdk3@jOHjs6@1EN$x7LE{z$; zy90mad0RLw=Yg3obS0-Za#p>LgnWOhGBVG;YSW4fEM-%PV0Wj?SMuR~J+jY}om-KT|Z%fk|y zADV_&)uE$f-b@Vz#G3+ezo}4fC_{I389A=62tF|RfPz(ECsFVOrI7k%h(w*Nm=~S? zA4(_uOP@8ZrK}9=SJn!pdLDiYZQ2`$Hh*X9oK1J*0?^r>CRWNOXGErkfSy&}DeJX0!}Z#Rp%9*d;;_D|hYgVM z{166MV!YJ7B=Q|1B!S-SAc9~r(_0c(WjGa#98?3s;X0tk_!Q5@_d)oPoUPZI2Nb&g zYU4cK33TR6QGLmS2;vmWJM4oe%7(!j!Dgw}%^LY)mo zFFL8MdGPC1ixx(aA7Cgpl-jYLxY73 zl9t~`TpeGQ%&;GeLZ0=)&e17_yVPCPGn$(dq%L% zj*E?3-*CbjhtG$P@xBDUB^SXbkO3u-0cAg&U#IM?{CH3KRA8p8GX^)~i#uE;ne>!& zq!cFuN#|Wi&}Brq1Tv-E=nWFCH1-+>-~MW)O+xG z5}#gtp2DXOpC9Vw`C8>^1Y<{>2gZ>R#jnMPnDn*Mgem>A%s1zAY(uyZ>l4i|7GiB) z5_z6LjwTpr5L}Ea`}dYl-BbCo)fC2rF`FRgyrrIiHp?l23%o@AJAZ~#sOc|b!*2gh zCTwn+!i*C;&tPuD>(amTV|yvVG?5wJ0NUWlGVIcoRs{bqyj( zK^$Y5S7S8bA}S$lWNO1J#9mSxUM2Jywc(Wl;wfC;nRy`;515*&v^LMH4zGrttl9@~ z@Z!H)Mzt*RSJlR=Z=i3Io9e5Oxa)ztZ&3>GN`-foz$@+#5pSY5+v09va84Z!x|8PB zD#l&JIC0_u<;D$nEKBR2D|FF`Zje^p-QcaIGA!WjL;L)0eOVAG>oOb1!MNx#F-EQ1 zS3rlOFRK7om!L5=+fzBj1}XPWP>8?O(bKQ3Hy8zE9il-X97sQQwElJBySTEIr8c8WNdcayyB?M;WACa7C^(AIa9?xF(`y6+O#VxL_7h7uY^op8?&n z=RMdAMY7BAq~$FCT&FJ&6fe(jQL*=#o1iM7PiAS)n|fV9&*_Er1khw8mj}>Tenp53 zkX241G+9uL!BoO`k0DwlyT-V)mm7c#j)Acdb76|}UR(4Atc6~?0tl>u0VNfhwc)=e zj=Z#E*I#Y8fI(?N`*7nqfbb_+UBK14=(ec4Cu44~6^e$l$jC5&(G>{*ezc7O?rG~R zB?n=98)vhu=_e5WW@_udgl&qtqgY~zb@`FGa=QCE)a}&_UCw9E%63m%Y+HBG#a8-i zjE&sKk!vTVN4^MSWtokarJ=h10#wt-qGHCxbK<=5nv&$}O0_Bd(d{W?DXno{bA$PACpf=$+YPMTY2CL#!X-!u^0Vr@BA}kwugT zUzE`Y#ODqZv6y4|PA(d;Qet#Rt_)p`V#Xm9NemGG!sLSM1fJxAS@<*-!26C{C8B0x zw?Q@^=5FPBpGI%?U!X_|IWixjNUX;fo`~ETV2$w>Y%^0@;?8j+aXch&z=aPxjPajX zNnt-Z;ei_CD1IP*kh{LO^7pQc&UvUwtNcWZo(JQiRep-77^(>#p}S@iW?@H~kJm8C zlC6e?vuN}_)CIi6!6wwegGIDH%eVop?;CHvppbrAu)u0fin!%Y`!faS39MhQL;Qbs zRbTFVnhjkS&R8q_@Te1zl#P~+qS|XXos{UuBRfU2G$^<6XbS2Gpkgg~nNfeZ&L}(t z(!Go)SkG-OkT>8f^Cf<1gn|KrlF;VII^fQf3%ua4d2R z4n$|9b;4!5gXegN>~&&_p`;aq9CK1KKA5t$J56lK#HR7+@QvLVrb@(zWfd9GaR#$9 zqtYAX6IXOxc&l**fda_y<7ygjOaSRb>o#~1@PTgzrnJ$0B{iy3Wjw5RDQ^SD|| zPh+A(Ckt(NKIk3BdF6x04ZN02p_g}A_U%`N5mZm)S|iyQhvlNWT&oO3-{d?oVbjV$ z#xY3-K5I|6JzfTd?jpm{xA}Yz_kqZi)?s&a+@52*$~`5n$aP&aFwA``&>wQ{$s5(u zgt3j8Bj~yp+yXY5jgI4-gm<+C#Tc{R^F5p?(K9HrUm32DmQL2bsw-0UkW)%-5~C(b zsOW*RJwcC4-V-VvfaBN{z0pPdbi)h!U(RgpdWlmb;%j{Xi=jN$oe3Yiy_sbtb0fcQ z$tjr=@gq-0$>PY7lG`GO8K3r5mPXfJ2Myqr&e*jRdNSvf;fz^lkcp7zAZ?7aH|ZO; zU_UXypDeSr1o@tF1)=~EO(LGfkqN*vH{$iBJ-1<@KNjo_b1Qcy?5iGcrAf_dZaK9Z}JK9kNiTAXIRC? zZ>7VuFWmPW27K6j6KDAd%5N)#ZhqhMQ7_&OLBK-{gR120BP=a+5^^Geg^cFmZW?0@ zUpfEFE=IxyHLj#roR2-vDPMX^^uH{Jt#}-mJPD8}V~&2n`i`IL_5Rwrn(X?Aj<N;@Q0Kn^hyRr`e2{bN#&2!#zk;8~5ziyHTb^k$E(~Nhhr_fzI;d1c6e5>` zdk~r%D2g^fQPeCIMYRUwh$^*>io9s*Z782MI~y4wfE>0;vZ}2A1Hm-Vyqdf+W0wkS zL%?(n7zaauLkyndc%iW2z}aZ>Tq1Xw!(Ise5c~nHe=D-Kfa&e7e^rInch#H zi;8-e)6Y`7I)fL~Ns9h|__tW8R0H$o6mJS#e|@0*o_p_a`1ap~B7s?V&JGk67vFF_ d{wxaIaetulj?E27E4V4J=JrTrGfV_B{twjJJ)!^r literal 0 HcmV?d00001 diff --git a/tests/hello.c b/tests/hello.c new file mode 100755 index 0000000..6a52558 --- /dev/null +++ b/tests/hello.c @@ -0,0 +1,5 @@ +#include +int main(void) { + printf("hello world\n"); + return 0; +} diff --git a/tests/helloc.exe b/tests/helloc.exe new file mode 100755 index 0000000000000000000000000000000000000000..b9d12df176847dee753fb54fca52da939bb5bdbc GIT binary patch literal 60171 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 Mz%6}T$-MD@0FY$zd;kCd literal 0 HcmV?d00001