From 64e62545a502e4a475c39cb39289e17bdfb8a4fd Mon Sep 17 00:00:00 2001 From: Regalis Date: Mon, 11 Jan 2016 21:31:33 +0200 Subject: [PATCH] AI using ladders --- Subsurface/Data/SavedSubs/test.sub | Bin 0 -> 11445 bytes .../Source/Characters/AI/HumanAIController.cs | 32 +++++++++-- .../Characters/AI/IndoorsSteeringManager.cs | 22 +++++--- .../AI/Objectives/AIObjectiveGoTo.cs | 2 +- .../Source/Characters/Animation/Ragdoll.cs | 8 +-- Subsurface/Source/Map/WayPoint.cs | 50 ++++++++++++++---- Subsurface_Solution.v12.suo | Bin 837120 -> 847360 bytes 7 files changed, 87 insertions(+), 27 deletions(-) create mode 100644 Subsurface/Data/SavedSubs/test.sub diff --git a/Subsurface/Data/SavedSubs/test.sub b/Subsurface/Data/SavedSubs/test.sub new file mode 100644 index 0000000000000000000000000000000000000000..183ff5b7b341af081397cff7b47fac01836dbc80 GIT binary patch literal 11445 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 P_<#FPiKANPQqKVZQ%pdZ literal 0 HcmV?d00001 diff --git a/Subsurface/Source/Characters/AI/HumanAIController.cs b/Subsurface/Source/Characters/AI/HumanAIController.cs index b0dc59834..33254c705 100644 --- a/Subsurface/Source/Characters/AI/HumanAIController.cs +++ b/Subsurface/Source/Characters/AI/HumanAIController.cs @@ -58,7 +58,31 @@ namespace Barotrauma objectiveManager.DoCurrentObjective(deltaTime); - Character.AnimController.IgnorePlatforms = (-Character.AnimController.TargetMovement.Y > Math.Abs(Character.AnimController.TargetMovement.X)); + float currObjectivePriority = objectiveManager.GetCurrentPriority(Character); + float moveSpeed = MathHelper.Clamp(currObjectivePriority/10.0f, 1.0f, 3.0f); + + steeringManager.Update(moveSpeed); + + Character.AnimController.IgnorePlatforms = (-Character.AnimController.TargetMovement.Y > Math.Abs(Character.AnimController.TargetMovement.X*0.5f)); + + if (!Character.AnimController.InWater) + { + Character.AnimController.TargetMovement = new Vector2( + Character.AnimController.TargetMovement.X, + MathHelper.Clamp(Character.AnimController.TargetMovement.Y, -1.0f, 1.0f)) * Character.SpeedMultiplier; + + Character.SpeedMultiplier = 1.0f; + } + + if (Character.SelectedConstruction != null && Character.SelectedConstruction.GetComponent()!=null) + { + var currPath = (steeringManager as IndoorsSteeringManager).CurrentPath; + if (currPath != null && currPath.CurrentNode != null && currPath.CurrentNode.Ladders != null) + { + Character.AnimController.TargetMovement = new Vector2( 0.0f, Math.Sign(Character.AnimController.TargetMovement.Y)); + } + + } if (Character.IsKeyDown(InputType.Aim)) { @@ -69,10 +93,8 @@ namespace Barotrauma Character.AnimController.TargetDir = Character.AnimController.TargetMovement.X > 0.0f ? Direction.Right : Direction.Left; } - float currObjectivePriority = objectiveManager.GetCurrentPriority(Character); - float moveSpeed = MathHelper.Clamp(currObjectivePriority/10.0f, 1.0f, 3.0f); - - steeringManager.Update(moveSpeed); + + } public override void OnAttacked(IDamageable attacker, float amount) diff --git a/Subsurface/Source/Characters/AI/IndoorsSteeringManager.cs b/Subsurface/Source/Characters/AI/IndoorsSteeringManager.cs index d4b0f0b95..9ca539095 100644 --- a/Subsurface/Source/Characters/AI/IndoorsSteeringManager.cs +++ b/Subsurface/Source/Characters/AI/IndoorsSteeringManager.cs @@ -88,8 +88,8 @@ namespace Barotrauma Vector2 diff = DiffToCurrentNode(); if (diff == Vector2.Zero) return -host.Steering; - - return (diff == Vector2.Zero) ? Vector2.Zero : Vector2.Normalize(diff)*speed; + + return Vector2.Normalize(diff) * speed; } private Vector2 DiffToCurrentNode() @@ -107,15 +107,23 @@ namespace Barotrauma pos -= Submarine.Loaded.SimPosition; } + if (currentPath.CurrentNode!= null && currentPath.CurrentNode.Ladders!=null) + { + if (character.SelectedConstruction != currentPath.CurrentNode.Ladders.Item && currentPath.CurrentNode.Ladders.Item.IsInsideTrigger(character.WorldPosition)) + { + currentPath.CurrentNode.Ladders.Item.Pick(character, false, true); + } + + if (Math.Sign(host.Steering.Y) == currentPath.CurrentNode.SimPosition.Y - pos.Y) + { + allowedDistance = 0.0f; + } + } + currentPath.CheckProgress(pos, allowedDistance); if (currentPath.CurrentNode == null) return Vector2.Zero; - //if (currentPath.CurrentNode.SimPosition.Y > character.SimPosition.Y+1.0f && character.AnimController.Stairs == null) - //{ - // return currentPath.PrevNode.SimPosition - host.SimPosition; - //} - return currentPath.CurrentNode.SimPosition - pos; } diff --git a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs index d1f771847..39a40396f 100644 --- a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs +++ b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs @@ -55,7 +55,7 @@ namespace Barotrauma protected override void Act(float deltaTime) { - if (character.SelectedConstruction!=null) + if (character.SelectedConstruction!=null && character.SelectedConstruction.GetComponent()==null) { character.SelectedConstruction = null; } diff --git a/Subsurface/Source/Characters/Animation/Ragdoll.cs b/Subsurface/Source/Characters/Animation/Ragdoll.cs index c644a2548..3f79eead1 100644 --- a/Subsurface/Source/Characters/Animation/Ragdoll.cs +++ b/Subsurface/Source/Characters/Animation/Ragdoll.cs @@ -794,9 +794,11 @@ namespace Barotrauma } else { - correctionMovement = - Vector2.Lerp(targetMovement, Vector2.Normalize(diff) * MathHelper.Clamp(dist * 5.0f, 0.1f, 5.0f), 0.2f); - + Vector2 newCorrectionMovement = Vector2.Normalize(diff) * MathHelper.Clamp(dist * 5.0f, 0.5f, 5.0f); + newCorrectionMovement.X = Math.Max(newCorrectionMovement.X, 0.5f) * Math.Sign(newCorrectionMovement.X); + + correctionMovement = Vector2.Lerp(targetMovement, newCorrectionMovement, 0.2f); + if (Math.Abs(correctionMovement.Y) < 0.1f) correctionMovement.Y = 0.0f; } } diff --git a/Subsurface/Source/Map/WayPoint.cs b/Subsurface/Source/Map/WayPoint.cs index afeeff74e..3ebce3b5e 100644 --- a/Subsurface/Source/Map/WayPoint.cs +++ b/Subsurface/Source/Map/WayPoint.cs @@ -7,6 +7,7 @@ using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using System.Collections.ObjectModel; +using Barotrauma.Items.Components; namespace Barotrauma { @@ -27,6 +28,8 @@ namespace Barotrauma private Hull currentHull; + public Ladder Ladders; + public Gap ConnectedGap { get; @@ -71,6 +74,7 @@ namespace Barotrauma this.spawnType = spawnType; ConnectedGap = gap; } + public WayPoint(Rectangle newRect, Submarine submarine) : base (submarine) { @@ -252,7 +256,7 @@ namespace Barotrauma continue; } - for (float x = hull.Rect.X + minDist; x <= hull.Rect.X + hull.Rect.Width - minDist; x += minDist) + for (float x = hull.Rect.X + minDist; x <= hull.Rect.Right - minDist; x += minDist) { var wayPoint = new WayPoint(new Vector2(x, hull.Rect.Y - hull.Rect.Height + heightFromFloor), SpawnType.Path, Submarine.Loaded); @@ -325,18 +329,18 @@ namespace Barotrauma WayPoint[] stairPoints = new WayPoint[2]; stairPoints[0] = new WayPoint( - new Vector2(stairs.Rect.X - 50.0f, + new Vector2(stairs.Rect.X - 75.0f, stairs.Rect.Y - (stairs.StairDirection == Direction.Left ? 80 : stairs.Rect.Height) + heightFromFloor), SpawnType.Path, Submarine.Loaded); stairPoints[1] = new WayPoint( - new Vector2(stairs.Rect.Right + 50.0f, + new Vector2(stairs.Rect.Right + 75.0f, stairs.Rect.Y - (stairs.StairDirection == Direction.Left ? stairs.Rect.Height : 80) + heightFromFloor), SpawnType.Path, Submarine.Loaded); for (int i = 0; i < 2; i++ ) { for (int dir = -1; dir <= 1; dir += 2) { - WayPoint closest = stairPoints[i].FindClosest(dir, true, 30.0f); + WayPoint closest = stairPoints[i].FindClosest(dir, true, new Vector2(-30.0f,30f)); if (closest == null) continue; stairPoints[i].ConnectTo(closest); } @@ -354,13 +358,26 @@ namespace Barotrauma ladderPoints[0] = new WayPoint(new Vector2(item.Rect.Center.X, item.Rect.Y - item.Rect.Height + heightFromFloor), SpawnType.Path, Submarine.Loaded); - ladderPoints[1] = new WayPoint(new Vector2(item.Rect.Center.X, item.Rect.Y - heightFromFloor), SpawnType.Path, Submarine.Loaded); + ladderPoints[1] = new WayPoint(new Vector2(item.Rect.Center.X, item.Rect.Y-1.0f), SpawnType.Path, Submarine.Loaded); + + WayPoint prevPoint = ladderPoints[0]; + for (float y = ladderPoints[0].Position.Y+100.0f; y < ladderPoints[1].Position.Y; y+=100.0f ) + { + var midPoint = new WayPoint(new Vector2(item.Rect.Center.X, y), SpawnType.Path, Submarine.Loaded); + midPoint.Ladders = ladders; + + midPoint.ConnectTo(prevPoint); + prevPoint = midPoint; + } + ladderPoints[1].ConnectTo(prevPoint); for (int i = 0; i < 2; i++) { + ladderPoints[i].Ladders = ladders; + for (int dir = -1; dir <= 1; dir += 2) { - WayPoint closest = ladderPoints[i].FindClosest(dir, true, 30.0f); + WayPoint closest = ladderPoints[i].FindClosest(dir, true, new Vector2(-100.0f, 0f)); if (closest == null) continue; ladderPoints[i].ConnectTo(closest); } @@ -373,19 +390,30 @@ namespace Barotrauma { if (!gap.isHorizontal) continue; + //too small to walk through + if (gap.Rect.Height < 150.0f) continue; + var wayPoint = new WayPoint( new Vector2(gap.Rect.Center.X, gap.Rect.Y - gap.Rect.Height + heightFromFloor), SpawnType.Path, Submarine.Loaded, gap); for (int dir = -1; dir <= 1; dir += 2) { - WayPoint closest = wayPoint.FindClosest(dir, true, gap.IsRoomToRoom ? 30.0f : outSideWaypointInterval/2.0f); + float tolerance = gap.IsRoomToRoom ? 30.0f : outSideWaypointInterval / 2.0f; + WayPoint closest = wayPoint.FindClosest(dir, true, new Vector2(-tolerance, tolerance)); if (closest == null) continue; wayPoint.ConnectTo(closest); } } + + var orphans = WayPointList.FindAll(w => w.spawnType == SpawnType.Path && !w.linkedTo.Any()); + + foreach (WayPoint wp in orphans) + { + wp.Remove(); + } } - private WayPoint FindClosest(int dir, bool horizontalSearch, float tolerance) + private WayPoint FindClosest(int dir, bool horizontalSearch, Vector2 tolerance) { if (dir != -1 && dir != 1) return null; @@ -398,7 +426,7 @@ namespace Barotrauma { if (wp.SpawnType != SpawnType.Path || wp == this) continue; - if (Math.Abs(wp.Position.Y - Position.Y) > tolerance) continue; + if ((wp.Position.Y - Position.Y) < tolerance.X || (wp.Position.Y - Position.Y) > tolerance.Y) continue; float diff = wp.Position.X - Position.X; if (Math.Sign(diff) != dir) continue; @@ -419,8 +447,8 @@ namespace Barotrauma private void ConnectTo(WayPoint wayPoint2) { - linkedTo.Add(wayPoint2); - wayPoint2.linkedTo.Add(this); + if (!linkedTo.Contains(wayPoint2)) linkedTo.Add(wayPoint2); + if (!wayPoint2.linkedTo.Contains(this)) wayPoint2.linkedTo.Add(this); } public static WayPoint GetRandom(SpawnType spawnType = SpawnType.None, Job assignedJob = null) diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index a2b07312730d929e822e2cf7aeddbec847837602..1618eb35415ab4fbb3768048e41bd2b559b2445a 100644 GIT binary patch delta 15536 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 delta 13150 zcmdsd3s_ZE+COXG&fa?+@PJ2DL_8uQDl&+qri2G1Z=oWoc_HsQ<`osq6y@MOGX_0+ z-lnlabB@-SgIa96e0C%=H8aM{d>Y2cF)K48$4t%O`z=t@rux2~|9msg^WQu_-gVz= zz3W}S^{%y#r?Qi0O{e0-{!-A5#}O2ik4O_lYiet2MXC%;0(!HcpicmimjHPc$VTR1 zU36r0Gh7*Q;;u(K=n1vYFS^qne6$|J*xUG!i}f6WSO8JOPLv|8qZ#oBb&GaX&=s zH~S$*y@Uq^Ed^Ep%K?$L5^@#rD6krM3|Ip^4io`vfnq?EU3Wu@@K3<|R#?Z~>%*q8 zcA4mGKXkShia4j%t9TE>)xcZ8DC7kJpR3faNQ#mqiTV{u2?d*xTnYRa$|M1YfH=_( zo@mIfz-6TMg?u07+9DhV97i}EX&iV3@uvY%rw3#(@CV>1uo&e;dK;8mjqo)CA6R;a$FXUH{FMD5lw}*KTUX*~? zROVgWIM(aG9I-pKNqN)YJ5~b)7fH<&(Q%3|k|Kj8R4PX^El{zRh7?Jyes&dn4(s`~ zt3X)fe`*zoLH;{ef&O!=z;}?v?2bvURDb1i;PuM^Gb2{d!@MDdxQ*!D$tg!deSO#) z1`{J3j|sfBwCGYFHqc;Wkv92`^t`@op!W@_BX5IVZm(+*wVu%j?jDeJV9~Ey0c@K0 z@uOWLBGJfCo4ohb(TLE0wRQ6!tUHK0=4(B6r&gS9MJ30XLR-@1EXq40XX!#Ay>1`4 zb?J<3XI@VfCg5_V>h&~^rs!+(CZP+ubWI+t486TL<$WiwAq$2hi>n#m6xlmLAT0dteC^B5}}dkU?n@nXmg601?!7(Tx^$e`8Cybyli5rw_Y^B`>6<3cmj)=bV48eXX;){U zH|U-6rptq=&jh6_ZF)s(W3`c_?;BCf1on&(ln*{E0B*g}x>Tmv8Ff6PHn*BbNPlnS zFUDs4_in5?xx2GqDt$o@x7Ut%e z%5`Nm6}Q#x4O$&tG-~yyk@k$i(M4Vgjj@kVd{#Y2)AHUARU+`QNj_Hz+RyT!{o*+iRK<*EebwCsV&HT74ok@ zbJRWynS!+Sz~cxD;`}4zT%Z}!9t28nr1ymeLlOT1IES2NEQ?v^jAb4K|~k;x!z%Mp&^L1M9~c7ynt|H8s1QD)p;+1I+E^2)=Y$* z2>T$9L;eHu8svB&AK@L4VJOEL?RtkrxBm$79Hb9~tO2$mYy-YQ_*?XBFyx1jHE?xn zr%EiOth0QEMcj1kuAB9KhKSc9EOT1?q#SF-D?8*ZOcBo5EqhW+@rspn z^=;Pd-#96vi~q7o5i|dblOo>sZ z+M6gDl-EXC3k{18hudO z#Oh38cT9K<`1go(iu)!g8M;^rZSSl)K^aIrCnyh5{6wX(5fq19aiF`c@rf8p9f5u* zo$BE0r{qa0r+NL98tFTe=G~_Z(8V#W`|Xv~Yp_h+`$%GYE5?*7ZS|u|lut3gQ`YNS z+aa9-F{feFQSzx!edWp+m+Z{nRSscAlr}_}OIaiA zCV56lD;ktfn7N_L=I0-k#&-&TeoX|04wo8HyV24K(z+@sR!SdvzikUBE?bW9)vXa- zu4HT+u|G=vXw-0{i8X$P{FIHB7f7LNOLVL05+#Q@{_?wlryrW}R`~-!2Hqe}=Xt=xz&m*J+mOOg&Vo%U5Z{GxFUV)TciG!yuSIM$YED4P za)e)l{3DPC{27P`oXD?0UIDNf@xH)zU?(8P@-bv5lo^KnbIiNL9zJFQqMd=pzID(C{~K)J6W4aiT?(N>UugA7O7BtUGq9?1J3MICQU_v8W*IE=(X zG+c?ozehL(1qK6|(ElE!6Vir>IOI!+Zvx^GN7dSikQb1C32BFc-yr@G+9^TW6`&i^ zY)Ctaw0y+B0wNLLigZm1@_rB;93k2%MS6Rri?9oF2;xJTRpXVVhzMD$&k&i~ZQ%|Y z%{nMGTwAh|UJOX{hh!qJKQI6o2xI|+fNWqaFc=sD3J{sjiqOtf>;fc!A59}Fmn{_>XD-^x5Hzi6ZAFU&A2EMK|6{3m6* ze;8cvvvPxwoh6M}=dDno7?XH@CGXU84xGfxa=`HIS2Dc&r9>-lzv5xGbX;8MA29F2 z)@`jANvV|md5T0~mO9EBr7N3*9iI*C64w9v)ZabOXY1RRX1|vlwY=2-9%ma$Og9bc zX*8yiA~nM5*hG0Z*tbH-(*!3SFlfOFPF4N2 zR+ihX1dLzSw?9*9^8bUqmM$T!v zWy^iMcETJQo5P$|fuQH%b}>%@SjTM;S^{kMOt$`aNF1vN-L84;KZp#)6{C&<7o5pLn)J=TG4YK zQ#Qs{j{cU$9+JZ8jipi?-Tk%vmN+Ee^iyWMsYW>V{XOt8k0}1~p0@2bPr4}0t?%oL zOXN((=2KxQ8c!)xL#zi@DbK0?6IgMBmYWT&hQ-R4p>SP($wOpWb@jb759!t*zw&49 zGnEG%JLVNNf7$ukd()$~JhkjlGo{{>$TyW`%y(G2#MaX{hou7T8VodI1TA=5>Zdn@ zt-8c|ym={Udc{EcJ6wK?5wXT{EhSxIkyhjZ zGY|`?_q~VR4ip{-#b!F1NPoz{S zJ6pI@ptd7QK=vQOv?nSq%XLwyV*jailKd|umvJDIpCOlKwf{?}}ZHaT86KdZBwTqht|0Ucm{7*;Onh7kHV#=9IUkW#F1#rs}DQ|?7<=yX0q)Q0s z%aOP0&is+mcFR?S*ZD>$F0X4Q4ogj>7R+FaP;S|sWt&Qay$7A~_SrCRvH6Op?6PuQ zQp5;+SCz;{Vt082Yoi}*9=|E4QH*hb|3lRBzAo~LSfS~}z zA5!9-BM=$}3^gr469mXS81AajKD2(b7n;ihWwHOx5SrC@X5Cc3P&ar7VIx z;|-lIbkdzx=WW_yMo~!y%x9Md^ATh?=b#k2v!r4DVN3W<;&64l(=!e8CDMQ4uvKqK=o9E>^}S?KR0?qbQV=Y(T4u?KtzgQk<0N zHZ&_@hV3jqr(mB%f38iT^f@XDYwGddbh@G8q|A--JZp8HZ634Aqt#SS zu0KP;y@snJGMcVK9l4;o=-uaJ2NmzbK#zQ=Cfod{Y!YQ{ z)*Y7PqOBU*RwWu&E9F|bmu$r#3N?z7F58kR_o6)6+IZPEf%zp(ql>Z@MHQQvlX6>` zk=B4Kwq3X~_Nm#lK-cVWOSR3R{%f{yDxIv2vBreyB{qKqrYr0_o?snN~H|=2LoCCELo5)pso@mHMHYX^Jwux)nTPPsh(rjjCif830yeX$&^3pKEFp- zDD0{pLu0eHcMKj*Qj*t1*qD!OFwN;VpClc=lpOh zYOj78r-0QucEc??u3OVL+51sNw%tV+9>vih|A4+srNCCb4;5EJt;3G$+u*&J<}h+^ z!#%;|3N#^(KSn{e3=66azj(22fU9GO$ z^n;9CNoFiL256CVsn$rRz-ML%WqEOa-13^9!)QsR9!^JIFq>EjRYJ>4MrycVKcb&U zFicOTige!Cy6?RH67Jrw8AB=1*mRO>xE5}CD)c3c2JhE1$umGrrYD{=?N(8>K3k@C zYmEe|8lttML`#kLomHI_|7WusCAQTZl(Gi{xO`1F86C?v(amF`o7tv5fW{2dQmr*7 z^m&YmAJp=##UF}SUEQOT7OZdWfycO1rqHsR@dvO>OYIIZ~h1RTDllBivgNe zW{v(Lqr}FVNgMm)ompcw-5XdQXZ2HzGQ77JOQ0TG|{ zy%_0lwIupoB@BPZUQ@IBgcy4;B`@pksCcOsK@G04C~I7V@ie0`S9Q(O(v54(e@WQM zew>;jdKn;uE4s9y+Gs~(W^3^;4K<#ZsUptsSRT#rF#iYxw`C&@xTAJ4<+`y=rK&?F ztjA$g$uuq=ESoUSztSOO(uZ4dCTFdwX zYinaF*vg$^1YiMQ>q#``eZyg;Pcks1i!-rsVp5GtnOq~aQ51N|XhKKrY!&m_W z+oE?SN4$}2P3dF!I4zmSqpA8;)lRwZn-Nx@$wCFES8KT78*Btr%6`v;u}v|Kx1hiX z*luC~#GkXy*kU8;YpGWq#SF`-8&`WHl>#d~SK z#xa?ah6sHX34JBC=WsyFjWeO->Z_%K5%oxGgkt(JSF>!fw`?SYs)k{I8W&+=7OPIF z=~jBIiIr0|%D~i5Q^KqfNvPy6hHe8N*y73YiPYH|w@XZV)*wxx;$4_;N3G3iMeZ@q zz}WtxLm|hF<83KA*9HR0Hp^kweeAugUNy!ms$Vlh{F6<|?=&@kq^ZzpkJ-*@H^n@G z$=R%TqrGBLX1dH5Ra)~JR;r`B?x5V4aiSO#XO_sc?kyGeG0nsWyK&P%{qbgnN{&V{ z3@+I`+t@$Dlt}utT(;f}Ft(TWZ7^HPN|2LEpHrQhdm=9BawxQ+*#lhz zZ%vtPg65p7cvs@9cnRf_*_&pNIhpd8@s=!+O2=s~I`ysUkXg`;*tn>m^KgMr^Kaw|Z7wjdR~4B%7*+pGpI}XR+T18p$w|!BviJ4;ACWzQ>=nvb zh;wUkTO-Fx+-g=t`mex}_QR5nn2xdk?~h5eI4t$;Bm=mb^V)pP@!Fq;NrZ=S@Sa+zm5+~4k$(mdY%f2Po=~~ya7G9 zlDF~=;UUyc=iAr|w{ke2F){DqnX{)(pE!LSja|uGunztU80m%Q`6HBSaLqpHq4~2X z&YJts?1|GSlE=?G(C_CcA?&AGSCpWP=S17Hn%-V(Mqa}BIr;eu(>nL;l1zoOB<$V0 zj2OyVX+&5Ps)f$jcJ68z+UueD**9NRSE&ny+IVcposCh;9Nsik{0yo7X&dN=z}*zc z=QG(nN*k?YQSMYNmL6`yAN3!^_rCrsc_)lMnB0sXqaBN}kqmqq>n-K72@*z!bQSNTAD7g37=@ajtID6j2+2}V7nxaHd#mn4A&n)E)*!^2QN4YE`n|AKu&02j0 zZ?pbs8PIVu5l@DnWpqo#-@?Siu05yFKE~55>AG3NsKjSXv8G5I{8?IJfZ_qfImxU{#hA@G?Z5}m|@-RR>i~6 z+rvxvAqord`Nkal{Bb-!I&UPlLhebEmKd8Y|1drR{Jl_eqY^HkhS8`K@V%`Sye~<6 zc?#tRcrRKuRLh}LD|s{pUtu9u$OwKBu9eFeU=0|>ccF_f>9JPqIQ}8`t>4oN#){`^%BzP}P;Cv?LC{3)$Jbp$l^PwntYIs19HeAAqTE;EvkFwUy z=QFTnh4BR1af~1Hzrb19VyN`8!|vs}u06eHWP ziib!4wtjnnE~kO)CxYbjK=#L)Z-6kL-Ke{ z4?loAGhsz)JyG7}-v}lyhUr}l<>zVIyOI;5D*S_#PPseaT338w#8SaR+*^hvv2%24 ziVU~v5nD2wByPk8(7-qOEDH27-2N?~&s+OOFm?PB?=04igR(QA#pAJXQ9WCE`mZJC zI{Ndodx>x!_GqY&o$2TS)#dokKK|22BibZheL>z`He^C& z-Bq~S78KQ=(h_(NTFmXsSP=F6oZn-+p&Qz_P`aCv&T%Ink2NYiA5^$)T3YD?b%?qox0Utg(59UnL9lDz1b zwjc_OPSx~gpM<<)bD`Hi;^I>n9%6fWck#=nx+e#GQ^)7DwuSN=azD-o z)8GYC{8snJV3EL^n6NscPoumrKBbOP$kWFNU~d$6=)Mos2zu6Lf3SYr`6u$<^$c!# zpvQPh-3#(q*Fs64B|~xIJM{@4N9!=5*s27>Tjr-cMY4Lm&R=2vKiDPTp`Rw?t$`ZO zeumSc!}!zW*ljbZ|28>f!)5zw-sT4S?CebO=KF*t6 z8K8@o_4r$3^ZdXr|Fn#~VeP~+#y&BMS{&hHe`vVgM5!=Vc9Jt7PusA>+%9Z4k`8M2 z`NCqU{2zQi?Y$3oEqBf~nP2kD!no`DqJ-n@`#&1CCsuA`9artsa3jI&(`ZHli~@$9 z4l5LVzd^R&L+;OchW(CDtHleY#9M3N@xA;md2CP~bv%ciWqp9h*BN!L*o^2<+C7K-y!ls&xj Kf2@~Pt^XTj7ubma