From a3e626b02aa6a3a602478ecf721845915c046fe0 Mon Sep 17 00:00:00 2001 From: Tatiana Inama Date: Thu, 10 Sep 2026 11:46:36 +0100 Subject: [PATCH] docs: simplify nested and repeated columns --- .../orders-table-schema.png | Bin 0 -> 53854 bytes .../nested-and-repeated-columns.mdx | 250 +++++------------- semantic-layer/pre-aggregates.mdx | 2 +- 3 files changed, 68 insertions(+), 184 deletions(-) create mode 100644 images/semantic-layer/nested-and-repeated-columns/orders-table-schema.png diff --git a/images/semantic-layer/nested-and-repeated-columns/orders-table-schema.png b/images/semantic-layer/nested-and-repeated-columns/orders-table-schema.png new file mode 100644 index 0000000000000000000000000000000000000000..1a2b1f015b05b1ba518856d973cf713a3605eb2d GIT binary patch literal 53854 zcmZ^~WmFsA8$Vbm6etoXUfd}bXrZ_l4N}}43Ms|iiw252#ic+gPH`<7tWccd9w3ku z4bDH`-|n70`(j_@DlPCD3|GhAtWam<$4`O&|E6F{nnV>yDf55VrRhND8q&^Y<&I%j- znaESY&{N0dgQt&`yWJB-u)UL2etm|`lP6PuRo=%r6U2-daEiv9CTuN zjvPt&q3`gR=t+rXllB`qqZ5kXg?pUG`K)W%E9Skq$|u2sJtjQZd(!4wh zU2v?nmvr1+AtrksnOn|?@;7o9zn5r}Y6EtuSHS!`v{~oRFohQ{Z-k(&NLhO5j9rL+S4E95?lsQS@%TlpRr0iR-BPi5PI>H<^#OP zouem(7hR?aWn(-FQjtEN?<1Xdf`Gq%>zQEIvwKYl~;( zu>x4zG}cvv_!n+V2ZgT%h}`8of?R|)RCvFmrlk{d{cDi@j^`t)`QM74?l0H8-|B+g zH55DL2G{Nj-L%@Se!ksb4mueW|Ai_Eu`Lbu#J>2urROfdnizWg0tPg%VNil@?VOEv zmn>uknr)q>-_*lz<=nqYwVX;F`c38R2XU;G7baBj|57mKl&ZQC=ef?I-ndugGl1r# zPV)ak@=bLV!t0f+a5o+-sZ zF~2zMYpb+&M$!TmhJY!`{X`BRW&0XnjIQ#{9^5J@6cdMyq zw}-~PjaFFFOo2g6Jk4iqeT~yxI11>%q*DvDi`ie->tRr;SrnUD?^$B){$OiT-lDhg zKL4zb*Ugmgx^wn|;n?7Ddz_r%Be+s6WUqL#OqjENCX8F^ms|xt-IdIOsfW7kg{@G$JaQN-bi6v{x%;bHrU!t#xUxD^AJF28*F7a=|WC@A|$+Dd8Um#a7$28{t zlrGhO1!;&QKC$`!(~FVq^!4;yn|pEYi@)bCn)L8k zy^zU%(euc|!0)OD3E(7eZ7Bbr3*gwU zX`RH$q_T$Lrx68MV~>}}9}KXEbD`5Y0K>WSWazHl3;tZ?#IV!XZKBr0KHu+yY(D&c zxE;z6BEge+ECby3I_jBi-*NQgOT1TkE-Xsay7h&73pIC}4qd4=ZEN^5KR=I@ynu0f z9r@GHpP8SE`sD@!?~QD`j^roOrJRE#UjEfLFE9l{*`cX{1=`T^M3V%oy8C^Pv`&Wo ztkeRfp4wpGwfTA5A7t&M$LalfTe98FPxvIy?LvXjbsii=zwdEyHi(?;`7nHzEb%r7 zSnw5^Duide2lg4YPzN0$LO^axayx+e+ z74viQM4pTJNeA=XFn^%C-7?QmLY)M-#$^po*>j1}i#`(#HmX5!Kzm_R1?l%A0VCZP z_F7|GxBHNk)a{IgVYh?(5q~e|E&RCcG}L?8YpIrokRZNR1?h>aH$;sLer8+ZBV&Ha z7dML+Z7Ci+$PN$KL~gst)+A>E=&@$U&)R58YIo(w`g@TN_mabYNgnLTT2#q;tlf=p z#blls$}bpnvodm>bbkoDxy|$#4&J%73b^E`)#>TDy4$}$^q7#gGGebyp9CTY-9^`L zs8V};?oBjIl{6+|yQBQ7c;7gkJ5(nVN9m9m8IOo$d`c5MOJTP;m2P_xpH*$rviD&! z-z-bWQQvvF*$F!zXwkhQdH1hBA;5@z`QOX=liXbiU{e>(lP-p?>a}&5+SF|?Xs=~0 z3ho~4C)B$cvUYthqPXFd4ksx9|T^TMPk$5Xo4+?gFwo=9^JXtrrNiVbF%F}B^C z5K@TZ_BwK$uX3x@ul|A({Ug9CZE`A3ehMPI`vh}o7ri~l4#b30&C}bW?0REeW%Lr@t0IVt@ZbPI`@sQs$QMbl*Rvk zV^nr;MZ)ty>JF5i9-!1a#rYY4LafYI=-`h82tTRHgpMrKf7MaU_5x4 z+SiojpZ1B~PeqLG*Lu3Tx_-HLNnPiE>JQ$%2OaCsXD*eS>wnn^7<;{@vzCM6Z8CFb z81dMBCQ?wEU|)E4^h|cmAfaXU(qFo?c?J%;XHS6Lr7yuOp+dR$>>)b+f0ZikhebE) z18dzio{1qsyKl97?7B48N@g!57HX;YfBsubx?4N<0iu#jhq@k=qJR0ta!V|1;?k8w z$i?U;U%3^X|NEeUl)(b!95TOOF!NdE?((`S7ZPf6IoE`V_VdSKNlHd4b&=h#!wS|> zUy&h?w=_oV^OU|A@TqWvL${(N<;-D1vZLv-bcSqbAhf~%qH=w)(_v~wb8db<@LN&Q z+T22-&voD$b(9tB!QmlMOFu-slhG>(e74sW^4L^+zuk?l1oZQc1_G}PZ``D(+&?aA z;f%9dLTz}e0KxylQ#D2H9?Z=px>VMXiCE^x#c2n=U z*_ZlAB+2xz$N%E6^X2gojQKDiFOs(*LyZf+|2wmxOThB-ULuX~Lq93UTM_hZY-0eb z%gXjxkOAwre5Wi43a@yyRF$ffo+(Xy~WMmnz0Tnsm9SSK`dXD{P6Jv}Baja3sG>2akIc0Qjx1D^Ey*i%IbyrAk7 z4{W_8Y-(zHOogqfADzro0AkBbc3-6KIPQk(kiH|S;!G9#_Lk9n2kaZm4a33B%yyuT z63{OG6rRL>ad$SEdKA0%uaQwFUbpwNFP1>Ge#Lo|gP4pV1zW~$g0RgBKY z{AZhAwv4SXeTv7`YxE~;5=M2D{e!YJS#^ls%lCMohoGhLhwdB#)ir)a9X&}-d5?eL z+zF;g?F)A8fIhNHa9m%zUx*LJ;6^TBp7|2+uENoR223z~KIi<(Yi!v?sl}=g2 ztvrNicVK$@KySqO;yU-xJDDdC=x2O1ZYtl;KiZow8PIn>5JMXK1$)$!zQTbkFX&Vy zgd}j2K)K6#Rf_QQzBMxMPH6i;ES>~!>|5Wlf}6o6p~hi>Ri!ag_zRbrPJ;Y zRzq>rX|}xoEvDC@L+{wKl<62}Gf9_GTaHjXHG($zaXy;_;#H1q}YdXNoUF?nMi2i2U# zY)fPYe##T#J5nFpvq*R48xP@d9WQ{v7H{uom7rgTMu*j$i-_v3f)#HiLyF7I!5tlgpuRjG#NW;9UU^8L|7NCn zoH=5Bo6ZHfnt#7?xIlXQG3Y|!#JjrI->wsI8MJEu_{tpOYOObNd9GPaRn+m?enAWMTO&||!*>0I)dOvPBG?SU8t zIB|WRxDPg^JO4R+K$47@yXxnpFO$i}|3o#@Hh>*2TEZ*Tndo3s*}xT>e)a2whX%b$%x z72F3B7sp8PMZ#NxlnPu)68)DFpPkYlJr+{tqiz>yWBFgKGnaV{7IcYAz=G=9$46hs zdG?m1cD|2(+43x0HSAx}Qn+*2J~lV7G^4b#v8DNx4ECd?jchbXr9?Qmqe6e{^(& zQ~#OXN^C66sG0s;E9!T;)5-l5_m{GQC1)>aTXK34Vnr1$pRXSf5U>xDRigjO&#MRW zqm59mq@rOm{WdkW&qOQX`)70-eTlcOfEX|vhZ_D##KFGGdx5X(EaXqIRs8DOAn3CC z6sV6~ValcOq-08-DZh;cVMV2Cd!7WAsA=i&GE*;%Lcd6Z6GJs;lEPI{COodAey3r`Ez7( zRtBG@{I2%f`Bi?;UO#kU6;z?HCI*3wqZJhO_}VWD_<0dUI_yS*p#pOfy#4$Hp%U-S zH1R>8*IRZ;b++sBzi3&cf1ThboviKdj7ibqC*C4Q{9;|`>f)QWeo z+ndrvS$!kSps?ap@heI$YC+H`(eX02Z{0XDJwA8@8 z_N)=>lymwhz=0|XW1w;Wa?l1$^jn6}qtFdd-{@%*%RKc$h~-jwmgFKNQ^J7#)J(GNb`NeawY!?Caos42AC{q6;1;xhs8gbAU4y-wr z@&YtHe}P__>`PP&9v}|fCK)7-&=YH>*(+yPBD;F!R^w(JUO7^(qq5vRv(0jhEP5dt zc;%W9=gY$jH0_<~_hrtJ)o%FqQhjQliMV<}9DVjIedAYvyH*q;V2v)QXe@Z8L>V?k zxkCRa`7bDr>{cVOK(Gg*iiWL4GHS6r*n9M<^I^L0=Zy&6cBhql{l_x>ZCT7$rl;lR zrio{=rS7l9_Z*1m59=7b6*r_8Fz&Z zjwtdIyf^%-XpK}5;EjI0bvDq*c>@V~MOub`S=>)6zmb5jOI0A8F5U5b4jFwsYv$;R{Pw`6(#O@Vp04%d zhW5K5s?TXSWhZLcf)#Z>$TdTkVpTxO<)55W#searw9lD>Dg%;fl(8@LxuXY!d(O;I z5a}8pqm7BVp65`He!y~6Qx|QBP%Q1bx^aQaS%!W8Z>pegf`t2_(qH+jEB_2+=vQz7 zFsA|oe}6>s2ep=zEHwO0kB@x_GsvZMcJbe)iE0X(Pw1fyykzLvc=!kLe5eRKSnoc3 z6u6tFE}2YbQNrzmK(%)T_TCLNNQBMu|8 zr-RNR9a}5w0qgfCmz%fI`5yVwHr1Q&=~DB_{Nhth>K|8i~vP!NBWas zuwQaun)&_P>~zqz)-d2m-KBN>(RBhKEf;K>{X3_nRp|lwNC;oMg&_%wFNcwj+;>^2 zw_DH{ArCir!GQD!LP~ib&Y!%HM673wR^QaOj;>3KR&nqNNEZyc$`Nr(YQD<0NKC zQ&)RU24K+f38v#kbXE#KeD=k?8)m(#di;6PziFLNaLd3X%@?eEXGqfQ+G}yvv$b&2 zKlA7n`nYcht|z}NUSr_GbaR7O#x~nYH_%ba)XsT53Yf?ky02I=GRZ|iJnoE?wse-B z?*-btin*x5jybY-8$>50A`!R`EJa}y_s-J485h!eU$Ws3vME4kL(aCA(wsa%> zj6;==Fp@ffUh-w8X~wtd@1yenp0H_hJ2MS2m}N($;n4kNP$w?74TLbTv4&5M9Q*P~ z2NI)X@$-&AEY`zaD^~&;H^A&bNy^ONNx_)vB&Gyu_^?214)>#O0<6=Gj~MWfJmNFx zQkI)07MxIGx*pIZ=Uzc1eGnzaHN;16mBmjtJ7!|!hk0UXB2|-~Dd<0+Dy?N=0_P$R zezzniPNCWs-Y={87#F%3&~|!kFyJOnYydZ$%p3TrVLSR|;6?q?`N?+vm!?kyfCkd` zj*b8ao&5`TtgRrmN~P&K#^>GQ6{o}q(}E^F2WMx#hB~U0G|Y1wyx_F-mpe6B(WLJE zs=b&QcY-TbHh3S_Z&H`TT<>RK4+U3V5|0Dx4?qKr9TZ8GxXX#h-M~TjX(=!(Rzyv? zG=*r!cHmYa@&dj<`JF4AWKeyY&Qmy_X)ro3;R9oSa&c%1M&bpON&4gQUb_1=yP(=W zB`)mRfunE~HU~A0xi+Hh$+d99ukW-x+p_`P*-A%Xe6h)4!H?pY1fRA^1-s#|pARiS zU>U7qfq%$>`t4-}CXEhSRVoC;hi#CpGxAbV;+YiVw^&;v1%+kv4q8&ImEgty z)u#JODC7k_Ln6NTQiPUSh!pj&jk_>{*73aMM{$Kk&ztZ#o~Yw{QKr?1vq77QT}xO5 zGATsL-C5RDn}ks@LKJq_pSC^i%#DOTNt6mcW`EglKmARm?K@54xeOY?bH`dr#LB0D zwZJcn&xO}~ZE{^zW#Vw99@qq`r^cffP5{(;Hq@d5&@Wg{e*u(4lusX-QYpxmqea@0 ztt4GASIe|Fota^@j3diizP9gW6AEGt6D(jpdYHIRN~%n+UYo^ChT*2U6ROy>ZYl{6 z!IYs~BuMEyw{QmDyIWuBPqhja4i*pMchfz=)%$^tveuF%^@F$E6Ft^gehW2b{Zhd; zmbe4AS^A-9{`pn#w`8$`VxaCpk#JQhhZ-o}m-%vSdbGs*0UZ4Ja4+ftp7T95un0PS z0MBHvDlgUt6wu(Mn2JqjVT47zCupkObQWHOw=F(n{#xhDb4xek2L7Oyccduya{X1@ zxpk&TN`?c0eMkdg+Pk#Ye;u$$^sV2IkI#y%YE1_Nz|3s&WUy5>o1#<64-hMEPk9*f< zH$t8+QJu6~Xk#4ueaGFGXVsSxf21@$u9YIn>Ksz16ON+zuhriDCv}CLe@l8G-y)|_ z&!RvjiBQNVNU#%2zwh{n2DQm@zv#Z%F;yAXGq0o`)u_%y;9T!S960p%{m`rI`{a1a zKCspBq5407+UukJ<6AxU#(|Z@0p83#5AUp+Sle@6Uf!aV!r5p|ZcXljH^-H4kHm!( zF=c&E_W3hd%MwaUbCl&*7Ud}T-J|=a`XHmF+AM3O%IZ$>ZyNfqPPSK+>ye&2-%ccT zxpb4K5S!UTj(w6D6i*|>#$>rN#mqEghbXio@ZVv~xC1ml=2|{}eS^7v`z?mh`P-t8 z*z4&VdaiU^MF|036~AaME>I~%P74AaulvrU&iCUq2_=5^h%wY5STO=KJKIqy;;t9E zrlq^;hWf!BQYdM<6O*mi4^EOV(Xc3q1c{Wx7x1rERMc6K8?T@iS9k?LH}`^+y_n!( z0YOz(nT$(8`tHIq71BH{$wi-!v_LXjM(>Gl2M+8SMNLiVxmr$kyEnUFm0j(KFFSk; z3(wO*U8UrA>UhKd0sNTRXpZDOL$M4BL{S{Qm>qbK`XrA2a7hRtedoF#z!@sweHb~O zqDI)yi7&>WJ2|XH_6^sPgfj;)0HyH*adQapf-Rh=&xNB2SqBs|WR!pE(*;jw=nMK&as09Y4~i1|zfAPOrW4?ePm4!GZ)N?Ppxg;dai1>yR@|A|1FXVWoX%Wa&Opn|cu!0z3x^yT(><Sv>tvy%$q+V`EtI zDI+PF9im9kk*(cjHv=s-(5&=p3-I#r(xWO(fAI3kVxEjQmnlkU1)VldbG3Y;iej<^ z3#cc3@*VB?$@5(Ez~A^ap#FU&7I$NQ!gCDmG4>v`S6oK~!Y}w)R#wK7F&}jMwnN;f z)<=51tJmpZ1xe69Ok}T-yE*YG_drSth3TUjl**0c>uzRd#`lrftZ=2HDwVOzb`U<* zZ7eU@Gu$Y!q0m_H>y-XbVl zCxVC5F24E{7WgNqDvrw;eX{VVre#Wr1;6WGcsPuj2M7N$@OjQvOxmCR>aUSR&`rKv*AdLz>=x?(^5ERiV_ zm}Z)tdKDn`y2F}HXIK5{YxqkLclA_1uhM0Q#nE5lD(?S8Mn}p!72JcBo{*m)e7u3w z^1&yJMXz3O87c9AB;@KFBmR(~(YHi0v+2=0)tPUDlyBE*u*P_J`oBxGIe~fxgUCNYTQ4{$=A1bwCR#G_5D5zK0R@~cNj<+@_c$5WtA(kcP0C#PXf$HePU?5 z62MZysGwZZ9HlU%ZBCBCvqUmt_FpZfNz~&LA}BG9E@dkP7n@cm`J-j?GVUp|FDanX z?ZJ5AHL6TYc1A@zoUdL^LRw%2?) zdb+#43QhyXevq~u4c4x;9};M3hA8@L$s1-vTVT@Z=XAE?ep?f~0m|RvWIqW!C3!1P zEvXdS{s?UeC6}@p5up_uT<%vGvKt`P8RgySQ11`uUG!|A@mpwuE?;__uih?GdB;fv z`I2PXj&`M~v7{%x7PeAz7 zHK&%jBCY!j5BDK$1*^g3mG8W7nNAoQSGV3etGd+WB-1JTB~e%x3x9?}VC754~n6+Elk|<{VejDt;p_GR!m zWX;rGm!bc-)_4|`ltp13*{5*vX)7<@3k3hmaw~sat7>x}Rlb4&B!d+!bMSnYVYD5~ z;3aH`mwHi{{0P8R(n2_4U1Kxnl}uQ*OTVKCj83iSHWc5#U#g zNre{c^5b=k)~%4}jH+MLqaQO5TqICQw}Xg_B2J?QR-V!~hL6XCnb75sn~FK-`t=07 zf?x3Nx&w2cg7u8Q@bQZ2+h2W{qcS09Z8&Djm(V^BbKtEd(R|CD*q$!?Lj9vpZO0(G z?lAjoUn|}cYSSF-vW!5erzogubHi7=TNBM^Z$7I(!{r)lP^^W?E&ZV zwb7DvO4m1j$u>!1V4^D%GRg^v{``LLnQZH2qkc}XQlm1oS) zn&*Fe+|;P6C=q()%bTH(ZXt+kSV3aQxcU9-^zumlPUpiu#wGtc_PcDwF|2x@2Us3JtSe#Yl^Vu);Pe-WIm9dY{GTw%BxBVB zypW5P@yjgNN5>FB+}zKRoROq{_tdD6lPoF67b{{bN(14`G`i!Cj<=W0+%Z|&ug2hp zZQ@@*Oc4Y9JW_TJtStH92(%-9Y%d~PjjJzMWf=WI4+r($I9f%qGk-CQT%!X1)3;74 z7}Wr1v%#p`dx?DQd>}y_@uc?`^Gm*4i~Z{K>Q%vn?O#Qklut!Mbhg@;u2kg^A9Hb^7=K-5=Ng%WUb9T;2O{QmdV$4Zya~& z6DSNn74dC=ME_`~@Zse#%B17Szu&rQ@0bb0uu}AxI6`waa=D&C&U7=B!p;wJQ z{SH=9pEtdUT9%b(TGwQ5l-pA+h4OTDDBmfsi_|2`je|Me4EMqh5*1z%$jgdhhPuXh zRGTfstuZrR-X?ir?Lz^?+y2RbZs`=|N@8MJXW9-$ENyM3xI;7!8%mC&S9O0?2x?cZ zupNMT4pr##VSCF>Q)bMgg|OG;(a`h`H>gd$GLs?Jp5_-*b{_J9h-BfyS3L7%&V@3+ zOgijx5^49zlV4oG5AGFdzvM*E(z+DYS9jvn(4PP$Pld?_zR9_?4VT(J0v{)9hkEal ze<`mG{We))5S9?#cpEp$R?Qo+k9Ky<15G?8UACS6!gyQOC|*bvoZM#I@nU_v24zO= zt_)u=^I8{fFE!b_Bp062cT&35#&$aX7{n9kL|5l15*5^Ndj0+QOkdGczIB60D&3ui^-wt-v!EPY7NssfCyvad*(lsCe^KX7NdE0+zp%9fEYdRGDwJ>*L%FIcSul?7 zP*P)7>RDKBwJL43Jgu9`3{{ulG)p|(ccG>WVexojk?oCG`8$I)$hUc`=xb%8^)wq* z5+kbLHJ-lq$hJ=*(VR6;0dW@zs=E-)ZCLl;^hSKXU^#Y`oDInR9z^i2w2aa+{i~%O zQ0(ZPi0U-0XV$2~MdKD1K*h61Kr(cSpMb@wQ2_mwn3|)fvA$GWm^LwIE`jKmQae3* zG=>rWW|++IGJR-zle-Pr+-NA9kLFQ|#?g9m|Ivl?cruIuU+vv>8w~ss$m?_^iY9w`mI9a3)T}krmUjHzC znQ8I?_XV2Vpm7`j9}Ys#Z;FBEt;FfZ2`$y+AW#JN50V0tF8?M$$KU_u9kevE0^&{`09; zLmP?-&#b{QTO%v|RYu0Q0SWEPMAF;MJ`CP@kR{X=9BV)>y1Cd{urw1njR?U700>pC$0H9#5sQXpf%S1$AWg@K?y zr&I|U#w=ag$V}h#s4+OZL+oviVZ2qs6_OtA@GWj|UCS88$NO)i(-51)`bkoNc8x8f z$hq~Ym?k%0OI0ce1B8$IljHgo{Heb85z0UGR=iVOSbOLY$r+EnqM`8{`w4^Ie{=?ImcK~{K53)60V7*rL)x#2{hBp;derR&2&db z{v__{iCo$#F{Dg2!$f1KG5YYQPCwNbmJXuUV^oco86>f1yIJ6EuSg$SfiHG{Eyk*# z;#H4!w8_VTEAJ{s;xu0&n7o{$!A9-}Cms%G39gmi^C57eklVIpe;7;uQt%@~bHuUw z4nZ6XqP{WfR_zlV%X7ecO78fx#?M(4p}zY3JJA8k#*&lOE2qPTs9lp)4oqI^Tzp-%pkla*vF#%akUd34n)2scGxrvax z2)F3aaN(8t9pT?od$t{`zlI-uA@Z0Tgb(zeWIMU_rbC=(EcQD?TEq&SjdiB{MQcWY z*`z#gGYamq?GOhHRd|V+567wo;zhM@gpgz1zUwg__7P4Ou+96r2a);JL<#B%$dN~@ ze#$dSq_QXdhG0m(?>Z~(?Yua{DKbPb_jXA1jag}^UF$7M^Jd#(|LywCvTH()xkULo z3VQ@;wTEs0%u(0(Cd#5MJLY0jeE)KNq!`u7cUR`ydBqZ9>`5f*(<$5|o^iH%5>V+m z{5Y_^y#^^k*N4+aLzvJjtSuJGdQMI5?_X^P-h^?ImR;;yWu$--ae_rmuL7g7EA_8{ zcM?FJNeVnX#bWIOjj7S~sDR^vN9b3dVMh1O)-oZ9|R zOVMXrGIxbAMd<;hnrr7Nx4QLk6K||gYf;Jsi8VKu^&Riv^M=~eklW^e=FwkhDP312 z>^s0fNl8;i+7S1S&1n&PMPCMlpX9A(A2w8B6nkRu?@o)$VPJgZX(>(bxflLia#HFCv_Dhacseo=p`aMvARQ< z_o7?pp{>p(p=g@vF?F=`n}o86Dh#aP0eEWF*ZAC(ytq|A>-+xipN544(?4o!Yxj4w ztJorTcpgjf@1S!0J3R}ovQO%HS{JVq@n4K3-@5`6TW({2PD$tAmOVUDw>|L<3BI%5 zt((Mo+@slq{;&xDRX6GX$Y4gl;D0j1+zT6+{u<uh*Ifo6^3kg^|)P_T4`D=h2^A*9eQtL}Vf_x3#FQt zh5DvA`B+Xsl~)y))9+CvmeyI>ySr8$qnbbtoqJT*#wZ$_s5@);*8W~g5x?Hrt(j&j zn_FGwO$UWfe8-!yYG{m|ruQ6`*P{C%Fe#W$A8jA;Lx4%mG`CB-o857BGw4&-EdxXFPU&~*4ao$~u{egNl_8*qik}RZ3Z{Xq^tLuriEW-v!ke*uwf_>Wd)U6& zADNa><4y~DZ*;P0?vqvHodD~T)x83ahKRWVubC$Q3B+#4zuC{4RqhqqEc+@!00;M` z*Saf;ZLB$UUvvi_(55C%eVMzh93t88jbrN5YbON&K9*>YVWU$eG)fuz@4L}zrhqi8 zu45oXkowhj4_yXD4Xw1cT7Vn168;wRn*^3Z=WkCbfC8MyW&JlUYnx&?b@`C6kf_o= z{5ecNW7|Pc8|u4zMJuGn0Z|kisDPF+M#Iy}dZD&THP3&gh-O6>Y%ED$30nZaRMwfD z_H5(hrP3FrFpBCM;PUmf2DF-KP7V{)|5#1@gey(ZY_&{XyD$E=^Fg|6airT;oO9Rt#Ty$2LmPL}Xvl_f zN;e}*<`Mp;ME?0xEHdG+?G!CJMX`&3vKY11&1Pu9n~jx`*Vj0|+}zZ1-?VKs8*J=v zx_(cz{`OjIDQEh0Sm05f6t{0oG#!~%H?YT9S~i{RA7t#}+5J6sy0LZcFbyZ8xv7c# zSWR_Crc`r#v$%I)Ef~4o8~-$HJ?_azei${~mK@H*nAM&mMskp(4~*rc+pa?1vROZjJK=FuwOyWoY{aAEaFz^&Y-?kT^02M;1*ShY0W~_fOEwllG%DZ@Tfl@$9 zURW#*<=bmloJv>!)H|uS3I*g>RXP^_OKxqD*2ri*k;$pHd|GWKKDW8gJE0%DNKnMZ zvVCiQ(c0NjkuPSLt&u^aorxQ%N9hdG!GXc2J0n7bgoJH?kSiccGiUxtv2O$wI4|k5 zsprgk*WV3UQ6^q+u49yteqn7SWW`$RJRC&WwCb9KQnS%@YK2M@8!Cij2e;woB(QwX z-Lt>j+4;GuOm%>C;8eV!OY;a}k@NwZLjNBNNXN&=M-xr9eRQ#s&ZFp6Z3WQ(N^vFG z&Z5BgY_r1xjlWI-vHgwR0U9W{_7Zqa{VTD|DGH`-s1*!OJIx34uWU0!XOk(t5dsGf zRlS);7OvcmJ#U3*WAPj9G8s7=Wj76#KnMg*na5w(2BMAE6cQKGGAISsg$f+4bBAlq zE-q5h!(}A;$nAzuj-RGnJc&y|Zyklu_!@^b(;XNDc%>e0X!TA(XiL5IwlyN@)*mAvvo(GT*jB$mrPSzTnNE$NjK+@jDq& zSw4svML}(yHc^Adz}TxOevsfUv;(Ck_U7lKK-}psY~dDf?JLAJVO(1Mxwz`>N;>H? z%)#xMIs250M%FgLbBP_%?oy&SFK_P;qo-Q~J$A+EmqLnB=y5O{g6TwD8Da6?lH7M+ z?H@#Fv=HlL=*y_iJV97FIXRhsdGb~`k%x2*js3|yv*uTQITt^dvb_Q{n4tq6eUSnC zESDz{;FW&P>i>T7Daq7WM<;bb;fY;=CAI@PV}H?6uWtk+ zrQ_0QS@czWX^iI&Vqr(NMTPtfq5*lK^fCbgmX7zD_+2D6DxS(65MmSKhR;TG1VS&m zU~PQl=%ASvUo=={T|O!9Di~qa*mX|DeeggMJ!$+OO`5~Y$QWq+ch{Qu;W&anBaVLW zn~`Hhp0e85f7FF_to=>A(jizOf?r?4AGcjmg8Ia|Oiu>_?&oh%aqnwX%trn*Or+mS z!Kls1$oNMKiruMI1){wTMQI03PEc;cJodDi}+!mN>5Qbfv0@*c&a%+ zrKhr9wYpbeZ5h;<8vXJ5^j?Zu@*T;4?1dVg`b#nW0i*wtPL7`6R`L!A`hgS`1`48} zD)GK)e_sDj9T$lDX2f0ZDIqD4&y3<g<`(;-~VsTN2Hl#z|gChk4uvjtvNl&lPx@_sYN5vPlKj~=)iQCL4TmS zy84Gmcz00FYF@`eM*(tequCST6J;ghvo}DE7$5qI*!BRrmd^^e@yJsh?oX8rOpyR7 zvA1r)8r2eiq)OPc1G2^r_cudpSP*A92rnn``F2!ZU~>ofApPs3JHht5|38CfY$n2o zbz@`-m9#TmWK4OTg9UQj9sjwKH}mf6;luAnJXWQF{z2@I0aS|m z8#h>#`Y@EN|*!sU58R#># zBa>Doo1dY}XVw!OB)ifdoDM3v6=BIQHW3S=-yO4N46bG%H=1^c#3S4`{JM=(iCb%n z_x!ahFdbx2Wk_NTH#FAH)fMCdl4D$#yx9_%{MIk{+#wx=c4cwUjRL)u8_3Z{=}>Ab zMC?SemXeh_Q?(mQ{3jOxO?|`BMQ>3=^#eDfu?nhA|I45f1?4FF@ppMq+_c0jil7m6 zgx!fN(Td7W9`j^i79G}G9Zl!HwKgCT)2y_O_ua!xK36!+B*zd$o14VJDH6P)GM$FT z3MG(_IjxEk%4)F=Ql!*QeT`@>;`3|7)5rp1UWM-srfH^J0M?*<30{GPy2f1e))=J~ zb^oSpLM55jUCC^$jgS8;-<5k>rn!5;l~E4 za2Zv zTqjjxA&k3*)W0qrnTH$h zDu}Q8|JXJ!xU`rp`|`{gVZU>>`OYwn420KK?{n6N;LS}f9SX4&5epO9Lj9|OaHo2B zd7}M~o}S+(kxRVqTJ=r$BjNeCxmtcnd4;$1HAX+nlp%umT$$7HN~-d8hPr?sO*E6j z`2oZC)~K6}`E)Mz*hV)*e-RR5(#Mv!Yr%25 zR<{Xm8R^l-(n?U8cRFMKQO%V=xVgGp-3F!zsa772wr3~u08BAi`WFd*_oWhil>k;@ z%x{Ct)+aM56&b_mo1H?&gB;=EvT-$%)pN(lLr<5WqbOfVYxl^IiJedLCC6!Xb6CBn z*6zpPkQXaMInC0>jr7S@l3S6k)t`(GAN=npzkGaYcCt_C9O7fYh$H9md!~l~T9$Y= zM3)%pMGIZINnLRae#~oq&W57p7;`fL9hZ|zVdnyWoB*Zz9+{S zEZ4|;VJa$X;vwG+(^~T|9r2>YhvsAT&Nx?VQE!Y$-X8r_7(+Lu1bdZ>=_Oko{G_l` zsi^ewU!6ydWo1KpG~>RHeSHg%=igmb%~Aud(VBFqcU6`bq#3HmfT4AxP)vc|t#9}e ztN9}UOlqfZfvnclS}i#X_0sQ>KF|uk!cV*~G_!ui&z6?DyM|Sn%XCLi#q<#gTiUoxC;YLR@pKxZyJQPR4EvUbY%sHy5s+)XUTH zN$C;7=05S#p=cjm`z^U1(wsay?sC$5alOXNO4RgmcUM9G#h8KV)$`1^1C6ej^Z|DO z#MZolsLjzYLHgP^y^^;7Tne2f+$5|2LGcYRO#m{q4T*wf{9Sv-rmxSYsirYh<=k8$QXv)uv&sJkvQ? z5`F;1q?nn%ytH!BRCAo_n+dn$2z?Bt8ut2>D>y}+9vM-f%$IJMA+xCZTzDkc{QCWFZwExr4s4}I()ut6TBoBVV~rYYuu-Tg-IlEq+%gMKPaH~57sO8> zonqEthfdsxUIg{}@Vs%8#Rgdq&VNuJSY5XFcoB&- z`LwPy5iDRQ68OzcOV9tI?JWbMY}F$zlkPZncDT$$mW?lF^&%59C?r(dq^;IPtxXwAwfBX)Tm6^qppPmNiUPGnz!9ioz zH*HJ-SRWyG6L2#TA?H?|mgAd8v39drt+F%3haEon$fo}0{DcD3u+`gkA0G5#V~00S zHRGhLyR|l@_|`I=3410YlxM!Y(}TFK&)3{k{e&jTevi zlmzKQV!R2&53hfq6nCTjKyw}gB|H&lk@f9k4(*1DKLeh(yXI3Xa% z-G`~)_|#*6VXv(DAT9sk;DDMYX7~KSOx@brx<4@1Sr)$}kn0b~x_c;3#$4YrXW|t$ zBS`(r@L`E9{~CU72bc2TW=}Sr57DVHjJQHpMG@uSSAMX zh{mnFC9{lzXR535xaA@{-#_^%e29`H+q4B{>xqz$;<5XG=~tnq z3zllvqsQ0D`L8LubCQ6U>LhTph_`WyCu%(Oi14cOl!}8>6u|=mE~29hsxx8SY>&T< z_cT5X_>at3-rM(V!mJu2putv}n{>FY@jsr8T!t%4SMU!Du|HgH7Ho{@@|j}c9k?=x zlC~r?!B3)DJ_;&WJ-O(#rfvEw57x+2qYjn{YAQNb-mJW?8d4qE5lGK_nbn-mV>J?B zoCBsu_!V^o5RAdGc~%cGav+msus4Q;)z;K>2Zj*nSU}Tm#pIXlL$jTJHsdvqzN+UB z>C16SG_vb5oK2$ff8E|es=Ok-uvJDLmZ02&$^oP>pS(S!-t{K5M~A4x^AR%c1|y*z7+Q;Mi4bKmBhU31euYVR=*cr! zaromwGn;KcNVaT15tJ6J5rv^e{7qRp3SME})WnxDPvYO1811|}x<^FCS9UeKFj$oU zACd9!5x#u+Oe2ubSkYW(K!1rZhcP7qpSypXPRVA{Gm24uSX0d5&*C$Nlgz~JJme3g zhB?Gpoi^*ARG>Q{ZVAr;qEw_%T2{OqA@ZF*HhWySfU4g2K_HB;N$q~PoSCQ;_+Zt& zDgu8IGWJJvcGch~7D^aQjmt`SLiok`y_xcJZlai-AHOTtkKebRnAP7INO-6( z9Th*SU(Go30}MD%_r2M2JTFMo%T&g8WI9iD6@v6ch1@{l!@HRhec~_)IqKWR*qh*r zd8=sE`nwsiTfl#)?2N*KH6)r;4`=!!jvv)`5UgMG$)RadAN^6VHK{b0HJmM95uo;Z z#LKC}=lm`5AM>);IU$nzwQw-0Md%fjxe-;jZ9%ZrGlstk>*K}w`MF*IPfkLio-9>< z;|U-@kVcZpHg3msY@4a7M(abe08?Tot9j4tQ0=sCuPA+H!}v5y`Q}z}Rph?1{=Tk! zb)(utY;7TTtCnzgaV@rm)wnOv3q`uYe!7?q&guTnCa3x> zc9nkw0@RH01B}0OE}mVto!eym{Jgw7@#_UOVg=rSxXS21m%nK`TWQK&*|QQ^3C37M z5ULU~vWuTSwD$a_u6f=izI*o?q|Bb?qxY@XD+KyIHVG^Hei1M(k}1rO`UO|ckgZ}E zd#z!r{^J>rdw%|!H-<0_L(la0t=t?YH}Mi~(JuLD^{Rb3pyC2Qj=&hFjknRh9vSd$(tfq2jZ%LzmA7 z(o=O=arM7hxD8k&;KH3pi!HeF`?VZoznI~Ous^>hj*P-eu#lYEa9dotC%Gq=iM_Sh z9JodqGDm*A@PdETJMtPm&er{|BvaE(jylRIGmzZ#FY>lVI5+UF$KdwDuQbBh30^47BlEcU7c| za;weGXz7Q@FnF!acn;XDw&e+22XZ<&j#rmR3eDR#E6ifm3Ww#9t5TH zJ6j6zCk;g&-NjDSVsFmePwDl|&L5N$ToDQ3aRgc-1kpB_VYY(LxZz%+xGp&1_cjvDCo`|Og4+M>SbaaYg2`{DES!ixRTxQ8P{{J z1s?mJ_CtnQ-}03n&OQL$Qnu_zE2v5DD^BjzQ?=7(u=_|K3_xX4zrLF<8kpj$!f~|gBA7$FZ#|`Qk+ug*BRs& zs1rDCTeh=1B5#l>l$TaDq?L?k-J~MjgB}NqWPEF_KBP?_%*+OAq!N_dl4KHF%f!p3+4>JpF}O;i`(A?7k9rRGP* z?R*j+O(q1Ass+ztX@75qGdg~C+<>l9+ma^K5S#Zn#%CxX|9P~lidm{`)oi;e6M&Z< z;2hwHKO(4trpU#V55K0y1Po73&M@Uk8JNz^;~gIsJ$%Wo?esgDSB3FhL0|H+h^g|) zK;73`MCz%%6P?(JL0q4E8FE7jpR2IwWx;r7%)YN@1o#Go*^%wgKk+wi0g5CouM6bx zu4g9`2I22GHesj{uKLMn!1xpnkR_a=rw?BaW1opMV&T-n}{-Of3LwMLE@_&f!OwnLn{KNq_`3le7V^8L#PK*sep7C+BB{MtP+VBUb} zrNDafbWJeTiqBiG=%rk(<9v|Te)|pjuf_3YKOm=ZNLT8jivwb3zR8ov!|2wMSMI3+ zXdh(-J%q3MGsD>g(-pnGy|7Wd%Tlyn2xzeg!g6rf&vQJOu-OxbwT0G<83|Tc4Z*$$ zS$0P*ZyyoCU@yvS&j^=F+|G8V&BzYEl1r5|NrELZ>Q%r?WVw-kcornwI*q`n{Fwhe zP!|Rq_NR{l0gp9#GY92@2MSDt+w{uHyE6)2T2jyXW@cv%9%|oKQU(yq?!*l>TI$w8 z#r+Z+^4O_DR?J?)u)c*H0i4`W0WBbkT$u#CmYSjCUA?`%pl15UB%j@`=H<3$90h66 z_tBnS@eVU=pdMyWEL`@>FdNXqevSKsBtaQNUeURbmY1{8FikyQ^aHh6-dmU2-$2ba z9*1;0F$wLsMoDl+s`!;$%V#w+VgeVqO;oD(82S10(sOANJ^|1VB`?qYso(?opENE&1c@S+X7S*mu22O8aa#Kr_#JC}SOo7A z2H;L3gt2dl+lfgTCSNR3a7lC|jPc;qO`Qn=qW&HDKspmHgL!qi~~ z#5qZ5UKv9vN?gGj5#Mi^t-vU#45F&qWTf(huEMd=EN!L;=voA$tA{BMbMH@bW?w!OBP_cp z!C**)YPPu822@d%oJ=<9Z7J&Cr@m>i%Bq_JaE%n;onkW9q!(R4zQ$I&A`dvG@ig*} zyLmb96q13nWs_GtKM!olnGZl?HgmTGhQ6Cjt%{f7kNLfW4)D-pX$b7}GW@bgkm!iB zB({Krn7t8yV#SO-_e$ll5zB%kV2r7*|Fu*+T_1~1&CEPEC)V`_j0<|Hgs*anUZyO3 zMQ#>AM?mz+PUNtd>uYp&qDM(+MdH3TtI~sA!6e413{|m@6OJ{s64g!~eg2bCTVmM7 z6C%HmSccd@mzI?yxFRf16bW6!pV@sjan`wVjGj!w;hu2vlI4Q7MH%b!pBseN{Lru< zwuQ~0;0|OH8cdFOs4M=#7<`kJgFD$><4Q{%iRFlA6ftLM-Sy3IBFk0PnN$^cYg<}Vd02S!6)H|B}$q=ATl$^XzyAX-EB3#-ft-gU%3 zyO{a#T`2zKLY=*VEpdvfJCI_{$w(~2=vEe@MjR1rFrH`WViGT?D<_BAz})82=4YW> z(D{cij;*$lX9slYH{A0P3LiCrHWA&uRAcBWD$o%zn>hoTb1o=r%}q_3(e@AjzF&MZ z%azlN*?dbrmU^VNzMjPLR09qMphm8tJ0N&$)tcAqZ}?-FqHVD1!A}q0NF^3;DR7z{ zrS=k!qnk^yF%6w|3OBw1@`U8EWuyugSbMz|58*S6$)+v=;E9)4PaBQ&u9PIg+2+Av zp#hp=`nK-?tKp1x1hUz9YV>TJz&_%n<_&VDp)#0;HOk;h0h)Go<((b?kTvvw05N7U z@i^?zIk6;SF_}FkiN|5Thh%y!E4ctKq9zW^nYJ6}EIaQ3Ln?ErzOb7f_l|p8YWfg> z+XV7uUXbl*yzePfWKl&tW};O!&b9|;_%g?@CEacR{u5fD>$kVNyF2c-CgokFRHkD; zF+rekVBSAooULL$yi->GaA~At)z*U~*fQC4JbsJ_-q`*+HA%pjZ}r#QApvBCy2rrJ zwtRL3;-ZPJaa?1wMCj%jtt|T`=;1;c$blOEb?`+dECv>rI(s|vOdoO+?@3IC&{W4V z;XiZ&KC@L2m@|qAELNicmMDaf8$cFJ7}X=A6?0R1iA^6I%1xAqQb@066$Pn6{wI}n z47TUFp$i;OhF=`Ba6E_{&cAxt7*me*IyJ+`yF7o#Oif~n^^l5LlE?0i3`8tRKj#D3 zSj4_@!w=qa^el{4!;(GBXAVfotmh=?kNbVm84<(wg0SnBb*Du6L@VNd2mUJOd>UG{ zKfvHH35>Gtb7JiU0M;s=DnAP>z6fhA8xT}0bc0Ice+S?YA#+|@T3U2`uvfIkXC-kZ z7ddUA9Si0R3+Ear8bvQn>)`XRRD>7C*QqZr{p;@}@S2!NRGm}&J@eDwg#2xwRbMye zuDbthcknnFO9OS=`AU1QI}g0Vp740KKF}OS;Br`9lQ8MoE#^ANDE$bZhi2Xb`q9*h zAm0l$;Ch<5z?%T5Gy<3qP>H;M+t}@}Nqsr;sa)DDhu4>;EaHzBEcx1TQk@BYcpt~5 z`Ccauz@gUN7G@*jt;?;)gN4uaLS8>|%xt?E(F*+FbeoTH73jps*)7Sp=2lP@Y?2k2V6QT^Kt0MhrU)A^tFS&t3o~kz0yZ- zJ6(tX+ zc}8iyGDAFU6q+=+Fgh_s4uJY)(&%jU)uhqtZW{`Y0tV|{+{wU)gFgO6lYX%Z1&XUe z6GCRgRft-j0Jwc(g#d&XZ@`8UK;u?tIP)j&q zx!BQE|7Cq}L!@*8w#()t3yfPj^+-#PeQM$}v8k8wH|Ui$z;hMN3CLa~4WV!tkYrYv znIx}}1INjm`8{yHD9jg_`9c6V-uS&i$s;_a*QyztO~m_D;{GV zFH+IrO*AR`%?IZ&zzs$|7D!f^z+(|3{Mf0qQw^PfXHUOUH<9-;O%?I%IN1Q2(=!``~^_8gUFX$s8`LQW_MaqgOBOnSu~}XKlw1 z-USl9j9Rz6*&YWXpQzQHGw&#m(q^9B-BP>S`JWinuO*i|%3Z}B|5#eeJaH-w^mJbq zb1l{_=W6sT<@yIWCT3>j0-z#oc5b|}`nr0g5BG>pyV&(ggO|(Aa>cv(3CH`F+%{pjeL5tn zr!;>&^$KD`#~#rezViU!8H*$JcT?>iJ{P`nR}XZX9>yJjyI0A=*k~c_CAN!jD)s!W zR*DX55grU1Bb?0H&c=)C0iv)K7EB+sT~g|eQ8+3sMKYS-&u!*s8Il;PaM1mh(e#$q z{bEX$%sRJ%NXmpq^@ZGni6ja_QpJ)aw0ulZQ#wl zrq%kPB;dI4BImbxikl*cP`~fiB31&wTRO<{%WOx!szHlY-PBTOt-IM_6~Z*lEZzn<`Z|g|>w|eAkxnLwJb0pzH=Wzx0%AY|_OyDTJ_RPlCMno=7U3i5FNM%YOt1HmA|YPjKS-M` zET$A1-@7>e33*ppfT7jM*toZ$8O3qwL6cD5;zKGEna4#YW{IAVi9ZQI%bb!?NDx)C zs<^S0Tu-YA@k_j{RncP`ztQNJS9D-4v{aL?-J0Gyes$^4%CZnXB6pyaW{n4>;7fI} zB_JngOGF*y7xxY*+)4Cf!We{>b9K@8BFTe~?!rF%>dbghf4X?CzsJeADDQN+{AIDJ zbpL1Mnifgx@eMGfZ3g76g#iAvjBk-zILx1li`J=d*{?3tuY!}eFnW2HydP5~0ZeVE zQTZoo91Z!SulCi7G>!CO$Dpmfz11@__VD`9W`Ce4%b2o8O)y>ldt;(wkwFG~HhN($ z7l$ib&z5p>+=7U*M2O=>2_J`?t$%D@yh0=iu1qkkFfS`780e^(?R7Ma|y!nOs2K@``kZeuu~p9U&mZxAc0 z*exXeHg&@x>9!x=DG2>(iYR6bBW~51DGykn0(-LPL6|W)1`uxR8S&yk&6cr|$g;Dh z>=hwEBy-$!6%Ufk(s6O&7a{UGq>dSgx?mNrdoyVDavW4nUZ`iAa_%9qyuLIl{VB#q zEmM>!DvjyMWSW)#n}bo4vYoBpa11AIjuMaC`Jd~^3#p%+9n%^4{-+F&%sQ8hY8<87 z-I_fPoldq!o#d{7_)8G2FUv5kHZ?Fk#^yGLR*t{fpfH63#DUEn!RInwgdJkTwxQ6) zmxjz_Obn?be2dKC^OXB6L8(AjBxH}c_M&0zFb7}gT-`JaW&G<&=T#gMoZ67GP9&Va z)y1+lF3iHc=d@2smT~oa84G4%{^Qqi`{&J&PmFVIQw9+9l!jI}>8Ty&x2~T^LM0qL zCtCYsza$6Z3s%-K0&-$@`iE_tS+Q%t2-Q8kxjpo^1{D+^HzwJ*KKUzR$d)$iS zK+gfma>7E*jy`Y%M^u16E4$6Z%cE(S2?YcjK2>v5%`wS*dFs7nuzpEm&>XZ}De<+&#bemzT@?15RvIc<4(IZI_t4Qt4nS4zc~m+djyAR4aYJoLNSDnYixLcCg^1wS;(+(5qO6-7Uv(I7+LKIeo6Fp|O`MY7p?WG+>6=ur z88rbqsiK5-3HvK>G2OWSl6>zOTKJM6s$e{3Z}MA%GZYxcH{vA0Fk)!{bfz@eC26IB z1DJ*%=s%#WA^vz$yFFq5@d}$8u)3V&T5N+@W?(Xh7JqR@5BC-+r`J0?s&XwRZ}fmr z+s7h4#$>s0xS7FHw6y}SdBM!9Vc-fCu1OtXz7t8z86k+ltuZDR#jLWIx!p9(=mUg7 zAM#$mmO3+VrAM;FUV?iE=|MF55W1gVzX{;51DgSQJv})v!-6k#?Cnc|J4=)qZ7^ox zbEzhj+9t-n$nZ5ZLha{yU+4xJ2MQHMW1|Sf-%T1sSm&=CipU-om{B8K2ttZtDf{<#Lj)t&Nn$L{bKx&04420atwJV*BM zaHse+|J^hsdNP-@=W?U9?lAV##qS{@Aq^!j9{@ewQ%-p6EG^wN554?am8=;6(R1wD zb%ZFPd``iNM-2Sn;$6mr%SkJO&R%iLHIWw+3&})K%n+~jh|UuWIeu9S*AM;WlT`3* zO>Y|~%a}+D&kB+UBaXE|f_Ntr3BJPN!AgNn(Vke{6ae-%m6o1C2&eLStD3nw$^yJj zjJL2F8bI6_G5t?&Xu|P_U?yHS4$dVRa)5cm>m26OVE^+4kEU z^q^2Bi#&%efL^dr>o;x2swCVN@!Xl;I}8Bcc+zBHB2m`JXs7gXo1CE)b*U`-!I5&| zUI^aTl0%bxQD3DLVC}BZZyOOGm?-=yxuaeYU|k;|14x&jut&Y6d#sbnm8AzgpeIA1 ztkdZ?3KV^#6p~@t<%uREo}R=E-Yh(pl}=AW;}FcB~|R#jW?<( zsQ8RqN{1vKPQVLubtY}kpZ0GEP}+{nJXRA-=N->8I2aJWh;UD$7`cZ90Yvfo9IHHB zE8I()BH{QSf=P4HuS864;ocD5RI}GlZDamof4m5nCou2w|4ad$R#hN_Nsj2AfD1&k zDM8*rWubV0f(iz(^dZD zwQqs;Wtpmx#qZ8PJMJCcYclML_Wlww&4r z;R_Q4jG(c1dt2E7;;#MxAW(S|c8Mnh+Xf4qZc*87F)CwkU4Kk_T~VP#CGDZ^?$53V zQ6Xfc$T~jYFlh7j0)D3%LY<&#Ed(4p+{7>P1pt!mSY^$TNG7lC(aK^!*ZFM}Hdv&J zC;7q;AX#SAJ?v~QPSog16irC zAb9r#fXrD>3WZQjn#%$pECa{`HK-VH8daLYh3=2N>m3gwmnMRTGG9}dwck=mHQfC< zJ9OL1a{J03G5_De;crJ%4~+c}<_}a;jCPBH`xA#`h2$_;3!<_V1G zZC0Me24M}d(4-h1y{%u%h`f~u<yH(-Ds-_ z^%PZEIf{{d4`_dd%~6!7=7WDAf2?fgak@>-1+wAIm@TkSD3fqu3FS&iT<%bnIjx}} z=f@29KTQ*MR#n3|aC6R1`6-qFigvS72)Oh?m`jDJJTt7dea7$X{e!l!fN6U|z$^w& zVN=o^qO$&IxZXCyM}g96eQO%xh+^X$q2;$Zl?)9%GP z|IQ_+!&2Gu{cZ4{Hm8$z6s#PGp|bc%E(JA$YZ3JTHZ9b!bl0*f$~-ooh8BQ7qiUaa zFatit@|erUlEH{ndXI!t+irubIR0cYtU%R&gUVSSkf zZ78*`U^w+<$syk!cpoQJYileL70VI7tI7I>c8iUo956&7mrdCe;-7xz@EZ}F?f$vt z<^jd|H#|wbR)=dd=c;$a1T)8F0QEhlP|$CemCH8`G=JQ>8`Y2`dr8}YlBW${1gPY3 zL#-Bdv3%VPtz@p9xyi#`WQ(zij~&eYp*~rwGaDi_Yp%Z;co{fnbYK0R$i7cxV@5;b z>&hh|NNH4POSHQMX1GnQ=Tm;|Z*KC3qGRoL+2hhA#P8S$=tyu=)e|DF+ZETt*7pOgH&)io zC!=D0+F0HPbo`Ds1p8vGM_^1{)V0RY8%6guI$L#TpcnqqNqaCU-7GW(<8Ts-1H-YF4s0adcU9x3yFA43lJyo)S z`}9*1(EZ0t_2B@QUuz9h&EW%P9_DO|raL)Sw_NlVHWi%{1U}tGNrE?U3h|%s$q@Cn zA5v%T?~vS~K5|6G_)qWhs<01MfsO^1xyG~UFpt+1yg8?gDMfEf&6tahN;!GyBwuaA-JWs~T-a7ml`!CXKdUjA8y8$e}g) zy{?`ywUT|RZBng6CXz&w>tGK1SXQ8I&x#kykb>9EnKaku@-pJ2N>4(ts&fw4Y?2E@ zYQ_ILb}_-WdeCt;;XqGhb@4#41&y~tJ>YB|;S@GqYaLLDdi>{H^;x!skj0g&M4;Xu zf~zlXhfOv_mE`{dYb7U2wgB=zJ22TifVBWh%>=oPbuuo4>dldrXBI{5N4f+7$mzZAa4FmnF7JD=? zDdDu4wT@nT+$)4S2m9i6{Sr^`*$vfWR$(T~pqR)2g**k{gO|FToSin zxMQpJcoQH_XSQGM+Wor~Ds*p~=yOOS|JDzDCfSrs($k~JK%MZrO`sstKxq4_W=xUQ z0r^VR@DM`tvXh__Rs1zCqnAXtO+^4o*Aka~$d&(0X}}<-v1=Ly2Em7HkyrIR(H4s9 zqRX{*<;@38c4;l9ZZyJqJT~J)iUIR)D#KE{qP-ei?lr(;9`l`0KCdwjoDz-91&n^j#+yJn` z20673TD#v$rO4DIBvY^9PNvyDjCH-+(zO1aK^R?%1#F{}N-(2dvAjSakQu1kKD+_l zv{RKxoD<mqzLO@?s z9m|#0SjY~Cv)eTkT58kM&rTbEL-~@yLVI`F^5a5NMtZg7V#QsTHk%PurLEqJF#v)(W{&MpQ*6iKuN_Wq(%x2`(Pii3-?>e~;Od#$}7~<4Yl&&eSOE&>O zTWbK`k&>iF`llQ1*NIB%xsGoBUG#}GR9|3}%x_L)fNQ;Xx@i(1v+ck12>u!V6j{^O z#zpz0FF}?kfqwlPGuzWS?lNt@#-uH5kusy^7xF5R-hmAjY=DgPKk^B)IVvMzH zYyyz5V;Q$-&&oP)3&jQ`XwY(uAyd6GQa6eCEa1(K`?O41i?-y`WW=9iGy0sQ%>! zCL8#RBi{xK3^wKX;=$O-)5C{FC|T^hLHpl$JXWlm9XwIHGUgCcbv~Z$H*T9e-g-Gh zt})}%G*NhC;kyim1IuB6tid2Fs=|NrJWaqzLsmihRr>B&+K^p`xeY#W2^hY86b?0m zT0zNyvfQ*3tI_x-EH^3Cu!=%mWr~uQBQoMq$fkZe;7}*`kCQYl&g{Ru3DYmwBMUCM zP>d#&esObw&6EPft-}sv$Pkvj$hcFkEaTEQUZx*Sq`>SdsSft`BLGkY!nejhkE|%J z{^br{+7!M0C9SUO)>Ni4U}pT&F+cpfo-niinqC_X%HEEu!Q#~K=RzLt%KaJ=@w5ro z=QNIE7Z$>9%NZ&dBv1Srf|kWNfcN`$;XG47Wqf9DkY0j6Cf5*#u48GnS*3>(_jlkg zy6Xhj)c3hj3h(~T5cKcIvM9+&qmUW_UnaZoz36e6chXc2M&)z=+5o@`;4 zw;;kL6O;wVx4$0rYi$d8v+NhRtw?7UB*VwMjMAHWhkNEH_XE!ah%9z8EW=m*CD3rG zomEwt8^@oncKQqwJgirWhFEpF0-0uNlqgwt5xxfBOK0~uJ0N>gAdHQoi_CPQeuWO~hD(t?91_ao7N%vZ+x0SD}H zrr|=lfNByw%}w983F${z#c(*&GC{V>)#gGJc+KuXGzd59oAYBqc|w zU{0WE*A~>9k09M#o8M1g0;W;--Z@mHhSKB*6=oHfL7D2z1iiX42j^?>XCGl5&eHS% zuT}$LWRJs6=jJF2-t5Xs#NG{ao5%b25F z05IFD{+;a~=Ka#Uv!$}MIQkF6VtE45q{`;tugX(b?BrrZ*{>u1;oFjr_y?fiz^&lW zDCa8IRX!w4!Yed=BB?Y4OaIqQ_VR&4>pm{BGS;{McE>8E!S)H>XrwlX?&&{`%$rKT zsh_i_?2;oy3h`sr3zgX|puEw{cF~*@AA|?f&<FppI($NG}Cj{Wm3oLLdC z(HZbXWQBw6q-*`}uO@(z~1+pUT`$SQ3aW3*JLr;WNl23}h z$aX?Q$o~K*>Dh0>8ovRTkCedehu66i=j-L7hxoGtG#@IbvdP;XHrS(_K2-RQurq-E zZ-e}*UT0%iNbwn$thxN7i12dndy7mZsmC$MLjP$dOXog&|A#{MrxR|Y;FS8d#~n&g z!pTS@E^j##NfX-4@?Kl^9Lcp@g=ag`=q|-9+c%{dnSC)T1a$_KIkb)=5Wq%q;5ps>q$MH!Ck|bK(6^klF;1I^7XVLQx%a6AQFa{540)==VQi)hC>W0`NaDNl^ zF%XHc#pzau?%p2u#L^%S99?-47V4eBy#enGCAk)2uOi(`0`+$0CRzD^2VcjGO3VIa z3eG-(>@MP>ZoMSi^G^0?l(_vm)_3@o)1r;Jag|;t5pGZ#mkIh0bV|dp@lBXFO$b53 zRj|z2JQQdd6hCkHaDg`*V1AeWgrpC?tg3?BOsKW`RGEac`UAr0!!sCcjzI@rvI_j# z%=-_8wUf=uUs2c9*S}P_}XvLl}qzVRm@@7AG`7 z2FgDAp5uJvltm1hBrr*!lV6mc*!41w9)SP<7})PebM~{A+6J8eu>Hf@FPSw%n;vYx z1_lzDd_ z?WoH%O7_XQk3VIAn%wzCMxU+MdCaS2LI*zQi@B@Nbt`%WYfeMznIU9QvQKj?=kb_i zH|A`jMZ;!_P|*4s4FM}b_VwuW?cF17a&@t4-aJu9pHqaJnf{IMzNjt^kYY36Mp@%c zOI7ox5l^4=17qmyEX#?S+<|_&?Ju1Z}BoIRE|hCHl-OwoImocg{3Rp zJsWHE6mQy1JV>v@7jB$ z>R)Kf|GDve=rNR1nS2)UpG8+wOG``Z7TZh1Vo{K=@q(OCT7WOXQ`c~;RDr2!6B!1heH=^VhTS@F_KP4Y;wVFEWC2Nfyi^{=G=*82vm^W1b{3!xaA zog@l{P!7=tBUfEXVg`182o#o>%CD{9b0*4R~k`pK(!3HzMYz#ZWQxD zHjcktx!YO-MlmB;99W}NXu&gr;Fk*k(l8^(^TPMGW}zV@EA&|BL*eY-;vf?$xpz#) zB$4jQTOJd6Gvr2!1*ndcdq@}OA?$jeLw|0=Yx$mqRWXl)<-PYli^Dtf6px+*jXbMU zP+nzlcTHzInvsJSK$5>?$$vJnV*r6**8Iq~caxTu{vA|oH7;y@YPQAL97UnKrGFaq{Y_$q}1U85XuEtx4^jpiO;Ks;~;zx04#=J}#@3xByR$RNwHH+~BnOOaG+OzbQI=W)MwkmcI}kGZooHIF?hj z4xRqyN9Uo3m6A~x6$Op={Ip+%#RmA51rbzr3Iwv29 zc~L!}a{|Y^fSYNvEyqJ6vF`iC@sj|iE=_a$o+VGiL&|Qwk|S2u`agioulCOaAtzHJ zK)h*^urX9~m2Nxnz=u>P;aF0x#nt^xIu;=00I14!8BlU>Lijl1xZ&_CM_59`9DR4w z5vQB!aJv0lFCgnDIyEWk`0F1X9fihYB3HSVN#NFGNByORRmk)-E&?ttOl%Gr8DS{a zvn932%;k1%EdA-xz#uPbG{$1t1MF%bty=A~=4ebJ6MDnF$=geSN|E!y7q2&o$OZkQ zr`HF^%0Pl4mJE__lm}*0naqjAIw`TU`<_ihZq!^2S!KH_tQJbRCkwWrWX6<#e;kgzi#yz%PcsQ!y~my6bX!eqxay&XByxQ%p2hR*t2PklT^; z1!|>9pJ+iLJ`I2j^B6Xx=Z;5XaIa8-5_RkZsJgh(rX-_cU1UA)Rw^g4rmYuaGG7|) z6>~ZB=c{{|+|M8v0Wqo=kfH7g{l;O$e!4(4yi=#qGWtRo)b6}F_{zY5B42-wZcsji zO<{?mOCcSOl@gpjo?RYr-TWV2or*hM#G?hX#2LEIJK0LlruAqf+86Ffp`m3%x0e-~CW~(zChkA+kSX*rk zD7|0k|5d-_~J6=(d|)dc0#kr%D>e#xz#e) z3O}Qg{dq*~v3R|1N_KLQMCKBDX7n}_^<=C0#MoVJ{J}nOKag*ASl6W1f)8oN*+vUCdkQIU7yBtR7ONqtB6bYdYivzaY0GD7(OvdVrnW_)k#agczu^u!LR zL#Y3W^kdL#0hT1+4^^nQ4J}=(`);KRc=i2U*@c++y&kWkTDA(BRLeYMqxwwE0yJY% z0c0yf2WGD}*n(iy9Cb#AfaoYMQLRXneNXW{)yKQTcGvM^$JZ~WaNaq)d{jHy<31~= zh@{mF@Y-ay=y3S<9(`@hs|%B$!W|TQ(MWP=&~kBvCpB80(Pi4<)xnDTI9xDPa@Ws7 z+swYQoabuWN#}+nCwCSA5 zXJOoMxD9?&W2AW@QVt*8*KlkrU^Hye^-8&(q`C6FpvKm4D3<+pcnfIpws>O`+m;C7sc2foI5eegroae-9Dfv*QdG?)HI=b zMn30<91914NKi!IcW_0syy0-Wv#-sn_X=7lcI?Hq=_-gnui#KwQz(&_LRefVFvDAHaaV1Uzhwwt-__ z*J2Ve63h%fzM~ekU>|w9LkuA@5#M*WT?jt>ylP@DyuD4I&cW8DKH^JjTJzw&0p7*q zA&O2X1YS5%_?X|;uK)c9w&>~hrk5zoiuRtp%^~2FpXXFBjcPxPnlhR};}^>;_7*6j zmbz>?TX{tFK3|`gd6dRdnPIFx&i+Q4&_ZJ_FeeeX>X7n6+D~F{1}J57i;h@* z6o_H^H>MoOdO-mlVeff<@YjvAd|HprU2VvJKL9aZ^GnF!CdweVp)CIB>+fck9 zI*n5wFx&|Hf@mq2V}NLmXQu!loW8Fy!bI35NIX#1P0+;lZU;{5|W>lzoNoFDk zZ^j{WcKnQyz8#Gm8S-PNdKirUjXswWS2CLB@0!-uR@&d>FxU`?UyVZOEeDo3bLniT zImg2XE*=)Nm5uJtH;+ZXxIULSRI|<4uIdDE{}KK*z&3ytZG2AF+F=V|8N&CQ9J!Xf zF=bId;=6jV>sH5onrC*Q$i+sV z^7efv{sL=j6g}orU=Q#nEF5@`U3h|hRwL62EU2hmjcj{l4q3D=rNEO&g2}FDjE83a zFV5aNtjc%W-&H^LJY$T{eaGx`+UOJuSuc`KHQQ^{rka0L-rL)2=lIC11*~BR z91dQxpBrPfS-1OhGUho+W$ z;?llx>$h&4c-bEs z(w+|VidjX>787fy+)!qg9d=#o2U>maQxm%F=0KnhVHl-UBrT53ByLREWY0!W|yvpiGR8sm00V-^|@Ru+YSv2zxo zUFOHDD@_IEeHWID0OyR)mJhH;0B4H*O$wVDGpZ}d!Gm_LrE#Wg7c&=?O4!@mr+p{f zoCR4iNu5x#I^0C=oJo-5VVVbVKbL)%gZyN>W9I}=z`zA1vnJnQvF~<|vC-g7jiGrp zegwvMzTZS}0O0=7S-F`yvCMn3MG55GrauQlCo5yd29RTqaQcAyh`3!{^|y~0z)gTS z1k$R7GRr{z@v^GXq885lYy+e=i)`i_qA4M8ZY+o%pWNEa?7e8Hq__c2E|bnIv08u= zCGV=T`_zvJ$s{dK0Z|n+IT03%4^j9PN~KPrdb}gI2R&{e*BST3muHCt8qN^lluaQS zi%otSxbp>A&|;GbBcU<^uqR1QulS&?I`*cI;uilXDts9LiOyb8oxGMh!_r0$V0SB@qRR?|%hU$clkxam*o_B~FMV|?y+2Y2^jz7tJOKuXNlDPy9H%@!SoM-bk1j0 z7D=eY1@?->VwRRW`q#+-PL7uSNiQrA1F0F#R9g8SHGo6?HRdUH8VuOWol`0+Lp}(< zPEa1YjN;7aeef38QAo?sZuq<(@ddaX=|}Q^UaCT!LC_Tz1h}TNUjW2Y71@IlD{^sr zHA{{49RtKClS6)CnhJZY-=)pY;=%50XpSP5!6u3%U8O2Zmu5Xz?f=ppcMNTg)~XX( zI!2f!oOKAu&{Qx{Bwefk51)D9okAf$wH|^lNR{^cWsg;G4b~LJY4bkIIv%OdJgEc` z;|F9;H~#1jfYH_kc2>R-4ta#IsU3d>Hr7$D=ILF3~I zST(jC5w-MFbaq|+bSPoU>}j2>FBII)*|(k)y*$?VSGH*mfM&>?|H0izm{V@LHpqn% zXzC#S{(%~dv?l$X>Ku5Z>UPHR=IApG34cgXi2lr$;7iM|e>MpkzP%G6Mu+09pxKL{ zQ{e6XI{Hr`c#$$_J{KkmOd&tksPMB@3S&kj?|Mz7Kp3A|@9T)9yVAp$N~Vr5|67=n zDwA5*8|pqz+3;lQ24?COhAJG_;gbGNtGRKsIa^Ua0I04 z^nWxF&^(W|hlnn&L3Q@#m6%9u36qTOK5T7X&f%5zHSCzC^#$fkEH3IjtQP|=7z}sH zD3VTbFU(mJgvj&;Ij2bShut0zOifO1<|(JA-5&+s+X4L4&bk%Z!IAoc?h~hTzb8&R z{sK-T0s?#ss%_7x-+nlS!xgpB54wfW4^n8GR(Ueoa@zk#Q*8|k(dn9%(W`mlZYpQM{_3=ovbD*Zjw^ZTooo^t-^sSt(o-HZtEKA+SYsFu!K3X@!0e63S9y zOBmPPu$buNBqqfyNJbJ6c3~oi$FoXXr>4R3gh(W8E-2%}>}a%&@Yl(0O2%-5B!5%F zIAr`OT7vbPqewc?yMvfS=TdyS=0q4rx|m%7Xc-m znmVw>0li%7Xf#N{(5ON+Bc^(qF)-c6lW}3k-MHQfosM+){l-S`}yj3Ynn&w7gn}TMLj2 z=s^d@RPf&z5^!HCW%o<|KppF>a!_D8=+5#-AAwc8S2T~OzwJ3YT(X@Y11$xnf6+XA z9o87O2c1K1ISe^w!h1F!7EyVhGxdn9Ll>eLxqyJg&y6sS^VjPcWcOF2(8hEk{Ov?_ z5054-9q@tL56~A3JgXh^lET6xZ~M*W{gsmno4$(h;R< zryp31b;-83KfDgljxL`WvuDNz^2aOTcRXxjfkilJpNm8Gsz(debB=4KpD|kTe zb`wkirJ_M>!sNA{U1h1rIS?(XLU&6D*SKEe@Qs`A`3RzgArzKY==dzcP1`3#GS7`R zgq#ir0SEm1%LEHsYeROtZM#wtKibT)r*euc>Rg>!o-3Z`6>tz3yd84a)Bn*fgDPa8k3=v2R%{e!8*F-tYIb>Lt%~ zgh4FY)n7t`!<dgGyA0^-}yz?D$ofCcgJook`ec&sq0!(@cpeQPNt0y7h*z`S^_%w0k<9iI*z zhe~zn+JbVtt2-oFOo%{dI0~2j1H9cQ9}9`@MUH>q1`{hYSuJJ>KnI69jbuK#o#zd< zrKP;%@w};}&|B*XhlpRUa8AR47RkWkwN7Z5Gg2sn$de?}1?}J$1jwr~S%FBa<<&P4 zz6K)-|E!UzLZPR62O3_QDDflkkZ0|(;$CQJE6*2i-y90mZ~FPwyp^Ew)mEd5rRFHM zc>B$7A_sB7&!?6}@Ycbp=rm-~xyJK$tSv{Xk*4IGO&LwkRJeTr2VoeLmzVcx+XDsW z3Tns3!9oz1#~{b57|%l+qD%pm4;3yhihyEv5+9teRNlRXwv3|QW{7I~K zE)TgwGd#m@D~LxVHBW~5gz55|4=glruO-4zD#xZU=q}$-IU0r66dfELY|t%ESZQHr z_gIoJ=1LE42UPzfcH7Yd+AYVgv`Dc49uA^Zf_M+sFxMx~7V!wPSgC<Ls3AA7wQR*A3 zmflUn?KhIV-RapO1{ecELPA!J-W#_kHxnBALaXnKZLgD|=UHBZ4VAS!LlU<0j3F9^ z7_SAUty*U1vckVN1`%0c)Z<`f1(GzGW0wk!tDyLJoIMVj*0^~b5ctbF+mR>Ek5rYI9j|E9YYDBc&yjn+muR;c?PfkV_ntV@sdDZ*sO_wOxuf0>w) z^85{ei8#^9$PZ%k7^Jd-K1Hd%9*(Am zG0Om~cr+GLCrvSw*5QGN;e8Zi^WD#lehd{=cSjVT3MSAu(k^0>uL4Ml;m$|#@u&%) zH20(H;f9WooCZco1_>(k%;H39$n9Ae5G$*FVM6N4F2Uz2dyoW#yx9;J7FaODBSYZP z&chlOQ4?pCftDx`*l#Jphy?9q&_AhL9MWfUTe0+VLy1Jj zH{!cMECwJ8RDXPgj1WD&J33M?hT$q`I-;Lsy^vumzR~k-iIJzf-I5l>X5eV` zqB9HUcLo@6V^`FU`hgemoQB9UHWoR6DhtL3UhEI9ugw64N8n!uuuj5n{;t@o60f$S zvkhX;$Ud$R28V&4Un;G#az$ghcQk2e3m6hS*j23bXX{lmgH)%97ruqhT74Ls`)cyv z;XTGs8hLcuB`&7rKJ0*yukiu!Y$HLA|raSRnK#)aKKjrPMO`GPh`t3UKYs&Y%))2$>6jhJ$@?Ha&&Z#~DC5jMsmwT7M6y>CBZYrvA;k7bKthr^{+> z^H+yWeX=RdzSRDF&yF34N`ixm8USzE&G-wmSoqSnvBGIV2N#{=!QtG2XxN4jefFs{ zW0dg6T-gdk4IoRy?Z4%Ql}2A(gH?t(0$0DBoR~T31e(})g`rkpccfS38QXV%LUncS zq!CbTv!nDKC$Ks?-PtK(u_LV728}+GLCE^r+1`A8OCE6Ex|*4g^HM>+=4&Ch6Nlww ze@ATxcQ?+b&ulOy87xU93;muQy_M)hd^P}1BH4(?F8&69G>sZ<|JwL4E%r||G{OF2 zLcw?BEROWr@s(RkkK`;%r#U%(oc2K!zR{OLhk8k!4RJ@?a1w3jw&w&KbO(mu%<&LE zRp_T=M(k=V@BxoDnF3)HPAj@n8HnVEQ1hnFN^kS#+7LI@4>>l30U1%kEJe&luu((U zt_A9)NrgIDF|rZtxK{Q0;gAEw@*L+_O>i5-*QrsDCHuzuLAq61DjcUn>6gfZzd`C9 z^g+!oQm-WZN?HB&M1dj<=1Y^ndCorjTIbh4*}zvW6gg<}p=wM`O6d4lL2TQsWAotD z4qCbYtUlIJ)Wr(3xG2pyHHj**IyRLU_J#ve66_ocB?jM!qE8<@4>r92%_SO1=>S}! z*Z2YqHOy?ILSeJ&U@au}$-luw!yy1n_`^A5NT_`RvLV0Ib^C)LeFz&3btZaFehEFo)1jx4D zS`Q2soCo707$Hjt8w$FvW;0T>IS+E`YCIAsJxQU(nQJd>GRi0mpHV6CoPMOrKLF>)8$n#ux zK-JAh_qKhbik497-}IyYcP#CABnmD`^cd?FhNc`_vV&YZZoS3}&90Ro;Ww@G5m`u~ zENsO1p7LI3UhSi7L%`zao*`YE?(z409=o`F#FR#h_F!Gt%gRoBt|F#AJM@tq+W{pk zI~Nb%Ax&LpgVI%eS~E|W-F2I@J3jRZ4ih!bkqz=_LlCH?3UVn(QyVVp?(CdNnHIU=KhPWv9-he-R37R={q za%ug(Ja;>Eddkt$E2a1%0S4aEXJJ~m)QBE!{G-3@X{hxg@4+oTan6pk%3uprIWNp~ z{@E6akB`lz%$43S8KDFexXyzN%aOOhAL+REK&0BB`X5{(zSw|&bBO?otj?6Yu|l}` z*-zU;rSo1%rv_>=I@aIkgKzidaU#XmLEx1=TFR+12X98r1At+@FLVCQDAKg}_QBqM zZfc(8?yR??(`?`za|nWg`7U(d zF7Li?xad7c@j=tOyZ2?8=uLUyJQoQc2)O+zJ}BZMXxQ^|w#O>9e7R)-P@gXYgUXqF z3kj9ig5zuRg%$P8I&mndOR44ia%9NOoXZ8*kkIg%g|4a0QV2bd$Aom&I#CZQ((7jR zL;s)Yy9ZC|cF30uwKRNztU4f9asI%Y)=m9j*P><$ws`S7dKcA2!$yD`_mTx24t_e41A8fR9fpAJqgOXgDp9#!(nc zjUfHJbTw-h0`_(*b$*}UpPf;#CN#ra0!=^US-=q-cYV2TULBs6El~$vBd^w2FW}B| z8zq*y{?fj=*26W@uet9zzp@T&JrcEbnM3YyD>-R*xmLbc9{Joz&W99nuHf6+$II^0 ze|k~J9CLf*+60k`vhQdPHzKA}a+rt!n=e%1EH9N4BQ!ECLEhYE{HttKPS}Oq<^(|t zPjyi3OKdzTv;nzg1kWC!Yv!`2Y)_wG#7{kci@Zs~+y+}Z9_Babk?6+3D?HQ%xb7M)A@=J*(X;Q4!U z;Q+@-G0oGuFe6Md!F|z_8816FubG(xP$qnuK;U3u)AUC~#(ag{ih$@d=+iB7`YrqI z&yaqW9#oxwpjcFROzEbbd4Zo-uy9+Sj8kCE;z^+>iTnv`mLTgu+5;C$Wu|Fupm$u} zPE9HS4)%Auk9SW>(KG4QHxHYh^qP&Q&(UxGD|LtS&n}}tDt06$ZSww0p!y0T+K8X| zN+}Dw+%|9Ss#GGy_}g{xh=6laRX~~swavpiBL}0+omp;v!Xs)g?AkIGXoeqRb`6mp zr;;VJ-+Sp1JymUz!ko48*0kogaxTcX-BFU<9)Rw4K3K-TR;WbDx~lP|N-|Z5$-+us z&~x^K5v#K+q4J>rB%E2-Mu4|3`$YvsJU$1Dyvr-()Q>aRb>sXO4-oF$Zi!H|3>$ZA;Eq2B8*p6I?5v?79C_@OYPeQ0|*eK!YqnDgcp~IaVJ8fS~M2X-$ z5q`JLS3C(qSz^Vd&GhRg4~wok4|_?-O$HwD0ey4}hRHvn2=CY^yg!L;)6>mFa3=@=k=M!MZ_j-|-_+c|<#w8%OGHsy7F3}mEG zVU}MWp4o5A?^^SG_x!(7SQb&IKEf)hDH1-b?ZxqQP`0Z@@_6=oWYvD*sA;%o?(4TG z+~Ti%n~{N0aw4vlr#|das4XDp@bDCT+qi#Na#dT14<;OAR92KfsYbpVIQ|cE79lxj ze^6dEhUC{zxdp_I+%k^{_=1ybt#vB@27eb~K*$+I0!S(w_4<7Xobj*cSA}EJ4`Lnu z;(n3(e{(2nth{XA9`@#QP#ij6Yj=b*h_F|n%}e;i27-|CraKDbmTqUQmc#glXi&mi ze{&jOVfZg<6_-4d2Nq^gp(=tZtJ3K;2J*bT&g=GXkb$tbHCs^fo>U>HW) zX*9HtZ+0qf$FM>Nriaipq_r%<26MH;?TpZI^eJ{rOBI9ssF#V^!q3#6P5|fzMz0bD zmYBt8wlgurkP#Ln4QIwDh+c3u;xS$W(mtvTqgR}aFKt0YjyPNOb)W_3>TPEG)!#jI zwKz%>JlgmG>#k9>+{rgW@AJTxHb}yWYcy)^eDky!$&@aCvGODy2nT3n>RGvboCkUT zIkh)xCyp8B&s4a{PM7^e=>!&9R-m|34viD6i}fb-ah^%~2L(zBNXCE)5wE24v{^q5 zzf6@b0dN`T|C#p-P(Xn6=>-T9f?1MjXHWM#m2l@I_FsdRF4)iFPr=+Z>S?guKr|Dh z3ygAr5-NgwL}C$!qO#F?#9s&~q$(Dq9vK7H3(Xy50;4;wGL%f7s%xEJF~meA`*Oad zf=A=(x~gy^`OPx&lbzR;w@g>2oqiV)CYeAL79ar}a=GQw&DFd@zCO)*UQ zm?*<*)_s%n88`ak6P5Q=5+-X&xMf^sqX^ z;W*#Hk4E0L1OnYdt`y2v69wy|M;CmIlC_1sC`Io1AHj`)nx z^yj}aa986DbUJ0;=P9GYGfUs*C(riPtbY_1qQ8S4ZD*TOra`-7(%5wYx1>`+unrA8 z*43VeS#_E*V6~WA-w zuQpVZ=5SufjZI60eDv9{AnIODoDk!TCW5N~MwD8-9K;{6gaHjkPl}#dIS#pni_i1M z`QajA?F~A2%J3)ru zI@&RK0k{tEDjLCPoGxqC^L2JvikEHsmBRbigL}x)&L_JEdx=%4)1*Ed?Wlf}k%6QF z6O8$fO5|~tBKM1xK%$UALkmjv{c-dpEgii6<|d&9P;t9E-#ATqj!p2zmb~>?@1=BF z5)p&Up@YKNpvB|QLd96B>#UJk3O`i0VW{|SVqpc|BMS4lr3y}U8$l!X%aOiQ_m$B3 zCgb-LJ7`OqK5bpmyRwv*F|zO1*g~QH2|g%hmju2Ww1FSx+ib2`h&>Ix+|E zGKJSwv#s%p$Ck`4*(?nP0CfCw#B>4LUak!df2)P&dqhXAbRQxmjuT%>u$3ua{*I47 zHO31E{Uust3FS3-$#?4997_8MqNK-sf8N`|Ke*Y%Sfz2YpkSzvUJ^78^%M`G&QVCT zz&z}40Jj+Rfb8(9RtVbs_b`3OL;sNYvooJ+nxCgKweEXYzZLzKBP}m6kEZFMu4a&j^)j!C1ww?DI1Qd!tF zf9tRJ0XxS32?HWjtxuFpIsUFIh5&Cw;R;WTr-_60OP+1>+f5V6UTY7#GPhyoo$+p0)S4eohTqw(e%mH-!y0pTRQ{guk+0Z$c4%Xh4nr zDCtPzPl9LqlyuV3;dBx{)8M4>>K%mu zZct!q{ql6h?A{(-fcPUBGFtDJ>6UYY*M;5ilW~Aw;Tryc7D?{mu3MWh9!SKM+mIvA z==Hw6%?}wJB#D4WYRoB<*GQx`;4U5~wO~TUWw4B?q?YP4Q4UGuFM+`qVT+W4C@2h& zph*u#$H&e?ud-x*&JfYM47O$umgWR+LHfs<#ZI^w0)(J)`2tLjPioz%T33>e; z>wPiyljrQ(q&xiklOlHpH|}d=O#+(egR2~jKp&8c>bklNJ|4NH`XX z-d%-0sR$e87Ny6ZG_+U&Sl_pAqE@Dy7I2r&4i>O;x7h_|*%?uV1=`=Jq~X6sF>V@( zi<4B4Z(^;k2H-xdv`XZ9I6HYzD)9`$r>hIPmi=d0#9xiF)&q?U86r#R6S(y)Er&Fk zkK>#H**j#A4`kSXdViwvab`g1wR=Y`Y9hFS7y@_#H-87%D$I@klegP42NM*qbopVLSUkn3p}&d zoj)fkH4~PrZuji;?QJUX)hTbUJOoWwk=vp?7Knp=BluKffud(dZ% zFNReyMp#ILR9G^rBF^T8w;CoeC~-qu-3MmpCBN)d&cq*Dsy+SRm;`v)ScnhQomY%O z88k6DrFEO%oZWPhe)r8wQq)=fnXM8?YJ5=S8n08}+rO{j&w~8GR<Q5`wDjC7@tMuBBK80+0<}4D(WE@JuLs>*^?a;?`EMf5ve@3VM9R&Fys8|p$gy&6-j)uePrWhdg{gT$!pWO{Q*b8th zvJpXifrmLr98ViIf(W|WM+OELb9wM!Zxh46^^T$~8h{ou5ZFARRxCSl{)Jk3sPVzCw17HGXd6=Qn6`%o zsV7m^%vg|o%{uWwYnPe*di>z9O+Xz3rzoY<*PVs*^-#ye_mZ+A#bBfEi98@VXeqGr zgvqUKqwCu2osk{%Mk!5kp=rTmz$e;=3pkNHYmWak7{EP@G{e_m&hCpRV`RCK^h~11 z^mW{tFcp#HGN0I7aa1eIf3-u&>8JHRlBFuBd<^*1Zb&?nLe!Dm{r{Pk@?GH_4vvIH z%V!l`0J?~VNM91loJrrP#6$Cwy_{1f4wOVfwLjR4E(3)=AAocXZv(@xm<4n1SI3Kk z;`0DS_A5Q67*o485cGpG{1b6My!xG>L#zUj-p?Q5{G1Lq8&JYwrY8AU)3f#JKcY~A zLPEOn-?f-gH?KxDcPk4+AO{Gxcy# zwJCjs(EfuBG5UiQE&mR?l}dU|TJLf2`qnfN$XptJWPZtXNeA`nCF%$~G2I&EhXUis zLk*Ano0hB@&9Bmx5z?1)5j~3PmwNHYJ#FNvtz&r7j_{P%A^O3q9?Ek9uUjqhf#j_S z0^$N2P?RL|xTO`^<~Pp%?hv^HNX5Fnmg~!-i^KaR^4bxTxk<%?JGVo6*ykORJ2&Yx zuazHWy!GifrYA6O#Eq`4*Z0(sf%w`)G)8lP@@BeRu-28%JbdpE`OK$Rs8A*ps>uC-lB;zUnbN z#0O^RnTLAEb8g{o?63}0c6VTBFm_MKoegBC} z@7W@JC^FF6Ih}&aX<>b+VcF4;==y4MN_6dRwe*e>pDzLrd!1@abDigg^%SmrRsw(1 zGc3B1A_BkYSd>`OJWg4-Bfsw{KG`~P_tHVZ+KMM6yvN0QAwaOAb9F9tv99y+hWvg# zVb$aIeom-Cvmv4|Vpz0U$sLCe9-h)^@pg5bN>xFxwZJ)FDyu&PD;*N+z5E#JOriQH z*cSRqO57U>VML8v0wGE+f1Ck>kw)4;yg4?AoAEhAFfMNN?|hE(J-4;ez0R|lLED3y znkg-_v%0O>t=aSXlZ1$~sX>5d9oBnDiEz4$9+k^>w^n6oecG-_odA_1^&Xc zdiKLC&w~MpB%WuBoRt6LqtYgB9X`XWIm0;QLWhf~bnfTXYXPaL(muy99YNCKpuC2g zUA+*@I}TfxN20C%=8l?sNTHCN)zltQGV)9Np_ON%pN8og+Wh=AU&wv>wDYQ#c1$8E z6RV5*#u!!WZpDfCuH5b-m>f3+`L7RVW0nJL`jXqxR;KA+wYvsO8*rXqAbVVn?^d1{p!ID zM+dbmED`-3!DBsDJ9Po7WGQ33ySLvqe(inGM_>15(=yONsO(qx+-ZeWzIRKTlcUJu z5Oa_*IfkGKqi3~f2$}IMSt7r0V+*K4K<~KvlKbS2f?1dW$I#Hw{)WN&^Bvn$ujhD^ zR;4XOsmCp;DRA)59a3`H9%oxvS%mMqBr>xUmJz}_Q6uBJ=E-s6++id@?9B9}=CF?I z>N6B20YQ`Q*lea`JOR_4_bNaSm4qxg^**#s|7K#V{p9}6NL5qAmrb5t5i)K!uubJJ zjDkqMYrrSlsnC(f^Ji5D&kFgIL9@2s6CeAexBrE>qj)FXz>ex0*xizE#b$+Qx8 z%PpdDq=#R48=(yWH%JoXC0}f)5Ir1F0gGjV7!Lm&G8N+IM{Uu-&tk#(e1o6GdUEzd zr}U#K#L}B7jRr#c75NvUJHD~%5x8ClGhS$U>AIJ-8Uec+qOPLvOBl|B^NZ9E7Kl6< z133nX!@hEc$cDwpKp7xQ(@gs0JqK!uJjzYoHv}|H3U{SS9_9Q7AxBl=lt~&Xj~C%xwE^{x;bW>C$PEe+=P62e~{6V zkoSC+%tf6yzFJOxPT4q`g_-$T(5rCKV)0W84B$No$_n(mKD^Iyayn?N?Y&69s4~20 zC)b@fGS|O8WU_tpGRshiHA*t+_#(etofU8U%1Ci2Ga|w7{`E!LVTv%%`G$r*y4&G2 z4lly{wgKkmHELP>4l~gcvng5G8+Mp>$8?2IAUI$kH%7ROI?P#9KE3H(ZuYp|CeCam zzO3AJh3%n>u9GEvL<;-K`WIQ*rJ`VMW4XoXtjtwO(Dzx9l7+=9Y=d|XSLf~D zlmQfDQr!#*lEwM?`I=leuCSL(zr4$VbtuSvS8UU|6UJPm+wj?uVaI-Qc{C&>M9bLI zvsvWRs+43AK2u+cu**;Fl*bzHNTo?P(+r5Y_j#*Pv^EXA~DbLj+e`^*D60R&8t}z8cBM8cHUDgER|~h zvs>6P(v|bEuKe@>{&C?foNHGOf|)L057GK2(;Xc~clw+X0<49*T*nm13Dp8rJikOb zN2!b)saFb$Dd#WA6lQ@RUjwC z%ZlSJA|TnevDUQH4Au3ciWV(x=OYSPiIU2(+v)xs!9LI8N*Q4fxrR#4c>FPE-q~(^ z`VtZH`8Uk()J~1|ChN+!sv&`rfsxruIZqeHtmjIAh-N_Mas1@O2pT|E=umWqxG|rX z0HzVGBSr(yYDG@mix+@ordi&qDmKc3plJ*^ZmbCOp%AZ+8u|PX=3-K{{`Z2C>MS{V z1h;#|lYe8{e_lg#k!Qo{l1&k*RwqP?9xe-I`r6pEw1pxbCrHB{>$;Dz-iG+_Z|CBL z=}hotB=XWhLhn%-N3s^p`q#iA2sh`Q3||yK%b$J5<%vLZX=&*$SMh5w11PuSbPY0a zN}K7D`_mlAFdzGOh0EuKV9#_>T%3Gz{k+}7cOtB9@6S~9T@KBgNkB8Pd9sns37Gz@ zRz4DCk$^h4ex+WJY~QV0G;hnn!^6|StfcT;Ag%X~eG%@~@7uon6B|y&x#t0~)j?S~ zTJ0|fFYja}e0y_IqysMCE05~d8mM&s@&4|1Wx36-@15!CTbSVttD-T%;}0CeU$i2j zp4_{gboxcQzd}NOh43}c1kAn1r6wvadVhWPhq)>x6K@;(JgYm+%FjNWL{2? zvkVrG;cNs{LU`~Ic@xu@QsJ?Hw~hw}(p|ZTOMeLN>oCMThd;#P3n`@Yf1)bRqjge? z7?T@5neRXnI%n5q(nF7VcG#54jse^|yf`Q3hiNa|-Su(qt_DbKSKou*iHYzPn>Dxa zx1@Tf^|8_ZoF6HqU0>b2vp&IysNF*QgewwrsPAG_i$l&`ct#L;eB#1xkP_?=_4^USpmviA|T>&7|0HIw>fimXwHI_CP7r8xT% z3_B*ftRfzHZptPfAudgQku@g2WKxE7kk|%-rv?U6y^jO3*IzT_kt&=?j82P{uqnGk zmyOYJkxt6eM`PWG?5TKDk7Nn8gZ%NVJ{%1R9X_l6FvID*?6Xw2&Cj)UiV40+XQQuJcpC}YN@LETBNv=;88k+9!K4Ph zig1oBc60!FqWQDHT2H+8`yiF~L~S`}XaDu*h}+QBFKorf%iwRz$rC>d4_K4e4l36w z#5gO!$pt@S5^<9L=blB9>CbN7YQnv%jGdeJ#o)Td+k5OQFYxmv=yp(QI6ycukLNpZ z@s_M78QFV!K10CYWSk^9IXUU$AD!>;_xGT1gl`d}oo5XWM8yc4W>5)QM>% ztoWFMO{4*C&i5=F`t1g+9eK}LYN)AwU@aS7`8eI|aJ=4^DQ=Q-1lw4-X%5^JXHTxm z{ZfQent~-}zj@oEobGwpY*ms3dHBx|gm9S+$#glM<$x*c(`S^tmf>K&4pSsWQRv3G zhR#ly3Chb)#!Eo?6LL&tu_!%PJK;SE2}_ca0pQvQL4O>wJ^o{CARnhUNkg06EL^LJ^USBq;-ps?^BkmB*bJ%pgh_CKidwp=Ie=*(D zd`@0to8H2NsS(ijUFOxpn~up`ghQt!?eBP%L!jq;7YKFRFYh9;sWt3ngb>P(^a~~= zxGHA_YHGWnm)lr;D{(U?cs%G?JhVD$>C3m^@RsVX9bK7C*pXU-gUJYeqU9nT0!V;0J_4`HV|Kw-dZcXJIoj?e= z%|Y#21TNpFKUGthCH1=nZS(W<-hE@(e&#Oa7dHnB4d*xA@htXE($xDUZ&XxNR(@A^ z*h-axkN_*c_fG(0lC3S?^P)d^4(x<)2;{91{W{=Q(O`;Xj zIsz9f`JD_N063r5uh{!sWVJUeFAOT(mqf8S4mzP{+?RQ6**C7;k*|w9cCOY16^RN* zvhI3;xN+3&#PrjUNP1qUeK6Ft=g?^TFyM6JE6IqUU}VzRA;#g8b`$@XFY zSgk8Pek!gA6%GvLbkT)l0I}T**l(3A#Sp8*e`NA|nDtIpR7eZ9&>^7lImG|>6Uhit zt#1JdWWm@M(&F?blt`;hl~tPVN!%eXzWGpxeBD!}HKz3?j&4#GI7@4a@O{`t>$Jx;UcqcbR1Usq~jb#WH)Z9;Vw4%Ijz;YStrEE z<*lH(>r9*pH)_Das|New5Yz46)5JtRXV2bY5e9r}x+<>GFU^N#Y6Ko^DbzxBaZt;|Pw)|Dw>TE#`o4rsl8zKRD_mTaMT8=1|S?|36cueQCHS-Bt_ z0-ISx3H8A$+Ps=N4tS^?J;$K;f$3IFY}MH)idJF_)pNDN6=(aT1Yv1H()nV&W zG7WN7*6YIn2VtD_v;#}i5}CPbGJV-dF#EGs-ia!{AdoxHZL|C{-QSwPv6GtL^aE-s z`-u1k`y{Z}(Ln%XCWM`_lJ}}2fKURdOq(gxLFN3J){?S3OQ@cig(G@*DJk44N7vOz z<~ii&s_(Qnf{_pZdh)c#OJly2tce+fpp#ziZv=aEf29TN$f~Rv`7P%ur!E_xs{Q+9tYJ;NmvS0CL zW=TH|ewY7Tp*kMXo#R{%#;lxc**i68vm8R}7lh8<+UHPHn;me)xX6f>aXHDAz!qfyK)f=H+@_`4@ zLluK~}N@1&XbS*I7}HIucmK_)~8v%GM8#<3L3fOBxCoN z27kqOpyhyEm;CWy{4O(^p!AZx+-<5zM&oxVW6qjZkyY8bh=)F=yo&y|t8p4~sX^Xj zj7*wC3v-LDkHd&P6UVLsa!S?nRsBH@^v~d9=OtIWxekR@J{A|=`tqfviX~M=&kt#d zJ^oZ2HpPz4RhO%aT3?MijUX4#f3>KDv7zU=2|o+&`-va#*vyo^^jiXdYI-{ZYAMeV zi+}#H-@cP$SY^m%C@D#i6y#Z_R1Lhn&=jjDTb{P|6*^|@7!{~y)24dZ9A4Y!oXC#8 ztcmP~JtDi5aQC2xEIPJCHkS_5Ojp8=mZl`Ps)gBPS)z&?Y3t(Nxay1Eb2naJzr4{B zEFAgcc3zm18b2(WCc;v3`8Mr6-cr@kd_s*{^DJqZaA}T5vH$tR_Lb|b*+t>+C!|%e zKkNNcnf`|q^@Q?cK@nu`1 zaR!&;Ro_0Tjnv9_b5(LEQnWpp=I+-PWE)wAE;r|x?r5iZz~qy&&McVXvK(GEUfT6$ zxz1(fSnL^^n(Qz%g=L^c zc6WKq`6|awLo!{#y{`F2l<2G~PWY>OY!krZdF>U~v=`Sb5;Om57K}|ByB)aUb3k=W zKUgj-ZJu59IA7SAg=rGAaI-S87GD=I2&@YE$7Q{V8Kp|a)re423_)kPJe#xSt2?Sx zD_~~##*_J-7*U`1^>&}yYTDm#E5)p$e5A@eD!~1759Y|3M5Q+N>x$6$?a=tGt}Pr7 z`L~zMEa=KpCuT1AWCK~d+k1u^ngz=Gf^249OUKq5mP@b6ZPNl2jSZLL5}Hc0MiZPX z9m^f02ga&yu3R-|u6b8X-$hpiZY)h{|Ham2TT&&~E^%h=`>9r4EFWyE9T1mup;9mU z?TpM#K+fh;FxB|or}4)3OJtQk*}hKNIq#ropJ3s-mu+8$*Vg3Zf|I7`^MiPqiejNG zY4=ZHm(9mEG$OK~};^TL*#`w|_Zm712BiC1&N44MZf#(lgL2rZ#vv+a^9<}>D!%SYk z0WLv3s%%PMx;?{rQeHC@ZRI|hb24DNr@LMs$?(3f?`Q=6<7w$MrS|9EKf$L*xs}!K zcg2zi3_%*#*q7&&dUh_x)^Z!i^L_NMWa^R0X>*vr=_#!$|Cw8QOGZlq&oo;VD&^u) zHM62OnVlRZ{h|MXL~`i`i!xE=M#fUVynFEb^c4QBh3&baCD~-R_p@HUW*z1?W!D-S z5gM8v+v==U{R1U8%fS{BJmG4EDVF_^jyU%2!+33**O+_({B;o)V?*UAqG+$nSs4&` z`C1QpPKv?<>qaFv0$I0QIx{9j`cXOx(?W_aA zxwysmjBCyBtG_1weyR~L;Y7q5?&WOV%??b9`9Y`F--I zy{Vm6xrbKli-%y_?dz^R#R` zlAP`Nr1DC#n?@d14wgr?1zYx{_Bsh(b{wtj`*`>AP+9pq9@x4}dMEb#j|vH6XN*TF zDj(7?2_wO!_NLBl?3Rg_=uA|3`MvV$V{#gh@4$frY13FfI=^}B6#3KWgN~ERxcA@|L^4t!PK|mhJhNRDP-cwya5*CY{pwqvfr{qwd*!+_&ZV@-MbcOp_OR#dkW) z?|&>$iO)=b)%P{6+)MeiT0!Z4sSW0O*!DE?tkmxM__g0tDUE_S!v$ci->2WdFhfeF zb3=vmKJ~_0SouM@JS8X`yRM`E#fo?FS)7|LX7{{w3@f9P1AFxMEiHRp%2!Iu^Ab;% z4}ag@v-y2}`tnVZL8;z8pO=s1TcYoIE1j3hDZPVIUOnrRy`?qj=;cr<&%Zk_f6vRL zci;D(eccM@p(N8jS^M@?daot<`}%ts`MUdeTjI^i$CvMA(kGWv{rtCNf4+^la>Jx@ z+Ja6g=^=Z6Oj-32@R>{JZPt>Gp}yxK^e74Y%nCb9P%1r@pZGE4YWarXg)|~uf8A5h z5n3hMrI+UT>HUN7GViPJgnXs<-S_^d;>Eq!Fe%?8daLj=v5l^BukXE1Qud*p+>S!2 zUG}}h679lyv3x7j!h5#qii+H%2?aiVeWv{eir>FW-}{~Py*K-;gyKUoxv4!}y2jma za$mG@ebQz;!oCa1_s^U0s8`$gLr)spT@6;?r7GEHjWa!c-F^B#G^4?9Is15>Cgl%4 z2E}#HEo(V_GeOQu6Q(G;b@FTc{SpnIKDhVVm#*)9JB;vOXlre$9JRw>{+@H^TxedYDR^4h0BMXSKuSecSV>;6qk=gsIS(U|p7N^k3C(yXeeOZh`V7NxrS z_T$T6txWsg+WtQ$YgKu^M(Ft>3T4{z#`tMQ$Kb*QnNO_W8ovLw@B8nAmAS?L16z&t UNqf6rvH$=807*qoM6N<$f+M8;6#xJL literal 0 HcmV?d00001 diff --git a/semantic-layer/nested-and-repeated-columns.mdx b/semantic-layer/nested-and-repeated-columns.mdx index 21665179..5d807ff2 100644 --- a/semantic-layer/nested-and-repeated-columns.mdx +++ b/semantic-layer/nested-and-repeated-columns.mdx @@ -1,219 +1,103 @@ --- title: "Nested and repeated columns" -description: "Define BigQuery STRUCT and ARRAY fields in the Lightdash semantic layer" -doc-type: reference +description: "Expose STRUCT and ARRAY values as fields in Lightdash" tag: "Beta" --- - Beta Available for BigQuery projects. On Lightdash Cloud, ask Lightdash support to enable it for your organization. For self-hosted deployments, see [Deploy and generate](#deploy-and-generate). [What Beta means](/support/feature-maturity-levels). + Beta Available for BigQuery projects. On Lightdash Cloud, ask Lightdash support to enable it for your organization. On self-hosted deployments, add `unnest-repeated-columns` to `LIGHTDASH_ENABLE_FEATURE_FLAGS`; see [Feature flags](/self-host/customize-deployment/environment-variables#feature-flags). [What Beta means](/support/feature-maturity-levels). -BigQuery columns can contain non-repeated `RECORD` values (`STRUCT`), repeated records (`ARRAY`), or repeated scalar values (`ARRAY`). Define record leaves with dotted column names in dbt YAML. Lightdash keeps leaves from non-repeated records on the model and exposes repeated values as virtual tables joined with `UNNEST`. +Columns can store records and arrays. Lightdash turns their contents into fields, so users can explore them without writing `UNNEST` queries. -Use [How column shapes map to fields](#how-column-shapes-map-to-fields) for a visual overview and [Define nested columns in YAML](#define-nested-columns-in-yaml) for the complete configuration. Refer to [Virtual tables](#virtual-tables), [Query behavior and grain](#query-behavior-and-grain), [Query warnings](#query-warnings), [Pre-aggregates](#pre-aggregates), and [Known limitations](#known-limitations) as needed. +## Supported types -## How column shapes map to fields +| Column type | Example | What Lightdash creates | +| --- | --- | --- | +| `STRUCT` or non-repeated `RECORD` | `customer.address.city` | An ordinary dimension on the model | +| `ARRAY` or repeated `RECORD` | `line_items.sku` | A separate group in the Explore, queried at one row per array element | +| `ARRAY` | `tags` as `ARRAY` | A separate group in the Explore with `value` and `offset` dimensions | -### Non-repeated RECORD (`STRUCT`) +For records, add each leaf you want to expose. For an array of scalar values, add the array column itself. -A leaf below a non-repeated record is an ordinary dimension on the model with its dotted name. In this `orders` model, `- name: customer.address.city` exposes only the `city` leaf. Add separate entries for `customer.customer_id`, `customer.name`, or `customer.address.street` if you also want them as fields. +## From your warehouse to Lightdash - - Orders table with a customer record containing an address record, mapped to the dotted YAML column customer.address.city - +Imagine an `orders` table with one row per order. -The `customer.address.city` dimension has the SQL path `orders.customer.address.city` and the field ID `orders_customer__address__city`. Lightdash gets its type from the warehouse catalog, so `meta.dimension.type` is optional. An explicitly declared type takes precedence over the catalog type. +Add the full path of each field you want to expose to your dbt YAML. Lightdash reads the type and structure from your warehouse, so you do not need to describe the nesting in YAML. -### REPEATED RECORD (`ARRAY`) + + + **In your warehouse** -A repeated column with at least one listed leaf becomes a virtual table. In this `orders` model, `line_items.sku` becomes the `sku` dimension on `orders__line_items`. The `price` leaf is not exposed because it is not listed in YAML. + + Orders table with a nested customer record, repeated line item records, and repeated scalar tags, each with an array offset + + + + **In your semantic layer** - - Orders table with three line item records and their array positions, mapped to line_items and line_items.sku entries in YAML - - -The `- name: line_items` container entry is optional. Include it when you want to set the virtual table's `description` or `meta.dimension.label`. Every virtual table also gets an `offset` dimension for the array position, so this example exposes `sku` and `offset` on `orders__line_items`. - -### Repeated scalar values (`ARRAY`) - -An array of scalars has no leaves to list. Add the array column itself to dbt YAML. For example, if the `orders` model has a `tags` column with the type `ARRAY`, add: - -```yaml -columns: - - name: tags -``` - -Lightdash creates the `orders__tags` virtual table with a string dimension named `value` and the number dimension `offset`. Reference the value as `orders__tags.value` in filters and pre-aggregates or as `${orders__tags.value}` in custom SQL. - -## Define nested columns in YAML - -Add one YAML entry for each record leaf or scalar array you want to expose. Write a leaf's full path from the top-level column, separating each level with a dot—for example, `customer.address.city`. Lightdash gets the structure from your BigQuery table, so you do not need to specify whether each level is a `STRUCT` or `ARRAY` in YAML. - -Only record leaves and scalar arrays listed in YAML become fields. The example below extends the `orders` model from the diagrams by exposing `line_items.price` and the `tags` scalar array. The warehouse table has one row per order, a `customer` record, a repeated `line_items` record, and a `tags` scalar array: - - -```yaml dbt v1.10+ and Fusion -models: - - name: orders - config: - meta: - primary_key: order_id - columns: - - name: order_id - - name: status - # Non-repeated RECORD leaf: an ordinary dotted dimension on orders - - name: customer.address.city - # Optional metadata for the orders__line_items virtual table - - name: line_items - description: One row per item in the order - # Leaves below the REPEATED RECORD belong to orders__line_items - - name: line_items.sku - - name: line_items.price + + ```yaml dbt v1.10+ and Fusion + models: + - name: orders config: meta: - metrics: - total_revenue: - type: sum - # A repeated scalar becomes the value dimension on orders__tags - - name: tags -``` - -```yaml dbt v1.9 and earlier -models: - - name: orders - meta: - primary_key: order_id - columns: - - name: order_id - - name: status - # Non-repeated RECORD leaf: an ordinary dotted dimension on orders - - name: customer.address.city - # Optional metadata for the orders__line_items virtual table - - name: line_items - description: One row per item in the order - # Leaves below the REPEATED RECORD belong to orders__line_items - - name: line_items.sku - - name: line_items.price + primary_key: order_id + columns: + - name: order_id + - name: customer.address.city + - name: line_items.sku + - name: line_items.price + - name: tags + ``` + + ```yaml dbt v1.9 and earlier + models: + - name: orders meta: - metrics: - total_revenue: - type: sum - # A repeated scalar becomes the value dimension on orders__tags - - name: tags -``` - - -See [Deploy and generate](#deploy-and-generate) for how `lightdash generate` handles nested and repeated columns. - -## Virtual tables - -A repeated record becomes a virtual table when at least one of its leaves is listed in YAML. A scalar array becomes a virtual table when the array column itself is listed. Lightdash joins each virtual table with `UNNEST`. - -A leaf belongs to the virtual table of its deepest repeated ancestor. For example, `line_items.sku` becomes the `sku` dimension on `orders__line_items`. There is no nesting-depth limit: if each line item also contains a repeated `discounts` record, `line_items.discounts.code` belongs to `orders__line_items__discounts`. - -### Names and field references - -- **Table name:** `__`. Nested virtual-table names continue the chain, as in `orders__line_items__discounts`. The separator is two underscores. -- **Sidebar label:** `: `. A nested label continues the chain, as in `Orders: Line items: Discounts`. -- **Field ID:** `_`, as in `orders__line_items_sku`. -- **YAML reference:** use the virtual-table name as the table prefix. For example, use `${orders__line_items.price}` in metric SQL and `orders__line_items.sku` in filters and pre-aggregates. - -Every virtual table also has a number dimension named `offset`, which is the element's zero-based position in its array. - -If a generated virtual-table name clashes with any other table in the Explore, that Explore fails to compile and the error names the conflicting table. - -### Join behavior - -Lightdash joins a virtual table with a left join and `ON TRUE`. The relationship is one-to-many, so a parent with an empty or `NULL` array keeps its row with `NULL` leaf values. A virtual table has no primary key and cannot declare one; its grain is the parent row multiplied by the array element. - -When a model is joined into another Explore under an alias, or joined more than once, its virtual-table names and labels follow that alias. For example, aliases named `online_orders` and `store_orders` produce `online_orders__line_items` and `store_orders__line_items`, labeled `Online orders: Line items` and `Store orders: Line items`. - -## Generated SQL - -For a query that selects `customer.address.city`, `line_items.sku`, and total revenue, Lightdash generates one `UNNEST` join: - -```sql -SELECT - `orders`.customer.address.city AS `orders_customer__address__city`, - `orders__line_items`.sku AS `orders__line_items_sku`, - SUM(`orders__line_items`.price) AS `orders__line_items_total_revenue` -FROM `my-project`.`analytics`.`orders` AS `orders` -LEFT OUTER JOIN UNNEST(`orders`.line_items) AS `orders__line_items` WITH OFFSET AS `orders__line_items__offset` - ON TRUE -GROUP BY 1, 2 -``` - -## Query behavior and grain - -The query grain follows the fields included in the query: - -- A virtual table is joined only when one of its fields is selected, filtered, or sorted, just like any other joined table. If the query uses no repeated leaf, Lightdash does not add `UNNEST`, and the query stays at the model's grain. -- When the query uses a field from a virtual table, the join introduces one row per array element before Lightdash groups the results by the selected dimensions. A parent with an empty or `NULL` array contributes one row with `NULL` virtual-table fields. -- Metrics defined on the model pass through Lightdash's existing primary-key deduplication. They remain correct at element grain when the model declares a `primary_key`. -- Metrics defined on a repeated leaf or scalar array are calculated at element grain. -- A filter on a repeated leaf keeps only matching element rows. Parents with no matching element are excluded, and Lightdash does not restore the other elements from a parent after one element matches. -- Grand totals in the results table drop dimensions. If a query's only repeated fields are dimensions, its grand total is calculated at model grain. - -## Query warnings - -The **Query warnings** icon next to **Run query** shows warnings about combinations that can inflate metrics. - -- When two repeated columns that are not nested inside one another are selected together, Lightdash shows this warning once per query and only for the deepest virtual tables. For example, if `orders` also has a repeated `shipments` column, selecting fields from both `line_items` and `shipments` shows: + primary_key: order_id + columns: + - name: order_id + - name: customer.address.city + - name: line_items.sku + - name: line_items.price + - name: tags + ``` + + + - > Repeated columns "orders__line_items" and "orders__shipments" are unnested together, so each row pairs their elements and metrics can be inflated. +After you deploy the project, users see: - A nested chain such as `line_items` and `line_items.discounts` does not trigger this warning. +- **City** on the **Orders** table. Because `customer` is not repeated, the field stays at the order grain. +- **Sku**, **Price**, and **Offset** under **Orders: Line items**. Each line item is one row, and `offset` is its zero-based position in the array. +- **Value** and **Offset** under **Orders: Tags**. `value` contains the tag itself. -- When a metric on a virtual table is queried with a deeper or sibling unnest, Lightdash shows: +Only the fields listed in YAML are exposed. For example, `customer.name` remains hidden until you add it. - > Metric "Total revenue" could be inflated by another unnested repeated column. +## How queries behave -- The existing **could be inflated due to join relationships** warning still applies to model metrics that Lightdash cannot deduplicate, including metrics on a model without a `primary_key`. +Lightdash expands a repeated column only when a query selects, filters, or sorts by one of its fields. Each array element adds a row to the query before Lightdash groups the results. Orders with an empty or `NULL` array remain in the result with `NULL` repeated fields. -## Pre-aggregates +The `primary_key` lets Lightdash deduplicate metrics defined on the parent model when repeated fields change the query grain. Metrics defined on a repeated field are calculated at the array-element grain. -Reference virtual-table fields with the virtual-table name as their table prefix: +A filter on a repeated field keeps the matching elements, not every element from each matching order. For example, filtering to one SKU returns that SKU rather than all line items from orders that contain it. - -```yaml dbt v1.10+ and Fusion -models: - - name: orders - config: - meta: - pre_aggregates: - - name: revenue_by_sku - dimensions: - - orders__line_items.sku - metrics: - - orders__line_items.total_revenue -``` +### Query warnings -```yaml dbt v1.9 and earlier -models: - - name: orders - meta: - pre_aggregates: - - name: revenue_by_sku - dimensions: - - orders__line_items.sku - metrics: - - orders__line_items.total_revenue -``` - +Selecting fields from two separate repeated columns pairs every element from one array with every element from the other. This can inflate metrics. For example, selecting both `line_items.sku` and a field from a repeated `shipments` column multiplies the line items by the shipments for each order. -## Deploy and generate +Lightdash shows a warning when a query combines repeated columns this way, or when a metric on one repeated column could be inflated by another. -Explores compile in the CLI during [`lightdash deploy`](/workflow/cli/deploy), and the CLI reads the nested-column setting from the Lightdash server. Before deploying, [update the Lightdash CLI](/workflow/cli/install#updating-the-lightdash-cli). If the CLI cannot reach the server or read the setting, it compiles with nested-column support disabled and silently drops repeated leaves from the Explore. +## Deploy your changes -On self-hosted deployments, add `unnest-repeated-columns` to `LIGHTDASH_ENABLE_FEATURE_FLAGS`; see [Feature flags](/self-host/customize-deployment/environment-variables#feature-flags). +Before running [`lightdash deploy`](/workflow/cli/deploy), [update the Lightdash CLI](/workflow/cli/install#updating-the-lightdash-cli). The CLI reads the nested-column setting from the Lightdash server when it compiles your Explores. -[`lightdash generate`](/workflow/cli/generate) does not generate an entry for a container column or any leaf below a repeated column. Add those entries to the generated YAML by hand. +[`lightdash generate`](/workflow/cli/generate) does not add repeated columns or their leaves to YAML. Add those entries manually after generating your model configuration. -## Known limitations +## Limitations -- Only BigQuery is supported. +- Record and array containers cannot be selected directly as fields. - To access an array element by index, such as `line_items[0].sku`, define a dimension with custom `sql`. -- Record and array containers are not selectable as fields. A scalar array exposes its elements through the virtual table's `value` dimension. -- Selecting two repeated columns that are not nested inside one another multiplies their rows. See [Query warnings](#query-warnings). -- SQL Runner and virtual views type nested columns but do not expand them. +- SQL Runner and virtual views recognize nested column types but do not expand them into fields. diff --git a/semantic-layer/pre-aggregates.mdx b/semantic-layer/pre-aggregates.mdx index f6dbb872..9eb15250 100644 --- a/semantic-layer/pre-aggregates.mdx +++ b/semantic-layer/pre-aggregates.mdx @@ -187,7 +187,7 @@ See [Filtered pre-aggregates](/semantic-layer/pre-aggregates#filtered-pre-aggreg ### Dimensions from joined tables -Pre-aggregates support dimensions from joined tables. Reference them by their full name (for example, `customers.first_name`) in the `dimensions` list. For virtual tables created from repeated BigQuery columns, see [Pre-aggregates with nested and repeated columns](/semantic-layer/nested-and-repeated-columns#pre-aggregates). +Pre-aggregates support dimensions from joined tables. Reference them by their full name (for example, `customers.first_name`) in the `dimensions` list. ## Filtered pre-aggregates