From 37eb063f33a9922cf99b812589a9e8f73938b006 Mon Sep 17 00:00:00 2001 From: Putoo <290555932@qq.com> Date: Sat, 18 Jul 2026 13:11:48 +0800 Subject: [PATCH] 12121 --- .../logdb/db/game_fight_data.cs | 6 - .../Interface/Fight/IGameFightService.cs | 7 +- .../Service/Fight/GameFightService.cs | 52 +++-- .../Tool/Base/FightCompute.cs | 217 ++++++++++++++++++ .../Controllers/Pub/FightController.cs | 107 +++++---- .../Model/RequestParms/Fight/FightParms.cs | 2 +- Web/src/pages/fight/index.vue | 18 +- Web/src/services/Index/FightService.ts | 6 +- 任务生成/resource/map.xls | Bin 56832 -> 35328 bytes 9 files changed, 315 insertions(+), 100 deletions(-) create mode 100644 Service/Application.Domain/Tool/Base/FightCompute.cs diff --git a/Service/Application.Domain.Entity/logdb/db/game_fight_data.cs b/Service/Application.Domain.Entity/logdb/db/game_fight_data.cs index 5e6fd63..dc49111 100644 --- a/Service/Application.Domain.Entity/logdb/db/game_fight_data.cs +++ b/Service/Application.Domain.Entity/logdb/db/game_fight_data.cs @@ -97,12 +97,6 @@ namespace Application.Domain.Entity [SugarColumn(IsNullable = true)] public string? pars { get; set; } - /// - /// 预计用时 - /// - [SugarColumn(IsNullable = true)] - public long? dueTime { get; set; } - /// /// addTime /// diff --git a/Service/Application.Domain/Services/Interface/Fight/IGameFightService.cs b/Service/Application.Domain/Services/Interface/Fight/IGameFightService.cs index ef8b379..04d0990 100644 --- a/Service/Application.Domain/Services/Interface/Fight/IGameFightService.cs +++ b/Service/Application.Domain/Services/Interface/Fight/IGameFightService.cs @@ -13,7 +13,7 @@ public interface IGameFightService Task RemoveFightHarm(string fightId, string userId); Task AddFight(string fightId, string areaCode, string keyId, string mainId, string code, string scene, string mapId, - string userId,long dueTime, long exp = 0, long copper = 0, long petExp = 0, string award = "", string pars = ""); + string userId, long exp = 0, long copper = 0, long petExp = 0, string award = "", string pars = ""); Task SetFightWin(game_fight_data fightData, string winUser, bool setDefMap=true); Task HandleFightData(); @@ -29,7 +29,10 @@ public interface IGameFightService Task RemoveFightGoods(string mapId, string mgId); Task AutoUseDrug(UserAttrModel user, game_fight_data fight); Task HandelFightEnd(string userId, List data); - Task ValidFight(game_fight_data fight, bool isBlack = true); + Task CheckFightLock(string userId, string lockStr); + Task SetFightLock(string userId); + Task FightIsCool(string userId); + Task SetFightCool(string userId, long CoolTime); #endregion } \ No newline at end of file diff --git a/Service/Application.Domain/Services/Service/Fight/GameFightService.cs b/Service/Application.Domain/Services/Service/Fight/GameFightService.cs index 277cdd5..8eab714 100644 --- a/Service/Application.Domain/Services/Service/Fight/GameFightService.cs +++ b/Service/Application.Domain/Services/Service/Fight/GameFightService.cs @@ -94,7 +94,7 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa public async Task AddFight(string fightId, string areaCode, string keyId, string mainId, string code, string scene, string mapId, - string userId, long dueTime, long exp = 0, long copper = 0, long petExp = 0, string award = "", + string userId,long exp = 0, long copper = 0, long petExp = 0, string award = "", string pars = "") { long addTime = TimeExtend.GetTimeStampMilliseconds; @@ -119,7 +119,6 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa petExp = petExp, award = award, pars = pars, - dueTime = dueTime, addTime = addTime, okTime = 0, endTime = endTime @@ -382,11 +381,6 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa public async Task HandleFight(game_fight_data fightData) { - if (await ValidFight(fightData) == false) - { - return; - } - string winUser = fightData.winUser; string lowUser = fightData.userId == winUser ? fightData.mainId : fightData.userId; @@ -701,26 +695,34 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa await Task.CompletedTask; } - - public async Task ValidFight(game_fight_data fight, bool isBlack = true) + + public async Task CheckFightLock(string userId, string lockStr) { - bool result = true; - if (fight.dueTime > 0) - { - int diffTime = Convert.ToInt32(fight.okTime - fight.addTime); - if (diffTime < 3000) - { - result = diffTime >= fight.dueTime; - if (result == false && isBlack) //异常处理 - { - //封禁账号 - var userService = App.GetService(); - await userService.BlackUser(fight.userId); - } - } - } + string key = string.Format(BaseCache.BaseCacheKey, "FightLock"); + var onData = await redis.GetHashAsync(key, userId); + return onData == lockStr; + } - return result; + public async Task SetFightLock(string userId) + { + string lockStr = StringAssist.NewGuid; + string key = string.Format(BaseCache.BaseCacheKey, "FightLock"); + await redis.AddHashAsync(key, userId, lockStr); + return lockStr; + } + + public async Task FightIsCool(string userId) + { + string key = string.Format(BaseCache.BaseCacheKey, "FightCool"); + var onData = await redis.GetHashAsync(key, userId); + return TimeExtend.GetTimeStampMilliseconds >= onData; + } + + public async Task SetFightCool(string userId, long CoolTime) + { + long lockStr = TimeExtend.GetTimeStampMilliseconds + CoolTime; + string key = string.Format(BaseCache.BaseCacheKey, "FightCool"); + await redis.AddHashAsync(key, userId, lockStr); } #endregion diff --git a/Service/Application.Domain/Tool/Base/FightCompute.cs b/Service/Application.Domain/Tool/Base/FightCompute.cs new file mode 100644 index 0000000..435c93a --- /dev/null +++ b/Service/Application.Domain/Tool/Base/FightCompute.cs @@ -0,0 +1,217 @@ +using Dm.util; + +namespace Application.Domain; + +public class FightCompute +{ + public static FightResultModel ComputeFight(UserAttrModel atkUser, UserAttrModel defUser) + { + int result = 0; + int myHarm = 0; + int otHarm = 0; + List myStateData = new List(); + List myRemData = new List(); + List otStateData = new List(); + List otRemData = new List(); + + var atkHandle = UnitFight(atkUser, defUser); + myHarm += atkHandle.atkHarm; + otHarm += atkHandle.defHarm; + otStateData.AddRange(atkHandle.stateData); + otRemData.AddRange(atkHandle.remData); + if (defUser.IsSystem == 1) { + var defHandle = UnitFight(defUser, atkUser); + myHarm += defHandle.defHarm; + otHarm += defHandle.atkHarm; + myStateData.AddRange(defHandle.stateData); + myRemData.AddRange(defHandle.remData); + } + + return new FightResultModel() { + result = result, + myHarm = myHarm, + otHarm = otHarm, + myStateData = myStateData, + myRemData = myRemData, + otStateData = otStateData, + otRemData = otRemData + }; + } + + private static UnitFightResult UnitFight(UserAttrModel atkUser, UserAttrModel defUser) + { + int atkHarm = 0; + int defHarm = 0; + List stateData = new List(); + List remData = new List(); + //闪避处理 + if (defUser.Dodge > 0) + { + decimal dodgeRide = defUser.Dodge - atkUser.Deadly + defUser.DeadlyLess; + if (dodgeRide > 0) + { + if (randomTrigger(dodgeRide)) + { + return new UnitFightResult() + { + atkHarm = 0, + defHarm = 0, + stateData = stateData, + remData = remData + }; + } + } + } + + //士气处理 + if (atkUser.upMorale > 0) + { + atkUser.minAtk = Convert.ToInt32(atkUser.minAtk * (1.0 + (atkUser.morale / atkUser.upMorale) * 0.3)); + } + + if (defUser.upMorale > 0) + { + defUser.defense = Convert.ToInt32(defUser.defense * (1.0 + (atkUser.morale / atkUser.upMorale) * 0.3)); + } + + if (atkUser.minAtk > defUser.defense && defUser.defense > 0) + { + double harmRide = (atkUser.minAtk - defUser.defense) / defUser.defense; + harmRide = harmRide > 1.2 ? 1.2 : harmRide; + double fight_Harm = harmRide * atkUser.maxAtk; + defHarm +=Convert.ToInt32( 0 - fight_Harm); + } + else + { + defHarm = -1; + } + + //暴击处理 + if (atkUser.Crit > 0) + { + if (randomTrigger(atkUser.Crit)) + { + defHarm = Convert.ToInt32(defHarm * 1.5) ; + } + } + + //处理反弹 + if (defUser.Rebound > 0) + { + decimal reboundRide = defUser.Rebound = atkUser.ReboundLess; + if (reboundRide > 0) + { + atkHarm += Convert.ToInt32( defHarm * reboundRide); + } + } + + defHarm +=Convert.ToInt32(0 - atkUser.Harm_Add) ; //额外伤害 + //连击处理 + if (atkUser.Atk_Next > 0) + { + if (randomTrigger(atkUser.Atk_Next)) + { + defHarm =Convert.ToInt32( defHarm * 1.3); + atkHarm += Convert.ToInt32(atkHarm * 1.3) ; + } + } + + //免伤处理 + if (defUser.NoHarm > 0 && defHarm < -1) + { + defHarm = Convert.ToInt32( defHarm * (1 - defUser.NoHarm)); + defHarm = defHarm > 0 ? 0 : defHarm; + } + + //吸血处理 + if (defHarm < 0 && atkUser.InBlood > 0) + { + decimal inBloodRide = atkUser.InBlood - defUser.Punish; + if (inBloodRide > 0) + { + atkHarm += Convert.ToInt32((0 - defHarm) * inBloodRide); + } + } + + //#region 状态类处理 + decimal slow = atkUser.Slow - defUser.SlowLess; + if (randomTrigger(slow)) + { + stateData.Add("Slow"); + } + + decimal poison = atkUser.Poison - defUser.PoisonLess; + if (randomTrigger(poison)) + { + stateData.Add("Poison"); + } + + decimal curse = atkUser.Curse - defUser.CurseLess; + if (randomTrigger(curse)) + { + stateData.Add("Curse"); + } + + decimal weaken = atkUser.Weaken - defUser.WeakenLess; + if (randomTrigger(weaken)) + { + stateData.Add("Weaken"); + } + + decimal depressed = atkUser.Depressed - defUser.DepressedLess; + if (randomTrigger(depressed)) + { + stateData.Add("Depressed"); + } + + decimal breach = atkUser.Breach - defUser.BreachLess; + if (randomTrigger(breach)) + { + stateData.Add("Breach"); + } + + decimal palsyatk = atkUser.PalsyAtk - defUser.PalsyAtkLess; + if (randomTrigger(palsyatk)) + { + stateData.Add("PalsyAtk"); + } + + if (randomTrigger(atkUser.Del_Fashion)) + { + if (defUser.code == nameof(UserEnum.AttrCode.Person)) + { + remData.Add(new FightRemoveData() + { + code = "Equ", + par = "Fashion", + count = 1 + }); + } + } + + //#endregion + + return new UnitFightResult() + { + atkHarm = atkHarm, + defHarm = defHarm, + stateData = stateData, + remData = remData + }; + } + + private static bool randomTrigger(decimal rate) + { + Random random = new Random(); + double rand = random.NextDouble(); + return rand < Convert.ToDouble(rate); + } +} + +public class UnitFightResult +{ + public int atkHarm { get; set; } + public int defHarm { get; set; } + public List stateData { get; set; } + public List remData { get; set; } +} \ No newline at end of file diff --git a/Service/Application.Web/Controllers/Pub/FightController.cs b/Service/Application.Web/Controllers/Pub/FightController.cs index 8ed18d9..3243087 100644 --- a/Service/Application.Web/Controllers/Pub/FightController.cs +++ b/Service/Application.Web/Controllers/Pub/FightController.cs @@ -102,10 +102,8 @@ public class FightController : ControllerBase } } - var otAttr = await _monsterService.GetMonsterAttrModel(keyId, mainId); - long dueTime = FightTool.GetFightDueTime(userAttr, otAttr); bool result = await _fightService.AddFight(fightId, areaCode, keyId, mainId, code, scene, mapId, userId, - dueTime, exp, + exp, copper, petExp, award, pars); if (result) { @@ -177,11 +175,8 @@ public class FightController : ControllerBase long petExp = 0; string award = string.Empty; string pars = ""; - var userAttr = await _attrService.GetUserAttrModel(userId); - var otAttr = await _attrService.GetUserAttrModel(otUser.userId); - long dueTime = FightTool.GetFightDueTime(userAttr, otAttr); bool result = await _fightService.AddFight(fightId, areaCode, keyId, otUser.userId, code, onMapInfo.code, - onMapInfo.mapId, userId, dueTime, exp, + onMapInfo.mapId, userId, exp, copper, petExp, award, pars); if (result) { @@ -227,57 +222,68 @@ public class FightController : ControllerBase #region 此处处理战斗 - FightResultModel fightResult = new FightResultModel() - { - result = -1 - }; - if (!string.IsNullOrEmpty(parms.data)) - { - fightResult = JsonConvert.DeserializeObject(parms.data); - } - - #endregion - - //更新攻击 + var myAttr = await _attrService.GetUserAttrModel(userId, fight.scene); UserAttrModel otAttr = new UserAttrModel(); if (fight.code == nameof(GameEnum.FightCode.PVE)) { otAttr = await _monsterService.GetMonsterAttrModel(fight.keyId, fight.mainId); - if (fightResult.result == 0) - { - otAttr.blood = otAttr.blood + fightResult.otHarm; - otAttr.blood = otAttr.blood < 0 ? 0 : otAttr.blood; - otAttr.blood = otAttr.blood > otAttr.upBlood ? otAttr.upBlood : otAttr.blood; - await _monsterService.SetMonsterBlood(fight.keyId, otAttr.blood); - } } else { - if (fightResult.result == 0) - { - await _fightService.SetUserFightHarm(fight.mainId, fightResult.otHarm); - await _attrService.UpdateUserBlood(fight.mainId, 1, fightResult.otHarm); - await _attrService.AddUserLoadState(fight.mainId, fightResult.otStateData); - await _fightService.HandelFightEnd(fight.mainId, fightResult.otRemData); - } - otAttr = await _attrService.GetUserAttrModel(fight.mainId, fight.scene); } - if (fightResult.result == 0) + int cool = FightTool.GetFightCool(myAttr.agility, otAttr.agility); //冷却时间 + + FightResultModel fightResult = new FightResultModel() { - if (otAttr.blood > 0) + result = -1 + }; + + if (await _fightService.CheckFightLock(userId, parms.key)) + { + //此处还需要判断冷却时间 + bool isCool = await _fightService.FightIsCool(userId); + if (isCool) { - myHarm = fightResult.myHarm; - myHarm += await _fightService.GetUserFightHarm(userId); - otHarm = fightResult.otHarm; - await _attrService.UpdateUserBlood(userId, 1, fightResult.myHarm); - await _attrService.AddUserLoadState(userId, fightResult.myStateData); - await _fightService.HandelFightEnd(userId, fightResult.myRemData); + fightResult = FightCompute.ComputeFight(myAttr, otAttr); + if (fightResult.result == 0) + { + //此处记录冷却时间 + await _fightService.SetFightCool(userId, cool); + otAttr.blood = otAttr.blood + fightResult.otHarm; + otAttr.blood = otAttr.blood < 0 ? 0 : otAttr.blood; + otAttr.blood = otAttr.blood > otAttr.upBlood ? otAttr.upBlood : otAttr.blood; + if (fight.code == nameof(GameEnum.FightCode.PVE)) + { + await _monsterService.SetMonsterBlood(fight.keyId, otAttr.blood); + } + else + { + await _fightService.SetUserFightHarm(fight.mainId, fightResult.otHarm); + await _attrService.UpdateUserBlood(fight.mainId, 1, fightResult.otHarm); + await _attrService.AddUserLoadState(fight.mainId, fightResult.otStateData); + await _fightService.HandelFightEnd(fight.mainId, fightResult.otRemData); + } + + if (otAttr.blood > 0) + { + myAttr.blood = myAttr.blood + fightResult.otHarm; + myAttr.blood = myAttr.blood < 0 ? 0 : myAttr.blood; + myAttr.blood = myAttr.blood > myAttr.upBlood ? myAttr.upBlood : myAttr.blood; + + myHarm = fightResult.myHarm; + myHarm += await _fightService.GetUserFightHarm(userId); + otHarm = fightResult.otHarm; + await _attrService.UpdateUserBlood(userId, 1, fightResult.myHarm); + await _attrService.AddUserLoadState(userId, fightResult.myStateData); + await _fightService.HandelFightEnd(userId, fightResult.myRemData); + } + } } } - var myAttr = await _attrService.GetUserAttrModel(userId, fight.scene); + #endregion //结束战斗都此处直接返回 if (otAttr.blood < 1 || myAttr.blood < 1) @@ -312,21 +318,19 @@ public class FightController : ControllerBase //获取个人负面 var myLoad = await _attrService.GetUserLoadState(userId); - //冷却时间 - int cool = FightTool.GetFightCool(myAttr.agility, otAttr.agility); - - int exitCopper = otAttr.lev * 5; //退出战斗需要的铜贝 + string fightKey = await _fightService.SetFightLock(userId); var result = new { myHarm, otHarm, - myAttr = myAttr, - otAttr = otAttr, + myAttr = new { no = myAttr.viceId, name = myAttr.name, blood = myAttr.blood, upBlood = myAttr.upBlood }, + otAttr = new { no = otAttr.viceId, name = otAttr.name, blood = otAttr.blood, upBlood = otAttr.upBlood }, myDrug = myDrug.drug, myLoad = myLoad, exitCopper, cool, + key = fightKey }; return PoAction.Ok(result); } @@ -631,11 +635,6 @@ public class FightController : ControllerBase return PoAction.Message("该战斗不可复刻挂机!"); } - if (await _fightService.ValidFight(fight,false) == false) - { - return PoAction.Message("异常的战斗,无法挂机!"); - } - var myAttr = await _attrService.GetUserAttrModel(userId, fight.scene); int diffTime = Convert.ToInt32(fight.okTime - fight.addTime); diffTime = diffTime < 300 ? 300 : diffTime; diff --git a/Service/Application.Web/Model/RequestParms/Fight/FightParms.cs b/Service/Application.Web/Model/RequestParms/Fight/FightParms.cs index c28e5f2..76d084d 100644 --- a/Service/Application.Web/Model/RequestParms/Fight/FightParms.cs +++ b/Service/Application.Web/Model/RequestParms/Fight/FightParms.cs @@ -3,5 +3,5 @@ public class FightParms { public string fightId { get; set; } - public string data { get; set; } + public string key { get; set; } } \ No newline at end of file diff --git a/Web/src/pages/fight/index.vue b/Web/src/pages/fight/index.vue index c85c79a..e367ec6 100644 --- a/Web/src/pages/fight/index.vue +++ b/Web/src/pages/fight/index.vue @@ -10,10 +10,10 @@ 攻击  .  - 查看 + 查看 - 查看 + 查看  .  撤退({{ exitCopper }}铜贝) @@ -68,6 +68,7 @@ const myDrug = ref>([]); const myLoad = ref>([]); const exitCopper = ref(0); const coolTime = ref(0); +const fightKey = ref(''); let coolLock = false;//冷却锁 const coolTimer = ref(0);//冷却定时器 @@ -89,8 +90,8 @@ onUnmounted(() => { }) /**加载方法 */ -const BindData = async (data: string): Promise => { - let result = await FightService.Fight(fightId, data); +const BindData = async (fig:string): Promise => { + let result = await FightService.Fight(fightId, fig); if (result.code == 0) { myAttr.value = result.data.myAttr as IUserAttr; otAttr.value = result.data.otAttr as IUserAttr; @@ -100,7 +101,8 @@ const BindData = async (data: string): Promise => { coolTime.value = result.data.cool; dataLock = false; myHarm.value = result.data.myHarm; - otHarm.value = result.data.otHarm; + otHarm.value = result.data.otHarm; + fightKey.value = result.data.key; } else if (result.code == 100) { PageExtend.RedirectTo("/fight/result?f=" + fightId); @@ -150,10 +152,8 @@ const UseFightDrug = async (drugId: string) => { /**攻击 */ const FightAtk = async () => { if (coolLock == false && dataLock == false) { - StartCool(); - let result = FightTool.FightHandle(myAttr.value, otAttr.value); - let data = JSON.stringify(result); - await BindData(data); + StartCool(); + await BindData(fightKey.value); } } diff --git a/Web/src/services/Index/FightService.ts b/Web/src/services/Index/FightService.ts index 9f1cabe..d34d72a 100644 --- a/Web/src/services/Index/FightService.ts +++ b/Web/src/services/Index/FightService.ts @@ -22,10 +22,10 @@ export class FightService { * 战斗接口 * POST /Fight/Fight * @param fightId body - * @param data body + * @param key body */ - static async Fight(fightId: string, data: string) { - return await ApiService.Request("post", "/Fight/Fight", { fightId, data }); + static async Fight(fightId: string, key: string) { + return await ApiService.Request("post", "/Fight/Fight", { fightId, key }); } /** diff --git a/任务生成/resource/map.xls b/任务生成/resource/map.xls index f2f1ef21efc49aa405469484b8614a24a131cdb2..15bdffb6ca7b986a5116079e8438f161b7124180 100644 GIT binary patch delta 8817 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�^h9DtTR)`Is*SnTRH|Cr9$SGINhF1(}F3wC_gp zx-s(!UkWl2d1yC{}fH3T1><)+D#+O zJD6$4{SJ$Xh(^0|Z7SY+q(utTz zyJ>{kmzgt#+1FwsQhMs3F#9p{kT03iZ{#|lKWTU4^_?NufDmk82sS7LOA5gThhRfO zu%RK?un=r`2sR=FOAf(ChG3&Yu+bsdm=J7i2sSPR8y|vA2*D`KBDOfrp8to{Nyt|k=M@I85ODEzS?I;oE-OT*Vmx4MG{b)yt zEe^pR2*H+wU`s==Wg*z|5Nt&VwlV}; z6@sk}!PbOeYeTSgA=vs5?7F%|duvOacB+OaN{MMI(o(T)4T}+ZU+hWePbi%GZ^)F%0VWx?mb1WvT zo%TBkb1pMY^qgxk;RCeaNtpLp%=;`RJi}9$ggK9yCeF^YnD7_c870j57IVJEgcs4? z3}G%{<`2FU>?QaX?TnJV`_;mtohvOS zq6zIN5#}n3xyoW9#&{}Pn5&s-#(lNLMC75pC&FA~G1pj3#3R~!BFweSG#0YfVj@b> zw}XVaj+xKNoW0IsB6iW<6Jf4rW@cXsjwT`+o}r_A=|PM6prsRWj-DqX%ni)E$(MpU z5&dXKiR3-R%xu0CWFjWgJ`u^=$V@Zt8?Dk2DQTaGFgG#N^ChG6My>;}UUt_3TS73b zmR;V~5Nulrwmk&f5rXXu!FGjUkAz@YPrLPdGz7!i)8#!Lf??(9^7e*cPlRAkhG0*H zU{8l&`$Dk&A=on^*s~$nfe`Gu5bXI7>|h9XCU1bZ^KFFrq*c!+Ehb_C?dcHaQ_L*uOTl^~LeTeSCGTmgo=;mk5jSX0hcNdsvw|-L zbt0P3P7TT1&&*1`6l5aC&`u4>dxn`+d@0C8OTFiqM6LF5dhb+uP%rtF3WHAx_ zXitYQU$B@jSWLu3+S4J-7nzw^RyHqMOhiiB(;>{4ta`rWGjHTN;4qcw&UZ&bu$M!y zqYj1`41KiML|Smz>XpNO3&2DvwAVzKN0@1P<%q>Z*|gV0m@iw*mn|l0M0-tydDLPa z^_l1B`DWO^QeU3Y)G#`idL|P*zA>SLDB-m*HU}krjK70uv0a3;XSfsB++M%FsN$=V#`KD5oPlKQlWi`+xBnn30a)v0$+={r$INp--fd z&;`KP$awqm*4_ zx?HCR7Ak&lV=j8nO(_qhyp+KIpVxm!58z?QQJIvtKKd+%oX7lkFH>~+*WT*iSWz3u zKn`Q)AHDwne&<3>IQ)0-cKtT~lTX%vLh79ZvmW8@JD)%}pP$aVIqw$u3iO} z2cOTPjx%qIK&CBo|KaO8_1#Szf$S48+~?KMbQ0oL44qUA@02QZ z=sdV}M=c}9bypqeQ7HP^?}_vvv+DGSGCayXkss5iRAb_(XEw*ZGUtORKECqKtFv=` z5(RyTnfm-VdhE+!`ZtUoLX$*ju&+LUroYD~#(Gx9Ui}V;~c#1)~Xxyzn@+V5E!Wqr5G8}#~5%fCUz`fC2$%ZDA{RiDNL@eD86 z4TfkN1hS{c=nw2?A0@06&QpTTRU;B)I$vJy