From 417574fb3c279498bba799c30971ce72e06be6da Mon Sep 17 00:00:00 2001 From: asdflj <854865755@qq.com> Date: Wed, 8 Feb 2023 15:02:52 +0800 Subject: [PATCH] wireless interface terminal add edit button --- .../github/client/gui/GuiFCImgButton.java | 1 + .../gui/GuiInterfaceTerminalWireless.java | 73 ++++++++++++------ .../container/ContainerInterfaceWireless.java | 12 ++- .../github/coremod/FCClassTransformer.java | 3 + .../github/coremod/hooker/CoreModHooks.java | 14 ++++ .../transform/GuiRenamerTransformer.java | 59 ++++++++++++++ .../github/loader/ChannelLoader.java | 2 + .../github/network/CPacketRenamer.java | 63 +++++++++++++++ .../resources/assets/ae2fc/lang/en_US.lang | 1 + .../resources/assets/ae2fc/lang/zh_CN.lang | 1 + .../assets/ae2fc/textures/gui/renamer.png | Bin 0 -> 634 bytes .../assets/ae2fc/textures/gui/states0.png | Bin 1688 -> 1721 bytes 12 files changed, 203 insertions(+), 26 deletions(-) create mode 100644 src/main/java/com/glodblock/github/coremod/transform/GuiRenamerTransformer.java create mode 100644 src/main/java/com/glodblock/github/network/CPacketRenamer.java create mode 100644 src/main/resources/assets/ae2fc/textures/gui/renamer.png diff --git a/src/main/java/com/glodblock/github/client/gui/GuiFCImgButton.java b/src/main/java/com/glodblock/github/client/gui/GuiFCImgButton.java index c1a64de3..9d16d45b 100644 --- a/src/main/java/com/glodblock/github/client/gui/GuiFCImgButton.java +++ b/src/main/java/com/glodblock/github/client/gui/GuiFCImgButton.java @@ -48,6 +48,7 @@ public class GuiFCImgButton extends GuiButton implements ITooltip { this.registerApp(2, "FORCE_PRIO", "DO_PRIO", "prio"); this.registerApp(3, "NOT_PRIO", "DONT_PRIO", "not_prio"); this.registerApp(4, "SUBMIT", "SUBMIT", "submit"); + this.registerApp(5, "EDIT", "YES", "edit"); this.registerApp(6, "DISABLE", "DISABLE", "disable"); this.registerApp(7, "ENABLE", "ENABLE", "enable"); this.registerApp(10, "FLUID_TEM", "YES", "fluid_terminal_w"); diff --git a/src/main/java/com/glodblock/github/client/gui/GuiInterfaceTerminalWireless.java b/src/main/java/com/glodblock/github/client/gui/GuiInterfaceTerminalWireless.java index 910fbb28..247331c8 100644 --- a/src/main/java/com/glodblock/github/client/gui/GuiInterfaceTerminalWireless.java +++ b/src/main/java/com/glodblock/github/client/gui/GuiInterfaceTerminalWireless.java @@ -9,6 +9,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.ChatComponentTranslation; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; @@ -39,9 +40,11 @@ import appeng.integration.IntegrationRegistry; import appeng.integration.IntegrationType; import appeng.util.Platform; +import com.glodblock.github.FluidCraft; import com.glodblock.github.client.gui.base.FCBaseMEGui; import com.glodblock.github.client.gui.container.ContainerInterfaceWireless; import com.glodblock.github.inventory.item.IWirelessTerminal; +import com.glodblock.github.network.CPacketRenamer; import com.glodblock.github.util.ModAndClassUtil; import com.google.common.collect.HashMultimap; @@ -53,7 +56,7 @@ public class GuiInterfaceTerminalWireless extends FCBaseMEGui implements IDropTo private final HashMap byId = new HashMap<>(); private final HashMultimap byName = HashMultimap.create(); - private final HashMap blockPosHashMap = new HashMap<>(); + private final HashMap blockPosHashMap = new HashMap<>(); private final HashMap guiButtonHashMap = new HashMap<>(); private final ArrayList names = new ArrayList<>(); private final ArrayList lines = new ArrayList<>(); @@ -310,8 +313,14 @@ public class GuiInterfaceTerminalWireless extends FCBaseMEGui implements IDropTo guiTop + offset + 1, Settings.ACTIONS, ActionItems.HIGHLIGHT_INTERFACE); + GuiFCImgButton editButton = new GuiFCImgButton(guiLeft + 4, guiTop + offset + 1, "EDIT", "YES"); guiButtonHashMap.put(guiButton, inv); - buttonList.add(guiButton); + guiButtonHashMap.put(editButton, inv); + if (isShiftKeyDown()) { + buttonList.add(editButton); + } else { + buttonList.add(guiButton); + } } offset += 18; @@ -336,28 +345,34 @@ public class GuiInterfaceTerminalWireless extends FCBaseMEGui implements IDropTo @Override protected void actionPerformed(final GuiButton btn) { if (guiButtonHashMap.containsKey(btn)) { - DimensionalCoord blockPos = blockPosHashMap.get(guiButtonHashMap.get(btn)); - WorldCoord blockPos2 = new WorldCoord( - (int) mc.thePlayer.posX, - (int) mc.thePlayer.posY, - (int) mc.thePlayer.posZ); - if (mc.theWorld.provider.dimensionId != blockPos.getDimension()) { - mc.thePlayer.addChatMessage( - new ChatComponentTranslation( - PlayerMessages.InterfaceInOtherDim.getName(), - blockPos.getDimension())); + DimensionalCoordSide blockPos = blockPosHashMap.get(guiButtonHashMap.get(btn)); + if (btn instanceof GuiFCImgButton) { + FluidCraft.proxy.netHandler.sendToServer( + new CPacketRenamer(blockPos.x, blockPos.y, blockPos.z, blockPos.getDimension(), blockPos.side)); } else { - BlockPosHighlighter.highlightBlock( - blockPos, - System.currentTimeMillis() + 500 * WorldCoord.getTaxicabDistance(blockPos, blockPos2)); - mc.thePlayer.addChatMessage( - new ChatComponentTranslation( - PlayerMessages.InterfaceHighlighted.getName(), - blockPos.x, - blockPos.y, - blockPos.z)); + + WorldCoord blockPos2 = new WorldCoord( + (int) mc.thePlayer.posX, + (int) mc.thePlayer.posY, + (int) mc.thePlayer.posZ); + if (mc.theWorld.provider.dimensionId != blockPos.getDimension()) { + mc.thePlayer.addChatMessage( + new ChatComponentTranslation( + PlayerMessages.InterfaceInOtherDim.getName(), + blockPos.getDimension())); + } else { + BlockPosHighlighter.highlightBlock( + blockPos, + System.currentTimeMillis() + 500 * WorldCoord.getTaxicabDistance(blockPos, blockPos2)); + mc.thePlayer.addChatMessage( + new ChatComponentTranslation( + PlayerMessages.InterfaceHighlighted.getName(), + blockPos.x, + blockPos.y, + blockPos.z)); + } + mc.thePlayer.closeScreen(); } - mc.thePlayer.closeScreen(); } else if (btn == guiButtonHideFull) { AEConfig.instance.showOnlyInterfacesWithFreeSlotsInInterfaceTerminal = !AEConfig.instance.showOnlyInterfacesWithFreeSlotsInInterfaceTerminal; this.refreshList(); @@ -473,6 +488,17 @@ public class GuiInterfaceTerminalWireless extends FCBaseMEGui implements IDropTo return false; } + private static class DimensionalCoordSide extends DimensionalCoord { + + private ForgeDirection side = ForgeDirection.UNKNOWN; + + public DimensionalCoordSide(final int _x, final int _y, final int _z, final int _dim, ForgeDirection side) { + super(_x, _y, _z, _dim); + this.side = side; + } + + } + public void postUpdate(final NBTTagCompound in) { if (in.getBoolean("clear")) { this.byId.clear(); @@ -491,7 +517,8 @@ public class GuiInterfaceTerminalWireless extends FCBaseMEGui implements IDropTo int Y = invData.getInteger("y"); int Z = invData.getInteger("z"); int dim = invData.getInteger("dim"); - blockPosHashMap.put(current, new DimensionalCoord(X, Y, Z, dim)); + ForgeDirection side = ForgeDirection.getOrientation(invData.getInteger("side")); + blockPosHashMap.put(current, new DimensionalCoordSide(X, Y, Z, dim, side)); for (int x = 0; x < current.getInventory().getSizeInventory(); x++) { final String which = Integer.toString(x); diff --git a/src/main/java/com/glodblock/github/client/gui/container/ContainerInterfaceWireless.java b/src/main/java/com/glodblock/github/client/gui/container/ContainerInterfaceWireless.java index a3e08eba..1d40292a 100644 --- a/src/main/java/com/glodblock/github/client/gui/container/ContainerInterfaceWireless.java +++ b/src/main/java/com/glodblock/github/client/gui/container/ContainerInterfaceWireless.java @@ -10,9 +10,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; -import appeng.api.config.Settings; -import appeng.api.config.Upgrades; -import appeng.api.config.YesNo; +import appeng.api.config.*; import appeng.api.networking.IGrid; import appeng.api.networking.IGridNode; import appeng.api.networking.security.IActionHost; @@ -23,6 +21,7 @@ import appeng.helpers.DualityInterface; import appeng.helpers.IInterfaceHost; import appeng.helpers.InventoryAction; import appeng.items.misc.ItemEncodedPattern; +import appeng.parts.AEBasePart; import appeng.parts.misc.PartInterface; import appeng.parts.p2p.PartP2PInterface; import appeng.tile.inventory.AppEngInternalInventory; @@ -311,6 +310,7 @@ public class ContainerInterfaceWireless extends AEBaseContainer { tag.setInteger("y", inv.Y); tag.setInteger("z", inv.Z); tag.setInteger("dim", inv.dim); + tag.setInteger("side", inv.side.ordinal()); } for (int x = 0; x < length; x++) { @@ -343,6 +343,7 @@ public class ContainerInterfaceWireless extends AEBaseContainer { private final int Y; private final int Z; private final int dim; + private final ForgeDirection side; public InvTracker(final DualityInterface dual, final IInventory patterns, final String unlocalizedName, int offset, int size) { @@ -355,6 +356,11 @@ public class ContainerInterfaceWireless extends AEBaseContainer { Y = dual.getLocation().y; Z = dual.getLocation().z; dim = dual.getLocation().getDimension(); + if (dual.getHost() instanceof AEBasePart) { + side = ((AEBasePart) dual.getHost()).getSide(); + } else { + side = ForgeDirection.UNKNOWN; + } } } diff --git a/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java b/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java index 745f9853..82cfc2e3 100644 --- a/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java +++ b/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java @@ -40,6 +40,9 @@ public class FCClassTransformer implements IClassTransformer { case "appeng.core.sync.packets.PacketCompressedNBT": tform = PacketCompressedNBTTransformer.INSTANCE; break; + case "appeng.client.gui.implementations.GuiRenamer": + tform = GuiRenamerTransformer.INSTANCE; + break; default: return code; } diff --git a/src/main/java/com/glodblock/github/coremod/hooker/CoreModHooks.java b/src/main/java/com/glodblock/github/coremod/hooker/CoreModHooks.java index e1baa4b2..9a308533 100644 --- a/src/main/java/com/glodblock/github/coremod/hooker/CoreModHooks.java +++ b/src/main/java/com/glodblock/github/coremod/hooker/CoreModHooks.java @@ -8,6 +8,7 @@ import javax.annotation.Nullable; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -31,15 +32,20 @@ import appeng.parts.misc.PartInterface; import appeng.tile.misc.TileInterface; import appeng.util.InventoryAdaptor; +import com.glodblock.github.FluidCraft; import com.glodblock.github.client.gui.GuiFluidCraftConfirm; import com.glodblock.github.client.gui.GuiInterfaceTerminalWireless; import com.glodblock.github.common.item.ItemFluidDrop; import com.glodblock.github.common.item.ItemFluidPacket; +import com.glodblock.github.common.item.ItemWirelessInterfaceTerminal; +import com.glodblock.github.common.item.ItemWirelessUltraTerminal; import com.glodblock.github.common.parts.PartFluidInterface; import com.glodblock.github.common.tile.TileFluidInterface; import com.glodblock.github.inventory.FluidConvertingInventoryAdaptor; import com.glodblock.github.inventory.FluidConvertingInventoryCrafting; +import com.glodblock.github.inventory.gui.GuiType; import com.glodblock.github.loader.ItemAndBlockHolder; +import com.glodblock.github.network.CPacketSwitchGuis; import com.glodblock.github.util.Ae2Reflect; import com.glodblock.github.util.SetBackedMachineSet; import com.google.common.collect.Sets; @@ -199,4 +205,12 @@ public class CoreModHooks { ((GuiInterfaceTerminalWireless) gs).postUpdate(data); } } + + public static void reopenInterfaceTerminal() { + EntityPlayer p = Minecraft.getMinecraft().thePlayer; + ItemStack c = p.getCurrentEquippedItem(); + if (c.getItem() instanceof ItemWirelessInterfaceTerminal || c.getItem() instanceof ItemWirelessUltraTerminal) { + FluidCraft.proxy.netHandler.sendToServer(new CPacketSwitchGuis(GuiType.WIRELESS_INTERFACE_TERMINAL, true)); + } + } } diff --git a/src/main/java/com/glodblock/github/coremod/transform/GuiRenamerTransformer.java b/src/main/java/com/glodblock/github/coremod/transform/GuiRenamerTransformer.java new file mode 100644 index 00000000..3173b768 --- /dev/null +++ b/src/main/java/com/glodblock/github/coremod/transform/GuiRenamerTransformer.java @@ -0,0 +1,59 @@ +package com.glodblock.github.coremod.transform; + +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; + +import com.glodblock.github.coremod.FCClassTransformer; + +public class GuiRenamerTransformer extends FCClassTransformer.ClassMapper { + + public static final GuiRenamerTransformer INSTANCE = new GuiRenamerTransformer(); + + private GuiRenamerTransformer() { + // NO-OP + } + + @Override + protected ClassVisitor getClassMapper(ClassVisitor downstream) { + return new GuiRenamerTransformer.TransformGuiRenamer(Opcodes.ASM5, downstream); + } + + private static class TransformGuiRenamer extends ClassVisitor { + + TransformGuiRenamer(int api, ClassVisitor cv) { + super(api, cv); + } + + @Override + public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { + if (name.equals("keyTyped")) { + return new GuiRenamerTransformer.TransformKeyTyped( + api, + super.visitMethod(access, name, desc, signature, exceptions)); + } + return super.visitMethod(access, name, desc, signature, exceptions); + } + } + + private static class TransformKeyTyped extends MethodVisitor { + + TransformKeyTyped(int api, MethodVisitor mv) { + super(api, mv); + } + + @Override + public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { + super.visitMethodInsn(opcode, owner, name, desc, itf); + if (owner.equals("net/minecraft/client/entity/EntityClientPlayerMP") && name.equals("closeScreen")) { + super.visitMethodInsn( + Opcodes.INVOKESTATIC, + "com/glodblock/github/coremod/hooker/CoreModHooks", + "reopenInterfaceTerminal", + "()V", + false); + } + } + + } +} diff --git a/src/main/java/com/glodblock/github/loader/ChannelLoader.java b/src/main/java/com/glodblock/github/loader/ChannelLoader.java index bdd47117..29feaa20 100644 --- a/src/main/java/com/glodblock/github/loader/ChannelLoader.java +++ b/src/main/java/com/glodblock/github/loader/ChannelLoader.java @@ -52,6 +52,8 @@ public class ChannelLoader implements Runnable { .registerMessage(new CPacketLevelMaintainer.Handler(), CPacketLevelMaintainer.class, id++, Side.SERVER); FluidCraft.proxy.netHandler .registerMessage(new SPacketSetItemAmount.Handler(), SPacketSetItemAmount.class, id++, Side.CLIENT); + FluidCraft.proxy.netHandler + .registerMessage(new CPacketRenamer.Handler(), CPacketRenamer.class, id++, Side.SERVER); } public static void sendPacketToAllPlayers(Packet packet, World world) { diff --git a/src/main/java/com/glodblock/github/network/CPacketRenamer.java b/src/main/java/com/glodblock/github/network/CPacketRenamer.java new file mode 100644 index 00000000..d9103b0f --- /dev/null +++ b/src/main/java/com/glodblock/github/network/CPacketRenamer.java @@ -0,0 +1,63 @@ +package com.glodblock.github.network; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.util.ForgeDirection; + +import appeng.core.sync.GuiBridge; +import appeng.util.Platform; +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import io.netty.buffer.ByteBuf; + +public class CPacketRenamer implements IMessage { + + private int x; + private int y; + private int z; + private int dim; + private ForgeDirection side; + + public CPacketRenamer() {} + + public CPacketRenamer(int x, int y, int z, int dim, ForgeDirection side) { + this.x = x; + this.y = y; + this.z = z; + this.dim = dim; + this.side = side; + } + + @Override + public void fromBytes(ByteBuf buf) { + this.x = buf.readInt(); + this.y = buf.readInt(); + this.z = buf.readInt(); + this.dim = buf.readInt(); + this.side = ForgeDirection.getOrientation(buf.readInt()); + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeInt(this.x); + buf.writeInt(this.y); + buf.writeInt(this.z); + buf.writeInt(this.dim); + buf.writeInt(side.ordinal()); + } + + public static class Handler implements IMessageHandler { + + @Override + public IMessage onMessage(CPacketRenamer message, MessageContext ctx) { + EntityPlayerMP player = ctx.getServerHandler().playerEntity; + TileEntity tile = DimensionManager.getWorld(message.dim).getTileEntity(message.x, message.y, message.z); + if (tile != null) { + Platform.openGUI(player, tile, message.side, GuiBridge.GUI_RENAMER); + } + return null; + } + } +} diff --git a/src/main/resources/assets/ae2fc/lang/en_US.lang b/src/main/resources/assets/ae2fc/lang/en_US.lang index 71a20b2b..9ed01f5b 100644 --- a/src/main/resources/assets/ae2fc/lang/en_US.lang +++ b/src/main/resources/assets/ae2fc/lang/en_US.lang @@ -110,6 +110,7 @@ ae2fc.tooltip.prio.hint=Disabled ae2fc.tooltip.submit=Submit ae2fc.tooltip.enable=Enabled ae2fc.tooltip.disable=Disabled +ae2fc.tooltip.edit=Edit ae2fc.gui.part_fluid_pattern_terminal=Fluid Pattern Terminal ae2fc.gui.part_fluid_pattern_terminal_ex=Fluid Processing Pattern Terminal diff --git a/src/main/resources/assets/ae2fc/lang/zh_CN.lang b/src/main/resources/assets/ae2fc/lang/zh_CN.lang index 3efa7fbc..13a70195 100644 --- a/src/main/resources/assets/ae2fc/lang/zh_CN.lang +++ b/src/main/resources/assets/ae2fc/lang/zh_CN.lang @@ -110,6 +110,7 @@ ae2fc.tooltip.prio.hint=禁用 ae2fc.tooltip.submit=提交 ae2fc.tooltip.enable=启用 ae2fc.tooltip.disable=禁用 +ae2fc.tooltip.edit=编辑 ae2fc.gui.part_fluid_pattern_terminal=ME流体样板终端 ae2fc.gui.part_fluid_pattern_terminal_ex=ME增广流体样板终端 diff --git a/src/main/resources/assets/ae2fc/textures/gui/renamer.png b/src/main/resources/assets/ae2fc/textures/gui/renamer.png new file mode 100644 index 0000000000000000000000000000000000000000..a915b3afe0677c7ec1e40b3d7d84f6aa41a952e6 GIT binary patch literal 634 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5D>38$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBzEFTqh%1o(|NsB7W5+^6L%X}Xf!u{>r7i<0wvr&fV4&3h{|uY=FWCEakt5%>1Cq0}J-hNB5nivDYJ&ssSD-T{@U^5Vny;Js` zxj=GP?PHiO20uoYg4%zMzuy<$zH8pF4q_4$N5kX|3{Mz7Gps2LyIomb^5N!`in^?)X;TBWER@MVq+znU77*^{tghex~*~So&J1T)CNG@HgVw61;)?9S?lr%8@ O89ZJ6T-G@yGywp3I^(?n literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/ae2fc/textures/gui/states0.png b/src/main/resources/assets/ae2fc/textures/gui/states0.png index 5f49e0546d78f0a1ddaa3c23bd3dd26c155c2d44..39e33fadf09f2c44c8c5cef1f2637cb573448e5e 100644 GIT binary patch delta 1705 zcmV;a23Gl)4Y>`FB!7TOL_t(&fz4T6XcSiz{$@9uRnew|R{PjUwOSz*iVuAeE3pvt zB|<9oO|WQ0ANyVk3Q{YAf=UJZq+%Yb_!F(7VElPVB2rqdHlhTHF=E@)B+dR#`R>jc z@6O!0JDXXk9}GM9&OLL!bMCq4o;!=U=;-KhdBqk8AgO#5nty63mHRDQw#cn}<;oQ& zF6kulvoav4bmPX2c<|r>^gbJjr1JH`iBd}Fignz*dlyHK9)*xdDxb&zD&MeS1A2OT z{LU!F`}gm!Y7Y$!p{1n-N#q9x1}sK&xxf^FpCiYp5Tf!!hYn%Qnl)CX?d|O$0*#Q5 zBHw-OTl5Z(0e@e?jWWVt15|$X>Q(h?Q%VdE4~P1a%A3&r{zBE;YZ;>qkST9%ZN-Tb zC+b$3R6dM~_u(1Q`@`3fv!Dz(b?TIAEM2lbFpFN%9Yr>d9&)?b@}9 zgh?sM|2}^{mJJLj0wgc(j*gC+@;YfTaNoXtz5~Me$?5%U%KhTn_ueA@E;19TG*JJDy>8#_;|7 z_pxZvqJK!mI(g>sxbl?Uwrv{@A3hwDd_4F&sgNj@N_h3^Rh6);f#3|pmDfGqNb-<1 z;BDz{%{AbWUN$-DdTmazQ%jy>?yVSe8%;j+B6?C{*s#UBf$_n1EqSAi>n5wP8|I1G zBB=q^^FTeA4H3sl?!Sf^;5bfQ7Pzk4xJ4}Zcz?xWpF}#HrWTaS<;uN=p9_kI<$yHsY1=%%@8n>?`a%+HYI^-zrqxU)gL1iy zGiT1Ax7Su%DkEP4Xa-OOK*c!#WdL(s*UefDa8fCZOr_NQ+jHmQ%bssAGBSdvLqFoJ zw0{FPm4V}wY|0gRlIFd%N&eiqa~K~Vj}!Ndf(70^i3{l$romMPQ1QSc370$;ub#p4 z=gTxqP%{Zz0p;`FviHPo+|5Yim=LD0gBSQv>frJbt&P0ci(V{lV)tJvKEp zrS&=J`?dDECrOg0LA+;O)ZE;RnVA`7P=6y)%_fz`!q$wsEzL|L{p2J*Oab`?m1%Fz zG@*buZ-Wib*t)IzI-`u+_<4;rcOl1t7!&^e4(g_rsvGVi%RK$mh2q= zSuN1R>({Tx>C>lieTn<><==2aHCtt9*#!!P0>)naWh~Uzty_oD z(b3QYh7i2);dSTE9kmnFs5hyYtAD$cc+(7+6_Ogz*p%=;z)9+Xq!=9?oi%~u$B$R` zfqF|}4UU(2W+g8rHHp~3%%vBIf=ib!z23-n@7}HAQBt8^bjd8qqGQELVI3@``J8z^ zxLL)K*P#=xm3FJlx^?STNU@NDcSc}JWSL;X&6_u)Jgwf**Vl*6&dx}AM1Oc&HzxSZ zca?ZQXt5M#^eUh8H>xD&*q}TOrr{+2`0-V;Eh@Crk`eaNn5j2h0+o3e7A4;GdyxHb1Ts9mrb8G4^*1U@$r)%#>N zOwWV;RR)NsBy6B9Kv8U~CVwd>Yeq_Ek>|fSamr~SXbPR+vycGzlpb)ez=&C-wp?h3rK+oau!X#?<=6F`5JdyD$G>xJ6^?!Go&I6{VR<)%%WRGC21Hu*T-HqBC%0o;Y3J$n}ET|Kv(G7;r@m=Spr<~dkT!#4RKaU)sV z8erTeK~nh;u^8li10s@sXiXx|5VI9_Rsi@9E-*_6xc_V500000NkvXXu0mjflI&+z delta 1672 zcmV;326y?n4VVp(B!6E?L_t(&fz4T6NE}xbJ~QiT64F|Hh<&V~O=APnmpt@EQZWV5 z7XvmlZ-JDkB#@WBmx4lQDuRMa1xp`d(1$AdF=>JUP0WJ|p|r7DLxPkTEfj2A>#puj z`L27$yEFIRopna&2gA<2Gv}V~oO|xM=gv}4)YjHIxB?4!5Pw!)hoXE+`ToL%3w-N5 zc<{gqN;-`Eo(%9RJ$v>n&Ck!1+-D*YR=!YJI;DWDSjN+*PpQAZpO{2g`A`Nx`I$3k zsHLUF?bIpm?Ci{G&(6+LX=y2ik)NKPHW<<95G9D{XYD&8grK~qr-y24YK%&&s;Ybh zqL9~-Z+iF*4Sz4bCi;>boe}ODfb#M2aq(+X3M?)z`uf7ktI+h`5z#wrct;q(Q(jh9 zMuUTc1uG3J@5he!DQm>=_g`seK^QPJG$b0wjvX^9-q_esPJ38+6+m2&f4ORWPZ%&U zF+tVU)wHm%;8O}rPEKO6(aDo1>HPWgqOY~JRkVZ3Gk;hf7#JAP5(DwT2Hd}YpH81X zEl8-8g8c7?57Y7KX+Z$wxm{aZn^#^Y%?5UKbhr-i<0otQ(}eT+!|$?-_*-oz5^1!% zyIV9aUAjbTYimlSF6s4k_ZKsOG#W%+o)wV)=(l(2*@@T0dyyKSW%n0-8Wjex=Mckl zb8}Q)UVpAtER#nL4=NAY=H_PV?d=UnJ{a7clu4x1X?pYKO^z_H0q+b1m6tspC3)gC zkloUqylWs!`uO^~lWk*)t$gx$=h=zZPSoUm1HqFV!-_55@x1SC=aW~;ghix-?F9}E zg*qb`&jW?PaSG>QSy}&$?@?(@ga%laRgeXa<9|fAh#4QBIO>v!#bVGx=}czlUc&4z ze<+o=wY3?Q!Q2kUNo@_CXdM)XO=A-C_w%$9LL5G*R%9TsUd z9*_xoW06i+|ra7oe8Q=7E1vf}oooo)IznbHo%3mG0yrBZ^t zZQE2)Q6VZ(?8Go;-wcRZM5o^0ZNp=UL_+GbXzbVg>mDRQ9tPnaby0C~F>P*c3WN5| z0J39rq%1CO)0-Ol36An%Ayf+woDvGmtx4 zCQY$)ijo^iag`O>;zA!TXDdy%VGUw|f*`KO#zt|(#5FTBSiB=Sd{RE(2o=AQGoGn1wXxRm`L)dqzM?M46z%OhGh8~eJpRQAQcg2L zRp@x1`3wNK*5S&MX8=M>Kz|hic<;`gJJi+H<+d?XH*ek)-iJIc^y@;9VTyaSwIKv= zai+m^<3&0C(bg4YkVS^U@exL_JY~OH%kriWWP+vzozo{bWRLR<$T^&{VWQi;@qT@M zy*QEKD>RIO_vJBF=K)n{m=?4)ggEmcRNy5LLTxXDzc}as8T{=E@_)dSCr{k5$&kT< zlK08U4c;l`njfLSUgzo8r9t*^GMN;|%5&$=i82ACP4Yp!t(v7A1F#D(FE4AoE9Z7q zCgQ^k%Y!h^!Ezcl$$N<_$(q&x;x-Jz%KL}~AnzIw_CsqJd4!m$urq>){sWl;E?BX@ S!5#nr002ovPDHLkU;%=EOg%3E