From patchwork Wed May 22 10:43:48 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Stefan Hajnoczi X-Patchwork-Id: 1103293 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4588RN6zGfz9s7h for ; Wed, 22 May 2019 20:45:14 +1000 (AEST) Received: from localhost ([127.0.0.1]:39970 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hTOkA-0006LA-Pg for incoming@patchwork.ozlabs.org; Wed, 22 May 2019 06:45:10 -0400 Received: from eggs.gnu.org ([209.51.188.92]:58559) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hTOjV-0006HO-CP for qemu-devel@nongnu.org; Wed, 22 May 2019 06:44:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hTOjN-0007ob-7O for qemu-devel@nongnu.org; Wed, 22 May 2019 06:44:29 -0400 Received: from mx1.redhat.com ([209.132.183.28]:38654) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hTOjM-0007en-OL for qemu-devel@nongnu.org; Wed, 22 May 2019 06:44:21 -0400 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 827363082A24; Wed, 22 May 2019 10:44:04 +0000 (UTC) Received: from localhost (ovpn-117-17.ams2.redhat.com [10.36.117.17]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7B6B428558; Wed, 22 May 2019 10:43:59 +0000 (UTC) From: Stefan Hajnoczi To: Date: Wed, 22 May 2019 11:43:48 +0100 Message-Id: <20190522104348.15616-1-stefanha@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.45]); Wed, 22 May 2019 10:44:12 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v2] Add a blog post about micro:bit emulation X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Thomas Huth , jim@groklearning.com, qemu.ml@steffen-goertz.de, joel@jms.id.au, Stefan Hajnoczi , Paolo Bonzini , Julia Suvorova Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" QEMU 4.0 ships the core micro:bit emulation that was implemented during Outreachy and GSoC 2018. This blog posts explains how to use it and describes the current status. Signed-off-by: Stefan Hajnoczi --- v2: * Used git format-patch --binary to include .png file contents [thuth] * s/runtime/run-time/ [thuth] _posts/2019-05-21-microbit.md | 132 ++++++++++++++++++++++++++++++++++ screenshots/makecode.png | Bin 0 -> 55960 bytes 2 files changed, 132 insertions(+) create mode 100644 _posts/2019-05-21-microbit.md create mode 100644 screenshots/makecode.png GIT binary patch literal 55960 zcmYhi1CV6Fwl!RB_q1)>wr$(CZQHip)7G?Y+nS!X?Z5AR?|tz{orV z+$%FuK~5YF8Vec#0KiE~h$sO7AUFU3&;ca)kHrWuAprp3S9_^wxF{LA6F4~8n_1eJ z61aFem=c(JSegL<9vijUmTowlZlT}CsCvNv3^_4oZ{fRq{Lv956{#vab!=}VWXPC_ z1K78K1hPK)zkR3tZ|hRfWMxYKr8OPt+cdn+1Y70%fBLzz?Oe~&FNQs@=jX9+_WpWQ zruWn{v-YEJ_1wAl`sU-`g>lQ1-=$l6dJn(7$A9xC)ZfMKn%#U3>gQ#zKkruXr$_nl zK7RS&+u=S|n|!A1x^6oDe1`-1j_ny%@R3_j9eX~prR=zE_riv8)W)jFzb@T@`FiVo z?OI|c>kWo^di{!FVhEiRIyV2?`AbK~zdIggSNLXj7?#o)lE=>8W*6h*bT?njzUSAs z?7O_>r`Ln@pUoHOFWIoy5^nzqf{&!qkH`DA+0KWKx#M5^=U-p%xz3+eP5F7`D(CMh z)8xKy{xem_7v^rfW@S0MlD=gg__u!wEweF$%<7(-;7ESRsRy`wtmAIJISLBa^L5`@Y=tF)3$hBGSik*HahlqDET zQInG|jNR-%-=Nc^s*#>DoSCvXwR;%5h&ep4)Ze zOI?N_%X7V=IGsIoU6^UmM5;D?Yg3apB~!Y-#a2FM<%!n2SB&xoop)smIy)0W-3lgg zK)y8wIsMxEGFJ_*uvziX?w6gTOBBF1Y3X#H&76Pd^q$It?n2qR?uZYLdk z*stzH@e#P1O)R$FOUw2{4Uv|_9oDgaiZ~xZ{96$`+9L7&Rz+;}4et0Astm4UGK~;P z#0|&HDPQ1ceAjipV=TVJp&e(PP82Gea?KA7!}F%^wDC z{Z|uf7m;}qHdI60>PX~AHM_O7-BJs&7uRqI%k?0=5(Yq@B|vc`VF(?g z#DQVNL1rr=wMd72zF0m8(6$&&pLztCBiTyPGS#pcow3$#V>)xkA)p-Sbjw2`dY|NG z3d{463AZ37Y#=wG{mCh0>`Z=_;Nh?{(QuoWL(COKM`ZO{{Vn=FYjsFPTe>q1e85~+ zYsC!xJMZ)~NX93}l%#vt;3)!NEMXG+Zf}Vkb-gt0Js?q=`*Jx7Gp*i9n@iTz!!QwCt zlR{KDgk_1tGD!Sqm-XhX3piEWFCZwWnaWc{wk@lBX zkVOa&C(8HQaAsBb!jL|{GB$ABAEMk#3h;BxBMfLQa@yuB^>>7WM0nD5c^q6{mw_#~ z7_tagCM|<*re#4w6I7l1)QM79w=v`7^9I3iIFH5J!dewK$;kj$RMyl!L5@!V7R%us ztoy@Q3==wpw8G^B9TlakI1HQ-#G4jB!q&`hMp^LDlV+qDS?Y~8;>QT~@_C zKIY6RSz327CG8aVi*>PZ<;SFMB!t$Ux7zJ zWd>~+3fyYHpby}YT9Zp?X{-DmqROO8!p}@+CeK)Zs&C5A+HU-qnQGfUX>IE_D{NwMGZc>xrmVsw*HTY^)ip=vPZF-S{rf7P_uTOVF%l# z3h@*VZmvOG(D_(p@5=JDfTTiy9eDvvjNyuIz|oxj%~sf3QDH3FDKPIGl^bz_h-E!r zW^Es#f9W3>nhqrY(!}R+we-k|l`>?st|-2ucB}$ey?&lGC_Ru9S^cZ%S{1^=KfS6{ znoXr#?915m3d)QklL=o=6SpC}!U`y&1^}VrLN9SKLkxzEp*NR*tEA9LbQ=W*B%|{z z2ttD)wxz-t_y_^ul2B7*nJR(4zWC%K0c@HMbm|6^uFGS=*1PQ7kUc1}!8X#g6Z01bDB6GvCA>gx%Jv!3 zo3NU~WNY_N78<7MVqD-CJ80jl6> zF$MGwxmfH*CQ08X|3%JC&=arWL)4HUc{XEy5KuNn9I{N~JCdtElo8jx~>H z+@DaP3`-joxHBlyaSw!u&MJ%jIV*w}GOe32AVxD$JVIaF>Y{^#xe^MLJaS|hip}t@ z(I_z}4@jkJ;$ruV!z2as@@+7o5IE4tX7yj*!#6|B-FGdx5K(D0(SuafL$5 z$KspojuDuTW!vzkDh zqKL*iX!LZddIW)HSTEqo7QVp7CqMrnFf3F5adYA{x+dSSLP4LAK1gVpXbSM*{74_9 zhUH~U&b@{ECvV1$dnPRh{DC-rBvZc3KW+a;iVs2ju-bfINlW}ux$i;gdDvHL^RfBc zd>3ML+$Lnc(=rHXEI&tGruC1bHwCJ2YL|;A2(_+~Mr`bbpsVm>pu*RL;qn`@uY>LT zh{G%d(Ex_Q>k3YQejE?^Xjs8I;+J|yh7aHjl5lDanMq?Sn0Y=aSDujPg!U%9EBrk-9N)Tq@Erb{tOu%Fi z&`+`!6f+*kr}aW{{7{m?{-MwqM2C)G8&oyeD@s3eTX-o>=_8c-we|-nn#|pk7y^$M zo1&(~C-$sRA)I-#WE;rgumXbt{X*zlWn-a0RVKekTQd=9DWFcgG=(fz$7iwS!0Q&+ zPA(}7ouWR+ibKCV3V+}>{q~gYFZ`!{&vEDYPi9Ua?*%p(UD|+#D$cAZfhQAu^HYm& zJwQV3PpJ^C;M@Z46{5W?N`ttC&eq3v8sorBV!?A}-$Yyv&rUHMDaJS&dyZo#_(cv` zZ7plH!<5jj;<9JB|bjhRwAZ5t+Cg0V`pl?AB`f@6>)Ja|?gDtLVn%ct#LXeGRU zJX|nFyM4JR2sKM3RYWm*Nbb~7>W<_S^p?FMT!e=Lq#m=lx1BW5XN z)#~i7_=7jM-aA_i_tq!(YsT*@S&rI3LkOBPqGv=VU8m~q6#VsIwCQW}SOD|};Y;3G z{_e~9`xL+LVcj+J_e1P%l+tA2ya4-}ya2IvE>QLZ?1lbtiMulgD5AZ zIb8@gaI8nd372zBmOL)<(6VsYc3(P92A1?{PB^!LiuPK*!1_q1;sA0LJuWTf(NmceJu(FUHwA%X{pzvi^CWILL zG%&yMS(~9l>}JUYG@*c{;Ka1FwPD6)Ih>yHSX{MGhUG3pFKO}0N)aYo8&!d0Be&>W z*f}BqdO9d^{1js-Q#TKk$P7o?UCbA*JVQD$Wjk5dCg4IxK-Ajux?IxEc zu(UX=CE+BvtJzA8euN6;1+#I6&FxWw!?wR;V=FNV+yRYmk5ipfp$&MFFeercr*3rf zEmKj|N{R1#u)!Z)KyNXUJ2trhGsEg^*B6Ph2y2lJH<`BH>9@~FbJdNHMw-uf|1X!q zf8a9`)=gSbABr$8;t6zd>b$i!gi}@1OtdSNeU^G6psBTwW`7VZofX6~Y!8;3cWJ{O z2qCIjCl*^y1#GyzP@Ye2V?N4`1}HtZK(LBJtH+cE>1isA;POT(*yJAr;Xtwv6{(ud z2<%%X>XE3X!vCJ|iBa!08_t7+)chI*Q;6@gR`swDbsy`)K>#^Qt)F5n<1IZ!V}k4t zZYh+9tBH^mJ2zr*cR>MIgg8-XINOAj(^wo%Uot;(9#RGhE*B545}APTIa;j{P#cy{ z>>lnQP$B*D2>r{fcDer;LaJ+7zz?97x_M2`JNyMyI;7u~sGaK%LH;HCp6wrk-5UsX ze=r0~Vcd?}QC%7=;=bTjq9L@hn1-0>Z1GY=3SGk^8+3Ro(rtwtR4GW@j7kLE9m*`Q zxR5C1arp}oq0Da6Vma_c6;If4QWeEfyTt%M5rx_}Hvdy*)be#%`(Q4={Jfw<(vrCSMp`zVZ-r!Qzi zQ|N{hw(?uz^H0vvmQO^<8|fq$j=Jv!8{ELl6m44w(BlFhB|vK@FM5iEBew}e96RF# zRt??ylj1Flo>~!@S}oGCcJKy!-3lz8x>~7wyK?W4tJrR%2)~0{hgAKLi=jMFc4FQt z1g*I-!xtjGqb(o~uVzdw5Gxn6SFmr=;iEzS05uy}2`OI@h-|;d4J=(pn4LZ9GA|M)l8H>}epDX@*!Wj>u01D0cW| zxzmDiN}%s>w;ie+y!Xu=|HgTM1`bScTD55Xg6-jBr?xI{`+HzJwta^g<`C`tdr%2Lm z%z~@)PVTb2J{CkU1dZv-G}FFGHX3?xYnnCzj3I$*Um+Cn_$7_93UTr_E|J@{7L^pG zB@p?xZ429IoG8t^shkAKpJd+J_&rZVTU7;Gf0CdpQ-(S`OpEvYWj07ukKB;&I!RtY zzlbw1{>eFSPfskRkPmmdA_iIy8-v*+s$Y38<1g-q~vkrB_ej^0+6p4IVA0adXWeba$1xpy_Pc4C4{$rk0RcV+V9 z>Z!u1nrTE^u4;ueIbj0U7VoH&oTJ#HS6vLC298r}A4xQ^zaZ7Wh)V6ZzELy*&&?E52|7Hwspc#1(}XRVDGKYzEr zwWVi5-{m$&dvOIagXRnrhB=LPiwQW-!-=H6rj#0uPWs8f~Y` z5#=lru}Oj_FQvrEJ;`4xU1P=#XUadoHzGR_IglxKXE6@uL_3#Ses&Q=0&Ru@K?@6r z2Oyc_j0KrWEL80Uyp78p1!^mXzQ6EEmkF6H5AL9I+mly(5@viYiaSnWgMa2~T^@Nx zfL<&HFeu4&(+kPv=_u$cYoIw5^1wW0wItMN?uDG9p%QX99vI7| zK)=_Y8p~W+u;9P4OIocJsS9kJFnhjaTpe{}ojRev`yjuT_Yt4A^1>5=2!YdcjOJTE zOjHE5Em8B^lHv)Js&6n+DZr?qI=h%F&KBZUtoNN?UI;*SFICSCZFBn^21wWyX$^rq8zFXM+#KQyZX-NoieU`7fxnW10UCeB`mKJAY zq?Z(C-5LBZ%zIGbj7SdOG+|<6SxHu%-c!*>$6ax(Y&xPZ*p*W{o2(WnN%v3e&Hye^ zGht5!vNfE6V7DSP%h}RXiNpF)WWb`{6E7HU$y*J4jYlP0YNf1kY9Miqvuj&UX_kEO6R*>+qt{VcKZmgtfBgO;DEzvoORx z7nfb2gVUt9vTr-nMCQOio*dAE7u88_h#NtkWd?WrPhVTYO99;kWzXl$Wy<MEu~ zN;c=mflv8j9ro38Kf-BseAjk7+8Zq@o$+XjJ4_Yya@yc=G1uMV|mTE1z zD2zI~VBhTa*9ib>0@GB)08)j^y&cnNg^-B(R7Yii_2CV8IqxbK3xCs7x+R@g_cG%R zge(L+=5Y_Uaeq_*SB3ox$U@^tuJ-ENt8qtQGN$#)f#00p&M7t%1k6iAfUQgb8qs|1 z9w+5Bd|56N9|SI9bQ=qb+_tt=@mRK2#ppg=-*RViX(|$Uyg~=Hg~5*G(k|#n_mnrf zBUNtuqYV zHd`&&j1A0C42!U|Ho0zOiQLvpkd6ovU19<%mokSvUL$goJ#ARL%#(+45cI2)g5_di zYlg9HqJmTx6-4(yAg-B1vSPHxCir~`WP_EB6;8C=+{gCf;l+c5VqU_8Y2#tVT$lnJ zihM+q{wxkHa!8~H|A&fhiuzHwb|CNt^sH`*oA)V`b`vy2x!VnMVaQjJ0CC0b49J;$uQHzCRXi3jpuZN~%{ceQ4!tq9`ACvXzyBy& zN58Jr@|xDt0{yEtgQ++RK(p0x{gS}qX2;b{9I-Qg#qw_VmX;%DSCm3#iP$)q*QD1H zi9WG1j_4aa)+jT;$X`L9*+^7d4#RgV+@`ga@9yxc*KTbotW`onp~9#HgQ&F)Fa;G& z4J&s=RdOZ3%@H;MzT$BgPsEwJU2=k(01cil=*Ud#WIW+2@agPR&vn~d5%adp{=KrU zs3W@gN@?5fWwJECgJA_%B@+;l7C#p_=U#(a?dymUR&wADOqeSdS)k$w-nG zzWa;Cwzk#{HX}$}wsgt0%u4TzXu80SjP~T*&IKnfW6b1qY;VCynFz7~v@|Ev6XJ@y zM!;Dvh9c8MfU8!}ikvT$$rU#jPAquY!3{LdgM1ZbT}}l)B4n;z+{$GvybMF_eatEj ztr-{VH83i_8M2fP6r1b1l$cIaFAiMT{mg@&jb164Rr!_kBn0-+Y`;#CD~?xX$gtna z9U6(!dX_gVK)SRO1S}`ng;jmO6noLqH6|5&F7(D+rYc&w<|4IS&;AIrh_DdkB<1T z%NS^vMu6v=aaV!*s~#h>T!P$f@wc)d3~hTas3{Q^4OubD0sJ71h;` zJ8SfJ*#5$oUv0bBl*JN~XqRf%- zkD2nLeYCa~+(an^okA-j|DD_MuHH(vD2TwT< zi9?|#u~@w(5Z1rnDaCNRb~f&dpn3M-`f65)@C3j)PXaRGEsF=0w6ZuN`Onsw^U%->2hyE`#dA>bi>@Eq3!R>(dI zhLNL$@wuSh<_c$|l)z75Um-65khxLwP|8#m7Qy1!@eYWf<-trxR}&x8y`;*3BTg48 zY!Z4{WX#!@DqXy}a;H|gv0_M!)3YTTcZlc3;-NzHwQKK(nK3$2&Cpuk*@9YN z*>e6WHVMbi0<9fjVPCoPD?(C^JwJ}Y4Re?`-qfdPu=hP= zSXe<)SeQUTNnT7+M)XIl_Bwm?=y;a$|KRv~%OPN54zX;?^UmTZPWFH^M^ls*x! zf;45aPZDEJHZ)t9ok@kJOQ9P|#hy=XSFl7ULP5V$Rd75Nb0~$}UP7AnU6e-wrh?z{ zJkE2!9?x~ZhMBvovEl4*CE05) z=7S;Oqx0b#;OrlUr0)NEIU%^kajek@zjs~Bdcr-x9?Ffw%^Hfg$aB)MYIaGOr4)yv zleU%Xu&Q09(eIpeBOfWj(}Eabj78GX5rij0Imi&9-wl57`K!3EheK(!EO6|UE7zwH z-++p8l4`gZzXq(S{oaUveBB|^q_s_S$1od#6tx63F6kmbk~7>=LJc(sB9ZTZt*;>Q zD4NF4A3sJt}# zdlnb)0P@cU6>uYIaS_1xe?A4><;g!5C za@{>pRo_PWo!`4VpiaBzJ6%fF5H5@a6-;bvTrYn=nroi_p|bAZK}A7@`2$@+K`8%6*b^xsPe#vp+T z0aWmRF3|A*vlDUrpAA98;eX2p5d;bUZ_$v}Xvr!81kgg;LQ5*YRXyMxpN}h^W&z5q zGs|RCMOZZyV+=BF95HDcGx5ePgP+?Y;`}^t;I>acGq%nNn{O3wZx(T0N14~c3P?{M z2=Ln%+RPi;Ox#>1j-=!Cr|5qh5Rx{c-T@&$PNm|1t6$KJ#kXqb^LraZYM`O@JbXQo zDE6lbg8yyw+!kopaC=l*k=Om%y0rkKMxTM8Vhn%+{N52Ars_;w`IE!OEDZik;u~2> zQaX-=lQ8G+kb{tL4Io9;V=Y-%L`{ydv+1e9%9gB`ep9A&Qq`ArSwF^l*N4Z{agA7R z$O0-|j1V$t4qVZs)KL&2WF@@Zh50H8l>#(Ke*>I5YJLTJNYpmBu&7e+k89L^O5rw# zrv&-ilgxmLm5vTlufFMH7!4Zj&cML#YLn%r9*b;s5|fzCesDvWTiOUAwe3ik%RR(${+NtB z;Q4hco$2v9&hxz?^wDV8P>{u>O{$Txt@?!f^vCA{aXnARrL%Qymde!I zK=nSJQDHHcTD-FBoVc$JQWp$B1z#46C}ckstNcMI0*WkDH=D^mBldn!^OC$rxgAtz z3`=clf%&HmEC5;o7Z@` z;P4Y08-V{JG>#caA1W^il@%KW8QfXpe6oBuw8{%}s}96{mj$UV+1 z-yKmWV<1LT@z&o+mID9rMGl%fmV5-`BImZ;>O*n9+iudSk#<>h4siZfhg!gTiNn7e z2k-|MBqR2O-0P!oQBj*|7wIENA&}b?TT%t7y;MjoO*nU7A4{zWY&Hzj|-P|d?%|bs>05u2eo@ZqMM3Y$OJ8j9Ouo#9-vBRBQfDP-iKbYt`N8P^h)kMJRa zdXjWVtNnR{WF!xDxdNefG)b^Kx9ibEd;(yAW*;1oY(>5PN7-vwd(#>EaFH|aA_z;JhCY12&%7_Kp3 zS>fq!`L>%@kyl&^9xpkeXAneyr{|z@TS7X2GSgg|wPD(Wwe0E73)qFR(BZV>xNV4a zH`&cSG`(BG>B;Quo#_enPr2LbT(?=fvU+euJ{V}fYealpDJ6gmFIP8*__dQE(^spjgzUnPr*{_R<9-!^NJfkkFMsqxVB` zVnt?Ev3#C%d!{lth~J}-P>gIlduI1)Tgub)oSC6{6L!l@6qwv)S)8u-+mzofejS=4p)OaZpu%NcBUW_Pw(QddH{neFV& zJa;GhnJ*6{U^h3k>`f7tsgnva{F5&nv*Y#dr2t5-SO2i-8s^2*Q8Hl+(iyAc-@#ge z;7~F|tFd%gG}xq8_^C_A;u!x3xj_XgYn{Km`R6Bkuu%ThOz=)N*_WdyPkawiQ;DsR z!xk@NWgOHp{ZG$)K&(%n{mn%%{&y8ADL6pPxH7Pfob2(@va+mkP&D=7Y(ymKsP^F( z`^)UFq7qu4m1@R^B0PI+JUQ*Sm{wA)EDM@wAhJB<(E&42Fy6%*1$A}M6JAUhBj zgM^U<+HUO3>HHean{~JO>Ps;i&RbP8RRiNCN1?Y-@$7EaX;H<}>}Yt#E1#zT28cHo zCZ{6^HCqb1mP5`QZ{*7wq|<#g0JWDJqKQ}(E1du*?0j?t5zVUVvw+$2Oi#_W>U>i{ z3vcfz-l_dlDoA8h6@8@9&YJW+D*n5zrl<1(#GQ>F^ZXe!5F zOJuG!6DF$txMRvJo+4Fw?=bI}DYJuM&G6%6kw_~QS1&%!Ew7z7wSw0+ZIiBz zu0rYXmo8uDw17(pR9pFN^*R+aEVd5wJ<`oZYS@o^3w;|~W+1=qt0#hn#9Trm^>T4F zrdWS{E`1+CO#5iifX{HV7A>cochldGjX$%UZtbe2NEKuo3p7nR#NZ)nila0?*bE-l zT^b6=n^uXo_-eQ|_Gi-|Ec>&L$J7?_|?LaF8X zaYtvcltzdn z_mij14=YB%;r%mY$cU|o0#;r6FZHTk`(&59@=dpqw<)2~N&XNtyo`SoI!d768Z(ccmZ#4F5U6E$-A zGyOe(7fis>GGGgsejIA0z}ojiSFjo~{rs1O2Cb{OsNY*l#Cmkpn*ISf>CS}dvB+Yl zwSxnEbgApxOcjO#V^LAz+zk&n1A+jdf@@qE=9~(0l@-tL=xf&KJq(A0+O5s}WAM*w z7YvSX7TuI7o%&wI9yGb|z{%NYL;IdKIgG6~{@J5>Z6&SPJqC=usCmX5&!pdP>h@H} zi<+TZKAt|^X3C#l9Feh1_jlr)Iqp`V<*-)bDj}Jj* zVn({PA%o?&kxUIsRo=*uwX#gAloYUfEtHrM;_lhd8SaY2FiG`C?C?ZylP0LxS19N zf5uQgE_`w}zR=#CJbpWAz@LAN&n)+OP&Bs+5leJRPesR;45;487>t@-O2%5yqIu^A ze-n%;8*M@)Ut0 zp~F(1oq22e`&i|3D@@4$sm5%)Mz}5|qq6OMXdG9!*KS~<@|kPbJMsN*IX0%eiotlM zhoHX@1BI(>{WQajoN{Hs3UpNITwx$Z3OH;83LZ5S0i;HGLl`je{7B-j&6pg7Y_Gr=|O|{&WeQ@La=jdblBHj?z0>M)B+tXbm2uLyTVc38bnkBp(~+FdyH>Oi zGoj^=WugL7^mmvFEHU9l8E_U^VZ|WsN4Wm;#rE%4nWyxZOc(n%#Q5H)B#qWfC&t^t z%dR(vaIxA$Wo_8Xtf}A71N-%wzvxd`RS#c(1qrK`lWKL`pS=Z(t>3{Cc{;*2|pHOJ?^uOA@N&joX`Vz$!YfbUGK^WPEIGu(teq=xiYMXTEy&VuvC zrp2)0V}gb-7BYtjx%ipDr@`KS_3E= z%v=$3W*Svz&6wO-0TeePJZI-V6r>@;>WDE)u1b@*t^>+d9l_H2O+w2LcPiss%*6g`2}bAJn*82Qa9KO# z&(<9i-$i4vRYF%fz+T0q*wV*SDGwsR$@=i+TS$VZ<*ygi=|fqnBs_ElvV!#n;dz?S$qDYr8LANrGV~o@P8-ZPj;4%9x`NS@>WC~F7-<~ ztc~HOj`|J3IYY0lJyN~sq`lqElvvuI0Xgz*_ zDOh{~MZnCSNxIoVDIyZuY^1H8gaTaqfjD1fu>~UHSekl=;@v`k{uC+kJI>2e`^)Lw z3c6B34isuM{z+jD3&(f*9^jYq@E7ANs9V4NiyICf`8oQ>3AlEsXu?RXYS3ZzU-J)J z*@(Q1W8hfi`cz;E{t7Oei>PR)$OXE&x zXAqm<{R2zQd9e#g{r7lHuN;_Q#bBC@JFfrQ#u6GrxVAnq!dym2!6Rr=hn)=$RDY1aIp{!_BaY3rcT9d!KqtMSMV55(=l z?fz$l<@1t16CT@#if5HFffO?Mctq>ihX!D2aTSwg#E_|=nEJLwj^B3HD<)3Os1_Oe zLi#3z$X7v)lK#}lVwk9~WN_c#IQx!W5%~|r0^P~Wn^bl$!&~wEknrK_tY3z`)1rm` zp)T=fSi)~1ciSICmN>S84k_wYTlYHP_Pjflat{?C1I45q30Jo<3Xke0`ib%FgCZ?R z&Oe|KGT%y!^6mvv0BVtpJNyy=#INEv54;fWrlQIsvO-50k+9cg&~o3Mu28lrnwOJn zGGgszx;M7}IHkLj;|$h7=Cd_Gs!b}LtfsixO_}XA6hfv7HseBap&oP}^6%yS?aZ;~ zmY=B*uJ$Ni?nMlzuzS^yqS~&CJ$X(uHTwv;fiY^;pcJ_$+nt8|HDG)PHB4~cUNTCpLx>f&txjy zE*uy6N-d9Or=FT4!qTvJv zjD+WZ2hKbET?g_+Co`6M1v7_Bq+XKd!BN%~(%TLBG0n^6yn3t6iTW;y6!PceXp4O<;vcW4z=zQPJkaYa?WuhUYKd+oWLsfCePK3h^3*K%jB-E`~OD4ZQxlx;{ zBpKvDg1EOKZMr|pI-5!gEo$leF9Jv(%q)2zhyF`aNJpc3Oxezl(p=|`MK7N(`z!)4 zbexV%HE0gwpmDt{9fA7xJuT3l7C-%QxN*cZINAd zeB4mIgTR3Thq)t{ghQ9pZqzx2_WG-fHsjCGd2p}9wEK6dVz;= zR?hA$8P;#!s64M8IlEq7NNb7YXS=yNwQMkC_KDa)3n>S>=SGw5P3AeLM-uo7U8GtN zG3^FSR4A$;>$yh<&!$mnw6*<)_I}kSqMlDOE^9SAJpP03I2}FrUR{8~(V*2?F@14v z^zr4KTuql2g%m<=2zwl9`Bv9;sIX&M-nobd;L%1I4H+~uoR_QW{G1CAhA6{d{h-my z>#xcGs!$Clmk>q@DK^-oW8ZZ9d_}wbbn`>pjbiqw7J$_Q6GVt3{+9r+idgNUq7P+J zOAi^=Zy~BEv-P=ld_m3SR~*9WS^9CGSjqa@IAjPfnI1;+lQsTt9-jjxZme)ghNBwP zXSkLrU#uy2!1rkDaSZ+Cb5sxI^^>Y?i$C;J6e36|qv}lVKZ*bUqzw6v~{?_@JMHAwo8+F>DDMC^oNFrePhVHF*9MlHm+rXWLDYn2NhJTIkJ znC`gRJJ><&?YJ6So}7cQL$f+FLu+`q>HKmPURq%#%OMxt6dnQhqXMvrMbmze|1^#T zSALysOLS5pMc_ty(?FbYLreEWM^<@W1s{0?_Ml6V7t=vVD*1Pl(X^e}wB}?pJvxqy zFL7%`zlJck^x^;WE(-*ZJ=E_a(u$ofuO}=8STvMiR21P<3`<%fkwH6V#%6ykUvKi{ zG#o)EA&&9L{ht{Kh@$!?A@zS0jK-%XD_ijYDj3zjV`hy?@=9<5DvjG?p4T zx{a8~r)1OrUw?3z(c6e4k%=Q^l_5DCA3Xm(a6c{tlbTnN&!$N>sxQJAWLQ67&^%<^ zI8a1^Dxmm(_55;Oh6Bd)D3}31EfdNX2uu8bg42It_EQit2onB(g{lA5kN#sL_;33D zKMn&egfpJtKMfJftv`paZ0;p$GM^=3p(*Mgbw6L1rjoU|uhD63794%V_bF0IBft?y z5lxgr2vO@BfjgI!kg1~PD6tALzP(#z(VWw>@V3YjQ+j?F#7pj`RHl+b5Yd1P0&wIO ziin8(JTVR~Pyi6zukh)Z5Faw9#?3Bn)d|P>11Uj-uZf6X;d4ao+jc6dsZj`DDJXxB znk+xXDkIc{?Cj{QSASPF>8h&wN&Hj*4Zkr*#qsOymCaV_Ze5W2{xwM9fZIEN z{{D}f!`O==`x$>zd>K1HU0sXwdQt&g9`11Jw2Ui7tyBHqq53C0X$W(PeqR%?srGODbE=S`aibGfU#=ESm$XMyr&lY+#+-9+A=vghi6N- zKiWT_jaW+V_jI3=TfBcM_vHK>0ln%Soe@`_&hc!`x30TaRxC8IAoYF1u4`*D?hMR7 zR>$f21lxPpB>V7txl~8)_V(63`fPtK%U(;(9CvRrUtMRvTA0lEIyK+&UCnhlpU>^_ zeP@-!J-JEmCN{yD>ay6YdngYjR?hZx81Ufa7RS4Blh@qOKK_k28&`|y3| z_rS+O^Du1<{{bd0=Em)u(W^x7*|szDNXj24rY>b%J;oatpx8-M8%(?J)yWXda)FY3$3;ntAQDNcj5Y0HzQq7I$dT;zfhIYp|d}3luNzP+Wq$ zYjM}$?ry;Y6Q2Jw?>z6CH6LcJnJ*_<$+_q5yZ1iZe&?Kf9QZb`7Jl34;T!STvO>k* z1lt_iv_G9(kC>UkSD4h7l!Rj!6tffmBs-!MB$<hYhy?-@jNw9PmB6UkG~B=JRr z&Ctd%B3)^r^h#wG+Ubw=#PZJ9MGS!!)*`;M4q zE*H=S&o}cS7mjJ_29_rk?O?SgA^YPh++;~{>3YVB-6eh;AqjP5f)1~|&X7@A%81@+SD z>`dB?&*jP*V{BDlG%&E-Gt~#S|9a|CA~5hRo=UWhPTIRFW?ueKGOzqr_~DRh9UPZ$ zkuNX`pQwAZT}}r)D}4BpmL=$at_A2D>W<6G@VM#P-q_r#vAdk-%3@%%5 zwR>Y&7O%m7XFx|>Nx)MukL-O8cCYG0_#y)_IeCi59Iey-$n!gNSOXoyhcho$m`Hhr0$+OcO3C~Zyp_G_ZASHYC{M#PlW?#OlfbXe22 z+;frF4R!>cJVrUSc!#hL2$wh{4yyN&XQKJsR}i7*zD3KhU~OPqFKjSX!?Ql{WqQx+ z9{vK`(BvnpdtSW;&?uh1Xpn=oyf$zimAE0=n5+HzXlZZwBI89MHIn>;4fWrm)3F`< zs8o*6dtn?#ngG3x05W0Un&z^>Zj1p76HFVT6@3F+?9$>Y1+{{c%UPV)q0l@Lo1OjD zxOCx!@~Od}q@=t*q2KfC8)cr%XjiJ!w>LIZb;jX-{_Zkb<5N8&iBzf^gs$sFh)T_9 zsk1p3v-60<$to}XdV_0Fm3azutjChR_&&|rK-40veq5fwM6pxZt!HPO^TG|YPuFdV zrLeGKFCzA}5R9UT(=zo|^C2)2V+6aTRf4qYwAYUVcGa6jdQ=CoOSNnzo2#C z0M!|#MCjrrC2&k=Eh;!St`5&1{0y)dOw^Ur&?pA|fSHyq(KQ#Qvj5mG=zAfc|V-i(3R367{4d`2Wcz!zzJ#T6P> zNGY);&N8)lQ?DzbxI{Lsq^g|N+TJN=NfHd>h5D>*9Sm#)loF3Sa0FA*r4js>|2^Z~ zeV6JO{KM7Uh>|(1Xk*LM4Gk!aZ40Z37guGaTMR60UsyCj?LsT;LiL_S0$fdx+%fXG z5U=0Mwd@V^e+@iATFiQe4=L2^R>fe!3OiCjmTFdhd@Xgd{%U7S8EG4o|4yIJlDCZr zJP+DIGt)SSSq5Uc+C%d&Z#1WZZ3hdEN`&f=Vs<{8Qkj~>OH8ENaOF0A+sgl5^ zQH1$%p*~kUHjCxMhYu^DMoDQ|%M+g6!}Fy;> z#E3+P@E2mmOUK(^uU>`M;ON4ilU_^mFo*PIiSVsU)W_d12Q=y z{++LdRD&WM_}qxV%>f&>U5eoOmJTqIXwT#^-v@#MyXjds?O7`~IP8EVe+k6Sjr}fK z{Qb2>b-64N3^eNXbtOUIy=y(Xan2|Nu*lBmJXULLNC-GInL&clNr ziIS31R_c5zp89-&ZA7nfHsRtP<28|>mQFZA&3ZI}M!1~~_k zPN-O;r?c1%8IGMnD%dryWuW&e+}jCWu_!>?)xqUzYx zA-?sEjli(s8b4)aJJ}j{%P1kSYOot^zo?15(3eyp4CAxM$_)!qg!b%I=ZpmjO+oo9 zsEnfpKS&WyZp1guI>K9;6^~O7@|-o?I=~Y2oHI80>haMGwU7mBc`X1f)m2v?+ndX3 zm6}is*QcoL6l)S(!8WjJzi}wu8&Dj3S?UlWaV7l<6VqBTDL$M`K5tn2+N}Qr>1`|8 z&U`5u_zw284vjn9*KlyVjCsa6=5n=c#o~Hfz9Ii*|1ab?9So)Ewt;~?o#P29 z%V8f5H8YDMizgG*G8I@WC&%Sxoa!03dcSkh>DjpzzH%<3aiF? z`7@Qza_`t{IpKQsE;sBk6o0kH>}R}gRfX5%x5GbaiNCTb!n6}n(J_*lco}fHca4P3 zx02KvYgGA8IxI`o$~9I~95ii6qGo2)*4Eb4$_-roM${WkFp&h@F1ZVoboLGPeJ(&JSDrx0t1a36x#N#>SR>(40aNd+mTIEOw%~;r zqa6lFswK0%(zdcFD^X*nQBnBI2fKomGjfkELN=`(gCr&uQkYF&Dk|m_Jbq-RFIUJe zJUG1UjP@vE{=(u_8$^*OrOxQ((=|(lU`URok@w3+@vr{IJXB}&A4-nYC(M@=j8-DF z;A0C~I7=WzB-E^ewPV=eQjYJG9uU+l&{R9!KU10-`u+T^F?2@7pskcnhVX6CIG|Wd zQp}YH2?Ot;YUt4p<#a~5UPKTKMf`~LfU19~4qyGfo6EIL zqdylwQ(Z|fTh|IHMDlZM$JZc<)xKyy3G(6no%NpAY|B>FUsx9bJ&!r%P)i!>R5#XT z4;H_{RDx`0v*nFT$J<>`23(h&$Abl@+Cau+%%=OO*dqaDkd^H{{tx@$ZW3o#m(^C) zfb^Y>rZGVS19p%V*UCAq#}|$|5-ngx#Ib22KG^0ZUc{+>`PXi_=h3=T`^M)~&s&*T zRh-6Qmt5P_@7+QBu8n(y%(xi*_xZ_Pt$YOFlIYWTcggRg3Gn71oPjWY7#SA}i$+Kb zwj3Exu)I)W_vPXI?qtEl+lX`y2P#lwYP7uIX8wfgha7c04xFbLYE0DaZ(Fw?s<)f! z%@r(k49;iq-Z=33&CXlxD-GPwj^S2rI`2eQ3*O!?Z|Yp@H`+`av$eaXCYKKSy~{{d zAyknr=cA9eH5tO3s}V57n`Z+d1Lw-V4bgFnXW!7|vzO70^d8T0hNA9}9BxNuFx^6f zN7-AF<9*Se3mGS=>*{4m8+ikU^Nn_Olzx1l2dQELkPs-_D({qxKZCl}n$Ml@{Bqziw5ruEe%Ciko-8)8lHTQ(mVQF0a^>nR4iHadvVS>t0>5LP7DkniE$>NdS) zjd@!i+1GRzmqTLn7nu5&2Z=ueIQWk|zN_I!zKxtA!3q`6QvNearC#p%N^)@m^4MzA z!BM1ElVZC)OhqZH`-|0GiR!r=@uyfPVtj{H#Pi+rwK8jpyWM7(rrNaZinl!M(c{8f z668`NJY#l$rU~HlyL>tJJjqx<=;Tk0gQe<_$*KnO0Zpp_!+B4&*!K+FsMNb`IQ5$i z6E4<#=W>x>C|=QdeBsKni7Bk)d0PRy*vD|7I66%2>rd{IM8%5 zSbDOK1-x1PspfKGw4=@8;IQiW9oUh)J(a@d#Msn|ei^q5Z2|+&hYMf&0uNkHg1lIc zQbJrV9s*tN)~{F+DJrf{H)bWH@$LHi7F_2KJ#Ju7*irSbZ(04Ci7=0B(6ylKa=TqS`hG9IbC8$^%VJU^qOWVdfLJn+>k*8Olw?&<35X;M< z0q;`Ij-N{>)95a@&=oLSZHM=Z?-;fo$fh*1THvm1?T^a{7uot zLE1TtJ^9P*R&PW25*g>A`Q>f*{@cd6ck{KjT^7|`*DfJb!HYIMR-A@kdT*nI=P9W9 zLdp`70y#dh`X#Fot95Y{te z^{9XA*;jN*uU<#gef2Y>arecNCX^&67dhy@JLp;7xtUm_t`Apxhl=;wG|zi;Fuh*epN>KBG0Mte+ik+B){? z*#w=QP8RT=jrxi9h(<>x(QzTdtkpNfO72LTFBR}(3)4joE$IsMztr~wI@bd!)o(S( zX!UOop0}-tYQOYo#Ho;it@mTS`}+LdN=R74``ccu+fM=Mp#?%iL;gSZUg2^eF{k7t zhrRM01=Yis_!LxB=rUtZRyrdl-Gu@$$%aQTaM|w|Ankf9ahkS>YNc&-KOUl3-|JqP z!^Hn(b#xw;YI-pqzwl1z0z%#UyYuy;VNx0%Bc|oLe8>>c!?i$A1o#m(E^}v<4w;k>=ZJuiIH%uy?6X?fe#YI`Nf2RevRMs| zANDBAI}@wvi81dHuD0mUdRE2NJfUddJmEp$BM?rVg} z^REK-lT$h<>i6Gt_e1F^`>=!ayis~3FSX%447ovc*AtVHG@+bU4fvOPW$j49RMqJV z!~v#`6QY2Jg3Ne*o7mOfLNy<Jnkq>f#|gfI71B_U1nwx|z-6#qCs*q-+N+#Can3#CaR){J{v`Lu%gG3g z08tPU?()qN?AfumJvrvR12+(;Hs3YLj!1(DwBWK~Z_LP$9|>N?UlsCf!OmA!T~9WI zwY?YYGD$C|RjR*~fAcB8+ts%wOUnz1Vp2F6HWScL0WWakADARm5b9{>2Cjf%#N2sG z^ET{=dV=vCsG{;J6G<{C$Z>Z;(kcg$SU%ZdLu&55br;bBw@RPNR|WbFfAWWLn*AOl zFn#(=$!-ZB8;g!=_HTEEyr^ny=7)zvL-!t?jg0=#j8;qIxn?3pcpBuRhSm4mss>1s zgN4S>u^)=)_IEHzXhxr&APoRbChh0+x9O#3r<%jQC3>9CFTL#S9URmfL1D^2fy()X z{UZ)r-^CF7Kz`vSuO`@!Wn3-t$vhTBjA>txWx&=>T?ngW&D3=?%{QB?RXv-ELh&0x zT4%sz4>ZVGSd+at%Hk)Lg7|JhY2?Mh^AVtslvFT*`>9xhtjQL$#)m4~PQ!=__c?Yq z!G{+G@2O4s?SF;zE`c5rv$15ioT#EwQwD~3Ln z^5q;o7GcHwep&Eh=yw_F?F(V?6jH9l(fQdadiEG zeZ(3g4r(@qH_xj4Dk8TAu{GrHol@=>tCNp5jW-AxYyIq_Sj72Psj$aeu(^Td$hWfY zvcG($P|&K`-Eq|)DzpKy_1d_Fbi*n4#dyNap8y4vRF83PALnT`+VhSojQ(BEl)-`U z9yqXGiywBqesM4rLSItkh1&6<5E~UA!kdKViQ&ccdW)`IpOegq?^kH(#?l?x%7go{ z{+tAv9ik|$*#0jC&`2x$L0zkbXEnlS1r*Y8fs0%kZNrWC#Z*>vHaT0C^>YUyK*fsm zz`%Ml)8bQI7pI)q9Cz6RI*v7r9TP!B`cvN&$o0J}#%&cA%ZVr?sz|b4xE$d+U07(ZBcDdcWpyc6R1+bhC|3K-j1~l9nAx7V(*f z!22%-)5jH?hUNIyOy9%OrjDiKmM(zuPXUftEU31`*-RXXBXE18%=*me3~#VUS0h+} z(m$r$P_p%sH%9y?itb~nL@y#Z9oA^gSbF;~G$JV7-FOV_-s4CR7AB0b=_=7?Am)e? z9BK9bOzF=Uot9+;cRP@jbZkEMG>`~2^AL!SuY^}ads797oOPJuPJquynS;w8DhL_2 zI?=nSmCa2N}BKMl*buo(c8@dZiS?-h8&*?~! zVbhr!-iYK#?I6%(cpZxUg{Iwa>Se1*;`K2r5#dQKsauck^9LU0pO`4(Oa}*)w8}Z- zdB4>S{($i2%%|&)MQfK>=1eybaG1!J^(yK6t3hWywsszproS^Bpjd*Ls?yUfQOu!b zWKyl2kBx(EUD{1n%&ccqxEKncu;kl4k`!Mle|l3M+H)GM$*z!zqEpSd#J&OR16q!= zlP`FE8FWiX2M)BN&~R;5mE1~*N)g#T7l}73QUv_3;4P;DYT6}yj0@c@j$eB0~ z+0IT;G2U{<&ZF+!^p^gpvjM#Xu`SF%{T8!Xth4-O??O{j*0y6}RtRGL13O?{1c7fy zOXSn{9_Jt7bGckDvW8ulTt6!G1|!^_x`PAM~@HK&?REtWl#5kUt#wio@DN? z9>x`;dcrz492Lt}@HmC8h;b4dcVNd}T-O@pw6ys;%xN9MMJy~%m+oihW#SV123e82 zTkwnbH|N`t{5Hh2>&(>ai_U6J`-~~PUdS~w0fFwy0;F*|t|-PtTv3jv_$k_rE5pN7 zcl)K-uHo$(o1OaQ?9zM)WHiNn$+hWxTC+&EHe9FKeLzC~X-iy3x#?I`teeEq&oqRF z^fGas^r0A2@W8OjP18C$7O5`d=qXgKli6Bc8y1tEEX$vKF%hS!bWVbxNPy})`n5j4 zcXu!3ONZ${0UozJLPiPLv+b}KD}Bp{KNC0v3AN=alrY|5hcTOWo;iDiW6{adb>*yn z1)ys2clM1WZdtUS&PfsZ$D-S&YqujnG9<1G7;r$Id~n9XL>L>pFQXx*5Ax-WHFg=* za&Ncr=Xk)Bx@S(tZ2})^gL3PmhqkFa38xr;47Rg z_`l#1Sh#1M%6c3R7VZ&?og_fl?-*?-d{ZAc3_4Pj|ISA+ZaX2NbzVz54`C>1FKPI_ z+)&_a7j6V`2iu_|!a)`0Q#VKg9=jDe()cX)6r9P2`SbQ&;UrdGuJ&c$`};6&g{}f; z4|Ho{+LdzOa9D986#%r_`w=ko_PlN6Wo@f|P_V`2w$(fa^Ge@{=}FJTFWys8B;G|3 zpO;KZZ`w#+wC4~9H=nc3X!SusLBp@UzIMX*B4horF-4jZw^M-qd53eLGRee@ql4GI zkB+>MY=50Ja+#>;NzXEMl#ne`!8)@o(A62t9y<=(-+jDA?2}jcOhxZ}m}v&vyG7|i zjxH2=8J-K=Qa3$+!n}-54GVq&E=@7-=Z8D zsM@eZzM!K#F;UFOx!`$%`tctG1@JXnrPIjUU)_XND*R#U#Jwg6%;b+KpM5iUp0wpW zK65YN?nYTouHodS{YlxL{^DF2bL)tcjYjYXBj;D$=R12#ZasIkR_`TM3_jHgkDN}z zRH+y%BLPo9gCbZaRC|2_qyJhHo7r6olm85oI;QJ?HpF?ZFtvV@>hUf09%~i3K?3Cq z=P9m$TNHh75d(s*dkwimN}Xn_w>3%bxCYZ-i1b^juZMB|3-ySr(Ta?0uL0=1y5*TE za2>hWRa;+sxj%)WYc2_spZrapPm0}T3FW+F%PpX*7kc=*@jGKG)w9{pI=2%B-FGTC z)AuWN{wh;ve*p_&T>{6;$_oVXQA^fKb zwfsIR4wr&6d?uqzUEy_rcw#(B(8c8;>}vMX`fTj|PtH&T&|)2Rb|yvYu}8@+yFTXr z;4^j&of>8#Z$}k7Re8iyru&xqcr~ptt6`L#IqmIcErcCNK#IS%HcJU&x|x$)u0t}- zzQJGY3#okdJPz%JeCf{D%9zUX8@`zr{Z^AF02LMe9ASUF2GQvuO}ECcvAth@uPH+w zFJI_MhQC4q==h$I=ctqJm|m`~l|qJT_a66~n^pVM#lwQ8Jy;FDm*-Eq zs6F4zRN#Hj{X#LW z66zdE{FYddNeTBpO_yYnH%=!1&$R$FCuitHiD*L~LU-2;fxhXsHR=gZhi0%6krh>* zjpw7giE=QVDSqV}9kXqz-~c>KcFs7Gvh4w!G_Ql6&!a(R%-q`ndZCHR8752HP{zxX%=O;g^LImPpaCdPbUXM`pZ$2 ze+ns5z?@GyJf0Bps!nSrS}93jv3t65ytn?lUstFBE0-k#a9k9kWoK8`Ir@i5m^!5q zf$3?3Th;{puoaSv!zo$1&5x{77g*o#zBE@N<{$X_aZ@4o8ylg1+$~>gUj||AR)l$ZH!ig^QgZ%2_!6=L_&AvI zU(KBkx7RUMg$D_jBj`UvCcRO!e-^+>ev#tkMF?(_ZXi6`%=>pV^9`{lp77);zzR?; zGfP1RalkWZdKOUQM2{3+NDzn`|Ctg6Acu8xzV%Mvo?>m7CveJn;agvW)9u6LB(7v_ z#!P0`>CrMCgYYwCt@^+gD2eTD<*!{6NI1u$-K72&Rn&yd}fR7+SfybG@hss5g7E zMJze9iJ+!^jJ1DbBjnN2CETQx4?}URBnT-N*Sk+LHgH{v>>)x-nxHDn7&pRY z7Sg1hoh5#c7jo-lM}zaNH8oZa{9ckuR=25t$Us#~gp}dj5-uBRD}xuFI^t;%?o1 z>Q3|1V!(KbJekyVaVJ1atJ!)WTQbIa$)nfdl3927Xhcv1#<|=PZ3!(x{v$C$dghDw zZzCAsER@#1W(<)Gjo5@z(%)3m2~Q!5rwjP%Eb_uP_cjx|K({@2h~&=X=u5PU#fpDq z>{R%g-#hrzQkBbe5&X0bL$FWKO`|LYk4nD>N9yAL2?jEhs?6$bBdfoK7&@r9%!{d0 zU8?f@iP&B1GWhu-ulw&3>5`_U@c~p0fi?W9K&-f7Spncsg}qFRRI9e9#8J7t`UeMU zw=7|2_rlzqMz&Gi#gbd%#lO($>4^wy|kY#a|37j z{YFIcBl#;&p>3d?{dTJ6l6&WZ>5_eO@T(IGGp*SB$4Ntzjr_4&;1=3kjde1wv(0U5 z>m@)dV{*2#8s@(p+iLGGe24ve%tS@ZEr1RKWAd&bk5ZCSv*x;iUXpIEP9Z9$`WlVr z>L8M$y75Gqpm^FXUb+bm+JrwedNyAhR10hq&(4d|JB-!RX;q4AA2$PPe*FqS2?rg< zllOj)A+l9~Of!q(-gT0XTDgArbc!thm7y~F1AcAkEx+@{Ezk3b|@W@;|^ zsF=9OoT|_w-qNf6ML07Kw>X6|ZR23RN+K1bboGEyjGK6!`WV+!n2z&s9Etih*Z#jV>m{+IiC?Ug3xSJdgm+(7)-!T6v;bk$B)9O1vACN?AwNhl-Sq3K8;ds!l!)5-v_u5j z#~;^|N5BoBl+>!KLQTMQ$@f${@tXrx2er$SEnqadw_yf*m{7}0)AZeK(-)eylvYSR$f#k@ktl9VrslXzHY1He z;F{UOky^EjHS}Z~_;AKY2q3y~>JSS`$)XS;1dEBgzmGm@MJzsgCt*CWHPmpF1mRfO zh<4f*I?5IHUPsauK}ITs-(4s+*Uyz0o8yA(hoEV1H%}~#e5C=GbfqxmJGgB91#1ok zHQ5BMy`4vYU!OwYCCSCoAhvP2TK*gFHe@93w7;k>MEpwAf>#U9t%xO0vA?qH`+t*b zRJoLgiu39t^ECUYTj(kh)*tKnny4P|jD73lgM0Hd zmtGqZ9S#x_G4wTQEmQr9$1}9inYq-_qu-^+OHIjA&ybM3)L&q&ycw^+5~4H|53g64 zevX7RnzV_N02{o%NsJ714ykKj|A?ov5H z=V~15@u2eAZXX&Jk^8`h5yt6oAHJBYV}8UPa@=d>qOwyKd=V$^b{WJ{sHmtCS1c@3 zY3Jv2vfLhYI&9-bWRdjQeo?sCb2w=(M(w1vq+q>lL*G+?B^g!Q z0l6TWh!yzUs8Ey2A|R41%xRY!p~UB$BNf%)C}TE$i2pjkEtV~Dh|qq{EazY@<508i z2r+yTKX9WZ0n!nHPARzsGI7$HQ#eiUq2IaxI4fT$5|} z>F4Tn@Qf-IfX##E&79uMM|qz>`eK&Sg8OI2CYw8r>7HY)%MaiEP%p;*JTxacCV%@z z-r|sy?mkoD7Z~=NqFB4yHyQ;A>ESHN@pT}5XU!cTh9?#gxYW;LRq%k-L+?O_??-a@>4Z*g%n% zk3}N?LsWDUd7!(yOF9ZfeY|3XjO5+gMAa-k@F?HXw5cPhI9SQz)Db{GMd@79IL-R_ z_5uCTy^f;5UNa|n8;@&GkW!4AcK?APXE~)L`-Fm0jEWX)(a;pTq+!fzGcbD8*BJXD zF*_T$d^~3h;PSUpoCd2`Pp5i_S453`zbyXzNzxped($6aGoD84UN=YB_a1vGm*7ec z$_UjhKHDit1b~rDrC}W9uPp5~K96eM8GgyM-Vd>6wI5 zNt2Oh5Jley8^sf`c8+hKhjLOyoGly{Oen=D%&$-yH=U*zP6FWqMYr2)u3=siap#WV z3p_SmEd-EJh;ZzcM%vk9v@S$u3F3;5Px1#VgpcMd?fWJ|-UkRMvn0DS3M=?F{6TcJ$#WIx$=ulkr|M1r#qtkRw?y$uG>~LiC zgPCeo>3cF}8s?0`VKB8yr^-I!9yWp`-&rHYz)L&2(tKq*$%(L=zJY-;=a8+vLP*~J z8ZC4`hWsP27H#WBRuVO7@N10SJ+P}%- zaodB7H6tSfZ42h2s=h@{W;lGJeu;#1zsa!+J?j3N#g9T-&#F~jV}{N;MbM~^UMj%a zMAzwT*lIgnn7ajY!@g;t9jx^#k%?zG#VtuODcgvT)o8Q}d3H~7=GH7V)H^9Z0A~9p z;CQ7n^``Dhsj)e4e#jHPeUaqRIevoz>J+CQNhoGoM)vvelbF7`a zxa>E-4>u9LNoD1gQb#hnAIqI8tA7RC=iCWL^Ym*qk6_ln>KYs98-hZYAF^5VluRlm ztv_`-b@!4t=&dCNo4=p^bjiZUCeq4yC;7QMG};Tv@X0GBu_G256VPn4<}J+H;0)0z zo_tttJ3X22Fb?N{097+WL0KI(FQX0XvTnikrIY;oAAwqWmCB)cWgtLF=Bya2Sb|Z| zd9_VK){y<7-4qrj0aIeu6=b|QjO|5qH;dgpjV!THq3g4}0qB|uCs~8jelZ{|w&!rH z3!pXf3gN@d_S)XMIptT74aLXi%%Gf1U|pF0>fINruQ#@v14|=J(nVq@WFPW9Wb2=0TDDBp zbZb&dx-xIm>dAQDqu$tcRVxxrmqt;D^;8L%CF;gAO=sRXIG)BrA=-E0%7h3hD4}6F zgsNMcR4H^96CiY@`n)PN_>n>9vgPu59CMmxkwE-Wq*hd@;z6rnvI{mg({-j^Y$+|^ z^8GBU8YX%xht^x?=|SEPuu__OR_%VbkJ7AC?a_WXUzq+(GpIg%hT}MT{;nV!QJqSo zdnQ4DG2}ZdHCLs|w(O-%!b?>+9|XoyV{+XF3D}Pm^Ogg2wLKTv>9CNHR@7c#Nuoct z0%IBJmB#YK3g^^w4xiW3yV#fcGQW~kBc`EJw}{l*Ydd^h2+caPTe*V0oe10h?lT>w~h7AfoJ3h>P*{ZJ`H%MHQ(vV2Y=JMg0$Rvx%YJD*b^FoU_I7&v0JWK%--WLl5gsA^ z(b-W%_{^sW?Y~;27YG3({kQf%@B7d9|90PhXxQsq&?36r*zAw3P)cjkB7i?P4i1W? zZ4oeiff(*1kT|1IDt72b*;sc_aVo&cNr$uRZ@(a@=~=E8qoF8;DH@`e*=D$Ud}05T z7mZ~H4UV9jS8(HP$8F#M=k57lCDc1tp< z?q}J3Cf39z&C+V6e6fZTeB%_Ix#f}9MwB;zkHe^FTy0DN3*MYf`=Llyj~Q zv&SEsT}N3dZJV+$T2ejcEk#`?N|jbcoE>5jJVB_IG9BPP*B9;R_kxXj0|>AYs7rhO zKu~dUL_KTOB1{!6b9#saTx1smKZFs#rv{+KX5yt;#lUIq&L*C>uD}WpAS1~eGuGg{ zf$=PC00DyTm&CG}g^DQHi;VSJtj>bpR&6~$I`j+&dW5tKeQn1UWO@u?il>Nexyvn# z;v`=D77)-^ZJ1m*U0Oi&OZ9>3D(wS7X9p4d1kT(l7cPkh{5PQ=QZTmqQ!At^G;l8O z_gP=On7(WNR=Z3sUD^@_g+y`b@)W|$Qf8ELYYvq;^K9rPW>e&i1v8Qd5Ba7w(pZWj zf^|J}rz@HY05rCHI8&|e(!na+>&V98r1_y4&9Ux_A5^T12-2e*b}2TO1*wExw|0>~=U)jiJBl z9@y*~5YW3BcV1RpU4M*OPGG~i9JH*!#4oz%dn^g245@#IkQc&l5pwXr+FsfPi&e_Z)+Zuvg}o<`!R{Sbe^%N?$wzp2R|@|`BB|-eI#RZKYX>&{NqV_ZN)B(@WHSH=Cw(ch>^-6H3Ox;VRer$9;2okI0?zwRLJW zN)po=q-Q5e=q=~SC8CHszu_iqI$P1xRij~up-_2fkU_ax%NDzOxOETejx7wq*)paP4b;5~x!CMJL% zl<0Qm+&+a(o$}FLM15Tj7S=aYijp&ZigUBqc9GY<+dX;`;LP=8Ry2aBz~goG+U_b_ zTlx2S#~X6GI&MGFL7%9oLbkn~PFWv)$ksJ@VOOlUi~y(cWO31^d4 ztf!w7_`R5Q>UEUkj;S|3@dJ7aDDYX{BDr%vQ*0C5c5|6iW!2V8D=)SaAAbXb^yWs( z331=+0kd&jtohN^D2na)^eK9)gHn&vPdNO*Jc_>YX27A1xwdQL{XBiL?&fqCYVS3*fKEeh-F8pf2 zLh{_lEBfZ6KVpX;)Z%OejDoE`Z{PFSTT4cn1G8lP-(pFAsh3SkTo@d??)+7S<1r=T336xZ{Nga0>>3v8dFVV3UHkNYFDKYl zU<%0EH-b?@#r<3FYl736f*l3<^aV5hVeAX#W46M=! zi6*B}%aCtz>~$jgob`cqz22{d^mJ+4DegwTUg|-qWUc>6m3*>T5)BM+cr4QjIg0_q zIMK#scT-Gy)wiUVT!)~WbfFwKUM)mFq!;10EQH3pO9)eMTXLspR%f7UwHf;KPtV)W zDo>yPFI?I`t~4pSKEt+`ks)*XY1~O>;KFW8&No{ZX6}ExRc6NmM3nMCFn@B3(?!V%_qy0ozO|xAXDzUOg1axC*Y2|L?Pny-vPl_$i#+rq3V5^ z$Uy5-Q7Tb|a?EiIbe+e@HM%SN_e(D)qEXdOY7ijsNFjw1agleMf~JjIxlV&&OHJue zKH#Re?xWKoR5ko-vi(Fzwd0Wq`0A7wGkH`Nu)rs*dKY=P7g9T{G&k%aAm}cYMY?<^ zf1fSXvRty=S|0^@GKt)AKA)+J)v$H$BZJRU0vUnY3EYN=>%P*D?-+77>FjRuwUhv6URu8Y6KJCIgWBqQ)X+$gq!OCN zoRX=rUCqm>AsbGPoS!qS=6=Z_F{AM_F)26SO_dQJ_%>l z#J9ypj880=wamesnyg%EPvTxR7DU}M1vyX$Tt?4tj@e?=a!67#B-g4lFSF<_qE$~Y zjzj=F41T6Hx|S$%Zhw#3YHgI#ZGi=%rYGj_lL=@elYcJf1cl^tac4!l7Nz+lJuk$tNY8r6KWy{ut1!_FmVVpE#B$EBYn$D{`Cao_ z{zg4#kE<}ckZxgW;QifSi=F_PO_L80?&Sgmx1esi-+u}Lo*o)l^gPh(cd^d%ZfW#> zB3vW%l;FcRb2~UcVgOWu?1@rbCM)$A6bdW)TDp8JI&7WgN87n}W31Mg071B{sA@p?`h|9fEEiS&T z`;8Ro(#%xQ$!bEgp^yXUqb9B2*dHIm_e9Ol)*5~eFt-&JO$s|5;b_B|Yry$)AS{53 z%pc#5`>NIW#pRNV2ih9@KRr0L_6l0EHH%^yVh5 z=iQFeC=-D@MUY#|X^epnICw=R@OcY3Gpzf4i9N~s;ff)HCG(BHe5WSyeC+~I=C z`}V65z_!j9FIb9f7G8XNn~I~s?GWbMK|;vd0-;*u{t@NaodZ@;R4b9!)nSs{BwYuZ+vUXZCz{+hhTK^<&dw;OPunJwOi8=4`Jx{RG?xJu@5Ig z`j&@LMmSq>=50H24M(di6?d9EnnPv}_x0$n3m^Z0|Fc$~`3%9_a0lAHzF_(9`IQR` z%0!_yWSJ5|^=bp#wqq5p$<+>qxxweDXQUKM6x7D_JhYlrl?vov+U{)HHNE__U0COpUmm#8Nt8I>i>Nv@}C*dKi~f` z%A+ZRm|zhb{kQ+*KAt}73>?D8 z*}0sh^a~u*OGeQ$ePwAZ-41nz5>&l-Y`Fv{%O`;LtbEs{872AKn8nuCDf(YA zDa@K`ZuHT|Q?e+3d*m1M+;%K*jqZVT+{G7OgjJvMLW~|YsR@d5HTH)HFMMR|e9#{+ z4)%ofhR(c~KN?ui&L@ltN1E%)&Y(KBM6ML(lH{{9y?DKd8QJ?`%j@VduW4`0JP~sQBnH5~;1i*EzQ9`H)f3D`!OeE4gIj^is)X zCMu0?^)xP*77@1KZ7V@?R&h+Sm}J}og>x+LK*^Bq6ndLBNHxgynQlN-8~Z%$l>f?} z&}(C-WDVQxo8Sl1$0j5|1%TvbR4e^F;p2_L=$kw&ruJ-qQNVrZhF}$#no=9=IL+I8}IS49;y_T&K_-)>7=fL zLN}!bcM?(9U-vXr~%NeCt9NVwdS9-myrq^?ccE2d4&2A1l8|A@*4r)$g5OW9YA4O57MRQO6VNP zgE?Ki@Wp?#$XT3GlDyq`6B(sc7Vpy!oKj0A3B+Ip`9y9NaR=WS#IJoIR64V42_t$G z^>fYCT6y#0$KG*8DU7X|ls$lr0LG|6omsSBLi~cTK?upmsMw+3mthYVyv?cN+JGCTrJh=-5Z3}f;PDxvCC%yS}t(-Kf1 zFy?eYpvV3D-zExO^&K++QT*yJu2KHWc)emvq_EsT@bPGBlSz&cQjt_xr+-v(7K4AG z$#_DB-s#Ez-Rjw{IRAsSgFpV>Y5YsGLYOhr2crm=KYAQAH#Pd_EqtgRPyf(STYSK2 zj&q%Jr#|tR&^_+dH>W(!bEi?mE%Vyrf-<{w|M*KR?SByOf8*-^2L1o}{eOub|6#WN zo6X{?Ou@ekUhe*Ef%?+E$2a1w>LAX2)YWxxG5brapkI?|UVi>JDfZt5{9oy?|2+uF z5%2CURf7*zTtpkc!^MBLde8EwYw@LU1Oo9fh|57mrmgwhiMmEstCmfbW}Fe{lC#E) zd0HHkC~iZmgjhh;hOy(B$&Tu-rQFS@F)ZN4FY8=Q%@9ZDN8)+f3ciXl%bhF-`afzp zupf{w7YYY}sj_ILor+t9-4(C;X zI?Z>?XDbNt!#K<)Tmy`lHI(F(bJT2)~o4;^Szr)DQ;R(ZcK;E1Ia3yAsli^8t3HFoYEh4Fu_l*ddoey4PFPdeS0p$5n*NUsE zQtDx3)W2hMWMyybWfm6p?#oY|cWhNTG)2AY?@6IL3z}EsM+cYAl>Bu&sT$f{2Z|JT z!)7auyByLw0_w4jpRolfwLlfk6)mkPWZ25s<_AM1VYf75zv}|n4+i8lVmtk5-vc$i zjS9Z=8sD20T$?^7f=z)z)42MLie5UStzqhp@0m_f6$o-|uL$>PmJlWlKDba6m=8K; zn8~y}nRz@swUzrI>ER46`?z9Kj}xs{?%A@EhYRW`9*8HZ@_7u#=G+gTVZ3xYErR~e zLEm=bWxpz_87lp=X#v2tF8d)pS<$(7S0uBA7*Kd*T5LL zR<&!s=tEV;Wf+;c)(Ds6lwx}J6uq{MdE zOg|1G)_x|5|D7L{itOwhQsylAKpvOB`n%nE=Tz0g@@(#anGR@s*IBNlCYJ+^=F+WTFe750rQHriQ(ZbB{Vs z6khMX8r|m>ZtXvvN@4|>eOY*w*?P3BQ9%Y210XXZie8!GC-?rs4-W3yA>PpghunqO z6QsoA@88>XU~phn_pRI%J+sbJ61u<|-L0^f&Sgexl8$F(r*mlD_d z#E>~7?&sp(cTiQeX((5RmA&ZIKqdttn~!k_Ep)$7JW(^X%sJ@L39#M6$S2!BMofg& zUNvQETRucZm44b#kIs2xHZ~a|8v8^up?-g!VfYYqm1=S|^lLXYMO7K)P<9bhk?dc( z7e2Fj=|r>I+NTOlv-2(T*(`CFW0kHi1|Jhjq7hT`g;mkSLTvm4%ZKk$C=v-PX7kRp zmD4@^L@EjNQm5pdly$$$6-i}xUK9}M1Cpcw125B^_@ z-LfSNdsi*&fZ5yVI<__@S@64oXc!y%k#JN@rCaT zFV96`?ix1NH2PRWzpmk4dadmxYNeH5o;#^W;Pl=05nlcNQ6bd7_(4k^c=n4UY?L<& zi;|$^%j8bi*{}q#H0MR-bCj9?dp31pcDXYgjbO z4+1>yk1iqX9O{K*m()>{H!r+{ABEuHZ>lA*>rMR7x3VKQ z{uo`YaOQX_FyHvDk}3RRwbwr&0Q$EF-EyhkTnQ-C%z0m7R?Xo&(Pyk7?9pAhE+}$4 ztQL^3HkTlB`ETC2HoR>rwVkrXWpFkE{(ywO{x6%3TNCLFE_q{PVHS-vx2+kQ2=hTCy>|EO-f@G~&PWm9H`T(xzM zUTYmhTejEee-0CSHsp-9nfI?x9H^fQ@3A!$R{8V|9}SFEl-V>EsLq9(LH`Pdn~qu2(&)h`cW+4O>=_iZru3<8lie9h7(2>^}d<(>uGc_!DR+-9oLy zA&80XfYN@oLFD~t=*Qx~uhh@HZF+HV^q!;z632DBD4mh5;uRI8lozofAuSz0d~D-x zK4hc-Zmf}Rjjd?Sr#<1?9Y|7A$)DzUP@}ZEJVQ7Cix*{!%)(A>?w(nFCbRc6YsjTQ zGsNc6BfF%b)2(ZaTHk|508mSNeMVNJx}`6n8BvzhW>^ zNrYAEd-Xv;QLBTG285gEqxebz4J~i0XfUdzL-Wee(3s7Xb$;95IcCAi*#cO26nybb zu>bc*>**=sMk_049Lt5fzQ9PF?Nrk&ZWFM^Uz?BmFlKK&8Vw*qrQ$w5&& z?Gf)G=95>S=f)!qdz)<5|wr992L>=ImjT3^%XRB zs`hc3#lT8F!r6OilOBCt&Q#R%zud3bKD?CQDZ1X&vbz$OYWc+I8s#?SMk|;7A^#%= z$Jp9=xE9}O&Fr^tTZpH?gz!#YP+rh|s~oF5D-8vdT`ZGn7u|1boMfDgQ3 zrZPHLaF7m*th8JH+_Sv|I?Vx2KYb$a7Bh^fbK~|-FFe*-u^Pazg--Xyo_)l@vsXG) z*HkG^L-|4$RkI7U z34`P}yF*&+@1?Lgx~;T<%5RY0qRpV;N6td22i0fF^$k~l3eOG;HcifZtEfeI@Q9i1 zw-6%`nmLig;z02+Y4RpNMT5)MItCT(iROV>+qY=lVuU+HvUP;RAwOXb10$Uaf;0f( z62fZXDrgssCaZH0pv$)2h%OY70DKJrP zY}rCU<|y+t4f)(dckb3UG*U6uLSH~beNi9wNNLBGmpl!E>}HllhYPK23Foo1HJP-D zNx7%mEYv7`3v-ONXy+&VeOEm^7zW}clWczoaF%rA^^O@Hh5H!2Av+afVW^U(lONxtZ^7WB%*o zUL75Fa^ulB#v5_g;K*HI7#9jf$Y$;yb1OR8hrXOT8wY&^ng2|>BKW0OCmQEu_?_|% zyhh|-Jn(DVIQU5P`Q8$1XlICvd0(y<4U*YTgxH`3b7@=mG|lyz1@oUn_ zOw)g1)mf{cZyiD;C_ejhBHiM99lUjr(jPMGB<{}c?diOLz>($*h*Xe}Y;M9Y+mh1(q5UrK57Ev853o}xW>iZtLiF48q5ZoP=o z#hAQceDArUYJ87Zi+xX4 z-L#0eTBg$Qi+o)VR0+jUrt~!_Jb3(}`kP-Qr^w%*9W?K1N=_|5Tpo0hND9OBM7Ol! zJS~0wOm7jd2f*&ehFK4Kma#(2J9w!$7MH}b>h~Rw=N|c|0wbkQk7e`IPT)gIstu74 zhIU3F*X#zF6G88~g=X0waFNKWY7xo>K@1hQC0}SeM&~;QkH(rlYplS-&wo(0-|1YU zrCTbL%>q{>kgeU6*uVs^os{Cax9haK+`DjpTjqIgbg@X@pV$=)GphN3J>Mr=NmHc| zH&nkL@Lief@LKwK2*AsXbp0+i-wO?Dv87{Onw6jvd3(>DfkecbWo+^>U-y%PgA4 z(iD&m{LO>FNYP>B%OhTM7QB4%BFbV})#tS5Q(^iS{cJf6O2Ba>Pze`u)m81Ru91!D zRCm<|tAO}x!n=ePxCDB{s%x%{mDWp|xx+!Xvk9!kPbT`$=Omu3a<8Q~E{F4+r-~f}SLgHPrmkhR%Xu+W-=H1W#F!d{TprmU%X@uZ zORdQ>?5*0KFOl;Aej-OExk{iYXg^>6m&bNoB+oLd1h8y7ZW~u`YLwAgejw|qVJM4( zTfuSd`@CvZ(JT`Fw63I48=OW21ESBzB}NJK_7+W|Xs5f0cPkF&%b%B(WM^MKTvn*I)$e8V; z(^q)GNPMEw6ofL0D5T`hp8UPlvqx_k0e&q~cv#Rv7qf+2D2BnYbJE@^s+Uexg09*% za(=uFirgtCfks_(xhTN^FqmOcW;eKWD?B_io#H>9)O4pd$53TI3W}Y`F4`?OT0OX@ zE$Kw1G01WrsTGh1aeJ_Px9W^8`z$z*4v$ZiLBI|9OyaoKx6Yl;!80@;lk586IXjIePoXITAS56kGgz$dFPW4!c`R-4m@@De;#fY zb&!5VZ+?cZ$Vz^6RgU1fx=aS|%szlvFQ4)TXX){`s-oo8oJKd*=d&H(}`|dUq zm8{itdPT!coE^r$X!{D)V;ESsKsNCtrwWgaTdw@9?@mqCHJWRb(p`C=k5xe}&wW_@ zPjf`g%Q}4`YV42a3xEb=iUlc$L~^g~SsVz1p*!feOHC^!P|e}X#cnO_>n;xON5!nu zQ+vD6el*0%Y9FB%0|ljU0r4LAw}fY&viJ)QEtcrVuG<65<-T&^e4O=m1TfPsTB;gq{6WW&lbM$mcP`i-S{*`blHc&_D}D3JtDv6MljZn%yeiLG3OfCDTy`@V zb9Z7YnkxR@x?)JWYNjO{ z8QMo%GJAi%u$;w$R}hFvI5hlMTG{=8Y^_`;{h4acQ4#bqyPWw8yv8S_eK&RBw|fDa z?sk&O{*o#UhmF;GIbqqV>=u){>vPvGp)X{j?dnqxca5f${I<1`g7Xwm|Gu2?{#%m- zt&T#qD&GwEE(aUX<Vy}J6*y>DYq zq4L&aRV^@n9nbSm9G{g);qN+9AOyCy%mb4(+R~hBoPvWB5823Q>OMnjpV`eLs*GC| zGulP7@HMy)@FO>8FVhTBm^Il>dw+$2?g*hC0g)!{a}YA}1xp(Q!9S84-Cy&9qgH$^ z#MYXh76JkAuYB7=@Ikr*{rtzfIs@KY0j4CcSjDo_OY}M~!!L9k0ZZBYy0l-&u8gZw?-F;}$vkr{W;eN8xU}ARz&IS&?DW9kH{;S*wgsC6F5tL>OuYK4J zIaRFwHgH+5LX>2DMw1gDi^{XZz*UPC?x#W~{uU=&3(ZAecd)aBpTLP4m`0C;^cQ^W zn#dt5HmdIK?g2v}3Y{ud&Qq<&WCZ*;Tc(?t6q(ry0szi6^u*brX=Qa+K>D z`Op5!divc$#?mpT7WGwCxxx;H4d|M3$DZe1eqN_hQbO#t(O;Q|QqVPcm!Yk*IchN0 zYqC$h*K2n2m8XSdOy#?sJKk$Ir}5e9jy>&+C{}7J#Wl%|^7kibP;Pn=oOB@w?@+_# zFhM3Kzf5~b2$g%@>8b4nao_CgA^|igUtI8ssTF0bjXSkGiF^oA`p$xF$HT*j6oXp5 z+Tv{pdY4Ufy@g^)KMI#}hwl^zW>NvRcs5rnWV~ zgGQB)B(0|3QgvF4HS>;TB@znmzz-4a7e%T^*ZLa>Y=lf15~V(R>vPKFrFI@h7pwnxh^R`oH4TKIW8q)cUWQPZ>GC!-Ju#%X% zN^pQ4?;g5vn}2t6=FF4D+1@{1>`0oY_6?s2^&@d!ZLNTne%)s18g%CbeH8RK-Zs%qzD&EUe3&6POg{N5i5AXa=5GSbt$dXr_KP{ z>_2M(ZdOm{i|<*@H8N1(bZLi&PQAUuE?8)k71mpYAl&s=pZdMGSle^}FMEp52pTS< zr}bLN|Gee(=rd1Gt#p-zRB%d_{F_R&9ts1arf0*Qo9zbY1$)0@Hq3ejx`o%$pT<$~UX8>xdke~Sk=Y>Ne0rX(7t zOtEMjBTcbr6eC)AfPz&}i5&$o{N~w!*FLhi2KfE(GUKlWo1=(wdtCF@;dT9NqfvhFv|P> z-3JT6uwAUzyw`1eDpUeiQxfgF=4r|_PU8P`-WPn?i$E)5Ww+U1oiJsR`1RWvX0ue9 zTq9m-$so#bvi40TCr8_F#Vwm9`NFmN#QHyu!t22PLHnm&T{d3E<0gKw*6-)Z>Ow5E zawf2U$jTyEB+vhpA-OBlfWmgBY9F+`)3Zxhnw7~1d&vD&3Uf#D0O4o067-A<5{9=X z5FZXfjPa{SywLQSEbKa7;a-1Cbp6M-IzS+v-G(4<*P)^IYq+;3r;t%PTN;?JD zQp4YmGVqQU9JK|z?(sj5AOyWl+ey4G?(nvyvjip3fO4cZNN}{hb?{fNzt-}>-~3>p zzhJwM&=BuFP9k!*j@D@c30H(XM-m;S&s~qpeoXcsO;# zZ4>pTKNJ2(o(MYLZv)fV&k7skgbti7Lhmwg6ihkFNH^^7TS$RyAP2X|de$?VY~H;| z$GBNsR<~9CVr@)L#-cz=S!c&s>0m&%j(w{((izVDbj_pYYA?+u1OS{WASSlmn@G~d zad+E-Ltpe`g#(Tv;5dDB`iHY=tBMB(UC%}?W3a7BV%(eLtQM0x6}qA1x?Xy~zROpz z0rsI^G(u%75Y4CMhHee3evO_{$w5Q3?lc}u-_AS0ne+?DkPev92I6PRrB&U8l^;)ko4kT~yPdd}+BzM5x& z|4qjHR$Cim6U@HYLJKE5C93Jef6^07<{YD4Q%h@e+DR26{TnWPgk^|68mXPZI5Ck{ z8GDJoXzKF$c*WgI6PkJYJg;64K0o2AAsj$l3?=zxEun_g3wgs9gTh-tujxA-2jNhJ zOTjsL@IfUsE83~$(?C*OPqMT9hRlX#MxBs9l0ZT+Lih$PW}~Wh5gf+Zu(D3ha&1J&JM14xx?Ki3i&l^b{5B@G&-Q&;Z3*6o(V^sEkL8_yAeN$dD zq<5_Ng`-KqIzCS$zYwzrpZ*xK=}hHYWX$>8WIxpGO-P<;@SELCQup-HRfQ-HA#?4_ zaC2ed_oys@y<*VQ(BDTdT*i_85F>^Q%b@s*KqAB9yMnug{M;0-*4_W7CVUB=lgMc6 zg7B?BIkKxj%$@oZTy8QU!e_`TA?p zHHL9wYd0G|IfQtpbfR8$&7Ha+tti5#=lqR++^6y@uN?40(^aWxvZ~s--LW( zWMp)Fe**OoMGHl-!)i4 z>EHk5BlMc7r{JZKF-tB`%)KY2(QK6N=8!bdH_+ENFqHa@2-N;Hqc?xL32z3%gYm)L zfF35)5HtMCA5)AY)OcN$40R$|yg=swwS~`7L6R21XB!qgC_SGre&&?Y)GRERutxS7 zq*{A;c=Xp>KOff7SxWInsB$fPH5i;Q&)+jG4OH=54@=U#v;dL7zym&NGU5_zfFew2 zB5KmQr0wy*(}`%m%TEd;97bCE?a^CrmpDAhO~_p&&}*Ka_x8uObU1kx6~|4DsBi&q z0~7_zwSuNcp~mbFxrU6dEW=G}MpU`DtVI0Fm(ETd{E=ST^CpCgn@j@ZE9s9Y#yAlY ziBn!gCs-7Gj|i^g4YHM9M8lY_uCDI5TznNrzHZxAjhngh+l-n=*#%QwW-_aKazh2V zm+p({B9TFZqhPkWW7_|W_C6c|hX;v*!KjD- zmzTImB#Z2sEpTWkDD01vbkVH3)kK&O^xyYTBZ>FeEdJ z3L>|9(SaAKQ%T{uUUSmeD0xx2*{=&rt`%*36&9D3y{C*avE}Q220eQtIl=Rb#VPaZ zj5k-y%asoLVSN7fP;gGo{lO&R&z@Q(6}{5-&G#NdGC$$(AK`h32)4I!@G>2$!czs% zS-ovc?)XOjwor?aqNAcC@gUKpWf+mF?b5D;!pC;A%Vc-Pzm1vBM$MZ?i96T`j(60n zp(VXjcNi-mS3rng-@HJ|f9KF!02OucD%@a>>ms3uM2_ThLb6xfbynOO-orE<-y6BW zt=W7aAE9T=896L`N2%kaWoE`Qe-n!2Oo@w?z&x-sx>)_%ZUZ$@iQaDTHKu{T@|dgr zWMrbkyLi3Fy)rK2Mnxopu+b`ehn}^Oge_Lo=t(!APla@Jh=Anjm6NM$yabsT0s#_{ z6Ve3L+_IO~EQZNgW>B0A7WoeB+bruGOc-F?R7;Wo8KOnzLk(jqdKVo~?G-4cDcd?r}GuDZ4>*7U%Wp@<&dol*{ZSaDW%TTUa$ zHus1ivkSF{2P_@+$NV87v)#T~$;5{I;I~pNoV^V@ZnW%jBFc{Z;DNmLFq(bHt`aFM zTGf0y;yXiBg2#JJH8rk6ZtgZ6TNAJz6IX$sAx~iB_k~L{E!TUk%2w~nHvPbN({p#@ zsx?m+$_nosyn4yvDU=Onu&~&a2uj0{VU-C9$p5Do(Jcixc@YaJMaQOa=nKDSn*m>b zuy6#4UH;b)fB)QkA2@h4SkVvFG9KQ{32#wf)KOwRMI_01a%M(E6D$<>lg$0reP(9l zS9v*IU6eIgn8B`ZruwyK;3ww4KAK@t|Iy$9rPD8tj;y{nJ*SXk2x09}f}+eu9j?wF zFt~AYetw|9a(?K2`jB4e&!0hlqTL)dN55mcYpvrNMOpYe-Dpx$6zu->TZR2&nY@ej z5YR$W?p{<~v16MMY*3>=D#Mz1e}BD0;7ncq=bj zz+k>oTOB+gN0o5PkMW_oB>Hu4O{kbvw?KddnatCVokCRo6*8PgiF{Lh5MD=N4^za* zz5=PU0>!B)(M@$`hzu)YRXZtRL#q;DFZB{&HwqAM$fy8f%>hA8& z4bq2OL!Yj=J8n9f#-2JE@QR0r$IW6(Z1e1}0X;A!A+=sjB@wT5qx$>igD zr=j?yuu(M;4D51b7~ChwXIWWU<-`|paTrfer_VkMTW)kPPZ9s~53Fh+8^RU=H`P^d*ZX>O{72ku6_&w{=Lgx%-=7#dvlmUXy=RaoUdH?|2YhLq*LuzVbS zK&!T#X8_bhN)=ea{Vkcn7}!KBoVL{b;3JU@^RHe<3Cqfk=TIo#-rn|b;3I|f1b!uX z@OiGcHrPDBFVX7A=m>xx%;t{2S_Qn_cI=3#X(uOeH71}(;fz|I^cF31MQ*EY1Rmr# zA8iQCxF+p?ZHNhp|9*v{lu^tjH_5b-Z~2{lVZ?ZNA2?R%)esK-CTHg@YC5MaQTntAo*qv)RD+7-d0fH_U#+F-M^OW#&@?5M1l?Esp;gbu|8a1n?D}1f{$#+A!zoK zeYkZ_kSTM`33qJlZDpl*KSkWOb)SqS7Vz+R!otJV>rAA_+Tnm`qjYX37a@~6@Ke`* zQw}SxQTh*uTpn{S*M47@UsQ0ULmXOU84tk-*D>2G9na$i68$_~GK`I<`%}}NVAPTF z;uu--7YoZ!n-@`p_QLdt^^G72Kudl}m#?~QG1e3F1cHxEHoAkjbyIM)o!)CUT5Z@q zU)hRl?TvD-5ina_f@_Vx$#e+deiUE}vt#NxESyvAGDkLXSn^lT=*aPRXAPse_Mqww zLWh@OV@oLE9d!6}>ic}3#}F;@x$Sm0os^*yI;Xic%aI9z1aA@f(no*bU7K5 zH4+2@T_krtz!zn@@aR+}S60fb`rKQ)9Dg6>w||1gMfu3WsR~TPRX9T(SacUV3wnd?b6as*=t#56vOWq=1nUnBe(Cu``|_^?CF50m@0(y z^_QH=-sV2Y_xVX4b*t6;-bJNKhySSd)N79y3mf}Ip1moysJ3S+J(>YYw58pYl~Yd)IY!T%a)zbRu|OiK%ollI;tA+OtBrmLB`^=}q> zEe2e6M+@LeCGy0?#OXq&s?H}5B9DENkNEiFT171_9!d=akB;2i7}(gT*de7GEY57s zb_sG=cDWl$iigxxRK-1TQSp+>%Cp6Dyi3fT8^QQDgR(x|t*0Hd*&1J8NlQylyR2z5 z-~u9ZGk3-TDmdY1s8`V!*TR!DGpi5g2-aW6+bJJurXWDOxI3&OcFqJMzvTb1 z9~n3_a!ish$_hQW=x78|2Tvn{VrFvA4rd9rbnP9WlII1&G zyJ^!I8j_NqJ-TcgEs?bpl`phjz^ee_fWUS0_}SDqM%32jtuwnv==|QLW%UPl8&pU? zU)xJ31HLVKfuPhEElF#3X(=q1Dj_j(!-=Qv%8#sf;Zl0IJ*t;3>s~SR+J*dPFq21A zRMdegh)bxu|95~jULm)2H{6dx^WIH+G$O0KS_c)CEaA$J6o=^FO)0foUEV{EjDP^> zwL`1>tEtItg6Cpye6MxwkwMf)kY8Hb>3At9@%!!=J|ZS2GE8`&wE-csRGc-K%sQM5 zheCxXC57@7UY12tRuL0;x``0&q~qR3rBaKVOi#zY4_nLk5t`~q#uh9<9Z&KOA%_Zy z)pV@)*yY>8I|F~OddA<+KGZ-@Dd2t0c-7JhgSUIxe!~1cer&9=oUf6gNc^fVK|24{| zC{Z>8%&QL~pY6}#89*fE>Al@Jh*lAoDBC@=9(cjA?yEH%lOLLn)p$41y}TEnNPYii zy0UDLEKT=}u#T+*TCz7pTeaQg2Lqg2UY5PC$tGkZAi(wp2q|gHX0k#wDz!e176<;Bf(=7#VF<7U zxCAQ*-3&B4EVbJ(VzcM=r_8V?&^}LFG+m zm!tPeAEku}5x@!*KmC5XPdSsF3aS8zW|N*?bQbzOaxN725)IyQOfXx*l=8&?jZ%p4 zF8IX(1-?bIw~`gOC4)ktTOJXWl?-UxU7!^l8aN7jlw2}|tu8Sk%GplRFd?h}JUGek zbTfHTX3n`hcI&SM?-$2|tr<9RY|-|o{{@M{D6|+q|89meW__ya|JoM`gGxyw!?p}$ z`TJ@q`&>1XlM~f)q1p9yc2;X0nShB7<9~T^%@|z$_pico^}x;dgf0xH;7eY0Ha;pK zk3)dpA;R?$6;@S3!M{6tYcWF+7NCRTsZhjqTebmi#fB1@7OnS4=E`EK&|-Du=t9oqSO2Abtrg z*?H0e1$jUQBmUdgEI}D-^SntxPzU$v4dZQa)Ii>*n5eK&kUmVvG-QO&)ZP6y(0FBdcK?`aZTz1KLyyv{Wwv%$FwasRI%kW{$7hRV>YPe*^EQ;&wF;vOQOC+k zbJxEPl$4qk0~atA|3SF;2hCA3n(Hv?8_pzL3S!G8&ir@{gipZtlRo{^j2F5Cqo;pq zQ@z~6%R8+T<38p3+sr>|_KpR8fNV*wJ&?By_oAZE)hsOJR`+;xSx&%ILlou3N#^rA z{m}Dh(vyq650lk>&Q&OWw$NDbj zZB+b(aKrG;(um@#8_|26r{+5)4rkD=$hrjZRQ!b*slbO6vg)6rbf4WRVkI*Cv`3`z zbJ616{!sWu{^Z{LzLjLGuZ~k%8f6|xqc=gNG0lJ{j>lMrIc_p#2TTHwr0I#iB4O~kLuX;0pfrC_XZ*BD*lgRVx-FW95JuGEl z3RaC;#O|(1ZY;u+|C`;B)PO>B;W^~DZ`6{4hIeus8iHC{rpfFwj`R%`ft|>nTko?@ zZ3+e?zTZAMySh%VcpnMoB3k9*y|oUo;g#6}j^KIsEr$jv$$GkN@6(D)MouPKSS%W0 z4?Fj)s zV0dCLyOF)K{z!c8!}2<=ixF1V>*sxO!A(d}_U^2zZb5amT`#nEaNuxm;qPA`4KOC( z!}tZub!R7UcZHx8-1_{pBT47NjLZ%SrEYWS8*N3mt3(EBJ`#~Ryx`yXzPHHWMr-^_ z^0N6oW9LT;08*f82nq^j!@#4xLwKuJo6kV08~-*+5(WR&=o!LV275O0gYnylx4tLG zDFTxC@t@!_d(VQ|xh8}(#fj0BQ0Q9X5z>onk+Q3ZY=a;NwrgJy87!<|vL1flWz) zJS&3k4~gMy%D#GZtzh9-M=jXo$B@cc`F;5TPvrJWdKwNEF?(EGUtfP$^H=N~W^T4Q z(bL-+EBu~%_sjW^{bSbV+w%`pNPHLKh=gB5t-PL6`0hto+1S}p)o~ET-8O=7_m7UY zACMXTET5jaEnLlMW;Ab(kigtYtaBl1=_p8Mg7oBy0b*(7VRbE|l=MS3P8DUC5Thj8 zFFi2QFM)uz4l16H6ci-iTaL&G$@cp`g-K(;Alto?VauT6nzYL?>JEV=t6`Q4HH_~f zL&Sp^k6ku0U=cv9XI~4E|CGUq=i(TA4VKz}_X@P^fDC-Xu>$cxMb8tGx(h~+d$ju} z%nQpCv_YQ(Q{-&h&ibqM4Rc-+sm(Y88Q$Z|8D}GL-uvs*qJoAX=fkI9AbAEPPvry8 zcGp2DlqmhFIQa1vzMvp13|_wV)zio9qX-nTP}k8 znGpbwex67C7&@=(n`y>21nB1&sPoZU;OwU?ibmD1Uw)n^%^{h*t_oUOBg(4UenR(0Qnq>h>aBFR`yF@>9FIfXg)>I_chYr?o*vt zT`crI&r{!K=H@o-xBwyxLY>qRBWr-s-b&X_1)4QeS}3 z_x;Q*Ca6ZXO3Plil;;>htT+4$sK{yknIDzPJu4<>0THD@pI_+$nN>IuucRkilvrs$X_PeGBiHSI!lnU^ z4UL`R=Bzz!i6W;7zLR*I+t0ihi!|&3GKP@DKn%2y#U^`FfTiJh1&lktX{Iv{W9I{l zs+K)$_QN*iV!Nm7fr0(W@_S1?rz*ShF{Ii>S(KM6PRqxXW36-g0}nnj5UFMzsB;h z;@*8e1Q;u(LMRB}H*8PW)8@Dv932>}B-Y;+6d zb@Dzs-sAK2GmzYNi^AGiwCR+33z#U~O=3mL0WP{dbDt>4ZH6LHGKP%jBNByxQZ&|=^740m`RDmzL%hkn>98 zVE%mj(i?jjj%YGPjuRkpKtFaWK&x*)5k=QIAF7OT?`3>n_@N{Y1u{!Sf@z6QX73P& z_JZFT9Ec2X%{<5I3s18%bnI_tcv)j`y_G4#teQv84<;upId0BGBb2)HeHA?)J`Cxt zr@Qn2O>%hcm=_!UwPxTq%Bbk0G40=*i!YMWcuf~8ofw{5!f){00RQ!?KsXXU@r{#I zJKAmnw%zZYy&Q{@Li8l_vt&Ul(q*rh%Frly_LUMX{OV+wtDfWjV;4hpoL_PhON+9G zX@&2jO^X=H0PO}SgR-iQA>hMv#4~6VCme#Nj|b=wO2Mgr`1SxHNa&rD?qpbYaW1(_rgl9Nq+WXUjk4Qlj3_Brcf z14RcnsFD8XpRu5JrX#t0=$Gf&I{e$qEt4N zmEWv#=xyc(Oi}9n~`vame8`w7GOnZUg7wLR>rJy zgpTB|v2o4}|3ae2w(#EXmA6+6)J!BIDu4&90lA;r+jhF0ZDx1_BhZ^KCl3$|z`?lW4$N~WCz~z>3^oO>c z8cIrR1@~Nr{U~hGq&VUBPq%x~O*+6;m}nt}BgZzPHiH)yW~JSrlSN@L!Xvv(=H8BP zc~$>Tf-EkHh|5S8fBLh>{qfe)+_Al4dQZb~DS;022e{yn4GUr{Q6cFc2l8-GRQ)a& zB%}kTHLo%$kJP|O^NqHPF_`tWr{gua6@ivEf=7o zHy7E@BVci_8$keM0D%cVb%5u3*>SPWomE>qgwnr`?%SR1ci~^5qD)3;_n1G2{EKt;3Gg_vvluye`18tm+>xHI!>KSd2vT z0=;&Aap8W_yl2{w0{Y|l=uf)zZ1o@hyt zADmZEkSM{HhObYmeI9EDXo3p2r=y5(h$Bq+HdAIZJ@|9U0-lRSV3{BNL&ZoVM=-n7 zlU+|O^OW#;q1ZqicfVt5&&K*7W%l-*rfor8UHpqT~_`7NGI z84jz3ANqKF=YL2E_}uKY4oA~Dqovb1&LFbBX?t0oQ2-H?4#?SY-F|wOdFn-3x4PLE z?tVT*&LS z^7gy{Gd5S=RS!O!q2Zz06zjrg5CqsYb@NyvS$-$J_o1S+l*UPWpq5TUQ&T*nde4N8OV!NU3+{}4Qmkxm>%KEh9O!_A6 zJB7K0MQ&?ZxE_-P9S*5E-a=z!Vaa}4RNB+pvCGz(2Q>|i(aEwq=2Awfi3>C^d9*2A zsn4*PzfXe=Bhj^s8JM)2URm+h0!KC0SrG&vz_rJ6X$xdtKi`x7kG8HetjT2wBO-`W zRFGZ-6%^4J={16aq5+O{P{7c8uR_9+CL#os-i#ncI)o097K((bp$Vav97?D{=(%4w z_t$;ypFI0)zHBx#J3H^ZGn;)Dx%Gnm9KQN@xihPh!KX_a7E30V?wA^0?i7hqi*YUs z7!i6_NS^+wo98n4bYjGkHx$oC&ode&IqDn`(7@*=L`M@8q|H`gTi1cfaK@UGyQVk* z0>eX=Pu!?%IyBIEj)gBVW3Jbb-M$~i*20=*#xzEvD=9-(Im;k4pXlq&R;xUbeD?B& zmW;;1{a-CYL+p2gRahBW)bzaAuLQZYB`JGjxhmVSe35NSLMn72bRxOXBhgUV@WfrZ zyClZjK*;`Mr&&nd^+j>gk=G8~@kwyvZdW1y)}bUv-)1ln$Cp*eLCyWP)J@;NzH|-A zcCOoC!$7QURgYnPk|i!=hAYG86U!_eI3n*+2=gD?>08wXXZ{vZTby^mqUvUMfZBx3_dQaFo644R$sKnc`fTZSmRQNQGGb}83Rj#-n(t(@wN})5=vL}Y17V&sC@ck=d(`m{&-?Y9lexFNvlyGT!Chw()RP1SX9!M;Pi*=hS zx^)I}3>}OPbIs>-j_;M-mO5z8G7(%cNZ2}d?fHsOyX>n}Y1;~NF)Y1hfgK@wlqvOP zu##*%AN~D$^u|=4yG;fPWTw+1LC)v^`eFD*WKp7;cX0^H#V9JP85HCl;me~+H>SIN zO}uE^-Q_#V)%DwK9cMa$yoaz@8i;k!Nob?DSh6wJl00ZoPkBficZ&lI&AOq{8UdF* zfKzz4jT#E#i8Wpx#76rYPF!<|nzl3gzBs9XN+I#KZGd*PmwjufA|yw~G$MwnHq z_D*&UGwf13P+Kwb%vB~G=fSyBS~9;vUIh+CBAKkGFut6bWi2F`5vbAm?}sbf)YaC} zpv(nsqr=*WFirUAG9yqTuD7T&2cYb`y9GOFAAN2JzcnRdgojqKDJKLlob*_tIiOcy zbcmnR`nTb!Jyl-#Wy?{7z?{DEngyvqXASNI`aUx_`hxKqqD`CjDJ^rf%IB$HT?dW@ z4>B`@gq!EV)m6yL(%1AGs3!R}Jo+u?30b)@sj3hsGM^RX3}1F%3$*jHBv0)R2plPA z?2PDjrJZKg0XzijUeSsBM+p+1d!N_b4!e#wHcNu65lhWqv@O=qS~}2I+I!mCG>PgQ zM+yT%baG^}aS*3JF~SmR>N3-`#kpUx?A{7eXX}ubi9+;!bdH8sR(Ix`gHJT-miwXn zNk4t)UF~Bk>V%pLB&=2MQ-uLF*ByR$9iT7A97}(WjRjjH3A1K+DI3Fn8{pt(En#ix zvTWj>y>m>AeSGFgYOEf^_9k<*d|^*}HJF7|UkrW<=eXy@IdovhKWF!xy5~$I-=p?& z(FC>6hI7RoyJXL{h%xB z>7ha&!lG)sp0B=prpK>_gcxUKV{lo`3NO2bR>pnXw56^u(A0 zOXo$g>uhTupSi(EKSwwE^q2oo#Ah#2e(qs@?`KJf%16scN&*o%LT28!|FaVQ;7hc1 z@;Im{KY4&yBJLY~u%9%tV4H*8dss6e84$0cnYMxEDk*xRusmo-4iJYqRL(g1n})R6w8lrjS5nnAG&bM!%6{siQ}9{k`m=q) zus)Z*DA?*~m{4BQ=%v?kgO~HD=9Q^`k4d6h)nt*^fby^9tL>fQAFy#ZZEA8*Q+c)` z){3d#J2^#W;7wNy!&-7s4{`TU(xoY1M6_=XgHfb?OQRa`-gi@U+YLoC6?p+jnd#f~ z6*Vt-Sfnmi{&vMnx;MP)NjH95U?a*i-v*rn@Fk08K&qX+eHX!Z*w|KA-?TUL(L0ZW zYsF1A8w75_Rc^xVJz)2-G)Vc7XXeEF09p*VhVG$+z|Bu7At9~$2}QC>S05rMf~I=$ zviqa?`7jFO zg)bM6w2Q@YgZEb_1+5SJE+xUmq#&IQ4XTwsZFL*zS7@pmd2d{il9+0xbW%tynT18r z^}}vgFXr1H^ldpdv7Kb*CA}uhJyb)Jvg?l;3S@tcHt_Rc`+k#hc}x&y(=8gyDlo2K zr_&f9=(vbXBU-t*`emmyG1RwmW5Nxi2($BXz z;zzSL1>&C#UI@4sh#KTBOVKUfivK~>zBlt318}TLuqTQ`1oh|Rl+E~n5pF!lt91;7gSr|FA zon#YUkN$|FPguvRuU3@Xl_W`U@kjk;>kq?|p`-`e^nK)522EKJx~ zZ7uMEPL&IOTXkZ^pl;(82-WoC(L&J!xnycxWE{XR$Mz$3D==HQJFh&JazqI--w>$J z2`QLP;qhb14hvxg3+=Y@lmfJ|-b!~qS~e9>Q)Hx-)}@aMh-2(hO@Cz8v`+&NtjrUM z-74(V>Mf_dd&aH7VHb1W7y}#Xi=pA+XF>p0r9*zz)jKziey?s>`>I@}n_l{NM7vIR zc5f|p`=Mr^)QhvSfIPZEOs%poYZIWp% zjl4D+q6AaD95?P#kclR=NBhE?*?2k5Zs5)NU;AgEP|6d*Q+Y3%vLePktSZG$fyEry zdWfFW{74RmQ}+cMf-8cxgBB(5Sr4yT&s(SQ(!Q!Mh+?4FpJ9beJXks$9upv9m1fd! z7b>`vWIBZ3!NUT?2nbzf^ZLr*#7FJ`ltM2Q)3lVeRP)2xlo>iYI9aYRabvdr;Z|&f zf#EY)DSwDx;QANuBv2O-f;ymUiS61>QwWDE+EeaQfzHxvoP#V5hpPqXGa#A5=gncM z*-g^;SRW$YeuBL{XC%=|?r(CNzf=_m^Ur|T$|FIg+uOYXzHgb$Ypom{N)Hr1O!*NH z#XqMlV={D5t3d2BoS?&K0MiE}Nl6a3M!P>Xgqq5_pc!1vYA1+IogMD+Kq5d43)godhQS&&9N& zrd%-z#WkyO00l(``Ne?D9>k6OdW0`21TFZ!lt(|nlDFg`{jN(^0LU)jzGuSHE=RTu zqah$Xd%pmu2!us|_oe}~Ze%7CsM&G*g8@!7nYwB`J~J^$X`O6Y$L_`SkiJUgo4hnv zHy_Pj_$wXINK5>xYssM7{Gr!!zqrLq%UHl|3$dMO8Wf>^I`4!!s6jXmfsDS~S zz5{=jII>?y%Khy$Mo?+go_pV*eeU(~P<|KZ`bh@?x`!h>1eS@m0;rR^Q1Z;|c>fq> zCbPZs&BdHK_4aS)9{Y9_y!^e>iG4d~r&(~M496)r5}!>cFUx5hz^Q&ge%&y!0sSWG zKvbFU8)ct<5|SN=JdbX#O6p3}rb-nb93`co#nR6-TM{GKcuy}I`q-zPIm2JD!T7>| ztwf8%HgHk7wM(zJrCdJxB3MA<5zPG<`;CP=^S`)Fizjk%)-vfx@Zd_A4ps<_4bRU1 z3%=MieOp-*cUpys5C1ch{4Llk2|c@|IjR;@LHXX9^RO-SV0pyF@@HO2n`zl!7fzqN zBCBN(xwu%Q4gAfh1f+dDP4L>4QH^p?Xy;Aq>m4OBMV59I$u)mGTugkc*dwSq$t6mm zonuNzS|;I#o+oOf5*W)X4Is53wpOLgFjs3|A zjp)4%=CWTB9wXvm-^W=&X%$SVQ*wa;yE>yXZu{H=M^o=yK?gU!&Dp7q9%&VgCy@F`yQ*fTPmrgm3DB67TYOSNroD+)qpT+W7U)jg*HgSE)W**38&`lJ z@$)|xei6^d#W`H8QZVlTYs{)Gq* qKSd28{-*(K?*I1up9YwR0ugf$F2BH+MZGzVMng^Oaf#~d;Qs(>|J;fI literal 0 HcmV?d00001 diff --git a/_posts/2019-05-21-microbit.md b/_posts/2019-05-21-microbit.md new file mode 100644 index 0000000..2577ccc --- /dev/null +++ b/_posts/2019-05-21-microbit.md @@ -0,0 +1,132 @@ +--- +layout: post +title: "QEMU 4.0 adds micro:bit emulation support" +date: 2019-05-21 07:45:00 +0200 +categories: ['qemu 4', microbit, gsoc, outreachy, internships] +--- +[micro:bit](http://microbit.org/) emulation support is available from QEMU 4.0 +onwards and can be used for low-level software testing and development. Unlike +existing micro:bit simulators, QEMU performs full-system emulation and actually +runs the same ARM code as the real hardware. This blog post explains what +full-system emulation means and why QEMU is now a useful tool for developing +micro:bit software. + +The [micro:bit is a tiny ARM board](https://tech.microbit.org/hardware/) +designed for teaching. It is increasingly being used around the world to +expose children to computers, programming, and electronics in a low-cost way +with an active online community that shares project ideas, lesson plans, and +programming tips. + +![micro:bit board](https://pxt.azureedge.net/blob/12e4685e5f24df67255a242bccb4d1c8e1395e5f/static/courses/csintro/making/microbit-board.png) + +## Simulators and emulators +*Simulators* are used for many tasks from mobile app development to +performance analysis of computer hardware. It is possible to develop code +using a simulator without having access to real hardware. Oftentimes using a +simulator is more convenient than flashing and debugging programs on real +hardware. + +*Emulators* allow programs written for one computer system to run on a +different computer system. They use techniques like [machine code +interpreters](https://en.wikipedia.org/wiki/Interpreter_%28computing%29) and +[just-in-time +compilers](https://en.wikipedia.org/wiki/Just-in-time_compilation) to execute +guest programs that do not run natively on the host computer. Each CPU +instruction must be correctly implemented by the emulator so it can run guest +software. + +## How existing micro:bit simulators work +Simulators can be implemented at various layers in the software stack. The +[MakeCode editor](https://makecode.microbit.org/#editor) for JavaScript +development includes a micro:bit simulator: + +![MakeCode editor](/screenshots/makecode.png) + +This simulator does not execute any ARM code and is therefore not running +the same CPU instructions as a real micro:bit. Instead it reuses the JavaScript +engine already available in your web browser to execute micro:bit JavaScript +programs. This is achieved by providing the micro:bit JavaScript APIs that +micro:bit programs expect. The programs don't need to know whether those APIs +are implemented by the real micro:bit software stack or whether they are +actually calling into the MakeCode simulator. + +In the screenshot above the micro:bit program calls `showString("Hello +world!")` and this becomes a call into the MakeCode simulator code to +render images of LEDs in the web browser. On real hardware the code path is +different and eventually leads to an LED matrix driver that lights +up the LEDs by driving output pins on the micro:bit board. + +## Full-system emulation +Unlike the MakeCode simulator, QEMU emulates the micro:bit CPU and boots +from the same ARM code as the real micro:bit board. The simulation happens at +the CPU instruction and hardware interface level instead of at the JavaScript +API level. This is called *full-system emulation* because the entire +guest software environment is present. + +What are the advantages of full-system emulation? +* Programs written in any language can run (MicroPython, mbed C/C++, etc) +* Boot, device driver, and language run-time code can be tested +* Bugs in lower layers of the software stack can be reproduced +* CPU architecture-specific bugs can be reproduced (stack and memory corruption bugs) +* A debugger can be connected to inspect the entire software stack + +The main disadvantage of full-system emulation is that the performance +overhead is higher since simulation happens at the CPU instruction level. +Programs consist of many CPU instructions so the task of emulation is +performance-sensitive. Luckily the micro:bit's CPU is much less powerful than +CPUs available in our laptops and desktops, so programs execute at a reasonable +speed. + +## Running micro:bit programs on QEMU +QEMU emulates the core devices on the micro:bit, including the serial port +(UART) and timers. This is enough for developing and testing low-level +software but does not offer the LEDs, radio, and other devices that most +micro:bit programs rely on. These devices might be emulated by QEMU in the +future, but for now the main use of QEMU is for developing and testing +low-level micro:bit code. + +To run `test.hex`: +```shell +$ qemu-system-arm -M microbit -device loader,file=test.hex -serial stdio +``` + +Any output written to the serial port is printed to the terminal by QEMU. + +## Debugging micro:bit programs with QEMU and GDB +QEMU has GDB guest debugging support. This means GDB can connect to QEMU in +order to debug the guest software. This is similar to debugging a real system +over JTAG, except no hardware is necessary! + +Connect with GDB to debug the guest: +``` +$ qemu-system-arm -M microbit -device loader,file=test.hex -s +$ gdb +(gdb) target remote tcp:127.0.0.1:1234 +(gdb) x/10i $pc +=> 0x161c4: ldr r3, [r4, #0] + 0x161c6: cmp r3, #0 + 0x161c8: beq.n 0x161d2 + 0x161ca: ldr r3, [pc, #48] ; (0x161fc) + 0x161cc: ldr r3, [r3, #0] + 0x161ce: cmp r3, #0 + 0x161d0: bne.n 0x161d8 + 0x161d2: movs r0, #6 + 0x161d4: bl 0x16160 + 0x161d8: ldr r0, [r4, #0] +``` + +Having a debugger is very powerful. QEMU can also load ELF files in +addition to the popular .hex files used for micro:bit programs. ELF files can +contain debugging information that enables source-level debugging so GDB can +display function and variable names as well as listing the source code instead +of showing assembly instructions. + +## Conclusion +QEMU now offers a platform for developing and testing micro:bit programs. +It is open to future extension, hopefully to emulate more devices and offer +a graphical user interface. + +micro:bit emulation was contributed by Julia Suvorova and Steffen Görtz as +part of their Outreachy and Google Summer of Code internships with QEMU. Jim +Mussared, Joel Stanley, and Stefan Hajnoczi acted as mentors and contributed +patches as well. diff --git a/screenshots/makecode.png b/screenshots/makecode.png new file mode 100644 index 0000000000000000000000000000000000000000..f67576829bbaa2b64002a987e46f74b19e242937