From 69059eac80a3878296d25d9a0bf932336add893a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= <6766154+Zumorica@users.noreply.github.com> Date: Mon, 21 Sep 2020 17:51:07 +0200 Subject: [PATCH] Adds new different reaction types. (#2114) * Adds new different reaction types. - Adds touch, injection and ingestion reactions for entities. - Adds tile reactions. - Removes GasSprayerComponent in favor of SprayComponent. - Gives fire extinguishers a safety. - Gives spray puffs a sprite. - Improved spray and fire extinguisher in general. - Fire extinguisher now ACTUALLY puts out fires. Amazing, eh? - Fire extinguisher sprays three 'clouds' at once. - Spraying flammable chemicals at fire makes them worse. Whoops! - Gives spray and fire extinguisher their classic sounds. - Most chemicals now don't make puddles. Too bad! - Space lube now makes a very slippery puddle. Honk. - Spraying water (or using a fire extinguisher) on existing puddles makes them bigger. * Fix solution tests * food base now has solution container with noexamine caps --- .../Atmos/ExtinguisherVisualizer.cs | 67 -------- .../Components/Atmos/PumpVisualizer.cs | 2 +- .../Components/Atmos/SiphonVisualizer.cs | 4 +- .../Components/Atmos/VaporVisualizer.cs | 101 ++++++++++++ .../Components/Atmos/VentVisualizer.cs | 4 +- .../Components/Fluids/SprayVisualizer.cs | 51 +++++++ .../Components/Movement/SlipperyComponent.cs | 13 +- Content.Server/Atmos/GasSprayerComponent.cs | 69 --------- Content.Server/Atmos/GasVaporComponent.cs | 121 --------------- .../TileReactions/ExtinguishTileReaction.cs | 37 +++++ .../TileReactions/FlammableTileReaction.cs | 32 ++++ .../SpillIfPuddlePresentTileReaction.cs | 25 +++ .../TileReactions/SpillTileReaction.cs | 49 ++++++ .../Atmos/Piping/Pumps/BasePumpComponent.cs | 1 - .../Piping/Scrubbers/BaseSiphonComponent.cs | 2 +- .../Atmos/Piping/Vents/BaseVentComponent.cs | 2 +- .../Components/Chemistry/VaporComponent.cs | 66 ++++++-- .../Components/Fluids/PuddleComponent.cs | 10 ++ .../Components/Fluids/SpillExtensions.cs | 76 +++++++++ .../Components/Fluids/SprayComponent.cs | 144 ++++++++++++++++-- .../Components/Mobs/StunnableComponent.cs | 4 + .../Components/Movement/SlipperyComponent.cs | 74 +++++++++ .../EntitySystems/GasVaporSystem.cs | 20 --- .../GameObjects/EntitySystems/VaporSystem.cs | 2 +- Content.Shared/Chemistry/ReagentPrototype.cs | 59 ++++++- Content.Shared/Chemistry/ReagentUnit.cs | 14 +- .../Atmos/SharedPumpComponent.cs | 3 +- .../Atmos/SharedSiphonComponent.cs | 6 +- .../Atmos/SharedVentComponent.cs | 6 +- .../Components/Fluids/SharedSprayComponent.cs | 17 +++ .../Mobs/SharedStunnableComponent.cs | 2 - .../Movement/SharedSlipperyComponent.cs | 45 ++++-- .../Components/SharedGasSprayerComponent.cs | 17 --- .../Components/SharedVaporComponent.cs | 20 +++ Content.Shared/GameObjects/ContentNetIDs.cs | 1 + .../Interfaces/Chemistry/ITileReaction.cs | 11 ++ .../Interaction/IReagentReaction.cs | 18 +++ Content.Shared/Physics/GasVaporController.cs | 13 -- Resources/Audio/Effects/extinguish.ogg | Bin 0 -> 15356 bytes Resources/Audio/Effects/spray2.ogg | Bin 0 -> 26164 bytes .../Entities/Objects/Consumable/food.yml | 2 + .../Objects/Misc/extinguisher_spray.yml | 28 ---- .../Objects/Misc/fire_extinguisher.yml | 59 +++++-- .../Entities/Objects/Specific/janitor.yml | 68 ++++++++- Resources/Prototypes/Entities/chemistry.yml | 18 --- Resources/Prototypes/Reagents/chemicals.yml | 20 +++ .../Effects/chempuff.rsi/chempuff.png | Bin 0 -> 2172 bytes .../Textures/Effects/chempuff.rsi/meta.json | 24 +++ .../extinguisherSpray.rsi/extinguish.png | Bin 55777 -> 7131 bytes .../Effects/extinguisherSpray.rsi/meta.json | 48 +----- RobustToolbox | 2 +- 51 files changed, 1006 insertions(+), 471 deletions(-) delete mode 100644 Content.Client/GameObjects/Components/Atmos/ExtinguisherVisualizer.cs create mode 100644 Content.Client/GameObjects/Components/Atmos/VaporVisualizer.cs create mode 100644 Content.Client/GameObjects/Components/Fluids/SprayVisualizer.cs delete mode 100644 Content.Server/Atmos/GasSprayerComponent.cs delete mode 100644 Content.Server/Atmos/GasVaporComponent.cs create mode 100644 Content.Server/Chemistry/TileReactions/ExtinguishTileReaction.cs create mode 100644 Content.Server/Chemistry/TileReactions/FlammableTileReaction.cs create mode 100644 Content.Server/Chemistry/TileReactions/SpillIfPuddlePresentTileReaction.cs create mode 100644 Content.Server/Chemistry/TileReactions/SpillTileReaction.cs delete mode 100644 Content.Server/GameObjects/EntitySystems/GasVaporSystem.cs rename Content.Shared/GameObjects/{ => Components}/Atmos/SharedPumpComponent.cs (90%) rename Content.Shared/GameObjects/{ => Components}/Atmos/SharedSiphonComponent.cs (76%) rename Content.Shared/GameObjects/{ => Components}/Atmos/SharedVentComponent.cs (75%) create mode 100644 Content.Shared/GameObjects/Components/Fluids/SharedSprayComponent.cs delete mode 100644 Content.Shared/GameObjects/Components/SharedGasSprayerComponent.cs create mode 100644 Content.Shared/GameObjects/Components/SharedVaporComponent.cs create mode 100644 Content.Shared/Interfaces/Chemistry/ITileReaction.cs create mode 100644 Content.Shared/Interfaces/GameObjects/Components/Interaction/IReagentReaction.cs delete mode 100644 Content.Shared/Physics/GasVaporController.cs create mode 100644 Resources/Audio/Effects/extinguish.ogg create mode 100644 Resources/Audio/Effects/spray2.ogg delete mode 100644 Resources/Prototypes/Entities/Objects/Misc/extinguisher_spray.yml create mode 100644 Resources/Textures/Effects/chempuff.rsi/chempuff.png create mode 100644 Resources/Textures/Effects/chempuff.rsi/meta.json diff --git a/Content.Client/GameObjects/Components/Atmos/ExtinguisherVisualizer.cs b/Content.Client/GameObjects/Components/Atmos/ExtinguisherVisualizer.cs deleted file mode 100644 index b25f36b0a3..0000000000 --- a/Content.Client/GameObjects/Components/Atmos/ExtinguisherVisualizer.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System; -using Content.Shared.GameObjects.Components; -using JetBrains.Annotations; -using Robust.Client.Animations; -using Robust.Client.GameObjects; -using Robust.Client.GameObjects.Components.Animations; -using Robust.Client.Interfaces.GameObjects.Components; -using Robust.Shared.Animations; -using Robust.Shared.Maths; - -namespace Content.Client.GameObjects.Components.Atmos -{ - [UsedImplicitly] - public class ExtinguisherVisualizer : AppearanceVisualizer - { - - public override void OnChangeData(AppearanceComponent component) - { - base.OnChangeData(component); - - if (component.Deleted) - { - return; - } - - if (component.TryGetData(ExtinguisherVisuals.Rotation, out var degrees)) - { - SetRotation(component, Angle.FromDegrees(degrees)); - } - } - - private void SetRotation(AppearanceComponent component, Angle rotation) - { - var sprite = component.Owner.GetComponent(); - - if (!sprite.Owner.TryGetComponent(out AnimationPlayerComponent animation)) - { - sprite.Rotation = rotation; - return; - } - - if (animation.HasRunningAnimation("rotate")) - { - animation.Stop("rotate"); - } - - animation.Play(new Animation - { - Length = TimeSpan.FromSeconds(0.125), - AnimationTracks = - { - new AnimationTrackComponentProperty - { - ComponentType = typeof(ISpriteComponent), - Property = nameof(ISpriteComponent.Rotation), - InterpolationMode = AnimationInterpolationMode.Linear, - KeyFrames = - { - new AnimationTrackProperty.KeyFrame(sprite.Rotation, 0), - new AnimationTrackProperty.KeyFrame(rotation, 0.125f) - } - } - } - }, "rotate"); - } - } -} diff --git a/Content.Client/GameObjects/Components/Atmos/PumpVisualizer.cs b/Content.Client/GameObjects/Components/Atmos/PumpVisualizer.cs index 233d3cbe90..26e86403e5 100644 --- a/Content.Client/GameObjects/Components/Atmos/PumpVisualizer.cs +++ b/Content.Client/GameObjects/Components/Atmos/PumpVisualizer.cs @@ -1,5 +1,5 @@ using System; -using Content.Shared.GameObjects.Atmos; +using Content.Shared.GameObjects.Components.Atmos; using JetBrains.Annotations; using Robust.Client.GameObjects; using Robust.Client.Graphics; diff --git a/Content.Client/GameObjects/Components/Atmos/SiphonVisualizer.cs b/Content.Client/GameObjects/Components/Atmos/SiphonVisualizer.cs index 07a8c04578..bdee4169dc 100644 --- a/Content.Client/GameObjects/Components/Atmos/SiphonVisualizer.cs +++ b/Content.Client/GameObjects/Components/Atmos/SiphonVisualizer.cs @@ -1,5 +1,4 @@ -using Content.Shared.GameObjects.Atmos; -using JetBrains.Annotations; +using JetBrains.Annotations; using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.Interfaces.GameObjects.Components; @@ -10,6 +9,7 @@ using Robust.Shared.IoC; using Robust.Shared.Log; using Robust.Shared.Utility; using System; +using Content.Shared.GameObjects.Components.Atmos; using YamlDotNet.RepresentationModel; namespace Content.Client.GameObjects.Components.Atmos diff --git a/Content.Client/GameObjects/Components/Atmos/VaporVisualizer.cs b/Content.Client/GameObjects/Components/Atmos/VaporVisualizer.cs new file mode 100644 index 0000000000..0a6872b9ea --- /dev/null +++ b/Content.Client/GameObjects/Components/Atmos/VaporVisualizer.cs @@ -0,0 +1,101 @@ +using System; +using Content.Shared.GameObjects.Components; +using JetBrains.Annotations; +using Robust.Client.Animations; +using Robust.Client.GameObjects; +using Robust.Client.GameObjects.Components.Animations; +using Robust.Client.Interfaces.GameObjects.Components; +using Robust.Shared.Animations; +using Robust.Shared.Maths; +using Robust.Shared.Utility; +using YamlDotNet.RepresentationModel; + +namespace Content.Client.GameObjects.Components.Atmos +{ + [UsedImplicitly] + public class VaporVisualizer : AppearanceVisualizer + { + private const string AnimationKey = "flick_animation"; + private Animation VaporFlick; + + public override void LoadData(YamlMappingNode node) + { + base.LoadData(node); + + var delay = 0.25f; + var state = "chempuff"; + + if (node.TryGetNode("animation_time", out var delayNode)) + { + delay = delayNode.AsFloat(); + } + + if (node.TryGetNode("animation_state", out var stateNode)) + { + state = stateNode.AsString(); + } + + VaporFlick = new Animation {Length = TimeSpan.FromSeconds(delay)}; + { + var flick = new AnimationTrackSpriteFlick(); + VaporFlick.AnimationTracks.Add(flick); + flick.LayerKey = VaporVisualLayers.Base; + flick.KeyFrames.Add(new AnimationTrackSpriteFlick.KeyFrame(state, 0f)); + } + } + + public override void OnChangeData(AppearanceComponent component) + { + base.OnChangeData(component); + + if (component.Deleted) + { + return; + } + + if (component.TryGetData(VaporVisuals.Rotation, out var radians)) + { + SetRotation(component, new Angle(radians)); + } + + if (component.TryGetData(VaporVisuals.Color, out var color)) + { + SetColor(component, color); + } + + if (component.TryGetData(VaporVisuals.State, out var state)) + { + SetState(component, state); + } + } + + private void SetState(AppearanceComponent component, bool state) + { + if (!state) return; + + var animPlayer = component.Owner.GetComponent(); + + if(!animPlayer.HasRunningAnimation(AnimationKey)) + animPlayer.Play(VaporFlick, AnimationKey); + } + + private void SetRotation(AppearanceComponent component, Angle rotation) + { + var sprite = component.Owner.GetComponent(); + + sprite.Rotation = rotation; + } + + private void SetColor(AppearanceComponent component, Color color) + { + var sprite = component.Owner.GetComponent(); + + sprite.Color = color; + } + } + + public enum VaporVisualLayers + { + Base + } +} diff --git a/Content.Client/GameObjects/Components/Atmos/VentVisualizer.cs b/Content.Client/GameObjects/Components/Atmos/VentVisualizer.cs index a30b2b9f9d..04c9bd2681 100644 --- a/Content.Client/GameObjects/Components/Atmos/VentVisualizer.cs +++ b/Content.Client/GameObjects/Components/Atmos/VentVisualizer.cs @@ -1,5 +1,4 @@ -using Content.Shared.GameObjects.Atmos; -using JetBrains.Annotations; +using JetBrains.Annotations; using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.Interfaces.GameObjects.Components; @@ -10,6 +9,7 @@ using Robust.Shared.IoC; using Robust.Shared.Log; using Robust.Shared.Utility; using System; +using Content.Shared.GameObjects.Components.Atmos; using YamlDotNet.RepresentationModel; namespace Content.Client.GameObjects.Components.Atmos diff --git a/Content.Client/GameObjects/Components/Fluids/SprayVisualizer.cs b/Content.Client/GameObjects/Components/Fluids/SprayVisualizer.cs new file mode 100644 index 0000000000..d8d23acd50 --- /dev/null +++ b/Content.Client/GameObjects/Components/Fluids/SprayVisualizer.cs @@ -0,0 +1,51 @@ +using Content.Shared.GameObjects.Components.Fluids; +using Robust.Client.GameObjects; +using Robust.Client.Interfaces.GameObjects.Components; +using Robust.Shared.Utility; +using YamlDotNet.RepresentationModel; + +namespace Content.Client.GameObjects.Components.Fluids +{ + public class SprayVisualizer : AppearanceVisualizer + { + private string _safetyOnState; + private string _safetyOffState; + + public override void LoadData(YamlMappingNode node) + { + base.LoadData(node); + + if (node.TryGetNode("safety_on_state", out var safetyOn)) + { + _safetyOnState = safetyOn.AsString(); + } + + if (node.TryGetNode("safety_off_state", out var safetyOff)) + { + _safetyOffState = safetyOff.AsString(); + } + } + + public override void OnChangeData(AppearanceComponent component) + { + base.OnChangeData(component); + + if (component.TryGetData(SprayVisuals.Safety, out var safety)) + { + SetSafety(component, safety); + } + } + + private void SetSafety(AppearanceComponent component, bool safety) + { + var sprite = component.Owner.GetComponent(); + + sprite.LayerSetState(SprayVisualLayers.Base, safety ? _safetyOnState : _safetyOffState); + } + } + + public enum SprayVisualLayers + { + Base + } +} diff --git a/Content.Client/GameObjects/Components/Movement/SlipperyComponent.cs b/Content.Client/GameObjects/Components/Movement/SlipperyComponent.cs index 071aa459f9..596d06c7de 100644 --- a/Content.Client/GameObjects/Components/Movement/SlipperyComponent.cs +++ b/Content.Client/GameObjects/Components/Movement/SlipperyComponent.cs @@ -1,4 +1,5 @@ -using Content.Shared.GameObjects.Components.Movement; +#nullable enable +using Content.Shared.GameObjects.Components.Movement; using Robust.Shared.GameObjects; namespace Content.Client.GameObjects.Components.Movement @@ -7,5 +8,15 @@ namespace Content.Client.GameObjects.Components.Movement [ComponentReference(typeof(SharedSlipperyComponent))] public class SlipperyComponent : SharedSlipperyComponent { + public override void HandleComponentState(ComponentState? curState, ComponentState? nextState) + { + if (!(curState is SlipperyComponentState state)) return; + + Slippery = state.Slippery; + IntersectPercentage = state.IntersectPercentage; + ParalyzeTime = state.ParalyzeTime; + RequiredSlipSpeed = state.RequiredSlipSpeed; + LaunchForwardsMultiplier = state.LaunchForwardsMultiplier; + } } } diff --git a/Content.Server/Atmos/GasSprayerComponent.cs b/Content.Server/Atmos/GasSprayerComponent.cs deleted file mode 100644 index 0f5897c6ee..0000000000 --- a/Content.Server/Atmos/GasSprayerComponent.cs +++ /dev/null @@ -1,69 +0,0 @@ -using Content.Server.GameObjects.Components.Chemistry; -using Content.Shared.Chemistry; -using Content.Shared.GameObjects.Components; -using Content.Shared.Interfaces; -using Content.Shared.Interfaces.GameObjects.Components; -using Robust.Server.GameObjects; -using Robust.Server.GameObjects.EntitySystems; -using Robust.Server.Interfaces.GameObjects; -using Robust.Shared.GameObjects; -using Robust.Shared.GameObjects.Systems; -using Robust.Shared.IoC; -using Robust.Shared.Localization; -using Robust.Shared.Maths; -using Robust.Shared.Serialization; - -namespace Content.Server.Atmos -{ - [RegisterComponent] - public class GasSprayerComponent : Component, IAfterInteract - { - [Dependency] private readonly IServerEntityManager _serverEntityManager = default!; - - //TODO: create a function that can create a gas based on a solution mix - public override string Name => "GasSprayer"; - - private string _spraySound; - private string _sprayType; - private string _fuelType; - private string _fuelName; - private int _fuelCost; - - public override void ExposeData(ObjectSerializer serializer) - { - base.ExposeData(serializer); - serializer.DataField(ref _spraySound, "spraySound", string.Empty); - serializer.DataField(ref _sprayType, "sprayType", string.Empty); - serializer.DataField(ref _fuelType, "fuelType", string.Empty); - serializer.DataField(ref _fuelName, "fuelName", "fuel"); - serializer.DataField(ref _fuelCost, "fuelCost", 50); - } - - public void AfterInteract(AfterInteractEventArgs eventArgs) - { - if (!Owner.TryGetComponent(out SolutionContainerComponent tank)) - return; - - if (tank.Solution.GetReagentQuantity(_fuelType) == 0) - { - Owner.PopupMessage(eventArgs.User, - Loc.GetString("{0:theName} is out of {1}!", Owner, _fuelName)); - } - else - { - tank.TryRemoveReagent(_fuelType, ReagentUnit.New(_fuelCost)); - - var playerPos = eventArgs.User.Transform.Coordinates; - var direction = (eventArgs.ClickLocation.Position - playerPos.Position).Normalized; - playerPos.Offset(direction/2); - - var spray = _serverEntityManager.SpawnEntity(_sprayType, playerPos); - spray.GetComponent() - .SetData(ExtinguisherVisuals.Rotation, direction.ToAngle().Degrees); - spray.GetComponent().StartMove(direction, 5); - - EntitySystem.Get().PlayFromEntity(_spraySound, Owner); - } - } - } -} diff --git a/Content.Server/Atmos/GasVaporComponent.cs b/Content.Server/Atmos/GasVaporComponent.cs deleted file mode 100644 index bb57f694ac..0000000000 --- a/Content.Server/Atmos/GasVaporComponent.cs +++ /dev/null @@ -1,121 +0,0 @@ -using Content.Server.Atmos.Reactions; -using Content.Server.Interfaces; -using Content.Shared.Atmos; -using Content.Shared.Physics; -using Robust.Shared.GameObjects; -using Robust.Shared.GameObjects.Components; -using Robust.Shared.Interfaces.GameObjects; -using Robust.Shared.Interfaces.Map; -using Robust.Shared.IoC; -using Robust.Shared.Maths; -using Robust.Shared.Serialization; -using Robust.Shared.ViewVariables; - -namespace Content.Server.Atmos -{ - [RegisterComponent] - class GasVaporComponent : Component, ICollideBehavior, IGasMixtureHolder - { - [Dependency] private readonly IMapManager _mapManager = default!; - [Dependency] private readonly IEntityManager _entityManager = default!; - - public override string Name => "GasVapor"; - - [ViewVariables] public GasMixture Air { get; set; } - - private bool _running; - private Vector2 _direction; - private float _velocity; - private float _disspateTimer = 0; - private float _dissipationInterval; - private Gas _gas; - private float _gasVolume; - private float _gasTemperature; - private float _gasAmount; - - public override void Initialize() - { - base.Initialize(); - Air = new GasMixture(_gasVolume){Temperature = _gasTemperature}; - Air.SetMoles(_gas,_gasAmount); - } - - public override void ExposeData(ObjectSerializer serializer) - { - base.ExposeData(serializer); - serializer.DataField(ref _dissipationInterval, "dissipationInterval", 1); - serializer.DataField(ref _gas, "gas", Gas.WaterVapor); - serializer.DataField(ref _gasVolume, "gasVolume", 200); - serializer.DataField(ref _gasTemperature, "gasTemperature", Atmospherics.T20C); - serializer.DataField(ref _gasAmount, "gasAmount", 20); - } - - public void StartMove(Vector2 dir, float velocity) - { - _running = true; - _direction = dir; - _velocity = velocity; - - if (Owner.TryGetComponent(out ICollidableComponent collidable)) - { - var controller = collidable.EnsureController(); - controller.Move(_direction, _velocity); - } - } - - public void Update(float frameTime) - { - if (!_running) - return; - - if (Owner.TryGetComponent(out ICollidableComponent collidable)) - { - var worldBounds = collidable.WorldAABB; - var mapGrid = _mapManager.GetGrid(Owner.Transform.GridID); - - var tiles = mapGrid.GetTilesIntersecting(worldBounds); - - foreach (var tile in tiles) - { - var pos = tile.GridIndices.ToEntityCoordinates(_mapManager, tile.GridIndex); - var atmos = pos.GetTileAtmosphere(_entityManager); - - if (atmos?.Air == null) - { - return; - } - - if (atmos.Air.React(this) != ReactionResult.NoReaction) - { - Owner.Delete(); - } - } - } - - _disspateTimer += frameTime; - if (_disspateTimer > _dissipationInterval) - { - Air.SetMoles(_gas, Air.TotalMoles/2 ); - } - - if (Air.TotalMoles < 1) - { - Owner.Delete(); - } - } - - void ICollideBehavior.CollideWith(IEntity collidedWith) - { - // Check for collision with a impassable object (e.g. wall) and stop - if (collidedWith.TryGetComponent(out ICollidableComponent collidable) && - (collidable.CollisionLayer & (int) CollisionGroup.Impassable) != 0 && - collidable.Hard && - Owner.TryGetComponent(out ICollidableComponent coll)) - { - var controller = coll.EnsureController(); - controller.Stop(); - Owner.Delete(); - } - } - } -} diff --git a/Content.Server/Chemistry/TileReactions/ExtinguishTileReaction.cs b/Content.Server/Chemistry/TileReactions/ExtinguishTileReaction.cs new file mode 100644 index 0000000000..01c13b5deb --- /dev/null +++ b/Content.Server/Chemistry/TileReactions/ExtinguishTileReaction.cs @@ -0,0 +1,37 @@ +using System; +using Content.Server.Atmos; +using Content.Shared.Atmos; +using Content.Shared.Chemistry; +using Content.Shared.Interfaces.Chemistry; +using JetBrains.Annotations; +using Robust.Shared.Map; +using Robust.Shared.Serialization; + +namespace Content.Server.Chemistry.TileReactions +{ + [UsedImplicitly] + public class ExtinguishTileReaction : ITileReaction + { + private float _coolingTemperature = 2f; + + public void ExposeData(ObjectSerializer serializer) + { + serializer.DataField(ref _coolingTemperature, "coolingTemperature", 2f); + } + + public ReagentUnit TileReact(TileRef tile, ReagentPrototype reagent, ReagentUnit reactVolume) + { + if (reactVolume <= ReagentUnit.Zero || tile.Tile.IsEmpty) return ReagentUnit.Zero; + var tileAtmos = tile.GridIndices.GetTileAtmosphere(tile.GridIndex); + if (tileAtmos == null || !tileAtmos.Hotspot.Valid) return ReagentUnit.Zero; + tileAtmos.Air.Temperature = + MathF.Max(MathF.Min(tileAtmos.Air.Temperature - (_coolingTemperature * 1000f), + tileAtmos.Air.Temperature / _coolingTemperature), + Atmospherics.TCMB); + tileAtmos.Air.React(tileAtmos); + tileAtmos.Hotspot = new Hotspot(); + tileAtmos.UpdateVisuals(); + return ReagentUnit.Zero; + } + } +} diff --git a/Content.Server/Chemistry/TileReactions/FlammableTileReaction.cs b/Content.Server/Chemistry/TileReactions/FlammableTileReaction.cs new file mode 100644 index 0000000000..2318247869 --- /dev/null +++ b/Content.Server/Chemistry/TileReactions/FlammableTileReaction.cs @@ -0,0 +1,32 @@ +using System; +using Content.Server.Atmos; +using Content.Shared.Atmos; +using Content.Shared.Chemistry; +using Content.Shared.Interfaces.Chemistry; +using JetBrains.Annotations; +using Robust.Shared.Map; +using Robust.Shared.Serialization; + +namespace Content.Server.Chemistry.TileReactions +{ + [UsedImplicitly] + public class FlammableTileReaction : ITileReaction + { + private float _temperatureMultiplier = 1.25f; + + public void ExposeData(ObjectSerializer serializer) + { + serializer.DataField(ref _temperatureMultiplier, "temperatureMultiplier", 1.15f); + } + + public ReagentUnit TileReact(TileRef tile, ReagentPrototype reagent, ReagentUnit reactVolume) + { + if (reactVolume <= ReagentUnit.Zero || tile.Tile.IsEmpty) return ReagentUnit.Zero; + var tileAtmos = tile.GridIndices.GetTileAtmosphere(tile.GridIndex); + if (tileAtmos == null || !tileAtmos.Hotspot.Valid) return ReagentUnit.Zero; + tileAtmos.Air.Temperature *= MathF.Max(_temperatureMultiplier * reactVolume.Float(), 1f); + tileAtmos.Air.React(tileAtmos); + return reactVolume; + } + } +} diff --git a/Content.Server/Chemistry/TileReactions/SpillIfPuddlePresentTileReaction.cs b/Content.Server/Chemistry/TileReactions/SpillIfPuddlePresentTileReaction.cs new file mode 100644 index 0000000000..20debe8e85 --- /dev/null +++ b/Content.Server/Chemistry/TileReactions/SpillIfPuddlePresentTileReaction.cs @@ -0,0 +1,25 @@ +using Content.Server.GameObjects.Components.Fluids; +using Content.Server.GameObjects.Components.Movement; +using Content.Shared.Chemistry; +using Content.Shared.Interfaces.Chemistry; +using JetBrains.Annotations; +using Robust.Shared.Map; +using Robust.Shared.Serialization; + +namespace Content.Server.Chemistry.TileReactions +{ + [UsedImplicitly] + public class SpillIfPuddlePresentTileReaction : ITileReaction + { + public void ExposeData(ObjectSerializer serializer) + { + } + + public ReagentUnit TileReact(TileRef tile, ReagentPrototype reagent, ReagentUnit reactVolume) + { + if (reactVolume < 5 || !tile.TryGetPuddle(null, out _)) return ReagentUnit.Zero; + + return tile.SpillAt(new Solution(reagent.ID, reactVolume), "PuddleSmear", true, false) != null ? reactVolume : ReagentUnit.Zero; + } + } +} diff --git a/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs b/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs new file mode 100644 index 0000000000..4b70de62f1 --- /dev/null +++ b/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs @@ -0,0 +1,49 @@ +using Content.Server.GameObjects.Components.Fluids; +using Content.Server.GameObjects.Components.Movement; +using Content.Shared.Chemistry; +using Content.Shared.Interfaces.Chemistry; +using JetBrains.Annotations; +using Robust.Shared.Log; +using Robust.Shared.Map; +using Robust.Shared.Serialization; + +namespace Content.Server.Chemistry.TileReactions +{ + [UsedImplicitly] + public class SpillTileReaction : ITileReaction + { + private float _launchForwardsMultiplier = 1f; + private float _requiredSlipSpeed = 6f; + private float _paralyzeTime = 1f; + private bool _overflow; + + public void ExposeData(ObjectSerializer serializer) + { + // If you want to modify more puddle/slippery values, add them here. + serializer.DataField(ref _paralyzeTime, "paralyzeTime", 1f); + serializer.DataField(ref _launchForwardsMultiplier, "launchForwardsMultiplier", 1f); + serializer.DataField(ref _requiredSlipSpeed, "requiredSlipSpeed", 6f); + serializer.DataField(ref _overflow, "overflow", false); + } + + public ReagentUnit TileReact(TileRef tile, ReagentPrototype reagent, ReagentUnit reactVolume) + { + if (reactVolume < 5) return ReagentUnit.Zero; + + // TODO Make this not puddle smear. + var puddle = tile.SpillAt(new Solution(reagent.ID, reactVolume), "PuddleSmear", _overflow, false); + + if (puddle != null) + { + var slippery = puddle.Owner.GetComponent(); + slippery.LaunchForwardsMultiplier = _launchForwardsMultiplier; + slippery.RequiredSlipSpeed = _requiredSlipSpeed; + slippery.ParalyzeTime = _paralyzeTime; + + return reactVolume; + } + + return ReagentUnit.Zero; + } + } +} diff --git a/Content.Server/GameObjects/Components/Atmos/Piping/Pumps/BasePumpComponent.cs b/Content.Server/GameObjects/Components/Atmos/Piping/Pumps/BasePumpComponent.cs index 6626fe3bb8..37e08ad5e0 100644 --- a/Content.Server/GameObjects/Components/Atmos/Piping/Pumps/BasePumpComponent.cs +++ b/Content.Server/GameObjects/Components/Atmos/Piping/Pumps/BasePumpComponent.cs @@ -2,7 +2,6 @@ using Content.Server.Atmos; using Content.Server.GameObjects.Components.NodeContainer; using Content.Server.GameObjects.Components.NodeContainer.Nodes; -using Content.Shared.GameObjects.Atmos; using Content.Shared.GameObjects.Components.Atmos; using Robust.Server.GameObjects; using Robust.Shared.Log; diff --git a/Content.Server/GameObjects/Components/Atmos/Piping/Scrubbers/BaseSiphonComponent.cs b/Content.Server/GameObjects/Components/Atmos/Piping/Scrubbers/BaseSiphonComponent.cs index 210c7d12ed..54a7674208 100644 --- a/Content.Server/GameObjects/Components/Atmos/Piping/Scrubbers/BaseSiphonComponent.cs +++ b/Content.Server/GameObjects/Components/Atmos/Piping/Scrubbers/BaseSiphonComponent.cs @@ -3,7 +3,7 @@ using Content.Server.Atmos; using Content.Server.GameObjects.Components.NodeContainer; using Content.Server.GameObjects.Components.NodeContainer.Nodes; using Content.Server.GameObjects.EntitySystems; -using Content.Shared.GameObjects.Atmos; +using Content.Shared.GameObjects.Components.Atmos; using Robust.Server.GameObjects; using Robust.Shared.GameObjects.Systems; using Robust.Shared.Interfaces.GameObjects; diff --git a/Content.Server/GameObjects/Components/Atmos/Piping/Vents/BaseVentComponent.cs b/Content.Server/GameObjects/Components/Atmos/Piping/Vents/BaseVentComponent.cs index ee5317b787..6a47760c45 100644 --- a/Content.Server/GameObjects/Components/Atmos/Piping/Vents/BaseVentComponent.cs +++ b/Content.Server/GameObjects/Components/Atmos/Piping/Vents/BaseVentComponent.cs @@ -3,7 +3,7 @@ using Content.Server.Atmos; using Content.Server.GameObjects.Components.NodeContainer; using Content.Server.GameObjects.Components.NodeContainer.Nodes; using Content.Server.GameObjects.EntitySystems; -using Content.Shared.GameObjects.Atmos; +using Content.Shared.GameObjects.Components.Atmos; using Robust.Server.GameObjects; using Robust.Shared.GameObjects.Systems; using Robust.Shared.Interfaces.GameObjects; diff --git a/Content.Server/GameObjects/Components/Chemistry/VaporComponent.cs b/Content.Server/GameObjects/Components/Chemistry/VaporComponent.cs index 68fadf41ad..a9828dade1 100644 --- a/Content.Server/GameObjects/Components/Chemistry/VaporComponent.cs +++ b/Content.Server/GameObjects/Components/Chemistry/VaporComponent.cs @@ -1,31 +1,43 @@ using System.Linq; using Content.Server.GameObjects.Components.Fluids; using Content.Shared.Chemistry; +using Content.Shared.GameObjects.Components; +using Content.Shared.Interfaces.GameObjects.Components; using Content.Shared.Physics; +using Microsoft.DiaSymReader; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Components; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Map; using Robust.Shared.IoC; using Robust.Shared.Log; +using Robust.Shared.Map; using Robust.Shared.Maths; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.ViewVariables; namespace Content.Server.GameObjects.Components.Chemistry { [RegisterComponent] - class VaporComponent : Component, ICollideBehavior + class VaporComponent : SharedVaporComponent, ICollideBehavior { + public const float ReactTime = 0.125f; + [Dependency] private readonly IMapManager _mapManager = default!; - public override string Name => "Vapor"; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [ViewVariables] private ReagentUnit _transferAmount; + private bool _reached; + private float _reactTimer; + private float _timer; + private EntityCoordinates _target; private bool _running; private Vector2 _direction; private float _velocity; + private float _aliveTime; public override void Initialize() { @@ -38,11 +50,13 @@ namespace Content.Server.GameObjects.Components.Chemistry } } - public void Start(Vector2 dir, float velocity) + public void Start(Vector2 dir, float velocity, EntityCoordinates target, float aliveTime) { _running = true; + _target = target; _direction = dir; _velocity = velocity; + _aliveTime = aliveTime; // Set Move if (Owner.TryGetComponent(out ICollidableComponent collidable)) { @@ -57,7 +71,7 @@ namespace Content.Server.GameObjects.Components.Chemistry serializer.DataField(ref _transferAmount, "transferAmount", ReagentUnit.New(0.5)); } - public void Update() + public void Update(float frameTime) { if (!Owner.TryGetComponent(out SolutionContainerComponent contents)) return; @@ -65,22 +79,36 @@ namespace Content.Server.GameObjects.Components.Chemistry if (!_running) return; - // Get all intersecting tiles with the vapor and spray the divided solution on there - if (Owner.TryGetComponent(out ICollidableComponent collidable)) + _timer += frameTime; + _reactTimer += frameTime; + + if (_reactTimer >= ReactTime && Owner.TryGetComponent(out ICollidableComponent collidable)) { - var worldBounds = collidable.WorldAABB; + _reactTimer = 0; var mapGrid = _mapManager.GetGrid(Owner.Transform.GridID); - var tiles = mapGrid.GetTilesIntersecting(worldBounds); - var amount = _transferAmount / ReagentUnit.New(tiles.Count()); - foreach (var tile in tiles) + var tile = mapGrid.GetTileRef(Owner.Transform.Coordinates.ToMapIndices(Owner.EntityManager, _mapManager)); + foreach (var reagentQuantity in contents.ReagentList.ToArray()) { - var pos = tile.GridIndices.ToEntityCoordinates(_mapManager, tile.GridIndex); - contents.SplitSolution(amount).SpillAt(pos, "PuddleSmear", false); // TODO: Make non PuddleSmear? + if (reagentQuantity.Quantity == ReagentUnit.Zero) continue; + var reagent = _prototypeManager.Index(reagentQuantity.ReagentId); + contents.TryRemoveReagent(reagentQuantity.ReagentId, reagent.ReactionTile(tile, (reagentQuantity.Quantity / _transferAmount) * 0.25f)); } } - if (contents.CurrentVolume == 0) + // Check if we've reached our target. + if(!_reached && _target.TryDistance(Owner.EntityManager, Owner.Transform.Coordinates, out var distance) && distance <= 0.5f) + { + _reached = true; + + if (Owner.TryGetComponent(out ICollidableComponent coll)) + { + var controller = coll.EnsureController(); + controller.Stop(); + } + } + + if (contents.CurrentVolume == 0 || _timer > _aliveTime) { // Delete this Owner.Delete(); @@ -111,6 +139,16 @@ namespace Content.Server.GameObjects.Components.Chemistry void ICollideBehavior.CollideWith(IEntity collidedWith) { + if (!Owner.TryGetComponent(out SolutionContainerComponent contents)) + return; + + foreach (var reagentQuantity in contents.ReagentList.ToArray()) + { + if (reagentQuantity.Quantity == ReagentUnit.Zero) continue; + var reagent = _prototypeManager.Index(reagentQuantity.ReagentId); + contents.TryRemoveReagent(reagentQuantity.ReagentId, reagent.ReactionEntity(collidedWith, ReactionMethod.Touch, reagentQuantity.Quantity * 0.125f)); + } + // Check for collision with a impassable object (e.g. wall) and stop if (collidedWith.TryGetComponent(out ICollidableComponent collidable)) { @@ -121,6 +159,8 @@ namespace Content.Server.GameObjects.Components.Chemistry var controller = coll.EnsureController(); controller.Stop(); } + + Owner.Delete(); } } } diff --git a/Content.Server/GameObjects/Components/Fluids/PuddleComponent.cs b/Content.Server/GameObjects/Components/Fluids/PuddleComponent.cs index 4ec98b6b43..a2ed029f44 100644 --- a/Content.Server/GameObjects/Components/Fluids/PuddleComponent.cs +++ b/Content.Server/GameObjects/Components/Fluids/PuddleComponent.cs @@ -164,6 +164,16 @@ namespace Content.Server.GameObjects.Components.Fluids } } + /// + /// Whether adding this solution to this puddle would overflow. + /// + /// + /// + public bool WouldOverflow(Solution solution) + { + return (CurrentVolume + solution.TotalVolume > _overflowVolume); + } + // Flow rate should probably be controlled globally so this is it for now internal bool TryAddSolution(Solution solution, bool sound = true, bool checkForEvaporate = true, bool checkForOverflow = true) { diff --git a/Content.Server/GameObjects/Components/Fluids/SpillExtensions.cs b/Content.Server/GameObjects/Components/Fluids/SpillExtensions.cs index e8b8f9c24f..b3645d821a 100644 --- a/Content.Server/GameObjects/Components/Fluids/SpillExtensions.cs +++ b/Content.Server/GameObjects/Components/Fluids/SpillExtensions.cs @@ -1,6 +1,9 @@ #nullable enable using System.Diagnostics.CodeAnalysis; +using Content.Server.Utility; using Content.Shared.Chemistry; +using Content.Shared.GameObjects; +using Robust.Server.GameObjects.EntitySystems.TileLookup; using Robust.Server.Interfaces.GameObjects; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Map; @@ -125,5 +128,78 @@ namespace Content.Server.GameObjects.Components.Fluids puddle = solution.SpillAt(coordinates, prototype, sound); return puddle != null; } + + public static bool TryGetPuddle(this TileRef tileRef, GridTileLookupSystem? gridTileLookupSystem, [NotNullWhen(true)] out PuddleComponent? puddle) + { + foreach (var entity in tileRef.GetEntitiesInTileFast(gridTileLookupSystem)) + { + if (entity.TryGetComponent(out PuddleComponent? p)) + { + puddle = p; + return true; + } + } + + puddle = null; + return false; + } + + public static PuddleComponent? SpillAt(this TileRef tileRef, Solution solution, string prototype, bool overflow = true, bool sound = true) + { + if (solution.TotalVolume <= 0) + { + return null; + } + + var mapManager = IoCManager.Resolve(); + var entityManager = IoCManager.Resolve(); + var serverEntityManager = IoCManager.Resolve(); + + var gridId = tileRef.GridIndex; + + // If space return early, let that spill go out into the void + if (tileRef.Tile.IsEmpty) + { + return null; + } + + PuddleComponent? puddle = null; + + // Get normalized co-ordinate for spill location and spill it in the centre + // TODO: Does SnapGrid or something else already do this? + var spillTileMapGrid = mapManager.GetGrid(gridId); + var spillGridCoords = spillTileMapGrid.GridTileToLocal(tileRef.GridIndices); + + var spilt = false; + + foreach (var spillEntity in entityManager.GetEntitiesAt(spillTileMapGrid.ParentMapId, spillGridCoords.Position)) + { + if (!spillEntity.TryGetComponent(out PuddleComponent? puddleComponent)) + continue; + + if (!overflow && puddleComponent.WouldOverflow(solution)) + return null; + + if (!puddleComponent.TryAddSolution(solution, sound)) + continue; + + puddle = puddleComponent; + spilt = true; + break; + } + + // Did we add to an existing puddle + if (spilt) + { + return puddle; + } + + var puddleEnt = serverEntityManager.SpawnEntity(prototype, spillGridCoords); + puddle = puddleEnt.GetComponent(); + + puddle.TryAddSolution(solution, sound); + + return puddle; + } } } diff --git a/Content.Server/GameObjects/Components/Fluids/SprayComponent.cs b/Content.Server/GameObjects/Components/Fluids/SprayComponent.cs index 234e6c4848..644149c31e 100644 --- a/Content.Server/GameObjects/Components/Fluids/SprayComponent.cs +++ b/Content.Server/GameObjects/Components/Fluids/SprayComponent.cs @@ -1,29 +1,51 @@ -using Content.Server.GameObjects.Components.Chemistry; +using System; +using Content.Server.GameObjects.Components.Chemistry; +using Content.Shared.Audio; using Content.Shared.Chemistry; +using Content.Shared.GameObjects.Components; +using Content.Shared.GameObjects.Components.Fluids; +using Content.Shared.GameObjects.Components.Items; +using Content.Shared.GameObjects.EntitySystems; using Content.Shared.Interfaces; using Content.Shared.Interfaces.GameObjects.Components; +using Robust.Server.GameObjects; using Robust.Server.GameObjects.EntitySystems; using Robust.Server.Interfaces.GameObjects; +using Robust.Shared.Audio; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Systems; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Timing; using Robust.Shared.IoC; using Robust.Shared.Localization; using Robust.Shared.Log; +using Robust.Shared.Map; +using Robust.Shared.Maths; using Robust.Shared.Serialization; using Robust.Shared.ViewVariables; namespace Content.Server.GameObjects.Components.Fluids { [RegisterComponent] - class SprayComponent : Component, IAfterInteract + class SprayComponent : SharedSprayComponent, IAfterInteract, IUse, IActivate { - [Dependency] private readonly IServerEntityManager _serverEntityManager = default!; + public const float SprayDistance = 3f; - public override string Name => "Spray"; + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly IServerEntityManager _serverEntityManager = default!; private ReagentUnit _transferAmount; private string _spraySound; private float _sprayVelocity; + private float _sprayAliveTime; + private TimeSpan _lastUseTime; + private TimeSpan _cooldownEnd; + private float _cooldownTime; + private string _vaporPrototype; + private int _vaporAmount; + private float _vaporSpread; + private bool _hasSafety; + private bool _safety; /// /// The amount of solution to be sprayer from this solution when using it @@ -56,24 +78,50 @@ namespace Content.Server.GameObjects.Components.Fluids Logger.Warning( $"Entity {Owner.Name} at {Owner.Transform.MapPosition} didn't have a {nameof(SolutionContainerComponent)}"); } + + if (_hasSafety) + { + SetSafety(Owner, _safety); + } } public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); + serializer.DataField(ref _vaporPrototype, "sprayedPrototype", "Vapor"); + serializer.DataField(ref _vaporAmount, "vaporAmount", 1); + serializer.DataField(ref _vaporSpread, "vaporSpread", 90f); + serializer.DataField(ref _cooldownTime, "cooldownTime", 0.5f); serializer.DataField(ref _transferAmount, "transferAmount", ReagentUnit.New(10)); - serializer.DataField(ref _sprayVelocity, "sprayVelocity", 5.0f); + serializer.DataField(ref _sprayVelocity, "sprayVelocity", 1.5f); serializer.DataField(ref _spraySound, "spraySound", string.Empty); + serializer.DataField(ref _sprayAliveTime, "sprayAliveTime", 0.75f); + serializer.DataField(ref _hasSafety, "hasSafety", false); + serializer.DataField(ref _safety, "safety", true); } void IAfterInteract.AfterInteract(AfterInteractEventArgs eventArgs) { + if (!ActionBlockerSystem.CanInteract(eventArgs.User)) + return; + + if (_hasSafety && _safety) + { + Owner.PopupMessage(eventArgs.User, Loc.GetString("Its safety is on!")); + return; + } + if (CurrentVolume <= 0) { Owner.PopupMessage(eventArgs.User, Loc.GetString("It's empty!")); return; } + var curTime = _gameTiming.CurTime; + + if(curTime < _cooldownEnd) + return; + var playerPos = eventArgs.User.Transform.Coordinates; if (eventArgs.ClickLocation.GetGridId(_serverEntityManager) != playerPos.GetGridId(_serverEntityManager)) return; @@ -82,18 +130,86 @@ namespace Content.Server.GameObjects.Components.Fluids return; var direction = (eventArgs.ClickLocation.Position - playerPos.Position).Normalized; - var solution = contents.SplitSolution(_transferAmount); + var threeQuarters = direction * 0.75f; + var quarter = direction * 0.25f; - playerPos = playerPos.Offset(direction); // Move a bit so we don't hit the player - //TODO: check for wall? - var vapor = _serverEntityManager.SpawnEntity("Vapor", playerPos); - // Add the solution to the vapor and actually send the thing - var vaporComponent = vapor.GetComponent(); - vaporComponent.TryAddSolution(solution); - vaporComponent.Start(direction, _sprayVelocity); //TODO: maybe make the velocity depending on the distance to the click + var amount = Math.Max(Math.Min((contents.CurrentVolume / _transferAmount).Int(), _vaporAmount), 1); + + var spread = _vaporSpread / amount; + + for (var i = 0; i < amount; i++) + { + var rotation = new Angle(direction.ToAngle() + Angle.FromDegrees(spread * i) - Angle.FromDegrees(spread * (amount-1)/2)); + + var (_, diffPos) = eventArgs.ClickLocation - playerPos; + var diffNorm = diffPos.Normalized; + var diffLength = diffPos.Length; + + var target = eventArgs.User.Transform.Coordinates.Offset((diffNorm + rotation.ToVec()).Normalized * diffLength + quarter); + + if (target.TryDistance(Owner.EntityManager, playerPos, out var distance) && distance > SprayDistance) + target = eventArgs.User.Transform.Coordinates.Offset(diffNorm * SprayDistance); + + var solution = contents.SplitSolution(_transferAmount); + + if (solution.TotalVolume <= ReagentUnit.Zero) + break; + + var vapor = _serverEntityManager.SpawnEntity(_vaporPrototype, playerPos.Offset(distance < 1 ? quarter : threeQuarters)); + vapor.Transform.LocalRotation = rotation; + + if (vapor.TryGetComponent(out AppearanceComponent appearance)) // Vapor sprite should face down. + { + appearance.SetData(VaporVisuals.Rotation, -Angle.South + rotation); + appearance.SetData(VaporVisuals.Color, contents.SubstanceColor.WithAlpha(1f)); + appearance.SetData(VaporVisuals.State, true); + } + + // Add the solution to the vapor and actually send the thing + var vaporComponent = vapor.GetComponent(); + vaporComponent.TryAddSolution(solution); + + vaporComponent.Start(rotation.ToVec(), _sprayVelocity, target, _sprayAliveTime); + } //Play sound - EntitySystem.Get().PlayFromEntity(_spraySound, Owner); + EntitySystem.Get().PlayFromEntity(_spraySound, Owner, AudioHelpers.WithVariation(0.125f)); + + _lastUseTime = curTime; + _cooldownEnd = _lastUseTime + TimeSpan.FromSeconds(_cooldownTime); + + if (Owner.TryGetComponent(out ItemCooldownComponent cooldown)) + { + cooldown.CooldownStart = _lastUseTime; + cooldown.CooldownEnd = _cooldownEnd; + } + } + + public bool UseEntity(UseEntityEventArgs eventArgs) + { + ToggleSafety(eventArgs.User); + return true; + } + + public void Activate(ActivateEventArgs eventArgs) + { + ToggleSafety(eventArgs.User); + } + + private void ToggleSafety(IEntity user) + { + SetSafety(user, !_safety); + } + + private void SetSafety(IEntity user, bool state) + { + if (!ActionBlockerSystem.CanInteract(user) || !_hasSafety) + return; + + _safety = state; + + if(Owner.TryGetComponent(out AppearanceComponent appearance)) + appearance.SetData(SprayVisuals.Safety, _safety); } } } diff --git a/Content.Server/GameObjects/Components/Mobs/StunnableComponent.cs b/Content.Server/GameObjects/Components/Mobs/StunnableComponent.cs index 2e19baa7a1..5b23d16e9c 100644 --- a/Content.Server/GameObjects/Components/Mobs/StunnableComponent.cs +++ b/Content.Server/GameObjects/Components/Mobs/StunnableComponent.cs @@ -1,11 +1,15 @@ using Content.Server.GameObjects.EntitySystems; +using Content.Shared.Chemistry; using Content.Shared.GameObjects.Components.Mobs; using Content.Shared.GameObjects.Components.Movement; +using Content.Shared.Interfaces.GameObjects.Components; +using NFluidsynth; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Systems; using Robust.Shared.Interfaces.Timing; using Robust.Shared.IoC; using Robust.Shared.Timers; +using Logger = Robust.Shared.Log.Logger; namespace Content.Server.GameObjects.Components.Mobs { diff --git a/Content.Server/GameObjects/Components/Movement/SlipperyComponent.cs b/Content.Server/GameObjects/Components/Movement/SlipperyComponent.cs index 8a1247d4d9..54d99cc895 100644 --- a/Content.Server/GameObjects/Components/Movement/SlipperyComponent.cs +++ b/Content.Server/GameObjects/Components/Movement/SlipperyComponent.cs @@ -12,12 +12,81 @@ namespace Content.Server.GameObjects.Components.Movement [ComponentReference(typeof(SharedSlipperyComponent))] public class SlipperyComponent : SharedSlipperyComponent { + private float _paralyzeTime = 2f; + private float _intersectPercentage = 0.3f; + private float _requiredSlipSpeed = 0f; + private bool _slippery; + private float _launchForwardsMultiplier = 1f; + /// /// Path to the sound to be played when a mob slips. /// [ViewVariables] private string SlipSound { get; set; } = "/Audio/Effects/slip.ogg"; + /// + /// How many seconds the mob will be paralyzed for. + /// + [ViewVariables(VVAccess.ReadWrite)] + public override float ParalyzeTime + { + get => _paralyzeTime; + set + { + _paralyzeTime = value; + Dirty(); + } + } + + /// + /// Percentage of shape intersection for a slip to occur. + /// + [ViewVariables(VVAccess.ReadWrite)] + public override float IntersectPercentage + { + get => _intersectPercentage; + set + { + _intersectPercentage = value; + Dirty(); + } + } + + /// + /// Entities will only be slipped if their speed exceeds this limit. + /// + [ViewVariables(VVAccess.ReadWrite)] + public override float RequiredSlipSpeed + { + get => _requiredSlipSpeed; + set + { + _requiredSlipSpeed = value; + Dirty(); + } + } + + /// + /// Whether or not this component will try to slip entities. + /// + [ViewVariables(VVAccess.ReadWrite)] + public override bool Slippery + { + get => _slippery; + set + { + _slippery = value; + Dirty(); + } + } + + [ViewVariables(VVAccess.ReadWrite)] + public override float LaunchForwardsMultiplier + { + get => _launchForwardsMultiplier; + set => _launchForwardsMultiplier = value; + } + public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); @@ -33,5 +102,10 @@ namespace Content.Server.GameObjects.Components.Movement .PlayFromEntity(SlipSound, Owner, AudioHelpers.WithVariation(0.2f)); } } + + public override ComponentState GetComponentState() + { + return new SlipperyComponentState(_paralyzeTime, _intersectPercentage, _requiredSlipSpeed, _launchForwardsMultiplier, _slippery); + } } } diff --git a/Content.Server/GameObjects/EntitySystems/GasVaporSystem.cs b/Content.Server/GameObjects/EntitySystems/GasVaporSystem.cs deleted file mode 100644 index a12600f634..0000000000 --- a/Content.Server/GameObjects/EntitySystems/GasVaporSystem.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Content.Server.Atmos; -using Robust.Shared.GameObjects.Systems; - -namespace Content.Server.GameObjects.EntitySystems -{ - public class GasVaporSystem : EntitySystem - { - /// - public override void Update(float frameTime) - { - foreach (var GasVapor in ComponentManager.EntityQuery()) - { - if (GasVapor.Initialized) - { - GasVapor.Update(frameTime); - } - } - } - } -} diff --git a/Content.Server/GameObjects/EntitySystems/VaporSystem.cs b/Content.Server/GameObjects/EntitySystems/VaporSystem.cs index c3e3b2ec5b..caaddaaff2 100644 --- a/Content.Server/GameObjects/EntitySystems/VaporSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/VaporSystem.cs @@ -10,7 +10,7 @@ namespace Content.Server.GameObjects.EntitySystems { foreach (var vaporComp in ComponentManager.EntityQuery()) { - vaporComp.Update(); + vaporComp.Update(frameTime); } } } diff --git a/Content.Shared/Chemistry/ReagentPrototype.cs b/Content.Shared/Chemistry/ReagentPrototype.cs index cb8b639242..b68c4975e7 100644 --- a/Content.Shared/Chemistry/ReagentPrototype.cs +++ b/Content.Shared/Chemistry/ReagentPrototype.cs @@ -2,7 +2,10 @@ using System.Collections.Generic; using Content.Shared.Interfaces; using Content.Shared.Interfaces.Chemistry; +using Content.Shared.Interfaces.GameObjects.Components; +using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.IoC; +using Robust.Shared.Map; using Robust.Shared.Maths; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; @@ -13,8 +16,6 @@ namespace Content.Shared.Chemistry [Prototype("reagent")] public class ReagentPrototype : IPrototype, IIndexedPrototype { - private const float CelsiusToKelvin = 273.15f; - [Dependency] private readonly IModuleManager _moduleManager = default!; private string _id; @@ -24,6 +25,7 @@ namespace Content.Shared.Chemistry private Color _substanceColor; private List _metabolism; private string _spritePath; + private List _tileReactions; public string ID => _id; public string Name => _name; @@ -33,6 +35,7 @@ namespace Content.Shared.Chemistry //List of metabolism effects this reagent has, should really only be used server-side. public List Metabolism => _metabolism; + public List TileReactions => _tileReactions; public string SpriteReplacementPath => _spritePath; public ReagentPrototype() @@ -54,10 +57,12 @@ namespace Content.Shared.Chemistry if (_moduleManager.IsServerModule) { serializer.DataField(ref _metabolism, "metabolism", new List { new DefaultMetabolizable() }); + serializer.DataField(ref _tileReactions, "tileReactions", new List { }); } else { _metabolism = new List { new DefaultMetabolizable() }; + _tileReactions = new List(); } } @@ -78,5 +83,55 @@ namespace Content.Shared.Chemistry return SubstanceColor; } + + public ReagentUnit ReactionEntity(IEntity entity, ReactionMethod method, ReagentUnit reactVolume) + { + var removed = ReagentUnit.Zero; + + foreach (var react in entity.GetAllComponents()) + { + switch (method) + { + case ReactionMethod.Touch: + removed += react.ReagentReactTouch(this, reactVolume); + break; + case ReactionMethod.Ingestion: + removed += react.ReagentReactIngestion(this, reactVolume); + break; + case ReactionMethod.Injection: + removed += react.ReagentReactInjection(this, reactVolume); + break; + } + + if (removed > reactVolume) + throw new Exception("Removed more than we have!"); + + if (removed == reactVolume) + break; + } + + return removed; + } + + public ReagentUnit ReactionTile(TileRef tile, ReagentUnit reactVolume) + { + var removed = ReagentUnit.Zero; + + if (tile.Tile.IsEmpty) + return removed; + + foreach (var reaction in _tileReactions) + { + removed += reaction.TileReact(tile, this, reactVolume - removed); + + if (removed > reactVolume) + throw new Exception("Removed more than we have!"); + + if (removed == reactVolume) + break; + } + + return removed; + } } } diff --git a/Content.Shared/Chemistry/ReagentUnit.cs b/Content.Shared/Chemistry/ReagentUnit.cs index ec2d6adb60..bf1d86e437 100644 --- a/Content.Shared/Chemistry/ReagentUnit.cs +++ b/Content.Shared/Chemistry/ReagentUnit.cs @@ -110,14 +110,24 @@ namespace Content.Shared.Chemistry return a.ShiftDown() >= b; } + public static bool operator <(ReagentUnit a, int b) + { + return a.ShiftDown() < b; + } + + public static bool operator >(ReagentUnit a, int b) + { + return a.ShiftDown() > b; + } + public static bool operator ==(ReagentUnit a, int b) { - return a.ShiftDown() == b; + return a.Int() == b; } public static bool operator !=(ReagentUnit a, int b) { - return a.ShiftDown() != b; + return a.Int() != b; } public static bool operator ==(ReagentUnit a, ReagentUnit b) diff --git a/Content.Shared/GameObjects/Atmos/SharedPumpComponent.cs b/Content.Shared/GameObjects/Components/Atmos/SharedPumpComponent.cs similarity index 90% rename from Content.Shared/GameObjects/Atmos/SharedPumpComponent.cs rename to Content.Shared/GameObjects/Components/Atmos/SharedPumpComponent.cs index fe16525766..20e9c2dfb9 100644 --- a/Content.Shared/GameObjects/Atmos/SharedPumpComponent.cs +++ b/Content.Shared/GameObjects/Components/Atmos/SharedPumpComponent.cs @@ -1,8 +1,7 @@ using System; -using Content.Shared.GameObjects.Components.Atmos; using Robust.Shared.Serialization; -namespace Content.Shared.GameObjects.Atmos +namespace Content.Shared.GameObjects.Components.Atmos { [Serializable, NetSerializable] public enum PumpVisuals diff --git a/Content.Shared/GameObjects/Atmos/SharedSiphonComponent.cs b/Content.Shared/GameObjects/Components/Atmos/SharedSiphonComponent.cs similarity index 76% rename from Content.Shared/GameObjects/Atmos/SharedSiphonComponent.cs rename to Content.Shared/GameObjects/Components/Atmos/SharedSiphonComponent.cs index 39be0e6ca7..169e887c0b 100644 --- a/Content.Shared/GameObjects/Atmos/SharedSiphonComponent.cs +++ b/Content.Shared/GameObjects/Components/Atmos/SharedSiphonComponent.cs @@ -1,7 +1,7 @@ -using Robust.Shared.Serialization; -using System; +using System; +using Robust.Shared.Serialization; -namespace Content.Shared.GameObjects.Atmos +namespace Content.Shared.GameObjects.Components.Atmos { [Serializable, NetSerializable] public enum SiphonVisuals diff --git a/Content.Shared/GameObjects/Atmos/SharedVentComponent.cs b/Content.Shared/GameObjects/Components/Atmos/SharedVentComponent.cs similarity index 75% rename from Content.Shared/GameObjects/Atmos/SharedVentComponent.cs rename to Content.Shared/GameObjects/Components/Atmos/SharedVentComponent.cs index 03c7d9d320..fdd4616aa9 100644 --- a/Content.Shared/GameObjects/Atmos/SharedVentComponent.cs +++ b/Content.Shared/GameObjects/Components/Atmos/SharedVentComponent.cs @@ -1,7 +1,7 @@ -using Robust.Shared.Serialization; -using System; +using System; +using Robust.Shared.Serialization; -namespace Content.Shared.GameObjects.Atmos +namespace Content.Shared.GameObjects.Components.Atmos { [Serializable, NetSerializable] public enum VentVisuals diff --git a/Content.Shared/GameObjects/Components/Fluids/SharedSprayComponent.cs b/Content.Shared/GameObjects/Components/Fluids/SharedSprayComponent.cs new file mode 100644 index 0000000000..6ae862912b --- /dev/null +++ b/Content.Shared/GameObjects/Components/Fluids/SharedSprayComponent.cs @@ -0,0 +1,17 @@ +using System; +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization; + +namespace Content.Shared.GameObjects.Components.Fluids +{ + public class SharedSprayComponent : Component + { + public override string Name => "Spray"; + } + + [Serializable, NetSerializable] + public enum SprayVisuals + { + Safety, + } +} diff --git a/Content.Shared/GameObjects/Components/Mobs/SharedStunnableComponent.cs b/Content.Shared/GameObjects/Components/Mobs/SharedStunnableComponent.cs index cfa2268d2b..79ca4dd46c 100644 --- a/Content.Shared/GameObjects/Components/Mobs/SharedStunnableComponent.cs +++ b/Content.Shared/GameObjects/Components/Mobs/SharedStunnableComponent.cs @@ -29,8 +29,6 @@ namespace Content.Shared.GameObjects.Components.Mobs : _gameTiming.CurTime + (TimeSpan.FromSeconds(Math.Max(StunnedTimer, Math.Max(KnockdownTimer, SlowdownTimer)))); - private const int StunLevels = 8; - private bool _canHelp = true; protected float _stunCap = 20f; protected float _knockdownCap = 20f; diff --git a/Content.Shared/GameObjects/Components/Movement/SharedSlipperyComponent.cs b/Content.Shared/GameObjects/Components/Movement/SharedSlipperyComponent.cs index 36bf78b73a..5f6edd505f 100644 --- a/Content.Shared/GameObjects/Components/Movement/SharedSlipperyComponent.cs +++ b/Content.Shared/GameObjects/Components/Movement/SharedSlipperyComponent.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using Content.Shared.GameObjects.Components.Mobs; using Content.Shared.GameObjects.EntitySystems; @@ -29,25 +30,31 @@ namespace Content.Shared.GameObjects.Components.Movement /// How many seconds the mob will be paralyzed for. /// [ViewVariables(VVAccess.ReadWrite)] - private float ParalyzeTime { get; set; } = 3f; + public virtual float ParalyzeTime { get; set; } = 2f; /// /// Percentage of shape intersection for a slip to occur. /// [ViewVariables(VVAccess.ReadWrite)] - private float IntersectPercentage { get; set; } = 0.3f; + public virtual float IntersectPercentage { get; set; } = 0.3f; /// /// Entities will only be slipped if their speed exceeds this limit. /// [ViewVariables(VVAccess.ReadWrite)] - private float RequiredSlipSpeed { get; set; } = 0f; + public virtual float RequiredSlipSpeed { get; set; } = 0f; + + /// + /// The entity's speed will be multiplied by this to slip it forwards. + /// + [ViewVariables(VVAccess.ReadWrite)] + public virtual float LaunchForwardsMultiplier { get; set; } = 1f; /// /// Whether or not this component will try to slip entities. /// [ViewVariables(VVAccess.ReadWrite)] - public bool Slippery { get; set; } + public virtual bool Slippery { get; set; } private bool TrySlip(IEntity entity) { @@ -81,7 +88,7 @@ namespace Content.Shared.GameObjects.Components.Movement if (entity.TryGetComponent(out ICollidableComponent collidable)) { var controller = collidable.EnsureController(); - controller.LinearVelocity = collidable.LinearVelocity; + controller.LinearVelocity = collidable.LinearVelocity * LaunchForwardsMultiplier; } stun.Paralyze(5); @@ -140,10 +147,30 @@ namespace Content.Shared.GameObjects.Components.Movement { base.ExposeData(serializer); - serializer.DataField(this, x => ParalyzeTime, "paralyzeTime", 3f); - serializer.DataField(this, x => IntersectPercentage, "intersectPercentage", 0.3f); - serializer.DataField(this, x => RequiredSlipSpeed, "requiredSlipSpeed", 0f); + serializer.DataField(this, x => x.ParalyzeTime, "paralyzeTime", 3f); + serializer.DataField(this, x => x.IntersectPercentage, "intersectPercentage", 0.3f); + serializer.DataField(this, x => x.RequiredSlipSpeed, "requiredSlipSpeed", 0f); + serializer.DataField(this, x => x.LaunchForwardsMultiplier, "launchForwardsMultiplier", 1f); serializer.DataField(this, x => x.Slippery, "slippery", true); } } + + [Serializable, NetSerializable] + public class SlipperyComponentState : ComponentState + { + public float ParalyzeTime { get; } + public float IntersectPercentage { get; } + public float RequiredSlipSpeed { get; } + public float LaunchForwardsMultiplier { get; } + public bool Slippery { get; } + + public SlipperyComponentState(float paralyzeTime, float intersectPercentage, float requiredSlipSpeed, float launchForwardsMultiplier, bool slippery) : base(ContentNetIDs.SLIP) + { + ParalyzeTime = paralyzeTime; + IntersectPercentage = intersectPercentage; + RequiredSlipSpeed = requiredSlipSpeed; + LaunchForwardsMultiplier = launchForwardsMultiplier; + Slippery = slippery; + } + } } diff --git a/Content.Shared/GameObjects/Components/SharedGasSprayerComponent.cs b/Content.Shared/GameObjects/Components/SharedGasSprayerComponent.cs deleted file mode 100644 index a15f92882c..0000000000 --- a/Content.Shared/GameObjects/Components/SharedGasSprayerComponent.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using Robust.Shared.GameObjects; -using Robust.Shared.Serialization; - -namespace Content.Shared.GameObjects.Components -{ - public class SharedGasSprayerComponent : Component - { - public sealed override string Name => "GasSprayer"; - } - - [Serializable, NetSerializable] - public enum ExtinguisherVisuals - { - Rotation - } -} diff --git a/Content.Shared/GameObjects/Components/SharedVaporComponent.cs b/Content.Shared/GameObjects/Components/SharedVaporComponent.cs new file mode 100644 index 0000000000..a3826e6894 --- /dev/null +++ b/Content.Shared/GameObjects/Components/SharedVaporComponent.cs @@ -0,0 +1,20 @@ +using System; +using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Serialization; + +namespace Content.Shared.GameObjects.Components +{ + public class SharedVaporComponent : Component + { + public override string Name => "Vapor"; + } + + [Serializable, NetSerializable] + public enum VaporVisuals + { + Rotation, + Color, + State, + } +} diff --git a/Content.Shared/GameObjects/ContentNetIDs.cs b/Content.Shared/GameObjects/ContentNetIDs.cs index 6210936e41..7ae6ce8c27 100644 --- a/Content.Shared/GameObjects/ContentNetIDs.cs +++ b/Content.Shared/GameObjects/ContentNetIDs.cs @@ -74,6 +74,7 @@ public const uint SUSPICION_ROLE = 1068; public const uint ROTATION = 1069; public const uint MOB_STATE_MANAGER = 1070; + public const uint SLIP = 1071; // Net IDs for integration tests. public const uint PREDICTION_TEST = 10001; diff --git a/Content.Shared/Interfaces/Chemistry/ITileReaction.cs b/Content.Shared/Interfaces/Chemistry/ITileReaction.cs new file mode 100644 index 0000000000..ae584642b1 --- /dev/null +++ b/Content.Shared/Interfaces/Chemistry/ITileReaction.cs @@ -0,0 +1,11 @@ +using Content.Shared.Chemistry; +using Robust.Shared.Interfaces.Serialization; +using Robust.Shared.Map; + +namespace Content.Shared.Interfaces.Chemistry +{ + public interface ITileReaction : IExposeData + { + ReagentUnit TileReact(TileRef tile, ReagentPrototype reagent, ReagentUnit reactVolume); + } +} diff --git a/Content.Shared/Interfaces/GameObjects/Components/Interaction/IReagentReaction.cs b/Content.Shared/Interfaces/GameObjects/Components/Interaction/IReagentReaction.cs new file mode 100644 index 0000000000..5242681767 --- /dev/null +++ b/Content.Shared/Interfaces/GameObjects/Components/Interaction/IReagentReaction.cs @@ -0,0 +1,18 @@ +using Content.Shared.Chemistry; + +namespace Content.Shared.Interfaces.GameObjects.Components +{ + public enum ReactionMethod + { + Touch, + Injection, + Ingestion, + } + + public interface IReagentReaction + { + ReagentUnit ReagentReactTouch(ReagentPrototype reagent, ReagentUnit volume) => ReagentUnit.Zero; + ReagentUnit ReagentReactInjection(ReagentPrototype reagent, ReagentUnit volume) => ReagentUnit.Zero; + ReagentUnit ReagentReactIngestion(ReagentPrototype reagent, ReagentUnit volume) => ReagentUnit.Zero; + } +} diff --git a/Content.Shared/Physics/GasVaporController.cs b/Content.Shared/Physics/GasVaporController.cs deleted file mode 100644 index ca544c47de..0000000000 --- a/Content.Shared/Physics/GasVaporController.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Robust.Shared.Maths; -using Robust.Shared.Physics; - -namespace Content.Shared.Physics -{ - public class GasVaporController : VirtualController - { - public void Move(Vector2 velocityDirection, float speed) - { - LinearVelocity = velocityDirection * speed; - } - } -} diff --git a/Resources/Audio/Effects/extinguish.ogg b/Resources/Audio/Effects/extinguish.ogg new file mode 100644 index 0000000000000000000000000000000000000000..614402333537ff6b1815cc1821f240f6340eac4a GIT binary patch literal 15356 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 literal 0 HcmV?d00001 diff --git a/Resources/Audio/Effects/spray2.ogg b/Resources/Audio/Effects/spray2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d184d76bd00cbb89538b1c6953f65c461caadc63 GIT binary patch literal 26164 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%0Ajbqs{u=*4wa-n-#&fPXOfjA)K1d!vGa) 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 UrNdkwxR_wB_lwyE%0#=S1mcF=;Q#;t literal 0 HcmV?d00001 diff --git a/Resources/Prototypes/Entities/Objects/Consumable/food.yml b/Resources/Prototypes/Entities/Objects/Consumable/food.yml index 262c7e2770..8f9755ceb2 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/food.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/food.yml @@ -5,6 +5,8 @@ components: - type: Food - type: LoopingSound + - type: SolutionContainer + caps: NoExamine - type: Sprite state: icon netsync: false diff --git a/Resources/Prototypes/Entities/Objects/Misc/extinguisher_spray.yml b/Resources/Prototypes/Entities/Objects/Misc/extinguisher_spray.yml deleted file mode 100644 index da84fe7e02..0000000000 --- a/Resources/Prototypes/Entities/Objects/Misc/extinguisher_spray.yml +++ /dev/null @@ -1,28 +0,0 @@ -- type: entity - name: Extinguisher Spray - id: ExtinguisherSpray - description: Extinguisher Spray - components: - - type: Sprite - sprite: Effects/extinguisherSpray.rsi - layers: - - state: extinguish - - type: Icon - sprite: Effects/extinguisherSpray.rsi - state: extinguish - - type: GasVapor - dissipationInterval: 1 - gas: WaterVapor - gasVolume: 200 - gasTemperature: 293.15 - gasAmount: 20 - - type: Physics - - type: Collidable - shapes: - - !type:PhysShapeAabb - bounds: "-0.25,-0.25,0.25,0.25" - mask: - - Impassable - - type: Appearance - visuals: - - type: ExtinguisherVisualizer diff --git a/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml b/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml index 493e448846..78b20f0e77 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml @@ -7,24 +7,63 @@ - type: Sprite sprite: Objects/Misc/fire_extinguisher.rsi layers: - - state: fire_extinguisher_open + - state: fire_extinguisher_closed + map: [ "enum.SprayVisualLayers.Base" ] - type: Icon sprite: Objects/Misc/fire_extinguisher.rsi - state: fire_extinguisher_open + state: fire_extinguisher_closed - type: Item sprite: Objects/Misc/fire_extinguisher.rsi size: 10 - type: SolutionContainer - maxVol: 1000 + maxVol: 100 caps: AddTo, RemoveFrom, NoExamine contents: reagents: - ReagentId: chem.H2O - Quantity: 1000 - - type: GasSprayer - spraySound: /Audio/Effects/spray.ogg - sprayType: ExtinguisherSpray - fuelType: chem.H2O - fuelName: water - fuelCost: 50 + Quantity: 100 + - type: ItemCooldown + - type: Spray + spraySound: /Audio/Effects/extinguish.ogg + sprayedPrototype: ExtinguisherSpray + hasSafety: true + vaporAmount: 3 + vaporSpread: 90 + sprayVelocity: 2.0 + sprayTimeAlive: 1.5 + transferAmount: 5 - type: FireExtinguisher + - type: Appearance + visuals: + - type: SprayVisualizer + safety_on_state: fire_extinguisher_closed + safety_off_state: fire_extinguisher_open + +- type: entity + name: extinguisher spray + id: ExtinguisherSpray + parent: Vapor + abstract: true + components: + - type: Sprite + sprite: Effects/extinguisherSpray.rsi + layers: + - state: extinguish + map: [ "enum.VaporVisualLayers.Base" ] + - type: Icon + sprite: Effects/extinguisherSpray.rsi + state: extinguish + - type: Collidable + hard: false + shapes: + - !type:PhysShapeAabb + bounds: "-0.25,-0.25,0.25,0.25" + mask: + - Impassable + - MobImpassable + - SmallImpassable + - type: Appearance + visuals: + - type: VaporVisualizer + animation_delay: 0.8 + animation_state: extinguish diff --git a/Resources/Prototypes/Entities/Objects/Specific/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/janitor.yml index 0a7dffcd5a..61d57d1045 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/janitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/janitor.yml @@ -180,10 +180,44 @@ - type: Slippery paralyzeTime: 7 +- type: entity + id: Vapor + name: "vapor" + abstract: true + components: + - type: SnapGrid + offset: Center + - type: SolutionContainer + maxVol: 50 + - type: Vapor + - type: AnimationPlayer + - type: Sprite + sprite: Effects/chempuff.rsi + layers: + - state: chempuff + map: [ "enum.VaporVisualLayers.Base" ] + - type: Icon + sprite: Effects/chempuff.rsi + state: chempuff + - type: Physics + - type: Collidable + hard: false + shapes: + - !type:PhysShapeAabb + bounds: "-0.25,-0.25,0.25,0.25" + mask: + - Impassable + - MobImpassable + - SmallImpassable + - type: Appearance + visuals: + - type: VaporVisualizer + - type: entity name: spray bottle id: SprayBottle parent: BaseItem + suffix: Empty description: A spray bottle with an unscrewable top. components: - type: Sprite @@ -196,7 +230,37 @@ - type: Pourable transferAmount: 5.0 - type: Spillable + - type: ItemCooldown - type: Spray transferAmount: 10 - sprayVelocity: 5 - spraySound: /Audio/Effects/spray.ogg + sprayVelocity: 2 + spraySound: /Audio/Effects/spray2.ogg + +- type: entity + name: spray bottle + id: SprayBottleWater + suffix: Filled + parent: SprayBottle + components: + - type: SolutionContainer + maxVol: 100 + caps: AddTo, RemoveFrom + contents: + reagents: + - ReagentId: chem.H2O + Quantity: 100 + +- type: entity + name: space cleaner + description: BLAM!-brand non-foaming space cleaner! + id: SprayBottleSpaceCleaner + parent: SprayBottle + suffix: "" + components: + - type: SolutionContainer + maxVol: 100 + caps: AddTo, RemoveFrom + contents: + reagents: + - ReagentId: chem.SpaceCleaner + Quantity: 100 diff --git a/Resources/Prototypes/Entities/chemistry.yml b/Resources/Prototypes/Entities/chemistry.yml index a1861d7994..c9589e17f8 100644 --- a/Resources/Prototypes/Entities/chemistry.yml +++ b/Resources/Prototypes/Entities/chemistry.yml @@ -6,21 +6,3 @@ components: - type: SolutionContainer maxVol: 5 - -- type: entity - id: Vapor - name: "vapor" - abstract: true - components: - - type: SnapGrid - offset: Center - - type: SolutionContainer - maxVol: 50 - - type: Vapor - - type: Physics - - type: Collidable - shapes: - - !type:PhysShapeAabb - bounds: "-0.25,-0.25,0.25,0.25" - mask: - - Impassable \ No newline at end of file diff --git a/Resources/Prototypes/Reagents/chemicals.yml b/Resources/Prototypes/Reagents/chemicals.yml index 468ef7f909..a54a5784cf 100644 --- a/Resources/Prototypes/Reagents/chemicals.yml +++ b/Resources/Prototypes/Reagents/chemicals.yml @@ -28,6 +28,9 @@ metabolism: - !type:DefaultDrink rate: 1 + tileReactions: + - !type:ExtinguishTileReaction {} + - !type:SpillIfPuddlePresentTileReaction {} - type: reagent id: chem.Ice @@ -46,6 +49,9 @@ color: "#7e009e" boilingPoint: -127.3 # Random values picked between the actual values for CO2 and O2 meltingPoint: -186.4 + tileReactions: + - !type:FlammableTileReaction + temperatureMultiplier: 1.5 - type: reagent id: chem.Ethanol @@ -55,6 +61,9 @@ color: "#b05b3c" boilingPoint: 78.2 meltingPoint: -114.1 + tileReactions: + - !type:FlammableTileReaction + temperatureMultiplier: 1.35 - type: reagent id: chem.Glucose @@ -118,6 +127,7 @@ color: "#c8ff69" boilingPoint: 147.0 # Made this up, loosely based on bleach meltingPoint: -11.0 + # You should probably add a tile reaction here that tries to clean the tile. - type: reagent id: chem.SpaceLube @@ -127,6 +137,11 @@ color: "#77b58e" boilingPoint: 290.0 # Glycerin meltingPoint: 18.2 + tileReactions: + - !type:SpillTileReaction + paralyzeTime: 3 + launchForwardsMultiplier: 2 + requiredSlipSpeed: 1 - type: reagent id: chem.TableSalt @@ -145,6 +160,9 @@ color: "#757245" boilingPoint: 2977.0 # Aluminum oxide meltingPoint: 2030.0 + tileReactions: + - !type:FlammableTileReaction + temperatureMultiplier: 1.35 - type: reagent id: chem.UnstableMutagen @@ -163,3 +181,5 @@ color: "#a76b1c" boilingPoint: -84.7 # Acetylene. Close enough. meltingPoint: -80.7 + tileReactions: + - !type:FlammableTileReaction diff --git a/Resources/Textures/Effects/chempuff.rsi/chempuff.png b/Resources/Textures/Effects/chempuff.rsi/chempuff.png new file mode 100644 index 0000000000000000000000000000000000000000..43e45fdf89c0c5e3a5cc46b181a4879177ad917f GIT binary patch literal 2172 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 R&cy%#002ovPDHLkV1l0h{?`Bi literal 55777 zcmV)kK%l>gP);iBxR8lK?NCrEc_ePLm$u}gaD{86(&eC z=rCj}C=#$lTLgjzV6yOFJ^Iy;pwx(Nkx<}b5kQ*)8vxPGzE+*v-g~VzXJ(Gi4>|X_ zRGsQ3WD-(P%!-PtbIv|%%}b7vV|?Qq-w^+L{pC9-d+1fpQ~^510S^h>=&H?{>zW+pX)~d zqhD@yN3Fg+ZL ztPpd8Pkb!%`ejlz{-KZSr3d@qzh2}R7n6muAdFwTgpa&l(&b+Mp%3`Z->dbPe!1zb zdx;DeDy3ptxQHqvUZtr znVGU+>9BNEO*k_#bLGyFs;3sWaZuCVnaqXo33Phn^6h_>y;v7aq(r_tF^u{;%r-Xzt`6|e&yzx^G%wY=&g{?>0rZrziF z<|(z;cAcx@`Dv3MC86p|;F3gO&Z+tQeZSh4ho>mhq}@@R(oU5%EToi7O3H@39h|S+ zjJA_uN{OD5Q4%CO7qJHAxO#V6-M;@9*4kpbeOrW*WCYwV=>Ft%)3nZ0MxwNC|E=GO z`WL?~^?%+?@e{w}bh`xaJh6|b&LN|7hue@zKmsst|C#4r?#F&RbSTp8Dg0OdQ1*kL zKMTY>i84t_)=zvP;)j3VtBv3%z7RUCPGypR;2*54)x7=Pc;|~l=EJW^m%HR2{{8xT8*dN#mI-b!Pp_M`gcL?8kq;AEB-Pkg(xzLc`QxMohClzh1D{#- z?scTYtkeRXs>}W2{Z-*j%jd^X)%g(e6>v^sU&4#T?J=0=;NA&6>Jv9Kb;6F2Yr|`G z$RGS7mWJ2ns0~LTu(s1qwX<8AUt6lrhSRWhXG{hP!b!AylP|6cd*g>stIxaDX>Itl zI{mj|}Qti$FN{*`uU1d)x$;WjZw-`wH!GE(F;gVpjE=A;O>JR?I zwV#_uaFB#>GATvS7{~Ve-+dsXEFwq>vU%|7Mf)PEQSB~kb$tIXto>yNFrJ147Zd4T zwsKN)vO%eK^W&e3{+B-Sfu~Ot5wDv!cIcZHajd~j1uRl7lqsNhc1c{;NgoLjW$|wl zw33)Q>^khH!bj&>sl(Ee3idsMKY&%K{^Fne`DOjP-@SXK1AOqQC9!b9#5Vz-pmB@E zoS857dh6PLeKnIuK2i`!$~y3^Nz9!2YPZh7QHf&Mf%}x;YU17{+ynejtj)s-zhnRp zerZi>clpXquuBT#)H-Fq*N2+?%}KnAxuyFcG$)ZK`Q8*h8Rk=ifOHC`TGGK&ENP{? z5y#tzzN$_6gF}&bo* z_E*;4yHG4)waL?iUs~JSfBb_Jv_Jm~tFBL>!>m+0svTWq<|%Wvvsa1LBN+q;CBoRY zyf$`IVyfN87k8R%hov4?j}K0}dY~Rw7}?Lm)8PP|YtwFRG#ikSB=@_c-$<}aE>mVI za6WeG(nw+Zv|4}u7gm1yyWZ~r3Oc`zzWk>6H;ViTCmx;?UsyX;Mf*JIo~swaBy<^x zx5ykFN~*Suia82>u_WzM=AZ_u?id4KQ)8Jb_Y$=K;OEy<&Z+(6pB`b}4}H4nTq8&G zj$01wIFtAa3&!k(rXr=CdEA@7O6R5vc|8A~GW!A_?&7uwwG?){nR~TytX=CYr$gqg zS$zCW>7NDs&g1PQdS(Eh{LCuwMAoi#x3=0?S#miCc^389h2c_-oRZrtE^>H3d=+J> zEX(Rs%}kM1m^IV6DJ^OV(z&|*XW#R|iP7KqW5qx8sl}7XVboDJPA$;Wqtj`juieRs zLrz>NbCJYt>nvf<5tQ2|_vCsGa_uf_6DZ6~A*+CwPkv@yfA$q8!T0^rnp%(^pRLxR zc57+Q`-wf`A_*kCojRnXAOlv9AkNiO5!13#dJx;oHvx6EmrR%W;1jUgOLecSN04ZQ zQ4d&FQjycSIt3&pC5a@D^8%1WBrzd&A!4cS*Qa30;-*?Hq3`>pHU8cofBD`IH}u0^ zN0LunT(nsqc4E=lU(6Gip7>aj9`(w(cT#G6ElZD)1Ci#$e3-ae6Rg2fVd`*5)wh_Y zthFTWO*7xDq^p#8=d$qlZ+&IDOmK7PIxc7TmkdA+(Ui6qD#8g|Y|8Dz zaV;q=(k?_%xXq!m7sxC&OADfPml{m&f|-moyAZkRb|**buRi);TsxsDk)tDpvtdF` zwNYxLfJIR+B1)2Fa$q79w&zC+vFmzg362g57>x0@^}3SUbEx3OWs?y3SRJ+64%`FP zf>skXu)T#F;GCJrhWy36Q|XVj_`0($tG5OYho?_Km&Ms8?KFrYNc+;1MG+n zw`V(oeyWBbr9w`LjIrAY%WSAYWYepO+Tc2DCA$iFdWN37^d3$pphZmwJx((^W_|mb zdDoqEk_-qVlL89r?`Hrsk)}t4z9_xVo75*dq3=`SE)8buo>O`mDFS*GD2N zdiPgK;wGD~<)nX{#5*$NiPt9h<_T)QRS-^yMCKly)=axy-0ttVdTqyt3v|JkPmObQ z+&b4Cz7_+m3JHOCSJ;6XASD1m^B(;C`cfSB zGv71&v=XPrsfWHq=QrtmNziLTRib8H^qnqT2!)SyHwN~YvY0Z=1rEtfsoVSJI^mwO z-^d~tdCp>A>uM&g^a<1I27)XBh(H-T!?dmzES;EMut5tD{%BRbJL zx3*8VmsVMN^L2EeFdfq>Xo2-uSx(jQGv6~#!RI-E!Ih9ea+wSBRJd5pw3>?$6OfXK z*``#VTd-6qPXQTv%FZe25C&GCNi-GhG;42jBC-C3Us&tkenlJ#@E3kzl?oHt_i|EJ z^Gf$6Vn=2-wmyvx>j_7853}~b*kC#XC(cT`m}XD2sI|e`+}zb|ULA#paRX&}ODdD( zY|yz9y;0jZ0Sv>~WH}ik90bujDNMGR$F;aiP|EoC)u#9IDjAhbE`V0RPJntaa)TJb zk%FF+!lq*fMmFi#U=3Ow2+4@pEC`LC?B-Qjm`yCzH70s)emFP2a!M(hbf){a6)Zqk zQOzdU>+*b|H!-?hCAfSUYPsxAq-C z;1fo&_N73W+QV8Z=TqkKB;TH!Za|bm%8+Vfjq!As+T2y?4ps;KqOi}iKXHOnZ+sCy zMfuTwG?-MW&sT z{Mgjq={&EPytEVyKN^HOY0i|ADAlMnICq{`J_kPKXl^OMZ8JS=CkiGF&ohE8O{A@U z*?_NGoz$d6Vv;a*%Qs|^EQ@j0b%iU~Rs`V<0>w~)7NCTtf+pb>#M+08P~cY?z=!Wk z(Mj%co^f+1A2V*^9ziI$G0ZBYl-S3mK3ezbkA`Va&989oPntA0Aqoj;e-KxD`>BKO z;Mf}vd*ZfdodRDkWjwWI@pZ$$(<&k?Af@2uGSF_%)wvP33+uUZ`>t6_()B4=$xQQ1 z*(H_J$?a@4?C7SSGc$!*Ton0Y2~N|L^2Pr74tVhdxPu*%M3E>-@br@n3Z7^z4nDeDx|e(U01qs!YF~#xCh_e50C_R$iz#_2AYhp6517} zUFL8O+`C$Y``Bi>GdlG;>i)fty-&s@5+;qalq3O}DKfS=|Ijb4`pG}>>J#vXesPsE zDH1b)Mu8_ILGtrbPd9y)?#>f!{Dg5j85^anv@1^g1WTvY6*Xt7Ik=CEq%Bgj3Z!0t6>_jkg*)o^YcrLe$ zqF4b2I+nP@5@Xl-Tu$8X?xn+Frx{pYGJt0%CeA&SPK_1xw26Bv%z4s1GMAQWPrOxv z{l5Cz)$iCOK_YQAB~lWnDKqUR9bD0}`rVdv-NMn5l4CsXdfd_(sE&k7MpJR2!+;r|-A~qdh(Uq`If*%7-$f6RTl(M=uqEh179~I_ zK@ll7Jjfy$5{9smVOPd0ugEPnLl#OSHZN0xwp}-PyNCB5fxAicpx;VQd#A;~*>}K+ zU}td&B&1s9u5hRFB*8fi^E^btk+l|V87EK|ttTyK%PvgOi59f5pM`_1yX)B*wr$4| zaa4`Kbd^|vx>G}P?kd$iswUUib zm3F(*yUA(RMcV75?DWl^^qPzAx1!5+(p5U+jS<7TqMW%H*K|x1o|K(c4^&@PmQP7ji;-~8NZfHVVnTj zW25Jul&f{_B0|hg-0RZbiB*Y~H!@l`*A-o_Qtt^bv;Un{ghz$*IhAgdI))Q@gYVvc zBhH;C=dO2`&W+8Av?5ht!epA8E5}+n4Fec#m@PucC2K$L^r4p6T{o^zji;^qF`M^? zmkMFNGXNNlBnRxAbV24d7k#`ZKCEtRjxDJxk(v2$G@67;A|i24Z~$_HwTtG&PMLew z2tTya<>#~n)dZD9FoE~B_BQJFZ4ZHIDJkZ}Q)QxOvhc2CrL}Vkc)HY)q;6qC8u77m z60^<9v)J3OMxsX1IRV*5OCvCA4TVS9zk{rVawg|QA(2WVwHOhkk}gvAE_Y5-Az$ot zsLkzEIo6v!Z}q{`d65zDjJsplPOrj6H|^AT(t|b^QHm6S)|IK- zrV|byZ7PL5iTf-(g#mQT6Zdu#Z-w>Fx%r**iN!=~eMAuNF@QT;bVzttw4WzF(i4}} zWOv_Mnr(WRkO)c6#rJ?Une%><$een3=O9}6xSF)ie49{=6w@mUi`VCwm~R6)2{~i- z$a9UJ|_|+!LuoX_YlZLFzQ( z!LOX-?SE_k{6ZSS%B_#nrwp7wl|+<8k5Fj%_uR82o1A3hW~+yXXC0+86n3v&4$Cd* zM!Tnvo0hpELV2T?QKqD0n|a8A;c#YHx~*j80i#>m!2VYX>@tjCy2N!!?_Qw7xPHQDgYApsQ z&&ejShe49lmIDg*nAT0SZXVylljHNf_sjrNN{rGEDJQg>d9xILpT%O+wEAo6JT<-- zQe(tqWmv4{2-hZRhLj9x1bG(9lIB!6sIhmaxRUgOBi51t4__uy63&ohyLaj{ruVqH z6lSWO+JdD8twW)BPvQ+uT;Dx_QrJxsA4{2Y>pW>4BO>Y5hrm`e>k^TZQXWMvKZDJL zL$K6=P3O>FV#*`9=(|Y^nI)1tW{vLaZl*}g4xdRBx+;O_@A1NQ+q!mgph(KyEYV#t zbxQP-#qwV3o<-UFuO*tYEN(lA9%gRHWFGS%| zg$vJm%SCUf^G-5FBB>J@EPG9&7qbI;7xa<-%R#rjM$^gWOr~ifUWB5&3*;2Yqoz4d ztFWY8n4-Hg;?o(JlQ>VAToU_c+PQPvnvUSM8B?~HT4Ry;a_v0ovEhRz4cP2G2Jr14 zO}u*@+?*iGIf=;{9t@LZoWfO!Zd?P7k@W^BPk3#Cd*_^hDew+7jVf*J=t~u(+26yW z{}&!e4R>DP?s)Db-r#$9!e`Q%f0`3bBCSC?pYXZ*CIYW37u|H^WU(8l3ws95bz$R& zhiQg0qGXZC;_4tibnpEJu*;$b5w?=ZQz7R>j^JD?4O76`2~}&2br8t%#=}fPb3#e# zXSqk%Yb6@&kqg7a?Pxxa`+d(ITsM@bP#CDbTBog@)#09!VlOR`tSWj3_d%0zYq$%X zoOxd5j=a?rB-A?Y;FLa?i!?%UC4-j6+2*TCd_-cWtV@ae5|7eA)3WTfxPh^HhfJFMvi2Y8vFV!ArrXF{c{eDU%^hh5Pdw_eGHH^K1?NhT$-Mn<$1XOw_~JUJZQvLW|zKG=fVSPQOg)EgoOCbLLn zOfd0b7M>0Rc)kH1{QXsQ59a8BdsJ=|H0&P3IrlK`&9yahi?Q)xkPpLTW43C;Ruyn) zB+faF&4QA+*ozwT6kb0Q;dBHU_l-<`+q zbV1E>xtcgIvCBzMd*ik?HWsg(5?!!r1I@Nud#MWYVh*q?S+5@o7F>ks3wjd6!{)(k zA<6UD+$gDuCtvZbQuACBzPr@d)Q?*r)oJh{e!U6GOpq!w&VDC#3O#5;bGD~ z^V&Z9s#+X%x6POk711d=sBkd_wReuaZ5=}6lcRN?S$KL?*d5A%b4%7Jr@hAj-n>#u zN(FbKldvPKbByZboyRtv0Esk0o9M1UM2F+zrj^zM_7i1JWP+~B?Evk#dKRT`#y%c^ z?{=UVg{Ny(j-?QD8jVQjO0@3qM)!z2$B~uC8Kh2k-#%;@#|S4nw&#S>gg$gH@%p9S z2Sac9=P(>ehlz41l(~_pO6*E_U#f4qIcGqo+dOvX=^~C1B*IT!xd~DC z7n)i)mPB(Ve)c<`=RZIDoqK=s*Va&`?L;X_Q&h)s@onvtbG0ps8efUVVsqY3_zqlP zc420lWgtLGIWZk3$}SP7PCHh@c5L_fegjylS*vrgFQ(+zSL?W8g9j2>ou`Odc1)%z zDYr?lMNp#p9ho%+S9H&YvxQ^Sq)otO{FZ!~keRv+^#Qh=1myNUgw5CK|) zR%0W;-8KAql+jWm<-*)VHd+by2(;9(iBmE;G0mAnnAPK@O>}NX?b>%Gt-CdTZ9(^~ zO?RV}i85!(YNCguHr<7c-6JqXc_g5Hfe39J(m|%Kfm5SSphG65f_BqL_jpfJ(sqjm z^_+-9VLoKvkI>Ey_2%m`X;HFsa5mPt(;7;1^1NNwO$|~LilFxHW^=2(E=wj#=wa^> zExkVrSHdMZ_9dm1xNK;DJo?1K9HRp52%62A4MAHwzFByfI%#dJeFQfNyCmsy&YljL z9a3L9=N9VYEk1wr&kW!zkNO&&lQaK|gZQW$zb=nTqz39!ZKO`*@Dft*MQ?_=KUaNa zSK}soBcYA+_qa-Ft2)k;-IAI5#J$5_MX3MBpKU9^!&~nvexp{@&fHOe)9tFInS36G zQ%d6UP?$=hpMte^*3yYI=m*2cj%#kpc&i11NlWGv3%q-}j{olI@n!E1&^svxbGS^| zj;7mVb&E`)ke&f&hMXu<(QMp%&_`lzFgdK`Q4E_B%o|gqVuFQ-N~DxjlJ1~Yn5NNv z6#-s&a+h=qavGesJU~C3WEl9n5#&soP^LPfzfedjD3V=Q;xLhS#U-Q^qp{`viGYv| zTe#3{T9_VowJD(J-7OoZ>T`6T&qL!WMpEb@hmMU$UE4mFye+$15X`%Y@BGLA%l@5XSU*DZ1-??Kiu^W z>v{h9%mChbYG3V$Y1V!#au_?UceQ7c&4bFC4X^poH4pz<9xsH+JY}{noiLP z@NzP>&iVr-(R1S9L?-j0oLDAw+D*Cz*zLGy^ZT9M+Nwu%6N!tP#7E9&z8t0+=KaLw zhxXi`8`F^mehA)xFD? zN=(Tt?o_6cM7r{<&YDmuK!YVrObP8WsRw!KPT@hLUISN?Vic21qop0YsW44a`_W&o z?MJ_J@_w&e?YTB`Uj~X3Ms>iD9%Mh1leNnzCs>T@pnSND&5*a#Zycd{ICZa(3UXrC zWzMTtzX}I_ZaR+cdb4s`3J+In>gK|Uy`j|67Op9icNtaDB6!jvw?vB2f}x{xFSJy2 z!akSqDLO5+S6ATxQo{*a&c2Dz3A}Cq$&S8}A)%Ah)2PVj@ZdfT`aXq0+H?<&x1Cyp zTANSNM{n>;_xhp%NTl7QX`jhU(wl4HqiOM%irKF@eXA2s>3&3W^yXAfzTK}}OO(r* zkM1VklyrFt&b7Kn(7Ny{?lGl(%BXY>6Fw%mEu)evfGIQA;IaiLhWfya{F>$0Yvaod zKGL+C*dHdpUeIANmBmk5Q?$X5JOCF!pNh1f{H8lkj+NuFv0kkD+{HopToCpB#juA@ zBa&#&5+3lUjEay%YEqBU44EQOjAo2gL0n|gy+Wy`JYMMMu2>o!vz%dyf%zJd%FJac z$~&>{CY}G&-)KBMy4bpKGJR#mIE0QNN6?o}7&K+4`#aJk;=0kE_F+`P))lu=GEx#H zZEt&=ENW=#l240Ix93-ofdncf63Ja&n%8xZ3yKG`DI2CRtP(2h%cNaNgex}zIYK=K zX|8!5slUzQ)wjZpM*Z7=>Vq4i{`Pmx{*iyURD$bXEqBruGA?vx?kEr$<{jD<<=&Z3 zXSZ$*s>}HF?(k_{St~S~l_Zl%3ZT7*4f_3`T6LI6hr%Hxe-l~Xj(FGb)hR|5w-K8|i`hqXZpQ6oz=G0{oSRwnYq~m1XNz$zbsfsM$rr=9ns3XaA z-ue?B0+U3`2^-E09l^bgQ$Yw)CJ8R1YY(htLb>Q(z>1s^OyC{NX<}EK()WLA)g31s z;O1;!?&Mr(Z4kItAa-Lz<#WdC2=DfzL(5BO0G9h5e136hl)7oD5o_#LBsk`^X|t8&ZWh zlT?|MfzIla&zwR;>#r6=cyYCrP-5*J88Rc}OPCcjgGHjauy2J+iA9McF=|p%qVEb` zf~cLoJ^NrHF_Y<3{G5?n01gLueV?X7^6P^x>))jD#ihC`@pP_yu{9pm)#sGBOgr9+ zNfVuis_wUqn-E`KGrN$;dmT>3vG|tG*L3zx#>Z?wB{yweMhV;+!HuRN(IYCW;T zz9e&j2s+o8T7)ikDqTK4S@~jy{&eLwfRs_0xL4qdLZ9z8z$^x}h`veK@Qi=vE}9B&+(p1wnBk#tx`(UJ^1i5i)+ zq-8d>W@^u@G_Ptt_HbLk_3N~Q-mS$rg5DV9fDv{|Q>IUY`a&B7ztqD@K@WiBB(uIT zv)j*p^J&++Pfpz0YJ(fPWoE_U@;nJo0H-VRX&T*I*&NI2|6Yr~=73(gjmno}^;7IM zXTpWIdh$0jc<-@xmM4{)n}A5{ri?S3Vv=K`MDpCi*LC$jYsdKfa^r_ju37)`CzAj2 zCz2muv)-P3-NV;RoH=mdf)6txq;)Qe!%hbmT|Nx-wT0Vb-CCxhc;;I?^Oi=*K9Al|)LgCvkO}d~v!Ocrm~a{~>i=@Bu%dfD$ zZT*#BZrWcYwW6q5c6KMxN}=7qP<-gV^8HJN#3_O&(RkP@=MkA|O^MTGu?~r8pT@Oc z?C6(satSrM&!GBZKX?IXc>fqamdyDL^SL!R_TW|mceeQsd+@0xxMat~9{4EcD>N2k zHxmnfvllKLe2&VQQEJc8IXCguFt;Rn3zoic>roKutKro7S~BOSwjYa+HGB=+0JICI zF3kxJxignUNh6_i4NNGyjYUbBq{2OkTQzP2;@Ajl(6ya3?Gn8;dhY@`G4mSXg_YaB z>KKLU#PXLukpkea{iD{Ra_TFY9Jq}TS!yYhY_;NAN0Ybhi)HxXg~EQ zU%uzNBsevb9>b#x{8YB4BxR!|$hD&yq%8?L&D9SXJ*dgx8nl4La9$f9es3 zBWQB%9TfY^N zM63-htJ>{JH^S?6lf9*yE;^BjZq9C;i@jVV%9J>}`*f_-79)H~38q4tC#79}1q8dT zT|t)8)a;Z9y3AIFnKJB(o;1@mVCB17;$43LVYse33#Z$r^>7duv&vlX#ZK{`{G0Dr z+q*M>Gx+lr7Ubn#VLI5U25~yerx&F0V(@B)G#;?tN#m_7z+-nGsXVo~)qx?6C%yoj zke2se!24Fx0{%_Jm&m%cX{|Fgvl5)i{_+q^+NAMJk8tCT2n{@w#v2vGYRjkYI47sk z#Kn#m6v~YAisl`Kl6TFqQCQJ=6LX_#q6j|Te4U%gN96t(HYXkWVYV3yXy~X7ZHO~O2iNu^XQbO z8>;CQ>J82-OoOrfYES$Zzb*Bj{JgzXYpoGa7ID3*cY`PJr0Pkht$J1?YyEqFNbz5M z(Q6T>wAx==41LIfMI^<@E<*ZXT_{N*TqAIV!ZD;Vd%&DnFJ{$gl7Hq8zD(n|lg0#i z8tAraNMn}3PEqm)OJfTD=Pi!9{oY>i)($Nns@$G#-Jh%*r^3#_1e5{Cl2Sr8J;oU% zgqXQx)|<)P?mCZK<)(Hw?sH(rTfifNci#Rtca^WR9{hJpCUF7mSvc~PI%TCYF)x{Y zh>6uF*3An_PG#gMaaXDEok}wuDKh4@84j09?@mk$o(wl{f5+Fqman(|RS`%2dep#Y z>tAJgY=8%!T?_a!LA}>l+7o5jT;Z|N$V11JB=xi{So@mMf!Ec0cz!TBS43#YiVfuMPn+my{6#%!$XXlA_ZHA24rW zKO%Ss`1;3gciK98_JofzHD_K30W=Xl4Q9+Zi&7!I6aqXCjW*jcy9@^_El@@X;Drx} zfxprEESKYZuY)p=9C->PJitmwewole(aCG zmx}#+v%de=R`o>kv$j~pT@tJ$l?yZN#V#_(ES8Sh3^;k{f9{jmrHRWhi#ku9@k+$3 z#QkE*E-BpYI^>C7C-`O{vvU35Q%isQdp=MdSgd4bE`ZC8dQ2YJ`mW<$9gRAp$5$Ih zKe10Dv(mchlD5uRWSlZ+mnnNuE+AKl{)%GgH(C!qyUKyoNQ|yFS(_rp5OGk##qgnu zzqMKSY~Jb3|G0NQRQ^rP>#^-bnVn)TspT zM&;qU#GP~c=UPLtZ-{vfOlf0$SRiwkXa4A~b-j5dr9|o--7faSr{SBkJ!P>!puQns zE1JR%<5~cO`V8w8x|;BQ8l6r}CQ3#nk=8a?gb6Nl;=?wN5sw+RPZ}u4v4|)d3`Wcl zvT7vEj)k2%^#?z_wtI&hFM5I>{PdcZ)yWGJqqT4AlN}qZBvg!JYfz7YdVokuOnH;= z=%%Nk)29}r6DkWPktdk0kWY9$zo#+cCqD0FJ1q^r^CaSLyfC2RFZ{x)C}>@*7D{xA z&BVk+qG07D=h>v$q|$vLw2Q=L6C!w5`1I#~e(4`14gS(g|D`S8X-X_~SK_WdJj$7O zp{KAN?_LKbb5XKhU#oL;P8T!16zO7OcbWa6OSnqr{0JUbSj781z)yT36hZ1SgnFOe zhF_F&{Gnf5)e>qeL;7*3QzW$gGbr7PAk{{4a#yfmnk)2`sdv{0pIZDuPVjDh-!H9q z^=SDH^lo>WMk5c!(u1E{oRa+LCP+$YH!($!m(@<9U+&~xfkPoBm{+UZU>{LkaVr2h z=zHmA9`N9-(M)VvF=z5rlm{42kSGL_SOm=?cA0d@)DDkrY0zl5N^2unc|=gD>~mJk zJJose!sZeG+COUfdU0u;+^Wmi_MEmjUtx%#7qm=RITNP>r#_mi1uKIKV}d?S#BP#O zvwM>z-%((hP1{>b_4CHizxf+Y=Qf0R*XF3*?T0?Kcqde55)+d%Wm4kY982Bm8%6h( z*=zRq2ufP@57ekRJVhtfqKh7+9DXelH?gNY_|@e|((*x*QhwkwtJdy9)^1ZZweDJF zc&2TXwp=GL>E;BY>rim9FP!;9c@lg0$^~`Ul=(XXcT9e3ACa1#A znfop4KAW&hfa?D;$~pP7>+V zxjt2zUqMRy+I3K-A+{bybv03)N+Oj!%6XC4TkNuN))1-k&~gYWUnThR20z?2=EGgP zYhuUD>+G1ASV+8sc*J`q#{Br_Lf5Czf*K1%;n z_E69;Y5}JpLXI*Dn64fS+tzUb_&a}c@?ZE&?bDuf$(k1v4nLEw7_6(o4vfyZt(*`i z#sz4X(LSMu<0cf#XpXK(kewJYU@+qKD-v^z8$SZXm;rUEiH=yepG{;6p$Oxp+B>1$ zrqs0LXLyfYscmd-c{FtR*(MqPuVu(<_ST5=`DIepfBq+m|NK9!k&?%hmLPS|*78{- z9WeJIPztB39g`Egb@sPOnv3~T4(crDEbkC=hbcO?of=$3;dR7Ypb7ZWdkx?xKkwAK zr^BqYONzGI8^?W`3-i^?L86=*>n8M-c9RafnKuxnS3f;5rL zD6}y;N259=9*iG_1MA_5`GHaaG^(Zt9C5^mg=$k5oi-tnQ z#XkGZBr?{MwT%X$Df5w>_?Y2brPEFG)0^Nt6if*XdIaZC3%162F~k>NvDRuBX_*-6 z%&K8&1%`5XO$kj!hr`50N~CU<)>*KZQiw9K6YQ!<#}F$_9(D0x)D`L$ z580tpbk-){$z!{9_b|)2;ZexC>u=l7q@~lAN?V)Lu@aMrb0bJ77c`^1EGA-LCavRh zJg?L3hK9`4Jwk@7{rkl+6&eR?l44T!tSh7|!WU{Txp`LMpoyzexB}KWIHqu)AQybd zLmtu!F)jY55wr@q7lCxP1l>p0_oEFu-i&J$b7Q9CTn zsgHRLn9&_~j%_0uYAE#}B1V3wAy^hQATo(*G&AjhGJ23z1J*9J?PSJV2n6uv{gjr~ zWvStUd!#X-q>qAE_<3u1q=Zu$(>NTg$4>O1^&tXeVebm_MPZjZ(MEV?3~l8`;aH^e zGTA@+os<8=|F*VfA6w(DqlaXCk*s~DAY!ew+UZXhA}3-oc0v?#f+^MKqcX!DEKcDp zoDwd$V%Y6c-p%hffGIEzMzONqqXvb?~F?%15cl))k5j82SU4hnP3 zqG!`Wfs7C%5q0u5-V5zu)Ua=OEvnxvh;nXi@eBe>&kW#l zH~KExszu>*jK*>p+U|FS12Omxt-&0yvuJD3TMX^}u)4C96P^?5L8K9ph{7Bz$J(e} zu0Og_Q_try=puqlVNazd5tAr$A}s@GbMNwb7-B@iWKw|I;D3!nZ*yPnSX&@5yfRBp zO8Z&5*uCEXzU`x#8!?^G)v0+pS1VRJ-BxBFNu?#u$t)>|lsS|{35hxyIMxo$fwG6f zx|7Q!v>!dRhv;zZ99DB_D<1sZy53PnlF(K0d{ua}$=^JS+LBz2+?`tEgopC=CjRYh zBTU;Z3{>RIwV|#eyX#?@xV6pFSnaK6)>>XDa6U7DzwsMg)#TbeEi2{rY@Zpu&Lrop zLt?avbXtV^l;|mqJndZRn*v>B6VqiV=gqrGc{eeoL}@`^sug47J`*T7WOS8Xrpz9( zTTMS&=icyngtXD`s{haVXB%5Vx?@67!4)^j=OGS;g!&+OrWb_a`ZEK_nMjG+%~HG6 zgr->~D$&PW!n}PQJ!mwqT@;UatjDISIqVD!HDL9)!9Yyxc+)rB^lZ=@jgPFuqhLyCnY=VJERT-C%k7j)hwoeWe_>qwq+!ZVOlM$;sPs1ZIj*tPIm zkqIWBh;97Erc~SwPpiWCoW(omCNHA}GjBFM=*!RH+q;6&psB!JZ7gHlP3q0oA`dWe zqfC!Ru}y~Q<=*JaLsIRYYSTrLrx5cxt0rL3F1bn4CL*4=9p1kTBt zveR5tazaj~q1^1N2B~H4M#et9`~GvsDakv#CXIP#=Qea&?_?c$RtZ$v_El`gJnn61 zE{Y8wT^m{@NkiFsqm6^qfoGLqBIrxyd}CXl z$5l9uE`d=Wn1*~qaS*3UOTa~?ALjSNfX%p8FKckUG+!bPQ=)8w{HM~Xd5DBX1lK7O zh}=bu4s@3k%qh?WzAV1jXI(Wo-FBaD8cV|;QsSGG`I6zuv&}sWz>gb#8ae`w;NTH= zcT7h#p`M2~>n#Y&g_(Nd6*%z>HO?TJ*UQ-O;#o)N*dv`f;+jC7n0zIH;zX) z(T>Zg>F=eK#4hPhMQy-QWGBKVv?il8j-He=y4Wd~LOLx&h;<#I!Q_bxIw#Bxcb%~> zN)&6O*Nwu)H3@m*(9D@&wP81r4m+jR$VZ#r$7e(zH#7R9$h1uyYLt*u5;-KVVMoJU z2V>~@%j-Y9FTAiS@W}bFNwmKO#6F zIp z$nIHrY3^0D7Et@9&m?+IFbNfr(@;F=xpSto7<6D(Ml@HsM&Lx@ zSs%D_N<=Q2gjEu4^aDaSG4dnf(XVt@DYO~!UIYV)3v+XV|J$E>KN;)a{~f2c#BK^- zs&gf?FNsCLy2**9@?3Ox4KsDIkEGd|kbQEf2b3kJ12t|htIyrkQ{#rtlFiA%NwIPH zUs$8OvpE?cNoyMYZP7zrVdmm_mw64b>?SR(bM8%NV`=6xPaJlWN(xT4mu2PFaB8Dl zPvNao&UeDB?}vk1FdS`CN`)ywQczuqzDnUS+hQ;U+#Szh>HwTJ1#J)MmI_G3(($Pg z(O4O+mB9<@40i^ApFIK#oVHyz#y6m;So0``=CHy>vEpt)BIkmpqFf+FV_jDF@Yui- z;US^ex4PDI6lfXNozS2j)JAuv_fFyYG^(z^Q^xZ|$}xb$*a{zOFk=&@Dyhtq_7O~j zw&p~zP{tfCUWz_}c>`#}jWHh8rKrq_A&y}B+1?R&gHK}{6RMKX+Hma}bFD_toi8+e)t+7kyFySkiNt1f*oLX?6L@V+X5)>5;YPA}gJ!Ijh$hvBi zzNw%1mGjg71x#$R<;G}Al%X<%pGCI7+yCy)4?eR5&{C4i#C}f7G|uO8Q(~QFV!j!sXTR%ZEJ(Sx0z?}eGq6YavB^f<)m(VRHZ$< z(iqM$m`VN4TjNAlMq^I#(@s3CRO7ZC`FFAUU9R@hyLkK0%zp5h#eh>%oE3L?Q|29C8_K%zG1-ElyPFeTz7zTTeq_D<}$7cg~UR)EKD2PG{r=VxC zOIb7WZ5I#t9Z0Yp;a6 zMs#wQhz?`$3km&8&p-p=8{n%b$vDL}%DN4LV@YF%gG3&+R*3E}icOt#|DM@3{+UAXtl%`Cc z(ufWF#vK_(@QOm{cr*#vhsmos62x4+ly0X$DXX+e_oC?1N!>%vWKGRaQ!o{IKUGdN z|1%x^kWM12ko9Iy{$`S{cZ+{*-r&3X-q*jO6CS<8#}IJdEFb2mD*F&KNcr;*L@{-3^J@!o>H&!P=s2QUu9E_rEbho##8IFtneo z*3G#!B0T0Al*Bxtxxht0TI_}>nmB0Uo?+)90rPIOSDZk@gBvTh!scMRHQf6!<{l$d zE6D(pKy1ItclcM_{dY{DnG)$Dqy3I7;ibc|F+A4YvwrCW7$btl>=Kc8g>=ZwbeBy? z$>8pgd#88N2vQr?wmm#6wqa#%bS*wb5IIw(LUa>h^`75<_2un$0F3W#$A@usFD}-E#L53$=IlHW#J(^<22HxkXIf19kFy zHelJ3!04>KanlFU?9OYCg4B2s$*AQ_R$}TaxeeM!m4>qOYm?vD7k#)5C^{BH%Ul7C z##b4!_{;0rTe-s=$AE5(h*3+bs3%c#CSpvci7sR;Lai?Z)vZH`AopOFxXSRF%smqB zqJ@U$>U;M=+4^cCh-jOxSZtxsv*P~nVwR*amDCoBJ|rUVP^f!_au~w{_b>Hxzr3=sj1nMDOq`aDV+1B+2i0apD|5Xs3CiHYurkcSiWU8s>IsjaN3^Jt*f+=k!Zknm%_9a^jN+L+GO>3BBh)iKnp zx8Mnq(++)w6S_LRis4dRhgt7h(F z%xKG_9ceKX7bLQ!;Yc-s^Xcv<%7ksRp z$I*4-ZjQnW>oQpv6KR(`Co$K+$EJR4M7`T3qsUeW-HrM%4Kp-N-&@-OXoe+%+`Sp| z9klr#M|3Ds8Do!15y_q2nhBGF{p`}Bp2MZaje2hOSc~{#IdXAG|(w0 zrCD|}wV4{B`l32CE*430$4jI3A@41F)8T&J`-+kCG%!jUj;ihKVjF|)jy05d`zS&= zh!2{Q4)BwIV)l>x;u>lE9dDVsVXH%G`|Kq0gr_nz_4_)4#%=p+6j2;Y8-UTT#D_wz$JLKo6CPSTZsEv9w<&m%gLmA0t3F1SZqapMRt^2>D~jGo zV^Ckj%1ZMRZRiwj`{S7heta8VgQa$!92ckBoxnTBn4yFrLCu|OHNK`q-1f*oZ;eRF zn^Xs_o7oqbK@FosJy+f_8IPFYs$=wDUcE3yv7(o>pOtq zPKy1m3vArXFs2v6%ar6Ys0dY}ceB>m<{;SpS>(R0+f%rjR=ZhN(rLA~?;Ui9fzXpW zJ$J5?h)8Z{xwpYbBPGill6mfma}YV9-6ZW2F-vPRUb>gHvpzoo5_Un#L+x#Cv^wHu z?D(gle&&RXZ);Jrlt@DK72E4rey)WxFojT4* zwZKh?R=x4*2emq-JTy-|ruozuE-J=-j7g3jnjU#fu5sEY<&uY9X%B^}`_hQ5Dd(j( z@mKy(_7DEU)rQ_ej5D(g4_cyjaY|a=)9WNAchtmJuhj11ph)DokS?FNw>Pxaf)0hel>&1Zz13*QLjA zOo7$?l*(-~tt326)KlmDQ~&OBI`SHfU;&L1%`?bO4ZLhc!E&+F<<(vnJ$QON=}~Wv zIZ+OUt9|x|j0)zwG;X?$O{u2VPDQN9t5N;g?|r{$*~KB_WFI^0))GmN5qwOAv@0%I z>}*uKsC^u^Ig>T=!&U=Fa%|ypM0i8gp~f?hes^NLPbA>n40lfNS)aXqN7GKA-K6Pa zr$b3Zbl9l$|jl!#qTxA#JvJ-#xSE^oYw0?2@)nBQq z4O+FUEN`=(hVM9oN2$+mfA{;t zu#dc6l0@09PHXRdAYVqXBf^F46DJ);_=d{Z5<4%P{-95o=W&BY(TwU2Wv0(!0$Wu9R_Z9M6q2){S9WDodOA z7&EW4@Q}_mlP}nzQD5g8-tPuJ{F($xOCw#Mg6pt*D1UuY|6D<&nwy;E!Vlm8a&#M#Ibm|>uDgdj`O2A@ z!=`bVko!vp@b~`s9Dn{7R=<9sbeNTDms^iW_8C*ctoHNaZV}#CDt1QRPfEKV zps{WUj;C2^H!JPR2Wv_0Cdne7JI^u+7+qYunb=K=W+I)&)I^XR7SG_TjjS_(@^x1f z_YNsd8A`_Iqy5wW_N$ZdANm%>-}Bcz0+fZDmSAto#R&A88eDUCHFDnON`kB?^{3o`xQU_ zx!|-qZmLrics7J$?bN!`G?)T;gGYN0x7G)UFelO>Gwq5moVeFeCb->)>P}8&&_G%> z=cUt@7ySQU`sJoFNx~^C)zyx5o7*w6Aw?c~yVjWC+3FU^Jj)ZGLAG~0kFgs@?l9Ot zoVI6lM(X9g58d^lyIt(+_LC1j6c+1(mFIiq~dT<}z=Q&-h#Z$HKO!xFHty=IDS2q?!WYj6o38~hW?MIO_-%`zNKzZ#u#y%*#L$Pp(N4-sfp9Q|JCdZ}MCB5=xdysfV>>`mJ$WY({faSk%z7ruG!tB4P!Tg(#lO;EUDD)Z>|d!GT^J%pe59kVv$kZ&vWP@MY~cDw+7z5T+p zjUW5%h$%~x?7#D;WFiSFCi~ZyO_Os{EH(@TCNs*k8f-cd#vT(wD z4GSemJLWPoYef9bm2+QJ`|8!5{`U5{uOP+z%UOTvmz&E4u?v$*Y*Cy%dLw^3C8qpTnN zZ>!pcQ%_`%7Dj{G+u!lKH_BJ72Y-LPi-|Q&(tfYJn<*tLr!?lUxzqlWKU!XLI{(@L z{uNv=%CnEI*8lm*vjhC6ztP?+&;Gt=@IP4t_?w>#Wk|u8yuMWT|KoT3j~f>KUacSh zT#V+O(YECO{WqAZ@-J)s-@k0#RPP>Em&Zrz*inR2>SF4_rRj&+`$&prZjMmTd;Ioy z%>LwO&-&T#*#G}^-QV|Lt-8og-*oU*hl{69ezI_^gBgmUXKAZT45qIjemBEe1Y<;! z$Mlsw5CxqNH}um9UK}R$3Rz_SQ@5?z)4vguM%NneY_+ z?05d|ANV#LWK;iB&p|Io#ozgpuP)a8%U*x&AGNIfOg&GnyDuy4e0G1Po+0t}zxOZy zz5MmxjuPVD*}VCra=LDgFcU#mH*@!LHE~rEGx*85>)qS#8hHTJZ~xJ6oN#}=_29o+ z%b~dZzJotBXTJGKuzc;TcbAnDqc5fBq4ycx>JAzvjQjgVzh1or@X61vS@=VsZz&>P zM_)cv9UtFBJ*@);`S5+|qi^JSHwj>QcpddOzp_blJ^Ltc$kWF6yQ57N{NilZZ?yj0 zf3=p&gYHcSzBLlx)Pvi$`ghJZJldL{4IZ5Uvw|IFCY%RN_wCij|L2S2^0 zd8a8&97tRSl;|vN^|78=H+h;nYS?Hao$xkK$3OcDn)&~b^=JQ?v#xu(=;YTXy&mGt zwXxiEN4LhjwD6>0-Q%*GxtHM7Rz81PeG>zk3_A7g@A@A$h3CPi)`C1Iv3sNV-W!wN zT;z*~XMOFsa7{-0iRm&icXYaGoa>ky)EHAf+s}UQH~#MJ1XvPqZ$ck?9o~3T+S56m zDvwW%(^6gMqV)Q`beJdg*8TV^kK_3G)`MIycKaQ<=~;zG6GK5}Odzjs|M72pG(Gs# zl4u-q(!J@xhqdD^o3)+!Qaf|J(+veoChq(ZiAtuGFVtO9 zca$Xd#XI0>Yr0;mpY{TXu9dT^o2>r!_x>)N(r1>0wI{d$cHneBbJc@VJEt0iipu5e z-Rl#Ffa@o#p4_aP7{9kJHdwyVNg#l~{*O+oXovO24*eUG_(T^M=Y)FbOULd`_xZwn zp-E3qji=Wqme#!$nV$`<3mAe!7&DXDGY_VQ&vRA%sSh{_9{l<$!aEi&xaB})kF+Ci z@_FHfJNoP!d^aGj`4mH+=L|aUW@0}pO_x_5OQ*@N28+POM}WCMsp9-faKewQm;^J6oNq``GJQ7_a~cY`>V&I@ z{P!+#d7-qMm2=wEE<^ENIQq~2(-2uZg4fkOr{?+4eWhjuQ?K;V2Qs7;8P#7M2F1(D z@>>1))HwHoyL43ZnMEhURk*(W&k>e9_;1!UVg@c`-HSlNyWUYAXI}xVq7Kb&!! z%uVmK-e`Gf#`jHUapU1jc@&&mbXRu`X20wb;;pMx{?>0r{Kaoeuecx|5Z}(kH?iYP za3Y)-g03g-hVg-U%%{_kPv6C$N*9SzlBSfnl!=^uLvXFcIz+!5PtK01jd=mfRts%U z@F}}T<~WT`sM3PAm~iq`61#%C!spth=%kcJ=|4uTI%%}`<)OYu_o$qjPGsSWBE5d0 z^y8n4_YaB_Wpfi3+^I(lPZry0H-5fSX*`s8@{E-alhT-gleh7$$+TovG8NNXwXaWb z?nD}$9d7SyMg~0!abFYG72$j8B+UIX&YPPoJ4>nI(!`Fe$Y#w+Wk2cltsA7QllKYT z%3R09Con&+%Gq7FpZvMCee1_k{OEVSI;sD@f3V8Kz-DC~Hj!O=qmQmAmqE+`+ih7@ zZ3T(i8o7u|#M#dqE_|4of8z5_B~$-{k86GJcNQ2~RWoS`sRlRa#21`c*37#EUz!_V zaVW22W^tJ&-pWb)Fm+jZxHQg!ewZkS!fexSR!+;P&;^Ou&4XW*MEvCE{i?ym2h6ts zpCIuS#5;&Y9^Anc+~h%ItA@yhi`erAfG8_pl-NggG_)t-2%UPhdPj{h>3%&$q(nq0 ze)><1B=^|hJiOVGMH4t;%tx3KB6A%{3elQSn%M896hW_z-eb_TcZHNRy3dwIT^kJ) z(+pRWbeNS&B7Wj`%n$$m7w&z`A>IR*8*l0~#y^baeldiC)7EdGLh{7HV>FXf(9;-L zNb@!}s$;hy;96zHifJ3YB*H)S@4S2xec#_-m2M(0N@B-ucwZtVN*2->6n@Ixsbr?1 z)Mb$s%0wjhBu!bmoPt9&Z|s7vteJc4{UXJflMYKfY|O z!Tg)=wEXa7S(;MjB4zH+*14JEI)I-<4U?-R)3XXY27-n zzM8U*|Ci78C;z)o{-Qfy6ZBI`am?J!gWP5OT8595L5TW- z%~umFheAGN-w)H5!ozh?CpwmldkeHSwA5F~GF08t{W%)9EDT^PbB~!fW$iBmUC!PK z>bdiz50&IES<>Z&4q3W9F1|e;eZnl@)qQjUI0=t-9MNS*JlglbAZFl0sYP@Pyh zv2+$|i0n?Y%BFC<6W~l2^j&s7jERt`YBZwMV57p~+O66LyL)Z#aek{B;o~#$!M1h1 zWr{ZP%tf*$Q4GDAXyy#crKn`Fiy)TD`Lwvk3p7H*AXbH+b9i5I_P#m0P}tutu|GOh zXDTDFKW|bdy>1-PFLs^cj{c)J5#NJ{Q>^&zbuLPcF(K@6TQD z{>^{VAC|1;@l9~EI2*3sIH)X*ep8(=IS+LQ$kIAmnJnnJs6@Djod{YWQu370ZYsQ$ zGM6@@`rXt$A8$}9>9tdh<%d4K-u~pDdF}uTz(0N}4jHErwI&tq^TegI?$?BxbZ+9_ zARlu|R>^kDK}6wFiI1f4aTPs6yRhr}Y`Dm9Jgtkzx6zhWZLRUXGuRJl5|4%+7(48l zPUFZ|OM%^n-28)MG7*53Pl-*d~# zs;nvrAwU=xror9FfG{no_%k}9l}FePslgT(qbBGJavL0&z}Tj-p&MGK_`tW0=zpNe zk`N_g0*R6eRF}-k%Q@%0?7i2TbB?D!%>Cv)vof+yA}ot-2k5^zW~JF~zh=eEdR6U#awEctIeig6N&Y zBAeWm=b;F*ET$0WF__VN6Dm^5W0$^Zu;75IbN&XtW`}QGbMsvoA%!96&D+cUW|DXXRY=J zi{!@xH)|svettbZ`u>rW$PZsw^4ghdP__k2nVgDUsPNoc>{E5%vA)F6)h2?uLkg_d zM7PY&jJb77>#DulXi4p2CnqMOoz3hvu0BP)dULSrr^{OpfQK(E29)eJO^L~{vNo)V zrqLExkE6Tq0Jbij>mIbp@#yL|2R*^KJ`U%*3DeBT9xNl2Fv|m!YsQG<-ZUm4o8fsF zKcwVx2{{%PL%XUNwB-|(Ze@@lI)+D>)@GOuRERVhL^l&<&Pv6QOUJfyym^}jDq;4z z%gG?@(ZWVDdz?ZIBbEV!?I(dhj#AekJhULKje%zxMb8uaM?*!PjO4d!o41a$t>@Mw z;hfLn;-c%x+6)q|#zCQms1B)_%^979D%2FV&&B2`)1#>iaPUbwpCL74*U(cAofn4Mm>)+s+eTX-(6g_=olSzx;ir<NZ%^r8h zdtzt7V!<_{$T&N-c7}|s$)2@jXV&!95HIznD+U>1V?&s-+(~hN>y$jYJ=d$%Zd=TF z_`>SIgmaz?cXu0mHk!r(U`A#y@yb*BbmBhS1^xbdXTcy zS)%NcHq#*MFPQ*9cHwtGI28h2%{tGj`F5( zQCxS{;An1JL+;ML=yd9tH5oli$&HxcP7u>ZT2rT^U0hjyTWs2 zV+Tui_9MSg_d^?lVM9GrdS@m?uNLR-8bV-a&9bfor^8K zt7*8FlqHOPvrA9nAdXkf^j3>56^sqpF4oK^ucUjkcw(lwGjndRSt`e4<)(FRfQp&r zY_{9jnZb0E;%*J@SmUJ_ku;1;qk~N)neS#xy9v$Np6({AuTR3^TUG>{-mzW@8z)ak zs@Mt3@;b!ojTHdaxn)`pd0%7LOj!$btTY#g?gLD_gz5OU7`!K@C9&yf&O#YmrldC8 zfKshZUOT;alN?PMwzGN4R*upfUAsZd<3>S++vz_p=iABB*=%Vp79~STZ+dqIYH&Zm zwNH}Uu^F2fwF~dg+_K4&d7k-{!_I=W%fexUVTYDGAjfOQRb36}-KwF?lsCpx-=(xFTsAZqKfw^ro*r zaPr-mk7cwwB%Zt~)|<+7g4~t}tT#5mWD8B5C(&3Wju_X#t?JI!4mT?mqczb=d2<{t z>=p$NXE-_fi1h_ma3UGsh8Kx}h!@oY`3V=PFva+x3}jVs+0a#3oNy&ogJ%5JFvL~D ztW=|fs0GQ!>HA7tF2r#tk&-m15jIdUqEe$!)@;SqgmGWNA_p0kxGwlmX(L{+z=U{?ckakN!yIE33qpkr85=;_qe zd!sHBA8RYun3kxzsa^C${H=d?(tq$%D*@Jqvagt_V9Yoh60?cnE7oaEq_q>XlhoP3 zDOu9E#Bjwe0Bux+Gf-yEdmE&^+H_GXZ89rn+9I|Y8?e(&qIAP+v5$xItT$dxM_#t7 zeHtmTO*e~b>fJ2?kKL@e$Ubu6lR0w=j$U;vhOK6-i4tyGWhRnsl#q&5UROkoK6WZM zNWUt`bgt9PSsoTPOEKMKx2sX`!a>uzQZA9ZaqKIjR5!5OBQ|&ICp}Yc4v&voo~~LA z>fiirZ-fBGz>0X`EIA(|FmGJ7mBYymv-lAHw>~lsosi6|l{7%XZsgwS%c)p&dq&7k z-d*Eqom(N%n@6P)I>^SoA|)dEh)cszvEhlvnC@Or{s`G=agsxxq%;jvoZcPM&~Wd& z`u?Es!%)(_T}-r&rVaT3PRSF7$+`>)i)6c2xM$9kuo@%muohN<*-^=zo2e<<@Sn^U zN)a5E!8Pr^@GE59kzvhsSF?39J$?A|%k}nJ)^wr)j+#;-ND6vRR3~J{h)iu!7%Hu$bH&)x&OWBaJVacG28b*-V zC$lG|>5@)kV`p(@pD>YZct9NkZj!MZYDZEI_H z@W1)0`rrAK-6Bn)veI}3$lb6@1A`Z{QI5^755X!YZoB@vq_qx1h?6L|zUh~BH#E(d zGMgqmhJEWhc$g=W-EgTCPs~^ZR~U!nw0W}ZnN5RsdO9I$QXu( zI@NM@LIA!o?ccrt8pD6(boV`EFrg)l#)@MbmF#dNNdfBpbuY&-;kV^t05`K#(8*#W zod|pMIPH&b9|fmdnAEpfn{8oNVLF6acSN>bWS$#txa=)B#<+|hWh%)r&sbEhr_hZX zA4{gQYGw_3B&#)>2VBa?WFFWELB5Xh<>?yDg|r&!*j3gF!jytFyABe@mQPQG%dO0M zCzdMJuq-1}Y-5SC!6H`HrBW5zsIw|8xob+vc1_e};rgm;e^|K6#uJI_EDa#i?ZnB8 zzNBG56PQ*K9C!AhZv1zprq`%E4PzH(YZBc$VbbcMo~y2popyB7oUmMM_QW{`3miHe z@msCto2KAxh@sou1##0j9!7y}%%4PI;tVjF8l5n+mYq#9JehKczMg!Ab0W>zQp=q6 zkeN72I=q7nEj${s&Qpvh22DdZ+HtfFq)`OSeN=7Dg=HhBz^!ZCqXMT7kBd~mvn82I z3sUdY2;IKp+s7?cjsOmwIQC)jWSB7+NJIT9(#aM|x7FzEgOc51T+}>48GT6BO$ptu z4l}*;+1$!HEr`jDohvn?$;9fG!|?8Q){P6Qe$7H#f|bV6lNMpymhGasO}nbgJBmYb z?k|bWwV47tlwyU>P0bc&@rsPE15a$2mBut-?wmPxq5Z(=Y&SL`*61v$^Xumuo400u zIMRrxv~;_bQ;Iop#mapzRAr;1t|mo8g={0~k;6TEiZ!KT3v zXjVrh(ne0f5f-9(aN}@vn3C9KsV9&cS9Rr;E{+ZJNSs%rWhZRd1kJ@+WVZAXrqtJW z|1k!q(!k7;`3b~(!pG)}PZPN%&T3$i?G@U$U}>TiXFe}%f!+1OYx~9_1idqvv3Ss< zA%YVl_$|YEqjcUiE|4e7Kclx{1*>7tnXJnkvveY)4Sxhh8#bZtne4-za*7el3Zq)L zP@qTe?1j>>{Kl};Zho4ymLTPk=LoRgN5UdHt&7NxO<87;dtk?gDx*QyJ11*U(m>Vf z-2yOJs3-n(UxRj(UAZXMaYuLQs%kt9xQ@=zgN+52Iw^^R73O93?+D06@!#c&He+Gt z_0+mIC+rA>xa_i5P5K&{F0)<}Bxs&RHk+mm)~ov2WVsId*PRVMAd?%-(StY5|9%nmPNyEW|jm?;if- zVvoM}^@7kXQxpg0gzqwWPMD;6Y_xqR);L+PjRtRz(f;bUtoj(ahe5n-$V?$W{a>P= zXz1_UgAIAct*|kt7_6!+s#G7Tx8zWU5r=v^L5Cak?3~O&PQjrd8rD~2ZQKV!C-=0G z#j=NASnbi9Dxp-Gz{9N{8%rPjO+yriov&IEFP-2cPOzTB-kgGC4z44(YG_f@&C(#j zD@d8J>uzkLYg59WrW&uR^P&=$pZnc!e1<>%kJdF~PeK%PCcxr^MaYJQX#F@#^Vbwr3!H8lwO0Q+H~UPVrnLq%mZ|E`J z0N8R{WPaNiA*dii?I>H^284DFmLhF?U@?q4xDD5EObz)lUfEQhG}O}}UcDC9!~ ziZyfQri*C)B8#rAa`@ca#60^#x2{7LFZE^@t+Bm4#FH}FHc3U|xHhpiwYAxaI}63w z?M4gyv|{bL>l(AL#9}ka6Cc;Yb!{A8?^KS#Fn#0azh%TvoU8C#I&2L4>guoT!zg!K?Ivt=%Dk!{*J`LBLe>womAH+I9@ zUnhifLU)_WT=K#g9mabY?M zlI)ZhKc!*0{qyGW=(AHid|@4bL)OhtK6#^x+>7BZrsmXs`mszLFw_lOS9;p_n=Gm& zTF>S;T}OtyOLo&$gKh8ebSSp$9bwoy0}HJ+JgN>7Il5XkJv%kNIzyVA$tTQBI<5oG zo}IJ1h25@bTE!}Zo2r9`Yu8@JQ3Ri^q8=Obj62UdbaT0aTmZxGD#W`l5Ue#Jx@7EC>7Z!u6rCgak)>nF-POI?^R#Kk7o!gty$SZwsp>lT`j&kt zKna;Jt-wBK<~cK)VXd0grZG8gMV7k#_t0swpZhLUYTanBn~&V?7q7qffOFaFi`h<#f82^4HifjwOp}f8 zZ0f2JZ(o3?NjPZH{rMM`HHNQ1w8quC=&N&KKO+xp*PTz_-kD^!1?Y<<3%Z;KN)!UD z^2DG<<4G`#_D(x+dv|r1WNvX<;>#%k^Rac|)o#=&VY|#Uo0U1!*REv^tJj@F>J-Gj z2dj;KHHFkT@)cxHu#>a(m@}h~>vjP=`s@@BKff$8^EC}4XB!@q+br59sKu2r+qh|a zVuLjwQEu;UmLMf(8-YhqqpEf6sL70CsVCM$mYm$$tCEom(f)to#}Tx=)1 z51M<@l~wvNF{xu5IdJl_F|d<)h1tL^7B@Q!P!IMB9hM+2yS=)KK80SpX|~3jl939I zt>P!+y%ZWg2yyb;nlfq5OlepG)jle&MBwI@r_9vCk{UfmMt{Vp8jJP-eF-TYN9*)o z|9$V01%iG;OP-{QqZzMtIEF@R_3h;vZWqJQ3>fBv{9!gOz2h1pbkph0?05=e*4Aln zN_oHQ_}pjb`tScl#T`$MnRGP=8){_2+cDdu%o)yoa~_y@#j{;nRklu;Q-EDIUJS9< zh%Oee6=Qw$*>~pveeQS8dj98@uxgcHAxOH*?~d2_yMlDRum`)w*tLQ0r-^z~c^cSd zN^ouLdX}gh2$nI~N1OKTLN|X`Ob9j z3_aLLTNm`fcdyxP-Xyy>!!~!B2P;lH?bV&8RmWJ`L48?6^-YKHqtDJwqut<$4Y5mY z>}%C)(RfvzrwZ1QBpmX`oUL!ScD~!$$L3;p+-;K*({>_XY*a30d6`u4;nM!}z}H_p z+Dn(DV&1g#-zFPLy3{dyzRi&+N8|DLW}AOWVmdXB)qJ zw(*O(*z9n!lfAvKm_n#^X=&ov#K1+qWmGsd-wo_{>x~|r9-$G|8!|^J8}n?o-B{Xe zER}32C-b?G&SvGaS$Q|ha~_wao0azTXv@=Thdo|3xpv#PaoOKx{LSwx^;6HJck zp3hc_Q#PhgoV7@E(@SO5OH*i_U^^QrXF{f{XuM=qU!9u1l8sA;8=ZbvMy30GAy}XL z?m6f*IxDh;OTJ)fY^-Y|o*sDmbY)o+pNvp3Q0*Koxvg&b=-gwn-^#=p!>i%-rpxg? z>mAR3!y;*;1niJ5P9>?_ka?RX`*WY2LdY35=sJZrEq9}t?aZYcWlexV@zIhD)MHBMYQE#SYX!>p`tfTQKL7DKJ z$!;VCG$(q8;)-n=inJP|g`$l@vXT!({KeLN9>4Zmx>4V2eBz#~2V5qd9jAF?tU7NFXQTqsc>Z8w2?=Zu7xAExvrg-?mT7ksEzm(fE zHj11c9hnPd?gLkZj;F9GN@82YT#bpKlScp0nD`vuzVqLXH{iI5ok`zD@EyR*mTc9= zK8{(+HJ&KwOXt<@wyb8o8>PX=C9PWYYZfeFRNL6u&Phl|t-8^XLl3p)Cd;FO8R74Y zLuE2a#bFvt#MYCO;x4n<6m}S~h_y*IWUnAv?L6+{U=W8+JNfLkIxLJvbC{_cuI%`f zQBH4~gp+2(vjm@};jBDnPRJ3 zlVX$<$0fqwKL0tDct<2DdRQY>zA~~9=DOhF>XQ}7qPE!tlhMV z2&sPVJtp6KjYprI`v3O-y{yUEq|9Q;O0N`!65Ya%dIe`k=hzzSaaAj$spK)kPU`8n zZ&(AC_gj2#vPsne_*clPHJ0pLM6z&GPL--)U(ME|Ox+N{D)>?~JM33IR_AK7vyu~$ zK{<3V)WV1bl$_XY-AcwI;7|T{O@HNo^@cdQWW_e2^TNe8@ob2=uJ)vYrAfavn|5>O ziyrpcRpaTg>6I>Gi1N)OY+s3`a~z_4DsH0Sm~094!>YcUE#9I>Hd~P%GcMONK|NiU zf?+_eTigT2XyfY~Fcy%9Ti7t{i=42elTbk8yw41CkTUep60Se}^X+x`?=GV`!JNqD zQD`u=LK^=e_eG5_UhL-xcUDAGlDzPv8HD%W1nEx3tbFHu8Qs|bu!OVEcO&)oHP zbx@zSWF=hYDgwaQ6e){vi&wmph-400qlB%zk z%0-#@bnkj885;#pdgHZbRAoxd`uzb-tNp!G`|+jua5m3jubD)28jae9N0T-TNhXla9D!F&>YxOjN|bwSQbvaenpF0EQ^VRGm$W( zb+wnTqy72+#oLGkVj*~il`9rzDjR~#>$sQGUYePhd7#8O;+o291dEK;hcjcOf$ZuE zLY>|M<#{;c%#-;EOA?AVj)8m^+sb@n)SlITcwR0Yp~C7JOq0M zt3)@G%&3n(JAY*G?SJ{*MgRMMTqpGXugjW8al69FniFSfg)x~MO#~Wa( z-}i?8^w0c!vpJ6@IWvnt_MLD17!QAG@e1dU6VC#AVD=S)>)LqrSXp}GtEG6FFMNAZ z%r3elqCFYzxIQX_7H?!C$FLFU*P-{a_J8~Ccc$MS{mw~1efam5Zk?KvMcQy-!*C%h z?9f)OV`Z;vu7})(TQHSKM6=~{`L!^6)n_BJ#lCp04;7R~s6i6#Wu4Mg|6nf4ZuSJWm&B4AT7B>z*@_RP=!Ot)DI2g;8+{_?MOUmIups`>It z>(yQ>NyZ%t6CXcid%pJQGxK}8-n`#&G>m{&2<(yzm54Tess zILaRlP75#$26+NHHW5$YxE$4w4gS{mzU2q}pfCB6KF7s2#Za`FTG$G;^7aP=2{xnIB9@JF959pK?lFAK9>Kl;oR4}Woa z*NyyxjQ9K(|MM>n+b8M&FY)9KZ{W$7D*f1J{=Y+u{{N-%M+QawUdO%z(~D=pYoG2> z{|~=w`#;(5<^!#qzxXe^zjPH`9m9GIGMCF@XJR|pow8)@FMUK3@HZMi`ZG&%lPft# z8QHPg(7sB2q+JY|tV%TE?GEVQ?6_s!Km4WDHb-m+B^&1+^22J!8za@^L=x^6yM*rT zOb?2+^J2>nJ@>&fFW+c9d|`FLEjQHNNL?};bQMa1yED5x7M5WDwS!&nyTy-x-?tW} z{-Zy;CJiBw9Xfq4BTR0FlG86Xu1{Pzf9AKPZwin8_VMtA#mKmd878wpsT;duR`QTk zZtT=XD~rGM2j&k(hkn2DSASipg{G?|c=b}cS*7S00h3ARg*4CPZl={Z9!1|5^tZo7 zsP6yZ@2&Q+S>+;YT19#i-u5fC$B;#WnK=Vo(gwZA%=F{mLVo_kf4aD2?j6pOl}*w! zV0T-vURSQyWV4ci)7_{S+5B!{yD?sKarI|^vwzbzK+nIhxM7K*-Ob6A%G4ghk8fhFgU98LY|h5nj*Slm)Oze(?}HWz2*sm+`=gsAJp8HE z5q>8tKRaoY6PxQ`eZ1J=Q0X#8$D9vjMvs#$OQw3B%%{xk;y>yNew9{&8|_*ncqCvOtxE~eI&X2A%+iuA7%o&c? z&f`Pn*hhUTklLev=NlhI?|A7ijLDDWhG~*Z zePe4cUP)A(V;o?c-gwSRRT!ipy#zZu)2xycplfYyp>@{&=;D4SYOCJowoP-=7%4?u(+^- zTVd8#*)~bqrG{-Yo2l46b=e~9AZuMGCBo24*PQTFNP?~LJukY~VYgo`4l4)UDxHkh4W)#HEj|>_R~UP+_UI3M zuv78jPaZSL6Nw2aC0Uv#c0PJ-w5%M*JYeYJ%xX@sDVF8*V`y!`(8dkJig@%rAMS4U z$9`tDn}ZUD%PhI$yMkX7Wejc_ZNFMqmv$M;j&;edhT_kKH8UEnj#)f|ha_N5oY zf$WJh6*g@7Ln-)THoLH*vtoAK6uU3XTGf*jtYJ(@o<+-8PbQrF&%%4AO@ zL{pOy^oL(q`+M!g@AxhLS@*9#?xsO8klQG2B$G?zRYdJZjIKWpZJhcI!xD)>&PXza zxrOv55!9Q;TTXx<_{r7WZwu+lsaUp5F|b~#QE7CXq)Zx!a1VNm$UV6d)DI5{hM!1EB;r%F8kWk&dWE!z~fmqqquN&T6B$m z(!fs(55PQGo(d%=Orh3fT~K>hSD@r(&)rXa{GQ=P{O`Wa-}MLhPycxWU zJlQrC&aaMa{`|jauLBbQt1pE)__ODp?`^z*Ifi?}yx`LWIhh7{jIbe>6~dxR%Su14 zYPFAcgSk+)vz3yu;@G-|-yAhBmGYNIj{o)XU;J9wfBrA~=Gb{QOuub2@rhm0-IBOd z66bTbFD4^4Mw^B-vp1=A4cTUPeMf=KRz4~1)JFM?F?7?W;5I3^i4)3 zS@dC7)y#Ekhj;4XrzWRQdCZwS7KS04kfsoMmav>D-UPlY_Wj2>yf55GCYbaRaKr+)4YO=RoXp>cOLew!D*D`!4cjJq4>{-)cD zTPf|(_Ds5&rB#1KK%UZYh!zT(Aib(-_dIS_DP&)W0vT(5w-D3ZQ2v`6Je#hvrd!6cFT6R z;Vc`85UtAU!lKI4UO8G*DKHB*Hw*guRrpI+VSn*gdf7MbRO3@txQjEBv?0cCmmJM- znBm&`_>F7TwNRsQL6A@EPNC85ov`NJ4r;7woOB@AE@^sZj`^8M^Pm3d*q@mj4q zy2)IyGguR8Z?wMWMKZIxlCVuUcUQ4FH0cMwusnYGI;;xLCX)qac56$h_c{dPF?b{9 zpp@`5%;&tWMs26A;L!)HR@IW5xsl8ab6G}KYvdL8UTJI9>w=i4`|#>)n)3{1XCx(` zxZ_ex$g{D_FeCbEb{&ibma`QabF1v(B$EU+S@*7$u7THd%Q#!>#D!@)JNGcIS|gop zJp=2X_=h#OuJfF2k{J2YLa;<<2kf~V@L7{;C#eF%(v68kvO=VEmKy3h8& zL!~!cX_!zN)GpN5;So|B7Q+I{=7c>vY2GDDh^w2<@+W_`+F$v1Mku^i`OSfx3X|1{ zjQZ+kW=0DXjn=9Z1887iVTP4#R;B?w>)q5vSIDAS1k~QfqMY5_f_zw2Z&vZ-ChP~l zu#oSZdAi)gm4b6uniA=b>+ou`8o~nE8Ym|zjT=ca$da;kYq{Do@61ZJvMzC0S7OTe zCb69iw;8`#XuZ<~sUE53S}id<%mLIcd+jDztF?sDo3OwXs5QDwr`9{XWPHjLOqSeQ z9BEA$jfCN?Q(0sl*4@DynzOmNy!FT=n>WSuC;veuCgSp1vRReMujF=5lYJW=OKCh# zLx{C?V_M;@F%+1TMECY1t*+t%h0U3Yo=lIhrtPmFc>xF4$q|ri%^v zM}DE6J-~MAoY&5F5v6vnkBfcn(78Sg(~Oy}P|$3&Ogn`g;!>xu$AtTdq0eBU1|j5R zb2cIR(p1+QEy6-3lamfz^V*qP*IJL%QCy-Y$IoV_vrKX)?Hh-+5@o{Y+2<-53rp)X zP<8`1wIo{aL(hEjRWLVn$CanVrW;&`(X-o~ou@zk-`DOdo)Se#bL+|lwcbrjBVuqz z*Ql~Kk}!qg3ec0G&4yf(GD2%tZ5_3-IYbvoBy+4c>GDABs9mq3cUge)W+LrZxH?*` z;$|{!WJU&ChuUapQWI&)hNtVUB+;C-d7 z!L??E+`8KdFx6$3d%{t*lMWeBgvL)9r_%o@NM#!>+TrOG6Zm92d79X0jl9r&&{k zGeLUZZS+K2rbPxq}hx;+zxFcaiVskXg0MqGiYpNRV<*N+|V{6?ONvr!{^Y6B7 z3AXB#TGeW!_Rh6swsU5xL9e3+wIN)>&2d&PPfg!NoegQQ^P5h5q{M8QMB(C%E^&?u zE1;g;%mWU49VF%6ZMIQp6UAotQBgm3>P@9BLno)DLhEY14l~&7r0ixT$#cf4k<((m zo{|)TL8IgvqZPR zQ!=kz(MA*6kR=5!ne9WZ1&8F8qJc6Oqn0PkZPSID>FV5_+j4pjnFe5aRDlh%a^n9Q zMjtZ3+6c==kAWsU(Z(7sQ#Ui6j+Ma5g!u;R3q2auOtEpin3dw<;m{?Qz}=| z3Vs&$mFuHg1dnf4_N!2txY%y&8BANPyxbP{8XRQY0kdw7hctma!cyb5LC#!7_bE)C zI08!xip8)!a!_`xj0&S&4$a%v5<5ai3}kpzuC8VDP+u!8!rTn)k2+Dl2>)vKgWY?RbtS+yQl>e}d@@G_GkVe86?gk&Z#bBS(^ zlT%S|nESX3#(=3gnaMJ;{JMNe#%c4AdiGIFnBB-vTbOmx!{kQFj=Pb2n1fI!B+;7n z<4VoRss^Xh1yjeop{}lOBitjqc^53z-Uy-=Zg93ZiCOn8u|ph7XP+FJWYw`XPD@0L zDGb{pQ5RA!rsd{FEXMtEQA?QyIzH<06(}lF%G2Q&?hyA@0-p z&IqolJT+*wn5RZ*sAOZeGwph?5Aj-a6q&otv2F?ryG~AV(VMgB#?H))V0G7Z3d%M~ z1$GBG94d>NtF_ zrMZ~Rv+WM1-I}?Rj{LG2QrI>IT!Lv**(CZTk{X>Ycg*-0T{8<`C+IBPR3p}k2n&;} zIJrv^!#J#)lQQOvd&%0v!h+NWR}yKYc|GAN8_5+R)P(n-?T7WIJy>XKRlizkOQ2Nn z&1`N7Uz=prbh=B7#EvXTcnH@?v`rs24`xQ5w24e2(`l?@0a%QURW>2e?&Kzw#Af`+Y|k?fW>5{i`ow%X7Q2Hp zOC*;L8g@#hJ6mDai+wVQt7LK?EctrokVWcl9Hr1G=lNgzy;J<)=hr1nPjK#}Q~OEn ztaY`^btOyOJ+&Gi=VHc0UWOHH1JotYvOE>*+l_gWAFmfZb)$M>p0Z7cqnexfZpXa| zU8SHdL9pQtoo5JM8>ll|jR7h~FlS=pLvMU&tcylXRZeO~?!gh!d{koT6`cZ7%qgW< zp0j*P^xDy0)|#N%=x%zt=yk!oxeatR1c}ZqzveZl{NNVa`CLv|F z*v?kElWWqfl`FtqW^s}V=45GG(1b+Lo1{z-mdwYYOgN^=<=IF`-jnr?;Mq zN*YFYU#Ib^%s!dmnN8wsGr|>{z|Imm2UVb&t*l%Bj6<83_=+lr9weR2@nYZ?zvj@r zt9qBLa~)V5p{{WPHg$q!q%^x&eMGmbq`Wp;ma12x4$7Ll&4MQy9t2A?DLP4wqm8@4 z+{Dsl&5R{=dTCtdV&~^udv)%$l4UuQ2}K}GCBW27c4`jA2v25nQr_he8uV@>TkK$IWa*!-sL3o$HYFU# z+bL#WRz}mMLC$9LWF8Z)VHH~k4OO_CPm|d^qs6R^?^Qvvl8U8eVZp?9Lz)avVqF*X zSAPE#nUy|*2D1p_*y$+YmP9k$+EhbROHuX>*G-zRt&5q}!)Xn@L z$Zk1T!NR^S_LQVoNR|NBY{O$MVc95?uxK!6N_L-)YqaPbtjRpPd=%e@>9niUp+l-k zG5IKuxtjw;q8}G}6P%FdveT}x2K{pb25|iYKUdAWEG1EjZ5rC1;>YV#D!46;y-cLg ziy51z;JOXVpb6nLE|V+hd^HKYYPC*XD>rL9EuhX4SXUq$1ZDpAXD2;;Vd;n_sB2>} zxG1&v z{{534{?qkU7JZ$?N=Z!HnN2A+x1ene&Wj=mot!Sg%u^;Ow-Qy$iCUTwZv8}F8zeh( z2R9mmRkj@aDRLOt+#oF07)ec&SqQ5g?-jLmT;_eukqU$y)vn%$Q$ru=4@)@Vr<#bh zXgQE)n>UkhTS&drJd?)ar?+OY<^jmftcnwd*<`Y%TT{K=No6TfBufz^>jE|`9DKO3 zTcei@$?({Zm{ly+{DPnHM&qt8Bc~* zsT>wsU3FC($4DGHx@x9HWoQ!~{jTY?=YMi3$(T!FlZ)+Ew3XWm?0XPZ^s7ogbi*@D zgEh)JD!`*lzfnhfqQXbOo>GF^Ikqr0h_y4)EzO40TWDlvMyr}fm@NbDQUK2rlRLe2 z))4(zr7k?5$QOMqK81+2sdk_#MIr|vTBh|wx)v);jJmsk(y51O%LMnO0TfaMl2|fiF+h2)=+l? zGrGrHfk}V$_fGLcKfl%__R-n)p!BZR4V4qh*ccCN)110F@6eaF;%kBX1%GlrjU%mLLJq0Gx{{yoH7&8)@rp2jqjcyM$e8q+)7s;etzkQ ztWc6!HY1h7?3p5C&vCT4tBbQ_HoFXm{h$d@yM?MoBb(znp%z$`+Of-GSY%Zfhi=rr z@q6FsNF8w8&(5c{!>tQr??LNQ1!^f!W=bh$X1D#A1DMu3v95~aB3EZ)MvgFDuCymB z^{`TV(@hK75+e&EhL;s2W1iUTV>jCRzGzz89;lxQ0CzatDUl5s~RuI!avcJlnaw7`Qsn|13c2+yP zHQ9xdVFLg=_Hbu)ah0Tl#LKPg60w@7CwG#np;mk6s_6ZVd4LmUic-wRTmhhVsSeEit#9+- z7(M#z8{hxww`ix|M(&7$M;h)tHfrYUMS_{WHTh`qmCClzu%6O9vy0|l}-w>@+TwJ8W zloAJ^MYEeK`KcZ0hET)l-FRw=w|j)Wz8w3AAA`_~QJc4H;JU89imT2Gdk zZL4gUbO2_cq~PVbYfn?Gl_#xnMbLU6ck1Up`=08k&cMD*8e7pporR`~NDPTm>cM&p z_Q>*ex5FA#Trp?c%+5tZ)`nqT?c#>QGo}+WQ#5l<&aH1-eTh}ZQ|s)gx>jSUoxpLh z@WR~$S)FaKtPxzeD$S>VYb zCu~!ghb@n_{Ys0X$&KWzg*w)oikUr=3itBNCK5M&;YlBjVlXU6gT&3FKQv#z#{>Z2 z;XhiPMxiNFIH!@lvle4HE7)0K4$$SwaNk?&6U-OZ@G?;Gv$5giAqKb`1kAO&Lm z@$Y+oQ0v1N)`FNpQ%TIb%+8J7I@@o-c`jA1+sb7WYjI&8Q?ZYE=rw|;*0|X;y|U{O zh<4R@xrOa}P$Mk<=J%Cv2#J08!dgHR<8+>Y4PqiOQ`l~@on0iXcQ{nEuN>VtZZl;& zaUW@az3}SVX#vF^@P~Pg{};|4x1%;{pZo6jmPS7OspXu`8Kdx)z(|E%nz`qlv$k;T zl_!#3P1&j?6q7te_iF2IBAY1_^kZeY?GP}C&;8+Vj7t2$pI8dUgxQEQB*W;Ngx}v_ zyG#zSr$^J%m5^v>v;5A)>|i&Q<))%4=15Fr8kK9ZH8Sq&?FuyU|G(X)_MlT6!k~-_CSAWCNFjj_F z!O`I+8<$hlSFGx*(RfLwtDK41NE2+Q&{|f#G&j9;)*@|8pD0c_pRGLiAZw$Y{{+m;iDX(vL-(HbY*#Z;OW|k2;34|F8KnoWk^$b z-^qV^`x`o!41a^}j#0Sl#$Ao}m=)t{o=uw#d9$Hp18+o$F-NweIVBCUvv)mm!fVsC93mxYPNs9uc6GI~3Y2GNpC~z52-UUo*c#o9*^C=Gjo=6z9{u6@ z_(8q^0B(J(f`uDr+?%moJ1!v6`_)->f9KJkYnts>AnR|b#j0)Bh>6Q3%xp;D6BsEzHcl? zJdx%Or{`~RHYRSO;xTMgFQ-D?Y|K)UN2jhUYpKM=#9WdtMgh*4x9%m|VK};c!1o`| zuMb~XK#UYaq4Z+AVJv5BHq>Ge3Zvu4OgXMZG+OU?fZ5E38+(bW1s~pP@AkZRJplmz z+-H&=oLk&GckQ-5MY7onXI{8FB~0shaYRiSFNHAY*u+(3RTel(Puxz1B*m%f8>kH1RwI$gOgI^%ebCAOme26nxrV6M-TJ=T zdgxp)!IKb=F>VO$wdkul#J~2&r8f3&*lgdUVh?WI4r}-mGrN&ENFN>)J3g~53=g-3 z#uHY4fyS@5m8Zv5SFMe^lsP*)@(SGoBU!SNX0w!8a8eJgkKX(4@m|kAg7ym4Xu58d zmzuaT=U57nM%!FnS5~dV!^;bIt#B5}=H1q(d*`kP=N5nNGwB0w0B?DJqv5CDGLhYe z!tdmtAcYi0T0|bVZS0grcNV*(@^mN^h)3_iiF(fy0N{r|?fw7yuVXF6^0B&BDS6S9 zx^3v%uT?F~Ncn^;GFFWi1!!aEH+zo@?>GJe;^7O6rA#)bs@U8YNr6Q-Olq7&*R7$& z)HiN5!|>DskvZ_ed7|$aX4ZPJKZs&x&cJ>*3!17Fu(yC|%QMOJ9p-jF%YJ5E?U%0> zUP*f$+@k&HcYXK?a2l17JS;3U64znqTG~Wtqsi_8_Yj>nY(OoWPiNeBXSL38Jy^fD z{b-DSGggUfH9E!y33ID5SgO|EsI97*;i=e$qG`p~$?Z^z)nu$c{AvH_V64P)nxWYm zH+f9{wyf%{acdi!tkEJyE4(?R*~~hNGS)l&%^9b+kM~^w0LQ9zsl>5T%q%>!-A+rZc0Br@ngxA!dV@`Nc4yM2bW7p-_1f)AZQ;xNsy#RAf8qCh zbSTs*9IK;BY%8Pn7sRX`_iWN{!uYMM{2HB0#9Agc^M;Fr9jT^^JF5Tr@A+t4(;pvo zlH|A!~Rz2Er1{PQ;5G% z=zGV)|KY#i>bBU`pZ)D0`QGuK0}Gj=zJj&tLc{Xxs&Nc@fO z{f#wi_|Ja1+x1a)xepG9)IyydO0**9J=PifqvNQ&|R?Q4jb-ZG{Rne^t-0lej`7}AOG*G z?Iz}3VppV87uwTB$EO1_&<*sC=Dy$H@jr(R;63XA0Ih32G(B6LPur|dOj-B;y`Nd` z0pE`JUBZ47;_UtY8{dlYC;nm0AH#N^3ZD5?@XWD7U|(HuKw^%kgXs7`z`&2 zU+y3HcX-dg_@DmsR*s!#SL3%ec&2r(bck1K7t3tVQTR@|{VI)rz{=&{{_b(xe)z&_ z@6ze`k;lW&uYNvr=h<`n#Mbp0b;{MMUwdWYr9-enIzzaB;kR6KlPY2S=T?CtoYUs!EzY;v|u?QA`GT&vp6%Dx2&=MG~5 zv{R}3R%Eik2fGBl*ZA_w@>H0tPz6uxk=h$=kdt+MT|ho$gi|SOWQ=xi<0-lfa>Y=4t!roF z=x!79@xbL|I`Tf7;XC~SURa#b_g$>1d*{+8?%=VsQqw4z9Qrv;VhkZUk2w$6W zt-@+VL9MNJR3|(QbVw;fKz<@I6f@EZ(lt6M$Kn5xPr`?vUri!Q6f@k0JzbHrTj0zf z)j&69$CT)1_U$?GoAbezx&+_V*d6A3M-a4v%;<=+bY|cizto9(;An# zN1d836L=Z)gmbx`^Ag{cGM{ndo*C2VY1jPlg{8dPgWqqoPN`kHXu;ef&LuAkU(4bq zXSUmoJ+qzdxsvUkL^8MlyK8QD%-Ie69}axz=Rf?(V?KenGH3cU6Ax%C$%rXi**KaT zS8g;Px-_+*30vu0S=B2vmQz3d#lsht&4+#eANyzBzy3r#zKpso(LA)M+Wyd})liyA zmIi}oU5PgAHoRo!G_&(^>Zkt*@Bii@DJN&Q&CEGza%bz#9XaP#?81xPx591>uJ*Ej zwRZmX8u}PHe*4AD$1ZmE>~8kmU;nZ`YI2|eJDe>u_nG;$&-~W&oqhXu@^f2RS$V<; zhtF|lb;WwkEA_xD%YoLL(yLG7Jul{O`C!j~e#w|`Y~oJZ=(|heeADg4EwRJ6ScB** zueQz_$%;+3DH-cxTD#o4uC(%EG+q@n!Lf@aL^ZSaULARF9)I%ZTG~!bt!v{w?oHyn z2YR}2eP}H6%=tX?DR-u2wI_!o63l60R)VN}B`Pluq8$QGU6s^t6plUo*(I@BCN#0- zI|oj{ZHo!OL-{qpuaUESHG$H{s8L!bU| z4SA=9JK8-G6B|BGvCkB-+|72a)ow2Lai~o$W5bT$WGi1%Ce3`j8^;j! zBqLlHJv@H;qxXCM!=GQAW|_o9;*6EY)@f-XZ4-W$NmIg)o!Ud4u$VJ(k+Jil=s|R- z2dJmIH11@ajfS`KHSoU8fe$~w_{~8sP;%rBJq^rzWK1EGU|o^jLZf1!L)_^y_R(mu z(oRaMK?QZTr(gOTHYc9Kjslv~uw|GM%*s3~^*9 zeJZ~W>JNWn)!Q`@{`@Z;?cqONoJ7&YM%gwV_Qk2&zjh-fXPb>VIg=8$CQHh;%f&9v zGtb;leEhEKVl$kg8smd)+}LGj&WSP&s&RSv!jexf_>OV10-XsZP{uV=c%~+{i<86I zDzF-GT-YCvI`lpekBCEbzO2T-X5|$IAa()@i3wK*mDBy^-G|%Bky43X`}+?o(321F z@B+3{tmI-vPLAPdAg$w1#EHi@{%f^$_U*`ZEF6Ryb^?}6Ol;VYxp?@6b^aqi^$lwk z88IP>!6x9Wi92hyPpjCcJo5>YU9^TTqOWjR-KIL(CzfoVxXIp+vX^R5uNT!9U+agj zzS{lY|B3nmLov&Yi4P+}NvBlj4XeJm37$-$rXDJZjlkTkPMxpaotW=#xjPMAa;S6Q z4u25SeA?LZ^FR02Igmg1Z*KJb|F9+-xT2KME}LD1^NGo5S==yQ^vMYkZYFJZrriw6 z@g~}tljMdH_g2`^^p)25dPCJlOnUobZ#fQ6R-hTPbh2HV=gB@k6+ThhFo&QkXzUqC zB?qRH*!@XstR@y2J%(?*;mk}tAkk?&VWA;g;hkNgKk(01^Oez0A(D*ACeDk|C+HDk z-#9FtSSk@=UYrby);M;@t}6X{r4uGE+)Xq0+_)PRkFfozpI)cuzvW^+OrSBqW#)cz zc{C$M$D+}q%G6({Bpcvn@|*`*Cp4f_8g7N2ozxuf#df68Pj8}d`&+%sc=*DSK@-l# zjL9Ggc1>)6y%JS{OGIxf>b7EhRpKC+m3a1Gw&K1|EwYS@wQK1^7p&)BSoqv~h?7nm zV+JOHn~}ygr1`W6dTJcclk867lVt8VcDXispkq$vyMkqO4tBU)c-+OL8~%yLj$kpq8aM3ZhFB9U0}%*%ftJSp*tj8C zSK&D&zTG;d8qvi*pka~*G|FxZD&xgh2h#1u(~N9pNx?;QcF}o7(xjlB`1nKM=Vr+{ zo^XM~u*sEt?4GG-HWd5LVe`o^khng%T)t!MDwds08DQHUz?8a<5jEDB@SQuK~;}&qj!eoruCeGZr=W+5HFuHYK z8+-^B6Oo#7Thxt{d%^g7>dw6d+wQRKEbF4K8QVhVGW`9+&k0Li4peL=>*)G zbBAmnXXTYZRl~Sr+Bm!HntEb;4v;1Qe#P# znkv^cJ2W^mV`nzfbQt}|-;|p^0alz5FHahGicM?WEJwb!9QCv}jyC?eX-HvwE|jy4 z&D*UdPlHE!R@gqf<-z@V&=Y`T5lb=VWbZ!t0X9b3B+g6Xz8ljfvDsy&Iav{wL#8sB zpKr~#vnBTv@LK3Ph&_g7$QgH-)Y-O$V_UgwolAp*yH)dH;fj$S{=_L1$~ZnW9XSmj z+_OnJn^J4oS`}@$wv^#`K(Zt=Bhq9R6TX`0!q1ZBXEv036KR*pvk@D!^~`N8SR3vT z^5=hg@rVDzTSK9dATTU3S>{=v`Q0}093v$h7Q!npTGgxBbW;-hsq4zR&>&ZUaDpj} zi*B|xBvWSwH=SXFCN!-g%8gSD=f zjN!{*K(d@Nd9p!FJ9c@mtiThDtEo^+A%=`_pwq@quJl7cx%6W(vyP=04(PkAERk=p zh^7_;CN-8#)|ei{j?_<-IcGq+40=r1k_33`sk4?Qh-p~Ag#?sWIX&}#&jG4jtjFF%k$ifiG&B|@;XReMc zNyNh!Rz3RcTP~%JF=K2ccGe+fHUYcPpb_4zx_(*4T|}Mn}m^rjk%`83wC})=}>^kg!;sav_6n#EFkTvP*TarUedFXl>Zd zK!?ymT|%uPCGts0HDg?#lwJV*z|U1vXG`LIlMR_)DG{@C=Z@=wpk?FntHoK){kLaq z-Yk68s;*BaRW>O8xD1+1VI0ggPs4i}L9X3;3{o7t^*$z?1WF^qgTAs@@O4C2XGVm( z#XdML*nk6z)nJQRnzN(SKcsS3}n2R`CQz%(!iL>Uzon>C)D^qaoJ=$7q(>8X-Y}-iOH6x|2MGIdI z*f-c5I+_i+)BnOhJ;WDZBbng|Z5=K;IKe?;Q0xX&%Mq6ZHy8?OqFY5YHIC8M8m#+j z>k`~tcRL&^s>e8-kS3wYhK6>;ng9IJXXY>6?t9BZI|OlTOoH4+bw}oM3imuzSXk(A z>x_~yZ$>tus9M%WZ*5o-nA1`+av`T74}1~Lnk~t==on<4RNMM z3bW@r_Dn@-lk5;u#W?q5&t_BYuvj+hZqEstJLhtmf>i@ie>dEYB<|VZ8Li$`COF$B zBB0(3Pv;tLVqgsW54^A%ri76VO3A|-HiD(CyecsZrsUM^Y$>v)Lnj4xG^r9OIlHrs zO&2?CY4rVp%O<9c4VnZ))19)hNm5N_?MME>+Vf$x;|*M|X4xYMx0Zs{I+6YV)84!G z%(kWFdDlJ0m~&Ru`>w;@yEolH5DwUJ99hJQ1fgw$;@?4}usSFTF-8fp6J#Y(68V!I z6HF2lIgz(N#6QC{*c@Wuld&K{CSW&xp!Z>|^&YBf&N0Sw=fkMgO?U6!>^^MEbgx@l zpI6me^DxFUp69y!ow;*pm19esBC$kb7fI@JB>UvbsRd_COJ9((!bQ07p@2Qz|D5ou zfRZ?5d0G>`Pukwha<`>G_rbPSPQ7ctRnjn^Q&J+5R1KTk}q_;CQcYUg3uVz>fn|ibt7e5k? zsYtus_*+EBy$v8(_t3*Sl+6IeZqSX;s01lG$w`Ggbfr{Qf=Y1aMCeEmT;C@@7aYUnbEQgJ2Ws_Vx)d=_ zO1p(CMy)&C*+nSVfIeD)7a6qy!@WnC&{YCteK#Z1~vf5FX>NDn5K2Q$~X=&)w>mdJ+* z9k+`duw!gr$elJs&clN{WtWRHu&1QYX@SyE=0%vOedrJ7$z>@dg>)`Vt0`(1_-tnb zZw?}BsMTdZCipG~cdGGDH$mf^n`^`U&eEDVbZejN`(60WHtA6mJ?_#XX{Q2-3n4rF z>5ES~dO&ndvOU3R3*#5nJj{>%`j)hM`J5tZytQJ=%xU)H*7TY4nG-PgKx?&=E`R61 z4A+Jwx2=+T5GTc9D|}0?{I)v1Hn!+w*>OB_8=3QLtRR(|6V3utohg!M?3BQ>xznh; z;G}6Ni9|{$Cnm#mId4ptr}4>R4=f6vd*css(0$OK$?|tjUAdUgY?%^AztyO-7GjGv2(YfKw zQ$&3+LmP5Z8VdzPA0R4=PQTy;ZJd+F+I`AS%0v%E8VJ7e{oBP#axwJ|X*V%dVkwk7 zX*bPWsgRs>Tt!{+dMHwEuq5&%Qt$XQ)Td}TI)hRBw1eD28glTV1)66mCDK;iTum0~ zddIX&lyzvWB6V*O7j%el&T^j6RM7p|2A*PmH{kPHFJOF*auy@lDPt+Cr=u?B(_a8l6w`s2$jf& zq)w-4v@4`yS{bNxNlb%L>NSh&$m~LLGQB5;MWt~gV<&dw2V+v>Sq|6J+S z1n84J@tG!`=ZKq}MNaGs>}$naM^59_8^cc)3>#i@ciH;rvsor-p47Y5?$2J=M&C`o zdbsCmNjx}Kylp&J@Ej{HtI0+w@R#Fgzq0a@r)frI1TOJ&`Zg zMcm|JMv;LoJA|MPR_245B~3hH^6aGZ8oCLyo-$h-6)Fxh^HuheftytWL6XKxz!JU7 zTX*e2TvVV*68lBdvfw1u7HA5y6w)D&+pu@{Xtd}EoXFC&qs;SVfIO-GuisPJkNnE| zG~>_2lyaZ-otP!EYuWgJm%_AV7%jbfkvUd(y0O30!I-QT+*mbSINc6N*~63WRRX!J8Gk>mX<|_{Z2_@9mYz>JfWSu%UD?Vv$_ba+z-N-~vg9Jt3Y+4AaC=R*x(S|I)sAM=K`ZP)T zQihw2r|bus*l(n*H=WLv`)XP*^#9}g=J>CFZJQ2?vLxnnW9zosSi^^qm7ts6I*vdw zrr%PTz3YjxN=+>qhLT8=1|ocGwBttaee^;p!E|7m7s`@V7wLRG$v^V*o96D6W>F_y z#ZIr6?wB`j^2}>fQZ5+@->=f9gq2mYv6^ed*p~>-sd-xxbH~TF@jMMt_>RPEbDp4- z(a?d^?PO`72No6WbHGG|e`*mfDnQLC04?w=02br0N1gFc}K!~e3Q);Jg zq7zitOB-Bb#;k^_M@uQXU8Mv32g&(44xrI?j5oZPCTt#i397 zR^d<6`IJN?ky5ZO-N!?ZSdw3_BHss}**5)lTlxJpV$GTQ0v+-{{`y&m#IklBbE0+O zjG8WuTs<7e%Er)Qg2|rz%1J(Cr*rP~oQ4*tfY+{PEzsRM^gb|(YV#GZEIS@7==mbu z>?hp4GHQKu?H!*3=T$vAYQu?AE1tB@YyVdEkNtAZTG%nC4^4@y624h_tdn_~ z6DcR}@@R|b$wV_S5V4D>X+W8gP0y>zp|pIYvr^Q z;;!=PGkWgev(@aUJ&zBwA5ANtPMw?MiMO5DUp7Ud(I3=l++n&d2Z&SgE_Kq@aUF}s zQBiI*jXtuTvqEw=>XsuCE{_j#O6*Utv{28<8B0p!X`-jiC%U^Tw=Lynhs zZGxT+#m-YOWqVI^U|N?xi+Ovh>DledTgU3-7ZcMm9JkIVpH}CaF6YcnGILfcS-DkI zs~s=4JcE-zZ-s|#pZ;xKK)AQbKgP8BctI7Y6kF!h?&5A%s)Tg*hjPQDx~Hij>7+NuDOvxl+eV z{PPJbZX4Tur`bD1xa!lob*N*5_(!4jUyrvXtZ&=+vBQa&D$ZCTU^E zsvC9I9Q532S39;B+?SDh$HtR=tLf=Rs-t+|Hvj9|-hO5HV8Z`s~w5jJmam1mo|y@E+HGVoF&`333LY)%rOzN?nSy>{EJhosL;-IlFx^F7R)Bbm{-; zKiZ-~MoyO^Lsq8rL<%_qYBxk0eNHNfL55CbO}jbmC0y;c<%=0*^w7UD5aHarpuTC_ z@6`Xhf4h9{cX)J2acVx_hu`kD)OkBLZhFyGM@zO(S?tT@>_L#aiPqeEyFITyRrJbS#%W>~ez9|QQVB8l#NtMC^=(SNO9?I>+**URi{83#TH|)k>brg3 zKRl$(=9Coe-9WL&t}ryRS0Jav-U&8&*G*WQA`wm$6%I^109Fa7%yPZg>tWhyrEQa6 zk0Za&#A~|Z-{pp1Quys?q{K2O9KvocG@dw5<~{`r07 z>BT+VTd?)ne=eauuUzdE%KIUU6XmJO98@$wJU#S z^e#f&JmPt zbF`*Ym}U{mQkmpwVb{%^;ncgHRR}>lEa-Ykk;iE7$baI|^5q0h69X+tp6<)vQC9xH-kMwYx>oWzKXqtQFXLczf+p`m%GOU+_78 zWy{z@lVr_L}dbA|m+zthW<)1%sbc=LI`dvv=RU){^!^`X+|#P%Z}(dTb~ANr&-ohx-eruj8B4r;F2+|&S(W5}I7 z$+{|@uQDw{H_umY*8akSOYM!m6xH{y1-e`Szr3bPH{e3jgehvCXp}HnqlaZ7$RL-D zry)G9TjShJRkj&Ii9roU^(&D>Jo)8S1O+r>&w!SM9wui?96S9y+{op6W;Z9&7CPTm z+FCEA)6suZ->(+v3;zFK*)D@F7APHxrX?x$W}m8KtCk=cr7Sc}*TW9+8J3T)AGyoSRc9Jq?mxM}T zM=)=d)Vt3ZoM7~Ps;QVmTFL0~c)uzk6~hxc&-Bu49Wxtg?}U^%a_HoJEx zjiH)Jz%(h%I~|lbZH;GZ^@+?-jaDk1_I|WLU-B7#X-fnpOgUuFug_lQ%} zx~Xg9c<%0f7#ri=oLKMc`~TdUj3$yM7VllO%l08Rv@h)DNsryF)#zlkZiYR2IMr&& zq&$%g)kU1L?xJXO)<)tP-RnR2&h$s#lt1xnEx&UYg>WXTNTXf;dS-t;`EiHCaZ{W& zP96$cp-Uw(W1}@CZ21;(1hqFl`d*T}#7g2B@*lAJ6NfFHeS3=h`sBwCb6gkuOy@ot zx2MY6w^g6L-?*)vqwJL!2NPfI#SietN9Pc1ukPiKJWzi1fy#bIm3%L8v~`sAY@WEk zI*|7ZE`==@-=>+93nvy<@BCF=`~YwKg*hUqJJDX5+z**ag3UU&phnPIryZ-#x0Tb{ zI6J%%R7~ZoP$GSCUcX9w+oR;eEJ)OTQK2DO(C0+oPqbOIY|hCXyQnd#YyRplei%N2 z(drRrb#7(fhIuQ@n-x7@?RU0BU9H;)pPbkt>1cEpiBrmKNOwxSy>x_(y^;_Id3sdV|1vMMBOJMXP=Z=CC+nZy_%R`naRLe&>ftxHq4h?{O~Sl z#2@+>Aw3Q4?jk>)ynB7}w~)AgtLgOY#Ivojjrjoj)~YjImu z*G@Q~$E5*ejN1%bFb04%m#v%*yPS#;2l?gQz=b-(} z2LKCx@~c}WGZCZ|#D3OwnfZ=@{km~`M$L(tqzbew*Xyh_7nWq+d0zeOnCX6y;~#vx zzN!bqWnO%sYSK8Lxi0K7-ron?dA#j?Sa|U2&aW@l@oDutPn&MTtXSI{Kltu%bRNar=G$Cbah&{)4^N-qWekJ+o z-wVBU7rc2Fs@)3Epq9ZQ!7K>yRun(;y&oKr`N?mr$yQ1ouCk_G_G_R=E!gfVcU#ut zEJ*Yu>Vu;6Xkxz;?<8~k*ZxHMnlYJUZu|lbNR%vRiPXpGcm}-8>|fvcwMU6%>wNO} zPkQ^*)ZX|Hzx;CakHl5{rC;3A)jpMJqO1+wo}zC!F_A#9QmHiHi>G_O=KQz6(ewwm zp(@LeQ=k%Jk2Qmxh?>>@_V<6VIPRbL)vAYADeq=-Yw*s=@w|m1GbUX(I-BEzkb?kx z?3Y#rqt2d_v`b-))n@{c!Z0Ga-R6l0+c(bt`7eKP+M<{F zW8>r{A<#Da9N znPs$0nhy)}JgH!!SD&eDGch}2U#sVC=AZp!mlBX?P@3v@4QjDg7_q7ap^6^!e!q{++i?&iTzTGdH7Y2N)B(!zNnZ7f1 zo|${595>e5QLLP~@`t%+#jKZRt$(E=?U(u2KVSL=C|r?w2m@0WfvG$X^IW6dbjCbb zSL=MHozK)}h(fAKY?4lcFOt?~-<^WnW8@$HhwJ+)xk{7)Xq5&aZ_I#}pkLYNhsp71 za@r-71rgZEUXr<<$X7FYDkwp4<|zw%GKE5Z^6T5nrO?ZKK|Z%Ec=C&zoVb$wtpxef zPrs5dsHMVH9`d|>uWS*%RpJEdOiqYMs4o*~o;f)1y7{de_ZBJ+qvAJNR!R7g`AB$uc>?~SLJw{qcF@<11&VN{`m zo9T^+u}+^#)|@iMdI1U~1A14Z`WP}_K$8X%ahE3!c^N(TEr^?qcHf9?bY8Y{8CTva z?e5HaTUmP$CE*G6vgeRQ5=shE_JvyXGB0yUg3sZX<(l9-mlw9CrNSKzC9nQ#0E z;D>)*N-uK3_RK+tgHGp4lg~-_AbPO0}GZUq%K;5~QNJ z6sBZXNp28ZV|94L@(}G17b<7D9I}mZzo1}J$;>IyTOVp972HiK0>bVcY^9R%ZpJAO zX_Dl5H>W9OJvdkETzx7tkux=!<5t-|h~D{^`Qw-LpvU?T6c2@igKeSwS3V?>*IP@B2TaQATU9j46gdh-5y8UhSS7Z(hPS;-(L2`N&- z%LLOz6|8OJSXY`GN|1MxrfDI!JT}}hp5;m+&y(h>ou)i7+w$5h8|8$B>_AyeMJ&5S z`SD+SSr&a6C?vne!b7^B)w5Psw$_a$TST_B%MJ%lpfs?7 zE-so{w`uNM#3?7`)&}Y}4|a_UPIG(zrP-JH#!a~_KR(RFMD^RXYipe~u%n+SQQLoQW79uS5)Pf+nR$GdfpuGSNFh#-)&$ zP;}xvR5ohedEJPNEP>1<(eqHq#I~VssVA43y|{BrcXg!=q#)fv_e7g70D+(QzqjuR)jO zlu(vtY!Z$ssU%2Ka*)X-t4F6sRkKa>Awq~mSVQDc5;|nLl;mlNQj$tw_n@zpehQNp z6d8H4*zmyMAtj4Y03qQl(v&D$lWfyA&UBz-6<#oQJXT|P3*3{O21@*8zR6Q^2-~OL ziAxQ}GC57`uCqbJeZr^eD&+m5oD->6)Wh^{DXF+a5ehj{*5Hz%#08$P6tY201C70( zlppLA74<1w%dET$CfmuKsAqcYNKW8{6&@Ro&~Vn9O(=3f88a27b{Wp6(d>)5Et46% z^%$;L(Xf)R&RQ5}QX?qo}~y7f>X#lXoz zNpdRWBuW<18+{FjliFdH_LG=||N5UTFYkbF@}!^qQ@I`rHv1@yKP3zm6*1!4ZzmTBz zx4w7s)h_j`ecBF(6y(&mkhe;!l@=yaf|8X>rYI?)v5jrr?j1##2xxtjjBFAKk>S`} zpP#)+tji>S==x=6^vhhD;r^RHUFw4!=U%ys?h|<9$R|kHnc|gG4f466+MROJ!jQ!c zIbPzz_Gjur-Ws&P4IpFW4QWfForC(n{J`?AC$N9zyHhL^^=hYeo>SDowc*q1x>jlr zn6lGuR#|3p${KcFA!8Ymv0Asb4WbT#+aNYOo}HtS@9L7b|#b*0;O9uIUkK$#3mN?^GvsoBK4(Scv)n>%0j zB=pHIoQI7oGh^p$<$30i#7y9Ixfj4T_emJGW|#fg3nZ!M@AzTt))Z~XbMjGg&o zzq0B6U|bU&sM zwAQHi8~whju1&qiXmO|}IZ-38F8(~lN0##)>c{lPBz!w(Wa`6u(&^~w9> z=T=cjo+M-`aPHzTNmD^B@J>cO2rK@^N8i2L^fE8=BL6>>?@5j^gF4Ir0000