From dbe8dbc9385330323c3809a835da4dea8870b3d6 Mon Sep 17 00:00:00 2001 From: Bart Jablonski Date: Wed, 19 Apr 2023 16:38:57 +0200 Subject: [PATCH 1/2] The BasePlus package [ver. 1.23.0] The BasePlus package [ver. 1.23.0] Three new utility macros for the BasePlus: - `%intsList()` - prints a space separated list of integers, - `%splitDSIntoBlocks()` - splits dataset into block of given size (and one[the last] possibly smaller) - `%splitDSIntoParts()` - splits dataset into given number of parts (of approximately same size) Macros `splitDSIntoBlocks` and `splitDSIntoParts` supports *BASE* and *SPDE* engines. Documentation updated. --- README.md | 4 +- packages/README.md | 4 +- packages/SHA256_for_packages.txt | 3 + packages/baseplus.md | 313 ++++++++++++++++++++++++++----- packages/baseplus.zip | Bin 255097 -> 260659 bytes 5 files changed, 275 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index a431823..b5e1506 100644 --- a/README.md +++ b/README.md @@ -224,7 +224,7 @@ SHA256 digest for macroArray: F*85E3BE4D163AC5223B6EC9D3C25C46564A656E3830998B45 [MacroArray in SASPAC](https://github.com/SASPAC/macroarray "MacroArray in SASPAC") -- **BasePlus**\[1.20.0\] adds a bunch of functionalities I am missing in BASE SAS, such as: +- **BasePlus**\[1.23.0\] adds a bunch of functionalities I am missing in BASE SAS, such as: ```sas call arrMissToRight(myArray); call arrFillMiss(17, myArray); @@ -248,7 +248,7 @@ format x bool.; %put %repeatTxt(#,15,s=$) HELLO SAS! %repeatTxt(#,15,s=$); ``` -SHA256 digest for BasePlus: F*F39F38CE80A5D8EED3BC9F2413CD6DEF38E8657E5DCF427CBA8938EB8C4350B6 +SHA256 digest for BasePlus: F*625E56B017C4AA8D436959C0A03C8503773A9A3823D43FA9E0326276E52DA6F2 [Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md "Documentation for BasePlus") diff --git a/packages/README.md b/packages/README.md index 9a328e9..fad63a6 100644 --- a/packages/README.md +++ b/packages/README.md @@ -86,7 +86,7 @@ SHA256 digest for macroArray: F*85E3BE4D163AC5223B6EC9D3C25C46564A656E3830998B45 --- -- **BasePlus**\[1.20.0\] adds a bunch of functionalities I am missing in BASE SAS, such as: +- **BasePlus**\[1.23.0\] adds a bunch of functionalities I am missing in BASE SAS, such as: ```sas call arrMissToRight(myArray); call arrFillMiss(17, myArray); @@ -110,7 +110,7 @@ format x bool.; %put %repeatTxt(#,15,s=$) HELLO SAS! %repeatTxt(#,15,s=$); ``` -SHA256 digest for BasePlus: F*F39F38CE80A5D8EED3BC9F2413CD6DEF38E8657E5DCF427CBA8938EB8C4350B6 +SHA256 digest for BasePlus: F*625E56B017C4AA8D436959C0A03C8503773A9A3823D43FA9E0326276E52DA6F2 [Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md "Documentation for BasePlus") diff --git a/packages/SHA256_for_packages.txt b/packages/SHA256_for_packages.txt index 3f567b5..ebd3b1f 100644 --- a/packages/SHA256_for_packages.txt +++ b/packages/SHA256_for_packages.txt @@ -1,3 +1,6 @@ +/* 20230419 */ +BasePlus: F*625E56B017C4AA8D436959C0A03C8503773A9A3823D43FA9E0326276E52DA6F2 + /* 20230417 */ BasePlus: F*F39F38CE80A5D8EED3BC9F2413CD6DEF38E8657E5DCF427CBA8938EB8C4350B6 diff --git a/packages/baseplus.md b/packages/baseplus.md index 55c4433..c660ca3 100644 --- a/packages/baseplus.md +++ b/packages/baseplus.md @@ -52,6 +52,9 @@ * [`%bpPIPE()` macro](#bppipe-macro) * [`%dirsAndFiles()` macro](#dirsandfiles-macro) * [`%repeatTxt()` macro](#repeattxt-macro) + * [`%intsList()` macro](#intslist-macro) + * [`%splitDSIntoBlocks()` macro](#splitdsintoblocks-macro) + * [`%splitDSIntoParts()` macro](#splitdsintoparts-macro) * [License](#license) @@ -248,50 +251,54 @@ Package contains: 6. macro dirsandfiles 7. macro functionexists 8. macro getvars -9. macro ldsn -10. macro ldsnm -11. macro lvarnm -12. macro lvarnmlab -13. macro qdeduplistx -14. macro qgetvars -15. macro qzipevalf -16. macro raincloudplot -17. macro repeattxt -18. macro symdelglobal -19. macro unziplibrary -20. macro zipevalf -21. macro ziplibrary -22. format bool -23. format boolz -24. format ceil -25. format floor -26. format int -27. functions arrfill -28. functions arrfillc -29. functions arrmissfill -30. functions arrmissfillc -31. functions arrmisstoleft -32. functions arrmisstoleftc -33. functions arrmisstoright -34. functions arrmisstorightc -35. functions bracketsc -36. functions bracketsn -37. functions catxfc -38. functions catxfi -39. functions catxfj -40. functions catxfn -41. functions deldataset -42. functions semicolonc -43. functions semicolonn -44. format brackets -45. format semicolon -46. proto qsortincbyprocproto -47. functions frommissingtonumberbs -48. functions fromnumbertomissing -49. functions quicksort4notmiss -50. functions quicksorthash -51. functions quicksorthashsddv -52. functions quicksortlight +9. macro intslist +10. macro ldsn +11. macro ldsnm +12. macro lvarnm +13. macro lvarnmlab +14. macro qdeduplistx +15. macro qgetvars +16. macro qzipevalf +17. macro raincloudplot +18. macro repeattxt +19. macro splitdsintoblocks +20. macro splitdsintoparts +21. macro symdelglobal +22. macro unziplibrary +23. macro zipevalf +24. macro ziplibrary +25. format bool +26. format boolz +27. format ceil +28. format floor +29. format int +30. functions arrfill +31. functions arrfillc +32. functions arrmissfill +33. functions arrmissfillc +34. functions arrmisstoleft +35. functions arrmisstoleftc +36. functions arrmisstoright +37. functions arrmisstorightc +38. functions bracketsc +39. functions bracketsn +40. functions catxfc +41. functions catxfi +42. functions catxfj +43. functions catxfn +44. functions deldataset +45. functions semicolonc +46. functions semicolonn +47. format brackets +48. format semicolon +49. proto qsortincbyprocproto +50. functions frommissingtonumberbs +51. functions fromnumbertomissing +52. functions quicksort4notmiss +53. functions quicksorthash +54. functions quicksorthashsddv +55. functions quicksortlight + Package contains additional content, run: %loadPackageAddCnt(BasePlus) to load it @@ -301,7 +308,7 @@ localization (only if additional content was deployed during the installation pr * SAS package generated by generatePackage, version 20230411 * The SHA256 hash digest for package BasePlus: -`F*F39F38CE80A5D8EED3BC9F2413CD6DEF38E8657E5DCF427CBA8938EB8C4350B6` +`F*625E56B017C4AA8D436959C0A03C8503773A9A3823D43FA9E0326276E52DA6F2` --- # Content description ############################################################################################ @@ -4224,6 +4231,222 @@ run; --- +## >>> `%intsList()` macro: <<< ####################### + +The intsList() macro function allows to print a list of +integers starting from `start` up to `end` incremented by `by` +and separated by `sep=`. + +If `start`, `end` or `by` are non-integers the are converted to integers. + +See examples below for the details. + +The `%intsList()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%intsList( + start + <,end> + <,by> + <,sep=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `start` - *Required*, the first value of the list. + If `end` is missing then the list is generated + from 1 to `start` by 1. + +2. `end` - *Required/Optional*, the last value of the list. + +3. `by` - *Required/Optional*, the increment of the list. + If missing then set to `1`. + *Cannot* be equal to `0`. + +* `s = %str( )` - *Optional*, it is a separator between + elements of the list. Default value is space. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Simple list of integers from 1 to 10 by 1: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %intsList(10); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Ten copies of `sashelp.class` in `test11` to `test20`: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + data + %zipEvalf(test, %intsList(11,20)) + ; + set sashelp.class; + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Non-integers are converted to integers, the list is `1 3 5`: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %intsList(1.1,5.2,2.3); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 4.** A list with a separator: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %intsList(1,5,2,sep=+); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%splitDSIntoBlocks()` macro: <<< ####################### + +The splitDSIntoBlocks() macro allows to split the `set` dataset into blocks +of size `blockSize` in datasets: `prefix1` to `prefixN`. + +The last dataset may have less observations then the `blockSize`. + +Macro covers `BASE` engine (`v9`, `v8`, `v7`, `v6`) and `SPDE` engine datasets. + +See examples below for the details. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%splitDSIntoBlocks( + blockSize + <,set> + <,prefix> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `blockSize` - *Required*, the size of the block of data, + in other words number of observations in + one block of split data. + Block size must be positive integer. + +2. `set` - *Required/Optional*, the name of the dataset to split. + If empty then `&syslast.` is used. + +3. `prefix` - *Required/Optional*, the name-prefix for new datasets. + If missing then set to `part`. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Split `sashelp.class` into 5 elements datasets ABC1 to ABC4: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %splitDSIntoBlocks(5,sashelp.class,ABC) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** By default splits the `_last_` dataset into `part1` to `partN` datasets: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + data lastData; + set sashelp.cars; + run; + + %splitDSIntoBlocks(123) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Works with `SPDE` engine too: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + options dlcreatedir; + libname test "%sysfunc(pathname(work))/testSPDE"; + libname test; + libname test SPDE "%sysfunc(pathname(work))/testSPDE"; + + data test.test; + set sashelp.cars; + run; + + %splitDSIntoBlocks(100,test.test,work.spde) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%splitDSIntoParts()` macro: <<< ####################### + +The splitDSIntoParts() macro allows to split the `set` dataset into `parts` parts +of approximately `NOBS/parts` size in datasets: `prefix1` to `prefixN`. + +The splitDSIntoParts() macro internally runs the splitDSIntoBlocks() macro. + +Macro covers `BASE` engine (`v9`, `v8`, `v7`, `v6`) and `SPDE` engine datasets. + +See examples below for the details. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%splitDSIntoParts( + parts + <,set> + <,prefix> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `parts` - *Required*, the number of parts to split data into. + Number of parts must be positive integer. + +2. `set` - *Required/Optional*, the name of the dataset to split. + If empty then `&syslast.` is used. + +3. `prefix` - *Required/Optional*, the name-prefix for new datasets. + If missing then set to `part`. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Split `sashelp.cars` into 7 parts: datasets carsInParts1 to carsInParts7: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %splitDSIntoParts(7,sashelp.cars, carsInParts) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** By default splits the `_last_` dataset into `part1` to `part3` datasets: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + data lastData; + set sashelp.cars; + run; + + %splitDSIntoBlocks(3) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Works with `SPDE` engine too: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + options dlcreatedir; + libname test "%sysfunc(pathname(work))/testSPDE"; + libname test; + libname test SPDE "%sysfunc(pathname(work))/testSPDE"; + + data test.test; + set sashelp.cars; + run; + + %splitDSIntoParts(3,test.test,work.spde) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +--- + +--- + ## License #################################################################### Copyright (c) since 2020 Bartosz Jablonski diff --git a/packages/baseplus.zip b/packages/baseplus.zip index 4eec6fa2f2f0237eb5372a270ae243d08a4c26ac..7e4a67ad69501994951ad2541d725790f015a237 100644 GIT binary patch delta 20519 zcmY(qQ8J2V5xMxisIRj2Uv+Gakkw z98IPfFwj#Bobjfhteo!aXr#8l8(5Q+ZO-Casy&ZTdz$>#$*Lg`Sv5Gn{K(|)+`(*k5%AaD{^cyhwAM$z!3rc)$F zV5@V$96^ALIqe}-q&sV4qZ?EW9O#QZ?`6`P`ubJ5X;m8I^5`XnTMdp#)9M>=E?ADt z$yZwz6OwxnZd&wbFS#LzpEm%15iJOT4WCdQE7fJop-^aB1&ON4Zn^eIL6iknB$ylY1q}G*XP*em2CH<8{ z4hJZa!MljexKQUUae7qKf;r=jzm14!95P34JkUA+2I<^Jw4!3if^I{aDs$?7z%ILn zmQ*u_*i>miL6>RRGC3y@a9H|N)(E@iIK2R+tsG-PH{6Ql}DLnco5+D z8Y&&#%As;fsq{Nn}TE8rsh!(HBWBz$Nn}4{YMnh>VhazY^phXJdVAT@g_yXs*Ktq_Y~hI+H`o)iOtD{+jWAM@iEK*&Gn5?`jlls0{s)Xxu zJ~AX9W)MfD6L|zTHNh`(KLGZTzY^>PC6pxyvem9I;r7-98n66eamv>j)A^;2*V#d$ z4>tbr-G=V57aS0Z9FINNI6yrQ3Ks8g7y8Os{tU$wkYzT~O*u1jlMXiX6}@^rW`{oFzQkO4m_0qITD z_Z9G`^z3VTj>L_PC#Tx(_^(S3>0PWyr?#jLutk7@>#$u=>1nfq#(+aXvLQ&YOIym8 z*llu@DyAX^st1|85`gOu8)kLe&7OrKLUCVrM;-Z|v}|wJP66)egdeqJ@rVdT$%dE4*sCMuL2{t<-7_T zbNABUyt`6d5&{^WqH0@7m`OA`^zanDJFxS}p%|EZWPX`2Ec-@qc*Kw3nnHRNNJrpB z*Q>~Y;>l_{0Y~6eiJP+=#q_`m4{2@PwnFbi_&=-X)6VxYTrg*q+oFr&;vsg_e3yU< zX?n!(Wz0uQP#+WB;`kjZHIG$dLk#DYR5TwIOKIq|!U0%^M|smo6p7R>H>#NQILy@5 z&EVz3!ErL%|HkFFbyquIdebFyh+3x_3LHl+ppEV{4f_KxKgH?xs?($ZHHM36@=a#c zbHZ|mbc>Axq0sfoVVsTE*q-sZamx0jYS}xE6aLaqto_rW_8m_u;m{4*+p)2ro_s`$ z-jW7^)&YAF`)B?2Tx{H;XX7VLW_iy_`L}lop>?hx*5TyN&?Z_yWUu0 z{t~cfvaDbxj`4Iim#h#2o`OMEf4n}-LjUHZ^n;#raBHu@N$B^byh}qerptMF%YQYp zesrPV^1edv6?wtN!W#$!tB;i*lMgD@hK$zT3JU-#0fHQg&gd_4eAfF}TaM8ne{J8s z(pPeLzaGA$*O@~>q?0ZPT45135IS!HWtwBRZqzDM-(IF}01Fl{KQ%|6a6m7-}>FxuX?Y=RUj2d=;k8n=6KH{Lg~_L?*=)>?&vJf zaZ8m?mw4^W25*N7_u)MGmoe;Wa^>f?llaT&mGOUML(>UlHwe^!^utQ(bX`(43mT^3kH?@l%SaMY2pAyL|iuX$(y z4*h^UH?f;@TMtM+6T+E?sH^f0(3TkR=$zWK3o8FJUjO6&(V&SeVaOE zGMQ4QxMMm^J31ylwGKp7m!?Pp<{ZG2o=8=G9^;YV`P-x$7`!zbTN79&ehaG>XYU*& zw4}YM=6Y6L(Ad7^EfBLhSp9FGk;~AzO4X(i!jnD z*AnzIuwMfDHHguFdhWC)Vii9)D5^@{6SSRy2Lca2I|Rd@DDVcQX9(L_8TN$gvc=^G zSbDuHe{)>>JUjXdOFH~}u#Uf*wN@*aoFoq0k8IY^pJJ^^@HvHt9q#!hqrs29t<__- z(?Ec2;>D0i87rpDh>6N_(qwzdE#x6|(N7ncE$jl1w`uE;2J ztdXB>U@Ta3@Ew^Q2M=jt zBQ`;|WC5S%iVEZ}8AupWHlGvTVE@wQluBjviM7~cVEOp%&lTqqdx1`B*d_CQF0f0b zb#2T@Ex#EsOK3v`O@J_9<4UG)GF;n2|NL~-;G|ydUT&nPWPC(3sVb-!LL+DKIxj8A zXw9NzyPA2^o_MRGU=IBgjI<|~p&M%_RO#~+Cl|6dI#yiKEwR|e;pZ9L?d z8g-aV9IMjIRSf4S#e5Kdd=SqvL@XZlpc=}hFdY8SteaiNGUQ1kgEvTCS)#HK9Gero z?gK*Z?-7wW1C3_Y-wtA0II}2|%uTFZ-n_4?TvEW*fT4>35TQbLrU;yv&eH%kAv}GY7zpCP z!bCYFjl`{l^rh1Oso)IDG_7h#qZw$Wgd-G+N(;i8t^f|vKZ(>vq8PT8G7!wPoZvv; zXAbNHG=U;su23ir?Mow+rbR6~swHeQx*j=vSe?9lSbYmPK9uvx;iWB{%b~Awu{e<3 z)@o?EzRcR+tE=S3sE{^g&7(qwsgt=(64FW(K+lh=QnvY1$6HG8M4Z@|C7XwaQl_*a z=*Z*vjb4E6R)6lPAmSQn`*)E_WdA9`7p45yLK%n)F_Wh!Pe4gIKa1T})R<>jQ;sYp zLd;^+i&{3|cSa9JRbEkt2%{-OCW8z=#2=ZizIo;5D13U6j+2VmX~;!_ic+a{6!Qn^ zRG@=n86HZ-O7Ihy`0>_!TjrRAs*YI@Gnve3aut;DBqilp#}afe zXmGFoCr|3b(tM>Ryy5bgN|&v1$gKjNcVPCE)Y4|2dar@r zFNZ(VU7cPl{N3k+*;(Aj)+!dO&@WH4qb=+JG2-|uZ$(*$HyniJB1D_!KN)#ytN1G7 z&!{l_-D0N9I3iWNVnd^ySk1XY>qJaKS(o+xpdr7O^Fha&#`)kaYBNfBzx-a_tMQG^ zrF*`>@Rk3R>71{gbzhgh!-LOuMez3?Y{ql3Ls467iKRZMWQciT+omF=Hk=*2`Vj8} z&ekaiZfs%=1}zOcv1Cp(8ABEm2iVy3$*LGBRP_#xl(nl_4#nqjg1WJ^WnowQyb6X= z@#{%3BW*8{=d(xLoEtL+Jc0SH&q_~P_-Z>pJXHu-?S(MLib}l{Oy>Ksu%^fN@QQ8U zqghT_BlBlHpdY_Ga$U6RU--3oCn2~+RK0m1SZVFtd&k@j4hqLS+Zh0oS6ged__Ie z;E%a5#AOI^r;B`HjzVs9p6u;IIb}I&@m8NNvw1b(Nd3~+L@eur=KrdpzOP>Ze9oUY zl=J>vHl>!0S3?^0?}m!rT-lOXb#~WbH|QaX;qfo(L*#79ri0H#<)Q4?+#uOccjh0X zG(QE5HqS=$x|ynd?>t~&JCm#uV2g$)&3tnxRWv@5q!{sg{5e*TT*JSzY1HQUvUoNM z^XHLQ1(9X$wQv1RfCX%yi;toO5YeQ2%=gb96QXN4%6+@#odyVM|B>t@OE;PElMiLR z(+BBAO_7^8NZnwFT!p$QagcHOvdQRD{t$P<-R}nTn?`ZNSR9EmUfJ56G1gtMbBE>W zt(4+Re!gyIJ@pmfty@B}UQ#U4Sl^d-PQG5a(4Yv_HVqW9eH48BejS_z5bpV3&%gNi z!ug4!USg}zsW29)Y-ZsU|Hv-y&HPxFARA9A-*<7^D~1RNt)0#9($EGJ1Qd4_ zAwq=iNTGm>=Rv#8V~65E8Xxe*Qa!8cayqw=O4Cz=745T1^tyY?T`~2olO_&~>3?Mo z<{QFYKFbUQoBXZs)1U~h{DTsDNs#;NTBz;cZEkX-=ZZ|^Q1 zp3d8ycyRM4!Y`@BEy*AF({u44vOPt>B~Xp9CFe0Hu6ccD$R8?lP-14j&}#c*ZIS?Q z%`8o!^f$x>+vhI3L}U85DN8g#R-R8Hd905NbrN?=ysi1z?EtnR75W%%)*n2Dz_vM! zpzQn)xjCb)bE9v7rBg&Mxa2X{=91z|S|09nlhK38S9w`|_FUzyLmY%Dy)|GCJKygS z@6s73#3ct=P$Ng+v+K^JDPz5?JErm+yc-H=`$GGD8cVnL00JS4Zo!jMhO1x*rtwz7 z%0j_YvNZwNsvg?6{v=9r`kDSlNdSsh3lYN?Y9+cxF5LmZ0D#uxUI+$1|1oy+r18LjBIWZPbRnAOiV~@ zf4((OV?UR;(z>&k(pNUlE@DwIq&H|7Mil>t34etkJSFSQ-kt09haAmgA)v@B>Amyx zT>NV$+3d9_|v(mZr*p z;_k+UqJEF|F{-~+J=UHfkhfAwOVc*IQxB!PoO645Zfwjiyi6@yR`a;NB+!Wk(Z%ME z+2fQ~r=i~)ITp*PIj**w`9^f|shn|Axl&X$=?@J+htHW>)s=un!3CUEVN5l`{K}pP z9bxxAZ&Sn{ijux5XKVS}?ms(*1=Y1J-F;V=_jP&S1U7v0H!vQ%G?@ z*AkdhXYdnxd#302PDu+Yj;~4Jy^o-ZaWPKcn-ig6FJ(S#SPy86{$$V5oCXYVtw~G< zI${GFPBaFETb;e%y(wCuZ_{^{H5eDt$WW>bnr(8L_oHfk29Md3>HBdgYE=tH>j}>D zz8#V4+8=a486W_9;LA!OO}A?K{1=7p4;8JS)$C>#^_9EbOItgweFT9Ai%iGY z)9sC%ix1t19m%9L1(S{M8h<TB?Hv6w&$Qu@`nB>oFcS?PpfAd&uH~F1B z#?6Sk3-!uEk@Udp&0IPTWC|8KPEjk1P7_|NY(<3 zEo@RzPAp8MNA8bO!^XIZnzd>egUa_&$^L$!N4}6w-H~Dcreea+Y8#3LJFgRU~p!D?Qh?NBVApRO7{FN!9Zh_Fe43)pE7rIQuIpbYfjRn6O z_VBXbwUn7&Ay`jA;V8B;gjsyX3)GI3&?tf0<=#MHAa=_JR6+#QG!PfGGv|5dC}j9X zA(uh#F6NvmyXDkkD&Be6+FJ^Qh={24@*eG5K;80m9d8#ozipGsjj%iK{sW5gKUJE# z6D`JB(ia{BKu=+S3C)*sUvLX4tr|ASH$0eLfC%XjRLUhHu6UiHy1}LCitYVEFAOYf z1e5T6F4tROb~M!y%_XirH^w|EMY~vcgfPk1iq&hnMPw0>PjxietMwO?@ zfCm;&44;WvemMvlHkW9S56J)KRYL$qM-vhV$cqsO2nGlZ$o03ay^(1WGCmeyIn&O0 zLjuXa*Mj25sA$P#U)h+_j)nekW{jva8l1#mr7R~_QYuWzXJMRYobl~xdlA+!s4q~( z;v7*^%Dr>;s#d)=NS34)z9jyl8^wz)pN<`>-?#znhYAg;$Vj~CrX@xL@tKt2bpkTbKj^BmSPM~Dtnw}U|6c@9BuBj_`7>vRT z66axz?P_>v-xPGpOk_MoW=g6A}) za{fWNp?HIfIViun25_q^fscuLKI_p$(%00imyeMAgjxdwgZ4)vOLJ6bUmD3aPEL$%#q0Et_9VAxTQDtoT`k5I)HQEj+mb*= zYzY%gd^|oDuHv{(<@&X6)O9ZEC7sT|$QtLI6)|q)6U`JGw)+i<7pEMaKT3!qTP!;& zg?${SM?cqVSW;QZ>3f#{Zc)TiE2&^AUojdlEL`!xWfJABfV%{^ZEn4LiaMqE|51y4 z?IMVJ)PyF)U*r!jsUAA>=lej0j|mQoA0(51VUZ& zS-Pihb(F^ZtS27O_i{=+#BOF1m1_F2VRtc-VU%kr!9Ek?+oe^(iy#iH7I{?|_EI&^ zjcplJw_I_alByzQoeiUw z+LM#sdq8A1az(WJ9 z$hv~bF0Gb)1zSc&F(lPjbV5M-cI9`@g}7P|8k0QVs(Eq>oolF9>mmz$Q~3_{1fTRd z7dxb$U9phc+(421O*8MrPiykV#t<2UsV^U&piO;0OhM(M-TBBT;@TDY!T1CjR6-R5THV{`t7J|*OwY~*LkgmM6{kb`<50{1Hk(=VcN9_rLDpaU^`^ciQAz$I zeDG?^lLSf`DD;OS&^J`@im!*i?WW?bS3qM$CVLU_eN3;E-0X{P-`K0| zm8s9=q-sL@m3Ku^D`+jPU8NY7fkv105sX+Fp`cF!jcc5ia;z0?Sn(f1-*-JY;au(J z-VX@@nv5q_lz!ZZ`FBOG=ol78!7Wp-N*>hMy2(hn=0VfHe+5rxbG7DQMf{p&5RfBB z<7S%IIqh}bSmkA0&7}4H+eSgxR=13f+nmxfIXq>@)vwZbKy~be6YWuv@KwB^dvVeQ zJ|5+37eY*cc1@A{&dJYMEW&}v5wbCf3^(+z017&sX*$R!gF2#v-~Qj;?|G+iMDn5F7<0`kbGQZ@em zp9aJ~8zeoEV5je^$PXs=as!S=CHiB{%8_(ks`^7L;5z;MNyMP=w89?}$q0fUbSO@; zLG;q`k?bw6F5YC!Iy?yO*`3?*!C)1dE>*r$i)Ykx0KLPAj?*92gF77<0a%gMxWB$- z?dupkigUV~iCg;$kIq#6Wb7gPs|6kagE+3Q=H{bYP#=$H8Y{2NHe}?Y3>i zZ82>qDa$77kz#RWoGqi>@4+x0Ra*!vVrk}aboU$_X>DkYyS2d`lRr+qDg|kh1j_MJ z0!t6z^>B7%%q3}BB&!F}JVD|)(u za#d9N$Z@t3_UuM7-)a(sq!+}`XeJYVbA#Tq>zOtHEVhj#P$2pnMXW)czm@V$A*t3O zBB2LiTG7dBF}c7C$z=KI6m^8}y<*SZiZcf4^S@dV1^d*ClCwoMF=eL|*?k183-^O4r9woAuOdf}vs^o-`}AMz zl0Cr#HX&x=Um@4=>_bS8P?Lx0pb}gipVoH{)`&f4qqSR3Bktc4H(K+g+h?=Pu$yc zt%f=x;Yu&u#75YiCRvq@08Jz<@k|7R{)?N3g8v`|lWO-n>~(Dx#gFd}tXdUVo2GML z8a?;))|4|_eP1h+jr_L|mt(CZWY^t2ZW8!^R>Fnufmusy#o z!X5u4BXa_w#n>x9o#x}}XE321PO!ntn~c$f2`~}}aUp()_vkeRgZo>NRSO>R8wf?uj;vzp563$1NymzN z$w`dg?kombj4s6MODxJs@K}R0pr6?Q>T7%@PW(Y~`MUvoZ(nG^88{QRyWxq1j4Y)S zKP|tznGM7+_5mLT$N3i?mg-B<1IJqz&OQM`Y5%tGw5ZVn04t=2vZys= zq00H%4HYBv1(ucO3}%`cwt-z-w;)_L(t|SOq;XlKgGhWdx%VnwI06oh#WL(uiv&P( zH0w6jCN=`o?wwuF_&_NcnZZ+hTxpVeFOLyf)JIAjVKyYQ%q-i^FRN=7!H&URIA6au zBr#~LqSmC7;o8&k_gTUeAZ&1jRey{QOfa38%+%%>EfJfXibi0%hsI#kl2?ZDjzRUkc)G zpsUx@9YoG?3jR*@Ci3iamzZJUj)A3&BFW?hs7qGue8NJlSq@uWn*27@i}xJ9upf|x zihGPM7f^a2^-b3%0D1d?L`1*mXnFD>%lABOS}Blm4N)zJ-i10Vg?;J)7cGgq4(frp z^+vwFazQQlt?)fSKY!lA#{-zeV)|?bX$zs;Y%02^di*g4IQ;gs%R&>Z3erf@Bcwap zXwu_156-h`(sFfL?61d@I2u5O@cNdqy3N>M4u+tYLdwA&Kt=tssHi?~y>@rdQyit+fPA;2f@kws}^^1uvZ?3lMQz=!eir#rd2ySFnv7t{VGTfc#PkYA>{A$RfW z6Y^igq5MB98y|*PR|gCbPz7sJD;)zMiTc;T92vr#h*P@?LUGxY6{t#j`-#p-1G>Y- zTI_Li@L61Mr&j~LWGsBKK$%$Li>LZVim4U-EMFePb9Q1@)M3=3Qk|qv9QojO&NhA{ zCOs-kPY-T4>7b9BkbsIHNfQ%A!qsQ}4fWfk`QwN|Bj|n7$P_H7vFm$S&JHkOj+@Oe z*{8dMHvaPFCW-$~v}Kp2bS^LBofYm4T!el=ua%GqZ^5l8H8hbeJ70F)J6*%-~k%Xd~J3QA?(^~0f=Yzd_7rf;#e;&nN?yQVjASF?&L>A&5Q)99pn`~-Kf?}fA3Y6^TKMP!#Q)UHfIgryouwibWLEx%N^1_ zLAw6&OL}D^O>d9(U>Zu+n9;gn8Bcr7nor2!JFM0(q+!#twE!RfmC+NBFAUEjvK3Dk zH1r^C{hX}KqYF1(sq84c2L$U!$eZf=Ur&D5qd zV2P^K4~=6jgp*dZ8TF5i!d+w4gayX{0S9QmG|Cu@nJu*PInGh` zyEot5M+gCDI8&?A+;9=Fx*@w9{m!(^jK#U>0JLF2RV_9alWmm~uOJS$5&ksVNf;+R zc+NH^StW_%ycr=1;F^X!^BGIw)279>5FEz=%lhlpqv^JY z;&X@Ya(D_s_pxK?87G$Xy-hs>l@!Q4EYGc4HW!DyK$00y-9lmg6y4Y}3Gz=j zk0&|nBG7#GO>w-ic->xPp|z}|e%(F_#X!@1mR@e9aVl1aPq^&U>Vs8p?efps$caRo z3#lL-)<27Mi6!~O(ZKq3XE^QjHaI*i`LDURg4KU)8%79d>y8DCPt(`IWihf}-h$a1 zJq-5G=PW>^Z#w|CKZhy*tZL?qeVc41(^X~%CVu~>JR?I14Wa2}#PnGp7fdI|KS!rh zmvlNjFl5*1zz%PbFUOj5>jkvoC>r3nCb(1xBXTP||?;dQ&`T0D!J z*q$xn*X!7N(|zw`(7SeL&?|RuA2kB$A7(1*fQ_Blo<7}j77>JlsiAjwjig$tG$o?l zyci%4;yzv}QJIx+OgBY@#u$N?`&vXt&{6{H{7$t`Zb^@RcgT_4q_YsUDeAH$*LI*;r`^&2C%xs+4 zzg?cp*to}3@cIULt(u{yj(C`xl~03aE<@`sqQqj&7cxV7WKHHm0ZD3NZzldfMu@j! zHc2Z$d`p6%u@$pWjOReu{TCu)oxH|KT_k*K7ryDYzjQH`^%79#@w1`K8aKC4BLM21 zR-vYj1PGIjK+`PCw^Ct}o*t_37ChO<`_(w#<%5I|x1&xT4EkhHPT*1rlc|ZPN@Vgy zn7|48iZbM+6xpJsz;r4lROmJbOew(GGN~ZU`9s3#KtSKNXt`wz&eQ^oX(t8bzsz`8tbTr7xx=ZWI23XA@)+i$hxo5x*bcXYG^yWB|i?#h)tN zK%x%11gJza44$}7NiMuF3uW7Mlts39WQ*ISa#FNv zfjN8|();rGU6H-iFexW=G!J+rWn)K{sx7qS#;%?$N{NjTmk+1et^#F3uhB5~KzTD` zQBKi(KXMYILT6~)RaF@fXn^5c#rEH%v*CQx_RV%4wXBmAM@YlhaWqE!yDPIJ!!go>=^`t8uD3tFI? zc&JWYmGW+vHngQ?iV(4@DN|w6z=Wj0tPIo)$PFtqDL0f0u#c#_YSWD?89#fvU{&gs z4K0AsV=R|FFLG-#P9(ga;qe8_f<^rC87Ork)Zr{W1uqVPbX*uS)(J*sN+lXFR?~5+ zwek5{r6&*>@8b&x(1O(cYWy)^LGU~R8H^^*2$}4=itqFgf38=BuwRxgY2Yt|{IG+w z=_H^tzd~;?8lF3HsnqY}?J~!5Rh(CV^V8qy`E*fi(b`As!9dyP*)<<0gN@PONhHcX zfTnLAQJ04pZ(GYg2>(j!B37^axj!8-*OM8?4xmJ`VW)@zfFeWiSh^5FcRtl%rCvDo z#@RdN6y$o^5c;3KjLOYs|kRBkHmB{N7BJ(L+sLyA{%V z(U@0YXIF2o+Fk4_p-uayS+YD-o7BmZH2B@(`p! zD!0lpW4W@}(!JV2p*MH~`8^i5L0Nd86S|as_K&tlj5!u$`jyV`ZLLdRx9pXr zgT3;kc#5C)&Q>tN+5Y4pulV7!U-QaQMA~EIfjhpn`6vn_Ww9&iGQ17 zCnfOWHiZeb{(CMgp7(EXD9s1)-y0-~wDA84iWK$!Jy9`2L8Sc8E8>vp0y@BffRg@^ z(U||tX$+W{I1TKKOq}c)tbV&V+gdrh{C8;6t-0&G$c5xLEB751A}?c%$0;3`#&M=g zg?$Q-Ryq#P#K~#0u8x8jYf6`~#J9EU*O{1OKo-KQ{a8GCYrmzoEJ4F32rokiH9hLgtiA6Vo=A79B@EAso4_U3(+H4UR#=i*NR5W z>I|njA}lqpZ?$R(L?5c`vyUAi(y|QDAhn(1zSa37g<4CrXNfGQgohv9X6|U*nn3yN zffaYpwCceYAy_~o<-BAr7{YS!m#*FU^UjOq)4^?Q`^QYx0i^T*NtKwbGh}UpCj|}F zrPapo-FNnZ0g2W^BtVYZmJZnIBGAUAU#t6h_PZdxa&-lQbkPB;Zn62MaF-EqNk=sS zEe=&y6T|}DehAm3CBLtJYKU&$AbiYa@z`=vLuD+9n~nR;9mh(*y;5qGO+4OHPj({4 zu1&JxiLpOJRH>OrtvMuvjC>cYiC=`s%FuSau8$qsrZ>2Xg0s+IL$diGbGN+a?|uKr z#XW-82-0xXrYyJQCN5lSJCzW?;x}nN+|p2Z;r&7H%8-Gi%r`134WA z%$7Wp>HkR?kGp1kD5I{Y-6aCNDjRG4Qh5N~inrDbqJK+0nKbc>N}+_VIjwyAH!fQG zQ>7eNho8|sQ4Qy1j?Ue(Sfo_sBij(2W9tmGJZWwrvFAk7?60jwk)|<#D25ej;tBd+ zi9mrt{1J!FU8&!8H%vBdWjYL;w_}`V@Uie1h&wxTh^mIAIsJ}`s!?pbM-Zx@H({Ks z8mo-6dvzvD_6IUglOMQ%S}+vS*p=2XiHvHO3J9=aQY?str7TJBkUzcXUVK!GTN>o%7s|ik*eUy_MWzW1>cjyv&`f>RyzJ?hsNpVr3h0BL=-W z(a&uUCF9=E$6=KYX`vh0t?(&M{TKwn^#xAD0W-5=ufFJ7Xat!6Q?d5)CeCViiBOkR z-JvrHBCbS>jcUtxG$>oxd6{}!yL@wPUi+g1X9o7sZoVh&6ebjdGfi5-A~-SNYLq!{ z@)EBY?PjG^V$PGbc`OZ+ru<(uthJgNYnwW)Oux6ZEPkK5S#DGCBzj8HdVm!n4szb; z$Bi%zJ-(iJxNzeE;zoYz?&_a9(89?PpJGkUlhu8+68!YYI`LHq5#2EaIpqwL?=7#2 zYwzZQsG8*sItwI!ryJ_Qn*HN0?DGL*KaoBU(L6$TZQfH!@6_8>Rm^O3o}-MnblZm#KKTtc($=e*Ej@JkU?7|&Y;Wc~W+58d9j-uz_99%u@C zK4+Nks{NR{Xy?CqOk=+0yq}xf=#GB!X_|Z=Ug@0O%C#!X6)1n&wR(1VBG^%qz*@Qa zz)C5X&A`y&%d+u^T^6aVyM=^Bpd;V4I4gBVcKm4eb!Hb9 z2wCfJh}(e%giINY-zv>>sL*xC)AAK{<15W3Ag-NT+mzV{KB$HrFPZYIGY0p@xtl=b`e%#XODZ8|fdR2}#zM?_#&NYau<6&spllX8GQe2+ye~+^FhqvG^AB9j3BsG zFykfe@0aK)2r6^%p}R$lWyoqdo-@KHzm7Q+Xek~%2x~^xvPrF0qBe8m>1$lnMba)J zVdLx1gDOS_ONv7mzp`MUJUmP@$Sk38B*qkSY=d z1W^Eio*LW zSkfDx$;-a!gv8{~^_T@@=QxcO%eVx(h^GPeoO5y2FF#6pRTXTKywi@AQaZ^EYTb0+ zgpNHom9l638Ckpkd?Wc4twi#TAx2P#95nPh>}lj;2*3>X!QiIC_E>uly1`9~8C_=R zppl;=ot2614yE@S8lL(C*TQ%eMX{pZm-m{OOsix3p_2L>Yy}Tn@)maB8HeMk9PMRHX+( zW`$Q<4&d7DjOFO1+EuMqifwl-b-Hrnq?1!~7H9N5onG;hW*@T*U^*co5~n;E8h1R1 zr1x5}u(R^e7#CWs+=k}f9QZH1pfv+Zm80SZIadO|ADm_*h_IL{1Rdklydh9|`2zNk z@NBvh8YK6+sJ4+_m{y}E7a{yRYj6-3vZ06dvCb^ab~#l(TC)tzb-|-Re2wK~9$6mS5lRU7~wd z3D^}uPriXffT4OecTb0aG74I6+a3>%Y?>pBb?R08o;0&5Nd1r~an1nJ1%Kj@gm*K* zrqK-%5}*Q9@fYwd#^x8WjXHEaT^Wr#CW=lSIReWL=XGa2_nTR;%Zfq4k8=;PO+5Hf z@Zh%nu3&Z%_#1=g=N`RcJ1e3Ok`{eB;ZL-66wvDw4ucpTC^G)i8Km`REx;1HnpD+g zPXvzePndUSaHVN6310x@bhA0tgg3_p=`;U;S_S87m>!d%&YHx!mrfT3{vEKUUr=7? z2V?Ka^Tm?CyjJ|hG2tv1f}u%SOfkJLlLhA{d*HM8OU3-BQwO|se5*vYeBnEQ<`z5J zPtfz@dfF0>(lQAUC&@U!KANYlzvk1W3MERoil2qYIfP@_zc>Ymi&vv*2H$>>g4d_G zHhYGoEMtVfxVv#j)IiI7N%sO{&HZru*xBqmBaRGQ`i#vUl9B6=nmV?yc{)ZHcB+D9UDyHkIy4piHU@TI{#vq7@77*JLd34MYDMb8$V- zMC^9`tD`RDh@hfUK<50>#x>6+bvDnt1tV_dUJc`c(X)q;`lbE_+K-TVf+=2bSf#>? zy2&+n3KK_u-lpUo)~{bE_OVTxPtHqx$mr)yAa#*YZtT2|LGt(6qOA2~RjMZZ zpTB7%h{f&N(Z; zOGwC2a+KwWnlp}s#gHvh^HgJ~u7~#GPujIm&5{v#{ZXFDLuisRL52{N z9hrXX>6>}fr?G=TK-F`wRvbE;=l{^Y)qF7p?I)8_EAib@>?MKn)zs93WwZbQ0R3MF zz+%2nwbeg`UKbJ&5aGXY#`=Gi-v5uz4n|Hc{|9G{ANvgnv>$%u?=TG#9H9}qh-O=` zxkQMHj14xJj1}w5gF%5kH0P6@9MMz6kIk2z9C#?Hq}sDubneaByqETu?HY+9VEd1o zT0;kCFJDlPb!&DvcSCmzdql5p0x`9ul7U=AhGI1hIUSWMNhY%fb-Pm+o;f3;^<;Ni zc>n`5$T3Tz4Nrkg-J&u7+GY z_6*b(p_m$}p;qZ~P&&)xBDYu?;S5BL$V50J-YzY%9PaL_4;cXhiG$(w0SioCao9wA zs+1D~Puj@54)Xt3$CZFnnf3Aay{AMjk#M;**S=*N zM4FCNQyRW%GALhT+GG+%5|N$U6tZ+%EYZ-M_q^uGE#L8Yp8x&5zyEs9J?DMTbKYy| z{Oz9Nv|SPWj@_59_qKAackEixx2E)kr-S&_zNse7#J(xnvE75;b5r|E{TX##{d=^$ zjbhS3&0ed*pyN?sb*j+5^v9{rcXXvL%Br9l)~EB-_aRn2Y2jYEp~=+;S=F1oM~OS= z?YH}(HmQJLxQ>;)@-Vxm)?T~FCi~%iFV>3f*7cno^*my16hJPD=2J9yqHnIe(ACH@`lXd-lDR?gS(oa*G;&wuBh&> zQ1$E`Q#Nz*XuG)SaH1=BsrmU0s*JWgUwaiyz}|fCy2;;M%R>!4<_O!(n~LAeVrksX z(YAM67FRLSo5l6u+x%=A`^yvC)5i{9(z^22#^=tG#ot_WF)4IwlCtJ%*7-EYD^}S( z`n|e-c+_95D%&~Ied)WGnH#;@VwR5$jM&&8t83T`!tZ&gXdlSs6}8*sauX(b*TuM! z^R}74^?pBAr1I|Da?u?d(#0AlUtG0Hxh?M@so+*QWK(VDedC+e(Mt2Qn+(U);$ED(--;l5ZT>hs9L@h~@Ov5xMM=m)`u8ym7Ge`~1d_ug4F%%3N!wn{BFC4a%b zCd;EX!<);2snx{q^_xQs*SE8;+Fr`r{ZniB0H-d#<6Ef}L4%eW$L2f4s7NW8O#a&0 z*(Coi>IYr5oo4q^c1njARV)_T&guEsq&4Z3R=^b7UHdV1VyfSVOPtR<$K^67!VAm9 zrZ$$n3Aj$|-zPC5z9}iCP{$=UE6K3lGrMC>#Gv1mTbj$Q7wG4hKOlcT_VYmZJ$B8Q zZd1O&$>oRR6!N0P*H>C}o-YZHi_sN}br7;R=~v9YY;o1nWzX%@u!}P2A^f+hbm8JP zbx~Uk-4pd{W5B+oDD0e_zKZ@V?@yej2*QjeQpIN>Cbl$`7)?fT8M9<2d zr;t&R)qV4%@K9dHp=|bi&B|<#a(T0=fK3lFPuEViGPRlpbmLtP>#+4h&!x35&6Y{c zImu(ZI%)ATqgT_@dQOg}u@`z5G5SoV>FZab%v$lhC(TAu2_LkxJ1>Ofm&b19@|e2k zt7YFSK3HB+aay=gu`08S=X$`jZl&1Bxx9t1?43?TeDrxc^-QQ+yXW!iH2czPRlXHD zj-qtwb>wLi` zwAw)`!;{r=EG2S(;}(g|br-Bm9NS#DTb|yNWRyo*WI0C6HQr>C;4yBwPG)s#{d}V| zi#WTn#Guq(j)JXwl*rknYof(h;x7f-t~l#;uusiGMnpRO4##wEWrB0rNV99zu*kla z1xt#hUWnf)d=f8g9a@vTRE^7aeRIjcR;BUG%fDnrlVzPxamkr8Hkomygik+my}hd{ zil4OPYRl$h;c4q}8j0=6XJAC@2Jbw6stBU*0K6(v0Rc zFCy0fF=TK3=BnkK5(Yu|!xV9nUA%@x^03EZ9X1Jsuqi_&@(^vRMEPH%cB&)_kqSsj zgS?HU^W9pcFot>zNyj-@GBP2@X_}rHd5y;USCW)W4xAqNK41AVI6@MJw;o4cZ)%?Sze3kZu2 z(2Mqsc5@~fi_pUQ?{Ng`&Gao#XgC zr3PJs*d7oPF^fMK@&vFM_f6rCPk;*UqXG&Tv4Gi)K*rE-7L`xi=i&q*ClF%oDy#;z z8i6D>wz3f!E3l{02!wK|&T}+ByJZ;NQ{|wZ6ExuNOi?wk?gL6U%^mhN0xhhzp$mfl zp*~kehgDGZaijaZWHU5u0y2(-7RC*2> zlBVOCW+fgZGQQd?1HGF86DJeYjFMS)1SU5Fbqo|xKv4#)ZU&mzrQEW)g{7#LNod$2 zuei}JM^3;+EkF&cS+oE)m^wpboX(Vkt*wBGb;X84jGb8ok?Bbg3Ie(Z&cib;KpX2; zQ@Wf|BIEX-a@^0qt%7@3Gu=m)3lw+8y)wO%HCvShZ?QHD?@)=7&>-L52XR- ztskM1FTx)^qK00~U(=QO;3 zfvDFJRY`z)U529SV^+S=)Uyi2+W7_RtsKRYhwJ8&A_AR6tyJlqC>c>jnsL7q$l&#h zhfrY2A>m$8QV}XVMPEdUtn(DXl}Z?98HRm6+^D>QU1|qvP#6$}AvmkKsX$H_kbxJT zqG^$`b`x1+1gX;~AE7u811kfx*-Q|YXa*59kgG*eHL$Kz7t-Y~p>-3wrY)vZ=zD#b z--V_@%0)W@z|=Alu2LcwLlzGW94bifrStBXqSe(0`4OB$e_D>Ya&R+mIv(wBB-D>0 z-YJw2nk8_f`*fihJi-I&*kZBC0Wt=$!oNuSl{pCwHAs2*8hOV-edM7i3oW6-Ghl!L z*JlVQvWFqhfC;X_8~I^9&ecwQ-~dKCC67r5ULPExM=8J9i_v z*aO3Iu(lh_fyv!K0;`;$uI=;rbd81K0SdkwFb#9uNfD^?956rK>R3GoGOC$jB;o7t e?-#a1FFq*3&3P`0jv!W{zhOy&(CR~r67dhwwokAC delta 15004 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 jp+6{js2_E(#C@;9vm&%9GH23Gn{_Y(Vyi From 72a77edb16d8578561d2ce20e1167e8ede4d2087 Mon Sep 17 00:00:00 2001 From: Bart Jablonski Date: Wed, 3 May 2023 23:04:41 +0200 Subject: [PATCH 2/2] The BasePlus package [ver. 1.24.0] The BasePlus package [ver. 1.24.0] Six new utility macros for the BasePlus: - `%letters()` - allows to print a list of Roman letters, - `%filePath()` - from fileref returns path to a file, - `%libPath()` - from libref returns path to a library, - `%workPath()` - returns path to the `WORK` library, - `%translate()` - a wrapper to translate() function, - `%tranwrd()` - a wrapper to tranwrd() function. Documentation updated. --- README.md | 4 +- packages/README.md | 4 +- packages/SHA256_for_packages.txt | 3 + packages/baseplus.md | 487 +++++++++++++++++++++++++++---- packages/baseplus.zip | Bin 260659 -> 268480 bytes 5 files changed, 434 insertions(+), 64 deletions(-) diff --git a/README.md b/README.md index b5e1506..ea60490 100644 --- a/README.md +++ b/README.md @@ -224,7 +224,7 @@ SHA256 digest for macroArray: F*85E3BE4D163AC5223B6EC9D3C25C46564A656E3830998B45 [MacroArray in SASPAC](https://github.com/SASPAC/macroarray "MacroArray in SASPAC") -- **BasePlus**\[1.23.0\] adds a bunch of functionalities I am missing in BASE SAS, such as: +- **BasePlus**\[1.24.0\] adds a bunch of functionalities I am missing in BASE SAS, such as: ```sas call arrMissToRight(myArray); call arrFillMiss(17, myArray); @@ -248,7 +248,7 @@ format x bool.; %put %repeatTxt(#,15,s=$) HELLO SAS! %repeatTxt(#,15,s=$); ``` -SHA256 digest for BasePlus: F*625E56B017C4AA8D436959C0A03C8503773A9A3823D43FA9E0326276E52DA6F2 +SHA256 digest for BasePlus: F*B297440903337E1AE6F12A6001B80B8AB743079847D16D63DF1C649AE51AA411 [Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md "Documentation for BasePlus") diff --git a/packages/README.md b/packages/README.md index fad63a6..c39d80f 100644 --- a/packages/README.md +++ b/packages/README.md @@ -86,7 +86,7 @@ SHA256 digest for macroArray: F*85E3BE4D163AC5223B6EC9D3C25C46564A656E3830998B45 --- -- **BasePlus**\[1.23.0\] adds a bunch of functionalities I am missing in BASE SAS, such as: +- **BasePlus**\[1.24.0\] adds a bunch of functionalities I am missing in BASE SAS, such as: ```sas call arrMissToRight(myArray); call arrFillMiss(17, myArray); @@ -110,7 +110,7 @@ format x bool.; %put %repeatTxt(#,15,s=$) HELLO SAS! %repeatTxt(#,15,s=$); ``` -SHA256 digest for BasePlus: F*625E56B017C4AA8D436959C0A03C8503773A9A3823D43FA9E0326276E52DA6F2 +SHA256 digest for BasePlus: F*B297440903337E1AE6F12A6001B80B8AB743079847D16D63DF1C649AE51AA411 [Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md "Documentation for BasePlus") diff --git a/packages/SHA256_for_packages.txt b/packages/SHA256_for_packages.txt index ebd3b1f..fdd0e63 100644 --- a/packages/SHA256_for_packages.txt +++ b/packages/SHA256_for_packages.txt @@ -1,3 +1,6 @@ +/* 20230503 */ +BasePlus: F*B297440903337E1AE6F12A6001B80B8AB743079847D16D63DF1C649AE51AA411 + /* 20230419 */ BasePlus: F*625E56B017C4AA8D436959C0A03C8503773A9A3823D43FA9E0326276E52DA6F2 diff --git a/packages/baseplus.md b/packages/baseplus.md index c660ca3..4b47153 100644 --- a/packages/baseplus.md +++ b/packages/baseplus.md @@ -53,14 +53,21 @@ * [`%dirsAndFiles()` macro](#dirsandfiles-macro) * [`%repeatTxt()` macro](#repeattxt-macro) * [`%intsList()` macro](#intslist-macro) + * [`%letters()` macro](#letters-macro) * [`%splitDSIntoBlocks()` macro](#splitdsintoblocks-macro) * [`%splitDSIntoParts()` macro](#splitdsintoparts-macro) + * [`%filePath()` macro](#filepath-macro) + * [`%libPath()` macro](#libpath-macro) + * [`%workPath()` macro](#workpath-macro) + * [`%translate()` macro](#translate-macro) + * [`%tranwrd()` macro](#tranwrd-macro) + * [License](#license) --- -# The BasePlus package [ver. 1.20.0] ############################################### +# The BasePlus package [ver. 1.24.0] ############################################### The **BasePlus** package implements useful functions and functionalities I miss in the BASE SAS. @@ -202,7 +209,6 @@ Recording from the SAS Explore 2022 conference: [A BasePlus Package for SAS](htt %rainCloudPlot(sashelp.cars,DriveTrain,Invoice) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - **Example 10**: Zip SAS library. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas %zipLibrary(sashelp, libOut=work) @@ -240,66 +246,91 @@ run; %put %repeatTxt(#,15,s=$) HELLO SAS! %repeatTxt(#,15,s=$); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +**EXAMPLE 15** Integer list: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%put %intsList(42); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 16** Split dataset into blocks of 5 observations: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%splitDSIntoBlocks(5, sashelp.class, classBlock) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 17** Split dataset into 7 parts: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +%splitDSIntoParts(7, sashelp.cars, carsPart) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 18** Return path to temporary file: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + filename f temp; + %put %filePath(f); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + --- Package contains: -1. macro bppipe -2. macro deduplistc -3. macro deduplistp -4. macro deduplists -5. macro deduplistx -6. macro dirsandfiles -7. macro functionexists -8. macro getvars -9. macro intslist -10. macro ldsn -11. macro ldsnm -12. macro lvarnm -13. macro lvarnmlab -14. macro qdeduplistx -15. macro qgetvars -16. macro qzipevalf -17. macro raincloudplot -18. macro repeattxt -19. macro splitdsintoblocks -20. macro splitdsintoparts -21. macro symdelglobal -22. macro unziplibrary -23. macro zipevalf -24. macro ziplibrary -25. format bool -26. format boolz -27. format ceil -28. format floor -29. format int -30. functions arrfill -31. functions arrfillc -32. functions arrmissfill -33. functions arrmissfillc -34. functions arrmisstoleft -35. functions arrmisstoleftc -36. functions arrmisstoright -37. functions arrmisstorightc -38. functions bracketsc -39. functions bracketsn -40. functions catxfc -41. functions catxfi -42. functions catxfj -43. functions catxfn -44. functions deldataset -45. functions semicolonc -46. functions semicolonn -47. format brackets -48. format semicolon -49. proto qsortincbyprocproto -50. functions frommissingtonumberbs -51. functions fromnumbertomissing -52. functions quicksort4notmiss -53. functions quicksorthash -54. functions quicksorthashsddv -55. functions quicksortlight - - +1. macro bppipe +2. macro deduplistc +3. macro deduplistp +4. macro deduplists +5. macro deduplistx +6. macro dirsandfiles +7. macro functionexists +8. macro getvars +9. macro intslist +10. macro ldsn +11. macro ldsnm +12. macro lvarnm +13. macro lvarnmlab +14. macro qdeduplistx +15. macro qgetvars +16. macro qzipevalf +17. macro raincloudplot +18. macro repeattxt +19. macro splitdsintoblocks +20. macro splitdsintoparts +21. macro symdelglobal +22. macro unziplibrary +23. macro zipevalf +24. macro ziplibrary +25. format bool +26. format boolz +27. format ceil +28. format floor +29. format int +30. function arrfill +31. function arrfillc +32. function arrmissfill +33. function arrmissfillc +34. function arrmisstoleft +35. function arrmisstoleftc +36. function arrmisstoright +37. function arrmisstorightc +38. function bracketsc +39. function bracketsn +40. function catxfc +41. function catxfi +42. function catxfj +43. function catxfn +44. function deldataset +45. function semicolonc +46. function semicolonn +47. format brackets +48. format semicolon +49. proto qsortincbyprocproto +50. function frommissingtonumberbs +51. function fromnumbertomissing +52. function quicksort4notmiss +53. function quicksorthash +54. function quicksorthashsddv +55. function quicksortlight +56. macro filepath +57. macro letters +58. macro libpath +59. macro translate +60. macro tranwrd +61. macro workpath Package contains additional content, run: %loadPackageAddCnt(BasePlus) to load it or look for the baseplus_AdditionalContent directory in the Packages fileref @@ -308,7 +339,7 @@ localization (only if additional content was deployed during the installation pr * SAS package generated by generatePackage, version 20230411 * The SHA256 hash digest for package BasePlus: -`F*625E56B017C4AA8D436959C0A03C8503773A9A3823D43FA9E0326276E52DA6F2` +`F*B297440903337E1AE6F12A6001B80B8AB743079847D16D63DF1C649AE51AA411` --- # Content description ############################################################################################ @@ -4303,6 +4334,118 @@ The basic syntax is the following, the `<...>` means optional parameters: --- +## >>> `%letters()` macro: <<< ####################### + +The letters() macro function allows to print a list of Roman +letters starting from `start` up to `end` incremented by `by`. +The letters list can be uppercases or lowercase (parameter `c=U` or `c=L`), +can be quoted (e.g. `q=""` or `q=[]`), and can be separated by `s=`. + +Values of `start`, `end`, and `by` have to be integers in range between 1 ad 26. + +See examples below for the details. + +The `%letters()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%letters( + range + <,c=> + <,q=> + <,s=> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `range` - *Required*, letters selector in form `start:end:by`. + Lists letters from `start` to `end` by `by`. + Values of `start`, `end`, and `by` are separated by + colon and must be between 1 ad 26. + If value is outside range it is set to + `start=1`, `en=26`, and `by=1`. If `end` is missing + then is set to value of `start`. + If `end` is smaller than `start` list is reversed + +* `c = U` - *Optional*, it is a lowercase letters indicator. + Select `L` or `l`. Default value is `U` for upcase. + +* `q = ` - *Optional*, it is a quite around elements of the list. + Default value is empty. Use `%str()` for one quote symbol. + If there are multiple symbols, only the first and the + second are selected as a preceding and trailing one, + e.g. `q=[]` gives `[A] [B] ... [Z]`. + +* `s = %str( )` - *Optional*, it is a separator between + elements of the list. Default value is space. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Space separated list of capital letters from A to Z: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %letters(1:26:1); + + %put %letters(); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** First, thirteenth, and last letter: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %letters(1) %letters(13) %letters(26); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Every third lowercase letter, i.e. `a d g j m p s v y`: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %letters(1:26:3,c=L); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 4.** Lists with separators: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %letters(1:26:2,s=#); + %put %letters(1:26:3,s=%str(;)); + %put %letters(1:26:4,s=%str(,)); + %put %letters(1:26,s=); + %put %letters(1:26,s==); + %put %letters(1:26,s=/); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 5.** Every second letter with quotes: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %letters(1:26:2,q=%str(%')); + %put %letters(2:26:2,q=%str(%")); + + %put %letters(1:26:2,q=''); + %put %letters(2:26:2,q=""); + + %put %letters(1:26:2,q=<>); + %put %letters(2:26:2,q=\/); + + %put %letters(1:26:2,q=()); + %put %letters(2:26:2,q=][); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 6.** Mix of examples 4, 5, and 6: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %letters(1:26,c=L,q='',s=%str(, )); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 7.** If `end` is smaller than `start` list is reversed: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %letters(26:1:2,q=''); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + ## >>> `%splitDSIntoBlocks()` macro: <<< ####################### The splitDSIntoBlocks() macro allows to split the `set` dataset into blocks @@ -4443,6 +4586,230 @@ The basic syntax is the following, the `<...>` means optional parameters: --- +## >>> `%filePath()` macro: <<< ####################### + +The filePath() macro function returns path to a file, +it is a wrapper to `pathname()` function for files. + +See examples below for the details. + +The `%filePath()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%filePath( + fileref +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `fileref` - *Required*, a fileref from the `filename` statement. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Return path to temporary file: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + filename f temp; + %put %filePath(f); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%libPath()` macro: <<< ####################### + +The libPath() macro function returns path to a library, +it is a wrapper to `pathname()` function for libraries. + +See examples below for the details. + +The `%libPath()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%libPath( + libref +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `libref` - *Required*, a libref from the `libname` statement. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Return path to `WORK` library: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %libPath(WORK); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Return path to `SASHELP` library: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %libPath(SASHELP); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%workPath()` macro: <<< ####################### + +The workPath() macro function returns path to the `WORK` library, +it is a wrapper to `pathname("work", "L")` function. + +See examples below for the details. + +The `%workPath()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%workPath() +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +*) No arguments. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Create new library inside `WORK` library: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + options dlCreateDir; + libname NEW "%workPath()/new"; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%translate()` macro: <<< ####################### + +The translate() macro function allows to replace bytes with bytes in text string. + +See examples below for the details. + +The `%translate()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%translate( + string + ,from + ,to +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `string` - *Required*, string to modify. + +2. `from` - *Required*, list of bytes to be replaced with + corresponding bytes from `to`. + +3. `to` - *Required*, list of bytes replacing + corresponding bytes from `from`. + +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Replace quotes and commas with apostrophes and spaces: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %translate(%str("A", "B", "C"),%str(%",),%str(%' )); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Unify all brackets; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %translate(%str([A] {B} (C) ),{[(<>)]},(((())))); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Replace all digits with `*`: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %translate(QAZ1WSSX2EDC3RFV4TGB5YHN6UJM7IK8OL9P0,1234567890,**********); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 4.** Letters change: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %translate(%str(A=B),AB,BA); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + +## >>> `%tranwrd()` macro: <<< ####################### + +The tranwrd() macro function allows to replace substrings +with other substrings in text string. + +Returned string is unquoted by `%unquote()`. + +See examples below for the details. + +The `%tranwrd()` macro executes like a pure macro code. + +### SYNTAX: ################################################################### + +The basic syntax is the following, the `<...>` means optional parameters: +~~~~~~~~~~~~~~~~~~~~~~~sas +%tranwrd( + string + ,from + ,to + <,repeat> +) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `string` - *Required*, string to modify. + +2. `from` - *Required*, substring replaced with + corresponding string from `to`. + +3. `to` - *Required*, substring replacing + corresponding substring from `from`. + +4. `repeat` - *Optional*, number of times the replacing + should be repeated, default is 1. + Useful while removing multiple adjacent + characters, e.g. compress all multiple + spaces (see example 2). +--- + +### EXAMPLES AND USECASES: #################################################### + +**EXAMPLE 1.** Simple text replacement: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %tranwrd(Miss Joan Smith,Miss,Ms.); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 2.** Delete multiple spaces; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %tranwrd(%str(A B C),%str( ),%str( ),5); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +**EXAMPLE 3.** Remove substring: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas + %put %tranwrd(ABCxyzABCABCxyzABC,ABC); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +--- + --- --- diff --git a/packages/baseplus.zip b/packages/baseplus.zip index 7e4a67ad69501994951ad2541d725790f015a237..91ba7021ee8328af66abb13ee5a90729b278982a 100644 GIT binary patch delta 23176 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 HdIA1FAjp$Y