From 048eb5713f339b8a76b737c5a477cdfab7a58769 Mon Sep 17 00:00:00 2001 From: Regalis Date: Tue, 4 Aug 2015 20:11:59 +0300 Subject: [PATCH] waypoint selection bug, unequipped captain uniform sprites, repairtool sounds & particle tweaking, wire overlap bug, connectionpanel loading bug, looting dead crew members --- Subsurface/Content/Items/Clothes/clothes.xml | 14 +-- .../Content/Items/Diving/divinggear.xml | 4 +- Subsurface/Content/Items/Tools/tools.xml | 2 +- .../Content/Items/Weapons/explosives.xml | 4 +- Subsurface/Content/Items/Weapons/railgun.xml | 9 +- Subsurface/Content/Items/idcard.xml | 2 +- .../Content/Particles/ParticlePrefabs.xml | 12 +-- Subsurface/Source/Characters/Character.cs | 88 ++++++++++++++---- Subsurface/Source/Items/CharacterInventory.cs | 13 +-- .../Source/Items/Components/Container.cs | 4 +- .../Items/Components/Holdable/Holdable.cs | 11 +++ .../Items/Components/Holdable/RepairTool.cs | 2 +- .../Source/Items/Components/ItemComponent.cs | 4 +- .../Source/Items/Components/Projectile.cs | 4 + .../Items/Components/Signal/Connection.cs | 4 +- .../Components/Signal/ConnectionPanel.cs | 13 ++- .../Source/Items/Components/Signal/Wire.cs | 8 +- Subsurface/Source/Items/Item.cs | 12 ++- Subsurface/Source/Map/Submarine.cs | 2 +- Subsurface/Source/Map/WayPoint.cs | 2 +- Subsurface/Source/Networking/GameClient.cs | 1 - Subsurface/Source/Particles/Particle.cs | 5 +- Subsurface/Source/Sprite.cs | 5 + Subsurface_Solution.v12.suo | Bin 585216 -> 585216 bytes 24 files changed, 154 insertions(+), 71 deletions(-) diff --git a/Subsurface/Content/Items/Clothes/clothes.xml b/Subsurface/Content/Items/Clothes/clothes.xml index edeadde3a..e5cc154a9 100644 --- a/Subsurface/Content/Items/Clothes/clothes.xml +++ b/Subsurface/Content/Items/Clothes/clothes.xml @@ -18,12 +18,12 @@ pickdistance="150" tags="smallitem"> - + - + - - + + @@ -38,11 +38,11 @@ pickdistance="150" tags="smallitem"> - + - + - + diff --git a/Subsurface/Content/Items/Diving/divinggear.xml b/Subsurface/Content/Items/Diving/divinggear.xml index 61308838c..de9b788c9 100644 --- a/Subsurface/Content/Items/Diving/divinggear.xml +++ b/Subsurface/Content/Items/Diving/divinggear.xml @@ -20,7 +20,7 @@ pickdistance="200" price="50"> - + @@ -42,7 +42,7 @@ pickdistance="200" price="200"> - + diff --git a/Subsurface/Content/Items/Tools/tools.xml b/Subsurface/Content/Items/Tools/tools.xml index b3dc02f3c..1e6441e34 100644 --- a/Subsurface/Content/Items/Tools/tools.xml +++ b/Subsurface/Content/Items/Tools/tools.xml @@ -77,7 +77,7 @@ - + diff --git a/Subsurface/Content/Items/Weapons/explosives.xml b/Subsurface/Content/Items/Weapons/explosives.xml index 498457a59..bcf007454 100644 --- a/Subsurface/Content/Items/Weapons/explosives.xml +++ b/Subsurface/Content/Items/Weapons/explosives.xml @@ -11,8 +11,8 @@ - - + + diff --git a/Subsurface/Content/Items/Weapons/railgun.xml b/Subsurface/Content/Items/Weapons/railgun.xml index 4284d886e..3431add15 100644 --- a/Subsurface/Content/Items/Weapons/railgun.xml +++ b/Subsurface/Content/Items/Weapons/railgun.xml @@ -51,7 +51,7 @@ - + @@ -63,14 +63,17 @@ - + - + + + + diff --git a/Subsurface/Content/Items/idcard.xml b/Subsurface/Content/Items/idcard.xml index 7446e6d77..045bd351d 100644 --- a/Subsurface/Content/Items/idcard.xml +++ b/Subsurface/Content/Items/idcard.xml @@ -5,7 +5,7 @@ Tags="smallitem" pickdistance="150"> - + diff --git a/Subsurface/Content/Particles/ParticlePrefabs.xml b/Subsurface/Content/Particles/ParticlePrefabs.xml index 578505a2c..368ffdcf3 100644 --- a/Subsurface/Content/Particles/ParticlePrefabs.xml +++ b/Subsurface/Content/Particles/ParticlePrefabs.xml @@ -87,10 +87,10 @@ @@ -98,10 +98,10 @@ diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 39f86d427..34cb71ed4 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -34,7 +34,7 @@ namespace Subsurface public readonly bool IsNetworkPlayer; - private Inventory inventory; + private CharacterInventory inventory; public double LastNetworkUpdate; @@ -66,6 +66,7 @@ namespace Subsurface protected float maxHealth; protected Item closestItem; + private Character closestCharacter, selectedCharacter; protected bool isDead; @@ -93,7 +94,6 @@ namespace Subsurface protected float soundInterval; private float bleeding; - //private float blood; private Sound[] sounds; private float[] soundRange; @@ -113,7 +113,7 @@ namespace Subsurface get { return AnimController.Mass; } } - public Inventory Inventory + public CharacterInventory Inventory { get { return inventory; } } @@ -301,11 +301,11 @@ namespace Subsurface public Character(string file, Vector2 position, CharacterInfo characterInfo = null, bool isNetworkPlayer = false) { - selectKeyHit = new Key(false); - actionKeyDown = new Key(true); - actionKeyHit = new Key(false); - secondaryKeyHit = new Key(false); - secondaryKeyDown = new Key(true); + selectKeyHit = new Key(false); + actionKeyDown = new Key(true); + actionKeyHit = new Key(false); + secondaryKeyHit = new Key(false); + secondaryKeyDown = new Key(true); selectedItems = new Item[2]; @@ -330,7 +330,7 @@ namespace Subsurface { AnimController = new HumanoidAnimController(this, doc.Root.Element("ragdoll")); AnimController.TargetDir = Direction.Right; - inventory = new CharacterInventory(10, this); + inventory = new CharacterInventory(15, this); } else { @@ -432,11 +432,15 @@ namespace Subsurface } Item item = new Item(itemPrefab, Position); - inventory.TryPutItem(item, item.AllowedSlots, false); if (info.Job.EquipSpawnItem[i]) { - item.Equip(this); + inventory.TryPutItem(item, + item.AllowedSlots.HasFlag(LimbSlot.Any) ? item.AllowedSlots & ~LimbSlot.Any : item.AllowedSlots, false); + } + else + { + inventory.TryPutItem(item, item.AllowedSlots, false); } if (item.Prefab.Name == "ID Card" && spawnPoint != null) @@ -460,8 +464,7 @@ namespace Subsurface //find the closest item if selectkey has been hit, or if the character is being //controlled by the player (in order to highlight it) - //closestItem = null; - if (controlled==this) + if (controlled == this) { Vector2 mouseSimPos = ConvertUnits.ToSimUnits(cam.ScreenToWorld(PlayerInput.MousePosition)); closestItem = FindClosestItem(mouseSimPos); @@ -474,6 +477,13 @@ namespace Subsurface new NetworkEvent(NetworkEventType.PickItem, ID, true, closestItem.ID); } } + + closestCharacter = FindClosestCharacter(mouseSimPos); + if (closestCharacter != selectedCharacter) selectedCharacter = null; + if (closestCharacter!=null) + { + if (selectKeyHit.State) selectedCharacter = (selectedCharacter==null) ? closestCharacter : null; + } } for (int i = 0; i < selectedItems.Length; i++ ) @@ -509,6 +519,31 @@ namespace Subsurface return Item.FindPickable(pos, selectedConstruction == null ? mouseSimPos : selectedConstruction.SimPosition, null, selectedItems); } + private Character FindClosestCharacter(Vector2 mouseSimPos, float maxDist = 150.0f) + { + Character closestCharacter = null; + float closestDist = 0.0f; + + maxDist = ConvertUnits.ToSimUnits(maxDist); + + foreach (Character c in Character.CharacterList) + { + if (c == this) continue; + + if (Vector2.Distance(SimPosition, c.SimPosition) > maxDist) continue; + + float dist = Vector2.Distance(mouseSimPos, c.SimPosition); + if (dist < maxDist && closestCharacter==null || dist /// Control the character according to player input /// @@ -743,10 +778,10 @@ namespace Subsurface private static GUIProgressBar drowningBar, healthBar; public void DrawHud(SpriteBatch spriteBatch, Camera cam) { - if (drowningBar==null) + if (drowningBar == null) { int width = 100, height = 20; - drowningBar = new GUIProgressBar(new Rectangle(20, Game1.GraphicsHeight/2, width, height), Color.Blue, 1.0f); + drowningBar = new GUIProgressBar(new Rectangle(20, Game1.GraphicsHeight / 2, width, height), Color.Blue, 1.0f); healthBar = new GUIProgressBar(new Rectangle(20, Game1.GraphicsHeight / 2 + 30, width, height), Color.Red, 1.0f); } @@ -757,11 +792,26 @@ namespace Subsurface healthBar.BarSize = health / maxHealth; if (healthBar.BarSize < 1.0f) healthBar.Draw(spriteBatch); - if (Controlled.Inventory != null) Controlled.Inventory.Draw(spriteBatch); + if (Controlled.Inventory != null) Controlled.Inventory.DrawOwn(spriteBatch); - if (closestItem != null && selectedConstruction==null) + Color color = Color.Orange; + + if (closestCharacter != null && closestCharacter.isDead) + { + Vector2 startPos = Position + (closestCharacter.Position - Position) * 0.7f; + startPos = cam.WorldToScreen(startPos); + + Vector2 textPos = startPos; + + float stringWidth = GUI.Font.MeasureString(closestCharacter.Info.Name).X; + textPos -= new Vector2(stringWidth / 2, 20); + spriteBatch.DrawString(GUI.Font, closestCharacter.Info.Name, textPos, Color.Black); + spriteBatch.DrawString(GUI.Font, closestCharacter.Info.Name, textPos + new Vector2(1, -1), Color.Orange); + + if (selectedCharacter==closestCharacter) closestCharacter.inventory.Draw(spriteBatch); + } + else if (closestItem != null && selectedConstruction==null) { - Color color = Color.Orange; Vector2 startPos = Position + (closestItem.Position - Position) * 0.7f; startPos = cam.WorldToScreen(startPos); @@ -782,7 +832,7 @@ namespace Subsurface spriteBatch.DrawString(GUI.Font, coloredText.text, textPos + new Vector2(1, -1), coloredText.color); textPos.Y += 25; - } + } } } diff --git a/Subsurface/Source/Items/CharacterInventory.cs b/Subsurface/Source/Items/CharacterInventory.cs index 2469ad150..cab256dc1 100644 --- a/Subsurface/Source/Items/CharacterInventory.cs +++ b/Subsurface/Source/Items/CharacterInventory.cs @@ -19,7 +19,8 @@ namespace Subsurface private static LimbSlot[] limbSlots = new LimbSlot[] { LimbSlot.Head, LimbSlot.Torso, LimbSlot.Legs, LimbSlot.LeftHand, LimbSlot.RightHand, - LimbSlot.Any, LimbSlot.Any, LimbSlot.Any, LimbSlot.Any, LimbSlot.Any }; + LimbSlot.Any, LimbSlot.Any, LimbSlot.Any, LimbSlot.Any, LimbSlot.Any, + LimbSlot.Any, LimbSlot.Any, LimbSlot.Any, LimbSlot.Any, LimbSlot.Any}; private Vector2[] slotPositions; @@ -52,12 +53,12 @@ namespace Subsurface case 4: slotPositions[i] = new Vector2( spacing * 2 + rectWidth + (spacing + rectWidth) * (i - 3), - Game1.GraphicsHeight - (spacing + rectHeight)); + Game1.GraphicsHeight - (spacing + rectHeight)*3); break; default: slotPositions[i] = new Vector2( - spacing * (4 + (i - 5)) + rectWidth * (3 + (i - 5)), - Game1.GraphicsHeight - (spacing + rectHeight)); + spacing * 2 + rectWidth + (spacing + rectWidth) * ((i - 3)%5), + Game1.GraphicsHeight - (spacing + rectHeight) * ((i>9) ? 2 : 1)); break; } } @@ -212,7 +213,7 @@ namespace Subsurface } - public override void Draw(SpriteBatch spriteBatch) + public void DrawOwn(SpriteBatch spriteBatch) { if (doubleClickedItem!=null && doubleClickedItem.inventory!=this) { @@ -251,7 +252,7 @@ namespace Subsurface slotRect.Y = (int)slotPositions[i].Y; - UpdateSlot(spriteBatch, slotRect, i, items[i], false); + UpdateSlot(spriteBatch, slotRect, i, items[i], i>4); if (draggingItem!=null && draggingItem == items[i]) draggingItemSlot = slotRect; } diff --git a/Subsurface/Source/Items/Components/Container.cs b/Subsurface/Source/Items/Components/Container.cs index b30ac86be..cd5ea359f 100644 --- a/Subsurface/Source/Items/Components/Container.cs +++ b/Subsurface/Source/Items/Components/Container.cs @@ -58,8 +58,8 @@ namespace Subsurface.Items.Components [HasDefaultValue(0.0f, false)] public float ItemRotation { - get { return itemRotation; } - set { itemRotation = value; } + get { return MathHelper.ToDegrees(itemRotation); } + set { itemRotation = MathHelper.ToRadians(value); } } private float itemRotation; diff --git a/Subsurface/Source/Items/Components/Holdable/Holdable.cs b/Subsurface/Source/Items/Components/Holdable/Holdable.cs index a13eb2748..fb285428d 100644 --- a/Subsurface/Source/Items/Components/Holdable/Holdable.cs +++ b/Subsurface/Source/Items/Components/Holdable/Holdable.cs @@ -183,6 +183,17 @@ namespace Subsurface.Items.Components if (!attachable || item.body==null) return true; item.Drop(); + + var containedItems = item.ContainedItems; + if (containedItems!=null) + { + foreach (Item contained in containedItems) + { + if (contained.body == null) continue; + contained.SetTransform(item.SimPosition, contained.body.Rotation); + } + } + item.body.Enabled = false; item.body = null; diff --git a/Subsurface/Source/Items/Components/Holdable/RepairTool.cs b/Subsurface/Source/Items/Components/Holdable/RepairTool.cs index da2662189..7063d955e 100644 --- a/Subsurface/Source/Items/Components/Holdable/RepairTool.cs +++ b/Subsurface/Source/Items/Components/Holdable/RepairTool.cs @@ -124,7 +124,7 @@ namespace Subsurface.Items.Components Body targetBody = Submarine.PickBody(TransformedBarrelPos, targetPosition, ignoredBodies); pickedPosition = Submarine.LastPickedPosition; - if (targetBody==null || targetBody.UserData==null) return true; + if (targetBody == null || targetBody.UserData == null) return true; //ApplyStatusEffects(ActionType.OnUse, 1.0f, character); diff --git a/Subsurface/Source/Items/Components/ItemComponent.cs b/Subsurface/Source/Items/Components/ItemComponent.cs index 2f8688e00..5bd69c663 100644 --- a/Subsurface/Source/Items/Components/ItemComponent.cs +++ b/Subsurface/Source/Items/Components/ItemComponent.cs @@ -550,9 +550,7 @@ namespace Subsurface.Items.Components public virtual void Load(XElement componentElement) { - if (componentElement == null) return; - - + if (componentElement == null) return; foreach (XAttribute attribute in componentElement.Attributes()) { diff --git a/Subsurface/Source/Items/Components/Projectile.cs b/Subsurface/Source/Items/Components/Projectile.cs index 6643d3cf1..0e44f3468 100644 --- a/Subsurface/Source/Items/Components/Projectile.cs +++ b/Subsurface/Source/Items/Components/Projectile.cs @@ -179,6 +179,10 @@ namespace Subsurface.Items.Components foreach (Item contained in item.ContainedItems) { contained.Condition = 0.0f; + if (contained.body!=null) + { + contained.body.SetTransform(item.SimPosition, contained.body.Rotation); + } } return true; diff --git a/Subsurface/Source/Items/Components/Signal/Connection.cs b/Subsurface/Source/Items/Components/Signal/Connection.cs index 9e3734ccd..c790acd00 100644 --- a/Subsurface/Source/Items/Components/Signal/Connection.cs +++ b/Subsurface/Source/Items/Components/Signal/Connection.cs @@ -28,7 +28,7 @@ namespace Subsurface.Items.Components private List effects; - int[] wireId; + public readonly int[] wireId; public List Recipients { @@ -463,7 +463,7 @@ namespace Subsurface.Items.Components } } - wireId = null; + //wireId = null; } } diff --git a/Subsurface/Source/Items/Components/Signal/ConnectionPanel.cs b/Subsurface/Source/Items/Components/Signal/ConnectionPanel.cs index 18b743e89..6bdbb62c6 100644 --- a/Subsurface/Source/Items/Components/Signal/ConnectionPanel.cs +++ b/Subsurface/Source/Items/Components/Signal/ConnectionPanel.cs @@ -74,21 +74,26 @@ namespace Subsurface.Items.Components public override void Load(XElement element) { base.Load(element); - - connections.Clear(); + + List loadedConnections = new List(); foreach (XElement subElement in element.Elements()) { switch (subElement.Name.ToString()) { case "input": - connections.Add(new Connection(subElement, item)); + loadedConnections.Add(new Connection(subElement, item)); break; case "output": - connections.Add(new Connection(subElement, item)); + loadedConnections.Add(new Connection(subElement, item)); break; } } + + for (int i = 0; i nodeDistance) { - DrawSection(spriteBatch, Nodes[Nodes.Count - 1], newNodePos, Nodes.Count, item.Color * 0.5f); + DrawSection(spriteBatch, Nodes[Nodes.Count - 1], newNodePos, item.Color * 0.5f); //nodes.Add(newNodePos); } @@ -333,7 +333,7 @@ selectedNodeIndex = null; } - private void DrawSection(SpriteBatch spriteBatch, Vector2 start, Vector2 end, int i, Color color) + private void DrawSection(SpriteBatch spriteBatch, Vector2 start, Vector2 end, Color color) { start.Y = -start.Y; end.Y = -end.Y; @@ -344,7 +344,7 @@ selectedNodeIndex = null; new Vector2(0.0f, wireSprite.size.Y / 2.0f), new Vector2((Vector2.Distance(start, end)) / wireSprite.Texture.Width, 0.3f), SpriteEffects.None, - wireSprite.Depth + 0.1f + i * 0.00001f); + wireSprite.Depth + ((item.ID % 100) * 0.00001f)); } public override XElement Save(XElement parentElement) diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index 70070dbe6..f84d5bc4d 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -450,13 +450,21 @@ namespace Subsurface { if (ic.Parent != null) ic.IsActive = ic.Parent.IsActive; - if (!ic.WasUsed) ic.StopSounds(ActionType.OnUse); - ic.WasUsed = false; + //if (!ic.WasUsed) + //{ + // if (ic.Name == "RepairTool" && ic.IsActive) + // { + // System.Diagnostics.Debug.WriteLine("stop sounds"); + // } + // ic.StopSounds(ActionType.OnUse); + //} + //ic.WasUsed = false; if (!ic.IsActive) { ic.StopSounds(ActionType.OnActive); + ic.StopSounds(ActionType.OnUse); continue; } if (condition > 0.0f) diff --git a/Subsurface/Source/Map/Submarine.cs b/Subsurface/Source/Map/Submarine.cs index 3b42ba5c3..260ee1d2f 100644 --- a/Subsurface/Source/Map/Submarine.cs +++ b/Subsurface/Source/Map/Submarine.cs @@ -436,7 +436,7 @@ namespace Subsurface float dragCoefficient = 0.00001f; - float speedLength = speed.Length(); + float speedLength = (speed == Vector2.Zero) ? 0.0f : speed.Length(); float drag = speedLength * speedLength * dragCoefficient * mass; if (speed != Vector2.Zero) diff --git a/Subsurface/Source/Map/WayPoint.cs b/Subsurface/Source/Map/WayPoint.cs index 07f98d4b1..da17484b7 100644 --- a/Subsurface/Source/Map/WayPoint.cs +++ b/Subsurface/Source/Map/WayPoint.cs @@ -73,7 +73,7 @@ namespace Subsurface public override void DrawEditing(SpriteBatch spriteBatch, Camera cam) { - if (editingHUD==null) + if (editingHUD == null || editingHUD.UserData != this) { editingHUD = CreateEditingHUD(); } diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs index adb5c3250..638399375 100644 --- a/Subsurface/Source/Networking/GameClient.cs +++ b/Subsurface/Source/Networking/GameClient.cs @@ -258,7 +258,6 @@ namespace Subsurface.Networking { Character.Controlled = null; Game1.GameScreen.Cam.TargetPos = Vector2.Zero; - Game1.GameScreen.Cam.Zoom = 1.0f; } else { diff --git a/Subsurface/Source/Particles/Particle.cs b/Subsurface/Source/Particles/Particle.cs index 686011341..6fa547c85 100644 --- a/Subsurface/Source/Particles/Particle.cs +++ b/Subsurface/Source/Particles/Particle.cs @@ -161,9 +161,8 @@ namespace Subsurface.Particles float drawRotation = Physics.Interpolate(prevRotation, rotation); drawPosition = ConvertUnits.ToDisplayUnits(drawPosition); - - - prefab.sprite.Draw(spriteBatch, drawPosition, color*alpha, drawRotation, size.X, SpriteEffects.None, prefab.sprite.Depth); + + prefab.sprite.Draw(spriteBatch, drawPosition, color*alpha, prefab.sprite.origin, drawRotation, size, SpriteEffects.None, prefab.sprite.Depth); //spriteBatch.Draw( // prefab.sprite.Texture, diff --git a/Subsurface/Source/Sprite.cs b/Subsurface/Source/Sprite.cs index 71c731ed8..5bce899f1 100644 --- a/Subsurface/Source/Sprite.cs +++ b/Subsurface/Source/Sprite.cs @@ -194,6 +194,11 @@ namespace Subsurface { spriteBatch.Draw(texture, pos + offset, sourceRect, color, rotation + rotate, origin, scale, spriteEffect, depth == null ? this.depth : (float)depth); } + + public void Draw(SpriteBatch spriteBatch, Vector2 pos, Color color, Vector2 origin, float rotate, Vector2 scale, SpriteEffects spriteEffect = SpriteEffects.None, float? depth = null) + { + spriteBatch.Draw(texture, pos + offset, sourceRect, color, rotation + rotate, origin, scale, spriteEffect, depth == null ? this.depth : (float)depth); + } public void DrawTiled(SpriteBatch spriteBatch, Vector2 pos, Vector2 targetSize, Color color) { diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index 5ee2b4a44705005fdb4c4d5be775cf57d44116a7..8f04bc37485a672900db44059409bf846d0b2b72 100644 GIT binary patch delta 16727 zcmdUW30#%c*7w=Zj2!VWh=7PkL_|RZRGbh{a6nOxLtZsga7qmU5r@naZL;!J;OJRp zWlDC`G$SRR1}j9bl{uhgnwg=uYh`8R^_F#0-~WD|17g$d-rslc_kG9T-@Tu;r?uB! zYweNZGwqAdv@eP4Cs;f`o5k{1X0iC<^ZJb&H#k)Uwg4%hF9p5;J_9}ns(=MA&bh(l zx^0g>cfvVWxKG%l?EX$@#^jAiyH>i~zf&O!p8}czi9k9K26RG(0)#p+960CfFSTv? zC1L}SavQ?OfMdW#=X|NXpjw>krC1@CIS)#M+Ra6tHb|QXC_qaf7ibQMNbBN^m%Fn2 zoH=sOPS4`|F3_g|`G}_=8~}6&0)Qky2K^c5UO7783B-8M_W+^5UZ70KmF>lwd`=o& zeADb=nWptNdI?GKPCbf(4V{(n%{z;v8^76E_N6mN^Jo9n?%A7mPX>p)d&?og6#yS| zvNjV|hVs}JP__fxfag4^MvjVRLXsDcy$61M1Y=k+UIIZj_MA>+19w_+@)arghoIza*$}$hNtYx?}A~n?cMu4(A zJzx*B{u_d&x;sRBX-Uv8#QD7NSLf#MLU$(z)wKJ!}xH?d1ZYTrHvC4Wb_JSv^XWoS^mT%x?HD>*ge8=Jj1zhi=;<{F+MQq zOmas0hwM&%vL@bjP_UDI0c+2PO1M{{1q;|=FG~t49@ccAsAwTuMG4pBNxLW2)^yx$ z4{Xn5i{@#+i*tUf5nikrKCMklDR+RKg$6qmet~V`jVRul#j=&tI@9J8EJB*uv;-A> z#vHW&0*jM7BHs?@55dv9BYxs+hjO<662b>cPmf>~tod1p1(}TBY0AmhGAOLKT=vo# zHb``qe;uynqw2Z0R^N#ve1tYGBE1R?Alb6 zn14&DBDDU5{)5aq3c5X()v+?s?z9(4v^h|8$j_jH`*@uuX)&rOMse<+8Vx{pBhwR& znIe1yhr9=*ozBweuFj3op{{3DiQfJ*hB!{Jx~)veVQ7@Awun&j#1(|9C+>x?nI~>V z*xVCufzalO2O{hM1OP2Pv{s(*2IWj+9l3K@JB{Vi%<0TZ*6D0zX-N{*PG@mdHfHxB z`w%Xs8}U>$gcU1O!16ke+SNx&Bb!QziZa-aEp|JGZ{rXs;bOtT6kjy4L}x_k&t&M_+~&7M_zQV$jJ897cF4_kix626^*_wUQf((COrPJG zZ5PSjfq^jxJHy;@EXcJ-OY|

@(3a!ZO{0>~%sRIlh;hQ}wG_H66>9d(fTHLNFcq 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