From 1f03a12b480de03ad3f3a29d4b3c829dd351fc2e Mon Sep 17 00:00:00 2001 From: zjuchujinjin Date: Wed, 20 Apr 2022 06:56:11 +0800 Subject: [PATCH] optimize image for ch05 (#281) Co-authored-by: chujinjin --- chapter_backend_and_runtime/overview.md | 2 +- img/ch05/compiler-backend-architecture.jpeg | Bin 62207 -> 0 bytes img/ch05/compiler-backend-architecture.png | Bin 0 -> 17443 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 img/ch05/compiler-backend-architecture.jpeg create mode 100644 img/ch05/compiler-backend-architecture.png diff --git a/chapter_backend_and_runtime/overview.md b/chapter_backend_and_runtime/overview.md index 1707f22..77a0dc8 100644 --- a/chapter_backend_and_runtime/overview.md +++ b/chapter_backend_and_runtime/overview.md @@ -4,7 +4,7 @@ 如 :numref:`compiler-backend-architecture`所示,编译器后端处于前端和硬件驱动层中间,主要负责计算图优化、算子选择和内存分配的任务。首先,需要根据硬件设备的特性将IR图进行等价图变换,以便在硬件上能够找到对应的执行算子,该过程是计算图优化的重要步骤之一。前端IR生成是解析用户代码,属于一个较高的抽象层次,隐藏一些底层运行的细节信息,此时无法直接对应硬件上的算子(算子是设备上的基本计算序列,例如MatMul、Convolution和ReLU等),需要将细节信息进行展开后,才能映射到目标硬件上的算子。对于某些前端IR的子集来说,一个算子便能够执行对应的功能,此时可以将这些IR节点合并成为一个计算节点,该过程称之为算子融合;对于一些复杂计算,后端并没有直接与之对应的算子,但是可以通过几个基本运算的算子组合达到同样的计算效果,此时可以将前端IR节点拆分成多个小算子。然后,我们需要进行算子选择。算子选择是在得到优化的IR图后,需要选取最合适的目标设备算子。针对用户代码所产生的IR往往可以映射成多种不同的硬件算子,但是生成不同的算子执行效率往往有很大的差别,如何根据前端IR选择出最高效的算子,是算子选择的核心问题。算子选择本质上是一个模式匹配问题。其最简单的方法就是每一个IR节点对应一个目标硬件的算子,但是这种方法往往对目标硬件的资源利用比较差。目前来说对于现有的编译器一般都对每一个IR节点提供了多个候选的算子,算子选择目标就是从中选择最优的一个算子作为最终执行在设备上的算子。总的来说,在机器学习系统中,对前端生成的IR图上的各个节点进行拆分和融合,让前端所表示的高层次IR逐步转换为可以在硬件设备上执行的低层次IR。得到了这种更加贴合硬件的IR后,对于每个单节点的IR可能仍然有很多种不同的选择,例如可以选择不同的输入输出格式和数据类型,我们需要对IR图上每个节点选择出最为合适的算子,算子选择过程可以认为是针对IR图的细粒度优化过程,最终生成完整的算子序列。最后,遍历算子序列,为每个算子分配相应的输入输出内存,然后将算子加载到设备上执行计算。 -![编译器后端总体架构简图](../img/ch05/compiler-backend-architecture.jpeg) +![编译器后端总体架构简图](../img/ch05/compiler-backend-architecture.png) :width:`800px` :label:`compiler-backend-architecture` diff --git a/img/ch05/compiler-backend-architecture.jpeg b/img/ch05/compiler-backend-architecture.jpeg deleted file mode 100644 index 1b50bcc61f26a391e58f2dc41b6e3b3e3880472c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62207 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 K)<6=z|Nj9xyH#HR diff --git a/img/ch05/compiler-backend-architecture.png b/img/ch05/compiler-backend-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..adfbba117037cc345a5b85d62a04ac16d59945ba GIT binary patch literal 17443 zcmcJ%by$>b*FH)JiZn=yARwVIbci$z4GIXNLx(sZCDJJ(jkKhQbcb|FNS8{fgp?qy zw9l}p64P&^R^Q4Mf!_aSXjg=%1CW2 zEF4BGENqbrIPgk(HPHn85BsUMk{njaM}}qi$GJzc8nRee?;;70O!45~1P;m%o?>B< zv|;{WciHDzU}4GEsvu=`+>F-0yLw%6K9Sxy+L5?(b?FZh=eZ6k7q*-n@wuC!6bi|g zmak+{-V6;i%L-PumyKe7kH_qkrHn=Soa_Rd432h|E5+4k%`}H6e4;gD-{Vrhw}1b- z9Vzj1dkp?d9sBcGs-og@r1bYrCf_4+diwGFyBx;G(~ECBKl%p;+jz_d(Dc6I`m?{7 z_9vBk6gsKTcxcKRHIb?<{Hc#Usd@4I5m%|8AtOu(4zaHMnnEPE^}!DT_O=WYya^ z9;27xOG*stK79C~lM);(U@@4Xz}xh9?yao9&crR6$oSDhJyy%bPidv&NTfy3^}9K5 z^Xw+7HL8jo7SQfn^D46+0`#kG@-gq$)H|=nb3f1)E`s;Q-kF~t+HLW}Ezm$BT?k1@ zm8>M)Hr`t6&-D%pxU7AXaNo+qCnu+y@1QY$E$LZpeIMQ!YINUjX^|Pd%EIEWlc$-k zUt?Eb8p5R%R$BTSE~N`=L^SlyylZ8&urQDhqn;nMho-Q&<`xK2|M=B{9*E+Oz5|L3*2$*+Kq1Mpcy)Ab6X32Y^rfGzQ3p5-+6u0lpn)LW$&gFnO0XMQvzLqZeie??Zr=OvEAvkh;V90 zia5`KOr^+p9>Y+Saf8b`Aq`L76vrKQ^~7f%lZ79ftvUYrWjOjcBi@XHjxMR~+O1ot zxktk}8nr*NRAMb?U+fQLWNT-uE`@}K3g};oX5~ZCBIX^KnVC6PT~@x9PN#~yTKJJN zNv%!P*vGPKu&}Vi#KsP`q0_koFiRPf!fzg!md14Pz2tL$|7ZqmZ0rjJusd=|0uOr= zcz^%?Jze$qt8U>vW-*W5l`4;2>-O+#8qq8YKR>2&4g8t%j2x7^-3EIT)yBro{zlxD zhlhv6JecUF%Np%32-`7;syHq^lEdPpp93kp_sg()qHib?ik-)7;O*zhZ*CmhIF?$E z7MN-}u6{wN>xbpNcyX?sbm-w+dkF2=1$9EJrv0BOuu$}v9ej=KB>sYC%I;4QwcnU& z6?jS8q9G+EwYj;O^HAbFh0Uiol8$t=aEJl|1E(5Xe{cTiy6|S=-qoZimGh*G?Z$Pi z(enJ56(XXb&}?*jvOC)&Xk=uxWIvoU0H@Y(37YIXBQsLHnw-kEi* zja4v-Ii4GS^5jWvl|mS`q~~5cl77=OZvI?2HLQXEi*r{6A!v_;gx<6&;~ZOsP`5CK zy@ADMzZYYq0qF?A;Rupt>RO)?LPpQX#L8MF>UDMO2{YiolQ1075Uq(du z>@1Pr8qRq9wFIsdt3WPBf(e0-SDCT9iQs2sKY9LsuUCm4H1CR_;?#Vrldt{m-8%vO z&AEJ zF*S0Y@1K>{@h#h~pbicT6ZiVNQU0*c;jXfB_d;L7!VQZgjb9mvfw@W)S#;ak;UUr< zYyJ2MH8Ys0)O>RAxNKR_Yk!}5zsoF~y7$(kBnqF1_ANa!;@Yb#*93J+LryBFg-Rh0 zFMVd-SD>y-h^KqH__0_!JJgC_72=;uCy&p4%R*fc#kp#7w$fSU@&$u9iLyWIoR%r< zh6H{z{BDZ1^v5Tblar(7F$kVjv$5g+m6xWWpIl|-e(B#ElvVCejW9Jey)0@sS!s3G z#N_G$ITh@ptgn-kQ<{`_lxS;fYeyJOmj-RZ>zhw-{?vQ^;bAv3GozrO;4y9r|JfEq zS{0xlM(yi+`u6QxMoAC!@g2S3?&yCaIe+V|0%44d$5lAAVKlt)#^Oy5v(HzATQ%No3YWDRVz3Ny7vDDGgVdamX zg%@}omZHvUU!b7*nx72g41083+>0_T(fdJS?-(98$MX`7+?|2XbuR14X=%nLCQxS=4+bfys1_C$c7LYWpX?0ZDF_P=9_&T-)bArgtSiW7JJMJj#dusoEF!7P^*!hW`gPyzsH>w~vNitfK- zk&-fc^>N3c3yL#KkQr2J%&G!zfRzRy5Dtru#5e!netB!LSij~rIe9dJYQ~KS7l&c= z7}R&)lkGIuY45MY!*`EugviO0-tuKgWGMgo_D-H^z{#-z4M|r4?s0Sc{q{%k&Erbu^WG%_FAYJkB}Z>@eR4m$3xjKYJFmFhrg6xdKDC$GC4r+P^} zPUF&@IL*-%{9hCZ$N{VR_V0D!DQzdJ^LYT5;QsUeCGF8y^fkfp-@bj*Gjhkv_gv_u z8dZSx3Y-g}2$c(UEI319DyphC4C|e;RbQQPK8 zCVC%2O+rEfLO&aWzs|?qy`&p=?<_L1wK5eS_QmT$AeLVay`frYeSfxhaBHU3zxnj| zcY1nyK`MSvPtT)|ueJ1CW1XS!9jO^pJ~`Z5huoUaA^!yq&G+}7dhe}$WfORfr5t9S zc?ej1AFFu81PIEgYUFKRMrB4zK{ZK`8#>C8*s3XJ9igzckN^Doj(OAa(;LHPpJU&nA51F* zn&Ubp27q7(;my0HnN*wwiFA1Pst`{W&;%DR-ng3+ZhgPTVfF){$VOQEE8;G&VPaF# zD+x~B^|00hDWZ3hh4SweqrUY3SadzuvD$rZse63*r>o%L?_VN1fol>HUZ*F=D?L%p zgM)*QzZB64p`&VQM2+5?wgu+v2^QXRoDW`$W%Aw`+*uy3vHR`;czV~OJ9K@b=J$9N zAzp>^>KBOq8`@dQ_wOfq$QH|3bsU|cRW*QKfZgHX!+9@+fcQoThvRi(VxGtK)Qw*V zt&DSueAB+C?^k-w010c=J1r*|d04^eD+n91U;FmXt>W+Dp^}0^ehIfFK%7s~r(W<) zP$)9%Ia5mv8@`l3RI^!vzesug)!fZ_HWZ5UPnLm#*s-VJ_zjQn5@(rN$Hh^0@tySv znuZ^6Byz_e;0LDPe|O7y<+X&nwzHPvm0M1EaD?3?0s0lymlF{wzB7aRP@v(GDD5j1 z$SeH#i_ZEbO_Y|2ZX1PO1T{n6-tTE+VQpFow~eQtB!gxvtYg0i5?>Dd;{w>&`Vlb% zT(Mz8wRIHvjeAA+GZl$PyXjrl#{<0WA)CWxCmLLNjfVKmJM;EV<*XF^bcxj_g-|ZP zCPVaWKfE9)(7@mP^QTLz*xCZy*k^xX`ed&L6OAHt%mM-w_GwUT3tgyZ78kp4FSG@` zcwr*Xbkjkm%9$1spNS{xeYDwCAlnHT_e0a)0nzC^mzbdy}^5?zcWa}jh%Sr(5D+$Iv1f-;&isZ}@D2um2th}S_^3Kac zctKGG(fMV&(;lmc(W{y6?(Q!c#I%J4bOFHOlQ87bTjXh^h@_)(82(&lKR%{$Qo>I`1d`o2V$ZoGfKZV`F0#`uSdn%u$xt z-Ka_-tD*Kig&vDYfTE_W_TTGus{}u7f0AxCX~ls%)<_aygW6XR?GF3mcRbMfu-qc| z*|TSH3FEh}q4+puO^E1)x`pn!U+giZZy*I{@=9NMJ>E<<56jwoN)q^nV z$Hx|z7`(Dpb0-*>rKA`St(}}Itz!p8?5D!@{vPbE7Nn{;p!Ktq$w#lAU;6gWythw^ z4iO%&-hzH|KAc)~wh_I#yX)=olk51kS4sF_%mZ4)uV;gE?5}AMbb$?pcw%^&Y!!T{ zN$kuHjhnovP-;ZzKoWND?Nn_-$BT+;mZp`pxQbyZGmj8IX%R^QgL5Rb2)pNlW)c76 zQZFxy-ditv`9EI!7M}=-4=a$@>YA&oz<*!LL9y~hP|)K+7XDa8M^_H>N(*YmFmaR0 zT7pMN!fF;5cJIopTP&?a;nc2e|9XgUG~^dD7xr*Nz5z7z<9|N_Iijhl>08o#S_D6; zoBm%H2~z6Iznfdek#4O#ESZVND>slVY(L#pJbnv$jq<(Q`n3+Gy(wj{eNPXkscBwe zyIp8(g|r%AHKy%W3-vl<8`>y=$TvrXkBDSqp_6Oxt%NY*=hw2UitSShYc#-Q)%8cE z`+pz{&9vfrv=%3IabuW4~F>8U##*%>iH_ZU!+wjZE7I z2oVcj)w(ODz;x8AxHRVWm4BG?UZ1rad@kw+iL}~&`pt@G7L*U%^CXk+JzY^#8s!gj z)sq~dT~vx>tU?cd=Bxv+pgp=vu@7pS7H`?qc=JpGT4h(sm=D)7 zw&7+HYX;r~rmJ*Qln){i7MFU3eo%>y_VJB5wuB0nCsq1>ZyZi4Kkj@_>?6qX-By$1 zxp&g`w-+-7xw+N%m?y7Q2-}Wd8h~9_z3Y#7$rl_N8q*bnQ)xLszkmHozHlP3=Z&d- z0Owt8hQM1?Dqggt=iy@z{vH}E_^4+A2G%ki8hR4XQ*zu2Wup@CT~ zZI1BQu(!8AzGnol1GeMmQ=n2@PPi?}Kx`uRyK(ztr1VKJRp(YDlXL{5?e7@YXVCQg zNW?#ec2G^Me^f-Y`ih9?MM^~-Xj)zcVXYw`TTR8Vsg((=NGUqBp|9&#a~s(nUpB~+ z7%xi)Uck{s)?`5oyDVhkDrr|yVlLE$16L-OKtKZ~G#^Oz(oTt37cY8NL3!Yb?64}*wcYMJ^OvP@(Mg{tpgWG(`g)RK8$T&I;Mczm;mBMq&h z31`UYy@x4BY$la=vFtX45Nx@^5t=KI&3r9DLfrSHac3!0;dz0qKRz8}d#!b4Hy5VX z@2-CRVL~`e>uuIHyQ_3vNm>Ch1L$W-1i;=w)ltm@z1;o^lw11l1#k2$FtMb z*@ruuJoDkCG#dq1-G+Hj`u80@-%E+`p zN6c?K2(S;12lE7u{&~StgF0=Ji+I)C@!_m;$E{pH&o|zQW;i)Hp`|jlU`?eLJE4VU z!uUFB9@p!58xx%8_ZA{nq&_aZMPu7I+9*`?KITW+O*MwF8Z_2Ci6#DK{xMZNXunE_ zR?P7ly90MP{mW~7>#<><{aF`)TUgFin8Lkj7sDJu?C66Z`Mkyqkg^t2mF{SULhl1u z-6sq{DViQXRT1Y zSF?9Y1@}rqskr9on6ovJQAUZzB+C5Bt%eql?gOa>&0d+*Qo9C))=ll!42KQBCo99d z8yo1UMzNnrM68DW)kP&jl5T*B#ZX>2QS+&JsnS?+dKLXLp+a_(wCAxCnRvy!>(FaQ z{QUfGt=YpYli3ilw5>a-SqZwaO`aSlSW_f59nok(Ul}fvV!vo_D&F z2@s&Qz8{_Tu|%gV1398x0o&eZjTS4Gc(w@kH=EG{-PrGH zE=!PnXL;kNGnGii&PhF)JLgf>HXC(*0!Kk9j9TpP@m3$NmOk{i0rI)OzBep>Ol<&6 z__r|iHMW?ve^p;A^g#BXp~^zmy5w#oS_=Z)c2_lLhNa z&uX}S^WQnb5pU<9Q?^+IhuFJ8#67POXzVW7EJ60AN+H-r>*C_F+R!iy_8pj5Y4>R} z+L=o`wKvnb_*4Qs#ET4eEFz^1QViQGz?otN2-w1y{kyectvi}^MJmT%r18-L=P=8< zO`;c0P@8yIek5|N_6e(HONy4GoOSo%@8;=JV`(wwz2)3AGr7~TPsRc$q5KnZ-u`E; zp*~)*58#g7SkqlR-Q7(EGbb~BdN^qP|BxurRUelr>at_m#%MTOOpYV3E2hD85B%mb#{tgJiuAsf-8R%ileRQ2&@L5i}%VFHpQFjwU85chEX8K zt)C&u(Lb&&cR7}kNnAAR8Bcc_U+7PwBt(X|MgV1!Y?N|3n4@v|$l0JWtFcd;T#N61JO9N9#TuKj=RX8(iEd=x>CZIW!FE)=`{lei{$425u~{C+7>$ce5n6mY z9kdsYXJ=>eePVbApG&IR;&-(j{#x$K@_(cFl3t7%MRwT{)nHKPh?H&)A5_V z7$=HI5I~hJW8l$Fp|e1Q6l$If`?4JnFaqJ9dBzgZtrAP^Q8>Q*g30A%exioJdTu(J z5?YIz;$X8zNB;2y#_wl;5^DqY%mz*u< zPEHcHj^5WuS!(XT9h}s9^euXarjA99&!KhVqDCESeE5BjA1_7ci)$=;D2`J3&GAL@ zL}Xg6(H!j-#q&EwRxiVu0cCTv^C2$N{~!p8K=E<6of8o?l3~y`r`;S>VoE>XKpl8O zfk-^x7CbX!veS1yySgVyozHeV_nqIs4RSUIH@{2!kbw9QPt6!7-$8K(!n2(jhtW{6 z233iEYE7y5M7t785pm!<_5n@47mg~cP`!;7uVk26;=((KroKt0*gV$JRjU#fAI+*{ z))?-%ef(#7H4{&tIE2kLVcSZ8QR(Nb1Hr>QP#q4?tw(SmGz7dOdEX1Lp(-__Z!0N< z*^d8IR)OwD5IxAEL;%uTORK;e5)opOPg>0mU9)XLz6Z;>-)ffZ#7(4;_1(Dmp_2w z%xzwn^RE@%JQ?zRNKy701W90yb&{9o=FzQwbxmI`bSbDgItoxn*uGd;mEOm)eftc- zwy3VHDvZ*+rzv0|GnS{tdal`pitNUvTOD!N?~*XweCD%$kzcH-8aunU#hC1gPbG%4 zSqOANSDKVP&#a82dBUu=_v`!W;$qMr_6$79Z)D>sG{YV@ugcW%9nyz#D@~QLDu#b1 z)x-+IgC6Vt+b>p|8#=yn>Ob2J9k`!g9pN3g9r2Rd!e4?;FvrWC9#LIqQE5Usmw&v` zM%sLOB7O^@7}ilZSlnuN<13yiGpEe`B8J16cNX|9_s^+VB2d;}ik5%>j`U0~NuO)n z?7U2YC_kS`Ygp%qxBb}l>+KUWy}ixN)&_-S$7=!R7eX?2933m~&j+Jb+zm@@snzOU zqNAM|Z#tMjqiW=P>^xHRic4=r`dCh(Z4k?ape6p*&d`lypKwA;j&>}nF4WA!XWN+_ zEJ|r)!&9u5pF>=UZ-lt~&5opACLfQ^vzGQ3?mDXNvFT>{{e>EV>VBZP+%DIDyFg!p zIS}`X4%V?lm(NFWW=lnU9+8=(2BXRu71(-GeI3sr{c!4VJqL*`Cndfs^VZVDEITx( zEucYaUf|P5p%*`IaH2DGu-W-8MsK4yt#jz87*5Sd6?a>YEPKw~=MtV4B)%-tz9eq` zs#_PD)qEGNe1qG!Y`*cWi-()s8`#Y@SP2HP5XVkqe|&DK_CbYZ?R60mkp*fMmEQWM zjODs10{$?DD+o*8jBfd=9R=T*IxY63pmW`@nZBSc5&5dAyY|E==`}oUUBxb6n(3q)alXFqYi$;J!jij8`TL7 z{tTzRN7pm)SeZwz3Kxd>oa{J`qRBZe?mI%I0o@@;?+{S5+bd+Rb;+;o#k7NIoYpty zo1p|q=$#kmefaCIiK<;)3hv4l+&uy$MDL+Wm8QpOmKC zgU==TEem~E<#BZ-Ij<15Mh*ERHaWvXqY5{Gd!Z?BG%n6KQchO%(3y8k{NZgUlz;2_ z=dxVKZl2~GiYhTxF$x4p#;mD81`JOdvTiTsUmohI%2ZIr4@^A3CB$&SAXz<__%!D>u7RI-u%v;Ev|x9I`7E-t2zm{dwrG%^Nc9hoZVWV z%%|IVZe8Q&CntX{Dj*_cH)KW-B<|?=ffF7eT(9ghvq*MGl@g_Iu{XXsIWY9U7@)5E zX%yx-S;Q6wM(p@opO(fQfB88gi1^)Hp+c!6F1(y9_P+dfrHM)Ucwmeksg8b^S+0Cf z@-yqz`)fj>;z+gl7{|xSB8S7blRkGBD?a&4z;8^M6n{sPk4#0(TJ~rr2Ow8rb;J*n zx7?2C$|zzUCIrZ=qO%+5=ze7}Tg6WPgF6oe2>*jml0aExu`qSBN@Hjx0%S0KjD&yr z^AsKVu6@%sbPqRBJit>?l0;Is{9^e1r zzqlk>iJ2>0nPlq9q&akmtgiohogDDO2cCdtNO)UgQkele|Kgb#E+YU($;Bsn%a#Lh z5_k?89Ajq375LH@=9vnFRO(li;p^Px!i)aJmO0o|&b+kVO~au#4z1lcWwSckXr!=wK510nq()I<-Vda_Mts;l7O&#OM zO_z0>LEMGta3V(|MJI*m)$7+sk-kT`^75lTfrDnuC^(R1yg6R)y2(JoECMyx+M)o& zgZEGj;39oVf*klfz#FT^aSm2Ix-)uJzUS=*^a};YM4261UAw?y-7s!yw2pcrV)O0U zl_vo73R3gU%+22k0Nl{E6}SzIuo3X!a8vm}W}lKad;YN-W%mcsV;w|D_YlIFu-4O_9_9<YGwah=PJZO?Oz6O!+B&HZYo>spkTpg=els?`61g4Zi zmoJ(PF1CO@N3S-pv9V!fvSM}I!8LxmVrg;36Fq;bRo-jA) zHp>$=rF%>Xh>Ju-N4}@OPhT=g8&zG;H@&c~o;DHJg=f?M>Kc{({S~OG%x?-jQkzJc0Ppp~*IeHQ%5& zYmC8rs!(K5S1#j+13aB^wN27WhSM#$6h!d5bfuT{+4b5oS{+23Wd*iiQ0j~2xKsY< zlN6})i7=9sl*EW3+`Ids3N`lAcGFFgdp)4%)cBsB z2tN8qL`td$p9ZfBuwW)KGFV3Ss;_R0ozM|BzB-d`CNR>C4Eg5X-aX)Zin)d66nN5Xa! zb~k3_K|iZ6lBU%dg{E*MmU(p~>=iz3IYvq>sHWm!M0^H24#=czA|m%dCg+sbRMxt! zrK3A>>uV%+9_&VBB&qMi;9$-+O*s%cUOElU}o#Y$mHNR`2YK5I~oMX?br9=z&*ppJ)k6y)_@{{0*{)U-1C1F@aG8_ z;{+o+5FMOg<`bdfH8QZyNl5tmIbB|tUjrB9Z4hANZs@LLCm2~z);>WZ+d*j^B?e7; z7?Q5*ugM2Bc82HF11?gru(FO4i`4m4!r`JQRfc%Goq8*~9`-a9tW!Fm8O9AmHqGN% zHIP94nykB9X3`1{#X^iRBHicsU}|crz%(^XNe$4+_ClX4CJC^!u!w^*k{!fsSy|Zv z+WKBjTYh{UGUTy5#5P*p{wnh!coyAGK>a?mCN_W}M0FK(C|%4+ zi3hhI2*hXB#4P1#79iEC&a8>rkgnkl|9JzlJftN(VvKpi%iH@rMgxS0jf%J;ey`NX zP?#IzL)1E`b*_x#F-*p|NpAk%-6RKL`(P#nt07nxPN9KUawdPsk8zufJp{P}SlHsY z51?H$Nw|^G(1_Z6E1MZvlAjBqTKOq`3ho}tjBLnyzDJuuE9F_JDr;-qAu9lYpyleQ zG53;TzHhA@?4Fkn;s9v)fS2)cO)_v_=C+i)6#kZ*Vi1z#lg{h zOT%jvp40xUrsfYE!DuF6h8nktdjEh42xCVgn5U$UNlbKuIH;|?sk`j_*?o6KmzyDq z`hE^FYzJ-e5NkN`Jel)>&qUMFmf9rvcJ|CM{wbp^b1yilz~xJWjq72vI$l)>$%-26Hv!^J zd*hF3i6kZOTCzkw-+b909;A4u6E5s?c44*C*`N_8ol`h5@SQ)Xh&1_*+eoFmmwAcI zprkZ`feFa79!DGbx;x6sGH%@*EPzeI!o!795uU1yc$5Ma)Cll&`6f$Pv8H#Rna}Kg z7NyMcfp1wNAt0qlT7^0(!6&K&;rU_ghM)jf#h+|ixlMuAHdj$xQ(0*~R8 z+Ye%OFgbm1biYf@ve;$AsaG-yclEB{Ng?cYf?6i1*{oOIsUDrWS#X@iCR@S_@WEVT zV@r=SuLlbY$DKFGcVCnUlffJH=FOWsYE3~}Xay!&0n-oX>YP8m7K7v#&DP?7o)n5;px=f0PigSbYkdj4N|#hf!B_Gi z)CV&E6Ibp<;E)}S_m>mm2Itn-y+Pa)^0B?^v@$|KdX12|_slW2Mny||AMDsVE*cQF zS~-wgX#s{3?4T8VL0-(E|HTg=A&kjN`L@X<<>kwThN4Awg82q@0+xxwkK^}J-H*R1 zdt5_hEdoDhX}nU2y}d2yRnCMlrR~*2fQ3+UXvPVTe;pslz{AC<<0DE1b1MyxK@{6k zmECvx8px+qf~Baci+?0t))HN&)CF)|eoqx24<#VgAOV-r4?TrMxPy*-9GY7h!$vmd zk8x$<<`o>xs~8wef@AqS5$&^HJ8DF26$oYMIl~|=680u=IaZL0%zMVMsl|itFC8Oa zBDwmtG)*KXieCc^nC1Y6WtQX6(Y#-jBfUm*Ks^Ivb?Z$PpL2ri&|5563uT1=6Fvfs zOTaz&;oxb0?t8`c6=W0jM1`;{xo8#zzL{@L-r_mi^F5STt`xsimMNi>r+qE%N-_YB z-y{S$$Sjw>H;8%w%l8C4JYB%ISdhahIy`r?%j4A zI!!>l1eEMTHs8nwAe2iURNzwv$3rG)Jlg6@RGfMZeit#Zx+gz6(cnhehk{eiDP|ZL zVDb}G<(;d}$wF4o$C?gSxWeuE)T4KjrG1;l<1X3j~_rWI)ontcopz2tb5B0!5azOGog^XvP>*RM2f zKFe{Y!!S!Q zH#b+Qh6M)p8^%@pzZ!o3eMv2F5wjkh^7tkW&z^)(BWNETogDtQly(e1v#5fHB|wYN z?iEF(tO|G*FAJeRgQNjUo9T-|=ofZOY_8Rq#hJT|mU|7eK|yQc^beP<05WyUkNB$I zMQZNgj~JQvTUKNgEL7=(3U;LkhT2_NqKEZS%osPPKnqM8KUO@oe% z=ONp%BIa`f2x+FEm!l``@H<)$6ZkNhX4FJ?E}a2?pNak_e36x3z$4e zq?vpB%Jl&p1+SHn{0sQ|&m?unsUF->w@9L|t0cl$t7|<#YK7vpgWeEPWKTB^5!*Rab&+k&H1iLuK3u}RO%nNbTXkfYvs{^N{Zml;^r?mSPc>7hG zrF{3326iQc1&3>7JiJ_p zuSFgB`g6vI^w)bb^W*>1d5fv>X7;%GZYHHS>%9Su6!1oBHr9c*mR8&?~-P+gy*c);-k^)xQfW>CV1yu~1YyiI$ zUiL27HO`tlLhvHiK~shKIhXCt&Hbg!NS(7zXK4wYwF(IT%$f^b)H95|3{Dwf&@d&! zaC+g;Wx#&TAY#M~gSn%i+PQ=YadjE6q^{2|Ib<9*G}OFzbNa!lB@M`G^kJ+%k`RVd z&YwGX)kH#4vQQ_V;?kv&G#Cv6B$&|L+8Mrze6gY)w8K7alU!1LhX zARg{Lr8gci0a|*J;G|MSz6T&RqU3^{puAZnIY zSM`(OX>Nc$98d$`aXN-J|iO|>=BFv0G2<7HY^9^goDGwM}6_c z9ozn-QkZTIGvO45rW3ZlWRw6FKIkR1oyp0yk_XbHo7Iy9z%Y3PyP%t(0m~i31v-GH zEelI;)PL*)G@D@i?5AR3$t0rXn}H!Di6?U}to3K-1}VtMGy&3KhL9Te|Niyb8B{7T zg`Pr9N9R%?_mLNv!eszk$XZFdZ)N=xJoNM{%ggzg7T^UO0c0PTV|32C3D_4H*g9(( z+9xI&pk@E}Jd?eqX4IK?e7xFLA7hm)YwyT>IMd>Xi8B0U@WFvM7JQc&Z*+E~zLFYH zhIHVT4*bspaO@6RAan}fF-E+QHO!2SW~ZbIu5jUPFl>M=mw}FMA5Pt9HYEkc-0bW- zo3V1R`sS5f0xRyL$2A2?8nWMQ6hL@otaSZ71&x}PA<_jig1|{tAacq}@T?Ln_i0T= z=3ZBiQ4%I*U|)d-BaZG2Zr_3#CYTsfi%cpj*Ez%y33CkW=#V9Kg?>C@MO zk4P-JAV#2p22a?a|2rIyK$0sSFyr8b-k|cTjXUm&CG7^C$FWLwDcGVDE6>FPi~efX<;uT*v~&0~kcyisfO2 zUpFBk0(LA25{;&+pha{`xLZF{w+6D|GS|`Z@xy9JwJPT*#?Iy*bYbxt-8Na~OaU9_ z6@YLF9&6E1VGo!l3*{$%j@+K|{B8QiYB(pqx(6i0U8cO52#gF0L_9RocUF5+#YI(p zK}++{eo5UDiZE)Vt?=GxJrA)gaIid>8Pp*Tvw#H0*E1FRUIB6A0X7UEwwi7_uZ%FA zt^!{Q<`s*`O^bFf$$tC0zt4<&)%WCR$sKkOU<9Y+96$j_noVF)0H9yF>40@ife<(Vx~teH>Rc`F z!9a#W8drB871zCPz6)I87DGSVw~O^k84s}Q9AP3x1<5jj$?>YGV86EJ3Zz$2Q5o`| z3wt9Ma1j~+>llI$SduWTHiUesSOG2X&5eYHXF8_kmb?nPO4*) z3=j%hJNyM?KxfD;0+f5Hkk1nfw5_QIrn7P*gZW9NP?MuUIO>yl@@ZmEe=hOTk$vk) zlUg}b&oV`A$16dckKq!yJcRct8A6vr z%7x33jFNJXLMYe(+(jf}uQyWmN+yF8j=al+7{^k$#eWAH`_JuebKoe0*|%)(FPQnc z(TC63y7z?!Kz!y4jiJ2PjaBr>%d64LB-0hVN%l?q_?!M+0T6>QkgyCm(@hhhhm|UQ zw9yvCWkHN;zc0U0zpS(pyy=(xiE-dn|2>nt2q;J90 zM6bvwmVQq+H;a(stH4+t7qIiq&8NeWhs6_M3j!S4ryc;8m?#uD=-Q=|lbW zco)Xc34=vj zfB*h9=@RiznE`S+ZgvoMIQ#tSG^`3(T`oSRxN_wR6H_Fz^*$0`XbvzH#+3dI6T?YD z)+2ckYNli`dcf~&Sa&52y>hEg&@r>5Nx8-j#2^WLg7sSXsW#F|3jcWieeT`Sjpx z^XE)rP0e0eCInRY<&k{KoPq9K`qPs?&H7c=+4brWa#i+i_a&^@IaW7nyZJ_U7t<2Y zr%p{x0TH6MpR!*r(c_S!f2t73GGKnzJ58#SLRH&+ z4`uEHkV$&w*0tQ`P#WGQ^DYuG;wrCw$8eJ<>;v9p^x*SG;4s=X68T_ek*ObuHrk45 zgVz3WQEG%Dp&~QnM>%PH{VhtYaRoHS6>=K!O!3rd{&h-A9^r2i2|{q3EOw*QEB~qK z2e(Q}JAes-1k?}47bmA3(9%9n1KkFf?|aXu*s9sGR&#xKFr!|(jP|nS&i2f2NbCG% zGN<7F#*9BqzG(ddRM&jN4!DscBO{g6d%brpytPmA!gF(TPYlwc?s`@0g)3v$Jnmxt z4>;?zP2CBjY#6er>*eJjOK5)QgPH*j4)`qhg@Z|@8G@t}324y5ubWij#SwiX&;v9q zpU0ac<973*al433ozasbTAGlc2PB;C1k$G>X;98;_Sc|*NekBK)pEI&+Bf%%_*wQr z)ycl=OAs%ts1SD4{f<*BqaBW6dOc9bLjb5id8QDdYY#PIWZg;8dri6x~0xiq*-S;9YCJEj{voF zb@zH=0l9f^^>E}29Xn0(J^sS2ps>37wz^L zreQE{Qs7U&G@&9-V8%;9NeRsM6ojxnkvn}i;P(Q|04qP<92LDg`v~z5?W`Sr#-WP6 z@VkZtSorWWR^AT)*D$ok)k%!;be&6v!u?9WV70O1r604IEnq^t#Zr6J+fSO$z z%!Fp}UA2H>>oh1%Ub~}us1~d*N{4>b57Gcqq<9B4gS8Zhp%FNAj$*=@0sk!I4$M4g z0umy}L~mqhsNDLO5^PVv5g-YHxcT1u&_!n-a*_An*&t}rzc$tKoRZVcMsMZ*7Cw-T zSy9C%y~eJQ{Nh!lGqFwZM$LG$kJ@@0yDi8yGbIpD1eH?TsgKe zefhSfv}d4?)0>PD+%*`O3Vc(sH=4JZ)g9*Vh_3EP8`y7#S_oSDUz@llQYP@V)VO93 zI})1XR-lKXBps8=qjpt(m}ft>bbR`Y5dqw+9;TDL@c%X%TIXD;1HwH-#TkUR`c`HN zt9>>)_5Y|UlsnAIk&=>5Oygf=$#B99`~HU%0m%2qKCfZD&e_N)tUS`H>hJWT5Hzx| z$3b9?U2f(DL59u+q+`slhQPziKa1*4$$`I{^lm7=QxUOk;=sN)-b4JB)=uZ6v<|avO|Xui&Rl zvY?PKNoVZ6tJ`=>6Lh2@=!5P8C75jq@RJx+9jaj=hfFm2f6Gi!Lhz9`C|1A{y@`r? sdl8*nXNc)fGyjkDF8SmA#nba$J;pUGwAf?ti#@PZ6mBC+FbUonZg!vFvP literal 0 HcmV?d00001