From c4a2df22e536921da5d60d0b7b429e95171a875e Mon Sep 17 00:00:00 2001 From: "Edwin L. Punzalan" Date: Tue, 3 Jan 2006 09:34:00 +0000 Subject: [PATCH] Added factory for ArtifactRepositoryIndex Removed usage of src/test/index createTestIndex (renamed from testIndex() which gave the wrong impression) will create the index needed git-svn-id: https://svn.apache.org/repos/asf/maven/repository-manager/trunk@365590 13f79535-47bb-0310-9956-ffa450edef68 --- .../indexing/AbstractRepositoryIndex.java | 13 ++--- .../indexing/ArtifactRepositoryIndex.java | 12 ++++- .../ArtifactRepositoryIndexSearcher.java | 2 + .../DefaultRepositoryIndexingFactory.java | 44 +++++++++++++++ .../repository/indexing/RepositoryIndex.java | 4 +- .../indexing/RepositoryIndexSearcher.java | 19 +------ .../indexing/RepositoryIndexingFactory.java | 34 ++++++++++++ .../src/test/index/_2.cfs | Bin 11441 -> 0 bytes .../src/test/index/_4.cfs | Bin 11879 -> 0 bytes .../src/test/index/deletable | Bin 11 -> 0 bytes .../src/test/index/segments | Bin 27 -> 0 bytes .../ArtifactRepositoryIndexingTest.java | 50 ++++++++++-------- 12 files changed, 128 insertions(+), 50 deletions(-) create mode 100644 maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/DefaultRepositoryIndexingFactory.java create mode 100644 maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/RepositoryIndexingFactory.java delete mode 100644 maven-repository-indexer/src/test/index/_2.cfs delete mode 100644 maven-repository-indexer/src/test/index/_4.cfs delete mode 100644 maven-repository-indexer/src/test/index/deletable delete mode 100644 maven-repository-indexer/src/test/index/segments diff --git a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/AbstractRepositoryIndex.java b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/AbstractRepositoryIndex.java index 2815183a0..12a3c7ef6 100644 --- a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/AbstractRepositoryIndex.java +++ b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/AbstractRepositoryIndex.java @@ -18,7 +18,7 @@ package org.apache.maven.repository.indexing; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; -import org.codehaus.plexus.logging.AbstractLogEnabled; +import org.apache.maven.artifact.repository.ArtifactRepository; import java.io.File; import java.io.IOException; @@ -30,17 +30,18 @@ import java.util.Collection; * @author Edwin Punzalan */ public abstract class AbstractRepositoryIndex - extends AbstractLogEnabled implements RepositoryIndex { private String indexPath; - + private boolean indexOpen; private IndexReader indexReader; private IndexWriter indexWriter; + protected ArtifactRepository repository; + /** * method to encapsulate the optimize() method for lucene */ @@ -103,7 +104,7 @@ public abstract class AbstractRepositoryIndex /** * method for opening the index directory for indexing operations */ - public void open( String indexPath ) + protected void open( String indexPath ) throws RepositoryIndexException { try @@ -169,13 +170,13 @@ public abstract class AbstractRepositoryIndex } else { - getLogger().info( "Skipping index field validations for empty index." ); + //getLogger().info( "Skipping index field validations for empty index." ); } } else if ( !indexDir.exists() ) { indexWriter = new IndexWriter( indexPath, getAnalyzer(), true ); - getLogger().info( "New index directory created in: " + indexDir.getAbsolutePath() ); + //getLogger().info( "New index directory created in: " + indexDir.getAbsolutePath() ); } else if ( indexDir.isDirectory() ) { diff --git a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/ArtifactRepositoryIndex.java b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/ArtifactRepositoryIndex.java index a75d58367..115c989ef 100644 --- a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/ArtifactRepositoryIndex.java +++ b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/ArtifactRepositoryIndex.java @@ -30,13 +30,13 @@ import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipFile; +import org.apache.maven.artifact.repository.ArtifactRepository; /** * Class used to index Artifact objects in a specified repository * * @author Edwin Punzalan - * @plexus.component role="org.apache.maven.repository.indexing.RepositoryIndex" role-hint="artifact" instantiation-strategy="per-lookup" * @todo I think we should merge with Abstract*. Don't see that there'd be multiple implementations based on this * @todo I think we should instantiate this based on a repository from a factory instead of making it a component of its own */ @@ -65,9 +65,17 @@ public class ArtifactRepositoryIndex private Analyzer analyzer; - /** @plexus.requirement */ private Digester digester; + public ArtifactRepositoryIndex( String indexPath, ArtifactRepository repository, Digester digester ) + throws RepositoryIndexException + { + this.repository = repository; + this.digester = digester; + + open( indexPath ); + } + /** * method to get the Analyzer used to create indices * diff --git a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/ArtifactRepositoryIndexSearcher.java b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/ArtifactRepositoryIndexSearcher.java index 91acdc9c9..e24548619 100644 --- a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/ArtifactRepositoryIndexSearcher.java +++ b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/ArtifactRepositoryIndexSearcher.java @@ -84,6 +84,8 @@ public class ArtifactRepositoryIndexSearcher artifactList.add( artifact ); } + + searcher.close(); } catch ( IOException e ) { diff --git a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/DefaultRepositoryIndexingFactory.java b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/DefaultRepositoryIndexingFactory.java new file mode 100644 index 000000000..92fa7a82f --- /dev/null +++ b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/DefaultRepositoryIndexingFactory.java @@ -0,0 +1,44 @@ +package org.apache.maven.repository.indexing; + +/* + * Copyright 2001-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.apache.maven.artifact.repository.ArtifactRepository; +import org.apache.maven.repository.digest.Digester; + +/** + * + * @author Edwin Punzalan + * @plexus.component role="org.apache.maven.repository.indexing.RepositoryIndexingFactory" + */ +public class DefaultRepositoryIndexingFactory + implements RepositoryIndexingFactory +{ + /** @plexus.requirement */ + private Digester digester; + + public ArtifactRepositoryIndexSearcher createArtifactRepositoryIndexSearcher(ArtifactRepositoryIndex index) + { + return null; + } + + public ArtifactRepositoryIndex createArtifactRepositoryIndex( String indexPath, ArtifactRepository repository ) + throws RepositoryIndexException + { + return new ArtifactRepositoryIndex( indexPath, repository, digester ); + } +} diff --git a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/RepositoryIndex.java b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/RepositoryIndex.java index 29b8bc514..f8cac4d63 100644 --- a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/RepositoryIndex.java +++ b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/RepositoryIndex.java @@ -35,9 +35,9 @@ public interface RepositoryIndex void close() throws RepositoryIndexException; - void open( String indexPath ) +/* void open( String indexPath ) throws RepositoryIndexException; - +*/ void optimize() throws RepositoryIndexException; diff --git a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/RepositoryIndexSearcher.java b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/RepositoryIndexSearcher.java index e999a0c37..ac592818d 100644 --- a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/RepositoryIndexSearcher.java +++ b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/RepositoryIndexSearcher.java @@ -32,24 +32,7 @@ public interface RepositoryIndexSearcher * @param index * @param queryString * @param searchField - - List search( RepositoryIndex index, String queryString, String searchField ) - throws RepositoryIndexSearchException; - */ - - /** - * */ - void addQuery( String queryField, String queryText ); - - /** - * - */ - void addQuery( String queryField, String queryText, boolean required ); - - /** - * - */ - List search( RepositoryIndex index ) + List search( RepositoryIndex index, String queryString, String searchField ) throws RepositoryIndexSearchException; } diff --git a/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/RepositoryIndexingFactory.java b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/RepositoryIndexingFactory.java new file mode 100644 index 000000000..5601ec968 --- /dev/null +++ b/maven-repository-indexer/src/main/java/org/apache/maven/repository/indexing/RepositoryIndexingFactory.java @@ -0,0 +1,34 @@ +package org.apache.maven.repository.indexing; + +/* + * Copyright 2001-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.apache.maven.artifact.repository.ArtifactRepository; +import org.apache.maven.repository.digest.Digester; + +/** + * + * @author Edwin Punzalan + */ +public interface RepositoryIndexingFactory +{ + String ROLE = RepositoryIndexingFactory.class.getName(); + + ArtifactRepositoryIndexSearcher createArtifactRepositoryIndexSearcher( ArtifactRepositoryIndex index ); + ArtifactRepositoryIndex createArtifactRepositoryIndex( String indexPath, ArtifactRepository repository ) + throws RepositoryIndexException; +} diff --git a/maven-repository-indexer/src/test/index/_2.cfs b/maven-repository-indexer/src/test/index/_2.cfs deleted file mode 100644 index f772f8ed60a3b5528b38606cd0a94e5fffdf75a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11441 zcmb_i>yI1N6`wmZ9@~?BXR|B`q!0oLka)A30D&UZJYi8D+uaZlrJ@sib~Dr-o3R~s zD_TVrqE&?`ZH3f+q7Nzx;ZY$`K`Rl-7XLx3e(0ArpZcMHL+Lr^zUFE2q29!E&*PqZ z?&I9wxpzEe@Xx=U=a*{hVT)7j2$9i?oHQdOJJBX5?dM6_kYt;aJucn#A0&H0z{%T| zIN9aofwxN7(4wGzL)4O>en-?{LH(YnBZ7K|s0Re~E>RB(>KaiG3F-r)jtc4{q8@e) zqqH70{VuC?y!v;&4Jeg2qISQt++gK;)9ZGDW3?I&Fgx^GKC`=*y+u~O;z!+}9WvL8 zdcnF^?}0jFmWBWEyYNF|tpK{HkKa@U3#Q4H@H_Sqa%h46;7hh;n9MNo4<7iBDEt-$ zFk(Dz9$=PXj&7Mj+hi2oppRjqHQ$A4LHa;=4efF-oTW+1-d-px;fd|cpY!K|L+-u!eamSAC z-&u9-ZDZpHCu);Z3zJh1AKI~N?v`nD{??tl9=YxI-Cw)o&OLYSow@s-ef#gdkLde% z96oa3>jxKWOOMVTx?tK)StoLP4-&+p#*W7ar5J2y7J^S0*h@Qyv51GS&9=)NZo z)C^-UjNPH7BM-jDjz03}W8XM_^5@Ka&OH6Zo9y|!pFDGJWtF}z9NjcuzW6$OruXcX zH`spb4fbuuU^-yYz+^#@2*&JEspQ~)2mdkKN-`d+jGvq--Cj93Zzct%y=U68jU>~s z_m!NZC1?3u)iy1t0jq%;;~}WOr?*udHsA8D_~AhrPY0K3hiZ$p7re+~Q|)M@=0SX3 z_G_e7WfMv53M-L*navJA8N7RBaBc9H;g8(I+gmrT{&Dc`jjO*Hd^UV@c=d}<{e9~t zHZ}P0so}2%pF|VWgFg*_dh77>-HU^_Yu~il-?l9r6A|sI(pt~!^}CvWsuwhYJn64{ z{bo<=pY%I^*zm*p)~eraH~T%vcH z>V=rPkgfWib~nI|#bn1Wb$bzXS5`dh_q>MJ^Ylm+b5{Lc6!_3?+@6?HS!=D`kLtd= zpr`3^-14<~?NuHxGvZo(rQHnbFh|mJEjiZPLUpT2{ zl2t31r>x?t@5R?=o`PJ?u|dtMt-&<fw$niMct^ZZ>^f;d=1SwR@-A{V?vE z9@iX?vO;JPB2-%>4*lb3PSe@jirV*`E%YJ#13C zCuy+L>^J;wE+4atHNPiym&1Hrh$5beq>ZfA+Z{j6ys(w!=}9>gbbEe?o@(B?b_3!> z+PM&UVRyY9wJ7$B_?ZpkB6m@(eQ8ed#ayU-P&fW>B@CoqjQ5IdHRrI zQVt<_sa-^IZz7vWS(Pcp-o*kzE<1rFDGh;j8H0i^v{OAu3gxhf{3ByZ@bgV2g(*{F zrzx^1#3KzSb)@}V=uC}_%5yT!D~YI4oCYNoG@`0aO}1H(5J_<=zscr61&TZo%5*>` z8eA;uYEYnLDP>XnUMMJ9O1f(Py3ul;T@^OKGp0;$bbYQM>Wej7AkELlL{(i!j#N%c zR;W8_ab+zhlCwgadUDcBCu=d8rU{cbk*i6~bi$V6XR@}GT)PS-$jn{iP>KC65ui5OM_QEm9pRdULUX@{y;WeS6)7Mw=G=u-n{e9UMeH3Mw%moYcn9@Nr*jy0U9_VZPe%bA;+DJJz8|-ECa8lM z=;&E5XhNEZK?DTOop|tZfNc>DHE8pEwBd!p_rw^lcoB`vir0e%@XY5ftTg)@0l3JY zxMis^i!tTcajjFEew}Wdq(vG{1~GVh?K;2Qg^$ zxGIrY=911`>q4j&yrRXb7qnRVf>O(!um3cc2Z7+GB0+FPIH;N`CL{*~BVLY;unZ9) zj>m~$@nBJej2OwFut^Y!*hx!x042C8iW1z+>?Gnzs`8)`l#VRL5aE@ed5k4k5NI)) z-;KrwNiT;)HY{UJRE2<(C5SpvEI^zuzx?vQ;xgWX=T-PW#pzjN&J)?5Jk0ZmX6#k? z`^S{Q*30Y+%MY$Vx+8{U9|l zj**z~pi*A<=-vnA)siw=DT~V<~5 zIPekx-ilCpLS3a0s3C7I(en}@Qno_LNOvx|Z&8lisxG_Vi>hhi7xt7s##&y_zt3 z$S@s94j~o6GT*>#*uY{7w*sL^IUZFXgFHv&c~oaN^aK`$yucRyN_53=I+PDmdlkYr zF|@2i=!ODk9G90$36WKGIGB;R>dRb^$kdWzWAS7VHOvyFgIF{m)-m%Xc10$KM3n`8 zA>lY3?TsZov>gsssNkw_c6Z4wjc=%#jdZ4XTbvmuZ{i#OY{4Ei(Z!cfiLrEJTbns9 zw>J852f0|miNzNl+~E))2}`z(IV+ZED*>G0L10+jdJEa+G@LPV)|v%Ki*jS82k%+3 z3dWe2akzKh;F``$bgZCSg+K@<^MMcrF(5>W10j_F2xqC{XKmQt9AEQyIE)|g0S3=@%NX1hgUm%v7d zypq61)UnFqjt(^?P(oG9R6t3lBv2wDfs)DylvuD`4wRVjB0Ul!QK0}LNtA?0WaU64 zX{I0&c@iSAoPtOaD~Ke@Mu@~o;1G#C4UtF@M8ea|fk>1ygh+hmK_u}L5J?;Xkx+); zs=-@UKKT6CV3r9#I^(BG{2iTPLCQr17L>pVR)TBJUk~4U0e*SL4E7>DtY~gThC)=-gYAQ#BavYI9Lf1&rzN5)j*fnWKh?PyKM9@Mnic3@%Z{gp(z{jt3>nsH#&Pk*?U^;f9bJv>+9x0^R}O__p{X5m-674NFoVS0ejYK8!!YRe8Li6?Apcx64IXOT{q11jOSQ( ziHTMbA}B%x1(8FF1d50_Z0rchjtLT$rp2dxO};1o6y=WydGA$K-#u8$uDxCFs8_F! zSHD-)J*tVHe-~cfTVC+$f?|7#Y+Vo}e;3JSYgv%SZ%JBJqBdHTa?UvLWQF|nHny9^!I!n~Ul6sM-MC;Tg8Car_BspgR0QWnw^GU_n1Lrj6aBF|I$PX( zyY9Yc%e`C2@4J87_6Hs$`k{4u_U`z>&YAM=Cnk2C;zptL3OCLS^YID3f#1#V-_CdM zt*{EYvc@zPt&8XPuhfd214F!AvpTnafqIv@QBA78M}Pi@}%Hme?) zm>itiaA$3^clVa&j`A;A>%nJslwq}R#mU;Wd+#Ifuzim|@#Iqn4*i<(m$<=?Jo5p2 zxp?2RM~|PJqd%wiE%S?K-eqSyFD$*sw(IY)AHf8|3~8{iU=h$na9CU55l#p*Ow%mj z{{sGFh8|};SsFT|jhmZFJEwSD!i_Csx}n9Hnz79+>@y3q#|I2khgHfAL*w9q22Dew zB61^t$JPj9{Tl-&o2uJOj<-{V=g!^bUFDhbD|U;q(MD^rY(sRPcgmzyWW#ao5;IAE zfKB+UFv=9|H9g{wtj2%&%MuXt-jy;%KyM${q}~lZK1$Mdsj~TzwcdZ4UhG% z`@g!w|7P<{@8j}w2K&dF>HTtpu!7Qj$L@67A$_{z)_^?ZEZE&zC)7XWG##(%c$Jko zr`@P^JFvIRITyNa%c&k-t~gC(gl0g!)>v^`NlxAIIvMImVAE=}R#NQ-eC5b9wpXp8 z*@S}uKcRTc_F&h{)epp~+N{^^*tMFCy~*%XiqYV#w`AAcs;W45DxxlBb566-cClj- z+5U6wP7AuLDjst>cGd3K;Yj6k=A2H;b)em-JvpVS)_kMesyNnkI89F@hJ@xrud;Zl z5f9Z*HfnAK=16%SN{-qqjczBHl(gWevuNYWQRAU1gdF9*SU8Dgl2*%^r?ldnV@KC# zmV#Q&kwHzX&BHW05slb5(Mhn|MK0b}Bt74BD(-??Np3JFpsO%DxHY(*Q$*(mj(`;DLxM>;gybc5k$`&} z*+jysN-4I^ z>}Nt}Vq}6mC)Io)ku~zuptwSasKKVD+RRCalsJ*!q;sGgMUe=lI-n8_A(nMRP@rTf zVKMYQSCF@q!m8QpCX|cpDz^cVF{OGF))xx0zFf08((G(ZRt@W@k;+KPa&`MHuC(P? za+Yf|oSfv+Nn4DkY0~6v4WM^4o*mX0eQNaM->R8Di4?&`*oKI$ZlAoR8MTN0EPYSY=y+9}-N%;N`r>p^=%@$wR+T%|AZxztg+yzvRNHL7OL9i?-*!F30$!-J+2>X?LIjJo8!8Cu`kB7hDui+_Hi(i!jyL z39ZA+PK9oqlt$FalP#x(7g2E20!wTf<_pqe@Oci#OPsT?+-$%SghW>sl@~%ljzvd1 zEQ=0?w7LYr?L%C&%vb8x^gJ{UC$W90(-tlCj3k`+Ww%jYh8e;1`|pKV`W-Gu8B!qw zXEen;F`r_ol`93be4}OTnxvx(S+Sxs6RhS?sFt+kgljp)2q!BP!Q~(ZO*pQBNG@|l zXRdWA3>JJq%T+IFx%4F!EO)W~lUxx5lADMG$(7*{)C^)maWF8V<;V!D5Ru|&oJf`k zmVi(ZqZkx6F(MW_Nr?!c7&nNb7&kRLv3OFdBB&%4MpnR(;T5ArjKx?GXc1c6jYbA3 zTn@2pSjC#G3IV4|5OuPck2vdLTj&IL@3U2Shq6oDy&EVgvXO)Wpbe-1+ARBT`@iw8 zI^VtzFw^ueRi^yaTdRNg;neBg<;C7LylnTczwn&@7ypxnf4O(Hcir%B{M7%Vap7-o z8O)sC-)zF3Fd*OIVUU;OG2U$U_x`)@zWc9yr=Y`g75X`rI6R*5WC<((E%!$Y{m#5^e#7i_xFLivCh7%vs&C?bEPD94gau5%-=1Y*WU zxbUo0ijBf}OWo4Pv_}g9Fv#eb*XS(Z^>0k2WVM1zD^wegdOKba7gQuDH0drL%hs5> zEsoh5FTiBL2?SM!bV#eQP%6ON4S3x{<>BCth|n5&ld+zg0J$}xtKKG~l4hR6LMRoNXPV&f)lDbMYqy0m-3ZUtY_LtRlJ;1 zYXqx|#23OybmT^&lN;;eNVH$YQE-y(&7+w-Qe@h`NEb~w00IUWtdx(M{e?Q4@@jjq?#5QJf38kqK>fq{Xx(+LHTXoV&vy3}5YfLjhNGYPg)P#D7H738|e8Yl>qCh>ryl3XGaONtFfvs~2R zCgr(U)F9R|r6+btWxYfdB`_mVC^SQFbm^f{5GafaRuInCMzy7h4K=lqj^}TS<3r?4 z6aXf2_Nd`DzEz8jr4`xQ_>kJ#2tvul5>70>$q^2F08&^o3{1wcL|X~qjR*owZ&&Kb z=3{Vp%2;bUq!1|A#yju=DXpLl${B|X^+lmsc#Y0WR4W${@xz8pKtw?V5RnvsNF@M7 zdIo?<>M1}ZE&w7u6(AxJ0YoALKtw75i0}~u4*-$0)kcYu00l`cd%8&vP>?EbP)jC_ zf2gPMk95=cN3BHg57h$vBSPXIDvrxVf@N!1EfN8Es7ruH4N1Tw>j}U^d4L9_AOH`F zdPxBTDoMbDqTDx#83R1zFaz)I;G-az-r(H{d?M806Op(NfDrZKK!}_W2+<>!3xuef z0zza)fRIQ9go2P+4ib^BW6C2}IZDz%2wa{9Levd`5UD5-65S67Q6U2e$*KZEBv>{O zq9_jtQ6_*8OA#PMG5|udpn#Bw93Z4xxj=~0Odupde;`DaY#;;)PXZxoYm?bPh%yC) zq!$H3WblILF2H#Q7pMY7{P>Nr1^kdpU?Y7EM<_rx0&FBIhKjDU#+!xDgrnJ?0Pp%N8xppry!s6UN`xTy%J zL|zD$ND)**foDJ^${9i>DP}+=@ncX)90`?BhL7~%HL@6d@wpp(LTAeJCbS81NWG{) z$4&G@V{QQ(HsMD1Bmcu!kkHr#dgv|xrhkcwM%VuezIPLBI*JRnIEYi3`&TMdVE$F9 zcl~u?i1|098U#Hs_A@@I`r|Ey}-?V$53w7py zBBfu-=QVsX9Tv<@hgck58VK3063!r-DZ%V%Y