From 41d5d96c6abb800dfda418d3fbe673e4a92c34e6 Mon Sep 17 00:00:00 2001 From: Tara Drwenski Date: Tue, 16 May 2023 08:55:58 -0600 Subject: [PATCH 01/45] Update links in readme --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3774d58e4f..dab32c25af 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ installed in any servlet container such as Apache Tomcat. For more information about the TDS, see the TDS web page at -* https://docs.unidata.ucar.edu/tds/5.0/userguide/ +* https://docs.unidata.ucar.edu/tds/current/userguide/ You can obtain a copy of the latest released version of TDS software from @@ -39,11 +39,11 @@ data consumers find out what data is available from data providers. THREDDS Catalog documentation (including the specification) is available at -* https://docs.unidata.ucar.edu/tds/4.6/adminguide/catalog/index.html +* https://docs.unidata.ucar.edu/tds/current/userguide/basic_client_catalog.html ## Licensing -The THREDDS Data Server is released under the BSD-3 licence, which can be found can be found [here](https://github.com/Unidata/tds/blob/master/LICENSE) +The THREDDS Data Server is released under the BSD-3 licence, which can be found can be found [here](https://github.com/Unidata/tds/blob/main/LICENSE) Furthermore, this project includes code from third-party open-source software components: * [Gretty](https://github.com/akhikhl/gretty): for details, see `buildSrc/README.md` From 8b5956ff3292450120f8193a611fb99d15db646c Mon Sep 17 00:00:00 2001 From: Tara Drwenski Date: Wed, 17 May 2023 16:06:02 -0600 Subject: [PATCH 02/45] Remove unused test jar file --- .../dtswar/src/main/java/opendap/dts/test.jar | Bin 88684 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 opendap/dtswar/src/main/java/opendap/dts/test.jar diff --git a/opendap/dtswar/src/main/java/opendap/dts/test.jar b/opendap/dtswar/src/main/java/opendap/dts/test.jar deleted file mode 100644 index 05be23356ab13509f9682ae6ad0f9fba05d216f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88684 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%0A}u{c;WPO+46e^h9=>B2p`M9=F% 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 F{{scd#X Date: Wed, 17 May 2023 16:08:43 -0600 Subject: [PATCH 03/45] Remove unused epsg-wkt jar file --- tds/src/main/webapp/WEB-INF/lib/epsg-wkt.jar | Bin 83462 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tds/src/main/webapp/WEB-INF/lib/epsg-wkt.jar diff --git a/tds/src/main/webapp/WEB-INF/lib/epsg-wkt.jar b/tds/src/main/webapp/WEB-INF/lib/epsg-wkt.jar deleted file mode 100644 index b03bb9b044b4ac58faac6a3b4d5f5ef5ede1012b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83462 zcmb5V19W9g*De~{wmP2+Z`Jn+ji1%(s9Q&I=0P|e!uVk&VTM5=O6d(U3=^? zYd%lSSyf}zT5HxU1sPBH*c089C-YraDGy(E$dH#{t=?<&D#|6YxKd*mEU*flJU&$_*u0VRi>bx&9fk8$KU#)0U&?@;>WR{P7!Ojrmwi z$+5%#T__<*^{tFSkQ7EM=eJgN8tp3DJr+3cwiYpp)-`ynEx`^uX#KZ#apA>kH(&&zQb%V=`RI%!B0i^(9tRU^n5k1|x$izXhjX<_r)z|hvl(N}Qc{l3 z_O*JQuZM^n&l28kUCdGuJ3)#f;7p+`71nyzP_`bZoj$0wpD$-S8&ONOAJ6?Ap6t4B z=~I}`Pt3Xc=3^^wkluqyt@8A_UEU85xdQ8^W1}}8^pyL~$wRRti##@Yk_)jT2{(XDiV*%y5RWdxoBNeFU9LtQEJAPO zytBZ>?)J#z{RlcwStUz~ZW1gBe|iQhuMi4fPy(1+P1xL@eD2K5mEnwI+_ooA6oCM* zmXH_P(LA|MG#h(S2rnv-Gjssh5iWd}%rUj`*ePM^aK(w#g<-En&k%Ty%ynUR_kNcG zXe!ZRD1^)S;l%CA18&<946%0?D2KAILn~HK?#GxIuwu{a=>qeLm(=LSf>WoLOQ+u* z*nB!m!3y?yXICUv8tMohBSipL+r)b9<5JRiOxp?B+ITeqAHMTpi1yi8Ty6&anF-vo z)Br+VQb6|V(8Xnv<@H9i7d;uw89T#@CP3qA`+BaLf_5&V307msf+U=~Fp`2<6(6kv zi&90BSfMOHSXb%kWK_AruhZj$qu8$jNl$lt^Ud}ycZHR32Bz~oO8Q6--QN1G=n1H% z@%YKIrSsF~y3ne#y$(Z|3b;pweErujYGD)WY7K7F`<51*@&@IRESyU^qYHFGIDNM) zu0HMl%e;@}_SoHa6tTYIbul5ZzS#t(l=szOLT%bpBB@_Dlqg)t-L?$Tmv-<=i$saE z8q5&kBQ}`o1?D54;Q zVvhKecwd=ff>VOjVUJOC*-clG`3L_=t(aSvAYj+;Yxx>p7D*DQlW|YA} zaxP$>d@B%sSr%DQR>X;wm0IDJid!TaS-;l017h*lN!Rd{#vbE+9ETXq@N)+vRn@@lwJSN7F| z^i7_Ce?i2*AkwZc_xbfk+e@0p&)#bR-xruf)P@HHESRp&s_LJ*Y}bX`A*#C~{m($Q zCUIo8Xxias(b08hMddL)+!r;T^k&7Bi)iTE3sMo`-gvBOy=#w1B-K@1B98FEKoO_h zcstDm^mMwqnA>|#RX<$sZr}Xc>jX;W3oA|er_6cMRMpk9(Bonm8Z6a(PX_2I{Ey)P3^n6b^FEB8p@7CV8p1%EH@sD7n@B?Q4kflyU%I>`|MayNh+Z&%am?{;%hqu>9)7HpI2~%{M=uF!nUV0`E@fZh zg%h5BkYy8I<`fWl;{Ee#XKqb&n|={$>)#$)Hwdo%mc*g(R;BdDfN@LP)0kZSY0TVE zckXthC7_7X^1ROkR6#}_)IGbO=|RLCO&aNFmPUG7ix83~Y4IC8A+)x8^&*{A^O{8U z6p(}^1R!~^LV9dVRLM{w8|O`CaCq-@dheO6G3WTq&=f3MCKy|O&}i{hgvR0J)D!SX zg!tZM!DUOqc%J!Cqr?U0qb#$Vq!IBB4TzsU3q2lGZmhkT? z1aHEt=roZon|v%t7vwg#pD8#`1hL)Z%v%UC+(AhLTef^NfbxMIZg+WvG` zZSkIIr+`}NDztF|s2*!?B~p$cGCy=vOl8z^scd$hLzpHx+SKljKn)h3UHmSDYa$xf z3&#vX?`3R;)cC~s&DIs?JS`n5O-Q46AH(d{^n-s2b8JoXW7Gk5t+w$TUi=l)hPdTZ z6g;EYw8%4N(?EF9xurtxWPg~XjGAUkltzBHa^?NT?ahn7KF?(A?Eosk6VaFg0u}_Q zhPzh@N-fKv89ZAg2)rTp6rm0-2%SR1R{4#%52Styz@w2&q@frj)>W$YMTqW}g+KKJ)-Y4n{4?n=Rwf2MV(42^ zO>*rn#h;IKAGVSrcTN&f_Rhno)AZ4DPv$=?%;v_KZ7HK8WibzlDqj?wYI}p~2Vyf0 zMax9dK4&9}@bQKfOoe0=vaJk!k z!K`dt>NXi{?KCXEs7S21uN@vt+P(L;zjbNO+WKs>vZ*UK&{1W;h=ErTK{i(A2sSe8 z5}P}i;%+^Ku8syr>z3uy-T|{ou`f3|T{^pc_36gbA1@&^yPd*7e$`JpWoq-9Gj8<6 zG_jSL4r1yknhv^PdtT4YbWb9WtH(%*ryQYH^vLMS-7pmc2&_=OZRI4b#nHU7GDPal zS-C_1T_ctio<4V;E31F`!*F)F+XkCz+UU*5?;{49VV_%zWT6qf#NwD&p z!|~+z=c4owXDB-qHtD6w1d%mUBgQ*DDs+8tl~GvbZBKWH7uU-*!?O=R%|$N5VWU8! zJi2)YW^$2kOjOu#r9|9Ov^CbO357*~K>ac?QESi1fjb7JGf3WVcNJjpT&-5fO#zQ; zwe;(E<0fgDq1g~Cz*(5|l0HwWujbw(N8`0oI>5f+dE!aN47zLVa_GT4{|+?nfSV}; zNoR!m=g+JS`P9PFB%W7nO~$Q>O>;tXZ#txw+VT?D!QkDAV79`%=}c%{VwYlFVukjM zCB<}UQ^I7fg+=Q^5R4{Csuz{Grf=+6n94wV&C4AZShcrh{!Vqjm|=6dT7fXh z&#%YFuP5L~onZp^s=c3q|)X||y zBOjKUDp{R_vsOB^piEIn9h#)ZZokt}3S-l}c|y;kIVtY{_C6SeIVc2DgncS=S*PF9$N)&&d6IKBDNDsindKX~pYu zS$%9~@cq?BC2KF^GW%iGcl903T~ z&T`qe3flt<0CE;Q`zk-KO{KWc>8w@MRmCYeuiJQkUotOG>+NS_%^a&K*slT~R1pND z>Q$P7HfM+VY$?gxD&XL57U-_bQecL9Y5RK{u zHmIR=n(>tX;sLOJ{12Q;LGW@wR4^MYTq6jc6^<#2Y zT3KJXdbHIPY<1NVoBgWh3$(IYmJkzIA<~W%4UF2YEp7xJizHlMLYu>8z^pdP)H3K7 zw{St&SQR!YSiwPITsmf|1>bXauUL5jn{vch0HQ4b+1BR|x<=1>jX8{xdj>b{P*u!i ztZD+BTEdE_XR@9~!l8zvI*pQP%e7w&w$e6g!28n?69)j^JT@$JHz}c&5+)6EYsLg} z>BQ=X7TfXoZZZ}`Q!~1`^Gj9c+qdU68eKF7G=U6x@6M`RT1`z|CC}T|=P;if`P$p- zh1Nl4{TN}MVz`He!L*b`N|#rHlg&=)h?VS!wQK20mO)h0Ny^mh(%5ON6A2Fcoq4v4 zYzaR&-fyjWzz!*zpKPxxMPsQeyd9I|mrJ_v5~y8Iwi}34-^Q0;|A-v# z2rj9izkPasG+}YW{!-H|$lchRn;A6m^A*sHjWlnOPX4o6Ai%f1MaRzxV**N)8doiZ)EO422=M%SxYa)U z9N$r-UxviAvHZ&SC$*M$*38^Y!cfl;hRsL^?(Pp$T9ebL2-3t-8Yd)X9tFuJ_p0Py zdPS%|u1I?0YDj+B6L#^x42OlqT83IK$e5aCcB*+i?y!W-gsoVT)Sov%hWqk|g(|Y< ziDb%{x^5CVp+d?+=Ecbv&V8<&V^M$QBhSkv-~%K*QO=BiVv0x#TZts*US3|@aG`M0 z24)m#YtLw_IEW(#!-DR zWyqp9vHwJk0G*j~)p%q8U!jU}iVS?15(TrbsA&b-ERt4cXqC+4*7{0o%F3r83M83g z+I%s86nW%tCuS_)?;zg=Llz-OrW$LHKp-g;9M2Do(qwVh4Wq$?iG-~|6Wo)gR^AAp z@e&1duFmgm330O{B~*w+h!OLfJx6Mjjwei*ypqgwk@^jpRI8}tjoY89&xr!)Jp!~vty*N!J89y3slnN0>6SgjlXN&kun{YhCO%o>81>q_` zGk8v;46z7V5dT)Y#c=bSTNw&j$k7O06A>1wh$_KFXF12;0cB`{6koR*VB(s#cBIQb z%0x<#)qf!84d0^G%I=}#u3}-Eg8?TjDXC#Ad~>_;9)>8n6@NEcqzr-KEF_0}5X*$% zgA`Y{>QQ7fMt_Gsi;>(i8Txs%$F~~i>{2TRi&P2VryhVK!N4{;*&Fu6hh++9)vzs6 zBq3K8rDY%B?$8|!!ZN|A`c0doqd(P1!rU=YvSQ)9ysf9*vmi!hd{tSUY3GE9g98_dU3){h7MYi@&1- zTX#GXRf2!qY;5PzoJ##6u1+L~oMfSyaP>te%jO0Cp}+D;>CSw>>zl71UrBiwooH{1Kv&t(@rwNYG z-0Tg&g@dm66(EBt!&5(Uz_H7aZhB1LgNu3ST7j^t@gpqYc@P+7A^0 z%Cg32^{_j*utrk|i&IN)X8!?U9&lc#p{v@b!OPuU=f1JifvfLZPZ;s;_J~LY#csTN zd_7ae%D4BPHnqK8ed({AB}Fd9-p5W9-KQT$)oDu+v*HtshE9=wV%mj zRgZ@N!)$kX(bX-pwp)GpPQO>NR5swGJ)^xGfsupDNJ0Vkdq>o-ykoQii8We?m%LsI zv6{CP731#8acy39oqiW(DQT+cjL7C8M=Wxt64(x4t{H!y6#v{DhEU8GUu2avnU>jX zJRdSkf4H$}txtW9_t>guowBBsCs5@N%)eXEHCH8QjZhExsa=mHwbuGsZPuvjHoBL7 znBH8wz3sic_~q#OH?|(fRq~Er!T{FDNmSAK$0~8^&@J{yty*R1%>uNMepLUN z*_^#M&nE&seV>*9iyj|~UXNR6_ck$Zi&ex96VhOuaI(wh>)}S|^!J)w`&ZO>zL6%> z&PbGyOMe)j_F)uP^9NTS5Hc{7L{?oO(JZF36V(D;ZinuL;IB=EoeLy`$A@38qSnU)vq8+piB?cPCB}Fp0u?TE#e; zjs56ksdZDV78IeU;ABjn$q~M9Bz?;A*LE*lpO`c0z0=}c(+ZB$8G6%Ip3@%g_OTrn z{iqZ4E+7*{Z-}J!%hsK;`(UFHXRN=tCUW!QwGq&707HyjLd-F8_@j90+z1sgB z&-2i17m}~C(b4s@TPpX#<^CN-hSNBQrnfCPH90qc;QZhZ&GQY~GOc%TdPn@brQ@z| z2^(x6J}IP9o8d5W$4LF{BRMaadpwQg`B1jth0)>UD-ber5YGsSNs8E;*XQNi?d!_> zTcK%CG45H58f*uq3T)`j-`BRtM$Exq7VVnAwbfU@Kdo#PmGAS;0SD3Gkz^-lS=dn} zWYI~D&KX!klWG#Y+N7M7hk#*)ry@j{+&6CY43o-FK4V?{b`xPOu*ORMi-b*qWJxG0 z6?7#Xet$*QoA%82ba{#uJtD(gTIkNKb-<66&a$Rg&Z+KoIgF*&=chpzMW5&~{Echp zZjC(*v58R_vB7BRa7uChj!7hyq*cN?={bltI_wC8bgk|PVu|Jpx)5M-c5uaDl6!ZR zdTL}p7Mj(Yn#*DaoQq;%j&+&u{3l(>E8lGuk;zfpR#7`~_R<&!dz3oD0jLw6*RT_~ zc9l#jBjv#`ZC^oZHL+Ut2ZFliD9?>Tt0K;m!b-c4MA8jx1fDTTEpxB$CuiGAk~IYU zzo{h2(9QuAJJ^^xv{JgU%uPj+P1kn}?n=swQWbLh$dcb#Me09_NGj^{shj$f6DXrv z_!skji%N4VHusDoD}3J*x!x@Mz?X`NR7sRfVb8u)b=QdK%CYn1i&j}MR!F(SYV{vc zNIsIG4)VfLkZ>Ust{aSpj%+b>1AyxxDy@$GUKay1i(c$C zLzYmZade_n?J`X!G7XL$IooxlB&km7GBfFGitkd6I-yhK1?{&lFx`7b*Y2(ik4Cr>`$>cgE2IW0Jm79*C*U zc6FbsZt7E6I=nEqiy0NPRL}~}G7KGP&9VVC+j0ZQYS*dt2Iq3=$_ZU7WPi=lt?J4C z#dBuY6dx9EtKT7y#oPKFb7{DSN%9#xK`bKBt`>cPX+H8qu(^Qs<$@RIB8Qw0YwsXw zB5iPv{>6=+A8UJi)b=A*cUM^1O`Ma8`p4RJlp$yl|0Kl7C-4*Y&*6-U`EBNoQHtAw zN`#~sT%1;h3M-Ape-?qW3(p{Y!Z| z3<#8}d*$SZ2EK{j*;5$m@3q&R?Ue(?EZdK|1)yW0jRYJfY{@~G0|84KA0Id-lP%il5>I{;zoXb6&LE z@O5PYbsO^`=K<*B>qwQ7bygdN%fS^$GOAE30Kf=>$~$kSyuG=5E^?(t-OXl@1qcv$ zU*HN1!o{ZfoYaDRfosS8}s=yNjVeYpysC_-G-aI_7(mnDX^$B*`nW8R2cVV+CIJJc7EzvBl}^%*)?$ zpGU?XtVU3aNneEN~Sd0wX~w zvAt!4VNrkvwE_yLK+vHT>Qi5*lYtd{*5YSXA6tF6=`v{cc+8U38Y|QXJFrq0{ZKV# zU+5hq>K=w_0!FZB3jCo)dE1i)xUS6gvax zCfm=+nmH>8%#*I(dt^Z2eu5CCypoZe`MiJAu}-|T1sK(76xD0&u_g|5bRCK-61jwc16GV2*5C0}+NVT(xpCuIlH9HH6hL3jLsz@4N(2M4YDH0Dv zr$h;?EWd2%JJB(QEb|p4Gc*KX$^^n#YpGi)dU%24tBBxye_qAcTyn&C_;ils@s8eQIF!$`sFB)1bS8A+xJ=i*^aA_}%TpfM? z?>d9Ms&}p$X!B&nkj*sm2dGi1>|SbFTOYe&`|=vyJ6{DH{hO`|a>vuR30JyUiDOF0 zkrvpJ6Cvv-7noik)Lzq3{-1UroH-lh}p;+@kPHWM};Uj)*mkRRg7U9SCGPR zRTz9#&z&O|1)5p6~biNqews^*D0?!-FzIUqzc? zWmY_M%h4C7CZ5(%yhg6yG#Pi)lU5WeO76MOV0t10Ro#rWy;rTBRI$* zdo^Kk&`xC+R7FO4ZnR!77V?hOLF^jyM8U?#9Hy%7jf<7Zx(%086oL z=i)azlm)zPJPDrS0^j>z>##s^^6cX^D~3-RiCyS0#A~2WCB76}+i4Hf&N!V)QJr2* za3VFM2+k9Ue=1k_VkhIIC=`b+n_bvS;(}}>6;})+t^7ge-n_Wly7fsGLBDISIyPJA z3-d^|Bw@EQY0bRzgba&=IvT|jSDJ=tp3l9}zh+E07jc>}2`+JQ9ZH|MrJU4oTV7gs z=}o%U9LR+eiB_I5YQ0BglgipvF!KyBB84Vj)|6{trnJANS;~c17}JuV5CfZrK_7(< z0Bq3`vFIW;d_M?*BkELx@Xf4oQ53D=TOFjm>E6qwLNcq1OOot1yE#e3F(fJwztf3Y zo-s;$=S&?CQh3lH3KX8LN8~>;2Zb##Aquz&-wYxq)xw8(V8$T|`^iFm#n)rIMnCd! zV}%h$(F9~m^wv#US@57lSeEtfba1~b4R?v^Fs&2{8}#-ih*S+A8W*$uNTcF|VSet{ zTpv9Q3q-yl_De&oHXL|$c_WQ1v;h<(-tdc&QG_6q;QL`6ccx)%(beewlE-~zjmPX5 zaoZ|JtX-AIDwp$?C19H=qDbEchC5??^0x3^yDn1&8l(Yg(D9%r^cgo<{ar*d3lpwLe!_i({H> z0BM$Rjx)C=4DhlDlLA&-K>M*r|H!a_i>B`|{_e~Iq>9zWw%%N|I?e5FZfr;e67Iz{ zdyhZ1)#ffxkPlQ5>_|FdNp%12iKV~wm#?YU;q)n&aM!;0N}bd?>`hzs*NW>y%c=`b z=Gz{DYRl&whi_FFK>5RI$!oE`-)>C;(gTN_#~BUO3N&D86moa&%6I~n;DXUb_4~|$ zi!>&FW3>OQChwZC@tLBN0n%Ktqs4G#i}{qB)=5Ol7N89UK}KqK!{|u!l_Top0rxoB zU$!gPV*6RMK{lgjSYjzXw~zqd{~HflT!-Mmf-KP^DmG5S*MtE2PX>Zl@Q=DcSpqW_ zvWT9^62khQX3IMnKh)OY!{D0-x#1^P)?e^wHbdQLH+6)QzabW8xu#EueT7j0i$f?g z2r=wQw)1RkC0oy9)4SvO!Tnn&4tDlo(}gqJ(8Qrv5(J?F*5SEkxn^T3;aZsh=O|G}2^S4~IBE?xbObnn)3l z%hU>Nn6@@fEsNVNuLN6d251U+BSl#FNxhE(vY-9DQ{#nje@j6X?HLlOqC{)6g?-a# zY7VZYNNYa7uu1!D8BZg`oknsP?GHG;=l$gDKS%8cP`;qWao29H(x~`OF6vks7@sA- z-xU|3pfI|o1pwD@e&WL{@vnK8vD8e$=e0ZNmYS2#beeZo#I^A{3t&K4bI_^a!Zlb}m@%AA4+=^K;Fs9&(C*&3bN*0%Ea4gQd^z>% z)IHM?F)Kx2>0tZ4mH>f*?;$k27HOR^NqX+sjc>WOIP04;B61TQHcmn0ryO>@#=`?~ z7$p`v{0)A8(oIh2B&jpv{bgB8Nn72+wdi4)fOlB~b~KY)c5`$8a}t9SnSh#*vz=$BfJGBF%i7Wep{7UUt65n@HNi(7*Xq+w4+%hOx!%0NOtmB~rX z!%`AFC2rTW*=lHsmN1jdrigH_mbs9ht~`Z93Fjncb|0s^ZM$x|cWSC#Gjqg<^*P+p z_lqO_(nx)TNN-KmeVXrq=G=y{kU3Ptu7<-9Ed(OmcWu1aRp3Vau2{FWps@ysKyEzF z_XcAv{pD7Dc6=$l#w|N)32;1I^1P0L4hn>!!98@1+OiFh;~H9CcWnD~HTYV}5{kl- z!xhf()lzWwh%HNFa!D57Vz-}IO+sH7S#%Vm@qxp})lK56rVHZR>&NaC&T24{f0K%J zee}N z3+E5x`kBm^#%OV=&h1N zGhUpDs%wI)E@?tC*Gl~l{KKvW>dnqzCL&p7h`R$@6j7%uE=+yIUemVZlN}#FZ)*fz zVOotWlrb|zl?IE5>E^>M4aHc^zKbx^J!n_4+2ouk1`MYg`?r?Oe8*EDJP1H<=N!XA z(8(#P31)KTvre9qh+!=9DUp88>FiLdSPo;(m94#e}f2 z(eOfwwnD9+uJHTbluwTD`0(Y;Gp|1FVbV@?x_y+XUY@RwdOmz=YzsYpHN#iYMP*MJMUn>LNZsCFfGjwn8<={s~7eMx%B zVmN#VuD}hW4S*NO1mOj8V90yD-Z?o>nGv`LalD5CyY?py@5B}LMMEOCW4Q|_x_Coa zIPdmw@kszQ?ug+0jd<6*&u< zy+7Y<6zd*;rpMIOnE%L~@i&|E8E{0p!vpJjX>e;XO?d^bcJ{XVQ-?i?$&BTx44= zN)N^HvXJl~Y~xP=Tlss!N;#eVc4#6LLNV>uKtx-8t_LPtbqArhpvdeUl)KOmD}z!L zIyWVjS-fdtC&=u3XELsb)bFx?){boGxzYek#HS_n)TWl8EYZLJq*HATl&7!ojB**7 zEt&-%hl29y!>30kU0TP#usF_mVc9_E#Q@fK>^pnlmVLPFZR!62H>Ba@abgeu&q_Gi-^9{Sj-?SVpw-Ve9BfKj4ER zwfxoUz3TE~eFd?y*vrx%_2+xJ3y>r<<^q`I``o*J)H$9awwSd9^jNXQULt5}3Qzk8 zzkhm+o@}jsFUM=E zJND0?FW2fs)w%S~o-DcVT$)ui*tI8~2-dEVmGWZfaR%gS-4Vv!d zkM^fCmhpIyLf}wp53i#p+`liymK}7?Hi5d-! zi;S&|QIw34+E)3hPZ3y3&Jvy)MG-n$TDy#yliFa2s#0i>h&oWwQdumx5QHS_Mnr{E zOyyU>ueE~rFFXf844xX~AN&wICpA&FC0VwAIzS*+593oAZL?OS8DRJknzdmq9U2)n zJlMZ`-#^@2DmxQi6hV4$mPMV8W%wD4)|asd4x>cXccu)zFAMXkA{??<^%OUMRlwK{ zA%ZQkP{^ya@U0m7Tk_qep){0y_^i?GJ|AFKR=Pi_sV2C0u?EOU$r9yVK~KnXPTKO* zuqT_X;?w(%w?m(HQh)MN;J{gOvt`k2KZUGr@Ec^6oo)-Y!H%UjQ;Q|mK52wOGR@az zEWx$U_Zu0*C<_!3;Hq!O>4X}T+4U_!=O=WX*npo+Z_M#njG$eR!|r*CRDdqw!>zV+ z|7`cVu@MJ1PD@x zEy=epA4(3(p_5`bITQ%8i0PCjhDv&uar-QnVh2bL%6hyPr;%XsX~(H(fMt*TqK+7h zH7{Bd(bOh?1}r~<*AfaC{>f;w9}{z$GKBmljTnd(&xGlcIEs!nl$bTa9F8~-Sb5w# zZ3hG=cv_TzF(d$jmg&+kf*~@;jT1GNUk@q}p7V>3jJb@I1uH>FAJPi}_XP-7U*5Li ze6b(~W8V(*L=@055OL(k^Q}Vy!L94>48zwm3})FmGX9RV9DsZ9zRqaKNfyhm^3~X~ zp`Lx%%Ja)@4Qz2;1LuuHU}zcbfkC8L7nL0-luUF#P*E2!jG_^3FHV$~^*RL7B926k z$_!HT5C~jD8OMk%kl~CYR=`gVL1L>|@MRN4`=m9XUpu=a#_~7?4;lgL825T@;CbgY zdQj8QbF`OwdbFbO4M6?0C-Ba=f*R3yo}rV%^CYki69t=Wt-v8-qlQ2?b{2iY^Q5qK zlLedHUv-0{3795zNX?@lZ;fS-Q(q>nqXe6=Hvzvi!Z$HMRGJ*rX5ds^&KCG+L!vOY z3yK?~%#I2`k@x5dHKDNSgv4dcu_qM7hxMq3gqJO#*|oUWEJE42k%Tt6GrmvHptv-- zEY85Wx}3R&(T2qR*e)z?j5|0g1YJnY(h~Al4N8}>J~{(D=6v5q+CW}5`qZQt=ktT>BsgLC+Xnm zFX#M=LqXRkMT1EZGvQ4j;_D0Kh4y5zzf%b7#X5@`N^r^h4UBKQASEhlh(IAOzk&Zt z%1?<3qd)p1DUapV=^Tx87Z9vQkAR~c!55nG@+JAJ(SNjAAf}M;8CD>7-9~*?d8^T1 zVDrrKg5n3wp=`k?HQPANZET*fPL4#TLAy2Eo(@#QL?WL;t|vZJ z?}(p(*Q)SsS=>f^z}W79pJui*n+xs9sbCI|XpTg#K!-GWaLjF*U!YD7zobb`9&U4C z1#Ss_KEfcvy2;fUZsVy<2?d@n>FP`3L5Nep9tHAJZp4onpzfnL!KZ1lHMBK?x*11o$t_Zzr6Xh(RpWSDU9pU;|CIecxxa;{0) zen3h$`I1TvVoRk}fKN?|g+bQ(pi)4@d3g^bt*OF?TZ^pq7D8=)1Doo3b%DC-^}t;O z+O(e=4O@A;Jpx(QIw-8P|4}(Lvh&SkrpHkd3ZpLvcat5;3GDJZaQN*tCIkqvsiVB< zb>Ym<}89pCOO!#G;jS zpuaX%etk^5Z6cJ(IS@vqItZy)fA!VZwn0Zex5(0lZ57jMlD zP#24BAo7(uf6jT5Vl7C-3C-tbF46S|cgd9PDROW2jovJG%ZWjf53`6 zcq#vYCzp)CIG;HkW94``%%Mf3hv8o*l_|>us(Gg>m*GoUN zqJby~X(nePA&03>z6G2g0&#L_UB4>_B$WK*zzY$Cj^=b_-FcM&`6lgn$qp5Wvg~kT z(f>FFDW1HuX@vwr#`tG`CghS3BbsusYl;X=+Mutz5PVC33rjK5J4pyCxi>&r0<_yd zny~=w5g{0fGVr}5_QCs8)=-q{;vAe<0pu2dKk@hh+#jyA?hPxP2ez2WrFHo}7m8f` zlLG@xFe32UEOzL1`^eCQ>c$qF*Z^c}V%_)gf@=Uuc`p-2xEE|FvkmuhLnH#ZWTX`> zBmg>#!`Xeag97cFY=S){6fmlW{efMVdmN2;8p)O%5(xR#=Jbht?#-AU<7 z3}Xg;Z^5=EQ*ce8G*$X>0B%g^h`9)5Igft(+2}Y0S(8)r+eY^{dAPo8k z3+FA6V>V#mnqXk2?6L?67ixHU8!@YHa1c8tizOT(#MtEuvIdR>G)4je2MppD6XO#o zYH&c-%w#jLJq;ob9`gunh_T)kBr^u8vC5z=7ZE8^EO8%U8p^}bbHwDmRBMqiuxUzsKr`cfGPaSG4m1!9z7LU|Wtmwf7U@?MQb%(93?l4XS*^f!wIU87&Ljjmg>e>3 za6PS=ZZN7WsW5WNlYS|5PRoTgDeHfU!KD8YAt@*i(wjgis=atDga4Wl^A*hekGKsc z#+L-~S9!c)9EX&T1U2Y;mH~P+o+|^zN05)0P&w_TJ zg~Qu?aam3_Ssu(nT9~68T)Ozq*Zk{mQ!4Y$R#)@wJ*8@#r3h0B|41cY(uunXC9TMz zqlk&1O6Es_7IFwBuPD>j1YDYxvUvqpbtPd%SE{2{u)_6r1kx-M-cy?=YAHQoWIAEp ze95HJ(v8RorYY1k73KpIDp>65JlBa<5RO+rkOA&|SI`NjiR85VD(+A~ zF1xE=`;WZPO~!v$WV5@vwdW9JNq!CgNjmFKOXb57YiO$@_+T*K(k?@|G)rak|6Vb^ zDzhd~{_n{hV6jXn5md-dt|2SS=YT`G^L+?KrUDM~!ae@S!s80=P$DSUz1u8&mtlO~ zWg|y486?!nc@geE9-7-@$si!juSs#-g$f0APi->(z#}SaO|tvPdTy5?EtjBzJ;lZ} zE(G+;*S>^?Q$XIPTzfeO9LZhwLumaOkVsdxi?ThI$q~;vyzz=Ai|E(nmuxbQ{L|S6 zP`G>cIl!0Y{L3beXj4e6lk<|yFUul-$401EF6je(?yqD2TV47e^%w%<{F(yCeW*}q z_uQ9b_y%RIg?1w3e zb~cfwp3=YF`VZS*{%^OiU-Z7%9zX>j1%KJXcU@lth$hQs%ewHjNuPc>`_I{Hst_t# z*$+A#6{sJ*8gt^t8^038e}FU&_-f7)Yk)Wda3@@0Wgs+R#uFcTM?(yt;n;0im+5E| z&g)%_q_OhdpQ2rNXe;HNRwnU421ayX*kUBu3&ajOnJqSu;O9u5YSe@%m74lL8i=nL{z!NYu62qU_|rvp0qf` zlKo$plO9Vr-0`juc2ZpV$zK>?$n-xkfW#)m5;7egNZfHB9UgI9P~x3GnC=j#e`A6W z_x|Mh8w2}a%qz+;DDmEUPs_g({~v$?Qp-8(Hqupc*IOLv4oF-aatHL> zp^!LobG&A#!C^i}Loy6p@K~LDo{ymsvJRQ;Z$U#oqQ4mqiK8&bYY840ekCHtA$LMI z0C_0QQ(Jz4oDIoDaKY1c+$}#M=>~3XXSG(Nl}3RnFnRO88=Rr!ke}gm-5@i<1<%*H z5C0fj^DC|sE(y6Cy21C5INH6`wqH@)H^>5U!N2M}CdD`*>HP}RevURA1x3%~Q_dqv zPeMSwYuoPuN6*w9Df^d*90o>Sp{eNvVyFBOnX!pY*n4E<&Huo>CbIm0z%&d0%ClkH zFaCEPrU{T(9e%xD{X36NE;j0~Jh;E}RC<^H!VpovI^~IKI6|xGJZLxusPS{iPXQyN zK$rk*bwRa1nAeCc5C($&KNx#@CXs((Pa?k^Ivvp z!DI~j8w#+Q6*t3`Es}m#sDLGPgCTkvRtE zOf8XwmjgxGfR;g0LWoK5do~530<9$x^>QiDf1&2}V1(h3KttA{Wng{}Spf|Z_O+IL zuvOZ`QbLHvxT|VG^2czu-`ej$1g+F!5m3H*j!YMr2zwAp?&#(g{)wXnieuB{*t7y+ z>t>N8HrfdEKjAuU)XqIYiB(Fk}@mM zuC8%~t-|K6D$(2HbhyB8uK&VYFsffG%%Lw<`e6*Ryq&$)ARKv0-*K;F?8Mnx-BD@ zI326k+s6Y5C#9x;y-zDVG+@hzDczXB6MR&Ip|S$w`oib zDH|lWm&ox#$*y;KWI>)84Zo2M(7eyAeS>VG+ND$COZ>O%*J8`1>$(_BuCzZit{_fkE)0mC&*#=b`U7{pJLF&b zgQ+VR@n8Bw#~%^*-}(c0y(i>fGJvTo1o2;5;=h=`v_vx)E|d4a^vD0gr2I>NG(+Js z{jFI}erpz{?hx63=LtmopBT|!I%n&o2P8NCVE!RDbpBxeD>wei1Hz_m$n)EG~vi9g~RDd$;K7KK^S0o9h!tr0J^%ML}mdx z2y>&h$sdfNp4<014rA|29|&{O2U@7E?24c#r5>M*_>~7lxv}&oBV%Qvh0t|4U!aplRp~(avkb-ln6C`7Wq9?JP^|}+6hMyk}@(W{bu@G3Q>1Q zNWJBIcgF}letw13C_a3VXhO8D0m*1ttgUX3OE(3!V0>9DvK+w&-P)VGvJ(DCi?m z4D#?yq5-*j5R>qJv-aZ%7!9lN@MIt^jkFjohs;Yu3b^7XC<-{UBHQmMM@*2p6kwG9 zKir=Hl|}w+bcL0q{lBp)CS1cLr2B2!;1}#R?b@)H zPS*L|sx3D-5U^s~BmpEQDgs&1|HFC@BqpH5tUD<-Xe(_y;j(B8D!}@` zv8ZSdPbU}_fAE{7cDbqigML+5R%iY}zgU^vF8`okm1@v(g4kND-tF!q$xmjB*W*GV;jr?~cXk#=ls1K z`yZx%hv#tmU#16H8~?SSe_MZ;p7fIV7t{Crm+2AzhxH$(2Zzyd|2Na?xc`&snf}G} zxPLP}kTU=p_cOHL&337o(97laNm&kqoWg1C-Qu3j_2{?K$gB!$8E3V)7{4^{c4DEH zZ{Kpv=hp`8ui_FHXMEpOUGB^;{+#Ag{;{T~naoiwma0`F7LuQoP=89Obnw;bda-T3 zQ>b(5XHF?JRmEC&tyU>YN08|i6-hXrEas$m8cu{6P@i$Mf~%qa%qkCj2-1{k8s*aW z$EWu0p`&eiO52uEf(FqycMgdqgMdKQltTEXhixGoJfeM=z8L3KIq7sXO`irv^7-S2 z*pI=i9!AH)ow7>-EB%id;+Of9aTKBaRF_?|vUBfAR`m-8Vks-A7yzaGmS@dPO?WCGF_PjB}?dWIAST(uIxJVh@ zbV*r@i7-{5syFR-ILENk@4=k@nV{9>QF{fk+TWIEi**HdB?gC4xSxM-YYWjJVuFHfE$QNOSsXVs>Om~B~mH1_~c0} z^3(OF)~UjQCaFWuz-|L6QIg{H%j&4b6`SmpQALcwE_MardimZW#n*TF0`i-mvq9{$<>KFAiHS3;PKG>Dz+1Anr; zAaA@pU@m@lhT=tZcD~qC^BmsXQQ7=6k4Ut>Bt5^QIuJ8qv$C|HxTZON#6MsKZlo43D z_h9ql74R&_la|C2w2Z3v?P?xG**RnIp5j-Tp zEzSjGFfu$4W=Lq{vtf*~MHUrCLIIEj)3ws7E>fYEy@!4KTt952QlLSg+l@hU)d-KVq^vk!Lt{@5_xC=S=nE%Csn zw(IHKA7ZJ&U-5{`NoCMTJ!@|GJqKEFYVn&wD0Io5LCAb*-Jnn7ts!6s;Q`Kl97S)L zi~H}wG|%H{PMb!{?e~^yy>Blk3o``iVyk;cgoTaLArg=Sc?bq#a%HBHEA$27(iP!E zn2gdte!{J*(rCpNKfp1Ex5eMLqJJs1ZbEKDI_z6HK0{n174%~GGHix>(z_pG)6Zc_ zPw(l7sfKiov3F9#4=4oQE_Ar+lN`f1yoV9NpT_#$-Zz&sX`p@V%#n#P#sC zpn29D#^TxX%^WMBW?a_hCq8N~FM2Fyn9*w)u&;ZCVE^_Lk1DAmWOuwJLa5%-ov+{X z0U^qeQdc>~7DAn!SHxX@oEt|ZJnLtFjbV;{8Ok;uG|3*jsG2H!zLYP!DI7?Bc8Tyl z@y0Dd-bta7X2dE7^|Zy0F0MkF<-vF;{jBTDOZROgdvgd1YnUBKCukS~TCM_UdRfI_ z_A2!sx}%I8ky<4Pep1qjxspVMrJ^9vcvi38Ok+PV7mQx;9qjqf=P#1Wiyl!kp! zbngnYzCmscSOoD-n%9WH?ly?YUA|1R+C$r6qvY=iLaR|^B5m#i=nEO&Lg z{#`eT^;^(Jwxu#vd1fufY=29Y9+x!GadI~&&*b_{xMh==dBh}IeBmdv@xBa zdR?++_xP%m<5IKh;bco%g;`JzzEiwjCWdcnjr6AJYkBdM_>}SO1bxZL4<^)ZraqlQ z+TGSnxsnH?#=cZ~6n7VLVilkf%x3b^B}vILesaCt-dRneLtWj*doaxKRwS=N;R%GYoF#+nJ^JDRi4AdyaZv$u~7>r)E8&g!Z`#+5JELS~ec99@m1}+uQ|D%ykDA9vN}j za=U8`W!#CVm`^N|%h8u@ZNn-3HXl_Cd9`DIb>q*9Z_S>u{Oa1W9?Y1Jjhc^b($iM* zx;HPs{}5dQKRLi=gCWuKNoNitlWT%}BhBy=fP1#Bkk-}fb7ziulmZV9k^s)NRn>%# z3j25%=lpXPDz9dsa|~CJb=9R1JAa7dL@CDFn#00`p3@#&?Rd)+BqH$$LMH5nBpG1= zU=eRU%(`DvIQQs1H7e2Lwj*3{W)#Bg9`Dh;|i@$vBI;-j*yg^A=pVCTohV!OI*{6HMCrMKo5nK; z?F!|D=Bl!%W+w_P@K3$Al1ylgZ5?gS_FkGidk58sc3)lGWgfy9+res(!TTdX^T?!N z)kOftf{e-tz&d%P;I?>j%r5Uy0M^9wlve~%fTJ_%I-~I1Sjyx8M9n}5U^D@g(^}Kj z^j~nn*oceh4rp?8x3DHD3^6LkRWAK{0Jd?k;e?rmi;* zkbo3>M#5m8OL7Nq=D8mLv&%6nnZeijXyfpdiT=~TfsA1bV7LebE&^hu`*St%Esth_ zB}E>(T65SbpQd{U$(XhPj*C{!ec@!qH7d>ACwuVJF_6Z+MC)I)=^#gS-W8g*(=r0z zT~@zoVpl`0wc)dG#xZf+)|8CHaB(C`BJtt7C0m!aW*&y-XJ$J;#c~?P5uHj|i%4yWsSq@Y;P2r&c4eN@M?Ai(t2tY)Se8Qt zJ9kv`hrke+Oxmvi8_*Poy2nYn=~izbW}TVX0oI^x!rhaYr%}J@#{|%>u3bIsEn;ya zqpHG9mQZTvU?NhKoCJvbecG(WVB>Ba?IIpXL;K)jp88hXxVj1;nufZlfm zJ84?!7(5_ZA%g~J69gi&r1-A`IH2vd_ct|&AX~rMrrPkjFEpS5nmvOnBd^hDM5n0I z6B_d^F~?)J^4|&U4`|x=JbtM<#a=xhq=T3GA*SNlh)9dlf-bD(tmVw;W^p2=+?jsF zkYsZbL=>nSJ|d=~bNgiCD3HNK#WNBUsD1jaH;eDgp{dG&Kh1F;85bg-Z4vA92Rvgv z9M~bFwNb8PoI|CY({@n{2R%v(<62t$GWY%i5v2M{3KwG6Qfo;f`K>)1a@Iwxi02pE z+r<~@1u^d-v(}X|s)WF%nQC26)i-i}h3#7>_lZ^}IJC zQ7IpveTYgInzOcba%dw7=O1!ZRf%=_ zv;sK(Su!-q81N8|b^q)d0*1mkr2VAJb-Z)53*?z+nBw% zAp|GEd_W^FEk?7<@ebV{eE+RYyqc&9ssz~!rWIOC-O@_6S=6p5{bQNW^1DqE*we52 zWY%to+PgYlfF;7-zF_V`!>_c+z(MUdpk8uDjMG-gXg+%j6Q9la+e8VYKw=D@*`%(M zUMBQg9s~2!o7MUX0RZFiOpRT#hR(rO+K}*LN%~ahpZQwXMxvB2);2CAsR-b$SEE`d9JOAL@va03Ek;Kb?W*KSP)hJQP6jjH5Zw-z)A*R zwtik$4*i&>>lTBB(HxPa#CW;@jD!s^n`F6^)63DRCtrD%BISiu@04IM55P64Vpb51 z$OeX2?!P=2-a3~Ho&XdExhYCoY2W#zubJxCdBi%PrZ2cGd>!w7(tvh4-2q0_#$0B}vi_Y$b`0 zEH@5T@lgm|Q3}mPC9oMBt3#W=PCfZH0d0n&=OP|{8eZUxM`l5a@loxHIL8bQ$wkHB zo6AkZJT$aD|VJ8ZFr3xjIA>*G0Y%Hd$$&HgxSO44yKb>Jf z>ZK_(Xr+bLW{>24l7#!h^Zgq&9qpNlpOc6LS@RU2dp64QLSXBorMt|cuh2!SwB^yT zXTxA3kxm0?m2%c?YN}Pfw33Z0ojjR88vuMJRD}pY3SDB=Brfe1mmn`+imn>rdg5#( zg>0f!OdI8CDHQQ^q_Cz~G*GB4FitmV%Y5-7>o^h1(Mnqpz%s%SqDi@-v4D-cQ5m8; z)zJCn%98)l0OcgYEBw$Ik}S;G;O}w#=TeN&XJMZ6!JEB!Jnl@Jkwz z;tj#jkerHy>p#T*t$HGDJ~8rACe_r9f%T?$wTt-~?yO_Hm4diji`)+F-gbOTTJflD z$_*|eg#gKvG%$@OhO*TT8dX5*%mNmzyPl|)Z#rp3R||)Vw9c~OT&y`P)Jq}YnlE|m zBKplZuyJoTGEH8;B3xQ(C1POEcFy$820H*=f0(0@E;`(*?aL83n?m^8A=huq{6VED zwB;UCdfK&WHtZ+w0)>LDrJw;SbQ&LZ>97htExx9Cy}nD2Cvl3?Q=0(ao?TML`jArs zi=Qt#jYX^{j}x`|`prAdz?;XNLG&)Jw%i!dbhA(yWvWFzAmK!J3|sy1^@t4D#Iqd* z^@LJDsvqovHQs8fv4UW{5Jk_|G6zB;qqcWs(ODB}nTIsoK+wQb4$L!?!5!^>_SEl; zCkT(KD&pPqw#)MtEsgE>SG^s5Nsxk!!sILPfDjoJI{+2tx|>F}2063QuP;JqbJokOss_;eqx+Qap9BJKRomR;vc}AFuOL z6cW9$MHoSldNs`J$#^;sx0)AZe|mD&g;lbnDP>ed3@irY$RMx80JN7$3h%965W4Vu zZ>%^F9K@PRDlRKPgJ}RHE52!X%VW%cD=L4j9VX?z0m;;}z5ORs!1W33y$XD9hZ?YDb%?C5t7CY`rpR?y2*(4f{8v zWsPdZ4Wn*qSn>5`C=7++AyQEs;#zzR#+2_l80ha3Bo1^K-e!6oO9XQTP(*W38vfl# z9M3>i9fd4f*|sl6PUJS}ve$DWKo)8PFbjaG&giMbuvzBEMPJCT==TsuPGlLmuJ_|Aj=fwwF3fSYB==KWHrtXO=YiAtrpyJtaS9|gvwi(FL_Z*a zSTWk^$b#myE+mjw<#?IsOVp-ItP#eT7fyyiu#wcYluG^`Q;z&qKl$MJv!k%h-XtIL zqgV83KT^@4v}nban=Y$E93y5BfK|=%jY8>t6>{bOoKLy>>#gn3*1C5H(E3%ZknTG4UeLfyhI@_$< zLuVZ{Q{5H;iI$1tbj{b=ALkQ{5wUe!UMq@7Ruu}Ig2FJe>1+$OwKWEB=z7w;_^3c_ z#5Y`)M~UiftG@2jPg&Dy3ebWkps5&8Hz;mMGKAkzNRS5*t}TgbMf8bTBw)AmLpGts zoTdXd%=Gj#z`s6)qp0Jk6aHw2@5Lwl@Jw`RuCL%F7c+}xFi2h%s5jWEE$kKI5l0B- z?8|#G1DjyDl!RpO6xTl3<;53y(>~HTO>O02Z;O1)y5mTH6hMqulJ%?@9&4%M{1eF5 z*1t?fa31x|q;eLm)QP@s=H}Xcs%ApB&IY3wXdHecGf%M;{`QLw!Ud~sWSqK#F?(kC zx%}Oj?6c15g4?MYY+jg%XG7=*Dy3aKF;PXijKEFoNxbU*9;X0Z((Df+#2&7KST7p< zRaC6EynG%)Fcb0k)5W9rXNfJ(q0}0!IM{P$XBv0KYTb;V?*TKqNA?vbExdxh+``jAS`@&p zdy(Y@(0dr1W1 zwnwnExm!rp8zB1r>yOnemnPfthn`nDoxNQO>j;Y(9T!I?esM=?lBJKeYi>D+Ok#ni zjh0gxqEq7~LeTk3)L~L z{F;@Qi84rR9Wyxq(jv_^0WZmJIHR$FTXE!P^7Hp&5_!*Lqn77l^Q&GC$z zy~(sf=!-o#(Aok(ql*w5CD4feurFrXom~PKmyK|xP0E%dAEuCwvn{NcIqVD(Pa`^j z+S6QDjfY zKekz)d0S`ChDEhTj`v%MIiK$P1byKxKPS1vCGjY-CCM$w$IWAPG(S0{>>Rr>Z1Wu9rh-W=%Q-^I zwl1_Eyc3SJ*bn#x^rnp~I%)to;FcRQe0l)Pe2zrWA$Z~(l$Kb9(DX5+RXxZ`>C&eM z7gos$957QopIuKkJ_{D65#^9DzonJldc&w=IcWU?>a$n&@obMRpa4D84T>VRLLA9t z*ztw<^z@YysNQQePf6WRrAq%?yjZoRv_vQjp^rfoP9J_w4{Nt+E7-3%r!d% zJ9ZCamu2L$dU*KAu78j-oie$i)u!p+f|%-cH)!)%730g@Xn(N9_HgUrxwa{MzI9t> z6+BTKBl-cDcUodzPeTOfHRb^Uc<`V7jJnEPqBXWZ+p9l(Nyc}~M?l86Q(FO_fwF z%m0LtKp%nr>CungbSIme=sIrFFD#~wTO`HKhVvz=V&!*!ug4P?$AGNoD7w(F>SjeQYg;0LLS7M*6nbH~gRzizTYAt;<*Q z>ZGk)Lvo5yov;G|E}x3yh!kAQ2#R=7QOfDqld5atJj7wygqo{})og)vtJs){dv!0z6iTL2eb{v|XXW6|s&1(PTKDe`OeANE&J|9# zpK^rk;$RQKh}{lz*HCTkK1DxKKeI{LV>~l4&NT!mUgQ(c9(NC)cFWqqRGZ4}jHMaxv}Nc`Bns!vwmNPi{)0}fI>7|(0H#z9)FyD~%E z!(pmN`RF`vo+d{@^7IeW1I^t`8uywD+q%wOuXNWuOXvj{Ha2_OKED~R^C_wAuplJ( zg68Tn;Opu_Qnwz}-qSZ@M5^M~{CwcrX6wUQ^Yb992K9grz?BGezKE}Eydw0QvfuF; zusLF6Jkj&>MMYj)&tSE4!0AesYr_Q}4~8#=es^rqA*Vik?YI0~{xiMTF4^bUin|Bx zR<$SlR+XSDW@6L?w|qj*N3j_$4Ce>qg5Z%w;WZzJ?6vSm_IbTpDugEjv5!Q;KE`+C zm2yXqvvr8X)^FtC7;eeV2e+@B1sD;wpbZ}C_zZ8SqhcR<#!*6>-5Mn;_y=?Y`Ma2r0bs`%@xR$1(xYfr5g=Bstr0`WP97+!_;vw&M{o!7ORPN#pu0 zYCxBp*vF#kGy~P+ph^8rn-U$DiJcy3)7^)xO8rggmk05)h@^uirNay(IRb-__+Shn z>HQmOJ-x`!!=gKas6I9KkCJRTR>%xYOXRf%W$u%LtKUg8w^8*t#>p{`lw2CYneB)0 zrQjlHFA`Iy%6?FEqOn_kREdaek{OWflow*;f_-N8aL=iq$2$8ItuSglFGDB=mq&Bq zJVQ(xO`aGd<2|#nblSuJn97t=Ix@BKS+b+jn|d$8tWQ+5m|Q<{%ooMlPy;w=x{Jg@l%ZUBRZ2#vulD*DObC{NyTNxSIGoJacjwiq z3W-LoR!lAw<@UG)yK;U{w?|E%-#BZQ#>V0!cM~(Vu%Fp*#r>Q%diZcPY@W2Wi`!)NOUZ)J>n>2ZCT7hi<5dx&kG;a65+;(NAbb2Ai}nD1N%J z93ENAdoK2?9k`bU0@fQaojxC7$GlyK2Qb(LzKByikuE2F4?zRR)JLzzlM#QPt}1`3 z(t=8w{cLi!G|PFtf<4G>{mgYTk9G*W-Cpz-n01SpwL_3>rCX`vEc#T49ir6Zep93A z(Y&-9ODuvVCm`OvF~3|ie5kq+-g%(4hQ^7#!kQ^~`1*5DDv|xeb&sW{WXeh0==bae zCG(jt?VijcTI^N1LUV9c1>0VBrsOW;n&lPQqC`uFr^W<;5+f6<1&<7VW0OVgB zg8FPM5gD+5HtmMP^#oT-u`Z6AI7-VljHEZQU0LXm*mK&X=)MC=YdG#CYt?KXN=x5N zI;1x%5ub_aAlH9=fGT=jmFZ|Kp;A>n&h?e6rSuz5$Z6Tm^^~J}5KR#v=1Kk(J&U}- zpAfwkP22P7`)YyJ#w%=(F5seEA58G}_@v z+>v1CYtLl6!MU@NtIuUx?(U{F7E;uYX(ufFe!KZ(Z;Q~ye@fJbqZO^$mBN;I8Zf;T z$7?}vrS005FgBI(i?j�Bpp=Onf=jgZffWH&$r&;Y*V@mc=!HR?!*}(FrAV7zAKc zG{u&{v|P#5y2vysWF<2pd^6fe3{9E)Q6dORLKB^jO4XJ-HC8O98;xpLF*Vi6WI|O< z)i5PO{Rb3rhpx>x-eN^8<|Q|ZI#}x4?h*Nd32t-H(QCrd5+eIdB`;MJ>3WS15Jeo; zD8|9HF(o%48fzuepjZ4ZDzp}G)&#V2d+(+!BH66;lZH!tIyAg>8F0&%q$^<6Px$Rf zvyMqR=0;fvL?Gmu6a9tKJj$%JKMwDTAKO0{pPewhoB zcUIXYWgot_NUd~^H^b$N1z*PtzgjqdPPLIbkH3td46nak?7A%Hu| z#x2jL{5D^l4rCFay%dMrD{ykMJ6DNWTpMU%#S zvAQK6Jl&v=l5yFm-#u@O;9;yTgj^*qnrw2T4>NU_q{N@Y}M)NZ63*EiIEWv1@RLP1u2RdMT9)_ zurIW*Q6|3Kx{t>YMgYTzz#~MUun9DcMj z;h;s4C}6C-Lf!!>BcR-K;qNKEP&k>Yc9Q_6Tor#F?vvf=TfpwW0!4 zUk5G~6)dG-J{n-T(hQo+YJ6zoI}?u67w9E$PjgT2`yfD4y#*YPAJFQfm@>(c63VDb z+#jfk_Q4Qm5*5keAA7yHP(CYjAbfB(t%BT~H_Vc+gLS^)`f<2iv zYq?LRy85Xh!|3w0bMP6T)s3qo2{+wYIRL#5%&r(TE2E7r3=vx$jo*L?87hr$R1Dt{ z$4ZY+tmX~*p(g+tTEgyqdv|?g_N>{->_RB4Y72DOF8K%yg%N=&pb~kYG{PD3Fvj^)>tdW zK7x$;{V+AVG&Yd>L)F>p*JJPZ>?&H;iXjX>PsiiaN3#rRLgiHU(>MB2J1Nq>6(uJe zns7kN+9}ucJx1sCooTqQ^Snf7BU;ec7UE)`75CVxaKKI|_h>mDaDaQ-LM4ydV+2(; zlk`n)sAp$?w}$UlM~z)E_*0G99&I@UO9?^+fNHs zoy)ZCws7-{9vA&vOic4?o?Dh3h)8vKe912@v(1j1m?c;4l zSL@=Gtvl}$3`Rc*VPeQ6e*4ewQN5+;{K>TkPXCIa3^+o~S1x))dVV zefNSGURAF#{rgO5N3XMIADLPB0TeKR+X^^EN4pF2q zoH;$4G7s%7o-oyKx;19|`93@(Vm@v6pxEf zv1F{j`%b@I1FjwKoUMH{SXmxXpn^Lr7tUAvSf_&)&9meCDz?vj+sbLhr6uTD)1Ee7 zd}PupC!4@j%h8bj8P1T1=4Uiy5VNrp=C;$WusGNUsV^`S^WP!8Ra4tI&^<)Ejoc6!Ef`|~nH%ph>-z^6)WzCNSIJLl670lSt`@) z7Bp3Xse-k|OG3(MYtt`(-56S7?|S--#w5?&WEJ9csb6{R?ZWSKJI9?i_EgeBs`y z*ivi0&r)omvF}XMhcgL$$z|{G(2+V_+IJD*&khG2R+!<&R()(G8qouIK?@t^!nfn0Xv=xvJ``7YcCUM z*r_M3s4+}$C3r-?g4?p`cikb~QzMg6gJsS)HQNU$?Q$)MEhD)jS%|Qb(xJJK5Ga83rbVvqGvpE9=2}) zt`!=R9LN+;T&SUP*)yIn4@>dehXJhI<&>%^-VMp(tU_hsb~P{p0_gETqpo|#^XFk1 z2Jn^^z$3&JnqoM`nU5JfeY&jVa$|_&7fOJA>FKzxbM1m?98`)|1Skt7N3*K!)peUU z0r9K>Hr70PISz4MSRl{(O+YnkfQdDa!SFP4qg+Q6&yg;vfyaDxSEKeSr&x7gQd@Z2 zGW1AWD0Jh>W##)o&VHs%CfDxEO2Yu3)^`l74NRMrE`OOtOhz)geY%H%JG#9PPtN9; zXetNfr!u$aC#gU46g8gMPUg@#P{Wja5#Tnv-NVWaV;NS9G@; zM9@FwY}$5ogRrc>f&!j^0zzT}?L6k+^rwHsbxCRaPYAJ^nVGgPZL9q=sl7wi!bZT8 z?*gE(>!5bLse@x*AFJ)o8lmFs-a zv436q^m>iAN3?2>Y#+U0-jFhqA_(w|-n0(P9Dg_*7eVbD(|Vq1UL zo6)>&9ZB|ii^fL;TC9ofkXwx69no`3ji~{v=|zvqu@m|$P#7h{6G;;2?-IlLfqA#w zbH#Mz8|bSgkQS(qKBuMQI?c78!i9XO7rlIR_JSHsYENz3{#=nC@(8-sr>M0B42swL zm!X*ndh`3pKv$g>oPCFBm&wgE3M0>zg{WGAJKVH*p?|rb>APXfd_3sWp@qxdz_eTG zVk+C7`|;NZcR}z!9#$koGZ@O-1NkMR;<^6ihDw`mq?uM2ira(nXw%;wCMv^+?%ck} z625b`ex_3fSD)xfo>0ARhrU>J`?^@Qb32m{a3(FKZjPW&jPd9Is|mCyxh#<3l7I?y zPj7DnHXj+HTS6gk;nmxMOI_jJ8lo^3GQ1Rx za!!*V48Q93=$;rs6ceDx98YI8QOY&Q@|5XznyMfhDs4jdfBW@p-nPqPn(qIztn8OZ z8!AbUdYY)o`;fF;g*$TG_5lGgwop~%@T^(Vt=Nn*le28ih)ZHZ8KryWA~HpBCGC5n zgIcz)C>)mqacGY@pfU+oo!~`&WmR4+2nu!mLKne`4w(~_~@hsYMDRaXe?jFO+ezY0nZ5(=l zqZn`0+fGwVs@w`h{T1N>%qc9M!n&>t!X0B6TiyG^(1dI$m7@4lI%v>CFlGg80hxj! zxmb#9MI2!uHZ;)i}ZX6JZ!AsUYcts`#cv^YHmoRP2te$A4CwzD#qN0<70 zjwzwp9;-2RH_|$V811Xii9gdjR)DB(k4GjtdAJ45hm=uxrH~y;qYGm^v3TN(e(@&S z)(Iv#{f;&-^o_6Y>oIu9w=cVD%CTY{Z}{Zhm^Yz1KA&oIE8R}k&jDUdQf+<~8IT)E zu}EM|p79&EZ>Voum?ysNWf&LCjBh|{?ARq5Pp{dCUUI?-%M`~pcQhPth+$chr#%9G z@j*AZCXl$QL8pAWzj$7e6|X(*8RRbL#JzGBn*nxwzhhpDIprD=nm#K?8TP#56qR+A zxv5M1xj1~gDE)GreT2Be{ge>vtUyche7w?b&T=%uDZI^|A!?t_i<%nY*WmpoF>`Y=&94fBMlq>suRmDJ+KZ?I8l(Rpdp z*Q7N!yhA`68Yh1YgSNl4WxRwv7{``5wCY}b&7yf;H+eOHrWi-g1HDp!%>P6(=Say) zuKa3GNy#4h1$5YLZXc5f{IC?sGJi%{CxcbGTdvRNP+D`mrxUyS@7jq9QT@D6)KYS$ zL{}P)&xCQRv#5$kZ#f@R-_ZqN$I3YD_vW5yJvw+VI9cb}3n5kFA)qRdb74pmMnF;M z0mvg21E~O_BaAE2)oLlsw1?A3g`^gvu@up6z7Ew)_;sBR}OjbXrJm6N~GEWc!G8?e# ziSzDGl|As6W8Ya?y?BzWSZTM^^pvOO*R;7LV|30`|MN$+TAJGaj}`QCpW2c%ZbeWhc6D~WBkP1N}H|6%Jbqv8shZeiTr-3f!c z2X}XOcL*Nb-QC^Y-4bAMC%6T73l0Ik$@9v(-@5n5{HUqj)o0F`b-KE1SC!|v^}T6V z<_9VZ?2(pb{1o*{b3bv5*}Kvl#N%29upoxv#8UUop;@PHWPpJ?;k20}l+I8uaKP_h z#53dbe!VJ#k}Ll`X8sH^R|JH$wrhpMkOdO zoWWol+$D=WtA-f%=9u=s$bU+rnfO>9Z11gIj>$#F*+<6lg|5P>+V8~Ao#xpy^Kv!w za$O~wnT<8|@$+?M#Pva~t-`EziY3O8k3C+(6>LtA7$)1>r`T_jkB=mp`*^y!2od^3 zH8;gIJ4XNr#ZoUflJ4XYJ1CiTxY~68Z*cG&O?UE4>9~N0iPc;9I1b&0-0A2RB{mM zj(@McyJs_L&euO4?kfFFjT+RoV7*gP%28z7AcK3UuU*dWV763mJtb{7A z-+luV6!5%yLRErDXZ;m-{``y~&0&c47^jE^PjnI%@hl9B!;;(qP4Oe#+PNg*mD+Uhi57NnfA8{{ObBl>Y4-$b0+$G`MX%8Q0fSC0> zQ>bL3s1Gcb2hDoHL^*e>&ig3lGUp8AK>9hujh&+{)A(vS6un>shT^h`t`fz?n zH(#_~V~QI|lzhX*a#PY>=h1DCDPbM{&v2oC!xPdk|5zh=wR(zFTu=R$NJK8R=n*Cm zBfB(GUKOy(k)HI3;s_UC?H zBjv%nb_DrgJJ3wMvYi0-zr0&l-0!8k89oH zOH|T9WY@vDqZcp~V^|-R)#&$MUwY;5Av-2(DItS}=aR@Qpqlm!E*AGqZw2ZG!VYJz zFIQ)o8_#D)JwH49Qtm(FX}j<#72WvjE$lxVMlcb7VutvvFJrbmacK5dXna@wT@|3T z+o3eIy(@0gF>F*(BZPA|kNOf2@HgSqKO?k2x&K+zHifIbYmeFcf2wNUL2`C}9$qct1L_ zd1?9@Yoz+(|w{1sD%LBlNR88TDb?)xq%Ix^OiJN7~4H8m7=?cc9pTzZe!E-P# z|9G75#Wg$D|9SR6u34W($X3$HsL%glwy$7;nqT@TE6S_*t)?#^UAj*_vTpO;``a{J*&ah-ETGm1n(Kh&M`?CRt?G<+3 zSh8~rZOLBJpm;K5Z}kVQJ%WV>mM$^fwXAJ?o&HLse-wEukAHj|{?xKk79pZEFE}mO z0p^@C*Y}A{JmFg3b2>0nRsnU9k;{v~qzTpOd|HpFKlZg4XuTl=H*Q=#A9 zI*)hRr(M6#n(NV`5`T-Yqb?o9Rz-&~bM<*6>LwI)e^56;`EHF1SuEw&btxb)(C zcY0?wch~mzjeU4zib8l3#AeKe>~+_>wF^^Rq_{`DKQ=^$gfJOS-G+t?qxAeN5B3N2}wB+n_6SIXF1%*vX`E8 z@v8Q5GO~ zud|PmD1>q+Uh&Fee>H-VNKdLVgc2(LE5A#=)o+i`ULMh9^sC=+{{^u!y8tHrpUzP! z#Q!))cE=~coFwChzB;<0OJz!#8 zXro6ONRJNEi~iFi4X&q&u!$jn^a%g-L5&`qXby0|xhfK6~e%UV}@s8aTcc$Z9{3 zOi$YDZW;%7Uk|JPa#K8Jxm=t_A-)|<2JpTBk0LJgkU$j&M^pbA9cT{}YpwZC1`}Ag zsRCs_NnC8u1?db1)fP`drgx5ZX-g~(Mh0-h0$&r2u+};e#sCvZ+80h_bcytkKq(bQ z!{R}KT7!tN*ZTc~6)t#BQYEn!h`d(c8H5fOJU9|Wrnj1Si9m=KLI$uUf@_vQUSoii$Jd#3tzwzxF_i)m;(8D=S_{;`%*fgk@x-f3D18QB!`$=or zG-s_ktbN(2>43#ixBzPLM=Oz#XtjPmS&Mfn7u!N|SN*xHW%f6;Kb@nvGgLHWI4Z!I zY7-N-Shi1dT7v3D zur^`NksO@5BK?kIZrP!P155mR=o?y^tXuYBX8F9bWA>*Q?&&5vZw*(75<5la@pqc% zW<2U6+w`Xhx=OM3ZiLC zVeJX;KYPD=_d+IwU15WRQ(*%uaK1=2rqZnj8Js7(YH%v>L@VJLT9zO%Hu!!9M{Iwv z6QF7P^Xn+bxF^Ca0K6oItr%U6uDsZr|AMk~@&cFJiJ&XZ0%kE_W?%$ijL5 z#@6b{BoQZ&gHPCIRhCj=!SFPL+dC;><2NIelXc*B*Msp^lFdl0m=SVEM zWaEcXF=^EnzGv0*BTD-2_Jn}s#T8oo6ToIB@*Xjn+h4Xm-*Q;;K~mwm1r#h)@2v%#ZJ4Tl|ErtlL^PNb)v2!cRpwV`6F>lm zNga8#L0{lw3QR|)GmQ!<`89c1X=h<2rqm!uTvvvItcqLaueuD$rU48fBUGlTp!KjtspV88+b{4)c|yeZ-rmaypVS#6#+GA4EUae!H`<&rGdf29 zYit*yg!FnWaOmuo<;Ol|!ubd`4vFRMjrUigoA1M7`jkzLH<>7CO!h?X9jmoM3Hg4y ziq|PGphw%}JLgy6&e#1PO6;Un1SEjFa{Q4vuUAj84eMP}P`^udW2ZWODhZmJFBk)? zT1lA(^;bReghwr6Pj@S18JK!Op<;caK4B_bA;S5UZqOi{@B`cgZ|*r}st$L>r!ZeI z#eYVv$kii9Ybz7;AL8*H_5~xfsWCZJ=zCnGnw_LRA<+F&>}t((S!+^@FH+m4uTLmu>UKZ$X3o3i z81d-LUQk~?elqQr?@;1dGtf|6F?5dD{)gtv#;9FdU%#K8a(G=69_2etd{=e4=AD9b z)OVHamkwv~$T9z*>dguJ{UYKHP(UBFcc#FJ#+(W(Zg!yy5oN9U+3rIOZU3^tGrlu2 z{^(%eDq&8Qgi#ul8A(-?+Qncp-zbnZ{3!6umd99I#Z&)^z2t=7U?wqzVv$KyTh1Ym zqN&!;$WQljOD#39jkXThE6etL&`3LOR~Tlhpn{cC_K4g*Bh0hOR2BXeS?TyG;nw?U zYC$-h!yz%9&tjIE9~G@%EGTc!9bGwbbm|D%==+mGWihUfn9;e_ql{a(eBQLPQPQGG zzdRvkzD4KJ46yxq^HcUFWb$$5PXx{5uH01b-{&jR4$tI|9oG04WQ=FaskY+F&!tr} z@>Mg#t5`F>REvI4+sL@~c}Wqy@9SgAj~&LV@+VkfKldixx{1mH5oi`%gJ;}6#gZl!%hCVs*fX>pRpC#>W30cTl~D_&!u|dxT(sHBIG1x>7FhcN zD2mKJpEv?BGoE6syE%{6J?s=Nl!v49$HcbtOF3cD)w0CrwX$!%?^~*~r72NOZt4QW z&~Cnq@P6OZf>>Ro_30yq$woVJYZ{n@^iZPeh}4;3gNSBbV8CE?csfZ?V0iL(LjxMv zRLE%a0m{K*VDVNwkSC-$W>EK})_p_>E?+0RKCTRoC!0e447M9k^CBHQr@KDX^~_`p z)e;#pM}!dVyzhg%C3dAzo*lv^?(5Bfd5;ZFR3#+Bi;wjm>IWb^ytvp0*UIu1hGQoD zh_zy`zg!z4E3pTwlr=C@2#?$DhhX=g4&9l`ba;pV@+P{ZG=4li^pm(+yJ}sqr^HOK z=MT9(Rp`>oqlEs3{EgW+2Vh~5vj71BBtd|6FsZ*CJuiVST#Qr7p=rvm5#Y-rKi8w0 zQcHY?jM{8V{H5Jwl9eu|4%N~Q* z{eFrWG4?q*l$}d?x364R2=w&bDG#l!6wie!kj=^BeN^DdujyF6H7H%4azk2!cFw!AR6NE2^ff%4d11H_pL0=CnoLvT%S0h4HT40J7A? zve0u{lfqy8Wj8%rNP4oR`554`ermQ&*z(t@^1o@z=ry__Wt9Xpx~D#@vnUZKu$jOs z`$dq=hx$OT{KJV%F!deoo^vaCTuh6SFQ?Jj!sA3v9aYGc+oTA<HEOS2=lo7z=u=L zp|#H&-8NPX;R3N?drF(n_hg}qyXD9e>}5VrcTh5sRzK&&98HH+Wi8XTBrdGM&l3be z*hyu412~Pdy=P(E>Up4Z8B@GL_x;X0+dD^|Qj1UByo4#%saDHkn2x&=!zcU|27-)Z zXMd4ta4tM_F*wmm56JBD=+H_;;!?y0DCptD^BSzg1~;flYEzOB*#Gkc^Ct}nLEgMn z%|?F-psxOs{(xA*?@CzVbBo$f+hTO7*wQbe4IJnQwd>tTO>lpUcJFNc=HmCO-LJL# zl7B&K_1oz7 z)7g34ZSE&+|4X-vK9gxG-ff59>Y;V&z}@~7&Cq2nkzN_eDZJkdo?S}BdR9A)kv3YZ^Dx?o%4>f9fA=!F(?(aXIFTVN6`-^LC)*0 zh)L$`IuwDD!KkfhEXExj$R9vVOR2&B_VZop+g1#fDO03-reR#m7>acgbqwBf>8jA$Zjt@0wms$y$KzOMqF2d{)BY?^nzt%F`pPi zQ!Rc2*c6G$E8gsP%PvG*3%}N_OmdeT02H?%K(=5 zw)Aanx*=7~bW=L*WhC1`iysWkoF}&YEt}CyB~K6KhCKP z|1CNkdA)CDT<v&EaPnyM+IChz_G z-n~HG)t6=10&>e11aA3=%k8^d_4X^LYt_m9j6Rw147GF*xj!%7Arw;&J z-u2VFJfe|KPXd$CQ_Tpm(O%Q2<}v(QGckRAp3IWvYWm9WSHS%HqXzTt{N5Z(gTscM z&xg*D0l9I7`pauQn17_2G31God5ARmn=ixe&oJnqpDPxr#tFFxaVMy;OybY339 zw+;|~X2%**-ASnSl9uefuNpSqJ=n3aqGCNIuM8}@_GA&NW**f>re>>8Ux6Z&MZ>}3 z@&Ogj!%iciQI#f`n+_|*p00zF#9l-nx@JM8z_QIwtltQTTF)B*Yc&|$_`J?wE#P{1Ao?m`v%>BaviM zh7%40i-sQ9h#vk@l^oV}hTYM-r}6|=&8@t$^Yx64X4xXQmfmxRNI&fN*{k1OOjomk z+wN6yNDZ34!9a{Zt5$mj)0TkyH|)@wpj@qd=jQsxNo*J`@=nu`Q=>JVdQ}Z1sGW+* z>5~R~Ht}*qa|5I0P8-_??GY6-8o6X1kL6s}k+>g#qvSd1IoFI8JKbe%iH$Z+%YG%} zqZpmLBUiJZIhm)|V!T!haGS-%l(JFwragQ)YxT60oKwxXFe9RD%f+l_x>>H#92A*c z?28%F1gsuce?05#CK-C9uI1)W@10p!rW}Q6?#%DMywxNe{XWjPkefeRL{ywwSK_5= z>i--5?W|s`1#QOCB7-+4P4e&W5*v(<&ZdYj)i`cMb+3`yOACoH!0N0fBEm0kS8EM1 z4K_`SO3}1_j|U`ck0}JE4Nf~aktUF_qj;x6&QltkZP_c;oMGSW%l*)`u6{=t{vPi= z_$FOs^m#7nGyen#Z6@41KDB?n+;GdUm)&r?VBS=lAjv*JHF$^8#2GA>(bNSc){H+^ zHg%TdGA6+)h+lH-wr2;bDdiHBEP(NtOh&aHLFK>Rh7$72f`6x2#&kG8_5A${wPK`R z4J^0va9Gy`LP5aBRvr~%F4c)?LY$oWzY`94Uw4Hb3ewLHr0UKtYgQUQx+2v3Enz1F zIaz11bOe;NYTU|oRLpT0>Cnm3q2Y8U!l|qO+MH>5Hd^gx%Ak)EzTYK4^@yZO1oJOK z;gi~X^!Qjv*Q7V0NzeZ+$u8=J7}}CsXK#I+ko!^Ht*VeC2A9EDob6nN`0E>+b{9+3 zldHMmKWg@ph(jY!fIxsZ?Ad>_vd2f=vKajh6d(Bi|H-R5k6C`>`RkVv{9AJtdS~X- zxD=vQpf5KMN5A&wr&e&>e_|foT9LVT=)U)K)DJLaLPI!vgLoSFbVR!OOTB#QQ$x27})FSW-$hnI)pNGh%FegyNOB{ zggZo#H%ldf=N=+h+VrA@gp@&!cmCA!qL0K6b+Ynriz;I8ImzV(^$4^}IaC{t?n&=+ zKod=OEe57*X1dh04phZIunlb^K~-pQRTW7x2A257M^=bYC4+9e7Y@(00c>l(LVSsaXEHLs_Wv7u1D7Xk8MP3!vp0G6<9`GT`(V0+5 z8vI+&z4-FADsQ{Z&jXe2^J2oP@CFUX@S6}KvuFdNg?cUi1xv`!SZ?;89qhy5#z4-y z<*AL+k`Kk?d76jgp}YRD*J^%%BO2CeseUU6vP4D;H_UC~C#(U4^=jKXO zNRNyQUWG?guXWXgh;Ow_q@rqvMP+-Bf@2!&W&DNrp|l2-RzQb+s=fEj>&upm=WpAF zMLO$(U1s-OJ|c(6(M_ErqL zz~BMO=uBOs+HG7&Ba>Hz{>Ta)9i!fDTv#KK*W#iE>1k~pqvGuhuzyNFe7}*2*W`zO zs%L}+TzuhALtUfl?FCI-eJZ9GkragU0m zW4sEE1lh1$Q~&f$66KH-+8*qw97kOar0||nRIOi7)G^}aPQ)WQ3P|jf6 z*iw>`%i1Itt7+3I4>IsrKVy5v$?PWtWs4FKc&c`OsfjIK#%~YQw2U_}!8B-py@~?X zPY_ZtzDl$1@7e=;=HDhumYiL0+)vgqm{n zGad+Fw2!kyzTa}EChg@fi%tsbYqFOjHqw#TD{2<|nE-s)_&e!)yW)GF$V>2^RJ#x{ zf3#sLs2iXtb?8tdd1}w~-mWW8ia@rKvea=eNZRA@89r_*$ossG1jxhcf0WfT%d&c1 z!n%_HQbPxJat+<_S>?FFHNUH}D}mhirFW`>C(ZK;k}5c)ZI zm}Z7><<|dp%@(Jw*7DL0p7n%Z&S;BP{P`KHc!@7dh-xxoyhB_rr>vW_5 zqjmtQtG{%?dmmg+ng_9k>S~Ft&7D=ZKBiCFQtiEewqoSY?)N68RWypM(P+mt-3*80 zy_~xE8BmL9V3cX5(`u%DL1Hqk9>eNpv%-q8!R}7J6w!{_Y4^1ZpTvp(cg3NuZWj0R z)lx@nr5S`)nG-tjVUdu|@9rqe9FA0p8xg6kZhqb+u0HhDlVz*I2Hj+Nkku)Cvip%g z(N%o4!$j|_hdBwbLsAozA8>06!Zq7#!Zn;$d9GWQH#xdg<9R~m)4qN<69M0c$b+iUe3+lY!Jxv=7=Yi7lc zt>xN#^_$y>$ipvtW@Yv?lfX35&vE)l@;LM*a$y8a_u4lnCn?J}+?srI2e$-%J2)ql z52JYfLG0KkHYB;$j{0VXs!8D|ig6hkks?e?;a2#`r z;P~6movKHZsLV}5R^#gyXI{R;I&Ed~S7>)D%=O8jRdweTR;Ax2<&7z_5?-pO=U$Hn zVtBuDX7(`?t5GlZwuI9g5D-iA;OHh?uNb7QnIK_ki&vYNe}IXsuela~^|^Z3W3GI- zH##q(8jP20bn!>O>OM^)(c|3H8s%>c)p$YosLusx`M0NPVViyk6co$(J8%)U($c#yF%{W`6Bi+YER?aq#$TmniLCPp@a@^}>@G+8$L{CCFr0 z`QedYRCl$-o*@3jsbTOm^_%#OtXbU+5wWB7fkUUh;=OxSUTXsjMfZH$ozjZ4*b-Gy zYM|JgB9q?4vE>gx%Vs+n%_MY}fTMNy+env{RXlua%NJyCq8(tUX)xmn8cgjE7yZ(l`u_eN}BbF{ZeW* z$KQ{q=?ogQHgfP2Q3_Sp-3tT+o-f;1Q@9+#8R9FTq1s9!Tf z+a41ryq)LkP#n({S{ak7UASH>`3fp(fCSCsU@V9$w;D^C7Q;Q%*R4R2&}i|>EY|=Z z`E?%EwEeL@EA3s}KQ&)VuGU7ySs_t@_G%)9~fgi;2DWe%f$@h8nmK2jxn zeqGWccBz$BtaIC;#52s-gCMc*7ye8<&<@jnt{BT`9SqzK%AXK|hI2Qj^LN>&5X=IYk6~ zYTKlJeUN7P^LR?cXC#tQav`#5uOAt~M+;C8ESmBz{mVC{o{klKC>?25agSJIcAd&_ zIX;+fUQJ6=x9d)#v#K1%!Ge3|Vpnpf!hxXZ3f(V9U6A5|*Z%?GtCTEursIZ>@N{29 zH67OKqZuJ-+FlKBO1)gF?t@bJ@S2<0FB2plQNF$6kL{kgaj8+azciiRCsIYMFfS)7RtJeP1r!;S>3;{`r3 zN9(B+8>WJ(6h+#8t!fNV8H`STD5i=;5XZt7p4Hb?sWwc7Pzj0zxu01%byZl==MqJD z(qW=>f9rXp8EFs5!UEOFN|m4eT=f!FBcQ7&RsTyn(^UsSdk{H|esENj7(H~IcTLAS zmXt#YHv>stHh7&!2?}gTImVOmpi2A#<2&Z!mWtmb68T0F3E&Ov@0y-YqU4rB%Z;G0 z1v7B{U#PhHo&42@#M&kiuZt_xPcO3KXE5(0F78p#STRSE=*k zc_%#e7$iIYlkq|FVR&lACYB1kFg6^WU|@WAp1asYi(_;pRUrcO5*Xi^#~yN3?2~6D zRv`jZ8lJG!*2qgM+ssZxJ!|DzJ6bGQZxh)hyV)OS4lw(Y8REoO_^X@0_No_S_#No2^)}e+);9~% zT|dog65rq2sx{mlR9p6YdN`}ZJN?On%k63qTlEci$`P?)X5B2ri7_SUPNM#Ws<~;h_W8d^3ez`l!KFw(Q|N#zXd5X$ce`RxOvd752|=AOdknkvc7L z-cB~1#VCYNWT?aX4Bf&b&^Ny>yl>|R&(53qm$fFdngJ;8 z&5D>pN7I_PExC*!50+ABsvP;n$Mf0AoGvCcnSw)K_}i zw^RL`q>lQJKPmcg#JcaWy^7m&Rhwtk@rq_i57(G85C>koOZvu}D`y6G5qnem-Tha$;`fvV><7&zyKMV|pSg87 zkuGh2)6vUg%pyz4VQ@I`5y~!q)LRMl1j6YOJ?-Bq}jU_MDxu)?w zjtAvZG;z&Kw@2cmai%fkmyS;>>_zJnApk9sc4ZSrB~)dVmiR2!&iuQ zILb+hOky=_!#9&NxV{=s(s=Rrj9(lLTi%e(>JO)mk8J$rvUu$a^*)}cW3SPNu z+KAWFSu%4tG)bq&NH`^*ehpJi8i2Rb|qz959W&ACXkKC1Ws z=|Xa$`@S|HpQ6jHtfQS}_b!fXbpV~STHY?4oRegGTA?X)n9zuW{rVv4{ZiR%JnK6* zK1dlmxpH%lDEm{}xu_=Finw241^ncX&>$X6?yZYeVp?cvU7PATWDT$vCr*`^8W$!D zH%r5$Wx{Str+_L+6=&qtv_PTh$QBEt&7G zyTdQLJ7RPv8M=2oHPelD%fU?B}9x^i~Tvupe|7 zydCA%O=QzE4ML06j7U{3Ce}{a-VlBdhI&w%-9vNk!PYIaI~SXgfn`h2{7d9EY2LR(1~3n(t|hcvaECNt*4e3`M+m6|s%+X|C?Mu>~HH zba!Oan%?RXWuvkotkQF<@m9R~q0>@Ll53`M)pW~v_TTRAzr>NwT-zAxx%TdU%4`@* zlTPaznxnJQO3Mi{f65-M!{8EZI+5;V#5C0fniSuXFa%50JFAUp z1Kg5@x<~K5`xP@>-@h;&jmrlhmv?=kC`+fJ!(Ms^YoovlrZ|w8&*UCK@?&4{c9G;^ zVtGBjl&fwn=r}bh2`HE0>T$aN^1{`$^)16UoBEz5fdTY<&+D z?FPRUUGbjfRB`4u87+nE!&{aBhSUj+1Zz3B*_O(ZSw2BH4^;Sbrpc|qFQ;eow{UJg zB5uV+v0`#_;kbqGvGAtH-iuSU+?tP%mQ7g=QVk>vAkLzj*FaXi$Od*>-mjCmhe#C! zYThB!w|O_m8vnJV->GO4JQIQhQVCX)f4Oo6FzH&9z3|WO4&JP9ZSMWc2R5#aIrVEq z7sa}F=*`moILZj6ziqJ}>EMoW(z(wN-_oS&6%{kwzl#p&tXqD;_JuiDlO$4m$BAlp zsERB#&;6$F?3XAVCP6nT9iaH}nq2?GdR0>;H0N~9oK z(HH_yL)4wHTfU!Kn8UpImGeYva0ByD9j!XMgAqOy&@L_mJe8U+qCA0@HWLtQ%*Q8t(*au(hL@aYTzzW(+L+NB?2TqtyRkft@MKQw-nm3$5mOmx)%msS*OSML zd5ytv^R`v&{kH;jXjPFvtzlI9D$?F53|0XQ=`qv$R>A~K3$-$(>g@)#Y2-`qLE3Xg zRPsHiW1YpR_je$Uqrf|aS!rO{p0unY%NK{YLg!NPb}r7pyZr4EAWP!jPt-b!D~N^o zObQs}enZP8x9!xWJPT%&@7*=tP$Cd*)F71T>+HeDq%CX2n#WIi&|lmhZO5e@E(1M* zmqa)WbK?xXzLMlnPH21fep2?H6wLaEa8~pK;i`9GC}j}zg6DVMM9W|4N#7*!Pq|(Y zRp);AA<#jK);a`XN`#)1Cv${V-1x1tVblXC{c`;k(g|y-#p-ameKKETNgh{+q{ zpq3Nb)<}02N8g{jeXtnBZC8xr3KOuYiez4?)6Li8%s%vth8b(xJWD&!!fT}_|Cu?_ zd*9caO2+0vUZIUi^v8F8!0YpF6;D0DLN239a8QBQ!b)?g`1~}5cd(h0%<_M`aZI_9 zED`1IS9MX>03a_^)-fbSPb~BZX`cR>tt+2@17eLlny95kQUbj+`YQP-4z<~UbHbKu zn0iJO*bilwGsz_h;~ZhCe!pdTO(WeZSxu^X;HtY2Y~ve|hpOwilcK#B@79hMX+Td* zmBeB8K-D2`PL4JZ%(ml}D8&=hmpoVDZJGR7 zHzDRiFN5^e*`ILy;wDl9Dd7ilr2&s;u-68IemW?hjuTKFvxp`jo9q72K0 zzg?xxEaz{jDHBsew@bI&$w#5P5Xot$XXGzG6kz-d)#li(QOhf<6liV&4^X)b)0ri z0|F=JQLi;yfC)O7HKc3XCq}rPB!+FCK5tBrbTn&25@oZCOLTd0+YBV-|9FP!l^|ku zfzJr2JdQ~eUBDT|_LWZeesma#>NdbdEKJiY<&vn9P58pH7PjIfTnbM^G;PCOlfUvs zPTV<_y02$Qw0c{-s+}K7fBoX>A=f6IvyOLRpfBPWP(WmD=(*x(s;8uCFF;Hta-b}+ zSK@lESYKC!^(v(=E+u&7y_nn=+Bhs&JSu7Hht+uW=TBc(fV>h#L8b@(Kb=_)Itu;^ z*B^dtOUwa2ekwa}S^YtZT9m0<9BiJsCN5&8_|CctO26jV(-{Qrm@RD19|g7jK4TD{ z2L4gT&;L=zQ|#NY($WSX5DuTN5d3;pnpU3d{yZeOb>;VJPYE%m8*vi6SDd~>ZS^@h z@#}Y*je8*i^J}6J* zY2(Eu<#I)_Rq0M6<)Y?GSVQ;7J=LB30Qnq2CghY>|O9nfS1ur|A z7t(r+RfF!3Yyq}$(ltF_E(8A+44K>pXVYA9@!LxRnqm=`3HtY?KF4|^r%&SItr#BH zDq%A-ZjU(H!9MimqLXTyPmi?Gr)iX?mRiH{&L z^-Gfc1Jo4`*V#o-VSg@0Vo=F1X^RcMU_44y8TAL`)AoAHA)0t{=sy1+VQ(E3 z$G5Z#4-6Uz?(Xg~z~F)479a!(3GNm=I0Scx!QDx4*FbQ04G`Sj?GE{!^Pcm5>s$B! zS@o24*IsM7d-i_Hk{wI9DOs7`C2YP+$hw*a{;gX$9&-k{vv_I>*H0=>_h93XU!7-8 zOR$AK^cf7Ksr&7(yM2FeUjvV#3$O|d8;sP)p~MRy@Z$G zuDwX_QeZRr>ne4{y0K&>*EIG0m5l=Qz!o*rS<|Ck;i3=(9f^kOO=>Kr$vmK}jYr@F$OW*l z=s9wvdq}ZzYyo-zntC09ll`W61TKK}7s!e~-NVKg8Ic2~0~QEMQ);W|AdwaMMkC6h zCm~?Q=a2x*{gO@82=UZifyze)IlS-7A6m~}xC7nw+F9bJEly|m z2Con9=4L48X9$Zg0?e&9IsJuA@-wYNbq^EVU;VjsVHnxbl*ntPgoSb`yeZ7&*n`Kc z3^sF@#DUUe`0K9uVPjtU1#3%|2~!~i3sHk_$1t|wF{^`J-6ct&7LIqE(R5|o6W%>A$&6sT#Q8F-4YL2;nQp-*F7)X@#yCpKr zQ1KYkxAfO#?+(6UhO$ym`C`ICkAt4Z-OnI>)%Rz~Ma$;(n_A$@jdP#vledYmvWWn1 z%pmzeNj19rA1ya%8>K*vQlzn#aO1V6QfC`vptD$A>Qvoaw0T~?6R6({hsK1Z(WK=R zWvdhhbT;o!=KqUl<35A<&quf4b~3g2(x7fB(l=IcjCHosBe+{O(x2?Dj2xgO8ofQy zhA$)cpg@kr=G@8q`A-v8R+G?t!#&X^ z_s$z1s}7wvXh(WLBR!;ltWdwaME^I7MuS8~1m)<}VP7L)5lRx05n-JXA-FM5a0Vp_ z>E3;``iFgEH`)}tulj`~BvY|vW4`-;*f$Q$JkV&^eLbhqcc@4P^(%RuGN}LDRD~CG`o=*>Rut>Ha z0Q#%F^_i0{*{5s0cp|RNKN0^S;(&?37p+_ET*MWEyE#3iKX|HUbv$tnKtuKtx)<^VH z)8LY91`vtE9+Ikz>6+m1# zZ_MBrYh1+iU2?2nu`c9~AsLt*zrU#v90vvB9U7Ry3H%F0V_n!BL-I2_#uiXo5$Xw} zNRM65bW zL4iCA?O9pw6B9j9Ymx}c$Sby;i$nbuq^hqqR!P!^eShr@U+gJZ7vU!eV4<`bKaXS= zCAI71^EhcHUN}Dp!=a=dv5ALN=BP1H&JX?TJZn1EMdJwqF7snQr4_(Sb+Us{mW@D# zm+J8Q++SEZrrF}?qGkW#0GU_Nt{u!nHkxRIPp@7M!+!&c*EoD*4x8=8hH?D4NB@wEBh7Sg*Z6bzdvN0h%f|)vNO@eF zFQXUrwRbgR&#^t1YnwaEWvk}T8zX9`*{y{y|IAv*#OAR6bFO}YI{!Hgx&iZRDF1ic z1a+jMDb5lX@1cU{g}gYyN0j(~9Vfdt(Lmj=_oXJ|J|CB4p;EPb+)wsy=y`6e(BzNM zt)ExD8Yz6`(q^b-JJ~KaGZ~jazP`KhRzRTrQgv&lNM&ut^%{EIB4zg6`0UydV>`tbo*`+n`<0?g&zov_jM)$UJCoYH|&&V}))*Q$Y4&z2@0cax*?-49U! za&WYaU(PT}^0%QfCAj`N^(Tz7JB@56U9Wc84?|Y&V^tpx2zBzB4?X*2+APeSSyba%>i$n=qzYw1I7WRSW=h04@mJ}E_7HM1EDDNu zCU$Z%UXLEMrZ%4zh4b{$cj?6@GsK6EWE__$BEC^0zv6*|Pt1Z2NFnqLL|8BYqPd z-nR?LxQHUPczm8oDws$r0NzX_W|L2(7EGjGA)FMjN{Hr(9?E(z5O-wOp*}{F)zS-F z*aD&!xGp5_rZO&y6VNz~z58_Limc*`6c$&@u>G3k9DHzAUFw8F z0V-A%MFcR`85FHWL5YktkW{d$hn{ni*3W9eT0#e4V#E!k-t+-L`8_EWt9`H;vkgK=OPeGu3>oWn=qot z@7DvE|8=c`S2~d%$f%3}?2E(8C)dhC%@ZR;rBKn1_c99M!oZ?cSDutw zY5TQ5pK8>9ucNO{K1AAD0bp^b+EDht#n!zTy?a=@9t?1Y-=GHz6_FJPbd69=|)j*%A+UO?q>7pM;al zD4(ySGdpg0MjK+n&bIP-^I9JLzVDRLw=GP3Y|a&Bmi{IhSub0>16J*Hmr%)%`Emo> z<-19HZ|dQ}gXNaq@TdIUyBP>;n{C}`?%1sFuLG^*fJW?l{d5km9BYrop=CmU#SP)c z&fO4c9k%sLYM=q(N+oej-pCpQtR$@VraB^938D&F>Kif(6pAVU5z=bhc6vDcsuv=S zH4F`&7!bzetRk!uK!YXrgViSkeoPFIxm4iA0uV;l8^i19fHkA=Q6?kc#e?n;0^VAG z!!Y}X0fg~aLwU3Dj$)(!^_#5MZxrC{EX0F_Zhar>#F1*mgF^sHtVl5dPdJQ#Bb)gs zm3(6-*e_RBomx*tVh7V)+M*|ZHY@3^uI^tS<4DwS_@loBkSG+Rz}({p@D$~tOtt7r z;U8vvp9y-qL!rvW({_$2Ayp;8d!RBnGIns0+3hVNcnkQ`p|<7b5vg(Dy}vQ)di96; z-u)aKxa)Zluzdd~7xG~<>8O|~;}y)kaKQW|>9)Erc||Hr;CVH`Y_dee?)_f3yD!=s zvW;QRl5q)mH<$e#5Mq?;cPJ%IF}_~=nKjp$%5SVC`Qw3RDZA@wzbw7* zg<4`*C#Q9H-`;TGMLa2y%`eyCP?fExTA%TT*menC-M`MAUgok1rsnbriTu1Y^kd~M z)^J>$w9v)}@v3 zOuN-wWBK}k#hU9s%W}(Pp=mwpaZ=(3swCPfg}3|xiTLV);?XVCTBdPM^^{VErIZQX znpjRp8Luqv=uv;B(ZAGsCpP6%GW?jj(|jPA`pEZl%}@rpE_iVW?+dF=Pld4u#UA!r z(5)QjB&SYhTEKZHq*Yv*!7jdIB?uKx011P2L4^j-PL`GRbD5#SNYT9wj&{?f zIM>+N1bU;CPn=huCmr1-TlXohLgv_efN-~{-kK4fk2dV7#`kiYdcdowL^t`z;wfyY zOli`U$v08ACtpXiHyTI6$|O+LX)i*tq)r!k+k?LwD|pfPR?Xtvn4rJ17>&EUo`3I_ zN*Fdej@C_LJ!Av+%2<`aK*X7p(_AJ}A}FI98b_0JsL9;8=dw#dFwMMe^8b|RDxuAZ z1-fsKcEo5wR1HUs=j)V-7ZRNcN;@B^r`YyC1qr}6iZ>e(@Ml*$~ z+?@y;OFm+GhG|qs4VvMOif{(SevN51uE}WC9{SA`e)<95UHz#@UG|qAENnrC;WhJw zCV2CYcCy=!{{mTojdnKKdkXcwP!2nyb6elYd=cJXs3fu&R&S%ouMx;$wqvP}zprJel3^K&x18bSQf8Sk9bwg3ND@4ihyRjZ@dE z@$-s&MwSSJ$_y;2x^$%-vgob(!CfY_Vi!kNcF~g7{8^v(@H>TH#0V%*3Y!Mk`bR>} zV-UONdZhVUm8ce47C5cwE{TZJgucVK|2EI0d!dG`*zRM(|X zC0E_Z89W>}P&+Hv_|zpg+jaP+`+yjNQJU?BW1e0XySU?w0GotfKQAi6)UWYb13;tE zIXmo=Nlug2Uljz)U8v4ZiT;MK4+gPl;4XL%Iq!M($Q zcrWc;HeVmF-p=roBF;%`D2Ujk!7hf)_QNUiD$Hyr!BoC^sR^5J7a04{m;aN&ZdK@ql7k(htr zUj;R%`fIJe9}rR74c<<5?N_MY+))+JO&tv_ML?g42$lE_v&?>NYj9?5oza|0Npr>R zugfYlS9^kr8nveQmdnK6wSsHrzMe;`aOt@}l1{g9e{ufyEYh>Y^@>V+nda02msxr^ zA?etBVD_g+dC*MK{e59 zs1o%!kV~T7vEKL9sz)d$tO;LmC)2!NuhbWUdZ;g!T>b3H!=N%rl) zFQm)4?zMk+EzDpEtuadvpW*S7QkkdN84E+t7*3rUY!Pb?AwBE)BNMhL*69f1-c9yA-oH!Bq|uZ46@Y<_HfD@PW>q9#}8CLx!!D*i<|z z=jRjv1Mu3WMRTWF?=hai9nuj`8z@&uxG3pLaDE5Qh*^U<=709pL^}XZj?Z*=Jp(rv ze1)=lZ|!h3!kPR`XWMo16vRs^tLz-}knm&}P1kVq@S2^fLdn+WgEm>$2V;$2X?16p zEA>U8rSQ|CPZ^%Q&(i8EK$&-#3>XbkSfa?DP&nQ@V_io{-@MAym1-WAQs7~hF=Stm za86)}v#vp7U%#*+^=wuK@m+tpajspXTj~++{np`sW_nBK7KNBe1c-$(^UHyd-6IP7 z(pi`jK?>*xksUEoit_peed$Igc-RydzRqf=w1}IX(I`G4^V}vD#F$UK_0vvy5I4he z!@Y=nEJzwZ^PTSkD@f^0v3Tz3o=|F@<;`x8x+@~GXt|hMB|09da?5|aQOLM}v>0aY z`q1vPM0mQpf1(Z&7ot;kQ}|uk>(~+Nl)xfC%yRgc-%(}6B|mC;$Ps+ZN+eYAnTB6) z_t)sDTlyLI_;&NKbGl^p%I(m)H&+E(MJ&4z<_`{cr}pq$ws(ZsqNk{?Xz!oZ&CgLA zvJh9Vj*DzpGs?s-6(H;hU&ui!S4__;cs#k{lXW9RxI7Hv60fsbBM+QSz{bjn<#z?B zvI8eEKxg>!S>C#;RWcCQ#Abvt!}$S(hD8>fDDnfNf+j)%YcH5a2oB2HbP*LW%Iwc7 zOC2XENYzj5N5klT*IQM1k=`wfE3QY5IshDy4G4lcM&%!{S;L)~v_k z+IQ**Sh}p7$)#3%F9sE-kA^4v3-Xo`Rh!YvoNdWu)h3RB#mk5q&3sXLjOPEc*E#$R zcPN6fAgp?)*BYMWa*7H^w!vFE57gg)Afj-EB^|;%;@JK%!~YZpyw<;pJxk)l zyM9q$*N`8G%%na8uXR7sh|?FTq2Kd?@lS0A(<2mb=oUN|e}7-6Y5O`?_UCZL)18z~Avwm@pxb29uwG~bPBwm(kwH9c zBA8(pVa4K|-?uC{TDcvZ_~^IhlJSnq1GNm<;wo>jXgyxZ&E@b=$pJ(XXoZmEHLE0* z^g}cgdyM*bp7b=Y5WD2OIXYDX$L5KYOxn*(7f|ejOQf!G4cMQ;z9&#z$$U1Kicmd<)bu9_p$ITdE@a>dj4o4eH-a~As%!gB z=}|U*m*)=CJzAc3@W~zwutwdRw|y%KDZL(3Ajn3PqrS+H`?y}#(<4~;ffw7>u0<#W ze^DlsGa_jgaozYmdxY?ZA^rG#%%m@F#I|v%C*a>t3E#=pL+2iCw!(&AQLukQ#6o`~ zX~ru#udrzmtU!=~7)Y2A6mi{3z!jUGm6+a9#VsV5S6R4qbAY7Gq+(-v?A6NOuFc`` zyI9TlY+9KA*xCDSKj^_}klD1owC1Cib_H?5vBn9kug)bJXvW?>JIRk}^oBK1_dRpjGtse*ihIlgn{5WuKZ<3{Ido;R|v6(2# zViDRlXDr{*E-No z^N6lJk7%<|u>LRA8<^iVERaAOB&kr9H_!-APZO;Hb+~D8myknX8?HzdK^nzkW7U z<^=n5?$rFSM>pjB;`VLqXVpK~;HRoc5c*6Z2SCs6fI=M`m9+i$Wf2Vl38+v6W`{{5 zq7x#MW-dJ9EJ{XdI_qowh>~?)QaUEpxyF-O(3RZMRW+`|n_%URYxPXHyah~VnHz<@ zmn8!JjGW~`SVaZ=!Dz?3t2)5g(X&!3oB@Vq7>)lh9Pjy3ur7ms)!V~T*w255)tiMT zEn+cQWyTWr6jjYTumP}R)_kzMqH}wwYgC@8%>Uv_q~$Y(l#3WyAO`xW>6P$K5*7ji zY}UZgpW)kdALI36f~4E?N%q$2toDfe!bv6o5Olz%2Y~*Z=}Fl>ZlS`2MM!)-V)0kd z-8OI1W#7gEdA6{21c*GVVWspM zP(o;9-kayNn>@#TCqJ-uE6XalEg}%{)HvdKLj>7|dHs4J+f`1xl29?#+2uU@G?BO=|2$M0a`kw@u>s-pm^T8|$FbMu87>UAnp! z&39P*;y2ykoX$Sg7==@xP#kn`VD*P_ur6I`-%lZ`A*B7i5GH-8nnMD6f2BUguL}Tg zt2H&c5WTmt47s;dZZh?C7d9R_mD{Uzi`B=jm!Hq3CZ5(wmsoPL6}UP>Y2xH+%G-$3 z&Fa?b%G(U_#i4sT)$i&{+qlW>Afn&C&mNv2mvCDU!@cSHCI;F1w#k#J2hE*Zjk;JJo~nf)N;JqNi!>_Qm(t2?R3^ z1m1CP!KCHdKlBQ$8C$dI_B;<`GGnek#2a66*!t4QJ~~}i$USQh+X%#0vyaoYr60Cc z?%24KkACV&RcuMq&9CpD^%uruhw`>5rYtd;*>(-r-_W^>47CXpqviO*kp4#k=xIkzffOyw0qdLpH^u?}0{Bhlu4Xi5{Qz+V~&Kbq3@df>qsT ztHf;EQAoJXbg=OedXj^8JFTS&iaXX% z|HmoYWtNCr?24~~m)bUk8Ecej3NU}{U)e=fJE2SUYPk=!5}E#Ry7R9S#?a?q9THJ3`@A6Jk?9L)E=;WzFd%H0254~j=_DX?i7QyGcH;?73f7`}yzrPQ-0S)h#4y%3d2kU=C*X zKk(YP6r9sflWS{ub3GMpj_N%|Ks?>@Bi|JHs| z*swi&%A|i3Ro;HqdQ#Z5-TRM(y7~W$wWpCa-g)re3+i%OvA82tNvEihfv@cCmDZ1n z_o~>dNxTFGD+^Jyn-ucGQk0X1bZ<7n$HKaO6UJ1!y@)@bAb zjcwL;JY)~M*e%K3+k!U-CEHGLZekY#KhJ=!Jl+i^g?J>m#U%G7O|kjeuWgGupC;Xy z&<)tK7`EbYraMc9G`;@O9~llxiUpAs<-U$ccI)B9NXY0AHe+3*Zd=Z0zN*XxqCwoD z6t~{cA`gA)z>3-FzDp;UFN_fem7;g(&rt5Z^PlYXGSO7vgb7BUZm#lwi?SDeD|cKPiUqNmdj&0~tSAs21@nxTq50TLej$D4b;lO= zT3n*vpQ{4FS<>^m%%XiRJGl7d_Fh(QcjY~h%MOqgTl2Z0xJ_pWVSeHv@q63#M^1uh z7$jgUho}e{yJX*<#ey&$P^I1cbB!V*4DDka0bjoWa)Nc`qZk0~t zutMZ)G;1ZQb60lrfDW1}Aw`#ararMa`K??SnYcYdiiEsJ2sQs-WQLe?g)&|ruXvfgjP!kJxtH^(sc>W$B)WQh9;P)R__Ukf8Z4L-V~eTF61JIVLrnoEW{s|Xev)hH`F@xbeKj9EKNlW z*l*tmsoq!$gi(>05*LSz_~7oM;!fEE-BB!#v+6PQSoe2wlz$>A+H*MBN;if zFxiQ(lT{3$(*uk|D{y32p{7`efDA=dF`}G|Q>NY5E3LG2O+0Qq-(e55U6Dv8Rvf3k zV}ug>;-qj}R9~(ycZEnS(ur4o6ECNq@0Ym?EWngl>Wqn(ey2qyoHgT?Vc2~>VvgC0 z(3}!idzhw}QT}5kvbRGcG_Qyy*2@G&t!2I&Is;^tk$yN(E6LuEo*$^KRXad9=B!Wd zugn;oQzdpM@T6Q*`Kd$ZGM}{-&_gC1Ft$Z{!9QcM(u(Lfxdkh$kCPDaEUViYQ!5s18BRMqR@C zUOGoeBXw}TP3T~gIa;MkEz5vm)&aPJc3{j!rCAd9LYwL1-Q*y>RR^h4|4-GhUz-Nr z0lI?+SwnkYN=&YHYNnAF*>~rx`PXX5cZ0RH_M!&!pW1D5-HD?j)c0025}ZhXq>uVQ zA2{&MkfxQ2KJ7B7cU3)*C!K#Htep`jD5mnsP-*ppy&BP}41K`VJY?YL;(87ky!{dW zejhJKOX0NnYZ!|1Y$qFJh#YQD@{Ykd7uXOqT$oJEr@R;SRAcPj3K{#AC`l73f1;Hz% z3b(^c??bKjlx7z}(P|X?=FkwMyH`n*AKImfpQ`Jw!l(GZjK{gZUeGVU zyB2YpQI7Gf)ti9z3yD9Mfls;e5`|5k`?6?LP+`5ojY{uRq(Bj454(GPyi0x0=&asnr>|v=tyDz)k}hq_Q1M`!aOf zODdiLSfHp^hICTm5|RXP4kmJ1!CY6=_Bn70>K8dk-$RDF#;W{ozVv#mIbMY*V?4A6 z#Php1e_?U?7Kqz1TYL5$m04_G`}NpW1AKnav7BJ-7Mv}HvmbYYT<&M3F_usHsikZbMavOpZ}#Cwn2mm88CWJaiC}T8et4Qv49o z&1QH<27^He*SDhW$XDe442)0r#;4xOIJJ@x@u@Gk)iIK?<}2*-_wG4DFOFY(OUj@s z$`y8$TlX9f`FKLfY(@;)O}BOrD+6V9J!l{XFnrENOkh@7GX7qHWegXvcwGXKjtW<% zQ)mo%OM{aSSUi!eP8}1Q@-=IG$QO6`wfL)K^mv?MV1yZ3nS~9K%A7}5o(Y*5kAvP@ z2MHewHajv>21W=XQ9p_1@DgfPB$_S(GPGB~2m`b-BdGlreifW52Re_RKt*UHr5NOM zKbB0Z5X1iF^W3k`e^Ma~`LznKwfz*917|xX05=1wcRlO1HQ7-bD}YyDNt*)fe|fEQ zqo2{0-?JVzb+CIokCMCh*{!3%+nmt~SkVMUXs9M$1`B7Q3L0gMZ(;b&d(XRo zM_Y8V!i0^gYVN=N8QZZ!|gwvNS$SfMA7 z*(+*T)xmK8zhJ{^N%~cH`9tEp8e6m4<8dvnmFqy&yFlS5n}4 zVy$_1tN5YomKgQc7^O=ojY~4ZeB@{vUfaCMmYC@lX}bQ0MdH{{z6oc6%FydR8pV!X zDb*7xa3`@=r@K)+T^2k=u?uzj?})PB!XUXV`FNRuWf^)GYG#+HLr3L~{X`4CiQ?tH zl4ZkO9+-NaP$=k3&FmZ%J^{C<5IxltqqHxjvHy}ZzMZnz$uNB;qI~8hQuDH=#j<9h zlVPdTi!mCC9;35i`dmc$+`rHgDC%rj`ZrXhhC#8jp|!m2KcbR{AyiCXh$vrx8e`iv z=R==&EcogyuIB<^{+Gz0*l`Fgai(~A4q75UL?J7kBGI02rhj>EVA-&m$5*6Kb8lI) z&;`5HC2A!0HiIw5k8d3LclWE`FX+gLB-3xnLRaik*B7*nFD906T=sXj++Xw^SkeND ze#I{R8Z|rtC*^_3=!ShrAkXafulBfMr|&72?LpgvO%NiNccAE4#aCH%y~Co|ah=%2 zH@^G3d+%=~%rnV7Xe4)RXlI9G`TjOqz0h6lrO_{Gahv$;Yt>lr@$zGuoi9hR>~v3a zOeq6CQp8L+U)0G&M5-UxH;qL5VKG{#Vuwx5$y^?XxCG+F%9x{cu&NqTPq(X#5vpoZ z2dIqyt>F7~_@a=2 zT9o^VfK}tZjArAEWh;pVX^4>%7eA%WxCF*ejb_(9E$wYX(-B^i$la3cZ8(^1o>#`~ zd9Ny)%E(@l>`ghCP5)JpX#JOBJSHX5oo(8oNNqIx{b(=re!TmhPD%T3g|xH<_^45R zG+RkHNJE&Mn303@`eVtqN@0dXX+~7Ulw*qnV+M7)Yh;FhlSAI&qJh(SjBiTh=g2&(NXIIHs;b*QNkwTPF;(bb z+-VZ6X%DL$x?DRd#uVywv&b?tk-E01AkqFnj zNk%hqRZeN}FA}X^9!5C@YED6U29Zvo0(GIcbCQZZ+`X!ty--x=FY4e0Bi~Q5Pvc-k zdtMom5^frqZxZR0B2bs|QpGk6Lt=`+OdYuXAF%=aBARc_S!@|%^OBB2tI#Zj7(%Pi zb>sMN@o!PZ5W{qn$Z``AXWl_aHwFX76hr70l$$}@I%$3xns1@xSRznaa=Rm=*dsu% z3Ze(kr)kc6SmhN=@@L8{r|md8K<^E-BjN5!d3H*UKLsj(-p~-1L?*rMvx)}8v2{1c|f0V67K;O ztBD2wf{Tk+)iFUsUJ9W2VUHP;*k$Xt)|0dI8P=s9fdD zaz$RXr86^RQvR%+zFoZ~KNDFE2r7gB>(oAVa$6R10YK>8^`&N=t*szLOTF!ci4Fmd zMe|ocfL;3g&qclG`f(6o)+h-e70f{jI`0Bfs3D4Ff&m~GJ$|c4@>)+3D=rtnMI%rz z4$-7*#=FpGyPD1cY9a^#ebwW)#706lIs)uCAa>B9ztq8|IBKf6h2|sT0P*=gTfvR<3W$`j=p)w$ZYNNeM<$ZYyEp zi-ASTq+-yLQfr?~nT0ZWAp$|nUS}zghc%3y& z{E|cMHUpZ2Sj_V`V4=l#txS;u6#W%gG)gR%%J&kHo=OxNkH5oV$gC0Y@mAYuWIOHIZEC0azs$EvQwYKjg6ug?f(f*y+Ey`X!+(L=Ztp5FoU zAAQG*6tje|`ai})#!Ze$xz&eBY=kWv#nnq?<{+v?CNb&c((<|Nhqa1>H_0{e z()2N|1MFAB&zYcvOIgE8M^z5ttp>&*fOK9iVyEao@DLQ%_Z`C1^Q;3bTK!G+jGH(Q zjg6<5%F01pi|h~2rQ>rs4{KEoFO>@laL(5(K&cSX^|5a1u$rM83nCo!fEnLL2_D9O zX=e;f3^FiBnE)e|1A6n36-Fqy48<-8fd8nR$@j2K09g%-36#aCf2aIBf&$2 z7@i|Ob7|1#D(d-D$3TxQav;ppy+$>)e(4MmhUbjWT-jfA0~BKpjZKUJZB1G&ayJ5( zt=Pp^pustUNwpL`260~tw2;@qFUul@&v#C2>vfTct(f)if0j{EA2CL~{;RW}IVKzy zroak>j~`lgwE8gdWj2WDh%`4)rN3Y6n49*AhkTSsr3y=%@4F;tbPObk?c*g8tLTG7 ze0+W*W7?+=g_Sy~O!@6w_gm5_rD^Q%reJIT!scZo(YaUxo`Id!eT0!qjz1BVsS1^O zZtw)EWA@vTin%vDLefN5Ff=!Yq`p5B4UR-(n;y((@I zyCD0|;R>ch{SUygZE_z)vE-2@BPt{cYz(nX9{>ob&+qV<`Q<2F0OAX{LxrngM5>1D zw+Bd=_VuH}jhRyTD2fw6E1*L94-PHiQRDxE|3Um;xRb?y;mOboj>s02P%@#&5&^J;Xq_dY~_H$Yjw&!W5oIF!M{_#=8{}`5|A$?uLL>5X4;H)FENq{uZFc zPP5TDniP;Py#c1b1~^ej8m%Zupt$7NjY(6DCX?wT2HJlK_0A_o0ZidJ0W+WX5{iB} zz-Ri)4t-1|0KEL4d+@0A@b^1ufJ=?hgk}n36;f^S{I@;ffjJ*YoUwSq%R+ z->pbz-@&!+b4iG3#f>I~&6j@8t64x&A+qUXJ zaX@R(pZYc|@Dgl6{6BDYNUG8Xg#(&qrb7p4TaV|~bL z;J7Jy@UTd7MA|>gph)Ci47yDIt}~Sw&#WW;tIl3TL#yxTU(Zi5tv%MF8QNm8H#a3Q zp*vO>O5m9HuhfTM^ZF8lk@!r3KIb0|icn}cRU}Yrx=|$+j$P`vv4OOlG7_j&-KY`@ z&ulm6A>y$FWt0dy27#0X-s!8i-FmX9;}{YwoIuRU=Hy!sgJ7CKi{R|UWc}b>(e*PA zgCd%qNsM(Z0|Y7)*o+_aA*a0EH-FJ~=gr&ho7iMAC{aTQVPNtT%0Y&5I7S4coztrf z%NRl=!gJlv6mLIg;d++u31V9%{3Pa1G?1*xn=wv$Ip5JE70=V2S?9C zVw%{;cH25$wF5D^VP-$=UgL%oTA*N)NG3t?{Tpb4 z@*_bE&Mo&gm4P-D`ujJ`_b(3Vr%(rV&+NLH*^)LOreWJQO8yRtQx1Dg&M`;#g{c0{ zZMV!Y{vOX~Gv1d1yk9Lq3rJy~GH)BRfI4u)jDE0aQz^WCQ+oRnZ_?$ejwm?V7JO8njKPe#9fi~B&t)Fbj{!W^~P ztF(_fI+EF!C>bxQ(x<}8rUb(W1z|EjFty4QUQm@@paF;A(mpX>P^FKBm5m7^abOqO ziK%YC1*hX{rN1OqkqpQi33CFo*MVOm9bXs}pBto)gq4rH7&E~4s_y&(XXEQ+yAbFN zxwuuTyHzUf{?gbbg-b>zG3!#@{k4GC_K%nb`2`ih`S?2dP-D8)3%Pv!{rFE-3BUDY zr?Kta@+ZQaXJlLFs z3oo%sFVQ5!Z@t)K4A{p*TA@VhFR0h3WC;|#!YaLbK{ME6?Af7X?7Ij4qMf*sdr#z^Re1j%A1Sj;l_y#Nek9^r5K~zp`f-~v74SB~{_R82}v2KNq z^Mn-kar3rri?)|M`oAPC+9V5av0hp|1c#7=U3{yWz9nD2_0Pgmw`i-8JAZ6Q);-TO z{vy!5Y1kA#vt~g2<6rw{ZBo7ss+JuBtSNY;lD>1C7S97^ zgk$yMv+5)ve;b^1(r2W9VqbnTT@B{>hUjRHu&Qm3KxNAHo70X~Kzn!2q8Au5`CRNj z(igM9IcDD55!x#e!%g^1AahEv(`~3Xz3$t$`&?sex*>B(urp<-x4EtlRp_~xuKth0 zw*wOC%`$D6r55Fz5ETTi&V)DJm-^odL}+=xE7hZXm4p#AM92`*o`_GJ5F-Cuq2uZN zqJX}x25JbCA*J>6_o{^Us?d{3Fq5G}Z^q%EAW+((S4GFgs&*ZkF5Ce%-x1Ymg0p7g z6ned)vH9F~dG@GI1DrJje-#hK|D_OHRp=E+9N?T{>>Xq3h2HCDvB8m!n13sPzTBkS znoPYag(MQCBL*E6&9n!E~UXv7MQww^GlUY3fxGb)#!?0Q=lg2o2MP_ zXu(-!aZ0hIQ0R;zTT8G%WneY^N526Q{y98fJKV{Fv+f@hOe)_-H!%}?oIJC^j&n%Y)Ws_l* z(_uktCSWgUiIqz1J_B%YGW*f57Q*wpx?-;oY1PKG&?5h2qNK`^G^IGhli$PgudIt_m4V%g>IRTZEE zZzgMQ{*A<%BD0yi6K`mc@Hdi&8&!f~iCSdw`$*_YJ;MC0Nz}rD-mm}`hXZ+9~C<#B9%>?g$znpV?jIZ3*Cl?T* z9dqGCA_(vW&H+_!_pg`As)|CzXL)@(9~AB4+zTNOxQkO{H$}LAGHs3@!rnZ+o$k?S zv-I-p`sZW}1{by=qH2M&dF(ioeQ zoyl6qx%sMukH^)D1Fs7ccV6nZB#h>H>HiMu2jz>PVghQtyKkg#8!>znNXScb*We}x( z#-*5b63Vn)@9T`G5<_YSh)uT+I*6xBP-YO$-`uWRT=BX3ovwWPBszX}z^u$6`21ur z+UX0-|D}sG*Upe9Ui-_k1)eE`aPf~Aly$cAPbM3_at;6e05;1=ySM%qpO6ZH;yTCS zpu9hjO4io_`Qz9uo^5SkbMoguWaybcJ(jX4#_WHco{_4Zk)qQiMz&n1*L45#75ZM_ zugoKGe-`b1i|oAeoOjmq#?QiADAi5J+SST$?f+DE7C>=4-J-{WTY|dZc`w#ICsL>bhfXNq3PR+jD`u*_{Xg3dx}5O;78 z+uT%44!Q?0TV)cj>a)e_omFb^D+sv(m4opd zk#a*dcU$GPqn3XlJQ{r0w&sPh1i?e~!9yvpK>5bb)nOQR((qm$YM2>f?HQ`t&TM&| zQ31_WbZp0#qR7%6E+ri=3$R#y<3;H+YWH0tfaYJVDI66Gux7sx&uemSbXYlFd-&kg zvX(aA@2poO30pUyd<}F92zColnqd)P^1VGAFUjEa^J(C|-Y;bThTFiMUZ;^OMuUhg zhlqV36%d$44z*t~GH76Et#qentmG2OZ;gZaH4r8s7$zV)S4`-Wo8=cGY##)bXraJ* zC&FK|1aU|Lupb0q1yn5f)@{!V%$zuNy<1~FoHXsVz*m3{J;%siTezQDMMcn!c7HTZhef6ZN`x?4Fl{zG1KgIr!tEUrpZ-=V@Z zK+%Dz+JWgJBIcd@v#=HsHSmH@euELAO#?wyo3#W+$l^KTr)0WGj10M z-1@cCWnGX<8c0ymc$v(8MgKbF`&O3GeL>F^DDtrR$CN?<&q^_R= z`)rHo(Jq#*c)Jy~fwucOcm~FU@P6)mteW28HK*@F+L6zXR$C44<~;E#8Yj&&LeHmM zd@{=OEi-~UrH=jBy?TfH!`CN%TGcg{*|r%-KNokEzk{LssI~JnqA*J{w7yE(*5%p; zCUE!(yI|-)&t=q)#(^+w!5H&-uS?wEyE@uM1Elf_od=y95rng~@|=V)U@H?ZB6`RrzZsqz z$1i_7^j#tNXol30*@KE`vdSs3ym3}vNh)|+w@g$u9vdT}BlO5WG>d)O@qMU`nD>)e zw#+K@>LF&ivnPVBtrh!f7LbtCF8^lGw+xeVV*GG-U6K=|28Wlr@f z)!DGp6|6>&`SVL|p}Zlh2!exs^8Cm)F0aGFWmX3Nc(A@Mdbj`EJMRP^avGG$SZ0nwvB5aswg)!dlR3XX>lOs6BU;c)x=F%Bd*f#j+v9hNnMml3a_%tH zt6*afK`*Qq9O^|1ZI4dfwa`A3^ZQm2r?gXBDj{p?wB`kYy8B7PG!TbZtF}y;1VGbCFQf~QQ>nGx?*fn&tk#0$ygkHV(>AQBHm#}Ny2Mf(TRO_N==@B?sM0n( zsWv?eK)0_=QS-|#cl6ElLg(JhBl7|c(QP;|Z1?2zY5pRQvNU|Va(uf@4ntMrtll?U zvs=@Y7f}bIx@d;dWpvI$cdJm(?XY zUPcn)u$b@A#ON)7IctTDZ}J`^63Ec>hN#zl=&J>k4N!xbx%|awpbVs21hE-1sG`@6 z=g&@0RZKIgU${(a5+e_%Y!)sp?f8f4I6Sx0HVUKiVRNxb+M<$eEFORBjssW9z7qC2 zrLtlWGGzczprn|g09Mdyx++@V7?Gctv*K>VaVfvJnTC{Z`hJr@CJV8hVfCjD7o zB>PwaTv+BHcgC3HA164n{T8?$8?s)NDA^XF@r`3R>Sr)XUC|ex*;d#3#X>(@(vCXK zZJ+n-lOz=aBXdyW6hasWwey_r-z5;ZZM|uFVQQP8pCTvcmLEQk#I-1Ihe0tG3;O1p zeroumL=z0F6%5;ih+xnT9iThFb7frhO~oegM{LLsDMBHPP_im{eBZXI%-F<>TU6-b@-Pc=ot8<+2V^o<^VB7Dj2p95kaKJix{PG zJ~HkXi>nSXEao|C|5;e@DjwL-*Hj;uodT1b5|dn-{NgdNiPgXmXb`Y`yeja5TSsn{ z^TFw}y0$W}Ns*(%#dE~P^QTR)p_Jj2S#K3}b)!-T?w+-9ecF=bA3Yzp-CBn_XeKNn zA4(yg{DFImPH%&@<&4vm2e%|UO~(h1td*j&#KwIEJJKzOc$@7D{a%!nxk;y_n-fz^ ztV|EeOph)4#g|np!Bz;^*`;XbVbO#R55Yx>Cwq?_ zKx&9lcgtpYKFl@)H=c<+o{5_c?mxKH4f?osxERIdyj=8^%;0IUt0pOv8@9A6hr(JQQjV(_ssPZ3!-Gl4?T*qO){tk zUf0PJ09cte44F1Me2e?uaeZj58@Q9Ege1k#yUxaUdh~b;#uXz3P+!sgMfwgpTi>}B73-14=iO18zv9@2)@fp}_%5e2DFYu2Ha9z8ZXO?RE&3|xa6>tw zk(AnKGl9yETR(v9G3Mu{B6%$L0{2h&el#Q5NQOnjF1NxXh7*qca(8YD)!#1`g}+!3 z9ceDp_!YPVYrXY@|>!@Go6PM$T)F2|jGhgP-M!jD1Y^ocvk1c83 zX^pABR|pu(t8!QK#_~2YeCQHkQE62A=)AzpPMfWUws?z!rtcb zd4l(PrS3vRYhC#BCJA5D4aM?;_JWwBtJE%O;+zqgxtZ>OStUYVsvvonqvKg$z{p`P;)oAI93fTu z#sC-;e~lu0Hhnz2ZeYl`G+~?P6x`WY_Hdr4|6|g@Hynv2omH>COZY>Gd4OLn3ztnf zPU=SIJCGj=^4qC5IE0s5K*WVw<8w)6HZhgjQZJk`6K1v+0BC}D$TAcOhm%5ScsvnO z$`y{(p+W9l0Y%T-sP5^UNIf`zR7aJiuIO2bbrGqz@o>$Fni+aD*aauch#8{+;L~}N zn=iXrCyw9Z82-ye;4M|SNQK#Ce-{Y?_GAsSLgtH~J6;Zvy%RaY;Nf~*+LmG&3 zUs3F{`Eh1p0xpdmQ$!eAdxJx#M81^=T)jWW9e~sa6F`TH=v@S3*0|VvEJZIGkK&`-3%4$a+2Nk6wzcN- z_FFiyp|%Jer$XL2b;AUqISNg`Q9@NCAtEH(I~8y;rSjF@#5-!oK2TT6G28yfY=x81 zx3{Ks6!;c+zAAQfxfjY zq~bu3njCjhtTM;!=5xDC>hskH-Hq^xrqR5l$2B`Y5 znfs7nLI(EOHF&<2>&4(^ZB_KF_6+|THXeJFeKJ(<#3#+@BV}|Uu-|>s_SxN->ase_ zs9}l$9@q{sOoP5{?S61C%88QMPwNPM`qJ#H|9A$ZN|Yiow^5!&n7C&Zdl|N_(b07{ z-oP&?tsR?_1qpZB>%m}&(ISum;IJRCMC#j79Gs9UzHw_Kh1 zBdxJuuCdUyt)@)!JaW=+?Y?Y_U?_= zLUKxA>B=nU1m3#fc<~T<@vtjbhi_O`Wx^B>uNuC{w#0nm=pKayjlzax+&kUJ*;wQx z^xIGR7{BkpAL=^`gP|ZBr|-MwEU$_UglND-n5{o>r(*j^J5rJV{%e#*vniF%yV@YqwkVfH@Ko{Y-i|^ zj_v>g_j?8%`||?9SxP5kaXD$Q1Xk#r zID0)hgXFP6(Xp#{%Gg-Sa|w3wP>N*pisK7?7VKJ6NB8QXsinSG29l^sn$A7L>Yuvh zH{U0VbmCMSqOit1J(433k)IX`cF$2RNBJ40(p=rc`J(8wtIAy89O&VkO_yj$h$cMG z#GgbBeqoo|P8P?$N4p52v6-6-WF5Lo2sO_*3)O^BGoJwj<5$(CoCUFJ;{9xGNM`HC z!QF-^t&HJKo@q!t8Q!AS zq0Eb^cfO>OlSF-T0;GLxBQ<zUo__)_EZsxnfI%%4C@k6G=gr)|6FDfb9e@likGQOWk z+{zm=FBLVnaXv9N)^09`%2~=a3SlDihl$+nXTu^D1&8XsHonr4C{-C{Gt@*`WwYU3 z#$#!>Z|X`}5{YsCwO{!Iutz=&&G!?MlP!OSKhxvcuUJ@ zP@{uPjEL0`{`4JJOm%CBl-DdnkW$`?Te|#s=z=WLXnO)@DE#+GC|iW(W`VfOG9Yo+ zk1JuCAwT~$RzHrZNAqyI(ek$4UAQaw&<>#B9yH|Act3ffUN0ZTc;SN`8DghOKq{Jw z0CgVX5E{PE)ucd!>K0^DO{50j>Z6xw7`MeY*zfviQ9H;Oc%`xYBvavqR@=!!G!a~5 z2Z(kJ8q$KOlPt%)ohX1e0&(%u6*r5Ur7u6FV&u|Clatyl|U=PfW6Zw>o#`!4Cu@L9BELk|NoEF4Z$x3<|iB!;+~J zXHQ3CC|F!Oe^v5eLy4rD1 zo6Rk$yNpNWw{JcEC2dXhpl3BG2cHQsl1}N4z@6(v>joV)H5>#qwrMfK|3FzyY51`2 z{LJrl9n&vltMKp)Y@b!QsOf{_DOE7?dI3*^s#1A0glAnZvl{RBf1c)M(g5YR%jH$m zHY}r>Z2)P*Za9B|Z=MTupPBA5PkD{WiLhZ8b2;Le&!JssKKvrXsMW`#Tj($R{rga! zy%dchXsL4RcGTxiq;T*KMfmrGg#W3EOU!LSd@j=VaxVTleA1<@rZ>^s=RO6YGhZEE zt(L7Vu{_HlTyTM%D-TST zfA#7B^oSR7>GT9FemYwYS|k`^>$qDIhv`UVzU!Bf?;~>(HFNVmqrt{D08~@R_4vE& z?KQb_G3!OVMplan4f{EREfg)1-3CC?R^pP0B*X_ zU*cw^=^T1`^d73AQC=jsI2BxxNFDX5S@21V-@JoqShjpdp%gJUVv6Ml%A(-V_iiCc zp0o`w^t~XrhsfjVmla1a9O+3Mc`4}%^iyip+*&c{SOdOX-_V!u1ZNai{(HW3u#*;{ zKkUF-+&Xa)@f^tGS>cnvmRSD?_dT&2)kaQqbN)=8krIiPa0OyITR2*zIK<%I`qzET*_sf zNQhl9ldJh~M24HfieZs(ku)WiV1c$-S|5gF&_vtjFfLjh=7cMY-{aiV=h}J4);)^r zyp_vAd)BknxAjPC*nr3>o!UC-v(y9UuA|@?G*s9aJITEKEh@d>grbV7k7Ve(Iy}2^ z2NCx5YA(n6scC&Q@A5~oxJc}t@Le{;%I5d&khBNokqp>ht>3gV^2D_p^-qv504r@a zJC@tnAL9HF7wtMVO?MzUeLR5k%_hyaOBE$E!0^Of55BYoMB4`qJ^UVyy3Q>XW1tC+ zI-q(XJQF0jUfTjzi>(KXLtMiuXegJ*HQ!>FYkW_Ye`gL0R}Vi z143BUi5HJJoDNJ^biAAq-RDcFo#_Hfx%!Rimh?+t*5Rt=@eHaAA^+j@vI^J*NigE` zfasV}asKN7gVXyB$sv(flN};8nGR;Rqh5+j%UsC(FXDC;6z|WnIr>jIuhlgs z1;BNPtx?o00GFB5#<)K|YcRpec<5q1EH;7Y4597fW(&*vJC~p9qZ4|7;+4q~q1&e2 zGi3t8r-H!~q0W`J88t{OdH660NfZt_RhE;H%K5GFGlmwz7tGwbDje< zr~yGHh{Rt)yL>vn2yhY?MNe0)U=jZj8wgHwkQ)h>98zc+KkT{Bw^0x}x>gENNQDpU z<>D(;2znZ^n;Eq24Qp))ac9zmF!8p=`u3B|@0r{h^TTVu6M)Lckp4;iwSUrLR^M?B zjr3LQGWNPBeq89baqlN}(aXQjfb?+Oj>E?fOAK(#F>K#xy;6>(aOZsn{wd>HvU$St zh(j{njKfC>ORRC|EE*KhC;c5cIPa2W(n2UdijiszVa|1wl0tflqDMeG4G5<))(8;l z_h`tQT0bsSqGF=Or$&V)He1dgKDzx5KPzzMv6ZAxF!_s#HHJiiaa;$2zkQQa_$)b8 zU$2~lqldeEv$rXtFMWo@m6W3)Xq2ej0y+oswM+ zjXr4RFN>|A8gOTn>VT8RCWjUwZY4)hcsCBgYE}L4JFWP_ zIArfe!S0#I1kl=+=OY*_;WSAxYj6I&U6oASLN!Xeh4vLp5jg}nW z>`-RQ@vuqIlKrBW@##NEB#bMQlch9pQ~n*&dmUSBHKOGVwleexZCAN8_4~8=sOz#m zN33qc#+7#u24h_AGoCPMY{BRe6fSaUOn>}#htRTxnO4VkKRa=TGu&Aza@(u?N(Nn; zeq4M##sp#Pieah|4FnsT%ApcT4#`zKPj`CjbErIcKr#!_St-X{E$y4~i^ul&?5u_h zF6JWSf=mJ;UC(@2SJopIfkfo+b`)m7#Fa1T(e7GTE4!7`{obW_<^%Q`YJ;|!RcCI4 zP99t~>XmcKx~G7rJeor8QaNh?b%kTc5{-N7LG_e0Q}Qpp7V9UNv}GUoftBff?Vm{e zm<&$jYJ&lKg|UMS$CjiUpq}J1b8(!U0n$6$b~aVe?)q#>9IMP1L6C+S`d;FOvp#MEfpoF$2H_rT1&5P z45(GHylr}vXfb+iV(xK}KNeF4NGHL~k%2czcjHdTzzf+uoV7#4R|Pwjs0qJ%1_W>d z)8l^UQ`$-=)z49bJlx zT1*6_J`r1VLHAnle!0Wo?W%4O$L6M(mzJ)KVrZ^3WMR!c#&vt4e#EWVQuJO)rS_X- zE1~#_^o^Ba%0TUt7xPxD9DRJ}N`)J$So4wvOIUi`Q9k9YbduVYoyzrIa{L0 zEK;luHgbtK2j(T4*Hks4)8lXoC>dqC#Sx^*+JOxZ^?+yAjz9a*(u;tuK3?_W^1s7q{-`a}3^y>HaLT zqV6)MZgfXI6NJcX;;ng@77rLNN-X?9cY|M8JxA>_LQhX*vjj=Qhm>KUXuesvSq~G! ztQYltvh2V=!xI!%7-#Qos}Y>KCoGtN+b2QZC;1f?P`AdqUzX&QF+2wec~$9VA`xga zaMWVsqCb}P6-~w6;MkviIJdW2T)3iJOe9QnbK;2|qv%2Or%6<}*v`AyPSU$88O~wF zku^}eHWS~V0pC}q-jPNgp7$HPTsH#w!bWaw*m97vTL#Qj<hEJn>?W6@X@yK)_P3Z*yxDVjhBwnRmmf{c15jfVG}XzU-)Wez$5o zHN3srSR)u4kh^T;IcZ(BM>D_BIyJ7K&}0J{c0UFxM?c9#s1xDW!2X!v{urS?gJaj0 zR^gR(>2>|RCf4cJkLZ0-o(t#iKc?v-6QoigvDlmiAfVZN)VPK z&siIOgU!g)!XozjNbIM__nIS;^)@2n1r=jz=O)U0Wu#ZV5wbr_{nYP^3%`yY1nE+( zEL`ItabqiGhZ;o(6$ER6=D7OWMNdK3cGSTP?dH?(?$N;N>Ma2VXdJ)^@j*zDjWW(8 zfqHkR#A0=nz5^&wzs7ND#*G5SrQ7`Tj>b0@m(4NFjN}~NSp6B% zhjux`LZHZ&yCM-8ejag$k(yX>7FvUe(9VQAq1b4Tx6&iBkuVC7HVQ~W&K@UCg)l8I zdHae<5&OP0mOrwHj=F}%pI?w9v|}JxfcX)i*CZ10eu{NL2eC${8gEQ<+eQL);yBqJQ<1<;BU{|_HV`}BJ$?=Fr&x@5I1qTm>OgE(rg}esE>+40;!T3&qyS@X?ufK_0JoDyo zjlsQaUV-6u%WN8l+hqjZ%*aS1V02sJ_LXmYWQBeXSVM4-m^n7 zn?M!)@=VsOQA^fvSFbnt6oYgogmWgu3`s3@PIE``i0z?Rgd^#*t z3B=1<1bW$ z^SQ%Dt)H#;g1`34s}Z^Ki~W&PGT;%`Ff=MlPG4f)*??z27q|P$D4hi`&&UN(RPy_! z4z0;-d(*VaxyLOle>zv@>So?iaCQn<(!-W2x=LD0Y9U}dSyPx0{S zKa3IFt8M%m=;I{1q}hV8yE^pJwNGU>U$!+fQ^xBZEjEDn)b0ZgBMH4CJK)EE*DL!Z zI;(NzS)Fh$&xkYm=WmeuiiVif*lmauJ9&ugIv@JO-rJdN*&Rj(@?ehJo^k)}Diq+d zFW zQ;`c!Bx(LAjn25iGw8KJqb5N)WGfB53e-*`>pgzCf3nR-ng**ttXwq)4nqsQJ4bEO z)4LSH+;~=QP=7Hfj|@?dYT7-zIz8zdZ^M^nFZn&_n%drS{{4*H^ZkEud}s7p#aVw- zf!w6&dY-iV7LgiU?zU7P@fm4$l+E^Mrs71WxBI*{ymv)W#1OE;)9sMz@dQ*ML2YAW|UYdb#Fbgq{>=XIqGCp z+!SV8GbP{QL6pskic4ppw^o+T7HLrFzJiRL>}q=)K{SMS52Ppi$QYRuM$!ws{1x-^ zD85!&;@q=4nONmQ&QMH{%(7P?9=2=kKHwPkYJ8l3S*bDEK7gQ3flE)ILO{gbyXSs% zLHAazJ{i7;T@xzcPPruGcU99?w5lw`IWgwG@V!4gOZjH+GHFf7+iB{g&-d#WxTG9p?|$mPlf9-Mg-k*ujMvy0w2l=op&FH(QgGz7RIOUtBEOnhI!dhb_Wv$a@XD|hk zo1oXFah)0^%kOM7WmK@!I|V1;PkdogvAexz^W5;3ZOPd2GQUH6@cEG3SEAq1%kZn&` z*`=`=rTF$PPtEMDEi~a)f8-zG0D<{j337hJzo7M53371L*Dh)zbCKWTPCY6H*|B=- zdFo=-h{I(y>Kp0CWnD?X8Lm*~@ls}6=WK}$&T6NP+I8RwO$g|ig0KUg-Lfvgd!((N zR|vnP#>lRZ$I!0*%HVbW=}pP$gg(R?+!YP|7-#%mpNAiT@D@UB}F z{?jP!wm}1Tl%%!V)!H^1mX4Jcsq`MgMP>TfxX^*z$0b>;roK5iyRK zIGXDBXFkI=Jw-V;-*2IB@{0X^UUK-^y2yZg|B2zn#%X87eC(uEgNNMtR?*dK>|FmF zl*1eJL^p!gg=xFWgNRbyoQWF2yymUmJDm<9j{W*6-qY=%+!uuIu+E5rj-9@$t@_Yi z<4=sI+pF6zt+WW|BAwoKr*z29GKsMO@X3Qh{7YEgE!m#p%?qP5;gQJb>!FGtv&-A3 zwjkxJ!z&BNNRzj-sG=asDuC+FY`@^$-T8tjuz&uotql=_aM-Zax}d|tu+2ga;~ZM^ z@-cLEmS2I%AEmtgc|y>?FV1K?mIDgN42(B z#aQWMrt5Pmt75?UdI}Yx13hp)OeX5{Ks~J9hCH5PxW$cvhh7;i85U6!o1RJEIjiog z7XJ{9G2D66!&+tNuIO5TOpf-gw#6IgH@ zRrE=;PWtM>mSFs~^RBYur^-js+silB#2Vw_d6%~mwG3o-_sg|d@3|NjMl}O2- zip`&Iy_6&+C3*8ARJM0NQNwL|uY<>mSaa>7aR>Fgp<3My%=@ENRfwQTl#3sZLY7{V z8LEf8h&^AXIg+*0czFZ@H?=>6ydojPi zfF3vmBmB+@`Pu4-)3+{wgtW;_a7`|fMziN*fh9P)x$v=K3q2R8Xb~Xk(t2hk_nizc zS3u=xy^^G*Lo;`Hgnl6SMSjL z=#ytYqrfV6?#n?pq~qP_7OoI<`5|4$ zcp|D)TPvoKuwrfpxzB^|8cIlk7p)(^5JNSNMb$Kge!B&U<`1u9o^LOIGH{+hE6<|x z*<*{5GunRW>UUSAaYiqmG2dc#H{6tu_{^Wz)^*00<`Z1oMe_0OMJXJrEcLdOl(Cv< zwA$U?2FPxNrQdouD*zeMg;o7WT?4sBy-z2D<5bHyxI9y%K4q5+)U$j{RZvb#$d2^DxV$(hof07;9@z994xz@d1Zv1W?PgZa z)yxv!M}7<&J>^`VAD`S7Q*|G~iXpuW_j->ZND|BI4V{!1MP#H}g$2l|Ep4vDZHZ^5 zfcX?&&4fVKd5R{Ev{niiJPTi}0waJ6gUQqC_n>rBc%mnP+1QcnLVs zJPn#ae;RG=Y(5S0TAtf=kU7A26;@6QTFPX(m@1#O!+Kv+)OTd}6NHU9#ul!12!U`T zUx`f~BXBidd-wt4HkRKuaw4bDlqa3WJhLhgc6g94hDmcIr{#&fbn0dL0~H+E|9E-)Kq3qS*y1@#B8F#%t`;Nf zHKl$30YQpz%^<47RBON-n@t1g)M>u#y?g3b$+oyCq?LPRq;(vK{9K{TsW2O96bSW^)_BsQ&e;^-2$;}yw8|cd3 z4NU}ea!P%UJ~vloLtG3f5bYvwt9u&j-rvaO`Pttq?u`(MhQjSRTU{+bXC;PqHE77# zRGMklCr6(?6BBP-%2w;%6swQlocpELKDmS2EM9eb8>rL$XG=jk$i8a3^{Z1FJ69or z=YAAW z9yKka1zi4Fbiq#4dV{!ZJ$v2<@woTq-Y;f~i^hjI;+c%B!&{ihdrnl@T(lNT-q;gFEX7>& zg^J4vyFOaAZkYgCw4Eg_|2FkoraDmNkJRK$F+JWgJ2OT$O7}XfGkK*aR1u)cd00? zCeHjxNrv@x2={zH+{|E|c~*wn?|$>TpPD|YzL6G8VM3S Date: Wed, 17 May 2023 09:20:28 -0600 Subject: [PATCH 04/45] new CVE fpr h2 & added guava --- .../dependency-check-suppression.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/project-files/owasp-dependency-check/dependency-check-suppression.xml b/project-files/owasp-dependency-check/dependency-check-suppression.xml index 73e79a86f2..b4ba908c92 100644 --- a/project-files/owasp-dependency-check/dependency-check-suppression.xml +++ b/project-files/owasp-dependency-check/dependency-check-suppression.xml @@ -100,6 +100,7 @@ CVE-2021-23463 CVE-2021-42392 CVE-2022-23221 + CVE-2022-45868 94 @@ -110,4 +111,12 @@ ^pkg:maven/commons-io/commons-io@.*$ CVE-2021-29425 + + + ^pkg:maven/com\.google\.guava/guava@.*$ + CVE-2020-8908 + From 33e58b9c23188f90c2bb86bd2dafc67fc9edd8bc Mon Sep 17 00:00:00 2001 From: Jennifer Oxelson Date: Wed, 17 May 2023 09:23:48 -0600 Subject: [PATCH 05/45] bump spring-test to 5.3.27 for CVE --- tds-testing-platform/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tds-testing-platform/build.gradle b/tds-testing-platform/build.gradle index e11e484a4d..ec36c75a3e 100644 --- a/tds-testing-platform/build.gradle +++ b/tds-testing-platform/build.gradle @@ -18,7 +18,7 @@ dependencies { // Spring-test v5.3.4 introduced a hard dependency on servlet api v4. // That will be rolled back in v5.4.5, so for now, we specifically ask for // spring-test 5.3.3. - api 'org.springframework:spring-test:5.3.23' + api 'org.springframework:spring-test:5.3.27' // opendap api 'org.apache.taglibs:taglibs-standard-spec' From 99bf1dcd2ea5f3678806051f483e7cbf6f031037 Mon Sep 17 00:00:00 2001 From: Jennifer Oxelson Date: Wed, 17 May 2023 09:24:43 -0600 Subject: [PATCH 06/45] bump versions for CVEs --- tds-platform/build.gradle | 10 +++++----- tds/build.gradle | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tds-platform/build.gradle b/tds-platform/build.gradle index 79552bd0dd..507e65b592 100644 --- a/tds-platform/build.gradle +++ b/tds-platform/build.gradle @@ -14,8 +14,8 @@ dependencies { // If there is a conflict (previously hidden by optimistic resolution), we should get an error when we build, and // at that point we can take things on a case-by-case basis. api enforcedPlatform("edu.ucar:netcdf-java-bom:${depVersion.netcdfJava}") - api enforcedPlatform('org.springframework:spring-framework-bom:5.3.23') - api enforcedPlatform('org.springframework.security:spring-security-bom:5.7.5') + api enforcedPlatform('org.springframework:spring-framework-bom:5.3.27') + api enforcedPlatform('org.springframework.security:spring-security-bom:5.7.8') api platform('net.openhft:chronicle-bom:2.23.136') api enforcedPlatform("org.apache.logging.log4j:log4j-bom:2.17.1") @@ -80,14 +80,14 @@ dependencies { runtime 'org.apache.logging.log4j:log4j-web' // tds - api 'org.json:json:20180813' + api 'org.json:json:20230227' api 'com.coverity.security:coverity-escapers:1.1.1' api 'org.thymeleaf:thymeleaf-spring5:3.0.15.RELEASE' api 'javax.validation:validation-api:2.0.1.Final' api "org.hibernate.validator:hibernate-validator:${depVersion.hibernateValidator}" api "org.hibernate.validator:hibernate-validator-annotation-processor:${depVersion.hibernateValidator}" api 'javax.el:javax.el-api:3.0.0' - api 'org.glassfish:javax.el:3.0.0' + api 'org.glassfish:jakarta.el:4.0.2' // waterml stuff api 'org.apache.xmlbeans:xmlbeans' @@ -95,7 +95,7 @@ dependencies { api 'org.n52.sensorweb:52n-xml-om-v20' // edal-java (ncwms) - def edalVersion = '1.5.0.6-SNAPSHOT' + def edalVersion = '1.5.2' api "uk.ac.rdg.resc:edal-common:${edalVersion}" api "uk.ac.rdg.resc:edal-cdm:${edalVersion}" api "uk.ac.rdg.resc:edal-wms:${edalVersion}" diff --git a/tds/build.gradle b/tds/build.gradle index 8873692f61..edbe6dcd8f 100644 --- a/tds/build.gradle +++ b/tds/build.gradle @@ -88,7 +88,7 @@ dependencies { compile 'javax.validation:validation-api' runtime 'org.hibernate.validator:hibernate-validator' runtime 'javax.el:javax.el-api' - runtime 'org.glassfish:javax.el' + runtime 'org.glassfish:jakarta.el' annotationProcessor "org.hibernate.validator:hibernate-validator-annotation-processor:${depVersion.hibernateValidator}" // @Resource annotation (removed post Java 8) From 084894c7cbe62d448825fa30a45b7b74a623626a Mon Sep 17 00:00:00 2001 From: Jennifer Oxelson Date: Wed, 17 May 2023 10:49:40 -0600 Subject: [PATCH 07/45] dealing with the pesky com.sleepycat:je lib --- tds-platform/build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tds-platform/build.gradle b/tds-platform/build.gradle index 507e65b592..2785f26502 100644 --- a/tds-platform/build.gradle +++ b/tds-platform/build.gradle @@ -102,6 +102,9 @@ dependencies { api "uk.ac.rdg.resc:edal-graphics:${edalVersion}" api "uk.ac.rdg.resc:edal-godiva:${edalVersion}" + // 4.0.92 version used in edal-java has multiple CVEs + api 'com.sleepycat:je:5.0.73' + // gwt version defined in gradle/any/shared-mvn-coords.gradle, accessible via gradle/any/dependencies.gradle api "com.google.gwt:gwt-dev:${depVersion.gwt}" api "com.google.gwt:gwt-user:${depVersion.gwt}" From dfb225786a047d26235576b8d810c0a4994ce460 Mon Sep 17 00:00:00 2001 From: Jennifer Oxelson Date: Wed, 17 May 2023 10:50:31 -0600 Subject: [PATCH 08/45] suppress json-20230227 & fresmith false positives --- .../dependency-check-suppression.xml | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/project-files/owasp-dependency-check/dependency-check-suppression.xml b/project-files/owasp-dependency-check/dependency-check-suppression.xml index b4ba908c92..be6c4d139b 100644 --- a/project-files/owasp-dependency-check/dependency-check-suppression.xml +++ b/project-files/owasp-dependency-check/dependency-check-suppression.xml @@ -114,9 +114,24 @@ ^pkg:maven/com\.google\.guava/guava@.*$ CVE-2020-8908 + + + ^pkg:maven/org\.json/json@.*$ + CVE-2022-45688 + + + + CVE-2021-4277 + From 0a8557882db75931f98c92ec649d10e22398df89 Mon Sep 17 00:00:00 2001 From: Jennifer Oxelson Date: Wed, 17 May 2023 11:06:17 -0600 Subject: [PATCH 09/45] clarification --- .../owasp-dependency-check/dependency-check-suppression.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project-files/owasp-dependency-check/dependency-check-suppression.xml b/project-files/owasp-dependency-check/dependency-check-suppression.xml index be6c4d139b..1ceff9d27f 100644 --- a/project-files/owasp-dependency-check/dependency-check-suppression.xml +++ b/project-files/owasp-dependency-check/dependency-check-suppression.xml @@ -130,7 +130,7 @@ CVE-2021-4277 From 34baacfb1eb492b65f187afbf84a629366b174ad Mon Sep 17 00:00:00 2001 From: Jennifer Oxelson Date: Wed, 17 May 2023 11:06:38 -0600 Subject: [PATCH 10/45] bump of sleepycat je lib version --- tds-platform/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tds-platform/build.gradle b/tds-platform/build.gradle index 2785f26502..c211138d15 100644 --- a/tds-platform/build.gradle +++ b/tds-platform/build.gradle @@ -103,7 +103,7 @@ dependencies { api "uk.ac.rdg.resc:edal-godiva:${edalVersion}" // 4.0.92 version used in edal-java has multiple CVEs - api 'com.sleepycat:je:5.0.73' + api 'com.sleepycat:je:18.3.12' // gwt version defined in gradle/any/shared-mvn-coords.gradle, accessible via gradle/any/dependencies.gradle api "com.google.gwt:gwt-dev:${depVersion.gwt}" From 4f203dfebd2a8864ef563349637d8e35432b878d Mon Sep 17 00:00:00 2001 From: Jennifer Oxelson Date: Wed, 17 May 2023 13:36:09 -0600 Subject: [PATCH 11/45] removed je - not being used --- tds-platform/build.gradle | 3 --- 1 file changed, 3 deletions(-) diff --git a/tds-platform/build.gradle b/tds-platform/build.gradle index c211138d15..507e65b592 100644 --- a/tds-platform/build.gradle +++ b/tds-platform/build.gradle @@ -102,9 +102,6 @@ dependencies { api "uk.ac.rdg.resc:edal-graphics:${edalVersion}" api "uk.ac.rdg.resc:edal-godiva:${edalVersion}" - // 4.0.92 version used in edal-java has multiple CVEs - api 'com.sleepycat:je:18.3.12' - // gwt version defined in gradle/any/shared-mvn-coords.gradle, accessible via gradle/any/dependencies.gradle api "com.google.gwt:gwt-dev:${depVersion.gwt}" api "com.google.gwt:gwt-user:${depVersion.gwt}" From 61ed22b536fc4b8f16a58d6ad28ef255f99e429e Mon Sep 17 00:00:00 2001 From: Jennifer Oxelson Date: Wed, 17 May 2023 13:57:34 -0600 Subject: [PATCH 12/45] added entry for com.sleepycat:je --- .../dependency-check-suppression.xml | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/project-files/owasp-dependency-check/dependency-check-suppression.xml b/project-files/owasp-dependency-check/dependency-check-suppression.xml index 1ceff9d27f..fce23d6c33 100644 --- a/project-files/owasp-dependency-check/dependency-check-suppression.xml +++ b/project-files/owasp-dependency-check/dependency-check-suppression.xml @@ -134,4 +134,26 @@ ]]> CVE-2021-4277 + + + ^pkg:maven/com\.sleepycat/je@.*$ + CVE-2017-3604 + CVE-2017-3605 + CVE-2017-3606 + CVE-2017-3607 + CVE-2017-3608 + CVE-2017-3609 + CVE-2017-3610 + CVE-2017-3611 + CVE-2017-3612 + CVE-2017-3613 + CVE-2017-3615 + CVE-2017-3616 + CVE-2017-3617 + CVE-2020-2981 + CVE-2019-2708 + From c7ae7c22f716ecee0dbb4d5863b98c90dd152497 Mon Sep 17 00:00:00 2001 From: Jennifer Oxelson Date: Wed, 17 May 2023 14:11:35 -0600 Subject: [PATCH 13/45] added CVE-2017-3614 --- .../owasp-dependency-check/dependency-check-suppression.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/project-files/owasp-dependency-check/dependency-check-suppression.xml b/project-files/owasp-dependency-check/dependency-check-suppression.xml index fce23d6c33..cf2340c65e 100644 --- a/project-files/owasp-dependency-check/dependency-check-suppression.xml +++ b/project-files/owasp-dependency-check/dependency-check-suppression.xml @@ -150,6 +150,7 @@ CVE-2017-3611 CVE-2017-3612 CVE-2017-3613 + CVE-2017-3614 CVE-2017-3615 CVE-2017-3616 CVE-2017-3617 From d0de819f30508495843ea5e20bc075e2f13b8196 Mon Sep 17 00:00:00 2001 From: Jennifer Oxelson Date: Wed, 17 May 2023 14:41:07 -0600 Subject: [PATCH 14/45] changed edal-java to 1.5.0.6-SNAPSHOT --- tds-platform/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tds-platform/build.gradle b/tds-platform/build.gradle index 507e65b592..c4ade5beaf 100644 --- a/tds-platform/build.gradle +++ b/tds-platform/build.gradle @@ -95,7 +95,7 @@ dependencies { api 'org.n52.sensorweb:52n-xml-om-v20' // edal-java (ncwms) - def edalVersion = '1.5.2' + def edalVersion = '1.5.0.6-SNAPSHOT' api "uk.ac.rdg.resc:edal-common:${edalVersion}" api "uk.ac.rdg.resc:edal-cdm:${edalVersion}" api "uk.ac.rdg.resc:edal-wms:${edalVersion}" From 002e1c17ff278e353937e4cb7d3678ba7ad84f43 Mon Sep 17 00:00:00 2001 From: Jennifer Oxelson Date: Wed, 17 May 2023 14:54:00 -0600 Subject: [PATCH 15/45] remove suppression of je-4.0.92.jar now that we are using our version of edal-java --- .../dependency-check-suppression.xml | 23 ------------------- 1 file changed, 23 deletions(-) diff --git a/project-files/owasp-dependency-check/dependency-check-suppression.xml b/project-files/owasp-dependency-check/dependency-check-suppression.xml index cf2340c65e..1ceff9d27f 100644 --- a/project-files/owasp-dependency-check/dependency-check-suppression.xml +++ b/project-files/owasp-dependency-check/dependency-check-suppression.xml @@ -134,27 +134,4 @@ ]]> CVE-2021-4277 - - - ^pkg:maven/com\.sleepycat/je@.*$ - CVE-2017-3604 - CVE-2017-3605 - CVE-2017-3606 - CVE-2017-3607 - CVE-2017-3608 - CVE-2017-3609 - CVE-2017-3610 - CVE-2017-3611 - CVE-2017-3612 - CVE-2017-3613 - CVE-2017-3614 - CVE-2017-3615 - CVE-2017-3616 - CVE-2017-3617 - CVE-2020-2981 - CVE-2019-2708 - From c20d280e7f1485c95bdcea833c37e5f49fd6d679 Mon Sep 17 00:00:00 2001 From: Jennifer Oxelson Date: Wed, 17 May 2023 15:22:17 -0600 Subject: [PATCH 16/45] bump hibernate validator to 8.0.0.Final --- gradle/any/shared-mvn-coords.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/any/shared-mvn-coords.gradle b/gradle/any/shared-mvn-coords.gradle index bbca4f2bc6..1292aa842f 100644 --- a/gradle/any/shared-mvn-coords.gradle +++ b/gradle/any/shared-mvn-coords.gradle @@ -27,7 +27,7 @@ ext { // gradle seems to have issues with the compileOnly configuration, so we need to provide the full maven // coordinates for javax.servlet-api if the gradle plugin in applied. If we don't, we see errors like this: depVersion.javaxServletApi = '3.1.0' - depVersion.hibernateValidator = '6.1.5.Final' + depVersion.hibernateValidator = '8.0.0.Final' // TODO: figure out way to keep this version in sync with netcdf-java version // It is included in the netcdf-java-bom (via netcdf-java-platform), but we can't // reference that version in a gradle build script (see gradle/any/protobuf.gradle) From 1cc95293ffd41e178f0ab66bd2048463ba0c2412 Mon Sep 17 00:00:00 2001 From: Jennifer Oxelson Date: Wed, 17 May 2023 15:58:23 -0600 Subject: [PATCH 17/45] bump in javax.el and jakarta validator --- tds-platform/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tds-platform/build.gradle b/tds-platform/build.gradle index c4ade5beaf..1225dfb37d 100644 --- a/tds-platform/build.gradle +++ b/tds-platform/build.gradle @@ -83,10 +83,10 @@ dependencies { api 'org.json:json:20230227' api 'com.coverity.security:coverity-escapers:1.1.1' api 'org.thymeleaf:thymeleaf-spring5:3.0.15.RELEASE' - api 'javax.validation:validation-api:2.0.1.Final' + api 'jakarta.validation:jakarta.validation-api:3.0.2' api "org.hibernate.validator:hibernate-validator:${depVersion.hibernateValidator}" api "org.hibernate.validator:hibernate-validator-annotation-processor:${depVersion.hibernateValidator}" - api 'javax.el:javax.el-api:3.0.0' + api 'javax.el:javax.el-api:3.0.1-b06' api 'org.glassfish:jakarta.el:4.0.2' // waterml stuff From f06ea6f5112007e18c469d0a3bf6447a381ff4c4 Mon Sep 17 00:00:00 2001 From: Jennifer Oxelson Date: Wed, 17 May 2023 16:22:48 -0600 Subject: [PATCH 18/45] backing out of changes --- gradle/any/shared-mvn-coords.gradle | 2 +- tds-platform/build.gradle | 6 +++--- tds/build.gradle | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/gradle/any/shared-mvn-coords.gradle b/gradle/any/shared-mvn-coords.gradle index 1292aa842f..bbca4f2bc6 100644 --- a/gradle/any/shared-mvn-coords.gradle +++ b/gradle/any/shared-mvn-coords.gradle @@ -27,7 +27,7 @@ ext { // gradle seems to have issues with the compileOnly configuration, so we need to provide the full maven // coordinates for javax.servlet-api if the gradle plugin in applied. If we don't, we see errors like this: depVersion.javaxServletApi = '3.1.0' - depVersion.hibernateValidator = '8.0.0.Final' + depVersion.hibernateValidator = '6.1.5.Final' // TODO: figure out way to keep this version in sync with netcdf-java version // It is included in the netcdf-java-bom (via netcdf-java-platform), but we can't // reference that version in a gradle build script (see gradle/any/protobuf.gradle) diff --git a/tds-platform/build.gradle b/tds-platform/build.gradle index 1225dfb37d..5842b2e75f 100644 --- a/tds-platform/build.gradle +++ b/tds-platform/build.gradle @@ -83,11 +83,11 @@ dependencies { api 'org.json:json:20230227' api 'com.coverity.security:coverity-escapers:1.1.1' api 'org.thymeleaf:thymeleaf-spring5:3.0.15.RELEASE' - api 'jakarta.validation:jakarta.validation-api:3.0.2' + api 'javax.validation:validation-api:2.0.1.Final' api "org.hibernate.validator:hibernate-validator:${depVersion.hibernateValidator}" api "org.hibernate.validator:hibernate-validator-annotation-processor:${depVersion.hibernateValidator}" - api 'javax.el:javax.el-api:3.0.1-b06' - api 'org.glassfish:jakarta.el:4.0.2' + api 'javax.el:javax.el-api:3.0.0' + api 'org.glassfish:javax.el:3.0.0' // waterml stuff api 'org.apache.xmlbeans:xmlbeans' diff --git a/tds/build.gradle b/tds/build.gradle index edbe6dcd8f..8873692f61 100644 --- a/tds/build.gradle +++ b/tds/build.gradle @@ -88,7 +88,7 @@ dependencies { compile 'javax.validation:validation-api' runtime 'org.hibernate.validator:hibernate-validator' runtime 'javax.el:javax.el-api' - runtime 'org.glassfish:jakarta.el' + runtime 'org.glassfish:javax.el' annotationProcessor "org.hibernate.validator:hibernate-validator-annotation-processor:${depVersion.hibernateValidator}" // @Resource annotation (removed post Java 8) From 8041dbdb7d0c6361be94c4721c131d0436a0db03 Mon Sep 17 00:00:00 2001 From: Jennifer Oxelson Date: Wed, 17 May 2023 16:51:13 -0600 Subject: [PATCH 19/45] suppressing javax.el-3.0.0.jar --- .../dependency-check-suppression.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/project-files/owasp-dependency-check/dependency-check-suppression.xml b/project-files/owasp-dependency-check/dependency-check-suppression.xml index 1ceff9d27f..9b3599ea25 100644 --- a/project-files/owasp-dependency-check/dependency-check-suppression.xml +++ b/project-files/owasp-dependency-check/dependency-check-suppression.xml @@ -134,4 +134,15 @@ ]]> CVE-2021-4277 + + + ^pkg:maven/org\.glassfish/javax\.el@.*$ + CVE-2020-15250 + From b818576ecdd32fd5cce27a45c968c1e728e43f9f Mon Sep 17 00:00:00 2001 From: haileyajohnson Date: Fri, 19 May 2023 10:50:33 -0700 Subject: [PATCH 20/45] add ovrwrite option to temp file creation --- tds/src/test/java/thredds/server/wms/TestWmsCache.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tds/src/test/java/thredds/server/wms/TestWmsCache.java b/tds/src/test/java/thredds/server/wms/TestWmsCache.java index 1e96439316..a739fa406a 100644 --- a/tds/src/test/java/thredds/server/wms/TestWmsCache.java +++ b/tds/src/test/java/thredds/server/wms/TestWmsCache.java @@ -40,7 +40,7 @@ public class TestWmsCache { @Before public void createTestFiles() throws IOException { - Files.copy(TEST_FILE, TEMP_FILE); + updateTestFile(); } @After From f3fa2e43cda724bff03664b86b7500803cf32776 Mon Sep 17 00:00:00 2001 From: haileyajohnson Date: Mon, 22 May 2023 12:52:43 -0700 Subject: [PATCH 21/45] add temp folder to content dir --- .../thredds/server/wms/ThreddsWmsServlet.java | 4 ++++ .../java/thredds/server/wms/TestWmsCache.java | 24 ++++++++++++------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/tds/src/main/java/thredds/server/wms/ThreddsWmsServlet.java b/tds/src/main/java/thredds/server/wms/ThreddsWmsServlet.java index b5cd235b4d..3eaaa0d0a9 100644 --- a/tds/src/main/java/thredds/server/wms/ThreddsWmsServlet.java +++ b/tds/src/main/java/thredds/server/wms/ThreddsWmsServlet.java @@ -72,6 +72,10 @@ public CachedWmsCatalogue(ThreddsWmsCatalogue wmsCatalogue, long lastModified) { private static final Map catalogueCache = new HashMap<>(); + static void resetCache() { + catalogueCache.clear(); + } + @Override @RequestMapping(value = "**", method = {RequestMethod.GET}) protected void dispatchWmsRequest(String request, RequestParams params, HttpServletRequest httpServletRequest, diff --git a/tds/src/test/java/thredds/server/wms/TestWmsCache.java b/tds/src/test/java/thredds/server/wms/TestWmsCache.java index a739fa406a..755e2fbc76 100644 --- a/tds/src/test/java/thredds/server/wms/TestWmsCache.java +++ b/tds/src/test/java/thredds/server/wms/TestWmsCache.java @@ -2,15 +2,16 @@ import static com.google.common.truth.Truth.assertThat; +import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import javax.servlet.ServletException; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; + +import org.junit.*; +import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,22 +31,29 @@ public class TestWmsCache { private static final String DIR = "src/test/content/thredds/public/testdata/"; private static final Path TEST_FILE = Paths.get(DIR, "testGridAsPoint.nc"); - private static final Path TEMP_FILE = Paths.get(DIR, "testUpdate.nc"); - private static final String TEST_PATH = "localContent/testUpdate.nc"; + private Path TEMP_FILE;// = Paths.get(DIR, "testUpdate.nc"); + private String TEST_PATH;// = "localContent/testUpdate.nc"; + private static String FILENAME = "testUpdate.nc"; private static final String S3_TEST_PATH = "s3-thredds-test-data/ncml/nc/namExtract/20060925_0600.nc"; private static final String AGGREGATION_RECHECK_MSEC_PATH = "aggRecheck/millisecond"; private static final String AGGREGATION_RECHECK_MINUTE_PATH = "aggRecheck/minute"; final private ThreddsWmsServlet threddsWmsServlet = new ThreddsWmsServlet(); + @Rule + public TemporaryFolder temporaryFolder = new TemporaryFolder(new File(DIR)); + @Before public void createTestFiles() throws IOException { - updateTestFile(); + File temp_file = temporaryFolder.newFile(FILENAME); + TEMP_FILE = temp_file.toPath(); + TEST_PATH = "localContent/" + new File(DIR).toURI().relativize(temp_file.toURI()); + Files.copy(TEST_FILE, TEMP_FILE, StandardCopyOption.REPLACE_EXISTING); } @After - public void cleanupTestFiles() throws IOException { - Files.delete(TEMP_FILE); + public void clearCache() { + ThreddsWmsServlet.resetCache(); } @Test From 43bb32da4049f482ea69aeda04f3ac939991e530 Mon Sep 17 00:00:00 2001 From: haileyajohnson Date: Mon, 22 May 2023 12:56:00 -0700 Subject: [PATCH 22/45] ignore WMS cache tests for now --- tds/src/test/java/thredds/server/wms/TestWmsCache.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tds/src/test/java/thredds/server/wms/TestWmsCache.java b/tds/src/test/java/thredds/server/wms/TestWmsCache.java index 755e2fbc76..5b237b96a7 100644 --- a/tds/src/test/java/thredds/server/wms/TestWmsCache.java +++ b/tds/src/test/java/thredds/server/wms/TestWmsCache.java @@ -22,7 +22,7 @@ import org.springframework.test.context.web.WebAppConfiguration; import java.lang.invoke.MethodHandles; - +@Ignore("TODO: fix WMS cache - tests fail on windows (and occasionally on GH?)") @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration(locations = {"/WEB-INF/applicationContext.xml"}) From ec45550bb76f1e964ec7d58506c9323b20936581 Mon Sep 17 00:00:00 2001 From: haileyajohnson Date: Mon, 22 May 2023 13:36:35 -0700 Subject: [PATCH 23/45] Update tds/src/test/java/thredds/server/wms/TestWmsCache.java Co-authored-by: Tara Drwenski --- tds/src/test/java/thredds/server/wms/TestWmsCache.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tds/src/test/java/thredds/server/wms/TestWmsCache.java b/tds/src/test/java/thredds/server/wms/TestWmsCache.java index 5b237b96a7..5434fb7267 100644 --- a/tds/src/test/java/thredds/server/wms/TestWmsCache.java +++ b/tds/src/test/java/thredds/server/wms/TestWmsCache.java @@ -45,9 +45,9 @@ public class TestWmsCache { @Before public void createTestFiles() throws IOException { - File temp_file = temporaryFolder.newFile(FILENAME); - TEMP_FILE = temp_file.toPath(); - TEST_PATH = "localContent/" + new File(DIR).toURI().relativize(temp_file.toURI()); + File tempFile = temporaryFolder.newFile(FILENAME); + TEMP_FILE = tempFile.toPath(); + TEST_PATH = "localContent/" + new File(DIR).toURI().relativize(tempFile.toURI()); Files.copy(TEST_FILE, TEMP_FILE, StandardCopyOption.REPLACE_EXISTING); } From ee96018e522c0ebd7e9bb28464dc70caeb46a5da Mon Sep 17 00:00:00 2001 From: haileyajohnson Date: Mon, 22 May 2023 14:41:14 -0700 Subject: [PATCH 24/45] ignore other tests --- .../java/thredds/server/wms/TestUpdateWmsServer.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tds/src/integrationTests/java/thredds/server/wms/TestUpdateWmsServer.java b/tds/src/integrationTests/java/thredds/server/wms/TestUpdateWmsServer.java index e8f73c7d37..bb11f8cdba 100644 --- a/tds/src/integrationTests/java/thredds/server/wms/TestUpdateWmsServer.java +++ b/tds/src/integrationTests/java/thredds/server/wms/TestUpdateWmsServer.java @@ -20,6 +20,7 @@ import org.jdom2.xpath.XPathExpression; import org.jdom2.xpath.XPathFactory; import org.junit.After; +import org.junit.Ignore; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,6 +33,7 @@ import static com.google.common.truth.Truth.assertThat; +@Ignore("TODO: fix locked files issue") public class TestUpdateWmsServer { private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); From c81ed1e5dfe7269b7bf0c63e1870c08197617580 Mon Sep 17 00:00:00 2001 From: Jennifer Oxelson Date: Thu, 18 May 2023 10:24:18 -0600 Subject: [PATCH 25/45] CVE-2021-28170 --- .../owasp-dependency-check/dependency-check-suppression.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/project-files/owasp-dependency-check/dependency-check-suppression.xml b/project-files/owasp-dependency-check/dependency-check-suppression.xml index 9b3599ea25..78d87a30ba 100644 --- a/project-files/owasp-dependency-check/dependency-check-suppression.xml +++ b/project-files/owasp-dependency-check/dependency-check-suppression.xml @@ -144,5 +144,6 @@ ]]> ^pkg:maven/org\.glassfish/javax\.el@.*$ CVE-2020-15250 + CVE-2021-28170 From 9e8c126228ce83f44f385a195429d99dd0cf337b Mon Sep 17 00:00:00 2001 From: Jennifer Oxelson Date: Fri, 19 May 2023 10:45:01 -0600 Subject: [PATCH 26/45] namespace changes javax.validation --> jakarta.validation --- tdcommon/build.gradle | 2 +- .../server/catalog/tracker/DatasetExtBytesMarshaller.java | 2 +- .../server/catalogservice/RemoteCatalogRequest.java | 2 +- .../catalogservice/RemoteCatalogServiceController.java | 2 +- .../thredds/server/cdmremote/CdmRemoteController.java | 2 +- .../java/thredds/server/metadata/MetadataController.java | 2 +- .../server/metadata/MetadataRequestParameterBean.java | 2 +- .../server/ncss/controller/NcssGridController.java | 2 +- .../server/ncss/controller/NcssPointController.java | 2 +- .../server/ncss/validation/NcssGridRequestConstraint.java | 4 ++-- .../server/ncss/validation/NcssGridRequestValidator.java | 6 +++--- .../ncss/validation/PointHorizSubsetTypeConstraint.java | 4 ++-- .../ncss/validation/PointHorizSubsetTypeValidator.java | 8 ++++---- .../server/ncss/validation/TimeParamsConstraint.java | 4 ++-- .../server/ncss/validation/TimeParamsValidator.java | 4 ++-- .../server/ncss/validation/VarParamConstraint.java | 4 ++-- .../server/ncss/validation/VarParamsValidator.java | 4 ++-- .../any_point/AbstractMixedFeatureTypeSubsetWriter.java | 2 +- .../java/thredds/server/notebook/NotebookController.java | 2 +- .../main/java/thredds/server/viewer/ViewerController.java | 2 +- .../thredds/server/viewer/ViewerRequestParamsBean.java | 2 +- 21 files changed, 32 insertions(+), 32 deletions(-) diff --git a/tdcommon/build.gradle b/tdcommon/build.gradle index 880d1bff4c..7dc88014e6 100644 --- a/tdcommon/build.gradle +++ b/tdcommon/build.gradle @@ -13,7 +13,7 @@ dependencies { compile 'edu.ucar:grib' compile 'org.jdom:jdom2' - compile 'javax.validation:validation-api' + compile 'jakarta.validation:jakarta.validation-api' compile 'javax.annotation:javax.annotation-api' compile 'org.quartz-scheduler:quartz' diff --git a/tdcommon/src/main/java/thredds/server/catalog/tracker/DatasetExtBytesMarshaller.java b/tdcommon/src/main/java/thredds/server/catalog/tracker/DatasetExtBytesMarshaller.java index 4839800134..2909338d7e 100644 --- a/tdcommon/src/main/java/thredds/server/catalog/tracker/DatasetExtBytesMarshaller.java +++ b/tdcommon/src/main/java/thredds/server/catalog/tracker/DatasetExtBytesMarshaller.java @@ -5,7 +5,7 @@ import net.openhft.chronicle.core.util.ReadResolvable; import net.openhft.chronicle.hash.serialization.BytesReader; import net.openhft.chronicle.hash.serialization.BytesWriter; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; import javax.annotation.Nullable; public class DatasetExtBytesMarshaller diff --git a/tds/src/main/java/thredds/server/catalogservice/RemoteCatalogRequest.java b/tds/src/main/java/thredds/server/catalogservice/RemoteCatalogRequest.java index 898be9103b..1941f1d4b5 100644 --- a/tds/src/main/java/thredds/server/catalogservice/RemoteCatalogRequest.java +++ b/tds/src/main/java/thredds/server/catalogservice/RemoteCatalogRequest.java @@ -4,7 +4,7 @@ */ package thredds.server.catalogservice; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; import java.net.URI; /** diff --git a/tds/src/main/java/thredds/server/catalogservice/RemoteCatalogServiceController.java b/tds/src/main/java/thredds/server/catalogservice/RemoteCatalogServiceController.java index df728cb673..cdd20ff8c3 100644 --- a/tds/src/main/java/thredds/server/catalogservice/RemoteCatalogServiceController.java +++ b/tds/src/main/java/thredds/server/catalogservice/RemoteCatalogServiceController.java @@ -26,7 +26,7 @@ import thredds.server.exception.ServiceNotAllowed; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; +import jakarta.validation.Valid; import java.net.URI; import java.util.Formatter; import java.util.HashMap; diff --git a/tds/src/main/java/thredds/server/cdmremote/CdmRemoteController.java b/tds/src/main/java/thredds/server/cdmremote/CdmRemoteController.java index b7432dca97..c63c0f3504 100644 --- a/tds/src/main/java/thredds/server/cdmremote/CdmRemoteController.java +++ b/tds/src/main/java/thredds/server/cdmremote/CdmRemoteController.java @@ -36,7 +36,7 @@ import ucar.nc2.stream.NcStreamWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; +import jakarta.validation.Valid; import java.io.IOException; import java.io.OutputStream; import java.util.StringTokenizer; diff --git a/tds/src/main/java/thredds/server/metadata/MetadataController.java b/tds/src/main/java/thredds/server/metadata/MetadataController.java index aa8f2463e5..d2daec3ace 100644 --- a/tds/src/main/java/thredds/server/metadata/MetadataController.java +++ b/tds/src/main/java/thredds/server/metadata/MetadataController.java @@ -28,7 +28,7 @@ import ucar.nc2.dt.GridDataset; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; +import jakarta.validation.Valid; import java.util.Formatter; import java.util.List; diff --git a/tds/src/main/java/thredds/server/metadata/MetadataRequestParameterBean.java b/tds/src/main/java/thredds/server/metadata/MetadataRequestParameterBean.java index d1720abf9e..52baec5210 100644 --- a/tds/src/main/java/thredds/server/metadata/MetadataRequestParameterBean.java +++ b/tds/src/main/java/thredds/server/metadata/MetadataRequestParameterBean.java @@ -5,7 +5,7 @@ package thredds.server.metadata; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; /** * Describe diff --git a/tds/src/main/java/thredds/server/ncss/controller/NcssGridController.java b/tds/src/main/java/thredds/server/ncss/controller/NcssGridController.java index 4e873250c7..1791d01413 100644 --- a/tds/src/main/java/thredds/server/ncss/controller/NcssGridController.java +++ b/tds/src/main/java/thredds/server/ncss/controller/NcssGridController.java @@ -39,7 +39,7 @@ import ucar.nc2.util.IO; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; +import jakarta.validation.Valid; import java.io.File; import java.io.IOException; import java.util.*; diff --git a/tds/src/main/java/thredds/server/ncss/controller/NcssPointController.java b/tds/src/main/java/thredds/server/ncss/controller/NcssPointController.java index ed5e6d29f3..233ece6eae 100644 --- a/tds/src/main/java/thredds/server/ncss/controller/NcssPointController.java +++ b/tds/src/main/java/thredds/server/ncss/controller/NcssPointController.java @@ -43,7 +43,7 @@ import ucar.unidata.geoloc.LatLonRect; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; +import jakarta.validation.Valid; import java.io.IOException; import java.util.Formatter; import java.util.HashMap; diff --git a/tds/src/main/java/thredds/server/ncss/validation/NcssGridRequestConstraint.java b/tds/src/main/java/thredds/server/ncss/validation/NcssGridRequestConstraint.java index baa0477676..4236d85a62 100644 --- a/tds/src/main/java/thredds/server/ncss/validation/NcssGridRequestConstraint.java +++ b/tds/src/main/java/thredds/server/ncss/validation/NcssGridRequestConstraint.java @@ -5,8 +5,8 @@ package thredds.server.ncss.validation; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; diff --git a/tds/src/main/java/thredds/server/ncss/validation/NcssGridRequestValidator.java b/tds/src/main/java/thredds/server/ncss/validation/NcssGridRequestValidator.java index 434bafd0ed..38af230c73 100644 --- a/tds/src/main/java/thredds/server/ncss/validation/NcssGridRequestValidator.java +++ b/tds/src/main/java/thredds/server/ncss/validation/NcssGridRequestValidator.java @@ -7,8 +7,8 @@ import thredds.server.ncss.params.NcssGridParamsBean; import ucar.nc2.time.CalendarDate; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; /** * Validator for ncss GridRequest @@ -26,7 +26,7 @@ public class NcssGridRequestValidator implements ConstraintValidator> { diff --git a/tds/src/main/java/thredds/server/ncss/view/dsg/any_point/AbstractMixedFeatureTypeSubsetWriter.java b/tds/src/main/java/thredds/server/ncss/view/dsg/any_point/AbstractMixedFeatureTypeSubsetWriter.java index 6dd16b46d2..ec838ee90b 100644 --- a/tds/src/main/java/thredds/server/ncss/view/dsg/any_point/AbstractMixedFeatureTypeSubsetWriter.java +++ b/tds/src/main/java/thredds/server/ncss/view/dsg/any_point/AbstractMixedFeatureTypeSubsetWriter.java @@ -7,7 +7,7 @@ import ucar.nc2.ft.*; import ucar.nc2.ft2.coverage.SubsetParams; -import javax.validation.constraints.Null; +import jakarta.validation.constraints.Null; import javax.xml.stream.XMLStreamException; import java.io.IOException; import java.io.OutputStream; diff --git a/tds/src/main/java/thredds/server/notebook/NotebookController.java b/tds/src/main/java/thredds/server/notebook/NotebookController.java index 86c6896d33..da2cc9c0e9 100644 --- a/tds/src/main/java/thredds/server/notebook/NotebookController.java +++ b/tds/src/main/java/thredds/server/notebook/NotebookController.java @@ -20,7 +20,7 @@ import thredds.util.Constants; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; +import jakarta.validation.Valid; import java.io.*; import java.net.URI; import java.net.URISyntaxException; diff --git a/tds/src/main/java/thredds/server/viewer/ViewerController.java b/tds/src/main/java/thredds/server/viewer/ViewerController.java index 03cffc26a5..93d8288763 100644 --- a/tds/src/main/java/thredds/server/viewer/ViewerController.java +++ b/tds/src/main/java/thredds/server/viewer/ViewerController.java @@ -10,7 +10,7 @@ import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; +import jakarta.validation.Valid; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/tds/src/main/java/thredds/server/viewer/ViewerRequestParamsBean.java b/tds/src/main/java/thredds/server/viewer/ViewerRequestParamsBean.java index 89eeb0dc7f..9f38bb1871 100644 --- a/tds/src/main/java/thredds/server/viewer/ViewerRequestParamsBean.java +++ b/tds/src/main/java/thredds/server/viewer/ViewerRequestParamsBean.java @@ -5,7 +5,7 @@ package thredds.server.viewer; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; public class ViewerRequestParamsBean { From ccbe1335d038d110427779de77e93d4dc53328d6 Mon Sep 17 00:00:00 2001 From: Jennifer Oxelson Date: Fri, 19 May 2023 10:45:49 -0600 Subject: [PATCH 27/45] bump hibernate validator version --- gradle/any/shared-mvn-coords.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/any/shared-mvn-coords.gradle b/gradle/any/shared-mvn-coords.gradle index bbca4f2bc6..1292aa842f 100644 --- a/gradle/any/shared-mvn-coords.gradle +++ b/gradle/any/shared-mvn-coords.gradle @@ -27,7 +27,7 @@ ext { // gradle seems to have issues with the compileOnly configuration, so we need to provide the full maven // coordinates for javax.servlet-api if the gradle plugin in applied. If we don't, we see errors like this: depVersion.javaxServletApi = '3.1.0' - depVersion.hibernateValidator = '6.1.5.Final' + depVersion.hibernateValidator = '8.0.0.Final' // TODO: figure out way to keep this version in sync with netcdf-java version // It is included in the netcdf-java-bom (via netcdf-java-platform), but we can't // reference that version in a gradle build script (see gradle/any/protobuf.gradle) From 731bf468c333f4d4d5830199bb40dc5ca795d2a1 Mon Sep 17 00:00:00 2001 From: Jennifer Oxelson Date: Fri, 19 May 2023 10:48:19 -0600 Subject: [PATCH 28/45] validation namespace & version changes and gradle scope changes --- tds-platform/build.gradle | 6 +++--- tds/build.gradle | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tds-platform/build.gradle b/tds-platform/build.gradle index 5842b2e75f..b0200edb7a 100644 --- a/tds-platform/build.gradle +++ b/tds-platform/build.gradle @@ -83,11 +83,11 @@ dependencies { api 'org.json:json:20230227' api 'com.coverity.security:coverity-escapers:1.1.1' api 'org.thymeleaf:thymeleaf-spring5:3.0.15.RELEASE' - api 'javax.validation:validation-api:2.0.1.Final' + api 'jakarta.validation:jakarta.validation-api:3.0.2' api "org.hibernate.validator:hibernate-validator:${depVersion.hibernateValidator}" api "org.hibernate.validator:hibernate-validator-annotation-processor:${depVersion.hibernateValidator}" - api 'javax.el:javax.el-api:3.0.0' - api 'org.glassfish:javax.el:3.0.0' + api 'javax.el:javax.el-api:3.0.1-b06' + api 'org.glassfish:jakarta.el:5.0.0-M1' // waterml stuff api 'org.apache.xmlbeans:xmlbeans' diff --git a/tds/build.gradle b/tds/build.gradle index 8873692f61..a3a79b276e 100644 --- a/tds/build.gradle +++ b/tds/build.gradle @@ -85,10 +85,10 @@ dependencies { 'org.json:json' // JSR 303 with Hibernate Validator, which is dragging in jboss logging - compile 'javax.validation:validation-api' - runtime 'org.hibernate.validator:hibernate-validator' + compile 'jakarta.validation:jakarta.validation-api' + compile 'org.hibernate.validator:hibernate-validator' runtime 'javax.el:javax.el-api' - runtime 'org.glassfish:javax.el' + compile 'org.glassfish:jakarta.el' annotationProcessor "org.hibernate.validator:hibernate-validator-annotation-processor:${depVersion.hibernateValidator}" // @Resource annotation (removed post Java 8) From e10d002c21817b730f485c71f92386ba688a34dc Mon Sep 17 00:00:00 2001 From: Jennifer Oxelson Date: Fri, 19 May 2023 10:50:57 -0600 Subject: [PATCH 29/45] ValidatorFactory creation now using ParameterMessageInterpolator due to validation namespace changes --- .../thredds/public/testdata/testUpdate.nc | Bin 0 -> 5280 bytes .../server/ncss/validation/TestNcssParams.java | 14 +++++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 tds/src/test/content/thredds/public/testdata/testUpdate.nc diff --git a/tds/src/test/content/thredds/public/testdata/testUpdate.nc b/tds/src/test/content/thredds/public/testdata/testUpdate.nc new file mode 100644 index 0000000000000000000000000000000000000000..dcdb11f1c94a7b6ea5093304891988baca3bbdba GIT binary patch literal 5280 zcmeH~KTK0m6vi)wk}9Abh+%MeF~+c%6hUK*k&}qVk)ea2!AIaJPoXq@uZqOs4GwIy zwu55_2L=X4#|{n-4h#;C9UUAP92`C8p6~jHP#B0bF}>vVch9}&e)pVv&uhx;3vzETPJg(Kgf?= zS1yEc#0EFfJQoEEkr#!9g}@uT%zs`kcO#dx^AaO#^@-(T5)D}=dcyQRz5bOT4obQ~ zrnnk~arpdK{N*CA(A+)NCGNYtMOU77aSkm8Pf9@$Ju0l0;w5(ECh?83j?Z*wDH_t+ z=?prZU_Of3Pc%kYV}rT>Oyw@x=^S-#8P;s@`akbX?(?|kCc0a!lYU%YUY_6%H_??l zmiut|bJsS`ueZrAJ8bp82;-$$EgH8*c)%L7XG}(J%dW})UL$AHW}lvxF{gZ<&&WRc zF}suK%bIrk@GCGt;v@NtbBEg@xyT*^@7X6kJ62fDi?{k8qCfPOebRaMpSA8*Ut&5a zZ;t0omgiDermSgdBxl+PR+u$#(d z$ClbF7KRFro{kqtS!#m2U`rYKU=d7|v4x>H3)=%5;11YSmI<5&edQ*B_dv{VR$$9( z!}q<}09)W!a8Fs$LZixg*d9orUNlv(Pc^6GRV^5*UWa`j)QhF64?6*0gB#!$xDD=r zyWnT=i}Fnq`~ZFgzk=UDuP;_q*V>Z)V;cE7K*?jj#7f{8M=IQI9Isu*+9_1vj_ zsascCKi#_0bC}Rdq+|ZR>Qp^o DztK?& literal 0 HcmV?d00001 diff --git a/tds/src/test/java/thredds/server/ncss/validation/TestNcssParams.java b/tds/src/test/java/thredds/server/ncss/validation/TestNcssParams.java index a257075bc0..ccbe60ad42 100644 --- a/tds/src/test/java/thredds/server/ncss/validation/TestNcssParams.java +++ b/tds/src/test/java/thredds/server/ncss/validation/TestNcssParams.java @@ -7,10 +7,11 @@ import java.io.InputStream; import java.lang.invoke.MethodHandles; import java.util.*; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; +import org.hibernate.validator.messageinterpolation.ParameterMessageInterpolator; import org.junit.BeforeClass; import org.junit.Test; import org.slf4j.Logger; @@ -25,7 +26,10 @@ public class TestNcssParams { @BeforeClass public static void setUp() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); + ValidatorFactory factory = Validation.byDefaultProvider() + .configure() + .messageInterpolator(new ParameterMessageInterpolator()) + .buildValidatorFactory(); validator = factory.getValidator(); Class c = NcssGridParamsBean.class; From ed74a943c59cf767ad0a9497e601e7e08c6eca39 Mon Sep 17 00:00:00 2001 From: Jennifer Oxelson Date: Fri, 19 May 2023 11:02:29 -0600 Subject: [PATCH 30/45] spotlessApply --- .../ncss/validation/PointHorizSubsetTypeValidator.java | 3 ++- .../java/thredds/server/ncss/validation/TestNcssParams.java | 6 ++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/tds/src/main/java/thredds/server/ncss/validation/PointHorizSubsetTypeValidator.java b/tds/src/main/java/thredds/server/ncss/validation/PointHorizSubsetTypeValidator.java index 16796d1e99..ef870de7a8 100644 --- a/tds/src/main/java/thredds/server/ncss/validation/PointHorizSubsetTypeValidator.java +++ b/tds/src/main/java/thredds/server/ncss/validation/PointHorizSubsetTypeValidator.java @@ -29,7 +29,8 @@ public void initialize(PointHorizSubsetTypeConstraint arg0) { /* * (non-Javadoc) * - * @see jakarta.validation.ConstraintValidator#isValid(java.lang.Object, jakarta.validation.ConstraintValidatorContext) + * @see jakarta.validation.ConstraintValidator#isValid(java.lang.Object, + * jakarta.validation.ConstraintValidatorContext) */ @Override public boolean isValid(NcssPointParamsBean params, ConstraintValidatorContext constraintValidatorContext) { diff --git a/tds/src/test/java/thredds/server/ncss/validation/TestNcssParams.java b/tds/src/test/java/thredds/server/ncss/validation/TestNcssParams.java index ccbe60ad42..9c9f653de3 100644 --- a/tds/src/test/java/thredds/server/ncss/validation/TestNcssParams.java +++ b/tds/src/test/java/thredds/server/ncss/validation/TestNcssParams.java @@ -26,10 +26,8 @@ public class TestNcssParams { @BeforeClass public static void setUp() { - ValidatorFactory factory = Validation.byDefaultProvider() - .configure() - .messageInterpolator(new ParameterMessageInterpolator()) - .buildValidatorFactory(); + ValidatorFactory factory = Validation.byDefaultProvider().configure() + .messageInterpolator(new ParameterMessageInterpolator()).buildValidatorFactory(); validator = factory.getValidator(); Class c = NcssGridParamsBean.class; From e3ac575fa59376ab756741f5879f6856f20f0810 Mon Sep 17 00:00:00 2001 From: Jennifer Oxelson Date: Mon, 22 May 2023 16:32:38 -0600 Subject: [PATCH 31/45] Delete testUpdate.nc --- .../thredds/public/testdata/testUpdate.nc | Bin 5280 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tds/src/test/content/thredds/public/testdata/testUpdate.nc diff --git a/tds/src/test/content/thredds/public/testdata/testUpdate.nc b/tds/src/test/content/thredds/public/testdata/testUpdate.nc deleted file mode 100644 index dcdb11f1c94a7b6ea5093304891988baca3bbdba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5280 zcmeH~KTK0m6vi)wk}9Abh+%MeF~+c%6hUK*k&}qVk)ea2!AIaJPoXq@uZqOs4GwIy zwu55_2L=X4#|{n-4h#;C9UUAP92`C8p6~jHP#B0bF}>vVch9}&e)pVv&uhx;3vzETPJg(Kgf?= zS1yEc#0EFfJQoEEkr#!9g}@uT%zs`kcO#dx^AaO#^@-(T5)D}=dcyQRz5bOT4obQ~ zrnnk~arpdK{N*CA(A+)NCGNYtMOU77aSkm8Pf9@$Ju0l0;w5(ECh?83j?Z*wDH_t+ z=?prZU_Of3Pc%kYV}rT>Oyw@x=^S-#8P;s@`akbX?(?|kCc0a!lYU%YUY_6%H_??l zmiut|bJsS`ueZrAJ8bp82;-$$EgH8*c)%L7XG}(J%dW})UL$AHW}lvxF{gZ<&&WRc zF}suK%bIrk@GCGt;v@NtbBEg@xyT*^@7X6kJ62fDi?{k8qCfPOebRaMpSA8*Ut&5a zZ;t0omgiDermSgdBxl+PR+u$#(d z$ClbF7KRFro{kqtS!#m2U`rYKU=d7|v4x>H3)=%5;11YSmI<5&edQ*B_dv{VR$$9( z!}q<}09)W!a8Fs$LZixg*d9orUNlv(Pc^6GRV^5*UWa`j)QhF64?6*0gB#!$xDD=r zyWnT=i}Fnq`~ZFgzk=UDuP;_q*V>Z)V;cE7K*?jj#7f{8M=IQI9Isu*+9_1vj_ zsascCKi#_0bC}Rdq+|ZR>Qp^o DztK?& From e0bb358f6aba922531f3f89703c57ddc06f3ba19 Mon Sep 17 00:00:00 2001 From: Tara Drwenski Date: Fri, 2 Jun 2023 10:04:29 -0600 Subject: [PATCH 32/45] Remove enable asserts from JAVA_OPTS in docs as this can be bad for performance --- .../src/site/pages/installation_upgrade/JVMSettings.md | 2 +- .../site/pages/tds_tutorial/getting_started/RunningTomcat.md | 4 ++-- .../site/pages/tds_tutorial/getting_started/RunningTomcat.md | 4 ++-- .../site/pages/tds_tutorial/getting_started/RunningTomcat.md | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/adminguide/src/site/pages/installation_upgrade/JVMSettings.md b/docs/adminguide/src/site/pages/installation_upgrade/JVMSettings.md index ca1de6ea34..83e927cb66 100644 --- a/docs/adminguide/src/site/pages/installation_upgrade/JVMSettings.md +++ b/docs/adminguide/src/site/pages/installation_upgrade/JVMSettings.md @@ -50,7 +50,7 @@ JAVA_PREFS_ROOTS="-Djava.util.prefs.systemRoot=$CONTENT_ROOT/thredds/javaUtilPre # # Some commonly used JAVA_OPTS settings: # -NORMAL="-d64 -Xmx4096m -Xms512m -server -ea" +NORMAL="-d64 -Xmx4096m -Xms512m -server" HEAP_DUMP="-XX:+HeapDumpOnOutOfMemoryError" HEADLESS="-Djava.awt.headless=true" diff --git a/docs/devguide/src/site/pages/tds_tutorial/getting_started/RunningTomcat.md b/docs/devguide/src/site/pages/tds_tutorial/getting_started/RunningTomcat.md index 96b91e3361..9007bac77f 100644 --- a/docs/devguide/src/site/pages/tds_tutorial/getting_started/RunningTomcat.md +++ b/docs/devguide/src/site/pages/tds_tutorial/getting_started/RunningTomcat.md @@ -124,7 +124,7 @@ If you're running Tomcat on an instance of Windows OS, you will want to create a # # Some commonly used JAVA_OPTS settings: # - NORMAL="-d64 -Xmx4096m -Xms512m -server -ea" + NORMAL="-d64 -Xmx4096m -Xms512m -server" HEAP_DUMP="-XX:+HeapDumpOnOutOfMemoryError" HEADLESS="-Djava.awt.headless=true" @@ -180,7 +180,7 @@ If you're running Tomcat on an instance of Windows OS, you will want to create a ~~~bash # ps -ef | grep tomcat - root 7988 1 13 14:17 pts/2 00:00:05 /usr/local/jdk/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dtds.content.root.path=/data/content -d64 -Xmx4096m -Xms512m -server -ea -XX:+HeapDumpOnOutOfMemoryError -Djava.awt.headless=true -Djava.util.prefs.systemRoot=/usr/local/tomcat/content/thredds/javaUtilPrefs -Djava.util.prefs.userRoot=/usr/local/tomcat/content/thredds/javaUtilPrefs -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start + root 7988 1 13 14:17 pts/2 00:00:05 /usr/local/jdk/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dtds.content.root.path=/data/content -d64 -Xmx4096m -Xms512m -server -XX:+HeapDumpOnOutOfMemoryError -Djava.awt.headless=true -Djava.util.prefs.systemRoot=/usr/local/tomcat/content/thredds/javaUtilPrefs -Djava.util.prefs.userRoot=/usr/local/tomcat/content/thredds/javaUtilPrefs -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start root 8279 23720 0 14:18 pts/2 00:00:00 grep tomcat ~~~ diff --git a/docs/quickstart/src/site/pages/tds_tutorial/getting_started/RunningTomcat.md b/docs/quickstart/src/site/pages/tds_tutorial/getting_started/RunningTomcat.md index 68ed8185fa..ddb07c11aa 100644 --- a/docs/quickstart/src/site/pages/tds_tutorial/getting_started/RunningTomcat.md +++ b/docs/quickstart/src/site/pages/tds_tutorial/getting_started/RunningTomcat.md @@ -124,7 +124,7 @@ If you're running Tomcat on an instance of Windows OS, you will want to create a # # Some commonly used JAVA_OPTS settings: # - NORMAL="-d64 -Xmx4096m -Xms512m -server -ea" + NORMAL="-d64 -Xmx4096m -Xms512m -server" HEAP_DUMP="-XX:+HeapDumpOnOutOfMemoryError" HEADLESS="-Djava.awt.headless=true" @@ -180,7 +180,7 @@ If you're running Tomcat on an instance of Windows OS, you will want to create a ~~~bash # ps -ef | grep tomcat - root 7988 1 13 14:17 pts/2 00:00:05 /usr/local/jdk/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dtds.content.root.path=/data/content -d64 -Xmx4096m -Xms512m -server -ea -XX:+HeapDumpOnOutOfMemoryError -Djava.awt.headless=true -Djava.util.prefs.systemRoot=/usr/local/tomcat/content/thredds/javaUtilPrefs -Djava.util.prefs.userRoot=/usr/local/tomcat/content/thredds/javaUtilPrefs -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start + root 7988 1 13 14:17 pts/2 00:00:05 /usr/local/jdk/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dtds.content.root.path=/data/content -d64 -Xmx4096m -Xms512m -server -XX:+HeapDumpOnOutOfMemoryError -Djava.awt.headless=true -Djava.util.prefs.systemRoot=/usr/local/tomcat/content/thredds/javaUtilPrefs -Djava.util.prefs.userRoot=/usr/local/tomcat/content/thredds/javaUtilPrefs -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start root 8279 23720 0 14:18 pts/2 00:00:00 grep tomcat ~~~ diff --git a/docs/userguide/src/site/pages/tds_tutorial/getting_started/RunningTomcat.md b/docs/userguide/src/site/pages/tds_tutorial/getting_started/RunningTomcat.md index 22e3b99b64..91813af5b2 100644 --- a/docs/userguide/src/site/pages/tds_tutorial/getting_started/RunningTomcat.md +++ b/docs/userguide/src/site/pages/tds_tutorial/getting_started/RunningTomcat.md @@ -124,7 +124,7 @@ If you're running Tomcat on an instance of Windows OS, you will want to create a # # Some commonly used JAVA_OPTS settings: # - NORMAL="-d64 -Xmx4096m -Xms512m -server -ea" + NORMAL="-d64 -Xmx4096m -Xms512m -server" HEAP_DUMP="-XX:+HeapDumpOnOutOfMemoryError" HEADLESS="-Djava.awt.headless=true" @@ -180,7 +180,7 @@ If you're running Tomcat on an instance of Windows OS, you will want to create a ~~~bash # ps -ef | grep tomcat - root 7988 1 13 14:17 pts/2 00:00:05 /usr/local/jdk/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dtds.content.root.path=/usr/local/tomcat/content -d64 -Xmx4096m -Xms512m -server -ea -XX:+HeapDumpOnOutOfMemoryError -Djava.awt.headless=true -Djava.util.prefs.systemRoot=/usr/local/tomcat/content/thredds/javaUtilPrefs -Djava.util.prefs.userRoot=/usr/local/tomcat/content/thredds/javaUtilPrefs -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start + root 7988 1 13 14:17 pts/2 00:00:05 /usr/local/jdk/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dtds.content.root.path=/usr/local/tomcat/content -d64 -Xmx4096m -Xms512m -server -XX:+HeapDumpOnOutOfMemoryError -Djava.awt.headless=true -Djava.util.prefs.systemRoot=/usr/local/tomcat/content/thredds/javaUtilPrefs -Djava.util.prefs.userRoot=/usr/local/tomcat/content/thredds/javaUtilPrefs -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start root 8279 23720 0 14:18 pts/2 00:00:00 grep tomcat ~~~ From e5e9116f8aae38c4094d43dbbecb68aa871b84b2 Mon Sep 17 00:00:00 2001 From: haileyajohnson Date: Wed, 7 Jun 2023 12:50:01 -0700 Subject: [PATCH 33/45] update gradlke to reference new combined dap4 module in ncj --- dap4/d4servlet/build.gradle | 3 +-- dap4/d4tests/build.gradle | 4 +--- dap4/d4ts/build.gradle | 3 +-- tds-platform/build.gradle | 4 +--- tds/build.gradle | 4 +--- 5 files changed, 5 insertions(+), 13 deletions(-) diff --git a/dap4/d4servlet/build.gradle b/dap4/d4servlet/build.gradle index bd234585d3..7d1347f794 100644 --- a/dap4/d4servlet/build.gradle +++ b/dap4/d4servlet/build.gradle @@ -4,8 +4,7 @@ apply from: "$rootDir/gradle/any/java-published.gradle" dependencies { implementation enforcedPlatform(project(':tds-platform')) - compile 'edu.ucar:d4core' - compile 'edu.ucar:d4lib' + compile 'edu.ucar:dap4' compile 'edu.ucar:httpservices' compileOnly 'javax.servlet:javax.servlet-api' diff --git a/dap4/d4tests/build.gradle b/dap4/d4tests/build.gradle index 68baaaa3ab..52dcd0b15a 100644 --- a/dap4/d4tests/build.gradle +++ b/dap4/d4tests/build.gradle @@ -6,15 +6,13 @@ dependencies { compile enforcedPlatform(project(':tds-testing-platform')) // A lot of these dependencies should be in the testRuntime config, not testCompile. - testCompile 'edu.ucar:d4core' - testCompile 'edu.ucar:d4lib' + testCompile 'edu.ucar:dap4' testCompile project(':dap4:dap4-servlet') testCompile(project(':dap4:d4ts')) { exclude group: 'org.apache.logging.log4j' } - testCompile 'edu.ucar:d4cdm' testCompile 'edu.ucar:cdm-core' testCompile 'edu.ucar:httpservices' diff --git a/dap4/d4ts/build.gradle b/dap4/d4ts/build.gradle index 2220674663..e62ecd8fc1 100644 --- a/dap4/d4ts/build.gradle +++ b/dap4/d4ts/build.gradle @@ -5,8 +5,7 @@ apply from: "$rootDir/gradle/any/gretty.gradle" dependencies { compile enforcedPlatform(project(':tds-platform')) - compile 'edu.ucar:d4core' - compile 'edu.ucar:d4lib' + compile 'edu.ucar:dap4' compile project(":dap4:dap4-servlet") providedCompile "javax.servlet:javax.servlet-api:${depVersion.javaxServletApi}" diff --git a/tds-platform/build.gradle b/tds-platform/build.gradle index b0200edb7a..225c25fe6c 100644 --- a/tds-platform/build.gradle +++ b/tds-platform/build.gradle @@ -73,9 +73,7 @@ dependencies { runtime 'org.apache.taglibs:taglibs-standard-impl:1.2.5' // dap4 - api 'edu.ucar:d4core' - api 'edu.ucar:d4lib' - api 'edu.ucar:d4cdm' + api 'edu.ucar:dap4' // defined in tds-testing-platform as well, but using api config runtime 'org.apache.logging.log4j:log4j-web' diff --git a/tds/build.gradle b/tds/build.gradle index a3a79b276e..2751cf7600 100644 --- a/tds/build.gradle +++ b/tds/build.gradle @@ -30,9 +30,7 @@ dependencies { implementation project(':tds-ugrid') // DAP4 Dependencies (technically forward) - compile 'edu.ucar:d4cdm' - compile 'edu.ucar:d4core' - compile 'edu.ucar:d4lib' + compile 'edu.ucar:dap4' compile project(':dap4:dap4-servlet') From 1d5fe7ec9140e408eeb4c31b95ad2efd8fbb294d Mon Sep 17 00:00:00 2001 From: haileyajohnson Date: Wed, 7 Jun 2023 13:24:05 -0700 Subject: [PATCH 34/45] more fixes to ignore dap4 for now --- dap4/build.gradle | 2 + .../main/java/dap4/servlet/DSPFactory.java | 7 - settings.gradle | 8 +- tds/build.gradle | 4 +- .../thredds/server/dap4/Dap4Controller.java | 56 ++++---- .../java/thredds/server/dap4/ThreddsDSP.java | 134 +++++++++--------- 6 files changed, 103 insertions(+), 108 deletions(-) diff --git a/dap4/build.gradle b/dap4/build.gradle index fd4e9da1d7..b3551bfbf9 100644 --- a/dap4/build.gradle +++ b/dap4/build.gradle @@ -20,3 +20,5 @@ subprojects { // TODO: Give the subprojects real titles. ext.title = "DAP4: $name" } + + diff --git a/dap4/d4servlet/src/main/java/dap4/servlet/DSPFactory.java b/dap4/d4servlet/src/main/java/dap4/servlet/DSPFactory.java index 227dcd8432..e58e3ecd43 100644 --- a/dap4/d4servlet/src/main/java/dap4/servlet/DSPFactory.java +++ b/dap4/d4servlet/src/main/java/dap4/servlet/DSPFactory.java @@ -5,13 +5,6 @@ package dap4.servlet; -import dap4.core.data.DSP; -import dap4.core.util.DapContext; -import dap4.core.util.DapException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; - /** * Provide a factory for DSP instances */ diff --git a/settings.gradle b/settings.gradle index 464180fba6..8e620f54e8 100644 --- a/settings.gradle +++ b/settings.gradle @@ -2,9 +2,9 @@ rootProject.name = 'thredds-data-server' // These all refer to subdirectory names. -include 'dap4:d4servlet' -include 'dap4:d4ts' -include 'dap4:d4tests' +//include 'dap4:d4servlet' +//include 'dap4:d4ts' +//include 'dap4:d4tests' include 'docs' include 'opendap:dtswar' include 'opendap:server' @@ -21,4 +21,4 @@ include 'tds-ui' // Set name of the opendap servlet artifact project(':opendap:server').name = 'opendap-servlet' -project(':dap4:d4servlet').name = 'dap4-servlet' +//project(':dap4:d4servlet').name = 'dap4-servlet' diff --git a/tds/build.gradle b/tds/build.gradle index 2751cf7600..46c4868f68 100644 --- a/tds/build.gradle +++ b/tds/build.gradle @@ -31,8 +31,8 @@ dependencies { // DAP4 Dependencies (technically forward) compile 'edu.ucar:dap4' - - compile project(':dap4:dap4-servlet') +// +// compile project(':dap4:dap4-servlet') // Server stuff providedCompile "javax.servlet:javax.servlet-api:${depVersion.javaxServletApi}" diff --git a/tds/src/main/java/thredds/server/dap4/Dap4Controller.java b/tds/src/main/java/thredds/server/dap4/Dap4Controller.java index fbe4b0dc58..1f03899281 100644 --- a/tds/src/main/java/thredds/server/dap4/Dap4Controller.java +++ b/tds/src/main/java/thredds/server/dap4/Dap4Controller.java @@ -5,7 +5,7 @@ package thredds.server.dap4; -import dap4.core.data.DSPRegistry; +//import dap4.core.data.DSPRegistry; import dap4.core.util.DapContext; import dap4.core.util.DapException; import dap4.core.util.DapUtil; @@ -29,33 +29,33 @@ @RequestMapping("/dap4") public class Dap4Controller extends DapController { - ////////////////////////////////////////////////// - // Constants - - static final boolean DEBUG = false; - - static final boolean PARSEDEBUG = false; - - // NetcdfDataset enhancement to use: need only coord systems - // static Set ENHANCEMENT = EnumSet.of(NetcdfDataset.Enhance.CoordSystems); - - ////////////////////////////////////////////////// - // Type Decls - - static class Dap4Factory extends DSPFactory { - - public Dap4Factory() { - // For TDS, we only need to register one DSP type: ThreddsDSP. - // This is because we will always serve only NetcdfFile objects. - // See D4TSServlet for a multiple registration case. - DapCache.dspregistry.register(ThreddsDSP.class, DSPRegistry.LAST); - } - - } - - static { - DapCache.setFactory(new Dap4Factory()); - } +// ////////////////////////////////////////////////// +// // Constants +// +// static final boolean DEBUG = false; +// +// static final boolean PARSEDEBUG = false; +// +// // NetcdfDataset enhancement to use: need only coord systems +// // static Set ENHANCEMENT = EnumSet.of(NetcdfDataset.Enhance.CoordSystems); +// +// ////////////////////////////////////////////////// +// // Type Decls +// +// static class Dap4Factory extends DSPFactory { +// +// public Dap4Factory() { +// // For TDS, we only need to register one DSP type: ThreddsDSP. +// // This is because we will always serve only NetcdfFile objects. +// // See D4TSServlet for a multiple registration case. +// DapCache.dspregistry.register(ThreddsDSP.class, DSPRegistry.LAST); +// } +// +// } +// +// static { +// DapCache.setFactory(new Dap4Factory()); +// } ////////////////////////////////////////////////// // Spring Elements diff --git a/tds/src/main/java/thredds/server/dap4/ThreddsDSP.java b/tds/src/main/java/thredds/server/dap4/ThreddsDSP.java index 2c2cd32a68..cbf0a5bfdd 100644 --- a/tds/src/main/java/thredds/server/dap4/ThreddsDSP.java +++ b/tds/src/main/java/thredds/server/dap4/ThreddsDSP.java @@ -1,67 +1,67 @@ -/* - * Copyright 1998-2015 the University Corporation for Atmospheric Research/Unidata - * - * Portions of this software were developed by the Unidata Program at the - * University Corporation for Atmospheric Research. - * - * Access and use of this software shall impose the following obligations - * and understandings on the user. The user is granted the right, without - * any fee or cost, to use, copy, modify, alter, enhance and distribute - * this software, and any derivative works thereof, and its supporting - * documentation for any purpose whatsoever, provided that this entire - * notice appears in all copies of the software, derivative works and - * supporting documentation. Further, UCAR requests that the user credit - * UCAR/Unidata in any publications that result from the use of this - * software or in any product that includes this software. The names UCAR - * and/or Unidata, however, may not be used in any advertising or publicity - * to endorse or promote any products or commercial entity unless specific - * written permission is obtained from UCAR/Unidata. The user also - * understands that UCAR/Unidata is not obligated to provide the user with - * any support, consulting, training or assistance of any kind with regard - * to the use, operation and performance of this software nor to provide - * the user with any updates, revisions, new versions or "bug fixes." - * - * THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "AS IS" AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL UCAR/UNIDATA BE LIABLE FOR ANY SPECIAL, - * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING - * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION - * WITH THE ACCESS, USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -package thredds.server.dap4; - -import dap4.cdm.dsp.CDMDSP; -import dap4.core.util.DapContext; -import dap4.core.util.DapException; -import dap4.core.util.DapUtil; -import dap4.dap4lib.DapCodes; -import thredds.core.TdsRequestedDataset; -import ucar.nc2.NetcdfFile; -import java.io.File; - -/** - * CDM->DAP DSP - * Used (for now) only on server side. - */ - -public class ThreddsDSP extends CDMDSP { - - - ////////////////////////////////////////////////// - // Instance variables - - ////////////////////////////////////////////////// - // Constructor(s) - - public ThreddsDSP() {} - - public ThreddsDSP(String path) throws DapException { - super(path); - } - - ////////////////////////////////////////////////// - -} +///* +// * Copyright 1998-2015 the University Corporation for Atmospheric Research/Unidata +// * +// * Portions of this software were developed by the Unidata Program at the +// * University Corporation for Atmospheric Research. +// * +// * Access and use of this software shall impose the following obligations +// * and understandings on the user. The user is granted the right, without +// * any fee or cost, to use, copy, modify, alter, enhance and distribute +// * this software, and any derivative works thereof, and its supporting +// * documentation for any purpose whatsoever, provided that this entire +// * notice appears in all copies of the software, derivative works and +// * supporting documentation. Further, UCAR requests that the user credit +// * UCAR/Unidata in any publications that result from the use of this +// * software or in any product that includes this software. The names UCAR +// * and/or Unidata, however, may not be used in any advertising or publicity +// * to endorse or promote any products or commercial entity unless specific +// * written permission is obtained from UCAR/Unidata. The user also +// * understands that UCAR/Unidata is not obligated to provide the user with +// * any support, consulting, training or assistance of any kind with regard +// * to the use, operation and performance of this software nor to provide +// * the user with any updates, revisions, new versions or "bug fixes." +// * +// * THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "AS IS" AND ANY EXPRESS OR +// * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// * DISCLAIMED. IN NO EVENT SHALL UCAR/UNIDATA BE LIABLE FOR ANY SPECIAL, +// * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING +// * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +// * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +// * WITH THE ACCESS, USE OR PERFORMANCE OF THIS SOFTWARE. +// */ +// +//package thredds.server.dap4; +// +//import dap4.cdm.dsp.CDMDSP; +//import dap4.core.util.DapContext; +//import dap4.core.util.DapException; +//import dap4.core.util.DapUtil; +//import dap4.dap4lib.DapCodes; +//import thredds.core.TdsRequestedDataset; +//import ucar.nc2.NetcdfFile; +//import java.io.File; +// +///** +// * CDM->DAP DSP +// * Used (for now) only on server side. +// */ +// +//public class ThreddsDSP extends CDMDSP { +// +// +// ////////////////////////////////////////////////// +// // Instance variables +// +// ////////////////////////////////////////////////// +// // Constructor(s) +// +// public ThreddsDSP() {} +// +// public ThreddsDSP(String path) throws DapException { +// super(path); +// } +// +// ////////////////////////////////////////////////// +// +//} From 2f9ab5d6f55c58754992fed91b5f8820c04d0e26 Mon Sep 17 00:00:00 2001 From: haileyajohnson Date: Wed, 7 Jun 2023 13:26:45 -0700 Subject: [PATCH 35/45] spotless --- dap4/build.gradle | 2 - .../thredds/server/dap4/Dap4Controller.java | 208 +++++++++--------- .../java/thredds/server/dap4/ThreddsDSP.java | 44 ++-- 3 files changed, 126 insertions(+), 128 deletions(-) diff --git a/dap4/build.gradle b/dap4/build.gradle index b3551bfbf9..fd4e9da1d7 100644 --- a/dap4/build.gradle +++ b/dap4/build.gradle @@ -20,5 +20,3 @@ subprojects { // TODO: Give the subprojects real titles. ext.title = "DAP4: $name" } - - diff --git a/tds/src/main/java/thredds/server/dap4/Dap4Controller.java b/tds/src/main/java/thredds/server/dap4/Dap4Controller.java index 1f03899281..f601401c00 100644 --- a/tds/src/main/java/thredds/server/dap4/Dap4Controller.java +++ b/tds/src/main/java/thredds/server/dap4/Dap4Controller.java @@ -5,16 +5,16 @@ package thredds.server.dap4; -//import dap4.core.data.DSPRegistry; -import dap4.core.util.DapContext; -import dap4.core.util.DapException; -import dap4.core.util.DapUtil; -import dap4.dap4lib.DapCodes; -import dap4.dap4lib.DapLog; -import dap4.servlet.DSPFactory; -import dap4.servlet.DapCache; -import dap4.servlet.DapController; -import dap4.servlet.DapRequest; +// import dap4.core.data.DSPRegistry; +// import dap4.core.util.DapContext; +// import dap4.core.util.DapException; +// import dap4.core.util.DapUtil; +// import dap4.dap4lib.DapCodes; +// import dap4.dap4lib.DapLog; +// import dap4.servlet.DSPFactory; +// import dap4.servlet.DapCache; +// import dap4.servlet.DapController; +// import dap4.servlet.DapRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @@ -27,35 +27,35 @@ @Controller @RequestMapping("/dap4") -public class Dap4Controller extends DapController { - -// ////////////////////////////////////////////////// -// // Constants -// -// static final boolean DEBUG = false; -// -// static final boolean PARSEDEBUG = false; -// -// // NetcdfDataset enhancement to use: need only coord systems -// // static Set ENHANCEMENT = EnumSet.of(NetcdfDataset.Enhance.CoordSystems); -// -// ////////////////////////////////////////////////// -// // Type Decls -// -// static class Dap4Factory extends DSPFactory { -// -// public Dap4Factory() { -// // For TDS, we only need to register one DSP type: ThreddsDSP. -// // This is because we will always serve only NetcdfFile objects. -// // See D4TSServlet for a multiple registration case. -// DapCache.dspregistry.register(ThreddsDSP.class, DSPRegistry.LAST); -// } -// -// } -// -// static { -// DapCache.setFactory(new Dap4Factory()); -// } +public class Dap4Controller { + + // ////////////////////////////////////////////////// + // // Constants + // + // static final boolean DEBUG = false; + // + // static final boolean PARSEDEBUG = false; + // + // // NetcdfDataset enhancement to use: need only coord systems + // // static Set ENHANCEMENT = EnumSet.of(NetcdfDataset.Enhance.CoordSystems); + // + // ////////////////////////////////////////////////// + // // Type Decls + // + // static class Dap4Factory extends DSPFactory { + // + // public Dap4Factory() { + // // For TDS, we only need to register one DSP type: ThreddsDSP. + // // This is because we will always serve only NetcdfFile objects. + // // See D4TSServlet for a multiple registration case. + // DapCache.dspregistry.register(ThreddsDSP.class, DSPRegistry.LAST); + // } + // + // } + // + // static { + // DapCache.setFactory(new Dap4Factory()); + // } ////////////////////////////////////////////////// // Spring Elements @@ -69,71 +69,71 @@ public void handleRequest(HttpServletRequest req, HttpServletResponse res) throw // super.handleRequest(req, res); } - ////////////////////////////////////////////////// - // Constructor(s) - - public Dap4Controller() { - super(); - } - - ////////////////////////////////////////////////////////// - - @Override - protected void doFavicon(String icopath, DapContext cxt) throws IOException { - throw new UnsupportedOperationException("Favicon"); - } - - @Override - protected void doCapabilities(DapRequest drq, DapContext cxt) throws IOException { - addCommonHeaders(drq); - OutputStream out = drq.getOutputStream(); - PrintWriter pw = new PrintWriter(new OutputStreamWriter(out, DapUtil.UTF8)); - pw.println("Capabilities page not supported"); - pw.flush(); - } - - @Override - public long getBinaryWriteLimit() { - return DEFAULTBINARYWRITELIMIT; - } - - @Override - public String getServletID() { - return "dap4"; - } - - // There is a problem Spring under intellij when using mocking. - // See TestServlet for more info. In any case, if autowiring does - // not work, then TdsRequestedDataset.getLocationFromRequestPath - // will fail because it internal DatasetManager value will be null. - // Autowiring would have set it to non-null. So, check to see if - // the autowiring worked and if so use - // TdsRequestedDataset.getLocationFromRequestPath. - // Otherwise, compute the proper path from the drq.getResourceRoot. - // This is completely a hack until such time as we can get things - // to work under Intellij. - @Override - public String getResourcePath(DapRequest drq, String location) throws DapException { - String realpath; - if (TdsRequestedDataset.getDatasetManager() != null) { - realpath = TdsRequestedDataset.getLocationFromRequestPath(location); - } else { - assert TdsRequestedDataset.getDatasetManager() == null; - String prefix = drq.getResourceRoot(); - assert (prefix != null); - realpath = DapUtil.canonjoin(prefix, location); - } - - if (!TESTING) { - if (!TdsRequestedDataset.resourceControlOk(drq.getRequest(), drq.getResponse(), realpath)) - throw new DapException("Not authorized: " + location).setCode(DapCodes.SC_FORBIDDEN); - } - File f = new File(realpath); - if (!f.exists() || !f.canRead()) - throw new DapException("Not found: " + location).setCode(DapCodes.SC_NOT_FOUND); - // ncfile = TdsRequestedDataset.getNetcdfFile(this.request, this.response, path); - return realpath; - } + // ////////////////////////////////////////////////// + // // Constructor(s) + // + // public Dap4Controller() { + // super(); + // } + // + // ////////////////////////////////////////////////////////// + // + // @Override + // protected void doFavicon(String icopath, DapContext cxt) throws IOException { + // throw new UnsupportedOperationException("Favicon"); + // } + // + // @Override + // protected void doCapabilities(DapRequest drq, DapContext cxt) throws IOException { + // addCommonHeaders(drq); + // OutputStream out = drq.getOutputStream(); + // PrintWriter pw = new PrintWriter(new OutputStreamWriter(out, DapUtil.UTF8)); + // pw.println("Capabilities page not supported"); + // pw.flush(); + // } + // + // @Override + // public long getBinaryWriteLimit() { + // return DEFAULTBINARYWRITELIMIT; + // } + // + // @Override + // public String getServletID() { + // return "dap4"; + // } + // + // // There is a problem Spring under intellij when using mocking. + // // See TestServlet for more info. In any case, if autowiring does + // // not work, then TdsRequestedDataset.getLocationFromRequestPath + // // will fail because it internal DatasetManager value will be null. + // // Autowiring would have set it to non-null. So, check to see if + // // the autowiring worked and if so use + // // TdsRequestedDataset.getLocationFromRequestPath. + // // Otherwise, compute the proper path from the drq.getResourceRoot. + // // This is completely a hack until such time as we can get things + // // to work under Intellij. + // @Override + // public String getResourcePath(DapRequest drq, String location) throws DapException { + // String realpath; + // if (TdsRequestedDataset.getDatasetManager() != null) { + // realpath = TdsRequestedDataset.getLocationFromRequestPath(location); + // } else { + // assert TdsRequestedDataset.getDatasetManager() == null; + // String prefix = drq.getResourceRoot(); + // assert (prefix != null); + // realpath = DapUtil.canonjoin(prefix, location); + // } + // + // if (!TESTING) { + // if (!TdsRequestedDataset.resourceControlOk(drq.getRequest(), drq.getResponse(), realpath)) + // throw new DapException("Not authorized: " + location).setCode(DapCodes.SC_FORBIDDEN); + // } + // File f = new File(realpath); + // if (!f.exists() || !f.canRead()) + // throw new DapException("Not found: " + location).setCode(DapCodes.SC_NOT_FOUND); + // // ncfile = TdsRequestedDataset.getNetcdfFile(this.request, this.response, path); + // return realpath; + // } } diff --git a/tds/src/main/java/thredds/server/dap4/ThreddsDSP.java b/tds/src/main/java/thredds/server/dap4/ThreddsDSP.java index cbf0a5bfdd..2fb74c0542 100644 --- a/tds/src/main/java/thredds/server/dap4/ThreddsDSP.java +++ b/tds/src/main/java/thredds/server/dap4/ThreddsDSP.java @@ -1,4 +1,4 @@ -///* +/// * // * Copyright 1998-2015 the University Corporation for Atmospheric Research/Unidata // * // * Portions of this software were developed by the Unidata Program at the @@ -31,37 +31,37 @@ // * WITH THE ACCESS, USE OR PERFORMANCE OF THIS SOFTWARE. // */ // -//package thredds.server.dap4; +// package thredds.server.dap4; // -//import dap4.cdm.dsp.CDMDSP; -//import dap4.core.util.DapContext; -//import dap4.core.util.DapException; -//import dap4.core.util.DapUtil; -//import dap4.dap4lib.DapCodes; -//import thredds.core.TdsRequestedDataset; -//import ucar.nc2.NetcdfFile; -//import java.io.File; +// import dap4.cdm.dsp.CDMDSP; +// import dap4.core.util.DapContext; +// import dap4.core.util.DapException; +// import dap4.core.util.DapUtil; +// import dap4.dap4lib.DapCodes; +// import thredds.core.TdsRequestedDataset; +// import ucar.nc2.NetcdfFile; +// import java.io.File; // -///** +/// ** // * CDM->DAP DSP // * Used (for now) only on server side. // */ // -//public class ThreddsDSP extends CDMDSP { +// public class ThreddsDSP extends CDMDSP { // // -// ////////////////////////////////////////////////// -// // Instance variables +// ////////////////////////////////////////////////// +// // Instance variables // -// ////////////////////////////////////////////////// -// // Constructor(s) +// ////////////////////////////////////////////////// +// // Constructor(s) // -// public ThreddsDSP() {} +// public ThreddsDSP() {} // -// public ThreddsDSP(String path) throws DapException { -// super(path); -// } +// public ThreddsDSP(String path) throws DapException { +// super(path); +// } // -// ////////////////////////////////////////////////// +// ////////////////////////////////////////////////// // -//} +// } From aabde1ff3a147a18de7c062128fded28ab8ae682 Mon Sep 17 00:00:00 2001 From: haileyajohnson Date: Wed, 7 Jun 2023 14:15:38 -0700 Subject: [PATCH 36/45] clean up test --- .../java/ucar/nc2/util/net/TestFormBuilder.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/tds/src/integrationTests/java/ucar/nc2/util/net/TestFormBuilder.java b/tds/src/integrationTests/java/ucar/nc2/util/net/TestFormBuilder.java index 212508bba6..ef54cfe686 100644 --- a/tds/src/integrationTests/java/ucar/nc2/util/net/TestFormBuilder.java +++ b/tds/src/integrationTests/java/ucar/nc2/util/net/TestFormBuilder.java @@ -73,16 +73,17 @@ public TestFormBuilder() { setSystemProperties(); // Turn on Session debugging HTTPSession.TESTING = true; - HTTPSession.setInterceptors(false); + HTTPIntercepts.setGlobalDebugInterceptors(true); } @Test public void testSimple() throws Exception { - HTTPSession.resetInterceptors(); + HTTPSession session = HTTPFactory.newSession(NULLURL); + session.resetInterceptors(); try { HTTPFormBuilder builder = buildForm(false); HttpEntity content = builder.build(); - try (HTTPMethod postMethod = HTTPFactory.Post(NULLURL)) { + try (HTTPMethod postMethod = HTTPFactory.Post(session)) { postMethod.setRequestContent(content); // Execute, but ignore any problems try { @@ -92,7 +93,7 @@ public void testSimple() throws Exception { } } // Get the request that was used - HTTPUtil.InterceptRequest dbgreq = HTTPSession.debugRequestInterceptor(); + HTTPIntercepts.DebugInterceptRequest dbgreq = session.getDebugRequestInterceptor(); Assert.assertTrue("Could not get debug request", dbgreq != null); HttpEntity entity = dbgreq.getRequestEntity(); Assert.assertTrue("Could not get debug entity", entity != null); @@ -123,11 +124,12 @@ public void testMultiPart() throws Exception { attach3file = HTTPUtil.fillTempFile("attach3.txt", ATTACHTEXT); attach3file.deleteOnExit(); - HTTPSession.resetInterceptors(); + HTTPSession session = HTTPFactory.newSession(NULLURL); + session.resetInterceptors(); try { HTTPFormBuilder builder = buildForm(true); HttpEntity content = builder.build(); - try (HTTPMethod postMethod = HTTPFactory.Post(NULLURL)) { + try (HTTPMethod postMethod = HTTPFactory.Post(session)) { postMethod.setRequestContent(content); // Execute, but ignore any problems try { @@ -137,7 +139,7 @@ public void testMultiPart() throws Exception { } } // Get the request that was used - HTTPUtil.InterceptRequest dbgreq = HTTPSession.debugRequestInterceptor(); + HTTPIntercepts.DebugInterceptRequest dbgreq = session.getDebugRequestInterceptor(); Assert.assertTrue("Could not get debug request", dbgreq != null); HttpEntity entity = dbgreq.getRequestEntity(); Assert.assertTrue("Could not get debug entity", entity != null); From e80caa24ff96a9dd48e76e3b43a4cb20d20535c8 Mon Sep 17 00:00:00 2001 From: haileyajohnson Date: Thu, 8 Jun 2023 13:56:53 -0700 Subject: [PATCH 37/45] merge with dap refactor --- dap4/d4servlet/build.gradle | 2 +- dap4/d4ts/build.gradle | 2 +- gradle/any/shared-mvn-coords.gradle | 6 +++--- opendap/dtswar/build.gradle | 2 +- opendap/server/build.gradle | 2 +- .../dependency-check-suppression.xml | 8 -------- tdcommon/build.gradle | 2 +- .../tracker/DatasetExtBytesMarshaller.java | 2 +- tds-platform/build.gradle | 11 ++++++----- tds/build.gradle | 10 +++++----- .../catalogservice/RemoteCatalogRequest.java | 2 +- .../RemoteCatalogServiceController.java | 2 +- .../server/cdmremote/CdmRemoteController.java | 2 +- .../server/metadata/MetadataController.java | 2 +- .../metadata/MetadataRequestParameterBean.java | 2 +- .../ncss/controller/NcssGridController.java | 2 +- .../ncss/controller/NcssPointController.java | 2 +- .../server/ncss/params/NcssParamsBean.java | 2 +- .../validation/NcssGridRequestConstraint.java | 4 ++-- .../ncss/validation/NcssGridRequestValidator.java | 6 +++--- .../PointHorizSubsetTypeConstraint.java | 4 ++-- .../validation/PointHorizSubsetTypeValidator.java | 8 ++++---- .../ncss/validation/TimeParamsConstraint.java | 4 ++-- .../ncss/validation/TimeParamsValidator.java | 4 ++-- .../ncss/validation/VarParamConstraint.java | 4 ++-- .../ncss/validation/VarParamsValidator.java | 4 ++-- .../AbstractMixedFeatureTypeSubsetWriter.java | 2 +- .../server/notebook/NotebookController.java | 2 +- .../thredds/server/viewer/ViewerController.java | 2 +- .../server/viewer/ViewerRequestParamsBean.java | 2 +- .../server/ncss/validation/TestNcssParams.java | 15 +++++++++++---- 31 files changed, 62 insertions(+), 62 deletions(-) diff --git a/dap4/d4servlet/build.gradle b/dap4/d4servlet/build.gradle index 7d1347f794..406ccf6de3 100644 --- a/dap4/d4servlet/build.gradle +++ b/dap4/d4servlet/build.gradle @@ -7,6 +7,6 @@ dependencies { compile 'edu.ucar:dap4' compile 'edu.ucar:httpservices' - compileOnly 'javax.servlet:javax.servlet-api' + compileOnly 'jakarta.servlet:jakarta.servlet-api' compile 'org.slf4j:slf4j-api' } diff --git a/dap4/d4ts/build.gradle b/dap4/d4ts/build.gradle index e62ecd8fc1..5f1da93acd 100644 --- a/dap4/d4ts/build.gradle +++ b/dap4/d4ts/build.gradle @@ -7,7 +7,7 @@ dependencies { compile 'edu.ucar:dap4' compile project(":dap4:dap4-servlet") - providedCompile "javax.servlet:javax.servlet-api:${depVersion.javaxServletApi}" + providedCompile "jakarta.servlet:jakarta.servlet-api:${depVersion.javaxServletApi}" compile 'org.slf4j:slf4j-api' diff --git a/gradle/any/shared-mvn-coords.gradle b/gradle/any/shared-mvn-coords.gradle index 1292aa842f..c71f835554 100644 --- a/gradle/any/shared-mvn-coords.gradle +++ b/gradle/any/shared-mvn-coords.gradle @@ -12,7 +12,7 @@ ext { buildPlugins.protobuf = 'com.google.protobuf:protobuf-gradle-plugin:0.8.18' buildPlugins.nexus = 'edu.ucar.unidata:unidata-nexus-gradle:0.0.1' buildPlugins.jekyll = 'edu.ucar.unidata.site:jekyll-plugin:0.0.4' - buildPlugins.depcheck = 'org.owasp:dependency-check-gradle:6.0.2' + buildPlugins.depcheck = 'org.owasp:dependency-check-gradle:8.2.1' // slf4j version is declared in a place where we cannot use the tds-platform project to handle resolving versions // (e.g. gradle/any/dependencies.gradle, for transitive dependency replacement purposes) @@ -26,8 +26,8 @@ ext { depVersion.netcdfJava = '5.5.4-SNAPSHOT' // gradle seems to have issues with the compileOnly configuration, so we need to provide the full maven // coordinates for javax.servlet-api if the gradle plugin in applied. If we don't, we see errors like this: - depVersion.javaxServletApi = '3.1.0' - depVersion.hibernateValidator = '8.0.0.Final' + depVersion.javaxServletApi = '4.0.3' + depVersion.hibernateValidator = '6.2.5.Final' // TODO: figure out way to keep this version in sync with netcdf-java version // It is included in the netcdf-java-bom (via netcdf-java-platform), but we can't // reference that version in a gradle build script (see gradle/any/protobuf.gradle) diff --git a/opendap/dtswar/build.gradle b/opendap/dtswar/build.gradle index cdf5650669..9eb52bced3 100644 --- a/opendap/dtswar/build.gradle +++ b/opendap/dtswar/build.gradle @@ -13,7 +13,7 @@ dependencies { compile 'edu.ucar:opendap' compile 'org.slf4j:slf4j-api' - providedCompile "javax.servlet:javax.servlet-api:${depVersion.javaxServletApi}" + providedCompile "jakarta.servlet:jakarta.servlet-api:${depVersion.javaxServletApi}" runtime 'org.apache.taglibs:taglibs-standard-spec' runtime 'org.apache.taglibs:taglibs-standard-impl' diff --git a/opendap/server/build.gradle b/opendap/server/build.gradle index a6a2634f67..32c8806337 100644 --- a/opendap/server/build.gradle +++ b/opendap/server/build.gradle @@ -12,7 +12,7 @@ dependencies { compile 'edu.ucar:opendap' compile 'org.slf4j:slf4j-api' - compileOnly 'javax.servlet:javax.servlet-api' + compileOnly "jakarta.servlet:jakarta.servlet-api:${depVersion.javaxServletApi}" testImplementation project(':tds-test-utils'); testImplementation 'junit:junit' diff --git a/project-files/owasp-dependency-check/dependency-check-suppression.xml b/project-files/owasp-dependency-check/dependency-check-suppression.xml index 78d87a30ba..726e0d9e1e 100644 --- a/project-files/owasp-dependency-check/dependency-check-suppression.xml +++ b/project-files/owasp-dependency-check/dependency-check-suppression.xml @@ -111,14 +111,6 @@ ^pkg:maven/commons-io/commons-io@.*$ CVE-2021-29425 - - - ^pkg:maven/com\.google\.guava/guava@.*$ - CVE-2020-8908 - > { diff --git a/tds/src/main/java/thredds/server/ncss/view/dsg/any_point/AbstractMixedFeatureTypeSubsetWriter.java b/tds/src/main/java/thredds/server/ncss/view/dsg/any_point/AbstractMixedFeatureTypeSubsetWriter.java index ec838ee90b..6dd16b46d2 100644 --- a/tds/src/main/java/thredds/server/ncss/view/dsg/any_point/AbstractMixedFeatureTypeSubsetWriter.java +++ b/tds/src/main/java/thredds/server/ncss/view/dsg/any_point/AbstractMixedFeatureTypeSubsetWriter.java @@ -7,7 +7,7 @@ import ucar.nc2.ft.*; import ucar.nc2.ft2.coverage.SubsetParams; -import jakarta.validation.constraints.Null; +import javax.validation.constraints.Null; import javax.xml.stream.XMLStreamException; import java.io.IOException; import java.io.OutputStream; diff --git a/tds/src/main/java/thredds/server/notebook/NotebookController.java b/tds/src/main/java/thredds/server/notebook/NotebookController.java index da2cc9c0e9..86c6896d33 100644 --- a/tds/src/main/java/thredds/server/notebook/NotebookController.java +++ b/tds/src/main/java/thredds/server/notebook/NotebookController.java @@ -20,7 +20,7 @@ import thredds.util.Constants; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import jakarta.validation.Valid; +import javax.validation.Valid; import java.io.*; import java.net.URI; import java.net.URISyntaxException; diff --git a/tds/src/main/java/thredds/server/viewer/ViewerController.java b/tds/src/main/java/thredds/server/viewer/ViewerController.java index 93d8288763..03cffc26a5 100644 --- a/tds/src/main/java/thredds/server/viewer/ViewerController.java +++ b/tds/src/main/java/thredds/server/viewer/ViewerController.java @@ -10,7 +10,7 @@ import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import jakarta.validation.Valid; +import javax.validation.Valid; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/tds/src/main/java/thredds/server/viewer/ViewerRequestParamsBean.java b/tds/src/main/java/thredds/server/viewer/ViewerRequestParamsBean.java index 9f38bb1871..89eeb0dc7f 100644 --- a/tds/src/main/java/thredds/server/viewer/ViewerRequestParamsBean.java +++ b/tds/src/main/java/thredds/server/viewer/ViewerRequestParamsBean.java @@ -5,7 +5,7 @@ package thredds.server.viewer; -import jakarta.validation.constraints.NotNull; +import javax.validation.constraints.NotNull; public class ViewerRequestParamsBean { diff --git a/tds/src/test/java/thredds/server/ncss/validation/TestNcssParams.java b/tds/src/test/java/thredds/server/ncss/validation/TestNcssParams.java index 9c9f653de3..350328fcc3 100644 --- a/tds/src/test/java/thredds/server/ncss/validation/TestNcssParams.java +++ b/tds/src/test/java/thredds/server/ncss/validation/TestNcssParams.java @@ -7,16 +7,17 @@ import java.io.InputStream; import java.lang.invoke.MethodHandles; import java.util.*; -import jakarta.validation.ConstraintViolation; -import jakarta.validation.Validation; -import jakarta.validation.Validator; -import jakarta.validation.ValidatorFactory; +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; import org.hibernate.validator.messageinterpolation.ParameterMessageInterpolator; import org.junit.BeforeClass; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import thredds.server.ncss.params.NcssGridParamsBean; +import thredds.server.ncss.params.NcssParamsBean; public class TestNcssParams { private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); @@ -203,6 +204,12 @@ public void testNcssBBSubsetType() { } + @Test + public void testNoParams() { + NcssGridParamsBean params = new NcssGridParamsBean(); + Set> constraintViolations = validator.validate(params); + assertEquals(1, constraintViolations.size()); + } } From 7e90ac89b4aea8050925ea2cbd5ad10b7b6bbdae Mon Sep 17 00:00:00 2001 From: haileyajohnson Date: Tue, 6 Jun 2023 15:25:44 -0700 Subject: [PATCH 38/45] clean up --- opendap/server/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opendap/server/build.gradle b/opendap/server/build.gradle index 32c8806337..88400ab6f0 100644 --- a/opendap/server/build.gradle +++ b/opendap/server/build.gradle @@ -12,7 +12,7 @@ dependencies { compile 'edu.ucar:opendap' compile 'org.slf4j:slf4j-api' - compileOnly "jakarta.servlet:jakarta.servlet-api:${depVersion.javaxServletApi}" + compileOnly 'jakarta.servlet:jakarta.servlet-api' testImplementation project(':tds-test-utils'); testImplementation 'junit:junit' From b35a3c95d330949059baeb5e5fd1c4f4fc0a57ca Mon Sep 17 00:00:00 2001 From: haileyajohnson Date: Tue, 6 Jun 2023 16:00:18 -0700 Subject: [PATCH 39/45] spotless --- tds/build.gradle | 3 +-- .../main/java/thredds/server/ncss/params/NcssParamsBean.java | 2 +- .../java/thredds/server/ncss/validation/TestNcssParams.java | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/tds/build.gradle b/tds/build.gradle index 04a0bbf591..927ff03816 100644 --- a/tds/build.gradle +++ b/tds/build.gradle @@ -85,8 +85,7 @@ dependencies { // JSR 303 with Hibernate Validator, which is dragging in jboss logging compile 'jakarta.validation:jakarta.validation-api' compile 'org.hibernate.validator:hibernate-validator' -// runtime 'javax.el:javax.el-api' - compile 'jakarta.el:jakarta.el-api' + runtime 'jakarta.el:jakarta.el-api' annotationProcessor "org.hibernate.validator:hibernate-validator-annotation-processor:${depVersion.hibernateValidator}" // @Resource annotation (removed post Java 8) diff --git a/tds/src/main/java/thredds/server/ncss/params/NcssParamsBean.java b/tds/src/main/java/thredds/server/ncss/params/NcssParamsBean.java index 0ae867188a..cb10768762 100644 --- a/tds/src/main/java/thredds/server/ncss/params/NcssParamsBean.java +++ b/tds/src/main/java/thredds/server/ncss/params/NcssParamsBean.java @@ -62,7 +62,7 @@ public class NcssParamsBean { protected Double longitude; - public NcssParamsBean() { } + public NcssParamsBean() {} public NcssParamsBean(NcssParamsBean from) { this.accept = from.accept; diff --git a/tds/src/test/java/thredds/server/ncss/validation/TestNcssParams.java b/tds/src/test/java/thredds/server/ncss/validation/TestNcssParams.java index 350328fcc3..5415dcd17e 100644 --- a/tds/src/test/java/thredds/server/ncss/validation/TestNcssParams.java +++ b/tds/src/test/java/thredds/server/ncss/validation/TestNcssParams.java @@ -17,7 +17,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import thredds.server.ncss.params.NcssGridParamsBean; -import thredds.server.ncss.params.NcssParamsBean; public class TestNcssParams { private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); From c61292a1fb7d9534f23804e6204c0b539521e1be Mon Sep 17 00:00:00 2001 From: haileyajohnson Date: Thu, 8 Jun 2023 13:38:58 -0700 Subject: [PATCH 40/45] more lib version changes --- tds-platform/build.gradle | 1 + tds/build.gradle | 5 ++--- .../java/thredds/server/ncss/validation/TestNcssParams.java | 4 +--- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/tds-platform/build.gradle b/tds-platform/build.gradle index 664002ee11..3535ade6cb 100644 --- a/tds-platform/build.gradle +++ b/tds-platform/build.gradle @@ -87,6 +87,7 @@ dependencies { api "org.hibernate.validator:hibernate-validator:${depVersion.hibernateValidator}" api "org.hibernate.validator:hibernate-validator-annotation-processor:${depVersion.hibernateValidator}" api 'jakarta.el:jakarta.el-api' + runtime 'org.glassfish:javax.el:3.0.0' // waterml stuff api 'org.apache.xmlbeans:xmlbeans' diff --git a/tds/build.gradle b/tds/build.gradle index 927ff03816..ed0bcdb49e 100644 --- a/tds/build.gradle +++ b/tds/build.gradle @@ -83,9 +83,8 @@ dependencies { 'org.json:json' // JSR 303 with Hibernate Validator, which is dragging in jboss logging - compile 'jakarta.validation:jakarta.validation-api' - compile 'org.hibernate.validator:hibernate-validator' - runtime 'jakarta.el:jakarta.el-api' + runtime 'org.hibernate.validator:hibernate-validator' + runtime 'org.glassfish:javax.el' annotationProcessor "org.hibernate.validator:hibernate-validator-annotation-processor:${depVersion.hibernateValidator}" // @Resource annotation (removed post Java 8) diff --git a/tds/src/test/java/thredds/server/ncss/validation/TestNcssParams.java b/tds/src/test/java/thredds/server/ncss/validation/TestNcssParams.java index 5415dcd17e..1d84533af1 100644 --- a/tds/src/test/java/thredds/server/ncss/validation/TestNcssParams.java +++ b/tds/src/test/java/thredds/server/ncss/validation/TestNcssParams.java @@ -11,7 +11,6 @@ import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; -import org.hibernate.validator.messageinterpolation.ParameterMessageInterpolator; import org.junit.BeforeClass; import org.junit.Test; import org.slf4j.Logger; @@ -26,8 +25,7 @@ public class TestNcssParams { @BeforeClass public static void setUp() { - ValidatorFactory factory = Validation.byDefaultProvider().configure() - .messageInterpolator(new ParameterMessageInterpolator()).buildValidatorFactory(); + ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); validator = factory.getValidator(); Class c = NcssGridParamsBean.class; From 8c3130a9359dc78c97717274b0bee0737867c5d0 Mon Sep 17 00:00:00 2001 From: haileyajohnson Date: Thu, 8 Jun 2023 14:00:07 -0700 Subject: [PATCH 41/45] fix javadoc --- .../server/ncss/validation/PointHorizSubsetTypeValidator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tds/src/main/java/thredds/server/ncss/validation/PointHorizSubsetTypeValidator.java b/tds/src/main/java/thredds/server/ncss/validation/PointHorizSubsetTypeValidator.java index dbc704a7a3..b6ee118d7c 100644 --- a/tds/src/main/java/thredds/server/ncss/validation/PointHorizSubsetTypeValidator.java +++ b/tds/src/main/java/thredds/server/ncss/validation/PointHorizSubsetTypeValidator.java @@ -29,8 +29,8 @@ public void initialize(PointHorizSubsetTypeConstraint arg0) { /* * (non-Javadoc) * - * @see jakarta.validation.ConstraintValidator#isValid(java.lang.Object, - * jakarta.validation.ConstraintValidatorContext) + * @see javax.validation.ConstraintValidator#isValid(java.lang.Object, + * javax.validation.ConstraintValidatorContext) */ @Override public boolean isValid(NcssPointParamsBean params, ConstraintValidatorContext constraintValidatorContext) { From 6f0bc567604537364eaaef2a9d25a865c8426f3e Mon Sep 17 00:00:00 2001 From: Tara Drwenski Date: Fri, 9 Jun 2023 09:29:33 -0600 Subject: [PATCH 42/45] Remove assert that can never be true and simplify code --- .../src/main/java/opendap/dts/DTSServlet.java | 115 ++++++++---------- 1 file changed, 53 insertions(+), 62 deletions(-) diff --git a/opendap/dtswar/src/main/java/opendap/dts/DTSServlet.java b/opendap/dtswar/src/main/java/opendap/dts/DTSServlet.java index 7884321b64..0bbbf5a58a 100644 --- a/opendap/dtswar/src/main/java/opendap/dts/DTSServlet.java +++ b/opendap/dtswar/src/main/java/opendap/dts/DTSServlet.java @@ -40,6 +40,7 @@ package opendap.dts; +import javax.annotation.Nonnull; import opendap.dap.*; import opendap.dap.parsers.ParseException; import opendap.servers.CEEvaluator; @@ -1644,12 +1645,9 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) { // probeRequest(System.out, rs); rs = getRequestState(request, response); - assert (rs != null); - if (rs != null) { - String ds = rs.getDataSet(); - String suff = rs.getRequestSuffix(); - isDebug = ((ds != null) && ds.equals("debug") && (suff != null) && suff.equals("")); - } + String ds = rs.getDataSet(); + String suff = rs.getRequestSuffix(); + isDebug = ((ds != null) && ds.equals("debug") && (suff != null) && suff.equals("")); synchronized (syncLock) { @@ -1674,58 +1672,53 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) { } } // synch - if (rs != null) { - String dataSet = rs.getDataSet(); - String requestSuffix = rs.getRequestSuffix(); - rs.getResponse().setHeader("XDODS-Server", getServerVersion());// Make sure always set - - - if (dataSet == null || dataSet.equals("/") || dataSet.equals("")) { - doGetDIR(rs); - } else if (dataSet.equalsIgnoreCase("/version") || dataSet.equalsIgnoreCase("/version/")) { - doGetVER(rs); - } else if (dataSet.equalsIgnoreCase("/help") || dataSet.equalsIgnoreCase("/help/")) { - doGetHELP(rs); - } else if (dataSet.equalsIgnoreCase("/" + requestSuffix)) { - doGetHELP(rs); - } else if (requestSuffix.equalsIgnoreCase("dds")) { - doGetDDS(rs); - } else if (requestSuffix.equalsIgnoreCase("das")) { - doGetDAS(rs); - } else if (requestSuffix.equalsIgnoreCase("ddx")) { - doGetDDX(rs); - } else if (requestSuffix.equalsIgnoreCase("blob")) { - doGetBLOB(rs); - } else if (requestSuffix.equalsIgnoreCase("dods")) { - doGetDAP2Data(rs); - } else if (requestSuffix.equalsIgnoreCase("asc") || requestSuffix.equalsIgnoreCase("ascii")) { - doGetASC(rs); - } else if (requestSuffix.equalsIgnoreCase("info")) { - doGetINFO(rs); - } else if (requestSuffix.equalsIgnoreCase("html") || requestSuffix.equalsIgnoreCase("htm")) { - doGetHTML(rs); - } else if (requestSuffix.equalsIgnoreCase("ver") || requestSuffix.equalsIgnoreCase("version")) { - doGetVER(rs); - } else if (requestSuffix.equalsIgnoreCase("help")) { - doGetHELP(rs); - - /* - * JC added - * } else if(dataSet.equalsIgnoreCase("catalog") && requestSuffix.equalsIgnoreCase("xml")) { - * doGetCatalog(rs); - * } else if(dataSet.equalsIgnoreCase("status")) { - * doGetStatus(rs); - * } else if(dataSet.equalsIgnoreCase("systemproperties")) { - * doGetSystemProps(rs); - * } else if(isDebug) { - * doDebug(rs); - */ - } else if (requestSuffix.equals("")) { - badURL(request, response); - } else { - badURL(request, response); - } - } else {// rs == null + String dataSet = rs.getDataSet(); + String requestSuffix = rs.getRequestSuffix(); + rs.getResponse().setHeader("XDODS-Server", getServerVersion());// Make sure always set + + if (dataSet == null || dataSet.equals("/") || dataSet.equals("")) { + doGetDIR(rs); + } else if (dataSet.equalsIgnoreCase("/version") || dataSet.equalsIgnoreCase("/version/")) { + doGetVER(rs); + } else if (dataSet.equalsIgnoreCase("/help") || dataSet.equalsIgnoreCase("/help/")) { + doGetHELP(rs); + } else if (dataSet.equalsIgnoreCase("/" + requestSuffix)) { + doGetHELP(rs); + } else if (requestSuffix.equalsIgnoreCase("dds")) { + doGetDDS(rs); + } else if (requestSuffix.equalsIgnoreCase("das")) { + doGetDAS(rs); + } else if (requestSuffix.equalsIgnoreCase("ddx")) { + doGetDDX(rs); + } else if (requestSuffix.equalsIgnoreCase("blob")) { + doGetBLOB(rs); + } else if (requestSuffix.equalsIgnoreCase("dods")) { + doGetDAP2Data(rs); + } else if (requestSuffix.equalsIgnoreCase("asc") || requestSuffix.equalsIgnoreCase("ascii")) { + doGetASC(rs); + } else if (requestSuffix.equalsIgnoreCase("info")) { + doGetINFO(rs); + } else if (requestSuffix.equalsIgnoreCase("html") || requestSuffix.equalsIgnoreCase("htm")) { + doGetHTML(rs); + } else if (requestSuffix.equalsIgnoreCase("ver") || requestSuffix.equalsIgnoreCase("version")) { + doGetVER(rs); + } else if (requestSuffix.equalsIgnoreCase("help")) { + doGetHELP(rs); + + /* + * JC added + * } else if(dataSet.equalsIgnoreCase("catalog") && requestSuffix.equalsIgnoreCase("xml")) { + * doGetCatalog(rs); + * } else if(dataSet.equalsIgnoreCase("status")) { + * doGetStatus(rs); + * } else if(dataSet.equalsIgnoreCase("systemproperties")) { + * doGetSystemProps(rs); + * } else if(isDebug) { + * doDebug(rs); + */ + } else if (requestSuffix.equals("")) { + badURL(request, response); + } else { badURL(request, response); } @@ -1741,8 +1734,8 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) { * @param request * @return the request state */ + @Nonnull protected ReqState getRequestState(HttpServletRequest request, HttpServletResponse response) throws DAP2Exception { - ReqState rs = null; // The url and query strings will come to us in encoded form // (see HTTPmethod.newMethod()) String baseurl = request.getRequestURL().toString(); @@ -1751,9 +1744,7 @@ protected ReqState getRequestState(HttpServletRequest request, HttpServletRespon String query = request.getQueryString(); query = EscapeStrings.unescapeURLQuery(query); - rs = new ReqState(this, request, response, rootpath, baseurl, query); - - return rs; + return new ReqState(this, request, response, rootpath, baseurl, query); } // ************************************************************************** From e413c8216dcf2c4675cb6ae83081b70ef166f20c Mon Sep 17 00:00:00 2001 From: Tara Drwenski Date: Fri, 9 Jun 2023 09:35:02 -0600 Subject: [PATCH 43/45] Replace assert(false) with exception --- .../server/src/main/java/opendap/servers/parsers/AST.java | 7 ++++--- .../src/main/java/opendap/servers/parsers/Ceparse.java | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/opendap/server/src/main/java/opendap/servers/parsers/AST.java b/opendap/server/src/main/java/opendap/servers/parsers/AST.java index 3c866ff765..5e1d9b34dd 100755 --- a/opendap/server/src/main/java/opendap/servers/parsers/AST.java +++ b/opendap/server/src/main/java/opendap/servers/parsers/AST.java @@ -406,8 +406,9 @@ SubClause translate() subclause = getClauseFactory().newValueClause((BaseType) components.pop(), false); } else if (fcn != null) { subclause = fcn.translate(); - } else - assert (false); + } else { + throw new IllegalStateException("Unexpected state in AST::translate"); + } return subclause; } } @@ -473,7 +474,7 @@ SubClause translate() } break; default: - assert (false); + throw new IllegalStateException("Unexpected tag = " + tag); } return subclause; } diff --git a/opendap/server/src/main/java/opendap/servers/parsers/Ceparse.java b/opendap/server/src/main/java/opendap/servers/parsers/Ceparse.java index cbb08ef4df..34dd0a0e32 100644 --- a/opendap/server/src/main/java/opendap/servers/parsers/Ceparse.java +++ b/opendap/server/src/main/java/opendap/servers/parsers/Ceparse.java @@ -331,7 +331,7 @@ Object constant(Ceparse state, Object path, int tag) throws ParseException { } break; default: - assert (false); + throw new IllegalStateException("Unexpected tag = " + tag); } return value; } From dd6f1ca711d4b9a5748a46540d95371616de4109 Mon Sep 17 00:00:00 2001 From: Tara Drwenski Date: Fri, 9 Jun 2023 10:38:15 -0600 Subject: [PATCH 44/45] Ignore dap4 test for now --- tds/src/integrationTests/java/thredds/server/dap4/TestDap4.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tds/src/integrationTests/java/thredds/server/dap4/TestDap4.java b/tds/src/integrationTests/java/thredds/server/dap4/TestDap4.java index ada09f7a4b..e2bf2b471d 100644 --- a/tds/src/integrationTests/java/thredds/server/dap4/TestDap4.java +++ b/tds/src/integrationTests/java/thredds/server/dap4/TestDap4.java @@ -2,6 +2,7 @@ package thredds.server.dap4; import org.junit.Assert; +import org.junit.Ignore; import org.junit.Test; import org.junit.experimental.categories.Category; import org.slf4j.Logger; @@ -20,6 +21,7 @@ import java.io.IOException; import java.lang.invoke.MethodHandles; +@Ignore("TODO unignore when dap4 is working!") @Category(NeedsCdmUnitTest.class) public class TestDap4 { private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); From 317a45333ce034e6cd84f9ee92c59e80ff4f6eb0 Mon Sep 17 00:00:00 2001 From: Tara Drwenski Date: Fri, 9 Jun 2023 10:59:14 -0600 Subject: [PATCH 45/45] Ignore two tests involving the same file that uses a structure with a vlen in it, which does not currently work --- .../java/thredds/server/cdmr/TestCdmRemoteCompareDataP.java | 6 ++++++ .../java/thredds/server/cdmr/TestCdmRemoteMisc.java | 2 ++ 2 files changed, 8 insertions(+) diff --git a/tds/src/integrationTests/java/thredds/server/cdmr/TestCdmRemoteCompareDataP.java b/tds/src/integrationTests/java/thredds/server/cdmr/TestCdmRemoteCompareDataP.java index a89c666207..6561f56774 100644 --- a/tds/src/integrationTests/java/thredds/server/cdmr/TestCdmRemoteCompareDataP.java +++ b/tds/src/integrationTests/java/thredds/server/cdmr/TestCdmRemoteCompareDataP.java @@ -75,9 +75,15 @@ public boolean accept(File pathname) { } static void addFromScan(final List list, String dirName, FileFilter ff) { + // TODO vlens in structures do not currently work + String skipStructuresWithVlens = "vlen/IntTimSciSamp.nc"; + try { TestDir.actOnAll(dirName, ff, new TestDir.Act() { public int doAct(String filename) throws IOException { + if (filename.endsWith(skipStructuresWithVlens)) { + return 0; + } File file = new File(filename); if (file.length() < 100 * 1000) { // 100K list.add(new Object[] {filename}); diff --git a/tds/src/integrationTests/java/thredds/server/cdmr/TestCdmRemoteMisc.java b/tds/src/integrationTests/java/thredds/server/cdmr/TestCdmRemoteMisc.java index c14c106585..5c976cfd59 100644 --- a/tds/src/integrationTests/java/thredds/server/cdmr/TestCdmRemoteMisc.java +++ b/tds/src/integrationTests/java/thredds/server/cdmr/TestCdmRemoteMisc.java @@ -6,6 +6,7 @@ package thredds.server.cdmr; import org.junit.Assert; +import org.junit.Ignore; import org.junit.Test; import org.junit.experimental.categories.Category; import org.slf4j.Logger; @@ -159,6 +160,7 @@ public void testTopVlenInt() { } + @Ignore("TODO vlens in structures do not currently work") @Test public void testVlenInStructure() { try {