From f4c0aaa878471c0c5018a03b01cc37906ccef7bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Sun, 29 Nov 2020 14:16:39 +0100 Subject: [PATCH] Kernel 0.94 --- .Docs/Forth Words.md | 26 +- .Floppies/A2OSX.BUILD.po | Bin 33553920 -> 33553920 bytes BIN/CAT.S.txt | 6 + BIN/FORTH.S.CP.txt | 111 ++++++--- BIN/FORTH.S.KW.txt | 305 +++++++++++++++++------ BIN/FORTH.S.txt | 491 ++++++++++++++++++++------------------ EXAMPLES/MANDELBROT.F.txt | 14 +- SYS/KERNEL.S.ERRORX.txt | 2 + SYS/KERNEL.S.PWDX.txt | 4 +- 9 files changed, 591 insertions(+), 368 deletions(-) diff --git a/.Docs/Forth Words.md b/.Docs/Forth Words.md index 5039c0b2..faf23ac5 100644 --- a/.Docs/Forth Words.md +++ b/.Docs/Forth Words.md @@ -21,14 +21,14 @@ This document lists all of the **Forth Words** supported in the A2osX implementa | D+ | ( d1 d2 - sum ) | Working | Add double-precision numbers | | - | ( n1 n2 - diff ) | Working | Subtract (n1-n2) | | | | * | ( n1 n2 - prod ) | Working | Multiply | -| / | ( n1 n2 - quot ) | | Divide (n1/n2) | | | -| MOD | ( n1 n2 - rem ) | | Modulo (remainder from division) | | | -| /MOD | ( n1 n2 - rem quot ) | | Divide, giving remainder and quotient | -| */MOD | ( n1 n2 - rem quot ) | | Multiply, then divide (n1*n2/n3), with double-precision intermediate | -| */ | ( n1 n2 - quot ) | | Like */MOD, but give quotient only | -| MAX | ( n1 n2 - max ) | Working | Maximum | +| / | ( n1 n2 - quot ) | Working | Divide (n1/n2) | | | +| MOD | ( n1 n2 - rem ) | Working | Modulo (remainder from division) | | | +| /MOD | ( n1 n2 - rem quot ) | Working | Divide, giving remainder and quotient | +| */MOD | ( n1 n2 n3 - rem quot ) | | Multiply, then divide (n1*n2/n3), with double-precision intermediate | +| */ | ( n1 n2 n3 - quot ) | | Like */MOD, but give quotient only | +| MAX | ( n1 n2 - max ) | Working | Maximum | | MIN | ( n1 n2 - min ) | Working | Minimum | -| ABS | ( n - absolute ) | | Absolute value | +| ABS | ( n - absolute ) | Working | Absolute value | | DABS | ( d - absolute ) | | Absolute value of double-precision number | | MINUS | ( n - -n ) | Working | Change sign | | DMINUS | ( d - -d ) | Working | Change sign of double-precision number | @@ -88,10 +88,10 @@ This document lists all of the **Forth Words** supported in the A2osX implementa | EDITOR | ( - ) | | Set context vocabulary to Editor vocabulary | | ASSEMBLER | ( - ) | | Set context vocabulary to Assembler | | VLIST | ( - ) | | Print names in context vocabulary | +| VARIABLE | ( n - ) | Working | Create a variable with initial value n | +| CONSTANT | ( n - ) | Working | Create a constant with value n | | : | ( - ) | Working | Begin a colon definition | | ; | ( - ) | Working | End of a colon definition | -| VARIABLE | ( n - ) | Working | Create a variable with initial value n | -| CONSTANT | ( n - ) | | Create a constant with value n | | CODE | ( - ) | | Create assembly-language definition | | ;CODE | ( - ) | | Create a new defining word, with runtime code routine in high-level Forth | | DO | ( end+1 start - ) | Working | Set up loop, given index range | @@ -102,10 +102,10 @@ This document lists all of the **Forth Words** supported in the A2osX implementa | IF | ( f - ) | Working | If top of stack is true, execute true clause | | ELSE | ( - ) | Working | Beginning of the false clause | | ENDIF | ( - ) | Working | End of the IF-ELSE structure | -| BEGIN | ( - ) | | Start an indefinite loop | -| UNTIL | ( f - ) | | Loop back to BEGIN until f is true | -| REPEAT | ( - ) | | Loop back to BEGIN unconditionally | -| WHILE | ( f - ) | | Exit loop immediately if f is false | +| BEGIN | ( - ) | Working | Start an indefinite loop | +| UNTIL | ( f - ) | Working | Loop back to BEGIN until f is true | +| REPEAT | ( - ) | Working | Loop back to BEGIN unconditionally | +| WHILE | ( f - ) | Working | Exit loop immediately if f is false | | ( | ( - ) | | Begin comment, terminated by ) | | ## License diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 452184764770b70fc644ac69f361e1141448c4be..966d05a2eb5b4e46cc7e3ef1df4c0e21540bd09d 100644 GIT binary patch delta 45076 zcma&P30#v$^Ekdqh(07h$jOZnL_i^Ocz_2I$fHmZ5b(Aw2q;tp1guAom{zFus@m4o z_w8YQi*M~)Tea`2wDz#K+T+FEwYK%BzCF~UwRhG3%^KdF71dV*@evvWdMycv3{hTIW1Je2gDCiXj$ZPK&nK3)|t z=2)DHln`=9a)cC5PU9C6xR8*EWhGNfiSl2-=KvOZ9oVzaeEz4F(e&&yCpW4?C)SZ0 z6N5s?Rn|aC@Ux{~|EXdWK3jTLyI1w#{%KoOnh*L9o#~hp-SGVW$_47-fvN}TgKg?` zqha3{UH3hA>bdCWCp^F5`K{0Yd;cepJv&EM6OwBrWUxKSo*$PQHzn>|+{L(G@o3wHE zUGa80@Pj#)z+D6FZyw)te3zY$Tc-)9H>YT{^w3dtf;52V$I_pUs!#TtQ#*V7sJi_h zy{`^b?fX#u;H9va_S@nAtuH9xt zAj!UX-|l5a6ZYZn{`Lv`b~mgr*iHL(*KW&L7jST6*E;P%dpN!GEzRV9x~`qXzKR}w zOA~47McMa^hJ^js-qJWE%XOqB>_1d=oI1NTaqireq+PWw<+%sCHWDCZHP8aB4%t#0 z(B7|8TTj~iZyS(hZ#q4tU$=Et=+E~2{r2GRcI#HE+cn4R)%)whD~n$J9yk;nJT!LS z-hiI)Z3O#?5%liZeH%3E#_q%J`g-TJ$R2fg<<9w8m4~3Kg1a@pt-XbQ-K}w|4$;9! zHTlx<{q{Ad5802?MMpK24wee9Wazep*K3{>XkXg@4b<-mC=BlY`Pgz^ZhvXV`x&>_ElXlG~RDGlJ+){o#~$#uD~o7-;%qw?ZdCZfMRte z!1nwO-wv(#NjhfFIP-hbHu9WC)pPa`jA7(Qnwjn?2kZ|Vu>a%0uA^O9XTl4wt^1&B z*ZW;(BH-JHT^p8lhVO{5-*(`kPrEwXwH@8jPaVbLL*3fQtj15fw)fbrr*=1uT_W{TXg~90wgP}MZ+5O?!s1@Bi7iLxN`lKuP)2>i0h}@dfk4JV!ZHGRyGm@YB ztZPqfL3nNC##qVzp94ueT^qGA7E-_0*>9thKGsCLzdsPZ;=KLffeqhO?j%JA5Ae#I z-!~$=2S5FO*Vj?q0~p_{8P5u#lHGIK{{4X!7eIU(vRJdb4?NiuvyIFGl9!{@9O=Hi z8h+bb4nXs}j&%WK6F`3T{01k_n6mcsu64(|c6E0FCKy{7$AbrUCmnjHyQ}*Wa0Q7d z{>#FD1wZw9*RJDTPj`1!?rdbJc55(E0OG!O$Mfs{Nk@I6iBo++XMLi{a(8z<^jX(K z$GUi9ye-xdJtN+Q7UFj3$&u07E>+hW@XR4T#(9T)Ci2mqgTtzLKx;hyk8F&eUX>F)AMAY}8lcB-}q*bU$9Heze5FR<1(M*qG%yz=+u zSd~K>ctM)4#qEt9Wcv#ps_mqp?hE;ap74Tg7B zI%M3Z3mB(TX=#o=;F%pk0Rd*H!ExB%et-8TxFD|I7aDLuwO?flxE5&MX59H9uFl&D ztPl2W*ADIJ+7}&gUbQ1OAlz(R@%?skuAkI1{F~MGjB|TKLoe+c832us2E-<^iR{V^ z+ZM19e}z{T>{Rc|2{>=;C=J+Asts`0x0Nn#t#htvuB#%}y<}@cO_e8pkTZK_k<00+ zU$~GMpCwywX>IYy3+vnRmbKLq=|5y^b3+v|?z^tQ(&eq5KXRo@&i5>DCdTKk0}4GL zfSSwOs;U>biSdQ&AZ#yr(PU?=EU$2Sl9o3o6XVO*frY-(3lTBCO192zsq&-qH8SMj z;8bFKognQuw6@ITYzDvKZ6G5J+JEyp#L`=2Yuhs5@6h!HhdJZY5so-Wo>I) zl_zOdX?{~pZE0IeGBLeFw$?XRdz37qe;4R$to1muh~+({(8?mM^PPz`h~C3+o{KyNulkYK&qF_N-z zPb0BG3~Y8V2Q!7Jw^lbV^~9GuN~b$qg=Iuyb78ZG(_s;GWRX}ar^6=b2orRSBEjKm=m0Mr5e)3+NDgL+@~5M`KrSjG`e;E( z7O}>v9oc;-8NewCu?tG_9rXrLe^9hi+{jl{(ZS_TPPvPnpS+L4~N*-Ok|4wnRo z8mftutlrATX^5H$Sj13u>2%i&M_Fz4zVQCJn?oP7kVOee61jZ(=9^JHrln8!A8U*v z!!k*Aa+bC7%ITxIcO=K}fB5PCfrglxns+IMOM~p0j0se$(Q{Hez&g zfmbq2d1Px&`ONZsXHgM?O(Xhz`uwJTQS?*E8JCE|JDdbf!dlBb@#!97F5(#YK&RtC zM;6m!V?=m=Z3)>*!b<7U<67H*DInu0Z<$0YCtGW3LC`87tGU7B$RLr^XqqKD!Y~~g zFP&OmkXPtQBbFI-(WMA;+)ObiWk>nUVj|5VTU%?ZiEcK5fyK@ayOCCnh_dC}B;W>R zrIDbU0SYEw8jz!}s)93H1%NybI#1Sus7iWLb2&rIrZ6^#KIU6QpNn z6GI(PSmc`NEc9fI7)dPk^s)QoiM-i7S99OC&3GmmZhFL zNE2-%^ogxW@HyS%8(%un5*@FTTKEcLZ>7x#`wysZ6TRD9T8>?7T8!w$@Jx_PCJ^hb z-nP@)3rjq;EiFwgL|O_9Rn;f zmISwxt+h=puzSp#M+_Z&XhfOi9$t+JX;iVJsHCKnm{x(L@<}GZV(z6Uzv>rNVO#?x z>1_Jd;Sdr1TG4C{hC%7L4L^va+`{XHP8z+ndnz#Eg zGy%r5oap}nw4peTBG%4c?Ut4m7FQ6<4lJ+s2x3@|OaCNn<+AR?3BZ=;$wh^ZB-w#N zrhig&ayGF()eB>OQAxQ>EW7B&*ZQ0LJp&wNZ>C>bA|j)8yK#czRF(E{+|phy+Y_Fp zCtm9>2mf2}Hq%L>|3g!(5mBmr^s!AgTlRi0*RxhS7ccd+Eo-hNX3!ygqF>Tn+ejo( zA=q;Jyx4XR(1%~|A2k5<1|jvt1S$irct!P%wV=DfZW?=#e)4+%m@%Lvh}FmZnljRS z$|jTW*S#p(<%P{{%RCKG-!q;>f=bX(L#y8CZ;b$DVD7?t+_i&Y`{&vb$amxsdgB}Y zBa+^RV%$bENc6iXm#uBfJ#$N2>Kof?Yw{YZ8W$i*B=W!X5rB4g12kJfvWe+^j*SC5 z8yblI1JP6_(SAtoA;BLZ1gyU}pY)#)M@HIa+*z%k@|v&~3r1kc2>J{vGX1#_ z;e1DVsWV?DLC1N!VSs`dzZ7hEORZl~)jrAW4mtr)jF&W`JqZNZPC=XLo4q0~7CO^u zzY!{343a2)%?C((1}a(35=SQM2GooAbhLbf3o`QJ%d>ua9T)VgH~VXoz7uSWBF1yq zaiKqtTvVgVV*P=>5+s}5Aw5hK#pDXQBp4W(L3Ecrn^*n6(%!?zVRB_T2)hx3Lvfn z$;3cZY-19DdXKW8PgE;h*7liZAfO($NEKBQ-)-#yxQPehjW%EjvEBy?v@*? z<~G!_70)xhrK*`kj;2q&4P1|574j>}it-DbWvf`F*$L%0#t~^OZ{0dh#Z<@pa!Si9 z$~dFxk_4QX{Rq;QUT?8JnaUAa`6<%$X5WI`I8{+ zQqp-cG-!~0>2fHZpd>4tc~Cr2Nf%9kWPy^L2CW$imE;60y+KL3^UEMTNlBNNK(fe} zEQF>eD@j+84C!KDIzJuKC4T7)NSFGhGa)_2FFhR6WlFl(=|)z|l?+g3Azh)QclPAw4x|`u^Nf{{PL6s_3xdYDJWfdf(3crI?uXo5G*>kD!O7stS z3vg>kcmIxVsiQlvqg%JHTi?2c9Zm09QWpfD;QdSLLh=^qB;XMzOU!h7;DeCpe!v4L zhxCgNLc#)o{<%9o40+Fu%TqRyfZ&>1P~m}6wtS2rQ9vCU9oV@F)t%bbR?xkQKpikv z@}fx&$X{5ykm#$R8ea&F)xfK79nT?f zUFu!d+U3R?Pt!aPAk#0$r5JRDG!l24inX+j&agT-DmT1lT6lJLv9z z7%ao@1ZII3){NebT?kw2a1!j{TNld@zgqDn?r;7EtKh}cJyp+y!zW^Y)iaSfv7zS!$?l{W^UGIHn{Q!e zk7wSEobrgZc4-?^tn@2^aNIr9NlXU~ZitF@-@`UoqF*Jt3FK=vA6ID&U$;%`aD166 zCp!wKmX{G}Jr`E#KC!ZI5aYg)kD#lzp|-7-%MHpKO(8N~KaUIAs6 ziEMfO@>(K2!6}Z}NjEHvijI4dqv#E!{}*7vDVasWchUD2Mum-k#=F1j_9(M!FYo2J zXL&DAsBf&{ecXQiT=_SfD^vDeH&@JE$X)O0@tk+u{ia9o0sk&}Q3V<*j$hPE)Yu&o z;nu$_>I^65SNQPxcgd@wG!qUCD$pT)^Fa~AHvohm1FUc1l<_ACIy(4}5DI3LI}E@m z6C;T6Z4}mmWgU2=^u&#Z<@sG9tM3U}?d~J1NBICq?+aP|fcN6q4^{NH%G}X)AMtd= z$Glg?YF9eFLo5)XpJHc#O)ssz*g07y)??SNF+j2OIZ_6cANQyH3(*r9B=##6eZ|&4 zI_?C*ftlx|=m8M))80V=@r?bN!`*y_!&%P)KEMSpx?jrjCi5|%y)^BleuIoPO zJ3-9%{=}RU#0)2~7X&ds2x58!F|e9m@(u?Q^CO4Lz0BcEKlu{_Yc$dSEGQXHB7XJT zGGMF0qsv_g6Z;#-68{IMD&opt08T`}s~j+pa6_a;Omu)oaeHJ64Tb>YnZ> zmM1zZ3a81i4Wdbrn5)$6@Q}ps0hsByTD`TZwSj1B)LV(ZmY2h@N%O$o3idAJd^I~& zd8-g}UGEH(+gpTX31qGn^4QwHzImYNmCz6jLqt;O)#I8 zmh_8+tvQ=$TYx&L6FYTQJgld-|n&pDp+XS_@bBnV1 z4kXsG0aqIM;sXB({hdGo*K+hL1nqEq@^IRV91|v2IKb+VK9ZR4>eHB8x|@raZDk*L z)H2%p)ClQND@Iyq<{n60cT5btS3P74cBO6&_5ridtmWhfu4ClmzREKK0`F5#+NaL> z*D-hK3<7$m(-RL{FB~L^X{JbLwhL2a$Sh{(DRq{W%Vi{VwgR7zmf_GjN?OLW?M5XH zdTah9xvZ?DjD+3fmpiFsnp`%asAM`Z-wb9>(Ry*o^n$`78T3iNtO-yzw8}4|Z~~f> zy>;@Ot_c-0OJ!mLbF#oQVQR5U2B;b(XKJxLqZAElQZ2Vw#m^&*tQn4cy7h~kh`{+g ze{dZ=@I_97s-B+wBF9_+_GO2&0?uPi9#`$H_0_d;Bx-@kbJe#lfOB4bTWxA-OH-R8 zj)a2^nt`*T@+I|c)pfNsaU^0P9s6ZYcsQ7#S+Tg&^psY$)j??!ZGh5Gq=slij+ z)aIE07X?^(5q%hn-7Q|+i<=!Dw7{Y=8Aoibe$@(FJrfo;G(awxuLUJ79wj#tjMyx9 zYGdo-WM zfF){PZ3}Fc%XvSBgRz?-ELq%!2q)JrY-(8sU37cz{DP{+ng$>s;trAT?Hg}FBBfyx>%BHr~LWhH? zv882kGf*O};{6eIuK>tjSmP;Q)(A!~kBnCaaU^=RD3X`rkn}3Etr2DAZS=DfIYE(N zbZ70bn_5rFt+g%l8k&~Gk(hP#+KHTK)p{CzGAFVhSlX zz^V&tyOv3&t`$5jkQ>A1{{lT)qU3b<$rebH@zL<4IdSzccK8w$;1D z%AQ6BPEg}9&KflpRzaqxNfXul%uv8v2rs1Tt8&8(H$XO6HMNsqLm6DeYQ<{?PG(;s z`=iD(u$U*@sFi3-08UqmJ%#*AQ+W57%lOXVulSaWPRb(M3aAt^Rn0GW_|aw>l=7pE zb~==X&cN$iIBa(~J>$TZAk9?6sTy|VS)wCmtA}uF;vD6=lpn+SDO`V}!u#NxIlXkw zdm(|E!IdmENL5A0Rp*9Ldv&fhd@kRygn?B8jRCdQn0W{i?G}mxFU8|lJulaTR)C5Z zjHjUizb^G&-RKu8+(d#tfSZ3jSVH9T^1_m0N2#N%q@;qF7jgOW*20q*XalSlK#A42MdBJ-@jQlyL8c z&rWoAsm1Zd44e9OYGg3%@4j1i*w)#dz;F@;8#p#=i-ChNZNzLrSA&byx#5Y@Rxu=h z6Xbv+!b5%z08tOaJX_dIt7>ztfsgP>6Za^6zBYGY%r>P>X*2v>oAj-(L zyVEmMoy{$bsO;2|>bBJMY`cP~zOlZ|F}JDd{|{BeN7yqmQzz8UMGU@g3a++>zoN*^ zx?6NQe$TLvZEQ-dscNgu@%yG=DK2q=;mm>OoWDZX8(VhfNP9+ls&n!D-kq*sTUZsa zpmuK4j$3jA9El|SaW09>6jux<_VPBko|{i}ohWTgZQa4e%l=O~xG{Ht`w5?TJ;}u@ z$N_)K^)Dy|!7nK@2Kh zaRc3;n8CFpkzU0GsEP!?#-}iAQhJ>q)1)`V?>9Na!EbSfInW_q7<`zs%`=bSx&nsQ zw?&P2{AvWhD}G1|hOBA?Yxh8y1+TVVg); z5;f3V>rj0%6!NB}AsV)I*@kME7@;a#i!K!%xP``~(5`0Kby79_c*;i{ZUG&L&^xe1 zKMe43i?=b&zXaITrE9!rs0`keC6hOW8;{tANaS!0KXvrknG7Q|TW??olC*Z*SPUZt zWLi6JB$iQ-#M`45nDuchnK}`fCGyH3&x5LD+}#u9{E~7Kl}#UBlpCoUO}iH5#;C^7 zj~C^}?Q6+ZhuYW$*~el-|Afn?^-~&pSFXkV+4Yi0^v4vjG9338a-#nNO1Sc1{L;S! zx74qcA=jP6iGT-f!zuMvM?twKJFPu0Kc7gaMcZF1^I|49bm0|&bcV~9{w#_u>W9Sq zKl};;!5rCG2Sj}9r^&Gq6)QvVcVfdrYhBp)Y8py&EjiY6{uqSiD&oTbg`>wG$3>3A zYWmS12M$!!Wi?Ho9vY@0VL#E0cjwv+zxY@D)m!m*|B5)IQGf7?Y7(|%Wv)r}C$D|Q zzxGvLd#r_s*}$0RgB+pO`1IIb+-ndR)E~xu0GkV=P5t~apdVm_^ncY4^sldD^~YI) z{Ofc7y@-(i14D>GU|N8>JetPiTrBs*fge>% z>u9)x49WE`ALOLdJDl;Vy!|KD+5sxOg}Z6rD(C9Kme*o+WSS8?K>L}=pX{-WI%NMN zPdn$DH+N{Xi3RwYMPBjF;i8`0!D zZR4I}ksFV7_dCRX(@##h;@t7rMkuzi_i~T*@SGmw;rMPHxKLm22{=3uUaXvpgU1d( z_sI7DC2Y{zKTKG0$-XvecR%~6c<{`(e;L0!VbFJJA)V)$OZ7SYxuSc}m9&2L8{#*- zRr&b2&hz%ANh@Boj~le1t1`TDweHCiJ9_#7gm!n}?IUG-(b~j@b7beztje=jIb_ET*f6p;S&M)le&-ioucl^Q7H|^i9wm;wTx^u_tc`ulssH+{{K7LEL z`pxmHR_0U|YzbeuZ$V_I(7z3VLaIcr- zNKaXsOyb5;k2YYSY8>5|K5l?2hwe!q7Zx-gPTFXLOCuw5>BgLXBUDbRdPkcW84ix2 ztOWcXSMp;&yY)%Rr%ot0yLd62?quG)Z2}z_Emj8D^68HHypD>4Tvcf-m(>C z;M%kvE24u0OOXLn=#?jIv8pl}z0;PU4lAeIp0ilhQ5AICi>^r3RC?e=SF~yx{q#jw z%tUZQWz7~jT;QfB%#!&<4luS_XObaXu&|)89Iu&CZ6sE(OZsP)w$$EAqGr>vFS#P! zbAYNz^33TaWv+7O!|P3uh#Scb*A;P#Zm6(PqJg&z+#y46<^(~ye7Y0T!Y~PGG++{g zuuDR^3=X5A!Ym2Ng)TP`9U^R!kTJiEga~^iLeD3`wF+)PG*3x5Yida7d?o3^GuYKRG~l1ee=SQpafmt7V&+9P=Z zpkYgxl~COO@}0!8+qx(3h2z`N>ZLeENE`zh2C2Y5{jlq zo`-h~Bp6MMJnbMMcap7cZwjypBQ$iG%RvliS>%u|2Na?;kte}h-FTOh;;wuqv?cOl zmH|D1c0``T9X~_C57&!u>ST~3G$p#+Y(Sau+KBc;(L~8qbQN8tWK_sy(0k4zVn7=r z2Le$hp=dYcNqI6%QWM$=MH-CV`5=#IE#x^k3y5i*k_J0}o*N|CvR=tz3l?}A5ffSu zc{NBnT~HBih)RwtuZVbiO;bdo# zn;0Hc@(Sb`#0b8<0;D9r0ys8NC1ZkIkzX*Kn6@Z6Ey950P|EcYw1$tQ(fc6@bS4lF6m)4g?&CMPE#rS^_RC zrX5NKT!~DSD@fQsY0hgdoBIi+U|LDOGjD2VeqS0VHrvHnZR zflFU`a$XS#gz+gQb6QbhIS{wYm*FfcbOIEyJgwyAm$-{TazJEF&nTIB`6Wdq#l*T> z$$?W0Hn@C}sc|2%mjtbWE9l?<4m zg&>?S@eDVv=W?m+tY9yqL?wQcB^~6-3C%<$97Uq{a1jDa#1dt&Zeoe_hhF@1w zoZ&Z=wBYwmmf=Q>z%aN)3-p5FLrMlRd{{|whL8BtoZ+{X48ia_N`_$gT_wZI?|YDQ z1Luh|3{R#Q6`+oEbJh(>WoQA^U(y0}Kh>Pq+4RhG$ciPs=)OpBd8SxWGW&PQQ zs<5$naT~T1_N#)cWNL*E*>4P)8+^FM1-b1{R(mE=0#|~fx^#u(wq5n%_LZ6m_!fx) zDiTzx(A}taSLwljTeM;d@OdNU7vH>1*2g?7j9Un*k}|X?KVk8(_J>RTkmt* zHtBs(3RbvI&0`e5JsOC%4WgVd3btgANCP zkS*elvc-)=A0hZ1MYQ0!O^i_rYT-;B4FF)t@gsw1V*nC-w!IUJKYuEjL_!9DqoLp1 zFFT~X9W3Tm&_HhogR4ax;z2iVFvIybU`GJh(*%aV~;V1=Of?qIE#4reO-i+=`Z}>RJ+%1|awlU{o5hWl-Z0mu0>- z6F~LDfta+-%&<8E-A!ROj`ZtdxOv5yqaOwJ(VPf;Wnr~!sFu#E>Bop(aT4=b@fDu} zfmDI$#Ehe!n_{DGHsvsq*mEOZVj2%QO8?10K=L zW(1G&OyCWTkMiIoHMweOeq$T4RQUA8tO#lE9gn%X~VCo=czUvPHSk zJ=pj15PXAuy@!(lyg1NL7*5YZ*yI^t^=e=RQMdd$99IPwC7XZ4#;{53_ z>+nK=y*sRJA=(BQ>`?F=&M94hPrUe>LUW@a#W&8zX2{~RRy_Jz1R37poj1Q0hDqPz z?ISqwDBwau^@|mTZA+Mdx-HB6eEXQtBr{)OF;9YT_d3+gflGipM7P3K9!yhyjTjI4 zDPP-g=yIfL4EE~Bz6t+ZrGHl>26gyA&U==krEm#Z}3tJEoc(!H`?N-$T zL=TR;2m!C~EPv;1_z|lo(!+crMLkM&N5M|8O;jHNiaLC)Z-Z%$E)paZ+;iFTGQ6GX zqluk<0s_Z!Ttn{4FX8HM$}~ke-T~FFqgxA(yTtqiIzD0pbG@5M&`wpRXaijR|0M{A zDQkHOsZyQ_GUlbHIpJZu>D8m4_wV80%1e4;+1t0}@PB*#V?`&R?PM`1HUIgG2KMs? zbk8Y6|GanTbuYl$NO32XUIb5P@ClqDy#!k;xH%*o1i?ZF(m~FVE5~@as_&_4SW>mD z)q|8zh2u*Qc=0lkfaToy8hr274X;B6TgWp=;+s_Wfom{Ceo6np6_I@en$6hE767>N z2Xj@}J3w3-%K@1a!vL@Q-vdgs`SWo0V3`&*MMY?$-&fHuzp#WuP=OEm?C`xv{m5@F zvlprQkFigfkF@bqEcAPRX8cThVg zIq-yvJ~KROK)@-KW=OQCUCpO%;*!%-ZU$50H2%U0~>TGaYzr@xq-^*F+ zk6gS2jtT7Hr~We3fF8<$Ez<~&xn7NmEw`3m`nIb3O%bKvy`mKPCtdiiD`LhKsP9|) zuOhbI3cZ1ds}ueL-Kv7?$lB@-G)a0rx`?C}S6>=_{S+Rcrq6ufvZ=Ld>bcEiR`*lW zlbx*=x3#};pPW9c-S@Ut^7En;EC#||7uSG|dMxESBjZpPtoT)i@a8NAwQpXPFIzab zsR3T_iI(zE+2m@ZO=YCbAG)k66Fm`T4R@QBMod=L2eB8}$v|0Z-0gY6AV8hDXzoWgSs=h-wKN3z$W!dxL*P7V=~hY;+^qjwtd!PVyj zjW~nhrc@Sv<0N6=E>?NPVsV=b7@7WhguYPJ07u?Qe%&XYK3XPoH#fK(RgRAOV$L3H zYo=1srFGsjoqmc^XfF2_ic{K+@KhOm#k^Z0_=vGv*E-)pOApRsqBwM>x0vg*mf1=` z5oLAJ&k@8!l#iR}#j*%^T0D0j27P1h$EO@fe0}&<~A?1~7aS+mi8yY+%6I3n|47PA8*^vZ}ZTEQZ zw96fJh8hiknL8jr{yaq%F zcOFpw)?%lEdmAo!`t?Gz;KBWUkRQB3w1c4^v>UOFO*l1p8-7jP&zq3I$Bk{E55iyy z4Ot7$Zp1**MUQQni8mz@%NDWj_^HZX_qUM0E4+c4YI*1{ARp$fg*>W27QsOUeBgX^ zja)pBJ)n4ugKEJmj!57Vhg@2~|H%i*0kxgT+zxv1GnaM7KRI4SUY-yG>?GQq0A_x& zj|`aq1zBEkoxo!N>=F|2G?#$U&!{)QV#{*x?v32E$G;{EI>8*FKn;T9`M+`e;TZ8B z(VY;7VxJ#8D3eTA*MZNIIFLQZTeCf{E^Mqut!IcH;wVF2R`acJJuWongWOZePm0a2@P75r0(U9YqrIn!;ygF8g6kA- zkqJ4_h~7=F^F{`|!5TrXit|>pS?fawC$%?)fMyfRA--zjsYW@}9Olg-UvKkbZ_C6C zu2rDPx&3G%y7#33un0kEp{%s2c{n(nS9uq5sRza#dQN{4e#7b&4_f#o!63-+WsX|Q8SEwO6SKi84Guh#lgM4vZYwKIoo7QNwbFwGUf8?3rN)h8-IA!LVb) zz8t1WTn+z>iI;|bo}@}PCZ{JCDgR27Z%JO1ye9dD9JHVj=o^vR(g4m~yWr=jK)_~%XuOG!`3PMMr?kNCGHg{D0AfBfrAc`oI% zl=CU7)WB3*YGkTCbx>+vYH8|Ceg4f&tx2s*y_&kvu^j&0>F9F&>`)C0yYAoL6C?hf z===9@VrSy+#ID2_6AvZ6OQTM@hN-8-)1s5E)tUEiJXUjMr@Q^CJ@kcbE0_bx@j>>f zal7N0TgJD$5_xpg!R*&glCbT5I=0P}KnE1dS{gA*qYpR%{utE!wJT3QJ84VN?4-)9 zN&u?-+7%VLf6%rLJN&p8f2_6dr)$0j_l}$tO{BZ?G;`@V#eN=VKd<7?o&E6VcJ!mE z+!nm&eM~8#TNx4CHgTtrRl+yqCsz3~s~o^8-++}nf6h8{`AG<8Xy17G(82!Qzpd_( zcBaDjBi+C6yvYP#b_U}Q9sF3m@$$A{`omdQIJKT}C5GsIJ~F@!Eji<|X|)g>Q$-uj zxMHMa-X}?P;~Cdb+jqly0>GoCvh&Yw?TZ(Nt#}$dV{T8O@1Joct5Xu`l{2mZ>M@Bl z_N*%^ATH7VC>?j!HB{Z4NN+jo+U_1{e{qyOyl83C?bGbxmG+b*dsGtqR^e}ZsQAi$ zf0_vSX-W3~CE9<-um8gz058&yU+p}(@z|=)6Yyi@)ykbk_PdiFzX~2g@Ed*>vD6_b zVVUh0Ag}$0mF}yRohLS3*rtNY7kDN6r-={<^X?@0zjAx%3ib9hdqEQXzw=4RSq-0^ z8u$TmHuvK955GRED zv5i$}sQYzm7*&1c3JbwY-{d(ha~k7FrdmT^8PP9{I=^y7sx=yV<5#X2cYttkyF0bQ zGup${S5FB*M`<M_-p*PES?JHmBiLMz9cA+hq(GPwMPczeE}Dp;K3iMy*$Xq6Fx z8anVBS4K&gj#Vw0w4PNfnZz;L^csAAiLQY>NJ~PE2cB{Tv0U~jlhct<2-#9F??7;W zq}$%GhN%r2`rI4VG+ijq4>M|L~gs?NeoM_V=YhHqV2YMX|x z{1zrI_&DzQ)-_fguAx7C>l)*ZfQ}wgbE)RX?V?ZAw&=R zc~Q3^th0xggPgMRi=EdBSF~TN9CR%-xS(zeD}163i%@8{aLEOMx9&Z@O?~wEsy)XK z9lCgYgT`)5E>b1K%(%X2x3>rbu7(=-9%m>w9p7^tk!}QOIFZj&B4?y}w~Pc?(RUfd9q<`r>(4_;@G}$BOT>Y8T<>Ej!7k^WoxeAmgZ6caylhC?`dO7zN zN2L&Mst|=?2)D3#9}Wz~XXZj>1**8qO?ZMMZe1#S#)cf)l`swQ!Y1B)GdmE36(auDoXS zY}Gx)Fj{41hfPsaf{QFrm+89~Tw!jAmjyRg3X4GDc&K8`<;Fx_1K19BvdAzZ%o*HO z;iC!gOf=^ER|Y_>3n;P3Xvu`bszNVx$pj>Eq9CzAkm!bLnuVi zrv4~iO~dU2;Cmk;LrNb&Xfu2w@?o!dVg_(U@P9D^J_rgWa6|+$V~ff$cNEH?^c=pAI^7eFIC{#C|73mytY0*?eHSSNsDab!M;)zKXR zZ^t=&CJ6&y1aUKhHm>O?E44M?dCxi1oh8&7Z!@?fzai-6R)6by0S#X#H@VPw^{sMW zul)|2KyL$I6B#57Tn+xB2`zXV5D8ojum`n2KthjE;P8SDMExT7?ufjE%}#D|*Ys`o zM_;>_p|%NJ4!H5d%bOOQ4~QPZ#d(qb%8|zWCU^n2#x;G|@wp#p|3I|pgHY-gK^wpt;H<2`aGKU7>Wah4v=w=D72h7tcq@OQ; z4H;qRFKqWBuBrsmjmN$~alfnMwc_+x%R4r-YLsks2jN6w2XhubE-HkZ=mGBfB}5C3 z3B(YJ6KA=%6OBgyB#NO4fP%m?fxXCpiKDeZ2E>qq*`vs11~J-zGL%auzc|?pVIqeK zG%<$zClN8YC=dyp6Ob`Ol;2c^Ksw-^z)ehSWs_p~Rk$(M9|~|72l&H5hTabJGxlN5 zf=dFC;#4%{J6Dc6QbQZQbB$0(Y3M(`b7iQa>Bo>%#n7PdU0JGFDt`}Z-T*r9d)H`{ zoj&%x%b^-byT5l0*2SR?1h2}6#cjUqidV(cL6=?QRfA~FWmloPF@ZjF8Ez69GwJJ> zT@_(6JWXQILx#nzO!73Qdm1x5P?++QYnUpL&iM&$t&-^7_$!${`4hAju?O zI_PItqAG82>!%(+)p>g5x%Ts&r^4&i?WZ6L{AmU2x5!@SH*eBOZ6+I@D0Q03L09(u z>3T6D-w?y6s<nEJ(c zsp@a4|7{MF!)U*C`QL87X}FY94fY>TeWRzXuD;c?pmrI?>4Gq%`a!T#;YDQ@kp^Rc z(`CewNbTWr>X>96P!p`YeEm))K|=r-Zz_hTlhC1@*g|d-Bf3XIT zgd*HW!Iwvy2W7^5(aj==43S(I5*c3c%UA%`UkGk8p*IZN`sgRZLY$7bfleY7aIY|Z zq1Xl>>ju8LNRxPfXp5k!@X3Up{7<;eR?K65N+qJO6bd7!(8@?T!d=G80?Sz$Y)2J* z=dev>I|q3Av-p+bNc~AC8S@N z+cXzj#CHVHBJ@KhF<1BL2dM@E+Jk41wifE^=i%1BtRo&mEYI%?S|>p30n~U)?{Xq7 z;N31Yh(8VBUdXi&?^PR*h%Ge<54`5yr7%07Reg&f0LHAfcLOkHQk!UEF>k_r>-9KT zJZzL&{W3BRXG;fg4Ix6972JGVU+~*SFW$j>QMywMmYY^a%hnrKKn=9>fkQsC^P&5T zSN@3hZtSv^NG9*y_C6HrJG>G_AB&a;n526}d#ibS5o>8rv>fhU$J>$C3o`EGWau{F z2;xf*X(P|kZ^E2~E_mzVjhPYn0A|5+59vV;6S$exnolIkGo&pngBZYb9o1lnyTbyk z|4p>|_b}1yLmWQlVT1=y2d)G>f*f-t;8EaM+Qxa%gV#CZ9E4?iAI{O~oW;ZSPD}IS z&>C|ZC`Xej-c=Yndx^C9pM9}B0k0-{quJRP&6B;*NKbM4bi0K1Mx>`XU$$qEFMQy# zDQ80IR1dh|XToVq8CK)>X>H{x_mL+9xL12;2Q4jg#TbC?Bji>-|y>$uD;}h z3pmP+G6l@f_oe{c&C7k!9PEWgdR277Yf2})E(Z4vWDAr=Hn?-% z^zro;@D+7PQAhh|c!#0fa0FZSX?Sn@Cs7f52Y`a!MIM%VcG%@mLv2fwgGeK|=^}0< z9r>$kplTGI@vF-T0dD{HE2tRR^u1qQdGOZQ_?s&U-Wreo&6S`UODlf^tzsNq^&5cX z&=-Dljn}d_lAF`y#2p!OfSX6fE)(ZAI4+i>zUe*YAvG1CwFOV*iXJ=422b-I`M~EX zcshq?CAyh-Y-ZO#v$#SWH5(OTzoShD`UNmx7N*pVTP>V0Z$#DbCazUVH}jy5+Dgo< z66egh-bOKsceQfP#K@$0*`=*T;CcM$A3Wb5xK3eCTMs}X5SBCxkG|yvGo2P#bA<}u zz$uPdsG=J#x}ws+v(PK8O;F7OZiP7Uy>fVWQ3=s6!aP{Gz$2iA9=+r;n_2->-^K#5 zcEGM_yH&OM61>`4!eiX&m$KiuqMDa+RoROV_tWL#%niMM8{i2Aw?c8QVK3RVcR;4; zPSo^KRls?O58lABP&s0GR2~?;mNtmY;Hhf!RDr`Agivy5NKq~wpC(U&2a0RbGCL*i#pTgI+aYHOqVAbCJ22NpBu?#ahtQ`F{+7lY?hp;Dxfu4@=dBj z`dXGeOLYT{&6dZ(-*TISzl!MJvSp`gGCiIxC##BSztQlkgr<#_69P-Q=#H5}ZyGI+ zhIfTqM?;Nr`pIb7p{k($#=x(sbi^1r9bOgA9|HtVr~euQl+B>0$H-GuGwF!2@_5xO zx_B%!F`Mom3s~mROJn6M)s1xMILN$-E*u9O-Aw<9sY?3oI5{VT9pz%~LK%eTSZubY z-R&FKl{l{Le=)8dzHz;WkLxNN*L!{Ax`vPIS~0HceB-*l@3^98C9eK3t{ZS%H(occ zn{Zt3?=!9s`o?uL7fvHZR^Z_t_yV9-<|ekSy~zh1prDYsQ!*_UrqA!;#{eCgjFju>-m&6_N!>B*3U@{-+jR}c+ z2W*_E)|ubE9uoPX%7^LP?zN|~1 ziJm&fdTNJDR%=Mi=k(DZpu3LyX6hFpFZwS9q{qj| z#l9q5QuPj+Y5uV<1($nKVE(x;mS22W1S7xpMe|!PG}0e}kt+%#SA_syqq9cI(QYFA z46=z<1$X{>@ZgbJSoBZky0nocW6fkJBXv13MdEIxL?!L!#&w+t+5+zmou#{e#$ z{?ZiDr-~W8KmCXEw!0H;`?1^r>PV)|c5dUnMux z(r55mz@(JP`3@fL^;ZF968%Pdug)U{k-+(=-et&nw%~k>!ueRvdGt8sT%K|ts!!Yr zg%;<@I(Lq*6UJjFX9?D!YiF}Ur3}0FM$xr5DP4Or?^;`>dJ;{{kz*i^pqwKYs^-%B zazJmZrmy6H;#EU6<3W9^r4z@?IjVWIW4t^{oj;%2OXWOO9jz{v69UragD1(`f4ByO zKA*62Mf-P;pXfY^#za3Sl<2^_lWMN;8_L7Q^54~9)2u6zqqXdYoUSX8OC~AT*mmzV zww+&N+kMyAWOjmbWli|s{9xD9cAjX!1Sy$Bb<5?UvCu({Z61gKTjv3T+u~YJBb>VG zx$2s73w>+6JTzp1P>#pMwI_K}H>d_7Kky21S7t&8lUzJz-tPg5hR z@zo0)WNZtC$J=96t@O?!=)pGnN|BtYT1!pShrVL8T3R zymcFKDq%|n@kmZKsZS}$SVxkOy8X-$A(hj?+6aAX&!LiWbVSotpfOO z95~|dbU=X|u6l^3A2FM&C2-PYiqj*!*zzbg&LcFeVYijwO}Pyx?qe`5(3F}*bpJrn zuYq~01s6>sflnqg#_fQFQ8;BPF0a-nSVP04ojin^9=tNW2Hd9iZXA#El2?{!6;$O}P1`kZORpR3h?S23a>|#^QL$uF9 zO7}c+f%;k40oqt7+XBJGl5v=^W1g%YM6@pgl=&qwQ-!%2W@^yOVgXHzql@Zfs~*Qh z3*M5%`Z_&YC|kz70V~O}Di1Ng+1L5LkoVAMEAb3sC>Z38GIs9$S}-?^pVK= z7_%_Y##ADS5NSc5VqQKAw&8V-G#q1aO1uqll4Q%D5Ypp9NWTz*^(Dt1^%XTtk|X64 zzTrCwl<7|a&D@}^1*b`(`&yy&46kT9i_Kx|j!i-yt^Z>pWtP4XO?=BCA^h2nTVTsU za30zN{3Y3eRDTX}u;?Drc>#O@v-pXdNI&pQLl0)cTNZfv4#7F3ivso%&t_3Rq#s4* zWs!-2KEP{|H}tc55=2@k$6z1QF9Psa1Oyi(hVnN7_&a8@kRQ??JS*f+%o0&Qh;)VL z>aH?Ci2EU3<2hkO18^+#$6Ei6S3wj%JgB)LKpLCU8ouI01|U3-46?>w#Udsx5B#S* z5F>hTxHQX+*I27$wkQtdVzY>;R=>X;qDE z9&LeOj;w?I8-u`(Lck@sM`dh5j7K&=g9M%g4V_sdM^Av8Qz7CO25p3V43i%I3^q2<|9sSFpu6c#BcP5CsqB;&liRp<`@m ztfIvTm#o4R2Hgq|$2mT?DO15GLd!_QIntmJh?K{J!7z^gvI$`vnQTJnMn-KmuVNa_ zdJrPUc;~ip43BAt5)0XIhdmbL%RCO@Fp`X0<}wco76hWhCw~fLWG({n=rT;sl|3jl z&)ZDKT6W3iQaW0aAvzyeGp!RvmcJZn3!rVOkjL-S-T(>R)JYhW6Rw+xt*FlsfxPG^ z!yw`74NwM)fk3Z6NlxI=W zcN)B{gA+RjJcWo8=leih;1Jp$pcP|}cc|LkFdWrbjDL91w8Q-`tZLGqqLC}u$W>PAE-HfObJzOdAOV~qbpX4tGid_& z)b+6(z#;Vguw)rNqtf;d0D+JK_<9f+z-NUnfNdfseE$nHlPy48d3m43n!@@p z5D@?>l^gC`Be7-_M@pnQ{BmZ%jRa!rum{$YOY=a9X0Hz72My0(c?0Md#+&%<3<991 zDf^4Zf^ew{FMyU2xb@{Lr_yOgxb?;LN2#TC!=*3&WeQ#aE`9l4<|W$*cfa1}i>w)` zPF$eXd&z?r5gE*m3nPFxzt}R~{NistyZB|jiMPFMm1^b)tcwsqDShyE*?@mwf)T7- z^m^Mjz&$T6*<4YCzo{Ysm-HcYsXrhHn;x!ug5E;YKtoezxcwFTig52B65Iu|Cfh}m9qf<8mx36< zodyhGuhE1T;`iWHoG%oXp{DmzUkeii)sT5&m6|VBsXDg4uwYqm#N&d0i-1|cVPYE? zj0h3HUf;!+&z$V2a6s4qczOuysT)`P$&P9H@E7cOC3_QA@&*|2uf+0*Ws!zexQ`DG zi&&Uz5ERroU~8kHLy8B+!@c^RA9Wzkx69c+s|z9$W(6cAEgF<$iz=E|54MK(>hG0Uu9Z z#Z3Dk0Gl@R{#06kD}OEz`YmD)$$)ruoDLt5{%_c4+!yulK(^%}7K(Z%^nhp*6i~;^b#j4=+<^kegSV~e z_2}CAPaqNeo|rsBAUEc)VA(0q`pd(ULLQzH@~{hev4IFL<5cFR_lR z^6lxIzGA`1V604H1=xipnXxa#Sid4TtW+32T{28aD8zX590L4O|FCmOr9& zfha>D%H)U!3`azHauh^2R4{?#xOW0cBgs~J@TYK#J2o33Sr9-5=w*0<6GJD4jZs>~ z0@znkQz91dAQZ%4HfktD8ZSrz2SO$&PELwF4;$b?1=*<$IaF}RNtwH!jJVgxrltfFK{_laTJz=tVjBU9+Sa}U-~3__Hiwlc32 z0<~@eS1MGhusVVe?fsx;4|qVS!^9WDHDIMos5H6oE)uy}DOSX*6#k?doR6rF8lGeH z`tJ>LI#*UeyksMI@bxA*@*(c)h+$=Wm4rV^A8nVzhJf>4uY75{kVx>?V-oqen5><2 z%N=s8d&hO~q2Q6nwhp22Vc6GR2rd5-0E6U_EAh5)c{7Xg+6yT3>FcmO1AQmDj-NPo zb27BXJKYacGExk=1P1TL&f4QY-ad3?3a}tZa{v@Uy zfCn%;RKOGPKupBJ*$mFn`ay6+gxr}mTci!o>CM9K@b%yn~;!@LL{LoT(KN!f}(=G z_kvxIz4u1P-h1yI^_yE}O9;Dvd@v06o;@>jX3osb=Kgvmau+(@%b0proj&Hh0SMO0?cu)Vl-QS$I zk=X1#pz8?#^|%ZCeQxlbq$`$_1c?0@g6vtbjbjO2YUzhEr*yR`QVd-{vVp( z|J{a}QQFsQ_!h&x|6+0DQAW2B{Fl>fzg%Z{eGwk%eRz13cUQOlxvtmf;>)@p;QD61 z4BqWP^C1U$1>P(&YR^0G-zpmcYc`wEdH+XeDCYU<^-MHb#oxR%a znoO;ivD~TZ@0yw!KXaUH@qM4jPqnsRw`pSeij}KYuUWfp$+C)XLy?_!T3T^Z|MgB; z(ojiP8fwVoCL_ayG?ZVmGECXlx@o1=oFeITBwkr4q2(A2Eo-N(t)?6^iAXflXIOT6 zC!$bTX((+bVRXSVjun?m1&UtQn-*TfSkg{3lZr)RmDWtAgPHcW`p&I*@>!@}W#XAg zG#!{hX>34kO+nu@XB!bFFH2vnDiw)&0%Z&r+GoY4^89i7^l>G(A{}JY@TW2r+?p%d z-l<14t)$W!`d#Roxu1`wSTax-vqrMcxaNkIatx*N3`LQ1%eE8F1Sh%)BMVDT|Fi($@Zybw2Vs0euo+FbrTjjsX{hULZD#y) z+L2XkGb*he)9ZyRSQ%N}92#kmf2Uh&Do7OL3)|zye{ldtQUqXbhha;0&{-|&3hkKi z?_j1N`!UUn)j3J&PB|;PiNU1Jq8(K}TN@iody|Z@>coPfrsS^htUtC@+0sT5(RiLK zlXB(F7EQ0O0qcqEw5)b@j<@Zieo7xKJxcB)5krR!@GqI%Ex0!X+yH~s*$u891^sXO zinE37ZZ|W#My)B6QakRVI!yhdNZ6oDZ82POIuA{6^w>ycB5|vMn=A1MkJS?W;@ses z3#48;lUTsE*JYiQ3=r8_wiCs*3FBv-OV%*1v4Ww)H|1WADz>vv49 zWbL&!l=Ji?X1C}jwN%^Z1lCMxSE5PwvYdYW{6tUrC2OOZUvsK$s-85ly>H#ES5-bx zvF%Lrz3$P&hK=d6*({2~N6xP7vZJ$f>ezu1XLiWbu36}bVQzJ7$dkG7|Go8bq3VIt z8rp}q@D|y5-Zi~W2nBDjUf|XAl#uzM3Nk8-O$9#?pA!n+V;x*FH)I~y<}T?yKU6=s z#qm^w=KGcxgaR2N_cnfSc3~*@QfvS7doK#v_guR-#`u*kfzEC~(B69Qej6cyMTE|Xn15gjNxNOUjJy+sF$4iVi) zbg1Ys(S1dSi;fW8PjsZ{DAD~zM~faHdZ6e*qGLo47Cl7tP|?Fg4;MW`bgXDrv|6-A zbew3dXr1VI(R$Ga(FvlBqD`XBqAj8mMO#IW6rCj6CfY7KS#*l%RMBao(?w^99wmCT z=uFXBqK@b>qO(Ph6+KS$c+nF?Mf60`Iihn#=ZVf2T_Adr=t9v&q9==WQG(KAKQ5j_Z=yRgai@qTG zqUcMaFN?k+`l{$_qOXg-A^N81TcU4^z9ags=zF5?i+&*bq3B1VAB%n>`l;w=qMwU? zA^N50SE65wek1y==y#&ui~b<`qv%hf>qUPS{bin3EYu3v1VYdiy1{SYw-AO+VKe9s zn?n!S0=9&$peOW#-mo=n1KYxOus!?^eh)jqAK;JhC-^f&U`N;q{sMo6zro+(AMj83 z7yKLk1OJ6S&=+=wN{B)X;*fwUNJ0wIkb!>iKiCC!h23Cx_&@9cdqRI000UtV>;-$n zU>E}Xz)%P-+4oARP$U-&Lz&NOdIv5Z2 z&;S#l5t^VGT3{ly!jUiu+MpdK!xWeb(_lKxfTQ4OmGG>97Qr!WnQToCRmYIdCqV2j{~Da3Nd-7sDlRDO?7Z z!xeBPTm@IdHE=B~gX`dWxB+g2o8V@+1#X4gK;d?{1MY;o;BL4F?uGl{es};Lgoof^ zcmy7W$KY{z0-l7Y;AwaUo`vPG0#?E*SPg4nEv$p*;CXlfUWAw6Wq1W%h1cM9cmv*q zx8QAf2i}GE;C=W2K7^0pWB3Fu)|MSllcAk0WnP+C6xt{sX z(Dvs)#y0ruIv*5tYsvt_#tT8$!IvSHjU%=5gKkVo(QSNIixj72<6qij_%hJ4F{M`` zd`Sp^yrzv z^^bQ}%vEOutL~)twW`xhp?gntt$pFl3(+siFW&Rw<`45(~ z?L4TutaZHA*>-;Wvdfyn4*K+)8fSk9f44j6@W>-Saq8Yfz+Cug=g#ZDIa1z{?wEY; z$n%bfO>b%XsDi2EEltAc*SgjRtqA+oUg79>VQEmiw!?%>lB0F+uEmA&Ui{tLA@AK) z-)3}}_U@|bNM955+WM|F+SeQr^p3YQ6MF@B?I4cj^ypifC~G&(zGFJ{?fmC0jZ?Dr zP_1w0p~6q8>xd@d=CMmjyQ*W*3md!E6HsL(=mNQ>Y_17v@3l=^N7{RL^l>zvJKF1r zZAIA6j@(X%;oDuhrRsLgNyn_tT6;y|>)$~EMFAcdwRca@WqSv~YGV5QXVl(xnl+>L zI^Lr19nplV>gZQTG%nR!H0h`&&-iJlW7WAsP@(v1YX)6+RAZ%Uj%wr~jAXB1k~Z7x zG*1eNFL$0lv^(f>P=Vpd&nK7gc!=75Orw@SPCEfTO zZw8RCvI1By{|?^{wf!WWbfkavdvXVPL8H3-^&x1c=npm1Jtg}b8}~W3?%R2!EAuOR z!9Qz`b?rRb^;IN%`=D#x;%)Zrk&Y$%9yrmptzEn9NX*kmF#6CDZB%B%iLR}e9k#Q( zrmkJ}!qWEkW!s{((V3Tx+oB-t@vd#r@aw}ad&5Uv)lt>amyUHE(O&wX>+*m>A9bbb zE*;0N1?@3e$pBtvdHu)VAoY z|A0j>m7o5&Yj@mudrj2(ILYz+zGNP*iC!NEq2FsAOK9Ooni$Ww`|NEO9k1?NcfMi= zDSUMwPt41EFzQJEXO4D#8GWP=EB8uPW<^oS;XUX0c3;~id&Q3WOqT7l`<}cU+d*c4 z%1h8j-ahiu zeZT9-RVWn%qWLc?|7CdkWY^A5yPkQ!t71n36SYf&f$?C{tGB(lW;@M1p-E7kqSv3$ zWP0B3df?-(2R`ZInen_>MO+^CAIKpA^yJ#E84L*_sj!^kGodR`vm!(@N+R8 zGI{K-vI~sX_;y(8DIOE`=!hF@g3yQZW8v#=FA$>PS&Zv zR-HecO!t4R8PWOM$C_qU=WQo7OM@++XgXB8Po-+soY3r;y5>X8){k~<|5Bsww0y0( zsI}}MYz#NDpP~43<@O60dr5OqWBID@dg;(^>8pP0r3!n8Znt#EwEe2a-f7VVjZvwB z=p=p6vld9hr8wR>w(A5AZ)>-Q1O;_k!h$ZT%%&a3airZ!V4QMv{Bvk`*LHJ|uG10| zbWvq7wSBjhT<9fT&N#o)k$z!MSlHF=aX}z|co5`nCL74koQRH~_4vzPF@A@7`^cc6 zO^>;>o%ZaY^Crs^wKZeg$8J8Nesk=KrP&qZH{0heD+$_Oq7B-#SJu*hnxh?_k*V;n zw6U?(F}bCtd1T*PON)!kZ*K;|5MN+cUBi%;TElfkBZtk-sIICSI%`;E<%r?Ks)wgl zXAVstQC%}DGc&zvc2?HNH28O2<-D2}M^WSAniijg+QxY`LvC&eBnhFO>x$C<-(u7M zf5l!`H1z*1btp*n{C{bCT~WsWTWrSvRoUx`hV@LIdu<&K`@g3D-*rgSW~yWMPSF<5 zf;G!teO0E?xu8P?!54HFKeA{ z%dDFDUgvNU*Ng6t=p7s1TfL>OVG+?w>MgUHE4|KP#1O1@4yX0imEOcu5~pKq*Xuc( zIYhmss%eoovCLUA)#)xMC3*uSY^XtzHlx}(f+b9zQBu;{JTzs{Vj_iM%EiQBf|T=` zyopI8lZf67iBOMB5@+FhScM)op~nbf2v<8Z6+I#t+f8=PW{nKgqinofSV;6yLX%8l zi%~nXuF)ixYZ4kKG|6-3m6DJ?LX|Wqtb=8e5HEB|5V~ZM&_uN}Ep?NxQu;E!0sTQx zeHD?C)LWWcTZojb9`IWK!6Y(8T{6`@%~@Jg)!1B}KCX0G{a$~4DG8kqKGQqcsE!{_+inQzqfQ(_zkIoO zf+dp_I$dRX1qB^4%vdrD+IHPY{@R0UY6%7EJW%QqR%B;W>vL#og;|JO%HD9mF2h&6D{^8rg@2F z0vEtrHVs=gY9cK%McR97i^vudQB04X(uVgb0U_A1Ly1&Mwp7=EWt9P`sov{MCsC7W zsx>CkI0f=9nOrtLx4@f9tW)XytC5z3X*`2O*;zKdh)C1PmX?|-qMJdWC9!rRX41-G z(c#%Q2)@3VsU+k^;A*Y(rh+>9n;;*w;51^bB+d+00r_?HHM|BAXR&B{X5r$PG;1{x zmg;8+sS&DYWf9{X(6G=w-BsXCA2ys=Yw05!dt2z~X;OGx?t{4l|?G26Is@lqCV!I_k#JHN)JS18d(xX@6EuO`McdfpuLzm{YHrEf%Bi1Fp z(zLr~H8!`t7UU$>+kAX!g0GB(+^*zBj2^D`tdhzFEj7f@Mz+*6HhUBM&Yn$-US888 z&Uzc% z-m$qGAr&^NFO~IPvgPKMW-sqI&f*feh=kq;_LjPdw+#uUywqI%{#$75f!_T*_k$cX z->D!-SVQQ)xB{Hf@?e1C`OsQrME?*Jo%b$VN4IQCN(+k0iS-eTukz`_>QmZE*tlYQ z46T(7o)ZfToTFtYnvi~*sLU*4d%T;(yu#u#nOL6yA`G~qbWCFWlk~3xy&cg{VW-0G zB|Xivkaltd&VPnxzR_DYJS&Pg-9=({(LuJzXw`1|$cFH6&mLdlXDoFsSmbS8+*Cs> z&jpsZxT&UrNY4ww|K@^Y_KM-j$;!I|N2kKNhMJ-U^GHaiCnXC$3$d*VMY$TMzko$C9Z1jFp}_*xS-a z|2i^$lqYjMV8(7y>xIHaVLm_zjB!QRoHw}~^I1{e)1P0{3uB;+07 zWj#8JnE%5i&MIlHYiM=V*AxAFBD6vY>5J4sc0C5tEIQ($5xNhR7- zpg{O%kZ0N^Uw;s0Z2ml;Axjp3-AZ5ZcGRARMAkFJIh3}vF7f6rZmr>+)OrrbS}cp7 zX8W>7DQKU+?Aqk7L@{83`EQRx=+9#zs&M&X`vjN23*^)nb;Nu`9oh3%JQMm7EK?S)XUGLbyl?%jHnEuwo^g=Yn`+i4vA4 zLi8jhST-5iOO>!(mIv%*N;n^C&RDJl$CV|FBgV-}xD=zOD8b1Pl%{ec&`(osak?i@ zoH(86ro-3bQdpjc%uu<@oMq*%((=xPhM>>UB^|ZwNbhAwq-95fmmSgVJ)&>f9Arru zW?R0nHUvI~&V{w1xpT+GPFBI7jB{lf405vDnO|I5QdI7oQ`0(~#DWUAqT$182CS0r z%B!uZn(LkD9!B(2#YmO~`+)7oL*Ijuq`C%{_%p=dGK@seq|sZAQNwRku_fFDC#UJ~ok+7(TbgPYk(g>acdIda&TI(QR}yIsr~+e|u2vcK>O`-& zS;aPTtlO8>w6s7cCFZ%1C1^guncrMfgLz8zoZT=_HNXqQ;}lo9Or!=*jBBJ9w;E$r z^XZxQLoMme-E9Nw@M^V9G*8;7m*mxA7WglJ&P^wZQzEK@1+u5f(L=qur~5*&Ex4 zr7fyi)QTfHS@xK5?_*($o(uC1Ab0m4u6yb4bDjd`URW{JwDq^Jd_qR_9~DOaf#V!i zN|dyGyMHZ*@ww%XQ_+@$J zvv&AIc2+(cl^qwhKbY)FjqaS7nyc{)!GamYbU)9B$KnFwUz{D9-Sj{p>%g>nVt7c{1g;@< z9V%FuGG!kLR2F*{v25jO1N7HFDils9;oEouumI=emS%TuS>2KvB5mgy$3CutHQ)Dd zG~1_!Kf%RxXVmWiN!a5uiTx?;r&VZ6eo0Ua-A>R2$SoUJMx_60AUyHZP4b|Sp*WFsOd;(q(}d`-EV-8X1;?-2R}z{0lzwu9Jb0#$-4HoPg!fw{Nd0%o*^VZ?M8&2-S>Wi4~- zn!E`kVYGcmSn0dMO5f{YrS#9E?nuq(V=Ahu%o#cK171&&$GM3Lr&7t(Wnw%C`v^-8 zF1gh9BG*Kj*gjU#_=+4${3n<*Xm&DCvrk1y(@ETC)YKFm8~-`7ft%(FQNT1}IOD5x zbO4@ZY&V|cY_=~!n&JQ~ag~)#brbzpqP*$E_Ft^}9+e}V7pi;{sLHoOl?)Phfva*+ zsB%fD0>k5FUtOarR~XyatDMdJL!c^?3qX$_g&r9s^5<)Z#5<8E?iVH`;Ww^QMW6=;4=;G9>mo-N(YmV959Q)R{ z{p{s(Svj~##) zpZ@Skf=@DhQs6THJ_F%12tI@10F zqu?{T^TNzA)|BmgW%c$IV-|T})#uJFBvKuBY3grQPnhZ~D;Ni!xw)KVs7DekWPueN zV1lm!iQ|h4VR_rgNufZ)*bt1b|3 z)mu12)Iv24TOiv#i_~lan^EGbu5LzOoPIGj4mv7{WeI+T3ACxKwX$k1j(*l#d+@`E zq`ghOg;;MFyo#h0V!DGf`_hwePfw+M*ork^a3<2>!) zPUcG!+j2E-_zDZrg`|{Xg&?|!^==_uiA^E;l}faJl~UgD)z@%>D#2^j12(fY%{p|1 zvrW@_EmLQ&I{T@U9y54b(Tkiov|Tt1L#H!GO^K_tOfDs1Geo@X%tLo<*!4lou0N*T=3O?NO3B^<7()_~Wsl;-lLM|$vI=-M#o=r^Ptre_A#jr3W zVHE*{f_wr#TpvTO%bj07y+kHv@ZpL?`IC#>GH_KXl*vW%v=VfTN!8rtlvqPMKFdxB zp3Q^(=g@aP%kHPDrB^=7wv4ZXgsyVf=`?!XHMi7N)g+MUn+45X*D}{TwYjdfW^hS! zW2-ZP*yjdDl`X7mt*Wi5P9Tx>wD9w6yM3OBE@-%=vc9g`TT3zgpiXXRSTtl;Knql5r%p_7?@H#Vo zU)}g3qHd?}evutna7RF9yxyY05zUfd{;rY&JfK)Guco0jfkc5*nngjol`W{M^+E$x z!OA>=M0lz5bawb)@JurXx#1Rn{e<5os6Hif3t*EKv6Rj~oo&mGY!|V3F6u34Xa#@# zf+omKTE@#94UTIjG;dzDw`_3(c$&O2`s@=(%nEw?bar&=-GYM+JHE(BaA~u2oLYQK zP4n#f#)Szab`>3XCOam6wTK7XE%#2XYprdBN`>wK9BWwAed}%sSKHUpwlmognc(GS z(k6qyd^VWMf`%&e8zc}LxVuG6%_3-h=mwztdeLAT==+dbwUN&Mu$R2-Z1(oEWACu@ z%|zHh97zHe4}+UU)#&0!R4EkI#*rk$qH$79C z6Haff%+U>()qG{0&!ySNsoBap5jLxGSy@4Gk&`Wlr18K9jzMh!jQIVpLjlp$@L5Z+ zI(`BM9I8S_^Wdbfod`_2A~@@V)#D-}74vGalqhq6?^shmNmNEA(UwA@&@weYEaBUM za){;I0qtan4V!{TnXva<=JJk#O|>*t4O>r`GNy?tn68$%pKXSk&fjXZ8uZsIrS5+N zDi}j=crR2^_rEcq1hF?!Q&moky@JmH-0uk6T&{I&HO5A`v0$c}Ko;DX%;8M>I$ktr zE#uAjb&>CML_b$4L)1LlQI!+frx7d0&w?A2Ccy+Y(M&(C%8Avsq5;s$)j1Is<1Jjc zP^`~F^%m;L)JH_(Ld?V_?Mjgy$m#=AH;XPojU||&n`&YC3KKG$+u1IsO)VDo7MN^% ztTGKS@A^-e?-K2kL89B~rRto>DE%@Z;SwH}l`GU@2@mCtz8mACf?-m{HnFY2Rh`wf zR!HLwdXEqX#|7&Hv)LfZKb+|AwE7Su30#%xUjYO8rBMCQ=8NZFnR=Bl}j=X#4COwa%5B=Qil%{Bh&= zKAHNnYWvMOLH%p|8+|UH=pIFN*b?C}u7qP7bvESmN!aes=?R`w=#Icj34f9{HssiD zcv|$toe&A@HsdqAC-Pk^F+Lk$dP9kR7f3}5fklqKQ_(NFLnTZttls_YM_QK zvVFT`VjP6>e2qo)gFzmSa9PCU42;2M9HQ|pI#YR8)-;|K0*=J!Orp~1*!ek;Lx*bk znl7~+M+IYs62wu!It+s7u11tn!csP(M-8W|AYsf15fzAIO1Kj-DRG(fwfQ-*sx12X z{G0^Im+Ri<9Cet7S^9_Eylfxw?&fNOGs|k>_pzMlX>3IQv0^#KlYvG{^q)cuAL&h} z0%LG+{7h+9-51!b=z5xLJgwg19AD;zlmFbjJR+SDs+{GjfcuW?QHZCg=eP;zzeLl- zX_{ER!mqH`VH;6aA(8)8(@C3hB8=z72!uX}h;P)?+mvIq+rAA{Z>F8I|gBETd?kbrI%OE0+J(_#~-2Df$@FE(wmmK5>+{!XVlt0cpxx)?+Vw- z{?;>&V6xf>u(Mtk^5;23=mYHRp=VsPEK<|_=9XJ-fBfZ*s*qndJ?NHb@S40|RAkv3 zuI+E+zSL=H%e#nzEX(f9+k2-wZn)-&?Yn^Yi%l=M>EeH$}^ruFU>ot(*oVOfYYU~E7*#Px*L{5?4-Duef8=Ckq`4oo+zI0Ah=kq0k9eHf&SL zfXx^jUr>hUF1T1BwrRBF6}L5Jy24rHns8Th-JIH1ZzXJ%7Lw>0wCxpll;?VKopXXb zeQI&3yNoG@?jaBxCVUDQECo1GnD8b*xNNEm!orP!ULtTU5TkG*K)AHHTyY>ka2|>a z6%GUl&nYFL!gVlVs>fM6hZuz40MimKpVdHEiT()2q!-iqufqUYD zdSa|qV%>GO5F`2(L~LUOyApCci4na6JkAYG6^fn#9t7;B37r8v#IZ1DZ+8OJ1iAw_3j;2YFb}!{ zgv7}c!K{`lVdi8qp)){aQ9K!;S<4hcxm*gB=PD#dbO>-JFl7?9LJ7(fp~srh8^EK{ zDU}D-iJkyP@i@`)34+@M3t%F0!Je(?4B&~_=!Je&GkO7hv{IKF(gF6(PeC7T7`g=n z4?1Yg=nUXt;hhazuTaJpd%!nq*`N@7j#=YIg)|<#vZi~LAaltQ^L+{-UoOuZKb4p_ zDU`DE;!+tXRG~1QTw>m=P#8}xiSTSuNQ{X!3#7eYAwx0C!EI>zmqN*#2tA&JJ)jWs z3jpwIdQb_=r7nQHnIBRJxrMHx3D7YfRw(1;QkfV#h{snsB`(;6KBB|}5Ee!e>sE!( zkXJmh1e}$`^r%9cG`SegcFm6|1n||2lgmlOHiZIiNgU^4<}D-P+ZFPZ;yhRG?Bi_UahJPyzo&sXptAq+=7qo0>r$PYNZ&;TSk_(|( zO)vPvMQ&g)y{Hg!<#8|^n)WFK=&=Qb#Qc&%D3wcO7ZmAbLGes=G9NTS=%6S9wDd$k z>=5ZyK5N@wgE=a%WF1E5l{o!%wVx*en!m1IS7@TH4k!dsS8pf;s4Gv{K_$p53s8n4 zBT-pzDFmpiLrOr@)nSEzb@jFq;&t_oKg{duU4_8w%47PELJ^e(;6$N-ud?1(D59>8 zC5g&|EPamgS~GrtD=#$u4d@539QOsCrR8O7`M!$`=!Gb#_>btBPpy4C;U@r` z$Fa1o^v0HH&IvfPhkh)m2!12hPY}Q-py~pl7IKmd*qH5>b0?1@)=v?E*Wz1XVP?eo zSvN$it8^UDKEH;~Lu{u(cp*c2qg}%h*9_f zgj*2XhxkJ5*lV-P3S}8!@rZ3KbYsb8xoc)Em_zj8kQ>J@huiV|nQlAm4)a)}@Z87Brcz1&4CL&R4+`Q)XDO$8D(C|!PIoXulSV?qN;X-?^TN9Cne%u*Aw)1&%?n_I9 z+X>@*I0(3%pdSw@(Swvh^nfb#onuc>(&(XwvkN!z6IJxtjOac=#RyEQj2dHc0!ol0 z!{NFOVsG%e4Uo{b(ntuP{+L@aE0sh{McayhHOJxrlpiZJI@Hb6x$!19;n2WN%V*F@ zAGj@^nFzcPw#cEdAvXv`L7WL-cC23t_dT&ya8ndblFu#y=mCKzdX=e)RSN6g3~_6% z=E{i#Y=qX$R&YZ4IoNVIXGGP}OCPu+r``+#{FjF2qPXsJf^nWG7{5VeYk;EFR4v0T zwC|J&8?IERGG21LI^DRRVZ^h#&AEyBjIcVHS>?FB=8cYUlLy8m6bCB6;V8G5Zf4|ZvQ zbYuOt(22NkSlFa2r9ZvvP7VREn`qRS<@DLE@aT{g0o6fsO2^tf)>V+&f8j%(Cg%~| z8ecU^eyAH%xiTy`S!0B)6Vj&g3r`4m6VtM^U_aXe&Kn-+aR; zAl}f-!01^w2LJ=K-+}qaKN#p(QE2whhlM0DmC>Kw++YBwDrsS!dmg%*r6l+DPi+ zHW~dQc2O~I<0Jy}e%a!A^o#f1TF*X_$uMGk8NR|`HKU{)@80NNfgldIFnqiQUvGh< zm7&D;dO!pE04CBKJR`uWF^m?g&q%*EX1|S#?ZE*yQ z{QrgT-D>DO5U{mIq?4p?>0L+N{XG{zblN7g%w)e~3|*DxOAwRJVqn98&cfaRhr?@+ zS5*GhFQDOAT7TogB^XdVi{Dli*C~HugCUUs7RMIizi=D3|Ei)l9e0PTexsGoTP&K0 z-&OR?wic_}_6MCGlw+A|`7@xGi&6bACB z0II2MZY5Dxx@YdI7gGzh=*XM}JaghkXfK>ctwPslIn3{YM z%`Hvu7AatZm>*Do;*O4WJiT%PmN5mqL@@N4Cx~jS_3eW6g-WEQ$QP;XYxKoRtaXwv z*1t2+1L_0o3M7XC+JntbwR}Nqoub@>4_DSzdVqY0smL~+UMY>V#OSWaLqXgsOEX19 z-5|{8MtbODcY^UIzny@YRM0aIjj?zt1@A1*+owv+HpP6&yOyoWpj#>Pb~RQ`!1Xt2 zwm4R<6>h{QFhX{b3aM%|>QgUoTUn)v|SIQj|H zb~9E4f-m{KXG=?9!@$x#j~Et+x?*sSh1jeNw7y8B2eCU^gNPYlsU#6y~uiC<6 zmv>LCU%|4#9HLgL>Ft&{yK$8uK{rk%w$(JgZmiY3R@Bx#ym>~hQ*YWIp6OZNU7Q(! zBYtJrzG)-qz{eBmKEy16TAP4`vl8sY0Y{?n!z73E7}0G}`r!RMxA1?d3mU3$!>~a) ztWP862h<)WNW|eL<-vf%>NGg4Ha+A^>C9Zkrih2R$j}ZoA7Ixqr_LiB%n&e|Spac@ z8{k0Fqga+IHZr58MY#@Qd(4-kZybbNrES89x6@BQgSFPX^y1a36 zQxn~OAlx+c6)Yt~$QWM}hM%+~2@>k}V+^cn0EKiw;LZBNwcmt;^xFgB@g6{IqRq@DY3>Mj60Wpji7Udivk?h)BRr zu-rZuGQZ$59jB@3V7P@2IPVToo#EfF!|!lS0qHlx_n32>SNA2(Htee9SDcdbwVHa~ zutm@v=iL#e#^%=Al$p&l8}O4rhW?jUUQD&qug<%p)aTVy^^H4L4JZo7H|_}aw`v-F z&=%?WPK{S7nd5O41Ez4C`IvriKhkl5MFJLj1B<#5<>GZJZ(=_;-2BM6$l^;%;as5{ z4&VXSGPCCTk8cZeRH_K6Gi)HF4&Zy*^XG=*p#lNcq{vIF={NMj{1LFpIvImw9oIS8%;H?91 zA9&Zm!$2=*b~A+rL=}`T*g*KimW8;InR{dKaOi&$@HxZb_=h zME1MSx}(F^_U%~afFF0`kJXN~^!c;yrLV2jX3>Ywxsy^2j#>S7Nnihbu z!?*5I7dY${haH!D!9#KC%nJJbId`m-#Lb{TwSMUy7~aQuISAUUV%wibv@a(*+n#}n zxNQKP{G~fZy#qjRUxJ}@^{0<~>5dM1xWB_jUxQTYi~Z@vFWp-`8IG5SIqZddlWv;= zIXRXk!T&p+bnH*s5r#iB@WZhn31VjB?`@|yT4w`>90>iHJzz=I^D5zr~_;Kv7fj7vh;HMm93=XA4h2NF0*4w zze$&LM=a~EKyY2iW_!ho-Ir2-J>*E~H+DpA@dO-{vLn0+Ub&%iRy|<2Bat11#*RyT-<;LchDw(sOi%0+@sZi z{CfR6_bByWYWmL)?rinnkl&B)Vd{U>^p+pp=_*2ZKv1QkU;OCKRH>=`C$~eTp;5pLza8FzKAnF|0^qV|E0LkX&6=TtH3kQstl~Qa*qy@lth)*U3o1qE>Ji9dRXVI9jmO~86nNK( z6Nvr;JfVZ-W;)RxhnKu0&xi0h3*xvx>h>av5sqrHI()EhIHTpOepnI1t2S^*OH3yN zQ$SWGIGXjRLBgrPR6x+eK`k+Tj<4!~SB(kx!22hrFHlDwZpQ5iygvh~!MQ9u03eh4k?Juk}e?S#=*pJ zQ7|#;CC(T2J>y$YFECruWlj&h;-{}75*)3vF7N|?nnwDObH)C|xLnhC8~>~vi)!I; zm000qHLzi^U+8~B8aQde!vSZkxP13D@}R|DqWuHX;p;QiHH(+Q%||?54HN+{DvU26 zc)W^cswd1`mn9A*78TeRF2w!Ph+d602SxxjssWn|3*zoqs2GO5(`tbTN2}=l20gF_ z5u&G;gokt~k%C26*P$%~N{W@UT<^E#5D;NCbT?pD&QQg^tw!#=_iF~_48uNPVlP0j za$2y*!*K`ie|nq0VBui-J<1g!@`rNSv0RZo$`ys>ioT{?vHo(!@p9?~_) z(_jGKBZ&d-qy*I#s!~N-OJn+p@=q?~`$lmQm5p?8o~n!sQW9tj`zd|0GCr8#U^Q@j zAo_t&HS~j@+=;5*^p~I9V^tCz@w2-?H#b9Aki{Z%1!CjK(eyMBSWGL-K5#eE&T-~HDw?j%(h?f0uYPi3NY zzrs{&rVsoI=`8f!U)`frRx14lL>nFT8_d7qbpCJdG+l(qEOj(J{hPZFedjl~US+2z zesiZ7YnmIKM2h6N8lT`7vG7VS~=zVGO*vLf8=+qUMn0Anx3))~=sag*cCd_P4UvyvBCn|Xt%-%bb z9qUgW+L;1Bcc^hj-8vrDoiMA?%jKF#n)*8wF^x|9-R;aMoX`*GeDNNHtQ9z6Z%yF* zdrq}qz-MCHFYdXp;neO6BCCDByT{pd19$yic*6h({J!c~lf3I-=`4w?~OBBC3J4`tz{ zkRgKz{bEu0;N-!|z^fagydjq=lugHH>Ts}09!js+36eF52$&gLX=qF=`$F8T>#ngUXxD91!z4)%toy_nE5|F(yFO8C=b(j*aC z3VKA9vFFgRc=$wS!1ZdWoU;c{X6!H&PvMmkK9yAp4Aks>EKw`^Y5u}b2f@Y}{M9mF z^z|fMv>Gwa42+_`{m~pxzxlU4R8vW|&`D=+wtCFfm<3J|kOfRtFuT-TQy0=~!tf&6 zIat@VV#b2iOx?AtHw)IeSoQVY1EeXBBMS{8KA02hb1h%6TJEG&z9${^AbF{R!LSW+-|oKvOSc$SviuVueOG_^;V zY@28uFIF8Q*#lcgx)TK8tZ*0nMrRo)ywqosMB9!vxD2&sl}$Ti;9UWDOS8w!503@- zO>LFPe>KlPaxHe;|7Az_@T{eELQ!#lShoQcMTot$k*lu17by&7FWpB9*ln`lO-KWz zy+k=v@Me|_&Jnh7f^0lN?+|Rr&M%ql1zht`0150C#or@}|C}iP^T=JcKsAf65CJjktA@Q;4V}Do z^j-dHc;VUtya-$YOCVy|cdh;}b<!|XB;4wG8~AXusvN4@+c+%^?~oDp%-5ak(O!Q7qM7lfTQZZ3!Bk>DTh+7??C8&!kp10&@bDkuGAq&!A7gbo`8zfx(-C|Iwi(SMJUQ&j2n3;Z>d29K8e1!wT3 z?WkdN#Atb>YB+5k4Jk&@UGO-sDwBSJzp`lP7dJ;)gY_BV#{*g4t*zE&Q!T*&{!bm()_Vtuz9o%LvH%|SUG!Bp&YA{X>j(9TVkj)phiyiSh`YG=Zx*sF22$$OFes6m~u;p*`6< z*l#IVpPp{@DS1VU-leqYQqiLAD*E7fIoh+#-=xd2Nmuxr^zLgLV`cY^9Weq}Ex>{- zYpzLRSqrTdFqEN^_xKalR?USMF2KzM4`=H)@YLXxLYP{hsSy3WLN8dR-Pb)1B;xyQ z%yKs?<=i65c|Y#s;Cd4ujS-_JCM9@?jp!c~QeiRzm|9QMd$?z50lyYl+O5|lu{?Th zX&>_^@<3_z+j%M|rSv#2xZw%kh7wRgrXAgj2gjvCNhtbL-Q%$6J4Mm2d6F$=Hx^x< zbPwVi*sF|X^!`4w&a=l~34m~eQ&1rvD&gPPlt|hOS;9)j)Y-jc1o3XTfHuD9FCP@o z^3pXTOfPp!>PaESSG%Q=_M@o9ME^QyCLBTsKr=+TAwo!h&`*C8>2GnJjECTPOaC2g z-C=Y9pdIMn;YvUq>jBKhR$x%G|ADWqmHs&a-g6d3hpK&_MJmHCR_#$ywZ{~z60f+0 zAIGZo-HU_G3M}J5#D~`uT{;013c$>?A7e#-!r}*_*Ht>no8AP7wQh!PITc9Q?v~Xa z_WYIfIafydLil7)a|1V?K~-kJZ9H~cLx0v^qI1`%WBSrRE3mOtdGZamNnc~l{ugqG z);4^DMaKS+nCbx+n^5+em8QLjVlD|~zZc40=E_>Gpt8<&Xp!&*?|162 zD%ObazWF?5KXKjh?yINV$?vpUe!eC*=@&Gl#U%V!KfhpyC57d;YZ8S1?t??JJ1Ktz zz~aQ6l;FPrfzAe#e|WQ(zyUwuXCA>SeB2B!FiHXz7py@7TyT_vIEPNl3Bb}zoQU@p zN8b|X=o3tHs^z#aT>$FD3-32GR1mHBEHWex|M)~G%3+86%>M+K8Ghn#Gt&4P**Xj0 zZ_G7s;!>?P2GA#h-7*-CufEKWF#5Mw-!Re7YIFq62yu^}q zEsAC&V04f_07jz+{2X(L0HAlw{{WI`0W}AI?E~M$=?2C(BZSTeC}cM#v@TRImp6$m zFCcohc*IughWx?X0jL{r@cOVZL<`tDq8q2+jK=c@(-$yn#rw0;b%HbjN$d)(RLDso z6Ook1ZqZ6boMtR$Y`%-MQi(8jfY^mHlPKkU(Pi}3Iyp)PY@M&UCxa^bDZ=`}N&!(v zbkh{ort^g68JGcH!`&dv*>*j*$Q~d&!;OrQ-_Mn9;;Ho&NMtv3rAkgR%tDg5q$^c% zqOlr@$~|4FM)1z&WOh{--dJK=V?!+xTl=@vRoB2DBLHxvlMJ0K)?x*0E#|GmKY`&* z@s`wYs*s~pQ)qMrtWu}asTJTPoks7k0DtIo`X2t8LDiM=5Y_cGy%Jbv(uPV{JKjKd zRLZF|t4JO-W`9!kU-pV^rw;$U?slJp@mhamrQ(mw0e|G#ZRfZ@5`h3i5_UzQPjtgs z{0Z*Xv)j(v>(uRM*J-{!2Y>hM^~?%8y}d~OSI{B+7F8_A1S?<~I;vPMrh^V!BlUo8 z@f|tSsU>opI?E^4DdCDIPOGy7sR~K_4eV<8%HF_^uhED%uxZ@$ z@Brl;4Zp~>)|p%81;1&nW){1BCBoJ^%`D|U)Jo1{o~z+k{uaz$%_*jOjkq7U0SW2E z+@SG6Q++Ir8i7?6ESCA2+JXj86T5l0N=Rt86K%owulbB6)OSIRBL;&*EepX@cKth(CY_YISdbV{JDLV ztO9801^`&y0vkR6GqOc-04g0H$ntqa0pN%;rL;-R1C;laxXrx#z-{teJ{fg;Aae^7 zP*@0e0q$3ZW^rR61^h}}sOYPx@+Y_S_U z_>c!(6fENr&K12CUZGhiN2(v?TxKJn7scWOG9=;K7~SgGt|S(B;HAg8gpen&DE#8O z1XxB^T);0fU7q4R=BJSd@3Q-bDidNDVGl3JFcATQ5fO_(V0Ya4oDNIUU5wG-=ZxB; zrcH}vyZU+c_Svxb^NCo^oYi}ks*^f7xD=s@Y=8``V(p8NowN@)VD+qh2?yAh`P>gn zCBP+$3C&mMux!)AOIlS;u#ANjGoTfHtML7$DCl)jZU8H?a=*dL9di)NgBS9#-24ye zprL~oh)4ipWOenHNOOp%i9M{Q*Dr>B=i4G4;EGJ@;(On z)qTSe{4Q?on~!23@WMVo7=fbP)t^p6J`ntHOW$xDzC%0k8~R}%VvPTCzVwk$46uz% zv5$pfpD>Z^zP{aC{7)(2AchTRt@_@dpD+-jy^P#fdKRFS zSgs0Mz{QLod?e*!M(B@zQU-|vU{Smo3abBEDX9ccPO)9)Z&0HEYEbSXNq_LF*8S;Q zAVmL-4WZO4`|BURzc%&{mm(4IsFRA%22pAaB!Q==;Aw?b${h+?;+3@?4ZPh12WNpI zi9su#j_Nxcx+tKKaLB+r6YQNUlZ0=o1>7T+;J}udgI;7CBC<7Lw!T*f0*|x|p^yUB zXNi6L<-?!;F@g^4z$}YcO&UJBDpmppVy0;x*`~H?xPjP^oiClkHDDlcgxkYF;9)8} zx8>JsqPYG(1Br$>3p_o=Hh0`WKt*DN$LaXGmEA|v!V7i83eVH|?8Dcwtqzdu%TBQm zc)t$rzfjkmvSm0N^eV%_1a{NM($`1wn*_XT$GHl;U=sb|uTV3S!1wJ$*^)t~K83Nd zxdPm~V%!qC0Dv2ww_}5!i|FBDJFyQBhez#taN@=k-nS#>A-v%JJNHs5Z#;dPW=rJ^ zghasN>fn8s$ zu<0l9Duyfa=2B6`%EcI|OoI>>BEgCn5B1DbuHl%f@h}$cG|0v@-Pd&O&{l9COPT@p ziZ8rg53%~0zF1)* znwV=rMnkrPu*GgY{jgXbxOcN0tTMm2PxRn}qJ56j=q<2Re*%_E3)GR*>Fvv5EqOgZ z!+~8NA4kC+%y8`5L#-RwnI$pb)PtLtE3V;%!&$6PeHF$m#&-#%YH`$5!%t*vvk6=% zENN^iX$7#=O0<6Dg5z0qiJ0MpmaW~CTER!HP$9k#hKoUhQ8}MQYsWh~CODw=GeS}H z?0}Ywhf`T*y3JgPJ}m@BM*8LLa+Dd4WV?-&5x3B=4RUxk9KLc_61*1MgT(}=u-($& z5iFB`yO4hey>TO)j>55PH@+~h5Gqb{@P(*u3|2UAWx4j1hcCsxx}=HVqfj?9tfQ}} zQk}4+xx$v}ud$_h$N_(xQQwGBtP-?MU_H`&(fgW3?`z?`&)kZ=51)=;C&J(u)Gxq} z!`^+gF7!oKE&>Q8m$pcAF9}`D9ur)~?38GiU%2$pd79gaWhXr3$RAc(EhaJP8D7Qu zXZ-`yZm5%Ha9RtSf)P^M!vz?hLt83XC(J1H-+}e7-HWZ%$qOFZ#iN7)y#P_>7kk!) zw2x;ly~Gn~Uq-f9IGe{`x%yX`a(IPK`x<7lpSP?2bwB+8(%<0KA{`Xvev_*m@)qj? z?8PYQ5U1%5v!dkRL!`F_*E>kT$B;G<>0OP7xnM&6!-(ufB;B^Cz$rIFa4M&3H=0<_?}Oa zPKrW)Dhhc@c};WGrY4J?>X*tUICYF&Do^qlLvX3G8c zbd9ZP`-tJ#!FeL$S(gVAL z=_DUZTI$l=5_kzNxd(@R0FB)!N0_{+NTSxZbhH=3;syjb` zkQOvmL#AGQau^=?_Fgx!#M|2Ft*vRUArc_gSnXxA+S3zhEU&)k9Qsc?AOg&}J+dIC zyzUtgz3f*Auxj1Z2Zb!-y7R-dEft7duM=%HL9}ZjwwdT56OrZ_OhSr~D7r{7XEc-` z&DTXHiPWV?@lK3pDbk z)$%|(c(oj3aySsX>=@`sGdLXRukM_+T253Y`4T(ebjgudD!U3D@s1h%H*or*>0@i; zKcqBYPFvT?Wg1W5HZN>Buk=LU0%HXLU%;oM>;t8{c`@M+9`lX>H|;{E5fk9Hx~)&7wF3PHcr6j(;TufrdSCjy;Y;CRN49d=pm1@fuzP!`cV7>N zaO#timA(`_+}`9RP4I_tHuqo)yWcOz180Kly~gh4d_a`*K~~P|TAHWxavC1;<$!;) z_Te6aB|v@Q-%P`|8M_x85MbYztf>ZneM{SIL7xKho0P$= z1G&5~ucXvi#5Z%Ye*Eeo&u4F@ zE$&?LX7l%1AJl4H*@H|6Pki1odeIZ4(Dqg3nCQhh(vUX}^gG)@+UD%^-nsvkk*a5d zGwz?>mKl4cqvq+wi+^kzni>A+_)j|r=G}hg?FB=tjx~=f+cfmMw!*}-9QE9o+{>mrK$qW7&kc=S+x*Q>j+`g1 zKbW)YN=e7An-1nYJuh=fva$D*YVBQdgDfY`zUB=(p0)SkXCK^{ai)`U9&PF5NrlZgM%Nzr(xg-Pih7eY1Y!Z*5)i zU90|+^ZU``JMw3Fo@hv1{s#H|iPZ5E&XUo8y;%@9#;Sj#E$H*Un&pd6e7OJ41dmzu z)#xAJ`L?ag5&GrNTcf^t_Q|%nB8waMEkTAO074;5Ua9 zzSt3W_T$PQm##R_$F(8ySn$S4&!0(?Gquatj+fg1>B{>w&Ax8lYfGaIo+U3Hr0Y-K zU^%_HqkdT0PYbT*xIX+c=K<-a9~}?=de4~u-niwy$C|S)e(~846{^pTj-WMZYqEBf z{=0RL{y@%Y{dZT66g_cE$e)9Z=i0_P$n{q{o*0xEy8rPt-tW#;+!3leSFz;H$ThbI zh1F-|zL{z@yfoT!V8y{#{$7=SeC-WCytU$ePs&?W$2)Y%4JKct54|8vOrD3=Uhe5$Lqh@IdA5m6<3b*G4^h|ZT-2^o6fyO zJBR$ArtUl(s`qUG_?ZP`-`6ao5h__q5@QU>64_FzWDgZtD52U0WoSN)mr(Xi%86`nZI+GuHfmSg4jnSK^5SdMc$@xqwe4XN$j9e<-U&jIF1y{jnt2KA$TX02s zn{Aw*uUmbB=O){bkuKOF)fnhR`qNQ(_d^Dct06AH4E;0gd-+nNG&OV;hwi)9f_`Dx z*NeYuo-7b@(s~{U-vxi6sENO`_*L9m`+XoL+(%! zn4^=wE4HL1s$yn<*X5Iert9!y_72mntFq4tj~Tl^4ZwzUUUR6vl0)>AkZM)gxd`lw z!ONy)Im|SZS8JJq6QCqSi1}gGX8*~V6PvPS(+%> zJ+3$HtraM#ojhanV_m6#PrKO7TvC>8(_o8 zYy42rA@+;I9lluZ%S}q`_|j?S>JF1Gl}uZFZPlG4>s3Tv>gr$Kpclq*{Q5^a=iQNY z`ihk1u78a8)k%Bq>-gBks$?n(O1-ya46Mt^UGecO^Bu5%>Jde~b zb#sen-=-w5pZuzI=4f4AN@ONZbY(q-R71UULwyea$*0)fkhz^D;qB)h zRR-<@>j@~IQJl8jeeVL;X;5%P;Nh~HR5W&W?|4z>!QkwZep#Z;xy!{XL`&DqPywlHA3-Ov%3Gb@)kw#|>Xt(k2uY^1d9?$bfGqF%p@q$PES3hyxO zQ&1o1o%*6&H~83nkm>M3EZo`prdi45z1xpcD=vZmscL%9zGT{`F5~NP<~QZryFxOy z446AQWcZRJIROg%+VWA+=KR1d zere^(va=2+)SNnB^oyU{cT`1!ED_5IS0nIpbP6(4jz6OYQtp4%esGWb;>Ym7Btt`> zrQmGh+oO!5U1A#QG%?xJv2zCDih5^0{LVK#J;yb)SR7_A#IXsBFO!m8tIy%19Q#S8 zha_s`LrfhPDwJhfBNV zeif_Wl|63rl)K^Xg#7f)Y4%g4+Nq36LTs%3BY-hFg0R8%&&=2tkG^07$4?CY?psYg zoUMf)SW(Bi-DV77WGb}^^OWZMI(AmXs~FIdozwMp$_#F9dh_N^*o}lkJr-f=iJypg zZ%@J^dyVMw0LflwL6b^c{^a+OhYk98W3M+Hyb&%)7UfH6T*?vHrhY_v4tr5%DkL7q z#u)T16E+R0f+7<0MtC0%DWy-zRzmXQTc(2<<;JnXjOL!DFg?dzoZxMZIzM5Ro>m)diN7`JTE zilKLgMET2<^r3HZbWi=uEO8qhsLWq`meI_tym6oD_%v>|JKyNQ6-(v|v1VE~Zr)~f zbsJ?^exVaf-RBd8ImVAe!vnKTDbf#d`7=3gsrX^Zt(fYyXJO1oOPX6VpXEyh|13{& zIfSu~jxq_vI)xHLlKAb%yJk8=g0{@N(~MfWq_Pr>3D-M?CF=9n&!*#28US$>L!7Lq zzJ!yM9FWpvln8c>=8tV)R1xNxl+jMJh(9O8huG>*=$6&FwF&cTv_d={FEp7aLDM_i z(`npZ&^%x!Q2HdP*_6<_`Ah2AmKxu*pD(!`59UcPJeSFMpD|`^YuO%5a$w0Lyp0Uh zo*Ub5WE$uGP4zd@EPNwz-=&68zBsLsdtT;tU0M$74CA%@qyY0u_*3%2J_+JvgiR)X zjYwx;!7S5SM~I3`(})#N-j;p-8;0MqA|*-2UdB(&ODXQ#`rq*+faaOcPE-Mp_Ct8Zd_ ze;dTGvN1ljLsId%j2KyJ^Qj#^%GIqH-s|~A`5(Hfr{8bmh||PbePlsH!DxnxrTQ}Z zZM5lpp=3wRsT!ef=BQH)qwrw>cF&uf@_mH1QABS7$j+!(_kcx<3M@r%!f z=X?`pe6310S;j|buJkY)Yp3KihH>-0cnL46myaH|{9YGJUztQ?T3k-TNagIbGKrsNJu7-+yOQ)PLWD_-=0}+(C-wRh+{P z`y&P4jn#dn9OFAR@{{S>1=lNoM*qlFH=X(r{cV!jzW?Y8nup0B6Q0@)>HO`AL*LVj zO`aE+ebL^qZta;%8MWpoUQfPnJ}}EUxA`00Rpf?+vC`e)a)tnE>AJ*@Yxt+MYlZaoLQ{w|Q& z*EVRGOuLiU6&JI$ZcJYpwYw%WIbkDGwnJ+b+vN6iFiG*rm1Un131 zOKi?=L$$Av3Zt#~!wgI1ZSsFs#rL~Q>&fE#dk$`et0^)kl`CF8UWy>t=8!flmsg*Q z94S{AWT}ib;uL){ah!H6d9n#J-I`FY7B_tp!7@j*=xJ;)PL$HR{a3qpNaX#*J7RKeH?%i$Zd}2>9W-KBW>|a5`LAOp6%DdC zY99ZcSFrEMRz>Xtt1czTVL@Be&Y7S4hi>v_3e!KAzD&nu=itN^Spimc=a_=~`sQ$5 zAEh<47_~nYNKIo&rVkp~4u%2`_<^!d@CvN5XQD%K>Ba346sq^rNFW$B~H$^Jrp9Rw`vq^De-OG1J zn4U2*(YB{O4X&g%?R~`x>J)v%FA?Qn2_=MXjPWXtZup58p|wQ8i(Dhx-N47hD-q6iHZGW*7Teu2s;Q<%10p+@ zbA)uJld?)4Y7f~J*eVacD*Gj!@BHBASY2Vqs<+oaO-;N%yu)XQ^;Xp^z7(OMkuCW3 zGkyQJKjnIhA{x(=#^|R5^w%p;SUELzWsGDmKH=Uea+>Ol9N(T$)=qC%o(lg?OjN)O zM*82is;L`G)~=dpRZ}}i)mJq90Efan}X=uZU;#`QJ>%{Tc0mW3;pxrHlm_>bN z#lA0HBU}HQQ+O>p#PVo2ZF%0&mnFXD6{wjS{1npFfW!rTI_^x|b8~V3WPkcG4es zE!*mDrEy`1;cZaEaAoS3f(qJ;`|gzMqTi1&f>Bt?wV%I4mUy=69L95+vBXl14^ z70oD!S{lC@ARU~i@8R+W^!X;bj8KP(7t&;=-v6yMV^$wN79H*vWwpyA6mJ+n*|uHJ z*eT+;^oEVr@|}-V3bYOkn#}29BSGe4Vz~(d5yh;WNdij&YIhpXPH!KfX@cN^K>aS3lp8m-4c(PhpMOIhb7h-5+Gt z@Re0!YhynNE#prO=%|`fGYxzw*hk94D?yK!t!;I&d8MHKK8CncJfmKyjeQi?B9t#E z|NN?`2xBWXirXo1hudO0J)HKuB-5SnhuPRrf<=v8l$lO`%ht&U3KqMCZsi(SV zlNG>xHi+phtqt$Ry%rzErBx>i86PT%zZZCsaYWb?&*lpk~s9Bc#)n_f&3n~gkL=85-njkAtbgtLllzr;FgH03VMI4^;PCql1 z@4xOR&(KrQs+2~!uDa*`rd}pX)huFG%(jL|INd3xD>3jP&^ej6D(WzzUxEFYirWO=>~DOjSWAU#=zLA4PrRU5RFCVqL>XFn;AQ(^1L z&2;WRAT}Toi>{H;my6n*8xf(SQa141;ncYcigP-)q!E7br z-hY&**?tinXH(BFP`%JNapuRfsk8DYrhPRZ;&2VJlwpa8(`1FTV;+I6#dg`8q~NYL zXRA1dl^Cv~{~4KAqb|4BAM2b2DGI(4l5-*C{xp%jOjD~tc8YX{T&{$XBnuy(Zt`!b zf~bb>YG&SZ+f^vj&ey7%HI>?vwp!2U$`P*kY!+9VuQDcF30D*U#p_J6%mSJG7_!@N zMg6jw)LLF=S9MmZNPUcP*l-2DK}~$s9An&WOBTqY#;7WO{-sqTC%T+d93ZzhBPq7q zXNyMo7L8EzxrEn*ZYBG^j28*#?q~P;3NI#1Yt(gYd;I$kTeC!a(+t=9m{FbO7Ujw= z%%Lxx(7JoAobbXQ*%-Yj8RNClD#G_o*rFZmB4+u~AM|0%0tFRLec05X9Cexx(SIny z$LaXUmI}h31*u5OPWsDE;jGh#%Ys#;m4n-0mKDILgR2AVfk=&$Bgq-}gPk zRqy59wd)2i+m~wL!scggTI&B+PhymvM2DP=_`7ISfv%=BUXAoI*UqFN-^G$H~1u9o>uHVuU|?MA?5zf(Kw1!W_YH?=Lq40O3b2b zq()PcU`}W5FZy|fPd;~E)l1>?{EL`ZFZ^N;Gmc3#-FE&hUCw!$8Y$7}b1j*%|M3XZ z&cK;yT^LX5Vm%-e#-(tdX z7Ov{))z1hs1ESxf?;d3*-!NI+p-`5W((#J^tJMtcqx@JTDUusB6Dw~YA1o@}%k$Sz zBG&xqWzUf{Zd9aseZ#1m6mEG zquB9~o)&8}6rD$hD^#DGshIFOBfRSCFXB@yAIa{m?Adj{<%Lp$S~5<(!OUjjTgS!W zdnDmE-cgdxW18<;-eMp^RAuRoVz;N@<*ycrOai9gH_p^GS&%aA=xYWwzdHI}Y}JbB zmAH9|OOop!C*z}8<&2bbG%=4b>{ZJE$AT<_c{48hZC%i{tZU&va9+`ScYHp`rwcb9 zB-?P6un@>-H!h{^gMX&p3RRb2^6E>j8ly!Pkmxfxr|>8zvD9WVC)T%#OaYKT%%!GWvVd_n=LV zmleH&6SLQrTiY}bl@ogydby?A0$99a6H`*Pw~|klv@v$t?!|vARM2W=?z*gnps zCpjc1+uQ3iqy0CNYA>}eH#T-v+p?4$se z+npaX1J7=T{Ovs!0JQmA=M!9|^a`@iq#V-gQcn=N613@J{}WtCLnAJdPA=w=)v5ER z`BJM(G8g_C)oWWG65!H>`=yCmvFYTU7BY3lS)&XBgEo>ap(S#I@1)w>H9_}YO)sC? zsJ|kuB~+C_B|R7%@b1K}{Ecv42@!CcOVzp7jMh!he^Sh^aL2CgEhh68zKB$JOPTV?xP3oET=5J3ho%2t$BkhS7PuL8 z+$iYuKkB$8=^xq^L)z})C+gs2Wn*X*5E>O-Bw_1{=F$j=ZFK&I<6PVy?6lftY>Z_n z%VEkctTs`}nf=Y$63oJ_wQ>0O`68Pv$Q@9MZffp%XJAq!SX1-A4Yx=2zJjMmbf^DD zoP7hiyi4;W=3kj*YJ@aJXdn{dfDclwR2UXhbAzNMa@`;V@^i>)b&HRudIp6 zw7ryN+gY=v)oS$37~5psd53F-(S+p?<)h_kWeMiiQXAYoIPMpvNJQWLzsd}q51BkNRZ1|e-d^MY z$10_fYvf0Jf+CIVFPN2Bx^^y>o)aXPeMoq$0*xCT=JARZA>27LtgGHnK^gqa&2-I_Kj) z)UJ2QK7Y0UJ!*wnyO4$I3I0AJLccLu6;}6eV|jWEGj!*$?+mXdQG)RD#V>n8(=uBw zH0>H$RW3Hxg)6vWzOli}8mn-5lvZ=Qqg!NP-I*PX1lwiRqr8ELrsif-&waz}M(amq)?Tf$~PBTYT+^@aG+uk$mudv`UO{gEEz)V(Q`hcRO@Y>{B=!ZT;27koQKg8yX4*)<%~pQg_Bd*$`jJ!I!~fqskda)HX^HLRKxXw zwfd98L+l-$t*6K7rg0R_CUYU~DAOisgdU;yVzyf)@EhVN^kvPtGh2s`J1<;mCo(Y867Emox}O&kk;0j!+2w` z$WClUC9U8E{wH!yWWBkgdI%o2Fn-~3gGZT>!^#P_@n5x!|I}!R?NGbcVYqgn$z1gL zfX%b%U~|XiEXj7}i0^d7zlHN55&?2rrqgUb?W#}BtKos*3FeZD93F&g2u;|Jt{D0S zSk_dE7F(og)%+768D#aH-guD4pw&HmKek=ejJ@tCmtF9|CU)_imfo+arfWp~-(feD9_-F+3k7)Cc{ z@M`+z(zkm2=0Eo>BBwHHewv|&>#3_%VA@aeDNj~Xt;SyUoF8%jRMt8MmuHgSh@;&XddW!$alC!5v=GZ(U4XZYgUd4s0=6`TJ`5vhE2oEfCv7I}uL1 zSIp5;1aLcmwgB1zXb+$RfI9$m1kee zi~ukaz$gHt0gM6gIDjVrJPBYdfN=oE19%F+1OQJ1m0M7!L3E(*ZvjEHnFbBX~0P_Gm4`4ok7XZ8nU;%)I02TpQ4B#aIO8~qK zU@3rQ0G0z-0pJw?D*?O;;57iR19$_#DgbW+cniSW0Nw%cE`av{tOl?Kz*+$B1NZ>I zhX6hT@G*dO073x&0q_ZcPXVk4@EL&50c-$}4d4p^8v*11*aToRfG+`T0k9RoR{*vF z*bd-p0N()k7QhYwI|1whup7W00N(-l9>5O(egyCnfS&>U0$?wIUjh6Vz&-%`0UQ8u z5Wpb-hXEV`a1_9A0FD7T4&VfU-vRsq;7F0$tV7l#ddLPuA2C1- z5hG+HvI#LpHX|m;7Q__UikKnh2o*5`!E^P9P_dSR@XKM@}IL$Y~@IVIWK-2}wp$kW?fM0SF68 zN6sJ_$XO&4IfrB+*+>qOi{v5ak$mI=auF#&3XvkD7`cR$AeWI+qzoxXDv&EkC2|$H zhFnK(AXUgsI-L!KiI2pf5U zG$I_N328=NA}vTO@(O7~+L71D8{{q0fpj8WNH@}hyhGk2ACQm8C*(8o1?fe;BL5STYA ZPBufPtr stx hBuf + + >PUSHW L.MSG.INIT + >PUSHBI 0 + >SYSCALL PrintF *-------------------------------------- CS.RUN.LOOP ldy #S.PS.hStdIn lda (pPS),y @@ -305,6 +310,7 @@ MSG.USAGE .AS "Usage : CAT File1 [File2...]\r\n" .AS " -N : Number all output lines\r\n" .AS " -S : Suppress repeated empty output lines" MSG.CRLF .AZ "\r\n" +MSG.INIT .AZ "\e[?7h" Enable Line Wrap MSG.LINENUM .AZ "%5D:" MSG.CTRLCHAR .AZ "[%S]" *-------------------------------------- diff --git a/BIN/FORTH.S.CP.txt b/BIN/FORTH.S.CP.txt index 1ef54db5..ca0b2f10 100644 --- a/BIN/FORTH.S.CP.txt +++ b/BIN/FORTH.S.CP.txt @@ -1,7 +1,7 @@ NEW AUTO 3,1 *-------------------------------------- -CP.RUN bcs .1 > A2 +CP.RUN bcs .1 > A6 >LDYA J.KEYWORDS,x clc @@ -9,10 +9,6 @@ CP.RUN bcs .1 > A2 .1 jmp (J.CP-$A4,x) *-------------------------------------- -CP.VARIABLE -*-------------------------------------- -CP.CONSTANT -*-------------------------------------- CP.ACODE *-------------------------------------- CP.FCODE @@ -30,17 +26,7 @@ CP.LEAVE clc rts *-------------------------------------- -CP.IF jsr EmitPullA - jsr EmitPullA - - lda #$AA TAX - jsr EmitByte - - lda #$10 BPL - jsr EmitByte - - lda #3 skip JMP abs - jsr EmitByte +CP.IF jsr EmitTestTRUE jsr EmitPendingJMP to put jmp -> ELSE/ENDIF later @@ -51,38 +37,43 @@ CP.ELSE jsr CP.PopPtr1 get previous JMP -> ptr1 jsr EmitPendingJMP to put jmp -> ENDIF later - lda ZPCodePtr - sta (ZPPtr1) - - ldy #1 - lda ZPCodePtr+1 - sta (ZPPtr1),y update pending JMP to here + jsr CP.UpdatePtr1 clc rts *-------------------------------------- CP.ENDIF jsr CP.PopPtr1 - lda ZPCodePtr - sta (ZPPtr1) - - ldy #1 - lda ZPCodePtr+1 - sta (ZPPtr1),y + jsr CP.UpdatePtr1 clc rts *-------------------------------------- -CP.BEGIN -*-------------------------------------- -CP.UNTIL -*-------------------------------------- -CP.REPEAT -*-------------------------------------- -CP.WHILE +CP.BEGIN jsr CP.PushCodePtr + clc + rts *-------------------------------------- -CP.COMMENT +CP.UNTIL jsr EmitTestFALSE + + jsr CP.EmitJMPBack + + jsr CP.EmitPop2 + + clc + rts +*-------------------------------------- +CP.REPEAT jsr CP.EmitJMPBack + + clc + rts +*-------------------------------------- +CP.WHILE jsr EmitTestTRUE + + jsr CP.EmitJMPBack + + jsr CP.EmitPop2 + clc rts *-------------------------------------- @@ -99,6 +90,26 @@ CP.PushCodePtr ldy RP sty RP rts *-------------------------------------- +CP.EmitJMPBack lda #$4C JMP + jsr EmitByte + + ldy RP + iny + lda (pData),y + jsr EmitByte + + iny + lda (pData),y + jmp EmitByte +*-------------------------------------- +CP.EmitPop2 ldy RP + + iny + iny + sty RP + + rts +*-------------------------------------- CP.PopPtr1 ldy RP iny lda (pData),y @@ -112,6 +123,14 @@ CP.PopPtr1 ldy RP rts *-------------------------------------- +CP.UpdatePtr1 lda ZPCodePtr + sta (ZPPtr1) + + ldy #1 + lda ZPCodePtr+1 + sta (ZPPtr1),y + rts +*-------------------------------------- EmitPendingJMP lda #$4C JMP jsr EmitByte @@ -123,6 +142,26 @@ EmitPendingJMP lda #$4C JMP rts *-------------------------------------- +EmitTestTRUE ldx #$10 BPL + bra EmitTest + +EmitTestFALSE ldx #$30 BMI + +EmitTest jsr EmitPullA + jsr EmitPullA + + lda #$AA TAX + jsr EmitByte + + txa + jsr EmitByte + + lda #3 skip JMP abs + jsr EmitByte + + clc + rts +*-------------------------------------- EmitPullA lda #$B2 lda (zp) jsr EmitByte diff --git a/BIN/FORTH.S.KW.txt b/BIN/FORTH.S.KW.txt index e489f8a1..a4c34cd1 100644 --- a/BIN/FORTH.S.KW.txt +++ b/BIN/FORTH.S.KW.txt @@ -26,6 +26,8 @@ KW.Lookup >LDYA L.KEYWORDS .8 tya Keyword Len + jsr NextKW + clc rts @@ -51,11 +53,7 @@ KW.Lookup >LDYA L.KEYWORDS lda (ZPPtr2),y Get Src text char... beq .9 end of text - jsr IsSpaceOrCR - bcc .9 end of valid chars - - clc - rts + jmp IsSpaceOrCR CS=end of valid chars *-------------------------------------- KW.DUP lda pStack beq .9 @@ -152,7 +150,8 @@ KW.gR KW.Rg *-------------------------------------- KW.R - clc + lda #E.SYN + sec rts *-------------------------------------- KW.Add jsr CheckStackPop4 @@ -198,8 +197,7 @@ KW.Sub jsr CheckStackPop4 KW.Mul jsr CheckStackPop4 bcs .9 - >PULLW ZPPtr1 - >PULLW ZPPtr2 + jsr KW.GetPtr1Ptr2Sign stz ZPPtr3 stz ZPPtr3+1 @@ -225,21 +223,143 @@ KW.Mul jsr CheckStackPop4 dex bne .1 - >PUSHW ZPPtr3 + >LDYA ZPPtr3 + jsr KW.PushWSigned clc .9 rts *-------------------------------------- -KW.Div +KW.Div jsr KW.DivMoD.1 + bcs .9 + + >LDYA ZPPtr2 + jsr KW.PushWSigned + + clc + +.9 rts *-------------------------------------- -KW.Mod +KW.Mod jsr KW.DivMoD.1 + bcs .9 + + >PUSHW ZPPtr3 + +.9 rts *-------------------------------------- -KW.DivMod +KW.DivMod jsr KW.DivMoD.1 + bcs .9 + + >PUSHW ZPPtr3 + >LDYA ZPPtr2 + jsr KW.PushWSigned + + clc + +.9 rts *-------------------------------------- KW.MulDivMod *-------------------------------------- KW.MulDiv + lda #E.SYN + sec + rts +*-------------------------------------- +KW.DivMoD.1 jsr CheckStackPop4 + bcs .9 + + jsr KW.GetPtr1Ptr2Sign + + stz ZPPtr3 + stz ZPPtr3+1 + + ldx #16 + +.1 asl ZPPtr2 + rol ZPPtr2+1 + rol ZPPtr3 + rol ZPPtr3+1 + + sec + lda ZPPtr3 + sbc ZPPtr1 + pha + lda ZPPtr3+1 + sbc ZPPtr1+1 + bcs .2 + + pla + dex + bne .1 + + bra .8 + +.2 sta ZPPtr3+1 + pla + sta ZPPtr3 + inc ZPPtr2 + + dex + bne .1 + +.8 clc +.9 rts +*-------------------------------------- +KW.GetPtr1Ptr2Sign + >PULLW ZPPtr1 + sta Sign + + asl + bcc .1 + + lda ZPPtr1 clc + eor #$ff + adc #1 + sta ZPPtr1 + + lda ZPPtr1+1 + eor #$ff + adc #0 + sta ZPPtr1+1 + +.1 >PULLW ZPPtr2 + + asl + bcc .8 + + lda ZPPtr2 + clc + eor #$ff + adc #1 + sta ZPPtr2 + + lda ZPPtr2+1 + eor #$ff + adc #0 + sta ZPPtr2+1 + + lda Sign + eor #$80 + sta Sign + +.8 rts +*-------------------------------------- +KW.PushWSigned bit Sign + bpl .8 + + pha + tya + + clc + eor #$ff + adc #1 + tay + + pla + eor #$ff + adc #0 + +.8 >PUSHYA rts *-------------------------------------- KW.MAX jsr CheckStackPop4 @@ -284,10 +404,30 @@ KW.MIN jsr CheckStackPop4 .9 rts *-------------------------------------- -KW.ABS +KW.ABS ldy #1 + + lda (pStack),y HI + bpl .8 + + lda (pStack) + clc + eor #$ff + adc #1 + sta (pStack) + + lda (pStack),y + eor #$ff + adc #0 + sta (pStack),y + + + +.8 clc + rts *-------------------------------------- KW.DABS - clc + lda #E.SYN + sec rts *-------------------------------------- KW.MINUS lda (pStack) LO @@ -515,7 +655,8 @@ KW..R KW.D. *-------------------------------------- KW.D.R - clc + lda #E.SYN + sec rts *-------------------------------------- KW.CR >PUSHW L.MSG.ECHOCRLF @@ -578,8 +719,6 @@ KW.PRINT >LDYAI 256 pla >SYSCALL freemem - jmp NextChar - .9 rts *-------------------------------------- KW.DUMP @@ -589,7 +728,8 @@ KW.TYPE KW.COUNT *-------------------------------------- KW.TERMINAL - clc + lda #E.SYN + sec rts *-------------------------------------- KW.KEY >SYSCALL GetChar @@ -625,7 +765,8 @@ KW.DECIMAL *-------------------------------------- KW.HEX *-------------------------------------- -KW.OCTAL clc +KW.OCTAL lda #E.SYN + sec rts *-------------------------------------- KW.FETCHW lda (pStack) @@ -678,7 +819,8 @@ KW.ADDTOW jsr KW.FETCHW jmp KW.STOREW *-------------------------------------- KW.CMOVE - clc + lda #E.SYN + sec rts *-------------------------------------- KW.FILL >PULLA @@ -723,13 +865,72 @@ KW.VOCABULARY KW.FORTH KW.EDITOR KW.ASSEMBLER - clc + lda #E.SYN + sec rts *-------------------------------------- KW.VLIST clc rts *-------------------------------------- +KW.VARIABLE lda #SYM.T.VAR + bra KM.VC +*-------------------------------------- +KW.CONSTANT lda #SYM.T.CONST + +KM.VC sta ZPType + + lda pStack + cmp #$FE + bcs .10 + + lda #E.STACKERROR + sec + rts + +.10 >PUSHB.G hSList + >PUSHW ZPCLBufPtr + + >SYSCALL SListNewKey + bcs .9 + + >STYA ZPKeyID + + txa + jsr NextKW + + bit ZPType + bvs .1 + + >PULLW ZPAddrPtr + + bra .2 + +.1 >PULLA + sta (ZPDataPtr) + >PULLA + ldy #1 + sta (ZPDataPtr),y + + >LDYA ZPDataPtr + >STYA ZPAddrPtr + + lda ZPDataPtr + clc + adc #2 + sta ZPDataPtr + bcc .2 + + inc ZPDataPtr+1 + +.2 >PUSHB.G hSList + >PUSHW ZPKeyID + >PUSHWI ZPType + >PUSHWI 4 + >SYSCALL SListAddData + +.9 rts +*-------------------------------------- KW.BCOLON bit bCompile bmi KW.COLON.SYN @@ -740,7 +941,7 @@ KW.BCOLON bit bCompile bcs .9 >STYA ZPKeyID - + txa jsr NextKW @@ -778,62 +979,12 @@ KW.ECOLON bit bCompile clc rts *-------------------------------------- -KW.VARIABLE lda pStack - cmp #$FE - bcc .99 - - >PUSHB.G hSList - >PUSHW ZPCLBufPtr - - >SYSCALL SListNewKey - bcs .9 - - >STYA ZPKeyID - - txa - jsr NextKW - - lda #SYM.T.VAR - sta ZPType - - >LDYA ZPDataPtr - >STYA ZPAddrPtr - - >PUSHB.G hSList - >PUSHW ZPKeyID - >PUSHWI ZPType - >PUSHWI 4 - >SYSCALL SListAddData - bcs .9 - - >PULLA - sta (ZPDataPtr) - >PULLA - ldy #1 - sta (ZPDataPtr),y - - lda ZPDataPtr - clc - adc #2 - sta ZPDataPtr - bcc .9 - - inc ZPDataPtr+1 - - clc -.9 rts - -.99 lda #E.STACKERROR - sec - rts -*-------------------------------------- -KW.CONSTANT -*-------------------------------------- KW.ACODE *-------------------------------------- KW.FCODE - clc + lda #E.SYN + sec rts *-------------------------------------- KW.DO tsx @@ -978,14 +1129,10 @@ KW.UNTIL *-------------------------------------- KW.REPEAT *-------------------------------------- -KW.WHILE lda #E.FUNDEF +KW.WHILE lda #E.SYN sec rts *-------------------------------------- -KW.COMMENT - clc - rts -*-------------------------------------- MAN SAVE usr/src/bin/forth.s.kw LOAD usr/src/bin/forth.s diff --git a/BIN/FORTH.S.txt b/BIN/FORTH.S.txt index 9177cae5..79ae7cd0 100644 --- a/BIN/FORTH.S.txt +++ b/BIN/FORTH.S.txt @@ -49,6 +49,7 @@ CL.MaxCnt .BS 1 ArgIndex .EQ * bCompile .BS 1 RP .BS 1 +Sign .BS 1 ZS.END .ED *-------------------------------------- @@ -76,9 +77,10 @@ L.MSG.GREETINGS .DA MSG.GREETINGS L.MSG.USAGE .DA MSG.USAGE L.MSG.ECHOCRLF .DA MSG.ECHOCRLF L.MSG.DEBUG .DA MSG.DEBUG -L.MSG.ERR .DA MSG.ERR +L.MSG.TRACE .DA MSG.TRACE L.MSG.PROMPT .DA MSG.PROMPT L.MSG.PROMPTCRLF .DA MSG.PROMPTCRLF +L.MSG.OK .DA MSG.OK L.FMT.Byte .DA FMT.Byte L.FMT.int16 .DA FMT.int16 J.ESC .DA CL.BS left arrow @@ -168,11 +170,11 @@ J.KEYWORDS .DA KW.DUP .DA KW.EDITOR .DA KW.ASSEMBLER .DA KW.VLIST - .DA KW.BCOLON - .DA KW.ECOLON A2 -*-------------------------------------- .DA KW.VARIABLE .DA KW.CONSTANT + .DA KW.BCOLON + .DA KW.ECOLON A6 +*-------------------------------------- .DA KW.ACODE .DA KW.FCODE .DA KW.DO @@ -187,11 +189,8 @@ J.KEYWORDS .DA KW.DUP .DA KW.UNTIL .DA KW.REPEAT .DA KW.WHILE - .DA KW.COMMENT *-------------------------------------- -J.CP .DA CP.VARIABLE - .DA CP.CONSTANT - .DA CP.ACODE +J.CP .DA CP.ACODE .DA CP.FCODE .DA CP.DO .DA CP.LOOP @@ -205,7 +204,6 @@ J.CP .DA CP.VARIABLE .DA CP.UNTIL .DA CP.REPEAT .DA CP.WHILE - .DA CP.COMMENT .DA 0 *-------------------------------------- CS.INIT clc @@ -215,7 +213,7 @@ CS.RUN >PUSHW L.MSG.GREETINGS >PUSHW A2osX.KVER >PUSHBI 2 >SYSCALL PrintF -* >DEBUG + bcs CS.INIT.RTS jsr CS.RUN.ARGS @@ -271,7 +269,7 @@ CS.RUN >PUSHW L.MSG.GREETINGS stz bCompile lda #127 sta RP - +*-------------------------------------- CS.RUN.LOOP >SLEEP >LDA.G bDebug @@ -279,43 +277,192 @@ CS.RUN.LOOP >SLEEP jsr PrintDebugMsg -.2 >LDA.G bTrace - bpl .3 +.2 jsr CS.FORTH.Run + bcs .7 + + >LDA.G hFile + bne CS.RUN.LOOP + + >PUSHW L.MSG.OK + >PUSHBI 0 + >SYSCALL PrintF + bcs .99 + + bra CS.RUN.LOOP - >LDYA ZPCLBuf - jsr PrintTraceMsg - -.3 jsr CS.FORTH.Run - bcc CS.RUN.LOOP - - cmp #MLI.E.EOF +.7 cmp #MLI.E.EOF beq .8 cmp #3 beq .99 pha - >LDA.G bExitOnEOF - bmi .9 + >LDA.G hFile + beq .71 + + >LDA.G bTrace + bmi .70 + + jsr PrintTraceMsg + +.70 pla + pha + jsr PrintErrPtr + bra .9 + +.71 pla - pla >PUSHA >PUSHW ZPCLBuf >SYSCALL GetErrorMessage >LDYA ZPCLBuf >SYSCALL PutS - bra CS.RUN.LOOP + bcc CS.RUN.LOOP -* jsr PrintErrMsg + pha .9 pla -.99 sec - rts + sec +.99 rts .8 lda #0 Exit Code = Success sec rts *-------------------------------------- +CS.FORTH.Run jsr CL.Reset + + >LDA.G hFile + bne CS.FORTH.Run.File + + lda #80 + sta CL.MaxCnt + + jsr PrintPrompt + bcs .9 + +.1 >SYSCALL GetChar + bcs .9 I/O error + +.2 cmp #3 Ctrl-C + beq .9 CS + + jsr CL.CHARIN + + bit CL.bReady Something to execute ? + bpl .1 + + >PUSHW L.MSG.PROMPTCRLF + >PUSHBI 0 + >SYSCALL PrintF + + jmp CS.RUN.EXEC + +.9 rts +*-------------------------------------- +CS.FORTH.Run.File + >INCW.G LineCounter + + >PUSHWI 256 + >PUSHW ZPCLBuf + + >LDA.G hFile + >SYSCALL fgets + bcs .9 + + >LDA.G bTrace + bpl .1 + + jsr PrintTraceMsg + +.1 lda (ZPCLBuf) + beq .8 + + cmp #'\' + beq .8 + + cmp #'#' + bne .2 + + ldy #1 + lda (ZPCLBuf),y + beq .2 + + cmp #'!' + beq .8 + +.2 jmp CS.RUN.EXEC + +.8 clc +.9 rts +*-------------------------------------- +CS.RUN.EXEC lda (ZPCLBufPtr) + beq .8 EOL + + jsr IsSpaceOrCR + bcc .1 + + jsr NextChar + bra CS.RUN.EXEC + +.1 jsr KW.Lookup + bcs .2 + + jsr .7 + bcc CS.RUN.EXEC + + rts + +.2 jsr CS.RUN.GetSymbol + bcs .5 + + bit ZPType + bmi .4 CODE + + >PUSHW ZPAddrPtr CONSTANT,VARIABLE + bra CS.RUN.EXEC + +.4 bit bCompile + bmi .40 + + jsr .80 + bcc CS.RUN.EXEC + + rts + +.40 >LDYA ZPAddrPtr + jsr EmitJsrYA + bra CS.RUN.EXEC + +.5 jsr CS.RUN.GetNum + bcc CS.RUN.EXEC + + rts + +.8 clc +.9 rts + +.7 txa + asl + tax + + cpx #$A6 ; ECOLON always EXECUTE + beq .71 + + bit bCompile + bmi .72 + +.70 bcs .99 cannot exec compil only + +.71 jmp (J.KEYWORDS,x) + +.72 jmp CP.RUN + +.80 jmp (ZPAddrPtr) + +.99 lda #E.SYN + sec + rts +*-------------------------------------- CS.RUN.ARGS inc ArgIndex lda ArgIndex @@ -366,141 +513,6 @@ CS.RUN.ARGS inc ArgIndex sec QUIT Process rts *-------------------------------------- -CS.FORTH.Run jsr CL.Reset - - >LDA.G hFile - bne CS.FORTH.Run.File - - lda #80 - sta CL.MaxCnt - - jsr PrintPrompt - bcs .9 - -.1 >SYSCALL GetChar - bcs .9 I/O error - -.2 cmp #3 Ctrl-C - beq .9 CS - - jsr CL.CHARIN - - bit CL.bReady Something to execute ? - bpl .1 - - >PUSHW L.MSG.PROMPTCRLF - >PUSHBI 0 - >SYSCALL PrintF - - jmp CS.RUN.EXEC - -.9 rts -*-------------------------------------- -CS.FORTH.Run.File - >PUSHWI 256 - >PUSHW ZPCLBuf - - >LDA.G hFile - >SYSCALL fgets - bcs .9 - - lda (ZPCLBuf) - beq .8 - - cmp #'\' - beq .8 - - cmp #'#' - bne .1 - - ldy #1 - lda (ZPCLBuf),y - beq .1 - - cmp #'!' - beq .8 - -.1 jmp CS.RUN.EXEC - -.8 clc -.9 rts -*-------------------------------------- -CS.RUN.EXEC lda (ZPCLBufPtr) - beq .8 - -.1 jsr KW.Lookup - bcs .2 - - tya - jsr NextKW - - jsr .7 - bcc CS.RUN.EXEC - - rts - -.2 jsr CS.RUN.GetSymbol - bcs .5 - - bit ZPType - bmi .4 - - bvc .3 - - >PUSHW ZPAddrPtr - - rts - -.3 ldy #1 - >PUSHB (ZPAddrPtr),y - >PUSHB (ZPAddrPtr) - rts - -.4 bit bCompile - bmi .40 - - jsr .80 - bcc CS.RUN.EXEC - - rts - -.40 >LDYA ZPAddrPtr - jsr EmitJsrYA - bra CS.RUN.EXEC - -.5 jsr CS.RUN.GetNum - bcs .9 - -.6 jsr NextChar Skip SPACE if any - bne .1 - -.8 clc -.9 rts - -.7 txa - asl - tax - - cpx #$A2 ; ECOLON always EXECUTE - beq .71 - - bit bCompile - bmi .72 - -.70 bcs .99 cannot exec compil only - -.71 jmp (J.KEYWORDS,x) - -.72 jmp CP.RUN - -.80 -* >DEBUG - jmp (ZPAddrPtr) - -.99 lda #E.SYN - sec - rts -*-------------------------------------- CS.RUN.FOpen >PUSHYA >PUSHBI O.RDONLY >PUSHBI S.FI.T.TXT @@ -530,13 +542,6 @@ CS.RUN.GetSymbol >PUSHWZ From Start >SYSCALL SListGetData - bcs .9 - - - - - - .9 rts *-------------------------------------- @@ -608,51 +613,77 @@ PrintPrompt >PUSHW L.MSG.PROMPT >SYSCALL PrintF rts *-------------------------------------- -PrintErrMsg >LDYA.G ZPCLBuf - >STYA ZPPtr1 - - clc - +PrintDebugMsg >PUSHW L.MSG.DEBUG + >PUSHW ZPCodePtr + >PUSHW ZPDataPtr + >PUSHB pStack + >PUSHB RP + >PUSHBI 6 + >SYSCALL PrintF + rts *-------------------------------------- -PrintDebugMsg - clc - rts -*-------------------------------------- -PrintTraceMsg >STYA ZPPtr3 - -PrintTraceMsg.3 >PUSHBI '>' - ldy #S.PS.hStdErr - lda (pPS),y - >SYSCALL FPutC - - ldy #$ff - -.1 iny - lda (ZPPtr3),y - beq .8 - - cmp #C.CR - beq .8 - - phy - >PUSHA - ldy #S.PS.hStdErr - lda (pPS),y - >SYSCALL FPutC - ply - bra .1 - -.8 ldy #S.PS.hStdErr +PrintTraceMsg ldy #S.PS.hStdErr lda (pPS),y >PUSHA - >PUSHW L.MSG.ECHOCRLF - >PUSHBI 0 + >PUSHW L.MSG.TRACE + + >PUSHW.G LineCounter + >PUSHW ZPCLBuf + >PUSHBI 4 >SYSCALL FPrintF rts *-------------------------------------- +PrintErrPtr lda ZPCLBufPtr + sec + sbc ZPCLBuf + + tax + + ldy #0 + lda #C.SPACE + +.1 sta (ZPCLBuf),y + iny + cpy #7 + bne .1 + + txa + beq .3 + + lda #'-' + +.2 sta (ZPCLBuf),y + iny + dex + bne .2 + +.3 lda #'^' + sta (ZPCLBuf),y + iny + + lda #C.CR + sta (ZPCLBuf),y + iny + + lda #C.LF + sta (ZPCLBuf),y + iny + + txa + sta (ZPCLBuf),y + + ldy #S.PS.hStdErr + lda (pPS),y + >PUSHA + + >PUSHW ZPCLBuf + >SYSCALL FPutS + + rts +*-------------------------------------- CheckLFAfterCR ldy #S.PS.hStdIn Check for any extra LF lda (pPS),y >SYSCALL FEOF @@ -676,22 +707,20 @@ NextKW clc inc ZPCLBufPtr+1 *-------------------------------------- NextCharNB lda (ZPCLBufPtr) - beq .8 + beq .9 jsr IsSpaceOrCR - bcs .8 + bcc .8 - inc ZPCLBufPtr - bne NextCharNB - inc ZPCLBufPtr+1 + jsr NextChar bra NextCharNB .8 rts -*-------------------------------------- -NextChar lda (ZPCLBufPtr) - beq .8 - inc ZPCLBufPtr +.9 sec + rts +*-------------------------------------- +NextChar inc ZPCLBufPtr bne .8 inc ZPCLBufPtr+1 @@ -709,17 +738,15 @@ ToUpperCase cmp #'a' .8 clc exit CC to allow Jmp to rts *-------------------------------------- -IsSpaceOrCR cmp #C.SPACE - beq IsEndKW.8 +IsSpaceOrCR cmp #C.SPACE CS=TRUE + beq .8 cmp #C.CR - beq IsEndKW.8 + beq .8 - sec - rts - -IsEndKW.8 clc - rts + clc + +.8 rts *-------------------------------------- CheckStackPop4 lda pStack sec @@ -739,15 +766,16 @@ CheckStackPop4 lda pStack *-------------------------------------- CS.END *-------------------------------------- -MSG.GREETINGS .AZ "\r\nA2osX-FORTH %d.%d (figForth)\r\n\r\n" +MSG.GREETINGS .AZ "\r\nA2osX-FORTH %d.%d (figFORTH)\r\n" MSG.USAGE .AS "Usage : FORTH