From d49ba1afddc37eb1b54e1e459a9c0e4a210def41 Mon Sep 17 00:00:00 2001 From: Lauren Schaefer Date: Tue, 3 Apr 2018 14:28:07 -0400 Subject: [PATCH 1/4] Add ability to download from Sugar Store - Fixes #42 Initial mess that successfully gets download from store Needs lots of cleaning Cleaned up the code Simplify the authentication to dev builds community by using curl -L Update doc Update naming of DEV_COMMUNITY to be SUGARCRM --- .travis.yml | 6 +- README.md | 32 ++--- images/travisenvvars.png | Bin 36232 -> 43505 bytes scripts/GetCopyOfSugar.sh | 175 ++++++++++++++++++-------- scripts/SetupEnvAndRunPHPUnitTests.sh | 6 +- 5 files changed, 145 insertions(+), 74 deletions(-) diff --git a/.travis.yml b/.travis.yml index d3199fb7..8a971cea 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,7 +31,7 @@ jobs: - cd ../scripts - sudo service mysql stop script: - - ./SetupEnvAndRunPHPUnitTests.sh $DEV_COMMUNITY_USERNAME $DEV_COMMUNITY_PASSWORD $SUGAR_VERSION $SUGAR_EDITION $GITHUB_USERNAME $GITHUB_PASSWORD workspace/sugardocker + - ./SetupEnvAndRunPHPUnitTests.sh $SUGARCRM_USERNAME $SUGARCRM_PASSWORD $SUGAR_VERSION $SUGAR_EDITION $GITHUB_USERNAME $GITHUB_PASSWORD workspace/sugardocker - stage: Run PHPUnit sudo: required language: php @@ -47,7 +47,7 @@ jobs: - cd ../scripts - sudo service mysql stop script: - - ./SetupEnvAndRunPHPUnitTests.sh $DEV_COMMUNITY_USERNAME $DEV_COMMUNITY_PASSWORD $SUGAR_VERSION $SUGAR_EDITION $GITHUB_USERNAME $GITHUB_PASSWORD workspace/sugardocker + - ./SetupEnvAndRunPHPUnitTests.sh $SUGARCRM_USERNAME $SUGARCRM_PASSWORD $SUGAR_VERSION $SUGAR_EDITION $GITHUB_USERNAME $GITHUB_PASSWORD workspace/sugardocker - stage: Run PHPUnit sudo: required language: php @@ -63,7 +63,7 @@ jobs: - cd ../scripts - sudo service mysql stop script: - - ./SetupEnvAndRunPHPUnitTests.sh $DEV_COMMUNITY_USERNAME $DEV_COMMUNITY_PASSWORD $SUGAR_VERSION $SUGAR_EDITION $GITHUB_USERNAME $GITHUB_PASSWORD workspace/sugardocker + - ./SetupEnvAndRunPHPUnitTests.sh $SUGARCRM_USERNAME $SUGARCRM_PASSWORD $SUGAR_VERSION $SUGAR_EDITION $GITHUB_USERNAME $GITHUB_PASSWORD workspace/sugardocker - stage: Build & Post on GitHub language: php php: '7.1' diff --git a/README.md b/README.md index b95591ee..4bd77338 100755 --- a/README.md +++ b/README.md @@ -175,9 +175,10 @@ You can then click Details to open the build results in Travis CI. ### About the build The build has four Environment Variables that have been configured in the project settings in Travis CI: -- DEV_COMMUNITY_USERNAME: The username for an account that has access to the -[SugarCRM Developer Builds Space](https://community.sugarcrm.com/community/developer/developer-builds) -- DEV_COMMUNITY_PASSWORD: The password associated with the above account +- SUGARCRM_USERNAME: The username for an account that has access to the +[SugarCRM Developer Builds Space](https://community.sugarcrm.com/community/developer/developer-builds) and the [Sugar +Store](https://store.sugarcrm.com/download) +- SUGARCRM_PASSWORD: The password associated with the above account - GITHUB_USERNAME: The username for a GitHub account that has access to https://github.com/sugarcrm/unit-tests - GITHUB_PASSWORD: The password associated with the above account @@ -265,13 +266,14 @@ Credentials Binding Plugin.) 1. ID: GITHUB_SUGARCRM_UNIT_TESTS 1. Description: GitHub account that has access to https://github.com/sugarcrm/unit-tests 1. Create new global credentials for the account that has access to the - [SugarCRM Developer Builds Space](https://community.sugarcrm.com/community/developer/developer-builds). + [SugarCRM Developer Builds Space](https://community.sugarcrm.com/community/developer/developer-builds) and the [Sugar + Store](https://store.sugarcrm.com/download). 1. Kind: **Username with password** 1. Scope: **Global** - 1. Username: your SugarCRM Developer Builds Space username - 1. Password: your SugarCRM Developer Builds Space password - 1. ID: SUGARCRM_DEVELOPER_BUILDS_SPACE - 1. Description: Account that has access to the SugarCRM Developer Builds Space + 1. Username: your SugarCRM username + 1. Password: your SugarCRM password + 1. ID: SUGARCRM_ACCOUNT + 1. Description: SugarCRM Account 1. Create a new global secret for the path to where Sugar Docker will be stored on your host machine (not the path on Jenkins). 1. Kind: **Secret text** @@ -305,10 +307,10 @@ text(s) or file(s)** option. 1. Credentials: **Specific credentials** 1. Select the GITHUB_SUGARCRM_UNIT_TESTS credentials. 1. In the **Bindings** section, select **Add** > **Username and password (separated)**. Then input the following: - 1. Username Variable: `DEV_COMMUNITY_USERNAME` - 1. Password Variable: `DEV_COMMUNITY_PASSWORD` + 1. Username Variable: `SUGARCRM_USERNAME` + 1. Password Variable: `SUGARCRM_PASSWORD` 1. Credentials: **Specific credentials** - 1. Select the SUGARCRM_DEVELOPER_BUILDS_SPACE credentials. + 1. Select the SUGARCRM_ACCOUNT credentials. 1. In the **Bindings** section, select **Add** > **Secret text**. Then input the following: 1. Variable: `PATH_TO_SUGAR_DOCKER_ON_HOST` 1. Credentials: **Specific credentials** @@ -329,16 +331,16 @@ text(s) or file(s)** option. SUGAR_DOCKER_DIRECTORY="workspace/sugardocker" # This variable is completely optional. If you want to store the Sugar source zips on your local machine instead - # of downloading them from the SugarCRM Developer Builds space, input the path to where the Sugar source zips are - # stored. For example: /var/sugardocker/data/app/sugar_source_zips. Note that your Sugar source zips MUST follow - # this naming convention: Sugar$sugarEdition-$sugarVersion.zip (for example: SugarEnt-7.11.zip). + # of downloading them from the SugarCRM Developer Builds space or Sugar Store, input the path to where the Sugar + # source zips are stored. For example: /var/sugardocker/data/app/sugar_source_zips. Note that your Sugar source zips + # MUST follow this naming convention: Sugar$sugarEdition-$sugarVersion.zip (for example: SugarEnt-7.11.zip). # SUGAR_SOURCE_ZIPS_DIRECTORY="" cd scripts bash -ex RunPackUnitTestsAndBuildProfMPackage.sh $SUGAR_WORKSPACE_PATH - bash SetupEnvAndRunPHPUnitTests.sh $DEV_COMMUNITY_USERNAME $DEV_COMMUNITY_PASSWORD $SUGAR_VERSION $SUGAR_EDITION $GITHUB_USERNAME $GITHUB_PASSWORD $SUGAR_DOCKER_DIRECTORY $SUGAR_SOURCE_ZIPS_DIRECTORY + bash SetupEnvAndRunPHPUnitTests.sh $SUGARCRM_USERNAME $SUGARCRM_PASSWORD $SUGAR_VERSION $SUGAR_EDITION $GITHUB_USERNAME $GITHUB_PASSWORD $SUGAR_DOCKER_DIRECTORY $SUGAR_SOURCE_ZIPS_DIRECTORY ``` Be sure to update the variables appropriately. 1. In the **Post-build Actions** section, click **Add post-build action** and select **Archive the artifacts**. diff --git a/images/travisenvvars.png b/images/travisenvvars.png index af6eb00dd625782de42000b474b8a7a2411e2633..f886d556475ff9683032d00c9370f2afae8d970e 100644 GIT binary patch literal 43505 zcmeGDWn7%gvIh!7aDoPcTOfhKH4xn0AwhyefZ#T`3iQ-Ohj2f)C<$|EB}OFGST zD`8+ztIb43m83;QDU|GOOw25eVPK?!W8;uMtIp#EjJE8D;{|zx$9N}DC|Uw2TNaR| zy_H1dkdZk*cViPMe--mIJiX8%dfAfXJ2pPDlw!X1?Y29CiN{xhD|ds|Et6!@Uw za8MnlbF^i*b)vk*^CJW@y~VAKO$-BoUx$wfN{u)}=`O28=#+y|a+T7i;ZZP;9~lHXmX?G;5#6Ptq@TpHmIl6TCs z+%YE+OB770{ieyu6D14`gfMceee(+m#L8M9SEy9i{%=+ecr0ELg)1wsypR z3Q}ZYP7U-K-&acTwLUr-uSj5~Gss9_`-FHuA&mIQt`XJ4o_Gfey$a}{XF(M3mPYmMI0(#(!{~?v7;%G2OSU!&x8Y z36)F|78gZa)GTvI2@Om`NANaKMhr#SLfOB7?ep7Tgww$X!pkDkO4$X9-x-oZ^0J4= z6ut`r-zSCZ`sju-NvLNWj$7@$-qYF>z9M)a4)~$mm7q_;Dkq0VjS>@1+YUA`XDvwx zP2f#17(!yelkFnXKd$ha)38K!dRt4-gt_?Rxbwy+uzd3qi2{P@4~JfaO^tdvZCGo} z6P6Q(6KZRMTWrNni;a>qfxAz97`nIotA z9r_t`zE@8BE(D~Oz)}r54BqZG*%05L+TeW?oFi{f;s4VmhfjrjAF$767IhU|EW}Ce z{xd$RXRBn3#~%M);GWc9WIVrKc>|CLE&(GBxDMb9ND}@EYd}*CpsG^HQ^}Lx$s4lJ z{85}%+;qe?uRYH;zganJEV+$r|6reH&(Kg~A8SvujkwjjU3d|9(Q&bV(Q^@gp}wUD zSi`+~+x+$u>OJZ->h9Zs0>Cef>6n2$>zo-SW|hFV6(NWray_^`ls!}-o*_mus4|=~ z$};q^bg>Hb(%%6|0^!oK*|B30<0lgWqpIn<0+GBngUvgxT)XmsQFSNP9XfovI>4&( zOR_?~*4&gwWO4)n2P=<*Jp; z6mgc8W}Xx=DXnIE>3V+l&0Eil&Z$c(-**_p+X z*=(*%n+)=jHqAC2h`&!I>?Fl(M*mv$yPmOWTYrPtbt|f3>@L9c_w;deqq(`6PxJK? zca12PhNhkD^QIFvA*_xp+sSH)7zxqCOT(2zNkfRkW;;GR#6ye2ddy=wSatf3Khh9Z z87vtm7|a>SzS3ztXjzvZReM+%TlUocs&2HBuehnuHC;A%?(OXku&7$yNn@Pm{Owd_ zRd=k;>&~00Q?(q_QtH|KtosNXKuP7NJXC+=ZFgp?v1>c99+RDFl()&+Czv{vqLNCK zs>{Hk@moiu%J#SBV&b;PZ_N!6=U`{ts1B03><2)_vP{vczV(CXHkB18L;*undQJdnVz z82SDKE-}%YuY?Z_Lu{6g8j7Djdbqk6-31~?2K@{Qj1Gw2_n?t%SY-YTq6o2$g_!B1DOXhk`q#u z7WSGKfYBKB4)>UiczX(C%8#FFm>lUCc}hNzrjw<6{VZ!&+}8U&_FE%yoS6k17x_Is ziTcr3R%$e?nGlL`6=lgh%89$H5cHnpZeL9%%~(zHs_e?hGO%91-h8rAO4Wy5*HXn3 z#iFsIxuQmOixS;7H{0;XBvFgZ8WfAB+5O@{J+749Wc9YRdI87hGGYc!u(eAYtDBK& ztDBeZ%NX^lygULMLgx>kVTEMOC+`=ZThUd#Lq_*n5Be=!UB*fP9sPsK5L4?z_IBj9 zpn{eB(t^67dL@Y1i5RrFd|bMCD7!7|ARFiefBbz>dR4Rj^0{=osT4d9CY_UCVq9UQ z#bh|0%Wg7VOk;lA|JIp~pHA!M*YR?tvmv?Z>hQDmV=`s|Ie_Qvp5k<^MYJ_=;n!8s zz^{sF&FN9|EOR$6!>1{wqOV$?A8R7?XbLfl+Q#%($Hod~G$!D=f|DgMn7KVRgJz>6 zOsaN78LQ*6veydk_6E~8L9Ol#YZ|w9z2`ePZZtQwDq61>Gip<6D{i)&q$MpSA<~eT z1SB12&vcHqe5R`(tf`eh2#UJ2h7+|J|VX*K= zZwA>Bhi~rK;a_k@Z>HEykc1rZVX$3c;3+rBzD-GL&!Br_byF?DSXwb&gOUK_3+8H} zQxVnF#;U5PQ3BYe@a?lcg@ye$g@t7`QWcmmdk-v&`HIO)1~3>q8f-_e%9gF+A?6U6 zGAX1MvX%#Q=wUX^?6U??Ltc)@$i|Av;G2!1F_VjxE%bZ~1HPl~von)3JClvQDKjfKH#aj28#5alBeVshgR3>rz=hG;f$A?J|3gR2 z*ulu&%ob>7V@>ggu7RPABaokx^3Op3`}=F2#x7?6HO)Q2I+X|CgzI&CeVup;vFByy4$dz@q%`r%$4k{*YYQ zV!?<1Ed6%_A?l1Dogx2F(Jn`m@xw3=-v{OI^#1fj@OS*jkradwdgPdYjK_GJ>Uz*R zR#6?QGPizm%ScfDzxn(%@^5$v@Q;mrb-j22``-EeIGXgzJCip)w6Ou}^t*Z~tu7}B z`~K>>`#f)VS0VZf$9IDH**2{;+3Aqxqmb&|bDI3cbhpNAUK^ReO{Be8Tt8yJe?;?k zDITMBZ=zOsh-)`xznQn7m!CUno)K61zqEG_ zDzx=ME6OH17Z02a{UI8i6uH1`Taiy{~s#?m4H4TC5sMf$j`2y zn>!_l!)54ndR~q)Uu{bp1{NnhTi50qCY%NtQms9nf~$8ZUn@GhP_cUJX*-MZJgz)W zCgYK%t7+T%aD6k_K7YM!VY=$B_n?uR0SLUq7rawaJ7K6A^WdkaLH6+N!IQW6eBP!_ z`-Xamca(Ty4dL%A5hcV7|B#h22Mq3+bgo@#j=w|N-qqt;{;qUl`mqm66`0T_d|%a7 zDVtCJSq&GH|5n@0cESNASNZq8^J<)yT- z0Dh!jl7AnN;QY^cE@rZy{J@vcf}d>u%BEvh)1*}xW;Un zhgo)=2NbS3T3dP~lQR0{9XW5c%TY=+1Zw%})%g?tMqZz#S*wO)gZ;}LE1>l%GjI~5 zeQ|qbqh*;C(R>pCyzh$Ks*g_wwO(Z(*GX$wQFK4v9;^h;e5LX{oEXFzl&5??{puKd zsvwy=oi4&tIJL%`T zqp-T{R3x?%O+8H55QwY@v=p~Q;SLem_jBe6S67@3ziJ^h!X=N~c+A|#ii-0E)I)9RBsbkBznjEPPbi>V z5zJ4KG{>aGDxqwDogKM-r5bVfIH+^`Ef-}3d0G>)U&v;X%fBa;$uQ%+(-VMX9la8t1nIfTCu!5Ra+ZSi zS*Sg?l%xOd9ioLZnDKDYPU@b!>`F-3yPhvooxUH(VD-We?Saf&YN~i!Uv;#N zoaS=?spk^ZXAl9aKKuAE`)Y12Pv=GEb|Z!Wcty&)@AQqMeV*zoU4-71e>Z-6)>L;4 zHa$<=2HDg|zjxP2aUE?j>obl=DVtxu&HIXZb{&M7>SfY+Ixp>7PA2=tR{N_Y%lBR$ zxZK~7PIJ`xkR0BV0X#})f#(H$KpN;BIdR_=8)E|y66pMksoMnDDN0r`$`8{XrH&7^bE%@~epn}i0QsDb0`b5j9K=MlK z1S+@3$SUYSZ*uqxky7Ux=eKL~bTo|&T;ctTugx)4uPn+6U%D72anU>OAx_J*yEIQa zDzv)goIX?{{K3P*Wgc7O)lNOC|F8^e*U_869Q;FAlaWoESaYm__IlhK#k)SoS#zDQ zRtEtQ4sy$Z`lGSxL$@Nd9qKf9<_LofoP{^_-+!8iC7TY3a(BQy*i5rwZ8=QaM<}tB z`x&fGs}Ig9Ha?engh6hK;$*rf5O1s!EQXHm@qACQM%wDvA4)zT5HnY3wDwR4K3O+R zy)laz@K}q;PwO8D4<&OMwl^p>=Z06q%>M$nUqv?xshS_wjo|mCQ_ls2}Q8!Gb$k%2YDdcxunrvK(KD% zsVY^>QzNf3r2dx-G1@v$MJ3xiPk=#fK|NJlQ87cgy>OvVu6V;xp3a{n$@>r@u$qMMsS!N7rgyk27LyCu3tA$Ym1BL-wgXmjBBJ4}BQJM-U%6!lb4L(93k7!WF^agx_h^ zq{AocvcZIhlgZXyU&iM(m+G&P319a8^tY$&_MM(()QvIQOmnL^4P5K|iNd+ez(^ew z_DquW4V4oay}$b)C#HO8)7_|aXa=iq#ok@buGzI=Hm(}$y*pPq3bjn;XmOiDt<$}5 zO^RQ*%%O^@R@-PmriMY3THNW84&!F#(u&?OeTObt1qscQ{|`E^Dp#7yu_<)vO*fM4 zv~t2d$yr@?esxtB22MwZ;oC2Res{c83sGQnUd@N|eshNzqau0!!4K5frT=}v(1quT z1UAW8v>|$9|vLn4sA4rG{#wiJD>#rg4b3u4{+ z0kUMiZ#L*xR!(8}oMJw&U|CLtrmTQPZji?B7>xWF|75<)WqMNfnK1NX)aO3^|9PH= zMM2YglJX@O@-`r z512Gwr?wGdzA;%M`-Ry5#U?lG&f_{!9n8wGZa^LtO78J#*Yw48$C8nDz~}LwBsgg- z+_6iB9mjUI-+yshh)<)Q9__I#;_XSeAl(2DL&Lx;bO*m}O)s}qoqgsX#hq_$PKa?| z*^6y6FF;R45TvJquA!`OMyTA%q*8YWn8Y&R$mKfetGME=9kB64=`t+}=h4g)Ik_k5 zIiJo~ke);gl~34_CB)WsE#3|PfWhGJ+E~fAR`tuWo^Vh~29#pNitX-fOLk>2q=FXV zv2nRHz-AzlTdj|Rpt6%s26AG#Zd>#H*p)_K8dY`?`~{3dtmbMIBhwk;$=u0IY<@vI zO-~n!&Ux{zOKISJeP+GT95T)z@`UG>mXp+>`g*45`el~s=k#>(=nCa)Y2_1;)3f8{ zuBx&W=@-rZvs}Dlsn)7%yb@cK|8`F6vih~=*}W@yBY`$)dD4V3IK^;EWGo43nyNGDbNK65Nw9{fCY#R6MjJ%yD$nn~gR0 zazLiYJLTR{Q<=h8hVyrx@76JM(H`Bvx3)OO;TOh<18idd?I1<<sW#^f1D|1C0w){o)9zQyG?n2h=RmWCSb=l4*O z=^W^?|G+^SazVx(N^;uY!${}|do)mz&pBoq|HOfq5Q4bk+|~PkU|bLdN|Hvt>z_EF zc|`|s>&&D12gVUo=MQP#rQ@^DbJ{3)G@YgP~B*?2j^n@=C6%P07FRJC6@ z$Rx|$dS}SIa?L)3-28MgxPJG}>!o0w7^XEd*m9H01c&BBn8P@DF>Ca;m5)dVnho#p#mbS0VtAI24rKer9u z@yA2;m?Z^SF8;^H0DYNU+sk#?Bz;-)#K5F1G?w+cF4EhM5IZys#L?}%L*d>@Fq$wG ze4M}9ic##%-RGI<61*H@pH%d^h~Y3E01F4oYNUc`I9SFrY@hB&L1_v+`#HjW>@8$U zAtZL)*!%nW>1it&5;>rQ&C5|iLCVP$rtvNRi{|wJ;)P|hvxTb%a+V*7d-`r^yTmrl ztey{(=?eII9(G>Vy!>VCm#%5SF1!*tt*1OZmJSXq+fKtDXLBG=qY$~(yI!t|Q?J{m z(#1H=aSWHjVw_ZxTNUzvL5ENL+cUw^uBRtWrwaKg_A*IUweuHM;`gMWr}O{Bk_Fy?pO6<>IpjvsG4td&j zXcFW%BP#GxRGfQ={Ub*(e4eauhxfh>=uzw8G99ucLj`yDnyEfxQ%Hd1^5SVgz4a$k z<6c%hIPR-?VRa`eeNKf@Uv25N+XT~->rNugF!XkiA3<6YVOxSXQ<(d#9WFnSl(Mv8 zC#fj)@?8sOABn?O#Jkk4alq6dv)6g(Bw$2>4QasPX5RF)VMU<~vOZ)DmEHYLGBab# z)r48JI9|Ud$(}3e-iz(d)M<5%`zkthg!N!}M^B{JRrb|hb|m${;ZfD7!XGK7q`99o zbcoH?EV`xcZP}Gy8+_smoYb;TbphX&$7#53$4z(@xsa|Jc`dEbIg(1aY*h#J9nO0WSSBlY_-hG1sunV^NH?bCjO@ zvU)PxA5T6GKa8yt{U*vH!&_%{IpvsC@W?er@``fZO}(v&34rv2cnh`c!PY?*ZaKlj z`dyZW^Myy07)yLmWj(({mpqB*QzpaK<6^_&?fmuH(SZU%9_Lnp&;5L|FwJqpTks;n z-q6k8g)&9=0{`5ZZqs&h{}cbqp<_W?n$ig%)R?o^k4#rq=Y{Xv&I=o-bDbvx*zY@f% zQ;-|9<>B9ycl}irepbH{p|^B;W$7#<$>)B2;O0l#r{I{iuRD32=OLlJ#C%BJc4#aK zL3kaK>a;-HToWNb%7KxT79VG-_{U3xVZAz*oYbLC!x;D}%almwx)p7Sc;A8Pb%rkB ziVfMoZ~JXBwWMtv`(>g}@a3FO<6#!`Ji8?1K#p@0>3L-2I!t$XTv421aw@-QStTD4TH}Gdzv^~aGWoc2+xqlayJ#&7xz>Zk zc70GFiYfy=AKsJg3mlbqO}tgtjs}7DM9F26Ei0u3`cm%NAdhVh+CUS5`+mi|X*Dgz z)y+2K+cjUzkyKzQYxeJ>sra_1?G!H)T}sfL?y`0{ewrq~fcXhx)FLP^VOB4}_8rS^fby#3X_ z*6M>A8L*we;H)ET@9A=M6*b0%R*OdqD8zCuad4CnZbTjHCaj5tY5V{cDr*yD$W$Pv zH?$avdS&wPaZnJlrr+mqNaQox*@c_j|E0m*L z_K{Ci&QfcVgyJ+m59LW%BJ(0B2btSEiUf9Et3n=!ZMlm_u;-kBcXXwn+13r#&jMDCB zV^nyAR_fSxAWRBAPYQ0^1`#_0UN&4iDd|^WotNw+7kO}f$(~dtBX|x9;y$SHjj|8| zj$AMbXdDfq{CjXue~9DjaPXgZz^*(++1%a4~3RWWp zUtB07$)EQmtFm$?c^Nyc)YXbg8_jhQg&Qg@5e!&HkC@>elWkfX&UGeBt&Mtm9jZnJ z9&^w+=P2SAo!cIl`KVgwO_E#IJ^LeFV?wPuqZnUbNg|<9710@N9VpW-CRZMp0iJwO;*Ww-h4SSc;dq8 zT4zv*?fByfNY`~#vEJq+7q8Lgf$6aZcfTzA7%KKG5}N zksdb8gSR31PN%*X%X$LD#Mbo&5s?sEhfWll_X{6KDyA}ybJBo@b0>+*UXRBP^{ESH z2ZDC2XFJPpMV5{i`sx))GfJ#)M{;y)2L;2D)0$iaCGJS1;fx2|$%H#*-lx{D=kIIM zc2R}pnLa_cegEKBJ5ge3P{a$GRr{#dO%-rbo@+ZJYvinH`7!!|cdTlemUOw*LMf!2 zMyBZ|+3zA{!fWa=O@8*!Q)MCZkKAc5M3W`b*E?S`%OzVknq{>ueRkq=hnzy5+m@(R zAX)O-79}++V>a75l1VN$<7(shIS~J!a0nh!e)px$Ek)Bv#vqJ^U`5XZRkQ19bV_(|Q5DjIOe&M)nuX6SZYqYBMG z!UHIE+rj0|&2qP$JGz!4+&jX1N}{~2z>bCmrU4G@Fa1OWqj8|2 z#qDde7x)pnW(x}&_^S9eL)MT46MBK%a-&8lXncfw(6i+Rw;WG65QETr3_uFCs|}a) zGILWnJSH7r*{v9kjDr2{pBV6PvOJxv$R;crsL4Ug4x{`H9)PaL(>6h_2W(7Nnqf3L zC6+NWBP9$$24g8ClHXdiK-BMJixpIYcbQdEePD^?4n)%TM4E^UK-87<2%#XcWJ43ZU(E={qO%0B$Ww(5$mEg-V0v?&p?1^aB#33KscM1P?-N$1HJo~ zIH$P}j~EKghpvc)dXT$FNWx&cn;Zd}CE=55Aj|b`Do@mp9}!%qItRq3t_KcaSTo8| z0H4yF*nA*c+@t&`!H_Z^HreUB30a-pWwlmflx$T(`?gdLR`fdg(RKaR+-5C6sM~Xv zSM4DAv3kpr5}NZb=W~qBhKI92sD*I`Bb{0=aNo@$1ONtH1eF5-3ZJsd^(iS9yq!+r zI)4cgH?JOw%(J#{whXK>tQ5(k@$y$eH}b~zvV^;ez-#T(DS1g*IA%>o9k%pp*yEeq{l_+c7qV16u+chL=^dxiW(mr;0cM2_em`EHRSlA zWNGtRLGS_Uc2*sT!=`?_Hg9c6|Ktk(bF^lMhA0RKD7{0+ z+fZq5-F~1QT)w?Al>U649P9k)kufUsx?M?sTjO21@n(*$2 z!?JW!P*5nLx5{47xKFmjkdPk>3LFSHAVnjxDW8wP6wL)D9U?nz*iCB?9eqLR_+d*} zk9AVobdp5uL_}tST=DrX9de&uY?-;f$>poMQSy2qRR8PBCegixA>qB)yLQVxVIQ`hMaIN@ML&y)hC$-Om4st$T z^Fe?iHQ*@+fWNyCBC}@qQlwrm6MygA?@oOL{sNFAIw6~x2*K)^5F*`JTFO~;L>O=S26NH_-sXuomb zGF1*7bDR6PeNEs;0B?h7($Ejy`nn;yR7;EwImWwuUMU6o*ya@QmuS2AG z?)VmwjYrY+n<{PGdI`joB-e0e2+BoWFyATD@WdK8X*`xqK2j!d@(235#=o%|a+x{A zKP}69iY}{6J@|au`77!s$cOXC&sb-e0jY)K3(_dk&k%oc$)^CuQ%~HtIfTYG`M1K) z^Fg*7Qe@>y#ck@!y6D~IFGFwC^PPBBK;5L<`1?UdEuLXKQzxmxA7%I)j#mN!-iy-D z&q2fki8oEfeSGw+<)wj>-Ql&hQ0KX5ykX(iYs4008p@eyN*es|Mc|S5q~55NYpiPe z%2M?-X@WJu8QrnG@HyhvvgMTUbmHOqH%-WA>QtR(T|bYo zn6>$!JrIRL*lEHRwVUpRbu02IpFH>r^0wbK`~6mfm~{T1qyvEhe4duDFx+TpnB zoDT)udmg54LX$SM>hnlHEgqBOiIC(m;3T%BFt*BxrcYcFOF~Ju9i<1NP_9^tT{!HA zBqyRK{m{G=#0Veq5L^P*L$Td&) zI;iA$qNda*!luReQS#xaPrj&GHp~Zanx^bipp- zTG7vto{+1H^vM-}f>XV{KTds~biolYW7) z`u3{R{NV4Cq927BRc)p>@B_N#uY)ow4TTi%ahQBh6}&cFE!FEB40)c^L90DYWUAj@ zL|kYL-ifv<%lSu@S|fbG2Z2%YHqdMf+oaCI%CnBl^pet8aT}+?k*S_)d7bFGoKBDo zWm*^c1GUMAn!xqR6L`ksOrUFf;)0cErWNsbfC;nE1jb!Vf4+gGN|FOOR}CBtM}a$_ z8~Idvcu*5x+M2?RBqu*KoeVu zcBpCc2fL|4r+tE?5d4p|OfqTv*1!r3C;w55QgqSL1H9P4-!ZM|Bq- z6C+veJt7Fk6rO>VClX1WjK`Nwv9How0cz$U(EClFbqQ!vb_bXj7LZ1$%oD}I@RXUE zm#v-TGvPf}e^!}mC!Q6fOAQO*Xx0#4!?=CN@fo=)@0fE1)j72jlZ(X61*`g^8{eID zEZP{c8BBm1KRa;go_+xI2U58R)D7$yEMR z)xsI`hlw}n-u{dXy5TSH8{7H8 zG~4_pNSZOjmRvKGQ!#)`mCO#ISN{6Ij1BJa@`LNxL*>9u`DZBstWV>bVwu8;jyO() zc#a9>N>^jp)^CbE4;=m72uE>J^==ppG#8+OLVPT-#u|8ABaiXP(JdeSvzlMHh#wyo z=V6hi4PV8&j;}jI;{w!jYq^#!JG{N!)QNNyDn7(?8e)2*&I?)3+y5=+30VA%#9m>` zJea35uUZFH-?+l46PAxQAx+6_evY)ttG=?XW&0^tU8XFj6AEUbm3!beDZP9*NfN31 zqf8GI8`uM+Q^AGQx4)ic3^O9#8M>0*|Iyzyt^+;QPsb}o;QP!#vV}Ra8h4Y$#9CE6 zsi`6> z8({*7+t{9?d51YMyFna=>qPh8L{J1-4RDM@A9V*XK)GW4+oWR4Vm?>LHXvU4;+2?c zs&1{u4(4M{JccXG?}3^Z%5)KfXMbJYvZFM&3R&@}c7!JQc+#R(kEO7~MbZ+6Bc-ws znZ;R*X-tf<#0;*5OB7p%jo(agXH9m50pOT9Q*uPRWfL8pfuC8`vyF61jc7>W{Ppr; zFZY7Z4NbkpwR6YLw4pbC_hf^#GQyJzMnbx0i`G$J8fk1eG>TKjeH;cE>$W;{a^5XX zWR#y1SD~MEq~N^sNazYRhU2Im*W8i%nqVcav@!Nh=w5_Se}({R#eMPT*rhVCsalm@ z`GGEkxY>zEdLzK9O&#VOf80XHC+ZR)cS2CPFL|CUnLzChK4eco__(fJS&UnR>X3u)aKZ0;#@;>EXKR+<1 z!6I()!EKQ`yZ{{TSoI}@rJu9A6m)h3u48sXII@GXOD`k#)Cv|8R^A{PToN<+q9^Z? zg}!$&SZ>Gmr$42}Rm=RIYcyM0DkcdAA~~etA5hO2+m-0F^6&@dJ}MaZ6cb!OugRG8 z7jqsC5HfJwXQCw?aQgBeU|+}iFzx4GlB$4K&r_5l00rf16r&6cS#k{un))ab4=$0a zBYu%*3Wj6E$?Fm%&9X`o`ZHm#em077W8pPp4J2{Y(m&>zhTXn3qx59S_DFOrV_pxw zFsJLPY!yqA*20-YW?q_!TspncAu_0u)yjXG9t;V$Qo!U%inGe3d#p1Er^`BR-s#*fd^gQBmua~=(oqm@8D8dB{rMAcgwM)HY|cJ~W3E%Vgy}z_zgbm3O$gydKX1e{X?c6js>Y2) zuzN-&eLCUN?6U)-U!y#E0t#we6DzAyt@!mV?%?Kc;#0E){j}sfXWQ;|-o>Gqo`fl-MK`qUJD7Eo{CoP*QxKJ_j;T2hOgoxeU4R-eY5lTxIkbI0`^ zaOQi?UiDd@L`J4GCf9a!b45IS>TASoUi5?=|2 zD0BRqtAugjJ`#PwCFu4a1B|og<4i&~3=oWg_6Eyji}f7+oo-ylm_eq4$ZiOq-_&J? z;}iQ>=Fq(;fmBQ!0IAe*FoK^K%LKtthv(Xxt$hjX*4rK=L14C_AfQitja!!>`;+E? zVgNVcT#{!WUVnMwGvb{jK~ztY{sEF~W|RVnt?w(eQYn^Pc6Iy%24i_1R&wz|wu%GX ztg{e)ErKJ-7g@+T8YionI=(FAc*J!@-%na#Uxc!(8UN0ge9)9quRNc`wN{FT{S25E z<>UxhO?V(@7xI(j&KMIec+HxtxaZD#F`qf79Sy+)4KVSOmanP@c2A>T(|0dD_~2A5X~B z&-AE=$B0jJ#nBl217TR4y+)un2OOtVE3@T!rJcSG#b!~B(^#^KbMEjx6f!*Ux7wkN zT_0ygC6iU-Jg1r-nh*t#V!JJ=45$DfTmuR&-+`r731<#v&8U~Vt0x_#T%b_^2Dmow zX*>XYjJrKE6=x{^8Dyh$;!zQJgS?)&&aZ*0hH@vm-rdeMz`Z2aQ0-1Wh5o1)F(D>Z`=d3=nwgV}Mr$@Qj`D7kJHzoi8!wJXtfJk`kKwN;8k7^A zu6R^Dl;LnKi6tG3%FHu$)$J4JlWwH?Ov86_yQ_8JSx7&4pQ9NWbX~4qS#HDRz06)& za^)IjILi|{@m?PZ83iWAX6uldEjGk#P46fJYwa-FfuF0rXC0V zn&e-~IL^J4k<1s+N0IkvvTZ^aT^kzL?@~OM{v#OiS?ePc|1lUWU z4;Jw%R6m|uD-CwfZ|>&jfd{rzk{p=ulOfg(ak3$2IV^p?<+bzXx(hc_yrlr62Qe3Nd~Kg zX{lveViHZ84d0y(N)UGmQaUIQL8%iuO78PMdj(>7ih?=q%%_1E*(M|UmV+^mu0XIx%*YWZySbxTAM+Bh5#Jh- zhx43BZtj|8ul%Dl*E+_{vZ(eoM|EgheC5GbJ}om`Zkx{6Y=GEc>KT1%W_ptpaMbwd z)Rvrfu3%8NIknZgXxcL_u1(Ov^xiOJ`@L%(^ZbZr|NU&baU1O4S-6_i23IBLV| z!JU-y@LR*2;FfL;^AKYi;xrtPl&WU8=U*G|y$@ktMnZHV8xzWq<*T8uW5Kk%FzmeY zqJ)B}SvU%x-kth%gc)%=2!PLtZuUNSqc}FnYfCamug5s7fGkl5*`lKv5;~1$^y-vI z`dx`o%x>pTTEQA4ePk32#^?t3${w9OrJ28t3EvM&&hsT2cl;F|$>;|#o)eV9$i@FB z8bpH5N5kojEVqQYfLz_53MhD`ob2zg#6MSblPJx#ldE!y0sr*KM4tmkNtiWBcC}gd zPofvv{{Nn-1fW1cFI_nlasmHY`mYB6U$_51MdHKlCg1l5xyzerFJDKY>O2PMA!QJ>O%)8{R4;@-TCHZz1^mSV%~5e6r08M>Z{Tf zdM@n$z?ZP#KP$kaM7|-=fmf2bc%uJ9&Fvi&q=j$(@IUah3@TVg8lH{wJa`kcR|1eK z;CT`^3K}g`J4Hig+y9&CH+uoz?n*#WX|BKK=7TM_Hm$BVT$m2Um=HPm5T7`Zu$#yU z)H;xy43uvWNs9l)JQQ%#e76z0AHjR_{W!RKh;1;(ADZv|^kKXj7rr_JpzlKWmjn~0 zk^L?xz?fUixF{r>DUav)vod&gj7#8k@Cn}^=nixfq0zjG*S43oUNuSgyy;&3IIA6# z=Jl|@4i=kK!5aIK<-HCS$DhrnuSTUrNBv3iK(f^T)ej@y*CA&(CwHW?XaDoiBjB|U zzOGAVEI5$N4PaHj9#F!0*nvbogcLwZF2*WBBvF=C3Pz=ZXBq z(pWIeum|AHMl;_A*NKDW0iIv_gr_!rWHjE8*<0w?S8p^7{NGC0>b}IP>-Ha$4Y+)R<^$z%sO7#l+~z>w@ig>(O5r?PavE>4ME?i9CV}ds zvadu(DFu4k;lsrt3G_ukNTBcgY%SL2eCdM_98#lc!;xv?Ae z0xPy%=<|@R{unI=DIAfxKX@epCTNDw42t@alVz;=jA3!ou&eL~%izRiHjx8_rfPFY zo#x)HW4v3v>%+YGO%=K2asmb6EEPg=4Z{PgBdWG7%G=WxLhS)$!GlPy8=; zoA;3dew2Ud=UzZN^Z{dhUq))2wZ62^b~hAPvLqkXm?#V%ASdi&xHcw=Ih=}$c!Bm~ zR1oq692dvWE%Q9K2o~ldj$49eAl9~ooOP0HTJI~}>0Vp>*h^rUTlp3v|J7O+ z0ilXsUE5CF?NDnqX?X>jV%?vRWtQhXZFYD~J^)jSjkLb(aXGxd5z0K`3*r$*J7R@> zxXKqyjeW-$X{8W!3I*Q{`g%>sJnWZ4mBGmjI?}L!((fqh3HgL^J1CvY%B*i42>5cL zjI|nSOHmPJP{iAQKTW#apAg}?uT$eg;A9ld_!xu~UL8+!dp(VGu z*E3pWJwcC9Jb`6vq{>!R`m^O%sALwS&VT;3q19hii&npts+PW{y6r^oOEeZ{g@Wsr z$Tdt;9p4;t$++U;VDg;_t@xyJs{Gq@p^16-+x2S8RdV+K!NBxo$=|jJI3S}X{@8$u zd3Ye8u6dhr-u%Z=CR+W)0R1Es2^GUDqQTOg@pPyMaijKr3#*3uM-!_=d_sY7omNg9 z*MdAsz{;#_e-+;|8DR^&+lC0@jej9Xc=Z+euRlNRaJ3~Ot!r2Se+K>k*n7*cD7QB5 zn;5!bknS1;q*G!5=|(mJDk&v`loC=ygGfmC(7HuRKvbj~1O!DuL^>3dl8$Fx2>0Im zzV~swU*F?>pKl&GbIld&TI)Q2=l_4MpFr&9r^~Rs|2{4tDftpYB{JfWZRcxXpzlJu zeU%8d7s8%)f&~c2rOoX^^+zmqf`d^NjT_13b6-6Nk9Rv2ih-&|SoDfdNIu3qE+Kv> z#|Q#p+J&u2IU~J2YU3f(u-h)U5Fs)YX>FV7T-$9-32rL(dcO94hh#$nH6H@;Z3n8l z+dg~r^>9IQ7;)2G=}_-l?CGGsP68`Ps6lBz?^)z_+K%6RF3q zuN76#9d5(O#FRG1ty~F03|b36`N7$@#4+FhY`S4$BGl=g?Ug!)zJyrP=^?sr#_Z0X zJr#zL{iX;ma7l5pYn_Doa2Yc;lVnH_^DuXq(SRN(@#Lj%dVW}f=TA&WCgTUs6GVqC z<~+Eh;8)i=9?ZqfAB7TE8pkJUo+(IL3VIwkq{`UL;^h_yL{a@(SC;rUf=(AUP9b;v zLDDt(MZxiB8?=kl#h%v|s(!>iaC`14DYxj!?HE_qc)Wi{yl!hqYmp<`o111ydz-!b zE<(ydQY)_@x}~vUUGj%(9JMuXMc$FEH1A@OSo`~d3cD-52XtyzO}Hcnpw*BV2NO>A z-VPlfsbN0(F(#dSoDojfv&JsO2|Q>Sd!NDFaQ#4&SmN_9U9ukh6z+<8R8PmxCpQ2w z>xtaJD1wFDZ+R%k{F;CdPU5L6L=vq_Xk}H|oI}R{%W}Ex!u2}|mt9v#4;B?pq?z2i z*i3~{uMA3~tO0qQ~P@6YHouSVWR3AxSNA+vDhvPr6F$6&>_W)k8*JYB{4?umu-m1S~ zYT;91@Y~;VpV|I=ci=)yf_aKgl^2}JG(|PMB>>1&`}|=WCkJ0omM-=V_89an}Wm(_2XxP3t|}j9hZ92*nP=NS-3H z*j1`6qva>m_AqH7SHk&TWOJn?gbTh~v>AkUX!>B!ng`@OKLcLcx&=LelA~A$i1`)8(Z?RJF{lEWtmRA>Cq=s_Z?*3q#<|*5}T=sS$f9J%pw;}_{OR>tl zD$?TZ2-BKWe!})Xh!^Xtna4?Nu*OG4bA2)-a ztkC>Xi{k%SNT!&PIkRMMBFg^uC^{r6rno|LAqUDcXfI+F;i%kHq|hXQ!((0~O{-X{ z!{Nf;kv6eHbw`krrmSKA+nvfFYpaUjD9%i~)t6rb1j^Gaj^}t39FG3`-0B0n)6-&wCcO;xS&)R!a{F7)Pl~Hts1z3|3YHrC#8j)y)Uoc=m>AUo~(fhnxW7Y_c-M2t)y&#eF{fmj= zV82?0?((J;o=+Deg`_cROl}=a{U(7jq}3&tvbtPeK)@_ z?aY`hm!*1)Tkvx!EnU8H(B(UAsE_a3$j~f6h0TWer99pIOI<;YTag^jRY#QfrRb=@ z|I%lJQkF{iDqKyWHG^V#^%`S^6Cq!n?F7A(qc_^wVeCo_z4rb9XwT1SrNo`v?-kFMwoB_gSLYqlg(blgopO-;7(FSLR(u zts;uP-2W^Ph&fv~8{3GGUjxo<&Kp%sUIwqIEDbx$xwCB27-&Iq2OdN&KB_W1{FN8tZr?zYRdTGLy#3>q* z7A!w0h}8t+@2A=1SQ4c%KGVhO08i4{?~I-?mhB?+65j|F$B?7;x&HUfU0UwR5C|dO z2^jQ;R>Xvo$mvN;$n`6>PxxCeu%q41gg>3 zXC-&y*Qh@2F?}-kc;9$ZIbw5yE79I|n=Og(ZAZ{!HaLkbZRJ-LpGO`WDh!`>m#$TV z0@vxQeOF=Df$$lVLOGNhFG*r{M6TTYAXav3$P7oN@u^;*_lrN69!csZdQx1{!hKCG z@$$+O3^8M60pcLHuv3f&Zr#z}DGcnzoRr$<&^T>#Es|S5;;WrOKO>3Zy zWRjxs4H+7x$=YF^=|BMLn=f!_xa;0onm$N^IZlzX%ggbwiP%6t2F?kkUB@GP>Kf(C z&?^o_Kv!5x8C+>jb0*CH}P41S&p z+sOeNmfc$sakVr2Z~+tdFfSgwagoYUsQXw`sRP-_V+;2$fxTqc?RNcN#Ln z-18@vq<@?$>rTnQ90cb!dIuTLxE?)0s0b#Wo4G>xqHYgrE#&ji&8$x07W$P0xeS@r zVX@IQPr?6O49DPSwRSagd7aANoZ%mQuQd(W!K`jbaqFC+4?}{!$bslMBZ=bcSTAHS zb5Bg)hQ7;%g~x)=<=HrOon4B7mgV8@dbeWF6M+Cx`DlW*iOq9nGsO<3UiZLI>x| zL=eLud1?Jrv~9;*2piSLL=4AW%^5{as5RF~2Dul{u$$RjjJ zgO;R?>D#`|6|#=L{x65(9K4GqcU^z$GFv#$U#EV4kftSQ^lYWPl|CCifBO|;25<@C zItFRv|8v;?`?Y_&B|>WDrh&^vsY3v{3@7nk^(9dX{5=ByapU`fVI47ai5;;_nG0DS z{be4XUf_iFM3vEf*Z)1N&mRsLRYHH_TlNJ_S_%!l2v+KiYPKAC{y*=9r6&b#=_J}7 zr+umA_P@|nN`O7VgM3_O^}n>7bC4PU$(vR~3IB6gB$l!Uda>M_*ft-y%Fo`U1Rcwv zLXBmhsZ{s-r3H9_DjDYe?<@)de)N(q6HDFI(!jg6uZkp!Zpag3J->5Pn+t*o>Va`m`qzth64z}mxwiVp+H}NpcixX}y-8<$WA@3}$PTAM0TZC` z7q?EP=W+=tz;{(Ws6<3k!kLj09CQJWL#%g(W?#^w^qE69P={gcD4Q$~h2t5sZuYXU zOp&ai-(f7I0=qH=0kGB2AlJ^>eY23^G&HQIAeZ&n!Hf_fW4MqkWaR_Tv+p)cvmLgm ze$-W?k956buSgNl!qhlRe++OYG@CTJvH{BNFdUjFyPc%Bw1HiFD;EcIgDc#)`MK!E@c{OPP#GDfp zGP5zFLx9MoLVlutneU~>^G$u>x&(o}m)_hN2UPBA-A(73k7oER0lU+F{sVG5+D4Z~ zsJ;Lu;0O#Y-PwGM8|ekJaSHMlt?z0+nPBSY$CJQkIDhE28qVO-wU;jIQ=T&Jz~55>$quAU5TO zd-sa$P{Swl2Q?-iHzSmXJb_7aG2(HAsCG(=07L7Y+A%xnKG(pFZl1;1Z@_$!6}KA* zOu1$*>Y|SPM>Q_Kzk}G;6bxr21UmrRk6r(ZAMIz}Pq?3SKe4fsB~bR{eT4q$GJ?eV zLSFZ?;b4PStV412P^h8V-5QW!7q8DwqESupya-xi7T=}3S67>-a+|mJ7ISkUOXyZj zxxc_W5RXTZXaT~TQ+>4kxdig^z5{l?F}dV0aYavU$Te5p&7E02kwQplcde{$CVFe+ zWrO&exAQ62hl*0oGiYx`pgE`L-N+}w_p%^zT>ZgN%N7S;6E6uDA|fwDI1g(skIWKD zhUzgd%YsMgW6D-F6--pze&ISlpF`x&XBJ1dGem4PV>9a$uF<}y_-q+M;;x?{0jCsd zVu=m`jyZovAQRV`i*o`V-oSp*oNs%xuoMW`(B zu@Z#AY_YUtGLznc96IB|P0#l!RgvDmUnN>on0HA;3tJMwFAix!Nk;n=9Gq3oBh2wj zDKS?bNK|PyeK_q82jo0Wb5b^yk0i#Q2!8`^Kgl>11}1NtVscs$oOW>Y zGLuQ}`t)9}`UrcaOy@eEe61KV*LsCkSX#zwN6bRR6E{d4YXtu9#IwCg0r$%^>2uSG zMS7RW6Vco~?H@sMzdl?&wP`Z%+B|=+@ohcqvpU1_6@pguaT7LK-?Zpvh#~H?1i%mF zAB=%>8V2N@Ve)#X`e(>6y+VTnNagyY(ojW33ZIaHk?VJ}TT2(?nkvW@n^96GiN6$^>?8MMWGs0%RAl-viw^-<3mF?Fh-N9tOJfNhI}z>R@!|akR_lJ} z0sWM+B1XG%H64P}`x8g~v%P3MrOXg^Wjb?Makj|MtK*RGx$P^!43pz0mKBPhF3TY} zOt9R*oU-^IUfC5uO*~O4gx&z&h1w931(F{cqHmgxfy-Stg3(>wSliOrsLa2G#0RO~ zsRa6i8JpTBONO@N*u@R*KCkScmnPnb$q(idM6lfl*}P;Q=Q_qr+*_U$KqeV!n4SXu zT}h4iz`VjJba&a0q7#_$Wl8jAUa!`EHamz|TdTT;XUusvS2JP}7Z&I|f)eXGmcYX@ zvW8i+x~CDHM*-?4^diludA3CA!^%64x8poY;dmS-o>dW4N(>!U8r(dP9nkaJ(~{a? z>!?{xzUN8yBT%X0B|imNv))ap1$Bew1P5*IdZ9(nz(~<^$<3TW>-@NOiq>KZcuOz1 zp4xed*-%5l`Lcq^lrflNSV(Xu!>=e(V7trE;xmz^xT49?lz!7h7F{FMAu1@x{>o0~ z&l{>Z4|NT{Ths7(xf*pN^SV?(JtSX_LLUJ zH}!EL8K?;(9Lm3`83GBgNPOJag#F)1c8gBA+BogFY7!-)t5Ux3rX9;g2v{bwXwgO` z>SVs5_>C)d9a+W(g0~aiUee6Fsj7%_&k0b%$6kG2JAP4aZ!S?_9=2oBqLHcncVJmw zCKg70Lk^nTK-~8iu&kCm1HcZWj(rq;;tIRXWW~?Q8)V304ETwSY5QI{jsUs!r;X^n zd8h@$$X#6}pjt{_Mk^Z}CDsF7K*$>dvV+nH80w7_<{mZ2(Yu zHx7i-eNnT?Ek zX4j@ve7oZt^_%&SN|5#xbq^qI7yP03`iNEkB3F+`M_#osJ|W=_dI@j!I9!->d*7jm zHb%6|4y_f^A0ERWh|G{73VBE0gED;LYQm~Nrt}T_XB{&W@sQFY9+zrbN_gfzh2*Y{ zK1<66{>-DbwACmNi7&EKLD*GSQ%pTMWRWKBXfZT)h@(U3wS6_yR(UD}GFaG2t}@uN zIHLUV+79IS%xuf=BS3wY_Lt8?=Cj`V+Kf{lvoCvFU zD!wY*t6d>QoJZ1OSbdf8h}cQB@TG-Y(-Yp(sl`*Zt3Kt_TirJ;QjgaEFxf7Mk0e;G zlT2C`T4|=Dr6eM}2($Q83OI&`UxFb}&xsk<4w_C3e>)W85-(+1!nnsbEwODU1)T01 z%*1IH%)oR#hK1TyeiD=BJ~UkidYcSGh4L?<5&{z+V(?)F4cwV2 zk!A~rosk<`9<&Wu^iNAOi82)%?>O4|svx*HWtN7OI3Tw@%E6~2RiZ=e_;=tKoPOG& zOj#$$OX_C;9KJpszM&OurcZp2VC%whJOZIkh`mkbzohIF&cYW&zHPl!h>uoQT12V7 z1t>Y0)JkHO>8H1vxgqF>qBiH$=j{iPM$J&aynV7~D2_N;k$_@AxB1?JdvWKUnVIBm z9^!G(5h1RG_p5;*)YtfD%!pFFsV;})oi z^+n?}j5gyYtNVcdVFW$}+VYn*I}^&?&}oRh7F;5NB$B*CHpU_9-W$7*YOZ8UYk3A7 zZ{~VjCelm}A(Qvc5Nne=6{B$q$r7wJlsrO8-SwI?tD9E;OyBq-;#=by14JHMbQ)t3 zpT-(7Rpd1f^)GJG%WH<~izQhNmc6_lsNFDrvs3UW`u@;4AGc@Jv8tI}6hD1+xtpXS z-#+|ilNA}EF{-cIDIO=9+jQp-wSos%!`R>Q^DG&UPEh7y4VsYDpo8#jk!hQrR6Gwf zEQJS230_F@!AGzYcw{(NWgM`-{N$EE#-E_+*L+dJM5jtfg45It^9f7Z6ZlXSqv>IC$48nOuCwn7he) zt-r^tK_hMD`SnW4SHJeRC=ky{@dzFN0UMJQ1>LMst{}T;RP60AyH?8IL$ivUCi86k zRKNVY2F)o%i&Zp~XLN;J^|xrnz7_{(If|}aidA6c zU$~ncm$a3kdm1gpHz8pyuQ9#AWcn(WlJ&TSsnf7U@5@aEIKC(Q_vwmjl$p0iQq3wj zD}U5#mz-8@PBXh3fF!88jHSDu9VG}x+gES{X>Dnt;4V1fn)UtyJZ-FsGgOD4gQ<|f z2Xq!Pzx?!AO}crpb!<`dTpDFL!U6L75x%P)XYHpPC@h;;2%|taDm52yxc;V$Gtz0g zn3;K}M9m~K+Avhl>*d4CEp{*Llc?sy-@6SIobv#VTtNB~EW#Jgkldg;YZ8G}xbM;V!Ol?xSPMkc!Ew`X zV5pvv$u#Oy(l`)3(U%Cb!-4c%O1v3(1bvL)hS-sM*_`M3Log_XWi0F)Qn|ChIhcYm zAUDtmC4XodtRIT+iNsF}3=mozOlSfMGs?i|+pwiNt{FELEw2oHV3|n$AFh^>K{o4s> zVEAMDhBSBGDK{3OC3}5#!O(f1g3?n)aKt_M0$_hCYwy4P@%*2FLx90^cP#TXia!7A z=>eK5fOyV&6dp!!K1BXH?En4R|IlS{OFXtRex;iG^6KQsO6#PH6n$dd`Zv7G4;s9u z2|KQgRyu+fN-Hv600lqETFR&-{a*oMK{Q4O@e&Cx2M}IXXVDVdefjSO>HzoAoPud% z{g_Lo3&wwc^uM1cDi5@(vqmh_*Z#{8x=FF*lh{|L^yxpavEXqNl} zC0ZH&Uw{+;Vz8=={{{>n)%nGwz?>9?%{0gT{_8%`+QKfqntLn;G;>8`_PKH=H$C2o zL+#3#ZQ-iA_iNC!(zdpm|NQ_gF|Y*d*OYqOmC59iBqm&2OADuF!19?!4F_MpcE2^% zUf&$i8qx$_z#%Qe4>G_0Lr+of6)`-_09K`a3o{1N$oH8(9`eHkS)M~0&&8lFagMRl z=DDeX0A5s8S@)%Vxu;Ro|0Rb+kv z>HEDJXcUW4hn+`|x@i@#B3?09nBR05P4Sx_ulZIR4t_|#d){@MheEZ`Eyrg;0}|-P zDrm>H=*R`a+TTLi%QEPp)5VtPGQ>hWzP>mK0CyTtZDv=G-+pErxHI|SuFT2d<}mYv zl>~L{=^VEXI>)C)DLtio{*Ve0T$gNRx3*~t4C#|!bcG>`yaPxJvqu1Y%u3micL93O zhU#WqhC;5?8zOIZeglhmBsr2-@jxYW;46q;b50x{oYmrxk}yc5&^9X4p#qTKrGFs5 z6})RhS`!E+nQqXZEHwbAfEJs70JX9Q=ri;dP`5d{gs(?Gyd2x9ul0pY;o~U~uSf!A zrr&AnKs9EcTjo4%mU{_m%-z_wxP6dx^u8#Ner`RqIAlM#4y3G9Zefi6Tkn@aq}}ZZ zM0R*)j+U-{tQk%~$LsJKbpCl^Jq5MMf;#CzO2f@5AJ&rzAOQQmiSz^dsDbw)vGrOtn_Md=*2?x4dfoAvAPvdI<`MA7?_@JnX{9ad&tRmQ@^EY z6^LSWz{7Vj15GE~7uNv@)l1^h@xFSb*sOD)v6!%(yFK$>jU~JI5sT-PFIeO35U46Wd1Vd> z5dtGv8iw6U6}Z4THx8T5eU@4J@jq=-ZyMVvYX`YGzZ8KqYbkWBqJs(mS9;7_;)a@f z%P@M1JrN={)|xgmAr-nhfXqN0Tx;C_ID*V=7E7UFlbrOnaazb>GW-7hi@s|8qTJ8! zegk#Coi|_KX%e+afp&?M*?CZtyywwAJ-j8_RH{5Dg*4572XCVy6vu^N8UwWz77XZQMS0wq)`Hz%dF;ig;owX7bqp;NO_NL5RZPH}n5<}8H0SX@^>X@RA@pKc&?fem!TboKrGdGdk+p6tdR%|+^vaoVYwC|kz71Qm)F zZP~9?w($coa@gMud%pVpyb#t2ek{@Ca}R}z%2RQhSE`|UQaZ=4I;V1qI81znM%6BX z?uC9U#?q)+5z>@;a_(N8*WDJ~XQVM#lh$8F6+aAr+rLuNDBcOuv$jx2ql=G0A~ ze7*d2Rsl|9^2~CbBH$G>v6O{%6qoz{vSoOie|0j;!Dy#@9U}ScrNw|b>^Q!u&@EiG zdc~^7&**p=w`%fEJ|yq9$H6m>EgHlH6V>y(CM7YK;p`^3DN1j&zhd@k^=thjA=GsF zEj1&=LNMpQL$Wo$VV=JE?wTz5cvc$Y0L|fD6LKi+#$D_?KKY9lR@@2ERejlFNQV2Z zZ$gqF`4Og&CJ}BM|5fzxpcuzMhB0pUg#9c0Y@)t^*U3W)0s8#$1CVsR1Y3n5#1HqU z37se3oM>o7xT^-R@m5|+^{coBOMxSdBWdU&6&7?{k%{(gcNu&omc% zbeK~YJ;vX01!?A}?fxsZ{b{6(<&dsERwWPq3tN-QP;t%6FMl^&hZZQJ%P=Q}ai$df zjhCQ8uyFsON77;lMG9w?7)9Q5ACTv#J{Quj%Ju#B^f`KRf8?bdk@EN?G|>wbT|O{( z2B7rSO}k}IDn@+gQTc1#oLUxm`QM6RDmlZr%;p z%&do@6a{*Dr2>HZz9(Qe4wu41Q$~c*fVCbhz5|)g8wWwyq+Qb#mjX<`HT7vaNx0)G`L5(MN;wqFV6N{q^c@1(zJ7VS!W9(&gjLGiNlQhbq*gl7_r|6RlJdj1x zB29u($(SuG>iC2q?u}UdOs<`F5Am52AYc<{8r+X5x>ILw9HMh+PniO>$8!OL&GUW* zxn+U&k4jD~D@$!WOrki$Cr=8w3cCX*cpeo#<{im}D?k1ffa zY~134Ly9gH=Ar_5j_cG2f8X~CBPYP(mfX{w__F*R|Mz&24EUNJ2I=9 z{L7KTM1%zVU*rGI82h#xL7mXHy$!0XieKetLFZRomb4QW8;68%Ic!!HeaCp7`ZH7o zChUW|xnLz9D|}4nFT;Cig=)s2Rly=8e5%0t+Go+W$A?~9|a(;*hrE+xx53zonEvRVDp#1Fn zzLo74dQ%d#4bk{ZDh@oRgqok#PuN=W-rAXR8V6VF2tN#Ww>~-A8Suv{3*!}99fhLQ zWbUjNF>Hmru>s-Y97CT6q%y!pjHj~(u{h@Bbo~Kc`3g{fO24i!Tg2O$`J(W_QTXr& z0nj&MJ;Z5fXnst(t%`K$d!-r@R)2EzQ!j$)zKO9mItxi#n$L)Ijr#+}@P}~PJXxMH z66Z4T@ocinz;PxDHl70sw5cL_h;3N}xk9hv?jct;nMC-Ns3vC8O5?}68gg=_$ho*D!Yr8%ijM@hR>U3&x z?DY~xb&d;U3H?zYDd~sgty)4;qWCmJAwlYLiNcYiQy{_NDkzmYf&kya7Ujg|c^r8H zB$Pdl4^4UDYKPPJkA8g`u)vL~Yc2o%w#Q>ok*<6VQeiPB$}?I@CSJ8c(Dw*Agp3RH z7G~e}VrrZp>JTaYhtzRy0g4(?dF)N2@m#A#f83y>xd6Y2&}46&^{c%tH1S0&P~a`U z;*x6Gn3_Xfui~9u+YsKz$ayrI6OY5omMqaekMUREf6@2ERA4Q6?eg0q6ZC0Jgj^S! z)0ycItJv!-+7kxGI=0ej6`sGnk1r%p`y!3HuiAa%xB}-FD=TXYbX3{Mjr~KLH+10_ zgs0#0-uMahX`*o$BSXN(N`azIn9D%(@Pe~LlGK9iC zT(uL^Jjp7kr`24&U`&Qx^dhI&C16vZ5oBtnm{+g$3-Pt(kPSaW(;`-n`mRaZek7qe z-#rAEom|xX*R}_1;N+QR3>kDklq;a8i(P0Az__r2#;5anyNiLxi^sUP9nQFbX$;1y z?M;eiyA%^v02bRsdQ6E?W9PI74SMFc+&<5_o3y!tP8Ex7RSg@}htcpJ0*UIfyPE;d9Gxa4a$}|pq-n3l%-5Gqa zY@@IoC=B?KDK>+V_8+Qdc$bBmChK3=1?3V45K8%nI_jUFK)ot@d3bsQT!NiH!~+B9 zGL;F4Avu+@%82V(c3+Uz1d_AFkR*c}n0@Z`>zZ41&~RhfakS8t{wTleDm$Ah5yHA*QV6| zVukaRgCY4h42%Ez%lQ?mvr1wS!e8ap{O9(ZX;PpM^l+h(2A6n;|3w!W&w%<9C;G>i zXZ;!1ZTL<8g%a(v>OXbSujv_lVLzY`cJIPYsQC*b{`K>ESW7rdxXC6j1HM$L+u;&c z@;BT+h~V$SK92ksWrGGxJP&xjvdd=wMjLG@^w9{S#HhcG+4FyPB_cmQ^PV&1?LAlS zqMfMHq&@7scfNRGKMQaK`ov9gR~D-q5zJ{KQS8_1 zFPw|G|33JnVKIsZq+G-22RNS0Q>M?92^MYW0e9|rgS4A1a6yC3fqF}%!x zG}{3P4$JDSHzg)hyktd$#-BMXGF=g;HDZWz=gdg)WS1>0Me z+j^D&r3t(l6f8FyGu1xV90tKQxSB+O#t>XO-Noh6x$Asdr^^ni3~5=CegC2py&8Bz zTRBf&5M?|=u7gl40&>*$Wr*_;(~BYQ0E-t&0V{=hf2Z+;Nn+G8M96ij3F|Qd6?Z6| zs9h+?kE$!~0`4;nTq#6#3-PHo$`PajjGdUFv)-O-5or@1L&w0!b-7qY{5r`0^B)WV zHQ|jey@vJK&IpY}Zk&k+5}-%Ekl*gwp!u=qA?Vaie0ilpS)Gs(=PQtIP0y!VkU}Qo zQjh6dDlCXu00T+iKG-2;aIQ9(UIL;dW=M%=a%rZ@SlQ-kUCJ9}ev*0u-QxmCnu|6Tkm?Hf6I0Arwzg_Sg!*xvYDb$C7vU_a3%2 zkRIc7h>Zywy2*E_d+U}0yw@IaI2i?Vr$Rt}aH-v!cPiVJPL7XS0ehkP0s30I0x}c| zeA%+HV1QYzO*MNE-v;*Ay&!ZvEE?=@p)d^w?jvtwV3(Jo1tZCG)GpJx1&}6|9Z~WI zU?Q7g^?P13LTKtGf|V~+VGexqtzh#ExHm&9dJjaZME(ccB>0$tyR9tN=D1%N8v#U^ z*#Uc#@Kh%^>gCFZ%@)ox(uM@|D^^2rx>g4jyp?5>Zkv*>jP?f6aRI9$1BEza^)%!}wBDle{qzTh6_m$M%0OpPsXEmU z>gHtLuqmH}72vz%^~M((75q_O3dpL}&$m0V-OE#1fL*&`=+dQH1o$v^iB2&KSt7MP zKtJqv2CCQh5b5uq7+M_YpGufew2RG{sMd8QK@aRyo`Od8xU6$frB||hto&8 z9k;E6JwI}^h*6@o0KTf06UlQhJ_3#fLPDXU*!t)BU!ESW++!tU>HrTiDGoC(WqG)S zX2O{&1Z+>ECLApC>KGqETlUK2`mY#*!{1vl>F5R76X$rzrg|ULfG2z*lmJGUqu|YS z`}Zt`s>K&7z9k#AzS5+Xo7&<%Alfh^YEvs_?D&j7?jAqtMk-yAO#*RT7^pc2`#XE} zZU`P42-oS(z|zxR2kl^WAk&uN-WOOog(8cuCf2NYjl8j4i!uP&rc>z_Tg_6dz1$Qnee1j7jqtChfdu*$aGoss>;R8{`=av^iwR}yg*#<sW239(FlBP|H7RGl&NVi*Vll(fz6HVEilD>Tz0E zE8SxD-Ta^MshV5sH)YnbLT;lQ`B*u;H!c_7E_^Bj?Q)?V;nmLmke|}#x;~!wltGIQ zs{dB4sELc*!|$tJr@@#5DOUGp+#;bMj|q1yOYy^v!v)b{IA0~ulX8Gg?o`4=f)^l_ z*;3d#=++Pp=FkRx`0z!FmF4S&%Q=jkKR$x$1zm0`)XK!KxjA6QY!#G|*7r=lG1l-u zrV)p1Xmz}oPj?+w`2LghW+hS;}oN9+6^M>Kmp3A%r->irAo9r=mRsRM498Ly;C?4WSJ|TV~P)l z>XglVk7u`N((E)!xpMrw*JQ2)q5F&a4SK6&@*8So@Z2gjlaqH}K_PoQ52_RoczP4A zK<~1onLkCB4jP>f7Nz@#%}g8l4=)j3GxxD&G~&2n+0IN|H!(=iOzR*TR4ke>IVsB8 z2&BI@tU8k&qS?W#pz=h&x%Lo`{qE{=SA_}^n(Ak!(tmp6>odQ<_H^LKEu_cTuipE`{!CE4!0r<;98`V7rlw}!h2G*D_%U^v-G#6q$&zA@6^ z=$0Pn$r2E=C>D#8pY9C$>c{CLnF~@@769hfn@zh*ZxpX$g%ZD+jabMGHFD8M;dswg9 z(dt(bQUb!vR%ADswE_{K&E zIqHCinWTGZg}mu8GM&-pPgqA1xeUIy_pL_?M&BNn8XbFP$ruXOR^$B){m_t9{8r$u zM->yZ%H^RQ(IvP;!Wz??iI?;eZAXwG-E_2`-fp? z@GiZp%+{cCD}@>(g)~P~g+g!CVI*Z+9_teEUA?N#7mFIX=aK@}putBaS47Oo2Q83m z3-c-?n*z)@YKkmuX`=4q+F-+T+iorRbI>?QTGt94@;D{9nFsz}8dzDT zH%}?hX}eWS8Xp(dvtbOn(MjAf$r@>%V)WAI=aaeBtC>5UV0~|ju4Us-@1QB4rhuL> zib~n3mfYD}1{fGj5*k+&jkajn2Ss#(122su7awg3wTISG2~9_A8_K7^sOp9AFGfrD zf>1s8PlHi+9rEi^3RpPvtWvH5L)CPYqG4P*o9gLLu@9zuw{mWo;)1u{g_1Y!Y?!)W z;jhWgdY7%=nB&4xLW*~6CO$>uA8fH0O3Rj~U()dO+UHsppr2`b+3@T6D37IuJI+G7 zW`#q}8$Z=ZJ>$R6qkO`rExK6mVokKZ+7X>(6u)gGd-HxCW^B=ez{z`+hZ_WQ?D|uc zP2U)_ms#zwI$E>*Wh*Kmbz~Nh${VEBt#>fY%3r~1!;IPTRv~{9tthTQ%Y=2@1YB}d zVNslL*BAw8-yi`(n4^CG@vW@fWmf(d8jB%8iNqOEtMLn(#oolcdiOKm1vX*g!C@Ff zQ0Eh2Zk&9qkO$v#{TY%3cn;_iLe;DAi5>U!L*X;`EE!8gLwN|yiDggV*VjqyZ zSJeW0k4nl14!UfSaaSNTXs`0Vo+PLH8rr#~f8BQSlG0UUG0pjSG8C2`nXI;<+>&;V zdk^nA3sc#RIP3Mi8sC|!XJ;`qC8oI)c_Ze4TK$E`PvT>*y`F!S9vXhfJZD(;P4pvs z8>a(}Yq!lDo}P_lfdPX*ORXmZpv(p=>mBTEmwJ5LZ3jZ|!mw0Q)cyT_jEKY^iliyw z+_R2Wk?vp!jKT9-w@f>NrR5VIx~;J~z0-gB__DqGfTO_8ngeoC+DMz4ODDj+@(@ee z?TckIGB=QszlH);P!pIh``zS*WaF6^a3LA#G)$nC9JM$Jio);^n-Z}$`I+<>)_7Si z>5eU3*u$+Bjv_CRnt!0dl=ToN@Pz0hXqk4=G%Vm~Kbd;q$t_G~L?&|Nd&OJrSKj)! z^u{NH8fzr!#}55e>$|RgQGz>^=d|CuxOn*lUK)eKxXRzZW*q4N9McZvk9X5CLa zv+xbRhdnm2I6Pcg^7WQKU7waRVBWDp?RwwMVD2=C*B4^PM^XZ#XJapy)rOft%Qqyf zYsO!z=fA*?Z`Td)oOyb|k={0htwQ=dtF0#2N3RW>QyP>mS5T(FRV93DQ`ya=O0M#lLyBq zr&8FDctg zb0wGYsiJSA@*nK{`C?&&mgpR+oZoclA<5$#{mEeTTx4ryOw`D?Y9Dz^ z;NN~e5yKY~Afb`fhZml4hB*E&e*~BAV#CoR%9-dG6TY)n+ z{r4M90$|bWS8(Gi|BXC22kQY0%-9+Ke5Pyt>xRT5zkmVsBvZ>u<$urj|I0sSd3-zb z7--hQd9N0Sj^+9pI#Vn_gMLs5wgB?_3J_X_GZXO(4LI)?&Ns-+|N4Y|9kS&kUr;@n zKl%k`V4|xfx+J3Z{ltDF<2*uuk%XDQ^$j~dI>3_$qzt)8?hW*4Ku=E90x$`U-9XM4 z>14!ashsZ?K8S9;Y32RAX+d(D{^~fj^fQfsu|ez!PY%$Q0h1Hg49T;M!v%=J4ywbJ zR&*a6tO~h?Q7^nQO*9XX-n#Ct@w0qWdk6~z_^Pb>y$5`PpNjQzC-F^W>PY~6iBaRkdZsBWJwqb$!(hmL@y_aTzvlE<5gLiqI)_2U~7L+?t;DP zp7o6hkAcM{J1EuN{voE^gKgpvJTg)MHw47$C&#ESe#0XWW5q1K=lRF8>K}lfdj5eN zIk#V*zS6(cr$8-p#nTPz(hIwH(MlTjLM_SuAZ?`1-3N9^Li;Q?Re)f~F7{t{4hMQI zK@bm$f3y>vdsh1{4C`=k4R#yETXg7)&)+b^v)z(qOaA^EMdPy)e|R`Q-;RoR?Gx^V z6^mMHPeTRDmccw_?7Veovq5AAFgd@SL1zKn;}?NTHs|*f03g|$RX)y}ve^@TluwjF z-Qb?LLFw-vbZ74%eKJPK2E;IMCmKPkuvQ?iqmGrDi4?jsTCoOflrn_WUtZsPR=4+Y z?&&UPI&tZ3k@7{(llp4ut4s=-Xf|k~ZL_VW`1|~`Bm*-Et^oLF`pwrP7b#G_ZUHi^ z3vUrFK<~8%jFDkbB^UCHT5T=8cheY6Ha6ph>a@f!Cw-l=ur@$LyD&0^L!pWj2xSyZ zUEFEDckfR-#&)~4RUcPg53A+|cbn({{j z*l6}Ej&;o756Hw)D@W}L489k}{XqB1b{WWFDeQkcSF4`e%!MI4NEktXMELpl;&_H_ zKk#D8;*(?0wsG)75Rlv`4xL533v^}W;ov2_TnaAq{dE*Cbt$1M*gm8abqo}@W{AcWx_{n9*K4?lmfYtWapzRo&$ z2>N41TK7R4@v8YYs-qLYVj{NjvBvrDPxFZf7H|Q-yeip(Gl}i3NFM19Zo(sBUNAQ> zL1M}!=gOIAzHmraSPyLL9@X*nKq&dZ8}tR7*`nBh{Qp*fe!dTx23o@C{C4o444Wl= zK)vH@iId2a9KE;kp)y~2QGt40=53oMP$Td+zpJR)V040 zDjyC?SQ4hE%gncAr~=puvRoN8S-dN_;8_tt>fojic-G?Z>x8xGUj|rD)D-p&fN+=E z8bh~OpOsvH0bGFDTF}zh#uG-Zr!yL;DL2sEG6LAQMfqP&xLW~9z(aFdd?LVCEa40g z)m&L7%uPfzllCXq0PnU8E{qAxowU;Kx3X{_%jFzpIS&UDU81d;w;SFw#ag9+CQ&S< z$*X#D)Fp_T4I8|v81NFnZWLCStj68_B%fF^v7zutA2O%jkS|E z^K@R5SS%PRB2a|x0a=lDXAzvGwd1#i17KI>$;at-XWNnHwO)X5GOn}IPUry&E>E=s z^oSJ@{RZCnde(l?rj`N}=7nLk=&(@83t2J2w~n|!;nrC;?eWU?sCq2IudVle}lgO0wELg+fR#TkPpDi9eWkm1vJDpv1;JB z!TFxP93xlFcl;V9$$hjJcFZ*>Zpo#Ws z1)Nt9nVz9Is1;KiOD}%03VmZnS)ZAih$q|AkiT3ljyY@{KR3PB4Oq9}{d7e8C*=+P z2jPkWcO!Z9av1UM$Jj&$Hg6FJ;Jc@HNO)hHa#kdc0%Zz$d9WEqWf%LyE0fx@NLFdk z|8>@g%G>5fBiJ)^{>1*U>fMU^svh3M#*!l!u0dwZHduYA5NN|F3=?i^GE6Dvu1PL7 znsnb;WY;f@6(YIvvF#DTEN*&iJJZQY*ihHI{GmkpGfZrIs*N(Y`QP5fcZMi2Dp6%TcBz}uHw_c zxV4sEUE}et?E~IaS_*Grp#@eUE}!mehr~9?0%B1K8LtfJ(ajgVVP zDc8BR>gzH}QTn|#@c^iAva1*bk49 zm-k;FY{XSdz6or;REj{NlaC|$oF;PPOf<9biDCIO?q5hg!R{CH^uV_GK0gHfhM*kz zxL+(LJ!ygOSk@7H*McMLAr*=lvns}#JD21;%-zusZy)m`O$tU+h5A&{ZrECU2h%4=9na%=_YJE&=7SlGZ|KpH z6FGT&zI<)DbIdg;(!$V?J^mHI1gS*1a&8u)gP(N$yS(U~u!A+w`65Pv86rTXhDiEW zGvp#5^Zu^v2l~Zrp+1j)((gJ)^m@PRasEWBZzo5|M0gGrRDg#yS-i$+wt1*R(Ph2I zqjbwPjpd!y=;x!y5}ILGM9(ZmFI2t(M$rk*)w;13vPiE3aWyx4MA#pUIG~{Y&vteu z=1mjuU@9eh2j!4LlvV4Gs5RN;&AL)w^DNzsw7EUauRpz?Pr&53-lPoN|MA6sMi+3)3)z?YD6Dzi8HA{x#n6E ztRvnlg&J`O90}xC*B0&MQwE`>3l<){br~HYke*&BfRvsN(KF}O?#Gd7L6%d^i_j)0 zUfxG(f(%-UZ`Bh?aeftgk=p8uGb5_OD#T@5*OQ8KU~EMpcgK3YdD=W`RcAQ}f1*Tt z%q?3fzVFjasDsAEh*nV`TlC)TjMz`gG2wEfz$Qqu+)3Ht!Avv7Ru-eEc|NB}h@Gr8 zvP*-9&ut}XiAO;DS;0!4{9!|r4=N(+17D2-Y;-v0^^7r&z(r zJZXFW>0((6`!Q+UNlF)=)_C6y6VZg8ESooM9;gC$%ZDv%W?AHcDU)-R(yg-7USWpu zhf~_N^=m!isnJ}n#vwA}f#ugfI4?5X!$N)tYMbAKr~^&@o8en;DoVaYRFJO0PfEG0 zj5tk5roe^=)ppTObM6ED!Uvy4ISR_ZaN79Lyw7vM&@UF2p47wa-XPwI6}tK0;mGuE zD=VjfSf$cvOmmkYAJ66*Z$>`~oVdh}bJZwX1-t5;y>2;!sIx*Z>K&^bj5&k}$AnQMC8@f78td5OHXqk!v7o^n4cmYC zfE~fNP=B>;YW8Nk7c|`R|3dP3`?}AiP7BO)G|~1G)O*Jm zIfRrA?TZOPo1WVfVrv3IlnAT7^A_)@}EB&58nr-d%{C zjWNQOUCdPxxoXULd=hzY(yLs-OROW61r1W2-vl$y0J|V9*gr?|vb$IM4wcT~Xj!{+ z-ez}E_S1yGzsVDEAJsb3ybz0~@VE0c!qpF%1O$$vSqbV#i@c>Q9t zMoK^DGcIW$Im- zsG%+wcaJQB2XVTj7QLN?BZ<0{E-~5P_fpDAo{NM|(}(g_Wvi^Z%$AmDEyB=-3=_Ps+%f@MW$Hbq6IhH? zckQ_J8sA~F`|2uG1WlTHy3ZyKMhG`rKbI_v>tQq9a4%!9{7MJ>kgpbfbqL!aU;?C<&!zuicg zfjZpULM1+CF^2Mo0cg|Ufn#ll91@u*=K|JedBJmmX8F<*q=g&5Xt1xT=U5YE9P-Me z4c1m(H;UMcw{N{Pk2W8XF-P?fhYRdLZCY%p2c~)I>P2M zJ}bQRXK-4tHiDo3FHl=!o`nEhL8BUS?sQkv_gCT0>N4qHfh~R;_cFjB53v@yQwH<; zlTCZLD3L$`jF%KATd0mU1dcXXkF^PH=t=ps#IcP9VuG{>mxM^P?C5dF+TSsPe6Jny zW>Yt_Q{=dD`~b_;`&~BY_@Z}e_KK_PUMi|8n+SAV?WyRHTtliu5qQvqDFJU4Hml~u zf59q5_4I9o^rgvQuffDpG9-9L>>2BeQf<=MOdZt&y4^SkoQiLAjyA^HOL+$9nkjOw z7Dg&cUkH{=*>?}ocN9#$s^R*vghtR8w%Ng)mKiN(T_c^C$#1M0e-As}Te;ec~)M z2jxG3$T4V({AOqwa(=ZzElc)7d4>rRvfiLGnP%kG&>YPZ2kFSX=mq`G3h=KV zDECThcmfns&dy#ou%nIQd)9gOG33kL9p~_VHgwyr+E^_gHm4K`I{)tSd{0Nv z9ISR9GQeph7^v%g_NnyqhOXllpv-ycZbFEaP&Z3pAEf70tsX75W|*n92zRggDPm^h*Pg{Ag1YT-fg62MiiN zcoj6fIm5;?Pi^t-45;XQD-(6Q66|3?Fy4jlpT;x{gj}%byw&9wJ`F+X-pi<$oVAV@ zSpbhF%LX}5)A!tG(`xrI;lV{0ey+88y+@8+Gvcx!LP)*+@!+}jk^ubK-}tjHp|EOa z#w-3z<6n1}-(HhXlLDOk`x|Ha@4xZu01|Mv?h?vu|NZ!1C;hWjfc_&-DgV>g|8W3C z9YX)84sYnw{qYL8ubTiXqh58E(t5G@#{v4efU0*ONb3Lc2{>|v`sq?GX8)!Ym;-u9 uqN?Zq?^{8a0wjZ^-c$IOBulFul%HJLJE=R|4KyZU;K$UMh%Yzvr2Ypeff*^vg1a^D?(R;X&c5&W zd9wHW3(gpau|6!SOJ`NhnzQD$!ju)I(2$9cVPIg;WTeGaU|`_5U|?R6AR<6haChJF zz`!8aScr)!%ZQ0lC_C7iT3DIDz(|KBCcXKrI*%7T*18{s7wVfZ&JRYSXbq-pT|kua zRTh;;MCAJ1jYaV3vv>up*cZFc;gPQ^4S>p4bF}?A-y;KFfBNKx@7kSuJL6&7npt~# zKQk%>ncrP;oLPYR=3|BgZ&5)4v;QOyOeudONW&E!?SV`I1IK6w{~1sFy&VP;5`5@L zlutbdDAuamCRM@m`4Iw{-s084B8H)ZUx$wl&5S-n>MpN(-6;>F>?W;4%dg5h@)3~% zITjY{BxNUG^CWX8P%~+GOFYnx@`(&aAhqW$%`4$7y@;$HMNy}Ir$DAV5;F4jeP`Xd z0Y>!BMNBRQrLmM9RYYQ%Ckfhp+cYE<1w00s!D^3GwibM)_tHk&Pub<0KHBbSt~O|- z-2(%n?X1T63hnh%kuda^*m$qU*kU;10bK)z?ftx_5dxb#DP0%H-$oU*ad`T|1jv7U zri~|L>+6hUEfP}SA{FXmT)(aDE{Z(?J2%P~nc6srUy+!df5#iCr28na<`G@U$&3>s zW2uPqAbp#{{4mt!DsSO!>JXUi6jO3qYcIhDCgRayv9-t`rys#Gc9*_>ZSfB5X_HpY z$vlXhJUSwdzIfaC4tyKmd4Z8?wD!71gyJGEK-%E7l`r)LDlA2OGrOZZTo$1}$vYN$ z-uRQ~B?{)u0kiaUa491rA&mTL-~8C~$;z-`fcf1i+pF)VYe5-92d9jokO47-6~7ym?LuAE~K3RSW`pNzo_ZQ)G*n!BhsEl&nPbG84wD2E! zBjbwZ0H^n9QF?xQ5zLb6IfoP0dnkL_dm>i^55&R#pSn^ENZ91%QE8Ckqv(Gp0Kc-8 zrbMLhrvQiFFyhH|5g8m;de3QCA-mw#5j0~g`X6`R7==`9@{lOLHuHDveZ8sCAg}Yv z2IGYFgz<#NhTs-Usnc?!^i1fEM}WNjm42{ocXr2WH=s}H?G~atyp$-bpIHC91kA69 znSqCaz|Qxdvdo2@Xe2RJLl48YyG=JFHmElE--hKYI8X$|x#kO~@b1&?vs-+-3M&!j zqVb4J{?@Zqy2a;!e=l@T8YDVV*zjqCE;XSv0b$T>5PMLH@Kfh1OA74 zy46oFC8Fx*YBFEu%fMw98n~rjONf4@l{V>Le?Qps?73IGoWDfbB~OP4qp5MIp{QyX zsFltXbCs3lo)j}HujYB{d3_G}vHm0Wd!_1TWN#?Vmr05E!ba80k{!9Gx67GXk}QS# zIWZPR7WWomwdfYt77Aa9&85EDj@wLlmxxUP_ud~IP3_MRPEJpufptq4^B;v{a{9*Q zW)@3l^SEd%J@zt5(^XN-S+I)+zX8CLEH{X_JE_8 zg|1Gqy@><1_5HoZ-s&Ng?d`)ad(*q6Yoz(AX%i?joU17^dsGoVD95#jeIV*+b;>rauP`lojA`;&(d z1ePG)Q{xa5z11RoU>s(*a@J7d`RM89YIGNZ7!w*78WI~EyU~9_H~*9R6WS;23B8Ge ziMW*4Y?g*)J->P{4EZ_6Gp+HXd*;-6{>v~;`3bi_5wp(T~+xSOONRMnUiCJ!;2 zF#*V8!eXLrBO#s0re7+1u~U#duzTmSj+T$qNw`N9M-gXJwFkYj_A)fm?kER%Eu_HG zRhAB#7j$Fs>Kz{O8_5n7CX^p}YMGrsF!7aAlV+1;d&iakR@&C@AMe*lonT?b!a;n` zK%#!6#YTgQITKDXq4G)U2POFKDjcmRy*ogYSu;_SygIKcraVD^Kz}~nD5IKs*R4$H zM5%bZc&@lf-Lh1#-Q6zgF-^=ew-(8=d3L{KNS`}nH(k9wt3k;5xty4hE5XLKoz30I ztj*n9?`523RYBo3`|D1BzY)cBj3?h0zgw|YyhA3BI!}fz96hEgx(^HwD#Ofe4|&@$ z+WySL%flyb3__UFgiXnooujNLx7)5uwq09&#MW^T z+uFvqoKW)UZNqIw>yhXE6mA~_Z8>{coql!m%#7vY;zRLqd8wC+m-Xy%IcUkQVPd|$ z0y3;Ho4#w~w%p{D?)JElDFJ#om0W4%t}qsMh;cmad9Hc1B{LRG@l3fzy!?4qxwKhD z`&H?eH^)P%gdr`j;NHi%N6x4Hu6H-%#j6tSK7^w_l5T1@I+t!;D8=}NlAe+_EjmvQ zcZqA$Tjm|)7d}T`)^`ux*)~2m(LIr9?O1K8?%Gd^+q%mh>9@<9?>3c$@_kY==$?LF zRK8$us*dgMjg8S(x39G&__@QW%QoZ*`vxbv~f;^v*tu-^y*w)a5+11((YTv@Z2)Ob=U#(4?fE2FQ zRyK}&u7Z^R!ieWC{uj0S9AKJ{57v z|1A#vPmt2w$;pn7g#`oxF@rdmZ5_;5*m!w)Sym0u61QodhW<|1|V}{{E+*CaxC$w4v2ld9A;iPZF7QwO|G!`UZ;OAG)cn6C*?BnsF8S9l z|65Xk<<9{A8qohp>z`DpxP*`eSpJXbg^(AVQ^#OngkfaFMLxT}I?8g0N}bcQ&*xbVN81vbCvW1eH#Cd5$R ze?6|S>{g$#{+nCy6(QGg8)D)sEX;pBgj~PiC@En7evY$zQPW-Y0|)TRS@$|pS zVqyBZCYjv-cM&n zC!NWXyw7urT3B3=XQ@6VJ1K#)(B{L|TSqBLH`15iT{i8_Cm@d9VVUdO>Bv-@*<4Vg zKH%Qz7qQ^KhT!J_&zJ0o>GN_aMGndndS>)q^nvUzST;a3+zPtQ6dK)*iH(+svwhZk zJ8Kcp7YvcZq+k;9TQl+EkB&Z+ zTti&@t`!;y7#ghl#H#~Y~Gy?hz!^j%Bt~A=luk1#a!;v(WnKLzs|zF_lG=F z86{S&7#F=rwCp%67Q}xM`I`Li1(POe&_Vw~0u+yc)6;yJRa|VO#y?2vlA6q{P_b9Q zQEDChuG`!YjdgaS+w`7tk07xJPwo~}FTp^M(FPdx;R-RLRdUHz%09uf+|!B$in%_P z)%ZiIDU(czcfF_w%sL)kYj*mCtXn8W+Le3VG(y@mY8+}IgA7e#>blg9huVh5P4s`Q z_VE*>IiZ|irp8~dxJt$f$Ls)J#tqzG)gnhjDw=%XdR}ZQ-B(ixelNAOs%_#|Sy7l1 za_(z3THe|_lD=imY*kU>p`!KrsqAgxaFJ8^BN=o)vdYe$A zLZJI_%O*TB&HK~c*5)A{fbNh$atm81ztjj-82&_OUz4TT{6I2=Gn1E`H;x8JwQCV7L6K#+U%IeI1zvC?yg{dGJDKVzAL!_j2fYzL4{ zVsMF;S!VTVTeg!z>wf80Y@0?W5+zKN3*LpMW76*sz?JBoy@f@uC$D_?rHABW0e%m0 zHyE8p4Id5iB&5IXZ^@KL35@za?7}m8UGcTLkM#C#7ocyZP`~;c_jwmZk7Pd)G+MOO za2V~aog5TIyhKTh<}*kPC}FfG>lyVjXviQeRk3RN4B+-Y_zc?f!jR~lSxSt?&PzlW za&#p(abHTHUtxK342WneZxpv}Cz7~J0^!*5XxI)R)2tU3p#uR6 zZAo(yKaJM(ob}%F#0MF2(8>-m_S9`4s}(;HgIYeh4fc2L!FeuDHGA*6n>3rAend@f z_8QC;yWa5WPz=D!3JSSsT?4fayx8k`cCAc4x)1GMRKay$Zx3muT#Zid`$KE+Nj-@Z z9TNmVhM!sbx&2=a{vwjZEoPAE{F=>;na2~YYw3Kt72HqWyS}RLwLDvW9{Z_haP2yt?n)KY})il zp%SQ|LAuUlNt3ZHB5z;+cqpme$@=wMK@-b{`$wls1_lTrAt|C{&x2R;6$2uH1%YQ* zUgBHh+LhMl-AAe}w4i3GSp;tWszBvAh2X2>!ziLQY_)9jM2nN%#zwOO_|%WIkKB4L zk#!sEn?)GAHeN=xdy8~s9kC+D+LNqXbhM+JPbd3k%L$`6;0Aq|YwINcf*$Ip?GH1(h0i2UUDzkP!`lEiA$ORyb}O2RO;KTIDhAC`79axCGuc7!R%N zxh=Nd*)Z^Xj>dg)zrI+Upb;;YoirVB=-Mf*I1(^;al@~Rwr56oH(T=K9l^&-h0?~c zxHy4oop%dyS7rJZ1mN-*fOeH$ zjcn(A8l@ovdY$vg(|7Ll@0kVSW`flf7kXjXJ&%!5!3`giG(2BzXFgilKECkvER8df zpEooOYww4z)}IoD5lfYKn|jPg<*nYB1!>@FdaTrOjCLDLRal>1q0Qc!sc1~hpV#qw zV&)fzWhJzWI`Mq=99)0doEK5oLsbcFnn9cT{gFoZr`jVm}3WC42!e*3d24H;~ z{;5*7lsA(3a{>cDq(4b-Am6_IhFo70%Ngg3ui}nWIZ*NWZlS7CEapw3|d2t*dWZ+~0uQ{;Yza#WXhIT|l_>%amIjwRCwOa}P&C_S$X zb>-;Wuu*Tj&`fSnZjE6+4(`*jP|id)`Ta=zSVL`+j)1$-f)zI(yVE!F(zag!OO;Wc zvuK8=KH%+}Jjah?J^};BWUV4m$1W|X2I5zPrU|F%3RgWhS2Fr~m$q6}Oat6+uXcl@V^-u5 z4rlY~2B4MeBu(e8sjcc^s0Pw6k32gI>BvA5# z>l1K4!ZOB4l{Ypi5!?D~Mp?vDitWD%P`fcpIx=~U$6d@)GJLM`Dw1e0aP|FyTh@9{ z%(sn@n)5;HKzuHP-<8La+=G=pkr!JZS4ys|aIBjbt%_b&Fcwd3V)R0NUrF%V5>LPT z&r!a2ru)7&!5T;B(ND21J6F0s$>8Yx!`JQ=^x1?O1Mv%ft_+#VSq5%u5Lr)z!OQ-oPyg&w;R0y8 zpJkO_B>wG#Yh^+`Wi=L9>VGGT=cqv2{Xk6z`A;`X6`^7%#`k;sZ-<*wnI771;@bqD z|8!H07Al762w|juIlNFwCqUbkMH+1Xx15EGvA+Q)4wDD>9Di4VjAVEH=ux)t$P)CZOaEw@6w{*P!F1bV!TVE5KQT$$Q3d5t zTunfs2%~lZJ)S3u9I&!%-$z;?W!rKd{CL|AInMID7@)Z|f>%4PWGW_^5VL7Hm*h4X zOi&TJ@cijQ)WtItlzAg?>`mapuTclNr4v-^L{7YRyO9|b0dtlX^5r0#i=|FLuMVDE7M9fP&Urg z3HU7t7pu#^fkr87DdA_@QOMQvCOO0owCt=N-(`MEMvtPZvFM>E4WWt=*kEqEGvqcK z&7d(URDmdj*Sr>((C4fboKzeYxReK74AAmFggG47E?wgF+oXq6uB_t9=)^kYDYd>l z94-@@WvsvK`n>ch$>W9h0b+r9@^*T~3-8L~}69kg1cN;_L1m+YX|ew%^d|2Cm+q00(qun@^@e>^t; zQtiRytZSYdq%&KltNo#g3m1d5d%rOIL^6_K;s^MPj3M3Fk15TFY842cqINU5H*Fzn zVCX|}$;OP1qr$4>Q0=V4*dkH-j-paaJHuQ36$c}SjVVYPwMc9rZbZ2nejje=}Mpx`YBnGqHspygA0zhrX1MD7KE{Lvl zv1@%TDp>M;1*an>CMF>>^lKIO^-{C|{(&_rL3L*RvWqr-IvtUWtn=j&Xhx*2K2mRKs<1qL zCDMutWv=Oq%K|O>zXAfWW{OH&2!b`sN<`~#c!!i!2Wg7hsmf{`D9XEyp34guj`>W7 z30B+5K}+^0cbhRFpQlaoQgtF2<(vUg_PQn6290k!K-q^EyNb`L$zWX z$cN$rPpg)BXs1N#h@R9vL?dZVS}O1*-*~sN9H_>ltmltJ^Zo{r*9tnd(ysm7U%ii^&$0$le1ZZW{vcONq=Ty<0KAL0US0D3v6=EndTs^2(Y90lKz7h+>^d)|FNw=yBpab=&>U z$;;y@sD8!081#}2xz8?BFV{O!Z+}Q!b?{Axc5w`p&uGD6dFyV}dJV z7eg$klQM4t+8N4Qz!u&29`AtARP!&8X+W8RuEu zT^fb7t!(?#5Wo{~K>CUs4)AzfuOGI5zngvfaDBMD7MWjZoXvS(SH-{P3%3NF?#<`3 z7|uArpkD_HFxYa4ss3tg&0o}-If43t^M|XD zms`DcDhO1|$Ck&_9n_HWwL|+bThJu797KH#n;VJFw?~m(#z> z;RhK8T->FvKJ`BL`8-MO3+*C}^6rw{US>m<>PuP6yGN{;hwX270g(A*?bDT3Ip8Pm zSzVCs7@b~7i8U6t4llP9@3&nEJk9QM*vYJ+AX3{mfo8DSYH##B&n0{;Q%#a8rP|O7 zrg0s+*LngmiqR0mv9(b&V(T6h0C&IPFdBNG{!^yMNn;!N$iXBcZE4A#8RQi5GIpz8 z!=^SO17Yz#M_JtgKcv+(jc6i*M-OO^!#VZsI$ocYRF7UPM$TbGYxqdH#Uhw)@1yjy zAcWBe->!I+m;2o1lGnWWpKia`DP6KGZ*6frAhFKm6D8D~=SX6#UvgMcP$Q-STwz#U z=b%s2Ten`%FqdF!nxrJ|aQ?WHu?!Jl04KB4REz|&i*`Qr+`7Kptor!)D6$kSfgd2v zr)`V%Os-Y@MqOy!PL?H=!K>(!f=4T@&8PaMkzvV?1YFQIU5Zu&?$!ccgp9bK*{mr_ z0n(PlxoiS9OFXxK7PL?duw8aZ6E%K;(Lxg3Yw>`shB7euwYZdP_Phlmvq|NQn5(Dj zFhG3*-4_?DT|yjsEL|^lcW3Ku@|(x#UT~!J%o(l5g^0%%Vbn=>`kv=Ov)UUccUiqr zX6KyLQ9})KmYX$+(9PH1`gqdJlF!J2Ulu)}E2ftpcqH3Zb|CZFTnZ@U3$adGBx^xzEy}z0bpB_R<@2&u>~TGdDlq zM7CZzPhl?rb!@5IDtx5Kd(oWHS7;)iuMYRV&1CJt(R<+G^n;jW*L7YwmDbK&e4Bd{ zH9nCtenyB&Z;ZgpC-I@DdQ9jL0gY%&O#}EE!!g_I=3JJyq6mIi4T}p6FVD0v)5SrG z+^a^tg5Eem2?yrHXc}w~`UXH_v3{AsAxtL~7^c4{HWbI37==9Wo6UYheD!W`&MFDB zhYSv$8ueW}9i5Z!XPZbAaL_lh(WV@D4vKcj%cFPBnh+^JiFB8e&x7jftM9I9n9QWO zHvJr;4?ipD%24t0BaZE%CP!=enUjNkZdYzRni8C_;zkjj`N5$^50KO%NrA}a?m^12EJtI*^e+xSu2<4Ie_o;>6% z1aQ|>vl-3*zz)RxjtbrR*DB+hOKd6zB77EGXCeGc(i|4zZep)GLxrmbVS1f1=t}95 z2?o@4ofFmTn14+6 za6P5Eg8BW0)z{F@l4UfhtEnr!Q9(`jy?>gLGw25NkdTn*W%UkR!1P~K7)*yicbiZ40&X%f{#eE*aT1|&_x2^S2e_A5b!G~ z)5XNoU?a?q&^L?<=K$%NhtY$^P`Y@VsVE8yJ)BKczkUBldeVZE25r?KtGv|R{Dy*I zcyo=5bXvq!fxLXdbb0>M1c)|KTMMGZ+m&2l{zl&4s`1AO7mgP|A^3qj)*^&ZZ-_s0mJS~_*P%qHh{509|k&%WF>T5Heu zQ5h_hZ@fF(@ z70ov00e&x>5x_bdiE@K}wytWyMU4-7id$@Qo22J^fL-EGR98z$bJf|=KbdI)>x2@X z?0O>y{PLpt24na&O+q{_QKZ_sQiM3m>Q}rUkM)#{zodu3JxxH^{V-8--lUG(& zo??4X@PwuI@uw334bEFxax`zK!RH8h+6APMHjw8v_jm)9GTi%X0=AN!!WldfhGxg~bHPk6&? z-9e*qiLX05D8$1|gbVY;8zHhOSiwRKi2slf;4fcRK-}E+qj8^ztRC`Xr;dqx#=_lYKkk^Igv&}KSmyT=R&(}Hus(+(t161^LFqKDQLIxzboD`>6-zLoq(C^9cd1qUVAf3!Ox8@V zIqjVkZz1}mA{GO2F}B+vYnIJ{0+H&{k6N+bQc5p+V8JxYf}Yk(r+xU7X;eYCh+9{f z4A(^uXn|*w_nL+|FpMAjfrvPSaE#}6@UrIR_mk#g#i@&lRc?#Mvs9;d;>Dn0=%Z`8 ziNhNiB1?ixg^l2-<(Qb5t!z&AEY{I?!0dq!+G;P=3zI`OA3=TNvL{;7KKy~d6Ny^Jw&$CPAqG`1jeW9?gUss7gtqnD zB)dIODyHym0ZBiK1qMhz@O*l37kc0Q8J3SR3Bt-eEDKM7i}vk@j;b)0)l~ebZ_zA)^F?GmRAuo2{|#1m(xkSL`^jrf{sj1e|Oa{S1=m#l}hGW#_>L z>-oCX8gKDPITp2*_wE$)B=))ADQYJbh}F$g%DoZTBTzu96bbC0#c?EWPwpwJtgPJ1 zKu{n#`a+GC&!C6LGrFOeR|sdgW@Z}XGmzrNcRWIQARX7YsH$h9cTm}uQCjr;66LnZYyxBP)4hSRt8%HMZt+GMqRcbq{ zRWp9O;TcwWBKBD6^Ch7eOHr8yAcXj?!d>`fA1<{3b&-3&Li4!9MOuSqdoX<7{(y~fiU zmgKM;!6RHCGJ?k@q)A}%0rFER)X8jyUbmNHa zFb02_kY)3chvBf7^G=PdsI#?@D{jBZ;0)TY_0AM1EXXt0kLU8%1`yvs@)?fXYN?#4 zjDpLg()Mq$F2u;qvm=s7U*fOSI*nRP-e4n;Z!1A;`6E38FJEH0XecxTeQ}LGGW?8G zs%2DQw}OFXHC0yj{WNU8w3KJaN{nHJ!-yQBI7{U9ld-$QaC?)shR0rv>W8mp0Uh^Y zGOjlPxdpW~YRYHnq`^-rbF;Fq5uudvS(X<%E^#xy-nuYceGAZUF>7f&(~Cye3G=f! zqtBC(?j${HgpAZ^3BqkE);kQEBs|r#E+^t-0mjr)F*e|DUknr30Ev|SLQiW5E5{@& zO3%h_*1b_JI(12C_x!vHH&A(ZPlv6Hv5mDIPl@-$Dt;qo9>`~g>Kyr|0W1Jz77d06PJ2_}jsO+a~rJcWOUw1ijIo+0*6cO1xP;LIcM( zfwVyql=Zu{bz~Z5thalX|hdD3>6` zmln#S=5%YhcUGYdWsOOz5F1&dKI2`73sEUtBmfBj>nX5F-JJAfo60pT3Ub6Iz)c&i zmlDs5sb<$jquJN-x^$))0o|^~(&xQ)j0sZNNa%;U#$y^C?PQ$L&$g)>Kn zPBq_hLKRBmoLQ$x%KMyXwuzCH!3p%MUgb#Y2P(4>*1!}Pw7!yYFD9=O4H?rtdCf1v zC9i#gQbo+WU4k^y1hY;`4! zmX$$r(@%mY!VoRdV=H~ypOFyrxR!?LXtJPXzr;LJW|suq=|@^jyA@IcL^QCQXsnRv zFg>HAJwUzgdLO~>942-|*G0Eg;b&_!6{eNOHW(JuTAj25HAKGnJ1LjZd7kBE8r$cL zVso2S7;sw6v9>!|Sr1-xCh~=N)a3!E#((TJm@6S#NOihw+rmStQs74&yo`w{oc;Mm zxR}9W-ZK2Mm{0u}yS5r8RL@-Fs_pbFb6Tw*@aeCK)ttZyC=4A_v^c<*@IVD3i`8L- z&OiW;LDC`8;sKWp_&_#A@8Jy?!DBGQPoN0(JOFA*69lJzQKK^&&YzT0jsYsASwN;@ z^V@a0uN0-&O_V#CF?#T}n;-AARn0)ohf0vnE14CS=c z$Vqx9^#J&Km0=+BBXV)93V(xd+f15th;EqX47JtOS#8*cfKEakZ4ek0jEi<8K(e_n5pkQmG#!E zcUFAZs!#Li;+vhyM%3ZfaCP|Dw-$__I_*8a)Hnb;JKP#lDk2A9%w%5;I`dd|P!J*S z??mE;qwWe~n#$ADURcD{N(4St))N=>fh8M`=D83EMyF6li31;Bk#;mk-#0{sF@6~fCIkb#$H=tb*z4T;_rMP5HJ4QuhIro?yTdFx9FnVAacfd7>z3nR^vKloW z!rEcHA9f4MIIL_Vqe94qi2J=$kiQwPU+^lU!wr0+et6p&;08gAe~EptYBy9`1_sRq zp2ZIe6_*2bHiju!m@9EjiQ_vTlD-6=KN#*8lFJ#TO`}KL6lhw=4Uu2d>e*QBDiX_W z?iZXE+OR27c}m7^d=({$@wuGqTH{(a7QqcJC2b(wB4@LjMC>)N6gj{5ht51*J7s_4u~M$mnDwrwCA1L z-LTHM`K?_)#})HU(FNzMZ;R6Fjn5Ru1I&ms%OEkz>kfl7`h|OHZ$&Pi)-m=+zs4JYxpT}>SU|@38F3Y z;hsaQ47icU##O-&Ypg9d4~=4+{llw6pL=vz<2#dJDGW0LMH8IJaP&OYx|hyLKtQTZ zLO9+a|9t0Ax6a#F!;exaoOB=95;>TMr&M#}HoC}PCZBq{Huz;pJogg1UQrHMKj{(S zFU5|2vq;ijDy(Ge>)Mbt>b!hki5ugZO4F#&oSax#ViuU(D_HCq56-~Ba7KqiqK;Ht zs?&X+XseQvKh}`W-qE^~#7X0}NxkayPy>g)*}I70woP_S#Z1RAm78y7UoW#7rLN*N zNbDkjddMI5zy$vGMcvirS#J&<3e@E1>SPB)ek6QJ%FcI}egR57T;71TQZIIiScYmY z`k34l4LNIH<{EO zDL``{Y1y;@4Rj+wrU&LptY5*hQOWM}!ahJnz+j2W#gLD$dHA*?)MD!H>6*P`5)=h#%GAyi^1YMZalP9wZmz4$!dlH?PR9s|U=s^!6kverbSO7OO zmE>uH=unNc68ThkqwlduEHt=S8m8ABGWPY!9zp6>7p9Tu9XY+vIeYnn9QEg~z$blC z@0-c>E(6J%XopMes=?u~-TGKEDg+k~N}K)=SH9|{4I!qnZP)ibJ*^IJmGpUUWyY#6 z60RdFzzt>v4Evf|0wr4Dd#aL#d>NILhLJ8orr{qeN=9+C0;AMXB)ni-k@W%;`@CRQ z@Wo&?XF-CQ+xrOhm5NPZ!Xbavg;-kkLu-vdY_I@0p=$6VJ^}wC`wJ-kf&U@{Pf3Mj z3m5QIAk(5_XVwfmHyF8*^`%$y{D)w5jd3DSrD>Ra)&Uq|bL@x((6pdxso9m;PWm$) zTG@RZfmLg`RV_ttUo$9#Z+#?_)LOAi#MFt3K zzx!4vSXP=}UJHKL^`o|*LGM2V!Y`~8$k+H^uZw*DLuiQSnEYWkG*`kE{=;+-B0|#< zej=;oax7)=I)=N(YyVs9udvMD`bCrSHw6bH{0Vc* zLxR+-jHisNro{f8(eDGc!Kc^!`58FuRy8WB=!IGTAzD7C3zPBZL*bZX_zwdAE(^s- z5TMw}bk0xK|IDpc;vcM~r@a3^xXUk*oN?`mUs$=F|I4HJSxo+DWNEwWJg-v-L!9Dx zwQ@04tj;pq>T&Ddo6`~@`~}gx=Lht={KWdrgyC9~3U(P=3|A+XYu#%wu4+$gy@6`Llt>MGxKZ7#Ihlk$j z^Uvmry}{RGT3@O+b75)O2+4$^Q(8Qq3V|mWcfccw7~KT6{j1ONN7<|C_UvJHW5QE|D)A<;0YtD?*G(+Bmf0c z+S-q&isCm<6V>(X<7t)3K#aKC`V3sS>+%24Qa?#yO?|u3upe!B(Uwh0=K^1bV}f#v z{|s}A%5Q(NFuCgaPssIpR)3Y4d+BK}FQx@JS!=0&8qB=|Jd?h_-or!_a4g(&xQoS2 zg^SDhvvGy_DSu;Pa`W9~QQxrz&?@e zcLa*$#%Z^Q-%3{?l z!{f`-fL+DNm75=-ufrMnNer~0zf&^X4yis$7B7$n44GcIbA={#c}BlPey zucAv#b+a!9L?sz%2My*mlegfV5j=K&1w&&XN4?RchZ;?b&~nQQmgUE~Yz=Qmq4>of z&(G<(xxGJl12_g4`-ezbwl}xTi{kna6xj}qVfJBw`HySj+tG=+hP|GzXKi*fK{p&p zJ9kh9#O1Ud(x$|a80!_c*&C((JF_Q1e~BOlx+a=GyKUM)F`fNY+xG1w?WPbi_kOSI zX>}o4M$d#dOYw>bw`79uJWHvOWP%HQm9u&tiJj1e*2CiV0L7D@mAM*zjyD z3wjHk9ZU*Zs!U)RG(Ie?clm>wj2Shu*E~r1ZW-+tB)dQ{oF7Uo8Aonf&sRtj0IZ)z zur4*YfNzqQfPo*%&!k|!DZ1}PNr8G2*Uv>cvFc%?tPcry!Sn#MWl8k zoWWgeEzPp*eDzPb8g$-+|5&ehb+Ww3u&N|@oxts+$hZGq-(H%3e>?C2-XT@|?A+Wm&py)tKR#?KsMN0!5eXi%Y7)xi!|J zMVkH)1%EH~vtTRI2jABqaIw9<~LtWkaGatOHT>QKL-8qi&r?4;zz zCSW}M*`X_cw9;vku8Zbr-#qC<1Kri>R!?~p1U`pi&U`A-_Ui2W)gj@(q9uh6fQ;15#%pZ3l>8qV$i_gXNF zUNU-gqL(0giC#hyT`p%vA=2 zF(rmNdMNFFjMqQRXpVJJ6HmfhqqY$EvW0GTkX|W+4O}{;uCSxqkdFYRea%C%6)=XG z5};DCVlPvAUQLCpSzg0ysj#|)7eyx)xRSY)st;qMZ$F6>J~P^0oqSuq7m1Z?SfVgH z6J8p^Yb*=YEV6gadd@U>N^Nw6%ee?R(5k{A5!7V@0_a4Ms&Pdi?YoYf-FTaG3gVO` z6g5w_BNf}lgiwiBtI?Q9gtzoE&lO^1j{mGablCKw3iW5R41#T- z7ALHGM~yCs)HD)c0&8;I z+vA^i=r4tDyfss5Vc5*fhp_X+JEBI(*GdiOx6}!FY@QFX=sMvD8kLk=-AZr7DUiuO zV%hcfp>LiUZkob*Rb!P*$r^plbU^o(5G5%AnNnm6K6`R1CE{bukF{zNCLiI(D zpM0w7y^k5*8rwSL!vkf%-OCs6VF<;8S*8>;RGFmO)sXS4w~EOQ7BstqCH?qO`fPn| z52mjoxKoAhi8uH4%omfZuE7Y9>`IuHm*O*T({dGCzIwM93w6*i4{}uMC!pd3QVLjX)yDDHo||pmq+wTY2wt{LrA*t5lIJ58?2r{z z{BE8hw`m+ux#H826U2X62ZqQU65H;$K^!D$cf4QtBVS-ir1;D)!t1MB8&NPJe=w{Z zjD&J>vP4X>Q+axevVJm)kCXz>`om#CC6LL7YeTC%&V-^v1{OiyApiEoR=#AP+72jW2i z-?vE9)+?18CfjZsQrN^{c4J9*UsOk)s%c6rbVlRBx5+V}*a&R8!jnm{z61+OL@Xbr z??|+%hz{>}7DHSm^LTk%gl3NZHx_t?DegUkMwGIhrr@J7BWt376u$@|+`dbf&1MHB z*Lg$Cqh2>RFJ8ifF(I$DJz@^3!RmspIXur<9{Qzg4n)C?Bw^AmiOy~{e49XucCYDR zz_npc!)jKembc~gXl(Us+r;-f`&}>E1%-QVquTwz#GpR;rtHM?m{NOF=QpVq2bFH~ zpM6hadCcb4U0en+akCB3HGdu2t>5k0{kdycvMfB;;$s`$ z_)s<`J%5;Uh00vIdEch>-XYWc!V(Y1uKunzJ_Sd?IFiQ!(nSzU-T1siZ=k}2<^5 ziExJ*8C}CC`I=q7pNbi&kSv~BFwUu7JKdjaO+@khfEkL|(wp_8pxv&TZ*jbxRPoN^ zqqg|LC?R4QX1_pgVGPG$fA7xBaP*_8DR0AiEB+{^e&{fsxkcX_KaAFXp(R2wG+94BXp3#OFP&>c>4fkw8c@*H?Sl{q!@v5i;YX9hFg3McaU&P}9A2kQ|Fj_p_RS(YFwiQ+C} zY+2!+`g)5_%8aY(eEq(Ggto&3w^S46ZS#2=8g)7E%%!08zNU1 zCrnTyy-=AI6)wRPTM7e%j70H*1-m{91_ll8@~a3_3Lad8=4G+9-uzJVKF1b)!@Elh zR<_}zn5|3VRz@we-op)KF{zNRQyq0Qxp2P8M&}fFTmf881D6-RVuF$Go(W!6-qFXe z`Qn`M@P|mH#65f1(|sctZ5hMj_Vs2Lu%rxRflRmobeBO1bb9W1X{h~^k{^pQ{4m^- z$Cl%dTyU_%XTs)q$vc@%E0>^Q5vaaz)Caasbgt=z zCE5-xTm=oZtc7C;KI30Krl?L_xleLX<*%)gi!bxO7Mw=O=a5%4hSgYE?R}Rr-27lS zxw1tY%zrtaBp-6NdUH+H*Y;|0W67YAe>9HjAsDksT(4|jKUQ`+bH{li|@_glP?Fwui#4ay1oa6A}epred#i}OQluymhV4D4E3 zD^FQBBaf7Ea$yuO(Hha{5L#vwA!-W3`FNH{4N8AX8cStPHxNx$^%5o#9ws=9R(rFD z*~*KyMZqa@FIk!9(TH_Qy3%9?%s)96v^n5oXst3H_4q~61O_id&|QC#4Z)w;Fz;^P zoQtpN9Q|u1eOpeXrIn4KxT~brC}jH6)@pWgxNILZW$XG$;H@*lu%}1++A)P$@HaR7 zi)mC%jF_E*s6$QI?(=uVBrBc>_jB@y2_qF*4&?4V#LcT?H6oUqQ#hg@EM5-hQ{w7z zhm$J6pFOzJKQ{R-hHoPxSfXCZXH9E+lKd9GHeVvZ$5~m_2Co0z3T zbs!naCq&zDJ0yGZh2&tOe0)nIpQhHhTgzWMzzvw45d~ikT;qUS>GA!~D7}ax zC`Vcw#@`P&R|eEp4N>d(3P7JH4T(i5nw?vh?Qi0&HjRI~`cgL3r_$>736kf=1zEx$ zf2ucy-}8imR@8V?v5*zYB&TeE9QWz`{nZUCqLj8|F;Wg+tG1y!-1mA2D_Q988}dA2 z8!xL<#>QBNHw}>{gpcRZp0ZGXR#FRxIlv%{|JsWJA#1=Pc7i*7TS(_gLtq@IZQ|x0 zV~Ocqnl&yk*tY~gzYcjkmyFP5mIhA$eudMTLMPr7f(EvHErHI{ zbhG!Mr$i)W>3F^F0$XiRyf`HB8j}@X(miKxYZ-I3D05$%M)DQ5R0RWDL1u9^1048&n1X?DA6hA^7$0mzCD2Lu=&a z?T}v-xw(kW;fo#4Zt+iVgW2A)^8>}eEFG`Luu*3I7bj}~{7h89B7*;4?_;64+W++P z1T89Lvg_l2Y3chJ?O3IC%UQD8X)|DsJX+d#`0d%1?!8YhZ%-FxyO_M&1LX1@ z9;0vbkY!2jeDt%U_93QUY{#J@-&!edO3$sgqP9~ zZ35rFT&dlkkEw47!;_*kj?D)|u?7dC6oJ`)oX*%T3#?Rtmp8KHZwV*g8@Tp)|Hpb+ zeOW#D#)&DX|K8?C>dy0A|6V#t&K$3#a*3xoyE|Rxs!-N&w;rXpF4I%-Qk$!I4#fTi zmK1-$O_jD?KllDWZNIQF(mNg93m{sbGU7h-z+h|D@EQDQx zo>&i^$T_RvZpJgXUb2NHSF|$Wmr>aJxLJLjC$aVBErR^N)_B! z(j8t{LnX>|#mU&ciKZ$7yHcA%oy$s1d>Su%XdjZG|6F8HqRmrws~P)5#z1^f_6Ql7 z_7c55+?wZRV-v7leSL8qm=PINu&^wkx57m^QhA1W>5DH< zSyL^62D8;k3l5Sc7$eXB(WbT>MTV`fbgVLNihxxlM}C zph|i{MSD}_?1rTR7UE&}Ny;?gU5}wdDzN@CHL>C`7Y<)O(3-R(k36+%4Tl7e^gwCL zb_um8)zNdz{8DnuNFslF#k`2q&P8F0Catk8njG?bN%J_bPT$$34Utk#TPMhj@ziil zault8xmN}a=ITLGDKabjis0l;45qPj{V;k1e1i%-FIr?K^Nnb%Vqor@fQdh|#3iO* zjk`?ga}JR8F%%LJK1@O#8AH(Je=+2>wR492B=5gs$X6Rt^s{t~_L^5e3o2T7$QbPE z2I^{Q894+1Klw=-Iapp8$d~{-8c0(yI@I1;G^oq;2sl=!dE^4)%eylIa?wY-Oi>{l z`#aO-afaqpCf!eK!>MsQ&$iJ`W0-c`$evK5!cox>+?2=AAcMwJ7dM)~!5Ru*7tB+F zYqeSu9GT=6-mlhE=bY7#y{9Ge3V^tJgq&y68Ink zhiLX_EXQS)=?i9aQ|YcIaDRVH2X}()ZAE?vgIiJ&o%K`hq!B=`P1)aL_+pc+-5`|$>CM<_p0zP$a?$nY zQf(EV6Nw#9Q!_DAw^27@!D4w7@+`u~CMf2OKz-{6*~pFYP5sshj>e4cf}1PfnL-{5 zJpF?di%tVl{0u_YS$y()awy?uTO`Sz-5!2S1EWVbb7KfXF;;dg{1g>Mb0|NFH6Stw zeSJ;re~XC|22aIGsqX}JaO6U9uOL1+>n`*v1W_6d-p>$fwrr2V9@hz{s|hVA>3pl! z(Pq~S-|9DcEz-um8zVOlv70j5zQRk1gkn=JblRW!NVFvg$5uvI-86A`>QsjXe;tCN z=>4AyS3MiN>TP~jAoT|!HaaK7aa-;MLj{VhTC3+2m`aZyO@ZrY9}phPyMz{j8yvEJ zxL$sbGcWKpN#q6O73c4lTN+{x9=rpO4W~!a(MDta3YA6`i?nOw-G^&r=1*BJx}|Ze zGX`!cG!Z2pc8SS@%#~&{tg%gp+W@4wmc`Va)%{}yglEX^@b00_q2D0}2gfSscvrCx0%$oR;w9Us?%TMhK$Jnvi3>!RbVAEu1yDmHo6kE!XGG;3 z_CEfFDHV$jd9mK8VT5(WX4b-$W>EPQJrxcnYlfiN-YL3X`*#{#bG;z{byk=tZm;uH zX;7CvOFsaJA6*W3QXjNL*LJB)P9kgKBBxg3jJ?WAxH3t_qlGnOM4ZELiFVe&D!~#> zF|(O_UoS?UQo+cR*ks~lQP!vxWQVoWx!--ylTP4g_Fi--CW(}8-e;!3))tw^zt~8A zQ;Xr6nWqvNQsVdBGpHlyUuq|yHx(IY8j{_ueYAqkP6+Ny6;TwcwSGZ%dNX*30?@Ip z1Mw$tHIEsna&P==n@Rc=S76A6=khidy}ow#E?T~nyrM>-zOn|86KT((sd3Nx`9axi zx-uUDDCZBm!x6V%xf{K?Cz1Q_%|vv^$f z?^YHh+d0ux9rc%ax`bm{d$)zBrf$uOGsxLFuCD3^`%wu@=19!CUP1;ZmqBT{D*JaW zyhrtA`3+RY#kFgXRiFfd;PI+5eQ7AdF+y)dJCYl@ z7nLre)KHd11q&8Ol~R|W-0}iXH(W!0qDiopkjA)A=vxogK}{Paxn6sI5ZgzFTfikhsvJ4bG_NsM$6stZ2ar$2piEeL-B zgF^`@7tlijVEVwCE{Mp?6)DYtdD3FNTxf-_15b_#Da6vTw4{UonBn;1k| z8g2W}XbQall=t(B`TXLZ;rKhs%emWEZRy%|%i4@3aHU0` zvl%S7n@p8{F76T(a!P8Ta=z-H8RD=M?M^Ek#)G>&YG|=Rq=S%ZTM1XrnTs@o_g%e= z;taFo+Gph};f*+5g9$cr;T^MAS{B2(kk@SpV{YJl%fZ-)X#5mQ(>VG5QQWi$c4YB% zTTW1oTWbJZLi?nDk}cD0PMU#-f6PMsn)Kl^TZ@DcHhZAXS<xAy`?~kSatr@k@j0r?(sBp zy;sq`GlV<6C{0btJh-2t$tXz*llVJ$gX5M%m@_>`@OR%*sOANjh)T&9Oo` zH^m&JUUe`vy?)U5`}1E&*a#v%*TMWWZj>|%znT*Z`w0VK(&3f+Ws+i&9EluSUMtr* zGnSjuenj%Ds~?nrMXy_IsZ)hp6Roykt}yBX{5ifH z0`D~fzgNa}vw-3HH931sF!4kENN3(4fB!GX2A3Oik+4ofLacuGe{Yc2ay{hZoFrI2bK-ZL)oyg4R~bcbo&^ zTnzVYTT3ID-&Dq=hvDE&L{0(kip3CmEAlvwdGezn`BlFYxg-C9EU#cW#{srnW5A-3 zfIdN=Ffoq?$|bvBz2?HQg}jhSQD(zqc@zUaVwSO}c21J>vvB->ebYZwSa3uYSKP>d zPuBdRKt>I0HkA!&-rXMIuPxP zKZHBzUps~t=W@rW{WGr{Xdxv-6;W{~S4>TZQbsucg=?j7cE*__pxG!CYNTBIGcm`~ zKQpJ%b70KLF7uzV#$F)Qd* zZvNhEZ*zK`CTxcvOP@KPD*Kh?ohuhjQW?Md1-GK6i&G{>r_6=|C~$PIqto&J*3#{t z60aEH;HE*puB0~iXNpXN zKnz1kr`mquzFLqFSM=_4*be%h$xSr-$2}vjf3Ef|Q;H-myZv0}^e?@yBmFPx3n8*X6SO?N9Q4W<3mx{x?K%^DRJuOpcS_s#eWL1p;>XH` zDI$H4)l^^#LTNNNf3?(ss+E_bEifx{aQDv@s4v8r<_R&khKGlBee#{8UK*g6x4z{x zyVP%_In~oNIXxZCnt$``8)~3EiekC~-bUZ&MA-{);y1KHDDU-6*@JeO)BOcBx${D6 zb&tLkmmdd}=>LX&StkapGC~?&ULOTbk2*@Bn*-Z77;Bm`5I*tcUu?%wbHZ6BS z99?~m&zBxP!0S%Y=?^O(D?qeMn#44ajJo_OrzLS}e@M33aoNI){)Q70=_U2OLTRn5 zF$u;CM7g<`Yeac%4vEUt?%?ye>oZMF2^MGQHj`gU+MMCH5GNjZ)(QIw(y5N*4rMOJ zK5wkm9)YIg9jrqu>48t&vvRd(?|N^75wM%&!Kw2Q9r2Gp?M(t$*bZr4|K+t z61N?S=u#lauky0)ivQI~f;)hwjVJlt){kZ{w_(0TE0PSq@-fj@E6#ORwCpRap+%h3 zf=GZX`CRcW@5}*@bM7`3e#m!=b|V@Iw|uGP3~S!;PdwW}hilK#!E`^@@`P=pK_tBC z6k6FDM-?n{1QNvdP#@2wt=u%$bB{d--Dd)S#to6+_JM1$(3!yW!)L|?-{Ch0iP(N}GPtU+6|6F`c)^3X2Zxn|o8KTI0VwS5fk@87PYtJC#wZ+^Ue zQ)X!*$7@8r5grc3r(lKR26k%iH&`?U$9pUuAhMm86A3OwPFkue`!`4W8S3JUtUFhTaqOxp}P+Ym&yNN>r9B!s{?YnKEl4em*3 zMO1vTgri()?Rc)%Jn(47#7i;IM8~9+Hx$mMPZq1zmYCCf4J*hJjCfDjrq`jVR^{II zfcOk=DJ~pmqWKWOHvhuqZq@{^;<9(I_WHgNQDwHkLJH>Y3x(}|8|^Eo*R70?Pg{`f1%6yNxZ0eNqs~_^qu%^cEw`RUMk^I}f?n#c|vuQ7TXP*e&@|YBf6WZC0+SM;6l%>aet#~wGlsvn&MEa zA-l25E|zIZJ(}Xhm-SpfWrj-;9>{3n9(VwCuYZ=&-0Rjvw(SQU_Al?GnK*JcjkGwb zGQvr(!TYjl4EIAo!#R0H*h!)pQ($@=9@**x#88)rLxs4qE2!e+cDlrbaNSzFtlm0% z!Fch9jB=Qf^IdKe0HyJ9HGQc93_vQDhc+%MqV1jm0-tHAxjnaPX>;5<;n$p1$p!i3 zBeiVEpRuuu3QlND;+f1^dkdIf^sg$Q#s3*(wVIdudrO?-I}HK8X>1*;RRR^jQK0y@ zGAD4Pm0)5GD4S?8cTLudGir+j6zoa9UsYUPM?U!ar(X0YXypOQ*{NYHR>ctYU>J0q zyd#N0<1LXT*OGF$K2t0f6tjlcO~>w8s)2`$|86&xmi=ShZ9#K2Ix6xujD&G|@8=p6`TRL~E8yxM6ro?KT}$hPy-KJ}sWH+#}K3-F39In43M9 zvAIn56s?ooYR0Vy^XzCeK}IW`gr+;`gp9q?iP>KXC%MbakP z_HeSvFzs=KcHV$*vyXN5m3buhWLeex3xpA0;#bEG%=+qz*kT~hD#jW2wn;vO3H-h; ziVzGOreg0v-#rCx8R}J~)<^{qUey&Ct=oCsaD=j@0#a&FjA0Bnrd1S2uR<_A&Cs)+ zg|ml+zA)=3z_O~aR9=Xb3#RgUGivbD4z7DR;n?{bZ={C+Pld255`=_hEj*GFz_%=> z;Za5svFg;!%K$=u%1!`!w>t3$@si)TKEpOHuOzq`=h_rcaAYIr7i=&%2A(ocF;a`0 zb&F#QVPCBZ<-!oG1A_09Jof@KqXQw^md#13r51zu@402@S;FuLPDU&|71bCkn;9G< zvx*k|&aAnv;br1KDJQhxNKQ2XI?Rci6pbId$cI)x6m9_jOD1Jup4}}jN{%ehi2{*d zl3tr;)Pz}amgH&q1oIJUFBgIT+s+7RKhRx!tzn2Bld#ZvrFRc1$v~Bl?&Ge z-0fp~7khcicZ;Q$VzqJoG&Q9IgU~XJ&@`6jc#J`TF9$RRDL_?O8ABr!xDvTJ-q?2{ z%_APmu$#QQP%wPvA*Y_ik>r;CZ&77Z#(FOPCvr@%Nc1#;PRz#(n}Ha;XmM4pLRdhj zMy0^lbCw>iYiu2N?O5#fe!kFmD89$K}WxT&Cq-jiWkg!alFsoU-^MaH@*|r*tkyO;qUfp7BA&nwLVX9D~hd_l|`7Ci@= z1~r)_ipKm`cLUI&cj5q5HL@q4W;%CjNeKBE?Kf0DbZ#q2`DpQ_`@BFL zRFt^Apd)FDdu)`hAYxxhjiNlQ=Cfer=1yQ|MQcX$!wOraV?6~SGr=c15_33B@1fX{ zayZrzeD05xt%?#y`C1iVI0?W9lGO5`1qE+=l@94Fq!C+WXxW$8Zl{Z<|Vn+lj=(Y>wxAz`6S6Y9dnD+xkHt-Iz?WF_P7^C@U2Qqhn|o zw6zUuZN;Hs!4p7bD0^ZxlA%14>BZFK;C@HsqL)zvzK2radx*gqzI>emRB9*O=^G-%>Ytfv=q6USkFaPo%&kh{)?T zjDiuyzV*F?xYS{A`&CO1OwcGCrNzFMeqNQ>6Ju?cRv5c)`3To^pvt@LY%_x?!deUl zAYpv1Fv${>+Kqe}GE2qVx0rB-PdZh)@JGUDxcfbI1P4O+W=IUjl6Q>XP-P3c#m1!7 zi0UoJ5KuX-4i|jA5>1EIkF!&htwEH{OAV766}0D_(S}@03&+jGd^n1L}VJpQhe`E-ACZ7c2(2<=D2zE5gGC2~1k z)R7RN8e^0Hz<0qzYLxEFj6Tku)3$MMQE^^T${S;KSR7l3sa^k94m;>k(LwdLemr6qn|Uao_<4sg1OJmGQ1_V# zz?aIOq2176h5%OG(RIX)`%L0#!iKE{B;H#0eMnEo?=ckWjw$C`VM$uw7E-(f1~>51 zO}QWJ-N+?WcOjnRQUyB6CH%FElKP^!MNf^h(edyDmlMe^{F@iwMSndWAS93QU9R5i?A1S73C@F=V{aQ)u51%Io2LTOUz&_|>91$~@pTc$ zA=ax`@#n)}WOo9$)B`EEl`mD1;PywCUAG=|7`R@~0lnAsE&$C&Xu2O7Lv= zj-lcHyR%o4-a7i4`7T(~tIRUoV&0dBciFCBLe%83$RFLuLI3(mLB6AiIJ$`WAMeKU zU{YnfcepP9`LXkF$TQ&hf1xUkhiWTbd>@TZc0o)RyU*kuHo;z;@g;|y#U6)(2x?ke z=-6GXH>AT>w+U4!64BcVHOGJPX;-nYwoMCTDfbLd8H+r_6YHv&=io5q`A+4lVwpJl z;~;hmIA+h!xL^oXFG3 zRma5XB;nli(_77Y|0se56VlI8@$FUd;NjedVe(qArcdX61ZJ8a!9v$-p<`eyH|{wY z3OQZTeFG3c(X%v@S7b9`Db#npKGeVvACPnd$rooJw1v6(cP*3v2)o8B3+W!;G9`zo zS$=|i2X+75y6kOp*3xV5<@nz4h~)(zI%G+DJGM4-YEJ;y??r!)JO1ea_*1Wgr9lJGh>d`i+T^|(5QY96Kq3j%kfl_^5kOza(wAL(o8P3oG^wF7 zFk()Ri_CmI1I+0TU=(*2WD9*AoVW!l{G3eynZkXV4!;$vy0L`Ff++GCq`+C0n6rsL zaIAg=_PV?Ych_3ZB{{OC1*YM2)HOGMa5-Z|FjF$Y_hsH{R%-)R=X|P_DQx>#6Y(2; zekCa^A0Gp!T))`YSLPl2gqj0@SDDK!{UFA1)JNt5*Q*yevPE7%TQ=G)55T-#3+<}^ z0?LA)gfGy~pg<=SbKs7F=gx@&XL3*@0+?L-2_T>6E!3s}@#01kuQCUs{jVqZ4!Q3vD=}K8!2w8^{kkx4c`P?nmX#+glU^2W2=%qNx zlasxfwI?zB8cnB%PSKJe4taD9%*u5@+QCh5y54%6Ht0(Qt7Mv2d@bRXc z49`8mCC|Bt%LtB?f)b0AHK0=+>Ky}N%BeaszdoTxRHlH~j$b4!pj&2dDw#?sg(F1~ zA=iUP!PHA+yYy984&1Ykny--N%lHH8^bz30l*uj-kibbv%aQHo{4v#zbTi2ooXIa_ zmfzn3>-=+|JS(vk?R*4M*7f>+=GtrLi*=y*)?I+^PMS;hN5jvN2Za0?o*gWq%9mQ~ z9<>P10Oz+A@xnWBcgUGa5QFAP-^ql#*uHd|V2pwKHZ!!DbwHRHUb%IZmlW9k?c1W! zwz(w*>F67(7VlY_x>-jS_rPR1Jv9rQ4_Q+K{5F3I65gd|MNhEkx$@dWmTiQ)4@I>E zcvN36BlM-5NXpZwXN27AU9OS=)gj@T_rb06Qm-74L%GPpDa)KWlN3QpO}0R(umvDq zDT?4o-cG<_6ST*%pD{4^Tbkks1{$lV-+Yv`jSfc@t32qIgqw=7Srr>Z_JvnEHpACW ztJj98i%YKkwm+xtq|XpiuPe^#5u*lCM@uTiNtq`qo6g04)OVDw4ZpqR zeg}UuCIYOk+RW6L_llu&W+D*r>w|nivR8-n`odhBCIc)<6VoiMy+3pjAZh)qq}EM9 zk;R!;-^lh6Xrg>1P>C`V8y49WN_2-GcH{mjmMuyw)`#lz-Nwo%BBAY;`Gy5dmWW-T zZ$%o7vJy2A>t?(VYiY{&Od+H^xX=klrp`+oha;*+G2uxk&Rh!ej>Q&DCbu@g9qj zOa(?k;Oy&W$((CrMyz~*yu4@oD9T?IDg6|5zx2Rl1S95}eOF)iu8ZWy6n8I-7Hd#lzyo%4SSn%JVRS9NW70oR-(>WJPQMml_u z6pY_hd&bweKX1I<(n0b&8a)6hT)F>-#uyMgPrBYi71`>g>QefJ-pSJ8<-36X$Eh<- zg_B%gd^BYMT3wr85Q~FQfzKyBRa+-ggG124)+b(azM6cq`e!Y3*CMHtru&(5x@wNY zufhiJCCml`hilFLS3;TD?|;_Q`c~M`?*6hrf4{cT4@n~L98Dx1nOP0&bD| zELPVcO^L`;g|8`LL`1sCReL>;c!~LkQw6HI+d)8UyR^&A>A(O2I^26*(amH*@xD4! ziKrI-hrtgub76y7ioqX?gxxz-_^MwnA%r&w`a7}VJsgZpYnQuM0Axj)X-M@wg}JzB z$)>gE~MlnxWEsLq)D~&5864bB}L=dUFQpI93TE4Ae_t;$p$Bx|vK=ke= z8cH{rrFYw%bXD`O$4s2A&39sAKS;V4e#8gnOP11*;lWBF`I5Yr_nDZO^$IBRHdk}6 zNK=}*X(N|aDf_)uR*k4@k+w$k>CPeH+tXJY^cgqG)~=NXr@S4M{_;#;`21X8bZ~I2 z6-R6HPFqf?N-LGhUbPAr1@fbJ`QyN%lO=Ra<2s&^-6HP4}g(%6I z-5%rKVP(4L`^hYKaQn3I)9#J6SJV`Ji5Ib74itYtNas?=T#ND1AgL2@Lh=^BC%lwg zt%W&@Qd8x64ZV#J#pWgaz?Qsm13MK!NRc36J5C5`gD z+38#!09T007OH5SIUw=wFADnowWw`Q1U;FHh;9k#!`IenzfZ3T$?5r&x#@_U>#sLk z#j!RN=70XPh3~#cet1P^xP(#a7s%&r^9;ZZSWPW`IZ4W}Ye6pYb8isMvP`2$nFVGZ z0zB-sY~Ya?k_XajXFzsuT=1}=Holg*1;b(kj6y7T12*3HU4A3MH1mndHt|>wscWWt z$8yL&gVd*h@Lo0k0v#c78r%4d+$F!-`PW_VXh)W@KklpYEco-H8%G2FtZ*j|u``vk zaI!u$Er9Bauh?A$h56bk_GF)=UvXOIAMV{a{BGpc3gNW5hd9j7&{uwW9rWoS0LG{` zrMj${y<**6-+p9AazA^mYU_N?}%x=5q!xNt+VE)!(Fpx8_8%7X3X6K>vI z8@EBcg2Lv}SE+8EG^=~_ny^j$ML!_nehSonygZ^@*Sh)ZzYAy2%fou1OyR^m+gg34XGr#C~+8N*}jFd41ZVn?$wyp*o2r_Z)iiwP{JIIv&@0zYs*!raKC5CL1cz=yri>1_-VHHgMl)J z-xVXTzm}ANaj&;skN>dLK`dLJr|;AE47`|}PThwZeYozK5S!=Ox=6{u_Jqv67)54_hb!<{8sf`D5--A#$(}tP%pr=Vf6fMTWGW$ITz~bOAc%+@UQT z_iweGg`sPv>zJR%`>!kA2Ac=}iV?CucEA`)bN766lH|iyAITEQ{!z|`DsbjoiLBo1 z-ckQgg$s6y0UU|f4I7-l7rtti!zizb8yFZEgX%XF?m%{*j&D5>MYqwv7nO1lufoXP zr!Tc0O9(Zc)a9iL3jFh*ctP?%XbZrN*{vb{p%m8q~DJoSp6E{#Q)b@=o8Bfj#TvRNc8z-{bQFc dy&%Vz>&Blr?hrq01V@IUuB>yTOwsbe{{XO;Dx3fS diff --git a/scripts/GetCopyOfSugar.sh b/scripts/GetCopyOfSugar.sh index eba16b3c..8ad271ea 100755 --- a/scripts/GetCopyOfSugar.sh +++ b/scripts/GetCopyOfSugar.sh @@ -1,10 +1,11 @@ #!/usr/bin/env bash -# This script gets a copy of Sugar from the designated directory or downloads a Sugar dev build from the SugarCRM -# Developer Builds community. +# This script gets a copy of Sugar from the designated directory or downloads a Sugar dev build from the Sugar Store +# or the SugarCRM Developer Builds community. # -# Note: you must have access to the SugarCRM Developer Builds community -# (https://community.sugarcrm.com/community/developer/developer-builds) in order for the download to be successful. +# Note: you must have access to the Sugar Store (https://store.sugarcrm.com/download) and/or the SugarCRM Developer +# Builds community (https://community.sugarcrm.com/community/developer/developer-builds) depending on where the build is +# stored in order for the download to be successful. ###################################################################### @@ -14,7 +15,7 @@ if [[ -z "$1" ]] || [[ -z "$2" ]] || [[ -z "$3" ]] || [[ -z "$4" ]] then echo "Not all required command line arguments were set. Please run the script again with the required arguments: - 1: Email address associated with your SugarCRM Developer Builds Community account + 1: Email address associated with your SugarCRM account 2: Password associated with the above account 3: Sugar name (For example: SugarEnt-7.11) 4. The path to where the Sugar download should be stored @@ -26,10 +27,10 @@ then exit 1 fi -# Email address associated with your SugarCRM developer community account +# Email address associated with your SugarCRM account email=$1 -# Password associated with your SugarCRM developer community account +# Password associated with your SugarCRM account password=$2 # The Sugar name (For example: SugarEnt-7.11) @@ -60,7 +61,7 @@ checkStatusCode(){ statusCode="${BASH_REMATCH[1]}" if [[ "$statusCode" == $1 ]] then - echo "Status code is correct: $statusCode" + return else echo "Status code is not the expected $1: $statusCode" echo "$2" @@ -87,6 +88,42 @@ getLocationFromResponse(){ fi } +# Print the value associated with a given key for a JSON response +# $1: The key associated with the JSON value you want to parse +# $2: response from curl command +getJsonValueFromResponse(){ + regexJsonValue="$1\":\"([^\"]*)\"" + + if [[ $2 =~ $regexJsonValue ]] + then + value="${BASH_REMATCH[1]}" + echo "$value" + else + echo "Unable to find the value of $1 in response" + echo $2 + exit 1 + fi +} + +# Print the Sugar Download ID associated with the given Sugar zip file +# $1: The name of the Sugar zip file to search for in the response +# $2: response from curl command +getSugarDownloadIdFromResponse(){ + # This regex parses a string similar to + # "id":"download-id-we-are-trying-to-get","name":"SugarEnt-7.9.3.0.zip" + regexJasonValue="\"id\":\"([^\"]*)\",\"name\":\"$1\"" + + if [[ $2 =~ $regexJasonValue ]] + then + value="${BASH_REMATCH[1]}" + echo "$value" + else + echo "Unable to find the value of $1 in response" + echo $2 + exit 1 + fi +} + # Print the value associated with a hidden form field # $1: name of the hidden form field # $2: response from curl command @@ -116,12 +153,47 @@ getHiddenFormFieldValue(){ echo "$2" exit 1 fi +} + +# Authenticate to the Sugar Store and print the URL to download the given Sugar zip +# $1: The name of zip to download (for example: SugarEnt-7.9.3.0.zip) +function authenticateToSugarStoreAndGetDownloadUrl(){ + + response="$(curl -v -L -c $cookieFile -b $cookieFile 'https://store.sugarcrm.com/download' 2>&1)" + checkStatusCode "200" "$response" + token="$(getHiddenFormFieldValue "_token" "$response")" + + response="$(curl -v -L -c $cookieFile -b $cookieFile --data "_token=$token&email=$email&password=$password" https://auth.sugarcrm.com/auth/login 2>&1)" + checkStatusCode "200" "$response" + accountId="$(getJsonValueFromResponse "id" "$response")" + response="$(curl -v -L -c $cookieFile -b $cookieFile "https://store.sugarcrm.com/api/v1/accounts/$accountId/downloads" 2>&1)" + checkStatusCode "200" "$response" + downloadId="$(getSugarDownloadIdFromResponse $1 "$response")" + hash="$(getJsonValueFromResponse "hash" "$response")" + + downloadUrl="https://store.sugarcrm.com/download/$downloadId/$hash" + echo $downloadUrl +} + +# Authenticate to the Developer Builds Community +function authenticateToDevBuildsCommunity(){ + + response="$(curl -v -L -c $cookieFile -b $cookieFile 'https://community.sugarcrm.com/login.jspa?ssologin=true&fragment=&referer=%2Fcommunity%2Fdeveloper%2Fdeveloper-builds' 2>&1)" + checkStatusCode "200" "$response" + token="$(getHiddenFormFieldValue "_token" "$response")" + + response="$(curl -v -L -c $cookieFile -b $cookieFile --data "_token=$token&email=$email&password=$password" https://auth.sugarcrm.com/saml2/idp/authpage?ReturnTo=https%3A%2F%2Fauth.sugarcrm.com%2Fsaml2%2Fidp%2FSSOService%3Fspentityid%3Dhttps%253A%252F%252Fcommunity.sugarcrm.com%26RelayState%3DL2NvbW11bml0eS9kZXZlbG9wZXIvZGV2ZWxvcGVyLWJ1aWxkcw%253D%253D 2>&1)" + checkStatusCode "200" "$response" + samlResponse="$(getHiddenFormFieldValue "SAMLResponse" "$response")" + + response="$(curl -v -L -c $cookieFile -b $cookieFile --data-urlencode "SAMLResponse=$samlResponse" --data-urlencode "RelayState=L2NvbW11bml0eS9kZXZlbG9wZXIvZGV2ZWxvcGVyLWJ1aWxkcw==" 'https://community.sugarcrm.com/saml/sso' 2>&1)" + checkStatusCode "200" "$response" } ###################################################################### -# Check if we need to download the Sugar source zip +# Check if we have a copy of the Sugar source zip already downloaded ###################################################################### # If we already have a copy of the Sugar source zip, we'll copy it to the Sugar directory and exit the script @@ -149,81 +221,78 @@ chmod -R 777 . sudo chmod -R 777 . -###################################################################### -# Authenticate to the community -###################################################################### - -echo "Authenticating to Developer Builds Community..." - -response="$(curl -v -c $cookieFile -b $cookieFile 'https://community.sugarcrm.com/login.jspa?ssologin=true&fragment=&referer=%2Fcommunity%2Fdeveloper%2Fdeveloper-builds' 2>&1)" -checkStatusCode "302" "$response" -location="$(getLocationFromResponse "$response")" - -# Location should be something like https://auth.sugarcrm.com/saml2/idp/SSOService?SAMLRequest=fZHNbsIwEIRfxdp7EjuUn1okiBahIlGBSOihNxMMGCV26nVQ%2B%2FZ1IahUlTh6vbPf7sxw9FmV5CQtKqMTYCEFInVhtkrvE1jn02AAo3SIoirjmo8bd9Ar%2BdFIdMQLNfLLTwKN1dwIVMi1qCRyV%2FBs%2FDrncUh5bY0zhSmBjBGldR71bDQ2lbSZtCdVyPVqnsDBuRp5FBWmqhqt3FeIzV7YwlahL0U%2FpAjRAJl4vNLCnVe%2BqoTf7b8gjtS2jrJs0YKATI0t5PmQBHaiRF%2BaTRIQjPXo8aAGne6OdukDUxsmYnHsql7M2KNvwqVAVCf5K0Ns5EyjE9olEFM2CGgcsDhnfU47nPZD1um%2FA1m25z8pfbH1nlebSxPylzxfBstFlgN5u8bjG6ANg5%2Fp9jaF%2B4PF1XpI7xs9jG4Bafv8G376DQ%3D%3D&RelayState=L2NvbW11bml0eS9kZXZlbG9wZXIvZGV2ZWxvcGVyLWJ1aWxkcw%3D%3D -response="$(curl -v -c $cookieFile -b $cookieFile $location 2>&1)" -checkStatusCode "302" "$response" -location="$(getLocationFromResponse "$response")" - -# Location should be something like https://auth.sugarcrm.com/saml2/idp/authpage?ReturnTo=https%3A%2F%2Fauth.sugarcrm.com%2Fsaml2%2Fidp%2FSSOService%3Fspentityid%3Dhttps%253A%252F%252Fcommunity.sugarcrm.com%26RelayState%3DL2NvbW11bml0eS9kZXZlbG9wZXIvZGV2ZWxvcGVyLWJ1aWxkcw%253D%253D -response="$(curl -v -c $cookieFile -b $cookieFile $location 2>&1)" -checkStatusCode "200" "$response" -token="$(getHiddenFormFieldValue "_token" "$response")" - -response="$(curl -v -c $cookieFile -b $cookieFile --data "_token=$token&email=$email&password=$password" https://auth.sugarcrm.com/saml2/idp/authpage?ReturnTo=https%3A%2F%2Fauth.sugarcrm.com%2Fsaml2%2Fidp%2FSSOService%3Fspentityid%3Dhttps%253A%252F%252Fcommunity.sugarcrm.com%26RelayState%3DL2NvbW11bml0eS9kZXZlbG9wZXIvZGV2ZWxvcGVyLWJ1aWxkcw%253D%253D 2>&1)" -checkStatusCode "302" "$response" -location="$(getLocationFromResponse "$response")" - -# Location should be something like 'https://auth.sugarcrm.com/saml2/idp/SSOService?spentityid=https%3A%2F%2Fcommunity.sugarcrm.com&RelayState=L2NvbW11bml0eS9kZXZlbG9wZXIvZGV2ZWxvcGVyLWJ1aWxkcw%3D%3D' -response="$(curl -v -c $cookieFile -b $cookieFile $location 2>&1)" -checkStatusCode "200" "$response" -samlResponse="$(getHiddenFormFieldValue "SAMLResponse" "$response")" - -response="$(curl -v -c $cookieFile -b $cookieFile --data-urlencode "SAMLResponse=$samlResponse" --data-urlencode "RelayState=L2NvbW11bml0eS9kZXZlbG9wZXIvZGV2ZWxvcGVyLWJ1aWxkcw==" 'https://community.sugarcrm.com/saml/sso' 2>&1)" -checkStatusCode "302" "$response" - - ####################################################################### -## Download the Sugar zip +# Get the URL to download and authenticate to the appropriate location ####################################################################### sugarVersion_7_10="7.10" sugarVersion_7_11="7.11" +sugarVersion_8_0="8.0" sugarEdition_Ult="Ult" sugarEdition_Ent="Ent" sugarEdition_Pro="Pro" -# Get the url for the appropriate Sugar version and edition +# Get the url for the appropriate Sugar version and edition as well as +# authenticate to the appropriate location (Sugar Store or Developer Builds Community) if [[ "$sugarName" == "Sugar$sugarEdition_Ult-$sugarVersion_7_10" ]] -then downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5839-102-1-8005/SugarUlt-7.10.2.0-dev.1.zip" +then + authenticateToDevBuildsCommunity + downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5839-102-1-8005/SugarUlt-7.10.2.0-dev.1.zip" elif [[ "$sugarName" == "Sugar$sugarEdition_Ent-$sugarVersion_7_10" ]] -then downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5837-102-1-8003/SugarEnt-7.10.2.0-dev.1.zip" +then + authenticateToDevBuildsCommunity + downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5837-102-1-8003/SugarEnt-7.10.2.0-dev.1.zip" elif [[ "$sugarName" == "Sugar$sugarEdition_Pro-$sugarVersion_7_10" ]] -then downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5838-102-1-8004/SugarPro-7.10.2.0-dev.1.zip" +then + authenticateToDevBuildsCommunity + downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5838-102-1-8004/SugarPro-7.10.2.0-dev.1.zip" elif [[ "$sugarName" == "Sugar$sugarEdition_Ult-$sugarVersion_7_11" ]] -then downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5958-102-1-8147/SugarUlt-7.11.0.0-dev.1.zip" +then + authenticateToDevBuildsCommunity + downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5958-102-1-8147/SugarUlt-7.11.0.0-dev.1.zip" elif [[ "$sugarName" == "Sugar$sugarEdition_Ent-$sugarVersion_7_11" ]] -then downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5959-102-1-8148/SugarEnt-7.11.0.0-dev.1.zip" +then + authenticateToDevBuildsCommunity + downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5959-102-1-8148/SugarEnt-7.11.0.0-dev.1.zip" elif [[ "$sugarName" == "Sugar$sugarEdition_Pro-$sugarVersion_7_11" ]] -then downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5957-102-1-8146/SugarPro-7.11.0.0-dev.1.zip" +then + authenticateToDevBuildsCommunity + downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5957-102-1-8146/SugarPro-7.11.0.0-dev.1.zip" + +elif [[ "$sugarName" == "Sugar$sugarEdition_Ult-$sugarVersion_8_0" ]] +then + downloadUrl="$(authenticateToSugarStoreAndGetDownloadUrl "SugarUlt-8.0.0.0.zip")" + +elif [[ "$sugarName" == "Sugar$sugarEdition_Ent-$sugarVersion_8_0" ]] +then + downloadUrl="$(authenticateToSugarStoreAndGetDownloadUrl "SugarEnt-8.0.0.0.zip")" + +elif [[ "$sugarName" == "Sugar$sugarEdition_Pro-$sugarVersion_8_0" ]] +then + downloadUrl="$(authenticateToSugarStoreAndGetDownloadUrl "SugarPro-8.0.0.0.zip")" else echo "Unable to find Sugar download URL for $sugarName" exit 1 fi -# Download the file + +###################################################################### +# Download Sugar +###################################################################### + echo "Beginning download of $sugarName from $downloadUrl" -response="$(curl -v -c ./mycookie -b ./mycookie -o $sugarName.zip $downloadUrl 2>&1)" +response="$(curl -v -L -c ./mycookie -b ./mycookie -o $sugarName.zip $downloadUrl 2>&1)" checkStatusCode "200" "$response" echo "Download complete" -# Check we didn't get an empty zip file +# Verify we didn't get an empty zip file fileSize=$(wc -c <"$sugarName.zip") if [[ $fileSize -lt 60000000 ]] then diff --git a/scripts/SetupEnvAndRunPHPUnitTests.sh b/scripts/SetupEnvAndRunPHPUnitTests.sh index d70d0bea..68b995ba 100755 --- a/scripts/SetupEnvAndRunPHPUnitTests.sh +++ b/scripts/SetupEnvAndRunPHPUnitTests.sh @@ -7,7 +7,7 @@ if [[ -z "$1" ]] || [[ -z "$2" ]] || [[ -z "$3" ]] || [[ -z "$4" ]] || [[ -z "$5" ]] || [[ -z "$6" ]] || [[ -z "$7" ]] then echo "Not all required command line arguments were set. Please run the script again with the required arguments: - 1: Email address associated with your SugarCRM Developer Builds Community account + 1: Email address associated with your SugarCRM account 2: Password associated with the above account 3: Sugar version (Example: 7.11) 4: Sugar edition (Options: Ult, Ent, Pro) @@ -24,10 +24,10 @@ then exit 1 fi -# Email address associated with your SugarCRM developer community account +# Email address associated with your SugarCRM account email=$1 -# Password associated with your SugarCRM developer community account +# Password associated with your SugarCRM account password=$2 # The Sugar version to download From abf84360cafec81e59208a799866ef885246ea7b Mon Sep 17 00:00:00 2001 From: Lauren Schaefer Date: Tue, 3 Apr 2018 14:28:07 -0400 Subject: [PATCH 2/4] Add ability to download from Sugar Store - Fixes #42 Initial mess that successfully gets download from store Needs lots of cleaning Cleaned up the code Simplify the authentication to dev builds community by using curl -L Update doc Update naming of DEV_COMMUNITY to be SUGARCRM --- .travis.yml | 6 +- README.md | 32 ++--- images/travisenvvars.png | Bin 36232 -> 43505 bytes scripts/GetCopyOfSugar.sh | 175 ++++++++++++++++++-------- scripts/SetupEnvAndRunPHPUnitTests.sh | 6 +- 5 files changed, 145 insertions(+), 74 deletions(-) diff --git a/.travis.yml b/.travis.yml index d3199fb7..8a971cea 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,7 +31,7 @@ jobs: - cd ../scripts - sudo service mysql stop script: - - ./SetupEnvAndRunPHPUnitTests.sh $DEV_COMMUNITY_USERNAME $DEV_COMMUNITY_PASSWORD $SUGAR_VERSION $SUGAR_EDITION $GITHUB_USERNAME $GITHUB_PASSWORD workspace/sugardocker + - ./SetupEnvAndRunPHPUnitTests.sh $SUGARCRM_USERNAME $SUGARCRM_PASSWORD $SUGAR_VERSION $SUGAR_EDITION $GITHUB_USERNAME $GITHUB_PASSWORD workspace/sugardocker - stage: Run PHPUnit sudo: required language: php @@ -47,7 +47,7 @@ jobs: - cd ../scripts - sudo service mysql stop script: - - ./SetupEnvAndRunPHPUnitTests.sh $DEV_COMMUNITY_USERNAME $DEV_COMMUNITY_PASSWORD $SUGAR_VERSION $SUGAR_EDITION $GITHUB_USERNAME $GITHUB_PASSWORD workspace/sugardocker + - ./SetupEnvAndRunPHPUnitTests.sh $SUGARCRM_USERNAME $SUGARCRM_PASSWORD $SUGAR_VERSION $SUGAR_EDITION $GITHUB_USERNAME $GITHUB_PASSWORD workspace/sugardocker - stage: Run PHPUnit sudo: required language: php @@ -63,7 +63,7 @@ jobs: - cd ../scripts - sudo service mysql stop script: - - ./SetupEnvAndRunPHPUnitTests.sh $DEV_COMMUNITY_USERNAME $DEV_COMMUNITY_PASSWORD $SUGAR_VERSION $SUGAR_EDITION $GITHUB_USERNAME $GITHUB_PASSWORD workspace/sugardocker + - ./SetupEnvAndRunPHPUnitTests.sh $SUGARCRM_USERNAME $SUGARCRM_PASSWORD $SUGAR_VERSION $SUGAR_EDITION $GITHUB_USERNAME $GITHUB_PASSWORD workspace/sugardocker - stage: Build & Post on GitHub language: php php: '7.1' diff --git a/README.md b/README.md index caa07907..cc03cf7c 100755 --- a/README.md +++ b/README.md @@ -175,9 +175,10 @@ You can then click Details to open the build results in Travis CI. ### About the build The build has four Environment Variables that have been configured in the project settings in Travis CI: -- DEV_COMMUNITY_USERNAME: The username for an account that has access to the -[SugarCRM Developer Builds Space](https://community.sugarcrm.com/community/developer/developer-builds) -- DEV_COMMUNITY_PASSWORD: The password associated with the above account +- SUGARCRM_USERNAME: The username for an account that has access to the +[SugarCRM Developer Builds Space](https://community.sugarcrm.com/community/developer/developer-builds) and the [Sugar +Store](https://store.sugarcrm.com/download) +- SUGARCRM_PASSWORD: The password associated with the above account - GITHUB_USERNAME: The username for a GitHub account that has access to https://github.com/sugarcrm/unit-tests - GITHUB_PASSWORD: The password associated with the above account @@ -265,13 +266,14 @@ Credentials Binding Plugin.) 1. ID: GITHUB_SUGARCRM_UNIT_TESTS 1. Description: GitHub account that has access to https://github.com/sugarcrm/unit-tests 1. Create new global credentials for the account that has access to the - [SugarCRM Developer Builds Space](https://community.sugarcrm.com/community/developer/developer-builds). + [SugarCRM Developer Builds Space](https://community.sugarcrm.com/community/developer/developer-builds) and the [Sugar + Store](https://store.sugarcrm.com/download). 1. Kind: **Username with password** 1. Scope: **Global** - 1. Username: your SugarCRM Developer Builds Space username - 1. Password: your SugarCRM Developer Builds Space password - 1. ID: SUGARCRM_DEVELOPER_BUILDS_SPACE - 1. Description: Account that has access to the SugarCRM Developer Builds Space + 1. Username: your SugarCRM username + 1. Password: your SugarCRM password + 1. ID: SUGARCRM_ACCOUNT + 1. Description: SugarCRM Account 1. Create a new global secret for the path to where Sugar Docker will be stored on your host machine (not the path on Jenkins). 1. Kind: **Secret text** @@ -305,10 +307,10 @@ text(s) or file(s)** option. 1. Credentials: **Specific credentials** 1. Select the GITHUB_SUGARCRM_UNIT_TESTS credentials. 1. In the **Bindings** section, select **Add** > **Username and password (separated)**. Then input the following: - 1. Username Variable: `DEV_COMMUNITY_USERNAME` - 1. Password Variable: `DEV_COMMUNITY_PASSWORD` + 1. Username Variable: `SUGARCRM_USERNAME` + 1. Password Variable: `SUGARCRM_PASSWORD` 1. Credentials: **Specific credentials** - 1. Select the SUGARCRM_DEVELOPER_BUILDS_SPACE credentials. + 1. Select the SUGARCRM_ACCOUNT credentials. 1. In the **Bindings** section, select **Add** > **Secret text**. Then input the following: 1. Variable: `PATH_TO_SUGAR_DOCKER_ON_HOST` 1. Credentials: **Specific credentials** @@ -329,16 +331,16 @@ text(s) or file(s)** option. SUGAR_DOCKER_DIRECTORY="workspace/sugardocker" # This variable is completely optional. If you want to store the Sugar source zips on your local machine instead - # of downloading them from the SugarCRM Developer Builds space, input the path to where the Sugar source zips are - # stored. For example: /var/sugardocker/data/app/sugar_source_zips. Note that your Sugar source zips MUST follow - # this naming convention: Sugar$sugarEdition-$sugarVersion.zip (for example: SugarEnt-7.11.zip). + # of downloading them from the SugarCRM Developer Builds space or Sugar Store, input the path to where the Sugar + # source zips are stored. For example: /var/sugardocker/data/app/sugar_source_zips. Note that your Sugar source zips + # MUST follow this naming convention: Sugar$sugarEdition-$sugarVersion.zip (for example: SugarEnt-7.11.zip). # SUGAR_SOURCE_ZIPS_DIRECTORY="" cd scripts bash -ex RunPackUnitTestsAndBuildProfMPackage.sh $SUGAR_WORKSPACE_PATH - bash SetupEnvAndRunPHPUnitTests.sh $DEV_COMMUNITY_USERNAME $DEV_COMMUNITY_PASSWORD $SUGAR_VERSION $SUGAR_EDITION $GITHUB_USERNAME $GITHUB_PASSWORD $SUGAR_DOCKER_DIRECTORY $SUGAR_SOURCE_ZIPS_DIRECTORY + bash SetupEnvAndRunPHPUnitTests.sh $SUGARCRM_USERNAME $SUGARCRM_PASSWORD $SUGAR_VERSION $SUGAR_EDITION $GITHUB_USERNAME $GITHUB_PASSWORD $SUGAR_DOCKER_DIRECTORY $SUGAR_SOURCE_ZIPS_DIRECTORY ``` Be sure to update the variables appropriately. 1. In the **Post-build Actions** section, click **Add post-build action** and select **Archive the artifacts**. diff --git a/images/travisenvvars.png b/images/travisenvvars.png index af6eb00dd625782de42000b474b8a7a2411e2633..f886d556475ff9683032d00c9370f2afae8d970e 100644 GIT binary patch literal 43505 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 diff --git a/scripts/GetCopyOfSugar.sh b/scripts/GetCopyOfSugar.sh index eba16b3c..8ad271ea 100755 --- a/scripts/GetCopyOfSugar.sh +++ b/scripts/GetCopyOfSugar.sh @@ -1,10 +1,11 @@ #!/usr/bin/env bash -# This script gets a copy of Sugar from the designated directory or downloads a Sugar dev build from the SugarCRM -# Developer Builds community. +# This script gets a copy of Sugar from the designated directory or downloads a Sugar dev build from the Sugar Store +# or the SugarCRM Developer Builds community. # -# Note: you must have access to the SugarCRM Developer Builds community -# (https://community.sugarcrm.com/community/developer/developer-builds) in order for the download to be successful. +# Note: you must have access to the Sugar Store (https://store.sugarcrm.com/download) and/or the SugarCRM Developer +# Builds community (https://community.sugarcrm.com/community/developer/developer-builds) depending on where the build is +# stored in order for the download to be successful. ###################################################################### @@ -14,7 +15,7 @@ if [[ -z "$1" ]] || [[ -z "$2" ]] || [[ -z "$3" ]] || [[ -z "$4" ]] then echo "Not all required command line arguments were set. Please run the script again with the required arguments: - 1: Email address associated with your SugarCRM Developer Builds Community account + 1: Email address associated with your SugarCRM account 2: Password associated with the above account 3: Sugar name (For example: SugarEnt-7.11) 4. The path to where the Sugar download should be stored @@ -26,10 +27,10 @@ then exit 1 fi -# Email address associated with your SugarCRM developer community account +# Email address associated with your SugarCRM account email=$1 -# Password associated with your SugarCRM developer community account +# Password associated with your SugarCRM account password=$2 # The Sugar name (For example: SugarEnt-7.11) @@ -60,7 +61,7 @@ checkStatusCode(){ statusCode="${BASH_REMATCH[1]}" if [[ "$statusCode" == $1 ]] then - echo "Status code is correct: $statusCode" + return else echo "Status code is not the expected $1: $statusCode" echo "$2" @@ -87,6 +88,42 @@ getLocationFromResponse(){ fi } +# Print the value associated with a given key for a JSON response +# $1: The key associated with the JSON value you want to parse +# $2: response from curl command +getJsonValueFromResponse(){ + regexJsonValue="$1\":\"([^\"]*)\"" + + if [[ $2 =~ $regexJsonValue ]] + then + value="${BASH_REMATCH[1]}" + echo "$value" + else + echo "Unable to find the value of $1 in response" + echo $2 + exit 1 + fi +} + +# Print the Sugar Download ID associated with the given Sugar zip file +# $1: The name of the Sugar zip file to search for in the response +# $2: response from curl command +getSugarDownloadIdFromResponse(){ + # This regex parses a string similar to + # "id":"download-id-we-are-trying-to-get","name":"SugarEnt-7.9.3.0.zip" + regexJasonValue="\"id\":\"([^\"]*)\",\"name\":\"$1\"" + + if [[ $2 =~ $regexJasonValue ]] + then + value="${BASH_REMATCH[1]}" + echo "$value" + else + echo "Unable to find the value of $1 in response" + echo $2 + exit 1 + fi +} + # Print the value associated with a hidden form field # $1: name of the hidden form field # $2: response from curl command @@ -116,12 +153,47 @@ getHiddenFormFieldValue(){ echo "$2" exit 1 fi +} + +# Authenticate to the Sugar Store and print the URL to download the given Sugar zip +# $1: The name of zip to download (for example: SugarEnt-7.9.3.0.zip) +function authenticateToSugarStoreAndGetDownloadUrl(){ + + response="$(curl -v -L -c $cookieFile -b $cookieFile 'https://store.sugarcrm.com/download' 2>&1)" + checkStatusCode "200" "$response" + token="$(getHiddenFormFieldValue "_token" "$response")" + + response="$(curl -v -L -c $cookieFile -b $cookieFile --data "_token=$token&email=$email&password=$password" https://auth.sugarcrm.com/auth/login 2>&1)" + checkStatusCode "200" "$response" + accountId="$(getJsonValueFromResponse "id" "$response")" + response="$(curl -v -L -c $cookieFile -b $cookieFile "https://store.sugarcrm.com/api/v1/accounts/$accountId/downloads" 2>&1)" + checkStatusCode "200" "$response" + downloadId="$(getSugarDownloadIdFromResponse $1 "$response")" + hash="$(getJsonValueFromResponse "hash" "$response")" + + downloadUrl="https://store.sugarcrm.com/download/$downloadId/$hash" + echo $downloadUrl +} + +# Authenticate to the Developer Builds Community +function authenticateToDevBuildsCommunity(){ + + response="$(curl -v -L -c $cookieFile -b $cookieFile 'https://community.sugarcrm.com/login.jspa?ssologin=true&fragment=&referer=%2Fcommunity%2Fdeveloper%2Fdeveloper-builds' 2>&1)" + checkStatusCode "200" "$response" + token="$(getHiddenFormFieldValue "_token" "$response")" + + response="$(curl -v -L -c $cookieFile -b $cookieFile --data "_token=$token&email=$email&password=$password" https://auth.sugarcrm.com/saml2/idp/authpage?ReturnTo=https%3A%2F%2Fauth.sugarcrm.com%2Fsaml2%2Fidp%2FSSOService%3Fspentityid%3Dhttps%253A%252F%252Fcommunity.sugarcrm.com%26RelayState%3DL2NvbW11bml0eS9kZXZlbG9wZXIvZGV2ZWxvcGVyLWJ1aWxkcw%253D%253D 2>&1)" + checkStatusCode "200" "$response" + samlResponse="$(getHiddenFormFieldValue "SAMLResponse" "$response")" + + response="$(curl -v -L -c $cookieFile -b $cookieFile --data-urlencode "SAMLResponse=$samlResponse" --data-urlencode "RelayState=L2NvbW11bml0eS9kZXZlbG9wZXIvZGV2ZWxvcGVyLWJ1aWxkcw==" 'https://community.sugarcrm.com/saml/sso' 2>&1)" + checkStatusCode "200" "$response" } ###################################################################### -# Check if we need to download the Sugar source zip +# Check if we have a copy of the Sugar source zip already downloaded ###################################################################### # If we already have a copy of the Sugar source zip, we'll copy it to the Sugar directory and exit the script @@ -149,81 +221,78 @@ chmod -R 777 . sudo chmod -R 777 . -###################################################################### -# Authenticate to the community -###################################################################### - -echo "Authenticating to Developer Builds Community..." - -response="$(curl -v -c $cookieFile -b $cookieFile 'https://community.sugarcrm.com/login.jspa?ssologin=true&fragment=&referer=%2Fcommunity%2Fdeveloper%2Fdeveloper-builds' 2>&1)" -checkStatusCode "302" "$response" -location="$(getLocationFromResponse "$response")" - -# Location should be something like https://auth.sugarcrm.com/saml2/idp/SSOService?SAMLRequest=fZHNbsIwEIRfxdp7EjuUn1okiBahIlGBSOihNxMMGCV26nVQ%2B%2FZ1IahUlTh6vbPf7sxw9FmV5CQtKqMTYCEFInVhtkrvE1jn02AAo3SIoirjmo8bd9Ar%2BdFIdMQLNfLLTwKN1dwIVMi1qCRyV%2FBs%2FDrncUh5bY0zhSmBjBGldR71bDQ2lbSZtCdVyPVqnsDBuRp5FBWmqhqt3FeIzV7YwlahL0U%2FpAjRAJl4vNLCnVe%2BqoTf7b8gjtS2jrJs0YKATI0t5PmQBHaiRF%2BaTRIQjPXo8aAGne6OdukDUxsmYnHsql7M2KNvwqVAVCf5K0Ns5EyjE9olEFM2CGgcsDhnfU47nPZD1um%2FA1m25z8pfbH1nlebSxPylzxfBstFlgN5u8bjG6ANg5%2Fp9jaF%2B4PF1XpI7xs9jG4Bafv8G376DQ%3D%3D&RelayState=L2NvbW11bml0eS9kZXZlbG9wZXIvZGV2ZWxvcGVyLWJ1aWxkcw%3D%3D -response="$(curl -v -c $cookieFile -b $cookieFile $location 2>&1)" -checkStatusCode "302" "$response" -location="$(getLocationFromResponse "$response")" - -# Location should be something like https://auth.sugarcrm.com/saml2/idp/authpage?ReturnTo=https%3A%2F%2Fauth.sugarcrm.com%2Fsaml2%2Fidp%2FSSOService%3Fspentityid%3Dhttps%253A%252F%252Fcommunity.sugarcrm.com%26RelayState%3DL2NvbW11bml0eS9kZXZlbG9wZXIvZGV2ZWxvcGVyLWJ1aWxkcw%253D%253D -response="$(curl -v -c $cookieFile -b $cookieFile $location 2>&1)" -checkStatusCode "200" "$response" -token="$(getHiddenFormFieldValue "_token" "$response")" - -response="$(curl -v -c $cookieFile -b $cookieFile --data "_token=$token&email=$email&password=$password" https://auth.sugarcrm.com/saml2/idp/authpage?ReturnTo=https%3A%2F%2Fauth.sugarcrm.com%2Fsaml2%2Fidp%2FSSOService%3Fspentityid%3Dhttps%253A%252F%252Fcommunity.sugarcrm.com%26RelayState%3DL2NvbW11bml0eS9kZXZlbG9wZXIvZGV2ZWxvcGVyLWJ1aWxkcw%253D%253D 2>&1)" -checkStatusCode "302" "$response" -location="$(getLocationFromResponse "$response")" - -# Location should be something like 'https://auth.sugarcrm.com/saml2/idp/SSOService?spentityid=https%3A%2F%2Fcommunity.sugarcrm.com&RelayState=L2NvbW11bml0eS9kZXZlbG9wZXIvZGV2ZWxvcGVyLWJ1aWxkcw%3D%3D' -response="$(curl -v -c $cookieFile -b $cookieFile $location 2>&1)" -checkStatusCode "200" "$response" -samlResponse="$(getHiddenFormFieldValue "SAMLResponse" "$response")" - -response="$(curl -v -c $cookieFile -b $cookieFile --data-urlencode "SAMLResponse=$samlResponse" --data-urlencode "RelayState=L2NvbW11bml0eS9kZXZlbG9wZXIvZGV2ZWxvcGVyLWJ1aWxkcw==" 'https://community.sugarcrm.com/saml/sso' 2>&1)" -checkStatusCode "302" "$response" - - ####################################################################### -## Download the Sugar zip +# Get the URL to download and authenticate to the appropriate location ####################################################################### sugarVersion_7_10="7.10" sugarVersion_7_11="7.11" +sugarVersion_8_0="8.0" sugarEdition_Ult="Ult" sugarEdition_Ent="Ent" sugarEdition_Pro="Pro" -# Get the url for the appropriate Sugar version and edition +# Get the url for the appropriate Sugar version and edition as well as +# authenticate to the appropriate location (Sugar Store or Developer Builds Community) if [[ "$sugarName" == "Sugar$sugarEdition_Ult-$sugarVersion_7_10" ]] -then downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5839-102-1-8005/SugarUlt-7.10.2.0-dev.1.zip" +then + authenticateToDevBuildsCommunity + downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5839-102-1-8005/SugarUlt-7.10.2.0-dev.1.zip" elif [[ "$sugarName" == "Sugar$sugarEdition_Ent-$sugarVersion_7_10" ]] -then downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5837-102-1-8003/SugarEnt-7.10.2.0-dev.1.zip" +then + authenticateToDevBuildsCommunity + downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5837-102-1-8003/SugarEnt-7.10.2.0-dev.1.zip" elif [[ "$sugarName" == "Sugar$sugarEdition_Pro-$sugarVersion_7_10" ]] -then downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5838-102-1-8004/SugarPro-7.10.2.0-dev.1.zip" +then + authenticateToDevBuildsCommunity + downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5838-102-1-8004/SugarPro-7.10.2.0-dev.1.zip" elif [[ "$sugarName" == "Sugar$sugarEdition_Ult-$sugarVersion_7_11" ]] -then downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5958-102-1-8147/SugarUlt-7.11.0.0-dev.1.zip" +then + authenticateToDevBuildsCommunity + downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5958-102-1-8147/SugarUlt-7.11.0.0-dev.1.zip" elif [[ "$sugarName" == "Sugar$sugarEdition_Ent-$sugarVersion_7_11" ]] -then downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5959-102-1-8148/SugarEnt-7.11.0.0-dev.1.zip" +then + authenticateToDevBuildsCommunity + downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5959-102-1-8148/SugarEnt-7.11.0.0-dev.1.zip" elif [[ "$sugarName" == "Sugar$sugarEdition_Pro-$sugarVersion_7_11" ]] -then downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5957-102-1-8146/SugarPro-7.11.0.0-dev.1.zip" +then + authenticateToDevBuildsCommunity + downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5957-102-1-8146/SugarPro-7.11.0.0-dev.1.zip" + +elif [[ "$sugarName" == "Sugar$sugarEdition_Ult-$sugarVersion_8_0" ]] +then + downloadUrl="$(authenticateToSugarStoreAndGetDownloadUrl "SugarUlt-8.0.0.0.zip")" + +elif [[ "$sugarName" == "Sugar$sugarEdition_Ent-$sugarVersion_8_0" ]] +then + downloadUrl="$(authenticateToSugarStoreAndGetDownloadUrl "SugarEnt-8.0.0.0.zip")" + +elif [[ "$sugarName" == "Sugar$sugarEdition_Pro-$sugarVersion_8_0" ]] +then + downloadUrl="$(authenticateToSugarStoreAndGetDownloadUrl "SugarPro-8.0.0.0.zip")" else echo "Unable to find Sugar download URL for $sugarName" exit 1 fi -# Download the file + +###################################################################### +# Download Sugar +###################################################################### + echo "Beginning download of $sugarName from $downloadUrl" -response="$(curl -v -c ./mycookie -b ./mycookie -o $sugarName.zip $downloadUrl 2>&1)" +response="$(curl -v -L -c ./mycookie -b ./mycookie -o $sugarName.zip $downloadUrl 2>&1)" checkStatusCode "200" "$response" echo "Download complete" -# Check we didn't get an empty zip file +# Verify we didn't get an empty zip file fileSize=$(wc -c <"$sugarName.zip") if [[ $fileSize -lt 60000000 ]] then diff --git a/scripts/SetupEnvAndRunPHPUnitTests.sh b/scripts/SetupEnvAndRunPHPUnitTests.sh index 51fc8b3f..fe6b6511 100755 --- a/scripts/SetupEnvAndRunPHPUnitTests.sh +++ b/scripts/SetupEnvAndRunPHPUnitTests.sh @@ -7,7 +7,7 @@ if [[ -z "$1" ]] || [[ -z "$2" ]] || [[ -z "$3" ]] || [[ -z "$4" ]] || [[ -z "$5" ]] || [[ -z "$6" ]] || [[ -z "$7" ]] then echo "Not all required command line arguments were set. Please run the script again with the required arguments: - 1: Email address associated with your SugarCRM Developer Builds Community account + 1: Email address associated with your SugarCRM account 2: Password associated with the above account 3: Sugar version (Example: 7.11) 4: Sugar edition (Options: Ult, Ent, Pro) @@ -24,10 +24,10 @@ then exit 1 fi -# Email address associated with your SugarCRM developer community account +# Email address associated with your SugarCRM account email=$1 -# Password associated with your SugarCRM developer community account +# Password associated with your SugarCRM account password=$2 # The Sugar version to download From 4d47f240d9da2555f006ba6b0138978fcf72119c Mon Sep 17 00:00:00 2001 From: Lauren Schaefer Date: Mon, 9 Apr 2018 12:31:41 -0500 Subject: [PATCH 3/4] Add comment explaining "magic number" for Sugar zip file size --- scripts/GetCopyOfSugar.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/GetCopyOfSugar.sh b/scripts/GetCopyOfSugar.sh index 8ad271ea..9ad6985f 100755 --- a/scripts/GetCopyOfSugar.sh +++ b/scripts/GetCopyOfSugar.sh @@ -238,7 +238,7 @@ sugarEdition_Pro="Pro" if [[ "$sugarName" == "Sugar$sugarEdition_Ult-$sugarVersion_7_10" ]] then authenticateToDevBuildsCommunity - downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5839-102-1-8005/SugarUlt-7.10.2.0-dev.1.zip" + downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5839-102-1-8005zzz/SugarUlt-7.10.2.0-dev.1.zip" elif [[ "$sugarName" == "Sugar$sugarEdition_Ent-$sugarVersion_7_10" ]] then @@ -292,7 +292,8 @@ response="$(curl -v -L -c ./mycookie -b ./mycookie -o $sugarName.zip $downloadUr checkStatusCode "200" "$response" echo "Download complete" -# Verify we didn't get an empty zip file +# Verify we didn't get an empty zip file. If the downloadUrl is invalid, we sometimes get a zip file of around 210 +# bytes. We've selected 60000000 to ensure we have a sufficiently large file that is likely correct. fileSize=$(wc -c <"$sugarName.zip") if [[ $fileSize -lt 60000000 ]] then From 5fbffdc8bb94deb5d12a21f4631ab4590c217bcf Mon Sep 17 00:00:00 2001 From: Lauren Schaefer Date: Mon, 9 Apr 2018 12:33:29 -0500 Subject: [PATCH 4/4] Add comment explaining "magic number" for Sugar zip file size --- scripts/GetCopyOfSugar.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/GetCopyOfSugar.sh b/scripts/GetCopyOfSugar.sh index 9ad6985f..32fae5a9 100755 --- a/scripts/GetCopyOfSugar.sh +++ b/scripts/GetCopyOfSugar.sh @@ -238,7 +238,7 @@ sugarEdition_Pro="Pro" if [[ "$sugarName" == "Sugar$sugarEdition_Ult-$sugarVersion_7_10" ]] then authenticateToDevBuildsCommunity - downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5839-102-1-8005zzz/SugarUlt-7.10.2.0-dev.1.zip" + downloadUrl="https://community.sugarcrm.com/servlet/JiveServlet/downloadBody/5839-102-1-8005/SugarUlt-7.10.2.0-dev.1.zip" elif [[ "$sugarName" == "Sugar$sugarEdition_Ent-$sugarVersion_7_10" ]] then