From af60e31b5687ad7df4f293e7ee85b50c8e1ca885 Mon Sep 17 00:00:00 2001 From: yabwon Date: Mon, 11 May 2020 10:54:44 +0200 Subject: [PATCH] version 20200511 Help info added --- SQLinDS/000_libname/dssql.sas | 9 ++++----- SQLinDS/001_macro/dssql_inner.sas | 6 ++++-- SQLinDS/001_macro/sql.sas | 14 ++++++++++---- SQLinDS/002_function/dssql.sas | 2 ++ SQLinDS/description.sas | 21 +++++++++++++++------ sqlinds.zip | Bin 10551 -> 10853 bytes 6 files changed, 35 insertions(+), 17 deletions(-) diff --git a/SQLinDS/000_libname/dssql.sas b/SQLinDS/000_libname/dssql.sas index 7d5b339..8b520bf 100644 --- a/SQLinDS/000_libname/dssql.sas +++ b/SQLinDS/000_libname/dssql.sas @@ -3,12 +3,12 @@ /* >>> dsSQL library: <<< * * The dsSQL library stores temporary views - * generated during %SQL() macro's execution. - * If possible, created as a subdirectory of WORK: + * generated during the %SQL() macro execution. + * If possible a subdirectory of WORK is created as: LIBNAME dsSQL BASE "%sysfunc(pathname(WORK))/dsSQLtmp"; - * if not then redirected to WORK + * if not possible then redirects to WORK as: LIBNAME dsSQL BASE "%sysfunc(pathname(WORK))"; @@ -25,6 +25,5 @@ data _null_; rc1 = LIBNAME("dsSQL", "%sysfunc(pathname(work))", "BASE"); run; +/* list details about the library in the log */ libname dsSQL LIST; -; - diff --git a/SQLinDS/001_macro/dssql_inner.sas b/SQLinDS/001_macro/dssql_inner.sas index 7a7f896..31c78f8 100644 --- a/SQLinDS/001_macro/dssql_inner.sas +++ b/SQLinDS/001_macro/dssql_inner.sas @@ -1,8 +1,10 @@ -/*** HELP START ***/ +/*** HELP START ***/ /* >>> %dsSQL_Inner() macro: <<< * - * Internal macro called by dsSQL() function. + * Internal macro called by dsSQL() function. + * The macro generates a uniqualy named sql view on the fly + * which is stored in DSSQL library. * * Recommended for SAS 9.3 and higher. * Based on paper: diff --git a/SQLinDS/001_macro/sql.sas b/SQLinDS/001_macro/sql.sas index 119a129..67f0ecf 100644 --- a/SQLinDS/001_macro/sql.sas +++ b/SQLinDS/001_macro/sql.sas @@ -10,13 +10,19 @@ * by Mike Rhoads, Westat, Rockville, MD * https://support.sas.com/resources/papers/proceedings12/004-2012.pdf * + * SYNTAX: + + %sql() + + * The sql querry code is limited to 32000 bytes. + * * EXAMPLE 1: simple sql query data class_subset; set %SQL(select name, sex, height from sashelp.class where age > 12); run; - * EXAMPLE 2: with dataset options + * EXAMPLE 2: query with dataset options data renamed; set %SQL(select * from sashelp.class where sex = "F")(rename = (age=age2)); @@ -33,15 +39,15 @@ /*** HELP END ***/ -/* outer macro */ +/* Main User macro */ %MACRO SQL() / PARMBUFF SECURE; %let SYSPBUFF = %superq(SYSPBUFF); /* macroquoting */ %let SYSPBUFF = %substr(&SYSPBUFF, 2, %LENGTH(&SYSPBUFF) - 2); /* remove brackets */ %let SYSPBUFF = %superq(SYSPBUFF); /* macroquoting */ %let SYSPBUFF = %sysfunc(quote(&SYSPBUFF)); /* quotes */ - %put NOTE-***the query***; /* print out the query in the log */ + %put NOTE:*** the query ***; /* print out the query in the log */ %put NOTE-&SYSPBUFF.; - %put NOTE-****************; + %put NOTE-*****************; %local UNIQUE_INDEX; /* internal variable, a unique index for views */ %let UNIQUE_INDEX = &SYSINDEX; diff --git a/SQLinDS/002_function/dssql.sas b/SQLinDS/002_function/dssql.sas index d70594e..da6ffd3 100644 --- a/SQLinDS/002_function/dssql.sas +++ b/SQLinDS/002_function/dssql.sas @@ -3,6 +3,8 @@ /* >>> dsSQL() function: <<< * * Internal function called by %SQL() macro. + * The function pass query code from the %SQL() + * macro to the %dsSQL_Inner() innternal macreo. * * Recommended for SAS 9.3 and higher. * Based on paper: diff --git a/SQLinDS/description.sas b/SQLinDS/description.sas index 722e782..c30b1c2 100644 --- a/SQLinDS/description.sas +++ b/SQLinDS/description.sas @@ -23,14 +23,23 @@ the macro-function-sandwich concept introduced in: "Use the Full Power of SAS in Your Function-Style Macros" the article by Mike Rhoads, Westat, Rockville, MD -Copy of the article can be found at: +Copy of the article is available at: https://support.sas.com/resources/papers/proceedings12/004-2012.pdf -SQLinDS package provides following components: - 1) %dsSQL_inner() macro - 2) dsSQL() function - 3) %SQL() macro +Package provides ability to "execute" SQL queries inside a datastep, e.g. -Library DSSQL is created in a subdirectory of the WORK library. + data class; + set %SQL(select * from sashelp.class); + run; + +SQLinDS package contains the following components: + + 1) %SQL() macro - the main package macro available for the User + + 2) dsSQL() function (internal) + 3) %dsSQL_inner() macro (internal) + 4) Library DSSQL (created in a subdirectory of the WORK library) + +See help for the %SQL() macro to find more examples. DESCRIPTION END: diff --git a/sqlinds.zip b/sqlinds.zip index db195188627d6534bfa1c230183240ef18ad0a66..b7f563198ce74f6cc0b3e86d05e5c473899d5d3e 100644 GIT binary patch delta 7475 zcmZvBWmH_cH@A~Gu znVI@^)>*adsa?BlRejOi)+Sb0f=9rIfq_AR(buh3x4MYtfx^SU>>(!;vjLkR{2){N z=U(R$a4Kyj0msS&@oe_aXl0+@oy(P8g|+R9e^zrnds>yu&1zyZ`>EI-TC_eW zr}~j)TRXU&+0$=h0om4Ty#u)BdqYrWrRGgx>GXE{=+$sUhTyY*pHSOx|1Q-*$bQj$ zob5!_Hk``U zv7n`c%1Z?7FoicnO{!~|PV?Kt1_Hdc3->#Uj1aelqDh`7XYHk@en|tS4&F$QGOrn+ z#jI}E35zJxrwTCVnxr>sUrWthUnd+w>)A_N>Ao(!O$#{S?Yi8E5}7TNHeGi9Es?x4 zoC<4-v?LU5_Go&gSS!i-Y*x{zSDnWuvErJ>MA|KoYyGa_L^zO_#y{R^+ zfPgCV;7C`QS3QhLMbPt|AE+5ihr;CW9rqYJVTQoS$YFJuox3Q&9$WF$tp=yRKyi#Q z9&8fOhukV)q&@XO0AoFJZjpu7d{m&D9VJE}prL4ENYG);$?U?LDtEf32(6tSr~Gut z&3v+8DSsUQGy0ZK4^~QsRcJtM!^8sX!G3m?t_Tz+ zzHO^wZ7$O@(dO#rmjY!!7HAS^i+|YXL|1uq;}sMV5~Iw+kbh)0Rf2lke><33N2C7C z9f2C4uP6V|*M>#?W1eiV7rLtUR)pH_`74JR{)7V2@I4RkM@bs}4(Eho0?|>us1Tze zZRn=hUSJ8$9pP90R-cg-3vb5k5}{d)lgg~YBJSmNG79ezzkAzQ@P1~txuqN@e;nY)`YFZX*V#onpaHe}rN<57o!^ie1iig5W z^(d;hMc?NotI02>Td4DQ1ARJgF=Jy@R~Ha>BJZ73ObMbkYA{cJ)V@=GC<#COsIHFSI5V+~p%Bm0b8D{;yLnp#XPuF?ZEd1+zNbFTrjTgbeU4DQF zkCn}0-xLu7Qdj5WbZ^e_nREDbU8`HEb1(;f%zH2h0!9cthqdeG3T=(?h{rW7v8tZi^&W2{+zR6w zq==RdI>lB!5Z>cGKWXKm4nK!TTve)2ymt<{D^NSFxIA|#G`s;o(V&ZcA{$gV#3=Wk zS!t;pya1sy<8q|B88Z+`v=A)BElgi2#KlQ8=HQRp3TdKD6a^(d>mbw^B8jichcXq4 zvMP(6(K^m22pi>bz#TUGKqmDS32*T8u_AnP>nnJS)#eZhR`tP8Rk#Y2DP;2&eMg)i z5yX$XCvnAI z50k5c2qy8pM+LR$1rfd#2AKh&m^4O?0MVTo>!YbYY+yWu7A16vJ5Q_thknTn1-egw zuhwv9N%-Sd_U;=l9h<-Rq>yuhu!(>CUH*Wn zL2sgmFEo<8H+pnRMXQq@`<*Q75M4U-5aPD8)s&t&=D z_$j#*g^$!UT?6Dpg-P*I>3pb!4xmFg45oXD4FJ0&K3b>yqV3ZpUOej_8!XG&^lP>V z_E^Ee->CFD6scQVmT!>nkJ3CJrrk0k$76<9D`hd#SbCOmJAmraS)=ff8;p^+I~w+O zDEdQI8V#yn8X0hwq3VwczjkwNyC-sV zhGHr#lHOFUK^gMSdY7qfhZprFUqq=B?YQn4sFyA%jm8Ijf zaSf{H5tsfv5w`>)HanNEbxR|3v>f4z$vQOiQ|f^502hW_K>m4k^Ue(`l928J{@H`f|KJxTH3tjP-)V<3BXLh zE6}_$$*A!?G$L_Pp~k1^c)UcjQW>tv!z;j}XKOV}r!m5XvrU8JsFM8Kg@az6Z}c`n zbdY09#G3S&_wTF~D#gTQB|%5XtCLFK$dV;e4B?F9G6&Z5OvLYEKB>k^5NO6W&qMVO z1-_D}d41Q(PQgdAqBq32IZ5O&4uFB>I}wz20>wz?*dHjxuCH4uXl$S?{WCJ0R)sx_ zyPm%AU9;jH&(LCi*z%;W*TSY8AWI#6$Uc|hm?pNsBy z;nvl8Pvt6x^N(P7Aut?$t&vBDYbUAJ=}vfZ*)V1sor;`r{hW?yK6ujs3;^Euwch1o zc6mWAc|IVtL?@5$pfmvoa>$Napd(IC^R=yTP9gW33LR!{@h@%1DbD1tz{|(+LoCi> zk2woa^g8BG^-M&{J}tHAxqkJG>4#X8P{#~cZOL;gm&71OOw_QIfV8>rxDoH&>e$y2 z0$Q%p;{FtF@%~po2j-Mr^?$B(IJS@lJ`y>Tfc{kV?q zjqR8Qp+8?!HmBG7XT-d*1VYH#ipyr)w0}$J@wsLMzc~+V{#6ky0@%2u9L{VOmo4GV zofW47sTUx74$sZ|X_H7^X?u>fDEfQP!IBfhuw`rkuUA@9mij_QQZ>5%US^z z1_m^ZeOiaKGP^DsR;HU)+y9V@Z%Gm z_1SwxO%5jE1Xz|&c045{;8{yuh;FC@Fawf?Al_d!_3JfW(1Kz7*Y46rYr!i+~v9G z^!dRE9`7)kk#~+>Nj<0bvBFy4x{v5D6F17^1|j^b*^o~%$HIY(5i$YCTAPBz&*K=+ zy*yc3hLP~Y`{NYx0&St~E6o0zqbETJv;20p%Vqrgtt&@VfLaP6nr?Ea4z>Md$FKQa zwxL;UyIbRBK8XJ*Cfi-^SoQMX@5EI-69#YO<40 zdFb2KO`8b6r#qA3dz5FuiGM~0gnVG*ZhffYvpj$I6+!MN&%*#s!pH5p?BnD8vD)nH zK5vc!I5?L$&UCy`%Y`i-ah2EeE#;y8a9q4_F0{K3!_k|3vhE}reF$TF;F#GY=nX6|mVPco)V`P<0LNpWXZMFR!;`PIKOifpF0A!;{Ly#CnKedS^ zP$*V@46Zrk`$La%#E1zOz_kn}`pSG(-YvH|h?E~8C>17J5CRl7GNk+V@w$^DKyr!o zfoN4AOYcb*TPBJoK>}w#_t3voU|vaR({rrm{Q&yL3U0L#2dUZ7)*ib^w~58fJPNFl zt;W1Hv-&yZtIEzme-DH{Zq(ej6x1O=xrK;#JK?LO%R!hZc98dFa^V)elRY_HG>)77 zm1}9So*(5-u~o|l-8&;u82Y?`a~RYhAl!7l*IX|6Bdn(km6k*yrLro6+rYO>IbK}S z{Li_Q&ZXjm3p7+yDfkf7oLB~iLIn8^MI~oh65{Wl?%MU}!@qWR@*QNzaQ^v#Q5BhO z^s)2w@(9hR(T{M4T%Bj(~(61labT zTfId&F&sS0fb-GC?8I;SlK4X?jM==Y+br((%e%?trSu)7tLuXurIC+%Y`#fo5+#v~ z;mCKrcaz+v(xoONCb@@nloALWD5Zr>^AR83APqlP_eLYFOc4%g*0&1HI_d|q5kG+3 z3D@A$vaDlZ?K?=|tk&PKvZuI;A_9Hgl*`;aj&!kA?P1NdvpZafPd_ z4R&znh+MGqoFnn>=?0Xfjf2gNa^E{h;+fDzN6Q$c2}K$+L%F&B^t%_*Ds%eZMz+b@ zWscw!rogfiJL!$hIxe9yH&)CG=OyON(KtJOxooaNvSOWOdt{3;Y-Z+gg939uYNf>* zs3#w9ObRVCx35~MnQXATu3GByh!_Q%mOuJ{2_SSq9bUmp$8c77yldHulkYHFt+I9n zw8%a;*-_-Kxe$X7ZV$F(f1IN8S5-_#bidoY?Bl3c*9Dg$MfC=b@*+hswBuMhkH@ zVwvlqSE_ZcZ#YF}3U0ZxIBdRkDR0_!QA|h%3G0 z+S3m<1CZ~++A0f>{A|lRC@USR39u8eFupyEC6hc<7aCv^zg)^ ztr;iYWQpxBci`ep#jG&qvqYcL;LU{t)d65t?U*yjeEX?W=Kv zX@!NsHoc(yZR@O{dEHVgL`18A`{y}J(S1R@)P5UQQ|PSE)kF%*a@BOdfk`J*XFWLe z^4d-kam?0`u@VhFV;uYDdP6~piuPzw-xYYD5^~%RE2l)ojph^}{n^7ROws(k*^EoY zfo>hTHo>IbyyG+cUuj+)t|#6*{-u&CKqx7A0VO!8S5NG>RFsJbr_oKJ@w`%(v_myl z1xXD*Yumg|hEGg(x?Fuun^NiQ%*@wz{IaqPULp9RAafAQ=V>5#)}$$IYqCkUuY!sO zKEanbF~_W|6wEmk8cCZG6(OzyQPa|zh$o5#w-~jLfhK7DtL5RR)JW~(=7Du zz=5Tr1(T$NeXc$IZI;sB1QZusZx5C#Xt4iAmw?%eWD)sgcj|SfG;1aNn*$_WfncdF zkt5NFh-MdC@^94@3E9@7b#>7uZVe?m=~%i_%5W~T2( zhLc4bVNZhGf~J4J(;Qku-`dMN;l2#`NMZ0HA&g{@J4ymT)7W*16F*3PQ-WLv4z>u@ zI)H?ePL~_A63P$j93buDL8BW+;Z)A}{I$8aN_9zwd^KRA)pR#9tOrJ-C`z7gS*|03 zuh+YJ6%9FaVt3C<*w26AQ#ke9;Z~pK8-~m=n`1(xlU^{fW+;IQ1``X~@R?CB58JMK z%&Z#|9QGQp<0VHqv||;?OU&FeLBQgG;@#jB#C|rs565K2x}iS%F>uH)JIvAUby~lB zh_yv^!TLmOr7(#{<)Vz(?m@(@P@hT&47Vn)k{4qZl|N zSKDdJ1eo(;)eWh`2-*AHHx$g%%^Y2>j z*u-NXbGCK&SWIj13I7>(ZizyYquBEe=5?F+^r@P$o*opkgz9?!HK)64N4rhZ=Zn7B zanYkgWBmKm!4TKJ<8Q_>0>RqJVkJ9PZKsQwAUve(s)TK!-PoMU!EbQxrKpwn zQ(CYz&o3HBU7U)TkVzMVbR365^Zedldf$w-t-27IKDHx<&Uv-Majaf8Uh;g28?p-3 zJ$tNMm7KR5Xhaw~+))`7!~DZ%TT6@$hKP z5t<6WRZ1zLS*L4IYJ}Hnqm;qE_pGD7Kykmohd2c1N7zJ+ zddQ=BI4ZXMEM_IJy_lrqK1H_4$3?dtyZiRObI~$g6feCVKlx+>+5WXMwi1bW7ri}L zY}AF7o4;&QW`53EL%|v#XKU(hGnUJC3@5Pve#1BiqkupAN$u3(S zh7SI5xZ|u@!YC*;oxTyw5VDR~4AX12bVyPM@$SEUOT_YXtDPJ-fp-YE*LkDa)Gw?j z_=}Z-$e_VfuUB)+rMpnLY6ET1>qUX zaPta}D!xZ|2xBECbNX97{t==k!nthb`t;$fQPrsY7(bSOhdCQudtaZfjE*YdoYcOS zb!=7JlzdSeRh(IA%Rv9JT)8pitZHny?$5O_l~Ow?Ex5+Aujh*{mEn!{0#4&Ik+ZAh z;CS47y*okoD8(yaS71=631VlPkWiN$Qmt9Lcr|iCc^%mHRym__;&9mz;VI*Kno4IT zM0YqgbkNM4XWr>^irC$>c)0Lu&i3sg9G5ftvJB}5bpCo^S4|5bGfExx>iJS zwJ}!`%l!wuz=$IbnWDOUGL;JG+-`Nz;}q6V=ULdRx6=SfM^E*hpa*X6^k&Dm(h!N5 zhZg-Y{73kFbeQvhLavfN=T5ERt^QVXX8pk~lWZaOd=qs1{J`IJPUU1=2WH+KWw}>& zsu}?mjN<8bw??lT8b^IXJ;oBTzjGVz>#RWFt7%>-SP)?Nuyi#@u>O#mX*+ zd1AI~lrAR7TlVCdRCdSzx4SfrEju zfgHW&1(qF_C0_*z+)^Pyeh@h+x?gAxqL$E=hR~^Or)q+^9POPr(!IAk`_9*Vy!F18 zl)%}SW_j9-8{z-<7rXTjct(Ki9$t~`@wo73C$u2z>FIqq9Qu8)O0=VE6{*A(dhWa8 zBssC_#(=@x6Wd9~t&5-8>x51PS8tV-k}NO50i46sWd49QS2TYZ$|VP2P~W*%Z8YEvYf$-OBY=@qnR-4n`qeU6pt z38D4ZGQ|_W`w0<6hcKBxcv6L<-@d7(RjV-P~ z0{b$|jdSSbKdv@523}_jX#3+2F6pLe(@!hQmx$-&F0XbIXjjzTKNK&!yW9 zGxrdVuL`7O{yE_&Ft|LJ^N3GDvZJrxx=DTFu5m`v{l=-pK#qzfy>&An~ZMOm`$!TSBAoOkKR_mI;owS4PrWUW7hJ^ zpYl|lZLh$OrMpWWGJ`L*8Ws-!B_03oRUAZzo*#_=|}Z=LOl^-_Oe2%l!X>u73e*fQ&Ja{Kp{R zlz~8in+OKR&f3ZC|2Xsi8_Jhk5&nf11QB6;^DnjkZf5>dZ4D|&Fe4+)KWhJ7>i&}{ pkOl@aMU4kpVZ`{Cxc?657t_9I_AmOk6;|mWC`?R9_6-00`!5i7_3|{~R1R6z4gm40j zf+RuQV~_6S7ShhF28S1xF!O!+pQ*!|I%-Chg`owz(b4MFchNf!x3oG2RL&R%-eI^% zjK?BZv{`{E2}Q2?40o?Nz7WP6JA9jpt*<7oofdR~^w7qGc)eP2 z+VYms#HMnZ5W5T|VO@=-$_{^yCURhyfP>UW2U98FgYb)XN=q5r`{!AJ#53W@gx*%J z?JX+_+QPb93wfD_pe*h;Kv3*!=kDGoW%j%}3kWRJv>eJUaowyeLvnd}Nh>nFAVXDs zgOxaH9Dj`(p)O-(6sFQn!9|se69pQKdedI>GNd?N9*8@3)k~c z${froz2=}JWW}+c#P>adJn4bS-T@XLS`3b9ebs#>R^yb_`XfDIjz0PT;A7;5l4iks zyX7k~xcix%k0?uvepJ?Dc@@CIZZ27QynFPgS5>?k^bhip7-nsGDX~2M`@q^;hJ~C5 zUH>eWz2zd%uDc%_E_%U_GP*VFC_uNsS8%fSv%oBwC-ba7K1dFajoI7Uhq%#CF0~eW zWKxkj)A53fc1`+1N9Az_?IP9tg!y{s{smX@;Kj5{kdIf8^9$(cS1!P(l^js&(>!+I zu0lIsZNv9!_{_I=%?B#pziH;8_x&g%=R~`s_g+4BbHv+Stl)6D=C3Z@hhql!a$G zeWcjl&8kg*RilXbF(F{$<@gpp^Il3a$1!od7%pJy=mptcCm7NmXU2;Pi5U=gbZZeR z@AD#ukEg$nZ<-?&DZu1i@7Ri>@b;&5Q;N3N70TS&*>M}O+nJp2;$Kw0)H-#)Raw^s z72{nI?hwP?8o(w(Qwtbwt2{7%tFhPa?|mUB5gm7ycR+Uv|0ZvEkBM||B??hV^R&*8 zfEjgbNBv$mke5@GplGUeu#k$!?<1%A={D2a>A~hq^fYVH(!-R#X7sO;s(C=ELPq&h zTQ${a@<{(KZqON!G5@JHOoO(!8we&W4q(B6@;GHg}A%d=A6tlV)B^9&mb*e3w z-ya_G%x)TA0fWT41A67tYZKp}W@~9%<2jz3Rp0J$taT9BB1USvUvlFvl3pi(M?X=j z!ybh0T;VkPzo@9Dl&oKCEo;pJe4V}qviuWnt-Qtrtc`H&0y3mRZ#)&Of=#F zX?0A)hz~(>(Hg^f=fOCfjJUs}PfcqF!|! zY+CRQ1>9uRLlJjwQx=B@w-@O_SdON(NR`!yr6FrLdfF1sTb>N!liLH>7qFg1w~PDn z-C)A=5~3h4Gm4;7$Y^Cq7Jb`OOy#TH$iOD?sKB%!&8v-aN=uj&i28n0N9NTbH)|h6 zuofC155aRAfupCROI0I-A-xI&;5u8hKzRmeZ9B>8m=i1Q%Zpyd;?uiQF+)hK}oeN*H4GTKM$Sh@+xv!tT6!n0ckG99+I-GsYeZ zB~OW(k7e7|`2cIsYYt5#t5dhgk85N)u_9*r&FhA9$C_`%vRH9(H` zAlfiV1!~Snr!FpM;uN>^WBo>9S*YbRrFB=OO0Kg)49F ze0+p04~V}d9!u3o2l;Oz*LajZsm?JmZr08k;1w8q0<;_k)DZqUfp@yySbhBANDjJhj?H3+^oI{8#i1$&`xmYdYsBIG`Y;O0u48C0aNQGb>we0 zvJZ~AasA=2`-T4G`WO?H`H13y;t@Yh*Tgz0R>eh!8W+-S2m4t|s1{y<98M~Ykbp|R z2>T8RDPU#)!sDRGorRc-2rG3^fbgJLfw@)3G!TMTRktfRBQJ89TsnxI@u`FSIpiDf z(xTzEHF8fnuS}_ssx`$1#<_s5QkeXJ>V}BK=S=wuZgW-&IGpE2p+rz)jxI6|G>!9P z^M_%%fai!;vmSlwmoHwC#q^3G_0s;f-MTXL+ygcm(qg-B${2+BRjI4pbF2k)4l-YT z&m}0MmdY|axz@6qcD750mrr2_vZqykThLdMwDL!?nx%AIZBVW`3Sz!eO4{%x z8d+cs3*^coEULe~AJP9>^u9*K4#{&=!d7U4@zC}L43r4WQ0hFM9agWj2;XC`GeL-q zLjY=I#~0QfVi=30DpBmQvl!vWC`~j^4H`MRC*^o-avtW>yk21+JJD%Lx)y2l?S&tw zWxA1v=M+Qx&na5=8{WN|^>6T7Fa>6@HMY3sq&~TXil3NRia8cu`A^UIG)zdxCxxhR zq%CcUwf0Q?X0yyI@!L$>2t{7pbXh;uP9|UF{u+<(W7R&%LpL-wI`zEZPDZQ9`WfTZ zh`GdX;v<3E>+@J%eDf6yjY+FvQUXwy_?%LfLdZVxPiGZHJ*wS2>X@+|`DorrFC4s6 zWIVd~J*Fo~%az}^X2rDj`;0uDz9~!?C&^8JKi`6n^8WU8M>w#>K)&A0cQdIz7`(j7 z9iwC6xe|d=`AE*Aqj??KO#MD6iIsM6=HusMZe7M3snA+?L06(AB$SO+U-m~^m|93VZp?>$!LZkvAmQlc+KzB&Z4S-`erbG zk=Os3XC#5764J*Wfd9kr1egw0H5QBYjW&hoWO~}5ZV*-0yIe*}V!ENzZ)-ODO<4zl zrmc%-%MVS#hP&#@#v+mt-fww^!73zkZ-l;44{1Am7OR>Q-udwkRzBPv{ur;!IYn#M zmxNh9Lvl!CRom$({Noo zla*frhGRV z9fjj#u95%xzBR2xLEwLzjqouY3}S==IU8W?_NTEA7FvCDmxjjJy!!sdp<%x7U0mk0 z)4GjE$fX91QIwE9CRUmAVvMd;PN&*dDaLxdK&|o z%+;O_U2G=tuFoO-l(;G=32Yj#2ig-XRx!|-!+L(%(xq-aDlohk4hxWIvom6u6*B1E zKQF~^!T%JHxni*MDQ`WL2~8-_eGe#fKWn2-2+w&m^G#^g;i4Y*G_o(BFcS@CJdv6{ zFVv)mJmNq2{zN7_J(h&G+`Ll9CJ0dP$q0$LJ{|<*3(cyDta}YN-^0l}nwSil%=p{pddE$DLt45DDhQDqM?RMi>SeD>Jkbff zxx8k0SFWwVgVgUM0(e9++9M)vCy`(O%%^_Hi~vb4%3wb4OGg{e;GUO^ z&JgXxu77GKIjiur<0yK5tV)ukAWgRKSEPCHaD$zox2c?~(e};olp-hR3-p}^s;DH< z@1mJ~w?XZSq@>LR!XR}a>jH6=0tqzTR7EpvR|Lgjf1%N{M7N(k_DI8M`(15k{?x*J z?qS(J*}&Wu<&2YRZz;d-ydm>Od)}{9$M6ELr@bzfBaES)ku7}-;h3(<$D0oZ$TfUH zwNubnZ}`9E_6y-)FURXIqpq+Eko!f%Xt{^a0(!&89JM2E|m;z0AG8(LlQ-CnwTOvYg%!S z|JRQmrW=aC?S%va;UJP}_<=uMO7OsSO-DOmQ{VTRVkk#*Z2pRKXI9!*r|C0s@!NI|W=l6}S@V)^*(%t@*pV;cV83w)e+DLfJ*T%Q z4GH$ikW6D^-Ctetzi2N|`(c*-Rg2F6;slZDw^ZOrNZ*-H4 zMMe$v%!uo3Y!n93)|>T>^9-B{UB+pXL?F*$Y6DMpH5CTgT@@aluGN-Rb*f+0Tq=ck z=2?HnD1fR>IxJ%30m+|=TF@-H5Iw~$n z?-D%Cj^U#H_w2{4g%jeUBf9rfe9L0x4n#BATa>@?=e#lp9!SNE1Ms66%7KIH5klZ@FyJQ$RH3Uhy+o=Mumu>BLxy= z+}3#rB9E2t-V~}niME%WHzQ*uGOm7+C%c$u-@vk|fkq@yMZD;=oY~fCRVB@>f4Z?8JS@`RPQav=mu@Bb$xrO$u>HML z(nnGkTucru)zd5RtU~}Eu9i1fBR){*b{tKlo!X_FD}fR7ielsIBQCtK@0YdWFX&@? zaw0~2tUhC*%P*@!3{i$V=U8O?^|y>&?YR9SSqcmq`O5(m2f8wIhF<#}K2&ZW?ji|n z!}1*?R`U2K8RY5x{fFP)6AE$^4%L=V@nh)e>dQKsKii^O31zhPWz0j~84w3_808&C z680U5;JveHh|}q=iV3;FJ(PX1L-((@aM6a>qhOcn2BRN}SJzll($qhGes;IB`}`au zoYF_`m$&9SSGlF^m(++-bgmzK{?sEUbmJ=XqZE01Lb8+D$LyVJL(QUb=3W6CrHr|L zuCM(Ls;eU(T)ze{MgG3L!O-V{sq-;kDQtD{Gh{y8gT(oe#e6K#5f)rf(J*EIoA8rCQ z%q^hfWbCq|7)mh-nPy5R%?e*VmWzEti?JiT$IlMc--J?|GU=Oe?#^I`cXnXhv-rRJhbWh0Kh7s}a1 z#&n11@T0FoFLeE z{I1JoFTc^2xdY#??oz<(sI5WhE2QRtVa1v?A4}0p*}SwBS}{E5QViTQD=?xzZ$8BJ zp*@`E3s}ujAOfnw6Lvu;nHj!4TZn$KkqxM9p){9mt^?HG!(*g;RJQhD?e-W6Fgf7 ztV+=3Mz7p%$^HvJ&Cd;VHYO;4qt|X`9-n}1CIAV)bQ+;VN{l-o8d$42* zG6`jgd@pO3ujb_l+cS0hS6V;lMI^mG8lfEd6THS%Z2i%2C^QtZZIfw%g{~fiaoA0B4Z)53g$>n9~^*>xj zto*Siiulb+q5qGbe~-_9tcg?oPixI&AdtPSv-|&{