From 29c6b133008953e007f48bec0209ccd16008386e Mon Sep 17 00:00:00 2001 From: Cedric Beck Date: Fri, 6 Dec 2024 17:09:06 +0100 Subject: [PATCH] added MatrixAnimation --- .../pp/mdga/client/animation/FadeControl.java | 84 ++++++++++++ .../client/animation/MatrixAnimation.java | 121 ++++++++++++++++-- .../pp/mdga/client/board/BoardHandler.java | 35 ++++- .../resources/Images/particle/radar_beam.png | Bin 0 -> 29971 bytes 4 files changed, 225 insertions(+), 15 deletions(-) create mode 100644 Projekte/mdga/client/src/main/java/pp/mdga/client/animation/FadeControl.java create mode 100644 Projekte/mdga/client/src/main/resources/Images/particle/radar_beam.png diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/FadeControl.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/FadeControl.java new file mode 100644 index 00000000..c2a3c5ac --- /dev/null +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/FadeControl.java @@ -0,0 +1,84 @@ +package pp.mdga.client.animation; + +import com.jme3.renderer.queue.RenderQueue; +import com.jme3.scene.Geometry; +import com.jme3.material.Material; +import com.jme3.math.ColorRGBA; +import pp.mdga.client.InitControl; + +public class FadeControl extends InitControl { + private float duration; // Duration of the fade effect + private float timeElapsed = 0; + private boolean init = false; + private float startAlpha; + private float endAlpha; + private Runnable actionAfter; + + public FadeControl(float duration, float startAlpha, float endAlpha, Runnable actionAfter) { + this.duration = duration; + this.startAlpha = startAlpha; + this.endAlpha = endAlpha; + this.actionAfter = actionAfter; + } + + public FadeControl(float duration, float startAlpha, float endAlpha) { + this.duration = duration; + this.startAlpha = startAlpha; + this.endAlpha = endAlpha; + this.actionAfter = null; + } + + @Override + protected void initSpatial() { + init = true; + } + + @Override + protected void controlUpdate(float tpf) { + if (!init) return; + + timeElapsed += tpf; + float t = timeElapsed / duration; // Calculate progress (0 to 1) + + if (t >= 1) { + // Fade complete + t = 1; + init = false; + spatial.removeControl(this); + if(actionAfter != null) actionAfter.run(); + } + + float alpha = linInt(startAlpha, endAlpha, t); // Interpolate alpha + + // Update the material's alpha + if (spatial instanceof Geometry geometry) { + Material mat = geometry.getMaterial(); + if (mat != null) { + ColorRGBA diffuse = (ColorRGBA) mat.getParam("Diffuse").getValue(); + mat.setColor("Diffuse", new ColorRGBA(diffuse.r, diffuse.g, diffuse.b, alpha)); + + ColorRGBA ambient = (ColorRGBA) mat.getParam("Ambient").getValue(); + mat.setColor("Ambient", new ColorRGBA(ambient.r, ambient.g, ambient.b, alpha)); + + // Disable shadows when the object is nearly invisible + if (alpha <= 0.1f) { + geometry.setShadowMode(RenderQueue.ShadowMode.Off); + } else { + geometry.setShadowMode(RenderQueue.ShadowMode.CastAndReceive); + } + } else throw new RuntimeException("Material is null"); + } else throw new RuntimeException("Spatial is not instance of Geometry"); + } + + /** + * Performs linear interpolation between two values. + * + * @param start The starting value. + * @param end The ending value. + * @param t A parameter between 0 and 1 representing the interpolation progress. + * @return The interpolated value. + */ + private float linInt(float start, float end, float t) { + return start + t * (end - start); + } +} diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/MatrixAnimation.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/MatrixAnimation.java index c0110319..ecc2d9a1 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/MatrixAnimation.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/MatrixAnimation.java @@ -10,20 +10,125 @@ import pp.mdga.client.MdgaApp; import pp.mdga.client.acoustic.MdgaSound; -import java.util.Random; -import java.util.Vector; +import java.util.*; public class MatrixAnimation extends InitControl { private MdgaApp app; private static final Random RANDOM = new Random(); + private Vector3f radarPos; + private Runnable runnable; + private boolean init = false; + private List activeEmitter = new ArrayList<>(); + private ParticleEmitter radarEmitter = null; + private float timeElapsed = 0f; - public MatrixAnimation(MdgaApp app){ + private enum MatrixState{ + RADAR_ON, + RADAR_OFF, + MATRIX_ON, + MATRIX_OFF + } + + private MatrixState state; + public MatrixAnimation(MdgaApp app, float duration, Vector3f radarPos, Runnable runnable){ this.app = app; + this.radarPos = radarPos; + this.runnable = runnable; } @Override protected void initSpatial() { + state = MatrixState.RADAR_ON; + System.out.println("RADAR ON"); + timeElapsed = 0; + init = true; + radar(); + } + @Override + protected void controlUpdate(float tpf) { + if(!init) return; + + timeElapsed += tpf; + + switch(state){ + case RADAR_ON -> { + if(timeElapsed >= 2f){ + state = MatrixState.RADAR_OFF; + timeElapsed = 0; + radarEmitter.setParticlesPerSec(0); + new Timer().schedule(new TimerTask() { + @Override + public void run() { + app.getRootNode().detachChild(radarEmitter); + } + }, 3000); + } + } + case RADAR_OFF -> { + if(timeElapsed >= 0.1f){ + state = MatrixState.MATRIX_ON; + timeElapsed = 0; + matrix(); + } + + } + case MATRIX_ON -> { + if(timeElapsed >= 3f){ + state = MatrixState.MATRIX_OFF; + timeElapsed = 0; + turnOff(); + new Timer().schedule(new TimerTask() { + @Override + public void run() { + for (ParticleEmitter particleEmitter : activeEmitter){ + app.getRootNode().detachChild(particleEmitter); + } + } + }, 3000); + } + } + case MATRIX_OFF -> { + if(timeElapsed >= 0.5f){ + init = false; + runnable.run(); + spatial.removeControl(this); + } + } + } + } + + private void turnOff(){ + for (ParticleEmitter particleEmitter : activeEmitter){ + particleEmitter.setParticlesPerSec(0f); + } + } + + private void radar(){ + Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Particle.j3md"); + mat.setTexture("Texture", app.getAssetManager().loadTexture("Images/particle/radar_beam.png")); + ParticleEmitter emitter = new ParticleEmitter("Effect", Type.Triangle, 50); + emitter.setMaterial(mat); + emitter.setImagesX(1); // columns + emitter.setImagesY(1); // rows + emitter.setSelectRandomImage(true); + emitter.setStartColor(ColorRGBA.White); + emitter.setEndColor(ColorRGBA.Black); + emitter.getParticleInfluencer().setInitialVelocity(new Vector3f(0f, 0f, 2)); + emitter.getParticleInfluencer().setVelocityVariation(0f); + emitter.setStartSize(0.1f); + emitter.setEndSize(10); + emitter.setGravity(0, 0, 0); + float life = 2.6f; + emitter.setLowLife(life); + emitter.setHighLife(life); + emitter.setLocalTranslation(radarPos.add(new Vector3f(0,0,5))); + emitter.setParticlesPerSec(1.8f); + app.getRootNode().attachChild(emitter); + radarEmitter = emitter; + } + + private void matrix(){ for(int i = 0; i < 5; i++){ particleStream( generateMatrixColor(), @@ -35,9 +140,6 @@ protected void initSpatial() { } } - @Override - protected void controlUpdate(float tpf) { - } private void particleStream(ColorRGBA start, ColorRGBA end, float speedVar, Vector3f pos, float spawnVar){ Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Particle.j3md"); @@ -50,16 +152,17 @@ private void particleStream(ColorRGBA start, ColorRGBA end, float speedVar, Vect matrix.setSelectRandomImage(true); matrix.setStartColor(start); matrix.setEndColor(end); - matrix.getParticleInfluencer().setInitialVelocity(new Vector3f(0f, 0f, -4f - speedVar)); + matrix.getParticleInfluencer().setInitialVelocity(new Vector3f(0f, 0f, -6f - speedVar)); matrix.getParticleInfluencer().setVelocityVariation(0f); matrix.setStartSize(0.4f); matrix.setEndSize(0.6f); - matrix.setGravity(0, 0, 0f); + matrix.setGravity(0, 0, 2f); matrix.setLowLife(3f); matrix.setHighLife(3f); - matrix.setLocalTranslation(pos.add(new Vector3f(0,0,15))); + matrix.setLocalTranslation(spatial.getLocalTranslation().add(pos).add(new Vector3f(0,0,15))); matrix.setParticlesPerSec(spawnVar); app.getRootNode().attachChild(matrix); + activeEmitter.add(matrix); } public static Vector3f getRandomPosition() { diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardHandler.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardHandler.java index 0cbbdff3..68414d00 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardHandler.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardHandler.java @@ -1,6 +1,7 @@ package pp.mdga.client.board; import com.jme3.material.Material; +import com.jme3.material.RenderState; import com.jme3.material.RenderState.BlendMode; import com.jme3.math.ColorRGBA; import com.jme3.math.Vector3f; @@ -12,6 +13,7 @@ import pp.mdga.client.Asset; import pp.mdga.client.MdgaApp; import pp.mdga.client.acoustic.MdgaSound; +import pp.mdga.client.animation.FadeControl; import pp.mdga.client.animation.MatrixAnimation; import pp.mdga.client.animation.MoveControl; import pp.mdga.client.animation.JetAnimation; @@ -58,6 +60,8 @@ public class BoardHandler { private PieceControl selectedOwnPiece; private PieceControl selectedEnemyPiece; private DiceControl diceControl; + //Radar Position for Matrix animation + private Vector3f radarPos; /** * Creates a new BoardHandler. @@ -150,12 +154,18 @@ private void initMap() { case node_wait_blue -> addHomeNode(waitingNodesMap, Color.NAVY, assetOnMap); case node_wait_green -> addHomeNode(waitingNodesMap, Color.ARMY, assetOnMap); case node_wait_yellow -> addHomeNode(waitingNodesMap, Color.CYBER, assetOnMap); + case radar -> addRadar(assetOnMap); default -> displayAsset(assetOnMap); } } } + private void addRadar(AssetOnMap assetOnMap) { + radarPos = gridToWorld(assetOnMap.x(), assetOnMap.y()); + displayAsset(assetOnMap); + } + /** * Converts an asset to its corresponding color. * @@ -189,14 +199,16 @@ private Spatial createModel(Asset asset, Vector3f pos, float rot) { model.rotate((float) Math.toRadians(0), 0, (float) Math.toRadians(rot)); model.setLocalTranslation(pos); model.setShadowMode(RenderQueue.ShadowMode.CastAndReceive); + Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Light/Lighting.j3md"); mat.setTexture("DiffuseMap", app.getAssetManager().loadTexture(texName)); - mat.setColor("Diffuse", new ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f)); // Example: set 50% transparency (alpha = 0.5) - mat.getAdditionalRenderState().setBlendMode(BlendMode.Alpha); // Enable alpha blending -// mat.getAdditionalRenderState().setDepthWrite(false); + mat.setBoolean("UseMaterialColors", true); // Required for Material Colors + mat.setColor("Diffuse", new ColorRGBA(1, 1, 1, 1)); // White color with full alpha + mat.setColor("Ambient", new ColorRGBA(1, 1, 1, 1)); // Ambient color with full alpha + mat.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.Alpha); model.setMaterial(mat); - rootNodeBoard.attachChild(model); + rootNodeBoard.attachChild(model); return model; } @@ -728,7 +740,8 @@ public void movePieceStartAnim(UUID uuid, int moveIndex){ */ public void throwPieceAnim(UUID uuid){ pieces.get(uuid).getSpatial().addControl(new MoveControl( - pieces.get(uuid).getLocation(), getNextWaitingNode(pieceColor.get(uuid)).getLocation(), ()->throwPiece(uuid)) + pieces.get(uuid).getLocation(), getNextWaitingNode(pieceColor.get(uuid)).getLocation(), + ()->throwPiece(uuid)) ); } @@ -755,7 +768,17 @@ private void throwBomb(UUID uuid) { } private void throwMatrix(UUID uuid) { - pieces.get(uuid).getSpatial().addControl(new MatrixAnimation(app)); + Spatial piece = pieces.get(uuid).getSpatial(); + piece.addControl(new MatrixAnimation(app, 1, radarPos,()->{ + piece.addControl(new FadeControl(1,1,0, + () -> { + throwPiece(uuid); + piece.addControl(new FadeControl(1,0,1)); + } + )); + })); + + } private void throwMissle(UUID uuid) { diff --git a/Projekte/mdga/client/src/main/resources/Images/particle/radar_beam.png b/Projekte/mdga/client/src/main/resources/Images/particle/radar_beam.png new file mode 100644 index 0000000000000000000000000000000000000000..6d2f317e5f2007e6673015653c9a0b06c62c6782 GIT binary patch literal 29971 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
  • eKy!j0PP6!1Q3w?RB z4~i!JQU(6`R;xrzqW$H&8y|G(`+2JpF{XYBL!=tqDnwrh{;6N6TVO^Qwy?J(sK2P_ z#JPjwoOB+?o_pSyx}0u2U-;Y(OS_g4yZz&<0meqa{S(j8R&R4g%co zsFa|BFiOs#aOga*ZrVyclcfv0-fUV?bt|8LaQn}q zkWo8$4Z)$$UGfUmsdj%E9@9?CGqi4% zD?{vQulbppX;YhZjwW>X@!L7&FmAs7 zt#Ki;bo2vn!0?BltZ`cHE#YAF5o+0Qf(mo5D%`+fh5F%)D0Imk-|LiueZg%+tY}aL zD+55xEen{4L7K-R+&ZIDS6g<3zONLUjjN8H_VeXPfk>fT2Hx!3egdD{)7#($HS+yA2bY<4vmvf z!e~w1BP(5vQ@;y)+(zVO6}&W0ul}3yD&X1bi>QV8D9&rA&j!c$?6Ru72zM2tt5cTs z{=trbi*+AxuJRBw^&Enx-1R$mA!7(|QZVYj4I;v4RiCcuh-4Pl$c92QhA#S5;BC*( z@~xg{ms8TArBq}bk~4vt`nYC|?CDpaF7nfjwkjo`&^!v}?=jAoZrz%{n`=LrPdK$% z_g){rE>GixoDeS00?+v$W(JFu1^W;8EFSB%V?*KQNv=_jwW>)|0Wkv^`hl0aBFu*j&byH32X8L4neKrvWuf*K+1MUO_~SwPLx_JOUT+CybxV%#`U=`40r&WnfLEAeye(#tw!uk3yvqwAGz3OX73oWqdU z`h(@~!vG`y9*r9yjkw9`yr7s+67CSb1306hQ-p_jv=l{&PgWV|(-r@mrKtIC+U5Nn z{Zty!&;-~q`w{E)bmT8~PRyvf9{)Rvyhg-~4$71IBAZAG$L(_e-&d%^P^bS9~o<;GsQcnpzOqJ>eBkg zkFm*5-XW*^PqZ?EgI8YYm@hbtUY1nyh{%y@Gw9Xa*vOTn-g@qB1(iD4_ok}rJuG&8 zw9^L5e6oKMPVxJ+XzKa;&SS}$-sct-L3gb01}1FpzuUvj6r;&ke2i;6)Xmd#^kpaa za$oPH=+;Gup7nsCO}4=ww+S$<&xgiM*5Tx}pd_`5j6-66f}d3~Eu+F(`v8b5?H|L-QYqS^lnm6(%(hDIoyqqjd{F>Bmm}nny!e4-2s?%5 z@zhA`76o4ILMQ9b6z170L0n}8b4qiv`uswV)z|0z6QnCagKomHdiC*{Pxi~}&qj4xaZuNXQ87z?vsPn+ze(5ozioC2+DFY5&Huyv z*cB{80MGuIduiZLSEp3<=4wN*0$;VYNMCo`o8VxW*>ZI?F zR+!5uG(aDDZ@rhW|IRRvjd>ZDy9jo}A4uoM^U$1=^spO#D|7b^bJ$m@!5@lne}*}l z#?2C1pwTbyPv?SQ=61(SaRxchPCyPS@n|F;c>gu<#8~P_EJy)ZdL`}s=eJIa+8hcI z<7!o6_W>yt>j4}o-JAMsXy!R`Y@^Jx{Rw;m;s9mZyoBbZ#!`sXT4br+tv43&>jHex z5AI#CIc>F6FLt?7;+QnM=lwiQN3a6W#s&SU!V0fM>`e8Tb((#TRGh=9YN&^~%`{`> zk4GTs^oKLxR$z;(jp&8(Gdqu4v=2!ijgNWL2l;0Y4+ArZLvB2a%UrmJOciI&HtRbK z>~?1e(F|R0UrO8rY~KjJ7xi(}RQ~5tUUVOE*krDYTiUN*m?wBYpOI$`is8%HWUtQmYn~?UkQDyT# zgW}=I9CMGgv54ZVHHz7Xex^R`HcMBVkE}Heo2k(YI~Q7Rl1!!X68@9eyc4zvxYfg8 z&cB1r`@e^}oM=nxr|X^N57q2;bLP}4c5RAWJ=W8us`zZg_J$};8|NmkJg#pHY(iA(i1k3K04yNqc&h-n-uWw?1V{J3hTeF7>CMp5Y?W`Pq5K7*P@=s}0#q!PID+7YU_zy+rF2NmH z+V~B$(h5zb9BDGs2GWxd%#>Xu3?f723S1{L1NwliY0lP(SnhEx?QMcHy+BTD>AgkC z%tdzCy1%<;i>Ye<1)l%Rc5iAU_cbM_eqybz{6t-Y^l@)?6<5I_@3(aa(f9pox2I^&bP3V6n*Kz;7;WJS=AV^E+#OSo^DtK}Phy7?|q(8gaS7Vt2xN_5NM7QHib--%m-nqD02 z%W@lc4<$68h@3xwZDaqSgkDENiAaC%leL zMVk`Tj^JE1&)>VK7Mm&}GH??|SzE2Hqp*xCX$Uz@b3(s9T}=YdX?k2uIX3jrQNdtA zZ8Z{&WaJ;Gch7#%0YRHHW0cCXE>Sw;0nmS}EVr%l;2=<|NXt|^MgGs~;GL<;(0LA& zkEG6KVaTFgMV!9AIe)Of8WS_6UQ8ivj;!jj!NV`9qiS~7WfoI1$M%}B(1p>n!PH<1 zBOX3YZe*NpV&OuMrQr9GokjDmIBd#iGtNnSI?0VQEBqsz(X!KnxwQyv*7a9~+2$9$ zwZpIvF$olW86J-)n^>SNdB1kTUbi&={AvmoVg)?S?vn(Wzl{o= z-atEWCJoDBeXom)Dto5Q88Okiq9S1Z+FPUk5XmcXSjqgJr}zBsi<;Q4^VH(}y1B-x z0g-QyI?X5a^Rqr4p8v*Lin&C4WVEL!zWNdRx8g z!Xm1(4FIP<%%2G75k-(Znu9Hg3(#pnN1b5( !@@oIZEr!FQZ`3vi6aUCA7P%k42 zyfT`f!7kG#7^9y}WyWiFpm98C{n;QDzj2qDttJNjl7b}fc?;RjydSeKC=>JsGi+mB zqA8uj_=drrdFLt2wk5T}F7-Dx7NdnbV<51ovZKkr_LDy$&STy!Fw}QCMLZ>F^VF>X z_)^5zGj_Ms70DW6Ele%;qEpaR2cpmds{Q5FNhH;DALgJqg=uq3_7+D-0LE11HuzR% zqqxolv;M2-YY=zfBrrd=B1bY27ZcaIM$kYvTprAEDT`VbZ@`RYc&B98EoI_VmvqJ% zuX@&hHaCmVJy7E}Td=G1Bdmn^subSxd8*f7c2Rk+?@e!~jS{4c1i<5JY1jQ2u^2}J zzX}&}!wU0MZ2L3ANizlMawY^yMA7N!IanQhkX-QjSw*UAu=QM*+m?ki3kpC8nU4X@=6zLLoB9vBwKh!;rpWnKnCwqg`Eh18ptSNwh2W=@u~1A{;Wv1K^s{26woo6_ zO(FhLKOtA&GX7QDIkQ|@i`!HI?|B{OlMlYg_}k0z&j|B`vMGlXZ|tr zI7{X7lBmZX<3*sLmoOuamv4**lB~ClHjIw{k$qD!-R4#yL0UpOb1oXr2l5;He;_|j zeW}XsaW9rp*$M1Q_yOi_Yp#*p&9ew>7lp~HZ@7y^ICE2(5-AoijY}lHTn78a&YcOu z#zz_IvxLEl3ULt7|gCRj_K$_3*|2)G7WD^{dkC}|ZeC0U7t#lj#x*sW3x;fi# zbowkqcJGy)-(WJqy4BTS>6Oup>kU3vyTPk}TxP<$P#dcBOpznW` z0mi5-Q);XBXALT|e_JAEs77UKKgf9SsBM_nuYZGAPU{ICmUj$|0UD?^nh5=eXh_nZ z6~Z0Je?564MeclE+R@AaZcTbK%>>R-!}IBbWs;rz(~`&Zaql1DK>FXC+81^`W#AFj zehH2>gdWyOLr4-P^qckA5++?Sj@=43Dh@t9+w~SDRQKfB7-z_u7R@*1!MjBLwpPl4 z&HEel`;}O9)im($cLhf5^T2to^*O!);}nQ>)HBO0%m1cw2-;Z8u#yEw{uqPYxR2V- z`$MyNh_roCk-PMRer{OAE)X}a4}4tk>FmgZ!#Vet^>-5ugK_$TU!oRh6I8c%x&iQ! zc}qJ08uGLXp(ko`yLD-D%(s$>(z}NXLy3a@q~JMY#v}S?h^4Z(;I9kGDtKQ|cYS7~ zebo4S^5t)mxr2|bciv9zFAMd2@wc01*K=9!I3IsNKZEA7BtMxV*YdhMmQDQ2P?Ht$ zO&}Z5l~58q`tCd|I@E*yU8hWCqfh!oQuz(NCCzKtKLUnIsT$Y_0pl)eS&Un9-r2o1 zhLE>4el)Bx1Mf3ejRXaQ0a@05Y=b0nUYS_?lz2R_KrWjQ$rd~`=|Y}@obU4G4)hrWK1-w}*1DN`t^NI@qmGJvnEKRvl6KfarmZHe$H)hGxWQRq&Y+hdc|uFe|! z+(#AT7)}v?A{@o8E@lbG!#pk$1U1;UcMb&+kW;~f4@+eQ-?p| zdr+ZKy55i7?_&A22MYsX&i{2GNUFN@$xUueYu^j?pwlQ12bO7?Qqbb3d%K6Ob%^SM z&%zcw4h!#kS_A7M0u_6CoF)mStrabV`~#WeS$NjSb#S5e#8Whh`SGvxG6Gw*HSL2u z>Vy5O+9FVr#DM-qRk$lkZ=XC~N4Gzuck)d>IePXaWxc&&RlAK>T+XTQKYq=>!zMCe zNW1KCu;i83M1F&Iro81QqRcbNkw)K$9kuv5=PycEK-)_Z#IwX|;oXnC)iiqzS5qr+ zl%@6Vv~w4e4%LjPmQ<`U?RthL1`2r>t(DX+?m<4yG@E@58bJrXkah8R$OkTQr&BAN zT-$btZ?wze4|XF_$`M_1c3}-OtSC;7h4#l{6DLS{(|2F%#+0fP=eWcE*3Hh75@{hj z2%L!xSB$Ro@S;_Y4y`Ea{CN;u1l5dijONkhP1;$PyX755&aR>ccYmlL=$^PVoU3B8 zE$I;!*$Eau&9$bqN)sJ%38^Q+yfK;{iSD6ZkIzn=ADnEpxI8YJYS5*3 z31Y1`CY4L;oYv@qh$_4aUmEhs+HLw)YCFO&C$yf44DJ6uf+pzqq-}m`-C=Nz6V1#Sg*R zf{}OXX?bm?U@#5>hoRVTD_e|!z&{+&UBiYh8%Y$eeN}eu#Z5U8p0NytNYOsr13|mi z5}ppdLj^wH9cb6QEHiq2R|p15p$}AT3Fv7)@uD7+_iR@OeW`+%C?#z^G`zyAy7Vee z@@hG%Phi2d$8Ph~D$SXIt_D~yTeCGZ zuI>4c0r3~FX^(UlEu+{auQ{s?KZBR=&;xW%cj`c@N9|JoF7WL(7@r7~(8c&OtM1A4 z1)PhMNsn%>M!8n@{dR5c-?t^Hpv#ssX4ZcV%il&oCG%yNXwa5wi%e+Q-{kEvhK_du zksFg@|K0;Fivcyr2<#V)jCeECuIbXhco6D+o>VWs-exak2p#T(5L+ zvngZIH2s!2H40WXFN!Z)8#HXbh3~(pA*O{QA)zNm!g)nv#oPS;RUN5Hs8OddY&*b^ z=9NNUQekU3uo_i&JIStou3L*7asZNn=nQ)Ysh`9VekzHEOW177caWf_-be(O*l&ZP z8b|F~G;EXo&o3bFxiI)H6`0~w_XlHUME*fGBw`;mFwL+#qUwfs|LektFW|Ham$ z>7d{!g1ycUSV?u@(l4+WDzgP*>gMMlBH`(xW(R*qC|Sr0ZBj*CKIod8|5+( zg}(6SZq~CA%sVb(K+zql5vTXDy0^?!K5ht>t!kqNyBOhL@v}(Pr`|3sYU6p%NUmA5 zQ3wzn1NnR)`gUqjN^};H<@l`sw!c4yk27m@T^{@niAV#QDA$R?dG+3IQco*6e)%%b zSQPb|pE@VFZ|jl(_`kv!N}^e{3D$v5G(!cM_EJmw{$K^uZLB_&$L_oO$Lmn~GQ$NE zv2PRTP_0?|^4>Gv}O3W;k2h|-}0`SC$U!0 zu7Tw)50O(02nGcxpmwO~SxVJ3_F*JM+i1sZr#3efV$(3c2c6;wR0AAZ6bkCVSG|j| zsI;eVS@iaWCs_W85Au{pPvtzqNodP0rG7OjRS<($Nz%XJ9%Y?nsB|?$+bse-NVvS| z>QU+;sV)XS#xKmkg}md{tMCrZ+U5z+edXjUjr3KECuOzot%f&#SeDF6SLkAg?3KrTQFCp(IT8<4n;%wyzVcHjr&x9m1? zkHj9B`mWSwPCZ5C+jdDxl<+IF|hmHCf|#gZzRXu6Sn^%1J3du5FfFm`jHeSgBR z)E<=u0^<+LVpHZq4y<*{JKpvMj_Sx$7wfW$(FyjKGB`1!g(clD z$wZSJcR>BWoO3wSn{oCBk9Ioc4689!x~ir#H1}2T#`hN4SC!P3>m^B|sVwZ2s?7P5 zRP2xZUFaSf)_Y3D&0hYI@ENWu=@E^_2J~X{GqCwYm_Z&V6O&CnyzGgY0vKj#;3l<{ zP_$F9!b;ItgF;gRUJz?&f?eu(N)v9?1@f~_K;%+_Nc&~bF{mchk&yvZN`e}+!b`kg z$|~%lM;=WI$~$&GqI=D+^jDyB_{ccb4;@1wAUeZ%=tweBSFoPN^0LFln5RzQ(^G>N z9)(fPncd1X=6~7JU7NDJ>A5KyL7`VQeay`XYkCCB&1Okh>8qNW*-N9m{CoA%*L%YEJTb6xcK#P~>;Z}B8+lOjSDE9ec+ zoUVTh$&X_d`aNbRoGW6*W!Zj#QIGu^fSVkspKe9rcZ|G{J~cIslgx*oGW2Vx6&`OnW=| zQ;tX5*6A*p2HOQeN|lh?PH4{VNe&gIPnYNZl4hHx((7F=b81zh)%zS&rip&ABudj! z9fMXS!$`_LPww_O7Xl%x(p>0B^r|GQLCc|oGZ04j(3$M>pj+;6a2KW#k9NBT&s`RF z-bFUNol}nO1w%-TClXb$lEYI<4}hI#IMZcn=Lo}T;Cmh!Zhh)t)x!LPTTTNQ$0VP< z|8Vb!6ly{{cfGth0$(k7AA1lEP}j~V3t&I{D90J13J&KAYieC!e*TN%Lm^sRO#)A! zv~LuP+4+Pho=G^Ea24_9PG5Mlnod^5bI64?Vs4P7Vr8*mnbvr^NH3x`YwZO29a@E7 z*yhNI4@dA_%v~kt53({~?(5)P4U@O@i%MhX!6!&Hm8Uu9eq5;iivGV%Sx=J(Z{mJH{#)F^5k4&p-6K;*d9LMHZRjxlv0V>BRSu4S*11a4` zj=!?p$Onvn)Eicq0NF^RER3O2P}?lQTA1S;io?JXeHra*R#GLp=SMl0WgJS!J$IR$ zKYq864}@QSKg{4Wf*~C(jU!NLs5NK0{FvE6xnzZ1H72mF99`3&9n9@}ALB#S_g$de zK?(T3_1pPFJUM8I3qG1@T%vq)bO*-<7;aGM*}?8?g{XoG>j-+6UP8PSqbw(e3zU{B zWtPJ`YZprMw&|kz7uWUO6qf;O^|Qr)q_Uo z7-%`}koCf138m>&uBYb7EB}tkJN|MMrvPg(IFB+$Ik*t0z8B5J=K8#&AlMNr`GzZ1 zq_7{<>3RC9z6X3xcCyAdW@}po_P?LUr#G2md?3(uCfkc;Jz>20uhTdOWj44ocob8L zibP7+s!2hbpg5$!&|-xY+kJ~~cWkG`D`CJSuyk~lRSdihlqqUXeV2J7z9o=GTvL^D4)uxhkp&x^pyi z(=FOXJYje;A7&^E?WM7(Uw%kuhSam*Bd%zn6t+Q=TCBgRu+)bPOpm7wT)JCOBAH5! z&_=yrvlL)1>UFJW$44*-@sUt zbU!$oGwBMsf(b&WNWU>2B>yC(po6+BGF9Of9f8o9D_YXP4xWGaiJfG@twMmxMzv{h z@KkcY?f8jND)yU;mLusgg1Jd3*ZdFcx8bB&Svf_hMZ1lhkyWe-z z{DQx=n;0my2IQ2jt>30TZ9rDS5n7j5Du)L7R+e+rSme8YY@h%E@yDzZjy5AsDlGSY87cOt5i8S4`8T? z=B|+)8~$M(Cc0uwNds|Z3^g#}p81igtS>`s{JJB0T=W&V6rv40TlB|kps2NxWLfXf zN!)T}|FvuX`}d6)V5B&8=YO5_YkcJkE#rl&?ZqdZ|yRjjn{0mXpqtC`%ae~AB_(VSj)9SFYU{NqN43bW@6q> zPf8U7cr|RWqd6m37PWu>eVl$sFwN|QZ)LLQ#w@Dgt!0Nl;ndoIZbTqGZ7MYgB?UNO z%CTrmN9rk>7zxDt2}zrl10kVM1cM%K;D|L0xUtP$h;}09T7xhkwWN06*3;JVu;o@V zr`Bn@6j`FV0vz_8Mst%~%w;DsB(nJ>T!UIz6Apf}vYg5j2z_gbn!ylac(k-WIExx# z9=g=G$r)bMKwP?j3E-#i@VpgLuU=^78IM-)FmhvlsdN)TN<&LN+?8Z~_qK-X;Q7%* z#-JC1u-*LqBXg_S0VGnPfUFeQlo|(-32)V>i=*YnYL4pqNRb(xh;)C z@?NO~+%IngSD(G%GbkkmfA8tO=j^d7q-$bqUD&QP*!0!&BRY^*EPk3dY>B6niLR#avrimnZkc&B|Z& zVv$OO$QTTBEk2;NVyVTPa&@cS*Qyr>h%I>A!~M=*_uy=nA=!21gkcifPqhD|B5e85FiC zwd$etCO1^t+FcPE`QDsfoa!?xtzq=T3lknegjw$^w}q)*thRPscnn6{vc8SS@I*5- zOCM)E{Hv;ll(&*Xp1}aN-Qnq@EH5J`M~A9!qOa_W2gFFW`CFdN(@Oq+gMS<8m4upi zKym0qp6dnw%CaV(ozdma93va9s>@Fwp4NB0XJF}+tw^^Zon*o58#Wx;`Q18afVv&F zLu)a|5tbXn=T>Kt&VGpR%(5knn0D-pfHz|a!DkQ04Z!`k`jHSVL)gA>#}afi0rT@! zs1Q>wDl1wsQxLiDqi;l~k3Z9sK_L*Ry%*17gYY9k?cW3BBnuMxUJAqrIp2kC{zPKF zHQ*TKyW*Wat>{^x7P<=j%qDv|tcMwcwc-_}!u;HUi{>V<@F-Fl|E4ozjk3-o;ZY)# zjNxnGbb48P_S9VVHwomzp*jP%g9A*BM6mdJ(q&+LwCMD>En#9w>}a9Jd4Y=99M#Y| zQ#f+y47FZZCzVL1E4oK~s0WrrI8NW4Ya)Fd&7mE}6}XKsi#=w3)UZ19L+PkNb!-mdm%Ep*!!Vdj)-!!hh*lA#3H@N52Mw(=d%d*A}iG+&TW8OEDNdvY( z_vNtwEP}7{JQjT#1t;DT7$o=*IHknSX|yVwJuJCdU?|E9j$D@mRd_mwaomkJT;+Tv zPY>me{_ctksN*)Ph8r+>wZ@NhqPTr~RP78~A3G<9`iCv8$SndJsiN2F2e}A@37m8n zokxZ4EsJaT-LIk-Cs-s>m%v>bUWkfsFtWApvDjnAw8qEg2$B{{F`AXz%`^>-YT8(c zE>gBcr$h?U?sE1uZ)gNXf%@5l`b!Kb0G={Qb$G&p>WOAiZ#ms@bJjCaFI&9Mo3kIuJjzL=g67`>!OQ%~Ua9$fyKuG*w_b|<~@XDv<(7T@oa2YBeH`%P71fa)4tq(%hN&E?fs``HOJP7?{DTo);AS76uP#VaDjLXv>uIt_pa__! z#>Upw9uh7v~%gv%<0ZL2La(O(zScL z4$2c>N64pTBg1cyhX0}w{qW(1FLlH6k<{3`SI~TVuNXU%T2V8p0vaRMnMWV)R~3l_H+WrSYuy0*5Y=&&j%#~rc+!mr(Xip#hMqp?U>J#NGNvkTi@hXx zfZh@Gv;xZIM9`TE8X!hpHL7=t$-vPUfsYCuH>;hA(vbLcl$oWeRy`RgQudQ4pFu+p z-e+y27QgRD*AAYY7j$g+ur1&2>odL8`fg(D%e-tG?x_(C6N_9^JF8l9D4FN8mZ4s> zGfrg`)pq$lsss8_l-Fcbh+uIu)QYf?h`<{U)Lh)o&-ZHd_Zd2u%mg?e-6Q2~{-(qI(6k^-u2AT|UV9^u5&__}4LC5ZW-O=GJ4I^4{|i(jZTcZC zuz0fcR$bX|Xhqi8+QZiZT{=14nRYuO$QJUGAM}P1g zOnRbfWA~oB66OrBnN{eezd-{bV1|K{6MbUH*)Hf^%9L3sR)A;~xVfEXpN(F>Rk;@E zUPFQR0L*PD@u31>5?O2Jc|26He&@(QwO%T(BPM%br%t+6wzR5TH2Oa4$tNx8KN8=Q zdv&R@vFn3LUrAiuen$!Aef0G{wn&IH2*OQ1GAtW?^kLm#1saO44QO$P*>i_V(4bm0_qCYFdWQ$k&-Hu6D z0TE%m1ID8(a@YP^wZ~!9sjO-z_n4-b`Rf?Nf`CCS)A*N)+jYQa+S%V56tGb0TV%Ie zI*iP>kT2?OM-WA{wq;}u&7K)m31;;`Q__Bl2VmsMUJ@FdO{aTA68c+0NC2DdAeB49 zZdr5o?W=~x>Qd6HfJ?tB2W+c`Hj!=x2!0L1{=B~O%@#2wx7-zK&Neni0zwt^O0&_H z=Q`n*!e*ZZ9Vl3>n=yoE?GmD?z5bN*kH2u&&1A*~ey5LZl%-gpL4~iOx`Rj_k~VFv zOy!W^-*wS~yld<|z<4B?2f_TZ&y9rQa=r91LYMb&qUOfa*%C&i7L3Z+=c9Z%AW~ut zQ=f+Fs@cs`q#is&FU>GE>J&}82HpGjiw`rcaLf3uN5k|$2HKgop^ko^l~m!``~2oO zAuh5)Zj^PCyFX+-D=V!QP>ydTFYk#eoBtEk>hf~pQAL$Wmgd4u-gWAT6*H}GZLmzI^^1jT1TPHaRNx7TX1sfGWH@7vb?5Q_9JW2M!(qd$^P zzL2ob!N$qQ9G^4>-Z zEnk~yh!m2{=1gB}4Sr#JAp2l5#8GdJ-qEG#Tm3-Is2@b&Ht zq#PBxWrSi1bQKNG4558sE|^;T89%XV+vy`5V*r0<2_{9HDO*|R9erW*u5p+7LuZDJ z8u?`i4A0v~^nGeV63bHW6j9|62_4v4)l%RF5&#n!tb?z zI9u_LwTD#XGeI#;H-G2pqoyc|>Y0BWTp;>*Xw+&0H-hGRE_uw6$=hf>EJBf?b5Oo? zMi$3)IzXZZ-W;#sw@7@K*Z9OBw=WGWVLx{e;h2-?*g_T3yj8uOudk`m!sDS(oEh7? zG%Sv_o)+M>j_;IoYo4jWU5MdkiQj}0m$i!O?#719xmW#AM6rScM+V$#5W;xmkQzxf zMARivH62UB;=Rr6fenJ~c;?PJb3kJeqas*4&-v!)j*)|uFeuO>e7>O4v!tdks!ilA zkix{e!JbBkeJhjb_BCu34lJlL)s-HDg*%m?qxJ^_{D>g~f3h(Vu;}4@LCG=NJYR|P^m=H~ zjH!3Y3i~g>I0MR1tmAtJUXf&2PiK+_+ajeYPKNCxy)o=e&{{u8gHJuy6Nor*UD^G; zyqxzm#*`Df%UJzBZ_UXOJ;G5#5%)T+->>s^#WcN62FYLe7-XY_kN zfpmLHA7MgkMb@Ixu%ren!}yYzlf6ZW)n>F%?`ci%&@}L6kgrv8QIkv3gaA{p|y(agqq>`Izmyolz zL3sZ4{re*Uh2XNt?nk6^?sD_Ijh0V`g>@7YhtO4NJdl5n0#yG-_|X8Zw5EWuzdFV@ zjgB{0StL5}6-60C5I>7^OQ3F4frS9SIQbwJF4Hvn>1g+AJ#&tP?QTV}i`-w}cCVgz zJ6zELqsj;K?*^aV6Ub`)2A25PG_W<;3RF>674aY(9_DSV1z_VxX3zL{NI+LkIzlnK zNv+)PC!9tmpcU6Lc?bYV#$#~d zl0e)y3uw7d{kZ%}2?(0C;o_INRX6^gX*MI^b|S5sS-S}0&{FL!xaSO!wJn;+T&eLj z?{GTDp`rBsUms+Z{o|s?mzypdb9mq@wb}|5WmnFWE~v@Fia6X7f#D~s8MU#;R^&uc zy#a=u7P`h^IvEN1vxHbhtp<;J2bb6VJwC=CE-%N;E-NVgIGg&~@l1&1dGx9@WWup` zmhTA@Q_pP{ey^)rDDb8}NF+7m(OM7ElRzKaV(7s6xM)(5n_fcVEvl^Tn-)`0#`HWO;zu;N0P}Rs0^S87QZnFH2ZH1Pl zYveT_A?FfvEo_{a7-zQ;U?R!i8PL_-$VHo%e84fg%2;@LbN&`%H>%jEE*#rl$*k9V z+7k9~WZfuvrCK2d5d-!m?Cxg1t{v4b$yW!-mZ`S;j>1)7OpMU^o1lgE8LSXw?uL(H zR=xFEa+JPB|3q>@L#1EhLok_=k`n#v0NvR|3LP{&@<&oK^YMv7r)MBiq{q3?At%E! z>tp@Ad;RPVX>){dV#(+LxkbBJ=1y;p;YNCD2ls;Ulx7Ju0X?_-XdFcSp#-|CAFfMG zWfahBG14NI!`Y2#^`Tk{WE18~0Y%+deJ!vblmLtQQ1mmw4??FRrn7|K;rUt3%lKo0 zM0U*~PS|Z^`xS;^2-a+YA#xgdS3;WG|P`;t2lw#t+8 zZwVX}cX5^b%V6u{zj6fwO;`&=aCpdVRm0=$gZN2C<1a=Ixy%M6n~Cma)9_Jd3|1uw zi402`Z1Lo&GcgBET2~Yins!g@bt79S&^7mRJN1y&yZsCw4QkFP7aqEblcKb`!Iczp z61OXZ!jxxIAJx@=~6E%D)#k{+*!pDL({<+Idty}T;62J z+xz>(QUhcMKjM>teAogsY;Tj>a3Fh)d|F_iahs00YT%)Aui3k<@cy#eY-6l6sdddS zfv_GnqOd=)c6?vcHY9)_P)ga+d^1M{CCWIY3i#+b;akkDthe8il6j1q^*dl*%gUb0 zHcHXtzP3(Mg^!+@V8SYT@*tqbAn9Y938Utbac-;@YO%PqF_8`cWrI;$uH#Z}g6>=bbQvXVdykfl>_Mg+;Ujv)gIf0!Xt9D9Z$Di&gP0-KmP`(4skddR#a1Ge*wmIR?;WBzFx zVZHoJTM_5`on28j5&IyGjl3=(`-!+|mqHc^+{-R!|3C~yqyjckVR|pkPW-Q5OIA$7O`b;n-1+R?OCl21<<6G#?yM0rvD zZOp5uq!s>9e_`^bC46u18rDhDGH?z&|E}5^$yaIpuE(&!vVI~NdWQN&@mpmw)P2Og zN_d&$DqUc6(wNxU+(7T>R6VCa8b1LHZXNjS$!kBUs;a2G5m9fz>M6y2Jn5$6RlbOhIC5QH5-N5as~PAw%qi;oyX|m}tAZsk*VpgQ6rDG`*oz zmrRn75N?U&G~DVLP9odd&B39vu0dF<402q)>h#JtmAt7Q;{U@Y)MG@*Kh9u}68+uk z0STl-BUGGDXbDrLRP}t?WA)BV7$=LZR}VHXkIk7(&Dht8lg!#uD7e`il~)8lqdaTx zP-xH#jiG183|c-e19Me}EMVKysYm;eZxsecOg8GmD2&tls!12AQHtY`C3Aj|5YnW6eh~9`WD$@een6HYVGrQ@ z0ulrdA6p$D-}zE59VnSt5UcFWSpJ5vuKnqE(6<%xxm4)Q_EL?`d?8pEV5`KIVMFpI zIr{PG%)C3+yWVjZ__VfTOc`}q!0VX7QF$mvOGl{k?t<+pt5`S zmH>Y2$Pq_l+2ta_w%M!NsiOLvTU|ryTjP2na8{T!!#&r017Y()%EMerPrz1WXHH=Q zaDjEy7<%WBG^fqRQ%$848!ts^j0F3ofPYthUqS$2Wgq@@A0Yf^W)62UXoN{9*v3bS z>O-uItBa%`#+#Q?`v{%?jgm|ILn=j{n?+|(cBPFX$5$>epn8$0xlB7sGww=6p#w2d zJq=fiU%J5KiD7%yvz<)EKE1f>dbfHm6-;XwOC!AheN3JYmggJ)gUFRNd*b(T+D+c=5RPx)nBbx-k~TV~=fgXf1VYmE8?9L?D}J%{M~&-}0hEJJ?RFS& z?PCy11j?*wW+M`^0nL&M%g7~zr&F(HBt3)gAkGA=7w1aY$s@|`8kvs=w=hN0V$3G7 z2+#hYLGp)OexN!%F@TXR~z-a>{HWXDem;nB^C>;D0w$zUMXEexy8*& zzYK8MWEl`--Hn)}Y;dLZm}h{xNp|`v+iW@|&AA5#M@Q>4ojHH-7T5&c`+AHQQU?V$ z7Wx7b$0gk8G-Yx_GJod-;8oA3J=?=?B{_N|0?ZbL;t3|0-HZlzDRe7v7G3c=u=6Qt z!vJE|4Y>uGPe+HoK;5-$7sxs@grhy1S_DMGJ04j^<~}6eCGgm<44m^|twDoax>?2| z0R^bo;E+5_D5VZj)LeFsEh{k%)-ps|1lQZDeEDusmDN4NgsM>On(zkQ_hRG1rZ?aN z%-&Q*Ia@jfO1Oa(CB%d-e{etVD=F1ZZ1s^;i+b2OTh$p~bpP`*?M|G!M=N&s#5IhB z8cjj1Tvne7li;7`Xm{VY3m6ndZRJ{I-(JR9rHb#r5=D`BwfJ`h#@2ybCrd(QHa1)q z`)G=KAv`lNv->$@6DttUFRsy2nQpkow&DZdW4YpABnOTpZuKTz*9r^byn8hF#$2oS zl9}R)Hl02^R+9Tz1g5mEYg)^@`QUb4!LM)OY;|J=>yEWC+58HnMTGUM4FbdP*C=y9 zqIa9Eus$s@Jn|~(#`-U?{Y_d17dT-{>oO);J1x-cN<*)5$h?~d-2Xnfo%{oT#o1WJ zR$&F^(>J2gA#YM`y6^@Oh;u@~wbM?)@G%G!+V&}R9OA7Nzhfu8 z!ofH3bL&+W=DoI{IZKLk9}tNJECDInUnNkZwMwa_%(vMY%}~H$GDC6axSM%%?@eKo zlZ~=c2K&}_8n5cu_qqpY+pKv|S{j!`AtIu1kHMS$+xaD zPIeV>;HLZPPC?<0dF{iDOfA9JF9{5Wu|fpS1Zy*u^0a@NRS`bHK1O0UakVg4ls z+HDwfL(=gwj+UB3B)<#$;V4HOuL1Jor<0Q=P6S&d(Jb8)NQs%(Xt?`gku?3+mp23b zTZGE$=ehC<3dZ?w1a_>EPR+}R`|Fir?y?95?lxL-+nT~mxIpN$qZt zhe&ts8f-z3PGgXbyoR)-*d6Ddt%lF?banG#12<507o`qiLBuMmOQX_5|4TP`wXdFpep|EfHka ziwq$*VEz##7MELaks0bu1fQvm43)LD_0%EO;p>elt}zyGK+zxR;Na7h133eW?21H1 z+#5m5_@YV3!RMj<08rCDgdwPvhb7^els4gUJ0tqm(-W7OI7oJscs^NLcg-X7?l{P4 zfW>ES3^j}iNsUnzZJkZPJscB5HbsChf4i0j+IQ6#IB8jRN`(=Ya>gU{%(7*Yh+bCc z-nLz2Qnf8JMF|k(I**hXuV_ts_H@41l&!MBn)tr{s&1eSsp;nYxrjgvx6X2c>=<4% zd3(hOd|&WZ`)5mt_yC{J5pLZgRpKk^X+@9xEWfF?PM*gYmLHV+@%ER0uHFp67W0R! z7KFWhyK;*dHW)352M3pg2)ry&F5Wp2EyGCM57hxx^|%|~ zNHw%`lZ~OGRS``{;NCwv)1Het`1>s0^}a9piSqAV23%y7>eVrLm#)c{rE`M(%U=>a zb)6;pu9pxPV%>=Klo3yB&@d&TXm9t6!(Fr>AH)l>z%7O$(W4tef{p?OhbcHzO|UPy zcgUj?1~%6-4@wQ$qT`tuj@Wt~o0!Ix83O6hG1d?>s}~Vdb^wEmI?}E9$hGku8FNIhK!Qa zTj~FnS=FKvV*;7^UlwUUq?0;*YFF_QYy!*T;8>+%Rw$=K{%Imjtz)J1CSh=G=Tq7B zBd-})=n;(*dJ(vhA%cC~5J_4S@ASYYBBm~kgy-k|tnq2fF-UrS3pb*0*i{PP0>3|0 zuGTmUa0AhV+3e(YAHow*@tf>*C+C;rDe=O)q#QJ>;YJY#Fkk(SMK z@6K3ThG+$I>$fcvcOyvt(EZhBfch%OtdLKo0vrN|Lqk#y!3U(gKOA%|O5P*;ZMdul z_Te;f2_99f5JQek;&HHvErv7locRdR7Zep%kIJLV+8U>qq|#?%a&s-nK*0dw43F?B zwy>!l@6^oCl3guOrNa88`td*Ig@e;>*N2A#XC(86dde{bQb!&BNpprLOoBhD`zoG* zsy)f#ih9!bsJ0D$PI(CyaCZvrJ9p|dvKY7$OQE?U1>F3m6jjezVb7-+Zp|*>@-Rb4 z;V>&q7=yc_Vsy#C06V;XmM3r(3gsp|ZfDBcYCsqP_Sq>6-$F_xi23-s+$d%uJZZ7Uc^<++2)dqOs}Gt>5u+(Z2FPrFrm3sbI>iYU(6YU$simc9`AWIazOSr$F6!Lg9LcZfs|5aG_ruwW%c$sYO(v8S>5|&?!hO}fc%cM_we~VJ z%s~esvFXy2Q0QWZm6fG+UUqZBkA4CK_{v6?{&`EJ=&LL?I(d~&k7GkM=3_rLQPAPK zYzcc^1Kex+o$@9Nj9BPo`F$DHIPLi|Lo2aNr1zb`^II1OM`xMZHS~Pb444)39oi|h zbD&W>@gXA%ia{`UOztpJd18npZ1pQWr%rlONyMl6wvlTdTQumxS9+J8=upn@s zvbA|7@m&n~@^(Q;IhK3KIEKGmj7`jS{ts2&wv$lp1U`x)v zXItym7I!a8PTGA%O8eZvnKhp|D`D zR07L==%@p_#L50IzrTC0ZB)PZ17o(h1+9OS=+aGmQxo^-P5`U1sC~PwO)9&RY=tP! zeB1FPdC1ID_%V6ZRa-}y@)st&fmq~zRTlXo6Y8+mrwcww$1zSG!bMV9d4Gp-kD<-j zHY0;{qJPFy7=ZS?^IWq1YZkHZP+>XH)>IO<5$oajjQM!^rn)dR4QpMQiulp)m4dX0biyIQQ_-9`JrhanA z8q<1q$$j5RnY+ADzxdPgNsgj|dXCT+UbRcs5KZwNhV(k{!SL@{4yn)T%*T2PF(Pk= zl4=(!9Lhg4cA7b9uH=EMjidNqA2}1If|gP5iVqo;;&}~zt)n=lu9;k8 zIzEy(l^RALawUw;zfyYMKS2uVU(>Ea{K&(WG)xpVj6bceukZdy_6Q>PCN^h`_uu71 z-OuA|l7*Ryj622>53}U{bO*b)Sar{S?UU57BPFO=U<(`ZeZ{SUa_3~j2w2a>_lA`-i>8CpHuWi4+aNoYt@aYY9<_B zJZoPNjg~H!A^kLvTsZL}P}R(q2edvC;@&}tR175kD zGlGPz(#B?SR5>PzG@c~fmi?Hu!e^kWAeW$<}o^I9FLK#f$K-FdHYj`u5mzFJq1 z&#;Y$471bDgm5J$n6SaFF0&rNWElu);#!#5squva+Htu4bR7 zx3tJ9^Ngl}#<})U9jdgG75@yZz`IcwMG6ZZ?keHNOZW(xwKH5Z1616)=MelKg4DG* zX}#P#FxmvU`64g}k8g7-0DgYC@F#|D^{dr@+eeX9;I`kd3{&qfI)1@Kq5nHwEWExr zUpd)5S-Mi^dBX-Xn{p=3@V5k!qQb2#UY4EAeD?M^GAFhK&A`rg@J4q)@&c@tjqt#o z7n^S(gKO>s3{U{d^MNTIZzq-Wj*m^h#|Nvu?R{j9%kg-LWIp!2d+Tk2csD}#=$Gyo z`zRfC#U?)eq`}(QK93GgeHoRQSozHv`wzM1ry!8~EFN)vakQs;Z9=wnwQDV$s@I$P zfoYPwG9gBKfQp#F61XTlYc*@9Z_yi8yg5CWrNk`~^^#ZKi@{YI%O}756foA`@*tem z?916+@>Zdxmv%ntL;v{rhvvL*ONgfyy3N_0tmkC>n=2lRZ=QxM=f4$l^*VfDf{;54 z67tQx{buLE*oF&Ri88&z~c4A-;KiP%4iemjgX5zx@wMwh;d4N_d`6o3mE8f zlJ_%}qQ7S%nuOk2xYh--rxC|}&A-Xt4dneANIvl-G)ZIY-3et% z*O}twxs~#+byaw`5UGrDFkZm>`ZDzL=b{<&!`ll+u1$m?&5A!u?vN(N|CkDOI8XBY zxSpe~h7_3(DdAnKaut0WN1xR{u9jJv{rIN*B~$ z6gd?^YFC#Pl_HG_{#t@$tA2KTkERi=yh_AfHGJlj)1PS&-Y;LpaJP#VZkqi4EEp9m+TD5<;czty_X%l@w(wQ^#%qQCzT%1Y<%7CHo z>T&D|?xfve;{6XBd%TPX1n`8!;RWO^*ke62&3@Ci=nighG3xy4$DY*tRTG{>MIMV` zcWy;2?cd#~a*f8XS65Fc(Fu?0n9rADPd*%~nH;d50%r8cJrHd6U3ithhGmawTaifB ztG|~-RK&?m7rGoD#>d&QaJO@Z9)rBvuCt?!q$xfkZ&W3~ek3RR&-iEwksijF@`WbU zx2@Zg5VL<33{joJ`Blqb4S513PxIc8sT$WuJ zum1b>`f}^~^0bO5osISNR~ytLS&T3`Dz9IIU0hB!V5MB}3$T?P7lXSTH+@H>Am8uk zt0(RME@vA-fkuhEK32GDW6CXe=`{@yTQ(B(_U`~tGdkjnZk-=K3l@m3UldFxu0J{p z834eCvzzdxKa|_v2=J#`BIog^XD%CML^1xSq*p)qzFJvX6%;TM=Z)rTf2JvtdsO`X z-%>K)BmhN3SoQVl{FE?Ea6Q)XhZ*o78Dz3eecbGAVzh<$7Wa7tL zyuRe4#32UlWq~RFsT4ZepRz%DNFJnkmz5x9?NOVg1Qhmj=P{eB#56kb^(L z?hO2VzfTvVzqZNk5m;eH0XyEuZA;#@2O$OmXGEL2+E^rt;**3RQ_rseJv8ZIr$H0m z#>le?FVBDDj7Xq8AnEuuO7w1a6YyQ&6x^j4oY|1Zy?_4PEP!yC3;3gu-*A?47WU-E zG%A5R@!xVRu+p0q1|B^-RlP31wcADSY=zDgc0Drc`R-u3rB;8O4^3s3*-33xM>Y-M z6MVzMN_lsle~lK|T4`LI0LSZ*eG!f0Lx1MiLVb8kw#CGyRD67NauReQSK!;EM}_=^ zILEB{u3H-2`OgtngYUXNWtb1hdEE>za}%3TFybz98)K2S^}PmLP^I1b=Jm(3&3qIX z+dsdbd#3g^vIT*G4ZVa&6`v0{&;P?|bCbr&jpB9WfW`xY?$uzUi!= z{8FY;fatM7gAnU&xJUg=n}v^$Z>X;j9fs->qLiWuwLE}r{Y!z+&LLpnOaJI6kw=M? z(tM%?p0|XZdcER1xty9vE7Xx>NU>+e0tyTUZA!!kH&Zk4o=k2M5F~ljUIDc22)Uii zX7L(-_;4bUbgr{Cr~)Xf!9qeTrAC_U+Wh8?|pwsp8c^+ddF=`AB$js|3hdb zpEMc1zH}}YU2&Osv5laf|09(<>`*y_egJbbhynbXG;38X{0UB1$sPIrfw)!Sl64OB zDh3p^#jXNE3Rd{+lwCmL45_G?V`IfCp?jrn97b(jLDk#_N~ zk1{m(rVRRhEZt_Nn#4htNdUe#!7ro-g2?BJz}M$9vTS{{!AWpbU-p zplQPiJnwt+GBE>l=72#rovpDu;BxoJ0pSnTiRGt4C?%}}18Fik;`$+9YK2k^PQ5Y;6Icf=+(P^Uf&S}m^>8|Hw(Ppk_D2#4yU&pkF|Ib4btTVa^qqJjqVg2w zJ75SIB(>$;{;ZDu^T_!r*D&t@d-o$xUQ4{g`@3>RD(m@7+;K(8{Iae|lAmSw94&7Y z>F97wiuN-QsFRzrrPJt}GvX57TFAQ!HhC%`yvcJPjwO+VD<;Kv!dLB}w?W@(GI-tV z*~g|oJb0#jH?;Nbuk0t-{fAFzpaPq&t zz^5c}J4d|vS*%+3?R4$PElE^u)C-n#Jo0wUVmXkA54~C)7_C1 z&g&TTLVCll)sw*65H{KCk>2+1cJ}Pgk<$&8nLc&*bWQPcfcn>hpc-jCuH?hY#L0Vl z$zZglUYm@gH3jZ(P#SvoXSa&qp1zZ^Z8+)MwE8A_rjW%S^y;HeOy9hD5R(`&ad$uG zOiPoOZ-GRTXxULeWEMt3r&3?c_c6=p%S1czp-+tm!#bHMA`R9s(f|`_Z~Bd^)Y~I% zLXIa?9;@oLc-4lwM(jitOH{Glg7`mnv-lz#bH!;co^RP=eVU@S;?$B_M8B!J?mF4? zek_D*;Cy$!k=Wm-Zu3}cii>9;JLOhy1y?(98G`b3PMF}63MOeim6^?6rdvcMLhbw9 zcJdJhvY=iOJF}$~ZlSt%+FtW4FlL;Q)bM)YHi*1NcdzhKhP&GAU5grHQwqsvx}RpF zY?EsEUi^Suk3`Q5P6 z2I7WdZIdLIcP^e-8}k|o^0UQtV1nS~B|gGm2K43p zUU>(Vbb0v)Wx#2QEioAEdv=$MtAxLT>Ky#C= z%Qfn?OQzncLAGtZ!Zz7WfKojFy(c9_>(X*ZK-<9jJwa*%0U8Ch-e*TtDWQS?ZB~qw o{=c1y|F=@||EG