From 9a12645df7657c2f3def1473369f6e7d5a6717e4 Mon Sep 17 00:00:00 2001 From: yzhe819 Date: Sat, 25 Jun 2022 18:52:44 +1200 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0lab3=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SUMMARY.md | 1 + labs/answers/images/p4.png | Bin 0 -> 37097 bytes labs/answers/images/p5.png | Bin 0 -> 10477 bytes labs/answers/images/p6.png | Bin 0 -> 56773 bytes labs/answers/lab3.md | 381 +++++++++++++++++++++++++++++++++++++ 5 files changed, 382 insertions(+) create mode 100644 labs/answers/images/p4.png create mode 100644 labs/answers/images/p5.png create mode 100644 labs/answers/images/p6.png create mode 100644 labs/answers/lab3.md diff --git a/SUMMARY.md b/SUMMARY.md index 50d179b..ac659fc 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -107,6 +107,7 @@ * [实验解析](labs/answers/summary.md) * [Lab1: Util](labs/answers/lab1.md) * [Lab2: Syscall](labs/answers/lab2.md) + * [Lab3: Pgtbl](labs/answers/lab3.md) * [Lab4: Traps](labs/answers/lab4.md) * [Lab5: Xv6 lazy page allocation](labs/answers/lab5.md) * [Lab6: Copy-on-Write Fork for xv6](labs/answers/lab6.md) diff --git a/labs/answers/images/p4.png b/labs/answers/images/p4.png new file mode 100644 index 0000000000000000000000000000000000000000..2325152d9d6aaaca191c75981c296bae4e045f6e GIT binary patch literal 37097 zcma%@c|6qX8}}<6>a-}@BqkYJw1~1ZEsjCqNVaT+Oj)yxb<8A{9Qztsrl^!PCS)6& zFk~6RjGb)57{(Zb8M8d!(K)AnzvuUy*YonnycqY~%XQz^^}as$^_}qF4WYY!J^bsY zO`CS<>1yBDv}sG%rcIk4Y!d|jg1mDa_~qy(J?+ak{WnuG&L@K_;@o&!0!1-`g?D`G zcC~HMIakwo;G~Ios`Ff8#c{5;9De?z;AUY9ZU48>Y0>dI3Hd`ipTeFBIo@pKtxr9- z<7OBk_Uzm$P=87OpBIY57_ZTCz2lFf@x0qd4{Z~C6!QILv-}>BjI=ej%(0*T7;^h% zcu4Hb+s|ICwpqphc;hHo4Xkz?{~wUL4vM z?yh$FIR3xi!2S}>Wf1LnoFWuwZj`r*;;o)Bv}}X3)5Rz}I)q2>E>DC-W4>~F39A@R z#gaD}bLXE~QV)FshjXbsE)~UF8T5dJi#hIzUvAC{z8DX0J$U2*TlcL8Bj7a$&0~{{ zz8W&0Wd^O=!h`E+c03jl#Ur9P=B?+@^Y|d56lX-#1+mv|%g#3R$#}i3#NL6dn7R`YiZ{&*{A(P!Fuyj?p&VT(XSGyJ}QRYUwpB|4wcY+ z7#6j$04WY*3gE+AcHMcp%;Bz6A>rPuf*z&K<}#LYL1;_fUhv_dDs5V-cQu)%|CCB= z*9^{_?VfpYylqVex&6Dn_6R(e>O!p#jv__wJ;Py|F$vYDTE1cxTVsxO!8*PrFXRm&0CUVpR-iRwn()X8X=KZjzrqS#{VxEK&B_AXos3i8oR zyQJ8(wvajrbF+5Vuz1Ns7cHfP9UVZdbl z)pMhQpeFAOjDtKn$(@k2VhJIeaeT>htZ`|M;dWp1lq@tBw!2R%8aA=eTvf($G>vA# zkawz$qy2C%gAYQ+sDQ!NjZUkWlaKf*8IrY>RdGBTYGdaTo9YgPKYgq#D^-6sSA0>I z4IVZnXp!&G%MI-fAj(18_G~3R+uF}F+uk3m5?K^wYGv(vk-g2Q^x5xLFOWT>Jf~i0jgXAbwr9*a`cv5(0_ahwTHWcs2p^TRoQVa0&B?9i(JPS4}9$pw0g*z34Ge&M-Rsuhru0xlML&J=J@|!Z zkLHNRDTsJ?nZE7E%?f|QC?s~exQrJ@;F(&F-fT+t$bb?iY$X+&yDo+wfU0(r5Hw|9 zvt!B$RDvqf#tuHFh}abJ(U5rymX`9M;2rf#o{P2LoJUeLR5hU&UA5+E$f$d0YriVJ zcs}haSqs91?J5!6@LL*BLk@&D^^Z6gGYg-IdkvkEHsReo$CO;xQ_9WXA@}M~c=^2g z8?~dNkyG>FmG))ln5_RfcKy6}KI~Ko3`;;O2D#-4$<6srmG&ZsRn^e_{xg~FE$3l#ntAH+ta-n5N&TVNO^(j!4$Nz9h0C+^)-u<~%P;G! zXVur++{b!R5f|Wkoi!`+AU7{}SR(8Bk}f3WQWJxq#76W`&C(|D@(NYqzUpt{RS&Yh8G9(Uh@OQY)P}vaJMbIlAF{S%>b$-Fx;+TA}inJzZj{ zK2nLH8hTDnh0rW5Y__D~6|6q_MrMkyZYve=;^Gc$5-TMa1E1K?;%Sq{ZR>9FND&^1K z2Rpra?Fg1Y7C3-gldOHV#X3$U7ubmS6lt#gsp>m@p8m}^gKHCqHMJv{qiNOgRi@N6 zc(CdPf0fTdj6KDN&8r`MR&z2R!AfqbM@o#Yn9d^1xRh~Rtz%@EAm{Vpd{;fr>fpYT zX-oRX+N|(TqtvGOG5x0MskGsAN63lXNM1MZVT^s8EBW%6`Ui7FRN@9-cFzNY49= zlwu{fd=wA|6PMpF1&mzFq?xeyZMctBzN1UN6q%+3wv7L9>@GYzGfs5#v$M|*rd4Tg z@-o${DjB{Je{mp2l6=TRXY#08AN5G7i_RXmyeU_Wro@{a1M`ryiD*p>vd@ZCXB|VZ zf16F1HFC>Hf&*3~ng%#_HV&9`hGEM@<}1+fZIZ6C!$gF$kxY5EgiQeJ>TT%GJ1$Yr z3nA2c;owER3>O*Vgf*R8qx>`A9X!U* zeCLBP%=tYcoNJfX`j57)fg&zroo;wgL7d8)1gZn^95=dlBM5#H1W@5>miG>3 zZO`z25n(q${J}PV_wc_P6!~2Fqd>Jw=qJ#6u>1S;mUjNs?a@Q`?2m#gXFsG*cc`{E z7SUXOa9Op;zcnydlWHWS&-~0!DnbHMT~b}D0fIkuyJzPGVDX22EDXI#>C@xHwTnMi z#CH3?H0YDdh_!byT>cpq(?fx^|9@gzPKCFjH_e58_{S0!J^q&llq5sl;)};wKNfYH zU`IW$;JQABnLl^CRloqSjyYxd#VA4^y#cjsRk1icZx;o2Uq^cuf^*-t1tY;yH^)^bG6*LS;w6jy!Be%dIH7s;n-&jybscxm`a}?c*L$*VbcNd zoi+Lr)MS7L*Z(lank)Zvrk&V3y>_T3st}hjddrsdnuCv52OJ<@f^del;GbB3?K)s0 zBW&ho%jx804**2*gD^ci-DPwrV{a{@>>NaKMqvf*xewI<`fI2~&w#zLJzTO@a%r0- zLiR+VeVBLU3(bKfg%*_`%h}O%DNUQM`E3-%eKO&I=&0hqpBzgkG5ivRKtHdCX$W75U#pPmBx!UcSh=(gzW_B zDVJ2o=*Y>{KT!8e`}Ujt0*p&lz<=6BPh1G^-}2=+-vIb2nt~|8!CmDJerNJki4;QbM>^AXreA=ieP8l6$8*z~^qb({E~Gd#hPlJ^d{Bu?$MtW@gE zj`KI>VDK_f>B$6zmJ2`ZUwKI7i8ejMv}MQS9)$)Rb^57x?dGI36NHp10Tw&kf8~_l zT;~HgFHHNmar!;IsLeNmE zE8dV-bzb*ugW*zx;^V{iIH7>`&S~>YN28#klW)7Img)xrJ2~6F6)3&JpZ^%4<{0g& z?o5AMO74bspa>{GEb9jP-8zO%UBwhf#DtyHpCjLz0}bdv#z0!7nWY~_RI{zTG`|qB z0fr(!`N|;vl1vLGT3u>6{#bBJSV+8teslce_k?u~Y2yj7)bFt}xU6&dJf4mR1rh`) z(Ho3SWemR$y{QlGg|;AQCN-BO8S`zc&fKEOnvQZUVkv=FY6$7W`CVfj^-#wrS<5|F z2v_)Fyv&f0Ga{VGkSytkoO?ST#6G&|{f;$LtZ2LVBL#H>{048S^x&GhpuAnsx3bY% z!+dUe0(B;>O_lb~ziE7rZRb$e=Kewht+g(qL%eQgg6=qO?fmyX$Er4bHLEr59k6hKPe$txql1K)WCr+)!yCzh%Ed}P#s9NKk}aRQ4UUyxB0=E4hCVzpug9Bm99M{ zW=CbJA^$-CExiCSWbrHb1seWz3{4wNc~!;rQRS`5L(X;hqkm~qBn9Eq7fNxU%Pr@& zXNvZ$=HF#Gp82P(q@e8!ZSS=06~RiyQ^W;!{qARy6N@Net5pik_i_*c;fDiF0nL$# z*&WrZTU5Az)c(^J55(W)N%gLwOIK5v#nHcBpR0%~WPli_ne5XdkPiCZphAT(Ps0FS zy7sDW z*EgKGm8H82hZSlU{*v0Zt>w@XZw&`QetG#ENuY78So)5=HK$+`8n?`G$eRa8C-^E5 z3Tf(?F2MaACE=ZzNBv@D+s=bWm8LOWJkDe&&R6*hfZ!dG(2NN)PJp4pPqYO+-znR* z$Ld+()`l4URHuRd0*bVscdwJlrRhAgeze$~!*5JI`hO^em zBpb~aajSu2w=ctdk=K@K1wK4Ti{p0L{pG<)vt*JF3RRJewF*9F=2& zmfBv79P5%c%N@sZ$iB}zd50glzberD-)VchG&=80US z(n>Zwsm?UZH)bR^LZGn_3nc~Z=Z%(J8+K6bQhZlsdlgQo?%62o-*;!OI3axSD9VmGaYo7 zM~$DcsSZyg+o59y67^CYe_}zKo#|Jym>s#3zj$pE8=vs=whPxb-(pky;!n2?>Xyf__^}t1de;0w#4c8M{2ou z*0bNN*b_0^m)n%43xst>rE1kjlXjD?s)~;yVe7nP304R*+Sl2kpxm9^fxvdeIa+(h zlg6a}@)@azRFbrbRMwSW(ZQngQF7(O@O-GmBb$~=Cd8zSc=h)A1F;PAbO31 zA7S&>{&MeRA}cBN77$Uper#_bqUOZj^SI8GJdYQ-(IN^Kz9LjS5gHi`F08(KI7YVF zAbZr*_cZHO(5e#rE$XAmx-+x6{iAZh+HV=GW+t98ka13}E8D0?vturs@82`>95cUG zRuWiYWnIE;5k>_tNrF1e=UO3@IiUO>k>!Cfe|?4?dhIw-|D^NMnEdZ0SGQZn%l8JN zVPNNU@YY{TCM}kym~p607A2Xu+JjQ z3UQ{YWP)SMGf4V{N!L=fe@cz;bwE~%Y`WC7w+?whP(}B0uIkO;3a*b)LMMKuowsdmTBc!Mo|%LdcwKmINAdrI-V_6=hWgiOj#Mu6BebLaKIcs(%9 zfqm$^H(ngxKxEDo;6QK3@mTU()$}-3GK@Cml#LF@9KOH51XgPqcZmOueFXAP?nMPe z<=y;msv9x7P5TY8_lMUX-T!Y{k)Nj9-I0p>KU8ucca#7cpf6={eyQz0 zx71!|$!k?Y!@S-H3Hc&uYS_htN^?d2OX(L885i4b-7NsRA5#aiKGs8RI;M*aYQS?n zzE*+{m&}v&!7uE#PV(*$WRXY-w5D8aB}*Db;YFjI8j?!|t0q{L+;V;7Rv4vK#r_!x zx0h7QSs6q%4;+l_iazbo;c9;x>6jzp-SiFW-=ml;!RuUgWp-h!!(MM3p$BJxPz#E^ zr+oj}vSP@fOc&fWT)$u)kUSr1uDy>>g6)|tyuO-qC&K@dD+D_(Sd!iDA}yxALoUDC8Knm4X$sb`GR_Vs6{!LSTNr!(Fojw@5)} zm~&g_^TcoK`8FEQQ@v$YmM`0t8mQ{ehrKix3#aPNRB=_UupKh^{&(MXgR>ifn0NGQ zRmc|u$%bu@ZmwUlSWD1w!whzw3R)iO1u@IFVwO-uNPK(0`6+M>qexLsBucZ)RKbck zvT{o~s8Hx}QsF>RJYtR$;4kkiahC{zwVDquA%@!(T@p(968jmE`RUKoU!vl~Pp0in z8+0|H3;tp7m8w?gp1tYV>%5h3Mjv{Zq(L!@E?hypIE`Xdg+W5$9i|z1UOmQcwHNL5 ze)V?P-8`3*1d%WbLO@R87lkKO&6^ukuydw^r#9yhBR~j0!hV#b=H82;Qw&)5jQAs^w#g_^Q)14IM*xm!?exx% zx*x?aIQGJn0AHDXy$Q7zn*Lh6zu#$xW%707fgF*^uFE2daI+vM<$Dgi-l_(P;DJfR zd%EHZwar{)p50@Ivx<8n@ioK^#uOT69WHs2vByd8gLifhv{{9yU)ZZy_?%I-u`>%% z7RrQ%KKnDwJ-FNZyeI>bN%8H{ObLxpvB|oRVQ!Q6)c-gZ|c}H;$qW$(~p9R~D_;hv?SI zt?s;Rrv8Q0tBhZ~SL=*hoFvk;5YEGEh%!{J9ayEW;ZsLc$-r-E7T@}jx3j*`_?B0` zp3fd-#LU%8>1dQ-XZoY$CL5fi?z?KofbJs7wGGwV1oi~UKQ@>aVbN`IA3#bEF)!?# zRup9eQ;I%KaxA$NGLf4|99F?7S*8KYyNRDMIbGa>GYE@vb`>8r-P zpzD2az4lf3Dn>zu%=!orZrgtR~-$dgAab_mI}9I8o)ogA>F+-NFior*PV| z$};RMx%4Kavgo1mynd>|cah7*;pJ~x{jN>Fz)g+}_SFrg4>b%eHbu3q7%NjTWyVDc zrAKfnvshD-3VgzrG22Fr3S1VeH0SzQlV;ZQd))8Brlh&XkTNfUZ6R?Ms^v*Yk6()K z!#ihzvsw)7N6%fjP*2XamV%VUm*BHbDsK#33kTj4ks21dK1bJ;a`_Yt`(?`-EsGm2L5N=Tgb@R%xLuc|T6lABskfn6-x zm3{6W%&?Cdb+lySg)|Y^W~-0Y=zxQybq7X>kHeC1-hgP>vq-%_P;>Ia7-A)K}XJ$sO%UE)VA%Q zOvYxc#9iQ&@{+C1xl|VPh)B%-u)=RCLQM>M>`m{+6BAX%6YKfQi!#26?^kZ#h-~k5 zpOV2uS`PC4t8I|U(+l5EsT=>4zK)5CH26ArO6hgna{trQc=ue9hy}-qh1@vURD|Ib^Jm zvVEAJZmm~h{M`uw%ZWowv5MNmNHStc19yupQp?|IFb5#Nka7``RgzWu;E9>c2vj~h z+5b8vKTY#j1T3eTz{xn%57n0P^4=X%3hbdkVTR_ZdI1+9jQ7Ri9 zBY!HS@c>TqR8+sT*uWvtp_rAPtEp;rH`-+)H+N*tf|}IC(H+O{KD)A^4iXyxZ3#7b zr9`Z9Gjj5i*xZZT?Ujx;|Kwx0$4>EYucw>jGKhcI0vw36lJq!PvA61v&-Tzq%0JR= zK3Rx>UleUxgAEr?8Z|>vTDzYKjQ^lhKDER&)ye2x7!9HzpljI~$uyC7Kg5YWI}si` zUE^jRP6ma7=g^FQV2=OEcz~m9+2%Hzzo0`ze#m$mt*ae2G*aHZ|Evi3yHsFH5G17W zAnmswf+)fqU=cu||KIZYDC1*N0BST%kQ>oLBko{=e0=4Id!hDs6>j7ONL6r|XyzM`6%$faw8Xmw+}!iAhC?#yFIptf zge^k*SfSdnz1iqe!36e0V~#4N-{@mZSrJnwx0<-y0HS3h z&Oj@~WTje{D^{T~M~cX0(f(qPj!>F2dchlqj#lGAUDVL^7lGO zJ`Mn(Hm}9`548&~MD?9-Vt0ig%z3?w-bQV&@h(^!}eGwgUj zL7f3kYAz=LX<$EOSq_Y+c~gjnI~Tl(XU+MwylYkVkB&$4&6yjvs+Eb~pIOD-EPx3; z3~$(b-o*2U@(r@Oisr!WxkGs*OP-|!r?|VUYdVQ*8B9b^SV-{NnrZ`Wh>&5X4=|ky zX1!H^|E{9fAE$*K+^tC&{?-f$_^`N%I;-d@+H)a*H=xZD0S|Pat(V`@F_u;;wWH$c zg`suQw5P_1j5Ju%df`*>cazv-+>P3(#j8_yBImjDQmYR65G13Uatw~ zb8L`E>bHtHbfpfX!oHXggCF=^`Kxi0AC0n}3*Ma}6zpG^_Fx{jCQZ1vDj0<|9f48a z7+hEDP!XO_nc7Lxa`8TLSEr`T@7nV1IYTYua_^TQdgEKzq~LO1(6j)_b}$~4DPC*C z^P6fEcR87PA_}^Ab5(v)$8yr6QCeXv!AJtOa=P$CRGLF;s%ybu*XRahaW!gj9p;Qi z8C{=U@{iKCp1n`MX`pJgb#S}V7H`?^f;_!#HOQFOhtoD0u|f&4X;n)ElT#kEO^*$y zdLUJoKa3iNYx$gykw6^_ZC`$$mJ_HGls^g>*+GNvogbnKe;d_*%2FGNJK|=)q}vgC zx3C!Tr+AJ?9!=QAyG}B^t9ik$R)%Z@hmWi4R=D<)Xdv ze967RNt~Hx!pC6E8^Nj~Hp8 zyP3UWWtXX_ZZDpmPc^hDbs(Zyd#n7*>@?+7e9cjlqwX$?b35@iyidCw-b)hPT>()k zgnkRJsPuIKXVB(%ZIUtvAgRL#$$d#SNn^vsxw|J_1`qkQ?T<7I`moog&FDzPTq+Nm z=FBUe&s+_n>q+bY`FAoNy(;s|oMZcPLQ(C(8iVJU-|%3=+9TfzfZ0}CZ1Q8g49^@6 ze$!+f1tmyoA|owF&$wvV3p1K;h=fiG(zIs}tuvm6!A=unty6obpyhtaz!@y zLRz!p+|aV_rEJ>-@Z&qKdG)Ggy?&%;g}3k+w;0#N-rbD(HPJ_p($g-sxF!1l6i{oF zr9Nj`EbTP+^yc84w@nQ2pMiDtT|%nsm15E2u;FLG)S#YkjQadxoZ*LVd2|eQHy6e! z2zuRie4lzQ09`S{Y4GV;$%nEmAmr%_q9SRLdsr% zK7{^fRO3jm=oCF6@zT*$>-Jc%)y~k8wXD@!@du*1u9aAWy&?$|$w;1AF&4 zq4b5_n}Xd$6ROS|lZcIw2?Dn_ItU%()s(vnaxYBFC(4iWp~SqVMVR{hKyQu>&)Oif z;$bQ+D<|HJfP5lMju|gr5lt&Cq*s@iN&xO*8s%ohWNi(A?K*ckYZ$Bazql)FOUqoAV#9|iaCNVfB?ykd-+85Q%k23o29<$;E z1QK#g{E8q_ck)Ba_pBjxrun>>dCAFtfdxJNOq$^O{8G1h`a*0&hQamJy>f6x!n9?; z1=M5)$vImBE;*aVL{Ua*_&&dtk@n*(@3sI|h?i1_`!Ii(tWCw#uJx48vgoc%Y4*bH znP%)>2YYya5jDP3%w1Fd20=@UIs+;3J3xiCx&(b$4W`PiXBlMGFdyA(caPG6%{LR< z%SMogZ!0Rysi?D(hR+NyZyVD${Lnpkbc<(CPE9$&grwfBNS?=#KF<^;IgR-`} zM{4sROCBxSh)7@>VGP>Kt1auFbf8pd8l}$zChDDVM7W+o@anM|&A1j-I$+CD9DJ5{ z8gGg`$TNlFAf=<^iZr9;fcB#N;tCi}NY3hAEe;ZCkj`6q{tn`6O?tARki1GYnc!DD)*UkQBe%I5soi6rH z1Sg5$B+=GBnTodt{l)p>J*VF$+BNPd!!MhIq`VW2Bxx}#5=p~|@$}_4#g?Q7gqe%4 zV}zS2@eB_PIWi%H_GJf@v7JE*I`s)EhgygIKcdxw(MkIu&7sQYJJ!4G9Q~FRr<2$a z`eicqY^r<0JrU)Wj7u5=%UcbgnNeSNg^t}3&D^^iZsNO4L_+cK?uo|~!M5t{YuNz~ z!oJcjTgC!>zdEHGCu=Ew4RoaDx)ISM*0FuLXQyX1oK~o0bJ%1Itr`fdcb*j&YwOfT zkc{7Ai^i{u!3*?R0LR1Z>-}vR^yEKOELtpT|2Wumn{M9W#m5p{akM^TA|V5DWoU0g zlOz+z@Xtpv(rCT(ynX&_IkYXSOo^q>;u4_XV4=Cn}qv&~@|UlBr?-K8AVm z=f#4Y@VQ1%NC}KZm*ha{`h!HNUN;er#DQA(z|lL{)CuDDnfxgRL4i3L=n}8e@`9gy zC;}=Zrxms3WZDRdH7RyGB6^JhNPSH3Ctma?e0u0Q^}8e%#s#w_9)Z2voEEnM;#DXb zx|o2iHxAlr_qom4T^^mD~;h~~dFP|cXn=orsgn?1dAEdt3P;{8X&JXQ}9e0_eC zJtQm$6y`vet`g{ha{-Kt+rzbvcCodKAXaVDt$6H`Nt3zV&H2w}+@OMNbb#rK^cVi& z*x(7a0D){|Dt>Ov=bS#{hn#mKQ=5%T(uv?5x_X=ju`& zx#plT<)ZqfU4FaeTj9q^yS!z+Z<72?o7BedvQ>neFh;}gX0L(5HK|8r6M;fd`d*&O zNM4czZ%DEHJE8kbyb+JtFI>f}uZjC4;ecGdWQ&tP0~`tnvqgHIL}jTiQIYoT#7ol` z-kbCv8NN{Pf6;l!f6+N}hhgJE|HrP~9o|AY@dJmSo30kXCMv(QlU;GX1F9!1NUt_q zor=TB!oOXes^TIVAkj>HK+_zqfN#+8EAewpovs-$n#Gha{pxYjO^!Mq$X24;<0{ZM zfz79T!SUfGNoADMbtTk*Q@NkHz<6qSmLl=H$;uxW|LIMH+`i-cdv>&il+!8OQ?%FE z(C+MAWzoffnGAGq7f9VLPbsMNLRGPsXc2dYg^BKE;GIXz3#qIe_2>L`QHJd~H)QyCMH2Lw@W&Zy2+lMwgEw&HDKC!-fc!A?hSCOQ~ z?~UJEZsXoFGTm!nZkf=Mn;!K!>M{p&0nZS0C%|$F0f3OF!F%x8IioT2*?ai03#18DtW%|YZ@FNp!-bNKl)vS0L)}UB za|M3jh)JphuaESuhns=Ok|aGmmkLtSlvaLeH>?O!Ssh4bFAlBEvufqejaXcxX;=Jl zkk9AlGz<8`w2`rCKWq51!y{XA-80Ez^TkL2Wn*YV z4E(PG$ePW;a$@8;f2h~T@D^!R;gV+kH5LC#OJh{esL~Y7aqrG7p~3I~t;l-+Y(&QB zZmz^=$x8V`TuFk_kuavc5J;HTVV4@zs#YrjI7|&?WEGeCB{agYI{$&szL=HG3F@@@ zBZ=j&Guf}ST06M!7V;?24yh^c77TZ1IQDXul&9dKdKta9J>jK30%2R@DK3M6sutL1 ztbEU~Q)KEERpnwzL0VE@q`Ob=)*B4E#$1(&`FtNE2ib5ob3V)tcb-ooWnE)LzS+cx zpZyp;p|NhIH+QEK12c=`d?8I))a2%VVtaB))9vAHe{p&AshAq+SLu!0m9lmOc%CkV zaf=)P?KsA5wR$woh-}f;9a?yBXK4-Hnp8dqA`A}UFr0W0H}W9I>v4G@uWHHujC-SF!S?}19L2{M1ws`@mzYMDM#W{@S%WkRPq^j%^-*+ayB)itdXfj4`^_kd6 zBjuA+yJH>-=gW8)nl0?La`!szuEgEpXD%EH^F(3ns?#plN2()!?pc0|ssrAWXk%ZJ z4ceF9@@}x=_h`3_RW%5_5{bn(>GF}BfP!)p+;K{>amm>IWx=%2^3_OO z&DL?st4|A0SRV-Yv)$k*3X9|#;AX%?Y>6_un&lCDZ%f1&?Je=;EB1-sU!2%h=Gm5A zb~xRkmQ^@pd@RrrOU4ljAvLBAWiQ_GLo;=(!PD4Z`?>hen1!?jYAB_$|RxtVeL_*_>Se_F5r39<uHE68vG+vjl*#*-+6Owe zi~&Sm4G{Tn)6GhxR`f?*K@8sC8S+)R>^*8)(Jj67RStJM^0#JwWXL?>1c;zHg?=)f zid$~o4JJIbQu%FUR~r_y#K&?QM$=(?*P5xg8uvfpCczEp$bbu(O7Jh)>E~VO2lkF$ zcKQ$&Q|=2dlu%C$Zh*81d)V#IWn%baj#*TXIOusNKu$6#dnlZG3ZjLxNXV zXD`7GdfuFK9_(L=&R7Z_4SIX-O4f1k;fJES4}*Nl%Fo3wQ!ZOT+rc)gW4g3; z;!{c?w>FsEeJJrCB)`6abR}e z>E6#!T3CpIu5^rZTmwjP--kN@9!QgQ2RoHt$o8~h7V`>L3%L@^%6`J2k$|g?Q>iz! zwxsG!+KBE?SWd|8@OumE84NCB`ElNZ^wc!cnp0X;`2J}$K78#E;G=}+K36_8(jUQH zR11U*IO32Q23{IliB_$~9>IQR^Fkj6cG`KrOvz|`?@Jx89q6VR&6fu*OpCgKNX`qX zadEwU7}nX5&R0bVATGmO_#KiDfXY$6({pdbBwP=J_bZ!G z>dPwY-zVIrPhQglkrW1|3wE<|^BvyPM@m?~i63&AHk!5{&(~{JO^DP{S7XhJGgr|J ziQ-O%5ktmeAFMS0abkOJS-5erj<~|aVftAoCpSWuxoUBw&B&#$w-gJ)F6RR#%|+v1 z&Zpwum9w5PC8iRfY{h8xAnLRz<*qyHYhS*%y;k1Ew0?PlsZBXMf&Cy7gczg&c3f?U zSnCUi-aQ#re@j`*oPAVyq(Oy>5hpEh{bhJDbo{z^i;sKOaXZo;$F0%gg7uBE8q!C; zn3TkQ=-EPjzAXUzKmcRv^j%?xHJ3^^kbpbvz*PJvC3oM8_sCo(p%FOtp~DH0M;mIkwwO zp$AhDYT~fBsE)lwEcn{`zmyVB zrf$?2-~1cL3l;K6!*&){3|=G)I=wEo;?&kK2eUs)TPmd;6yaO}3d&{}u!w#HbNdbC zmo-IEZJ4X;R4wt?dmmPYOi&r*yWkRys=LK`?>zAfyM1x1EK_WlW%5m~e*lea0z)DU zP+I(=1E2JP=cN7NnQqnG{Iz$VSEEr{F4zIquXl0i)wUb}r17o78EXnU9!czv%x9rN zO9B-U>^o=2NiEQt>RL5PC-1<<%Geoz$G65`zW$)ss>odGtLzgAFE3yDjPHUyR|pI9 zUsw}TaLw2K4-#*2f`Yc46`#I7{jP(Sdwtmd{&9COx!POh-I9hMo1RLSn8%WX_yc+M zeIUcYK*B%M9BieuU@9|{LKLqUpX?(_xUq|252Dx2__By51Q5whtS#_%4^Cn0q#e_IGu2h#q6MCo@X9L zybh)Uxjv8MSWla)1ac;OiuG zk^F4G{o8Sup?o!!-$3ZxB7mc)XSykJQtn^iNE;qv8ljG5p6)M%RQd8{{tD(RaXZYR zyY1o9gH0(SqGjvYQ<`H5L1vYdb+Z2hNxL^Y`Mm?sJth`HdJ1v5dcbSf{ZFg-_6h&$ zYdX3*L(vt*L22d*4@+bdOjX6hy8StdD`X=p3>FHvK@ql^GZc)3&og98_zFxK7@P55 z!gx3txOMbj2{si8>j>4-2t`|><{P4OjRF8)aJ>d|WX#&hjchiZN;h3KoJII8g|pHX zxt~F8ci`gp(8D)|716VK{{h>re}tPNq?EsW6|NR*H8l#(Z1i&@^`}jpFNCU&R?%x- zRMXc^-PK**0dRwIz0u2rIvKaj+>@}EA2V)`^n+n)O_eVmckZa@)ft@^2$0{dr;=2j zc_ZMOvh4CnoFck^R|dydfB6-Rh+eZ+uv0c-M6OuyN7R|xHfusv zO#f#%r41>Z+ed@_kiusgh`&OcsE1-qk;iTOOky4I^bZEEHZl||Udn#t{Ts1hF{!ZpgscptTq)p4e-iyaDhD!#D z=ZrY-M){mg<8!vJ%AYtzU{5I)hEd6P=JV5%0R6jILj3-!faKbmyQSyf@;A=YAI6S5 z+VKFN()Y0X)4m)~m>^ zFK0CA;EpQV8^oD(v{Ad_%h8BV>9)h@(H8eg3YO8y8b_vQb;@bAH?Ka z4#zr`^wv65{Uvpqd41<=P5ek=$VK@Eb=uQH+QVD(!}WtIX7iA;VZ~8nT!9~MW;(&R z$UEoApc=IoM81ynU%gL+m?sGB$XI)E2Udy?pUNJ(WYsRr5@Hisf%17lua=q@#^}yV ziYTm?&4yXFZQ4AgX|FE=B4V+w3gfqBo|G~=}$*mn2Y*bWpM!^feq}Isw z53{nObP)Ap? z)62Z9+|rh+)~bIx9pP4*QNLaia3s8K!?gA`HK{<|2L5P^Gw68Ua9JcZ*h#q#s^*f$ zf@yU(S&FN%yTw~Pzk~GTV>@--#*s@YYR{ur40N&wZH&Q<~bD0_LJ5IW=dC60X18THt#HBU0sMpGpj!&YYB#q5(CV)n;uzAFXa`b*5dV^eor zX3ir*>hD?r>cnA*8jxFwLv4n^*R%}U9?EohbS^P)(j|I-DCSdlw2cOlmZ>?K8$<$B z?ew`Bac_KNB&F}w^@ASE-fr=r5w27^_BCY#pAo$ki>~hdswok@#?atZpfbc&6cDq8 zSQw5sFs)Vow30Oe~?Ue~6!7xotH()}!~}SjtC)n&{I@s{eB72t@u`JpCEuge7n;H%|JfD0~HUQgy zoLpCU3h$kvxFR_fh9RjB_|Da&8Kr=*ozI(`7@O&K1^s7&DuG?5(qu(M!&*m0?d;!* zwDn8oq`x^ox1PK2b8}h*WydUN-86sn4?mWz0WuvgS6i-kAv}DtF^l>T$PwU9<|uQn z{>ld$@wNk?YDYWM#pnfTlFD}OePfRvLjL?^<+gH(?DovLT`yJ?|BIdT{{PrH9>Q9@ ze)sYX6EPWBDVdmeQN83%**r^; z`E7pb8v*%o&WJd6of$N~qbeFpemPvaFQ(LeW#`*|Vv~Q-b0vpbMb2jn*c^yN&!qxN zcCKjDFm+TtxaT0eJLsl43*uoj-nzE5pHI$1*kkSv-Vb&FXlpkHI$(Ro0wCuA>s<-O zB>4GM#8Rcp^G~eJEg)uPF3BpbFMbj5;A3{kuOYww&(d71*Os3PPynGCsN(Ht`QIfb zOKt!4#=ktY_xHC^ygRgbaG6{bMYFzZhOer;nA;LKZesO6MrZQ(FM7O)DDX>wHS*=XlFrWFiAmK_j}VfhUF zUAb$4V|8~HQcpQ8M4e-WOCg`WSewMGcQ0cM@Re3F5S!DI#i13Z?4{`46yw5V3Df|! zi|0RgsooWtb%;@K!y7SCel8A5zloqydqCn+iO;a|2tXH%9mpkc5y{+JwfTqLnU4A^{Y4Z%QmLlm{i{xtX7%GVlx4 z-=+57!wc3{kG82#Ru)cZ((dtw{iOuOgw&f-Mm1v<-6czHoCj-ysnhq!4T)ZkyJ1EUJyKpPTQzd+d%AYwOe?*Bjidg5xe+-KeBVz z2^f`pFO1q?afa{iUkSz?Pj`6}WYEvs_r75+*{Id}Q{}*T52uO5l%8h9qt}`zd_xi0wtYsf^`oon$ijoh} z4k*t-4TAY23WL9pke5ly_q1t+j=PlIHytj|gmGZ-nR>%PowORgyiaiK#H&R~l$tPZ zl_QrNvj)R~_|4ssi)OyQpXFu?m<~^v+5Y>4@~~xAS}q>xQGOTMDx{(tz|(A-!X@ho z+f|fIbp_HWpJ>s6ext+bdOGPN1{x#DM9;*FpUkIRUEOzrg_b7*szcHkRi>o*%`JBm zd&^7P#oOW{<&E_GzL%m5%C_8U1Ik_TpWb54Pv26OD}CkuT2YnUK+hcx9PbS13?o%; zmxHzd#VGGKicvC2sS+K2J#QrTPmsMAFlD_eD>dak9T|x6LmeRjqM?19$f1WwI36KS z|EEx++FyL)Pyek(aN(=&iN73&(oPt{JnvhbY207t>FsKHm+XBU?E?f1L4noi-%+s$;XFTSHyz(uvcJ5ZuAnj|DV z2Ca^rV?LA~_l_*uk2C{rM;ZYMQ&S!IzJ>S4Q9WA2h%CO&4L@u5O%=?FNC40~>X{>N zXJ_T?-kHBEPH_44uEY5aPCnUrvaz{nlI3VdrL)lMzQ>IgiXu^loM)%;D`{?v{N15` zq=0X$Uj@kTgXA+}l;xI*NXYNMT2mXH3*YuGeE>|t~V8q0o4wc5Y zxzGK4y4>wNHOG0GOhU15W~r#S^T<1z?Ho)kPUb+@w-A5XauXsghP9Yb5d-7AU@vls zZzQU};rRl0q1Z~K(1+pRyZd8SnMm2 z7dXsosOu=BBP%m@O!W~0sB1Z717wQb6(3GOnTE@>!G($=)r%t);kJ$077I-~D((zj zJK7P?t~?0n;rtA}=sbOY=2hVP0|v#T!yk=_g^mGbC4+yLmGqwgcpH35BysB`L5Ff? zQ(3_?1pm4O*ilA}B6!!|-8J$q<^_}eOOY$5bzp7;iIyX!{phcuX(}0|A*5Tie>AGq zp5^+@7x)eZ+V<GO39iX7H;tP!fOX*zL55-;87m@;Q6m|0yuh zz%X=4`SbjOJHKh(uO<9P^}|~11;=}vo>Gjhc9o^t&J8{LbVoY8O>5%)FjoByYi@P~ zIiTWlwaE$+-}^`G#^oJPzNPea{?Cn>ig8Fg^wkWbH==2ul0b$+d4FNDAC)xecC-#%@?_EPS4-vipR3QDgn z*R$b~MkP{fP@55_C{!SHw}?)yzM+#N7JyeOIB=R*h_W{EY4AF?*0F7 z?{b||bEc)0EA^x~sgr4DYF4gXr4^Qg)Z7Z0m70UhG|fS2Ws0KYUZABoQpvq1PEZjC zAToXzTK75k{k!k)@edz$2tIIeUA*3}&-3+y@v@^&2I>Bz@AJLnPbwSodoD-&9q61n zC-?f00pmWqMBd z4Bv^pGHQQ;c4^kQim9j$_^jX=VqImk%4)^VVS7XGUW-=pT1+37Q3An%V1Z9Pr0 zB372MdTh&^G;0maU8v+wag-CgQu{XQ$&& z%P#cVcn>WBr;P`@c0>#q{jmLEwIY7E?tB!16K!WRFyp)Zm)``}V;hF!Oi>dYX@^Qj zn`FI$Co<*ldM)C}O?fLhMDFuNdRVU7v9y-lRd#jdr10^$4z^+6{m8Zt+~Z@?;A+*o zLvasX+V(cj#8&I+8ZVs(T8f0IuPaHh7VD3%guf9v6Cms|WdKo3gaG@+srAilI~FmD zImof&bRN7I6@5a5co+!L1S7_tvYWoRn72zXPvTY4l57jWsbA>)4w)>&>qb zLR9eERarINAD;oG$VI~M>9m5eHK7$ZLh|h>vXOeq7 z^D)}znh$f?dO4SB&ng4Blc^0mcXIb4meEJ{P=M5Zn0L}n2djfRD>HPB`t_3+`~lv1 zA?f?!b>Qf1iMa2j{(kTaDYvKfK5XY=(n-{9G8Y{WGesjA%ffo)z=aaaL5r($e3>25 zf;d&oLty8mK_ytS-8FIOoL6N(Uh|O#wDuICOIM8R>mpk$p$qioG=DDd?7#Mb-^MXo zXn9kO&u*x3=97a_p<+(WWbpZ|#ioyKeC0;uia@kHG*2&OByGche4fb&Ya@o8TK#=H6qmAqvn+ zz=0y_Ul}=M0$1x5t88ZAi9esG7MmvnWJfS40HdY5=9&bU-PBF9`xgXWvQUB>ENw;l z<#-}7<}apAT7}n#1AwFB-nag69$3O(>EPKW?OE zWSGxRzbUBF+f4U%GRHf^{}uhSEkO@P2r@b;`eKBNL{So{;JPe->g!v#HcBp&Gn z#ZZdAwVf76GTkfBZ7T4asoDiRr$UDsy3T#^x<)gnW_T#(v4OptZ^!#bztp<#__)b{ z7mqA2d^X_ixjnf|F>pq>c8!L+mZD|0xV9aT)%T;S1i8zq> zV;$ZeYOB|3JqlzE@shw(ji7Wd?Y|xHQ53)F%G`n+(yvk$bQ=!n@cX}XxLDvIn4*-3 zTr(JIrd|0Z$f0KZ^ElOAy#`y_(T3*K;PN`^sNqk+!c`K7I+u<tlbLeEKDyy@kftV?r5*8e5QYm`Re`xkh_&4mNfcw z-*Rdn?B;a;V}LH{D7(R>ONczb>5|_v+-gzgoo(x_r9i;8@V@odzy0-`#aqquu{3N1~7M(rsh!LGDyC}PPk~120Xw?XISM}M;$ys0ioltx{zR?;nY2)AcYBSz73Lq%=WOx_1sXFNW{ju+dVz(cSixP*5{F{l|13+j4VmW7-lTkTI>d*1OO|C&>1lUI2L!^ zwrOw9ot73IRTa-4FZ!Wy;3*Ab!P--J6bPT7z7Sr|cky+Tc}_^24aEw5+`?suF8`no z(mdp&{5+=I)SNSSyQ;}j2j5g;$7&@b-vEfW|Lr@z?hnhC>;R<8cQWs`X;IR7rw$Pi z@_k;gZ?_8=10Znc+mB_H@`dhq&1p1D-H~kgvRy+G^lwu4)(zpVkfzE(}J}X7H5VucZZxx7DWTR|0{BRLApdnn>x^(YGJlguEqGq*3K1BmAlRX=z_td~CCrm6zt3(t&;(%G zA`i0HSD)n^j8biC2kYOO?>J?s=UzQ?FDJG+ z1E0K~|K@+H@5h8o+L86v8sB&NoI*weY>E4$m9Zo%UKkQOd_ANkK5Dgsz81dru)`!v zhkjQU!RuT55pBR$=9F=*@d5PSBs-W4m-WtB%483(P8&2_d||ClQ(XK@{%J-A3n>6^ zzNoF4Y2KI^rBeU~$Pzr&V5)|RgIX?eoCmo6|B9TcS}_(zTj6u)G$!-u%&w=bhD#9Y zEpg|U3>Vj%=+W~dB3R&JvBI-Ik3Xkx1>@UZy6=!veNXkBrN$ns`dX)M3b*M&^Ed;< zp7WC9{W^QXdU(Saw>xkgu|uxHD#AA3lgp=s0YAI9yB)Aqh^&RF8jUFx%l7JdWtqz z#-~MYg@vHlw*>K8&|%i4d@;LN|AlfKf-6fd#vFeWBJ8Mz?FlAkr`Z!}$D6x5*v0Tuq@mkKxBRN>+^$3b#7 zgaiK);T{_z+(&(?3#>8V$Fg>~_pmQM69S+ejLd%eL;OE6>+w3FD)Uxo_B)UAwUEI} z>@$LEaf^qYhM4*z$g#{;SvKYN6(ggB&tU>oO?lsah!AjZjhcS0*{hC!jM)%mPG~G&{=&(+(s$Y0XGL&;tm}FY<(dxe(O)=w~BO?{jEf#X>4q-RMxq92nj6?Tp@5~cqA{MSR3t#jPazvnlxSpNYSXkN^1 zDnPpVL*c3TrMgdsg)nI9PD$@wRti~&p{G8RcD$xTQIt7j(`3mKUDZS67`&}BL3-@w zaKM#Gg`vcsnJLhBLqGcf10BJB5|wX#<>{*6r}9@d_Zgkh<~kWV-2}4OFENE0uoACx ziqHM8_Ic4t#hc!3N4VIE>et@byybzKOf~CncDK&;@-<`+^F72x*F$tFQhUQfM>SV{ z@|nXy{t2%9;DRgi;`7okfX(r_Qw`{8|6ZBanzP=cF5QqEo5>OstTjPmzIAw~Xv$KJgj6VegyE2{oTE!`|rWvJa4UY)o1nLv@(msO(gq2DULu0X|{ z)0SJcg#6lnXPc8Y&QZbda}H}Y!}GVZzJ8^adunugBk{zfI>J@1iU$fm7OR1#x{1!& z-(k+&69o7U${t$9Qg3)mL!^^O)i+oXlA5l(<`xI_FjDObH^_M04>LX2cSFw7Jj*v4^ZfDQc7c&<0bs1ZP z2gLhMBE^W()?-d1r;x_l1+miLr%rD5XZ29PskVN+f3?p#?|R+Y(BCXTIn>byh*K1! z405Nfb)sM^7g{kHTaMo%Prq{Ih9^&8F0(P5 z;1^1Ym(mZO-!>h7et)_3SKrVtne8ZM-~KUNH)|Q$m@di-9#DH_C`v4O$vJ5Hrk8;w z+aC6i(B{|lxXE4jj?P+?vgWdJ{h@ng?&gOQEQs|UWz0P>B*uKX-h9L{BQy~x7#THp zx>Y7Dk#B4RnJkeGM8rZW7)7ATbqp;D;~eK~>dyPYCiAjPu{1oY_T^WZS4mzw#Euub z=fqsP)@jp<3KF}KTCtoPYzgE?oEB9CA))#HbCADE?-~7V(X(=b3%-XykIyc;ZgWy3 z(1E!TW+WpAFeKj@`HG`)uW269F~h(}fR=Dt6b1&Auu;m-sVNO=iTK*Pj9SU1)mOvu zWJW>j^XV8E4pXo(9ArS6fzd!k#Mj&x4zo=L;AGey%isYnKtJS{UySDnA zbgAZ>=t@Hc&D*#kL#*zVbJH=#qpE^wMG_L72TfQzM3x%NG$9iP16SoUe(~lzwFaLE zLkd4Ju&)EA53GsI&&*^(CPrZ0zAM0x-1SzA0u=TiIaLRsGKZ2pqWuMz3)Dz6$duB0 z#m2L4P1jN5dSbn+;o8ASc;W~jTY_R*y1%fw>Po#5N$~$ z+z+MxEvDsMhJ5h-k6pT{{OR^_f=(@aQULfI@lSxJ3^3Pb0mu9ZyukCt{<-TGB9tWeQ%rF*ZjhI z2nFL3P)7@ZDtn(Egv2qJY31#=u*3IJ{r)#!)&m7D)qk${3z1jb^~Hvm_px$o4$0S{ z;{M$ZQX8Z zya!EMRYSg->9HxOweFS|q95G^XZ}a0oj4XZt4vDt{%1$z|K+mlcsd%6r1<@FF4%m8 z|4G{fFpp-|=QwqHJl_gy%VRTy@p5aouicHf&>u!&Fb0>oaO>C{x-UX72zulUfnv$&lgCL@zN#~HgKWNr^$ zR;WK1FPXG+;$bMc$>DI6%=0d7P`f*SoXZot)gx#Cqj4hwZUY&XQ{T)H7V{63 zW2D*Q5lW89=fk0z^D|n>sgqTifICRh_~*;QUn+1=;Iqen5Ja7=#%BaNmRcI_^JJpGbb6 zYQ5i35K=%Kh(|>GKQFggW}Xx&Q$Aznq3LVe9U3rKxRAENV8gy{bnLAHy)Fb(lCuuX z;|qy#IjAhcLX-=!)ZK|+=6&*OP`JK+Mz){$;zuPnYXsz2Z;Cif0-=me+-H!S*{(n;U& zqVCQj5Q1hgSM9sS*>WA$?w8T`ZB-3VxY!PeN96s^j?%iFnfs4u4!)^h^S@!|K?!=;Z@)K!W_4o%0JH{9 zzV$*6$hDb3U2nh9I$w5pM@CGHcJk?uA;vxjFlOY1ie%Ns@Bw9YA4m`BT+_R&764;o zLU_HM(ZVh~OY%jw4s3t@<0KODpM!#$VUQNL-oZPX=vC*KD}gB5x`uWO62t?SMH5j? z9>(GU=zUg^fL6BnWQ}dK@?FhNzhcyP>>=?cK%Cx|Ahv#S>Z_U8@i zd@2X)CUP&hWt0J+RKvb<9w+FTAz!+rpG>hlms~f=ofYI!KrK;4qHUcM*VxBTEv6Fx z;wJY(ar{qu20jQ|x$ms$&6Fl*i3D0)P$Obj?c;a@j+OLJRA?q@{r?ft7p=b{q>|FE z39oOnE@dg+J-+<^JNzpo-WibrVxU-FH$JUyBBw?3?=Wdz&Zm)2wMX(B!gN=-(2c?R z4HOY5JXv(`UfN7uT53_AuU!~f(k0e`dTZ)0YA;p7zYfv#EjVlZbT4$ z|K#0!dNVOSYdrx7m-Rzw_=Fx5_rQ)wwrzQJkY~~8=qdQN4^Mq|TZ#E|hX!d8ADlVv zUsD5Wl{!!)lH3*zWJ(=Y$-_$nB?(=J1cV66M_lSv@6BgO#21XXhH|~bfiY+9 z0s~3YYi=}ajYsaOCx8Z+-P((kA%2bZ(!T56LOHuH-E#r(sS7D%_VO`d8iYTRv+ak` zNj~c@Nr%~%EEiT4zCYsNSxBc}-fDrztAFu0fP{E0(Y=`%tgChpI^|%rxT~Aqxj8w6 zJ5aS9?d3BNG)?`Y&}m{G+Rb$&f|gA_u$B}(lBIY&;6nP|G>_2jboZxEJa)d>*B^g1 zmkjiK>}=LrYUgl&&pTc9&Bunqb9B~|oAqjTCb=s3olJsp!{?yM0a+JZt5$cblpS2tN<@8uA zny>m&EY^P=Ru?cp>NrJ2ThGOOH6VLKiH})9i0D}68T6AJfKx$FNY!?Q6q zs1iR^x+jVgABs8UIik61l@jZDZ@Nu%V|Ea?us~P1WCWm*+zc9rX=KlpvAzVC z7a~rr!A`&6d2-OP4S4>V_&`tzM~G8E71Op11~<6$_$pjXPd@(6IQjgxM7f_gf1>U_ z47S8jgK^6`$>M|s;IQb8O9EI=fyn4kSr*Kvya#~j8C9!J#+J`=xJD5x%<%B;`12$E zi*vHOERtV)z5$%;*yfyh=OA_SEA!WOvxxQ4;+}?8OLmog_@xHjdzyf$>lfKjnUvu* zB?B)fCdY_1>5g*~bb0%_n0=cm&(ylNrTICq3s3Lf0?9?Ua1**z?NCq(kgtMHv+RCw zzkcC}UcrRhH$l?vu5TOB1&n@yiz=U822|4^6aYPXrqqk*wOwQf|%w+IrfW|Cx@3(OAG$ua^0O`fyUs`tM$EsvO4Zc}e+ZD?>E zG#}Dodu*ciwyQwP3HS%-sKZo3Ijw808;rh1!hv}l9P5Eyg+q?D40PpTICpx06>=)7 zN(>9{5{~dbzH2!Qt+>bCA!!_}c1(M6>-MtAPmA?Ehwh!+D?ah_j*bd-wrK$FSjB0=zeye?o`3K~48zWVpO^eN)|bQ zo96*0cbPDqqO=@>%$FlPGL>Qtid!Redv!!0nJ8lUB=Ei@Fe9*9+y<>so(!P>2m}9Q6;fxV~Sp8Sybi=zcII*AJlNFIayRdTj!OMRfht!zfzNX$k z^ZCPIPL5u>oJ0LU5tdrEnxnHrOTDZ$$y;U=-Ypy`$nsI%%K z6PKo*uH7XpR=Hc-jKy7CG)Xz2o%1wMzc#aZC$-8G%WO`sbYB_kTCWoWcwnD!U|{-Tyb> zzwrqF>w6*tsi$NZo+@0NNcwlGRhQ@mNyaAlKsYP=6GB7ab=A4dQ6@VD0JNzCx{b3%vL;JEYzx?) zmw-Gdep}eNA){nC-~;)i3-r0MWADJTGjQYnGmP@|*fF>MY}i7&Y$%=3{WNhh>>%z`{TGA13*jfarIY!MJPL|C&2U+qu^mUgigBYWhiqoo zgE)J~yz1}D$N`xM2pE{MGErv1D65=RLV=njs5lzP(&r$md>5|{YC>?MW$yjv*yV2v zxAL@wa+R}&ty>>06h)VtsT2G%!Z4cdH0yOPOq04Da|hZRrc(^Mo?XE>AFTR!VM}BQ zUkB3f0zm2WXwgR+dE)glI&_}%yLR>7vxOwommbM*>f^RWW(0$=VR~4h2sLN)wiFX2sFU_Gb|gOyb+cS z^Pi&&2sZ`|S#_!QJF$Q*J_!OaM;_kA4A{;9IstkpF%!-LaU~O)e$>%OcgJ0U=f0Ge znSo-aeU)NQOl>4)%YbUg8qT={a=$9EB)9|!K6$G+OnrdZ?&gMN=eRKN=By-c`*{4` z^9(U&?-=Nw}QN-rW#m2o$}!lZ+=zXQ!kgaA59yt}pBI!pAN!~nOf zW;6s&PB>hm?YlTPb=BIbn4i+7IE?PW?t9Q7Z;~JDGf}5ZmgC@Ye<=miZ;F7wmJk@*LXzNbQX$bU zF$aN*;09cj?Z?Z_+1}2M!h7rF6x`%FcMg~(B;1DUyiPa~-{*+<0!28lGa0%nYgvn#7UrzM`GHK%Ds-gnmNq7V?OF;f9BKf@>|_LKmd0f z_l0es9-}#&3l`Yv6aCe|&0G9GJ8e$<9wL;v{ZLlpW$udqK1F1i_E}p~Tq{^E8ZN54 zqclE?kJpq36i$mXk>5i<`Zq8FftDEbLnqtm52nX?yWY}zGlm1XWIYN0{hnPYmn8wB zM+Yue&;^rK#kwExEEl(WzJRg5UpTK}gPr9AjsJ{wE6Y}4a4 z|9Q*ONWe?SuHSvcI#~s;2o9MS;-+$=mI~U}UhlcQuK+){%kQ&`#jgs=7mA!WxOb>M z)?AAOAd!ggEVoq|(Yc{qmDX07S;oTn8aIK^U=Pd`taKgKD5OjGeNKQhlw>iYYcTmM zAfP0v+S?qKtU)B&!f|#*I=_Yrb0#;5Q7MF|qsiOrr#xN+MfR8>oE&?4Ur4ltn7V3x zh2hjUxpX@Bt+w-Wq2#+05CQgF=gIJxr`wXOCHr~?1RI`ugWqn{P-^1e-3AxGyV?8d z{yhADWpyR~mDMdUwirs7nF1QiJAq6q(yP{DsFHNffU2qXDR^OZ+61;S63rl#r(34_ z(HHxEb>2A0e%b828S>*3OfaCHa@q*(jvuMO`MBk-{Rq7k{b0R?j{7xU^fSx=rao}_ z+uq>mg!ghIseW8MX&-fu)a83a^pyP}h2=%H(Czn%9`v*n5S4G=zYBy|zblH*`Q9v_ zRn9v)*gNaSt1Im7OjfWV27v?gtA=RVFraTX_T%@02zXf(fxFWZt;gX|Tg7eMZT5Z> z@vESer^xxv{6v?G-Yg@OWYSuv1FxLExFuqW_YeQfry8TC8D`Emx9=Q`)n_`d*+%ma zzL!>;URfAW?k^wtVUVX)a9NWr477-v%(^|Gd~6x^nhS0f1PA(`9xPzesDIetgJBL; zs8-o;!&GxGQ&ZcUXV&~$a0cjB<|2h>Kzq2$4^?a_-ZB+QdrsQNsq5+v8*x$a;5%6I zT)On;gmv;5dHwKyG2k}>9X5JJ ze%wUG`Pfw2-ACH5?9|@$9~{4kM^iLowu>kT1rp{~wb6sVtG6Q4^7pG-(F+ZgILDJ2 zSF$jUBaR(()?$) zEne1rSXt*k1aI1hsFB8w>#|;zPNkNpHp#6?f(O%F;BDfZDwI+pCcnaXwOkW%lKh7V z!@!}+v=*6qQLc2b$392}G?!-(@26rSHxHkPEWI&_^}Mzk_=#~^H*%y?jAE5izbi1W zgBaaK(H_SNhMD7=q~1k@)<`y}#@TjZ`rEQO*(|$7UYFNf+vPljwx<;d6*)JcEUC|S z>_^M;L_Wl~4%qOSj>&pxWSJqx#P(L!X)Qhxu~|)a0a5s%{SVx-Is|gFZ=3=XvIMp= zNbK26M%#A~$wAi%+cMopcQ)h427H?SL?0~ZC@@Q#t-?J*<}3=^I0%&iy<;3VE%}AT zn`L_xTR<5>DbblFbu#=T6Q4k^$y*des_6_*u=zq8I64y->iOsW0xK{fZf%UPco(Ac z4){CpCsu6GR?B$Kcm|_WZZ@-2KF~9ySikItS9gut2uvD_YEQ8Gmh1* z!*#U|KDe>-=Xei2+rIHj8@};~ef}>t|NQH(|Ipy&vpZnr^AbOB>VC7z{lEXoBemU9 z>C)*1%Lo2(|B|97Jtd{eh4Kr0l__siJ%IbKRNW0UiZEaHYtJ^YoF!{X__aPq#yQ5R4kVg#V~8Pq4;O{V-AS-Mm(6wp zO7^Y<2^nx6I7gE$V$7M}W8o2+_vmGv4nAw-4@F}5c&n;VcpBU<0xH%IR;jAb8trx_^RmDBu3DBi&+Z>8$ z#S4#f4}SlGuyl++b6d1}GHzD*uW}-Y>VTcpQ)0){^EJ$&EEa796a|694s#YCe_|b8 zv#(LIS(<1PWhJ>~;gclT13Fe;aMLE#Jp1RG6sYNx46wNa@ip26%=8)njXdZDe;@J}to#f2Bxx+;dQ6eC3H zU8;oPOhunU`pvp~b>hn5&ZBs(G%FiF>abzd8DVr_Pi;nrH^iX$%7R&+OWaT)Cn?%x zjp}x^g3Zz_bv_cH*Ef^AFeqOQa|-xlE^n@)!I-Bw&_f;71(#NE)B!%pczQhL|gz z>d?AyttyEhM*kpjH9l$1n|$VZevPy?mwqwv{*NZ$c}J6Xlo@IwRfpvIGXSZLG(>UQusm|5{uu0PdSH6gb5SjY?r^40^Q;%}ZZ5gx zaaLD>TneZLk$&!LuK)#J`ueJK&A2KW)WytvNP+!hmuN00HwfZpKs%aD3~FZxm^4xC zCWi?M2pdW)xtWJ`G5n#n<$$WaX2g9(a8y|steI#2h1=P*Y#62GN3M3xKNl<>dm-+T z>CNnzI17AnQ#LChPnujf6OxgOU3EWFGG|q)j{sJ?wp(sn=-$f$nK+jT2bjwCp34oE zta_*xyNh0!vU20waH2UYuNXoJ44l_msB7c{4`?nxUT~WB5{od!OI1Z;Ly$G0Drtu< zo)*46k|;3Y%r|Llk^~0wQ~PrleXzwo$i3$-XvJ}^4qh=PsHo(fpW)p+qO%oC&{@}% zVvI?>yObOuCIxR8J1)^jU(T-T(IEsB=8pxEhUDENwwZJ%E(Rcm_b$4QOkjQ66{4zq z=``{~+74kga}F9rlaSHiu{}>alBgB)mN0!QW###hTdjnkCL2?g5DX_g{4rwqcoDVw zTx?lHcfhxRX5*z#PBr0sAV}GwsLSYJx{B)4vnd{+Bne%1Rm5`UQG6G5+)oKn>plIG z`%Y+8N0nfjYSuT77`uzc*T%!!CY36i7XD!`;yS+HQ!dNKW&ugnk;v2T_+|mHK#$gU z41E6(;kq(CYoFRwko(*r(>gq_TUP4oe)SW@I?4{K66<8CazWr4{HOakpVL|XpS>2q zODqVDZ%Q6chetCaQi-nd=1d#*b2mARjg_Bes;Q8vu3OAL*-86k8#0m-o7c?4S))Q6 zgIu#Iwr)zT)TONY4_$uQ>^k*$n^kmQ01Ovov#K<>p(Eo2eP-r;#{%ASS80RKW+SOK zZnR-@7QQ!9FZ_z2dG?QIAkCs31dHo5#x=Cy3v1n#eiy`pHkZ1+!95Rnl^>8ETttV} z`F87oaz}_&>ogBO%<$BCkGt(-x8f9n9}MI%;HUf z=?Pq0@Vmd`;{blq!FG38KDv0OGd?KE+T~`60&;mTp{ai0Zq!*?bM5=OQQ*A1_LiC? zq5@*l5FUOf(z@uD^K~|du(u8w-ei2vC&G%V>JwaAykq*@eqS=*UMiH)mPr~mLGH9G zf{@5VmMqJ8T0dmO5_o=b;ZiCdV07EJ`ryFyre|^@S57GEt_%vYv#V(SyRZXzTbDKg zpRvz*LHd!W8$V;NXXo{n*mh+dVh>ulwTuparIbFoxc|(2kyTKTUFQv+^h3(B)vL!5OHf^crVt;Yb!})TZy$8UYczaBuD-s z^=@x;<4!5po#w#d%T@=Pi!A5C9t|iWtUJvr&RG!$XyPol_*;LzDXeOLuGeKhf30<# zrWx4t?fdvQ!vw|wa_<>e$|3EPEw_`k-oKOYK?|>9NBGt`y}ou=?7XdS+0Qo4|4sYzntl)DT0@qYut@9 zb`cC}3(y%~NnMoFpOEa0s7i}&(i)ezqqFR9t%vCI3u3LW$WZ9vVM+lJhUfSJrJ46g za@ml+ybpF=o!K`I$k%0XL+2c^@$e>z)l`QQJK|G~>A#+RB3{#!wF zZyvinOz%%@+GhvYEwq5mJZ$HbFLkZ2UXD`^$~;I;8JP{FOKjXd0=Quz^iaI#rQ2ZE zvH*ThN*mr8RqgW`Uoi%H3HGUMjT(x_NTsjG)yF%%DpuL`OL+Sds*mxtoca@+X;PMc zv4DLqtid|Osc7S08LXbPte*qZ;o+^dELFd^YTqk1bpJw2$VI7l7wi;l!Azsdmfqpm zaNqBoeQB97H3yVt2AYfs2VV3J21>Qi?*?s*3VxtNqDR_%C4b1JE74)c*EJgSm_+_t@3#{utqJkud|Rm32lM23_6FojE8va2I)rRG6QCXW@O3X6_|=< z)$!`(48O{Q(KSgyTM)D)s^4dyDy#ttT>ryKZ=fJZ_vtC`uaADsDbKd!$Epj%^`9M+ zqF?@l93it;TrU~LXRC8ehve|rKA7UZG8#Vo+3kdxi|1qJvhlMS%xvs80!!y5R#2ip zBl-x^_4)2GS(|7v;7cQFy^cs!e?)h^*jg!0D8_dM(u&U7)4TLTtwIf`FZ1A#!v=E* zRqOjXDi*&EOKZpjzWMm$dNe%&sZb94s`m+fUa5d?IT{mrDE)=nX-BJV2ai4O<`BnN z*>vrv4#Awsw+@(yD{%DijVlu#=|))pUAj8;VFMC%1?u)M@$wRnw;9h;m;^WobH{hE z%VjJiYymc5KpmxZz;s3k%MFk;u*#v|lULf0kWW%aKlH!8xD6G&KnqO2T5NC$K}49B zC;s)bb&qO4^f1Rh4&wY?l9gX~(deTj|99zQQ>zK(PHtybk~coBodfs<7bHtrG0Oi7VCc|!jLo!7N0;Ol@uZqT#^hIhJ?kU>^A(33D~ z=%c(0*F7>KKD{iD{xyBl=N1b z!+F-)UoFeRE_zh|S`g8CJ$1eS(>mt1R`jSHQ-2E&rc~f#TC-M|N1dI zH%EKLXApES{rdFDwFgE|e_l#rwv4~!AxpDcbtBU1q?xDjN7~pt`@431g6;f{KzQpM z%?qEwYpkW#CDZqUHqR{6Lsui5gC*X^ozvxqya{-*MIa(OJ%i{l|41c^yz|Ds{iW5C zT1voE|12$1f+(|qv5-e>jhLQ8%c_wG=$KLP8wh!Su>OuEGttW6G(fLC&D6Ai$s^S7 z^SljFk!X&XMbw`49>fGFXcrJptXnh9wb3wqqdFnYgJ` zG;O+^s(f_SW0$FS<+H3FOn#Bym(Z$VuY+nsCDeGJ9aXHxp+;Z;Y?>~NjdIwyLXsOp zPVtF(R?2EDs4cig@wU0jEWA+gdoBIjP^bjYGjb#65t!A;uT1#g|$O)jl9`@f8p(Y>PQj;F6dPa|X>pAm`+|NXQ!9hMC>=DB8O(^U1K3p`BFbWFc;n9q*7ZW|RCe9rm(mG$tJpd(F)mlJ^68r= z8k*?Gv9aDX;p~*u7ZWoS6TQhM!8TJl{n{BPtqZy3+PuC2ob~pS(WseL$Xz4t)i*D1 z=jGxcORAOd!-HjKz5PktSh3qZfvcw-UdHE&!Nq2$B2FC-cX``W9M;qq)}+ni6arMN z=A&IWY9|8P_0ug_H~D^yCJ`bnBy1Ny_IPv9AR8fYFnviKP1{R$K3JeIKMY6%R&6EA zmp;AN7g2hg2w`jX+ zmD{${`;Wugo#=I6=l#kvFLYvmnK|#lTf{IQ4f3MhbcZ+;f}I@?cRmIsLO7M;rGDVf zO~?}CJ$?(i0J(k*b~9e>_D_-gg1e0t9zXl3mD!&NA%eN`hi5gflI&a7Nj9bR;&X-l zMUzl*h#6(^VBBI`n?L$a(TZMq1FV* zl8ytJKCY|nSw_R?-Q8AaJ>2spanzo0onB~Bn9`cq80x z87Ns$J@YNiga1xJf*J)-ZG2hwLs&nwJ;vfTv}0o|=@W-nbTUIF5PDMiuavI#L4OB! zv{qfSE%Ly=mmlxFSbq{N=nk#YQy}Hs-F+b(0}q|{z4KtNho7#@(F$=Ds-a*K)FufK zg-mW%DISQ}gnw;6Z{xGqCWJdtT#xhq8Zi@G+?mQ;&u<-DlBW>^x21Ulxce3ELsH2< zW1)aOXerkudzCtHlA+-YMTeF57^AE5C;Wbei@0}bY)`bIM)>gA6qBnivq1m1bt(4& z!QiYZM^qj+m~}7=EqsnD@?m z$qs&pSlc$zNmD~n)o||q?s&}yYVYB=aPBz;{;b0STH+8k_|QOl9Dwk_{?#2TdLKYv(5T$@Mao&gV>uK=9yw zL`D4ve)pvTwO@*o_}*HTbO^wc3?2rbq;W>^j>wpLoPMO!EzW)Kq4=bw!dRiV1n=U` zNPYAlHrh27&}zlGs9Q?LtspJ~kQY64Lq2kGWL^dlSV|H{7sz)1Ob_*+Y+C=Su&(4h zb*b;Q?PBS{wvBA}!g*4Vcbtxi!&+t_k5Yys+vMqhZA0lYSyX*P*1XlJx?#KZFH|{i zXSQp>D+45j)7>7r4!(V5=)qP=^qWd+TDtSz2x-UCAEBxFa~Kff(&o4PyeCAd0xUtj zIz3-AXVp_2ssp>BY_Iz*u?ErfRY z@@o-S@+i)%KydWGK3ee!SARmkDC@gL-rX-knN87&<~%}JL@ovN#E3twOoVt`X_ z1q&N9HHw2FUTv>^En>E=On4x=96&N!u*8_u0+!A}0}Vk0NR_aZ*>^aYw++qCtMHypNIpWUv1 zW%4)OV)oL1pg1M0b9G-p`XdwG%=Yz*yuek`wI8#`TC`>%(C-6Rakqd+?L|CD=^nxA zOEY@};&SyKu=`U_LNnQYxhveiQ*E4Ql!r=Y)#U9tPXj=Bh}WY%$K_6 zcKg|sP(_jTM3MEPxO{kJBJkVCqM{V+&Yr(5jFcq~7A|fXM+8fvSKEyjPVzkn`ZM6e z$Wji_JaL=QyC3hnhKeJ zj$CH)8n2`J;m3#+J%!=@)*Yb+_RVTvpHa|Xh&S(6?xy+Js^xYop_bP!f)^(2>7}&L zv+jL5wWz15{@DRWx?j`oCD!8WuPhrwm%=dCjpiE4UVQ{!j{E}oq0Z-4w#EmZtr6S` zaV#cIBg`{usde3{Q*6>)5*-ye~;`7XxvPv^A8l zpL_dPv>J`&tc!p8&qrVDtJ!^G5BV2Xeue6Inw`+A*5*C&ynz2zb#<$4s#}$(MV%$R zT7G;~J%3(@(eI1@j?E@}!0X@{TLC9}77I!cSodO)h47O!lT%Wy))~96hZ@$zaf2q) zK9-s|6RAOE5PyNZJ}z!{YtndGUBn3!Jd!YD6FcG=-6yi>MG*@3f0(U1k9Y7M8NiJB z^Q&pWw|pjN!BW2_WOg!#Bnf!)W07eqW72bBdH2FDd#E-HBkss$H)lWwHE5iBE6Ef~ zfC`Adn)D$#MFojkRo&ZJLS3I1^cT-J<}MKAc-eCe*VC|(J|P$u^W<`In#Eef<>Rsw z;Jkn(4H3NdE&?O(rL%qEabVzEL31)|{Ia!kT@fuPVw>dEbY?`Z)PPIN< z8MBQxCJQa=-ru*@#YL`Cg80&_Vw(oeXDE#L{tZKMwa! z_G$5V21ebo$eo3EI@FXN_3qMDGRiffCxLCRDl4O_H{q{k5P;W|gpljJ$bY?;{M;Qt z-|&JK&)p`y(k1TJW+UK-=RhTPMbX+MKNdOgoO(Ny1R{{16FNdp716ef zuBDuR5Df@dM%T~q({xyAE!T&#T5mn}KGNPj#Uft(|5n?D)gd{lsOV#|q-#g*^vu(E zG5E1L`7fnbebd1Df^@VP{22ic?=tTF(f9O#@|m(eHQX=>Y#Znck6%DVe%k2{oJ3eu z6MucCilw&-Xcz(^*NZkw3TXAat*J^IXTc6{#hatA|KyqfQ;G`V=hPnJ?%nFGEHm6k z5-m9vp|O@bs-rka>r*?O%)rg|oPUvi&U(Wm=a{JlQR2E+8sxov9Hfqo8CDKPE zeJaS>4v6q(qELEdQFFzz`LkO<{+Te=ZeyN0)PqvglUi!aEz-}?3&f@8{LUxp3)?0X z+CA=z1!jOtD^0voJ)(kSNR5e*sFNB~44>eLItGG)>IP#UwnlCSN^~9R`jIaAXy1xQ z(-!)D|3mO=|3Pq`e-m8U>R8+EzSc;!WqwU+&TQ+fD)v0@lWGl!ngNLWpp^!j;KdBC zdiURsDLjt;%?rRqg_R7*M;Dy?1ru0J=SE)9j*6%RSXX2YsnF8SoySNkoSl{nQJD$4 zqZ9m8V&i7&aVXWwR?#zS-WNvh&r&!?Z1?tKNlS;;i1>|o1*Sw15M_*-#82AXl(}P% z?-c1dYa5SD)=H-qj-uZIA2;fn#72>)NZIvnG*RMApKj>zmEIRK#?drEK-b;J$b%qM=?c&6q7<`zI^OhviR&+c_jE1dBf zzoGU_NEh3AzcIT@2(z>Lv}ROq)ynCy)zp~GXuTWS{lQ+8e=Suh#^`YFfJ)S!0@g%s zf5{7SN#qs&hvSw)z6Yk#@UbB66Sh@5CgRxC)s07S??Z)iAV{L%!0;+>f1W5HbeaMs zs5Vh_Wzppmn-9sbi{(~a0uu1FGaxhN_N)#e6s z_rjV)O{Kyz&a2(h-F+kn#p&JE;qRcgIk=crBe|bU!h?<&kk53 zCDB2tC3@~s*zz%Pr$o<|!JxnStl6<+e<##7j=b5qe_!CJ$sROivG|3|czjU*~Bx{nlPc)Kq!+zHj%Q*X*t#v|70+r^dmt zl81Xs>kjbZHs!5tzl_%lCK?YXf1SE;>-39wU!{A}@MnrSeD^9@A9c~_U5!UHNBKsEBbWP;TS5&ntT{7lC- zT7l+Hup!jqkz7N%TtA~qLzm^>2G%X-D*7kHEtutR^j2mP^`pTQQTHh1CSI;8ruBBD8t->bZ2@x**#p!pR*mtE(TN zB=CAr(PV~ZeLJX7gm$%*p7tt6TTQWQbk_$J647ei^jk2zyBtA)(}&NVWG|cect$hE zO$?=7f!(=vn<;WxMeUIK!mK8am$z~`@T#n=XIwzdpYS1?z7`^=s9BJXJ*@K!cgZhx z#zX~9cI$@C`4Q*sF16LcT>tm<{!Cb-+n`SF_}*HmYz*>-o2;g-cXlA`wZauZ{OBIt zYk%Rm73+Z5yJ$YBLbtq%&Z$5BKMMZ}9`;1n7OwUMuOM-|0z#oXSYwPny53unrUYaN z`@{Yyti+;>Ray%iZvqvNb2s1VDiR`uZt9_&>QeZ!$xx4|c)N$W=V}J*6Bq%Lh*>NO zJLiC1YOHMPR`;7|TEA(O4}~K!H9Mz=s;&8GkYf`317i!p-p_PcoYwI2CT#r8qBVo! zCd0go%mBd?Mgp7hb1#}CPy;4w)q(x%!s6N@v+6ajM_403nbTYEkvv62U!{*{PF-V? zZT;q*kID7Mmn_5n49{i%s~q1*sP)A8q~-zXn#qt6lr#|WLJ!|3sKN+(8~UhSnknEU zhUSI!j{b%KP#l@E zssQO;6i(^(r*s|s@NF54@jdQ2w)U%dG}m)&ud&xtR*!j|MLD%1dy|`SZ<=BYlTNTu z<&q&Mq`555H8osiz5Z6Xu*Qa%bktRjk6DGgke0;YOeGx=>4oPF)v)jr8f6+_S77kX z0=GHQw|r-z(w@lC-S~GA53s?ZbYxP(0aHO9YoF%0u~-!x!NGLfbGyxs;c*|AadUV3V5s|2YF8 z2ER<`Kt)Ens>I~y?pbqn2XgM0ua+*AN6zV8amd3P5ISrrG_8Y`&;;4S#;+m}O6!MR zASmV*Aw6bO5-z(?yRcI`Y2bi=8BCz0O$i{A_Ri7Hxy;EwjkD3;xjOl;&~@%s6S#Nz z)ovMqnnxVwn{N+!_VZ1IF&Y{hVBFm%tB&xQ27TtI$<2i|sv@0Ux5#WAD`2lxDdr-I z`}3)8ZSk{{`pS?7`dgB=_<1pada=zsR32c;442a(EMjo&8)Cc35G0JM8cE7JKIuWr z1{k=PH8p(bZ(7|$lk1tNBE%hK4ZeF8UxGS6XczF%&SPUNsHkBjb>e$XQ0ZN5 zBw+>fKY8o5J(D{EeP^-eeg$H$jR^<^e3S$b_gZm5-y!k4J*su7?gI>xryUY-aLpgl zspe66fHx>OEFaD7O<+0x7#I{Z;gxs%=UF$gbk$$w`}jNe|AAI7b->A&oCBe%?};my z9FKL=Sy4C7uw|?J;SJT2tA{lVA&)XvA7;i%HaaX3-;~B~)?*^KFYDnNqO%IzA%%Ur z%KUaHML1@%E!r4aPo=eTWJQ#rKOnfoJ32#&@Cai=&>RVuTl~I z-RLQthL12UMWxjp$}cB3oYUhBU>8z0 zuT~ffmP0_dPy@Th8PzEhaM#?B*5zOtf%lm*mlyB%ze%^A7{}sKhm#5!D_ZHWaRjls zR6@BPz(v!`0PrE6#ca#)R4b|(J*fSy#VpO^1EUN>b@;3|9bXWQds9j58>^?KRQJ30 zC$D$MWo!}b1=Y`ZmL6<=H-};*3F0ev@0CiV4_8GHjf)CXkz?;e3z!_tngu=D_h||9 zfD5=gCyS1>dZK?M_zhtK*6iFyY6luo+p@)jHhIzDF$l%YRlE8NdhQ{Q%5W@3Aa>e) z5?hM@d=Mzs^c*rH$Z|EwH@f9R;z_Zso~5oKkPFsdzCr`@$nkAT_d^b(x90u>QR|%? z`ik{f@Y=|;%Y&^S4s{o0G3ZeL)1YVs#~@VvW5Kz|imp&t=YuA_sOf8j?^;EeFHLq) z|M>W888cdQO$|o^uzFPe*k^Z2_@@6jpJoXlmRyi_Z&NK)4Y(T1O;Z6Pz9lS{pNSVp zBkvB)?A|kKEz$=hp*7|~l>jloWX#%6K=CF1_4Lk8@yE#!uXW9gKj;F#Rwk1+p$Vc7 z@T08>kRj<^@L$S8aPL9>YRMSTYu_%^xR+C+vrfE$(UJsmr^lE!d}65fr#Ota63L;I%K4LJ_waU zJ{i;98HRsZBpgeySs<6uzU>sjltpAIiIoMF1swiw`$HO7>-K7h#%Q1+kPX(=vHn7W z?P>`I{Zhb#&oJi}P@4ZozTqC7R`&Zjv1|2)*NohIDX~~`pP7@tBfFA5xx`%Re|4+t zy^<1)Det<%n@>5Ae|)yHE;Bj`J4rM+D1pc2b0z1Z95XNdU!|(TdT>q=3Vi;*%`;+=ZX8QE`pgwO+^tFSXA+N0(Y zN({~w&}@RWX45qQ+D_G;>d9#doLJ7i?vGjCJzvcBT?}BtL9=o8-FO5R=DA37Fa+Ah zN8~^%YL=mqI*a;h_HaGN^A;-NBujqOioLC)UaHT7YDXzRtcrfx4tC5V4nt5)jpDlZ zcl;SN-S~gwPp^OC&)@%wKap}LV%sk030mYw)uh-LRZqA=Yg(d+#l%To&t9G;yP3Va zpunwfslqDd4Ia&274?lDUFC7Q17h}FMfpiDr z8$ZR*Umth8vkv!kahUM^0Skkn$W_N-82y)D?+H(>E>WW%#;kw2T$CtRQS3iTKh19oxvXlg>4@je zO;|R&1jxtbb^Y8WB0?^4SGrHG`qpcDjTHCi=wd&u5hFgwe*B}2X`LrN1L@xxc1%yA zg~YCztT1a*%keraMr+@-zlzI#;uPDi(|1fT<Di@D%TQ1W>1Zm((zK4gh4pFtM`x zYs6Jw@XROiPg)#Nl7ihv(>9B?#2YBJRYYW>nladI)=pW?U6kpd-5J%2PTtLR@hUh2 zhiay#V9HR)*Cb`;LtQ;qCU>4M#pQ#@VbtRDIORSSsb>jYVkU&0?h+Oj&XS|G03)U+ zS6Bvo#vfE0HzRKolNb-Vw1fNj+5!H!P)HK_ywFq@Lc~-Gdw;XH`6}YzmF~*uO9!uf zyzp3co}H_)tQxjFXXPs_k!#84=bhMVWSzZ)l&!j~#nrv)P6G(D_$2u&$du$N!}Vd| zph3gdZ!^h19oO0HX!|VlvStx76N*%(aQZvuEZ1)v__;@%&PAOVs@b8R zw@=6MW^m)KN3?wdfBch+L|5p6Wlf90rA6T|wgystqSfD!9_b+dyI7?Yj+W8eF#Uf@ zQl}zNES2UufSpeFjejfLA4;^&9axlNN^0AN0$2CZe{uFRtj#JD?Tt`a@1<{Pp`(Vt zmsuRQ>YwRSUB=5|qV2AM8KgplU+kFnvjkmgATTS*_06@Y2KyDSAb zzX-NqQGAx}+pa&kit{feMINlY35T(O4pt2O5EUZpTl?zvscQ!@m;8^t(Q=_)(tR2Q z)1A0p>I|^K=AegTR@3zn0q&-g9UUV3wg>)`xZT|(+I{tyYwi_a)HGiKZRo-`nGUH9 zY$(R=Evx)AzGf88946%5QQx=|D^Ylxb=ES4o2DmbN9@x;m1cgEA%Di=ET+K>H*{pc zVlW?fDYX*2LmWpt+y)lhTz}?3H|6ClF-Br-8_i9aCgz*#JC-IpT#_Ao$7e`UASKGT zx^fC%K9V?Oq!z&J?9eA*&xmnbDec}EukyJy`+!jfvxZEc-O5_Yb>> z=V-g+6Ic1N;uI|EPQA3I>CCS(>zU5=n68@;D)BXlDm;q52v0{B#8km7##ECNtoLmf zjj7)GjX5r_rFW9o_$Iw3o1DZy%o4;oXJ_p_SkAL7Nt8WxwFcr)QLXh8I}`Yue-X}5 zF6JYNH^zDBASCo41*LC^J0(J$Krd|eFnnq$JhVh+M_O&z>)(`}ntL&Dq{Og{Y7)z^ z8rE8=42x-`j-dFOsZ}h$m17@-)R;IbtrXAg`?`prJ-JE7+siakJ>&ioFtN^a{-16u zskkMx8KgOI;uRVaEVmj3_$7dvWya=zvcACHiE{ElqP`F(>?*LBYVc}#*9D3XOtjxK zD2=~ zk>>EISIUcwsia1>1Fu01tGoSm7nHlF*_#?sQR|z`s@lxszp&ovJ77=U++(Xv8Lbq+5 z^Jl^eAqT3T-}+@s47{ym{x)-w)SL-!7BC)H=gszHnTg9r8%+fIx&pIS#Oz1IwxV)s zKEt^l{lTD_=u5w7nyO5ZyfkVL#kc=i_gtWa^YU_D zlA&(Y1~W^rq)&a9wWT|Db$q6ml1iy&N?U(mKgq=OR=uD&9ej>Xh352P^gdBj-zij0 zC<^$950_gcmw7G1q`*fbS>uly9F+gr*Q{S)%%p-sznZm?Mxw}{QUbM`pH{=fvd zg!Lt1{8ezd$c20KkmtO3<^q)>KO?ThzcMw#x!UzXn+9L6`&rKgfzAA0k-c?Gsa00w zp;?U;)sTLc$i5=PUTrMxLF}~<=eD_Le-G>W`34mBb>OP~2{AW=3muc2O-|DJ!nK~H z-czf45$9!IUhIG+GBxR*eD1*a0b>V&MKWIf`F|-&Eqfh?#}-jp;eS_fz*NUZBKV-U z?BB(Br#4D?U~3Ge)LHir&H2p4`TP<`{8qD3SA*NZnDTEDnYna}A~e5ily0#elc4l_ zjQ{3jtZp9qxBSd7D%(5bzBGJ|S3NT~<5P={>ItV9TAy=U%>MMe(;OvYE48v3W6QaF zTg!i2xAwayNFMw33tb?BMyZUY?-g!Byz}H1_LUe$DVrF56N-61y|Aq>Sj=0Z3R<})lR#%jKRh>DuuEPA>Sd#opOER?lc=^pd;*PIWdF40)7 znk0T_F2sm0<@~6m^z}>MJcEiFhcmW|%}}NX>a0MSmydUM7Y%xfi}o-4?ljJR@q+I} zSh@v6@AllI8(NT6p+R;e-^Azg$2`ha$q=JMW<7nzi6xn(H0tNOgm_0nW_ILs_Vij) zoGtT?wvQHW=!sF`-r>4we}Z{>#E-r>Y61=H$BWZ&;&#vG>ELGMGv(Zz-a-8|>Fzm@MOl>@;;Ae<1UfT@C zui`9wJ6}m?UngZgyo$sBSXg*gFt4MhS6^R$Q115a7xFB95~WG+wvouj_$!uu67)An zIgU3pG(5MUb*Ncs%1N0;Mr%^uAZ30=ApxI8JnxRMQ{+4b|Ggpqu{_TW0skOnezU5k zu0Z^r8)W5nwIn*^c{hD?OdowoiH|QD_1#|n{v=$9bnyL%y{IpK-gt6lve|vDL$qIl zzFF}CDkDxcBYl;vk~242%O7eo4s_ zXbgHRmFkUpTS{K7vaUvp_vWDGkENxqstESrt4>p-baZq~ZGwo`g@xoA8XD!etiDI$ z*m3T1xSK-<58P2vDez2=VWJGWPH{*+@>x+)(Z;E)Db5Y=v$8TSF2eSsRfi4x`z4Zu zP3-ZGL!8XP7bO|UPc(e!&DB;qZKUO2XPgm^s%^`n`0hx9a9scKH55aep_Q{0r+kG3 z5yxvdk)l>xTYH!4FoGL%EnbhbW1u#wtuDKZBRY+Jdzudwl#oF8x!53jNm-5R;m*2M zPk;YSDp`bIrqz4r*;55ZwbnRaSee~L41tG5;UMDEEmc)=)ndOXT>1O=I?F{J%}8WSN(GC;+rq-;VF$Eb{MHNP zp(4B?FEuP1d{k9caR+6v2h-5djJH_+TtTg;Gp6R|hAg4AuqRk!bTzfL8~9JaL$-Hz zPW&hlE=eC9jt5BaMy85!>TW$@|12ccaA#io7Y#vz_0^KR!L{ zLtdyws47^yrLIQxR~o5dzefk{nUF?z^-tDyLdqo2s9(MvPXGO3MQQ2s z%bTebdiwgQ>}0U%QDJ4Rmh9Q>6Mgym53H>x_M|=6e~8Q7L};!DI!lQRW3|K^_~{oJ zgKjYeUz}KRZ_JZ4*ZR55RqOr8u<(c1)wor(4^G5eijhk8y87@SL&VXlf-K~0 z9qw24vb&@tlX5q|sA%Ae7pK|yI&coR(!Z9@%3VCY?JZ?=GS7-GGb`%?S}v!|)>@6~ z@aX8M`}Q(3WS@$H4oQ{PEB#yARI<)sQrD&C(E0Zf%$2?|Vh2kW{jMwTC zGE*xnX=l4qZr{8~a!7_47T#E=AwJ)%tq{!8Z6=EAhK3go$&Akmh>5kJ`4@MtySTb$ z+Lds1L3}HvTtXsO=CV>UH!it2)y=S8T0A0NG|$5jL2V&4zq%?I(ROT;Sz1gie)DB_ zmp)rRig`)9V1=Z!5XIIknzDq)ZDFZ7a>Hop=}W!CXS~o;o<7Asx^_{zU5`!dtdpFdw)(Gk|Oq%E%5i#b-0Lfi+KP+dzEa;`L}*%V2vsuD+h z7_D~W8Fn$8HB3FlAo;nl%Uv@3I+Gvdfi^-K`zmf6Hd5^5R9nlezL9Xu(Npxq<%0b& zG(7wew`n)#HbsmJz7Gy{*nq7t$4Uc8=f&LVsi_~;gv%?9pTt*c@O#~fwRqNGA|Gj< zC?B2P)Fd~?XnHMCDJj;nV5zWR{;x(;xU<6AO+7tzj~`!{5panli)xQsQq^MG8v6Pn z*O?H?-LG>v&2?wc2^}jXw~QzbB~w%z@FrdJibZ{(uK%@N?Y7he5&mjLOrI7iqK@XJ;+>glXC4 z!EEQNSUxSbSqWib|9)fCg*5hyRAd>fhy{|}5Wc$4bjAe>;$I7!mbM@%K1hh&@O4}D zI6mcypT+r#1xcsOV_H^9UKOUXLq56g?0f}NNVBC>K7R&rj+&YWqn10`FzqUxFs(;G z?M^bL=5TH<4mTftuX)h9V|=XEYh`oTA-$mB6vk)k!mrWlxXtuW9BY=WB7liNG=mi>}#*Z{H|k!~4OWgc<|yUw>1%mIIQMg~#b5ZraWuihtI-3#?Ck{c7l(8)wSy)`; zQB;p#+>XC0W?asf`&Ha=9I@2iVI3f=HifrNszXE0Lp{zYrzkBe`~D^M=59#a$kE_l zQlIVbfx75W9Z3ZDt1pApmh4o;HJROOuU@^9<)`_STUcjZd1~;17Q(7upLu6zXPa-w z;N48t+}vCqP7GUf*r}SZ=7COXO6l5In%cf&ef(T?vhKv^@>wr5qS7!0LEIjLv5O46 z6*vK8!8AEb;yqnkQHQZxW@cucg&N$I?WLv#0)!S---C$l?i9kaU%%|Vw?^HFSqOGs z(Cf-VQ>i0IkA58+JEcZ-`c&Z8o}OoegSsb9p0w~8gQmp8gV2w{Yd7JEFQT$itcI{N z9~)fJb8gb~^Tt~Kk2TF=TZyP!7avQw{X!r%7Y0jyuI&0s?@eD75HRrwHGF^O%$Zp8 zD4$fs2Lc}FOzwN3(NsW4SQzq?$7n)bh+6XC7^bL5fF|I8Lgct>HP&^FugNs2I@2na z<%!Sp;>?Qyy;@=6;d(|DIwS`beReh7md2)+&L=)SE8jPT=)@RrW>AJSeyfuV3|x#m=Byjm-ztzo~F z9^XA5g?#o#Yd0^WM=WiT@KXOtGK%1V_)zDATORXTVx}S^W?(}@L;e#_`_G+&&LcG= z<1nMo`f0`*suM>ZE)EG3o;HS8$_XZ}&32`il$_baWA?&YS`_Z6sy0kJeV=FysSzyD zal(6ZVXwcEXEBXGb4;hUB#T9XhJm46=)%CL{K5?Rk*AWmsxe9vijk`vs#!~XHciA$ zTPSu|O-Jwc^o=FV8|7 z%|ufL=Wj+28Gp7dTkCbXu;MP6-`3dWyLkoCXtUGVoUM_C@M9xyoO<-`u9Q;{`uRLY z0n5$9lVNApFITP@Zm<;RUD(wdJ&b=av%VABXgXhKZBUn9?|`YZ%l;VFX!;ViJQKxu zS-k%jmkT#<-lUSj#oqd z{r!cP6t%y-S>461)$m1BN(Z)0x9;S|Z|EQRfI3b1PL7fvUV`0(Xz>-qDZvdYVbK_Zj*)s<#O$O7)QMq^W&!I=(h?Iec^ zjL~(x0#s=|E83pesT_l)<_>kj9cyV{#Cz19l%Hi;e50VC;FI&B_DpnPH>hOWq8~1J z4ph7GWoBk_D^D#P{p^PEi7V$RBhM|E-(D!`q98pqzTz&TrQSjr-lHI)Jzh{)MnFr`YkI*Bkoihr8G8Oep8`T<4ageAz|NLYYz7isu+ay`hCUSz2fv0 z*V_Dk_v37R=8F!_SDvP^dkgj&tZ!}I>~|r3;!PI!1xxRXHbOa4eSXcxNZ&RVI$d?cE8xzxU#z)@y zDr3^v>*qHP>ZI6=sT3?xk8=~e3--KQZ&S%C?LqGEhE#yo_omAVR@1fSU9qzMz zJ98VJJWEjRyzeF&@?0LaEL)nt%Wghg({Wk$=snu))xy1psBV}f&$6BL<-uXnX zI>#2vzb0sg;2vdO6*InXZhk2BE@^Pu^?sLO-6MUiFD~8Qj&z$A#gAwSeSQ6v5aZo?!GfvQ7_Qh!)bhup zy97aW;Y_7Y$K>5U&J+$S^}*56FxYqQk_=Ljp~_S33Adr>Ug@$F6c%obqZ0R6eKUQM zo|g6_;P;dheFhmxZJMNm0Evcq&CHYS@0SfYBU?HA2h87AI;s;F*cNfvW~XIcsuo)R z^68~1@8Y0F(;xHmll`&WZFi9|DB9T7?Jns(@1aszmCpWOL+uuHELqSY;f0lzY=#a+ zGKSkm+OIi7&r)Dm&5d()aY;>2C*iAIkF-z>U0He9=99dH6}0tx$sRmk6(E#&r;3W? z(dzUR-iZ?3J&&1N>5!9?b6gk@kP_DYIW>zll7^_vZRt5-Y`Ogy6Nz}9UQLc{d>}suI5RF zR|ClkER@?Dg{Ux%EESWbvD(<}rIE^~x!Q$#o5s1`nby!favf&OsDG(F%pXC|{iZKO zA^)_w!-Qu<=%q?Cn=HBj6WzXGP2M#+w2zO^eDQlkbwP1{fqJLn1$6ghN!N-Kuc}C; zM<%kURUyMT<&C86&oXofa?+wa8C@lB0u7px$Mo5;6#tE5mts1WwkD@qqMoxH>+bHJ zFW2i$zUJl5qs_|cvKwP0b>BApW}kK;WvA7p7-?PU#Ny0IiVwa%26Ek{F2+w^O{uCy zmrjcykvwyBXmh(5eP!19lBQT$b9HSrv-zdr9^sg0FN=OrR5)OoHs<>|uy616_V&WH za&ji1%Wi~~QdxT)8ENX%HxMmw{P^*+C3pCl8*jjm?Q=BuYy?$Vi5v~--~f9z%l;=1 zr@x6Le(@PqXr$sk%cIV($k`HbmdqcB6WeM6C-Db@b4_ofEECQ6d-V$M19y;E*Eq?-X}**3qm#Qr*-XDh!;rWEYEcE@Sx4f(IX&QHtsBz7iK_h>+Dpa zmvndRFdkN^Y%I|NyuEA4J*|~IeU6;@+4GKUQ#R>{MpJ+uv36IkT=^oD&#k4+G{4jy ze`OhmpD*WTgu5w@*R)k;Wv+bvjCkj|=fih2JKNjysvBPhO-z`V@clO&9QdeY4=i&_>Bd5*%B&E{`U2ti`0)WHCkvV*sCIgZ`N?C5 zNS2j1%{8bZz|)YUuXhW*%^}l`1=8Wjkt1J5MhxyssLisHuS zp&?Bl&hzKbA7IH!5D<;OOnD5LqJxOdC5!`Zq#=-eR&&1W+#|yZmP>HEuz3-YLE3d> z9E@zMVS9k_BzcLXkdB?5oy^LEg!@*(_k-e@NDp6#i?M`GJ9_rZ7m5=NeoUmWB@fpg zfgP#N%jvrACZ)4_8t&!95xcFy5=-*Et)3pL8Y6g#GSE8^sUR!5x}Bd~a4QAFOwThi zGD_{XevOhKY%z7$mL|n{QoN_nOAiNfXm#jtRIwwvTAh7;r4|MD`8mMGimO8qiJ$eH zqcycWoAJ#Nj3n|R7oDGP?8UvG*=0M8ZGe;;^2I3|o3FS>B(U zkaJrS5M*U#*++i1cXc&Pt|0stAB^8opZ#R+^GheCvIi>|4-NCVbB;%Na zQeG|suxi>RX?l7(FM^Mo8_+Pl_#@IZ_H#aSl4?{uBzo|6;THYO(GA{{99mc^34&9U zjmH=?MUSr|7$TZiC)1%V;$yVx_pcwhtw|*-MOpjBJt^nUOU@Z6LoZGVs#>s6%3P&C z@_a$5Id<91cy(sBm`-6$ljjMOP9}|@>f?rYU)vX6E(ja&QWqFhM!Ff_S@ZUfWcmKR zArRn7SKHfpaXme~Z;@nd`w`z%$W9i~AgP^ULZhRj^X}CUJ7tiLoNWn*|0Ba${MC-G zvc$a?Cd!qrYm(v|s?|_xH_R9gq<9*fD`8Rit9f#lrmDcq(eaDAgi+3X7-Xo2rWz-E z4)_6O#?8%5Y@-SaItA4>*VjueFhJ=1sOpSD$RUxE?#l@6LZdRDFu<3;*|+*tC{FkK z3k+o?BFvh@S2!XTE|Yh$F|ZMXCO0>?`?7$l52HGh%EDIq_13hBMBSf%h#`u znma_atok|wkhuI5|fhp8E z&*x-1rMGF7XdUCc=1VLH=H=Nle~LwhjKc5w!9m0NcTMTZ`n!Hu|E&uAQ(L&$v*{Ta znwFOxi%f}Sgp~Pg@IT)rf>a-byNr*g%`qHB+`oT+TRr$hEt24Ne==Q`VXHB>!-GU{kKAab?Vv8 zXD2h)4KSf`p9~WP=1mjXc;2DrF%W9NTC3gIS1pQbNi&Nv`|M5~du5GZ;~4Rk8>kwCBFKLwoui2cRoTD}K<)D7d`JbB=`ZFs-X zNoQwg8d}qEbll&=qj7As%KACgKTk7PL@f4LXBgK*=9@HF<_UBq=H@>aSUkY?v# zQ!amRutAo7~3xK5})vfkY;WIcKuWo`;gq<}`%O{KXj2ywWML zl(!=e7l8YE!UUNa$ng`WPN}CD!heZqFn-z}nnW`}8&aHV@7h#F@Luv(Q&mFV#KeZX*qB2)~Ue@lAtrUcR-td6E9q z%}5r4cq9um{i#WSsfS->0VD3_Cb}NhtS zw`YxmM(w-<8t>ZIfBMh?kVVKDrKXm$_BlHCmI!9z#+y>p5W9NyFX)8{(=}$zr+{lR zdGO%v0~uu%6;o?#GFVI{C8hU{-w%q5i$g_oT^h3++^Y9K9=lgPYG1R_rw^njEC`T8 zxphV?lm`$$s={@+n<}`156Y_DqdDT~>A7tNbO<${(KF!Re*AbahL=};C4N|j0@ea( z>t>s;P+;6Ul631JHK?+wXRQ~R6^u&$Vamc5yuG}~^JcVBdh=t9Yi+U_fQDxU7L zo{m46%h9oE37~4pSX=ujg66`7vZSS>jNbRWyt8nLlY)CMzqq`LBbT^L48mZpLa7)? zQNS1BHWw$A$0J!%YinPzJ+NV=40;U=@i%X48o9n%AR)hhH&McT(czBmV=F2zKZhWe zS}1Q3K*1ygF_G?;IjjA2PjVVU3wC4g=ghfOp+txk?XC``GQ7X%?W>BM9kH>oUjWfO z5F%5f`o4t|5Ee#;4rsX$c0B-NAzD6ia>qZaG>~L2x|TG_!~<3J_GB7`w|0b(K*Uk^IN;Pv~*YE+m7_q5M{OKBx|mI&SXttVPV;8$-|4~Jt9@3ztVm= zSYqmY5Pp1h+x08X#MDtNe%puhX6kdhHIYQB3y9dbxR5jPBzaa*jq1k6DQnI+94>WU zoRQY9$r=w89+2I`C&EF^lZZ$X_4f2gyf1o@kP#ke(y?&e>G^S`vEz-M6&V?g#rU3V z4cS3VID7Dq#YKPaHeiQD?MECb1&NR3H1#%f6`+3r@C|l${+U+WD-oy@G8EenM&Knl z?|m=@yw=5&ZAE7+=;Y)?31t#Kh^U&LzMZZ=hD-a);NUS?HSUfrAo99WX-*sghVzhe zH^Q$ArSrKa3{djh+}x+llSN54FK2{XdVA9w6;c;-n}Hexu>?>8+F$4?7jt7Q%hxvC zB_X>31P4V0vfs;;6uwr%iTNwXB@;On`&|XUs%v~UE4Ak`ZNmaMU0ke0ocu1N)EuqeDtOl)XoM73|VWJq55 z18CPCwibtGWUzwvDL$6M+I>GHB%~&Sn~U1juDrA~Z;qS+(u#RW_E4qstYV$&{W2N< zg5n$Bio}=}wR#30+}IcFOlXdP1hub&Lkdb|CvhQd2^?N*;wr4E$ITTFX%kbECIeuk z1QVOThQA7(1h`;Be|mpQX1snAnNX|1{K&BR)HenBzr6s!?Av4N!sh!6yP4>S8TrZC zzsn{CQ$!hhzgCed$o}{0DzuaMTzF~=_kF{2Wp}O1%*5mXHLror((}HviSw@TKX{|D z!ej6YG|wq=DzQ_MeWylmAC|(eYlMb{<-1)qzYvs0Orh+-#bc?_XUl`5x!XX9`b#by z>XYv5TVkFyQIvQ0kR1!{V?xSMh05nOsnbSUOOhtAZK#1KIVqR-YFAnPX8m%gqmG&PhR7>1Trp{O z-*Nelt^~4BmEFtJQ?Nj$U|;KYmMZARABP?sG+SG)NBJId{Vq^g%^p5H4dn;Q1cV`b z2qQZ&3~zT}SRc)_({AGlE~=#>A^GSW#mi449!u}7Y2-<|m-`H3@OQbej9lJcTBwZ% z42n~dSBpecLLyNh^^hN|BY+?1FF;wKzvd}q#$zIdqn>CWm*&R0ND2zp+ZaSJN{6SW zrbgB=K$@ILdsF<0J=H)$|9lPtf!S+HxGIJ1AS>T3Ajs+<=EIAnxCZX>FyqA~$$ z#8uY?npkp6^FvMQ-}-}JgmeEzck zItHh?rwSTmr*Ftlw{m4iTMP=`=w5W41mQ%I2&HAX&rKR%&D*pu^VJPb8#wjgUh@{# zTQPGowMt~SvoVw;iaG!zJptJ1z016ok-)%CpYN5zha<`O zx#4hDoJ9dQ31&}!C83V%RZfok^7sK?FmHUETmkg=$j$8%{V9DtHfYvOXkr&3(nJDl zw0gd}j7EmCP#yzf9U*_&2y1O?d+2#maI*nPq&y41gv4>g02+lFYqtCsI#)LQzoPRR z57+#E)VE6R$cX&FoMmcM3Vk~X0)yJ_DQ|Kv36e`Eq5?;Vb;t$j;4xtfeZn*jGH!X7 zg!i_iO4&N`F2ifAITsUFff_i97^w4!$$8DK<8moewm)P@03&UYC`f&Ckz=z%%yQID6mH(&`Hx^D|pV3*jByz6NA$zAtN8mYps& zclKPZK5KhiI&oPN88aU!6=ysoUAM}*y#9-9SvoTPbA@N_@|0-fyvCeUWw2|Wlj9!2 z2QepI52gBlq7I4~`WIc}xbH(KWyEN!TWuY#bXzh)bWz@vuuZu$Gdt_SC{+FRTVtfd z?)3e#Rd0CR;K71r>Si!|%Hc#S`NGC-#(E`ssI|XEZCD=_lT2a%aF1X1d58H-HrG$v z7f~&9<>|<6-BTvDqI{iRM|(i{PK1OtdTL z)Hd=s{Gmj~6J8DHZ6hB}S+!d%l;8KhhTn`D2`#@l}=fc%)OfBEo%jPfL|@&?#L1e6HV~uDby=P1ij-F2yThOT1F+ z>c-TczGWw4ytRqL?D_Wg>lqn!it)OR3|AaaY6}8*o6we7&9 zkEnp&f`%W7>ZK(IzCNvL)J$@o0D-Xqj*G zK3PPhYi`WUD|eUXl|=)JE#?M)*KpTq*mu)BOHwhHE?pv4uap~~>{lHxzmR_ots$UG zqOE67UGM}+wdV)8pyMglap3Kw*X{$E!74_v8mpOWC7m>2~^YVsVG%<0+i4h+y3 z`D`FT#Hm^9l%PFhS8a3Zosrv2v0D{dmv_2wUL4?MV0V^kI&7C>3L^abmhj2O+WPgp z=a5f*=A|mnjhw}KL|10z!N?Nn=!Q_D&oYVFx>|N(N?o~fH6s-xQZ#whsJ?c0n<>24 z&{iG_Ro8xVn76>$EiOO?>n_+#&s`|nNaAAjicCtss)Jkxx;Z<>6Z z#I^?JPlaJQjU5Vg+8@4bF|SRd6wAd`c>8wb)Ts`Gasd_O9FOR2damA$hQ41%?p4>A z6-DptWZ^<=SstMamsVa4xh@1+_@Q(Th;|Ep7!F68$!|a>o5*`z9k#3N9tfH zx7Vbv8RmZJztwm-28w!Y;t~0=tKfwIRVA2{1E`8vi}j6-uVl=hiqs9IXNFEz>xG(f zY;34*Q4h-h@HNIvO02}~y*rGQRwj5&Dt_J|9WO#RF+BxLFJGaG#Q1-8@JjG z^dVGnW|`Sxt(?$VXpFmXOt@B0O9t8KNYKC>!9M}4h;#1$a7PFsgTQt8ggqGa4cOH{ncNt1PDWd1|Dr!z~3l4_s!fO0`E;TjqTJb3f?_&vQ8Mp-q-iBHD} z$=Sqqr8V)9&ft_Y{-wmPu8t0Hg~)&%WraU}EYW-V3~FD{Q1CJaL#Pm)KNIPDAoPLe z@0%iUHg}0uVdi`-fB1I!dS8)MBQgfim`;pTI?K+5RN~c(PyKqhr7?bf-b}w1IpEqp zbX!m(rIiQghrU{Un5*qW${sqbH-*x1VE5Hf;MdOj`Ws`o!o#j6BwZ6x7PQddN3vx2 zET1}YLPzSv$%gTWcr($hm1veA6lua1UjWf1hYoL>ezM=aK?0_gzHVb+J-t(B_QuDV;3vS83q^}x zNazsa$K2dwCQ^{Gn!q$R*6fx;FOB)(n}xe}c62EhIHG4vq);)yaK`H~NOG0Ce z#T(XW#Jl3sgMiwEa~W;)nc|bA@TQZ!>IY9nDQ2N}TJs&!)7bZ|hmcJJ_ann_!4WZxXY)i4-(e7aD#kpI7jwgdt|Wc~D|0+0t*jLCp_X7*h52nz;-g$pD{Prc5~Jr3cN#%>DK z1GpR(T`#?mzZ#739J0N~T@5hZbgl07&>aSQzJ7OUX=$`T`QmU2Uem&OBD;j@ zT|&HiaY&XySZFA*R@E>Leg6D8AzF>~H4aZ(g}IWB^9hr5Kzp>+wW|*PtBrPOPf)zA zU?Jve?)F5uUyxM(wq-;q^d|axs zYJdd^+s)EMHNDJR?Ij93t3k*JMO`xU8Efx&F`YNy6S1adpW^TcO)W|Y3;nhA?fv~wbZAZRfVX2iX4JYeIB>A>3$rY#%Zx*o+t zA=%j+&^|1T)h6zlifmc7RO~99Mb+t`1xsuhf98?D#O_tHPwfm=@L{{LL>p{X3VSfC z4MVFi0l>Vhnmc2yJj;{4-L5@@vdy%CE$vF5y03Vnk?l3vEiZe{MPE1T>G`Q!v;TWn zZk3LnHg~F8d~mjo5#t^-ok{ohij)*sj}gEsrgtR~d)b|B=(M2EPrVta=yWDA(I5Cv za89U2q*#}&`F!`M-WKEK<<;AfjPI(|nO^F#UXfr8PRn>&H@q0opJw$A!{T0%ZS#q!0yy*XQN_pVL-8}069RN#fR2Y|X z35Vc6aVh_DvjP?##PO=F2cad3?cw?lHBbfzIxFLraMRH_Ii&tKpxzLzlp~;60Bg90 zhnx(4HSpH)12vaLBS3!t-Q@bt3zlQVk(_%$tiv@fDL$LD2OlGzd}KOxLHtwJWm;O= zq6=yZ=E30xlhm@OExVGT=5GH;k8lq=W78ywBGfG6403R}BVX_;#QcCAU205LCq>jT z8h?z%w@lOQt?tDg07X_9+1t|t1}kut52_-Oup-1FUS0@uMqj$Sqc-WFA`pEas!^#KzDk{J=3KpIEJNWw7=JrqNcbc;v!Pks6$of-luJ0rMeqjC)p+G> z@}%)ws32e&iY4FB;SPZN0P}+k1r$!u9Qeh>6E+4ajijOXft6&`kF@|s1r!)k_yJw? zUEuEpu3hUu8^A^eM?jJDtjaLnVXUTQc1+)nxMU6v4zo)Um78y>tIr3Re3)I+ond+8 zxvO~lPcC&sO9Wwpq{*)}0tK4K&DOtE;3+W3O~9k`#&I^4Y=Nr24>rek(7AVGq~c{{ zolDbBF(<~4a$dy3>m{=LCN$8Kahg7R_S`fTTnn=z$Td;s`4-@GVziCEqnif#9BzDW zy16AW7z%>wn_I>C#<^B>;9l;(dhv#QHoP@b5MlFZ4f~5qOP_&|G`X`eZ&CD(g!zpS zwA+cNH~zNx3_tqQ(aW#=Go|%ExAE$kK!OJZ2HI)IGeL9Ps@xb(=oDeo$$=$`yGq9; zt9IAWFigL~{;LqB$XjoxeWF-CGv+FEw$atWfGU4me#(nnbO)cT&9na9e4n*o#)Sp6 zvWX^S%EV5)pp${Ier}*?s}9l_7(Td%LH~Vir6)6AN~zAx30(B<4vqeA?-^5XqD9QOv4HYM3ew=m!s_g^h)y&MMNcybgLg);MgCAx)NM~3Z*yG}o_4Bq zPfJwholc1eb3~s3_mxC=q+*uviD|7%U^=3beQZJl-RgHA!BKlrUZWcD=mmcL3Vg&d zL`wpbLL`W;_1_))UbN0gCFhmT5!*@YwT$7#nPVD4bY(1(uuxYY{dhhd^6C{I;*pEX z%C^n~IMIS5H6c$Z#qq9u3hI3=Or$48)UhxVAtqJr3ydtVKf{)mmY_|p{LC%Xi&O-u zam5{h080NI{czHu;)KcGDRlz&?SHceSqqS_f`1U)+J_Mf7&KNZor0JRgY}4e!w$0R3X7KOJP>gTkj)yCC3n_j3L@C?1UZd5Q1LIm1 z^wKZn@0pq&L^zIrI8cX&paj$fV^lCQ;UEpOhNw}~JK37N)2g6FIp-34F2Hby5y0#i zrN>xzC12aczzpKDCvhGSh`&EVAUqdPq17`_*+J$$iEv;4@nUf@`xu!728+d(`V2k- zMN{~2Gjiebf_Fahw^bdcZx|5wKn{rQ4{4tKJ+mS5n!3SZmq@bW6vRRq4pD4W*#=uG- zJ`b!L+W*@DgvELg{Ov^(M521c1awn```Gwg>h9bJ<<|dj(v!w6>jAB`@sA{*i`#9M z+Xu$e4O-DOW$~_@W!}(>4T-q&E(9Kjc|1T~z!PJZnxR-Qk>2>4P^XmrZOIKVw2ck; zX=oW4VX(_@-~7Z+wsgj9Vlkv_2qX0Fz2g-tIcBm~4i&~^km-nir1 z1qLnEe3@bdXr;iktXr=dYtbedkr#keqk>Rh<#5*7&F&rvjfiNN-+KGU- z7$U%GQRn06$Zxi2%L~gygG7Si4JHO4no_jY`&|sszSr#bz+VK$Wq3`7{U$U4cHM6O z2MhT8&gbK=P(-s1hre=+=D`-eZGZp6Qex#EX)u6e)m8@^2y6muw4uL=`~9&}IzTxv zXms`A#ItGP-wt5Kb7+u*t4F=BlRjTKGxWF72;`A{qfy0wG#X{Q0rGcoagmw5n>`)1 zBMz3!Nez_@72jlQd;3!$qQG1ijI93Jsz1*6M%numOPhDCB?GYzX-z(my>LUM((&L1krSaioH;wU`;|ocuA^y(N}idQ~b=`N8&r zx{!Vmewkt*7+n=#S5?tPvdAEj-nhkzZID*4oZ2NyxFQFC{>^liXZH~54!{>S&E zBcm`4L`h0?{63pwYxEBqOX8%kas&8T!NN^ny9tlJ z56zXm>{%!ucg;@DU$sdHfZfwvXmVSP%GdY0lg|&}f%?OwKs_09b_#2@@^F3h2wZP} zis|lEUo<0ebO3qQvNMUJ1sl*{^0_$4wJsaiJo%7Fmgd%}fT53_3ToRwcHExXIO4uN z4Zvz!39jE4f4aVU}785Yk z#QN|VyuXJ0bmb@d=Og?Q!@&jMg+S&<~Nq0mbc5yke8B}j!f{RJ{=(dwTb6v6aS zUIZKEF}T=K#5+J9$cWi3oJaTar%%tOi=d*^jV9Ut%axnrwalS2;Z8JEm)K^$$)Z{T zx9Q-!gm1RQ@&9cCBn^Zgq|`R7FHB67Hv@?-#=91A3|J5BJ2T=9y?MX-QzLs`9G3E( z14e4>5bwUj+2cvM*2NdZ@qX@(tN;^p9~e9(PN1xxgb^((A4(wk4j_K>9h*9pECunT zPd*q+P-lcUb7bMUuDo){OfbsASvoI`T|@Y@ekI0M3wPn0Z?=${!Pf#V3h;HqhK5bq z_?I1$I8f6yOY)pPuRc;CuC4J5rNk4aHyvfzKP zF++#Q%yK*2n$y@9YXRxFuTSeiLIC65b~DAH#}Q5N62!L1xj~u7jzlJ8uCQKWV`Br> z6~@TGKM?Wp7=QFg}K>FP<@GD_R|?Am=gbbn|KZZcqi|F8y)S4I;1Gq+xX;B- zCjIx7l-d#q9>ymZx2)HzdTH(e>_Y8m9Y;svUBvJt?J>+bKP06dl7z=N>GDYL@bmo_D|E0#TSqL z^~b?v8<&gT4di*dW3`ImGCt^j>aC|h{B^C`ze=YB&bWqV8B-Gy+m^Q0ocN?eb-`r@u0H%T~m!lB??N2uF z!|oK2kO)b?9dSPo$=wsk=&Q53@lShg7%O&#Jo2*8d^MThVB!D)(OL4#ZN863N%SdP#OUB)eEA}9^;oJP+3eP4@4BreOmmT0 z^EMIMfn$30vRpZweE<}VRpH?N85MuQwM8-BQ4SUJ&T%`w1C1qm*euX5|LbrI?dZ&} z;6Ou3VMjT|*ttj8tUynX6793Lw&78Vv7v|-J{jfiai>Zk|KQ`UhKAW( zbk`Af_&oDI*#!g^Xvrbp9;3mc3m69&79>(?l?tJ13$9f-&j0~1g!IY1;ljMTHfmC? zv$=mOQYV;n8;Hjhz_AI>ZlsnTDuZJV5X+6!#yaJRxZX+w-sB(mqm-~&V95EG#3c7< zKGnQqqE*n(;Txl|uHJ#W{y7P~5oJ8jlj=6+s2k5WfZ0;B)a>ldpAj4YRl?-D6K0Qs zprt_Rx9MOcBJ1^3lnCR6uE@O!SyXoaY7+}^3w^KQ& z+p%Kp#IdIdM+Q9WpKkTy0nTeW0^HeC0>PKaojg;cI0Q!Y zkxh@^oJImzPiCgsvqx&ZL=ofQ7AcR&x_lHUA%x#=4gs7c!eXVj3(^LZ2e5j%t3@`7 zwSOoCOXS0<0w{(g2qUjW;X1sfG>+D9J#)!BMhQ!TNUp%tu(n-&kv}$-6s$TfhRC09^+>7m>Pn0#?VQnI573=g^T14$!m4jePwZBw7TMLvpzh&(%pedN#EUp;%nzZKpBU_g3y=eEb^X@(# z|0bPA##&m%DNrHK<)-MbIvV5iI+N~LnnffJc2e&4{?T98+!u-_S0X;CB$H>S(V{J9 zt~sF1(5nROVuuAcpT(1Iow^KN zF@&1PV8Q_q2(TF=?p-)z@LAP&^$g-&DC^~mX&WtScRBh7HK-alLpb_D_&i{)*Hn!5 zhNGl97WWn|x0)Zdh-8Vs5|k_J{Sastq)XC(bqwgVFwi;EWmMR28|1ycY+|$njS?ch zueAc>d;a=HRb5*~4kuJ<$F-S`oZ6#&d-F&xGYu^RG}ba+nDfARBRXFaD`z|VzB2vT zc1i0RYt;vv%3tOj(;PpW-~x3P+gv$)T5Z%> z2q*DM#SEmI--A28XiTwxN*a5t3qxb5O%XmxNAPxO{WPyLC|#$}7;;%P09PP3$U?N6 z3m(&r?U)3_ChK-tw`Fm-f_Qd_ZmfW~xV04c=s&_7Zd>wcqxsd->e*BPHGo|{(ZJu2 z=yAE=_G_d?NgB>i06h+gglPeA9xv{M!)z<XJ)byQuKaZ5}Dr>apOPpIB#t_Z{VFK+Gc$W^x z4MLXs`k-f5x991l+u<({WRDh0U$>g}038~7c$rv>-EL`o)SxH(Pt}Vr-T^HaBJIVI zy0DXNrS}!npu>HHI1UqFSIYvgxN$|C=(hs1zbN%qr%{hiw-B5e(H3_fg^~uF{xS>- zCHybq-U6!1bZsBsh%p8tVF!vLA&3$RNEjG&NJy(lNJ=V=4I-dOr=m!Ml9C$(5H^TN zODX~bn-Gw$-}U0moH^&rIo~M0$43h%KlKX0 zQ+ETu6#`GQ<}5n6b|+zStqc?;0!}t=5>k)074e2`b(^?z6ge2~q94Ex4lRokc{~{>i&uuy^pdF}(8>u$SgkKugkB z%LzR;GXPQkp_t2CTqp9{yLhg&x3r*N;h9*W%X8Wmoa2qE@B&@xyLaz$x0)Q2l$;99 zvTWBaSRWbxeANKA$|@Abaq(Jk9U(8AZZ@-s3# z6dRl?paH0xK6cf_HSa!0jfkVa4=fK6u8@U?I|Zx3VI z3yL}N5Yu#)`fBCw$LB0Q`~9t8#d=l!74eRNVuryU9)~t851{&kOy#DWiBTpF@L_Z+ z8^b40NJ>hoaQejWVP$2FzGroMJHE0eY`Q7^Z@->oDa_I;o^#NbR?H^Rw>ub3~j_k9rVd1+ms&o z90FI%kvS6~w|P+&)n(tg-0npaVJCqG$RqgRHxKwD@O;UEHKUpR`9{9O&|R-dNUKS` ztvt#r#K~e+7|rnj|7#u(KcF*|Vrc%5Iat0w%F&4&9vI6+{W9T&Teko7v6z|-zK*85 z@Tfv2bYKns3D)N;(B<8)S9l+yUl4e^Bjjn{XBeVmL>caV%Im|L4?8+JHNPWYF!MQ+ zMEEzBE4t#WkC}K3VH7)t=MlOPz%n>Pfs{8;c@mxb2Ij0aBjp9BiAyv$+iD_faQgHL z66lCGd}Ztr@{1=p;gfS3M76O~N_l`^V|UCqvfl`eJBozRp59!GtY?`}W(4#&x{|jP zh_7Q{P}O?-VSfMJUo3!-z4`LOJX9yoK4ifSmob17FGQWe86LxOFv!R4r^o;-c}uCOrl zdcfUq)&f0eQHK%2QAy%Xk5%`}+xt9N zn7d@QDO29&1D%3+rA()IKP|(#kx;y(%yr^7g1_J9Ch@0-W*y@NI75-PIa0)OrD~H zyv|+rYCiV3kdW8!-+MfDqNk@vR15*rMr;Ka{>xI_19w?PF+stu$sP78s)AVH*j*q1 zv6`Ka<{`^hM(qbA{ zqKDwheQoR;ymm2q!npGKz?waeq_E7aD|qo-dJFZ<7oyf*bns0gtO4M^iC?^!)A)Ia zUBO=w0(0PYrvaMbqemQ|%x8)DVPAYy#HSUtFvWr@+gPCQ+VU5h*h8gbxJ#>$m4PP# zB90hMHNnd=v@kye@*2e(N(i-lJ?;&( zgi{!2*benSZPuv{1-jaW&YRI{b2 z?c29^5BHzv|Jy#Vr?IedZCiZ8FoVDXfzB$;PIYX_;T zR;~iwTMkDbZVCad-=~w?!|0&T2wa#%!n;Q*>bPdi(v;iyq(<9f;_O_*twjpcK8|iM z>9q?j48{{i6UXhb7x(c^`6{k-p8fm3BJKrn;O#w9P))po<3w;ID;lc@YA@1zSv7{& z&q_NF(lQ=FNQGr`CGOtB2bqc4DH~GA<8H7rSq)oQSW0U6V$4b)^4$0L>nV;e|FlwILd#fG0AAiU-5W=~18yzJuWUr7L- zRU*QLcjg{CsSCtZeI$o)nWs>@D}FVLu7ffPq^}x#x`tob9`}k{{{0$d&|DsJNgmzp zVPU_MzwG4Fp#a7zCooTxVZGU}8&#z&LBfYixb0ZXuR;&sAQgxWEKbr#ldIiz#{B0& zjI{`pA`uwJXVkfu(bKPVh1vvrrKcW|MD zGqxh;DNi;b7ZEmMxQ2_g7hd?;ZAGY^H;{W&))anbW$G+JQX^~=yB0`lJXjC`hsdI0 z8l9Bx(&%?^5of_RhkgzeK8hlke3b)!+}OmwI$x8p4X2!yLYaC3Z(Cwv)&`rD5!~Xa<$Tp)Cqif&ZGf+&? zr9jDkqsip?qVj~B5*Sk1b!HDE4!EOyAsP2a^X&&TU)z|3M4LjjVpFb4(9Q_|} zkW-p5U4m`U`f~Pq_l#yGqXKwG2#GeNFa7=6)P9sqN}Ch-l{|H>EWNFVb5b34MOy%9SetHpJ0cr>vw{W?`8?1aoU^zuTziOyo;mVWh(kqD?fG zWy8+Ez@S*t)=s=yGG~(to=XO$;@`h=Mb2$svmEC7;kPXF>rlHuuA(hCl6k=+Q@p3A zhX{nF>}Vjq)jPWXu`-sCr~{A@HGYY$K8+{A+rl4-1L)$VOP9QDPU2Oxf%62U7QmfFM#;CCV-z z;EvJh={2)c(4U-49TITKga|V5HB`@ujssYBI3OXJPfTdQZo!(sR(j0fz^0`SdeeAf znzI`lPaP~#zVf+Mi#m8A&%%;KBn7)yG=6Lm^%#DL9>^j2dAy2AaWW4PoVmT)IAbqQ z3UNm>mB;&sii?ZWEOQZ&LArf2%TbAg)Pnq>#jVL9RVUYWWg0i31i*pYZHm>gukDe{ zDq;ccw%(?4&!Sy=7Fop0NY2B>8`tZZW;ztK-Oy=AEwQLFz=+X7e*cwC^iyE#3v@ zBNB)-uG0=i`vmJlcS_fBy0rru@#@4pYOBxrHu_Hi?UK9v0 zfD=`)bIh@F*zdNX%LF1CRaGJG34UaUbeDt#DC&{ut~b1c_*A@0tYl(>D|w`p%V@wP zvS1-uF8BA&)sl_ZX@?vFd+|HeNQ6R5`_&biqkCWIUe=;S&3)J5g$%gT8YZN z{oe!XZ>y-TCo*QCNO*o3zallv9p*hE1+u#`jLp}DyM9ck0>0g{%gxQrGy>gwaFnrr zepTK#KR;mUwi>o-bTY%k!#5}$#M|Zm@Y?xzEkJ9r#N=yww0f21TW@29@PAZMtsBV| zngH%=NP>&nWbkXJfQv;NI$4x0NF!En*_ZF1La^=dj%fulGER{AWY(;2zRt11OYq0< zzj_r{>ED4NL|UBsn({qTY32;!VPX6W?F07B`=@zs@I8Fq@}p_6olKAS2sIG0sWwy| zQPga>im)?i*;-iM+Zw>iLo^S|QrnxGz2J=|!5wM*UP_j@SyqDPz_D_|nedz!6}fM& z-F$~g^g-{OlCW8O2>ck&^!|t|d`s2Mh8Lfa(+1g#TOGs7#KNa*aaS0UCH|+L;!l5Xe8NML6*bAJJ&YREq;(9* zGIV+JF^xuf%#e)4Sy?1O83IiOqE)iBv}woG=Enk~yiFk8L%j>aG(FuWIsJrW#-M?l;i!oBzC6jJZl}UWA;8p1n~nazFIdVH>SS$t9RtgnSM_Mlk;UHC z_~VBFE)3TU$V5^l)o1$=B%i-eR`m2Rd3Heyol^M4qf(M8M|?_Dpj}N3-Wwnt!gE`` zM%~2GG4~l27G`YE=w5c#Y(Inm?1v8@=4U{cfqZY{%a^Z5b1WOx?b}pUx1+sR^6&eB zSJw{ZrSW7srv+%vqs{6TM1~y_dOk#od11f)S-7Hv-1YE`ipu<$3QIYs!cKmRQ50Xu zy(&TiZi0wC|E4v_+9nued?us^vU?GsetGLNs0A+IzCYMgRxv@CmN5|_pBjmHJ?OY6 z5q?=+SGR0Y?TPXRisj0lb(igQvLlRZ7FQ5ZRZn{H$s*B6ox8VMrp<$*P=F9yXGIlk z>eyO(UVKaHn;U)P5vL54MrL!Akc5Pu{dCI%&i&z~NUy7W%zk9fQN?8H7x{9%aCl@dX&kyqR^eI(?q4I2XcXY~Orwz7`fk>Y zFe5z(^cvbO=rFW0HwZH%(LhrJeE~$9fEVxwOEj?KNVX_CdPrQOIp6`$Gk@HMNFT5P zay1X6W3YOWD-|OX1m_yv&YCxq2r7XQ48JCy1cqfj={qEkl;M89(QBfHkG1aWxB@69 zsW6{Qxm%^c8hvrwvHu&>za<9EoNc-3gqIn(6$m} zO7I**6bs>vbBEScGbLjC(tClE0XXOozZp8Qjwcvij(w3@vQOPy85xo9&bTc>t9>`QYk=LJiuRqglLG5q6!Um{EshRzRbC=YD}9Y zTo=MxJd{jeUR9~n;?M~@478lT0(LD{J|fLOjHBuj-(_KOIOg6Szzs!M(dgh)YHrsw z@C_p5kI(JQFTmtcr{NugTXeuC$e!>3!A#0BgWEF(* z9LPcBu)+KSv~`gCf=q>e13m@}&Ga{e%sOKT`?awc1=#c>goZ@hngP*xXs8dBFJ?; z*Z`>21*@)#*(i&5`MdGd>AReF**DnfD{+W&5g!w2mAy+t*r|otJ*=8#cS7Svzm+kK zu6}PZZnP`M^y0mPY8TgN3_6Cqp{9~`HSSPv=}?uklqs<-BfJgLU3#fwPg05h`E zyYycM8te$dJgnGi3Id|Eq_8au5xIClLrH|J7jUKYp`P?oLaKWZpz zj3Wrqd2;;bK%pRUt3G-asmsu?b^A%@ct!QV&3p{9?LAWH)3SQOC1>V~EWOlsK;3#L zYeJ!2owAgq_tSHf4(UBod>ikj8dA6!7y>NcW~wkM>91aX)6jGp#RRQ1YqZGg$9^7t zkqHSxuCuQUjL|&2fmG$yog9>^W~c$;2BCuk?u6@4CC_gm;^Euo(LZHm2|fQEVjQ0* zO10?E=M~YBN=mNR|L3n6(tw3f#Q@W<7ukmwsg^di3u5TSPnu-41%LL#(R3xxxdghm zM~#enG>u{}Y2}8#xU9ew%9m$zaf-gkYm!g*UC`(!^YO!9PC9RHpZ6NetTdNvWHf&> zqF!`(;k$Kan!KcBq6bfaAlB*cWkquOlE?ES=}MPF4X3ghoEIz)Ur3i=Qrzzru#zLp z)qmyAYzUv7Bc8Ju&AUvkn5UDG%+R$Owux4?27$Zu=Ic96YF9?9Lit{I*mQ)sIeT{H zsF!Bv&*&t6bK4(Q>NWjnXnwAJi$NgD^=+s^)Rdksg_I{ptcG!FfW5wGxR{-CEo63o zrCw0IW=?Nuh%K*MRUkh2v4oTomGQALxVs609hJ0z?~0qp!g2V=tE>XUl^%{PJh&(B z1qN>5xOdT^a=#b}KoN=<84ayM#SMSFNvRsPa>V;A#uiJG|xu~TUugUjVCY1)qzuB6Bm9d;`n z_Lr2Ts=mGIrk875#(018oePDBBqXAO<`JcYz53|hMiMNQxZl`Fy1cahMUlb)!Cgqh zBQQ)N>7)9kQm)~mmN`>anvusr>-^CaB-XRC-w-5$V1xw-vgMx9*FB>c$k4>-+!GiJ zTl=Ck7z9%`T`gd_b*pY;j|QfUT4oVPWdtn&CVx{q!qpZvG=3W&XJutAAt77oyl|wB zA+lK4*m}LBDC}HEa=&riAd})|qxIat%3-Ag4I7D@cR#K1@w21l4WAjym&Wq4)K<2q zq70^`+percMa*7GM%o;beEx3m*VaKsFe+2Z{7tRzS! z!jMhLOuu=wnvu+ilmkSMj_!zFmX2elLpYPeja1Yyepk`j#B0~%ZEZw(bh z^{!pvZfV(d^$8P0_4KEYJOSv>Z?+HJ#b~MC-eYLd|7gobHM=CgZ(Mt~a>EO4M6PgM zBLlqEaNRFZ_(BDDrE9hNn=^?0tmiVJLspr|HIQ$yQ6!`=ROm4bmr=)#~U6=q(Xg#2Gdx=ics^ z)XN*{&fAC+A|q1JR&nK}Tw&Fpgkg^4-v~oj{((hqQPXbKGA@WC68(mN$77)=QK^S> zeI@1_xxEP65=Y}$>wDeVQobxnJ)UckiDjd$!Iac~J-zu=*QTy)o~)_h9;uw)n?HH$ z7#l;iWBs~gF+@4kKYX(&@u2a=`w`a$K=m4u&L5u1`mF0VHx`{56c(i%)o|IBtH3qW zbA;3G+H3eGm`@(m5=!?hJ8l2STXcs)+d(BY*6$n98!qZWfo~I0ypS)|NA+1pIsWOuIN_VlPv%-wc2WVbRp>fF+*pv7=6VSHj6D@@%Rs z=~Ywvt>;OvTye;};2h0fr#stRek{82gO$x`rte0oWm^~+>Yn6k#wu6j+U00tb6R9L zo3@oMzf_V*x5#f+=uV&FPF#|&sl}(oz2StwmSqn%=k3j^U^;ep6MK9@LdbrnWa+mD zP}}I)Ru=X5yf3`_Q*y&|T`qo#MzMZWq)Z{FVMP*u7!(+-Vi|Otx87n=(sYa69~@_jJet)F!=mNY!>hgk8j;5x=5^VKSC&Wf zF{x<4zK2IM!YS%v)xiS?+#yrc8Uzk&-`}XD=34He%Ra?9F@1C(FoRP~96LUBER@O6 zy(0J{2-Ezj?l8m8D0%=mMPIK+v?h+c3bp|2jS^LY@Fc-~Cgq1B-K?fy{IjWp-7oKJ zznE0Dq^eH2@&91dnt#4BY+N8@<|^;PE~ahwHoRBP-&A$Kx@A^tFci%IuGdZ7b}buVGALefVC}=(dNk zj!9!v`^Cfl%FLg6bJTu^c+6g#&&S#KCC^fMB(?@LrnVkfgOfc)L)=6IrNSGqI1qMO zSTK}tkMc0i6zCTTKprai$w2)@X4p71>r_rT{2q$Tw^_PPpS6{f+ZKy6NT=!tdTyc) zb(?ptOF1q1P37(K0Bqr&l5ecdU?B{BF5Ffc;!#gVfcLIVYf_qv+6L^=z@uJ4NHa3Z z-kT+(AETq&ifa|l)TNas!Ht?}OJxzUHKwyUA-VP8(}MxXi{AHKDn{8*=1I+u0E9g4 z?{$PC^!m}FmQsxx0a-b@3ot$NChw6#79z}Ki@*RE{W=B^${>A|K5j6zR#6I!XRh_jUG zj%V}D3_a?JVFhgx3!cUU!Y1(*+us@+xw;ni|497uv$85moaH2#Xb{h%g+j<=zO?cX z3J^WY2dD8(3c!Zw=lXw8mEya03vs&rYyHlGVt08}Fvs4?%VWu4|X$rsB> zxhY6D0R{p-41W-hsdZzhWdtF{fX44d6MoyQ>y8)>32I(I4&)nAeyOepOm!USo4f4l zPQ;8MYIB{ZC3=cyTk|2TNI2ITLxE0i`i0uj)0JH-%kH0RbetGr|!?b+hj>QS1bwe6G`IZ1CdW$R0OpW#cF66yk$WdBa$|LbN z#^mO(!QU8@REI)p$fFU?*jdx~9aLJXmKBTJ>`RReC^$)qFQ`s}X3rqr`t80*M&OMF z>m9XEmsnkVadib5{x~_A&To%kOTBZ`F-$h-u4qtR&lP17uplkXvv4Y&exD9Y zT&3UfXlLMVdV1~mu1{cH{`60CzgDrdOwAFC)(LunEUA^kplbo59W~r`Aq9sRs4spx z#e$R}lXI!RznO-=$BhV?S8iMhRY89$Ix1oI@ zXb%iG1rA;Mk|xB;9D?G&%v~6{7vGiov(6D;taB{$3?H}JB>lwW3&hVyG-*Rwy()nI zfrFlPLsN#9@|kZESC>1CPshSB1G_tL@1g7zDq+wz|Hw8z3;+qBQF?^ScBE?XXBFeh zEofiV#$2SnyqD6_-;->B?R?%SinftgM?gd**Mz54GGqA9Dl(gcJ^jnPVlmMF`%ORz#YG~4sChmWBVc8}p5Fzx=5Yn&MM>GA---FZ_?nDN+Z%vBzzk%501K;BXElD6 z4m&ym)tZ``ZZubzf15Q^xkxs7djMhXIfhel2H;tUbT>&Sr@S144$Yx!=`o2!o%WegD-$JEqT_S~Tmczh^_FP4^v=58w zrw$WQfHWlF`jF?D-y{r!KgEh6Q}Y;_3Vol7cWsC zl@Rq2lIW^r+

lJ4a(ylYZAhQ#NJ`AxsBpE6d%0@PQPAWDPUUz^%fT%7^g7w5gb| z2$m!ABSfEF2|(umM@lWp#N~?e!ami3>GT|)nzUE>xANT?Nr4-KXat_bJ9L?vuY?&U zh`z6T$dWZWxAr3;!T@~&!mZlawz!@SMvVk61YLm4ZhG_eAFHdPMBeZ4%`ArdeQa;{ zm1M;nSGYx>i39`=xT=Ecxgiwi^!hn#+fWwvDlK_Jrfy>aA zS8rfpI`F#|pjt`hXd~!Rh$Q$Gm*@ukCHr=ACz}sq5@0|h!fF^*r2UpcUqC{lT1waF zrelwdJ@q`JIbI<<)`7mdyb&FZlsc8Do4rIdQ#5N?{vBwgQjr@n=Yr(D^;*|KiIOe_ z+LsNc$;8&+SthxI=-w#005M~?LvBhKjU2io4TqFH5;3BdZ2!Q_ZO|WK^pw;+AS57g z3(bN?xtzZd^jO)RZJS%md1nl znfNnub*s*moS?IyUi_~BEEU-kD*}!_4?Fvtf@S@m6fB2p#21M^)n|&2`NYKwxu*6X zmXMFk-j-SD`gCTp)3-7Wvt*aJL!*;;eJH44xv=MBaQyOTOC9r^Yx>XBs+Lv)PWWlSrluQL))amA>i+rE$vTgsEY&PP5J`FX@W_>W+$ zaIL?Fv9c8Y9gM}s{dX|d!rvTce}=K@6sgmSt25&yco+6Dku1g!KjEYf`Bh3#l9X1G zc<0T#b}IdDI7_$$Uye>fq8(Rpl2#C983NZZeG;9dmDy24?Pl-@2IlYkW0c;d?I}vk z97}^@17|2Hi?|ZTm7uD6p$8tSC#hTcHA4%D;hU|R?MXgjCIeHJWu%LksP4#?wmO3s@`PX@e!m!5SsmhxJ@$*Eb^>Z^4o&v}Gze zSW@zbw2qxyY|UkDq%fTJ*>)X`aF+R2gtdL|jg1Puj#Q8G|a!;%jGZ@ygh@0hLMl}G?(;7gu93s9EaAl?z zrWoY<&x%3KP5?XQ@eB4n-y+#vuiDfl%sc-F2-oNHeF-ss#)9ijH*0&Mn|RY% zXQr{6mDNOr;3jK-x$*jOQ>Zv5vATmq`~^ItbaVoj4~v9FZ@C798d=|HFonD zo6<^L$kEf8XDz$*ET@{{-npU>BNR-PBTAHM@Re;Y z6FTT;q52^aD+=x-19Am;$-(Qg4qq!2VV72pmJFJgJj11_9OOd zUZ20xx?GJgD3dxM@_qC1;{%7;pMcF1MdMcSBMfzS@6ZuqD9x&4s%~y%^N%29a1>*1 zVgrYfWQLN^mb1cQVg(mNRk#eYm__9D;*nbAm$GruGg09Zj+i1)!(hTkKEbQ=v(5t? z!(8F?zXyUsq5`v%V>q57h`@QOD+t{S z9u*WBWtSMy`azVRk(<&ipV2!oa1wMBZU`~0Ye!YeiQ^V?S(GY>`yj!-+--y=3bqBx zk=Q^24dUH9(-z=7Upvzy!H_I=nkOJff71Y<=VhFUg5vglMw2O;dq;4 z8(Lb-Ru8iGJ3NzaJxHxzT8XHqhUT`Xe$q=uy%n95a)YGg!XSCGH|vu|$pHZO$_ z%&x!|p3l>d#7fR)93Z9{>0Heg=42^yKt%49>aQ=MImDn3L`}nL3P~v>TGtBN(g5ZX zO0fTgM_jp0(qYMgcJ_ydfLbzoHZBji7kw^;w_IP-N{B|H!bF#68u6bG7ya0vbR*FTn=S3UVlC6 z*Xiu^Em8DcwF~DD7^mE`!Xgdr_VqA6Ay>=5QV7q7+4V9QFZYiw3}I*rOx3EYm{V{Q zRzWxvkb?vxVk%Yby|NIdi*`l*ZWLS@pFOQ;IcAQZMskOVv#Bt0Ymw)OGX#6OnlHl@ z{;h86gQrGS4v-@*yZ7ZLWIcH*89813XMVC@D7mN}Cxa;kI^X&4}`^ zUYLRLch192$O}X(4lV3Y=V7EUCzJ=|z`mE_FACRB441Nm8SDzI?uDRLN0yH7&D?fwdJ_JdKK$Fdw|(Hch6-lyOwFMz5k$-s`l9y#IAK9GSlwJ z2L2=MP(Ur(OTs!E-78)ZyaDC&19{Y?BkHPkvOxuEQ5QDBsGhCE|8Y=Qjq7)@RhGP} z%?$Z?7wx6CpcXs&fk0-)sVZ|p%3mt2a^L+;X_fjHN~?gdxqP(PSn2&D59aPSq4r6r zx0aIhH^o|~;iIjG!=kb{JbfegpIn#SLAP+E9yomXE}};o+hFX~KYyMChiz61s2`ik zSB`k3tuWeUo3J&eoe(-N!Vnl6r}{Hcxvy%F4nb<(ug`@J}fOGG@j6 zr}8I+jWv42{1vo6CT8#`naM?khAt|W*#U1UwNfH)u@W5KdX65bfRxE@G99fV7AI&^qP{}NGo|k>nR}!q(x1tR_#c~LGu`iNQaC87vKXy z;9p{BROLWO;CoAnm&<*4#WhNvFVx(U6F)zyclb+lPJkB6;W;6j&*JoN7L9luJ%8J+ooU*_>XU4yV$?7aUejb`J?f620sl z%lLfTUO%=?{A=Dio5Q2c>oOS3O9C4Ra}wf-3SSjZp&|-2;GdLqGZtd^lS-)jL4e*uWDzN3LkThd8F{jdp5KS3*ro35jh@^9M1X#2&ov;$6_GL$yG(=UJhXfXPv3*+xbzuIhHIG-y zRqoR>mEm9tFLYKs?B>SAP#1G&Ei7F-7l$n4QQ4PefkX6sG`Q-IgPc&n?B@tv5*@oUi2npq)-HtUhj4AJyfvKtHd8DOno$a$vn zFXro}ZdUa1@zGrJ28SJ@PBfORSBfN6Oh`SWyZaUZW!AA6(Okkm{CB)v383|%IE=UXVXch-h4F8+ZPuRHUA@aaW-u9 z`OrT=w0lYato!<3gV6p*al4t(PU?SIubrh%ll;{eaHAF*JpgXyg)$fX=E3(DO@WV6MGp&@N;?TRCN+o;J}dV&TRQiY@) zxWzEYIyl+pV!e$;!_^$MEzvuZ#%H=R<`WkKd|8N~gS11hzy2TLYU?Q7%ze|kbYs)5 zo}Pzcc!49rL0{2ypxBLDU*<>Mjh>uP(RS~g+4A|Zu2lCR`k?C)l@+Y*{g!XM6gH{M zFATK0nQfhLk(g&^Vi`E$Qu^j&*C7pHDFE8Mu$ol%e<(JIgP3>5h zUMA&z`@&t37w?8xdX5agWBEFKS5mra#kzAMg+qgOmW3w@e-uv4xFEQuR#G`6`6{Q* z^tFTM&DVq;EctM4006Gxk_YDF<~iFj9dC$QTypl;vCrPIwVgp>N)or%@)9E(A)R#+ zs@eQVBTep*bzbY{=KHyPjBZG-!M#J?DGcz?INYr1sl z?ng#Oex+@3fB1?ZytntLrChVtNo~D$PfYx=-dl7e5K1X!y>vM>hmE4Ju#k=d_t94O zHXCEvMw%a8*?#meLR@NUekfwr0o;3z+xmEbLb#C}O`*^%g|jM_Q-%-<8h3 zOH6%0jA}&)6^@Bz?EV495{V1R?CxXYE4E#B3#uh2r2+=rC($Y-C9tFCTzem>@Lb?W z509*v1kKn_!FE(z5nvOL9PGRo4I9A6(oCH~=ccqnm!>~)lmG_&{Miv;8wa%GB$xis z;rF7udk>U&mZg~m%IGC3)ClZ(RF-7A+%V7QhYfPxa2!_pH8O9ZcaKhKkQXi9!SZ5U zz5p%|gRNCTiLRtM7Y*{@g)Fw)_a_@BLSs_hxbCsSg7D;W=#(p-j0RmN9#i^f!`m!X zRng!^CZ(r7t&W3Z;N`Oi)mb#>J}VcFo%7z@*xR60Hm)c;qhLwf+YoGlF+ir#8u8Z^D!`0B zCc|y#grNAf2Xi4F0VWbr^eGn`vbV(@`FbF#Jz`o?VXgO$_s5g&Q}qR?3$-Orw|jcn z2PgE!@A)h{<+%JX>n}HQzF!k|s)viwL{)W6g|Y6&(VgeVpW_(ge}Zg*C6A<|Z-Dq7 zav5?8)GESTgu7Ennq1+UFvgnAarh+9B z!c7tvOuUR@`63%qE^mRdE1TO#I%@^8HPrQ7*56&bosZ=arjsFzDP7zq!Xqx+#6F_D ztIGgt8_FRmKZwAXPc}uz*}`9qk>JBFTF*ZBkw1TJipTk}N2+;z6vl06x8C;JF8R2z z2h%sPH{iAKp1nr0K+}iQa3oaz-OxM?rgin;Rx+ct&J0@LOAYq&9Cz>D9Zrv$TZ5W0%?0QicwI1R?a}W&jALI2KDS0s z_LdK`!uvThvGyT$v>&_r03)rZ5~XVxtZ7qMIA?d|QtfA`Lv3Vq}OfMtb^buDnMDfl60mDbKd%gCP zH}BVe1z#jhQZc&}BX%W8rHaX~NKo-(YrziV4s~&$Ct>8Iafr;t3e_hZMnK^&u1=1CSc-ct6wss4Xs$a$hC+3JXin&6Hjr24~=qUEoyr)m! zijGfTLRbY6E|gUprWAz&Ja7OoHY!5-Sd7)!*(r)4bUsMu#&jy0qYBT~K+eAw0(W3U zNNUM;n`v%8RHfx(s?J>Om$Ah&%8DuxRypa+kugUG>WPJJ7!Bf?W)uO03D33*DwR%t zr^ElGuW*FyMZgWf3M_sY08fncgN72_4gx~&LoQ?9x?1CxyfOXk`G!2Vg~F~0WvAl_ z$zm#6PDieEkQPHuHT3kNiZ+i;A&KdJT8Xtd7Ut$uJk$ne{B2aQ+FBp7Ar429_a_5>uWU8%sh}Ja4J~t_ASQv2d}xW8zANClu*!*xs=G0uP42P0=LK;qqoBCc7Qt z&c?1Z20#}m(}D-R52}@HO4Cl~1=g#gS)|IUHKd$-oEqCW&0BwJOfPxhN#kEvcykMb z_IdnSo9ztt%->l|g4}tJ74j;ylPh9tG_thXi{r+tRxHXQ@Nnwu>sLz|B)b8d?;1e# z7!G2v`M6SSSSKZPE;={}4^csKV0J}L&gL6CYg?X9eR}lEv2_(8skh5jCAtz8yqPr@ zGC%D&BqFXDf|7<9Vg}jH*1c^=Rf264!MvG!&f>>)|5nqz=G%oQ3nd)Q$5Mur!(w9I zXZBnSq$$5j&D)mMH~M;0P0su^;`OF6vR@O%s@zx;@-Z$FFr3#{&Q7FegSuqna0*n@^g64 zY20C5pBnmV1n9~x@eMT|II?&UG+U6Y#a zha+a(vLa2vxAa^ght?buLqM}nXdLaYHya<7JG8YvpP%5uuPzPiYE$HsKE-xE_R+qctM{N}vK&vdl}5LFT+f zQJc6>#470@>>cYVySn{$y_;a>-HX2TD$wZdberS2=lAjtjb3J|OC|SK#D$BCM;@-; zzGFuT21Hb{Io9*K7Pdj|IqNEc6~n!OqB)3ZZ4~1Z?rnD{2hZj$UfV($dsHyhWXt{B zicCc@1|?zh#7Kzjw*R@>GW7I_yLKc6Ws!*%pe3go%y$V&kWehd^MB#)O zg{K2$6%6MV7gQuA{e7g^7*xdoo+vScGZ}^h@XJQ>`b48214^dyKC;yB3 z>Ne(pqrS@S&#B4tIih&=9nIZ&Tcu~>G-`%t&xObt_$N*Xzu*gd^T;i$P^}$<@jPhb zech`TEbP*cv$G~}_Qxl=LoW!@u>*MzTH9B-_o1LuW-cBXQj1q{0@y-WcLBWY`~~%P zclyiS4}XC}z1*?zxaequUEDD-5zbWw}Qqc(v&?(OaC zJHB&WW4-Ts+rKWxOt{B*kNhBFYpQ)Y7{j;lecOa+^2L0 zP%TR~3qRS0l~Cn6&X46r8Al;R2z%SfZf85=Evubaqw-DVwyC$tJsG5|t#!CQZ7K5o z+v}17Upu{O-^^(mCvd>l@d*b5PWhIAq{a*}V+;DFON8M3{5mWIGYj_&CX7N>^aSzR zaC+-f)OLKdteKi~9Tk3)Q{s&0A*57=c^MpZkjHI<6QTpX8poh`hMnEerx$~? z2vUiE2i2&y8gCHstS1PvTUhD4eMySQqeHX5#9sL;#&ZzDImh$)Q)nWTwHJJUQTFkd9WeGX6 zP;IEj(k<5aVFiHM!DSs2h3a=}`MysrbX|idSKFj8c7#YOy(C*BFq(OZFGOkn&F$6L zmfh!}gww7uJTsbzOb>#;#xjFMrqO+o*0r)hjHWN zxx5>I860Cx=3(hhkQR(kS^l>Y?@)g$K8ZALxHgE;RWWWz7?F2*9i}$S)Nq*jFu4Si z%4tXh7lUIPS=Fe?anRx4cqImYi$+$zwLvy@zMhYL=S!P{;&=Ml;x(;6AfSH0%0a`$ zdyVWYy2Cd_(dYjCbBu4mbE1t2^JILX76mx6jAQGn+i2O+_Xc3e`dHSIAD-E~II#{> zF1#(B-}v{N6dY_5qdWc57$pV$|PL$QRAB3z1Azp`WUN zWS13$U0tSN^H|P{7w4PAg@ka{;eo>x489Lf6B4>6ffx|k8$Tq=zXRLDGXh5iyfZd4 z+2lF%(fqDg_82THmH2RSbM}0CysZ;ymE{6&;Uw$vCl5l5S%j_>IrG}YOU`hfbV;Wr zPXtX5Tp?Yv<{#ZaNdD?<6}q7LKxGA$4eCNXIe5~==O^`%V`TW_%_copD8 z-mt&ptTlgM?8h(5pbLP5$dKMhM4wM4tL&6T_7VLsCG}HZE%6wkAH+yEgl__@L%V2@ zH>PtR;G1$h!4B;DWyzMUTMx6vFRkAolIkYRzbk1}REL#=a;(z&VL5~=86q0(u!72k`~Zk>|M;8Cp;2`EX@imd^_ocH^*0h59{{dcD zVYE7yI9C5lw2%%U^ggc0i>W^$)3_GD15M~$z*o5K`X4rhs za(F}urQZJPbl2h0F`T?e^ua0wrc-ZSB{rdbYU>i~iC>#k7eUg6Z;uoz>;&mf>2zzx zwJGAVr#iUoT`1Rccds3tYK>R;@$KWU*SX)7zY;%{KCfUd`uU-U@!j}@Na^TG|5T$Z zyKn3aUhNx{Zsd)OPBm3k1vVufKwgHH(*UHI2!Ide5|;-zWwLFe&?sja)NWSj;(6}h z!|NT1zaxBy9QRPxO`_K%W+Ab5P9eZV^2p}WpRU-l1nY>Ond&^UKlOx{{^DyKHy|it z9O08EPeMgqW0ozs9_j;+>u$lkXAg!2{EsKOiQC2?a~xR$z%jyor=FI_X94ITA}_g~ z7(V(BAVK5`QhbBeY>` zAv>WuA&w>c&i8wcdZ*dGZ{F*3xvsiQbIx(j^W69S|E(>OaJm9O$KKVQ?$x?eG?ZTF zxg0ksh9zvLh}_bApFTWi@=_cYYPZS!^`wBey7PH0Vw zon!mvXB0X+*K{)xWDte9xp3DNS3EGX)>xbg1fMJ*cBa<%CyfFtFK$gZ3*=x_Z(YXG z?SArs?aNWPfvtt8fA7b=1Tbm@uYr9k86M(m1le7F0H@v5I&`vC2o{bEwWx%T>ZP8V zFPg)NYn8mnByJxxa$?(9s5F#spk!t;=Z^kFmdD~v;Prqj_)=4m$r^T_nr;x!LS;82 zpkOxZe!WfMxnb9AtK02+2GivdsHa`HFRI~0fZ7ZV#6Yc)F{QxxlNzERfL9Ta_Mv1H zjxL;6z}5ncPNdv}BLRg=Tj^b;WbP6#U)meiuu3`A7Nc$cR`a?^Sp`>MI^0V2HTx_E?j;<(8bit-b*qU|$ zXx`$n^_)$|YD8Z%rjE~T7&ssbn%*h2R-ab4+jjY^qYP*rGH4E)2Hsm#p*;AsRD+J~ z>D#jLJ>Ure(V)SeJt~!ONcj?M5Y=f!=KSPwxlGf;Uhzg`pfa){)${F<@qlzS22%C& z>Q__LJTe`Kv%j?`;noyi^c=%mY&D&Z5Qb|v0+*IA)T-!v)<1|F2x9@HpBlIIZ}z@q z_bIOU<-4l(9g)%iM9urv%BMH7FqMavySuwPzgNh%8#ig0UPqcWK3W#!iC;F^Ma8w4e=6 zNr8gE=9-hnec{c`ni5o@wp{z8THymJydIc~om=`u*;|d=&qlA$yN6c8(ka{I501HP z?pq@68y;4ywSnuEm|e!(u=W|5ST+u-9~21?NQ-o5p+n{L^G(5fGc}QYqo}or9Jsa49~*7+SafvDNL7EpuVw=l9>e%Lz}O|t;=QYIfB6Q5c|RU zHTx#LA}a*hAwQ4boF=0-E!M1@_Cl~Usa_@wHsn9!Tb;i!!PAnpQARDq0 zS7=xjIyk`@5jt`uBlGG|Y`v<}bOIL675$as2uGxbsg0j8- z(N79!sDP;Gl~}>VD6gH{Iu_REh(+06I;>-58cJJ6e|;n;*O3+JdyF8{H-&?Cuic@9 zVpUt)=95|B;SA(eA8`ZwGSFR8?59ylI;Z3VYAONfxr09pV+m^4*ddg`@R!mB*HORY$^g;wb|uy<(^eTC=biYxb(wW5+#NrjMiH|-E^ zwY6lxO!WApJLA{#VC_W^D+IuZK~Db|_1a{bc_?#(8r#P-7LbFoTUD{KckFE@)ERE=l6_;eG~p`SeP#Fb;O=&vaesrD+J!>1wcuY zQ?c0EO}KAw|NhpM%pA&Lj-Z(U6P?!=^;b!5>v~#hv{ZSnY3fJJLb+R6qof(7=X2{S zmfm-Bdz~7a&In?Mtp9@c-NcfYND$=Q`a*5Nyzh_=QYCZI}@|h`*+yp)UlC|_ULp%LM*8t10VKorVW9EI0zbC!~_IQKu&}tC5`yR{`XD2d|l0b z35)G|n)s?7Y|LrXrSio{GdR2aJW$H7O!U(xor4zm)I?1jIs9np&pxL%jL z%@t87@(Br1>FdZ0Q*OQBn4pwxekGnmpN|3~QB0)G8BNQ)9sz=9^e9Jtp*IMcDWsY~ zHLy^&N^ZP@f+5B10CkSNrj`^bNm?amH(K}B$C9b70A)~>4D3+CZ+)(ZdvW*Gt>3xd z?T}Z2=aJ6;ZJ{4?jwpHURlWxAHu!vy=#ilNz}LCZ-i7Uv11lLt#3E?S#dO}&a&NlN%p z$@VQ1DdGQ?33vjay=%io&9K!oYH8;yzgzbcqc zrcOOB2VVD~{VvY##?i(iG3g+aoHu_EsA+CqN+v3&+E1b}8NdZ2>5RH(F%RcO&~$vl zWykYkqM~b7Tks98GS7=nwVOf149=7|=AOCGv=tH{s+mYQ)5v&fTqTk&?@g~Bo&)%m z!DFGT8}VS`bzfWFf%-d#$r_-%{)X{GtgNi0j#I-=3&2Z29bSUNCZ4O)&8Lk)e zVCv|UY^R?Xx;9j*@#YRT0xIBlm`U<1wjLPTX6BM#5W!2vkeXz-9KV{e&C1_k#9SI_ zH8fg|Z-Lj1{YD9b7uvPPW&6+eIIupw*xEVayXbKlSONNlvW>u}j=Ug5tq1!_cnV#` zgbuXMpowf%u3~r6(tZgtD&)Isz%8*3s7_62uC7FS8j)CM!*@?9R^rCVn%%f@>E&RP zkN1_7Qeskfq-VXIv}GNy5enqer$~*iOtlqUJab+8<`Z(Y%_YaFtdok|{wr2Y9;U_m za52>vxvke*S z`HNL!C`Xq%>%2NHP&+haUf*{pB@9GpcQ>E((-rG7JP^?^?7e8Gnq*FL1GF=oTvaLO zkzg%m@+R)1dZjG=@PUd0>~?Sjz?kg6C*bB3(nY>v5a999_^Y$c5wfq`a8255|`huj(uP<1|LzzP-Wh|$X`rDN?3(S*KW4jZd zga~tuKBj4Udv-Y^53e&WA&Tr{sSs;_3H>5Q2U4;M!08ESv(6vAoi{)2c+IT4XZLPQ zMIt3%lW^k2z#DwQ)u~^da&87!*I7vtYiWISVy$RvLpKypf5tG%eMSE6;L=flm2Y6c z7P4wGj|dr0HbWPxmjt$sv3)R=@rW>b%yBZDKQpST>*t4!qXNu5-s0t5*J7os?YRD; zYKlwbz{1iIHcGb}`X+FYZ5*f(aQQ3!^-r|eAAX*g5E^$-F4NG!0K0I0v0SqNYN_gy z4E&B!bE;e#djnPC%r6T0+v?LjlgM5$5qt zQRX%_O+(R4AGMDo6Gr8ZfXA`5?s7Q5wpmlXBEl9a7Cxjy6a3K+AC}EXXbN74@3?u| zcvRbX@Y|LC3V&7`splt>9ADg!xQZ+Jmt&n|j8j6@bC)*}9>r7xAg{#%2|pEx(fD{z*C?AKoGh+?xf%rFT=7k*)H|U zpxY^zF8wAMgM_`_-j|3At-=)yOhI1d(^!isHY|VD`MO$8k9g(%T(Q@nhsUNwF2(vA zAC8m79e@;w^6+igOOix}P7%Z=xubFiR5fVZ?+?y9hWE9aOnUW>jGb`1JTD1{m>z9x zd`if(2~xs{GSeI6JszM>7!DpKOK@@Hm|=ufm{bVdrID|-TM<#pK2i>zvC#9p_B-de zkN=V5a;u*9Mr~hiH?TfU2o?D1NbxR$R?yu1bL-S@thUd)ugYQ$ma=_hq&MmaDMxU_ zJF8p_KscIU{5{RXwl7a=mF_f#`$J0d)7T< zS_Pb5Gn?8Mko|MtvxG12`X8kt>o_=e_K262A-`XFyC33hfT^sW^-a7pBIE(!v_$^z zM(Hh2_x9o%$KY)A!U4H{n^~+o{MD8wsO5I_HM;kOf15dHqa;^XT))@9F8P)vf8>Gy zSDmx_BPigXg7vi{4{x5W4?{{*YL?Y|+aefNH>$K~+XR20GClExVilx?T*4j_D> za}m_kSF0R8D!2g0AEU$ZA_m*Ke)ab1DF|*pm{!c3nCIGII};|P(B#(SrjIB*Ni|!$ z-&XsWN#V=`Sd->yw(u&iyItDR3*ij$gQO(cgRn4AlrjB+SP_M$8#lg*!->yrBj{O# z?>eCk`l1vNM#Pa2O83OiOTYqxaAWPDlsFP!B9pesE+0Gxn%(B{A&3#qN*?;0ptUMw+vFxgoK6^Ij6ux^zs`k3lHQT)JH*!M${5%ViSaSMJN{g&t_* zSEFXMx#vp4uFzwUKnPP_)i2YyJgIwHb5>1L(u$N%T(Os*ml$2?)XvONNm~*{wYk9U zle4Z^efAgS_-$MH*ODp}_8x7kk0o#Q-VRgL<$InrkDaB=JyIL$;Ao(sa$ z&OiqYl#m(ldZ5q`Hu<8Vp>!KbpjS~MQlUn@FX^wm*u-H2G6JxW;c$l3@gMQR3ugOF zD`)`3v9LghhT-j^?5P!voTV+C|GRh~boU0uuCOuwi3@j{x-g}yVqY|IPzc=h+GNu)`s z#z?)*=nYXDke)q%ZLam&riNnun1Jg%^F`ooT~Y#A!$9?%EbAo1DGM%7^P_VO3k3H~P^%cAfG&!u{!?_UuyP3hGKc?qA%I zDy6FQSK{42CdQ5*0dWX+L~9CIcPNin;FJS@w4RlfXyn?WBXeL1WW!I?>vbxq_O}<9 zPUh9Nq(D4jmuGc)YN8NW5BQlh&#sn_0mezXcDzsji5i!vyLxg7@w=Mx0xpvOs3|Mb z;Yj-C!FYruIYthml3HwAzb;*(5jQf}M+$%-LL+F_(x5A1YjS=vGg_17`sU1>h|AgA znTsnMEFOn>=gja<)1bPlv*UZqHlpzXbKB zl{MR(({~z#3QcRi_NzI&iB)p_MO{4CuG11R!VaDhn^_FZRpL52IucvF&T(Q#uc%Pp9sbU*&SyW_WW?6-6Wi|t-HW?4 zZL0@Lm4#_THC}#lR5S0G=G*DQ{g#YamQ%qsW18l{KI5A6g#*qQUXB^6rj161 zz-(c0?%-f`UBqSoiGj>-YZ)YXdu;n&lIjE?U`pmIV zCR{0QI0M+vO?EwYm==Zl&5iVGIAuyjP5aDGu-Q+RX%`Jw%9x&0KxPQSPs!i~Pm3n{ z+hxU?S%6pZy6>IyU~{SJJ|UWXD+k~45mn&7+=kNa-J)7>Y*j`6xV}( zw?&pKSQF>=F22C^9Mx;0s$i+f;jS*`|2-CZ9_?WLj@4BN5nxxupVWl|Os^I_l>yyF zsDhRo$_17l*4tJl42L#Wzwm_1bsQ8dTlQ@hi0f~nk|&J&h7D(!PbB`6ALSif(obt^ zRqHsAO?SliQO79Re%_+|=MnJ1!-s}9BN9v&94D)fUPVIVrHjxztkc~p0Zy>MB!mMs6xocIFzB2)TF z^bEOamiR)vVc4A(>od4Yex*{ZNTfZVhm@nOC$3EA%|_PA-yinY!S#+!2^28$;C4Zx zhmG^&$5iepD_V_rUsW3hV5_B?N26OgLod@-`hF#e(-W3L!Hrf9BcM)1L}l>o`j!QH zK|tk4xP7n1Sb}+uy!Huoclx=lTD^lce!tSKI?q;Ak`24$U^DB8mgS|3)HOFT^~di*%#F?>{@MJW#*<^B$H&tif@+FqQNkGiSFqeI5mz&DFh zc125*pO9UAQ&W54B_ksy0{G%Dvf+vP=$X7UC%I?OVkF*SU2JXj!XSnC8D#pegDh>I z%IzLF^=;zmaa*3zFOLr?KOQwJVfmK93wF4JSShhLNs1 zmr4eQ1LNiu7qU-<;c*{1G}%Vb%lTA9_g((1NLh}vF}_rV|I0tq6&3l>IJV$$6B`DP zhzB_@FQsz$3rU8dz(mDNzC98;0<2N;Pi z>SvI)8utMj>1gl!7*vpaFi%;T_Y_z6l4z=p)b%%(Z&W^+acEc1pT)Vqn!LbzvJFL) z>+9-V_HTBIkB_gA?2Cz~G==m0>~pu6ndW^HJ|q`~<-e~6&Vk{q7`^9DQUxOkkDvEGxg zC`#`Gb+*2xxw&~~0aAOQvMtM6m<@!e99X>wCv*r{2v;tQi3}L(;H93Tr6A}?eGI~~ z1!B#~(ar&h^w?r0Qt*D>`;YGVQBqoXj`+W!tK?M87W4RHa0ib^fJw%=8)lLlTKSyVe@CL2GOF;-ezMuX$Kn3+9 zcD(5IzgwG>0`$>K15plA)Qh^l=9vsej2NH((c0DXVDmpwIbetzYu)#Dq(UEhrXEzz ze(i+cj_@*|-Ud}PYjB&9@{eHEBHgrvAM4{lvHU8txJOdCSieoHqM1tGm#SWucf}uX zXl!I5;Do}rMj3~s^%aqWjQO`5ELxZ4T#FxZ(-t0yNHbfMHQ z7*P8i^?!M=1>74R6*UBvMTbWuFBGrv+$?rV%qS5HNvpD%Eel!_Zl<}fMYod{7I%uL zyQDjrl{wT?B#nOUt0A1d$g>}8yt9FYnn(3AKKgQJ)VHHd_>1iF?28@>ZHZ1^CBtEA z^Vn42rnnjl?Zla@RPJi)dwLEJ7ftAD$Rbs5YeHOvEkC%a-?4satLo2Szvrg~^vgm9 zhj#*@BkQm#5FeLZPS&T0B1IWl0M776Ab*W)A6`RUPsJXuF)lFfD@%O(w+KHD03i{+ zrHGu^b*!zn_QEa`SY;tWxEO$yu1k20G&6DF+tT`d;$P63OYVyakkc0ZYVq4#5HVAj zY$^d?$9d_3eWUJe)0al}uhG@l;)>Lmj}_(YJA%*mkvxgG>x-=;k5>K{YQkm}$yKd| z?QiV8cuW4)_Pg-&(oH}&b-K@6Gyi&jiL*|;+J5C)nc0z=^gG%EwehE*_=N^o zW1gk4my{C5jWr$PhXjnQa9%+fRio%{_krv-C2wrQZbd!WpZqqnfRM(}fv$V9um++W z^RbC$fv^e;H3T6uRqd0om6Ne8pH^I-7L;0t}sHV4lKXAww4J%Jwf_y zaf$KcbNB?m z`bvth&1Q%m{}LRt`p&H;fiOk*ED1;j)A`?%9m{>s&YYA$KiYufcrHL5SjY=szLaZ| zTTb9Wf!Z#DNJx-XS%nvm&j{bUckfpBHhcGcG1f922 zcH(#V8r#2DEH;MVVgMXnm0^{(n@Er11hzmQ1H~JCwota?9vcI3`U(3-WPJRR`RRiB zo4}>1Bor!FVKO-idmzA#2wn|pJN=`*G@Y6kb?Y`SbWXS-p|l$r8Mz=pL$J&*=Ait5 zWss+D*B29mK9uG1D&;R(tLzqe{gQ$XZTtt4Eb*bt=n<*ht^_H(yJ~3}RKO)+{_@R0 zX2ZEf4}2z3ni@bwNoN49r{}r$OrbV>1UPbL^xBdrO3Y6Xnj=`%>Y>0xL5FSy!l`|> z{~Fn5f^;D#)Vf1{39Tb|{*3IbyF)ZfQ0 zU;aY3KHywRko`SfPx==q`+%hJzGd1IjKo_A(Vm8w=DVXP15R_2+pgJ-HxN36=#N9) zD4gUz>YR`uVHYSSLSFUF=RAI#(K>w^vPF3A_3*ZOMBL2|t|5!JiBCA<-YY(Ok(<)A z=EIp)iwWG-w?vZZWWoUKU7DI9HV+%b9r25mmwR>;z?ef8jO)Cjs+D4M7RZi7@LAA@ z4SCn2?=X)PzGArBk+t{pvj)fcnc&O__WC(u#bD^${4H;p^^0RB-Vq6{f5xuFh!|Yn=x5<^{^g0>qNVS`0N;vSH&eRvxXC94?>V@#qt2XY6gu+X%-B<}6}tpq&jE1mtv-$w11p zb`->4>;>YxX{J-G;2Fwz(BWBKRpkVbLT`R<7WWE?N)3}ieW+tkD&M+?n(G8m^kAt2DtyP-7*z1qxBU_rUWZT&x@83$?} z$vzZFq0Em{TsO0TZ57N1WD+tulrle+@)#AUB^{JcKXd7Tu9%3WOvQS-AOG_EW!dt_ zXF<*cZVc&=UA@=I3UGech=5fQ&A=lMplnwls2WX~a{HFiPeE>R7a&K&Kl-yKuX*eI iu*`f$-IhBQ^K8P413yIU$X6opbyQwSE?HK``F{ZQts{g0 literal 0 HcmV?d00001 diff --git a/labs/answers/lab3.md b/labs/answers/lab3.md new file mode 100644 index 0000000..4846625 --- /dev/null +++ b/labs/answers/lab3.md @@ -0,0 +1,381 @@ +# lab3: pgtbl + +# 1. Print a page table + +本实验主要是实现一个打印页表内容的函数, 首先根据提示在`exec.c`中的`return argc`之前插入`if(p->pid==1) vmprint(p->pagetable)` + +然后看一下*kernel/vm.c*里面的`freewalk`方法,主要的代码如下: + +```c +// Recursively free page-table pages. +// All leaf mappings must already have been removed. +void +freewalk(pagetable_t pagetable) +{ + // there are 2^9 = 512 PTEs in a page table. + for(int i = 0; i < 512; i++){ + pte_t pte = pagetable[i]; + if((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0){ + // this PTE points to a lower-level page table. + uint64 child = PTE2PA(pte); + freewalk((pagetable_t)child); + pagetable[i] = 0; + } else if(pte & PTE_V){ + panic("freewalk: leaf"); + } + } + kfree((void*)pagetable); +} +``` + +它首先会遍历整个页表。当遇到有效的页表项并且不在最后一层的时候,它会递归调用。`PTE_V`是用来判断页表项是否有效,而`(pte & (PTE_R|PTE_W|PTE_X)) == 0`则是用来判断是否不在最后一层。因为最后一层页表中页表项中W位,R位,X位起码有一位会被设置为1。注释里面说所有最后一层的页表项已经被释放了,所以遇到不符合的情况就`panic("freewalk: leaf")`。 + +那么,根据`freewalk`,我们可以写下递归函数。对于每一个有效的页表项都打印其和其子项的内容。如果不是最后一层的页表就继续递归。通过`level`来控制前缀`..`的数量。 + +```c +/** + * @param pagetable 所要打印的页表 + * @param level 页表的层级 + */ +void +_vmprint(pagetable_t pagetable, int level){ + // there are 2^9 = 512 PTEs in a page table. + for(int i = 0; i < 512; i++){ + pte_t pte = pagetable[i]; + // PTE_V is a flag for whether the page table is valid + if(pte & PTE_V){ + for (int j = 0; j < level; j++){ + if (j) printf(" "); + printf(".."); + } + uint64 child = PTE2PA(pte); + printf("%d: pte %p pa %p\n", i, pte, child); + if((pte & (PTE_R|PTE_W|PTE_X)) == 0){ + // this PTE points to a lower-level page table. + _vmprint((pagetable_t)child, level + 1); + } + } + } +} + +/** + * @brief vmprint 打印页表 + * @param pagetable 所要打印的页表 + */ +void +vmprint(pagetable_t pagetable){ + printf("page table %p\n", pagetable); + _vmprint(pagetable, 1); +} +``` + +最后记得加到*kernel/defs.h*里面。 + +```c +int copyin(pagetable_t, char *, uint64, uint64); +int copyinstr(pagetable_t, char *, uint64, uint64); +void vmprint(pagetable_t); +``` + +重新跑一下`make qemu`,可以看到下面的输出: + +![](./images/p4.png) + + + +# 2. A kernel page table per process + +本实验主要是让每个进程都有自己的内核页表,这样在内核中执行时使用它自己的内核页表的副本。 + +**(1)**. 首先给*kernel/proc.h*里面的`struct proc`加上内核页表的字段。 + +```c +uint64 kstack; // Virtual address of kernel stack +uint64 sz; // Size of process memory (bytes) +pagetable_t pagetable; // User page table +pagetable_t kernelpt; // 进程的内核页表 +struct trapframe *trapframe; // data page for trampoline.S +``` + +**(2)**. 在`vm.c`中添加新的方法`proc_kpt_init`,该方法用于在`allocproc` 中初始化进程的内核页表。这个函数还需要一个辅助函数`uvmmap`,该函数和`kvmmap`方法几乎一致,不同的是`kvmmap`是对Xv6的内核页表进行映射,而`uvmmap`将用于进程的内核页表进行映射。 + +```c +// Just follow the kvmmap on vm.c +void +uvmmap(pagetable_t pagetable, uint64 va, uint64 pa, uint64 sz, int perm) +{ + if(mappages(pagetable, va, sz, pa, perm) != 0) + panic("uvmmap"); +} + +// Create a kernel page table for the process +pagetable_t +proc_kpt_init(){ + pagetable_t kernelpt = uvmcreate(); + if (kernelpt == 0) return 0; + uvmmap(kernelpt, UART0, UART0, PGSIZE, PTE_R | PTE_W); + uvmmap(kernelpt, VIRTIO0, VIRTIO0, PGSIZE, PTE_R | PTE_W); + uvmmap(kernelpt, CLINT, CLINT, 0x10000, PTE_R | PTE_W); + uvmmap(kernelpt, PLIC, PLIC, 0x400000, PTE_R | PTE_W); + uvmmap(kernelpt, KERNBASE, KERNBASE, (uint64)etext-KERNBASE, PTE_R | PTE_X); + uvmmap(kernelpt, (uint64)etext, (uint64)etext, PHYSTOP-(uint64)etext, PTE_R | PTE_W); + uvmmap(kernelpt, TRAMPOLINE, (uint64)trampoline, PGSIZE, PTE_R | PTE_X); + return kernelpt; +} +``` + +然后在*kernel/proc.c*里面的`allocproc`调用。 + +```c +... +// An empty user page table. +p->pagetable = proc_pagetable(p); +if(p->pagetable == 0){ + freeproc(p); + release(&p->lock); + return 0; +} + +// Init the kernal page table +p->kernelpt = proc_kpt_init(); +if(p->kernelpt == 0){ + freeproc(p); + release(&p->lock); + return 0; +} +... +``` + +**(3)**. 根据提示,为了确保每一个进程的内核页表都关于该进程的内核栈有一个映射。我们需要将`procinit`方法中相关的代码迁移到`allocproc`方法中。很明显就是下面这段代码,将其剪切到上述内核页表初始化的代码后。 + +``` +// Allocate a page for the process's kernel stack. +// Map it high in memory, followed by an invalid +// guard page. +char *pa = kalloc(); +if(pa == 0) + panic("kalloc"); +uint64 va = KSTACK((int) (p - proc)); +uvmmap(p->kernelpt, va, (uint64)pa, PGSIZE, PTE_R | PTE_W); +p->kstack = va; +``` + +**(4)**. 我们需要修改`scheduler()`来加载进程的内核页表到SATP寄存器。提示里面请求阅读`kvminithart()`。 + +```c +// Switch h/w page table register to the kernel's page table, +// and enable paging. +void +kvminithart() +{ + w_satp(MAKE_SATP(kernel_pagetable)); + sfence_vma(); +} +``` + +`kvminithart`是用于原先的内核页表,我们将进程的内核页表传进去就可以。在*vm.c*里面添加一个新方法`proc_inithart`。 + +```c +// Store kernel page table to SATP register +void +proc_inithart(pagetable_t kpt){ + w_satp(MAKE_SATP(kpt)); + sfence_vma(); +} +``` + +然后在`scheduler()`内调用即可,但在结束的时候,需要切换回原先的`kernel_pagetable`。直接调用调用上面的`kvminithart()`就能把Xv6的内核页表加载回去。 + +```c +... +p->state = RUNNING; +c->proc = p; + +// Store the kernal page table into the SATP +proc_inithart(p->kernelpt); + +swtch(&c->context, &p->context); + +// Come back to the global kernel page table +kvminithart(); +... +``` + +**(5)**. 在`freeproc`中释放一个进程的内核页表。首先释放页表内的内核栈,调用`uvmunmap`可以解除映射,最后的一个参数(`do_free`)为一的时候,会释放实际内存。 + +```c +// free the kernel stack in the RAM +uvmunmap(p->kernelpt, p->kstack, 1, 1); +p->kstack = 0; +``` + +然后释放进程的内核页表,先在*kernel/proc.c*里面添加一个方法`proc_freekernelpt`。如下,历遍整个内核页表,然后将所有有效的页表项清空为零。如果这个页表项不在最后一层的页表上,需要继续进行递归。 + +```c +void +proc_freekernelpt(pagetable_t kernelpt) +{ + // similar to the freewalk method + // there are 2^9 = 512 PTEs in a page table. + for(int i = 0; i < 512; i++){ + pte_t pte = kernelpt[i]; + if(pte & PTE_V){ + kernelpt[i] = 0; + if ((pte & (PTE_R|PTE_W|PTE_X)) == 0){ + uint64 child = PTE2PA(pte); + proc_freekernelpt((pagetable_t)child); + } + } + } + kfree((void*)kernelpt); +} +``` + +**(6)**. 将需要的函数定义添加到 `kernel/defs.h` 中 + +```c +// vm.c +void kvminit(void); +pagetable_t proc_kpt_init(void); // 用于内核页表的初始化 +void kvminithart(void); +void proc_inithart(pagetable_t); // 将进程的内核页表保存到SATP寄存器 +... +``` + +**(7)**. 修改`vm.c`中的`kvmpa`,将原先的`kernel_pagetable`改成`myproc()->kernelpt`,使用进程的内核页表。 + +```c +#include "spinlock.h" +#include "proc.h" + +uint64 +kvmpa(uint64 va) +{ + uint64 off = va % PGSIZE; + pte_t *pte; + uint64 pa; + + pte = walk(myproc()->kernelpt, va, 0); // 修改这里 + if(pte == 0) + panic("kvmpa"); + if((*pte & PTE_V) == 0) + panic("kvmpa"); + pa = PTE2PA(*pte); + return pa+off; +} +``` + +**(8)**. 测试一下我们的代码,先跑起`qemu`,然后跑一下`usertests`。这部分耗时会比较长。 + +```bash +$ make qemu +> usertests +``` + +得到以下输出: + +![](./images/p5.png) + + + +# 3. Simplify `copyin/copyinstr` + +本实验是实现将用户空间的映射添加到每个进程的内核页表,将进程的页表复制一份到进程的内核页表就好。 + +首先添加复制函数。需要注意的是,在内核模式下,无法访问设置了`PTE_U`的页面,所以我们要将其移除。 + +```c +void +u2kvmcopy(pagetable_t pagetable, pagetable_t kernelpt, uint64 oldsz, uint64 newsz){ + pte_t *pte_from, *pte_to; + oldsz = PGROUNDUP(oldsz); + for (uint64 i = oldsz; i < newsz; i += PGSIZE){ + if((pte_from = walk(pagetable, i, 0)) == 0) + panic("u2kvmcopy: src pte does not exist"); + if((pte_to = walk(kernelpt, i, 1)) == 0) + panic("u2kvmcopy: pte walk failed"); + uint64 pa = PTE2PA(*pte_from); + uint flags = (PTE_FLAGS(*pte_from)) & (~PTE_U); + *pte_to = PA2PTE(pa) | flags; + } +} +``` + +然后在内核更改进程的用户映射的每一处 (`fork()`, `exec()`, 和`sbrk()`),都复制一份到进程的内核页表。 + +- `exec()`: + +```c +int +exec(char *path, char **argv){ + ... + sp = sz; + stackbase = sp - PGSIZE; + + // 添加复制逻辑 + u2kvmcopy(pagetable, p->kernelpt, 0, sz); + + // Push argument strings, prepare rest of stack in ustack. + for(argc = 0; argv[argc]; argc++) { + ... +} +``` + +- `fork()`: + +```c +int +fork(void){ + ... + // Copy user memory from parent to child. + if(uvmcopy(p->pagetable, np->pagetable, p->sz) < 0){ + freeproc(np); + release(&np->lock); + return -1; + } + np->sz = p->sz; + ... + // 复制到新进程的内核页表 + u2kvmcopy(np->pagetable, np->kernelpt, 0, np->sz); + ... +} +``` + +- `sbrk()`, 在*kernel/sysproc.c*里面找到`sys_sbrk(void)`,可以知道只有`growproc`是负责将用户内存增加或缩小 n 个字节。以防止用户进程增长到超过`PLIC`的地址,我们需要给它加个限制。 + +```c +int +growproc(int n) +{ + uint sz; + struct proc *p = myproc(); + + sz = p->sz; + if(n > 0){ + // 加上PLIC限制 + if (PGROUNDUP(sz + n) >= PLIC){ + return -1; + } + if((sz = uvmalloc(p->pagetable, sz, sz + n)) == 0) { + return -1; + } + // 复制一份到内核页表 + u2kvmcopy(p->pagetable, p->kernelpt, sz - n, sz); + } else if(n < 0){ + sz = uvmdealloc(p->pagetable, sz, sz + n); + } + p->sz = sz; + return 0; +} +``` + +最后跑一下最终测试: + +```bash +$ make grade +``` + +**注**:这里笔者加了*time.txt*和*answers-pgtbl.txt*来通过全部测试,不影响上述的代码实现。 + +![](./images/p6.png) +