From a5fadde8df6d7eab51df1bf5a53dc1c1472400ce Mon Sep 17 00:00:00 2001 From: Thomas <thomas.musset@pasteur.fr> Date: Thu, 4 Jul 2024 16:47:08 +0200 Subject: [PATCH] updated pom to v2.0.0-a.1, fix classes accordingly to new architecture, added icon, updated .gitignore --- .gitignore | 43 +++- pom.xml | 16 +- .../WaveletSpotDetectorBlock.java | 239 +++++++++--------- src/main/resources/spot-detector-block.png | Bin 0 -> 19179 bytes 4 files changed, 163 insertions(+), 135 deletions(-) create mode 100644 src/main/resources/spot-detector-block.png diff --git a/.gitignore b/.gitignore index bf678dd..57f16fb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,41 @@ -.idea/ +/build* +/workspace +setting.xml +release/ target/ -bin/ -.settings/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ +icy.log + +### IntelliJ IDEA ### +.idea/ +*.iws *.iml -.project +*.ipr + +### Eclipse ### +.apt_generated .classpath -SpotDetectorBlock.jar +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +**/.DS_Store +Icon? \ No newline at end of file diff --git a/pom.xml b/pom.xml index 09473f6..09d1871 100644 --- a/pom.xml +++ b/pom.xml @@ -7,13 +7,11 @@ <parent> <artifactId>pom-icy</artifactId> <groupId>org.bioimageanalysis.icy</groupId> - <version>2.1.2</version> + <version>3.0.0-a.1</version> </parent> <artifactId>spot-detector-block</artifactId> - <version>1.0.0</version> - - <packaging>jar</packaging> + <version>2.0.0-a.1</version> <name>Spot Detector block</name> <description> @@ -21,6 +19,14 @@ </description> <dependencies> + <dependency> + <groupId>org.bioimageanalysis.icy</groupId> + <artifactId>ezplug</artifactId> + </dependency> + <dependency> + <groupId>org.bioimageanalysis.icy</groupId> + <artifactId>protocols</artifactId> + </dependency> <dependency> <groupId>org.bioimageanalysis.icy</groupId> <artifactId>spot-detector</artifactId> @@ -30,7 +36,7 @@ <repositories> <repository> <id>icy</id> - <url>https://icy-nexus.pasteur.fr/repository/Icy/</url> + <url>https://nexus-icy.pasteur.cloud/repository/icy/</url> </repository> </repositories> </project> \ No newline at end of file diff --git a/src/main/java/plugins/fab/waveletspotdetectorblock/WaveletSpotDetectorBlock.java b/src/main/java/plugins/fab/waveletspotdetectorblock/WaveletSpotDetectorBlock.java index 2b51f70..fb6d307 100644 --- a/src/main/java/plugins/fab/waveletspotdetectorblock/WaveletSpotDetectorBlock.java +++ b/src/main/java/plugins/fab/waveletspotdetectorblock/WaveletSpotDetectorBlock.java @@ -1,70 +1,91 @@ -package plugins.fab.waveletspotdetectorblock; +/* + * Copyright (c) 2010-2024. Institut Pasteur. + * + * This file is part of Icy. + * Icy is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Icy is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Icy. If not, see <https://www.gnu.org/licenses/>. + */ -import java.util.ArrayList; +package plugins.fab.waveletspotdetectorblock; -import icy.plugin.abstract_.Plugin; -import icy.roi.ROI; -import icy.roi.ROI2D; -import icy.sequence.Sequence; -import icy.sequence.SequenceUtil; -import icy.system.thread.ThreadUtil; +import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.bioimageanalysis.icy.model.roi.ROI; +import org.bioimageanalysis.icy.model.roi.ROI2D; +import org.bioimageanalysis.icy.model.sequence.Sequence; +import org.bioimageanalysis.icy.model.sequence.SequenceUtil; +import org.bioimageanalysis.icy.system.logging.IcyLogger; +import org.bioimageanalysis.icy.system.thread.ThreadUtil; +import org.jetbrains.annotations.NotNull; import plugins.adufour.blocks.lang.Block; import plugins.adufour.blocks.util.VarList; -import plugins.adufour.vars.lang.VarBoolean; -import plugins.adufour.vars.lang.VarEnum; -import plugins.adufour.vars.lang.VarInteger; -import plugins.adufour.vars.lang.VarROIArray; -import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.lang.*; import plugins.adufour.vars.util.VarException; import plugins.fab.spotDetector.DetectionSpot; import plugins.fab.spotDetector.detector.DetectionToROI; import plugins.fab.spotDetector.detector.UDWTScale; import plugins.fab.spotDetector.detector.UDWTWaveletCore; -public class WaveletSpotDetectorBlock extends Plugin implements Block -{ +import java.util.ArrayList; - enum detectionMethodEnum - { +@IcyPluginName("Wavelet Spot Detector") +@IcyPluginIcon(path = "/spot-detector-block.png") +public class WaveletSpotDetectorBlock extends Plugin implements Block { + enum detectionMethodEnum { BRIGHT_SPOT, DARK_SPOT } - VarSequence inputSequenceVar = new VarSequence("input Sequence", null); - VarEnum<detectionMethodEnum> detectionMethod = new VarEnum<detectionMethodEnum>("Spot to detect", - detectionMethodEnum.BRIGHT_SPOT); + VarSequence inputSequenceVar = new VarSequence("Input Sequence", null); + VarEnum<detectionMethodEnum> detectionMethod = new VarEnum<>("Spot to detect", detectionMethodEnum.BRIGHT_SPOT); VarBoolean computeWATConsideringROIBoolean = new VarBoolean("Compute WAT considering ROI", false); VarSequence inputSequenceROIVar = new VarSequence("ROIs from sequence for WAT", null); VarBoolean force2DWaveletVar = new VarBoolean("Force 2D Wavelets", false); VarROIArray inputROIForMask = new VarROIArray("ROIs for detection mask", null); - VarBoolean[] useScaleBoolean = {new VarBoolean("Scale 1", false), new VarBoolean("Scale 2", true), - new VarBoolean("Scale 3", false), new VarBoolean("Scale 4", false), new VarBoolean("Scale 5", false)}; - - VarInteger[] scaleParameter = {new VarInteger("Th. scale 1:", 100), new VarInteger("Th. scale 2:", 100), - new VarInteger("Th. scale 3:", 100), new VarInteger("Th. scale 4:", 100), new VarInteger("Th. scale 5:", 100)}; - - VarSequence outSequence = new VarSequence("output Sequence", null); - VarSequence denoisedSequence = new VarSequence("denoised Sequence", null); + VarBoolean[] useScaleBoolean = { + new VarBoolean("Scale 1", false), + new VarBoolean("Scale 2", true), + new VarBoolean("Scale 3", false), + new VarBoolean("Scale 4", false), + new VarBoolean("Scale 5", false) + }; + + VarInteger[] scaleParameter = { + new VarInteger("Th. scale 1:", 100), + new VarInteger("Th. scale 2:", 100), + new VarInteger("Th. scale 3:", 100), + new VarInteger("Th. scale 4:", 100), + new VarInteger("Th. scale 5:", 100) + }; + + //VarSequence outSequence = new VarSequence("output Sequence", null); + //VarSequence denoisedSequence = new VarSequence("denoised Sequence", null); VarSequence binarySpotSequence = new VarSequence("binary Spot Sequence", null); VarROIArray detectionAsROIOut = new VarROIArray("detection as ROIs", null); @Override - public void run() - { - + public void run() { // test if input sequence has only 1 channel. Sequence inputSequence = inputSequenceVar.getValue(); - if (inputSequence == null) - { - throw new VarException("The input sequence must be set"); + if (inputSequence == null) { + throw new VarException(inputSequenceVar, "The input sequence must be set"); } - if (inputSequence.getSizeC() != 1) - { - throw new VarException( - "The input sequence must contain only 1 channel. Please use 'Extract Channel' prior to the WaveletBlock"); + if (inputSequence.getSizeC() != 1) { + throw new VarException(inputSequenceVar, "The input sequence must contain only 1 channel. Please use 'Extract Channel' prior to the WaveletBlock"); } // inputChannelVar @@ -75,38 +96,26 @@ public class WaveletSpotDetectorBlock extends Plugin implements Block boolean detectNegative; - if (detectionMethod.getValue() == detectionMethodEnum.BRIGHT_SPOT) - { - detectNegative = false; - } - else - { - detectNegative = true; - } + detectNegative = detectionMethod.getValue() != detectionMethodEnum.BRIGHT_SPOT; boolean computeWATwithROI = computeWATConsideringROIBoolean.getValue(); // copy ROI from input sequence to the computation sequence Sequence inputComputationSequence; - try - { + try { inputComputationSequence = SequenceUtil.getCopy(inputSequence); } - catch (InterruptedException ex) - { + catch (InterruptedException ex) { // interrupt process return; } - if (inputSequenceROIVar.getValue() != null) - { - for (ROI2D roi : inputSequenceROIVar.getValue().getROI2Ds()) - { + if (inputSequenceROIVar.getValue() != null) { + for (ROI2D roi : inputSequenceROIVar.getValue().getROI2Ds()) { ROI2D roiCopy = (ROI2D) roi.getCopy(); - if (roiCopy != null) - { + if (roiCopy != null) { inputComputationSequence.addROI(roiCopy); } } @@ -116,73 +125,63 @@ public class WaveletSpotDetectorBlock extends Plugin implements Block // create UDWTScale Parameter list. - final ArrayList<UDWTScale> UDWTScaleArrayList = new ArrayList<UDWTScale>(); + final ArrayList<UDWTScale> UDWTScaleArrayList = new ArrayList<>(); // System.out.println("Block debug."); - ThreadUtil.invokeNow(new Runnable() - { - - @Override - public void run() - { - - for (int i = 0; i < 5; i++) - { - // System.out.println( "Scale enabled #" +i +" : " + useScaleBoolean[i].getValue() ); - UDWTScale scale = new UDWTScale(i + 1, useScaleBoolean[i].getValue(), scaleParameter[i].getValue()); - UDWTScaleArrayList.add(scale); - } + ThreadUtil.invokeNow(() -> { + for (int i = 0; i < 5; i++) { + // System.out.println( "Scale enabled #" +i +" : " + useScaleBoolean[i].getValue() ); + UDWTScale scale = new UDWTScale(i + 1, useScaleBoolean[i].getValue(), scaleParameter[i].getValue()); + UDWTScaleArrayList.add(scale); } }); // Perform detection. - try - { - ArrayList<DetectionSpot> detectionResult = waveletCore.computeDetection(true, UDWTScaleArrayList, inputComputationSequence, - detectNegative, computeWATwithROI, force2DWaveletVar.getValue()); + try { + ArrayList<DetectionSpot> detectionResult = waveletCore.computeDetection( + true, + UDWTScaleArrayList, + inputComputationSequence, + detectNegative, + computeWATwithROI, + force2DWaveletVar.getValue() + ); - // System.out.println( "ROI Mask : " + inputROIForMask.getValue() ); + // System.out.println( "ROI Mask : " + inputROIForMask.getValue() ); - // Filter spot with ROIs. - if (inputROIForMask.getValue().length != 0) - { - ArrayList<DetectionSpot> detectionResultCopy = new ArrayList<DetectionSpot>(detectionResult); + // Filter spot with ROIs. + if (inputROIForMask.getValue().length != 0) { + ArrayList<DetectionSpot> detectionResultCopy = new ArrayList<>(detectionResult); detectionList: - for (DetectionSpot spot : detectionResultCopy) - { + for (DetectionSpot spot : detectionResultCopy) { // Point2D spotCoordinates = new Point2D.Double( spot.getMassCenter().x , spot.getMassCenter().y ); // spot.getMassCenter() ROI detectionAsROI = null; - try - { - ArrayList<DetectionSpot> detectionList = new ArrayList<DetectionSpot>(); + try { + ArrayList<DetectionSpot> detectionList = new ArrayList<>(); detectionList.add(spot); - detectionAsROI = DetectionToROI.convertDetectionToROI(detectionList).get(0); + detectionAsROI = DetectionToROI.convertDetectionToROI(detectionList).getFirst(); } - catch (NullPointerException e) - { - System.err.println("Error in spot to ROI conversion"); + catch (NullPointerException e) { + IcyLogger.error(this.getClass(), "Error in spot to ROI conversion."); } - if (detectionAsROI == null) - { - System.err.println("Can't convert spot to ROI. spot=" + spot); + if (detectionAsROI == null) { + IcyLogger.error(this.getClass(), "Can't convert spot to ROI. spot=" + spot); continue; } // System.out.println( "spot as ROI to test: " + detectionAsROI.getBounds5D() ); - for (ROI roi : inputROIForMask.getValue()) - { + for (ROI roi : inputROIForMask.getValue()) { // System.out.println( "roi contenant: " + roi.getBounds5D() ); - if (roi.contains(detectionAsROI)) - { + if (roi.contains(detectionAsROI)) { // System.out.println("contains"); continue detectionList; } @@ -200,10 +199,8 @@ public class WaveletSpotDetectorBlock extends Plugin implements Block { Sequence binarySequence = waveletCore.getBinarySequence(); - if (inputSequenceROIVar.getValue() != null) - { - for (ROI2D roi : inputSequenceROIVar.getValue().getROI2Ds()) - { + if (inputSequenceROIVar.getValue() != null) { + for (ROI2D roi : inputSequenceROIVar.getValue().getROI2Ds()) { // System.out.println("roi:"+roi); String name = roi.getName(); @@ -221,52 +218,44 @@ public class WaveletSpotDetectorBlock extends Plugin implements Block // output detection as ROI { ArrayList<ROI> roiList = DetectionToROI.convertDetectionToROI(detectionResult); - ROI roi[] = new ROI[roiList.size()]; + ROI[] roi = new ROI[roiList.size()]; int i = 0; - for (ROI roiCandidate : roiList) - { + for (ROI roiCandidate : roiList) { roi[i] = roiCandidate; i++; } detectionAsROIOut.setValue(roi); } } - catch (InterruptedException e) - { + catch (InterruptedException e) { // protocols process interrupted Thread.currentThread().interrupt(); } } @Override - public void declareInput(VarList inputMap) - { - - inputMap.add(inputSequenceVar); - inputMap.add(detectionMethod); - inputMap.add("input Sequence ROIs", inputSequenceROIVar); - inputMap.add(computeWATConsideringROIBoolean); - inputMap.add(inputROIForMask); - - for (int i = 0; i < 5; i++) - { - inputMap.add(useScaleBoolean[i]); + public void declareInput(@NotNull VarList inputMap) { + inputMap.add("input-sequence", inputSequenceVar); + inputMap.add("detection-method", detectionMethod); + inputMap.add("input-sequence-rois", inputSequenceROIVar); + inputMap.add("compute-wat-considering-roi", computeWATConsideringROIBoolean); + inputMap.add("input-roi-for-mask", inputROIForMask); + + for (int i = 0; i < 5; i++) { + inputMap.add("use-scale-" + i, useScaleBoolean[i]); } - for (int i = 0; i < 5; i++) - { - inputMap.add(scaleParameter[i]); + for (int i = 0; i < 5; i++) { + inputMap.add("scale-value-" + i, scaleParameter[i]); } - inputMap.add(force2DWaveletVar); + inputMap.add("force-2d-wavelet", force2DWaveletVar); } @Override - public void declareOutput(VarList outputMap) - { - + public void declareOutput(@NotNull VarList outputMap) { // outputMap.add( outSequence ); // outputMap.add( denoisedSequence ); - outputMap.add(binarySpotSequence); - outputMap.add(detectionAsROIOut); + outputMap.add("Binary Spot Sequence", binarySpotSequence); + outputMap.add("Detection as ROI", detectionAsROIOut); } diff --git a/src/main/resources/spot-detector-block.png b/src/main/resources/spot-detector-block.png new file mode 100644 index 0000000000000000000000000000000000000000..fc0a7455a4c58ab68ab497d0e1ad058e45c28cc4 GIT binary patch literal 19179 zcmWh!c|6nqAD4zXVrf_`rWT{+YB6$67ITyP7IL4t@8)d2s3}E`5JHZ~k^5|EAxUz_ zFw7BhU%&l6kH@w@w#Q?i<Mn#IpV#||fu6<%Hhwk+28IhbO?4ysr~Ut5Kt}qz*Wn)@ z1_rGfoI1uhBwMFt^d<Zt^a^D9^?#aq7Sna*yKOFE9L#soT~K`7JEgh&0M4BnuCTFo zhrC_4JukEHAhYMf*BPIyUIeLf#z;c~^!GmItXHo4TbL~Csyl@UeJI(AT|q1sH8q!s zQ25$sPS#szPVn{?yxmexK`+P)YWaVTloK5MpnGAhii6j2YM`F_H8>8ABNQMw?qWbd zJP_Zp7l{EmSq#*C+irmYw-hxDpTmHJf;luNJ_e36F%ctdMcNsH4Z$VDZlA0xM`@{) zKj>WQfs>4dr6o6Dc6(4oPWL_-OY&13bc7TSxx#=o)zyDBqW@`NKyMI-CDDf^CsAi( zwJtYq+|bWcKABI~2Vgq<T4pwa6|Uf62H-0k%tSa(GS+6a5b?kw!{L?UAS)ihn+(T= z<+?0=b~yU-v7`VAY<YU{No6M;QMAaqb@S)Z<F%Y1-&`sy9)=@2yfP~7sd?{~l}mMi ze3tqTN#^L@Z_6td!+=6_9U=FIQG^0RaFH9E9m(%Mm?k6vNBpap=WGEb)gZeSy7ZsH zS<CMYe?$-*Aj}wpQe!8Jdxp=cp@ahK(K;^ytRWG85zw~{jp9kA5DGMj&*7{X5D}h_ z;0JWtOZ^@n=T9T;ulhq>6a~BYj@pF!E0JV$>RphNqM%jA3u<T<^o;LwzW4I|;iNT4 z9V>THwG4OeW<kTrek`no63>_2DEJ2tdxOw2e2yRx3JkzZ9>Qe*Qe$y2n;|%b<Os%I z#}O#63J@92u`pj7KCGc3I34Z>Ws#-dKSDuA!Cys5AS2e$B10I+r~*k4PNmRjG#pW< zWVooP=wYoG+5dw%2fjm!g9vxa`s|kt142m@bdU{SuF(4{-BN`^2;KWLdmB^D4b9ET z1xuS=C8gBRrpoZ#m&I;SQdaThgw7fy$?q>Y9iH#ThIxk4y(=1Ud-Tx>IQfG=K6kK- zD}tJsa3;xdmP)NWyvXCisnz3`4W~aFl<ra6pwzcdkEj3)u={%rQg_&TG^HSkf+oT( zGO&gy91%gVw|ncx#v)FZ!NdOeu*KuyxTZ?0jNTgLssRyRi@c?Ki!4Kg%gM?DFj5?a z#^NKiolg6h0)*mCj&8lEd>HWml_#62^RPi99WD>$w5l+LB*b>cz<^oBN`tk?8$f(| zovI;9cNj_jfx5z(7@C`>6rMqm2VenDf~`qQx;(ZiPkvhO7H#ZzPSpR>l#$2y#oYr1 zvD}RkExNL}Us&QMPMBL<e3;?v0I963d;pQ<Px+JJ2dy$KcYtISv)+MrOM$U&S;Yu( z!c~s$klaKH{ogy-bcZ1cp}8-qpUTQ03FkmyHYO-(VlC*CwFvHqU$$wv^F$B`klsh{ zO2xs*8Ln=S-epzDv2!lf52`P62}fkuu)k055|ZDaiO&>2BHZ`>d~|zi-X&7y`zl1) zoSwD9L&X8C-nCZCi7Nh~gj=6@J~I-pB{?Ne-d+E9vNT1F3hq)FB$LvTD2-vQoO!=% zkUl|77#LY5+Y5}<C>#n=+>Ol3wfXC&mn-}KPU;XEM#ZOhNpWC63_8_Ri;Rj<T4?Ux z(Mg|^5t7#rs-mFaUT0Z@)GxW;Ed@z<eC6wQ3#}=Y!Z7#NjX()$n7EQg^6>Bo&7~K< zbEX5N)m9S6ol2=e4x=gz5WY~k96d3D5qP1IZPpwk?u(WjmND!~nXHC)TMjo<cQwlS z6JVY?G8zy$kU%1P549-8&T3|2S}s1I6?!qIhX`*C*;F$zF$7yx@Zw=*Wmkc7P2MHL znR+D#_wBFs`00QE*)mweKeb&a-G0?x6MK=3gXmP<;W)MBBV|t|D5((PZ}SocG{4g= z^#=UAUe^$uN=a~dRoo|~^TGThk{oFB|8{5X2E75LnnOwSO7~*zt~N)0tyvwE2-yWZ zVP~^@uKi5t9uAztx~uQiTH5kMT?rh)fzc9)JngeQ)*hHB%6NNE^~NyIw)4`|ieT>e z)E!$`F0~LbJ~6@G?Hd_+GS{0t<=rr|A&MhXLuHyF37t}&3OQGSU4Br{a>sY<-3UU= z<qjb~Xd>f$s30CzJ^H4t01@V&q)F^~$VaaEe}k~QLa@)Mp$GzfQdc`q(4QV2W)I15 zwg6+ZiZ24rrKP}9Gug0)p}87{>csf~1*Ok{__yZb1CENFrDCy$uYw-_Xr1KGUKXr? zE+z58fVZBX?Yj)6kmfn1XO_PbFn{C6bt~?SP7_#FU_TNB1clB`)YFUO2o8MU=y)xa zl9O}Aoaz4y1Cy^bM{Kbhju<hM7|-DP2c25Hj845tzKSDK8rAX{<mmI)Gd<mo8-O9g z@vt60XoB!h*l&7~bT59b;aCYnH;cc}`e6PqQiwsY{t+aBqx(DR!r)yH;Ln3p3Ut)q znf{4RLts(qy!*pS*Rdl*>ceu46{n<kBG)b$|HB;IIXmjyvztGo?Kydrq9rGIzBYwa zTaDidF(^-y_v`h4GUQ6Xi>oUzprBINPxm^-!SjE<)gXb4!>Gsi84g8o4<>@ZSTI(a zquUQUxQ!sFU5UR-KUGj~`hC`StQ~+GGJ<JWNPRW`6(D}gfU(cuVmKq&W+w|~{vl7< z@{zJ)H-nwMy}kVTYe2?Hws)Qx&IJg6MZW8XsnoEUq#vNxOlOs(Ra#ins|2T>1<hrP z(to$Ehl%tk`|L>NXn7!U55T|jCRYMH2hW;osUk&2p+1s1dTA=<6tu5VOiaDy%?Cl} z!XHAIQ)9d);J5<BN|VGNCX!zPq6W#HsGYH(Rm4cT@KtECnu0d4_=CKYdcGkJ2JDt{ z%VKn7&;zEi)pM`fsoo>P%STpRQ7b{sf8T)s7(+0p4H!GT{QT_~_gbxI&xap9xRIan z<ZpskWH5KD5a5B1Fwifp9O{|f@7>t_w>&2{?rWY;c2h31&}#emg~iWq^-({g3@V~b zDxyx7l4{=T8}Bp{I_q5^%)ocl&}vXtv3%+^!h_nexD-_)JewU#vdG}UUR?hkIEB(p z?k#}hT5Y)ol4wn;#f6BgKt|s2dawT%H=`yu;IZ=<lKkfuL!TN5;LdBnf`@^z`EHiO zAN!mNXbRAGA@niEpq;s3@rP->hkg0`b(>YB)+r|S3>NrO358vfz_veSkG^3&E;glf zO?OH;jf;XV%or3b8avbw%2`WmdH6`0BN5~4B6INBzFLFWUS<qLcP#iH{97Kbq^+;7 z-!lwoF?2D5BvjH;?-fdMY%3<Fr8>MqH`@o=JD%Un)Dg+0;)nq4OgL+TLp3HwLBp^| ziX-Ob#!-gzO$iBqsGMNhwj#^exe(7R5ggHAd@xU?y{YMtB6Rk9@1(bv4tFT%)B?@X zI;sC$vn0T5th~WoVH)9y0qI}cpTVMeOI+}p@*;bycL~Q6+`A^5I$Q@Cp}rm-&8u0T zHX2bU#B`zUV-h&f4}IL`X4Dp4G?h{N&Dt(noV<qY)-K|PA?PdilUaKgi^Zd;59Y=u zJl+BzfD{jmd0#o35v~3P>u|(id5hz`I<piz!6w7mp#2RuHIy@nU4xZP$TJ0{dt0~A zO@UA#=QHh^#r%Av2Khab#4Vc4ngF}N{{(bKymZo`dj|i{n}zi?Yu5K;lKfVC|LrK! z@qy#fME!j*DDS!zc+8BjzvbS&w-gm!Wi3dqNuXGjjVDpA+eF7u^m+Nxd$HDFETS*A zla525g5P-HVedxV>6nJZ_!;mWsIt%`k>F5d^uz%Ix*#ARfYPNkMXCL*LEhj^7S-X$ zJVlc2Z9;M-!EDu8qB2a?(5IZgq{%h5RdgW3Zd5+J48VXAE+*u=8!AngVg4&dbY9x8 zP&}pDZb_;+-M$9R9($;rhsroR4Oos3Fcpd%TpuyXk3KkDuecLE<9hnu@=DIk`;h5U zJq<Cia{9uV6)0Eit91Tm%esBX@INt&&$Y<dYYeNg6!g9V$6Xw8OHoeu5-F|y0x7LQ z01rc_N=isDrU1(Lu@~{Mov<9|vF`4>BtO0CzP%H4s>2NCwgK4L+dH)YF;V~6<!(RY zj*CS`Ss9^#zO+(8KA6W%vAjQQG+xL=_AU57p&p=944^lBnQZ4Od^`%H$8g^FK4m*f zi=U{QoaS-wVV`J?1dE((hd1Z>A16=vJlbg080crhJWb5+*=9ji9G$-C?oKT}Q5gJy z;QxEvR+b^PdPTSSLwnl!s|+;^PF;?PO&$<t`<po8AD=e}HePN`jqmGkc3AO{G*XTp zsorZ}6x7jFDUcwYV^f11b+1F|=6ASdF<Wv8av<~>Y(SN&?hJprq|~3b!1%O!x%-DI zY5eEUC;Nq^WJftFo}PYJ+HlsX{K)n-x-38Xu9hU0*-%&E<e|$^vD;bq0y#(9j1B7Y zS|rUO&|)C+3<Eh#*vwg5OQH&W>vzt$t;=l#zLl_faUMYig4PY}^!E{8ZiI9(j2P^f z42unJqf@z<&*xG*MUyG7C}@ie-C@s$2~{s5{IT5<dLTd{zMF9#@)v6|;{S<*WB>wy z3jCl)ZCtk<LPO<oM7@%0z^;`Q@op(mj`RhKyTha$KQ;J1_e#6Ul`}ulvIXO$+2*(V zc7#=ZY@t%`3eXaxOCAVl=&DY!oKo8w>cl9-0v}VQ@qevHQ5>kj8zb(HZaA_`fJ|S> zFbTRB;CHcPnUc<xap4c=Pd@WEFyNc)$0GPSZtOD$NVU!%3AI2+3*N81go54&&nS(y zRV*RjYE~yFtv^`{awcXKTV&KVHE9u@@(uRKN84m`^cw2x8NyU;hfwsg3Q<fr1jdz{ zBk7C9sGof9b&IZ?Fuz=1xp(`6Ues2%;(0J0XoriBw!tZ5MSlTAfgHjQB)f*cEjIc= zT__*AYl8Bn>?Ax|r)Sr_YsZXzvwdv@x<A4(+bxDwM?e`_-K(isKt6qBUS$+GXN@Kl z&_NPDrr2%YY-X=>6OTQo2H?1$cys?M5RV`*#GE5ztnjK#0~Z!H8pQ`WCaoI0Z{EDw zX_x!OUP_vilM|9)VQZUEvT)QUJJj`)tGg#FPAt<fc>CXA#M(sVb@jKMBhmNm4o1e0 z2iR8ZIUig@cgb+*4nc7>BV}K<OB8YrW~JbL7qM4_HRW){mEqpOdmdBXI>SQJ-#j=j zT^7;jCj0$Wr21wLJc54Yz{CC?&}p0VW%WWhuG;xe1f2@DFt-IkS&r`lFsjKNS#&&) z(!EKhW2q2^R7%XRc(r_^QaTFx81C%M6vMm{2}v-x*BQ=4yK4yM=<aCJu89+|Kz9B3 zDKeu~8=dJk191$szSHI2UTPZMW;E_y!=&)`q~iiETOIVgqngfjM#_>MsLfLsChm28 z7fd4qYch)WfBmv*ZWeGmWXB!yBplpoAP3t__-PW<q>wt?jG7k+1%IBh;~8QuFfyL< zyuAxa$fZ7h#&*c-e(6<3;ZRb+yZCq}iwsO1-l$WGg8}0C2y_{xYu6O8{4MiVjvjS+ zxCBX-kdVlY;e^D{XJ=M19XmfL{sPbL>Fyytz#tuex>cQNq_5qvNOEeh72Y`JNr)DM zG8@0Xon9|@dAAT<I!dee@@T3=Xh{i1zo&(7ZwGH5j|YUU@6fiksf>iwxsaE|(c%P^ zYe|^ga*GVW<J&jt;?>R}b7sPS{L$>tI=7H`?L7T-FRn^T9XtkgyW{UarjVYq#W6K{ zba<<Fc5G;X-Wni~l9E-GmAQ9<IZ2z6ZTk-t1=HbUYeBOUxyq3WIePT9jG;w#2oHPu z)u`~tQxH~Sao$Gv>~#NchLW?<`sK*&p@R)Y%hr<vK=Ne07A@C>p9Cf5*uZhj4z9W) zmq_wmes&-O!VjVoslH*m#YQ~xDo|*)aX^Z6)lVVNB}z71pxPCvD)g?|z|P*#egp(~ ztkM;HKAjoNk{B(M8FR$a#nWBAx!NW5-W-X4!%}=6VOljxKRR!&?t~>cp!hEsf>jQe z3h9SYDGJKTicg}Lj|PIVRNln`gi&ab<vR-^C0l9btaF{b9h7}BS;L=FiyaA>DWA=p zRC3vY-aS?)(re~ce>$nq%`%tDl<>s5VX#I;f>#vfWg-s80Kp3v5?|5iIN@GyL*SLn zKF1hE|3%crKW;D}V=^P?{5xv|I5n^1jG?uX7DnfvXqW^DVF)fCaVNq>O;H`cK7Xb| znF`Z#0|X3smArMZO&$I9s|GnSG4WbQ#1C3tW?5lsGpb8;^6}9h4a}u>ODQTS94ZOF z&xpr=hrKR+1<jrIo|%@`mzTz8Uw%Io8rCpxa#?43u3z*uRXO5#Db_o<#CVsw7-HkI zmnI3u@?f8-U%Wd6!};g#UF><?SuPGdb#)q()d1BLJmrX;4Z#o@M*}^Z4NDDBIrH*< zj7r~u>L7rnv9J3Z%X2gq?Z?G#^!m<Gy>Y>u5eY&`m5qp_q)@u&#Th0gam1+hjZi^* zUn0B!(bW{^@MT-kmx)l|N>G+4cE!Kd6qYo9|EakqaQ_#ryY@byPe8IPID8{Q^H{h| zEr9vRO9b0~kdi>*jXtt?V1+4q4+7l2pNi}@zVQNry-6}8&VTg{8IS_$Qp|sq87mhq zha;2yCN~*{zre_ceycJZ;snpqIEB<IH^9IAn9=OU3?x}im>nNe@J_3Un<V`upt`3s zkx7W3-#kWFm6JUlPeD(4^Qm5W_i5vZevquLk>4;ap*bOa)v@9)2=uw6R6Zh3{-Ci| z|0~n=zhCmTXUB)>^EyVGPvbK})|aQW_pf{sV{tMVFlH__2k6}jP`CyycHYdu4*#2+ zoRk)s|Fm#a;5Cz_Gp$dog@_m#FCBG9*_n>S!R>|vvf!QHFudWd7cwe%lb?I-5uMbD zfG;;<SkW*H2y}L`6`4mpNJ+WyC*<|(*KS#QBA1@BXBCI$njv{#zI;jNI2%Xwu}EUO z$3Lm!tM}de%_p5<Kr{PkT6GUyJt7pa^GU><*;Kyx08A^ekH}YvYG1R{Gy)%V+g*#^ zHPn?4Cn0(Ff`bd;%F%}b&mNvGQdN9By=*RFKbboLuWH}NfLWoz_>TJbjD#o%Nkxj| zk=rs!&PRlUa(Fs<dYUs@b!&#J<{OkF!lKQ(D%!(mBPXaiBEU)N+u+NL+zhR_va-MM z{1T3V^RKE6h-rC!?<ZK8zdz}6f;@C^$hVe=Eo}Sn;X_lC0)#{PVE&Sc33YLCeX3cG zKSj@y`27W)aZ1rwiI7|tZHBLBxGT?{$F`LQw|QU1rwj}1Hhl<OSoVFSCJh+2s!|fk zu;tYzp7D4<{Jw~kT2?+q*=z*3LW51sbZ10;t(`1XfW8T02)65FGph=#`ZX`lV{h;E zTM7AJ7Z8M9&pQy#LG(aF#92u}<4S1s_YF#XmtKCgOV(ycMB7x`tsL$@QZdCW`Mzp+ z%=IDE1+T#eAAmC)u)*!)m6a8`j7p+NzY~4R^nLbRkX)wD8yZ7AcZL|p-QN{|nc^5? zbX3Ex4$S>dv3Q=MA8+~S{ml!ys2g1D!O@lz5ix}n*6lvY+99!xZ^b`6p@7GK7yA=) zIK>EDulp;#E^)+4ecNBs?A;9e@I~g^NJT}H+v!@)9sM$sv6{F(_>%%o%yIwtc)NeL z51>;ZcP3k>k~8sa<He13Z`n%|l_{jNw<DI&w6q;Lu>I2aJmcV{m3Ors3ORVys!`h0 zJN6c)8P0@)02`K&>8Yuy@p1f?ieOrvV(46x#QvwI%JU(ZaxO&}%m9F4aFLfduC>Ls z+M0dUI(wJ)<)C$?q}_ZU`=7$kH&SQ8@hS)8fkge1URS)mc~f(FbDPoGx=Wg%w8}xB zonpkkIw;DhD!sqBtjrsdfVy(+%ckkSNLk=K{4&eA`=!}lvbv)?NNtB#=HO>jQ~u?F zjy`E!n<p<`JS$7cHS5?sOcCH(T#S0;>udeW!LEa#`sgwmrG7`xvbZBbHA0Ix-z4$e zeKfFSxOC%aE$C=z=}XP~A=kHV{2{TbOdUmW>!3Gu#Wjwx%8ft4Vdq{B{0ofDfX!J^ z)~PFzZ{s9rmcn@_HQ+Q{W%l%-y|d@yZR_`G8H=CcxRlSdlhb9r62G&k%?0f==jacO zzvm9PMAC&;=}2%|S&m-}Nt5HxFR=Em<MldPnhJilv%^N%;z*Bkh$+x2@{dAUj?GYO zzUAdb%d4Ep=uR#F3n<*&@rfEHE{Ns^e|y`R!Q6O`3eMtvq1C(HvKhj$0PU{swD;9% zVq<E=xfVTMWnlH5*maVj>)mR%L_4@V09V@nudtRIi&v{=IM1SO5n$I0&JzOxciZ_o z{f+2=Z5NF#&5y4>4GNrXx9hbZAP@Gp4%*uTmwS)>8>}t%S{kfw2Kwl)?5t`n6qcLS z`5zdyM<4dTPBEqZ=j8*_3>69Z;$Al&IszB-^3)mrxEA`Lg7=cTcNW#FS(e|h$u@=3 zYP3A;e)}r$S+T(O_6=?A#||Og!kqn=t7TxX&QB)7aTricEtoByu5|+$jZaXzbUB9J z;ihJ0o%2;A?ikR2_pU)noq=8r6X|_`2u)Zz9Jd=rmjh`#3cgo=zqaqaoNy7|rcTB- z{Tx%=-<le%XcBbN+}2(nJd30pxBh$66If-F1A8|n1ShHsYvvYD`5#oV#YdZ!GnME? zo-Hk{P)J-(2kka3jgQu{=*axHx1>_|=eT@175&X)`j>@MQ&fW5h`Ua{)abJHQLkhG zX<3&4MtYwT>42oQuv&Vber0-~mg#W?G#Xf##8ArG&x_WAeeJj<t2^umCD(L>Fr9%> zob%6$hsFNU7rh!UE5qkut-0_%oH0vS|DVkNNRIXlF%Rs?cq`&!smuOD1?+%uYjVZ( z)+^zs7f!b1>?BTRDZdbGZRU3hE0NR1^7o0?@W1;W%>-6mNZjwjw>Q4yNbFr(gAZ!Z zXyg5_7w+99RWBXxjEL&9wI46s$Ar{=$X5y%SzkT=vc1?)@0xW_=Ms6lou}6?*G|Lm zu>;WXEhNDO;w5wW;{<E>-`=a7a}$2h?*%dZs>iNb^<Dy6QILf1ALa8kPoml<*6>&l z3*NUq9V+;QJOn{iQom{c&(3@(y=4m!3;vfOpEm~yih>|s7tU!9{dLYux93RnTd@r@ zCjqAeg&N^H`+rv#R*sLyb^?pcQDLoSZTj*94T35X6;;&NuU|&(-O(D|ld$oZldH0A z{M)%a+~3>#r*&`DGUe#_(Y?_-FTO_N|FF*ea=O|U7Qea*!EJ>&Qrb&bG)K*@Xz*ZL zj9A^mz@#jiUhJC~2NRBKZ(3QopBEr<slpadsi6%M@%56f+OXy#BUW=6k{>%eyXcij zLomJUwiIV3Cdk_@rse0V&IMe;UL<X%EAn_|N45J*n1VIXgz#K_HubRUzf>TZx`~gH zKAp8F9^`C0(PmYKZo9WBbZrj!{xmke0kmz42#urA;C<MOdPJtwX5NJ5uCC4rA977g zTVrGB8b85-tG=N<<e(;M;cH4&ThrlOZ+WeYkac7A=*Gs{dI99~yA?Ff2>+CiH>#L6 zGd*$SofXyN$7NhsP8)YJdaaW|ueAT-wwYGW1<}2h3};Ll=<t^PiH^vncQY^zUufb3 zQL=x&0mDU>F18Hjvfp&n=xoszeWv`D8^-d?`SM`0yj%DsGvLDfJ=96bwdj8ATFaKn z+VSiQy)TJ9h@KyS-ZiOJPUdSkZWrBWZdpdR)RU!<JCVIoe{Z?Oy_Q=uWoN&e4KIYf z%U_xsAFnp}!pWJDr_57jJyt&2Z1_=*_8vLn-cng!`!(`o+bIIKzqvoaXJ=iA&>!uG zX%;4Zk(qnDc0Ne_)!P5P9UF<4`E8m+I8coUZ>pTAzo5$gMV#;;pHB84XIh9uNjZ0d z2kO1vEZV>5@uLG~dmp^C)Fppb-C-h9B>i`)SAhH@m2AB#4<J56h|i<la-PGX&DLG2 zq@?&p_-S2dhmFmM6x|7Pc9{J-JDcFpxUi)P?p{U(X2Vj?6Xu-8wp)IA@=+0G5;vDQ zF3p8FO_)P?x3hJJ6$x))<~>qxjpP#qCiIMVHW!OWmm^wd>}ruv%vDUtyRv4EyT;-? zuta;0jzyN2svv-gNq)$M#O~z)g2VqUMyz2j6?4cp&lAHJcb@JHyf>%os+OEr0_@)+ z2#gu|zc&+ZdtMv4Ri?wQ0<rXQ1LA#oC-&Vjjds6-(|$8m*&==H+Wb#DW82XRO~I$f zvbsX`mU`to{d|(^dL?V|@i(!ZUUx3_o|w}9cE)PIl)MkAZ>Tddcy1ORUKQSYuM{k- znFfzlG-GFS^Y$*8P+AI_LR{69VY^HA>q0M@@AiNFS`YtJe}xFYP6iH&A_#fPk^C|e z-`BeQTC63`>wKx<C=~($s@X(KSeLke-u`}Rd=+m^CmP$^+kBF?ExxmAg+nomLa7u{ zt=s>p4elCnIH-%XKXX5O>vQu!N7Xdy*YhY-uu|y<<H2oL>Yt^ZfUNP|7V1rlUzuxb z_qha-%8_B?d;OMcGcUCAa7KC{bOMjYwfqUCx9`s5_=}gz3k!ECq`ITMnWHW3+q!l+ z3Oi~b)MyG+G&?`Bl1A6D44;>{VZcN1%MUHuZTZAj$|`4m?pzqO0(Q@61a?e5ewa(w z8|UI2fNagi;xEX~uDy_ii&(=t%lKDZ?_`(0y+J4x?xO;h^0({i>k}O4PiS&xhUK<P z)<bSl#N!9@2~Fl<(wyy7^&7&x4y!jFpGgw7e~bPqrY+RHp<EzQ3=Ea6Y=4EdHZ;@^ zG_A8?UU58XY&m{6B=won%O{ydMD@$CVxCu2R4jwt8t7Vn=k)Zkz3(HLQcmVXv&xoF z{@3e}&BK{-!auM6YrlI_4}?bu?uJzsM_#~8Z?`-ecI%d6Mku^NJdlDggfrjZ@0PL| z#Tt5|_@9<1E^>v8q*6NEgA}ej-S{q6Wh_o8P-Wv&*nFe+m?c{&Jctfr-&TD4{>@3z z0d84Qn!DgZE?mCT{YtNgTJSIZ!LP4{sC8(-w`aI#^F`a#nb3{aA>aL_bp3jDLp4L& z3?`H77vD-ljwNF|kL_cy&om6fp)OD7k2EyM6{e31JP8W$Bqi*@@md3yvwWtGc#+ZL z;ytU1pptGs>k1?3D=cwgRa43w_!Oz*p=7=!_z5i~g%$sOSd4Z=>Y*#|6ZQFfco@(g zAag&gnlI)mPjYWmdlgN=oD5UfuaTr|?*IJ@%BCCUZ!W$qb8odx<lQbet74Ar3_%4& zzMQ=*1HUH1R@Jy}bIV?>OZa(W?~iUrf7SPYirwnc#+SbR{>2<C1(Y!v(Jp#xn(RC# z``>FWLF=grZMOJP0Rhb{5g<N=G=k6)NQuM%BipG>UPP!Y|L3l*4pgDHS&5qwQKWb7 z=Qb#V2hCaM#f|AwY*6xf0atnB);4-XbcpKqy9W3ax$-ljHnc_c`&mNFCA1akuN&me zmM{W1k^)Oo%m40*;^pO44IQBcYQCU56m(nS;2_jj@sBufGNGWcGCU*%4dJ*)H+5xF zyWYL|8YP<T+r4y0FG5uH8sG#>QZ7a$KXlG8aU;G7SZjQ+zP=W3Xe{=Uhd%mPSI|6z zcLIHVJ)%|a4cU2m*UQSKG37e9?rf3-=n4U0Yiq4xCTZ^1HnlUvx_J4AQ&)oUdgxCx zyHb>mXi_a?QDX=NR0H5H!Z9E<;xs$Hs?c@gXX%N1-M5<SgUx8UhR~gr4I65D&s$m( zO4qF1<jY<cKi#IBm!gLiMyv7^0?Q`W9zcTD#_Rg~`|lObhT1kvc*(vttF-R)o7`?m zZ?kWnirQH*$))x_@DtJ1MUtgCQoej|a%xhMne&g^k)AvI(>HjTaLtc9ExkwP<~xA} zdQOJ^^I=q-&UWXJVN>%FH7mii{LGia9JD!iJel29qnWk-^eqo|baziISH;q1VGCOO zzSQl|(70=}L1`m=Vqzxx<dCMJF-oEwI??^hMCU0*5-85-dGp$C;6!fJ-^Y&@2rvSn zY!RU_gz5^kdCF8tW8}b?g5Pu5jLr(c&UO1`drc?~(k~eHRF%)fWa{^C&EWu4vpqj% z_~Xe*B*M4O^1@yE&6DBQX1dNkH17|Jo_Uhxr`Soglbk|Wr)3m+|Im<9=Z2#+=*$lX zV#3X7%CO^0D_=K79gf#+d{{k<K2A$Bse80+6kh<C(Fei%wqqBZr?waKlwN!K+@aC1 z_^0l-Q=P>Ik9-#|q^fUXi_}~)X`%I%dD8zS4=-=uqX^yLxq(|6((Ll9vQ6{2eI3|h zQ9S)>A%!(Y;1!C&J`pDK-)4s)(fRT#!}1Y-o4sx>m3g!`il6Sm#l5qZ*jQf|6r_vP zckR#9(+*li2L}gg`S$z?%S~%TQrnZg0MbwdjkwlEdt+>SeDl*TZE<m~NLYqnN$66o z6jQep3R`4RJXS9VSpAO}0zde*HnH)7yl;16!Vf5Va4|4jO81EcmsUQa$N=UxzSVN- zL<Ff9S+*LKep8B$`ZUAkdu(P_spu~IXol+9tPGh%E4D~yK6eW<Kt?@r0ATYS_KPQ` zik8c0VYk4G>dzQ>m~~hVlfF;mYnU!ztNZP5+BX4G1qZib>kf_IP`a)<v0OP+d1-CP zT7#u}MlW1iub|<<>g!C$GL5Ojo)RM-Oy!Jd#%XzT>*lf4?eip2gSo$dzwarU7<M66 zxDq+>$oEx)H<8u#t&c+XxvZ>a^oQ|CGbxT|aOe8FR}wB~ib%7wEf#2ARR7atTi2A~ z>~rPHj_YAMJKsnDOsW2k?H>P38|w(VTev`exv{!_I&>Q4dn8-mrX0Gv`ll})mmyXF zIXc}eV`t>FIB&4+`%AUvZl!XnBaUdF%Hes<71ZmeDA!CU2gPo~%K<(<RWlookoxNC zjvD0Kj6!sM@qO*lJ8grX287ZMXXL9d{W@4ZItdTHmZ*`O)}wN&J->FetG9Y(&W-<b zmIEL)9hUSGes$32!S7}kmKkM*u;vLH6*OW+;bKA?BBQ(7H)P)g+U{WS()m7zRoJfQ z$>~W9tj*GTwNK_5oSC3?aylxg^6O=WaulrssVe}tkbD8;xC`v6GTrIzy)(7`u=&Kv z%S+vG!Pch}RfvkTL4?$P7M4wSY@fN)5#W#w<WNo0W4s^pkn{Z&l!~x9DpQB<A;59? zbzsk}ju|Q4Te{p~rUu#;O{L4x_EyNQGtbz=w3+-cZ9_ku@^)LN@Te4_7B4-<%&0y; z3(yxueIVY^f-mAsANas|(NpGDjbq4kM_{6&(B4s3x!Gjr<JKBAI<+HMp3Sl2hHYn> ziU#{jF;A~)4%TyVadl_D5PmY}B=zU(f>!OpV!uG^FeVwRWypq)Vd-ofQOJ6Ir?%~M zc2+nv1R||-5&Hu6<#q~$GZ7>iKP?8mw4_0I1@Wu7dL`dK#uVEZ4lzi2MMu;5(0Kh# zVAt_+#0T@qu`zixI>vh4Nk-VfSc2CtH@e|bNN;tNN!e<fP3ZPrvfUC9XoN-#?3w17 zyo!rBNokGk3)!0cw_KaTtZ>OE`1*3Vq+MnFY-ezLbMVQbT2T#*@UJ!e$IRKucxPum zLQvvnBpNEQy81nIox4Ywq}1x$*%YYF8~1ToIxt6*2<{Fb_(!S;q+~A#JS~Rc;kne$ zo4!6i;~N`w6EfW#Ea!a!>mnDv>f`MTM-I)>gv<n${QV~H88S8nKdn9Qdm`jAuj)e2 zAksw%nGjXtyuDNmLuOf-K?_64LtTIn$#1FVqQyNa4l9Y7)m6KXCuwpS%8{>YHrCaR z%{Okm*5H$TE*m^BTan|o-S6$}o?xF4C+wCLd_@B@B<kT2J6vM75Gn>d{WlfdXM_v3 znJcgQviVA9xFSBDr72Z}wY??6ylMl-?E}%pn_JlEE>gqwa{(Nbw!P`E0bzTTG!;vW z%Si=-0O154&8>PjLUS|c;MwZu3#K3-aWc@x29*0~vV7SX$9-+E#3CqSTeR|qx(Q4+ z4fX}sNmt?NtPg2cy|lNxJASM0mYf{RLWH8=T`CPC<8o0T!Qm<5$AwtOrJq5)sAtZo zDo(EtFNIw<b-gxs{7sPV4@7paBQ@sGY_T1I+2)|Hp>4-=@qx=fx;LU;ewNxGORlL2 zw*@?LM=5NypY={ohDV=_3N$yLO*C&z+gVwS?9_UAaNys>V$6maNf=&U^8~S>k0Y+D zKWTM|Tve^1m&jWZx_2C2g-<6?TU9c%2Wm<b&w_jBvde-*($DL5yB$)r79{<$FJV!G z*Jeb~sj+Uz1c%QQX=qXUn1qRmMaEiCbAm&*lTGKtc*TFayFpc>0%;_eY0RY<c~;%g z{Ng~JLg)RLU*D^=d%WC%V4kak_uyw(w70wZeQ~WCQnf<{5pa>|+^8$6+~js@yn9{9 z%1_tuqi@T@W<E0+$yk!q>hiz3Vw;~I1Bb2mT3#rg4Wx^X465u6|0_Q@(66!%RTA`3 ziB5eszkI(W<JV~Pi2IuVWH^l`m#Y$eHhVXKw+>eO9t_aTvi%V_*O#7Gy?TQ{aFM{? z#6^r2N$X@dClsV&FHLgK>xdB;8{+|!eLX*LT8mCwto+q??%YXmh*{ux{6??jeD0I7 zvfTi2f6rROXC8da1;3h40-B`y?`us~_FHLVu^;A=)^_K;_e>yw<m4NV9z840ZyRK1 z?AyLJAsb)=j(eo7z4O5DY=>rAa;w_w38lt}HF{^|&fYrq1)Evvf2{b@(ZSmH5dm?3 z_6xPJIg#Hx_NLJ5qcpppG|#N4@bK_Rg+SH^beLaM*7gIXh+B*}dsvP&E>B~R@7Vr= z@*2QHLWnT8!|<=?`!8caUl+D;+O)S!mIyGzgC8iSrz-&p_So(v-sfsx`kgF_%iJqW z>8TCvVSGWhQnR#~wOfUH`@tfuyXXzNNbkfy(#==gjAtr%wEb{pa^2f3!-_@|989bv zi+?2|1_ToFX|ZsJvJqqAVO9_t@-H>@-Ov)AR#`XEH7oprI@Q~oNH57ntC^K3iU6wH zGwSqH66JUEhJ=J<c;%g?o%u{Qp^NITseOtitaF=(hr3hFEWzuFc2?o_ALpOU6+3&u zahjlJi$#OyU!<a-v|{->FDRp}y>P4x^DWi||4)_`xdEn_9&rNWnCsHLj^FH!qx7`! zm*+^bXn#n8vwQ-(wU6Yo$|U;tr(tsD{N$~blRU{qmgCw<4h>4MkW!N%^kvzR;>_4M z@w%I%Bi)bN4^^IVulP7I0p9t(cYE-@Nu2`!&4}a8-a!?+ux$|}??&X&#GT*`e-Dq8 zgM-oyuI8z$1X(dQR(uW&BEp(Obt488YX1BvBnWk?KOy&GX#+V<ejk2&MxA)r-HBd# z9!r@33_&=}NR$%7oZM?R{J(^|pjg1$nc1Hm-gul&lICL<U}7>g^i?1F@@#_U#g96j zJm)^Kw=9Qb)`X1Ta+KrrIi!@|O-we4y>p}!wb%J<Tt1@e>09{>`2oorBfMmpP+LQj z)Z&ZeAJU!$Wxs#?$P7AaC8bHKgsIb`&lR81sr<|?7O_YHn-=rK<aSlEvp?E8^R?C2 zZNb4kah_Se_E+J@XmoI@@}pvLLdD661Ni2v#kJPf8N%Ga;o;i-5?|8Loh$FhkdEd9 ze)?r2WPo3PO%i%tM`Y8p40=xn_)b~$eg^1v9OxT8Mj_3h8G85q{b3aFT8#8V3tpYT z=UUgZiiOLh1b!&~nla=JOXWjjYL<%4uEgm)H|y`Bg$^oM=I&-7d&CjZHsxp58Dnxj zi_}HBgWVl9qo_z9K1An=hueV=+nI3%$1D^<&#u+IqDnL#k0ks$*iPSw^!YS|xb<Hi z6+q6w$y`sO`n?~o5A%iDwL!Ncer_aUp7x78;GU2`y=E5>z?$q(8mUctK|v6}vc3og zVuVh09{VZ9iMq+!J%?l{qA8raruAJnzFKK%1CG-fehx1+Ds8M}-=6JYy`1m?$*#o% zuVRQ{i)RGaj7few?2h_moNML2KGvLm@Iil^G~sJ?C7Acj{qf#&#>@x!GChNz0Z<oI zmm#X?-ASjafr+B7(&!EcrPS+e0_pLszoM$DJie<9&J!Fg8K6K@**~|n=5w~#&~79C zV!-ax4+Zq^nei2t$4?wwJgri%K64g=UWp&fHAMB(Rg_{Iyn#vJeZ#BZe&ad|q(8^4 zD=CUIlFpYk3@-sLyYXMeLCN<VfHB%J8<Zvq9ZJj?ry~*%(<B0x&nGo2q}~^Q@u&Y9 z=vS;R%SEv-V`KG7+Be{kRA<`^o*!K|hZ?bHzk&MY<;cC>*WT7nBJuc*IJGP`ha{48 zS50i++cMhOPpJW@Ag^tEJ!n4g!~VOW{W9y*uE6%KlVX_f3$0tJnUd{2Aa(uWyJYbj zY}$rTXor=wg#5+O#~UQKu%F&^(MJLD24F}D{b+l(d3?M>m+<tXS7t*L*sn7okGcZO zvx3}srJ~I%=1{F~%B~Z$2i^^S_=s2hic>tFfXxr-JO)0$1$t+n(D|4B)$Si@wKEoI zl>IEpig>l<3Ex*t)SaupSifPC>|{30o(QCTIakbWk>T{tx#(6N&i++z)R}wp38${4 z`o%Ju1UBb--*)eu%g!Oi)@Pi?YEj?RX6qwsCn@<dPZ@jK9c}Jtky_l`<o&?B3}M}H zXYcU#dQ*5!%P4IODw_Xpt*NZoqW_^wRMgtRb_$=QKZkbBf4QMgI0nNJO<>X>c;RIk zKTI=);!6B4@Cr(dbDD|6|L*t8{<^A3!sp;XMpR+`h$DnK;zFdv(;d}L9MRgsf}XQ* zfN+Z5{n_>9e#ntkc={GNZ~ohvST?^8>ZM2F>=*Wk4{v}4nslR|LeAZD>7KRWXbxVV z)M)TgX%AR-Yqfo?^J{lcBbWM|++XW5I*={K+Vwq9NaI;eb2x4J{@C8lRF9(Nwqm8o z6NS^&+C927uB@wKXE{E5P)b`ggp+I5(TgDwcR|X375h*V{l)!$H53rgD24I~%}bn@ zCY`u|r!I4{0y?GNtK3j06o3j4_-G*VvR)>VtT;&5S<k<al3}T}`76WoJAgsSw<pH- zZY=_rjz~fiE}0$#-1?YoO1y4lH&^?jvC*l2*aCF%^K;6<+<TsUof4tcdpe*=D{E-$ zj%m<o%X;XEoDZW-yPL(!u-5m+<3`|Y2j;}Ydr-;AMrotxM`?mL1+UyZ`B!oQI`dya zc~(YdF@dsYvO^73{)l|x{7J1d*yd*H%YvmKkUDPbC7C>a9Dy}?-6phqv=~5mnE4;f zoY>-%b%I*EqXz{%Rq4!s!cn#LIJd;vLNqcMNW!4_K3n8JnRG?L#8Y6vYL_pVPQ{nh z&?$$}+twyXnU_zN6EE#OzkK*<%k5xM&(Vwf#pEU%hJbo82k5Ke9IOhNJ_`uhPoSRd z4&>Y#t(x(aEkX}?HQ!Mg%pePS`mg{tEn1bYq=~i)l4{H(Z9mG%36+)6j^g{?4sDPp zCKmbt&)y!9$?e32(c)5C7}i94p{A53+im@JS!jLrBVy&u%IXdXaJuDu_Bmzd`#(wP zRof4ZCKYWySsOYcdtm36Fjo@BCDoh=2eddWI;nCKz#MMpJ0By9VZi=}mx#k{8<LWe z_rW6@dzTX)BS7zMN{wYW93SYZ-3jm|J$v94`6}J-F#F~)=TSEwi_k}uZ1AMorrgL% zmDcqX2ZJnLO(WmzgOQP<ax<}1?H|U*BQIXOSlrsmJc(RxKQ)sjpfM1xL}v_wC)w)g zXdxx#^QT8#iavWkOGQXKwyiRUk&=U=e%Vi*3^Se~vMhNMC>*-U_>QcH^15ju$~Sp4 z;icrQmASdMqsjNK31IKy--yu@l>ffPGx%rYGiRGB;W&GEZc91)*GnyM)_;KPYnp!_ zS}<SYArve%aZ20_*mJ1Ii6Qis-k|2pkgaoY*VF0PC6@M&@&(6p{|cVIjmWaS%u#l7 z8vEjfMhde8?$p!N!P{FRjj}!~tT&9sKH<5ZMu8Kw7W`{XX^N2wS*;&%5yv4X%fs9F z?>-HVS%S~C(zaS^KRjFb^r2aMrKw{Zi_Nq&Eg3e%N-s2`buZ$->pXJLGUMfA9UN|G z@PNoJG!6yuJ7-=3h^3CM>~N=Et3AXH*k)j}Tj0Qd=UU{>iQIzG*qK2;(O-Nzs_B>? z3g56taoWDREtvNDk?xc9Tk_r1@1F96Or(Av*Yw*NCC#(7oW;V|F3xetK!urzlSBV1 zGkHZF>Y}xUAUzck(SC4z@E8V1-l+BDP8jovejR<dtW4f@8vB4$!Nv7CNfQ=>gGZu- z=xGrges(|3!4(%4c=#`<^m+cf*`sC8YW~b2J}AZ-a5-_d9)7VnbocL5JL`y_YYJ6% zW@Kl%)S{?p`d*HSC?f={0KxqDPI}HyodUsH$ZxRk`wmt-P`-tWMdYKfstDmK2K0CQ zty;c8g=wc|tS}!0RA??<@5tvzAwS+}%N!{@P+I(@!7X1FC2jUdyXLu*DL8O28?#6q zY>m>TdswF39(4<yG0}hj7(!&sss^gwueOE=pX`&^2XpBoA}W`fHsQrhI&)Gyoh>)B zfVP*Js<_LZ6&oF_{uC=PZB~XBSNwA9e#Nb>MYI4PeD{Ol7)jk@_u)*lSHP{aM}xJi zkEtmx!Z~xU|0;rxG%7Mu3(oSbqb>t7DhqG%u-^A+EGzpyEq^&L))&-h_gDEA+WF6Z z$4{_Rn6R8W5&oZTS(&By3*>}W|8uYEO`G8T)azH5t@8d9CB_TZf-9=txQe_TTPeMN z&0<>mKg*1M{StVpfLYZzP^~>;44N{aUy|%I{WEI&wTE5A2j!e5pnsn8ZSYAGbxM<{ zmvI8ce4A*9uZoULq~wN7!+>9qRsqm)RGzS=q^=){HCEMrY~1rSwrdlF`HZeK_-UDC z${g!4wJxM1A}5l*(-+5um(V@qgPxJlK@@Zz&m91!#)7Ad2m83_T;n-CK+<_P9@kX{ zZRMdNsWhNG%s@a2)L-N2^Zi<6jqkl6<)6$hYlLT~%k6{n-3Pm$ZakuSaA3cdg>8Sn z@U?y-N3Xi6$qmB3w#!E*b7>c$Q>nU-){-R&X+qkqwmnk!iQk4%;$Ty^Llzd6OSr>! zSy@5up5xN{a&mI)xVbCPRo8KCY^bR2%!Tg3m7URAzMu2Z#6g|wS<XYqN0Bp0lt^fU z?{Uk<%vOuZD37OAGG!1jI|EK`51LXPPW=#1eFS*oa&gX)gAw#tgs;WxT+RGnVti2Z zg{lsEn(1|39t-Q|?Uu5#*iQT4U_MVbBAmYSX=vyo24u)94e($ut}CEw_UJw%@7>Dw z-j(#>27Z9E7g*}lyf>_{ZHjF6nNTK($99qvx%NhXwcMlJ!W|ms+R=7Sy&Yz4Kj}z) zW9+tmrQ@v_Jzc#<Em-oKJm~L70^36Vy?ck?leGED$+ahP>F%&QB5dvJ3kh6tc=*_R z387RH8@8ynf!hEomsF6qa8P~_8ei~!`Cs*@wx&$syWNoNP{Hn+&|LNc^H;5&jJ6<k z2JyQ(7pJ`$+-dMg27#4%U4y?@Z_n(RnVIqN@~+Rcrxmz<vgX8heAMOW#hU8u_efYh zo)-oVtc19M3fZ&M780v$Uu?G+SA5D%eEPOe>Wc1b07hE3zt727+ytHa<&i$9eq~4h zweI%TLa+OdJvw_k@*Gwg&>7hdC0(%K^gMEno-rONfT6^B(qL*9zc>nIA;&<HSz4+; z$xmq`sle7)+_E<FVw_J_{zf8rhX=RPrjl}19rPXP==quhUk016UE=Dl>CG%*+w{ge zK%UzBepjsv&*dXYhwNA1qt^#z6B4lMBqPm1IX>7XlgT-HEX*wFa4|4@h*n&blo#YQ zA!kTF>qki5M)h*Gvc&Y!oL|Y=m!0dlc}N1*P@2QcM(+C#sph{MY`9@2@?rHzS?DxH zP5AA*ZQ@6ZaxbRNsKQOF!REuoemBx(PUbsBL|Ko;UPIJ}_fmr|Yu+OX%dT$~Bg`>R z1u$=njP-`EfFqqIj_}oXrHYZ8jCY^1b(;^D&d_EJjU`^DWj=NmuFX^fW7jVK67ln# zkZs9i%FD}3+~tg6*QM_x;dF`OAKXrG2xzupfB_de4M1@Zcj-HYEcTCrKN|qJ^EC<g zUgsX=UzP-zr->h%E^v`)N3jRC<z@!CE}64Ob(UUAsT*xkC*3(YL7?NnqB&#nPsmZF z4XcV@U{Z8lHR!8<MzJB3tXL)epKMO$zauI#S)1t6JLjEMhK>pfyq*7U^YrxdYdN2t zut&fLo5wFvCktb>iz-JhX_9u+xBg>KOmv=zT07EDO%<t6d1&z*E{0bHsG6FjQd`G3 zh%n$&d}5zLNRHS!DUOQZYHNo$ftbq~#Z%thG4E+jPs<lW1-YxFB$=cQG8`?kk}H0f zUfy(n`T+PT2V(cI9czK9uF@Bc{;}L5bnnB4cIw@^#tn447BL#uCkilR>+TDApK_09 zbgFw(DMM+>H3{-?Nr5|o8TWwL<B};?yVZ8K@Arf%^wV7^-Dx6_%EdXYr1+oBp2`TV zFGU~&p80|hus#{pK>OA|BJW)|)%K}juf}*>>;9;p6!Du&tl0hGw=N}c95=+}ye?<O zLtqn#o-^YD#PUpcoqHi*$p;gGeP!F2j%}z@JBHd$<|EkPD{h22cIzs_QT$n6smGBY zrD@RR;ea)c(?z~z)kxdD=*9J(7sf0V6JHW&i6TKZZ*E$`VkQ_P`>Z7OBR7PGMwJ)x z^~LZXIStSsR#ASJ<epHzrnVB_n_qoNzWxbHeAGV38ls#D65{Z<?l12$aA4Cmvlp3e z8uxoULEZyvw3hgCPt;|^BfWMe&GGB+2Ol67zm76?a`ap*OmdJ`{nRuF&0AJ2gC{PI z=wzOuyL`~w>-hm)_%pRY&oJUGE!d+@PBdK(E@oXNl#~4tcn}K<5lf98Uyj(@U5l-X zSlHd6-L%<zc#F2Gqo{nk)XP`Zda_$C6!Evauy96`TbGzUXwUH2!IUjhr3tY#3TvKx zDE-^!a>BWlb91R1N3Wh=KW6e$@^A5)PzBFI{xnJab}N7@c!>7bOuxCtX?`zB=Sz`) zNNZ#{`1jbut@DOq8YY1jrico7>5q@<8QPz-@CH2bLI55|H<Ny*$KqOvAADPFWisL% zGN`8!bXW5kBB~fMQyehuedY#^q|H50Aunc`&dXPb)3tW(;C1-x{x&z;)~J)I=3w37 zNfpHisXPrsr{2wUx}x)Y*Thf<UB`6yW{;h(VaN4YG)MGx`sQeza|{V4J-&>K4uA7w z3n9~KBD{)jQZ_Lrm!5rGxmotZ=@sCnos;?##LjcYZ}^{NGOBV!FIlZ@1l0|c6_6gR zD07!GU6ddB*jeYHm0_}dK&N`;ZioFxd-NFcUSqDXg@j$m@&3-j)@Z@LVQZV=NHDxq zraxKHr_$8XLN>W8z($4R1pP}OrPsYEjl{AR1O;$?rf{ho%+qSeo)&h8f}LA5ST3>2 z0xM}<QOvn!OZS3zuW?&f`mQjrddUhfTzUHB@%ty&HFSYDzjLacXK8vcGSq2!78b4W zO0jKMs@8G)TTPU=i_pvDkpgbEoFsp+jT<U;C9uYp?Dw8kt<U_+$pUkCz6ee@*rILm z$V^}VrQzEra}J=NLMo@XNS|=a(eC4k#ie9_FzHhFzTLzrXVJ{?$7c>u9QS666d^2U z;1eyk!gQ*zu#|SX)w=gFe9tz(=7;O?yAl4EMSqTXG~9!<kl&C}y^pzBFuaTkrBmK_ z4*+Fo0Bc#98irZpW{;E(Kp-W-Yl1`~{V%c!P4-1m%x1Hl$b%|U-@0TR=uZZZMpu7B zG}in4aR1~`bF{q5(=rXi*!8@M)8&#ZD;XoANcgv`s>)fdT*s*-scf|-Rh4<(YgzW! z7Z<OO$1k}qGmIbE_S=Rr7e%2g<0OgVxJ*+`5KK{|nzn4We>cznd^(la>uFIe>vflq z2Tz`uCnw*U&-WzhzxVb&mE{d5k_)1!^5VwxJVjApa)o=3lLXI%fWIjG1d!%&UQqRc zeE<bCY>l28$8z}~vO6U8;50T&GY!+z`P#X)jGL)ZsfX#lx)vA9S(+w6xXH4j-EK>i zhEW7jEDk?>U#8P(mZo~W?gqi5s(MtfFU#^uo{NGI8^(RZ_*Bz;RV7j6`F;{bk|;`? zh0<-cL{0lBic~>JG|f6cf5rFJvol=~!YC>nM@iGWwc7W~@+=5wnhJ^{aHE!;T`<BB zYCzz~zV9PJZ3{)1(mWfYFf4^#0>aY{MZ||<+JgyNqtS3(R}cj%(`XYd)bnNiB2}td zC}n4AbY46OHhG$D%T6jAU(TlS8=v)*G&oL{#W5)gM#!%S`MIi!mL)5SN~y+Jttd3c z$|%Z;!r(p;+f0-sdR3WKRjgKTDayyT{U@&bM~>4UjjSva3AwN9-!+V%sOo8&`mSrp zvd-zMK$D>(0lgi95}-PmXJ8mXVc7g^J-uG9L1B<23AFJWH*R3~aryG)e!s8to+XMR z^k0tSFv2$OMoBbk(4-rcgyeoX`iWDY?Hj{`)oiJgx*-UQ*{o$*HN$WmN8!fpn1ujl z!#Jeh?_VsJqsc^<WsNai6q}8PP?r9B?Q%e-)oKlg!ypJIlgaj5C5c;ATD@*Dw(`8U zisJo7qsHCqwymWomX?*Nsvd@=s_NXJ1EXUY13X*Gc%Fwo9DY8S5=vkkKxGLu1E~s? z4rI>25(yztra+H~w`_k$krPH*c1xw|#s2*Kr7!$i(HV>1{MYdB9&KLF+!t5wO;J)6 z<s{FSX<Fmp;r3|rO^P&%|CUuHiJ~k?R;^|?8e*E3VW<)k`~J$=))0na=(>(mzjMo1 z6om+a#P`5F&rb#6RMSokW2~w(LQ)Rgh+M2qc&tHUK^EV6I<MDj7`8#Fjv{#*l6Gd| zz<qXIE8J<Iq+hL8qA2$J{a&x9s_J|`2TlYv*)`=_5+-SuF7u^hEDNEK89SV^KX#Kl zZj@#$kyMAuM}(-9{@C+eLarVhM4Wa5mJBqp;Lv!k3lUXO6ybX92SEv6u%c+x>w8>q zJsyo3eAtaSFbu6RWiiUKQB@itG)Y8JjFQ9;!>FpZX^6uWP;)Da0!|ZBFpwPh9;3BD zI2L$Orl2lBlEcaY72CG9{HYCBu3WJ!YcLqVkPFU_uqQq_IeGr(^UobWclX`9BmZ&y za-8bqFeUpF;RpM}x2WZJNsmd#S$=!9`j`3qKP2hf&E|T&7OTqUQ6HXMc%}j94{;n% zCKF^?okzNDG)z-fmaDQPdERa|^Riq!4&`E6AeksrsG_KRm>zNY+je2gQs$Sl*=%50 z3(y^Q4{(2gqaRF*;Iy$@API0X?2kbdg8v8{e|EJG{@83b`51ixc70iv4<A1Cd{-hg zO;XQr&##^Nx5GoGcmBWk<Vo+o*!GSOq{G2N6wi78)hDDu$V62aRYiHVh7*l_j^ZuP zbMPi)MUg3GWmz$nDaxACX;}uEW?Z^dieeImO~cSNt>Om_98)MgB}!dBq*4@x^2b%| zUXXvGPy`!Sc;<xx4=`w;KorZ2ShX{#$47U&UB=jSI(_)?A^Z_=vQPm4rERrZ^NU#- ze|FG4FuP{a%mlIY*UB<(>zesH9kXY(G+m#S)sGo_*Z2SV!Gkwfs}D`{V?t;Y5mA)+ z<^|6mHby(!{B2W02v~(CrN@$_Ggi~}W?5e7`pB{bRh20<B`J)eom*YP4;PjI;bv!} ziB8>hT@X@t9RgYi7?9!rcYY=koc+<h<3NJViLz+d+Twgpr&Ao)i;Ii#cnlr9-L*+U zCZjX2w-&xp#0Nq888hCu2g1?O@Tz7S8_&1u4P$Tb!D8|1X!Jr5{5z#zD9XMhRlKOj zLl^-2!fF{*0K#Pk^=5OgEdS7T{~?b5J_!DDwR+icx}unx=8Ul*%c?YuxtjyFIgE&L zlyEGtaL^Qh%nRNs;&iQ6>vp?P4dCePtRlA8jvs-z3)BK{gXj?Z4IX(&#yg!0@>;Lg zi}Tnybs{eoXjwFiTws^Q?lB!!QGPld)y$fqZojM&MFUDLP0OQ*DvHQ6h`@6#OqI|g zqBoXh+4sCkQJT8G$JiS|a3_j<)BMH$z9tCk&E~*y{=#*aviwD-Bb%njYa7rAa9|-2 zf?>k0`NGm;ZVZ;{PLhHH0gX1+;pw4!)_DP&1-Q?)IR28$fUIxZHUb3bLg;!O$60Qc z-pubdyG$<}Wfha^MrHk8w)cy`eH_mA!@a{xgI_I|!Fc@jG;IsQ2eMomhLYzS*EP7- z4BQgT^`G8YLW(TQB}vJ$uLi-ZVQ5&^TQ_fhJQ!^EgX8?|Xmn>fea-WJ+UuR#w(k2? zo-?inL@dLx!u3D<+I5{+3zRkU`5c=LA_6#YpxKm$!{H9fz%q3@9o)>pV6Y<zBVwV% zgiQz32-}~OnOw;vC-Dp3=8a7zv9G<uZhudjHmss&X?Zc7&HiUHQP0o+aWsn8>wi<# zFL)D^MN!EULJ$N%XJC%Jz2|(pM|p0i=|81uT&w-pty|VBue5EOC5hc^vKu!V?e@#_ zdBE7unoWt22Bi|;jJVSXNqCR|Jjfsy1g&RhUWg!tn*`M^JTVdSx7E*Xr#*`mK{QVY z0Xq}IT#%+vaiHBt%SIGZm+J;G%9fWZ+snK3Wc~cFAN*esMbGt!pX8&_U#-`7xa-S% zrg_h{<FahZa@B5w1Br-;vh%5ZTADU$wN%sEd46lP`em>8>Cw^G8ja^<xn30RYW0aM zYqi=ps;aZu%vUQd%Pdi(JTd^uL+05X3q?^-WP)S?z9IhE?g>Rm-zb=OGeOaHU3^dw z1fYjwdI4GtlGkuJ?DzW^Z(yK^*o1&u76q%Ap&P2nmxmBLW&Ow($K%y>;(MMM1b^fE zZ>H&~s@}70!Lo=T7+?A+?;fFnD?wQ#@LQ$W_MT<Qglu~#RSkWgNm8TLO44+3e(qdc zWKmRPS-^)eDNiq880-un;9G=V6lfn<2%F6YbsxeDAVa(z+YOJWA%y%k00960L_q0M T3C!Da00000NkvXXu0mjfa#c^< literal 0 HcmV?d00001 -- GitLab