From 7cedf47176e319aaa84e7eb3b00431cb3b4dd409 Mon Sep 17 00:00:00 2001 From: dschmenk Date: Fri, 31 May 2013 06:37:35 -0700 Subject: [PATCH] disk imaging utilities read a ProDOS floppy --- src/A2PI.PO | Bin 0 -> 143360 bytes src/dskread.c | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100755 src/A2PI.PO create mode 100755 src/dskread.c diff --git a/src/A2PI.PO b/src/A2PI.PO new file mode 100755 index 0000000000000000000000000000000000000000..414095778f2882dd5f50a43ee0235029a94f774d GIT binary patch literal 143360 zcmeFa33L-zmN#Cil5I)0v1~T6row6gAr5pp3acS3vJp!l3nb}o(cq5Eo`mjBW~L`j zLJ^0!++sTEwh0c3K#t3CIpw5DaID1yOe8mk0<+k(0YhSA12zSiB`l@??@5MEchAh3 z|2f|`Gv|CQWYt^myYIbw@4N55`wERkVr=6++W16>(QPuX%fv@t&1Ja48?33p3adOp z>LD;ZrE8t+$*>B~TkTvrXLT*Buok|j4_050ue)QtgY>>(`ob%E-)Mc&>xNomr=aID zgpDpL^u6>jXWd}mkh#IOVcv$>!41=c8)gX!+){21o1&K-txNH5mSY)iG&cxO^o;jIPY{;NI?b2?@6luLVsiY#ak=Dz9&NW^)D6x`6Gn1QU;GXo%^`ZYT36?IbhP|D%X5@)yCV@y^n2;YY{p>eg6EXSoV>zkFW+r$Ih9#aNbN?WJE~r zoQ3mj84u5AXD(bgf1!?=m0_F7j{Hlxk?cIwo;CmJc{7Gn8S|c*X3Lntc7q^gCs0%Z zHMqxM?T%L)gkSTg!|vN##u%%GbiOt$#POHHZtB3La6ZL~6f0j7G+Z+}bq0T&;N~{6 z{*PKoLTl?r{A)$jMOScKa}Ymggah`Er-5r|rl`CePW`sCgD}DDGR& zcQt1{EiK*@fR+R6JK;ikQN;zl8p!` zn`;)SMD7fbcgOjt!6zSd{iVrTV~0R-=UUH^4i=yDki7Q>J^@F+gRc#c;>TOSR@fr5DE=glAALnxEfzgI@79q9eT&5}OT#3)@D*QO6 zHh14Sxl2s1wq5$@-pt>7GE~>JaSJl;MgQhGl-e^gQAfp6CQUb^+%FK;QA4Q%Pf+hA zKAtj^dXS=G) zXv>&)zg#$-8bMvRQY${y>LbM-mn?m0s`r9v3+FDn-zF8CMQNxp)cs;PD?X*r=#ZH+ z{!#{^*cT}sm6>p_*cU}lf0~>~QzJ-E$NmMJb}eO~9!ri?C5=WtG&SsR1|;^MD2Do& zzF*8pLNwKP(NohFKK1m1NIHJ*{0g{@ipBs-|9|16{Li736#o0q{~R{|X!-y82-yCGwY|pLe#P!ql#4B{P)NRV ziR@N(xsH8SE|q`oihQIm#JV%ziQJtAwOlE4g*v}2 zFLPB??)n^6c3-^cI!uaPbscWG+H&Q3%Xj6SzZinA=Lvq$Pyx#56C?t_3B4#+*kH>=ry8!p9q63nd3*e(olzZfZwOumom zWNcpzL6P#$Z#T!v=|c0E>f1ULeJphWotC82>r#zceY!EObDDk~t)VMF<}0LzaMqk(sayWff8_d6lTYXia^J|-Z( zRgJHEv1=%5hiJv*UVvah;2la%G=Cj>Q;Bn1T|+xZk$wrCJSDU54ww8WU{1?Oll!>C zI>)QLzB*r{;dRy4RNhd{=8O^Fs4i2(<>4?2H_HMg^+OSih(?ni4(F+16paQ14c~lv zYgiS{LzS4$u$r?10K~$8Strvuzu@Dm#h5)Ii#$?{+Y>U$tQfy1q>=lH345@6&WY0- z;u8{kBpH)adiLtwr?07B{{aIB4Ss-qaLCYM!$*uvHUD2H!GARHKR5!ik&t09RIU6- zytOAZMtKOt!)vPfr>hC2Y7IRoZ5^eR<1*((0{m0eJXNj4ky>}<7(DbeUl1U)mn_)$ z*noR$ggpdJ0#bi5M2P{5*(sI^)C?Rd%@NAhVrbsTq4}vpk&`oYsMOEJRP-v%P41;6RP-wG^fqPFpYiQ-oA%&%}(V{hnj)o4` z)Vpd91a}|UQ?u8#Tb5z8359B02M@dU?>hP>sSEsec}> zF<@)gi_+v!v#6%wVGVT%d&K9upFin-+BK9B$@Z}3gK!r0!9yAMc{GhOn->cucM~`@IKrbibx&IrztjDmkuy1YDl`BJi%Fv>cxLWy!qV_-9dFCtx zeb*(|#Y<TK_FwYFbuF}xnxu>OD;8Km^m#9|Cl2D6hKvCSEYZH_Zaz436S zc#<=ni6K2?@pQeQ<&3S#E~5~B(kLGq{$t zt0#j3D`Hx_YjEXSeW4f^Aq`mYT=m~y?P}?8DOWC?yK<%jqlMu*bLCu%i#Jy_-O8Jwae=p>yOmbExENM{G4q`7+)%#x)2cGt;W~B zJb|oU7GXdu*pb`vqRDv8+N9kn7B56##wwkA_ z$+D_X;}Sgami8DfUZVFIOm;D?nol51&u&oJhi_wvWZzL6zDi)P+FIic_aI*~ zTO`JiV7%{Pw&;sk5**>1$QCV#Bf*}&pR+|LNHDVA#t1nB&D8*HCnIz3v%J^x-ph^d zaQ-6!p$Gr&2;plknZ2C4CU1oBO(Z0}0Gb*e3QJG%?~HK8RTx2bYf@cmh0)A}7>hia zZA~@lGCj$1B9~&(iF7K;iA*ZLX#_hZHPtz=wid7tygLHlvUf+c`Njtd#|3=j0)^uP zwI=rck^7Q8$>uouJ+_~@oFHN8cz1*{#I*X60RKp!&6QX=E?_0a#|0ck;{t8DdGC(6 z`0fa2n~OqmWLV9w&rJ&$WZDs|HC{qmfznG%3!rRmT1u{>%gBiY<4EmVA(1>{TBq+6d4VNH4?uw}}Vp$(T zh5_q(e^-2kae~|vY(>^}*?^KRJ&lq{Zt62*D6I58Y?PDRhJ+=F_VaQu&0`u?eZc{Yj~EM}YyKlDP?~+3_;tNw5o) zT}NOUN|4TO8kxGns3rL4KN2vA?~Euk2AoVG8xS{*C`=~72LpCYk0%+Efo%T6R8uy? z_cbG*H<|fusRTUt#PaFOXDpw!e70cZX0jCJx{dzOik^=#vwh5z*1YvzKzw6_GAu-6 zUOma78oA$?yb;D;NDMKMN7@MKOi2}LxMW-WNJ1gxXoE|!i{XQ0NKWwJBW z8zZRL!94~h^f&afRY4^}3HYFiT4kW6b??&JiLDRmS$KfO%q92@qP# zgrL>7L(L^a8Iyv!5OkOZ;Vvd1=PhuOq_af0Mq{#XG;T-+S;R;$m%20+My?kKhwDv# z`jDT#X)kP2mXc5kX9}9K`f&Xb?#cDb>dOtNRaWNjAB{}DZgeRgMF&QMvCHd7Qqi#= zginz$TQaJA|LA5$Nn{P9+0RGimj&z*=Canq?J>((be4OQZ!D07&) zpnrk-twfzMWye#$Euqd7{Pr{IOg2URwv;;a$tRZEsrK!fx8kl?w6MfUQ1|_lH2*rysXzn{DyUl;_lc{*U@wd{dt=Pg}462ZF5bRoj;V{@rR@1IkqY``se? z(0}~-cXH=a%}NY9C&!D|0&^)@!KhX{(k*K~2#8cO--Tb9zt*ig*{D+@A5aq0bkIq$ zf0lG8jO{TW5OV|RW8SUC*Eacd6oH84b7=X3<33A_RoKqP?`CzoO>V6#p^~D_aohxh zA!~x+H4SZPm)@U{n+vVAwIp-JiWM=FcxOOoe&DrFjyvgW#?l@q-N}w?nJCfOaV3?z zj;D^|HwQeE`QHURQ}}-iIM76qCB{xYF!8xp|FE^_E*UX5W6sR~aLgMV{O<#K+XDF?g3{7W*;;-p0@Jc7z9=C6 zK4494a8Y?lfnY^CSwBrLrJElptw=xl-d%Yu(yaL7rlF#X^8N9yGT>0U{DSYjyP+&4 z(O^uG`e&LM_WG%uejqV6HjtB?nXTcbvpY}a#AN~wo8G+j{Xkh#pjuO)dv)Fifm>ox zz$$JHSWgs`e;6p+hDcYy<_ZX@tUe%Uz;0Uh#3`xP6{CB#BE4`rl`G#Yp1E;;TbpNw zqG@B_yd&w@lcyvm)nq4CJWrSv?g`*s>N5uTPSuwj;4i7GI#q6ZrZmRQ`2IB@_rV4; zUFl!+uYuf(^rGJcHf82+PB+=x+M45`NDoJwivS5rWV&(@(t2*O4+7B`8%+Z9TchE;<3~G%{ZGJ_>U%jRZd{ln}Jmu0;@I# z_@uzCTNZmM)O_*DYB8)T%vLDpPgT2m3T)xHn8I}Ua1o8CN6=@ax($2ZS2E3#I2SiasS zUkVBjZ=Pq0jGyvcNH0BOoj@cLze6o?G*S)nw95DfcF3Lb4pkYsaZX#?#*9i$1MHaM zMU~6stYC-6Mooia++@mTotFgzh)amakB@4^cx+dJA5};-2v1n-?6J#R+f|@PkToj+ zqQnVCU@9}6=OgGoEKp_bYVPKF@@>9W#coF)%#Lb1;cHY;m|cHXtW{0fMr7TpHMV1| zw6l}iq={}ypxG}kly6s^NhQAIMme^KYAiA~7Dz0?A_hrm39Qs6B@54v*{7x%P?C*p z7sfgVTG^Jfj^O5bp=aeD!SZiZ^k(zCt@~8rS&JQYF|%d0DgvA5wFM7guDcKgTFLXs zn6X@oq!ngc?4eomEhxk3AuVPz5q2;jJFH8J7e!Txvwiq2nIUnpnz%&8uxD7{qhs~V zwzAIiw>HkcwQ-homZzKYm?n151?jk3vvXDv)#Rg_-k()#yxO*@h;AyPPPWN6NcJv( zDPN+J-ae-aP4JDgQGGjn)k5DjceMR#;!Vdv~)nSdd|ouaZiP?ebZ>oBEJy z`Y-|r+q?9_H`GnZ>7}{Vaq^W-ay$f>Gf?!73WbGqLx6fL$e`dsU=omKQi*AGty&7& zDSSz-B_1!3bo_6@QtA8~348zEYEiEyUmvxIMe1cYo&UD#TcZ|@BxS^9DnF_TV zZpJkXV~%!!5dq!bHN3(ateM5ll4C2ZXmDqRm7C3ebHQ0=7Z!qmsHQ|s6I^f5Ky#>B zz7QqAL?8?ox|dYoi)}O;e@^^Q!yG*DHIdq*!$l9HV5+sz^5_GEK4p zYUtb1*@8&hDyo*Pg39h}b=t*JwL?&ydf8a_iK+~j^#?wIv=g4R*!j{3@c{x1KTMNy zp&Zovc(g6Iv5TH1VIPVy`AQWf|qvv>D`E%`u8r$b?k+O{=Y@ z#cl8nY$|#oGQHh1K&E_TQ_*6QW*3*MmX0zN%E&s^GYe>WW&M>Iy4glbWKG1%Gw};WMPrNEim>Is8Zl$)I}1y z6a(@;q#8doHkyQ|A>N2&);5KjopCS}lcgIHT-!v3;(AneUpCqAVFu~%eA@K@s<%Or zVt>{m&1OfnOVbE%C6!ncx2vU~K3@u5K+*w-&0{xPgZCzg zR*M~KAl0NW?4|Zf>SW{@lsm?VsxbwX5(`zu04yvW<%EB)sGfJop%RZq#639jCr zji7B=lUqPEe0zSmY9$EvY^*C+9nO`dW^8Ikkjk6pm8&c6{qcWP5ghx4%06;InkiPP zD6RA%-Lr`0DgY4Fcd6_zFGwTHQ1%PbA*Ze%_2)wB&r)nZ>O>)RLdZ$@QtdoM@HtF$ zj^`j401hX=d0&8aPRRX(^3BdK)XtrV{aH>Rv7IVwy5Kx%&-#=?E!;rdQl6mR>4P7Bu@Z0J5L1p-|V5naNJ=a6ZmH)RFTe zfhvKD1~X+w|xp+qG{$i)5#q?n0y4l_{aQ=L6r6#GqwG_11> z8f{t$?2(A|!8#^)DO-qJdq@M{cR5zl3O0)!KJXw3cP9JePAM@uK1MP=$qn{MhLvRW zh-P#T9O!`_BWSEbLL%8mxUJmuN(ysQ0KAu~Wm%B#1}0 z7Jnf*(BBWJ4os5su{%>R5};7|2X;yi3W1znNOxO>9)C%V7hVUj$0LJ&e~%T%{^pWX zCoHf;HcZGDJwzR!Zn3)`h-^`C%<{buTS~zAR;Zx8+*)X~FR6rcOAF%~pf;MB=0uq` zYYO!ZI7x^R1ywF@hSHDJQguAPve?9(syLEh$IG7|bm)<-|>LY9643ks%K*(8uEN6zL~dsIn3L>w;=i z8R-mdu@{(|$yy6*1a@j{)nzN&cG+RpV36j?!<@rObG;inyef8Vd_b-2)6n5l`SU7Y zttMg*XB2EUuOhaqiRaP0ZI43spB?O(%V1~5w&5~5C!JzXD6IDKx--&cv0BYkE?~dU z?zv`8m(M`Tc;<1Lp82@Xfs)y+b6V#ds8;dq^pUTu@ARu+u?$V-fxW7n$o}fG7*G?d zRV7p2A?^PG^KrAHTuSH+P!*=aYTB0}378(l+$P3%XwaPou(~6pz2HoS@XDgIKh~oYDdfS(4YCh(RTa{ z8M=p~gS-HHKgG$0Y!-PSyR-wM2Pca=pa?c>&V zN@iQ%0K)(cn?lsEK$7Abh^n zXZvf;mB);G6`Udo-|1vAEeDitwWbvc=fx z4B1J&sbp3Y8my#dVL}5|ODnovnAp%=u{Fc-Z-9g!0wNjBW@{h}D|HQe9YM}cw&wi_ zu0}*FO${dGn;I(nHDptT{YXBBT9I!=MLYKd3?DFm;Aj>Hv$|Ia7ef4{no1Ro#lg*T zaI-f>Y*F%$_&Ufw9>TbCKttVo0cUTBEo{QibV)Wgw<}^rrJ=Ed6rnR87wc4IoSkj& zlE#t_!Df|qM;eOl5=MY(h&GPR2?Xe=!Hu#GBGmjkM5xIwjU}Mu(SK!N?aYV;YG0o`-@(Og4$ouwIH7NBWcM0~^e*7Y=NI$pZ?f977aNX#FmY z6`hYYInaH(qg!{d3-i!fBDke%5r}g48gY&=;8{S6s38&71x)vX_s9T57CUu@PO)v$Bpv2p9!$ZuAy*lzJoD8P_+8&n6j za-fcGl?C-($(7?&^XsKBxZ$v{nvoRJf;3!wKajyb1a*ek)?JDIaoBDE17aLvq|0WL zf)yW&AMc_=2rk$jkbdV6Sc_CtrPnGp;5#Vhmds&D8 zv8)b32%tG5EHFN*iC9Ho^=JZ?>7dge7-28NyiPjU4pmQBAe|)|TRH?VI)gzWRwhLk zN_WC+BzF)5cB275b-ds;>NshD3_w)nGb^S2B9_l)8K|}1gy_6td4jpvDnCTf z%z;ikk0|O<({Vpy>^~4O_8*L}vjV(hb5@dp=4I6#gB4uHUgs8!cgNIDg;4PUMU{G# zqxb=pO+GKdzu z4{1Ig3Eft~@9dF1h_xW1+74`hqu#&1Sof)&2FVve+F5Lj|ly{a~ih!&XsrMkP*B$dg-x7@9_vq!@4H z<{ekvarq6ZuMvG1bVgNn`Ob8AB!$htEhQ4mtFF8Og&Whh+RN(IAnUv>T_?$x5mT`0 zG;y;?J7>{OWC)z`cJ_ta(qV#8UD**e2(t+4d`;^35dT4)^80m+cG8UTF$9Cl{2RDL>kVPc8e*oyQjkS$Ei|@GWf%_fe+UNaJ+O6 zNJbcN0p?k!Xa+*@=2szF5E7rz!L};r>EA+m!s|wTR#YFy~5xW>nfAs;ky_cWpp#1>3rs0 z+2FdkVTSA2hMCJ}!Rv>1Yx4QK9&&_?GvrIh`24%RHFtUIUEgo+@)>vC+MQ1n<=?H9 zZ?ZUNFF9mW2WPq(LWJ&L4Hqo|xW z-ps1r{q>%`HT%8^hHC$`zwW?6N4BM z&B&ZH=An7>7d*Le5nM26>X#I`^$RSLBG*H8R8Bf;)M;r=LZYc3E(r`aKEUSu?mcov zfZP{g;YWRB_u(V1s9&qNL#kl^lV1Ms$qL?~L{qgDzO9(a=|w&UM)8NdjQn`6-yiERXrpInZ+|7gn zk|7j}{d69@qM1^*h1N;)HiZsKTD?(@<=?6%UzDt7tmOfQTPo7ZPNu+k6R30((qG?LQ?D+Z zHa9}O4E1`H-5o{-HyUi0P(hdx856i=nTQJ)1rv||m@mKj{CQSBCXH~#7{)$Rk6sy^ zv_9f7YGp05L(;d-%%&0AH&a|(Z-)~(bnv_t_58E-a4}iOO<_Mc#-2E$6WaK7NU2*= z&o8Oh8Sv5uoO<~-Ri`S3R976!0rD*!e9L0RXX@F6L#c8S{5rULab11db<|g0K;Fts zC;`e*S9)G{eeo2wpx)X4Kz6;cOBi`zMZG*he6HSV$Tmi@-RrbuOyMw0s~ur z!~w9*ptz>K?%8_z8_)DiX9|0_Uh)Z)Y~dFJpbzhjV5y_dPGPj%fhb>%-jBjNA#68f z1HZPO9e#+te8h(yJXbHStuI`s6RmNZ2^6J0O?mm)6|C=n%c(DR585vKc+R*CmIb^#%L%J zw>ipjBji&JLwyGM`#HqrA8Cr-siEjE7>fRqqUlPA;IANxs~DR0QX1MvYiK`YbAZv% zf1((=j%Mfs8iqc|Ff>HH<`_+Bj%z4QBSUFUP_*XHG_7gE)q#@?tvN+$G^ZinTQnL? zE2GhzqZmy)&1lYR7|jKS(Oje`rh}%KP7TF?zL_f&&0M8vrb|OJ*BF|)PHC7Mw1)W} zE5t2E!`!AA<_^s;cd=lo48#1bH{XAUY}TZu4r2!o8aQy>m=QxBAc4rMP&(Jv!_c;_ z9y>v~)9$*Hx3WG6SDuyi$}^EymV}PVm(E8+rScUQ6Ak`eKKCjJaaDaJItmmS2|Tp2 zzHoK@+*S3t#&1jH-qEtB5)9? zh^750Nt4U};YeNq!q1ZMx+8fn9dWU_%3~3D8As)=`|z%GheRBS!$XXlP<|1wS@BVa z3ZFSVb3#z=bd{3B%|gl;$@mF%$p6gYpHPQk0hMo! zk{(G!ruhz1K%j+1%S*s7%FVqmRN zZ6>5M$Bim=*ey{BU}S8kkBU@1Hvv9YzpWmWSMAcCw>qp2_T152`KEA`Z9OWKk{=O2 z1+Hgg9Iw?c2_G)?F^7w%6hVySRp-hVJQG~h63S@4L(<*$XnG~-O}l5Jvd}YCnU?99 z7)|y}IvNtPCa_=Fw{b;aS ziz6-wHy~y=Sskc?UfIb6;|>|TvH7%Pd5;{kv_C_pcKETp5%x`{Zcxl>DC@&42f3zWZqY zzN7ZJOX>~EK;nZ@FD|J!uPcQ?wCRXqxVL7=?RKm_Fcjoe``)bfZK(EbME|D40A%#c zDxRJHOueG7m9-(06UPK5`@hfHxI92^_w@MN3qJ0?f~IJ3pceZw{2Ffw2l>STT>4@2 z@46}WShB!y!x6^Cs&9fR<+#m96}>^@sl@xprLLlIOfB)}-WMs9a5uy&3$5(dJC4u? zN@b`(*%^9A=^F|w+EA{X*i0$RzG1b35e8G7ai}Oz%Jyz7Q~!b`Fa`=Az-B*8KBJsO`+r9J ziQVlpw(8_)tLKcs(|o_>i)gv6yXEEx_Gp%1Pz?-h=Zu02@o4*dKT5%Q$=PJllLDx4 z*F+d%>8liSFRijWZ$}C&Q!&Cw+4S^nTdy-hMdl>yL2>g_vt^uS)1i!$V3 zdH$;pxmst6-lk(oMkF8iH2Kto2DrBuWY^xtNK$*;eLsxQeCOIggzVvdL%d%$ zX2H%Q8;i5x2GgvOv`A{J-I&E+Ba>6pl_Iq)Um3mM+LTR~f-WLATtO-yM(()=FQzz+ zo|Os?M{lzyl96wdl3Q0UcZio$_&X`wQeiY7PT5NJWdE2V4S*ZeQ1<;b*pMI*C$=vy zU$%U?XI;!oxYNCU*h^`*Jj=`~w`|AD0=0LoGp=OA%dN{=m*tw$VzbsbZ%SR+TJGmS z>wuk-4ibR1tuN#4T4qK0X5TuQ-uKd)!K`zaXk12E~1v0*YJy z;__EK4&~`kZ}=nj;#OezhH$LVhkKA4%Kkc~^~HTF4qqFQT_d4_2&d!!+&9 zc3#7*?0B(qJ!L%J-Ou+)%V5@vDbnufMB!96oWe(@DZ-9dQc|U2a3VLXvMS1TI83rH zU%kmNV)gwmw@T<`%395>hO62tE*s}%{6EJOzqrZL@=E{y7|NaN(|Tbt*PJhmFw#>-(H}S1~fF9dPMG|4g}+L-)oNCOT`Y!bo&KLZjLa_>?hB%RyRen zQHx z!t90n89z1$+U!*+O7P$l!1=Dm7%*UDw{omF&M&G&>!kul# z1l`GD$L%OyljNc)A5FmzJ+6>SY76FE$t~ciBshQKAXiQhI_nq~E|*$X(b)0oK++Ff zy`m$y;i?Bg+z{#3{To@1Thh7{)-D=1wWt$Tx288K3omc$#Q6Ttf2`#wwD_f#qg}Do zmy|rpLt$f0aTE@h>5s`(t+Q-h46D$RvE)mtFqSQ(Xj~%|sJ9ZoW=A_5U3lf22DePQ z;ks!f0q>?6^03@?$OFnL2(ObA4qIW{%1Nlr2T4Q-0nVyG-{_8I?@j;Sms6Yx-P7dk zu-vxTL108g52R>9Q@CcslIQ)~&ju=q#DDM^@Wj$JBiFMp|8fnxChOJp?9z4XR%I_+ zx;}gDnz6kWyu6mYopI*NFRy)>oy-nn@uB)ISe3Q(l`J-U%_~_iuV>dgve@O>udJMq zIBnUotaa-rumh6j_Atc*?y{^^6WE!rETbsAsvuKZig#h~i0XT*6kM-XKDDgysb$3WgL_wa z2Z9Edcq8|7Q*D&4LHDX)sf*bofA5ZS#rgIw%amfqPvrV~RVP2;kUNYUh`QL6og z?GtLq-w%fLzZ|s9W;;8l#r@5j?EcHu?-dlbaEvgF(_rUAakP7A3A>kdYXm>XARzQ6 zLNt1N9M{JCMs-R#s#6M6`IW?9ZB>9@9pKjlggyLPa57hp8?ePHy_Q9hG-t9=yj1-qfmI+h3g0JyRB)c*>m(rjqB^( z^`Sl8#{rR7X8b_WzxO`eXqk%go%i$h9F!XmhrS6$cM&zN?l(w%_BR;(Bl>@E1gv5j z5tNS*K{<|4z<5xA1MXt%KW+0oUiX+Erx@F}cpj^J)UW(X{%Kv-Hkr+z>i^2eXhJFS z!#=Gh)F7w2wJ0uTZ7ZMZw>`hB&gSQBe%Tb_v@sIdDKjzc?4y*Vhg5skD#UB$CAB&(k<_W(s zmi@&x+ovB8fJOpvAmWgyELS{ckv}b7N-j(H3%PFC7ua>%Z2T6y$~wuevK7yYll?IIMlT%{KK&@y*)WEu{iu%WA+vcuLsLqqDDEA?V%Q#`fJpkoal~a2zws z4~yH%qA@ebv(HxaC2g2zeCVX|4GN1>{J@*^C|8b0s$XF?Dd&Y;bYOF8BtDUBgOWpU z!J~5J=je_6IJQK}kJ$VocGXsCI9hOOYkd?k#8C7mIBo!gqgya0#wI%{WZmk#!S4Jl z6eDBnwquwaC!FNQ3%T}+)KwPBrfeaoVB!~l08}=olE!psOpBK`+dbpQ%=V}K1W3iQ zFK(3%+W}14Zx;R5+6)g+%`DCwfkih$;81yHG{PIKCI?ea9brsSw@tB|7 zdMp)FyhYD>#h%`x=e=xdh2X|wD)8tzj)mv@l__aG@q%dtTG@Xpb{pA0ZgVe?Phivg z01`3F!2CoMY4+I)+@SaK-}oI)Tp$o)EEo&uCVjm3n({s8MSuNd;1HMlwI zw{-ULcBFWvo3+X{cG_o7V+d}Q7~8J_A8!e--^w1|VY{~VheL{HXZg$fdVPJpMPUsz z0E8iPMYW1Q=0^`3{K6$NloU|okNfSI(a;9DFUW|W6haHlfAM{+JzSE)_lVJ;QAEV;EN&5&p4#@u)3Z{6Juujjf2rmZOwQk z4eYoBbQBhN=T?IEOuxX(GhF|XIS=X`# zYMFuXoz+ERe1@Nt2u-lD4cz#WN@iEuHD0q#rnvDCR^sYiyu~lB*~LHZmj}V#GG6Wr zyTy1pxxjY#!@OyJSqmwZD`aw43IKp`cY*vlL2^4pS@ADDzhZ}VM9gp)S&OaqL*ZLo z${_q-Am>rr`6+&k8%CNi0tN~rYtNq!gnUbP6eb3!_7eXaUx7L?fBDH?NEG31 zwqhGhD;gTlwu{MLXP3ZZ|L>wqd2{^iv2E}OJhn}5EUEncS4w=@9DkvPCR5&G_kHn| z1X~2zR9Nh7h=FR_%2i8>>9)_%l@~*IdQE<07u?r@GTg31ptGvS1G4 zoc-G)rPpLrBz=9$x@=8dW0e$1Tn`YQR{(-rOU^IEGgaKWcF=qk3jevvvnE@^pRDp^ zx5si*JS*BMZmMS`-&7@@sH!_%<($&dSj8VlQynL&I*wP7%hGknt8nIcoMcNe;_0dg zEVl5Y;#KTzmlV%F@)7C+vhx!m!EW+Q$&TZuVADKx=1N)n-Bjg4P{@?vlT(b}RZKB9 z!;fZ4-H9q^L*1XN;5g*{$aw%}bk_cn^gWyaBU$kzE0$!@c9XzlO^Jf5YpRl)zMCpH zD2Gg9Qx!L5wU$K+k#&sO8GOb3jiMbV1xCyxy&)UmVxV6E}Q#=?+ zZXE)-$Winqxv0GsyCjo%vZ`gBUC{D7tH|WeA>2{7vr0&CrhC?L6FYXIO>UiMEjNLi zE0h^P&T5S)L>!C24r<7FSDH|Wx?D)F`-_&m<7CuL*U>u$W5;ma!0!Vm(uzh`~4 zwgsu}q&d%eOS_g^FE!T6r!W8}JFah4p9WYLe!V5C{hZ3be zd=IZ-bq_BdVv-kc+%$Ue?w6DTOFOOu>3oa6BE15>cHaxM)%QGf)6gV%h_a?)A(G`l zf{D0{8gyto6{noJ0D@*ZCJ?fFJWAzbX?m9GjSpcTf@xo8S1%j9BH_Hxt;;zd~NV~!g{Mz&5y}ZH8K3^;*di4@X7Y*LTcyD5Y7l)H>6ZkgK%eIt` zP4rq&q}||*MM9^+TZ?SL<(^-pfr;xDjH3J^Ki(Ol^$I#Z#><*Z$(CUn{7D{C7~AX; zwz5jPNz~kU@d>{ii-SV4I#T>Ie*RfMZ}Q?5lj0;lztk^I_VYjYgTB74DqrYtYs-)E zick5KpBmDB3ZObGBE}fu8;B4`s$va|fsXtB$FSRK@q&>5Ebh%5c@#~d%f+??qg0w~JY(Z*aFwnu4hZXT>e3|fjb@Ub(QlyI@vOC*`J z_1}|)sLvzTBWaK#Mt%qV&DW#BE}F{&MA?mpf`q6-=a!B*6Vw!l8^J6HYvk0 z#wlzRa6bar*^`~H%h@9oCnu2>@b*X{*1js%D;O_<^p;G(F#1goYwDVqjMtnTX#rI!ju>8E9Vz4?8;wYh2fN|U$9XFPVmkqSnGAir@@S|J&VO{uLt+kHVp^@CqtzdP*)3A{4Z7$J+SW+wMuO40kP$OK zap@b6Rw|F;lq>X9gvbQ#Lm(A4Iv^MzomWWV^RKy%)j4#eTx}D1%#IvrBBNK6X)s z25+#M!72iPSCw|aa#Nzti^IK>hSfT6392ojzcR?W$gPaaculmsqXTOzaaY9+tI zAA!d%E(NIv@fzSU_>XZ?aTE2?{V`r=o1TJ209=7=lb2*CB3qB_KKHUC+>3nVF`-2A zCIA{+yU1I4+Um4k<&qr^<669nM{5BvbCOj|@P_(JLtwr%c&+4Bm@V*=EOk>R$8QYY zB7?VWQwD=Kp|q4bq@Jq{M9w&Sm^$OVvaS=-1%8cqgG==7K0P9D_n94q+#YLAa>FIE zR5}TJabl#Ry@$a&Hr_in!HZj?`HLcS_YmML^79L!?Yne&3;n*YcNt^Nujd|E=r0Ay zojkis?u%DDbVZrsy-NORzwdXI{8Je8vW5Nwi~Qw_{BkXx7F#Uz_&kF*FW!q4#xCyi zhwdn^VfB~|;$Uo>KZ8SnF7&yg6%ujU#QuCIw(KCU#eUem|6=vl!0L@LT;g|NV`{{F zz<>T(zYqiFv^`oLd1vYkTcN}z?|^hWR#kq!s&?agc1T(Iv8s*hrB!U!F*auhydQc4 z^bBI+Ak5l_9aJVQKpxk?eo=;<3ETCF?eKA!BqCdrh}h-EM>m3yvM4;10P4F%ptxbM zX8>7T9{W+5l(1pthU^WiH?G>aV&fWIAa>tjwVz4Xg+qj=FJWVF+`l^LN1w1!Xz;HN z`Oy)Hu30bikPejx{bkU^ZhtE6V{d#a?Phbz%9r@d7W+3!8$PvLJTG=s`k_ZSI==FA zlVc{Cl$pgZdK?=ka1(LIYeH`F1m#B+6S5|iZk`atbMod1Cg)iZf=p+E*XsYr-n+*& zb!C0yCkY7&0!9SIYmbTwmA27Z#Y+`0IAD(!FQB&5Hn!qKM_X%ar=97vh@6yCL*w*e zitW(G42N(^(Va; z&KWX)ccxGfJ-Z8pKvAYoDIkS1%T6F8>d6!^03jaOeGf+)uxfen)Xr5{1?=N&Xj6t@ zJ!O$OhKq8GPs-ng{oe_EDYHw!ri6^!O8!T?5>uNmLm23-?YI!KP$NSpm^CNx&7bl) zF1Wu4AUwiE50Z_qw4ddkl_p?qv{K!pi(!frSgeUBdq+`1ApT+ZHw3{0fHRxqv^&h^ zXKcVk7i4UkNW0MsUgd_Hy9>SqQo~TKUB%1Ak-Q2_{?fzt`}E?&f%+XyAo0)!0vkFH zZxnJi2`E>mJzOB<6g~z)BtlY}g#G7*&<(;aOngibm8b&1_7@6 zR8W+cg!C$bs7Y!tV3?>xA|sw}9S*w{GK6s8i9o&@0YRiq6G%>-G|C1^P?cbV#O3k$ zyHdM0#P;DNp(k=E=w&CEyGO9#`tc9{1-}TCR%3eFqpS~kIRVH#I{gU2o0(uZxS$*DMzU}0Ium07v|0fJ=E6D7riSNVl%48_j&0a zuK-rLNn;!oU~vrsd46m6=!GU3X4}NoCXoe_7AaT4wfAfa3`n4y_EafG5Ft9xfEHZNOfkSU6lFSf-KJ0!)Zv zA<|YT^pptM28$Mfn8`Bh@SGx{6eyW;0@C6<`y74~!55eGaE9rz^w2GICH6!g%G3Rd ziP{t~GRQPB;2_l10(Pr}R!NG(+XX}S2|)~c>bM|H!LHnNR&Wc+s|exqwuu6ylMsoc zLwd5B@m}EiAO(Gdf^tZKr$-i>y|VU?D(-a%_?Hx@^W5oIY`$yn$F>{*A@k8b#@!@8 zNKMHeO_GXh{IR0f1QhFcL<{uiN9|9Bt`@YD2-wKR-`z@gUZw3PLHsBZODLoRynmS9 zy+!~158!w~S3KOSEPWp`8dqM@3Ab<{C@a~^Yv;A1NFrYFfOvsQgJj`fgbHREWx&3H z^qENhdD3UIXCxhMMOBB-3MqGr2mo9XS~Sg6Cmb#iQeGn?mZBHvmyhxvo6ZTm1K9{Y zQAld~FUQOZ=2#wR?lRC^tOD9$rqu#AZ+D95fMa?);nhQAq8i#3^JDT%N#3qNNl5^q z{#E~=SCdblVA5q5%pWg`Sn~Fm|&T>pN%lQeQ39ku6V6PV-uIMj0*#YE`w~R?yEf^ONaMc|ZJu}H$pgt4AuNwrIBOop(5gGuPfK_be{lfI_YD+d1 zqfsFrpMj=+%0DY6;`^Z@BEF|w6}P-x3@6~Iy5C*1w3dMRZ-9D9ZxN6Ic&Hnnvr338 z=q&=a7!JBHCbHm8QTiQx-64`Gpo&XtG#!{i@OBsxo-Py6B7?qWmEh`!H~QfobhG3V zl?o7!kc?!3M~wzDuj&M%S$WlsJnJ0_DLO<3Y={#~ZwR)nf@#Zt)d{%g`9E>a9%Oq% z@Yx~+!erQ`fbqw77e(@JA-`J$`(?6%+J=h2OWUYo(=bd}h%B%p|K}uIy;XQK4todl z=s>XLf370ysEZN5We+^;Q!I{LXn^e6|W=4d@V-X3~df(g)YPAl+C-i~08F ztsh(ZTo@&d1o{C9#g|I^?6Lf0qM?z2SnY2XQZQ*;B#Y=eT+_#{#DFdbiTO`*CWFq0 z6eJ6juA$ZcMid?=muI7UNVH5^3dniUw~pCw(tgM7&yhgbGSRkU_7L(OE=_VPmBwKT z5q9BmPm{C*_5wGdkp+_Tzv!0sU%RFCAS4eBcuZ!|Nt}X}i#J>4(slPD-b%OT+b=?> z4bBmgZ~<+Lz~m?M*X$ikXZ>LJ#|#nWRIs~X0Lxvfn-e08QY$i)6U0s1=)*GA}M!9>GMck65}XV%d`QOPCjb^I~+w z>J4k7)<LsfpmadIi&Ahnmg=LXTqE=5?!NjbKM4IK% zFRqJPANAtu7gxQwI(qGt=(Q0mqBbsLUR)OeN7xaom#5^7uzT4v?U9zx?6u!Nclbcw zu$)7-tRGh7U&vW{_^$29_nKp0{9rmd|Hy>nhU05&f3uymnQghY4}ZwE=Nw5mw&wfr z`0)5t7|v1D2yfY-%v0te^LWaC(mIWYa?oc`=8eNbh|_pXTK1H`58@7ZDDWKNk&5Re zh0J5g(g5z`;#Qt@Il+DJXd6yzq#jM-P8_@DFLY%A;@WxG_JR%grw< zhcSj&)+CB$=jzYb|LCYGchsFaQ|_p#cQn=^uCc7HuHrOIxU0)*Dl2|GQ&v|d)}1M9 zu5PHQZa7`m@YA^p@$9MknzN1N6{m`8&RWWGe~u75BYeryWy>R0{3bH$1!mRi=ykCQ z53RSipGxI9QZvFwDfjXp=B-};^47QZ?D;4$`M}p%M^8Fxo7=hv%1+_XtAiYPt*dXa zP}Gk}C*mk*~#x!%Mrx<^!Kb=gPcOFxur4r(v@Ui#`< z_efPT6W0|zg zbMzanYjP9IPkz-pA?5{Do9C#vW$#L{?{<4BR~uD(e}vbULV0dV_2IYeLDE+>bB=~y z&D#5gr1JWk_L~<9PvZM~FIRD0IX9G1((}sqCY3vXxB5UL%4nUS^1_d|%BOY5?>@4u z|CV5eMGi4Vb6t_>4bx6yTY%FO+lH9F>{aX6DiQBOA6$a_SCaUD{{G(}z-V(AHk0{A zfF6|D|1Bjw?EUIr{~Pyj-_pZz4_`j<>IqVwip;|Q4}YVJeWtz+nw_eoZAw)-GOw_bXQ>sEckxP!3`&qU|&hG@9^2|yI?dPo~+vc3-QDcpjTP{H(+kTdfnZv6=vfCx_mfne4CrywOpi0O|)f$RDp zNdbd@oAxAbsIbAo{PdGGGf##-HwA}|HKjx@9oFTmTV#rtTfM>RzA{kaCF&r+9l*H% zq!(-y{1W1|lAqGq9WU55RV90cgYk0nEhq(${$RWS%>xotQ34%Rh!;l?*&A1@$n*3B zFlzwdF$#4N&+r304syw`E$|Y~cnjh>n?@57Zu&rwqE=}%CXEK|(kbY?R4xVMn$cBN_$?KE zU`rjPameARKz#t)%MMDs(gFLV3;dU+M+zu9hZLcomf{~j#4chNCoW7}%HM;zfNLJE zpxK4C-_V$(LxFMdBES!ib9)$A%8RZP`-iTC;zAB8a3@L1Yj?U5zwb^Q{BMbExZ*Oi z)iyL_`mWVhI0SoewW(-`zhNpIvK5ifVORoZO*vRJgb5P*fe@|40jivq$C$s^;!)tC zIp`r`_V;>Z1qe<-DyXS?S#d0$JsxCYX>cPhmW0b z$07RaealbX&R$E!Vat#G&i20EUt|9B=G3fHyvxk>xam+`-*sodrK#h)L{cn+M@es5881tLsOviENi65Aqd5lj1!<=CFJZ5_VGwB2~r-&JQ zoY59A?Z?VW2J>IaH_gd&6BPR%JwrWf;4qVwqK`Ggd^C=IAdXnbkt!n|E7_pK>* zMt?Xq|EoZ=GfWNg4a3NZf^|a5+&untu>GXjh79zxt)@>Ly}03ZkfPr%f;^2Jy4)xI z5v7K1$k*=I{XG(O7{n=oZ*ItUL_qGgSBQGXOFG3zn4ZrIjmg)29lAJA_oai8{(?MV zZ^q$O{_(*!uF@wdY`Tb%E9yspN7ar0x^Q}XjC2a9Z`+ahX!dSdAtH4^U zrsw2W1?z5i+Ix0{<}t4qU{%3hrsHquSWhQp9rs^8f* zh)-A2)6U-OgPoRhx33N&6NLuS_kO615+^>c2y)MRKZxU)`lH-$$W;PtI99eLdM-RL zZUq|-Yo;Zz2nm=7xuEF4fACLSHY{%9D~xwRUCmNBN?ith5txpTmz)KT2{w zTSHE=T5u&}cr`Yo7Pc2KEY+I(a>ME6$LPrWxSt>#7k!1(@(w`VGMP?3Mn9cz8T0se zbmB6^8IC2D2H5WeEyD^kGoPeG^%g~QRK9D(3RdN#k|dp+FTpQ8J0EWD-Gwf>Pb^G{ z1QzI`B0R#iAFLA~RSD0-ac0T<5&@>^G4MM2oz6na76zH<0w@XQ2|Wu1(yTH0j}zP; zaJCmxhZhJi2|xruJQk7leS>Y?maDD-KrC$i=8;%}r6~^?Ai+G#$mZmH$+x;1YQNi& zXrF<(@DOeWz9G%-giCR~>yQrp&M_R)5k1jOUuI@LemqHHcA0^>_ArgO5nBe2OVTrR z&~ZanRZzK3X)rK99tAi^6oKKzV|*csQVj#{qcTU*Or<_Qgr&@G$=8Zc1|;I}c~Hgv_bFb|$w@_9=rpW!-6=$aV(vnEXBaz>Zup}J?OD?4q$ z4%rU1neEKk z8e4N6rMDd*fWplUov^PVfVUBFuUNJ{M1n&ni$_W9uY=3v9|K#&-z2NtNvv`yAX*8f zHG_)B>>n6RX+F^hgZrBW9?u5ea2mOcjKt3*7eZqBNL-Go7-9RPU?Pt4*=0B+zZCS7 zo*`@mU5)$x_~Ts}7S{LO9e_D<#c?FD>TtV5-Eq@-!kHD|N-It2K}xI=Z}rw4?>&DU zrfYgPeYOl?#eE)gzL;IovD7+5x8zIOsx{%#9WQBE63|QcK)lYdh1^oFtb(B8$bu=w zk$T%&A?S0hoWDm0xoG_030$vu2tJ)Uqw!K9QzNPN?a5CH9NBy!3JH!BFRGgw7PTpjO*8q)N4b z+R*63bA|3r`I535ZRUc-5$55Ykn@I-1qM_JnFz#Pu&o7bf%Jg6j}WZJ=^WFmLbQS; z^%4$GCfbK+#o>8E$}k~tr&`E@1$|QTPK=wTwA|b2gC5!AY*PeL5A4IX!99xAC^LB1 zQ~U%1*wZe+k~bGFC-6jr^H_RV5!R*x8Ht0dhCm!ZzGd1g0Bs!4OM<%{l_(Rf zFKbi805!~#OF1GsfBa|w{ad@I=* zE_G*ySL0lHGV;z8_@_zBesnhzb|m~d@?Ak%+LAAp@e}~y1~6evK*j1DjTM%2r{M~L zI9M>5;HfiPdOAB~IJ-icnCuk^{hyK^SL`y)TZwz?@SeGXUQRfgv=9k5E@g>l^xNzp zcvwe*3bqvPD*RjFg~CsYgrd~K83h*#R~PvgZ7lrp^x3lIKh`y@F0VLUQ6JGzbNcM5 z7hLWiHr7?3=7_U3;Bg~J=#S^h8Y9HYjcC+*@oe-{)bttQZt33YSRbuSHBuEgclCzt zf8PGt_SDZ-|2gZ=8?rvL7k_rONpaMVYiY@kSSHTYXD$J%gFIy50oQ2D5l(yNn|&=FUelIM zTW%i?20^;PEz5xa9Td$09a7-ett67qjKn34%*~TnQNmq|>i_aE!T9gVJS<@|@}N%k zYCY&hVG87^Xvv>9RpIb;1Rt|qtO#L@qC2V}{#)HR7YmUC^rgHC6T z89T^qRo}-_sGthx~oc~U5 zfi30&cKQfx2@G4pdc1|GAvOkz&>kQ177OLETCm8mKqT$=!vDjBju=ti5i7;f<7%ZS zHX1*$a>8RRd9352iJFK$T+58CCD)583Zkh43B+68Gj-(O!&*^bR@Cv;FwP0j%Mu4{ zAItT~iL?h`=33g3AS&nub?!>Uj>qgavtA73*2MX5ooDTxv^QbEOsD#K2L}7wx_SpK&i?+s{z40t zxrSRy`_?m0w$iI=;pQ~jQEIp5`mr@tc$`h*qP@)1ymTu1R&A9yr3ybu(s=ao35V9K zit60v85qi~i>tH3iJ+JLI;;c>YN$PR2mCr=27yB@+vIUEYz+23v0xJA^!Yw+sA8Y} zDLuNU?ug}LBlbx&E|%mzPI5o(5YVjifG<6!o^xil)BJ7H zQ-Gr4-k`I;7aEO1Q1CPt^Z|N#$G!sz9sAG{$WdbW;cP5DwvP43L;8dbAU~5Z;s}CW zTOCFmk9Ay3Bo`Y=;>MHFy+hs{^bp=K&e8+&ra&0}X>VbX=z~$g*t&FD-r3$~zRlBk z!*|6x@go0-eS|89=&WcL4!?2dfUt*a>7UO@xS5c?56^$CHcR_$sk`eM zb|n^yv78HfO*e+btf~#<{NhGsb0gzMV_4B``tD@|8*5-=kWQ?lJ?ne>2C0m`Dx~h1 zAl6h)5UVW|?NdhwU%_S4q&{gOkmp>IJ4_mZU);FRM@CbD5kz7nIjuuLc2KWwL`5GQ z@lLE)mM-(J9dU{8FHci)Cd{MDgM&78PGrAeJg>uINQ6r5+ zx~c+v(BkdN4cc2(^ui7+&I{Bth4ly~vE@bP+uR>SnLcArmGqB-;{!oCTJ0|1>=3o2 zwyH{ZN^+|)Ipi+8CumPJbk$spmiW%~Pu@o1e)m1tN-IJ>XZLV>z%FrraBPM5FjAUo4M|wJl)$?s^TZE zN80MF;>MUgwsz`Z_g}iV8xsN}A4S21joq4K96G-cdb5ftzCn$26+9t7@Tdx=1Dq`? zUYQgUk1x)jJOc1Ah=|1qrNuqUN{$;Uzv{eZ4z;A+sC7iB)tA|Sf&RK_MT$AV zx<~8}`doL5zI>j0s5I$XxR{JseUuIoiu>D=G&E!sVw9xk&e7N zAkstP@gITWx5Ue(9u5=*hr{AP{IE_8{Te52B5RCY4f4{KS!e$_LRQfy z-3b}4Jx9;G0`kR;3ZW$rj*?`0hQ5t4kb*%_#o?KCq>fg!kCZ+@*YzR29 z@ru-4`7rY$>0p*rZq+fPu7Db?w`f&0)6PCQZGB`#47c7HYgV)C4bGUzjv7Of*v_40 zW4RhOhS}aM)zV)#OLyqh23(3R5t8y-7~Ka;O2^B%`JqzUDs`f~hinRKVw0=c(_Adp z;TWvQ0Vu+sjS1X3qO%0Ko|5iZ)Je@ZubBTK$sM|afh(pt%@)c$NH4n*G(xM{wH7N- zG<~Q!X4BSYu7<3w+}XHTHWnpXh9&7HHm3}T_YzN+ zde}dSmmBoV7fsBcuJB%LG*3w?^d=g;TI1^bh!yL%Z;jm=V;&Y5 z7aa*cV?8>bgrh((KaN*(CrxIx7!kNtn@!(6pQKLC3exI^frOx5V+?;Jl>eO8cGCwN zxLEq@hG1zN$XkPpzD|+u;l|x{JtPm}gT*c;wUK?F{lGeg-x_K)gj(N;qE{`Fr@m?* zhH2?(TLd>c>}!~g^p{O+P2yR;kKIL2?gqkEaxoSDT&y#|UTmJ=hWbU|aGL0q3m_!M zcGBCMxfo@vlx|%aBxyr|{Fu@haV4lBRJbF!D!ACwiKDT6P3gf@_OFTv~clAQx zNl$O(>Xi*sm6C#f`XW{*&_Ap|_BWar%E`7j>|&Di8WtvH3*ZY)VmQ0T*kY`+ zF2-qL#HAq=*PUetZfEO^YpRXW1ol&-m1~qOq?8H5LV5Q>x%4c_>_pTVeEi|@A}2AQ zG$9BunvDY@0W{x4cGzqkDFPo6b;wjDwpfD!Pfjil$6@q>U25%}3|#n5Z@GlwL|da4 zh;sH!hFn}9Nq96YG~+}ofb>(>9jE0^Tla0JrK7JOfZs_#=K>l1*2Cni>eeSlG{)6isj zCUhC}RmQy;>5pW(OPw=A*r-jjDe8T{IiB)*}hE zsY@wQo+t~JuA@Rf;G^VQpi{H{1>tHofaz%IEYOldXcPkfQIs0qNR>gaM$4)zDUoO1 zY+-CIC^SjU$&^a5zfxI!tR!{(vEkdO)RI(9r*w<{dmlZiHCUQn#d*Ueqfe!GuKIvC zMg;A3YB)8*G?i-eRnCVk;k?=6R$m~ovEJBV&N3>&(h%!));yZ1O)R3;wUm0%e2=Ik z+LQ`KmP@YkpuS(rurxP)^d$m$zWz57QGy zEC|}3j+9P)T2f+c2TCHS4Hm%Oi;dP7&4#!b^GzIPAk2>!MlvZ0tsxn_w0@jv>Sv-4 zmYpG%1&@x;a+lFCYzZY_Z|D)`4w52Bo%IOp_@heifGfyByA_&vkLI0LT*@s zK&0O+IxJ@2N*<>Q)S~Va%yECwfCed$IU^(U?>pf5f&5v-w(HneS#0><6<~r(O$&jJo;0`k9-(=7!BoWzm8d{7 zwe_|0bmnDt<|ng8ny4u;8)`ijbt?JPxuf2pw$7neSXbn5a~%&wO+}fchrXgCFWR7Ysg+)J+``ev4Dks%{Sy7RdYA4FEceR$E>%h<#mQFmLXWl* z9p+KvcuGB@sLqd)FV$F74+3dQ(<+ypn77$uOvwDb&8jYZs!lYk+GIUTJRi2n8W~mV zlbR+^5C0r${a(+IDa|V1F@=|K{B|gtesGSNS*xYgVT&$#s_pM@l-}R?zG|U=J=L~( zvE(_b-+PV9bH<0`^=jE)#xz`#RgbxRNme0wj_LOfyQk`z@!?WU&Qrft^=lNWUc2;R zzpO!0srwU1yXIXD(U?@j?x{{MZB{8YCQo_4{kNWyEZ@~?O@?Y>|Jbj_*cU9-6e=dd zef`)Og^EKnzF%Omd~cI?$^J@Zc+lToO7uX76Pkx{UJ#cIV@HOiIY(uuIY+aPIKK*C zZlrU#J)jeQN^o6Zu3v|rh&3K)I4HFxV*@;jdxYKZXnonaGgNXTB&mBSigg+FVpBQXeGWS1)H_XePN}=?8eW$*iFJRMQNJ`a zI?A1WGU{MMO+^zGTnmSw=TOdri^K{{UVm0b{iW&5*~SXj>%pee6*bT_Qy(;)?izrv z$?Aq9@MGCrZvI^MS3SJW5TXDrk*X!<#Z^Rt$);PF58x zdS{#G4$=WRUR4HfXHOtTU zPx{dMA%!$or_Z-G%9UffF3BqA+F$y|lg(7-II_zcmoXO6PnOJ|-U7d|x&8;nV)Y|G zl>wFGaQRpdVwY^{_k2L<#{{?F(xGE>QePrRn#Z-;{93gWO|brdc#fWO3I5D$q~TG` z;(%$hniiT?{6s(3jLg#;6`ziIzQsOs7HK=u5^**&;6%4@V)RvqO!RtcOsl8_7;yqH z_0eIaSZ#DKPga>Rv*b0%w1F(0;%)XjKr3TzsZ&xV9^&S(7XBA@4)0{=T8417{A=oi zTA6q!EpVHE)KDCp8D(Qs=-UeBRwG3hla{J(zxM!I&YC>wYpS(~c`-_66ia@}TGmjTjE{gP7CvPS5`bELobR zo2~&ZYodG3b&L}4bc`1JF+iNQViY&RIodqH`LSw3J6R2=Czi%USsGg<=+#EKG$Yr~ zHSheYD&$gkx3*PsVs_SGc2=jkq%)weDDwxDc?5#1;fZ8S`S~lo=Ong!quu0lK0iyl zS)D!q({rA`bcHM$LCGf!$#JPisn&;Bf`pJu(p=0Fr8@w+uhtaGZ)?gFw}y=gXrbI= z$TndV(Zi@R@fN!fjkiIg@GgxmWnKSgg9oZO)qt0ks;c~u8lCz|4gsT)Q zJ+Duij~C_AH9vUXMg8!le=caDb~La9e&;eTKRvUZ1mP`c9%av>BU{S-?eau_5;ZS7 zcQ!@8-W+BJ_%UiTYaycYR#5iaQ)fgl5aO+QG0-$v+ zM0~ANPPiJ&!Ug?Tu&yYLB}A zgUWNsIaS~$+2E`tKd8JX&A)YZ+TS!T-f$OZ`sb6P?~|_DH-sFYd6&vmVDc#N z9g;im$=vw`-_4~m0j``;x?UiLr^Z ztH1-#=1ry{dB*Hq(mExajDV!BceI-2Ay0%X)`TCB16-K`cQWphvm^@(M8<4xJp%7s zToD@-8|_iCLHgJ+6ew)~hw_x@3$7+ATarhOaLD-Z?KqVxk60J9MC%)A8A{5PqxACG z;vK^Qd6oDC7&Z;J4tue6%$4R9OB|`9N3Ps{8cz8<)1+^cnDfn!PeuQ&OLSkPNi9j0 zvkPP(thl0H65-dZ-(iII`p!k^6uY5{G+io;*bwrXI1siqR#)yYixaHbDU>|r2{~>- zveLM9hUY*RY)B1M8t9p{?0ikX+z4#Jca}hbdg=w^$ zPjV!|EyjM}Hz1@vhi0niuuIGr7Xc=DZm=7$C<|j&$dT%CJfZSph^Ip#j(}~Y;}fyR zc2CKEWV`3Ve$1z%RfKR&O)SN? z9H!`jiw=_>uD$~`)DETRTIQbTJ(<$J_8#z?%t<*r0N;l2qjrg`ozq*1HR2Je8~yG? zFWMazJ-zBYX1yLgiFR1*OE5;uvvf~pTuLm-*qA7wF(=W2C%N^}L7C;rL|~Bx&&4N{ zbhd+AuZb6b&X`+XCaFuE;s|U!d_q3X*jQEmk(nqQH!|^)xk3N6qN^|x8B_4V|$^|o8Cb++}lU4zDGz*K0d?CbAo8^p_5 zSeJHm_ua+o8D~#l|9wlx?e1=T)e(-&^yB?O=KxL2-X6bpJ39tVW!>EtNJ9qtdYqQ5 zvLokU)zlyn>oNr0?!Sh><|8!-EE^bb_Q2S*_qxdfUwsGUgzwLm#zNyUivF+#Tg&_8 zr$|yetl+M`!)oUan{difc&ZIndVSXuPFo63_qDY@Zfe3gOX0aT2zlHs zPbjk#mPwKm@apL5b|#ct3d_3&ZvG0ygbGVx1+>fkmWuKtV6PL-KF$qBllaNM*4OS# zC`Fia&}D6xP-`iyz1=m4cKMQaopXVw&{CE`WqNVLh{?~htvRPNs4&jg>6Oh5ce=u0 zmicVE=X7C552q{=@Z0$XGhmPC_d?ldBALFq3D%E26m!>eS$uAnK^Q~Vma+;uE=TI!2}-&yM{+|e)n3`bdJq5crBlnEuY0=T zwF`zTzv+0pCp+nj2`}79Ju&BxALmX?l_lXpStrtSub3wr4D{lm9TTZz6iXeGu`)eJ zrDC_1N?!JY7fc+w1M$Wknf?$GkcC$2u|Qx;$6q-_Wx1X#0!cbOy$E5f%v?i1bA^-b zrOXwGC#9HM>5uEI6OW;wMp+}JPaKy!ksWItYZ)7A0l28!5R0JB+p>c)Ds3CZ4x#Qn zsE(8ELCI1VH<7)-J;7cKwEN~xgq3RCM0R3Y+!O2*dV9D2m`r;e58YM$F)BbNU3C43 z_4s*C7BwXOtmiJU6S<2>{FI`NIoigYZQJKIQ@HGL#Ml1`wUVMDnd8@(@>b?OCzE)M zDZ9p`wbMaup=^+WRT)@MY{=hlg^{}oL*bdL5^r&yk(?@04;K=p?Zlh*m}{vNu9t*? z9(KW8(p`UqR)3j<8K7p-S zX>2(dzT7#rbHu?;u#~vQrCdA7MMuZE>8QVLbSw0KaFfCR71gF`h{+E(iT#M1!hY=H zMN0`U3LJ!8QCeGQ={4(+WeC+a(o5brW@q#{CngJYMoaEw+ z9>Dri6>+%IW+^>AH@V#yjH z5xdLI)&ID^4`l&Y3Q+X-K;s~$S&C+w5=WL!Efjv1y6x4b5wuFAS{j1fB^I)|0 z*fs{s(*PaRPE_=%Eok3f4%hnR(Ph^_*+Z^ay{dHsEq`nm@0BFBN0y|tM}p9jRR2mF z3Mp4((`mL1>_8E%%45b}MIuX**f!YN3v+E(3a&hoq{tP$0ejwp7W4bq@)NYKjn?ED zFe1RJ!8ZOdK*pa-PauxQ05z0Dh!#qCvW@=3RrGD@+`C#6wSnS%VcfwDCzgG~;SGT8 zB>nalHh(u4(O+JlI(zvbreLl*h{9S-OKPxUY5+}BCEiQ|F;yp3Nq5r%5p zY07<_!_8-`4@*W}Nxj>tyT?G?4 zJ|?CVkk!@Rfom(C<=SEK$T?ws4_j8WDbv{rec`Z3?wV^ydo>csl6DZJx^Lh%nX*%#*}+}^Pg0-R z&N=Y~op{efRLD?ym@cl}2ia#;!7_{nRoUEHUR!bM?76bjrqZj|u3o)%?b_A0_R(+L zUG(gtamE^QoDDrCKrvNy4O-ePH=SUQ%dTM>;d+OlXLZp15aeYPt+uE0Se5OWJk}GU zLFg#1)T+e5DtLZ%y$!D_k-OhiRaI&FD*Tl`Wo|MU_yiCzR8Wp}ovbyJ@~j&7w8RMs zGA*BlA23Wn3#1+NTBmf@LEC?37kAR9+Ci4o%Eeja0$;>9w%GH6$!!w*%_lM1;M*6W z8N{O8J|a@Jh+72zm~d`th+EVNHRU2b3}mpog=y;Zd7PRcHx8ExVQ((ZdyHYgbAr&i zAlM5>4WVl;D<@AkrIjY+x=_4BE%tV3#2cJCkl075ISsLo(pZ(4_O|Eqpi}b||C*f! z{I7%n=YYCHqZe!Hzt3gbnwS?mn6Dd{yXTppKIZd2w%X{hYK%Wy?3|-zc?VbhFrvfk z%~o@chs!%yN0r!_RxSC$gj>%39Q3o!gX`5QVD3<@t>G=2c-V^cJd{yh)E25!p`A|8 z?Bgk`Hhsu5{c|?mBy&yTkOTPm@bV*c-NIjR5hGD z(kLf77!UYLzEMdTSb3mLhb`HY%A4#>{)*)my#|UQdR3#^tO7Q5Nh5;#wHg#d6V1Jc zOEvU;BX>iD2gb&XqAH>ZJV=yscZ2Qo;J|HFqgj*dXO^>jnA9#VM|y&UjKEG+%gcgt z>IPtZN$W#Y{yD6Wc|ymgf42%I#Bgq;4w}2{Qo|m$TB` z8VZvexkN)t9c0pdl_b_>#Ae2bvZU%{Cp7O`Syh@dK%8WN-i4{`>Llg-6&f+Uiy}yJ$f7@%!ce4n0rG5w%wnAw zf>NVG#L4DF+@VeO{mLjt)CBVPw!_pwT+CC-SnNCv4dO1VGSoT@Di;VmcPGK>r>|;+ zpJRtKI#_h(`bCX|eGl_xCwHT3okMQl3?sfh=r8T-R?vrX&7}9KjnZZFaWo+0HLH(f zopi{mLNiq8lhvvYmekdxqMxNy0+azR1|w~ilb}i|0RXt*0)W*cY7?`n%jyN0uB@8g z4b6Xp_$7u^qm6WFNR!BLebPim<~BJG21tiX_l%buYeh8y=X^V8-`(?E492fX&)G9_ zJKCgQw%T;BLPfOJ94zsJ~FeZWQr03WyAIzRkX!=G@KhHn9GQ0omN=$~K*su_N(%WgFMZ zb^;{&pgipZ`onJehd$cprY*o_Y(J4KZj%KpbCU$u?9PK>l1L1b+~=TN=X4&QNaH#( zucMV7oH6qg9J5H7=eDg!>?vfhgbN=F1t&`mevI2}PL?Ez67II%l=@sXu4?95#n+%- z4?s&x!_DhUPnuQYYDb%WC3_X@F|^Ba@je8^Hc&cwsrdBP&viH8Umw1pDcnT^)iF%( zh}~7tu4pwMpSizdzvM}5GnmU4t#5@|Cx=>tLak4PTE{|*Pk(pIAgGh`oYLk5uT1TnPhJ2YuuQQnGo(N+0K*UB>|Eae06daw97mZSiVW zbYq{Xy=VOlfCtG%qcI0R(Nn5l&m0Z$pThv@1{&S%yb605SbV`UMlMC8B8E!{>+)a| z?DEQe74h6Y=U(&tv`EerqE+s)P=tF(sN!nKfCFZUBqDrNaBxeHQa=&iqNPyw&KJhwUK@DA2 zO2l4hChM043nQI48FoX2ER9wAVHw9nntr9y4<%2(;{G7dx;`eq8!ra7Ru2X~*G~=W zieN1)H%4LWb_foZ;Ew2W)la9VNJ3L2fX>UKf(IlFH)TV%on4_fmm|Mvn`s z*ag!@LbhMUwDbz9(5f*}nB=Zq_sA?-1f#KMV05&QFb{Xn^TT0hjTr}6PKM2oNjsX0 z*@pd6?6!Dul)*9FK7xx08LkNr4uT(&@;G{GoN#f_fYC2DMxI^x3ASCzGT zzBMX=7)Wq2(6rhWm9b%jbP~fGHntGmIE1{U%o`|}t2Au*b z01jM?mshY^HMJt5!aiMDVV=Tkqt+vBsa*UN#g6 z_34oMH`4Qa%VVp|ckDS; z>^fKNU!wGib;Jgh*jI=ua1eiFM~7L5cIqmH6dr3zJ$kGmHNR83$)q%f4qZ`W z&qZs*;9t-5>Q#TVlZAL9J38ouHn8J3@Z|*b*~bdNg#3`&c4^LzjX5!%UiqNcx#Ju z^Oh~Us@;1 z<~Mftt&V%=-ED9Fj*i3KbN$QrxG$xPqu=>p=j(5EFWnut`DWCP9dW0dVPD`8@L7UgI&&Xtvwg_Zt2PM zPwP2)K;P4OP~UT7@7kW0y-R!QcUpQqcmAzcQ(E2o%$rp2dSx2h`%sn?5M84*tay7rtP@-#f+ree+p{6SrDi1 zeGr;)VM9*)<;7E9x-oasD>r7Omo|P>TH5&D#1$9(-~W%B!3Q?pjC?xy=5J?Y-F!Jy zf73}DF6DSvUVMwLyZGj_(=NumkaKavfgKkk(t|E;-k5ap8g)JF^6Dw2Enm)<*7Dh` z-?se4u%abo#)ZqPqvBgW`u&G}bE$Evz)8ERC+$vp!QS~oURCNe{lOJsmR;GF-C3FP zHe{A)*q<^^)O4vxP9sw8I=nXM!jIEdO0=l_lHz}O7QqB zbJo}UJigD|RdizQ&*}8V(uA9ow$iNau#b3M8o5?CGFcoMY#vc<_Yc$t7^4F+clpQ5 zMjGYXQfM_jMusa##j8dh^&I)SdgNCc|59)N1d7^B1*KEZZC0z&)t>uW)#vWkkLxFOSr{;(cW~OEFpcCNBm~FaA>n`pLO%B{T7W%*gPyrnB;w)k&n|0 zW#e`6t>b6Kmrh#2{5YdsSn`6Axw=kIGwa)FI?X7weV8D~wzM-#{S5o*FU~WQzi4M( zPoM3*C8M08G7>4+XQ(Odc>h3uZx7#zaz7R9WkX+?@zkWJr#HTYAC`tX}V zVaMO%;fzX6oKaC)*WcVZo*n_uKBszi)+~=vv*#%Lj|F%J%$}o~b<|Hj>gZzS9K=71 z_}Q~&DQ7>9_kSG!AFg=H!_%E#@$BPxPgnd%xrZxWg+=VcIp0Ee4I{Y0LPegV6o_BXL9Gxx|}^7ZQsSPbSuZ z_ws>lp4=+GQxADO{bs>Yr%89!I#SavpcQZ1+PM-~qH%iM^%1 zSaEdrHtPtoA}M;n$c{qNQXjkG;M4H(O^de>%8iD3-WZtuorKw+Ks$Oliq+yIFU8~`QeW-HDzg^?p$O>MAhscM%hozwGfV~}JLE>CsBoJ=i}zr%wHGE^@g4D4 zPxdljb)>}=v&ClcB6=7KL0EB>=qqw8735^l0HhY&guu8@vl$N(XE9k!Hd_Tm`)zK$ z#QhxbLuGxL3LL2chX{VUlkJ2Mv9u(kR+#pWNRUwfnWmrUaUM2 ze5w!eR-Z`{#7@Y2ey@yQ{>B`>gwRk@e5lX5R- z_*GTaK1!~-^$0EjufXW;GW!T6!d_^Iy#gRz=0*i6q&zR(U%)G(6x{<9z-lY7@#XyB zaN$wyWpk%kQ7sOZYsD*4F=Q&2$pIOUxXbKiv!dflVD4pULbewXo0&|ebN73$_H|nZ z+pcyyiBXxJVeW9FqQVJhON=+ci`u(G?5xtN@KOT(LTE|FpQ$D=gV{Q^<$NQ|Wt7og zd^rh(h<+Tn)8Sc&#YNm&PyReYtJA!+9(;v3hyx_ROa3IzUu60bPL&+2xyucPb$L2* zr*C#A9ZC#wOERd$7y!bm`PFkVcvN~o@eo?iMBHJXzXNZ- z!~q351T7A9U2W~{IOH?nbe*93*RxB(uw-`ol2}Mi2H_YJvA&Nx7Zv}{6G=GB#N4^N zqF2xMAxaZZnorISQUCMz7y=8a==guCO(>{MJc!z)`@eP0@IOHNzYhXTQ9AXFA=>~4 zN;umejaw^9BVjpQipzN6L~X}O98Jdcyu^LlH@FYU<#Yr0Cf`dx2-*s_OVENL@-QNg zFgw3F3GRYcSyGce{f~r{zkFf*a)08`L0Ayhf9j}(8_sotu+c^4-m>n^`GYpM6)C`Smx4v+}dfe5cC#DC_;K@3X$({>qs- z6L&Hz`MV;H2%q<3Hgg|AU%E}UlC{wvWF(GH>J%0GhjufZB|GTTIbPk+ISp0JV{ zRc#zi==rBv#9)*tgXXL!<|GH<2H@vIGulJjdy$|MbH7?BEOoZzoomgwBOU8{5>dIcSxH_Pv8;8eE&_@ zv^92RBu!@-^mMV6W~~`7SCxNk*0_(RK`Wg2GKoMk?qzAD-3N7Z%V7)^;T*knP36nl zX&I2W5YeKjNRy5jAyR_YWeQTcbbrzl@4Iw<8#!Dq|1vuYhx`KA(X{s=F_Cs!m=C|@ zCOJZ+Ae+K7%=wW?;b~XY$UQAS`}0dpLTM6yZ1Sy!ZQFmpW9R>Ui2Xl3`agnzCoq9e z7Yl6KO{__UE(U{EDW7;aPZ-CB5`} z@QESdLdU?4Cg6+SdcNf?Ftx!M9QwGm%4Nx; zdtjO5T9}~{(`USl(&;aGy6XRF@BCwVXt-)Y7 z$dEmW5@Hdf(oH3hQ}s^0_U=k`(v?)~ia1^3wCBi(V8+X?@hk?d0}eO|$FBEBcFo#5 ztk+c*!|(xj*4|GRhOKY z-_}HLJnk>pR@b;;pKcU{x4Z!WvW1X;Z+yo29r@TL}9NX@g^5ZD*|B+UDq>*;4 z?U_=q!&)oHR&!frRH zu?tr9GwD^g`n#seEMxN(b}VVAoGgp{tAD-^q?Ox3g<`@+chb+?9i`qfSSX`?ea=me zr$lqW$a|nXBzx;3vbVl300UXm(z@UdOY3i4neTsm z+R}OzEUj16wNBL)m= z_DVCp%tpGf*A~`+1LBiMEO$kTlc#x{px=SNBQ8(w$}X! z+tmPxD3OTg6;zKrndkVDWy1u@Vy7xV2D?A%f4%K z6He+{*H(A7x~*=*jwUUi2BKB|aa+K>VKa?VN%z9{7PM)*5E?yk$MPLTxspxsKjY9m z4a=XdD3;IF?F%<(1-(-W208!7jrc_T)x52Gf0EFjmUc8~4=)(s+OJvPn^Lq}*dh;a zGOv;Smo}-a!%9xXiv`ZXHnqWi<-X>*yEH|qJG+|7)6rn}EY)z_$J{#EvafdvYqsWw zm#Q}#$CuiFnA3Lrxxm8j2Pzg*k1Irvi!Lo1_bf#iJg`8%3L)i-qJ`~+XoQdYo$LFZ z>(oV#T4#;75T}4Ha#Tyd@OTTcbBm)8wpi;Oi_l<&_)1)8_f}Po)xd6i%~-8tee*Zf zd7gFJ-*~IW);hL!de=It{5jDzmEM}Mt&SR8)>e9}$JY3?;_j+fYG9FyE;wF0zNTNj zhPRVz$Eqk21%Tm2jiaV%XRROGTzYG;Ual7FFdF{3%ZP;o6kWJIOAA8Xx zpGx@2Hoenbv2y{ojs1xBEP{+LCgZ#LSh42A2ilu4ykNEX?8@0yii8!3tCZvNBXEFr zb-VUUKDW<_qvaO(bN4^uljrQW`1UsJ-E5c7?Zc)qy_RDL*>u2itW~|Xw}FJ|JMK9> z)|Ll*N?X2-@6#{@y>6!|&4X#S0E#vi``ppZmN19ZvY;Vo0|6R+n2ufrUe~!{IK-T9nNCeimN8=qO(YPrX7bWOZlCc zSK^=^OSoR6ovaR7x{$s!5mT>fek|--2ZxDRZ{S$CsQHFBr+jC9XLFjSsa;B!+ae{~ zj|Yx*)FY5%E6qCn72f&U63jYbt$Hs0Yway` z*d0g;xM|{gu)}6KTDhxuSMi3c%dh_E0aPJ9cI$?G)9qp(6^C&ZE@j&wiXZhX(<-Hu@%mBV)`Oxd4nN5ffgjHgeYD@EPX zBki`!oq7s%T%b$Kg>G!t!VS&&b_^>phXiBqGaL8dt60DEO~wBig~3Jh@0|@3P_C;W zjQ-}l_?yjZ<3W2Tw7pi=x?xATy>i!%j*TP*alb8y*2U14(ivigvA@ZqcXbj z)YKm}-Q+-jW&}dX;j|pNFf4nb;YiqZDHu0zL%}ny^O4cMu%11mQEZ!YT2W3Qz(K23gLlDy~ zp=Y z5kl{BGbCS#45c&(?pQQ>RgOs;=i$6jz4EG_<3qhkSLnlTjmF zj~M3ilByI1(SaEBAZGqwjAOcK6hYA(j-Q9Cu z>I)8s4Z83|0Y<51r$q*k1lxY-)W}FY?b030l0uV-+K2pSf~0!&3Sh{|IQMmpqEwWZ zXjAO_8H%NngYkDG(xrGhCSlJ9pNm|LxM#BBo}na@DG)z;;;4ZF1EHBs6ilgcXf)K_ z#6SqSRTFY3c0L$7j{s)Db%&WXq~dx|_Fl@!=vpL9x_3_j=kFenl* z)I}8$bVsB=BAaXn;_^^rFpOK5jLpOaebKc@TNnj$As*aBxgh7KP^eTS7&gUxMvv+X z4P~N<2#Bap3~)ys>$HGRSl}~46pVI3m!ozwd`3+l(M5WQLjtpkS@WcXrxPOy!<~@; zRf8%B7pg{IIz2dBu}%|}uGGPd$lq7kh0||I2Hki^x&5#Mt8B$8; z`$Q}$lu55;eVGXr=T>aN0$9htv^BP;Va+iJ+T{_Q`G%oo2}Y28570h*>)7 z)xs~UFrJgqlSn5V9}4ziH(xb*DUv!48P_LK1RNnwQNac5*|n)ZD+RzL{YJ87s$#t= zx{PF0j;=q>AZfF8nah-V_O$N6F{)7?`c`6#oC*mNG;b1DK zOiiH$AZpm7L?}6EnhV1bQg*t&?j<=C+J~eUBPw-@OSHQ+0_w#>w?TtYV+umyFj~gE z3k@PAT_@sL1d)On+01~%U$}|>VdOwWvonB>HYMIuU9weMh4Vt%@!Cw8gC8s%+C9&8YaYHd@6J`KUAJ=O zGQ~pvWx~JfuoX)~YKxWo4m4rYu>&s!lsyOb1?GPh?}-#_U3;6}9#a4W?0qq?vOv4s zyDt!bK^;NLIMA!eJkTrSpJVGQK4A$|R1SKq>ZDwPy!^jKxq4BKc5Cmgc`mnAUIN$S z?bd~Et6C}i@>lK|IAYasbU^X`qJZ)X>7`=nh2kdsTsf#7IsW}XQQL8RJo-4tbt4B= zv)J0HM9N+SKsxl-O@D0<6}ygD$;XL1q;UL*aDKlCNi4t{@gJ-Vpn6Kt6E6m|Pwje* zK1Ge}CtkB^4?6R)qQ#Ndo#)8IeOH^cv0%4!z`6pjhwN1CX7xVzD^jUdT5Yv$vc`Xf z+g}^EKefjH4QI!+(Cq;#!M1`rr45B>6#vT$7Fgc=aK+bGeruUHA5&WYwapusS(X)) zSbq8SiYFektSI;^%bqXhS%h=>;t2?))fWtBYZS~C@75@~2F)JUlIIbLo~dN0DI66* z13C_RiKJ4)D%7j4fwPo)Z$#+J3z&ios5omNA|+`WZ4829I2M{a%LNhOK0F{{52|4d z^RxIz6Tx?eOn*|R=18em>YnAxj5obeqiBfqhl_+jG!|qsovr~=2@ekpjAp#D%43cI z*)>M^NGO(^9$9AAeP&ws$i^ICXf`)JKw>H<0NzPC)3{l|@dl29XTqc4=KPQfj=^eL zCd_DX#4s$z(_lD+IU+qb%}8as$XOyq(e?1=Fpq@pnZGeUiV+`A)0nVeV5hR0^T;f* zqXAhwxZL#sMiU*HdgviCQw@5yjSu2IARdGUFt$oK2qQQurIQj!_QezQKq;Qxqj+1W zS7Z9QP%lk7I6}!~J>i;DmaY*+Z;{Nip7FK<;Apyl=Nx)pn0bXE?#0uO4wu51<)vpL zom93fiM;5EuIXX^j{+rv&rZs3JgOQ&bX1udkbu#2Ow{eJ>Rd`;T9aKLINVX8OtOEd zMx=AZ6iLkfT>AV`4)@8J){0lb`n56f%XrW%FykYh_%e6mDKB#;=JxuXIrY}>sDWu} zD6*oK$Xvzrt1n(r|A}(^r+@hqCCthGMG(N$^!=i3b;@C5Mu;Cc;IHxT)nZ2;&2}YR zN zfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>N zfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>N zfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>N zfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>N zfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>N zfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>N zfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>N zfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>N zfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>N SfC(@GCcp%k02BCsBJjUYF1h>w literal 0 HcmV?d00001 diff --git a/src/dskread.c b/src/dskread.c new file mode 100755 index 0000000..ec2175f --- /dev/null +++ b/src/dskread.c @@ -0,0 +1,155 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +int a2open(char *ipaddr) +{ + struct sockaddr_in piaddr; + int res; + int fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); + if (fd < 0) + { + perror("Cannot create socket"); + return -1; + } + memset(&piaddr, 0, sizeof(piaddr)); + piaddr.sin_family = AF_INET; + piaddr.sin_port = htons(6502); + res = inet_pton(AF_INET, ipaddr, &piaddr.sin_addr); + if (res < 0) + { + perror("First parameter is not a valid address family"); + close(fd); + return -1; + } + else if (res == 0) + { + perror("Char string (second parameter does not contain valid ipaddress)"); + close(fd); + return -1; + } + if (connect(fd, (struct sockaddr *)&piaddr, sizeof(piaddr)) < 0) + { + perror("Connect failed"); + close(fd); + return -1; + } + return fd; +} +void a2close(int fd) +{ + char closepkt; + closepkt = 0xFF; + write(fd, &closepkt, 1); + shutdown(fd, SHUT_RDWR); + close(fd); +} +int a2read(int fd, int address, int count, char *buffer) +{ + char readpkt[8]; + readpkt[0] = 0x90; // read + readpkt[1] = address; + readpkt[2] = address >> 8; + readpkt[3] = count; + readpkt[4] = count >> 8; + write(fd, readpkt, 5); + read(fd, buffer, count); + read(fd, readpkt, 2); + return ((unsigned char)readpkt[0] == 0x9E); +} +int a2write(int fd, int address, int count, char *buffer) +{ + char writepkt[8]; + writepkt[0] = 0x92; // write + writepkt[1] = address; + writepkt[2] = address >> 8; + writepkt[3] = count; + writepkt[4] = count >> 8; + write(fd, writepkt, 5); + write(fd, buffer, count); + read(fd, writepkt, 2); + return ((unsigned char)writepkt[0] == 0x9E); +} +int a2call(int fd, int address, int *result) +{ + char callpkt[4]; + callpkt[0] = 0x94; // call + callpkt[1] = address; + callpkt[2] = address >> 8; + write(fd, callpkt, 3); + read(fd, callpkt, 2); + if (result) + *result = (unsigned char)callpkt[1]; + return ((unsigned char)callpkt[0] == 0x9E); +} +char online[] = { +// ORG $300 + 0x20, 0x00, 0xBF, // JSR $BF00 (PRODOS) + 0xC5, // DB ON_LINE + 0x08, 0x03, // DW PARAMS + 0x60, // RTS + 0xEA, +// PARAMS @ $308 + 0x02, // PARAM_COUNT + 0x60, // UNIT_NUM = DRIVE 0, SLOT 6 + 0x00, 0x20 // DATA_BUFFER = $2000 +}; +char readblk[] = { +// ORG $300 + 0x20, 0x00, 0xBF, // JSR $BF00 (PRODOS) + 0x80, // DB READ_BLOCK + 0x08, 0x03, // DW PARAMS + 0x60, // RTS + 0xEA, +// PARAMS @ $308 + 0x03, // PARAM_COUNT + 0x60, // UNIT_NUM = DRIVE 0, SLOT 6 + 0x00, 0x20, // DATA_BUFFER = $2000 + 0x00, 0x00 // BLOCK_NUM +}; +#define ORG 0x0300 +#define BLOCK_NUM 0x030C +#define DATA_BUFFER 0x2000 +char dsk[280][512]; + +int main(int argc, char **argv) +{ + FILE *dskfile; + char count[2], volname[21]; + int i, result, fd; + int pifd = a2open(argc > 1 ? argv[1] : "127.0.0.1"); + if (pifd < 0) + { + perror("Unable to connect to Apple II Pi"); + exit(EXIT_FAILURE); + } + a2write(pifd, ORG, sizeof(online), online); + a2call(pifd, ORG, &result); + a2read(pifd, DATA_BUFFER, 16, volname); + volname[(volname[0] & 0x0F) + 1] = '\0'; + printf("Volume name:%s\n", volname + 1); + strcat(volname + 1, ".PO"); + a2write(pifd, ORG, sizeof(readblk), readblk); + for (i = 0; i < 280; i++) + { + printf("Reading block #%d\r", i); + fflush(stdout); + count[0] = i; + count[1] = i >> 8; + a2write(pifd, BLOCK_NUM, 2, count); + a2call(pifd, ORG, &result); + a2read(pifd, DATA_BUFFER, 512, dsk[i]); + } + a2close(pifd); + if ((dskfile = fopen(volname + 1, "wb"))) + { + fwrite(dsk, 1, 280*512, dskfile); + fclose(dskfile); + } + return EXIT_SUCCESS; +} \ No newline at end of file