From 773e5660a6a6d00ab857aee0226f00c7dbbfa02b Mon Sep 17 00:00:00 2001 From: qingqing01 Date: Mon, 28 May 2018 15:06:43 +0800 Subject: [PATCH] Fix the grammatical. --- .../quantization/fixed_point_quantization.md | 51 ++++++++---------- .../quantization_equivalent_forward.png | Bin 0 -> 33017 bytes 2 files changed, 23 insertions(+), 28 deletions(-) create mode 100644 doc/fluid/design/quantization/quantization_equivalent_forward.png diff --git a/doc/fluid/design/quantization/fixed_point_quantization.md b/doc/fluid/design/quantization/fixed_point_quantization.md index f12e40fe2fd65..085352fc5614d 100644 --- a/doc/fluid/design/quantization/fixed_point_quantization.md +++ b/doc/fluid/design/quantization/fixed_point_quantization.md @@ -1,13 +1,13 @@ -Fixed-point quantization is to use lower bit, for example, 2 bit, 3 bit or 8 bit fixed-point to represent weights and activations, which usually are singe float point with 32 bit. The fixed-point representation has advantages in reducing memory bandwidth, lowering power consumption and computational resources as well as the model storage requirements. It is especially import for the inference in embedded device deployment. +Fixed-point quantization uses lower bits, for example, 2-bit, 3-bit or 8-bit fixed point to represent weights and activations, which usually are in singe-precision float-point with 32 bits. The fixed-point representation has advantages in reducing memory bandwidth, lowering power consumption and computational resources as well as the model storage requirements. It is especially important for the inference in embedded-device deployment. -According some experiments, the apporach to quantize the model trained in float point directly works sufficiently on the large model, like the over-parameterized VGG model. But the accuracy drops a lot for the small model. In order to improve the tradeoff be-tween accuracy and latency, many quantized training apporaches are proposed. +According to some experiments, the apporach to quantize the model trained in float point directly works effectively on the large models, like the VGG model having many parameters. But the accuracy drops a lot for the small model. In order to improve the tradeoff between accuracy and latency, many quantized training apporaches are proposed. -This document is to design a quantized training framework on Fluid. The first part will introduce how to quantize, The second part will describe the quantized training framework. The last part will describe how to the quantization range. +This document is to design a quantized training framework on Fluid. The first part will introduce how to quantize, The second part will describe the quantized training framework. The last part will illustrate how to calculate the quantization scale. ### How to quantize -There are many ways to quantizate the float value to fixed-point value. For example: +There are many ways to quantize the float value to fixed-point value. For example: $$ r = min(max(x, a), b)$$ $$ s = \frac{b - a}{n - 1} $$ @@ -16,7 +16,7 @@ $$ q = \left \lfloor \frac{r - a}{s} \right \rceil $$ where, $x$ is the float value to be quantized, $[a, b]$ is the quantization range, $a$ is the minimum value and $b$ is the maximal value. $\left \lfloor \right \rceil$ denotes rounding to the nearest integer. If the quantization level is $k$, $n$ is $2^k$, for example, $k$ is 8 and $n$ is 256. $q$ is the quantized integer. -The quantization we apllied is parameterized by the number of quantization levels and maximum absolute value: +The quantization we applied is parameterized by the number of quantization levels and maximum absolute value: $$ M = max(abs(x)) $$ $$ q = \left \lfloor \frac{x}{M} * (n - 1) \right \rceil $$ @@ -31,29 +31,28 @@ $q = scale * r + b$ We call *min-max*, *max-abs* as the quantization arguments, also call them quantization scale or quantization range. -How to calculate the quantization range (or maximum absolute value) for inference will be described in the last part. +How to calculate the quantization scale (or maximum absolute value) for inference will be described in the last part. ### Training Framework #### Forward pass -The forward pass is simulated quantization, see the figure 1. +The forward pass is simulated quantization, see Figure 1. The training framework is as following figure.

-
- -Fig 1. Forward in training with simulated quantization. +
+Figure 1. Forward in training with simulated quantization.

-- At first, both input and weight will be quantized to 8 bit. -- Then, do the multiplication (or convolution) operation with integers. -- Then, dequantize the multiplication (or convolution) results to 32 bit float point. -- At last, do bias-addition in float type of 32 bit. Here, the bias is not quantized. +- Firstly, both input and weight will be quantized to 8-bit integers. +- Second, do the multiplication (or convolution) operation with integers. +- Third, dequantize the multiplication (or convolution) results to 32-bit float point. +- Finally, do bias-addition in float type of 32 bit. Here, the bias is not quantized. -For general matrix to matrix multiplication (GEMM), quantize for $X$ and $W$: +For general matrix multiplication (GEMM), quantize for $X$ and $W$: $$ X_q = \left \lfloor \frac{X}{X_m} * (n - 1) \right \rceil $$ $$ W_q = \left \lfloor \frac{W}{W_m} * (n - 1) \right \rceil $$ @@ -76,34 +75,30 @@ $$ From these formulas, dequantization also can be moved before GEMM, do dequantization for $Xq$ and $Wq$ at first, then do GEMM. The forward workflow in training is equivalent to following framework.

-
- -Fig 2. Equitvalent forward in training with simulated quantization. - +
+Figure 2. Equivalent forward in training with simulated quantization.

-We use this equivalent workflow in the training. In our desigin, there is a quantization transipler to insert the quantization operator and the de-quantization operator in the Fluid `ProgramDesc`. +We use this equivalent workflow in the training. In our desigin, there is a quantization transpiler to insert the quantization operator and the de-quantization operator in the Fluid `ProgramDesc`. Since the outputs of quantization and de-quantization operator are still in floating point, they are called faked quantization and de-quantization operator. And the training framework is called simulated quantization. #### Backward pass -See the figure 3. The gradients are calculated by dequantized weights and activations. All inputs and outputs are float point with 32 bit. And in the weight updating process, the gradients will be added to the original weight, not the quantized or dequantized weights. +See Figure 3. The gradients are calculated by dequantized weights and activations. All inputs and outputs are float point with 32-bit. And in the weight updating process, the gradients will be added to the original weight, not the quantized or dequantized weights.

-
- -Fig 3. Backward and weight updating in training with simulated quantization. - +
+Figure 3. Backward and weight updating in training with simulated quantization.

So the quantization transipler will change some inputs of the corresponding backward operators. ### How to calculate quantization scale -There are two strategies to calculate quantization scale, we call them dynamic and static strategy. The dynamic strategy is to calculate the quantization scale value each iteration. The static strategy is to fix the quantization scale for different inputs. +There are two strategies to calculate quantization scale, we call them dynamic and static strategy. The dynamic strategy calculates the quantization scale value each iteration. The static strategy keeps the quantization scale for different inputs. -For weights, we apply the dynamic strategy for weights in the training, that is to say, the quantization scale will recalculate during each iteration until the traning is finished. +For weights, we apply the dynamic strategy in the training, that is to say, the quantization scale will be recalculated during each iteration until the traning is finished. -For activations, the quantization scales are estimated during training, then use them in inference. There are several different ways to estimat: +For activations, the quantization scales are estimated during training, then used in inference. There are several different ways to estimate them: 1. Calculate the mean of maximum absolute during a window. diff --git a/doc/fluid/design/quantization/quantization_equivalent_forward.png b/doc/fluid/design/quantization/quantization_equivalent_forward.png new file mode 100644 index 0000000000000000000000000000000000000000..df49c864537c047c785da12d24893e54ce0a5341 GIT binary patch literal 33017 zcmZ_01ymiu+AVlEaDuzLOVHpB2MLe_hd_e61b2eF26qeY!8N$MySoP`!DX8J-+AxN ztQpo~0ez~fyQJ&e-`=|jRg{-TMIu51fk3DqWF(bAAQ&~^yA}ZqT-g&#)&_pSI4Dbt zgUZK94uL-qZDqbXfI!IDuir4B)N}%%z^u9I7soGhvI2%SR;>C)HU`G5u2!}{X%I-r zRRH+a%Ggn#!qv*s+CjionCd?z1c2XPFSAim{HKVcg)r3@IYkNy8+&64ZdNYVcT^%s z6ciLf_C_WG%92w5tq%MpOl9WiXe+?R=HlYQ>cYutV{gjF&d<-!_Kt&%gM$Sq!Q$}U z+EL$?#oB@Te;WC}+mSSOFtj(fbu_oJrg&{v-@wMnQJ9MA^+x~e>wlip(cI*J-^tqH zzuf{l$oBdP8$0Vew*S>OP*v#ls(^%zm94$8g9FgM2)EFGO8!5t{qOtyPkBW%8%G;p z6zt6nKUg~&+XIyy^LhUi)u(A-30!{~rVK zKcoDgtH3aeAPKSkuPGBjs@&#S1%aTT50YZ4t}w@|-!~*x7WvNaTQys4+>3QsT8x=u zel6A*e^8!d4n+7s^*+`Uc~QcdvD&EgmsJ49$55GgMaCm5-SwNB!O8D7E+(fdDZgFz z)>1gVJ=*twy3g&eT&0@|j$iG(JgvWYD&Ny0&>)O3!acA5k{22k6r&K^u)&aFpzwr8 z1aqSL27pc6?xuIJ;joZo)}ekKvJw>8J}ElSTz7E5XH&e<6z`^i;(7&1?ejauVcrkR z>(_2+mxYMn7a_U04-Um}VBR&??WFd{UEP=adH3V0{^G))0xyqO6;*vi-F1)qqAz!+ z&1cUQFZUHMw^1(#mYd$s``+cP*GqzDEmyqlccUZ@BUN2UOf8SQZ0Nlk6y3Mi4ed|E zy3d#2$KBWLhgo>nJ+7SUZ7+K9MK1@am#v$v_Djj1&x6TdZu?zUo#yw2_W66e4}J-% z@P{HL7w?{meqFx&qb!ii4h+SEIs>zBJm14{jraX@rZdaGyK(PlCf&QC zQk{P#3FrdA6Qf|gX zkABFkx34`y!a>hfN9K&pRP6Z6{5KF^=XQr)^lrl+eN1kUF8*au!HXkl{ojR4`$Goj z_n+VQzVC5n-n~5QMr8KC_8`r==`g~^Be&Zd=-j$x&8Xu|nT_Xg5z2;z?!(eiX+_%* zV<~g(gm{`|_24I+%UELT#_T^n?#5J1Jgbh=g~BK1tw?!~Am1JY+3}?F#D zSdV))&%;mMJ(h(x?JrM}U)_J5soJ#uo2#4_c~~4@61Q<*UatNeJ*}?oG%I|w;xC=- zFvhR0VV*D3@NyC5-Euj^1pDFTZ=tB?AZ^lLJX-IoQC^G9oN!k02%D;2yu~@i+i}lR zht1UJyO~0fe~aT@JVZU)hEc-T^XwTM+ zi#{WGbzM(xOb`tgk#E$NT2yQMc_7=$_x+4XBFg>xW$T*Yj61T=E7r{?TTJ}dHC4S$ zi*T&4VPaRrxYaM%nYWSzvzgC-3xmnr5WJOyepss1q{ypwsFpR4)}OUK#QJXL+fB+J zQ%4D5soQ8KrtGgcjLTh1Nt$Nv_t?lUkw0$0Yg+#{?!XLy6sFsU>C_(g%uR+dmESha zx5~4*x(AYb-RcMUc)CCRn`f(EFre{keUs(GNdoH^zz*tFgo_Eg2+?)j@P$v`*Vep! zI`eLyRnvsv7^-4mE7M|tvxT@+O$fA!GXqB?A+pPi)G(GCq%JF%HBW0dZSy)*3*?@$ zH*4-Td6>09b6>s{=X+h(WIi3Kx8DQPu-|&KCV1?aco%*z_uKT!!Uv;4HeMm(rvyaW|0{PLSKI5E$yjMO}q27Dl^Jejm&22J# z;Jk)5e44;j)NJ_8a~FOa2tVMm))UymPQ71lyxaek*`T6`&pZG8_si7yN*^xjoe~dc zJ~9PxJMc#BKir=l4<`)`FT6`;x&K*ovi=65rp!A<^Bk*bPkkO6y3f11j!okt4-->K zlXM1nW1=sQznYPlg9@T?Q+xX)jG~dhi*-J$V^K$E=(+ZMG~!fg0)Y`BIH1Db3ctt9 zZ&@Y$(Sw4C8Fy7;%Djcb8a_XKj!#f+T)VF_Up(mfd&LL^NMc@q*B3U9oS3Fwva5sp zFBn*%WcqLklDcI&)~b0}QVGs+K7&a~b)Bbxg5o@w%^8>;%LNpD%mayx7a=mtZ&zUgAji!t`a`P^s1J-;igf8~2&m zK2Hl6oAA^4CF!`mmD8+qaO@Ja5qxWvf)cQ!f_D%@a7H-pDkX!D?z1PZZRve_z*?T* zUTU!dKjV)**!nT57ehuB%I-0>ECiQ+<#o5xzw7t)Z5GSw*8&T)=dOxBrI#s1SnZd) zDuW2Vk`PJ7JW0O}W^oE7xthi!^D#s)CNPQr>uR>oSFL|s`*6Mpzzk3^6uc8#7-NB_ zPJf%OnX3FAh-_I@P@ZZ+-n$hXTilA6+)w`B;DA_Y*26Kw6@slG6l3ySlp9%6{4{fn z1EqKiDb&MkR`9h$%k@kY!r41^=*De2eXnwgB0-@9qtbkfuVpJ%xvB5uvX^2ie0xDup`hg>KSBJ)EPGXIc?mITnKb;ET8D@ zkC(v+c@5Ei1|?WpL8cW4jS=pDC#4l;QKpR;{h$VLj9{bgR6DCgijF#dUa=>qm^p|S z{$;FSMi9%)PH>zxlDrq{5rMCwR{6oz{zbV<>z~)4HVcw&GJlzeIjV0+De|eW(966C z<`a6pew(B-&IlLFtT&`iMj4F~Q0NgMou(rWliOKwQHPCW_J}3t>VpW8b%i-P{izlG zX}!t)!$|`^Fv_(qCm$n(lwk5ZxVi(ekdiNZ6&Un}@LhKfX>s0hAf&BA#bHKuG6$nr zvwa3D#LB3F;Z{4B7uyC}>!iYyqs;c9I>>WTa8nkCQF+FtiRg%DJ0F<-#Gq${!P5*( zE|JVSxspu%h@nB_Tf$ zIttVkwmJ$bCi41|6g%?Nv-X~`aTPgzG}k@EVajy7wh(D>6j3t&^87|gxwP33T)!Iw zg7OG{`)#j^$T(N4K4r9GM`iS<1_f;P|=$oNyM!5kAb?jB*O> z@3iH=_fnOXJ~(N@1M^Uen-Gq+GlMTif_Pq{-umsY`K|Lf0N-xfZd%>XT5p_}t$5x1 ziv!i5z$B?Lt9V6=K5nAVe>Eko@>dWzq^at@s*rZ|0wUP}!XU!Whn0N}CZgT zz?m){ZuF7Sw$8{{hDqMZ19H>N_3JN4ae2PuaRigLSBG3+vh_?2gTFN7JmB| z%c|bBr&E`+>S0#@8R7zF=JP$?c0$hw0FHSi-^Z0p@Vm`^R-cSj{_dl>5cbSkH>13b zSTV%)$#&kyg@WQQSn|A}-`in?y+5xr?y%hnJd#3MIpK5g@`?Zr{XtXnzIRnoo|cxv zk!zR?+V+FAe=6EVbWHLS)C4vIuuogA+*v$#qI-3;oxg&00y;hee962W>g4aiCxoWyVwJoG z{@kCXe=2rbH*N;m!eoriw_Vqz3NS8Oio?*taBmu{10B97#pdT_1%lBlkQ*s7rLct^ zOVqT!O9xQB=b3vZr*~EpHZ#fx&%e3kv<_l8TAu%AOJLHieAP`+0Q4g^99M8m zQ0%zX7qN|MSaV~#Pel5*k&64-R%#Sj*$c;EOQl(as-e{J7k+V>Ty1`M^h*JU>0bAT zD8fK-3%_o=NZM7D!4Rpm)D__66#*7}lyu}O?i*{8NgMsj<~CCAJ%4nO#y%no4*++y zo;LkK6MeL$6WAt~s1t5#Ztca>1n{Epp5IB1bW#0N&Rk!pjk2x;)aOD}+$AJzRxMj2 zH_Fma(#ODijQ46G{an$TpMwmXq?U-TbSklxKnY4X*&zzpZ5!Nui&vkWOK zRm=@5_T6<*l#$4Z_05u`UkOD%OEJd`q#hUHx<*C+$vWbtN=k<76TbOim6p7L|F#bx z4^3djnoGf#d~SP3xx!fbOS$cl;3I3(L5|5NS<74-7E%#zOD@mzgampvqO?_h&iy;g z_S~5>+&W$;=P!$|Gh}u>n6NX1l?)}#B99y!U!E)YuEfw*Z|!c|f0d{pLR3*FKQ3>d z$JsVE4gz_ERdyg=4u>Om0%S5bN`z>b+D-Q=b>8)Taz6(5-X~kukL7(*PN%>3S=;MS z`l72(e$bzo?EC>z;E&ex6V&f$ZKWr)coy_vWq4#^FxIZ?8v<*GF$GT>sf8JQNvc+S z;mHUtJLi6Kp{x)(ywwGtR%CZWzh`reR!_Cw?8+>^(39k1M+uO*2otVBj{V z+@m2LPk(gxzs~F~;7hc?Zx%>lcDc)$!R2yF zEGR95m-V)9^?cx~X@)VCR!awI2Ce(aQp9fn-Dc~6WW#0j*jkFrph4zdbRbY5dS!5l;4VcG;+;kaiwsyf9Y z=>23AlGJvsv~T;dF`I*8%OCBtFkjfBiP^6Hz9xAdW1*??J7e8JNv!@@2=Ih?Oy!M! z#o(odzK{o97IPXd&3Pnmb)E0|i6@`wojW^*+Ktxb1dgVl4rJ zPJ7#*axs;n(~a|Qdi2JW{pl8h-&R)`H3eyzh=>Uda`ZpXC&6-BWU^`VQ&Swp_{QX4 zm}!^BKapC~p9iXU01BYt7gy?bdkYxod8vKaJMDP@hgZ!*hF6;eL zf*CGaZjTV0zuJmYKREtuH39i}x9O!#Om5EuWZRZ``lz>ikuG#eq)z7e_T`G*$*NOd zCTRZOXVX1^#Muk8Hho^OXIT5qc~as|?1&Ol5KQjXn3af4oPrU<#&0Hzy(gF+s)}6V z(#ByqJYzvAFg%=Hmh~~@$(e=I&BUIH%+}4}MWBv^6yOQRdx9A(Q#9SuZ53>3atcWR zZWAH>7lFOsc5#J;IxK>j?H6CN;)+}vv|s4;v$Z2gEKHpx1(ThcVjuaQv}Oofz9n#f zfo|=rwmRgfEn3Gd`EA^WQd#KrXx}{Zo&|tYYj0Qkwq|H+9f%y=`P*6)Jdaeqth0N> zcoy~~XNJs_!CT)w;8|ErhT@T_jj3c5U z4gI*oWfw7~sf1&CV!zRmb_swWkZ@?s3m@&h)NCuLLR$&yW9JsHr{wJtzJ9Qf;Mxj9 z-WB&nJ;tz#{1W&;k;g&&^A(=$#AE+%=i9 zh9f|DrPZKe;(nN6-N7cOU>SKd2C6>Pit z?6yB3FypN9?NAr#=DV$-`|>C!ghHVU%n#9lBYf_rVgp7+d2fgL;OFYtq%eLts%ctr zt3Cb5AP}qeJk_vQPH}E4nkYBHGK#j~p*+{GMlOP{nVV(|-fHo$#4&(qDWJbhFnVV{ zMy>!1v-6B-i`gS==zTA~?uZ)JFM|E8?BoL_svjTve)^*S>fs{Ta;_N&1k0pj7G^g0 zr6|YA(&4=OaDYB}lO0SJHsO>!V?~^c%*uXyVv5Pt!$+(Psj=E#^x~n6U7q!9?1=J( zrD{PV*b*y}53yNP`7`rOzdvmVmH4-MM@qDT2th$@3jN%ZQZr@9ym90u=WmO@@WBaS zo@M9oDwh`7$BcJuH19t|lQwa|yfyNsaX9xQ50@3ihp{*85PMf_(z;FGDVrPCMdgzFps5ZYd}1e!j5@I;wmcoTuYoRjpdw3ajUgjqTb zqrqCHkqF9(&-+{R9)`4$oMpY<1)rJ<0g(*ORdbLEvt;`I^m-mBy6Tey@NE)7SBng z-;j=@wX)mV7k7UTq;-HWA;QCLWnAeHgD0gq`k59;vf8MwE5u&nRUWV+mS>j7C?PG$ z*3gSPz5Lc6$cv|IvKrOG7@7rcAv=qac&UY?%GMl=Ydr|1PXisUd9)w1PW;(!^EZ&q z+_IugI4A(_hX6y5!JA~W*O`lZ z-6(`U71{)8{dqTEb&_j1uCymJI5n)v-wmTz>yD}T7#W)_IsQkB@q!P9)U_8+v50nW z&>szUE!2@Pspq&F-b%mm@sy)-_yKMu zF`HZOidT-IgKnp3{WyA^z_*gWhN-6}8X3$7nNQam7BiGqCmH*K55EAWnqOV6dBQlK z$$`u7LCRrS*b%}p(KLJ`ryJen$0 zN-*3o^)|G`Wd{ z*am)8?QI7|K|KlF2SQFZxfW?HaramYmSv6{SoJ`V9UD}&?i`68YnTDbiXiy6y3!yJ z*W3$_FusxLSEYClU#0)rcj%-^=Q{(JTzV|rcLFHHtA3zz#5-4rC?@q` zdcKbYqfIQ+oY?mmtm+4o(!`5_Zxez;5v-ltMiEsiOLq1-ohe~{`@DsI%n+X2I{eEo6@Kp|x zb~tqmBeC>GJX?GQR1to>6HiL;>o-kWX^gr3^RqY?w-lzTm!;98Sfx!5t0s&zI;nBlcR3c-DQ#iiZI83-t zbm|;oE$k>ps)GfkolmMfqPZFtB{&N!mnw)0pnUh&>aQ5OM$1+WWy`C2P1MnWk23{}5dQCv8B2uM$;s425Mb?)4xIbNk;sxflq^N_ zIF!rI)9EXt#%^}9X(PuE0=?E?cdx3m?CWOgz&D|ikBus|CJ4F!fQ zev8SX7#f_3qTM39cZiS~gcTm%3`J;~x=nNyKrkcJniK)CtEPGZ5i&CL5uI;50Q?5- zi$yqn1k@s_e9f00N0H4VZQ3mdoLYky@ybU z=*rXy8HfmZ!(E(JBj&M);MP|SOD8&I?D4YPzR=;>T#Xb%CbC-q%JH7CMddP@HY7Sr z<5BZ&csT!Du*JeYZ=WsL?@`|_7S}*SZgOT?bx53o9c)ZFn`7UldLgt=UyTayI?UEC z#1^kVzI@#>C;g)%yue4zU_J&XB>L^v2E%iu23!u;%zrfyN=lCdGWX-n4t$oV2U}kY z0c{oMvA9AFG?qYuO?j70&+AQG&K`ix1a!onlfEMfxvgm92|B6GMJCAnjU)$H+!3YTEeQuKm@NV4sJMd0r)` zMP00>2}~X!fdPkNnsqUv2))7lrKVv{Yx45f8&;jH5 zt(jxT2FUHOYI41rAm6XjFyLb?_meu8weR%yOW93;OQFZ7hNkw_@&I@gtit~80~~Zt zr*n{ZZCBSP5x|~c(C$=zjqZIbae1fhvWlB97W}g6vd)5`%~R=Unh?u>=Gre9P-p*~ zGv4m55T45RYFKo-y0 zU-J^7pBup=j!?;+T(^*?y(wy(!WjV$h-o`4Nc%D%@QAPLVdrbSIOz39bG^DR1pLwd zjYH|LY9#Q&8&|+}VBd|(i&FbI5GKdFs){h=`wbT#Z`bSP>E;CxZ50u@l~&ZRPXIU; zkjTFiEm58FRv3bjd?*NJ@Q6PF9snEfvRJ{h#B74{noiTLo}Ee|Sbc06pslW6?Ew|E z4V(bG%qDt&kb7)P84tnx0{x)oHev&qJ{*4Zjq^Le^^_CL15blsKS4>Ki`kp z#@08g)_V4ndkYyaXs+L@N%66ZCJpfK_+jEum<`|(Utqe4=gB^zWe&?Y(o&Dnezrk_ zGa-URZz`2dzx4mpL$~?!4A==`{UZuz>Cq_I80y115qj`wx~SEt()it$JazJh4o-e7 zbOCM_4L6kz!m13_R!X2xI6ec?+J=|g29-^w_R{N8Y_@CP_p2ao%gbwXNjFl=fPtVr zB;u9wK1Q(56Y~(%@=K46iA`(i{#;RsCm*aB&6$I=EGs960R~p`vF-BmVHk<6<96-h z@)iQday@&J;H@7pT??W3UXUQ+{|MwXiap#w2BjUByWsCT@pQAUQ1h9gWr(hvuUE&3S#af#07Qd>394j&N)`rW; zgGpF-OaVQ7b|PH&(Lfot);~-5T69sroZyofPsm?16u6a+;ntG}1YttWb%X7<9Y4Zs z{4V|`xD^wFYrLc>I+9YdU`duU1)Jdg+Dad4K}Nn#ja!Z%oAJ5A*8sD|=5*1n_XQ$D50Ji)FU$i!C z$qpb~Q*GNe`!18KA--A*7~hf3(Ye2nJBY0>E^64J*-~azZ$)ig9$Li#k|#7yegCCz z4j*!kKV~~HI6{-sO^z2}%}YU|IVnZFzyA{P){HM(>W)=; z@ZweWyXg2nqr*TdLlvg^)paxQm80aa?JB}{Sb8D9?SL1;5`OpD+2MENJ=6v@=x!SN zS$We$9H?hf{>e)f#s0yXU()NB)O{l$kOlQ`s4!SOV}zq-_{7FWoKH+xsP+bciRws% z;kTt!baA3f)34|za3L5ld*2c~j)#-uE$MO7_+EqmEmk}cl(vO8khTSbjV*c~_lp1y zN;o`?NH`X*A}9y1^&>+TX*f3=?gT$OLq{Nk+V~HO6k>a4p7b(Iw;c$Zt61dF!7=M@ zE%;U7Hc0s?S;bqlTwRVW2<%WP^ot#i!7Y@p3Z8a2t|`$6TW>`z=2j~RT&%ewQ{th` zTo~(7?y_`)V8=_13*8j?655vbnHzou{2;WFG*iA^iHQL%TnIE@q0?%4W6{&@R&Sy#Xtgl5i znKRe7ufXb7PuNXih0yZ%ZlVX_xdn%tg+y(~)-B+qse6!-n34OO`f6E8{mm*YP1}Tc z=1G!%!>qK7ETYsXw4sxKJ7!?@R2XF83uM@JK6PzUy?jfy-KY?5JHv)Hou>L@5svK~ zz!p{gXE}aR83DjqZGrA*?(4&R!DhCO#J-ntqW@-8fNfV%8H9!~H2;w{4gK|Y?NWD` z)hC^3l{f-`h;ey#^c_$3Le9o5uHDG@-`{AB3<9`VWm|(R@+LzyVUJ7)RH}uGiHP`$ zfk_|tevhyiu}cH3HUq{*Bm`Nh$`zyuF6U?=Z#$SSNd+8<77%*TKhy+HD%ONmW^tF6 zT^1WmftXxXk&s4WvQsZHPYF2|bVQi>f$0id42+F{xGjv|KiJ+G(&Yq$ua_*?$U2Xb zy8wUGA8}0HfNVRRSqVvpIbRR>COSZRfM0Q0_jGd1SRx^Y`^i=RQ(0O<0)#D(+#zhf z;Ohv(<&e$2=6=iUBGTL~>iD3|^qMMysgNrYJ%`!95=ijbq73S}@_GXXfSO+ArvLa- zCc};4n<$Lt-*1Wrtptsur4B1*i^Tj9e=@!bmJfIFo57d(2gui>+~CQ^vY8LIR2cTO z(}w?nR}Siou7{CnqGT-@g3}}+f3#M=dfn|-G@mwQ7xs`Qe|alTsmFRws=bUk&%j5G zvfYW<$Tw4GG-L@ZW2vkw8Hp#v!`*qu!04Z?}#%$LcZ^dDPJ>X!rLS6#Ow zHd6ti^w^*LQSU>dNRM3I3nnrSb~-{>3m&mTsIwS=gh#d6?7hUqdbrzvjI}M!zg#s5dxCbbHF1r^5d>!dgu5ceI^QNybVwMib1nfo8skI#WSd)6W2`0+;pqqXz8{%Ao-SmVy54*+X1KYO^hTzUnaFTwm<`Y z{~j=w4aCb0z7eAcg(a>f&}WeM5)!%)k!odmSRXKFiUO3vo7OYW$JAF*)RN@Ow2#~C z9!utvqR11N$x;ij7oNw4E0TAFVy?KH#f(-VYu^Q%0xNd=`zta*afN~ln`s)>GFCA)>w#n)ehZC`OtUw&m+uI`P7C6F94iZqO z05o{9iSFIFq?ac`sru%i7xA9VLyxAI^56(gS(H()!%w=^vzw59*<%DG=umIJ2DX#;;|ec)CZ-AdLI1kbR$UgT z*`n=k&yW>QR?*5S(pvmRZNN(9V=mxdCWzIss+;{%g6=jRfNzE7&@@&kOV@-+rN=)E zjv8dK1l$%LG-@qC=792prEH;Dn#4|W1RXKvyXV9K#1YlBtw-BY?>C1rSxoVQSHlH` z7#-BOq_zpg-RMmun$=F4N>kVGj#Zz-dIPiRF?yeKiMc=$XSFqr;`3X;L}FiBR*&_0 z5=)}T}utVCCRkdGxd9&)RYSRP#Cg$|NrTI1{T499n$)xOde4P|UDHG~1_XZf4Y>U}KtvCk*$VGA(pIc3j)k!$u4 z$EKH(fdqdCqP1(5*ll?bn&3t72yCgX>s}AP<-^_D@AlGOeJ+5ns$J}$FC|enTJl%j zoQCzS!!YJuZmiR?CdvW}NpzE$*;jU-gpv1xdI+QvqeKDVTeU8)*h(lWmLs-VfDhOs zMez+C4n4v@&NiHkw`jSs|H>Y=r8%oFgSLYnZnupLbMSDYKU-kJFQ|*$OweXJEG}2D z77f#9hQkigjS2i=p6LIzINVJ3C;**QT_D*H5CN< zV)`*;m;9$Ay~*1QzGgcx1#WyYfm=tm8pX6|9;rEWuLojwQB**vmbVJ&uDt zuV(~y6E!1oPb`5|PrE#&FN~gig#AYMiVn9g#<)ODh)J%*~=ZU(M{Kmy3^< zM7;#$h^`w>R1?XZAHfFI#DrDVhSUXUa+`vW_Uacha9ztC!$#{}BCQ8W<%U=9@9&)i zVr=!agSm=jdq|fQp*XrBhE_fL(FphNNYE*Mh@+J)Uh@dy_+y4JfVz{l#b}wd){mJ} zA1_S%-)d7Mb*ybKups6n3B930@Wk$7C+ZC1UrUL(_rwsU1cC4aWlVOUJd2F z|MiL>Xe@NV>5vxhVbaR}#7F-7(Fh&>4dhz$LyC9Bn_UTLeU5PGkDHKcCMXk@iyFmbr_MJBj?C*NEJ|K9iY(Goph zmGr=NUNi$sw}zhaAmY6&8Ch?2DKj*gQE;|CmRk`w&(oRL8ybfI(TrO_R5b^s}X(p*$OZ#+bE?8_9B z0N4YSN<0Bfo|YZv&FC6tC69Z?x zdh1-n8A#*rh59&x3GxHb(kQp`we=#AwdRJ@r4Q0XSsQnsMA<`ot#%tdiA~GrR*p z%VcY`TBCXArXd$mY||>-7&1Sg5L+V(ilUznfm`1`PiTG1fdw-UO{i^*3`_J6$FpO> zef!NUG!?R>mV)S?toy^ei7{oFCoL#4>3h_&$gfW;NaKqyT#h{_gmYXfFgRfWLY{&CVoad(tx6eR|G@6yKc zRoX`vyupTBdOa4lRI6eB3lW^~dRA;mER{$W!|e3{nc4KW{3<#GRWzUoBfR;ycVby` zugR)hX+mErg(5#t1kh!QJK=nJ#DJPSWokqge$d_5BL82F>lG-0;QL2}B$!KvCtcI6$8{+EI6kmUHu3ND38t%N9Vg3&X(0wt(JVsK^) zM%hfXr0kws3%{Yop$xzpi(n!dbjX|zGC96mRZey!z2?%zJ`&j6GYzYvT{5`pUo6M` zY1@T(LUg_$C5WmDlHL}FrFtBKo&b3Z_GhH84Ds4ym=UgU9;%3_6ar2>zrNImMRVsU z+FBR0Q6fsHR!>wIrhBJFx1Dz(<7+!AZNk>l34I_SZU75~UocZumnHMG`~U#P$x!&m zuK9OflEcqoPWqOY5n}S!^b1O6?emJ=%j_?>LLVDd<)3fmaO2;)i)ku?Vl)~-*yBkS z8?L7O>Ve()-RPn#mA+;GOBt~ZPd>e$qKnp!vh^`!oAERk_i-wzjfN8rg2^n@vQ-_J zM0vN;5Jd29E8LEY3V!5{bTdK(S;3rgr{&)t?wNDv)R&;<%#){w0qUqP+T}wK@bG9? z^{#yY{pRYT4({P9JFhY^*!;i*ze6}+v>=~- zWJVhKu&j>cnF;y*1jR;M5H%>0aa4_wZpuNTRP>o1)jAZ$rznk2t=o};VCTKjK@BEE zJKIx+w&`_Bw@rY1hRwDF0Pxy15#VO`;^+IzIQRJYNN4^WQbYYW6hXqM`xfzSiYM*r zZyEVez`ObukD67PE(>J$wi^*|?e(mNz9_!xVIbJjW_FS;yLgmm`A0Lc`Fg`?x(TIj z2-mtr2zT|L^5*jTrEipgns|Ot!Dn{+g`G!Sz9PHt^0y>Ci9O_v+elsg!)fz!M7^4s zBnob=0u&}vcSqJT-Q9RW%-4^xRnaHw%nvPxRNO+WGFSkC0SYaQW|Ni`gEyN1A+fj7{JUWAwF9uGzcnz;!phjElr0K8{O6F2fw^d2 zPJjL z@21oSLh#QhT*|Tv9f=c?K3Dr_p}p`U#MP9n?4Vl1MKl~gcA=obFw!rI`SZz`X5eQr zD&WvuQ9>8I@uxnr6Nhy54&+5}#vyeiA9&Otpu~0Aq6j$M=w`b5cG#R2sS=fE&DAj2 zYT+fZC-G17J4#n`wRODdO$MprzNf=HZ9szAwcx=U&UX+NxR!`y`>d^6+Uk4ILD_FM zC()xOz9Il?czmKG;dCt96BTh`v%Z{cp!y&KNV`kP=xg1Qx?L(^Wqb@pO#U+ALXE-8w7?#WjUZP8LW}3raY# z-F=bb8Z3h#84i*TR&WTVO~hamsx2mng-Mz$4KrvHN`%-c1&X8Z|JJK(n-6DgVrU85 zEHxawM9i+M-QM}(`@tR6iRxipa^P-bi;vnJ@r*?UjVlaIyg0Do3y4IJ4__5V`IfZR z=e;tMWK!_zJLv^?Zh1i5}pT=Jq4#OV0Y2hIvIp-!?>7D?q@d@fQN}SkGwB zVctThCO3E!8_~8_*bkwV?aPPbO7sC49Nz(5GDF-$fCfRQx)}-%_dxBj62nzySf@Gx zJzy($1B;Zkb}tTBg3!5=oZ+#mfFNu^X+9uMB>~8Tc(=HFWh&WcjpB%Ul5a8d2G6)> z%30$d6!?OR&9<%_B4!`A~UO)}u*L|#SBEqd0W5% z(n3K^QY=J3i0%EQG>Y}4#{^zRpX>?s5z>y59+%#HHdT{dW0GC`Q6Nd zJ?kVQyxIGLC|@JSkE{-LM7PQ7G^iv7^OTs#l+Wg#EG$7a7Aa%zk$R86b$aLah-j+6 zk{HROgP-l@%z5-8&W`{ie&~o6t~Q^JM;2vfiGqCjNJvy`(9)tM8=qq$bKG<(Hv%T= zdL4u)g2HvYHR5v*X5<$MLU*#(IHqIFq9<{YBdWqVR~)nL8C`;-~zTUV&vSj4GS~)MR;hl^>aEKE`hMm@kT_*KIQs8 zD@emRiB_?%r(fWBlFK^(T#0_13xVy7 z-#N?jNBcJU>{7^`TET17x-9a;w%i1@h=@D4@&$Ep^Q?=5I-Y^lY=*DK-y9W5Pcsb8 zvtMv6hSW1ZN^BPd5~+IqUjT8_vONp69L9zMOFMS;7M84#H`JMX=)|}kj)5?rrh|_h zt)9_e#_zGHCmyr=Fz>&F1`<@&^-9u2wp1Y&^lzfYG7&_O8aeARPiSTA{Gdr&taTJD z0 z&xKnYU9S5>#i0l`VT`K)2e?VnS}-wI8%wu9+rkEFR2TIxjs5KJpMKlnTKZR_Wx5(ajSFt`WfscU z?sbs(WwH6jYVL3^+Sy& zZ_Hjt3Kd9oQl;a7jXylRFLG}0N2M#xFmnyc_#{FK@ZSqc8+YK=!`O1uY}$Tr`diMQSE>rV)LV?`*IGAHn>V}VCLcQzF(Lzg6?myb%4~Wce5Rw= z+c47qtFgBVYvX~senTKgu;32CDelDz!KJtrDDExpP^7`3xJz*;r4)za6nAZ*cyV_r z6#LU}c)xR=_u||fu6QQH3^U1O_UygZZ@rX{`(*ow9(*23j6XTU)0!@fZd$k%1xqm@ zG|h`in{6;EGy1_?_bofonGL!|9gmq9_)E^52^uamA)1w}{4DMZhZNI;RGj(k#TRQc zO!MlZNK4CCWCNJ7x8QApoQtx0F*icfpV2>WRpK$LQq|Vel7Ia0Xmo8(p?op^uK$X+ z({@=^tiwu~Za{^jl9;ZI<>-B(CMJK|_gr0DA}u6bVj1PEng3Zqjobz?jDk>#ru{$3 z`=j1d=J=|IvVr&3X>_k&zEnuOfGh9}86Z0cfUa4>Mj$2`;e*hGz@!8UacX=KmS;$~ ze!fRGC)B)5W=MmM9xlT+dCIZs8mI;8hJDm>))n{9GFRW!M9O>7M6EHcG)GO*>uwsQ z{G$2Xz-^_d@vRo26xEvYYuILWV=xCxI;)S->r5+`3-+@apPTI)oy0GhYrr-UH$*pE zUGFNb{$PqdQt}E_8m^7PZDzpo+70mYY>?zBy1r8CpeYktXT9M(d<~(8X@QJ-gD3S# zOkus;GijlYI482(&2Zuk{R^{lh8b7D&=;1x{Pk^c4u^#By2~aoL5w%)_%tq!@zxy1 z(v#pZKZ(Bc&qotOQcxLi&6%HR+5Gdk%{gS2{BYI;s1In~Kb$KOevSi`ROr<2C__f6 zsgwa@Z&A4%+L!<6Bre0!`HbB|Ze8un%0%7e)Hf2u4xZ|w#U|nrUcsG``KGO}9K-_}xghEIN(jvSwsM!VNAb86VLc+nm5 zbql`e7E_k1c}`-`T~V7CZlzPWZyKOU@iOTQzfd*<)z0y)U}tlxih2#*`5x(Me@6;1 zKr}C2^S-wN5mtZ55N%Y($Jy^2OeLoQCqd!%Bas~pt8*7Q*F#L#kNt+*}(Fl@d$}} z0y91A3-XCUVtpakh!%WsF`q{C!;Z?@oO1P!Pzia*|I|g7xHbGkHl@MxLC6Etcy9rMm;GCs*~qj<*m#7QKmtXJ7^O&_=cj zI;rr9(gMFMeT_c2Lmg0l~}xBB}l}K<7PbHk>NNFp(Zj1J(gvJg>dw!0~h>dPPMZmPrJ~G?{}zEOg31 zT_iJD*s#f4&LNp>ws1J_TPUbDV`O}VRF=g)L9WIlB8A)z(#XcwXp@RCsSVnjsC5O* zx~)f81TYN3e-X85#(?-+?3L@E985if6@r8IZ}~zmYcyPYsizx{j+i-&1~}KyXx4K3 zq3&m3LAmc}`No*^pIl)Wi3CGf*0#-~dt*^!Eb8?B-{`$9{^?jxNvFn!lX2+h*+WU- zE2J!RVy8l~e@LR^P2$QGXXwXn2u=iP@PGZdw)p2ytVV1n{dMl^cGayGb{92>piqon zo{b_yRR5@T?A$7@U)$0XQ;xms=Mu2C!|Y%4xvM)`FfO_O-}%F{C>wXINC}xxK>`zs zEb+(>2DWE15+(t@E0%(mUabQ;obYyjBMem{XP7V;l6b&}#v~q%JXAG5Qg+T6D0#Lg z#+j}sm*$n8YPDo{NdpeG47_;%)!}j)yhpI45OfL9A7ty9GeirKM})d*@tXbUw$XlV zi=^^iKF4ev!UOb+DfA&$b3G;ksJ%nDVJT9iNW7X)U02%o}CzT^|fIxYt0 zEd+^-sm43>@!3@#%2|fMSpYF8ToX+sO}J0nGbZ6i7VIos&~rVAzKJI}@18AMuj6dwysS6#g5eF*6min!-w*0Z3;YM5mUS0>@kHPfEk*vrrPJG8;@i&rh4x;v zS!pbcA#f1%LWdN@y{y5F?2~aOnDEgDt``c2VP%^Jm+jPsRuv@!C1u&G&|P#J~ZIJJ!Mvt&$OVnHxqI| zDI*m70t!G&>IOWuD&jSOkl-&3!VaZwyW)=Z6+G`%%flZLD4M$_vwuvxgK0c$ID{*5w$J!w9PWarcVFoTQ;gb~+j2Mt&zi5|3Rx;vbwjM=(d&w2aBimQjZOv) z#~TSDLV83?FCMF8BZGAARty(;IeuCiN^xcg|5ZmeISHa_fQK!pEu*G{Ol9K2q+=xP zLHaefbLCCt712KYHH(j_joGI^Q!sl*-A$W5)B5W|?GHLIZJ8@}9ka*2zF=LXXA6~M zjdY*~mECB%=;vrv%3!fIIw7!^pk%kOG8)ST_$TNIMY?LJ}Ey=GI*eIYT&ZG zwksC(qkb8oo+hl-3~jJ~IG&Y{f*8KR?(s6>ZZm63?pTn9q+B?X}u;b*`+g37k%Mbhk_DfG!)NTuja3uXtFjH zP)^i8(qrd~vFLnPbC5`5Gsj8EhVRW=)?S%U=>-)=a)@?|{`3z&g8cH6QBUY8 zlYsW{@qs12Y9_bL=~27cI3B(*RH-g~6K|)zx&Mg;mgd-q=+XWTw&|@_ULA)nwZGc8U~lKIJ97BeJ$4v zV{QkX#yD`Bs&3$yx~oJAr3TM08QZB@N`6HdX{b!zH!?%(B}5Pedw3lxt3 zT}&x66QQwSqCB6v?IbWRp5>c)2{{{Pyuja8kpaz!#Yt1SU}n>K&i8K*3Vb>Lqb)Jr zx+-iJUs0F@l37f~n-x5Kr_}{;u_kz$5gkHtL3_3z>jz{t3hOui_uMOtYjJu=^ELNY z?5nHA#ezOpF(96I>)eTS=FPkcL41R)v8Cm2Sd!fr|1ltg!iQaH3_L;H>53GqslT?n z#n6QcnHK;QSE*x&kXq!fhH(9ljwTr4$;a85S97)yZ1RLc^|=-0>ERjUs{K3fzOhzK zkV~f=GK3>R)84{R?ecXnL0qR{hKI&kZ_}7pzi$k^c29Otbv$+XC-^<_%(8-A@7Q z=c;cdI<{;Br`4YCH_c<&RgJJE5ueLsM0Fc?(mGMT6>8FY1z6@n0%WNlks%&md8n42y!S zvl7`vOHf0i57Bb$gbR^U4;Ip2M5}BmhPkLm*+_0_cKO`0Y|^y|waI1>GFybzb)7)X zY9#shZ4v9+V12!HSPk6s$Cb-&Nh>K8UwwTBpk_g>2s>Zf`wt+ap(|Lt`oqt*=ldEB z%>oS8mDbq8KNj&1#Zb497#i5-{m97V0k;cgiL=A2ry}+&)PGnKRkVn*OjYTYfrIl- z0|b0i48ESA*~6(gPCvaPb_I|ZGkjBT?N(X_iU`m4xQUkm)vzj&L&vdRZl2o!g(a+S zMO5-Lnwb9C3bOCa-q+JQhRlS?t>91sm zk2MZMnsc7IcYwu_xEOSyZfbVx3)Ktp91-0ifFdyZOP^Y*m<$rO6hO6MISeS6X1t+h zEe4(eO8u{vUoIKZ<7tnLF}tUXbW|Sj&Bge0y5?64G`NIaEAT=0AgxGn!RQpRc~9OS z61bx?75QU5_a{>72Nf zJjPM%0%ob&qnq_!FY`roD6ys>(2EjnL0dhIZ8}yhGKxZe%y2}>w+isg?2SIJeFgrE z0Om#A$Ej{O4Af|v(Cw@!17B;1PK+s+DihtFePvE$p^u`Q_lZfQE}`eO=nlhLc-3*= z7|>Ggc|_yWvz|p0(?upRf@C{?W)eL3Q4f$4`fB?)-BNm|HJ6{1%b~<(<(ij(^l+UW zkE3v+Uru_@jpCrn(tZ#f3Al@=2|*qFo?rH}Hr(`=Rj_f$9x-a{pSZaBv%N1zzu&ey zPsehOgZJE1;v_trbtFH3I5&f3SR5V5{{ zUiRl#u*e^gKlWNb&M=2VrkZLAKITW!9|XhZMYhn3Krlv(xZcM9s8La3tw6t@=zWuf zi6J!asAU5SinEGm!?TmDN~0NM(XVkyi81t*WjIxh@i9KcI==Mp0OJ8w)lQyJCPXhcJDdJ0BwrHS&Ri4@H1Gxa}~ zr#$%jwX{uT3;Nxh7KN1@?l)zKG^v70v-GTJB~;?7G{f<9Ro95*3IfA#CeG`#Rxr2UauW_Dbk{uh&R9+fFP zw*dQm2Lobq#K$DIo5=yATenZqPk#{0772)0$XW}WjZb$uClqhkS^wjUBT+@_;*KP&ij(5`KXdYMx zzoNhmfRc3^KIIS(JW3{cBGJf{e_lDMWo0TZb4ZB1yC)d}5B=j5IKW<8eC(aaSdn~A zuv=rsJ#97nMMq8dot}37ME9$Yvgbd(b$`Lg<@m3prD3RyK7*_kTzH`>_$=lNAhpB` z7A?|s*EK{A7aJ}7EJWqV-$kR6^C+5U6+vEm$Enbr7d!r5PU^yGomc#k5bJbyqe=a> zO7X}|_dUu}+oe)QOLRkIz_>$;tmkX?{r}vI%R`1;k8$`E>nu!PXrkBwwxaoXSt!B4 zPJ?c7-wrtzBr)E(rW;*BlL%L0`7Z5?O%kt`jY?x#EPlpC-3f{Y^PW3`3NM+sXvkfq zt$fC-MawI&M4cg|F!uDWQFZ5x4T%UL4hsU4vQ6u-r@(oyU~uAMSYZiH2IT;+85u(v zlYxRwaAy3oUi5=%(Qp$>i_LXOe9?5eola4!myBSYyD`s{P~=y>x!;wMWI!}J%hZ+ znSNqfWKimHBKGEH7UR1d<0+c@^;W8%+(>nd%B*b_kA_#=#YxC2Q;9Dr<%C~1FB?)Cyrj{SaIRW?VT$RpkhmRI#tXjGs8G}U-O_eK zX{cAJ<|aO~&sMiCxylmS|DTpEWB2nu@_}KNw5vN94Q?zLQzCQR1W>!mdI~SF!vwUr zwz;IFPHLx0<+gFTk=1zDyLxen)+^r(k1vIF^gd26#$*3b#fq{mbqQH7S?6-c(ZMe7 zrdLhFP(X23X(##(o-~|+?*``G zG*&?v_8iW{%JeTJO|)%j+Rp6VTdS*BB%@`^`?ny zbLrVjbKy78eQbx^jF(X2Fw|lAXc5RrQ1BQqiya%WYL>d~BpxNr%U_hL)Si-~EW3%h zABzv=tP&HVOoZRfW_N={jg{G!syKE-xfcLSRbNE)3FC*vm?U>U+?R&LNTtnM*D29g zdXi=52v>mI)gxF{(*q4~JTGGGEC+Lha8ki0Bc?i%=J>fC)0WE~onMEWY!M@+aqlll&G);~U` zwT-s*zqLNvJeg#A1DuccNQ#RoTy-D$vtS0ASXBY8uLke{3?aWjMPt0j(%P?2)kwy4 z$3q1`GCT;N;M4YY6j(oAGWrL2!JsoS3cyF@`1^RAX%{KOfYq7f?qy#{S>xq@MepZ- zw2^CI2fRYb?%dq3`qg2c%+=ainI}Kool?pdUQ=oCWzI(+{7{VM$(I$V_-l0%gCRYp z$mnk;Y6?RxDhnls=^h(R+4=q@7QFe~I%2BzKl~H@jC1c*h!O0ghM=z)Cl`dHJ~tH-Gh)p7>amLK>sp{q`P|FbZ#3`C3aY@Wl@ z?9|-HM+T1eR$B&pBp^~^b#m-;NP~;mb>}x_T|_rVw!e@ATh|}Mco;^M#bA&iMqD|q zAvC$v#CyS}AD2`MB}Y)FT~@bW?N8t+N|gt#%c-4e4xRX!;c1*Gy6mbO;G)z**}OvKJyRUW$h5B0zYrsgh5TkSO#K*$Qjrw{z;_4pq(?#Bd3`&Y>-j z7HEHhlkO(Tr2Sq~Gyxla>p}?_9I)IL4#{kVLyfJt@EgiiycJQZnkivM9jecDeFVkU zyYSyiMBI&CEwK&o2&^XC02UlV%@5<4BnUFi0x)?e{=^#dH*qNZ9}!QbFIJX^Ch7cb zMT8arr1Ei>pJA^O5_bX6jX{-mVNgt#ciY|CKFVweGK~VH<-?2*8!>*M7k(fW76fd| zZrD8B4{SZi%Qg(khM(w`9sq_2Vn{*81l3_PGp~xkBdEf_k=B&AThp~6NA5r7qW?cz z295<-U6rkX+n$xZK*AbWOsk)k0W5G&l>A{1{H3fgaI!7*{Dz-oP5VT+fccuXE*jX) z*O8aN@1jci_Pl)HZTgR8|91y6C~2X8qMx?^|5**#(Esn%G!cFVdZzqO601A8(5L+^ z^kJq(>e(r)`^b$Pj`3sxZewKxuCZgE0~zYyxg97#zg|1|6%Q6sY6TSdEF!&F-f?7W z6kZ{y_Alq2UQ_{IWD#kK_Q~}PPJYSzQ5VG8V;mS$vX<#N`Uo(sG1roLOe3NYAsf(j z)+mLc-NbiIzrBfEgWs#gE67dnqw#3aZ8*3oFlh_Cr_1s2N*~^4B2GkAN=r~?Fd)pX zSB5;{B&jdYOZ^Wko4)U>xhw(>4$S~cMXG_kezd;vTZ@a<_QARpMi1P@)U07Qao zfSj13V-}>?vNbA`*_+3lVSE9=xxatBrz9IqJ?(T1KH2wG6JgpgQ_lsie?^o$bNe6n zVJ|SNw>-RtE&)jl@N6TPuSow7&~BU9<$C4)cVzc^0^kXv9YAl(%>ao#Jy&uA{e@y* z{sKUAq~!N_AIG0Dy`m^ULh-3%lWu9~wwz4S+VQtqdGT@+S4Cp)KR|M!J7o{D*$dtaG{09pbv1T4Qa!F0VHlU=Ih@+W_;gdQQiw#3Xq2J z;%xd^c5b78{;rAk5U{lV5KzoE)nFVrs%Q(B_m%EkkDvmo%HAh$#7JaS*qt`*2O|K` zeM6JHPo{;m|GaUW2LM)}UDi=_Cj&BBN2?P_)~k&i;~D-?HY3|%+IM^Od~+kIj$T>I zO~+?GeRoR200$XhHRd%r*Vlh_iZh*V2ZZl1@PzH>x>oqeFL#Y zMMRy1O%vz2o=m)>gV<}vp!EeYz*uHB8y=H63${ikSQu;eiekjB363XZh8*RB zb?P~mujj4sGkbRG0&~6t{z-)@a{7=!_6M^uMVmkPU_#z7F;QJUwhx4&ihs0lV(BBy zBWgm0QAyzXOg;$VhgH6r0Znu<(YY^!6G@)wZ(hcy;IcT4+OvwNufC}B4nZZ?m}_yN z(o4v~H;Ej|EdlM>_q!_4({-OV_eU&As}mmuj`;}hmVu~S;WTdCY?|vWa;Q$Rk#RHGho87CW_$EYdH3ecDu)YnP?^7!!9_g@iJPc&H^?!^+Gj6; zuZXRX2^JD_+4JTYYIJ5}P`Mv~0US_c`~+}heIy^wdarq}X+Oaj->EF|&-*8Zz#*NS zVNM9*R`bS-_Ya$NI?tDZYohtoF^hX2N#2ebed7ZsW>ziIi`ANrz7x#+1Qv{eivmba z%X^t;5DSGdtmuiPEoj4@8-QeO1zOOr1=q0f(wNhTT!3Sj1&)0QZ`bEFi^{?q=@C+O z$NS~sgtv`=&ntGUoiSHz3csJ}jy8mH3Jp)*2g9x4nK{QA!L2=-QG}A3XRgW9NmzU0 zZD!B4N2JTxM16pQI4qM2$^ZuiB=8>Kg{v;hT;RN>fdZxxKt;4q{~vB06fzUH(UlPN zrx?>J6JH*#{wx+j^Ha2rI#Ue0fi2RJrQnz}&QDwR%209Prer|Vr_-d7i;!xRhuE&UEXYN5uZyHUafpIfW*~>+tqv%*~(gs$w`^H}1Jjaet znl$wEx&QGABeBV;wnU)wLlzTI`0E=$7Iz-SeMW{i&2m}li1KEM_MpglYHpyG%&1gPLa|Y}<`|*fh4KCubpFeB!20$kR9_DThJx`o$dUo)`J=ho< zkuRUk|Erz%WJ(sPc@Qfi9qt{;&|v-=g3yRV=+TV1iw`539}WOu1g-wB^dnh_?$ScV zw{+lM!6AwLPCBf~%rA4sgdb-Ii}>tjo|3Owq1(Ps2++hzfb4>yY#uK77;*FrLab*Q zT_RG4hLa4jDIOQYtQaP*{mRmx-J(I+1e*EBKk*x4GAY2Z<2L?qYNGVRFkO7+Eg}Jt zXb!m~Y3cesK$4^?BtVclpAf=P7e{iS;#~eF!$kBD%VOXJ zJuRm-{|av-Wd~99vR8%t_|_gR2T3*SGAsrgEa$n8JgdTL(`f?UuKF)-I?i^`mR-I1~Uh#1*-x7d)4@rX$r)G*eEM-=#eG9a<{! zAHdD%ZsPO(1Ir!q3EbGR{B_UDp6>E7A~w39zmmZnyK=owd`m0eR)L-aZ7Bz8O6~Fc zPzn;rna2kRVyszcZx)n8W~&spuTGz0kr&?cRDB)V2pOZZIdP@{8~Q2?(M38uPzQyf z()k?a@ie{vocHc+@9?^o7E;Kz1CcCU6C8O9n4GSG>=!5IpWkC}VxR9EEZ~amq3GP8# z{ud5*^2)(+2XPjlOUnO;DUn7G-&$D%?8IWRT{<8vaPaP`a#+784Yx9*8mTGjRUUcp z#ai7RS1Ze(O29zmcn^>`^7`|f-UC$f;+0C@+h@;9tos>*E$QPaBdVKSl(1RHdF zA1v8ULz#fj#|J?jQsh_WNr2YqfAZhWXx-(LiGq85M5A(@`KuyIui89)7Xt&iygkYu zg?tyLO!Aourz)X3{ZGuja8qd7`n&2c`cKtjqi7u{S%S_~1Ku$*|my`WE^T`OB%5mlhG&XE*HR|6PIqVM z=j)CkXGGT{pACXYoj4aXfuf0dCnVqp&z2Qss6kS6xR-k+yCqtztVdLX9As;@cFm0; z7RfUhfsgUsDuOa$&cv}oGan+GTleZ1fg)PaCXK6nA0CiV2Ez=>2f)TR>a6x-mSH(p zHdSAY=!k$?aivxZMfKIt$DC_#$rSG$F-a!c8|8x01n+E>MncFIsX3q#F?Tp7yHIvU zRe)jG0QH(eTrcJi+Tg$8#=robh*6Wa(MtzKSKVTX=yV(~yyFEp-@0X6@%HfGhefC6 zpaaK{V`Ua=1$3}fNMn(1<~?k|pND>8in0#1lqv)Or@#+1D-D6;qb8kJf2%ppDuW%h zq?iSn>zKJiwGhtZebU!N<;+_;&(SHn>EXd_QRLD^MnpSL$6vHo%g&DUUI<*OxjY3# z`}*a30a~sGb!2}eN2^QeAY1x#xwuk0V;6o7Q7mIJ%{sD#5DegdfT<3vMH*iP(>@j7 z#>JW_vq`sp^Vc^4cUDV}R&@8|H1*7EQV|QBq8@DUwy{|3O!6D2#s%ApEM5<9n0?q2 zIoeu&qdtc=x-P;D)(@5~0BIeA{ar3S+AWq&fsZ6GF0lAkVobf>zycsK zwn%?P6BN<5oovEo?u76?D_OhbTIzPpI4l8UI-}-JE|7ZgEIrBsFcK(71@D#5*x&=bX9A1Z zj&wtjxGu=&q@BK{)BN8(6%j2~kss1C1BDyLVPs(6RHB7)6HcTqB3(q{k+TLzNpZkE z3gn%uzcuOqJaA7{*tz(2vtcI_4rBT0C4=Huv&nl5bm`Zt)QH&pG$rFD5D?2_f8Yb{`mNcHs z(5&H97|r8n9*a7-i$!k55y$N5qpoEA0n0d~|KgP&uceB}m6&+R9xWLbgDwO5Ov3d; z1iP*KytS`_;k?Cc$T>1JyZOr#nhOW=CIst~oDMFUbCSJLfZ^nSVeMN4;Y3PSm8in=0^{iOQet(a3I3)K(Y`T+e}S z!Fm5<>r&je#iSuDCODyUWbfSh7}GjSSVPj*bTw!89+(vNGwqUAVi%@GOOTSG%vEz*ci=Tu=7Ib6D4!D3KTcfX^IX)CEE z_W7Q%j^nJ+-2C6b>jgVm3(3G)7a-eayRULJ=hCsB8>PqEc zV8q&Zy$5m$uVr{kp`NO9xFKA4zAuOJ#{)pVbvlKn@2oBROraShh@iiouu&xCf2ek! zI=H8;?G7#%80|%@mpBIb50}cM@rJ|e_Z*l-H5K(pyxloU$lpCO>NE04i_NCfe=)P&mUFXt6bzPK8;6CR| zmhN1%$m*F80H%39+EN8knDq38Vp;T70BD68(69YHC*eZKPdORV2V%je(13HGey;GR zRwJJ;8Q^7RL-u7#4yQK*A`n){$ob!xXK=#ZX-X<%z0;D(%G%8_se~H zk$y-5FdZ$6z&ous)MkD*5X9R_Oe4WTkC*vGSDT502=W9wy^+5m=hArQql$xIVX561 z-IA(>`pGMUAo5CXEDAZaN=1~JAvu1LfBNsk8Sx}Dr|RWsTWOZevj*P_ z|C@?yXk~DcS*xtUs>~ZI2z7Z5g;x}X8@=2AgpqswC+$5z?!d;ArM8qfxcIu=2zL28 zjgc;G7uK|)`{BmwtuWyWiWm~f$A{*2(KEdO+4y{!(<6;m3|2yJfVu8IkvoG@!4 z3m5ap)(Cih3g`LiHIS32@ZpOe@n*O4^SbpFQUVqs3_ zEC*7QM8p>)P5s$BbqNEy#@ZnUkO?f;9YYSOQl;L9`MP{7C+Va|v%mQAz5a!FsRbST zIWXg^ztp1kVDhyx%P~o?%$gc`zAZ z)Y*^i5SK{(ZJE@H_omU4uJrDB`<1f`uY_>dqK7i$Hr#=!kZCr<9*O1)=%9f(uoc^C z?aIhkl5q6?SZt-C2S?p^R>|}(zk_6(2EW^<>xn zE!R=SY)FIFXc2(ZJ(}~K=r{;}6y|R-Zo4vZM}_~mw!gY*RPC|x?Tv}^)OX_^Zus|R zQ+zc(6V-{rTbgl*?lO*^99t#gl~M_LuG+*C8zUzLE_@b=sp^gH35k5l~v2 z?!pjM!S7K!j0Nd=Mm(C3={h}ITIbZb+(gt;ZPO-nA_L3*wg~Bd*_1(&Gi+u)V=%kA|i& z{d|-gw^>MkYV!qq|5Rqxnm{E;uS}Wzi65Q6TzCL>8FtUO|cr2umJ_>E}A_SxBDaQC{U26(%ZP$ zPy-;Aj0cyCsAXZxx@zHL3pY(y%`0O!`DQZ-fC|f&LW32|VOT-!LqyY=dHduTah)Pi zqz*1=>h0hM<$C7=gJZY?&U_p~m5vxjoZtNzLL=8W$p1!=rs7qpHPtBac>y`(V{->K zR~pplPJFsa|I57*xEnzo)^YghTu;P$!)iF}a(t(7l(WKu z1m_6duoR|MDQQ-{J{HJ3$9X;KoT{v$exRIVOG@h`VD0UC6=T9+>FOLwXHm%&889R) zKOQmp;SsU|kSTU^!bh;S3w^~qGrpz0pl~dzk9%2+Ytht&P5yD5XWCvGy@$C}UOY7e zGB6N~J+-l!%4`%1cBKEzX4`9X1Mg=yGMyd4jT-h-|o)tHw@2Cir%>kDklX z^{->Btk`zpV9@AsG8R7jT=W8V>)HS!L}f7l^pQ){crkeY&*32*vuYTh%&lq8B?<&y z(!I=6gzPGFz`a$w{6K~&>oBoeYg);sVf7T4yF6 z$q(ZPN&<{7vl?wU^T_kEl2#TW%`{RHXFezbCZ;Z0OYc_>+Ym8em3W*@DstO3(7b1q zb251=k;5c>wUwd~pF1Kw#h^UYVJ+t2+L_Br9s{R)VMns?VZuolIZh-H`SM1A#?$xc z`>$iM&tmD{U4{)nP=r6@J%C_vCrT54gGvU%y32|gJL1v2Dx|R{u9M*KlegA$4s&?R z6hFmR$Qi-xNz;dd&J*b?HStvyY{ZK3Mc?Oj>FRk}cW&by*+f>^8I>Ei@FkFUQb~YQ zpDzAd7VJ5G$|*XLQ!_oXN^oJAGFl}uYe(W<5O!E9 zrYDk(zD_)~UOU~zVz00MS=$vbEkK2TOH(h+J&FlZ^@SyR%`!yUB;_WAQ_LtWA5nws za@-WCFaIzbsY1{MhqojH?$mAPyvloW%Lc2yD`YWwk5`wkN-s$Vr*tsBTW8rd9X{}$ z0~AOxRnI1oBFFTKi_P#zS@mKO$BUu)O*c)_Aqrj47y93Y|MgIX}YkNr)d824u7UpUqDW;2=cMVo<_V%+pOxj;>#vCWUQ_ffjH-`6dm+gJ<$8sqIZ3t>3&)C-aTv6yF zHIWf?l67`v8#QkRY5g6mYzA6VqZ-heo+>O3rVs?eaO=Z1tw%t5(@ll>Rtg6NEoxJ~ zJc<(Si`Lv=-F>4^4y8fL2!PKPK+;BfvT}K7VlcU zVSE$}D3SoPWvPg#S#V3UnC+L22mP7a{KWc<6qkw|q8n&|4 zJE0+ml9YD%pJUM5@HfnHIz0l7KKxX|@wrJ1T<@5<$OL6bRGcEFkeHATfre zNkWzl&K){#`?2=HV|^^Wej&4>3lc zVc0L?9lWlaV*iwrcRb8nxKRJ2R0H}(IV>N&5aat4k4Sd|iF>KFb z(HJ%Bb=XwB&A0tOUo~9*w|7erc*1|b?Hr!r;xwYdLY!!(IcDKp9id3bsK5gYOMzJ& zxv16zHDx{PJ*Ny>Kzkmv<%jczJ_)H(muZtjtQeFRDiw+pueadQ%B&rT#4KYa;4BsP z^%t7$8l5^$62HT)q!Mk|j%#SZ7tE>_ae98Jh$JDuNB#M1o~+lcrK1kM9hBN&MvU4AV!h z1V&`Q?%j8c)Wuf3)c}$_G_WIIY$XO-a5rdU*5WaAZwyTT)~;(^&t{~Aubgi0Md;uH zx=Fh*z9sR&jABktx$k=lM7uJkw|{c2&h@CVrs0zPdzfuS?4^$01pd<7X$?ufiyyo= zRAkj6L##Hx{hrQfU3xhh1GrzEZ|RyarLVLqG-3hB*- z-G#)u5B;JX@NW0H;#zJ(CZv^DIPlS&Z|&cE#|;jSOC-Txq=p6d5x7_QZHv925Lf;2 zEh$7blcOl_>4}%AqTr0Jx)j~Aib;;D#)w`R+Q6#qQ_dsfgGikj`68pgg^O3e8E8YH zySK5cDd~{36MIE)tlRucQ7DeVJf3n(Zva)A7p?Cw{Zz7bfz!;UIavpl@7;%WKtJ`( z78BB(ae}6h(#C>#MLZc+Gf?*KH9_}&z>ZMjt!pe~BX-++;u9l3>p|7p-*g|%I(zH( zS;vbU9;l$xnFu*0YqhpWiBtKS7Ndj=2H}`XYY~X-4UAGDyZ}Ldc}8G>URBXB+1FJf z2mt)4-E|Lt*k{9cgqivaV}`%Ua8|r&dz^qVnp@Q$*M@8U5FPx6gLZ69rR)fnwA1W- z3I#rP;tGx72tg&SbA0J~GiJNZ$UKkTLuPa+NWDc&PDLjP8G;ZNet{-%bJ}PyJ@?qs zDGYCF=?pnri@cSd!rt{OAqO%f$4oR~7wdS=QOq^7EeDK}>O_48P_z%F`cZM1XVJR( z^z6uJOae+7_)Yq?v|NIVaD#bSl$$w5$EADqc!-5H z6*XHfTo~4DWaJxBh72KbZxnFGzBl7*vdJak|MWY>!$Uu0#w0#J*KA7nnnb^6qDj=^ z10Z(92akLYH&&N8m%DI{3=o$37+(^mIu{v*KlHC2!jgs_iB_wO(zzI97X=7;MQrWt zgBm;=K_e15*Ci2XzQ#JmOg44?TnXUBJ!uAH0s=3Q42=*e(c@*lj8cd^?1I>G{ST*~ zFZM`;HCY|@5p&+*KoDrSi9R^>@ZX7V>Yru`(?Fz4!l{+{=rJit^`?Y^^I)W<}xQ3P=L&UNii1z0@-JnsGHzg5(G;5FE`#BXr*b5tvEA_uxpK!8wKyDrJz5J@%1 z7N2sNtGJzh>973QPwA_?{_=kEIAN?_6L=%vR;-2Ox-FUMwMQF(E_&>Hfq2~344%7M)jDmn4WqEbEDjD;T{{xEbeLw&J literal 0 HcmV?d00001