From b3ea5d8ea600ec696ffb3ec43bf69f651b0852c5 Mon Sep 17 00:00:00 2001 From: Andrew John Hughes Date: Mon, 16 Apr 2007 14:50:03 +0000 Subject: [PATCH] 2007-04-16 Andrew John Hughes * javax/management/ObjectName.java: (parse(String)): Catch multiple wildcards, initialise with an empty string (so null isn't appended), and emit comma even when wildcard ends the list. (checkComponents()): Catch newlines. (quote(String)): Handle newlines and quotes correctly. From-SVN: r123873 --- libjava/classpath/ChangeLog | 11 ++ .../javax/management/ObjectName.java | 106 ++++++++++++------ .../lib/javax/management/ObjectName.class | Bin 10052 -> 10576 bytes 3 files changed, 84 insertions(+), 33 deletions(-) diff --git a/libjava/classpath/ChangeLog b/libjava/classpath/ChangeLog index fabbb9779204..84f4c6833d63 100644 --- a/libjava/classpath/ChangeLog +++ b/libjava/classpath/ChangeLog @@ -1,3 +1,14 @@ +2007-04-16 Andrew John Hughes + + * javax/management/ObjectName.java: + (parse(String)): Catch multiple wildcards, + initialise with an empty string (so null isn't + appended), and emit comma even when wildcard + ends the list. + (checkComponents()): Catch newlines. + (quote(String)): Handle newlines and quotes + correctly. + 2007-04-16 Andrew Haley * org/omg/IOP/TaggedComponentHelper.java (read): Use diff --git a/libjava/classpath/javax/management/ObjectName.java b/libjava/classpath/javax/management/ObjectName.java index 0ddfb8ee6ad8..a3f30efffb42 100644 --- a/libjava/classpath/javax/management/ObjectName.java +++ b/libjava/classpath/javax/management/ObjectName.java @@ -104,6 +104,13 @@ public class ObjectName private static final long serialVersionUID = 1081892073854801359L; + /** + * The wildcard {@link ObjectName} {@code "*:*"} + * + * @since 1.6 + */ + public static final ObjectName WILDCARD; + /** * The domain of the name. */ @@ -129,6 +136,23 @@ public class ObjectName */ private transient MBeanServer server; + /** + * Static initializer to set up the wildcard. + */ + static + { + try + { + WILDCARD = new ObjectName(""); + } + catch (MalformedObjectNameException e) + { + throw (InternalError) (new InternalError("A problem occurred " + + "initializing the ObjectName " + + "wildcard.").initCause(e)); + } + } + /** * Constructs an {@link ObjectName} instance from the given string, * which should be of the form @@ -159,7 +183,6 @@ public class ObjectName * Parse the name in the same form as the constructor. Used by * readObject(). */ - private void parse(String name) throws MalformedObjectNameException { @@ -169,32 +192,37 @@ public class ObjectName domain = name.substring(0, domainSep); String rest = name.substring(domainSep + 1); properties = new TreeMap(); - if (rest.equals("*")) - propertyPattern = true; - else + String[] pairs = rest.split(","); + if (pairs.length == 0 && !isPattern()) + throw new MalformedObjectNameException("A name that is not a " + + "pattern must contain at " + + "least one key-value pair."); + propertyListString = ""; + for (int a = 0; a < pairs.length; ++a) { - if (rest.endsWith(",*")) + if (pairs[a].equals("*")) { + if (propertyPattern) + throw new MalformedObjectNameException("Multiple wildcards " + + "in properties."); propertyPattern = true; - propertyListString = rest.substring(0, rest.length() - 2); + continue; } - else - propertyListString = rest; - String[] pairs = propertyListString.split(","); - if (pairs.length == 0 && !isPattern()) - throw new MalformedObjectNameException("A name that is not a " + - "pattern must contain at " + - "least one key-value pair."); - for (int a = 0; a < pairs.length; ++a) - { - int sep = pairs[a].indexOf('='); - String key = pairs[a].substring(0, sep); - if (properties.containsKey(key)) - throw new MalformedObjectNameException("The same key occurs " + - "more than once."); - properties.put(key, pairs[a].substring(sep + 1)); - } + int sep = pairs[a].indexOf('='); + if (sep == -1) + throw new MalformedObjectNameException("A key must be " + + "followed by a value."); + String key = pairs[a].substring(0, sep); + if (properties.containsKey(key)) + throw new MalformedObjectNameException("The same key occurs " + + "more than once."); + String value = pairs[a].substring(sep+1); + properties.put(key, value); + propertyListString += key + "=" + value + ","; } + if (propertyListString.length() > 0) + propertyListString = + propertyListString.substring(0, propertyListString.length() - 1); checkComponents(); } @@ -263,7 +291,7 @@ public class ObjectName if (domain.indexOf('\n') != -1) throw new MalformedObjectNameException("The domain includes a newline " + "character."); - char[] chars = new char[] { ':', ',', '*', '?', '=' }; + char[] chars = new char[] { '\n', ':', ',', '*', '?', '=' }; Iterator i = properties.entrySet().iterator(); while (i.hasNext()) { @@ -284,8 +312,9 @@ public class ObjectName } catch (IllegalArgumentException e) { - throw new MalformedObjectNameException("The quoted value is " + - "invalid."); + throw (MalformedObjectNameException) + new MalformedObjectNameException("The quoted value is " + + "invalid.").initCause(e); } } else if (quote != -1) @@ -763,10 +792,12 @@ public class ObjectName /** - * Serialization methods. The serialized form is the same as the - * string parsed by the constructor. + * Serialize this {@link ObjectName}. The serialized + * form is the same as the string parsed by the constructor. + * + * @param out the output stream to write to. + * @throws IOException if an I/O error occurs. */ - private void writeObject(ObjectOutputStream out) throws IOException { @@ -777,14 +808,21 @@ public class ObjectName buffer.append(properties); if (isPropertyPattern()) { - if (properties.length() == 0) - buffer.append("*"); - else - buffer.append(",*"); + if (properties.length() == 0) + buffer.append("*"); + else + buffer.append(",*"); } out.writeObject(buffer.toString()); } + /** + * Reads the serialized form, which is that used + * by the constructor. + * + * @param in the input stream to read from. + * @throws IOException if an I/O error occurs. + */ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { @@ -833,10 +871,12 @@ public class ObjectName { n = q.charAt(++a); if (n != '"' && n != '?' && n != '*' && - n != '\n' && n != '\\') + n != 'n' && n != '\\') throw new IllegalArgumentException("Illegal escaped character: " + n); } + else if (n == '"' || n == '\n') + throw new IllegalArgumentException("Illegal character: " + n); builder.append(n); } diff --git a/libjava/classpath/lib/javax/management/ObjectName.class b/libjava/classpath/lib/javax/management/ObjectName.class index ce68245548d7c29211d99055a9b44d2af5edc460..5bbfcff66021a787bcd15b9b5558854da602ffa5 100644 GIT binary patch literal 10576 zcma)C31C#^wf@fBnam_yU=j#xg2N(&Ng(3F5;h@%q(DF*KoG?txgi6SnK%oOR_aF8 z+U522^|ggAK$n*;+G^EAr4?;!`?^|NTf4sQ`)2p{)mQqR|K8b1=u@1TJO6U_@0|1h zlh6L+@h1Q*l6!;j38o*69gZDs?u#X32b?}9nQh*(|De;AZIAUiLHGq>UC^9}B@cKr zK~xAPn$dWwdApO2#}e_E$Mz?=h+BRL&x@H^K)o&U>ww0;^&EPJzEQ)$N3Ei2zj)%(O8Jvq^Dbq;&IlR&wd3HpXFm5c33+i>_@; zs#vkax^y~~4q?7v>6!?IrdRtSsjjYEI_-2vl(_LWts2SpI+3CaB1hth?ygw6dtnvk zVy3<|*;s&uw5)DxjpZ`5Y*VRRJ9^WpBN{l%=a)!Z91Y?!!GaNf-yBQyq|$v(cai(L zqg_samN7+BZ;B_K_FUh7C%r>yYeb~FVu_tG1}eXMgTjgCQOy1?Xloo57-gzpVTqc( zt_sVrJcyPuthk=Hu>vdUmV}c$knJ_jYYSmDAEGT$b=(>oYt?aq{#aV= zu-QgCw$Klm-2RL~gkVxbTU)8oJ)~%WTxTPUYTdY9H|`MBl4Xg5ytP3v4y#QFl|rcs z9ay4tI&IWoLI~G0*qfBx4K{AXKI)q3PsFo=d8M)75uJbiNJeU>n2r7D(pbtAAVehW z34umizb2ygVnoKWk$5JOOl2dnNWTlUNMA0KjdZ1wS*C{w7bKh*2U1BVa>yB2a9C3g z*T&NeRp)u46cOx9r`ViNF5>0_76~gBN@Heft-!QD#I90i_Au6 zAcUiW**l2AjH<3=3`{eTzEs+nB1s*)97EvcHeP{S7Q*$I;PHS%3Z^v)i5e+!N1vf1L~MNx_X_iL#?U4euhUf zOAl4L0Nd`cdPy76mv%BVA>kTNb9%xk;mU07?xB?=b8dj)e81YRDDC%Y24ZYM+d%xjq!>FQ-x>|$jj+y(^=qpwUl zM_62)lGUp2`)zyxA7uP65YhwN9eTYwA3sJ|4lN&p`|;r*KExiTmar^ zw5$o&i#@Zq%^N3yhww-c57U}O0{K}RLm1X#;2b6Q^62$Y8pLCa!s1rCVa_@gcnluJ zSsNc!0u=|GtVtP9kd2#i@|i>prD%ClarcyO=_jc!KeO?3&6AaMoI9zbzqIiy{F-6y z0&8h;-yV>{y!W4P)p3@#@1Lem5j4(ByLIt z%a@Xhl#bFM7Q>OHPkgpm;wRQLCf1O#_Gt`@px1^7Z12f*axCVqWxa1gD@iM*kTJH{ zDn+1Bxk}9KDa5@gMe!28Ne!Va6E3KnqiF7`lE*eB-R~B19^pzjl&=cO zWb$fZew3-UOf#^FXV&%gX9q&U0_tmuQZq{4W)5^+6ne$~6QzdN#bP)l5y54e2fFeO zaa+Aqk2!xFh#z*6?np^)5G)!cOx?V8F;0SxQTB{5#Awy|UuvK(oukKulk8J3%Avga zdB>rPi<)?egkEA9{nwUJ4H{H~w+Y74wIzrMN+XXU#Z=jzOC+|Y;(C@Wq{)yhAPRNH zG^wt~*bArGP_vg})0-|fyAstlumgV+tQr2e=i56gBy03D z8WJV}-`>?BS*M?SLvpQtRxwj#yt9}vjf~4U*^(nalaR}!ECxyzu-D>|LwK~CifM%0 zku+Nk7vzFVJo$J%;|^`fW!bb5%1*40JA-mvK7DdY+m?c_s${!#1Z9U{nsMr=1Z>%< zy>d;r(-Y$AYBPD zThi){YR?b#Bfj!=TWNeb{i-+Fp8{rSwM5;Fq6@#*J#r(Fh~hY)iqVP zBqUCbhJ**hd77p(CZ^ervj^8>IIs26SssG3y#%>wb9f+q9y3F7JFlWf+rd*``TCID zNpZY>DB@(gV*NZKYne5zeM=-HuVOgo7nDp;G@iwU+Ei^%<8zPCjL1WnGl<%aXEC?4rePS-=nxv8#N2ZansqjLHk1D% z?wN)PzQ2(pZ=wuurbKTg%{NnS2bXik<_?wZ3S7x=Y+f;&JFnuipWm7d|J@w%ab#k2 z7>gT+u=FG)jGwQGlqxCA;>K{x5Z0}%^PR@nvuN(DX&c7IbJ0etZU~zm!Pdq)|4l>K)*d~J zj?Q81dIY-{)a)6;-WLB<{}U%E@DOe~>Fw<{duwJqf*xyeU=Sak>aPu4Ueh~-gC|fI zeHh6T-pYQn(*FpOgSgAA3a_Lbiz{j?3X-ICjhVA*D=1A%kQ8=L4GtljCv&8*q_)Dy z*%ETsObrcTU{|#BVf38Eu|4}9#jV4*Q}-UPxrc8$e_ZuAK7@NI?(u-s2B^@P^IJ%u zhYolrrbPA8^1l1KjX`?opw|~Yat9*x$j2C$Ptecj7;8^*z zJbvxQXL!T*IUK?lkj58r3%x79~$rPb-kJQzAW~FBcS8ne+x21`kh zs2iFV7$=k&%mvFIx$!R)`L7JqzhMSX1hXiVf+gyb%qzmsRp=-*XB)8;B(sfJ3RreM z6rvc~F6iHGAoVKFSX@2xqT&tV9eHnBMI_4@{;o0(l`t5E zgqz9B)HAfuySPg6PPQC*H%EMWcXgrdd@S6h!;r}t^w_L8EjYJ zdkBi(TNfn7@8bu2XL*z3L{*UXc$}r>rV|KQ_ql1iGRlD;>X#p#K&{52#ett%kKz|6 zQOi{v(E%p#lisf1oPfij-)ZC)0+CFK8;JR+x#u z=82Pl@#ABIm_UhMB$pTSbN>4%z3bD1TE3;5x;g~u0feO&lh{brO9Bg|56yBjf7D6y zXPg|?%Mompqu4D2{GsC&{N3Od7gb4c#N zqjInD*9O;e1<*gv)H$|IX`lkXFM0+HFuc#pqi<*N-u3( zkML^6Z`y`^gXoA(KQ1yPve;ki4@Xa9P7~{o*3Svi=}ol+(=X^U|9!^;=W7G??>hf$ z>%MwjaYjAD9ji}ae67E!o)k{$&~Zzq(|$|OoPU3b*;Z*^ASYnS+X#nuFt?qe$=xR5kHMx8G+K zU0y>fkSFN!Ct=G|m?EDj$;ZJ&|kKfofFemPEbI%D>HJWC^`+oBLFoXBr2guBg*}0}Xe~CZ9 zKZ{!VG8K3Zm&#Wen_uHEc+WF7zl?7AhEd9`fN@W$5OdT-sig|F*x}`eOIeuR{2+Q6 z<*9d=>ZvQPR>2jxZqGA8CQ(qullwvZPBGAxDJKxB=^ezF2{L^Uftnd^k}pc_n*9Za z%I`2;evcLMf|1ZIa94X0ie6B9GBop3We6z$BB2T$lov}j2fWRdQZF;S&4;LfM$jeN zgKH$P3x8mfHsBNF5_aG;sp-HChcR?=z5zFFv9AWUZz9I}CS$U13a0xe8Fp@4e2Kv< z7?hePuOtO!Jd^B-y@MVDuJCMFX+%)|9CTf1bnrEo=ul~TEErO=Mv!V_ylZ@qF{B!s zhGq7J#5NdWZc{PF0Ep|^*lYWxRvcsUyw5PWl*Ed%nm&hhOl986pjNY0xr~Nop7L=U z8dvC8i6yEEe5z=RGvrfjS#;#x91)q1&+}8M?;<6oKE3hN7>7II`x635$s&biOwwU`>ar-R(tRcL6SQZtjyUH9Z z@qnEVLA{Ic1a4IYNTZtjdp-p{5A-~s;a?==ig_=BzSl5jURy%2xf(WzHD6J+U-w45|jZsh?dE6aU)rZd`C7r(YQC=J zYcF5h8Yjpq&9Q^HijP;jk5N9ZbssO`<2CN%L_V%}A1fQ{mGg0*)X^9$f_HkdlxO62 z9-QI(K0>}9FjRktiM}6Wn(rsr&F7{zH*=qs4W>MX@K!H#SL068yZKlOQ|t;WHO%>!RU19i zucGx7V--9^$)@7rvPws-3I;~d*x$`%6`u3Bo`rRq2>||-KEjPmpv90k(PX(P(M{iZ zH~M)0wuOwm+#ZJY?B7_KKg7-6U&M|HnO1aACj)3UJIGoV9kNwx)fn+E+$*^P-it@mNg&qtwvmC zHKD~?h_%*bc$u}x=@H8KSyU>?SBA-JbF_(9EQ1KQpOsuE6*@93N6jUVOMt_CR(j* zkk?_Rb!~}!vkLOfk^y-+<>Mc$uZei`Q*bDGySJz+CK|H9TpN?8YNqE*N zW?4MXEPHHNZat^BPD^?7P&RX$&g6mSC&G?-2n+8$jn=3}z5$#P>#W!IaC?0?dJ3EC z!^u;)wm!V~6xJvcr7=P7;2}#P!-ho(*Xy>*`f$~0)D;&UFJDxSF@N`&^S6!yFKaKV ztQ%;ieVAk2gl20$mRMa_VL5bd4>nl6xXy~B%Q}dZbqL3-1dj9b9xI7ASt;Ca_2VI~ nf6~g7nD}Y7=h}TP!RtMEEyLX&yw>uMd+zq&br0A00Bv4)Z;w<)vk|q-K}rkUG_Wwy_rW6x)5gW zz5o6H^Zd^F&-v%e|NGbz0Ird{gYXIJ55*40j}~yf;Bq2&S9Sc&crila9v{@jGMv3C<4*W=$Y?bIwU0TYGevv@&M)PA8p- zr;5dI^O69irfn+S3OFM$46K5=+NOs~#2kF#!td4Dp zXR@vUf~v8>EwOCYNmESOO_{0VVJ9uP!jLL6ZTD&?mZZh_oh91I}=krpg4-C|ESXwB519{#1I%87w-jutwnTObt3=Scuq|g}DN&dEw45=Hbd9 z=9hWaRmsLxSU|ZFPVzwZpqbtk!b09e+oNF!T5PmpwjeMZOJ``(s!j2v(~}$OchcJx z0P3jJKrFE{Mo{qC8}w%n#_6KQi3TZ(O?&v0#GHzEt&QvOYC$lb9CVIu-p^OfT?;A7 z^|WeFD&nFdl5r?TESpM4j>IyN{i$4XaB&z7SgP92Rzk~cEXNAMAd~CQ7}yAAG9WjlBAyj2m<(&TOtgo(d#{ash|zrUOabDA(C!ch1nX8s)L)V8 z!B{pD&qR``Y$O&Lc0(aDl*?oz1F2+|;Tz$EgcIXHD(OUScaAMOtZ~k{@iZOQ3CG5M zHO~}pL1v?KEClK~Z~H+fl2I;P6-f;YCP{9Uq%>5j1`av{w|Az7hADJ1OP^J`u-oP^kqKSvPdgcMV=Tnent&!T zA}7*(7JvDx2rI5*R-ulVG*AvgQ_o@U9U*mBx0%+=0)^)C83+5|cyzCH9 z4kU7ePKKad(7qrtaFDrTfN6Sh2=@t^C!d*gjwG1UN@lCNZ?^FkywyZtHhpZHL$6P3 z_Hu~Pjzi0);O)3Sh<9*1D`p11u<;joC)dWwTa%S$pwhKn-Z%-o8}A9?FKNvpfw8wX z{tEBa6zLo#_vvF4O19-?LA;+REH0%R=C4gs;3;??PTF`t2~-?#vW%`EJ}8)J<{A<% z?pEjGi9shF!YRtI%Ea7QM5-0T_yCsb*N1F;7#|_A*zhoulAxivb7D&Ms4WZOqs(Os zBD(Tpy7J@P$tFSND^Ylmn_G3 z&)PVLJU5wK@{U|8%f0KWOA?CuJVK2XKW5!v#LZ?*f$=17yceY=Y$^xh z;}m+bX$plWY&@ySH+V3X>7mzy_?)1r=(4Uv!Z{F2tV$oqY1vk??FZCS%t*dlI+=jt zF$&G$kAO!rf}tjr#Q!8(&q~tKyk8 zrh@af4}JGF8(&w)Rni&mOC5dQ#y9aT#*Q1k-LWk5FLhWriBGyFCd@9E`L}I+NBK_U zhUM0V$4WT=la24;`-HX|17kC^q+>9Qh19ro6~>ETVf)Wzp;bt+`u2x5euRHzf+yK= zAbRDk<|j5@QcKL`!p>MSm5j4=VsMrUHiqqrl#bFM79pnl`p<3r0{_k!RA;XuV=a;B z@1VB>3vBPs6j9tX)$+f#@f($*x>O3S{>dxVe~9KPF}J4>*QPWGO-%nu zWBSkIVtNwI%W@2(=zmCswOO#=%{uHHN*I+-rotk&_{8FT6K+}*mc{Eu87>P+fSlTy z$R%h?$i!4Uvvz1Wdn_bj0c|jax_6ltWPoZf|9^09#JpG(s7aRwrK&8wb|tkxh$Ysh z)2VbwrU|ar{4p@*bhna9?PoFNL=MCcJ4tt>B&URBDwD5FmFc$B$qX&Z*gSN`a$1MC zmPX0;gXz=}cmFRjXmOOr;F7k9TD(#-!E|sF8C@e z8>Kran*_6sQzs>0OOG}kHG|InST2$6EpiUZ7FLW!IJhCRI=6qnlMc&f%?X=@E#ik| zyBcxQI!xy-Q^@VKr3IhT6}xmr-?+@-g`*2y_sFM|-7@9(N!4eME$iggaee4m2HvR~ zhxTC&Zd^~QFdbOYZBoD6!s8w{O4Z$N;pbYQ$ckqX zG}jOmwR(zGKh7W}ELGQ3;oyyNax^4|*{$m~kujKNU&CfbyKEknrL&PEJPBZsn;MNx z@KabC5*BG!PPT$Yding2yoTaH$2(Q7 zidr5lR!d_pw>t|y1i)iK%tj@21DwJGMjve4qvt8SzemqQI9_AMYx&GW3Ny~L4s&J1 z@!G&SJi6i9dOrF2)PO5^w~He_UZ+P#F{dSurjw{(%NcDMMfB4g_hAvgXHW{@yW&Gqbq!i+;ms+aZ^LW*Y2H$C1b{-9V zHA_Zu!;{e#t09l}bLePk@bAmx#-8YTboPy6?K!MlRI@&h4U{12KZl+XoL*G3C6BEq zFxw177g>v_Kw!`i*g1kwbkRBNjD8k7Yj)+ayWKy_|HMgZn#XM?J*NH2)LIf4!Nyts zy1=WdS5T-W73SWmt01NJAPKCS70hGsgtzE`k<^TuiFFl5)I8$7#{*IqAe%E69;QKu ziWclQUic_|IYRG!j28VkBKQQF@gT0nS)Pe~5^L}fy4g={#lsi`$zc>(Jc2jiQM?V0 z<6U?HA7tzD2|_ZD&++>o@B+twh%e$Nc-nYlt83kYH(v6*!8#kmxP$&^CY3ZjWRdm| zGW_=Aer!XIZv&*i6o+|NK`yO0!g)c1oTKACiPw{YpPrnj$ceVlWhJgso3+v#@!oPX z%qC&5lkl@&sKoaPmLCv?FQSR!DVU-z$%6Rv49re&%LO4dAxQ^ILn~i74BCQ;bjWs}9B9o1n%u`v8b9S%Jn z=(DQZcl7zITX*yYs-rvlDymoR=nGb_*s)1Xp2wRA6+!n1zTf&N-X+Ay`}n_S(W5w_ z5A)jn2JJV@^0(9lu5&pwYy6$Z2l{IMdK9PK@iR4llgCKSC-{}eS!HgZ-9ltPO=1tZ z!~(Md)lDX1>MBlR=B&UYc(`{2`+7}8kLt3zih>T0>a(>ZID#8y1zPHY6WE_O>~(w+ z_Ccu&8unD|?*u0=%>6Vi{Z%%%-=<=2p1O~=hWK%r1Ta(dC_aS662?ZEf?ZS8Ah|h+t1ir=|$pGj7$Z30MGCU_Dd!vf9t)~n0y9b<~PwK$GI*@%ss~ZecK5H ztg~*4tBi8sANAqc6R1BRp7d6|Z~_j8zS~`jCZ^go^mzeI znn(+H3bf7&tr`Qdka0ghn~F+aoLNU?899W!`&<; z-Yx?;DTDX`-+xTvILqSWAzt%xI}e(MjF;BCmMg^cW6YOV)2sIGW{+i1Pkgc@uy3c`Hr#Hk$4o*dq61tGtsxe!P}H zVZ7UzqQey#zf@ZMw-^6G&}lN;YZ9I2-o5x0$1Gfi_4rTx7uB52Ec|(n1vrzx#CQf6 zq&qeH&Tjb}0GIKF|m5KC+`4jDDQ77l9z$mViM~KZwv0WY`HqT*D z9ydz48(iE|ibp2+UtFLHb^ImD%?ejyiI){bkB>a{4pTjK#f>Vs1};xZnJsI@Pr)>v z+zaD(rU_lCIDt^j`Vma2*)oEPTB+oOGO1m&KToK96ZP^fESKkvgzo-zqbH&0k)kI< z8?P!uK=~Kduh2np_iuM`z*}4?QVA`lR77g)VOJtZQmd`7NRGdqVq9%tTZAh|AGsR4!)Wa15}#A35L{!G8SFLyW)F_A=T14D)r-uwHRV9h^LqU;(S)m zn&;JuQ%rXE83v6cR+QD0F>-||W3~{~YPPV;XjJAXAGcm{g)Dhmk@WI(o0H8y}spXOg%46^u_#9x#~%U5FN6B1w&D-sj9J$0{L!6m2Yba+xkL` z)_dxSo(Ge(t4gy`WeL}-;`VvGs1RN^DhrF$U1j!_c)%Wmps=&{1n%TjX-wn#onK^y z&&xv!{~{q*%pnAQN!Y$r3BhRvf;>3!2)0v5C0I>L9eG)#a^sffZu00fDxF%nIxnv}X{796)1voG-6i?jC3;^8(Z&K%{xIwjUCyftS3?b-Jqeqa z7bd6lo)Stm1xh@z_b8QyZqIn#PL(V!gf1%%4<(|hR#WTgvDDh4Mc)x5pIy^ZpgZK00N z;q7wwb~Z>D@_h?A-wQbE`ws5*eHZuozK6GP-Ftj5;sIZ2YjRp{ zG}~hc@AoqIG~8<{HXpabl&s>WNSMoNQK)K%-9hVVj8(8lk~PJSFs!4#pCRD;xv{^S z%PKtQalW3F836FtxCw4#0xd$`MU$Hn%QLW#r%4J;FS)R&Qjs2`i0aS{jPVWUWwYkv z=SJn`?pF39vb8swmmNK9-=vqf;GR;ijWv7bRt0k}y%TO_>&?5C*1YV_%PmE<7BjKI z3cznwpxO#zrWHbiRf#4mjD?nstF6n>ZdGBGH4R;sn{nMuaYI4%4RRYxIsR~hcG<^b z&d1GQF`u+)^+`X=I#;6#KCNegr#ju|>C{A>_VaT)b60n?mB$z(sO~v0Lw(dIH7dhT zYTID*&}4dHi!qI#HIp)54%@27bgPl|@f^&x<{HE^|ZiJ%(vRnW-Z6{)(R}QR${evBi381akJHl0c#CX)>^#IT8HDj tzS&xj`#J9cYh#JkPP4+)dh&Xf&u*!+6#ZVnti~pJofj~7agI-3|9_`MTW|mX