diff --git a/README.md b/README.md index e0857ca..1d119ae 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ A **SAS package** is an automatically generated, single, stand alone *zip* file The *purpose of a package* is to be a simple, and easy to access, code sharing medium, which will allow: on the one hand, to separate the code complex dependencies created by the developer from the user experience with the final product and, on the other hand, reduce developer's and user's unnecessary frustration related to a remote deployment process. -In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. **The latest version** of SPF is **`20220925`**. +In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. **The latest version** of SPF is **`20220930`**. To get started with SAS Packages try this [**`Getting Started with SAS Packages`**](https://github.com/yabwon/SAS_PACKAGES/blob/main/SPF/Documentation/Getting_Started_with_SAS_Packages.pdf "Getting Started with SAS Packages") presentation (see the `./SPF/Documentation` directory). @@ -80,6 +80,8 @@ To create your own package: --- +**Update**\[September 30th, 2022\]**:** **New dedicated repository:** *SASPAC - the SAS Packages Archive* **is available as new location for packages storage**. Location of SASPAC is: [`https://github.com/SASPAC`](https://github.com/SASPAC) + **Update**\[November 11th, 2021\]**:** `%extendPackagesFileref()` **macro is available**. **Update**\[October 15th, 2020\]**:** `%previewPackage()` **macro is available**. @@ -105,7 +107,12 @@ If you find the SPF useful **share info** about it or **give it a [star](https:/ --- ## Available packages: -Currently the following packages are available (see the `./packages` directory): + +For "backward compatibility"/historical point of view the following packages are available under the `./packages` directory. + +Since *September 2022* the default location for packages is **SASPAC - the SAS Packages Archive** located under: [`https://github.com/SASPAC`](https://github.com/SASPAC) where each package is stored as a separate repository with historical versions too. + +Packages: - **SQLinDS**\[2.2\], based on Mike Rhoads' article *Use the Full Power of SAS in Your Function-Style Macros*. The package allows to write SQL queries in the data step, e.g. ```sas @@ -184,7 +191,7 @@ SHA256 digest for GSM: 2AEBC150FBA99A4AAB0265A21C57E89200BFD96B633B898F32743D1C8 [Documentation for GSM](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/gsm.md "Documentation for GSM") -- **dynMacroArray**\[0.2\], set of macros (wrappers for a hash table) emulating dynamic array in the data step (macro predecessor of DFA) +- **dynMacroArray**\[0.2\], set of macros (wrappers for a hash table) emulating dynamic array in the data step (macro predecessor of DFA). Development of this package is currently on hold. SHA256 digest for dynMacroArray: D7E0B8F85C05EBF8622204E0D2F3E990D48D0A9B3911051C3AD44DC98954DDCF diff --git a/SPF/Documentation/Getting_Started_with_SAS_Packages.pdf b/SPF/Documentation/Getting_Started_with_SAS_Packages.pdf index 6adf1e6..b01a7b6 100644 --- a/SPF/Documentation/Getting_Started_with_SAS_Packages.pdf +++ b/SPF/Documentation/Getting_Started_with_SAS_Packages.pdf @@ -173,7 +173,7 @@ endobj endobj 145 0 obj << -/Length 2586 +/Length 2587 /Filter /FlateDecode >> stream @@ -192,7 +192,7 @@ e 5^-^_\3˨?/f9Fi̓@u[,5kMo$%cҐ)S{. 5FP4eLSum^@nC/7\Φ ZسB#kJhב:랞-zo. =ÞS{# {}mҬ^(XBit!T١:ߢgJݎ)H^!s}M-|r gszmh쯪~꿕[|{xin:׾&)~v(zU>Njwm٨޽KD#[ =6oEtiֹ?ehuegȝWP__|{ۡKzAVJ0< W볝sZ_._Zђթֲnh^O3Z*HN\A[?rg RbT{@p}azc{|=ZǮmo>z~X}:tp~ڭtO_ۿSf铳MZkb7ŗ\7?c\vR0^ YRwnnc54O\GkO =}{goՈG욭ת;6GVW|zoúoMikT`׻Z -~7hci;VTJno1Kʔ˓ދљ__tʑ{gmښC%ׄ`=j]{FUM%`u34-zO ݜ&@Z}#_qۑߥ9,iwLѺ:|\ 0mrÁrʦ/Ov96j*U~+}u% sx +~7hci;VTJno1Kʔ˓ދљ__tʑ{gmښC%ׄ`=j]{FUM%`u34-zO ݜ&@Z}#_qۑߥ9,iwLѺ:|\0mrÁrʦ/Ov96j*U~VjGww]|Xst endstream endobj 123 0 obj @@ -5161,23 +5161,23 @@ endobj endobj 654 0 obj << -/Length 2971 +/Length 3039 /Filter /FlateDecode >> stream -xݚKs{I2~*YT}D&8B @sgOtzZ)G]7<;էOA9$6}ܝ8mgM2nΆzVp0ktu#SSB"΋B5QR2\gJ[e+D)͸0pHE*0u$&FD*ZJ0.@*REөB5QV2ee$ ϸW r9!=_͉Dy}jgPLLгWeʹzgHEq fdsaI%U QIQ&.0#gF99L^3ȩxTe[R[ilpItY&1gG2rF1`+d<\ - -Y PϏdJaN;k e`Zأ=#86z3HF.H挩1TLKmّъC ޳,pzkeaZɺ;T) -&8(gs@xC0c/y](HP6*fپ]My&mq\pƊ0M||ݼ k=A s=,䕗1ւE]9(>WĀ+g|rˆ>ELnDhz#Sl>zZ*6i`~.C/QQ7EBBB`vZf7lHQ@? IDx47_?~a58ðihGP?/ϧa]|htb<$tB'*a5tvN Ww?ߨ_`DubZt/1ncI<O %R’RsʐmdN -TC=i؞,PibGK7O^50Ez:1w9)A1g.9:2̩Tx-618CC C!7`$|n0v$\dBatUDBhB;lx AP xuExDz -:}zMAR[kx'=o^ O,є/q뛳JƳ ]47w4SMV|,wh~B,TJ|Ez~|sT-3^ǥSGf\+s> 9d s h -ì?>I6+I 7·0xloBM;:ؾ?wv;~SԾ>ۢ\wl/}->b!7ZӃ5OѾњKOqu2i-ؘVn~ؕ?R}.*}{fs>K=s KAj;+ޡG߰vܼzڞ?^)7Lkmi?[]Waf5-)ڼw] Mm-G)8*1ܭG''tAMlߠT, -SrÆE zk;.QY /|-H a@)ioaU[XrU4%ƻιL;8q)Y'>&~kʰoX,vd]:xJI_XC6}Ӧ+˻0/g9Drtt>Ɇxn\hZtVlwl}!a_nWÍӾ-=etyM -;x S-pwVrm߽Y.Ee)Aa 5 uHs>Q$ʞ"8C-K3xx-cƓC1?Z6f KC2rn2{lqG'Kcݣ~^A<>܂no7{6W?n>ϾZϖ+:=ĥw3Cy3Ku]w`NL@dD6&Dii D/Zij׽k*JQq?5|G'iM,*. 3`ن$s-pjom=S>$hCb9OgWSҟS'&KGp5y$t_h}xzYk]]_U+=HÌ"o0EqE*sǕo"Oc@!W!rT$}WW}܈F6N'6(`ObL'ԋRWs;}AF;֯~Q^`DubZt/1ncI<O %R’RsʐmdN +TC=i؞,Pib2nK؁o&'4na܋:u<_c sR`ebR:s7i}amdS"iZ)=bm#KmBctBCC4`$|n0v^$\dBahtUDB|2F[c}6 W).Axt'N_^S8V0 ~H#ſ7sz\3%ل.~&+>AZt8{Xݮ,y|:3ygݟr>8S<80Ot8eR#;i{FHq&=V|';l7\\ls߱ +Ĵ"98ʾ|5=XĚP@DllxxF^frIjۧ}m>wM_B87oy?~]הa!nX,~~٪|JI5Y:ٟǡmxW7a^l7<1X#͇h~,quXVÍӾ=%M Ƽ&=tc<͆V}BƩV[Wzݰ}\}^S6?xk@o}nF"1L41R,G94 +~[f*F'r# o\poty=sfv'klJfKxk.''go0c ol]_\>|ˋJiO$/vW/XڷO}yA|b1P0 x0/9` wZ{?h: +m]/y釱SyD^rW{ |;jى+sS6-Wr1g[9-&GP眷?.ӓ̧yZ5򡯢 endstream endobj 653 0 obj @@ -5385,7 +5385,7 @@ endobj endobj 656 0 obj << -/D [653 0 R /XYZ 70.866 233.78 null] +/D [653 0 R /XYZ 70.866 238.932 null] >> endobj 652 0 obj @@ -9962,8 +9962,8 @@ endobj << /Producer (MiKTeX pdfTeX-1.40.21) /Author()/Title(GETTING STARTED WITH SAS PACKAGES FRAMEWORK)/Subject(GETTING STARTED WITH SAS PACKAGES FRAMEWORK, Bartosz Jablonski)/Creator(LaTeX with Beamer class)/Keywords(BASE SAS, PACKAGE, MACRO, SAS PACKAGES FRAMEWORK, GENERATEPACKAGE, LOADPACKAGE, HELPPACKAGE, UNLOADPACKAGE, LISTPACKAGES) -/CreationDate (D:20220928222741+02'00') -/ModDate (D:20220928222741+02'00') +/CreationDate (D:20220930195642+02'00') +/ModDate (D:20220930195642+02'00') /Trapped /False /PTEX.Fullbanner (This is MiKTeX-pdfTeX 4.3.0 (1.40.21)) >> @@ -9971,9 +9971,9 @@ endobj xref 0 1003 0000000004 65535 f -0000330938 00000 n -0000330983 00000 n -0000331003 00000 n +0000331008 00000 n +0000331053 00000 n +0000331073 00000 n 0000000005 00000 f 0000000006 00000 f 0000000007 00000 f @@ -9981,1003 +9981,1003 @@ xref 0000000009 00000 f 0000000000 00000 f 0000000015 00000 n -0000126496 00000 n -0000593768 00000 n +0000126497 00000 n +0000593838 00000 n 0000000062 00000 n 0000000086 00000 n -0000133525 00000 n -0000593680 00000 n +0000133526 00000 n +0000593750 00000 n 0000000133 00000 n 0000000159 00000 n -0000140039 00000 n -0000593592 00000 n +0000140040 00000 n +0000593662 00000 n 0000000206 00000 n 0000000231 00000 n -0000160759 00000 n -0000593504 00000 n +0000160760 00000 n +0000593574 00000 n 0000000278 00000 n 0000000303 00000 n -0000185066 00000 n -0000593416 00000 n +0000185067 00000 n +0000593486 00000 n 0000000350 00000 n 0000000375 00000 n -0000191564 00000 n -0000593328 00000 n +0000191565 00000 n +0000593398 00000 n 0000000422 00000 n 0000000447 00000 n -0000197840 00000 n -0000593240 00000 n +0000197841 00000 n +0000593310 00000 n 0000000494 00000 n 0000000519 00000 n -0000204316 00000 n -0000593152 00000 n +0000204317 00000 n +0000593222 00000 n 0000000566 00000 n 0000000591 00000 n -0000210624 00000 n -0000593064 00000 n +0000210625 00000 n +0000593134 00000 n 0000000638 00000 n 0000000663 00000 n -0000217036 00000 n -0000592976 00000 n +0000217037 00000 n +0000593046 00000 n 0000000711 00000 n 0000000737 00000 n -0000222656 00000 n -0000592888 00000 n +0000222657 00000 n +0000592958 00000 n 0000000785 00000 n 0000000810 00000 n -0000228309 00000 n -0000592800 00000 n +0000228310 00000 n +0000592870 00000 n 0000000858 00000 n 0000000885 00000 n -0000234416 00000 n -0000592712 00000 n +0000234417 00000 n +0000592782 00000 n 0000000933 00000 n 0000000962 00000 n -0000240894 00000 n -0000592624 00000 n +0000240895 00000 n +0000592694 00000 n 0000001010 00000 n 0000001039 00000 n -0000247230 00000 n -0000592536 00000 n +0000247231 00000 n +0000592606 00000 n 0000001087 00000 n 0000001116 00000 n -0000253861 00000 n -0000592448 00000 n +0000253862 00000 n +0000592518 00000 n 0000001164 00000 n 0000001193 00000 n -0000260520 00000 n -0000592360 00000 n +0000260521 00000 n +0000592430 00000 n 0000001241 00000 n 0000001270 00000 n -0000267308 00000 n -0000592272 00000 n +0000267377 00000 n +0000592342 00000 n 0000001318 00000 n 0000001347 00000 n -0000273729 00000 n -0000592184 00000 n +0000273799 00000 n +0000592254 00000 n 0000001395 00000 n 0000001424 00000 n -0000280027 00000 n -0000592096 00000 n +0000280097 00000 n +0000592166 00000 n 0000001472 00000 n 0000001501 00000 n -0000286314 00000 n -0000592008 00000 n +0000286384 00000 n +0000592078 00000 n 0000001549 00000 n 0000001578 00000 n -0000292599 00000 n -0000591919 00000 n +0000292669 00000 n +0000591989 00000 n 0000001626 00000 n 0000001655 00000 n -0000299096 00000 n -0000591828 00000 n +0000299166 00000 n +0000591898 00000 n 0000001703 00000 n 0000001734 00000 n -0000305367 00000 n -0000591735 00000 n +0000305437 00000 n +0000591805 00000 n 0000001783 00000 n 0000001814 00000 n -0000311729 00000 n -0000591642 00000 n +0000311799 00000 n +0000591712 00000 n 0000001863 00000 n 0000001894 00000 n -0000318636 00000 n -0000591549 00000 n +0000318706 00000 n +0000591619 00000 n 0000001943 00000 n 0000001974 00000 n -0000325123 00000 n -0000591456 00000 n +0000325193 00000 n +0000591526 00000 n 0000002023 00000 n 0000002054 00000 n -0000330753 00000 n -0000591377 00000 n +0000330823 00000 n +0000591447 00000 n 0000002103 00000 n 0000002134 00000 n -0000004851 00000 n -0000005163 00000 n -0000005317 00000 n -0000005457 00000 n -0000005611 00000 n -0000005765 00000 n -0000005918 00000 n -0000006072 00000 n -0000006226 00000 n -0000006380 00000 n -0000006534 00000 n -0000006688 00000 n -0000006842 00000 n -0000006996 00000 n -0000007150 00000 n -0000007302 00000 n -0000007456 00000 n -0000007610 00000 n -0000007765 00000 n -0000007903 00000 n -0000008039 00000 n -0000008424 00000 n +0000004852 00000 n +0000005164 00000 n +0000005318 00000 n +0000005458 00000 n +0000005612 00000 n +0000005766 00000 n +0000005919 00000 n +0000006073 00000 n +0000006227 00000 n +0000006381 00000 n +0000006535 00000 n +0000006689 00000 n +0000006843 00000 n +0000006997 00000 n +0000007151 00000 n +0000007303 00000 n +0000007457 00000 n +0000007611 00000 n +0000007766 00000 n +0000007904 00000 n +0000008040 00000 n +0000008425 00000 n 0000002184 00000 n -0000008180 00000 n -0000008241 00000 n -0000008302 00000 n -0000008363 00000 n -0000589919 00000 n -0000590452 00000 n -0000590095 00000 n -0000588755 00000 n -0000589418 00000 n -0000588589 00000 n -0000336086 00000 n -0000590629 00000 n -0000126374 00000 n -0000330631 00000 n -0000011283 00000 n -0000123357 00000 n -0000123511 00000 n -0000123651 00000 n -0000123805 00000 n -0000123959 00000 n -0000124112 00000 n -0000124266 00000 n -0000124420 00000 n -0000124574 00000 n -0000124728 00000 n -0000124882 00000 n -0000125036 00000 n -0000125190 00000 n -0000125344 00000 n -0000125496 00000 n -0000125650 00000 n -0000125804 00000 n -0000125959 00000 n -0000126097 00000 n -0000126233 00000 n -0000126617 00000 n -0000010956 00000 n -0000008626 00000 n -0000126435 00000 n -0000126556 00000 n -0000588921 00000 n -0000590274 00000 n -0000123281 00000 n -0000012180 00000 n -0000428753 00000 n -0000122245 00000 n -0000012468 00000 n -0000547211 00000 n -0000122151 00000 n -0000012623 00000 n -0000534656 00000 n -0000122065 00000 n -0000012778 00000 n -0000012932 00000 n -0000103697 00000 n -0000428700 00000 n -0000104336 00000 n -0000547168 00000 n -0000104470 00000 n -0000534611 00000 n -0000104641 00000 n -0000133403 00000 n -0000133258 00000 n -0000130241 00000 n -0000130395 00000 n -0000130535 00000 n -0000130689 00000 n -0000130843 00000 n -0000130996 00000 n -0000131150 00000 n -0000131304 00000 n -0000131458 00000 n -0000131612 00000 n -0000131766 00000 n -0000131920 00000 n -0000132074 00000 n -0000132228 00000 n -0000132380 00000 n -0000132534 00000 n -0000132688 00000 n -0000132843 00000 n -0000132981 00000 n -0000133117 00000 n -0000133646 00000 n -0000129921 00000 n -0000126795 00000 n -0000133464 00000 n -0000133585 00000 n -0000589595 00000 n -0000139917 00000 n -0000331056 00000 n -0000136900 00000 n -0000137054 00000 n -0000137194 00000 n -0000137348 00000 n -0000137502 00000 n -0000137655 00000 n -0000137809 00000 n -0000137963 00000 n -0000138117 00000 n -0000138271 00000 n -0000138425 00000 n -0000138579 00000 n -0000138733 00000 n -0000138887 00000 n -0000139039 00000 n -0000139193 00000 n -0000139347 00000 n -0000139502 00000 n -0000139640 00000 n -0000139776 00000 n -0000140160 00000 n -0000136588 00000 n -0000133822 00000 n -0000139978 00000 n -0000140099 00000 n -0000160637 00000 n -0000143226 00000 n -0000157620 00000 n -0000157774 00000 n -0000157914 00000 n -0000158068 00000 n -0000158222 00000 n -0000158375 00000 n -0000158529 00000 n -0000158683 00000 n -0000158837 00000 n -0000158991 00000 n -0000159145 00000 n -0000159299 00000 n -0000159453 00000 n -0000159607 00000 n -0000159759 00000 n -0000159913 00000 n -0000160067 00000 n -0000160222 00000 n -0000160360 00000 n -0000160496 00000 n -0000160880 00000 n -0000142914 00000 n -0000140336 00000 n -0000160698 00000 n -0000160819 00000 n -0000589240 00000 n -0000589772 00000 n -0000184944 00000 n -0000163950 00000 n -0000181927 00000 n -0000182081 00000 n -0000182221 00000 n -0000182375 00000 n -0000182529 00000 n -0000182682 00000 n -0000182836 00000 n -0000182990 00000 n -0000183144 00000 n -0000183298 00000 n -0000183452 00000 n -0000183606 00000 n -0000183760 00000 n -0000183914 00000 n -0000184066 00000 n -0000184220 00000 n -0000184374 00000 n -0000184529 00000 n -0000184667 00000 n -0000184803 00000 n -0000185187 00000 n -0000163638 00000 n -0000161092 00000 n -0000185005 00000 n -0000185126 00000 n -0000191442 00000 n -0000188425 00000 n -0000188579 00000 n -0000188719 00000 n -0000188873 00000 n -0000189027 00000 n -0000189180 00000 n -0000189334 00000 n -0000189488 00000 n -0000189642 00000 n -0000189796 00000 n -0000189950 00000 n -0000190104 00000 n -0000190258 00000 n -0000190412 00000 n -0000190564 00000 n -0000190718 00000 n -0000190872 00000 n -0000191027 00000 n -0000191165 00000 n -0000191301 00000 n -0000191685 00000 n -0000188113 00000 n -0000185373 00000 n -0000191503 00000 n -0000191624 00000 n -0000589062 00000 n -0000590746 00000 n -0000197718 00000 n -0000194701 00000 n -0000194855 00000 n -0000194995 00000 n -0000195149 00000 n -0000195303 00000 n -0000195456 00000 n -0000195610 00000 n -0000195764 00000 n -0000195918 00000 n -0000196072 00000 n -0000196226 00000 n -0000196380 00000 n -0000196534 00000 n -0000196688 00000 n -0000196840 00000 n -0000196994 00000 n -0000197148 00000 n -0000197303 00000 n -0000197441 00000 n -0000197577 00000 n -0000197960 00000 n -0000194389 00000 n -0000191848 00000 n -0000197779 00000 n -0000197900 00000 n -0000204194 00000 n -0000201173 00000 n -0000201327 00000 n -0000201467 00000 n -0000201622 00000 n -0000201776 00000 n -0000201929 00000 n -0000202083 00000 n -0000202238 00000 n -0000202392 00000 n -0000202546 00000 n -0000202700 00000 n -0000202855 00000 n -0000203009 00000 n -0000203163 00000 n -0000203315 00000 n -0000203470 00000 n -0000203624 00000 n -0000203779 00000 n -0000203917 00000 n -0000204053 00000 n -0000204437 00000 n -0000200861 00000 n -0000198110 00000 n -0000204255 00000 n -0000204376 00000 n -0000210502 00000 n -0000207475 00000 n -0000207629 00000 n -0000207769 00000 n -0000207924 00000 n -0000208078 00000 n -0000208232 00000 n -0000208387 00000 n -0000208542 00000 n -0000208696 00000 n -0000208851 00000 n -0000209006 00000 n -0000209161 00000 n -0000209315 00000 n -0000209470 00000 n -0000209623 00000 n -0000209778 00000 n -0000209932 00000 n -0000210087 00000 n -0000210225 00000 n -0000210361 00000 n -0000210745 00000 n -0000207163 00000 n -0000204613 00000 n -0000210563 00000 n -0000210684 00000 n -0000216914 00000 n -0000213883 00000 n -0000214038 00000 n -0000214178 00000 n -0000214333 00000 n -0000214488 00000 n -0000214642 00000 n -0000214797 00000 n -0000214952 00000 n -0000215107 00000 n -0000215262 00000 n -0000215417 00000 n -0000215572 00000 n -0000215727 00000 n -0000215882 00000 n -0000216035 00000 n -0000216190 00000 n -0000216344 00000 n -0000216499 00000 n -0000216637 00000 n -0000216773 00000 n -0000217157 00000 n -0000213571 00000 n -0000210895 00000 n -0000216975 00000 n -0000217096 00000 n -0000222534 00000 n -0000219503 00000 n -0000219658 00000 n -0000219798 00000 n -0000219953 00000 n -0000220108 00000 n -0000220262 00000 n -0000220417 00000 n -0000220572 00000 n -0000220727 00000 n -0000220882 00000 n -0000221037 00000 n -0000221192 00000 n -0000221347 00000 n -0000221502 00000 n -0000221655 00000 n -0000221810 00000 n -0000221964 00000 n -0000222119 00000 n -0000222257 00000 n -0000222393 00000 n -0000222716 00000 n -0000219191 00000 n -0000217307 00000 n -0000222595 00000 n -0000228187 00000 n -0000225156 00000 n -0000225311 00000 n -0000225451 00000 n -0000225606 00000 n -0000225761 00000 n -0000225915 00000 n -0000226070 00000 n -0000226225 00000 n -0000226380 00000 n -0000226535 00000 n -0000226690 00000 n -0000226845 00000 n -0000227000 00000 n -0000227155 00000 n -0000227308 00000 n -0000227463 00000 n -0000227617 00000 n -0000227772 00000 n -0000227910 00000 n -0000228046 00000 n -0000228369 00000 n -0000224844 00000 n -0000222840 00000 n -0000228248 00000 n -0000590863 00000 n -0000234294 00000 n -0000231263 00000 n -0000231418 00000 n -0000231558 00000 n -0000231713 00000 n -0000231868 00000 n -0000232022 00000 n -0000232177 00000 n -0000232332 00000 n -0000232487 00000 n -0000232642 00000 n -0000232797 00000 n -0000232952 00000 n -0000233107 00000 n -0000233262 00000 n -0000233415 00000 n -0000233570 00000 n -0000233724 00000 n -0000233879 00000 n -0000234017 00000 n -0000234153 00000 n -0000234537 00000 n -0000230951 00000 n -0000228506 00000 n -0000234355 00000 n -0000234476 00000 n -0000240772 00000 n -0000237741 00000 n -0000237896 00000 n -0000238036 00000 n -0000238191 00000 n -0000238346 00000 n -0000238500 00000 n -0000238655 00000 n -0000238810 00000 n -0000238965 00000 n -0000239120 00000 n -0000239275 00000 n -0000239430 00000 n -0000239585 00000 n -0000239740 00000 n -0000239893 00000 n -0000240048 00000 n -0000240202 00000 n -0000240357 00000 n -0000240495 00000 n -0000240631 00000 n -0000241015 00000 n -0000237429 00000 n -0000234674 00000 n -0000240833 00000 n -0000240954 00000 n -0000247108 00000 n -0000244077 00000 n -0000244232 00000 n -0000244372 00000 n -0000244527 00000 n -0000244682 00000 n -0000244836 00000 n -0000244991 00000 n -0000245146 00000 n -0000245301 00000 n -0000245456 00000 n -0000245611 00000 n -0000245766 00000 n -0000245921 00000 n -0000246076 00000 n -0000246229 00000 n -0000246384 00000 n -0000246538 00000 n -0000246693 00000 n -0000246831 00000 n -0000246967 00000 n -0000247351 00000 n -0000243765 00000 n -0000241152 00000 n -0000247169 00000 n -0000247290 00000 n -0000253739 00000 n -0000250708 00000 n -0000250863 00000 n -0000251003 00000 n -0000251158 00000 n -0000251313 00000 n -0000251467 00000 n -0000251622 00000 n -0000251777 00000 n -0000251932 00000 n -0000252087 00000 n -0000252242 00000 n -0000252397 00000 n -0000252552 00000 n -0000252707 00000 n -0000252860 00000 n -0000253015 00000 n -0000253169 00000 n -0000253324 00000 n -0000253462 00000 n -0000253598 00000 n -0000253982 00000 n -0000250396 00000 n -0000247501 00000 n -0000253800 00000 n -0000253921 00000 n -0000260398 00000 n -0000257367 00000 n -0000257522 00000 n -0000257662 00000 n -0000257817 00000 n -0000257972 00000 n -0000258126 00000 n -0000258281 00000 n -0000258436 00000 n -0000258591 00000 n -0000258746 00000 n -0000258901 00000 n -0000259056 00000 n -0000259211 00000 n -0000259366 00000 n -0000259519 00000 n -0000259674 00000 n -0000259828 00000 n -0000259983 00000 n -0000260121 00000 n -0000260257 00000 n -0000260641 00000 n -0000257055 00000 n -0000254145 00000 n -0000260459 00000 n -0000260580 00000 n -0000267186 00000 n -0000264155 00000 n -0000264310 00000 n -0000264450 00000 n -0000264605 00000 n -0000264760 00000 n -0000264914 00000 n -0000265069 00000 n -0000265224 00000 n -0000265379 00000 n -0000265534 00000 n -0000265689 00000 n -0000265844 00000 n -0000265999 00000 n -0000266154 00000 n -0000266307 00000 n -0000266462 00000 n -0000266616 00000 n -0000266771 00000 n -0000266909 00000 n -0000267045 00000 n -0000267428 00000 n -0000263843 00000 n -0000260791 00000 n -0000267247 00000 n -0000267368 00000 n -0000590980 00000 n -0000273607 00000 n -0000270576 00000 n -0000270731 00000 n -0000270871 00000 n -0000271026 00000 n -0000271181 00000 n -0000271335 00000 n -0000271490 00000 n -0000271645 00000 n -0000271800 00000 n -0000271955 00000 n -0000272110 00000 n -0000272265 00000 n -0000272420 00000 n -0000272575 00000 n -0000272728 00000 n -0000272883 00000 n -0000273037 00000 n -0000273192 00000 n -0000273330 00000 n -0000273466 00000 n -0000273849 00000 n -0000270264 00000 n -0000267578 00000 n -0000273668 00000 n -0000273789 00000 n -0000279905 00000 n -0000276874 00000 n -0000277029 00000 n -0000277169 00000 n -0000277324 00000 n -0000277479 00000 n -0000277633 00000 n -0000277788 00000 n -0000277943 00000 n -0000278098 00000 n -0000278253 00000 n -0000278408 00000 n -0000278563 00000 n -0000278718 00000 n -0000278873 00000 n -0000279026 00000 n -0000279181 00000 n -0000279335 00000 n -0000279490 00000 n -0000279628 00000 n -0000279764 00000 n -0000280148 00000 n -0000276562 00000 n -0000273999 00000 n -0000279966 00000 n -0000280087 00000 n -0000286192 00000 n -0000283161 00000 n -0000283316 00000 n -0000283456 00000 n -0000283611 00000 n -0000283766 00000 n -0000283920 00000 n -0000284075 00000 n -0000284230 00000 n -0000284385 00000 n -0000284540 00000 n -0000284695 00000 n -0000284850 00000 n -0000285005 00000 n -0000285160 00000 n -0000285313 00000 n -0000285468 00000 n -0000285622 00000 n -0000285777 00000 n -0000285915 00000 n -0000286051 00000 n -0000286435 00000 n -0000282849 00000 n -0000280285 00000 n -0000286253 00000 n -0000286374 00000 n -0000292477 00000 n -0000289446 00000 n -0000289601 00000 n -0000289741 00000 n -0000289896 00000 n -0000290051 00000 n -0000290205 00000 n -0000290360 00000 n -0000290515 00000 n -0000290670 00000 n -0000290825 00000 n -0000290980 00000 n -0000291135 00000 n -0000291290 00000 n -0000291445 00000 n -0000291598 00000 n -0000291753 00000 n -0000291907 00000 n -0000292062 00000 n -0000292200 00000 n -0000292336 00000 n -0000292720 00000 n -0000289134 00000 n -0000286598 00000 n -0000292538 00000 n -0000292659 00000 n -0000298974 00000 n -0000295943 00000 n -0000296098 00000 n -0000296238 00000 n -0000296393 00000 n -0000296548 00000 n -0000296702 00000 n -0000296857 00000 n -0000297012 00000 n -0000297167 00000 n -0000297322 00000 n -0000297477 00000 n -0000297632 00000 n -0000297787 00000 n -0000297942 00000 n -0000298095 00000 n -0000298250 00000 n -0000298404 00000 n -0000298559 00000 n -0000298697 00000 n -0000298833 00000 n -0000299217 00000 n -0000295631 00000 n -0000292857 00000 n -0000299035 00000 n -0000299156 00000 n -0000305245 00000 n -0000302214 00000 n -0000302369 00000 n -0000302509 00000 n -0000302664 00000 n -0000302819 00000 n -0000302973 00000 n -0000303128 00000 n -0000303283 00000 n -0000303438 00000 n -0000303593 00000 n -0000303748 00000 n -0000303903 00000 n -0000304058 00000 n -0000304213 00000 n -0000304366 00000 n -0000304521 00000 n -0000304675 00000 n -0000304830 00000 n -0000304968 00000 n -0000305104 00000 n -0000305489 00000 n -0000301902 00000 n -0000299380 00000 n -0000305306 00000 n -0000305428 00000 n -0000591097 00000 n -0000311607 00000 n -0000308576 00000 n -0000308731 00000 n -0000308871 00000 n -0000309026 00000 n -0000309181 00000 n -0000309335 00000 n -0000309490 00000 n -0000309645 00000 n -0000309800 00000 n -0000309955 00000 n -0000310110 00000 n -0000310265 00000 n -0000310420 00000 n -0000310575 00000 n -0000310728 00000 n -0000310883 00000 n -0000311037 00000 n -0000311192 00000 n -0000311330 00000 n -0000311466 00000 n -0000311851 00000 n -0000308264 00000 n -0000305639 00000 n -0000311668 00000 n -0000311790 00000 n -0000318514 00000 n -0000312001 00000 n -0000312287 00000 n -0000315483 00000 n -0000315638 00000 n -0000315778 00000 n -0000315933 00000 n -0000316088 00000 n -0000316242 00000 n -0000316397 00000 n -0000316552 00000 n -0000316707 00000 n -0000316862 00000 n -0000317017 00000 n -0000317172 00000 n -0000317327 00000 n -0000317482 00000 n -0000317635 00000 n -0000317790 00000 n -0000317944 00000 n -0000318099 00000 n -0000318237 00000 n -0000318373 00000 n -0000318758 00000 n -0000315171 00000 n -0000312573 00000 n -0000318575 00000 n -0000318697 00000 n -0000332138 00000 n -0000331387 00000 n -0000325001 00000 n -0000321970 00000 n -0000322125 00000 n -0000322265 00000 n -0000322420 00000 n -0000322575 00000 n -0000322729 00000 n -0000322884 00000 n -0000323039 00000 n -0000323194 00000 n -0000323349 00000 n -0000323504 00000 n -0000323659 00000 n -0000323814 00000 n -0000323969 00000 n -0000324122 00000 n -0000324277 00000 n -0000324431 00000 n -0000324586 00000 n -0000324724 00000 n -0000324860 00000 n -0000325245 00000 n -0000321658 00000 n -0000318949 00000 n -0000325062 00000 n -0000325184 00000 n -0000327600 00000 n -0000327755 00000 n -0000327895 00000 n -0000328050 00000 n -0000328205 00000 n -0000328359 00000 n -0000328514 00000 n -0000328669 00000 n -0000328824 00000 n -0000328979 00000 n -0000329134 00000 n -0000329289 00000 n -0000329444 00000 n -0000329599 00000 n -0000329752 00000 n -0000329907 00000 n -0000330061 00000 n -0000330216 00000 n -0000330354 00000 n -0000330490 00000 n -0000330814 00000 n -0000327288 00000 n -0000325395 00000 n -0000330692 00000 n -0000331088 00000 n -0000331655 00000 n -0000331681 00000 n -0000331742 00000 n -0000331778 00000 n -0000332408 00000 n -0000332434 00000 n -0000332497 00000 n -0000588145 00000 n -0000332534 00000 n -0000332889 00000 n -0000332912 00000 n -0000333387 00000 n -0000587589 00000 n -0000333988 00000 n -0000334372 00000 n -0000334397 00000 n -0000334562 00000 n -0000336335 00000 n -0000336376 00000 n -0000336450 00000 n -0000588017 00000 n -0000336497 00000 n +0000008181 00000 n +0000008242 00000 n +0000008303 00000 n +0000008364 00000 n +0000589989 00000 n +0000590522 00000 n +0000590165 00000 n +0000588825 00000 n +0000589488 00000 n +0000588659 00000 n +0000336156 00000 n +0000590699 00000 n +0000126375 00000 n +0000330701 00000 n +0000011284 00000 n +0000123358 00000 n +0000123512 00000 n +0000123652 00000 n +0000123806 00000 n +0000123960 00000 n +0000124113 00000 n +0000124267 00000 n +0000124421 00000 n +0000124575 00000 n +0000124729 00000 n +0000124883 00000 n +0000125037 00000 n +0000125191 00000 n +0000125345 00000 n +0000125497 00000 n +0000125651 00000 n +0000125805 00000 n +0000125960 00000 n +0000126098 00000 n +0000126234 00000 n +0000126618 00000 n +0000010957 00000 n +0000008627 00000 n +0000126436 00000 n +0000126557 00000 n +0000588991 00000 n +0000590344 00000 n +0000123282 00000 n +0000012181 00000 n +0000428823 00000 n +0000122246 00000 n +0000012469 00000 n +0000547281 00000 n +0000122152 00000 n +0000012624 00000 n +0000534726 00000 n +0000122066 00000 n +0000012779 00000 n +0000012933 00000 n +0000103698 00000 n +0000428770 00000 n +0000104337 00000 n +0000547238 00000 n +0000104471 00000 n +0000534681 00000 n +0000104642 00000 n +0000133404 00000 n +0000133259 00000 n +0000130242 00000 n +0000130396 00000 n +0000130536 00000 n +0000130690 00000 n +0000130844 00000 n +0000130997 00000 n +0000131151 00000 n +0000131305 00000 n +0000131459 00000 n +0000131613 00000 n +0000131767 00000 n +0000131921 00000 n +0000132075 00000 n +0000132229 00000 n +0000132381 00000 n +0000132535 00000 n +0000132689 00000 n +0000132844 00000 n +0000132982 00000 n +0000133118 00000 n +0000133647 00000 n +0000129922 00000 n +0000126796 00000 n +0000133465 00000 n +0000133586 00000 n +0000589665 00000 n +0000139918 00000 n +0000331126 00000 n +0000136901 00000 n +0000137055 00000 n +0000137195 00000 n +0000137349 00000 n +0000137503 00000 n +0000137656 00000 n +0000137810 00000 n +0000137964 00000 n +0000138118 00000 n +0000138272 00000 n +0000138426 00000 n +0000138580 00000 n +0000138734 00000 n +0000138888 00000 n +0000139040 00000 n +0000139194 00000 n +0000139348 00000 n +0000139503 00000 n +0000139641 00000 n +0000139777 00000 n +0000140161 00000 n +0000136589 00000 n +0000133823 00000 n +0000139979 00000 n +0000140100 00000 n +0000160638 00000 n +0000143227 00000 n +0000157621 00000 n +0000157775 00000 n +0000157915 00000 n +0000158069 00000 n +0000158223 00000 n +0000158376 00000 n +0000158530 00000 n +0000158684 00000 n +0000158838 00000 n +0000158992 00000 n +0000159146 00000 n +0000159300 00000 n +0000159454 00000 n +0000159608 00000 n +0000159760 00000 n +0000159914 00000 n +0000160068 00000 n +0000160223 00000 n +0000160361 00000 n +0000160497 00000 n +0000160881 00000 n +0000142915 00000 n +0000140337 00000 n +0000160699 00000 n +0000160820 00000 n +0000589310 00000 n +0000589842 00000 n +0000184945 00000 n +0000163951 00000 n +0000181928 00000 n +0000182082 00000 n +0000182222 00000 n +0000182376 00000 n +0000182530 00000 n +0000182683 00000 n +0000182837 00000 n +0000182991 00000 n +0000183145 00000 n +0000183299 00000 n +0000183453 00000 n +0000183607 00000 n +0000183761 00000 n +0000183915 00000 n +0000184067 00000 n +0000184221 00000 n +0000184375 00000 n +0000184530 00000 n +0000184668 00000 n +0000184804 00000 n +0000185188 00000 n +0000163639 00000 n +0000161093 00000 n +0000185006 00000 n +0000185127 00000 n +0000191443 00000 n +0000188426 00000 n +0000188580 00000 n +0000188720 00000 n +0000188874 00000 n +0000189028 00000 n +0000189181 00000 n +0000189335 00000 n +0000189489 00000 n +0000189643 00000 n +0000189797 00000 n +0000189951 00000 n +0000190105 00000 n +0000190259 00000 n +0000190413 00000 n +0000190565 00000 n +0000190719 00000 n +0000190873 00000 n +0000191028 00000 n +0000191166 00000 n +0000191302 00000 n +0000191686 00000 n +0000188114 00000 n +0000185374 00000 n +0000191504 00000 n +0000191625 00000 n +0000589132 00000 n +0000590816 00000 n +0000197719 00000 n +0000194702 00000 n +0000194856 00000 n +0000194996 00000 n +0000195150 00000 n +0000195304 00000 n +0000195457 00000 n +0000195611 00000 n +0000195765 00000 n +0000195919 00000 n +0000196073 00000 n +0000196227 00000 n +0000196381 00000 n +0000196535 00000 n +0000196689 00000 n +0000196841 00000 n +0000196995 00000 n +0000197149 00000 n +0000197304 00000 n +0000197442 00000 n +0000197578 00000 n +0000197961 00000 n +0000194390 00000 n +0000191849 00000 n +0000197780 00000 n +0000197901 00000 n +0000204195 00000 n +0000201174 00000 n +0000201328 00000 n +0000201468 00000 n +0000201623 00000 n +0000201777 00000 n +0000201930 00000 n +0000202084 00000 n +0000202239 00000 n +0000202393 00000 n +0000202547 00000 n +0000202701 00000 n +0000202856 00000 n +0000203010 00000 n +0000203164 00000 n +0000203316 00000 n +0000203471 00000 n +0000203625 00000 n +0000203780 00000 n +0000203918 00000 n +0000204054 00000 n +0000204438 00000 n +0000200862 00000 n +0000198111 00000 n +0000204256 00000 n +0000204377 00000 n +0000210503 00000 n +0000207476 00000 n +0000207630 00000 n +0000207770 00000 n +0000207925 00000 n +0000208079 00000 n +0000208233 00000 n +0000208388 00000 n +0000208543 00000 n +0000208697 00000 n +0000208852 00000 n +0000209007 00000 n +0000209162 00000 n +0000209316 00000 n +0000209471 00000 n +0000209624 00000 n +0000209779 00000 n +0000209933 00000 n +0000210088 00000 n +0000210226 00000 n +0000210362 00000 n +0000210746 00000 n +0000207164 00000 n +0000204614 00000 n +0000210564 00000 n +0000210685 00000 n +0000216915 00000 n +0000213884 00000 n +0000214039 00000 n +0000214179 00000 n +0000214334 00000 n +0000214489 00000 n +0000214643 00000 n +0000214798 00000 n +0000214953 00000 n +0000215108 00000 n +0000215263 00000 n +0000215418 00000 n +0000215573 00000 n +0000215728 00000 n +0000215883 00000 n +0000216036 00000 n +0000216191 00000 n +0000216345 00000 n +0000216500 00000 n +0000216638 00000 n +0000216774 00000 n +0000217158 00000 n +0000213572 00000 n +0000210896 00000 n +0000216976 00000 n +0000217097 00000 n +0000222535 00000 n +0000219504 00000 n +0000219659 00000 n +0000219799 00000 n +0000219954 00000 n +0000220109 00000 n +0000220263 00000 n +0000220418 00000 n +0000220573 00000 n +0000220728 00000 n +0000220883 00000 n +0000221038 00000 n +0000221193 00000 n +0000221348 00000 n +0000221503 00000 n +0000221656 00000 n +0000221811 00000 n +0000221965 00000 n +0000222120 00000 n +0000222258 00000 n +0000222394 00000 n +0000222717 00000 n +0000219192 00000 n +0000217308 00000 n +0000222596 00000 n +0000228188 00000 n +0000225157 00000 n +0000225312 00000 n +0000225452 00000 n +0000225607 00000 n +0000225762 00000 n +0000225916 00000 n +0000226071 00000 n +0000226226 00000 n +0000226381 00000 n +0000226536 00000 n +0000226691 00000 n +0000226846 00000 n +0000227001 00000 n +0000227156 00000 n +0000227309 00000 n +0000227464 00000 n +0000227618 00000 n +0000227773 00000 n +0000227911 00000 n +0000228047 00000 n +0000228370 00000 n +0000224845 00000 n +0000222841 00000 n +0000228249 00000 n +0000590933 00000 n +0000234295 00000 n +0000231264 00000 n +0000231419 00000 n +0000231559 00000 n +0000231714 00000 n +0000231869 00000 n +0000232023 00000 n +0000232178 00000 n +0000232333 00000 n +0000232488 00000 n +0000232643 00000 n +0000232798 00000 n +0000232953 00000 n +0000233108 00000 n +0000233263 00000 n +0000233416 00000 n +0000233571 00000 n +0000233725 00000 n +0000233880 00000 n +0000234018 00000 n +0000234154 00000 n +0000234538 00000 n +0000230952 00000 n +0000228507 00000 n +0000234356 00000 n +0000234477 00000 n +0000240773 00000 n +0000237742 00000 n +0000237897 00000 n +0000238037 00000 n +0000238192 00000 n +0000238347 00000 n +0000238501 00000 n +0000238656 00000 n +0000238811 00000 n +0000238966 00000 n +0000239121 00000 n +0000239276 00000 n +0000239431 00000 n +0000239586 00000 n +0000239741 00000 n +0000239894 00000 n +0000240049 00000 n +0000240203 00000 n +0000240358 00000 n +0000240496 00000 n +0000240632 00000 n +0000241016 00000 n +0000237430 00000 n +0000234675 00000 n +0000240834 00000 n +0000240955 00000 n +0000247109 00000 n +0000244078 00000 n +0000244233 00000 n +0000244373 00000 n +0000244528 00000 n +0000244683 00000 n +0000244837 00000 n +0000244992 00000 n +0000245147 00000 n +0000245302 00000 n +0000245457 00000 n +0000245612 00000 n +0000245767 00000 n +0000245922 00000 n +0000246077 00000 n +0000246230 00000 n +0000246385 00000 n +0000246539 00000 n +0000246694 00000 n +0000246832 00000 n +0000246968 00000 n +0000247352 00000 n +0000243766 00000 n +0000241153 00000 n +0000247170 00000 n +0000247291 00000 n +0000253740 00000 n +0000250709 00000 n +0000250864 00000 n +0000251004 00000 n +0000251159 00000 n +0000251314 00000 n +0000251468 00000 n +0000251623 00000 n +0000251778 00000 n +0000251933 00000 n +0000252088 00000 n +0000252243 00000 n +0000252398 00000 n +0000252553 00000 n +0000252708 00000 n +0000252861 00000 n +0000253016 00000 n +0000253170 00000 n +0000253325 00000 n +0000253463 00000 n +0000253599 00000 n +0000253983 00000 n +0000250397 00000 n +0000247502 00000 n +0000253801 00000 n +0000253922 00000 n +0000260399 00000 n +0000257368 00000 n +0000257523 00000 n +0000257663 00000 n +0000257818 00000 n +0000257973 00000 n +0000258127 00000 n +0000258282 00000 n +0000258437 00000 n +0000258592 00000 n +0000258747 00000 n +0000258902 00000 n +0000259057 00000 n +0000259212 00000 n +0000259367 00000 n +0000259520 00000 n +0000259675 00000 n +0000259829 00000 n +0000259984 00000 n +0000260122 00000 n +0000260258 00000 n +0000260642 00000 n +0000257056 00000 n +0000254146 00000 n +0000260460 00000 n +0000260581 00000 n +0000267255 00000 n +0000264224 00000 n +0000264379 00000 n +0000264519 00000 n +0000264674 00000 n +0000264829 00000 n +0000264983 00000 n +0000265138 00000 n +0000265293 00000 n +0000265448 00000 n +0000265603 00000 n +0000265758 00000 n +0000265913 00000 n +0000266068 00000 n +0000266223 00000 n +0000266376 00000 n +0000266531 00000 n +0000266685 00000 n +0000266840 00000 n +0000266978 00000 n +0000267114 00000 n +0000267498 00000 n +0000263912 00000 n +0000260792 00000 n +0000267316 00000 n +0000267437 00000 n +0000591050 00000 n +0000273677 00000 n +0000270646 00000 n +0000270801 00000 n +0000270941 00000 n +0000271096 00000 n +0000271251 00000 n +0000271405 00000 n +0000271560 00000 n +0000271715 00000 n +0000271870 00000 n +0000272025 00000 n +0000272180 00000 n +0000272335 00000 n +0000272490 00000 n +0000272645 00000 n +0000272798 00000 n +0000272953 00000 n +0000273107 00000 n +0000273262 00000 n +0000273400 00000 n +0000273536 00000 n +0000273919 00000 n +0000270334 00000 n +0000267648 00000 n +0000273738 00000 n +0000273859 00000 n +0000279975 00000 n +0000276944 00000 n +0000277099 00000 n +0000277239 00000 n +0000277394 00000 n +0000277549 00000 n +0000277703 00000 n +0000277858 00000 n +0000278013 00000 n +0000278168 00000 n +0000278323 00000 n +0000278478 00000 n +0000278633 00000 n +0000278788 00000 n +0000278943 00000 n +0000279096 00000 n +0000279251 00000 n +0000279405 00000 n +0000279560 00000 n +0000279698 00000 n +0000279834 00000 n +0000280218 00000 n +0000276632 00000 n +0000274069 00000 n +0000280036 00000 n +0000280157 00000 n +0000286262 00000 n +0000283231 00000 n +0000283386 00000 n +0000283526 00000 n +0000283681 00000 n +0000283836 00000 n +0000283990 00000 n +0000284145 00000 n +0000284300 00000 n +0000284455 00000 n +0000284610 00000 n +0000284765 00000 n +0000284920 00000 n +0000285075 00000 n +0000285230 00000 n +0000285383 00000 n +0000285538 00000 n +0000285692 00000 n +0000285847 00000 n +0000285985 00000 n +0000286121 00000 n +0000286505 00000 n +0000282919 00000 n +0000280355 00000 n +0000286323 00000 n +0000286444 00000 n +0000292547 00000 n +0000289516 00000 n +0000289671 00000 n +0000289811 00000 n +0000289966 00000 n +0000290121 00000 n +0000290275 00000 n +0000290430 00000 n +0000290585 00000 n +0000290740 00000 n +0000290895 00000 n +0000291050 00000 n +0000291205 00000 n +0000291360 00000 n +0000291515 00000 n +0000291668 00000 n +0000291823 00000 n +0000291977 00000 n +0000292132 00000 n +0000292270 00000 n +0000292406 00000 n +0000292790 00000 n +0000289204 00000 n +0000286668 00000 n +0000292608 00000 n +0000292729 00000 n +0000299044 00000 n +0000296013 00000 n +0000296168 00000 n +0000296308 00000 n +0000296463 00000 n +0000296618 00000 n +0000296772 00000 n +0000296927 00000 n +0000297082 00000 n +0000297237 00000 n +0000297392 00000 n +0000297547 00000 n +0000297702 00000 n +0000297857 00000 n +0000298012 00000 n +0000298165 00000 n +0000298320 00000 n +0000298474 00000 n +0000298629 00000 n +0000298767 00000 n +0000298903 00000 n +0000299287 00000 n +0000295701 00000 n +0000292927 00000 n +0000299105 00000 n +0000299226 00000 n +0000305315 00000 n +0000302284 00000 n +0000302439 00000 n +0000302579 00000 n +0000302734 00000 n +0000302889 00000 n +0000303043 00000 n +0000303198 00000 n +0000303353 00000 n +0000303508 00000 n +0000303663 00000 n +0000303818 00000 n +0000303973 00000 n +0000304128 00000 n +0000304283 00000 n +0000304436 00000 n +0000304591 00000 n +0000304745 00000 n +0000304900 00000 n +0000305038 00000 n +0000305174 00000 n +0000305559 00000 n +0000301972 00000 n +0000299450 00000 n +0000305376 00000 n +0000305498 00000 n +0000591167 00000 n +0000311677 00000 n +0000308646 00000 n +0000308801 00000 n +0000308941 00000 n +0000309096 00000 n +0000309251 00000 n +0000309405 00000 n +0000309560 00000 n +0000309715 00000 n +0000309870 00000 n +0000310025 00000 n +0000310180 00000 n +0000310335 00000 n +0000310490 00000 n +0000310645 00000 n +0000310798 00000 n +0000310953 00000 n +0000311107 00000 n +0000311262 00000 n +0000311400 00000 n +0000311536 00000 n +0000311921 00000 n +0000308334 00000 n +0000305709 00000 n +0000311738 00000 n +0000311860 00000 n +0000318584 00000 n +0000312071 00000 n +0000312357 00000 n +0000315553 00000 n +0000315708 00000 n +0000315848 00000 n +0000316003 00000 n +0000316158 00000 n +0000316312 00000 n +0000316467 00000 n +0000316622 00000 n +0000316777 00000 n +0000316932 00000 n +0000317087 00000 n +0000317242 00000 n +0000317397 00000 n +0000317552 00000 n +0000317705 00000 n +0000317860 00000 n +0000318014 00000 n +0000318169 00000 n +0000318307 00000 n +0000318443 00000 n +0000318828 00000 n +0000315241 00000 n +0000312643 00000 n +0000318645 00000 n +0000318767 00000 n +0000332208 00000 n +0000331457 00000 n +0000325071 00000 n +0000322040 00000 n +0000322195 00000 n +0000322335 00000 n +0000322490 00000 n +0000322645 00000 n +0000322799 00000 n +0000322954 00000 n +0000323109 00000 n +0000323264 00000 n +0000323419 00000 n +0000323574 00000 n +0000323729 00000 n +0000323884 00000 n +0000324039 00000 n +0000324192 00000 n +0000324347 00000 n +0000324501 00000 n +0000324656 00000 n +0000324794 00000 n +0000324930 00000 n +0000325315 00000 n +0000321728 00000 n +0000319019 00000 n +0000325132 00000 n +0000325254 00000 n +0000327670 00000 n +0000327825 00000 n +0000327965 00000 n +0000328120 00000 n +0000328275 00000 n +0000328429 00000 n +0000328584 00000 n +0000328739 00000 n +0000328894 00000 n +0000329049 00000 n +0000329204 00000 n +0000329359 00000 n +0000329514 00000 n +0000329669 00000 n +0000329822 00000 n +0000329977 00000 n +0000330131 00000 n +0000330286 00000 n +0000330424 00000 n +0000330560 00000 n +0000330884 00000 n +0000327358 00000 n +0000325465 00000 n +0000330762 00000 n +0000331158 00000 n +0000331725 00000 n +0000331751 00000 n +0000331812 00000 n +0000331848 00000 n +0000332478 00000 n +0000332504 00000 n +0000332567 00000 n +0000588215 00000 n +0000332604 00000 n +0000332959 00000 n +0000332982 00000 n +0000333457 00000 n +0000587659 00000 n +0000334058 00000 n +0000334442 00000 n +0000334467 00000 n +0000334632 00000 n +0000336405 00000 n +0000336446 00000 n 0000336520 00000 n -0000588079 00000 n -0000337019 00000 n -0000337043 00000 n -0000587948 00000 n -0000337722 00000 n -0000337745 00000 n -0000338212 00000 n -0000353934 00000 n -0000354168 00000 n -0000402088 00000 n -0000402403 00000 n -0000429069 00000 n -0000484000 00000 n -0000484499 00000 n -0000511980 00000 n -0000512281 00000 n -0000534895 00000 n -0000542089 00000 n -0000542315 00000 n -0000547440 00000 n -0000556121 00000 n -0000556476 00000 n -0000563689 00000 n -0000563995 00000 n -0000569826 00000 n -0000570099 00000 n -0000584995 00000 n -0000585562 00000 n -0000587370 00000 n -0000591206 00000 n -0000591300 00000 n -0000593843 00000 n -0000594028 00000 n -0000594238 00000 n -0000594447 00000 n -0000594657 00000 n -0000594861 00000 n -0000595058 00000 n -0000595254 00000 n -0000595449 00000 n -0000595648 00000 n -0000595836 00000 n -0000596027 00000 n -0000596215 00000 n -0000596392 00000 n -0000596562 00000 n -0000596731 00000 n -0000596901 00000 n -0000597065 00000 n -0000597223 00000 n -0000597389 00000 n -0000597504 00000 n -0000597619 00000 n -0000597728 00000 n +0000588087 00000 n +0000336567 00000 n +0000336590 00000 n +0000588149 00000 n +0000337089 00000 n +0000337113 00000 n +0000588018 00000 n +0000337792 00000 n +0000337815 00000 n +0000338282 00000 n +0000354004 00000 n +0000354238 00000 n +0000402158 00000 n +0000402473 00000 n +0000429139 00000 n +0000484070 00000 n +0000484569 00000 n +0000512050 00000 n +0000512351 00000 n +0000534965 00000 n +0000542159 00000 n +0000542385 00000 n +0000547510 00000 n +0000556191 00000 n +0000556546 00000 n +0000563759 00000 n +0000564065 00000 n +0000569896 00000 n +0000570169 00000 n +0000585065 00000 n +0000585632 00000 n +0000587440 00000 n +0000591276 00000 n +0000591370 00000 n +0000593913 00000 n +0000594098 00000 n +0000594308 00000 n +0000594517 00000 n +0000594727 00000 n +0000594931 00000 n +0000595128 00000 n +0000595324 00000 n +0000595519 00000 n +0000595718 00000 n +0000595906 00000 n +0000596097 00000 n +0000596285 00000 n +0000596462 00000 n +0000596632 00000 n +0000596801 00000 n +0000596971 00000 n +0000597135 00000 n +0000597293 00000 n +0000597459 00000 n +0000597574 00000 n +0000597689 00000 n 0000597798 00000 n -0000597896 00000 n -0000597935 00000 n -0000598416 00000 n +0000597868 00000 n +0000597966 00000 n +0000598005 00000 n +0000598486 00000 n trailer << /Size 1003 /Root 1001 0 R /Info 1002 0 R -/ID [<4C58FD530E01111E937932F64D706E22> <4C58FD530E01111E937932F64D706E22>] >> +/ID [<5247A2EC599361D9CE9B2CE5388EACFD> <5247A2EC599361D9CE9B2CE5388EACFD>] >> startxref -598919 +598989 %%EOF diff --git a/SPF/Documentation/SAS(r) packages - the way to share (a how to)- Paper 4725-2020 - extended.pdf b/SPF/Documentation/SAS(r) packages - the way to share (a how to)- Paper 4725-2020 - extended.pdf index 2f159f9..ab5a57a 100644 Binary files a/SPF/Documentation/SAS(r) packages - the way to share (a how to)- Paper 4725-2020 - extended.pdf and b/SPF/Documentation/SAS(r) packages - the way to share (a how to)- Paper 4725-2020 - extended.pdf differ diff --git a/SPF/Macros/extendpackagesfileref.sas b/SPF/Macros/extendpackagesfileref.sas index 569e71c..10a383e 100644 --- a/SPF/Macros/extendpackagesfileref.sas +++ b/SPF/Macros/extendpackagesfileref.sas @@ -6,7 +6,7 @@ when empty the "packages" value is used */ )/secure /*** HELP END ***/ -des = 'Macro to list directories pointed by "packages" fileref, version 20220925. Run %extendPackagesFileref(HELP) for help info.' +des = 'Macro to list directories pointed by "packages" fileref, version 20220930. Run %extendPackagesFileref(HELP) for help info.' ; %if %QUPCASE(&packages.) = HELP %then @@ -22,7 +22,7 @@ des = 'Macro to list directories pointed by "packages" fileref, version 20220925 %put ### This is short help information for the `extendPackagesFileref` macro #; %put #-----------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to list directories pointed by 'packages' fileref, version `20220925` #; + %put # Macro to list directories pointed by 'packages' fileref, version `20220930` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; diff --git a/SPF/Macros/generatepackage.sas b/SPF/Macros/generatepackage.sas index 609c9fd..0ac5fef 100644 --- a/SPF/Macros/generatepackage.sas +++ b/SPF/Macros/generatepackage.sas @@ -23,7 +23,7 @@ default value 1 means "delete tests work" */ )/secure minoperator /*** HELP END ***/ -des = 'Macro to generate SAS packages, version 20220925. Run %generatePackage() for help info.' +des = 'Macro to generate SAS packages, version 20220930. Run %generatePackage() for help info.' ; %if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then %do; @@ -38,7 +38,7 @@ des = 'Macro to generate SAS packages, version 20220925. Run %generatePackage() %put ### This is short help information for the `generatePackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to generate SAS packages, version `20220925` #; + %put # Macro to generate SAS packages, version `20220930` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -1592,7 +1592,7 @@ data _null_; put ' end ; '; %end; - put 'put "***"; put "* SAS package generated by generatePackage, version 20220925 *"; put "***";'; + put 'put "***"; put "* SAS package generated by generatePackage, version 20220930 *"; put "***";'; put 'run; ' /; diff --git a/SPF/Macros/helppackage.sas b/SPF/Macros/helppackage.sas index 1234e53..3be635b 100644 --- a/SPF/Macros/helppackage.sas +++ b/SPF/Macros/helppackage.sas @@ -24,7 +24,7 @@ */ )/secure /*** HELP END ***/ -des = 'Macro to get help about SAS package, version 20220925. Run %helpPackage() for help info.' +des = 'Macro to get help about SAS package, version 20220930. Run %helpPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -39,7 +39,7 @@ des = 'Macro to get help about SAS package, version 20220925. Run %helpPackage() %put ### This is short help information for the `helpPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to get help about SAS packages, version `20220925` #; + %put # Macro to get help about SAS packages, version `20220930` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -169,7 +169,7 @@ TODO: - add MD5(&packageName.) value hash instead "package" word in filenames [DONE] */ -/* Macros to install SAS packages, version 20220925 */ +/* Macros to install SAS packages, version 20220930 */ /* A SAS package is a zip file containing a group of files with SAS code (macros, functions, data steps generating data, etc.) wrapped up together and %INCLUDEed by diff --git a/SPF/Macros/installpackage.sas b/SPF/Macros/installpackage.sas index 45c5891..ee2e8cd 100644 --- a/SPF/Macros/installpackage.sas +++ b/SPF/Macros/installpackage.sas @@ -4,7 +4,8 @@ %macro installPackage( packagesNames /* space separated list of packages names, without the zip extension */ , sourcePath = /* location of the package, e.g. "www.some.page/", mind the "/" at the end */ -, mirror = 1 /* indicates which location for package source should be used */ +, mirror = 0 /* indicates which location for package source should be used */ +, version = /* indicates which version of a package to install */ , replace = 1 /* 1 = replace if the package already exist, 0 = otherwise */ , URLuser = /* user name for the password protected URLs */ , URLpass = /* password for the password protected URLs */ @@ -13,7 +14,7 @@ /secure minoperator /*** HELP END ***/ -des = 'Macro to install SAS package, version 20220925. Run %%installPackage() for help info.' +des = 'Macro to install SAS package, version 20220930. Run %%installPackage() for help info.' ; %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then %do; @@ -28,7 +29,7 @@ des = 'Macro to install SAS package, version 20220925. Run %%installPackage() fo %put ### This is short help information for the `installPackage` macro #; %put #--------------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to install SAS packages, version `20220925` #; + %put # Macro to install SAS packages, version `20220930` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -61,11 +62,17 @@ des = 'Macro to install SAS package, version 20220925. Run %%installPackage() fo %put # `https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/` #; %put # #; %put # - `mirror=` Indicates which web location for packages installation is used. #; + %put # Value `0` indicates: #; + %put # `https://raw.githubusercontent.com/SASPAC/` #; %put # Value `1` indicates: #; %put # `https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main` #; %put # Value `2` indicates: #; %put # `https://pages.mini.pw.edu.pl/~jablonskib/SASpublic/SAS_PACKAGES` #; - %put # Default value is `1`. #; + %put # Default value is `0`. #; + %put # #; + %put # - `version=` Indicates which historical version of a package to install. #; + %put # Historical version are available only if `mirror=0` is set. #; + %put # Default value is null which means "install the latest". #; %put # #; %put # - `replace=` With default value of `1` it causes existing package file #; %put # to be replaced by new downloaded file. #; @@ -138,6 +145,13 @@ des = 'Macro to install SAS package, version 20220925. Run %%installPackage() fo %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.sas; %let sourcePath = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/packages/; + %if 0 = %superq(mirror) %then + %do; + %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.sas; + %let sourcePath = https://raw.githubusercontent.com/SASPAC/; + %goto mirrorEnd; + %end; + %if 1 = %superq(mirror) %then %do; %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.sas; @@ -158,7 +172,7 @@ des = 'Macro to install SAS package, version 20220925. Run %%installPackage() fo %local i; %do i = 1 %to %sysfunc(countw(&packagesNames., , S)); /*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*/ - %local packageName; + %local packageName packageSubDir; %let packageName = %scan(&packagesNames., &i., , S); %put ; @@ -183,7 +197,15 @@ des = 'Macro to install SAS package, version 20220925. Run %%installPackage() fo %end; %else %do; - filename &in URL "&sourcePath.%lowcase(&packageName.).zip" + %if 0 = %superq(mirror) %then + %do; + %let packageSubDir = %lowcase(&packageName.)/main/; + %if %superq(version) ne %then + %do; + %let packageSubDir = %lowcase(&packageName.)/main/hist/&version./; + %end; + %end; + filename &in URL "&sourcePath.&packageSubDir.%lowcase(&packageName.).zip" %if (%superq(URLuser) ne ) %then %do; user = "&URLuser." @@ -368,7 +390,7 @@ des = 'Macro to install SAS package, version 20220925. Run %%installPackage() fo /* Macro to list SAS packages in packages folder. - Version 20220925 + Version 20220930 A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating diff --git a/SPF/Macros/listpackages.sas b/SPF/Macros/listpackages.sas index c19de1a..4a74227 100644 --- a/SPF/Macros/listpackages.sas +++ b/SPF/Macros/listpackages.sas @@ -1,7 +1,7 @@ /*+listPackages+*/ %macro listPackages()/secure PARMBUFF -des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20220925.' +des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20220930.' ; %if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then %do; @@ -16,7 +16,7 @@ des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HE %put ### This is short help information for the `listPackages` macro #; %put #-----------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to list available SAS packages, version `20220925` #; + %put # Macro to list available SAS packages, version `20220930` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -166,7 +166,7 @@ options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.; /* Macro to generate SAS packages. - Version 20220925 + Version 20220930 A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating diff --git a/SPF/Macros/loadpackage.sas b/SPF/Macros/loadpackage.sas index dd714c1..1e75770 100644 --- a/SPF/Macros/loadpackage.sas +++ b/SPF/Macros/loadpackage.sas @@ -27,7 +27,7 @@ */ )/secure /*** HELP END ***/ -des = 'Macro to load SAS package, version 20220925. Run %loadPackage() for help info.' +des = 'Macro to load SAS package, version 20220930. Run %loadPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -42,7 +42,7 @@ des = 'Macro to load SAS package, version 20220925. Run %loadPackage() for help %put ### This is short help information for the `loadPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to *load* SAS packages, version `20220925` #; + %put # Macro to *load* SAS packages, version `20220930` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; diff --git a/SPF/Macros/loadpackages.sas b/SPF/Macros/loadpackages.sas index 8d9e1fb..002d440 100644 --- a/SPF/Macros/loadpackages.sas +++ b/SPF/Macros/loadpackages.sas @@ -11,7 +11,7 @@ */ )/secure /*** HELP END ***/ -des = 'Macro to load multiple SAS packages at one run, version 20220925. Run %loadPackages() for help info.' +des = 'Macro to load multiple SAS packages at one run, version 20220930. Run %loadPackages() for help info.' parmbuff ; %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then @@ -27,7 +27,7 @@ parmbuff %put ### This is short help information for the `loadPackageS` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro wrapper for the loadPackage macro, version `20220925` #; + %put # Macro wrapper for the loadPackage macro, version `20220930` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; diff --git a/SPF/Macros/previewpackage.sas b/SPF/Macros/previewpackage.sas index 4c9ab3c..8bd6d13 100644 --- a/SPF/Macros/previewpackage.sas +++ b/SPF/Macros/previewpackage.sas @@ -23,7 +23,7 @@ */ )/secure /*** HELP END ***/ -des = 'Macro to preview content of a SAS package, version 20220925. Run %previewPackage() for help info.' +des = 'Macro to preview content of a SAS package, version 20220930. Run %previewPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -38,7 +38,7 @@ des = 'Macro to preview content of a SAS package, version 20220925. Run %preview %put ### This is short help information for the `previewPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to get previwe of a SAS packages, version `20220925` #; + %put # Macro to get previwe of a SAS packages, version `20220930` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; diff --git a/SPF/Macros/unloadpackage.sas b/SPF/Macros/unloadpackage.sas index 67a0126..feaedd7 100644 --- a/SPF/Macros/unloadpackage.sas +++ b/SPF/Macros/unloadpackage.sas @@ -20,7 +20,7 @@ */ )/secure /*** HELP END ***/ -des = 'Macro to unload SAS package, version 20220925. Run %unloadPackage() for help info.' +des = 'Macro to unload SAS package, version 20220930. Run %unloadPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -35,7 +35,7 @@ des = 'Macro to unload SAS package, version 20220925. Run %unloadPackage() for h %put ### This is short help information for the `unloadPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to unload SAS packages, version `20220925` #; + %put # Macro to unload SAS packages, version `20220930` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; diff --git a/SPF/Macros/verifypackage.sas b/SPF/Macros/verifypackage.sas index 80d6ac0..81f0ac4 100644 --- a/SPF/Macros/verifypackage.sas +++ b/SPF/Macros/verifypackage.sas @@ -13,7 +13,7 @@ hashing_file() function, SAS 9.4M6 */ )/secure /*** HELP END ***/ -des = 'Macro to verify SAS package with the hash digest, version 20220925. Run %verifyPackage() for help info.' +des = 'Macro to verify SAS package with the hash digest, version 20220930. Run %verifyPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -28,7 +28,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20220925. Run % %put ### This is short help information for the `verifyPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to verify SAS package with it hash digest, version `20220925` #; + %put # Macro to verify SAS package with it hash digest, version `20220930` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; diff --git a/SPF/SPFinit.md b/SPF/SPFinit.md index c88dcaa..3a706c3 100644 --- a/SPF/SPFinit.md +++ b/SPF/SPFinit.md @@ -21,7 +21,7 @@ A **SAS package** is an automatically generated, single, stand alone *zip* file The *purpose of a package* is to be a simple, and easy to access, code sharing medium, which will allow: on the one hand, to separate the code complex dependencies created by the developer from the user experience with the final product and, on the other hand, reduce developer's and user's unnecessary frustration related to a remote deployment process. -In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. The latest version of SPF is **`20220925`**. +In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. The latest version of SPF is **`20220930`**. **To get started with SAS Packages** try this [**`Getting Started with SAS Packages`**](https://github.com/yabwon/SAS_PACKAGES/blob/main/SPF/Documentation/Getting_Started_with_SAS_Packages.pdf "Getting Started with SAS Packages") presentation (see the `./SPF/Documentation` directory). @@ -39,7 +39,7 @@ After assigning the directory do not change them when using the SPF since it may ## This is short help information for the `installPackage` macro -------------------------------------------------------------------------------------------- - Macro to install SAS packages, version `20220925` + Macro to install SAS packages, version `20220930` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -71,11 +71,17 @@ After assigning the directory do not change them when using the SPF since it may `https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/` - `mirror=` Indicates which web location for packages installation is used. + Value `0` indicates: + `https://raw.githubusercontent.com/SASPAC/` Value `1` indicates: `https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main` Value `2` indicates: `https://pages.mini.pw.edu.pl/~jablonskib/SASpublic/SAS_PACKAGES` - Default value is `1`. + Default value is `0`. + + - `version=` Indicates which historical version of a package to install. + Historical version are available only if `mirror=0` is set. + Default value is null which means "install the latest". - `replace=` With default value of `1` it causes existing package file to be replaced by new downloaded file. @@ -115,7 +121,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `helpPackage` macro ------------------------------------------------------------------------------- - Macro to get help about SAS packages, version `20220925` + Macro to get help about SAS packages, version `20220930` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -185,7 +191,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `loadPackage` macro ------------------------------------------------------------------------------- - Macro to *load* SAS packages, version `20220925` + Macro to *load* SAS packages, version `20220930` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -258,7 +264,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `loadPackageS` macro ------------------------------------------------------------------------------- - Macro wrapper for the loadPackage macro, version `20220925` + Macro wrapper for the loadPackage macro, version `20220930` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -307,7 +313,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `unloadPackage` macro ------------------------------------------------------------------------------- - Macro to unload SAS packages, version `20220925` + Macro to unload SAS packages, version `20220930` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -372,7 +378,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `listPackages` macro ----------------------------------------------------------------------------------------- - Macro to list available SAS packages, version `20220925` + Macro to list available SAS packages, version `20220930` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -413,7 +419,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `verifyPackage` macro ------------------------------------------------------------------------------- - Macro to verify SAS package with it hash digest, version `20220925` + Macro to verify SAS package with it hash digest, version `20220930` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -467,7 +473,7 @@ filename packages "C:/SAS_PACKAGES"; %* set-up a directory for packages; ## This is short help information for the `previewPackage` macro ------------------------------------------------------------------------------- - Macro to get previwe of a SAS packages, version `20220925` + Macro to get previwe of a SAS packages, version `20220930` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -534,7 +540,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `generatePackage` macro ------------------------------------------------------------------------------- - Macro to generate SAS packages, version `20220925` + Macro to generate SAS packages, version `20220930` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -715,7 +721,7 @@ All files have to have `.sas` extension. Other files are ignored. ## This is short help information for the `extendPackagesFileref` macro ----------------------------------------------------------------------------------------- - Macro to list directories pointed by 'packages' fileref, version `20220925` + Macro to list directories pointed by 'packages' fileref, version `20220930` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating diff --git a/SPF/SPFinit.sas b/SPF/SPFinit.sas index e146e11..74ababc 100644 --- a/SPF/SPFinit.sas +++ b/SPF/SPFinit.sas @@ -42,7 +42,7 @@ - to unload, or - to generate SAS packages. - Version 20220925. + Version 20220930. See examples below. A SAS package is a zip file containing a group of files @@ -53,6 +53,7 @@ /*** HELP END ***/ +/*+loadPackage+*/ /*** HELP START ***/ %macro loadPackage( @@ -81,7 +82,7 @@ */ )/secure /*** HELP END ***/ -des = 'Macro to load SAS package, version 20220925. Run %loadPackage() for help info.' +des = 'Macro to load SAS package, version 20220930. Run %loadPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -96,7 +97,7 @@ des = 'Macro to load SAS package, version 20220925. Run %loadPackage() for help %put ### This is short help information for the `loadPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to *load* SAS packages, version `20220925` #; + %put # Macro to *load* SAS packages, version `20220930` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -250,6 +251,7 @@ des = 'Macro to load SAS package, version 20220925. Run %loadPackage() for help %ENDofloadPackage: %mend loadPackage; +/*+unloadPackage+*/ /*** HELP START ***/ %macro unloadPackage( @@ -271,7 +273,7 @@ des = 'Macro to load SAS package, version 20220925. Run %loadPackage() for help */ )/secure /*** HELP END ***/ -des = 'Macro to unload SAS package, version 20220925. Run %unloadPackage() for help info.' +des = 'Macro to unload SAS package, version 20220930. Run %unloadPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -286,7 +288,7 @@ des = 'Macro to unload SAS package, version 20220925. Run %unloadPackage() for h %put ### This is short help information for the `unloadPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to unload SAS packages, version `20220925` #; + %put # Macro to unload SAS packages, version `20220930` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -405,6 +407,7 @@ des = 'Macro to unload SAS package, version 20220925. Run %unloadPackage() for h %ENDofunloadPackage: %mend unloadPackage; +/*+helpPackage+*/ /*** HELP START ***/ %macro helpPackage( @@ -430,7 +433,7 @@ des = 'Macro to unload SAS package, version 20220925. Run %unloadPackage() for h */ )/secure /*** HELP END ***/ -des = 'Macro to get help about SAS package, version 20220925. Run %helpPackage() for help info.' +des = 'Macro to get help about SAS package, version 20220930. Run %helpPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -445,7 +448,7 @@ des = 'Macro to get help about SAS package, version 20220925. Run %helpPackage() %put ### This is short help information for the `helpPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to get help about SAS packages, version `20220925` #; + %put # Macro to get help about SAS packages, version `20220930` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -575,18 +578,21 @@ TODO: - add MD5(&packageName.) value hash instead "package" word in filenames [DONE] */ -/* Macros to install SAS packages, version 20220925 */ +/* Macros to install SAS packages, version 20220930 */ /* A SAS package is a zip file containing a group of files with SAS code (macros, functions, data steps generating data, etc.) wrapped up together and %INCLUDEed by a single load.sas file (also embedded inside the zip). */ +/*+installPackage+*/ /*** HELP START ***/ + %macro installPackage( packagesNames /* space separated list of packages names, without the zip extension */ , sourcePath = /* location of the package, e.g. "www.some.page/", mind the "/" at the end */ -, mirror = 1 /* indicates which location for package source should be used */ +, mirror = 0 /* indicates which location for package source should be used */ +, version = /* indicates which version of a package to install */ , replace = 1 /* 1 = replace if the package already exist, 0 = otherwise */ , URLuser = /* user name for the password protected URLs */ , URLpass = /* password for the password protected URLs */ @@ -595,7 +601,7 @@ TODO: /secure minoperator /*** HELP END ***/ -des = 'Macro to install SAS package, version 20220925. Run %%installPackage() for help info.' +des = 'Macro to install SAS package, version 20220930. Run %%installPackage() for help info.' ; %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then %do; @@ -610,7 +616,7 @@ des = 'Macro to install SAS package, version 20220925. Run %%installPackage() fo %put ### This is short help information for the `installPackage` macro #; %put #--------------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to install SAS packages, version `20220925` #; + %put # Macro to install SAS packages, version `20220930` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -643,11 +649,17 @@ des = 'Macro to install SAS package, version 20220925. Run %%installPackage() fo %put # `https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/` #; %put # #; %put # - `mirror=` Indicates which web location for packages installation is used. #; + %put # Value `0` indicates: #; + %put # `https://raw.githubusercontent.com/SASPAC/` #; %put # Value `1` indicates: #; %put # `https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main` #; %put # Value `2` indicates: #; %put # `https://pages.mini.pw.edu.pl/~jablonskib/SASpublic/SAS_PACKAGES` #; - %put # Default value is `1`. #; + %put # Default value is `0`. #; + %put # #; + %put # - `version=` Indicates which historical version of a package to install. #; + %put # Historical version are available only if `mirror=0` is set. #; + %put # Default value is null which means "install the latest". #; %put # #; %put # - `replace=` With default value of `1` it causes existing package file #; %put # to be replaced by new downloaded file. #; @@ -720,6 +732,13 @@ des = 'Macro to install SAS package, version 20220925. Run %%installPackage() fo %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.sas; %let sourcePath = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/packages/; + %if 0 = %superq(mirror) %then + %do; + %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.sas; + %let sourcePath = https://raw.githubusercontent.com/SASPAC/; + %goto mirrorEnd; + %end; + %if 1 = %superq(mirror) %then %do; %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.sas; @@ -739,8 +758,8 @@ des = 'Macro to install SAS package, version 20220925. Run %%installPackage() fo %local i; %do i = 1 %to %sysfunc(countw(&packagesNames., , S)); - /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - %local packageName; + /*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*/ + %local packageName packageSubDir; %let packageName = %scan(&packagesNames., &i., , S); %put ; @@ -765,7 +784,15 @@ des = 'Macro to install SAS package, version 20220925. Run %%installPackage() fo %end; %else %do; - filename &in URL "&sourcePath.%lowcase(&packageName.).zip" + %if 0 = %superq(mirror) %then + %do; + %let packageSubDir = %lowcase(&packageName.)/main/; + %if %superq(version) ne %then + %do; + %let packageSubDir = %lowcase(&packageName.)/main/hist/&version./; + %end; + %end; + filename &in URL "&sourcePath.&packageSubDir.%lowcase(&packageName.).zip" %if (%superq(URLuser) ne ) %then %do; user = "&URLuser." @@ -836,7 +863,7 @@ des = 'Macro to install SAS package, version 20220925. Run %%installPackage() fo filename &in clear; filename &out clear; %put *** %lowcase(&packageName.) end *******************************************; - /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ + /*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*/ %end; options ls = &ls_tmp. ps = &ps_tmp. @@ -950,7 +977,7 @@ des = 'Macro to install SAS package, version 20220925. Run %%installPackage() fo /* Macro to list SAS packages in packages folder. - Version 20220925 + Version 20220930 A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -968,9 +995,10 @@ des = 'Macro to install SAS package, version 20220925. Run %%installPackage() fo */ /*** HELP END ***/ +/*+listPackages+*/ %macro listPackages()/secure PARMBUFF -des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20220925.' +des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20220930.' ; %if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then %do; @@ -985,7 +1013,7 @@ des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HE %put ### This is short help information for the `listPackages` macro #; %put #-----------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to list available SAS packages, version `20220925` #; + %put # Macro to list available SAS packages, version `20220930` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -1135,7 +1163,7 @@ options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.; /* Macro to generate SAS packages. - Version 20220925 + Version 20220930 A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -1147,8 +1175,9 @@ options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.; /*** HELP END ***/ - +/*+generatePackage+*/ /*** HELP START ***/ + %macro generatePackage( filesLocation /* location of package files e.g. %sysfunc(pathname(work))/%lowcase(&packageName.) */ @@ -1171,7 +1200,7 @@ options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.; default value 1 means "delete tests work" */ )/secure minoperator /*** HELP END ***/ -des = 'Macro to generate SAS packages, version 20220925. Run %generatePackage() for help info.' +des = 'Macro to generate SAS packages, version 20220930. Run %generatePackage() for help info.' ; %if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then %do; @@ -1186,7 +1215,7 @@ des = 'Macro to generate SAS packages, version 20220925. Run %generatePackage() %put ### This is short help information for the `generatePackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to generate SAS packages, version `20220925` #; + %put # Macro to generate SAS packages, version `20220930` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -2740,7 +2769,7 @@ data _null_; put ' end ; '; %end; - put 'put "***"; put "* SAS package generated by generatePackage, version 20220925 *"; put "***";'; + put 'put "***"; put "* SAS package generated by generatePackage, version 20220930 *"; put "***";'; put 'run; ' /; @@ -2979,7 +3008,7 @@ filename &zipReferrence. clear; options ¬esSourceOptions.; filename &zipReferrence. clear; %end; -/*+++++++++++++++++++++++*/ +/*-+++++++++++++++++++++++-*/ /* verify if there were errors while package content creation */ %if %bquote(&createPackageContentStatus.) ne 0 %then @@ -3585,10 +3614,11 @@ TODO: (in Polish) /*** HELP END ***/ +/*+loadPackageS+*/ /*** HELP START ***/ %macro loadPackageS( - packagesNames /* A comma separated list of packages name, + packagesNames /* A comma separated list of packages names, e.g. myPackage, myPackage1, myPackage2, myPackage3 required and not null. Package version, in brackets behind a package name, @@ -3597,7 +3627,7 @@ TODO: (in Polish) */ )/secure /*** HELP END ***/ -des = 'Macro to load multiple SAS packages at one run, version 20220925. Run %loadPackages() for help info.' +des = 'Macro to load multiple SAS packages at one run, version 20220930. Run %loadPackages() for help info.' parmbuff ; %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then @@ -3613,7 +3643,7 @@ parmbuff %put ### This is short help information for the `loadPackageS` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro wrapper for the loadPackage macro, version `20220925` #; + %put # Macro wrapper for the loadPackage macro, version `20220930` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -3685,6 +3715,7 @@ parmbuff %mend loadPackageS; +/*+verifyPackage+*/ /*** HELP START ***/ %macro verifyPackage( @@ -3699,7 +3730,7 @@ parmbuff hashing_file() function, SAS 9.4M6 */ )/secure /*** HELP END ***/ -des = 'Macro to verify SAS package with the hash digest, version 20220925. Run %verifyPackage() for help info.' +des = 'Macro to verify SAS package with the hash digest, version 20220930. Run %verifyPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -3714,7 +3745,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20220925. Run % %put ### This is short help information for the `verifyPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to verify SAS package with it hash digest, version `20220925` #; + %put # Macro to verify SAS package with it hash digest, version `20220930` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -3846,7 +3877,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20220925. Run % %end; %else %put WARNING: Verification impossible! Minimum SAS version required for the process is 9.4M6. ; - /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ + /*-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*/ %end; %else %put ERROR:[&sysmacroname] File "&path./&packageName..zip" does not exist!; filename &_PackageFileref_. clear; @@ -3860,6 +3891,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20220925. Run % %mend verifyPackage; /**/ +/*+previewPackage+*/ /*** HELP START ***/ %macro previewPackage( @@ -3884,7 +3916,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20220925. Run % */ )/secure /*** HELP END ***/ -des = 'Macro to preview content of a SAS package, version 20220925. Run %previewPackage() for help info.' +des = 'Macro to preview content of a SAS package, version 20220930. Run %previewPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -3899,7 +3931,7 @@ des = 'Macro to preview content of a SAS package, version 20220925. Run %preview %put ### This is short help information for the `previewPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to get previwe of a SAS packages, version `20220925` #; + %put # Macro to get previwe of a SAS packages, version `20220930` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -4018,7 +4050,7 @@ des = 'Macro to preview content of a SAS package, version 20220925. Run %preview %ENDofpreviewPackage: %mend previewPackage; - +/*+extendPackagesFileref+*/ /*** HELP START ***/ %macro extendPackagesFileref( @@ -4026,7 +4058,7 @@ des = 'Macro to preview content of a SAS package, version 20220925. Run %preview when empty the "packages" value is used */ )/secure /*** HELP END ***/ -des = 'Macro to list directories pointed by "packages" fileref, version 20220925. Run %extendPackagesFileref(HELP) for help info.' +des = 'Macro to list directories pointed by "packages" fileref, version 20220930. Run %extendPackagesFileref(HELP) for help info.' ; %if %QUPCASE(&packages.) = HELP %then @@ -4042,7 +4074,7 @@ des = 'Macro to list directories pointed by "packages" fileref, version 20220925 %put ### This is short help information for the `extendPackagesFileref` macro #; %put #-----------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to list directories pointed by 'packages' fileref, version `20220925` #; + %put # Macro to list directories pointed by 'packages' fileref, version `20220930` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; diff --git a/packages/README.md b/packages/README.md index 91a68d5..2a21f21 100644 --- a/packages/README.md +++ b/packages/README.md @@ -2,7 +2,11 @@ To get started with SAS Packages try this [**`Getting Started with SAS Packages`**](https://github.com/yabwon/SAS_PACKAGES/blob/main/SPF/Documentation/Getting_Started_with_SAS_Packages.pdf "Getting Started with SAS Packages") presentation (see the `./SPF/Documentation` directory). ## Available packages: -Currently the following packages are available: +For "backward compatibility"/historical point of view the following packages are available under the `./packages` directory. + +Since *September 2022* the default location for packages is **SASPAC - the SAS Packages Archive** located under: [`https://github.com/SASPAC`](https://github.com/SASPAC) where each package is stored as a separate repository with historical versions too. + +Packages: --- @@ -125,7 +129,7 @@ SHA256 digest for GSM: 2AEBC150FBA99A4AAB0265A21C57E89200BFD96B633B898F32743D1C8 --- -- **dynMacroArray**\[0.2\], set of macros (wrappers for a hash table) emulating dynamic array in the data step (macro predecessor of DFA) +- **dynMacroArray**\[0.2\], set of macros (wrappers for a hash table) emulating dynamic array in the data step (macro predecessor of DFA). Development of this package is currently on hold. SHA256 digest for dynMacroArray: D7E0B8F85C05EBF8622204E0D2F3E990D48D0A9B3911051C3AD44DC98954DDCF