commit 83972b17cf8b4dfa9613ac6d8cbca41e15ddb638 Author: JoYo Date: Fri Jan 8 19:47:59 2016 +0000 init linux pic loader diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 0000000..e436c18 --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,71 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +# All Vagrant configuration is done below. The "2" in Vagrant.configure +# configures the configuration version (we support older styles for +# backwards compatibility). Please don't change it unless you know what +# you're doing. +Vagrant.configure(2) do |config| + # The most common configuration options are documented and commented below. + # For a complete reference, please see the online documentation at + # https://docs.vagrantup.com. + + # Every Vagrant development environment requires a box. You can search for + # boxes at https://atlas.hashicorp.com/search. + config.vm.box = "ubuntu/wily64" + + # Disable automatic box update checking. If you disable this, then + # boxes will only be checked for updates when the user runs + # `vagrant box outdated`. This is not recommended. + # config.vm.box_check_update = false + + # Create a forwarded port mapping which allows access to a specific port + # within the machine from a port on the host machine. In the example below, + # accessing "localhost:8080" will access port 80 on the guest machine. + # config.vm.network "forwarded_port", guest: 80, host: 8080 + + # Create a private network, which allows host-only access to the machine + # using a specific IP. + # config.vm.network "private_network", ip: "192.168.33.10" + + # Create a public network, which generally matched to bridged network. + # Bridged networks make the machine appear as another physical device on + # your network. + # config.vm.network "public_network" + + # Share an additional folder to the guest VM. The first argument is + # the path on the host to the actual folder. The second argument is + # the path on the guest to mount the folder. And the optional third + # argument is a set of non-required options. + # config.vm.synced_folder "../data", "/vagrant_data" + + # Provider-specific configuration so you can fine-tune various + # backing providers for Vagrant. These expose provider-specific options. + # Example for VirtualBox: + # + # config.vm.provider "virtualbox" do |vb| + # # Display the VirtualBox GUI when booting the machine + # vb.gui = true + # + # # Customize the amount of memory on the VM: + # vb.memory = "1024" + # end + # + # View the documentation for the provider you are using for more + # information on available options. + + # Define a Vagrant Push strategy for pushing to Atlas. Other push strategies + # such as FTP and Heroku are also available. See the documentation at + # https://docs.vagrantup.com/v2/push/atlas.html for more information. + # config.push.define "atlas" do |push| + # push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME" + # end + + # Enable provisioning with a shell script. Additional provisioners such as + # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the + # documentation for more information about their specific syntax and use. + # config.vm.provision "shell", inline: <<-SHELL + # sudo apt-get update + # sudo apt-get install -y apache2 + # SHELL +end diff --git a/pic-linux.c b/pic-linux.c new file mode 100644 index 0000000..b592888 --- /dev/null +++ b/pic-linux.c @@ -0,0 +1,109 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +char *picProto(void *picAddr, size_t picSize, void *clonePtr) { + char *(*cloneFunc)(void *, size_t) = clonePtr; + return cloneFunc(picAddr, picSize); +} + +char *clone(void *picAddr, size_t picSize) { + auto retVal = EX_SOFTWARE; + + srand((unsigned int)time(NULL)); + + unsigned int picOffset = (rand() % (picSize + 1)); + + ((char *)picAddr)[picOffset] = ((char *)picAddr)[picOffset] & (rand() % 1); + + unsigned char *digest = NULL; + SHA_CTX sha; + + SHA1_Init(&sha); + SHA1_Update(&sha, picAddr, picSize); + SHA1_Final(digest, &sha); + + char *fileOutPath = NULL; + sprintf(fileOutPath, "./%s_%x.bin", digest, rand()); + + FILE *fileOutHandle = fopen(fileOutPath, "wb"); + if (NULL == fileOutHandle) { + retVal = EX_SOFTWARE; + goto CLONE_CLEANUP; + } + + retVal = fwrite(picAddr, 1, picSize, fileOutHandle); + if (retVal != picSize) { + retVal = EX_SOFTWARE; + goto CLONE_CLEANUP; + } + + retVal = EX_OK; +CLONE_CLEANUP: + if (fileOutHandle) { + fclose(fileOutHandle); + } + return fileOutPath; +} + +int main(int argc, const char **argv) { + auto retVal = EX_SOFTWARE; + char *fileInPath = argv[1]; + + FILE *fileInHandle = fopen(fileInPath, "rb"); + if (NULL == fileInHandle) { + retVal = EX_SOFTWARE; + goto MAIN_CLEANUP; + } + + fseek(fileInHandle, 0L, SEEK_END); + size_t picBuffer_len = ftell(fileInHandle); + fseek(fileInHandle, 0L, SEEK_SET); + if (0 >= picBuffer_len) { + retVal = EX_SOFTWARE; + goto MAIN_CLEANUP; + } + + void *picBuffer = malloc(picBuffer_len); + if (NULL == picBuffer) { + retVal = EX_SOFTWARE; + goto MAIN_CLEANUP; + } + + memset_s(&picBuffer, picBuffer_len, 0, picBuffer_len); + retVal = mprotect(picBuffer, picBuffer_len, PROT_EXEC); + if (0 == retVal) { + retVal = EX_SOFTWARE; + goto MAIN_CLEANUP; + } + + retVal = fread(picBuffer, 1, picBuffer_len, fileInHandle); + if (retVal != picBuffer_len) { + retVal = EX_SOFTWARE; + goto MAIN_CLEANUP; + } + + if (fileInHandle) { + fclose(fileInHandle); + } + + char *(*cloneFunc)(void *, size_t) = clone; + void *(*picFunc)(void *, size_t, void *) = picBuffer; + + char *childPath = picFunc(picBuffer, picBuffer_len, cloneFunc); + + retVal = EX_OK; +MAIN_CLEANUP: + if (fileInHandle) { + fclose(fileInHandle); + } + if (picBuffer) { + free(picBuffer); + } + return retVal; +} diff --git a/pic-windows.c b/pic-windows.c new file mode 100644 index 0000000..b9d8ae9 --- /dev/null +++ b/pic-windows.c @@ -0,0 +1,154 @@ +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#pragma comment(lib, "Ws2_32.lib") +#pragma comment(lib, "Mswsock.lib") +#pragma comment(lib, "AdvApi32.lib") + +#define PORT 999 +#define PORT_STR "999" + +typedef auto (*FUNCPTR)(); + +int __cdecl main(int argc, const char **argv) +{ + auto retVal = SOCKET_ERROR; + LPVOID picBuffer = NULL; + HANDLE fileHandle; + DWORD picBuffer_len = 0; + DWORD oldProtect; + char *fileInPath = argv[0]; + char *fileOutPath = argv[0]; + FUNCPTR func = NULL; + + SecureZeroMemory(&fileHandle, sizeof(fileHandle)); + fileHandle = CreateFile(fileInPath, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0); + if (INVALID_HANDLE_VALUE == fileHandle) + { + retVal = GetLastError(); + goto CLEAN_UP; + } + + picBuffer_len = GetFileSize(fileHandle, &picBuffer_len); + if (-1 == picBuffer_len) + { + retVal = GetLastError(); + goto CLEAN_UP; + } + + picBuffer = malloc(picBuffer_len); + if (NULL == picBuffer) + { + retVal = GetLastError(); + goto CLEAN_UP; + } + + SecureZeroMemory(picBuffer, sizeof(picBuffer_len)); + retVal = VirtualProtect(picBuffer, picBuffer_len, PAGE_EXECUTE_READWRITE, + &oldProtect); + if (0 == retVal) + { + retVal = GetLastError(); + goto CLEAN_UP; + } + + SecureZeroMemory(&overlapped, sizeof(overlapped)); + retVal = + ReadFile(fileHandle, picBuffer, picBuffer_len, &overlapped, NULL); + if (FALSE == retVal) + { + retVal = GetLastError(); + goto CLEAN_UP; + } + + if (fileHandle) + { + CloseHandle(fileHandle); + } + + func = (FUNCPTR)picBuffer; + + SecureZeroMemory(&wsaData, sizeof(wsaData)); + WSAStartup(MAKEWORD(2, 2), &wsaData); + + /* create sockets */ + + OVERLAPPED overlapped; + unsigned int listenSocket = INVALID_SOCKET; + unsigned int clientSocket = INVALID_SOCKET; + struct addrinfo *result = NULL; + struct addrinfo hints; + SOCKET socketReuse = INVALID_SOCKET; + WSABUF messageBuffer; + WSAOVERLAPPED sendOverlapped; + WSADATA wsaData; + + SecureZeroMemory(&hints, sizeof(hints)); + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + hints.ai_flags = AI_PASSIVE; + + retVal = getaddrinfo(NULL, PORT_STR, &hints, &result); + if (SOCKET_ERROR == retVal) + { + retVal = WSAGetLastError(); + goto CLEAN_UP; + } + + listenSocket = INVALID_SOCKET; + listenSocket = + socket(result->ai_family, result->ai_socktype, result->ai_protocol); + if (INVALID_SOCKET == listenSocket) + { + retVal = WSAGetLastError(); + goto CLEAN_UP; + } + + retVal = bind(listenSocket, result->ai_addr, (int)result->ai_addrlen); + if (SOCKET_ERROR == retVal) + { + retVal = WSAGetLastError(); + goto CLEAN_UP; + } + + freeaddrinfo(result); + + retVal = listen(listenSocket, SOMAXCONN); + if (SOCKET_ERROR == retVal) + { + retVal = WSAGetLastError(); + goto CLEAN_UP; + } + + clientSocket = accept(listenSocket, NULL, NULL); + if (INVALID_SOCKET == clientSocket) + { + retVal = WSAGetLastError(); + goto CLEAN_UP; + } + + socketReuse = func(); /** PIC test here **/ + + retVal = 0; +CLEAN_UP: + if (fileHandle) + { + CloseHandle(fileHandle); + } + WSACleanup(); + return retVal; +} diff --git a/waf-1.8.18 b/waf-1.8.18 new file mode 100755 index 0000000..84799d5 --- /dev/null +++ b/waf-1.8.18 @@ -0,0 +1,170 @@ +#!/usr/bin/env python +# encoding: ISO8859-1 +# Thomas Nagy, 2005-2016 + +""" +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +""" + +import os, sys, inspect + +VERSION="1.8.18" +REVISION="4bb74d2af0d005ad4420ee36f19f050a" +GIT="878ab1e29494e28236a260212a5021b1de35d9a3" +INSTALL='' +C1='#3' +C2='#*' +C3='#&' +cwd = os.getcwd() +join = os.path.join + + +WAF='waf' +def b(x): + return x +if sys.hexversion>0x300000f: + WAF='waf3' + def b(x): + return x.encode() + +def err(m): + print(('\033[91mError: %s\033[0m' % m)) + sys.exit(1) + +def unpack_wafdir(dir, src): + f = open(src,'rb') + c = 'corrupt archive (%d)' + while 1: + line = f.readline() + if not line: err('run waf-light from a folder containing waflib') + if line == b('#==>\n'): + txt = f.readline() + if not txt: err(c % 1) + if f.readline() != b('#<==\n'): err(c % 2) + break + if not txt: err(c % 3) + txt = txt[1:-1].replace(b(C1), b('\n')).replace(b(C2), b('\r')).replace(b(C3), b('\x00')) + + import shutil, tarfile + try: shutil.rmtree(dir) + except OSError: pass + try: + for x in ('Tools', 'extras'): + os.makedirs(join(dir, 'waflib', x)) + except OSError: + err("Cannot unpack waf lib into %s\nMove waf in a writable directory" % dir) + + os.chdir(dir) + tmp = 't.bz2' + t = open(tmp,'wb') + try: t.write(txt) + finally: t.close() + + try: + t = tarfile.open(tmp) + except: + try: + os.system('bunzip2 t.bz2') + t = tarfile.open('t') + tmp = 't' + except: + os.chdir(cwd) + try: shutil.rmtree(dir) + except OSError: pass + err("Waf cannot be unpacked, check that bzip2 support is present") + + try: + for x in t: t.extract(x) + finally: + t.close() + + for x in ('Tools', 'extras'): + os.chmod(join('waflib',x), 493) + + if sys.hexversion<0x300000f: + sys.path = [join(dir, 'waflib')] + sys.path + import fixpy2 + fixpy2.fixdir(dir) + + os.remove(tmp) + os.chdir(cwd) + + try: dir = unicode(dir, 'mbcs') + except: pass + try: + from ctypes import windll + windll.kernel32.SetFileAttributesW(dir, 2) + except: + pass + +def test(dir): + try: + os.stat(join(dir, 'waflib')) + return os.path.abspath(dir) + except OSError: + pass + +def find_lib(): + src = os.path.abspath(inspect.getfile(inspect.getmodule(err))) + base, name = os.path.split(src) + + #devs use $WAFDIR + w=test(os.environ.get('WAFDIR', '')) + if w: return w + + #waf-light + if name.endswith('waf-light'): + w = test(base) + if w: return w + err('waf-light requires waflib -> export WAFDIR=/folder') + + dirname = '%s-%s-%s' % (WAF, VERSION, REVISION) + for i in (INSTALL,'/usr','/usr/local','/opt'): + w = test(i + '/lib/' + dirname) + if w: return w + + #waf-local + dir = join(base, (sys.platform != 'win32' and '.' or '') + dirname) + w = test(dir) + if w: return w + + #unpack + unpack_wafdir(dir, src) + return dir + +wafdir = find_lib() +sys.path.insert(0, wafdir) + +if __name__ == '__main__': + + from waflib import Scripting + Scripting.waf_entry_point(cwd, VERSION, wafdir) + +#==> +#BZh91AY&SYW>99#&Y #h%H4#&`(ae#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&>XFt]3}\M3;cݒiOWт些{kmi{oΪmzl;lwK[w>ƶ^o}ϫh[i;^}Nmv/nfx#&#&`lh#&S}QMwAѮ仍l#3݊:zhW#&tVE#*(:#&P$#UvI#&4WC G}{wg]ha5>U3];Mz[}{vgn˷}{G,o=vm׶w#&4d[Kvw3}gy2>}"$Իݽ8]/lCf;kT:nB jX=z-.lbs΂|G[_||ow].o}S㍉U>www{td܈}Ey|#3c:^ASc_yw]tg{k/;o{o9>7۽e}}yuʯ6cBm#&{/ﯰKsZ}/kkmZs|#&@W*]uVd+UM}^^oL};ݸ2t#3*A(۵ξ7}>_|L3{/{#&',ǢNh6yۼ|^E#;evt}vUۯA$N6Ϸ]=祏7/}b^{WǫӾ){FwޫwqwY|ス==d}؍wn[|Gw{r7}@4  #&2iR= hɣ bS@ @ FMShd#&#&#&#&#&H$B FLSКiꞓL,HW#*8TRsaJ[xqy=#3;11XU#B11(;T%}QȤ5mb67U"U#3LȨx*+aB#& *B#*tּVեTkVֵRA PbX"1FSR%%()2Iba4mJPa($llYXКaJ H؋FJ!L,T )"k[E Af,MJ2PRJ)H̨j+KkMRmDɒdb2ԭc46e2Ԗ3KlSlB6U)S "$m#R4IIFZ)Mc$3c,fi3ML #&C$ȔD6M HEd2e,Rdh)jcRT1dhM `F‰%Yc&*#*)RLRDb#2TfE %i$$Sb-%Q$IEEDA%!L؂I5&HĎd3Fa-S J!BTHi+$ɢ3͢4(Њ!JHI#*"fU,e(R4Meib̍Y EeDeAMAFM,IMm4"12RiM%,hF#3#3(6""JPS $1@3ZDV2"ɐ!MԔ[$V4$KHF DF$*4F#C34!!2h#jlReFLIHI$,EM0P16,ɲhɐi!LL6ɲRd"deh2FS)b0ZJU6h- "RDQcI3Y4HaQ( Q(XŠY&ha%1K #*F%Fi#*-m%MPYI,S%2LcY-)f1IflSEJ4*l)CK-~FFJkhZ*4&iQLi-F*IjXe&5AP5Ȧd62ңH,LKK1FJѦB6dU*lK*2X֒5ԥ)4ȋѥD,V+L@͂BFѶѱQ3IjCPhՊa&aDmfe1%h5(ږj6I+ԅL[6֚a6dBfSSJ-ZZJSSMZjIbLU2MًFffI+,hf6ҬQQH!C$mIMQƣ&MaE"lF @4LF41bBR*-d1JI`1eK1Q2)CLX0-i(ɚ#*"̢T1Ii̓D2aJb(#SM!fm66(ЍdБI%%12[jQ$٩D%TYT̢6)ٍ,V-$2$"dI4%I2ٚblbVRMM,I32hKE#6H"cEQɲR&"Ri!#hFMFEb6i03DEłiI&(#3d,!FFkhЙfHA ,#*RJXғ4!QdYRDHYV42j6bedSJPҒ#3$bTRZ(QUe%RTlmT)(J-IPLذDXi%#4`LDU( M)X(VV#i!#*IEE[VdTh1E& VZSTj-V1Y-fl(#(1B$()F DmhҕDMEDhYE2IH6lV%QEbjJecE(HفX-d5biL4F"کeCI$Z66Z[$IXѭEѵC,[j((#*I1eae,lH1$I2$ԛbڦ?CAE6jFX@?6sc߻IezDL854zKgDvQubiCrX)\nk=şCfOe㌺K;k F#%"Nٻs]atj!LﺘOQmnfN[֩weRTۮWђ:਍b*!d2Ӗuہ2{+\*W]zWm]y'{wbQ?ehQAcWen@nTW&̱0Y/,;kF`:2S4#*᭓? lbURs?!ؚтF$iu-6 8(0[R##QAQM#3w+4&j,NBB|jx'Bʔĥ&l!G>}5˯,Vh4Q)*PxŷRٺjy0Ƞ}ooK#" FG,Hnyxu+$buLTy|y•%]VVXΨFzMiz``%Ura"AKh!DRn#}8CKҍ~fGU/|\~fn"Y\ęꡎehE`]6-v١_ךܪr,ւg܁Ȁ#3,̨{ Iahw+Ս1{E, zu}a@fPKP[h[KVkKs(f[2Z"" gu¨Y3L\܉xrEHkzUhcug{u61^9d5˖ƫ.)- ߶zC,V,|UW#kEAucRSLP6͏sP#]+k6C$k_&™(PHsAuxտK%])}I*+'Qm*u4#3nx2N N۴)&J`/*(T-24GR[N u,AViiƬ!#*Ema-¼g>ڇ0#3<7 l\(vGL)4e#*ُr"O]1T#3Cz#3"8 \kRýT%H" 0g'0m6B(L($*4͊#3#36>){SN@#*i"5" `6=D1~PeV6FU|Yu2Ș ff 1(d\g?&qS*ݾ\jz(5Xi,~x_/.ܻLo+sRgSDSi%@9m!#3?tC*& G)-`,&|hs.Q bM<{q8prw?vx\$Q2G?#0VVՄ} ^* -Q%{T0؎$۵qYtAL"f̓;HʊJA4] gOamIjo) ޻UmMCqv{,rA $Iߏk2 h>GG->iDD/b~̬Fpj]﫳-ig!)9g뮩O>;ܵ5)#*:cD.tATʬTW5!E@v`ZCUBcc$B@aZhoOcS%6)liy%6Tݱv`Ow#Y>WNEϻ!("s=;3i#*H;0mEzW(vK01:e9Ja]En)+O/:|?ouٵꅨEZxY--%,6 7@I#3B`^-|6oL8O=ͻ5#*Y#Nn~_;_SrwALQNZaeŘG%Ht FyڛF.+` 6h;#34|nݞCsӫ GlMyDF54[9C/!Y\메)*PQZ-{4Ú"HzbޙpqIݮ(RoeZweCEe4 UHv&5JGJ\8Ω1q-gѝ]^34rR8h 5!"99"n҇^:{*cC.-uKyɂQDu<[(qDzZg9;R#ՅFR9Mbl=#c(WcOrJD2=xjeM?7Vd~"\WaS?ܢ'/gMӸb2pb{xˋߕa].X|GR"#3MYTSt1.IFJkRzCz~X<؈Gqnb"Y>.x1U!#3eY5nAdƽe;p̂k{m>9\ƅ2ą+#ۍDMD+e-#34\|݆*X*U&&U79a/q]^)T|$}Vy2 6|ymRTlMծ̖L9sUJkdޗ>np(lt ~f`PCٔhʬ^qʡQ,t¶EC*/ң#U}j<V8; @`|)B죯a\"#3m! 4[#&8o'.tJ0g hoQm Q<bTXy\|U^WIn0㟺 K)2A_(NxP'ҨVHCx:"Cs]oz_ S jѳeTsH|rE֌SRS(݆S%^BoKtP^RY$ `+;glDxxt44A:a6DSVl9^*cE$bvu2w9Ʊ &0Y ldާQU#3k!u"uo壶hEvR_UE(Wd×O}6GLؾc1~ux~>\eD!'[%:WE!qv,N0^^x*T6R<>"091m=LĠi*omv4PiϖN@#*5QHq6]7NO'g›ײ%oL0ccK29*\ #&A>.fk,+?n0ķmuyGCE`5+.#*wU?l-ݦ#:8>v~`[FM+ S#*UjUļZ&O3d]7QG۫@BC~m LuY쵮9㞏FYUo;zN^[-uU^Mҵ?g$ 5~eXW&]]{T374p)*fM_gUDPQ x^WgS.i?Iu `ꜹ |nϦ*DDa ##A3^}EZMw]󞋊7DpkRI(wpsN҇f?ݔ!#*'ݸpp[NKUg*۳,8y֦;~ClI[c&;|ݨsy=,##*=XYCBT{@]!zSS؏{\Fӹg9pBq㹳uO8[׻{Z ǟ>_\#3p{헦&tY=F06^TrW+i;{eEPO?l)PH.\s2#3]:z62&sBq~wW4bcQLP{7,3/+XgoC*^6}D@R6vXH54MSɔ\#* ΂wN7G?~(a,.5@B#&Rc>&vׯܥg{םwƹ򓭑˹(]+渪_ ].n T&1N ZsGͻLڃ#͸^vq~xp|Kx رL]^;\Sz% g?4bP./,;;:Ws)|%<_7&<Cl,v^ r|MI-`v9 ,64ǤLL9ɷ#\z lV%Ubr:~5c}1i_y}X3DqBXjhao1I൭fi7^: EM>m﫽>O˫`Y3#&g`s&}{pQY(N>ۜ;QZ k!0#3'N[`E4&W TV󺻼i^w#1$X4I@v NGɚa "VYX,0"ztfXx4JQc>^^5/\p,2*{pPO*+fcW%8Dp"#$ka(q+8s6*tYJqn`IiÄ&b`A4@;-Ɲ84d㘈jkT(ڌatɝt&1lh/99E}Md iٝ?;CWכdׯ`ZFó9<w4DqKZSуi%3b4Y 4hL_4#&邻g9U74f0Z4J±whC $d@>"TVHZ(Nr[4̢!c_=3mGwSn 󛗤T!j!޹z%mtM^u&eYzVMbjR[) v5۾[#3oFoʠqy+*#*C-ԓN#*<>sxRZPB%1(t(,]L᫛Dn Lѽcvxc^wff#*_SYH3]-Y#&IB":][54m THmH*1`:1FqJx(>:^Z]~suF0!V,T1ރ;^wYEF]oC-by+#&I!5LM/ R8d[T#3l#(4gZivk#&]aE+V{kIWө؞jQ]@#*`6Ā1cF6]^v6+ӅA2&F2EadhP)#jEe0i6yvqN4e',Uo:B@䵣0<gbъqx!3U}G8rh]W#)b{Sd>?rdr6!&&r,JhWdɭfl8`ed εӕ_p`ܹrI{]0XM%Z>.^ 閤ȟTS ?beT#3"0ʅ#36RɖEnђu87KX?cj./k\e#3#%ίu\&C^ njHR`#*XH1>[߈|_i/ v&QA(DY#Q[R,.\iceJHZ,Gyo⹒@{#*4ޭɕi"1EPP"Ӿe>A#*t(Pa*$$q<|2|Y=RW"~xaSܳ/yKۙ;X"0bn֖k4lʴ}vKcrã5c:9*ȡ&`ۖEmh3NgH]bP`hH\s}ZL8B:%19%wMqr#3}T>P`L#nsKHۥ7|säk/g]XօV(;8?i#3*c۩K W{%&*^fcΧ^Q#*zv7g<>]NȘ}:_JP.b򾓘DJx{s*-' BNm0Q1q\,KH'N '=O#3*}^8C/12n7&s?TCsbԃug5YW5&&U'ug۷;o_2hۚ#It3#*Ze#*SI1P+3۶%+F%\'M ^/Mny5a(EmҢu̲kCxj?_ncf"vZQ8j{y," 4҆ޫeKa]VZ\\-wV@n:#*FPRfxATGBcXSyTU rpeۂ;j7Qd-z1nM#*ݠ6#*Ѯ"1ȍ7@ma9N͜o.MeǞ;}z7=vƗ$Q4#Rtl1KHO_d71dh<9)4D$-y5NלhdΕVm.g@"]zuoG,3ysoFxʽ:+#*sTm~iE#*J̎Zxoɰt*4kϫ^d4d,Z74Ist/y^mt,ޏL`:cGn>;|P:m>Z烟.4Rs6q. Ra\c>lg[eO鿣}h\nթ+uDۼ.Y0fsv]4;^ʄW3y*UǝCOS|>>xD]/߄POGr~|q4CJ3{ꤴTc"\w^wEŐ=oO /˺λ2 ʢyA*w{/i,iپ;/<~vsRt3Mmmӈ{:1kmŁWq_yǦ8y__/ʘ׮,4nW2sj=Ұ/o4\YŲo;|=5dUrad%gV:˝qpG|Kٴ33mV[h3ߟQ'9nxꦱ[:^:G*2G4>ݏdޠb,jp>`{ʚorS&qOGoᄕSA2- =y>M^{;?sտAz<&;VyEUk۫gz>_1d㣨w+]<_ i:|'&FooD{Oqo~f5[f6y~۳=}io5XyBS_#&DvGk߿J?;Gȟ0;^gurPaLr5}v6/ѹ\?Fuxl~>%c^{OD#3*]eLDxՍ$k=f8|EWMdh3V^[L>#*U RA48jvA@ukZO[Z:2)_4yl.^=+x_'Zˎe2/nrrTj^wsNpr۵8dmINPd%F snPзGm|UO }u]4[Wl?}켰Uwn׍zc5G27)uHr򤔹?5 `Fp# ȃU^^Z詗gֹ,q k3j|+/Q26V܄bzhQl7FK9EhRLq+D68dXH*҃*M`l魵 #*(̄ŋX ⴛ#*2M*i4#3B%TDhvifJɼCh_]8HB{-N,N~z̆g#&3)gMKeFej"L",(FDjtitt>pX8Hd@J:QFk1|- c 1TViӵ8<6YIT(!H"QLFag}/SR|ϳ /΍GyKNΚ>:G/e2׭/dyOB|~+᫫;(Mx_ӋL:pϖqۮ][^?5y|贉rh4![JŮ?)^{==BJ"j#*}gYy4ϯ'_R6]&R#q ^3%<]Kh{odvI~G=_U^vnnT#3QI z}@#3<,i'+?g60ƎVyaҷ%hlR풍$Pic! c#3f ()-۔˵W)Sd1Q bG,KL攵E@b`9F#3VF(X2)A"0Xi`𬵥;{vjM66lxꦼYv+:y=QR29F(``A6"2c$.$bHEboDsSDqJP1̃YGHCH#O#3dF&Â@|\e J0T`#3#&‰#hiI3L (,iv0hD*x }+vi2YQji"E,1EYY((Fr<8zq %DS*Dƨ`{:~HD)Oc0-{G;kk;$e^=={g5ax3gw~ͷ/jm.j5\p eu7?V67z~Xuq߯&nE[yLmkgNAPU9q(Hهn%.C':Ll+owEY^Y7VM>Ehc'v'-e;Q8XQ@@cG]3xRDN~'Ѽ.T \R=c CPYgFv%cx_#&ҾT Y\,Wj3#&G'Aq!涢qB9?i)ͭQĮ.lJ5zD+Io5_{+^㵞kPǢ֌>n,W"#ۑ3=l*նVR62B8HKV'sXiAqA݄" 14Nժ 1m}pò!!("35aP ֙MS b #CJS:c3cl,ϦE-ga0 O5+4#@°Wiq Wri12X_kH;͈HW⭖޵1IѢ=0h9hkGs*YŹɲX2 fKr㜉lG-ƊŢ4HeZ,D(J#34:pu#3Ƙ!ޛr;` FLKm =x󼕦bPӚj#*G2)( <-[|]~8%le<&TDTBa:p#3*gL٩VދJK؎FW&xe|"ml4XcӬϚ51q#ҋ/N )ivr6Qk0w EAhk Z4!;t x[я[Z|c:z A]͓<#34#3A(`GwCͱM:%J2dlZe剗1Fdl ذ9N-1AȤY"&L:)<'Rs{RUhz?7=X];(?"SƮ,llfe3*#0aRhD$m8{wfO싱jߪ;QgvaGQ#3&hZS0ԄLF͙F j ;2hqO,U-qFdy(8jmKy6ƍ܍V F$*V $ۧ<.jwkXzq¹㦗HiCH`؆U*Lk&κ?&7ݱभ00|>qˌHbh68&)3N&$@eAEfoDJ[ˀ%U;3a/"Ʋ]&ung8MP4`gkqmw/Ie"=/Ct]89Ve;HWUV L5U"vaapq9(%9Ųnͭu"ƣ!B$DcGmj`[tuO#&Z8K6vҹ|#*l@x2?ݎYpjaD5t0`Ʃtd[!ږ6Nq0=*PnrPrvg&i1DX};ߋΖIbu-谹 o@b/=PFR Q|19)iҪe1_Eс?ab7ƌd|وb6/YsD!'c;$r+7q#/i+c2wa{=nz7U| 2La߶7Sb$B1pI@W$u/.J:a.G3:d z;Yui]8xgPqEц=U»s1Z-!?cr |<Il}f)^Wړyey*s#&J'A)D6ccE},߯a[1'L݋98%t| bԩd41;k^ۯcn"Rwa8F26f2\(#*R2HFzT ait^Jf8^[[#*SmsX45T-öEgPpZ9X3}gM"CGB̺2p9ȵ͹h4-F-H;X9!CkV"r 0Fdp?톭cI&=x>kR <>*BZm2 exbU ILZ\|r6/I- HH !:hebo#cXyLo&E#*DZWjP'1} GA6x;?U8kmTS#H9'Mz6/¼w;r#3u\D*]oŗ0o_xTz-2[-74T{KY7ٽt=ItZ ΑubЉ^e2Zl7z": #|9%$tp=hv!Ƽ1׌sF[H{8G-Th/"V,ZZh#3~^;qKf.M:8.ӣY;1ϫ'?-|ӠvC՗r^tudB|#T& uARTeivt]{F#&Oԭ#3pwsՅd}\3%55GUtsǀjɦ:aku-m,êD56:2Ui}5YYESJx|X^, kDTWBJBbiܭnI?-Uo|2_6Hi]({ju3p87YfE?5aBÌH.tRb#*1>(DZdeyҸ\'|stL9(!WZR? '[pg>X×/\{8cҩ{Y >IuL8 TU{V%i~MHO=8NetG`JǣG#*-֭ކ{QHa#qbMƷlh|㝶{eL\+*Q#p٦v 0ćn Nݺ%*34FסE74N~v?!Tb(#*|FFTAuce-> eQ`Z1σ%fiy><<Զ;\ xm!q@S s?ƒi^޶bׂ1&ZX 쾤\roYM`5$63R?t(b&7"hZ&h#.v#%'Hs9Y&Wm'Ywd{J &L(;wvlv(y,6uyYl)E_d~rό22>V,+k,_'{qR'>k}#*/IUeK#39E]$JAkQys%!NU(pp覊 Uv5Ft#3M_h)Ң$%_m5n%dkz_Ȼ=z#n 7R~zgYv#3ӕ4Yb,1usOx,'m%>EqR+;0'w|,Ǧ{-">5X͕)9|Gn}3MǴ>YeCc f>n¦ʲp{gabvTQG\KLR#"1#3.Canyde-_JT$FK&}#3mldٍ|]gOmYՅ4a"@D8[~5]#3k$Ymoz/ck^Y[<^cתAD)BÜ⮭"Ʈc^i2Gk'cu r#3a#*I<%(GUxk.x+[YK42\b2i$3Ms E#*=׆⦧:] wI䓹,|ȗn{o.bĻ}2v~K/}0la}PѯXPD=m[\EIhcZt}K(]/5p*#*_Յ+#*/;(tghj3nd7:W_nzx鸌1~y5#3tt~>q>zllUG{'R5 $'}_MJhs6*蝶ƄweX6W9:#*V_BSG}|Θum*~oo#ϒk.7Gճ鰞b\@e":jv:ApHL}fFѬl'H#3*,n`8.R4<#3rڑURҎqՅ R#*AasgmK #3)0ƫK!Iȹs/Px#*nuF} BI'͍}{I4%iT[!Xx+lex_ESϺNy ?1'Z{:{}㼜qYev3}ՃX!>{e#3IDz1#̚ю/|I#s4!9cgR|%fvJ,:(Bt us"㏷l_թ?*-m_q3(~OW% 2;]{2O|-DĿ%#ptx}?^~x2\Iszxgz+4;3g1+ *5\A(MW<2#3j< uoL V"߶Ft)CL;L'z$yoSd43!]G.pv35||F0vwr}ظ._}[i2yfI>7E#3׮U"=*zԻ:bBxw\ P.#8%zA#3WEӎAg"B/ch $sfdHqǗ#:H.Jkf#*%/w]3mWQUpͦe(ovd~4SWדަEO? 7KK+6EWtm+e?|N9CfkixH/WZ#*'/k~]W&ꆬtʀGGACIX s{FOJcWKZ}xLeYٮber"'vuj)F컦W[]"*Vr*aHCS0gIkUX`PP(GkwQ\+̇gRMdêڴ; [A,85ZF˗M%ybC}H'2M:ƣ!l7-zb榙fҠYs>HB+焳(eM8Pyk1qI{{ظ(!n/˞\&sSM. ~HjYc+>N=O[f5[(Lp;s]e#3]跒J*F"rvS(4Dx<CŻ1ljzcȖ&"H&!V<٬GcS4va4'5-L.t2ѢwWCu-/YVݖ#;桦;a'/[ʩ ޷BvǑ(c|7㣬^LZ$eeQ_V/mUlHu5rGe2T諛\UQ| 51foMDYdI5gb{mr|#3XeG7K⦮H3)a7ӯ?i|>wS^&{l?n:tr7/x3ݪ%qwRhTn>C\[ú7RxfU[{H.KI^5i{QK! sΥ<֘53~“Lꉕ}@y~2NIq 6Wfnv,,vo*γ J[y#+һ~qZ(li2Տ뉷OؕrqIzW]TI:-:jm(n~)&8DL%q˝ 5mr9Y=䡭:cx;}8 1NGο|N#s\$xEt÷'"~>fd{F7d'ÚD`谕́hiVH,V31n؊FQ:HazfsjɴhH=8`'aҖ]:h^{%Q/hm΃5{ϛM_qGi<#*2b1c2-7":pS$OEϖcYneWMa(nC yDkW3v2#EB')ۖpͧ^v\kgI #&&ŞG ׈嫺c:M;?#&plLMtbنϋ xaˏwI1 [Fy]}jSmNkq&M<ҏ>457p?{g,İTDJv81zߝ3CΪN:i#DӇ\c\Zp,NH@.wrR|N?\YNGҙbz)1Jrz(eo_#*醱_naP221hoGǜy6|sԜvS(<3BFgΨ1'*zW?PA A>?O{m,>l=v&`7̆#7BSi gYeVBۡo8&M-DG-[m>~[ dDqF T(WQ3jƩC@09-#3 xiA`??2@(S9Qc7`;Ks(e-hXUmN"@1,>qx'jWڭZ?],6pi$Cp_=-yDjW%n>Ex0ɖ}F+K ^iZ)T5AOIgDg[묷s a煗/hiOu֊тak7tShvJc5sy#34t?s`@_7o#;gZjmՈ-wSSsQHMzyD7ziU" & (}@NSx2ls){D1M0j}17#3;:H&9 @u뫢6ҷ'dX91VoޓRxNpdoVŤ_gѦ~Ac鴰9Jpȅd&X)UI@Ť_sx51 ([#*НeOh$)!7N)6d5@FED㮐OCSh^̕T"LHn?V41v@IlbBt #3#&nV<P%%s0r`GV<.&йTL#0v:~#&U ¯ʏΦUޅKX`"v0~O tۦwm. h2QQ_%XޮjZo78HMis)>Tl6#!Uo\уJYo$6s7P[n|U%1׬ۉAh}ۄe#N#3n#*2Mܸ`VRIh(g |SaӄCx=% }J͝bv6R FCb5w0e$%4yқlY2,"Ѓ;#Qߎjȝ3ӺrC΃:Ԭ̅jb#gV!%G \3 H4`!1Fs8l~x:Y؂sNY_k*KW͞I&in&&N*B@ul#*\k{XeH*7Km|Rouv#*fz HC#3b 35A{io;m؄dlѨ0+)t#|7<ϥ ^{h5BL0Rh1%,vg;i:矘L4Ale8mnmdbpmM`u1 _'SSZ\7?n,ki[(7%&@WQG.tO#2CCTA7ê`yaUBg1SASx͕bT6ƒT2"]k "BO^蒕px?%ab[z;Nu_ Ϣ4H %֑S:eٚ.Ͼ>Lnǒd҇{OG?cyÔU*55ʽ0%QzltjJ@\=m+GC[.y#3;4iEJСP5vjvqOaAT#bUUQ (81l + }=ۃY^IMRtR-[kBۓjl|{x;Oȩoo*#3MOGK煝sY$piQT.rAK/jEDTLYLpaZ7ZcuX#)!v-P(1vڇl/\f K{ ^(j4y@9VuyB#3^+*(e(2hO6UmS [[>z#*لL8d$1ğ?$GӮ>{X@#*"ٷ~V:>$3> L_8Hq}C."4#&$,9gaba֢7D#*x SHX%$]#&Y4J[iIFL:^)tPвҀiwGT" /*w%ɑ6h",Ea#H!SLl}\A kmŗbKw_ѷώ,c.Nͭ73I`j7J2Wa)/JΈ0ȱ.],8gcB?Y0`!󳻂u{#3.4uRb5nMλ !jK}MX4{ BcR+t81}KmP#xjFՔ-NB^khL*Pj#*VGy3ÈGP9`rhqR)$!""T#&*dA$gxc3k,#&Cw+ܫ,TQ!|Wb8냦;㳓Cƕe#3%h k45[Vjn͍ 5uHurJ<Ĩ#*Gm=>CT6j70|4#ӷC ΨTza8R`(#3 " Q"dΧî0p5nf(–K'lSf-\D` \0#3;>298x{(2wzU+u.y7:M(Mtn|>;T^ݑdx]{I8^4Lp>8>Aѱ|9a҄ T_]#&P|hs3" x:6z#*#&ϬJT5(=^̳IB [c0)ؘVp HIaBm?/Lo dW#*ߡzWMΊK#*`Q}^XF(B2xky)sz_>)gCwf=Nd GE^AC6hnA&D5W>Y&l`; PAC^e5l;Fq @Eu+4(ZEoΉ]JQ-r.K҇l'#*靝Q#3:`i*"z)9$khkW~"&:U)#A6>b!P0N߲v:{Tq8j\$ITWE-ꤳ$hTR]2^bhxT!TR#34JHo4#&'?(^M}e8gC5ཛྷNND7VӪ)9{i7YxBBNp~5`>2!Qe[˸rvAKJ E dztM:g&LZFx$EHjϦ\ĜxQ%՗孋;d1Iyǹ3HHuFt5:12fTO'/Ъ/#*"tUzC~/)̪̚c6V`#*iyQ&Rif챇s˩S|CyJe[ņujdV#&bf 0sZ#&Cb~wlG\2e$V\3 _W+1}þy-,ntK;aI7S 1E w>3xjݚT\/EwC8]7uA_ %~?g[WuW$oZ!B^?M[OYOEj 5K1 /aNFݢSV\x~ćI6?o*g?Wٌ) Cx>^>Hp@U#U0G#*}-r%˕ɣb)єdԡi&ׂ~ڇ?pkge-"}p C)iҫq5sjuov BDU~eu=}9aGﲾiJDCH1v`iMK.&7eLV6E3;w=Q$GU*TkAqXTE/Y|>~G*c 3oM64#3I]j ]/<9aw;D6N6GiyxΛbLݏ5qQ"ŁϔҺ?h;8IīUCFd ?1]Q,Lۇ?cZmZmZA sF>Dt?ن?:P~+#* $ɹxS D0 'fiױ^AjPHC1E磾^{CPN<}}r&dDAi;sc򚭤 EΚ 7qdznjw}{zTet3 PQ/ :77K{|'s=+S3f1e٫P|+xXTݭ'9/ASWo_'trP3oJƾaEX Pͮ׳׆30wْLpT:=0[0jMf-o#*6/]w0J4}hYZW"3GX8-ˆ@_$Ro:iL?ouRh>8Q_GaV5?O.BVDy&OOZlӥ#e^;*-?bͼB7j}O8Kv| D4j> Vҁ\b^y#*'J, (&N(t7?şdqs#*aXUF#**?ܷ9 KG}R"*ҠEyDTKEyGIZ_Kb + oBL}o:>U_7@8%'\(u%ǭ~eEgr2XZVo.?ȹoEoGF׊a34Ftơdp^0 93)/ĮrחM *g|#*m;ۗX/(ȴ .e5C+/\~S|ڀ['SqcOx:9׎#w[ IF.=xs>ۈMgUb6vM=ҦH6GK?^n_<,W&;utqaU%gWOmBjc"Sga,]ؙ:5ҠBXox:=f!,5~i2*2i<1*7&yICKfry#;y\ DxnjL_~QuaxGp֩;W3W<1<3Hf?"wS9eRvC~sqo$ssl5SYPSr˧4Uzg#3:<{a)bS,#wS>=MT '<Vgq[Ci30!D6蚕:{O{وy0dr=rWJ">0t >w|5w+K1`$F;z:ΠU:6OA47b\)*AKu)|>9I#LԿӇÛ@┡zK; #3 @C"%G=%[3xW$n9w;--k1#*ҷ{Cwv)2}uK퟇M>ڗDdԷIp.n}<7_Gv~M0_/9U3d"peC{.:#*b1@ifKwi#3;YI"ι<"R\`5D#**L>ߪR-j-a|k֋n9w/S"JR<ߴ¥{̀x'nBcZt?LI%ҳ+0|<,&s6ϕqx\э1Zh=Ӆxao}j 0Ih1ƠHPh]F?{]ab g;JOy'{!{vz@" =8pOGr,9%js˛ĥ ,KMhwҋL#*"L898.ݜᭅ~6~]VG`Ygwh<>٣׆1N_"BV6ٱTwO2u:2uFw^w>%)3@ ЃB2.Y&*ƹK@îlFߢ#*(`&ۡȡ#3}TEy0jR40eP)5M )&Y/!pm'9^["᭽-xsѢP 8&0HD1띗B]k4~q' ~Jxۙf§n8Ib䧯u@L99$2`?Z>^ێl:+GI#3L`fe#*k8 uq凛9,xHh r.?8.li6wF#etDDй5'n!δ=a.,6N>e$ɚ,I?[[d>t_p@&7itq +%{%]fYiK_uX]YVkHK{jr NK=LkTzT-1ڸ=䟪JkA ?J&+ႨCQ/DzɽGbO"I De)OlE5>Sc0D,~N]5ҦwزV'Q'O&tGC4ƪ#te9;*3&#*f2J&m[n]}guWIҥRt&wJ;m#msj!Tڪ٤ecx-RjA=3UzF)BɄ#6t(W hE*(<#3#*XS??m޻ټq*i<ʧ?]N7#NN{byC6VT'+0YL9z LaY]}-ed5Ke_3ThՆ^I*#'ss0Lk1nqE٤}bJ@8䂌Nu#*HMU&#ڼĽ;yږwd#WFyP/)jO V, !$y;ۙpG~DQ0KJY(2n6-_EI{M9X+Zm<1W<_-.SDqe*tfsbD?',X8b;▆S~+n"4sԨ=FN۱M- :EK'nN'zIS=e"7(qe@Ž^#*mpm#3 sOƎ#۹Вe\. vTBI|!!T}.H vrDnHܦ&Ga3t4BDO,4&Z+3X:#*Lih&kMV_ۭߓ$E#*mc-T{Xƶb{<{FvoPR*&vmV?^55&9,M(I')M^DJo.y.j{L*,Tq5|#Xdi9h㠊dm4oJH P"u`!P%#*#*V;n Ft)\)ZMU"Vߎ7yF*7Tc4Ly?۽qF͵գl0$H҇ҙ1Hg-(x# d.c㯏3>LShAd;җB*չlKi^Ni-yۘNitpѺM+jNDA)vipg'u'* 6nll:k.UG.lJW##3qz|-V$I:&"yru[devIәym09$3ZSK+p[Ĕrî2x¨̖Xr'ymU<N9x &MNll٫+f 'WWKpDwq X,;St4Vd;(&:DPF"_ND~]FL+ҘooM3cs#3u3xu ѣ뿮K+5QUbpeFg)ڜ͏*#怜SrsK[{y~=SY/E5d#3%G~~~?kVQ#*~³Wu^hߨ0~8Yemm'3lr|ŝ_0>w#3SD'"8cgĻ>|<>_R`!h#&_A!ӆ#*?0ơ$_OUDJf#&K oHT(7#*AT_-\v?]nDO3h 7ح?>0L#*`s2 /y nTuûl+ƕ;θ̴y$zޤgbAb;c-tyl=p;?xuCOҾt#*P#3lO%{>$SD:1{; mk ?d>#*AWOѱ0jO@>8Q,DDk_w~ޝ3|C,6.Xam)Iʘt,@%&sI5ͻPO;̤O@D& h<ńYA"c2zsG@  ! &`;ᱪF%b.J^xԚ9#&dJCCKTدxj!&`z]NS%d삘Ԫ;*a|=1<=v#&jZ/Zkq D hV5@( * /@Cap]iJ dyH:K'5k̑sb10$8V$IW᪖}e?>>,IPx͉>tJ@J}?PqaAZJϯ#3F>o}Ƹ6$Aii,#3O׃#*_MG~4$cL#3ز:Gi3w:Z_.=!s2223W#*FpQ3݇2l9lFD:ߧᗝo|Kc?I#OBNH/zi-bO̱YP—EQ?Fb6M}0!7:u|;hD1 3V_$@qK4v s&0l#*;K bs?Jӥa#3""p!;*.& i#&EWDcQi2]:H#*h}<JDyܟ%N#*hu%.x (]g|KՐFq]gdZ&*hcc-M!JH "PQA ֦fZ8W2s&zI3mnƪDO@p8g ܰ^`5=`uQ`ZNeuȧaڟmHdKt.rQ37i%#*IIa7uWY]U[u<ŬUY&jYWGJ.l!Ě[aTnlg4#*2fC8odI(Qr=UPQSREtBРt)$i"$U?<#3Sq,s1M?vmu@n(6P~ {ʊ#*k;k#3?#01pvsn=,v2v#32p$6Qݕ>YA}![S6D!^,hUvk2 34/8nH7|:I:Jk;tLfxO{;rۊ(ŵek>Ct Bf>mzDɹLbl q#*ba2~_FZe6$C~ΆnU4m4hV_||9}>;#*߆  Pv@7 #*痬-#&G+ pxEѾBѩGQX#&!qog #&]3iAE}O`@bsÜن"@Ea>؃^X=gJ+DRQC8 \_~L @-̈HX?0?}߭6owDcsz}$T@]b߼ٳ?xǴS4F8GpHN<M!xߐ~f"/T0,(EQ>C}K2<$x(ȡgD<nxr0 }#:FXYaNBp#3d{!2d|އ *Y4S=E o7h *(k-IJ_bP #*^I$n4<8% Z9*h#&@O_|@K"$ք++NߣҟgKP@Ǚ_L3og1n'D«ǂ `,SBq#*d87? o3gd`A\PR>RpܚB.~Q% ߅44ʽԪ'MjY|$30(d HB\_XX3yѹz:֚o1Apg<9b!$HW†Ɖ>Q](یIgÝX@>Wn'm݌"ߧ?wSS@]2эI[?RU?wlOua`6iH#*3D"GBkI)B<qVAg4].xHN#3l@SRjsAyR|;٬qsgܻGv{(r#> N\N?r8+(~@0}"#*òG4Lʄ#@ed$8"bp-붟7lAh &seB73$xnmV3!#&^JHZ5wbcz6LI.tpt)̦)41IbK6&]9!@K#&aF؊"d bDV( #&eG$PkLB!P8tM`CSRw`6;v~AC5A#U)'GJ#3CRe31e5|}uW-yۍZ0(6͡T]lR,0aGP|(|O0:ye 8(ܯC:HN OE$!#*~ޯqJy6ԟĭwJ$dPcE߭#32\Y)O9XZnQb}geE$j02a\|[eP`P"""%#3QSPl69I=gE~XRyuൈKXHV , j=PXti 9Ve8".>.ӳ#3<;M }(s9*ЩK(?0;熣|"@:#3fA #*s{ާp} FmDgOYu׾M"QnʘDŽ}^n0#3 N|8%1@YpXw{yJ#3Ɍ fub&HƵr8M.5#*儞#aPدhX1MLHL=s#31l!7GLj2FG,\;Ónsg,d̴˶n4^`jNqniO#&65ؒ"8W6p@h6d6;rmGJHps9$'3VO_BƧ*rƃpF뽸Zfa9Pȣ#*on4a#* G (+=hx;`\NAa UV0^Onz=i^CB֞Z[&pw')|2/`uț}PE\A}CS\[21k1׽Ki]5PHyc^dM$ SP5MX#hϦO>9LG1W_.trf`?@#3N ^#&b8eYxzVz"!YlbWrЯ89!^X~ؑ#33#3k)PGad,֨L~=#3t&ڠ&| B1B'=@#*z=}ɟyC AaVCwn>zG7+r$NWV25u[ʊ! mbN#*! {^.B93d*3=}w[=la{RXUg`,1:hQ*5@}^M#3!bzSOZ>!E( !%d!iN `#5ǻuxヒ;~iMTyl#3$t_{bun ut*DbvU(bbƓuA(;kpdH0*{WئY4Ri>Z#3e f**Ƙ6R`XH رǼ^8HDS.W?E;~cow{uj{_p3*/KUiN{?[S+IaC%|O( H&oweET#d.+ߗ$$̨$￉f?X|(!c;NNJei#LQP bsl~7qt&"\aaH̀BdA˅ߑ젥P14hߠ"L# % 1"Fd(;7HdDrdgq!w%L6n[)6hJY؉CF됥C0{%yVƂ!5c'+JII  4h@+!FF۞#*#ujj- Lf05>9jt͠2AHtR"u!hXבbqo߇Î#3]/ s6ar}uS&fG&!^dOAXYOƪ,r}UN.rTs^/s?&c۝ C_w"v[)̑=b9%R>Rm?thM#*^34Y #*$ei^=Q=p%Q j\㊉ԮdHȊl>LV#*z9eރUPCIa0qC-4>Mʾc!h?&M6#90jF7{{n58~j@~iv=&_et-jgf`"ӉWx6LJygav/[&J^4^%4?g>d#3̷ }ixb[*h @jT#_UΦHk<>S{qY,zoRJnw=tu<gs5/\b#3nV&4jv^ܩ #3хUw.2<8e"dr %1wC~PN_iRq?aBtVG}~.3=gԜtUicimM%DCOY(qyǏm6xt߸h"d;5_yO'Nf|aΰjzᇶ*BGݹp{4Ԛ%ELѠЂ!rW4i^ZW!e4)ǁ`nce(o衫uj+U/*'~>5%3A=O}kL[HZ RƻtްwZAT vtSwGᦘ5[m.SrӺ'<($zvMg9y`X*s֝ɏCג8=$cCw\o=+]ɏBcmʚzPa)7qY`H3B4CG(Oo'iJqjJ Ib "QE>4|Ͳd)mo6D;",9D)frfb2MxG9?s⹷`>ŋ'C؎A $+kJ G=AZ 0zi#35}qgHϾ`uPq佈oTָ7YSfnv{pyC8XP8# #&PD7r%haJV pu.QMOBT"*:OB7+bٚ !)i'6CO"L|#3öNEu|/8\7Z M&!hEB*yA LOȲt\- ѥ6..9.E_{|='xY5>a {d/_:t΄vQq=Xbp4#3^-h!2vTXX10 'LA.^YQRK @}InC|PӬC!0d ξK?wܛOېaAM=iH9n^0,l lkX1- ImfVT$agnqs!%F:F7XkkghOZ4v;\!5K/6lAr+ 8ض|?piF/;0Ƅ13G;86|/AX)GE(+`!lYs;lS;r7ׯ}VA=#*4t(FV0tMIG9$@`Ҍv,~wgoQbfVGZ)S010v 6nHWwv8qY{ 3lLmu<(DNQctaxFb17Pk+ 4(000jҦCAI)vژl#*=jq}͂owGO_Aa$0Y#3hkڎoB#p%ѿWv]]_یjߺte#*?O>M:'a`8uhFC74mU70G!c(l@De40; vU[N3 2bP~?U۹n$HH~h{ݛbWiJ(?x%Z{W֧-]vxhdML<뎀i1wĜ#& (BŒr.zy KKcR;(fk5THiV,CՉ.lΥ̏v 8Fr#*54bq%MM:X4kHf8Is%%#H QD?1#*H`0i|^>_^9Y|fS-90F8\m#3R#3M⒀އK\0K4)Gd}5D%c84P!7wY iGYpyx-Bj{M{fU^M*WMgxx896jvOzƵǬ}G3mk{Ui;QiL<4=9[cgmg,meN-So۬a[YOۤ߬ s>G13^+~łilad<$`.[ Qwou5k1(b#3B^ΛUu9+H3jDUT/n>>\np nIH-;xIL::"Y0SY^딂IQ g5Se$R`8vYn5նFes#37%QȐ!q=/W#*fǡ vɏ #*K~3"ʑ"Fm`VPi ܒ.mm..r2O"y\X)΋PLjHQ&[4Ⱥl`iH9 'T(aȠ]X7C4Gdּ@tz)rk6&xn/fiy^,λbv#PD367gyϟu5c#3v$ħQм17459IPHs`cJ`qεiSnS-.HF" ipsӡ# ċ#&{RF#3Xz#() 5cK/#rX٦+r,8{77yhLI2raVAi:={aEup 1*feffX2Xct1eKѿm{ņn2,U PXA`eRf o#3dW׶o#3gG2ap? ԅt~]f£bcv!.B؇uWN.^wV9 gZ5L@yb$GE>v>:V{Kt 1#& R9tmc϶ٔ8 sdp3?3;x12wɺ`Om \@jRek:ÍzUFҪX,e™L3YV0  5o)BI6#t@vUG׺}q#*hv#*Ա_EfXs3#3u bc8Q ֕A:aiVmM8N3xLetşa6q!&#*# ǚTA2&8}Q6 ۵*q;jH;pXF`V8XFrr1zpriExHlGlS8#*-p,>pqTTyC w%4Sh #)##%8" K}LOV0Ll4|#&9K4Bv Tw/e!#3HйK1E_С.##P`ʼvn|f#3E!SNٍ9}_Nz [Hw0:#*qHb5-ĤHάш#3DsQ43 fV8|N.RSU3Pobe6;6L\)d3:{[|.̐ΎL9r]&ST3-C#2$́rAg#1)f{dg3aD`(1IcEA+ H&mwEb枆6:Nķߐ>+`}Tsުꭡ[d9 "Òp*ahoNKngQbAB>(!ctOc:GhDrHvk湮۞ ,5+KR16XZݦbP?oyTaDFRDhHh!˿:H8'q:P`TJ`}\8#?͗/q7քa\A ܯԪːJc!!H?=NRCgh<MN=!",IllW^\8Ui @IF߿\bشR jӾŎ\vA0k$%$ E%#35Ge* fru/uV@潏}--#k7:EdCWAa8hm,D-^@ B(H KT1R ԈnS: ވr6P @F#&{N#3X`)pzTVxt6f"ԩ-\Bfd1Tn&C KUVMllҶr +.)$[uX%k(P))-֠0k#*aM#D`Vr8(ERLo]v[Ԋ.\%ks%fr)הw!׽nBO>ku%eL#3I KP=`)M `jK#&]?"Tzr}OqVE4YBu‰QcM$&M ^l]%`JӠmm>Q#ӗ0h&\~;?NG #&MSc1@,oSLjl%C+EQ2&$hUߡÊAJp2Ӹ D Xɀ: #*I ."~voi~K_ESx; XH`XYl/`!#QP]w'e#*iҗ #&*44}D~@ HSacEdwu[h@CiUA_ͭ :v,8nߧvf*Q#ES"HD,WoФYmFbSU(Jk2%M-CeE#3XQ >I|}|E#&dQ(2 Ȃ”h#&Sc OK;Eiqᔨis3$"09dwh,_*qusz#*}۪ʐclxUi4d=G,eqa)D 0h!_%j&D JϯkaQo@QdD)#&, I՜C9HΕj iR\!t^YAoey'y()#3`͡C#& __cU٬ʯ5FLܫJҙjƵt5$\`CrX*#&H9+^wuwqż7KHa&+ըB!ʽ>Ր !S} }|~gy0Ά:qq/șC12[p,)Й@eT*KHQUպmqn!ѠR /$&T}llS ?:,UjRA:)]$4`i7J-g%#s~܄}u6!OXd /=~RCCpm ~;'=r#*slzcO pwHE21u%[z@xtȧ*"JB#&H0 H^8E1C(5f==vߟsY`#3_ٌ`~/#?O\;`]#ˈ>zX#&#3YCN`fvvzMlou<"Pp]:$8+ ?nz1Q{&R|^fI|Vd:H1OWBzc:FQwѣ=1n=h> u:gc#sݲW&¤@Hx};~:ѫC?i#ս\=h<ٜyWWБ̍]Gc4)}ܾV aCEfass5lM2CJݵ\e[F+M-pY`\go;|JXƅ,MZhZj*rA\mIn>zYRFX⳩&4bpÆ #*UhEʼnr/qpv#&40r#*4UZ AS76z`D\ ə_;#3zCUz2ot#*:̓{uaj#*'@:#*RX"X#*Ze68kFI\N97sKq[ȅ˲N{92CPdj^PXb0vvy̯xR^ mCDAFRW#&g׏DZQz&$ի7#"#*qDMձm3rFzg CCӤzJ2ո!*)ZP|*o/FGHqߟE^] oUvIg#*U1d#*PȆ9yn2/Nomk"}Ә4P;tf#*ũkykJl[wWRwm[]ߑg7]ZFZZD!oSIy#*D.Cevv,@AHmWz} 憤HEL 5sbsbqyAXn:Aqw~O"R1UR(H(@ʪXJ9ť, d !Gр7Lbp$@l$h*Q2XH!X dy'qTpCM~ɿkiߜ#30/.NCII["ĉP=g=䍕)3ҷ8$St) Mpowg_*&'`Pp򄏻-ZGRL3 J.}%`+YHi_^I hLelA#*]; A /. #* 01%`Èi l,V }P5C;3 s x%2'7vR>49f|iIJ$R Tj#*!I-˻b!`3*U2 0Po13чj6CZIB"jbt&PmfHA#&,e,Z׿#*ꗝ)I+#t}XRR4\Ņ|Y$)^H!qg҄kZ݆uo 44!0`vNG>ڂ}ȵ%.LU?Xz3x_dJ@9:pXl %4Mal,_>>|{#*#*\GQc0!TL"2u7l(D(\֐I!#*Jt:)V.^{/:d];ʬSJ?oݸ ı`&(~4`pS#*QiyQi90_aCR1sdGuW#*#&لap)d7,H\V#*2xi::vrL*jY",Tk:'0m|wA u!~Fhh[5t2w<0uRqE#&xzl7tnp`i),M#&!| ,JpM;9[vQϯ9-2̒D3`C:I#&Di{@4M.Q~HHwFS6gvM2j9FtS\#* m1c4j2#;9> S5UL&;WP# dj#3urꞏ<שʌ H1`c5hq|v&ΈNKQPa0Nm;3l'r 0G'@sp#&* Lhȥ7MUs ҞT4iߞ:ΟsF^F3ĕ.0]Ԇd+x": h՗ejo[(WJ,i#3#&U@W@tIZȔFU.ds#&C3 -4I `Ķ0QJ6^P4D5QiDM(% --HX (bȡl;L7ϩv_*9[s$dNFш٪gSo+P]B$c] 12oa?E-]yrDD#&J #&qF..S"xJa̰ *#*YRA-_(Z#3İt%e#*#3K66Ҕc m]uAҜLT{ta#<6qm4n1("զ md+[#A*{.x8[&4A& `tP}Af7g+0J=%X Avbʢ|vh#&PiN};MVװ@$,\!4 (*taI#35%ɉβI#*b&d)c#*Wol2##&"E絙7 *$d("0]Aq#&\ \rArj#3"4yU :QӜyg_O4dBvZmz_96ݳ$Kcɼ{.!6$&J I'y}NL#2,a$j1WH !\Ju*:$m[ 5U@BA Z#3 (  Ku#& X!<1k IEn`>,#*/#D9>gZgg>G#*W⒘QH%2RmHS$̖blZLem0m4BJhbJ̑LLѢYJZ#*FH#34jbi4"M#3DI),1(-&I`(EiKQ( FK#MFbCJ#* (bM*|˷s*1as>O΢'Yڞ]vˆ78T%-3r,31,Vߖ`H-2h$ưw6@QOScy7Fw<,I_r\ۮВJ~k˥iݙ!? ŮϘbXnH*00 #*۲_#&WۭCTIKJk %fZa! 98֝mj0&tgؿ13ABQQ6!e"%}}[I0a Sۧݯ3/ޥv*/G#Ƃ|aH ν>7zHxjX.KTXc] ü0c.[cu"%p#*C}`vhkhi "HȐ w 5z\nߎ=ӄ(#5'| pw0Z4~fx;@I91M#*ف)a.ݺou(,΍ uIJ} W+s{4~]KC}8⎘hn'콚̋2|;i˕|t@>taQ=Ѭ2Yzm}^=Yܬ3r J>3]{B)!q DH78;av !n4;wiTZrfr/|QI#&b<өqBF3.vV|Ao3h-v0EmXS0#*{ |,@npX$H#3j4\{ Tf#*FKZO秝3#&؝, v vyz)^)![#3_-3yUJLIi`.M*<5۵ۂњ ic03p2#&.<,tNv;N=561riڊb"D,'a 7E#*.0*Ԋ| DkR~9]^ز%bˇ ڗQQWǼ%0噏UTxˡ t)r]w9DC) OL}b^HDj#3%nZ,+s!Eż:YL\.i,MjppiփkRߩYwsv#*`[\UZv&:EK+'8ud_d8aPhf,0RU幊[8#&ǜAyP@eh|xvvX3&&uS5o% >7|ÚWd+j5 ɦɃی t.7>ݖ982HfwcbRd,vrh L_;l\;.q#&X(c(HeԴ#3S\a1B=?:[yKn8ptΠ< ώ7;'q2刾AH $֘u7"em#3f7b;mIu7h2nSKcu" Y̜#*b7Hoc{q0nvN߁#*yۼ #*-cԧv鳋N)XΘxL";u<րEl1ߎ$Qxb#&-4$F1@c9Z692DCk#3=#*"5CCnimraGL&(#*;S5j;7XdLXm<m3q ٖ"QYt)xԨiqI%3A^!>i73 2:.x#*.".vVͼ%rtGDî994fX9,m\+롶Ȍ^\$7j ~.#*tT^8s=2I3D͂!6ʲb#*Ӷ$ #*Z\tGLg(^M'2yt?r!#3dPɱi]#BŢIʎnpnDoCwB@iJ~#&d(Ӹ$Si0F$d0I"YHQCBHs!RAH塺TATlio-$YP.il_>cQ:e)elPk|Y}qbC>hwB.)vK6998b[ [FFK ޛNə-VwB!Pڛ5v*.r/x(1#3ATUDKAA #3B?#*"(#&.jD#3l "X8L pqIUr$#*[l|<#&LvH#&svkM&#*˼XF9q8$8p.#r/XФĚL6GwzՍՙek-soF"ʙ5^9͒6 e ƒ7쁰cTvĢ4cx(։%JA̸H&JyC9eFEƁk{GP| -[Is-GET)iJZ-QTR3Q61#3AZn<4EJ{wId ۰Tv=M?oE4j)%zPtБ4o%h`źCR]4#* )Z;Ia`A҃ĞYHPʀ )m O5P墼5 Hcf#3 6ji)*#"l܊颰C11Y4Acbe3Ph}a`0Mlrj#*#3#&? gKYs53TtĂo|Xz-sm6XZ3n3čgm4ZׇF6dQJe,VP."Ņc)Q`1#3Q#3BQx,VFŷJԅu1M(UZJ(#;0Ɣ8kS[ x"@ D`f1;} AM.!hb6.@SnZ~-"#&$Q~ClEsD$HIFip~u5(}n)ۆTg'+cCZa?|AqәLF EtM~pHehBm#3 n262Ea#*E5Jiigiȉ 3bOCJ#&ZJqC;[xD{yz^rQ6Sgy1كɑ \u95Ɇ.:XX>nA\ @8!ȃ{[(#3(D#*A)d0Y2 \KeL#*8ȠBqbͬKWƼr J G A*X#A{=QzFu[&R P[,.iv댪sstdwk&MAvW+LZQ3S[Ƥ-rۘi +H:dHvWŶle-M$%&DXMJ)ZZYlli~o?^05$I!@PX )1':{ehM{X"R`FLaPTN'&тbQT#3C46Y7ye1=d QXRû )i6LZ=sB}q_!I@a@B.St5#*p@י2I7H#3k\ !~"bYĂK/#&0(B&2XIFV%m/ޯbD*¸ѪC|2`ͮA28q#>\aQ>bUCqȏH2B^:Ϲ*k#ӶAi9X]3"o?8da1&B 4]82VN؊ ƍ.tMrNӈVZL 뒲#&al ).0к]l^͔9\8wb#3DR*@!]GzkʼAA*"y|iFG3>6$abIݸGWFkQkIe4J]TdomsA6^n3Kf&TڑLYM5J~jʙ6jISj(S[R븣R+Y]۵آ#IeXTbk[T$ljMcUBU+VWTXZjxiMfl՛fj61-*kήwFʻYMx۬RbZЕo n1MPh}3qIr U3>mujkxԛ#*uFT^2ZWdL"ۼ}7Eld?O_ eh#@BzSG)e""Z#*+6M4֙cVRUM<~N#*UB"elۦS 4#&Tѭ\T[T[]}]Vl@H6($#&u-sZQLRRm^֛%jlj)%#EJhE)e)"T!Lm)(5&TT)YJjbj$*i5cj1d2J Qj)R% $dLdɢmSlbDRMJkf٪ԳIS&*lmݭmMhvJکMmmFje5Xִ[)7UrH 0$4MpY]t3b-}RW6neX07з{ ߭xpn*k "wm <2i}#*oTT0&X(v=r#3̶(/'lT$1c+]:mYtwmt!h#-v_4_.ч7كΡ҅~Q"Ȳxbum}us9$-KX@{? s>CkvCb˓\;PU?{TM!Fc7a>!M 1*J*wN?[=7yW(+^5ĩ/zEFLj ud3 #3/,0~4h8D:Og~#*Y$gL!Xe0hFAC#&j\*9.S@)Lq`{9|eteOH$#*#&|Fz_'m.,T!˸#&TUFw]ǩվ(6D+@kq!d㻍do:i{V*'wKzP,#3Q1[*h7eU˧kO2tCha}8nĻMGR$MY{]zXx)F;B4@=Wv J X/ I#*h\-THBd"dIU`ZiP!uw;Fl.hYwrIҀ2u#*Y4IDh0|1D2ea1(NRJA7+'vQbI)jBI4&Ǔy4˭oQ;O^U#*GAFM#*TT;"T@Й0_F\a`vJP aAr+0Ld^z.ѓh# A(HpН!љH#E}UAZ5-#*ʘ%U.G,рg::9wV=H2$"h86BFGl#3mkXD Kt{39IR6Bkz0UtP]lVB,&G**1h4Oy oj9kQ5; EXd7$t=XAr%NMmN],_qLfL6ru[*d0J$dTk=p@߭ϮJFeXĄ*krR: &y^2C4%U&j6[[O@S`K@\r>^@äC@…_ =۰#&*H?@REd#3g>am2AZQ+R7¶7u[Xˡ͚l20A}sd1bE4zִ5Lyl^=YF'7#[0ϵ6͂: ćuЪQap!۸h"˼QD!wT"pvv- @Y^4q/񨡺6FUl-GIo῟ 2?HCqF3#3jlAQc_y!"0ȢwT0*)CQ"Cj("3Gx6,! #* (I4#&:X]z?#3K<]ީ)HTC:&Ɩ4-| 8E OsarzsF''NVt+O!׼{PR;A!;ū^౼kߞ?FFP.Y>zLPΡ8A =͉bDpZ7 χUx?u "mcU4]\==#&j*T1a#*_>g{lP}[6y( [.׎uv%&JJ*YynѦ֚VSԮɬ bE!(#*3dm3}X"<UV0l(9CϢa>:8phuԧC> t_Xњ[QJqp<∫#*!f3"M$A%AtX2;؂*DGi$P{ɩ*#*{;/oj#X*B@ff}_4>wrią3~ޤ? :E 6фR# #*#*GMF?}Mߕ[F"6EdJHQ8HmYbz5NlBtxsYOlMl1&A0n$L#&=5YO%V*fEM6 Ɇ̓*NY #3~JM}5DXlq&DǪi=add1/ލuu'{zjy#*f@.ѯ[ry_+AXHP&IU6Zm盀BlTW5S2m)if%ik)Q6#[J#*ehJfej2~UD{4w`6KcDMp 5}WEhյZj5ֵ7o0?cߚQ["5#3F2n7d)Y_^ȹBޖgdޔ'Tvl(ywAjPW w:j'8! 濻Z:s[Z\肅KtE4 XM;E^]d64_+8)#36u% 'ݝ244W|OQ`51#ZQm9ʪl>#&,7yq#&#! 7,1'ǜ5 C!Pq#*SG,,v(CPU&RġK<9#3(ō~e(?]_9ik6u "OãA2ڍnqٔNbKmdI1a kÎx>G6u#&]f:mI~R؏)]֩nEߚd,_]}[I2E;R!&}[?Nl@%}4ʖΓ$b#*Kj!&.]2Lqq<Ph:t`&#*h]"5!hdRcQGoCΏym,8Up@*;:%D Xcg`voECdI )]H#|@AAM#3X~xsU>#3vαrVS(IN#&"DzvZA'tF>-rHqטm;xDAt ,Pky^TTԺٰY@/sc;fDƒUhaZy(#B1 Q#3yKT蟡3Ϧ#35u52#3,Pp,l4ftf@IںT3T cR.gk-Estulk}5緿:o.HCyԯ)me1z+?6T>-q">fijCt1m5֕7Pkcci8EŠ$BRJ=.k,ӌQi3Nb't8?bk[P?, P2#*#&W.1'e:{51$T*+tl(Bmmu?Ӻr_{<@yr$$Rhۊ6Kh@jIITi$΢s|y:عsݥۊyB.91-ax}LQvTIa(hUSblQmzuK񷗍P),Xl` OyA㪙=VA#3:UyͻO Lןd^C&" CljlM *7yN0$P Q6!$ i'e-В;̍5?8~q9mmQr8?wl#&&O$_WwIfd.Yt2Y*vRVڋk,˩ A!R(P?QAlP;{k[|$;QG #@!0ϮGL(4fyha-)TωwyV1a-Li-!]re[Vok$A$IĦ2GcK.jb|4ɭS0Ue91yL:tM ۭDԑ'#*bv46iFX#pu%C&qjvĻB@k#3K/KΖHw1;O*$?i9VC:?j0e1+a:΄%#d~euiIfL*~3k~DJӺlkh+bZ=07F@ DKAԎ>@PQa|8uxn;#3=z{ψIYύaF018OKMg $VA_mZSV,}Y'oY*3].t}^QɄo:)SMM#&r.&pX#&oUP q:)™L8i:^91Lŋ=Ue&t%1Rl#*y.5%&Ld,zci~lGD4݆Nь>*#* 0랃Dwy{#& jTQ04k}m%&A x|P2J&ӪqjrI_?r9?ƙё&9TގccE !`}Βi2$Ʊ;eo % Cw f)\!Q_lDCQWNfbwi=)ncV}GFx6e[-ݰ#&z#3ZDn=(!/H6.̲-b-T!Tk X)$m.\kfjUeB$C#&@LR}zDk221CLŪk33EnI 쵭Zս[p_`|zzrswÃW_8lzѫ& mZ AS!Iղ'L8t*eAiFPZ_6wKCV\\:~AmIc)7>mH=~=Esr֏͹bQr\@!hhE1GRZ2apĊY )A1ls*.6<8y6(ۢ~7ξn&VJABS߾2H*tICc#&:j'VIn$(z, H@Xmm[Uy**5SQ22wKqsQ#3FwB0( Dam<:MQpvabv2U$PHkVz\~Î6jz됬uSI1(FC(cH<#Obdo>֡wFO}ʡ*5#&%Ѱߨ=HJB#3#*y/@(̠( 'SG,9ì]|9I%q 6bz5xl$(#*ˬ9FDAdRПzjnҋMFsr3/#2v>ӷ#A>H!#3*Vb=.O&/BCJJ!Q:E~Z#* T/#U";$.*(HVVdC2րURoj I1Hff,(#*Z{~O9>5P "P&mV F!nYYYZ9GHt>>Zct,~t49UGsB#oP߆}?oYn#3VTn*j&wrb ݊Se8WXsci⮮#&94KHO^Ʈٶ*LEd%RH)FI p V\١C.f^uᶼ]^[vduv)Lzky!ȵVJk#*pз(3^JƤ(EC 0mZXƔiFa1[}Di&m$MgMoPD09Ed"ޕ1U"a#3$"˱<{>Q * z(~ЉpC55v ʫtc~st|mx!pR4ZQ@A4#Hl4 H0`$Љ1D4#3RXlQw4\]) ut֖#&3۸:\#;pVAsXXpň#*FXC'"VSZUڭ%.4 kTXB#3B(3.DPTDRd,cD((ń|M`*mSvU+Eo'T ElVL6-hVeF2уQY+2deƴ%E[5z۪/j߾‡#$&.\$"$#$"#*t}z6UnwیQ`M/fV{;N@PDiZ4[o+~\KZ[DRnMSnSk\MFMd]66+ii*#Uvnv2+ f2#"')T29AdUT#*7HV(!:7>n;9 kJW:M &eޮaɅ!l#*ֳշ,nxy,4 "c(%<(p\uf,FE[TlcUcJY Hi2&No2w 1fK=عãV(%݈y8FiQR\&F#3vt}Hp,xzP1`9)A{XaV=/7Ym1.gJ`w\T~t:'wL?> 4rp/NO*X*C#*v]KUŢx>v43_MmcT[B[|}ZiV"CH 5`CD5B6ɟQV[Qj[^W_zp#* @ȁ%S>m}wXҲkMuWQU]$,aFKфdD4j#&#*ݩYЂIC@$[m} TLbU^4vOe5u" D R0b.WvmR4l jJ7H!Ŭ"IDQQ""#3y΄}Դ#2ʁt glpiQK*Hy?ETH#3RROa`shq\$dˉ9rr}g0I:j6= s;9dCA{K(*(x2#3OKH;wd>-Y?ꀭ7(x6uFj{GfCB*D,8Ǒ杰c>m-YYVnov?f=X#& $poUA f&ɷYK2KHBaBw1 {_}>4~v F/@Px-# e"?%D"3tjWs}iJ1Ѝ4p`*t9J=@Ke?8LCYd#3T@#3$F"`Xl?AByܙۏ>87EH@X3iZ3+6^<(?Gr~穾Wko65THbCb*#&#3E!j .X#&F0Pu{LHEV*%-j{7~RǗEARκ뺖j6(k]K=o!I!#&#:ŲjԙoPҞvײ!ci ;(F b7@xF^[mun7=Vݫv)2`!=aB|ROp/n•#D#3Pm#3"> yjP;Q]U*kil٥jm0Ho->#3"4k|ٶMeQRjLͲ!B@9,zB;5aR 4H$D$$.\1_AIϝqC%9KS5f~aègBDF)2?`B~{rHMJzU;X6 dLЄl Hk_*jFiXqb¬lYB(@EdUPQP$b\0FvQv w`#*< L8]ܚRzv%x̞[ߗKQxQBOQPb@pUFB3Vv0܉E8,EC$Oi*F(B~("_#3,؂% R@.$#*lIZBh":pAgO"mxp&6; -mti508JRn7U$U#3#)#&*(dmI,BF 0cKOxn]!pp#*2(-#˕el#*#&ZhjP&KmL9ͻqzc4ЉOߐX77ԶnqT䵆}F9̷RBxN"ZA}3N[:7XIMnś0΅RfP!b\n*LhD|<Uoܱ1-{= ^#3Tw0.!񚀈ts=X,{_neUQr.1C%슇y"#J9g$Nd)]O˭  F1t2:^Va5^O_fSz1MDC;I8;fG8Qa/kbf CǯFsSطR' Kv+`ǔ7={9 lGf-2>#ݺxr)x~GyN$RgWUH 3d<)!R#309m1 +7>4{{囔y+ wjcס˶7RY&(ɂ&ǛM poL#*@X a&9%#3z쏱J@xNÚ3*9>][ SY.YuLyE61#*U;t#*@** 2: #3H\"h">H0'T10EmeK@PcXtjHRCU~毂_GU5LbnDFFql]J#3=O{և2F[[YwrA+#;#*d[?F3͋9Fs;J_#]'C."P۞,ሯ#4#&(#3E{ .vKCJZg7꼘 I#fΞF.K.JQq˭7aT%ש8$mdIa|>_#qE$ad 4;v>>W7ϰ)moPռNAf?!NunaxddnT8e>@>A@őj3|WrT<4bϢeX+vIvE^$-?m|w¸ro8Bg:rQy\V7fmZ y6hQ0q4;ޟgʬZڋ[I&UQ,ӷ~ӯ.Ś #*oeMRЬLzfQ92}kfoϻ1hSa%DYXW͍/m#&!DHš;r!0Nhc#3`sgΚ#*fg4}lh9 /jl̅;v3CT#3Z۹ߑx#3jw<#UNSRKE7Aj2uMEAA)FP%DIA61)~u{w{+jBUR35Mi>@2#髬Jc?8͹ q#&[3I-GV*@h}A,:UQawXi)d}#3%Ab 0{7QPV *pS$c] ZH"5g@0V#&2%RUQZXme4A @B,ݲnxR! {Ÿ"#3AH"rh/.PFF1I&#*4"%#*m flX2$,J@q#&D>b|ԛwuzE)$pٞ16#*%dm1 7#-5\=˧U}gcwL#j*~ÇNpX;q."@XJ?Ib9vKЌ%UBBY#*]|,MacYc`i(ݼ<3&5Eg0`tfԡtx(gT"hI S!2C"UӵSrp(kxs-r$R"mEdL#*i K#&bB!۝׷TuW-7]JݜjJ&1͔m#*4Ų6eVٌ`F2,X"5#&vܥB\!IGe4&,5ʲ#31nI.n۫tAur=(YeU$8$>#m'F0b#U$T4&v `͑Z1*@#*%1#**("#&ѱ1AV `$\M'ڭ+a*TޅD#3Ix•rHQ*(G) !ic+swQAVVĴ͉(SZ}#&5q0x},T ynЀxs%Y?iW*PDQF ^o5RkTV6`Z4M@`h^Ǵ҈RzC#gﱴKʄ JR~)#3Z77]&':#&9 ($#M.#3]]6u)=BMDba`ǐ`H(o7Ae4Ԁ, %QU4rHpALw_jom4ܻ;X r##*zφ,E)0|w]#*ْ tDDu>%S0M$XW&Y^aÂPF,!9Vz?h}`]D !dg3uU`)fs#*zcULDnvg'ѯ yi؆~#FCymv/3`.W$MX'B+ԝd}<\=֣Yreҵ nM늅ACrrˋ:80.: #*Bw8X :2!6P({cK eoUx7+YrҪH81CMA@-0ـ)!S#*#*I)lM] 3t[&)ULAF@4cA4m淍_Lxm$V#&LDTK;qsOU<~4OtRd@0OD)*NL&,TQ&XMrZݚZ6wpݖ΋]¼(VPDYڬVVZm](2H֍K6V#3퓉;bE9F!A_U:R󪇩T5h>VCU=#*?5qk!)x#3 ۓ2JǤؕ /s2z} җ{}mWVvSlԣhl)EcM$64bhlL2DZmFckbSiJh5kLi~yk 2@ 91ȑ?)pM#*1<1IcDy%¼ Z 2H(D¸QK#&l+c",AP#3`iP0#*H DV1P`]BT$ALϮZ PJH%PB ]#&R6;@pPR+ߒkUsƵ ("uCl[3 Z#؎xr9xt;8G/6\AͺbdTv⿳mHq?7HHw벺smv]<\cNGOKt k/S:f*_n?%nxG0;RISu$snp蛘$3NTuzAu:&yp2-vY=^d=7?Wwf0 pWN-4ek:y*:[!N׃&j,7W;\3uNtyjǒB|S԰g^CHN6@WK#,PqVZOK2+k8r%P! ?J*~rfS-Y&bǶUeܧmC"j@wn(wU#*B#3UEJI#*@7d\!!/(|شE[zlBIl,QIh_?-`Mؽ(IBШWϒq\W퍿7G eSLrDuw*:"*+%K_{^c>UۤLC"Q)S3ڨKI;C:@w01ɱw9Q]=3gI}+v̠䬜wcB7X踧yuUaFHu;È+u5L6i1Ӄ,)8eH:%0QDf#*tq?Ii}O#3Dسu8xs3Lnt9}sOjgԛ]xK̒#3&7AlTs՝#3*]#3/Fƺ̏Bf*h5#d2| }H5 4TL,#3]'m0dkF%".@D{+n=o9ri;|`M;;p7; jџ^$U|3H%LGȴ$PԪs,ՇSF :\jDq7*QP@٠unuZ dɉq <512;Pr9`uFY6XrZ>'k 3㭿C̗;z=}pGU4#&iVx"TȔ7hμ +m(g}PYD%؍%]X"n3WM5嚢zтA/YbQ6.:;c)Tфepf7R .Ĉ[y##3۬E ov)ݤM*ι*]vnHn=-ko RqT7,J@N#*/]9aREqdjF»6ezYiݨP,NHc^x52Y@`ӎB8|@qD#3ipz_5>|jG8="Lpv`]$6ncq[J$9.c +RWC)6a}8|'%GL'wD%#9tv򴜱]KSQ|{uD#V'ti7LAm0iMՍ17{~O#*tX&C)RP~%umt}7pdTӪwfHIk͵,f(I#&2 O'4˳GH֝S'; QMxFÄxl2GM4u{>We.NCn՝1CT,+֒dQ]_V#*QQjXpl#* _#3˨ f#*+tzG}uc)(BHYZny=pq5]}'CCP0S]-O<:&q#3!V8!^)3MDQ#*$eNZ*QJKA28N#3pÌEz+Eclױh~|32\2ydP  I |&XTQ=2Lp25! JA? NҢG#3sc+^R G=[$3=hi#&ө5=7;gΨR*FEBX ZaKT3TY#*#*iJ7E$cӎI#&N(bK#&lm+mͨv(mV*ߑk]5*صut#^U;^-P 0*2( > ӛ+c6fCv,6vG#34#3!_𴜺Ёxm.[WKr9)-jI#*#&"hj) 揿Uc&R0n uHiJ!⣌NRLACԖn'6mpH2h*6ӌ1#3Rڛk:< H(2*HȣUm2(pqF# &Dek&I/+n@jB4ŃfHSK21v̢xpjt3Jp0vkcyL&5B#&ޟ1Z"Nڕo#*3}@iN rɄhcބ>[9J6jje*XaM0laXj,R7/\]-0B:@awm hpH4x1Am@8|]갨ita?'!UJ5bࣄd1Œe7L8{FƉd#3v2cKhhZOoP#3 #38_m0V?uK5\:1ePUR1Ejǫ\cJXT\ KU*0EcYlE:Êz! [#&VhP0p7jш;\|O`H#&2N܍mf5j#y*AA@T T#&Lny6t u~C1#*lIVѭ(F$QRaV2U&MRm-&,ɓYlR)Fd0-lliR,ԩh5"ɖ&a4$eFDQ2G^AȖA;qMenT~5c[ Ep=^lͤaմ_$P}2$l"yР#*n<ķ1jCR`3>ǚ+t; $VX7#3s;J$"R >>8K&*Vo\5 5"#%9ѢL啜FTEv9ebJhi1B7D˲LFZh#&m<RX+Ba,P7]5뺅4f`"FDf.=޴[CMQVZxJQ,bF4QđȬ??qb*ɄʀNxww*5#$Ĉ#ebցo@qLaJT4&!Bhb|"I g!.#3 \y)I$p#& 緇dP@#JQB3#&.dr=/4|D8L<^7ftp6cЦ+ל}&3@GP`;(3r. VgΡ.C p{ W(5uh{n[.|uCRW`>52 "M,#.zL!"1Q0CP!#2ҼqcU4- @L] n\]y+ӐeЋ=#*Q:vW֜F^@)*s#$_QCw{ddڻbeԥd<(=FI&)aDzRvh'hV&Pxkt4#*P̆ ?#*#3Q;GmMlZ)'^xd+^ǿ\d$=qa\l|>fUVg'p.UtaŅnL~>s_ Ư#*UGynTarl3^,@%a .EZ :r RKֈiUw҈.[j8Y=g5"l3GhPxd"nDz&Gk&9$$4C;q%q4f@o܌`}02K ad@ vyqK3!ie2gѮ:HM 5)n8f$8L`ӵv!C!cEtc-D9cir8MWH.\ËBN!"mf <ś!4@IRP& mX#*Nձs pWh]S(8tW9.Qk_**}pToq3LgcX柁Z:9NUI1ؑKC rc BvSQ0~S6Ij0ΌhM4u#&H`!np91hH˿;u622%\]G_;<#*r-i5+iK#3p\ ě bwNP`Vf0#H1)Hp3%( Ƹ-&#*D'CQR7-v}AyAGЉ&U}[#ڇ )2r|:@>*!yyWNI.t0xBxo1щY4պg:M,hHŒccB#3AP D1PjJ,)#* J45X>IPHuܪⱈe fQfA¤̑$V)#*ugj{B|&^~{A>#3 y>J#O3Z1A&%JE-2QY]@^}HG#*}13,J N>؜Bug3쳳='Qt1E>سy} 0#*#gsГ^g9b&馽dNy$IejJK1#3&#Ź3BX"j;z@rDKrs CBH(Tzj7{%'\6dSw;I&'2T,UH6d5ʌʶ*vn}dP= JZ%~6mI (9RBS@ [#&#* .@)$,!ɊHm{`#T'X2A_ZuogjxS$Y HBqׇ9OMYp?R0` " 卞oJ` i"̓7># 5ju#$#3oT 0VyYHȔB+.eJF*;P#nҫZ]$EueVD!,, Rj 鷫#&ta#*2,t_rvôykQ҇MAԢ!jT]*` m {f@HT&\zxww܇qSਲ਼} @DRRI"# c vb^~gK5 N"i1XY9Ed^Z9: hD*@9Uâ!$ceY^#*QŜ+4OG!A]~(&k }X|>WwhFR=p-"Rս [m̚}d}h"Chk?\E5PR'a#&]DA`[pH(L\VaR@*SL*?)/y^zjD[#*B WvMUFB(底66앿#3 ~E6M mFyz"O>gY{Ed8~X5<>aE$PEFItIܨ;@!$S+E2[4j2rF1FTj&iZoyI OB&pai ΢GE#*Dw\ىQ6j(H }_UB#*D7qA4J,b,QIAQђ?"jP IUAH,HXO:`cR42cGhq5؅BY`'\pvBwD#*©V*ƭj#*BB[Mil˳ɝJR@ӗ[$ʱKikhX2=:p&Y>}|- @)- kVD*Y;@ o$2$F#&mZζFLLChJ0D+]H%8KPI5ds X&wh+I8H#3DH+aћu)ɁPP+So5!mêJ"AbʉRѻWy2Ż532JJݮrYRo;]Uycv\ҐFڔ)[2MwV+Q ȴ(3[Hhq;<K=۟aW f;E_n)A4N&0$|MMNgwzb,jn_|Mp)Sk0d-՟fިEqPU3]{#& UЊ{UQETJKB9v⡰5CDXy뒴r{oߒkinD n4&q*95x<>4%4iXQ ̇b,$|$%̀n}fo8 0퉦 b[9^ Q//Qp(ա#ڝbk#*L"ש(C 4<=B/}#*"ȘL9Ԗ9.#3&"8[ɉj?{UW)A(]GJ?\28| 8AhBV#I/|\I 饙ʭmnNځ;;SKIƊ<CPAh"k#*ALj֪'f'oL!ED˩k#*S06L9$:)E1\LΘBqpzQ1l=8-#&fg;ݰ;Qh-o5`3j]r 2!#&. X7 utB6ĥ.00H=Q_?&f`.O Q65k ?n?w?'?w_o9now/}_qßϿj}#*8G֭&!)6pPu Hbsh#*#]HBFy?į'H0#7`Z&rBz5^mg$*j)wύ7aUWqPDAjldFz2PQ#$ W)&C#*o:_1Ң욐T+wM OI:p`Ӛp׿os実,LثY``iR_VFZcc[86+!FD&0gbΎ;01Q#3E.+\hV &ŦS !4M5L6nPRnLB Ul 3K!JxuwS67]3~\ő++ fp`K#*=eLJ'?;uI#*hdw#36/%׃x\m{t՛1`+!ӣʬG@Ӓ{ .O\|Vkm1dQBxl5ZۜbWBsO׻ F6 .׷.ܘ$>:L6&h"!oZ"hCR09L7m/h/#3\ysm) KNEjEQkһxT>W<|ݲtq1zKpYk#DZ! ^G,$ }z+(Oϥ0>.Mzl{笏qYc-UE^_׍o~#A.p } +#<== +#-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v2\n\niQIcBAABCgAGBQJWjVbSAAoJEGelZe39+Q5k1DYP+gObB4GJc2TRrfkaYrNAZaCw\nOZIH/XoeOG/W3SWA667oZH8prLtNreE2OMiimqqNLZ/SzmNZ1FfkpgPlaPPSw/Ao\nyZo5FD4CrDPshX87fKGpcG4OGSam8b6ky6ogAdMDPeXu7z10w685PPQtel4zpyqs\nNM4709og9/EvK+41jEyl0oagF0sa4EAtRmGowobqTYQIl96ThDPVnRCLMnmeBveL\nmjTtiVQuQSmJlo1VJnDkvF6TOnvWqBL29LhgeKqD3h34S7a4AnWWfu8DHU+UI6fI\nDGrjQ7Hx0fNH3XSR7MmqM+fV1eB1bFC92MhLr26aAE0VDnlVYJDDi+YetFXodmqn\nDDFT5ySI4bFbd7uAVqvbbYcy1pQfj4cfQ5ZShQzYMuynGQtez1/2+nbHtySeVAy6\nku/MLNcNIhKj7+8G91ot0psXd+GRXXES1kESVnE1dQgMMNgzCNNlZ5M/aPqZKHt3\nbduc5KsjEitWLhjeOUB/l08g9nk7h055J01+HEykrkqul8Si3uhC2wogIt4dMOYo\npN58GlOa1COC2YgyO4Sl9UQdwxc+5ICwQRJ16V7rMsme5ABrLHQgtNLcaR5jLbdd\nfZ0D1PB3xRtD8GChAAZFsHpKPmWaOIqabWiYKCmlTR8GWOZQcyw5E0zG8QRWgFVi\npHt1l9gxtPg//95wADD0\n=9wuW\n-----END PGP SIGNATURE-----\n diff --git a/wscript b/wscript new file mode 100644 index 0000000..168fa88 --- /dev/null +++ b/wscript @@ -0,0 +1,16 @@ +import sys + +def options(opt): + opt.load('asm compiler_c') + +def configure(conf): + conf.load('asm compiler_c') + +def build(bld): + bld.program( + source='pic-linux.c', + target='pic-linux') + + # bld(features='nasm', + # source='scrap.asm', + # target='scrap')