From 4c9f13b9efd18237b06fa08946cbcb6c47d21f6a Mon Sep 17 00:00:00 2001 From: derrickcreamer Date: Fri, 6 Nov 2015 16:38:17 -0500 Subject: [PATCH] Version 0.8.4. Logo added. Monster balance changes. --- Forays/Actor.cs | 344 +++++++++++++++++++++--------------- Forays/Buffer.cs | 14 +- Forays/ConsoleForays.csproj | 48 ++--- Forays/ConsoleForays.sln | 17 ++ Forays/Forays.csproj | 29 +-- Forays/GL.cs | 38 ++-- Forays/Global.cs | 123 +++++++------ Forays/Help.cs | 83 +++++---- Forays/Input.cs | 36 ++-- Forays/Item.cs | 23 ++- Forays/Main.cs | 99 ++++++++--- Forays/Map.cs | 64 ++++--- Forays/MouseUI.cs | 9 +- Forays/PhysicalObject.cs | 12 +- Forays/Screen.cs | 5 +- Forays/Tile.cs | 17 +- Forays/UI.cs | 133 +++++++++----- Forays/Utility.cs | 8 +- Forays/advanced_help.txt | 32 +++- Forays/font10x20.png | Bin 0 -> 5343 bytes Forays/font12x18.png | Bin 0 -> 6142 bytes Forays/font12x24.bmp | Bin 110646 -> 0 bytes Forays/font12x24.png | Bin 0 -> 3854 bytes Forays/font14x28.png | Bin 0 -> 4338 bytes Forays/font15x27.png | Bin 0 -> 11501 bytes Forays/font16x32.bmp | Bin 196662 -> 0 bytes Forays/font16x32.png | Bin 0 -> 4779 bytes Forays/font18x36.png | Bin 0 -> 7899 bytes Forays/font21x38.png | Bin 0 -> 13418 bytes Forays/font6x12.bmp | Bin 27702 -> 0 bytes Forays/font6x12.png | Bin 0 -> 1761 bytes Forays/font8x12.png | Bin 0 -> 2609 bytes Forays/font8x16.bmp | Bin 19510 -> 0 bytes Forays/font8x16.png | Bin 0 -> 3111 bytes Forays/forays.ico | Bin 0 -> 65435 bytes Forays/logo.png | Bin 0 -> 19124 bytes Forays/spell_help.txt | 22 ++- LICENSE.txt | 55 +++++- README.md | 2 +- 39 files changed, 777 insertions(+), 436 deletions(-) create mode 100644 Forays/ConsoleForays.sln create mode 100644 Forays/font10x20.png create mode 100644 Forays/font12x18.png delete mode 100644 Forays/font12x24.bmp create mode 100644 Forays/font12x24.png create mode 100644 Forays/font14x28.png create mode 100644 Forays/font15x27.png delete mode 100644 Forays/font16x32.bmp create mode 100644 Forays/font16x32.png create mode 100644 Forays/font18x36.png create mode 100644 Forays/font21x38.png delete mode 100644 Forays/font6x12.bmp create mode 100644 Forays/font6x12.png create mode 100644 Forays/font8x12.png delete mode 100644 Forays/font8x16.bmp create mode 100644 Forays/font8x16.png create mode 100644 Forays/forays.ico create mode 100644 Forays/logo.png diff --git a/Forays/Actor.cs b/Forays/Actor.cs index 37436d1..2f33693 100644 --- a/Forays/Actor.cs +++ b/Forays/Actor.cs @@ -170,6 +170,7 @@ static Actor(){ Define(ActorType.KOBOLD,"kobold",'k',Color.Blue,10,100,0,AttrType.MEDIUM_HUMANOID,AttrType.HUMANOID_INTELLIGENCE,AttrType.STEALTHY,AttrType.LOW_LIGHT_VISION,AttrType.AGGRESSIVE,AttrType.KEEPS_DISTANCE); DefineAttack(ActorType.KOBOLD,100,1,AttackEffect.NO_CRIT,"& hits *"); + Prototype(ActorType.KOBOLD).skills[SkillType.STEALTH] = 2; Define(ActorType.SPORE_POD,"spore pod",'e',Color.DarkMagenta,10,100,0,AttrType.FLYING,AttrType.SPORE_BURST,AttrType.PLANTLIKE,AttrType.BLINDSIGHT,AttrType.SMALL,AttrType.NO_CORPSE_KNOCKBACK,AttrType.MINDLESS); DefineAttack(ActorType.SPORE_POD,100,0,AttackEffect.NO_CRIT,"& bumps *"); @@ -205,35 +206,35 @@ static Actor(){ Define(ActorType.MIMIC,"mimic",'m',Color.White,30,200,0); DefineAttack(ActorType.MIMIC,100,2,AttackEffect.NO_CRIT,"& hits *",AttackEffect.GRAB); - Define(ActorType.PHASE_SPIDER,"phase spider",'A',Color.Cyan,25,100,0,AttrType.LOW_LIGHT_VISION,AttrType.NONEUCLIDEAN_MOVEMENT); //changed to 25hp from 30 + Define(ActorType.PHASE_SPIDER,"phase spider",'A',Color.Cyan,20,100,0,AttrType.LOW_LIGHT_VISION,AttrType.NONEUCLIDEAN_MOVEMENT); DefineAttack(ActorType.PHASE_SPIDER,100,1,AttackEffect.NO_CRIT,"& bites *",AttackEffect.POISON); - Define(ActorType.ZOMBIE,"zombie",'z',Color.DarkGray,50,150,0,AttrType.NONLIVING,AttrType.MEDIUM_HUMANOID,AttrType.RESIST_NECK_SNAP,AttrType.IMMUNE_COLD,AttrType.LOW_LIGHT_VISION,AttrType.MINDLESS); + Define(ActorType.ZOMBIE,"zombie",'z',Color.DarkGray,50,200,0,AttrType.NONLIVING,AttrType.MEDIUM_HUMANOID,AttrType.RESIST_NECK_SNAP,AttrType.IMMUNE_COLD,AttrType.LOW_LIGHT_VISION,AttrType.MINDLESS); DefineAttack(ActorType.ZOMBIE,100,4,AttackEffect.GRAB,"& bites *"); - DefineAttack(ActorType.ZOMBIE,200,2,AttackEffect.NO_CRIT,"& lunges forward and hits *","& lunges forward and misses *","& lunges"); + DefineAttack(ActorType.ZOMBIE,200,2,AttackEffect.GRAB,"& lunges forward and hits *","& lunges forward and misses *","& lunges"); - Define(ActorType.BERSERKER,"berserker",'p',Color.Red,30,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID); + Define(ActorType.BERSERKER,"berserker",'p',Color.Red,25,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID); DefineAttack(ActorType.BERSERKER,100,4,AttackEffect.MAX_DAMAGE,"& hits *"); Prototype(ActorType.BERSERKER).skills[SkillType.SPIRIT] = 4; - Define(ActorType.GIANT_SLUG,"giant slug",'w',Color.DarkGreen,50,150,0,AttrType.SLIMED); + Define(ActorType.GIANT_SLUG,"giant slug",'w',Color.DarkGreen,40,150,0,AttrType.SLIMED); DefineAttack(ActorType.GIANT_SLUG,100,1,AttackEffect.SLIME,"& slams *"); DefineAttack(ActorType.GIANT_SLUG,100,1,AttackEffect.NO_CRIT,"& bites *",AttackEffect.ACID); - Define(ActorType.VULGAR_DEMON,"vulgar demon",'d',Color.Red,30,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.RESIST_NECK_SNAP,AttrType.KEEN_SENSES,AttrType.LOW_LIGHT_VISION,AttrType.IMMUNE_FIRE,AttrType.DAMAGE_RESISTANCE); + Define(ActorType.VULGAR_DEMON,"vulgar demon",'d',Color.Red,25,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.RESIST_NECK_SNAP,AttrType.KEEN_SENSES,AttrType.LOW_LIGHT_VISION,AttrType.IMMUNE_FIRE,AttrType.DAMAGE_RESISTANCE); DefineAttack(ActorType.VULGAR_DEMON,100,3,AttackEffect.WEAK_POINT,"& hits *"); Define(ActorType.BANSHEE,"banshee",'G',Color.Magenta,20,50,0,AttrType.NONLIVING,AttrType.IMMUNE_COLD,AttrType.LOW_LIGHT_VISION,AttrType.FLYING,AttrType.AGGRESSIVE,AttrType.MINDLESS); DefineAttack(ActorType.BANSHEE,100,3,AttackEffect.MAX_DAMAGE,"& claws *"); - Define(ActorType.CAVERN_HAG,"cavern hag",'h',Color.Blue,30,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.LOW_LIGHT_VISION); + Define(ActorType.CAVERN_HAG,"cavern hag",'h',Color.Blue,25,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.LOW_LIGHT_VISION); DefineAttack(ActorType.CAVERN_HAG,100,2,AttackEffect.GRAB,"& clutches at *"); - Define(ActorType.ROBED_ZEALOT,"robed zealot",'p',Color.Yellow,35,100,2,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID); + Define(ActorType.ROBED_ZEALOT,"robed zealot",'p',Color.Yellow,30,100,2,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID); DefineAttack(ActorType.ROBED_ZEALOT,100,3,AttackEffect.KNOCKBACK,"& hammers *"); Prototype(ActorType.ROBED_ZEALOT).skills[SkillType.SPIRIT] = 5; - Define(ActorType.DIRE_RAT,"dire rat",'r',Color.DarkRed,15,100,0,AttrType.LOW_LIGHT_VISION,AttrType.LARGE_GROUP,AttrType.SMALL,AttrType.KEEN_SENSES); + Define(ActorType.DIRE_RAT,"dire rat",'r',Color.DarkRed,10,100,0,AttrType.LOW_LIGHT_VISION,AttrType.LARGE_GROUP,AttrType.SMALL,AttrType.KEEN_SENSES); DefineAttack(ActorType.DIRE_RAT,100,1,AttackEffect.INFLICT_VULNERABILITY,"& bites *"); Define(ActorType.SKULKING_KILLER,"skulking killer",'p',Color.DarkBlue,30,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.STEALTHY,AttrType.LOW_LIGHT_VISION,AttrType.CAN_DODGE); @@ -253,28 +254,28 @@ static Actor(){ Define(ActorType.DREAM_SPRITE_CLONE,"dream sprite",'y',Color.Cyan,1,0,0,AttrType.SMALL,AttrType.FLYING,AttrType.NONLIVING,AttrType.NO_CORPSE_KNOCKBACK); //speed is set to 100 *after* a clone is created for technical reasons DefineAttack(ActorType.DREAM_SPRITE_CLONE,100,0,AttackEffect.NO_CRIT,"& pokes *"); - Define(ActorType.CLOUD_ELEMENTAL,"cloud elemental",'E',Color.RandomLightning,35,100,0,AttrType.NONLIVING,AttrType.FLYING,AttrType.IMMUNE_ELECTRICITY,AttrType.BLINDSIGHT,AttrType.NO_CORPSE_KNOCKBACK,AttrType.MINDLESS); //todo: give weapon resistance, lower hp? + Define(ActorType.CLOUD_ELEMENTAL,"cloud elemental",'E',Color.RandomLightning,10,100,0,AttrType.NONLIVING,AttrType.FLYING,AttrType.IMMUNE_ELECTRICITY,AttrType.BLINDSIGHT,AttrType.NO_CORPSE_KNOCKBACK,AttrType.MINDLESS,AttrType.RESIST_WEAPONS); DefineAttack(ActorType.CLOUD_ELEMENTAL,100,0,AttackEffect.NO_CRIT,"& bumps *"); - Define(ActorType.DERANGED_ASCETIC,"deranged ascetic",'p',Color.RandomDark,40,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.SILENCE_AURA,AttrType.CAN_DODGE); + Define(ActorType.DERANGED_ASCETIC,"deranged ascetic",'p',Color.RandomDark,35,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.SILENCE_AURA,AttrType.CAN_DODGE); DefineAttack(ActorType.DERANGED_ASCETIC,100,3,AttackEffect.SWAP_POSITIONS,"& strikes *"); DefineAttack(ActorType.DERANGED_ASCETIC,100,3,AttackEffect.SWAP_POSITIONS,"& punches *"); DefineAttack(ActorType.DERANGED_ASCETIC,100,3,AttackEffect.SWAP_POSITIONS,"& kicks *"); Prototype(ActorType.DERANGED_ASCETIC).skills[SkillType.SPIRIT] = 6; - Define(ActorType.ORC_GRENADIER,"orc grenadier",'o',Color.DarkYellow,45,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.LOW_LIGHT_VISION,AttrType.KEEPS_DISTANCE); + Define(ActorType.ORC_GRENADIER,"orc grenadier",'o',Color.DarkYellow,40,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.LOW_LIGHT_VISION,AttrType.KEEPS_DISTANCE); DefineAttack(ActorType.ORC_GRENADIER,100,3,AttackEffect.STUN,"& hits *"); Prototype(ActorType.ORC_GRENADIER).skills[SkillType.DEFENSE] = 6; - Define(ActorType.WARG,"warg",'c',Color.White,25,50,0,AttrType.LOW_LIGHT_VISION,AttrType.MEDIUM_GROUP,AttrType.KEEN_SENSES,AttrType.AGGRESSIVE); + Define(ActorType.WARG,"warg",'c',Color.White,20,50,0,AttrType.LOW_LIGHT_VISION,AttrType.MEDIUM_GROUP,AttrType.KEEN_SENSES,AttrType.AGGRESSIVE); DefineAttack(ActorType.WARG,100,3,AttackEffect.TRIP,"& bites *"); - Define(ActorType.ALASI_SCOUT,"alasi scout",'a',Color.Blue,35,100,0,AttrType.MEDIUM_HUMANOID,AttrType.HUMANOID_INTELLIGENCE,AttrType.KEEPS_DISTANCE); + Define(ActorType.ALASI_SCOUT,"alasi scout",'a',Color.Blue,30,100,0,AttrType.MEDIUM_HUMANOID,AttrType.HUMANOID_INTELLIGENCE,AttrType.KEEPS_DISTANCE); DefineAttack(ActorType.ALASI_SCOUT,100,3,AttackEffect.WEAK_POINT,"& hits *"); DefineAttack(ActorType.ALASI_SCOUT,100,3,AttackEffect.NO_CRIT,"& fires a phantom blade at *","& misses * with a phantom blade","& fires a phantom blade"); Prototype(ActorType.ALASI_SCOUT).skills[SkillType.DEFENSE] = 6; - Define(ActorType.CARRION_CRAWLER,"carrion crawler",'i',Color.DarkGreen,20,100,0,AttrType.LOW_LIGHT_VISION); + Define(ActorType.CARRION_CRAWLER,"carrion crawler",'i',Color.DarkGreen,15,100,0,AttrType.LOW_LIGHT_VISION); DefineAttack(ActorType.CARRION_CRAWLER,100,0,AttackEffect.NO_CRIT,"& lashes * with a tentacle",AttackEffect.PARALYZE); DefineAttack(ActorType.CARRION_CRAWLER,100,1,AttackEffect.NO_CRIT,"& bites *"); @@ -282,40 +283,40 @@ static Actor(){ DefineAttack(ActorType.MECHANICAL_KNIGHT,100,3,AttackEffect.WEAK_POINT,"& hits *"); DefineAttack(ActorType.MECHANICAL_KNIGHT,100,3,AttackEffect.WEAK_POINT,"& kicks *"); - Define(ActorType.RUNIC_TRANSCENDENT,"runic transcendent",'h',Color.Magenta,35,100,0,AttrType.MEDIUM_HUMANOID,AttrType.HUMANOID_INTELLIGENCE,AttrType.REGENERATING,AttrType.MENTAL_IMMUNITY,AttrType.KEEPS_DISTANCE); + Define(ActorType.RUNIC_TRANSCENDENT,"runic transcendent",'h',Color.Magenta,30,100,0,AttrType.MEDIUM_HUMANOID,AttrType.HUMANOID_INTELLIGENCE,AttrType.REGENERATING,AttrType.MENTAL_IMMUNITY,AttrType.KEEPS_DISTANCE); DefineAttack(ActorType.RUNIC_TRANSCENDENT,100,2,AttackEffect.NO_CRIT,"& hits *"); Prototype(ActorType.RUNIC_TRANSCENDENT).DefineMagicSkillForMonster(6); Prototype(ActorType.RUNIC_TRANSCENDENT).GainSpell(SpellType.MERCURIAL_SPHERE); Prototype(ActorType.RUNIC_TRANSCENDENT).skills[SkillType.SPIRIT] = 6; - Define(ActorType.ALASI_BATTLEMAGE,"alasi battlemage",'a',Color.Yellow,35,100,0,AttrType.MEDIUM_HUMANOID,AttrType.HUMANOID_INTELLIGENCE); + Define(ActorType.ALASI_BATTLEMAGE,"alasi battlemage",'a',Color.Yellow,30,100,0,AttrType.MEDIUM_HUMANOID,AttrType.HUMANOID_INTELLIGENCE); DefineAttack(ActorType.ALASI_BATTLEMAGE,100,2,AttackEffect.NO_CRIT,"& hits *"); Prototype(ActorType.ALASI_BATTLEMAGE).skills[SkillType.DEFENSE] = 6; Prototype(ActorType.ALASI_BATTLEMAGE).DefineMagicSkillForMonster(7); Prototype(ActorType.ALASI_BATTLEMAGE).GainSpell(SpellType.FLYING_LEAP,SpellType.MAGIC_HAMMER); - Define(ActorType.ALASI_SOLDIER,"alasi soldier",'a',Color.White,40,100,0,AttrType.MEDIUM_HUMANOID,AttrType.HUMANOID_INTELLIGENCE); + Define(ActorType.ALASI_SOLDIER,"alasi soldier",'a',Color.White,35,100,0,AttrType.MEDIUM_HUMANOID,AttrType.HUMANOID_INTELLIGENCE); DefineAttack(ActorType.ALASI_SOLDIER,100,4,AttackEffect.NO_CRIT,"& hits * with its spear","& misses * with its spear","& thrusts its spear"); Prototype(ActorType.ALASI_SOLDIER).skills[SkillType.DEFENSE] = 6; Prototype(ActorType.ALASI_SOLDIER).skills[SkillType.SPIRIT] = 4; - Define(ActorType.SKITTERMOSS,"skittermoss",'F',Color.Gray,40,50,0,AttrType.BLINDSIGHT,AttrType.MINDLESS); - DefineAttack(ActorType.SKITTERMOSS,100,3,AttackEffect.INFEST,"& hits *"); + Define(ActorType.SKITTERMOSS,"skittermoss",'F',Color.Gray,30,50,0,AttrType.BLINDSIGHT,AttrType.MINDLESS); + DefineAttack(ActorType.SKITTERMOSS,100,3,AttackEffect.NO_CRIT,"& hits *",AttackEffect.INFEST); - Define(ActorType.STONE_GOLEM,"stone golem",'x',Color.Gray,70,150,0,AttrType.NONLIVING,AttrType.DULLS_BLADES,AttrType.IMMUNE_BURNING,AttrType.LOW_LIGHT_VISION,AttrType.MINDLESS,AttrType.DAMAGE_RESISTANCE); + Define(ActorType.STONE_GOLEM,"stone golem",'x',Color.Gray,60,150,0,AttrType.NONLIVING,AttrType.DULLS_BLADES,AttrType.IMMUNE_BURNING,AttrType.LOW_LIGHT_VISION,AttrType.MINDLESS,AttrType.DAMAGE_RESISTANCE); DefineAttack(ActorType.STONE_GOLEM,100,4,AttackEffect.NO_CRIT,"& slams *",AttackEffect.STALAGMITES); - Define(ActorType.MUD_ELEMENTAL,"mud elemental",'E',Color.DarkYellow,20,100,0,AttrType.NONLIVING,AttrType.BLINDSIGHT,AttrType.RESIST_WEAPONS,AttrType.MINDLESS);//,AttrType.IMMUNE_ARROWS); //todo: keep immunity to arrows or not? nothing else currently has it. + Define(ActorType.MUD_ELEMENTAL,"mud elemental",'E',Color.DarkYellow,20,100,0,AttrType.NONLIVING,AttrType.BLINDSIGHT,AttrType.RESIST_WEAPONS,AttrType.MINDLESS); DefineAttack(ActorType.MUD_ELEMENTAL,100,2,AttackEffect.BLIND,"& hits *"); Define(ActorType.MUD_TENTACLE,"mud tentacle",'~',Color.DarkYellow,1,100,0,AttrType.NONLIVING,AttrType.BLINDSIGHT,AttrType.IMMOBILE,AttrType.MINDLESS); Prototype(ActorType.MUD_TENTACLE).attrs[AttrType.LIFESPAN] = 20; DefineAttack(ActorType.MUD_TENTACLE,100,1,AttackEffect.NO_CRIT,"& hits *",AttackEffect.GRAB); //this attack has a special hack - it deals 1 damage, not 1d6 - Define(ActorType.FLAMETONGUE_TOAD,"flametongue toad",'t',Color.Red,30,100,0,AttrType.MEDIUM_GROUP,AttrType.IMMUNE_FIRE,AttrType.IMMUNE_BURNING,AttrType.LOW_LIGHT_VISION); + Define(ActorType.FLAMETONGUE_TOAD,"flametongue toad",'t',Color.Red,25,100,0,AttrType.MEDIUM_GROUP,AttrType.IMMUNE_FIRE,AttrType.IMMUNE_BURNING,AttrType.LOW_LIGHT_VISION); DefineAttack(ActorType.FLAMETONGUE_TOAD,100,2,AttackEffect.KNOCKBACK,"& slams *"); - Define(ActorType.ENTRANCER,"entrancer",'p',Color.DarkMagenta,35,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.KEEPS_DISTANCE); + Define(ActorType.ENTRANCER,"entrancer",'p',Color.DarkMagenta,30,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.KEEPS_DISTANCE); DefineAttack(ActorType.ENTRANCER,100,2,AttackEffect.NO_CRIT,"& hits *"); Prototype(ActorType.ENTRANCER).skills[SkillType.SPIRIT] = 4; @@ -323,7 +324,7 @@ static Actor(){ DefineAttack(ActorType.OGRE_BARBARIAN,100,3,AttackEffect.NO_CRIT,"& hits *",AttackEffect.GRAB); DefineAttack(ActorType.OGRE_BARBARIAN,100,3,AttackEffect.NO_CRIT,"& lifts * and slams * down",AttackEffect.STUN); - Define(ActorType.SNEAK_THIEF,"sneak thief",'p',Color.DarkCyan,40,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.LOW_LIGHT_VISION); + Define(ActorType.SNEAK_THIEF,"sneak thief",'p',Color.DarkCyan,35,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.LOW_LIGHT_VISION); DefineAttack(ActorType.SNEAK_THIEF,100,3,AttackEffect.STEAL,"& hits *"); Prototype(ActorType.SNEAK_THIEF).skills[SkillType.DEFENSE] = 2; @@ -331,7 +332,7 @@ static Actor(){ DefineAttack(ActorType.LASHER_FUNGUS,100,1,AttackEffect.TRIP,"& extends a tentacle and whips *","& misses * with a tentacle","& extends a tentacle"); DefineAttack(ActorType.LASHER_FUNGUS,100,1,AttackEffect.TRIP,"& extends a tentacle and drags * closer","& misses * with a tentacle","& extends a tentacle"); - Define(ActorType.CRUSADING_KNIGHT,"crusading knight",'K',Color.DarkGray,50,100,6,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID); + Define(ActorType.CRUSADING_KNIGHT,"crusading knight",'K',Color.DarkGray,40,100,6,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID); DefineAttack(ActorType.CRUSADING_KNIGHT,200,7,AttackEffect.STRONG_KNOCKBACK,"& hits * with a huge mace","& misses * with a huge mace","& swings a huge mace"); Prototype(ActorType.CRUSADING_KNIGHT).skills[SkillType.DEFENSE] = 20; Prototype(ActorType.CRUSADING_KNIGHT).skills[SkillType.SPIRIT] = 4; @@ -346,17 +347,17 @@ static Actor(){ DefineAttack(ActorType.MARBLE_HORROR,100,1,AttackEffect.NO_CRIT,"& touches *",AttackEffect.BLEED); DefineAttack(ActorType.MARBLE_HORROR_STATUE,100,0,AttackEffect.NO_CRIT,"& glares at *",AttackEffect.BLEED); - Define(ActorType.CORROSIVE_OOZE,"corrosive ooze",'J',Color.Green,35,100,0,AttrType.PLANTLIKE,AttrType.BLINDSIGHT,AttrType.MINDLESS); + Define(ActorType.CORROSIVE_OOZE,"corrosive ooze",'J',Color.Green,30,100,0,AttrType.PLANTLIKE,AttrType.BLINDSIGHT,AttrType.MINDLESS); DefineAttack(ActorType.CORROSIVE_OOZE,100,3,AttackEffect.NO_CRIT,"& splashes *",AttackEffect.ACID); - Define(ActorType.PYREN_ARCHER,"pyren archer",'P',Color.DarkRed,45,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.FIERY_ARROWS,AttrType.IMMUNE_BURNING,AttrType.KEEPS_DISTANCE); + Define(ActorType.PYREN_ARCHER,"pyren archer",'P',Color.DarkRed,40,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.FIERY_ARROWS,AttrType.IMMUNE_BURNING,AttrType.KEEPS_DISTANCE); DefineAttack(ActorType.PYREN_ARCHER,100,3,AttackEffect.WEAK_POINT,"& hits *"); //was ignite Prototype(ActorType.PYREN_ARCHER).skills[SkillType.DEFENSE] = 2; Define(ActorType.SPELLMUDDLE_PIXIE,"spellmuddle pixie",'y',Color.RandomBright,15,50,0,AttrType.SMALL,AttrType.FLYING,AttrType.SILENCE_AURA,AttrType.LARGE_GROUP); DefineAttack(ActorType.SPELLMUDDLE_PIXIE,100,2,AttackEffect.MAX_DAMAGE,"& scratches *"); - Define(ActorType.ALASI_SENTINEL,"alasi sentinel",'a',Color.DarkGray,45,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.DAMAGE_RESISTANCE,AttrType.DAMAGE_RESISTANCE,AttrType.DAMAGE_RESISTANCE,AttrType.DAMAGE_RESISTANCE,AttrType.DAMAGE_RESISTANCE); + Define(ActorType.ALASI_SENTINEL,"alasi sentinel",'a',Color.DarkGray,35,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.DAMAGE_RESISTANCE,AttrType.DAMAGE_RESISTANCE,AttrType.DAMAGE_RESISTANCE); DefineAttack(ActorType.ALASI_SENTINEL,100,3,AttackEffect.NO_CRIT,"& hits *"); Prototype(ActorType.ALASI_SENTINEL).skills[SkillType.DEFENSE] = 10; Prototype(ActorType.ALASI_SENTINEL).skills[SkillType.SPIRIT] = 4; @@ -365,25 +366,25 @@ static Actor(){ DefineAttack(ActorType.NOXIOUS_WORM,100,3,AttackEffect.STUN,"& slams *"); //knockback? DefineAttack(ActorType.NOXIOUS_WORM,100,3,AttackEffect.STUN,"& bites *"); - Define(ActorType.CYCLOPEAN_TITAN,"cyclopean titan",'H',Color.DarkYellow,150,100,0,AttrType.LOW_LIGHT_VISION,AttrType.BRUTISH_STRENGTH); + Define(ActorType.CYCLOPEAN_TITAN,"cyclopean titan",'H',Color.DarkYellow,150,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.LOW_LIGHT_VISION,AttrType.BRUTISH_STRENGTH); DefineAttack(ActorType.CYCLOPEAN_TITAN,100,5,AttackEffect.WORN_OUT,"& clobbers *"); //brutish strength means this attack will always deal 30 damage - Define(ActorType.VAMPIRE,"vampire",'V',Color.Blue,50,50,0,AttrType.NONLIVING,AttrType.MEDIUM_HUMANOID,AttrType.HUMANOID_INTELLIGENCE,AttrType.RESIST_NECK_SNAP,AttrType.FLYING,AttrType.LIGHT_SENSITIVE,AttrType.DESTROYED_BY_SUNLIGHT,AttrType.IMMUNE_COLD,AttrType.LOW_LIGHT_VISION,AttrType.SHADOW_CLOAK); + Define(ActorType.VAMPIRE,"vampire",'V',Color.Blue,45,50,0,AttrType.NONLIVING,AttrType.MEDIUM_HUMANOID,AttrType.HUMANOID_INTELLIGENCE,AttrType.RESIST_NECK_SNAP,AttrType.FLYING,AttrType.LIGHT_SENSITIVE,AttrType.DESTROYED_BY_SUNLIGHT,AttrType.IMMUNE_COLD,AttrType.LOW_LIGHT_VISION,AttrType.SHADOW_CLOAK); DefineAttack(ActorType.VAMPIRE,100,4,AttackEffect.NO_CRIT,"& bites *",AttackEffect.DRAIN_LIFE); - Define(ActorType.ORC_WARMAGE,"orc warmage",'o',Color.Red,45,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.LOW_LIGHT_VISION,AttrType.KEEPS_DISTANCE); + Define(ActorType.ORC_WARMAGE,"orc warmage",'o',Color.Red,40,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.LOW_LIGHT_VISION,AttrType.KEEPS_DISTANCE); DefineAttack(ActorType.ORC_WARMAGE,100,3,AttackEffect.STUN,"& hits *"); Prototype(ActorType.ORC_WARMAGE).GainSpell(SpellType.DETECT_MOVEMENT,SpellType.BLINK,SpellType.SCORCH,SpellType.MAGIC_HAMMER,SpellType.DOOM,SpellType.COLLAPSE); Prototype(ActorType.ORC_WARMAGE).DefineMagicSkillForMonster(10); Prototype(ActorType.ORC_WARMAGE).skills[SkillType.DEFENSE] = 2; - Define(ActorType.NECROMANCER,"necromancer",'p',Color.Blue,40,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.KEEPS_DISTANCE); + Define(ActorType.NECROMANCER,"necromancer",'p',Color.Blue,35,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.KEEPS_DISTANCE); DefineAttack(ActorType.NECROMANCER,100,2,AttackEffect.DRAIN_LIFE,"& hits *"); - Define(ActorType.STALKING_WEBSTRIDER,"stalking webstrider",'A',Color.Red,50,50,0,AttrType.KEEN_SENSES,AttrType.LOW_LIGHT_VISION,AttrType.CAN_DODGE); + Define(ActorType.STALKING_WEBSTRIDER,"stalking webstrider",'A',Color.Red,40,50,0,AttrType.KEEN_SENSES,AttrType.LOW_LIGHT_VISION,AttrType.CAN_DODGE); DefineAttack(ActorType.STALKING_WEBSTRIDER,100,3,AttackEffect.NO_CRIT,"& bites *",AttackEffect.POISON); - Define(ActorType.ORC_ASSASSIN,"orc assassin",'o',Color.DarkBlue,45,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.STEALTHY,AttrType.LOW_LIGHT_VISION,AttrType.CAN_DODGE); + Define(ActorType.ORC_ASSASSIN,"orc assassin",'o',Color.DarkBlue,40,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.STEALTHY,AttrType.LOW_LIGHT_VISION,AttrType.CAN_DODGE); DefineAttack(ActorType.ORC_ASSASSIN,100,4,AttackEffect.NO_CRIT,"& hits *",AttackEffect.SILENCE); DefineAttack(ActorType.ORC_ASSASSIN,100,4,AttackEffect.NO_CRIT,"& lunges to hit *","& lunges but misses *","& lunges",AttackEffect.SILENCE); Prototype(ActorType.ORC_ASSASSIN).skills[SkillType.STEALTH] = 10; @@ -392,7 +393,7 @@ static Actor(){ Define(ActorType.CORPSETOWER_BEHEMOTH,"corpsetower behemoth",'Z',Color.DarkMagenta,75,100,0,AttrType.NONLIVING,AttrType.IMMUNE_COLD,AttrType.LOW_LIGHT_VISION,AttrType.MINDLESS); DefineAttack(ActorType.CORPSETOWER_BEHEMOTH,100,7,AttackEffect.NO_CRIT,"& clobbers *",AttackEffect.STUN,AttackEffect.WORN_OUT); - Define(ActorType.MACHINE_OF_WAR,"machine of war",'M',Color.DarkGray,55,100,0,AttrType.NONLIVING,AttrType.BLINDSIGHT,AttrType.DULLS_BLADES,AttrType.IMMUNE_FIRE,AttrType.IMMUNE_BURNING,AttrType.AGGRESSIVE,AttrType.MINDLESS,AttrType.DAMAGE_RESISTANCE,AttrType.DAMAGE_RESISTANCE,AttrType.MENTAL_IMMUNITY); + Define(ActorType.MACHINE_OF_WAR,"machine of war",'M',Color.DarkGray,50,100,0,AttrType.NONLIVING,AttrType.BLINDSIGHT,AttrType.DULLS_BLADES,AttrType.IMMUNE_FIRE,AttrType.IMMUNE_BURNING,AttrType.AGGRESSIVE,AttrType.MINDLESS,AttrType.DAMAGE_RESISTANCE,AttrType.DAMAGE_RESISTANCE,AttrType.MENTAL_IMMUNITY); DefineAttack(ActorType.MACHINE_OF_WAR,100,0,AttackEffect.NO_CRIT,"& bumps *"); Define(ActorType.IMPOSSIBLE_NIGHTMARE,"impossible nightmare",'X',Color.RandomDoom,100,200,0,AttrType.AGGRESSIVE,AttrType.KEEN_SENSES,AttrType.BLINDSIGHT,AttrType.MINDLESS,AttrType.NONEUCLIDEAN_MOVEMENT,AttrType.DAMAGE_RESISTANCE,AttrType.DAMAGE_RESISTANCE); @@ -402,7 +403,7 @@ static Actor(){ DefineAttack(ActorType.FIRE_DRAKE,100,3,AttackEffect.MAX_DAMAGE,"& bites *"); DefineAttack(ActorType.FIRE_DRAKE,100,3,AttackEffect.MAX_DAMAGE,"& claws *"); - Define(ActorType.GHOST,"ghost",'G',Color.White,20,100,0,AttrType.NONLIVING,AttrType.FLYING,AttrType.MINDLESS); + Define(ActorType.GHOST,"ghost",'G',Color.White,15,100,0,AttrType.NONLIVING,AttrType.FLYING,AttrType.MINDLESS); DefineAttack(ActorType.GHOST,100,2,AttackEffect.INFLICT_VULNERABILITY,"& touches *"); Define(ActorType.BLADE,"blade",')',Color.White,5,0,0,AttrType.NONLIVING,AttrType.BLINDSIGHT,AttrType.IMMUNE_BURNING,AttrType.MINDLESS,AttrType.FLYING,AttrType.SMALL,AttrType.AGGRESSIVE); //speed is set after creation @@ -412,13 +413,13 @@ static Actor(){ Define(ActorType.MINOR_DEMON,"minor demon",'d',Color.DarkGray,30,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.KEEN_SENSES,AttrType.LOW_LIGHT_VISION,AttrType.IMMUNE_FIRE,AttrType.IMMUNE_BURNING); DefineAttack(ActorType.MINOR_DEMON,100,3,AttackEffect.STUN,"& hits *"); - Define(ActorType.FROST_DEMON,"frost demon",'d',Color.RandomIce,55,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.RESIST_NECK_SNAP,AttrType.KEEN_SENSES,AttrType.LOW_LIGHT_VISION,AttrType.IMMUNE_FIRE,AttrType.IMMUNE_COLD,AttrType.IMMUNE_BURNING); + Define(ActorType.FROST_DEMON,"frost demon",'d',Color.RandomIce,50,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.RESIST_NECK_SNAP,AttrType.KEEN_SENSES,AttrType.LOW_LIGHT_VISION,AttrType.IMMUNE_FIRE,AttrType.IMMUNE_COLD,AttrType.IMMUNE_BURNING); DefineAttack(ActorType.FROST_DEMON,100,3,AttackEffect.FREEZE,"& hits *"); - Define(ActorType.BEAST_DEMON,"beast demon",'d',Color.DarkGreen,50,50,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.KEEN_SENSES,AttrType.LOW_LIGHT_VISION,AttrType.IMMUNE_FIRE,AttrType.IMMUNE_BURNING); + Define(ActorType.BEAST_DEMON,"beast demon",'d',Color.DarkGreen,45,50,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.KEEN_SENSES,AttrType.LOW_LIGHT_VISION,AttrType.IMMUNE_FIRE,AttrType.IMMUNE_BURNING); DefineAttack(ActorType.BEAST_DEMON,100,5,AttackEffect.KNOCKBACK,"& hits *"); - Define(ActorType.DEMON_LORD,"demon lord",'d',Color.Magenta,75,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.RESIST_NECK_SNAP,AttrType.KEEN_SENSES,AttrType.LOW_LIGHT_VISION,AttrType.IMMUNE_FIRE,AttrType.IMMUNE_BURNING); + Define(ActorType.DEMON_LORD,"demon lord",'d',Color.Magenta,70,100,0,AttrType.HUMANOID_INTELLIGENCE,AttrType.MEDIUM_HUMANOID,AttrType.RESIST_NECK_SNAP,AttrType.KEEN_SENSES,AttrType.LOW_LIGHT_VISION,AttrType.IMMUNE_FIRE,AttrType.IMMUNE_BURNING); DefineAttack(ActorType.DEMON_LORD,100,5,AttackEffect.GRAB,"& whips *","& misses * with its whip","& swings its whip"); Prototype(ActorType.DEMON_LORD).skills[SkillType.DEFENSE] = 6; @@ -911,8 +912,8 @@ public void Move(int r,int c,bool trigger_traps){ } } if(this == player){ - M.safetymap = null; - M.travel_map = null; + //M.safetymap = null; //this was the wrong place to clear these maps - they should be cleared each turn, not each time the player *moves*. + //M.travel_map = null; } else{ if(player.HasAttr(AttrType.DETECTING_MOVEMENT) && DistanceFrom(player) <= 8 && !player.CanSee(this)){ @@ -1532,6 +1533,7 @@ public bool CanWanderAtLevelGen(){ case ActorType.SKELETON: case ActorType.STONE_GOLEM: case ActorType.MACHINE_OF_WAR: + case ActorType.CORPSETOWER_BEHEMOTH: return false; //just a bit of flavor for these monsters, I suppose default: return true; @@ -1901,6 +1903,11 @@ public void Act(){ } } } + else{ + if(HasAttr(AttrType.BANDAGED)){ + attrs[AttrType.BANDAGED]--; + } + } if(tile().Is(FeatureType.THICK_DUST) && time_of_last_action < Q.turn){ if(!HasAttr(AttrType.PLANTLIKE,AttrType.BLINDSIGHT)){ if(this == player && !HasAttr(AttrType.ASLEEP,AttrType.PARALYZED)){ @@ -2142,6 +2149,8 @@ public void InputHuman(){ Screen.UpdateScreenCenterColumn(col); M.Draw(); UI.MapCursor = new pos(-1,-1); + M.travel_map = null; + M.safetymap = null; UI.DisplayStats(); if(HasAttr(AttrType.AUTOEXPLORE) && !grab_item_at_end_of_path){ if(path.Count == 0){ //todo: autoexplore could also track whether the current path is leading to an unexplored tile instead of to an item/shrine/etc. @@ -4217,13 +4226,19 @@ public void InputHuman(){ ls.Add("Disable wall sliding".PadRight(58) + (Global.Option(OptionType.NO_WALL_SLIDING)? "yes ":"no ").PadLeft(4)); ls.Add("Automatically pick up items (if safe)".PadRight(58) + (Global.Option(OptionType.AUTOPICKUP)? "yes ":"no ").PadLeft(4)); ls.Add("Hide the path shown by mouse movement".PadRight(58) + (!MouseUI.VisiblePath? "yes ":"no ").PadLeft(4)); - ls.Add("Use top-row numbers for movement".PadRight(58) + (Global.Option(OptionType.TOP_ROW_MOVEMENT)? "yes ":"no ").PadLeft(4)); + ls.Add("Use top-row numbers for movement (instead of equipment)".PadRight(58) + (Global.Option(OptionType.TOP_ROW_MOVEMENT)? "yes ":"no ").PadLeft(4)); ls.Add("Don't ask for confirmation before resting".PadRight(58) + (Global.Option(OptionType.NO_CONFIRMATION_BEFORE_RESTING)? "yes ":"no ").PadLeft(4)); ls.Add("Show out-of-sight areas in dark gray instead".PadRight(58) + (Global.Option(OptionType.DARK_GRAY_UNSEEN)? "yes ":"no ").PadLeft(4)); + ls.Add("Hide lone \"[v]iew more\" at bottom-left corner".PadRight(58) + (Global.Option(OptionType.HIDE_VIEW_MORE)? "yes ":"no ").PadLeft(4)); ls.Add("Never show tutorial tips".PadRight(58) + (Global.Option(OptionType.NEVER_DISPLAY_TIPS)? "yes ":"no ").PadLeft(4)); ls.Add("Reset tutorial tips before each game".PadRight(58) + (Global.Option(OptionType.ALWAYS_RESET_TIPS)? "yes ":"no ").PadLeft(4)); - if(Global.LINUX && !Screen.GLMode){ - ls.Add("Attempt to fix display glitches on certain terminals".PadRight(COLS)); + if(Global.LINUX){ + if(Screen.GLMode){ + ls.Add("Attempt to fix font size (if window can't be resized)".PadRight(COLS)); + } + else{ + ls.Add("Attempt to fix display glitches on certain terminals".PadRight(COLS)); + } } /*if(Screen.GLMode){ ls.Add("Disable graphics".PadRight(58) + (Global.Option(OptionType.DISABLE_GRAPHICS)? "yes ":"no ").PadLeft(4)); @@ -4255,13 +4270,25 @@ public void InputHuman(){ } break; case 'g': - Global.Options[OptionType.NEVER_DISPLAY_TIPS] = !Global.Option(OptionType.NEVER_DISPLAY_TIPS); + Global.Options[OptionType.HIDE_VIEW_MORE] = !Global.Option(OptionType.HIDE_VIEW_MORE); + MouseUI.PopButtonMap(); + MouseUI.PopButtonMap(); + MouseUI.PushButtonMap(MouseMode.Map); + MouseUI.CreateStatsButtons(); + MouseUI.PushButtonMap(); break; case 'h': - Global.Options[OptionType.ALWAYS_RESET_TIPS] = !Global.Option(OptionType.ALWAYS_RESET_TIPS); + Global.Options[OptionType.NEVER_DISPLAY_TIPS] = !Global.Option(OptionType.NEVER_DISPLAY_TIPS); break; case 'i': - if(Global.LINUX && !Screen.GLMode){ + Global.Options[OptionType.ALWAYS_RESET_TIPS] = !Global.Option(OptionType.ALWAYS_RESET_TIPS); + break; + case 'j': + if(Global.LINUX){ + if(Screen.GLMode){ + Input.HandleResize(true); + } + else{ colorchar[,] screen = Screen.GetCurrentScreen(); colorchar cch = new colorchar('@',Color.White); for(int i=0;i= 3){ + if(player.CanSee(this)){ + Help.TutorialTip(TutorialTopic.MakingNoise); + } + } noticed = true; } if(stealth * DistanceFrom(player) * multiplier - player_visibility_duration++*5 < R.Roll(1,100)){ @@ -7008,7 +7041,7 @@ public void ActiveAI(){ break; case ActorType.DREAM_WARRIOR: if(DistanceFrom(target) == 1){ - if(curhp <= 10 && !HasAttr(AttrType.COOLDOWN_1)){ //todo: changed to 20hp and a 10hp threshold...better? + if(curhp <= 10 && !HasAttr(AttrType.COOLDOWN_1)){ attrs[AttrType.COOLDOWN_1]++; List openspaces = new List(); foreach(Tile t in target.TilesAtDistance(1)){ @@ -7795,7 +7828,8 @@ public void ActiveAI(){ if(t != null){ B.Add(TheName(true) + " slips past " + target.TheName(true) + ". ",this,target); Move(t.row,t.col); - Q.Add(new Event(this,Speed() + 100,EventType.MOVE)); + QS(); + //Q.Add(new Event(this,Speed() + 100,EventType.MOVE)); } else{ QS(); @@ -11071,7 +11105,7 @@ public Color BloodColor(){ } } public bool Attack(int attack_idx,Actor a){ return Attack(attack_idx,a,false); } - public bool Attack(int attack_idx,Actor a,bool attack_is_part_of_another_action){ //returns true if attack hit + public bool Attack(int attack_idx,Actor a,bool attack_is_part_of_another_action,bool canCancel = false){ //returns true if attack hit AttackInfo info = attack[type][attack_idx]; const int combatVolume = 8; pos original_pos = p; @@ -11080,6 +11114,15 @@ public Color BloodColor(){ info = EquippedWeapon.Attack(); } info.damage.source = this; + bool a_moved_last_turn = !a.HasAttr(AttrType.TURNS_HERE); + if(canCancel && this == player && !attack_is_part_of_another_action){ + if(HasFeat(FeatType.DRIVE_BACK) || HasAttr(AttrType.BRUTISH_STRENGTH) || (EquippedWeapon == Staff && a_moved_last_turn)){ + if(!ConfirmsSafetyPrompts(a.tile())){ + Q0(); + return false; + } + } + } if(a.HasFeat(FeatType.DEFLECT_ATTACK) && DistanceFrom(a) == 1){ //Actor other = a.ActorsWithinDistance(1).Where(x=>x.DistanceFrom(this) == 1).Random(); Actor other = a.ActorsWithinDistance(1).Where(x=>x != this).RandomOrDefault(); @@ -11128,7 +11171,7 @@ public Color BloodColor(){ if(HasAttr(AttrType.CONFUSED,AttrType.SLOWED,AttrType.STUNNED) && R.CoinFlip()){ failed_to_dodge = true; } - if(a.tile().Is(FeatureType.WEB) && !a.HasAttr(AttrType.BURNING,AttrType.OIL_COVERED,AttrType.SLIMED,AttrType.BRUTISH_STRENGTH)){ + if(a.tile().Is(FeatureType.WEB) && a.type != ActorType.STALKING_WEBSTRIDER && !a.HasAttr(AttrType.BURNING,AttrType.OIL_COVERED,AttrType.SLIMED,AttrType.BRUTISH_STRENGTH)){ failed_to_dodge = true; } if(!failed_to_dodge && dodge_tile.passable && dodge_tile.actor() == null && !a.MovementPrevented(dodge_tile) && !a.HasAttr(AttrType.PARALYZED)){ @@ -11163,11 +11206,10 @@ public Color BloodColor(){ Help.TutorialTip(TutorialTopic.FightingTheUnseen); } //pos pos_of_target = new pos(a.row,a.col); - bool a_moved_last_turn = !a.HasAttr(AttrType.TURNS_HERE); bool drive_back_applied = HasFeat(FeatType.DRIVE_BACK); - if(drive_back_applied && !ConfirmsSafetyPrompts(a.tile())){ + /*if(drive_back_applied && !ConfirmsSafetyPrompts(a.tile())){ drive_back_applied = false; - } + }*/ bool drive_back_nowhere_to_run = false; if(!attack_is_part_of_another_action && drive_back_applied){ //doesn't work while moving drive_back_nowhere_to_run = true; @@ -11582,9 +11624,9 @@ public Color BloodColor(){ } if(this == player && a.type == ActorType.CYCLOPEAN_TITAN && crit){ effects = new List(); //remove all other effects (so far) and check for edged weapons - if(EquippedWeapon == Sword || EquippedWeapon == Dagger){ + //if(EquippedWeapon == Sword || EquippedWeapon == Dagger){ // Now works with any weapon effects.Add(AttackEffect.PERMANENT_BLIND); - } + //} } if(EquippedWeapon.status[EquipmentStatus.POISONED]){ effects.AddUnique(AttackEffect.POISON); @@ -11730,14 +11772,27 @@ public Color BloodColor(){ } else{ if(blood != Color.Black && (!still_alive || !a.HasAttr(AttrType.FROZEN,AttrType.INVULNERABLE))){ - /*List valid = new List{M.tile[target_original_pos]}; - for(int i=-1;i<=1;++i){ - valid.Add(M.tile[target_original_pos].TileInDirection(original_pos.DirectionOf(target_original_pos).RotateDir(true,i))); - } - for(int i=dmg/10;i>0;--i){ - Tile t = valid.RemoveRandom(); - if(t.Is(TileType.WALL) || t.name == "floor"){ - t.color = blood; + /*int bloodAmount = dmg; //here's some new splatter code I'm unsure of. + if(bloodAmount >= 10){ + bloodAmount -= 10; + if(M.tile[target_original_pos].name == "floor"){ + M.tile[target_original_pos].AddBlood(blood); + } + if(bloodAmount >= 5){ + List cone = M.tile[target_original_pos].GetCone(original_pos.DirectionOf(target_original_pos),dmg>=20? 2 : 1,true); + cone.Add(M.tile[target_original_pos].TileInDirection(original_pos.DirectionOf(target_original_pos))); + cone.Add(M.tile[target_original_pos].TileInDirection(original_pos.DirectionOf(target_original_pos))); + cone.Add(M.tile[target_original_pos].TileInDirection(original_pos.DirectionOf(target_original_pos))); + while(bloodAmount >= 5 && cone.Count > 0){ + Tile t = cone.Random(); + while(cone.Remove(t)){ } //remove all + if(M.tile[original_pos].HasLOE(t)){ + bloodAmount -= 5; + if(t.Is(TileType.WALL) || t.name == "floor"){ + t.AddBlood(blood); + } + } + } } }*/ List cone = M.tile[target_original_pos].GetCone(original_pos.DirectionOf(target_original_pos),dmg>=20? 2 : 1,false); @@ -11751,7 +11806,12 @@ public Color BloodColor(){ Tile t = cone.Random(); while(cone.Remove(t)){ } //remove all if(t.Is(TileType.WALL) || t.name == "floor"){ - t.AddBlood(blood); + if(M.tile[original_pos].HasLOE(t)){ + t.AddBlood(blood); + } + else{ + ++i; + } } } } @@ -11941,7 +12001,7 @@ public Color BloodColor(){ if(!HasAttr(AttrType.SILENCED)){ B.Add(TheName(true) + " silences " + a.the_name + ". ",a); } - a.RefreshDuration(AttrType.SILENCED,R.Between(3,4)*100,a.YouAre() + " no longer silenced. ",a); + a.RefreshDuration(AttrType.SILENCED,100,a.YouAre() + " no longer silenced. ",a); } if(a == player){ Help.TutorialTip(TutorialTopic.Silenced); @@ -12125,9 +12185,9 @@ public Color BloodColor(){ if(t == null){ t = tile(); } - B.Add(YouVisible("fling") + " " + a.TheName(true) + "! ",this,a); foreach(Tile nearby in M.ReachableTilesByDistance(t.row,t.col,false)){ - if(nearby.passable && nearby.actor() == null && HasLOE(nearby)){ + if(!a.MovementPrevented(nearby) && nearby.passable && nearby.actor() == null && HasLOE(nearby)){ + B.Add(YouVisible("fling") + " " + a.TheName(true) + "! ",this,a); a.Move(nearby.row,nearby.col); a.CollideWith(nearby); break; @@ -12153,18 +12213,6 @@ public Color BloodColor(){ } } } - /*if(!hit && HasAttr(AttrType.BRUTISH_STRENGTH) && p.Equals(original_pos) && M.actor[target_original_pos] != null){ - Actor a2 = M.actor[target_original_pos]; - if(a2.HasAttr(AttrType.NO_CORPSE_KNOCKBACK) && a2.maxhp == 1){ - B.Add(YouVisible("push",true) + " " + a2.TheName(true) + ". ",this,a2); - a2.TakeDamage(DamageType.NORMAL,DamageClass.PHYSICAL,false,1,this); - } - else{ - a2.attrs[AttrType.TURN_INTO_CORPSE]++; - KnockObjectBack(a2,5); - a2.CorpseCleanup(); - } - }*/ if(!hit && sneak_attack && this != player){ attrs[AttrType.TURNS_VISIBLE] = -1; attrs[AttrType.NOTICED]++; @@ -12213,6 +12261,11 @@ public Color BloodColor(){ } MakeNoise(combatVolume); M.tile[target_original_pos].MakeNoise(combatVolume); + if(!Help.displayed[TutorialTopic.MakingNoise] && M.Depth >= 3){ + if(this == player){ + Help.TutorialTip(TutorialTopic.MakingNoise); + } + } if(!attack_is_part_of_another_action){ Q.Add(new Event(this,info.cost)); } @@ -12315,18 +12368,6 @@ public void FireArrow(List line,bool free_attack){ B.DisplayNow(); } int idx = 0; - /*foreach(Tile tile2 in animation_line){ - if(tile2.seen){ - ++idx; //todo: remove idx here, right? - } - else{ - animation_line = animation_line.To(tile2); - if(animation_line.Count > 0){ - animation_line.RemoveAt(animation_line.Count - 1); - } - break; - } - }*/ if(animation_line.Count > 0){ Screen.CursorVisible = false; PhysicalObject o = t; @@ -12415,7 +12456,13 @@ public void FireArrow(List line,bool free_attack){ } else{ B.Add("The arrow hits " + a.the_name + ". ",a); - if(!a.TakeDamage(DamageType.NORMAL,DamageClass.PHYSICAL,R.Roll(2,6)+TotalSkill(SkillType.COMBAT),this,a_name + "'s arrow")){ + int dmg = R.Roll(2,6); + if(a.HasAttr(AttrType.RESIST_WEAPONS)){ + B.Add("It isn't very effective. ",a); + dmg = 2; + } + dmg += TotalSkill(SkillType.COMBAT); + if(!a.TakeDamage(DamageType.NORMAL,DamageClass.PHYSICAL,dmg,this,a_name + "'s arrow")){ alive = false; } if(crit && alive){ @@ -13059,9 +13106,6 @@ public bool TakeDamage(DamageType dmgtype,DamageClass damclass,bool major_damage } } } - if(IsFinalLevelDemon() && M.CurrentLevelType == LevelType.Final){ - Global.CheckForVictory(false); - } if(HasAttr(AttrType.REGENERATES_FROM_DEATH) && dmg.type == DamageType.FIRE){ attrs[AttrType.REGENERATES_FROM_DEATH] = 0; } @@ -13205,13 +13249,16 @@ public bool TakeDamage(DamageType dmgtype,DamageClass damclass,bool major_damage } } if(HasAttr(AttrType.HUMANOID_INTELLIGENCE) || type == ActorType.ZOMBIE){ - if(R.OneIn(3) && !HasAttr(AttrType.NO_ITEM)){ + if(R.OneIn(5) && !HasAttr(AttrType.NO_ITEM)){ tile().GetItem(Item.Create(Item.RandomItem(),-1,-1)); } } foreach(Item item in inv){ tile().GetItem(item); } + if(IsFinalLevelDemon() && M.CurrentLevelType == LevelType.Final){ + Global.CheckForVictory(false); + } Q.KillEvents(this,EventType.ANY_EVENT); M.RemoveTargets(this); int idx = tiebreakers.IndexOf(this); @@ -13607,7 +13654,7 @@ public void CastRangedSpellOrMove(List sp,Actor a){ case SpellType.DOOM: case SpellType.COLLAPSE: case SpellType.STONE_SPIKES: - case SpellType.TELEKINESIS: //todo update these lists + case SpellType.TELEKINESIS: sp.Add(spell); break; case SpellType.FLYING_LEAP: @@ -14084,9 +14131,7 @@ public void CastRangedSpellOrMove(List sp,Actor a){ a.GainSpell(spell); B.Add("Runes on " + a.Your() + " armor align themselves with the spell. ",a); } - //if(a.TakeDamage(DamageType.FIRE,DamageClass.MAGICAL,R.Roll(1+bonus,6),this,a_name)){ //todo: testing this without damage - a.ApplyBurning(); - //} + a.ApplyBurning(); } } else{ @@ -14669,6 +14714,11 @@ public void CastRangedSpellOrMove(List sp,Actor a){ a.TakeDamage(DamageType.NORMAL,DamageClass.PHYSICAL,R.Roll(3+bonus,6),this,"falling rubble"); } } + if(!Help.displayed[TutorialTopic.MakingNoise] && M.Depth >= 3){ + if(player.CanSee(t)){ + Help.TutorialTip(TutorialTopic.MakingNoise); + } + } t.MakeNoise(8); } else{ @@ -14789,6 +14839,11 @@ public void CastRangedSpellOrMove(List sp,Actor a){ if(HasFeat(FeatType.CHAIN_CASTING)){ RefreshDuration(AttrType.CHAIN_CAST,100); } + if(!Help.displayed[TutorialTopic.MakingNoise] && M.Depth >= 3){ + if(this == player && Help.displayed[TutorialTopic.CastingWithoutMana]){ //try not to show 2 in a row here. + Help.TutorialTip(TutorialTopic.MakingNoise); + } + } MakeNoise(spellVolume); if(this == player && !Help.displayed[TutorialTopic.CastingWithoutMana]){ int max_tier = spells_in_order.Greatest(x=>Spell.Tier(x)); @@ -14848,6 +14903,11 @@ public bool UseFeat(FeatType feat){ if(t != null && t.actor() != null){ bool moved = false; if(DistanceFrom(t) == 2 && line[1].passable && line[1].actor() == null && !MovementPrevented(line[1])){ + if(HasFeat(FeatType.DRIVE_BACK) || HasAttr(AttrType.BRUTISH_STRENGTH) || (EquippedWeapon == Staff && !t.actor().HasAttr(AttrType.TURNS_HERE))){ + if(!ConfirmsSafetyPrompts(t)){ + return false; + } + } moved = true; B.Add("You lunge! "); Move(line[1].row,line[1].col); @@ -15021,15 +15081,6 @@ public int GetDangerRating(Tile t){ //0 is no danger. 1 is minor danger, often i return 2; } } - /*if(t.Is(TileType.POPPY_FIELD) && !HasAttr(AttrType.MAGICAL_DROWSINESS,AttrType.MENTAL_IMMUNITY)){ //todo - int counter = attrs[AttrType.POPPY_COUNTER] + M.poppy_distance_map[t.p]; //todo: check for valid dijkstra int here? - if(counter > 3){ - return 2; - } - if(counter > 1){ - result = 1; - } - }*/ if(t.Is(TileType.POPPY_FIELD) && !HasAttr(AttrType.MENTAL_IMMUNITY)){ if(M.poppy_distance_map[t.p] == 1){ //the outermost layer is considered less dangerous if(attrs[AttrType.POPPY_COUNTER] >= 3){ @@ -15060,6 +15111,9 @@ public int GetDangerRating(Tile t){ //0 is no danger. 1 is minor danger, often i if(t.Is(FeatureType.THICK_DUST) && !HasAttr(AttrType.BLINDSIGHT,AttrType.PLANTLIKE)){ return 2; } + if(t.Is(FeatureType.WEB) && !HasAttr(AttrType.SLIMED,AttrType.OIL_COVERED,AttrType.BRUTISH_STRENGTH)){ + result = 1; + } foreach(Tile neighbor in t.TilesWithinDistance(1)){ if(neighbor.Is(FeatureType.GRENADE)){ return 2; @@ -15679,9 +15733,10 @@ public static string MonsterDescriptionText(ActorType type){ return "Flametongues are burrowing creatures that generate an astonishing amount of heat. Though small, settlements regard flametongues as a serious threat due to their tendency to cause unexpected fires."; case ActorType.TROLL_BLOODWITCH: return "A practitioner of ancient blood magic passed down among the trolls, more than one unprepared militia has met its end at the claws of a bloodwitch."; + case ActorType.CORROSIVE_OOZE: + return "This amorphous blob of acidic goo crawls mindlessly forward, dissolving and consuming any metal it detects."; case ActorType.CYCLOPEAN_TITAN: return "The ground trembles as this towering colossus strides forward. The cyclops has a huge central eye and a satchel of boulders at its side. It hefts a massive stone club as though it weighs nothing."; - //return "The ground trembles as this towering colossus strides forward. A satchel of boulders hangs at the titan's side. Its large eyes are adapted to seeing in the pitch blackness of the massive underground caves."; case ActorType.ALASI_SENTINEL: return "A juggernaut in runed armor, the sentinels of the alasi are well-protected inside their enchanted suits."; case ActorType.STALKING_WEBSTRIDER: @@ -15692,6 +15747,8 @@ public static string MonsterDescriptionText(ActorType type){ return "This horror defies reason and sanity, seeming at once too large for its surroundings, and too distant. Logic and proportion are forgotten as the universe fights back against this nameless thing."; case ActorType.GHOST: return "Ghosts are restless spirits bound to this world by some unfinished task."; + case ActorType.BLADE: + return "A bit of ephemeral magic in the shape of a blade, this floating weapon will attack anything except its own kind."; case ActorType.MINOR_DEMON: return "The least of Kersai's demon army, this creature has a forked tail and mottled skin."; case ActorType.FROST_DEMON: @@ -15785,7 +15842,6 @@ public int GetCost(pos x,bool smart_pathing_near_difficult_terrain,List thr } } if(M.tile[x].Is(TileType.POPPY_FIELD) && !HasAttr(AttrType.NONLIVING,AttrType.MENTAL_IMMUNITY)){ - //return M.poppy_distance_map[x] * 10; //todo: testing this if(M.poppy_distance_map[x] == 1){ return 19; } diff --git a/Forays/Buffer.cs b/Forays/Buffer.cs index 3a7847d..8131832 100644 --- a/Forays/Buffer.cs +++ b/Forays/Buffer.cs @@ -353,8 +353,18 @@ public bool YesOrNoPrompt(string s,bool easy_cancel){ MouseUI.PushButtonMap(MouseMode.YesNoPrompt); MouseUI.CreateButton(ConsoleKey.Y,false,2,Global.MAP_OFFSET_COLS + s.Length + 1,1,2); MouseUI.CreateButton(ConsoleKey.N,false,2,Global.MAP_OFFSET_COLS + s.Length + 4,1,2); - if(MouseUI.descend_hack && UI.viewing_commands_idx == 0){ //todo hack fixme - this moved, so double check its new position. - MouseUI.CreateStatsButton(ConsoleKey.N,false,16,1); + if(MouseUI.descend_hack){ + for(int i=0;iProperties Forays ConsoleForays - v3.5 512 publish\ @@ -28,9 +27,10 @@ false true False + 8.0.30703 + 2.0 - AnyCPU true full false @@ -69,9 +69,7 @@ - - @@ -85,10 +83,15 @@ + + + + + - + @@ -97,30 +100,14 @@ Always - - Always - - - Always - - - Always - - - Always - Always - - Always - + Always - - Always - + Always @@ -146,4 +133,19 @@ --> + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Forays/ConsoleForays.sln b/Forays/ConsoleForays.sln new file mode 100644 index 0000000..4c32b89 --- /dev/null +++ b/Forays/ConsoleForays.sln @@ -0,0 +1,17 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleForays", "ConsoleForays.csproj", "{392222EF-9EEE-45F8-AFAE-260D9D06C4C9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {392222EF-9EEE-45F8-AFAE-260D9D06C4C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {392222EF-9EEE-45F8-AFAE-260D9D06C4C9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {392222EF-9EEE-45F8-AFAE-260D9D06C4C9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {392222EF-9EEE-45F8-AFAE-260D9D06C4C9}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Forays/Forays.csproj b/Forays/Forays.csproj index e56d7b5..f48bb1a 100644 --- a/Forays/Forays.csproj +++ b/Forays/Forays.csproj @@ -27,9 +27,9 @@ false true False + forays.ico - AnyCPU true full false @@ -98,18 +98,6 @@ Always - - Always - - - Always - - - Always - - - Always - Always @@ -143,4 +131,19 @@ --> + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Forays/GL.cs b/Forays/GL.cs index 0632bb7..4441bf4 100644 --- a/Forays/GL.cs +++ b/Forays/GL.cs @@ -12,6 +12,8 @@ The above copyright notice and this permission notice shall be included in all c using System.Collections.Generic; using System.Diagnostics; using System.Runtime.InteropServices; +using System.IO; +using System.Reflection; using OpenTK; using OpenTK.Graphics; using OpenTK.Graphics.OpenGL; @@ -248,8 +250,6 @@ public void UpdatePositionVertexArray(Surface s,int start_index,IList index } float width_ratio = 2.0f / (float)Viewport.Width; float height_ratio = 2.0f / (float)Viewport.Height; - //float width_ratio = 2.0f / (float)ClientRectangle.Width; //todo: eventually this part might not be based on the current window. Seems like a good idea. - //float height_ratio = 2.0f / (float)ClientRectangle.Height; int current_total = 0; foreach(int i in index_list){ float x_offset = (float)s.layouts[layout_list[current_total]].HorizontalOffsetPx; @@ -316,8 +316,6 @@ public void UpdatePositionSingleVertex(Surface s,int index,int layout = 0){ float[] values = new float[4 * s.vbo.PositionDimensions]; //2 or 3 dimensions for 4 vertices float width_ratio = 2.0f / (float)Viewport.Width; float height_ratio = 2.0f / (float)Viewport.Height; - //float width_ratio = 2.0f / (float)ClientRectangle.Width; //todo: eventually this part might not be based on the current window. Seems like a good idea. - //float height_ratio = 2.0f / (float)ClientRectangle.Height; float x_offset = (float)s.layouts[layout].HorizontalOffsetPx; float y_offset = (float)s.layouts[layout].VerticalOffsetPx; float x_w = (float)s.layouts[layout].CellWidthPx; @@ -562,16 +560,16 @@ public class Surface{ public SurfaceUpdateMethod UpdateOtherDataOnlyMethod = null; protected Surface(){} public static Surface Create(GLWindow window_,string texture_filename,params int[] vertex_attrib_counts){ - return Create(window_,texture_filename,Shader.DefaultFS(),false,vertex_attrib_counts); + return Create(window_,texture_filename,false,Shader.DefaultFS(),false,vertex_attrib_counts); } - public static Surface Create(GLWindow window_,string texture_filename,string frag_shader,bool has_depth,params int[] vertex_attrib_counts){ + public static Surface Create(GLWindow window_,string texture_filename,bool loadTextureFromEmbeddedResource,string frag_shader,bool has_depth,params int[] vertex_attrib_counts){ Surface s = new Surface(); s.window = window_; int dims = has_depth? 3 : 2; s.UseDepthBuffer = has_depth; VertexAttributes attribs = VertexAttributes.Create(vertex_attrib_counts); s.vbo = VBO.Create(dims,attribs); - s.texture = Texture.Create(texture_filename); + s.texture = Texture.Create(texture_filename,null,loadTextureFromEmbeddedResource); s.shader = Shader.Create(frag_shader); if(window_ != null){ window_.Surfaces.Add(s); @@ -781,19 +779,19 @@ public class Texture{ protected static int next_texture = 0; protected static int max_textures = -1; //Currently, max_textures serves only to crash in a better way. Eventually I'll figure out how to swap texture units around, todo! protected static Dictionary texture_info = new Dictionary(); //the Textures contained herein are used only to store index/height/width - public static Texture Create(string filename,string textureToReplace = null){ + public static Texture Create(string filename,string textureToReplace = null,bool loadFromEmbeddedResource = false){ Texture t = new Texture(); t.Sprite = new List(); if(textureToReplace != null){ - t.ReplaceTexture(filename,textureToReplace); + t.ReplaceTexture(filename,textureToReplace,loadFromEmbeddedResource); } else{ - t.LoadTexture(filename); + t.LoadTexture(filename,loadFromEmbeddedResource); } return t; } protected Texture(){} - protected void LoadTexture(string filename){ + protected void LoadTexture(string filename,bool loadFromEmbeddedResource = false){ if(String.IsNullOrEmpty(filename)){ throw new ArgumentException(filename); } @@ -814,7 +812,13 @@ protected void LoadTexture(string filename){ GL.ActiveTexture(TextureUnit.Texture0 + num); int id = GL.GenTexture(); //todo: eventually i'll want to support more than 16 or 32 textures. At that time I'll need to store this ID somewhere. GL.BindTexture(TextureTarget.Texture2D,id); //maybe a list of Scenes which are lists of textures needed, and then i'll bind all those and make sure to track their texture units. - Bitmap bmp = new Bitmap(filename); + Bitmap bmp; + if(loadFromEmbeddedResource){ + bmp = new Bitmap(Assembly.GetExecutingAssembly().GetManifestResourceStream(filename)); + } + else{ + bmp = new Bitmap(filename); + } BitmapData bmp_data = bmp.LockBits(new Rectangle(0,0,bmp.Width,bmp.Height),ImageLockMode.ReadOnly,System.Drawing.Imaging.PixelFormat.Format32bppArgb); GL.TexImage2D(TextureTarget.Texture2D,0,PixelInternalFormat.Rgba,bmp_data.Width,bmp_data.Height,0,OpenTK.Graphics.OpenGL.PixelFormat.Bgra,PixelType.UnsignedByte,bmp_data.Scan0); bmp.UnlockBits(bmp_data); @@ -830,7 +834,7 @@ protected void LoadTexture(string filename){ texture_info.Add(filename,t); } } - protected void ReplaceTexture(string filename,string replaced){ + protected void ReplaceTexture(string filename,string replaced,bool loadFromEmbeddedResource = false){ if(String.IsNullOrEmpty(filename)){ throw new ArgumentException(filename); } @@ -858,7 +862,13 @@ protected void ReplaceTexture(string filename,string replaced){ GL.ActiveTexture(TextureUnit.Texture0 + num); int id = GL.GenTexture(); //todo: eventually i'll want to support more than 16 or 32 textures. At that time I'll need to store this ID somewhere. GL.BindTexture(TextureTarget.Texture2D,id); //maybe a list of Scenes which are lists of textures needed, and then i'll bind all those and make sure to track their texture units. - Bitmap bmp = new Bitmap(filename); + Bitmap bmp; + if(loadFromEmbeddedResource){ + bmp = new Bitmap(Assembly.GetExecutingAssembly().GetManifestResourceStream(filename)); + } + else{ + bmp = new Bitmap(filename); + } BitmapData bmp_data = bmp.LockBits(new Rectangle(0,0,bmp.Width,bmp.Height),ImageLockMode.ReadOnly,System.Drawing.Imaging.PixelFormat.Format32bppArgb); GL.TexImage2D(TextureTarget.Texture2D,0,PixelInternalFormat.Rgba,bmp_data.Width,bmp_data.Height,0,OpenTK.Graphics.OpenGL.PixelFormat.Bgra,PixelType.UnsignedByte,bmp_data.Scan0); bmp.UnlockBits(bmp_data); diff --git a/Forays/Global.cs b/Forays/Global.cs index 990ce33..c83d3ca 100644 --- a/Forays/Global.cs +++ b/Forays/Global.cs @@ -15,7 +15,7 @@ The above copyright notice and this permission notice shall be included in all c using PosArrays; namespace Forays{ public static class Global{ - public const string VERSION = "0.8.X"; + public const string VERSION = "0.8.4"; public static bool LINUX = false; public static bool GRAPHICAL = false; public const int SCREEN_H = 28; @@ -32,7 +32,7 @@ public static class Global{ public static bool BOSS_KILLED = false; public static bool QUITTING = false; public static bool SAVING = false; - public static string KILLED_BY = "debugged to death"; + public static string KILLED_BY = ""; public static Stopwatch Timer; @@ -144,34 +144,42 @@ public static void CheckForVictory(bool circleDestroyed){ } } foreach(Actor a in M.AllActors()){ - if(a.IsFinalLevelDemon()){ + if(a.IsFinalLevelDemon() && a.curhp > 0){ demons = true; break; } } - if(!circles && !demons){ //victory - player.curhp = 100; - if(circleDestroyed){ - B.Add("As the last summoning circle is destroyed, your victory gives you a new surge of strength. "); + if(!circles){ + if(!demons){ //victory + player.curhp = 100; + if(circleDestroyed){ + B.Add("As the last summoning circle is destroyed, your victory gives you a new surge of strength. "); + } + else{ + B.Add("As the last demon falls, your victory gives you a new surge of strength. "); + } + B.PrintAll(); + B.Add("Kersai's summoning has been stopped. His cult will no longer threaten the area. "); + B.PrintAll(); + B.Add("You begin the journey home to deliver the news. "); + B.PrintAll(); + Global.GAME_OVER = true; + Global.BOSS_KILLED = true; + Global.KILLED_BY = "nothing"; } else{ - B.Add("As the last demon falls, your victory gives you a new surge of strength. "); + if(circleDestroyed){ + B.Add("The summoning circles have been destroyed, but demons yet remain! "); + B.PrintAll(); + } } - B.PrintAll(); - B.Add("Kersai's summoning has been stopped. His cult will no longer threaten the area. "); - B.PrintAll(); - B.Add("You begin the journey home to deliver the news. "); - B.PrintAll(); - Global.GAME_OVER = true; - Global.BOSS_KILLED = true; - Global.KILLED_BY = "nothing"; } } public static void LoadOptions(){ if(!File.Exists("options.txt")){ return; } - StreamReader file = new StreamReader("options.txt"); + using(StreamReader file = new StreamReader("options.txt")){ string s = ""; while(s.Length < 2 || s.Substring(0,2) != "--"){ s = file.ReadLine(); @@ -230,20 +238,29 @@ public static void LoadOptions(){ } } } + } } public static void SaveOptions(){ - StreamWriter file = new StreamWriter("options.txt",false); + using(StreamWriter file = new StreamWriter("options.txt",false)){ file.WriteLine("Options:"); file.WriteLine("Any line that starts with [TtFf] and a space MUST be one of the valid options(or, in the 2nd part, one of the valid tutorial tips):"); - file.WriteLine("no_wall_sliding autopickup top_row_movement never_display_tips always_reset_tips dark_gray_unseen"); + string optionNames = ""; foreach(OptionType op in Enum.GetValues(typeof(OptionType))){ - if(Option(op)){ - file.Write("t "); + if(op != OptionType.DISABLE_GRAPHICS){ + optionNames += op.ToString().ToLower() + " "; } - else{ - file.Write("f "); + } + file.WriteLine(optionNames); + foreach(OptionType op in Enum.GetValues(typeof(OptionType))){ + if(op != OptionType.DISABLE_GRAPHICS){ + if(Option(op)){ + file.Write("t "); + } + else{ + file.Write("f "); + } + file.WriteLine(Enum.GetName(typeof(OptionType),op).ToLower()); } - file.WriteLine(Enum.GetName(typeof(OptionType),op).ToLower()); } file.WriteLine("-- Tracking which tutorial tips have been displayed:"); foreach(TutorialTopic topic in Enum.GetValues(typeof(TutorialTopic))){ @@ -253,10 +270,10 @@ public static void SaveOptions(){ else{ file.Write("f "); } - file.WriteLine(Enum.GetName(typeof(TutorialTopic),topic).ToLower()); + file.WriteLine(Enum.GetName(typeof(TutorialTopic),topic)); } file.WriteLine("--"); - file.Close(); + } } public delegate int IDMethod(PhysicalObject o); public static void SaveGame(Buffer B,Map M,Queue Q){ //games are loaded in Main.cs @@ -276,8 +293,9 @@ public static void SaveGame(Buffer B,Map M,Queue Q){ //games are loaded in Main. }; b.Write(Actor.player_name); b.Write(M.currentLevelIdx); - for(int i=0;i<20;++i){ - b.Write((int)M.level_types[i]); + b.Write(M.level_types.Count); + foreach(LevelType lt in M.level_types){ + b.Write((int)lt); } b.Write(M.wiz_lite); b.Write(M.wiz_dark); @@ -348,19 +366,6 @@ public static void SaveGame(Buffer B,Map M,Queue Q){ //games are loaded in Main. } if(t.inv != null){ SaveItem(t.inv,b,GetID); - /*b.Write(t.inv.name); - b.Write(t.inv.the_name); - b.Write(t.inv.a_name); - b.Write(t.inv.symbol); - b.Write((int)t.inv.color); - b.Write(t.inv.light_radius); - b.Write((int)t.inv.type); - b.Write(t.inv.quantity); - b.Write(t.inv.charges); - b.Write(t.inv.other_data); - b.Write(t.inv.ignored); - b.Write(t.inv.do_not_stack); - b.Write(t.inv.revealed_by_light);*/ } else{ b.Write(GetID(null)); @@ -454,6 +459,27 @@ public static void SaveGame(Buffer B,Map M,Queue Q){ //games are loaded in Main. foreach(PhysicalObject o in Fire.burning_objects){ b.Write(GetID(o)); } + for(int i=0;i> groups,ID b.Write(a.inv.Count); foreach(Item i in a.inv){ SaveItem(i,b,get_id); - /*b.Write(i.name); - b.Write(i.the_name); - b.Write(i.a_name); - b.Write(i.symbol); - b.Write((int)i.color); - b.Write(i.light_radius); - b.Write((int)i.type); - b.Write(i.quantity); - b.Write(i.charges); - b.Write(i.other_data); - b.Write(i.ignored); - b.Write(i.do_not_stack); - b.Write(i.revealed_by_light);*/ } b.Write(a.attrs.d.Count); foreach(AttrType at in a.attrs.d.Keys){ @@ -558,6 +571,8 @@ private static void SaveActor(Actor a,BinaryWriter b,List> groups,ID } private static void SaveItem(Item i,BinaryWriter b,IDMethod get_id){ b.Write(get_id(i)); + b.Write(i.row); + b.Write(i.col); b.Write(i.name); b.Write(i.the_name); b.Write(i.a_name); diff --git a/Forays/Help.cs b/Forays/Help.cs index e801ab8..0050263 100644 --- a/Forays/Help.cs +++ b/Forays/Help.cs @@ -15,8 +15,8 @@ namespace Forays{ public enum HelpTopic{Overview,Skills,Feats,Spells,Items,Commands,Advanced,Tips}; public enum TutorialTopic{Movement,Attacking,Torch,Fire,Exhaustion,Recovery,SwitchingEquipment,RangedAttacks,Shrines,DistributionOfShrines, Feats,ActiveFeats,Combat,Defense,Magic,Spirit,Stealth,FindingConsumables,IdentifiedConsumables,UnidentifiedConsumables,MagicTrinkets, - SpellTiers,SpellFailure,CastingWithoutMana,ExhaustionAndArmor,ShinyPlateArmor,HeavyPlateArmor,CriticalHits,InstantKills,Dodging, - FightingTheUnseen,NotRevealedByLight,Traps,CrackedWall,FirePit,Poppies,StoneSlab,BlastFungus,PoolOfRestoration,IncreasedSpeed, + SpellTiers,SpellFailure,CastingWithoutMana,ExhaustionAndArmor,ShinyPlateArmor,HeavyPlateArmor,MakingNoise,CriticalHits,InstantKills,Dodging, + FightingTheUnseen,NotRevealedByLight,Traps,CrackedWall,FirePit,Poppies,StoneSlab,BlastFungus,PoolOfRestoration,Demonstone,IncreasedSpeed, Stunned,Frozen,Slimed,Oiled,Vulnerable,Silenced,Confusion,Bleeding,Immobilized,Acidified,Afraid,Grabbed,Dulled,Possessed,Heavy, Merciful,Negated,Stuck,Infested,WeakPoint,WornOut,Damaged,Stoneform,Vampirism,Roots,BrutishStrength,MysticMind}; public static class Help{ @@ -424,9 +424,6 @@ public static string[] TutorialText(TutorialTopic topic){ "", "The fuse of a blast fungus also ignites", "as it gets pulled out of the ground."}; - /*"Until lit, it is rooted firmly to the ground by", - "its fuse. After being lit, it can be picked up", - "and thrown - quickly!"};*/ case TutorialTopic.Bleeding: return new string[]{ "Bleeding", @@ -508,16 +505,6 @@ public static string[] TutorialText(TutorialTopic topic){ "", "Like all equipment damage, this effect will end", "when you [r]est to repair your equipment."}; - /*case TutorialTopic.Drowsiness: - return new string[]{ - "Drowsiness", - "", - "Being drowsy causes you to fall asleep", - "when you're not in combat (attacking or", - "being attacked).", - "", - "While you're asleep, you can't see or", - "defend against attacks."};*/ case TutorialTopic.Defense: return new string[]{ "Defense skill", @@ -527,11 +514,21 @@ public static string[] TutorialText(TutorialTopic topic){ "", "(Without any Defense skill, most enemies", "have a 75% chance to hit you.)"}; + case TutorialTopic.Demonstone: + return new string[]{ + "Demonstone", + "", + "Any fire ignited on demonstone will burn", + "forever, never dying out on its own." + }; case TutorialTopic.DistributionOfShrines: return new string[]{ "Distribution of shrines", "", - "Shrines appear on each odd-numbered level.", + "Five shrines will appear somewhere on each", + "pair of levels. (Depths 1 & 2 will have five", + "shrines between them, as will depths 3 & 4,", + "depths 5 & 6, and so on.)", "", "If you feel an ancient power calling you back,", "it means there's a shrine on this level", @@ -544,11 +541,11 @@ public static string[] TutorialText(TutorialTopic topic){ "them. (Potions of haste will temporarily", "give you this ability, too.)", "", - "When you attack one of these enemies, they", - "have a chance to leap into an adjacent space,", - "causing your attack to miss. More open space", - "means a better chance to dodge, so fight these", - "enemies in a confined space!"}; + "When attacked, a defender with this ability", + "has a chance to leap into an adjacent space,", + "causing the attack to miss. More open space", + "means a better chance to dodge, so consider", + "this when choosing your battleground!"}; case TutorialTopic.Dulled: return new string[]{ "Dulled", @@ -595,12 +592,11 @@ public static string[] TutorialText(TutorialTopic topic){ "Feats are special abilities", "you can learn at shrines.", "", - "One of the shrines on each", - "(odd-numbered) dungeon level", - "will grant you a feat when you", - "activate it. (Therefore, you'll", - "learn a new feat every other", - "dungeon level.)", + "For each set of five shrines,", + "one of them will grant you a", + "feat when you activate it.", + "(Therefore, you'll learn one new", + "feat per two dungeon levels.)", "", "(The feat starts working immediately", "upon choosing it.)"}; @@ -757,6 +753,30 @@ public static string[] TutorialText(TutorialTopic topic){ "", "(You'll automatically wear all of the", "magic trinkets you find.)"}; + case TutorialTopic.MakingNoise: + return new string[]{ + "Making noise", + "", + "Noises can draw nearby enemies to investigate.", + "", + "The loudest noises (like explosions) can be heard", + "from 12 spaces away, while the quietest (like chugging", + "a potion, or the *CLICK* of a trap) can only be heard", + "from adjacent spaces.", + "", + "Combat will draw attention to both parties from up to 8", + "spaces, and words of magic (scrolls & spells) from 6.", + "(A complete list of noise volumes is available in Help,", + "in the Advanced section.)", + "", + "If you make a noise while in plain sight of an enemy,", + "you'll lose the advantage of stealth and immediately be", + "spotted. However, if you weren't in plain sight (perhaps", + "you were around a corner, out of sight range, or invisible)", + "then enemies won't automatically know where you are.", + "(This can give you an opportunity to", + "sneak attack when they come to investigate!)" + }; case TutorialTopic.Merciful: return new string[]{ "Merciful", @@ -947,14 +967,9 @@ public static string[] TutorialText(TutorialTopic topic){ "fail when you try to cast them. Your turn will", "be used up, but you won't lose any mana.", "", - /*"Above 20% exhaustion, tier 5 spells have a chance", - "to fail. Above 40%, tier 4 is affected (and so on).", - "(Tier 1 spells never fail because your exhaustion", - "can't exceed 100%.)", - "",*/ - "Each point of exhaustion above 20% will add to", + "Each point of exhaustion above 20% adds to", "the failure rate of a tier 5 spell. Each point", - "above 40% will affect tier 4 spells, and so on.", + "above 40% affects tier 4 spells, and so on.", "", "(Therefore, at 45% exhaustion a tier 5 spell", "has a 25% chance to fail, a tier 4 spell has", diff --git a/Forays/Input.cs b/Forays/Input.cs index 38a3909..ee3fcd5 100644 --- a/Forays/Input.cs +++ b/Forays/Input.cs @@ -1092,7 +1092,7 @@ public static void MouseClickHandler(object sender,MouseButtonEventArgs args){ if(status_click){ done = true; Tile t = Actor.M.tile[map_row,map_col]; - if(t.inv != null || t.Is(TileType.CHEST) || t.IsShrine()){ + if(t.inv != null || t.Is(TileType.CHEST,TileType.BLAST_FUNGUS) || t.IsShrine()){ Input.LastKey = new ConsoleKeyInfo('g',ConsoleKey.G,false,false,false); } else{ @@ -1100,7 +1100,12 @@ public static void MouseClickHandler(object sender,MouseButtonEventArgs args){ Input.LastKey = new ConsoleKeyInfo('>',ConsoleKey.OemPeriod,true,false,false); } else{ - done = false; + if(t.Is(TileType.POOL_OF_RESTORATION)){ + Input.LastKey = new ConsoleKeyInfo('d',ConsoleKey.D,false,false,false); + } + else{ + done = false; + } } } } @@ -1271,6 +1276,9 @@ public static void HandleMiddleClick(){ case MouseMode.Map: Input.LastKey = new ConsoleKeyInfo('v',ConsoleKey.V,false,false,false); break; + case MouseMode.Targeting: + Input.LastKey = new ConsoleKeyInfo('X',ConsoleKey.X,true,false,false); + break; default: Input.LastKey = new ConsoleKeyInfo((char)27,ConsoleKey.Escape,false,false,false); break; @@ -1336,14 +1344,15 @@ public static void OnClosing(object sender,System.ComponentModel.CancelEventArgs Input.LastKey = new ConsoleKeyInfo('q',ConsoleKey.Q,false,false,false); } } - public static void HandleResize(){ + public static void HandleResize(){ HandleResize(false); } + public static void HandleResize(bool forceBorder = false){ int potentialWidth = Screen.gl.ClientRectangle.Width / Global.SCREEN_W; int potentialHeight = Screen.gl.ClientRectangle.Height / Global.SCREEN_H; int selectedIdx = 0; - int[] fontWidths = new int[]{ 6, 8,12,16}; //since these are ordered by width, the greatest width will win in conflicts - for - int[] fontHeights = new int[]{12,16,24,32}; // example, if 12x20 is the potential, then 12x18 will be selected over 10x20. - //int[] fontWidths = new int[]{ 6, 8, 8,10,11,12,12,14,14,15,16,16,18,21}; //since these are ordered by width, the greatest width will win in conflicts - for - //int[] fontHeights = new int[]{12,12,16,20,27,18,24,28,36,27,24,32,36,38}; // example, if 12x20 is the potential, then 12x18 will be selected over 10x20. + int[] fontWidths = new int[]{ 6, 8, 8,10,12,12,14,15,16,18,21}; //since these are ordered by width, the greatest width will win in conflicts - for + int[] fontHeights = new int[]{12,12,16,20,18,24,28,27,32,36,38}; // example, if 12x20 is the potential, then 12x18 will be selected over 10x20. + //t[] fontWidths = new int[]{ 6, 8, 8,10,11,12,12,14,14,15,16,16,18,21}; //since these are ordered by width, the greatest width will win in conflicts - for + //t[] fontHeights = new int[]{12,12,16,20,27,18,24,28,36,27,24,32,36,38}; // example, if 12x20 is the potential, then 12x18 will be selected over 10x20. for(int i=0;i= fontWidths[i] && potentialHeight >= fontHeights[i]){ selectedIdx = i; @@ -1354,16 +1363,17 @@ public static void HandleResize(){ Screen.cellWidth = fontWidths[selectedIdx]; string newFont = GetFontFilename(Screen.cellWidth,Screen.cellHeight); int fontPadding = GetFontPadding(newFont); - Screen.textSurface.texture = Texture.Create(newFont,Screen.currentFont); + Screen.textSurface.texture = Texture.Create(newFont,Screen.currentFont,true); Screen.currentFont = newFont; Screen.textSurface.texture.Sprite.Clear(); - SpriteType.DefineSingleRowSprite(Screen.textSurface,Screen.cellWidth,fontPadding); // after making this work with multiple fonts, switch back and forth and resize and fullscreen like 20 times, to see if it crashes. todo todo todo. + SpriteType.DefineSingleRowSprite(Screen.textSurface,Screen.cellWidth,fontPadding); + Screen.cursorSurface.texture = Screen.textSurface.texture; Screen.textSurface.layouts.Clear(); CellLayout.CreateGrid(Screen.textSurface,Global.SCREEN_H,Global.SCREEN_W,Screen.cellHeight,Screen.cellWidth,0,0); Screen.cursorSurface.layouts.Clear(); CellLayout.CreateGrid(Screen.cursorSurface,1,1,2,Screen.cellWidth,0,0); } - if(Screen.gl.FullScreen){ //then, was fullscreen toggled? + if(Screen.gl.FullScreen || forceBorder){ //then, was fullscreen toggled? int xOffset = (Screen.gl.ClientRectangle.Width - Screen.cellWidth*Global.SCREEN_W) / 2; int yOffset = (Screen.gl.ClientRectangle.Height - Screen.cellHeight*Global.SCREEN_H) / 2; Screen.gl.SetViewport(xOffset,yOffset,Screen.cellWidth*Global.SCREEN_W,Screen.cellHeight*Global.SCREEN_H); @@ -1378,10 +1388,10 @@ public static void HandleResize(){ Screen.UpdateGLBuffer(0,0,Global.SCREEN_H-1,Global.SCREEN_W-1); } private static string GetFontFilename(int w,int h){ - return $"font{w}x{h}.bmp"; + return $"Forays.font{w}x{h}.png"; } - private static int GetFontPadding(string filename){ //todo - if(filename == "font8x16.bmp") return 1; + private static int GetFontPadding(string filename){ + if(filename == "Forays.font8x16.png") return 1; return 0; } } diff --git a/Forays/Item.cs b/Forays/Item.cs index f17561f..5338719 100644 --- a/Forays/Item.cs +++ b/Forays/Item.cs @@ -1003,10 +1003,11 @@ public bool Use(Actor user,List line){ { B.Add(user.You("start") + " moving with extraordinary speed. ",user); int duration = (R.Roll(2,10) + 10) * 100; - user.RefreshDuration(AttrType.CAN_DODGE,duration); //todo: dodging tip goes here + user.RefreshDuration(AttrType.CAN_DODGE,duration); user.RefreshDuration(AttrType.VIGOR,duration,user.Your() + " extraordinary speed fades. ",user); if(user == player){ Help.TutorialTip(TutorialTopic.IncreasedSpeed); + Help.TutorialTip(TutorialTopic.Dodging); } break; } @@ -1538,6 +1539,11 @@ public bool Use(Actor user,List line){ } } user.MakeNoise(12); + if(!Help.displayed[TutorialTopic.MakingNoise] && M.Depth >= 3){ + if(user == player){ + Help.TutorialTip(TutorialTopic.MakingNoise); + } + } break; } case ConsumableType.FIRE_RING: @@ -2213,6 +2219,11 @@ public bool Use(Actor user,List line){ if(user != null){ if(NameOfItemType(type) == "scroll"){ user.MakeNoise(6); + if(!Help.displayed[TutorialTopic.MakingNoise] && M.Depth >= 3){ + if(user == player){ + Help.TutorialTip(TutorialTopic.MakingNoise); + } + } } else{ user.MakeNoise(1); @@ -2440,7 +2451,6 @@ public string Description(){ switch(type){ case ConsumableType.BANDAGES: return "A bandage's effect will last for 20 turns, restoring 1 HP per turn and preventing bleed damage. However, taking any major damage will end its effect."; - //return "Applying a bandage will slowly restore 10 HP."; case ConsumableType.BLAST_FUNGUS: return "This blast fungus is about to explode!"; case ConsumableType.BLINKING: @@ -2449,7 +2459,6 @@ public string Description(){ return "This orb will temporarily lower nearby walls, which will slowly return to their original state."; case ConsumableType.BRUTISH_STRENGTH: return "Drinking this potion grants the strength of a juggernaut. For a short time you'll be able to smash through various dungeon features. Additionally, your attacks will deal maximum damage and knock foes back 5 spaces, and you'll keep moving afterward if possible."; - //return "Drinking this potion grants the strength of a juggernaut. For a short time you'll be able to smash through various dungeon features. Additionally, you'll still move after making an attack, which will deal maximum damage and knock foes back 5 spaces."; case ConsumableType.CALLING: return "This scroll's magic will find the nearest foe and transport it next to you. Immobile creatures are immune to this effect."; case ConsumableType.CLOAKING: @@ -2458,7 +2467,6 @@ public string Description(){ return "This scroll covers the dungeon in a blanket of darkness that suppresses all light."; case ConsumableType.MYSTIC_MIND: return "This potion will expand your mind, allowing you to sense foes no matter where they are, and granting immunity to stuns, sleep, rage, confusion, and fear."; - //return "This scroll reveals the location of foes on the current dungeon level for a while."; case ConsumableType.DETONATION: return "On impact, this orb will explode violently, inflicting great damage on its surroundings."; case ConsumableType.ENCHANTMENT: @@ -2475,7 +2483,6 @@ public string Description(){ return "This invaluable elixir will instantly restore you to full health."; case ConsumableType.KNOWLEDGE: return "Reading this scroll will grant knowledge of the items in your pack, and of the current level, including secret doors and traps."; - //return "This scroll will show you the layout of the current level, including secret doors and traps."; case ConsumableType.PAIN: return "Anything caught in this orb's area of effect will become vulnerable to extra damage."; case ConsumableType.PASSAGE: @@ -2484,14 +2491,12 @@ public string Description(){ return "The potent healing magic in this potion will steadily grant you health for 100 turns."; case ConsumableType.RENEWAL: return "This scroll's magic will strip negative effects from your weapons & armor, charge any wands in your possession, and remove any slime or oil covering you."; - //return "This scroll's power will strip negative effects from your weapons & armor, and will remove any slime or oil covering you."; case ConsumableType.ROOTS: return "Drinking this potion will cause thick roots to grow from you, holding you tightly to the ground and providing defense against attacks."; case ConsumableType.SHIELDING: return "This orb will create a zone of protection, shielding entities within for several turns."; case ConsumableType.SILENCE: return "This potion will cause you to radiate an aura of silence, preventing all sounds within 2 spaces. This can help you remain stealthy, but leaves you unable to speak words of magic."; - //return "This potion will cause your actions to become entirely soundless. You'll attract less attention, but you'll be unable to speak words of magic."; case ConsumableType.STONEFORM: return "This potion will change you temporarily to unliving stone, granting a slight resistance to all damage. You'll no longer be able to catch fire, and no toxin, gas, or potion will affect you."; case ConsumableType.SUNLIGHT: @@ -2515,7 +2520,7 @@ public string Description(){ case ConsumableType.BLADES: return "This orb's magic manifests in the form of several flying blades. These animated weapons fly quickly and attack anything nearby."; case ConsumableType.CONFUSION: - return "Breaking this orb will release a befuddling gas, causing those affected to move and attack in random directions."; + return "Breaking this orb will release a befuddling gas, causing those who breathe it to move and attack in random directions."; case ConsumableType.DUST_STORM: return "When zapped, this wand creates a billowing cloud of thick blinding dust, so heavy that it can extinguish flames."; case ConsumableType.INVISIBILITY: @@ -2532,7 +2537,7 @@ public string Description(){ return "After zapping this wand at your target, you can throw it forcefully. You can throw items, monsters, terrain features, and even yourself."; } } - return "Unknown item."; + return "What is this thing?"; } } public abstract class Equipment{ diff --git a/Forays/Main.cs b/Forays/Main.cs index b1b14af..239d966 100644 --- a/Forays/Main.cs +++ b/Forays/Main.cs @@ -11,6 +11,7 @@ The above copyright notice and this permission notice shall be included in all c using System.Diagnostics; using System.IO; using System.Runtime.InteropServices; +using System.Reflection; using OpenTK; using OpenTK.Graphics; using OpenTK.Graphics.OpenGL; @@ -36,7 +37,7 @@ public enum DamageType{NORMAL,FIRE,COLD,ELECTRIC,POISON,MAGIC,NONE}; public enum DamageClass{PHYSICAL,MAGICAL,NO_TYPE}; public enum AttackEffect{STUN,ONE_TURN_STUN,MAX_DAMAGE,PERCENT_DAMAGE,WEAK_POINT,WORN_OUT,REDUCE_ACCURACY,DRAIN_LIFE,GRAB,CHILL,FREEZE,INFLICT_VULNERABILITY,TRIP,KNOCKBACK,STRONG_KNOCKBACK,IGNITE,DIM_VISION,SWAP_POSITIONS,SLIME,MAKE_NOISE,BLIND,PERMANENT_BLIND,SLOW,POISON,PARALYZE,ONE_TURN_PARALYZE,STALAGMITES,FLING,PULL,SILENCE,INFEST,DISRUPTION,VICTORY,ACID,CONFUSE,BLEED,ONE_HP,STEAL,EXHAUST,NO_CRIT}; public enum EventType{ANY_EVENT,MOVE,REMOVE_ATTR,REMOVE_GAS,CHECK_FOR_HIDDEN,RELATIVELY_SAFE,POLTERGEIST,MIMIC,REGENERATING_FROM_DEATH,REASSEMBLING,GRENADE,BLAST_FUNGUS,STALAGMITE,FIRE_GEYSER,FIRE_GEYSER_ERUPTION,FOG_VENT,POISON_GAS_VENT,STONE_SLAB,MARBLE_HORROR,FIRE,NORMAL_LIGHTING,TELEPORTAL,BREACH,GRAVE_DIRT,POPPIES,TOMBSTONE_GHOST,SHIELDING,BURROWING,FINAL_LEVEL_SPAWN_CULTISTS,SPAWN_WANDERING_MONSTER}; - public enum OptionType{NO_WALL_SLIDING,AUTOPICKUP,TOP_ROW_MOVEMENT,NO_CONFIRMATION_BEFORE_RESTING,NEVER_DISPLAY_TIPS,ALWAYS_RESET_TIPS,DARK_GRAY_UNSEEN,DISABLE_GRAPHICS}; + public enum OptionType{NO_WALL_SLIDING,AUTOPICKUP,TOP_ROW_MOVEMENT,NO_CONFIRMATION_BEFORE_RESTING,NEVER_DISPLAY_TIPS,ALWAYS_RESET_TIPS,DARK_GRAY_UNSEEN,HIDE_VIEW_MORE,DISABLE_GRAPHICS}; public class Game{ public Map M; public Queue Q; @@ -94,6 +95,7 @@ static void Main(string[] args){ int height_px = Global.SCREEN_H * 16; int width_px = Global.SCREEN_W * 8; Screen.gl = new GLWindow(width_px,height_px,"Forays into Norrendrin"); + Screen.gl.Icon = new System.Drawing.Icon(Assembly.GetExecutingAssembly().GetManifestResourceStream("Forays.forays.ico")); Screen.gl.ResizingPreference = ResizeOption.SnapWindow; Screen.gl.ResizingFullScreenPreference = ResizeOption.AddBorder; Screen.gl.KeyDown += Input.KeyDownHandler; @@ -103,7 +105,7 @@ static void Main(string[] args){ Screen.gl.MouseLeave += Input.MouseLeaveHandler; Screen.gl.Closing += Input.OnClosing; Screen.gl.FinalResize += Input.HandleResize; - Screen.textSurface = Surface.Create(Screen.gl,"font8x16.bmp",Shader.FontFS(),false,2,4,4); + Screen.textSurface = Surface.Create(Screen.gl,"Forays.font8x16.png",true,Shader.AAFontFS(),false,2,4,4); SpriteType.DefineSingleRowSprite(Screen.textSurface,8,1); CellLayout.CreateGrid(Screen.textSurface,Global.SCREEN_H,Global.SCREEN_W,16,8,0,0); Screen.textSurface.SetEasyLayoutCounts(Global.SCREEN_H * Global.SCREEN_W); @@ -113,14 +115,14 @@ static void Main(string[] args){ Screen.textSurface.SetDefaultOtherData(new List(Color.Gray.GetFloatValues()),new List(Color.Black.GetFloatValues())); Screen.textSurface.DefaultUpdateOtherData(); Screen.gl.Surfaces.Add(Screen.textSurface); - Screen.cursorSurface = Surface.Create(Screen.gl,"font6x12.bmp",Shader.FontFS(),false,2,4,4); - SpriteType.DefineSingleRowSprite(Screen.cursorSurface,8,0); + Screen.cursorSurface = Surface.Create(Screen.gl,"Forays.font8x16.png",true,Shader.AAFontFS(),false,2,4,4); + Screen.cursorSurface.texture = Screen.textSurface.texture; CellLayout.CreateGrid(Screen.cursorSurface,1,1,2,8,0,0); Screen.cursorSurface.SetEasyLayoutCounts(1); Screen.cursorSurface.DefaultUpdatePositions(); Screen.cursorSurface.SetDefaultSpriteType(0); - Screen.cursorSurface.SetDefaultSprite(0); - Screen.cursorSurface.SetDefaultOtherData(new List(Color.Gray.GetFloatValues()),new List(Color.Black.GetFloatValues())); + Screen.cursorSurface.SetDefaultSprite(32); + Screen.cursorSurface.SetDefaultOtherData(new List(Color.Black.GetFloatValues()),new List(Color.Gray.GetFloatValues())); Screen.cursorSurface.DefaultUpdateOtherData(); Screen.gl.Surfaces.Add(Screen.cursorSurface); GL.Enable(EnableCap.Blend); @@ -135,28 +137,46 @@ static void Main(string[] args){ MainMenu(); } static void TitleScreen(){ - for(int i=0;i(); - for(int i=0;i<20;++i){ + int numLevelTypes = b.ReadInt32(); + for(int i=0;i(Global.ROWS,Global.COLS); + for(int i=0;i(); + for(int i=0;i(Global.ROWS,Global.COLS); //todo! save these properly - //todo: also dungeon desc. } Screen.NoClose = true; MouseUI.PushButtonMap(MouseMode.Map); @@ -1023,7 +1068,7 @@ static void GameOverScreen(Game game){ UI.DisplayStats(); bool showed_IDed_tip = false; if(Global.KILLED_BY != "gave up" && !Help.displayed[TutorialTopic.IdentifiedConsumables]){ - if(game.player.inv.Where(item=>Item.identified[item.type] && item.Is(ConsumableType.HEALING,ConsumableType.TIME,ConsumableType.TELEPORTAL)).Count > 0){ + if(game.player.inv.Where(item=>Item.identified[item.type] && item.Is(ConsumableType.HEALING,ConsumableType.TIME)).Count > 0){ Help.TutorialTip(TutorialTopic.IdentifiedConsumables); Global.SaveOptions(); showed_IDed_tip = true; diff --git a/Forays/Map.cs b/Forays/Map.cs index dae33f4..6eea67e 100644 --- a/Forays/Map.cs +++ b/Forays/Map.cs @@ -19,7 +19,7 @@ public class Map{ public PosArray tile = new PosArray(ROWS,COLS); public PosArray actor = new PosArray(ROWS,COLS); public List level_types; - public int currentLevelIdx{get;set;} + public int currentLevelIdx; public LevelType CurrentLevelType{ get{ return level_types[currentLevelIdx]; } } public int Depth{ //This is the effective level for difficulty calculations etc. get{ return currentLevelIdx + 1; } @@ -51,8 +51,8 @@ public class Map{ } } private bool internal_wiz_dark; - private Dict generated_this_level = null; //used for rejecting monsters if too many already exist on the current level - private PosArray monster_density = null; + private Dict generated_this_level = new Dict(); //used for rejecting monsters if too many already exist on the current level + private PosArray monster_density = new PosArray(ROWS,COLS); private bool[,] danger_sensed; private static List allpositions = new List(); public PosArray safetymap = null; @@ -272,7 +272,7 @@ private LevelType ChooseNextLevelType(LevelType current){ LevelType result = current; while(result == current){ result = R.WeightedChoice( - new int[]{40,20,5,20,12,7,5,12}, + new int[]{40,20,5,18,12,7,5,12}, new LevelType[]{LevelType.Standard,LevelType.Cave,LevelType.Hive,LevelType.Mine,LevelType.Fortress,LevelType.Sewer,LevelType.Garden,LevelType.Crypt}); //hellish is handled elsewhere. } return result; @@ -830,8 +830,11 @@ public ActorType ChooseMobType(bool wanderingOnly,bool shallowOnly){ int monsterTier = 1; if(effectiveDepth > 1){ // depth 1 only generates tier 1 monsters. List tiers = new List(); - if(shallowOnly){ - for(int i=1;i GetMobTypes(ActorType type){ int number = 1; if(type == ActorType.SPECIAL){ if(CurrentLevelType == LevelType.Hellish){ - if(R.CoinFlip()){ + if(R.OneIn(3)){ for(int i=0;i<3;++i) result.Add(ActorType.MINOR_DEMON); } else{ @@ -928,7 +931,7 @@ public List GetMobTypes(ActorType type){ } } else{ - number = 1 + (Depth-3) / 3; + number = 1 + (Depth-3) / 4; //was number = 1 + (Depth-3) / 3; if(number > 1 && R.CoinFlip()){ --number; } @@ -2497,8 +2500,7 @@ private void ReadSpecialLevel(PosArray map,string[] layout,PosArray0;--i){ //yes, this is all copied and pasted for a one-line change. i'll try to fix it later. - if(R.CoinFlip()){ //generate some shallow monsters + for(int i=(Depth-5)/2;i>0;--i){ //yes, this is all copied and pasted for a one-line change. i'll try to fix it later. + if(!R.OneIn(3)){ //generate some shallow monsters ActorType type = ChooseMobType(false,true); if(type == ActorType.POLTERGEIST){ if(!poltergeist_spawned){ @@ -3467,7 +3467,7 @@ public void GenerateLevel(){ } actor[player.row,player.col] = player; //this line fixes a bug that occurs when the player ends up in the same position on a new level Screen.screen_center_col = player.col; - if(R.CoinFlip() && CurrentLevelType != LevelType.Hellish){ //todo: copied and pasted below + if(R.PercentChance(40) && CurrentLevelType != LevelType.Hellish){ //todo: copied and pasted below bool done = false; for(int tries=0;!done && tries<500;++tries){ int rr = R.Roll(ROWS-4) + 1; @@ -3653,7 +3653,9 @@ public void GenerateLevel(){ hidden.Add(t); } tile[rr,rc].TileInDirection(dirs[0].RotateDir(true,4)).TransformTo(TileType.CHEST); - tile[rr,rc].TileInDirection(dirs[0].RotateDir(true,4)).color = Color.Yellow; + if(R.FractionalChance(Depth,20)){ + tile[rr,rc].TileInDirection(dirs[0].RotateDir(true,4)).color = Color.Yellow; + } } else{ foreach(Tile t in tile[rr,rc].TilesAtDistance(1)){ @@ -3666,7 +3668,9 @@ public void GenerateLevel(){ hidden.Add(t); } tile[rr,rc].TransformTo(TileType.CHEST); - tile[rr,rc].color = Color.Yellow; + if(R.FractionalChance(Depth,20)){ + tile[rr,rc].color = Color.Yellow; + } } done = true; } @@ -4074,6 +4078,7 @@ public void IncrementClock(){ case 9: player.Kill(); player.curhp = -R.Roll(66,6); + Global.KILLED_BY = "turned to ash"; break; } } @@ -4182,6 +4187,7 @@ public void GenerateFinalLevel(){ } } Q.Add(new Event(500,EventType.FINAL_LEVEL_SPAWN_CULTISTS)); + dungeonDescription = GetDungeonDescription(); currentlyGeneratingLevel = false; } private enum FloorType{Brush,Water,Gravel,GlowingFungus,Ice,PoppyField,GraveDirt}; @@ -4716,11 +4722,11 @@ public string LevelMessage(){ break; case LevelType.Sewer: messages.Add("Unwholesome water streams along the walls here, forming pools that froth and swirl. "); - messages.Add("The rank odor of these slimy tunnels assaulted you long before you reached them. "); + messages.Add("The rank odor of these slimy tunnels assaulted you before you reached them. "); messages.Add("The sound of rushing water fills these tunnels. "); break; case LevelType.Hellish: - messages.Add("Before you, leering idols and demonic glyphs surround leaping flames. As you watch, cultists approach the fire, then throw themselves in!"); + messages.Add("Before you, leering idols and demonic glyphs surround leaping flames. As you watch, cultists approach the fire, then throw themselves in! "); break; /*case LevelType.Ruined: messages.Add("You enter a badly damaged rubble-strewn area of the dungeon. "); diff --git a/Forays/MouseUI.cs b/Forays/MouseUI.cs index f7ca4ae..9582e78 100644 --- a/Forays/MouseUI.cs +++ b/Forays/MouseUI.cs @@ -211,8 +211,13 @@ public static void CreateStatsButtons(){ CreateStatsButton(ConsoleKey.V,false,Global.SCREEN_H-1,1); //view more break; case 2: - UI.status_row_cutoff = Global.SCREEN_H - 2; - CreateStatsButton(ConsoleKey.V,false,Global.SCREEN_H-1,1); //view more + if(Global.Option(OptionType.HIDE_VIEW_MORE)){ + UI.status_row_cutoff = Global.SCREEN_H - 1; + } + else{ + UI.status_row_cutoff = Global.SCREEN_H - 2; + CreateStatsButton(ConsoleKey.V,false,Global.SCREEN_H-1,1); //view more + } break; } diff --git a/Forays/PhysicalObject.cs b/Forays/PhysicalObject.cs index 6491d9e..08eb51c 100644 --- a/Forays/PhysicalObject.cs +++ b/Forays/PhysicalObject.cs @@ -701,6 +701,11 @@ public void ApplyExplosion(int radius,Actor damage_source,string cause_of_death) } } } + if(!Help.displayed[TutorialTopic.MakingNoise] && M.Depth >= 3){ + if(player.CanSee(tile())){ + Help.TutorialTip(TutorialTopic.MakingNoise); + } + } MakeNoise(12); } public string YouAre(){ @@ -3006,8 +3011,8 @@ public List GetCone(int direction,int distance,bool exclude_origin){ result = TilesWithinDistance(distance).Where(x=>target.ManhattanDistanceFromX10(x.p) <= 60); } else{ - result = TilesWithinDistance(distance).Where(x=>target.ChebyshevDistanceFromX10(x.p) <= 60); - } + result = TilesWithinDistance(distance).Where(x=>target.ChebyshevDistanceFromX10(x.p) <= 60);// this would be more conelike if it picked tiles within (dist) in *manhattan* distance from + } // this tile, but the current method does make the number of tiles equal between cardinal & diagonal cones. Hmm. if(exclude_origin){ result.Remove(tile()); } @@ -3361,6 +3366,9 @@ public static void Targeting_DisplayContents(Tile tc,string always_displayed,str case TileType.POOL_OF_RESTORATION: Help.TutorialTip(TutorialTopic.PoolOfRestoration,true); break; + case TileType.DEMONSTONE: + Help.TutorialTip(TutorialTopic.Demonstone,true); + break; case TileType.STONE_SLAB: case TileType.STONE_SLAB_OPEN: Help.TutorialTip(TutorialTopic.StoneSlab,true); diff --git a/Forays/Screen.cs b/Forays/Screen.cs index 27d6828..3b52c90 100644 --- a/Forays/Screen.cs +++ b/Forays/Screen.cs @@ -263,9 +263,6 @@ public colorstring[] SplitAt(int idx,bool remove_at_split_idx = false){ if(second_start < s.s.Length){ result[1].strings.Add(new cstr(s.s.Substring(idx - len_0),s.color,s.bgcolor)); } - if(result[0].Length() != idx){ - throw new Exception("whoops"); //todo, remove this after it works. - } } else{ result[0].strings.Add(s); @@ -294,7 +291,7 @@ public static class Screen{ public static Surface cursorSurface = null; public static int cellHeight = 16; public static int cellWidth = 8; - public static string currentFont = "font8x16.bmp"; + public static string currentFont = "Forays.font8x16.png"; public static bool NoClose{ get{ if(gl != null){ diff --git a/Forays/Tile.cs b/Forays/Tile.cs index d36b608..74408b8 100644 --- a/Forays/Tile.cs +++ b/Forays/Tile.cs @@ -76,11 +76,11 @@ public int light_value{ public Item inv; public List features = new List(); public static List feature_priority = new List{FeatureType.GRENADE,FeatureType.FIRE,FeatureType.SPORES,FeatureType.POISON_GAS,FeatureType.PIXIE_DUST,FeatureType.CONFUSION_GAS,FeatureType.THICK_DUST,FeatureType.TELEPORTAL,FeatureType.STABLE_TELEPORTAL,FeatureType.FOG,FeatureType.WEB,FeatureType.TROLL_BLOODWITCH_CORPSE,FeatureType.TROLL_CORPSE,FeatureType.BONES,FeatureType.INACTIVE_TELEPORTAL,FeatureType.OIL,FeatureType.SLIME,FeatureType.FORASECT_EGG}; - private static int spellbooks_generated = 0; + public static int spellbooks_generated = 0; - private static Dictionary proto= new Dictionary(); + private static Dictionary proto = new Dictionary(); public static Tile Prototype(TileType type){ return proto[type]; } - private static Dictionary proto_feature = new Dictionary(); + private static Dictionary proto_feature = new Dictionary(); public static PhysicalObject Feature(FeatureType type){ return proto_feature[type]; } static Tile(){ Define(TileType.FLOOR,"floor",'.',Color.White,true,false,null); @@ -1034,7 +1034,7 @@ public void Smash(int direction_of_motion){ } } } - if(!Global.GAME_OVER && !M.AllTiles().Any(x=>x.type == TileType.DEMONIC_IDOL)){ + if(M.CurrentLevelType != LevelType.Final && !M.AllTiles().Any(x=>x.type == TileType.DEMONIC_IDOL)){ foreach(Tile t in M.AllTiles()){ if(t.Is(TileType.STAIRS) && t.color == Color.RandomDoom){ t.color = Color.White; @@ -1530,12 +1530,7 @@ public void TriggerTrap(bool click){ B.Add("You hear a high-pitched ringing sound. "); } } - foreach(Actor a in ActorsWithinDistance(12,true)){ - if(a.type != ActorType.GIANT_BAT && a.type != ActorType.BLOOD_MOTH && a.type != ActorType.CARNIVOROUS_BRAMBLE - && a.type != ActorType.LASHER_FUNGUS && a.type != ActorType.PHASE_SPIDER){ - a.FindPath(this); - } - } + MakeNoise(12); Toggle(actor()); break; case TileType.BLINDING_TRAP: @@ -1629,7 +1624,7 @@ public void TriggerTrap(bool click){ { if(actor_here){ B.Add("Scalding oil pours over " + actor().TheName(true) + "! ",this); - if(actor().TakeDamage(DamageType.FIRE,DamageClass.PHYSICAL,R.Roll(3,6),null,"a scalding oil trap")){ + if(actor().TakeDamage(DamageType.NORMAL,DamageClass.PHYSICAL,R.Roll(3,6),null,"a scalding oil trap")){ if(!actor().HasAttr(AttrType.BURNING,AttrType.SLIMED) && !IsBurning()){ actor().attrs[AttrType.OIL_COVERED] = 1; B.Add(actor().YouAre() + " covered in oil. ",actor()); diff --git a/Forays/UI.cs b/Forays/UI.cs index 49877f1..050b74d 100644 --- a/Forays/UI.cs +++ b/Forays/UI.cs @@ -212,17 +212,16 @@ public static void DisplayStats(){ }; break; case 2: - commandhints = new string[]{ - "[v]iew more ", - }; - break; + if(Global.Option(OptionType.HIDE_VIEW_MORE)){ + commandhints = new string[]{}; + } + else{ + commandhints = new string[]{ + "[v]iew more ", + }; } - /*if(player.attrs[AttrType.RESTING] == -1){ //todo: am I still graying out certain commands when appropriate? - blocked_commands.Add(5); + break; } - if(M.wiz_dark || M.wiz_lite){ - blocked_commands.Add(3); - }*/ Color wordcolor = commands_darkened? Color.DarkGray : Color.Gray; Color lettercolor = commands_darkened? Color.DarkCyan : Color.Cyan; for(int i=0;i 1){ + return "Boiling blood " + a.attrs[attr].ToString(); + } + return "Boiling blood"; case AttrType.VIGOR: return "Hasted"; case AttrType.AMNESIA_STUN: @@ -585,7 +592,7 @@ public static int DisplayCharacterInfo(bool readkey){ const Color c = Color.Green; const Color text = Color.Gray; List top = new List{new colorstring("".PadRight(COLS,'-'),text)}; - List name = new List{(new cstr("Name",c) + new cstr(": " + Actor.player_name,text)).PadRight(COLS/2) + (new cstr("Turns played",c) + new cstr(": " + Q.turn/100,text))}; + List name = new List{(new cstr("Name",c) + new cstr(": " + Actor.player_name + " ",text)).PadRight(COLS/2) + (new cstr("Turns played",c) + new cstr(": " + Q.turn/100,text))}; List skills = null; List feats = null; List spells = null; @@ -783,8 +790,10 @@ public static int[] DisplayEquipment(){ ++i; } } - Screen.Blank(); Screen.WriteMapString(0,0,"".PadRight(COLS,'-')); + for(int i=1;i{ //a Dictionary that returns the default value for keys that haven't been added public Dictionary d; @@ -1074,7 +1074,7 @@ public static bool IsValidDijkstraValue(this int i){ } public delegate int IntegerPositionDelegate(pos p); public delegate int EdgeCostDelegate(pos start,pos end); - public delegate bool EdgeBlockedDelegate(pos start,pos end); //todo: really, all of these should be changed so they don't need a PosArray + public delegate bool EdgeBlockedDelegate(pos start,pos end); //todo: really, all of these should be changed so they don't need a PosArray. (what about system.rectangle?) public static PosArray GetDijkstraMap(this PosArray array,List sources,BooleanPositionDelegate is_blocked){ return array.GetDijkstraMap(sources,x=>0,(p1,p2)=>is_blocked(p2),(p1,p2)=>1); } @@ -1387,6 +1387,10 @@ public static bool CoinFlip(){ public static bool OneIn(int x){ return r.Next(1,x+1) == x; } + public static bool FractionalChance(int x,int outOfY){ + if(x >= outOfY) return true; + return r.Next(1,outOfY+1) <= x; + } public static bool PercentChance(int x){ return r.Next(1,101) <= x; } diff --git a/Forays/advanced_help.txt b/Forays/advanced_help.txt index bf468da..046dc8f 100644 --- a/Forays/advanced_help.txt +++ b/Forays/advanced_help.txt @@ -7,6 +7,7 @@ attack will deal damage equal to two dice with six sides each, added together. + Stealth: Several factors determine whether you'll be spotted on a given @@ -15,7 +16,9 @@ you're in darkness or light, and how long you've been within the sight range of enemies. Here's the formula: + Skill * Distance * 10 - TurnsVisible * 5 + The result is your chance to remain unnoticed, in percentage. (100 and above will always succeed.) Darkness gives a +2 bonus to stealth skill in this calculation. @@ -25,16 +28,33 @@ a 5 instead of a 10 in the formula. Because of this, you're much more likely to remain unseen if you stay two or more spaces away. Enemies automatically see you if you're carrying a light source, or if you're wearing -plate mail and simply standing in the light. +plate mail and simply standing in the light. Making a noise +while in plain sight will also get you spotted. + + +Noise volumes: -Spell failure formula: +The volume of a noise is how far away it can be heard. The +sound doesn't pass through solid tiles, but does travel around +corners - basically, wherever you could walk to in that many +steps. -The chance for a spell to fail depends upon your exhaustion -and the spell's tier. The percentage is equal to: -Exhaustion - 20 * (6 - Tier) +Explosions, alarm traps, and scrolls of thunderclap: 12 +Combat: 8 (from both parties) +Collapse spell: 8 (from target) +Words of magic (spells & scrolls): 6 +All monster noises (growls, yells, etc.): 6 +Items shattering (potions & orbs): 4 +Walking on gravel: 3 +Any action (except standing still) in full plate: 3 +Changing armor: 3 +Items landing after being thrown: 2 +Switching weapons: 1 +Trap activation: 1 +Using an item: 1 -With special thanks to the people of #rgrd and -ot. +With special thanks to the people of #forays, #rgrd and -ot. diff --git a/Forays/font10x20.png b/Forays/font10x20.png new file mode 100644 index 0000000000000000000000000000000000000000..d2b34636379150150375462d24a7d86b1af7c3f0 GIT binary patch literal 5343 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 literal 0 HcmV?d00001 diff --git a/Forays/font12x18.png b/Forays/font12x18.png new file mode 100644 index 0000000000000000000000000000000000000000..e1f5a82a6c18e23ed813371534d6d86250a57974 GIT binary patch literal 6142 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 C2FoP? literal 0 HcmV?d00001 diff --git a/Forays/font12x24.bmp b/Forays/font12x24.bmp deleted file mode 100644 index 2c7b73588f4b0d6c32e70397993e7f21af33be97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110646 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 diff --git a/Forays/font12x24.png b/Forays/font12x24.png new file mode 100644 index 0000000000000000000000000000000000000000..c9de3c6af15f01d63382fcc510d670964b9e324f GIT binary patch literal 3854 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 cniDkbfqMrn0Gcr!O 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 Mtof?^g+=gx0m`?G;{X5v literal 0 HcmV?d00001 diff --git a/Forays/font16x32.bmp b/Forays/font16x32.bmp deleted file mode 100644 index 7ad5f95a8ed667e962cc6fad9df5cee99c1343be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196662 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 I@Mkyh|G-$UlmGw# diff --git a/Forays/font16x32.png b/Forays/font16x32.png new file mode 100644 index 0000000000000000000000000000000000000000..5cadcbe179413b9d87501b2b0befd2929c32c2fa GIT binary patch literal 4779 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 MK$+fpr{fgyf4GJh9{>OV literal 0 HcmV?d00001 diff --git a/Forays/font18x36.png b/Forays/font18x36.png new file mode 100644 index 0000000000000000000000000000000000000000..8083396c15c710d87a9896363b125110bd4940a8 GIT binary patch literal 7899 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 LR>mb)?mqf&vyT8B literal 0 HcmV?d00001 diff --git a/Forays/font6x12.bmp b/Forays/font6x12.bmp deleted file mode 100644 index a7e2b99b14df0d9a758807c76526da7ea7fc4a79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27702 zcmeI0QIZ=+3`3R5Zw`)#dWhSE2jI!O!K#kMr000>c-GKN>^+nB@5y$NYVN z;iu-`nqg+&9a_GfWaq7aIxxQbBlL^)-FNS%e4gToWuCC459QMjh|_DF<@dh8{_pc^ z_y4!;^V(0hHSK(jtuOX&{eSCsWM$i46J0;=e%?*_vDl*Cm5vwfn`C`{-`zCmCE~67 zY}MB#BjL!WKFG@8;FDm;xE<^uLc9bg{$to(>|J35sU=>qRpX3|x>+L`DG}iEC}bij zAG&-x$;lNZrzX2tvZ@Il(lwBT1mGkxm7WurZi7jlX$VQc^{KU9rs=6v4kWQK0g}cU z^g|8G=nCI{eqPm%l0etUiH1y=6NL9OjP|G?y%esDyv~zG0$o6Lsa0=Ry4{uQ8Y%rI6X0nH zr=ebAcQWkoj-Av9?`~oc55aBzaj)T;me&(d zR)CmRFv2i5;`)CMFkojCC8pk3B;)pkhuC8YY{=mhjC2KjI;}*e64^TN1mT{kyHyv{ zJt{~qg)39@Nh9GJbU(H0388WqV&|)VogomQv3LmvvSh_cTNJ5NMOb z-orOJ$^9?D*LxNvL6TL{1>SYOj;P(rthlP?A(IAqxq@rHyVRXA&TqxDlNgnd0sMFr*ad;%EAXzc-_pA#7>=ijM2{wbTT~7iyaJS-+!)=JFhdhR zD_!r?#fwQ88C?lt1b}hQ2wz3_BiX&W{)8a`rpls)rRvp{i*D6BBRsnmLN|bp^N#QR z>rY?6U9O+uWDl7bzpMA%jPloSZR=aTiiu2*N~KyZm|_1c$>o+NKe8Mt zyFLpeX#iTvOr^_)f=aU0&?|kkj(m8u6TJ2X;!D*BN`Net?nM)%j(3OHEfPG(48tFi zK5GSgpzD2e=Y^edrKf=r1EM8d8MU0BG2|n-hTcwUc_|z!xpdjPyzmO+ z365)mx~_5Tvs^jDRlkR++j^Q~-+5)XS+ZyD(bRoBt-)c`VUs)Y`Il0|L@OCn*@P22 z3t?@P!65FjTck{klYzZVBismH)JT@Znx&!Or!`^Zq)bYtG>k%qO1YSFOyEy<;upR^ ze4RW^C1m=tg;K3_dx^$D!cpp%jFeRt0-Z+Vt*to1WdTGv!yfJ$PjFt?8CQB57%?DP z!j)0W`5{9>faX`qK{=c5`d4W*)RR{j*E{AT1Q1WR0>rKaCp~3Newtwc62v?=i;&)4 zM_^Q|mW{<{VP6MZ?Tx-^4fkJMauz$|7h_*5`}Sq(0xL}a2$68)(?8DHefkCBOXXgb zP7awM#fMi%AtH6FMK~l(5{R#|%6P&~OgMn8#8lq*tlge*Z^h2^Io_4);oVzO*Gu8A zVf+RB6Rk|2d7USx0>(v4-3mfO%k}Ug_h>v}hL!K#%0yRWZ8_s1!Wd`e%yOOg&%aDa z0Q7>sO9-IRH!ay`f}ZcYEcU%%w&a&>RTo%c`t>5=$ftjtv-|W5#FxswDxIuM=w0A; z@J%vEMgZ_A#|YjH7^OFa$L!$sP(e>9yo6bH=9;sjRMkO0s`VS(p5pxjrTB(3ftUVcz+eVD>C0 Wf4;!^0_O{yFL1uV`2zpn7x)`lm?m-n diff --git a/Forays/font6x12.png b/Forays/font6x12.png new file mode 100644 index 0000000000000000000000000000000000000000..88d8da9448cd3adf7af4b8bc6411272daadfbe4d GIT binary patch literal 1761 zcmV<71|Io|P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv000J1Nkl3AwS&NSeZ-$@Ek4WEzu!l8GJmd`%+9UeTc0^+?qJh-XZ3B>py+>wKf(yvsd5yx z?>alPL8P8AQ zsp9Wy*B$$vm@__STwe2|))=d)lbWiY#p2tEv%+H+XBFdj?o%;;r;m(dSs!fsjD&L5 zdY6KBQpUi?AW#)vHC&=W77YVY$m1R+46G4U!u~Fhl^EIJQQ@`@Vrq^u92tJ9{S!?{ zwV^Z%hOZk}cfZSH=0CHi)*Ty+&;-Vu(fLAC`&NUIYg^M}Q)4qghzXpd?iaRrGvi${R>?-ms|*Z;frGyGLt zGXIc6^poZQa_g;ROl@%a@O0Hp@hTH3iNFuql1v)VoB534)%`3{z^ zddI=@RX(}=Q1#FDe}?`uLw_|?*-4ofJ_Z3tJgR}dvV)qjb8gk_T;XufbrZz~H1?bg zHoF6s)9927Oclqa6(|;jf3_C2Tg3(qZBf6v17e0Jsu5+NQF*+}pUf|IZhVh@-sLCr zkJT;1MYYfNsT^du?%H8-I(mhAdR231|5au>&6YJ(rE#L%XKN_GJNT%Bk6JZZ6Gnq*Y#hk{3OA)eu|~dQ zf2X0c_}PV!4GJo+)p!|hanNKuV*Y0r6*l0ob6s3__p9}>t5X?1-SsPv3`aE&tbb*_ zz&)S&v&*+#JXik}9pCkT&DVO4+Q*omjQ^1@Q732}L;;%5{eKalpwEWKAix9^6>udu zOc>bUpf)T;IFy0yWTG4)&iq&Nk?mvaYJOb*RKL}nAf0AS8x0p|uw?sG&O3G(Ut@D+ z4V&4^1`C#dmUq`r#z)mpmU|W#8eXb3X0O7(ss;C1r>>Z`#Tq-oXH;+3ISyub@gK#g z#LfK4_|jcpF|#vF{M73CRIFF?W;9a?d$TN;oOar)fdx&_&oM6 zR+kwsySTBqR2^h>qUgNC{|i5sca|4bZL1%L*TE$&^LKynUxivuz-;_z1ek!TLuBMe6ol;a z&iTj0;h!Ow*Sq@>2CFVzjWB9eyr@)|WoN`ZR{4sAjXpAeGJF)=7$0_?Bmb+$?8K|& zYK@!aj^$---pbj^fP?H*_*8=h^WWv6!e=x<##%z0R(PJ_P~n>8CG*o6)K4~(Ebk8g zk!B%%hHa?fN2bPDNB8 zb~7$DE-^4L^m3s9012&0L_t(|UhP?njvF@&%>Vy%+Z5SUCFVs+-q?2=ph(V=_!tg{ z^!3M&=g(jNK%oBn>InVJee!4eZtAPnXkzDia~^@KE|=x{^LdYRi|-uUJgevBgTRBp zgTRBpcSm4nCwpe&cW2L&|APQQfPF!(OaCW+NxSnG016+6ovOjkFEA#;&)%e;voDQl z9+Q}Va@D=tJ^$(gg77){3xJ&kX00!?_Ih5v76N2Ve9Je&Yd0&9Xu#Eh&V~#U3zT>Fvs45bHfq4B zeAlz&-&5?}0Cwl=5;cwClix9X9G5F@tVbQM+)!oQsf%5rXRJ;WeR~*nZ^`H1Yh0ipH(=q=EdtW_w z*PFZNu4W^AuSaO$)TNy*;q3E7IIA!*kk(i_iPm>hI}ZFh1S+2D=k+a$Pvwv<6OMc+ z23DJDOZ}X1rut5>MtQT^GW?R^+l}Rw_Yv zxit@_K^<*!HJP5HeymtBZDt&E?~`*hYh2xub2n#dPTilY4x+jw{7UYqn!DME;zVz{ z{Fvgk#-sS*dgk=GvgdpuJ|_Cu(WPX*cJS=hZ}-0A@E!fia&Wrs>aX52?Q}NToMZE7 zS4X;Yr4xT*dus3QcS$bY`83TTjpd#1ef8X3U+$heU3K>1dp8U(qm#dpusH!$3rmdw z4H6{$Y@pV`z1r_K67sZBb*{wms4>f!{??=tI zIH+7?z7@Y+f20D^5$c3zm%YTU!trE(b{6v5$4)c5yghlJX^Z;8ke;nLI4&XnviFX+ z32#(vsAp8pZbqdVooWl}p$R|Hyiqej)uV%tt4|ky#T|xyhmX7c%kojYQT4oLAo|;# zt>>?*=WhL+zI5%o`wA0Rqb`?G&#~E^==|;;k@!&hh4Od$eBqtWZs)_r=ia*=X;)i2 zv(0H4+n>aAwra0vKS)IFnKBbSH9+>iL+WTn6$2#DKAtPw=c@;-Q z68D+&!+bblR-knY;mA?#A^S;lB2h^5M>tmD?&iTTX89t_yI8nIFX8jFL07y~Ez+|T zKQ~}mZDSGmb+OBP6#sNUFl-UO-CeanI7}2D70%NdFnx1zc5=LWqW;ZnxE|~Fj~d`f z3{ID7zbR~(K6HF^YcuVuF3zYg63unob=WA)y<$=|O6;$9DlV)4w0{-0uD*!RZtggL zsz;OjcJbYL@8*;1&qN=Tb|LK3&s=Qjx$ALvj%KOj;j7MFJ?=hVu}SBJ&UrFd zSq`|Lo+a<~j16=t5V^)oiLUB(t(=1^QX(MXELb+E~e36LCYg4(|GM z9SrWgCgtp-!RWw4z$K(mg5U-;!T~KYip;DjQH>mKOhi$A5&};#XZ&grcnQ$Go17~w zJN$P1VSbnoRF_nUTrAziV#QTqylTyq|I-{@?UkS+UFs|dT|6iE6WrMnk__o}R=D_( zR;50WA7{_m?!52h>2OH2vtwh`0;S>1FVlC2Pxl=4wyF`EdkJ4Bd{O>fEXtpn--%w- zJ%Z)mt%u7gvFB{K9#pk-{#VRV9P3{vw~riu z+B=zN48Uc zb*4@G!R0^2&&@{HKbO9C{jcv7zLo2>H<C`Y(|e9D-ScjJJNlQ*rk!{l z#~uG%4N~o3T7Wp*&3E^HH%HfBE*{nYUCm7NIl1$S-cEK1)LRHY$K&62+;Bq8xqfyP zr`}_MCjJ<~b^u~|tnsfzO#!Sip%|6#ieEx3CYW^qx|%3oj8u~vAY2)4&Tr*jwXNb~ zXRba8FS@ps=v7fm;$yftv7Rh3N`x5ynTV@?VYp8@=-#>W4wi{fckLxuO%|le0k^=p zbEln(`;!Id#Dd{$pgA$=ohip&`R;T*Qf*5xM||k=&*kU%Ut@6g-1*)9PWB_RwVQAH zUgc3|rox!n>3%-x|5G~BogM1F!~gDc7He9cZoEl9Dy>r7>u43T)6M7A_d7Wy*t&Qp z*zf2;8c%n}b2HqXv)%4`SO1PQ!ig#~UV~llbsKmsa1u|H*sn{I_}#!%!mo;m&Ro$D zt_*8se}Y*`aK;7op5df;m13p%r-n$v;SP=`?kfH|A@2I02vA*UTwN1!b$#NND7Wk& z4oq`TF+O3R;gZDQxUG5%aggCKR2vg%&4)IO(ZU^anLyvDP}*- zBM~tr{%MoDfw1P0)XwqO#g(20 zY4f;y5O@%H5O@%H5O@%H5O@%Ha|GP~NZSqnllSoM_nhwiU2Nas{j2%&M{@idUb9O= TagFMy00000NkvXXu0mjfU$1~o-L@4{JymCtAOJG6UiU)( z{r%V9zVP|==PzG=spx;T|EKn!zWhstTL1rV{S=4-ogVH5FNfC+yl&ui1JB*S>+jEV_w{1GZs099fZwY--lN)EH1E-$d|`4s;fej10UYC- znB*@z;v?g4;VXDF-;Y`Q=ibN9`gOp2b@y&Ps@;Fz({0B0imz8b%jfHzZW-^p@Q)78 zuD3J&jfIaMq(}WEo4@hk-*l_*<2vt70sO9Z|FulTjPDh1sCp2Ej1e>5$?yyUvS%qqr9+O;rN@T(Q5I6{R1iSasnI>E^PoSp2Ic^W6=@vV4 z9BnQr0}^}O0}hC~PpTadBS{fXWR=`KNK>V=dS&LHDqXNo_giz7psh{mk!!HgvqD^3 z*mD;(h75kp+q)=W@wAR{@sT9wrmwVY=r&6gE^KFh?(b9 zLPb{Q5D>VE9=Et#sS}za#M%*~T%f-U>qY&-& zc=t4!$6lJks?bpeXd~?)Q^>s&m+WY1JMho#+#X0XxHp*@^~ zt4~z)$b!H>Yx0x{xlR;Fm-Q>M^id_q7?(kT#Ob3%h+=(f>b58qHT5naqnC9gIs1L& zA$rXALk89OxKnAnZEXXzC$Yg8p=NCn)Cn&tw8j`}XtFg@T&-Z%BPC8i12TycSi+uR zu?8u%1WTvL1?}h6{GI1!M5jpOn%u*C!^O8>0{gF$kRtF7gp-cNKfczsRK1i8yocPV zwxG+5g?6Wh03*pTS|xm~)C;9qW;_tr`HkvJwW5V0SK_JB1T_E*wBN1nAiI^dls5Kq z%f+3MCqXC6tkhnsKCA;Hp2Y|O)p~3phRj>t3(*G<$%jQg1T)_j3_@5WbQAc}oDJL~ zyGmV?@tUCEs<)dO)ha)wW# z5+rVC6`Q656>HMg6{=6Ho7ZAw{^^^dV@^Z*;3%&(pNzp$>OGk9aAqLJP+3ymg|dbC z$m`)HCtyaZAgO!^vSHZY9KB`HA(DD}(_V@D(5}U3u(6RXgsNdh-L_}EWW7uF(#bpO}Q)C_+U9^{;&fUz8-r<0_o!d}Im$Fe4VS?5S z>5d?4vbI{$ZZ=gGUMolkn}!asxBTb~9!1Sax?t81a!H!QggxL^&sJ3iNU(@n2lpV_ zD>}}^D!zPhPO`E3hs-3Tki?~mDUB%ebiH!ZyHu$@%;Q0pGw-7Z>zQbFSEbejkTF?{ zoTmN?VO>5l6X3rXdLQVGr5?_aoqgH6YZ-~Rdc4}6raNI%*ua=$wh|8rx?4js5f&=y zgq$p`iE0E_&8dS%y4BKAjGM9L5v8k#@^=;bV%UhsNdFM;0vgn!PqE_Ypbe1{LcRy^ z7Tcvt@mx2(!j0L625Crt`I)F1vvhJ04uE<%M!+%ZRw%;wfKEv-vN zE3Zv^47gAK;GDW^MLuRV=DrC8SWX6HT_Zs zNR_oKQIsQfTD|4A552H0!lVSYV24m55@+O0ykm&8RfxPXZG;IGJ(?{&1cb@syjhJeryo-f@{;Yl|=ouYi%?b*5Y`5?5ECgjyOx8}-Dp=co z=0*-Te&BZKILIw`OS^t$m!E8Q@8wsPa9Kkz6M}V>n#uZdI}VNVTOJt~69yRv$~Y?M z+5vS7sbjO`7yLji?wlKz1c;b$O=`@(Vx*`VQW*ePH=42a6O43j-Tx^G^g z(PwXnEC|e3wh~13h^P4RddWP1NZBw}2SV@)MrnkT@ofB2o9NF$M%j<&)8b3%FE`8? z+!;Pr!L(ek$iPwHRTy(g#fdP(5LM`GPDc_w!R~;}1M5Ah4b!*+wpdGSUGlL|AZ-gm zeanHnK()&f$>z-_ZnvpKU<&~-%*8F>sj;}uP@r7MkJcQ{mVe_0Pl>V7utq?vNm;d?w2ht_YWA|u-x6xXItZ5mY6%n;xo3i` zRf#HBJq6jR&*iOUprFB@Ypa#4)j3L#jp5a}`(Ed8K_I7%0UjjSkSPKYBt2BvBl zARMI;?sm^+7b8Ap;X!&-r<`?+|CHxLa&_SIko1P);oyh#Xz(d5kEUPC^_}mm`#Zg_ t><+K&ySRaRBM;{|0f+i4{fryXU!NcLu7B8rf5yA>U3t9z{5N2bPDNB8 zb~7$DE-^4L^m3s901Kl@L_t(|UhSKUj$}0qMEU=p23Dd`2)65#liM@X>yePyN#aMj zTz2=uAAih`Lg3H8FI4}i_j5i73<5tBfmh%E%;+cTL0}LV1O|aYU=Vl`fnR&V$&v%JyA;ZpAxx z27y6f5Eujof!`g0b&ov3Vs?NN^ycj#FbF(~K=wt*>Xh7hG{^^xf7KU2yWc%Eb^hzV zs>hB0vZ*_`s&~#=^&vm|l1F_p(4i5*;ntl_e4p~>7B|-ZP`!2XMI~7f2`^qTI{AM} z%}E|a538DIdU?u?jy`2GmBd2*5nBZJ?|$d@7yX$Qs99U>Not28wc6|M%=W5xoLTAi zU=?$wcf?1gk?ZeiUWz}o?q6-k&Ap4^uCcf65WERTh;Au63RB`E>V5a!KD#>aqc>!C zQNB)XxbIJPDaV&{S7G$2=h>|M)O@QsUG-PD_jV3C+_!2_74mgfEgVl0fh0}tWPp5C zUX`e4i&I8GwM>yAqz1WD<4Qc8p}Q{|)$&0xvl`={%PQu*ma3l|EIaZ3)He!eQe(BW zMLh57hw_#6rP89Re%)AqDkqc%MA{bh7pXhBL;TSise2@zTX&x1hsv|t4-6sFdy>!ZaL2*%6Y(JVpWKOhtD|iQ`=eKvb=O-eEJ>jy;Hntzpq$EeG~Ca;lJlt^+RN<(hH(Xj@~$TpXSCB_V+nN z^onq2kCouq(Zv(H3Qwhv>O-UI1NuRS=4|0QEt(QeHDIZ5s)b@bSO4CrSH>%6fLB;#G1G;^Bx0$0C(;j+qtZHJBdb5vjlDmJ&v)ISIZzBv@m4%g=coSF z;z9hAJJDQyQtPr_jeJtQqj?gJ5nIF#$w&E8+WhKg#T62Z(uR{-(7CL9R675{syho* zEh2o#o0E60hLCuOev&)c9<8`YYfL$NGLKa(@0fi%U#q;Ucq86-Y!N#Ix7ALjEvp@x zo2tp~cjrg;XEFyP+tn<{Vp;JZ@lrcVYp9({M=HLOxk$9-$vat$g!gJj5^gznx?ET9 z{yl#U%}gjVqGrvlKy=PCVUKJOVrPSC#lUTF4D{a@9idkwQ36~wa3pk2!)JJP@~cFb z#I!dg&AU^#>W!)g6^`nj@}bV%L0I(^8DI{^4nCRPHGefgRBmb+$n?+6+0DDEG3h_o zUnif=8`ZZ?ZBP2N!Z2GLDm^6{M*8-I&)K}})QP+y`4Bs52CDOjGfoXvU6n>eIXeDN zdY#lDN_(vr>&qWE@eHaUKX#wdHl z#?3q3+K{^Mb?v-~_P(yp?Y7iz;?zpzrfjJ?sF|vCUd5NqwvJtbGmXcsQP-}*zl%>4 zzrxhjW=9WJ9y#wwFC%-efffn$ezqHohHlgt)iBM#UkB|DQr3JG*}6o00UhOz0RHC^ zC0SQstJ*}(5)qH!tQIpx=t_7y7?DO$Vz25*-k;p5_}uB8Dj(WARUcO|DJ)5BT^o@e zDO;*;N;eeWm47u*oxaX$t2jhrR5n(74=@!J1PgIMco`TtW{pld8Pf4Ml0M2?=rlU zZGxk^LpbknZqMbm_9||XbN3FJNebuNI#zMI+9g!)l01}+72jyqt+6YA#8*_$&K#sV zk<9@5p7sdIOKAk{-J3Y8ni5SU@eu7IcgS3!IFsDI;*PUt(fa+z<|>j=@pe&&K<@}g zCU(`Zj$&0!U7b^sMT3M4mr5{Iv7R`un!!CIgDlG5sRtbfmFSSX2p6+Ew?&~^a!xrx zhf3DZs^+K5lFConU*A((lw&8o?8JR?S81WcRTamr^Bee+yeJ>4I`27Co0UGP*j;=` zOytfYEvwQneWTKoN^kCdO&^GSWPOJXMnQcq$xsuRhpW4mKFyd3sOrB8!u}Q+Fum=)H=cw8m9^o!XO_JHDcR zC)%cJLG?%3p*WL1A-1~ltoc^8+BMbn*X2Qn8$_SoJ8HH^_}H4HK#q!~0J4MF9#q40 z7ez-Hq5_coPxDcPCk?sVAmku}u4?pd-oI?RKdQO2=E+1^4NuiP4lf7?$sHH7Pr84K zkK#e5V^Qy^eq6bc4R5zLN>e*M<;Fnt!m)WnThuI2eVU!`cq%=pW`~+98J~6@Dc*JL zDEw~JQ_UjBhucr2Z!(;n1(D!b-68xUTqSYref;A3%6XD|WGB)g6;p)&?%&D1>Jyrm zs)x!c!=}=eN?%nx-C9(0gY=Htqljj?eWCibirbmzjvZIS=>0v{ioeyoApE)E>)m}3 z?QII%N?X*9L%6!nsLbDKzq>Uh+)=Z-;#f9Uvi(QR@^|P@HdiYBR=S`tB6(H1toS|W z7Z9ixj-Ol{Mcxb0eQOg$G{1EM6I=^{mG`O#)Ojm_4|z1$d`KZDjX_`#cq;;3?CmxViU#DlR8+4@M{GebC!a{Q~HNN;Ihq0vLh$0tiDj7YBhs zU=SDtE+e4+X85wZG519X%x8xh_;-IH^KO6dqMiF?g?s;9d3+Z?gU@%V#5agzMEn~R zVL})L27y6f5Eujofk9vp7z74^k3eAmeD!ov@AmiI^7*vbXKh(y20ra7T zowNplL0}LV1O|aYU=SDt27y6f5Eujof!_szzW_m~8oAj<0Ehqp002ovPDHLkV1koF B6#W1I literal 0 HcmV?d00001 diff --git a/Forays/forays.ico b/Forays/forays.ico new file mode 100644 index 0000000000000000000000000000000000000000..1c177b8fd9c0ef8bd08c39bea5fd3973bad56dad GIT binary patch literal 65435 zcmaf4bx<5lu;07GodCfdf(Lgy++Bl9aCe6zB)9|*A;I0|KCcGq;*bkA?P0RRL*fd4KKKmp(l0RYeIGaK9g(nYiYpzzv9LGgby764ov13-kT zvJ5&35z6bU=yI}>>i>=Y*N_liZw9VKmj6+1>N4U$#W>0SD*2r5V?3^xMOp&A z0#*OwiSWx)sgu@PNz07k3_ZX-p@GS^cTnQ@^6*0Ezbm+Q7feq7qGJ?%j*_I4)dt?i zqpyVezz;L2{(oIvPu1Z1axc&6`W1fXAOnXx#*zO%`cw`zbemgVOgVnp9v%~HM7hr1 z#$^2OpYlQQwvKCo*#*^GQS~f_5j7zCr(La%o^upjclf_|m0H}M&o_%Z6_O4L{9yXM z%@onHHgJ9m7=P8NNq1rX*~LR)H>lY0KyjKY868?IQhM%@tdo_+q#BSLVAx-u{?gG> zErHm{x$(j*1Hc>ZoQJ&*Uuv%pkF|!BI=Vl$iQbYtzcOv#)$GW5WoiLmQ5SfLqZMNq zbc7kW0N`4rjgadZ1yAV(E0A+>GtRvhtyc{_6A8OoRC03BJmxKPQ}{ppBwT&&>rDRP5*8<=j|`Jfa^(FdD@iF?@r* zGWcet`JD2~zybbX@i?}`asRou=xe4mOd|03r(Fc6Q%5EiPL(|nc}+7+ZeSD)G6;?& z<{i|EnyYkOQ|aDU;RWi)R*;iHIEWKkG}`5BKj!P)R5t(ZR?^yZS)f5NOB?ddbFCBT z4i;Mm(bj93g0y_#@9V)c=r1O+4jQ}Y80@40#bKH6GROP!Z_;rP#|`9}^_zLvO-JYZ zK1nIy6xyz_5Cfg(Ck-zllru`Co$7PGVHtaoQCD7>2Xh(>FRniDk!@fP4+jC1yr{_!&@dA&TevfB;S@^~r5a+f{d2!mF8c>tL+F};TzW(YbaEd06$0G+z;*+oV zw(QAl>UoVe|*TAiFNY`aWHzqR{y->IfYp ze|C1i*&luJs523^PtOwMAcKz8d;J-7;grd@lG$on5;7L?8OC?!BTSRKctv)H-{m#p zf&=!IgzsO5i5pou*P6Dj`s#EF>5Kw5zVwYubbh_Pq|Q{{Q(ysqqs?{R^UqI)ko!VZ z|4cvYw+rObr*W;_ogSsI3NP)_X+8J9nuas{doEtlN-htsH%9H0LAL9HEG(1nAO6`FuvdEr%BZRIhSV4v8A8}*)bx!6W%~zebfroe3$~s&Q z6Bi4PMGv)h>E5VL`#zp0_a$tXzS;V68Ar&@ah5jW|8DzKAMSKYA%gIam9AEn{O?bL zm}GiXs!9r8bs$w-)j8MQpCY2w=d39@Sx_eD{JZh&1LDS@Klz2lFmlA3ny=4K0+R|l zWy*>Kg743!cSQ>465BCE5ll`MSm_FsGZNPZC}Bg zjiehZGaEH4wu&y9HSo;)Wi z@&|npx{Z(Gj`%`#{q@AHsrN2$dd&~5Yrh60O9VrT$Rl&@>$L+UBk%VY2aZ)FIiHkS zsUto`+YEU<=fjFsY>8TfPANr7rJ6kmXO6$`#CAp}oKOXc`gbr^TMyOrol;7?$$Y*n zJW3t`(A4CdbEZC%BE}NR{n7{{*F#%J!G(ghP9!|B%}l+3e>jkLxLgS@vbZ}e$B6>g5U4Vrx0Ra2}ExQq?p&IZia9MHXRTRJ5+gB2!zkL_> zF0|uZelub)Gu#1SgJTta@i*JD^Lv9YYOUOWo=OdiCSEE5z1*s6{E5O`jLi>PzWp1s zl1NK@b+bT~%~!(FL7880c74(|GsXQVre7J{LB63Ox|+T}N13uV(zki;)&!pWy|XHsN4I*~-LmzGQ}j|F zp{pl^9}DkE;6;~|6PvC&O%qJw;SBPuqxea6EhTD&hA>f+5q4x4ah+zuTZsk7q!u*ds(k< zG(FsfbmkTf@mC~PEh5>ShvT%`(&jz>el)uZWr@gVnxjcU^8U_gm2s8iwB|?ea;fgH znYZe7{PQsO!`nzC#V-ZfPfnjL6$)#fIr}>b5zj7)D#&XtyEqEeU}3*Icsh0)K!xl=9YU2@s<#x6KN8f75bo_8et*U-1&rWIk~`&K0ajmz_IQJ?Mx zBrfo}wtebT4G2lNo9|T~IC`Bx3N)z2(-`4q$_>%m;K2_1oQZJ>x-u*Oo^LJ)95ICa zQ#}fpTxYvhmsHDtckLUB6ARvHmoI%>Eh^yuS;4rRRlH@VUKU_VfjJR!YMA={xUJ~T zA?7yN+K!^Oxb$kdbq+@muNpi1E;LJ}6rC>`JqaCZZS^q+EHl&2TSeUIB>^nij#rlCGQ^b?Y7c?7<{J&ibaH$p&YE27_qNuP|05Yd1ln`UQ0byN_b#r# zQ*ENAg6C>mgV7O}*Dk{fal-f3W}kmCa9WMZ|0oI+RAc&3a(V;fpKe$-^t@IuzPFEH zmK!ocXvb53cv_pfdbnVRJD_G;VC`DITJk(-9_68Cvz@Q10iCLdkV8z8=0f$?nr~NQ z$XOPCCT{mIR@7Hiw747+x3>p*ZI0@bfAdeeiXU80k|F%8f*c_26`L}RzT`<;Qn4m( zUOk9}1z#7i5w~jpwE6kL<<;W8;}t(;$rlIBKnjQ`S-P`%By0zgQpv$@eooy@2Z#Ub zS{QkIKas&LSgobGj(WnKqzwlnVs({iVzJz!F1JpfVF8))8u1ZZPfvc6KmC-~*Q572arC{&u^j3}^0|H$lsh&**s>p= zh~18kkaM+9JQp_hz&h8Z#sXjVqauzT;^en)V){T=U=jhHG`?cls1O5>+?AnEGFY_+ zozh|X7N`8znF5)7S{Jce81m9@$|}l_|KloBmT1`JbhHhpCYg|#fXC1Y*GkK^ zm))UL`y~a*y!a|a7?v=U)-Op-G7UAW}sx2J1Aq$GWdrU<}bH(oT0{X>!*&6nGl`>Oa;%`D##A5tJLo zokuXIF**^=0VMM}(()9u!;RgFlRW2Ps}glvji>V(=S!(6OJoco=y5$xWy}#IFz9nHjmB%Agn%zLN}UYPk!=BugOZR(O$K8t3agHV5E zAYJbg47Kvr+Qyvva<3s&icKuReEDLWkyhCW%W9VDx#W`f@Mv_iV#V=zc+lIupBTq*g`LVN}!? zJZsag<`|iTJu)@U;=iL^ePcQ>(TGG50+Qu8d-W5w3VY`f3Rg-vs4mq38~~44(V>@x zg%|E75yB?tf!^^kY9*`D?fkX?Dya-6xzS`VIRYHAzSY<_n_h+|1Vp4H0=oqO4%4V5 z@}WMp18;mN+l^A zWd1<@+2^ksw~7M^gpIMHv7OprJ?)t!Bl13FW2W5jg*$W6c3yrY_gOlqBZwkM=hs7r zb0j=fn}o;9m#7q)ffAk{Be^%*yWa1dfSz#9c?|3!=xPu{(A<}siXcw@Gcx^yQ>hpaV{w-)=|AYBHSlEqt`Y(%5d&dO>tF1` z{yk%cqH;By47HC6pQz%V(f(<-Ygz9klTQMoY5dfukpL0-Z3V4ziv-&J+dG4J)>+pD{=gq+6!|mdu;!K; zhP}YC(kx3l3X18KM=m}3)r%hau>uaKS`eik8 zzA85!8ASRfgZ#0ikLjN!l3szdo<{`pFRuKH4l^clNMIJQ7FI&@ zDMa~@16Tp?BbpmDzIz{76}qv=Os@wS`Q#og-6Vpt(3&itcKRkk;Q*2qrkqj}2}tq; zEC1_@8l%!0Izd51z`-oFdzjop<}(@_jNffHU7I@J?XZ&J3W>r7_`cNnGYS{?#(5xs z9AW({6>vK(!#YE2m*)~_Jh0ip0qjm24Oz z;@APn3WtMdNM@nLy6HL{+Sqd*hya*|aXn-gb{_|_1GWwPd7kT{ac;Ng$QQK%WC$=- zj~JRN%&6#i94<5|#CoNlL3CmRRl!D! z#S3yB3rF+&*cbGXqF6FMRQWqww=dvIxNw8s*)^O3KBlt zu&jprUS+aRl~j!;qvst5ns@uBX!hkZOE>uZ9?fpW{y78gRN>8nCqh^8g*Svvffjn+ z=g+IVe4_y-;q|SP3oWFF=Zwx<#`s|dpLG5%Js4>Q`+>rL5Z3cAs&%IgvsX}0GAngP z!2jQQa*~|#jS@=N0TTApjoDHFuRm5y5%m?$Gu%Ik+tVf}#zCPE>3sMy83YziWrkX3 z`klc1bB}z%3HIE&pC-FJHYytnEX5I9xl3iyfpK(zw37G(&A9HqKTlQ=YY#;tSJ9^X zkskxBWCu<*p-pm#{$_6jS>m3tW>tusYGPz@!d>lkMt)DHU37!l2!!S=N@uO%nowUz zG1o=tA)#}b%fH6T53%`ROa96z42s;@Nmuv3HHO`^m%1%heU_&Trzr=3wm`|uM*n=Y zuI3~;-atj|hPtdebm&rI%XQ+$q3F9GTUu($g!n6|kc>mG$y~Y@%q<4r3|Q%56z!>N z+_+O`r?x<%F?#7s&01_RwR5&6jBivW=)F;E12=@>M&{?;WOHN^CCjL1TP4-2?{KVp zaU3>H))9H|Y^Tgm*BtoX>Fi=wQ$`cQ>?zB7WN*E!)`1NQgN)S)53aFgqv2cpA{wbu zeJiBx(jTo@Ffl_=c48Oug0vX=w2Cct3&Rz|TA3ppf=y7OtByEU^e(4n))Lyt^OrgE z6zdF5XQf;x{DCWLS!I{=JK7Q$<8-eS^l7)pFuP}(Y`knsDiZzOkwi4fnOeb9Km;s# zl}8BEjW1l%N(W1nzN?(LWY#^w&-4>H8~rmuGi$%N6B-msrF)Oo7ip;Vxm>F)uI#p| zyuPIPaH1#dcGoLkMLnRlXX{WJ@h#=h z*Fy~y(|9eTT9@>$TCW-oI2+5H!fbD*sT&o~oGfM6m}!KDtxXH2J_KfeIOwnY(L|ME z3}Fcdm_BElo<;9brslI~*@>6h?OIv$Q@?3_`HGUr<2A{fKXY*p=gT@v5 zbT)T&gSysJjgdpE*&Zg^v(PkHytNTC-)_1@9!%oM@;_b% zbJe}nE)M7?qIQ0gdhTN?_j-Ysc=xn}y&8)j-duxx9%#M?H-EPQX5k0jY# zRH?q6)`raq9*80OIbXy+9jFSwPZ&Tbwff#C;Bn#pega;}>}lZZc?@5#-}^r&Z}>N& zP1HXrDa{H=OIODbWtF@esVQx4or}qBIztq?z+t@*n2Z z@sT|imLhtIKD2x9%P-keWHOJJCP*zd1*8%NKbwHPgDw(?nvk$UJfs{Mh(){0j$@XB zoaN>W7!P+VsrdjAO!Pk1=VSR>dn`E$x;z8IZ_s!D~_;Y^>oj)7?SB zCf8cOm4KMmtnN8f80xv(6bJ?d=-$n9%tjjR#Z(?)Sk7Br&o7YCq;I;fydp$|-zZVq zzm?Re#}HwB7%OW-S&Z!aP)rC^AY#$CEfgb^y`lbUN>)jq5NQr)t-*cAF!MdP4vro0 zU!4_3H1OfcYEH=ksS^6Av`Ah<$&bC)tVol1LZ6zX8%{(6D61d#Z2XQyJ-SbeFHQ_< zZ$3{%cnlw`F&-=xq-+L82Plchu4!Og(CtU{Tkb$P{+V?5&_~Qeit!q3`#3{8S)%_asw-@Gl`Jhf^4*xRBl-q(r zZ+NK-L?d!^nR^W zRAkNmnM?80;>Yi_ZknA7mJy5wovqAHBS~#eu0SAY8{a&P(3uueQmapXVMJv}%2-3{9W&I7^PhsVfU}{(Tt@Upr>a{9 zwY3l{iITDL-a~7uU|k!%c}Opx`HwXwG|h98-cDAZvre7)7rB)&!A$>-JJboxt`wqg zl|_!Waa;gdJFRhHKVDTVk4{VRd=;vP^#=OiC`1zgBcfMC%x?w-kqA;8*jRaKF=(^aqhhv(>NduE}U(Eh6FA?f?WDzC;+&K(Ybfao4K$#0CQ|0=)6b$jP$X5P#4 z@Xtj_8P-{vl+w*^;T#r~gI>#RRS8BhgZ_~cQz6w9t#4`5MpZ}(nK%eJTz}77Jy^&C z42)m4WfWXUIS663PC+L7TjAXyqXe6Zn{5bol`-leGqU`sInq^c)N}Z2chkp3)w+!0 z{eUB7<2wo$wWKvR2-{k((@Cexq5dYef7!2NONI&;vC92(#2Dj}rqv9R^yP=isiZ#% zx}}qs>>wQiz;<~{I<|qni?^@O&{}-^C}Bc68y*6ER&Z0OseYH<0U+jFDa#Q7WGJ6W z;#Hm}!}dvRhh<6bxzihnb~n&{yr|wwYlKIj&5F$p0PT~az7&Oph>_#z zmsyjd0bTbp{@l7VcWGIU29rxG-EhMm1fV8C=>A`lwKNRZ8yT^Mik`vex0a9~--wG( zrD2!~%`8KlVYR2ZS%iEQapOq?dTh2Vxc(JlYfNebg@aR6kaoN02iXBlIEG{QH{Q;)!6?xTGz+zS|pA6?r7u&6KkLjupc<6{T2V)-rSa*?5i&` zrE8K}bx`i#*+uqZO(ol-a(&j{G;dbj19LZvPcNgfsI3f{vT?n!!nL3x!OIjv`Drhe|;6 zNiXk@>q5vQG4?y@tIOn@nXvN)8};MVjrn|+b(y4u>NvNfnePSHP7I{2Y9)SU^mAH& z=AZHn>H~=Uc1AO-a`3+zWGPlG)Cr3kL4kxLEk8Ce(IrV4EX*+9cId9z+&&$xiwl&zSw5vjh2{ zHCp_p{2(tP1Af1q--I-D1O2LWk`}o?b_j=c zYa)iciB~fD-A&;Y%gCu$F*n^#PUOf?ZhWf;-DPc`JJpiX$_yW{Px!ap+5dqc~ zR5jdl!L1kbNQQ`ovDO3p{M>XY|{C$a0;Bpai z08*2~$q0A{0non(eEIv9G*9he(*1TL#F|{3VU0o6qdIzzD;X!dT%+VVMu0k4b^Hm zkrn_LkJObz+~gGQeD(MJMOq5K#UyjN7&Q3 z?kQ83u)PLEkI*Dv=xzOnc5;&7Ofg$z74R%DlYju?ru2q%7#ZfY!y-lWa+U zboTqB?OJ=TE@yn0FhtCDVYpsfJ3l}5Ny1pP&gL0TCS0C#?6+r(h9Uno$r@C*aX&On4= zPbk6IsxA_`xY(bozN+&A_?1R$=8Kp%aO^~OHG}{`g4>q>lG38X`Y>JIx?8^6k$hHU zU6h#RUt0IVl7f#$qt|r4FmpTx`g4o3?U|{&HF9ez)%(yHgjVeL$YuaECv{}g z^^_MiNw3Afp1ZtiJ_$~S!M?DQ{JWC@#Kg9I@$qk??iuA912oY#I@}KgPuw|uzdExS z-8b5I+TpAHr5>@)z|3H0KG-2%RVdS!Cp!3JQcdIjLmB0FJV)~u0KG7%Z5^WvNpYx< zSfE2EpuJ85K!g2BL?eGs1tURNZ^obYZ}fZQilgdLlTtrxioEmS-W5a+zPWY zg1zsH3*TJSk4x6LOaX(OO?H~=BWKsVmlWpc2{U&c}D z8@D(fh>plrHC|l9AJWxxAXRMHanKg>_v)#a3WY$}EGdzCq>J6z(7;Q64WJ-+gA%rH zL$O@wFQ9fH(hKh^{+04mj$i_JfwqX;OQ-MF+o+C5qUjYxiuHc4k3gTRA}`?XPc)F2 zjRJIjEdGJ^O-2cIjBgwU4JjZJze`ii&3 z%X|8Mq+nh@i6>;$3SRv5J?|CwpWsO={@bmwSE5Ry8mlDVq_TP#2Kj z1fgRNrKmNcC1w^ZV-+F_8X^OwmOEbVPZ!>;$`KE$?`E3j2ykK`1D<~u0 z%BaCNBx3wlojj=UH{yg!-_X6#^Zb?%`C}42bRWDetDBbbt-n6uJIJ}Sf)Vsh;r?pm zLqO+&^io_(iHL<5xrO0{jQ$nYv*Em(T9gsR=?VN*0kw&#kzS%UeS6o*gcQR0XnB$= zr44M}*}1u}q}#k`nA<+q%7*U^g7Y!yKHSG}z#AF~7Adi55$wp~HD1RQd^xTk9}bP} zJk5t zMTem{1F=eFllFeU-q$O6Jp&(Zs0@s{MLC86O`}d02pew*$oc5EU>{dL(^P)u&jL-Q zLGs_Klo*{a(Yy6w**S?u-zwmJali(5BHnOyZ$nh_i9uBCQ^YwxKC$W*2V@b#a8C|Z zAM$Iy_JX@G$N+w(EWD`Hil1*q_F(+c6TVwxnCihSEFwQ$F28Ic&p#5tEH-<0sq6_b zoHGf4B}K62+|Wq8JV+WOucn-z19pK|8H{?_U8CCz_}ukKW(bpqJewCEB^Dh#&oQ`NYQW8tkwt#f@2#qjL^F-63w&UC1G$(;ku~~ zmqt4mXhP;8@4uG%gk&=1-|`;x8|x1vh9Cha-H-6<1=TsCiGLO;@n^+SiKTHrVcGNZ z(AkUmuBm-2KsY8cTvW(F8FlLd@)Dco@smym=p7UXfl+{dCHryTnFcq@k*)zrH4ASo*%7v1k zopR!sQqfm)&#aRdP9bp!o%E+~FPh0C2FRFkCw`i}xL{4?qD~rfU4bArZ^Xf+72K_| zvJ+l)#*DwvU)}69jtK%R^le^IA)^Boc_c#j1qiu{@Jf6{IRRB=dc1)f`Uqg%QqbHKzd@4|pt6CyuLDu21Ku=8c|l#*IcHqc zrv>~3M##iJBlD2#iW1Ce%6G=SY#te>QW#?5%B}6!3bFR}ip4uFm-zbS0y<|+{ zjkGADb#Q*Z!q#hLRL``;m<6Y=0$m<*mqHe+2$nSDST* z#d==CgD>dtKV7-NXTB2Y+xr%gRe!*gJ|zuQ*IX1x>Y0#(H^;7uHaaw^0{W*VgM^ z)^MBBS@vt~BssJcTo&r6sNo~O6hr_d^K`yHxXAfL+NAzSq14HbHS<@Z<6}?i@Lcxs zxhex@!rUk9E@BG9({#d9IFZ{$mL(;eIE2*8OYjux0EFK)H!*bj11Rhlb*W+)Tm42+ zN%4cuVcovG>(h4ufl?xYax{X#w2g$|3)V?%h?+-GhbYA|`mRWBdnxV-`_uP>#f~a| z6zG!AX%Y9o*Q}lI?k0hHaL~2S7@Hg(QJWD_rof(MK0lITsLg!El6o8N6>(NC43tG@ z5n6(k_l}VGk9-S5InXKBC~)muy2x$|7ST`TouVZTOM#b-bDPZDB<<3WsR}x=iIJ0oS6`Mc0&kgMo{Fe(^QRl8c{tA9UE1k6a(FJdVla=WA0`r zb&yUvh-aBmiZ~BmtsUVQ=FV-WIO~>Q=jdejJ$`mCDe89zx9V0~gigX#+e{;{EOZUNoaExL!5pmd3V zAJ#uik@~DFegWkp{oZjay6|B|0LVt{?i~+>>bYR6sZ2dhmV~C^@3@N=5%Ybp^WC7y zP=`yp!^Oo6=KOY@NxSCLz}{>6BT>jnT{d?4dUx!kSvNXt7?td_%{sLd?l0fS@wq<1 zmx8IBRj@|O{+G9cQieg+RipH+qv^bBE!do%&MVe0P68$~@a<=Tfx3nob3wCM+Bk3< zBEYqE!RBfhBYvRz=cH`;v;pM39FcKVHBt5*@2-_`fOn74B3bhz+wCIiOJuEki`Thshh(Csh$caa^hK)MoJw^W|n&d1| zG0!c*YoeA~FUwnIUEFeN6Y1uMbPoq|hofCjh81HS@@piU@_K105CMpJCt;iENGw4| zjnG?MLej)}><9m#xIWqYS7!tX6@NW2&>=f@&(l)!4QeM(S?9v$+&Kh6C5LBwik%;N z)%B!I34*XC>9j$>8bD6jMp82Qb{ry&gUP9p9&o%2{|+AEJVuw1hJfZzlNTdvDDouo zhqcRqg42|#_Rvb&DS-YHWr9K+KoKO?MtOA>nu!E>GT3!fj_s=MUaVSaA+LX!^s!N9 z1i(lA~nt$xk{CcY0U?dfClbJEEJhy z4F1!iIy9(xAt$h?t0{$54LcPtnwYmKm{Q04(CJaAl+#Z^^>&yUByW-@SGD`Lgha}Y zZR1@u6r@FdQeMeA)C}0ySwkjmOo+Sm2p}-HzRxt5?|RkN$gaY&(sf61fk`3>#S)9e z3NQp(GH^9d5(2#qB_ohe_WY?ftdkPDDzb1AqCHHmIyYU-7MXrRYRXjB0I$7 zjdh9bx|nRLr+oJHUOv$uAn!c5A-MA9LgZB^Xn~d*c5#_LT0IS+vL44pkhcf$&H{Peu+ahr60VI##2WF{o~YBL~=!zXBaUsD~%iG=V1l5eS# z3$Xj8>d^!#S`LTP%U|~P)kS)rT6oZ)-tp?gdSA8R@~TXC8I8k!^BVB8D6xEQVO!_> zM*#5fNAnU1ubayRybDE8wT=jMYLbom4?@D-EIeq}u`_$ZHQ)bN~Hw zOL&?-=c6)}41>ozm;dmXWznF1a13u^fF(f`aZl$#fdln0tOzgTbSHcHA$j$?jE> z&qg!_=Yb<#34ztplMXtBtel)f_C(Mw?NL)>dMDrgQ7r4?8aEBi5QGicuJ9?p z${>KDUd3>}Z}-~5seTYCo?*kfidte4BIt8U3eaPsuaF2uQ$P!4%0`bR!azu1-{is7 zNKe8_4ua5~)tFop@;U|?Uv8-2+63gt_1tH~{X4n8QF(9JdN;Ivzr!8iTLu4^uZRGE zaphGAgi9oQFAXR+yD$Mb?vBsbXw*}MV;@Wo!L?lD-LVg3Nrk4j!3=3aP21;2b;%nn z4$_l3=5FCsD!v9&qDxZmbA5e{rgDHBf-6U%ZwRmeb+25%=qdnl9*(*b{}}?AU&-hH*L_3OJ$sT+XLX5mC)uzw*3&?{(P%s7tR32G%;z#I@4~*zNAXqrg zjq|SW+8-4Wi=t;CC33S#dX_=qcswFFB7e6EMs}4pRH%Kl^R$)v#-IMeJ$*J(*0T$Lwl0{{%OzS?tTnsS2QR`s*PBd9!9cX zqJ9(?0Pkm7T65S#rp-JBO%Hebz>Cd!8@`x_oo zd9nvp{vk_Jb0kx`Jqb$NMn#k0d_AQ=5T^uHT$%l}&(k`s3BokW1H#RvwTxT?tZ;2m z&HIHH!dZw_0=F8QjlE7tbAPTHzVIQ$Gr;6CtTZ=ZNbsGj>Hw*133Rs{1vd%k4*fX4 z5Akk*zQUn7L{eHPXv0y#p%OvrT0aQpWEfLMs&0`&jWE(fCYjK^C()q+OH2hR38R@U z%sM}54_K9O10l7=#k-$8^--%>l41tzlvEg*RDr?zO=Naak?%cs&V?t}rro-$CL3~d|#G%kMKdS)Vxb4@NJ zI|889T_u-i+psP0oPIV+=Q?>wd6?M^a=nvYqI)e^d~AQNLE{X8o#^jcVe|B02rzkgD&y9u16 z24=F!b-35d5RXY*b_>{_34reI!ttm^>a{PBPPIfAhf|5~^)x6|0!`>idrDUxNS*Sq zbE?mdS&c|>ihte(2mIP;c0G*pkpiZFSJtgQ$)wORW#YR&IFK*;T^j{q>fGM&cX3^r zpcO~5!G*|mdy^hahK=jcVT{10zRTD3mci%E$p)1nGb-HG8qX2taXzPM8nqT%=Ejm& zdo;V~A5MwTtW|NAkj^KAeu7Rdpi@~#ewYGBVOc1jIiYVH=zFa~Y{lL?{W#h^MWQ&( zI+keWkEX6Jcz;rfOW(AtSrH&(H+yQF$*)~Zg0MohBpc%7i;3xoVq%h|N6{OW#+HoC zW^ezQg&i>3{9b_Bw)8%xo2v4}aKekyq=9`ah5XWAw+&Ugc!=~;DTTW*;&Lz zE;Vd5JkgU0uidNGP-?zVD(sBe9n#s-l8ss9sXV>`z$L|93~K^{#0gp;uOtV3 z&|`+HZ#jZR@qNfjPP9q~uIuV<@p0SELH~?v(=Pqmr~o0a4MPDz&$VEp>*1@N>n|3} zIS)3*(cIgPlFj_?A9|`KO_uDHtOvDsfl~68Xl!6IChyvMZtC3?H0Yv-IiM_a3I50D zzw81O(eLxCrxr%yaOfKC}~k4eH+2$r^|f|_*K>h`DVd35NU4jyqzDR7yRVr|eKVXA1f(!hoWhJexP z_xyir76hMW*K)o*vsd!o8L(*WJ-;J?yG55DjQzOSq=o={2tPnrriAg?0IJ|O>qAY= z2CICj>`-f5L`jc`b8~Of1<0m??B~DX+h>0-oLM;n-VKB|qjz`^P$x5}_Y-!@VYAKC zs?Va{oNSD54fmVAlwQK~h<`bFM$%I~HZ36D?lu)@(lyL&-0>mUKxa;j=7AE?5)}2L z5rf7$9s|v%0PB#7g6s0$%Zpj}EzH1-wbVaL2zQ)eGbQjt?&8JKJYtnf;#U$zArG(> znGdHP+Yi5TgW)Nn>SfCKe781~oY|o)guVKjAOu-n|-ArR{(vnatjE;Nfc` zai`|Y@|~!94j>7|GXs63^xhz+AASF~qG!dJA5(9=yvX9BRo86VO_mP8TlqLw5LD7@ zapi#Q@>sP!Er8@AD!BS!02e=1OeeA1@<{Yg51JMycRccOY^sepVx8B}4=Pal{8JwE0H)lU0W~s*6p z%H`MZIUk68x{OQh|J^!zZ)N>6%NMhOGXZopRTre9Qqy~sjL%QU%-(P?gU7_CKrIbe z$Y(6ILzDb#SiEx&+s$XIvl)ltLcIdA9?;`P)b#m0JAJ13M2k(je{Yw5WBe3tyHA9m z@O%oB@XJ78IG2BRH}4KfeI~~Y4cn~Ue}kq%u)_&LvC%Os`X2ywK#ITjtdxKV^=&pO zI`@apR=SQtk)*uVfE|P=A&Xr1o%83;5Cov%Pf7FeLK4+a``tYP;y9dy)J|(}QsS6+ z91d)Blczw|A(ZvS0QfwevML_F*H90A2cRpF)+F^HJQHDLJ|z-_SF{>GW{gU+^8_HC zw201R>LZM??*E%$VUouy`Em6{GXS->J{lplnm_Cv1vDfkiyJ_=hY_H*OPw23)^h@K zdYfP)5mxRw{zl?upP8>JRDb1$LHRv$mOEx{m3pAYHA+%g7kIw<#q>V{>1j3AJ5LyUG zuhT|N163HoX6+WKEfo?G--)guFAfh?68bAp7Fw%8EPO9m2~=cHrb?zQ2G$j-0&@E= zt@$Z~q1i6djGqfY36Qn3SpWe5NEsMOZVw*k69I5=$}RNIUwWm>QhTf>cYaG6f6JfhBC3 ztq_+g02lxUfMFu@w7FdyX8bVSN=XWJH%d%ozw&30-E3vUxP~Q(+!}pW6JPYeIdCVH z?{VOnaj;erU5xRyK= zwGduwbw*JIlGyY{98q|Wk}fh~G^j8y&)*Y3Asvz&C=4s#?wp`tUI7?xCdZryIETl_Q)C)Kn(v|S zA;7d*9#5|Vhkl(rF{8N=JEe|H$jHW|34~d7l#P%(10V|X#vl3ABZ<*62po1l=#tGs zC){>`J^@J(Pw>Vxqj0FX2FhlhqHFnNP#WVsa0XZ_4M9yB07{ue3q%p&%}m}(7ad}j zT;GfGbTAKn!~s78@lghKZrFh_IBmuNxh`AR;CU393`OLzK(cNa0K)r`^0HgB7Ebcq zDFIU@01tsPLJdET0pRds0EvS5UF+}*B-Cv$*xqWlRE@|AS+8`m4aG%GDa9hhpXKAO685Vk1yBXnjH6hJQVL!IP_aS3cvsy75Rm^@E8DJ+ob`S#7ZxKdL$vu{RB4Dq&M0(3LJmGmv0VM>&HzX?Mml$4 zjyMNEEIZ4?;Uc(3B8E}8mu=c0PwxR5UB@3k=Q>m5(rGRds5V}no(-Jsu;5K0#MnJ3 z^tMstx-TM^>9ld{TGwiDC!{LadPD`82rhA-QTqEJ_&{$SJ#2(UEfZCu~N6d8UPF*J^P<~ z@^gx=4kv|G{r5ZXt=tbmU~{d+8W1XPc(PilhBh44 z0&;vJ4~SFz9;w1>2aXx4PrBeW4^jYD9U2;}hRB=8Xa$Yg+D}5$EIt zLvtUB!`#=Kl(%?a598~;UXCY3D0HPBIsnU1Q8d|jSYZCnX4@wMh~v-HYy?>IL*l~uvE*9kh8XDA`ZRi0SMRsZEk|@b(q#JS3?d4?>Uiu#*7@D zn54AA4^2t0%M(oj-13=zjYt`AKs2b$m_EzqF95n?fFkpKqLYU9zmxa>AvKVd>@0@9 zp4FoLo~WWf4h6TWvFopFewr4NFp&07rr=PrdPSfMsyBq73pFSMo&3T?0cNqybDk5j zj`ko2j)MkjKU7HXFrnr79+EikHv^y$moj0v<(U)*-2;SDA^Z>}a2?FWBPU0np3f&N z=h__hFxU<_rNH!Y>xAX2H*T{-S_lIWb#ELJu7m3V1O*!bxC3Z&BCxK0pVer?Sx_p2 z&<5l!o;8{XG~swm10KOi{XgI&hcnkYV<3puFq8ncDdpBsNfFUmNMoMqM|$>(j67>b zWn`<7d+L*eLDTO;#GdaeWfb+f^FJ5upggD_ER=dMjU(D1|9iNp1uuw_&(amEEbnB4 z@h3G`HbH-}03!k^^y9(OR!bO5{)ZqbWE&HsQ1}?7^_FYn#rZj#j7?51i!!n|0vr@j zcG8Zq)_L|+@;XchFsMm`kNE2&6=9>#6+U4NR66u*Qo7oXi%5m8T`>)SzYhMSyvTJ= z96R0)&pL@_LS^Q80%~S9+>+QJR-5==@ z&nBGi!MlLf33nme^TCsos*MoHx=NoxI+C7d5ltM_^~{#|>~lKsU^%wVTGMf=JRl0f zp$eBccuM9e0p6!^ZNQUaY3x|#==Nasy4vvr1Fw21%T`{PHfBMdL~*jo_VNa4|qgti!2r()Etvnf@Yrth(0rEonvEcv#NnfZwN@RccJ$E2xEsyXf)- z0SU1&B(!~+$JYTPrzU^Ks}|z`dug%_`0uj!ep(mx(Lo&@hRLul~W5u+?b zj9atMb&&h|b9m`^GrGtC@3=;=4Ga|#%4*S7AsumG$V2f+R{NK?#4wsFkbpC&(ubs( ze}Im;0C3~qk+&K>eAqoV0F*p!QjQK7VSPGK$u*z-e7&VG=t98%r}~0X^nD;Em8P;M zgeDGuCLs`;lc4XRWXCAAaOiF+pbj>b1tLG9BMv`8pnNX|l_~ zuDwZ0FZasfC4aY0J*2>N;GJ|-&oIy=3ouBBXzdMSBQOeSm?4TF!nxN`0K5qZT{KAf zvYvmg9JoDdih@;%=coQpq@b?3K%+rpz-0WW(2x#gqW^N30U>FXrU5Kv-*EVq3ScN_ zN+g!=p}b6rLc}mn+ zzK0)g0(i(F3WH7LkmSUakSOuoYXjh`0QC1$pH3(5aNr4h!33-YR^Hw;|H36T7=r;i zZ3ZILFvTH*v;vaNp&2L;Fq2VadM_Rx8gEJkhpGqRzakzEBAys<6X4gciA@1gLz3tJ z(=3+$JqUw>b%2%7Zf#_pa08jv>df08Sa}trOBw<2$M=mD!E2|Oo&b)KhT^Swm7WOY;b7mQMxt9G0Y&S0VCO%AB$3t;FQW!Ol39{hC(AB29i z9rwqB_xE?%#Dv6P61`An^aON(@%+39nNP|{oKznIIX<4AE=1R%7t#_)r=*%VYPC(U zab>{X2dBUH5$E@*K7g>Z_NMk6266SwD8*u^zzIgF2?$jvfLecmAv58f!9^a=5V>LC zc&-ceIn03YrBH7~m>5mTZ-UmG>IA?a91HpmZ0fHJY^I!FYy98Er}*H$K3w<1#cS|G zYlSrDtF++xczzqB9gv9d{M7VO)un`!wCH$Ic~B;_KiE2$lGQY!+oTPY z|L|Tg2^p()TykGtA24hLU;>_yN5p#;LO(xWgGiXoWFM%^DK`82XMGpE!i*!d+y&!dc#O0ecw&%^ z7>i&3^fb(rg08p!6e;PwIu{Sc_liHgR-W(Q<c7s5+`|K+bfm)%=bTzOQ-*wx0MWo4 z9SoFZIPhVwL&#~>fT`1ML*#pS3-NwJP*7+N@EbPGr)Lu$R<65c*PaBLhI^%i3y??0 z-)1!@?UJEG*psp#a}>Ag-Zx2<0?I91c2M?ZtE5GbeqItkkq7;t$)W}h!9W{5+PSCd zK6fjnNzvZZ^h$$LklV!er@Vdw*h^uz{X6bQJ_52iS3i z9HSlQz8`tyQ;FFsvDv)GGzOelWC^-O;&F4FJYcF6~6-dVhC zg}lPJB<~zVmyr3aLOvcMp)l+?JWP1h6Ppll5IHAWYvYPa#M$g|-{T{INfRcB)yKr5 z9ubXX=`yH0J6S3BN(zt~Gco`^_3tKkE^o@(5b`ovC*6pWXA>nvmC)i|cfRj~k~>=8 zxlN44^i&Lk1}F%yNB+;0Xl5ZgmY_EP-6jeP-hrH2RQf{dus|K6yXKK#*ZtVWP9}K`!fN9fQ+7gk6CJ%n#%_s-b zUymRto)gdyugbyVFu8GNJw_pH0I0h|8=jyJy@4_SrkX2Yj%o$755m2C0P__Zo4`aG-ytarrW!v~Xs-2yJR=p1?OKCXDg`1n zPRfJl!|2gEZQx%7cY?KGk`U?AKo|hlb5P)Mkv%u&pT92s$+KLlwWp(RkZ8E*?}6js zoxR2$*9<40vFK4c25uV93+B}UeUlR7`h0+4@_d@9_-r^3g#Ics_u>b54u-(vuh+JG zwB%l#iHGVtRZ{u2s-~`#!62D(e$NAk5(^EKT#v(_sZSpRz=l9C00tec!^4&LuF&sN zZVH!&@SIc*I21$={q^ek{Jt3gNGp=y_MSVu1{f=F3Jy07Enpp>{p7Q(0l6|B6F!4g z1BCF;(4b5dguo8cjQ~6WfX{(4031xBv5hiN4s7cgw}qq|(FnDEYwA%K9;p~99g&P@ z31R?X19Esj^XcAVraUv0gW-G-;dxalA_%0?sS1!5dLhsQGLWtTsW(O3sN*;9?5eN- z`0qsR#bF7CS?BO>Xy!rH7hPq=@bh~>5)&;UKO3t1cL{I5AUVM z$=@lb5&8Ijdw0;>kP%*BAg`-B;BbVVjgFc!orF+=iyZ-g`g7=LtYIXXkGve6xy_<6 zggz+4Lh2!m$B=>5_|V)YM=RZ%qxNP}r6>cyy;IKHE*(iH(CPX=_&uBjfFI#M_sstT ztVYe2a6J{>S1TI3ULL6P@KAk^^wAy{3VoJPHg>5`4+Y?k5}4`PY2#z@*<85}A1%I1 zHBiIPXT!^bBJVzS+EIhOHws8M5gkzBk{WV+0VOMBQeqz%VB~;ShTc14I>M zzJ}<)yTOyv;M4oVLKqw#j2E7iP}+%$tV|hFfp;V1UMQ{oAwt6eAoIP}xbLS)hnyS% zS5gjAF(1W|))3W@b|saR6~@1y=Sp+~iOIJJvrp*UL=v37ji?lj^#BV3>GxqgsRk5c zkNi_2ghPQMQAX6?0M)PC6JxxX8$^LFz<{`yGXPpS1%s`%VDWQK{kJ#SjLe7Eaj< zZag7!obSW4Gt6R|2s2azdc3I)laO>Y2a2T$$n`;QMo@!$VQ^=%mLJG@!?>gCk?X)S zV*pKVToDXLI2pBI{KeZ}sOSf+hN#2OzYz&h*{~EN=>7x<^l1b823<$`4@k2jn|uOY zKpCEm61hDL zE3m;ZCh4UjzK^mKoPdE&12{BEK@i~(FaZ68BtrSIQnIBxE>quolu^I~qiaYQ?5hap z-ucjG>tRreX#nV{=Q}u*%n1mmG#GSr4W`Q*dvzkNmD1cG4M)L?_YipK+N`vSMW)^b z2wZN!ho&G=H3%fTc)n1M8M$V9i;AvzPp;|DTB|>)z4e7M`d>)PB*m0r)s0<06~(iT z%KO={cnv~Fa$m>Zdbv-`HHaUCm5v$KW$5xkiDM92JDO|{CyG( zNC?ssI0VKh*RT@90b1|;b9GsMeE#b7vLWcNAplU30_=OSx&1VJh|$IfC=NfNEID2r z>F1~o0%-)?V5jm(HY1@wU35@`QQJx3qX&KS974QU+{0Ul_hA6oth43u-LQ!+3s+YO z^d$P}ivgfYaO6UjGXR<@L_Hj(V~ks|3;-C4MOcbrk|jUmFWk0&L&txVn3_JFLGlYs z2Yx>WKMc-M!GR*}hl8fCGg!?id3Q>}en5vy_1?3J0M~-!03d`_=tqj@YBICvQ^rT@ z-+B4H8)YI;UyT5z6j3>M=CZoU2V&^3!hV4_*0H6H5@+H|t^+tkhZz77&+3UVOxs0} zBAk*qvKE^xMtH< zr$8HcA=+WHNnd69Tv7l+;Qgn9yf^T|9!xEU0brfyOI?|Roa{ivkSUVcqOodIm8(Cm z6d@daP_Cr}N(s+Kq7j1YPd)=>W5Ca-$xD#7$nRMnW(Zj6kJM4dlSxjj8K5f01vzl5 zJjKMHdahj#ss84-E`QKeZU)NN07#T#R-NdSamszX$7ZpMpaJ5`!z1i3)Fy=iMm?I1 z;Tmb$ghKDP)=+@I)N5=v@(|SmqJUfnw-7(KGN8N_2L!HzYkuhtN_NZ4W5cF%B|!B5 zgE8L0YykT=KiZq|-g=>R2=cw_;PIZ4nm&_~8kzzax2T$Wf9?kr-_=T4Y<`~?)d)N? zMx8?&ex|0tD=YvKRPs4ssO0_O{o@2M5K-5}vw;bUf{zmxadRHPJjnM6{aF`Mi`^0c z$@lQv^#=w+Lt%gA()%sz^F0F(?fYq;dQR60U!hmw1&^w%?8axNYhrZl54MLO_QOhlKJ21S9^%~gX zX~+ir$@5YTU|vCbI>)R4@^hv=hj|(F=EM8Ppk!J%FdF(h4E#$Pn+|)PFhDVwR2E1r z9M;o&QgNoCBq8?v2wrS=)T4B5J`S5q~W(^j;qLXeq!H zdQ}HmDP$w!`MTz__OnKOMk|bb-=QvE~8#>+-z-QxyiI^XH=xQ@_!5 zQ5HL-ZbndTnrS#pbU-o>0Adpe_+lAOKrW0ZR9L(zt;IX^J7?ZfH()6A<#W;8FGe>Y zCD%0yxBUcP?geAYfL9C-2j1T|hL04Ffh?5lypdw<51*?_Ojc(g(Ls~}ApeIw$UTR< zJ4xq=@*oX?9}($nQKaYF!u|fEB^;m`K0=(xz(uIH_^z85KHvO&+_UgdzOSzB?mk2m zGR;p58v%IfG`B3%sAg)tFx$w5i{WV@1yN4o5CQZ7HtmsjBn>#i1`PM7>yQ8#+LT!R zUNNpG-2jlAr>_|viUYxmo_~565CO$o@^7%~*u=c}dlGoFFxqttMtM2I6^hUfY(4gh zK+eAtX!sfK&|&#K(M!19n!f{XGL)l&a%>>_f$@N@i!sSGixEa35f8>OIV@Cr>7>S} z5k(>|R&f z()r7AKtG@3uHU-DHV3+V`H+0_J(QHu0I5KYnO)CAr(DD)Am2>sQd2(3;UQn9J`F`R z-|vh2ejfqQp=K&M5$eXCLL07@^zvMQXKAmrK^pH;+%(v>OF9%754vFT+ojY z92B0Mmi)Y!ymY^jo?!r|Hok8f0X!llAe1z@uuv3$=K@fIOHSia+ykBO`L0h#;7t+z6UAp`$5ME z?dc1kHjacA1_1Ou<@$ph9JSuznlMwSLy~@-U>a@H(#_ zJ!Qh0ZUSr&3R-pIwuP01%Z!cS55vcXrR<4NW<~>Qp}m{-lOhEsZ%*oBDnROW za4CQQD;sP9m6kuP#WhgY=^2woM=AkeIvlk0!^E`$P{Q~l z)c55(_6=e9R(b5lB=sGo_~XA1V@#A_qtAlW0k6D$|6$Yihi5>85fuWa{)Vv~uMJ4~ z(D((4zI+M>LlI%wIH>^d(dU*807gMQ{ReBB+J7_W;WzKoX;z;y6}t9lzZc5$#65JB zhCKL$Dhvk(iYg5%Z@if{sYch#CL%mXU?lE$#C;z%acbQl`RPM4F;4!#8#4}Ssy01& zFEb8M$U$2l8Z5kfhM$0C98mKVq?;{@Y7pVTfZ1UT1VuT7ev?DCVZyMr%TqH zXHm~+!>ty=i-sSaU;};lIhYt7T1yu!TxxB%95VU?s2_V0PIzPDnaEY0pkz-OEAAoB z^ggEKvf1fmqwgV=rs@DOyc|^$^5+A}Q%RdP=~@85sAixJ1V4ZZ3MDU;kMVrdr%hKY z@N~XOSOUxjM46>wa&d z^cW7>n&dPB+(%RQuZr{Xa1IBpc&G8@%Ii0O+&cVnAgDZaHXhb@-00CJ6mc&Ozu#DR z34kPY;%&&Lj1ydOyk+`C*ed0P46LxuGJ!_@J^1`SrB0e*I4H|kuXP*M1CXR1IymQ4 zs>GWEY(Zv$7W=AlXABW}FrL<40>xNQfJ*zj|2O__FZJc?UKfc31wwwR=G~r>q3*j* zW5nP>u=xuWk#T*@C?I0V6;kta1W=aCs6o0Kq?|lzjj1pI@R_b4kwpOhA%zZ}0ndQa zBBGxdRh})id!rZQu@x~Op2|>_OwrsRrH7;u7-SDHW;F!t`_`_Xt8DBX^w8k}7vFE_ zynOA}U*tOc_H)&&na9SwHb0N85C^HRpFz11EPw_fL^pg%lDTxJ1Vp7bjnJaHOl`U3 zjeY&j@b4M$rznWS@4&}E`dX8WnCr(tQ`CHD+`%)0mG~DMoV=C%HO`BcTmQR&jc6-S zmh&5%d$sb}^jU^S6ha!Eaw|s5hJOa5&N3Y&3;<35)>GXNNR<|VM6fPYcX(FjH|UZi}aSxAQGiUgQrapmSm zKlacWfXas3KbC88T<&_ya#a=;re9y%dJA#z!kZ_OPM=wi$Dv$^ zEEk5OKhXY3x7fF+Vw8OWtVkpn56o~-Jq9rRVj0Gp*z>}l0ZXC{h`y=QwB(#TQ zMg5$p<8`GH90(^ABH46(FKGhv2Z<*73kaeHgcu1VoUj6O*V=vcp)mq=ZC_X;6!hQbWc%sh_|7|OuEiwOeEH(o=0i%bF=yNYUsQ=62utP@Lao~s({s@q4D6^Zj!Rc2RqA;FD7D|?d zERkaL=#T>^KxxNM!sQy6ki!9?Lc)0MeAm;zA8`*rI7CcLrN?l9Y@XDmhZw#k!ZZlq zNwvJu<8%4{SF|QaFJDQP>M&kB6Bv|URMZ)Or_8Wht9OuA*|Qbk3o!^Im}?w7pD{_~ zG*VU@G#jBF9KI*_3_E_Wwy9&s18)S#cT_+B**Li!`585K^0R^JtjlNPGD>QZDiY-Q zgu)z%Q;Gu4ia#H|Kk`VTfOTqg8KoL?UnlE6t&IhRl}001#|{pL!eo?+2v5;2D3(|U zYXbw1dq8@d>Ibw~uEWwG89)F*It%*}@n4tbwC06LzmtuLHV_ zI1COpX%3&cTxB{8MKb)?;fBydq=C`#&)p1wA{m;!ya)}?@{B4x^Oa_>zH#=*OJaXA zorn(AcqAd=3{4&XMFgSY53~`GwA7E*G-sdRXB~bj_uv8WC_Knw5ozK)%uMeA3Wqvv%tDN2SRFaa0PuS!Wn4&cxW+j515Sj~TCz-pB{_whSQqJT zQ|I5Ff4}h;A6NsR5a&HD=AYzT3`RX`lQX3iR@M_S)okNDm_ojX2*AcrX(M^PILdy6 z!@i>}yy@^jl+~cJ=4${<^Io)PJiU=v%==>~HKF(jgF0L@R3Yy#(`WHLR0}YE2Nf#2 zvY_iF;JHy=1a*&dJwytWbm8}7?CG#Xp$B9?Xa1j-8d$@Pu7%&-uj^VU;FZb+#?i!0 zgKCqF30FEmDm7O6jbY%@8Gt!94>Bo3r_Vel?!ZiWbO6e@YYb-u$};!F{>T;eS|roZ z{(BFk0XToPX-DOaj^E7T-eV?%fy9{j=QBDF|J7zu`A> z9{zyRNxwR|8F^Gb2l8ILmr!@2>f~%*-#1Pa01((a4L~~l^NFW*c=Bmp;*bnc9=mOC z@Ew6+Ax+w$ZZw;Cqr)6GO(Hzy{eW2;phUCcU$tXjBkSb($x zb?_+Tab0-!Y|n+yd|VOUHUWsNpAGcL!3)W`k6?}JGi)|s&=MW~9S$}IfRKKoNKhsp z7nDaK^iUS0yy^)@uIWqj5L5v{DJY+P1|C9n0^pSCMscoP+=_2iwsekspdtaa`Tj<( z2kS#fkZin1oK2a}!zjjkIh>T85DE2j>j^`x=RVZYW)I#Y|Fk*dJ*^{d z)@(~n>;Q|CaH{q_O9S{>HUq%(1yr18jZ9K94r?l;BmV($$CVy?Ub*&E)PXZpUlAJV z3x=DrDbXh3J?R-VU<=s;#v$M?6%Id3GS@nVf9^RW7@GAAltF(mLR~1OD$vmWz1r5U z|NOuh0Ev9GYKZ5bWwU-f6c!!k+Q{J}bB2!jJcMGu7X}>Yyvb4%GQu1)&(pg*%)F1n zLBK$A#5i7?D1%Nl>OBE7}+!dhd)BYmC? zxFZ_l^En8I6dn`i^Lq$#0;Fx;xyN#EHa8fBr2)$6GYv}x13{A?3HQi+J{LV0l z+N>x8F%}Sc_6h_m!yhmRF+@4S`_BYVw1!kJ@b*x6p_!Af^Z&_KVVH&j7GVnx*7NGi zULp-5asZEjj@>inEHj{~ee`z{I{6_@#Cr6;HUxTb`!uNGPjel9wBL3pl$<2~IW_FQ zEcCtl9i*e-1T0ZQNwPmZL+#pW^?hJ!Ga%`?a&YqW5%Q#r!ZP6r!x`EwSLTp;aEp{< zi{A5+BBxAI02>ja4hNUkTB}?DaH*VUEw1wD=~{{qftV^pn2Zw81@%2}Sb1Kw(4ydj zf)0{wz8MN5$o0XLgwzv-1CT=Sds79HQ60%Bxvdf>vR%gn+Ht>d^cmSjPs3~ae-10g zAa1EG#nT4ek>ECXX3{gnK0Lp{8(aR3lm;2`zV0!234Z1Q>zykVU=1s7-2VHT+qa*% zuML2xj$e;MguuJa6qv?lD<#5DoCnS|+lXnEzpOzhhkiT!j004p_)Cs!I zCMU$E!T_h8T-%Uk9bzW;@N@FlOoFHogYZK9E*lWquxO~}JyF&nC&nv>?-@^R2UUna zr7+EDNDd0Yi>}+U-H`M-dUkN-tr`$WlB1SGnh})-U;s!%rYoH|^JeORm7c@l%E1RE z5aMOuTz|q4J4`e&F{l*$01iNsQNSbjtr1X2CZO0$3P&|IazG6Tm}I2AMe9q*MubdY=}pQds=I5GM{vy7o)&XBaTWf zs6IeOLIm!3=2864Q~x(+Ckqb z?L~pPJ_6wPF3>#}5&mN+Q3rwsPO9)+0G|3D25<`^6V@F<7V_PU4~wHFoy!9oplM1$ z%n8_S%~JW6ZqxS~l^-O@Ftiw9&*IE+KEC$(<}cizLZb38U#x8C{Oe3N=<2rU`CqhB z8pMfQWusyo;6i*Rn-UMf0rcaqek0h%(lE?rfYafpUE_0HlnrP22yBfx0>&x%i1RZ^rN4Y7BS)Qw(WikK=e~>Tx`HXcoDd-(z&6$F( zx*gF(NTw+=PWu7_5QPJH0|0h%9>6UP0ObE|%97faCypDJQmXT7MS4Ujmd}R=F;|8H zeFF2Y*#N~H5d!-XqewR*c+G54gY!lIGd)kP8LBq=1JK-aT_?||>PGudTxz=W;(ZeZ z?EUhWKV8?-d0hR@84o{)gN1%W;omCh>yH#$>&X%&{KPd70Bm?P5b<0O7LVuJXf@(m zUOviW6CI3DUQTpm-X8owhXU2xRXP}WPCU4&{RHYhNPH8rM;ZV{08|Yq+o7%Ci8e%F z=-T0F(+z;H(=+Mlz#A8mAwKEDvC1pv;fXA$By3cEZWstri6Q}{#b=9=M@1(+E%7M; zK;hY_6hP~PZXbpx*I-xH3ET)R0LVR*`0U=|mJoW{0g_FA8J_nR_rR6f`|w8S z1d!w9VzCjf!=<0DHd;J(R0kck>8VN+K=?5Lj&FZmi1apvyb>h2?7=hgZn5wLlrf8d zVVF?{z;Fuv430XDDntShmf)*HS>-yS!gY+mXfZMwh??Zn6S>J~Oq)7A@q}c!=)yx; z$cv+5l$h>oqr`N8(#NDFF#uifX+;uYgNb7R_*=eey{RvSx%%0jIfej3#LyE|e&QHm zABK}!5xo$Z0n%-eah@$>GDi4DE-pj9`;Y-Aa0AdLv_6s?(F)I9irGuge(6h}EqNor z;Dbw78@?9jrT}grNKlu~ml>Duq7TIT-Jr_Ri3Q3>iEOg10h<%F8Fn8v=qTWhUV|lS zy7A>d4iy`Fg(lZx7*;5ZB-%jV{(ufKYsvR#G63ZBq$y)Yj4}_z?-NN(7i*6ko8c!> z_=_0;3-g6>$ZH)D^1f4{HnQAq@aPjV9M3sQG?d$*EJs=aVn0Ej&7__1Gw=q0fhKfN zhJjOzBi}J|#%x71qhe8t{byrHk>{dZnau!@_V9d2qo^XVhKPVr4dHt+d1u*uLk0vXZj9i<>3kO z!sL#*xZil~9S4tEKYAtuKzYqXM-*1mgHKZn$T`S6Jaa@Y2vZ5)Nhb&|F+`b5fsa|< zJXqKRzt49=@Zoo|jZ;Gt05Fgghwq%FLqgt7#fJ0+FUiO-%5{Fu9;wAv_1nXsOGnT> z27pn4S6~dlAU9{-08=?2q(^ZHQ#=|lOEpHGV}U|y6YIzl-eL8r$HNIg6F(gXAOaxNr@Y3R(*F-oN0^JD zv7UcXd0$bEZ4EU#jBzI;5mx&l8*xXdvtiwEQ3i-=(5U|3cOUZo5QY4#MDCl)!dd~C zDCjWQGd%*p!%iAELD9>l1fZhrmB2X=os8FvfP7~>VgRhXsInbpOQQpaK|f19Zy8`o z*C8Mz{0BcU)z-uWL<*yh8-V9-PY zuv7>MsX`y({(K(B3~x6?n+onX{q7w2iv=OESU z@gTk&7MA$p?}d2r*&J@P3*x*O&Vo0G>EM2R##kG2TF8vucY-T)AqpA2vO&2@H+tI&F9M}7Ur zkC&tozyRd({^WWn)WRS4I&A$paHaOUgx(zF@lvQI#mT8@r}co2OKUB1QsMid&W!}R z8-USesQY{kpOL>V(0~9!ZgQD5rn( z))#vjVAhh*-?dQp?K=v!?=U{#FK|6j9nR%26w!RW=JppBm7D>1v-Qrv`_WHu|t zrT`cMEoSliA{tSsg)ipkVAaVZ5zIh>+V`m=;*s7TKxq%EDd8xs#bF)IwE5uRle04Bn@E8%;EUDRLjKEZsY-$?*KD*LH~G?J9oC=Fe4S--xyV7rvb@&zGncP6&ny`u0PrVZ<(*vC z3vg(^L^RRHg8-9ncvtL)QK-)+3toalsoh@lvWd_UXXBGqEB3P#(MkaLs;t;_UU+t!jX0D9>2qB`GF8!zzwZq_>> z*@Fc9MLk@+*94^jbT`7DBNd?BgBNF3K-dW2kvIfw$gs9Po`Ll`7gDqFo5PLs3PyT| z&~wWZ{ma;XcMJ$iebEDu{ly{SccOp4=kvm&#!_qfN?BxVs0>gdOkX3P0?-U}RDdwo z?AU+xYB!!?d3;|Z080UMuyuur}N)X%wZ%T%C>JB*IKi0=k!k z5vXpxGcQ*I4ABAnXVBR~4wEdD*Dmzu@IcvIApB?E{=g2C4VTcy10)L@Odj}ob=gt! z!*ls4V36{6c<8<4#Vm4QLXI|q9n@T}z8iqv#v}E!!UiDRM1v>asb(PR{Mnmd`sUX5&6n!{MyzggGN ze($4zs@9H4)y?hyEL+&Z&j=@J4<&bHs!gE}T&aB?pciF4YVCyPUS8^C^;?$nr&k83 zO#@6J(BaE+g9PNk*h`770-m}fuv|CbXh2@-10Zc+_5ln((g+UGVWl|xPoKB{56grT z{zIzC)(&hLOzI5)a|wqImS}2Bv6S@Z?s)+4BB1l8PxocrF`9JvAw$MBltKjH z_Y0T~I8UxLz<%D+weOxs05y$WE8WHRCR~Jx9s6XB;f<3UKl<56A9w@c0iMAx4>C%t zZ<0ByXaK>F)S@W&{u`P{YsuC@Y&h{DF7`C^Wf$U-Pe%=20p=^1bl;k(;P(#fj8T@W0x5R>rWRdzg?e2sK~V2@yZ(sW8=>IgOd+8A9^l%GIf4D zA@t=~FOgOjEnRMdHdd;nxK7MO%96{(0XQyJqisxGCyGF{M!z5`Z>DGSwC>M14gr>d zlsA=-zEp?!9R`3fKay_1Ox_c`glWl?O-Z#-JSwHVVu&9dj5EL_tq07Y7?ys_+>`CEjel%5Bh(v%PrFN`>y51uXLYcwg%LdzDTcI8zbt zMQKsFKlgA#dH-n%fKpPUv(YO98|I_3AgKnewCQ{gLfw~jUo)fuK}5v+F>W;QV9@Y_ z`K~h^i5ObSqpWL`0l@fDWpEk;;ragw{^LYY!qP43#&-E;BJ<49-qdQYJB;3dJrIDjvYBHV%T;(ED`bMJg;Ey^_JwN0f6F48HNYVjk%$c!xOK{6VBDYA=*G&DKC(3y0W0p z!eP&rHx~NA48-U0;4uJ{yeNlqSP7%y&Y!M(Hx&#F@@M7@uwDRcbG25?1H^Fj=|J|9 zz{*^)@k&ibMv1Ga6EOjaO}kIcI5fJX8vrD};5YbI7$i{ta*rFo>Qru+ZAM0d~P=0Bkuk%w1T!(Mi8$b+oSc zV&DuwZOh$d44wBs)DIlTKj*kJ?~HKA;p~w(`|Ptv$V!y#8M5ol&fZ%QGO{b9&=(nJ zWM+$!WR;!0M_>QJ=kxjH^M1VFuh;V_chR2uc7+3%z^bZ8vQ~cWeEp6d0>6IK$$Bg* z@Kz5zQ{n=e3`%FeQHqg8Q`v|vc7i;j>3q+zNcGl?Yq_xC;d zTuJYtvHOA1W$EwQNMX)xhtCL(-SVUR$M|q4SJM;fLGkBIIvR+t8YhaWbY=dkk2n~< zV~AuT)Dq|}W%<=!83 z6_vAFHP?K;yS@Q0oz_0l7G5}XNfrx{fA`{>drQUi-p;(rK5+-;LPk4PWd9F68f~P| zX;MX}{d>8UZ8hqhbiCx+t+$2|yN}#S&Ne|Cs1c>FK^blt(_NfsUG!^g$Ztie8cq~l z6eqXl)nE}s9w35cw8z?~7i!c6)czUR!_nMBf?w)?h!&IeIe!aN0!KX8IYoqaiRlzC zc{e@o^yta42XO0R;p$4j>l|j==#-ZMcs1*xShv&;O0OI0sU_MAiUCF$(O5(6bbUi> zkQ^jrO*k>=meF=`H#uFr5Y=?Yvcpu`ifwqcVRwWC;cvk`{%|!F1_UG8IE?Ka=9of4 z0@L_?m^&T+7#MD!#tYsHAlXTwsQD6{iw$iF2${54f7~4Wb%2@4YW;Ho0vw=W&DVt( z{X%j^bN{x4&NJSZ=lf`?-B0dqbj@%g4n{whr$4xSf4Rmu`re~UOf&&!!{c{JcPo3& zYK9aQsUkBFB<_ze9txz{{#Iy-@0wzZOCn)VIe*!rhV;ogV74|fg;2H)$I2__N3C>p z%v~3Fz9nRA7IIA_^LJ8>RX6K=SU_+k(zpc5y^M3~ny3B9rLQTcrN*$avT?9HU$Y^f zij_Iycr74q8SJcNKXIynGv=b!d<=Sb*3coK3f43sJaIW1!Lf%P3H?@JnIlTMta4>R z3u+bF=h+osJxeB!0!dKwSC|<-VyhbeqkzQXez+SEj6USbe=?Y!ZZ|aLMt^>B+nZ1< zHACtSKx_z-zTYl)$TAIorIy<+)nPuqyjVowemku$BnkK${n*+tFH=R$sfI*Pcc@8r zIg~rDV(Wi6E+Bmw4Z!X@<<$H|8v+zQ;T-1EmiNmMZdzS5r(7Yw5edt;Wg8l3prYh_ z7q1LiYa+{^=J$CJ2YY@gKi=l_SPD5Bw}lj_ED>x`lDFQ=j)~!BZncP=%BVi{%EJ`i z?oT2o|FYuu>VO_hR>-nNrD}((4JODM3%#a_l!sea=q5AO>9pwzrim<_D=5D<9Kj5) z7#nX@b-odVFC#%7V>Efp?kinuC>n|JBy(Q{jyi@#gC#O%m>?iq_ zrQ4HRwiEpGoLpP8RbU)F0fG#k^^9FT8iSZ}EmqO@Q-X?<4u> zJf_>x#7A@YBe%}stlHX$doEE^Sa^NvHfISxDWAq7yG+7xLV3&_YiJ`%TQoNsglo*O z2wl5|qFYDXQD?m`?asO4(lQX0X?$}4k$tOA$<4n`$^Wo1!6aDZ{9ms6%KT8f>z0%(rC5%Z0#`44xAqF<@ zdTP~Lj})%0iom{r=WO#`NwDGcQIspm<4_)Z(!#tRnTA?dWQ8`iXQ+0;HQv^iJYv__ zT=%SS7aOVTPD-pP&U!QpdjHYvd2D^`gQwg79ou}RIwgvSFtN^ggnC@eKfih!nx8Vg z_^IUtj7H7@o*Ga@&qxaMF(f1P*;d&WlL0qrJPh{@NL8bM=uNwe^`0i%-aOemM|r(q z0?`T*%$?5^{@ONnKA;W#1D=sY6P1zfEwVI*3$9)2N|S5e2yawp3rhp}-*An;`Z6Kkfh0dkk@wvkhw_=a~AG)i9iVs*`>L4=r z{$L%Xq6sc)i%iaJNX=#8ylTp7ShRf~2GS#cilG-Slwl9`V+_weCD8~8D2z-h_PdO1 z_ZsYv2{GULXV5q_5`bS0I>n3reKm_pq4>=F0&U;)jkvHHUtllkTB-3&c^v37RBhVI z1%2~;g+IOCDcm^ZBE8cBswKzeC)AUuu_Xi8*mta7G+LxO3pClsFSiW4aiXe9BmFB^ z7@Ai*LSu^_;Fmhjzj0p$*eb9!t=0upQmyzZwqz-Gg=$v6T8R`p5VqKR>V>Et>S=WQ zcYYd;0IUc<^T5?1FZ21ax%@f{mo(IqGi9cUzuEU*2I#<3nijC(-(_GG#k-rNRh_#s2s7U@`@F4#U5PB$N)q zf3eZ&Sh12~cliqutgoOw3xirSdC=rE(lq|f@<@$)KjUl~of)hTG5XtirVY2#@)|1ZSRgdvMHK1Zs{feF@SY z8?@B|2NU&32u^Q#RzFeHycBQYJjk1JpWR%Za0te0qDF&xdiI<6mYM`wC4}}q(L8xL zk0LZF{BqTeYwhZr{7C-qsvy#14ucXGNnH4{bikdW3LWNN!M zyq5xs*HC`;5Nn9NyZIHZ-u-j@@N+mT5LL$E^jyf89dBmhR?$CxpOP|2r@>0~erMY> z=`zTV7(T$;Ma}wUD3G-T`ro%kQ2uO~#^qSt zsZCQa_rQvXw7+56UKx1>UDbJFWW?O+S;ge5(sFHk;aIz)T)oEPAP$9lj$;yRuir8z z`6$2i!X`B4etKp_SltUpf_g&YPN!eeT&^r+?E4lKGg8_Dc`JVnEb%Lvi>WPayswct zQN4ds?Bn8Y^nK2%w)C)NEcm?WLyIfwrG9$hYQ@KS3!d-B?RX{&Cycz5e-_61W76(a zgeg-^({D*#Q6pR>b4(ir`!&CfXN6&YOTn~6BGmh^T8y-&PfirLC~67C9oG%*2wJNo zrEqshVLKg8jGDj^rttDcYUeWI$gOt2(vTu~b2!e1jMd8Sm&8IBysduN_2*0)B(p^M_4|2T!RnjG&KX{is z#6V&OCyOx8fZ&oTdUbg|hxQGVf1Pt*JxL2k0-(FwR&Cz% z)0WdTqmNJ|8lmqpKv`jb30u&rlu`$hUucD`%$48UB`5@`R=PLckNW}ld^X$uGJ-E0 zQZe)D3DQFP(;CgIDsD&R{lC^$b{H4sz>WY>4Ktc*8#oiCfu;Y}#{$avokRVZCEa@Iv@+KGgjL-MB{{B^ z2Lf9-kL24|tsEsrHiGjztN8W1Y*J0s6zr2p>i(UL!!{j1odgrMzyl+3Gt{Fr>zA>u zHV7{gZ=9CEP(8nIXfkCTL3X33L-y`^KA~op^tk1oJJ0Kbity)kL(U-CtHtg@DlNIZq~9M%EUg zgssm~A=NQaP{Eb?9d>D%M%?TR88*Iez_gROR>81l(_y5C;=JF^LLCl$7j zyo@vJba`1C_oRWyHpnfdcB&?*SfV=~TGgicf_`x@#0&1SSf?|QX0_+s-fx^ppuWD4 z9;;9?^!}iZ1Qi;LBw#q`#@KgiepZaGl80wqUo{BM2ir@?g@|uTlZp{!Djrrs3Is}U z&w+;G`HpX(g?W!3679#xIfg)2`9qdK?g>kTi^H^N!ac*eZe;BrXG!I-gQ5Q<_bmnf zrBROe(wE1OMRWp_l{wU8$iJC>j0;y8duLKzIvD=6I&t-As=OgAsI^&v)1fKr_5;r= zzjhje{<+8BvzV8HvB`-a49w#8kW|skoz0%6CMoZ83I!=qppF$UoGWh@=ZdY0#B;LC z_WeS#|-2lbF;~O1S2-^R#8mxM!Bn zH#b?Iz|dbJ9ohFQ#{C>7eZ*+p=iPJj9`zcyc62e6e}R^B7>-4%id&rQMDzly$G5L< zkdV#^=lQs$HF?jdI?Ow5ZKbba?rvR0VBCW?r&mc2j&E4>i9JxK&gCN}hG=4wCv^S^ zCoUMWW%rYCR-GGOtJ`23QWnvQ*UU7DZ(3N!BgP0l?fqB*@{um9>3jh#J?m#(l@tOL#OKLnI}*oXlC-@i-Si! z2t=%npL?AP8to~ABuwwgO655Zur5a+KufiQx8>|;BV%n9Yiy3#{=oub6$((_Ww>ku zu2u7;$iUsxw_n5M)aotHEpxRqT7`QT{&a{~HcA$*%+cNX^t~DI%McJQ)>}9IXJ?T7$y30P+}I1cy2$ee)U|_;3&}S| z)zZW7`xL0%-R)RtPV*kiK}~txqXmynUPigk7Zg~)zcKu=%2+bK zJ1(%rgr|Ky6#VZN3nffOX8aDnuap|7!FttKW?{~M)(?3*bs z-nz%Zx+{vh8kD7>l@((sn{`8++p8PgQft101WE>18>X6Qt zeEmvATz2`XJS^%i959u9kF#M_FZrcFQ{|G|%!Gf40a)GE(#pShX+^?Q-NKJHz~er- z(pqlb!-5crd;PAt5rbvO<}<@T&_# zxcaMSHMst>S+i{-h+JCuIbF(abtK4*-3S?n%Ib@d1YQ(zUU9x^)r02@shT=!?y=hg zcvn8II+zLBz+c*kTRQj0>i8MI`LC9&&e?yxnfhJegTW^M8*%l!Q||?W$zBMmnHD8# zA^l&A=ldd_zOPo%03P@gLT-em4Lbp}A{}81kzNL?)~3mk1?o=qLLdVe_s=%8)+hgN;opTF+7&% zBA|pj+RU5}7$(pj^%`${Z2EQ}2tb1TjkW`8<6@%fr?{ka&tE2BA}DL&p`bDS8Z(43 zjNY1!^Pf`rEE|CLf>~Z4IiB> zDIXPo8=lEaw-Z(|ih(xPJ3*r4eSC}E3-7K)D1d09f~Zwj4(rC<*~B8zb_W7q5Mys7 z^Ge;qw%U4U?9xv$tNMdIUpWVFaVyfuf4_V;>+gQNNHsP7>DWm|%pRBJ-L$8k^r`ay zXiC>rxbgQBsG@D`s_SK%X0I`K7XNa>V)8kJLK^HSEK1tBSY#KmA}4YuL?@ug`RsI9 z#9GM#Z1K?l@V;8VzNtw}ZgSrI@dlAmi++PG>A<>gFM(~ysJj7-}dwT zVuQDy@5<1BlOz8yJx*nos;P*qku_cUH>I4jCHOw5AyyMO0 zljzzE0-ykgid>>^CQ?|sirB^qfcTX2T)}bD;a2M(iIOoHO?7q@_QbsDp+Wc9+k=2Gld|2LPV4*D zmtVl#64wmxWP7%ygEa=Dv%Obw(F0?Eq{&Q|OP!O8n&DA#fO~wRa4-!_#+7*@{o7Nj z1J9V@y9Yb_4W2#yb#=~NzMx=IsFzM#iiC}Fpk~qTS(L24>AmZ2hG`>iEA7dD!*?}{ zp+=*_5iDOt+zBDQN?hU}6swNs-@n`-wkf~c2>+oHi6h+r6cz7Wekl{$xEgmBItihI z0lnc$VYNA?XG)dsn-})7ub=K4fJIs+8t-$Ch&oFE&fS+Wv}y+FReAd@I1H)kDujDw zcU=Ilb5&poJ-9(a)&r!{dWNdH61{Ih1TbUa%9D?ac&#cil;}vWSHWXvla9L!@e=i& z6F7ZKbvU7(r1Z7eKtaV?bMP)jUF|%n!UY4%+}g90IYrZ17*FH(4($)!{pV|6omzqTTC|=Z+yPzrpPE=`1!sFxEoybS14qq9qlX=G;A4lJm>-U@zUYHW7aAN zzwZ`(Rw4v53oqj{m=q|Md^Tp+Wgm;~JC3`+x)VNQDCz!sg`7N2d4H!83nEQscrow9 z#r0iLuW=CnR^2F>iWQiqF!wY_D$9R(KV@rXL>`W!E4?T|0@TpPSZApZ_XNvpezpt& zKe4X#0|r2%`ZzK!a2}}odCCe%J-#q4OX_X^aq+Y$b=jin(NCSLdKl|jD0$F4or1tp z5_JNuf*h?Kd#5WFWJ?GF71MG-nLKM^Wg@2l>&WSPbe&gE`LxrLErb5%1bBX4E)3EO zNAa@k*xaafsELaX!;ZilFuyjcs;vo#Q3I@L zK^C|C5O7j1YVQFdO5~%~Way}ErrQBC7YTLu zP~;~cxT?C6bE+;sKFELNQz-+O@tI)_BsF=-4_cdzW@(YsSxWTjp9V}`5oMpzsC%G7 zsYQAU3^Yhx(9riQ!TmXknm3xQOHiHu#`-vIV{LUemoK)zKp3uFO`d@{@u7BH<8wtV zKb%kpCoh?_&5u0eI}*t01bU1)Nul(bjz}`88|lUqm`QPFv_p6N*&{&Gkn=65&{AcX zMW$payuS&9C@c}4VfQ8#W+BH;vWq!|nJcWcvUznD1oO+nEnQkfBX|Ikg}8m%veV)#rzs?)pQb zj&cFp{7e)#vwgwQGpK8!GHI8j9P1Ze8d;n5PO#WmR$FP6<3x#yOHQfl+7d+sJ|F;s zq!$&ccBmsBwBqOiy8n(RUOVnQUgXe%~HHlZh zLNbkAo&LDowO=V%Updu@W&k;upcPAtQg7Ff`5HZ(;E;sFJY_YZQR@H-kZ$>H3;~RX zss4O9)i0sVH_TB>dY)Gajt9*bimj%@k!pF$YrO6>^a}96~x2P0IeFPh0Hwn{bh(qIeC5 zwlN(2{`Sj^Qai2c-s;b5Pl?FB!8o3UM>d8S?MB>7?DGy24GbB2IhV&njzX+wD zXEw23mLF_Q^ni&hkn8%6nrMKio_42t-%al+3e%vb9kP3jl_QnVJCvi!;Ca=};6ngg z5_$OIpA%8w#PVL-1G)!8FGsURoCuU@k-2PWeTqxAJ!-)mXEPrc1+PaY87_phUD>F; zYA&o3H-RBrGYY0G$YcN_W(&~AEJ$*oHipNcrFa{oWQz5@kgINa@Z-)~oLmuyT5JUo zP^RcQGzyA}?5C*uQNWSN5S=c$Ser;CCcV=8daU9{<%98YU1k87K|*Dm{E0 z3^x4gweieY>F|{{7q zR{3SMJrKYAQ~}3ivp*d2f`5-#@oE42g);k9Eb)_x+$!Kk?sLEQVQS2RW8Z>+{E&5{ z!0u{sL4(Eqxb^8MH~ev4 z-f)zE#mcbcB+~wQRrit@K?w;UWeDQ%sl(3z=ImxJXde0gdr}fo?J(xtS^0epkzROF zd}*;vYwR-S9qM7`9N4bJmV>1NHMuUM{j%3(IZS0m)($8e2(Ynqz4PRY62CGW?)a}V zq0<*;-h_av`!WZn1}mij=V2kb&!`}s84>tl1!#d8$puI=x?ChJbg#7p(^VQJhS=n6 zltxu-IG*?w4AVgfH!@r#Svd-u4-Kxr=a1Q42_y)2OZ=4H=j(EV_kDH=BzcxhO#LP! ziG&P$g1#DAk=I`8BZ-~Di%u4}N6IELOj-tY}khx`0Z@4XmdcAu34q9;v||ka<4ZVBbyD&~sBZ z=NE!`(>`q1^rDJY*W*QeG@qg*aA(!Nj8ni>*xv)iy93wV^FWeE^q1WWo98|I-xsFgfbj2pE5OttHU_v#ZYdKtYyTo2@e$X=M)(yZ2bS5WNAI=DG>2WxQ_ zz^O(L_uK6=?_z&0C&oI6zooGvL={i{tDW#Mq%O=gIu8F$&;-M>tzsN8nrjRAMD(y6 zPIr+=@E_fOCG`)^q7oY$Yq%#4h-dydLTP_oXObrIDz$$!hkD_DxVe+#RbiB1XKZ{n ztBUYJTri3Y5UOow$s!D1jKhABkV6?V`)2wL7`l?-Ka z)r?UI^lQCr|04-7Z+OD0-P-n_Ii91V#eh!6F5rYU)rfZZ7#(Q7vfT50|xw)!t1za$*-;8#+7hfT^(FvVd&a$62g zm!yIM5i5qaBd(tJjRslfBV*`xSzj{{9vXLJ-A1#H5s!IdqS_p!*YOYC?ooqxRF<-C zRzJP)pDepQ^^cK@?oscpjf3B1E`M#t@C1QH)e#5#lbDW(7Qcpm-8j6vCpvMb3&DpZ zG2ux63~_Og*dbBx^kLwoZF}`5wD*i+elCL#|GDUq7f7H_oIO>M-1*f)lgFx9IK2)S zU6a&n+lAPT)ID3Kt< zf^H1yrB=%`kucMC5gXo;7hi_+f60g=BZo_bC6`#QcXUbg zD2NckS*t&_as)`lLb_cSOPsuqwa(6Mh~wZe?=NQJ$&P?&-L+bgy_e@juxhOITNjpCoHY$l)s)|1h5@6&+K15!IrXI5nH#eEzH`04d{KLjHV-_J zA?q6`7kI4CDmv^vROe-(uNoEPnfLE|LDcpvodMijux*e$Gps$6vbx%CD1COam-gIusf zB`Q_bQ>I90nsn#daW9w_lQD96c1%B$JaNcSnN8x(gsC05zMiF>3p zNU2RjZ!KqVIHpt75;Eda&S7V&S1;Q?+px5)NU-#9uP z9*rxGp5z;Edx3LXy#$OPFjzD8E5PzoKvwOK@1uI(FQqIix^qa25_afsRCI5cf7$KC_NE0_q7# zNuZM(xSn^TbimdO-rM|%x9>9rp5>dxHc%eSYXzSGuA4Ze#70jDH|iKDW*)?=&WpKL zt{qyiFuBkQ2}PE$Q4Yo=k0!3oT_Va(NG>UCy&){>+^`G0eg>;Ks^f zO!hSYbwEgtPuJyZk~B9%k<(zwk3l^d$}`$)j;>NOxxljDWO2FBm!APArUa5t`Y}eY zOBs~Z+VuK&ns;pIRKI(2cVE{+Pm~BkiTB*W^D4OC#HeKu;zUa=HP%FO0CzNSm}jAt zQ>(q(S*mRRufK08WG(T4Es)(6y0bJo)1s&mJNkt#HY}ziXh_0@>#lkjv$cpf&4wsl zKF%6M6uyBt7L#E3n7Ug60buBsLh5ZmL^z3O)roiFr*{(L~{}3z9 z$Eug8#Ha=cb-Bv0_0t;PYgN)q8iLOpoY((g$OSxqFuPy{c0VASUEii*#Z;uySJ(S{ zQN(h)DJxg^7Dg#O?#cn=kl?I{0`cc3l3F65e^PJ0KI(d7*3mNOB?~JrQ9=ZaY5Az3Q|?W zq?UvmlWfVK&W_p4-jkz?9qHIH(k#~E8BT;$X9-ZFrzXlTuec?9F{7&tW=zuCBF?0z zWGo_SoMY*CWio#-km0Y$xk?Os1lNoYIW>s(zOPDr2M;g)^t&`R!RwNi;4griUrV{G z>tl?1$IShT8ti_?QUe^{Z*FS2{5{o+`@0>W?ag%dm@75H`DWb{h?VQwupLnS>+CR5 z&hKNTCyyCfH;fz+)e;u0O!XG-)%|Co&`3hY5^WkIRU>)_6p^TpasI0iaP+&ZQEk{j zh^Th-(>|sikB8hr73p+8<=VTV+runB8Ckda(4lg5ow}j%&Q*`rVvXGPhoG;%v>iy{ zu;37|6WM&2_+2orXf1Z|2Vg$D+7rRt34C+Mu}$sDxqB-V74&Lru`{yrH!=Fr#`}hG zE;yr1bDP0LL@l>R6609M+%iBikgkg!)_vaF?>2^-d~A@g3KY^_K@J=?HZ!3sA=jbk zzjxzFC=QMOJuIC}koG!u|5@~uk&Brw^$$RAr}sT3vwO)*e(&do_gqRHkjurj>-sR0 zyM5e;zYa7?@-MJ#=a>J-)`DzqH;TOh!XTE}Z1Wf+5O(ou7B-$Lb;Ck;UYh>Ha%9P} zC*HVIxBMo)S8{e1tp&mg@xL~^oy$*3KQ{>64tw3xSInK5mzJbI=lbTqc!A-TEuUv@ z3`~!S&hl4b2%GyiXYQZZL1@#yxs+JF^dh8V0QCnXV`e(PUw*ik7X;zxAcz{Kw9)(} z=R#4lb+a2w5KML76aE8=lJmHQ@Lre{%9s3ay3qRp>TIL#uG>;+=89AbNd2=X&wj9UiFmRDJu=CJIpv*;^aRB!A#U}w(P-Un zogh?unoj+fnAiI}5VN-;kYA(Vn(D50n~Ry&@Q6#8nkAoV#V`2rUs6n?)cn%0}j zRJ^;<2C&JdN$w9DsTbVrU~w}l;f=1+B!rbZ08XwbX3|&K+&pkXI6bjS`J!hfX19E` zpQ@GcSWS3wZjDUkG1bVBoIUoV(DM#-#)~r}ACw^!kYKL;aRQ|F%pd;1Fe6D5NzM&c)UL|AQ#(o{A2Bt#N(w#P_P5pLS2k+%R zlNbk9Q~w2iq`(o3CN-=#?Oort%e-7Wt_1sHi~ewZBfJseEG?&H#W+6gA+S=?@Hktlln?Zl^02Yh15MVo_<<)Z#F(NXqBEh+}A`idP4+l3Nn!4dfcj=yWi z3ES%3-aDTN&8D=mq-mLh{wd%~-)lOvLo@0@jX>eTRDm-Fcv?&Yd}DwR03q-&vIY&^B)ahsv)0xI>_SQs*DY{%W~mm4)&8?;)37lEAp zdwJ*CHF0aC!<#P9X{O_hXDiH;L}Y2>AA3nR=AC)nm>&yak zs`(Iv5&p^sieZ$UM8KQXMdK}4@(0|ng;$6Y>zaX$9~UYb&rT0E;mb%OFh5%11;!;of! z8{=d+OS*%C%9#IMd&jnJsK(^pJ&q3%X$aN5>n?Ot%jn(|gfy|Z>q`K8T$)e|Pt9^i z;cc6V=)F7}y-AfOpRY6MmfP2?mE?v_++RWRRT@I-5f%b43EoBJryTCt10;pWsXzA{ zyiA_#1EqHn>8fm9c`6QEaNt#_W*4j{Pv>^9^dWvKvEr+i{zYXQK7rik34H(#>hy&4 zG}PEnnwF81rtnt43p_9IA!O_O$kTsEhnEPzye2jK11sTED-A*T_dkp8lc)a~p$o(A zlW4naMS9Un#lEj$ewg@ce}UIlKHUI_%sjpz7gLZqm1O7D^`w*^&*iIHjpQYuRQP_+f$s@wXmKnz#wFqL7$ z-FZ0SzLg_U)ePiEt`lU|ivbKP7HmhC7Fs{a00-j|t}Lnv%pM)1`HUY)G?=&HcM5jz zPy7+CwPXX6XcBFE_KSBCI-F|k^k~n?x7`XT_f7$)a8~v+Db$G4fnh>D5C_JGDh)nd!;G^S{xI$h>G0xjbnTj zsO;2`l@C?lMA9!_6e|Vdo9~lMp5D3+nN%JsU?kO{skQL=81Zy{TJh&OtkSn_8e!~f zp!(lg&!@RYfzod?cRYIJKP*?YwYi=036h?Q(kOcqc>09gRZZHBnkEtqc?zna&eUH1BQ=DTh)sM>7@oI=Cd>{O#O`UOvspOi^Qe zqGp~gzgp5e=2^?fsVLJHlMjD}#x6%5_UjteLKVQY+?tX&NtGLM(Y!4gb`5(+{?D{7 z*@ui0dHGwtmm6JF3yvOpUT=veFXfRzfCB*Nn9o{D{G<#}I}K%m$Dwj9b7LSF?Ov|Z zMx#B*HSIyA_RLCQ9ITYpeG+lFG7wX}2K`uM5xQJ_$X`fDl7+XF&ZIL^XW4U8wYnXs z{`Qus0~crqvT>8Vtp7vD=~E#lb?~I8uLjtgn&_rFzU@dl-*-ob-lX2?dwyHqotr`T{xh?2F+U;Iol;FTvT<9t|Kt3t? zGmLR|oXx`@50M0FKNCeuKwRO0_1LEBtWDVnTC(e$i%Yd4F_Aeyo|tQ-@!Pd% zE1X&)DLaBnX!8g5JGncdHk&s;X9R6oYN=sPaeFw)fvH2?m9!62?}CB0aU7!AfkfeJ zRv*8#sLk`kI);$ZjK}xGoRdClM=->Sw-*Qor#J#Pu3(KIV4GYLqa9;B_p)rNNH*8e>g=%sSXGdaq*dUe^Yl)%u$=sTjN2~g)WSiSuE z_?;!>Plblt8+UaCfx46701yzZ10lqI$V2!3wD!oyz>DaKtx{ZTh4=Mt3t0j5vCL0N zFRcY1V-G|4u?qu{wO4&LAPSY3OFtWPD|e;DLXH=m+l_)Exeu*s^g%n4R?n=t{;&%I z5NOS3a8Vp(S?JRY@M)c6sKN4r+s|$r(oeA~swNtEek5j0dSY`jyVFbyMx_;*SU3iodSmVj~1kzsa z%fL>;YiUfKPj*h07{1N-@PP=o`g2FR&iA@hv~NM~s6IvZl~36(V>N%1#vM8dA@FWQdIqo&`_DDaC7+nv)07<+2*2%E<;J(lhxxKL89Srf6-*ZXa3K^iR z)J1gf6uI*=Y}1Q2UM;3iY-6T6^#_#P$?Hj7_N8VCALz9|bZQIqEn6ZOTfn)Hmas6M ziXXLU7)plvrYCRZ$KYv_yRq}fmD-rQ--tIoW)B*cCn`YL!hl?l@L zk=7cRxEs#wnp0lFzjFb~4*vOG;XI4%vk@!bOu95RgFh1P8U|0LVE#$zf9(*Euq0)N z^j-Y<3B8qs@gBj6B)3mcOCtr3a0y{LIJE;=8=NAq*0kb4{=#>V2+OW^!Is}uR*rYk zc?y%w5rYK3RTku*_+5JxO`~Vk+-Esf^?T|?v-0zjJ(3JCTzBpxfC#+Cfz_TqprK{8 zO~UM+eM<1pSQz1DEW}Ow zcjYe=jXx<5ds-&vyiO6oKh_R!1xqE$)cOe{P-Hvg}DNWZ`r!4ci*b`#<5FlivyD(GjG8c=c# z7Q);9QquQ@CpPcYb1$6?_M@0%|1*tAfZcvACv;Qc=C@Zr$b5{$I=tj9P9zLS5{=z3 zM)CC>`AuBp-@??rf<^D%ymIiWu#ae-gLXP7wCnUq+&75%6>`P$_A-O-OuJ*b>o6#o zxqans5fKWptLeQ=F85c=)NZ-YCm>Gf7SxIg7rS zeW&jqcD`lw@O;9xEmyOk;cN7kd#&(h^J0lM`zC?t=Ip=RR<5UO8SU_VAiZaU9J$d5Z7|>FR^-}h zpuEju%@f@Az3zHb*}ZempZrQB15`Lg$@X!Q8kl1=hPjJ6fBjCIczH&=PpInXR`?`A z?L?YM-y$TcKAc=wJUH}I&B^}tMW>4Rc#8Cp>GK>zcqb9TvA91CPK#gDJS&o0l%e{i zpWQzT8g;l~-vw5|j^dHJQp;B*@apw>6UuUl7%0n4bcUMd3TG~_D==9;n|pTiPvSp~ zbT|zOMA5(O?Blug{qQR$J?44vvy9jB#^h6Q`{Z?6lW-9+Pt5#f#=kpL4QYI|G^3Ww z-t0js)z8~tZ&at)Q8rK|AGH`zzIL^)!FyQn*@`O5{;e@H$}cvg>yPKw#DD?lm4HdL zjhc+#{@{%#&y9z{i2kJeE|1|FEZc#G=>6MLV%eIgKS#X$RM1s%TQ>Hnc+Hf^bXFGK z0ND2JoQTOAYoFH-AE5R))R_oHKoXt?zmTZKkMj2={o40hUnf>Odjv3avYc1=*# z_i(QzkygH8>Pd<*o+^xdQ>8#($`;zodL0~?paG^KOCE*X1a}A_0-kOlOS2gsd{z%@ zPnfi9=wF^W+!nxs<`-Klb{V8lW7r_^*zonjZ<7&rc!EFAZ6fBBQb6K zl10caoKV;cQd6t5VBuaUwi0}2nFU)~2;-8dtJnj*&ujYD^s2?Vv zQ;7hYwRG$oMWz`M55L>PdAR|>IR`0#@JP}o)0l#G`%d*1oZl=r#?f!o=1M+f&4swY z`%Z1(T~RErxC`~1Is-clzv-1;{CQUULPX7xO79T8~8&3mbr4f$Q|4fCW42}GH z(IDs%0hx;$QGZ4}14yh$m~zb?Q6qXlwXWsevQ?&t$c9kkG2`8zW0}yQ&<=+dtA>xi zjb#9WQRb-2u$_n1M4>+QYYCs>4Tim?qRQ&VhG0$$NYn`EL^tT>A_^6pkV&EtUqQnb z43im&`^E1;L{BU@<2V|_70@T3jV~SZ@)e{WhCC#7&o>qn)!hSSZWrukca!K%!x zHS+;TJ8i3Z_$tMTETbjWn~4%xZ}aTW$)t_2+FRph%pjpb=Vy^Ad-j4 zntMyl#fM}>j!yqaEj7G?t>AGMOfgi^Ka^?okPi&!8wm7%H@dRF=*5 zrm3N|9hYTkC+?;IA-$Iz4cZMtUja#Nr`^(porY%s)4-=x>rS5Knai_OyZPT%jE@pz z_BDxGV0FpJ28pj?y&-xk!KQR-{Vdn$ueT)PvMq-G{OfJ*-C0u|w61{M<*P}k6laT) z+x&Ewro-4=Rl_rbg7@lUjGB`HAz5X+|L_jdvcDBe*6>Vx6lFK;(uAn<5#4fj%WJe` z5rh#?Q_Mf-FS*Cd>b$nP*hcJv<8SO@OVFhD;wdD zx2s9j%pc+s9NCY(j-&?T*@XQCYXN;V*n-CUzaIxT(lfjzBI7d8@T2T6$?9xOzKxP@ zaFnm{2>9REwJ|ZNs_${R1rv{LC}15~IOM!J10pD8mMOf}4^8RF7A{39u<`OzLn63O zMOJJj-xourp<&-&9l<5Ag@4g^HokcFxt4<~Gb5b?&jlr#s9iZ;XRmyAn$F=64b_`@M>3j@7x%j^uzu-aV9m1d zTjB4C{!{7oSVm|5c7hVTTPwzMQrZh8X`M3Js zhVipn^RC6d@ABce>`kvsF)X;YXH~c2K<#s@7OE>&I$l5een-cG!F1(Q&(xar`%P9Z zetW~UD_ei{E(rPj@((q$3_NXKv<}&*wZ^P}m)|#@E7z@g(P-CfRkPltPaD$`Vl%9C zw2!S(D_iB4mRv77{nGC9YH7EX&hEL}qot`bpsDE8%z|v(BZEA&Ce3>8z*^6XJs<8< z5m^SieyjPKafpU~LWznfdzD7QGveMcZY5>81|pjmc16V{*hJHRZ*29`PV=svj}u*f zdqMn_^V$NWxC39Vrids-=!@(PyUOZl<`isr}h}Akux$hfx z_P8AJJ$dhKr`K~bzHV5yfAv347=OIDNQtWY>pJy!eB6*2s}`_e>gM-Mr@r{*2s_al zwH$Sao!Wi}4xZO<-nBXXSeEJOzT=5s_6K=y3ia!6+qv0~{&P^t9m{@wT5^5arEO7a z8AhAJ7yR(a=C_J2?!I@uU)y7++L0UX>Hk)Kb5vl8g3`O;=_&CpU){WL*7^h2_tq*r zuc~LbU}xxy`-+bgoBd?v9AWBo+NgWq8iTjAG!^|O&M_{?ORj%MbgcE_9gl&S(!1+b zzA&-Tx3fyWcsOWWt=TFKz2_pf_%`?yPaWx&V82O0O?Pq0y5}rKM>qG^tVmlmM(xmq zz-b?aoBmI-^2D*=gJar8HO$%i!K;;bi|@|-3pR9w*iUQO-@o`r z{T1G>UrhhjQ%#(9RAj8P*7auevN7i-J^QSR*$Stmr6~%wFIBxKGT+tuY1Hej8`rCy{q{@W zN~>2sUX$XX;o*v`ucB#7aUvl`TWcO z_-0d}(r4vy+gAOY_0HVjZEtNpsODil(sP^Twd?aws0D;n&J2k6_7qv{)2tm|t9Up^ zr{4PTrnp-_FWDcI_>!J=x}Wya9=&Vt=5>4SRDNl#e*Qc9=WJ&Ode+ZatJpAaO{0QZ zc$CgT+q=haez4a+`2B^Msawyj$X@xKL#4$hH-6RF;c!&f`IEw_7q8#S{2|3|i{djk zm)+R6qodl=s5E+GR^Q}{hL&e;4XT}v`YP(^yA$_Un{G9k*yLB!m*fArg1+fjX8$!0p_-r%YGBx_Y^SdDiPW%ZuMo{jqAFpS!6l{m%%u%+T=7ULFwY{@vl~n|oim zX%Z8fRCjn^{MG{#`>peKyrtBgWD&Xf-S(RQZbWW%J zUB6L$^` zJ^x=nMOTfp(|&7@s^PoU=J%ZYPKtsy*?3uRsBbmM((<}xzUQDyM5B6G;F=@GdR-&J zo>}zi_%%81DejB+7PdDv?aGX=Jn>BI1jULkztAn1bMpCR`HG&G=baF>y9|V0Rt?+y z-$PZ0>P{cKx&7J6R!V)HTC0){UTL~&JURW6==>J{%O^L9R-8W7)E2GvOwhLOqOYsG zgV$_GF+H)=lZBiAl|J8Eo`?S)IPwL09}px58oaLvc@O;^o^()S8}b!qoHZM?NBPqR#G z(TUeqxB9q!>bV}%z`zw_794ZVn7{J*Z|(+--)yqictuf|p2mUr z5|zGKhwo2juJ;YIN?FRxmX@WScKWIC1rhyb2G0t5DImMimhPSD%BD*}WKMtS7bb0F z|8_M?*0t1@Fl{YuM*Y9Ll$BLjaZUo$9I44>c)ByQ@#9(j`~tRUUI9x@h-9WFCM-WQ zmbp)z%q%CEv)ZTf*xZ67K97dRNIq_qrY0LPLYXx_UBqIeg4sCzaV$4|HqGb8>}_q> z0!cP&UsTEheLdI=FL$P=t4r@(*)-S5zk^4BF(PCJ>u!;-o>s}arHjj$?wB!h#{&M6 zyd*Z!!h+Qk%xMV`EHu!Yg$8)DkN_X{R9Pmovb10xZq6L;0@_PSUZPz1YoE$zQ8WGc zehm!_SxiI#D=$i6b~ZLlQk=?ct*zMN1%)heb{O-V=ED4arpbi~dq|ueO0ZY3?q+dy zSF@OznHmo}HpJhHRh4EiAJ1uQUU?RqWN*i+32xxf%fp>ThWT=sbaZrBa%>nY%88c? ze@$gBQ&&?XxZK&(6*yasG}{PCKMGE8SupM-%_5A z)^*CHVc}O)RAdv(%~@Gt3TvsI!!nbjSQwpwhuahmcT8j;Q&CZ2m^V8$niXWl$%P*< ztE;QAkt0X4rkY~fLoRcf?8u6;p* z{Gca+wq#qt?&M(07FOl5GCJ!tqWQwCcxGcYkyVtWb9z!#RN~*NtE;m*q7j@6<`_!< zm_u7@6n_^R6~y^xVO1W-eM;O+HajwymF6cAKjg3s!jZbVhFq95Y5%RnvjqFA9Uax9 zx?99Q7ZT1C6cipBk9`LFd9vn(#VjW+hVVX%&fb&5m_+m!SHZtTiG+&%e{A0-)<`?ocB0~MCoz35gi&B}Pfx$yC z0WTBGO!+$9EftOQEb3{I901>_sjBg@*azlMhzTLQ=W%>TM+7lk^XS~Bxw&xMk2f`C zxwJ1O!au%APmJU=nMSREfAG8jKjc;=o!N*HBbbts65%?L%?zgh>fKC#78c~o&jV*0 z8x=zQIg?cq&p|dh*jmw9{&p6=Uaowd-Zn`z;3qm-3A~LrG2(Cp%$UYyOX#{+N< zngCx~kcn6!Wg6yDBUuMr`;tykQX0Ww0$t55NM^zQo=nVTwj~4q#z%*8K51S!=YcF3 z%D=$Bqk}#1Paf@GgUc-N74{Sr=EuOp0uPSW)8%r>(|ro>10Udf@9AzFM+9$+6ng33 z?pDc`&Zcsfl^Vl5-KR4BvHE;IUoW=@bJ9qDZ)ao0eCeD`jHL92wQ#<*#48e_p^yMi zJ`OSv=Ra0&EK^lc<+{UQ+&IE>EOWHC;rP(j(jxlEXF;T6AXl)4aE%%@itv|A=VZrq zHfXkxWG%^?JKgPKJ1OMSzum3kS)idDlHbL-i5wmu(&0DLRD@)Uvt(7HfB)tm00Ix#df~M-K=_0)bI>}9s;rx=j4aI%E#*D+&8GcDpb$gtMB5)SipcV{m5059YpWIAjk&`3dM9JkxX zj2_J#?5w%$!n(LH2W$~xO(R1CPMP2hc8TVtV>s?hvNY%G z8ybw`J`2tscBu{V2H+Zb-wwbTB$3?5I@RTw%-GP7_$GyX085hlaoisw&x_L~!OnV` zB?o%T%2Xc$beIPMMuB*IBj$!}3)^_;9&n}$$(~;{FaLLTB4`!<6lf-cY&qD}up^vh z_NhR70$#z_RkSbIik{P^a5)N@l}z-Dy+HmFPu^P9RB1X4xN^ItcB$k;>;b$5878|2 z$ZW`$*<}06_T%2c&WiIzUdC*0-@#^s9s|CH zCg`TKSuCONp7__(QEdfz1=|iXU72J(O~U0i?724LQ&Y0}&?kGrZqFzF1WrLeu$jV# z_!pob$orW=KAeA{>(B>z7VPiM&kMMt^`F_Ekf8L$z~BF%yGcBwyIFD#dw^XAJHXMw zhLw=*3pp>?MY8aN_h93|-=9eO0d_TX7xp4M4n8;V4f_BzWJEk;Il+uokPQ+M;zzt8 z{$+VfB|;H@>DSdH2_igP13n=C;KwW=+VS>qc?cd_gg?VRfIm@0aSPZY*e7s36n>1K zLAE?}9pV9?MaWwC@`yu#pJ~kxX>G&5v;q3Kv$?{9=DCbLK;}W$=;`Xog&#I50~p)rv=SHhe5A6*x8XCO@3~RO6_-py==bMzZwB&SC6Nd7C1gT^lzmg!H;A*R_BV zw2#=~YVtoj>PwA!S}O7gH-`w0pM|}^&y66Nn;aX?@hJ3jm|Mh`X#A$0_DXNE+ZB7; zs-mC=ot^AR?#`Csa|MbaI`cilR)wDjKMm`wZd))~9=x)B@ClYJF8d#R3*Z}Z#AQS; zko~ZGh=#m{@qnYJrF>j>o7j)`+(7=oHPDoUtu^eld%bNH9kkC>g4-1~mhc_gRZFX) z5SxJAD&^td^gVO}&IJA)d=kiTn&UWNlbu7}J$$kyi_7o1PI2O~lsN=H@R&{e;rMJ8 zhsyg7{xsS8cfgZ4C+Od0jb&5hjYS{ehrWRA4|@WBH+4U_5O-L-poquJI_k^r^|Vw5 z4mX$34}21B?}aVn?Bu`}6R#nD20TDskiUH6QMN3d)4m#_X~c^<7L}e}yS7kSn0sgo z`T?&4zi1)9Xv~8Pb};-=#0?0h7l(c?@0n;}QcY#{uZVj#))aA=0XO0Yz&-g9FU$K* z=p*^P%Yx*mG07sr|9+ugUQ6^G133lwVJAU<&^Uf6kX#1MAco)7RQ}V-rYbXea}4dH zeQpFUOifIAEDJDW|A_w+{oyJc`i=06vm?9ubDR}yPqOQ8QmkpD@P24ZXH|!}VUr`C z1o;KO6#GF;u=c53$Q?TK%F3bN%6sl@FEb(dZ%gK+QoPecO6vrFc!)obCz2m@v%6cY zBkx=Eb+*vI4>-TzUS38lONozUjSGstAI@jRc*;T4Ll=TqO$hg}xuJg%4}%Q?okOzv z)KI?1xAJ~8UlZaKZZ6K;Mh5O7cYLN#L%suZy-tU#An)5{^_6<_C0VydlV3P>iX+#r z(4|Cg74pWT5AX{yV#o%_x8j^cz6Y!g_~{Jq(Ea+(`ie2b&4d1SvK46jH!&2;#`)uW zT+kz>bgsDXX{(4EZVo!P+^`_;-{_a@1jI*L>gN1+xNmx!$~;N7?vcHSC-!tTiTjWn zg3pP#S6V_i@X$KkJm`my2^b;Y1=!J6mvK7^{C~TRhweR! zhUCEnKNh(Xe2@9`bjOe!DIHe+FeXwUzC0j>TYQ0F&7>UDzo~Cfu-mBbIeBXdeYF3L zvi>mEg{=nL0s2iC_ea{^w#riE7%&GetuSYee|9eLKE;;1mXbXW8Tlmq z`)AkuyT1buk^XHadj3QH*WbPV-!UKfiuN$?|0Di|{o@>llV=V02R*VS&CTCa+lTQ( zTZ&emMZeHe)cZP~g;rZ68o;yAnu$b%cote;k?0!nJZw+-~n=%2p({b#AAas1hg z+6H>2`FKm~u*H1}eY8GP7%-EzgT8&#e@{WCrSXGG^i1Ci?SRsNZy(@NrSE9`fa-NK zM(vIJ?X7Nl#=PAFLhH+#=y}6ny|iVFx74tH>c{W={r1-V7W?2okqE(2bGrQKdQhi@ zjv+safxhGB@^Fm}V(O?{K^+zHCa4Jtr?@L>tR_)@7dk&I(38ijGsy>l4TCrjYPAr{ zfp3J^dEBfZp5L;kItN>83xe)9+X=Q0;*VrU?C|&bEnkK)&}XO%NTL`GVtmMhr<3mk zosaq^^s~e zhKN`;>bU$U#)n)3>KG8~K^{EFciKbiC&z~JI3D7Yh;JYd0e`cao)KdkI=}TqbMieU z=Sk+~BQ7la9(63pwPjJA1>#h|0pd@v-GH0Qk~FHvaO3M|ksS~G!~TMwI5XIr=aX;- z@Xhf({B6{|;k~d9a89|Sm%BT}HpnsKJdhI$CcMI?MV$&_G&l$3$i0aUCYYH}EK{FJ zeV?f^`&Z&VogJMq@R}SK#%n52vx9s^d~_Ju`6;xI2>v}_K+OgGL;8*AY?55Iry3#n zB-xZdMLY~XvYU$|uib;s4qMg2+?4xVus4yz1iVuEqr4@>?=e5l2X!5$CdO1}63FAe zh!vC|M^5{JzlHn){Ai**AA*JIgvy_VT?sk^j&RnfxdEI`l+!>y4)G$`Sn$UYGjgGr zAlA=H0sfV!oyFHjd=@oppt*=pUp@zFr?DD0Dcr|z*4D> z5c|a1xTLn7G~Z)0aRQGsfVPnb20fz24!#ibB*+I%o9f8@I;?>j1z{f4870JoQVd}h zr|j|Mp_dQ7$GtS(6Hoa~;5w4mN`TKnXQ(YhJQ{IOjJ2E~&GkrQ z_`+Tk38t|;=0HB&LvcT%g<{kys1Z(wu8U{DkN7lX6=)Lnmb0TR$s8vxrvMMm40z{t z4TN)y7iw9AIg^M_yT}iu=ZAiX<567mbVP`c-1R-&oOtYBo#ObAYq(Hb2|fhgz^lla zBVL9$Lq<{rmoJD<0!~_tk4H|L)|vLu;`bkVTFWC5j{%=yyl{aAkOzQ_L7%my8P(T$ zKgc6v-4v?-KpqpZb?`?S`PGmO4t6#~&(b4nHW9Q;BUmEk+ALZ1HNj7{@ zU6w)hN%|c3koWZAg9|zUxmCz{Ou^S>86sW3`*HZk+W56CnwtG)l8-*O6v-N1MqizbTH4!q{N4Fx|lr4hUeQ+8%MPH zA@VcQRpkFgJmqO|&UfL&i&z^xMYuSLd-#i}wJxMuGw2D>7V=l9nMPg{J~7eRCAv;P z{!X22&(9`~WIA-QiufYxHJ2@`)LY(O;ZDBNa^lk? zfCahxV5)B;9~AJNgDpd{B@J@Dr%lq1{f3gAMCXIV$=>2-#W{}OKZiWRw{*RDoAFCW#8exr>(NxWwHb5iLeK>fqFjhZ7#*aX}-{* z-{6_%^-7{z0q8a4j>;*rvVH$d_qH&K@-%)Xy)-55$1G zo6F_yov+_4-VWK0Tpn`N&~0>1u44se9*;+Ai>EhBmh{xf45pRbMAsa11c06rHVZJ2$9q<=;ko0%H?0ekP{fo&gFUH|-Ikv<`;hQXXi1LO zb+<`Ap_u0|ASy-k&#kPj3qJB>5wZLjqF{n&~E z*o&A8S1jc*A1Bu+@39>8j~wE{itL;4wPojpyp@eZ6V7%MOlM`s2=^=6DjXqyMv&dj z>s;sM9U0E=6}}-FGOVr6J&k&H*ow_{C6CP0N!ORwu?us^wq!#rtEtHQrD@@ubGf-Fc?S|%>!bh$T-(Y!Dm0Ug%=5MYkFs!GXuJHW07Wo;nQwLFt(bh2c zk?TJyulKlh9`zowf@+s<(|J5{{YTC5SKpz&pu4%^k@=Fpy2j(amltPhppWQM5UxJD zr%UOq^iri*3odPnv6xX@#f)Mp+H|SXz0#nwrozCCS|wc9XVj`*udP)*TRTJPY^`tq c)j{9>!9m}1gM;Q4cvipRONgaLpCwAA$E|JMi$f(gfh9&pg5O+2p=CG zzl02jj1m?S3tJf*M+XPb7!ThXpWrnCp$8#xAhFmpB|fzmGOF5QhSo@FprrvUOo8ib zfJ7n{bdA)E%(b+%)JAR!jyWP!>rpsf*%^n>MDaJT~=E&=MFBxNKdB;@4eR904^>IXubhNGK@QB7kZ ztrOuLQ>gZ7RQFPPAN0^77kMGny7XU>HWx1z%US|9LS0S`@DQ1l}qF?F0{btIJVq>1GE;x^5o0zd| z`0eGg#cf%<`??IpfRQ6 zZ%cr{)bRnN@(I@7`M?(9p8kKeLoL!xELRt}m4Z}z$3NF#1Fe{CJR6l?Tr^`ZeMu@G zQSBWz{>(@S90pI4JDsKd%Yq+1K|BP{Zw@DL6mOfcrZF>|s_;l}|Mk$tzf`QbGw(7C zZdek({s(*0>cu_8M>PE;h?R*_{aX*~#r}m9yU1nhCtQqV?7b~0bzxEGHzC_;ucc2* zZ9mK>GOnUt?bh3&WTRGkO-UDAQx33Ec;!^4|bPy(c|*0wQ?9uD6S%1 z(i9DbJDk-wePvxkNqGGEDg)O^>3=gRr-jEBSqcO+D8nfU&V8s)YcP>X+eZgFFZBmt zxHhcs`})nzHAT~G3Jea6wgT?HU?Qc!i&a&kIINvrhO}ZEbq6KB{H*Hvh`PEcc7lWP zOQLzS96Vs8(-uh;_*Xa5G`}i1FmX3(5S@{N5`GFe&`|mcb3>+rLtgf>Y84)WlLpB_ zRs0BePGEh;w^Y1+%lQq=gV#;p1?g}2D0M^H0!^RgjWUc?Voz5Cqe6NRlH{iMSTa=_ zFma}^u@KAv7CAMz!Ecigdv&Ih&~U&m?gQ+j&8?G%89HsGV26)B1kf{D44MI6h?!Ze zCi^QWmzvBepv2`cl+eTv$dR8QZ9`9pIvvq57tvOpSQ0_PI+i#a)?U& z-{40ldmq{>?&EBlNr6r;xqT!YrDC@q+LEBj1XY=IKqK^k{P9Dll>#O@vC~132YSUN zp*i8`(Axajh5}AtNl|J+d4aneJ3B&0u!LU^lYHx9Y6)j7vFxYF9-Y+1gAfyX@Ynq; ztj)JW1%2kqj4DU|daV)Xs6$009M_MR+}wgB%)70xV)|??lBuTAvm0Xa)uoB|!Z*1j zJZ@40mp!ortI#lCgw#&tqi2G_yT}Y$`Q_~T8A!zMQoZv0kltl9WMjhB%B$U?_i!V?_;rw-!@!Oq>ak7sbpG?yrCRD#s47^C>{!N7p1 z2Rhi(qb+W8YotB$zwv;;E&<19;yg*M{O+JpGY0rluAq<%Y~h z4&EFEbwe;e*L3`F8e=L!kM0h-6FF+17S?U^TBZs+_T%d!z$1}DlE(D~vz5lQ=1)<# za~8Gqzc%O+B{+YfE%79VLK_`$*g5)GqBTC-Fnn2^V-*@zEvwNE?EJfn^3-p9AHCY~ zlW3Ku>s_dgosGu~aI@iuC6J6*ptV6szY$Vrn-5usoW6SbPMzH~JAOib1GIn0;Xf~x zjGZwr{aR%s#Dz0LQB|?WN# zo_GECmCVzouE(>I3~(;fSdJxXVM_})4RxuF1s)#?zP4D)=SB@grNx*euSIb=%}15Z zkP@CKMkHrW6V)EuQNFKWrkb6tN4~SPFW&V#@GYlI(ou*RKC+G&baBICc%EI*O?Oo! zR)b_KR5~2Z3?7ulM@nb9Kc{KilE~d3SG&_8U0{^or45CUEZ)dmXAX(J+ zB)>(|oNyy|TMXwv#nN5#{!!lZ**MLor86rtfyG9 z?Np%~mf=7D!AJANMR0t)_S)X178w2c&-j~;45U%>MqeI3k_LM)%H-98w;xfYJ8YV+ zoId-d7qS=j^}CEBz~$MMZrMp6~oTGCs$T7oL&VwL+_03C9Q3O{SuDx*tjf29rDYP8-hsoiSniS*g7i41}VXw zVP(lR&UXS%i|IaUmsboQhmgt*mwbNG(Bz``@46>(9iJ zRr!R(U|=VsS4+&cyklZ7R_lud6Rr@Otv`Cgp_)L2q)$X0XDYtU*V0BI9C#cyu%J?2 zQB^Tt*yHgpgE~!&yj!z1ya?$7W;2Q*L&|Sox_s$17F0|>ntBWM)Ai9d-V^Muf6N1A z@osmTh)|&!&%Nn=-l})wom5?K_QbI%TcYGoQ$KSzMC&;YIY1e`q4JMu?9)DqefGSy z;f>%<40lnoa}d2(aM;<`GCdXkU(gtl&O*csNg_D2y6r*$)zgm%=5HUXh8DKpTdVp8 zJN5ezv+b8S4I53C!H0$)C-CT(*=Siphiv?O(I#Ak^w}Qtrk2Otc8B~a*YZ_VwxX@& zec1B8a6JslG*T@Y?R@+PB!02UqgX@)7S*!n#_0OU&qKu+&XmLTlmBa{LNNAn?Q}gF zd6X{*MG>(i_-)cz2n@ZJ)Y@<*#W#*{e%4(eZb^jUE`_ju9p-58d?4E(SWDE8G?;Q7 zVk;;X8qcM%HnMRT|MV-(xBf=&B|fzx19Y{h^LB~Kr(oCUD9AO9%}ck7X8h|oA+x)e zLlN2b3_fPjcHz)gxuXf@Up60hyFS_miM2?dJsZqd;ezQ_3M>_D&d!)-rA$4d226bCJTPqLUb6}*{- zB);$n!kE?@CxLd;YR5NQH%UeqA-}61trHjM>ldl}`~s-S_5Fk+VqEA=R6DK8 zjJ{|-I(04IfGqM<(3m#)SNkQyD1i^A7rw?jIqeiRN@jo8OUT17G~f(*_HrKOJ}cqn z?>q{rxU@jGc_hKgwLc?~TyBIQ{VeDOwHP`fT0ou~+NR<@6LecpdA34@JW=!^s=g!Gfsy1ru`fjqH>9^TN*jg9{ zk4K^I-1Q%DwVo5U#pQnscA}vKZ)ke2*+{=CTado3Fs_@Xc3YHs(FkF#5!1u_1XDhe zK2W*(WrcqfQaunx3k}(Wf`x`AdG?H?npel8T|ClNI!k>>fNLL$s@CaypI#Hf(t60WwFobOph!_%!8hH!XMvjal<>g%@rSsE z<+T^pby`{+N|YWH;80G2fHb9bVW*&)ybvYP_yz}_j`K_nZ~8;sOvbMHAfk@?*H_LJ ziZ8zB-QKw9_~4MC?;lnVBIVa7@_*2Qc6-D-JdxvQd`n^IZKEN6v$vTAUtK#x&S4&sw4#a*~c$Jf($KY^U+A;%htd~c@ zc{SHxOAo}8!jyG?LW0yR=lAae*eM2mhyLphYeS)-=7(B2uVOxKE@JjVP_f+12&J{{ zQQb+>TKi;a%cAci&6pG7VTK|-v_h0WFveYuvsYn z=uHZX`>Pvd>=u45QWyjXY95yLK<7HvW$*WY#s2R8#k!djV&9HYL_=<17VADKGQ=AC zeZj4&D?hM<6@ur3^AK4`xOU8dRWP<=uuEU7(Hx(Gx8}6eJT?DW?Ld{Id^rtUG?;zf!`tiitHIJj0#c;DzKMk6t} z_V6GvAw&%VuWRE;>Z>^_s5dmYPIZF6ull*U^15HOA2~#PXE)vsB=F+KTL3>~&N~+_ zzT^j`P~Q8i?XTVI_4G_jR0F}Job3C@Hu-ib{5z>%N%9>vd=X3|f8t6xhrcezQ{JT| z_BRz>9@ejC?QqKv<4}&dnMB8&1P51~Vui6jdZw@?ATb`!U`09%b+roKa5+}EUX(tY z!yorczO{Nhqc^=ipaAP8U|+kD?V_a-h?r19$xlHqk10rGrkbzoNMs~81S=En1?IDP z&vMt3pSlewgfg0zh4Q09=*+IwM&-375DSfrIe>s+7B>q>#mra!6%!) z`(_LV?`AqymLsR+LQ2^nUV-HsyemC43#&E9=*g>W6_Ofs{y|xaf**Zl&+A!2f3J0P zyn%L;l(BHh0cEnXi50u5S~QT02(mMeUe^pu{8MuKV*iETm}kGrixP8=4+(p26jOP} zYVJ%HC)AgQd-|FY$NFmL87Bsh<{0Yh(0FJ@P7BYISj()=J=4xak+_pkB71J$z^dMQ2y%V7xfo=zHBHds^(4HDsyY%64`yLvPsD_ zOQ4ol)i4b)R1fPTaYw++QuOh~LMva+2htH18T;6=p)hHo$=2kNk7Hn(I#s;DyOW)p z5&q=2B6!5umKGSh?#PLRAgKAdu7s^gs)Vz6FYiOagjCB9S*hPsA;1!ddPS9;riz#1vHU(mM+I4;4%F2Vc0sD5oW!-v4u(iwel8F z*O*~n^l`?vq`=>YoR}7Uk9adVfP6~5fM9ezG@)GF`g(nj1VGyq(OtD?!Wxctt{1+C zV7`O6f07nN&h(+w5Ru=CbqM&Fq1=&NaZ<)SdUH_~IN$RE7e~knbZYgyx3VQ+(;d}e zv&@?&6k+{zmI7|5>2LVIf`mj;0mnN!EX}U1A^TXd9P%T1Dp!RR5f9`D}R6|)#R^&M3(stGoF-vUZm3&ze zq826KW&|42t%#@Pk-CvOeA1?^U97WKS7@-u)ubTs7h5uENPg4m$3F#^Py(PG0TPl@ zd7#A8dkuO6H(Qf|DFX}k zS=jY+?nfAP`H7fK#0jd&O5F0ti1Cu3yhI{8N*+RgZ=!e6Zh=AgKKgk-1G~NQT!(hJ zSQT!JQKY48WQf{`XOqPMR|FsgEjTMoIZhB&L)|AHXNI=w0~l{MQ+p1z zC-GBKjh#>i9gCyY??qoZO@SP4!td`2nzdfN4e#>bRx{Ji&l~Q%z6$Z9=R}t)4c(OG zEXRr2+>eS<&hy3i6aHlVMOC))o8rbd5lMEOhHFH{V3m+JxIU7wE!`O}LQA;o2zlFu z6Lgm4nUac0QLzk)ys2h^mB^In|JkQLD|2svg6&c$htz2F<1p)x zqz$<{f6^tf^eRG^CKB9pXCw+l*f^qrfXrVL%KY2yGHYiNld}0(e4(+@@XqMjB*N5r zO7_L_^kM!uou`u1uChTs1a(i;K5s`!Vii3$i*M%8fFN6$=O>JLwtChp-JpFKJACSO z3coHC-#vM5_`!;|r)R$g^68S6WabkhpA@xjrQwr=>1F<_6C+>l^!fl{LW4D8F1a?-(kd?u)ewI*jt8yz6Mo{g7VvlblXq6byhWBuW-dF^}VZFQ98| z@b$2Jwp@@JS{g=A< zJZ{G%I3)ApoWr-UK~)!g-Y;fVq`6h+v7(U+Z~du2Wi)jh?bg({m-Z~ir!vEgf?$|_ zfrIY!-JjsG8LVdGN7aw}obVsE@iABkk)2RVsR|i<*<-VmvuWnhuf?3QWLyqH5B{uK zFb1M8961Kt#|rqjPe*cLIh^5pdpgyLPg{JXetNsQB%*`+!yP%2<1TN1_4+x_uix!X zJvNMbOz*|f-rcyeNhow$M;C`AJ6AuNc~q& zn16iP`%qxwc+9IO3FkH_W3UyR(imy@mLnF~8YehisMvnoK6NR)ma_Z=yW#h!F$*Mi zosmXNV?s5glh2`<&JcT<7ZyeFBh^Lh)8VXa<|PaY7fhyvkQzPYBL53e+xLEiqyIh) zY63-Sm~!FS@H&yzX^G!ctWrX%rwsuJ*nX?>@}wONPU4Z!`uNw{Q485rnPU;5;dlid zH>@5VFsrk^Tf?C(k;RK4D$uFgNNCA){c0CLmK^#b!bsaN7L8vtpavk;j2{&W zt2u+AlhlCjeIuVjMw@W(e4OA~bmRAbj~1OO@nI;3aqtq>u{a}IPF0SjoD`lKk-eLC zLGZEXGuYi}#u`kk%}uP@SXH%4D2GY+>#IdE5G1Mx&(awE(ke+{Zv=^qC(`0lP&zTD zhgv*_00gd+Pz6``fdEX^(t$yZ|vo48~>#oJ(yNlQuQoOt4YjB{oZR(UtWM6&*L_zwkMc9l44C;3!=}<<`Wjqa!?=a-kzzk*pA;PMZW* zt_SZ}19@aq%nSFpi0v16QzxXDIp57pG{#v7KA;-0vWPdtaXyI>pU=VL3js>vkGjrr zaAih6v#Av#^BALh7IL^Hrupq%2gT@j03Y=C+!Qfz(H<*92iWtedHl-9wrrG(T{D;p7!5abOUTpT4{*ui?1=SD4J=mZe99jHWDyBzoyS!OP4$` z3zxPG=AN!q-^t2@t9%sme#*Mn<}h-Qz>_gc``*L7;2RmVEp(@%p3EskCm@?Ffelp` ztlbi#ZZ>$alE! zL><_&K~Q^p#3*M5W~+js@+tdqzFIjs7+V=kWn9-@atrY-?RRU4;9|A^QP4jp9`t3( zhrM6B)iM!!Nk)~pcQ|h0(?1Qlyx34;)l;zD{Tp_>FpWpWk~yDjO^A=dqX-n%{a$+ON)$l*2b{k_X+i+jWcYoq*oPAiRu8ZDGvSidHw>9y^0 zLRZYQW-#{!MU(cM@1{le)16SPEr=-F_;+i$xql=#o_+aln!`W9=}N~jN;Kl9V<(~Vi2`Lh%<-gnWA*s_^jZx)I1C_rFNr<}5WKpW`LOh()0}U` z@orKr=R6K3spCL$CZZ$z*a;BxNgzqzenXHzrZ9nIuln?Piibmb)^FX-NFK{<}^TKsY?+KY@D{99+ zDtC0K2QA=`rtzAWFoJS(B4+Rm^6~j0#@I!nj;lQS01oN*+9xyqyy$fF1AZv@K(*~~ zr0nNE{1Wnt)Po$}PEQs2O6bbSVyUImA9@( zh5oW&16Ciz!NWoKtIPcI<%c};FU+6BB~O_j3-8SyF#q_|*kP|?O$Tk|u?EZ{nhbF{ zy`2e)O1tn_=62_uy|-$};n(V=5x=@QdUUAmedj5!b*xh0Srj;&KH1rym)$d|C zwVsl%X!D=w4S|5UWmcptTvlCHwOmj;0$y?@BcQt|kTcM|YMDtY{sF1wYW9>aR=6*L zK`*t96n{FzPs>0{nsm;FN!KgU77!?1;`egtB*qibYFM-j$+$kCu2k-d$|4l2-Ez{= zd5?Sye$ARo=5M^ThDTBw?6zk|w~XnaTKN!IC=Q5PRWgOC{*!@_|KfWCD{M5DIV9Ni zE<1PUm0bhPxb*9|c_I~7G`v4svrBL zx+dFa+{x0;v}x8>qwD_eex2MX-T#Vp;~MQ6`bL4$-ob1%=`^uS_Oj9K`y6N^1l%vi zm%7U7(lOqGy-su3%}d8}4bq0L8?L!L4=RC*ttbBLF)icEpVJe-#uqUoM~->I4M4vx z0xY1YhewNJsGLxeFd-Z%G-UTzTU8yWxXNhxXI>+s4y=WaCJTv-u2c3D2i zIkofLe4-cs`GvOA!j(N!0UZ@iKW?mw>q5lC{ogAOvz3_<{TI|pf1b`Cp?%3)c+x{7 zg=8eO`=oU){Jw!0j-)a<(s&0i|DE@p9T7A{D@0E77hCucVoF{;5&8XJ+Sg!8WCv9Te*TGh5VY8 zTFc4yyGzc|5)l0tJBag6)b&_HO(?w?=7`xJkasf&n~}75w|dh#eV~iY>RRvmH0rsx zQRW7j#eX(H6n!*DZ;{{--iy!!UM7#c=pb#JG^Lq4(mFED4R zQX;87HeA>irXe;#XrKg2|vc-rBF#+{}~3`arw7utx+bmrk5jw^5N z>oyHn$B{H+lVz57>OpDh@h^N8d|Bo{6xAMkTB4r9IW{=e2mg5MA36GZcpP zruw2~!9W)Yv7P~?ZHQ)P(q=yE5G;QeE5HGk`Hh|?1@~Th{-v)G+bs zfUhlShR5#G18wW*zM5!d!F{y!tf85W8Syko^ec%kGxd6^5+NDfva-N{SKbLT;;7kR z{?QP~?eD%i`|*nU!pO6>1Cvnx>AUYNm_-lnp5xI)y9vfR7p&r7$fP_S4L|E?=I5gr z*cc#$A7{xJL&FP#nP|9e=8JO;E7{s`p)JbhWJOh0@QaPfs(pL;q}qT;fk7aL{5YyfJ~ILPJq;}ma1utU)5BjCl?S->!5W8R z1dXDZS>6xja10hCe>(Wc4iF+`9qxK7x1;oIHM+B(rYnDsKs9Kxv2hTZnmZoysN<>a zvK7Vh?USSe3sCf@&E>0uB&HKLN4T4aJ#)QRl_3;#FKbyiw5o6PS-6J(SzC6!^q>h& z`uGFCCUe7m_BBIJ@I|&U`rmkb48j|*=s$58>#hK=vk0QT)%%_>Se^$_W5BR;1qvcd98N<*Eq*)+s0&`6&8iPyPv8N<%fK`5jt zmk2DYTR0Y-y`bGT7JYFM;%0QTFc)yU3_;SQM4OCsM;toq+z3;P++UpqEDs6x{gr=P zDTm}pj_qM-IDX7$qb9pa~~?p8TIp81`L=hbHc?Ov&6h@HCA z=XH7Qyqs0#bHBH_S?Y>G5D&4>`D-2fk>LGf;Jk1nd0b|9q1zYI$VuP7E3y%2B~ z1}Kpntn+K1<3AJ4guw0PmZ!qPS%=H}69L8ty9-J?oe&Ys=C~F^#IigSkC#d!5(CtI zW(zv?&cdvg?j0zWQF%K{9;Wc$)r-9oKNvuF@?tjg7`{CV`<*-Y`Gi4)s|c^S6;_j=VMAxHy70zQDVb;lL0SLvHx84V6UUHumvJW?FN;V#quAUE)VE+7= z(t6%MYw4QUcY_*w-!@?YDeNcf&rXdecqInDW>{27oTWPhu6ZFQ+X*A)js#^ zi67h)-nK34kR$upr48y<;{CdmcT(loaTpki3KK6##GUk1GX1=XfRNfMsDIhLxuHAd zwbbI$QIzK9-_j*I&oMvW>}x)gQ!Fy>L;sHj-=>cLvFa(F#*ZM+uffF$PH!1U++Tvc zOIg>~Itn!Yo=xo=eja9QjLm@r`$aIoPd{mKJZt zBBRV$dioKFRnCrQ>*?W_eCP>qCreTh&iuF*Uot>B;3FfoS1!e`z#s={`w%Jj&HUX9D%U%B>|L`C4SZ` zpI#;|*uLgF;WDkaGGM|mI98G&z??HcS<47ti*OaFw>05`MDlst2j1d`Hpt_lglt`~ z%zx1ZIrhYcmRd5At6%@a_s~JbEOEbQk29QbO?7auXVm{K_klAW_%Bv8Zg5RVMXZ4n zP)?pL4uS+@%?@s+n4}CszI41fwZQ1ArqU=SkJC>oG{WyYS{6shL3sh^XQT79kgzs9 zB?yYP8c~A@+ME&uiE!h*l>?CBiRm1&3ClIw{M4@dU*P(V`l?`l)snL;a@8sEz>@W! z7mtOAc`fz2A2>EDCPHbdaI^CMd6#O%Y}R}+0{rYsy+2O%tQkD?e0BH<7TLlMcJ1b<@aV%x!j zIL4KCyo7K6pm|}CM_tRYKBLNCOf!KE_I__*%-*offvqWJ;QDHb=E$Cjkos8_gH+o0 z$(Co)_;wOrwHrv9uM!Jn&PEUvLs?0OO`?Pwk{F<;r7f1YvT1#CjNXha2@XrCnRIG3 zScgZd#j;PL$!!UFvNoLg)!_j#rAK{G_eU8@bVceA1evu3y~Q7=8?;`5QYqpWlOk^T zXir0y`ojdPKkeCUl_P0D!R9OX1nUv8y(}o$&H9!Kz;`aKy_p~?EM}RG3{5(XfoTGC zbE1btQ*A^M^+dMmvwudF*sOO&aAL239<2X}fkg@q^dD!hq&&3I{Lv}dPN9I4h5)l^^nra>csw0-8nPK-l~*kB`!&0#y=ZrAcviX%xLCL zUEnr>G}Rh4_sRif!b4i~-GBh$6IZqe&%|P($*X37+bgR<``U$*%*R*p8FPq$ifc>w zzuR|bCNn-lM$Vrbpt3OKJV&v}#mEve3Hg-Q4v#`Lt_JKILr`DQkh60_;FIE@z!X|# zvKD{yxXesKxHop=mHG^exgF669N64X_5&gYq+4s9h@fSPB^R;@NJ(o>iEku(PN)To zies(2wbQwTB#dPo3a9VHwd7#|iGU>`@D|g>SZ4R?F8S_Uwf&Ha_h5i0AjI}fHKPkx z=k!gC;get#8`yR;!U6S>d{i(#r~uj*fKYAc!@xx!bcnt^l`3W%nD~+jw+G;`lmK|t zX8vU7Z#ZS_5&C^_Sg}XV)Fl6po`%!mfvz`Pin_IahXp!ktTk{-7qXWD8fvTluJFym zGyOh_x0!l;ByZTroNmk4+qgia1Msn_|BZXb`GnEp1;Uong4F5R4oeu>m7ZEes^Fl< zf!dSRb6#m6mS$E%9ZWW)tr`JQ)3%ckKA^wZ-`rxN>+606!_9d=daRjtOgIv>v+@s$ zz8?CLj$`eKpL)LuX)9k)*|1&sz7qGu#D*Om8|2h6?Mp&uL0freS;>d>`njkBe~=z( z%p}e}l;`nAJj!g{{dN$bPDY^UUQKTfX-BYuS}567Wr^uI#G=241V%k|yhnem$y705 zihty8W+Vu<5j3CC_TF2L+&)u8J_6(Vp`8>M=zuc)Po@F29VriHw7xqfO^VytM+j2U z$b7hy8vS*nBs#5E5DJErOR;~mhnN@q;u+Iyv5Bi+!3a*BzARYn3I(=t43c zYchjwlOQjt3!-HohKM+TgR(z`1mmpT8PT+LFQ|_Ed!AXfD@F2uD73hA%1cd35fWtl zw`0Uyad`vHxm>K4bBIO&aQ*cRjHiYvsLEoFN(HM?1xOEuwixKNmFMqREwKSywQ72@XuzAB3fy|k?U0sJUk7fP;WiEcX zG-3u!FvjaMH3(~x!{aezo;H{^;7fAo9JcFd8h=4(YflXT&oa}S{%lcUJ*^jdj49lU zv*f^b?Q^iT));#{T3dIpvM6e`>6bgb2kVEKehg4@(o3y@drs(DBKYhz#6sl6(Tu*c z8crqw0X4y*Sv$-VNRrQ{uwQhltY40SmSLOs@5CxA-yJn%wY-hEn^=}#lf(R68qhWt^tDot z(?jZ4E&oo0Hal`aa?v?<3Lgl|XT3jEsh;iq`3STzEqfE+UeSI04fuSoIth{0js`g| ztw~%=@If?a+H-N=gF*3sW0XTd3@Xhn@UEitG`7J?vXGFOFw+66c&_)xUJIV;8qDbq z(mUN{qK2dLT}1M7GXor;AYTBlGFQv>SG0t9w?S_xF9kR83cfLV)8U85w+25)DA^G$ z=c0nyxz%kO?8HVD{lz?@+`a!DXaWn$g=DE?B4dUX`tx^NEniPGl82~>dQ?y3|C^|) z2!BgcMilx=;j-`WS?8c$7_hmFII2|0$&<|cT0i+<(vPlYy)XZ_#)dSKpR@OR^oi(sq?xiy0oI`qIAkN33UA zCGohMr;@(4$$(>>vqfvR`Ru2}Q?oKxwxlq(0#Bx&bf#>D0 z1O_U|i1H zg0URO;G%SWI6J&(NCc^*RjQXHtk|@pQ_ImYVQICZnY#A!;Ax|ss=$CTL+)r=)mqA= z7^D{qZYLTUnx9Y5KiEFF>PWulxaq$QN`Ca+7KgwN0>a$hwog8m5HJvV-fwMmcWy^R z-WqWClWY%MOXWqRNB+X<82_B=@~IW}gFKK42Nh&Mn~Rt4kw6?Fn&x*nsHw9Wc#1eH zW_UOxi5Haizx>aQiC*S_As|W_3mMm z-RMVP$$hdlilL*j>1-tg^8hs%s48`SNq3VN$}85A)wW?*H*Br=46sm?rc?4YuH7og z*N+W!d2<{gHainr^|{2G+FH$o3c^}W5(Dr25pD}_tpo0o6x!BWFGdv~S&1fz&A(llfb<7{)Z*%^FwJzXUMSh z1X`Y;%EOU<>;10z?a9n{C0Yozx+@Dp($ErBXWiy`Goeb#Nn2x*x=V_(yX$)kT<}2$0v$?@w}(uRO3OKl9x99%GFCEv2Vrp zJf1S}5%m(fA3WfOAjR(?i60`9KgSJPuK#@d=dh}lle68=_KuJ#^E~~_q1~wm@!((jc7i9figI{bMB_0{6IorkGbGP9+~fY;$PV!2fStrO(zK@3sml$H+)tSBPV+t8R0nfM0iON!ws z9CQ=|qsVKe3~|{_$4BtP-7=Y_M(l4FOd)q>>n$!{2|$B_tl7YT!U_S#k}~xJDKIle zUk8UVQ{RMj^x%kXdIri8B|hgj0T=RCV%f zr-AcvC}RYkm>0zb5`*o55V9N&L^tT9?caF#e%Gx@2)LdmT>o9V)z)FQ-iY~Q9y;S3 z^&G!~$Sai_I&J(f_?XZT9CVCPV!h&&e;=Wd^N9a(Ss922_^TDSQg8+dKV!$u7PReETm-lTpKmg)^5$OxLmKPY! zm7+7gBaiJ|xGCEvOG|F@IzJ6~v$sSBN)lZSa>`j)Xwc*!hX>r41(2L9q|{U~ZWk}! z!WS_@wYIgXKyqQokr+T%tB|p5>}+~&uNeXOv@$oRcdP9QTQd5f|4ah|WfyOkEvdl+ z$usGc%R3zAJ#%d~C00CU5NQW3!QsAsKJHy#stR0%3o9SQ!f7xfYj*BL$&2;n8a8~#GtSZFcIi9v}wzrrQo zw)})hf4R;)pmg(0t3NPWX6Hu}@57XSf7Y6Ht0n5;qA(lx`YNsUHd^rE0GZo1{C_1} zdo+}57vJy97&FdjN@(1PG!>Csx~P#5A>EAVqH>uc6s279qB>HTh|2Qo);L)>hC>GF@VX#qn^8s3s%TVusbJ2hd`3+j`DYn zw$6MCZ~g$H3j|BbXkdH>rI-AqTKcojkzOY1k+^3n29nyB_|kP)$pfAAph=U~b2V`x zSNd%s{cEKUd(Mxa>@0Ou6AdSrA%;lkTrab*$l6d#0nK7ObX;(h$lPIc8)WcMF-_5>HAXn0sY@}B$NP9m#N z!FsAn9It&sZp7|KI-m~dKKp`8=RckBphy4gdt9t5u^VU;6e@c0|D3C%!rp4OE~W|5 zO4jp%nN#GcCb9M$(;vGcJyYKrC*I6b05;o8_%n%W`UffyOx@O7!vLC9l@;Ui(=wV^ z*`F7YkNZ$#)Xu>h2R*T?_B^=y?s0K9(kyxK(5x&u@y8oq2t7IZO9&ba))OTi22D!| zcJ=ps&7?f=OXXUA*2N8{%D5X_lMrRnSr%ih5fn7mJX2v>%ubhY6SP3!)v)p1XMkzv z_S(lAOfSq+gigjxwZs7*Vt65n__MAA8~C}Y>!7|m!ZLVB0F)F7nk#YPfncqzRR_dK zCsL*L#FWRvD@)GHmQ{B!EH}_X{t*d@e7@ss5 zeg`9Q-o|Jy^a*1yu2f1gUYRSG$LHj4zjV+{YWtrK#p;1%LAv#ij{c_h882SZ-nY+q zpEHL-9M3{KzciR~=jc5yb=L%mNOPQMk_Vd8u~E;z<7gpl%@RFS{i22$wY7UM@p z^+{Oki}IQhd2AIy)bxS<6Rh3f`gD^vyikC9$++KTfDt}wgCh-o2Ps7jnihJ>L(e|8 zSJ=*XwIeZ8eRnQymPC~-Zrqols%+4(v$m(9^lhc)gT#g?gXy- zPX9rvNztsQs!KhPCv*igrn3+zF=!^{ zQUC|mL1QGr9vZnggTi7kh{o`7b#&5qJ)4YL{MJHPP4Zpp&_XbhVQDqjkyOz>uV$QR2(NXf!s$bBqKFH>*UAQ`ac!U()nm!DtK? zG6gSrobOv0k|0;+on)E2(db@q<)=R zXOnGjHk>vQ1_hIIIK?}e>ldj!dTb|nMI;*szRe2Gf*kMJ3-S>5)t>2Ut~F${cuhBv z^{W#2GXA4DCy0I(nDyN2|3>TktQwjqtB;@H@ae@pLn74{i`3JRKZ843g4IAx$8?Xf zSIXC5GYsQZ&Dnb0Aj445rHwDW$>`mFovmw~jA_e8TpSUR)K!?W_)xPVn7x(;yRsVO zUCht{QVf@k&bxu0IHC>`!N}%(Sui5{X!vLB4w`$LteS*Aoqnc&GCn-~mtdOLyQJ9H z(9*v@HK>gw*^nE~NvFB@WK~-tipW_aG?m^}RX_5AZ{3~drQKtukeCuzN?vx}U&r#Z z=3t|K)L$S#u-@}_%ws2Pk98dHS_;-1d?Jr{j?Hd&RKwmpPb{#YqGf#*+aR=0>>H32 zz^zh1%QS9kmRerj7gS5Cn75_Gd_T2Zl&rrBIjeHVW^TnA|3Id&g8-U3rpE~PrhDym zbia|8BBFs*@2mTR5%|7#!Z+YI4!65SU#{nCy|5Wa_Uf3vg0r&1eru(LrcC4fMQZV_ z*A4{bAi_177B|v&YP=wzJB}!T0e<@sm{2pwELT|-hd{pgjghcyB0Qzpvl7hk5rFB@`2)R^t6Jaf< zwQE3QOOa=7C5d(PXdj26yIVa6$76-7f0s~~N3qJU0~tt-)*hxF+a%QH<&^%^$CJUm ziL;i!Rz%*Navn(Z7&(~JIp)QSIw$4~Bcext7gEO6Gxu10Vb_!DIV#zo<{XuEttRpb l6CTeiY`)1(()34V$kxH-b=>