From 95520daebc5f9500f59ae4a554a0fde26430fe3a Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 15 Dec 2023 14:25:44 +0100 Subject: [PATCH] moldy glyphids --- .../com/hbm/blocks/generic/BlockGlyphid.java | 21 ++++++++---- .../blocks/generic/BlockGlyphidSpawner.java | 30 +++++++++++++--- .../com/hbm/entity/mob/EntityGlyphid.java | 32 +++++++++++------- .../hbm/render/entity/mob/RenderGlyphid.java | 30 +++++++++++++++- .../com/hbm/world/feature/GlyphidHive.java | 5 +-- src/main/resources/assets/hbm/lang/de_DE.lang | 3 +- src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../hbm/textures/blocks/glyphid_base_2.png | Bin 560 -> 0 bytes .../textures/blocks/glyphid_base_infested.png | Bin 0 -> 594 bytes .../blocks/glyphid_base_infested_alt.png | Bin 0 -> 585 bytes .../blocks/glyphid_eggs_base_infested.png | Bin 0 -> 423 bytes .../textures/blocks/glyphid_eggs_infested.png | Bin 0 -> 747 bytes .../textures/entity/glyphid_infestation.png | Bin 0 -> 1288 bytes 13 files changed, 96 insertions(+), 26 deletions(-) delete mode 100644 src/main/resources/assets/hbm/textures/blocks/glyphid_base_2.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/glyphid_base_infested.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/glyphid_base_infested_alt.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/glyphid_eggs_base_infested.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/glyphid_eggs_infested.png create mode 100644 src/main/resources/assets/hbm/textures/entity/glyphid_infestation.png diff --git a/src/main/java/com/hbm/blocks/generic/BlockGlyphid.java b/src/main/java/com/hbm/blocks/generic/BlockGlyphid.java index 267624e28..be1613d3a 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockGlyphid.java +++ b/src/main/java/com/hbm/blocks/generic/BlockGlyphid.java @@ -11,8 +11,9 @@ import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; public class BlockGlyphid extends Block { - - public IIcon[] icons = new IIcon[2]; + + public IIcon[] iconsStandard = new IIcon[2]; + public IIcon[] iconsInfested = new IIcon[2]; public BlockGlyphid(Material mat) { super(mat); @@ -24,20 +25,28 @@ public class BlockGlyphid extends Block { long l = (long) (x * 3129871) ^ (long)y * 116129781L ^ (long)z; l = l * l * 42317861L + l * 11L; int i = (int)(l >> 16 & 3L); - return icons[(int)(Math.abs(i) % this.icons.length)]; + IIcon[] icons = this.getIconArray(world.getBlockMetadata(x, y, z)); + return icons[(int)(Math.abs(i) % icons.length)]; } @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int meta) { - return icons[meta % this.icons.length]; + IIcon[] icons = this.getIconArray(meta); + return icons[meta % icons.length]; } @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister reg) { - icons[0] = reg.registerIcon(RefStrings.MODID + ":glyphid_base"); - icons[1] = reg.registerIcon(RefStrings.MODID + ":glyphid_base_alt"); + iconsStandard[0] = reg.registerIcon(RefStrings.MODID + ":glyphid_base"); + iconsStandard[1] = reg.registerIcon(RefStrings.MODID + ":glyphid_base_alt"); + iconsInfested[0] = reg.registerIcon(RefStrings.MODID + ":glyphid_base_infested"); + iconsInfested[1] = reg.registerIcon(RefStrings.MODID + ":glyphid_base_infested_alt"); } + protected IIcon[] getIconArray(int meta) { + if(meta == 1) return this.iconsInfested; + return this.iconsStandard; + } } diff --git a/src/main/java/com/hbm/blocks/generic/BlockGlyphidSpawner.java b/src/main/java/com/hbm/blocks/generic/BlockGlyphidSpawner.java index 0150ad3d5..a212e980b 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockGlyphidSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/BlockGlyphidSpawner.java @@ -8,18 +8,25 @@ import com.hbm.entity.mob.*; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.pollution.PollutionHandler.PollutionType; import com.hbm.items.ModItems; - +import com.hbm.lib.RefStrings; import com.hbm.util.Tuple.Pair; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.item.Item; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; public class BlockGlyphidSpawner extends BlockContainer { + + public IIcon[] icons = new IIcon[2]; public BlockGlyphidSpawner(Material mat) { super(mat); @@ -30,6 +37,19 @@ public class BlockGlyphidSpawner extends BlockContainer { return ModItems.egg_glyphid; } + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return icons[meta % icons.length]; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + icons[0] = reg.registerIcon(RefStrings.MODID + ":glyphid_eggs_alt"); + icons[1] = reg.registerIcon(RefStrings.MODID + ":glyphid_eggs_infested"); + } + private static final ArrayList, int[]>> spawnMap = new ArrayList<>(); static { @@ -80,7 +100,7 @@ public class BlockGlyphidSpawner extends BlockContainer { if(list.size() <= 3) { - ArrayList currentSwarm = createSwarm(soot); + ArrayList currentSwarm = createSwarm(soot, this.getBlockMetadata()); for(EntityGlyphid glyphid : currentSwarm) { trySpawnEntity(glyphid); @@ -109,7 +129,7 @@ public class BlockGlyphidSpawner extends BlockContainer { } } - public ArrayList createSwarm(float soot) { + public ArrayList createSwarm(float soot, int meta) { Random rand = new Random(); ArrayList currentSpawns = new ArrayList<>(); @@ -121,7 +141,9 @@ public class BlockGlyphidSpawner extends BlockContainer { int[] chance = glyphid.getValue(); int adjustedChance = (int) (chance[0] + (chance[1] - chance[1] / Math.max(((soot + 1) / 3), 1))); if(rand.nextInt(100) <= adjustedChance) { - currentSpawns.add(glyphid.getKey().apply(worldObj)); + EntityGlyphid entity = glyphid.getKey().apply(worldObj); + if(meta == 1) entity.getDataWatcher().updateObject(EntityGlyphid.DW_SUBTYPE, (byte) EntityGlyphid.TYPE_INFECTED); + currentSpawns.add(entity); } } } diff --git a/src/main/java/com/hbm/entity/mob/EntityGlyphid.java b/src/main/java/com/hbm/entity/mob/EntityGlyphid.java index f6c0ae768..a4dc08af5 100644 --- a/src/main/java/com/hbm/entity/mob/EntityGlyphid.java +++ b/src/main/java/com/hbm/entity/mob/EntityGlyphid.java @@ -80,8 +80,14 @@ public class EntityGlyphid extends EntityMob { /** Yeah, fuck, whatever, anything goes now */ protected EntityWaypoint taskWaypoint = null; + //subtypes public static final int TYPE_NORMAL = 0; public static final int TYPE_INFECTED = 1; + + //data watcher keys + public static final int DW_WALL = 16; + public static final int DW_ARMOR = 17; + public static final int DW_SUBTYPE = 18; public EntityGlyphid(World world) { super(world); @@ -99,9 +105,9 @@ public class EntityGlyphid extends EntityMob { @Override protected void entityInit() { super.entityInit(); - this.dataWatcher.addObject(16, new Byte((byte) 0)); //wall climbing - this.dataWatcher.addObject(17, new Byte((byte) 0b11111)); //armor - this.dataWatcher.addObject(18, new Byte((byte) 0)); //subtype (i.e. normal, infected, etc) + this.dataWatcher.addObject(DW_WALL, new Byte((byte) 0)); //wall climbing + this.dataWatcher.addObject(DW_ARMOR, new Byte((byte) 0b11111)); //armor + this.dataWatcher.addObject(DW_SUBTYPE, new Byte((byte) 0)); //subtype (i.e. normal, infected, etc) } @Override @@ -282,7 +288,7 @@ public class EntityGlyphid extends EntityMob { public boolean attackEntityFrom(DamageSource source, float amount) { if(!source.isDamageAbsolute() && !source.isUnblockable() && !worldObj.isRemote && !source.isFireDamage() && !source.getDamageType().equals(ModDamageSource.s_cryolator)) { - byte armor = this.dataWatcher.getWatchableObjectByte(17); + byte armor = this.dataWatcher.getWatchableObjectByte(DW_ARMOR); if(armor != 0) { //if at least one bit of armor is present @@ -322,7 +328,7 @@ public class EntityGlyphid extends EntityMob { public float calculateDamage(float amount) { - byte armor = this.dataWatcher.getWatchableObjectByte(17); + byte armor = this.dataWatcher.getWatchableObjectByte(DW_ARMOR); int divisor = 1; for(int i = 0; i < 5; i++) { @@ -341,7 +347,7 @@ public class EntityGlyphid extends EntityMob { } public void breakOffArmor() { - byte armor = this.dataWatcher.getWatchableObjectByte(17); + byte armor = this.dataWatcher.getWatchableObjectByte(DW_ARMOR); List indices = Arrays.asList(0, 1, 2, 3, 4); Collections.shuffle(indices); @@ -350,7 +356,7 @@ public class EntityGlyphid extends EntityMob { if((armor & bit) > 0) { armor &= ~bit; armor = (byte) (armor & 0b11111); - this.dataWatcher.updateObject(17, armor); + this.dataWatcher.updateObject(DW_ARMOR, armor); worldObj.playSoundAtEntity(this, "mob.zombie.woodbreak", 1.0F, 1.25F); break; } @@ -388,11 +394,11 @@ public class EntityGlyphid extends EntityMob { } public boolean isBesideClimbableBlock() { - return (this.dataWatcher.getWatchableObjectByte(16) & 1) != 0; + return (this.dataWatcher.getWatchableObjectByte(DW_WALL) & 1) != 0; } public void setBesideClimbableBlock(boolean climbable) { - byte watchable = this.dataWatcher.getWatchableObjectByte(16); + byte watchable = this.dataWatcher.getWatchableObjectByte(DW_WALL); if(climbable) { watchable = (byte) (watchable | 1); @@ -400,7 +406,7 @@ public class EntityGlyphid extends EntityMob { watchable &= -2; } - this.dataWatcher.updateObject(16, Byte.valueOf(watchable)); + this.dataWatcher.updateObject(DW_WALL, Byte.valueOf(watchable)); } @Override @@ -569,7 +575,8 @@ public class EntityGlyphid extends EntityMob { @Override public void writeEntityToNBT(NBTTagCompound nbt) { super.writeEntityToNBT(nbt); - nbt.setByte("armor", this.dataWatcher.getWatchableObjectByte(17)); + nbt.setByte("armor", this.dataWatcher.getWatchableObjectByte(DW_ARMOR)); + nbt.setByte("subtype", this.dataWatcher.getWatchableObjectByte(DW_SUBTYPE)); nbt.setBoolean("hasHome", hasHome); nbt.setInteger("homeX", homeX); @@ -587,7 +594,8 @@ public class EntityGlyphid extends EntityMob { @Override public void readEntityFromNBT(NBTTagCompound nbt) { super.readEntityFromNBT(nbt); - this.dataWatcher.updateObject(17, nbt.getByte("armor")); + this.dataWatcher.updateObject(DW_ARMOR, nbt.getByte("armor")); + this.dataWatcher.updateObject(DW_SUBTYPE, nbt.getByte("subtype")); this.hasHome = nbt.getBoolean("hasHome"); this.homeX = nbt.getInteger("homeX"); diff --git a/src/main/java/com/hbm/render/entity/mob/RenderGlyphid.java b/src/main/java/com/hbm/render/entity/mob/RenderGlyphid.java index 49b0ea4f8..6ad109605 100644 --- a/src/main/java/com/hbm/render/entity/mob/RenderGlyphid.java +++ b/src/main/java/com/hbm/render/entity/mob/RenderGlyphid.java @@ -3,6 +3,7 @@ package com.hbm.render.entity.mob; import org.lwjgl.opengl.GL11; import com.hbm.entity.mob.EntityGlyphid; +import com.hbm.lib.RefStrings; import com.hbm.main.ResourceManager; import net.minecraft.client.model.ModelBase; @@ -13,10 +14,13 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; public class RenderGlyphid extends RenderLiving { + + public static final ResourceLocation glyphid_infested_tex = new ResourceLocation(RefStrings.MODID, "textures/entity/glyphid_infestation.png"); public RenderGlyphid() { super(new ModelGlyphid(), 1.0F); this.shadowOpaque = 0.0F; + this.setRenderPassModel(this.mainModel); } @Override @@ -24,6 +28,21 @@ public class RenderGlyphid extends RenderLiving { EntityGlyphid glyphid = (EntityGlyphid) entity; return glyphid.getSkin(); } + + @Override + protected int shouldRenderPass(EntityLivingBase entity, int pass, float interp) { + if(pass != 0) { + return -1; + } else { + if(entity.getDataWatcher().getWatchableObjectByte(EntityGlyphid.DW_SUBTYPE) == EntityGlyphid.TYPE_INFECTED) { + this.bindTexture(glyphid_infested_tex); + GL11.glEnable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_ALPHA_TEST); + return 1; + } + return -1; + } + } public static class ModelGlyphid extends ModelBase { @@ -43,11 +62,20 @@ public class RenderGlyphid extends RenderLiving { GL11.glEnable(GL11.GL_LIGHTING); GL11.glDisable(GL11.GL_CULL_FACE); + this.renderModel(entity, limbSwing); + + GL11.glPopMatrix(); + } + + public void renderModel(Entity entity, float limbSwing) { + + GL11.glPushMatrix(); + double s = ((EntityGlyphid) entity).getScale(); GL11.glScaled(s, s, s); EntityLivingBase living = (EntityLivingBase) entity; - byte armor = living.getDataWatcher().getWatchableObjectByte(17); + byte armor = living.getDataWatcher().getWatchableObjectByte(EntityGlyphid.DW_ARMOR); double walkCycle = limbSwing; diff --git a/src/main/java/com/hbm/world/feature/GlyphidHive.java b/src/main/java/com/hbm/world/feature/GlyphidHive.java index f0ddf5c41..a5e8df06b 100644 --- a/src/main/java/com/hbm/world/feature/GlyphidHive.java +++ b/src/main/java/com/hbm/world/feature/GlyphidHive.java @@ -105,6 +105,7 @@ public class GlyphidHive { public static void generateBigGround(World world, int x, int y, int z, Random rand, boolean openDesign) { int orientation = rand.nextInt(2) + 2; + int overrideMeta = 0; for(int i = 0; i < 11; i++) { for(int j = 0; j < 7; j++) { @@ -115,7 +116,7 @@ public class GlyphidHive { boolean hasWall = !openDesign && (block != orientation && block > 1 && block < 6); if(block == 1 || hasWall) { - world.setBlock(x + i - 5, y + j - 2, z + k - 5, ModBlocks.glyphid_base); + world.setBlock(x + i - 5, y + j - 2, z + k - 5, ModBlocks.glyphid_base, overrideMeta, 2); } else if (block != 0) { world.setBlock(x + i - 5, y + j - 2, z + k - 5, Blocks.air); } @@ -123,7 +124,7 @@ public class GlyphidHive { } } - world.setBlock(x, y - 1, z, ModBlocks.glyphid_spawner); + world.setBlock(x, y - 1, z, ModBlocks.glyphid_spawner, overrideMeta, 2); } diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 34cd14145..9a561713c 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -508,7 +508,7 @@ death.attack.tauBlast=%1$s lud die XVL1456 zu lange auf und wurde in Stücke ger death.attack.teleporter=%1$s wurde ins Nichts teleportiert. desc.item.rtgHeat=Hitzelevel: %s -desc.gui.rtgBFurnace.desc=Bönitigt mindestens 15 Hitze um zu starten$Je mehr Hitze, desto schneller der Vorgang$Hitze über dem maximalen Level hat keinen Effekt$Gold-198 kann zu Quecksilber zerfallen +desc.gui.rtgBFurnace.desc=Benötigt mindestens 15 Hitze um zu starten$Je mehr Hitze, desto schneller der Vorgang$Hitze über dem maximalen Level hat keinen Effekt$Gold-198 kann zu Quecksilber zerfallen desc.gui.rtgBFurnace.heat=§eHitzelevel: %s desc.gui.rtgBFurnace.pellets=Akzeptierte Pellets: desc.gui.rtgBFurnace.pellet=%s (%s Hitze) @@ -527,6 +527,7 @@ entity.entity_glyphid_blaster.name=Glyphid-Blaster entity.entity_glyphid_bombardier.name=Glyphid-Bombardierer entity.entity_glyphid_brawler.name=Glyphid-Schläger entity.entity_glyphid_brenda.name=Brenda +entity.entity_glyphid_digger.name=Glyphid-Gräber entity.entity_glyphid_nuclear.name=Der dicke Johnson entity.entity_glyphid_scout.name=Glyphid-Späher entity.entity_ntm_fbi.name=FBI Agent diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 720fc1d5f..78f5468b6 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -1036,6 +1036,7 @@ entity.entity_glyphid_blaster.name=Glyphid Blaster entity.entity_glyphid_bombardier.name=Glyphid Bombardier entity.entity_glyphid_brawler.name=Glyphid Brawler entity.entity_glyphid_brenda.name=Brenda +entity.entity_glyphid_digger.name=Glyphid Digger entity.entity_glyphid_nuclear.name=Big Man Johnson entity.entity_glyphid_scout.name=Glyphid Scout entity.entity_ntm_fbi.name=FBI Agent diff --git a/src/main/resources/assets/hbm/textures/blocks/glyphid_base_2.png b/src/main/resources/assets/hbm/textures/blocks/glyphid_base_2.png deleted file mode 100644 index 541a53c5f56156aede4138dd7d332424794fa7f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 560 zcmV-00?+-4P)r7UJMf+)l?Omx>Fj}sc&pbu~ZZtET9o(Dj%OG}a{B-o{F_bJPVN3=m71wfF9 zr>%E5W(RcF!QQ6?yHxJkT@!%0=aI)rNsz}0K@`eEmSIXIA3iRyUp8{z9*)okeeyUd z6$|h>4gkCNkf3Omd12o*FrlN1$mtC`(?v1JJ8lU z(p*I=VWcqdk?N1lhEw(j!|VdkHg%eR zPc)j%8d!H7TJJiX@`A>7B~Z@&di5-A=&o}E7V{89A&T8KrKh>)v8`r*3bGB+f*=)O y%P>*w;fNp#v4?&0H|_-NP5U^fhrd)gBjO% zSBSWa4`7?vXt$17tv3wPKFiXe+Ym_)fKg|Hl9g$oWQE)oE-BKPo8;Z-J@?+D`yYEb zBJQGOMO|xrTU`A3Z4gdE6bnSq1DQh%!|a?P=d9KnEZ}s0gGhQbY_T{A$=|*?Ag!)7 zN><#@9$Bq7v|C3gS#kaSi<{QBsCKvKJBDGfUu`#yJ=?rS?B#p*{8PulAniNJBAq#+ z$H|48H1={c!KgFgXZaP8>_|!tNs-O~7^HmwrsXY>&KRc`d(2^G$O+}8Ls7CikoMQZ zAC|$)HMEVwFu-4}Hz-*#%+B|##5kFj!3=`Ev~{hCbY|}B%*Z&M-!PrS`0UcTkk}yG zT?r5EZtq@+O=XBHGesMeFi}1^ccNp(rh*liU(<*Ry$;~)-;|=0><~#^44)N zNc%5}tsmsJz!yo+$oKS*QD?$3m>KUUILlfUY*R($B=%!3M?MwAUQUg6&(>M-^ld#D)dD1aHAx^a*$z zq%OMej!0BdA+1`K3NwmEIK;7mRw|1yL#)nb{NYnV1j(0HfY!0t-N1>V=0X1E`*VyI7{?m$RMNuMC#rgc2 zRlcU>HIb>}!}ODx*3w;d$8Cr|)_VZL=%b zQ7`7p)eVTMNE$HdZ|t0&p5Z$llkvfS3R)bkx)y2M+RKX@mSt`LHIVB%SgU-EOcjG+ zx58E1v@G+AwM9|lJDz#3zutd-IGxRzeZHhox3G6CT3!=-$0GajlizoLh{6uGZJSNK zy}hID``ETkUEBwUTGflIZ{$TzJMaN`(tb?2`c)||ijt%sC64>nh^z_VV zk@VvS#d;r7wZIZ0Fq}rct=%7E+|Vv)P>C`YTT$2{RSTl9v)R0VzpYMA)xyN}*%tCI X^w1Mf)T-^U00000NkvXXu0mjfDq9bo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/glyphid_eggs_base_infested.png b/src/main/resources/assets/hbm/textures/blocks/glyphid_eggs_base_infested.png new file mode 100644 index 0000000000000000000000000000000000000000..c4308d58a14300f969bc074dfb12c568671243c7 GIT binary patch literal 423 zcmV;Y0a*TtP)8EYWp^-wKff^wIU+i_l>F|BJ&*nY$0Wx z-QBsai&6^iPAP@^z7Y}jeV_A}Qr;d!0;~ID4BVYaDVpLw@GTw#oaZ^sNh!@ATWeg` z#dl2;*92m=TI+27&fd&;yN*_xU36xTJMB}&2l{9`1g|QRv&R>QO4LbT7 Rdbj`p002ovPDHLkV1gZMxCa0L literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/glyphid_eggs_infested.png b/src/main/resources/assets/hbm/textures/blocks/glyphid_eggs_infested.png new file mode 100644 index 0000000000000000000000000000000000000000..93786bc31f6bba1b63eed61356441c1e1be0926a GIT binary patch literal 747 zcmVF|9LGQI&Wtn5ya~2~R4T0Ku!oQeHicG++9+6v^yVc9 z>J(n=kc63p7w1q!2fav#x|m*;{^)ImAf+NyB!Uppw2j>j-;VC6)pS_rMZeRJ-}}Ay z`||mHU(Lw%y8*kAano2aLB8PP`xT}K5&*P6x(vWd-er0qfs_&e$8m^c+%(Cah42mX z1s8yQ^+(uyaZ1(w=s2cnsb0r%0MO*-5CBq2vfYy;dn)X!KY~|UQ}va+i)mWwF~@Pp zxM=_)p;XWFkWyCj(i*jUGypu$V|pNg?^p2s3JZ^uv_HCx+#KRZ=^-^E*Y5^G2-@y7 z1CZ^WRMLwRDWsH2ZkV_BFA^)S^Lns}2teDtW(-}!&^3}h3oMQ{{dZXi0YF1TLzRbL zVP>`pQVS0Y>rb%bb(p55CUy>YVCWiSU9S*AkbZC$fUz!=BF$)dNw&L8vZn&2HSBmD zdoND0INF4vYpmp5TKg?>y^R1wb&J;iMSQ=4X<9@=snY`q?06l2mOd+ZA^rKc%K&We z{8DR;0H$FOZ%nJA20ZzIvu8|{6bF{hviA;=7#=jge^e0f^S z@8#ocZEevx+`*U0uN-JzL(_D8zru+#->MM9si7;Qx<$U=lDJj zcHT;eJ|Ix8y(+q&*sNFEKD-2@;UtJ{r5D)RGC6iL zqUvdwXrL6mA0mWM_HMcm5nAnj&}#RMHNl(kiii>|F!f4l*B&urDcge^v1bE02%Rsc zAq<4rYWD;A+OlKCoDUoUh^mU=oqS;f?ADhTuj%z;)BW9s(}Y6dr{e;xh|yD6K#gmJS;|W^1uuIr( z$`BFQoAZ=)Ifg-R9K<$%C)Xz;+}}L~(lH^Q<3;YQYFm6bPb*wJ4;jZ)YE>H*ho)I7 zEW88k+D;LIh=doZTm})RT4mmJvtET<-!%2)2DQeMMzC2h)j-zZQ>fq^%Aqgr)uL6c z`Bn7*%7CY0Y?J&5EtKkv?|2tpR9RiIK~%NAkr~Et;tsf}u9QqP=#2y2Vn&&r3#kGm zBB%p$DL~a^q-cBL3lkAW!%6V?@RD1piJ!%(qPtq6#!Hn+UNLvazNuq0eUMyNEThtr zSxit9W!F4EaN3pjqB#P@X1xmIl{!^x zGwr1^>$Ir6oW-yW&!TD@$%owq1; zKj%|QU01046t0rG6l)v2fxV{fv}>lTvL>o45IIybx$YEEJL-*F*lN8eBL$;en24-9 z>Q5?kkuWYM40_{$g=Y{1NB4J6!ROaIM#D+j-KF*7i0dQ`4GqR<#do=R%?qfq}}nkHh_U`mYoK0000