From 2d7a1321cfbb5f3f2cdbf211cef81d16ae85276b Mon Sep 17 00:00:00 2001 From: kMutagene Date: Tue, 19 Sep 2023 13:47:28 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20=20@=2024d50?= =?UTF-8?q?7053cac900813eb0dd604c616d828ad7738=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- graph-gallery.html | 2 +- graph-gallery/categories/Basic.html | 10 +- graph-gallery/scatter/csharp.html | 6 +- graph-gallery/scatter/fsharp.html | 6 +- images/Cheby.png | Bin 0 -> 93522 bytes index.html | 24 +- posts/categories/Datascience.html | 75 +- posts/categories/Fsharp.html | 8 +- posts/chebyshev-approximation.html | 1344 +++++++++++++++++++++++++++ posts/chebyshev-approximation.ipynb | 931 +++++++++++++++++++ 10 files changed, 2360 insertions(+), 46 deletions(-) create mode 100644 images/Cheby.png create mode 100644 posts/chebyshev-approximation.html create mode 100644 posts/chebyshev-approximation.ipynb diff --git a/graph-gallery.html b/graph-gallery.html index bb1f183..c8c0a5d 100644 --- a/graph-gallery.html +++ b/graph-gallery.html @@ -112,7 +112,7 @@

diff --git a/graph-gallery/scatter/fsharp.html b/graph-gallery/scatter/fsharp.html index f1bd7e1..c815f5b 100644 --- a/graph-gallery/scatter/fsharp.html +++ b/graph-gallery/scatter/fsharp.html @@ -163,12 +163,12 @@

select language:

- - csharp - fsharp + + csharp +
diff --git a/images/Cheby.png b/images/Cheby.png new file mode 100644 index 0000000000000000000000000000000000000000..d6d55c2a0d959e3e0e50a87a552b3e1ec90fbb3a GIT binary patch literal 93522 zcmeFZc{H0}_cxqYRYz_4q9{6{Xi;O$w1%2zN(`-`#+c`rs)MScMa*KJ=P5yiDyrsr zN=RBt2$2$E3~%)Ny?^)pyz5=hAMbz9v+lFjCF?}4bDeXpz4!T?y+8Xz>FKClzQA?? z003N8f2wQ%0GvAm0G#=7?kx42j&8wl>c=T>1GUG1%E22e)XEtLC2b`DpeF9(;R{-7 z{k+FhGj9NZzT@ON)$Lwv2LK!ws4FWO1z4?7u2>}EGKt4+BR5}Zd@qbQx3hOyHurfV z9MoETa5;#6+;JkH)h0-+aW-?;Ppmnk4kv zLW1Kycbf`y#dNygv$V*Ucrtd?;u6E6|4=_IDUvls=_t0!fs^zdm&WR_-b7q&T~9yQ zpPgcwbiPLI<-f`~z9;?1r~Xv~02I&Ny7liGApENG{9iKFZyU_DE&%{nH+wH8 zIeC8OdzM7N6lJJszYuQrQCu*Eq(s=isFb((Y6qd2aAxvR6s$jR(dnUDC!Vi&dxoX*%&GU{Bh?9Cz<^ zd+6D4Fb8gfI-ARPKAs5K+43b9W9cLEDbP$x9<64w%i)%NWp_Em{1YX2lCl*}4>2ks zs{*@e006mPFCpX#%gP?ji}i~H4Y(Zu!8~C)V??$p(QrBLkoAvi4%JDoHO2QB)79gU zY=3@WY+bW5j^=LOEeSj^900%;>xm|O`Qn98hj70QT3=ZV3f^F@05>Q{V&H+kU!S>| z6A=b^3+@odJ^|p?uZ+dC7OzOZ%wi)7h{OqKWSJp8^3lysYgOrzAhDhHuQS-20Vak) z-_+??3XOOVF&8&}*cS7cG0IrQ@H~r)&>*oj8-&?J0gyB|xYEVd6Yp7YRE*BKW$qn{>d3-S_@I`KJWSZoh zOJ$2cj+OCo>e_oVs^eZ$_HS1o4ZHwL4 z*svX|ccqxvD>y@`5<)E@?@r9%a8;TR$FO&xv9p9d?*Yda1}BR4WK zed^=)dn$1nMyT?)DA<8GWs`6j1rt^pS+WN-I>YcE6QhmvC|GnG?i(Y{ zn@mpI+2aV~KXC~uW!C}2moJxAJO7e< z+$1e16^_1h>*no{w}Y-3vt=De$t?HB=5HHT-$x^LrQE#PB&{lj!9_YNyEFU{Q*o&x zk@r#h243+Z4g;eZ<7ZT`1Jxs!#rb8xR&9^KI*VK(g&OIsZc-u|>I;mJ{Z1o$oviYQ zuQ2w3E8*X&_#e{teYJ>t5uRRUik}|R4LIT?SvsxMZS{Y=8*{z5MbD;_fDLu@)tcd#3%yF+x6H$EEqV$heJ{tWgY@k}dRRA|)nd zP{|%KtS$r~Hnq@Uv?4?x<+GZbcnMk3xU}+Uy7aX%Kc(0TRtCy)c@*05nk^xte7v47 zO>|u_>6Xj66H`a_@)tv3GE2M!dn;R=@vfqDZZfT4;&U z(UvShl$+0zj`*^10Vn}UPQ<7917B9jV701I^Os!Gd9V}GYb-DZxt*<3khENbgKnHUG~bEUvOdi6#_GWvB&gY<)X)U&v(~|8d@yY)D$2v>>vP5A z7h1v?Dql1|R={88DC373IyIjt-JpPa2OaUo-H>3yEjb#d^6~2nwN20%cKUeU(8v@v zb7FOx+z=$M$ND3)k2Fd`H%M2Ef@?G&rkMxk%C6-GJX+&xO)I^@TY@G!?)8gvGjQ<1 ztX+6LA;xrQWqPE}%6E8AQn7beY+!fLu54~?Mta(q!usBqlZqZfenh_L6~Lr&K({lDTSViTF=l>-6tiJ{Q~2BhHFQD zrDHje)rQ4dK0mUQNt8%&#%t?6sv`xrpiU zmBs$w*lT)CVFk>8NuID~RY}?vu0D%-FB{wKLa-K-MV5F77 zY=-uHaufTrtF={P2~u1yw^!gjvJl@eFT~6*Dn3{@cn16sYb|3#i0(cv(X0B)x5kQK zi2T)>%{8EL&h01wECYc95zVOM`y&aX^)^0`&A9PYhy424V5I!28@Sb?1s(OpC;q+% zLdl-a-%;Cid$hgufRuF4-8XHXX2o^6l(A>T(>PaBPP!?RgS|`=2L!d&-H;{He+L9k zwC^(l#U51kCf--_^`M(MkFwrIhu%lCFMDDcSPSX{Q+o%sOg}8Z19%J1w0Fy6jcqI( z@IvOGJE(>ucj(#_B=Z{dOXbA|?S8?z7S&qhz&LDj`<>d-L;m`_z)AYad zT?dVk$1PVMpUEjBxM3&R;b;ABe0Z8s%teW5$cVDcV)r#Z4(6$rmJV}p#tn&}(a*xN z48!*F{RsC=JdJUE9CA*T7p!XKg;IWfIdbhoZljviCDDF#T;1)@!;;gNu!+mv3W9hq zAZljl*wj6={TTa@^N>phKg8k!Y**(X&dc24)Sg;RPrkQ(i$q=XMHI8n_V+&sXRP7xEdKb5!>P!iov#o^f^zln_?P(qgU zlxcPkz%M3QAhE4gk4S4yq?ybODmxMk-B+ntt*slcY%fIsw_Y=H(tP(XZ7o;y&VrHS z6v+yj3ws7}cHyUpRP=WEyrT9rUa__ge}sM;v^g^;&D6iqg(mPAL#ty?k-X|35%XiS zc3NEOXI>@@=pJ|xmnr*mhv^A}wq{?tL;41IAk1cc#%sQz<5lJRKEG840_1+JsJKdMAYHfl<<-a^RcUASVZf<00#&!ULQyc|RGhIyT8k5TU-kJ%gy)P!GjL zrQ;JMFns)HpA|whDHv>;6SI*7@8?@(@_)&CvO2}@5~l6J^4ZPAX{?O9RI=+2n#3w( z8!GvJkQTR=F6pW|vnvO}U@D5Nny%X2R(egYAo>54vMA9l6u=~|IfsQ>L6m&&H59MS zF-)YzW9gUEA-&ePrph&c+O`&O*DaX5y%HW6B2dS@mCJ6infwYP3$j6cUg^yku6rUl1)Y9TVGYlZ z{r+sgs^+m8Hb}ee{zG()UDY76!HiCFaAHj@F9Jb=X{*#QSIM#kkG5ktP`)+MI`0rh zmi15Ab?K^~!$HywAqh~hK;zvMEBl5!qUHPSv$RBJ$Pz){6F_-PrYy|NdY4KpezJA% ztA#sG6?~BvleIu*i<`(yR}8*$DL^G6RWEKv$eo?F4MK!k^BGL`=DKn0&?WIeSPu0r zlFtT~`#9=tXaWy;+4l|gf300=aqc};Du|jxQYzxM_M4V0>tNd$t{_f0&C={7LXfWQ zh~s>@E?w3c{QB@WmIlG;Fn4zcYq=H4y;{q#hDGGPAAerEO*AxU<+0@8>8Avej}_m<@$8D+C8tCaVxabnt@cPV5Q5sK$PzXht2rvi-(G}JGVNm6S<9AT zQVZ_pSnutYSfbny-)`5&mu>Zy=)!}QJu+wfn59<4Hh2^w#=w0r~Gb%b!CLT3hB8litkqC7$GA&xax#W zBTeu6V)TO%N|2&xNL!ha{pF)o{VX^C1CL70E5+lK+ttV?hhXpRHAXk|*U{jPLKiN} z;nvecV$=vei(mwcn*m5`!AB-Mep~ThF<%X=a*->NZ8N6B(JHhctubhsQIw$jGqim^ z-@!;Q@^R$ac3Wp@^3l5_f@`tGfpln4p@?WaM5MQW!x?`7R*Oy~hVcG&EaPk)so{jx zg-!J)ut|uUB_wc-rR-jtlt0LRciA7LK<9$3fE%x{90zB2$S+n^BFf}oD!OhvY`%AR zbm~~-3Yb=U*tS1`L!9CX=5KqCcFZ`W^h>ft$hH@a+BL5SQJ-Ni`f)n?1^~j- z3*aEK~FXRKDw+_AyicP&UI%pxJFM`&KjT8@8Ef(Pox6ol>4nSZNc7w zP(E?wj&4(`qkz%}Q9dq6slrct7l-_EW-vS%_tqY%XbEYDEL{DyPegdf-rS*8z+=(5 ztUx(pwO_s2q~|?bg9sNX?M!4anPZV9fSc3TQ)}Cb*OtN7x1x77WhKGk06o(j0~IrK zd1=2KW#p0?nQq_eWVqdB!1Pzp6*_F!o-b92ED7ikPd6_X5E$`1Y-&3p$nC{vQ{a!o zbf*UY1J{Z6Xzni5#0!nj*X`S2mSx?kAndE1qxl}G%Lxsjgaxs$c}Izkn$VqleCjB& zU*$`G(TA+mg<3)Q&lVKi25;h~d3Kv|>#6(J${Bthr7}2fHQ61cH&}jm>a8x~h5m;y zpF%4PQln2+S}fh?S1|4g&a~C|N9rZvpj;ToY}r?)6%7u;sA;9h<#i#QM;5Q*bcsDeWnpq8}a;4_LoI^=fbTm8!Yj@oJO{ zy36`}cr|n1@+gkhst54U+>Rq|$aTPADbJ1iLde7@Z9R>B3s8W4(I7I}J(KIMKu-wQ zve0CW4Ymy01E{o3MS{Fs{AW=!qVCTQY7X36%nD*61;gm9Oqu50|>pxp?L^txWAqxJD$l)`|-R zg|FgM@C7Jpr!m*k>pWj$8emQS;O!THo@dvh7`Hcvtj3xM0_6)04gH|ZCcn>w#j@thDC{M1G3>R8XR`tL}3^Q<}? zaZc^-MJ+HTaKIH!zwMB7VduV4T3~O9fkRMWJ|ERn1y%i{U*6kO$fZ|0v83zqtwJ%W zkOKcWR}*r+pa{e5gzdE*St0o;lkr`y-iDtUm|b4@#XK@1A6_x)YE4=KM`e*Bj@+Q= zuHxr{vju|_Bez#~v|HtI~AfXxS8BRm{@q>!IYPk6Uh5~P`*@@^6MITU`i zA}KzKVdh27J33$AJnQnSIploz&53O8LOGlAY}5sf#J}-NYP8(t$gKPdx(E@OO{B20 z6^t)7p@at$35ULJm(q*-Rn{|&d{L$h&mxsbU52QINi(L03Qt(&g8dCaF}T`Jg&VUh z%5i;0KSu$?U=ArW87#^LsbF@exmaj~G073_HDoX43lsU#nWU(!8=xUjm>%&Yp|_0U z|H%mYyBQ$wR!QF`VybRA!Ez_aHO&i#BOfmFgIMMf7F8xlid!L0WpmZIdCh$s-#_$O2XmPbnAg-KoM0{Fbwgm5k?jue zD)IEAB$Z&>%5C|f!S1CyUD6DWqvm!ICT%do$f-jA8TxNSz2hP~BnIQ<`EdL%pOpsh zSWdmbwNGmClh@1W{pMbpz2g;d&@5DQ2pR4+O1S%T`Th3#_bYlRYtUq>Tv_7GglDI; zZht>TbHJ}kG<2xy0P%om)(%bIYH~3_uY|6bKLSlNe8Fm6(H?&X(v(g3B*@}_y`a4f zb~g@yANro!Yqe~q5Eo`-dz&g}?XON8cpkc%2RhUZ>Y6a?!=s0R7KK&CB=D=MjYHPB zi{(ybbu`VIC_W7*?>QX7eN?ENc;UO`H>Z!?w3~yS_ZART6FiY*vJXYnrDqP$t%tWx zEogmhAXDI_bF=o2M6pE~RZkBpA2gTPX$&{J#Zx|Qdz6o_Pb(g0<&h{2lL?oW zn%kO`>bCU$$o301s9LxRDF>)JIEzYK4i%$7U#IzfMMxiy=3|TBk)-kRG33S~F*LEI)Bi;Z&RyPTKZEUc z>SnHF*ImAW5ZbcGkahodazSaI^t@GakPCRLxoY`URoZZl%78o^uFcXn3pO~ocdJ0i zvIbUio?}#0>`qEy*tGHh)dQ^R+q~-;{)B;UtS9E?8S^&wtum3F*e;I;X`%)GOLasL zyv&FUjpB%h>?sQ~QFm&`QUkVF!K&pL?-UQYAMzQ8&2 zqC@smgBDxiIi75|Bf0$w*Q~VR^f;YmNi5N>q%tI1QkNd) zy*EHX2!jSnNQlBP;m9ebcMcZ|{dE0#h$kaE&eP#J!Qn{oX7@eYLA$t%36VO%!%mUW zJ9A~MsfI!JrLp;TLpqox_{A;4>}`k@$2otuZ}`tO>ntnjb_XHZPx{QM0i=uy*yn|VFv!Y`dxbepkn zY7_?#U)SopuJ%EB%XbG7+L^zf4s(3P_}_$GR~CD^Tp1%@p1 zYEAC1c|tG(Gi7p)Mj2}J1nlSoCJF>y#kpicI~`p?7525ggq4=8`=^_lf6ze(WAcJWQkeO4A&YP0DOY z_S)?1(JQa}$)n~#_CeyCds8*P!H@HLMNb!}NL&<4j1f!6-p$s;fxBg$dAVXVC z=h2rwz*>?Awf8OJGT1wv$KhJbdU@6e-sRI&=iZ++W*C>twTWk5AK24BcyjK_t(hFg z{Y@F^(5}w)7MvPaYGwcVOzZs)XSg>W0O(CRdsd6sI zlK1SFbEiS&)aWUTWh9R?`Sy;^FKL1d0Y_gg0PQ&4E!3;$?Cxt~)(1g?qKJEi>})3? z%T3aS`T(a`o}p)j-C2VpX{K@XpRS#e6*qx68j>~Sn(*OdBz9P4%&)#_=#Xm%_O$Bf zSJwCd4>sn?1ML9!3sco}+K$0WmYe}@mxs^v=?zDN0<)m$moEGa`m&HQh8;f%^6W^Q z!~qqvqIdDHq5kQfxal7wIgHKfU<`6N=T6H8#ZdZ}gvR6ETrqCnz;4|{1Cv8#HE&*l zg1+=ApixNcWANrCb*wi)(m$mR_mQ_l_qFU(rYp(IfyRD~=TNz|{+hG#Zu9l`k;&c8 z)ES$)(waSCm?x_i@;hhdS^h2Hi%Vj{?_FNp}Epwq1Z+_2T+?- zp4MzSr-li6a%xLy6XMpd1}NnEF+ydh981|w0a-&TP-oo*=Aul z>dIsP?|symrgu=*LWIQ*mu8}ke5FIfvNv32kHE1B?Qq+_DylNn@6UDAX5bF>OV6T4 zTga9YHQY9#??fUpD?=SWe$&#J!f&VhZV^KE7i&(ub}aRTJ+T4kUwMus3I7QdM8oPR zK;yny%Bro**}dK&x_XU#;paxP0`01#EmX@&7IrHm?WXjm0FU!nZtd}Q zY_E0?pGAq8(DK|48Q(wT)o@F|Fx4;tBF(42@lgK*OyQlsJhy6ctJrayY4GIu3(V4| zu}n}&yv7jLZ-a8Ifo90zyoFlL$K{ zKr3&2+$ExjndkHRMT(Ex=v4EBU(oRbTaY1&ohmi-e>|v^nzm7khr-q8~2`ijq@`=YSgjjCk&y~DH%CF8!A(-DSn}Edm zZXOqM%Y6{K)exuQhyVRetRUd7keCy;(FZe*?kWeYq@&q&KGDp3bOKa!paMd5puB zL!;y^Hm<0pPB&VX80=hQDwl5QFZF(_nZTsbFFQe_+R2;py<|<&OJvbY!_vFg`-~W&qcY&{29RoePC5pJY7I#4$$WvkKqe zW@41N>u8jWV_tT_fF|WWr}%B#BHbTHKCFRyQ-EjffEYC#Pe|nxv{{i0M`0`e!wy!& z1T6Z6L}gL|_GwP|LfO`xx*DYB1*Fd2ae$zh>iO&YzA>I{X`vgY`w*OV4^3o+LBTo; zpvW>pOoJ_^&x#5VT_>HnX5#-AbKC?q+DBY2*_#`>L1^!or_xwnhsh> zpwIiAYK+z+l6;ac?#5EDJqI;xKK^LPRy-)mSSaEV@wXe5-%%=}zg$YG{(7gK+sVKn zGIsyeOw!IsQ53T9@o-taM3AomikodxeF7DQogXv-AfQmWNL zyfa>=59h3LFh%-UYkiF8X@W;Tklr$J(o??*d-p2M%>E-s(H@UabzHFbKdNtm&)J@NgGVADVI@6@XWy?$Gpkxs7PDYr7yw9`+2g z%fRg!s8|ZYm@wTUB`w*)KWxoN1vZOd-**R6xbol^q$?9f38hs3>vBr)S>en zDT9C1FeJ+k4Yr1?T8$UR-%Q|Ob2c)sf0B;5_*-MPf=8Urt9{f@2RO;0SAwSPd%sl_ zu`0|dp`RK(OMLHYP=S6snW(a&alT%6$KZ4A2mXocYbwiS#{8mGO?Jm$Va_Xm!aZG1{X*K6PD!?MZa3D}@ezarCFTn1jYtCf0wT zZ~^VV8X)XHDpkL{skRR9R^zkR0`%N92|1SiB<-E|7-7N`V3p04NrjB-2gTP&*|L7G z1$d2aJS~E*)Q93H6v6xzAabV9Q1rUJiuvzebz_8(120=uB7YbN`hhM$ArL`Nu!+`y z0|^v?E`Fpl$q|v}K21en%6qG(_>Ce`{bI^?b0FvkzEL}Uh;!Im0hzt8v+9&k8n;%B zQrzM6bjhMXrxNew*x6-F)hj{x9~sT;NwnG<&K$9b6J~C65TljLp2wu+I*iS&`X`Vp z!u0oEy_B8~%kpip)?2onXD9ltyez@2bzO7(v*6Y9P0z&HuU;_PFQJBL4%74Y+nX8U zat7`!**k|8^S~|vuE?%QNd&FjT0NBd;mubzuwP{rb>Aet;U@gqVtdAGteZZ8y9`MM ze_kXbYbUo0YZ+~1WhiuJamG{j0CA*R!xm13teNT4UH34y%~kvaa1~3WFn-t%b^H>Q z^Q3KMekUX-hbmI!yKxS|nP}?z6#fS*w#_>rv%kK@aD+W5mGx7+xO9JNzM@Myv_y6L zvK7mrn?%WmIiy!3);Sv4;W!v1XZoyQA0RUtWSux#dt^{IM|{@iWVj))y1hF_W$w*q z@K^b+wYa-E8W14f{DS<$X$5`ap_u5P%IwE5MWJ=hnTl>))l~CW28d-t$w)}ZtXs`w zYF%F7<`}KC&x9=TQ!&?rtQ$U&o(9dhw|2=?Z@XNI%xR#J$)}kPI;@MJ+YV5zqzgg?P;Z>8&vi^TRDK zxmID_^bgJv?29(8X-Q4ocf_zhXb08(mBV#f>uEv9x%ox&YD#`@6`fyB>z={qO{@g1 zOqf3*5b>-~r3Nuy{GOp`l-m2FGxg(3HRCKGyQ-lF{F zt9@mKpAqJ*slMXwr<^8W_lAX`2LmGuD}7?2&7_Upj2i=%V8w$$^VQiFZ@u3&+GQ1f zfvT{EV;~5K1amaR+79Z}i>D#VdKdgvwJeL7Nd|P^K)$_2YFI;DIM) z;zC&kHrI*dm1yk9!PT!xqx(@L$sq{S4dtx!jNuuo z4yDR=)s{H0w^~^{#m$E9;G7t+e&r1=P?r=V4avGU?p>8QJ9icPgt1{Quu7-D47W8q zf1`rrc5!a-L7^OQZAOYEwb=B?=C=PTIrrfLZxE;`AxHxL)P5b85=&XmAcHKi4@W$< zEI`lJ1357PN5#yDtk(!Q&<|ej?P2Iosu;?6iQMTiHUZCF>CSu7G+8r@-7^NWyF9SA zDo{heaJMz}m-sND=+bwvIjiicvFBZdZI#qDI}k8h-9S_jrGVwW0z`>xou+8Bf(JvD zHKBeM*}KS2=wyMwEWy8{&+udyO>$%!TM(z4$3+LWNCQ) zxi}e%%GTPc`fa6KqUpmUGW+I4%%o zRpLuqiMWBVfX^`>$`gOO!B-qt56I83Q!{_v^KTjmQm)?a2O57~3O%-yMD=*6D8q`I zkVm`IbhF!@luEf872U-^zYAx(hBi+qWKKfHXUI+RFqPlk?L4d4!{L3&IXTJbn$`v0 zNq?VF)}UnHVvPCJSh??9;S}o4%~icDsP}B;DAWP&Xc|t48M1Ezjg=69^-G;|(8vSp zNd%Br5R*0b;GsGS#%o%qmR74kQ}KY<=bey^a^ONE*$L}&4VkYFA1s8#qPl82&~u!m z6Wq^whst&eKavzvbt?16&&4o8#%a92sCDu)C=5MT;@ty#6g%%GU6SFKm8D}ini*;_S3WP zp{>fq@++a#?H_|e2m})#jwD5YLEbzGSmJ+Yw#QBm*RctiI_g@zV!m%x(j#ht_B{Lu zNrU-B+TMLbwhRCM%$|4@MYId&yjGdG*p$gjGaUmhYoQ-Y_37Go1?RS-ZnDUWs7rw* z9JljAL?b#BuWl?ea2%N>i7?Xa4wz(q@1H9d4TI~IxJ4=XjeNF#I0EpNMEh(h6J{q> z=nRUVS`<&co*S}>um9=5zLjTZ$QeHG02-DN(%wpYeXy>gP@}AnhDs(V|M8JTCiD6% z1aMMmyb?apOX1KLTm!edUG`I-Uyd>UhDtVWtd~IteX4=iyrL4WF4x0agod;kvPK0s zR6SNL=iFs7aeiS_>^+Lq7jWy%$(knoytAlk^d}sK-!4~yirw4d#n#Z+NSy{ z>~*#Ewg9XmBJ=DkL3=U5OnwXgDseiawX+tKdvev$78|-k0xx zDZ0LX+PpKx9en! zSX6m3u8TIc`1!=5S^{J&Ge7ACqj~Qjf4! z6S}ciVt%!?G?r}-&zn>5ejFAzrn`I&-mdIyj-J*q_`oSSQzOLDud!|=_fgA;jHR-Z zXP?LCqEIca1A*UV#Zx}kCWQ>S1o`hU*bhC`i$7@PV$91|@9Bl1TK%zuQ+;(Aggq9x zTx4D>1rJzv^>G~|m>{^GfnBjsK2q)0I(u2-wWn&v@2hp$eRlWq0h9WT26a}$sdt*p z6CeGSNhPSipc0gn%6Mr#wd!IW>P*XrM^r-Bb2-?``eWGZUj#`?^CBK-s7Fh#B269m z#lI}PN6O9mc@$Yeb#NBeHN0lXYdu^!&-=g+U20;Lwn?rk82iB)HHgq!~OpG`!9xVbWaZj z4(!LAf}Vhy*}fDJst8=tBJb%`8RPqBNc=L^C3szV!$o8G;7xGk$oEGD`LSbfjuWXd z_w#Hc5`XO}`XQ7iScb~#*G%~{lj6Ov(q#_`HNx$s zQ)fg>+Qc@#A}B*zee4_1ch5}_f90=9c?+Pgl08eG@xD;oWP@%+$TY~!18jLC;kR#r zIoeYP|CdV`eRkymd*wt$YjW5xvK-m(wv>8m9kjOfP9@m4Yk#elu`7t=_!d*;Eb?Rq zwff?ORh^jnP`xA%EWD6g5fgCS5*zX?4^Jl6^PcPCm;ZUqUT0{S@q}Y_Vf*em=o6K0 z=Z>S`2W-`ORgEjGhya+$f4_hxv0YjNKKQ-T_nSPtkchpuR zUAoITIp~q+S4^R`;6#Zb24pA%i##_-#T-d3dGlGOrR5aaI~I2sxQu!Oa7~NwB3@@@ zz;?fxyTWi6iHRRR*fl%Uj*i2|HYd4G%t58HF1=|hp<}Cpj@9HjRFKNqEXlhBPmRp9 zLWgn^CJ`~9&-xS;$OTP*Gzr>ZWwI{!nxIiTfc!X=SsUVYAx}ef0h?{wgl#Ep(N0f{uMHbJF8U<5#83-nv)m;cpTe+X3B&6+6|^9KBXm4@|Z6 z6Snuk0*R_X8o1=A$ z8&1kF_umhbgO_bBVKfY@HAnG*Q9NhEIlU^36b6O#EBH|M{VAQ_|4BSMb@SHAZF8f+ z8;N8KNm|X$!%OzUzQW-;Ge#|;1ldD`f1g0YXnV@8-ZC) z%Dv#kDZeo`$0=&!j2h)Y85!lNl7=#D>etj#HC{BIbd0)WhX3*ThX1gX%CRh>=BBLk z4RE^H0G62^_69q>_M+xP+5i1ZpSLF#9&n~a#hw^6fXkFp*`N*_$}GpHjmGRoSwT5n zpeGYab=2Sde|8v6jB~l>Gxu@kK@bw7<*lHMt8*6Y?jfnsD%~?4= zaOOQ#mq+vM9)RUFBcsXqS@QjXqqBGZ9x~vJK>37?&7YS4{&V&A^*_`4&sYCVA^dOB zD;cf77)t?8YrRuA^=pg(!3FH8f4&*ubtX9Q`_|^T2aZv4Xk}n0B#uGP z(#xnw>&EdGKZiwnWqxFTTb;6OVs?GG1(Tqwrf~6CD}(9@W#FG8>_Ht)`-;h14XlKx zU30BNS6W1JPEGHjRr9>|#`p|14SBji$DWAN$|ycQn)^lm43Jgfv)3;a(JCS1aK=vm z0gbLZK0T+H#s1Lc$${SCpju^8>eT7K!>0p*T6|Bm*ZQWr#Soxh;qiUV!RStqo5e(z z01s4Hy(HA@;td*e`#%Mq8HAfvrjoo3?DwduI zb^a=0s^FF-sA$WGQe*u6KsAp6UC2yqRo^OLbzg^Ot^zmOeQa@>^!58YYU0k&8c7=-fD$f~) zAqSO5QzC7&sQ#XRmDlY5>nRc0)h5wVuR;w<4p#zE4p$8S&OLnu-KqNHJ(OCoN9^$7 z^c~i89f(y5H7aA9r8hjy-CC`(m{#9Y&XXzsYM6@nx&B{Rv-8}k>wpNZTiN94=pZj} z%pI#lxGB3q2S<%UX6!wW8oh-qA>TLZWpMoO!$)dsy8deCivRy;;w6opE8g4yi-Rpu z#=Ws@7gOzGAs#lfW81B_K}uP(aqY_fAEa}h+=}2?>Nps zZkY6vvwx6G962Q$W0qFdVW$2;cu{ejf_VTuCEpbyKB_EOE;+l3B3~raejz<-mp|q4 z5isld5nwUR1<=h9r5!?YPz~d2t~+O*UyU~C-MoyF>f5nA7W~=!eQwrCB;4|_oW;i@ z@G(o~;ZF_o{RqsVl}FG2beJlWQ%}!*`5_@@!rCO``|@vplYuKWi2Z>xGkZoed6}A* z(BN&75eO62*D!A}b0Aj@zYA2?U?c38zkf!}h_J_RQ)GM}37CyM8MyfGhJ_U$+5?8w zt|yhdw7$Dzi~MQTJ^U{GVh8p#^pPq+@Wveg3z_Z_4kMh6U!6=nhxJ*DwO(^IIley*zXDBV;`SU-#guffO z31~a6H>Nw|rMqBkB80;b1#*^A81_Iu#<1TNl@l(gDR3rJn+?0K>t-LXBcEB3n zf83h4^pcdHZhcg0tPr@ZiQEzL?-!*8AlgpM$f>Q|W-M0h+F{gzbAFV?Gxx@+1_I04 z#c-TwM9AqM*H1MrP_JqQ0Q8Z=1t?hNbn+Di=ZUhaFeeR5pjcS(Xwl_wU=a}i;J`?s z2soqiby4!Yt`Af%h~b7prk^bz?SX;m^Bjq}|Ie%q_CuLXfI zcaz9FF;9c__!g+HqSVUz5&fk=e{JdQUX2RAn(n_H8WQ~*5k>5{dN-X{vA`GqSh8Tu zlV}ZV%Ss#u*6qZ9zsCTt*L_j0++c5vR6oR7C^(YZ;uF(2myfSyKnCU-wLNk-L{6+J zpWukCCi4vzCk?js-N;M?$Z!ul>5v$lJxaRlT(7{wT5#gl%-Bv`%KyeE{RL|nR-){F zNK)qz?VI1t*oaCKRWMBL&=3!-uzl-aD`>fvwY{Xj>fZ!9z7`d=Po8xO;t8q!=CgrL z`}^30<-gBj==rQ`YYiPaudz3jutg|INEG2$y@sr<00{qEQWSYHvcYKOS5iK|VE9n> z(>t~pSjkqAR2r;aagW&GdlubLys`9v(X{lr6Lb=3p8JG|o{c}XW^QC{e?sHio*fmZ zMj11lWy*W+#js*0Z&~K_mho(j9=>S0Lxni?<)brZ7^N6~j-E?NTb^uFY8?Gp$A!x2 zwNsAk`!?Ou9zI`yX`o4WA^!1*A~-c+nj{sL7Upf>vV?Q=#He$)Yo4t}%;fj(3_11f zZ>J?8fkn-`H|EMmTO0bsK@+D4-azJVTt=1N(LM`0;Z*aM(_6m^uh2=(DuT7OamkY^ zX2*3Z4Rr{@LuyGzYx67Y<`&-XA1kCVQPc9zR@Vs)F|CSTpug8w${y!_UmqEGUUA6g z4In%2)7x2b>zVEo!_$~>%HyY-;qzLUp&ClbWmQ zQzJi=kz0RWJx!S3WTc~Gz=e$X~rtlXRVDZEmJYp334|mxh40K*N(WAM94zhMpP(qx}$0A(Im%>22Mv z-Z1Q*Jofx42@dNvtJOj21f{jU#5x{B?{DAuP_FPL7l^c1vEE*{YpmUS`o3SS1GgCy zkqlRpsLA_bV==s)a3`$n>@+XBfSoK2z{uu3WMfB~276Zs~mkddK7ZxH+m%-sJyb z>?^>U?7#N`3k5+$MZ|%Mf`EXuv`W3Sw6sdM#27V(iXtIMcL>rc3`P$LQKVzUfJw&) z5!k40|7Ym;mGAHR*K=L-LiX^)C(k+eeeP3v8f{ur#EuJ}12VJI)(;M5)(t!oL^Em& znwjM_w3fwEo|cA&4V4$~O5n%N@FrOT*MIYd$G`vls>wuLZ0|DyJRI^}EKT}@v=d}1 zmv2zgSD(whNcm(L%Oxvl_rr^q=Ilpp7j(LA?QhRtv>7j%I@ZvaM*BW59u`*`zW`)f zjwl$Vi-@X!ZY>{|LdRgUUS?J~1j|vWA*zMd@bY;zK%w&c5 z!(8r)t~>d#ZCUtO9i1VTQ-VX^f>nJWbHN=PV@Z)Qd>B|gY@d z-z|Rd-ic;)!Uj5PZ8|Ylh4v#jZr*Fb#@4QgX!`Gx_`u_@S!E$1<+(|H$5cAN8*$RM z0~yQoT_!jkWWJJ*ZB1Q_lunPvwyenKx2L0H?58_4$2h0Nj660DP6$ohkI}d3(yd3% zg{$?4tlvs}7#*I1?<~lZH7?NM&@fEP?$pXT2fq|cQq8y6JLy~A&Qr5QjQ?gdKS$+cAbh#{XI_G}X-i@3#<>lgZbc#Tj$ci+oDNe%~_xI_XWl%yXu4bpnoA>)R9+-RCzK7gwm$`Y0p(PH>UQr-mdr|2vx zESRp)Asjq*i-gpYx84pv-y_)WyhdsdQucjc&m|`Gs;myC{x_#sN$rK zL2yz7={ke=7$HjUI=U7qRMKD@up*IvM1-=8}o)BkS%h7PAmLAZKKhwy<>e zUi7)X)A*i(s&66>NwB;r9Y$`gh%n)&kZ~X>!--uu=7MdxbYj+kQW`E1F)UgO-l0#< zvnpgv%@Q9`0(oHrF7ca{0Evk94?NSVF0c-5sEQQeFV9ilccFHuOt^fXzhEDV)&db* zp_MZ?b^nj1>fMpR38FTB;m)IxuJBY6gt#KR6p9?PSD9!L*ZDb)X1J#}47bOI^Q&_` zS7o9DxM-g}&2!Y-YQ)E87Y#LsKM$ymtrKy%yDE`@c7*oagB9!Vp6fc@SvkEW%DHBS z`69RU?}_Rt;X8*e^At%{Yt!IFxnvw(O`0yJL?CO5?nf-7Mc?2o{JDBj1;jCgL?{eY z=^OSKeus7%t(m0?W@zs^fu_j3hti7O^@+*4y9R6}wk$ZzGoC(oO}6(ID}j8n?cJ*t zQdJSi1;QZW)N+&Wq@gvF$Kpu;i z-d*PfWZJ|%h+Q;$3a>Xywt(I3O=tR^y0qY9i8!_p@J(rt?_Zz0;~PxFrt1=%uRRf< zw~smP+x%9UMsEivlZs9+bn3}<7!5mqtL;s)0k2rHuF?Bk8=U@0(Wv7A8GmDfi%fDo zX?G)CI&ydp3*1v`Y1K9CuSzUQCNCWWtD_b zLBcuRkMI4w0%|hdTD;knhL9J>iWzTPmdZ$d(mR!&K9Y7$%T%|>qD1^0#nusRNGRV5 z9y!qa9pHK+K9H7E7_MHX)+f$AlHN6!Sl8c`Wu@0yEBLUNmEfPyj${)?q4H6!q4ToY zAE$D9O)*|-%sE1}D`F@c^Mm`b`d0;9qJ}R}XsJMNj53HIp=NVu4ZwYA_nxp>{Ydt= zSz!w}A1l}rC?@+Tk$JW${Y$x!g!A;y#%bpPnpPky%qf^DRstW1HX%Mx?XAw|@LMP8 zdApn)JP$~Dc^ASrOUJ4VVhc)>&)tvsD^S_HuqKI53qD{ma_yFHYWlfV|6%Xjm*-a9 zpn~9tvwb5jZ@9eu5*jyGuN#q?p?m9?I!!GtyrN*hMA_HdjLO3@giiU!AyQSheCp+- zJl%l@X5NkRO5I~5_3C+q`mG-vKFv3+MqVYed5wjUG;07Ko2pmx5ClA&J6pvl{Ruo#K<6j_3ccv-Au!7I#8$%yLw`}&bss*5 zJU3!H)QEstA2<+~6XBSeR6cIY$Ux#$5pZ29K@OK}g6%!(vg&sgQ#&*-EZ5}5JB*>K zx>vdb9mWxAO8C+9tFE-?1-0zH$>f0EdaDWLpkHyUa@_%U%gSyi`?OlzeDQ*RFE|(O z1Lrc~)j}0aNONNvQc9(_~y#<;J(9yLnOK0iW3qfz5`zH9WC@ zua{%3(20?;hHT9`p!r9bD0*g&?;mdxpnBd8e4fIZo(RmgY}S(2VYVu%4v9z;UJS8> z>qOA+04|{DsGE|Ur5+x>;{lRt_}I{bL7YtWu_{Kzcu31bSj4&X_O*eOUQ#^A|BbBm=B`QlHp}xN*pdt4IvsV~n0>zW37vj& zKSb-x7*kB@;tUR2=Ukxzw1nfdg(ywI4xZo57@AF@l zHUMZ|x{6_3`wWryv?TF68h`=!k7+?mAtRxLziv_49enq_lYpS9B*qKi(}1g-CSGGH z@qNsIO*s~rN@K7ba#li3kfPV&$Pi8}V@Y>dEbUH;`W{bOfNagB6WDTQ1!spz1!c)3 z0DwQ4^7Ur%WQE=-_kkFJu_5oP(h?6U;`#bMBXG-4^ve}JP^zoWwwc;C36H-eNi{~( zEde5jACvC6g=nAJc)!VjNytxC`c=GrPp5*jty*G$Ju7Cb)zWFCR?h}kq^*dCQ^+XT zbsn6RsDQn8v%YDoX8iJjT3DrqjXgRoRRSTc!$p5`)YtfU?^~yOyOfr92_K`IxwJg)yDL#Ip!2=RO4+TDr5lDVV0%p?sriiJ zIRv2cEV9$8qD0JFB0m8G(!y4*>GhNgr6xHD^cy)i`Rb=m&_%QQb|6o|g0;UZ{c2S6 zo7=yFLNDM98@$_=PXSMrDWHK*ztzq= z+!I8xtbu8rsH^WD@csxUd%wTu&V8|!Cd_hU1*iJAC0w<#z1cRSPE>QFV;`ZX$Nc~^ z!35jH*GAt(#ZdjRZmwO3`7Iq;t!h`Z>jTv<;-YN&(e!V`D_|0WrI~;b;at^zyD|cCPzA_5yyQ0QXT?@Qc2YG?HodN!pg7u!<@>~R#w(uB zgSf;i>0tN8Hbd3F%{BICUGcPy=MtYFM!V#TLl9gi{`ZYoT35Of6Kv9$BJo{5&6#9a z5Nz^>h*shN!teJpj*Q;g>v|VC+-jt^l^MP5p^HzKh@}Zpsv~TUhiCrgYaDjWR>5_W znbnPW)YsC*?qT9cj6^NtKA5qFcK0Ldu(6N-8)^?Q6WPL)Bz(=@j&$Ytwc6d1r8awB zpJdDk1O>01J51X?yrhrbWA*mH0CZM+($|Q`Y^N#H2NTIU%`bkFW60<97QPwuv%C>6 z3G4TM7|_FY%<*^D_p89eD**r8U$?VEy>}4F`Qf&}qRjEDYaxa*-9(72G)?v3-vCj@ zFl~*|t;$J(Te+xHN_k+fFs@zHvO`AzW+>@@-qPXC0s10i&A9T84&(0dmCg4?>oj7w za?AK#xQaIDbB+Vtn35yDf{2_$ZTz_>!xDm%@_bMKyn^Z9Fl4X88%<9)D&2&7$RcV+laZLmr6GR)xy@EU*kHRKn*UrN3Is!L!U z8MKegL`~5rJX|nh3m1y~{{GK<9KA2kn~{>luXEkQ)9QnjsFCo~lur+x^K*CqQUV&9 z4HlqSpo0c0CE5LM9{008Y`NNpe_PHVkkAdpa{)!|+w<2Ms{^6LQ{;}!;5pKfZSOTD zy792~c3}!4oUTE$mc)}|39sT_k-ef$js&M3X%3z@<8v{To{&s7;mBmgL%@sr$k>_O zP;TcsW@Pb7mAdyBh>@z<+0Xh0MYVw*H*8Pv9YWSkRo5l00WzYS;^0r(I>s&5bK|&) z#FHwlpfse}I<0l$$l#f2CO**_iRaC+94B1_CQ;J`s)1#Tz<}%N(STVKv!51{Z(gRHNL$zM=sTB7kX!cVh7^qn3WUe<2$51{^Cw-Qu@X?QQ z(^ww}3U5DY^(85na(q);A6|KOe{1i~m7vdu)Y(6Oy(waK-@!2@_~j3t>lu*@z&xg) zVnEpo2n3kv;`fs|Udp-$)_qr*X|2ac+cbb8;4Bw{7%+f><>Wj z*HvnrEcBc+rzbxB8z59QTy(S1vKZ?EynhJ)~iu$=dleUS=ZE>KxE9`Yx7QCF1AK}T3Hg>E~;GNdNF=~ z%>u*?Ncu)c#foFOx|HAPY&~k1gf4z85sk6$s(+YT-VW@J6T{ZrlN&E#T?;hAR;%Jl z(kkBmg>>Bxs!uiv(%bPxb29b>T-Dxmp08bpSz7*JfWL41_HY%(PZAoJmKgbw;q!qf z8@3$k>o+{cNx)Mt`YMv;0E6+?;ZzQ+&9j?>bbi{?3!LX!?W(nMEFZPy3mjL6yUyAJNc zhzuZ-jj>45g+4>fcN>;2m`UgAI00f%XHmcEApihxh)ITMR3f@IQ)`@bmNeako$Oxx z!jOZ^4q7u^#vGo*nPZ^}9ZBg~ZQh*V`eJr;zgMMVJIxtkh-+H7xtQjjCE*QX)2~P@ z|96V~@7TI@6Q;LahNK=WYE{}dzTGCVW>hb%RL3VGp1zf}E5=#*rCnmM zi$kvw24upO4#QU_B!-rJw%Dyh(h}L$!uXL{GX^OiU;xdrGm-X5y68;e5>ctbjtGC~ zi{cvw;2wB;L*u>WNi8es2E|>|15c>WgIyVvIoiL1lV5XS9+?L<03z=}J-W`T^fdDx zCh@Cii%;8zditOW@px!?KDMNLFKx`6N3Tp+6KlrndcZfl0H6nr_5hLc2so9Y^qTNF zr;L9>lIji~rcm4h^;m;g?XV>_-2!$A4yxXCx?=OfqUI|GHYM~!3X<>*4`2R$(?aP_ zax}mA@_+=rd>O5b1)S$ljklR``7pKy;rIgbGVY??#wMp8YE;ucZ?G18N_UMXy=i*q zY^lCy?c@q5FSh**{70~qaf72 z&jkFyp?vcI7H&SJ0u`JHJJU-}vt9JtH`~7t@deSnM>1wzy)=5pKPuH;>YHtgR{AHMxOgbdtT%C z(-$D$4H4-)ZsDQ#{qFbmd{&r)eMWnbPdeA`m&0&UO`?Rr&?)V`t{Xg%rD1HH|LHS zm6f-WDIFqM{>rB)`FFu0kXIP{N87uMV^PDXr)-B=HY@V&g>Uvj;66-%FobZ?M(s?ufmts)X&2p#c58UeD$<*e;xyYK z+v3XeV#1g_o!v-jqk%NrDH-sKI%1Mw6PJ&6l3Sygjt~%9_et1pUA;79#@9#cJL)d)|t>UFKZ?n&@Ncn^u(q_RsBEwO;ap z6%Ur=hHiV$U&vPfr~kME<}Ir;PF=O4Ska2}Ol3)fvnC3=Ui>Ht>OCP~bw2{&8T~o# zM_l<;7d~)eeCdk^rIQic;ysmsD>5RKYZoEQL{oEruSg||h{p5M&<}LT?IbhvBosh1 zV%m6=DVT2l!HT_$(F#~$)9dDr*$jMwIjWv~+gCmzsaNe$&coc~{1}j)FwJY0riq>R z%6#Cfp(k+z(;QpAbs|-~+;CKfaO;>C^PxIgAz718bj;%!TD;LW_zWW3Aun7i>zG0NS#ZjJ-tp zD&R*F`x1S;(dV-hw@3VD!zPhaVQ678K9MtEl25bUou=1u72C*~bwT#q*c*i!Bhj&4 zUH5PP4a{4nSl6WJM9XQF2JhPLRx?0_Yva0*Fo~@G1R#{g)q+J%o;kL!$_La115&rq zN@4255pH9Ox8AGB){eRAzQm;TcUM^kMA~sn*$&kyr(t`E;{5BQ1@XB_60X}H&q#ot zw%i#2G&nlVf+i5{gBQo*=8_6AX?~wpf0%*%{H+1Xdny!W3g6(5wd?4zk;SRppw^Aj zM^-*yxs=1xm3DhN4rm63 z(N`0Djm_pJybInpeW`t3(i}g!IVSOv9HwNHfGzXS$|=sr;OL;3{;iez;|lwR^KV@vxLR6kiH1R3 z*9-V-*HAr=)ADs;``x{dt^9jpO`b11+6<_AG^!~_Xb48e>`i1Rt*$@1y8D*Zp%lUU zLi0o4*%GVrMw_OawSkAaHoxbBH1`UlIs5UQ^_}IAQU<^t27C`%4|=H)<#yNiS7aND z+>|b4@9Id;Q~bPc65%KGnc1v#K%}&8(AS`d<71T-?O@&*l(-KlfIVw|%N*f-_SibF zqTN8W`uN9R%XM9Oi;~KW97+EaG_HN3(j}&y1|oiy19cnOi-UGaPSa!b4!SPW0cXkb zf;n_%{8}3d(P4chfM$()?LV`Y(wl+l;wPv?gjML_??U<>yyEUb6o<-pCG@sI-lcxr zbxH^0EC^$P4*rzTcDBW!sHq_{SYSsyid478?AQrWt z+LhdEaKuH;yK7t=Y_c}qMok%l6L{FP0K3Z&@PZrnVU3f@+o8G-b$#-qDaJf!0~g+= z!Rq9mipF4`tWm7<(973K_!h#js7TC8Er54oO?!6O2ztYhjt`0A!?$1X-dN`0i0bgi zqTa#Kdju!+4e^rDx((hIi^0Z|1y0M|SN>6fsc?k@+JxcIAKtlySnbui71|jltJ_1q zeES(~wt?T|mKNh0ZA*hr1G2lP32ysE$)ZE}2imIp@UxJX{|g{g8ZJfgTP^#rm$&lD zuz<5;ghUYn10)+2sh@NN_-YI;Gl?9uO-NCB1!nGzU12;c=nSzMHpdG^Kq>558rGfJ zt|m>msE`IxT{TO*6QD2tgBPR+M7Ns(Aq|vFfO=@hByZ%V?L~muWcp6R6|t-b?F)Q> z-TxT3X4|O!u}u|n8`-MZPNFz0Z*uq`8SQ~02WC&reLPJnCz(o6i{Ytzl$!z%1OB0| zUKkhir;4CplOyI~>v~QlpJH9JoF-B_4$76_99qAwMI@YKTNT~fzZSJshVI>=Z?g|O z{Yq5Ogn@%rBTR5!O_Wrnv9HqkmEkPgB9LeQSOl6gKi+mt^ab+=0YUNv|P%*n~^H9F2{=jzF&O0RJY?LgA=g*t+)e-Y| zzwlmvC|8WZpgx&u<&L2_a0`mB9FhVAK9wvTdwD_NY0{;{^n1uo@l#Ssq>-HtmM>X6#iBU1lz1Xi=AXM3}D+HxY4NHUar#MH+|)CS7SU zmQJ;|71|$1OuZ7yzjfj0E6Mo}3ta!v-2xGd@G6YpItD~Vs}W(BqiyF?5KAL%YxE5m zth3%SQ*Kx4LgY6U=2cqI`F6X;)5)47mDp6zw_-l@9GU|y8O7`XoF#X~I*KNH_m`B~8)h1RBOaw3Wu>VL$J_dgQ8&4pGtb zF3yJv0S0hVN~A|`#7>uw*aKxOalXI9*pvc0Hr8+SK4z^ zPm9m0DLezWgT3x>xi>lP?mXrJ3_6-irHfdgO&76vH(w%~UtXoh9R1NiUv2G$N*@ z%VbxqFSih7^k#?$p2vGV^Mhg?3Yll;v^`v)q*=nP?W%{4VfQLC6jJ~cw1W4zk1wC7js*&o8z zW+im8n4!Br$!Wk3gT!*cu(bpK!-RDockig-MQUfo9=$0Cn!1%RGC?WT*G&XXDxg&% z%Q7NvWjqFR?JKV{T;03hDetsXr)Ly5qRroq-0#hr6;{cAyKVquHS`V; zIcPBGS7V0$&MqWxPWL0qFqLe$>;+H*5K>pAKZxW4V?gNxCl7!~+R4JVO7V+}#{9Q! z6kmRUgU=}`a@lE@$4Sd7M*+;;OZXz4XZJ~b=pZm^QEffq80+z{1g z-W1&4Bc@8!dzMe18lRY2;`Z~cFoOZQdtbi5IYr>Skf(hP64m#V`%LdZTE(pG7Z~0}Kdakjkdi*SIkVuFvVt}T-e(^uqsqHZu zWbngj|HMAk5AT#G=@bBKca6;4U7=rekt^W#AYq7=0HzQOlQ%!eYl^8|Cmx7g(T0x3 zq%`heLAB94d0gPu-{cMoC+=8TY0dqWr-vCSY?hE!4DWAA3xQH-EnS*fzl{08lYTFs zpqvKXsRYzDiy4hoHMW0r1SlGU4&#=GhKBUBuj{|V(`(MP0iwlyfYGzlDG!9Zb2QqC zqlvT`Wa9SeD9Y#SMY&QtkmFy9BF)Ym8sR4RLD1sRdIrn1fKIB zJ^lCE>}cR_cPeN5g{)wt>Im6zFf{aGF6=rM)WIKOL6aGnkSleuwgv;$fLFAFYXXmn3R{JoA6$ zdG}&&7(kVtnkQ*6WpS;i-(rK{PhlH3b46Cz{2f&^%w^JYjK7N|X)FDqgZJkAH!b(M z6s)u?|DKpqa>t4*xwSJdv~RwWnXtocz^D*^AY#XwwKOe&QX zCDW5#r>LG!O^Y5uzwX1%IPB;~!ZtB#-}1K`pHGYv+;wUt9MgWBz$N}#WTMRMiM|PND(vX> z$~67L&Yfei$z(luDF-zLQaVj-5kr0?%!reJAbX~A0+@>)-BHmVP&<-OmlAsLS^1mY_V-4JYH9~!`OiO#Ltnp|C)cc6ngf)!%Z2uJ& zm&~-`E29F}uN5u52?ieJNBG~^1|m?zub_7Lm2lgUsbS!k-$@6sB^1OUDT?NI*2s@vlMAF0PFWdi z6;t$XJ1JLR_8^bztQooP-s3~j2Oycz=Dhr2k-nQt=z)RlRprxH1Ufh1TK}ERHSVkp zHVmGW(kd`dLF7-4fmYKu=~gXiiUf?cf0O4R1_VHYrUziiYpmt`Ted{6h^ z$&n#8_tAjLU?4n3SmxJtohz2ksKrNIbuOqMMTZ!p65*4<*IQSH<>)=pFQEZ7^$MWQaC^7=N^l==qZ z7k_^7X!G^(LgYCPt5|_P@yn6RNp)u?Yv z{YvOStf5Lai736WxK(1X8|(I`v@t&b62hK=_h3XTLILwr)WLMm2(y}`YZ#MjLvv8- zK%aW+_~Y$QUc+=w5`CjGm&rOvi*rkj6;xOFne5uk({;V$gI>uyNtQpTIJHzlv-9x( zqlJ0hh9DPk**3X-U8K5yiUrI?veU%i2QZ#zJ*qjg9{Zp2?ae-o#+dxh782}D0o2+R z6wJLADqsVJ>ADHpKjvi;GMHHXJ7e}x>64_4>1O0Jl?Szk`KE=QwwgAeX6M5S$GFeu z#?MpTXu0TG(dHWDm#f$_I3;$8``a*R0aZS0W1J2dijkb*uW91Fe(jM(-2C!${iqvi zqf;u8X`M3pMm%AM(r0OlyR~%=oRwa#ksZZl-|>?d@qrW$P$eU5UEw^RprK@_*`qh5 z$6sflAVvD5Reh@n8Zpgk2W{`q^p(}O-`>0eJ57lw##FmDh^C(XD6^;RRqdl28h=T$ zN@=*rXDd!Gf{Iz0^72h!joYJ!d3baUv#}iJs5}QSB3G85tpGb`>M(yQga0+Kw0=eI zy8PaPo!5vpT-)Iv4EVUG*HHkNy($Y;>*{e4yT#O<_;O(~oK`rC8&_B|C##mv|JpFZ z8JHuR>Dz%0-&E@o&-H#RPcP9!8LM|c`;!xq%gOCuy|mLX^ik0`l~4abC3`)7@r6RE zU1ez?1-s9N~X}5x=*d+#h?-Z0k6Gv5&mguXK&lcM&c#=c}{K{ z^_=-Ipx_I0f5Wa(cKB6pU7|oT`^KNDvqiQG-!&#rQwq2yH7s%!|C634@TnU!cmUKG zAR2t|FGGI038?$Fd@eQ;?$Els>|s0S<5c4qA&JEP!E{Pn?kh4@vjCGrgW*$fhuNn` z6}d*}&PGXNY+Yl4F2KyZ-8jz{0e`*=4IgKo*(f+t4sQ6ack>1m9HYLinNqz}MjklKz`r)gnMp>M6RKARrxR-V=12W>%}5?Apt)_5bq z0K{`EDWsuIi0Ex}T2o&f+M;-!!D3)LE5)O-vNxN}boHKFi;ISxjjL^fQZZ5bDbeV zuYU}s@oMF>hx9MA@oI$_-v~hLFjsU|+4be0S+}H{$$|}38granBZq-auZ@aCJ-0hC{4oSHKFJ}%Rvol7+b5Aqx8W$9sMGkzPZ_PUdzHhz1; z*}Ke1$cg`?kfclEk1-^FgjY%K@sH`cG<&viaJxq)rW1XFL->=d91U_U+G4x!x|OGS zXBM7Vmy^rdYWjx}(wot-S>hyX@sR1ev}e>j0*X2;#W5!0zr!;S%%AOVQ~qT~y=hS; zTBhJG+RZY_p>9XW5grwl`qT;BU>x-jAc-b2P&%g#xWi2Ird7fAxX4b*K<>Zh-RFwk z%h!KQ)zzflyIX7y_$l`p*^iIY5Vwez)g!{Oo9%f|ClW)=LzpGh27>m9os<3^J-;(a zfU*_1vLztj1kd9vwzP@m;N$9@1$0gu|C3JQ1L;4-ZqmXk{K4L%7z(YvnT>d-*qbTW zF7vZqlC18ZIJJBTjX3$dA~Iz$oaR{h5!ZM(>&gg%kQb!37>~A@fag#0au!a#aexPX z46MtSci!IEQ|A3yGcmy?KBj9u37e4}&ylA#ScWihcZKow`sM2;>lY6LdaEL<`{G8M z%akDQeBJF_h>lCZi+4wd^+C7qU8f}tHh`t(`1S(p(=&=#&=QI%C*aXGKTM+3oVCp& zO<46@%E1nojBF`CtLxN+^0PdHZ3RXgLepurWf-5!?>C_!^EBzaf|K7)p*uw{jbN6)FL7657yLgr9Flz#JV&38X? z`Cby+xj=?1LZ1U4gldPO$BFb(<2rJxThF0k>iRfb!`{!;E{SRZol#9r9ua{KN2R(; zL+R25Z9MdO^P3yDuA0>VQGv=YenT-nhL-Ji#|B%SQWvG`NIRzq z=Jft8F%o#&S-HJ-*cSeR!WTSX`u-UUf4y63z+H!it#}r*&!`XXugNO{TuD;TB$VQ- zUMzu)G$HA<&yl>66BT$)#kOBKfS>a0jem4rs>p}bbAR2Z3b}SEg%cOgDI90; zyMBX3BBuNgQivx z_CZ>JyM{OmieoHs(-JI{$Bv!&H+aB1UGh!m+@pqL?d{!S5AT0JCC+$pF%_%CmUCi1 zt%U8Jgs#r1h+(a{ERTnCkD)d@50WZ|x%OsuG;N>X6QlNq3Ay%LR>tBw>sB?oY_VGt zQz{;7_a^Z7kb%8^x>qB#Hw~>ACKl-kBL0xBwdNlwY~`Tdm8Z?pKK6_JH4^y zwYml}Qs&>Upw$_oZ1v?Go8V1{Dkw`R$SaC(LXw5wXYmrqeNFS#?q2*5 zB&DR4|D^rn#{2Fz(ghBs)&C$M?!NQg)w!GC1dPq7gXVGvP3JcMC#PtQ0q>x#=W(RG zmaW%Wj^j~qn`TX6C-zr)n9&0l*qUA~!8}xNSX4qzBC#P|ZNJjp37ud8)Vr|~r6uX3zBlZlh+Gq?{;(Pj6hCA1FkfT;z>v{;waA&0Jn=$|5 z8T=Io_9suCOSOEVsLHzNfUsE_Yr5<9HAgu_bjn}ugM+WxPZJ7>M$Mlo6kZV&V>8lJ zU#E5hK(~C_=`Rp9+nrNdmza3A&D%#E_d|$N9Ir{cOvzTakUznWx=h7B*sBPqusXzd~=Z`)K$Ux&Q34F9<`Q;~)c~Xz#NkvSs{f3w#>A zcG8qfc2-{6OR|mPve#`gf&TDtWU$%RW|{LEl6;=9QV+1C(bP?+^uc9(4Fm(9Rug|VjuL~;QEy!H-a+dZ+c^s8sBRGCp_3{0ye z?D4QNTxPfR2TlsV1)7*lvl~WZ#l4@^VZI^5gC+LMzi*8L&9Px@jE3WtCHys6@HU?@ z#08(N+WaI>`N}uW%YzZN2iNCarZAfHro|O_$K*@bkRv6W%cxT&1H}u8$kBvxD9EJ! zV!T5*4CIS1&u#Q7$}w|$m4+kms4_157cfQjo4Z5keUq3+P{;Z(q*~>K_xx)jV4OU6<{Lodt z(+Qs&LxxiSEo}HxQ2ch#Np1yU*4fL)k>vTxKc#UF<3|p5+Xg+9?iDJ3U%`kH2pre>N#4A8t)y zxDIC7oZ@1o<~LRR=f8`hiQ^|q^A|ap(06!*p2}AGZ{~`ApB5U3b0A4jW$-9>HSGGO zZa(U7We4vz4BHvegSEh#CWY*|{AHu3JjSeiX6l1QDFfC7{+$^ac+{PW2iFEX>wx?1Y<@tr3vzma9uRn9(p zc8ZZkjzY^3fXeBtfA>@~*X7}F%A-%qdHJtKirMCMdA|Rr^W^Hy8FI|~ zKFg85njYjsXoZV8!rysbI*TC6PhC z7ucHr(7_aosp}Abn zm`n4sO(No4hF9TP;FKR(*Zy;vUfx`1^2^FWCOs${4|GlfmQ2Q@&f&94sm0KPxpKpT ziejh^TYYiqM0A6+_3jvBWfjBaguh+q@x4pu+>f&p-`Igp7rgfL7=>}JY5S_yu>BVx zgi!1|J*J*oE>>^NLP>$X@OLOVi-S{hX}_+lybO?HKYp7TK{gSOjFsBCqE!>%x})E8 zPPYC6xIZ>zwY~t{(Hk2!j4O&y_NE%2dk^WL0A5}uBe-^Jv~EkW%%miLsEV1Q*X2mF zMh!gX=Nxi%_UFGEYhY+qk=hd4>KHR~^YD_kJsY$v$40{Si<~|&)C#)&^XZ*iHRjRc zSQ?WQQ$YASqZB8_Bzpi3ur=JgWS;m^H<03<4e*y4#)0w?9Sw%)qv#9oI%2}N@NTATmKk0 z7^x*%X)$QXn;Zv`^(Di-nW6=e{Wc$w1ob(KFZRE3!w0-MuNG`r5xb=qJ&?+umhC~V zJC^FH5(?4nF~^;D=W5g+?BfnVMGx_2ndKr=!-1 z4yeqUd7|&Lsx0{C8b7bz9aSz0E0PS^ds4({_P@3dlws`K-O2JJkz);Ale-9Vk-J9M5Fb+$m}F9Jt!$$aC`NP%?URE4ua< z)uwxHPhUCQX||XQ;>WyM_ahXG~mM?fSlX z--r3eTHMrbatNg#aW!p!%h7ayqR?Yjz`SqOW$diCqn}G$i4^`u>dpjn?fUxYGYa#c zbr@K#24ST#sc)5FQ{<~BX8!Xc$osQ&Ewln@Jn?e3cAaArvaWRI$#?RmYp#CC z-G-OI-vU1^;%&ft#xZQJ@SM>r1>X2B)Il0if4c`8@jxKJb?}qKi)Vm&@^@*k)kpN7 zB+o_jb4|cT-wnY)`1`~GYSiHMw4Tg;SOHJk#Gvv13tr#pTnX@=s*&Yp$sM0*QRr%T zS_p&LVC90pfw^x+6<&eHeSLTdP}If^ekqY?H*YY{^i=jm?j zytAhX-gl55j{{nDbY)n__47({4u0pJvlosPx{6PhPRl&yuq-SY(o$fUwBd$F*o;&;%WXx-8tkk`jNai9-!{1wAv0tx83X{X(=PsBtPRcV zYK)xyzFGqg$Q8f=*-Kh*{%4e0diSfrLvGgD5l2A~m@H^eR~fCslnUL7`07`#s!KmFdNU6_184aqbFQzIt9`k-g2SOd&%W(p z4%g0T#9|0rXTQ{bR5axB?g>1$m0z}I36kK|Y`6EKCM_5Tc`H`ZTOZ^+tdJ~`ht@Rh zoeWPA%rJC^c?WlUH>Ek5n-u3Sq-K?BBxdwkIpLudSL_WI=M2pIR**f~ZE*9YW_4Ik z*Sahq(<%q<6K`K)+($2+=pT(_;;YMCC59%nw}QM`87qAb>M%nHV(h9P;2=MaHxt(5 zToKov^GtfV^J~{By-fmXPIGx{V0~ChR%ZEX*Di7P07O_iQA^lz09Tl&+&y?K?X_-~v?%Kw z03sW{e-2YO`*`&2Tz)m?9}1Fck5VtXR8pSI{4%7yie^>ij{{{N zrTr1Ar`|j0l9F42HshXeEEKD|XWWRl-yT^>qO zj*@fE3=DS(>w8_+ zztLkbBEKLw(r&ibWi<@3^m=h)IA-3N=WxaB05V#Uen-zc=Kx7iHaq>f6xe#<%bCQ- zrkigS?GNl%{IR(}3JT9H7qRuQk4Ygn0Jn?(Bt~iT(ZfSub4RR;AEGkALyH~?DJ#vs zQ!_FiG~)3tWhETEOr4l?PoZQ^Uv?}qrjjz2Q&F}bS6?SlRZ0i)!vQ2E(5rg zXW+#P+<29%sL}5pJ^Rz^71)-QBw710Y8DFNm4$ zb6EYlk%6lD-7o<{FqsVBi9~FOqGBpV=4T_WK`pz4$CUbSdee8`x82J-q7g7`Uj#cV zT`IE^;!|=J{FOSttXM!^zG0#}n59@%*;KY2bs`_XO-ccC;_rH9RJz2<``_N`_^O6A`eBz zF6;`a=<-%9@mbHm^G#b>g;g7GU6xkZLUU=hcsnI{SPv2htZrJVCcKUnYznl_7q%VG zyF}ppW!$3JlHwu_uioNoM9oW$-N_56tzo6b`CEj_4mV*WWfpzLmoC0@LApT#$&K_9 zs;rgzJstI2&*Rmvx{s+%R?K13h9CFdd4nl!#9jFvL4h^T$bf6#ZC34bZ_K^hK_Yzq z`!Bv$?62Z4%U1-s$Z|B|X95PT8`ApTg$(glfFJ?I(M?*Bj(9C?(BPKl3;)f?d60Gt z9m#U`7c>>E>of05;2!e$e08>Jye)dr=zUqlpZ(F}rYIf-+i&?$9Lz#D_Y}W>qngEOM`gtT>5yk0@cOe6%AR>&(h=_5nDfPOR zJ*m|4yZmfdhm4289I=G0e{SC*@_!Ax07I2Q|#l*tGw zlNKxBvoD`6ya`zuFIF!W+W9uA5#M0kN~CehPrR&>xS)qR&u_klYnFp7AtDmWO}l^j zb_>UIVQ;X5#yivb{j0mniy8vEn|(x;)uS}COA#h3>*zYvk{8<`E33X$w85`^c&@2O zO#GbfA}4APp##2}#p+>V|5(-hNRWn0C(ajL#Ic6TA3|A^2_AdTuB0927VCCS?LP68 z9@3tI4m6GVE{seJvZ6brkVpNH(H&zhN`Vzq>1NGWSP;*@RKA77$gAHs<=Q$(bpAY= z8=36v?=o*1!>Vqw7ELfW>X5qX+TPYOmip9UEV_6hM|tpx!-%iFFiPgn z{7Z7)y86tRp5oOXxj8!d_jID-VX;L`>rIgrnE{U8pF1UNadOw`yPnn`n_o z3gA~81?E()(Dd4CD&-Rtf}~H#O`*m6QG%KHa<$oaUzz8(?2ZZ%38e>Rlb7MkGh&O& z^tZgP4BS0W!lq~XvJ2&9jMc{JugC%Qdnp2PuJ1tPM@niD6Ywr zT|7jYSfDp&rHeWDBU*HOwN>53Q^$3!$Y|$Xy9vj#wn|=#%YtIW-C6%t?&7t2T28A{ za`~E1xtdvnj=IURTI{ZhwA&kVh3uc4(M2-_WpwUkrkB$ zb%G*)&b`m5ooxKJeq`?8F7%1RpVwtQw?97lhiA9%&$^_cGQNt~*Jxc)|Nlv}7s4() z3_7#q`&Rk=CPOmwFRY^J_ybJ_?$kIG8bF7g*yo!YA3#G+rmX?VS0upV#EeBgPU|Ft z1vtKyQ?ALa1~J`}t*}92GVr8@kx8{BfM^gh=RbNt?W41wi7c4ZJw$X-HpO_in4~cE zqwR5g(o{H@%av5ycBbgd_69lZggass_kI`g+8laQ38KQv?G`*leyCcGUoD$`$8UR( zN;<#Wo!g7lj(J;k09|jdsg{@<(H@?O*ol?`1h{l;LOjXhD;tpKR zpk11)E*CbDov%Aq$FStj5^C4!XAxRi_^zW(6brk%+xvI!+UDh)NLzt$>xT5<^ml1$ z-Th+w#dpLP_2v?&u#SJ|(l{V?2NPyAkZDDvYu-ZFI^DUY`_oN4jJjtC50{h6=2OHu zU0>@)h5SQ;59~(qcV9{?gIZ1tK2$J#?=T4<;`lYBnqzzZBI!~W$jaT4p--4Qf4|u6 z9~|d-Sw5H&bu&O{^@70uIzic9!7a{}Pm3cnZlR&O1#|PYu4@24W3*4OrFf--#ylf( zp4oazN6HnLNqB9ty|F)vm^BeRveo8DPVJZ2;)`;NnB~{YHId5s#iOE~ohTcVp}B@G zrKp&e3mA(~yadTv)YEoBTO>`Y1Vo;-( zcs&@GCO}=zc}`{z>yFf2FAs>M@BD^6+Y|XX^{ut&obI)G%O5eH9>+Mp^Kk4#GmQTv zwf;!6q+T`Ah~a7O3|(*3-`9+z1|-dW%ufu_K-fbLOI5?!_gpO!9*h1GF-~DfhpPEl z&&+kjJ-{Zv-FzlN&d2oW;2(C}6#m|KPFzSOH$tf7B`I<<_1cfLCCVzPhGG^qY=;Yg zU&=C)Ju37CQM1C<8alno+S9?~(OH(D7iWW^MjMviP~$iSrv=zV8U7T*!dljAiS1tl zIW;{d)QL2}+Qufv(bHRJ+>EJ|wAwDQW8)P*hK#bhzhlB(pPPC1f=JM=A*JPbE?=x+20Uxzcy91E(RJ&a2b2JDW59^}(=&gS9*u=Imt`_LlN>PI9X&izabXp6sJBk^+J}?M8 zLE&@T*o>kL9QPetl%ssUa>B(F>E2E*&E0U)I?V@X^paKDs>y| zehkkt@@}?-FDAf@P3tWLwuc%*%=up4(H`p?953pmt{-}(QTWC0pL<>7$JC46^QgQ| zdFV30@Zx?9(@OPFQLx81=iHhQx1YHbzSsdg=!m^TxACIN454McD%*#DHrbCGn&E2P z$Pgb)TWjQgj&-_s&@@ks{+qbih+MM3$eeOWUm_cz9ajMDXaLhZD~_1V*+-mJ5f`ae zo5NO#&YotQn;<+oaocrm;7R6kh9>dYoG@&MV4)7b*Lp#ns|7D$P{9`CsdbSbD z(c)LEefKJFT!Mnu+v9sT*`|>sN>v&w39D1%` zGxi|{u4vzVW(c1kySBDw|F6-5@4JGXm014-2(I4OE=!fxxNR}POQ!k4H>faJ zY4}?qri1|wxgSwOBwXgHE*}UEf0zan483L-qdTjv$YF_@AECK=E-+~r{o=}ROfkDO zo10!N-yfE(1)(-OnjZ@wJR1aSn^Xomw{U^|1%Io7mpRCLED9}XdPUA!`nw)~ zd+Eeg`M~6^MPCKV*fa$x=DB!Xx{&Q`OjbFbB1XWhEAMsEU%bZBUWhHje!}erPWpWG z#@bc{oeU-{y`tO#84bExaYj2xztok-x(VtnV=>voEaf0F1OcA-VwWss7C+q2Y?4ip zbFjXJqC_-xoJVr2zet*Zs;-}@Z<#OEu_OncDwX%2`&#o9VNmR@S)w4F#y<`e3v2&= zdmdXy5T>Rf-LK8Hr2aC5rCg?%qJJmpq$Q?Ag;rX(qi!CHJV0oRUBIdBcSYSLZS{Oa zofsxEi}rP#`u}b>Aj&FwO*6h!4>ok{gbY^*UK@O*fH z=L5QO0=7b%Pkoq?R;VxQm&v)~mst)_A1I!|C@M5xz;09g=|-#nP6Hf~b>~cwSo1_9 zL!n&FP1o*rngA~5AoUvf+Bg_WA3)@B&shO^b=BV<=^SEz^q@CVjXZz&3*Zj<4Lze> z2aQ}7C&=uO-^Z?*88h1+_RjLQchAtu_WWim1?^?3OYL!3WgkPBi-7&6O%6U%V?+YBZ=~{_uzDAGS`s-ei~Mgrc9mrbyJi1BlGv?N5te$;h8_kaL_yNiy@t`aMYE>ua`*mJ# zGb=W0Lssv84C;hv~bPdOAYDa zb`Az5rAIfpz)6f6|L2k#q!fH)5ckxk3ZdqsjjLDbcwmEJ#GJvef6{)_g7)B zQOHPGdYt9Tx&d%kaa3Svs?!^sKA^D782!b=+AG+>X#_SSFGoQ105I13^c?u*H3G_t zIvA_h4|b!*IVBwaD&yg4V>loN3-4%X*9YA4ouOF#3mX6D+-#OMjS)K++)rXAG;BD@YU{av)97-h2wLqIUV-=4dS8>i)<9G!i=0J(v;W+ zjE`SFkrg>xJ9f@W`820%>nGl~8Zaf>p>$5Y_NjOXSYMp=d3E$svv#+08CGsetTgGL zH>b7MiofnZ)0YF%{1lh(0f$5^H;d%?PF3q%dx^7#u-Tsre>t_M&3LNQ_XfZ4zH65M z#1v_7a4m{I1dP$C)%^ADYO9gJqK<8vy-a}&?w^+1Pfg==1iawx5_xlILBveiW`;SW zE9m7`0H(kMPM%Kyb~B&0FcO4;CYvPxSGX^WTA*J;(kUzx(KNRL2Iy%W+blAV%o82Hokl!=$uAOs)0;|+A2EIfZq@j53xxQ^ z7_6TF+2lV5-j{M4&?Zrlp)VpYTuqGRF#2C*jDOpol?Nuu7)%r;OZydUiBsb|y9_gm zoGGYgP&H((#&%!ANsuR-{@?S~BV}j$z6SQpxebU&C;$I73B3_c5WxWiD3lkPF57&r z4=W6j8UlmIvHqn{^%#|l^3cBi$G;x(b&5s<3XoXtymP?o`8SEiK{=BU(CqRd;4r=7 z682lrB!ESH-dz;u#bco|1iCr2n0yksmSQVjf!2`E9M8e6{sMMk?6($}3eC7IsUA;f z+a&^>C`|R{)JbAq860?@PSsFH`h*3DmM`e~ADUCgL(FwPMP59BMg^gnr-)Yq8(HBm zjF!dK{PjYQbVa;yf%5qQ_|wB!h}`_S8eN#gp#PcRSy=jp%H$4i>}~Dg#svWLVvo zFdi8^BFFhF2$x_;S>ObrJ?*Er7p6VG{X1)nlp4r*e~KN$!a+L)&FTODEdpU4prwu1 zzJka!m8!=7v^fZm>>O*TFuGxG5(nBb7z;!K!_TDfH!x3RsT(IowRXIdzy3!wk;|M` zMg%HxXiNDeHf)N82@EjVG?vfj zb2(tOebm783toIvh80U1Fqjs7)=2a3Yy9@0-$U-Q^@&{+P6E!Ze+Y7l&48x-=OD&% zoG~Dqxt8ROX&?a+$(O%wVF_%xBKV@|2QQ5Ct?2!qXSnkxYNtq{q7D>wc@m^{=wJkA zsATv2zr$a%K1jh|{}{kUhTEq4Tj#?mK5~iwb-t~c2DlfoFYrz*j0YmbG+lW;|NDy7 zjQ_sGhb7!@DoC5;V+h8UoX+(IyA8?lyvB?1$~us`sjoan|FILP{_~c&JdT6FuQ*X( z))Nu_V0IDwedw>Vtf?N^#8&z0VM2u-0OOIkge*g)RKou_L!$pG0IS!touz4ImBA-1 zWC;JGXM2~UOj~iEowi@ad7YceMYZ{8Rqq6^-HPBT$kUqNXNoHDUq#i!vJJ1W0D8h) zK4_}9@erWNX+h&(WBdpyrqXjHBVfe@L}%8@em+8+L}9abWzXYh5&5nIU9N;g0FE0Vk*`*aLnz@D)NbwXa|MetF zre<^AUaeTnSJpR)aXw+@@L$4B1O2Mk=5Ji!mA(7tR0w!?&P8^eMq?&R!yH(BNhRdz zI_Qr(P4tBy{3U-X$A#xjEr8u6W0%r-n~ub#Iy3uoKY7P%BpDw9RJjq@{low5dSk^Z zl^iRQmvQkT#c>h^5b#|JlUV-iHNTcmlatLDIt>02yQsut{{H@HOPXBGUpiF(I(0fn z4FbP!b@Y;qKrZ+bNOK=U!9f4gw0i9V;Z1g~mQ7sM7DncxK`fF*t?Q?KaB*M%Qh_h< zZEbMB`en<+cP;pH;I+LmBbEGpKW&8{m#_~&-Qx_2SkI@|i+;e{%en`5CFyMD&t0h= z*4r-n(w5tUPiQ$DWXTBh&bR~YbBTNLc(8ee18r7)_EP773Pzx%lLl=6^v0LY%^T!7 zXCmdO6}t!{)jy4S&il)}uzzbG0SLk~D8u@76?j@O>8}4p(;BRAo*%qMp-=OiC-MRS z8}J;Q|0^b_5uPxbexhjzrk&XbZ29mLL=Ni;r;qwqaLFoM(lQe_e&O>Q`seMebVJ;Bbjl)BK3Zs9a@ExoXnl%s}!Ixf= zk$imxibQ8qdR|P_!?F%{h+(cFgO>;3z2cD-5%xRPmA_&I>>BOOoB*3HVjROW3p;Nm z>=<{xTPjI9^oUl`3!pR)=$@qw#k8IZ>&H`pmp?rYpE=f{6cTy?RKHEHc<>9V0%B=! zMh|qd{&PuOtnHbMf%235copOA^#~)ivzTVUCjA3Y7w^)m(FFDgFgQ4tpP<h9npSwX;C3wA(-dN zEzGinXBMi%lHe{txa3VNBjZ}e;a9mBp6CE6oyEeJFrpCFiSM6H+h1g1bZBuTj(A)C z(9=^ZzF23~=B3xV&`H8%W}CwHUVjS!M8xUqc&)UxG-@Ln0X(vm52w|9_{C*P8(IKv zbS9LJ*UN}ZVpK1QjS3Tjsq(uFBmdl868Dq)qHFsiV{nYl0A?03lcmJ~;3}BMcwl^%LVm&Q0m`?-#4Cp97pIOMw<1H(a!#yb&lx&rZC1d^&pQLh*7IEqHUm=q5XKK@eLq-x; z0TTLCBvQkeG0x9+!7L1kpOx4n9;A4*+|uLH)ZSw=O4;kS!~wf4BnC0yCIsQ_)ALD|+pjYrIqqhG^vNG3EQRh*)=9|n zYDA3g26LATSvGBM{hn)6Z6P3HuwN!kQp+FhiYSM~`*|Ey*WNpOWU|$7{EE0=j6Qe~ zp6hsAjnCL&P(t-_Jd#(!ZQ^0_9&d;7=vFgBD9?eU`9Y_i-xyF&$_NHsJQu^eY|+i|TnGZa*3^t{JQ*r_^z{qT866ksm-_XIU;W;VEDS zs7G+*C6Cl$%$y@75A+3C4~RXJVK6!$k1AEa($BK&C3^iB*0Rhi-vqBRf)gP6TQgW31vKcGHqVy&27niU zkk*~-l~vfTxL*fwU!=3iVdOB}0ERp8td^gy9fkmP1&0gcb{jv4f!^%q$-l#!Inbd- zVrYjm`@ZyebFX2Gkaj*)na-ouep8|u(!!;pl+fp&!dSWY01=-LxlVw5pH7pGcbJL6d!3*>A--1dnlJdrB&kd|w_yo%K;|gc7F{Gk zxvvXG>!>zi0JhvJ;xd9b9nmYNWUay=F=`t`2}(83^+Bj2ahg))VM3Klj{ufDBOrr> z-8yNWX$HV-JgiQaw6B`0u-F&^c_ALpt*g}8&Jxl+VyJocgo5#ox^PgL4?2b_m267; z%>Uy_G1*m|@ILu+a4Omm9<}XDsOnPv0*aV=BvUTjG$m84F24GcTWLEacaBNtbSNzK zRlY3{d!$ea%V0X{Pw9)(EGgN_ID4|YA{pzo--gN zVmcinE&y(xAC-c8%2KeGufBo*oDod`>A~Mq@Q~jzEWk#A5>?2~nFvAH?kisY-F^^= zWxRIhA>-3Ah*LUTtp?K) z3x$lZlK82wGf0boztds#y#{NJ*+aZ7gN6&PrMf^QoBw+J+g(nb>~XYDMQtx4IdOhe zNPd1Cex~Ze6K{3V<-l8_q?`GaJRWR5bWV9B_2@Kbz~HABHuKT*xwfrsLCRp&ZziT_ z!JlO8TG`>p&jDYJNG4}V99Z+n>aehd{_}D)N3nC@<3WOy-8==F2b>01*ohck{)W0KIc zgO8UF+gZJ{r5VZ&_-w{uR%E;qFe8_=x4}A} za{D6fcJop319I*OPNeSXZY-f?&TTfUB37|PGLj)ZBXkY-Z7(h9nX$eNiF)Z@v02-E zEhCKEQr6jsWLIGx|Dk88YA^s2brs{E9_GihvQS*zCLh{YO(n>JNGp%lk#}scc*cLq z3*sVJdGFVgmD)GSA=cIItoh?QsU7~FaCMc%JXwafvou^ww3AE>WeWG z2NBK*U|#%Xaj!cVfY9qnx_=ogb%Mo>K z`PI9_6>$RQ9zI_OZ?g~oWRsQQakVYqS{naQ1o4q}(eKZXsj>?zeXG4*{Ry?)OuOUe zri_TcT>{wj9`GNdNjHA%u+&IHg&oS4ql>FyO z-AaXp&zFZkqJ!EfsC?Tf{?m%#;&3ecv-a+){fnjT^;9%Ovs|THF8-~(@;!^NE<>ry zh8acG>fdHpclb7r+m57$I4ro;E=TX*6^}67{cY>%>iH+Ak&>CsUzb&nLd;`AxQFG@ z6+hghQ2Q>%Eo~ZY@z)KC%^^n`ACfHkW;fB{<~LY!GPW6%jTe=^naRng$Wz9Y$S2|! zMMtc~29Hw}J-xh9M|n51{IR9_gDp=>&zI$vto@yrov9me8}t?`g&<)sAQs}e)vNP9 zCnYXx$AOoy-XKS<8*9znO@*prmb2H#(Xk09dyJT6K5H3$YsW*zriw?E-7|pO15%_M zW6aH{H=dXHe^o|kP@Z08Q>k^ZS&lCVdvZrXxcPB(w;( z)kE*;LWZOOo9M@-G3ws-i9a6)@&w>r%CCM(XV52!%f~x6eX;kxeAD&sR;M?Ef9 z;90-1yV|3aRtgk-(VjT4!RtmJR}y?F2+hVAM}u(k)~aFzQ4xhge6=bl%`KbCkfFE~ zDTVhVKX&~IJAM6ebsDUeQzVI9=19Ow>mZ>QO}E+#?+y`b+aoYb?!tOqcC?#&z7*Uo z`?ki%3z8&HkjgDnxzYE+-7b@jSZSuVJiy7_m$u%m7yiTSB%ME;^R4^)$&-kl8?2 z0jDVApuiFGmVx$j|kU*A=@aGjMN0zt!khWU`wHJmlWV49GQ;F59y8%$=vw)^d&u zWFf!PP>bHG*e_@|_MI?I-6=0-fVbel;-xo;sverup}1PiOD73|f(~BOZu*yTrh!Jp zQ{%i9aS#WZor-~<=y5928OzVEwp~<7pAR1o0ShZZpi$ZXPQq=6!MQFOk$eJ>zLCBV zSST%K9r48lfuARkr5ufW*KAh~ZFQ~ES{znU{!Pb|<2n1f>lK2KJe|z+F4q}X3wI~) zk)AsQ<8s+=Eqv1wlIhB+aX%Q+MKe8G_rIL5q4(MMmW0@(gzr@IONGtn^rdXF@oB_N zg!IN?1%3~eucdc%m@4&(-cS~Ob8lLVWUPX!#)h;qy+iZls#u&YX@#X`@yHep?E=e; zuDrjdu_iBSAlMAPjm~WLUqt6zCLY24lX|rs+yGRcY=%izFy@s!@{s|DJB1U#(R{}(R-ew*Pprn8ICE0 zUFFSIG>*nAsxyP{+TKDzAMZ`YF?~8dR(QNSRJU7DJ2RwPpT({1xXXSQo?V&n@@4Yp zALK z(k&N@xQZGKL%#=pBUQ+87i;+9+6`eDPnRI;aAvvr73W%Fwbk<6W;4q|%`!wufl_Yo zwLWhV*L1Ej->!(a8RqwIx1xlS(wE@bLTNNF`WD>bS$DK@>(j=a?{hDGm<&!@`C_#+ z((bTM`@Zc!34#2rqnjo%@SH{@*h~EzLN2Z-TdihxL(PG*x+5+-uVz*8`aDKkQb}tcKSUEhJ2>u2G=z{jiM*< zL8FcZrMbMfb$?gCP3&?7i^EJ=9J*;l;+0)DtVZ-!bJ0Q?zjwp_1)B21|9~d*=7~pQ zV>h`kzSNri*GW?8;=!6wtBeo3H%)XBdh}xp)lWM5`CPlqWaGcS;m|`Z%0>&+1a|a~ zQ+tu8vs8=Y{K`f}pR846bo}g3?lUe==4gNG9eBe1k+2^%bF24{j2zuFG3tJz-hrYQ z#L~XYF~ecwrR4)_N4Ywwb;=eyXgTG6Db{gq+%_mf8h2biXLzQ^n z^hJDEm(sirD;lJoV$pd#5Vp$?Z>vZ1mSk1OvTq)ZXvGdjj?Natjs%xMn2WiMqdm$!>1MQ)@&v^#M>2gZR3weH%H@a`LE#>)5 z$&=6^dGF@?T=ocl$Hc(8^yvhjz-|`3=`T@GN3)@4cR|Q9FsWxTNajxv?hQ6iZ8+Uz zV*sz;4|{oeH5$=b0)KBe4DcU|Gp>a0j?ug)?BG7^?7`mBvELqns9N+t8_L~T zZR{|$u~CMz9&8yQh?ZHOB7~Q zgkB56xL^?9A58J~yl!9ov3SnJ*i^@?1ll^Rh|)0;#D<3D`M+3>Aa5b0sL zyCq(9C*)p|)uSLe?a`uki?*xX>cj!&DNr8RsDc_dB!|mM` zn{g!JN%cWT5A-$>L$?Lzi=sR?%Iu)!94VKqk6hP?cu$V?=Zk&q9wjPCYk|*a9dj^b z_}z$!aeI)|Kg;JQJ_RyJ%Koz2rRA~FaN*kqH#_C;R~Wz1M?LiBLe@6od|qzEL0H$YP?-j%^ejFmA##;CNEH6i>VDg1 zTI@NVFEYMRJ^Uqgh8^|2`+jEDk1`&}mlKOBYZ>l-c4lC+a3mYeKG_e?Of{Jm`(hp1 z$(bpm5FE}prmlIvH#jvme&&S+RI=aU^Y?|IUxA(b>${9xi~b4K2k(BeAQ9>+lP%$l z_Upl1FH|?(#V>>HQdmI8G5H4;bJwsny~K_+Zco$JRLwAR54Y@lm4&!I2}9gmFDY5> z8SQ-yW47O()eKb04Gwf$!j;Z)?Xql=pxk7uJ3*CmEm4k1<@9s+9cky%mZQB37>K(G zUI-4&tozFRa;fv!5Wo}xnaH#8)-rU7N=3*?G-%9aE z8Z%X>vY+@m1bA3cb!&~UXJ)tB8apk1;VvNK%gxoBbj6`$t&i{+4IX!j8zT%oQT zn;)VkUK5a$bbXSS4-IThGff*Ui4doB-1#Y)6X_4*L?yzD+@{&fli>>736#p@8R~-Qj`29s}Pfl%QGTCl1gO-y;$3(MiPtkT{>tJ&f+6N!w zr)-@_{)PCV9TFO*Z(#FYgd>6{?x3T*;UlYOM zNJgsCk|#$mes%hR6RUx+PWp$0YFN&?CvVJ+j+9RFq;ZwwSCZ6#)N4b}RoJc9jkOhU zMhh@@BY6!MP6o3a+tPoeQ7TCnsGAgz-{{&5t)zV1OG*F7vpTFmJq+-^V80W<;D&+S zH$>mmUbzjtXHO1t^2dPxj}b_?Itn^iWVYl>t*tjas1M?7p?uD@8#Tg3m1ERVVJUj^ zo_pjc%O}p{e$xGIw|3#Nm9BPLUwi2^IddtuVC%2t6}Rr$M=E*Z`skIHKOJTLx&sFyxjQ{`)Z zr4WbnY`;_yj|8WyF`LB}^}R&_sOhWA)VB%;47?9D#AUjapE8jozhIE?kk*{!K9|dxu-CSx=?>I@M0*$=;2?*DvzSsC;pBJNjVsx&t^uiKJ z&3C@`&SI5{#(&+8pT|&^;c?yUhJ=B|^*dxbeJeXwIHK4vzNcJL;nxI(eMtiHnE3id z?LGV72jD~diri<{5?|=@Jo!XqdH|~`nTVvaoN{zJ*{G)IB2C>ffV2oseh-y3wR9^& zy37&{?vJFkn|{(X)a3Q&cPM@sH2wzOMv=WA8N+xSh2)Ja2~RbP9d_Ou@3Y(8@5VW* znt;M~#&nU#B_=V>`npF!nc@^n$LhlGyE8eT>{JEbD;6&Q2-01f{E=i$u1DrUp#M|! zA;PqVrOOApn-6jfINMBK;ZkJk@q0?Nze6pPsCpMu&^imROPk~$pUAqSIlSp zmQ6wn*wa%UXS?t1c$>u`zIT_f@oiVDdq2lQ-JNy!Y&?liEG%)OgkD)==6)vjg3R2z z&9i^FY$_z?kzYvjHQ6+`q^HJ)!Odc?lSi+;s4lwsddrnB=ApiLKtz&X)YqRf6VcdJ zoRe3j9w=T*MzfB8 z)!U2+A|moAepXLY0qHR9ZF~y^%Ew1gST+Aj@ZAhbSIYjpt{)8kKWm>}MyKKMH5V=E z^kkFi7OVGv^p&)eMRpFk;>(Vyg_-wQkSC! zMN*rFfMk1dP63lPOmNy7Xg3ki?(ke#;yBc;#aMuEKJ>j^oI2Wd)RB`7T>(WNiZ>}8 zmu`C6cf5-cbT=4h!E-8E5Qx@AMIl|*JQ?@89dRik@S}SsXlYK495`4$E56&CwaH@Y z@kCQ^V(Y%_UGBuKcGF{Ic(9_D&xXTt{ZbJlJPA43AW}YVj6PVBhUR?aRxy)u4=`v-``MJ2 z(DW)#hO@kOP!8?*dY1WWo5t&BfuA*>(p5^mQ1Dj{)rpf|;O68n&FiKk;nM`QV554e zD}EO%*ver}M9xM&oQ|`?pgFkX#wBbz!%S5^m+h;nl3{kEcTeJvISyMtN370mkCo`? zS8tt+s!msN%4)!+Fq!mGt*f~+@Za_gjD5TsiTwn<9rf(4@zC7T4AF@RGXiq*uK7;3 z&@b!6oUuakYDZJPpSEiGDp6e~DbH-Rk7v?z@TJUK^M9Kxc_wJz${h?lQn)OwvT1vg zXjsT_C-~2SeNoxl8UE0Ef2G?&8HJoFT`zln8?Ve6Ya0(Axl7!<;VSJzO(Bz>-WVvM zhmU(Ce>L(r;R1X=@z$fG&a188c2jw;xX$i$$@3TlUV0PQ{Ne@yUV{=zU>d`{-mhv> zy~f(w!~jGSG@Zi7O5axHsB!lj3vBuK#!@)j;rPKyE{8-i)TBgxj<;00{ByTR6javah>KQ@7U^^R3};-r$8kPsjQFyD zrW{HJQXQfh=vSGy`-*^ow_X4~x^)sUJk8=EURu4&H&|&XL9!GrEqp1wLL8xmSAPlvnWZ zq<|k*VgD}w*Z|FS!`6_TYcEt?{7p{tFL?rXN##ezVV{}}9=KQ9tBlJE0WE9^@=0A4lNt_DWs^+Pg{WlcCOHUkj_Cp3G);#a; zI#yPq!U*1?W3>fS_2XB4FH~DhX&#Q1J>y!6emjA8Y`aa*HEbgy4wNR!;rnY>m_fS` zd|2qU&=g&8vqNC&H;=i}arG5?v!T`D{hTq#V4U2L^1vD$S2(`ObG*ys6CRp$<%C0E zb0?TO5%ikH&%>hGX6nr&8B3O=FMfr!*=)JnvvV*{eOtZNpgamYUR3Uph)L=ARp_wP z>c0QV4@(QHr3%8yIQTHww|U3|a$C>BC(32(&RE>H*26fjxNMMLJ#4&vD@*nFw8w_< zKnuY^iGWk`O!Jpf#TZ?>yp~ntL21w(;jnahOTr-g_9O1J-U_PyZcV9IDw!H}8ELHT z95K%;!IHI8#8Rp*;mqPJ;##Q9n?^-y3CJcJ!$qW;3$awHnBz~It9wJ_YdXY~y zyfFJ|c*D$>R~a@*iTR0dYCBFuUo4C1@h$qtMs&@V>?Mbf>fL)+v{V39exIz};LN-J z!mQ3yzJk^0)CWaBF3yz2+q>*5mcHk%w#v#*1@&0m}AScN^=l|jzW7=;P)-mQv8Af ziAjP@>rN^9ZM@l5yV!Wo4T?fkF+J?^(jOQ2Gq05gO#P#2d0cd1I=NjvWy|vyJtn-0 z1^EuWbb0>dN^3S+Ai_~teiGmB3WzM^m$#5rYF;-HTQle0T_z&1T0$IhZ-Xr?p-p$o z?I5h94dS@U3x6(h3^`H?e%txrjTJ|YcR}tG8ZE2Z-nuyQpvU;7%e&_!EG_irDhyhd zf&yPuFw~HaD)}|WDuMmPXwGX;`OdULb1~ni=5|s>zmROwY-=k6&%n+Qj~xeH{YFrV zK4WVx3<92ox%&q~SH#d|iD>C#^C=6BkkzAdnJ)x=+zf;r8_92=ErH>$4-*OZ6L0cJ zAPVd7@bDsG?B-^>#8x}Q$gat>qA_{8Rb1*&;-O;vbU9;1?AjFhs}G@9 z@?)&#GY?+Fa}70w2EOE?cS{|0CFQ$6in8RnH!{W3N`7}6k)j$R9WGwLbY-$)T6aKw zOMbZ1!ivX5Pt0MUl9bRzBzF}haUE6PPuRPCSqRF3HNYDK`!+?2%d_K`0#CgDJ++Sk z(g#GY`|1zr4MXuqYAmW(U7KQ(9Y-Z&ghst|ss04fu{scy)66Z|pLARdz=!k|C89Uj zRuHD#E5)*6sWIR5e|uSio7;gNy+iiuH>*`29k=(wLNyHWr|NxLb~-0-@Mc52#e9k_ z1<|@=v*tUIkX&j0z6_;01_E1BhQ*g8l7zi~QuOb^5ex%W0)@o1q4#gA)|tvCiivUB zDXAs@I?%Y}-XeU^N{pVn<#%+zZF7&0wEysk9%pjSO*X=v@akqYCrdwHI)QofBhJPE zv+DWl?j>oD2l`?m15~4Sl4@vf1f^AltT?w|T#}-GxJ~xewH%bAfQ*H2ww!v!tK^L| z^#-LO^DsjxBlJ)q$xsuX8TT#X8#vSi`-wMR9(iA=&Z8=?;IYh~4N^1O3)_vT&Lwo8 z=%7L`_Y^*(m@29`Z8yJz>30ET?6j5nrc~`?3z=R23fe%A=Zs>^L|qf?~ect$0Ht@m1cyl_BJ#X<6bM&A*Eh z(v6DOpQ%$7fn z7!AXAV%INX%g;E}H=c4QBS)9$Cs=0xAGY2)Agb<(8waGML~zekybhc9_f@0 zLAs=S7ezp6rMp3L>4pWRqy@HvbpI_TyeF}Grz&OXa-9lC0 z-2Lj(ZRI1FEean-eRdDLjSpM4Cykj)g}TEuT|G)< zc2Tt-PfW`UU7yo@)yuo0gHCVMF;spYNg?2sJjcHq>-_EotQB2EVyE59(#A~x!2UaW zuU#>MmJ9kuD=02?8%_i=ZxU^LqubF4#oxVU0iReLfkfAP#wU%+Ef;F14|E~r8}t-s zx{Ol!u>SlKhfkMTqf^%z@^DH9ZCM^hlX1OKtulA^DNQD_E5KU&r*hHLqJg@v586!F ztwJmFD_M$PR%oa=!CHIH*TM7ZgF0D3F$+fev&P1v*CvDcsjnXo18F+z%9$sE5VcP2 zf(-ehE>-J_n#bvh6byMTrV2W`lT=B`Ly=vf(E^A4spJa}nY|JmsibgEEL=PLK9suB z+>ZYGOwP$k+5ueW$K>QZZ5+1QyU;G_c+Np~niiZRoJQ@pVar6WFR0EennIVn*L+3D zXXT%;mWwhP-}gWmadEyJM(_1~6l&NBN=L?;pfjR>XyTXlBY4iX5lt55=njPLQDDAY zt!4S!GKbFo^34j9$@6K>Qf(C6n$V#{xacK|sWF(r31`Ppq{e2_4moABWzQYE53zPP z@oOKok6?q|6wE_rcono1kqGoGn!QT!=?ZwOuJXt~IU>WXKVmU%TxGjdr$mGJ}VT1&;+Pt6axqV2TO54uccIkf+Iq_a&gT)*Ee ze9&tmVpG1etzT~te(sP%Sk3fd9?^K+B$_W6oKw&5ecLo&Ca<_}5V7MhIxw&=tgpAV z&TVL;;cQVpmc6JG%PCj)NDI>ckHAtd`wHi@O$vXgU6qlM+Pv6Q=aok}y@k4EQuvR4 zqWMY0t^diZG+k+8u^p-V%2dS853Sd(rY0-o?hg2Ri|!=+A@7^PoffB+sn{%a^|uh5 z#7mh?$W4e{OX3ArY9sWpNEjZ|zNMO# z{!pLV7J8S^H`zE1WafAqS~R|`*{yA8t;?szsa0fHD}g=d4nVV?qBg04Y^vU}GYK5% z{bqiPh+J`*;(={Rbg^k(dm4Lcm$EuP#mP4j4X&{&8!(7beCP>CMLd6EnC)=$5H*Uh zqbX`m-MCMixF{kx^Ir7E%+ZrOqKF>UheZfq=IgMb(*Aq5TNzH?Ni*LAdJbH4r*3Wr zDm;L!I4N5hj)tX;!H#kwPbZ4_O#UN~@F$;AbuDns;#S(e;C4<~@*Ie{4vyQDmnl?# zRL?XV22ITknb>hFMkOz|Of2RUiA)x{{}bP6GqwDo&&^Ai(W|k_Ph_oxf9gnz+W5~R8{eGOCS!qUUqD^vF2?y{`Q0*XY}VwxPpyUcv10-W`7 zi$FS%N1pU{jnknU;Xg#u{fvQ3So2N3f3FGM8QP*)7}v>*Es#Y`L~AEN0I1+eBDY=!LRa${n)-brBExv+*UL zQgyyaymHx~P=8{t)3+D@fTP|kNa365&%RbSlDYqDAN|ZN2UDkEIGy$Oo0P(QmTbNx z4PWuUeuVKZ8uF&pE0tM84J#)a{Md3OtiL<}yH~xS(m2^>Uh}U&R;hIXPqE#n_M(Cz zEwF7&M%D>VBi%8gs4|;ehxSWCV@Z1`%iwOR604s2I3k;c?8*su5cQ-TKc)l;?c8eD~Va+u~Q#(Q;Y=i&0`ArMfO~ZW>@ja8JI$86NOi-c2!SD+hK?A z7QJ-hdXjOWay9bIQDMWi)Tn%civ5C6CH=#!6#L%Zd3f}~+typ;tpI7Z^}DF zSbU{PP_we?`c~P(P}v*_TX;<0|E+?TrlH??b&F%BC?{ij&6dG)8;5Rhk5SxvVfQYO zKm(-q0vpsg{{yLfc2Ra`+DF|`4PLgx_>i-{M^KK3V6K+=w z9yJrLw;Pi?oeZ|0kk`3$9$`nf$DL@J?BJ*5Z)!VKMgX_X!aOaA(Mm?$SV}}$b#RKO~alswAsH|8^ zO`$o6tZyYPj_V>c$$g$7>BQ&L^8U}xuS`+6O9^E4&q>&J!V zt9cKKEc|o7iiZ(iBPsAyewpnjDXz<6=0=Y#ZM$&!-ovj~J{~OuR}_y_!$cS=G69Ye zQYke++HskA*J`A|nbspklwr9E=Iq_Q_!Hj;+#uWXCy*?4c2TriHFUULUiEP0&bOY= z7Vj7YpSeFQRb(zY3)bmHN!xqp8D|t1Z8SB{AkSSeV|27|GGh#Wq|w3qG2kq1E?kT< z3OeJaF`iBJj`bGK4hp*e@uGji6(FVmBIzMnc(I05+$E~rMCvDhLN zp@!EE`zcMF+C`&%@0R`&QEDxgw~cXOzj7RYn)kY zBA?&TFTKF)nIe#a$}+yXmyq>0AwVe75_I`AvVdU)UgaNxUZp;s>I0Er=6 zpAjEdki-!Vc{m{cL}pDBFB{S~zW( zik_8n)D`TbKJI1|g>?m;S74e_m@u)qK_mt%)kL|V$D|doxGvy z;8f+FmS6f(qc^*yj-%@%mleBG7q?u^klL&4%%H9at9;`YmMbk>okD%6@o!y!7*({a zG+6O?ZOeXWBLqGOzu~-NPKuN8!4?z<_M&D7z0va+ScmFvD~DEhAKeIV9o4IlFCDls zs?KMHRC)9m{pr)HDFw3-w@R`SN1NqU~;TfaOltY8hM>ENNt4LGcaI{6g=J6X?zf&>6dyALi>-jlM69VT zsjZ0}%MTGwgo~DoKCg!sEsDa{QxQEq%Iz~eBz+~PB%?gz&$S*`Pw8QrTuf<~KF(@N zS-p3C^>k?bP1pmka5b~=D^Yiop=#gwrEqyihs+ffkua8&j{GzfF}AApzrByy22DDT zexaQ3r^oR-Q*I6Pa#&g(6j5 zYF-kx=U3WSbnOg+KN_F|jiF7GX4-%on|GKfT6y<0DRi^E4R6zW*+z@4l1DaL12|-j zy2~XoJ1}k1M4l{s-mgz?zwTwdI$r4ZSjSkv%QZTv@uMCLG0pO2Rf9E&CTnPHPegc9 zET1J?{h9Fl+y&XZ!Xb^(xlb8P;Tr#{lz*%qq$0qo(JsA;*4Qx}YCB-Z&@#q|80;kt z6eC2egMOWL#bl(F!x2jm%T5KqMWxT&Sq__mZ#>zq%UbUaxOjp)b;=D2kmog4$vfVr zc_N$^AAkyww4SGpskf}oJ=afai)Z5y-_jXj>D+}(ndivJuwxcUvCL=G8|F;N!`tcy zQ`Wuj!5!BXCyyZP2qi$=H#V2h=bxnh9n_Puu`!;#h;rbxq(0mBjGWy>ucd5z0cCqPekdd&y zwwyIN&%hmC3FjM#jxM;@cvP2JH(5fHDAZ=GIyzTzG_5vig0zKAEGm(5GB@dTs{yye zPfR{iE&dT4P%yncW&Sn&-7Y=nGoH6!TjEiq{Cw6;C%VP*eAYhSv_qv7tUmD)nIEC( zF!2WW>H_`B&z$Jac@HQ0&^EYYwLz|PUagZuIX0`9fl3{{=BWDGN zP^47)mH#R}E_NRu-P=| z(}56NwxO< zYt@@`Pr&6By)bx^`7wHj%90b~)21H}Wy1YoUlP;}!h2;EXF6(R1v{&SJr<79m5#6&witY#H@ff%@LqAey`}m1D^ns0 zVis~cgokqWgJ+=T4QrRNjre>8H_W}MN2)n+*u5g*hkiD4@T&F(VWAUe78b(J+=l64 zPBpI60UX-LF19%uU~7XM|2)D+4Hfy4QY|B5kv%3p);xT#6coZ9tmG;4)*xmyeRhS7 zcSwt8Jz#^5g8#~D=kb_T#xCbbX|r6JWioG{#IRYWwxxGB2K(O*~a$C z>UB<{h-1iITe{PN58TJ+HG@wk_(YKm;kpmMQV=Ac+nOI%YdOVVT`U5n9tV&7JD=PqLIA!&U#7Q7<2qqU#BB;@;hE%nf z*cB%`^tw7%{dVRU#Nd$zSrxmWlKYrskcfLhuj9h1VZi|?(k7s&&EfFk#y23HQWP+5 zhUYf=&U?uTcY!-Th30wA=aPOVXhm-me+C+V*MghW459V52fknG&Sp1xY}F$UfD=*S z0uaWOR{;~#TQ-DZ$T@};m)@Ox9(wq=sbW9keQ&j^4p9v%s`5 zX3R87Teq-lnRn9m@Q%i7&q)_OX(GD0_;CXx+IO#?^xeApME~0W3K8cn9_y4>1-lcB zPjIEXORh2_L#seGze0phPa&PAEtydjxM{m+IZ^uVT0thc`(TKAii%By`s?{`HA7by z{`HSd&S{=TeA(Obp6)1g&+0Jtj)wd1>iA zXU7o|22B&(fR|{?pkxBqhFXX=7TYpy<&b8WAA=2=lKIyBoihJySwMuj1#DEMGi8vW zlHah|*|$@LPGgmy<$7sS2n-D8Ds354QEi@#X`C)>#9M987oL=NA%|QfDJmzbhT~pY zX$VZErzS!~VY~3LiPSxj@qM!ra12zq0NS293`ZPS)1d`7pMVX=t<@dOvSk~hfqgPlIRaLe1J7hh3-U(skW5p=`ZF2umn0D4r-E@<%18{8J3ECR`8rY}797p=N0LL635t%rgE ztvCiSKpokgVEQ_B=Gi3SVb23|j z=TQucf20+A;!r*o!)vYoDpNH*EE!}Tg~(&L_M*qkN6D!?Gtq8GpHnPRO(b~?_uM_p zmpwjXF(LoeDI(}I-=@u>l?*p}%PLyiZS|%am%u`%AT%Na(je0V?jH2P!0Jybj>cz( zZ|5!})Iq<)Z@KU`9NVV1=onZ6)YAT#?ieHkni@E_J_|#?EwH-Dq}X0L)@t2b$D6Fm zvi*1|{!yfE;Bc6BV2|+_C^6NG&wh%dCaKr2`*?E;2VVgW?z&vg*9$UlD?p=^^==OvczgNRS$q z-W=jOmM z^l4z?he0xdcly{{6ixH1=j5rJKQC@v^ti{tIRIbDyq}h>O`h0v5b~{o3v;{Ag`;oa z5Sp4D58-9AJEE=pAKKE{%MPT~Y#B z)S1N<+F;#^s)`r7&nT%#dDaJB{yVRwXW&qfwD2)WS?4-TW!#CHBEC{jicXWULuG_K zak{~--Yn5FI6y)?@D0yf$KhKpk}Z5-c37nKBweH+P%h)BP-T zhGM^IX}=(4NK{92ve3L*gCYB-T*t%{^K(xbXl=KKq+jhruQy#CLjrrBlD$|e8{rQd zoRyWbLOk4$9e%~hdhKydxU^UBCZINVfYZr92&S_loClM7+xe^cewA&@552_>k4Y~M z3{c*41orhvN^oy)m(oeL>2ocdQanuaYt-*J&2bqJM_3uVmvl9L`+8UDr@Az&Q~eN= zBC2|LYZ0#40i|0x<#!oLY~zFpDoZt-+T=pDja|1>=i#nZV0)ldLnp0>&icH`G7#18 zJ_UMI*=ww->*w&gKRFq8x8ZR1#RD!*-3#vVR{kQIxVYww{$6olK*YMc+>PxP8nfLG z?C(g43UQzUrW7|!QdJh5R;S1qs5(YN5EKo8*^p&8Gg=`@Y|ibKtPBhO{v0`q*rI~_zRIk|QMuk}+4R3RNuuP;r99HR6E z);mxgwLl_TPpsqx6oHk<;paf#>Y>FW)w42Pn*hE+I9eIN>q?-i07$4C=@7ByCZht7 ziLO`MkT!&Vpz32x!$aFGGqPVr>bg2qRAd#@QNRZHPY@;hO zndB8OzqWMZO?)AoynT(Q;L+sna4wuTfxz^4(JDdSu|1KvExz@ucKk@HWEyXcq>mKN&|rezbthFh=#z zW4i1Kml7x-W`ozu!wq{V^{U~uv^Gc%1f+hN?h$|aXBrumLb;0j^=?`XMi56QwTPB}8>@?tu}% z0L66ci~cK{1@&j%o8&b4t+kp2aH%cg()HUcz=(OEt##+Nd^skf?pTf;kK@MQ4=&LC0#Z^Fe6v&CF;&1!fJZ@Eq9O)$|}2Ck?bu_jv) zW9@_Ypl6dn6PG!bFLYg^T3gy^ralS;RJ9mph1?Rh?<|=k14GQz0gOLEq^{dflH$^( ziBa?i&VK$|HZX*u%WsWsVu!d3QYppv54LG0u>yO(ww*v*vL@j=)9| zkd<|?|H0R+_pIfl&f+y+BHuZMzKCTxhs!WzBY;(ORA2lCC+ci^D^k$J20gR7IU<~zHW5V9j%^dTFd)TeK(lMhR|?h8#dzJ1_KBccBd#P6>iUs zv&PU6W9FeiZe|$;v$=J%x^U(jSQwTTTELgzX|4JyN4(9zgz|PSt@;A*H10qd0s;^N|BD7^Pus#=-kIR0HuXD2s?9D61Y&n#bj-OF8k7eyuw zc^Ab6T!Sfa4-EAN@`B4Y6}HhX@y}}%oo3KS5inze?$?Phh=zCvcx0+BPfI6R)xRT5 z^XIsVqfD4ar#GQyhDU zZm(lkah=q>4@CvGr%#D3mW=v5;WQP{(ZV_U0`o)l&H@~DEpEU`QX@2^~tct zaV+QNeg19nlo<|F7*LH5gjb2HN2~av1;e(#_N&gztf7lO%5uT^I*H|Sa*_FoiM>Nv z2{F>6JiM0fCYiG5DheMIPi;Ct_K%VuI0=52Wi#H1jHpcp-Fw~6TWf7B>ejmtx7l~< zUqbVNDM0;8phO9v2Y_ZTHL(p-%PKXx_1Z%6 zoAi7T*UW*WG;ozU&|#+db+2fxUY;Agggu!WynLfgWY;p$=UH#HA*8iX2IvwN@BCI7 zd*K3(jrDoMeWND3=T>#XC@^rL#u0F#M(YdmezbZZ2;O(qb&ue*pPw&L_5SYHV&Ror zGpijx!bkm(sX0655glTZScauC>R^EE$(ZG+n7lnVrAe};l_^kRt04o>T4=DsN#h`% z8)!Ur4zJ|TIY1AwqvAZbk>6EdO@+d`5aoZ1~E}(Wq_<=Qb&t&)UcGzd`Jt6S+?Wb`^6`#)+ z2+P?!w@nB6kHZHPlNS;New1&f-E7d$buT&Euj)fkB+pH_9C2+QT|2Udn{mKg8*O7P zH?t7$8a+ULE6E4jNBi=LmMZOf;V-nvZVf+yofU_9JV}sQ$QeI0DQBox17S>y6F}rHskmNni*b zPF0?>4mYq6G>#fmSzs?i zd$miPdF&R*D@)qKqHaX5ptfiQbEv=-eB!Y}lvv*jtu@<*Cu|+1vDYZ9&>w=UfNGxf z5+1uK>m4P{VsPptYSKkvrvsE&E8qEqiEK>V=4-^nc$HG8AyMrNyuD>|sYRq^S;*fn zbr})asMm?n&hZ&u?rC~c-o`@|d)2Yr>8Q@B6bgZURJd_QHhhc1)IJeBu_b`wKHo;y zN$Qrwpnr+!a5QbfAL_0M8eX%m*6*d(I$ZxK4Rx)i8E*6*($x%kt_2G@`_y|H%Rjs4 zJY2+@cxW^IH0&v~6-Y_PnNo1vDYrr|Ut6wRNwuD(6Vb_zMgNs5h`nAun_-`sIovV! z=?n+$sxqbWFM}pEl(&g1rDDS`0b%#9&igwg1h`YM6$0EQaSZYrZA&adB)?(t`ip1{ zKw#d_1I2Z6(Ibb5S+9WR64l7Qt~FPPoExR2U2G8{N}l zIGV9&)o@Lp$X2TMpfUI%&5#mYV&|KenxXy~P_1R2x{#k%lG#{SIaCdqC=0WImom7y zZ2V+Qq-Mg9xnbmy?7Lt5^n4Br`;b%Y)&|4=a$cBP`_znyJ1gL*Ho zCX6(hlklKj$ATSW~|^em6Bxc~FKN_3q}C zg(Aa%n$D#Hxaz@Lvq#g*#}y-dGPd?6g?=1oD1vVHcG;-Scm)5lQX_r?kDMy{>0Y_s!!V1_QMsN>5?wdVOEY?S6*v%Z*_15tT z>1B9Xg^kS)q75leQap~)hxR~b)K|<4uTJs1bf}*p8P}(L8zxh(iHPv05A1r66Ml7& zLSX#AV>UcVBq81r4f7^8W{zOH_ysPHY%|u!k@XA0*lS|!dN~{>{blJqGI~oI-vQCh zBs2`j2SP(qZ{s@)>3Usm?@gMeB!Ll90*7IzHf5{o!k(zlG^xFglWv4ce=aR-A*2d9 zl4AT5dT08PpNwqoA`G(Z&%47rHWE;fv61| z6p03VVXn-W>#qhkr83(lR4L2J`DKs1wl?Q(d8j7S$NppHHG&m(ojTscg&~TZtMLcU zPB2U2klNR+W|Fl;?OrfJQVFYeyVp1igvlhu^qbRrMTXc=h3r$?(9@uQ&en z30IMPY5}On2o+4(?si%{f^Y;&$xPurJKncFMJ<$S#CDXfUgdEg*xfj#x7n&)k^F*q z;mCLJp1RkDo~LR9jWbwYH+Z~(x~ zPtpGhaNZCq7IE-{hU4IjYMx7oL5i$*K3!vnyC46=Ff!@gL4p?Rw4N=k#kO^g>5&afAyEK1U8#?8ZB9z)qM`L;VnX5sD+BhI(RthIURu zAZH_88-Zh0=L6@CiqgeJq^{0luZdEj)_Bvyg?P*?m2Nd3U4rbOdHclm)xO@vhJ6Eg zP*7xE5AwRtrU=DRlR{G5)8=PR47lV?^Z_m1sLW++4C2my4?LHYxp=k6KDbZm$>)?Y zry*+Tp#S744E)OMb8o{^j+Tdpb<53~My87PO2dZyG&0J;-SW!axpXcu$W=rL26fVf zlbc_Kd>ZsVSFIX!o>H?=Tv_@?Q?qUeRa<85RH$1kbSsxj3=s~TSV;{36VO)Uz{>M> zCKSV==rU1dm@_iKJ+=A(hs+)J@$T;DS5R88z=`ed{P3*jcT-=HqTvU(nsS*%cI~gV zL+h(h15=o@^c~e`+^%AKcq4G%M_dWd%yEXJ%*GFQ0F&2Y~F7iyb2BK{;|`Ag9QdP zz0^b@0+z-RFErUhJ8o4|$0~_Wc)kE(E_GAeyep&H9|B508(g3lPmzJ)wS8A2xkREQj{m{$Ot#x+h%l3>D zi+Lk#Z^dEo99;Xn4lW{kelz5jD0gyA3tR@rccVaq5yv3)ymbD{vP0XI#Bdc7i?FH! zyH60Gg|j#wCVc@#dgq3^CL&rd%$8CHDi#w}eBgD0Ib_H*KZ45Us=?w?(JVUX;qCPi zi1`kNk^_U{$i3;Zbo=(eT@BSp)W>_wMk`oBNjbxWf57?#KMs3G zBJeb;j2KIZb+nrsw-u!ZlZw{-W2b$%I9|a#gQKq0^3ivVhw=UtW~%dOOFs7>>mcv; z#9<)g4*P_uL!xnsCKm;fGq+<6Tot^RNDEA6ZuR1PODL>OqkN~#n6_@nmo+lr)TjG^ zftxS+_h)ne^0MGpv@yV)O!a)kodl5ULFCp9;hT^;P7quG_gl;d39+$k$_Q<2U;;eN zSM%FG`dZo>-jUn!ybmg~vYZB;Y{f+tBTE%=^0VC~#575Ai*t&g@_Fg23ib+De}5K` zKicIRvu<0uR@dJV4uw9T*RH#NtAZkd#wZy_T~dWHO^z|mGWhDB#U#b)P~%b1!f5uN zYTrW^pIUiC?30_NZe~83d7F$Ar8_3%elFwqi^}lsz=SZt(w)E$FQy%kgWwgzQ(!gj7EqUh7LcsS(@8TZm*s+ z*-P5U!h*G!aWdad4@Bb*dIa6Zt2%R%B|k}&2O2G4pSkf3L*g}?@LX77$fl^Lf}Z=R zPw4_`%GkbcJ>qK7?)%N+;11}C(b*Y_&3M^mwWHzZdX-2Z?5fZ`rChn@Uq2H_NpNR~ z)SeS83xBai#X4K8#phiLTj^*Orljr*-KpbVlPAquiqRxZuTI^?0!G5p-kKBHYj&`wHZXxOd&>?}`JttYVs+aQD{;tKxy9MQoiGOQ zVNT6y#ssIOe4S+pXD{de2dUjQhzO-9Xsu3bZ}u)H>kK{_WZ^2V%q>sFM+&-u#iVN< zPP%`%{?7T31%GSe-sWo`R*}6H+QlJVhH%8$0<{voV#;-fnw^~EStP?J89RL{QZw?| ztM6IqG$x}GN9+Z)JaH#Q%J-Xq9Hg=W zs`*~8s3t7Y8h;qgDX}^tw{WwSCf$E+|xvsT-e^z`jU_~ zSV(A3a$?RUQ`hISvtYcB5YQmS1ys7F?)Q9f!ZdAP6XNi4x~|oQZ_VY^a-~^zi{=96 zZ}{Woe}qfmC_kR4iHRay7my;w)g@)Z?>SA5`u%!toC?p^(UQK7>%O4-MiE)(5r(f! zSa6v2XTpQj-4*BG|K)3Vm~l9 zl<)YlCJU4q+FwAA)1}^N=2GHBDUNZ8WQ*4cs6OZAu{}4H1@QRy5J|-TIBDMP6#BFg zF3CD-cnMWh^2Bk6W0&(BWyQzIjtr%ZRh0ylaA&KDt#%I{d>_NA(IG_jk7{2Gp|n3B zA?8X_L}qb%IN*YNQc?b}ow`u<&q^|tft4_`J;uMcC7Xv%sG?xUKWMPDyCk_cK#o0D z7W~#cb>ia->oI%qcMivZ7-Xvf$S+`^n2si4#_v(TM2A-3)iQUng{hdiEN?9GWtEGX z0MB2k$-w^VUBJvlxY5by%_gKw-P1;X!4#de4nIg8N>Kbgw|CgVhkh!~U&U3>#k|N4 zNZ~&(xLp4+u>R#?J!RrG0Vxt(=xm&-WPf7epX-U|S}&+WO@+5$q)BoZV|%WFm868k z8^3?~o+y^MB(DjR9{c;|tX2cohg**E4@GWX@P)7H#RXr!mBu1vs?0S7{!vi)l6shP zDFKVv|59q{@+~aj&OWvBoUa80AgA}aI?3hFENe5RIhTEq5KF@I_ucX@V&z@37h=A& zyqqMsVkbP;^zTN{3B{@U@Y-TrfGL{y%Kwob#SlPD1+<;y0MKnwb21e}OZ)%+WgG+A z3(+74zIAcQQaAKxyV6(2^=DX^G$3`!Hd_E}J3KBVa|c;4Hg{cq$ab-8X8aK^Q?V*H zx7KddaGs$^)r&pWqV+!-&3y5Fp$DK`qT|u3!lnenxO?k4Kr2Y>^J@}Ib~ON30g=tm zU2ws*m%W^D5_ZB;H}NtGR&L@MxIfJn@8i0pDNGTVRqDzL6-`+Jgv`Pd4P)g!NaB5X zNeu^p8tZQt+jB=E++f}k&BeD>t=8g2*#7tZNeFu!<-o)jU{3WZN_mW_e8T_xdi^Z{ z+m(!h_M3Qh0uNBzv(EpvhkQOe;J!o~MeO`UdKXnKIw@Rp)I}%ywt+dwC(n9G##{>A z!iB)Kle6QGcu0s17av8@?B$tf{~-+|6#EM%fZcLQp;T5UjvGq&BTo%{SZ-1&5`S}G zG(wWH^8R(3HnT63TnG?#xg!0+wUsf>y ztcnWC!5?w46$88wnZJ~L1yC~A0WkOiio~7!7L(`R0z6CRib{Xja3LH~Wgnt(U6Lpx zw!Jtr>IIWemva?@EbLw}{~p)f7Feg_<2dY`-Y}*a>5GXh7hWn>B^KIPX?07u(h5Lq zS4c>4)u{j22>0_p-%(a3Q4XZ2N{VD(dXnzjz$?|R1f?%maqAWSpn#D(76nG8lO!Zx z{{WO2V9zB{S|PmdL{+ECLDPuA@+u``4YMn@vua}u5D1G zTtdvv?JdecKJcIJ2cjlAKx=R8(`=2^OSP7dzJ+FhYR~k`EO`hVcIQ^mKPLF|9~Uf9 zJJ6TWkn`Za%lUv2<(FFx^w0n}&7&bW$u(&AY}#_|~d;4gn) zWnhPM0>+yJ02V8ir|p-NJXFC_l8pubrDiV^{?=2iyGECcXa0;G%>O3dh6b_4;{?iQ zQkVRVl*IBEt0{YR3dG~J!r1}dR+kp=*C`fp)hoE}Z*IuuotB-W9@Gg8v0B=F24b=G z-|PD$Q~)SgsS}T%O91#$vCfKn@v?anOC8n0kG_nMZ;%qKFg9OWPQ?dUq5~lAoTKg| zIP`&||I3cM@w%=jz1n{yTY>U%zw2!k0SME!&$Nv;O>E6Y#+rx+*#q`NC{eA$blsNzL46q$6 zMTMr`vVP7@NfIum016h8{btA9KY%`U6&TryjcJ@$;!a>O<*&~*0qDR`S3;s1&61Hh z$!PTU(*(+aOHjEO(*wKId?n(wjZZe1rvD$NQ2@lOC|d!1nHS?p^eiN8WLp#<$ zYj~K7i8J0$1z_UhY5s-vw}24a*;MRa;jb>=3<=-M;F9d(Ge85?D<}tM=q8$k*CXC) zFPY2B0sUOD&-2;~ZnXnG+7eL#*0+Tn&4N#a0DM=|xfcB!t#FK*x7G2;W|ym+290OP54w^JnFh|si=6&v39A6>p<2M{rD*`y<9 zB*I0*Mxxp7<|XMpfH$?g*ODnIdA05i0D^q+G+#`EodXa`eQF?30vH}FIK=p~tTXrj z9*{4W=U;yk+`ujzj}*n9S=p*ECV=dN-xV72}IasDm^i@vqm zm$CuDS}{AU+a=3(o-j*j`%kTW?TO5XsuIRpU znmiCa54m)#=dqfuBT{7~(cEGMVEiP2SpOHK{lXenb~dfM5t?rSNA^Nx|HJWLs@S){ zPEs}?m%OhDdA31}*@TydNg8mzlY61*l{@_1VhM4d?|m#Spsj ziX45wGtc=e)SVYJp@ji*J3A4r>R}3)@VrYv3b_Xe!pI&cp#9oz1i68wF=|N65Ju__M` zuqKM8%rBWWS`*6~LbgAa`OYh>^Z*pk*z)(?+37rLio;rWPX%NyG6wJgp8f0QMzS2W?I{AF_g%&cE2#i5_ScOwdW(fq{@=W*p)A?F z&?8`z;o^B#hQ%Oj`q=OH^^;knl>XNYKD-#Vl%18#v7`ZD*!QcrMVIyrD=xAe41$1= z7G|+sDf8iwa(2m58=AfW#K4zZr_$0fNZGrO%_Ixm`}f?RC5QD-*PL&58xL|C6wZ{M z#~-(6S{olK@wW%CpDPJeS5&pvKh>cOzQrCwP|ieO=bBNqEfjG>hI_H+DiG?NH-=&s zax>O7X@{ag9Pqv9H4iymfoPdw2!H#rAVet_bTU!C*lde=kv!K*=BL zy#6c>*kk{7h$FMdJ^Y#W%m*Lmo5)SPxf1NId4C&&9y+^bF_D%c7WdS-qPpWIT#pWB z=wjmic9|R4Ql4qNr=r698#dhmwD(>nPdL%)l-U6AE7)3d)Vk;=?D(p8_$_DRP3A@4)=olUjbnFh8RfRd zz{W%;ddoU@Da%*gz%^CIMfYEUb~B5~-h92Fp3m30&HoxlJ_Y>UqX~fnw?!7Fw_}>I z7vfyiYGcJ{)dtw|{$4U|9=cU#26H_;{ z8JFIJ5}9upB&u~lME#PeLb3!Gqr~-_o){7mCkWTlSMoFwO-bwr%*Jvc zrATHzT_knqt7TzO7<}^W2>d2We^-PJY%OtoMpP;}FDG0f1NZoMK*oBe_U@V3CO>nO z-QbeG0--1zW6)J7ePf?-rDUa>iP7g&7p_46rCAT3>+BvIs4E$MLNTVCj5#D!x}Iz~ ziQ*|^>bF7$GUHMJh3CA_*b~u(^vF`ln)a$%|M zOfoq&d`oWKiOzghIw|P*AYR!`QaVHQpCbkb$K?Urk!%wmwNt~vLQXL5lljdqSUtDm z;(|w^2+LLW4Sa(~zjYT!kbP3A1Sj!Fi0bBD)7i)V_VNs=we3wZ%gjV}uT>BLwkbK! zox^=DnBd)in3?^aU@#D=J<+zr6;l^Wse~tNxsmWw@4!J=IS>Ml|8Il@z2u$}e=%a*IN`_xq64%46>&-Ve4U{C}A=AZQk>&>Hd zZ}zR#hE3^)^omVIwT>c^PA%(&SW9ENn1bh@Pf49nIA!t!&3d{w))_#=L6B6`3qf4n z*?LPlhu@M<*gacCq_bPA&wgh*bk#oix2bdzHp9}_yW#R03F(6xL25Y$FQ;cTeQLk} zX6JSSkH7&}w@VL3itsN&&MCZ#N1S{^1{ms^$JID}$NFc^HJ{iE-HCtGA@PI}Z3a_%Ix zoehQ)H<8hFTTMXv_85=v&0YEn__zt2q37kyy5B=HaR;?oD3@V9Sw1< zL9dV{416lrk)|w-!nVPMH$%g_|D(vd2?;v^FWVKQ0{=cCbwe)lZ|9$!sakjxov2C( zkGI=p+}ADgP+meS=CKt;$^;*iv{^6Xgh2tbNdMAa;9O&-w(iN2%2+O?#-{R!Q1m~M zfLkBK-jeD=uOuhC0$Gk-?%Z4J541`!1S)1p^~az(?}|Regn+tTRdtw&hNOh3hy@p~ zcQ!R&Ah12A;VWM2C`AeAwNs9|_rCth`P~II0slD>V2CG>AppDl zNqFZ{e{q1sK3LcRvf|b0ed&91+yZmF2dbC0i(3NwK?$YkOM|iIkpQfB>HvO}2^0`i zgzAgb+_{@5NYucnz*x7zw?v-#$>*v;l*n;VF*KBj|H1}LgHn_~ISV3Y$mi1z(hSA7 zADS?v9l#qv(1gIDd&Vv}r19Bm5b<_oGZqa{Yl_L?9+OYP=6x%XJL52Sg~lkF!xQ*7 z5I|WudUGDCRDY-OI@I4ry$I(3^3^Qo1gQC;3}fA}R|HQ3bA3oIk%g|-gRTaJ?jC5; zRDsqQ4OS88S|MR}?(GdQ8lYX;#DT#swd6#qnOdA13E4B^3iLQ&M4-TRDSAN#84wg`#ISN4 z%_DQdnAA+M4m9uKlcr8~5+sbgM~C#zdfp@gX9YgEGtsM5w*$<)yIZ_J!U!^FQ@iEMY+&+ zx)hY8v|JboZId&ejkQ4TWd-z>7F3#l&7g%j9fA0C98LuyV|)j3mo_e5zxEDs78+@SBr&PDDoPsAky zb-7~@`L-9rBO`$^g>by7Z7(Vm#DSa*t@OV%Vx<9kY;^Q<(6h!t)H@3Y)aR+eL42fS z(Iq%xj~%!V!oi0$E1#o}LaHD812g<&`z8Qsq^}829%0_(zIM0=s_*^M_gnx3A)O1J zjgKP_o_VfP9V`zBPT3S1Da8koWVZmZt+n%LXkK4iW21LDG^+nx*xY!2;rP01`VpI5HL*k0Nje zi=>k;rd~2KMfePuqL`=7D$0p0AS1MV65lbA|9!{~JU<<3suAyW z-^%*|knxU1CrMqf9N5?k0MHs(LjfQ!Y&7n7onqmUV>H^E4^pnY>KRPfPIA;pfT2P1 z>(52vRU-~{A3uNKcMw|#B*Kl!`R7Ql~9{k?Py-R1t0Muc9_*R={Jt=4V+ zytUy}0p6R$LZH)0WY9=wYLaWkTc?VCtyH}5##l=}3Gp7JMC!+%9|{`0Ns>S@nde9Z zkqS9I9*}5b{U5H@_VYqoRr{y=iln>VzX-^(y}Zk>3~ZbT0+iUXK#1zSgg^jg6B8B; zX@9$@jXD5rs3C6@u%q*Wu_r{gwRSlt!)kWV6_nYE8R8?KD}^6lk3`>n&%d)p`o3UD?Z<6sFZc%AK)5s2Gm{XhV6 zRFvOM-_*4E%ImzA#{1FRr$P82olpCFsEueH#u2ld7`OGe z?vCICgiO=1!Jy}(R;3!!{(lk88=%~mS`IF7{oUZ;ZF!LJX?<>QHNn(08$kZ;_=7k9 zo8R+kAdfn*bZkayn^PWOvh7iT7gM$JKR+zK z6H78rv^vm5MS>0SXJf~EvqDNyh4eUnrO!$p6`}ix76A33#s#gLr#EdJ|9SdkE^Y8a z#RDy9l1nyNyDek6VK$iFW}LK)4nZIJD)bF7S+O#oLpg*8gJK2bigqtNFCe zdJhC4YqI18$?KdAxV1Tl(DF zT%8vjpnKGBv&Z?ABkPv+&J2~~Ag_&L(LUUh&|!=Hj0D+TbQkgYABDF5?1}{F=~%0% zJVJ-gziU#xhlJ!Hr)=N_3aUo}*fE$k73G{=x?cG==&qf5V7*Me!~(n1ZKeR}zZpl% z{nWr^0%D`78K|wrfFAeDR@k{OB8i>q?EO`_>rWICw2k$En7+5P{{V-|5ez1M*1&^| z_gOxTF@{e=ieT{x!SQ2+S{N@Q9XnsMtjFlIvl{Q(>QLi z{W#iN$)YDGrX>%$L*Lk#(Ci2W?OSjgpdFYZ!C(omfv|eZI(0W9P|bg9^s#?MF8X9! zk@yHO$Ig{+KR}+{2s~R?74%JO@}|Ex2L%U+btNX@5DK=(VXEsg3gLP`~& z1LHXYsQAZBSY9CD`Riq=juAUI(T}h$_1Bz@qsB^k0;t)-ptPK^7py)&fU5AFN;Oah zK_$SEl%4=K{x2hhD(JpE!6oeZw35kRg3E#!a&|GbC%pptW9B7-5}_cqsuARHzD z7u}3=q%~kspHK;6KJcvskP!i3_ezhW`HvgqKQT$Bp#8FpHw_m7dKP07cOe7Sc|0$J zN+$r+Apyf`U|Rw#bMZ2KHETB<`OiRGMg&z83G$yWMhS8-8O@MoRtrGPaCO$>YCGZQpsyj?O~ zeC!Y6y9I3vGDBO?)D&!jH4X|uR8e$T8b;iC{*v@nt@r0ZGu05=lB*Xpu&`G;P5s+> zQVgil6ofclDS#8u=?89mKe+thlLXMCkr-yg-Yx}my>~82(p6J=&i6uK%B;ZgalKoB zpC#AF(Q*@H&sC=_Hr=~-`-< ze+N>44!vTa!2U2ruo{D$?VI=IcyRUV@cFsDMFTqmOvH5zcnkFKHs6-ld+`$hmYHNH zm1;CdAOIkwJsF^N*4%>%=0Km0GXOdh!%Pmd=DPuZN<6do=ttCf1^V|C$p>0$^#hTh zX>Z67uzCs>t!j|%t)~9*2Dx|Rcx18x@)Q!Wt+kRn&H6lg{kH#T3&;q^LMpY zSr^@VGPeM3szHE;JO^*kfL=?5tNh9<@Vpa}W~-z`tL&Pd-;1q~cUCNFmH z^&PSi7g!F&tSr8*ZDk-=7yM0)5_E20L7o;^yg(AW$0HK^yXc+Sw*_nM>i};lj_^sz@GL z{dr0iELKrqDM4ZY2Vk84i049y<_*rjv>$#YEajR+^rr11U%msPTYwMmq^urDD&T4x zg$DaF-6paY52JyJFM?90A}!7>b-lFsRkXi>*9BLpeN151yPRl_t5kOOa=B_O4+ zlD4t&Aryc0jGOPsu$tc%TgUt4&8lsCfW{Xqxp%Q(CQBepZ6NHT`%3s|m7RvM*YXF$ z3N%5J#JDt9WQqR}z`OYxNgjJW=55Ovl0=N_$ec2*ush+4}E zW^R;D7YE1re19}}%&{>@!n>s5TUeo>UoN3 z`TD!aBFATDc8ECLnK*Ah*D9P@2KMEWhTgknT#`2Lj)!D|a+}`xRg3)TDq&1f6*Pq4Jk&6l&>(D|TOSr_DT zwvC~RZ5IRiZ(Te5_Lb?voaP0~j>lMCx%h9+Em=%Rq@CBq$1VBNcieSx5eF0JluF~Q zTY)Nty%Fl4*O-yWJjjCj3y5B(Ynb-suA;PEneaO(kfS~$XD1{7yw&<9w!=0bNi2-~ zbMk7!o8R3!Hpv2iDpgP@{fR{;Cl676EUE6c!^~U-Q4Dk$q|Bno5r9EB%@G`v7Q8cS z9mktP0#@3dY?gK2(U?a7p*M&2S5*q0E=b3HJi9X0QYG$J>|=3N-gSFAv2t;y*z!86 zax3u=@>@S~xt)D>+dZpQ(xZKnT~a_9p3N6AAnosbxK z%b$CZ*GJ2rc$l@x_kiSvmp}Jr9KQBA8NLsupLB#yzhlEWbYHbgndw#h-L+a5Bi)b^ zF>9}&{kP&%cc z#h#MLNS86+3W-g!R49`zOgFScC={UuCVIuxxpt!s--SR>H!gS*MwxK^6jp?LhVghW zDrE84)dNNzrf;OrPtfW0TmD;efwJ=6a5(Y)OGOInFiLy^Z|^)Lka2wXE|HH_V4adV zLc+$eO92JWl=u{d;Nd~ej}))@QG;zWpKC@}HA^hinv6unCPE2GrMQRiqfF zMnV*e!pS+`wl|skhRXO(r1ft0;W=qYs3F$z$js(z2Eq_y4lo3T`$9{EZL6WCi#L3m8l!oDaV_g2_3Cm`N!I8-4WCu@**>ufqR9`o!=QczAu~2zi zt<+19F=ale6~n+)DjaRnb=p4vEZ4`hg7wxCyK4i)wn0MA*fO#s)^*qF${GNba@QK> z85l^0H4U?6$fX=l{&&OZm$RY&X$rf8`VKhW|9^kff!d39r=NL*#&*HpKA}|s|5yK* zR}M}cr`&-+mF>sw`qCta;N$ZqPjj^5FUp@TxBlCQ)Db9_yV}N+8P>99SarvZ)I4ne zY_)aad4+HH`Kuv?^ey3+V|@7FGAOmHXI-Wh5kVZ_IJ&#YaI7{4zm!H;p6%G^ z9O8SukkeC2Sj4F#6qqUVal^GDMV~QY`?sYFK(ki4d$|O>jmT=*-am-Y;ovBf!eD2; zl`@h@&I%Qqbv>WbD9+B8T$*Iv9hy*-G8~Q`oOaB}XymP<3HuyLCC7gCAmFi2ar7$7~Im6e_`fw5cUA~nv@fZC3AsC-TAdpJkK!+BHLJ$@cX0izj zj`4#-drnTZ#7&`$|1@f=jNrOe=lU|bgdR6kRVqH2lxjA8;eZqW^hR$D;U!yFefm(= zNoAoGGW+MP{Gxh$#F`==@b4I_?$TmHP!yq7%&+Ba+tS*4T|-s5!eqjCUY*f#@2zCp zv7o5^zxgBM*n{C^k`87bd7Nwl2XsW_yM)8n{VY^nQA9~sngkg21WtNV_NkdAr_gIk8 zRwGQujf1#`>9X#w+rDzB0aooiTVXb>5GJmi6qe*GowG4sLvXb&g;^C)JQnHKYG*`z zgmWl<-g5iZr|0Bypg#+xoRl8w@aA%Uvwi^vyABeps8^y1Gse6K9qdGut zUq((oR%LmID>+UGrQA0g5Yu6eb+X7JO}dGpj47uYtPws_t&Sl^er>23@4A0chWD@g zI4z8muRZonp-0>%RuR{7_wdnQ5W{!&i!#l;av4cx%W?zRUdjE!}#&m448fg z!`CNrC4Xn!_hh!!|J3(NDTk76u9Vd=ddq(oTSAx9i|SLqHRJ1tFem5PaQ!G>6sfML zpF!z@Yo6cG!_lP`Rq6Wf2g1*OTW$?@C$-GoO;8X!e_UZ+RzMg@ z!`n{bu1Yo3Y1hb7|5>#=IsQS`O->YPeB98ry*w60-W1DUCtGyjA1!iAVYV&`;G&~m zGvuC%^=!`D7-Dt-half30;Wk#!yt=T79g%%`|$N*NR+|F2AJ=y7MtMk!E!-|Dn3OI z`5(BA*IaSGD?hit$zpcJ%0IU9kA;e5!Z*)`qee@Mw_eew%)c4RO@kV= zgtGII|6WfD$2d4J!3yE|y`cF~$NMN<_4KsQ`7U3Hi6iv5zLbgvm#emdTeV+eV&=#hUn5XK8@ zF5k|~0a}x0vGy^Y_aw z+Z7wt)r=n@NdDvAJxv>w-PUHc$iy8?-J(nv-|{yx%DVuAzvjYMDdRDoqWZRix5(f; z_Mt~Z3pZmO9tC+3qtyMhDdv|4;7WrB-xz00oIuCgDU z9Cb|LsH5yuNNl7yOxXl*H7S<=5yB6@w6qJ(F4KLi+sj_%Azl~D=9rK;cJ1nGS>g|o z^lrzCU;-nleU+O(K+8}6YX$`SBYvXQB5vA`5tl8&n||!gi-m18nQ##gx4dsmB)jv6 z(!mM<2@w($BVVQ~muMh$HO%Es+D@lg^3~F^cR1w+%rgJyt~1UXmy@gd9_YHChI=($ zgi7u~kFq&XwKkgtF%OfR?fPPdj`-`fl^XhddrN#eR79V9>-XSA<1^v#5}~#DFPB2+ zwl|gPw<1L-T$6&FFnQo$S!)}cc%9VGCQ%pSCxi{`0pYcH$)7lEE8mByNH zgfpby|HKFrpf)=BLebl@Mz6K@ky)jP@b>hpV*BRF>3^i@ocPb^n_gLSunAusHe+!g z@Ukr@_IX>b=5G1@eS+D2B(8WdK$6RR>&phtU2CCL$HJ&PD=0VhKItJsFr*NfJ?Jgu z#ih!=$(k(iz|Jn5w{p{C;6cr+;vbXO(Ljtb8Tq>k)*f(hBSh@J{B4mNHQX zN~=4jA|_;#+a2cr62x>^#;g7FXs=BU0{)`u#Qy4+a#Cc~fwgZUb@#BbnRyFCNp6)+ z2nCPnWsm#D+gzvX%AKD&1T@TmOyRt3vOT-+mT;*!xyDPjcpG4~Q+{(4_Fuv7IIc)kp$_xMLbM8Ts4?n+AMPG?w5t3!yM(kC$o;!s*V^`V;3~M}Jp3>h-N(aa6UyjWk2pSP`-%X1r{^#VVjwCVD5a77ufj zStJ!dz-tjUy3L%q(32kt6+{-ytHA6~x4TAN^&M41=6$SDg}C>N^+Mf4XR9cqM##D? zMLa)DxdLnu<>Obq7qy%h!D~1e-pF&G*ZPNr7-AEq0m2EHCm1>L0lb5ZIM-0V=wxamn!Jd6y6|UaJdl9; z$F>|-6icw|_6CDYC@UsOX7|ivKfZOMa~7{}M)Z#bo0W@C9w*)fQU%O8S zy9dZaR%RULVg?goAO{E}@rs0jXeOjX)0s50ht*=CHet~L2D1vpv5zeK`ikndm~cW8 zmbZdxvaQx$BmEi(AMMpt_P>zCycxD(l9IN+_@{r6%qOu0%F5JOAy?`}I%yP~v*aD& z-kr>M*-FK{aB^G$dQ|6(ImqoZ$DIk8@DqurTv`y8V!s_j1a)Ci4W>AhC~bwLynr zk;7pug=tJ;)}_~G^{ZWG#|mv1pXHLWa*v71!V5_`#p{nGwj3Yv&kS)Pl$J_1+L9=$ zb~B2F#-I5(t0)bzC@)HLiZxKWwI9?HMrW=-@a$O^-q5m}7 ziK-u|>r%5S%$Jd3Z%GCH?JR+gKgQHEIav3 z^t#G8T9n(~XwZ?uGk;$+DP3rjSp{HtY)C!24l^V!RlhRnjSeXW^brQ0c&y~ej}`J_KX!umVR4~i`lNWI+$~7>>WAd{*|9CQ zh3B21f(Z*a!kXZ1iH%^uj2U%to~7%v9>Scy)PK#dy$Iq3K&na@;&cevLIrZzMq|>X zQ5P!nCNYGS=(V0Q03H&z<@%&CTaH7FT$>Ts(Zar=1;&MZ@VOXH7;`7*$CwiXN-LFv zMdwUVX+!J8Wi})s;iKhh1e>KEk=)ZC=P-jEWR@>fz!I0cUTw6Quwf6xO>Xq?o@OVX zIo@D}$|By!F@KL3a>k z-QKWXvA7JXrI7(PgWvctS}E zo)NxLlCkcx^`lj>@sQsF-uJ3s^Osob-+5p0jUarV+#fSPq*Rb;4tRg_V4 z%9OC`yxFm_>1K}??K$Gdu^NvhqB&=`4HM^*-)NIuwnWz%BRh`_Nguo6qttG2*pQPU z9lLYXA&66*Ytt_`XI*TwV+b=I$VJ~Ua!DzJ8_KGctAT-HdO)nrlx5uKe+`^Bp;9vA zou;e9>?|VN<>H_L)YpR4X;!g#J;}~7u1xfX-|DoLKcjfgW^qz+oa?`7gnx#UJ|2TP z9c5*~@k(Zp?!_a?ZdY)QIoA%tzzaz*Y+>%O;m2KuE4|?94Y0_*BR<;em5%*~SfF;s zjAKwa`QI}-ge$We`FAjfa!SQHH@EgXuk$=e(BlxAG94m%dILf#jvhDW!i!0DRfMW= zcN5meg>nf$4@#66WyN*dExypnhIG3*fzV^kQdbaDaJhd(DZe}QW`&t`j8Kp_SE;<8 zPxrf6_g7?NScAiTpOIFsXGscqf|VO_fdsUBfm(mozrO`c#=1Bd`OHal*WreJ{ivsNVVf)@Q^Dfthp|ew_e-Hx7JoUQ z9)s^k)Hozn8)O@Ud1Tb#*#+n$vH)`Eu`4{@faD^?Vsd79>&ur|*>sA6`D~x}7}kAT z)lTMxFni;8uQSm=i7U88!y2;cy*h{v_J1jvEEMfSXfPDjf%W7`okm&M+s$iFsd$e) zFROID^xS;Hn!W)By=2jMRHhN;yJi=rRR#?m_Vxjlk!aPTOO2Ne>MLSe=atIi=jYMV zm!Ye*LDvZQC&dO-ULQq-LuBzigz*m>!HbT;*|wET-GFhS)ZL^YtdH08$HlGTuQ4bfEj(#!5ScUa86xN{COfQZaB{$!4J1yf4pCvVszw zGBa?}Y%^lQ85Peb`ZlfL;*eYWrt|1#70a?8UXJMe`=FhxHUs{^M$pUKwiNORWe%!gA}}W&Jq(q7tW>_sSyfxex}Nj9|Ctst{f%TSyRVu7yV6e~aqj ze1U5lE!jo&Lh7KaI@YB*&w~_Hf_Hr=w~h&$e~n{NqFm0R;3WW2IoY!kgs0n~RmA|e z2D~zi>Xn-2v+?p{s*uACTd25vW}lvE#OxjyInz&>ju_$hKV+SOv`)v4-6a*$1R zxU}#nur#bZ97^6YIZDO{W7&#O^9zQao8ziQm*<`za@^F-8cGby#iqKj)X!fzt#(BY zvlfcBp}xBk_MLiKxcY8ir4-z^v9HHVm#ZJUj7M_5KtI6lv!Q3 zo7SG{wxvo_Nim2n%x}=p^>;SZ72vnzr5f~tGR3)N0&rBDHW#a7OPuFfazlP&+zLle zlsPxP?yD+UbKrdhd4Vyry4CEPOtOSpbf zymRq
- This tutorial explains the key concepts of q values and how to calculate them using FSharp.Stats. + This tutorial demonstrates how to use Chebyshev spaced knots to approximate functions.
- Posted on 2022-3-20 by + Posted on 2023-8-31 by Benedikt Venn @@ -150,7 +150,7 @@

- Data Science [7] + Data Science [8]

@@ -193,7 +193,7 @@

- +
post preview image
@@ -201,7 +201,7 @@

- + Scatter plots in F# and C# using Plotly.NET

@@ -211,12 +211,12 @@

Scatter plots are one of the most fundamental ways of visualizing two-dimensional data. In this post I will showcase common use cases for Scatter plots and create them in both F# and C# using Plotly.NET

Posted on 2023-3-16 by diff --git a/posts/categories/Datascience.html b/posts/categories/Datascience.html index 34e3c2c..d9a87d7 100644 --- a/posts/categories/Datascience.html +++ b/posts/categories/Datascience.html @@ -86,6 +86,45 @@

+
+
+
+
+

+ 2023-8-31 +

+
+ + +
+
+ This tutorial demonstrates how to use Chebyshev spaced knots to approximate functions. +
+ Posted on 2023-8-31 by + + Benedikt Venn + + in + + Data Science + +
+
+
+
+
@@ -211,17 +250,27 @@

2021-7-28

+
+
+ his tutorial demonstrates hierarchical clustering with FSharp.Stats and how to visualize the results with Plotly.NET. +
Posted on 2021-7-28 by - - Kevin Frey + + Benedikt Venn in @@ -240,27 +289,17 @@

2021-7-28

-
-
- his tutorial demonstrates hierarchical clustering with FSharp.Stats and how to visualize the results with Plotly.NET. -
Posted on 2021-7-28 by - - Benedikt Venn + + Kevin Frey in diff --git a/posts/categories/Fsharp.html b/posts/categories/Fsharp.html index 88dda8c..edb1e96 100644 --- a/posts/categories/Fsharp.html +++ b/posts/categories/Fsharp.html @@ -96,8 +96,8 @@

@@ -125,8 +125,8 @@

diff --git a/posts/chebyshev-approximation.html b/posts/chebyshev-approximation.html new file mode 100644 index 0000000..6f0730e --- /dev/null +++ b/posts/chebyshev-approximation.html @@ -0,0 +1,1344 @@ + + + + + + Chebyshev function approximation + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+

+ Chebyshev function approximation +

+
+

+ Posted on 2023-8-31 by + + Benedikt Venn + + in + + Data Science + +

+
+
+
+
+
+ + +
+
+ + \ No newline at end of file diff --git a/posts/chebyshev-approximation.ipynb b/posts/chebyshev-approximation.ipynb new file mode 100644 index 0000000..3ed82bf --- /dev/null +++ b/posts/chebyshev-approximation.ipynb @@ -0,0 +1,931 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Chebyshev function approximation using FSharp.Stats\n", + "\n", + "_Summary: This blogpost introduces the concept of function approximation by using knots spaced according to Chebyshev._\n", + "\n", + "This post is inspired by [M. Scroggs blog post](https://www.mscroggs.co.uk/blog/57) and shows how to perform function approximation in F#. \n", + "\n", + "Lets start by generating data in a two dimensional space. The aim is to interpolate the data using a single polynomial. Why in certain cases this is a sensible thing to do will be discussed later. We'll need [FSharp.Stats](https://github.com/fslaborg/FSharp.Stats) for all the data handling and [Plotly.NET](https://github.com/plotly/Plotly.NET) for visualization.\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "fsharp" + }, + "polyglot_notebook": { + "kernelName": "fsharp" + } + }, + "outputs": [], + "source": [ + "#r \"nuget: Plotly.NET.Interactive, 4.2.1\"\n", + "#r \"nuget: FSharp.Stats, 0.5.0\"\n", + "//#r \"nuget: FSharp.Stats, 0.5.1\"" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Defining data\n", + "\n", + "We define a short data sample, that should be interpolated using polynomials, and visualize it using a scatter plot.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "dotnet_interactive": { + "language": "fsharp" + }, + "polyglot_notebook": { + "kernelName": "fsharp" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "open Plotly.NET\n", + "open FSharp.Stats\n", + "open FSharp.Stats.Interpolation\n", + "\n", + "let xs = [|0. .. 0.2 .. 3.|]\n", + "let ys = [|5.;5.5;6.;6.1;4.;1.;0.7;0.3;0.5;0.9;5.;9.;9.;8.;6.5;5.;|]\n", + "\n", + "Chart.Point(xs,ys,Name=\"raw\")\n", + "|> Chart.withTemplate ChartTemplates.lightMirrored\n", + "\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The problem\n", + "\n", + "Your task is to approximate a function that interpolate these data points to get predictions of the regions between the knots. The simplest and most common way to solve this problem is to just connect the points by straight line segments. This linear segments can be predicted using linear splines from FSharp.Stats.Interpolation:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "dotnet_interactive": { + "language": "fsharp" + }, + "polyglot_notebook": { + "kernelName": "fsharp" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "// Get linear spline coefficients that completely describe the curve.\n", + "// In the case of linear splines, these coefficients consist of the x values, their intercepts and segment slopes\n", + "let linearCoefficients = Interpolation.interpolate(xs,ys,InterpolationMethod.LinearSpline)\n", + "\n", + "// by using Interpolation.predict(coef) x you can predict any point on the curve\n", + "let yAt2_19 = Interpolation.predict(linearCoefficients) 2.19\n", + "\n", + "\n", + "let chebyChart = Chart.Line(xs,ys,Name=\"raw_nodes\",ShowMarkers=true)\n", + "\n", + "[\n", + "chebyChart\n", + "Chart.Point([2.19,yAt2_19],Name=\"prediction\")\n", + "]\n", + "|> Chart.combine\n", + "|> Chart.withTemplate ChartTemplates.lightMirrored" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The drawback of this strategy is the discontinuouity of the function. At each knot, the function value is defined, but its slope and curvature isn't. Additionally the segments are not influenced by neighbouring segments. While integration is possible in principle, there is no single function that enables its calculation. You have to sum up the individual segment areas individually. \n", + "\n", + "## Polynomials to the rescue\n", + "A solution is to use interpolationg polynomials. Polynomials are easy to define and differentiation as well as integration is straight forward. Any data can be interpolated by a single function with a degree of #points-1. With the example data the polynomial has the form of:\n", + "$$f(x) = ax^{15} + bx^{14} + cx^{13} + ... + dx^2 + ex + g$$" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "dotnet_interactive": { + "language": "fsharp" + }, + "polyglot_notebook": { + "kernelName": "fsharp" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
16
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "let coef = Interpolation.interpolate(xs,ys,InterpolationMethod.Polynomial)\n", + "\n", + "match coef with \n", + "| InterpolationCoefficients.PolynomialCoef x -> x.C0_CX.Length\n", + "\n", + "//coef.GetPolynomialCoef() //available from 0.5.1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As proved in the cell above, there are n coefficients defining a polynomial of degree n-1. To check the resulting polynomial curve, the function is plotted with a small step size to investigate the regions between the knots in detail" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "dotnet_interactive": { + "language": "fsharp" + }, + "polyglot_notebook": { + "kernelName": "fsharp" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "// by using Interpolation.predict(coef) x you can predict any point on the curve\n", + "let interpolationChart = \n", + " [0. .. 0.005 .. 3.] |> List.map (fun x -> x,Interpolation.predict(coef) x) |> Chart.Line |> Chart.withTraceInfo \"interpol_polynomial\"\n", + "\n", + "[\n", + "Chart.Point(xs,ys,Name=\"raw\")\n", + "interpolationChart\n", + "Chart.Point([2.19,Interpolation.predict(coef) 2.19],Name=\"prediction\")\n", + "]\n", + "|> Chart.combine\n", + "|> Chart.withTemplate ChartTemplates.lightMirrored\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Runge's phenomenon\n", + "\n", + "As seen above the resulting interpolating function is worse than the connecting straights. A common problem of polynomial interpolation is Runge's phenomenon, also called Runge's spikes. The only constraints the function must satisfy is to pass through the knots. Obviously between the knots the prediction is quite bad, because it wasn't optimised to be smooth (as in e.g. cubic spline interpolation). \n", + "\n", + "This overfitting gets more extreme the nearer it is to the outmost segments. Thereby the interpolation function is rendered useless for predicting internal points or calculating slopes/integrals. Imagine you should calculate the integral of the range [0,0.2], which obviously should be approximately 1.05 (xRange=0.2, yRange=5.25), but definetely greater than 0.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "dotnet_interactive": { + "language": "fsharp" + }, + "polyglot_notebook": { + "kernelName": "fsharp" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
-10.429018827227397
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "Interpolation.getIntegralBetween(coef,0.,0.2) // available from version 0.5.1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Because of the spikes, the integral is totally unintuitive and its likely, that the result is wrong. It would be detrimental if this function approximation is used to investigate signal properties.\n", + "\n", + "A clever way of reducing the occurence of these wiggles is to use an x value spacing accrding to Chebyshev. Thereby the x values are not sorted equally spaced like it is common for such interpolation tasks. Instead, they are expanded in the signal center and compressed to the outward knots. This is achieved by streching the x values to a semicircle and from there projecting the x values back to a linear axis. In the picture seen below ([from M.Scroggs](https://www.mscroggs.co.uk/img/full/chebdef.png)), x values are equally spaced onto a semicircle and subsequently back projected to the linear x axis. Thereby the desired spacing is achieved.\n", + "\n", + "\"Alt\n", + "\n", + "Mathematically the transformation it is defined within the interval [a,b] as: \n", + "
\n", + "\"Alt\n", + "
\n", + "\n", + "\n", + "In FSharp.Stats this can be done as follows. The spacing of the x values is visualized as scatter plot.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "dotnet_interactive": { + "language": "fsharp" + }, + "polyglot_notebook": { + "kernelName": "fsharp" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "// new x values are determined in the x axis range of the data. These should reduce overshooting behaviour.\n", + "// since the original data consisted of 16 points, 16 nodes are initialized within the original interval\n", + "let xs_cheby = \n", + " Interpolation.Approximation.chebyshevNodes (Interval.CreateClosed(0.,3.)) 16\n", + "\n", + "[\n", + "Chart.Point(x=xs, y=Array.init xs_cheby.Length (fun _ -> 0.), Name=\"Original knots\")\n", + "Chart.Point(x=xs_cheby, y=Array.init xs_cheby.Length (fun _ -> 1.), Name=\"Chebyshev knots\")\n", + "]\n", + "|> Chart.combine\n", + "|> Chart.withTemplate ChartTemplates.lightMirrored\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Of course the corresponding y values are missing. Here linear spline are used to predict the new function values at the chebyshev knots (Note: Alternatively, you could predict them by using cubic interpolating splines)." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "dotnet_interactive": { + "language": "fsharp" + }, + "polyglot_notebook": { + "kernelName": "fsharp" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "// to get the corresponding y values to the xs_cheby a linear spline is generated that approximates the new y values\n", + "let ys_cheby =\n", + " let ls = Interpolation.LinearSpline.interpolate xs ys\n", + " xs_cheby |> Vector.map (Interpolation.LinearSpline.predict ls)\n", + "\n", + "[\n", + " chebyChart\n", + " Chart.Line(xs_cheby,ys_cheby,Name=\"transformed signal\",ShowMarkers=true)\n", + "]\n", + "|> Chart.combine" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the new data, a simple polynomial interpolation is performed as before. Of course these procedures can be achieved directly by calling `Interpolation.Approximation.approxWithPolynomialFromValues`." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "dotnet_interactive": { + "language": "fsharp" + }, + "polyglot_notebook": { + "kernelName": "fsharp" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
{ C0_CX =\\n vector [|5.019201925; -0.7533214741; 88.83097648; -931.9524978; 5021.556986;\\n -16205.09493; 34581.04672; -51920.40174; 56337.21571; -44418.89323;\\n 25289.04892; -10235.17511; 2861.178305; -523.8910412; 56.45234065;\\n -2.711273142|] }
C0_CX
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
InternalValues
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Values
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
OpsData
Some(FSharp.Stats.Instances+FloatNumerics@116)
Value
FSharp.Stats.Instances+FloatNumerics@116
Length
16
NumRows
16
ElementOps
FSharp.Stats.Instances+FloatNumerics@116
DebugDisplay
vector [5.019201925;-0.7533214741;88.83097648;-931.9524978;5021.556986;-16205.09493;34581.04672;-51920.40174;56337.21571;-44418.89323;25289.04892;-10235.17511;2861.178305;-523.8910412;56.45234065;-2.711273142]
Capacity
209
MaxCapacity
2147483647
Length
209
StructuredDisplayAsArray
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Details
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Transpose
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
InternalValues
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Values
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
OpsData
Some(FSharp.Stats.Instances+FloatNumerics@116)
Value
FSharp.Stats.Instances+FloatNumerics@116
Length
16
NumCols
16
ElementOps
FSharp.Stats.Instances+FloatNumerics@116
DebugDisplay
rowvec [5.019201925;-0.7533214741;88.83097648;-931.9524978;5021.556986;-16205.09493;34581.04672;-51920.40174;56337.21571;-44418.89323;25289.04892;-10235.17511;2861.178305;-523.8910412;56.45234065;-2.711273142]
Capacity
209
MaxCapacity
2147483647
Length
209
StructuredDisplayAsArray
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Details
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Transpose
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
InternalValues
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Values
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
OpsData
Some(FSharp.Stats.Instances+FloatNumerics@116)
Value
FSharp.Stats.Instances+FloatNumerics@116
Length
16
NumRows
16
ElementOps
FSharp.Stats.Instances+FloatNumerics@116
DebugDisplay
vector [5.019201925;-0.7533214741;88.83097648;-931.9524978;5021.556986;-16205.09493;34581.04672;-51920.40174;56337.21571;-44418.89323;25289.04892;-10235.17511;2861.178305;-523.8910412;56.45234065;-2.711273142]
Capacity
209
MaxCapacity
2147483647
Length
209
StructuredDisplayAsArray
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Details
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Transpose
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
InternalValues
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Values
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
OpsData
Some(FSharp.Stats.Instances+FloatNumerics@116)
ValueFSharp.Stats.Instances+FloatNumerics@116
Length
16
NumCols
16
ElementOps
FSharp.Stats.Instances+FloatNumerics@116
DebugDisplay
rowvec [5.019201925;-0.7533214741;88.83097648;-931.9524978;5021.556986;-16205.09493;34581.04672;-51920.40174;56337.21571;-44418.89323;25289.04892;-10235.17511;2861.178305;-523.8910412;56.45234065;-2.711273142]
Capacity209
MaxCapacity2147483647
Length209
StructuredDisplayAsArray
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Details
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Transpose
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
InternalValues[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Values[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
OpsDataSome(FSharp.Stats.Instances+FloatNumerics@116)
Length16
NumRows16
ElementOpsFSharp.Stats.Instances+FloatNumerics@116
DebugDisplayvector [5.019201925;-0.7533214741;88.83097648;-931.9524978;5021.556986;-16205.09493;34581.04672;-51920.40174;56337.21571;-44418.89323;25289.04892;-10235.17511;2861.178305;-523.8910412;56.45234065;-2.711273142]
StructuredDisplayAsArray[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Details[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Transpose[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
(values)
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
(values)
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
(values)
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
(values)
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
(values)
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Predict
FSharp.Stats.InterpolationModule+Polynomial+get_Predict@51
this
{ C0_CX =\\n vector [|5.019201925; -0.7533214741; 88.83097648; -931.9524978; 5021.556986;\\n -16205.09493; 34581.04672; -51920.40174; 56337.21571; -44418.89323;\\n 25289.04892; -10235.17511; 2861.178305; -523.8910412; 56.45234065;\\n -2.711273142|] }
C0_CX
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
InternalValues
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Values
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
OpsData
Some(FSharp.Stats.Instances+FloatNumerics@116)
Value
FSharp.Stats.Instances+FloatNumerics@116
Length
16
NumRows
16
ElementOps
FSharp.Stats.Instances+FloatNumerics@116
DebugDisplay
vector [5.019201925;-0.7533214741;88.83097648;-931.9524978;5021.556986;-16205.09493;34581.04672;-51920.40174;56337.21571;-44418.89323;25289.04892;-10235.17511;2861.178305;-523.8910412;56.45234065;-2.711273142]
Capacity
209
MaxCapacity
2147483647
Length
209
StructuredDisplayAsArray
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Details
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Transpose
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
InternalValues
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Values
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
OpsData
Some(FSharp.Stats.Instances+FloatNumerics@116)
ValueFSharp.Stats.Instances+FloatNumerics@116
Length
16
NumCols
16
ElementOps
FSharp.Stats.Instances+FloatNumerics@116
DebugDisplay
rowvec [5.019201925;-0.7533214741;88.83097648;-931.9524978;5021.556986;-16205.09493;34581.04672;-51920.40174;56337.21571;-44418.89323;25289.04892;-10235.17511;2861.178305;-523.8910412;56.45234065;-2.711273142]
Capacity209
MaxCapacity2147483647
Length209
StructuredDisplayAsArray
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Details
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Transpose
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
InternalValues[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Values[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
OpsDataSome(FSharp.Stats.Instances+FloatNumerics@116)
Length16
NumRows16
ElementOpsFSharp.Stats.Instances+FloatNumerics@116
DebugDisplayvector [5.019201925;-0.7533214741;88.83097648;-931.9524978;5021.556986;-16205.09493;34581.04672;-51920.40174;56337.21571;-44418.89323;25289.04892;-10235.17511;2861.178305;-523.8910412;56.45234065;-2.711273142]
StructuredDisplayAsArray[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Details[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Transpose[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
(values)
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
(values)
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
(values)
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Predict
FSharp.Stats.InterpolationModule+Polynomial+get_Predict@51
this
{ C0_CX =\\n vector [|5.019201925; -0.7533214741; 88.83097648; -931.9524978; 5021.556986;\\n -16205.09493; 34581.04672; -51920.40174; 56337.21571; -44418.89323;\\n 25289.04892; -10235.17511; 2861.178305; -523.8910412; 56.45234065;\\n -2.711273142|] }
C0_CX
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
InternalValues[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Values[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
OpsDataSome(FSharp.Stats.Instances+FloatNumerics@116)
Length16
NumRows16
ElementOpsFSharp.Stats.Instances+FloatNumerics@116
DebugDisplayvector [5.019201925;-0.7533214741;88.83097648;-931.9524978;5021.556986;-16205.09493;34581.04672;-51920.40174;56337.21571;-44418.89323;25289.04892;-10235.17511;2861.178305;-523.8910412;56.45234065;-2.711273142]
StructuredDisplayAsArray[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Details[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Transpose[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
(values)
[ 5.019201924823986, -0.7533214741322293, 88.83097647738644, -931.9524977725528, 5021.556985929983, -16205.094934904337, 34581.04671553936, -51920.40174004338, 56337.215710140226, -44418.8932327272, 25289.048919873298, -10235.175112455037, 2861.17830460304, -523.8910411644107, 56.452340646091066, -2.7112731416610663 ]
Predict
FSharp.Stats.InterpolationModule+Polynomial+get_Predict@51
this{ C0_CX =\n", + " vector [|5.019201925; -0.7533214741; 88.83097648; -931.9524978; 5021.556986;\n", + " -16205.09493; 34581.04672; -51920.40174; 56337.21571; -44418.89323;\n", + " 25289.04892; -10235.17511; 2861.178305; -523.8910412; 56.45234065;\n", + " -2.711273142|] }
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "// again polynomial interpolation coefficients are determined, but here with the x and y data that correspond to the chebyshev spacing\n", + "let coeffs_cheby = Interpolation.Polynomial.interpolate xs_cheby ys_cheby\n", + "\n", + "\n", + "// Note: the upper panels can be summarized by the following function:\n", + "// returns the polynomical coefficients that approximate the given data\n", + "let polynomialCoefficients = Interpolation.Approximation.approxWithPolynomialFromValues(xData=xs,yData=ys,n=16,spacing=Interpolation.Approximation.Spacing.Chebyshev)\n", + "\n", + "polynomialCoefficients" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using the determined polynomial coefficients, the standard approach for fitting can be used to plot the signal together with the function approximation. The chebyshev spacing of the x-nodes drastically reduces the overfitting in the outer areas of the signal." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "dotnet_interactive": { + "language": "fsharp" + }, + "polyglot_notebook": { + "kernelName": "fsharp" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "// function using the cheby_coefficients to get y values of given x value\n", + "let interpolating_cheby x = Interpolation.Polynomial.predict coeffs_cheby x\n", + "\n", + "let interpolChart_cheby =\n", + " let ys_interpol_cheby = \n", + " vector [|0. .. 0.01 .. 3.|] \n", + " |> Seq.map (fun x -> x,interpolating_cheby x)\n", + "\n", + " Chart.Line(ys_interpol_cheby,Name=\"interpol_cheby\")\n", + " |> Chart.withTemplate ChartTemplates.lightMirrored\n", + " |> Chart.withXAxisStyle \"xs\"\n", + " |> Chart.withYAxisStyle \"ys\"\n", + "\n", + "\n", + "[\n", + "chebyChart\n", + "interpolationChart\n", + "Chart.Line(xs_cheby,ys_cheby,ShowMarkers=true,Name=\"cheby_nodes\") |> Chart.withTemplate ChartTemplates.lightMirrored|> Chart.withXAxisStyle \"xs\"|> Chart.withYAxisStyle \"ys\"\n", + "interpolChart_cheby\n", + "]\n", + "|> Chart.combine\n", + "|> Chart.withXAxisStyle \"xs\"\n", + "|> Chart.withTitle(Title.init(\"Chebyshev spacing for function interpolation\",X=0.5))\n", + "|> Chart.withSize(800.,500.)\n", + "|> Chart.withYAxisStyle \"ys\"\n", + "|> Chart.withTemplate ChartTemplates.lightMirrored\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can again approximate the integral of the function between [0,0.2]. The result now should be much closer at the expected value of 1.05." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "dotnet_interactive": { + "language": "fsharp" + }, + "polyglot_notebook": { + "kernelName": "fsharp" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
1.0508141233095727
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "coeffs_cheby.GetIntegralBetween 0. 0.2 // available from version 0.5.1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Approximating a polynomial from a function\n", + "\n", + "Instead of starting from data points you can also transform any function you like to easy-to-use polynomials. This comes handy when investigating function properties with complex functions that cannot be differentiated easily. As seen below, a function with y \n", + "axial symmetry is approximated. While an even number of knots very well approximates the tails, an uneven number precisely predicts the center point. The simple interpolation with equally spaced points nicely depicts a drastic overshoot (Runge's phenomenon).\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "dotnet_interactive": { + "language": "fsharp" + }, + "polyglot_notebook": { + "kernelName": "fsharp" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "// this example is the Runge function and is inspired by the wonderful blog post of Matthew Scroggs (https://www.mscroggs.co.uk/blog/57)\n", + "let myFunctionToSimplify (x: float) =\n", + " 1. / (1. + 25. * x * x)\n", + "\n", + "// using 20 knots that are spaced according to chebyshev\n", + "let myFunctionAsPolynomial_C20 = Interpolation.Approximation.approxWithPolynomial(myFunctionToSimplify,Interval.CreateClosed(-1.,1.), 200, spacing=Interpolation.Approximation.Spacing.Chebyshev)\n", + "// using 25 knots that are spaced according to chebyshev\n", + "let myFunctionAsPolynomial_C25 = Interpolation.Approximation.approxWithPolynomial(myFunctionToSimplify,Interval.CreateClosed(-1.,1.), 25, spacing=Interpolation.Approximation.Spacing.Chebyshev)\n", + "// using 20 knots that are equally spaced\n", + "let myFunctionAsPolynomial_E20 = Interpolation.Approximation.approxWithPolynomial(myFunctionToSimplify,Interval.CreateClosed(-1.,1.), 20, spacing=Interpolation.Approximation.Spacing.Equally)\n", + "\n", + "[\n", + "[-1. .. 0.01 .. 1.] |> List.map (fun x -> x,myFunctionToSimplify x) |> Chart.Line |> Chart.withTraceInfo(\"original function\")\n", + "[-1. .. 0.01 .. 1.] |> List.map (fun x -> x,myFunctionAsPolynomial_E20.Predict x) |> Chart.Line |> Chart.withTraceInfo(\"approximation(equally) k=20\")\n", + "[-1. .. 0.01 .. 1.] |> List.map (fun x -> x,myFunctionAsPolynomial_C20.Predict x) |> Chart.Line |> Chart.withTraceInfo(\"approximation(Chebyshev) k=20\")\n", + "[-1. .. 0.01 .. 1.] |> List.map (fun x -> x,myFunctionAsPolynomial_C25.Predict x) |> Chart.Line |> Chart.withTraceInfo(\"approximation(Chebyshev) k=25\")\n", + "]\n", + "|> Chart.combine\n", + "|> Chart.withTemplate ChartTemplates.lightMirrored\n", + "|> Chart.withTitle(Title.init(\"Approximated Runges function\",X=0.5))\n", + "|> Chart.withSize(800.,500.)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Use cases\n", + "\n", + "- function approximaion of nonlinear relations (e.g. Schrödingers function) with only a few terms\n", + "- optimization techniques\n", + "- numerical solution of integral equations\n", + "- improving wavelet transforms by enhancing the accuracy in outer areas\n", + "\n", + "## Drawbacks\n", + "\n", + "- The Chebychev knots are interpolated linearly. The points that are interpolated don't exist in the original data. As alternative one may use cubic splines to get a better approximation of the transformed knots, but since the presented strategy aims to minimize computing ressources, it wouldn't make much sense to use cubic splines and then go back to polynomials.\n", + "\n", + "## Other techniques to mitigate Runge's phenomenon\n", + "\n", + "- using lower degree polynomials: Thereby you automatically move to linear regression instead of interpolation\n", + "- switching to splines: Splines are perfect to reduce high oscillating behaviour of regression curves\n", + "\n", + "## References\n", + "\n", + " - [M. Scroggs blog post](https://www.mscroggs.co.uk/blog/57) with its [Github repo](https://github.com/mscroggs/RungeBot)\n", + " - [Youtube - Beware the Runge Spikes! from Matt Parker](https://www.youtube.com/watch?v=F_43oTnTXiw)\n", + " - [FSharp.Stats documentation](https://fslab.org/FSharp.Stats/Interpolation.html#Chebyshev-function-approximation)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".NET (C#)", + "language": "C#", + "name": ".net-csharp" + }, + "language_info": { + "name": "polyglot-notebook" + }, + "polyglot_notebook": { + "kernelInfo": { + "defaultKernelName": "csharp", + "items": [ + { + "aliases": [], + "name": ".NET" + }, + { + "aliases": [ + "C#", + "c#" + ], + "languageName": "C#", + "name": "csharp" + }, + { + "aliases": [ + "F#", + "f#" + ], + "languageName": "F#", + "name": "fsharp" + }, + { + "aliases": [], + "languageName": "HTML", + "name": "html" + }, + { + "aliases": [], + "languageName": "KQL", + "name": "kql" + }, + { + "aliases": [], + "languageName": "Mermaid", + "name": "mermaid" + }, + { + "aliases": [ + "powershell" + ], + "languageName": "PowerShell", + "name": "pwsh" + }, + { + "aliases": [], + "languageName": "SQL", + "name": "sql" + }, + { + "aliases": [], + "name": "value" + }, + { + "aliases": [ + "frontend" + ], + "name": "vscode" + } + ] + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}