From da664a941486fa425398136c0645dbe303042cce Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 6 Feb 2022 20:17:05 +0100 Subject: [PATCH] some texturework, NBT-driven kits --- src/main/java/com/hbm/items/ModItems.java | 3 + .../com/hbm/items/special/ItemKitCustom.java | 110 ++++++++++++++++++ .../com/hbm/items/special/ItemStarterKit.java | 7 +- .../java/com/hbm/items/tool/ItemWandD.java | 41 ++----- src/main/java/com/hbm/util/ItemStackUtil.java | 41 ++++++- .../assets/hbm/textures/armor/rpa_arm.png | Bin 709 -> 839 bytes .../assets/hbm/textures/armor/rpa_chest.png | Bin 2180 -> 2606 bytes .../assets/hbm/textures/armor/rpa_helmet.png | Bin 1734 -> 2508 bytes .../assets/hbm/textures/armor/rpa_leg.png | Bin 706 -> 873 bytes .../assets/hbm/textures/items/kit.png | Bin 0 -> 222 bytes .../assets/hbm/textures/items/kit_1.png | Bin 0 -> 108 bytes .../assets/hbm/textures/items/kit_2.png | Bin 0 -> 105 bytes .../assets/hbm/textures/items/kit_toolbox.png | Bin 0 -> 245 bytes .../hbm/textures/items/kit_toolbox_empty.png | Bin 0 -> 209 bytes 14 files changed, 167 insertions(+), 35 deletions(-) create mode 100644 src/main/java/com/hbm/items/special/ItemKitCustom.java create mode 100644 src/main/resources/assets/hbm/textures/items/kit.png create mode 100644 src/main/resources/assets/hbm/textures/items/kit_1.png create mode 100644 src/main/resources/assets/hbm/textures/items/kit_2.png create mode 100644 src/main/resources/assets/hbm/textures/items/kit_toolbox.png create mode 100644 src/main/resources/assets/hbm/textures/items/kit_toolbox_empty.png diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index ff644abcf..42a596e7b 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -2272,6 +2272,7 @@ public class ModItems { public static Item hazmat_kit; public static Item hazmat_red_kit; public static Item hazmat_grey_kit; + public static Item kit_custom; public static Item loot_10; public static Item loot_15; @@ -4604,6 +4605,7 @@ public class ModItems { hazmat_kit = new ItemStarterKit().setUnlocalizedName("hazmat_kit").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":hazmat_kit"); hazmat_red_kit = new ItemStarterKit().setUnlocalizedName("hazmat_red_kit").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":hazmat_red_kit"); hazmat_grey_kit = new ItemStarterKit().setUnlocalizedName("hazmat_grey_kit").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":hazmat_grey_kit"); + kit_custom = new ItemKitCustom().setUnlocalizedName("kit_custom").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":kit"); loot_10 = new ItemLootCrate().setUnlocalizedName("loot_10").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":loot_10"); loot_15 = new ItemLootCrate().setUnlocalizedName("loot_15").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":loot_15"); @@ -7875,6 +7877,7 @@ public class ModItems { GameRegistry.registerItem(hazmat_kit, hazmat_kit.getUnlocalizedName()); GameRegistry.registerItem(hazmat_red_kit, hazmat_red_kit.getUnlocalizedName()); GameRegistry.registerItem(hazmat_grey_kit, hazmat_grey_kit.getUnlocalizedName()); + GameRegistry.registerItem(kit_custom, kit_custom.getUnlocalizedName()); GameRegistry.registerItem(euphemium_kit, euphemium_kit.getUnlocalizedName()); GameRegistry.registerItem(letter, letter.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/special/ItemKitCustom.java b/src/main/java/com/hbm/items/special/ItemKitCustom.java new file mode 100644 index 000000000..2e921294a --- /dev/null +++ b/src/main/java/com/hbm/items/special/ItemKitCustom.java @@ -0,0 +1,110 @@ +package com.hbm.items.special; + +import com.hbm.items.ModItems; +import com.hbm.util.ItemStackUtil; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +public class ItemKitCustom extends Item { + + @SideOnly(Side.CLIENT) + IIcon overlay1; + @SideOnly(Side.CLIENT) + IIcon overlay2; + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + + ItemStack[] stacks = ItemStackUtil.readStacksFromNBT(stack); + + if(stacks != null) { + + for(ItemStack item : stacks) { + if(item != null) { + player.inventory.addItemStackToInventory(item.copy()); + } + } + } + + stack.stackSize--; + + return stack; + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderPasses(int metadata) { + return 3; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + super.registerIcons(reg); + + this.overlay1 = reg.registerIcon(this.getIconString() + "_1"); + this.overlay2 = reg.registerIcon(this.getIconString() + "_2"); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return true; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamageForRenderPass(int meta, int pass) { + return pass == 1 ? this.overlay1 : pass == 2 ? this.overlay2 : super.getIconFromDamageForRenderPass(meta, pass); + } + + @Override + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack stack, int pass) { + if(pass == 1) + return getColor(stack, 1); + if(pass == 2) + return getColor(stack, 2); + return 0xffffff; + } + + public static ItemStack create(String name, String lore, int color1, int color2, ItemStack... contents) { + ItemStack stack = new ItemStack(ModItems.kit_custom); + + stack.stackTagCompound = new NBTTagCompound(); + + setColor(stack, color1, 1); + setColor(stack, color2, 2); + + if(lore != null) ItemStackUtil.addTooltipToStack(stack, lore.split("\\$")); + stack.setStackDisplayName(EnumChatFormatting.RESET + name); + ItemStackUtil.addStacksToNBT(stack, contents); + + return stack; + } + + public static void setColor(ItemStack stack, int color, int index) { + + if(!stack.hasTagCompound()) + stack.stackTagCompound = new NBTTagCompound(); + + stack.stackTagCompound.setInteger("color" + index, color); + } + + public static int getColor(ItemStack stack, int index) { + + if(!stack.hasTagCompound()) + return 0; + + return stack.stackTagCompound.getInteger("color" + index); + } +} diff --git a/src/main/java/com/hbm/items/special/ItemStarterKit.java b/src/main/java/com/hbm/items/special/ItemStarterKit.java index 8e4b15238..5bda69b31 100644 --- a/src/main/java/com/hbm/items/special/ItemStarterKit.java +++ b/src/main/java/com/hbm/items/special/ItemStarterKit.java @@ -3,6 +3,7 @@ package com.hbm.items.special; import java.util.List; import com.hbm.blocks.ModBlocks; +import com.hbm.interfaces.Spaghetti; import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemBattery; @@ -22,12 +23,10 @@ import net.minecraft.potion.PotionEffect; import net.minecraft.util.ChatComponentText; import net.minecraft.world.World; +@Deprecated //not deprecated per se but please stop using it wherever possible +@Spaghetti("i do not care how much 'optimization' you want to throw at this dumpster fire but there's no saving grace here") public class ItemStarterKit extends Item { - public ItemStarterKit() { - this.maxStackSize = 1; - } - private void giveHaz(World world, EntityPlayer p, int tier) { for(int i = 0; i < 4; i++) { diff --git a/src/main/java/com/hbm/items/tool/ItemWandD.java b/src/main/java/com/hbm/items/tool/ItemWandD.java index 525735c84..3fa57e460 100644 --- a/src/main/java/com/hbm/items/tool/ItemWandD.java +++ b/src/main/java/com/hbm/items/tool/ItemWandD.java @@ -2,18 +2,15 @@ package com.hbm.items.tool; import java.util.List; -import com.hbm.blocks.BlockDummyable; +import com.hbm.items.ModItems; +import com.hbm.items.special.ItemKitCustom; import com.hbm.lib.Library; -import com.hbm.tileentity.conductor.TileEntityFluidDuct; -import com.hbm.tileentity.conductor.TileEntityFluidDuctSimple; -import api.hbm.energy.IEnergyConductor; -import net.minecraft.block.Block; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChatComponentText; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; @@ -25,33 +22,17 @@ public class ItemWandD extends Item { if(world.isRemote) return stack; - MovingObjectPosition pos = Library.rayTrace(player, 500, 1); + MovingObjectPosition pos = Library.rayTrace(player, 500, 1, false, true, false); if(pos != null) { - int x = pos.blockX; - int z = pos.blockZ; - //int y = world.getHeightValue(x, z); - int y = pos.blockY; + List list = world.getEntitiesWithinAABB(EntityLiving.class, player.boundingBox.expand(150, 150, 150)); - Block b = world.getBlock(x, y, z); - if(b instanceof BlockDummyable) { - int[] core = ((BlockDummyable)b).findCore(world, x, y, z); - x = core[0]; - y = core[1]; - z = core[2]; - } - - TileEntity te = world.getTileEntity(x, y, z); - /*if(te instanceof IEnergyConductor) { - IEnergyConductor con = (IEnergyConductor) te; - player.addChatComponentMessage(new ChatComponentText("" + con.getPowerNet())); - }*/ - - if(te instanceof TileEntityFluidDuctSimple) { - - player.addChatComponentMessage(new ChatComponentText("" + ((TileEntityFluidDuctSimple)te).getType().getUnlocalizedName())); - player.addChatComponentMessage(new ChatComponentText("" + ((TileEntityFluidDuctSimple)te).getType().getID())); + for(EntityLiving e : list) { + e.setRevengeTarget(player); + e.setAttackTarget(player); + e.setLastAttacker(player); + e.getNavigator().tryMoveToXYZ(player.posX, player.posY, player.posZ, 2); } //CellularDungeonFactory.meteor.generate(world, x, y, z, world.rand); diff --git a/src/main/java/com/hbm/util/ItemStackUtil.java b/src/main/java/com/hbm/util/ItemStackUtil.java index f694822d2..7e619836a 100644 --- a/src/main/java/com/hbm/util/ItemStackUtil.java +++ b/src/main/java/com/hbm/util/ItemStackUtil.java @@ -9,7 +9,7 @@ import net.minecraft.util.EnumChatFormatting; public class ItemStackUtil { /** - * UNSAFE! Will ignore all existing tags and override them! In its current state, only fit for items we know don't have any display tags! + * UNSAFE! Will ignore all existing display tags and override them! In its current state, only fit for items we know don't have any display tags! * Will, however, respect existing NBT tags * @param stack * @param lines @@ -29,4 +29,43 @@ public class ItemStackUtil { display.setTag("Lore", lore); stack.stackTagCompound.setTag("display", display); } + + public static void addStacksToNBT(ItemStack stack, ItemStack... stacks) { + + if(!stack.hasTagCompound()) + stack.stackTagCompound = new NBTTagCompound(); + + NBTTagList tags = new NBTTagList(); + + for(int i = 0; i < stacks.length; i++) { + if(stacks[i] != null) { + NBTTagCompound slotNBT = new NBTTagCompound(); + slotNBT.setByte("slot", (byte) i); + stacks[i].writeToNBT(slotNBT); + tags.appendTag(slotNBT); + } + } + stack.stackTagCompound.setTag("items", tags); + } + + public static ItemStack[] readStacksFromNBT(ItemStack stack) { + + if(!stack.hasTagCompound()) + return null; + + NBTTagList list = stack.stackTagCompound.getTagList("items", 10); + int count = list.tagCount(); + + ItemStack[] stacks = new ItemStack[count]; + + for(int i = 0; i < count; i++) { + NBTTagCompound slotNBT = list.getCompoundTagAt(i); + byte slot = slotNBT.getByte("slot"); + if(slot >= 0 && slot < stacks.length) { + stacks[slot] = ItemStack.loadItemStackFromNBT(slotNBT); + } + } + + return stacks; + } } diff --git a/src/main/resources/assets/hbm/textures/armor/rpa_arm.png b/src/main/resources/assets/hbm/textures/armor/rpa_arm.png index 191bdc0ab616ae4f7b18ac5d2b401d2da3d8d6d4..7372622f2d97e038bb5b0d680143932d17891648 100644 GIT binary patch literal 839 zcmeAS@N?(olHy`uVBq!ia0vp^9zYzanMprAyFYeY$Kep*R+Vo@qXL1JcJiC$i6iGqoq zp`K}qdj!xLrX8Lxjv*CsZ)X~=6E+laP3O#M5OQ?x|8kTmBeUUO`AueT4_D`dX%Wn# zvnBT}{;hO;-#qKGHHw?=Pwg`?-WXrgKk3nbo%i?lMNZdvxKCVSX6oy$?cPzx-c>hl zygp@~eabpi49?=+SG2k|$t8*0G00cy7$z-QH*O=7alzQ(qOPm@=wre%#6k(IB`lDXeP! zf&zXJx4&WPYe$W2Ca<7N5CitN|NqO$HFr&okB;h7r9~oTKa>-mRtZ=|e$>@86c=2& z;jlcT_I0MLJ4d>1Uss=Y@POI89~WMNJvr%zr1otlxAcvl)HGA4&zZ1R$o9aE>^GJ` z!DDHLjB1+u`VW38x+D~~fE^rC7Cs(a)6x=+BqHMcqE78R%F0<*+mn8bl{03-0V0V6 z%ej85gMnJ6eP18H*0?!-|EZt<{$$RT%+P3$oXZI%Z-}SOXngv)RWdE%r;X+O^V!@t z?8>6Nm;ZJH+8Hw;Vb-FxKjJ?#iK`SiVkQ3Hbbrvqa{A@#%T~re-uqhST=sEr#!UwE zN*L!wyp%FXyR+evX~LNuiA%E&%qTqUb-lsxaof~&jLFA%wPTr&^+<>9V(XDKUsFPw d29wjD_~V~Wi?~vjqYg~x44$rjF6*2UngFu{U3dTh literal 709 zcmeAS@N?(olHy`uVBq!ia0vp^9zYzP`c6K^zF=8zy3u0k7Um@v zc(1XlF}8fsxu*VR!uORX9=oG#t5nz4O$(TodMn55;5^OKMl+dxFGs{)e|TrlB8{Ny zd$u2&J9GY&;I2g(SF7J`-+m^=zHpX`KHue{m2;L#>c!98di#%Q>^9+jE$80yB`;l` zIqTj}`B%46ZPQt2KJ|VzF}ZBQ0^2Q#JAIa44t(YM>~zZK9kb)yBh22ptXq6@mzDOb zbDMLwduTgeSNauNTA~qJ_jT4xp%xDT1;+*!Mj@6xw?cDFu7!4dSDZQXXl?z9<{#DN zXS-!<6^vCmGF4w}VgD1f;<-%hwM)gT6L+^9DL;L#(o#k>qi1%g@#bCY4x7s7ACcI6 z-SzZ8&kHk(_?EB#w`1|^x;J+D#p-F-Cl>#R4is7W{=$vPpLZwT2&c2|pWOudn;IfBt1fHjp
Ln_+K%h~kG;RvE?{94-n{?h$-PQ%rvI0p zbmbMhu2}b)UOV0L)qfY9eDv^oH`lgP2iYgzw6VDQ_=?=z=7w+S2a4zOugYUp#o{^+ z@&CQf;wByT;_IuemVeWL1Zj&&iO;nIY!|3+T0z=y{I bI>X<4+a^I*hR!*_bjjf9>gTe~DWM4f=;SV0 diff --git a/src/main/resources/assets/hbm/textures/armor/rpa_chest.png b/src/main/resources/assets/hbm/textures/armor/rpa_chest.png index 3511c43a6b72571df083f17d79abee81b9c7617d..778f284b2c0b83917eade275cfb91c11bbf1681e 100644 GIT binary patch literal 2606 zcmeH|`9Is~7RQs4A<0Y0NbOt%jW&WHMyMtsi3sUeq_r=h_O)#)7}G@)Lb;v(6vsZ=8|1ra?sqXsv~(W*`!Enj zM!4In4x1NuY^Qq(9|o-CkF4f~Ea%7Y3*-1dpIIzEw^*9MeSU#kd3|v8{ekrv^R*8L zHs;JXKVr8&VYe5sU@w2KzbEiNP2g*V#Rvofh449S@16he1@Zn%$rKzOJlW0f6a=!j zYuBJ{g>mzssKuxG^1YKH`2ya_2uLz7CXtU%jNlvE;;r#^#~HrhivufRx>C5Q!SiKt z0h4q!`sB4+Lr-tOnK2`^79v1_DZUM}vaa3Pu^)c^5|bwQZQOlg#gsmya5L(awthg- z1DAidH7!QDh@&D`gwHBqDP}F{)chxa-mzMvKh!=J@xqPgsv~*Eks*Y2e0apS=>gw7 zOnCBC@k_bh;-TJ&$5$*I$k<`AsRLG6l;>M0;$XYPu(T_P)5I_*^~(SQlXZ%RJWU9* z)vdP}?Gkrov{4)LwFbreN1uu%Kdn+5^Ryng(_|u)LRuZdj%Zv_b`EgCbl--_TWSYS8Y)uza!+;zVg3P>o`txz%cdmfbr`Bxq6FpgYo3 ztEH1{fjFVbkhP-TlC8nWMd=kVzDjgOZLIMff2%K4>v2!nR>ILspWgYQ!(U7OB<#^1a!fOzW&hANpJNi1 z5`h|!^i~H_>)df({m5K98CRKwrRBh~GN?g6YT^6MM`<}-=GR@5%*^&x8DHZaP%bP= z7A<;=`}I$$V;ic0UN6sr37qvbYC0c`zDaL$M zs?0XAwejOWk}{5p>rCeC_XRD>t&d2w>j%t^1R7ihk~JHH-FjF`{(~q4PFm+)cI{orzI@tY+j#SD%8d?%;7Z3Zv% z?%PX0UL1L2y~p{Yx=zIzz5Jy80zvWQlKkzg8nm(xel;-9*>hoAeZj1fuDM@%6~~r; zN{`Pd8D3rgG>kz9f|Z=x`xtqNj2V_@`<=2Xj7K8A6wkNAA2wVQ-}8wxa-~-dp)5+? zl%R%zxhxI$4jB{D$Bve~o2($i-{Yf=b}lY?!IiAI!fW?h4bP`!P?2jLq-K!+^;dCE_0Qo_LA<_d9pC z-;O0sTHZW!rhV;DUt+XTMfPDY|85V-eS;FmLKnF_xw+$a%uM`-rbE=f4#zu5hDFDy z*&9g@`>OZiW+LBCHg%+LZf`lFCcLTb+fwBpq=SsEO~<<8sWZ1%JUXDQAKdg!m~tk| z$gv4e3Oa(C{{au+33scEWHYD#4}EQHRf!{c>PwNrqtn=k{W}4Ro5FC3fB|y7C-tZ#hAKAEF?Rf&+I8RMXJXR z5QJZ}`Bf6RND+sN#-NWMWE5XzC*w$!eP?fTn0wKFu(!4LU|OI!Zn?86$(s4!xkNPus0lL zrh&KBrI#ZMRmt6%bjTj4azkmstWcPGBbiQBb3;{+6gDPRF(q25?{S}!sw(Bp{(9Hh;sz(Ds literal 2180 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 delta 1729 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 O2L?}9KbLh*2~7a##e*jR literal 706 zcmeAS@N?(olHy`uVBq!ia0vp^9zYz=!3HF~?HW^n6icy_X9x!n)NrJ9FfcGxdb&7< zRLprh=c4an0}3~{()zDK&y5`| znb&E!A4zU9i=EOdS9ec4V|DwMx1lNf*D9S#Z<29zWZ+^75NK#(5Mf!M(6HYsV?XaN zkwqOHd|xl{{Mv0>vp$5m)4);SdQ)4=6S>VtmMVn$&NH&iJ%8}Nlu7Elzc+$s=PFO< zl)CW#XKeq{AyA0dXtX%ESrjgSnf`m(ZTc$d4T(3111vKQ7Lx-K4Pzem6R%TZ0X z1qwjbF}4;#PVb_2{q>Z#7G~KolcjUXat%{kB_Dw&uY^r}c~^BWD;4(&zVWt9ZEDH= z?_$d*eyz$anpap~lz%z+YQ1{mA8*c!tG1Y1osR%YpPUq8+82M?l%v4BDJbpKO0#n1 z7cqbCv*jGvux!p}_D)Vj;DTM65XQdpV&yFxwds7qzyJq|t=c1g`PAF!Lo9Hw1!P-I zlrY|JrMcUErP?x1Ey)$(o@q@wY%cM-*QG diff --git a/src/main/resources/assets/hbm/textures/items/kit.png b/src/main/resources/assets/hbm/textures/items/kit.png new file mode 100644 index 0000000000000000000000000000000000000000..72ee86a5892657ff805bb98e3d57875278936d56 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfIOIL3_WV!u`wA;mDHcRU>P%VR}tDnm{r-UW|s&yN- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/kit_toolbox.png b/src/main/resources/assets/hbm/textures/items/kit_toolbox.png new file mode 100644 index 0000000000000000000000000000000000000000..086515e2a2d5bc2f5648975194e454b5fa1df34a GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfaewkR!&=x7Lyba`(c0VH~Yii-}C6N+v6zs{~NE9_Irn` z&4(PX=_G1!3fBCa(+C6)Pm8m)t&dlfxGA8v<5}I+|2+C}3MTgT=RQ3BR@~;ck&W$m zHeZ4Fj-8Sc@2U*`95-lqcvait^Xa$GdE)mu++gRENhm0AkZ9nGFtF)lGdnGtkg%h? p;o<9WCbmC6{z%VGc4J~-*wNztoB7R>jX-xZc)I$ztaD0e0sz{iUf%!! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/kit_toolbox_empty.png b/src/main/resources/assets/hbm/textures/items/kit_toolbox_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..2dca2f301ad6c639085535ce0eb8b8c5dd98841b GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vfn-|23hZx}7uc z(CYArToo1pwgWbvN(qgIbv6HZ#rM2!^!{nAAs5ELpnb>Ux6o?+BA}ZXJYD@<);T3K F0RSXoPm%xt literal 0 HcmV?d00001