From 5d5d6a3d56ad89529b95835cfa64118b8eb6166e Mon Sep 17 00:00:00 2001 From: XingyiXie Date: Fri, 16 Apr 2021 02:33:53 -0700 Subject: [PATCH] SQL_Xingyi Xie --- screenshot.png | Bin 0 -> 68256 bytes sql1.html | 1180 +++++++++++++++++++++++++++++++++++++++++++++ sql_XingyiXie.Rmd | 447 +++++++++++++++++ 3 files changed, 1627 insertions(+) create mode 100644 screenshot.png create mode 100644 sql1.html create mode 100644 sql_XingyiXie.Rmd diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..b04086e2c9909268b8cc265043bdf18877f7d111 GIT binary patch literal 68256 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%0DTM{^iU z_(!ocJ-xK>D>$oU)saBFFZ1Sl^=+ko=iMR7+&@hhSsJs|!YnwzJOu&<&z=MJP5MNu z)HG>kx-xeWSy5Z%NySQbNj~cmPkjLTM$6<*kG{O$UnNp@9c~Ffrq^!DR*5vxSiakF zZsvRwNT#~O5m1XRywqN1Sbc-ij>Tf~dxi!fZjg z+Sbw!TwN~XEoOfP{^<}^G4D2=y+b?hBep3`F=jUZ?)1twB?TGX^|&YvE7I zICZ||IDed~sgQrS&{z=T<2nW=P<0!x+Ak{6%8BNgWxzv`jHt zin!IjeGCBig@O}~ojgN2SMEJ^#GyBTtt>fl!pbFp!g?ZUfaINi-T()gg*sPSDevKC z{yeW-o@n6$Euw3~V}(-ReC06#XYFp(2aM%a`-gaIvqH|6R$h$5w#Q@*N_&>(9_7%G z)Gq3bkI64Y^$0bJf79Xyn+TpH>Wwkh@GRL~DMA)xv*2}1PAY0F7l&u+8!pSu2G5R& z=1cb@x#DvdoM&XU@7$B`8z;0WRZ%u$|4AsvsREE{8Q!5$Os=$Re`VM-cC=V90(%${ zp^>U3=?-l5_7UiLuEG0qdQaN1X?Dj9?Qg*K{HV(Gm&jiRE*zx>kKQcRT>0#cp^9~U zuC>}`-ut3eEziU*Ej>Q73|?gWew%H)tJUa_ad}^ksBCdoIv3*Ata@R8&cHWIKU$zm z`kJT`vQhtu8v_TS=$aZ8W5wFPq0A`{{uQXrUBOD=iKlDDK?QI zY!TZc&WlT}7Xa)=WByk7DHn9!gO8{GBl4XX{SJOe#aty%tr@bbS^i;`MOXG}ntf$M zf7AP9-`qO1@AZIQb5We?C@!U{M9*n{iwhJVIcT5`->eNOLXCp)JM`{%5cs}KB4o+x!YhNN5_pI;?03i{Vsg^`%Za`|7>$=y3_J9M9aBjeD(FEq-9ZEJjRIv2}= zmg2(}q7$f(B{FCQof{28=Fg|VSFt;;m~?6Oehr*n{dUxo& zR(Wo0&PoPqM*J=3PG4RE){ngA;df;bc#J35BKi#eIGl% zpVGs1008xIcc3fYJXutAS6QrfgFy@hT_cMt$lG4JWILq^3EqC3PfKJpFLYa54>gz5 ze8u{^s^rcnPOEmXE++d~o0sX(;~mu%9v_I?XL}>0?~i|WHY@%yhO&32qxKGuKAF%+ znyuO2%AJzu1WF4@rS2pGha+3L$w85otNI9nl10ad7Q0TZfa^4c_L)*C6fd4Htc!* zNUWqcPg+&*5Q7(;<3+l!!j)Q~bTc^Kp|&brvWu{D2ZWC_XG^G?>Xr8qGw6!z3cAY$ z$g<7mHVg;5HTc8hTp6U;0w1p~two9y&o?VJDx!89V(F4H2YpAAiWtZNiyxb~YfItb zq@+E`4ic19^61o<_1{bqLV_G)F|02Gy*FOrS)&^5)bFZxP%P-1x4+|)5O@&yI^nw2C47BwpL>8g>EHyt$B@7~A`v}mxL zi(j26!xP|14mC%P2HAOxOuTlCQcI$7pTIfyJoAXt<GTbs5;3h|OrimU{Pz3-8YZ3wA>+GCjGO#w zApq3=c&Xcyy21HzY*zga0Q3e-PyEL7R89mWUC1b2fSy^wvOKdHc@t&FZTnXtjD`xo$^Nu|IOW4?%oZSbFuq(kSf|A@zXbjMX*Jm!~o0^1;EP_GzS-|FUxwZ0&G(43pUNA;dw%^r^G5B%`YG z;cY3q)7T%C*mo(aq%&-`R1NFnZn_xHmFbUZpa$R8BYI8heze)lPi4kejOkZ&N8Jz{ z&p|la=Oi-r=36@`bkw_+8M6-*j^p=VI8EA$+_t{;$w&@dFY$dD zP+B?i`mg>RR;=nrP&rKWG;ylP8T!h0C@anBvYgqr-`#}ETE<>cR)Wtv^Q3yy(&t=uC$xpKG*;pa2U7A4tiWskw*sPQ5po@P*iGPz~Tt=vU;xayFtZ-)B zDv8iyS{7g@!@oY<_!OyNSmXZPSKoM!tuN4jU3*_OCO)%koLqYNmmwAB2<32&io<$a zdOp!Dqht}4DD-o6)PbX3@Z-mIn45Ccmuhp$FMJ1U)h0}9yXMv~Tgu8+Xag}VYm^iJ* znN`CPj#nFz=o)+#|N%?P>sNW;ZF2B@mz0An3 zM0&?B$32tS?a%7&WN2IiwOsZv;Pu8TL$_?6t-~bI+53s4fg<=K3H6|KSQV?qn=Zkk z-qD*K=1;lsFyiVR ziou{kJDssH2!nhNJ2!Z;2XN}X^S|4xH4J*DuKaYQ>5I75f!kyq(nPm-pV+mpqP|OM z)D`V~D;qt?rLa8vdG`4bR`Vi7m_eM4qCI-H`n7FrZW1b&x_1HlS^{yuimyO5hKlV*uD;H^bL>S(VpU8|3?umOewmsR;i zKatl){W&#T7#yJK%}yPzF)tNXeDJK5=Bg`v<+Dx;&bHH>C#wg^2!@5&+Bp4>mV})3 z2W&g1&o$fOI6!^V9ZLDx!lTKM%%#3L{7_9}vc(wYfJx0!q~wfw$Ld-8Sl<(7RBFshc=&jT zL7r{7e^4a$b5RY-e9b`$H~6t#I~A1tI5`-(73$~u;EU`S6`AVdYnh=Rm9H_ks3)=V zY3o$8N-FQRM|iUB+taYWZ-IV!y%^{S3lwl>!ody6*TI{jLu}m<9-cuT-CDI+kl#J^ zR^+HLhAw*YDNn&u6>YsGTcH{j93Yt)1c{trZ#jZaE@rt!PFS}OHOO&iXeDp$V> zb<#K4E`x`R&RI+NbT#i~I$dktWm(hG4cCzv>Em!u&xKevTMLU>t0f^X*d9rC6@->n zKI41Ms{Q?jG7$y*u@Q%M~0%IG@RC(q@HGu#VjmM(SMQ#@Ob8 zeDXDRR#!JZ_VImE-E^be1XCd3!87F)#^c)xd_j@KpcI)Xh>x8=J*{FB?OPaY8Qq!X zK+m1A?G41uUpOf5IM5$Orf!QdT&B3^I+?hw{XWw!%h`9t$?%=22Z!{<@X`+BK7k5n zrISy4DS1yU3sjR)-*BystRNz(!%Jk@ffDL8DbC5inJaTFQ>rt2>0A4GKo5#lso$r+ zb{LoDXQZ|VtsgOYlqKf6F%bD`H!;(xXo6mVx^`w z>?E_qifKR`;OBf00ELlO1`pMRENQJ0QVS*F`IaenU*|J#E#s^$-ZX`O^_z^^)+0De zN!xaeo1vi+R2oKdI!fv^_?3TegNiyFLhsw!-PjE6W;BiIXmYtWJbPtmr;_Fi zsxE(xqt?Y*OlMQ&vG;4(#2cfaCgAKYRfwq!E4UVgdjl`BhO&IPg~YUR#DK4;yf1*{ zglXk5%Zt4|LK_Wl!j~&_ipZ3v%#CQ-a#@)X9$L!ro+IMzs?MOHn$g`~%Adn@W)F)W z2u3yF56_F%s6>ec&Tjj@6xbJtc>Ego&!&~(@48k}J$8BF!M+)`|B};t(Ro7gX6`42=OH@I9`cYY1^_T{ArhZ(T%qxFe zZHrd7#Gty5+Og3|@9Rcg>jpwxy^b-=V&d{^-`y$&&;vVW4Zc2Xv2%5i^&3q0yB8to&-Q{=*Nfje0Wc!cG54}Kk83Efdp8tFI?_nK2L%UT|l>ucQcfgUw4 z$`Xvg>`zcI_PM?rfjQNdOIB*2$-Q4#x%A3g3Vq%%MiE#_s@EHZ?JMU{J2V|(cGWUJ)v-!ODq_U{13LVmX7YT0>`^soMN6Zb z7P3+jT-ocxUTI#bEpV;L@m^l~_g(nIL|6?P+uPVrkJ?Hi@1Nm^IPnpWPrXc;?DAfCaZwFogkj&f3YQ@W%HgUv z=tmhjJIqI?q!`u;4_ZM{-)6}(U2;ude>PP}cE#%A0r7ZMh(*k%Wvzs|aejl=M}a8z zI+*N|?8-Mwh4F42RWRZK#wY8KlO4gc4KTL^-CN{s$uw#sSv=q?edzzq{pGc2-9{RQ z_FpZYUp>8CoV~yaeNAfu-u6^PX4FH68}dAK>v^J^heOx;Ufp5qwm$5h5$fI z_CExp&qw)X1n>JY3vG{~UMYrv@!?(PQQtw0oRswGPU5&&^c;@m5I3InA)fdoQv_xM zi~(;^+Q_~cO#ev{id6d(JvCFh1_TJc`d2Jh-Lu>n$x_zUh5FiS{%eY|2w@YODZP;! zC`F|6SJAH8CF-4b=abhlvFG3TpY_Q`oLUVgCN${$_Hdwm` z45-F`aFQ6$J~A__Q?GYiQ9UtPOt&-rqBY5oDcs>4BNUgmmKc&6Bz!bOOI;O#i9ErW z%$bRC$PCPTQdXQk89AbwqrC%8LTKK8P7sLQ@(mC)=9l}+pLsGR?8O@ZW&WQr z%flAOw}9+#9OB{iJ_oBN7IMDw2JlGr;oHAk^|Yg@j5_;J|&2+jn>X#KH<1J?Z9FMo!T?a zI5fMDLdUVoW^8K`Ip4q+Gt5<~7c_0);-0rW*ttbalx z@46}crkyE7?Ce-(4<9HnP=_}}nm2aN^}>BeKd+9rs#JdImvjMD^U>I*fB z>qwPNZ50xC_;xu)(vMkFPXOqup4sEo(IYGVIARAiR&dJVU!j}+isYCH{#fd-Cn1Xn z-6qX7mvJ!M;G6gB7IkEo0o~v~VeMc;f88TN&dY zn`l#8n`I6QO|#P719C2=GCqcwkf$3;KOIg6n1QgwY0EP&Kas;qjKW5qYUWn7o|lhI zBm;uzMiYY<14ms}&0^Gg7vwdiT1J}b;YTuR;i@oGaFTs;vU`gNO{i4&i;}sTnOn3i zxs**jOF|9g;7`az*1)Kt_%zXutVA^k$iYwT3K+$rtn`{HTODGGziu5|?m6_WbkfsT zx~Y`;Z+-S#$|mfrN;rP>(Tit<2d7!CmJF`E^^V6`xZV~IJ-s!NPz$m#c%}J-qW*$D zC8tG}3MP_$8BfW8Yut{Yor z3E6JVtAM$cl|agr2F~P5mYpPucMRv8Hxk$Ebq)_pajFNq?J{Jh(X12X#lA}+B-^EN zoHZ9OxJ>Ewz0npeVubUy_2(tJKv`nZwqbuO5>s?ZFD-g>X%SHhtLtZIn!?hzni4aV z#LhQ`GscjL^o>`xl(hVseDAsrl3B?K;k?{vr@?aaC6_tDNmFBTvWc_jslFA@Yfbqn z+F{wCu`6+ZU?a~~IJ?|O;7w#aj8f4?W$ zX!|v%y|__6ah9*FI%M|t6jDS1yDLa*5>EJIfSmdE1I;1@73@7JY++Z|A6m@xZsnzb z)$>0a5tNbjwMTlgR^`e|6!Hc#Q!Jq&2d3$IDaAy3<=WLPrdPp6zV2#zs!{ea#S`b| zQ%$mKO4AoaUouwrGLB$)*C}?d_a4{p$*KyJKg?0h!7kc$RE*a=GY~IR*3H4+I!$DW}NQIg8ss{njf7`0C~u1%wEOi|0tHR|NaW6G{ke+^{;S zr;d7J(N1si0H9w6JgNF}B8t;dYq+y^4Jyv^P+JhcmT#FJhY8^iBQoi^$A;{T3J?+| zFfpWvB6;}$vv_}^NW*z-0=;u*dF8BRGu37)Mhl{rjenwk;>Sb=*ZdheXxVmcJ7bil zXv#JXEiN?MqB03c3a*zWW9&aaY?>j1lR|;=7W{o>k z=0jH*SPQQs2~iWFi15#IgivbCuY#w&>L zMetD`*4NFa)2gUqJVQ5WK%QaAbY-Z9jtor#{e}$Gnzkx{kP2Pv({mY{XHnww#t1TZ zoR9Ts0Kk`i&H(-8H@zUM#YgKpj0)e-CC>WsO-P;t9rwN&X1X9JEH$)fd!@0n{^wpr zp!13|zvqCw-Q*p2(^p0(Gs_!tuEh(Q_&c`0w&CxlNQ2Co*wr>T7#aQ2j8uILF1yH@>OJgoXkZoJ;-r6G;`g4hKKT* z=ezUE|M^jc_0BV*^Y@uzZBvX%O6t}xI*%DpH>Nz)`Gh*iX@M7+e>gVy*QPJml1(`J zOmar@l4fgfFUZj>mvj)wNEg^eChiC<`^LXAQTvo&H>>(RB9|-aZP!kJvy1L8yJfDI z$7v}BUuv!aUpKqk`m<~$=nO*1Ovx22vYJ{wI!M}`CoX1Xj_8F)UxVou+*L%`ErJpf zEVD_)g3{6Z$qOmY6grAl<+KE=j+gXhR-p(y&+$X6kh~J7h%JN-93*CZP@|}_fHb^Q zKi}E)h0L{R0LaH*_Xf5qZLLC`&R4u@(ArE@HW`@2qO53=TAD#O$J_H+BiOijA*qSh z-N>lz*2kpeFvr|;DcAmQ$kjDJ!VFr0ES_Lg(;BbQ#%s|Z!ge1^*TRXh3dz50M^Vd9Ahle%aAO-+I!9oBUBaLFM5lOok=CySYMD*<{ zi}}VhI=#89&6G)^9L8}N>i%gWvXcz&%M|&6O1c)Pj@)pw-GE(7J@C%B!)omJ$+phBE0cIxOmn-v_i+% zyM$6l)VW-} z_y2}zO(QMni*9^l`pDrz5#=7Ec`_2byN3g;kb_bALuMC{+}1afQS7`h&u%wgFD+@) zd(}?=LH^4AwGVdmGxuE@$Q=9|cVR(~|N4hVah8*wpnIOaVvZfH9VYD_w4?B1;&OGc0+726-~t^W?( zm{K|m81$SI95)^R5C;{S9TLSkKr!C|(;%Y!4<4_D<5WM8aDI{sp>Tsg5HCrZ!u^`L zxsbN^0^rfX8!bh%G+L*OgMm<6DXC4R+ zR(hVr=m7gx1B>;L41#>PMVc{HrL=6UtC%|4@$jy1kYD659ih7U-hnl!J{0| zpdPnXQ3vdC;|M0iW9nc^Tux__Q;pxYG}|7&>(nfwC)8boVxIY#tHh=Kb_oA zGDV80SY5@)Gmgeo@>>CA_dr@jL8&n}eC78q@VIEZ66FSf8~n!r)Tv>%`J(JJK4MdF zmGz?$v$HkEYYf#s)9E|v{`^=VowFl%KWeh7L=V>7<#>>~NF$VsAn<~sYC>8W#>Y!A zN}T!!J*gtgWP*qAepma2$!G3|6~4BDQ=hJX%C@}#nk{j%#6=;?{dLwTeizJ4ALMbTKcpwYzu*Ax78nd2uEnbh{9Miko#3ohQh(5q4(TS=bf#} z?=L(oCneIroiM|M)2CdaLn^i*ayKa7nVRx-id+Y^kzk>uAK6|nt%Hk502SKg>UsBiq zKSypj_yaQIGgrI}=Ovc@Kzl9M62^c!OLH&Qb=iI~OLIGO?G?-NShLL^Jg-k=sa>;N1bn@+gb^i4jSp*HHy)1G?+1lHwUin0*Gi=wZwaO;)Zl4) zX;eotRR1<)dd|DQd$)qD%C1GG&%hyO1#i`ShP36FIu;g2sR~sg6oPu}#nE#k?(oW5;lkZVJSYdug;XaAgA z4_t=gZyFM>k%&zw8Oei-xfyZL54TMchduzq40ExVW!ZK zWX+TF|@Xfsg|PNF^tazTdQ ztM|`RIs(8nQvfCPAM8YoA*N#XXnzVvuOWiic$;a^&WPQXT(eO#kp(Fk@Ud_g@B) z_x$vzT?gqWf#7aT&`{YpsUzywY!-BUz*;y$9l<#?xMs{QsRa=e70&CO-E{>SFngR= zadi)b=;R*QQn8qOe_>KIk)QzLVxVF|_+wDEBJ zR{g^;2-Azp*nFes*TxeHKA0KhHFgeKoqmKCnS6Op6X_{7E|F+)?~l>$O4#5Z%&?6= zx481VW#egIzbicKcBRj%mX8O>M2q6cbM`vgoc4Tq&pUVCYsPn+g&@!KQHyItAvjCDv5rw21Ven@W=GVV)x3EZ7j&yr!!z%B|p9lhUtZCs9!GBQ6e z(xt#uEH*CB>MY zi_^PbNla4~$o&gv$Gz-gb6Hz>SpsU8&-bv?3^sqvBG*35c*~PdIZ`zYmPSbB#mPhG zwpM?EV`jqXFJ@W7CH@!(g$>H0L&F)~Km_;rOYg(Z#O__u^*QR4uD{53v3 z`~fmT3Y}AJu3wigsppLt*{z+q)m}nnJ`?5mcWfo=<7-T8fGBT`;-A!?i;p~@TG6rw zVB6u7$R__EakZors7fZUtr(|uXoFU&W^nnV)DKBwMMM~yX+OKKvc0}u#;`!v<+aYB zaTzzQ!EjIwPW%1|+S(m+j!G)?M)k=5LD|Is>aO8keMz}F`VNL+0KN%*Lbv3;F`fX7if)JlpPh?lD(%pO`3bgDVl zeX5;c2-j|M=}x$7LTpWYBub}t_Xex({D#7)QSp51gPh)P(CIIF35Lw=@5~gvX!Imb zbVIbJxx0uT5#7ihV5DfNH-Fxe1I48 z&*lK=Rg>u4J8@ba)aaKN5qXUTb;w&+M%Y#cICo_)2;DRL%32k?FZqn$Db>6qS# z$`y6sO(B@AL+`aI_Pj{&QTg`OR=WBVTPcAAzNkEmEVC|kUk$gx2=x3_^+aIV(&Uze zRnszmX7ptBM;cHV3xDCQP1$N5Sk8A`A8V)e2qdJ^ep_j2*H+x!_|f5HCZ9h?`E`m- zf{l-CJlfFbY}6A0=3GEFyMBJa znL9|hLsRL&S``x*y+jL2cNMfyz9Xsfp81#sLL1VSulzQdAY5R9nz74ancRwdv_Dlv zMo<|M$L5*{K*g?&9)D)qv5-T7Wl+(2$7f3y>cqwaFkq9|9PG{c~EJjS<=L= z%40MkVML*g)$(2iu!L2ciKY+*z#pEtDT z@I8q){v-8ewa%vemnsUk)eaY_jwGTnMfo2D!}v7; zk!?lf1UO{a?t0?TF|Haf*&>Sqy@G+7{=p%2jLawN@hFqoU2zu+2_+!I%y$vdW38lgVWVzw8*r{AzVoB{1G`!CCIeWdid%*T{>TWtdKv!WG-l6d(<5#? z*u)&uohpR$HRIC~PW8|q_K8i)N2@cBT9NO2Etf8|3%$<=Ev5mc7PQ!GY@aDFm=3D* z8>iYE%GxHIy#;406G7pl>MV`ehbLfg4`j)1jau$%T;qJc-U&FD*NH7>NTQU}UYc;V z+?2pwqr=d;qb4!;QnPG&JhW&I`+B@=NJ-z6^Phw3>8#+kCH)J^!v#*^k6Pm~lmQ4$ z_ZcE(_jQXm)sE_loH>lQJ=Q$)GmqF=0^E4gg+hoBQV~QpIIy+fI04>ip9qE->a5J) zlyl}*Ufkl^*YQea0{tU53}nJ#EUD}nd|;7Bn|7;~w|vhOQr4?NFYBI?Ev<}5Cj_?d z}xJ&P5d4I zxmM+_JHal@gkmH-;^e3WZ)!Pe>MFv3Jl#EZTI zr}`;@vY%-Ypmo&G5fFKsyM&Ha*`!59RJxw^K&g5C_pOv<6}{?0zM0l#9T-iKv-0uC zsaDg$X_Pyg#iu&R1|WYVzNgZo+miSI&wXR324@4&81jWjAn)*G-uo_MYNu2)KfGb>Q96E7T)xouw&Wyf9P z7=$p%;neWM5z2Mg#6Ys%=oQ~C2wYpgq||$}_B%=C)ri;nToI9E+ly{`c}%aJW|f$x z1*B|K5U0*B4C7VBJE4}?&?SY-cOM7%e3OVYyKnyLRBo}2JbAF54rPZ9$lyn^!ezSS zi{?i)ch(&8HsSd*dhg;IV-ZdH{75l+xAa}ET^FM4yGJ~~wgsMICx1UIB5I>wK{&m} zZi#4^I;L$dhO6#BNa{Wmm^~{nRRc*(-wAD=-|@-y+?6B)mNkm-taplT)89Pd^VTNW zsf)7rwkYH+pS*6$f@lzV5c=-Wt<3L{?OK%G_B^wAq=2y{zDgurjO7^C^!3H-HaZB3 zV(O*S^2-k(Yg_xgV*G4fX}0OePURmfQg(Fwc3d>rbmgu;sJt$pSpz)94r@q`Lt-;` z24TJ$QHvokVySnKO7oM*PXk?LgvSKCyxPDAOqbP!B_t~8kdlYYI* zirsg-R1-cF@Jc_(*bc5~94x`Ckn$05E;AEsNgqmDZq%y0?0so)J;ZhS_0eCu2#g6< zJ-S-%JIClSBu6gq(}_{kZ3&L8{A$hGzW|Bi&xjD|i4qM^d8=jpx5$F(pA#@0)!W^c zZ6+y6_4WR%Lz_rs>zfc;wy!OU>wP}wpNcyd14no{rHLnnN zn5}RFB%DAs4*={`D@K13Q&KqKDPYDCh^X3+8pL~_QB%uK^3uBYHE{E!Gx>k?_5rff zb0Ys!HaxpwisPApNix!Gy6UByre}cWhbVF&p7F2TjQ?ZvK&|3AycUO|pq$gHhPius%|?BVKd#pQJQ^o$F)KNksAXn{9vRdquq zQ3=?nAF(ckxy~B*2Q~bp{#?cK{4>~j!zEVCcJF1^tDc6SXA*2Tt=QV=|40hAF0S== zZs$0-yTz4R#gg&2&*>EJtK!gPf259*6G!+JWkXM6Q{`2~b7$U{x`Tw@r+Xa#x|xL- zOb!)allJ@RP4{z+1vBW70~Sxc;Aq$*gg87H{0f z&p9U0@vGTsVbvLnOnMcX5H{B44MVgQOzyw(EHA8`J6iQ=?m2sLQhh)k`Gbs0tf7Zz zuIL%uhrlG^(!KBM*pDrPYIXD=xf$N9<|c=J_SU*9i?Y_=j`1*L8)+d>fp zq@$>a2&kw?Nlso7F*ZO|SW~jx+#m@ZI;Evj_B?QPi<*Gbt8+)EP~U0WML4?M<&HskKJe z`Z7g8O-Z-7gXCyexN71` zdazfSzEqHfpn7I8%5Tj#G{(T!Aj|l-{20Ctc+8^E^0eHY&6AX%vlJuiI!RIOOtrkw<6>^J34f z5z2CIeKja3LVS)m@DD?4LOu5 zyIELeNIn9BSiWplk+BG|s;_Ix6mNT!tvi73G`3xqNT7tWbUi}CBGcugl@#5_&Ng=J zHKD2fZ9Aps0Cf&IP_=gdW7rjxn36-(c61*THw6`_D<}kAhC{W^lTX&|Nhc=Aq6k0x zNVT3=_a2h-rKSgvp<%R3$SI8uiLA{|x*t`?6Ra}^#q;7E1hlCuPYhS^WuKSW_%h6t z7_E?&hfk|5s?l16Xl{V&$PYzk3NPp=LF9F;Ax3@sxcYf$qYG?}<}n0z(I+_FfYZ7% z0G)c7y4eirKM#~66jF1i57;R~k~3}XiN`{C{TOmjAB=a>8=ng)BcXi|Zds?C^Rb)h z#^zlF{IdajwS z;rbGH3KD(kS;n|Qf$|jbdD%6=IAp;cVqcxLa(?q%88$nYpEMV$b*9z;4d%O35;+&? z6Vv{khDBj2i_9Y-P>5gUygRM`(fC184o(pjGZD(1W2jrTkK()cew}rOPkoxbcG%mP zW{}zC6%>NY#CM$zU#+n$9X-yh&FhNp*#eIm!h^3)Enu_bDBwX>uR?b} ztSGXWd4gnck(O?hU+7VALT%Vz9pj^eJgufZN9mKEmF;Cg2|XPaa7piCG#pbeC!XcC zo^E=1#Y(j2^q{daWPNnqL3hKFgVWd_ROGDbi4Z&MYPC|E(oIIhI2yk_6!ZFQ6Xbjr z>qeTtVP$EO4Y0?iK$hL{IR0!O=0~!x;qq8a%a=`{jK@~GAOk=0nAfbURk+$dKB_Ut zpZ>M&QKixcH+i&Sqw|ae2O;;A?}MJL-_X0Iy1!2!;oVj1Bti`(#x+LG5-!s};NvF# zUh1IDcE9zMwX=~ujpI&jY}U^QT`5r4B2q+uCgt(FLJEvpE8P;S(^5SsfZngSPto%d zxhj{w>0VdElGCUjmP0)bZG==C@ZG$EhoHM2N$BUt5*k~iYa zfZwh42!g|;9Ni|%w!|Y&ktwAaUofS+?^JFHB+QDOx~rQdH=3Cs;kAu=E>x#xB26D( z{n& a=>*mn&NLNl*@{m-E-jf-pWbbt5}b$Q|}$s%B(&unX8Va$=fuoBX;bBi$nDoc! ztWhxgSrj_2_yRHshMlkSOcuX6mzI^F{ES+%UX!7Humv_3*b(Z~*?DU-5r;aV$SvqA zZ>omzGaEK@tN2Yxrqp?(;+V^04dQc3ba`5ytg_1ErRjxlYRq&Vc_Qmtyspkd6@+i| z1Xm)5=_(jBbg2znilwbU@(MZw+b7lsl=BE)18H>mUh4jz`g=@_R|cY|gU>0T56>rX zHxIL6R3bWgg4_Tr4zRM0k zw#=0PV-6^MTz>o`l>{qs7@DWYh3Z%3s72ClG6zrAY%E>;#deC9c&dSI@GYyK!rW`E zh8U%XIe;JU5X3b22AnYrSG<$O#>}wD8`|~M6bu+fdyYn}vaSrTJqixZI=`n<vrLNj+ zl9V>?M!@syvnJ~MlZ)7)3p^h#Fpsi|VGXN^J5UA42T5A&UsyNnMnepB+r(*Z#M2Pu zkTgyQF~3SJzo}`!gnw$XCu!I-i8RNr@@NC*Js+FV`-z1y1KFuoYVGn(f|8maaHGdf zkbS_RN4V?e?>A4|L?V1*mxgUt&rd3toR%9XhcOOKiTfQrN4itzyD6H&tx01LLXbty z1u>=Xcu*FxNn?#RdXPooiXEXwY^JhO&w-y+_Uv(&HdDpFAp)*oViMa*;@L zqcvQr(;uJN+-YyUqSze8&6;`z&cos~nW>c}mgk`wtPC?sUBXyUM+x@_@^g@q*r}8ZYqTP6&KyRGVe3YuRkTz zU$;uvanhbjFuX!qt=DY)h}ba%_UP>^*-Skpwt^X!d3IT3#!1ls62f*xV|hS$Qa84=Ab}#Dy}dU1XU`<%i|{;X%B?yhwxxedFH{go9*hZl*=&s zcUa(tf9ZeB)eXud*Sj~T+v^Ua{&Q?JS2a{vy|ZiN`V=dnT~;yX20IR>YQqbrN}1iDN; z6AV=Wfo{l3gnsymI5ltf$w|JVAN!B9QJXxLa&$T zLS*hpav(QO@&{-p#Jtl<3b}fG^oX9yqv(>Xv`D3$*d?EUS(uxLA!-GiFaxE}u3l*1 zeRm>^pYs(iMf+f;)}AJ917!yjo;-JC5_xxLBUVF(&$chA01~c7H2n-;X`X)#FpcyA zE7R6b^pOu{B$7^4dB!O!tk8X%acQtn|14PM&+x<5yNsXg+@1*jbFBwV`t}n6<-!az zQqen}_0nv1GOdI%1PH{+7r^8Y<`xjE+~875|B+B&pfP_KO3L?#riToX4~7zs(3T9a zqrU}P2k=U_Q)Aq(p}n0*Cn7W>EBfx}Ot5Ri`qw4}Pkh zx@`LX(NH1&bg)xrZ*PW0q3Qt*(Sw!ihItBvWImnQ-Ln3Ew!WW|7ol=!+f2W%Ob-)9 z{ludtqZ{H_z0pdUNizMA1e&9`pdZp1Vg8o`6tlg@6Gx$YoTUYiDgxpRVu?>DHqU`& zj@h07L3gLbI*jH;6z=Az%yg7;v^BuNbQteQs{N8>rrgy_L@jST5A@|Tvnzyhpd0XdRLAe}K!$bn zYJpjo(lD!t!lS;`Pn_jRZbc;)6Z1eJwa{GljmS(ylI#WCxcb5GSMaAV3Mmjjyj)ev zEN^rfSrG;f9vE+QvR1JuqANEED6l{#dhtinTdl6bkf36gt{4ZI#r?N@{D z3N-)Kp#%7$r*~_+OJslOV}4#(t3h993q-ib!wVO6=K9stey9@A{lWo<0n?gjE2IE* zmflol8L;qYr4TapJ0y`ZXw@Ga22eBH^o^3o%zD(La}t8Dx6}@a^)y~io{tXQlg4;| z-yyqwd-v7suogg;MjZ>J%QGc znvDMI(!sjDbkeKz1QUx!u=7KZe}U9&+7}zv-V98G&*Sz-eSS)e%*I zUELO(f-gOe?HI-5!>r|NnL9xRRj^`8Qk`^|Z`ulvWa!aX5RLL0LD)`tT05*@f5DW? zIz^epR;RXoPnjFeN(1}}Z8+udR>I(9x~o!8lFQs7nO#Ad*C4{hk;cW5*u*BTepwc| zOsgfqgCD23DlKmkTKWXJzwevfEIK?!+?*wmjWbHe^WQpBN;k`R?^eNUNl>9u0|@qY z@|>T*c*Q5UwvX;S@}i!r4>8>OHhk|8%2BwAw!%a(xVD3({bqdWo_uWF%-Ys;h6$B+ z_#?XpmUm`%V|O3j{b#TaihJDFj+P>bu3LSs$a{q6yeb-WkQtTLp3X1Z{`ac2%8BK? zf;_IxPj67o5z(K|AvfOj>ngNGr>s9-i}Q-0sVF;N-K(1k7N0Tsb1&4u26H#~W74O~ z0kNkcL%j5=LP0^-Q~AE;?dN{JJ7yFfG(BYNU!8z=Ez7HAaDN5-dA_1+nv)PD@4N~* z7v4pyzb@{u3KLV9e|{mLIa`Mi$@Ix_I_k=|z@qSiY5;1iT*3JiAjW-di<&<8qAO$?I9!IRj@lUzPcPfFaWdnN={dh-POtdeW&rZ20ROPXnVC4@H*p5Pq?hj@)azi(9&42iMUG1 zoWbNTK#}l<6QCwC^ara8lqPOGs3ZxkW4ysk66Y!@+eX+;idz5fccIey#kb-{A1FTW z3gL6C21x7eVlD?i7El^7@FnqXA7Q!Qh?rDPaWw^W0Z3*nodH@WQiUjqo5W1q5ExHi zT(VHB>%rd5m#n}4(zmMWW5<5bNc|V2W*g|kYRoe z|MQ5uJK!neb*HvDjat4z?s6C?*W%q>j{}75LQeHs6WzM=;N|GPS#y z%YzKV3mQ(J32*Q;MH+&!_NdgPS?7^m?U296nT?u$AN=a-u8mvZ0JRnFv(UHaSq7Sv zl69S*PVie`gCz@H-OoO~s)6lPuG{cR-+IxC5=A98wVN!y$JvK_?fxvp58XoTrXzf8 zRzIh)9eL|bUY;SuPfH)Cy?X~YT#0Xn88pssh%=Ga^`{Cb3h_?(^>hiDhZpatsfW$* z@CiRpJ1-ATNRK)diC^|p>^5m{Gs{BSamB!iBy#({zHN%dXm7ciS?|i&W1RX88{Gv# zO+CUB|GCB^$AEJ;vu}EzVn}1Sei<0XdPwGZq7u(NPB((^)(7aDEyT$s(yAku93R_C zC3%jzFNMDO&CQpmBWps_Q)8bepIyJmv+i84;P{4Kul%jYwx3J)9b~?X#}nakf_sWO z?Ms71@z-Op;IOaTjeo*mpqu?V3~l~B{PKo0Z+!>nVtH8CN5C->nVE00L9T=>kt~)Q zTZ$`qH+i}tWA$DaRx0sKKl%81yZ~@{Cg>?OU^3*w2Ng>YrsEc^F={I|>2ajT5ty^R z?WoxK=;iO$$di0!%;XM^T#TU`Ip{NGkpq^Dr3@DE5ZyRP{X#Kh>_J=o=04*OO&C1A z2WDKj`cZ)??g=tgi@Z%AS*=htUcF}H0^(EH)KF7==>aG7;m400-rS!>=!0*Rq3>i= z+AbRolGhV3zlFg4d9<;kv911?4K3PWd+&gAWGLxyipEV&tAhPs`tD~EE2XkOOrYe_ z9kg2#W~u8%W9P@e-Rd4>wnrC}S1$ja&4%Jb%~9}n(UQzj$Ci?GBLTeH>gj`Mu&qSW zEj3zSs*F;zSdS7I)(RI8H3H8r!tL)DB@zWHG9jk}y*wa}d4h+{?%-D*T8xb(8J9LE zr)mgPd&re0XHv|}r@)M~q!hZC9ld+Qu6sK?5qx&FQefHdBgi*(3bJlHwf}@Om3TK( zLQXsZ&j^h!&;enHsUI{ELO0!bES0#Ko--wFLI@oG0vyYv+&Z;2wv&Sv+FIQve@%(q0_mf7MbLS-j&EuizgJG7LL(|~-X;GD%R17~j_cGX5ZBJiF zV=eL7nKBR7PARq4R%SsyQEhuW5K{kq|1x@{6+N|B83(WAwlA+O4f8X5w^b(d)1*zj zDgifst$&zy3*<4wnkwjy;F?+*)2fJ5E5@QRqxs5HuWyJy3hd%6{NABsleH4Re3$6_ z5q?`B6*{F-HV_P^-B>yUr~@t(`*5%WMgG*+$^imGAypbDoePqyhbK{!T?BlZk(4;7 zyO#ZCQ+kdRe|$Z`GIN-CG?o&-jI$NtnRVurb~YT-TurW9_zbyAYjAQy+9@vRWy~Rs z2@U2HBU__O-JyY&3=Opr8@k`U$lO^xUWPNGG2&ng!9zA8`A+DCLfweZuO zodNFp@Qc%$77K+7XxJ=%V#`yR>!RS)1Z~7sbZpt|-2mSv*3E8bjp;SlpQAOcc4wff zeV#cqd%*OplFR*1eo=w)Is2ht&(5XOi(x-glU&`LprF`SJfmEWMw4y^%O5@8#u-*j zl5bXw*A;Bi8ZvF-4|P2aBbFYdKR}d42o%{Ef~rndpau;&LHAy@eF@*YbCbQ{?x0PZ zRS+yphL!{#`mhwT@Bx1)M&YkCL;tVsJ;?*JmEGk<}u4(11 zy*Vo4-$y-F>;+SpSq*m6=oA^D_B(B_;YQ{3DO{&np9eMa`A|j|cVq zceiYVDQkHa%bQc}%bOog`^`R=nq2<=!Z9U1K?()_@Y;*`Hr~eOKQ|?e($VpDtR80L zL&6*vaLWXzl;A6IVH-ys1BFi;|E7EZ+xY)ykdXen4g6oTo&xsZxM_WU z%h5OMWHrwu`KQ!8=8u0$4`U}RWk@}INone8r$+qK{`XvHiYD}TOUlOYRuy8~6IHB> z1k6OG&G~2bf}0(+tYH8V^i)(l?;22V8MQ=p@l)+ftb`bN)tK{Ezh{@Vwjwv`Z)5*ZovYs|F9L?=w7-~NAmvOvfCx;C=ruS5(&e72re)|t)y54q zFM{tn=*dRtk9AoScZ0#4Uhf#&q{ z4=Qm^?`4`rDE}HxcRvGy$ReQKw~=`kOoNr!&)mir*n@Cc19nyR&HuoKgq z&ljv0*&)XL0|a3SvTj6Uy;3$*3_rPTOgT^g{KiWjT0=G{ls5$+r#>=s$o10a728-j zKbLTUew5Z)*xsWAiieUH2WeIHtP367$mZ6tbOAt}!K1k6 zdGyp8O2+2qt}}f~L|zv>MsajpZsr#z{N|6-G!w@$w! z1V@B^6OGFHuqrJmT|rbS>%9oW7R*z3Ua6X$u+POlOCj0-hAaDjGS*Nh(A~+J~ff$c#DMv07ZV( z4Up|4UHm8qrnBG%GsmZ^d5?%M2Slf7e>$YNCSn3`sA>%stT|s}#Gf*sgKyCfkggPy zm6)N_b$XSZ9%8wqUvN2iY_4p3^BwYS`fVjUTK8a{eXBd5^_CxPll~1Hcb-wBuf6bPW+k!d!5xr$m7Aa3{(;}avb@?ZaVn;NxPl~ z3c5~?>gk*aXWU?ImMC$H*k{|h_2&XdCl;!M?gd7rMGi{kSMnd2s5mVYSYp}}_-0d+ z#b$X_FR&B&>FhRo!ra5l3i?PTI2f@er^D#9>HQVagj_oAp#ds4P^E94IuPJ4nJqH9 z%&~40=dNv(Sd8E+?eyw>95({ZukwR%T?LbQ3yfIVYV1^fn(dsU4U1bG>Dq2w#9kv1 zCMQ$?12CXbEYb+g7s6o86_k*n1G?+Fq4kM@GsfE;;~6SGipATIZ)<}bYiifmXj=)W zzph^fe$v7Lr_?(XOvIWcY8H1@{cc&^FR{H+aB#+Hefp$_A2pu~QoZkJJjtsMa15ZH zmN4I-wUQ@XEqF-x6RyFr;EMaZTbX#?IM{fy zo9Tx%S)&j{K*(VFyo%-%6nyE%#%lMe@Xh+F0H*{_Am`8=^dV-f~Ej+&gmP6z#C*}uakOEBYC+0e9{ zDK|UOowa5&0?rPqUxFiK1`+O4W?hXO0fJDAcm#tfH8&AJ;N8- zz+^?V6JHn@jz`2u6>zP)G`vwa#+ZW>Ow43pnQI^_X;_r|+GiH$g8fh%6lSH8t;xUw zIp^-Qq)B#`!D*>bxKmoTHd{<;UlqZ!pmXcl+JR?7_D$J)7xPzM>Pt2zF8`LX#?%U!h$O7Lw&ZCf;YPHZ`bSo%!qyK8Xy{j(x7 zCdM67gh0!Q!IJ|@kc)$^bKedRbwBxR{Lr;|OMs9iQmk0>(RuN5z{svXE?kMeI5vtu zjAO&@&5;m3bDjOjYOMqBf5XbQ0_Vd~LV8t9#NHujnNfvf%VB<U4Y?74&XZPp7okf!MuyS=|74g5+?EdYk`)QZ%8O4V>)}i}c{j>}}o^ zD|N1#)9y}ZSf`;WrO#`oTgTKYZ3s;@zgu60w;zVhDq~&yXt&_%JeJxY;gU@3i?C^b zPYRqNj80F6z33-g_a3Fd&1*KOJ{|%>XGKSb5<=&Aqj7M*!8<(!l7pU;zb^Vc1eupu zNShsO@^V!&kR*q#=#E=!qJh@NI2Ny(X4nVKY}}@=Rd)K+YWMC{{HFER|RpAY3IG(+v&NIuI6G#NJgM)DUz5 zu~yw3i7uFC^)A)uC{4}ydhFa@b4M#}DvvY3Nx5k5T!fz7OE5HnPoI^0O{a zD?GAPl+dT*PL@HWx>$%pfmKo!mYoI?D%}`QFu=_rkoN|h!pujI75WIp!)8+vRsMe- zZcmkL)o;8@$uY}2c^*kCur-wPJix~~ZO1GwHhWa4gxB&We_1J70dS}uZrscN-O1l=ZrhP8-)r8P^l^xFqOZ?b=OSQzH@m+ zZ5#id^Pvz+s~UJ~{o-O@pwoL5o?5L@;XggShlc)N*R6o#31w~nQ&^rp{StR|VRRWHScNRNDrdF)Ka0!z=fwDb|8V*LO+Md$ z`Gd)X>sFR^NB{A=DTe zt?j0s@ZVg56+!Lo-bx}uCQIYf{;GgD@3V$0F)dX*;GFz8cp~$&NXJ_X$^?8%eCr98TSiV5)|Y#<_eG>Z0VI-;5w%ck+#2Y`bT)Cc)Z`E zjD{;UK-IhD89-6Csn@ml$>Ux)@Wf9zCwY1%fL6KM0C70t{XKiNz^GbfQK95AK$vOu z;?Q+z&Gh5ps)nv|Cb60CK>AW`DTg?RgoJiZlL5d`o*5dU=U^3qKnSk{K;mx~V=k}( zZi5`~@>uISqVW3y`wm=SQ~5BM*Iv#5TEQ2nm1@{`_>6GC?8#9fZh!*}B_s6J@H=jw zNml&bKsYG0Hr;*?ZFrmg77%XIn*%&z_O3rUdSAzwrT=k@1nuw!Er4JFCVVqbQAC5F z>4#c3WZGQr%Nx3aCuZam`=CLW@+(*1>FKg@nj!Tcef^zNyhr0TsT!XN3rg?H9T@Gq zJxN!(>H^a`m{;z2j}E<~laKj;AjPn`G%)9+C~i3N3OQ|K--79u2`Qw@oo1(0(SF7 zZP=y3xwIDk9M`oiOh3lX>hlKrI}%cMdNV}V56n7BRMLd7&e{kqBvLJ@DECHKx0_&y z4lk12lPU&`r>DTncKI6TGY;Xrobq|jOfsh0*2$*yW3fvdT{87C0L0D?0P3-{8>gRp z`^`LwDzVRnjNdw;sJ{o+_;pJrL0+~Xq*dBOT?aAT^z&JwCgNhM?Xip0+bZ|YNJJ7y zzbgW;s~obyEqW~aQS`aTB{~902(NbKoLTb#D@<3td&$S+Rf)r$PHA1eiI)XubEXfG zm4Z@3s^`CovL0i(4OaF}21h!Jk5bh<-)G*)aAxpoi~VuOw)NSn+&d9X$lX1T&gub3RX(yCHMLZ6MaB=r%HiJJoXy-~0^BLweF!Tl|Wum?GSNdZjaq^`PIOunw zCy^;OLJAuec>)=N$=62?gGFhdJ9)VTUer{_tALQF?&F(~C*2yFjF)`Vnkkgej)2wd zbE!#tC-=lmSIY-}>}3@X9|M{C)B{>ID`&Cu(>8_oq1@Vq?s63Sh1XQE;9Ka$8eAdXf=J2TYtN@+a5i>%&#)jG$X@!Y$YMilPfXeLxv{gD~hXd|Lw5I0iL+CB$} zL}_Jx5OeK7Oi@?oHDCfOb%OvaMAtphGx^ox2-qsa_fv5{R|{lUHdg{~H+g5WMIKM~jbR4mC9VJ!|C z?tU-!+R1Hc^*FF-+!ztk8`2nhSY}gL5&9U9@M{r|u-V1v0U{WbyWZ77VQ=TT*ZG>G z{Z$U5mQT`Toj_RIqNOpmvcL;59ugm(_h9ppp2GEYrjrg#keXK*tR8pp4Oda{kHq zk+_pp*Refs6%(fBDwQ7omTYle78K)s=m6|3QT?Qu&K#^ZDn{yriEM18*X30n2pDN+Jj+$xTpV8#n#79azUYq!D zpPmK?;iN9|RGlLl-!Ij61vvo#+dlvRkmLsv>O%tN_53c-QL)Jx8}775R@zlVYk1Ra zb!x@a0IDy)DvnFWZr0K>WhSTLowhCwk|CqR$3{EjE!%V1w~zffxPPySS)wb^1|9>} z-a=U3k4eavd`IIaBZ}_epHIvK$|)WDcbmu*Fx26XqhzILUN-TC^-3oW3JHzvxkeES z=#T)7tk^;HsI)!DC{r$JNea`dZgxIgjnYu|dq7rIgEUPgYae$lL7Qry`Kj~MldR=A zG!a)7uHQ1$?%?Ru5|!t3xwNh&&4X1pa|QkJ5^rcFCohRweXPAg9&*o!0E&mDL@~~%vZL-mck?v9 z$r>sV`OTgf-|a%R4hd#L3%F?Q>1Xe(e^24~^^0CZ9|0d&P<&W4+TcN!N+(4-TSl#1 z_5o^OXF>O!xp%wTROH4^Xc%tmhd6!SO(Fz2h{#Z{%aE$%h`sa9fPg-;?>6N_N+Ojz zVGqc1kU!U*+La$$HcxkLsa6A6Y{^()t6r{4#H*iH`^WijqM^}U0ha0{?~?g;pEF3vcln8{WO z_-nw{jJ*~b*YEPFd(!*cfHq#l(Lr2_Kh zFty^HLkM`B-JgN63JDEy=6z26Kf6>IKQn66zU^OEb9a>VzOC~`i`^U2v3gm{(CCj* zrQQoPU|Bpo@cOw-$z4Dh&n!^TzVB!+v=%g|+S|Ufj5n^xlcC(v9~(t<$^{c#7l({= zLvF^NMdcgrIjDW|IWG`zXJ@~FX-M!IkeE$Qqojza_#it@gsV0i-Tm+;aKZ1h6BBEG zh~b@dCuAgVLF3?z;2}`1piNR+U3>w8GQBqg^F?Y@X*PVYA4`0Qws5G~S23_@U(lAf$zoo(-1b#B-#XJVC@rWVHhC4@MV!*i*rAxS{1k4XUc zbMM85Pb%&5a&!6O56?z^{!7Dh)<&js4QOpq724pt0EF&PR)ycskl_RH9NfeCWSKS3 zeSU%@{mG8AJlnw;OxExrM`%GR^Kc)b{}pCYMN-OU6kVgayE*@(&sAu@*kB(cR$=LRmJ^9RKpsF#Q=?=~Mj{{5&h8y5^g&rV5j_D;j*w9D@w`Hj$p$40T>Dio zW)4r1t{m1x!~^n#pUwx0Fah$1 zz*Wvoa1xSmHJ=`Q0O-Yc0ea>V>zcJT(Dw4{dX~0eAU=sORWQN#s2{!~HKz>RYupFG zV!$o{MaoYg-#XpvG*3p#Cbo_=YY$gfHVw^VBnn4^Vh9ny(lU7avBLe87Xb?NM3fs} z@zaZQiZsv#z_QA1d(;xuXhl+UjapfQgaMIJsPML#Wq0nkJ;UT|RHcQC#U0DiGfu=~ z893?-K*wHP`BaVMlcnsEJH-CE<6gN-Ld>1pg#HxU!odqopWQO={|YJp<9}me09N$& ziGJV<*^Yk|SSJ&nuyz3Nm~sP%BEtRts^q?}*wm>E#1yU<|K~C4|9`{(ciS-HjZ}7g zQet@mh*y>6oCd0xP#`(`n>Z$a0JylG>=XbA5G zik-U4Wze7XOycEn^9{+T_mO&U#J_6>hsLSR=)u=tm4Lo%WfZdd4*sLux4u6EdX_E& z{5Ul2RzDEskMsxPRaWhFNyU+YEh(dbdPV*55Bo|S|K=VDa^*C?E||~i_Z*QR*V0pS z*=x0O2OrF(2WX>`rYyXsHV?2XYRXMRuEhI{XB>0P`cqL;Bdo+!mI&i{N1cNz#$DKq z0rXtLw*k1K>y8KCH6Xlb(*QyNmL;fTe#@23Svh8Aebt>7{BihL&AY{!H`u5`)IyfZbeso9$W4dDZkofD8lIdIw$m@c)? z6LKZh{V&Q6RM#v8pL+@b`I;kck@W6s2>VBahEJG*?)LcCTHY<>UL<86*2hd&q!Mpw zb-q!lpfB!7J1MXKXQ>)tJGK=Nx@j&AozGrLS9sr888p^adjmW9g1!&)k^C`mcuooS z#OrF1VZytj%XC*PT8)d%qZgi-#f&!tkT4*+l#w5P*8jK8fBT9G=d!GMO6KeD1Ly%L z^(YYPagB5V8iMIj4TVEmidy{duXe?Blr2d=1; z9mX%Th(m#97p<>aD~*0aVZ9lcVi7MbB`qs3JF;@YbHo7ETE{33RCstrx47Ny`pXBv z;F9W6`49TTZQcnB-0>GEGf{%dmCSc$q#Z){YxWxhd7on$bZHCrUfxg(Un?qaBAHj5 zTX)t`EhBQ&6&9U3IJPo7czMTg&)AXnq%$^sXX0OAU?pB8W$fUvnOCCPO_}^u%R)kE z=MMt*K~v{wP!SqM8>GQ^p?bgVjSZj5`UZ022~os$+Y zNp2-*0Pkg|T&*A3Z`mDQHQ3*(T6QyDGGFF#Tu$Re0TRR?70Y`NSEM<^4j3)xKc4%Qh21>sgSlKB#QWrP^I~FgU^W+cD#g4akz>5k zezsOvMwSuz*d3`N-aU@4YIqINF3_nAAD~j0W<3R)(qO;R^H}H}v%b5^^9*!qup^4^ zoyLUVG5M+LqptfK@9S4F$`4)1HhNHVGOUzH$r?^n?3H2^T1YV@w7-HIjCp-7LAce{ zj|y|#vZSfG{e2jR1X(O7zv0VO1v$uFm^Ve%W2j`+{4vnW+2{8gh7aoG3^-V?MR+dX zj>5D)M#~&wHa{5+f7^NNILyLHVm^9$*+gLO%%k6FB<-)wF7&$+Ia%j7g|e~{GJ{ZY9Y zu8F$5^{q}U$}L`AV?d-D831|!$!7Qm#}`>wnP-jGr?aJSip7B1Ingg^HI*BE44;@O0frfHxEKMc8|w1<=?q!!Ra0xySV<+Dnn3| zivz^&=qQif=Ntm+PqHaeycPe>jl6R?d1uG{eE@)(}P}MvfIl@Y+HZ1h}X8# zumJuahfDbrX{!GIc?~;BzfbMVR`4aRTxY+%%g(?RrUBwt4xt5#XKOAziD8&E$F{so zb@h}*^T|qW&!eM`=wz+;8_%t#TMVGxtdbXYLG%HKNh41@dqF9YPY>%*a_-a`3>`5q z%-TPw;x7eLlc?`e9r)?>K=GJbR=nw`cHMeuk`+@KHeMA3s)Zwt=F`h&=R{h25g(sOyP0x9qZ{=#$L$$fFN4D&B zX75-S#`p_r=*TEEs6}<5MrF=TdACMd;#G!y2?X=3^d({7%kdrfhWkE8fYPc;P@g|h z^Benhm7a-_aMib}Y3=s(xEzUzM6yS+a?ak0i6`Uv#52lzlqc{LS=>k>$*wK`Hq;ex z9G3u_Rdcw&`?ws3aL+#)KAF8sY}>?*)j8B~rKBz-764@I5ESOla|X_)JT>d6CUx_O zqNr$(X+AHencP36YWvsw-wzX~RY~_akd6{!#+L(Sj(;?R0h8d(RdXLB%UVa}PPGx8 z(a@mTq#arzq$k67Fy+h8W+EXQTp*_h9zC8T%el);C->Th89qS8@LE zXs6s{(_d|oDO@$nxQKq(dx85b-$cjZ=6t7bhCRN=68gpUz1anTgULU#_E{6~l@ovk z5)}byD&NB*4E6A9kA!*0Hq~51MT3uuPXwePNnHphZ~r$#Mv2ZS_Q$~3PW5GAOxf6Y z<$B$Qc-1hjjKvR}<(tylR6BxXu%ZE<|DHY+u_}gxNA;<-=Q_?djIxaK2q+*!ray+a zvn+yn$4LK*+oo@_Drcgl&uS?r7UVp<0&?k(=x2(Itn4X$85%2VIh%Cux79Ryr8(5$ z{gJ*=04yrBGiSd}mIwcj(9d-LFWn|UA_;A-9jwMZJ4FAiWJ1Y|)71B83on2QDxLap zA2WfEl&NT%UW$6_<=i zKcr5q5RGzOuo}fzT!EHrY3rpRyfb8zCSIGIo=e#?+pCg|>(M5_s~1EtmLc^AFd64S zuwgIwkpZ2`A_qX*u3fR`3Tp>PZ24uCbcZ=B=ItFh9dmCK1GA!p9tb&uEOPKJKz|6~ zJ__0+neE+DI(H1gITF`U!y0So2vimd|8-+U$ewaL1zk~m@ytinE8L$$FHUW|WM^ad znndj?7SDm%HU3Kzf1RgOOqy0%@er*$N|eZM_;Xhf3LPsXH*h&;{nGfaPd+A4)Ka7} zAoRFeI(J3?3+4S5HwYY=YG0@csVkGHzXYtT_gD7|ru)ERR0j&iNLob4h3j8+xjO(E zg|Q1{ZzmzCUHM#_nr(C^3Hm7 zi+EZvTd;q9dr#_YpF+h2ibyEY)b%0j^~$WOV#1y2RE2{OP-Oa!#}8L|bGNM?%=R}5;-Ygq^4$<@jOfmaa1Rj907ji)zkWv6jcx){3OF|(Mfths*7L7CFH<|OZ0 zc{!8Q8w){wK+V|A*d#Mr9o$P!V_?hHHKlKxDVe!@9#f{wX&%IOso;!`pSc8~<56xN zuw0H=415ANoA^l)`0C|Wh>?3#p>oIan8W(^%~D`|@4=YZ#b^$*zg-z2!6{#YN}yO7(?J zTx~FaiI_3;IQ^Y8+_wclnm1|A2cULj%YT%7f-WaLaABZ|cfInSkPx~N_OI|)I;l}% z_3XqYQ|M}gJTSKy8vViy#eHfJKhlG$_7p$ZDTA2T`+Dmuzo;Dc%aK_lnUu+?!?SdyI1f(U`#NP# zgs$;#F3H?(!+(dYPs;uy-{41^6GFZ_ErUEwE8A#U$0)Unr(xW@n{^XLGSRvvHf}p9-O$w2G|KyeP{Ncmu=V^k=e+RB)X|Ed z#t_|rVYsTsKe#@sQIg0$cd2VEOo)e((QHGVW&*XL<+ZM{blYkrLvw%ZYvI|)j%w{m zgKhlNgBH}MA9V%3zy4wIZ5QI`ZSR5Icvi6=uwp*`z%$$QvRz`&7-!O!Rr%NE6c^$! zhP269c9;0>mlQttb>kBtWmLIvtD5oZdTngV zNlQC`67&Rpk|@Nz;)EaL%%m-+@(kR2zk#tvb=zi76Rca|v4U$?NVHGyHN!VAb>VwX zXN64L`fbid`ca#9!15|>89bjF_G<<$cCuQj2o}cEf+3z<>~y|HhSP}4sZJ5CXUD30 z8SMGc|3Tb)2Q~S%-NFF`3nD54N>%wGN{dJj)dHwArAk+j-lRhyfDKfdNR!@MARsNF zBO<+bNC-uGLg+mtIXC(|@9Xo;H)rO|oO#cG43p%(_ukjO%35phYw+mBv;d9ULCAOR zEL53_{P2O1;awWV5925M+OJ&Emb9}FZQlnSj)ba36tGtvclDFi60OV?mY9Crv*eQ! zHS_VxX^o3#O`@21?&K}R*E$AgKkV4<$~v3sfxpz4=yVuM{4tA6&_FCsR~lNOWe4Mz z)?&E^cM9k zL6ATkUO|J+c)~ z;1ZsT=ZuHeBrCh7*ZAcEfo}CL54wqY^BSR{?{?p#)&|0TxHhIE*eyEQh2vuJGxP_^_ozdkt@w>(%7MjB>8P59qp+Q=bz-XB3&66H~aI-{R&j{ zI2&;Fr!sasgCYNn;-~93`&!i)={brcru@`7r$)2l_?bW_fIf-IvKZk`dzQ!MwsnGL z>D>B=IJDw(iAuK;poQg)PJQ@{>TrWS&T^F2Ku;4#Lt-AdsbK-g z%Rc6367D8E_M<{k5V>C7YT8W}X&hc*eenBbD8Sg?U0 z2K+UDC=FKX8JVczs8W$)or0(Y4y7L_;4x^fGKKB>^*41c6+KWHJ3B%tR^1i4Z@m{k z3LRSw0dVg^r1lzEu9r3>yJBipP}I*OO02l7wRxo=LA|uDOo?Q~9cB6D$yNbIWbQ|i zAkma_5l1UDuo(V!vX_0RymK$t@O`|(jXanf!YIL~b!ar1NjT7y_{^L0B7(+$I+jEF zCc`AO(#?u!Amjcj*C^=V9FZVVyubo--tQo28?iIJ$pbrNYAIGgtAG#d8 z6BA}wjZk+Ldq(xaRW;cR&q7=r{R521@L9Q-qG#DBBMwj;sX)?ihY>9|MPjNn&k^$U zTXnlJp^`;8{Y1=a4Wv%qj!1I5-Ajr*kOVG%_6rkpG6C=55Aa(ioMj9$yN}8aQDk-e zR*{`;4JENxR)JU(vdZHOD@#^kBN5?F4sj;wQ?1Zt*Y2}7!W|>+P~a74^{g#2eUiJk z{HsoDnVmh3L*m8gTO2BrEO&e}zn!7B>GGD`AUExuXc|}h2i4myB1A=sDbRwURXV`H zN=5?tVAm|seKmAtHg0W&iS0>B^xVSMx!CM00dWaqrD8=%H|N^Z9~vYe1OdqIrp03x zMf|r-jGXI~By^r?u%hXa&vfGJ=i5;Qn;j`po3})dvIGy6BV=E#?`@XQ!`6Jo@)(SJ zxwjW`7j}ep){0Z3bEisP6rV0k^)u3X>hjMAhM>B)&dLki3@x18WW)N5paZH`uEzD0 z2N8acy|mLuXSj!sCQIJR>uvc>$6AIy)0ZFbF~e>!63A;QMoT8Q&ur`o40lj z=<7_s6Vq!qNn8hO6tM)mTZJ^U#RUgY1E+A3?BT$psx@Lm&scy*(TqHbFAE>fWw0}l zy{*@&KN$(mgSkwN4nvk4*TdgJT7o^t91n}D=_89zzS$~RYvbRkLs38=G2kZn;|?42 zmcx@5_6%HHQUw_&Kfn)uw`asHfX{zwmixt>Fc<4Y#l~QgnAI8pMu%=YsGqpk{<1QA z_Th7w`|ZOx!i`I3GEqF&y6Yy@q6Tso4C*Y}U_DA)RNK)&d&0r$ndT*nTDx&vORWas z?GiW77JVA3?HZ+Lbn>R}U>2cZE>NssInE3Ex=d07XC*sZuRn-{@9f1U%MM>34q?f? zcjro6Q4D?dhWGY+k6Bk6iyscD@fGxG?9@cN!?D=!kTKE)+1!?M&R=i|672qr9uE=d zg-rjtMlKolY7D8&&-%Gp!bVf$2hH%lpGPvOEI-e2hU+`a&44j0nQUu*iQPW=9}HUk z9-7+3RnvC9)DO}g;{voZb!MomV0Wh5i{TK`ws7=Ah-Ei<3_ksv)Nup~{;hbu&~!>Zpq1Ij)9!`jxuA$RB68>wfI z59>GWeYP=xMW^^_S5JByaS?YPRrHwh^;PX|@ol0N@?k><;kBMe>IZL@8xErV=KJy{ zZeu>%SGGoTK$U|ha_9O}NsyyAO`0w9%g#G(*F89nY~}kY->|_GdqNeA^4llBQUpCI z#Wh|#b27EsV2A7D-dU_4o9oHG9Hp1; zoZ_a6Y~9(+2ef@NunS2yV3o=8xR*6~L6*saxbL;3wU+Zm^IN9z}JC&ur z4Y=I*&#-rA7IZdJhknkcGVgTJ{R#4`MjyN_sWB*k!L%}`b?<)jS3>72c{cMP+WVhg z1|;f?7Df{406boHVPWEo4eo+Ot%IM>ogGs1+vQH-x!R$hg%;?8rTV?9?A@k;cMeh< zZd%d`)whJ&xO&OyO%(${@fBlFLSe0|~>pU^@GOImz7;W`@t z+|X1oPS+a-fMQ1q(B-wbwYAuy7!TnrExg$*2}5>*a|1Qe&daM7($n`g`nZdJwDLR3 znD4s0!lsv2u~WI<>KLe;vP71OtxDd`1>ER=nVMPTqQ@!R$eU3eILj_PouS1-@w}3j@1Nl)=VZ; z!j>LRNzObMc1mfq9SFuO0}W)y_v%hxP(x8euJ*my0$NL>6?;#tgypl?vkm@o&rd+@ z1)Hj?NwF9P15VAc{Co|-$t131bSMZK;3`Iuo7>X<_u*I+4eyljx zIILaRibk>r86?LglzWtSJ`z$Wbwmx7_}uLKB}=os7$nnsf6?er`Z7u(<0YxPm4i|a z8g|SKn4G_P-~4`tY)|I)yt035k?PsCuQ(L~X+ynlo3Ym1XNys}8&`hi3OzJ2*sotuXl7?s43PEKz}2VMxb@BMCR{DgqS}^m?#R8@ zxXI@_n{3vu&!yj~J2)b@hpa7N=TUiUr+zaKpfNlSW?F#GR&R+t<%ROMrnq;0IMw-8 zFme%Ma)Wogs&?I^vi5ExdK<_&N&1u?aoJ?eIcyW3HrOf@<9UCgnzmh>1H>O`fDAmh z`yPG@`vG15l$}PdM}-ElWL=d;WOMq$rBGfj`O)<27p|oI%|n1q$ghaNYSh-Y%ZEFi zY@WQ#p5x9PwJPFM#@Rno^Zv6;palN%%KdR3CvM2Vt~wX-x|I6i`q$e6m&prbdr0kQ#QMx=^&-qFPAT^F8*N)$`Op-&v%4+$P@VEPnE~_f@AZrP*&5a>|Tp%u56l zx4dt^c}iXOOPuDzGN+ihk>(F7Il>PG%OGI!@eu`vQS2kUqQh;De@GLr5Oy@A%k~4k zcU2cik+YKAZb#kgU!S*yM-`m?=)UnQvehTLeqwsfTPxhj_+}@KiTAr+2F%4NS=woj zy7Zn|Tnm${RR9dP|Ndde&kdHXawS89s1lBEi!rB>FdHg{vPCD_J}x%_RX36_&4Z4C zAO1A)oddPMm-S9&v`|_Tc#WPeGvM>&B6O~y;e6dKwMZ@?DKo5}V z^AVrx4K=PWUT{XveBvtBPpQ9b!_0XmP4qmgB3}Sc1hi9Z%bRC-s_a^&N!4x{`Z2cE z&8EQ{3@XRR+Iw?YnfX#xEa%K+$x?hpZz=-o_zH6c+IStLBU^?C08S&g(?FL+h3WTS z*wFE-?Tis$0QI`tZCNc#LijtMXl%nRu@^7-PpHEaYl0NNnmb(|K9UKZ=w9ynP}lBG z6@7)PQaVW<`{M0QAgje_U5g>8j!Y(@3D2_0oVDXgDQAF5`M{Xgs^RevPc=GKI(l-O zd?DaUyAkvQCK$o@@`tb3xZm1tH*Sc2J7*{4;^3~*?FVOr-Ikl&PV`Cd)=gSh%e=16 z?$iQv4>gW=h?l}|oQEsb+&^`ZDg6CNBdu>^{j1hG zaLND=wZJ;q9HP0pbyFYci%K|Yg0i0L>QOW+JA-9VsW=oGf~MDj#kpNYis-8uD5-f#*P5v-Vc;k^keOBeLWs$$EHq@roi?K~`9@%c+`o zjY|)+p)Q_0$vC*y#yYgFtH3xk0w(dF_gtLpHAP*E*sbbawS1F`J3=%IUqah%} z8LnXQh;Ioh_L%HzuS6vP<${L=^uHUeCQ5=s2SPcbD?*0Kq0p@_85fqJZSpxrsFx*z z&a0nCRJ2}vsyZ;j-oWhee1o!Cnq%d!Y~M@Cr?NGL*PE5A;aG%XE0Q^p6@`YW%abfy z`}O|rC=H=9sFE+-_rnGNL*8?4HP06{(G-l;C2AuIOPS6V$!^n63?0ShIO#+|6nBxj z#jOiWyE)@#NK!rYqwmnOum)oV)4~Qx;%-_woPDpa{-zbsRcXpzO_BrWol`%E_&j`v z2J1XFU%j*IvG|||WO!kmTQ_8zo8t{t(2wnS_9c4sXMwh%u zb|<2%s^*9MLbAt8TD-Zl`}}RAdWyOejSwx!mCk`9ayICN9&O(zeXx|nrp8 z>gZCqu=mNNo-9nZ^iCbq8|fvryh9w)zJ?xAwh>XK4~6jBQ+jx7YUgH^xGa2?c8);g z{8WG{)OYGbVZhlNf%3N^NZ+O$8VvTFlfJB(ZCf3FobcXKA0)KF%=C$EN0cmC=#dsY zU?GWkz;uP+tIoB)P&`U$N6pouJ{UKt1X#wc1=(_s0W=HrZfQ&1&3<-ret?vN(1?0M@qPRMw#8}p7?;G@ksm>sU zxBJ2UTZaD1B~5n_5qnx0`?mDFn@GQ41LX;5D}it8-gk3^rvF^U+8Sv0*(G14frv*V z^OYp-fE3H`z9o8Su`&g4$eTmQMWvRhnCpY&4?Vst4F`o?FZ|sg5w)yg-OOd=UZ&XgQqTf7Z_R-X z(Qy$6s@iYc)~{Pi!`t17WwhK*7I1Ao(U#iQsy(}TBx;usK!(Ay@9Zzh=P2wT+<;yc zp!4sK`HR1#duf-C?)EecIaklGS0_B%X_{)gNhJVMy!*S$$`J)qGdgv%$d9sj#LVLV za{k3Xs(NDn=8ch_w;_z7$nbBUKXcli_;|u0{i-V02l2Bmmt?tk|2gl1`SB6Zy-Im& zhSNsPeBnj}IUZbpQ$nLb7>}H9#mu(9 zhphFI%x;q@f^>A>dlO#veHKjGU*q}}7 z?&|N|+i4Eavq2c>5Bp3RA*sD01W%PMlKJ4X{Z3(BzVv!{azH+A$P>14wwnr6>;3nu zSoeawB5Vlx5tq8VQYoo=bsGm4l$`yuDsm~RJd?k~G_Ay>EpjNmiIO*nyVjiQBsKEE zgD49H`{xeIZj|j5kHvI-R};a zCbb(4{;?^>qvT$SZt7WI0S?U}B5-|!C(a8>P_Wb8I9MBU-wP-pBu?3e8N?=p=Z!i! zsVMm>U}lRBid7TJJLNRkYc1WHDEYWvf$c*x`-+)jO74h%y(Hp9+xI3KVS6q`)x}&Vfq)78! zKWJ-PS&Qt4^!};$k7S)`war+3z)ncq`*T5)IzPv8@-E)_BY_z z+}%9KiP(v;BJhzG7iG%~{mQOEc%NCS^zy+Px=_3Tm;}bZCt+AL5V2U>5{p@1BrMG- z9)xApsFaTsU{^*1$-gK&Uw$3%CAf9CJ+v6z{YuibnNIbrs&TjrA`HhA$(O0vzkN}G zpdyV<<>Lad123nKq6Q}$>(+e<*E5TOC!PHJN#mm5e@g47!iQNY7S zrswx%boY*&MYkT%^qW8lLu=(N@nog7?eY1Rm#E#;qE~T5Fun14MfRS~Q#2K6u-T`> zGDJ!UKY7+HiK0hBNlqTLdk`oSU|MRBx9+hypAtEC7-zIsQ>a!{X$7=AzNR)GF)b>+ zcJnOXqL+}w*T1{%y;7C93|2V-s%86o=>Wd~Od9;quK}`oAY$SF!0gESz2~0L)2nQt zb*;a)^^FvO**$mzIM~4RnSfkc@x?FTWb0?}pXWnTft~+9@R1VMsRIr@OvA7ZakOdD z@3R3aQ`y6McA$F@K4}=0ggb}K+xhh^r&dTiN8G(ciNQ+23j?#09ZaTyQc6d10%Jqz0bM9a-h_7+?Nn zJM75+)V3)`r!wh7{?6V!KYT2|MKo@Lkg+&)Xvx?Mu-3ACz$z%#d)I>?B8dKHYMFzl zo$prvbT@umQki2_M?3!2VjrI?%zf! zzY~aTK{M4>?cR~ndZ(ZdfL&iTE4&jZ!PzpR zNNAlIwB<=px}ffyJkqD_WxC;p*3~OoaFTrENxk&T5i;PYqQV!wt}I{GD8>U!x%X4o z;e({=N^srTVA1M>!0V>uBtX3?XCc4Xc`mNB&MuqF;f+;N}P3z z`E+hKtDa&0L?2#vzV6*O_z&5W(ZhLF82Y4Eux*@AiVe9jnHCrn%kM$erh%Y8gwkEc z=(@&7RAIs0P_Xf_LSTBn&17+qG+SyE)I{Ep-cjcZW>VzVdI>euo{U~^xH7+gRXR22GZd5bo55>+@j%Rd~hW73_h^Gyz z2@HHboCSQdcgb&?G#{pNpKlak+oOYonK`*m*-^eHbIX;fDn6hQm_D=-WLIP_VbL9DWtL1CoZc_juICYv zLu|}c=1d3yM#O&{cQ%`GX7~12<%iMG@C9q5!IBNvS3lj1BU{*F&>lVIrWhlO_Ug|e zw0+Q*kW!{75kHMEXM~pmu`YkR`+Fw? z)qmNkTioM^xNU!hU1SswH##s=kjrEU9`|C%J zW&VmE`u{I}WS$_ZXnyZ4R*ucE+-H#O4*n$fKeY#byAFUrYxU`9_i4m-M~a6ps7?QG z|Ek{$nvF};sjFy7^n}mMvQ&6zdfV$yH%dE#h5IAfCy%H}5c3gd1w6NCP82gQ+>Ud1 z!3?nxLew$zRE)Hhi5nlu-r)pxaJU=W-U938hOFvRSMdkQZ^2{!>p!8)ju6B(AOrIk z_&W~tP%o9q=$7w%?(y2o>r{&@3)V5x%YbW(IEPrux`E^n^`b(!5A&^3(?8poE0DW3 zL-D>qp?JOMA>P)b89UxZ$aN~m&!I}@KG-aJxl~Ri(gYs;N0bIGpL>_5&AOMLxBvOD z_JEg`W@-F1LvxV0Jif>kaeGKz&E5{JW=phs{ME5b+UchlgycZw`Gdn(Y@|4SW108y z^Ow$eb7Bs)yx{mOtJF$;rSc>(rUX$OZXwz5UK|D_^GT~%O)aR`dUCRP=o3Cf) z*SWIbk(KlJMq=U#cwuSB%d$_iuWxNd*JL-Hc1yN&YG?Fys7aOcUyfyAIDAy%hG?z* z26R4BUBjQ~U`N>!jS^|_-6dbHRr|_Ppm%7NhG6a}fioJORklX98}iAFWSoT%yvvvl z1io@?v;Tf~AFA#0YWX6qej|dD!6#hr7i<=xh9gRvE`8-vW+hhkj z_TNXFyaEhqCOwDc7y5P~k9E96Je-rClb-i};XzPc9o4&_*gAx(b+~F_r#|e<=FnX_ zdBh{LgzyU8TY6~{2A?d{*$JnyBVF5J%(6FpYkkg!IMQvnmowf_^eFOzGY~AEMLs#v z=M^v%#8{l8nd?9D6$M$Ik%MjcSnql~(iB@q31VcAbW{C2b(sS~?V42TAoAxqm?|DK z2I#@8YPxl%nz;dYTNO75s_xpJt*fu+G%(gF(d6VY{aN(`1c42?HY9YHE^tqzvNERS zGTYu>B<^47(2&Z8s9^@s%=#Fk*J&ek1D3%<%xbo&=uJ+~yU?4pz+LIjUQTr>j#tAk!G#6Mchho2C-e8U(w2g@LJuGU6P@Q<=!1j%~>b z`Ra_IQrBUwx{UOV%EKOxC%PL}oK?$|%&)g8pPlrUV{cSoKlq9#3g<^0=RDRIgFsM0 zbiO#Zsdnr4;!lTz*x-b%5e)0DpUXCUWJG2AkekPFt6wvOuFvi5sO}4-D#i+DO_*eV zIxN|+)YIg$L(Uv^VA35V@J-ScM0@AGex6uURM3&+>(v{I0&=UWs6o&n!INS9uyZn+ z#kuHCpayMKe7e)^K+gbE1MF;N4<%hIo7t%<1Si?4d&wqF8-=!y5^9fRd%qI1zkYvL z9iM!WRe&C_5lJHuVInbfR!$RyP>IuFeMR!#m5)~ zO1ZB=vlMz>yxWd?=|KcrNTk<_QjMS2jobxoF1hwLP+Ck8GSQ%|!rrBuTk_k#;hyHXLLC#KCpAcWkUYPnAW^`;T zi>K0ZyA?bWb%!US^ePo>aKRREwEM&5DKQTPS$IRw&9UvKYg-YO#1Z2~?&%^|Z$da`wrIZh8mUZM!XC4g3gDe z+XMvtyB`KLHVuf*75s@7_QXp*)8gJopV%bns8<}Q+)HI!fA}hRmrq=2i#w=!=+3RR zY~))maJdku{>nQ*kQd~1j05=v;wd)Y4ae3~IOTw>^ik7Y;O@aGl;>sojuD@i)CQzQ zQNBZy0`jnoZ|ftv6-v7ohrD*b;*zShWQP0Dnpc5DP_#p7(XF)1$euh@Ocn5LZOE}s zJ3!ZLLQ+A7%Kbr2%~86-RzmGaLB$Rh_l{By6bl9-Jree6viVkY z$a+y|jqDDSN~&!Maqh{*kq9J4cSXm(OEZ#*P4;Q#z)PpkT#7PyBQN-bjQ`UO=&(so z8*8D8oZZCBh&lsZW_(3mMKk9H$K`l}KM_L8h7Ei}`fr1~Lr1&jRPI(r zK;)q7$Yuz3pA({xqZ1vAPSkUza4GURA@k6aJZqCem3vJDwCM~scjmVv?-{NKIovw-f1Kj^-$ekO2%hRA65Ha8~)2$oWz?^k!r<#D@i<%s{w(o z+f8!vO%)GB&Um~M+rH-{eF0<2C#VS+xyMYRKg>M0S7s-HVNujxkZnMd&QcI{WSdiPLBgD9Qq0o2%TRrTE3!ilq$7Z?#8~Et_Vfms=#8d_G;S7<>oD5 zndz#Q{i?;kj6&`f7=4*d)&T2tvnZatKRMm@OU&t3sJN9(z+(mFKyGvE({`+MeXFPD z;NjkP#_G4c%DT;*mcz9J4%5+ObM!7u+0iOD8C(5axKrASu;1;(uacj7vE z*QzYC5^h&zrg*^?!=bA(#`V+LR2tYt#A?XtiJB#ZL3qVz?cilQ!lbw34 zuE;bud_!D`#JB@&=wGbE7)w-l@1B$GTcJ^xUXu!bi;##*rk53KX1s2XX{hgB-dfF@ z4~^ppKayj<)N8UPj@ivA5?M}3*i|kk8sg?()2k@vx}mLCF@Yp$JAd-J3U)(9Pm~&X zZ|Vz*tXFf%o*zGT*tyTqEsF*oZLCnao8P( z4hdW_boN5chB~^n1}gsR_2<4AcnAD0ukE(+QgR->PtmnUiB41?#mB3V)Y-#dy%&c4 z(aT})cDEdwlwUc&FP70n)V>SHN{iJ~(mubhg&SlC)E<9AA?Qq=}Powxx6&T4CSG6Kz%h;Xx zXlw?N$jsLusGSW9{Wq z)HHiKn>g=Ezfhxn5I)GJ7R!>LH}^bS`<+5n7%csJ_cr=|W?bTg`C*U5Je*v~hmi6= zgsyS4KLPF&D|{dq-j6L4SZ-aCX&Qq{fCRA@ z-=k1uhlmd#k@8H5Y5J*0!yFjKG!-Z5dFdlq(rijK;(~%&>Y?t=E_yNq{=-2Z+h2_R zz5R|26R7RY-ZZgvq2BMX(!WowZYIb1r3W^2XC!*#PXjR1vzWNagR`;IUjs7Q<9U@O z6;fQx>QNVWm0-xAEenOZ?$@~yShs&lgE2jA*2IjTT@r#moUh{qtYnJZBDBE9CqUCm z$5`)N2&*;?P%6%4>$3r6Z=inA?}z`cluCd{lU;nc=<)A*l=e^hzQ_a$ z{P7bw({$DB4+Q2ee+(MS0%Yyx|HMb6edsaux&3_bxDO3Qg#Xp%N5pc;pL#5kt z-frdWg8@yZgiozvms9nA<)gadzK+-k=JeZ^^%$K1os#@RK^&*PKcZ`_1K(Aji{(?f zE0dY(l{8pcqxEsj*0K2JXtj_yd{Qfa;1di&`EDY~C6@;OwF5`njW}WpH@(2Tdo-YT ztbdh69m}HMAJ*6rZZ6e$Zo9>3wA9XjTApih6;~!1_L)9|4LME6u8r+r-_@J}J-Pk& z5S&t}F5+a2vj<9DVU;l891}kHIz2 zrHg+LV#_*kAE>&Ep5nhrI%B1BGG2ZR`|jSsew`#%)HWk$sIQkXAi1|R$9SS2^yJjv zkM2pO;u-@%b0M{dJ>ij_x~$w!UXB|}r*Cws_t-4Yqi8`#BgeSPzX=fii;5VwzQo5m zzWlNLoiEe?{ggoT#j>6N6YV7GVKBc_}71r z=Fy_)NJhsmesM2NU-~;zRBlj3Ie*XGPoBVTN#3AdLUYRKR^%%W8}aKJ)|z@uH77e} zALF?CP5ms60cBdlM)u`Jg%7fwQT9Wadu1XOtIvuDB)iEy&@xK%X)p))Q6e(6TmFvk zb`6YQa0leD>hr5HR)J9lGoqPGf8% zYKj9)YRKO-@kyS}o;_x;@_?PY5+G2>F%=DSZsK8?^ z-tBCvC)(xCLN^VNx%}mfV>^4Sf8A|>oLh5I=41Vx8`Hb#UslXL`IBTP(U}nNDgb%c z5#2UlZc)uE!B(HxH?&dO6JDvx#FbKJ<+#aC@Qr zbr~Ri>n?SUYRUsv^V;v#{Bb(XasQ|{fGm1N5wjkDyrHJ*;|31=*z{X#=K0ZMzrqzw zEkVg=tmEj@usicezt)lIxnu>S^GS`iy`pq|Hp~aO_V~`L-N@+!$k=W&~H0}e(PskOH_UXVRc80~+6PDoudVw7=5Jz6C6q zJ&Xi^^FOio4~H$tm)u)JfFo``ed=PzKh>X6KbN1wJl-H*v5L4+k&KSJuYP3)((IZ6o6z;-fno-m0>_?G`2MdjQDD|G|V>dn;tdo2}QNN)E>_O?U8}g1n>;UhpNXsuQR#l(*Q?v&3V$v0ARh z%~%=)Qoa7)dnUAJ(fo#(H&4phPfQyEc9S|OvxZ#;%APc!&piK;E4Yaug?EsOr$0N| zNilV9e3<)ch(dp1KhB6IX0QCu(`X{U`MR8M@-%ALx-2A#y+TupBr zapV^=Ehe1Ac+}UZm|*pX`k{stjK8BZAW!%S)CtDf3*51%VN8Q; z+~Kx1evm6y!M9})x16(?guzVjb~%OHPo=TG=#dk5%rS7DjJn;aY(b*Oh{2Q?0AfU- z>YU1tB)5C_CC%BAO&2C#cDRzuLFkFx{;$$bEjvp4ib{x~VP>hu;La1kWlX=nvtt`Fks_4eCyPiT<)) zsoBLm-TS=5F){X7mc4y^M^_b2nD?zKpOhxO4;EjtXs~j$x|wWeBi33*kXQusn-(vu z>d@ps7~^++7GY(-!-%{=*w2(qx?c^#`-@@>dOt`U`sbaysp-DVIq#8PeGaWT( z7AnQWcY>y`{K-$j0Fx+oKtl@HxR z0LlCKiLFSG98X#Lg8PKJrE4WsghV|q$ID3mBwR{^wi^l%n4&6*U^mX?E)Urq|MDQs0?4b{Y-$^o*sU6> zZF!G>z@CPScJZy0^MF~Osb|rX2VM4( z>cK<{B|!)oaQt^bfb^OhjOkn~yi>J+2cbFq$^u|0$W3Gy-VC^uL4 ztv%66;~$kvyygTr#=PO4(Xt=REB^^>dxa||0k44NPBW-4z@*6;%pP2)7-lQc6+40IA2rq7uK@MYE0xKd;Ox5}du}ibU3ez^U*oOYygDv#?ToH&IeF=ke>nK}THamd z{;Fx;2An3G{9*4)2BB@u!j%- zps@VA%vj^5GSE7*;p*i*=}cd^`<<~|S7mG8&ZM4ciD6Qs??J>=(HeET{RBr-xGQk* z0v~s}PNhM7v;nx2ty_!AeWFl6ziECsR3o!Sb7%BQ`#NKAm)t{-CrpxtI`(GDFI8;E zFFceCs8hJ19rT`Y;fuOwxUL$^^(|Z+3YyAjU)$3JPosYXx6`BrzX?OkPkr1^0W9Z zf1u~lmNc@{kIY@Q+-=lptn&HaaJC_X%_5pQ;A%=~@1xG7fGUt7kd-Cw5)MZw6RCQm zt&Iu~0KB%xa|&@BS=Ee1gXje%9;|AiFZ;vnDS3Ralh(yfQDJQ3{aSM zf6n*B8SFXlnB`MN+w&nBt^JHXs8yZ&_7N>_Gn=AV7}HK_I_l+1Rto?prbqh4l6>bq z-qiKD!^_w{@5(&9S*qaeF#CF$BQC}U8-An0B-B=xppV?{j037DGp7bx@xt)87#$~h zuP*`XLIp#Qz=|G}^9137P4W}G0;?d`Vq6Q0cmt;&@~fV{TbL2LLw0um?z+}!<)rXaS*`8UV=49wK{dOo=M5A8zvaTLR)_;;O5ea^<>_4rqPlcgj&> z>@HvCKQDUu6vps%^GSE|Yopj7Kz)A_@)=m+2fLdR8-|#1L-=xNBycjODS`s z_E<%Mkn>D5yfTX?N7OiBWPHn#F^x$w zBHu2vYH#vX5zrvLtp3~0w~jTA&Q^T-Jo-s-%IJKTU``>JVq_P^S7>vS7xcXoATc4f zkzX`YVq){48xx+{B$uJ}RMC{-jv^kSbX2W%q|&IuNfZoxC|m;$J4e381=9OdmUk*G zief$_l`D=N_|(CZp4Pu^FXsL#G`92DAR42^YGq{fW9B_wU(fEsS8}xRV)%$>I3aXp zS4EONpY1xV*{aNzKDxt}i0!uk&gyr6GepsK!URdbN3-WjZS!vU4?e6l+DXAv z1)l$x2a%+%zEyYs;@Nk}tkadRt@Y^NU{5CppdJjHo%7w2zD!kjg7~X`po!$fiCg#{ z5&}3?VA~v;b$b+*Egaykx3IF`0$L&LqM6PjwWEB&hv(wJ-UkCqqvHH%Tr6|@VU62Q z_pHJP4E;l&XnE2GD+ybjaKXLbZ>0hX({;f;O|%XyW!pMiKK+{Nzx+5*Wj|3FTaJ}Y z9+{47jI3~SoI`7ulqbB_j;Pg8iv^*B;@d%Jj^eck-{{KO!$%G?9a)olfp&E~0m+K) zvmy*dbM{3%1h^0;(?q5=vQNG^8Pgy(I>TXYcz?Hcp%T`U?Jb^`Se%8E>J=V-nmDqw z{s32i`gmF?L9)O`8!5SBeLAh|+4+mD|3;bzC_v&raak&yQbUAF9n?IMa`aq#0SKiW z@%#62W7Z3{GhPbWL~tvP65LeZj9H8$o2jq4Z9+&$ zOZq67NCjl?hfHjI#}p)|sIVbJm#(j6$#Sb^9b;r%gp2SUAfNwy@FQbW!PsSWt1sSh zfh*P?oAWrv*><2k!s|wa+_uL;NDfeCi9EqsRK)@JJexv(i=zHWn_V#n<>0~7?@A2* zF+-PqiEJa&uds+FhOn*(UK6@$wqTf=?bzdy(C!=gTw@<>Vw~})XYEEAgQ{t;ml~0{ z9h=pO?Ti6|dcy&S``?Pg-fNu?9YKKfWX`n_VUf zwsQqQEQs&oB^Q@Nn#INOLPi}9*LhB@>btpo^n^*y^t2f2#IrnP?=+d#>0NVHC$@&ppU=3myjPv)?;Pk-j>KJDbtQ|kIkNU`% z>E+`P$RVXLxFjw0(n}!;<1`+I9l9cK08{}>qh7)FxvLFm&yQ*~LqqKkoz z+KE7Y{Ppn8)C(I;mfPEwVE`UzwBbUyxzd=qI|j&2W2HvRrY}47tpwrk8c;7S1NfM* zzJ+y~qo!{X2s%RsG~$2P;eZ&T{JTVY(OawW*5#d)x4cppvB5fqNOhHrrUWQX&~@CE z4f!)jL7G?G98y*C0MigAllU@fy~9sVqh5T2sfdqd3odFsESAhor+Q~ zUDVi%3MUhw!;d{60R5@ZKKSmUCN^@U9dx){eyCBHMpw=xuMc0v%qTr}|LN|k{SmHa zM96c9-+FLPPsnxR_a0%S9=+qQ)V<(cK~L=tx@r9Pwz8z_lXypvDe2Dlb?7vUZWzwu zIcfiesvKtU+}5RP#L=bGDtgqUs|( z4v>C=Z*D~c*P5^O*o?{VKf!FC>zi@JyQVXSf$LqpZg1I&*?c3*#bbSE1PrBvsvP) zsu)&h0YqQ^&4+_o(>I*;TkR9Wc zxC85sTZXaG&GwBRx{iwe&^LJ#_Q-0g)Sm|6?}KbSsDd5ONE@4}S$D!;Ga`S8=61lz z@sZAvVj!RkZfoAw&RlVW*IFZ7f3*GmTP_7=r~Nln-W4-ho|*Th3|4$RP=6t} zq|#i+xi@iyf4s66mmNQQP3P}#JG#a0J@9P3KLK!Uokv0u2F<4`f7KJtZ;cEr!Vh;p zkRrad_yow+1>CipC*9sTT!awTzzcrVeeYbhVj6ceSWmipnaKsl34l(n1Aaz)w@rK0 zs`4jZDeT$5jU@9;pg?mJWm&; zJVsY-IK($ONqEM6N{7mLtn}7&uNKv?JzAUd+ZA}Iby-vDJQnd8uI^!zQ`REoCw5U0 z@*1+iB773xn8&Gj!1{3c>&#p(3LpdAQWk#Of9jjfju%-}U`%_n0dlQ7GNW4xcs0Q&iMB_Lv~In)OFEx9n?EAaA6;ke#8YEe!qCrf<~-I+`MV` zPCa|>DO4D;p(FpN32IRxQ0TFN^0e_{x411v{aaD3z01h1^WOIfp~|VXsjdrk_#S-R7wGQ$Q&rCJbzFVR5KB?#<8G2 zFq%{pnRIY6)S31Pp|YkvpAym&OM^jylz64>ZGW*Nd#&n%HDv8QN%)BT&zIMK2iLyx zFLCYQ?EgNlE#Hi-w@)W99r>_p8jaTA;=ZX-r=~j(m-{HkrVa}b zCK}z@W-Dr6!>w*vnDMUAC}L4dNXBIU6d^0jHzCh{snm7F+L-Z<%f7L-BjYfWwj3_|Urn^~Vm zRqDAMKqw?uwZxpIno_6Ao%(J~V6)Ee)lz?GEUS#qx-+fxiab87=O+}F(qC}>qdvkf z7-=z@kj1LLt&$?`y=Y2N6 z9p(MLcIW34g6+KW2J0B5R{H8Gi!_u_E)!{V(Y@Oc4JK?4k}C9Dd{~+0 zWg5gcUF|P1^}>12prH%rDSzB9YRI+nR=?L)W_HzO8GYE5WZ2`X|HR7!OP~N|y(riz z45&HwlPzu@SnygOcYW75o&JS}V>N5(P2eXeX{aHQ&}jph6>C1n%9K*?7AqCuGY>(9 zZPd6WH9KE7qHlQyT+w?%_qX(Ui;MaVQ#(yBE@@7^V}!OKw3&NZ169)OAbH{UvPM6y zm{NdE9QPb1R9L;7GfmLS)hPZlm~PB9G%ikFl+eT%MMgK$)uy85Qkqn16C?W>KNFDejC64y$eS3FHq&MA0eBxSt}@vfTs-1Pg}y~y-OHNh0zSBM%xz++ZL zpA#yaMR_h|kNjXY_UNd$i~p$|ud_N7sQm06p{Gw|ietXEjeQXvmC)buGG`a5Vqmq+ zZfc7f_lReINUc7X%NN)$wXt~$+WGBHsH{7DO!gB6x-emXk&dKHn5^0?!l4>ERH)Q| zy2Y?`Z(&(^j17h#p8@Je-wOw{gctKOG%+-8WlnU6b@gnkNg<7T=-`Bhfu0Q)*(MO_ zl0Cfr$8x2n4=f`T&Aq;5bV=q3Ol>SbqM9-g`CY#s+S>tWdAJyV>sH89qYapT_HUT} zM#b=@yAGA(&(hk~Rd@WC5dB@e-S66A4r^}WaH#r-;o~v5D{3skvL|N1BXnPToy(@NBCZVLyZ%BX zcTZn>$AkNHcxCuq$l6jgb9aRO^xSVQu_cXYmFyrtqa?WNQchCxAxd3)<#7d;^b*`- zgwNxLxJ|37=&skTRViKI%Z` z|#9JvYP3wVSdR z@|jO;gnK)Yq_xx;%^lnA#w?ZN^I12|f!WHq>d&RAlwxhCdYxh{;suYY7v~o~mALtQ zMv<`?2>+3-n;Qt!ijC+FCR@gr5m52=@+ZI4$#=&jQv$1uoPwmXM21ldF)0b%yI$vO zP8tW(*iUl1la`SgD2?qBl|Yo4j54AA^^3Ij;tKtF_xebj_Nvz6BlAYs`DXs9{wjy! z4jNL=^#>`r)w*m=&?cE(Gql=)9WzMeTQD&}KhT9Ic%rdXuYBtkm(Ml6+@xMq&_{Vp zanxkY0|UhvDt%?jxz)b^GkdfKz5Jy>X;cRb8$t<0TrCU#Dh0yIu2rLTO_bYfXMq0W z(ivp`W1tH=&e=~qUJ+T=D(W=xV(wlH39i_o(f)5z6xVub3 z{1iu4-)QngU_cLD?Q~6`eTVxx?5$wiF4Bxt8O!)|VcSwyW-wc_&SldU92eG>BhrTQ zRo}~OQ|H3%Aq0H0G)l4f3xaS5-e0&UCuHzhsYGp6&UM%rfm#gxt1*S5&(M!mgyL;3m3qG5T)Q3q{n9AS_n({5r~5@jDIRVrK0eGFE53t zQ3H@Yy(AkmTGl5k75h)}d2PR|-p6?sG5*B(hn(}UNv;A`G^%l)TW4*Ibn?{BNbfeU zb)L|!q|v-sHpjflmyDA1?)WvZ|M12^ds-}&R3$;ddd-+9Sx9s~cz62KPJp+#b{!g# z=s@MzJeAPOiICM-w=qv&{XK(bD(&EA(~$biX&^~$>@o2CCiiyh>wk$n7jW;x=*$zB z@9>L4<3R|U9;HP!pBa$|+8X)H#rw@c=J=8DoyAL|X>j`e+3FtU3?QjB4moqc4OWCB z3OHOSKDto{Xqn64XgJgY%r`ZuL$6}ZursQ4QM=rxSo*Qf;)>tC!q(e3>q%fK;q1wd zsuX}cH3i_%QT5-x`OR61vOc+ctu;&ICvnZS3v!?BNwVT)rBk0#ZAZtpJ=ZNj?{Vf> zE?6j&*dMNrLzzBDL~{m5wE!9wlSlK1#{EFGrA>EOfPF6 za(D)Kaj@+^RghkbnfUc-Y|0CTIKxX`XEkJmR|+7K85o8i~VPRMCIR^ zAA^rJ@j-&W10(PD{5-y^P%`EtC9qIk!vA zyr^xb#kBA;@u}`-?ms-H(l_*$sO7p0>5b$3DRPos5~y&gSDG+wLAiVOE=$`|eaw{< zPk(kIwD-JpI=A$*EGX|g5{!sneC4^I4o@`jf$vOf9JS3X|0Sh`SsB(O+R0;!8^Ax*ZKseflz z`=+k9y74X42&~&6pln24ajT(MRLAeZ0tQ?17=g61bO!;ET%YS0#jV-c!(M>I47 znO$?g%41W{QI-v_xcDo5Pir=(eqJ+cUCv1eoeDFMx#PELTiozNt6320tI39vlq$J74oP#PCMVk>HG#Kgaq1|H8??PaiCFjrtTE9hl z4L9ven{#20pI(qyJAfiKJM7JQR*n19mpLYdg%$FRVUvr5eFRpIQ-sRJ>2SGKzbmM! zFp6ePwtO#Mfqy)|mupf{mR?5lOI1Trgl__=T*PunwQG|G7crx=nB<-YuO2GI9XpBX zpN~vsWqjN{sv@bA+4g7}S1dhg+Sw5fSs_tcO1qSc0~Rs`R z)=#q^_3bE(p-vMpD@Avm!W+fM$32Sb`$tpJeFo1aK#iEk8J?EbgU@t*+=Hu^;<~vK z?lq%oqz%ci$K_f8ix2z{BB3P3Q!`z2PfeG+ouzx3jgQ+f^S9CTgtbncNlg*%$m3mY z+;FL6>!YF)zcWh4?o40sLQ^BNA_pBs4xUNOi~;EJx?V2a- z_D02W7Zz@FY#Kb@5U2$l!!7g-$5Cf?zM4CiQ(^qDsAAHXsJT2E=WF{m8f{KaBAA+R zBh0)8Em<#pW~+hY&9qn{rZClJ^0_(!cmZw#_4TFzo}6=^{uofV?VqeM3S)5gsEr9l z(W)3s_b-<5~8Mdgu_EqZsh!Tyt~#@;0uQNzKCd%f+hpxv~Reg&-f40!S{huESJ ztu!7cb>!nt5J-UU%Tuz7@OIbr=51rsa_(et=$@rc4dkoRq38@N&q<|DI)!_1$JX~| z7o-e3IbO;7<=fOA$5_w~aWrl<=GfpzdgDd4NaOmY0XEf-bn$wAvTDrDX#fe`23CLD zIs5YD4HRm$VF}5>GW#R*WW+n~PKWlgTy7f<)HD}b#R8dhyapF&WzVuPtnmXv5shTz zXdosO3Z$YgPm&w4%)%`Wgl{ga8Om}d)%Z@0o>Pz1Asde81EUxARDI72vvGX?oR(Yn zatg3fa2^T$zba-Uq{VT+)evj(N@!Nqwh%O?D)Euf?g+$rYiS-M@QsD zfW=aX(A(B8o&1A0qsSZ+;{)kl4wtndjHiQ#_&lgOfTOPGlzdwrmBuhSpUbwa@4A7! zpiC5;=Zq8Bb|XY#h*s{1GO&`peRG9MV&yUl_bYi79iPy%lhrJEGiN{F`E`HUA^1m< zz2Bp%$UYC-czC*v*PYCg1Z`Ww^6O1+xidxMGKA2#ENEboH(ux!QC${UF9PoWV-+7m zdSGkY*Bs>JI*MkF*Z5dn3IOurNty-*fPAwOn~^&JkyTv}^CC)jAZG9*M`Y01=)YXVQEjfqk-xyN2Rf+@FIPtCQexPL{@2E~T1Vb-m?4y$7*Y;7z{zC!W4 zEhcJ6Z9Upd^iOV^iC+Y>7V$U+O?PZ?gp2NqRXDv*izH;;DKP^Mc-1sC!?Hc4C#~g+ zeSeL1290@bO1MSCr{6rjN`6-x6gDM5D^gv6BlVBv zPHK=VlD^!3W6LNkDlcexp&3cQ-yFFdWAmQN-+NHTVdsLG)lENh?U!oO51sF ztSEVnZE4VL%UqK!E!_vohQo%zrbbmOOHrYk<_{Esb8(@I)JtGvYAbEU%f6N8FybF> zT>z#|>s~|j8CQd9Uj>$5Mv#l+$pDj?RmO>{Gp*ju8vk%&1_ZN##?YZ^_v=(Gig2n< zugO$!M{U-Y@u$^E%_i6(bB8Ol3kQ_8Zkar$H@*tg-AH0cghnIkt)?-dPFz2f$|)xI%&Dh75H z%bC2a*VaSbEnf{E#F5Awpe7q1C8-db8GH>J0`g%p(fJz!!;r5Gb;})GEsZz%UsR`qb zcT~ie6D=<#l+Lb#h6}uc22-kWgPV)I%wY8U0$VlTYQsN@1yB@`uaP{-z47ym2n;UZ zqhxeV5=8Bchb4%=qj0idw~UA>tG%ChThaD@J3XIs^@$m@PhY)49`tmgjILf7H#bOU z;^LCnhf&*Nf%zN!Tpe8_KyB$y)M>@F;&F9s2nY9h+Z%(>0OT;j(Vc7`CJ%3|GPF2Nxz z-{btKbD0N(Ay687q9#JJS+ITm^8jve`o+|(DN|+s>gyKu7U|~#Ehkq4LYhrH-ko4v zeZup-+aU%%J>{kJ;LKW6gRb-rVaa{zj-8LA$&i;Je`5#IIq&sb`zeoLn`P`ivK71g zgw*8wv5svUCP{d;HR?99&C8)Ry(phD5q(BXi-Z_(8TCdpDRnnr+kEN@AFYuVtbJkE zYFnXXV@eXleL3rczG;n81+IT_yqDgAMZRO9Njr&Zr(VY*`2aTvXqX*YD7MW&1P(!VdJjP>>WCOjLZQnMzEcJ;omf!ps z==g!%*I`uB*=w1yGa+>!;UU%Is9M3?+`X%J*m<(=G-E`VqR9;ObG%GoOpL^YTm=er zE``PBMHc-Hw3ka0SOMa0rox+|Zc)#VkN3GXxs6rGA1jchJ9hiAoq&b?$-`?YvsJe| z`}f%P!$gj$K>l9je^R}S}C5cmly#Q2b06BUpBWc`nHqA|>IKW#MSwpTy>XK)Co-_El*(MzsTI(YVk zq6h9e6-Z}zA{4K5qxt=O3mGzj$ds71aSP|QQa)^SWk*KuP8VXRlf#AHw+`s^jYtMl znkHhQ6x?$LEhQKj^NaWO`*(@Mujr$^LYTPm4(6wS7S*EibD}z}CgT;0tIW#$Sudc( z=gTK-xOLYiZAXaauJz05L7f8b;bZoVVWoX*-j39&kBhyF%`|tA*Z2iwsol`fQ_1ue zIkl3@G%XYIcJVDM4tH{oGi(I6oU@~0FXHs=5BL*ZP6B_}ZLVljI!OP46kpMVZMhlo zQBjc@-1)*@2u0AzN{+NYYw*Mje*P%IMhP-tws~mry2@X&{ZRtfKI-Q?cls8$T&e0_ zqn`8pM2KBJS@Ja+r1v>)eDr4A+GbkO|9;TWPma1jEj=|wgq6#(hH`fbd61>m{%`huqw=)XDn19u=AUR6ejTJgD2Q7CZiUlqL7Db|>I zXMQ~jGiObmz%g*vJr|D)s*v*8 z`OiVRN!V!3G28>~M%#Uajx_N>$BLd=_Bj{1&i9N?AUgV3p#AK-cw+1ANNdnH(g{t~ z>m~L&n{_d`nF+O&mKFa)0ec|cs=PJxPuC+zeOnb{pkNskIy?Y! z4-!7tM{kcg)Tt_aJo9eT+BHe9kFMG;HGTvP+;P0NMmeT^_5{i>Aiy|%x6k~pN=Cqt zd@9DbpAbiBS$*cBed`UIcQkpLAo|Ou7y-&t)R}FU9@#q&B+R$h3_bBtT zlv_MHXjP{C*b`TYkI4MIc@&0bdBlHpMP3b6(@8sC7>Pv|O0o$)*26j`J?$$+elG#C z(fJHOrY;l$+=d{=f*ZjQYk5Af{R?*9uVY>;?!!JBp{m@qgVHTf><5)<%zl>8vIuVzIi zU@M4~P5ULE<>k(}*AQvDuw1b*%PKZWGK=AiI9#jr-shp2 z?(lZ3+JSqpBZ**0#zj@ipiM=za<-L#+llE*T+nftG!Wn+d+w+*1GhVl9t%TOSZYBr zQ7X4=b)iK2*>v-^A#oqaqU9M=1#MJL^7N#B#LG4}`ILQM(4o1?)t}3KGchz}o5**p z9Lp1RQej>WjC6EYos4`6>+zEOvsTgzAEXD{k5GL!PReqIXoIpWU@Ak782`LqoW|TO z-K}By^vD~`Br^-(OSz%k>`di}GtLFfy+IaTy`Z}z(t}w=b5)Um?k!r;IcwN<*7eK* zEe=I#TsRNc$C4Mv`AyN3FBmS&Kc_FjS@8$eDE2Ipa*ws#cKVY}3{w~~Q1SD#0W^v< z$1^-)nWM%Gc`xjekE0i>Iv)M6Dk11S=$~?dX>11tHsbE_z0>-wN3B|*vwBw$n)t$V zcwfzf>jD}b-)0jUR-^0Y4N}B*7YRKZGm27-n`KonR`F)U3R6Sw*VgigzI1X5IyA4c zc1ba#yb;~~wrt=9t&SeK-Lfr^cvc5D#}$QqvtW6T4CE`MBX-TO&eXh>9~8_p3Ba z>FBBRCyxVS$?3WfIvJop{UgMS?SyU`nouN5B-n!&0c_xT9dX~^G0ZrPi0YS45Fm$w z9NDrV_}RRyRj2$l1E#x0E&nj^=HYhBj<4g~l;;gv*6XpXL(B4F{%O7q>q@7)_vA!0 zn>SnIiHWNnUwc%jTeWrNXN}!;3)$4FK8sVuLeVvcQtN~&pUYC z!p6|j=l%7Y!;P1vx;b8o@M@2Z5tzdJe{GK8tzg2NE;0j8!e;;lz TYDnRI@%5|vSBfs(ef)m_sSo++ literal 0 HcmV?d00001 diff --git a/sql1.html b/sql1.html new file mode 100644 index 0000000..d455906 --- /dev/null +++ b/sql1.html @@ -0,0 +1,1180 @@ + + + + + + + + + + + + + +sql1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
library(DBI)
+library(RMySQL)
+db_user <- 'xingyix'
+db_password <- 'testsql!'
+db_name <- 'oudb'
+db_host <- 'database-1.ccuhmawzhovn.us-east-2.rds.amazonaws.com'
+db_port <- 3306
+mydb <- dbConnect(MySQL(), user = db_user, password = db_password, dbname = db_name, host = db_host, port = db_port)
+
+summary(mydb)
+
## <MySQLConnection:0,0>
+##   User:   xingyix 
+##   Host:   database-1.ccuhmawzhovn.us-east-2.rds.amazonaws.com 
+##   Dbname: oudb 
+##   Connection type: database-1.ccuhmawzhovn.us-east-2.rds.amazonaws.com via TCP/IP 
+## 
+## Results:
+
+

Load OU Data

+
#Student demographic data
+studentInfo <- read.csv("studentInfo.csv", header = TRUE)
+#Student assessment data
+studentAssessment <- read.csv("studentAssessment.csv", header = TRUE)
+#Course data
+courses <- read.csv("courses.csv", header = TRUE)
+studentRegistration <- read.csv("studentRegistration.csv", header = TRUE)
+
+
+

Write data to the DB using the DBI package

+
dbListTables(mydb)
+
##  [1] "booltest"            "courses"             "left_table"         
+##  [4] "right_table"         "studentAssessment"   "studentInfo"        
+##  [7] "studentRegistration" "test1"               "test2"              
+## [10] "test4"               "toy2"                "toy3"
+
#Write a new table to the DB
+dbGetQuery(mydb, "DROP TABLE IF EXISTS studentInfo;")
+
+ +
+
dbGetQuery(mydb, "DROP TABLE IF EXISTS studentAssessment;")
+
+ +
+
dbGetQuery(mydb, "DROP TABLE IF EXISTS studentRegistration;")
+
+ +
+
dbGetQuery(mydb, "DROP TABLE IF EXISTS courses;")
+
+ +
+
dbWriteTable(mydb, "studentInfo", studentInfo)
+
## [1] TRUE
+
dbWriteTable(mydb, "studentAssessment", studentAssessment)
+
## [1] TRUE
+
dbWriteTable(mydb, "courses", courses)
+
## [1] TRUE
+
dbWriteTable(mydb, "studentRegistration", studentRegistration)
+
## [1] TRUE
+

#List tables to see that table was added

+
dbListTables(mydb)
+
##  [1] "booltest"            "courses"             "left_table"         
+##  [4] "right_table"         "studentAssessment"   "studentInfo"        
+##  [7] "studentRegistration" "test1"               "test2"              
+## [10] "test4"               "toy2"                "toy3"
+
#Read a particular table
+dbReadTable(mydb, 'studentInfo')
+
+ +
+

#EXERCISE 1 #Make two toy data sets with at least three variables and at least 30 rows each in them. Have a mix of numeric and character variables. Transfer these dataframes to your SQL database using the DBI commands. Name the tables whatever you like.

+
toy1 <- read.csv("toy1.csv", header = TRUE)
+toy2 <- read.csv("toy2.csv", header = TRUE)
+dbGetQuery(mydb, "DROP TABLE IF EXISTS toy2;")
+
+ +
+
dbGetQuery(mydb, "DROP TABLE IF EXISTS toy1;")
+
+ +
+
dbWriteTable(mydb, "toy2", toy2)
+
## [1] TRUE
+
dbWriteTable(mydb, "toy1", toy1)
+
## [1] TRUE
+
+
+

Getting into SQL - READING

+
#Query a portion of the database (always returns dataframe)
+dbGetQuery(mydb, "SELECT * FROM studentInfo LIMIT 10;")
+
+ +
+
dbGetQuery(mydb, "SELECT * FROM studentInfo ORDER BY id_student LIMIT 10;")
+
+ +
+
dbGetQuery(mydb, "SELECT id_student, gender FROM studentInfo ORDER BY id_student DESC LIMIT 10;")
+
+ +
+
dbGetQuery(mydb, "SELECT id_student AS 'Student ID', gender FROM studentInfo LIMIT 10;")
+
+ +
+
#Count the number of rows
+dbGetQuery(mydb, "SELECT COUNT(*) FROM studentAssessment;")
+
+ +
+
#Using a WHERE statement on all columns
+dbGetQuery(mydb, "SELECT COUNT(*) FROM studentAssessment WHERE score > 50;")
+
+ +
+
#Using a WHERE statement on a single column (will not include missing data)
+dbGetQuery(mydb, "SELECT COUNT(score) FROM studentAssessment WHERE score > 50;")
+
+ +
+
#Using an AND statement
+dbGetQuery(mydb, "SELECT COUNT(*) FROM studentAssessment WHERE score > 50 AND id_assessment = '1752';")
+
+ +
+

#EXERCISE 2 #Read one of your toy data tables, make sure the output is ordered in descending order, you rename one of the variables and the output is limited to the first 20 rows.

+

#Read the other table according to a condition of one of the variables.

+
dbGetQuery(mydb, "SELECT sd,name as name1,type FROM toy1 order by sd desc limit 20;")
+
+ +
+
dbGetQuery(mydb, "SELECT sd,name as name1,type FROM toy2 where sd =30;")
+
+ +
+
+
+

Getting into SQL - UPDATING

+
#Count rows
+dbGetQuery(mydb, "SELECT COUNT(*) FROM studentAssessment;")
+
+ +
+
#Add a row
+dbGetQuery(mydb, "INSERT INTO studentAssessment (id_assessment, id_student, date_submitted, is_banked, score) VALUES ('00001', '1', '20', '0', '50');")
+
+ +
+
#Count rows again
+dbGetQuery(mydb, "SELECT COUNT(*) FROM studentAssessment;")
+
+ +
+
#View inserted row
+dbGetQuery(mydb, "SELECT * FROM studentAssessment ORDER BY id_student LIMIT 10;")
+
+ +
+
#Add a row with missing values
+dbGetQuery(mydb, "INSERT INTO studentAssessment (id_assessment, id_student, date_submitted) VALUES ('00001', '1', '20');")
+
+ +
+
#View inserted row
+dbGetQuery(mydb, "SELECT * FROM studentAssessment ORDER BY id_student LIMIT 10;")
+
+ +
+
#Update a row
+dbGetQuery(mydb, "UPDATE studentAssessment SET score = '20' WHERE id_student = 1;")
+
+ +
+
dbGetQuery(mydb, "SELECT id_student, score FROM studentAssessment ORDER BY id_student LIMIT 10;")
+
+ +
+
#Update a row with NULL
+dbGetQuery(mydb, "UPDATE studentAssessment SET score = 'NULL' WHERE id_student = 6516;")
+
+ +
+
#Delete a row (destructive)
+dbGetQuery(mydb, "DELETE FROM studentAssessment WHERE id_student = 1;")
+
+ +
+
dbGetQuery(mydb, "SELECT * FROM studentAssessment ORDER BY id_student LIMIT 10;")
+
+ +
+

#EXERCISE 3 #Insert a new row in one of your toy data tables leaving one variable empty. Change one value in your other table. Display your new tables. Delete the row you edited and the row you inserted.

+
dbGetQuery(mydb, "INSERT INTO toy1 (sd, name, type) VALUES (33, 'lsu', null);")
+
+ +
+
dbGetQuery(mydb, "select * from toy1;")
+
+ +
+
dbGetQuery(mydb, "update toy2  set sd=111 where sd=10;")
+
+ +
+
dbGetQuery(mydb, "select * from toy2;")
+
+ +
+
dbGetQuery(mydb, "delete from toy2 where sd=111;")
+
+ +
+
dbGetQuery(mydb, "delete from toy1 where sd=33;")
+
+ +
+
+
+

Add/Deleting Table

+
#Creating a new table in SQL
+dbGetQuery(mydb,"CREATE TABLE test (
+  score INTEGER, 
+  student TEXT
+  );")
+
+ +
+
dbListTables(mydb)
+
##  [1] "booltest"            "courses"             "left_table"         
+##  [4] "right_table"         "studentAssessment"   "studentInfo"        
+##  [7] "studentRegistration" "test"                "test1"              
+## [10] "test2"               "test4"               "toy1"               
+## [13] "toy2"                "toy3"
+
#Inserting data into the table
+dbGetQuery(mydb, "INSERT INTO test VALUES ( 10, 'Amy' );")
+
+ +
+
dbGetQuery(mydb, "INSERT INTO test VALUES ( 11, 'Jen' );")
+
+ +
+
dbGetQuery(mydb, "INSERT INTO test VALUES ( 9, 'Frank' );")
+
+ +
+
dbGetQuery(mydb, "SELECT * FROM test;")
+
+ +
+
#Inserting a NULL row
+#dbGetQuery(mydb, "INSERT INTO test DEFAULT VALUES;") #Will not work use instead:
+
+dbGetQuery(mydb,"INSERT INTO test (score, student) SELECT score, id_student FROM studentAssessment;")
+
+ +
+
#Delete a table
+dbGetQuery(mydb, "DROP TABLE test;")
+
+ +
+
#dbGetQuery(mydb, "SELECT * FROM test;") #This should produce an error since your table no longer exists
+
+#Delete a table if it exists
+dbGetQuery(mydb, "DROP TABLE IF EXISTS test;") #No error since it is only if it exists
+
+ +
+

#EXERCISE 4 #Create a table that is exactly the same as your first toy data table but this time use SQL commands. Display your new table. Then delete the original table.

+
dbGetQuery(mydb, "DROP TABLE IF EXISTS test1;")
+
+ +
+
dbGetQuery(mydb,"CREATE TABLE test1 as select * from toy1;")
+
+ +
+
dbGetQuery(mydb, "DROP TABLE IF EXISTS toy1;")
+
+ +
+
dbGetQuery(mydb,"select * from test1;")
+
+ +
+
+
+

Constraints

+
#Create table where student column *cannot* be NULL
+dbGetQuery(mydb, "DROP TABLE IF EXISTS test2;")
+
+ +
+
dbGetQuery(mydb,"CREATE TABLE test2 (
+  score INTEGER, 
+  student TEXT NOT NULL
+  );")
+
+ +
+
dbGetQuery(mydb, "DROP TABLE IF EXISTS test2;")
+
+ +
+
dbGetQuery(mydb,"CREATE TABLE test2 (
+   score INTEGER DEFAULT 0, 
+   student TEXT
+   );")
+
+ +
+
dbGetQuery(mydb,"INSERT INTO test2 (score, student) VALUES ('1', 'A');")
+
+ +
+
dbGetQuery(mydb,"INSERT INTO test2 (student) VALUES ('B');")
+
+ +
+
dbGetQuery(mydb, "SELECT * FROM test2;")
+
+ +
+
dbGetQuery(mydb, "DROP TABLE IF EXISTS test2;")
+
+ +
+
dbGetQuery(mydb,"CREATE TABLE test2 (
+  score INTEGER UNIQUE, 
+  student TEXT
+  );")
+
+ +
+
dbGetQuery(mydb,"INSERT INTO test2 (score, student) VALUES ('1', 'A');")
+
+ +
+
#Error because of unique
+#dbGetQuery(mydb,"INSERT INTO test2 (score, student) VALUES ('1', 'A');")
+
+#NULL is exempt
+dbGetQuery(mydb,"INSERT INTO test2 (score, student) VALUES (NULL, 'A');")
+
+ +
+
dbGetQuery(mydb,"INSERT INTO test2 (score, student) VALUES (NULL, 'A');")
+
+ +
+

#EXERCISE 5 #Recreate one of your toy data tables with the constraint that for one of the integer variablesthe default value will be zero. Test your table by inserting some empty values. Display your new tables. Then delete your table.

+
dbGetQuery(mydb,"CREATE TABLE toy1 (
+  sd INTEGER DEFAULT 0, 
+  name TEXT,
+  type TEXT
+  );")
+
+ +
+
dbGetQuery(mydb,"INSERT INTO toy1 (sd) VALUES (NULL);")
+
+ +
+
dbGetQuery(mydb,"select * from toy1;")
+
+ +
+
dbGetQuery(mydb,"drop table toy1;")
+
+ +
+
+
+

Adding a column with a default value

+
#Add a column with default value 1
+dbGetQuery(mydb, "ALTER TABLE studentAssessment ADD email INTEGER DEFAULT 1 ")
+
+ +
+
dbGetQuery(mydb, "SELECT * FROM studentAssessment LIMIT 10;")
+
+ +
+
#Delete a column
+dbGetQuery(mydb, "ALTER TABLE studentAssessment DROP COLUMN email;")
+
+ +
+

#EXERCISE 6 #Add a column to one of your toy data tables with a default value of 3. Display your new table. Delete this column.

+
#Add a column with default value 1
+dbGetQuery(mydb, "ALTER TABLE toy2 ADD email INTEGER DEFAULT 3 ")
+
+ +
+
dbGetQuery(mydb, "SELECT * FROM toy2 LIMIT 10;")
+
+ +
+
#Delete a column
+dbGetQuery(mydb, "ALTER TABLE toy2 DROP COLUMN email;")
+
+ +
+
+
+

ID Columns

+
dbGetQuery(mydb,"CREATE TABLE test3 (
+  id INTEGER AUTO_INCREMENT PRIMARY KEY, #Not standard syntax
+  score INTEGER, 
+  student TEXT
+  );")
+
+ +
+
dbGetQuery(mydb,"INSERT INTO test3 (score, student) VALUES (1, 'A');")
+
+ +
+
dbGetQuery(mydb,"INSERT INTO test3 (score, student) VALUES (5, 'B');")
+
+ +
+
dbGetQuery(mydb, "SELECT * FROM test3;")
+
+ +
+
dbGetQuery(mydb, "DROP TABLE IF EXISTS test3;")
+
+ +
+

#EXERCISE 7 #Create a new table with four variables and a primary key that is a sequential id value.

+
dbGetQuery(mydb, "DROP TABLE IF EXISTS test4;")
+
+ +
+
dbGetQuery(mydb,"CREATE TABLE test4 (
+  id INTEGER AUTO_INCREMENT PRIMARY KEY,  
+  score INTEGER, 
+  student TEXT,
+  age INTEGER
+  );")
+
+ +
+
+

Filtering (WHERE)

+
dbGetQuery(mydb, "SELECT id_student, date_submitted FROM studentAssessment WHERE date_submitted > 550 ORDER BY date_submitted DESC;")
+
+ +
+
#OR Statement
+dbGetQuery(mydb, "SELECT id_student, date_submitted FROM studentAssessment WHERE date_submitted > 550 OR date_submitted < 2 ORDER BY date_submitted DESC;")
+
+ +
+
#AND Statement
+dbGetQuery(mydb, "SELECT id_student, date_submitted FROM studentAssessment WHERE date_submitted > 550 AND id_student = 325750 ORDER BY date_submitted DESC;")
+
+ +
+
#LIKE
+dbGetQuery(mydb, "SELECT id_student, gender, region FROM studentInfo WHERE region LIKE '%Region%';")
+
+ +
+
#Begin with 'Region'
+dbGetQuery(mydb, "SELECT id_student, gender, region FROM studentInfo WHERE region LIKE 'Region%';")
+
+ +
+
#End with 'Region'
+dbGetQuery(mydb, "SELECT id_student, gender, region FROM studentInfo WHERE region LIKE '%Region';")
+
+ +
+
#'c' is the second letter
+dbGetQuery(mydb, "SELECT id_student, gender, region FROM studentInfo WHERE region LIKE '_c%';")
+
+ +
+
#IN
+dbGetQuery(mydb, "SELECT id_student, gender, region FROM studentInfo WHERE region IN ('Wales','Ireland');")
+
+ +
+

#EXERCISE 8 #Query one of your original toy data tables, for two different conditions.

+
dbGetQuery(mydb, "SELECT * FROM toy2 WHERE name LIKE '%s%';")
+
+ +
+
dbGetQuery(mydb, "SELECT * FROM toy2 WHERE sd IN (10,15);")
+
+ +
+
+
+

Removing Duplicates

+
dbGetQuery(mydb, "SELECT DISTINCT region FROM studentInfo;")
+
+ +
+
dbGetQuery(mydb, "SELECT DISTINCT region, gender FROM studentInfo;")
+
+ +
+

#EXERCISE 9 #Insert a duplicate row into one of your toy data tables. Then query the table without including duplicates.

+
dbGetQuery(mydb, "INSERT INTO toy2 (sd, name, type) VALUES (1, 'xd1','ff1');")
+
+ +
+
dbGetQuery(mydb, "SELECT DISTINCT * FROM toy2;")
+
+ +
+
+
+

Conditional Expressions (non-standard)

+
dbGetQuery(mydb, "DROP TABLE IF EXISTS booltest;")
+
+ +
+
dbGetQuery(mydb, "CREATE TABLE booltest (a INTEGER, b INTEGER);")
+
+ +
+
dbGetQuery(mydb, "INSERT INTO booltest VALUES (1, 0);")
+
+ +
+
dbGetQuery(mydb, "SELECT * FROM booltest;")
+
+ +
+
dbGetQuery(mydb,"SELECT
+  CASE WHEN a THEN 'true' ELSE 'false' END as boolA,
+  CASE WHEN b THEN 'true' ELSE 'false' END as boolB
+  FROM booltest")
+
+ +
+
dbGetQuery(mydb,"SELECT
+  CASE a WHEN 1 THEN 'true' ELSE 'false' END as boolA,
+  CASE b WHEN 1 THEN 'true' ELSE 'false' END as boolB
+  FROM booltest")
+
+ +
+

#Relationships (JOIN) - Slide

+
#Create two tables with matches and join them
+dbGetQuery(mydb, "DROP TABLE IF EXISTS left_table;")
+
+ +
+
dbGetQuery(mydb, "DROP TABLE IF EXISTS right_table;")
+
+ +
+
dbGetQuery(mydb, "CREATE TABLE left_table (id INTEGER, description TEXT);")
+
+ +
+
dbGetQuery(mydb, "CREATE TABLE right_table (id INTEGER, description TEXT);")
+
+ +
+
dbGetQuery(mydb, "INSERT INTO left_table VALUES ( 1, 'left 01');")
+
+ +
+
dbGetQuery(mydb, "INSERT INTO left_table VALUES ( 2, 'left 02');")
+
+ +
+
dbGetQuery(mydb, "INSERT INTO left_table VALUES ( 3, 'left 03');")
+
+ +
+
dbGetQuery(mydb, "INSERT INTO left_table VALUES ( 4, 'left 04');")
+
+ +
+
dbGetQuery(mydb, "INSERT INTO left_table VALUES ( 5, 'left 05');")
+
+ +
+
dbGetQuery(mydb, "INSERT INTO left_table VALUES ( 6, 'left 06');")
+
+ +
+
dbGetQuery(mydb, "INSERT INTO left_table VALUES ( 7, 'left 07');")
+
+ +
+
dbGetQuery(mydb, "INSERT INTO left_table VALUES ( 8, 'left 08');")
+
+ +
+
dbGetQuery(mydb, "INSERT INTO left_table VALUES ( 9, 'left 09');")
+
+ +
+
dbGetQuery(mydb, "INSERT INTO right_table VALUES ( 6, 'left 06');")
+
+ +
+
dbGetQuery(mydb, "INSERT INTO right_table VALUES ( 7, 'left 07');")
+
+ +
+
dbGetQuery(mydb, "INSERT INTO right_table VALUES ( 8, 'left 08');")
+
+ +
+
dbGetQuery(mydb, "INSERT INTO right_table VALUES ( 9, 'left 09');")
+
+ +
+
dbGetQuery(mydb, "INSERT INTO right_table VALUES ( 10, 'left 10');")
+
+ +
+
dbGetQuery(mydb, "INSERT INTO right_table VALUES ( 11, 'left 11');")
+
+ +
+
dbGetQuery(mydb, "INSERT INTO right_table VALUES ( 12, 'left 12');")
+
+ +
+
dbGetQuery(mydb, "INSERT INTO right_table VALUES ( 13, 'left 13');")
+
+ +
+
dbGetQuery(mydb, "INSERT INTO right_table VALUES ( 14, 'left 14');")
+
+ +
+
dbGetQuery(mydb, "SELECT * FROM left_table;")
+
+ +
+
dbGetQuery(mydb, "SELECT * FROM right_table;")
+
+ +
+
dbGetQuery(mydb,"SELECT l.description AS left_table, r.description AS right_table 
+           FROM left_table AS l 
+           JOIN right_table AS r ON l.id = r.id")
+
+ +
+
dbGetQuery(mydb,"SELECT l.description AS left_table, r.description AS right_table 
+           FROM left_table AS l 
+           RIGHT JOIN right_table AS r ON l.id = r.id")
+
+ +
+
dbGetQuery(mydb,"SELECT l.description AS left_table, r.description AS right_table 
+           FROM left_table AS l 
+           LEFT JOIN right_table AS r ON l.id = r.id")
+
+ +
+
#Union
+dbGetQuery(mydb, "SELECT * FROM left_table
+           UNION
+           SELECT * FROM right_table;")
+
+ +
+

#EXERCISE 10 # Create a common id variable in your two toy data tables. Then join those tables so that your query returns all the values from one table and only those that match from the other.

+
dbGetQuery(mydb, "DROP TABLE IF EXISTS toy3;")
+
+ +
+
dbGetQuery(mydb,"CREATE TABLE toy3 (
+  sd INTEGER, 
+  name TEXT NOT NULL,
+  type TEXT NOT NULL
+  );")
+
+ +
+
dbGetQuery(mydb, "INSERT INTO toy3 VALUES ( 1, 'a','b');")
+
+ +
+
dbGetQuery(mydb, "INSERT INTO toy3 VALUES ( 2, 'b','c');")
+
+ +
+
dbGetQuery(mydb, "select * from toy3;")
+
+ +
+
dbGetQuery(mydb, "select toy3.*,toy2.name,toy2.type from toy3,toy2 where toy3.sd=toy2.sd;")
+
+ +
+
+
+ + + + +
+ + + + + + + + + + + + + + + diff --git a/sql_XingyiXie.Rmd b/sql_XingyiXie.Rmd new file mode 100644 index 0000000..ba24d98 --- /dev/null +++ b/sql_XingyiXie.Rmd @@ -0,0 +1,447 @@ +--- +title: "sql1" +output: pdf_document +--- +```{r} +library(DBI) +library(RMySQL) +db_user <- 'xingyix' +db_password <- 'testsql!' +db_name <- 'oudb' +db_host <- 'database-1.ccuhmawzhovn.us-east-2.rds.amazonaws.com' +db_port <- 3306 +mydb <- dbConnect(MySQL(), user = db_user, password = db_password, dbname = db_name, host = db_host, port = db_port) + +summary(mydb) +``` +## Load OU Data + +```{r} +#Student demographic data +studentInfo <- read.csv("studentInfo.csv", header = TRUE) +#Student assessment data +studentAssessment <- read.csv("studentAssessment.csv", header = TRUE) +#Course data +courses <- read.csv("courses.csv", header = TRUE) +studentRegistration <- read.csv("studentRegistration.csv", header = TRUE) +``` +## Write data to the DB using the DBI package + +```{r} +dbListTables(mydb) +``` +```{r} +#Write a new table to the DB +dbGetQuery(mydb, "DROP TABLE IF EXISTS studentInfo;") +dbGetQuery(mydb, "DROP TABLE IF EXISTS studentAssessment;") +dbGetQuery(mydb, "DROP TABLE IF EXISTS studentRegistration;") +dbGetQuery(mydb, "DROP TABLE IF EXISTS courses;") +dbWriteTable(mydb, "studentInfo", studentInfo) +dbWriteTable(mydb, "studentAssessment", studentAssessment) +dbWriteTable(mydb, "courses", courses) +dbWriteTable(mydb, "studentRegistration", studentRegistration) +``` +#List tables to see that table was added +```{r} +dbListTables(mydb) +``` + +```{r} +#Read a particular table +dbReadTable(mydb, 'studentInfo') +``` + +#EXERCISE 1 +#Make two toy data sets with at least three variables and at least 30 rows each in them. Have a mix of numeric and character variables. Transfer these dataframes to your SQL database using the DBI commands. Name the tables whatever you like. +```{r} +toy1 <- read.csv("toy1.csv", header = TRUE) +toy2 <- read.csv("toy2.csv", header = TRUE) +dbGetQuery(mydb, "DROP TABLE IF EXISTS toy2;") +dbGetQuery(mydb, "DROP TABLE IF EXISTS toy1;") +dbWriteTable(mydb, "toy2", toy2) +dbWriteTable(mydb, "toy1", toy1) +``` +## Getting into SQL - READING +```{r} +#Query a portion of the database (always returns dataframe) +dbGetQuery(mydb, "SELECT * FROM studentInfo LIMIT 10;") +``` +```{r} +dbGetQuery(mydb, "SELECT * FROM studentInfo ORDER BY id_student LIMIT 10;") +``` + +```{r} +dbGetQuery(mydb, "SELECT id_student, gender FROM studentInfo ORDER BY id_student DESC LIMIT 10;") +``` +```{r} +dbGetQuery(mydb, "SELECT id_student AS 'Student ID', gender FROM studentInfo LIMIT 10;") +``` + +```{r} +#Count the number of rows +dbGetQuery(mydb, "SELECT COUNT(*) FROM studentAssessment;") +``` + + +```{r} +#Using a WHERE statement on all columns +dbGetQuery(mydb, "SELECT COUNT(*) FROM studentAssessment WHERE score > 50;") +``` +```{r} +#Using a WHERE statement on a single column (will not include missing data) +dbGetQuery(mydb, "SELECT COUNT(score) FROM studentAssessment WHERE score > 50;") +``` + +```{r} +#Using an AND statement +dbGetQuery(mydb, "SELECT COUNT(*) FROM studentAssessment WHERE score > 50 AND id_assessment = '1752';") + +``` + +#EXERCISE 2 +#Read one of your toy data tables, make sure the output is ordered in descending order, you rename one of the variables and the output is limited to the first 20 rows. + +#Read the other table according to a condition of one of the variables. +```{r} +dbGetQuery(mydb, "SELECT sd,name as name1,type FROM toy1 order by sd desc limit 20;") +``` +```{r} +dbGetQuery(mydb, "SELECT sd,name as name1,type FROM toy2 where sd =30;") +``` +## Getting into SQL - UPDATING +```{r} +#Count rows +dbGetQuery(mydb, "SELECT COUNT(*) FROM studentAssessment;") + +#Add a row +dbGetQuery(mydb, "INSERT INTO studentAssessment (id_assessment, id_student, date_submitted, is_banked, score) VALUES ('00001', '1', '20', '0', '50');") + +#Count rows again +dbGetQuery(mydb, "SELECT COUNT(*) FROM studentAssessment;") + +#View inserted row +dbGetQuery(mydb, "SELECT * FROM studentAssessment ORDER BY id_student LIMIT 10;") + +#Add a row with missing values +dbGetQuery(mydb, "INSERT INTO studentAssessment (id_assessment, id_student, date_submitted) VALUES ('00001', '1', '20');") + +#View inserted row +dbGetQuery(mydb, "SELECT * FROM studentAssessment ORDER BY id_student LIMIT 10;") + +#Update a row +dbGetQuery(mydb, "UPDATE studentAssessment SET score = '20' WHERE id_student = 1;") + +dbGetQuery(mydb, "SELECT id_student, score FROM studentAssessment ORDER BY id_student LIMIT 10;") + +#Update a row with NULL +dbGetQuery(mydb, "UPDATE studentAssessment SET score = 'NULL' WHERE id_student = 6516;") + +#Delete a row (destructive) +dbGetQuery(mydb, "DELETE FROM studentAssessment WHERE id_student = 1;") + +dbGetQuery(mydb, "SELECT * FROM studentAssessment ORDER BY id_student LIMIT 10;") +``` +#EXERCISE 3 +#Insert a new row in one of your toy data tables leaving one variable empty. Change one value in your other table. Display your new tables. Delete the row you edited and the row you inserted. + +```{r} +dbGetQuery(mydb, "INSERT INTO toy1 (sd, name, type) VALUES (33, 'lsu', null);") +``` +```{r} +dbGetQuery(mydb, "select * from toy1;") +``` +```{r} +dbGetQuery(mydb, "update toy2 set sd=111 where sd=10;") +``` +```{r} +dbGetQuery(mydb, "select * from toy2;") +``` + +```{r} +dbGetQuery(mydb, "delete from toy2 where sd=111;") +dbGetQuery(mydb, "delete from toy1 where sd=33;") +``` + +## Add/Deleting Table +```{r} +#Creating a new table in SQL +dbGetQuery(mydb,"CREATE TABLE test ( + score INTEGER, + student TEXT + );") + +dbListTables(mydb) + +#Inserting data into the table +dbGetQuery(mydb, "INSERT INTO test VALUES ( 10, 'Amy' );") +dbGetQuery(mydb, "INSERT INTO test VALUES ( 11, 'Jen' );") +dbGetQuery(mydb, "INSERT INTO test VALUES ( 9, 'Frank' );") + +dbGetQuery(mydb, "SELECT * FROM test;") + +#Inserting a NULL row +#dbGetQuery(mydb, "INSERT INTO test DEFAULT VALUES;") #Will not work use instead: + +dbGetQuery(mydb,"INSERT INTO test (score, student) SELECT score, id_student FROM studentAssessment;") + +#Delete a table +dbGetQuery(mydb, "DROP TABLE test;") + +#dbGetQuery(mydb, "SELECT * FROM test;") #This should produce an error since your table no longer exists + +#Delete a table if it exists +dbGetQuery(mydb, "DROP TABLE IF EXISTS test;") #No error since it is only if it exists + +``` + +#EXERCISE 4 +#Create a table that is exactly the same as your first toy data table but this time use SQL commands. Display your new table. Then delete the original table. +```{r} +dbGetQuery(mydb, "DROP TABLE IF EXISTS test1;") +dbGetQuery(mydb,"CREATE TABLE test1 as select * from toy1;") +dbGetQuery(mydb, "DROP TABLE IF EXISTS toy1;") +``` +```{r} +dbGetQuery(mydb,"select * from test1;") +``` +# Constraints +```{r} +#Create table where student column *cannot* be NULL +dbGetQuery(mydb, "DROP TABLE IF EXISTS test2;") +dbGetQuery(mydb,"CREATE TABLE test2 ( + score INTEGER, + student TEXT NOT NULL + );") + +dbGetQuery(mydb, "DROP TABLE IF EXISTS test2;") + +dbGetQuery(mydb,"CREATE TABLE test2 ( + score INTEGER DEFAULT 0, + student TEXT + );") + +dbGetQuery(mydb,"INSERT INTO test2 (score, student) VALUES ('1', 'A');") +dbGetQuery(mydb,"INSERT INTO test2 (student) VALUES ('B');") + +dbGetQuery(mydb, "SELECT * FROM test2;") + +dbGetQuery(mydb, "DROP TABLE IF EXISTS test2;") + +dbGetQuery(mydb,"CREATE TABLE test2 ( + score INTEGER UNIQUE, + student TEXT + );") + +dbGetQuery(mydb,"INSERT INTO test2 (score, student) VALUES ('1', 'A');") + +#Error because of unique +#dbGetQuery(mydb,"INSERT INTO test2 (score, student) VALUES ('1', 'A');") + +#NULL is exempt +dbGetQuery(mydb,"INSERT INTO test2 (score, student) VALUES (NULL, 'A');") +dbGetQuery(mydb,"INSERT INTO test2 (score, student) VALUES (NULL, 'A');") + +``` +#EXERCISE 5 +#Recreate one of your toy data tables with the constraint that for one of the integer variablesthe default value will be zero. Test your table by inserting some empty values. Display your new tables. Then delete your table. + +```{r} +dbGetQuery(mydb,"CREATE TABLE toy1 ( + sd INTEGER DEFAULT 0, + name TEXT, + type TEXT + );") +``` +```{r} +dbGetQuery(mydb,"INSERT INTO toy1 (sd) VALUES (NULL);") +dbGetQuery(mydb,"select * from toy1;") +``` +```{r} +dbGetQuery(mydb,"drop table toy1;") +``` +# Adding a column with a default value + +```{r} +#Add a column with default value 1 +dbGetQuery(mydb, "ALTER TABLE studentAssessment ADD email INTEGER DEFAULT 1 ") + +dbGetQuery(mydb, "SELECT * FROM studentAssessment LIMIT 10;") + +#Delete a column +dbGetQuery(mydb, "ALTER TABLE studentAssessment DROP COLUMN email;") + +``` + +#EXERCISE 6 +#Add a column to one of your toy data tables with a default value of 3. Display your new table. Delete this column. +```{r} +#Add a column with default value 1 +dbGetQuery(mydb, "ALTER TABLE toy2 ADD email INTEGER DEFAULT 3 ") + +dbGetQuery(mydb, "SELECT * FROM toy2 LIMIT 10;") + +#Delete a column +dbGetQuery(mydb, "ALTER TABLE toy2 DROP COLUMN email;") +``` +# ID Columns +```{r} +dbGetQuery(mydb,"CREATE TABLE test3 ( + id INTEGER AUTO_INCREMENT PRIMARY KEY, #Not standard syntax + score INTEGER, + student TEXT + );") + +dbGetQuery(mydb,"INSERT INTO test3 (score, student) VALUES (1, 'A');") +dbGetQuery(mydb,"INSERT INTO test3 (score, student) VALUES (5, 'B');") + +dbGetQuery(mydb, "SELECT * FROM test3;") + +dbGetQuery(mydb, "DROP TABLE IF EXISTS test3;") + +``` + +#EXERCISE 7 +#Create a new table with four variables and a primary key that is a sequential id value. +```{r} +dbGetQuery(mydb, "DROP TABLE IF EXISTS test4;") +dbGetQuery(mydb,"CREATE TABLE test4 ( + id INTEGER AUTO_INCREMENT PRIMARY KEY, + score INTEGER, + student TEXT, + age INTEGER + );") +``` + +## Filtering (WHERE) +```{r} +dbGetQuery(mydb, "SELECT id_student, date_submitted FROM studentAssessment WHERE date_submitted > 550 ORDER BY date_submitted DESC;") + +#OR Statement +dbGetQuery(mydb, "SELECT id_student, date_submitted FROM studentAssessment WHERE date_submitted > 550 OR date_submitted < 2 ORDER BY date_submitted DESC;") + +#AND Statement +dbGetQuery(mydb, "SELECT id_student, date_submitted FROM studentAssessment WHERE date_submitted > 550 AND id_student = 325750 ORDER BY date_submitted DESC;") + +#LIKE +dbGetQuery(mydb, "SELECT id_student, gender, region FROM studentInfo WHERE region LIKE '%Region%';") + +#Begin with 'Region' +dbGetQuery(mydb, "SELECT id_student, gender, region FROM studentInfo WHERE region LIKE 'Region%';") + +#End with 'Region' +dbGetQuery(mydb, "SELECT id_student, gender, region FROM studentInfo WHERE region LIKE '%Region';") + +#'c' is the second letter +dbGetQuery(mydb, "SELECT id_student, gender, region FROM studentInfo WHERE region LIKE '_c%';") + +#IN +dbGetQuery(mydb, "SELECT id_student, gender, region FROM studentInfo WHERE region IN ('Wales','Ireland');") + +``` + +#EXERCISE 8 +#Query one of your original toy data tables, for two different conditions. +```{r} +dbGetQuery(mydb, "SELECT * FROM toy2 WHERE name LIKE '%s%';") +dbGetQuery(mydb, "SELECT * FROM toy2 WHERE sd IN (10,15);") +``` + +## Removing Duplicates + +```{r} +dbGetQuery(mydb, "SELECT DISTINCT region FROM studentInfo;") + +dbGetQuery(mydb, "SELECT DISTINCT region, gender FROM studentInfo;") +``` +#EXERCISE 9 +#Insert a duplicate row into one of your toy data tables. Then query the table without including duplicates. + +```{r} +dbGetQuery(mydb, "INSERT INTO toy2 (sd, name, type) VALUES (1, 'xd1','ff1');") +dbGetQuery(mydb, "SELECT DISTINCT * FROM toy2;") +``` +## Conditional Expressions (non-standard) +```{r} +dbGetQuery(mydb, "DROP TABLE IF EXISTS booltest;") +dbGetQuery(mydb, "CREATE TABLE booltest (a INTEGER, b INTEGER);") +dbGetQuery(mydb, "INSERT INTO booltest VALUES (1, 0);") +dbGetQuery(mydb, "SELECT * FROM booltest;") + +dbGetQuery(mydb,"SELECT + CASE WHEN a THEN 'true' ELSE 'false' END as boolA, + CASE WHEN b THEN 'true' ELSE 'false' END as boolB + FROM booltest") + +dbGetQuery(mydb,"SELECT + CASE a WHEN 1 THEN 'true' ELSE 'false' END as boolA, + CASE b WHEN 1 THEN 'true' ELSE 'false' END as boolB + FROM booltest") +``` + +#Relationships (JOIN) - *Slide* +```{r} +#Create two tables with matches and join them +dbGetQuery(mydb, "DROP TABLE IF EXISTS left_table;") +dbGetQuery(mydb, "DROP TABLE IF EXISTS right_table;") +dbGetQuery(mydb, "CREATE TABLE left_table (id INTEGER, description TEXT);") +dbGetQuery(mydb, "CREATE TABLE right_table (id INTEGER, description TEXT);") + +dbGetQuery(mydb, "INSERT INTO left_table VALUES ( 1, 'left 01');") +dbGetQuery(mydb, "INSERT INTO left_table VALUES ( 2, 'left 02');") +dbGetQuery(mydb, "INSERT INTO left_table VALUES ( 3, 'left 03');") +dbGetQuery(mydb, "INSERT INTO left_table VALUES ( 4, 'left 04');") +dbGetQuery(mydb, "INSERT INTO left_table VALUES ( 5, 'left 05');") +dbGetQuery(mydb, "INSERT INTO left_table VALUES ( 6, 'left 06');") +dbGetQuery(mydb, "INSERT INTO left_table VALUES ( 7, 'left 07');") +dbGetQuery(mydb, "INSERT INTO left_table VALUES ( 8, 'left 08');") +dbGetQuery(mydb, "INSERT INTO left_table VALUES ( 9, 'left 09');") + +dbGetQuery(mydb, "INSERT INTO right_table VALUES ( 6, 'left 06');") +dbGetQuery(mydb, "INSERT INTO right_table VALUES ( 7, 'left 07');") +dbGetQuery(mydb, "INSERT INTO right_table VALUES ( 8, 'left 08');") +dbGetQuery(mydb, "INSERT INTO right_table VALUES ( 9, 'left 09');") +dbGetQuery(mydb, "INSERT INTO right_table VALUES ( 10, 'left 10');") +dbGetQuery(mydb, "INSERT INTO right_table VALUES ( 11, 'left 11');") +dbGetQuery(mydb, "INSERT INTO right_table VALUES ( 12, 'left 12');") +dbGetQuery(mydb, "INSERT INTO right_table VALUES ( 13, 'left 13');") +dbGetQuery(mydb, "INSERT INTO right_table VALUES ( 14, 'left 14');") + +dbGetQuery(mydb, "SELECT * FROM left_table;") +dbGetQuery(mydb, "SELECT * FROM right_table;") + +dbGetQuery(mydb,"SELECT l.description AS left_table, r.description AS right_table + FROM left_table AS l + JOIN right_table AS r ON l.id = r.id") + +dbGetQuery(mydb,"SELECT l.description AS left_table, r.description AS right_table + FROM left_table AS l + RIGHT JOIN right_table AS r ON l.id = r.id") + +dbGetQuery(mydb,"SELECT l.description AS left_table, r.description AS right_table + FROM left_table AS l + LEFT JOIN right_table AS r ON l.id = r.id") + +#Union +dbGetQuery(mydb, "SELECT * FROM left_table + UNION + SELECT * FROM right_table;") + +``` +#EXERCISE 10 +# Create a common id variable in your two toy data tables. Then join those tables so that your query returns all the values from one table and only those that match from the other. +```{r} +dbGetQuery(mydb, "DROP TABLE IF EXISTS toy3;") +dbGetQuery(mydb,"CREATE TABLE toy3 ( + sd INTEGER, + name TEXT NOT NULL, + type TEXT NOT NULL + );") +dbGetQuery(mydb, "INSERT INTO toy3 VALUES ( 1, 'a','b');") +dbGetQuery(mydb, "INSERT INTO toy3 VALUES ( 2, 'b','c');") +dbGetQuery(mydb, "select * from toy3;") +``` + +```{r} +dbGetQuery(mydb, "select toy3.*,toy2.name,toy2.type from toy3,toy2 where toy3.sd=toy2.sd;") +``` +