diff --git a/.travis.yml b/.travis.yml index 6eb8961a07f..7b90bccd36f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ sudo: false env: global: - BYOND_MAJOR="509" - - BYOND_MINOR="1317" + - BYOND_MINOR="1319" - NODE_VERSION="4" matrix: - DM_MAPFILE="tgstation2" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bf96cb874db..dab56f4a2f2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -208,6 +208,48 @@ This prevents nesting levels from getting deeper then they need to be. Math operators like +, -, /, *, etc are up in the air, just choose which version looks more readable. +###Dream Maker Quirks/Tricks: +Like all languages, Dream Maker has its quirks, some of them are beneficial to us, like these + +* In-To for loops: ```for(var/i = 1, i <= some_value, i++)``` is a fairly standard way to write an incremental for loop in most languages (especially those in the C family) however DM's ```for(var/i in 1 to some_value)``` syntax is oddly faster than its implementation of the former syntax; where possible it's advised to use DM's syntax. (Note, the ```to``` keyword is inclusive, so it automatically defaults to replacing ```<=```, if you want ```<``` then you should write it as ```1 to some_value-1```). + +* Istypeless for loops: a name for a differing syntax for writing for-each style loops in DM, however it is NOT DM's standard syntax hence why this is considered a quirk. Take a look at this: +``` +var/list/bag_of_items = list(sword, apple, coinpouch, sword, sword) +var/obj/item/sword/best_sword = null +for(var/obj/item/sword/S in bag_of_items) + if(!best_sword || S.damage > best_sword.damage) + best_sword = S +``` +The above is a simple proc for checking all swords in a container and returning the one with the highest damage, it uses DM's standard syntax for a for loop, it does this by specifying a type in the variable of the for header which byond interprets as a type to filter by, it performs this filter using ```istype()``` (or some internal-magic similar to ```istype()```, I wouldn't put it past byond), the above example is fine with the data currently contained in ```bag_of_items```, however if ```bag_of_items``` contained ONLY swords, or only SUBTYPES of swords, then the above is inefficient, for example: +``` +var/list/bag_of_swords = list(sword, sword, sword, sword) +var/obj/item/sword/best_sword = null +for(var/obj/item/sword/S in bag_of_items) + if(!best_sword || S.damage > best_sword.damage) + best_sword = S +``` +specifies a type for DM to filter by, with the previous example that's perfectly fine, we only want swords, but here the bag only contains swords? is DM still going to try to filter because we gave it a type to filter by? YES, and here comes the inefficiency. Whereever a list (or other container, such as an atom (in which case you're technically accessing their special contents list but I digress)) contains datums of the same datatype or subtypes of the datatype you require for your for body +you can circumvent DM's filtering and automatic ```istype()``` checks by writing the loop as such: +``` +var/list/bag_of_swords = list(sword, sword, sword, sword) +var/obj/item/sword/best_sword = null +for(var/s in bag_of_items) + var/obj/item/sword/S = s + if(!best_sword || S.damage > best_sword.damage) + best_sword = S +``` +Of course, if the list contains data of a mixed type then the above optimisation is DANGEROUS, as it will blindly typecast all data in the list as the specified type, even if it isn't really that type! which will cause runtime errors. + +* Dot variable: like other languages in the C family, Dream maker has a ```.``` or "Dot" operator, used for accessing variables/members/functions of an object instance. +eg: +``` +var/mob/living/carbon/human/H = YOU_THE_READER +H.gib() +``` +however DM also has a dot variable, accessed just as ```.``` on it's own, defaulting to a value of null, now what's special about the dot operator is that it is automatically returned (as in the ```return``` statment) at the end of a proc, provided the proc does not already manually return (```return count``` for example). Why is this special? well the ```return``` statement should ideally be free from overhead (functionally free, of course nothing's free) but DM fails to fulfill this, DM's return statement is actually fairly costly for what it does and for what it's used for. +With ```.``` being everpresent in every proc can we use it as a temporary variable? Of course we can! However the ```.``` operator cannot replace a typecasted variable, it can hold data any other var in DM can, it just can't be accessed as one, however the ```.``` operator is compatible with a few operators that look weird but work perfectly fine, such as: ```.++``` for incrementing ```.'s``` value, or ```.[1]``` for accessing the first element of ```.``` (provided it's a list). + ##Pull Request Process There is no strict process when it comes to merging pull requests, pull requests will sometimes take a while before they are looked at by a maintainer, the bigger the change the more time it will take before they are accepted into the code. Every team member is a volunteer who is giving up their own time to help maintain and contribute, so please be nice. Here are some helpful ways to make it easier for you and for the maintainer when making a pull request. diff --git a/README.md b/README.md index d7e17e395b8..7e086f035ab 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,9 @@ Please see [CONTRIBUTING.md](CONTRIBUTING.md) All code after commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST (https://github.com/tgstation/-tg-station/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under GNU AGPL v3 (http://www.gnu.org/licenses/agpl-3.0.html). All code before commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST (https://github.com/tgstation/-tg-station/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under GNU GPL v3 (https://www.gnu.org/licenses/gpl-3.0.html). +(Including tools unless their readme specifies otherwise.) + +See LICENSE-AGPLv3.txt and LICENSE-GPLv3.txt for more details. -including tools unless their readme specifies otherwise. See LICENSE-AGPLv3.txt and LICENSE-GPLv3.txt for more details. All content including icons and sound is under a Creative Commons 3.0 BY-SA license (http://creativecommons.org/licenses/by-sa/3.0/). diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index 6819b565f6e..c1673e47528 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -43,8 +43,8 @@ "aQ" = (/obj/machinery/gateway{dir = 1},/turf/simulated/floor/plasteel/bot{baseturf = /turf/simulated/floor/plating/asteroid/snow},/area/awaymission/snowdin/base) "aR" = (/obj/structure/closet/crate,/obj/item/weapon/survivalcapsule,/obj/item/clothing/gloves/color/black,/obj/item/clothing/gloves/color/black,/obj/item/clothing/suit/hooded/wintercoat,/obj/item/clothing/suit/hooded/wintercoat,/obj/item/clothing/shoes/winterboots,/obj/item/clothing/shoes/winterboots,/turf/simulated/floor/plasteel/bot{baseturf = /turf/simulated/floor/plating/asteroid/snow},/area/awaymission/snowdin/base) "aS" = (/obj/structure/closet/crate,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/pill_bottle/stimulant,/turf/simulated/floor/plasteel/bot{baseturf = /turf/simulated/floor/plating/asteroid/snow},/area/awaymission/snowdin/base) -"aT" = (/turf/simulated/floor/plating,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/snowed,/area/awaymission/snowdin/post) -"aU" = (/turf/simulated/floor/plating,/turf/simulated/floor/plating/snowed,/area/awaymission/snowdin) +"aT" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/snowed,/area/awaymission/snowdin/post) +"aU" = (/turf/space,/area/awaymission/snowdin) "aV" = (/obj/structure/flora/bush,/turf/simulated/floor/plating/asteroid/snow,/area/awaymission/snowdin) "aW" = (/obj/structure/flora/tree/pine,/turf/simulated/floor/plating/asteroid/snow,/area/awaymission/snowdin) "aX" = (/mob/living/simple_animal/hostile/skeleton/eskimo,/turf/simulated/floor/plating/asteroid/snow,/area/awaymission/snowdin) @@ -214,12 +214,12 @@ "ef" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile/ice,/turf/simulated/floor/plating{baseturf = /turf/simulated/floor/plating/asteroid/snow; icon = 'icons/turf/snow.dmi'; temperature = 140},/area/awaymission/snowdin/post) "eg" = (/obj/machinery/light/small,/turf/simulated/floor/plating{baseturf = /turf/simulated/floor/plating/asteroid/snow; icon = 'icons/turf/snow.dmi'; temperature = 140},/area/awaymission/snowdin/post) "eh" = (/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) -"ei" = (/obj/effect/spider/stickyweb,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) -"ej" = (/mob/living/simple_animal/hostile/poison/giant_spider/hunter/ice,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) -"ek" = (/turf/simulated/floor/plating,/mob/living/simple_animal/hostile/bear/snow,/turf/simulated/floor/plating/snowed,/area/awaymission/snowdin) -"el" = (/mob/living/simple_animal/hostile/poison/giant_spider/nurse/ice,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) +"ei" = (/mob/living/simple_animal/hostile/poison/giant_spider/hunter/ice,/turf/simulated/floor/plating/asteroid/snow{temperature = 140},/area/awaymission/snowdin/dungeon1) +"ej" = (/mob/living/simple_animal/hostile/poison/giant_spider/nurse/ice,/turf/simulated/floor/plating/asteroid/snow{temperature = 140},/area/awaymission/snowdin/dungeon1) +"ek" = (/obj/effect/spider/stickyweb,/obj/effect/spider/stickyweb,/turf/simulated/floor/plating/asteroid/snow{temperature = 140},/area/awaymission/snowdin/dungeon1) +"el" = (/obj/effect/spider/stickyweb,/obj/effect/spawner/lootdrop/snowdin/dungeonheavy,/turf/simulated/floor/plating/asteroid/snow{temperature = 140},/area/awaymission/snowdin/dungeon1) "em" = (/obj/effect/spider/stickyweb,/mob/living/simple_animal/hostile/poison/giant_spider/hunter/ice,/turf/simulated/wall/mineral/snow,/area/awaymission/snowdin/dungeon1) -"en" = (/obj/effect/spider/stickyweb,/obj/effect/spider/stickyweb,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) +"en" = (/obj/effect/spider/stickyweb,/mob/living/simple_animal/hostile/poison/giant_spider/nurse/ice,/turf/simulated/floor/plating/asteroid/snow{temperature = 140},/area/awaymission/snowdin/dungeon1) "eo" = (/obj/effect/spider/stickyweb,/turf/simulated/floor/plating/ice/colder,/area/awaymission/snowdin/dungeon1) "ep" = (/obj/effect/spider/stickyweb,/turf/simulated/floor/plating/asteroid/snow{temperature = 140},/area/awaymission/snowdin/dungeon1) "eq" = (/turf/simulated/wall/mineral/snow,/area/awaymission/snowdin/dungeon1) @@ -228,13 +228,13 @@ "et" = (/obj/structure/table/wood,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) "eu" = (/obj/structure/table/wood,/obj/effect/spawner/lootdrop/snowdin/dungeonlite,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) "ev" = (/obj/structure/barricade/wooden,/turf/simulated/floor/plating/asteroid/snow{temperature = 140},/area/awaymission/snowdin/dungeon1) -"ew" = (/mob/living/simple_animal/hostile/skeleton/ice,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) -"ex" = (/obj/effect/spider/stickyweb,/obj/structure/barricade/wooden,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) +"ew" = (/obj/effect/spider/stickyweb,/mob/living/simple_animal/hostile/poison/giant_spider/hunter/ice,/turf/simulated/floor/plating/asteroid/snow{temperature = 140},/area/awaymission/snowdin/dungeon1) +"ex" = (/mob/living/simple_animal/hostile/skeleton,/turf/simulated/floor/plating/asteroid/snow{temperature = 140},/area/awaymission/snowdin/dungeon1) "ey" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/snowdin/dungeonlite,/obj/effect/spawner/lootdrop/snowdin/dungeonlite,/obj/effect/spawner/lootdrop/snowdin/dungeonlite,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) -"ez" = (/mob/living/simple_animal/hostile/skeleton/eskimo,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) +"ez" = (/turf/space,/turf/simulated/floor/plating/snowed,/area/awaymission/snowdin/post) "eA" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/snowdin/dungeonlite,/obj/effect/spawner/lootdrop/snowdin/dungeonheavy,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) "eB" = (/obj/structure/table/wood,/obj/effect/spawner/lootdrop/snowdin/dungeonmisc,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) -"eC" = (/obj/effect/spider/stickyweb,/obj/effect/spawner/lootdrop/snowdin/dungeonheavy,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) +"eC" = (/turf/simulated/floor/plating/snowed,/area/awaymission/snowdin/post) "eD" = (/turf/simulated/wall/ice{baseturf = /turf/simulated/floor/plating/asteroid/snow},/area/awaymission/snowdin/dungeon1) "eE" = (/obj/structure/table/wood,/obj/effect/spawner/lootdrop/snowdin/dungeonmid,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) "eF" = (/obj/structure/barricade/wooden,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) @@ -242,13 +242,13 @@ "eH" = (/obj/structure/flora/rock/pile/icy,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) "eI" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/snowdin/dungeonmid,/obj/effect/spawner/lootdrop/snowdin/dungeonmid,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) "eJ" = (/obj/structure/barricade/wooden,/turf/simulated/floor/plating/ice/colder,/area/awaymission/snowdin/dungeon1) -"eK" = (/obj/effect/spawner/lootdrop/snowdin/dungeonheavy,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) -"eL" = (/obj/effect/spider/stickyweb,/mob/living/simple_animal/hostile/poison/giant_spider/nurse/ice,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) -"eM" = (/obj/effect/spider/stickyweb,/mob/living/simple_animal/hostile/poison/giant_spider/hunter/ice,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) +"eK" = (/turf/space,/obj/structure/girder,/turf/simulated/floor/plating/snowed,/area/awaymission/snowdin/post) +"eL" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/space,/area/awaymission/snowdin/post) +"eM" = (/mob/living/simple_animal/hostile/skeleton/eskimo,/turf/simulated/floor/plasteel/darkbrown{baseturf = /turf/simulated/floor/plating/asteroid/snow; temperature = 180},/area/awaymission/snowdin/post) "eN" = (/obj/structure/table/wood,/obj/effect/spawner/lootdrop/snowdin/dungeonlite,/obj/effect/spawner/lootdrop/snowdin/dungeonlite,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) "eO" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/snowdin/dungeonmid,/obj/effect/spawner/lootdrop/snowdin/dungeonlite,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) "eP" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/snowdin/dungeonmid,/obj/effect/spawner/lootdrop/snowdin/dungeonlite,/obj/effect/spawner/lootdrop/snowdin/dungeonlite,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) -"eQ" = (/mob/living/simple_animal/hostile/skeleton,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) +"eQ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/weapon/surgicaldrill,/obj/item/weapon/hemostat,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/cautery{pixel_x = 4},/turf/simulated/floor/plasteel/whiteblue{baseturf = /turf/simulated/floor/plating/asteroid/snow},/area/awaymission/snowdin/sekret) "eR" = (/turf/indestructible/rock/snow,/area/awaymission/snowdin/cave) "eS" = (/turf/simulated/floor/plating/asteroid/snow,/area/awaymission/snowdin/cave) "eT" = (/turf/simulated/floor/plating/ice,/area/awaymission/snowdin/cave) @@ -321,7 +321,6 @@ "gi" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/snowdin/dungeonmid,/obj/effect/spawner/lootdrop/snowdin/dungeonmid,/obj/effect/spawner/lootdrop/snowdin/dungeonmisc,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) "gj" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/snowdin/dungeonmid,/obj/effect/spawner/lootdrop/snowdin/dungeonmid,/obj/effect/spawner/lootdrop/snowdin/dungeonlite,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) "gk" = (/obj/structure/barricade/wooden,/turf/simulated/floor/plating/asteroid/basalt{temperature = 140},/area/awaymission/snowdin/dungeon1) -"gl" = (/mob/living/simple_animal/hostile/bear/snow,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) "gm" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/snowdin/dungeonmid,/obj/effect/spawner/lootdrop/snowdin/dungeonmisc,/obj/effect/spawner/lootdrop/snowdin/dungeonlite,/obj/effect/spawner/lootdrop/snowdin/dungeonlite,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) "gn" = (/obj/effect/bump_teleporter{id = "up"; id_target = "down"},/turf/simulated/floor/plasteel/stairs/left{baseturf = /turf/simulated/floor/plating/asteroid/snow; temperature = 140},/area/awaymission/snowdin/cave) "go" = (/obj/effect/bump_teleporter{id = "up"; id_target = "down"},/turf/simulated/floor/plasteel/stairs/right{baseturf = /turf/simulated/floor/plating/asteroid/snow; temperature = 140},/area/awaymission/snowdin/cave) @@ -333,7 +332,6 @@ "gu" = (/obj/item/weapon/stock_parts/cell/high/empty,/turf/simulated/floor/plating{baseturf = /turf/simulated/floor/plating/asteroid/snow},/area/awaymission/snowdin/post) "gv" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/plating{baseturf = /turf/simulated/floor/plating/asteroid/snow},/area/awaymission/snowdin/post) "gw" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor/plating{baseturf = /turf/simulated/floor/plating/asteroid/snow},/area/awaymission/snowdin/post) -"gx" = (/turf/simulated/floor/plating,/mob/living/simple_animal/hostile/skeleton/eskimo,/turf/simulated/floor/plating/snowed,/area/awaymission/snowdin/post) "gy" = (/obj/structure/table,/turf/simulated/floor/plasteel/darkbrown{baseturf = /turf/simulated/floor/plating/asteroid/snow; temperature = 180},/area/awaymission/snowdin/post) "gz" = (/turf/simulated/floor/plasteel/darkbrown{baseturf = /turf/simulated/floor/plating/asteroid/snow; temperature = 180},/area/awaymission/snowdin/post) "gA" = (/obj/structure/closet/secure_closet{anchored = 1; name = "Contraband Locker"; req_access_txt = "3"},/obj/item/weapon/gun/projectile/automatic/speargun,/obj/item/weapon/twohanded/spear,/obj/item/weapon/twohanded/spear,/obj/item/weapon/twohanded/spear,/turf/simulated/floor/plating{baseturf = /turf/simulated/floor/plating/asteroid/snow},/area/awaymission/snowdin/post) @@ -408,7 +406,6 @@ "hR" = (/obj/effect/spawner/lootdrop/snowdin/dungeonlite,/turf/simulated/floor/plating/asteroid/snow,/area/awaymission/snowdin/cave) "hS" = (/obj/structure/table/wood,/obj/effect/spawner/lootdrop/snowdin/dungeonmid,/obj/effect/spawner/lootdrop/snowdin/dungeonmid,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) "hT" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/snowdin/dungeonlite,/turf/simulated/floor/plating/snowed/colder,/area/awaymission/snowdin/dungeon1) -"hU" = (/mob/living/simple_animal/hostile/skeleton/ice,/turf/simulated/floor/plating{baseturf = /turf/simulated/floor/plating/asteroid/snow; icon = 'icons/turf/snow.dmi'; temperature = 140},/area/awaymission/snowdin/post) "hV" = (/turf/simulated/wall/r_wall{baseturf = /turf/simulated/floor/plating/asteroid/snow},/area/awaymission/snowdin/sekret) "hW" = (/obj/structure/closet/emcloset,/obj/item/weapon/tank/internals/emergency_oxygen/engi,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating{baseturf = /turf/simulated/floor/plating/asteroid/snow},/area/awaymission/snowdin/sekret) "hX" = (/obj/machinery/space_heater,/turf/simulated/floor/plating{baseturf = /turf/simulated/floor/plating/asteroid/snow},/area/awaymission/snowdin/sekret) @@ -459,7 +456,6 @@ "iQ" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile/ice,/turf/simulated/floor/plating{baseturf = /turf/simulated/floor/plating/asteroid/snow; icon = 'icons/turf/snow.dmi'; temperature = 140},/area/awaymission/snowdin/sekret) "iR" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{baseturf = /turf/simulated/floor/plating/asteroid/snow; wet = 0},/area/awaymission/snowdin/sekret) "iS" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel/cmo{baseturf = /turf/simulated/floor/plating/asteroid/snow},/area/awaymission/snowdin/sekret) -"iT" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/obj/item/weapon/surgicaldrill,/obj/item/weapon/hemostat,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/circular_saw,/obj/item/weapon/retractor,/obj/item/weapon/cautery{pixel_x = 4},/turf/simulated/floor/plasteel/whiteblue{baseturf = /turf/simulated/floor/plating/asteroid/snow},/area/awaymission/snowdin/sekret) "iU" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel/whiteblue{baseturf = /turf/simulated/floor/plating/asteroid/snow},/area/awaymission/snowdin/sekret) "iV" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plasteel/whiteblue{baseturf = /turf/simulated/floor/plating/asteroid/snow},/area/awaymission/snowdin/sekret) "iW" = (/obj/structure/sign/bluecross{pixel_x = -32},/turf/simulated/floor/plasteel{baseturf = /turf/simulated/floor/plating/asteroid/snow; wet = 0},/area/awaymission/snowdin/sekret) @@ -737,115 +733,115 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacac aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacalaxawayalacacacacacacacacacacacacacadazazazazadadaAadacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacalaCaBaEaDalalalalalalaFacacacacacacaGacacacacacamaoamacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacalalaDaIaHaJaIaIaIaKaIaIaIaIaFacacacacacacacacacacacadaAadacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafacacacacacacacacacacaLacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaFalaMaMaDaIaNaJaOaQaPaIaRaIaSaIaIaFacacacacacacacacacacaTaUaGacacacacacacacacacacacacacacacacaVacafafafafafafafafafafafafacacacaWacacacacacacaLacaXacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacaWacacacacacaFaFaYaZaZaZbaaIaIaJbbbdbcaIbeaIbfaIbgalacacacacacacacacacacaUaUacacacacacacacacacacacacacacacacacacacafafafafafafafafafafacacacaWacacacaWacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacalbibhbjaZaZbkblaDbmaIaJbnbpboaIbqaIbeaIbralacacacacacacacacacaUaUaUacaWacacacacacacacacacacacacacacacacacafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacalbsbkaZaZaZbkaZbtaDbvbubxbwbybwbwaIaIbzaIbAalacacacacacacacacacaUaUacacacacacacacacacacacacacacacacacacacacafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacalbBaZbCbEbDbGbFblaDbvbHbJbIbLbKbwaIaIaIaIaIalacacacacacacacacaUaUaUacbMacacacacacacacacacacacacacacacacacafafafafafafafafafafafacacacacacacacacaWacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacalaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDbNaDaDaDalacacacacacacacacaUaUacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacalbObQbPaDbRbTbSbUaDbVbPaDbWbYbXbZaDcbcaccccalacacacacacacacacaUaUacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafacacacaLacacacacacacacacacacacacaWacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacalcdcebVaDbUbUbUbUcfcecgaDchchcichaDcbcbckcjaFacacacacacacacacaUaUacacacacacacacacacacacacacaWacacacacacacafafafafafafafafafafafacacacacacacacacacacacacacacaWacacacaWacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaWacacacacacacacacacacacacacalaDcfaDaDbUclbUbUaDcdbOaDchchchchaDcmcbcbcnaFacacacacacacacacaUaUacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaWacacacacacacacacacaFbUcpcoclcqcrbUbUaDaDaDaDchchchchcsckcbcbctaFacacacacacacacaUaUaUacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaFbUbUbUbUcucvclbUaDcxcwaDchchchchaDcmcbcbcyaFacacacacacacacaUaUacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacaLaLacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaWacacacacacaWacacacacacaFbUbUbUbUclbUcpcAczcCcBaDchchcDchaDcbcbcbcEaFacacacacacacacaUaUacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacaLacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaFbUbUbUbUcpbUcFbUaDcdbOaDcGbZbXbYaDcbcHcIcIalacacacacacacacaUaUacacacacaVacacacacacacacacacacacacacafafafafafafafafafafafafafacacacacacacacacacacaWacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaWacacacacacacacacalaDaDaDcJaDaDaDaDaDaDaDaDaDaDaDaDaDbNaDaDaDalacacacacacacacaUaUacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafacacacacacacacacaWacacacaWacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacalaIaKaIaIaIaIaIaIaIaIaIaKaIaIaIaIaIaIaIaKaIalacacacacacacaUaUaUacacacacacacaWacacacacacacacacacacacafafafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacalaIaIaIcKcKaIcKaIaIaIaIaIaIaIaIaIaIaIaIaIaIalacacacacacacaUaUacacacacacacacacacacacaWacacacacacacafafafafafafafafafafafafafafacacacacacacacacacacacacaLaLaLacacacacaWacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaVacacacacacacacacacacalalaFaFaFaFaFaFalalaDcLaDcLaDalalalalalalalalacacacacacacaUaUacaWacacacacacacacacacacacacacacacacafafafafafafafafafafafafafafacacacacacacacacacacacacaLaLacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaFaZbiaZaFacacacacacacacacacacacacacacaUaUacacacacacacacacacaWacacacacacafafafafafafafafafafafafafafafafafacacacacacbMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaFaZbiaZaFacacacacacacacacacacacacacacaUaUacacacacacacacacacacacacacacacafafafafafafafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacacacacacaWacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacalcLalcLalacacacacacacacacacacacacacacaUaUaUacacacacacacacacacacacaWacafafafafafafafafafafafafafafafafafacacacacacacaLaLaLaLacaccMacacacaccPcPcPcPcPacacacacaWacacacaWacacacacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacaVacaccOaUaUaUcOacacacacacacacacacacacaWacacaccQaUaUacacacacacacacacacacacacafafafafafafafafafafafafafafafafafacacacacacacaLaLaLaLacacacacacaccPcPcScRcTcPcPacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacaWacacacacacacacacacacacaccMacacacacacacaUaUaUacacacacacacacacacacacacacacacacaWaUaUacacacacacacacacacacacacafafafafafafafafafafafafacacacacacacacacacacacacacaLaLaLaLaLaccPcPcPcRcUcRcRcRcPacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacaccVacacacacacacaUaUaUaUacacacacacacacaWacacacacacacacacaUaUacacacacacacacacacacacafafafafafafafafafafafafafacacacacacacacacacacacacacaLaLaLaLaLaccWcRcRcRcRcRcRcXcPacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcYcZcZcYcYcZcYadcYcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacaccMcVdacVcMacacacaUaUaUaUaUacacacacacacacacacacacacacaWacacaUaUaUacacacacacbMacacacacafafafafafafafafafafafacacacacacacacbMacacacacacacacacacaLaLaLaLcPcPcPdbcRdccRcRcPacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNaddddfdededgdedhadcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacaccVacacacacacaUaUaUaUaUacacacacacacacacacacacacacacacacacaUaUacacacacacacacacacacafafafafafafafafafafafacacacacacacacacacacacacacaVacacacaLaLaLaLacaccPcPcRcRdicPcPacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcYdjdgdedfdfdfdkcYcYadadadcNdldldldldldldmdldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaacacacacacacacacacacaWacacacacacacacacacacacacacaccMacacacacacaUaUaUaUaUacacacacacacacacacacacacacacacacaWaUaUacacacacacacaUaUaUaUafafafafafafafafafafafacacacacacacbMacacbMacacacacacacacaLaLaLaLacacaccPcPcPcPcPacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcYdgdfdedfaddfdedeaddfdfdnaddldldldocNcNcNcNdldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacaWacacacacacacacacacacacacacacacacaUaUaUaUaUaUaUaUacacacacacacacacacacacacacacaUaUaUaUaUaUaUaUaUaUaUdpdpafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNaddfdededfaddfdedgdfdfdfadaddlcNcNcNcNcNcNcNcNcNcNcNdldldldodldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaacacacacacaLaLacacacacacacacacacacacacacacacacacacacacacacacacaUaUaUaUaUaUaUaUaUaUaUaUaUacacacacacacaUaUaUaUaUaUaUaUaUaUaUaUaUaUdpdpdpafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaLaLacacaWacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcZdededgdfdfdfdfdfdfdgadaddldlcNcNcNcNcNcNcNcNcNcNcNdldldldldqdqdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaacacacacaLaLaLaLacacacacaWacacacacacacacacacacacacacacacacacacaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUdpdpdpdpafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaLacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcZdrdfdfdfdfdtdsaddgduaddldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaacacaLaLaLaLaLaLacacacacacacacacacacacacacacaWacacacacacacacacaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUdpdpafafafafafafafafafacacacacacacacacacacacaWacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcYdrdfadadaddfdgaddvdwaddldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNcNcNcNcNcNcNdxdxdydydycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaacacaLaLaLaLaLaLacacacacacacacaWacacacacacacacacacacaWacacacdzdzdzdzdzdzdzdzaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUacacacacacafdpdpafafafafafafafafacacacacacacaWacacacacacacacacacacacacacacacacacacacacacacacacacacaLacacacbMacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcYaddfdfdfdAdfdfdgdvdwdwdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNcNcNcNcNcNcNcNcNdydxdxdxdydydxdxdycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaacacaLaLaLaLaLacacacacacacacacacacacaWacacacacacacacacacacacdzdzdzdzdzacacacaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUacacacacacacacafafafdpdpafafdpafafafafacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYcYdedBdfdfdCadadaddwdldldlcNcNcNcNcNcNcNcNdDdDdDdDcNcNcNcNcNdldlcNcNcNcNcNcNcNcNcNdydydxdxdydxdxdxdydldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaFalaMaMaDaIaNaJaOaQaPaIaRaIaSaIaIaFacacacacacacacacacacaTdzaGacacacacacacacacacacacacacacacacaVacafafafafafafafafafafafafacacacaWacacacacacacaLacaXacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacaWacacacacacaFaFaYaZaZaZbaaIaIaJbbbdbcaIbeaIbfaIbgalacacacacacacacacacacdzdzacacacacacacacacacacacacacacacacacacacafafafafafafafafafafacacacaWacacacaWacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacalbibhbjaZaZbkblaDbmaIaJbnbpboaIbqaIbeaIbralacacacacacacacacacdzdzdzacaWacacacacacacacacacacacacacacacacacafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacalbsbkaZaZaZbkaZbtaDbvbubxbwbybwbwaIaIbzaIbAalacacacacacacacacacdzdzacacacacacacacacacacacacacacacacacacacacafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacalbBaZbCbEbDbGbFblaDbvbHbJbIbLbKbwaIaIaIaIaIalacacacacacacacacdzdzdzacbMacacacacacacacacacacacacacacacacacafafafafafafafafafafafacacacacacacacacaWacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacalaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDbNaDaDaDalacacacacacacacacdzdzacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacalbObQbPaDbRbTbSbUaDbVbPaDbWbYbXbZaDcbcaccccalacacacacacacacacdzdzacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafacacacaLacacacacacacacacacacacacaWacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacalcdcebVaDbUbUbUbUcfcecgaDchchcichaDcbcbckcjaFacacacacacacacacdzdzacacacacacacacacacacacacacaWacacacacacacafafafafafafafafafafafacacacacacacacacacacacacacacaWacacacaWacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaWacacacacacacacacacacacacacalaDcfaDaDbUclbUbUaDcdbOaDchchchchaDcmcbcbcnaFacacacacacacacacdzdzacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaWacacacacacacacacacaFbUcpcoclcqcrbUbUaDaDaDaDchchchchcsckcbcbctaFacacacacacacacdzdzdzacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaFbUbUbUbUcucvclbUaDcxcwaDchchchchaDcmcbcbcyaFacacacacacacacdzdzacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacaLaLacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaWacacacacacaWacacacacacaFbUbUbUbUclbUcpcAczcCcBaDchchcDchaDcbcbcbcEaFacacacacacacacdzdzacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacaLacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaFbUbUbUbUcpbUcFbUaDcdbOaDcGbZbXbYaDcbcHcIcIalacacacacacacacdzdzacacacacaVacacacacacacacacacacacacacafafafafafafafafafafafafafacacacacacacacacacacaWacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaWacacacacacacacacalaDaDaDcJaDaDaDaDaDaDaDaDaDaDaDaDaDbNaDaDaDalacacacacacacacdzdzacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafacacacacacacacacaWacacacaWacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacalaIaKaIaIaIaIaIaIaIaIaIaKaIaIaIaIaIaIaIaKaIalacacacacacacdzdzdzacacacacacacaWacacacacacacacacacacacafafafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacalaIaIaIcKcKaIcKaIaIaIaIaIaIaIaIaIaIaIaIaIaIalacacacacacacdzdzacacacacacacacacacacacaWacacacacacacafafafafafafafafafafafafafafacacacacacacacacacacacacaLaLaLacacacacaWacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaVacacacacacacacacacacalalaFaFaFaFaFaFalalaDcLaDcLaDalalalalalalalalacacacacacacdzdzacaWacacacacacacacacacacacacacacacacafafafafafafafafafafafafafafacacacacacacacacacacacacaLaLacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaFaZbiaZaFacacacacacacacacacacacacacacdzdzacacacacacacacacacaWacacacacacafafafafafafafafafafafafafafafafafacacacacacbMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaFaZbiaZaFacacacacacacacacacacacacacacdzdzacacacacacacacacacacacacacacacafafafafafafafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacacacacacaWacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacalcLalcLalacacacacacacacacacacacacacacdzdzdzacacacacacacacacacacacaWacafafafafafafafafafafafafafafafafafacacacacacacaLaLaLaLacaccMacacacaccPcPcPcPcPacacacacaWacacacaWacacacacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacaVacaccOdzdzdzcOacacacacacacacacacacacaWacacacaUdzdzacacacacacacacacacacacacafafafafafafafafafafafafafafafafafacacacacacacaLaLaLaLacacacacacaccPcPcScRcTcPcPacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacaWacacacacacacacacacacacaccMacacacacacacdzdzdzacacacacacacacacacacacacacacacacaWdzdzacacacacacacacacacacacacafafafafafafafafafafafafacacacacacacacacacacacacacaLaLaLaLaLaccPcPcPcRcUcRcRcRcPacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacaccVacacacacacacdzdzdzdzacacacacacacacaWacacacacacacacacdzdzacacacacacacacacacacacafafafafafafafafafafafafafacacacacacacacacacacacacacaLaLaLaLaLaccWcRcRcRcRcRcRcXcPacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcYcZcZcYcYcZcYadcYcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacaccMcVdacVcMacacacdzdzdzdzdzacacacacacacacacacacacacacaWacacdzdzdzacacacacacbMacacacacafafafafafafafafafafafacacacacacacacbMacacacacacacacacacaLaLaLaLcPcPcPdbcRdccRcRcPacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNaddddfdededgdedhadcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacaccVacacacacacdzdzdzdzdzacacacacacacacacacacacacacacacacacdzdzacacacacacacacacacacafafafafafafafafafafafacacacacacacacacacacacacacaVacacacaLaLaLaLacaccPcPcRcRdicPcPacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcYdjdgdedfdfdfdkcYcYadadadcNdldldldldldldmdldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaacacacacacacacacacacaWacacacacacacacacacacacacacaccMacacacacacdzdzdzdzdzacacacacacacacacacacacacacacacacaWdzdzacacacacacacdzdzdzdzafafafafafafafafafafafacacacacacacbMacacbMacacacacacacacaLaLaLaLacacaccPcPcPcPcPacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcYdgdfdedfaddfdedeaddfdfdnaddldldldocNcNcNcNdldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacaWacacacacacacacacacacacacacacacacdzdzdzdzdzdzdzdzacacacacacacacacacacacacacacdzdzdzdzdzdzdzdzdzdzdzdpdpafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNaddfdededfaddfdedgdfdfdfadaddlcNcNcNcNcNcNcNcNcNcNcNdldldldodldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaacacacacacaLaLacacacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzdzdzdzdzdzdzdzacacacacacacdzdzdzdzdzdzdzdzdzdzdzdzdzdzdpdpdpafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaLaLacacaWacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcZdededgdfdfdfdfdfdfdgadaddldlcNcNcNcNcNcNcNcNcNcNcNdldldldldqdqdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaacacacacaLaLaLaLacacacacaWacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdpdpdpdpafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaLacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcZdrdfdfdfdfdtdsaddgduaddldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaacacaLaLaLaLaLaLacacacacacacacacacacacacacacaWacacacacacacacacdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdpdpafafafafafafafafafacacacacacacacacacacacaWacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcYdrdfadadaddfdgaddvdwaddldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNcNcNcNcNcNcNdxdxdydydycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaacacaLaLaLaLaLaLacacacacacacacaWacacacacacacacacacacaWacacacdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzacacacacacafdpdpafafafafafafafafacacacacacacaWacacacacacacacacacacacacacacacacacacacacacacacacacacaLacacacbMacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcYaddfdfdfdAdfdfdgdvdwdwdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNcNcNcNcNcNcNcNcNdydxdxdxdydydxdxdycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaacacaLaLaLaLaLacacacacacacacacacacacaWacacacacacacacacacacacdzdzdzdzdzacacacdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzdzacacacacacacacafafafdpdpafafdpafafafafacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYcYdedBdfdfdCadadaddwdldldlcNcNcNcNcNcNcNcNdDdDdDdDcNcNcNcNcNdldlcNcNcNcNcNcNcNcNcNdydydxdxdydxdxdxdydldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacaWacacacacacdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacafafafafafafafdpdpafafafacacacaWacacacacacacacacacacacacacacacaWacacacacacacacacacacacacacacacacbMacacbMacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYcZdEdededfdCaddldldldldldldldldlcNcNdldmdDdDdDdDdDcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNdydydydydydxdxdydldqdldFdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacafafafafafafafafdpdpafafacacacacacacacacaWacacacaLacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYaddGdededHadaddldldmdldldldldqdlcNcNdldDdDdDdDdldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNdydydxdydydycNcNdldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacaWacacdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacafafafafafafafdpdpdpdpdpafacacacacacacacacacacacacacacacacaWacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYcZdedgcYdfaddldldldldldldldldldlcNcNdldDdDdDdDdldldldldldldldlcNcNcNcZcZcZcZcZcZcZcNdydxdxdydycNcNcNdldldDdDdDdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacafafafafafafafafdpdpdpdpdpacacacacacacacacacacacaLaLacacacacacacacacaWacacacacacaWacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYcZdIdeaddfaddldldldldodldldldldqdqdldldDdDdDdldldldldldldldlcNcNcNcNcZdJdKcZdMdLcZcNdxdxdycNcNcNcNcNdldldDdDdDdDdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafdpdpdpdpdpaUaUacacacacacacacacaLaLacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYcZdedeadadcYcNdldldldldldldldldqdqdldldDdDdDdldldldldldldldlcNcNcNcNcZdNdJdOdQdQdPdydydydldlcNcNdldldldDdDdDdDdDdDdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaWacacacacacacacacacacacacbMacacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafafdpdpdpdpaUaUacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYaddededRcZcYcNcNcNcNdldldldldldldldldldDdDdDdlcNdldldodldldlcNcNcNcNcZdSdUcZdQdPdTdydydldldlcNcNdldldmdDdDdDdDdDdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaWacacacacacacacacacacacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafafafdpdpdpaUaUaUaUaUacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYaddedgdecZcYcNcNcNcNdldldldldldldodldDdDdDdDdlcNdldldldmdldlcNcNcNcNcZcZcZcZdVcZcZcNcNdldldldldldqdldldDdDdldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzdzacacacacacacacacaWacacacacacacacacacacacafafafafafafafafafafafafafafafafafafaUaUaUaUaUaUaUaUacacacacacacdWacacacacacacacacacacacacacacacacacacacacacacacaLaLacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYcYcZdedecZcYcNcNcNcNdldqdldldldldldldDdDdDcNcNcNdldldldldldldldlcNcNcNcNcZajajajcZcNcNdqdldldldldldldldldldldlcNdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaWacacacacacacacacaLaLacacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafafafafafacaUaUaUaUaUaUaUaUaUacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaLacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYcYcZdedecZcYcNcNcNcNdldldldldldldldldDdDcNcNcNcNcNdldldldldldldldldldlcNcZajajdXcZcNcNdldldldlcNcNcNcNcNcNcNcNcNdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacaLaLaLaLaLacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafafafafafacacaUaUaUaUaUaUaUaUacacacacacacacacacacacacacacacacacacacacacacacacaVacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYcYcYdededYcZcNcNcNcNdldldldldqdldldldDdDcNcNcNcNcNdldldldldldldldlduadcYcZajajdZcZcNcNcNdldldlcNcNcNcNcNcNcNcNcNdldDcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaWacacacaLaLaLaLacacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafafafafafacacacacaUaUaUaUaUaUaUacacacacacacacacacacacacacacacbMacacbMacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYebeacYdedgcZcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldlecdfecajajdXcZcNcNcNdldldlcNcNcNcNcNcNcNcNcNdDdDcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacaLaLaLaLacacacacdzdzdzdzdzdzacacacbMacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafafafafacacacacacaUaUaUaUaUaUaUacacacacacaWacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYeeedcYdedecZcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldDdldldldlduadefcZcZcZcZcZcNcNcNdldldlcNcNcNcNcNcNcNcNcNdDdDcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacaLaLaLacacacacacdzdzdzdzdzdzacacacacacacacacacacaVacacacacacacacacacacafafafafafafafafafafafafafacacacacacacacacacaUaUaUaUaUaUacacacacacacacacacacdWacacacacacacbMacacbMacacacacacacacaWacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYdfdfdededecZcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldDdldldlcNcNcNcNcNcNcNcNcNdldlcNcNcNcNcNcNdldldDdDdDcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzacacbMacacbMacacacacacacacacacacacacacafafafafafafafafafafafafafafafacacacacacacacacacacaUaUaUaUacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcZdfegdfdfdecZcNcNcNcNehehehehehehehcNcNcNcNcNcNcNcNcNcNdldldldldldDdldldlcNcNcNcNcNcNcNdldldldldlcNcNcNcNcNdldldDdDcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafafafafafacacacacacacacacacacaUaUaUaUaUaUacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcZcZcZcZcZcZcZcNcNcNcNehehejeieieiehcNcNcNcNcNcNcNcNcNcNdldFdldldldDdldldldlcNcNdldldldldldldldldldldldldlcNdldDdDdDcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacbMacacacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafafafafafacacacacacacacacacacacacaUaUaUaUacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeheieieheieiehehcNcNcNcNcNcNcNcNcNcNdldldldldldDdDdDdldlcNcNdldldldmdldldldldldldldldldldldldDdDcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacafafafafafafafafafafafafafafafafafafafafacacacacbMacacacacacacekaUaUacaUacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeheieheheheheleheienemehcNcNcNdDeoesepdldqdqdldldDdDdldldldldldldldldldlcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNcNcNeqeqeqeqeqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacaWacacacacacacbMacacbMacacacdzdzdzdzdzdzacacacacacacacacacacacacacafafafafafafafafafafafafafafafafafafafafafafacacacacacacacacacacacacaUaUacacaUacacacacacacacacacaWacacacacacacacacacacacacacaLaLacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNejereicNcNeheheheieneiehcNcNcNdDeoesepdldqdqdldldDdDdldldldldldlcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNcNcNeqeheheteueqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzacacacacacaWacacafafafafafafafafafafafafafafafafafafafafafafafafafafafacacacbMacacbMacacacacacaUaUacacacacacacacacacacacacacacacacacacacacacacacacacacaLaLacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeheheheieicNcNcNcNehejeheqeheqdDdDeoeoevdldldldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNcNcNcNcNeqeqeqeheheheweheqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzacacacacacacacacacafafafafafafafafafafafafafafafafafafafafafafafafafafafacacacacacacacacacacacacaUaUacaUacacacacacacacaWacacacacacacacacacaWacacacacaLacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeheieieieicNcNcNcNehereierehexeodDeoeocNcNcNcNcNdldldldldldldmcNcNcNcNcNcNcNcNcNcNcNcNcNdldldmdlcNcNcNcNcNcNcNcNeqeyehehcNeheheqeqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzacacacacacacacacafafafafafafafafafafafafafafafafafafafafafafafafafafafafacacacacacacacacacacacacacaUacacacacacacacacacacacacacacaWacacacacacacacacacacacaLacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeherejehehcNcNcNcNeheiereieqexeodDepepcNcNcNcNcNdldldldDdDdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNeqehehewehehehehehcNeqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzdzacacacacacacacafafafafafafafafafafafafafafafafafafafafafafafafafafafafafacacacacacacacacacacacacacacacaUacacdWacacacacacaLacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeheieiehehehehcNcNcNcNcNcNcNcNdDdDdldlcNcNcNcNcNdldldldDdDdldlcNcNcNcNeqeqeqcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNeqehehehehehehezeheheqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacbMacacacacacacacacacacacacacacacacdzdzdzdzdzdzdzacacacacacacacafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacaLacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNehehehehehelehcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNeqeAeheheqcNcNcNcNcNcNcNdldodlcNcNcNcNcNeqeBeheheqeqeqeqeheheheqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzacacacacacacafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNejeieieieieCeiehcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdDdldydlcNcNcNcNeDeheqeheDcNcNcNcNcNcNcNdldldlcNcNcNcNcNeqeEehehdDdDdDeheqeheheqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacaVacacacacacacacacacacacdzdzdzdzdzdzacacacacacafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacaLacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeheiereieheieieieicNcNcNcNcNcNcNcNcNcNcNcNcNcNdldydydycNcNcNcNeqeheweFeqeqeqeqcNcNcNcNdldldlcNcNcNcNcNeqehehdDdDdDdDeheqeGcNeqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzacacacafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeheheheheheheheieicNcNcNcNcNcNcNcNcNcNcNcNcNcNdydydydycNcNcNcNcNeqeqeFeFeHeheIeqcNeqeqdldldlcNcNcNcNcNcNeqeqeqeqeJeJeqeqeqeqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaLacacacacacacacacacacacacacacacacdzdzdzdzdzacacacacafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacacacacacaWacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeheheheieiejeieCeheieheheiereieicNcNcNcNcNcNdxdydydycNcNcNcNcNcNeDeheqehdDeheqeqeheJdldlcNcNcNcNcNcNcNcNcNdlevevevcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaLaLaLacacacacacacacacacacacacacacacdzdzdzdzdzacacacacafafafafafafafafafafafafafafafafafacacacacafafafafafafafafafafafafafafafafafafafafacacacacacacacacacacacaUacaUaWacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeheKeheheheheqeieieLeheheMeieieCcNcNcNcNcNcNdydydydycNcNcNcNcNcNcNeDeqeheweheheheheJdmdocNcNcNcNcNcNcNcNdldldodlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaLaLaLaLacacacacacacacacacacacacacacdzdzdzdzdzacacacafafafafafafafafafafafafafafafafacacacacacacacacacafafafafafafafafafafafafafafafafafafafacacacacacacacaUacacacaUacacacacacacacacacaWacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeheieieiehehcNcNcNcNcNcNcNcNcNcNdydydydydydydycNcNcNcNcNcNeqeqeqeqeqeheqdlcNcNcNcNcNdldldldldldldDdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafdpdpdpdpdpdzdzacacacacacacacacaLaLacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYcZdedeadadcYcNdldldldldldldldldqdqdldldDdDdDdldldldldldldldlcNcNcNcNcZdNdJdOdQdQdPdydydydldlcNcNdldldldDdDdDdDdDdDdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaWacacacacacacacacacacacacbMacacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafafdpdpdpdpdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYaddededRcZcYcNcNcNcNdldldldldldldldldldDdDdDdlcNdldldodldldlcNcNcNcNcZdSdUcZdQdPdTdydydldldlcNcNdldldmdDdDdDdDdDdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaWacacacacacacacacacacacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafafafdpdpdpdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYaddedgdecZcYcNcNcNcNdldldldldldldodldDdDdDdDdlcNdldldldmdldlcNcNcNcNcZcZcZcZdVcZcZcNcNdldldldldldqdldldDdDdldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzdzacacacacacacacacaWacacacacacacacacacacacafafafafafafafafafafafafafafafafafafdzdzdzdzdzdzdzdzacacacacacacdWacacacacacacacacacacacacacacacacacacacacacacacaLaLacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYcYcZdedecZcYcNcNcNcNdldqdldldldldldldDdDdDcNcNcNdldldldldldldldlcNcNcNcNcZajajajcZcNcNdqdldldldldldldldldldldlcNdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaWacacacacacacacacaLaLacacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafafafafafacdzdzdzdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaLacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYcYcZdedecZcYcNcNcNcNdldldldldldldldldDdDcNcNcNcNcNdldldldldldldldldldlcNcZajajdXcZcNcNdldldldlcNcNcNcNcNcNcNcNcNdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacaLaLaLaLaLacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafafafafafacacdzdzdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacaVacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYcYcYdededYcZcNcNcNcNdldldldldqdldldldDdDcNcNcNcNcNdldldldldldldldlduadcYcZajajdZcZcNcNcNdldldlcNcNcNcNcNcNcNcNcNdldDcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaWacacacaLaLaLaLacacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafafafafafacacacacdzdzdzdzdzdzdzacacacacacacacacacacacacacacacbMacacbMacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYebeacYdedgcZcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldlecdfecajajdXcZcNcNcNdldldlcNcNcNcNcNcNcNcNcNdDdDcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacaLaLaLaLacacacacdzdzdzdzdzdzacacacbMacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafafafafacacacacacdzdzdzdzdzdzdzacacacacacaWacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYeeedcYdedecZcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldDdldldldlduadefcZcZcZcZcZcNcNcNdldldlcNcNcNcNcNcNcNcNcNdDdDcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacaLaLaLacacacacacdzdzdzdzdzdzacacacacacacacacacacaVacacacacacacacacacacafafafafafafafafafafafafafacacacacacacacacacdzdzdzdzdzdzacacacacacacacacacacdWacacacacacacbMacacbMacacacacacacacaWacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcYdfdfdededecZcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldDdldldlcNcNcNcNcNcNcNcNcNdldlcNcNcNcNcNcNdldldDdDdDcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzacacbMacacbMacacacacacacacacacacacacacafafafafafafafafafafafafafafafacacacacacacacacacacdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcZdfegdfdfdecZcNcNcNcNdldldldldldldlcNcNcNcNcNcNcNcNcNcNdldldldldldDdldldlcNcNcNcNcNcNcNdldldldldlcNcNcNcNcNdldldDdDcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafafafafafacacacacacacacacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcZcZcZcZcZcZcZcNcNcNcNdldleiepepepdlcNcNcNcNcNcNcNcNcNcNdldFdldldldDdldldldlcNcNdldldldldldldldldldldldldlcNdldDdDdDcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacbMacacacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafafafafafacacacacacacacacacacacacdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdlepepdlepepdldlcNcNcNcNcNcNcNcNcNcNdldldldldldDdDdDdldlcNcNdldldldmdldldldldldldldldldldldldDdDcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacafafafafafafafafafafafafafafafafafafafafacacacacbMacacacacacacdzdzdzacdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdlepdldldldlejdlepekemdlcNcNcNdDeoesepdldqdqdldldDdDdldldldldldldldldldlcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNcNcNeqeqeqeqeqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacaWacacacacacacbMacacbMacacacdzdzdzdzdzdzacacacacacacacacacacacacacafafafafafafafafafafafafafafafafafafafafafafacacacacacacacacacacacacdzdzacacdzacacacacacacacacacaWacacacacacacacacacacacacacaLaLacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeierepcNcNdldldlepekepdlcNcNcNdDeoesepdldqdqdldldDdDdldldldldldlcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNcNcNeqeheheteueqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzacacacacacaWacacafafafafafafafafafafafafafafafafafafafafafafafafafafafacacacbMacacbMacacdWacacdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacaLaLacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlepepcNcNcNcNdleidleqdleqdDdDeoeoevdldldldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNcNcNcNcNeqeqeqehehdldoeheqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzacacacacacacacacacafafafafafafafafafafafafafafafafafafafafafafafafafafafacacacacacacacacacacacacdzdzacdzacacacacacacacaWacacacacacacacacacaWacacacacaLacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdlepepepepcNcNcNcNdlereperdleseodDeoeocNcNcNcNcNdldldldldldldmcNcNcNcNcNcNcNcNcNcNcNcNcNdldldmdlcNcNcNcNcNcNcNcNeqeyehehcNeheheqeqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzacacacacacacacacafafafafafafafafafafafafafafafafafafafafafafafafafafafafacacacacacacacacacacacacacdzacacacacacacacacacacacacacacaWacacacacacacacacacacacaLacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdlereidldlcNcNcNcNdleperepeqeseodDepepcNcNcNcNcNdldldldDdDdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNeqehehdodlehdldlehcNeqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzdzacacacacacacacafafafafafafafafafafafafafafafafafafafafafafafafafafafafafacacacacacacacacacacacacacacacdzacacdWacacacacacaLacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdlepepdldldldlcNcNcNcNcNcNcNcNdDdDdldlcNcNcNcNcNdldldldDdDdldlcNcNcNcNeqeqeqcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNeqehehdldlehdldFdleheqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacbMacacacacacacacacacacacacacacacacdzdzdzdzdzdzdzacacacacacacacafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacaLacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldlejdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNeqeAeheheqcNcNcNcNcNcNcNdldodlcNcNcNcNcNeqeBeheheqeqeqeqdldleheqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzacacacacacacafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeiepepepepelepdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdDdldydlcNcNcNcNeDdleqeheDcNcNcNcNcNcNcNdldldlcNcNcNcNcNeqeEehehdDdDdDeheqeheheqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacaVacacacacacacacacacacacdzdzdzdzdzdzacacacacacafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacaLacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdleperepdlepepepepcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldydydycNcNcNcNeqdldoeFeqeqeqeqcNcNcNcNdldldlcNcNcNcNcNeqehehdDdDdDdDeheqeGcNeqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzacacacafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldlepepcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydydydycNcNcNcNcNeqeqeFeFeHeheIeqcNeqeqdldldlcNcNcNcNcNcNeqeqeqeqeJeJeqeqeqeqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaLacacacacacacacacacacacacacacacacdzdzdzdzdzacacacacafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacacacacacaWacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlepepeiepeldlepdldleperepepcNcNcNcNcNcNdxdydydycNcNcNcNcNcNeDeheqdldDeheqeqeheJdldlcNcNcNcNcNcNcNcNcNdlevevevcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaLaLaLacacacacacacacacacacacacacacacdzdzdzdzdzacacacacafafafafafafafafafafafafafafafafafacacacacafafafafafafafafafafafafafafafafafafafafacacacacacacacacacacacdzacdzaWacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdliOdldldldleqepependldlewepepelcNcNcNcNcNcNdydydydycNcNcNcNcNcNcNeDeqdldoeheheheheJdmdocNcNcNcNcNcNcNcNdldldodlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaLaLaLaLacacacacacacacacacacacacacacdzdzdzdzdzacacacafafafafafafafafafafafafafafafafacacacacacacacacacafafafafafafafafafafafafafafafafafafafacacacacacacacdzacacacdzacacacacacacacacacaWacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdlepepepdldlcNcNcNcNcNcNcNcNcNcNdydydydydydydycNcNcNcNcNcNeqeqeqeqeqeheqdlcNcNcNcNcNdldldldldldldDdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaLaLaLacacacacacacacaWacacacacacacdzdzdzdzdzdzdzacacafafafafafafafafafafafafafafafafacacacacacacacacacafafafafafafafafafafafafafafafafafafafacacacacacacacacacacacacacacacacacacacacacacacacacacaWacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydydxdydycNcNcNcNcNcNcNcNcNcNcNeqcNcNcNcNcNcNcNdldldldmdldldodldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzdzacacafafafafafafafafafafafafafafafacacacacacacacacacacacacacacacacafafafafafafafafafafafafafacacacacacacacacacaUaUaUacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldydydydydydycNcNcNcNcNcNcNcNcNcNcNdldldldldldldldldldldqdldldDdDdldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzacacacafafafafafafafafafafafafafafafacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafafafacacacacacacaUaUaUacacacacacacacacaLacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdmdydydydydydycNcNcNcNcNcNcNcNcNcNcNdldldldldldldlcNcNdldldldldDdDdldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacaLaLacacacacacdzdzdzdzdzafafafafafafafafafafafafafafafafafafacacacaWacacacacacacacacacacacacacacacafafafafafafafafafafafafafafafacacacacaUacaUaUaUacacacacacacacacaLaLacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqeqeqeqeqeqcNdldldydydydydycNcNcNcNcNcNdldldldldldDdDdldldldldlcNcNdldldldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaLaLaLaLacacacacacdzdzdzdzdzafafafafafafafafafafafafafafafafafafacacacacacacaLacacacaWacacacacacacacacafafafafafafafafafafafafafafafacacacacacacacaUaUaUacacacaLacacacaLaLacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeOeNePeqeheqeqeqeqdldydydydycNcNcNcNcNcNdmdldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacaLaLaLaLaLacacacacacdzdzdzdzdzdzafafafafafafafafafafafafafafafafafacacacacacacacacacacacacacacaWacacacacacacacafafafafafafafafafafafafafafacacacacacaUaUaUacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeheheheqeheheheqeFdldldydxdycNcNdydldldldldldldldqdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldFdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaLaLaLacacacacacacdzdzdzdzdzdzdzafafafafafafafafafafafafafafafafacaLacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafafacacacacacacaUaUaUaUacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqeFeqeqeheQeheFeFdldldydydydydydldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldDdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaWacacacacacacacacacacafafafafafafdzdzdzdzdzafafafafafafafafafafafafacacacacacacacacacacacacacacacaWacacacacacacacacacacafafafafafafafafafafafafafafacacacacacaUaUaUaUacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeheweheqeheheqeqeqdldldldldydydydldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacafafafafafafafdpdpdpdpdpafafafafafafafafafafafacacacacacacaaaaaaaaaaaaacacacacacacacacacacacacacacafafafafafafafafafafafafafafacacacacacaUaUaUaUacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqeheweqeheheheheqcNcNcNcNdldldqdldDdDdDdDcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldDdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacafafafafafafafafafafafafafafdpdpdpdpdpafafafafafacacacacacacacacacacaaaaaaaaaaaaaaacacacacacacaWacacacacacacacacacafafafafafafafafafafafafafacacacacaUaUaUaUacacacacacaWacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldlcNcNcNcNeqeheheheheheqeqcNcNcNcNcNdldldldldDdDdDdDdDdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafafafafafafdpdpdpdpdpafafafafacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaLacafafafafafafafafafafafafafacacacacaUaUaUaUacacacacacacacacacacaceSeReReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldldldldlcNcNcNcNeqeqeQeheheqeqeqcNcNcNcNcNdldldDeUdDdDdldldDdldleqeqeqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydldqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafafafafafafafdzdzdzdzdzacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacafafafafafafafafafafafafafafacaUaUaUaUacacacacacacacacacaLaceSeSeSeSeRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldldldldldldldlcNcNcNeqeqeqcNcNcNcNdldldldldDdDdDdDdDdldldldldleFeFeqeqeqeqcNcNcNcNcNcNcNcNcNcNcNcNcNdydydydldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafafafafafafafdzdzdzdzdzdzacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacafafafafafafafafafafafafafafacacaUaUaUaUacacacacacacacacacaceSeSeSeSeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldqdldldDdDdldDdldldldlcNcNcNcNcNcNcNcNcNcNdldqdldldDdDdDdDdDdldldldleveFeFeheheqeqcNcNcNcNcNcNcNcNcNcNcNcNcNdydxdydldldDdDdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafafafafafafafacdzdzdzdzdzacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacafafafafafafafafafafafafafafafdpdpdpaUaUacacacacacacacacacaaaaeSeSeSeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldDdDdldldldldldlcNcNcNcNcNcNcNcNcNcNdldldldldDdDdDdDdDcNcNcNdleqeqeheheheheheqeqcNcNcNcNcNcNcNcNcNcNcNcNdydydydldDdDdDdDdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafafafafafafafacdzdzdzdzdzacacaWacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafafafafafafafafafafafafafdpdpdpdpaUaUacacacacacacacacacaaaaeSeSeSeSeTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldlcNcNdldldqdldlcNcNcNcNcNcNcNcNcNcNdmdldDdDdDdDdDdlcNcNcNcNdldleqeheheheheweheqeqcNcNcNcNdldldlcNcNcNcNdldydydydldDdDdDdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafacacacacacaVdzdzdzdzdzacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacafafafafafafafafafafafafdpdpdpdpdpacacacacacacacaLacacacaaaaaaeReSeSeTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNdldldldldlcNcNcNcNcNcNcNcNdldldldDeUdDdDdDdldlcNcNcNeqeqeqeqeqeheheheheheheqcNcNcNcNdleVdlcNcNcNcNcNdydydycNdDdDdDdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafacacacacacacacdzdzdzdzdzacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacafafafafafafafafafafafdpdpdpdpdpafacacacacacacacacacacafaaaaaaeReSeSeTeRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdmdldlcNcNcNcNcNdmdldldlcNcNcNcNcNcNcNcNdldldldDdDcNcNcNcNcNcNcNcNeqeqeWeqeqeqeqeheheheheqeqcNcNcNdldldldldlcNcNcNdydxcNcNcNdldDdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafacacacacacacacdzdzdzdzdzacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacafafafafafafafafafafdpdpdpdpdpafafafafacacacacacacacacafaaaaaaeReTeSeSeRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNdldldDdlcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNeqeheheheheheheheheheheheheGeqcNcNcNcNcNdldlcNcNdydydycNcNcNdldDdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafacacacacacacacacdzdzdzdzdzacaLaLacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacafafafafafafafdpdpdpdpdpafafafafafafafafafacacacafafaaaaaaeReSeSeSeRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNdldldDdlcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNeqehehehehehehehehehehezeheheqcNcNcNcNcNdldlcNcNdydydycNcNcNdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafacacacacacacacacdzdzdzdzdzdzacacacacacacaaaaaaaaaaaaaaaaaaaaaaaceXaaaaaaaaaaaaaaaaaaaaaaaaacacaLacacacacacacacafafafdpdpdpdpdpafafafafafafafafafafafafafafafaaaaaaeReReReSeTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldDdlcNcNcNcNdldldDdlcNcNcNcNcNcNcNcNdldlcNcNcNcNcNcNcNcNcNcNeqeqeheheheheweheheheqeheheqcNcNcNcNcNcNdldmdldldydycNcNcNcNcNdldDcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafacacacacacacacdzdzdzdzdzdzacacacacacacacaaaaaaaaaaaaaaaaaaaaeYacaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacafafdpdpdpdpdpafafafafafafafafafafafafafafafafaaaaaaeReReReSeTeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldDdlcNcNcNcNdldldldlcNcNcNcNcNcNcNcNdldlcNcNcNcNcNcNcNcNcNcNcNcNeqeqeheheheheheqeheheheqdlcNcNcNcNcNcNdldFdldxcNcNcNcNcNcNdldDcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzdzacacafafafafafafafafafafafafafafafacacacacacacacacacacacacacacacacafafafafafafafafafafafafafacacacacacacacacacdzdzdzacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldydydydydydycNcNcNcNcNcNcNcNcNcNcNdldldldldldldldldldldqdldldDdDdldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzacacacafafafafafafafafafafafafafafafacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafafafacacacacacacdzdzdzacacacacacacacacaLacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdmdydydydydydycNcNcNcNcNcNcNcNcNcNcNdldldldldldldlcNcNdldldldldDdDdldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacaLaLacacacacacdzdzdzdzdzafafafafafafafafafafafafafafafafafafacacacaWacacacacacacacacacacacacacacacafafafafafafafafafafafafafafafacacacacdzacdzdzdzacacacacacacacacaLaLacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqeqeqeqeqeqcNdldldydydydydycNcNcNcNcNcNdldldldldldDdDdldldldldlcNcNdldldldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaLaLaLaLacacacacacdzdzdzdzdzafafafafafafafafafafafafafafafafafafacacacacacacaLacacacaWacacacacacacacacafafafafafafafafafafafafafafafacacacacacacacdzdzdzacacacaLacacacaLaLacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeOeNePeqeheqeqeqeqdldydydydycNcNcNcNcNcNdmdldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacaLaLaLaLaLacacacacacdzdzdzdzdzdzafafafafafafafafafafafafafafafafafacacacacacacacacacacacacacacaWacacacacacacacafafafafafafafafafafafafafafacacacacacdzdzdzacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeheheheqeheheheqeFdldldydxdycNcNdydldldldldldldldqdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldFdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaLaLaLacacacacacacdzdzdzdzdzdzdzafafafafafafafafafafafafafafafafacaLacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafafacacacacacacdzdzdzdzacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqeFeqeqdlexeheFeFdldldydydydydydldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldDdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaWacacacacacacacacacacafafafafafafdzdzdzdzdzafafafafafafafafafafafafacacacacacacacacacacacacacacacaWacacacacacacacacacacafafafafafafafafafafafafafafacacacacacdzdzdzdzacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqehdodleqdldleqeqeqdldldldldydydydldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacafafafafafafafdpdpdpdpdpafafafafafafafafafafafacacacacacacaaaaaaaaaaaaacacacacacacacacacacacacacacafafafafafafafafafafafafafafacacacacacdzdzdzdzacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqdldoeqeheheheheqcNcNcNcNdldldqdldDdDdDdDcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldDdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacafafafafafafafafafafafafafafdpdpdpdpdpafafafafafacacacacacacacacacacaaaaaaaaaaaaaaacacacacacacaWacacacacacacacacacafafafafafafafafafafafafafacacacacdzdzdzdzacacacacacaWacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldlcNcNcNcNeqehdldldleheqeqcNcNcNcNcNdldldldldDdDdDdDdDdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafafafafafafdpdpdpdpdpafafafafacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaLacafafafafafafafafafafafafafacacacacdzdzdzdzacacacacacacacacacacaceSeReReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldldldldlcNcNcNcNeqeqexdleheqeqeqcNcNcNcNcNdldldDeUdDdDdldldDdldleqeqeqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydldqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafafafafafafafdzdzdzdzdzacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacafafafafafafafafafafafafafafacdzdzdzdzacacacacacacacacacaLaceSeSeSeSeRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldldldldldldldlcNcNcNeqeqeqcNcNcNcNdldldldldDdDdDdDdDdldldldldleFeFeqeqeqeqcNcNcNcNcNcNcNcNcNcNcNcNcNdydydydldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafafafafafafafdzdzdzdzdzdzacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacafafafafafafafafafafafafafafacacdzdzdzdzacacacacacacacacacaceSeSeSeSeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldqdldldDdDdldDdldldldlcNcNcNcNcNcNcNcNcNcNdldqdldldDdDdDdDdDdldldldleveFeFeheheqeqcNcNcNcNcNcNcNcNcNcNcNcNcNdydxdydldldDdDdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafafafafafafafacdzdzdzdzdzacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacafafafafafafafafafafafafafafafdpdpdpdzdzacacacacacacacacacaaaaeSeSeSeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldDdDdldldldldldlcNcNcNcNcNcNcNcNcNcNdldldldldDdDdDdDdDcNcNcNdleqeqehdldleheheqeqcNcNcNcNcNcNcNcNcNcNcNcNdydydydldDdDdDdDdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafafafafafafafacdzdzdzdzdzacacaWacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafafafafafafafafafafafafafdpdpdpdpdzdzacacacacacacacacacaaaaeSeSeSeSeTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldlcNcNdldldqdldlcNcNcNcNcNcNcNcNcNcNdmdldDdDdDdDdDdlcNcNcNcNdldleqehehehdldodleqeqcNcNcNcNdldldlcNcNcNcNdldydydydldDdDdDdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafafafacacacacacaVdzdzdzdzdzacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacafafafafafafafafafafafafdpdpdpdpdpacacacacacacacaLacacacaaaaaaeReSeSeTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNdldldldldlcNcNcNcNcNcNcNcNdldldldDeUdDdDdDdldlcNcNcNeqeqeqeqeqehehehdldleheqcNcNcNcNdleVdlcNcNcNcNcNdydydycNdDdDdDdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafacacacacacacacdzdzdzdzdzacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacafafafafafafafafafafafdpdpdpdpdpafacacacacacacacacacacafaaaaaaeReSeSeTeRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdmdldlcNcNcNcNcNdmdldldlcNcNcNcNcNcNcNcNdldldldDdDcNcNcNcNcNcNcNcNeqeqeWeqeqeqeqehdldleheqeqcNcNcNdldldldldlcNcNcNdydxcNcNcNdldDdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafacacacacacacacdzdzdzdzdzacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacafafafafafafafafafafdpdpdpdpdpafafafafacacacacacacacacafaaaaaaeReTeSeSeRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNdldldDdlcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNeqehehehehehehehehdldleheheGeqcNcNcNcNcNdldlcNcNdydydycNcNcNdldDdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafacacacacacacacacdzdzdzdzdzacaLaLacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacafafafafafafafdpdpdpdpdpafafafafafafafafafacacacafafaaaaaaeReSeSeSeRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNdldldDdlcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNeqehehehehehdldldldldldFdleheqcNcNcNcNcNdldlcNcNdydydycNcNcNdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafacacacacacacacacdzdzdzdzdzdzacacacacacacaaaaaaaaaaaaaaaaaaaaaaaceXaaaaaaaaaaaaaaaaaaaaaaaaacacaLacacacacacacacafafafdpdpdpdpdpafafafafafafafafafafafafafafafaaaaaaeReReReSeTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldDdlcNcNcNcNdldldDdlcNcNcNcNcNcNcNcNdldlcNcNcNcNcNcNcNcNcNcNeqeqehehehehdodleheheqdldleqcNcNcNcNcNcNdldmdldldydycNcNcNcNcNdldDcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafacacacacacacacdzdzdzdzdzdzacacacacacacacaaaaaaaaaaaaaaaaaaaaeYacaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacafafdpdpdpdpdpafafafafafafafafafafafafafafafafaaaaaaeReReReSeTeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldDdlcNcNcNcNdldldldlcNcNcNcNcNcNcNcNdldlcNcNcNcNcNcNcNcNcNcNcNcNeqeqehehdldleheqehehdleqdlcNcNcNcNcNcNdldFdldxcNcNcNcNcNcNdldDcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafacacacacacacacdzdzdzdzdzdzacacacacacacacaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacafdpdpdpdpdpafafafafafafafafafafafafafafafafafaaaaaaeReReReSeSeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeZcNcNcNcNdldldlcNcNcNcNdldldldldldlcNcNcNcNcNcNdldlcNcNcNcNcNcNcNcNcNcNcNcNeqeqfaeheheheheqeFeFeFeqdlcNcNcNcNcNcNdldldldldldldlcNcNcNdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafacacacacacacacdzdzdzdzdzdzacacacacacacacaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacaUaUdpdpdpdpafafafafafafafafafafafafafafafafafafaaaaaaeReReReSeSeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNcNcNdqdldlcNcNcNcNdldldldldldldldlcNcNcNcNdldldldlcNcNcNcNcNcNcNcNcNcNcNcNeqeqehehfbeqeqeveveqdlcNcNcNcNcNcNdldldldldldldlcNcNcNdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaWacacacacdzdzdzdzdzdzacacacacacacacaaaaaaacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacaUaUdpdpdpafafafafafafafafafafafafafafafafafafafaaaaaaeReReReSeSeSeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNcNdldldDdDdlcNcNdldldldldqdldmdlcNcNcNcNcNdqdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqeqeqcNdldldldlcNcNcNcNcNcNcNcNdldldldldqdldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacdzdzdzdzdzacacacaLacadadadadadadadadadadadadacacaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaUaUaUaUaUaUacafafafafafafafafafafafafafafafafafafaaaaaaeReReReReTfceReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNcNcNcNdDdDdDcNcNdldldldldldldldlcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNcNcNcNcNdldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacdzdzdzdzdzacacacacaceffdfffefhfgfhcZfjfifladacaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaUaUaUaUaUaUacacacacacafafafafafafafafafafafafafaaaaaaaaaaaaeReReTeSeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdDdldlcNcNcNadfmfmadadadadadfnadfodldlcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldlcNcNcNcNcNcNdldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacdzdzdzdzdzacacacacefdSfpcZfqfhfsfraoftfuadacaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacaUaUaUaUaUaUacacacacacacacacafafafafafafafafafafaaaaaaaaaaaaeReReTeSeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdDdDdlcNcNcNcZfmfmfmfvfvfvfwfvfwdldlfxcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldlcNcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacdzdzdzdzdzacacacacadadcZadfyadadcZfAfzfBadaaaaaaaaaaaaaaaaaaaaaaacacacacaWacacacacacaUaUaUaUaUaUacacacacacacacacafafafafafafafafafafaaaaaaaaaaaaeReReTeSeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdDdDdldlcNcNcZfvfmfmfvfvfvadfnadfodldldlcNcNcNcNdldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldDdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacdzdzdzdzdzacacacacacfCadfDajfEajadadadadadaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacaUaUaUaUacacacacacacacacacacacacacafafafafafafaaaaaaaaaaaaeReReSeSeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldleFcNfFfvfvfvfvfvfvaddldldldldldlcNcNcNcNcNcNdldldldldldldldldldlcNcNcNcNcNcNcNcNcNdldldldDdDdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacdzdzdzdzdzacacacacfGacfDfDfDajfHadacacacacaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacaUacaUaUaUacaUacacacacacacacacacacacacacacacafafaaaaaaaaaaaaeReReSeSeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeFeFeFfFadfIadadadadadfFfvdldDdldlcNcNcNcNcNcNdldldldldldldqdldldlcNcNcNcNcNdldldlfxdldldldDdDdldldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacdzdzdzdzdzdzacacacfJfKfDfMfLfNadacacacacaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacaUacaUaUaUacaUacacacacacacacacacacacacacacacafafaaaaaaaaaaeReReSeSeSeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeFeFfOdQdQfvfmfmfvfvfvfmdldldldldlcNcNcNcNcNcNcNcNcNdldldldldldlcNcNcNeqeqeqeqeqeqeqdldldldDdDdldldldldqdldldmdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacbMacacacacacacacdzdzdzdzdzdzdzfPadeffQcZfDdfdffRadacacacaaaaaaaaaaaaaaaaaaaaaaacacacacaWacacacacacacaUacaUacaUacacacacacacacacacacacacacacacacacacafaaaaaaaaaaeReReSeSeTeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNadfSdQfvfFfvfmfvfvfFdldldldldlcNcNcNcNcNcNcNcNcNdldldlfxdldlcNcNeqeqeqeqdydxdydyeqdldldDdDdldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacdzdzdzdzdzdzdzdzecdfdfecajajajfTadacacaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaWacacacacaUacaUacaUacacacacacacacacacacacacaLacacacafafaaaaaaaaeReReSeSeSeRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcZdQfvdQadfvfvfvfvadadadaddldldldlcNcNcNcNcNcNcNcNcNcNdldlcNcNeqeqeqeIehdydydyezeheqdDdDdDdDdDdDdDdDdldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafacacacacacacacdzdzdzdzdzdzacacacacacacacaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacdzdzdpdpdpdpafafafafafafafafafafafafafafafafafafaaaaaaeReReReSeSeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNcNcNdqdldlcNcNcNcNdldldldldldldldlcNcNcNcNdldldldlcNcNcNcNcNcNcNcNcNcNcNcNeqeqehehfbeqeqeveveqdlcNcNcNcNcNcNdldldldldldldlcNcNcNdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaWacacacacdzdzdzdzdzdzacacacacacacacaaaaaaacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacdzdzdpdpdpafafafafafafafafafafafafafafafafafafafaaaaaaeReReReSeSeSeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNcNdldldDdDdlcNcNdldldldldqdldmdlcNcNcNcNcNdqdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqeqeqcNdldldldlcNcNcNcNcNcNcNcNdldldldldqdldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacdzdzdzdzdzacacacaLacadadadadadadadadadadadadacacaaaaaaaaaaaaaaaaaaaaacacacacacacacacacdzdzdzdzdzdzacafafafafafafafafafafafafafafafafafafaaaaaaeReReReReTfceReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNcNcNcNdDdDdDcNcNdldldldldldldldlcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNcNcNcNcNdldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacdzdzdzdzdzacacacacaceffdfffefhfgfhcZfjfifladacaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacdzdzdzdzdzdzacacacacacafafafafafafafafafafafafafaaaaaaaaaaaaeReReTeSeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdDdldlcNcNcNadfmfmadadadadadfnadfodldlcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldlcNcNcNcNcNcNdldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacdzdzdzdzdzacacacacefdSfpcZfqfhfsfraoftfuadacaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacdzdzdzdzdzdzacacacacacacacacafafafafafafafafafafaaaaaaaaaaaaeReReTeSeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdDdDdlcNcNcNcZfmfmfmfvfvfvfwfvfwdldlfxcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldlcNcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacdzdzdzdzdzacacacacadadcZadfyadadcZfAfzfBadaaaaaaaaaaaaaaaaaaaaaaacacacacaWacacacacacdzdzdzdzdzdzacacacacacacacacafafafafafafafafafafaaaaaaaaaaaaeReReTeSeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdDdDdldlcNcNcZfvfmfmfvfvfvadfnadfodldldlcNcNcNcNdldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldDdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacdzdzdzdzdzacacacacacfCadfDajfEajadadadadadaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacdzdzdzdzacacacacacacacacacacacacacafafafafafafaaaaaaaaaaaaeReReSeSeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldleFcNfFfvfvfvfvfvfvaddldldldldldlcNcNcNcNcNcNdldldldldldldldldldlcNcNcNcNcNcNcNcNcNdldldldDdDdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacdzdzdzdzdzacacacacfGacfDfDfDajfHadacacacacaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacdzacdzdzdzacdzacacacacacacacacacacacacacacacafafaaaaaaaaaaaaeReReSeSeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeFeFeFfFadfIadadadadadfFfvdldDdldlcNcNcNcNcNcNdldldldldldldqdldldlcNcNcNcNcNdldldlfxdldldldDdDdldldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacdzdzdzdzdzdzacacacfJfKfDfMfLfNadacacacacaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacdzacdzdzdzacdzacacacacacacacacacacacacacacacafafaaaaaaaaaaeReReSeSeSeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeFeFfOdQdQfvfmfmfvfvfvfmdldldldldlcNcNcNcNcNcNcNcNcNdldldldldldlcNcNcNeqeqeqeqeqeqeqdldldldDdDdldldldldqdldldmdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacbMacacacacacacacdzdzdzdzdzdzdzfPadeffQcZfDdfdffRadacacacaaaaaaaaaaaaaaaaaaaaaaacacacacaWacacacacacacdzacdzacdzacacacacacacacacacacacacacacacacacacafaaaaaaaaaaeReReSeSeTeReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNadfSdQfvfFfvfmfvfvfFdldldldldlcNcNcNcNcNcNcNcNcNdldldlfxdldlcNcNeqeqeqeqdydxdydyeqdldldDdDdldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacdzdzdzdzdzdzdzdzecdfdfecajajajfTadacacaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaWacacacacdzacdzacdzacacacacacacacacacacacacaLacacacafafaaaaaaaaeReReSeSeSeRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcZdQfvdQadfvfvfvfvadadadaddldldldlcNcNcNcNcNcNcNcNcNcNdldlcNcNeqeqeqeIehdydydydFeheqdDdDdDdDdDdDdDdDdldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacdzdzdzdzdzdzdzfPadefefadadadadadadacaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacaWacacacaLacacacacacacacacacacaaaaaaaaeReSeSeReReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcZfvfmfvfIfUfUfUfUfUfWfVfndldqdldlcNcNcNcNcNcNcNcNcNcNdldlcNcNeqehehehehehehdyeheheheqdDdDdDdDdDdDdDdDdDdldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacdzdzdzdzdzdzdzdzacacacacacacacacacacacaaaaaaeReReReReRaaaaaaaaacacacacacacacaWacacacacacacacaUacacacacacacacacacacacacacacacacacacacacacaaaaaaaaeReSeSeReReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcZfXfZfYadfUfUfvfvfvfUgafndldldldlcNcNcNcNcNcNcNcNcNcNdldlcNcNeqehehehehehehehehdDdDdDdDdDdDdDdDdDdDdDdDdDdDdldldldlfxdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacaWacacacacdzdzdzdzdzdzdzcMacacacacgbadadadacacacaaaaaaeReReReSeRaaaaaaaaacacacacacacacacacacacacacacacacacacacacaLaLacacacacacacacacacacacacacacacaaaaaaaaeReSeTeReReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcZcZcZcZadadadfvfFfvadadaddldldldDcNcNcNcNcNcNcNcNcNcNdldlcNcNeqdydyehehehehehehdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacdzdzdzdzdzdzacacacacacacacgcaiadacacacaaaaaaeReReSgdeRaaaaaaacacacacacacacacacacacaWacacacacacacacacacaLaLacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldldqdldldldldldldldlcNcNeqdxdydyezehehehehdDeqdDdDdDdDdDdDdDdDdDdDdDdDdDdldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacaWacacacacacacacdzdzdzdzdzdzacacacacacacgeadadadacacaaaaaaaaeReReTeSeRaaaaaaacacacacacacacacacacacacacacacaUacacacacacacacacacacacacacacacacacacacacacacacacacacacafacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldmdldldldldldldldldldlcNcNcNcNeqdxdyehehehehehdDdDdDdDdDdDdDeqdDdDdDdDdDdDdDdldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacdzdzdzdzdzdzdzdzacacacacacacacacacacacaaaaaaeReReReReRaaaaaaaaacacacacacacacaWacacacacacacacdzacacacacacacacacacacacacacacacacacacacacacaaaaaaaaeReSeSeReReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcZfXfZfYadfUfUfvfvfvfUgafndldldldlcNcNcNcNcNcNcNcNcNcNdldlcNcNeqehehehehehehehehdDdDdDdDdDdDdDdDdDdDdDdDdDdDdldldldlfxdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacaWacacacacdzdzdzdzdzdzdzcMacacacacgbadadadacacacaaaaaaeReReReSeRaaaaaaaaacacacacacacacacacacacacacacacacacacacacaLaLacacacacacacacacacacacacacacacaaaaaaaaeReSeTeReReRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcZcZcZcZadadadfvfFfvadadaddldldldDcNcNcNcNcNcNcNcNcNcNdldlcNcNeqdydyehdldlehehehdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacdzdzdzdzdzdzacacacacacacacgcaiadacacacaaaaaaeReReSgdeRaaaaaaacacacacacacacacacacacaWacacacacacacacacacaLaLacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldldqdldldldldldldldlcNcNeqdxdydydFdlehehehdDeqdDdDdDdDdDdDdDdDdDdDdDdDdDdldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacaWacacacacacacacdzdzdzdzdzdzacacacacacacgeadadadacacaaaaaaaaeReReTeSeRaaaaaaacacacacacacacacacacacacacacacdzacacacacacacacacacacacacacacacacacacacacacacacacacacacafacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldmdldldldldldldldldldlcNcNcNcNeqdxdyehehehehehdDdDdDdDdDdDdDeqdDdDdDdDdDdDdDdldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacaWacacdzdzdzdzdzacacacacacacacggacacacacacaaaaaaaaeRgheSeSeRaaaaaaacacaWacacacaLacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaLacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqeqeqeqcNcNcNcNcNcNcNcNcNcNcNcNeqeqeqeqeqeWeqdDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacdzdzdzdzdzacacacacacacacacacacacacacaaaaaaaaeReSeSeSeRaaaaaaacacacacacaLaLacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldlcNcNcNcNcNeqeqeqeqeheheheqcNcNcNcNcNcNcNcNcNcNcNcNcNdleqeqeqeqdDdDdDeqdDdDdDdDdDdDdDdDdDdDdDdDdldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacdzdzdzdzdzacacacacacacacacacacacacacaaaaaaeReSeSeSgfeReRaaaaaaacacacacaLaLacacacacacacacacacacacacacacacacacacacacacacaWacacacaWacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldlcNcNcNcNeqeheIeqeheheheheqeqeqeqeqeqeqeqeqcNcNcNcNcNdldldldldldldDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdldldldqdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacaLaLacacacacdzdzdzacdzacacacacacacacacacacacacacaaaaaaeReSeSeSeTeReRaaaaaaacacacacacacacacacacacacacacacacacacacdWacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldldldmdldldldleqehgieqehdxehehehdxdxdDeheheheheheqeqeqcNcNdldldldldldldDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaWacacacacacacaLaLaLacacacdzdzdzacdzacacacacacacacacacacacacacaaaaaaeReTeTeSeTeReRaaaaaaaaaaacaLacacacaWacacacacacacacacacacacacacacacacacaWacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlfxdldldqdlcNcNdldldDdldleqeheheqdxdxdxehdxdDdDdDdDdDdDeheheheheheFevdldqdldldldldDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacaLaLacacacacdzacdzacacacacacacacacacacacacacacacaaaaaaeReTeTeSeReReRaaaaaaaaaaacacacacacacacacacaWacacacacacacacacbMacacacacacacacacacaWacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldydldldldldlcNcNdldldldldleqeheheqdxdxdxdxdxdxdDehdDdDdDeheheheheheFevdldldldldldDdDdDdldldldDdDdDdDdDdDdDdDdldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacdzacdzdzacacacacacacacacacacacacacacaaaaaaeReTeTeSeReReReRaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaWacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldydydycNcNcNcNcNcNdldldldldqevehehehehehehdxdDdDehehehdDeheweheheheqeqcNdldldldldldDdDdldldldldldldldldldDdDdDdldldldldmdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaWacacacacacacaLaLaLacacacdzdzdzacdzacacacacacacacacacacacacacaaaaaaeReTeTeSeTeReRaaaaaaaaaaacaLacacacaWacacacacacacacacacacacacacacacacacaWacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlfxdldldqdlcNcNdldldDdldleqeheheqdxdxdxehdxdDdDdDdDdDdDehdldldldlevevdldqdldldldldDdDdDdDdDdDdDdDdDdDdDdDdDdDdDdldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacaLaLacacacacdzacdzacacacacacacacacacacacacacacacaaaaaaeReTeTeSeReReRaaaaaaaaaaacacacacacacacacacaWacacacacacacacacbMacacacacacacacacacaWacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldydldldldldlcNcNdldldldldleqeheheqdxdxdxdxdxdxdDehdDdDdDdldldldldlevevdldldldldldDdDdDdldldldDdDdDdDdDdDdDdDdldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacdzacdzdzacacacacacacacacacacacacacacaaaaaaeReTeTeSeReReReRaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaWacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldydydycNcNcNcNcNcNdldldldldqevehehehehehehdxdDdDehehehdDdldodleheheqeqcNdldldldldldDdDdldldldldldldldldldDdDdDdldldldldmdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacdzacacacacacacacacbMacacacacacacacaaaaaaaaeReReSeSeSeReReRaaaaaaaaaaacacacacacacaWacacacacacacacacacacacacacacacacacacacacacacacacacacacacaWacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydydydydycNcNcNcNcNcNcNcNcNcNdlevehdydxeheheheheqeqeqeqeqeqeqehehehgjeqcNcNcNdldldldldDdDdldldldldldldldldldldldDdDdldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacdzacdzacacacacacacacacacacacacacacaaaaaaaaaaeReSeSeSeSeSeRaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacaLacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydydxdydycNcNcNcNcNcNcNcNcNcNcNeqdydydyehehehehglehehehehgmeqeqeqeqeqcNcNcNcNcNdldldldldldldldqdldldldlfxdldldldldDdldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacaWacacacacacacaVacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaeReSeSeTeSeSeRaaaaaaaaaaaaaaaaacacacacacacaWacacacacaLacacacacacacacacacacacacacacacacacacaWacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydxdycNcNcNcNcNcNcNcNcNcNcNcNcNeqgkgkeqeqeheheheheqeqeqeqeqeqcNcNcNcNcNcNcNcNcNdldqdldldDdldldldldldldldldldldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacdzacdzacacacacacacacacacacacacacacaaaaaaaaaaeReSeSeSeSeSeRaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacaLacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydydxdydycNcNcNcNcNcNcNcNcNcNcNeqdydydyehehdldlfxehehehehgmeqeqeqeqeqcNcNcNcNcNdldldldldldldldqdldldldlfxdldldldldDdldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacaWacacacacacacaVacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaeReSeSeTeSeSeRaaaaaaaaaaaaaaaaacacacacacacaWacacacacaLacacacacacacacacacacacacacacacacacacaWacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydxdycNcNcNcNcNcNcNcNcNcNcNcNcNeqgkgkeqeqehdldleheqeqeqeqeqeqcNcNcNcNcNcNcNcNcNdldqdldldDdldldldldldldldldldldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaeReReReSeSeSeReRaaaaaaaaaaaaaaacacacacacacdWacacacaLaLacacacacacacacacacacacacacdWacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydydycNcNcNcNcNcNcNcNcNcNcNcNcNcNdydycNeqeqeqeqeqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldldldldldldldldldldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacaWacacacacacacacacacacacacacacacacacacacacacacaWacacacacaaaaaaaaaaaaaaaaaaeReSeTeSeReRaaaaaaaaaaaaaaaaacacacacacacacacacaLaLacacacacacacacacacacacacacacacacacacacacacaWacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldydycNcNcNcNcNcNcNcNcNcNcNcNcNcNdydycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldlcNcNcNdldldldldldldldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacaWacacacacacacacacacacacacacacacaWacacacaWacacaaaaaaaaaaaaaaaaaaeReSeSeSeReRaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdWacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldqdldycNcNcNcNcNcNcNcNcNcNcNcNdxdxdydycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldDdlcNcNcNcNcNcNcNcNcNdldldldldldmdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab @@ -855,27 +851,27 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacaLacacacacacacacac aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacaLaLacacacacacacacacacacacacaLacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaeReReReSeTeReReReSeSeRaaaaaaaaaaacacacacacdzacacacacdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaWacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldlfxdlcNcNcNcNcNcNcNcNcNcNcNcNdydydycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldodldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacaLaLaLacacacacacacacacacacacacaLaLacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaeReTeSeSeSeReReSeSeSeRaaaaaaaaaaacacacacacdzacacacacdzacacacacacacacacacacacacacacaWacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNdldldldlcNcNcNcNcNcNcNcNcNcNcNcNdydydydycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNdldldldldldlcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacaLaLacacbMacacacacacacacacacaLaLaLacacacacbMacacacacacaaaaaaaaaaaaaaaaaaaaaaaaeReTeSeSeReReSeSeSeReRaaaaaaaaaaacacacacacdzdzdzacacacacacacacacacacacacacacacacacacacacacaWacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNdldldldqcNcNcNcNcNcNcNcNcNcNcNcNcNdydydycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNdldldldldldldlcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacaLacacacacacacacacacacacacacacaLaLaLacacacacacacacacacacaaaaaaaaaacZcZcZcZcZcZaddfgrgrgrgsaddfdfcZcZaaaaaaaaaaaaacacacdzacdzdzdzacacdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNeqeqeqcNdldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNdydydydydycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaLacacacacbMacacbMacacacaaaaaaaaaacZfjgugtgwgvadgrgrgxfkgrgrdfgzgycZaaaaaaaaaaacacacacdzacdzdzdzacacdzacacacacacacacacacacacacacacacacaWacacacacacacacacacacacacaLaLacacacacaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldleqeheheheqevdldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNdydydycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldydlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlfxdldldldqdldldlcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacaWacacacacacacacacacacacacacacaccQacacacacacacacacacacacacacacaaaaaaaaaacZgAaoguaoaoadgrgrdfgrdfgzdfgCgBcZaaaaaaaaaaacacacacdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaLaLacacacacaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNdleqeteheheheFeFevdDdDdDdDdDdDcNcNcNcNcNcNcNcNcNcNcNdxdydycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydydydydldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldlcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaacZgDaoaoaoaofrgrgrgzgzgzgzgEgzgFcZaaaaaaacacacacacdzdzdzdzdzacdzacacacacacacacacacdWacacacacacacacacacacacaWacacacacdWacacacacacacacacacacaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNdldleqeteheheheFeFeqdDdDdDdDdDdDdldldqcNcNcNcNcNcNcNcNdxdxdydycNcNcNcNcNcNcNcNcNcNcNcNcNcNdydydydydydldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldlcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaWacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaacZgDaogGaoaoaddfgzdfgzgzgzgzgzgHcZaaacacacaccMacacdzdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNeqeqehgleheheqdldDdDdDdDdDdldldlcNcNcNcNcNcNcNcNdxdxdydycNcNcNcNcNcNcNcNcNcNcNcNcNcNdydydxdydydydydlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldlcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaWacacacaWacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaacZaoaoaoaoaoadgIgzgzadadgJadadcZcZcZadacacacacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNeqeqeqeheheheheqeqdDdDdDdDdDdDdlcNcNcNcNcNcNcNcNcNdxdydycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydydydydydydlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaVacacacacacacacacacacacacacacacacacacacacacacacacacaWacacacacacacacaaaaaaaaaaaacZgKgMgLfufuadgzgzgNaddXajajcZajajajadacacacacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNeqeqgOeheheheheheqdldldDdDdDdDdlcNcNcNcNcNcNcNcNcNcNdydycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydydydxdxdydydldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacaLacacacacacacacacacacacacacacaLaLaLacacacacacacacacacacaaaaaaaaaacZcZcZcZcZcZadezeCeCeCeKadezezcZcZaaaaaaaaaaaaacacacdzacdzdzdzacacdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNeqeqeqcNdldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNdydydydydycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaLacacacacbMacacbMacacacaaaaaaaaaacZfjgugtgwgvadeCeCeCfkeCeCezgzgycZaaaaaaaaaaacacacacdzacdzdzdzacacdzacacacacacacacacacacacacacacacacaWacacacacacacacacacacacacaLaLacacacacaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldleqeheheheqevdldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNdydydycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldydlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlfxdldldldqdldldlcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacaWacacacacacacacacacacacacacacaccQacacacacacacacacacacacacacacaaaaaaaaaacZgAaoguaoaoadeCeCezeCezgzezgCgBcZaaaaaaaaaaacacacacdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaLaLacacacacaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNdleqeteheheheFeFevdDdDdDdDdDdDcNcNcNcNcNcNcNcNcNcNcNdxdydycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydydydydldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldlcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaacZgDaoaoaoaoeLeCeCgzeMgzgzgEgzgFcZaaaaaaacacacacacdzdzdzdzdzacdzacacacacacacacacacdWacacacacacacacacacacacaWacacacacdWacacacacacacacacacacaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNdldleqetehdleheFeFeqdDdDdDdDdDdDdldldqcNcNcNcNcNcNcNcNdxdxdydycNcNcNcNcNcNcNcNcNcNcNcNcNcNdydydydydydldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldlcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaWacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaacZgDaogGaoaoadezgzezgzgzgzgzgzgHcZaaacacacaccMacacdzdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNeqeqehfxdleheqdldDdDdDdDdDdldldlcNcNcNcNcNcNcNcNdxdxdydycNcNcNcNcNcNcNcNcNcNcNcNcNcNdydydxdydydydydlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldlcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaWacacacaWacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaacZaoaoaoaoaoadgIgzgzadadgJadadcZcZcZadacacacacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNeqeqeqdldleheheqeqdDdDdDdDdDdDdlcNcNcNcNcNcNcNcNcNdxdydycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydydydydydydlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaVacacacacacacacacacacacacacacacacacacacacacacacacacaWacacacacacacacaaaaaaaaaaaacZgKgMgLfufuadgzgzezaddXajajcZajajajadacacacacacacdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNeqeqgOeheheheheheqdldldDdDdDdDdlcNcNcNcNcNcNcNcNcNcNdydycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydydydxdxdydydldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaacZcZcZcZcZcZcZgsgPcZcZgQajajcZajajajadacacacacdzdzdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacaLaLacacacacacacacaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldleqehehehehehfaeqeqdDdDdDdDdlcNcNcNcNcNcNcNcNcNcNdydycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydydydxdxdydydydydlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldlcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaacZgRgScZgTgSadgUgUgVcZgWajajgXajajajadamadgYdzdzdzdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldleqeqeheheheqeheheheqcNcNdldDdDcNcNcNcNcNcNcNcNdydydydycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydxdxdydydydlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldqdlcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacaLacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaacZdJgZcZdJgZadgUgUgUadhahchbcZhdajdXhedfhedzdzdzdzdzdzdzdzacacacacacacacacacacacacacacacacacaWacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNdleqeqeheheheheheqeheheheheqeqeqdDdDcNcNcNcNcNcNcNcNdydydydxcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydxdxdxdydydlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqcNcNdldldldlcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacachfacacacaWacacacacacacacacacacacacacacacacacaaaaaaaacZfecZcZfecZadgrgUhgadhhhjhicZajajajadamadgYdzdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqeheheheheheheqeheheheheqeheqdldDdDcNcNcNcNcNcNcNdydydydydxcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydydxdxdydydlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeWeheFevdldldldlcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaWacacacacacaaaaaaaacZhkhkhkhkhkhlgUdfgUadhmhhhncZcZadadadacacacdzdzdzdzdzdzdzacacacacacacacacacacacacacaVacacacacacacacacacaWacacacacacacacaWacacacacacacacaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqeqeqeqeqeqeqehehgleheheheFeFeqdDdlcNcNcNcNdydydydydydxdxdxcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydydydydydydlcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqeheheFevdmcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaacacacacacacaccPcPcPcPcPacacacacacacacacacacacacacacacacacdWacacacacdWacacacacacacacacacacaWacacacaaaaaaaacZfecZcZhoadadgUgrdfadhphphphpaaacacacacacacacacacdzdzdzdzacacacacacacacacacacacacacacacacacacacacacaWacacacaWacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqeheheheheheheqeheheheheqeFeFevdldldldlcNcNdydxdydydycNcNcNcNcNcNcNdldldldlcNcNcNcNcNcNcNcNcNcNdydydydydydldlcNcNcNcNcNcNcNcNcNcNcNcNcNeqehehehgleheqeqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaacacacacacaccPcPcRcRcRcPcPacacacacacacacacacacacacacacacacacacaVacacacacacacacacacacacacacacacacacaaaaaaaacZdJgZadhrhqaddfgrgradaaaaaaaaaaacacacacacacacacacdzdzdzdzdzacacaWacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNeqeqeqeqehehgleheheheheheheheheqeqeqdldldldodldldldydydycNcNcNcNcNcNdldldldldodldlcNcNcNcNcNcNcNcNcNcNcNcNdldldldldlcNcNcNcNcNcNcNcNcNcNcNcNeqeqeheheheheheqeqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaacacaLacacaccPcRcRcRcRcRcPcPcPacacacacacacacacacaWacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaacZhsgSadhrhrgrgrgrfkfkaaaaaaaaaaacacacacacacacacacdzdzdzdzdzaWacacacaWacacacacacacacbMacacacacacacacacacacacacacacacaLaLacacacacacacacacaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNeqeqeheheheheheheheheheqeqeqeqdleqeqdlcNdldldldqdldldydycNcNcNcNcNdldldldqdldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNcNeqeqeqeheheheheheqeqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacachfacacacaWacacacacacacacacacacacacacacacacacaaaaaaaacZfecZcZfecZadgrgUhgadhhhjhicZajajajadamadgYdzdzdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqeheheheheheheqehehdleheqeheqdldDdDcNcNcNcNcNcNcNdydydydydxcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydydxdxdydydlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeWeheFevdldldldlcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaWacacacacacaaaaaaaacZhkhkhkhkhkhlgUdfgUadhmhhhncZcZadadadacacacdzdzdzdzdzdzdzacacacacacacacacacacacacacaVacacacacacacacacacaWacacacacacacacaWacacacacacacacaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqeqeqeqeqeqeqehehfxeheheheFeFeqdDdlcNcNcNcNdydydydydydxdxdxcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydydydydydydlcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqeheheFevdmcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaacacacacacacaccPcPcPcPcPacacacacacacacacacacacacacacacacacdWacacacacdWacacacacacacacacacacaWacacacaaaaaaaacZfecZcZhoadadgUgrdfadhphphphpaaacacacacacacacacacdzdzdzdzacacacacacacacacacacacacacacacacacacacacacaWacacacaWacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqehehdldleheheqehdleheheqeFeFevdldldldlcNcNdydxdydydycNcNcNcNcNcNcNdldldldlcNcNcNcNcNcNcNcNcNcNdydydydydydldlcNcNcNcNcNcNcNcNcNcNcNcNcNeqehehdlfxeheqeqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaacacacacacaccPcPcRcRcRcPcPacacacacacacacacacacacacacacacacacacaVacacacacacacacacacacacacacacacacacaaaaaaaacZdJgZadhrhqaddfgrgradaaaaaaaaaaacacacacacacacacacdzdzdzdzdzacacaWacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNeqeqeqeqehdlfxdldldldleheheheheqeqeqdldldldodldldldydydycNcNcNcNcNcNdldldldldodldlcNcNcNcNcNcNcNcNcNcNcNcNdldldldldlcNcNcNcNcNcNcNcNcNcNcNcNeqeqehehdldleheqeqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaacacaLacacaccPcRcRcRcRcRcPcPcPacacacacacacacacacaWacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaacZhsgSadhrhrgrgrgrfkfkaaaaaaaaaaacacacacacacacacacdzdzdzdzdzaWacacacaWacacacacacacacbMacacacacacacacacacacacacacacacaLaLacacacacacacacacaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNeqeqehehehehdldleheheheqeqeqeqdleqeqdlcNdldldldqdldldydycNcNcNcNcNdldldldqdldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNcNeqeqeqeheheheheheqeqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaacacacacacaccPcXcRhtcRcRcRcRcWacacacacacacacacacacacacacdWacacacacacacacacacacacacacacacacacacacacacacaaaacZcZcZcZadgsgrgrfkfkfkaaaaaaaaaaaaacacacacacacacacacacdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacaLaLacacacacacacacacaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNeqeqeheheheheheheheheheqeqeqeqdldldldlcNcNcNdldldldmdldldydycNcNcNdldldldldldldldldldldlcNcNcNcNcNcNcNcNcNcNdldldqdlcNcNcNcNcNcNcNcNcNcNeqehethueqeqeheheheheheqcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaacacacacaccPcRcRcRcRcRcPcPcPacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaeReSeSeTeTeSeReReRaaaaaaacacacacacacacacacacdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqeqeEhveheteqeqdldldldldldldldlcNcNcNcNcNcNdldldldldlcNcNcNdldldldldlcNcNdldldldlcNcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNeqeheheheqeqeheheheheheqcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaacaLacacaccPcPcRcRcRcPcPacacacacacacacacacacacacacacacacacacaccQacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaeReReSeSeTeSeReReRaaaaaaaaaaaaacacacacacacacdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqeqeqeqeqeqeqeqdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNdldldldldlcNcNdldldldlcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNcNcNcNcNcNcNcNeqeheheheqeheqeqeheheteqcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaacacacacacaccPcPcPcPcPacacacacacacacacacacacacacacacacacacacacacacaWacacacacacacacacaWacacacacacacacaaaaaaaaaaaaaaeReReSeSeTeSeSeReRaaaaaaaaaaaaacacacacacacacdzdzdzdzacacacacacacacacacacacacacdWacacacacacacacacacaWacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNdldldldldlcNcNdldldldlcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNcNcNcNcNcNcNcNeqhxeheheqehehehehehhueqcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaeReReSeSeTeSeReRaaaaaaaaaaaaaaaaacacacacdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacaWacacacaWacacacacacacaLacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldldldlcNcNdldldldlcNcNcNcNcNcNcNcNcNdldodldlcNcNcNcNcNcNcNcNcNcNcNeqeheheheheheheheheheheqcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaacacaVacacacacacacacacacbMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaeReReSeSeSeSeReRaaaaaaaaaaaaaaaaacacacacdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaLacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldlfxdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldldlcNcNcNcNdldlcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNcNcNcNcNcNcNcNeqeqehehehehehgleheheheqcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaeReReSeSeTeSeReRaaaaaaaaaaaaaaaaacacacacdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacaWacacacaWacacacacacacaLacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldldldlcNcNdldldldlcNcNcNcNcNcNcNcNcNdldodldlcNcNcNcNcNcNcNcNcNcNcNeqehehehehehehdldleheheqcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaacacaVacacacacacacacacacbMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaeReReSeSeSeSeReRaaaaaaaaaaaaaaaaacacacacdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaLacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldlfxdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldldlcNcNcNcNdldlcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNcNcNcNcNcNcNcNeqeqehehehehehfxdleheheqcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacaWacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaeReReSeSeSeSeReRaaaaaaaaaaaaaaaaacacacacdzdzdzdzacaWacacacacacacdWacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldldldldlcNcNdldqcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqeheqeqeqeqeqeheqcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaacacacacacaWacacacacacacacacacacacacacacacaWacacacacacacacacacacacacacacacacaWacacacacacacacacacacacacacaaaaaaaaaaaaeReReTeSeSeSeSeReRaaaaaaaaaaaaaaaaaaacacdzdzdzdzacacacacacacacacacacacacacacacacacacacdWacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldqdldldldldodldlcNcNdldlcNcNcNcNcNcNdldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqeWeqeqeheheheheqcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacaLacacacacacacacacacacacacacacbMacacacacacacacacaLacacacacaWacacacacacacacacacacacaaaaaaaaaaaaaaaaeTeTeSeSeTeReRaaaaaaaaaaaaaaaaaaacacdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldDdDdldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldldldldldlcNdldlcNcNcNcNcNcNdldldqdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqeqeFeFeqeqdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab @@ -902,15 +898,15 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacdWacacacacacacacacacacacacacacacacacdzac aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacdzacacacacdzacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaeReReReReReSeSeSeSeSeReReReRaaaaaaaaaaaaaaacacacacacacacacacacacacacacdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldDdDdldlcNcNdldldldldldldldldleqeheFeFdldldldldqdldodldDdDdDdDdDdDdDdDdDdDdldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadWacacacacacacacacaWacacacacacacacacacacacdzdzdzdzacdzacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaeReReReReReReSeSeSeSeSeSeReReReRaaaaaaaaaaacacacacacacacacbMacacacacacdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldDdDdldldldleqeqeqeqeqeqdldldleqeheheqdleqdldldldldDdDdDdDdDdDdDdDdDdDdDdDdldmdldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacdzdzdzdzacdzdzacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeReSeShCeSeSeSeSeReReRaaaaaaaaaaacacacacacacacacacacacacacacacdzdzdzdzacaWacacacacacacacacacacacacacadadadadadadcZaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldleveveqehehhIeqeqeqeqeqeqeheheqdldldldldldDdDdDdDdDdDdDdDdDdDdDdDdldldlcNcNcNdldldycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaWacacacacacacacacacacacacacaLacacacdzdzdzdzdzdzdzacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeReReSeSeSeSeSeSeReReRaaacacacacacacacacacacacacacacacacacacacdzdzdzdzdzacacacacacacacacacacacacacachJgMgKaohKhLcZcZaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldleveFeFehehglehehehehehehgleheheqdldldldldldDdDdDdDdDdldldldldldldldldldlcNcNcNdldldydydxcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacaLaLaLacacacacdzdzdzdzdzacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaeReReSeSeShHeSeSeSeSeSaaacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzacacacacacacacacacacacacachJaoaoaoaoaoaocZcZaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeFehehehehehehehehehehehehhveqdlcNdldldldDdDdDdDdDdldldqdldldldldldldlcNcNcNcNcNdydydxcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaWacacacacacacacacacacacacacaLacacacdzdzdzdzdzdzdzacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeReReSeSeSeSeSeSeReReRaaacacacacacacacacacacacacacacacacacacacdzdzdzdzdzacacacacacacacacacacacacacachJgMgKaohKhLcZcZaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldleveFeFehehfxdlehehehehehfxdleheqdldldldldldDdDdDdDdDdldldldldldldldldldlcNcNcNdldldydydxcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacaLaLaLacacacacdzdzdzdzdzacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaeReReSeSeShHeSeSeSeSeSaaacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzacacacacacacacacacacacacachJaoaoaoaoaoaocZcZaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeFehehehdlehehehehehehdldlhveqdlcNdldldldDdDdDdDdDdldldqdldldldldldldlcNcNcNcNcNdydydxcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacaLaLacacacacacdzdzdzdzdzacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeReReSeSeSeSeShDeSacacacacacacacacacaVacacacacaLacacacacacacacdzdzdzdzdzdzacacacacacacacacacacacachJaoaoaoaoaoaohMcZaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqeheheheheheheheheqeqeqeqeqeqeqcNcNdldldDdDdDdDdDdDdldldldldlcNcNcNcNcNcNcNcNcNcNdydydycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaWacacacacacacacacacacacacacacacacacacdzdzdzdzacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaeReReReReReSeSeSachNacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzacacacacacacacacacacacadaoaoaoaoaoaofucZaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeheheheheqeheheheheqcNcNcNcNcNcNcNcNdldldDdDdDdDdDdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydydycNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeReSeSacacacacacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzacacacacacacaccMacadcZcZcZcZhOajcZcZcZcZgheSeReRaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeheqeqeheqeheheheqeqcNcNcNcNcNcNcNcNcNcNcNdDdDdDdDcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdxdydydydlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeRhPacacacacacacacacaLacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzacacacacacacacacadajajajhQdfdfdfgNdfcZeSeShReRaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqhSeheheheheqeheheheteqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdxdydydydlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaWacacacacacacacacacacacacaVacacacacacdzdzdzdzdzacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacachNacdaacacacaLaLacacacacacacacacacacacacacacacacacacacacdzdzdzdzacacacacacacacachJdXajajajdfdfgNgNgNfDeSeSeReRaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeueheheqeheheqeqhTeqeqcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdydldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacaWacacacacacacacacacdzdzdzdzdzacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacaLaLacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzacacacacacacachJdXajajdfhUdfgNfDfDfDeSeReReRaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeBeheheqehgleheqeqcNcNcNdldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNhVhVhVhVhVhVhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaLaLacacacacacacacacacacacacacacacacacacdzdzdzdzdzacacacacacacacacacacacaLacacacacacacaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacaLacacacacacacacacacacacacacacacacaWacacacdzdzdzdzdzacacacacacachJdXajajajdfdfgNgNfDfDeSeSeReRaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeIeheheheheheheqcNcNdldldldldFdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNhVhWhWhXhXhYhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacaWacacacacacacacacacdzdzdzdzdzacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacaLaLacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzacacacacacacachJdXajajdfdfdfgNfDfDfDeSeReReRaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeBeheheqehfxdleqeqcNcNcNdldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNhVhVhVhVhVhVhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaLaLacacacacacacacacacacacacacacacacacacdzdzdzdzdzacacacacacacacacacacacaLacacacacacacaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacaLacacacacacacacacacacacacacacacacaWacacacdzdzdzdzdzacacacacacachJdXajajajdfdfgNgNfDfDeSeSeReRaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeIehehehdldleheqcNcNdldldldldFdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNhVhWhWhXhXhYhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaLaLaLacacacacacacacacacacacacacacacacacacdzdzdzdzdzacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzdzdzacacacacadajajajajajhZdfgNgNcZeReSeSeRaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeqeqeqeqeFeqeqeqdlcNdldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNhVibiaiaiaichVcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaLaLacacacacacacacacacacacacaWacacacacacacdzdzdzdzdzacacacacacacaLaLacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaLacacacacacacacacacacacaWacacacacacacacacacacacacdzdzdzdzdzdzdzfPadefefcZcZcZcZhOajcZcZcZcZcZeReSgheRaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeFeqdldldldliddldldldldlcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlhVhVieiaiaiaifhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaLaLacacacacacacacacacacacacacacacacacacacdzdzdzdzacacacacacacacaLaLacaWacacacacacacacacaLacacacacacacacacacacacacacacacacacacacacacacacacacacacaWacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzecdfdfecigigihigigiiigigcZaaeReReSeRaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNeqeFdldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldlcNcNcNcNcNcNcNcNcNcNcNcNdldldlijhVhWiaiaiaiaikhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab @@ -918,22 +914,22 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacdz aaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacaWacacacacacacacdzdzdzdzacacacacacacacacacacacacacacacacacaLaLacacacacacacacaLaLacacacacacacacacacacacacacacacacacacacacacacacacacacaWacacacacacacacacacacacacacacacacdzacacacacadhhiocZigigigigigcZaaeReReShRaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldFdlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldDdDdDdlcNcNcNcNcNcNcNcNcNcNcNdldlcNcNhVhWiaipiqiminhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaWacacacacacacacacacacacacacacacdzdzdzdzdzacacacacacacacacacacacacaWacacacacaLaLacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdzacacacacadirhhisigigitigigcZaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNdldDdDdldlhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhViuhVhVhVhVhVhVhVhVhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacivfJacacfJacacacacacacacacaLaLacacacacacacacacacacacacacacacacbMacacacacacdzdzacacacadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdliddlcNcNcNcNcNcNcNcNcNcNdldldlcNcNcNcNcNcNcNcNdldDdDdldlhViwiwiwiwixhViziyiBiAiDiCizhViEiwiwiEhViFiwiwiwiwiFhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzacacacacacaLacacacacacacacacacacacacacacacacacacacacacacacacacaciGacacacacfGacacacacacacacacacacacacacacacacaWacacacacacacacacacacacacacacacacacacdzaUacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNdldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNcNcNcNcNcNcNcNcNcNcNcNdldlcNcNcNcNdliHdldldldldldlhViwiwiwiwiwhViIiIiIiIiIiIiIhViwiwiwiwhViJiJiJiJiJiJhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzacacaLacacacacacacacacaWacacacacacacacacacacacacacacacacacacacacacacacdpiLiKiNiMacacacacacacacacacacacacacacacacacacacdWacacacacacacacacacacacacacaUaUaUaUaUaUacgbadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNdldldldliOdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNcNcNcNcNcNcNcNcNcNcNcNdldlcNcNcNcNehehehiPhViQiQiQhViRiwiwiwiwhViSiIiUiTiViIiIhViWiwiwiwhViXiXiXiXiXiXhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacaciYdzdziZdzacacaLacacaLacacacacacacacacacacacacacacacacacacacacacacacacacacacdpjadpdpdpjbiNacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaUaUaUjcaiadacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNdldldodldldldldldldldldlcNcNcNcNcNcNcNcNdxdxdydydydldlcNcNcNcNcNcNcNcNcNcNcNcNdldlcNcNehehehehehehjdjejejejdiwiwiwiwiwjfiIiIjhjgjhiIiIjfiwiwiwiwjiiwiwiwiwiwiwhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacaccMacacacacacacjjjkjkjjaUacacaLacacacacacacacacacacacacacacacacacacacacacacacacacacacaciNjldpdpdpdpjmjmiNacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacjnadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNdldldldldldldldldldldldldlcNcNcNcNcNcNcNcNdxdydydydydydldldldlcNcNcNcNcNcNcNcNdljoehehehehehehehehehjdjejejejdiwiwiwiwjphVjqiIjsjrjtiIjuhViwiwiwiwhVjviwiwiwiwjvhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaLaLacacacacacacacacacacacacacaVacacacaciKjwjwiKaUacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaciNjljxjyjmjAjzjBiNacacacacacacacacbMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacjCacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNdldldldldldldDdDdDdDdldodldlcNcNcNcNcNdydydydydydydxdxcNdliddldlcNcNcNcNcNcNcNcNdlehehehehehehehehehiPhViQiQiQhVjEjDjFjFjGhVjqiIiIiIiIiIjHhViwiwiwiwhVhVhVjIjJhVhVhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzacacacacacaLacacacacacacacacacacacacacacacacacacacacacacacacacaciGacacacacfGacacacacacacacacacacacacacacacacaWacacacacacacacacacacacacacacacacacacdzdzacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNdldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNcNcNcNcNcNcNcNcNcNcNcNdldlcNcNcNcNdliHdldldldldldlhViwiwiwiwiwhViIiIiIiIiIiIiIhViwiwiwiwhViJiJiJiJiJiJhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacdzdzdzdzdzacacaLacacacacacacacacaWacacacacacacacacacacacacacacacacacacacacacacacdpiLiKiNiMacacacacacacacacacacacacacacacacacacacdWacacacacacacacacacacacacacdzdzdzdzdzdzacgbadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNdldldldliOdldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNcNcNcNcNcNcNcNcNcNcNcNdldlcNcNcNcNehehehiPhViQiQiQhViRiwiwiwiwhViSiIiUeQiViIiIhViWiwiwiwhViXiXiXiXiXiXhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacaciYdzdziZdzacacaLacacaLacacacacacacacacacacacacacacacacacacacacacacacacacacacdpjadpdpdpjbiNacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdzdzdzjcaiadacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNdldldodldldldldldldldldlcNcNcNcNcNcNcNcNdxdxdydydydldlcNcNcNcNcNcNcNcNcNcNcNcNdldlcNcNehehehehehehjdjejejejdiwiwiwiwiwjfiIiIjhjgjhiIiIjfiwiwiwiwjiiwiwiwiwiwiwhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacaccMacacacacacacjjjkjkjjdzacacaLacacacacacacacacacacacacacacacacacacacacacacacacacacacaciNjldpdpdpdpjmjmiNacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacjnadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNdldldldldldldldldldldldldlcNcNcNcNcNcNcNcNdxdydydydydydldldldlcNcNcNcNcNcNcNcNdljoehehehehehehehehehjdjejejejdiwiwiwiwjphVjqiIjsjrjtiIjuhViwiwiwiwhVjviwiwiwiwjvhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaLaLacacacacacacacacacacacacacaVacacacaciKjwjwiKdzacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaciNjljxjyjmjAjzjBiNacacacacacacacacbMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacjCacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNdldldldldldldDdDdDdDdldodldlcNcNcNcNcNdydydydydydydxdxcNdliddldlcNcNcNcNcNcNcNcNdlehehehehehehehehehiPhViQiQiQhVjEjDjFjFjGhVjqiIiIiIiIiIjHhViwiwiwiwhVhVhVjIjJhVhVhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaLaLaLaLacaWacacacacacacacacacacacacacacacaciKjwjwiKacacacacacacacacacacacacacacacacacacacacacacacacacacacjKacacacacjLiNiNiNjMiNiNiNjNacacacacacacacacacacacacacdWacacacacacacacacacacacacacacacacacacacacaWacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNdldldldldldldDdDdDdDdDdldldlcNcNcNcNcNdydydydycNcNcNcNcNdldldlevcNcNcNcNcNcNcNcNdlehehehehehjodldldldldldldldlhVjPjDjFjFjGhVjQiIiIiIiIiIjRhVjviwiwjvhVhVhVjOjShVhVhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaLaLaLaLacacacaWacacacacacacacacacacacacacacjjjkjkjjjjjjjTjTjjjjacacacacacacacacacacacacacacacacaWacacacacjUjKacacacacaciNjVjmjWiNacacacacacacacacacbMacacbMacacacacacacachfacacacacacdWacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNdldldldldDdDdDdDdDdDdDdlcNcNcNcNdldldydycNcNcNcNcNcNcNcNcNcNcNevevdldldldldldldldlehehehdldldlhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVjXiwhVhVhVhVhVjYiwhVhVhVkajZjZkbhVhVhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaacaLaLaLaLaLacacacacacacacacacacacacacacacacacacdpdpdpdpkckckckckckckdacacacacacacacacacacacacacacacacacacacackeackeacacackfdpkhkgkiiNacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNdldldldldDdDdDdDdDdDdDdlcNcNcNcNdldydydxcNcNcNcNcNcNcNcNcNcNcNevdldldldDdDdldldldldlcNcNcNdldlhVkkkjkmklkkkjkmklkoknkphVkrkqktksiwiwiEiwiwhVkwkvkvkwhVhVkujZjZjSkykxhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaacaLaLaLaLacacacacacacacacacacacacacacacacacfJacacacdpdpdpdpkckzkckckckAacacacacacacacacacacacacacacacacacacacackBacacacacdpdpkhkCkiiNacacacacacacacacacacacacacaLacacacacacacacacacacacacacacacacacacacacacaWacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNdldliOdldldldldDdDdDdldldldldldldldydydxcNcNcNcNcNcNcNcNcNcNcNdldldldldDdDdDdDdDdldlcNcNcNdldlhVjDkDkEkljDkDkEklkGkFkFhVkHkqkqkJiwiwiwiwiwhVkKkvkvkvhVhVkIjZjZkLhVhVhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaacaLaLaLacacacacacacacacacacacacacacacacacacacacdpdpdpdpdpkckMkckckckckcdpacacacacacacacacacacacacacacacacacacacacackeacacdpdpkhjmkiiNacacacackNacacacacacacacacacacacacacacacacacdWacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNdldldldldldldldldDdldldodldldldldldydxcNcNcNcNcNcNcNcNcNcNcNdldldldldldldldldldldlcNcNcNdldlhVkOklklklkOklklklkFkFkFhVhVhVhVhVkPiwhVhVhVhVkRkvkvkKhVhVkSkQkQkThVcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacfJackUackUjjjjkckcjjjjjjjjjjjjjjkckzkcjjacaWacacacacacaLaLacacacacacacacacacacacacacackViNkhkWkXiNacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNdldldldodldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldlcNcNdlcNcNcNcNcNcNcNhVkFkFkFkFkFkFkFkFkFkFkFkFkZkYlblakFkFldlckZhVkKkvkvlehVhVhVhVhVhVhVhVhVhVhVcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacfJacacacfCacacdpdpjjkckcjjlflhlglglhjjkckcdpjjacacacaWacacacaLaLacacacacacacacacacacacacdplikViNljjmkgiNdplkacacacacacacacacacacacacacacacacacacaVacacacacacacacacaWacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNdldldldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNcNcNcNcNcNhVkFllkFkFkFkFkFkFkFkFkFkFkFkFkFkFkFlclnlmkFhVkvkvkvkKhVhVhVhVhVhVlplolrlqhVcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacjjdpacacacacacacdpdpjjkckcjjlslslslsltjjkcdpacjjacacacacacacacacacacacacacacacacacacfCacacdplukglvjmjmjmlwjmdpdpjTacacacacacacacacacacacdWacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdlcNcNcNcNcNcNhVkOklklklkOklklklkFkFkFkFkFkFkFkFkFkFlylxlchVlzkvkvkvlAiwiwiwhVlplClBlDlqhVcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacjjdpacackUacacacdplFlEkckclGlslslslslHjjlIdpacjjacacacacacacacacacacacacacacacacacacacjTlJjmlKjmlLjmjmlNlMjmjmdpiNacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacbMacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNcNcNcNcNhVjDkDkEkljDkDkEklkGkFkFkFkFkFkFkFkFkFkFkFkFhVlzkvkvlOhViwiwiwhVlplClPlrlqhVcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacjjdpacacjjdplQdpdplFjjkckcjjlslslslsltjjdpacacjjacacacacacacacacacacacacacacacacacaclRiNiNiNiNiNiNlSkglTiNiNiNiNiNacacacacacacacacacacacacacacacacacacacacacacacacacacacaWacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdlcNcNcNcNcNhVkklUlVklkklUlVkllXlWkFkFlXlYmalZkFlXlWlWlZhVmbkvkvmchViRiwjphVmdlClClCmehVcNcNcNcNcNcNcNcNcNcNcNcNababababababab -aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacjjacacacjjlFdpdplFlFjjkckcjjltlhlglglhjjdpacacacacacacaLacacacacacacacacacacacacacaciNjmmfjmmgkViNjmjmkgiNkVkVcQmhacacacacacacacacaLacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldlcNhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVjYiwhVhViwiwiwhVlClClPlrlqhVcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaLaLaLaLacacacaWacacacacacacacacacacacacacacjjjkjkjjjjjjjTjTjjjjacacacacacacacacacacacacacacacacaWacacacacjUjKacacacacaciNjVjmjWiNacacacacacacacacacbMacacbMacacacacacacachfacacacacacdWacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNdldldldldDdDdDdDdDdDdDdlcNcNcNcNdldldydycNcNcNcNcNcNcNcNcNcNcNevevdldldldldldldldlehehhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVjXiwhVhVhVhVhVjYiwhVhVhVkajZjZkbhVhVhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaacaLaLaLaLaLacacacacacacacacacacacacacacacacacacdpdpdpdpkckckckckckckdacacacacacacacacacacacacacacacacacacacackeackeacacackfdpkhkgkiiNacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNdldldldldDdDdDdDdDdDdDdlcNcNcNcNdldydydxcNcNcNcNcNcNcNcNcNcNcNevdldldldDdDdldldldldlcNhVkkkjkmklkkkjkmklkkkjkmklkoknkphVkrkqktksiwiwiEiwiwhVkwkvkvkwhVhVkujZjZjSkykxhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaacaLaLaLaLacacacacacacacacacacacacacacacacacfJacacacdpdpdpdpkckzkckckckAacacacacacacacacacacacacacacacacacacacackBacacacacdpdpkhkCkiiNacacacacacacacacacacacacacaLacacacacacacacacacacacacacacacacacacacacacaWacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNdldliOdldldldldDdDdDdldldldldldldldydydxcNcNcNcNcNcNcNcNcNcNcNdldldldldDdDdDdDdDdldlcNhVjDkDkEkljDkDkEkljDkDkEklkGkFkFhVkHkqkqkJiwiwiwiwiwhVkKkvkvkvhVhVkIjZjZkLhVhVhVcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaacaLaLaLacacacacacacacacacacacacacacacacacacacacdpdpdpdpdpkckMkckckckckcdpacacacacacacacacacacacacacacacacacacacacackeacacdpdpkhjmkiiNacacacackNacacacacacacacacacacacacacacacacacdWacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNdldldldldldldldldDdldldodldldldldldydxcNcNcNcNcNcNcNcNcNcNcNdldldldldldldldldldldlcNhVkOklklklkOklklklkOklklklkFkFkFhVhVhVhVhVkPiwhVhVhVhVkRkvkvkKhVhVkSkQkQkThVcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacfJackUackUjjjjkckcjjjjjjjjjjjjjjkckzkcjjacaWacacacacacaLaLacacacacacacacacacacacacacackViNkhkWkXiNacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNdldldldodldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldlcNcNdlcNcNcNhVkFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkFkZkYlblakFkFldlckZhVkKkvkvlehVhVhVhVhVhVhVhVhVhVhVcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacfJacacacfCacacdpdpjjkckcjjlflhlglglhjjkckcdpjjacacacaWacacacaLaLacacacacacacacacacacacacdplikViNljjmkgiNdplkacacacacacacacacacacacacacacacacacacaVacacacacacacacacaWacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNdldldldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNcNhVkFllkFkFkFllkFkFkFkFkFkFkFkFkFkFkFkFkFkFkFlclnlmkFhVkvkvkvkKhVhVhVhVhVhVlplolrlqhVcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacjjdpacacacacacacdpdpjjkckcjjlslslslsltjjkcdpacjjacacacacacacacacacacacacacacacacacacfCacacdplukglvjmjmjmlwjmdpdpjTacacacacacacacacacacacdWacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldldldlcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdlcNcNhVkOklklklkOklklklkOklklklkFkFkFkFkFkFkFkFkFkFlylxlchVlzkvkvkvlAiwiwiwhVlplClBlDlqhVcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacjjdpacackUacacacdplFlEkckclGlslslslslHjjlIdpacjjacacacacacacacacacacacacacacacacacacacjTlJjmlKjmlLjmjmlNlMjmjmdpiNacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacbMacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNhVjDkDkEkljDkDkEkljDkDkEklkGkFkFkFkFkFkFkFkFkFkFkFkFhVlzkvkvlOhViwiwiwhVlplClPlrlqhVcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacjjdpacacjjdplQdpdplFjjkckcjjlslslslsltjjdpacacjjacacacacacacacacacacacacacacacacacaclRiNiNiNiNiNiNlSkglTiNiNiNiNiNacacacacacacacacacacacacacacacacacacacacacacacacacacacaWacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdlcNhVkklUlVklkklUlVklkklUlVkllXlWkFkFlXlYmalZkFlXlWlWlZhVmbkvkvmchViRiwjphVmdlClClCmehVcNcNcNcNcNcNcNcNcNcNcNcNababababababab +aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacjjacacacjjlFdpdplFlFjjkckcjjltlhlglglhjjdpacacacacacacaLacacacacacacacacacacacacacaciNjmmfjmmgkViNjmjmkgiNkVkVcQmhacacacacacacacacaLacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldlhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVjYiwhVhViwiwiwhVlClClPlrlqhVcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacmijjiKiKjjacacdpjjjjjjjjjjjjjjkckcjjjjjjjjjjjjjjdpacacacacacacacacacacacacacacaVacacacacacaciNjmmjjmmkjmmljmjmjmmmmnmkdpacfCacacacacacacacaLacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldlcNcNdldldldldlhVmoiwiwiwmpiwmrmqmtmsiwmumwmvmxiJiwiwiwiEhViwiwiwlAlClClBlDlqhVcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacjkjwjwjkacacdpdpdpdpmydpkckckckckcdpdpmzdpacacacacacacacacacacacacacacacacacacacacacacacacjTdpmAjmjmmjmBjmjmjmmCjmmDlQdpmEiNacacacacacacacacacacacacacacacacacacaLacacacacacaWacacacacacacacacacacacaLaLaLacacacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdliOdldldldldliOdldldldlcNcNcNcNcNcNcNcNcNcNcNdldldldldldlmFdlhViwmGiwiwiwiwiJmHmIiwiwiwiwiwiwiwiwiwiwiwhViwiwiwhVlClClolrmJhVcNcNcNcNcNcNcNcNcNcNcNcNababababababab aaaaaaaaaaaaaaaaaaaaaaaaacacacaWacacacacdWacacacacjkjwjwjkacacacacacdpmKdpdpdpkckcmLkcdpdpdpackeacacacjkacacacacacacaLaLacacacacacacacacacacdpdpmMjmkVkViNmOmNmOiNdpdpdpmPdpiNacacacacacacacacacacacacbMacacacacacacacacacacacacacacacacacacacacacacaLmQmQmQaLaLacacaaaaaaaaaaaaaaaaaaaaaaababcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNcNdldldldldliddldldldliOdlcNcNcNcNcNcNcNcNcNcNcNcNdldldldldldldlhViRiwiwiwmGiwiJmRmIiwmSiwiwiwiwiwiwiwiwiwhVhVhVhVhVhVhVhVhVhVhVcNcNcNcNcNcNcNcNcNcNcNcNababababababab diff --git a/_maps/map_files/AsteroidStation/AsteroidStation.dmm b/_maps/map_files/AsteroidStation/AsteroidStation.dmm index fe1985a7d9f..b5d50e29b64 100644 --- a/_maps/map_files/AsteroidStation/AsteroidStation.dmm +++ b/_maps/map_files/AsteroidStation/AsteroidStation.dmm @@ -314,7 +314,7 @@ "agb" = (/obj/structure/cable/orange{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/apmaint) "agc" = (/obj/machinery/conveyor_switch{id = "Recycler2"},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/apmaint) "agd" = (/obj/machinery/mineral/stacking_unit_console{machinedir = 4},/turf/simulated/wall,/area/maintenance/apmaint) -"age" = (/obj/machinery/mineral/stacking_machine,/turf/simulated/floor/plating,/area/maintenance/apmaint) +"age" = (/obj/machinery/mineral/stacking_machine{input_dir = 2; output_dir = 1},/turf/simulated/floor/plating,/area/maintenance/apmaint) "agf" = (/turf/simulated/wall/shuttle{icon_state = "swall_s6"; dir = 2},/area/shuttle/transport) "agg" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) "agh" = (/obj/machinery/ai_slipper{icon_state = "motion0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) @@ -1643,7 +1643,7 @@ "aFE" = (/obj/machinery/computer/secure_data,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor/carpet,/area/security/detectives_office) "aFF" = (/obj/effect/landmark/start{name = "Detective"},/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/carpet,/area/security/detectives_office) "aFG" = (/obj/structure/table/wood,/obj/item/weapon/hand_labeler,/turf/simulated/floor/carpet,/area/security/detectives_office) -"aFH" = (/obj/structure/table/wood,/obj/item/device/camera{desc = "A one use - polaroid camera. 30 photos left."; name = "detective's camera"; pictures_left = 30},/obj/machinery/atmospherics/components/unary/vent_scrubber{on = 1},/obj/machinery/light{dir = 4},/turf/simulated/floor/wood,/area/security/detectives_office) +"aFH" = (/obj/structure/table/wood,/obj/item/device/camera/detective,/obj/machinery/atmospherics/components/unary/vent_scrubber{on = 1},/obj/machinery/light{dir = 4},/turf/simulated/floor/wood,/area/security/detectives_office) "aFI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/security/main) "aFJ" = (/turf/simulated/floor/plasteel,/area/security/main) "aFK" = (/obj/machinery/requests_console{department = "Security"; departmentType = 5; name = "Security Requests Console"; pixel_y = 30},/turf/simulated/floor/plasteel,/area/security/main) @@ -1900,7 +1900,7 @@ "aKB" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "aKC" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain) "aKD" = (/obj/machinery/door/airlock{name = "Unisex Restroom"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/security/prison) -"aKE" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/button{id = "lawprivacy"; pixel_y = 25},/turf/simulated/floor/wood,/area/lawoffice) +"aKE" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/button/door{id = "law"; pixel_y = 25},/turf/simulated/floor/wood,/area/lawoffice) "aKF" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/prison) "aKG" = (/obj/structure/bed,/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/prison) "aKH" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/security/prison) @@ -1919,7 +1919,7 @@ "aKU" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 2; name = "Law Office APC"; pixel_y = -24},/turf/simulated/floor/wood,/area/lawoffice) "aKV" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/status_display{pixel_y = -32},/obj/machinery/camera{c_tag = "Law Office"; dir = 1},/turf/simulated/floor/wood,/area/lawoffice) "aKW" = (/obj/structure/table/wood,/obj/item/weapon/folder/red,/obj/machinery/light,/obj/machinery/newscaster{pixel_y = -32},/obj/item/weapon/book/manual/wiki/security_space_law,/turf/simulated/floor/wood,/area/lawoffice) -"aKX" = (/obj/effect/spawner/structure/window/reinforced,/obj/machinery/door/poddoor/shutters/preopen{id = "lawprivacy"; name = "Privacy Shutter"},/turf/simulated/floor/plating,/area/lawoffice) +"aKX" = (/obj/structure/grille,/obj/machinery/door/poddoor/shutters/preopen{id = "law"; layer = 2.9},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/lawoffice) "aKY" = (/obj/structure/transit_tube{icon_state = "E-W-Pass"},/turf/simulated/floor/plating/airless,/area/space/nearstation) "aKZ" = (/obj/structure/transit_tube,/turf/simulated/floor/plating/airless,/area/space/nearstation) "aLa" = (/turf/simulated/wall/r_wall,/area/engine/engineering) @@ -2207,7 +2207,7 @@ "aQw" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hydroponics) "aQx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plasteel,/area/hydroponics) "aQy" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/hydroponics) -"aQz" = (/obj/structure/table/reinforced,/obj/machinery/door/window/westright{name = "Hydroponics Desk"; req_one_access_txt = "30:35"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "greenfull"},/area/hydroponics) +"aQz" = (/obj/structure/table/reinforced,/obj/machinery/door/window/westright{name = "Hydroponics Desk"; req_access_txt = "35"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "greenfull"},/area/hydroponics) "aQA" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 8; icon_state = "green"},/area/hallway/primary/starboard{name = "Starboard Hallway"}) "aQB" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/obj/structure/cable/green{icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "neutralcorner"},/area/hallway/primary/starboard{name = "Starboard Hallway"}) "aQC" = (/obj/machinery/door/airlock/maintenance{name = "Maintenance Access"; req_access_txt = "19"; req_one_access_txt = "0"},/turf/simulated/floor/plating,/area/maintenance/maintcentral) @@ -3541,7 +3541,7 @@ "bqe" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plasteel,/area/crew_quarters/courtroom) "bqf" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/courtroom) "bqg" = (/obj/machinery/light_switch{dir = 1; pixel_y = 22},/obj/structure/bed/chair{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"},/area/crew_quarters/courtroom) -"bqh" = (/obj/structure/grille,/obj/machinery/door/firedoor,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/courtroom) +"bqh" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/courtroom) "bqi" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/port{name = "Port Hallway"}) "bqj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port{name = "Port Hallway"}) "bqk" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutralcorner"},/area/hallway/primary/port{name = "Port Hallway"}) @@ -4042,7 +4042,7 @@ "bzL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/poddoor/shutters{id = "Mechbay"},/turf/simulated/floor/plasteel,/area/assembly/chargebay) "bzM" = (/obj/machinery/door/poddoor/shutters/preopen{id = "robotics"; name = "robotics lab shutters"},/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/assembly/robotics) "bzN" = (/turf/simulated/wall,/area/assembly/robotics) -"bzO" = (/obj/machinery/door/poddoor/shutters/preopen{id = "robotics"; name = "robotics lab shutters"},/obj/structure/table/reinforced,/obj/machinery/door/window/eastleft{dir = 2; layer = 2.7; name = "Robotics Desk"; req_one_access = "29"},/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/assembly/robotics) +"bzO" = (/obj/machinery/door/poddoor/shutters/preopen{id = "robotics"; name = "robotics lab shutters"},/obj/structure/table/reinforced,/obj/machinery/door/window/eastleft{dir = 2; layer = 2.7; name = "Robotics Desk"; req_access_txt = "29"; req_one_access = null},/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/assembly/robotics) "bzP" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/toxins/lab) "bzQ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/poddoor/shutters/preopen{id = "robotics"; name = "robotics lab shutters"},/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/assembly/robotics) "bzR" = (/obj/machinery/disposal/bin,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whiteblue"},/area/toxins/lab) @@ -4433,7 +4433,7 @@ "bHm" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/toxins/misc_lab) "bHn" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/medical/research{name = "Research Division"}) "bHo" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/aft{name = "Aft Hallway"}) -"bHp" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft{name = "Aft Hallway"}) +"bHp" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft{name = "Aft Hallway"}) "bHq" = (/obj/machinery/light{dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/turf/simulated/floor/plasteel{icon_state = "neutralcorner"},/area/hallway/primary/aft{name = "Aft Hallway"}) "bHr" = (/turf/simulated/wall,/area/hallway/primary/aft{name = "Aft Hallway"}) "bHs" = (/obj/effect/decal/cleanable/cobweb,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -4694,7 +4694,7 @@ "bMn" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{dir = 9},/obj/structure/cable/pink{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bMo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/toxins/misc_lab) "bMp" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/pink{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"bMq" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/obj/structure/table/glass,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/turf/simulated/floor/plasteel,/area/toxins/misc_lab) +"bMq" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/obj/structure/table/glass,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel,/area/toxins/misc_lab) "bMr" = (/obj/structure/closet/wardrobe/black,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bMs" = (/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bMt" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -4764,7 +4764,7 @@ "bNF" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "Janitor"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "loadingarea"},/area/janitor) "bNG" = (/obj/machinery/door/airlock/maintenance{name = "Robotics Maintenance"; req_access_txt = "29"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bNH" = (/obj/effect/spawner/structure/window/reinforced,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/crew_quarters/hor) -"bNI" = (/obj/machinery/door/airlock/research{name = "Robotics Lab"; req_access_txt = "29"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteyellowfull"},/area/assembly/robotics) +"bNI" = (/obj/machinery/door/airlock/research{name = "Robotics Lab"; req_access_txt = "29"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteyellowfull"},/area/assembly/robotics) "bNJ" = (/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/assembly/robotics) "bNK" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/hor) "bNL" = (/obj/machinery/door/airlock/glass_research{name = "Testing Lab"; req_access_txt = "47"; req_one_access = null},/turf/simulated/floor/plasteel,/area/toxins/misc_lab) @@ -5021,7 +5021,7 @@ "bSC" = (/obj/machinery/computer/aifixer,/obj/machinery/ai_status_display{pixel_y = 32},/obj/machinery/button/door{id = "Biohazard"; name = "Biohazard Shutter Control"; pixel_x = -24; req_access_txt = "47"},/obj/machinery/button{id = "research"; name = "Research and Development Shutters"; pixel_x = -37},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whiteblue"},/area/crew_quarters/hor) "bSD" = (/obj/structure/closet/secure_closet/RD,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/crew_quarters/hor) "bSE" = (/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor/plasteel{icon_state = "whitepurple"; dir = 5},/area/toxins/mixing) -"bSF" = (/obj/structure/table,/obj/item/device/aicard,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/clothing/glasses/science,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whiteblue"},/area/crew_quarters/hor) +"bSF" = (/obj/structure/table,/obj/item/device/aicard,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/clothing/glasses/science,/obj/machinery/light_switch{pixel_x = 25; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whiteblue"},/area/crew_quarters/hor) "bSG" = (/obj/structure/cable/pink{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/crew_quarters/hor) "bSH" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bSI" = (/obj/structure/cable/pink{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 8; name = "Research Lab APC"; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whiteblue"},/area/toxins/lab) @@ -5113,7 +5113,7 @@ "bUq" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4; external_pressure_bound = 140; on = 1; pressure_checks = 0},/obj/machinery/camera{c_tag = "Server Room"; dir = 4},/turf/simulated/floor/bluegrid{nitrogen = 100; oxygen = 0; temperature = 80},/area/toxins/server) "bUr" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteyellow"},/area/assembly/robotics) "bUs" = (/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume{frequency = 1449; id = "tox_airlock_pump"},/turf/simulated/floor/engine,/area/toxins/mixing) -"bUt" = (/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel,/area/toxins/misc_lab) +"bUt" = (/obj/structure/cable/pink{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/alarm{frequency = 1439; locked = 0; pixel_y = 23},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/toxins/lab) "bUu" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/toxins/mixing) "bUv" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "bUw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) @@ -5141,8 +5141,8 @@ "bUS" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "whiteblue"},/area/medical/genetics) "bUT" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "whiteblue"},/area/medical/genetics) "bUU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/alarm{dir = 4; pixel_x = -22},/turf/simulated/floor/plasteel{dir = 10; icon_state = "whiteblue"},/area/medical/medbay2) -"bUV" = (/obj/machinery/disposal/bin,/turf/simulated/floor/plasteel{icon_state = "whiteblue"},/area/medical/medbay2) -"bUW" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "whiteblue"},/area/medical/medbay2) +"bUV" = (/obj/machinery/light_switch{pixel_y = 25},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/toxins/lab) +"bUW" = (/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j2s"; sortType = 10},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2) "bUX" = (/obj/structure/table/glass,/obj/item/weapon/airlock_painter,/obj/machinery/camera{c_tag = "Art Storage"; dir = 1},/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/art) "bUY" = (/obj/structure/table/glass,/obj/item/weapon/hand_labeler,/obj/item/weapon/gun/syringe,/turf/simulated/floor/plasteel{dir = 6; icon_state = "whiteblue"},/area/medical/medbay2) "bUZ" = (/obj/structure/bed/chair/office/light{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = -27},/obj/machinery/camera{c_tag = "Medbay Break Room"; dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/medbay2) @@ -5202,7 +5202,7 @@ "bWb" = (/turf/simulated/floor/plasteel/airless,/area/toxins/test_area) "bWc" = (/obj/machinery/camera{c_tag = "Toxins Test Chamber Fore"; network = list("SS13","Toxins")},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel/airless,/area/toxins/test_area) "bWd" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'BOMB RANGE"; name = "BOMB RANGE"},/turf/simulated/wall,/area/mine/explored) -"bWe" = (/obj/structure/table/glass,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/mask/muzzle,/obj/item/device/radio/intercom{frequency = 1485; name = "Station Intercom (Medbay)"; pixel_y = -29},/turf/simulated/floor/plasteel{icon_state = "whiteblue"},/area/medical/medbay2) +"bWe" = (/obj/structure/table/glass,/obj/item/weapon/stock_parts/manipulator,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/stack/cable_coil,/obj/item/weapon/stock_parts/capacitor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/toxins/lab) "bWf" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warnwhitecorner"},/area/toxins/lab) "bWg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "warnwhite"},/area/toxins/lab) "bWh" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/toxins/lab) @@ -5533,7 +5533,7 @@ "ccu" = (/obj/machinery/atmospherics/components/binary/pump{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/incinerator) "ccv" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 10},/obj/machinery/camera{c_tag = "Incinerator"; dir = 6},/turf/simulated/floor/plating,/area/maintenance/incinerator) "ccw" = (/turf/simulated/floor/plating,/area/maintenance/incinerator) -"ccx" = (/obj/machinery/disposal/bin,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plating,/area/maintenance/incinerator) +"ccx" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 1},/area/toxins/lab) "ccy" = (/obj/machinery/doorButtons/airlock_controller{idExterior = "incinerator_airlock_exterior"; idSelf = "incinerator_access_control"; idInterior = "incinerator_airlock_interior"; name = "Incinerator Access Console"; pixel_x = 24; pixel_y = -8; req_access_txt = "12"},/obj/machinery/atmospherics/components/binary/pump{dir = 1; name = "Gas Pump"},/turf/simulated/floor/plating{icon_state = "warnplatecorner"},/area/maintenance/incinerator) "ccz" = (/obj/machinery/doorButtons/access_button{idDoor = "incinerator_airlock_exterior"; layer = 3.1; idSelf = "incinerator_access_control"; name = "Incinerator airlock control"; pixel_x = -24; pixel_y = -8},/obj/structure/sign/fire{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 6},/turf/simulated/floor/plating,/area/maintenance/incinerator) "ccA" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/turf/simulated/wall/r_wall,/area/maintenance/incinerator) @@ -5602,7 +5602,7 @@ "cdL" = (/turf/simulated/floor/plating/airless{icon_state = "warnplatecorner"; dir = 1},/area/toxins/test_area) "cdM" = (/turf/simulated/floor/plating/airless{icon_state = "warnplatecorner"},/area/toxins/test_area) "cdN" = (/turf/simulated/wall/r_wall,/area/toxins/storage) -"cdO" = (/obj/structure/table/glass,/obj/item/weapon/stock_parts/manipulator,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/stock_parts/manipulator,/obj/item/stack/cable_coil,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/toxins/lab) +"cdO" = (/obj/effect/spawner/structure/window/reinforced,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/medical/medbay2) "cdP" = (/obj/structure/reagent_dispensers/peppertank{pixel_x = -32},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/medical/research{name = "Research Division"}) "cdQ" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{on = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/medical/research{name = "Research Division"}) "cdR" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/medical/research{name = "Research Division"}) @@ -5646,7 +5646,7 @@ "ceD" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"}) "ceE" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "ceF" = (/obj/machinery/atmospherics/components/unary/vent_pump,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"}) -"ceG" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4},/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 1},/area/toxins/lab) +"ceG" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "whiteblue"},/area/medical/medbay2) "ceH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhitecorner"},/area/toxins/lab) "ceI" = (/obj/effect/spawner/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters/preopen{id = "research"},/turf/simulated/floor/plating,/area/toxins/lab) "ceJ" = (/obj/machinery/door/poddoor/preopen{id = "Biohazard"; name = "Biohazard Containment Door"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "whitered"; dir = 8},/area/medical/research{name = "Research Division"}) @@ -6157,7 +6157,7 @@ "cou" = (/obj/structure/table/reinforced,/obj/machinery/door/window/northleft{dir = 4; layer = 2.9; name = "Atmospherics Desk"; req_access_txt = "24"},/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/atmos) "cov" = (/obj/effect/landmark/start{name = "Atmospheric Technician"},/obj/structure/bed/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel,/area/atmos) "cow" = (/obj/machinery/camera{c_tag = "Atmospherics Central East"; dir = 4},/obj/machinery/atmospherics/pipe/simple/cyan/visible,/turf/simulated/floor/plasteel,/area/atmos) -"cox" = (/obj/structure/cable/pink{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/toxins/xenobiology) +"cox" = (/obj/machinery/disposal/bin,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel{icon_state = "whiteblue"},/area/medical/medbay2) "coy" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plasteel,/area/atmos) "coz" = (/obj/structure/toilet{cistern = 1; desc = "The HT-451, a torque rotation-based, waste disposal unit for small matter. This one has a heart drawn on the cistern."; dir = 4},/obj/machinery/button/door{id = "barbath"; name = "Bolts Control"; normaldoorcontrol = 1; pixel_y = 25; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "coA" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible,/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/toxins/mixing) @@ -6221,7 +6221,7 @@ "cpG" = (/obj/structure/bed/chair,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/exit) "cpH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/obj/structure/bed/chair,/obj/structure/extinguisher_cabinet{pixel_y = 30},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/exit) "cpI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/bed/chair,/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/exit) -"cpJ" = (/obj/item/weapon/reagent_containers/dropper,/turf/simulated/wall,/area/toxins/misc_lab) +"cpJ" = (/obj/structure/table/glass,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/mask/muzzle,/obj/item/device/radio/intercom{frequency = 1485; name = "Station Intercom (Medbay)"; pixel_y = -29},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "whiteblue"},/area/medical/medbay2) "cpK" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/camera{c_tag = "Atmospherics Front Desk"; dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/atmos) "cpL" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/bed/chair,/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/exit) "cpM" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/bed/chair,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/exit) @@ -6385,7 +6385,7 @@ "csO" = (/turf/simulated/wall/shuttle{icon_state = "swall13"; dir = 2},/area/shuttle/supply) "csP" = (/turf/simulated/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/escape) "csQ" = (/turf/simulated/wall/shuttle{icon_state = "swall_s6"; dir = 2},/area/shuttle/escape) -"csR" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/space,/area/shuttle/escape) +"csR" = (/obj/machinery/light/small{dir = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/components/unary/vent_pump,/turf/simulated/floor/plasteel,/area/maintenance/asmaint2{icon_state = "toxtest"; name = "Toxins Launch Room"}) "csS" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor2"},/area/shuttle/escape) "csT" = (/turf/simulated/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/escape) "csU" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/simulated/floor/plating/airless,/area/shuttle/escape) @@ -6394,7 +6394,7 @@ "csX" = (/turf/simulated/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape) "csY" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/escape) "csZ" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/turf/simulated/floor/plating/airless,/area/shuttle/escape) -"cta" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 4},/turf/space,/area/shuttle/escape) +"cta" = (/obj/structure/cable/pink{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plasteel,/area/maintenance/asmaint2{icon_state = "toxtest"; name = "Toxins Launch Room"}) "ctb" = (/obj/structure/ore_box,/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor2"},/area/shuttle/escape) "ctc" = (/turf/simulated/wall/shuttle{icon_state = "swall11"; dir = 2},/area/shuttle/escape) "ctd" = (/obj/machinery/recharge_station,/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor2"},/area/shuttle/escape) @@ -6637,7 +6637,7 @@ "cxG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "cxH" = (/obj/structure/grille,/obj/machinery/door/firedoor,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/toxins/mixing) "cxI" = (/obj/item/device/assembly/signaler{pixel_y = 8},/obj/item/device/assembly/signaler{pixel_x = -8; pixel_y = 5},/obj/item/device/assembly/signaler{pixel_x = 6; pixel_y = 5},/obj/item/device/assembly/signaler{pixel_x = -2; pixel_y = -2},/obj/structure/table/glass,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurple"},/area/toxins/mixing) -"cxJ" = (/obj/machinery/light/small{dir = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/atmospherics/components/unary/vent_pump{on = 1},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel,/area/maintenance/asmaint2{icon_state = "toxtest"; name = "Toxins Launch Room"}) +"cxJ" = (/obj/machinery/disposal/bin,/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/sign/deathsposal{pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/incinerator) "cxK" = (/obj/machinery/power/apc{dir = 8; name = "Toxins Launch Room APC"; pixel_x = -25},/obj/structure/cable/pink{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/maintenance/asmaint2{icon_state = "toxtest"; name = "Toxins Launch Room"}) "cxL" = (/turf/simulated/floor/plasteel{icon_state = "warnwhite"},/area/toxins/mixing) "cxM" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "warnwhite"},/area/toxins/mixing) @@ -6646,7 +6646,7 @@ "cxP" = (/obj/structure/table/glass,/obj/structure/extinguisher_cabinet{pixel_y = -30},/obj/item/weapon/wrench,/obj/item/weapon/screwdriver,/turf/simulated/floor/plasteel{icon_state = "whitepurplecorner"},/area/toxins/mixing) "cxQ" = (/obj/item/device/assembly/timer{pixel_x = 5; pixel_y = 4},/obj/item/device/assembly/timer{pixel_x = -4; pixel_y = 2},/obj/item/device/assembly/timer{pixel_x = 6; pixel_y = -4},/obj/item/device/assembly/timer,/obj/structure/table/glass,/obj/machinery/firealarm{dir = 1; pixel_x = -3; pixel_y = -24},/obj/machinery/light_switch{name = "light switch "; pixel_x = 11; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitepurple"},/area/toxins/mixing) "cxR" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cxS" = (/obj/structure/cable/pink{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plasteel,/area/maintenance/asmaint2{icon_state = "toxtest"; name = "Toxins Launch Room"}) +"cxS" = (/obj/structure/cable/pink{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cxT" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/pink{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint2{icon_state = "toxtest"; name = "Toxins Launch Room"}) "cxU" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/pink{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cxV" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 8},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/mixing) @@ -6663,7 +6663,7 @@ "cyg" = (/obj/effect/landmark/start{name = "Chaplain"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/simulated/floor/carpet,/area/chapel/main) "cyh" = (/obj/structure/table/glass,/obj/machinery/button/massdriver{id = "toxinsdriver"; pixel_x = 25},/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor/plasteel,/area/maintenance/asmaint2{icon_state = "toxtest"; name = "Toxins Launch Room"}) "cyi" = (/obj/structure/sign/nosmoking_2{pixel_y = 32},/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 5},/area/medical/research{name = "Research Division"}) -"cyj" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/pink{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) +"cyj" = (/obj/structure/cable/pink{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/camera{c_tag = "Xenobiology Center"; dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/toxins/xenobiology) "cyk" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cyl" = (/obj/machinery/light{dir = 8},/obj/structure/cable/pink{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cym" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 1; on = 1},/obj/machinery/camera{c_tag = "Research Divison Access"; dir = 1; network = list("SS13","RD")},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"}) @@ -6672,7 +6672,7 @@ "cyp" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/pink{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/pink{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cyq" = (/obj/structure/cable/pink{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cyr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "whiteredcorner"; dir = 4},/area/medical/research{name = "Research Division"}) -"cys" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) +"cys" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 4},/turf/simulated/floor/plating/airless,/area/shuttle/escape) "cyt" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/pink{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "cyu" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"},/area/toxins/xenobiology) "cyv" = (/obj/machinery/camera{c_tag = "Xenobiology North"; dir = 6; network = list("SS13","RD")},/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 5},/area/toxins/xenobiology) @@ -6885,8 +6885,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaadaadaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaLHaLHaaeaaeaaeaaeaVcaVdaVeaQMaVfaQMaQMaVgaVhaViaViaVjaVkaVlaVmaVnaVoaQMaVpaQMaVqaVraVsaNoaNoaNoaVtaNoaNoaVuaVvaVwaTSblOaNoaVyaVzaVAaNsaNtaNuaJKaCdaDeaFZaSzaeHbmSaeHbmSbnQaeGaLaaLaaLaaRraRrbbsbhRaVCaVDaVDaVDaVDaVCaVDaVDaVCaTZaVEaVFaSIaVGaVHaSLaVIaVJaVKaVLaVMaVNaVOaVPaVQaVRaUqaVSaVTaVUaCdaVVaVWaVXaCdaVYaVZaWaaWbaWcaWdblRaWfaPoaWgaWhaQtaWiaLqaWjaWkaWlaWmaWmaWmaWnaLqaWoaFzaWpaWqaWraWsaWtaWuaWvaWwaWxaWsaWyaWzaWAaWBaWCaWDaTtaWEaVbaaaaaaaaaboHaeGaHHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaadaadaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaLHaLHaLHaaeaWFaaeaQLaQMaWGaOpaOpaOpaWHaJjaWIaWJaWKaJjaWLaQQaWMaWNaWOaQQaWPaWQaWRaWSaWTaRhaRhaRhaRhaRhaRhaRhaWUaWVaONaOObmGaWWaORaOSaWXaWYaHBaHCaCdaWZaXaaCdaeHbmSaeHbmSbnQaeHaaiaaiaXbaXcaXdaXebhUaVDaXgaXgaXgaVDaXgaXgaXgaVDaTZaXhaSIaSIaSIaSIaXiaSIaSIaSIaXjaXkaXlaXmaXnaXoaXpaUqaXqaXraXsaCdaXtaXuaXuaXvaXwaXxaXyaQpaQpaXzaQpaQpaPoaPoaPoaXAaPoaLqaLqaXBaLqaXCaXDaLqaLqaLqayRaFzaXEaXFaXFaRZaRZaXGaRXaRXaRXaRXaRXaRXaSaaXHaXIaWDaXJaXKaVbaVbaVbaeGboHaeGaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaadaadaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaLHaLHaLHaaeaXLaaeaQLaXMaXNaXOaXPaXQaXRaJjaJjaJjaJjaJjaXSaOpaXTaXUaXVaXWaJjaXXaXYaJjaXZaYaaYbaYcaYdaYeaYfaYfaYgaYhaQabmNaMcaMcaMcaQcaMaaYjaYkaYlaCdaDcaDeaCdaeHbnPaeHbnPbnQaeHaaaaaiaYmaRraYnaYoaYpaVDaXgaVDaVDaVDaVDaVDaXgaYqaTZaYraYsaNzaNzaYtaYuaYvaYwaSIaSIaYxaSLaYyaYzaYAaYBaUqaYCaCdaCdaCdaYDaPraCdaCdaYFaYGaYHaYIaYJaYKaYLbqObvHaYOaPoaYPaYQaYRaYSaYTaYUaYQaYQaYVaYWaPoayRaFzaWpaYXaFzaYYaYZaZaaZbaZcaZdaZeaZfaZgaSaaZhaZiaWDaQDaZjaZkaZlaVbaeHboHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaadaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaLHaLHaLHaaeaaeaQLaZmaZnaZoaZpaZqaZraJjaZsaZtaTDaLOaZuaOpaZvaZwaZwaZwaZwaZwaZwaZwaZwaZwaZxaZxaZyaZyaZyaZyaZzaZAaZBbeSaZDaZEaZFaZGaZHaZIaZJaZKaCdaDcaDeaCdaeHbmSaeHbmSbnQaeHaaaaaiaYmaRraYnaYoaYpaVDaXgaZLaUaaUbaUcaVDaXgaVDaTZaYraYsaZMaZNaZOaZPaVOaZQaZRaSIaZSaZTaZUaZVaZWaZXaZYaZZbaababbacbadbaebafbagbahaxRbaibajbakbalbambanbanbaobapbaqbaqbaqbaqbarbaqbaqbaqbaqbaqbasbataFzaWpbaubavbawbwQbaybazbazbaAbyEbaCbazaSabaDbaEbaFbaGbaHbaIbaJaVbaeHboHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaLHaLHaLHaLHaaeaPGbaKaOpbaLbaMbaNaPKbaObaPaPKaPKbaQaPLaPKbaRaZwbaSbaSbaTbaUbaVbaWbaWaZwbeObaYbaZbbabbbaZybbcbbdbbebbfbbgbbhbbhbbibbjbbkbblbbmaCdaDeaEfaCdaeGboGaeGboGbpxaeGaaiaHFaLabboczlczkczmaVCaVDaVDaSCcznaTZaVDaVDaVCaTZaYraYsaNzbbtbbubbvbbwaVNbbxbbybbzbbAbbBbbCbbDbbEbbFbbGbbHbbIbbJbbKbbIbbLbbGbbMbbNbbObajbakbanbbPbbQbbRbanbbSaYQaYQaYQbbTbyFaYQaYQaYQbbWbbXaPobbYaIUbbZbcabcbaYYbccbcdbazbcebazbaCbcfbcgbchbcibcjbckbclbcmbcnbcoaVbaeGboHaeHaeHaaaaaaaaaanWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaadaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaLHaLHaLHaaeaaeaQLaZmaZnaZoaZpaZqaZraJjaZsaZtaTDaLOaZuaOpaZvaZwaZwaZwaZwaZwaZwaZwaZwaZwaZxaZxaZyaZyaZyaZyaZzaZAaZBbeSaZDaZEaZFaZGaZHaZIaZJaZKaCdaDcaDeaCdaeHbmSaeHbmSbnQaeHaaaaaiaYmaRraYnaYoaYpaVDaXgaZLaUaaUbaUcaVDaXgaVCaTZaYraYsaZMaZNaZOaZPaVOaZQaZRaSIaZSaZTaZUaZVaZWaZXaZYaZZbaababbacbadbaebafbagbahaxRbaibajbakbalbambanbanbaobapbaqbaqbaqbaqbarbaqbaqbaqbaqbaqbasbataFzaWpbaubavbawbwQbaybazbazbaAbyEbaCbazaSabaDbaEbaFbaGbaHbaIbaJaVbaeHboHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaLHaLHaLHaLHaaeaPGbaKaOpbaLbaMbaNaPKbaObaPaPKaPKbaQaPLaPKbaRaZwbaSbaSbaTbaUbaVbaWbaWaZwbeObaYbaZbbabbbaZybbcbbdbbebbfbbgbbhbbhbbibbjbbkbblbbmaCdaDeaEfaCdaeGboGaeGboGbpxaeGaaiaHFaLabboczlczkczmaVCaVDaVDaSCcznaTZaVDaVDaVDaTZaYraYsaNzbbtbbubbvbbwaVNbbxbbybbzbbAbbBbbCbbDbbEbbFbbGbbHbbIbbJbbKbbIbbLbbGbbMbbNbbObajbakbanbbPbbQbbRbanbbSaYQaYQaYQbbTbyFaYQaYQaYQbbWbbXaPobbYaIUbbZbcabcbaYYbccbcdbazbcebazbaCbcfbcgbchbcibcjbckbclbcmbcnbcoaVbaeGboHaeHaeHaaaaaaaaaanWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaLHaLHaLHaLHaIiaIibcpbcqbcrbcsbctaJjaWIaWJaWKaJjbcubcvbcwaZwbcxbcybczbcybcybcybcybcAbcBbcCbcDbcEbcFbcGbcHbcIbcJbeTbcLbcMbcMbcNbcObcPaNuaJKaCdaDeaFZaSzaeHbmSaeHboGbnQaeHaaaaaiaYmaRraYnaYoaYpaVDaXgaVDbcQcztbcRaVDaXgaVDaTZaYraYsaNzbcSbcTaSLaSLbcUbcVaSIbcWbcXbcYbcZbdabdbbdcbddbdebdfbdgbdhbdibdjbdkbdlayebbObajbakbdmbdnbakbdmbyGaPobdpbdqbdrbdsbdtbdubdvbaqbdwbdxbdybdzaEBbbZbaubdAaRZbdBbdCbazbazbdDbdEbaCbdFaSabdGbdHbdIbdJbdKbdLbdMaVbaeHboHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaLHaLHaLHaLHaIiaIiaIiaIiaIiaIiaJjaJjaJjaJjaJjbdOaOpbdPaZwbdQbcybdSbdRbdTbdUbdVbdWbdXbdYbdZbeabebbecaPYbedbeeaMabefbegbefaQcaMabbkaHBaHCaCdaDeaFZaSzaeHbnPaeHbnPbnQaeHaaaaaiaYmaRraYnaYoaYpaVDaXgaVDaVDaVDaVDaVDaXgaVDaTZaYraYsaNzaNzbehbeibejbekaSIaSIbelbembenbeobepbeqaLaberaSIaSIbesbetbeuaSIaSIbevayebbObanbanbajbewbajbajbyHaPoaPoaPobeybeybezaPoaPoaYQbyIbeAaPobeBaUKbeCbeDbeEbeFbeGbdCbazbeHbeIbeJbyJbeLaSabeMbeNbpBbePaQDbcnbeQaVbaeHboHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaLHaLHaLHbiGbiGbiGbgibghbgjbeUbeVbeWbeXaJjaSlaOpbeYaZwbeZbcybfabfbbfbbfbbfbbfcbfdbfebffbfgbfhbfibfjbfkbflbfmaNobfnaNobfobfpbfqaHBaHCaCdaDeaFZaSzaeHbmSaeHbmSbnQaeHaaiaaiaXbbfrbfsbftaYpaVDaXgaXgaXgaVDaXgaXgbfuaVDaTZaXhaSIaSIaSIaSIbfvaSIaSIaSIbfwbfxbembfybfzbfAbfBaSIbfCaSIbfDbfEbfFbfGbfHbfIbfJayebbObanbfKbfLbfMbfNbfNbfNbfNbfObfPbfQbfRbfSbfTaPobfUbfVbfWaPobfXaHbbfYaXFaXFaRZaRZbfZaRXaRXaRXaRXaRXaRXaSabgabgbbgcbgdbgebgfbggaVbaeGboHaeGaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -6905,47 +6905,47 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaadaadaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaMaaMaaMaaMaaMaaMabnGbnKbqKbqLbqMbqNbzJbqPbqMbqQbqRbqSaNubqTbqUbqVbqWbqWbqXbqYaJPcwMaeGaeHaeHaeHaeHaeHaeGaHHaeHaeHaeHaeHaeHaeHaeGaeHaeHaeHaTwcrqaKYaMeaMeaKZaKYaMeaMeaKZaNwaMeaMeaMeaNwaMecseaIFbrabrabrabraaCdaUqbrbaCFbrcaUxbrdbpCbrebrfbrgbrhbpCbribrjbrkbrlbrmbqzbqxbpCbrnbrobpCbrpbpCbrqaHbbrrbkQaeHaeHaeHaeHaeHaeHaeHbkRbqJapjbrsbrtbrubrubrubrubrubrtaeGaeGbnQaeHaeHaeGaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaadaadaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbrwbrxbrybrzbnIbrAbrBbrCbrDbqfbqfbrEbrFbnKbrGbrHbfqaHBbrIbrJbrKbrLbrMbrNbrOcwQcwNaeGaeHaIyaIyaIyaeHaeGaeGaeHaeHaIyaIyaeHaeGaeGaeHaeHaeHaeHaeHaeGaHHaeGaeGaeGaeHaeHaeGaeHaeHaeHaeHaeHaeHaTwcrqbrRbrSbrTbrUaCdaCdbqraCFboOaPlbrVbpCbrWbrXbpDbpCbpCbpCbpCbpCbpCbpCbpCbpCbpCbpCbrYbpCbpCbpCbrZaFzbsabrsbrsbrsbrsbrsbrsbrsbrsbrsbsbbrsbrsbrtbrubrubrubrubscbrtaeGbnQbnQaeHaeHaeGaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaadaadaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbsdbsebsebsfbnIbsgboxbshbsibsjbskbslbskbskbnIbnIbsmaHBbsnaCdbsoaCdaCdaCdaCdaCdaCdaCdbspbspbspaCdaCdaCdaCdbspbspbspaCdaCdaCdaCdaCdbspbspbspaCdaCdaCdaCdbspbspbspaCdaCdaCdaCdaCdaCdbsqbsqbsqbsqbsrbssbstbsuaCdbsvbswaCFbkFayebrVbpCbsxbsybszbsybsAbsBbsCbsDbQKbsFbsGbsHbsybsIbsybsJbsKbpCbpGaFzbsLbsMbsNbsObsPbsQbsRbsSbsTbsTbsUbsTbsVbrtbrubrubrubrubrubrtaeHbnQaeHaeGaeGaHHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbrvbrvbrvbsWbrvbnIbsXboxbsYbsZbpqbtabtbbtbbtbbtcbtdbteaHBaHCaCdaDeaDeaDeaDeaDeaDeaDeaXabswbswbswbtfbhPbhPaXabswbswbswbtfaDcbtgaDeaXabswbswbswbtfaDeaDeaXabswbswbswbtfaDeaDeaDeaDebthbtibtjbtibtibtkbtlbtmbtnaCdbtoaDeaCFboOaVZaErbtpbtqbtrbtsbttbtrbtubttbtrbttbttbtrbtrbttbttbttbtvbtwbtxbtybtzbtAbrsbtBbtCbtDbtEbtFbtGbtHbtIbtJbsTbtKbtLbrubrubrubrubrubrtaeHbnQaeHaeHaeHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbtMbsebrvbsebtNbnIbnGbtObnIbsZbnKbtabtabtPbtabnKbnIbtQbtRbtSaCdbtTbtUbtTaCdaCdaCdaCdbtVbtWaSyaDeaDeaDeaDeaDeaDeaDeaDeaDeaDeaDeaDeaDeaDeaDeaDeaDeaDeaDebtXbtYaDeaDeaDeaDebtZaVWbuaaCdbrabrabrabubbtibucbudbtibthaDeaDeaCFbkFaJZbuebufbugbuhbuibujbuhbuibujbuhbukbujbuhbulbumbunbuobupbuqburbusbutbuubuvbuwbuxbuybuzbuAbuBbuBbuCbsTbuDbuEbrtbrubrubrubrubrubrtaeHbnQaeHaeHaeHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbuFbuGbuHbuIbuJbnIbuKbnIbnIbuLbnIbnIbnIbnIbnIbnIbnIbuMbuNbuOaCdaCdaCdaCdaCdbuPbuPaCdaCdaCdaCdbuQaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdbuRaCdaCdaCdbuPbuPbrabrabuSbuTbuUbraaCdaCdaCdaCFbuVbuWbuXbpCbuYbuZbvabvbbuZbvcbvbbvdbvabvbbvebvfbsybvgbsybvhbvibpCbvjbvkbvlbvmbsTbsTbsTbvnbvobuBbuBbvpbsTbvqbvrbrtbrubrubrubrubrubrtaeHbnQaeHaeHaeHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbrvbrvbrvbsWbrvbnIbsXboxbsYbsZbpqbtabtbbtbbtbbtcbtdbteaHBaHCaCdaDeaDeaDeaDeaDeaDeaDeaXabswbswbswbtfbhPbhPaXabswbswbswbtfaDcbtgaDeaXabswbswbswbtfaDeaDeaXabswbswbswbtfaDeaDeaDeaDebthbtibtjbtibtibtkbtlbtmbtnaCdbtoaDeaCFboOaVZaErbtpbtqbtrbtsbttbtrbtubttbtrbttbttbtrbtrbttbttbttbtvbtwbtxbtybtzbtAbrsbtBbtCbtDbtEbtFbtGbtHbtIbtJbsTbtKbtLbrubrubrubrubrubrtaeHbnQaeHaeGaeHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbtMbsebrvbsebtNbnIbnGbtObnIbsZbnKbtabtabtPbtabnKbnIbtQbtRbtSaCdbtTbtUbtTaCdaCdaCdaCdbtVbtWaSyaDeaDeaDeaDeaDeaDeaDeaDeaDeaDeaDeaDeaDeaDeaDeaDeaDeaDeaDebtXbtYaDeaDeaDeaDebtZaVWbuaaCdbrabrabrabubbtibucbudbtibthaDeaDeaCFbkFaJZbuebufbugbuhbuibujbuhbuibujbuhbukbujbuhbulbumbunbuobupbuqburbusbutbuubuvbuwbuxbuybuzbuAbuBbuBbuCbsTbuDbuEbrtbrubrubrubrubrubrtaeHbnQaeHaeGaeHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbuFbuGbuHbuIbuJbnIbuKbnIbnIbuLbnIbnIbnIbnIbnIbnIbnIbuMbuNbuOaCdaCdaCdaCdaCdbuPbuPaCdaCdaCdaCdbuQaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdaCdbuRaCdaCdaCdbuPbuPbrabrabuSbuTbuUbraaCdaCdaCdaCFbuVbuWbuXbpCbuYbuZbvabvbbuZbvcbvbbvdbvabvbbvebvfbsybvgbsybvhbvibpCbvjbvkbvlbvmbsTbsTbsTbvnbvobuBbuBbvpbsTbvqbvrbrtbrubrubrubrubrubrtaeHbnQaeHaeHaeHaeGaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbvsbvtbvubvvbvwbvxbvybvzbvzbvAbvBbvCbvDbvEbvFbvGbzKbvIbvJbvKbvLbRGbvMbvMbvNbvObvObvPbvQbvMbvMbvMbvMbvRbvSbvMbvMbvMbvTbvUbvVbvWbvXbvMbvMbvTbvMbvRbvLbvYbvZbwabwbbvMbvRbwcbwdbvMbvMbwebvObvObwfbvMbwgbwhbwibwjbwkbwlbvMbwmbwnbuNbwobpCbwpbrWbpCbwqbrWbpCbwrbrWbpCbwsbrWbpCbwtbwubwvbwwbwvbpCbwxbnYbwybrsbwzbsTbsTbsTbwAbwBbwCbwDbsTbsTbwEbtLbrubrubrubrubrubrtaeHbnQaeHaeHaeHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbwFbwGbrvbwHbwIbwJbwKbwKbwKbwKbwLbwMbwNbwObwPbwPbzLbwRbwSbwTbwUbwTbwTbwTbwTbwTbwVbwWbwTbwTbwTbwTbwTbwTbwUbwTbwTbwTbwXbwTbwYbwZbxabxbbxcbwXbwTbwTbwUbxdbwTbxebwTbwTbwTbxfbxgbxbbxbbxbbxbbxbbxhbxbbxibxjbwTbwTbxdbxebwTbxebwTbxkbxlbpCbxmbxnbpCbxobxnbpCbxpbxnbpCbxqbxnbpCbwvbwubwvbwwbxrbpCbxsbiobxtbxubxvbxwbxxbxxbxybxzbxxbxAbxBbsTbwEbrtbrubrubrubrubrubrtaeHbnQaeHaeGaeHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbrvbrvbrvbrvbxCbxDbrvbrvbrvbsebvBbxEbxFbxGbxHbxIbvBbxJbxKbxLbxLbxLbxLbxLbxMbxLbxNbxLbxLbxObxLbxPbxQbxQbxQbxQbxRbxSbxTbSkbxUbxVbxWbSybxYbxZbxXbxXbxXbyabxXbybbxXbxXbycbxXbydbxXbxXbxXbxXbxXbSJbyebyfbygbyhbyhbyibyfbyhbyfbyhbyjbykbpCbylbymbpCbylbynbpCbylbyobpCbylbypbpCbyqbyrbyqbwwbysbpCbytbyubyvbrsbrsbrsbrsbrsbrsbrsbrsbrsbrsbywbwEbrtbrubrubrubrubscbrtaeHbnQaeHaeGaeGaeGaeHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbsebyxbyybrvbyzbrvbsebvBbyAbyBbyCbxHbyDbzNbzMbzQbzObzTbzSbzNbzUbzNbzNbAPbzNbzNbzNbAQbAQbAVbAVbAQbAQbAQbAQbAQbAQbyQbyRbySbyTbyUbyTbyTbyTbyTbyVbyTbyWbyXbyYbyYbyYbyYbyYbyYbyYbyYbyYbyZbzabzbbzcbzdbzdbzebzfbzdbzfbzgbzabyZbzhbzhbzhbzhbzhbzhbzhbzhbzhbzhbzhbzhbzhbzhbzibpCbzjbzkbzkbzlbzmbznbzkbzobzpbzqaRYbzkbzsbztbzubzkbAXbzwbrtbrubrubrubrubrubrtaeGbnQaeHaeHaHHaeGaHHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbzxbzybzzbrvbzAbrvbsebvBbAYbzCbzDbzDbzEbBabAZbBcbBbbBbbBbbBebBdbzNbBhbDlbBgbBibzNbBkbBjbCjbBlbClbCkbCnbCmbCobAQbCqbzVbzWbyTbzXbzYbzZbAabAbbAcbyTbAdbAebyYbAfbAgbAhbAibAjbAkbAjbyYbAlbAmbAnbAobApbApbAqbArbApbArbApbAsbAtbzhbzGbAvbAwbzhbAxbAybAzbAAbABbACbADbAEbAFbAGbAHbAIbzkbzrbAubAJbAKbALbzobAMbzobANbzkbAObCvbCsbzkbrsbrsbrsbrsbrsbrsbrsbrsbrsaeHbnQaeHaeHaeHaeHaeHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbrvbrvbrvbrvbyzbrvbsebvBbARbASbATbxHbAUbzNbCwbDibDhbDhbDhbDkbDjbzNbEqbDnbDmbDobzNbDqbDpbDsbDrbDtbCkbDwbDubDxbAQbEkbBmbBnbyTbBobBpbBqbBpbBrbBsbyTbBtbBubyYbBvbBwbBxbBybAjbAjbBzbyYbApbApbBAbBBbApbApbBCbBDbBEbBFbBGbBHbBIbBJbBKbBLbBMbBNbBObBPbBQbBRbBSbBTbBUbBTbBVbBWbBXbAebzkbBYbBZbCabAKbzobzobCbbCcbzobCdbAObAObCebzkaabaabaabaabaabaabaabaaeaeGaeHbnQaeHaeHaeHaeHaeHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbrvbrvbsebvBbCfbCgbvBbChbCibzNbElbEmbElbEnbEnbEpbEnbzNbFAbDnbDmbHdbzNbEsbErbEubEtbDtbCkbExbEwbEybAQbCxbBmbCybCzbCAbBpbBpbBpbBpbCBbyTbCCbCDbyYbCEbCFbBxbCGbAjbAjbAjbyYbCHbBEbCIbCJbCJbCJbCKbCLbCMbCMbCNbArbCObzhbCPbCQbCRbzhbCSbCTbCUbAAbCVbBTbCWbBTbCXbzhbCYbAebzkbCZbBZbCabDabDbbzobDcbDdbDebzkbzkbzkbzkbzkaaeaabaabaabaabaabaabaaebnQbnQbnQaeHaeHaeHaeHaeHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbsebDfbyxbDgbzNbFpbEzbFrbFqbFtbFsbFvbFubFxbFwbFzbFybDnbDmbHfbzNbFCbFBbFCbFEbFGbFGbFCbFCbFCbAQbCxbBmbBnbDAbDBbBpbBpbBpbBpbBpbDCbCCbDDbyYbyYbyYbDEbyYbyYbyYbyYbyYbDFbApbDGbDHbDIbDJbDJbDKbDIbDLbDMbDNbDObDPbDQbBTbDRbzhbAxbCTbCUbAAbDSbDTbDUbDVbDWbzhbDXbAebzkbDYbDZbEabEbbEcbEdbEcbEcbEebEebEfbEgbEhbzkaaeaaeaabaabaabaabaaeaaeaeHaeGaeGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbEibEjbvAbDgbzNbFJbFHbFHbFHbFSbFKbGkbGkbGkbGkbGmbGlbHcbHbbUrbzNbUtbHebHhbHgbHjbHibHkbHibHmbHlbHpbBmbBnbyTbEAbEBbBpbBpbECbEDbyTbCCbEEbyYbEFbEGbEHbEIbEJbEKbELbEMbAqbApbDGbENbEObEPbApbEQbERbESbDMbETbEUbzhbEVbBTbEWbzhbAxbEXbEYbEZbFabFbbFcbFdbFebzhbFfbAebzkbFgbBZbCabFhbFibzobFibFibFjbzobFkbzobzobFlaaeaaeaaeaabaabaaeaaeaaeaeHaHHaHHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbzxbzybzzbrvbzAbrvbsebvBbAYbzCbzDbzDbzEbBabAZbBcbBbbBbbBbbBebBdbzNbBhbDlbBgbBibzNbBkbBjbCjbBlbClbCkbCnbCmbCobAQbCqbzVbzWbyTbzXbzYbzZbAabAbbAcbyTbAdbAebyYbAfbAgbAhbAibAjbAkbAjbyYbAlbAmbAnbAobApbApbAqbArbApbArbApbAsbAtbzhbzGbAvbAwbzhbAxbAybAzbAAbABbACbADbAEbAFbAGbAHbAIbzkbzrbAubAJbAKbALbzobAMbzobANbzkbAObCvbCsbzkbrsbrsbrsbrubrubrubrubrubrsaeHbnQaeHaeHaeHaeHaeHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbrvbrvbrvbrvbyzbrvbsebvBbARbASbATbxHbAUbzNbCwbDibDhbDhbDhbDkbDjbzNbEqbDnbDmbDobzNbDqbDpbDsbDrbDtbCkbDwbDubDxbAQbEkbBmbBnbyTbBobBpbBqbBpbBrbBsbyTbBtbBubyYbBvbBwbBxbBybAjbAjbBzbyYbApbApbBAbBBbApbApbBCbBDbBEbBFbBGbBHbBIbBJbBKbBLbBMbBNbBObBPbBQbBRbBSbBTbBUbBTbBVbBWbBXbAebzkbBYbBZbCabAKbzobzobCbbCcbzobCdbAObAObCebzkaabaabbrsbrsbrsbrsbrsbrsbrsaeHbnQaeHaeHaeHaeHaeHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbrvbrvbsebvBbCfbCgbvBbChbCibzNbElbEmbElbEnbEnbEpbEnbzNbFAbDnbDmbHdbzNbEsbErbEubEtbDtbCkbExbEwbEybAQbCxbBmbCybCzbCAbBpbBpbBpbBpbCBbyTbCCbCDbyYbCEbCFbBxbCGbAjbAjbAjbyYbCHbBEbCIbCJbCJbCJbCKbCLbCMbCMbCNbArbCObzhbCPbCQbCRbzhbCSbCTbCUbAAbCVbBTbCWbBTbCXbzhbCYbAebzkbCZbBZbCabDabDbbzobDcbDdbDebzkbzkbzkbzkbzkaaeaabaabaabaabaabaabaaeaeGaeGbnQaeHaeHaeHaeHaeHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbsebDfbyxbDgbzNbFpbEzbFrbFqbFtbFsbFvbFubFxbFwbFzbFybDnbDmbHfbzNbFCbFBbFCbFEbFGbFGbFCbFCbFCbAQbCxbBmbBnbDAbDBbBpbBpbBpbBpbBpbDCbCCbDDbyYbyYbyYbDEbyYbyYbyYbyYbyYbDFbApbDGbDHbDIbDJbDJbDKbDIbDLbDMbDNbDObDPbDQbBTbDRbzhbAxbCTbCUbAAbDSbDTbDUbDVbDWbzhbDXbAebzkbDYbDZbEabEbbEcbEdbEcbEcbEebEebEfbEgbEhbzkaaeaaeaabaabaabaabaaeaaecxebnQbnQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbEibEjbvAbDgbzNbFJbFHbFHbFHbFSbFKbGkbGkbGkbGkbGmbGlbHcbHbbUrbzNbMwbHebHhbHgbHjbHibHkbHibHmbHlbHpbBmbBnbyTbEAbEBbBpbBpbECbEDbyTbCCbEEbyYbEFbEGbEHbEIbEJbEKbELbEMbAqbApbDGbENbEObEPbApbEQbERbESbDMbETbEUbzhbEVbBTbEWbzhbAxbEXbEYbEZbFabFbbFcbFdbFebzhbFfbAebzkbFgbBZbCabFhbFibzobFibFibFjbzobFkbzobzobFlaaeaaeaaeaabaabaaeaaeaaeaeGaHHaHHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbFmbvAbFnbFobDgbzNbImbIjbInbFvbEobIobJqbJmbKnbJrbKqbKobKubKtbKvbzNbLBbLAbLDbLCbMqbMobMxbMwbNDbMybNEbBmbFLbyTbFMbFNbFObFPbFQbFRbNFbCCbCDbyYbFTbCFbBwbFUbFVbFWbFXbEMbAqbApbDGbENbApbApbApbArbApbFYbDMbETbFZbyZbyZbyZbyZbyZbyZbyZbGabzhbzhbGbbzhbzhbzhbzhbGcbAebzkbGdbBZbCabGebBZbBZbBZbBZbzobzobGdbGdbzobFlaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGfbGgbGhaabaabaacaacaacaacaacaacaacaacaacaacaacaacaadaadaadaadaadaadaadaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbrvbxDbrvbrvbGibGjbzNbzNbzNbzNbNGbzNbzNbzNbzNbzNbzNbzNbzNbNJbNIbNJbzNcpJbFCcpJbFCbFCbAVbNLbAVbAQbAQbGobBmbGpbyTbyUbyTbyTbyTbyTbyTbyTbGqbGrbyYbGsbBwbBwbGtbGubGvbELbEMbBCbGwbGxbzabzgbzgbGybzbbzgbzabGzbGAbGBbGCbyZbGDbGEbGEbGFbyZbGGbGHbGIbGJbGKbGLbGMbzhbCYbAebzkbGNbBZbCabGObGPbzobGQbGQbzobGRbzrbzrbGSbFlaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGfbGgbGhaabaabaacaacaacaacaacaacaacaacaacaacaacaacaadaadaadaadaadaadaadaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbrvbxDbrvbrvbGibGjbzNbzNbzNbzNbNGbzNbzNbzNbzNbzNbzNbzNbzNbNJbNIbNJbzNbFCbFCbFCbFCbFCbAVbNLbAVbAQbAQbGobBmbGpbyTbyUbyTbyTbyTbyTbyTbyTbGqbGrbyYbGsbBwbBwbGtbGubGvbELbEMbBCbGwbGxbzabzgbzgbGybzbbzgbzabGzbGAbGBbGCbyZbGDbGEbGEbGFbyZbGGbGHbGIbGJbGKbGLbGMbzhbCYbAebzkbGNbBZbCabGObGPbzobGQbGQbzobGRbzrbzrbGSbFlaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGTbGUbGVaabaabaabaabaabaabaacaacaacaacaacaacaacaadaadaabaabaabaabaabaabaadaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbGWbGXbGYbrvbGibGjbGZbHabsdbrvbsebsebsebOCbsdcqjbOEbOFbrvbOHbOGbOJbOIbOKbTDbPwbTDbPxbIpbVCbIpbPybIqbGobBmbHqbHrbHsbHtbHubHvbHwbHxbHubCCbAebyYbHybBwbBwbBwbHzbHAbELbEMbAqbApbHBbHCbHDbHEbHFbHGbHHbzgbHIbETbApbHJbHKbHLbHMbHNbHObHPbHQbBLbHRbBLbBLbHSbHTbzhbHUbAebzkbHVbBZbHWbHXbHYbHYbHYbHYbHZbGRbzrbIabGSbFlaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIbbIcbIdbGhbIebIebIebIebIeaabaabaabaadaadaadaadaadaadaabaabaabaaebIfaabaabaabaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbIgbsebGibIhbGibGjbIibsebsebrvbPzbRybRybPAbRybRybRybRybPBbPRbPQbQzbQwbQCbQAbPRbPRbQDbUBcghcarbQEbHnbHobQFbIsbItbIubIvbIwbIxbIybIzbHubCCbAebIAbBwbBwbBwbBwbHzbHAbELbEMbAqbApbIBbzgbICbIDbIEbIFbIGbzgbHIbIHbApbHJbIIbIJbIKbILbIMbINbIObIPbIQbIRbBTbBTbISbzhbHUbAebzkbITbBZbIUbIVbIWbzobIWbzobzobGRbIXbIYbGSbFlaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIZbJabGUbJbbJcbIebJdbJebJfbIeaabaabaabaabaabaabaabaabaabaabaabaaebJgaaeaaeaabaabaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbJhbIkbJibJjbJkbJlbsebsebRzbrvbJncobbRCbRCbRCbRCbRCbJobJobJobJpbREbRDbJobGnbGnbRFbYUbYTbRFbGnbGnbGnbJsbBmbGpbHrbJtbJubJvbJwbJxbJybHubCCbAebyYbJzbBwbJAbJBbJCbJDbJEbJFbJGbJHbJIbyZbJJbJKbJLbJMbJNbyZbHIbETbApbJObyZbJPbIKbApbHJbJQbJRbJSbIQbBTbBTbBTbBTbJTbHUbAebzkbJUbzrbGSbJVbJWbJWbJXbzobzobzobDYbDYbzobFlaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGhbJYbJZbKabKbbKcbKdbKebIeaabaabaabaabaabaabaabaabaabaabbKfbKfaaebKgaaeaabaabaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbrvbrvbrvbrvbrvbGibGjbKhbKibMtbrvbJnbsebRCbSAbSzbSBbJobSCbKrbKsbSDbSGbSFbJobSIbTobTobTwbTvbzPbzPbzRbTxbTzbBmbGpbHrbKwbKxbHubHubHubHubHubKybKzbKAbKBbKCbKCbKCbKDbKEbKFbyZbKGbKHbKIbyZbKJbKKbKLbKMbKNbyZbyZbKObKPbyZbyZbKQbKRbKSbKTbJQbKUbKVbKWbKXbKYbKZbLabzhbHUbAebzkbGRbIYbGSbzobLbbLcbLdbzrbLebLfbzobzobLgbzkaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaanWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGhbJYbJZbKabKbbKcbKdbKebIeaabaabaabaabaabaabaabaabaabaabbKfbKfaaebKgaaeaabaabaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbrvbrvbrvbrvbrvbGibGjbKhbKibMtbrvbJnbsebRCbSAbSzbSBbJobSCbKrbKsbSDbSGbSFbJobSIbUtbTobTwbTvbzPbUVbzRbTxbTzbBmbGpbHrbKwbKxbHubHubHubHubHubKybKzbKAbKBbKCbKCbKCbKDbKEbKFbyZbKGbKHbKIbyZbKJbKKbKLbKMbKNbyZbyZbKObKPbyZbyZbKQbKRbKSbKTbJQbKUbKVbKWbKXbKYbKZbLabzhbHUbAebzkbGRbIYbGSbzobLbbLcbLdbzrbLebLfbzobzobLgbzkaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaanWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabGhbLhbLibLjbIebLkbLlbLmbLnavbaaeaaeaaeaaebKfaaeaaeaaeaaeaaeaaebLobLpaaeaabaabaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfbrvbLqbLrbuGbLsbLtbLubLvbLtbLtbLtbLtbLwbsebRCbUqbTBbUxbJobLybLzbUzbUybUFbUAbJobUIbCtbVybVBbVAbWgbWfbWhbGnbGobBmbLEbHrbHUbKxbHubLFbLGbLHbHubLIbAebyYbLJbLKbBwbBwbHzbLLbyYbLMbLNbLObLPbyZbyZbLQbLRbzbbyZbyZbLSbLTbLUbLVbyZbyZbLWbLXbJQbJQbLYbLZbMabzhbzhbzhbzhbzhbHUbAebzkbzkbzkbzkbMbbzkbzkbzkbzkbzkbzkbzkbzkbzkbzkaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIebIebIebIebMcbIebMdbMebMfbMgbMhbMiaaebKfaaeaaeaabaabaabaabaabaaeaaeaaeaaeaabaabaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaabaabbrvbLqbMjbvtbMkbMlbMmbMnbIkbIkbIkbIkbWkbsebRCbWmbWlbWmbJobMubMvbWpbWobWqbMzbJobWrbCtbDvbCpbWsbCrbWubDzbXkbMAbBmbGpbHrbMBbMCbMDbMEbMFbMGbHubLIbAebMHbMIbMJbMKbMKbMLbMMbMNbMObMPbMQbMRbMSbMTbMUbMVbMWbMXbMYbMZbNabNbbNcbNdbNebNfbNgbNhbNibNjbNkbNcbNlbNmbNnbNobNpbMBbNqbNqbNqbNrbNqbNqbNqbNqbBXbNsbNtbNubNubNubNubNubNvbNvbNvbNvbNvbNvbNvbNvbNvbNvbNvbNvbNvbNvbNvcwRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIebIebNxbNybIebNzbIebIebIebIebIeavbbNAaaeaaeaabaabaabaabaabaabaabaabaabaabaabaabaabaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaabaabbrvbrvbrvbrvbrvbrvbrvbrvbsebsebsebsebNBbJobJobNHbXlbNHbJobXpbXobXrbXqbXsbNZbJobXtbCtbDvbYVbYibDybWubCubYWbGobBmbGpbHrbAebKxbHubNNbNObNPbHubNQbJxbNRbNSbNTbNUbNVbNWbNXbNYbOpbOabObbOcbOdbOebOfbOgbLUbLUbOhbOibOjbOkbMVbOlbOmbMVbMQbMVbMQbOnbMKbMKbMKbOobODbAebOqbOrbOrbOrbOrbOsbOrbOrbOrbOrbOtbOubHuaabaabaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOvbOwbLibKdbIebOxbOybOzbOAbIeaabaabaabaabaabaabaabaadaadaadaadaadaabaabaabaabaabaadaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaabaabaabbrvbKjbKkbKlbKmbYYbYXbrvbrvbrvbrvbrvbNBbJocamcaAcaqcaXbNKbNKbNKccScccbNKbOLbJocdObCtbEvceGcdYcfsceHcfwbXkbOMbONbOObHrbCDbKxbHubHubOPbHubHubKxbAebOQbOQbOQbOQbORbOQbOQbOQbOSbOTbOUbOSbOVbOSbOWbOXbOYbOZbOZbPabPkbPcbOYbPdbPebPfbPgbPhbLObPibPjbMKbPSbPlbPlbPlbPlbPlbPlbPlbPlbPlbPlbPlbPlbPlbHUbPmbHuaabaabaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPnbPobPpbPqbPrbPsbIebPtbPubIeaabaabaabaabaabaadaadaadaacaacaacaadaadaadaadaadaadaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaabaabaabaabbrvbsebsebLxbsebsebsebsebsebsebsebrvbNBbJocfxbNKbNKcglbNKbNKczibQBcgmcgGbPCbPDchwchAchAchAchAchAchVciPbTxbPEbBmbPFbHrbPGbPHbPIbPIbTIbTHbPIbPLbAebOSbPMbPNbPObPPckKckBbOSbQYbPTbPUbPVbPWbOSbNnbPXbPYbPXbNnbNnbPZbQabQbbQcbNnbNnbQdbMKbQebQfbMKbMKbQgbQhbQibQjbQkbPlbQlbQmbQnbQobQpbQqbQrbPlbHUbPmbHuaabaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQsbJcbJcbQtbIebQubIebIebIebIeaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaacaacaacaacaacaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbrvbMrbsebsebMsbsdbMtbsebsebsebsebPvbNBbJobJobJobJobJobJobJobJobJobJobJobJobJockMbFDcmRbFFcngbFIcnKcnLbGncnNbBmbQGbQHbQIbKzbKzbKzbKzbTJbKzbKzbKzbQLbQMbQNbQObQPbQQbQRbQSbQTbQUbQVbQWbQXbOSbScbQZbRabNlbRbbNnbRcbRdbRebRfbRgbNnbRhbRibLObMKbMKbMKbRjbRkbRlbRmbRnbRobRpbRqbRrbRsbRtbRubRvbPlbHUbPmbHuaabaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaibRwbIebIebIebGhbIeaabaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbrvbNCbsecopbrvbrvbrvbrvcorcorcorbrvbRxbMpbRybRybRybMpbMpcosbQxbRAbRBcoAbRBcoPbQxbQxcpnbQxbQxccNcbPceIbGnbGobBmbGpbUEbUEbUEbUEbUEbAebKxbOSbOSbOSbOSbRHbRIbRIbRIbRJbRKbRLbRIbRMbRNbRIbRObOSbRPbMKbRQbMKbRRbPXbRSbRTbRQbRUbRVbNnbRWbRXbRYbRZbSabSbbTFbPlbSdbSebSfbSgbShbSibSjcvKbSlbSmbSnbSobSpbSqbSrbSsbSsbSsbSsaeFaeFbStaeFbStbStbStbSubStbStbStaeFbStbStbStbStaeFaeFaeFaeFaeFaeFbSvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaajaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbrvbOBbsecpNbrvbPbcgDbrvcqnbsebsebrvbNBcqocqobQxbQxbQxbQxbSwbQxbSxcqpcqLcqKcvYcgFcwycwbbSEbQxbIpcgHcwzbIqbGobBmbGpbUEbUGbWwbWwbUEbAebKxbOSbSKbSLbSMbSNbSObSPbSPbSPbSQbSRbSSbSTbSUbSVbSWbSRbSXbOnbQfbMKbRRbPXbSYbRTbMKbRUbSZbTabTabTbbTcbTbbTabTdbTabPlbPlbPlbPlbTebTfbTgbThbTibTjbTkbTlbPlbTmbTnbHuaabaabaabaabaaeaaeagnaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeagnaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbrvbLxbsebsebPvbsebsebQvbsebsebsebrvbNBcpucxqbTpbTqbTrbTsbTtbTsbTucxrcxsbTybTybTybTycxtbTAcxubOIbZfcxvbTEbYubWxckEbZxcmkclwcmlbUEcoccoabOSbTKbRIbTLbRIbRIbRIbRIbTMbTNbTObTPbRIbTQbRMbTRbTObTSbPibPjbMKbRRbPXbSYbTUbTVbTWbTXbTYbTZbUabUbbUcbUdbTacxwbPlbUfbUgbUhbUibUjbUkbUlbQpbQpbQpbQpbPlbHUbUmbHuaabaabaabaaeaaeaaeagmaaebUnbUobUpaaebUnbUobUpaaebUnbUobUpaaeagmaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaaeaaebrvbrvbrvbrvbrvbsebsebrvbKpbKpbKpbrvbNBcpucxqbTpbTqbTqcvLbUscvMbUubTybTybTycxybUvbUwcxzcxBcxAcxCcdUcxDbHnbHobUCbUDbUEcxEbUXcvRcvQbJxcvSbOSbUHcxFbUJbUKbULbUMbRIbUNbUObOSbUPbUQbURbUSbUTbOSbUUbUVbUWbWebUYbNnbUZbVabVbbRUbMKbVcbVdbVdbVebVdbVfbTabVgbPlbVhbVibVjbVkbVlbRmbVmbVnbVobVpbVqbPlbHUbUmbHuaabaabaabaaeaaeaaeagmaaebUnbVrbUpaaebUnbVrbUpaaebUnbVrbUpaaeagmaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIebIebNxbNybIebNzbIebIebIebIebIeavbbNAaaeaaeaabaabaabaabaabaabaabaabaabaabaabaabaabaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaabaabbrvbrvbrvbrvbrvbrvbrvbrvbsebsebsebsebNBbJobJobNHbXlbNHbJobXpbXobXrbXqbXsbNZbJobXtbCtbDvbYVbYibDybWubCubYWbGobBmbGpbHrbAebKxbHubNNbNObNPbHubNQbJxbNRbNSbNTbNUbNVbNWbNXbNYbOpbOabObbOcbOdbOebOfbOgbLUbUWbOhbOibOjbOkbMVbOlbOmbMVbMQbMVbMQbOnbMKbMKbMKbOobODbAebOqbOrbOrbOrbOrbOsbOrbOrbOrbOrbOtbOubHuaabaabaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOvbOwbLibKdbIebOxbOybOzbOAbIeaabaabaabaabaabaabaabaadaadaadaadaadaabaabaabaabaabaadaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaabaabaabbrvbKjbKkbKlbKmbYYbYXbrvbrvbrvbrvbrvbNBbJocamcaAcaqcaXbNKbNKbNKccScccbNKbOLbJobWebCtbEvccxcdYcfsceHcfwbXkbOMbONbOObHrbCDbKxbHubHubOPbHubHubKxbAebOQbOQbOQbOQbORbOQbOQbOQbOSbOTbOUbOSbOVbOSbOWbOXbOYbPcbOZbPabPkbPcbOYbPdbPebPfbPgbPhbLObPibPjbMKbPSbPlbPlbPlbPlbPlbPlbPlbPlbPlbPlbPlbPlbPlbHUbPmbHuaabaabaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPnbPobPpbPqbPrbPsbIebPtbPubIeaabaabaabaabaabaadaadaadaacaacaacaadaadaadaadaadaadaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaJfaabaabaabaabbrvbsebsebLxbsebsebsebsebsebsebsebrvbNBbJocfxbNKbNKcglbNKbNKczibQBcgmcgGbPCbPDchwchAchAchAchAchAchVciPbTxbPEbBmbPFbHrbPGbPHbPIbPIbTIbTHbPIbPLbAebOSbPMbPNbPObPPckKckBbOSbQYbPTbPUbPVbPWbOSbNnbPXbPYcdObNnbNnbPZbQabQbbQcbNnbNnbQdbMKbQebQfbMKbMKbQgbQhbQibQjbQkbPlbQlbQmbQnbQobQpbQqbQrbPlbHUbPmbHuaabaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQsbJcbJcbQtbIebQubIebIebIebIeaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaJfaJfaacaacaacaacaacaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbrvbMrbsebsebMsbsdbMtbsebsebsebsebPvbNBbJobJobJobJobJobJobJobJobJobJobJobJobJockMbFDcmRbFFcngbFIcnKcnLbGncnNbBmbQGbQHbQIbKzbKzbKzbKzbTJbKzbKzbKzbQLbQMbQNbQObQPbQQbQRbQSbQTbQUbQVbQWbQXbOSbScbQZbRabRdbRbbNnbRcbRdbRebRfbRgbNnbRhbRibLObMKbMKbMKbRjbRkbRlbRmbRnbRobRpbRqbRrbRsbRtbRubRvbPlbHUbPmbHuaabaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaibRwbIebIebIebGhbIeaabaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbrvbNCbsecopbrvbrvbrvbrvcorcorcorbrvbRxbMpbRybRybRybMpbMpcosbQxbRAbRBcoAbRBcoPbQxbQxcpnbQxbQxccNcbPceIbGnbGobBmbGpbUEbUEbUEbUEbUEbAebKxbOSbOSbOSbOSbRHbRIbRIbRIbRJbRKbRLbRIbRMbRNbRIbRObOSbRPbMKbRQbRTbRRbPXbRSbRTbRQbRUbRVbNnbRWbRXbRYbRZbSabSbbTFbPlbSdbSebSfbSgbShbSibSjcvKbSlbSmbSnbSobSpbSqbSrbSsbSsbSsbSsaeFaeFbStaeFbStbStbStbSubStbStbStaeFbStbStbStbStaeFaeFaeFaeFaeFaeFbSvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaajaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbrvbOBbsecpNbrvbPbcgDbrvcqnbsebsebrvbNBcqocqobQxbQxbQxbQxbSwbQxbSxcqpcqLcqKcvYcgFcwycwbbSEbQxbIpcgHcwzbIqbGobBmbGpbUEbUGbWwbWwbUEbAebKxbOSbSKbSLbSMbSNbSObSPbSPbSPbSQbSRbSSbSTbSUbSVbSWbSRbSXbOnbQfbRTbRRbPXbSYbRTbMKbRUbSZbTabTabTbbTcbTbbTabTdbTabPlbPlbPlbPlbTebTfbTgbThbTibTjbTkbTlbPlbTmbTnbHuaabaabaabaabaaeaaeagnaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeagnaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbrvbLxbsebsebPvbsebsebQvbsebsebsebrvbNBcpucxqbTpbTqbTrbTsbTtbTsbTucxrcxsbTybTybTybTycxtbTAcxubOIbZfcxvbTEbYubWxckEbZxcmkclwcmlbUEcoccoabOSbTKbRIbTLbRIbRIbRIbRIbTMbTNbTObTPbRIbTQbRMbTRbTObTSbPibPjbRTbRRbPXbSYbTUbTVbTWbTXbTYbTZbUabUbbUcbUdbTacxwbPlbUfbUgbUhbUibUjbUkbUlbQpbQpbQpbQpbPlbHUbUmbHuaabaabaabaaeaaeaaeagmaaebUnbUobUpaaebUnbUobUpaaebUnbUobUpaaeagmaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaaeaaebrvbrvbrvbrvbrvbsebsebrvbKpbKpbKpbrvbNBcpucxqbTpbTqbTqcvLbUscvMbUubTybTybTycxybUvbUwcxzcxBcxAcxCcdUcxDbHnbHobUCbUDbUEcxEbUXcvRcvQbJxcvSbOSbUHcxFbUJbUKbULbUMbRIbUNbUObOSbUPbUQbURbUSbUTbOSbUUcoxceGcpJbUYbNnbUZbVabVbbRUbMKbVcbVdbVdbVebVdbVfbTabVgbPlbVhbVibVjbVkbVlbRmbVmbVnbVobVpbVqbPlbHUbUmbHuaabaabaabaaeaaeaaeagmaaebUnbVrbUpaaebUnbVrbUpaaebUnbVrbUpaaeagmaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVsbVtbVtbVtbVsaabaabaabaabaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaecpAcpBcpBbVubVubVubVubVubNBcpucxqbTpbTqbVvbTsbVwbTsbVxcxrcxsbTybTybTybVzcxGcxIcxHbIpbVCbVDbIqbGobVEbHqbUEbUEbUEbUEbUEbAebKxbOSbOSbOSbOSbOSbOSbOSbVFbOSbOSbOSbOSbOSbOSbVGbOSbOSbVHbVIbNnbNnbNnbNnbVJbVKbVLbVMbVNbVObVPbVQbVRbVSbVTbTabUebPlbVUbVUbVUbVUbVVbVWbVmbVXbRlbVYbVZbPlbWabUmbHuaabaabaabaaeaaeaaeagmaaebUnbVrbUpaaebUnbVrbUpaaebUnbVrbUpaaeagmaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtbVtbWbbWcbWbbVtbVtaabbVtbVtbVtbVtaaeaaeaaeaaebWdaaeaaeaaeaaebWdcpAbVubVubVubXjcxJbVucxKbWicqocqobQxbQxbQxbQxbWjbQxcxMcxLcxLcxLcxNbWncxPcxOcxQbQxbIpbVCbIpbIqbGobBmbGpbHrbWtcxRbWvbCDcbzcoabAebAebAebAebAebAebWybAebAebAebAebNobVIbWzbWAbWBbWzbWCbWDbVIbWEbWFbNnbWGbWHbWIbWJbWKbWLbWMbWNbWObVdbWPbTabWQbPlbWRbWSbWTbVkbWUbWVbWWbWXbWYbWUbWZbXabXbbXcbHuaabaabaabaabaaeaaeagmaaebUnbVrbUpaaebUnbVrbUpaaebUnbVrbUpaaeagmaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtbVtbWbbWbbWbbWbbWbbVtbVtbVtbXdbXebXfbXgbXgbXgbXgbXgbXgbXgbXgbXgbXgbXgbXhbXibXhbXNcxSbXmcxTbXnbIkbIkbIkbIkbIkbIkcxUbQxcxWcxVcxXcxXbQxbQxbQxcxYbWjcpnbIpbVCbIpbIqbOMbXubXvbXwbXxbXybXybXybXzbXAbXBbXBbXBbXCbXBbXBbXDbXBbXBbXBbXBbXEbXFbXGbXHbXIbXJbXKbXJbXLbXJbXJbNnbXMbMKbMKbMKbTTbVOcekbVdbXObVdbXPbTabXQbPlbXRbXSbXTbUibXUbXVbXWbUibXXbXYbXZbPlbYabCCbYbbYbbYbbYbbYcaaeaaeagmaaebUnbVrbUpaaebUnbVrbUpaaebUnbVrbUpaaeagmagmagmagmaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtbVtbWbbWcbWbbVtbVtaabbVtbVtbVtbVtaaeaaeaaeaaebWdaaeaaeaaeaaebWdcpAbVubVubVubXjcsRbVucxKbWicqocqobQxbQxbQxbQxbWjbQxcxMcxLcxLcxLcxNbWncxPcxOcxQbQxbIpbVCbIpbIqbGobBmbGpbHrbWtcxRbWvbCDcbzcoabAebAebAebAebAebAebWybAebAebAebAebNobVIbWzbWAbWBbWzbWCbWDbVIbWEbWFbNnbWGbWHbWIbWJbWKbWLbWMbWNbWObVdbWPbTabWQbPlbWRbWSbWTbVkbWUbWVbWWbWXbWYbWUbWZbXabXbbXcbHuaabaabaabaabaaeaaeagmaaebUnbVrbUpaaebUnbVrbUpaaebUnbVrbUpaaeagmaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtbVtbWbbWbbWbbWbbWbbVtbVtbVtbXdbXebXfbXgbXgbXgbXgbXgbXgbXgbXgbXgbXgbXgbXhbXibXhbXNctabXmcxTbXnbIkbIkbIkbIkbIkbIkcxUbQxcxWcxVcxXcxXbQxbQxbQxcxYbWjcpnbIpbVCbIpbIqbOMbXubXvbXwbXxbXybXybXybXzbXAbXBbXBbXBbXCbXBbXBbXDbXBbXBbXBbXBbXEbXFbXGbXHbXIbXJbXKbXJbXLbXJbXJbNnbXMbMKbMKbMKbTTbVOcekbVdbXObVdbXPbTabXQbPlbXRbXSbXTbUibXUbXVbXWbUibXXbXYbXZbPlbYabCCbYbbYbbYbbYbbYcaaeaaeagmaaebUnbVrbUpaaebUnbVrbUpaaebUnbVrbUpaaeagmagmagmagmaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtbVtbWbbWbbWbbWbbWbbWbbWbbVtbVtbYdbYebVtaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaebQybQybVubYfbYgbVubVubYhbYhbYhbYhbYhbYhbYhcxZbIqbIqbIqbIqbIqbIqbYjbYkcyabYlbYkbYkbYmbYnbYobYpbYqbYrbHrbHrbHrbYsbYsbYsbYtbYsbYsbYscembYsbYsbYsbYsbYsbYsbYsbPmbVIbWzbWAbXJbWzbXJbXJbVIbYvbYwbNnbYxbRZbYybYzbYAbTabYBbYCbYDbYEbYFbTabTabPlbPlbPlbPlbPlbPlbPlbPlbPlbPlbPlbPlbPlbYabCCbYGbYHbYIbYJbYcbYcbYcaaeaaeaaebYKaaeaaeaaebYKaaeaaeaaebYKaaeaaeaaeaaeaaeagnaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtbVtbWbbWbbYLbYMbWbbYLbYMbWbbWbbVtbYNbVtbVtaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaebQybYObYPbYQbYRbYScqmcqNcybcydcycbYZbZabZbbTDbZcbZdbZebTDbTDbTDbTDcxvbZfbTDbTDbTCbZgbIqbGobBmbGpbHrbZhbZibYsbZjbZkbZlbYsbZmbZnbZobZpbZnbYsbZnbZqbZrbYsbPmbVIbWzbZsbXJbWzbXJbZtbVIbZubZvbNnbNnbNnbJTbNnbNnbTabTabTabZwbTabTabTacvUbZybZzbZAbZBbZCbOrbOrbOrbOrbOrbOrbOrbOrbZDbZEbZFbZGbZHbZIbZJbZKbZJbZLbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZNbZObZObZPaaeagmaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtbVtbWbbWbbWbbZQbZRbZSbZTbZUbWbbWbbZVbZWbZXbVtaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaebZYbQybZZcaacabcaccadcaebIpbIpbIpcafcagcahcaibIpcajcakcalcyecancaocapcyfcarcarcarcasbIpbIqcatbBmcaubHrbHrbHrbYscavcawcaxbYscaycazcygcaBbZncaCbZnbZrbZrbYsbPmbVIbWzcaDcaEbWzbXJcaFbVIbVIbVIbVIbAecaGbAebAebAecaHbAebAebLIbAebAebAebAebLIbAebAebAecaIcaJcaKcaLcaMcaMcaMcaMcaMcaNcaObYbcaPcaQcaRbYcbYcbYcaaeaaeaaecaSaaeaaeaaecaSaaeaaeaaecaSaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaadaadaadaacaacaadaadaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVsbVtbWbbWbbYLcaTcaUbZRbZSbZTcaVcaTcaTcaTcaTcaWbVsaaeaaeaaeaaebWdaaeaaeaaeaaebWdaaeaaebQycyhcaacaYcaZbVucaecbacbbcbccbdcbecbfcbgbIpcbhbYhcbibYhcbjbYhbYhcbkcblbYhbYhbYhbYhbIqcbmbBmcbnbHrcbocbpbYscbqbZncbrbYscbscbtcbucbvcbwbYsbZncbxbZrbYsbPmbVIbVIbVIbVIbVIbVIbVIbVIcbycbzbOrbOrcbAbOrbOrbOrbOrbOrbOrcbAbOrbOrbOrbOrcbBcbCcbCcbCcbCcbDcbEcbFcbGcbGcbGcbGcbGcbGcbGbYbbYbbYbbYbbYcaaeaaeagmaaebUncbHbUpaaebUncbHbUpaaebUncbHbUpaaeagmagmagnaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaadaadaadaadaacaacaacaadaadaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtbWbbWbbWbbZVcbIcbIcbJbZScbKcbIcbIcbIcbIcbIcbLbVtaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaebQycbMcbNcbNcbObVucaebIpcbQcbRcbdcbecahcbSbIpcbTbYhcbUcbVcbWcbXcbYcbZbIpbYhccaccbcyibIqccdbONbTGcceccfccgbYscbscchcciccjcckcclccmccnccobYsbYsbYsbYsbYsccpccqbOrbOrbOrbOrbOrbOrbOrcbAcbBbAeccrccrccrccrccrccrccrccrccrccrccrbHuccsbHucbCcctccuccvccwccxccycbGcczccAccBccCccDccEccEcbGaaeaaeaaeaaeaaeagmaaebUncbHbUpaaebUncbHbUpaaebUncbHbUpaaeagmaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaadaadaadaadaacaacaacaadaadaadaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtccFbWbbWbbWbbZSbZSccGccHbZSbZSbZSbZSbZSbZSbZSccIavbavbavbavbavbavbavbavbavbavbavbavbccJccKccLccLccMbVucwAccOccPccPccPccQccRcyjcarccTccUccVccWccXccYcbYccZbTDcdacdbbTDcdccddcdebBmbTGbHrcdfcdgbYscbqcdhcdicdjcdkcdlcdmbZncdnbYscdocdpcdqbYscdrcdsbAebCDcdtcducykbAebAebAebAecdvccrcdwcdwcdwcfacfbcfccdycdycdyccrcdzbAecdAcbCcdBcdCcdDcctcdEcdFcdGcdHcdIcdJcdJccDccEccEcbGaaeaaeaaeaaeaaeagmaaebUncbHbUpaaebUncbHbUpaaebUncbHbUpaaeagnaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaadaadaadaadaacaacaacaadaadaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtbWbbWbbWbbZVcbIcbIcbJbZScbKcbIcbIcbIcbIcbIcbLbVtaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaebQycbMcbNcbNcbObVucaebIpcbQcbRcbdcbecahcbSbIpcbTbYhcbUcbVcbWcbXcbYcbZbIpbYhccaccbcyibIqccdbONbTGcceccfccgbYscbscchcciccjcckcclccmccnccobYsbYsbYsbYsbYsccpccqbOrbOrbOrbOrbOrbOrbOrcbAcbBbAeccrccrccrccrccrccrccrccrccrccrccrbHuccsbHucbCcctccuccvccwcxJccycbGcczccAccBccCccDccEccEcbGaaeaaeaaeaaeaaeagmaaebUncbHbUpaaebUncbHbUpaaebUncbHbUpaaeagmaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaadaadaadaadaacaacaacaadaadaadaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtccFbWbbWbbWbbZSbZSccGccHbZSbZSbZSbZSbZSbZSbZSccIavbavbavbavbavbavbavbavbavbavbavbavbccJccKccLccLccMbVucwAccOccPccPccPccQccRcxScarccTccUccVccWccXccYcbYccZbTDcdacdbbTDcdccddcdebBmbTGbHrcdfcdgbYscbqcdhcdicdjcdkcdlcdmbZncdnbYscdocdpcdqbYscdrcdsbAebCDcdtcducykbAebAebAebAecdvccrcdwcdwcdwcfacfbcfccdycdycdyccrcdzbAecdAcbCcdBcdCcdDcctcdEcdFcdGcdHcdIcdJcdJccDccEccEcbGaaeaaeaaeaaeaaeagmaaebUncbHbUpaaebUncbHbUpaaebUncbHbUpaaeagnaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaadaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtbWbbWbbWbbYLcdKcdKcdLbZScdMcdKcdKcdKcdKcdKcdKbVtaaeaaeaaeaaeaaeaaeaaeaaecdNcdNcdNcdNbQybVubVubVubVubVubYhbYhcahcahcbfcahbYhcylbIpcbTbYhcdPcdQcdRcdScbYcdTcdUcdVcdWcdXcymbIqcdZbBmbTGbYsbYsbYsbYsbYsbYsbYsbYsbYsceacebceccedbYsceebYscefccrccrcegcehccrccrccrccrccrccrccrccrccrccrceiceYcljcelcfTcelcgxcfSceoccrcdvbNocepcbCcctceqcercescescetceucevceucewcdJccDccEccEcbGaaeaaeaaeaaeaaeagmaaebUncbHbUpaaebUncbHbUpaaebUncbHbUpaaeagmaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVsbVtbWbbWbbZVbZWbZXbZRbZSbZTcexbZWbZWbZWbZWceybVsaaeaaeaaeaaebWdaaeaaeaaecdNcezcezceAcezcezceBceCceCceCceBbSHbIpceDceEceFcyncyobIpcbTbYhcbicwBcbibYhbYhceJceKbYhbYhceLbYhbIqceMbBmbUDbYsceNceOcePceQbYsbZnbZnceRceSbZobZnceTceUbZnbZnbZnccrceVceWcelcdxceXcfUceZceZceZcelcelcdxcelcelcfdcelcelchccelcelcfebIrccrcfgcfgcfgcbGcbGcbCcbCcbCcbCcbCcbGcbGcbGcbGcbGcbGcbGcbGcbGaaeaaeaaeaaeaaeagmaaebUncfhbUpaaebUncfhbUpaaebUncfhbUpaaeagmaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtbVtbWbbWbbWbbZQbZRbZSbZTbZUbWbbWbbYLcaTcaUbVtaabaaeaaeaaeaaeaaeaaeaaecdNcficfjcfjcfkcflcfmcflcflcflcfncfocfocfpcfqcfrcfqcypcfqcftcfucfvcyqcyrcfycfzcfAbVCbYhcfBcfCcfDbIqbGobBmcfEbYscfFcawcckcfGcfHcfIcckcckcfJcfKcfLcfMcfNcfOcfOcfOccrcfPcfQcfRcfRcfRcfRcfRcfRcfRcfRcfRcfRcfRcfRcfVcfRcfRcencfRcfWcenchgchdcelcfXcfYchTaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeagnaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtbVtbWbbWbbZVcgabWbbZVcgabWbbWbbVtbVtbVtbVtaabaabaabaaeaaeaaeaaeaaecdNcgbcgbcgbcgccgdcgdcgecgfcficeBbIpbIpcggcdUcghcgicyscarcarcgjcgkcytcarcarbUBcarcasbYhcfCcfCcfDbIqbGobBmbGpcecbZnbZncgncdicgocdiczjcdicgpcgqbZncgrcgscfOcgtcguccrcgvcgwcelcelcelcelcelcelcelcelcnXciDciNciMciEciMciMciMciMciFciMciMciGcelcgBcfYchTaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeagmagmagnaaeagmagmagmagmagmagmagmagmaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtbVtbWbbWbbZVcgabWbbZVcgabWbbWbbVtbVtbVtbVtaabaabaabaaeaaeaaeaaeaaecdNcgbcgbcgbcgccgdcgdcgecgfcficeBbIpbIpcggcdUcghcgicghcarcarcgjcgkcytcarcarbUBcarcasbYhcfCcfCcfDbIqbGobBmbGpcecbZnbZncgncdicgocdiczjcdicgpcgqbZncgrcgscfOcgtcguccrcgvcgwcelcelcelcelcelcelcelcelcnXciDciNciMciEciMciMciMciMciFciMciMciGcelcgBcfYchTaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeagmagmagnaaeagmagmagmagmagmagmagmagmaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtbVtbWbbWbbWbbWbbWbbWbbWbbVtbVtaabaabaabaabaabaabaabaabaabbrvbrvcdNcdNcdNcdNcyIcdNcdNcdNcdNcdNcdNcgEcbiczccbjcgEbIqbIqbIqbIqbIqbIqcggbIpbIpbVCcgIcgJbYhcfBcgKcfDbIqcgLbBmcgMcgNcgOcgPcgQcgPcgRcgPcgPcgPcgScgPcgPcgTcfOcfOcgUcgVccrcgWcgXcgYcgZcgZcgZcgZcffcgZcgZcejchaciHciLcejcgZcgZcgZcgZchbcgZciOcjCcelcgBcfZccraaeaaeaaeaaeaaeaaeavbaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtbVtbWbbWbbWbbWbbWbbVtbVtaabaabaabaabaabaabaabaabaabaabbrvchkchlchlchlbrvchmchnchochpchpchqchrcyuchschuckHcyvchxchychzchzchzchncywchBchBchCchBchBchDchDchDchDchDbGochEchFchGbZncfOchHcfOchIcfOcfOcfOchJchKcfOcfOcfOcfOchLchMccrcelcgwcgzchNchOchOchOchOchOchOchOcgzcjCchOchOchOchOchOchOchQchOciRcjCcelcgBcfYccraaeccrccrccrccrccraaecgCaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbVtbVtbWbchWbWbbVtbVtaabaabaabaabaabaabaabaabaabaabaabbrvchXchYchYchYbrvbsechnchZciachzcibciccidciecifcigcihciicijchzchzcikchncyxchBcilcimcinchBciocipciqciqchDbCxcirciscitcgOcgOciucgOcitcivbZnbZnciwcfNbZncixcfNcfOcgtcguccrcelcgwcgzciychOcizciAciBciCciCchOcgzcjCchOcjAcjDcjBciIciJciKchOckccjIcgZckgchechfcyychfclpcllclqccraaeagnaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -6954,7 +6954,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaabaabaabaabaabaabbrvbrvbrvbrvbLxckDbLxbsebsebrvckichlchlchlbrvbsechnchochpchpckjckkciYchtciZchvcjacklckmchzchzchzchncyxchBcknckocjgckpchBckqckrckschDcktckuckvbYsbYsbYsbYsbYsbYsbYsbYsbYsbYtbYsbYsccrccrccrccrccrccrcelcgwcgzcgwcelcjvckwckwckwcjycmVcnucmWchTclmclncelcelcelclochOcnWcjCcelcgBcfYccraaeccrccrccrccrccrchScjEaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaabaabaabaabaabbrvckCclzbrvbsebsebsebsebsebrvbrvbrvbrvbrvbrvbsechnchZciachzckFcicckGchtcjJchvckIciickJchzchzcikchncyAcyBckLcyCckNckOchBckrckrckPchDckQckRckSckTckUckUckUckVckWckXckYckZclaclbclccldcleclfclgclhclicnYchbcljcgwchOclkclkcoqclkclkchOchPcelchTcmbcmccelcelcmdcmechOcnWcjCcelcgBcfZccraaeaaeaaeaaeaaeaaeaaeagmaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbrvbLxcvVclxbsebsebLxckDclyclAcxaclBbrvbsebsebsechnchzchzchzclCclDciYcyDcnfchvcjacjbclFchpchpcjdchnbGichBclGclGclGclHchBckrclIclJclKclLclMclNclOclOclOclOclOclOclOclOclPclQclRclSclTclUclVclWclXclYclVclZcmacgwchOchOchOchOchOchOchOcnZclVcmKcmLcmMcmNcmOcmOcmPchOcowcjCcelcgBcrhccraaeccrccrccrccrccraaeagmaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbrvbrvbrvbrvbsebsebLxckhbsebsecvWbsebrvbsechnchnchnchnchnchnchnchnciYcyDcnFcnEcoxcjHcjHcjHcjHcjHchnbGichBcmncmncmncmnchBckrckrckrchDcmrcmscmtcmucmvcmvcmvcmvcmvcmvcmvcmucmwcmxcmyccrcmzcmAcmBcmCchOcjzcfQcfRcgychOcmEcmFcmFcmGcmHchOcmIcjzchOchTchTckdchTchTchOchOcpjcoyciMcplcpmciQcyEciQchhchichjccraaeagmaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbrvbrvbrvbrvbsebsebLxckhbsebsecvWbsebrvbsechnchnchnchnchnchnchnchnciYcyDcnFcnEcyjcjHcjHcjHcjHcjHchnbGichBcmncmncmncmnchBckrckrckrchDcmrcmscmtcmucmvcmvcmvcmvcmvcmvcmvcmucmwcmxcmyccrcmzcmAcmBcmCchOcjzcfQcfRcgychOcmEcmFcmFcmGcmHchOcmIcjzchOchTchTckdchTchTchOchOcpjcoyciMcplcpmciQcyEciQchhchichjccraaeagmaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbrvbLxcmXcmYbsebsebLxckhbsecmZcnacxbbrvbsechnchzchzcnbchzchncnccndcnecmmcnGclEcjacnhcnichzchzchzchnbGichBcnjcmncnkcmnchBcmocmpcmqchDcnlcnmcnncmvaabaaeaaeaaeaaeaaeaabcmvcmwcnocnpcnpcnqcnrcnscntchOcnvclZcnwcnwcnxcnwcnwcnwcnwcnwcnxcnwcnycelcelcelcelcelcelcelcpocpscppcqccqacfYchTaaechTchUchjchjccraaecjEaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbrvcnzcnAbrvbsebsebsebsebsebLxbLxbLxbrvbsechnchzchzchzchzchncnBcnCcnDcnHcolcnHckIciicnIchzchzcikchnbGichBchBchBchBchBchBchDchDchDcqocyFckRcmtcmvaabaabaaeaaeaaeaaeaaecmvcnOcnPcnQcnRcnScnTcnUcnVchOcelcfQcqxcelcmhcmDcmDcmDcricmDcmDcmDcmDcmDcmDcmDcmDcmDcmDcmDcuUcnXcvEcwacvTcmTcmUcyGcmUcwdchjchjccraaeagmaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabbrvbrvbrvbrvbsebsebsebsebsecvXcobbsebQvbsechncodchzcoecofcogcohcoicokcojchtcojcjacjbcoochpchpcjdchnbGibsebsecyHbsebsebsecnJbsecyJczdcnMcyKcmtcotcmvcmvcmvcmvcmvcmvcmvcmucnOcnPcoucovcelcelcelcpKcwccfRcgXcelcelcwecwfciMciMcwgciNciMciMciNciMciMciMciNciMciMciMciNcmWcelcwhcgBcfYccraaeccrccrccrccrccraaecgCaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -6967,17 +6967,17 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaaeaaeaaeaaeagmagmagmagnagmaaecqRaaeaaeaaeaaeaaecqdcqecqecqecqecrrbsebsebrvbrvbrvbrvbrvcxkcxlbsecxncxmcqZbsecxlbKicqjbrvbrvbrvbrvcrscrtcruaeHaeHaeHcrscrtcruaeGaeGaeGcrscrtcruaeHaeHaeHcrscrtcruaaaaaaaeHaeGaHHaeGaeGaeGaeGaeGcwPcrEcrFcrGcwPcwScwUcwTcwPcrvcrwcrxcwPcrycrzcrAcwPcrBcrCcrDcwPaeHaeHccrccrccrccraeHaeHaeGcxeaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaecqRaaeaaeaaeaaeaaeaaeaaeagnaaebrvbrvbrvbrvbrvaaaaaaaaabrvbrvbrvcpucpucpucpucpubrvbrvbrvbrvaaaaaacxocrHcrmcrIaeHaeHaeHcrHcrmcrIaeGaeGaeGcrHcrmcrIaeHaeHaeHcrHcrmcrIaaaaaaaeHaeHaeGaHHaHHaeGbnQaeGcwPcrPcrWcrQcwPclvcmjcwVcwPcrJcrTcrKcwPcrLcrUcrMcwPcrNcrVcrOcwPaeHaeHaeGaeHaeHaeHaeHaeHcxfcxgaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaabaaeaaeaaeagmaaecrRcrRcrRcrRcrRaaecqRaaecrRcrRcrRcrRcrRaaeagmaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsQcsPcsPczecsSczecsTaeHaeHcsUcsVcsUaeHaeHaeHcsUcsWcsUaeHaeHcsQcsXcsYcsXcsTaaaaeHaeHaeGaeHaeGaeHaHHaeGcwPcrPcrPcrPcwPclvclvclvcwPcrJcrJcrJcwPcrLcrLcrLcwPcrNcrNcrNcwPaeHaeHaeGaeHaeHaeHaeHaeHaeGcxeaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaabaabaabaaeaaeaaeaaeagnaaecrXcrYcrYcrYcrYcrZcqRcqScsacsacsacsacsbaaeagmaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactacsZctcctbctectdctfcsTaeHcsUctgcsUaeHaeHaeHcsUctgcsUaeHaeHcticthctkctjctiaaaaeHaeHaHHaeHaeHaeHboHaeGcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPaeHaeHaeGaeHaeHaeHaeHaeHaeGcxgaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaabaabaabaaeaaeaaeaaeagnaaecrXcrYcrYcrYcrYcrZcqRcqScsacsacsacsacsbaaeagmaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyscsZctcctbctectdctfcsTaeHcsUctgcsUaeHaeHaeHcsUctgcsUaeHaeHcticthctkctjctiaaaaeHaeHaHHaeHaeHaeHboHaeGcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPcwPaeHaeHaeGaeHaeHaeHaeHaeHaeGcxgaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaabaabaabaaeaaeaaeaaeaaeaaeagmaaecsccsccsccsccscaaecqRaaecsccsccsccsccscaaeagmaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsQcsXctlctmctectectectfctncsXctoctgctpctqctqctqctoctgctpcsXcsXctcctrctkctjctfcsTaeHaeHaeHaeHaeHaeHcxhaeGaeGaeGaeGaeGaeGaeGaeGaeGaeGaeGaeGaeGaeGaeGaeGaeGaeGaeGaeGaeGaeGaeGaeGcxhaeGaeGaeGaeGaeGaeGcxeaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeagmaaeaaeaaeaaeaaeaaeaaecqRaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactacsZctictsctectectectucttctwctvctgctxctxctxctxctxctgctyctActzczecthctkctjctfctncsTaeHaeHaeHaeHaeHcxhbnQaeGaHHcxhaeGbnQcxhcxhbnQaeGbnQaeGcxicxhcxhbnQcxhbnQbnQaHHbnQcxhaeGbnQaeGbnQcxgcxicxgcxecxecxeaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeagmaaeaaeaaeaaeaaeaaeaaecqRaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyscsZctictsctectectectucttctwctvctgctxctxctxctxctxctgctyctActzczecthctkctjctfctncsTaeHaeHaeHaeHaeHcxhbnQaeGaHHcxhaeGbnQcxhcxhbnQaeGbnQaeGcxicxhcxhbnQcxhbnQbnQaHHbnQcxhaeGbnQaeGbnQcxgcxicxgcxecxecxeaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeagmaaecrRcrRcrRcrRcrRaaecqRaaecrRcrRcrRcrRcrRaaeagmaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactfcsXctncsXcsXcsXcsXctBctgctgctgctgctgctgctgctgctgctgctgctgctgctCctkctkctkczectDctiaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaacaacaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeagmaaecrXcrYcrYcrYcrYcrZcqRcqScsacsacsacsacsbaaeagmaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczectFctEctHctGctJctIctKctgctMctLctLctLctLctgctLctLctLctLctNctgczectOctkctkctCctkczeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeagnaaecsccsccsccsccscaaecqRaaecsccsccsccsccscaaeagmaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczectEctEctQctPctSctRctTctgctMctUctUctUctUctgctUctUctUctUctNctgctVcsXcsRcsXcsXczectcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaacaacaacaacaacaacaacaacaacaacaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeagnaaecsccsccsccsccscaaecqRaaecsccsccsccsccscaaeagmaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczectEctEctQctPctSctRctTctgctMctUctUctUctUctgctUctUctUctUctNctgctVcsXczecsXcsXczectcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaacaacaacaacaacaacaacaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeagmaaeaaeaaeaaeaaeaaeaaecqRaaeaaeaaeaaeaaeaaeaaeagnaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczectWctEctYctXcuactZcubctgctMctxctxctxctxctgctxctxctxctxctNctgczecucctgctgcudctgczeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaacaacaacaacaacaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeagmaaecrRcrRcrRcrRcrRaaecqRaaecrRcrRcrRcrRcrRaaeagmaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactfcsXcsPcsXcsXcsXcsXctmctgctgctgctgctgctgctgctgctgctgctgctgctgcuectgctgctgcsRcufctiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaajaacaacaacaacaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaecrXcrYcrYcrYcrYcrZcqRcqScsacsacsacsacsbaaeagmaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactacsZcticugctgctgctgcuhctgcuictyctEcujctLctLctLcukctEculctwctzczectgctgcumctfcsPcunaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaacaacaacaacaacaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeagmaaecrRcrRcrRcrRcrRaaecqRaaecrRcrRcrRcrRcrRaaeagmaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactfcsXcsPcsXcsXcsXcsXctmctgctgctgctgctgctgctgctgctgctgctgctgctgcuectgctgctgctqcufctiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaajaacaacaacaacaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaecrXcrYcrYcrYcrYcrZcqRcqScsacsacsacsacsbaaeagmaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyscsZcticugctgctgctgcuhctgcuictyctEcujctLctLctLcukctEculctwctzczectgctgcumctfcsPcunaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaecsccsccsccsccscaaecsfaaecsccsccsccsccscaaeagmaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuocsXctlcsPcuhcsPcuhctlcsPcsXcsXcsXcsXctqctqctqcsXcsXcsXcsXcsXctccupctgcuqctfcunaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeagmaaeaaeaaeaaeaaeaaeaaecsgaaeaaeaaeaaeaaeaaeaaeagmaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactacsZctccurcticurctfcunaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacticuscuucutctiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeagmaaeaaeaaeaaeaaeaaeaaecsgaaeaaeaaeaaeaaeaaeaaeagmaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyscsZctccurcticurctfcunaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacticuscuucutctiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeagmagmagnagmagmaaeagmaaecsgaaeaaeagmagnagmagmagmagmaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuoctnctnczecuvczecunaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuocsXczecsXcunaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeagmaaecshaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeagmaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/BirdStation/BirdStation.dmm b/_maps/map_files/BirdStation/BirdStation.dmm index 45d8a10038c..8f8a80e0b8c 100644 --- a/_maps/map_files/BirdStation/BirdStation.dmm +++ b/_maps/map_files/BirdStation/BirdStation.dmm @@ -2656,7 +2656,7 @@ "aZe" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/obj/item/weapon/reagent_containers/spray/plantbgone,/turf/simulated/floor/plasteel/white,/area/maintenance/fore{name = "Security Maintenance"}) "aZf" = (/obj/structure/closet/crate/secure/hydrosec{req_access_txt = "35"},/obj/item/seeds/kudzuseed{potency = 0; production = 8},/obj/item/seeds/chilighost,/obj/item/seeds/deathberryseed,/obj/item/device/gps,/turf/simulated/floor/plasteel/white,/area/maintenance/fore{name = "Security Maintenance"}) "aZg" = (/obj/structure/cable/cyan{icon_state = "1-2"},/obj/machinery/camera/autoname{icon_state = "camera"; dir = 5},/turf/simulated/floor/wood,/area/security/brig) -"aZh" = (/obj/structure/closet/secure_closet/detective,/obj/item/device/camera{desc = "A one use - polaroid camera. 30 photos left."; name = "detective's camera"; pictures_left = 30},/turf/simulated/floor/wood,/area/security/brig) +"aZh" = (/obj/structure/closet/secure_closet/detective,/obj/item/device/camera/detective,/turf/simulated/floor/wood,/area/security/brig) "aZi" = (/obj/structure/table/wood,/turf/simulated/floor/wood,/area/security/brig) "aZj" = (/obj/machinery/computer/pandemic{layer = 2.5; pixel_x = -4},/turf/simulated/floor/plasteel/white,/area/medical/virology) "aZk" = (/obj/structure/reagent_dispensers/virusfood{density = 0; pixel_y = -32},/turf/simulated/floor/plasteel/white,/area/medical/virology) diff --git a/_maps/map_files/DiscStation/DiscStation.dmm b/_maps/map_files/DiscStation/DiscStation.dmm index c8331e17407..ab1a53129e4 100644 --- a/_maps/map_files/DiscStation/DiscStation.dmm +++ b/_maps/map_files/DiscStation/DiscStation.dmm @@ -3922,7 +3922,7 @@ "bxv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel,/area/hallway/primary/port) "bxw" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/filingcabinet,/obj/machinery/light/small{dir = 1},/obj/machinery/light_switch{pixel_y = 25},/obj/machinery/camera{c_tag = "Detective's Office"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) "bxx" = (/obj/structure/closet/secure_closet/detective,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) -"bxy" = (/obj/structure/table/wood,/obj/machinery/light/small{dir = 8},/obj/item/weapon/book/manual/wiki/security_space_law,/obj/item/device/camera{desc = "A one use - polaroid camera. 30 photos left."; name = "detective's camera"; pictures_left = 30},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) +"bxy" = (/obj/structure/table/wood,/obj/machinery/light/small{dir = 8},/obj/item/weapon/book/manual/wiki/security_space_law,/obj/item/device/camera/detective,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) "bxz" = (/obj/structure/table/wood,/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/item/device/taperecorder{pixel_x = 3; pixel_y = 0},/obj/item/weapon/storage/box/evidence,/obj/item/device/flashlight/seclite,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) "bxA" = (/obj/structure/transit_tube{dir = 2; icon_state = "N-SW-SE"; tag = "icon-E-SW-NW"},/turf/space,/area/space) "bxB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/port) diff --git a/_maps/map_files/DreamStation/dreamstation04.dmm b/_maps/map_files/DreamStation/dreamstation04.dmm index f8e009cb76c..e3db186bcc3 100644 --- a/_maps/map_files/DreamStation/dreamstation04.dmm +++ b/_maps/map_files/DreamStation/dreamstation04.dmm @@ -934,8 +934,8 @@ "arX" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/turf/simulated/wall,/area/maintenance/atmos_control) "arY" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/obj/machinery/meter,/turf/simulated/wall,/area/maintenance/atmos_control) "arZ" = (/obj/effect/spawner/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/atmos_control) -"asa" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/wall,/area/maintenance/atmos_control) -"asb" = (/obj/structure/cable/green{tag = "icon-1-2"; icon_state = "1-2"},/obj/item/device/assembly/mousetrap/armed,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/atmos_control) +"asa" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/obj/structure/cable/green{tag = "icon-4-8"; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/atmos_control) +"asb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/plating,/area/maintenance/atmos_control) "asc" = (/obj/machinery/light/small{dir = 8},/obj/machinery/power/apc{auto_name = 1; dir = 8; name = "Autoname APC West"; pixel_x = -25; pixel_y = 0},/obj/structure/cable/green,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "asd" = (/obj/machinery/atmospherics/components/binary/pump{dir = 2; name = "atmospherics mix pump"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "ase" = (/obj/machinery/atmospherics/components/binary/valve{dir = 1; name = "Incinerator to Space"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) @@ -1004,7 +1004,7 @@ "atp" = (/obj/item/weapon/wirecutters,/turf/space,/area/space/nearstation) "atq" = (/obj/structure/cable/green{tag = "icon-1-2"; icon_state = "1-2"},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering) "atr" = (/turf/simulated/floor/plating/airless{dir = 1; icon_state = "warnplate"},/area/space/nearstation) -"ats" = (/obj/structure/lattice,/obj/item/stack/tile/plasteel,/turf/space,/area/space/nearstation) +"ats" = (/obj/structure/cable/green{tag = "icon-1-2"; icon_state = "1-2"},/obj/item/device/assembly/mousetrap/armed,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/atmos_control) "att" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/engine/engineering) "atu" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engineering) "atv" = (/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"; tag = ""},/area/engine/engineering) @@ -1489,7 +1489,7 @@ "aCG" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2o_sensor"},/turf/simulated/floor/engine/n20,/area/atmos) "aCH" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent/roomfiller{valve_open = 1},/turf/simulated/floor/engine/n20,/area/atmos) "aCI" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine/n20,/area/atmos) -"aCJ" = (/obj/item/trash/popcorn,/turf/simulated/floor/plating,/area/maintenance/atmos_control) +"aCJ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/atmos_control) "aCK" = (/turf/simulated/wall/rust,/area/maintenance/atmos_control) "aCL" = (/obj/effect/spawner/lootdrop{loot = list(/obj/item/stack/sheet/metal = 1, /obj/item/stack/rods = 2, /obj/item/weapon/shard = 2, "" = 3); lootcount = 2; name = "random material damage spawner"},/turf/simulated/floor/plating,/area/maintenance/atmos_control) "aCM" = (/obj/item/stack/sheet/metal{amount = 2},/obj/structure/girder/displaced,/turf/simulated/floor/plating,/area/maintenance/atmos_control) @@ -1561,7 +1561,7 @@ "aEa" = (/obj/machinery/atmospherics/components/binary/pump{dir = 0; name = "Port Mix to Temperature Ports"; on = 0},/turf/simulated/floor/plasteel,/area/atmos) "aEb" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = "n2o"; on = 1},/turf/simulated/floor/plasteel{dir = 10; icon_state = "escape"},/area/atmos) "aEc" = (/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "n2o_in"; pixel_y = 1},/turf/simulated/floor/engine/n20,/area/atmos) -"aEd" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/atmos_control) +"aEd" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/atmos_control) "aEe" = (/turf/simulated/wall/mineral/wood,/area/maintenance/atmos_control) "aEf" = (/obj/structure/girder/displaced,/obj/effect/spawner/lootdrop{loot = list(/obj/item/stack/sheet/metal = 1, /obj/item/stack/rods = 2, /obj/item/weapon/shard = 2, "" = 3); lootcount = 2; name = "random material damage spawner"},/turf/simulated/floor/plating,/area/maintenance/atmos_control) "aEg" = (/obj/structure/reagent_dispensers/watertank,/obj/structure/cable/green{tag = "icon-2-5"; icon_state = "2-5"},/turf/simulated/floor/plating,/area/maintenance/fore) @@ -1627,7 +1627,7 @@ "aFo" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 4},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/atmos) "aFp" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 8},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/atmos) "aFq" = (/obj/machinery/atmospherics/pipe/simple/green/visible,/turf/simulated/floor/plasteel/warning{dir = 8},/area/atmos) -"aFr" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/atmos_control) +"aFr" = (/obj/item/trash/popcorn,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/atmos_control) "aFs" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"; tag = "icon-wood-broken"},/area/maintenance/atmos_control) "aFt" = (/obj/structure/bed/chair/comfy/black,/turf/simulated/floor/wood,/area/maintenance/atmos_control) "aFu" = (/obj/structure/bed/chair/comfy/beige,/turf/simulated/floor/wood,/area/maintenance/atmos_control) @@ -1686,7 +1686,7 @@ "aGv" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; id_tag = "tox_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos) "aGw" = (/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos) "aGx" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos) -"aGy" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/atmos_control) +"aGy" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/atmos_control) "aGz" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/turf/simulated/floor/wood,/area/maintenance/atmos_control) "aGA" = (/obj/structure/table/wood/poker,/turf/simulated/floor/carpet,/area/maintenance/atmos_control) "aGB" = (/obj/structure/table/wood/poker,/obj/item/toy/cards/deck{pixel_x = 2},/turf/simulated/floor/carpet,/area/maintenance/atmos_control) @@ -2143,8 +2143,8 @@ "aPk" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = "co2"; on = 1},/turf/simulated/floor/plasteel{tag = "icon-caution (SOUTHWEST)"; icon_state = "caution"; dir = 10},/area/atmos) "aPl" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4; initialize_directions = 12},/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/atmos) "aPm" = (/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "co2_in"; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos) -"aPn" = (/obj/effect/spawner/structure/window/reinforced,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/turf/simulated/floor/plating,/area/maintenance/atmos_control) -"aPo" = (/obj/structure/cable/green{tag = "icon-1-4"; icon_state = "1-4"},/obj/structure/cable/green{tag = "icon-1-2"; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/atmos_control) +"aPn" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/atmos_control) +"aPo" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/atmos_control) "aPp" = (/obj/structure/cable/green{tag = "icon-4-8"; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/atmos_control) "aPq" = (/obj/structure/cable/green{tag = "icon-2-8"; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/spawner/lootdrop{loot = list(/obj/item/stack/sheet/metal = 1, /obj/item/stack/rods = 2, /obj/item/weapon/shard = 2, "" = 3); lootcount = 2; name = "random material damage spawner"},/turf/simulated/floor/plating,/area/maintenance/atmos_control) "aPr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"},/area/maintenance/atmos_control) @@ -2453,7 +2453,7 @@ "aVi" = (/obj/machinery/atmospherics/pipe/simple,/obj/machinery/meter{frequency = 1443; id = "mair_in_meter"; name = "Mixed Air Tank In"},/obj/structure/grille,/turf/simulated/wall/r_wall,/area/atmos) "aVj" = (/obj/machinery/atmospherics/pipe/simple,/obj/machinery/meter{frequency = 1443; id = "mair_out_meter"; name = "Mixed Air Tank Out"},/obj/structure/grille,/turf/simulated/wall/r_wall,/area/atmos) "aVk" = (/obj/structure/rack,/obj/item/weapon/stock_parts/capacitor,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/atmos_control) -"aVl" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/atmos_control) +"aVl" = (/obj/structure/girder,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/atmos_control) "aVm" = (/obj/structure/cable/green{tag = "icon-1-2"; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg3"},/area/maintenance/atmos_control) "aVn" = (/obj/effect/spawner/structure/window/reinforced,/obj/structure/cable/green{tag = "icon-0-4"; icon_state = "0-4"},/turf/simulated/floor/plating,/area/storage/tech) "aVo" = (/turf/simulated/floor/plasteel/darkblue/side{tag = "icon-darkblue (SOUTHWEST)"; icon_state = "darkblue"; dir = 10},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/robotics{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/mecha_control{pixel_x = 1; pixel_y = -1},/obj/structure/cable/green{tag = "icon-6-9"; icon_state = "6-9"},/obj/structure/cable/green{tag = "icon-6-8"; icon_state = "6-8"},/obj/structure/cable/green{tag = "icon-1-6"; icon_state = "1-6"},/turf/simulated/floor/plasteel/warningline{tag = "icon-warningline (SOUTHWEST)"; icon_state = "warningline"; dir = 10},/area/storage/tech) @@ -2563,7 +2563,7 @@ "aXo" = (/obj/machinery/atmospherics/components/unary/vent_pump/high_volume{dir = 1; external_pressure_bound = 0; frequency = 1443; icon_state = "in"; id_tag = "air_out"; internal_pressure_bound = 2000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) "aXp" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/atmos_control) "aXq" = (/obj/structure/cable/green{tag = "icon-2-4"; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg2"},/area/maintenance/atmos_control) -"aXr" = (/obj/structure/cable/green{tag = "icon-4-8"; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plating,/area/maintenance/atmos_control) +"aXr" = (/obj/structure/cable/green{tag = "icon-6-8"; icon_state = "6-8"},/obj/structure/cable/yellow{tag = "icon-4-9"; icon_state = "4-9"; d1 = 4; d2 = 8},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering) "aXs" = (/turf/simulated/floor/plasteel/darkblue/side{tag = "icon-darkblue (NORTH)"; icon_state = "darkblue"; dir = 1},/obj/structure/cable/green{tag = "icon-4-10"; icon_state = "4-10"},/obj/structure/cable/green{tag = "icon-4-8"; icon_state = "4-8"},/obj/machinery/light/small,/turf/simulated/floor/plasteel/warningline{tag = "icon-warningline (NORTH)"; icon_state = "warningline"; dir = 1},/area/storage/tech) "aXt" = (/turf/simulated/floor/plasteel/darkblue/side{tag = "icon-darkblue (NORTH)"; icon_state = "darkblue"; dir = 1},/obj/structure/cable/green{tag = "icon-2-5"; icon_state = "2-5"},/obj/structure/cable/green{tag = "icon-2-9"; icon_state = "2-9"},/obj/structure/cable/green{tag = "icon-2-4"; icon_state = "2-4"},/obj/structure/cable/green{tag = "icon-2-8"; icon_state = "2-8"},/obj/structure/cable/green{tag = "icon-1-2"; icon_state = "1-2"},/turf/simulated/floor/plasteel/warningline{tag = "icon-warningline (NORTH)"; icon_state = "warningline"; dir = 1},/area/storage/tech) "aXu" = (/turf/simulated/floor/plasteel/darkblue/side{tag = "icon-darkblue (NORTH)"; icon_state = "darkblue"; dir = 1},/obj/structure/cable/green{tag = "icon-6-8"; icon_state = "6-8"},/obj/structure/cable/green{tag = "icon-4-8"; icon_state = "4-8"},/obj/machinery/camera{c_tag = "Secure Technical Storage"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel/warningline{tag = "icon-warningline (NORTH)"; icon_state = "warningline"; dir = 1},/area/storage/tech) @@ -3095,9 +3095,9 @@ "bhA" = (/obj/effect/spawner/structure/window,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/engine/break_room) "bhB" = (/obj/machinery/door/airlock/maintenance{name = "maintenance access"; req_access_txt = "12"},/obj/structure/cable/green{tag = "icon-1-2"; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/aft) "bhC" = (/turf/simulated/wall,/area/hallway/primary/central) -"bhD" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (WEST)"; dir = 8},/turf/simulated/floor/plasteel,/area/hallway/primary/central) -"bhE" = (/obj/machinery/door/firedoor,/obj/structure/cable/green{tag = "icon-1-2"; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plasteel,/area/hallway/primary/central) -"bhF" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/central) +"bhD" = (/obj/structure/cable/yellow{icon_state = "4-8"; d1 = 4; d2 = 8},/turf/simulated/floor/plating/airless,/area/engine/engineering) +"bhE" = (/obj/structure/cable/green{tag = "icon-1-2"; icon_state = "1-2"},/obj/structure/cable/yellow{icon_state = "4-8"; d1 = 4; d2 = 8},/turf/simulated/floor/plating/airless,/area/engine/engineering) +"bhF" = (/obj/structure/cable/yellow{icon_state = "4-8"; d1 = 4; d2 = 8},/turf/simulated/floor/plating/airless{dir = 1; icon_state = "warnplate"},/area/engine/engineering) "bhG" = (/turf/simulated/wall,/area/hallway/primary/fore{name = "Fore Starboard Hallway"}) "bhH" = (/obj/machinery/door/airlock/maintenance{name = "maintenance access"; req_access_txt = "12"},/obj/structure/cable/green{tag = "icon-1-2"; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/atmos_control) "bhI" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/hallway/primary/fore{name = "Fore Starboard Hallway"}) @@ -3726,7 +3726,7 @@ "btH" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/machinery/requests_console{department = "Detective's Office"; name = "Detective's Office RC"; pixel_x = -30; pixel_y = 0},/obj/effect/landmark/start{name = "Detective"},/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 1; on = 1},/obj/machinery/light_switch{pixel_y = -24; tag = "s"},/turf/simulated/floor/carpet,/area/security/detectives_office) "btI" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/carpet,/area/security/detectives_office) "btJ" = (/obj/structure/closet/secure_closet/detective,/obj/machinery/newscaster{hitstaken = 0; pixel_x = 0; pixel_y = -32; tag = "s"},/turf/simulated/floor/carpet,/area/security/detectives_office) -"btK" = (/obj/structure/table/wood,/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = -26},/obj/item/device/camera{desc = "A one use - polaroid camera. 30 photos left."; name = "detectives camera"; pictures_left = 30},/obj/item/device/taperecorder{pixel_y = 0},/turf/simulated/floor/carpet,/area/security/detectives_office) +"btK" = (/obj/structure/table/wood,/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = -26},/obj/item/device/camera/detective,/obj/item/device/taperecorder{pixel_y = 0},/turf/simulated/floor/carpet,/area/security/detectives_office) "btL" = (/obj/structure/table/wood,/obj/item/weapon/hand_labeler,/turf/simulated/floor/carpet,/area/security/detectives_office) "btM" = (/obj/effect/spawner/structure/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/brig) "btN" = (/obj/machinery/door/window/brigdoor{dir = 1; id = "Cell 1"; name = "Cell 1"; req_access_txt = "2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel/darkred/side{tag = "icon-darkred (NORTH)"; icon_state = "darkred"; dir = 1},/area/security/brig) @@ -6735,7 +6735,7 @@ "czA" = (/obj/structure/shuttle/engine/propulsion/burst,/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/floor/plating/airless,/area/shuttle/mining) "czB" = (/turf/space,/turf/simulated/wall/shuttle{icon_state = "swall_f9"; dir = 2},/area/shuttle/mining) "czC" = (/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/starboardsolar) -"czD" = (/obj/structure/cable/green{tag = "icon-1-10"; icon_state = "1-10"},/turf/simulated/floor/plating/airless,/area/engine/engineering) +"czD" = (/obj/structure/cable/green{tag = "icon-1-9"; icon_state = "1-9"},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering) "czE" = (/obj/structure/bed/chair,/turf/simulated/floor/plating,/area/maintenance/fsmaint) "czF" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs/cable/green,/obj/item/weapon/restraints/handcuffs/cable/green,/obj/item/toy/owl,/turf/simulated/floor/plating,/area/maintenance/fsmaint) "czG" = (/obj/structure/closet/firecloset/full,/turf/simulated/floor/plating,/area/maintenance/fsmaint) @@ -6878,7 +6878,7 @@ "cCn" = (/obj/structure/cable/pink{tag = "icon-1-2"; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "cCo" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"}) "cCp" = (/obj/machinery/vending/cigarette,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"cCq" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/flora/tree/pine/xmas,/turf/simulated/floor/plasteel/bar,/area/crew_quarters/bar) +"cCq" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,/turf/simulated/wall/rust,/area/maintenance/atmos_control) "cCr" = (/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/obj/structure/cable/pink{tag = "icon-1-2"; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel/warningline{tag = "icon-warningline (NORTH)"; icon_state = "warningline"; dir = 1},/area/medical/research{name = "Research Division"}) "cCs" = (/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (NORTHEAST)"; icon_state = "whitepurple"; dir = 5},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel/warningline{tag = "icon-warningline (NORTHEAST)"; icon_state = "warningline"; dir = 5},/area/medical/research{name = "Research Division"}) "cCt" = (/obj/machinery/vending/coffee,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light,/obj/machinery/camera{c_tag = "Science Hallway East"; dir = 1; network = list("SS13","Sci")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) @@ -7220,7 +7220,7 @@ "cIR" = (/obj/machinery/door/poddoor{id = "QMLoaddoor2"; name = "supply dock loading door"},/obj/machinery/conveyor{dir = 1; id = "QMLoad"; tag = "cargoshuttledown"},/turf/simulated/floor/plating,/area/shuttle/supply) "cIS" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/turf/simulated/floor/plating,/area/shuttle/supply) "cIT" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dir = 2; dwidth = 5; width = 12},/obj/docking_port/stationary{dir = 2; dwidth = 5; height = 7; id = "supply_home"; name = "supply bay"; width = 12},/turf/simulated/floor/plating,/area/shuttle/supply) -"cIU" = (/obj/machinery/door/poddoor{id = "QMLoaddoor2"; name = "supply dock loading door"},/obj/machinery/conveyor{dir = 1; id = "QMLoad2"; tag = "cargoshuttleup"},/turf/simulated/floor/plating,/area/shuttle/supply) +"cIU" = (/obj/structure/cable/green{tag = "icon-4-8"; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/turf/simulated/floor/plating,/area/maintenance/atmos_control) "cIV" = (/turf/simulated/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/supply) "cIW" = (/turf/simulated/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/supply) "cIX" = (/obj/structure/lattice,/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space) @@ -7349,7 +7349,7 @@ "cLq" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/apmaint) "cLr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating{broken = 1; icon_state = "platingdmg1"},/area/maintenance/apmaint) "cLs" = (/obj/effect/spawner/lootdrop{loot = list(/obj/item/stack/sheet/metal = 1, /obj/item/stack/rods = 2, /obj/item/weapon/shard = 2, "" = 3); lootcount = 2; name = "random material damage spawner"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"},/area/maintenance/apmaint) -"cLt" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/apmaint) +"cLt" = (/obj/structure/cable/green{tag = "icon-1-4"; icon_state = "1-4"},/obj/structure/cable/green{tag = "icon-1-2"; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/atmos_control) "cLu" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plating,/area/maintenance/apmaint) "cLv" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/closet/wardrobe/cargotech,/turf/simulated/floor/plating,/area/maintenance/apmaint) "cLw" = (/obj/structure/table,/obj/item/weapon/reagent_containers/syringe,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/apmaint) @@ -7627,14 +7627,14 @@ "cQI" = (/obj/machinery/camera{active_power_usage = 0; c_tag = "Bomb Test Site"; desc = "A specially-reinforced camera with a long lasting battery, used to monitor the bomb testing site."; dir = 1; invuln = 1; light = null; name = "Hardened Bomb-Test Camera"; network = list("Toxins"); start_active = 1; use_power = 0},/obj/item/target/alien{anchored = 1},/turf/simulated/floor/plating/airless{dir = 2; icon_state = "warnplate"},/area/toxins/test_area) "cQJ" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/plating/airless{dir = 6; icon_state = "warnplate"},/area/toxins/test_area) "cQK" = (/turf/indestructible{desc = "A wall impregnated with Fixium, able to withstand massive explosions with ease"; icon_state = "riveted"; name = "hyper-reinforced wall"},/area/toxins/test_area) -"cQL" = (/obj/structure/flora/tree/pine/xmas,/turf/simulated/floor/carpet,/area/chapel/main) -"cQM" = (/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/obj/structure/flora/tree/festivus,/turf/simulated/floor/plasteel/warningline{tag = "icon-warningline (NORTHWEST)"; icon_state = "warningline"; dir = 9},/area/medical/research{name = "Research Division"}) +"cQL" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 9},/turf/simulated/wall,/area/maintenance/atmos_control) +"cQM" = (/obj/structure/cable/green{tag = "icon-1-8"; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/atmos_control) "cQN" = (/obj/structure/cable/green{tag = "icon-1-6"; icon_state = "1-6"},/turf/simulated/floor/plating/airless,/area/engine/engineering) "cQO" = (/obj/structure/cable/green{tag = "icon-1-2"; icon_state = "1-2"},/obj/item/weapon/wirerod,/turf/simulated/floor/plating/airless,/area/engine/engineering) -"cQP" = (/obj/structure/cable/yellow{tag = "icon-6-9"; icon_state = "6-9"; d1 = 4; d2 = 8},/obj/structure/grille,/obj/structure/cable/green{tag = "icon-5-8"; icon_state = "5-8"},/turf/simulated/floor/plating/airless,/area/engine/engineering) -"cQQ" = (/turf/simulated/floor/plating/airless{dir = 1; icon_state = "warnplate"},/area/engine/engineering) +"cQP" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (WEST)"; dir = 8},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/hallway/primary/central) +"cQQ" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/hallway/primary/central) "cQR" = (/obj/machinery/door/airlock/external{name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/obj/structure/cable/yellow{icon_state = "4-8"; d1 = 4; d2 = 8},/turf/simulated/floor/plating/airless,/area/engine/engineering) -"cQS" = (/obj/structure/cable/yellow{tag = "icon-4-10"; icon_state = "4-10"; d1 = 4; d2 = 8},/turf/simulated/floor/plating/airless,/area/engine/engineering) +"cQS" = (/obj/machinery/door/firedoor,/obj/structure/cable/green{tag = "icon-1-2"; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/hallway/primary/central) "cQT" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/structure/cable/yellow{icon_state = "4-8"; d1 = 4; d2 = 8},/turf/simulated/floor/plating/airless,/area/engine/engineering) "cQU" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/engine/engineering) "cQV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{icon_state = "4-8"; d1 = 4; d2 = 8},/turf/simulated/floor/plasteel/warning{dir = 8},/area/engine/engineering) @@ -7643,9 +7643,9 @@ "cQY" = (/obj/structure/cable/green{tag = "icon-1-9"; icon_state = "1-9"},/obj/structure/cable/green{tag = "icon-4-9"; icon_state = "4-9"},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering) "cQZ" = (/obj/structure/cable/green{tag = "icon-4-8"; icon_state = "4-8"},/obj/structure/cable/green{tag = "icon-1-8"; icon_state = "1-8"},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering) "cRa" = (/obj/structure/cable/green{tag = "icon-5-8"; icon_state = "5-8"},/obj/structure/cable/green{tag = "icon-1-8"; icon_state = "1-8"},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering) -"cRb" = (/obj/structure/cable/yellow{icon_state = "4-8"; d1 = 4; d2 = 8},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering) -"cRc" = (/obj/structure/cable/yellow{tag = "icon-4-9"; icon_state = "4-9"; d1 = 4; d2 = 8},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering) -"cRd" = (/obj/structure/cable/yellow{tag = "icon-5-8"; icon_state = "5-8"; d1 = 4; d2 = 8},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering) +"cRb" = (/turf/simulated/floor/plasteel/whitepurple/side{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/turf/simulated/floor/plasteel/warningline{tag = "icon-warningline (NORTHWEST)"; icon_state = "warningline"; dir = 9},/area/medical/research{name = "Research Division"}) +"cRc" = (/obj/machinery/conveyor{dir = 1; id = "QMLoad2"; tag = "cargoshuttleup"},/obj/machinery/door/poddoor{id = "QMLoaddoor"; name = "supply dock loading door"},/turf/simulated/floor/plating,/area/shuttle/supply) +"cRd" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/apmaint) "cRe" = (/obj/machinery/door/airlock/external{glass = 1; name = "Cargo Escape Airlock"; opacity = 0},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"},/area/hallway/secondary/exit) "cRf" = (/obj/machinery/door/airlock/external{glass = 1; name = "Cargo Escape Airlock"; opacity = 0},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/hallway/secondary/exit) "cRg" = (/obj/machinery/door/airlock/external{glass = 1; name = "Escape Airlock"; opacity = 0},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"},/area/hallway/secondary/exit) @@ -7754,40 +7754,40 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaeaaeaiTaiUaiUaiVaiWaiXaiYaiZajaajaajbafvafvaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaaaaaaaaaaaaaeakEakyakyakyakyakyakyakyalgakyakyakyakyakyakyalNalNakyakyakyalOalPakyakyalQalRakyalSalTajTalUalValUalUalUalUalUalUaiualWalXalXalXalXalXalYaiualZalZalZalZalZamaambalcamcamdamealcamfakZalMalJamgamhamiamjalcaaealcalcalHalcalcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaeaaeaiTaiUaiUaiVaiWaiXaiYaiZajaajaajbaaeaaeaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaeajoajoajoajoajpaaeaiXaaeajpajqajqajqajqafvaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaaaaaaaeaaeaaaaaaaaeakEakyakyakyamkamlammamnakyakyakyampammaneanbakyakyamqamramsamtamuamvamwamxamyamzakyakyalTajTalUamAamBamCamDamEamEalUamFamGamHamIamJamKamLamMamNamOamPamQamRalZamaamSalcamcamTamdalcalcakZalcamUalIakZakZamValcaaealcamWamXamYalcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaeajoajoajoajoajpaaeaiXaaeajpajqajqajqajqaaeaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaiXaaaaaaaaaaaaaaaaaeafvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeakEakyakyaouanaanTamZanaancammandanaamZanTanaaowanganfanganhanianjankanlanlamyanlanmakyalTajTalUannanoanpanqanransantanuanvanwanxanyanzanAanBanCanDanEanFanGalZamaanHalcamdameamcalcanIakZalcalbanJanKanLanManNaaealcalbakZanOalcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaanPaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaanQaaaaaaaaaaaaaaeaaeafvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanRanRanSanRanSanRanRaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaeakEakyakyalNanaanTameamcanaamZamZamZanaamcameanTamZakyakyakyanUanlanVanWanXanlamyanlanYakyalTajTalUanZamEaoaaobaocamEaodaoeaofaogaogaogaogaoganBanCaohaoiaojaokalZamaaolalcalcalcalcalcakZakZalcalcalcalMalcalcalcalcalcaomaonaonaonaonaonaonaonaonaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaooaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaioaaaaaaaaaaaeaaeaaaafvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanSaopaoqaoraosaotanSaaeaaaaaaaaaaaaaabaaaaaaaaaaaaaaeaaeaaaakEakyamZalNaptameameameapuamcaovamcapuameameameaqeakyaoxaoyaozanlaoAaoBaoCaoDaoEaoFaoGakyalTaoHalUaoIanoaoJaoKaoLaoMaoNaoOaoPaoQaoRaoSaoTaoUaoVaoWaoXaoYaoZapaalZamaapbapcapdalMapeakZapfakZalMapgakZakZakZapfakZalIanIakZaonaphapiapjapkaplapmaonaaeaaeaaeaaaaaaaaaapnaaaaaaaaaaaaaaeaaeaaaaaaaaaaooaaaaaaaaaaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaioaaaaaaaaeaaeaaaaaaafvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeanRapoappapqaprapsanRaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaamrakyamZaqkamcarfameameameamcaovamcameameameameamcapvapwapxaozanlapyapzapAaniapBapCapDakyalTapEalVapFapGapHapIamEamEalUapJapKahvahvahvahvahvapLahMalZapMapNalZalZamaapOapPapQapRapSapRapRapRapRapRapRapTapRapUapRapRapRapVaonapWapXapYapYapZaqaaonaaaaonaqbaonafvafvaqcaaaaaaaaaaaaaaaaaeaaeaaaaaaaooaaaaaaaaeaaeaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaqdatoaqdaaeaaeaaaaaaaaaafvafvafvafvaaeaaaaaaaaaaaaanRanRanRanRanRanRanRaqfaqgaqhaqiaqjanRanRanRanRanSanRanRanRaaeaaeaaeaaaaaaaaaakEakyamZatqameameatsameameamcaovawvameameatsameameapvapwaqlaqmaqnaqoaqpaqpaqqaqrapCaqsakyalTajTalUalUalUalUalUalValUalUaqtaquaqvaqwaqxaqyaqzaqAaqBaqCaqDaqEaqFaqGaqHaqIaqJaqKaqLaqMaqNaqOaqNaqPaqNaqNaqNaqQaqNaqRaqNaqNaqSaqTaqUaqVaqWaqXaqYaqZaraaraaraarbaraafvarcardarcaaeaaeaaaaaaaaaaaeaaeareaxPareaaeaaeaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaqdargaqdaaeaaaaaaaaaaaaaaeaaaanRarhanRaaaaaaaaeaaeanRariarjarkarlarjarmarmarmarnaroarmarmarjarjarjarparqarranRaaeaaeaaeaaaaaaaaaakEakyarsatqameatsatsamcamcazsaovazsamcamcatsatsameapvapwaruaozanlarvarwarxaryaqrapCakyakyarzarAarBarCalnalnarDalnarEarFahMarGarHarIarJarKalwarLahMarMarNarOarParParParQarRarSarTarUarVarWarVarXarXarXarYarZarZarXarXasaasbaonascapXasdapYaseasfasgashasgasiaraaraaraardarcarcaaeaaeaaaaaaaaaaaeareasjareaaeaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaaaaaaqdaqdatoaqdaqdaaaaaaaaaaaaaaeaaaanRaskanRaaeaaeaaeaabaslasmasnasnasnasnasnasnasnasoaspasnasnasnasnasnasnasqasranRaaeaaeaaeaaaaaaaaaakEakyakyatqameameazuaztaDzazxaDzaEPaDzaztaFSassameapvapvakyakyastakyakyamrasuasvaswakyasxasyaszasAasAasAasAasAasAasBarMasCahMahMasDajUasEahMaiCasFarMasGasHasHasHasHasHasHasIasJasKasHasLasHasHameamcameameameamcameasMasNaonasOasPasQasRasSasTasUasVasWasXasYasZataatbatcarcaaeaaeaaeaaeaaeareareaxPareareaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeanRanSanSanSanSanRanRanRanRanRanRanRanRatdateatfatgatdanRanRanRanRanRanRanRathatiatiatiatiatiatjatkatlatlatlatlatlatlatlatlatlatlatlatlatlanRanRatmatnanSaaaaaaaaeaaeaaaaaaakEakyamZaFTameatpamcaFUartamdamdamdartaFUamcameameapvattatuatvatwatwatxakyatyatzatAakyatBatCatDatEatEatEatEatEatFatGatHatIatIatIatJatKatLatIatIatIatMasGasHatNatOatPatQatRatSatTatUatVatWatXatYameatZatZatZatZatZamcasMasNaonauaaubaucaudaueaufasgaugasgauharaaraaraauiarcarcaaeaaeaaaaaaaaaaujaukaulaumaujaaaaaaaaaaaaaabaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaanRaunauoauoaupauqaurausautauuauvauwauxatdauyauzauAatdauBauqauqauCauDauEanRauFauGasnasnasnasnauHauIatlauJauKauLauMauNauOauPauQauRauSauTatlauUauVatmaqianSaaaaaaaaaaaeaaeaaaakEakyamZaFTamcamcamcaFUamdauXauYauZamdaFUamcamcamcapvavbavcaJcavdaveavfakyavgaqravhakyaviavjatEavkavlavmavnatEatEavoavpavqavqavravsavtavuavvarParParPavwasHavxavyavzavAatRavBavCavDavEavFavGavHavIavJavKavLavLatZameavMasNaonaonaonaonavNavOaonaraaraaraaraaraafvarcauiavPaaeaaeaaaaaaaaaaaaaujavQavRavSaujaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanRanRanRauqavTavUauqanRavVanRanRanRanRanRauvatdavWavXavYatdavZauqausawaawbawcauVawdaweauqauPauPawfauPauPatlawgawhawiawjawkawlauPawmawnawoawpatlanRanRatmaqianSaaaaaaapnaaaaaeaaeamrakyawqaFTameaJdaovaFUamdavaaJeauWamdaFUaovaJdameapvavbawrawsawtawuaJfawwawxawyawzawAawBawCawDawEawFawGawHawIatEawJawKakLajQahvawLajUawMasHasHasHasHasHasHawNavyavyawOatRawPawQawRawSawTawUawVamcatRawWavLawXatZameavMawYawZaxaawZaxbaxbaxcaxdaxdaxdaxdaxdaxdaxdaxdaxeaaaaaaaaaaaaaaaaaaaaeaujaxfaxgaxhaujaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeanRaxianRaxjaxkaxlaxmanRaxnaxlaxoauqaxpaxqaxratdatdaxsatdatdaxtauqaxuaxvaxuaxuanRaxwaxxauqaxyaxzaxAaxBaxCatlaxDaxEaxEaxFaxGaxHauPaxIaxJaxKaxIatlamcanSatmaqianSaaaaaaaxLaaeaaeaaaakEakyamZaFTamcamcamcaFUamdaxMatraxNamdaFUamcamcamcapvavbaxOatwatwatwatwakyaJgaxQaxRaxSaxTaxUaxVaxWaxXaxYaxZayaatEawJawKaybakKahvaycaydawMasHayeayfaygayhayiayjaykaylaymaynayoaypayqayraysaytayuayvaywayxavLayyatZameavMayzayAayBaonaaeaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaeaaaaaaaaaaabaaaaaeaaeaujaujayCaujaujaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaanRayEanRayFayGanRanRanRauqayHayIauqayJaxqayKayLayMayNayOayPayLayQayRaySayLayLayLayTayUarjayVayWayXayYayZatlazaazbawiazcazdazeazfazgazhaziazjazkazlazmaznazoazpazqazqazraaeaaaaaaakEakyamZaFTameameamcaFUartamdamdamdartaFUamcameameapvazvazwaJhatwatwazyakyazzazAazBakyatBatCatEazCazDazEazFazGatEawJawKazHazIahvazJajUazKasHazLayfaygayhayiazMazNazOazPazQazRazSazTazTazUazVazWameatZatZatZatZatZamcavMayzazXazXazXazXazXazXazXazXazXazXazXazXazYazZazZazZaAaaAaaAaaAaaAaaAaazYaAbaAcaAdazYazYazYazYazYazYazYazYazYazYazYazYazYaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanRanRanRanRanRaAeaqhanRaAfanRaAgaosaAhauqaAiaxqaAjaAkaAlaAlaAlaAlaAlaAlaAlaAmaAmaAmaAmaAnaAoaApaAqatlaAratlatlatlaAsaAtaAuaAvaAwaAxaAyaAzaAwaAAaABaACameanSatmaqianSaaaaaeamdaaaaaaaaaakEakyakyatqameameazuaJiaDzaJjaKIaKHaDzazxaFSameameapvapvakyakyaADakyakyamraAEasvaswakyaAFaAGatEaAHaAIaAJaAKaALatEaAMawKaANahvahvaAOaAPaAQaARaASaATaAUaAVayiaAWazNaAXavyavyaAYaAZaBaaBbaBcaBdaBeaBfaBgaBhaBiaBiatZameavMaBjapRapRapRapRapRapRapRaBkapRapRapRaBlaBmapRapRapRaBmaBmaBmaBmaBmaBmaBmaBmaBnaBoaBpaBoaBoaBoaBqaBraBsaBtazYaBuaBvaBwazYaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanSaBxaxlaByanRaBzaBAauVaBBanRauqaxlaxlauqaBCaxqaAjaqiaBDaBEaBFaBDaBGaBHaBDaxlauqaBIauqaBJaBKaBLaBMaBNaBOaBPaBQaBRaxEaxEaxEaBSaBTaBUauPauPaBVaBWauPatlamcanSatmaqianSaaeaaeaBXamdamdaaeakEakyaBYatqameatsatsamcamcaKJaFUaKJamcamcatsatsameapvapwapxaBZaCaaCbaCcaCdaCeaqrapCakyaCfaAGatEaCgaChaCiaCjaCkatEawJawKaClahvaCmaCnaCoaCpaCqaCraCsaCtaCuaCvaCwaCxaCyaCzaCAaCBaCCaCDavyaCEaCFawVamcatRaCGaCHaCIatZameavMayzaCJazXaCKaCLazXaCMaCNazXazXapPaCOazXazYazZazZazZaAaaAaaAaaAaaAaaAaazYaCPaCQazYaCPaCRazYazYazYazYaCSaCTazYaCUaCVaCVazYaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanSaCWauqauqaCXaCYaCZarmarmarmarmarmarmarmarmarmaDaaDbaBDaDcaDdaDeaDdaDfaDgaDgaDgaDgaDgaDgaDgaDhaDiaDjaDkaDlaDmaDnaDoaAzaDpaDqaDraDsauPaDtaDuaDvaDwatlanRanRatmaqianSaaeamdamdaDxaaaaaaakEakyamZatqameaKKatsameameamcaFUamcameameatsameameapvapwaqlaDybugaDAaDAaDAaDBaDCaDDakyaDEaAGatEaDFaDGaDHaDIaDJatEawJaDKaDLahvaDMaDNaDOaDPaDQaDRaDSaDTaDUaDQaDVaDWaDXayiaDYaDZavyaEaavyaCEaEbayuayvaywaEcaBiaBiatZameavMayzaEdaEeaEeaEeaEeaEeaEeaEeazXapPaEfazXaaaaaeaaaaaeaaaaaaaaaaaeaaaaaeaaaazYaCQazYaEgaEhaEiaCVaEjazYaCSazYazYaCPaEkazYazYaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabanRanRanRanRanRaElaEmasnasnasnasnasnasnasnasnasnaEnaEoaBDaEpaEqaBDaEraEsaDgaEtaEuaEvaEwaExaEyaEzaEAatlaEBaECaEDatlaEEawkaEFaEGaEHaEIauPaEJaEKaELaEMatlaENanRatmaqianSaaeaaeaaaamdaaaaaaamrakyamZbuiamcameameameameamcaFUamcameameameameamcapvapwaruaEObysaoDaEQaERaESaETaEUakyaEVaAGatEaEWaEXaEYaEXaEZatEawJaFaaFbahvaFcaFdaFeaFfaFgaFhaFiaFjaFkaFgaFlaFmaFnaDYaFoaCDavyaCBaFpaCEaFqawVameatZatZatZatZatZamcavMayzaFraEeaFsaFtaFuaFvaFwaEeaCKapPaFxazZaaaaaeaaaaaeaaaaaaaaaaaeaaaaaaaaaaAaaCQazYaFyazYazYazYazYazYaFzaBmaBmaBmaBsaFAaFBaFCaFBaFBaFBaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaeanRaqhaFDaFEaFEaFEaFEaFEaFEaFEaFEaFEaFFaFGaBDaFHaFIaBDaFJaFKaDgaFLaFMaFNaFOaFPaEyaEzaFQatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlauVanRatmaFRanSaaaaaeaaeaaeaabaaaakEakyamZalNbytameameamebNLamcaFUamcbNLameameamebNMakyaFVaoyaFWcvvanXamyaFYaFZaFZaFZaGaaGbaGcaxVaxVaxVaxVaxVaGdatEaGeaFaaGfahvaGgaGhaGiawMasHaGjaGkaGlaGmaGnaGoazNaGpaDYaFoaGqaGraGsaFpaGtaGuaBeaBfaBgaGvaGwaGxatZameavMayzaGyaEeaGzaGAaGBaGCaGDaEeapPaFxapPazZaaeaaaaaaaaeaGEaGFamdaaeaaaaaeaaeaAaaCQazYaGGaGHaGIaGJaGKazYazYaCPazYaGLaCSaGMaFBaGNaCVaGOaFBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaeanRaqhaFDaFEaGPaGQaGRaGSaGTaGUaGVaBDaGWaGXaGYaGZaHaaHbaHaaHcaHdaHeaHfaHgaHhaHiaHdaHjaHkaHlaHmaHnaHoaHoaHpaHqaHnaHraHsaHtaHsaHuaHvaHwaHxaHxaHxaHxaHyaHzanRaaaaaaaaeaaeaaaaaaakEakyakyalNanaaHAameamcanaamZcyFamZczDamcamecGLamZakyakyakyaHBcGMaHDamyaHEaFZaHFaHGaHHaGaaHIaHJaHKaHJaHJaHJaHLaHJaHMaHNajQahvaHOaHPaHQaHRasHasHaHSaHTatRasHaHUazNaHVaDYaFoaCDaHWaCBaFpaCEaHXawVamcatRaHYaHZaIaatZameavMayzaIbaEeaIcaIdaGAaIeaIfaIgaIhaIiapPazZaaaaaaaabamdamdaIjaIkamdaaaaaaaaaaAaaIlazYaImaCVaInaCVaCVazYaEhaIoazYaIpaCSaIqaFBaCVaIraIsaFBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaaanRaItaFDaFEaIuaIvaIwaIxaIxaIyaIzaIAaIBaICaIDaIEaIFaIGaIFaIHaIIaIJaIJaIKaILaIMaINaIOaIPaIQaHmaHnaHoaIRaIRaISaITaIUaIVaIWaIXaIYaHvaIZanRanRanSaslaJaanRaJbaJbaJbaJbaJbaJbaJbaJbalNakyakycQNanaaHAamZcQOamoammcQPamZamZcQQamZcQScQRcQTcQRcQVcQUcQXcQWaJkaJlaJmaJnaJoaGaakyakyakyakyakyakyaJpaJqaJraJsaJtatIaJuaJvaJwaJxaGnaJyaJzaJAaJBasHaJCazNaDYaJDaDYaJEavyaCBaJFaCEaJGayuayvaywaJHaGwaGwatZameavMayzapPaEeaGDaJIaJJaJKaGDaEeaJLapPaJMazZaaeaaeaaaaaeaIkaDxamdaaeaaaaaeaaeaAaaCQazYaJNaJOaJPaJQaCVaJRaCVaJSazYaJTaCSaJUaJVaEiaJWaJXaFBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaanRaqhaFDaFEaJYaJZaKaaKbaKcaKdaKeaKfaKgaKdaKhaKiaKjaKdaKdaKkaKlaKmaKnaKoaKpaKqaKlaKraKsaKtaHmaHnaIRaHoaHoaKuaHnaKvaIWaIWaIWaKwaHvaKxaJbameamcaKyameaJbaKzaKAaKBaKCaKDaKEaKCaKFaKGakyakyakycQYcQZammcRaakyakyakycRccRbcRbcRdakyakyaKLalgaKMaFXaKNaKOaKPaKQaKRaKSaKTaKUaKVaKWaKXaKYaKZakyaLaaLbaLcaLdaLeaLfaLgaLhaLiaLjaLkaLlaLmaLnaLoaLpaLqaLraLsaLtaLuaLvaLwaLxaLyaCEaFqawVameatZatZatZatZatZamcavMayzapPaEeaLzaLAaLBaLCaLDaEeaLEapPaLFazZaaaaaaaaaaaeaaaaaaaaaaaeaaaaaeaaaaAaaCQazYazYazYazYazYazYazYaLGazYazYaCVaCSaLHaFBaFCaFBaFBaFBaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaanRaqhaFDaFEaLIaLJaLKaLLaLMaLNaLOaBDaLPaLPaLPaLQaLRaBDaLPaLPaDgaEyaLSaDgaLSaEyaDgaLTaLUaLVaHnaHvaHnaHnaHnaHnaHvaLWaLXaIWaLYaLZaHvaKxaJbameamcaKyameaJbaKFaKFaMaaJbaMbaKFaJbaMcaMdaMeakyakyakyakyakyakyakyakyakyakyakyakyakyakyakyakyalNaMfaMgaMhamyaMiaFZaFZaFZaFZaFZaMjaMkaMlaMmaMnakyakyajQaAMaMoajQahvahvaMpaMqaMraCvaMsaMtaMuaMvasHaMwaMxaMyaMzaMzaMAavyavyavyaMBaMCaBeaBfaBgaMDaMEaMEatZameavMayzazXaEeaEeaEeaEeaEeaEeaEeazXapPaCLazXaaaaaeaaaaaeaaaaaaaaaaaeaaaaaaaaaazYaCQazYaEjaCVaEiaCVaMFaGLaCVaLHazYaCVaMGazYazYaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaanRaMHaMIaFEaBDaBDaMJaMKaMLaMKaMKaBDaMMaMNaLPaMOaHaaMPaMQaMRaBDaMSaMTaMUaMTaMVaBDaMWaMXaHnaMYaMZaNaaNbaNcaNdaHnaNeaNfaNgaNhaNiaHvaKxaKCaJbaNjaNkaJbaJbaJbaNlaJbaJbaJbaKCaJbaJbaJbaJbakyakyalgakyakyakyaNmaNnaNoakyakyakyalgakyaNpaNqakyapyaHCanlamyaFYaNranlanlanlaFYaNranVaNsaCaaNtaNuaxSaNvaNwaNxajQazHahvaNyaNzaNAayiaNBayiasHasHasHaNCaNDaNEaNFaNFaNGaNFaNFaNFaNHaNIaNJamcatRaNKaNLaNMatZameavMayzaCKazXazXazXazXazXazXazXazXapPaIbaCKazXazZazZazZazZazZazZazZazZazZazXazYaCQazYazYaGGaCPazYazYazYazYazYazYaCVaCSaCVazYaaaaabaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaabaaaanRaNNaNOaBDaNPaNQaNRaNSaNTaNUaNUaNVaNUaNWaNXaNYaNZaIxaIxaIxaOaaObaOcaOdaOeaOfaOgaOhaOiaOjaOkaOlaOmaOnaOoaOpaOqaOraOsaOtaOuaOvaOwaOxaOyaOzaOAaOBaOzaOzaOzaOzaOCaOzaOzaOzaODaOzaOzaOzaOzaOzaOEaOFaOGaOHaOIaOJaOHaOHaOKaODaOzaOzaOLaOzaOMaONaOOaOPaOQaOPaORaOSaOPaOPaOPaOTaOUaOVaOPaOWaOPaOXavqaOYaOZakLalSahvaPaajUawMahvaPbaPcaPdaPeaMzaMzaPfaPgaDSaDSaPhaDSaPiavyaPjaPkaPlayvaywaPmaMEaMEatZameaPnaPoaPpaPpaPpaPpaPpaPpaPpaPpaPpaPqarVarVaPrarVarVaPsaPpaPtarVarVaPuaPvaPsaPwaPxaPyaPyaPzaPyaPyaPyaPAaPyaPyaPyaPyaPBaPCazYaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaanSaPDaPEaBDaPFaPGaPHaPIaPJaPKaPLaPMaPMaPNaPOaPPaPQaKbaKbaKbaPRaPSaPTaPUaPVaPSaPRaPWaPXaPYaPZaQaaQaaQbaQcaQdaQeaQfaQgaQhaQaaQaaQiaQjaQkaQlaQmaQnaQoaQpaQpaQpaQqaQraQpaQsaQtaQuaQvaQwaQlaQxaQyaQzaQzaQzaQzaQzaQzaQzaQAaQBaQlaQlaQCaQlaxSaQDaQEaQFaQGaQHaQIaQJaCaaCaaQKaQLaQMaQNaQOanlanlaQPaQPaQPaQPaQPaQPaQPaQQajUawMahvaPbaCLasHaQRaQSaQTaQUaQVaQWaQXaQYaDSaQZaRaaRbaRcatRameatZatZatZatZatZameasMayzazXazXazZazZazZazZazZazXazXaPbazXazXazXazXazXaRdazXaReaRfaRgaRhaRhaRiaCPaRjazYaMFaRkaCVaRlaRmaJUaCVaCVaCPazYaRnaRoazYazYazYazYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaaaaaaaaaaaaaaanRaRpaRqaBDaBDaDeaRraRsaBDaBDaBDaBDaBDaBDaBDaRtaRuaRvaMQaMRaBDaRwaRxaRyaRxaRzaBDaRAaRBaHnaRCaRDaREaRFaRGaRHaHvaRIaRJaRKaRLaRMaHvaRNaROaRPaRPaROaRQaRPaRRaRSaRTaRUaRVaRVaRVaRVaRVaRWaRWaRWaRWaRWaRWaRWaRWaRWaRWaRWaRXaRXaRXaRXaRYaRZakyaSaaSbaScakyakyakyakyaSdaSdaSdaSeaSfaSgaSdaSdaSdaShaSiaSjaSkaSlaSmaQPaSnaydaSoahvaPbaCKasHasHaSpaSqayuaSraSpaSqayuaPlayuaPlayuaSratRameamcameameameamcameasMayzazXameamcamcameamcamcameazXaSsazXaStapPaStapPaRdazXaSuaSvaSwaCLaSxaSyaSyaSyaSyaSyaSyaSyaSyaSyaSyaSyazYazYazYaRnaSzazYaSAaSBazYazYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaeaaeaaaaaaaaaaaaanRaqhaFDaBDaSCaSDaSEaSFaSGaLPaSHaSIaBDaSJaBDaLQaLRaBDaLPaLPaBDaBDaLPaLPaLPaBDaBDaSKaLUaLVaHnaHnaHnaHnaSLaSMaHvaHvaHvaHvaHvaHvaHvaKxaROaSNaSOaSPaSQaRPaRRaRSaSRaRUaRVaSSaSSaSSaRVaRWaSTaSUaSVaSTaSWaSTaSXaSYaSTaSZaTaaTbaTcaRXaRYaKFakyaTdaTeaTfakyaTgajDakyaThaTiaTjaTkaTlaTmaTnaToaQKaTpaTqaTraTsaTtaTuaTvaPaajUawMahvaPbazXameameaTwamcaTxameaTwamcaTxameaTxamcaTxameameameazXazXazZazZazXazXasMayzazZamcaTyaTzaTzaTzaTAamcazZaPbazZapPaTBapPapPaRdazXaTCaTCaTCaTCaTCaSyaTDaTEaTFaTGaTHaTIaTJaTKaTLaTMaTNaTOazYaTPaTQaTRaTSaTTaTUazYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaeanRanRanRanRanRaqhaFDaBDaTVaTWaTXaTYaTZaUaaUbaUcaUdaUeaUfaUgaUhaUiaUjaUjaUkaUlaUlaUmaUnaUjaUoaUpaUqaUraUsaUtaUuaUjaUvaUwaUxaUyaUzaQlaQxaQlaQlaUAaROaRPaRPaSPaUBaRPaRRaRSaSRaUCaRVaUDaUDaUEaRVaRWaSTaUFaUGaUHaUIaUHaUJaUKaSTaSZaULaUMaUNaRXaRYaUOakyaUPaUQaURakyakJaUSaOMaUTaUTaUUaUVaUWaUXaOPaUYaUZaVaaVbaVcaVdaVeaVfaTvaPaajUawMahvaPbazXamcatZaVgatRaVhatZaVgatRaVhatZaViatRaVjatZamcazXaCKaVkapQapRapRapRaVlaVmazZamcaVnaVoaVpaVqaVramcazZaPbazXaStapPaStazXaRdaVsaTCaVtaVuaVvaVwaSyaVxaVxaVyaVzaVAaVBaVCaVDaVEaSyaTNaTNazYaRnaVFaCPaVGaCVaCVazYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaanRaVHaVIaVJanRaqhaFDaBDaVKaVLaVMaVNaVOaPOaVPaVQaVRaVSaVTaVUaVVaVWaVWaVXaVYaVZaWaaWbaWcaWdaWeaWfaWgaWhaWiaVWaWjaWkaWlaWmaWnaWoaWpaWqaWraWqaWsaWtaWuaWvaWwaWxaWyaRPaRRaRSaSRaRUaRVaWzaWAaWBaRVaRWaWCaSTaSTaWDaWEaWFaSTaSTaWGaSZaWHaWIaWJaRXaWKaWLakyaWMaWNaWOakyaWPatGakyaWQaWRaWSaWTaWUaWVaWWaWXaWYaWZaXaaXbaXcaXdaXeaTvaPaajUawMahvaXfazXameatZaXgaXhaXiatZaXjaXkaXlatZaXmaXnaXoatZameazXaSvaXpaXqaPpaPpaPpaXraRiazXameaVnaXsaXtaXuaVrameazXaPbazXazXapPaCKazXaRdapPaXvaXwaXxaXyaXwaXzaVxaVxaXAaVxaXBaXCaXDaVxaVxaSyaXEaXFazYaRnaSzazYaVGaCVaCVazYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaanQaaaaaaaaaaaaaaeaaeafvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanRanRanSanRanSanRanRaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaeakEakyakyalNanaanTameamcanaamZamZamZanaamcameanTamZakyakyakyanUanlanVanWanXanlamyanlanYakyalTajTalUanZamEaoaaobaocamEaodaoeaofaogaogaogaogaoganBanCaohaoiaojaokalZamaaolalcalcalcalcalcakZakZalcalcalcalMalcalcalcalcalcalcaomaonaonaonaonaonaonaonaonaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaooaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaioaaaaaaaaaaaeaaeaaaafvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanSaopaoqaoraosaotanSaaeaaaaaaaaaaaaaabaaaaaaaaaaaaaaeaaeaaaakEakyamZalNaptameameameapuamcaovamcapuameameameaqeakyaoxaoyaozanlaoAaoBaoCaoDaoEaoFaoGakyalTaoHalUaoIanoaoJaoKaoLaoMaoNaoOaoPaoQaoRaoSaoTaoUaoVaoWaoXaoYaoZapaalZamaapbapcapdalMapeakZapfakZalMapgakZakZakZapfakZalIanIakZakZaonaphapiapjapkaplapmaonaaeaaeaaeaaaaaaaaaapnaaaaaaaaaaaeaaeaaaaaaaaaaooaaaaaaaaaaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaioaaaaaaaaeaaeaaaaaaafvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeanRapoappapqaprapsanRaaeaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaamrakyamZaqkamcarfameameameamcaovamcameameameameamcapvapwapxaozanlapyapzapAaniapBapCapDakyalTapEalVapFapGapHapIamEamEalUapJapKahvahvahvahvahvapLahMalZapMapNalZalZamaapOapPapQapRapSapRapRapRapRapRapRapTapRapUapRapRapRapVakZaonapWapXapYapYapZaqaaonaaaaonaqbaonafvafvaqcaaaaaaaaaaaaaaeaaeaaaaaaaooaaaaaaaaeaaeaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaqdatoaqdaaeaaeaaaaaaaaaafvafvafvafvaaeaaaaaaaaaaaaanRanRanRanRanRanRanRaqfaqgaqhaqiaqjanRanRanRanRanSanRanRanRaaeaaeaaeaaaaaaaaaakEakyamZatqameameamcameameamcaovawvameameamcameameapvapwaqlaqmaqnaqoaqpaqpaqqaqrapCaqsakyalTajTalUalUalUalUalUalValUalUaqtaquaqvaqwaqxaqyaqzaqAaqBaqCaqDaqEaqFaqGaqHaqIaqJaqKaqLaqMaqNaqOaqNaqPaqNaqNaqNaqQaqNaqRaqNaqNaqSasaaqTaqUaqVaqWaqXaqYaqZaraaraaraarbaraafvarcardarcaaeaaeaaaaaaaaeaaeareaxPareaaeaaeaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaqdargaqdaaeaaaaaaaaaaaaaaeaaaanRarhanRaaaaaaaaeaaeanRariarjarkarlarjarmarmarmarnaroarmarmarjarjarjarparqarranRaaeaaeaaeaaaaaaaaaakEakyarsatqameamcamcamcamcazsaovazsamcamcamcamcameapvapwaruaozanlarvarwarxaryaqrapCakyakyarzarAarBarCalnalnarDalnarEarFahMarGarHarIarJarKalwarLahMarMarNarOarParParParQarRarSarTarUarVarWarVarXarXarXarYarZarZarXarXarXatsasbaonascapXasdapYaseasfasgashasgasiaraaraaraardarcarcaaeaaeaaaaaaaaeareasjareaaeaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaaaaaaqdaqdatoaqdaqdaaaaaaaaaaaaaaeaaaanRaskanRaaeaaeaaeaabaslasmasnasnasnasnasnasnasnasoaspasnasnasnasnasnasnasqasranRaaeaaeaaeaaaaaaaaaakEakyakyatqameameazuaztaDzazxaDzaEPaDzaztaFSassameapvapvakyakyastakyakyamrasuasvaswakyasxasyaszasAasAasAasAasAasAasBarMasCahMahMasDajUasEahMaiCasFarMasGasHasHasHasHasHasHasIasJasKasHasLasHasHameamcameameameamcameazXasNaYOaonasOasPasQasRasSasTasUasVasWasXasYasZataatbatcarcaaeaaeaaeaaeareareaxPareareaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeanRanSanSanSanSanRanRanRanRanRanRanRanRatdateatfatgatdanRanRanRanRanRanRanRathatiatiatiatiatiatjatkatlatlatlatlatlatlatlatlatlatlatlatlatlanRanRatmatnanSaaaaaaaaeaaeaaaaaaakEakyamZaFTameatpamcaFUartamdamdamdartaFUamcameameapvattatuatvatwatwatxakyatyatzatAakyatBatCatDatEatEatEatEatEatFatGatHatIatIatIatJatKatLatIatIatIatMasGasHatNatOatPatQatRatSatTatUatVatWatXatYameatZatZatZatZatZamcazXasNaYOaonauaaubaucaudaueaufasgaugasgauharaaraaraauiarcarcaaeaaeaaaaaaaujaukaulaumaujaaaaaaaaaaaaaabaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaanRaunauoauoaupauqaurausautauuauvauwauxatdauyauzauAatdauBauqauqauCauDauEanRauFauGasnasnasnasnauHauIatlauJauKauLauMauNauOauPauQauRauSauTatlauUauVatmaqianSaaaaaaaaaaaeaaeaaaakEakyamZaFTamcamcamcaFUamdauXauYauZamdaFUamcamcamcapvavbavcaJcavdaveavfakyavgaqravhakyaviavjatEavkavlavmavnatEatEavoavpavqavqavravsavtavuavvarParParPavwasHavxavyavzavAatRavBavCavDavEavFavGavHavIavJavKavLavLatZameazZasNaYOaonaonaonaonavNavOaonaraaraaraaraaraafvarcauiavPaaeaaeaaaaaaaaaaujavQavRavSaujaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanRanRanRauqavTavUauqanRavVanRanRanRanRanRauvatdavWavXavYatdavZauqausawaawbawcauVawdaweauqauPauPawfauPauPatlawgawhawiawjawkawlauPawmawnawoawpatlanRanRatmaqianSaaaaaaapnaaaaaeaaeamrakyawqaFTameaJdaovaFUamdavaaJeauWamdaFUaovaJdameapvavbawrawsawtawuaJfawwawxawyawzawAawBawCawDawEawFawGawHawIatEawJawKakLajQahvawLajUawMasHasHasHasHasHasHawNavyavyawOatRawPawQawRawSawTawUawVamcatRawWavLawXatZameazZawYaCJawZaxaawZaxbaxbaxcaxdaxdaxdaxdaxdaxdaxdaxdaxeaaaaaaaaaaaaaaaaaeaujaxfaxgaxhaujaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeanRaxianRaxjaxkaxlaxmanRaxnaxlaxoauqaxpaxqaxratdatdaxsatdatdaxtauqaxuaxvaxuaxuanRaxwaxxauqaxyaxzaxAaxBaxCatlaxDaxEaxEaxFaxGaxHauPaxIaxJaxKaxIatlamcanSatmaqianSaaaaaaaxLaaeaaeaaaakEakyamZaFTamcamcamcaFUamdaxMatraxNamdaFUamcamcamcapvavbaxOatwatwatwatwakyaJgaxQaxRaxSaxTaxUaxVaxWaxXaxYaxZayaatEawJawKaybakKahvaycaydawMasHayeayfaygayhayiayjaykaylaymaynayoaypayqayraysaytayuayvaywayxavLayyatZameazZayzaYOayAayBaonaaeaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaeaaaaaaaaaaabaaeaaeaujaujayCaujaujaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaanRayEanRayFayGanRanRanRauqayHayIauqayJaxqayKayLayMayNayOayPayLayQayRaySayLayLayLayTayUarjayVayWayXayYayZatlazaazbawiazcazdazeazfazgazhaziazjazkazlazmaznazoazpazqazqazraaeaaaaaaakEakyamZaFTameameamcaFUartamdamdamdartaFUamcameameapvazvazwaJhatwatwazyakyazzazAazBakyatBatCatEazCazDazEazFazGatEawJawKazHazIahvazJajUazKasHazLayfaygayhayiazMazNazOazPazQazRazSazTazTazUazVazWameatZatZatZatZatZamcazZayzasMazXazXazXazXazXazXazXazXazXazXazXazYazZazZazZaAaaAaaAaaAaaAaaAaazYaAbaAcaAdazYazYazYazYazYazYazYazYazYazYazYazYazYaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanRanRanRanRanRaAeaqhanRaAfanRaAgaosaAhauqaAiaxqaAjaAkaAlaAlaAlaAlaAlaAlaAlaAmaAmaAmaAmaAnaAoaApaAqatlaAratlatlatlaAsaAtaAuaAvaAwaAxaAyaAzaAwaAAaABaACameanSatmaqianSaaaaaeamdaaaaaaaaaakEakyakyatqameameazuaJiaDzaJjaKIaKHaDzazxaFSameameapvapvakyakyaADakyakyamraAEasvaswakyaAFaAGatEaAHaAIaAJaAKaALatEaAMawKaANahvahvaAOaAPaAQaARaASaATaAUaAVayiaAWazNaAXavyavyaAYaAZaBaaBbaBcaBdaBeaBfaBgaBhaBiaBiatZameazZaBjaEdapRapRapRapRapRapRaBkapRapRapRaBlaBmapRapRapRaBmaBmaBmaBmaBmaBmaBmaBmaBnaBoaBpaBoaBoaBoaBqaBraBsaBtazYaBuaBvaBwazYaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanSaBxaxlaByanRaBzaBAauVaBBanRauqaxlaxlauqaBCaxqaAjaqiaBDaBEaBFaBDaBGaBHaBDaxlauqaBIauqaBJaBKaBLaBMaBNaBOaBPaBQaBRaxEaxEaxEaBSaBTaBUauPauPaBVaBWauPatlamcanSatmaqianSaaeaaeaBXamdamdaaeakEakyaBYatqameamcamcamcamcaKJaFUaKJamcamcamcamcameapvapwapxaBZaCaaCbaCcaCdaCeaqrapCakyaCfaAGatEaCgaChaCiaCjaCkatEawJawKaClahvaCmaCnaCoaCpaCqaCraCsaCtaCuaCvaCwaCxaCyaCzaCAaCBaCCaCDavyaCEaCFawVamcatRaCGaCHaCIatZameazZayzaFrazXaCKaCLazXaCMaCNazXazXapPaCOazXazYazZazZazZaAaaAaaAaaAaaAaaAaazYaCPaCQazYaCPaCRazYazYazYazYaCSaCTazYaCUaCVaCVazYaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanSaCWauqauqaCXaCYaCZarmarmarmarmarmarmarmarmarmaDaaDbaBDaDcaDdaDeaDdaDfaDgaDgaDgaDgaDgaDgaDgaDhaDiaDjaDkaDlaDmaDnaDoaAzaDpaDqaDraDsauPaDtaDuaDvaDwatlanRanRatmaqianSaaeamdamdaDxaaaaaaakEakyamZatqameaKKamcameameamcaFUamcameameamcameameapvapwaqlaDybugaDAaDAaDAaDBaDCaDDakyaDEaAGatEaDFaDGaDHaDIaDJatEawJaDKaDLahvaDMaDNaDOaDPaDQaDRaDSaDTaDUaDQaDVaDWaDXayiaDYaDZavyaEaavyaCEaEbayuayvaywaEcaBiaBiatZameazZayzaGyaEeaEeaEeaEeaEeaEeaEeazXapPaEfazXaaaaaeaaaaaeaaaaaaaaaaaeaaaaaeaaaazYaCQazYaEgaEhaEiaCVaEjazYaCSazYazYaCPaEkazYazYaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabanRanRanRanRanRaElaEmasnasnasnasnasnasnasnasnasnaEnaEoaBDaEpaEqaBDaEraEsaDgaEtaEuaEvaEwaExaEyaEzaEAatlaEBaECaEDatlaEEawkaEFaEGaEHaEIauPaEJaEKaELaEMatlaENanRatmaqianSaaeaaeaaaamdaaaaaaamrakyamZbuiamcameameameameamcaFUamcameameameameamcapvapwaruaEObysaoDaEQaERaESaETaEUakyaEVaAGatEaEWaEXaEYaEXaEZatEawJaFaaFbahvaFcaFdaFeaFfaFgaFhaFiaFjaFkaFgaFlaFmaFnaDYaFoaCDavyaCBaFpaCEaFqawVameatZatZatZatZatZamcazZayzaPnaEeaFsaFtaFuaFvaFwaEeaCKapPaFxazZaaaaaeaaaaaeaaaaaaaaaaaeaaaaaaaaaaAaaCQazYaFyazYazYazYazYazYaFzaBmaBmaBmaBsaFAaFBaFCaFBaFBaFBaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaeanRaqhaFDaFEaFEaFEaFEaFEaFEaFEaFEaFEaFFaFGaBDaFHaFIaBDaFJaFKaDgaFLaFMaFNaFOaFPaEyaEzaFQatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlauVanRatmaFRanSaaaaaeaaeaaeaabaaaakEakyamZalNbytameameamebNLamcaFUamcbNLameameamebNMakyaFVaoyaFWcvvanXamyaFYaFZaFZaFZaGaaGbaGcaxVaxVaxVaxVaxVaGdatEaGeaFaaGfahvaGgaGhaGiawMasHaGjaGkaGlaGmaGnaGoazNaGpaDYaFoaGqaGraGsaFpaGtaGuaBeaBfaBgaGvaGwaGxatZameazZayzaPoaEeaGzaGAaGBaGCaGDaEeapPaFxapPazZaaeaaaaaaaaeaGEaGFamdaaeaaaaaeaaeaAaaCQazYaGGaGHaGIaGJaGKazYazYaCPazYaGLaCSaGMaFBaGNaCVaGOaFBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeaaeanRaqhaFDaFEaGPaGQaGRaGSaGTaGUaGVaBDaGWaGXaGYaGZaHaaHbaHaaHcaHdaHeaHfaHgaHhaHiaHdaHjaHkaHlaHmaHnaHoaHoaHpaHqaHnaHraHsaHtaHsaHuaHvaHwaHxaHxaHxaHxaHyaHzanRaaaaaaaaeaaeaaaaaaakEakyakyalNanaaHAameamcanaamZcyFamZanaamcamecGLamZakyakyakyaHBcGMaHDamyaHEaFZaHFaHGaHHaGaaHIaHJaHKaHJaHJaHJaHLaHJaHMaHNajQahvaHOaHPaHQaHRasHasHaHSaHTatRasHaHUazNaHVaDYaFoaCDaHWaCBaFpaCEaHXawVamcatRaHYaHZaIaatZameazZayzaVlaEeaIcaIdaGAaIeaIfaIgaIhaIiapPazZaaaaaaaabamdamdaIjaIkamdaaaaaaaaaaAaaIlazYaImaCVaInaCVaCVazYaEhaIoazYaIpaCSaIqaFBaCVaIraIsaFBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaaanRaItaFDaFEaIuaIvaIwaIxaIxaIyaIzaIAaIBaICaIDaIEaIFaIGaIFaIHaIIaIJaIJaIKaILaIMaINaIOaIPaIQaHmaHnaHoaIRaIRaISaITaIUaIVaIWaIXaIYaHvaIZanRanRanSaslaJaanRaJbaJbaJbaJbaJbaJbaJbaJbalNakyakycQNanaaHAamZcQOamoammaXrbhEbhDbhFbhDbhDcQRcQTcQRcQVcQUcQXcQWaJkaJlaJmaJnaJoaGaakyakyakyakyakyakyaJpaJqaJraJsaJtatIaJuaJvaJwaJxaGnaJyaJzaJAaJBasHaJCazNaDYaJDaDYaJEavyaCBaJFaCEaJGayuayvaywaJHaGwaGwatZameazZayzaYOaEeaGDaJIaJJaJKaGDaEeaJLapPaJMazZaaeaaeaaaaaeaIkaDxamdaaeaaaaaeaaeaAaaCQazYaJNaJOaJPaJQaCVaJRaCVaJSazYaJTaCSaJUaJVaEiaJWaJXaFBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaanRaqhaFDaFEaJYaJZaKaaKbaKcaKdaKeaKfaKgaKdaKhaKiaKjaKdaKdaKkaKlaKmaKnaKoaKpaKqaKlaKraKsaKtaHmaHnaIRaHoaHoaKuaHnaKvaIWaIWaIWaKwaHvaKxaJbameamcaKyameaJbaKzaKAaKBaKCaKDaKEaKCaKFaKGakyakyakycQYcQZammcRaakyakyakyczDakEakEakEakyakyaKLalgaKMaFXaKNaKOaKPaKQaKRaKSaKTaKUaKVaKWaKXaKYaKZakyaLaaLbaLcaLdaLeaLfaLgaLhaLiaLjaLkaLlaLmaLnaLoaLpaLqaLraLsaLtaLuaLvaLwaLxaLyaCEaFqawVameatZatZatZatZatZamcazZayzaYOaEeaLzaLAaLBaLCaLDaEeaLEapPaLFazZaaaaaaaaaaaeaaaaaaaaaaaeaaaaaeaaaaAaaCQazYazYazYazYazYazYazYaLGazYazYaCVaCSaLHaFBaFCaFBaFBaFBaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaanRaqhaFDaFEaLIaLJaLKaLLaLMaLNaLOaBDaLPaLPaLPaLQaLRaBDaLPaLPaDgaEyaLSaDgaLSaEyaDgaLTaLUaLVaHnaHvaHnaHnaHnaHnaHvaLWaLXaIWaLYaLZaHvaKxaJbameamcaKyameaJbaKFaKFaMaaJbaMbaKFaJbaMcaMdaMeakyakyakyakyakyakyakyakyakyakyakyakyakyakyakyakyalNaMfaMgaMhamyaMiaFZaFZaFZaFZaFZaMjaMkaMlaMmaMnakyakyajQaAMaMoajQahvahvaMpaMqaMraCvaMsaMtaMuaMvasHaMwaMxaMyaMzaMzaMAavyavyavyaMBaMCaBeaBfaBgaMDaMEaMEatZameazZayzasMaEeaEeaEeaEeaEeaEeaEeazXapPaCLazXaaaaaeaaaaaeaaaaaaaaaaaeaaaaaaaaaazYaCQazYaEjaCVaEiaCVaMFaGLaCVaLHazYaCVaMGazYazYaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaanRaMHaMIaFEaBDaBDaMJaMKaMLaMKaMKaBDaMMaMNaLPaMOaHaaMPaMQaMRaBDaMSaMTaMUaMTaMVaBDaMWaMXaHnaMYaMZaNaaNbaNcaNdaHnaNeaNfaNgaNhaNiaHvaKxaKCaJbaNjaNkaJbaJbaJbaNlaJbaJbaJbaKCaJbaJbaJbaJbakyakyalgakyakyakyaNmaNnaNoakyakyakyalgakyaNpaNqakyapyaHCanlamyaFYaNranlanlanlaFYaNranVaNsaCaaNtaNuaxSaNvaNwaNxajQazHahvaNyaNzaNAayiaNBayiasHasHasHaNCaNDaNEaNFaNFaNGaNFaNFaNFaNHaNIaNJamcatRaNKaNLaNMatZameazZayzcCqazXazXazXazXazXazXazXazXapPaIbaCKazXazZazZazZazZazZazZazZazZazZazXazYaCQazYazYaGGaCPazYazYazYazYazYazYaCVaCSaCVazYaaaaabaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaabaaaanRaNNaNOaBDaNPaNQaNRaNSaNTaNUaNUaNVaNUaNWaNXaNYaNZaIxaIxaIxaOaaObaOcaOdaOeaOfaOgaOhaOiaOjaOkaOlaOmaOnaOoaOpaOqaOraOsaOtaOuaOvaOwaOxaOyaOzaOAaOBaOzaOzaOzaOzaOCaOzaOzaOzaODaOzaOzaOzaOzaOzaOEaOFaOGaOHaOIaOJaOHaOHaOKaODaOzaOzaOLaOzaOMaONaOOaOPaOQaOPaORaOSaOPaOPaOPaOTaOUaOVaOPaOWaOPaOXavqaOYaOZakLalSahvaPaajUawMahvaPbaPcaPdaPeaMzaMzaPfaPgaDSaDSaPhaDSaPiavyaPjaPkaPlayvaywaPmaMEaMEatZameazZcLtcIUaPpaPpaPpaPpaPpaPpaPpaPpaPqarVarVaPrarVarVaPsaPpaPtarVarVaPuaPvaPsaPwaPxaPyaPyaPzaPyaPyaPyaPAaPyaPyaPyaPyaPBaPCazYaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaanSaPDaPEaBDaPFaPGaPHaPIaPJaPKaPLaPMaPMaPNaPOaPPaPQaKbaKbaKbaPRaPSaPTaPUaPVaPSaPRaPWaPXaPYaPZaQaaQaaQbaQcaQdaQeaQfaQgaQhaQaaQaaQiaQjaQkaQlaQmaQnaQoaQpaQpaQpaQqaQraQpaQsaQtaQuaQvaQwaQlaQxaQyaQzaQzaQzaQzaQzaQzaQzaQAaQBaQlaQlaQCaQlaxSaQDaQEaQFaQGaQHaQIaQJaCaaCaaQKaQLaQMaQNaQOanlanlaQPaQPaQPaQPaQPaQPaQPaQQajUawMahvaPbaCLasHaQRaQSaQTaQUaQVaQWaQXaQYaDSaQZaRaaRbaRcatRameatZatZatZatZatZameazXayzasMazXazZazZazZazZazZazXazXaPbazXazXazXazXazXaRdazXaReaRfaRgaRhaRhaRiaCPaRjazYaMFaRkaCVaRlaRmaJUaCVaCVaCPazYaRnaRoazYazYazYazYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaaaaaaaaaaaaaaanRaRpaRqaBDaBDaDeaRraRsaBDaBDaBDaBDaBDaBDaBDaRtaRuaRvaMQaMRaBDaRwaRxaRyaRxaRzaBDaRAaRBaHnaRCaRDaREaRFaRGaRHaHvaRIaRJaRKaRLaRMaHvaRNaROaRPaRPaROaRQaRPaRRaRSaRTaRUaRVaRVaRVaRVaRVaRWaRWaRWaRWaRWaRWaRWaRWaRWaRWaRWaRXaRXaRXaRXaRYaRZakyaSaaSbaScakyakyakyakyaSdaSdaSdaSeaSfaSgaSdaSdaSdaShaSiaSjaSkaSlaSmaQPaSnaydaSoahvaPbaCKasHasHaSpaSqayuaSraSpaSqayuaPlayuaPlayuaSratRameamcameameameamcameazXayzasMameamcamcameamcamcameazXaSsazXaStapPaStapPaRdazXaSuaSvaSwaCLaSxaSyaSyaSyaSyaSyaSyaSyaSyaSyaSyaSyazYazYazYaRnaSzazYaSAaSBazYazYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaeaaeaaaaaaaaaaaaanRaqhaFDaBDaSCaSDaSEaSFaSGaLPaSHaSIaBDaSJaBDaLQaLRaBDaLPaLPaBDaBDaLPaLPaLPaBDaBDaSKaLUaLVaHnaHnaHnaHnaSLaSMaHvaHvaHvaHvaHvaHvaHvaKxaROaSNaSOaSPaSQaRPaRRaRSaSRaRUaRVaSSaSSaSSaRVaRWaSTaSUaSVaSTaSWaSTaSXaSYaSTaSZaTaaTbaTcaRXaRYaKFakyaTdaTeaTfakyaTgajDakyaThaTiaTjaTkaTlaTmaTnaToaQKaTpaTqaTraTsaTtaTuaTvaPaajUawMahvaPbazXameameaTwamcaTxameaTwamcaTxameaTxamcaTxameameameazXazXazZazZazXazXazXayzavMamcaTyaTzaTzaTzaTAamcazZaPbazZapPaTBapPapPaRdazXaTCaTCaTCaTCaTCaSyaTDaTEaTFaTGaTHaTIaTJaTKaTLaTMaTNaTOazYaTPaTQaTRaTSaTTaTUazYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaeanRanRanRanRanRaqhaFDaBDaTVaTWaTXaTYaTZaUaaUbaUcaUdaUeaUfaUgaUhaUiaUjaUjaUkaUlaUlaUmaUnaUjaUoaUpaUqaUraUsaUtaUuaUjaUvaUwaUxaUyaUzaQlaQxaQlaQlaUAaROaRPaRPaSPaUBaRPaRRaRSaSRaUCaRVaUDaUDaUEaRVaRWaSTaUFaUGaUHaUIaUHaUJaUKaSTaSZaULaUMaUNaRXaRYaUOakyaUPaUQaURakyakJaUSaOMaUTaUTaUUaUVaUWaUXaOPaUYaUZaVaaVbaVcaVdaVeaVfaTvaPaajUawMahvaPbazXamcatZaVgatRaVhatZaVgatRaVhatZaViatRaVjatZamcazXaCKaVkapQapRapRapRapRaVmavMamcaVnaVoaVpaVqaVramcazZaPbazXaStapPaStazXaRdaVsaTCaVtaVuaVvaVwaSyaVxaVxaVyaVzaVAaVBaVCaVDaVEaSyaTNaTNazYaRnaVFaCPaVGaCVaCVazYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaanRaVHaVIaVJanRaqhaFDaBDaVKaVLaVMaVNaVOaPOaVPaVQaVRaVSaVTaVUaVVaVWaVWaVXaVYaVZaWaaWbaWcaWdaWeaWfaWgaWhaWiaVWaWjaWkaWlaWmaWnaWoaWpaWqaWraWqaWsaWtaWuaWvaWwaWxaWyaRPaRRaRSaSRaRUaRVaWzaWAaWBaRVaRWaWCaSTaSTaWDaWEaWFaSTaSTaWGaSZaWHaWIaWJaRXaWKaWLakyaWMaWNaWOakyaWPatGakyaWQaWRaWSaWTaWUaWVaWWaWXaWYaWZaXaaXbaXcaXdaXeaTvaPaajUawMahvaXfazXameatZaXgaXhaXiatZaXjaXkaXlatZaXmaXnaXoatZameazXaSvaXpaXqaPpaPpaPpaPpcQMcQLameaVnaXsaXtaXuaVrameazXaPbazXazXapPaCKazXaRdapPaXvaXwaXxaXyaXwaXzaVxaVxaXAaVxaXBaXCaXDaVxaVxaSyaXEaXFazYaRnaSzazYaVGaCVaCVazYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaanRauqaXGaVJanRaXHaFDaBDaXIaXJaXKaXLaXMaLPaXNaXOaXPaXPaXQaXRaXSaXPaXPaXPaXTaXUaXVaXWaXXaXYaXTaXTaIQaXZaYaaIQaYbaYcaYdaYeaYcaYcaYcaYcaYcaYcaYcaKxaRPaRPaRPaSPaUBaRPaYfaYfaYgaYhaYiaYjaYkaYlaYmaRWaYnaWCaYoaYpaYqaYraYsaWGaSZaSZaSZaYtaYuaRXaYvaYwaYxaYyaYzaYAaYxaYwatGakyakyakyakyaYBaYBaYBakyakyakyaShaYCaYDaYEaYFaYGaQPaPaajUawMahvaPbazZameatZaYHaYIaYHatZaYJaYKaYJatZaYLaYMaYNatZameazZaSwaYOayzaYPaYPaYPaYPaYPaYPaYPaYQaYRaYSaYTaYUaYPazXaXfazXaYVaYWapPaFxaYXaYYaTCaYZaZaaZbaZcaSyaVxaZdaZeaVxaZfaXCaZgaZhaVxaSyaTNaZiazYaZjaSzazYaZkaTTaZlazYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaanRaoqauqaZmanRaqhaZnaBDaBDaFFaZoaBDaBDaBDaBDaBDaXPaZpaZqaZraZsaZtaZuaZvaZwaZxaZyaZzaZAaZBaZCaXTaZDaZEaZFaZGaZHaYcaZIaZJaZKaZLaZMaZNaZOaZNaYcaKxaRPaWvaZPaSPaZQaRPaZRaYlaZSaZTaZUaZVaZWaYlaZXaRWaZYaZZbaababbacbadbaebafbagbahbaibajbakaRXaYvaYwbalbambanbaobapaYwatGakybaqbaqbaqatwatwatwbarbasbatakybauaQPaQPaQPaQPaQPbavajUbawahvaPbazZameatZaYHbaxaYHatZaYJbayaYJatZaYNbazaYNatZameazZapPaYOayzaYPbaAbaBbaCbaBbaBbaDbaEbaFbaGbaHbaIaYPbaJbaKaRgaRhbaLaRhaRhaRiaTCaTCbaMbaNbaOaTCaSyaVxbaPbaQbaRbaSbaTbaUbaVaVxaSybaWbaXazYaRnbaYazYbaZbbaaCVazYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaanRaxmauqausbbbbbcbbdbbearjbbfbbgbbhbbibbjarjbbkbblbbmbbnbbobbpbbpbbqbbrbbsaUybbtbbubbvbbwbbxbbybbzbbAbbBbbyaYcaYcbbCbbDbbEaZNbbEaZNbbEaZNaYcaKxaRPaRPaRPaSPaUBaRPaZRaYlbbFbbGbbHbbIbbJaYlbbKaRWbbLbbMbbNbbObbPbbQbbRbbSaSZbbTaSZbbUbbVaRXaYvaYwbbWbbXbbYbbZbcaaYwatGakyatwatwatwatwatwatwatwatwatwakybcbbccajDbcdbcdahtaPaaJwbceahvaPbazXamcatZatZatZatZatZatZatZatZatZatZatZatZatZamcazXapPaYOayzaYPbcfbcgbchbcibcjbckbclbcmbckbcnbcoaYPbcpbcpbcpbcpaPbazXaCLazXaTCbcqbcraZaaZbbcsaSybctbctbctbctbcubcvbctbctbctaSyaTNaZiazYaRnaSzazYaZkaTTbcwazYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaabaaaaaaanRbcxbcyauqanRauqbczbcAaAmbcBbcCbcDbcEaAmaAmbcFbcGbcHbcIbcJbcKbcLbcMbcNbcObcPbbtbcQbcRbcSaIQbbzbcTbcUbcVbbybcWaYcbcXbcYbcZbcZbcZbcZbcZbcZbdabdbaRPaWvbdcbddbdeaRPbdfaYlbdgbdhbdibdjbdkaYlbdlaRWbdmaSTaSTbdnaUHbdoaSTaSTbbSbdpbdqbdrbdsaRXaYvaYwbdtbdubdvbdwbdxbdyatGakybdzbdzbdzbdzbdAbdBbdBbdBbdBakyajDaAGajDalSbdCahvaPaajUbdDahvaPbazXameamcameameameamcameameameamcameameameamcameazXapPaYOayzaYPbdEbaBbaBbdFbaBbdGbdHbdHbdIbaBbdJaYPbdKbdLbdMbcpaPbaCKapPbdNaTCbdObdPbdQbdRbdSaSybdTbdUbdUbdUbdVbdWbdUbdUbdTaSybdXbdYazYaRnaSzaCPaVGbdZaMFazYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeanRanSanRanRanRauqbeabebbecbedbeeauqbefauqauuauvaXPbegbehbcHbeibcHbejbekbelbemaKsbenbeobepaIQbbzbeqberbesbbybetaYcbeuaZNbbEaZNbbEaZNbbEaZNaYcaKxaRPaRPaRPaSPaUBaRPbevaYlaYlaRUbewbexbeyaYlbezaRWaSTbeAbeBaUHbeCaUHbeDbeEaSTbdpbeFbeGbeHaRXaYvaYwbeIbeJbeKbalbeLaYwatGakyakyakyakyakyakyakyakyakyakyakyajPbeMbeNbeObePbeQbeRbeSbeTbeUaPbazXazXazXbeVarZarZarZarZarZarZarZarZarZarZarXarXarXbeWbeXbeYaYPbeZbfabfbbfcbfdbfebffbfgbfgbfhbfiaYPbfjbfkbflbcpaPbazXapPbfmaXvaXwbfnbfobfpbfqaSybfrbdUbdUbdUbfsbftbfubfubfvaSybfwaZiazYaRnaSzazYbfxaMFaMFazYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaeanRauqbfybefbfzbfAaweauqbfBbfCbfDbfEaXPbfFbfGbfHbfIbfJbfKaZvbfLbfMbfNbfObfPbfQbfRbbzbfSbfTbfUbbybfVaYcbfWbfXbfYbfZbgaaZNbgbaZNaYcaKxaRPaWvbgcaSPaSQaRPaZRaYlbgdaRUaYkbgebgfaYlbggaRWaSTbghbgiaSTbgjaSTbgkbglaSTbgmbgnbeGbgoaRXaYvaYwbgpbgqbgrbgsbgtaYwatGbguajQajQajQakLakKbgvajQajQajQajQajQajQajDajGajSahvbgwbgxbgyahvaReaRhbgzaRhbgAbgBaqJaqJaqJaqJaqJbgCaqJaqJaqJaqJaqJaqJaqJbgDbgEaYPbgFbaBbgGbgHbdHbgIbgJbgKbgLbgMbgNaYPbgObgPbgQbcpaPbazXbgRbgSaTCbgTaXwbgUaZbbgVaSybgWbgXbgYbgZbhabhbbhcbdTbdTaSybfwbdYazYaRnaTQaTRbhdbhebhfazYaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaanRanRanRauqbfybefbhgbhhbhibhgbhgbhgbhgbhgaXPaXPaXPaXPaXPaXPaXPbhjbhkbhkbhlbhmbhnbhkbhkbhobbybbybbybbyaYcaYcaYcbhpaYcaYcaYcaYcaYcaYcaYcbhqaRPaRPaRPaRObhraRPaRVaRVaRVbhsbhtbhuaRVaRVaRVaRWaRWaRWaRWaRWaRWaRWaRWaRWaRWaRWaRXbhvbhwaRXaRQaYwbhxbhybhzbhybhAaYwbhBbhgbhgbhgbhgbhgbhgbhgbhgbhgbhgbhgbhgbhgbhgbhgbhgbhCbhDbhEbhFbhCbhGbhGbhGbhGbhHbhIbhGbhGbhGbhGbhGbhGbhGbhGbhGbhGbhGbhGbhGbhGbhGaYPaYPaYPbhJbhKaYPaYPaYPaYPaYPaYPaYPaYPbhLbhMbhNbcpbhOazXazXazXaTCbhPbhPbhQbhRbhPaSyaSyaSyaSybhSbhTbhUaSyaSyaSyaSybhVbhWazYaRnbhXazYbhYbhZazYazYaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaanRanRanRauqbfybefbhgbhhbhibhgbhgbhgbhgbhgaXPaXPaXPaXPaXPaXPaXPbhjbhkbhkbhlbhmbhnbhkbhkbhobbybbybbybbyaYcaYcaYcbhpaYcaYcaYcaYcaYcaYcaYcbhqaRPaRPaRPaRObhraRPaRVaRVaRVbhsbhtbhuaRVaRVaRVaRWaRWaRWaRWaRWaRWaRWaRWaRWaRWaRWaRXbhvbhwaRXaRQaYwbhxbhybhzbhybhAaYwbhBbhgbhgbhgbhgbhgbhgbhgbhgbhgbhgbhgbhgbhgbhgbhgbhgbhCcQPcQScQQbhCbhGbhGbhGbhGbhHbhIbhGbhGbhGbhGbhGbhGbhGbhGbhGbhGbhGbhGbhGbhGbhGaYPaYPaYPbhJbhKaYPaYPaYPaYPaYPaYPaYPaYPbhLbhMbhNbcpbhOazXazXazXaTCbhPbhPbhQbhRbhPaSyaSyaSyaSybhSbhTbhUaSyaSyaSyaSybhVbhWazYaRnbhXazYbhYbhZazYazYaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaabaaaaaaaaaaaeaaaaaaaaaaaaaaeaaaaaaaaeaaeaaeaaeanRbiaanRbibbfybicbhgbidbiebifbigbigbihbiibigbijbijbijbijbijbijbijbikbilbimbilbinbilbiobipbiobiqbiobiobirbiqbijbimbiobisbitbigbigbigbigbiubiibigbigbivbiwbixbiybigbizbiAbiBbiCbixbigbigbigbigbiDbiEbigbiFbigbigbigbiybiGbiGbiHbiIbiGbiJbiGbiJbiGbiKbiLbiMbiNbiObiLbiLbiLbiPbiLbigbigbigbiibigbihbigbigbigbigbiybiQbiRbiSbiTbiUbiVbiWbiWbiWbiXbiYbiWbiWbiZbjabjbbiWbiWbiWbiWbiWbjcbiWbiWbiWbjdbjebiWbjfbjgbjhbiWbiVbiWbiWbjdbiWbiWbiWbjibjjbjkbiWbjlbiWbjmbiWbjnbiWbjobjpbjqbiWbjrbjsbjtbjubjvbjwbjxbjybjzbjAahvbjBbjCaCPbjDbjEbjFbjFbjFbjFaaaaaaaaeaaeaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafvafvafvafvafvafvafvafvafvafvafvafvafvafvafvafvafvarhauqarhauqbfyaxmbhgbjGbjHbjIbjIbjIbjIbjJbjIbjKbjIbjIbjIbjIbjIbjIbjLbjIbjMbjIbjNbjIbjIbjObjIbjIbjIbjIbjJbjIbjKbjMbjIbjIbjIbjIbjIbjIbjIbjPbjQbjRbjRbjSbjRbjTbjUbjRbjRbjQbjVbjWbjXbjRbjRbjRbjRbjRbjYbjRbjRbjRbjRbjRbjUbjRbjRbjZbjSbjRbkabjXbjQbjRbkbbjIbjMbjIbkcbjIbjIbjIbjIbjIbjIbjIbjIbjLbjIbjIbjIbjIbjIbjIbkdbkebkfbkgbkhbkebkibkjbkjbkjbkkbkjbkjbklbkjbkmbknbkjbkjbkjbkjbkjbkjbkjbkjbkjbkobkjbkjbkjbkpbkqbkjbkrbkjbkmbknbkjbkjbkjbkqbklbkjbkjbkpbkjbkpbkjbkjbkjbkjbkjbkqbksbktbkubkobkjbkjbkjbkqbkjbkjbkvbkwbkxbkybkwbkzbkAbkBbkCbkDbjFaaaaabaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaeafvaaeaaeaaaanRanRanRauBbkEbkFbhgbkGbkHbkIbkJbkJbkKbkLbkMbkNbkJbkJbkJbkObkJbkJbkJbkJbkPbkQbkRbkSbkTbkUbkTbkTbkVbkTbkWbkTbkXbkYbkTbkTbkZbkTbkTbkTbkTblablbblcbldbkXbkTblebkUblfblgbkWblhblibljblfbkTblkbkTbkTbllbkTbkTbkTbkTblmbkUbkTblnbkTbkXbkTblobkXblpblqblrblsbkYbkTbkXbkTbkTbkTbkTbkTblhblhblhbkTbltblubkVbkTbkTbkTbkUblvblwblxblyblzblAblBblCblDblEblFblBblGblHblIblJblKblBblBblCblBblBblLblBblBblBblBblBblBblBblMblNblAblOblPblQblBblBblBblMblRblSblOblTblUblBblOblTblUblBblOblVblTblWblXblYblZbmabmbbmcblZbmabmbbmdbmebmfbmgbmhbmibmjbmkbmlbjFbjFbjFbjFbjFbjFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7807,7 +7807,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpTbpRbyrbLZbLZbLZbMabwsbwsbwsbwubwvbnCbnCbnCbwwbnCbMbbwybnCbnDbMcbMdbqabMebMfbMgbmtbMhbMhbnKbnLbIMbIMbnSbnSbMibMjbnSbMkbmtbMlbwJbMmbMnbnXbEtbKubMobMpbMqbMpbMrbKubAFbAGbAGbAGbAGbAGbAGbAGbAGbAGbAGbAGbAGbAGbMsbAGborborboqborbosborborbMtbmHbMubmHbmHbmHbmIbMvbmIbmHbMwbmHbMxbMyboOboKboFbMzbMzbMzbMAbMzbMzbMzbMBbtnameamebxjbJwbJwbxlbJwbJwbxjameameamcameamcbxmbxnbxoboQbMCbJCbMDbMEbMFbMGbMHbJCbMIbMJbMKbMLbMMbMNbMObMPbMKbMQbMRbMSbMTbMUbMVbMWbMXbMYbMZbNabNbbNcbtCamebzYbNdbNebNfbNgbNhbNibNjbNkbNlbNmbDFbNnbNobNobNobNpbNqbNrbNsbNtbNtbLLbNubNvbNwbNxbNybLLbNzbNAbNBbNCbNDbNEbNFbyhbyibNGbykbykbykbykbykbypbwfaaeafvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpPbpRbyrbLZbAsbNHbpPbNIbNIbNJbNKcRibuhbuhcRjbNNbNObNPbNQbNObNRbnDbNSbqabMebNTbsmbsnbsobsobspbsqbNUbNUbNUbNVbNWbnSbNXbNYbmtbsBbNZbsCbsBbOabObbKtbOcbOdbOebOfbOgbKtbOhbOibOjbOkbOibOlbOmbnXbnXbOnbOobmHbOpbopbOqbOrborborboqborbosborborborbOsbOsbOtbOubOvbOwbOxbOybOwbmHbmHboKbOzboObOAbOBbMzbOCbODbODbOEbOFbMzbMBbtnameameamcameameameameameamcameamebtnbtnbtnbhCbhCboPboQbMCbJCbOGbMFbMFbOHbOIbJCbOJbOKbOLbOMbONbOObOPbOQbMJbORbJGbOSbOTbOUbOUbOUbOVbOWbOWbOXbOYbOZbtCbPabPbbPcbPdbPebPfbPfbPfbPfbDDbPgbPhbPfbPibNtbNtbPjbPkbPlbPmbPnbNtbPobLLbPpbPqbPrbPsbPtbPubPvbPwbPxbPybPzbPAbAkbPBbAmbwfbykbykbPCbPDbPEbPFbwoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpTbpRbyrbyrbyrbyrbPGbNJbNJbPHbpTbnCbnCbnCbnCbPIbPJbPKbPLbPMbPNbPObPPbqabuqbqcbPQbutbuubuubuvbPRbIMbIMbnSbPSbPTbPUbPVbPWbmtbnXbnWbnXbnXbnXbEtbKubPXbPYbPZbQabQbbKtbQcbnXbQdbsCbyIbqkbQebsCbsCbsCbsCbmHbQfbCFbOqbQgbsVbsVbQhbsVbHebsVbsVbsVbQibQibQibQjbQkbQlbQmbQnbQobmHbQpboKbQqbQrbQsbQtbMzbQubQvbQwbQxbQybMzbMBbtnbtnbtnbtnbtnbtnbtnbtnbtnbtnbtnbtnbtnboKbQzbQAbhCboPboQbQBbJCbQCbQDbQEbQFbQGbJCbQHbMLbMLbJGbQIbQJbQKbQLbQMbQNbJGbtCbQObQPbQObQObQObQObQQbQObtGbtCbtCbQRbQSbQTbQUbQVbQWbQWbQWbQWbQXbQYbQZbRabRbbRcbRdbRebRfbRgbNtbNtbNtbNtbLLbRhbRibRjbRkbRlbLLbNzbRmbRnbRobRpbRqbwfbwfbBNbwfbRrbRsbBNbwfbwfbwfbwfaaeaaeaaeaaeafvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpPbRtbpSbpRbyrbRubpPbRvbRvbRvbpTaaaaaeaaabnCbRwbRxbRybRzbRxbRAbnDbRBbRCbRDbqcbREbmtbRFbnSbnKbnLbqgbqgbqgbqgbqgbqgbqgbqgbRGbnXbnXbnXbnXbEsbEtbKtbOcbRHbRIbRJbOgbKubRKbRLbRLbRLbRLbRMbRNbRObRObRPbnXbmHbOpbopbOqbRQbqFbqFbqGbqFbqHcCqbqFbqFbRRbRRbRRbRRbRSbRTbRUbRUbRVbmHboKboKboKboObRWbRXbMzbRYbRZbODbSabSbbMzbScbSdbzebSebzebzebSfbzebzebzebSgbzebzebzebShbzebzebSibSjbSkbSlbSmbSnbSobSpbSqbSrbJDbSsbStbSubJGbSvbSwbSxbSybMQbSzbJGameamcameamcameameamcameamcameazYbSAbSBbSCbSDbSEbSFbSGbSHbSIbSJbSKbSLbSMbSNbJTbSObSObSPbSQbSRbSSbSTbSTbSTbLLbSUbSVbSWbPtbSXbLLbSYbSZbTabudbTbbTcbwfbTdbTebTfbTgbThbwfaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpPbRtbpSbpRbyrbRubpPbRvbRvbRvbpTaaaaaeaaabnCbRwbRxbRybRzbRxbRAbnDbRBbRCbRDbqcbREbmtbRFbnSbnKbnLbqgbqgbqgbqgbqgbqgbqgbqgbRGbnXbnXbnXbnXbEsbEtbKtbOcbRHbRIbRJbOgbKubRKbRLbRLbRLbRLbRMbRNbRObRObRPbnXbmHbOpbopbOqbRQbqFbqFbqGbqFbqHbqFbqFbqFbRRbRRbRRbRRbRSbRTbRUbRUbRVbmHboKboKboKboObRWbRXbMzbRYbRZbODbSabSbbMzbScbSdbzebSebzebzebSfbzebzebzebSgbzebzebzebShbzebzebSibSjbSkbSlbSmbSnbSobSpbSqbSrbJDbSsbStbSubJGbSvbSwbSxbSybMQbSzbJGameamcameamcameameamcameamcameazYbSAbSBbSCbSDbSEbSFbSGbSHbSIbSJbSKbSLbSMbSNbJTbSObSObSPbSQbSRbSSbSTbSTbSTbLLbSUbSVbSWbPtbSXbLLbSYbSZbTabudbTbbTcbwfbTdbTebTfbTgbThbwfaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaabTibTjbwsbTkbTlbwsbnAbwsbwsbTjbTmaaaaaeaaabnCbnCbnCbnDbnDbnDbnDbnDbnDbnDbnFbnGbnHbmtbTnbTobnKbTpbTqbTrbTsbTtbTubPVbTvbnNbmtbTwbTwbTxbnXbnXbEtbKubTybTzbTAbTBbTCbKtbqkbTDbnXbTEbTEbTEbTEbTEbTEbTFbOibTGbTHbTHbTIbTJborborboqborbTKbTHbTHbTLbTMbTNbTObTPbTQbTRbTSbTTbOwbTUboKboKbTVbTWboKboFbMzbMzbTXbTYbTZbMzbMzboMboKboKbUaboJbTEbTEbTEbTEbTEbUbboKboKboKbTVbUcboKbhCboPboQbUdbJCbUebUfbUgbUhbUibJCbJGbJGbJGbJGbMQbMQbUjbUkbUlbUmbJGbUnbUobUobUobUobUobUobUobUobUnbUnbUpbUqbzWbzWbzWbzWbzWbzWbzWbzWbzWbzWbzWbzWbJTbJTbJTbJTbJTbJTbJTbJTbJTbJTbLLbUrbUsbUtbUubUvbLLbwfbwfbwfbudbUwbUxbwfbBNbwfbwfbwfbwfbwfaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpTbUybUzbyrbUAbUBbUCbUDbpTaaaaaeaaeaaebUEbUFbUGbUHbUGbUHbUGbUIbUJbTEbUKbULbUMbmtbmubmtbmvbmwbmtbmubmtbmtbmtbmtbmtbmtbmtbTEbTEbTEbTEbTEbUNbKubUObUPbUQbURbUObKubUSbTEbTEbTEbUTbUUbUVbUWbTEbUXbTEbmHbmHbmHbmHbmHbmHbmIbmJbmIbUYbmIbmLbmHbmHbmHbmHbmHbmHbmHbmHbmHbmHbmHbTEbTEbTEbTEbTEbmNbTEbUZbVabVbbVcbVdbTEbTEbTEbTEbTEbTEbTEbVebVfbVgbTEbTEbhCbrdbhCbhCbhCbhCbhCbVhbVibVjbJCbJCbJCbJCbJCbVkbJCbVlbVmbVnbJGbJGbJGbJGbJGbJGbJGbJGbVobVpbVpbVpbVpbVpbVpbVpbVpbVqbUnbVrbVsbUnbUnaaaaaeaaaaaeaaaaaaaaaaaaaaaaaaaaeaaaaaeaaabVtbVubVtaaaaaeaaebLLbVvbVvbVvbVvbVvbLLafvbVwbVxbVwbVxbwfbVybVzbVzbVAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpTbVBbUzbyrbyrbyrbVCbVDbpTaaaaaaaaeaaabUEbVEbVFbVGbVFbVGbVHbUIbVIbTEbVJbVKbVLbVMbVMbVNbVObVPbVQbVMbVMbVMbVRbVMbVMbVSbVTbVMbVMbVMbVMbVUbVVbVWbVXbVYbVZbWabWbbWcbWdbVMbVMbVMbWebWebWebWebVSbWfbVMbWgbVMbVSbVMbVUbWhbWibVObWebWjbWkbVMbVMbVMbVMbVMbVSbVSbVMbVMbWlbVMbVUbWgbVMbVMbVMbVMbWmbVMbVMbVObVMbWnbVMbWobVMbWpbVMbVMbVMbWqbWebWebWebVMbVUbiQbWrbWsbWtbWsbWubWsbWvbCYbWwbWxbWybWzbWAbWBbWCbWDbWEbWFbWFbWGbWHbWIbWGbWGbWGbWGbWGbWJbWGbWGbWKbWKbWGbWGbWGbWGbWLbWMbWNbWObWPbUnbUnbUnbUnbUnbUnbUobUobUobUobUnbUnbUnbUnbUnbUnaaaaaeaaaaaaaaeaaeaaaaaaaaeaaaaaaaaeafvbwfbwfbwfbWQbUwbWRbWSbWTbWUbWVaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7818,7 +7818,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaebUIbUIbUIccWccXccYccWccWccWccWccWccZbZIcdacdbcdacdccdacdccbgcddcbacdebUIcdfcbjcdgcdgcdgcdhcbjcdicdjcdkcdlcdmbKtcdncdocdpcdqcdrbKucbsbZWcdscdtcducdvcducducbzcdwbZWcdxcaacdycdzcdAcdBcdCcdDcdEcdFcdCcdGcdHcdIcdJcaacdKcdLcdMcdNcaecbScdOcbUcdPcdQcdRcdScdTcdUcbUcdVcdWcdXccacdYcdZceacebceccedceecefcegcehceicejcekcelcemamcamcameamecenceocepameameamcamcceqcercaEcescaEcetceucevcewcewcewcewcewcexceycezceAceAceBcczcewcewceCcaEceDceEceFceGceEceHceIceJceKccKceLceLceLceMccKceNcaSceOcePceOceOceQceRceSceTccVaaaaaaafvaaeaaeaaeafvaaeaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaccWceUceVceWceXceYceZcfaccZbZIcfbcfccfbcfccfbcfccbgcbhcfdcfebUIcdfcbjcffcfgcfhcficfjcfkcflcdxcfmcfnbKtcfocfpcfqcfrcfsbKucbscftcfucdtcducducfvcducbzcfwbZWcdxcaacaacaacaacaacfxcfycfzcfAcfBcaacaacaacaacaacfCcfDcfEcfFcaecbScfGcbUcfHcfIcfJcfKcfLcfMcbUcfNcfOcfPccacfQcfRcfRcfScfTcfUcfVcfWcfXcfYcfZcgaccfcelcemamcamcamcamecenceocepameamcamcamcceqcercaEcgbcaEcgccewcewcgdcgecgfcewcewcggcaHcghcewcgicgjcgkcglcgmcgncaEcgocgpccDccCccCcgqcgoccCccCccKcgrcgscgtcguccKcgvcaScgwcgxcgycgzcgAcgBcgCcgDccVaaaaaaaaaaaaaaeaaeafvaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeccWceUcgEcgFcgGcgHcgFcgIcgJcgKcgLcgLcgLcgLcgLcgLcgMcbhcgNcgNbUIcdfcbjcbjcbjcbjcbjcbjcgOcgPcgQcgRcgObKubKubKtbKubKubKtbKucbsbZWcgScgTcgUcducdvcgVcgWcgXbZWcdxcaacgYcgZchacbFchbchcchdchechfcbFchgchhcbNcaachicfDchjchkcaecbSchlcbUchmcfIchnchochpchqcbUcamchrcaoccachschtchuchuchvchwchxchychzchAchBchCccfcelcemameamcchDchDchEchFchGchDchDamcameceqcercaEchHchIcewcewcewcczcewchJchKchKchLchMchNchOchOchPchQchKchKchKchRchSchTchUchVchWchXchYchZciaccKccKccKccJccKccKcibciccidciecifcigcihccVccVccVciiaaaaaaaaaaaaaaaaaeafvaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccWccWccWcijcikcilcimcinccZciocgNcgNcgNcgNcgNcgNcbgcbhcQLcgNbUIcipciqcirciscisciscisciscitciucivcivcivcivciwcixciycizciAciBciCciDciEciFciGciHciIciJciKciLciMcaacdycdzcdAciNcdCciOciPciQcdCciRcdHcdIcdJcaaciSciTcagcaecaecbScdOcbUciUciVciWciWciWciWciXciYciZcjacjbcjccjdcjecjfcjgcjhcjicjjcjkcjlcjmcjnccfcelcemameamechDcjocjpcjqcjrcjschDameameceqcercaEchHcjtcewcewcjucjvcjwcjxcjxcjycjzcjAcjBcjCcjDcjxcjEcjxcjxcjFcjGcjHcjIcjJcjKcjLcjLcjLcjLcjLcjMcjNcjOcjNcjNcjNcjPcaScjQcjRcjScjTcjUcjVcjWcjXcjYaaaaaaaaaaaaaaaaaeaaeaaeaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccWccWccWcijcikcilcimcinccZciocgNcgNcgNcgNcgNcgNcbgcbhcgNcgNbUIcipciqcirciscisciscisciscitciucivcivcivcivciwcixciycizciAciBciCciDciEciFciGciHciIciJciKciLciMcaacdycdzcdAciNcdCciOciPciQcdCciRcdHcdIcdJcaaciSciTcagcaecaecbScdOcbUciUciVciWciWciWciWciXciYciZcjacjbcjccjdcjecjfcjgcjhcjicjjcjkcjlcjmcjnccfcelcemameamechDcjocjpcjqcjrcjschDameameceqcercaEchHcjtcewcewcjucjvcjwcjxcjxcjycjzcjAcjBcjCcjDcjxcjEcjxcjxcjFcjGcjHcjIcjJcjKcjLcjLcjLcjLcjLcjMcjNcjOcjNcjNcjNcjPcaScjQcjRcjScjTcjUcjVcjWcjXcjYaaaaaaaaaaaaaaaaaeaaeaaeaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeccWcjZckackbckcckdckeckfcbackgckhckgckhckgckhckickjcfdcfebUIcdfckkcklckmckncknckmckmckockpckqckrckscksckscktcksckuckvckwbZWbZWbZWbZWbZWbZWbZWbZWbZWbZWckxcaacaacaacaacaackyckzckAcfAckBcaacaacaacaacaackCckDckEcdOcdOcbScdOckFckGckHckIckJckKckLckMckNckOckPckQckRckSckTckUckVckWcjbckXckYckZclaclbccfclccldbztbztcleclfclgclhclicljclebztbztclkcercaEchHcllclmclncaEcaEcaEcaEclocaEclpcaHclqclrclscaHcltcltcltclucluclvclwclxclychXchXchXclzchXclAclBclBclCclBclDclEcaScaScaSclFcaSciiciicihciiciiaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeccWclGclHclIclJceZcinbZIclKcfbcfcclLcfccfbcfcclMclNclOclPbUIclQckxcgOamcamcameamcclRclSclRclRclTclRclSclRclRclUclVclWclXclYclYclZcmacmbcgOcmccmdcmecmfcmgcaacbCcmhcmicbFcmjcbHcbIcbJcmkcbFcmlcmmcmncaacmocmpcmqcmrcmrcmscdOcbUcmtcmucmvcmwcmxcmycmzcmAcmBcmCcmDcmEcmFcmGcmHcmIcmJccacmKcmKcmKcmKcmKcmKccgcmLamccmMchDcmNcmOcmPcmQcmRchDamcamccmScmTcaEcmUcmVcmVcmVcmWcmXcmYcmZcnacaEcnbcnccndcnecnfcngcltcnhcnicnjclucnkcnlcnmccCccCccCccCccCccCccCccCccCccCcnncnocgvclvcnpcnpchZciaccCcnqchZcnrcnsaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccWccWccWcntcnuccWcnvccWcnwbUIcbebZIbZIcnxcnybZIcbgcbhbZIcbebUIcdfckxcgOamcameamcamcclRcnzcnAcnBcnCcnDcnEcnFclRcnGcnHcnIcnJcnKcnKcnLcnMcnNcnOcnPcnQcnQcnRcnScaacdycdzcdAcnTcnUcdDcnVcdFcdCcnWcdAcnXcdycaacnYckDcnZcdOcdOcoacobcbUcoccodcoecofcogcohcoicojcokcolcomconcoocopcoqcorcoscotcoucovcowcoxcoycozcoAcoBbKWbKWcoCcoDcoEcoFcoGcoHcoCbKWbKWcoIcoJcaEcaEcaEcaEcaEcaEcaEcaEcoKcoLcoMcoNcoOcoPcoQcoRcoScoTcoUcoVcoWclucoXcoYcoZcoXaaaaaeaaaaaaaaaaaaaaaaaaccCchZcpacpbclBcpccpdcpecpecpfcpecpgchZcnsaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7831,20 +7831,20 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecyCcyDcdlcdlcyCaaeaaaaaaaaecgOcdlcdlcqVcgOaaaaaaaaacyEcyEcRlcyEcyEaaaaaaaaacgOcdlclRclRclRclSclRclRclRclRclRcnGcwhcyGcnGcnGcnGcpFcrrcdlcyHcwlcxCcxDcxDcxDcxDcxDcxCcyIcyJcyKcyLcyKcyMcyNcyOcyPcwlcdOcwrcpPccgcyQcpPcpPcpPcpQcpQcyRcyScpQcxUcxUcxUcxUcyTcyUcyVcyWcyXcyXcyYcyZcyXcrTcrUczaczbczcczdczecrVccgczfczgczgczgczgczgcpPcnscnscnscnscnsccCcclcqoczhcziczjczkcqoczlczmczncznczoczpczqczrczscztczuczuczvczwczxczyczvaaaaaaaaaaaaaaeaaaczzcqIczAcqIczBaaaafvafvafvaaeaaaaaaaaaaaaczCczCcRmczCczCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecxncdlczEczFcxnaaeaaeaaaaaecgOczGczHczIcgOaaaaaaaaaaaecyEczJcyEaaeaaaaaaaaacgOcvLczKcdlczHcdlcyDcdlczLcdlczKcdlcdlczMczNczOczPczQczRcwlcwlcwlcxCcxDcxDcxDcxDcxDcxCcxFczSczTczUczUczVczWczXczYcwlcdOczZcpPccgcpPcAacqdcqdcAbcAccAdcAecAfcAgcAgcAgcAhcAicAjcAkcAlcAlcAmcAncAocAlcApcAqcArcAscAtcAucAvcAwcAxcAyameameamcamcamcamcamcamcamcameamecnscclcqocqocAzcAAcqocqocABczmczncznczncACcADcAEcAFcAFcAFcAFcAGcAHcAIcAJczvaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaafvaaeaaaaaaaaaaaaaaeczCcAKczCaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecxncALcAMcANcxnaaaaaeaaeaaecgOcgOcpscgOcgOaaaaaaaaeaaecyEcRlcyEaaeaaeaaaaaecgOcgOcgOcpscpscpscgOcpscpscpscgOcgOcgOcAOcgOcgOcgOcAPcrrcwlcAQcARcAScxDcxDcxDcxDcxDcAScxFczScATcAUcAUcAVcAWcAXcAYcwlcdOcwrcpPccgcpPcAZcBacBbcBccBdcBecBfcBgcBecBecBecBhcBicBjcBkcBecBecBecBlcBmcBecBncBocBpcBqcBrcBscBtcBucBvcBwamcameameamcamdamdamdamccBxameamccnscclcqucBycBzcBAcBBcBCcBDcBDcAFcBEcBFcBGcBHcBIcBJcBKcBKcBKcBLcBMcBNcBOczvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafvaaeaaaaaaaaaaaeaaeczCcRmczCaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecxncxncxncxncxnaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaeaaeaaaaaacBPaaaaaaaaeaaeaaeaaeaaaaaeaaaaaaaaaaaaaaaaaeaaeaaaaaacgOcBQcgOaaeaaacBRcBScBTcBUcBVcBWcxDcxDcxDcxDcxDcBXcBYcBZcATcAUcCacCbcCccCdcCecwlcCfcwrcpPcCgcpPcChcwrcCicCjcCjcCkcClcClcClcClcClcClcCmcCncCocxUcCpcQMcCrcCscCtcxUcrVcCucCvcCwcCxcCycrVcCzcAyamcameamdamdamdaDxamdamdamdameamccnscclcqucCAczncCBcCCcCDcCEcCFcCGcCHcCGcCGcCIcCJcCKcCLczncCMczvcCNcCOcCPczvaaeaaeaaeaaeaaeaaeafvaaaaaaaaaaaaaaaaaaaaaafvaaeaaaaaaaaeaaeaaaaaacCQaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecxncxncxncxncxnaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaeaaeaaaaaacBPaaaaaaaaeaaeaaeaaeaaaaaeaaaaaaaaaaaaaaaaaeaaeaaaaaacgOcBQcgOaaeaaacBRcBScBTcBUcBVcBWcxDcxDcxDcxDcxDcBXcBYcBZcATcAUcCacCbcCccCdcCecwlcCfcwrcpPcCgcpPcChcwrcCicCjcCjcCkcClcClcClcClcClcClcCmcCncCocxUcCpcRbcCrcCscCtcxUcrVcCucCvcCwcCxcCycrVcCzcAyamcameamdamdamdaDxamdamdamdameamccnscclcqucCAczncCBcCCcCDcCEcCFcCGcCHcCGcCGcCIcCJcCKcCLczncCMczvcCNcCOcCPczvaaeaaeaaeaaeaaeaaeafvaaaaaaaaaaaaaaaaaaaaaafvaaeaaaaaaaaeaaeaaaaaacCQaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaeaaeaaaaaaaaacBPaaaaaaaaaaaeaaeaaaaaaaaeaaaaaaaaaaaaaaeaaeaaeaaeaaecgOcCRcgOaaeaaacgOcCScCTcCUcCVcCWcxDcxDcxDcxDcxDcCXcCYcCZcDacDbcDbcDccAWcDdcDecwlcdOcwrcyQcDfcDgcDhczfcpPcDicDjcCkcDkcDlcDmcDncDlcClcDocDpcDqcDrcDscDtcDucDvcDscDrcDwcrVcrVcrVcrVcrVcrVcDxcDycDwcDrcDrcDrcDrcDrcDwcnsccCccCccCccCcclcqucDzcCKcDAcDBcDCcDDcDEcDFcDGcDHcDHcDHcDIcDJcDKcDLcDMczvcDNcDOcDPczvaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafvaaeaaaaaeaaeaaaaaaaaacDQaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaeaaeaaaaaaaaaaaacBPaaaaabaaaaaaaaeaaeaaaaaeaaaaaaaaaaaeaaeaaaaaaaaaaaeaaaafvaaaaaeaaacgOcdxcwlcDRcDScDTcxDcxDcxDcxDcxDcDTcxFczScDUcDVcDVcDVcDWczXcDXcwlcDYcDZcEacEbcEccEdctjcEecDicEfcCkcEgcEhcEicEjcEkcElcEmcBjcEncDtcEocEpcEqcErcEscEtcEucEvcEwcExcDwcEycEzcEAcEBcECcEDcEEcEFcEGcEHcDwcsnchZchZcEIctUcclcqucqucqucqucEJcqucEKcELcEMcENcENcEOczncEPcENcENcEQcERcyvcyvczvcEScyvaaeaaeaaeafvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafvaaeaaeaaeaaaaaaaaaaaacETaaaaabaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaeaacaaeaaeaaaaaaaaaaaaaaacBPaaaaaaaaaaaaaaaaaeaaeafvafvafvafvafvafvafvafvafvafvafvafvafvafvaaacgOcdxcEUcwlcwlcEVcxDcxDcxDcxDcxDcEVcEWcEXcEYcEYcEYcEYcEYcEZcFacwlcFbcFccFdcFecpPcdOcFfcdOcDicyQcCkcFgcFhcFicFjcFkcFlcFmcFncFocDtcFpcFqcFrcFscFtcFtcFtcFucFvcFwcFxcFycFzcFAcFBcFCcFDcFEcFFcFGcFHcDwcFIcpecFJcFKcFLcFMcFNcFNcFOcFNcFPchZcqucFQcFQcFQcFRcFScFTcFUcFVcFVcFVcDMcFWaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafvaaeaaeaaaaaaaaaaaaaaacETaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaecFXcFXcFXcFXcFYaaecFZaaecFYcGacGacGacGaaaeafvaaaaaeaaeaaaaaaaaaaaaaaaaaaaaeaaeaaeaaaaaacgOcGbcdlcGccwlcEVcxDcxDcxDcxDcxDcEVcwlcGdcGecxFcGfcxFcxFcGgcwlcwlcGhcpPcGicGjcpPcGkcpPcpPcDicGlcCkcGmcGncGocGocGpcClcGqcokcFocDtcGrcGscGtcGucGvcGwcGxcGycGzcGAcDwcGBcDrcDrcDycDwcGCcGDcGEcGFcGGcDwcnsccCcGHccCccCccCcgpccCctUctUcGIcGJcqucFWcFWcFWcGKcRncFWcRocGNcFWcFWcFWcFWaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafvaaecGOcGOcGOcGOcGPaaecETaaecGPcGQcGQcGQcGQaaeaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaeaaecGRcGScGScGTcGUcGVcGWcGXcGYcGYcGZafvafvafvaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgOcdxcdlcgOcwlcEVcxDcxDcxDcxDcxDcEVcwlcwlcwlcwlcwlcwlcwlcHacwlcdOcGhcpPcwrcCzcpPcHbcHccpPcHdcHecCkcGmcGncGocGocHfcClcHgcpUcHhcDrcDrcDwcDwcDwcDwcHicDwcHjcHkcHlcDwccgchlcdOcHmcDwcHncGDcHocDrcDrcDramdccCcGHcnsamccnscHpchZcHqchZchZchZccCaaaaaacFWcHrcHscFWcHtcHucFWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafvafvafvcHvcHwcHwcHxcHycETcHzcHAcHBcHBcHCaaeaaeaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaecHDcHDcHDcHDcHEaaecHFaaecHEcHGcHGcHGcHGaaeaacaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgOcdxcdlcgOamccHHcHIcHIcHJcHIcHIcHKamccpPcHLcdOcHMcHNcHNcHOcHPcHPcHQcpPcwrcCzcpPcpPcpPcpPcpPcpPcCjcxUcxUcxUcxUcxUcxUcHRcpUcFocDtamccHScHTcHUcHVcHWcHVcHXcHYcHZcDwccgcfGcdOcIacDwcIbcIccIdcIecIfcDramdccCcIgcnsamecnscIhchZchZchZchZchZccCaaaaaacIicGKcRncFWcRocGNcIiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaecIjcIjcIjcIjcIkaaecETaaecIkcIlcIlcIlcIlaaeaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaeaaaaaaaaaaaaaaaaaacGVaaeaaaaaaaaaaaaaaaaaeaacaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacgOcdxcvLcgOamcamcameameameameameamcamccpPcdOcpPcImcIncpPcIocpPcIncpPcyQcIpcIqcpPcHbcIrcpPcIscHbcCjcItcIucIvcIwcIxcIycIzcuPcEncDtamccHScIAcIAcIBcICcIDcIEcIFcIGcDwccgcdOcdOcIHcDwcIIcGCcIJcDtcIKcDramcccCcILcnsamecnscsrchZcIMcINchZchZcIOcIPcIQcIQcIRcIScIQcITcIUcIQcIVcIWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaacaaeaaaaaaaaaaaaaaaaaacETaaeaaaaaaaaaaaaaaaaaeaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaeaaaaaaaaaaaaaaaaaacGVaaeaaaaaaaaaaaaaaaaaeaacaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacgOcdxcvLcgOamcamcameameameameameamcamccpPcdOcpPcImcIncpPcIocpPcIncpPcyQcIpcIqcpPcHbcIrcpPcIscHbcCjcItcIucIvcIwcIxcIycIzcuPcEncDtamccHScIAcIAcIBcICcIDcIEcIFcIGcDwccgcdOcdOcIHcDwcIIcGCcIJcDtcIKcDramcccCcILcnsamecnscsrchZcIMcINchZchZcIOcIPcIQcIQcIRcIScIQcITcRccIQcIVcIWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaacaaeaaaaaaaaaaaaaaaaaacETaaeaaaaaaaaaaaaaaaaaeaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaecFXcFXcFXcFXcFYaaecGVaaecFYcGacGacGacGaaaecIXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgOcdxcIYcgOcgOcgOcpscpscpscpscpscgOcgOcpPcdOcpPcpPcIncFfcyQcIZcJacpPcpPcJbcBvcEccJccEccJdcJecGkcCjcJfcJgcJhcJicJjcJkcJlcJmcFocDtamccHScIAcJncHVcJocHVcJpcJqcJrcDwccgcdOcdOcJscDwcJtcJucJvcDtcJwcDramcccCcJxcnsamccnscsqchZchZchZccEchZcIOcJycJzcJzcJzcJzcJAcJzcJzcJzcJBcJCcJDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaecGOcGOcGOcGOcGPaaecETaaecGPcGQcGQcGQcGQaaecIXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaeaaecGRcGScGScJEcGUcGVcGWcGXcGYcGYcGZaaeaaecIXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgOcdicmfcJFcmfcJGcdlcdlcvLcdlcdlcJHcdlcJIcdOcJJcdOcdOcdOcdOcdOcdOcdOcJKcJLcJMcJNcJOcJOcJOcJPcJQcJRcJhcJScJTcJUcJVcJWcJXcJYcJZcDwcDwcDwcDwcDwcDwcKacDwcDwcKbcDwcDwcKccKdcGkcKecDwcDrcDrcDtcDrcKfcDramcccCcKgccCccCccCccCccCcKhcKicGIcGJcIOcJycJzcJzcJzcJzcJzcJzcJzcJzcJzcKjcJDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaeaaecHvcHwcHwcKkcHycETcHzcHAcHBcHBcHCaaeaaecKlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaecHDcHDcHDcHDcHEaaecGVaaecHEcHGcHGcHGcHGaaecIXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgOcgOcgOcgOcgOcgOcpscpscpscpscpscgOcgOcpPcdOcyQcDicDicDicDicDicDicDicKmcKncKncDicDicDicDiczfcCzcCjcCjcCjcCjcCjcCjcCjcCjcKocaocDicKpcqdcqdcqdcqdcKqcKrcqdcqdcqdcqdcKscdOcwtcwrczgamcamcamcavaamdauWamcccCcKtcKuchZchZcKvclvchZchZchZchZcIOcJycJzcJzcJzcJzcJzcJzcJzcJzcJzcKjcJDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaecIjcIjcIjcIjcIkaaecETaaecIkcIlcIlcIlcIlaaecIXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaeaaaaaaaaaaaaaaaaaacGVaaaaaaaaaaaeaaeaaaaaecIXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaabaaaaaaaaeaaacpPcdOcdOcDicdOcdOcKwcdOcGkcdOcdOcdOcdOcKxcpPcKycKzcKAcKBcKCcKCcKDcKCcKCcKCcKEcKFcKGcKHcKIcKJcKKcHPcHPcHPcKLcKMcKNcKNcKNcKNcKOcEdcEdcuEcpPcpPccCcnscnscKPcnscnsccCcKQccCcvyccCccCccCccCcgpcaQccCcIOcJycJzcJzcJzcJzcJzcJzcJzcJzcJzcKjcJDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaeaaaaaaaaaaaaaaaaaacETaaaaaaaaaaaeaaeaaaaaecIXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaecFXcFXcFXcFXcFYaaecGVaaecFYcGacGacGacGaaaecIXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKRaaeaaeaaeaaeaaeaaeaaecpPcdOckCcKScdOcKTcKUcdOcKVcdOcdOcdOcdOcKWcpPcdOcdOcKXcKYcKZcqdcqdcqdcLacqdcLbcLccLdcLecLbcLfcpPcpPcpPcpPcLgcIncLhcLicLjcpPcLkcLlcLlcLmcLncLncLocLpcLqcLrcLscLtcLocLucgpcxgccCaaaaabccCcLvchZcLwcIOcJycJzcJzcJzcJzcJzcJzcJzcJzcLxcJCcJDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaecGOcGOcGOcGOcGPaaecETaaecGPcGQcGQcGQcGQaaecIXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaeaaecGRcGScGScGTcGUcGVcGWcGXcGYcGYcGZaaeaaeaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaeaaaaaaaaacpPcdOcdOcDicKwcLycKTcdOcpPcoacdOcdOcLzcLAcyQcKwcLBcpPcdOckDcHbcLCcoacobcLDcDicLEcLFcLGcDicdOcLHcLIcLJcpPcLgcpPcpPcpPcpPcpPcpPcyQcpPcpPcpPcpPccCcnscnscKPcnscnsccCccCccCcvyccCaaaaaaccCclvcqNcLKcIOcLLcIQcIQcIQcIQcIQcIQcIQcIQcLMcLNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaeaaecHvcHwcHwcHxcHycETcHzcHAcHBcHBcHCaaeaaeaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaeaaaaaaaaaaaaaaaaaacGVaaaaaaaaaaaeaaeaaaaaecIXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaabaaaaaaaaeaaacpPcdOcdOcDicdOcdOcKwcdOcGkcdOcdOcdOcdOcKxcpPcKycKzcKAcKBcKCcKCcKDcKCcKCcKCcKEcKFcKGcKHcKIcKJcKKcHPcHPcHPcKLcKMcKNcKNcKNcKNcKOcEdcEdcuEcpPcpPccCcnscnscKPcnsccCccCcKQccCcvyccCccCccCccCcgpcaQccCcIOcJycJzcJzcJzcJzcJzcJzcJzcJzcJzcKjcJDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaeaaaaaaaaaaaaaaaaaacETaaaaaaaaaaaeaaeaaaaaecIXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaecFXcFXcFXcFXcFYaaecGVaaecFYcGacGacGacGaaaecIXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKRaaeaaeaaeaaeaaeaaeaaecpPcdOckCcKScdOcKTcKUcdOcKVcdOcdOcdOcdOcKWcpPcdOcdOcKXcKYcKZcqdcqdcqdcLacqdcLbcLccLdcLecLbcLfcpPcpPcpPcpPcLgcIncLhcLicLjcpPcLkcLlcLlcLmcLncLncLocLpcLqcLrcLscRdcLocLucgpcxgccCaaaaabccCcLvchZcLwcIOcJycJzcJzcJzcJzcJzcJzcJzcJzcLxcJCcJDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaecGOcGOcGOcGOcGPaaecETaaecGPcGQcGQcGQcGQaaecIXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaeaaecGRcGScGScGTcGUcGVcGWcGXcGYcGYcGZaaeaaeaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaeaaaaaaaaacpPcdOcdOcDicKwcLycKTcdOcpPcoacdOcdOcLzcLAcyQcKwcLBcpPcdOckDcHbcLCcoacobcLDcDicLEcLFcLGcDicdOcLHcLIcLJcpPcLgcpPcpPcpPcpPcpPcpPcyQcpPcpPcpPcpPccCcnscnscKPcnsccCccCccCccCcvyccCaaaaaaccCclvcqNcLKcIOcLLcIQcIQcIQcIQcIQcIQcIQcIQcLMcLNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaeaaecHvcHwcHwcHxcHycETcHzcHAcHBcHBcHCaaeaaeaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaacHDcHDcHDcHDcHEaaecLOaaecHEcHGcHGcHGcHGaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaeaaaaaaaaacpPchlcdOcKmcdOcLPcKwcdOcpPcobcdOcdOcdOcLQcDicDicDicDicfGckDcLRcLRcLRcLRcLRcLRcLScLTcLUcLRcLRcLRcLRcLRcLRcLgcpPcLVcpPcLWcKwcdOcLXcLYczgaaaaaaaaaaaeamdatramdaaeaaaaaaaaaafvaaeaaeaaeccCcLZcMacMbccCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaacIjcIjcIjcIjcIkaaecMcaaecIkcIlcIlcIlcIlaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaeaaaaaacBPaaaaaaaaeaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaeaaaaaaaaacpPcMdcMecDicDicDicGkcGkcDiczgczgczgczgcpPcpPcMfcMgcDicpPcMhcLRcMicMjcMjcMkcMlcMmcMncMocMpcMqcMrcMrcMrcLRcLgcyQcMscpPcMtcdOcMucdOckCczgaaaaaaaaeaaeaaeaaaaaeaaeaaeaaaaaaafvaaaaaaaaeccCcnscnscnsccCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaeaaaaaacCQaaaaaaaaeaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaacaacaacaaeaaeaaaaaacBPaaaaaaaaeaaeaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaacpPcdOcdOcdOcdOcyQcLHcwscpPaaaaaeaaaaaecMvcDicDicDicDicMwckDcLRcMxcMycMrcMzcMAcMBcMCcMDcMEcMFcMrcMycMGcLRcLgcpPcpPcpPcpPcpPcpPcMHcMHcpPaaaaaeaaeaabaaaaaaaaaaaaaaeaaeaaaafvaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaaeaaeaaaaaacCQaaaaaaaaeaaeaacaacaadaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/MetaStation/MetaStation.v41I.dmm b/_maps/map_files/MetaStation/MetaStation.v41I.dmm index e5d354ba890..740d7025b17 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41I.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41I.dmm @@ -989,7 +989,7 @@ "ata" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Storage Room"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fore) "atb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplate"},/area/maintenance/fore) "atc" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/maintenance/fore) -"atd" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 1; on = 1},/obj/machinery/light/small{dir = 1},/obj/structure/table/wood,/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/obj/item/weapon/lighter,/turf/simulated/floor/wood,/area/crew_quarters/sleep) +"atd" = (/obj/machinery/light/small{dir = 1},/obj/structure/table/wood,/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/obj/item/weapon/lighter,/turf/simulated/floor/wood,/area/crew_quarters/sleep) "ate" = (/obj/structure/closet/secure_closet/personal/cabinet,/obj/machinery/alarm{pixel_y = 23},/obj/item/clothing/under/assistantformal,/turf/simulated/floor/wood,/area/crew_quarters/sleep) "atf" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/machinery/button/door{id = "Cabin3"; name = "Cabin Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/obj/effect/decal/cleanable/cobweb2,/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/wood,/area/crew_quarters/sleep) "atg" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/crew_quarters/sleep) @@ -1559,7 +1559,7 @@ "aDY" = (/obj/machinery/computer/secure_data,/obj/machinery/button/flasher{id = "secentranceflasher"; name = "Brig Entrance Flash Control"; pixel_x = -24; pixel_y = 24; req_access_txt = "1"},/obj/machinery/button/door{id = "Secure Gate"; name = "Cell Window Control"; normaldoorcontrol = 0; pixel_x = 5; pixel_y = 27; req_access_txt = "0"; specialfunctions = 4},/obj/machinery/button/door{id = "briglockdown"; name = "Brig Lockdown Control"; pixel_x = 5; pixel_y = 37; req_access_txt = "0"},/obj/machinery/light/small{dir = 1},/obj/machinery/button/door{desc = "A remote control switch for the medbay foyer."; id = "innerbrig"; name = "Brig Interior Doors Control"; normaldoorcontrol = 1; pixel_x = -5; pixel_y = 37; req_access_txt = "63"},/obj/machinery/button/door{desc = "A remote control switch for the medbay foyer."; id = "outerbrig"; name = "Brig Exterior Doors Control"; normaldoorcontrol = 1; pixel_x = -5; pixel_y = 27; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "aDZ" = (/obj/structure/filingcabinet/chestdrawer{pixel_y = 3},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "aEa" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/components/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/machinery/button/flasher{id = "holdingflash"; name = "holding cell flasher button"; pixel_x = 23; pixel_y = 23; req_access_txt = "1"},/obj/machinery/camera{c_tag = "Brig - Desk"; dir = 8; network = list("SS13")},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29; pixel_y = -2},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) -"aEb" = (/obj/machinery/requests_console{department = "Detective's office"; pixel_x = -30; pixel_y = 0},/obj/structure/table/wood,/obj/machinery/light/small{dir = 8},/obj/item/weapon/book/manual/wiki/security_space_law,/obj/item/device/camera{desc = "A one use - polaroid camera. 30 photos left."; name = "detective's camera"; pictures_left = 30},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) +"aEb" = (/obj/machinery/requests_console{department = "Detective's office"; pixel_x = -30; pixel_y = 0},/obj/structure/table/wood,/obj/machinery/light/small{dir = 8},/obj/item/weapon/book/manual/wiki/security_space_law,/obj/item/device/camera/detective,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) "aEc" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) "aEd" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) "aEe" = (/obj/machinery/light/small,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -26},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) @@ -8395,6 +8395,8 @@ "dfw" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue) "dfx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "dfy" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) +"dfz" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/engine/vacuum{tag = "icon-bcircuit"; icon_state = "bcircuit"},/area/toxins/xenobiology) +"dfA" = (/obj/machinery/camera{c_tag = "Xenobiology Lab - Kill Chamber"; dir = 1; network = list("SS13","RD","Xeno"); start_active = 1},/turf/simulated/floor/engine/vacuum{tag = "icon-bcircuit"; icon_state = "bcircuit"},/area/toxins/xenobiology) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8611,8 +8613,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadczdecdcIddYdedddWdcIdeedcFdcPdcPdcPdcPdebaaaaaaaaaaafaaacTCcXvcTCcTCcTCcTCcTCcTCcTCcTCcTCcXscTCaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadczdegdefdeidehdekdejdeldcFdendemdemdeodczaaaaaaaaaaaaaaacTCdeOdePdePdePdeQdeRcXscXscXscXscXscTCaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadepdcAdcAdcAdcAdcAdcAdcAdeqdcAdcAdcAdcAderaaaaaaaaaaafaaacTCcTCcTCcTCcTCcTydeScTycTCcTCcTCcTCcTCaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadetdesdesdesdeudesdesdeudesdesdesdevaaaaaaaaaaaaaafaafaafaaaaafcTCdeVdeVdeWdeVdeVcTCaafaafaafaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadewdewdewdeudewdewdeudewdewdewaaaaaaaaaaaaaaaaaiaaaaafaaaaaacTCdeVdeVdeWdeVdeVcTCaaaaafaaaaafaaaaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadetdesdesdesdeudesdesdeudesdesdesdevaaaaaaaaaaaaaafaafaafaaaaafcTCdfzdeVdeWdeVdfzcTCaafaafaafaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadewdewdewdeudewdewdeudewdewdewaaaaaaaaaaaaaaaaaiaaaaafaaaaaacTCdfAdeVdeWdeVdeVcTCaaaaafaaaaafaaaaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaaaaaaaaacTCcTCcTydeXcTycTCcTCaaaaaaaaaaagaaiaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaiaagaagaaaaafaaacXlaaaaaaaafaagaaiaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaiaagaaaaaaaafaagaagaagaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm index 0c7fe627d5b..a4e4cee0356 100644 --- a/_maps/map_files/MiniStation/MiniStation.dmm +++ b/_maps/map_files/MiniStation/MiniStation.dmm @@ -347,7 +347,7 @@ "gI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/pen,/turf/simulated/floor/plasteel,/area/security/brig) "gJ" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/brig) "gK" = (/obj/machinery/computer/security/wooden_tv,/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/brig) -"gL" = (/obj/structure/table/wood,/obj/item/device/camera{desc = "A one use - polaroid camera. 30 photos left."; name = "detectives camera"; pictures_left = 30},/obj/machinery/atmospherics/components/unary/vent_pump{dir = 8; on = 1},/obj/item/device/taperecorder{pixel_y = 0},/obj/machinery/camera/autoname,/obj/item/weapon/folder/yellow,/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/carpet,/area/security/brig) +"gL" = (/obj/structure/table/wood,/obj/item/device/camera/detective,/obj/machinery/atmospherics/components/unary/vent_pump{dir = 8; on = 1},/obj/item/device/taperecorder{pixel_y = 0},/obj/machinery/camera/autoname,/obj/item/weapon/folder/yellow,/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/carpet,/area/security/brig) "gM" = (/obj/item/weapon/storage/secure/safe{pixel_x = 4; pixel_y = 26},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/carpet,/area/security/brig) "gN" = (/obj/machinery/mineral/ore_redemption{input_dir = 4},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/hallway/primary/central) "gO" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"},/area/hallway/primary/central) @@ -508,7 +508,7 @@ "jN" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/wall,/area/quartermaster/storage) "jO" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/hallway/primary/central) "jP" = (/obj/machinery/door/window/eastleft,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/hallway/primary/central) -"jQ" = (/obj/machinery/door/firedoor/heavy,/obj/machinery/door/airlock/research{name = "Toxins Lab"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) +"jQ" = (/obj/machinery/door/firedoor/heavy,/obj/machinery/door/airlock/research{heat_proof = 1; name = "Toxins Lab"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "jR" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "jS" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) "jT" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"},/area/janitor) diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index 466ee2f282b..a5edf3f42c9 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -980,7 +980,7 @@ "asR" = (/obj/effect/decal/cleanable/cobweb,/obj/structure/closet/secure_closet/chemical,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "asS" = (/obj/structure/closet/secure_closet/medical1,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "asT" = (/obj/structure/closet/secure_closet/chemical,/turf/simulated/floor/plating,/area/maintenance/fpmaint) -"asU" = (/obj/machinery/requests_console{department = "Detective's office"; pixel_x = -30; pixel_y = 0},/obj/structure/table/wood,/obj/item/device/camera{desc = "A one use - polaroid camera. 30 photos left."; name = "detectives camera"; pictures_left = 30},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) +"asU" = (/obj/machinery/requests_console{department = "Detective's office"; pixel_x = -30; pixel_y = 0},/obj/structure/table/wood,/obj/item/device/camera/detective,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) "asV" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "asW" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/carpet,/area/security/detectives_office) "asX" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) @@ -3907,7 +3907,7 @@ "bxg" = (/obj/structure/reagent_dispensers/watertank,/obj/effect/decal/cleanable/cobweb2,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bxh" = (/obj/structure/bed/chair/comfy/black{dir = 1; icon_state = "comfychair"; name = "pilot's chair"},/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/syndicate) "bxi" = (/obj/machinery/computer/aifixer,/obj/machinery/requests_console{announcementConsole = 1; department = "Research Director's Desk"; departmentType = 5; name = "Research Director RC"; pixel_x = -2; pixel_y = 30},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor) -"bxj" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the RD's goons from the safety of his office."; name = "Research Monitor"; network = list("RD"); pixel_x = 0; pixel_y = 2},/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor) +"bxj" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the RD's goons and the AI's satellite from the safety of his office."; name = "Research Monitor"; network = list("RD","MiniSat"); pixel_x = 0; pixel_y = 2},/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/hor) "bxk" = (/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 1},/area/crew_quarters/hor) "bxl" = (/obj/structure/rack,/obj/item/weapon/circuitboard/aicore{pixel_x = -2; pixel_y = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"},/area/crew_quarters/hor) "bxm" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/flora/tree/pine/xmas,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) @@ -5440,8 +5440,8 @@ "caF" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/camera{c_tag = "Atmospherics Central"; dir = 4; network = list("SS13")},/obj/machinery/atmospherics/components/binary/pump{dir = 0; name = "Port to Filter"; on = 0},/turf/simulated/floor/plasteel,/area/atmos) "caG" = (/obj/machinery/atmospherics/components/unary/heat_reservoir/heater{dir = 8},/turf/simulated/floor/plasteel,/area/atmos) "caH" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 8},/obj/structure/bed/stool,/turf/simulated/floor/plasteel,/area/atmos) -"caI" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"caJ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"caI" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"caJ" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/yellow/visible{icon_state = "intact"; dir = 5},/turf/space,/area/space/nearstation) "caK" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) "caL" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "caM" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -5493,7 +5493,7 @@ "cbG" = (/obj/machinery/atmospherics/components/binary/pump{dir = 8; name = "CO2 Outlet Pump"; on = 0},/turf/simulated/floor/plasteel{dir = 5; icon_state = "yellow"},/area/atmos) "cbH" = (/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos) "cbI" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; id_tag = "co2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos) -"cbJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cbJ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/yellow/visible{icon_state = "intact"; dir = 10},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cbK" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/maintenance/asmaint) "cbL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cbM" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -5592,7 +5592,7 @@ "cdB" = (/obj/machinery/atmospherics/components/trinary/filter{dir = 1; filter_type = "co2"; on = 1},/turf/simulated/floor/plasteel,/area/atmos) "cdC" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/atmos) "cdD" = (/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "co2_in"; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos) -"cdE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cdE" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cdF" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cdG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cdH" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -5642,7 +5642,7 @@ "cez" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible,/turf/simulated/floor/plasteel,/area/atmos) "ceA" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 9},/turf/simulated/floor/plating,/area/atmos) "ceB" = (/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 6},/turf/simulated/floor/plasteel,/area/atmos) -"ceC" = (/obj/machinery/power/apc{dir = 2; name = "Incinerator APC"; pixel_x = 0; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/incinerator) +"ceC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/yellow/visible,/turf/simulated/floor/plating,/area/maintenance/asmaint) "ceD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/asmaint) "ceE" = (/obj/structure/sign/fire{pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "ceF" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -5713,9 +5713,9 @@ "cfS" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 4; initialize_directions = 12},/turf/simulated/floor/plasteel,/area/atmos) "cfT" = (/obj/machinery/atmospherics/pipe/simple/green/visible{dir = 9},/turf/simulated/floor/plasteel,/area/atmos) "cfU" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/turf/simulated/wall,/area/maintenance/incinerator) -"cfV" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{icon_state = "intact"; dir = 5},/turf/simulated/wall,/area/maintenance/incinerator) -"cfW" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/yellow/visible{icon_state = "intact"; dir = 10},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cfX" = (/obj/machinery/atmospherics/components/binary/pump{dir = 4; name = "atmospherics mix pump"},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) +"cfV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/yellow/visible,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cfW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/yellow/visible,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cfX" = (/obj/machinery/power/apc{dir = 2; name = "Incinerator APC"; pixel_x = 0; pixel_y = -24},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/yellow/visible,/turf/simulated/floor/plating,/area/maintenance/incinerator) "cfY" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/incinerator) "cfZ" = (/obj/machinery/light_switch{pixel_x = 0; pixel_y = 26},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "cga" = (/obj/machinery/power/smes{capacity = 9e+006; charge = 10000},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/effect/decal/cleanable/cobweb{icon_state = "cobweb2"},/turf/simulated/floor/plating,/area/maintenance/incinerator) @@ -5780,8 +5780,8 @@ "chh" = (/obj/machinery/atmospherics/components/unary/tank/toxins{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "chi" = (/obj/machinery/atmospherics/pipe/manifold4w/general{level = 2},/obj/machinery/meter,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "chj" = (/obj/machinery/atmospherics/components/binary/pump{dir = 4; name = "plasma tank pump"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) -"chk" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 10},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) -"chl" = (/obj/machinery/atmospherics/components/binary/pump{dir = 4; name = "Mix to Incinerator"; on = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) +"chk" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible,/turf/simulated/wall,/area/maintenance/incinerator) +"chl" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/components/binary/pump{dir = 2; name = "atmospherics mix pump"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "chm" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/machinery/alarm{desc = "This particular atmos control unit appears to have no access restrictions."; dir = 8; icon_state = "alarm0"; locked = 0; name = "all-access air alarm"; pixel_x = 24; req_access = "0"; req_one_access = "0"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "chn" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "cho" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 5},/turf/simulated/floor/bluegrid{name = "Killroom Floor"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/xenobiology) @@ -5849,8 +5849,8 @@ "ciy" = (/obj/structure/sign/nosmoking_2{pixel_x = -28},/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 4; name = "input gas connector port"},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "ciz" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "ciA" = (/obj/machinery/atmospherics/components/binary/pump{dir = 4; name = "input port pump"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) -"ciB" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 2},/obj/item/weapon/cigbutt,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) -"ciC" = (/obj/effect/landmark{name = "blobstart"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/mob/living/simple_animal/mouse,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) +"ciB" = (/obj/effect/decal/cleanable/cobweb,/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/extinguisher,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) +"ciC" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 6},/turf/space,/area/space/nearstation) "ciD" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{name = "output gas connector port"},/obj/machinery/portable_atmospherics/canister,/obj/structure/sign/nosmoking_2{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "ciE" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "ciF" = (/obj/structure/table,/obj/item/weapon/cartridge/medical,/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -5889,7 +5889,7 @@ "cjm" = (/obj/machinery/door/airlock/command{name = "MiniSat Access"; req_access_txt = "65"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering) "cjn" = (/obj/item/weapon/weldingtool,/turf/simulated/floor/plating/airless,/area/space/nearstation) "cjo" = (/obj/item/stack/sheet/metal,/turf/simulated/floor/plating/airless,/area/space/nearstation) -"cjp" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/maintenance/incinerator) +"cjp" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{dir = 4},/obj/structure/reagent_dispensers/fueltank,/obj/item/weapon/storage/toolbox/emergency,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "cjq" = (/obj/machinery/atmospherics/components/binary/valve{name = "Mix to Space"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "cjr" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "cjs" = (/obj/machinery/atmospherics/pipe/simple/general/visible,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) @@ -5933,9 +5933,9 @@ "cke" = (/obj/structure/bed/stool,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "ckf" = (/obj/structure/grille,/obj/structure/disposalpipe/segment,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/maintenance/incinerator) "ckg" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 8},/obj/machinery/meter,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) -"ckh" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 2},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cki" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) -"ckj" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 4; initialize_directions = 11},/obj/machinery/meter,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) +"ckh" = (/obj/machinery/atmospherics/components/binary/pump{dir = 8; name = "Mix to MiniSat"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) +"cki" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) +"ckj" = (/obj/item/weapon/cigbutt,/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 10},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "ckk" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/components/binary/valve{dir = 4; name = "Incinerator to Space"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "ckl" = (/obj/machinery/portable_atmospherics/canister,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/asmaint) "ckm" = (/obj/machinery/door/airlock/maintenance{name = "Biohazard Disposals"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -5981,12 +5981,12 @@ "cla" = (/obj/machinery/air_sensor{frequency = 1443; id_tag = "air_sensor"; output = 7},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) "clb" = (/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 1; frequency = 1443; id = "air_in"},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) "clc" = (/obj/machinery/atmospherics/components/unary/vent_pump/high_volume{dir = 1; external_pressure_bound = 0; frequency = 1443; icon_state = "vent_map"; id_tag = "air_out"; internal_pressure_bound = 2000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) -"cld" = (/obj/structure/reagent_dispensers/fueltank,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cle" = (/obj/machinery/computer/turbine_computer{id = "incineratorturbine"},/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) -"clf" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/extinguisher,/obj/machinery/light/small,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -31},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) -"clg" = (/obj/machinery/button/door{id = "auxincineratorvent"; name = "Auxiliary Vent Control"; pixel_x = 6; pixel_y = -24; req_access_txt = "32"},/obj/machinery/button/door{id = "turbinevent"; name = "Turbine Vent Control"; pixel_x = -6; pixel_y = -24; req_access_txt = "32"},/obj/machinery/atmospherics/pipe/simple/general/visible,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) -"clh" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the turbine vent."; dir = 1; name = "turbine vent monitor"; network = list("Turbine"); pixel_x = 0; pixel_y = -29},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) -"cli" = (/obj/machinery/atmospherics/pipe/simple/general/visible,/obj/machinery/doorButtons/airlock_controller{idExterior = "incinerator_airlock_exterior"; idSelf = "incinerator_access_control"; idInterior = "incinerator_airlock_interior"; name = "Incinerator Access Console"; pixel_x = 6; pixel_y = -26; req_access_txt = "12"},/obj/machinery/button/ignition{id = "Incinerator"; pixel_x = -6; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) +"cld" = (/obj/effect/landmark{name = "blobstart"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/components/binary/pump{dir = 4; name = "Mix to Incinerator"; on = 0},/mob/living/simple_animal/mouse,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) +"cle" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 2},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) +"clf" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/general/visible,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) +"clg" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/maintenance/incinerator) +"clh" = (/obj/machinery/light/small,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -31},/obj/machinery/computer/turbine_computer{id = "incineratorturbine"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) +"cli" = (/obj/machinery/button/door{id = "auxincineratorvent"; name = "Auxiliary Vent Control"; pixel_x = 6; pixel_y = -24; req_access_txt = "32"},/obj/machinery/button/door{id = "turbinevent"; name = "Turbine Vent Control"; pixel_x = -6; pixel_y = -24; req_access_txt = "32"},/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/obj/machinery/atmospherics/pipe/simple/general/visible,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "clj" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "clk" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cll" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/components/binary/pump{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -6358,20 +6358,20 @@ "csn" = (/obj/structure/transit_tube,/turf/space,/area/space) "cso" = (/obj/structure/transit_tube,/obj/structure/lattice,/turf/space,/area/space) "csp" = (/obj/structure/transit_tube{icon_state = "E-W-Pass"},/turf/space,/area/space) -"csq" = (/obj/structure/transit_tube{icon_state = "W-SE"},/turf/space,/area/space) -"csr" = (/obj/structure/transit_tube{icon_state = "D-SW"},/obj/structure/lattice,/turf/space,/area/space) +"csq" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the turbine vent."; dir = 1; name = "turbine vent monitor"; network = list("Turbine"); pixel_x = 0; pixel_y = -29},/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) +"csr" = (/obj/machinery/doorButtons/airlock_controller{idExterior = "incinerator_airlock_exterior"; idSelf = "incinerator_access_control"; idInterior = "incinerator_airlock_interior"; name = "Incinerator Access Console"; pixel_x = 6; pixel_y = -26; req_access_txt = "12"},/obj/machinery/button/ignition{id = "Incinerator"; pixel_x = -6; pixel_y = -24},/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 4; initialize_directions = 11},/obj/machinery/meter,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator) "css" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering) "cst" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering) "csu" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering) "csv" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering) -"csw" = (/obj/structure/transit_tube{icon_state = "NW-SE"},/obj/structure/lattice,/turf/space,/area/space) +"csw" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/yellow/visible,/turf/space,/area/space) "csx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering) "csy" = (/obj/structure/disposaloutlet,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plating/airless,/area/space/nearstation) "csz" = (/obj/effect/landmark{name = "carpspawn"},/turf/space,/area/space/nearstation) "csA" = (/obj/machinery/field/generator{anchored = 1; state = 2},/turf/simulated/floor/plating/airless,/area/space/nearstation) "csB" = (/obj/item/weapon/wirecutters,/obj/structure/lattice,/turf/space,/area/space/nearstation) "csC" = (/turf/simulated/floor/plating/airless{dir = 1; icon_state = "warnplate"},/area/space/nearstation) -"csD" = (/turf/simulated/wall/r_wall,/area/aisat) +"csD" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior) "csE" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/lattice/catwalk,/turf/space,/area/solar/starboard) "csF" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engine/engineering) "csG" = (/obj/machinery/light{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering) @@ -6380,207 +6380,207 @@ "csJ" = (/obj/item/weapon/crowbar,/turf/space,/area/space/nearstation) "csK" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering) "csL" = (/obj/structure/transit_tube{icon_state = "D-NE"},/turf/space,/area/space) -"csM" = (/obj/machinery/teleport/station,/turf/simulated/floor/plating,/area/aisat) -"csN" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/plating,/area/aisat) -"csO" = (/obj/machinery/teleport/hub,/turf/simulated/floor/plating,/area/aisat) +"csM" = (/obj/structure/transit_tube,/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/yellow/visible,/turf/space,/area/space) +"csN" = (/obj/structure/transit_tube,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior) +"csO" = (/obj/structure/window/reinforced/fulltile,/obj/structure/transit_tube,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior) "csP" = (/obj/machinery/power/grounding_rod,/turf/simulated/floor/plating/airless,/area/space/nearstation) "csQ" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating/airless,/area/space/nearstation) "csR" = (/obj/machinery/the_singularitygen,/turf/simulated/floor/plating/airless{dir = 8; icon_state = "warnplate"},/area/space/nearstation) "csS" = (/obj/item/weapon/weldingtool,/turf/space,/area/space/nearstation) -"csT" = (/obj/structure/transit_tube{icon_state = "NW-SE"},/turf/space,/area/space) -"csU" = (/obj/structure/transit_tube{icon_state = "D-NE"},/obj/structure/lattice,/turf/space,/area/space) -"csV" = (/obj/machinery/bluespace_beacon,/turf/simulated/floor/plasteel{icon_state = "warndark"; dir = 1},/area/aisat) -"csW" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "warndark"; dir = 1},/area/aisat) -"csX" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "warndark"; dir = 1},/area/aisat) +"csT" = (/obj/structure/transit_tube{dir = 8; icon_state = "Block"},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior) +"csU" = (/obj/structure/transit_tube/station{reverse_launch = 1},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior) +"csV" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/turret_protected/aisat_interior) +"csW" = (/obj/machinery/atmospherics/components/unary/vent_pump{on = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/turret_protected/aisat_interior) +"csX" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior) "csY" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/obj/structure/lattice/catwalk,/turf/space,/area/solar/starboard) "csZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/lattice/catwalk,/turf/space,/area/solar/starboard) -"cta" = (/obj/structure/transit_tube{icon_state = "S-NW"},/obj/structure/lattice,/turf/space,/area/space) -"ctb" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/aisat) -"ctc" = (/obj/machinery/camera{c_tag = "MiniSat Teleporter"; dir = 1; network = list("MiniSat"); pixel_x = 0; pixel_y = 0},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = -28; pixel_y = 0},/obj/machinery/atmospherics/components/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/aisat) -"ctd" = (/obj/machinery/button/door{id = "teledoor"; name = "AI Satellite Teleport Shutters Control"; pixel_x = 25; pixel_y = 0; req_access_txt = "17;65"},/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/aisat) +"cta" = (/obj/machinery/door/airlock/external{name = "MiniSat External Access"; req_access = null; req_access_txt = "65;13"},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior) +"ctb" = (/turf/simulated/floor/plating,/area/turret_protected/aisat_interior) +"ctc" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior) +"ctd" = (/obj/structure/lattice/catwalk,/obj/machinery/atmospherics/pipe/simple/yellow/visible,/turf/space,/area/space) "cte" = (/obj/item/device/radio/off,/turf/simulated/floor/plating/airless,/area/engine/engineering) "ctf" = (/turf/simulated/floor/plating/airless{dir = 2; icon_state = "warnplate"},/area/space/nearstation) -"ctg" = (/turf/simulated/wall,/area/aisat) -"cth" = (/obj/structure/transit_tube{icon_state = "N-S"},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/aisat) -"cti" = (/obj/machinery/door/airlock/hatch{name = "Teleporter Room"; req_access_txt = "17;65"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/aisat) -"ctj" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/aisat) -"ctk" = (/obj/machinery/door/poddoor/shutters{id = "teledoor"; name = "AI Satellite Teleport Access"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/aisat) +"ctg" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior) +"cth" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -29},/obj/machinery/light/small,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior) +"cti" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/sign/securearea{pixel_y = -32},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior) +"ctj" = (/obj/machinery/camera{c_tag = "MiniSat Pod Access"; dir = 1; network = list("MiniSat"); pixel_x = 0; pixel_y = 0; start_active = 1},/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 2; on = 1},/obj/machinery/light/small,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior) +"ctk" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/wall,/area/turret_protected/aisat_interior) "ctl" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating/airless,/area/engine/engineering) "ctm" = (/turf/simulated/floor/plating/airless{dir = 10; icon_state = "warnplate"},/area/space/nearstation) "ctn" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating/airless,/area/engine/engineering) -"cto" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/aisat) -"ctp" = (/obj/structure/transit_tube{icon_state = "N-S"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/aisat) -"ctq" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/aisat) -"ctr" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"; dir = 8},/area/aisat) -"cts" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/aisat) -"ctt" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"},/area/aisat) -"ctu" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 8; on = 1},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/aisat) +"cto" = (/obj/machinery/door/airlock/hatch{name = "MiniSat Foyer"; req_one_access_txt = "65"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) +"ctp" = (/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 8},/turf/simulated/floor/plating/airless,/area/turret_protected/aisat_interior) +"ctq" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/turret_protected/aisat_interior) +"ctr" = (/obj/structure/table,/obj/machinery/light/small{dir = 1},/obj/item/weapon/folder{pixel_x = 3},/obj/item/weapon/phone{pixel_x = -3; pixel_y = 3},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior) +"cts" = (/obj/structure/rack{dir = 1},/obj/machinery/light/small{dir = 1},/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/device/radio/off{pixel_y = 4},/obj/item/weapon/screwdriver{pixel_y = 10},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior) +"ctt" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) +"ctu" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior) "ctv" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/engine/engineering) -"ctw" = (/obj/structure/transit_tube/station{dir = 4; icon_state = "closed"; reverse_launch = 1},/turf/simulated/floor/plating,/area/aisat) -"ctx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"; dir = 8},/area/aisat) -"cty" = (/obj/machinery/door/airlock/external{name = "MiniSat External Access"; req_access = null; req_access_txt = "65;13"},/turf/simulated/floor/plating,/area/aisat) -"ctz" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"},/area/aisat) -"ctA" = (/turf/simulated/floor/plating,/area/aisat) +"ctw" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/computer/station_alert,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior) +"ctx" = (/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior) +"cty" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior) +"ctz" = (/obj/machinery/door/poddoor/shutters{id = "teledoor"; name = "MiniSat Teleport Access"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) +"ctA" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) "ctB" = (/obj/structure/cable,/obj/machinery/power/tracker,/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/starboard) "ctC" = (/obj/machinery/camera/emp_proof{c_tag = "Singularity West"; dir = 1; network = list("Singularity")},/turf/simulated/floor/plating/airless,/area/engine/engineering) "ctD" = (/obj/machinery/camera/emp_proof{c_tag = "Singularity East"; dir = 1; network = list("Singularity")},/turf/simulated/floor/plating/airless,/area/engine/engineering) -"ctE" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/aisat) -"ctF" = (/obj/structure/transit_tube{dir = 1; icon_state = "Block"},/turf/simulated/floor/plating,/area/aisat) -"ctG" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/aisat) -"ctH" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"; dir = 8},/area/aisat) -"ctI" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/aisat) -"ctJ" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"},/area/aisat) -"ctK" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/obj/structure/closet/emcloset,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32},/turf/simulated/floor/plating,/area/aisat) -"ctL" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/aisat) -"ctM" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/camera{c_tag = "MiniSat Entrance"; dir = 4; network = list("MiniSat"); pixel_x = 0; pixel_y = 0},/obj/machinery/power/apc{dir = 8; name = "MiniSat External Power APC"; pixel_x = -27; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"; dir = 8},/area/aisat) -"ctN" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"},/area/aisat) -"ctO" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/aisat) -"ctP" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/aisat) -"ctQ" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"},/area/aisat) +"ctE" = (/obj/machinery/teleport/hub,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior) +"ctF" = (/obj/machinery/button/door{id = "teledoor"; name = "MiniSat Teleport Shutters Control"; pixel_x = 0; pixel_y = 25; req_access_txt = "17;65"},/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "warndark"; dir = 4},/area/turret_protected/aisat_interior) +"ctG" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior) +"ctH" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -31},/obj/machinery/computer/monitor,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior) +"ctI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior) +"ctJ" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/effect/landmark/start{name = "Cyborg"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior) +"ctK" = (/obj/machinery/door/airlock/hatch{name = "MiniSat Teleporter"; req_access_txt = "17;65"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) +"ctL" = (/obj/machinery/teleport/station,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/turret_protected/aisat_interior) +"ctM" = (/obj/machinery/bluespace_beacon,/turf/simulated/floor/plasteel{icon_state = "warndark"; dir = 4},/area/turret_protected/aisat_interior) +"ctN" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible{icon_state = "intact"; dir = 10},/obj/structure/lattice,/turf/space,/area/space) +"ctO" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/yellow/visible{icon_state = "intact"; dir = 5},/turf/space,/area/space) +"ctP" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior) +"ctQ" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = 0; pixel_y = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior) "ctR" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall,/area/engine/engineering) -"ctS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/aisat) -"ctT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "darkblue"},/area/aisat) -"ctU" = (/obj/machinery/computer/security/telescreen{dir = 1; name = "MiniSat Monitor"; network = list("MiniSat"); pixel_x = 0; pixel_y = -30},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "darkblue"},/area/aisat) -"ctV" = (/obj/machinery/turretid{control_area = "AI Satellite Antechamber"; enabled = 1; icon_state = "control_standby"; name = "Antechamber Turret Control"; pixel_x = 0; pixel_y = -24; req_access = list(65)},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "darkblue"},/area/aisat) -"ctW" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/aisat) -"ctX" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space) -"ctY" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/wall,/area/aisat) -"ctZ" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/light/small{dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32},/turf/simulated/floor/plating,/area/aisat) +"ctS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior) +"ctT" = (/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/turret_protected/aisat_interior) +"ctU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/turret_protected/aisat_interior) +"ctV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "MiniSat Foyer APC"; pixel_x = 27; pixel_y = 0},/obj/structure/bed/chair,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) +"ctW" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior) +"ctX" = (/obj/machinery/camera{c_tag = "MiniSat Teleporter"; dir = 1; network = list("MiniSat"); pixel_x = 0; pixel_y = 0; start_active = 1},/obj/machinery/atmospherics/components/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "warndark"; dir = 4},/area/turret_protected/aisat_interior) +"ctY" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible,/obj/machinery/meter,/turf/simulated/wall/r_wall,/area/turret_protected/AIsatextAS{name = "AI Satellite Atmospherics"}) +"ctZ" = (/turf/simulated/wall/r_wall,/area/turret_protected/AIsatextAS{name = "AI Satellite Atmospherics"}) "cua" = (/turf/simulated/wall,/area/turret_protected/aisat_interior) -"cub" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Antechamber"; req_one_access_txt = "65"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) -"cuc" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/turret_protected/aisat_interior) -"cud" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/turret_protected/aisat_interior) -"cue" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/wall,/area/aisat) -"cuf" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/aisat) -"cug" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plating,/area/aisat) -"cuh" = (/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space) -"cui" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space) -"cuj" = (/obj/structure/lattice,/obj/structure/window/reinforced,/obj/structure/grille,/turf/space,/area/space) -"cuk" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/light/small{dir = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) -"cul" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior) -"cum" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) -"cun" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"; dir = 8},/area/turret_protected/aisat_interior) -"cuo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) -"cup" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior) -"cuq" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior) -"cur" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space) -"cus" = (/obj/structure/lattice,/obj/structure/grille,/obj/structure/window/reinforced,/turf/space,/area/space) +"cub" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -29},/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) +"cuc" = (/obj/structure/rack{dir = 1},/obj/machinery/status_display{pixel_y = -32},/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior) +"cud" = (/obj/machinery/turretid{control_area = null; enabled = 1; icon_state = "control_standby"; name = "Antechamber Turret Control"; pixel_x = 0; pixel_y = -24; req_access = list(65)},/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/camera/motion{c_tag = "MiniSat Foyer"; dir = 1; network = list("MiniSat")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) +"cue" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) +"cuf" = (/turf/simulated/wall/r_wall,/area/turret_protected/AIsatextFP{name = "AI Satellite Service"}) +"cug" = (/obj/machinery/ai_status_display{pixel_y = -32},/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior) +"cuh" = (/obj/machinery/atmospherics/pipe/simple/yellow/visible,/obj/structure/rack,/obj/item/weapon/wrench,/obj/item/weapon/crowbar/red,/obj/item/clothing/head/welding,/turf/simulated/floor/plating,/area/turret_protected/AIsatextAS{name = "AI Satellite Atmospherics"}) +"cui" = (/obj/machinery/atmospherics/components/unary/tank/air,/turf/simulated/floor/plating,/area/turret_protected/AIsatextAS{name = "AI Satellite Atmospherics"}) +"cuj" = (/turf/simulated/wall/r_wall,/area/turret_protected/aisat_interior) +"cuk" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/turret_protected/aisat_interior) +"cul" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Antechamber"; req_one_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) +"cum" = (/obj/machinery/recharge_station,/turf/simulated/floor/plating,/area/turret_protected/AIsatextFP{name = "AI Satellite Service"}) +"cun" = (/obj/machinery/atmospherics/components/binary/pump{dir = 2; name = "Mix to MiniSat"},/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/turret_protected/AIsatextAS{name = "AI Satellite Atmospherics"}) +"cuo" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plating{tag = "icon-warnplatecorner"; icon_state = "warnplatecorner"; dir = 2},/area/turret_protected/AIsatextAS{name = "AI Satellite Atmospherics"}) +"cup" = (/obj/structure/showcase{density = 0; desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; dir = 8; icon = 'icons/mob/robots.dmi'; icon_state = "robot_old"; name = "Cyborg Statue"; pixel_x = 9; pixel_y = 2},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/turret_protected/AIsatextAS{name = "AI Satellite Atmospherics"}) +"cuq" = (/obj/machinery/atmospherics/components/binary/pump{dir = 0; name = "Air Out"; on = 0},/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/turret_protected/AIsatextAS{name = "AI Satellite Atmospherics"}) +"cur" = (/obj/structure/showcase{density = 0; desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; dir = 4; icon = 'icons/mob/robots.dmi'; icon_state = "robot_old"; name = "Cyborg Statue"; pixel_x = -9; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior) +"cus" = (/obj/structure/showcase{density = 0; desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; dir = 8; icon = 'icons/mob/robots.dmi'; icon_state = "robot_old"; name = "Cyborg Statue"; pixel_x = 9; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/components/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"; dir = 4},/area/turret_protected/aisat_interior) "cut" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_sw"; name = "southwest of station"; turf_type = /turf/space; width = 18},/turf/space,/area/space) -"cuu" = (/obj/machinery/door/window{dir = 1; name = "MiniSat Walkway Access"; req_access_txt = "13;65"},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plating,/area/aisat) -"cuv" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/aisat) -"cuw" = (/obj/structure/window/reinforced,/obj/machinery/door/window{base_state = "right"; dir = 1; icon_state = "right"; name = "MiniSat Walkway Access"; req_access_txt = "13;65"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/aisat) -"cux" = (/obj/machinery/door/airlock/maintenance_hatch{req_access_txt = "65"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) +"cuu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) +"cuv" = (/obj/structure/showcase{density = 0; desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; dir = 4; icon = 'icons/mob/robots.dmi'; icon_state = "robot_old"; name = "Cyborg Statue"; pixel_x = -9; pixel_y = 2},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 30},/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/turret_protected/AIsatextFP{name = "AI Satellite Service"}) +"cuw" = (/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/turret_protected/AIsatextFP{name = "AI Satellite Service"}) +"cux" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/clothing/head/welding,/obj/item/stack/sheet/mineral/plasma{amount = 35; layer = 3.1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/turret_protected/AIsatextFP{name = "AI Satellite Service"}) "cuy" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) -"cuz" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior) -"cuA" = (/obj/machinery/hologram/holopad,/obj/effect/landmark/start{name = "Cyborg"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) -"cuB" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"; dir = 8},/area/turret_protected/aisat_interior) -"cuC" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior) -"cuD" = (/obj/machinery/door/airlock/maintenance_hatch{req_access_txt = "65"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) -"cuE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior) -"cuF" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/aisat) -"cuG" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window{base_state = "right"; dir = 1; icon_state = "right"; name = "MiniSat Walkway Access"; req_access_txt = "13;65"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/plating,/area/aisat) -"cuH" = (/obj/structure/window/reinforced,/obj/machinery/door/window{dir = 1; name = "MiniSat Walkway Access"; req_access_txt = "13;65"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/aisat) -"cuI" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/aisat) -"cuJ" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior) -"cuK" = (/mob/living/simple_animal/bot/secbot/pingsky,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) -"cuL" = (/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"; dir = 8},/area/turret_protected/aisat_interior) -"cuM" = (/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior) -"cuN" = (/obj/machinery/power/apc{aidisabled = 0; cell_type = 2500; dir = 4; name = "MiniSat Antechamber APC"; pixel_x = 29; pixel_y = 0},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior) -"cuO" = (/obj/structure/window/reinforced{dir = 1},/turf/space,/area/space) -"cuP" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/aisat) -"cuQ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space) -"cuR" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 4},/obj/machinery/camera{c_tag = "MiniSat Exterior North West"; dir = 8; network = list("MiniSat"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/aisat) -"cuS" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/lattice,/turf/space,/area/space) -"cuT" = (/obj/machinery/porta_turret{ai = 1; dir = 1},/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) -"cuU" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/mob/living/simple_animal/bot/floorbot{on = 0},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior) -"cuV" = (/turf/simulated/floor/plasteel{icon_state = "darkblue"},/area/turret_protected/aisat_interior) -"cuW" = (/obj/machinery/camera/motion{c_tag = "MiniSat Antechamber"; dir = 1; network = list("MiniSat")},/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1447; listening = 0; name = "Station Intercom (AI Private)"; pixel_y = -29},/turf/simulated/floor/plasteel{icon_state = "darkblue"},/area/turret_protected/aisat_interior) -"cuX" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/mob/living/simple_animal/bot/cleanbot{on = 0},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/aisat_interior) -"cuY" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera{c_tag = "MiniSat Exterior North East"; dir = 4; network = list("MiniSat"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/aisat) -"cuZ" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/turf/space,/area/space) +"cuz" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/AIsatextAS{name = "AI Satellite Atmospherics"}) +"cuA" = (/obj/machinery/light/small{dir = 8},/obj/machinery/camera{c_tag = "MiniSat Atmospherics"; dir = 4; network = list("MiniSat"); pixel_x = 0; pixel_y = 0; start_active = 1},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/space_heater,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/turret_protected/AIsatextAS{name = "AI Satellite Atmospherics"}) +"cuB" = (/obj/machinery/light/small{dir = 4},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 28; pixel_y = 0},/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"; dir = 4},/area/turret_protected/AIsatextAS{name = "AI Satellite Atmospherics"}) +"cuC" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/AIsatextAS{name = "AI Satellite Atmospherics"}) +"cuD" = (/obj/machinery/light/small{dir = 8},/obj/machinery/camera{c_tag = "MiniSat Antechamber"; dir = 4; network = list("MiniSat"); pixel_x = 0; pixel_y = 0; start_active = 1},/obj/machinery/turretid{control_area = "AI Satellite Atmospherics"; enabled = 1; icon_state = "control_standby"; name = "Atmospherics Turret Control"; pixel_x = -27; pixel_y = 0; req_access = list(65)},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior) +"cuE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/turret_protected/aisat_interior) +"cuF" = (/obj/machinery/light/small{dir = 4},/obj/machinery/turretid{control_area = "AI Satellite Service"; enabled = 1; icon_state = "control_standby"; name = "Service Bay Turret Control"; pixel_x = 27; pixel_y = 0; req_access = list(65)},/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"; dir = 4},/area/turret_protected/aisat_interior) +"cuG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) +"cuH" = (/obj/machinery/light/small{dir = 8},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = -28; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkbluecorners"},/area/turret_protected/AIsatextFP{name = "AI Satellite Service"}) +"cuI" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/AIsatextFP{name = "AI Satellite Service"}) +"cuJ" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/AIsatextFP{name = "AI Satellite Service"}) +"cuK" = (/obj/machinery/light/small{dir = 4},/obj/machinery/camera{c_tag = "MiniSat Service Bay"; dir = 8; network = list("MiniSat"); pixel_x = 0; pixel_y = 0; start_active = 1},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/rack,/obj/item/weapon/storage/toolbox/electrical{pixel_x = -3; pixel_y = 3},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/multitool,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/turret_protected/AIsatextFP{name = "AI Satellite Service"}) +"cuL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/AIsatextAS{name = "AI Satellite Atmospherics"}) +"cuM" = (/obj/machinery/power/apc{dir = 8; name = "MiniSat Atmospherics APC"; pixel_x = -27; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/turret_protected/AIsatextAS{name = "AI Satellite Atmospherics"}) +"cuN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/AIsatextAS{name = "AI Satellite Atmospherics"}) +"cuO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/ai_slipper{icon_state = "motion0"; uses = 10},/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/AIsatextAS{name = "AI Satellite Atmospherics"}) +"cuP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) +"cuQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Atmospherics"; req_one_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) +"cuR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) +"cuS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/ai_slipper{icon_state = "motion0"; uses = 10},/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,/mob/living/simple_animal/bot/secbot/pingsky,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) +"cuT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/AIsatextFP{name = "AI Satellite Service"}) +"cuU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Service Bay"; req_one_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) +"cuV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/AIsatextFP{name = "AI Satellite Service"}) +"cuW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/ai_slipper{icon_state = "motion0"; uses = 10},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/AIsatextFP{name = "AI Satellite Service"}) +"cuX" = (/obj/machinery/power/apc{dir = 4; name = "MiniSat Service Bay APC"; pixel_x = 27; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/port_gen/pacman,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/turret_protected/AIsatextFP{name = "AI Satellite Service"}) +"cuY" = (/obj/machinery/porta_turret{ai = 1; dir = 4},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/AIsatextAS{name = "AI Satellite Atmospherics"}) +"cuZ" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 1; on = 1},/mob/living/simple_animal/bot/floorbot,/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"},/area/turret_protected/AIsatextAS{name = "AI Satellite Atmospherics"}) "cva" = (/turf/simulated/wall/r_wall,/area/turret_protected/ai) "cvb" = (/obj/machinery/ai_status_display,/turf/simulated/wall/r_wall,/area/turret_protected/ai) -"cvc" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/turret_protected/ai) -"cvd" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/highsecurity{icon_state = "door_locked"; locked = 1; name = "AI Chamber"; req_access_txt = "16"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) -"cve" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/turret_protected/ai) +"cvc" = (/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/obj/machinery/porta_turret{ai = 1; dir = 4},/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1447; listening = 0; name = "Station Intercom (AI Private)"; pixel_y = -29},/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"; dir = 8},/area/turret_protected/aisat_interior) +"cvd" = (/obj/machinery/porta_turret{ai = 1; dir = 4},/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior) +"cve" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/turretid{control_area = "AI Satellite Hallway"; enabled = 1; icon_state = "control_standby"; name = "Chamber Hallway Turret Control"; pixel_x = 32; pixel_y = -24; req_access = list(65)},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) "cvf" = (/obj/machinery/status_display,/turf/simulated/wall/r_wall,/area/turret_protected/ai) -"cvg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/turret_protected/ai) -"cvh" = (/obj/structure/bed/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) -"cvi" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen{pixel_x = 4; pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) -"cvj" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/ai) -"cvk" = (/obj/machinery/camera{c_tag = "AI Chamber North"; dir = 2; network = list("MiniSat","RD"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/ai) +"cvg" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 1; on = 1},/mob/living/simple_animal/bot/cleanbot,/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"; dir = 8},/area/turret_protected/AIsatextFP{name = "AI Satellite Service"}) +"cvh" = (/obj/machinery/porta_turret{ai = 1; dir = 4},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/AIsatextFP{name = "AI Satellite Service"}) +"cvi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/AIsatextFP{name = "AI Satellite Service"}) +"cvj" = (/turf/simulated/wall,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvk" = (/turf/simulated/wall/r_wall,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) "cvl" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) -"cvm" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/ai) -"cvn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) -"cvo" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cvm" = (/obj/machinery/door/airlock/maintenance_hatch{name = "MiniSat Maintenance"; req_access_txt = "65"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Chamber Hallway"; req_one_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) "cvp" = (/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"cvq" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cvq" = (/obj/machinery/door/airlock/maintenance_hatch{name = "MiniSat Maintenance"; req_access_txt = "65"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) "cvr" = (/obj/machinery/porta_turret{ai = 1; dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"cvs" = (/obj/machinery/flasher{id = "AI"; pixel_x = 0; pixel_y = -21},/obj/machinery/ai_slipper{icon_state = "motion0"; uses = 10},/obj/machinery/light,/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"cvt" = (/obj/machinery/porta_turret{ai = 1; dir = 8},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"cvu" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/aisat) +"cvs" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvt" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvu" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) "cvv" = (/turf/simulated/wall,/area/turret_protected/ai) -"cvw" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/aisat) +"cvw" = (/turf/simulated/floor/bluegrid,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) "cvx" = (/obj/effect/landmark{name = "tripai"},/obj/item/device/radio/intercom{anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; pixel_x = 0; pixel_y = 28},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 1; listening = 1; name = "Common Channel"; pixel_x = -27; pixel_y = 5},/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; frequency = 1447; name = "Private Channel"; pixel_x = 0; pixel_y = -25},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"cvy" = (/obj/machinery/ai_slipper{icon_state = "motion0"; uses = 10},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"cvz" = (/obj/item/device/radio/intercom{broadcasting = 0; freerange = 1; listening = 1; name = "Common Channel"; pixel_x = -27; pixel_y = 5},/obj/item/device/radio/intercom{anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; pixel_x = 0; pixel_y = 27},/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; frequency = 1447; name = "Private Channel"; pixel_x = 27; pixel_y = 5},/obj/effect/landmark/start{name = "AI"},/obj/machinery/requests_console{department = "AI"; departmentType = 5; pixel_x = 32; pixel_y = 32},/obj/machinery/newscaster/security_unit{pixel_x = -32; pixel_y = 32},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"cvy" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) "cvA" = (/obj/effect/landmark{name = "tripai"},/obj/item/device/radio/intercom{anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; pixel_x = 0; pixel_y = 28},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 1; listening = 1; name = "Common Channel"; pixel_x = 27; pixel_y = 5},/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; frequency = 1447; name = "Private Channel"; pixel_x = 0; pixel_y = -25},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"cvB" = (/obj/machinery/door/window{name = "AI Core Door"; req_access_txt = "16"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) -"cvC" = (/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "AI Chamber APC"; pixel_y = 24},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) -"cvD" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/turretid{name = "AI Chamber turret control"; pixel_x = 5; pixel_y = 24},/obj/machinery/flasher{id = "AI"; pixel_x = -6; pixel_y = 24},/obj/machinery/camera/motion{c_tag = "AI Chamber South"; dir = 2; network = list("RD","MiniSat")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) -"cvE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"cvF" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) -"cvG" = (/obj/machinery/hologram/holopad,/obj/machinery/power/terminal,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) -"cvH" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) -"cvI" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) -"cvJ" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 4},/obj/machinery/camera{c_tag = "MiniSat Exterior South West"; dir = 8; network = list("MiniSat"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/aisat) -"cvK" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) -"cvL" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/wall/r_wall,/area/turret_protected/ai) -"cvM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area/turret_protected/ai) -"cvN" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera{c_tag = "MiniSat Exterior South East"; dir = 4; network = list("MiniSat"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/aisat) +"cvB" = (/obj/structure/rack,/obj/item/weapon/crowbar/red,/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvD" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvE" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvF" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "MiniSat External NorthWest"; dir = 8; network = list("MiniSat"); pixel_x = 0; pixel_y = 0; start_active = 1},/turf/space,/area/space) +"cvG" = (/obj/machinery/porta_turret{ai = 1; dir = 4; installation = /obj/item/weapon/gun/energy/gun},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/bluegrid,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvH" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvJ" = (/obj/machinery/porta_turret{ai = 1; dir = 4; installation = /obj/item/weapon/gun/energy/gun},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvK" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "MiniSat External NorthEast"; dir = 4; network = list("MiniSat"); pixel_x = 0; pixel_y = 0; start_active = 1},/turf/space,/area/space) +"cvL" = (/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvM" = (/obj/machinery/camera/motion{c_tag = "MiniSat Core Hallway"; dir = 4; network = list("MiniSat")},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/bluegrid,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvN" = (/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) "cvO" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_se"; name = "southeast of station"; turf_type = /turf/space; width = 18},/turf/space,/area/space) -"cvP" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/wall/r_wall,/area/turret_protected/ai) -"cvQ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/wall/r_wall,/area/turret_protected/ai) -"cvR" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/electrical{pixel_x = -3; pixel_y = 3},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/multitool,/turf/simulated/floor/plating,/area/ai_monitored/storage/secure) -"cvS" = (/turf/simulated/wall,/area/ai_monitored/storage/secure) -"cvT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area/ai_monitored/storage/secure) -"cvU" = (/obj/machinery/atmospherics/components/unary/tank/air,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/ai_monitored/storage/secure) -"cvV" = (/obj/structure/rack,/obj/item/weapon/crowbar/red,/obj/item/weapon/wrench,/obj/item/clothing/head/welding,/turf/simulated/floor/plating,/area/ai_monitored/storage/secure) -"cvW" = (/obj/machinery/recharge_station,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/ai_monitored/storage/secure) -"cvX" = (/obj/structure/window/reinforced,/turf/space,/area/space) -"cvY" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space) -"cvZ" = (/obj/structure/window/reinforced,/obj/structure/lattice,/turf/space,/area/space) -"cwa" = (/obj/machinery/power/apc{dir = 8; name = "MiniSat Maint APC"; pixel_x = -24},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plasteel{icon_state = "warndark"; dir = 1},/area/ai_monitored/storage/secure) -"cwb" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating{icon_state = "warnplate"},/area/ai_monitored/storage/secure) -"cwc" = (/obj/machinery/atmospherics/components/binary/pump{dir = 0; name = "Air Out"; on = 1},/turf/simulated/floor/plasteel{icon_state = "warndark"; dir = 5},/area/ai_monitored/storage/secure) -"cwd" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 28; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "warndark"; dir = 1},/area/ai_monitored/storage/secure) -"cwe" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "warndark"; dir = 9},/area/ai_monitored/storage/secure) -"cwf" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space) -"cwg" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/aisat) -"cwh" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/aisat) -"cwi" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 1},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/secure) -"cwj" = (/obj/machinery/door/airlock/maintenance_hatch{req_access_txt = "65"},/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/secure) -"cwk" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/secure) -"cwl" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 4; initialize_directions = 11},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/secure) -"cwm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/secure) -"cwn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/secure) -"cwo" = (/obj/machinery/door/airlock/maintenance_hatch{req_access_txt = "65"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/secure) -"cwp" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plating,/area/aisat) -"cwq" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/turf/space,/area/space) -"cwr" = (/obj/machinery/atmospherics/pipe/simple/general/visible,/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/camera/motion{c_tag = "MiniSat Maintenance"; dir = 4; network = list("MiniSat")},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/secure) -"cws" = (/obj/structure/bed/chair,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/secure) -"cwt" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/secure) -"cwu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/secure) -"cwv" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/secure) -"cww" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 8},/turf/simulated/floor/plating/airless,/area/space) -"cwx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/ai_monitored/storage/secure) +"cvP" = (/obj/machinery/door/airlock/maintenance_hatch{name = "MiniSat Maintenance"; req_access_txt = "65"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvQ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvR" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvU" = (/obj/machinery/door/airlock/maintenance_hatch{name = "MiniSat Maintenance"; req_access_txt = "65"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvV" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/bluegrid,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvW" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvX" = (/turf/simulated/floor/plating,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvY" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cvZ" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/bluegrid,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cwa" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "MiniSat Chamber Hallway APC"; pixel_x = 27; pixel_y = 0},/turf/simulated/floor/bluegrid,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cwb" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cwc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/components/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cwd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/item/device/radio/intercom{broadcasting = 1; frequency = 1447; listening = 0; name = "Station Intercom (AI Private)"; pixel_x = -28; pixel_y = -29},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cwe" = (/obj/structure/sign/securearea,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/turret_protected/ai) +"cwf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch{name = "MiniSat Chamber Observation"; req_one_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cwg" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cwh" = (/obj/machinery/light/small{dir = 1},/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen{pixel_x = 4; pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cwi" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cwj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cwk" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cwl" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cwm" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cwn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cwo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cwp" = (/obj/structure/bed/chair/office/dark,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cwq" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/turret_protected/AIsatextFS{name = "AI Satellite Hallway"}) +"cwr" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/turret_protected/ai) +"cws" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/turret_protected/ai) +"cwt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "AI Core"; req_access_txt = "65"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cwu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/ai_slipper{icon_state = "motion0"; uses = 10},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cwv" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/status_display{pixel_x = -32},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"cww" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cwx" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) "cwy" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_s"; name = "south of station"; turf_type = /turf/space; width = 18},/turf/space,/area/space) -"cwz" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 1; name = "Auxiliary MiniSat Distribution Port"},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/secure) -"cwA" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/secure) -"cwB" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/secure) -"cwC" = (/obj/machinery/power/port_gen/pacman,/obj/structure/cable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/secure) -"cwD" = (/obj/structure/table,/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/secure) -"cwE" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/ai_monitored/storage/secure) +"cwz" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cwA" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cwB" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/ai_status_display{pixel_x = 32},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"cwC" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cwD" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/turretid{name = "AI Chamber turret control"; pixel_x = 5; pixel_y = -24},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"cwE" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "AI Chamber APC"; pixel_y = -24},/obj/machinery/flasher{id = "AI"; pixel_x = -11; pixel_y = -24},/obj/machinery/camera/motion{c_tag = "MiniSat AI Chamber North"; dir = 1; network = list("MiniSat")},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) "cwF" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/plasteel/shuttle,/area/shuttle/escape) "cwG" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "cwH" = (/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/turf/simulated/wall/shuttle/interior{icon_state = "swall_f5"},/area/shuttle/escape) @@ -6691,7 +6691,6 @@ "cyI" = (/obj/item/weapon/stock_parts/cell{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned) "cyJ" = (/obj/structure/rack,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned) "cyK" = (/turf/simulated/wall/shuttle{icon_state = "swall_f14"},/area/shuttle/abandoned) -"cyL" = (/obj/structure/cable,/obj/structure/computerframe{anchored = 1},/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned) "cyM" = (/turf/simulated/wall/shuttle{icon_state = "swall_f11"},/area/shuttle/abandoned) "cyN" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/poddoor{id = "QMLoaddoor2"; name = "supply dock loading door"},/turf/simulated/floor/plating,/area/shuttle/supply) "cyO" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned) @@ -6801,6 +6800,21 @@ "cAO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/engine/engineering) "cAP" = (/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engineering) "cAQ" = (/obj/structure/bed/chair,/mob/living/simple_animal/cockroach,/turf/simulated/floor/plating,/area/maintenance/aft) +"cAR" = (/obj/machinery/door/window{dir = 1; name = "AI Core Door"; req_access_txt = "16"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"cAS" = (/obj/effect/landmark/start{name = "AI"},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 1; listening = 1; name = "Common Channel"; pixel_x = -27; pixel_y = -9},/obj/item/device/radio/intercom{anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; pixel_x = 0; pixel_y = -31},/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; frequency = 1447; name = "Private Channel"; pixel_x = 27; pixel_y = -9},/obj/machinery/newscaster/security_unit{pixel_x = -28; pixel_y = -28},/obj/machinery/requests_console{department = "AI"; departmentType = 5; pixel_x = 28; pixel_y = -28},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"cAT" = (/obj/machinery/ai_slipper{icon_state = "motion0"; uses = 10},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cAU" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "MiniSat External SouthWest"; dir = 8; network = list("MiniSat"); pixel_x = 0; pixel_y = 0; start_active = 1},/turf/space,/area/space) +"cAV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/showcase{density = 0; desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; dir = 8; icon = 'icons/mob/robots.dmi'; icon_state = "robot_old"; name = "Cyborg Statue"; pixel_x = 9; pixel_y = 2},/obj/machinery/atmospherics/components/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cAW" = (/obj/structure/showcase{density = 0; desc = "An old, deactivated cyborg. Whilst once actively used to guard against intruders, it now simply intimidates them with its cold, steely gaze."; dir = 4; icon = 'icons/mob/robots.dmi'; icon_state = "robot_old"; name = "Cyborg Statue"; pixel_x = -9; pixel_y = 2},/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cAX" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "MiniSat External SouthEast"; dir = 4; network = list("MiniSat"); pixel_x = 0; pixel_y = 0; start_active = 1},/turf/space,/area/space) +"cAY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/wall,/area/turret_protected/ai) +"cAZ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cBa" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"cBb" = (/obj/machinery/camera/motion{c_tag = "MiniSat AI Chamber South"; dir = 2; network = list("MiniSat")},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"cBc" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/machinery/ai_slipper{icon_state = "motion0"; uses = 10},/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"cBd" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cBe" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai) +"cBf" = (/obj/machinery/camera{c_tag = "MiniSat External South"; dir = 2; network = list("MiniSat"); pixel_x = 0; pixel_y = 0; start_active = 1},/turf/space,/area/space) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -6939,7 +6953,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacymcyocyncybaaaaafcyacypcyhcyicyicyicyicyicyicyicyqcyrcyccybaafaaabeOblSbjacAIbkAblVcAJbeOaaaaaaaaacytcyscyscyscyscyscyuaaaaaablWblYbkjbkpbknbktbjrbjrbjrbjrbjrbjrbkubmgbmfboUbkwbkxbfQbkHbfmbmkaZKbmlaZKbmnbmmaLYbjzbmpbmobmobmobmobmqbmsbmraafaaabgObkIbgNbgNbgNbmwbijaaaaafbmxbmzbmybmBbmAbmCbmxbmDbmxbmEaJqbAibfFbmFbkKbkLbmGbmIbfFbmJbliblkbmKbmLbhhbmMbfKbmObmNbkObfKbmRbkPbkRbkQblabkUblablgbKHblobKHbKHbKHblqbdPbnbbiIblsblxbltblDblyblGblFblFblMblNbnjbfVbvxblXbnmbgcbnnbnpbnoblZbiWbmabgcbmdbmcbmebnsbnsbnsbnsbnsbnsbnuaafaaaaafaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacymcyocyvcyncybcyacypcywcylcyxcyicyicyicyicyicyicyicyzcyycyAaafaaabeObnvbjabjabjabeObeObeOaaaaaaaaacyCcyBcyBcyBcyBcyBcyCaaaaaablWbnwbqmbmjbmhbmhbmhbmhbmhbmhbmhbmhbmhbmHbmtbmPbnEbmQbnGbfmbnIbbRbnJbnLbnKbfobnMbnNbjzbjzbmrbnPbnObnRbnQbnSbmraaaaaabgObnTbnVbnUbnVbnWbijaaaaaabmxbnYbnXbnZbmxboabmxbmDbmxbmEaJqbmSbfFbobbkKbmTbipbodbfFbofboebohbogboibhhbojbfKbhibokbmUbfKbfLbmVbfLbmWbmYbmXbmZbmZbmZbmZbmZbmZbmZbnabncbopblwblvbnebndbotbosboubouboubnibiLbovboxbozbowboyboBboAbngbnfbnkbnhbnlbgcbnrbnqbnxboFboFboFboFboFboHbhGbkybkybkyaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacymcyocyvcyvcyrcygcywcyicylcyxcyicyicyicyicyicyDcypcyccygcyEcybaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyCcyBcyBcyBcyBcyBcyCboIblWblWboJbqmbjrbjrboKboKboKboKbjrbjrbjrbjrbkJboNbuFbnybnAbnzboSboRboTbbRbbRbnKboWboVboYboXbpaboZbpcbpbbpebpdbpfbmraafaaabgObpgbphbphbphbpibijaaaaafbmxbpkbpjbplbmxbpmbmxbmDbmxbpnaJqbmSbfFbnBbkKbnDbnCbptbfFbpublibiubogbpwbpvbofbofbpybpxbnHbnFbolbocboobomboqbpEbpHbpGbpJbpIbpLbpKbonbPvboCborboEboDboLboGbfVbpRbouboubpTbnibiLbpUbpWboMboObpXboBbpZboQboPbpobiWbpqbppbprbgcbqebqebqebqebqebqebiYbhGbqhbqgbkybkyaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyFcyccyGcyvcyHcyicyIcyicyrcyKcyJcyicyicyicyDcypcywcyLcyLcyMcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyCcyBcyBcyBcyBcyBcyNbqibqjbqibqlbpsbmbbmbbpzbjrbjrbjrbjrbjrbqnaZEaZEbqobbRbtvbpBbpAbfmbqsbbRbqtbbRbqubmEbnMbqwbqvbqybqxbqAbqzbqBbpdbqCbmraaaaaabgObqDbqFbqEbqFbqGbijaaaaaabqHbqJbqIbqHbqHbqHbqHbqKbqHbqLaLYbpCbfFbfFbpDbpMbpFbfFbfFbqPbpNbpObhhbhhbhhbhhbhhbwzbpPbqQbqQbqQbqWbqQbIqboqbpEbrabqZbrcbrbbrebrdbonbpQbpVbpSbpYbpYbqbbqabfVbqcbiLbiLbqdbnibiLbrqbrsbzEbhUbrtboBboBbrxbqfbqkbrxboBbgcbgcbgcbrAbrzbrCbrBbrDbqebrFbrEbrHbrGbrIbkyaaaaafaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyFcyccyGcyvcyHcyicyIcyicyrcyKcyJcyicyicyicyDcypcywczyczycyMcyhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyCcyBcyBcyBcyBcyBcyNbqibqjbqibqlbpsbmbbmbbpzbjrbjrbjrbjrbjrbqnaZEaZEbqobbRbtvbpBbpAbfmbqsbbRbqtbbRbqubmEbnMbqwbqvbqybqxbqAbqzbqBbpdbqCbmraaaaaabgObqDbqFbqEbqFbqGbijaaaaaabqHbqJbqIbqHbqHbqHbqHbqKbqHbqLaLYbpCbfFbfFbpDbpMbpFbfFbfFbqPbpNbpObhhbhhbhhbhhbhhbwzbpPbqQbqQbqQbqWbqQbIqboqbpEbrabqZbrcbrbbrebrdbonbpQbpVbpSbpYbpYbqbbqabfVbqcbiLbiLbqdbnibiLbrqbrsbzEbhUbrtboBboBbrxbqfbqkbrxboBbgcbgcbgcbrAbrzbrCbrBbrDbqebrFbrEbrHbrGbrIbkyaaaaafaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacypcyccyhcyicyicyicyMcygcyccyccyecyEcypcywcyicyOcyOcyPcylaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyCcyBcyBcyBcyBcyBcyQbrJbrKbrJbrLbjrbjrbjrboKboKboKboKbjrbjrbrNbrMaZEbrObbRbtvbpBbqpbfmbqsbbRbbRbbRbqubmEbrTaJqbqvbqybrUbrWbqqbqqbqrbrZbmraafaafbsbbsabsdbscbsfbsebsgaafaafbshbsjbsibslbskbsnbsmbsobqHbspaJqbqNbqMbqRbqObqTbqSbqVbqUbsybqXbqYbsxbsxbsxbsxbsxbrgbrfbsxbsxbsxbrhbhgbribrjbpEbsKbrkbsLbsLbsNbpKbonbPvbdPbsObsQbsPbsRbsRbfVbsSbCIbsTboxbrlbiLbsWboxbsXbsZbrmbtbbtabrobrnbrpbtebthbrrbtjbrubrwbrvbrvbrvbrPbrybrQbhGbtqbtpcAKbkyaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyEcygcywcyicylcyicyicyicyicyicyicyicyicyMcyhcyicyicyicyicyicyRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyCcyBcyBcyBcyBcyScyCboIblWblWbtrbjrbjrbjrbjrbjrbjrbjrbjrbjrbrNbtsaZEbttbtubjvbrRbkMbkNbkMbuIbbRbtybnKbtzbrTaJqbqvbqybmrbtBbrSbtDbtCbtEbmraaaaaaaafbgObtGbtFbtGbijaafaaaaaabshbtIbtHbtKbtJbtLbtLbtNbtMbtObAkaNrbrVbrXbLXbFDbrYbEebsqbEebEebssbsrbtXbtVbtVbtVbtZbhhbhhbhhbstbuabuabsubpEbpEbpEbsvbugbufbrebpKbonbdObdPbuhbuhbuhbuhbuhbfVboxboxboxboxbujbswbujboxbszcdXbsAbuobuobuobsCbsDbupbusbsEbuubsFbuwbuvbuvbsGbsIbsHbsMbsJbtqbtpbtpbkyaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyEcyccyccyccyccyccyccyccyEcybaaacyacypcywcyicyicyicylcyicyicyDcyccyccyecyKcyicyicylcyicyicyicyicyicyRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyCcyBcyBcyBcyBcyBcyTbrJbrKbrJbnwbuBbjrbjrbuCbjrbuBbjrbjrbjrbrNbuDaZEbuEbbRbtvbsVbbRbfmbbRbbRbbRbuJbnKbtzbrTaYlbqvbuKbmrbuMbsYbuObuNbnSbmraaaaaaaafbuPbuQbphbuSbuRaafaaaaaabshbtdbtcbuWbuVbuYbuXbuZbqHbvaaJqaJqbofbofbtfbJGbwzbBLbvjbvhbtgbtgbvhbvjbvhbvjbvhbvjbvhbvjbfJbfJbuabvnbsLbtkbtibpEbsvbtlbvsbvvbvubonbtmbtobtnbtxbtwbuobuobtAbuobuobtPbtSbtQbtUbvEbuobtWceXbvHbvJbvJbvJbvKbvKbvKbvKbvKbvMbtYbvObvNbvObvPbvObqebuzbhGbvQbrGbvRbkyaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -6969,72 +6983,72 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoVapQbVwbVwbVwbVwbVwbXvbHEbXvbHEbXwbXxcAMbXybHEbCqbHEbLvaoVaoVapQaoVaoVapQaoVbESbVHbVIbWBbXAbXzbXCbXBbXDbWBbXFbXEbODbOCbOMbVJbVMbCqbSAbLZbQgbXJbXKbLKbXMbXLbWQbOObXPbXObWQbXQbSIbXRbMKbXSbWabOdbVZbXTbXUbTTbXVbPhbRKbPjbXXbXWbXYbOhbVubzsbWebzsbBRbXZbPvbNcbOPbYabYdbYcbWibYabYebWjbYebPubPwbLTbDbbEmbEmbEmbYgbYfbRZbUfbMibUgbYhbRUbRUbUibDbbQZbYjbYicaZbQZbQZbYkbYmbZdbPsbPbbPLbPFbPMbUpbUpbTqbTrbkybYrbkybYsbkyaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoVaoVaoVaoVaoVapQapQbLvbLvbLvbYubYtbYwbYvbYxbHEbYybHEbLvaoVaoVaoVaoVaoVaoVaoVbESbVHbVIbYzbYBbYAbXCbYCbYzbYzbXFbYDbQbbPQbQdbVJbVMbCqbSAbLZbYIbYHbYHbYJbYLbYKbYNbQebYPbQqbWQbOdbSIbYQbYRbXSbYSbOdbVZbXTbUSbURbYTbQyapQbQAbYVbYUbYWbOhbVubzsbWebzsbHZbHZbPvbNcbNdbYXbYYbNdbYZbNdbNdbNdbNdbNdbNcbLTbDbbJNbJNbJNbJNbVibZabTcbZbbVibJNbJNbJNbJNbDbbTlbZcbTlcbabTlbQZbYkbYmbYlbYobQGbQIbWrbZhbQZbUpbTqbTrbkybtpbtpbtpbZiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaafaafaafbLvbZkbZjbZjbZlbWzbLubCqbLvbLvaoVcceaoVaoVaoVaoVaoVbGpbVHbVIbYzbYzbZnbZpbZobYzbZqbZsbZrbZvbQKbQPbVJbVMbCqbZxbQQbDGbYHbZzbRicewbRjbRmbRkbRSbRobWQbZFbZGbXRbMKbXSbZHbOdbZIbXTbUSbZJbZKbRIbVvbPjbZLbXWbXWbOhbVubPnbWebZMbzsbZNbPvbZObTZbTZbZPbNdbZRbZQbZSbzsbZUbZTbLSbLTbDbbRTbRUbRUbZVbRVbMibRXbRZbZWbZXbEmbEmbEmbDbbZYbTlbTlbTlbTlbQZbZZbZZcaacabbPNbPNbWrbPNbQZbPNbTqbTrbkycadcaccaebZiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaSaaSaaSaaSaaSaaSaaSaaSabaaaSaaSaaSaaSaaSaaaaaabCqbCqbCqbCqbCqbCqbYybCqbCqbCqbCqapQaoVaoVapQaaHcjnaoVaoVaoVbGpbVHbVIcagcaicahcakcajcamcalcaocanbSdbYFbStbVJcatcasbSRbSwbHPbYHcawbZybThbTgbTjbTibTHbTGcaDbPccaEbMKbMKbMKcaFbOdcaHcaGbUSbURbOdbQyapQbOhbOhbOhbOhbOhbVubPncaJcaIbzscaKcaMcaLbUXcaNcaObzscaQcaPcaRbzscaSbMbcaUcaTbDbbEmbSZbEmcaVbTabMibTcbMibTdcaWbEmbSZbEmbDbcaXbTlcaYcbccbbckacjWckNckMcbdbPNbWrbWrcbebQZbDhcbfcbgbkycbicbhbtpbZiaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaafaaaaafaaaaafaaaacyaaaaafaaaaafaaaaaSaafaafbCqbHEbHEbHEbHEbHEbHEbHEbHEbLubLvaoVaoVaoVaaHcjocmXaaHaaHapQbGpbVHbVIcblbYzbWBbWBbWBbYzcbmcbocbnbXGbTIbUcbVJbCqbCqbUlcbrcbtbYHbYHcbucdtbUmcaAcaAcaAcaAbWQbOdcbAcbzcbCcbBbQtcbDcbFcbEbXUbTTcbGbPhbRKbPjcbIcbHcbHbOhbVubPnbAwcbJbzsbzscbLcbKbzscbMcbNbzsbzscbObzsbzscbNbFrcbQcbPbDbbEmbEmbEmcbScbRbRZcbTbMibUgcbUbRUbRUbUibDbbTlbTlcbVbTlbTlbQZbZZbZZcbWcbXbPNcbZcbYcbYbQZbqgcbfbTrbkybkybkybtpbkyaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaccacccccbaaaccacccccbaaaccacccccbaaaaaSaaaaaabLvccdbHEbCqbCqbCqbTzbCqbCqbCqbCqaoVaoVaoVcnBaaHaaHapQaoVaoVbGpbVHbVIbYzccgccfbWBcchbYzbYzbXFccibOCbUybVbbUCbVdbVcbVfbVebVhbVgbVobVmbVqbVpcerbVrbWhbVKccwccvccyccxbRAbRAbRDbTOcczbTUbRFbURccAbQyapQbQAccCccBccDbOhbVubzsbzsbWeccFccEcbLccGbzscbMccIccHccKccJccLccHccNccMbhGccObDbbDbbDbbDbbDbbDbbMiccPcfybDbbDbbDbbDbbDbbDbbQZbQZbQZbQZbQZbQZccRccRccSccTbQZbQZbQZbQZbQZbkyccUbTrbkyccWccVbtpbkyaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafccaccXccbaaaccaccXccbaaaccaccXccbaafaafaaaaaabLvccYccZbCqbSqbHEbHEcdabQacdbbCqaoVaoVaoVaoVapQaoVaoVaoVaoVbESbVHbVIbWBcddcdcbWBcdecdfbWBbXFcdgbWtbWsbWvbWubWKbWJbXmbXkbXobXnbXqbXpbXIbXHccsbXNcdtbYbccwcdwbOdcbAbTObTPcdycdxcdAcdzbMWcdBcdCbRIbVvbPjcdDcbHcbHbOhbVubzsbAwcdEcdGcdFcdIcdHbzscdJcdLcdKccMcdMccMbFrbHdcdNbhGcdObDbcfrcgicgicglcgkbMiccPcgnbDbaafaafaafaafbkycdQbNBblQcdRcdRbQZcdScdSccSbScbQZcmobtpcAKbtpbDhccUbXubkycdVbtpbtpbkybkybkyaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaccaccXccbaafccaccXccbaafccaccXccbaaaaafaafaafbCqbLvbCqbCqbCqcdWcdYcgFcpYbSsbCqaoVaoVaoVaoVapQaoVaoVapQaoVbESbVHbVIbWBceacdZceccebcedbWBcefceecehcegceibVJbYpbYnbYEbYqbYMbYGbZebYObZgbZfbZubZtbZAbZwceycexbOdcbAcezbOdbOdbOdcezcezcezbURceBceAapQbOhbOhbOhbOhbOhbVubzscaKceCceEceDceGceFbzsbzsceIceHceJbLSceLceKbzsbzsbhGcdObDbchochqchqchschrchuchtcjBbDbaafaaaaaaaafbkybtpceMbrGceOceNbQZcePcePceQbScbQZbkybkyceSceRbDhccUbTrbtpbtpbtpceTblPceUblPaagaagaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafccaccXccbaaaccaccXccbaaaccaccXccbaafaafaaaaaaaafaafbCqceVbCqceWceYbCqbTzbCqbCqaoVapQaoVaoVapQaoVaoVapQaoVbESbVHbVIbVIbVIbVIbVIbVIbVIbVIbVJbVJbVJbVJbVJbVJbCqbZBbCqccwcfbcfbcfbcfcbZDbZCcfbbZEcfhcapccwbOdbQucficezbOdbOdbOdbOebULcezbURcezbLKapQapQapQapQapQapQbVucfjcfjcfjcflcfkcfjcfjcfjcfmcfocfnceJcfpceJceJbzscfqcbKcdObDbbDbccQccQbDbbDbccQcknccQbDbaaaaaaaaaaaabkybkyccUcfsbkybkybQZbQZbQZcftcfubQZbDhbkycaebtpckSccUcbgbkybkycfvbkybkybkybkyaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaSaaSaafaaaccaccXccbaaaccaccXccbaaaccaccXccbaaaaafaaaaaacfxcfwcfwcfwcfwbCqbCqcqncqybCqbLvbLvbLvbLvbLvbLvbLvbLvbLvbCqcarcaqbTAcaxcazcaycaycaycaycaycaycaycaycaycaBcaBcaycaCceWccwcfFcfEcfHcgOcbqcbpcfbcbscfMctRccwcfNcfObRHcfQcfPcfRcfPcfQcfScfQcfTcezbLKbLKbLKaoVaoVapQaoVcfVcfUcfXcfWcfZcfYcgbcgacfjcgcbAwcgdcgfcgecghcggbKTbKTcgjcnHbkyaaaaaaaaaaaaaaaaafcskaafaaaaaaaaaaaaaaabkyczGcgocgmcgmcgpcgrcgqcgtcgscgubkybkybkybkycbvbkyccUbTrbkycgybtpbtpbkyaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaafaaaaaaaaacgzaaaaaaaaacgzaaaaaaaaacgzaaaaaaaafcfxcfxcfxcgAcgCcgBcgEcgDbHEcAhcAicgGcgHcgHcgHcgHcgHcgHcgHcgHcgHcgHcgHcbwbEPcbxcbyccwccwccwccwccwccwccwccwccwccwccwccwccwccwccwcfbcgMcgOccjcclcckcgSccmccoccnccwcfNcgWcgVcgYcgXchacgZchbbOdchdchcchfchechgcheaoVaoVapQaoVcfjchhchjchichlchkchnchmcfjbAwbAwceJceJcbKceJccMbAwbAwcbKczHbkybkybZibZibkybkybZiczQbZibkybkybZibZibZibkyczRczSbnschwchvchxchxchxchychAchzchCccpccqccqccqccrcctbkyccVbtpchHbkyaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafchJchIchIchKchLchLchLchLchLchLchLchLchLchLchLchMchOchNchOchPchRchQchScgHchUchTbQabCqbLvbLvbLvbLvbLvbLvbLvbLvbLvbCqbCqccucdicdhcdjccwchYchYchZccwcibciacidciccifciecihcigcijcdkcfbcikcimcdlcdmcinciqcdncdpcdoccwbLKcitbMQciubMQcivbMQciubMQciwbMQcixbLKbLKbLKapQapQapQaoVcfjciyciAcizciCciBciEciDcfjciFbAwccMccMciGceJccMbAwciHcbKczTbUwbUwbUwbUwbUwbUwbUwczUcANczVczVczVczVczVczXczWblObkyciKciJbkybkybZibZibkybkyciLcbfcdqbnscdscdrcdubkybkybkybkybkyaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaafaaaaaaaaaciPaaaaaaaaaciPaaaaaaaaaciPaaaaaaaafcfxcfxcfxciQciSciRcfwbHEbHEbHEbHEbCqaaaaaaaafaaaaaaaafaaaaaaaafaaabCqciTbCqciUcdvccwciXciWciZciYcjbcjacgRcgRcgRcdTcjecjdcjfcjacfbcjgcgOcdUciocjjcfbcejcelcekccwapQcphapQbVuapQcphapQbVuapQcpPapQcpPapQapQaoVaoVaoVapQapQcfjcjpcjrcjqcjtcjscjvcjucjxcjwcjzcjyccMbLSccMcjAbFrbHdchpczYczYczYczYczYczYczYcAaczZczYczYczYczYczYczYcAccAbcAdbkycjCcbfbkyaaaaaaaaaaaabkybtpcbfcjEcjDcjDcjFcjGcjDaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaSaaSaafaaaccacjHccbaaaccacjHccbaaaccacjHccbaaaaafaaaaaacfxcfwcfwcfwcfwcjIbLubHEbHEbCqbCqbLvcAjcjJcjJcjJcjJcjJcjJaafbCqbCqbCqcjKcemccwcjMciZciZciYckHcgRcencjNcjPcnAcgRcgRcgRcgRcfbcjUceoceocjYcjXcfbcepcfMcsFccwbOhckbbQAckbbOhckbbQAckbbOhckcbQAckdbOhaoVaoVaoVaoVaoVapQckfckecjrckgckickhckkckjcfjcklceJceJceJckmceJceJceJbzsbCqbCqbCqbLvbLvbLvbCqbCqbLvbLvbLvbCqbCqbLvbLvbLvbCqckobkybkyckpcbfbkybkybZibZibkybkybtpckqckrcjDcktcksckucjDaaaaaaaafaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafccacjHccbaaaccacjHccbaaaccacjHccbaafaafaafaaaaaaaaaaaaaagbCqbCqbCqckvbHEbCqckvbJfcjJckwckyckxckyckzcjJaaabCqbSsbHEckAcemccwckBckBckCccwckEckDckGcgRckFcnAckJckIckKckKcfbckLceqceqckPckOckRcesckTcetccwbOhckVckUckWbOhckYckXckZbOhclbclaclcbOhaoVaoVaoVaoVaoVaoVcfjcldclfcleclhclgcljclicfjclkclmcllcloclncAeccMccMbAwclpbHEbLvaaaaaaaaaaafaaaaafaaaaafaaaaaaaaaaaaaaabkyclqbDhbkyclsclrcltcgrcltcltcltcltclvcluclwcjDclyclxclzcjDaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHraaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaccacjHccbaafccacjHccbaafccacjHccbaaaaafaafaafaaaaaaaaaaagclBclAclBbHEbHEbTzbHEccdcjJclCclEclDclGclFcjJaaabCqceYbHEckAcemccwckBckBckCccwclHcigclJceuceZcevclJcigclJclJcigclMcfaclQckHclPclRclNcgUcfdccwbOhclUclTclUbOhclWclVclWbOhclYclXclZbOhapQapQapQapQapQapQcfjcfjcfjcmbcmdcmccmfcmecmdclkcmgccMcmicmhcmjcdNccMcmkbCqbHEbLvaafaafaafaafaaaaafaaaaafaaaaaaaaaaaaaaabkycmqbtpbkycmrbntbntcmsbntbnsbnsbnscmtcmtcmucjDcmwcmvcmxcjDaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafccacjHccbaaaccacjHccbaaaccacjHccbaafaafaaaaafaafaaaaaaaagbCqbCqbCqbCqbHEbCqbCqbCqcjJcmycmAcmzcmBcmycjJaafbCqccwcmDcmCcfeccwckBckCckCccwcmGcmFcmIcffckFcfgcmLcmKcmLcmLcmNcfzcmQcmQcmRcmQcmQcfAcfCcfBccwbOhclUcmUclUbOhclWcmVclWbOhclZcmWclZbOhaoVaoVapQapQaoVaoVaoVaoVaoVcpOcmdcmYcnacmZcmdbAwcnccnbcbQcndcnebFrcngcnfbCqclpbLvaaaaaaaaaaafaaabZibZibZibkybkybkybkybkybkyciIbtpbkybkybkybkybkybtpbkyaafaaaaaaaaaaafcnjcnjcnkcnjcnjaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaccacnlccbaaaccacnlccbaaaccacnlccbaaaaaSaaaaaaaafaafaaaaaaaaaaaaaaabLvbHEbLvaaaaaacjJcnmcnocnncnqcnpcjJcjJcjJccwcnrcmCcfDccwccwccwccwccwcntcfGcgRcgRckFcgUcgRcgRcnwcnvcnxcgRcgRcgRcgRcnycgRckFcnAcfIccwbOhbOhbOhbOhbOhbOhbOhbOhbOhbOhbOhbOhbOhaoVapQapQaoVaoVaoVaoVaoVaoVcpQcmdcmccnCcmecmdbzscnDbHdcnFcnEbHdcnGbzsbzsbCqaagaagaaaaaaaaaaafaaabZicmlcmmbkycmpcmocnibtpbYrcnJbtpcAKbtpbtpbtpbtpbtpbkyaafaaaaaaaaaaafaaacnjcnKcnjaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaafaaaaafaaaaafaaaaafaaaaafaaaaafaaaaaSaaaaaaaaaaafaafaaaaaaaaaaaabLvbHEbLvaaaaaacjJcnLcnNcnMcnPcnOcnRcnQcnScnRcnUcfJcgvcfLcnYcnXcoacnZcobcgwcgIcgxcgKcgJcsFccwcgLccwcgLccwcsFcgNcgRcgRcgPckFcnAcgQccwccwccwccwccwcigcigcigcigccwaafaafaafaafapQapQaoVaoVaoVaoVaoVaoVaoVcpQcmdcopcorcoqcosapQbzsceIcotbPnbPnbzsbzsaaaaafaaaaaaaaaaaaaaaaafaaabZicnhcnibYrbtpceRcnibkybkyckobkycnIcmocoubMBbNAbkybkyaafaaaaaaaaaaafaaacnjcnkcnjaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaSaaSaaSaaSabaaaSaaSaaSaaSaaSaaSaaSaaSaaSaaaaaaaaaaaaaafaafaaaaaaaafbLvbHEbLvaafaafcjJcovcoxcowcozcoycoBcoAcoCcgTchDchBchEcoHcoHcoHcoJcoHcoLcoKchFcoMcjSchGccwchVchXchWchXciiccwcilcgRcipcirckFciscjScjScjScoZcpaccwcpbcigcpccpdcpdcpeaaaaaaaaaaoVaoVaoVaoVaoVaoVaoVaoVaoVcpQcmdcmdciMcmdcmdaaaapQaaacscaoVaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaaabLvcAfcAgbCqbVLbtpcnicpgbkycskbkybkybkybZibZibkybkyaaaaafaaaaaaaaaaafaaaaaacpiaaaaaaaafaaaaafaaaaaaaafaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaabLvbHEbLvaaaaaacjJcpjcplcpkcpncpmcjJcpocppcjJcpqcpWciNcgRcgRcpsclJcptckHcpuciOcpvcpvcpvcpycpxcAOcpzcpCcpBcpycpDcpDcnxcencocciVcjNcjNcjPcgUcjccpIciZcpIcpJczMczLcpMczNaaaaaaaoVaoVaoVaoVaoVaoVaoVaoVaoVcpQbVwcmdcpNcmdczIapQapQaaacsmaoVaaaaaaaaaaaaaaaaafaafaaaaaaaaaaafaaabLvbLvbLvbCqbCqbkycnicmnbkycsyaafaaaaafaaaaaaaafaaaaaaaafaaaaaaaaaaafaaaaaacpiaaaaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbCqbCqcpRbCqbCqaaacjJcpScpUcpTcjJcjJcjJcjJcjJccwcpVcgRciNcgRcgRcpXclJcpZckHcqacqccqbcqecqdccwcqfcqhcqgcqjcqiccwcqkcqlcqlcqccqackHcqmcjhckFcgUcqoccwcqpcigcqqcpdcpdcqraaaaaaaaaaoVaoVaoVaoVcszaoVaoVaoVaoVczJbVwcqscqtcqsbVwapQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaafaaaaaaaaaaafaaaaaabZicqubZibZiaafaafaaaaafaaaaaaaafaaaaaSaaSaaSabaaafaafaafaafcpiaafaafaafaafaafabaaaSaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbCqciTbHEcqvbCqaafcjJcjJcjJcjJcjJaafaaaaaaaafccwcqwcgRcjicqxcqxcqzcigcigcqAccwcqCcqBcqBcqBccwcqDcqFcqEcqHcAPccwcqBcqBcqBcqCccwcqAcigcigckFcgUccwccwcigcigcigcigccwaafaafaafaafapQapQaoVaoVaoVaoVaoVaoVaoVapQbVwaaaaaaaaabVwapQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaafaaaaaaaaaaafaaaaaabZibtpbZiaaaaaaaaaaaaaafaaaaaaaafaaaaaSaaaaaaaafaaaaafaaaaaacqJaaaaaaaafaaaaafaaaaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLvcqKcAQcqLbCqaafaaaaaaaafaaaaaaaafaaaaaaaafccwcqOcqNckHcqPcqRcqQcigcqScqTccwcqVcqUcqWcqUcqYcqXcracqZcrbcqGcqYcqUcqUcqUcrcccwcrecrdccwckFcrwcjkcjlcjTcrhcqYaaaaaaaaaaaaaaaaaaaoVaoVaoVaoVaoVaoVaoVaoVaoVaoVbVwbVwbVwbVwbVwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaabZicribZiaaaaaaaaaaaaaafaaaaaaaafaaaaaSaafcrjcrjcrjcrjcrjaaacrkaaacrjcrjcrjcrjcrjaafaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLvcrlcrmbJebCqcigcrncrncrncrncrncrncrncrncigccwcrpcrocrrcrqcrpccwccwccwcqAccwccwcqYcqYcqYcqYcrscrIcrtcrucrvcqYcqYcqYcqYccwccwcqAccwccwcpEcjOcjmcjQcgRcrAcqYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaagaagaagaaaaaaaaaaaaaaaaaaaaaaafaaaaaSaaacrBcrCcrCcrCcrCcrDcrkcrFcrEcrEcrEcrEcrGaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLvbLvbLvbLvbCqaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwcrHcrJcrKaoVaaHcsPcqYcqYcqYcqYczEcqYcqYcqYcqYcsPaaHaoVczFcrMcrLccwcjRccwccwcjVcrPcrRcqYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaSacycrScrScrScrScrSaaacrkaaacrScrScrScrScrSaafaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwcrTcrUcrUaoVcAkcAlcAlcAlcAlcAlcAmcAlcAlcAlcAlcAlcAnaoVcrUcrVcrTccwcrWcrXccwcigcigcrYcigaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaaSaaaaaaaaaaafaaaaaaaaacrkaaaaaaaaaaafaaaaaaaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwcrZcsbcsaapQcAoaaHcsAaoVaoVaoVaoVcsAaoVaoVcsAaaHcAoaoVcsdcsfcseccwcsgcfKcigaafaaacsicshaafaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafcrjcrjcrjcrjcrjaaacrkaaacrjcrjcrjcrjcrjaafaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwcrTcrUcsjaoVcApcAqaoVaoVaoVaoVaoVcsBaoVaoVaoVcAscAraoVcrUcrUcrTccwaagaagaagaafaaacsLcslcsocsncspcsncsocsncspcsncsocsncspcsncsocsncspcsqcsraaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaacrBcrCcrCcrCcrCcrDcrkcrFcrEcrEcrEcrEcrGaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwcsscstcrUaoVcAoaaHaoVaoVapQapQapQapQapQaoVaoVaaHcAoaoVcrUcsvcsuccwaaaaaaaagaafaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaafaaaaaacsLcswcshaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafcrScrScrScrScrSaaacrkaaacrScrScrScrScrSaafaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwccwcsxcrUaoVcAoaaHcsAapQapQcsHcsCcsIapQcsJaoVaaHcAoaoVcrUcsxccwccwaaaaaaaagaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafcsUcswcsraafaafcsDcsDcsDcsDcsDaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaafaaaaaaaaacsEaaaaaaaaaaafaaaaaaaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcsFccwcsGcrUaoVcApcAqaoVaoVapQcsRcsQcAtapQaoVaoVcAscAraoVcrUcsKccwcsFaaaaaaaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaafaaaaaacsLcswcshaaacsDcsNcsMcsOcsDaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafcrjcrjcrjcrjcrjaaacpiaaacrjcrjcrjcrjcrjaafaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwccwcsxcrUaoVcAoaaHaoVcsSapQctmctfczDapQapQcsAaaHcAoaoVcrUcsxccwccwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaaaaaaaaacsUcsTcshcsDcsWcsVcsXcsDaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaacrBcrCcrCcrCcrCcsZcsYcsZcrEcrEcrEcrEcrGaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwcsvcsucrUaoVcAoaaHaoVaoVapQapQapQapQapQaoVaoVaaHcAoaoVcrUcsscstccwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaaaaaaaaaaafcsUctacsDctcctbctdcsDaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafcrScrScrScrScrSaaacpiaaacrScrScrScrScrSaafaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwcrTcrUcteaoVcApcAqaoVaoVaoVapQaoVaoVaoVaoVaoVcAscAraoVcrUcrUcrTccwaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaaaaaaaaaaafctgcthcsDctjctictkcsDctgctgaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaaaaafaaaaafaaaaaacpiaaaaaaaafaaaaafaaaaaaaaSaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaccwctlcsbcsaapQcAoaaHcsAaoVaoVcsAaoVaoVaoVaoVcsAaaHcAoaoVcsdcsfctnccwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaafctgctpctoctrctqcttctsctuctgaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaSaaSaaSaaSaaSaafaafaaacpiaaaaafaafaaSaaSaaSabaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwctvcrUcrUaoVcAoaaHaaHcAuaaHaaHcAuaaHaaHcAuaaHaaHcAoaoVcrUcrUctvccwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaaaaaaaaaaafctgctwctoctxctbctzctyctActyaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafctBaafaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwctvcrUctCaoVcAvcAlcAlcAwcAlcAlcAwcAlcAlcAwcAlcAlcAxaoVctDcrUctvccwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaaaaaaaaaaafctgctFctEctHctGctJctIctKctgaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaafaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjZccwccwccwcrUapQapQapQapQaoVaoVaoVaoVaoVapQapQapQapQcrUccwccwccwcjZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaaaaaaaaaaafctgctgctgctMctLctNctgctgctgaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaSaaSaaSaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaactvccwccwcigcigcigcigcigcigcigcigcigcigcigcigcigccwccwctvaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaafaaaaaactOctxctPctQctOaaaaaaaagaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaactvctvctvctvctRctvctvctvctvctvctvctvctRctvctvctvctvaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaafaaaaaactOctxctSctzctOaaaaaaaagaagaagaagaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaafaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaSctyctyaaSaafaafaafctgctUctTctVctgaafaafaafaaSctyctyaaSaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSctXctWctZctYaaacuacuacuacuccubcudcuacuacuaaaacuecugcufcuhaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSctXctWcufcuicujcuaculcukcuncumcupcuocuqcuacuscurctWcufcuhaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacutaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSctXcuucuwcuvcuvcuxcuzcuycuBcuAcuCcuycuEcuDcuFcuFcuHcuGcuhaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSctXcuIcuhaaaaaacuacuJcuycuLcuKcuMcuycuNcuacuOcuOcuQcuPcuhaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaScuScuRctgctgctgcuacuUcuTcuVcuVcuWcuTcuXcuactgctgctgcuYcuZaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSctXcuIcuhaaaaaacvacvccvbcvecvdcvacvfcvgcvaaaaaaactXcuPcuhaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSctXcuIcuhaaaaaacvacvicvhcvkcvjcvmcvlcvncvaaaaaaactXcuPcuhaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSctXcuIcuhaaacvacvacvocvlcvpcvpcvpcvlcvqcvacvaaaactXcuPcuhaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSctXcuIcuhaaacvacvacvrcvpcvpcvscvpcvpcvtcvacvaaaactXcuPcuhaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaScuScvuctgctgcvacvacvlcvpcvvcvvcvvcvpcvlcvacvactgctgcvwcuZaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSctXcuIcuhcsDcvacvxcvlcvycvvcvzcvvcvycvlcvAcvacsDctXcuPcuhaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSctXcuIcuhaaacvacvacvlcvpcvCcvBcvDcvpcvlcvacvaaaactXcuPcuhaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSctXcuIcuhaaacvacvacvrcvpcvEcvycvpcvpcvtcvacvaaaactXcuPcuhaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSctXcuIcuhaaacvacvacvFcvpcvHcvGcvIcvpcvFcvacvaaaactXcuPcuhaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaScuScvJctgctgcvvcvacvacvfcvLcvKcvMcvbcvacvacvvctgctgcvNcuZaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacvOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSctXcuIcuhaaaaafaaacvacvacvacvPcvQcvacvaaaaaafaaactXcuPcuhaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSctXcuIcuhaaaaafaaacvScvRcvUcvTcvWcvVcvSaaaaafaaactXcuPcuhaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSctXcuIcvYcvXcvZcvZcvScwacwccwbcwecwdcvScvXcvZcvXcwfcuPcuhaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSctXcwgcwhcuvcuvcuvcwjcwicwlcwkcwncwmcwocuFcuFcuFcuFcwpcuhaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaacuOcuOcuOcwqcuOcvScwrcwtcwscwvcwucwxcwwcwqcuOcwqcwqaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaSaaSaaSaaSaaSaaScvScwzcwBcwAcwDcwCcvSaaSaaSaaSaaSaaSaaSaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcvScvScwEcwEcwEcvScvSaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaSaaSaaSaaSaaSaaSaaSaaSabaaaSaaSaaSaaSaaSaaaaaabCqbCqbCqbCqbCqbCqbYybCqbCqbCqbCqapQaoVaoVapQaaHcjnaoVaoVaoVbGpbVHbVIcagcaicahcakcajcamcalcaocanbSdbYFbStbVJcatcasbSRbSwbHPbYHcawbZybThbTgbTjbTibTHbTGcaDbPccaEbMKbMKbMKcaFbOdcaHcaGbUSbURbOdbQyapQbOhbOhbOhbOhbOhcaJcaIcdEcbJbzscaKcaMcaLbUXcaNcaObzscaQcaPcaRbzscaSbMbcaUcaTbDbbEmbSZbEmcaVbTabMibTcbMibTdcaWbEmbSZbEmbDbcaXbTlcaYcbccbbckacjWckNckMcbdbPNbWrbWrcbebQZbDhcbfcbgbkycbicbhbtpbZiaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaafaaaaafaaaaafaaaacyaaaaafaaaaafaaaaaSaafaafbCqbHEbHEbHEbHEbHEbHEbHEbHEbLubLvaoVaoVaoVaaHcjocmXaaHaaHapQbGpbVHbVIcblbYzbWBbWBbWBbYzcbmcbocbnbXGbTIbUcbVJbCqbCqbUlcbrcbtbYHbYHcbucdtbUmcaAcaAcaAcaAbWQbOdcbAcbzcbCcbBbQtcbDcbFcbEbXUbTTcbGbPhbRKbPjcbIcbHcbHbOhapQbPnbAwceCbzsbzscbLcbKbzscbMcbNbzsbzscbObzsbzscbNbFrcbQcbPbDbbEmbEmbEmcbScbRbRZcbTbMibUgcbUbRUbRUbUibDbbTlbTlcbVbTlbTlbQZbZZbZZcbWcbXbPNcbZcbYcbYbQZbqgcbfbTrbkybkybkybtpbkyaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaccacccccbaaaccacccccbaaaccacccccbaaaaaSaaaaaabLvccdbHEbCqbCqbCqbTzbCqbCqbCqbCqaoVaoVaoVcnBaaHaaHapQaoVaoVbGpbVHbVIbYzccgccfbWBcchbYzbYzbXFccibOCbUybVbbUCbVdbVcbVfbVebVhbVgbVobVmbVqbVpcerbVrbWhbVKccwccvccyccxbRAbRAbRDbTOcczbTUbRFbURccAbQyapQbQAccCccBccDbOhapQbzsbzscfVccFccEcbLccGbzscbMccIccHccKccJccLccHccNccMbhGccObDbbDbbDbbDbbDbbDbbMiccPcfybDbbDbbDbbDbbDbbDbbQZbQZbQZbQZbQZbQZccRccRccSccTbQZbQZbQZbQZbQZbkyccUbTrbkyccWccVbtpbkyaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafccaccXccbaaaccaccXccbaaaccaccXccbaafaafaaaaaabLvccYccZbCqbSqbHEbHEcdabQacdbbCqaoVaoVaoVaoVapQaoVaoVaoVaoVbESbVHbVIbWBcddcdcbWBcdecdfbWBbXFcdgbWtbWsbWvbWubWKbWJbXmbXkbXobXnbXqbXpbXIbXHccsbXNcdtbYbccwcdwbOdcbAbTObTPcdycdxcdAcdzbMWcdBcdCbRIbVvbPjcdDcbHcbHbOhapQbzsbAwcfWcdGcdFcdIcdHbzscdJcdLcdKccMcdMccMbFrbHdcdNbhGcdObDbcfrcgicgicglcgkbMiccPcgnbDbaafaafaafaafbkycdQbNBblQcdRcdRbQZcdScdSccSbScbQZcmobtpcAKbtpbDhccUbXubkycdVbtpbtpbkybkybkyaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaccaccXccbaafccaccXccbaafccaccXccbaaaaafaafaafbCqbLvbCqbCqbCqcdWcdYcgFcpYbSsbCqaoVaoVaoVaoVapQaoVaoVapQaoVbESbVHbVIbWBceacdZceccebcedbWBcefceecehcegceibVJbYpbYnbYEbYqbYMbYGbZebYObZgbZfbZubZtbZAbZwceycexbOdcbAcezbOdbOdbOdcezcezcezbURceBceAapQbOhbOhbOhbOhbOhapQbzscaKcfXceEceDceGceFbzsbzsceIceHceJbLSceLceKbzsbzsbhGcdObDbchochqchqchschrchuchtcjBbDbaafaaaaaaaafbkybtpceMbrGceOceNbQZcePcePceQbScbQZbkybkyceSceRbDhccUbTrbtpbtpbtpceTblPceUblPaagaagaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafccaccXccbaaaccaccXccbaaaccaccXccbaafaafaaaaaaaafaafbCqceVbCqceWceYbCqbTzbCqbCqaoVapQaoVaoVapQaoVaoVapQaoVbESbVHbVIbVIbVIbVIbVIbVIbVIbVIbVJbVJbVJbVJbVJbVJbCqbZBbCqccwcfbcfbcfbcfcbZDbZCcfbbZEcfhcapccwbOdbQucficezbOdbOdbOdbOebULcezbURcezbLKapQapQapQapQapQapQapQcfjcfjchkcflcfkcfjcfjcfjcfmcfocfnceJcfpceJceJbzscfqcbKcdObDbbDbccQccQbDbbDbccQcknccQbDbaaaaaaaaaaaabkybkyccUcfsbkybkybQZbQZbQZcftcfubQZbDhbkycaebtpckSccUcbgbkybkycfvbkybkybkybkyaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaSaaSaafaaaccaccXccbaaaccaccXccbaaaccaccXccbaaaaafaaaaaacfxcfwcfwcfwcfwbCqbCqcqncqybCqbLvbLvbLvbLvbLvbLvbLvbLvbLvbCqcarcaqbTAcaxcazcaycaycaycaycaycaycaycaycaycaBcaBcaycaCceWccwcfFcfEcfHcgOcbqcbpcfbcbscfMctRccwcfNcfObRHcfQcfPcfRcfPcfQcfScfQcfTcezbLKbLKbLKaoVaoVapQapQcfjcfjciBchlcfZcfYcgbcgacfjcgcbAwcgdcgfcgecghcggbKTbKTcgjcnHbkyaaaaaaaaaaaaaaaaafcskaafaaaaaaaaaaaaaaabkyczGcgocgmcgmcgpcgrcgqcgtcgscgubkybkybkybkycbvbkyccUbTrbkycgybtpbtpbkyaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaafaaaaaaaaacgzaaaaaaaaacgzaaaaaaaaacgzaaaaaaaafcfxcfxcfxcgAcgCcgBcgEcgDbHEcAhcAicgGcgHcgHcgHcgHcgHcgHcgHcgHcgHcgHcgHcbwbEPcbxcbyccwccwccwccwccwccwccwccwccwccwccwccwccwccwccwcfbcgMcgOccjcclcckcgSccmccoccnccwcfNcgWcgVcgYcgXchacgZchbbOdchdchcchfchechgcheaoVaoVapQciCcfUcjpckhcizckicjrchnchmcfjbAwbAwceJceJcbKceJccMbAwbAwcbKczHbkybkybZibZibkybkybZiczQbZibkybkybZibZibZibkyczRczSbnschwchvchxchxchxchychAchzchCccpccqccqccqccrcctbkyccVbtpchHbkyaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafchJchIchIchKchLchLchLchLchLchLchLchLchLchLchLchMchOchNchOchPchRchQchScgHchUchTbQabCqbLvbLvbLvbLvbLvbLvbLvbLvbLvbCqbCqccucdicdhcdjccwchYchYchZccwcibciacidciccifciecihcigcijcdkcfbcikcimcdlcdmcinciqcdncdpcdoccwbLKcitbMQciubMQcivbMQciubMQciwbMQcixbLKbLKbLKapQapQapQbVucfjchhchjchicldckjciEciDcfjciFbAwccMccMciGceJccMbAwciHcbKczTbUwbUwbUwbUwbUwbUwbUwczUcANczVczVczVczVczVczXczWblObkyciKciJbkybkybZibZibkybkyciLcbfcdqbnscdscdrcdubkybkybkybkybkyaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaafaaaaaaaaaciPaaaaaaaaaciPaaaaaaaaaciPaaaaaaaafcfxcfxcfxciQciSciRcfwbHEbHEbHEbHEbCqaaaaaaaafaaaaaaaafaaaaaaaafaaabCqciTbCqciUcdvccwciXciWciZciYcjbcjacgRcgRcgRcdTcjecjdcjfcjacfbcjgcgOcdUciocjjcfbcejcelcekccwapQcphapQbVuapQcphapQbVuapQcpPapQcpPapQapQaoVaoVaoVapQbVucfjciyciAcizcjtcjscjvcjucjxcjwcjzcjyccMbLSccMcjAbFrbHdchpczYczYczYczYczYczYczYcAaczZczYczYczYczYczYczYcAccAbcAdbkycjCcbfbkyaaaaaaaaaaaabkybtpcbfcjEcjDcjDcjFcjGcjDaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaSaaSaafaaaccacjHccbaaaccacjHccbaaaccacjHccbaaaaafaaaaaacfxcfwcfwcfwcfwcjIbLubHEbHEbCqbCqbLvcAjcjJcjJcjJcjJcjJcjJaafbCqbCqbCqcjKcemccwcjMciZciZciYckHcgRcencjNcjPcnAcgRcgRcgRcgRcfbcjUceoceocjYcjXcfbcepcfMcsFccwbOhckbbQAckbbOhckbbQAckbbOhckcbQAckdbOhaoVaoVaoVaoVaoVbVuckfckecjrcjqcjrclecljclfcfjcklceJceJceJckmceJceJceJbzsbCqbCqbCqbLvbLvbLvbCqbCqbLvbLvbLvbCqbCqbLvbLvbLvbCqckobkybkyckpcbfbkybkybZibZibkybkybtpckqckrcjDcktcksckucjDaaaaaaaafaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafccacjHccbaaaccacjHccbaaaccacjHccbaafaafaafaaaaaaaaaaaaaagbCqbCqbCqckvbHEbCqckvbJfcjJckwckyckxckyckzcjJaaabCqbSsbHEckAcemccwckBckBckCccwckEckDckGcgRckFcnAckJckIckKckKcfbckLceqceqckPckOckRcesckTcetccwbOhckVckUckWbOhckYckXckZbOhclbclaclcbOhaoVaoVaoVaoVaoVbVucfjclgclhckgcsqclickkcsrcfjclkclmcllcloclncAeccMccMbAwclpbHEbLvaaaaaaaaaaafaaaaafaaaaafaaaaaaaaaaaaaaabkyclqbDhbkyclsclrcltcgrcltcltcltcltclvcluclwcjDclyclxclzcjDaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHraaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaccacjHccbaafccacjHccbaafccacjHccbaaaaafaafaafaaaaaaaaaaagclBclAclBbHEbHEbTzbHEccdcjJclCclEclDclGclFcjJaaabCqceYbHEckAcemccwckBckBckCccwclHcigclJceuceZcevclJcigclJclJcigclMcfaclQckHclPclRclNcgUcfdccwbOhclUclTclUbOhclWclVclWbOhclYclXclZbOhapQapQapQapQapQbVucfjcfjcfjcmbcmdcmccmfcmecmdclkcmgccMcmicmhcmjcdNccMcmkbCqbHEbLvaafaafaafaafaaaaafaaaaafaaaaaaaaaaaaaaabkycmqbtpbkycmrbntbntcmsbntbnsbnsbnscmtcmtcmucjDcmwcmvcmxcjDaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafccacjHccbaaaccacjHccbaaaccacjHccbaafaafaaaaafaafaaaaaaaagbCqbCqbCqbCqbHEbCqbCqbCqcjJcmycmAcmzcmBcmycjJaafbCqccwcmDcmCcfeccwckBckCckCccwcmGcmFcmIcffckFcfgcmLcmKcmLcmLcmNcfzcmQcmQcmRcmQcmQcfAcfCcfBccwbOhclUcmUclUbOhclWcmVclWbOhclZcmWclZbOhaoVaoVapQapQaoVcaJbUraoVaoVcpOcmdcmYcnacmZcmdbAwcnccnbcbQcndcnebFrcngcnfbCqclpbLvaaaaaaaaaaafaaabZibZibZibkybkybkybkybkybkyciIbtpbkybkybkybkybkybtpbkyaafaaaaaaaaaaafcnjcnjcnkcnjcnjaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaccacnlccbaaaccacnlccbaaaccacnlccbaaaaaSaaaaaaaafaafaaaaaaaaaaaaaaabLvbHEbLvaaaaaacjJcnmcnocnncnqcnpcjJcjJcjJccwcnrcmCcfDccwccwccwccwccwcntcfGcgRcgRckFcgUcgRcgRcnwcnvcnxcgRcgRcgRcgRcnycgRckFcnAcfIccwbOhbOhbOhbOhbOhbOhbOhbOhbOhbOhbOhbOhbOhaoVapQapQaoVaoVaoVbVuaoVaoVcpQcmdcmccnCcmecmdbzscnDbHdcnFcnEbHdcnGbzsbzsbCqaagaagaaaaaaaaaaafaaabZicmlcmmbkycmpcmocnibtpbYrcnJbtpcAKbtpbtpbtpbtpbtpbkyaafaaaaaaaaaaafaaacnjcnKcnjaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaafaaaaafaaaaafaaaaafaaaaafaaaaafaaaaaSaaaaaaaaaaafaafaaaaaaaaaaaabLvbHEbLvaaaaaacjJcnLcnNcnMcnPcnOcnRcnQcnScnRcnUcfJcgvcfLcnYcnXcoacnZcobcgwcgIcgxcgKcgJcsFccwcgLccwcgLccwcsFcgNcgRcgRcgPckFcnAcgQccwccwccwccwccwcigcigcigcigccwaafaafaafaafapQapQaoVaoVaoVaoVbVuaoVaoVcpQcmdcopcorcoqcosapQbzsceIcotbPnbPnbzsbzsaaaaafaaaaaaaaaaaaaaaaafaaabZicnhcnibYrbtpceRcnibkybkyckobkycnIcmocoubMBbNAbkybkyaafaaaaaaaaaaafaaacnjcnkcnjaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaSaaSaaSaaSabaaaSaaSaaSaaSaaSaaSaaSaaSaaSaaaaaaaaaaaaaafaafaaaaaaaafbLvbHEbLvaafaafcjJcovcoxcowcozcoycoBcoAcoCcgTchDchBchEcoHcoHcoHcoJcoHcoLcoKchFcoMcjSchGccwchVchXchWchXciiccwcilcgRcipcirckFciscjScjScjScoZcpaccwcpbcigcpccpdcpdcpeaaaaaaaaaaoVaoVaoVaoVaoVaoVbVuaoVaoVcpQcmdcmdciMcmdcmdaaaapQaaacscaoVaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaaabLvcAfcAgbCqbVLbtpcnicpgbkycskbkybkybkybZibZibkybkyaaaaafaaaaaaaaaaafaaaaaacpiaaaaaaaafaaaaafaaaaaaaafaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaabLvbHEbLvaaaaaacjJcpjcplcpkcpncpmcjJcpocppcjJcpqcpWciNcgRcgRcpsclJcptckHcpuciOcpvcpvcpvcpycpxcAOcpzcpCcpBcpycpDcpDcnxcencocciVcjNcjNcjPcgUcjccpIciZcpIcpJczMczLcpMczNaaaaaaaoVaoVaoVaoVaoVaoVbVuaoVaoVcpQbVwcmdcpNcmdczIapQapQaaacsmaoVaaaaaaaaaaaaaaaaafaafaaaaaaaaaaafaaabLvbLvbLvbCqbCqbkycnicmnbkycsyaafaaaaafaaaaaaaafaaaaaaaafaaaaaaaaaaafaaaaaacpiaaaaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbCqbCqcpRbCqbCqaaacjJcpScpUcpTcjJcjJcjJcjJcjJccwcpVcgRciNcgRcgRcpXclJcpZckHcqacqccqbcqecqdccwcqfcqhcqgcqjcqiccwcqkcqlcqlcqccqackHcqmcjhckFcgUcqoccwcqpcigcqqcpdcpdcqraaaaaaaaaaoVaoVaoVaoVcszaoVbVuaoVaoVczJbVwcqscqtcqsbVwapQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaafaaaaaaaaaaafaaaaaabZicqubZibZiaafaafaaaaafaaaaaaaafaaaaaSaaSaaSabaaafaafaafaafcpiaafaafaafaafaafabaaaSaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbCqciTbHEcqvbCqaafcjJcjJcjJcjJcjJaafaaaaaaaafccwcqwcgRcjicqxcqxcqzcigcigcqAccwcqCcqBcqBcqBccwcqDcqFcqEcqHcAPccwcqBcqBcqBcqCccwcqAcigcigckFcgUccwccwcigcigcigcigccwaafaafaafaafapQapQaoVaoVaoVaoVbVuaoVaoVapQbVwaaaaaaaaabVwapQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaafaaaaaaaaaaafaaaaaabZibtpbZiaaaaaaaaaaaaaafaaaaaaaafaaaaaSaaaaaaaafaaaaafaaaaaacqJaaaaaaaafaaaaafaaaaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLvcqKcAQcqLbCqaafaaaaaaaafaaaaaaaafaaaaaaaafccwcqOcqNckHcqPcqRcqQcigcqScqTccwcqVcqUcqWcqUcqYcqXcracqZcrbcqGcqYcqUcqUcqUcrcccwcrecrdccwckFcrwcjkcjlcjTcrhcqYaaaaaaaaaaaaaaaaaaaoVaoVaoVaoVaoVaoVbVuaoVaoVaoVbVwbVwbVwbVwbVwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaabZicribZiaaaaaaaaaaaaaafaaaaaaaafaaaaaSaafcrjcrjcrjcrjcrjaaacrkaaacrjcrjcrjcrjcrjaafaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLvcrlcrmbJebCqcigcrncrncrncrncrncrncrncrncigccwcrpcrocrrcrqcrpccwccwccwcqAccwccwcqYcqYcqYcqYcrscrIcrtcrucrvcqYcqYcqYcqYccwccwcqAccwccwcpEcjOcjmcjQcgRcrAcqYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaagaagaagaaaaaaaaaaaaaaaaaaaaaaafaaaaaSaaacrBcrCcrCcrCcrCcrDcrkcrFcrEcrEcrEcrEcrGaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLvbLvbLvbLvbCqaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwcrHcrJcrKaoVaaHcsPcqYcqYcqYcqYczEcqYcqYcqYcqYcsPaaHaoVczFcrMcrLccwcjRccwccwcjVcrPcrRcqYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaSacycrScrScrScrScrSaaacrkaaacrScrScrScrScrSaafaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwcrTcrUcrUaoVcAkcAlcAlcAlcAlcAlcAmcAlcAlcAlcAlcAlcAnaoVcrUcrVcrTccwcrWcrXccwcigcigcrYcigaafaafaafaafaafaafaafaafaafaafaafaafcswaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaaSaaaaaaaaaaafaaaaaaaaacrkaaaaaaaaaaafaaaaaaaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwcrZcsbcsaapQcAoaaHcsAaoVaoVaoVaoVcsAaoVaoVcsAaaHcAoaoVcsdcsfcseccwcsgcfKcigaafaaacsicshaafaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaacswaaaaaaaaacsDcsDcsDcsDcsDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafcrjcrjcrjcrjcrjaaacrkaaacrjcrjcrjcrjcrjaafaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwcrTcrUcsjaoVcApcAqaoVaoVaoVaoVaoVcsBaoVaoVaoVcAscAraoVcrUcrUcrTccwaagaagaagaafaaacsLcslcsocsncspcsncsocsncspcsncsocsncspcsncsMcsncsncsncsOcsNcsUcsTcsDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaacrBcrCcrCcrCcrCcrDcrkcrFcrEcrEcrEcrEcrGaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwcsscstcrUaoVcAoaaHaoVaoVapQapQapQapQapQaoVaoVaaHcAoaoVcrUcsvcsuccwaaaaaaaagaafaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaacswaagcsDcsDcsDcsVcsWcsVcsDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafcrScrScrScrScrSaaacrkaaacrScrScrScrScrSaafaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwccwcsxcrUaoVcAoaaHcsAapQapQcsHcsCcsIapQcsJaoVaaHcAoaoVcrUcsxccwccwaaaaaaaagaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafcswaagctacsXctactbctcctbcsDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaafaaaaaaaaacsEaaaaaaaaaaafaaaaaaaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcsFccwcsGcrUaoVcApcAqaoVaoVapQcsRcsQcAtapQaoVaoVcAscAraoVcrUcsKccwcsFaaaaaaaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagctdaagcsDctgcticthctcctjctiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafcrjcrjcrjcrjcrjaaacpiaaacrjcrjcrjcrjcrjaafaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwccwcsxcrUaoVcAoaaHaoVcsSapQctmctfczDapQapQcsAaaHcAoaoVcrUcsxccwccwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswaagcuacuacuacuactoctkctqctpaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaacrBcrCcrCcrCcrCcsZcsYcsZcrEcrEcrEcrEcrGaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwcsvcsucrUaoVcAoaaHaoVaoVapQapQapQapQapQaoVaoVaaHcAoaoVcrUcsscstccwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswaaaaaacuacuactrcttctscuacuacuacuacuaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafcrScrScrScrScrSaaacpiaaacrScrScrScrScrSaafaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwcrTcrUcteaoVcApcAqaoVaoVaoVapQaoVaoVaoVaoVaoVcAscAraoVcrUcrUcrTccwaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswaaaaaacuactwctuctyctxctActzctFctEcuaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaaaaafaaaaafaaaaaacpiaaaaaaaafaaaaafaaaaaaaaSaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaccwctlcsbcsaapQcAoaaHcsAaoVaoVcsAaoVaoVaoVaoVcsAaaHcAoaoVcsdcsfctnccwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswaaaaaacuactHctGctJctIcuyctKctMctLcuaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaSaaSaaSaaSaaSaafaafaaacpiaaaaafaafaaSaaSaaSabaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwctvcrUcrUaoVcAoaaHaaHcAuaaHaaHcAuaaHaaHcAuaaHaaHcAoaoVcrUcrUctvccwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafctOctNaafcuactQctPctTctSctVctUctXctWcuaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaafctBaafaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccwctvcrUctCaoVcAvcAlcAlcAwcAlcAlcAwcAlcAlcAwcAlcAlcAxaoVctDcrUctvccwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafctZctYctZctZcuccubcuecudcugcufcufcufcufaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaafaaaaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjZccwccwccwcrUapQapQapQapQaoVaoVaoVaoVaoVapQapQapQapQcrUccwccwccwcjZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactZctZcuhcuictZcujcujculcukcujcufcumcumcufcufaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaSaaSaaSaaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaactvccwccwcigcigcigcigcigcigcigcigcigcigcigcigcigccwccwctvaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactZcuocuncuqcupcujcurcuucuscujcuvcuwcuwcuxcufaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaactvctvctvctvctRctvctvctvctvctvctvctvctRctvctvctvctvaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactZcuAcuzcuCcuBcuEcuDcuGcuFcuEcuHcuJcuIcuKcufaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaafaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactZcuMcuLcuOcuNcuQcuPcuScuRcuUcuTcuWcuVcuXcufaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactZctZcuYcuzcuZcujcvccvecvdcujcvgcvicvhcufcufaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcvkcvjcvmcvjcvkcvkcvocvncvkcvjcvqcvjcvkaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacutaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacvkcvscvtcvjcvwcvucvzcvycvwcvjcvCcvBcvkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcvkcvDcvtcvjcvwcvucvzcvycvwcvjcvCcvEcvkaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacvFcvkcvkcvtcvjcvGcvucvIcvHcvJcvjcvCcvkcvkcvKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcvkcvLcvjcvMcvucvzcvycvwcvjcvNcvkaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcvkcvQcvPcvScvRcvTcvycvVcvUcvWcvkaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcvkcvXcvjcvZcvYcvzcvycwacvjcvXcvkaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcvkcvXcvjcvGcwbcwccvycvJcvjcvXcvkaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcvkcvkcvXcvjcvwcvucvzcvycvwcvjcvXcvkcvkaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcvkcvXcvXcvjcvwcvucwdcvycvwcvjcvXcvXcvkaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacvkcvXcvacvacvfcvacwfcwecvbcvacvacvXcvkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacvkcvXcvacvacwhcwgcwjcwicwkcvacvacvXcvkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacvkcvXcvacvacwmcwlcwocwncwpcvacvacvXcvkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacvkcwqcvacvacwrcwrcwtcwscwrcvacvacwqcvkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacvOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacvkcwqcvacvpcvpcvlcwucwncvpcvpcvacwqcvkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacvacvacvacwvcwxcwwcwAcwzcwCcwBcvacvacvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacvacvacvacvpcwjcwDcARcwEcwncvpcvacvacvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcvacvacvacvrcwucvvcAScvvcATcvrcvacvacvaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAUcvacvacvxcvlcAVcvvcvvcvvcAWcvlcvAcvacvacAXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacwyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcvacvacvacvrcAZcAYcBacvvcvlcvrcvacvacvaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacvacvacvacwvcvlcBbcBccvpcvlcwBcvacvacvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacvacvacvacvpcvlcBdcBecvlcvlcvpcvacvacvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacvacvacvacvacvacvacvacvacvacvacvacvacvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacvacvacvacvacvacvacvacvacvacvacvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcvacvacvacvacvacvacvacvacvaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaacBfaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/cfg/admin.txt b/cfg/admin.txt index 1f4c89d373b..fa0b92dbdad 100644 --- a/cfg/admin.txt +++ b/cfg/admin.txt @@ -12,4 +12,4 @@ cheridan giacomand rockdtben MrStonedOne -Jordie0608 +Jordie0608 \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index 207c7d435cb..e54ac17b67b 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -97,10 +97,11 @@ Passive gate is similar to the regular pump except: if(stat & (BROKEN|NOPOWER)) return ui_interact(user) -/obj/machinery/atmospherics/components/binary/passive_gate/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/atmospherics/components/binary/passive_gate/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ + datum/tgui/master_ui = null, datum/ui_state/state = default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) - ui = new(user, src, ui_key, "atmos_pump", name, 335, 115) + ui = new(user, src, ui_key, "atmos_pump", name, 335, 115, master_ui, state) ui.open() /obj/machinery/atmospherics/components/binary/passive_gate/get_ui_data() diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index 90d7fff5d92..e29156be018 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -105,10 +105,11 @@ Thus, the two variables affect pump operation are set in New(): return ui_interact(user) -/obj/machinery/atmospherics/components/binary/pump/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/atmospherics/components/binary/pump/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ + datum/tgui/master_ui = null, datum/ui_state/state = default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) - ui = new(user, src, ui_key, "atmos_pump", name, 335, 115) + ui = new(user, src, ui_key, "atmos_pump", name, 335, 115, master_ui, state) ui.open() /obj/machinery/atmospherics/components/binary/pump/get_ui_data() diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm index 0d5dfd6d139..aa55bc1ce68 100644 --- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm @@ -102,10 +102,11 @@ Thus, the two variables affect pump operation are set in New(): return ui_interact(user) -/obj/machinery/atmospherics/components/binary/volume_pump/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/atmospherics/components/binary/volume_pump/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ + datum/tgui/master_ui = null, datum/ui_state/state = default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) - ui = new(user, src, ui_key, "atmos_pump", name, 310, 115) + ui = new(user, src, ui_key, "atmos_pump", name, 310, 115, master_ui, state) ui.open() /obj/machinery/atmospherics/components/binary/volume_pump/get_ui_data() diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index 3dc9e505af0..6b55e9f8484 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -145,10 +145,11 @@ Filter types: return ui_interact(user) -/obj/machinery/atmospherics/components/trinary/filter/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/atmospherics/components/trinary/filter/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ + datum/tgui/master_ui = null, datum/ui_state/state = default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) - ui = new(user, src, ui_key, "atmos_filter", name, 430, 140) + ui = new(user, src, ui_key, "atmos_filter", name, 430, 140, master_ui, state) ui.open() /obj/machinery/atmospherics/components/trinary/filter/get_ui_data() diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm index d20cd9c2109..5e416123295 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm @@ -129,10 +129,11 @@ return ui_interact(user) -/obj/machinery/atmospherics/components/trinary/mixer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/atmospherics/components/trinary/mixer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ + datum/tgui/master_ui = null, datum/ui_state/state = default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) - ui = new(user, src, ui_key, "atmos_mixer", name, 330, 165) + ui = new(user, src, ui_key, "atmos_mixer", name, 330, 165, master_ui, state) ui.open() /obj/machinery/atmospherics/components/trinary/mixer/get_ui_data() diff --git a/code/ATMOSPHERICS/components/unary_devices/cryo.dm b/code/ATMOSPHERICS/components/unary_devices/cryo.dm index a9a516b55c5..4bb78933cc6 100644 --- a/code/ATMOSPHERICS/components/unary_devices/cryo.dm +++ b/code/ATMOSPHERICS/components/unary_devices/cryo.dm @@ -110,10 +110,11 @@ return ui_interact(user) -/obj/machinery/atmospherics/components/unary/cryo_cell/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/atmospherics/components/unary/cryo_cell/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ + datum/tgui/master_ui = null, datum/ui_state/state = notcontained_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) - ui = new(user, src, ui_key, "cryo", name, 400, 550, state = notcontained_state) + ui = new(user, src, ui_key, "cryo", name, 400, 550, master_ui, state) ui.open() /obj/machinery/atmospherics/components/unary/cryo_cell/get_ui_data() diff --git a/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm b/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm index d9e649c7a13..e4b9622b481 100644 --- a/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm +++ b/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm @@ -8,6 +8,12 @@ use_power = 0 level = 0 +/obj/machinery/atmospherics/components/unary/portables_connector/New() + ..() + var/datum/gas_mixture/air_contents = AIR1 + + air_contents.volume = 0 + /obj/machinery/atmospherics/components/unary/portables_connector/visible level = 2 diff --git a/code/ATMOSPHERICS/gas_types.dm b/code/ATMOSPHERICS/gas_types.dm index 2e89fab6e05..5679b3d5f88 100644 --- a/code/ATMOSPHERICS/gas_types.dm +++ b/code/ATMOSPHERICS/gas_types.dm @@ -74,6 +74,7 @@ var/list/hardcoded_gases = list("o2","n2","co2","plasma") //the main four gases, icon = 'icons/effects/tile_effects.dmi' mouse_opacity = 0 layer = 5 + appearance_flags = RESET_COLOR /obj/effect/overlay/gas/New(state) . = ..() diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm index dc04e6198e0..d11b2ab02ac 100644 --- a/code/LINDA/LINDA_turf_tile.dm +++ b/code/LINDA/LINDA_turf_tile.dm @@ -268,12 +268,16 @@ /atom/movable/var/pressure_resistance = 5 - +/atom/movable/var/last_high_pressure_movement_air_cycle = 0 /atom/movable/proc/experience_pressure_difference(pressure_difference, direction) + set waitfor = 0 + . = 0 if(!anchored && !pulledby) - if(pressure_difference > pressure_resistance) - spawn step(src, direction) - return 1 + . = 1 + if(pressure_difference > pressure_resistance && last_high_pressure_movement_air_cycle < SSair.times_fired) + last_high_pressure_movement_air_cycle = SSair.times_fired + step(src, direction) + @@ -432,4 +436,4 @@ var/heat = thermal_conductivity*delta_temperature* \ (heat_capacity*700000/(heat_capacity+700000)) //700000 is the heat_capacity from a space turf, hardcoded here - temperature -= heat/heat_capacity \ No newline at end of file + temperature -= heat/heat_capacity diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 779a26df97f..a25c92581e7 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -156,3 +156,8 @@ #define PARENT2 parents[2] #define PARENT3 parents[3] #define PARENT_I parents[I] + +//Tanks +#define TANK_MAX_RELEASE_PRESSURE (ONE_ATMOSPHERE*3) +#define TANK_MIN_RELEASE_PRESSURE 0 +#define TANK_DEFAULT_RELEASE_PRESSURE 16 diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 0116232841a..7959272566d 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -127,15 +127,21 @@ Proc for attack log creation, because really why not /proc/add_logs(mob/user, mob/target, what_done, object=null, addition=null) var/newhealthtxt = "" + var/coordinates = "" var/turf/attack_location = get_turf(target) - var/coordinates = "([attack_location.x],[attack_location.y],[attack_location.z])" - if (target && isliving(target)) + if(attack_location) + coordinates = "([attack_location.x],[attack_location.y],[attack_location.z])" + if(target && isliving(target)) var/mob/living/L = target newhealthtxt = " (NEWHP: [L.health])" if(user && ismob(user)) user.attack_log += text("\[[time_stamp()]\] Has [what_done] [target ? "[target.name][(ismob(target) && target.ckey) ? "([target.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition][newhealthtxt][coordinates]") + if(user.mind) + user.mind.attack_log += text("\[[time_stamp()]\] [user ? "[user.name][(ismob(user) && user.ckey) ? "([user.ckey])" : ""]" : "NON-EXISTANT SUBJECT"] has [what_done] [target ? "[target.name][(ismob(target) && target.ckey) ? "([target.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition][newhealthtxt][coordinates]") if(target && ismob(target)) target.attack_log += text("\[[time_stamp()]\] Has been [what_done] by [user ? "[user.name][(ismob(user) && user.ckey) ? "([user.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition][newhealthtxt][coordinates]") + if(target.mind) + target.mind.attack_log += text("\[[time_stamp()]\] [target ? "[target.name][(ismob(target) && target.ckey) ? "([target.ckey])" : ""]" : "NON-EXISTANT SUBJECT"] has been [what_done] by [user ? "[user.name][(ismob(user) && user.ckey) ? "([user.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition][newhealthtxt][coordinates]") log_attack("[user ? "[user.name][(ismob(user) && user.ckey) ? "([user.ckey])" : ""]" : "NON-EXISTANT SUBJECT"] [what_done] [target ? "[target.name][(ismob(target) && target.ckey)? "([target.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition][newhealthtxt][coordinates]") @@ -144,10 +150,10 @@ Proc for attack log creation, because really why not if(!user || !target) return 0 var/user_loc = user.loc - + var/drifting = 0 if(!user.Process_Spacemove(0) && user.inertia_dir) - drifting = 1 + drifting = 1 var/target_loc = target.loc @@ -168,11 +174,11 @@ Proc for attack log creation, because really why not break if(uninterruptible) continue - + if(drifting && !user.inertia_dir) drifting = 0 user_loc = user.loc - + if((!drifting && user.loc != user_loc) || target.loc != target_loc || user.get_active_hand() != holding || user.incapacitated() || user.lying ) . = 0 break @@ -188,11 +194,11 @@ Proc for attack log creation, because really why not Tloc = target.loc var/atom/Uloc = user.loc - + var/drifting = 0 if(!user.Process_Spacemove(0) && user.inertia_dir) - drifting = 1 - + drifting = 1 + var/holding = user.get_active_hand() var/holdingnull = 1 //User's hand started out empty, check for an empty hand @@ -210,11 +216,11 @@ Proc for attack log creation, because really why not sleep(1) if (progress) progbar.update(world.time - starttime) - + if(drifting && !user.inertia_dir) drifting = 0 Uloc = user.loc - + if(!user || user.stat || user.weakened || user.stunned || (!drifting && user.loc != Uloc)) . = 0 break diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 75afaff8d07..a9c35aee9b4 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -304,6 +304,8 @@ switch(ui_style) if("Retro") return 'icons/mob/screen_retro.dmi' if("Plasmafire") return 'icons/mob/screen_plasmafire.dmi' + if("Slimecore") return 'icons/mob/screen_slimecore.dmi' + if("Operative") return 'icons/mob/screen_operative.dmi' else return 'icons/mob/screen_midnight.dmi' //colour formats diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index ff4c04b429e..fef8563b618 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -620,15 +620,16 @@ Turf and target are seperate in case you want to teleport some distance from a t /proc/can_see(atom/source, atom/target, length=5) // I couldnt be arsed to do actual raycasting :I This is horribly inaccurate. var/turf/current = get_turf(source) var/turf/target_turf = get_turf(target) - var/steps = 0 - - while(current != target_turf) - if(steps > length) return 0 - if(current.opacity) return 0 - for(var/atom/A in current) - if(A.opacity) return 0 + var/steps = 1 + if(current != target_turf) current = get_step_towards(current, target_turf) - steps++ + while(current != target_turf) + if(steps > length) return 0 + if(current.opacity) return 0 + for(var/atom/A in current) + if(A.opacity) return 0 + current = get_step_towards(current, target_turf) + steps++ return 1 @@ -674,9 +675,10 @@ Turf and target are seperate in case you want to teleport some distance from a t if(A.vars.Find(lowertext(varname))) return 1 else return 0 -//Returns sortedAreas list if populated -//else populates the list first before returning it +//Repopulates sortedAreas list /proc/SortAreas() + sortedAreas = list() + for(var/area/A in world) sortedAreas.Add(A) @@ -1227,10 +1229,10 @@ B --><-- A return L -/atom/proc/contains(var/atom/location) - if(!location) + +/atom/proc/contains(var/atom/A) + if(!A) return 0 - for(location, location && location != src, location=location.loc); //semicolon is for the empty statement + for(var/atom/location = A.loc, location, location = location.loc) if(location == src) return 1 - return 0 diff --git a/code/_globalvars/station.dm b/code/_globalvars/station.dm index e8512549c1c..0385439f831 100644 --- a/code/_globalvars/station.dm +++ b/code/_globalvars/station.dm @@ -7,8 +7,4 @@ var/CHARGELEVEL = 0.001 // Cap for how fast cells charge, as a percentage-per-ti var/list/powernets = list() -// this is not strictly unused although the whole modules datum thing is unused -// To remove this you need to remove that -var/datum/moduletypes/mods = new() - var/map_name = "Unknown" //The name of the map that is loaded. Assigned in world/New() \ No newline at end of file diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index 07f15152850..94b3efb66c5 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -81,9 +81,10 @@ action_intent = using if(istype(mymob, /mob/living/carbon/alien/humanoid/hunter)) - mymob.leap_icon = new /obj/screen/alien/leap() - mymob.leap_icon.screen_loc = ui_alien_storage_r - adding += mymob.leap_icon + var/mob/living/carbon/alien/humanoid/hunter/H = mymob + H.leap_icon = new /obj/screen/alien/leap() + H.leap_icon.screen_loc = ui_alien_storage_r + adding += H.leap_icon using = new /obj/screen/drop() using.icon = 'icons/mob/screen_alien.dmi' diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 1632b5f318f..db25833d75f 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -149,7 +149,7 @@ var/global/datum/controller/master/Master = new() // If we caused BYOND to miss a tick, stop processing for a bit... if(startingtick < world.time || start_time + 1 < world.timeofday) break - sleep(-1) + sleep(0) cost = MC_AVERAGE(cost, world.timeofday - start_time) if(ran_subsystems) diff --git a/code/controllers/subsystem/shuttles/emergency.dm b/code/controllers/subsystem/shuttles/emergency.dm index 09cddb6daef..2c9b47983f7 100644 --- a/code/controllers/subsystem/shuttles/emergency.dm +++ b/code/controllers/subsystem/shuttles/emergency.dm @@ -1,3 +1,7 @@ +#define UNLAUNCHED 0 +#define ENDGAME_LAUNCHED 1 +#define EARLY_LAUNCHED 2 + /obj/docking_port/mobile/emergency name = "emergency shuttle" id = "emergency" @@ -116,7 +120,8 @@ if(time_left <= 0 && !SSshuttle.emergencyNoEscape) //move each escape pod to its corresponding transit dock for(var/obj/docking_port/mobile/pod/M in SSshuttle.mobile) - if(M.z == ZLEVEL_STATION) //Will not launch from the mine/planet(for some reason) + if(M.launch_status == UNLAUNCHED) //Will not launch from the mine/planet + M.launch_status = ENDGAME_LAUNCHED M.enterTransit() //now move the actual emergency shuttle to its transit dock for(var/area/shuttle/escape/E in world) @@ -129,7 +134,8 @@ if(time_left <= 0) //move each escape pod to its corresponding escape dock for(var/obj/docking_port/mobile/pod/M in SSshuttle.mobile) - M.dock(SSshuttle.getDock("[M.id]_away")) + if(M.launch_status == ENDGAME_LAUNCHED) + M.dock(SSshuttle.getDock("[M.id]_away")) //now move the actual emergency shuttle to centcomm for(var/area/shuttle/escape/E in world) E << 'sound/effects/hyperspace_end.ogg' @@ -151,9 +157,11 @@ dwidth = 1 width = 3 height = 4 + var/launch_status = UNLAUNCHED /obj/docking_port/mobile/pod/request() - if(security_level == SEC_LEVEL_RED || security_level == SEC_LEVEL_DELTA && z == ZLEVEL_STATION) + if((security_level == SEC_LEVEL_RED || security_level == SEC_LEVEL_DELTA) && launch_status == UNLAUNCHED) + launch_status = EARLY_LAUNCHED return ..() /obj/docking_port/mobile/pod/New() @@ -241,3 +249,9 @@ /obj/item/weapon/storage/pod/attack_hand(mob/user) return + + + +#undef UNLAUNCHED +#undef LAUNCHED +#undef EARLY_LAUNCHED diff --git a/code/controllers/subsystem/shuttles/supply.dm b/code/controllers/subsystem/shuttles/supply.dm index 8c76c882de6..d3c96f216d2 100644 --- a/code/controllers/subsystem/shuttles/supply.dm +++ b/code/controllers/subsystem/shuttles/supply.dm @@ -211,6 +211,7 @@ var/list/blacklist = list( /mob/living, /obj/effect/blob, + /obj/effect/rune, /obj/effect/spider/spiderling, /obj/item/weapon/disk/nuclear, /obj/machinery/nuclearbomb, diff --git a/code/controllers/subsystem/tgui.dm b/code/controllers/subsystem/tgui.dm index e9aca112ca8..22604f811db 100644 --- a/code/controllers/subsystem/tgui.dm +++ b/code/controllers/subsystem/tgui.dm @@ -9,19 +9,19 @@ var/datum/subsystem/tgui/SStgui can_fire = 1 // This needs to fire before round start. var/list/open_uis = list() // A list of open UIs, grouped by src_object and ui_key. - var/list/processing_uis = list() // A list of processing UIs, not grouped. - var/html // The HTML template used by new UIs; minus initial data. + var/list/processing_uis = list() // A list of processing UIs, ungrouped. + var/basehtml // The HTML base used for all UIs. /datum/subsystem/tgui/New() - html = file2text('tgui/tgui.html') // Read the HTML from disk. + basehtml = file2text('tgui/tgui.html') // Read the HTML from disk. NEW_SS_GLOBAL(SStgui) /datum/subsystem/tgui/stat_entry() - ..("O:[open_uis.len]|P:[processing_uis.len]") // Show how many interfaces we have open/are processing. + ..("P:[processing_uis.len]") -/datum/subsystem/tgui/fire() // Process UIs. +/datum/subsystem/tgui/fire() for(var/thing in processing_uis) var/datum/tgui/ui = thing if(ui && ui.user && ui.src_object) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 6951d554dec..56cdf29535f 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -485,5 +485,5 @@ var/datum/subsystem/ticker/ticker //map rotate chance defaults to 75% of the length of the round (in minutes) if (!prob((world.time/600)*config.maprotatechancedelta)) return - spawn(-1) //compiling a map can lock up the mc for 30 to 60 seconds if we don't spawn + spawn(0) //compiling a map can lock up the mc for 30 to 60 seconds if we don't spawn maprotate() diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 15c92b07b88..461169cf4b4 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -26,10 +26,13 @@ var/datum/subsystem/timer/SStimer if (!event.thingToCall || qdeleted(event.thingToCall)) qdel(event) if (event.timeToRun <= world.time) - spawn(-1) - call(event.thingToCall, event.procToCall)(arglist(event.argList)) + runevent(event) qdel(event) +/datum/subsystem/timer/proc/runevent(datum/timedevent/event) + set waitfor = 0 + call(event.thingToCall, event.procToCall)(arglist(event.argList)) + /datum/timedevent var/thingToCall var/procToCall diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 413764f7345..3f582156347 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -348,7 +348,7 @@ body html += "[name] = null" else if (istext(value)) - html += "[name] = \"[value]\"" + html += "[name] = \"[html_encode(value)]\"" else if (isicon(value)) #ifdef VARSICON @@ -405,7 +405,7 @@ body html += "" else - html += "[name] = [value]" + html += "[name] = [html_encode(value)]" html += "" diff --git a/code/datums/gas_mixture.dm b/code/datums/gas_mixture.dm index c352b6754fe..a95d2a84f1c 100644 --- a/code/datums/gas_mixture.dm +++ b/code/datums/gas_mixture.dm @@ -141,6 +141,7 @@ var/list/cached_gases_list = null garbage_collect() reacting = 1 + /* if(thermal_energy() > (PLASMA_BINDING_ENERGY*10)) if(procgases["plasma"] && procgases["co2"] && procgases["plasma"][MOLES] > MINIMUM_HEAT_CAPACITY && procgases["co2"][MOLES] > MINIMUM_HEAT_CAPACITY && (procgases["plasma"][MOLES]+procgases["co2"][MOLES])/total_moles() >= FUSION_PURITY_THRESHOLD)//Fusion wont occur if the level of impurities is too high. //world << "pre [temperature, [procgases["plasma"][MOLES]], [procgases["co2"][MOLES]] @@ -172,6 +173,7 @@ var/list/cached_gases_list = null temperature = max(((temperature*old_heat_capacity + reaction_energy)/new_heat_capacity),TCMB) //Prevents whatever mechanism is causing it to hit negative temperatures. //world << "post [temperature], [procgases["plasma"][MOLES]], [procgases["co2"][MOLES]] + */ fuel_burnt = 0 if(temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) diff --git a/code/datums/helper_datums/events.dm b/code/datums/helper_datums/events.dm index f5e60ee7b0c..fa0dccd2a15 100644 --- a/code/datums/helper_datums/events.dm +++ b/code/datums/helper_datums/events.dm @@ -34,7 +34,7 @@ //world << "Events in [args[1]] called" var/list/event = listgetindex(events,args[1]) if(istype(event)) - spawn(-1) + spawn(0) for(var/datum/event/E in event) if(!E.Fire(arglist(args.Copy(2)))) clearEvent(args[1],E) diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 6c22a9c08db..ef73781c1e6 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -82,12 +82,12 @@ /datum/teleport/proc/playSpecials(atom/location,datum/effect_system/effect,sound) if(location) if(effect) - spawn(-1) + spawn(0) src = null effect.attach(location) effect.start() if(sound) - spawn(-1) + spawn(0) src = null playsound(location,sound,60,1) return diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 1ee1a3d01ea..22b7df55380 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1,1579 +1,1687 @@ -/* Note from Carnie: - The way datum/mind stuff works has been changed a lot. - Minds now represent IC characters rather than following a client around constantly. - - Guidelines for using minds properly: - - - Never mind.transfer_to(ghost). The var/current and var/original of a mind must always be of type mob/living! - ghost.mind is however used as a reference to the ghost's corpse - - - When creating a new mob for an existing IC character (e.g. cloning a dead guy or borging a brain of a human) - the existing mind of the old mob should be transfered to the new mob like so: - - mind.transfer_to(new_mob) - - - You must not assign key= or ckey= after transfer_to() since the transfer_to transfers the client for you. - By setting key or ckey explicitly after transfering the mind with transfer_to you will cause bugs like DCing - the player. - - - IMPORTANT NOTE 2, if you want a player to become a ghost, use mob.ghostize() It does all the hard work for you. - - - When creating a new mob which will be a new IC character (e.g. putting a shade in a construct or randomly selecting - a ghost to become a xeno during an event). Simply assign the key or ckey like you've always done. - - new_mob.key = key - - The Login proc will handle making a new mob for that mobtype (including setting up stuff like mind.name). Simple! - However if you want that mind to have any special properties like being a traitor etc you will have to do that - yourself. - -*/ - -/datum/mind - var/key - var/name //replaces mob/var/original_name - var/mob/living/current - var/active = 0 - - var/memory - - var/assigned_role - var/special_role - var/list/restricted_roles = list() - - var/datum/job/assigned_job - - var/list/datum/objective/objectives = list() - var/list/datum/objective/special_verbs = list() - - var/list/spell_list = list() // Wizard mode & "Give Spell" badmin button. - - var/datum/faction/faction //associated faction - var/datum/changeling/changeling //changeling holder - - var/miming = 0 // Mime's vow of silence - var/antag_hud_icon_state = null //this mind's ANTAG_HUD should have this icon_state - var/datum/atom_hud/antag/antag_hud = null //this mind's antag HUD - var/datum/gang/gang_datum //Which gang this mind belongs to, if any - -/datum/mind/New(var/key) - src.key = key - - -/datum/mind/proc/transfer_to(mob/new_character) - if(current) // remove ourself from our old body's mind variable - current.mind = null - SStgui.on_transfer(current, new_character) - - if(key) - if(new_character.key != key) //if we're transfering into a body with a key associated which is not ours - new_character.ghostize(1) //we'll need to ghostize so that key isn't mobless. - else - key = new_character.key - - if(new_character.mind) //disassociate any mind currently in our new body's mind variable - new_character.mind.current = null - - var/datum/atom_hud/antag/hud_to_transfer = antag_hud//we need this because leave_hud() will clear this list - leave_all_huds() //leave all the huds in the old body, so it won't get huds if somebody else enters it - current = new_character //associate ourself with our new body - new_character.mind = src //and associate our new body with ourself - transfer_antag_huds(hud_to_transfer) //inherit the antag HUD - transfer_actions(new_character) - - if(active) - new_character.key = key //now transfer the key to link the client to our new body - -/datum/mind/proc/store_memory(new_text) - memory += "[new_text]
" - -/datum/mind/proc/wipe_memory() - memory = null - - -/* - Removes antag type's references from a mind. - objectives, uplinks, powers etc are all handled. -*/ - -/datum/mind/proc/remove_objectives() - if(objectives.len) - for(var/datum/objective/O in objectives) - objectives -= O - qdel(O) - -/datum/mind/proc/remove_changeling() - if(src in ticker.mode.changelings) - ticker.mode.changelings -= src - current.remove_changeling_powers() - if(changeling) - qdel(changeling) - changeling = null - special_role = null - remove_antag_equip() - -/datum/mind/proc/remove_traitor() - if(src in ticker.mode.traitors) - ticker.mode.traitors -= src - if(isAI(current)) - var/mob/living/silicon/ai/A = current - A.set_zeroth_law("") - A.show_laws() - A.verbs -= /mob/living/silicon/ai/proc/choose_modules - A.malf_picker.remove_verbs(A) - qdel(A.malf_picker) - special_role = null - remove_antag_equip() - -/datum/mind/proc/remove_nukeop() - if(src in ticker.mode.syndicates) - ticker.mode.syndicates -= src - ticker.mode.update_synd_icons_removed(src) - special_role = null - remove_objectives() - remove_antag_equip() - -/datum/mind/proc/remove_wizard() - if(src in ticker.mode.wizards) - ticker.mode.wizards -= src - current.spellremove(current) - special_role = null - remove_antag_equip() - -/datum/mind/proc/remove_cultist() - if(src in ticker.mode.cult) - ticker.mode.cult -= src - ticker.mode.update_cult_icons_removed(src) - special_role = null - -/datum/mind/proc/remove_rev() - if(src in ticker.mode.revolutionaries) - ticker.mode.revolutionaries -= src - ticker.mode.update_rev_icons_removed(src) - if(src in ticker.mode.head_revolutionaries) - ticker.mode.head_revolutionaries -= src - ticker.mode.update_rev_icons_removed(src) - special_role = null - remove_objectives() - remove_antag_equip() - - -/datum/mind/proc/remove_gang() - ticker.mode.remove_gangster(src,0,1,1) - remove_objectives() - -/datum/mind/proc/remove_hog_follower_prophet() - ticker.mode.red_deity_followers -= src - ticker.mode.red_deity_prophets -= src - ticker.mode.blue_deity_prophets -= src - ticker.mode.blue_deity_followers -= src - ticker.mode.update_hog_icons_removed(src, "red") - ticker.mode.update_hog_icons_removed(src, "blue") - - - -/datum/mind/proc/remove_antag_equip() - var/list/Mob_Contents = current.get_contents() - for(var/obj/item/I in Mob_Contents) - if(istype(I, /obj/item/device/pda)) - var/obj/item/device/pda/P = I - P.lock_code = "" - - else if(istype(I, /obj/item/device/radio)) - var/obj/item/device/radio/R = I - R.traitor_frequency = 0 - -/datum/mind/proc/remove_all_antag() //For the Lazy amongst us. - remove_changeling() - remove_traitor() - remove_nukeop() - remove_wizard() - remove_cultist() - remove_rev() - remove_gang() - -/datum/mind/proc/show_memory(mob/recipient, window=1) - if(!recipient) - recipient = current - var/output = "[current.real_name]'s Memories:
" - output += memory - - if(objectives.len) - output += "Objectives:" - var/obj_count = 1 - for(var/datum/objective/objective in objectives) - output += "
Objective #[obj_count++]: [objective.explanation_text]" - - if(window) recipient << browse(output,"window=memory") - else recipient << "[output]" - -/datum/mind/proc/edit_memory() - if(!ticker || !ticker.mode) - alert("Not before round-start!", "Alert") - return - - var/out = "[name][(current&&(current.real_name!=name))?" (as [current.real_name])":""]
" - out += "Mind currently owned by key: [key] [active?"(synced)":"(not synced)"]
" - out += "Assigned role: [assigned_role]. Edit
" - out += "Faction and special role: [special_role]
" - - var/list/sections = list( - "revolution", - "gang", - "cult", - "wizard", - "changeling", - "nuclear", - "traitor", // "traitorchan", - "monkey", - ) - var/text = "" - - if (istype(current, /mob/living/carbon/human) || istype(current, /mob/living/carbon/monkey)) - /** REVOLUTION ***/ - text = "revolution" - if (ticker.mode.config_tag=="revolution") - text = uppertext(text) - text = "[text]: " - if (assigned_role in command_positions) - text += "HEAD|loyal|employee|headrev|rev" - else if (src in ticker.mode.head_revolutionaries) - text += "head|loyal|employee|HEADREV|rev" - text += "
Flash: give" - - var/list/L = current.get_contents() - var/obj/item/device/assembly/flash/flash = locate() in L - if (flash) - if(!flash.crit_fail) - text += "|take." - else - text += "|take|repair." - else - text += "." - - text += " Reequip (gives traitor uplink)." - if (objectives.len==0) - text += "
Objectives are empty! Set to kill all heads." - else if(isloyal(current)) - text += "head|LOYAL|employee|headrev|rev" - else if (src in ticker.mode.revolutionaries) - text += "head|loyal|employee|headrev|REV" - else - text += "head|loyal|EMPLOYEE|headrev|rev" - - if(current && current.client && (ROLE_REV in current.client.prefs.be_special)) - text += "|Enabled in Prefs" - else - text += "|Disabled in Prefs" - - sections["revolution"] = text - - /** GANG ***/ - text = "gang" - if (ticker.mode.config_tag=="gang") - text = uppertext(text) - text = "[text]: " - text += "[isloyal(current) ? "LOYAL" : "loyal"]|" - if(src in ticker.mode.get_all_gangsters()) - text += "none" - else - text += "NONE" - - if(current && current.client && (ROLE_GANG in current.client.prefs.be_special)) - text += "|Enabled in Prefs
" - else - text += "|Disabled in Prefs
" - - for(var/datum/gang/G in ticker.mode.gangs) - text += "[G.name]: " - if(src in (G.gangsters)) - text += "GANGSTER" - else - text += "gangster" - text += "|" - if(src in (G.bosses)) - text += "GANG LEADER" - text += "|Equipment: give" - var/list/L = current.get_contents() - var/obj/item/device/gangtool/gangtool = locate() in L - if (gangtool) - text += "|take" - - else - text += "gang leader" - text += "
" - - if(gang_colors_pool.len) - text += "Create New Gang" - - sections["gang"] = text - - - /** CULT ***/ - text = "cult" - if (ticker.mode.config_tag=="cult") - text = uppertext(text) - text = "[text]: " - if (src in ticker.mode.cult) - text += "loyal|employee|CULTIST" - text += "
Equip" - - else if(isloyal(current)) - text += "LOYAL|employee|cultist" - else - text += "loyal|EMPLOYEE|cultist" - - if(current && current.client && (ROLE_CULTIST in current.client.prefs.be_special)) - text += "|Enabled in Prefs" - else - text += "|Disabled in Prefs" - - sections["cult"] = text - - /** WIZARD ***/ - text = "wizard" - if (ticker.mode.config_tag=="wizard") - text = uppertext(text) - text = "[text]: " - if ((src in ticker.mode.wizards) || (src in ticker.mode.apprentices)) - text += "YES|no" - text += "
To lair, undress, dress up, let choose name." - if (objectives.len==0) - text += "
Objectives are empty! Randomize!" - else - text += "yes|NO" - - if(current && current.client && (ROLE_WIZARD in current.client.prefs.be_special)) - text += "|Enabled in Prefs" - else - text += "|Disabled in Prefs" - - sections["wizard"] = text - - /** CHANGELING ***/ - text = "changeling" - if (ticker.mode.config_tag=="changeling" || ticker.mode.config_tag=="traitorchan") - text = uppertext(text) - text = "[text]: " - if ((src in ticker.mode.changelings) && special_role) - text += "YES|no" - if (objectives.len==0) - text += "
Objectives are empty! Randomize!" - if(changeling && changeling.stored_profiles.len && (current.real_name != changeling.first_prof.name) ) - text += "
Transform to initial appearance." - else if(src in ticker.mode.changelings) //Station Aligned Changeling - text += "YES (but not an antag)|no" - if (objectives.len==0) - text += "
Objectives are empty! Randomize!" - if(changeling && changeling.stored_profiles.len && (current.real_name != changeling.first_prof.name) ) - text += "
Transform to initial appearance." - else - text += "yes|NO" -// var/datum/game_mode/changeling/changeling = ticker.mode -// if (istype(changeling) && changeling.changelingdeath) -// text += "
All the changelings are dead! Restart in [round((changeling.TIME_TO_GET_REVIVED-(world.time-changeling.changelingdeathtime))/10)] seconds." - - if(current && current.client && (ROLE_CHANGELING in current.client.prefs.be_special)) - text += "|Enabled in Prefs" - else - text += "|Disabled in Prefs" - - sections["changeling"] = text - - /** NUCLEAR ***/ - text = "nuclear" - if (ticker.mode.config_tag=="nuclear") - text = uppertext(text) - text = "[text]: " - if (src in ticker.mode.syndicates) - text += "OPERATIVE|nanotrasen" - text += "
To shuttle, undress, dress up." - var/code - for (var/obj/machinery/nuclearbomb/bombue in machines) - if (length(bombue.r_code) <= 5 && bombue.r_code != "LOLNO" && bombue.r_code != "ADMIN") - code = bombue.r_code - break - if (code) - text += " Code is [code]. tell the code." - else - text += "operative|NANOTRASEN" - - if(current && current.client && (ROLE_OPERATIVE in current.client.prefs.be_special)) - text += "|Enabled in Prefs" - else - text += "|Disabled in Prefs" - - sections["nuclear"] = text - - /** TRAITOR ***/ - text = "traitor" - if (ticker.mode.config_tag=="traitor" || ticker.mode.config_tag=="traitorchan") - text = uppertext(text) - text = "[text]: " - if (src in ticker.mode.traitors) - text += "TRAITOR|loyal" - if (objectives.len==0) - text += "
Objectives are empty! Randomize!" - else - text += "traitor|LOYAL" - - if(current && current.client && (ROLE_TRAITOR in current.client.prefs.be_special)) - text += "|Enabled in Prefs" - else - text += "|Disabled in Prefs" - - sections["traitor"] = text - - /** SHADOWLING **/ - text = "shadowling" - if(ticker.mode.config_tag == "shadowling") - text = uppertext(text) - text = "[text]: " - if(src in ticker.mode.shadows) - text += "SHADOWLING|thrall|human" - else if(src in ticker.mode.thralls) - text += "shadowling|THRALL|human" - else - text += "shadowling|thrall|HUMAN" - - if(current && current.client && (ROLE_SHADOWLING in current.client.prefs.be_special)) - text += "|Enabled in Prefs" - else - text += "|Disabled in Prefs" - - sections["shadowling"] = text - - /** Abductors **/ - - text = "Abductor" - if(ticker.mode.config_tag == "abductor") - text = uppertext(text) - text = "[text]: " - if(src in ticker.mode.abductors) - text += "Abductor|human" - text += "|undress|equip" - else - text += "Abductor|human" - - if(current && current.client && (ROLE_ABDUCTOR in current.client.prefs.be_special)) - text += "|Enabled in Prefs" - else - text += "|Disabled in Prefs" - - sections["abductor"] = text - - /** HAND OF GOD **/ - text = "hand of god" - if(ticker.mode.config_tag == "handofgod") - text = uppertext(text) - text = "[text]: " - if(src in ticker.mode.red_deity_prophets) - text += "RED PROPHET|red follower|employee|blue follower|blue prophet|red god|blue god" - else if (src in ticker.mode.red_deity_followers) - text += "red prophet|RED FOLLOWER|employee|blue follower|blue prophet|red god|blue god" - else if (src in ticker.mode.blue_deity_followers) - text += "red prophet|red follower|employee|BLUE FOLLOWER|blue prophet|red god|blue god" - else if (src in ticker.mode.blue_deity_prophets) - text += "red prophet|red follower|employee|blue follower|BLUE PROPHET|red god|blue god" - else if (src in ticker.mode.red_deities) - text += "red prophet|red follower|employee|blue follower|blue prophet|RED GOD|blue god" - else if (src in ticker.mode.blue_deities) - text += "red prophet|red follower|employee|blue follower|blue prophet|red god|BLUE GOD" - else - text += "red prophet|red follower|EMPLOYEE|blue follower|blue prophet|red god|blue god" - - if(current && current.client && (ROLE_HOG_GOD in current.client.prefs.be_special)) - text += "|HOG God Enabled in Prefs" - else - text += "|HOG God Disabled in Prefs" - - if(current && current.client && (ROLE_HOG_CULTIST in current.client.prefs.be_special)) - text += "|HOG Cultist Enabled in Prefs" - else - text += "|HOG Disabled in Prefs" - - sections["follower"] = text - - /** MONKEY ***/ - if (istype(current, /mob/living/carbon)) - text = "monkey" - if (ticker.mode.config_tag=="monkey") - text = uppertext(text) - text = "[text]: " - if (istype(current, /mob/living/carbon/human)) - text += "healthy|infected|HUMAN|other" - else if (istype(current, /mob/living/carbon/monkey)) - var/found = 0 - for(var/datum/disease/D in current.viruses) - if(istype(D, /datum/disease/transformation/jungle_fever)) found = 1 - - if(found) - text += "healthy|INFECTED|human|other" - else - text += "HEALTHY|infected|human|other" - - else - text += "healthy|infected|human|OTHER" - - if(current && current.client && (ROLE_MONKEY in current.client.prefs.be_special)) - text += "|Enabled in Prefs" - else - text += "|Disabled in Prefs" - - sections["monkey"] = text - - - /** SILICON ***/ - - if (istype(current, /mob/living/silicon)) - text = "silicon" - var/mob/living/silicon/robot/robot = current - if (istype(robot) && robot.emagged) - text += "
Cyborg: Is emagged! Unemag!
0th law: [robot.laws.zeroth]" - var/mob/living/silicon/ai/ai = current - if (istype(ai) && ai.connected_robots.len) - var/n_e_robots = 0 - for (var/mob/living/silicon/robot/R in ai.connected_robots) - if (R.emagged) - n_e_robots++ - text += "
[n_e_robots] of [ai.connected_robots.len] slaved cyborgs are emagged. Unemag" - if (ticker.mode.config_tag == "traitorchan") - if (sections["traitor"]) - out += sections["traitor"]+"
" - if (sections["changeling"]) - out += sections["changeling"]+"

" - sections -= "traitor" - sections -= "changeling" - else - if (sections[ticker.mode.config_tag]) - out += sections[ticker.mode.config_tag]+"

" - sections -= ticker.mode.config_tag - for (var/i in sections) - if (sections[i]) - out += sections[i]+"
" - - - if (((src in ticker.mode.head_revolutionaries) || \ - (src in ticker.mode.traitors) || \ - (src in ticker.mode.syndicates)) && \ - istype(current,/mob/living/carbon/human) ) - - text = "Uplink: give" - var/obj/item/device/uplink/hidden/suplink = find_syndicate_uplink() - var/crystals - if (suplink) - crystals = suplink.uses - if (suplink) - text += "|take" - if (check_rights(R_FUN, 0)) - text += ", [crystals] crystals" - else - text += ", [crystals] crystals" - text += "." //hiel grammar - out += text - - out += "

" - - out += "Memory:
" - out += memory - out += "
Edit memory
" - out += "Objectives:
" - if (objectives.len == 0) - out += "EMPTY
" - else - var/obj_count = 1 - for(var/datum/objective/objective in objectives) - out += "[obj_count]: [objective.explanation_text] Edit Delete Toggle Completion
" - obj_count++ - out += "Add objective

" - - out += "Announce objectives

" - - usr << browse(out, "window=edit_memory[src];size=500x600") - - - -/datum/mind/Topic(href, href_list) - if(!check_rights(R_ADMIN)) - return - - if (href_list["role_edit"]) - var/new_role = input("Select new role", "Assigned role", assigned_role) as null|anything in get_all_jobs() - if (!new_role) - return - assigned_role = new_role - - else if (href_list["memory_edit"]) - var/new_memo = copytext(sanitize(input("Write new memory", "Memory", memory) as null|message),1,MAX_MESSAGE_LEN) - if (isnull(new_memo)) - return - memory = new_memo - - else if (href_list["obj_edit"] || href_list["obj_add"]) - var/datum/objective/objective - var/objective_pos - var/def_value - - if (href_list["obj_edit"]) - objective = locate(href_list["obj_edit"]) - if (!objective) - return //sanity - def_value = objective.type - - var/datum/objective/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in (typesof(/datum/objective) - list(/datum/objective, /datum/objective/default, /datum/objective/escape_obj, /datum/objective/changeling_team_objective)) //keep out the abstract ones - if (!new_obj_type) - return - if (initial(new_obj_type.required_role) != special_role && initial(new_obj_type.required_role) != null) - if(alert("The objective requires a special_role that this mind does not have. The player may not be able to complete the objective. Are you sure you want to continue?","uh oh" ,"Yes", "No") == "No") - return - - var/datum/objective/new_objective = add_objective(src, new_obj_type) - - if (istype(new_objective, /datum/objective/custom)) //it's lame I know but this type is snowflaky by its very nature - var/expl = stripped_input(usr, "Custom objective:", "Objective", objective ? objective.explanation_text : "") - if (!expl) - expl = "Free objective" - new_objective.explanation_text = expl - - if (!new_objective) - usr << initial(new_obj_type.error_text) - return - - if (objective) - objectives -= objective - objectives.Insert(objective_pos, new_objective) - message_admins("[key_name_admin(usr)] edited [current]'s objective to [new_objective.explanation_text]") - log_admin("[key_name(usr)] edited [current]'s objective to [new_objective.explanation_text]") - else - message_admins("[key_name_admin(usr)] added a new objective for [current]: [new_objective.explanation_text]") - log_admin("[key_name(usr)] added a new objective for [current]: [new_objective.explanation_text]") - - else if (href_list["obj_delete"]) - var/datum/objective/objective = locate(href_list["obj_delete"]) - if(!istype(objective)) - return - objectives -= objective - message_admins("[key_name_admin(usr)] removed an objective for [current]: [objective.explanation_text]") - log_admin("[key_name(usr)] removed an objective for [current]: [objective.explanation_text]") - - else if(href_list["obj_completed"]) - var/datum/objective/objective = locate(href_list["obj_completed"]) - if(!istype(objective)) - return - objective.completed = !objective.completed - log_admin("[key_name(usr)] toggled the win state for [current]'s objective: [objective.explanation_text]") - else if (href_list["handofgod"]) - switch(href_list["handofgod"]) - if("clear") //wipe handofgod status - if((src in ticker.mode.red_deity_followers) || (src in ticker.mode.blue_deity_followers) || (src in ticker.mode.red_deity_prophets) || (src in ticker.mode.blue_deity_prophets)) - remove_hog_follower_prophet() - current << "You have been brainwashed... again! Your faith is no more!" - message_admins("[key_name_admin(usr)] has de-hand of god'ed [current].") - log_admin("[key_name(usr)] has de-hand of god'ed [current].") - - if("red follower") - make_Handofgod_follower("red") - message_admins("[key_name_admin(usr)] has red follower'ed [current].") - log_admin("[key_name(usr)] has red follower'ed [current].") - - if("red prophet") - make_Handofgod_prophet("red") - message_admins("[key_name_admin(usr)] has red prophet'ed [current].") - log_admin("[key_name(usr)] has red prophet'ed [current].") - - if("blue follower") - make_Handofgod_follower("blue") - message_admins("[key_name_admin(usr)] has blue follower'ed [current].") - log_admin("[key_name(usr)] has blue follower'ed [current].") - - if("blue prophet") - make_Handofgod_prophet("blue") - message_admins("[key_name_admin(usr)] has blue prophet'ed [current].") - log_admin("[key_name(usr)] has blue prophet'ed [current].") - - if("red god") - make_Handofgod_god("red") - message_admins("[key_name_admin(usr)] has red god'ed [current].") - log_admin("[key_name(usr)] has red god'ed [current].") - - if("blue god") - make_Handofgod_god("blue") - message_admins("[key_name_admin(usr)] has blue god'ed [current].") - log_admin("[key_name(usr)] has blue god'ed [current].") - - else if (href_list["revolution"]) - switch(href_list["revolution"]) - if("clear") - remove_rev() - current << "You have been brainwashed! You are no longer a revolutionary!" - message_admins("[key_name_admin(usr)] has de-rev'ed [current].") - log_admin("[key_name(usr)] has de-rev'ed [current].") - if("rev") - if(src in ticker.mode.head_revolutionaries) - ticker.mode.head_revolutionaries -= src - ticker.mode.update_rev_icons_removed(src) - current << "Revolution has been disappointed of your leader traits! You are a regular revolutionary now!" - else if(!(src in ticker.mode.revolutionaries)) - current << " You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!" - else - return - ticker.mode.revolutionaries += src - ticker.mode.update_rev_icons_added(src) - special_role = "Revolutionary" - message_admins("[key_name_admin(usr)] has rev'ed [current].") - log_admin("[key_name(usr)] has rev'ed [current].") - - if("headrev") - if(src in ticker.mode.revolutionaries) - ticker.mode.revolutionaries -= src - ticker.mode.update_rev_icons_removed(src) - current << "You have proved your devotion to revoltion! Yea are a head revolutionary now!" - else if(!(src in ticker.mode.head_revolutionaries)) - current << "You are a member of the revolutionaries' leadership now!" - else - return - if (ticker.mode.head_revolutionaries.len>0) - // copy targets - var/datum/mind/valid_head = locate() in ticker.mode.head_revolutionaries - if (valid_head) - for (var/datum/objective/mutiny/O in valid_head.objectives) - var/datum/objective/mutiny/rev_obj = new - rev_obj.owner = src - rev_obj.target = O.target - rev_obj.explanation_text = "Assassinate [O.target.name], the [O.target.assigned_role]." - objectives += rev_obj - ticker.mode.greet_revolutionary(src,0) - ticker.mode.head_revolutionaries += src - ticker.mode.update_rev_icons_added(src) - special_role = "Head Revolutionary" - message_admins("[key_name_admin(usr)] has head-rev'ed [current].") - log_admin("[key_name(usr)] has head-rev'ed [current].") - - if("autoobjectives") - ticker.mode.forge_revolutionary_objectives(src) - ticker.mode.greet_revolutionary(src,0) - usr << "The objectives for revolution have been generated and shown to [key]" - - if("flash") - if (!ticker.mode.equip_revolutionary(current)) - usr << "Spawning flash failed!" - - if("takeflash") - var/list/L = current.get_contents() - var/obj/item/device/assembly/flash/flash = locate() in L - if (!flash) - usr << "Deleting flash failed!" - qdel(flash) - - if("repairflash") - var/list/L = current.get_contents() - var/obj/item/device/assembly/flash/flash = locate() in L - if (!flash) - usr << "Repairing flash failed!" - else - flash.crit_fail = 0 - flash.update_icon() - - - -//////////////////// GANG MODE - - else if (href_list["gang"]) - switch(href_list["gang"]) - if("clear") - remove_gang() - message_admins("[key_name_admin(usr)] has de-gang'ed [current].") - log_admin("[key_name(usr)] has de-gang'ed [current].") - - if("equip") - switch(ticker.mode.equip_gang(current,gang_datum)) - if(1) - usr << "Unable to equip territory spraycan!" - if(2) - usr << "Unable to equip recruitment pen and spraycan!" - if(3) - usr << "Unable to equip gangtool, pen, and spraycan!" - - if("takeequip") - var/list/L = current.get_contents() - for(var/obj/item/weapon/pen/gang/pen in L) - qdel(pen) - for(var/obj/item/device/gangtool/gangtool in L) - qdel(gangtool) - for(var/obj/item/toy/crayon/spraycan/gang/SC in L) - qdel(SC) - - if("new") - if(gang_colors_pool.len) - var/list/names = list("Random") + gang_name_pool - var/gangname = input("Pick a gang name.","Select Name") as null|anything in names - if(gangname && gang_colors_pool.len) //Check again just in case another admin made max gangs at the same time - if(!(gangname in gang_name_pool)) - gangname = null - var/datum/gang/newgang = new(null,gangname) - ticker.mode.gangs += newgang - message_admins("[key_name_admin(usr)] has created the [newgang.name] Gang.") - log_admin("[key_name(usr)] has created the [newgang.name] Gang.") - - else if (href_list["gangboss"]) - var/datum/gang/G = locate(href_list["gangboss"]) in ticker.mode.gangs - if(!G || (src in G.bosses)) - return - ticker.mode.remove_gangster(src,0,2,1) - G.bosses += src - gang_datum = G - special_role = "[G.name] Gang Boss" - G.add_gang_hud(src) - current << "You are a [G.name] Gang Boss!" - message_admins("[key_name_admin(usr)] has added [current] to the [G.name] Gang leadership.") - log_admin("[key_name(usr)] has added [current] to the [G.name] Gang leadership.") - ticker.mode.forge_gang_objectives(src) - ticker.mode.greet_gang(src,0) - - else if (href_list["gangster"]) - var/datum/gang/G = locate(href_list["gangster"]) in ticker.mode.gangs - if(!G || (src in G.gangsters)) - return - ticker.mode.remove_gangster(src,0,2,1) - ticker.mode.add_gangster(src,G,0) - message_admins("[key_name_admin(usr)] has added [current] to the [G.name] Gang (A).") - log_admin("[key_name(usr)] has added [current] to the [G.name] Gang (A).") - -///////////////////////////////// - - - - else if (href_list["cult"]) - switch(href_list["cult"]) - if("clear") - remove_cultist() - current << "You have been brainwashed! You are no longer a cultist!" - message_admins("[key_name_admin(usr)] has de-cult'ed [current].") - log_admin("[key_name(usr)] has de-cult'ed [current].") - if("cultist") - if(!(src in ticker.mode.cult)) - ticker.mode.add_cultist(src) - message_admins("[key_name_admin(usr)] has cult'ed [current].") - log_admin("[key_name(usr)] has cult'ed [current].") - - if("equip") - if (!ticker.mode.equip_cultist(current)) - usr << "equip_cultist() failed! [current]'s starting equipment will be incomplete." - - else if (href_list["wizard"]) - switch(href_list["wizard"]) - if("clear") - remove_wizard() - current << "You have been brainwashed! You are no longer a wizard!" - log_admin("[key_name(usr)] has de-wizard'ed [current].") - if("wizard") - if(!(src in ticker.mode.wizards)) - ticker.mode.wizards += src - special_role = "Wizard" - //ticker.mode.learn_basic_spells(current) - current << "You are the Space Wizard!" - message_admins("[key_name_admin(usr)] has wizard'ed [current].") - log_admin("[key_name(usr)] has wizard'ed [current].") - if("lair") - current.loc = pick(wizardstart) - if("dressup") - ticker.mode.equip_wizard(current) - if("name") - ticker.mode.name_wizard(current) - if("autoobjectives") - ticker.mode.forge_wizard_objectives(src) - usr << "The objectives for wizard [key] have been generated. You can edit them and anounce manually." - - else if (href_list["changeling"]) - switch(href_list["changeling"]) - if("clear") - remove_changeling() - current << "You grow weak and lose your powers! You are no longer a changeling and are stuck in your current form!" - message_admins("[key_name_admin(usr)] has de-changeling'ed [current].") - log_admin("[key_name(usr)] has de-changeling'ed [current].") - if("changeling") - if(!(src in ticker.mode.changelings)) - ticker.mode.changelings += src - current.make_changeling() - special_role = "Changeling" - current << "Your powers are awoken. A flash of memory returns to us...we are [changeling.changelingID], a changeling!" - message_admins("[key_name_admin(usr)] has changeling'ed [current].") - log_admin("[key_name(usr)] has changeling'ed [current].") - if("autoobjectives") - ticker.mode.forge_changeling_objectives(src) - usr << "The objectives for changeling [key] have been generated. You can edit them and anounce manually." - - if("initialdna") - if( !changeling || !changeling.stored_profiles.len || !istype(current, /mob/living/carbon)) - usr << "Resetting DNA failed!" - else - var/mob/living/carbon/C = current - changeling.first_prof.dna.transfer_identity(C, transfer_SE=1) - C.real_name = changeling.first_prof.name - C.updateappearance(mutcolor_update=1) - C.domutcheck() - - else if (href_list["nuclear"]) - switch(href_list["nuclear"]) - if("clear") - remove_nukeop() - current << "You have been brainwashed! You are no longer a syndicate operative!" - message_admins("[key_name_admin(usr)] has de-nuke op'ed [current].") - log_admin("[key_name(usr)] has de-nuke op'ed [current].") - if("nuclear") - if(!(src in ticker.mode.syndicates)) - ticker.mode.syndicates += src - ticker.mode.update_synd_icons_added(src) - if (ticker.mode.syndicates.len==1) - ticker.mode.prepare_syndicate_leader(src) - else - current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]" - special_role = "Syndicate" - assigned_role = "Syndicate" - current << "You are a [syndicate_name()] agent!" - ticker.mode.forge_syndicate_objectives(src) - ticker.mode.greet_syndicate(src) - message_admins("[key_name_admin(usr)] has nuke op'ed [current].") - log_admin("[key_name(usr)] has nuke op'ed [current].") - if("lair") - current.loc = get_turf(locate("landmark*Syndicate-Spawn")) - if("dressup") - var/mob/living/carbon/human/H = current - qdel(H.belt) - qdel(H.back) - qdel(H.ears) - qdel(H.gloves) - qdel(H.head) - qdel(H.shoes) - qdel(H.wear_id) - qdel(H.wear_suit) - qdel(H.w_uniform) - - if (!ticker.mode.equip_syndicate(current)) - usr << "Equipping a syndicate failed!" - if("tellcode") - var/code - for (var/obj/machinery/nuclearbomb/bombue in machines) - if (length(bombue.r_code) <= 5 && bombue.r_code != "LOLNO" && bombue.r_code != "ADMIN") - code = bombue.r_code - break - if (code) - store_memory("Syndicate Nuclear Bomb Code: [code]", 0, 0) - current << "The nuclear authorization code is: [code]" - else - usr << "No valid nuke found!" - - else if (href_list["traitor"]) - switch(href_list["traitor"]) - if("clear") - remove_traitor() - current << "You have been brainwashed! You are no longer a traitor!" - message_admins("[key_name_admin(usr)] has de-traitor'ed [current].") - log_admin("[key_name(usr)] has de-traitor'ed [current].") - - if("traitor") - if(!(src in ticker.mode.traitors)) - ticker.mode.traitors += src - special_role = "traitor" - current << "You are a traitor!" - message_admins("[key_name_admin(usr)] has traitor'ed [current].") - log_admin("[key_name(usr)] has traitor'ed [current].") - if(isAI(current)) - var/mob/living/silicon/ai/A = current - ticker.mode.add_law_zero(A) - A.show_laws() - - if("autoobjectives") - ticker.mode.forge_traitor_objectives(src) - usr << "The objectives for traitor [key] have been generated. You can edit them and anounce manually." - - else if(href_list["shadowling"]) - switch(href_list["shadowling"]) - if("clear") - ticker.mode.update_shadow_icons_removed(src) - if(src in ticker.mode.shadows) - ticker.mode.shadows -= src - special_role = null - current << "Your powers have been quenched! You are no longer a shadowling!" - remove_spell(/obj/effect/proc_holder/spell/self/shadowling_hatch) - remove_spell(/obj/effect/proc_holder/spell/self/shadowling_ascend) - remove_spell(/obj/effect/proc_holder/spell/targeted/enthrall) - remove_spell(/obj/effect/proc_holder/spell/self/shadowling_hivemind) - message_admins("[key_name_admin(usr)] has de-shadowling'ed [current].") - log_admin("[key_name(usr)] has de-shadowling'ed [current].") - else if(src in ticker.mode.thralls) - ticker.mode.remove_thrall(src,0) - message_admins("[key_name_admin(usr)] has de-thrall'ed [current].") - log_admin("[key_name(usr)] has de-thrall'ed [current].") - if("shadowling") - if(!ishuman(current)) - usr << "This only works on humans!" - return - ticker.mode.shadows += src - special_role = "shadowling" - current << "Something stirs deep in your mind. A red light floods your vision, and slowly you remember. Though your human disguise has served you well, the \ - time is nigh to cast it off and enter your true form. You have disguised yourself amongst the humans, but you are not one of them. You are a shadowling, and you are to ascend at all costs.\ - " - ticker.mode.finalize_shadowling(src) - ticker.mode.update_shadow_icons_added(src) - if("thrall") - if(!ishuman(current)) - usr << "This only works on humans!" - return - ticker.mode.add_thrall(src) - message_admins("[key_name_admin(usr)] has thrall'ed [current].") - log_admin("[key_name(usr)] has thrall'ed [current].") - - else if(href_list["abductor"]) - switch(href_list["abductor"]) - if("clear") - usr << "Not implemented yet. Sorry!" - if("abductor") - if(!ishuman(current)) - usr << "This only works on humans!" - return - make_Abductor() - log_admin("[key_name(usr)] turned [current] into abductor.") - if("equip") - var/gear = alert("Agent or Scientist Gear","Gear","Agent","Scientist") - if(gear) - var/datum/game_mode/abduction/temp = new - temp.equip_common(current) - if(gear=="Agent") - temp.equip_agent(current) - else - temp.equip_scientist(current) - - else if (href_list["monkey"]) - var/mob/living/L = current - if (L.notransform) - return - switch(href_list["monkey"]) - if("healthy") - if (check_rights(R_ADMIN)) - var/mob/living/carbon/human/H = current - var/mob/living/carbon/monkey/M = current - if (istype(H)) - log_admin("[key_name(usr)] attempting to monkeyize [key_name(current)]") - message_admins("[key_name_admin(usr)] attempting to monkeyize [key_name_admin(current)]") - src = null - M = H.monkeyize() - src = M.mind - //world << "DEBUG: \"healthy\": M=[M], M.mind=[M.mind], src=[src]!" - else if (istype(M) && length(M.viruses)) - for(var/datum/disease/D in M.viruses) - D.cure(0) - sleep(0) //because deleting of virus is done through spawn(0) - if("infected") - if (check_rights(R_ADMIN, 0)) - var/mob/living/carbon/human/H = current - var/mob/living/carbon/monkey/M = current - if (istype(H)) - log_admin("[key_name(usr)] attempting to monkeyize and infect [key_name(current)]") - message_admins("[key_name_admin(usr)] attempting to monkeyize and infect [key_name_admin(current)]") - src = null - M = H.monkeyize() - src = M.mind - current.ForceContractDisease(new /datum/disease/transformation/jungle_fever) - else if (istype(M)) - current.ForceContractDisease(new /datum/disease/transformation/jungle_fever) - if("human") - if (check_rights(R_ADMIN, 0)) - var/mob/living/carbon/human/H = current - var/mob/living/carbon/monkey/M = current - if (istype(M)) - for(var/datum/disease/D in M.viruses) - if (istype(D,/datum/disease/transformation/jungle_fever)) - D.cure(0) - sleep(0) //because deleting of virus is doing throught spawn(0) - log_admin("[key_name(usr)] attempting to humanize [key_name(current)]") - message_admins("[key_name_admin(usr)] attempting to humanize [key_name_admin(current)]") - H = M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG) - if(H) - src = H.mind - - else if (href_list["silicon"]) - switch(href_list["silicon"]) - - if("unemag") - var/mob/living/silicon/robot/R = current - if (istype(R)) - R.SetEmagged(0) - message_admins("[key_name_admin(usr)] has unemag'ed [R].") - log_admin("[key_name(usr)] has unemag'ed [R].") - - if("unemagcyborgs") - if (istype(current, /mob/living/silicon/ai)) - var/mob/living/silicon/ai/ai = current - for (var/mob/living/silicon/robot/R in ai.connected_robots) - R.SetEmagged(0) - message_admins("[key_name_admin(usr)] has unemag'ed [ai]'s Cyborgs.") - log_admin("[key_name(usr)] has unemag'ed [ai]'s Cyborgs.") - - else if (href_list["common"]) - switch(href_list["common"]) - if("undress") - for(var/obj/item/W in current) - current.unEquip(W, 1) //The 1 forces all items to drop, since this is an admin undress. - if("takeuplink") - take_uplink() - memory = null//Remove any memory they may have had. - log_admin("[key_name(usr)] removed [current]'s uplink.") - if("crystals") - if (check_rights(R_FUN, 0)) - var/obj/item/device/uplink/hidden/suplink = find_syndicate_uplink() - var/crystals - if (suplink) - crystals = suplink.uses - crystals = input("Amount of telecrystals for [key]","Syndicate uplink", crystals) as null|num - if (!isnull(crystals)) - if (suplink) - suplink.uses = crystals - message_admins("[key_name_admin(usr)] changed [current]'s telecrystal count to [crystals].") - log_admin("[key_name(usr)] changed [current]'s telecrystal count to [crystals].") - if("uplink") - if (!ticker.mode.equip_traitor(current, !(src in ticker.mode.traitors))) - usr << "Equipping a syndicate failed!" - log_admin("[key_name(usr)] attempted to give [current] an uplink.") - - else if (href_list["obj_announce"]) - var/obj_count = 1 - current << "Your current objectives:" - for(var/datum/objective/objective in objectives) - current << "Objective #[obj_count]: [objective.explanation_text]" - obj_count++ - - edit_memory() - -/datum/mind/proc/find_syndicate_uplink() - var/list/L = current.get_contents() - for (var/obj/item/I in L) - if (I.hidden_uplink) - return I.hidden_uplink - return null - -/datum/mind/proc/take_uplink() - var/obj/item/device/uplink/hidden/H = find_syndicate_uplink() - if(H) - qdel(H) - -/datum/mind/proc/make_Traitor() - if(!(src in ticker.mode.traitors)) - ticker.mode.traitors += src - special_role = "traitor" - ticker.mode.forge_traitor_objectives(src) - ticker.mode.finalize_traitor(src) - ticker.mode.greet_traitor(src) - -/datum/mind/proc/make_Nuke(turf/spawnloc,nuke_code,leader=0, telecrystals = TRUE) - if(!(src in ticker.mode.syndicates)) - ticker.mode.syndicates += src - ticker.mode.update_synd_icons_added(src) - special_role = "Syndicate" - ticker.mode.forge_syndicate_objectives(src) - ticker.mode.greet_syndicate(src) - - current.loc = spawnloc - - var/mob/living/carbon/human/H = current - qdel(H.belt) - qdel(H.back) - qdel(H.ears) - qdel(H.gloves) - qdel(H.head) - qdel(H.shoes) - qdel(H.wear_id) - qdel(H.wear_suit) - qdel(H.w_uniform) - - ticker.mode.equip_syndicate(current, telecrystals) - - if (nuke_code) - store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0) - current << "The nuclear authorization code is: [nuke_code]" - - if (leader) - ticker.mode.prepare_syndicate_leader(src,nuke_code) - else - current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]" - -/datum/mind/proc/make_Changling() - if(!(src in ticker.mode.changelings)) - ticker.mode.changelings += src - current.make_changeling() - special_role = "Changeling" - ticker.mode.forge_changeling_objectives(src) - ticker.mode.greet_changeling(src) - -/datum/mind/proc/make_Wizard() - if(!(src in ticker.mode.wizards)) - ticker.mode.wizards += src - special_role = "Wizard" - assigned_role = "Wizard" - //ticker.mode.learn_basic_spells(current) - if(!wizardstart.len) - current.loc = pick(latejoin) - current << "HOT INSERTION, GO GO GO" - else - current.loc = pick(wizardstart) - - ticker.mode.equip_wizard(current) - for(var/obj/item/weapon/spellbook/S in current.contents) - S.op = 0 - ticker.mode.name_wizard(current) - ticker.mode.forge_wizard_objectives(src) - ticker.mode.greet_wizard(src) - - -/datum/mind/proc/make_Cultist() - if(!(src in ticker.mode.cult)) - ticker.mode.cult += src - ticker.mode.update_cult_icons_added(src) - special_role = "Cultist" - current << "You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie." - current << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back." - current << "Your objective is to summon Nar-Sie by building and defending a suitable shell for the Geometer. Adequate supplies can be procured through human sacrifices." - ticker.mode.equip_cultist(current) - -/datum/mind/proc/make_Rev() - if (ticker.mode.head_revolutionaries.len>0) - // copy targets - var/datum/mind/valid_head = locate() in ticker.mode.head_revolutionaries - if (valid_head) - for (var/datum/objective/mutiny/O in valid_head.objectives) - var/datum/objective/mutiny/rev_obj = new - rev_obj.owner = src - rev_obj.target = O.target - rev_obj.explanation_text = "Assassinate [O.target.current.real_name], the [O.target.assigned_role]." - objectives += rev_obj - ticker.mode.greet_revolutionary(src,0) - ticker.mode.head_revolutionaries += src - ticker.mode.update_rev_icons_added(src) - special_role = "Head Revolutionary" - - ticker.mode.forge_revolutionary_objectives(src) - ticker.mode.greet_revolutionary(src,0) - - var/list/L = current.get_contents() - var/obj/item/device/assembly/flash/flash = locate() in L - qdel(flash) - take_uplink() - var/fail = 0 -// fail |= !ticker.mode.equip_traitor(current, 1) - fail |= !ticker.mode.equip_revolutionary(current) - - -/datum/mind/proc/make_Gang(datum/gang/G) - special_role = "[G.name] Gang Boss" - G.bosses += src - gang_datum = G - G.add_gang_hud(src) - ticker.mode.forge_gang_objectives(src) - ticker.mode.greet_gang(src) - ticker.mode.equip_gang(current,G) - -/datum/mind/proc/make_Abductor() - var/role = alert("Abductor Role ?","Role","Agent","Scientist") - var/team = input("Abductor Team ?","Team ?") in list(1,2,3,4) - var/teleport = alert("Teleport to ship ?","Teleport","Yes","No") - - if(!role || !team || !teleport) - return - - if(!ishuman(current)) - return - - ticker.mode.abductors |= src - - var/datum/objective/experiment/O = new - O.owner = src - objectives += O - - var/mob/living/carbon/human/H = current - - H.set_species(/datum/species/abductor) - var/datum/species/abductor/S = H.dna.species - - switch(role) - if("Agent") - S.agent = 1 - if("Scientist") - S.scientist = 1 - S.team = team - - var/list/obj/effect/landmark/abductor/agent_landmarks = new - var/list/obj/effect/landmark/abductor/scientist_landmarks = new - agent_landmarks.len = 4 - scientist_landmarks.len = 4 - for(var/obj/effect/landmark/abductor/A in landmarks_list) - if(istype(A,/obj/effect/landmark/abductor/agent)) - agent_landmarks[text2num(A.team)] = A - else if(istype(A,/obj/effect/landmark/abductor/scientist)) - scientist_landmarks[text2num(A.team)] = A - - var/obj/effect/landmark/L - if(teleport=="Yes") - switch(role) - if("Agent") - S.agent = 1 - L = agent_landmarks[team] - H.loc = L.loc - if("Scientist") - S.scientist = 1 - L = agent_landmarks[team] - H.loc = L.loc - - -/datum/mind/proc/make_Handofgod_follower(colour) - . = 0 - switch(colour) - if("red") - //Remove old allegiances - if(src in ticker.mode.blue_deity_followers || src in ticker.mode.blue_deity_prophets) - current << "You are no longer a member of the Blue cult!" - - ticker.mode.blue_deity_followers -= src - ticker.mode.blue_deity_prophets -= src - current.faction |= "red god" - current.faction -= "blue god" - - if(src in ticker.mode.red_deity_prophets) - current << "You have lost the connection with your deity, but you still believe in their grand design, You are no longer a prophet!" - ticker.mode.red_deity_prophets -= src - - ticker.mode.red_deity_followers |= src - current << "You are now a follower of the red cult's god!" - - special_role = "Hand of God: Red Follower" - . = 1 - if("blue") - //Remove old allegiances - if(src in ticker.mode.red_deity_followers || src in ticker.mode.red_deity_prophets) - current << "You are no longer a member of the Red cult!" - - ticker.mode.red_deity_followers -= src - ticker.mode.red_deity_prophets -= src - current.faction -= "red god" - current.faction |= "blue god" - - if(src in ticker.mode.blue_deity_prophets) - current << "You have lost the connection with your deity, but you still believe in their grand design, You are no longer a prophet!" - ticker.mode.blue_deity_prophets -= src - - ticker.mode.blue_deity_followers |= src - current << "You are now a follower of the blue cult's god!" - - special_role = "Hand of God: Blue Follower" - . = 1 - else - return 0 - - ticker.mode.update_hog_icons_removed(src,"red") - ticker.mode.update_hog_icons_removed(src,"blue") - //ticker.mode.greet_hog_follower(src,colour) - ticker.mode.update_hog_icons_added(src, colour) - -/datum/mind/proc/make_Handofgod_prophet(colour) - . = 0 - switch(colour) - if("red") - //Remove old allegiances - - if(src in ticker.mode.blue_deity_followers || src in ticker.mode.blue_deity_prophets) - current << "You are no longer a member of the Blue cult!" - current.faction -= "blue god" - current.faction |= "red god" - - ticker.mode.blue_deity_followers -= src - ticker.mode.blue_deity_prophets -= src - ticker.mode.red_deity_followers -= src - - ticker.mode.red_deity_prophets |= src - current << "You are now a prophet of the red cult's god!" - - special_role = "Hand of God: Red Prophet" - . = 1 - if("blue") - //Remove old allegiances - - if(src in ticker.mode.red_deity_followers || src in ticker.mode.red_deity_prophets) - current << "You are no longer a member of the Red cult!" - current.faction -= "red god" - current.faction |= "blue god" - - ticker.mode.red_deity_followers -= src - ticker.mode.red_deity_prophets -= src - ticker.mode.blue_deity_followers -= src - - ticker.mode.blue_deity_prophets |= src - current << "You are now a prophet of the blue cult's god!" - - special_role = "Hand of God: Blue Prophet" - . = 1 - - else - return 0 - - ticker.mode.update_hog_icons_removed(src,"red") - ticker.mode.update_hog_icons_removed(src,"blue") - ticker.mode.greet_hog_follower(src,colour) - ticker.mode.update_hog_icons_added(src, colour) - - -/datum/mind/proc/make_Handofgod_god(colour) - switch(colour) - if("red") - current.become_god("red") - ticker.mode.add_god(src,"red") - if("blue") - current.become_god("blue") - ticker.mode.add_god(src,"blue") - else - return 0 - ticker.mode.forge_deity_objectives(src) - ticker.mode.remove_hog_follower(src,0) - ticker.mode.update_hog_icons_added(src, colour) -// ticker.mode.greet_hog_follower(src,colour) - return 1 - - -/datum/mind/proc/AddSpell(obj/effect/proc_holder/spell/spell) - spell_list += spell - if(!spell.action) - spell.action = new/datum/action/spell_action - spell.action.target = spell - spell.action.name = spell.name - spell.action.button_icon = spell.action_icon - spell.action.button_icon_state = spell.action_icon_state - spell.action.background_icon_state = spell.action_background_icon_state - spell.action.Grant(current) - return -/datum/mind/proc/transfer_actions(mob/living/new_character) - if(current && current.actions) - for(var/datum/action/A in current.actions) - A.Grant(new_character) - transfer_mindbound_actions(new_character) - -/datum/mind/proc/transfer_mindbound_actions(var/mob/living/new_character) - for(var/obj/effect/proc_holder/spell/spell in spell_list) - if(!spell.action) // Unlikely but whatever - spell.action = new/datum/action/spell_action - spell.action.target = spell - spell.action.name = spell.name - spell.action.button_icon = spell.action_icon - spell.action.button_icon_state = spell.action_icon_state - spell.action.background_icon_state = spell.action_background_icon_state - spell.action.Grant(new_character) - return - -/mob/proc/sync_mind() - mind_initialize() //updates the mind (or creates and initializes one if one doesn't exist) - mind.active = 1 //indicates that the mind is currently synced with a client - -/mob/new_player/sync_mind() - return - -/mob/dead/observer/sync_mind() - return - -//Initialisation procs -/mob/proc/mind_initialize() - if(mind) - mind.key = key - - else - mind = new /datum/mind(key) - if(ticker) - ticker.minds += mind - else - spawn(0) - throw EXCEPTION("mind_initialize(): No ticker ready") - if(!mind.name) mind.name = real_name - mind.current = src - -//HUMAN -/mob/living/carbon/human/mind_initialize() - ..() - if(!mind.assigned_role) mind.assigned_role = "Assistant" //defualt - -//MONKEY -/mob/living/carbon/monkey/mind_initialize() - ..() - -//slime -/mob/living/simple_animal/slime/mind_initialize() - ..() - mind.special_role = "slime" - mind.assigned_role = "slime" - -//XENO -/mob/living/carbon/alien/mind_initialize() - ..() - mind.special_role = "Alien" - mind.assigned_role = "Alien" - //XENO HUMANOID -/mob/living/carbon/alien/humanoid/royal/queen/mind_initialize() - ..() - mind.special_role = "Queen" - -/mob/living/carbon/alien/humanoid/royal/praetorian/mind_initialize() - ..() - mind.special_role = "Praetorian" - -/mob/living/carbon/alien/humanoid/hunter/mind_initialize() - ..() - mind.special_role = "Hunter" - -/mob/living/carbon/alien/humanoid/drone/mind_initialize() - ..() - mind.special_role = "Drone" - -/mob/living/carbon/alien/humanoid/sentinel/mind_initialize() - ..() - mind.special_role = "Sentinel" - //XENO LARVA -/mob/living/carbon/alien/larva/mind_initialize() - ..() - mind.special_role = "Larva" - -//AI -/mob/living/silicon/ai/mind_initialize() - ..() - mind.assigned_role = "AI" - -//BORG -/mob/living/silicon/robot/mind_initialize() - ..() - mind.assigned_role = "Cyborg" - -//PAI -/mob/living/silicon/pai/mind_initialize() - ..() - mind.assigned_role = "pAI" - mind.special_role = "" - -//BLOB -/mob/camera/blob/mind_initialize() - ..() - mind.special_role = "Blob" - -//Animals -/mob/living/simple_animal/mind_initialize() - ..() - mind.assigned_role = "Animal" - mind.special_role = "Animal" - -/mob/living/simple_animal/pet/dog/corgi/mind_initialize() - ..() - mind.assigned_role = "Corgi" - mind.special_role = "Corgi" - -/mob/living/simple_animal/shade/mind_initialize() - ..() - mind.assigned_role = "Shade" - mind.special_role = "Shade" - -/mob/living/simple_animal/hostile/construct/mind_initialize() - ..() - mind.assigned_role = "[initial(name)]" +/* Note from Carnie: + The way datum/mind stuff works has been changed a lot. + Minds now represent IC characters rather than following a client around constantly. + + Guidelines for using minds properly: + + - Never mind.transfer_to(ghost). The var/current and var/original of a mind must always be of type mob/living! + ghost.mind is however used as a reference to the ghost's corpse + + - When creating a new mob for an existing IC character (e.g. cloning a dead guy or borging a brain of a human) + the existing mind of the old mob should be transfered to the new mob like so: + + mind.transfer_to(new_mob) + + - You must not assign key= or ckey= after transfer_to() since the transfer_to transfers the client for you. + By setting key or ckey explicitly after transfering the mind with transfer_to you will cause bugs like DCing + the player. + + - IMPORTANT NOTE 2, if you want a player to become a ghost, use mob.ghostize() It does all the hard work for you. + + - When creating a new mob which will be a new IC character (e.g. putting a shade in a construct or randomly selecting + a ghost to become a xeno during an event). Simply assign the key or ckey like you've always done. + + new_mob.key = key + + The Login proc will handle making a new mob for that mobtype (including setting up stuff like mind.name). Simple! + However if you want that mind to have any special properties like being a traitor etc you will have to do that + yourself. + +*/ + +/datum/mind + var/key + var/name //replaces mob/var/original_name + var/mob/living/current + var/active = 0 + + var/memory + var/attack_log + + var/assigned_role + var/special_role + var/list/restricted_roles = list() + + var/datum/job/assigned_job + + var/list/datum/objective/objectives = list() + var/list/datum/objective/special_verbs = list() + + var/list/spell_list = list() // Wizard mode & "Give Spell" badmin button. + + var/datum/faction/faction //associated faction + var/datum/changeling/changeling //changeling holder + + var/miming = 0 // Mime's vow of silence + var/antag_hud_icon_state = null //this mind's ANTAG_HUD should have this icon_state + var/datum/atom_hud/antag/antag_hud = null //this mind's antag HUD + var/datum/gang/gang_datum //Which gang this mind belongs to, if any + +/datum/mind/New(var/key) + src.key = key + + +/datum/mind/proc/transfer_to(mob/new_character) + if(current) // remove ourself from our old body's mind variable + current.mind = null + SStgui.on_transfer(current, new_character) + + if(key) + if(new_character.key != key) //if we're transfering into a body with a key associated which is not ours + new_character.ghostize(1) //we'll need to ghostize so that key isn't mobless. + else + key = new_character.key + + if(new_character.mind) //disassociate any mind currently in our new body's mind variable + new_character.mind.current = null + + var/datum/atom_hud/antag/hud_to_transfer = antag_hud//we need this because leave_hud() will clear this list + leave_all_huds() //leave all the huds in the old body, so it won't get huds if somebody else enters it + current = new_character //associate ourself with our new body + new_character.mind = src //and associate our new body with ourself + transfer_antag_huds(hud_to_transfer) //inherit the antag HUD + transfer_actions(new_character) + + if(active) + new_character.key = key //now transfer the key to link the client to our new body + +/datum/mind/proc/store_memory(new_text) + memory += "[new_text]
" + +/datum/mind/proc/wipe_memory() + memory = null + + +/* + Removes antag type's references from a mind. + objectives, uplinks, powers etc are all handled. +*/ + +/datum/mind/proc/remove_objectives() + if(objectives.len) + for(var/datum/objective/O in objectives) + objectives -= O + qdel(O) + +/datum/mind/proc/remove_changeling() + if(src in ticker.mode.changelings) + ticker.mode.changelings -= src + current.remove_changeling_powers() + if(changeling) + qdel(changeling) + changeling = null + special_role = null + remove_antag_equip() + +/datum/mind/proc/remove_traitor() + if(src in ticker.mode.traitors) + ticker.mode.traitors -= src + if(isAI(current)) + var/mob/living/silicon/ai/A = current + A.set_zeroth_law("") + A.show_laws() + A.verbs -= /mob/living/silicon/ai/proc/choose_modules + A.malf_picker.remove_verbs(A) + qdel(A.malf_picker) + special_role = null + remove_antag_equip() + +/datum/mind/proc/remove_nukeop() + if(src in ticker.mode.syndicates) + ticker.mode.syndicates -= src + ticker.mode.update_synd_icons_removed(src) + special_role = null + remove_objectives() + remove_antag_equip() + +/datum/mind/proc/remove_wizard() + if(src in ticker.mode.wizards) + ticker.mode.wizards -= src + current.spellremove(current) + special_role = null + remove_antag_equip() + +/datum/mind/proc/remove_cultist() + if(src in ticker.mode.cult) + ticker.mode.cult -= src + ticker.mode.update_cult_icons_removed(src) + special_role = null + +/datum/mind/proc/remove_rev() + if(src in ticker.mode.revolutionaries) + ticker.mode.revolutionaries -= src + ticker.mode.update_rev_icons_removed(src) + if(src in ticker.mode.head_revolutionaries) + ticker.mode.head_revolutionaries -= src + ticker.mode.update_rev_icons_removed(src) + special_role = null + remove_objectives() + remove_antag_equip() + + +/datum/mind/proc/remove_gang() + ticker.mode.remove_gangster(src,0,1,1) + remove_objectives() + +/datum/mind/proc/remove_hog_follower_prophet() + ticker.mode.red_deity_followers -= src + ticker.mode.red_deity_prophets -= src + ticker.mode.blue_deity_prophets -= src + ticker.mode.blue_deity_followers -= src + ticker.mode.update_hog_icons_removed(src, "red") + ticker.mode.update_hog_icons_removed(src, "blue") + + + +/datum/mind/proc/remove_antag_equip() + var/list/Mob_Contents = current.get_contents() + for(var/obj/item/I in Mob_Contents) + if(istype(I, /obj/item/device/pda)) + var/obj/item/device/pda/P = I + P.lock_code = "" + + else if(istype(I, /obj/item/device/radio)) + var/obj/item/device/radio/R = I + R.traitor_frequency = 0 + +/datum/mind/proc/remove_all_antag() //For the Lazy amongst us. + remove_changeling() + remove_traitor() + remove_nukeop() + remove_wizard() + remove_cultist() + remove_rev() + remove_gang() + +/datum/mind/proc/show_memory(mob/recipient, window=1) + if(!recipient) + recipient = current + var/output = "[current.real_name]'s Memories:
" + output += memory + + if(objectives.len) + output += "Objectives:" + var/obj_count = 1 + for(var/datum/objective/objective in objectives) + output += "
Objective #[obj_count++]: [objective.explanation_text]" + + if(window) recipient << browse(output,"window=memory") + else recipient << "[output]" + +/datum/mind/proc/edit_memory() + if(!ticker || !ticker.mode) + alert("Not before round-start!", "Alert") + return + + var/out = "[name][(current&&(current.real_name!=name))?" (as [current.real_name])":""]
" + out += "Mind currently owned by key: [key] [active?"(synced)":"(not synced)"]
" + out += "Assigned role: [assigned_role]. Edit
" + out += "Faction and special role: [special_role]
" + + var/list/sections = list( + "revolution", + "gang", + "cult", + "wizard", + "changeling", + "nuclear", + "traitor", // "traitorchan", + "monkey", + ) + var/text = "" + + if (istype(current, /mob/living/carbon/human) || istype(current, /mob/living/carbon/monkey)) + /** REVOLUTION ***/ + text = "revolution" + if (ticker.mode.config_tag=="revolution") + text = uppertext(text) + text = "[text]: " + if (assigned_role in command_positions) + text += "HEAD|loyal|employee|headrev|rev" + else if (src in ticker.mode.head_revolutionaries) + text += "head|loyal|employee|HEADREV|rev" + text += "
Flash: give" + + var/list/L = current.get_contents() + var/obj/item/device/assembly/flash/flash = locate() in L + if (flash) + if(!flash.crit_fail) + text += "|take." + else + text += "|take|repair." + else + text += "." + + text += " Reequip (gives traitor uplink)." + if (objectives.len==0) + text += "
Objectives are empty! Set to kill all heads." + else if(isloyal(current)) + text += "head|LOYAL|employee|headrev|rev" + else if (src in ticker.mode.revolutionaries) + text += "head|loyal|employee|headrev|REV" + else + text += "head|loyal|EMPLOYEE|headrev|rev" + + if(current && current.client && (ROLE_REV in current.client.prefs.be_special)) + text += "|Enabled in Prefs" + else + text += "|Disabled in Prefs" + + sections["revolution"] = text + + /** GANG ***/ + text = "gang" + if (ticker.mode.config_tag=="gang") + text = uppertext(text) + text = "[text]: " + text += "[isloyal(current) ? "LOYAL" : "loyal"]|" + if(src in ticker.mode.get_all_gangsters()) + text += "none" + else + text += "NONE" + + if(current && current.client && (ROLE_GANG in current.client.prefs.be_special)) + text += "|Enabled in Prefs
" + else + text += "|Disabled in Prefs
" + + for(var/datum/gang/G in ticker.mode.gangs) + text += "[G.name]: " + if(src in (G.gangsters)) + text += "GANGSTER" + else + text += "gangster" + text += "|" + if(src in (G.bosses)) + text += "GANG LEADER" + text += "|Equipment: give" + var/list/L = current.get_contents() + var/obj/item/device/gangtool/gangtool = locate() in L + if (gangtool) + text += "|take" + + else + text += "gang leader" + text += "
" + + if(gang_colors_pool.len) + text += "Create New Gang" + + sections["gang"] = text + + + /** CULT ***/ + text = "cult" + if (ticker.mode.config_tag=="cult") + text = uppertext(text) + text = "[text]: " + if (src in ticker.mode.cult) + text += "loyal|employee|CULTIST" + text += "
Equip" + + else if(isloyal(current)) + text += "LOYAL|employee|cultist" + else + text += "loyal|EMPLOYEE|cultist" + + if(current && current.client && (ROLE_CULTIST in current.client.prefs.be_special)) + text += "|Enabled in Prefs" + else + text += "|Disabled in Prefs" + + sections["cult"] = text + + /** WIZARD ***/ + text = "wizard" + if (ticker.mode.config_tag=="wizard") + text = uppertext(text) + text = "[text]: " + if ((src in ticker.mode.wizards) || (src in ticker.mode.apprentices)) + text += "YES|no" + text += "
To lair, undress, dress up, let choose name." + if (objectives.len==0) + text += "
Objectives are empty! Randomize!" + else + text += "yes|NO" + + if(current && current.client && (ROLE_WIZARD in current.client.prefs.be_special)) + text += "|Enabled in Prefs" + else + text += "|Disabled in Prefs" + + sections["wizard"] = text + + /** CHANGELING ***/ + text = "changeling" + if (ticker.mode.config_tag=="changeling" || ticker.mode.config_tag=="traitorchan") + text = uppertext(text) + text = "[text]: " + if ((src in ticker.mode.changelings) && special_role) + text += "YES|no" + if (objectives.len==0) + text += "
Objectives are empty! Randomize!" + if(changeling && changeling.stored_profiles.len && (current.real_name != changeling.first_prof.name) ) + text += "
Transform to initial appearance." + else if(src in ticker.mode.changelings) //Station Aligned Changeling + text += "YES (but not an antag)|no" + if (objectives.len==0) + text += "
Objectives are empty! Randomize!" + if(changeling && changeling.stored_profiles.len && (current.real_name != changeling.first_prof.name) ) + text += "
Transform to initial appearance." + else + text += "yes|NO" +// var/datum/game_mode/changeling/changeling = ticker.mode +// if (istype(changeling) && changeling.changelingdeath) +// text += "
All the changelings are dead! Restart in [round((changeling.TIME_TO_GET_REVIVED-(world.time-changeling.changelingdeathtime))/10)] seconds." + + if(current && current.client && (ROLE_CHANGELING in current.client.prefs.be_special)) + text += "|Enabled in Prefs" + else + text += "|Disabled in Prefs" + + sections["changeling"] = text + + /** NUCLEAR ***/ + text = "nuclear" + if (ticker.mode.config_tag=="nuclear") + text = uppertext(text) + text = "[text]: " + if (src in ticker.mode.syndicates) + text += "OPERATIVE|nanotrasen" + text += "
To shuttle, undress, dress up." + var/code + for (var/obj/machinery/nuclearbomb/bombue in machines) + if (length(bombue.r_code) <= 5 && bombue.r_code != "LOLNO" && bombue.r_code != "ADMIN") + code = bombue.r_code + break + if (code) + text += " Code is [code]. tell the code." + else + text += "operative|NANOTRASEN" + + if(current && current.client && (ROLE_OPERATIVE in current.client.prefs.be_special)) + text += "|Enabled in Prefs" + else + text += "|Disabled in Prefs" + + sections["nuclear"] = text + + /** TRAITOR ***/ + text = "traitor" + if (ticker.mode.config_tag=="traitor" || ticker.mode.config_tag=="traitorchan") + text = uppertext(text) + text = "[text]: " + if (src in ticker.mode.traitors) + text += "TRAITOR|loyal" + if (objectives.len==0) + text += "
Objectives are empty! Randomize!" + else + text += "traitor|LOYAL" + + if(current && current.client && (ROLE_TRAITOR in current.client.prefs.be_special)) + text += "|Enabled in Prefs" + else + text += "|Disabled in Prefs" + + sections["traitor"] = text + + /** SHADOWLING **/ + text = "shadowling" + if(ticker.mode.config_tag == "shadowling") + text = uppertext(text) + text = "[text]: " + if(src in ticker.mode.shadows) + text += "SHADOWLING|thrall|human" + else if(src in ticker.mode.thralls) + text += "shadowling|THRALL|human" + else + text += "shadowling|thrall|HUMAN" + + if(current && current.client && (ROLE_SHADOWLING in current.client.prefs.be_special)) + text += "|Enabled in Prefs" + else + text += "|Disabled in Prefs" + + sections["shadowling"] = text + + /** Abductors **/ + + text = "Abductor" + if(ticker.mode.config_tag == "abductor") + text = uppertext(text) + text = "[text]: " + if(src in ticker.mode.abductors) + text += "Abductor|human" + text += "|undress|equip" + else + text += "Abductor|human" + + if(current && current.client && (ROLE_ABDUCTOR in current.client.prefs.be_special)) + text += "|Enabled in Prefs" + else + text += "|Disabled in Prefs" + + sections["abductor"] = text + + /** HAND OF GOD **/ + text = "hand of god" + if(ticker.mode.config_tag == "handofgod") + text = uppertext(text) + text = "[text]: " + if(src in ticker.mode.red_deity_prophets) + text += "RED PROPHET|red follower|employee|blue follower|blue prophet|red god|blue god" + else if (src in ticker.mode.red_deity_followers) + text += "red prophet|RED FOLLOWER|employee|blue follower|blue prophet|red god|blue god" + else if (src in ticker.mode.blue_deity_followers) + text += "red prophet|red follower|employee|BLUE FOLLOWER|blue prophet|red god|blue god" + else if (src in ticker.mode.blue_deity_prophets) + text += "red prophet|red follower|employee|blue follower|BLUE PROPHET|red god|blue god" + else if (src in ticker.mode.red_deities) + text += "red prophet|red follower|employee|blue follower|blue prophet|RED GOD|blue god" + else if (src in ticker.mode.blue_deities) + text += "red prophet|red follower|employee|blue follower|blue prophet|red god|BLUE GOD" + else + text += "red prophet|red follower|EMPLOYEE|blue follower|blue prophet|red god|blue god" + + if(current && current.client && (ROLE_HOG_GOD in current.client.prefs.be_special)) + text += "|HOG God Enabled in Prefs" + else + text += "|HOG God Disabled in Prefs" + + if(current && current.client && (ROLE_HOG_CULTIST in current.client.prefs.be_special)) + text += "|HOG Cultist Enabled in Prefs" + else + text += "|HOG Disabled in Prefs" + + sections["follower"] = text + + /** MONKEY ***/ + if (istype(current, /mob/living/carbon)) + text = "monkey" + if (ticker.mode.config_tag=="monkey") + text = uppertext(text) + text = "[text]: " + if (istype(current, /mob/living/carbon/human)) + text += "healthy|infected|HUMAN|other" + else if (istype(current, /mob/living/carbon/monkey)) + var/found = 0 + for(var/datum/disease/D in current.viruses) + if(istype(D, /datum/disease/transformation/jungle_fever)) found = 1 + + if(found) + text += "healthy|INFECTED|human|other" + else + text += "HEALTHY|infected|human|other" + + else + text += "healthy|infected|human|OTHER" + + if(current && current.client && (ROLE_MONKEY in current.client.prefs.be_special)) + text += "|Enabled in Prefs" + else + text += "|Disabled in Prefs" + + sections["monkey"] = text + + + /** SILICON ***/ + + if (istype(current, /mob/living/silicon)) + text = "silicon" + var/mob/living/silicon/robot/robot = current + if (istype(robot) && robot.emagged) + text += "
Cyborg: Is emagged! Unemag!
0th law: [robot.laws.zeroth]" + var/mob/living/silicon/ai/ai = current + if (istype(ai) && ai.connected_robots.len) + var/n_e_robots = 0 + for (var/mob/living/silicon/robot/R in ai.connected_robots) + if (R.emagged) + n_e_robots++ + text += "
[n_e_robots] of [ai.connected_robots.len] slaved cyborgs are emagged. Unemag" + if (ticker.mode.config_tag == "traitorchan") + if (sections["traitor"]) + out += sections["traitor"]+"
" + if (sections["changeling"]) + out += sections["changeling"]+"

" + sections -= "traitor" + sections -= "changeling" + else + if (sections[ticker.mode.config_tag]) + out += sections[ticker.mode.config_tag]+"

" + sections -= ticker.mode.config_tag + for (var/i in sections) + if (sections[i]) + out += sections[i]+"
" + + + if (((src in ticker.mode.head_revolutionaries) || \ + (src in ticker.mode.traitors) || \ + (src in ticker.mode.syndicates)) && \ + istype(current,/mob/living/carbon/human) ) + + text = "Uplink: give" + var/obj/item/device/uplink/hidden/suplink = find_syndicate_uplink() + var/crystals + if (suplink) + crystals = suplink.uses + if (suplink) + text += "|take" + if (check_rights(R_FUN, 0)) + text += ", [crystals] crystals" + else + text += ", [crystals] crystals" + text += "." //hiel grammar + out += text + + out += "

" + + out += "Memory:
" + out += memory + out += "
Edit memory
" + out += "Objectives:
" + if (objectives.len == 0) + out += "EMPTY
" + else + var/obj_count = 1 + for(var/datum/objective/objective in objectives) + out += "[obj_count]: [objective.explanation_text] Edit Delete Toggle Completion
" + obj_count++ + out += "Add objective

" + + out += "Announce objectives

" + + usr << browse(out, "window=edit_memory[src];size=500x600") + + +/datum/mind/Topic(href, href_list) + if(!check_rights(R_ADMIN)) return + + if (href_list["role_edit"]) + var/new_role = input("Select new role", "Assigned role", assigned_role) as null|anything in get_all_jobs() + if (!new_role) return + assigned_role = new_role + + else if (href_list["memory_edit"]) + var/new_memo = copytext(sanitize(input("Write new memory", "Memory", memory) as null|message),1,MAX_MESSAGE_LEN) + if (isnull(new_memo)) return + memory = new_memo + + else if (href_list["obj_edit"] || href_list["obj_add"]) + var/datum/objective/objective + var/objective_pos + var/def_value + + if (href_list["obj_edit"]) + objective = locate(href_list["obj_edit"]) + if (!objective) return + objective_pos = objectives.Find(objective) + + //Text strings are easy to manipulate. Revised for simplicity. + var/temp_obj_type = "[objective.type]"//Convert path into a text string. + def_value = copytext(temp_obj_type, 19)//Convert last part of path into an objective keyword. + if(!def_value)//If it's a custom objective, it will be an empty string. + def_value = "custom" + + var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "maroon", "debrain", "protect", "destroy", "prevent", "hijack", "escape", "survive", "martyr", "steal", "download", "nuclear", "capture", "absorb", "custom","follower block (HOG)","build (HOG)","deicide (HOG)", "follower escape (HOG)", "sacrifice prophet (HOG)") + if (!new_obj_type) return + + var/datum/objective/new_objective = null + + switch (new_obj_type) + if ("assassinate","protect","debrain","maroon") + var/list/possible_targets = list("Free objective") + for(var/datum/mind/possible_target in ticker.minds) + if ((possible_target != src) && istype(possible_target.current, /mob/living/carbon/human)) + possible_targets += possible_target.current + + var/mob/def_target = null + var/objective_list[] = list(/datum/objective/assassinate, /datum/objective/protect, /datum/objective/debrain, /datum/objective/maroon) + if (objective&&(objective.type in objective_list) && objective:target) + def_target = objective:target.current + + var/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets + if (!new_target) return + + var/objective_path = text2path("/datum/objective/[new_obj_type]") + if (new_target == "Free objective") + new_objective = new objective_path + new_objective.owner = src + new_objective:target = null + new_objective.explanation_text = "Free objective" + else + new_objective = new objective_path + new_objective.owner = src + new_objective:target = new_target:mind + //Will display as special role if the target is set as MODE. Ninjas/commandos/nuke ops. + new_objective.update_explanation_text() + + if ("destroy") + var/list/possible_targets = active_ais(1) + if(possible_targets.len) + var/mob/new_target = input("Select target:", "Objective target") as null|anything in possible_targets + new_objective = new /datum/objective/destroy + new_objective.target = new_target.mind + new_objective.owner = src + new_objective.update_explanation_text() + else + usr << "No active AIs with minds" + + if ("prevent") + new_objective = new /datum/objective/block + new_objective.owner = src + + if ("hijack") + new_objective = new /datum/objective/hijack + new_objective.owner = src + + if ("escape") + new_objective = new /datum/objective/escape + new_objective.owner = src + + if ("survive") + new_objective = new /datum/objective/survive + new_objective.owner = src + + if("martyr") + new_objective = new /datum/objective/martyr + new_objective.owner = src + + if ("nuclear") + new_objective = new /datum/objective/nuclear + new_objective.owner = src + + if ("steal") + if (!istype(objective, /datum/objective/steal)) + new_objective = new /datum/objective/steal + new_objective.owner = src + else + new_objective = objective + var/datum/objective/steal/steal = new_objective + if (!steal.select_target()) + return + + if("download","capture","absorb") + var/def_num + if(objective&&objective.type==text2path("/datum/objective/[new_obj_type]")) + def_num = objective.target_amount + + var/target_number = input("Input target number:", "Objective", def_num) as num|null + if (isnull(target_number))//Ordinarily, you wouldn't need isnull. In this case, the value may already exist. + return + + switch(new_obj_type) + if("download") + new_objective = new /datum/objective/download + new_objective.explanation_text = "Download [target_number] research levels." + if("capture") + new_objective = new /datum/objective/capture + new_objective.explanation_text = "Capture [target_number] lifeforms with an energy net. Live, rare specimens are worth more." + if("absorb") + new_objective = new /datum/objective/absorb + new_objective.explanation_text = "Absorb [target_number] compatible genomes." + new_objective.owner = src + new_objective.target_amount = target_number + + if("follower block (HOG)") + new_objective = new /datum/objective/follower_block + new_objective.owner = src + if("build (HOG)") + new_objective = new /datum/objective/build + new_objective.owner = src + if("deicide (HOG)") + new_objective = new /datum/objective/deicide + new_objective.owner = src + if("follower escape (HOG)") + new_objective = new /datum/objective/escape_followers + new_objective.owner = src + if("sacrifice prophet (HOG)") + new_objective = new /datum/objective/sacrifice_prophet + new_objective.owner = src + + if ("custom") + var/expl = stripped_input(usr, "Custom objective:", "Objective", objective ? objective.explanation_text : "") + if (!expl) return + new_objective = new /datum/objective + new_objective.owner = src + new_objective.explanation_text = expl + + if (!new_objective) return + + if (objective) + objectives -= objective + objectives.Insert(objective_pos, new_objective) + message_admins("[key_name_admin(usr)] edited [current]'s objective to [new_objective.explanation_text]") + log_admin("[key_name(usr)] edited [current]'s objective to [new_objective.explanation_text]") + else + objectives += new_objective + message_admins("[key_name_admin(usr)] added a new objective for [current]: [new_objective.explanation_text]") + log_admin("[key_name(usr)] added a new objective for [current]: [new_objective.explanation_text]") + + else if (href_list["obj_delete"]) + var/datum/objective/objective = locate(href_list["obj_delete"]) + if(!istype(objective)) return + objectives -= objective + message_admins("[key_name_admin(usr)] removed an objective for [current]: [objective.explanation_text]") + log_admin("[key_name(usr)] removed an objective for [current]: [objective.explanation_text]") + + else if(href_list["obj_completed"]) + var/datum/objective/objective = locate(href_list["obj_completed"]) + if(!istype(objective)) return + objective.completed = !objective.completed + log_admin("[key_name(usr)] toggled the win state for [current]'s objective: [objective.explanation_text]") + + else if (href_list["handofgod"]) + switch(href_list["handofgod"]) + if("clear") //wipe handofgod status + if((src in ticker.mode.red_deity_followers) || (src in ticker.mode.blue_deity_followers) || (src in ticker.mode.red_deity_prophets) || (src in ticker.mode.blue_deity_prophets)) + remove_hog_follower_prophet() + current << "You have been brainwashed... again! Your faith is no more!" + message_admins("[key_name_admin(usr)] has de-hand of god'ed [current].") + log_admin("[key_name(usr)] has de-hand of god'ed [current].") + + if("red follower") + make_Handofgod_follower("red") + message_admins("[key_name_admin(usr)] has red follower'ed [current].") + log_admin("[key_name(usr)] has red follower'ed [current].") + + if("red prophet") + make_Handofgod_prophet("red") + message_admins("[key_name_admin(usr)] has red prophet'ed [current].") + log_admin("[key_name(usr)] has red prophet'ed [current].") + + if("blue follower") + make_Handofgod_follower("blue") + message_admins("[key_name_admin(usr)] has blue follower'ed [current].") + log_admin("[key_name(usr)] has blue follower'ed [current].") + + if("blue prophet") + make_Handofgod_prophet("blue") + message_admins("[key_name_admin(usr)] has blue prophet'ed [current].") + log_admin("[key_name(usr)] has blue prophet'ed [current].") + + if("red god") + make_Handofgod_god("red") + message_admins("[key_name_admin(usr)] has red god'ed [current].") + log_admin("[key_name(usr)] has red god'ed [current].") + + if("blue god") + make_Handofgod_god("blue") + message_admins("[key_name_admin(usr)] has blue god'ed [current].") + log_admin("[key_name(usr)] has blue god'ed [current].") + + + else if (href_list["revolution"]) + switch(href_list["revolution"]) + if("clear") + remove_rev() + current << "You have been brainwashed! You are no longer a revolutionary!" + message_admins("[key_name_admin(usr)] has de-rev'ed [current].") + log_admin("[key_name(usr)] has de-rev'ed [current].") + if("rev") + if(src in ticker.mode.head_revolutionaries) + ticker.mode.head_revolutionaries -= src + ticker.mode.update_rev_icons_removed(src) + current << "Revolution has been disappointed of your leader traits! You are a regular revolutionary now!" + else if(!(src in ticker.mode.revolutionaries)) + current << " You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!" + else + return + ticker.mode.revolutionaries += src + ticker.mode.update_rev_icons_added(src) + special_role = "Revolutionary" + message_admins("[key_name_admin(usr)] has rev'ed [current].") + log_admin("[key_name(usr)] has rev'ed [current].") + + if("headrev") + if(src in ticker.mode.revolutionaries) + ticker.mode.revolutionaries -= src + ticker.mode.update_rev_icons_removed(src) + current << "You have proved your devotion to revoltion! Yea are a head revolutionary now!" + else if(!(src in ticker.mode.head_revolutionaries)) + current << "You are a member of the revolutionaries' leadership now!" + else + return + if (ticker.mode.head_revolutionaries.len>0) + // copy targets + var/datum/mind/valid_head = locate() in ticker.mode.head_revolutionaries + if (valid_head) + for (var/datum/objective/mutiny/O in valid_head.objectives) + var/datum/objective/mutiny/rev_obj = new + rev_obj.owner = src + rev_obj.target = O.target + rev_obj.explanation_text = "Assassinate [O.target.name], the [O.target.assigned_role]." + objectives += rev_obj + ticker.mode.greet_revolutionary(src,0) + ticker.mode.head_revolutionaries += src + ticker.mode.update_rev_icons_added(src) + special_role = "Head Revolutionary" + message_admins("[key_name_admin(usr)] has head-rev'ed [current].") + log_admin("[key_name(usr)] has head-rev'ed [current].") + + if("autoobjectives") + ticker.mode.forge_revolutionary_objectives(src) + ticker.mode.greet_revolutionary(src,0) + usr << "The objectives for revolution have been generated and shown to [key]" + + if("flash") + if (!ticker.mode.equip_revolutionary(current)) + usr << "Spawning flash failed!" + + if("takeflash") + var/list/L = current.get_contents() + var/obj/item/device/assembly/flash/flash = locate() in L + if (!flash) + usr << "Deleting flash failed!" + qdel(flash) + + if("repairflash") + var/list/L = current.get_contents() + var/obj/item/device/assembly/flash/flash = locate() in L + if (!flash) + usr << "Repairing flash failed!" + else + flash.crit_fail = 0 + flash.update_icon() + + + +//////////////////// GANG MODE + + else if (href_list["gang"]) + switch(href_list["gang"]) + if("clear") + remove_gang() + message_admins("[key_name_admin(usr)] has de-gang'ed [current].") + log_admin("[key_name(usr)] has de-gang'ed [current].") + + if("equip") + switch(ticker.mode.equip_gang(current,gang_datum)) + if(1) + usr << "Unable to equip territory spraycan!" + if(2) + usr << "Unable to equip recruitment pen and spraycan!" + if(3) + usr << "Unable to equip gangtool, pen, and spraycan!" + + if("takeequip") + var/list/L = current.get_contents() + for(var/obj/item/weapon/pen/gang/pen in L) + qdel(pen) + for(var/obj/item/device/gangtool/gangtool in L) + qdel(gangtool) + for(var/obj/item/toy/crayon/spraycan/gang/SC in L) + qdel(SC) + + if("new") + if(gang_colors_pool.len) + var/list/names = list("Random") + gang_name_pool + var/gangname = input("Pick a gang name.","Select Name") as null|anything in names + if(gangname && gang_colors_pool.len) //Check again just in case another admin made max gangs at the same time + if(!(gangname in gang_name_pool)) + gangname = null + var/datum/gang/newgang = new(null,gangname) + ticker.mode.gangs += newgang + message_admins("[key_name_admin(usr)] has created the [newgang.name] Gang.") + log_admin("[key_name(usr)] has created the [newgang.name] Gang.") + + else if (href_list["gangboss"]) + var/datum/gang/G = locate(href_list["gangboss"]) in ticker.mode.gangs + if(!G || (src in G.bosses)) + return + ticker.mode.remove_gangster(src,0,2,1) + G.bosses += src + gang_datum = G + special_role = "[G.name] Gang Boss" + G.add_gang_hud(src) + current << "You are a [G.name] Gang Boss!" + message_admins("[key_name_admin(usr)] has added [current] to the [G.name] Gang leadership.") + log_admin("[key_name(usr)] has added [current] to the [G.name] Gang leadership.") + ticker.mode.forge_gang_objectives(src) + ticker.mode.greet_gang(src,0) + + else if (href_list["gangster"]) + var/datum/gang/G = locate(href_list["gangster"]) in ticker.mode.gangs + if(!G || (src in G.gangsters)) + return + ticker.mode.remove_gangster(src,0,2,1) + ticker.mode.add_gangster(src,G,0) + message_admins("[key_name_admin(usr)] has added [current] to the [G.name] Gang (A).") + log_admin("[key_name(usr)] has added [current] to the [G.name] Gang (A).") + +///////////////////////////////// + + + + else if (href_list["cult"]) + switch(href_list["cult"]) + if("clear") + remove_cultist() + current << "You have been brainwashed! You are no longer a cultist!" + message_admins("[key_name_admin(usr)] has de-cult'ed [current].") + log_admin("[key_name(usr)] has de-cult'ed [current].") + if("cultist") + if(!(src in ticker.mode.cult)) + ticker.mode.add_cultist(src) + message_admins("[key_name_admin(usr)] has cult'ed [current].") + log_admin("[key_name(usr)] has cult'ed [current].") + if("equip") + if (!ticker.mode.equip_cultist(current)) + usr << "equip_cultist() failed! [current]'s starting equipment will be incomplete." + + else if (href_list["wizard"]) + switch(href_list["wizard"]) + if("clear") + remove_wizard() + current << "You have been brainwashed! You are no longer a wizard!" + log_admin("[key_name(usr)] has de-wizard'ed [current].") + if("wizard") + if(!(src in ticker.mode.wizards)) + ticker.mode.wizards += src + special_role = "Wizard" + //ticker.mode.learn_basic_spells(current) + current << "You are the Space Wizard!" + message_admins("[key_name_admin(usr)] has wizard'ed [current].") + log_admin("[key_name(usr)] has wizard'ed [current].") + if("lair") + current.loc = pick(wizardstart) + if("dressup") + ticker.mode.equip_wizard(current) + if("name") + ticker.mode.name_wizard(current) + if("autoobjectives") + ticker.mode.forge_wizard_objectives(src) + usr << "The objectives for wizard [key] have been generated. You can edit them and anounce manually." + + else if (href_list["changeling"]) + switch(href_list["changeling"]) + if("clear") + remove_changeling() + current << "You grow weak and lose your powers! You are no longer a changeling and are stuck in your current form!" + message_admins("[key_name_admin(usr)] has de-changeling'ed [current].") + log_admin("[key_name(usr)] has de-changeling'ed [current].") + if("changeling") + if(!(src in ticker.mode.changelings)) + ticker.mode.changelings += src + current.make_changeling() + special_role = "Changeling" + current << "Your powers are awoken. A flash of memory returns to us...we are [changeling.changelingID], a changeling!" + message_admins("[key_name_admin(usr)] has changeling'ed [current].") + log_admin("[key_name(usr)] has changeling'ed [current].") + if("autoobjectives") + ticker.mode.forge_changeling_objectives(src) + usr << "The objectives for changeling [key] have been generated. You can edit them and anounce manually." + + if("initialdna") + if( !changeling || !changeling.stored_profiles.len || !istype(current, /mob/living/carbon)) + usr << "Resetting DNA failed!" + else + var/mob/living/carbon/C = current + changeling.first_prof.dna.transfer_identity(C, transfer_SE=1) + C.real_name = changeling.first_prof.name + C.updateappearance(mutcolor_update=1) + C.domutcheck() + + else if (href_list["nuclear"]) + switch(href_list["nuclear"]) + if("clear") + remove_nukeop() + current << "You have been brainwashed! You are no longer a syndicate operative!" + message_admins("[key_name_admin(usr)] has de-nuke op'ed [current].") + log_admin("[key_name(usr)] has de-nuke op'ed [current].") + if("nuclear") + if(!(src in ticker.mode.syndicates)) + ticker.mode.syndicates += src + ticker.mode.update_synd_icons_added(src) + if (ticker.mode.syndicates.len==1) + ticker.mode.prepare_syndicate_leader(src) + else + current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]" + special_role = "Syndicate" + assigned_role = "Syndicate" + current << "You are a [syndicate_name()] agent!" + ticker.mode.forge_syndicate_objectives(src) + ticker.mode.greet_syndicate(src) + message_admins("[key_name_admin(usr)] has nuke op'ed [current].") + log_admin("[key_name(usr)] has nuke op'ed [current].") + if("lair") + current.loc = get_turf(locate("landmark*Syndicate-Spawn")) + if("dressup") + var/mob/living/carbon/human/H = current + qdel(H.belt) + qdel(H.back) + qdel(H.ears) + qdel(H.gloves) + qdel(H.head) + qdel(H.shoes) + qdel(H.wear_id) + qdel(H.wear_suit) + qdel(H.w_uniform) + + if (!ticker.mode.equip_syndicate(current)) + usr << "Equipping a syndicate failed!" + if("tellcode") + var/code + for (var/obj/machinery/nuclearbomb/bombue in machines) + if (length(bombue.r_code) <= 5 && bombue.r_code != "LOLNO" && bombue.r_code != "ADMIN") + code = bombue.r_code + break + if (code) + store_memory("Syndicate Nuclear Bomb Code: [code]", 0, 0) + current << "The nuclear authorization code is: [code]" + else + usr << "No valid nuke found!" + + else if (href_list["traitor"]) + switch(href_list["traitor"]) + if("clear") + remove_traitor() + current << "You have been brainwashed! You are no longer a traitor!" + message_admins("[key_name_admin(usr)] has de-traitor'ed [current].") + log_admin("[key_name(usr)] has de-traitor'ed [current].") + + if("traitor") + if(!(src in ticker.mode.traitors)) + ticker.mode.traitors += src + special_role = "traitor" + current << "You are a traitor!" + message_admins("[key_name_admin(usr)] has traitor'ed [current].") + log_admin("[key_name(usr)] has traitor'ed [current].") + if(isAI(current)) + var/mob/living/silicon/ai/A = current + ticker.mode.add_law_zero(A) + A.show_laws() + + if("autoobjectives") + ticker.mode.forge_traitor_objectives(src) + usr << "The objectives for traitor [key] have been generated. You can edit them and anounce manually." + + else if(href_list["shadowling"]) + switch(href_list["shadowling"]) + if("clear") + ticker.mode.update_shadow_icons_removed(src) + if(src in ticker.mode.shadows) + ticker.mode.shadows -= src + special_role = null + current << "Your powers have been quenched! You are no longer a shadowling!" + remove_spell(/obj/effect/proc_holder/spell/self/shadowling_hatch) + remove_spell(/obj/effect/proc_holder/spell/self/shadowling_ascend) + remove_spell(/obj/effect/proc_holder/spell/targeted/enthrall) + remove_spell(/obj/effect/proc_holder/spell/self/shadowling_hivemind) + message_admins("[key_name_admin(usr)] has de-shadowling'ed [current].") + log_admin("[key_name(usr)] has de-shadowling'ed [current].") + else if(src in ticker.mode.thralls) + ticker.mode.remove_thrall(src,0) + message_admins("[key_name_admin(usr)] has de-thrall'ed [current].") + log_admin("[key_name(usr)] has de-thrall'ed [current].") + if("shadowling") + if(!ishuman(current)) + usr << "This only works on humans!" + return + ticker.mode.shadows += src + special_role = "shadowling" + current << "Something stirs deep in your mind. A red light floods your vision, and slowly you remember. Though your human disguise has served you well, the \ + time is nigh to cast it off and enter your true form. You have disguised yourself amongst the humans, but you are not one of them. You are a shadowling, and you are to ascend at all costs.\ + " + ticker.mode.finalize_shadowling(src) + ticker.mode.update_shadow_icons_added(src) + if("thrall") + if(!ishuman(current)) + usr << "This only works on humans!" + return + ticker.mode.add_thrall(src) + message_admins("[key_name_admin(usr)] has thrall'ed [current].") + log_admin("[key_name(usr)] has thrall'ed [current].") + + else if(href_list["abductor"]) + switch(href_list["abductor"]) + if("clear") + usr << "Not implemented yet. Sorry!" + if("abductor") + if(!ishuman(current)) + usr << "This only works on humans!" + return + make_Abductor() + log_admin("[key_name(usr)] turned [current] into abductor.") + if("equip") + var/gear = alert("Agent or Scientist Gear","Gear","Agent","Scientist") + if(gear) + var/datum/game_mode/abduction/temp = new + temp.equip_common(current) + if(gear=="Agent") + temp.equip_agent(current) + else + temp.equip_scientist(current) + + else if (href_list["monkey"]) + var/mob/living/L = current + if (L.notransform) + return + switch(href_list["monkey"]) + if("healthy") + if (check_rights(R_ADMIN)) + var/mob/living/carbon/human/H = current + var/mob/living/carbon/monkey/M = current + if (istype(H)) + log_admin("[key_name(usr)] attempting to monkeyize [key_name(current)]") + message_admins("[key_name_admin(usr)] attempting to monkeyize [key_name_admin(current)]") + src = null + M = H.monkeyize() + src = M.mind + //world << "DEBUG: \"healthy\": M=[M], M.mind=[M.mind], src=[src]!" + else if (istype(M) && length(M.viruses)) + for(var/datum/disease/D in M.viruses) + D.cure(0) + sleep(0) //because deleting of virus is done through spawn(0) + if("infected") + if (check_rights(R_ADMIN, 0)) + var/mob/living/carbon/human/H = current + var/mob/living/carbon/monkey/M = current + if (istype(H)) + log_admin("[key_name(usr)] attempting to monkeyize and infect [key_name(current)]") + message_admins("[key_name_admin(usr)] attempting to monkeyize and infect [key_name_admin(current)]") + src = null + M = H.monkeyize() + src = M.mind + current.ForceContractDisease(new /datum/disease/transformation/jungle_fever) + else if (istype(M)) + current.ForceContractDisease(new /datum/disease/transformation/jungle_fever) + if("human") + if (check_rights(R_ADMIN, 0)) + var/mob/living/carbon/human/H = current + var/mob/living/carbon/monkey/M = current + if (istype(M)) + for(var/datum/disease/D in M.viruses) + if (istype(D,/datum/disease/transformation/jungle_fever)) + D.cure(0) + sleep(0) //because deleting of virus is doing throught spawn(0) + log_admin("[key_name(usr)] attempting to humanize [key_name(current)]") + message_admins("[key_name_admin(usr)] attempting to humanize [key_name_admin(current)]") + H = M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG) + if(H) + src = H.mind + + else if (href_list["silicon"]) + switch(href_list["silicon"]) + if("unemag") + var/mob/living/silicon/robot/R = current + if (istype(R)) + R.SetEmagged(0) + message_admins("[key_name_admin(usr)] has unemag'ed [R].") + log_admin("[key_name(usr)] has unemag'ed [R].") + + if("unemagcyborgs") + if (istype(current, /mob/living/silicon/ai)) + var/mob/living/silicon/ai/ai = current + for (var/mob/living/silicon/robot/R in ai.connected_robots) + R.SetEmagged(0) + message_admins("[key_name_admin(usr)] has unemag'ed [ai]'s Cyborgs.") + log_admin("[key_name(usr)] has unemag'ed [ai]'s Cyborgs.") + + else if (href_list["common"]) + switch(href_list["common"]) + if("undress") + for(var/obj/item/W in current) + current.unEquip(W, 1) //The 1 forces all items to drop, since this is an admin undress. + if("takeuplink") + take_uplink() + memory = null//Remove any memory they may have had. + log_admin("[key_name(usr)] removed [current]'s uplink.") + if("crystals") + if (check_rights(R_FUN, 0)) + var/obj/item/device/uplink/hidden/suplink = find_syndicate_uplink() + var/crystals + if (suplink) + crystals = suplink.uses + crystals = input("Amount of telecrystals for [key]","Syndicate uplink", crystals) as null|num + if (!isnull(crystals)) + if (suplink) + suplink.uses = crystals + message_admins("[key_name_admin(usr)] changed [current]'s telecrystal count to [crystals].") + log_admin("[key_name(usr)] changed [current]'s telecrystal count to [crystals].") + if("uplink") + if (!ticker.mode.equip_traitor(current, !(src in ticker.mode.traitors))) + usr << "Equipping a syndicate failed!" + log_admin("[key_name(usr)] attempted to give [current] an uplink.") + + else if (href_list["obj_announce"]) + var/obj_count = 1 + current << "Your current objectives:" + for(var/datum/objective/objective in objectives) + current << "Objective #[obj_count]: [objective.explanation_text]" + obj_count++ + + edit_memory() + +/datum/mind/proc/find_syndicate_uplink() + var/list/L = current.get_contents() + for (var/obj/item/I in L) + if (I.hidden_uplink) + return I.hidden_uplink + return null + +/datum/mind/proc/take_uplink() + var/obj/item/device/uplink/hidden/H = find_syndicate_uplink() + if(H) + qdel(H) + +/datum/mind/proc/make_Traitor() + if(!(src in ticker.mode.traitors)) + ticker.mode.traitors += src + special_role = "traitor" + ticker.mode.forge_traitor_objectives(src) + ticker.mode.finalize_traitor(src) + ticker.mode.greet_traitor(src) + +/datum/mind/proc/make_Nuke(turf/spawnloc,nuke_code,leader=0, telecrystals = TRUE) + if(!(src in ticker.mode.syndicates)) + ticker.mode.syndicates += src + ticker.mode.update_synd_icons_added(src) + special_role = "Syndicate" + ticker.mode.forge_syndicate_objectives(src) + ticker.mode.greet_syndicate(src) + + current.loc = spawnloc + + var/mob/living/carbon/human/H = current + qdel(H.belt) + qdel(H.back) + qdel(H.ears) + qdel(H.gloves) + qdel(H.head) + qdel(H.shoes) + qdel(H.wear_id) + qdel(H.wear_suit) + qdel(H.w_uniform) + + ticker.mode.equip_syndicate(current, telecrystals) + + if (nuke_code) + store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0) + current << "The nuclear authorization code is: [nuke_code]" + + if (leader) + ticker.mode.prepare_syndicate_leader(src,nuke_code) + else + current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]" + +/datum/mind/proc/make_Changling() + if(!(src in ticker.mode.changelings)) + ticker.mode.changelings += src + current.make_changeling() + special_role = "Changeling" + ticker.mode.forge_changeling_objectives(src) + ticker.mode.greet_changeling(src) + +/datum/mind/proc/make_Wizard() + if(!(src in ticker.mode.wizards)) + ticker.mode.wizards += src + special_role = "Wizard" + assigned_role = "Wizard" + //ticker.mode.learn_basic_spells(current) + if(!wizardstart.len) + current.loc = pick(latejoin) + current << "HOT INSERTION, GO GO GO" + else + current.loc = pick(wizardstart) + + ticker.mode.equip_wizard(current) + for(var/obj/item/weapon/spellbook/S in current.contents) + S.op = 0 + ticker.mode.name_wizard(current) + ticker.mode.forge_wizard_objectives(src) + ticker.mode.greet_wizard(src) + + +/datum/mind/proc/make_Cultist() + if(!(src in ticker.mode.cult)) + ticker.mode.cult += src + ticker.mode.update_cult_icons_added(src) + special_role = "Cultist" + current << "You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie." + current << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back." + current << "Your objective is to summon Nar-Sie by building and defending a suitable shell for the Geometer. Adequate supplies can be procured through human sacrifices." + ticker.mode.equip_cultist(current) + +/datum/mind/proc/make_Rev() + if (ticker.mode.head_revolutionaries.len>0) + // copy targets + var/datum/mind/valid_head = locate() in ticker.mode.head_revolutionaries + if (valid_head) + for (var/datum/objective/mutiny/O in valid_head.objectives) + var/datum/objective/mutiny/rev_obj = new + rev_obj.owner = src + rev_obj.target = O.target + rev_obj.explanation_text = "Assassinate [O.target.current.real_name], the [O.target.assigned_role]." + objectives += rev_obj + ticker.mode.greet_revolutionary(src,0) + ticker.mode.head_revolutionaries += src + ticker.mode.update_rev_icons_added(src) + special_role = "Head Revolutionary" + + ticker.mode.forge_revolutionary_objectives(src) + ticker.mode.greet_revolutionary(src,0) + + var/list/L = current.get_contents() + var/obj/item/device/assembly/flash/flash = locate() in L + qdel(flash) + take_uplink() + var/fail = 0 +// fail |= !ticker.mode.equip_traitor(current, 1) + fail |= !ticker.mode.equip_revolutionary(current) + + +/datum/mind/proc/make_Gang(datum/gang/G) + special_role = "[G.name] Gang Boss" + G.bosses += src + gang_datum = G + G.add_gang_hud(src) + ticker.mode.forge_gang_objectives(src) + ticker.mode.greet_gang(src) + ticker.mode.equip_gang(current,G) + +/datum/mind/proc/make_Abductor() + var/role = alert("Abductor Role ?","Role","Agent","Scientist") + var/team = input("Abductor Team ?","Team ?") in list(1,2,3,4) + var/teleport = alert("Teleport to ship ?","Teleport","Yes","No") + + if(!role || !team || !teleport) + return + + if(!ishuman(current)) + return + + ticker.mode.abductors |= src + + var/datum/objective/experiment/O = new + O.owner = src + objectives += O + + var/mob/living/carbon/human/H = current + + H.set_species(/datum/species/abductor) + var/datum/species/abductor/S = H.dna.species + + switch(role) + if("Agent") + S.agent = 1 + if("Scientist") + S.scientist = 1 + S.team = team + + var/list/obj/effect/landmark/abductor/agent_landmarks = new + var/list/obj/effect/landmark/abductor/scientist_landmarks = new + agent_landmarks.len = 4 + scientist_landmarks.len = 4 + for(var/obj/effect/landmark/abductor/A in landmarks_list) + if(istype(A,/obj/effect/landmark/abductor/agent)) + agent_landmarks[text2num(A.team)] = A + else if(istype(A,/obj/effect/landmark/abductor/scientist)) + scientist_landmarks[text2num(A.team)] = A + + var/obj/effect/landmark/L + if(teleport=="Yes") + switch(role) + if("Agent") + S.agent = 1 + L = agent_landmarks[team] + H.loc = L.loc + if("Scientist") + S.scientist = 1 + L = agent_landmarks[team] + H.loc = L.loc + + +/datum/mind/proc/make_Handofgod_follower(colour) + . = 0 + switch(colour) + if("red") + //Remove old allegiances + if(src in ticker.mode.blue_deity_followers || src in ticker.mode.blue_deity_prophets) + current << "You are no longer a member of the Blue cult!" + + ticker.mode.blue_deity_followers -= src + ticker.mode.blue_deity_prophets -= src + current.faction |= "red god" + current.faction -= "blue god" + + if(src in ticker.mode.red_deity_prophets) + current << "You have lost the connection with your deity, but you still believe in their grand design, You are no longer a prophet!" + ticker.mode.red_deity_prophets -= src + + ticker.mode.red_deity_followers |= src + current << "You are now a follower of the red cult's god!" + + special_role = "Hand of God: Red Follower" + . = 1 + if("blue") + //Remove old allegiances + if(src in ticker.mode.red_deity_followers || src in ticker.mode.red_deity_prophets) + current << "You are no longer a member of the Red cult!" + + ticker.mode.red_deity_followers -= src + ticker.mode.red_deity_prophets -= src + current.faction -= "red god" + current.faction |= "blue god" + + if(src in ticker.mode.blue_deity_prophets) + current << "You have lost the connection with your deity, but you still believe in their grand design, You are no longer a prophet!" + ticker.mode.blue_deity_prophets -= src + + ticker.mode.blue_deity_followers |= src + current << "You are now a follower of the blue cult's god!" + + special_role = "Hand of God: Blue Follower" + . = 1 + else + return 0 + + ticker.mode.update_hog_icons_removed(src,"red") + ticker.mode.update_hog_icons_removed(src,"blue") + //ticker.mode.greet_hog_follower(src,colour) + ticker.mode.update_hog_icons_added(src, colour) + +/datum/mind/proc/make_Handofgod_prophet(colour) + . = 0 + switch(colour) + if("red") + //Remove old allegiances + + if(src in ticker.mode.blue_deity_followers || src in ticker.mode.blue_deity_prophets) + current << "You are no longer a member of the Blue cult!" + current.faction -= "blue god" + current.faction |= "red god" + + ticker.mode.blue_deity_followers -= src + ticker.mode.blue_deity_prophets -= src + ticker.mode.red_deity_followers -= src + + ticker.mode.red_deity_prophets |= src + current << "You are now a prophet of the red cult's god!" + + special_role = "Hand of God: Red Prophet" + . = 1 + if("blue") + //Remove old allegiances + + if(src in ticker.mode.red_deity_followers || src in ticker.mode.red_deity_prophets) + current << "You are no longer a member of the Red cult!" + current.faction -= "red god" + current.faction |= "blue god" + + ticker.mode.red_deity_followers -= src + ticker.mode.red_deity_prophets -= src + ticker.mode.blue_deity_followers -= src + + ticker.mode.blue_deity_prophets |= src + current << "You are now a prophet of the blue cult's god!" + + special_role = "Hand of God: Blue Prophet" + . = 1 + + else + return 0 + + ticker.mode.update_hog_icons_removed(src,"red") + ticker.mode.update_hog_icons_removed(src,"blue") + ticker.mode.greet_hog_follower(src,colour) + ticker.mode.update_hog_icons_added(src, colour) + + +/datum/mind/proc/make_Handofgod_god(colour) + switch(colour) + if("red") + current.become_god("red") + ticker.mode.add_god(src,"red") + if("blue") + current.become_god("blue") + ticker.mode.add_god(src,"blue") + else + return 0 + ticker.mode.forge_deity_objectives(src) + ticker.mode.remove_hog_follower(src,0) + ticker.mode.update_hog_icons_added(src, colour) +// ticker.mode.greet_hog_follower(src,colour) + return 1 + + +/datum/mind/proc/AddSpell(obj/effect/proc_holder/spell/spell) + spell_list += spell + if(!spell.action) + spell.action = new/datum/action/spell_action + spell.action.target = spell + spell.action.name = spell.name + spell.action.button_icon = spell.action_icon + spell.action.button_icon_state = spell.action_icon_state + spell.action.background_icon_state = spell.action_background_icon_state + spell.action.Grant(current) + return +/datum/mind/proc/transfer_actions(mob/living/new_character) + if(current && current.actions) + for(var/datum/action/A in current.actions) + A.Grant(new_character) + transfer_mindbound_actions(new_character) + +/datum/mind/proc/transfer_mindbound_actions(var/mob/living/new_character) + for(var/obj/effect/proc_holder/spell/spell in spell_list) + if(!spell.action) // Unlikely but whatever + spell.action = new/datum/action/spell_action + spell.action.target = spell + spell.action.name = spell.name + spell.action.button_icon = spell.action_icon + spell.action.button_icon_state = spell.action_icon_state + spell.action.background_icon_state = spell.action_background_icon_state + spell.action.Grant(new_character) + return + +/mob/proc/sync_mind() + mind_initialize() //updates the mind (or creates and initializes one if one doesn't exist) + mind.active = 1 //indicates that the mind is currently synced with a client + +/mob/new_player/sync_mind() + return + +/mob/dead/observer/sync_mind() + return + +//Initialisation procs +/mob/proc/mind_initialize() + if(mind) + mind.key = key + + else + mind = new /datum/mind(key) + if(ticker) + ticker.minds += mind + else + spawn(0) + throw EXCEPTION("mind_initialize(): No ticker ready") + if(!mind.name) mind.name = real_name + mind.current = src + +//HUMAN +/mob/living/carbon/human/mind_initialize() + ..() + if(!mind.assigned_role) mind.assigned_role = "Assistant" //defualt + +//MONKEY +/mob/living/carbon/monkey/mind_initialize() + ..() + +//slime +/mob/living/simple_animal/slime/mind_initialize() + ..() + mind.special_role = "slime" + mind.assigned_role = "slime" + +//XENO +/mob/living/carbon/alien/mind_initialize() + ..() + mind.special_role = "Alien" + mind.assigned_role = "Alien" + //XENO HUMANOID +/mob/living/carbon/alien/humanoid/royal/queen/mind_initialize() + ..() + mind.special_role = "Queen" + +/mob/living/carbon/alien/humanoid/royal/praetorian/mind_initialize() + ..() + mind.special_role = "Praetorian" + +/mob/living/carbon/alien/humanoid/hunter/mind_initialize() + ..() + mind.special_role = "Hunter" + +/mob/living/carbon/alien/humanoid/drone/mind_initialize() + ..() + mind.special_role = "Drone" + +/mob/living/carbon/alien/humanoid/sentinel/mind_initialize() + ..() + mind.special_role = "Sentinel" + //XENO LARVA +/mob/living/carbon/alien/larva/mind_initialize() + ..() + mind.special_role = "Larva" + +//AI +/mob/living/silicon/ai/mind_initialize() + ..() + mind.assigned_role = "AI" + +//BORG +/mob/living/silicon/robot/mind_initialize() + ..() + mind.assigned_role = "Cyborg" + +//PAI +/mob/living/silicon/pai/mind_initialize() + ..() + mind.assigned_role = "pAI" + mind.special_role = "" + +//BLOB +/mob/camera/blob/mind_initialize() + ..() + mind.special_role = "Blob" + +//Animals +/mob/living/simple_animal/mind_initialize() + ..() + mind.assigned_role = "Animal" + mind.special_role = "Animal" + +/mob/living/simple_animal/pet/dog/corgi/mind_initialize() + ..() + mind.assigned_role = "Corgi" + mind.special_role = "Corgi" + +/mob/living/simple_animal/shade/mind_initialize() + ..() + mind.assigned_role = "Shade" + mind.special_role = "Shade" + +/mob/living/simple_animal/hostile/construct/mind_initialize() + ..() + mind.assigned_role = "[initial(name)]" mind.special_role = "Cultist" + diff --git a/code/datums/modules.dm b/code/datums/modules.dm deleted file mode 100644 index af693456543..00000000000 --- a/code/datums/modules.dm +++ /dev/null @@ -1,62 +0,0 @@ -// module datum. -// this is per-object instance, and shows the condition of the modules in the object -// actual modules needed is referenced through modulestypes and the object type - -/datum/module - var/status // bits set if working, 0 if broken - var/installed // bits set if installed, 0 if missing - -// moduletypes datum -// this is per-object type, and shows the modules needed for a type of object - -/datum/moduletypes - var/list/modcount = list() // assoc list of the count of modules for a type - - -var/list/modules = list( // global associative list -"/obj/machinery/power/apc" = "card_reader,power_control,id_auth,cell_power,cell_charge") - - -/datum/module/New(var/obj/O) - - var/type = O.type // the type of the creating object - - var/mneed = mods.inmodlist(type) // find if this type has modules defined - - if(!mneed) // not found in module list? - qdel(src) // delete self, thus ending proc - - var/needed = mods.getbitmask(type) // get a bitmask for the number of modules in this object - status = needed - installed = needed - -/datum/moduletypes/proc/addmod(type, modtextlist) - modules += type // index by type text - modules[type] = modtextlist - -/datum/moduletypes/proc/inmodlist(type) - return ("[type]" in modules) - -/datum/moduletypes/proc/getbitmask(type) - var/count = modcount["[type]"] - if(count) - return 2**count-1 - - var/modtext = modules["[type]"] - var/num = 1 - var/pos = 1 - - while(1) - pos = findtext(modtext, ",", pos, 0) - if(!pos) - break - else - pos++ - num++ - - modcount += "[type]" - modcount["[type]"] = num - - return 2**num-1 - - diff --git a/code/datums/spells/infinite_guns.dm b/code/datums/spells/infinite_guns.dm index e74ac7af043..10b8612c858 100644 --- a/code/datums/spells/infinite_guns.dm +++ b/code/datums/spells/infinite_guns.dm @@ -6,7 +6,7 @@ range = -1 school = "conjuration" - charge_max = 300 + charge_max = 750 clothes_req = 1 cooldown_min = 10 //Gun wizard action_icon_state = "bolt_action" diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index b79afa72ee4..9f1e620b033 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -63,6 +63,7 @@ var/list/uplink_items = list() var/list/gamemodes = list() // Empty list means it is in all the gamemodes. Otherwise place the gamemode name here. var/list/excludefrom = list() //Empty list does nothing. Place the name of gamemode you don't want this item to be available in here. This is so you dont have to list EVERY mode to exclude something. var/surplus = 100 //Chance of being included in the surplus crate (when pick() selects it) + var/refundable = FALSE /datum/uplink_item/proc/spawn_item(turf/loc, obj/item/device/uplink/U) if(item) @@ -332,12 +333,7 @@ var/list/uplink_items = list() cost = 25 gamemodes = list(/datum/game_mode/nuclear) surplus = 0 - -/datum/uplink_item/dangerous/reinforcement/spawn_item() - var/obj/item/weapon/antag_spawner/nuke_ops/T = ..() - if(istype(T)) - T.TC_cost = cost - + refundable = TRUE /datum/uplink_item/dangerous/guardian name = "Holoparasites" @@ -1049,7 +1045,7 @@ var/list/uplink_items = list() buyable_items += temp_uplink_list[category] var/list/bought_items = list() U.uses -= cost - U.used_TC = 20 + U.used_TC += 20 var/remaining_TC = 50 var/datum/uplink_item/I diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 2d979f712bf..1846247a260 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -740,7 +740,7 @@ var/list/teleportlocs = list() music = 'sound/ambience/signal.ogg' /area/medical/patients_rooms - name = "Patient's Rooms" + name = "Patients' Rooms" icon_state = "patients" /area/medical/cmo @@ -1142,7 +1142,7 @@ var/list/teleportlocs = list() icon_state = "yellow" /area/construction/quarters - name = "Engineer's Quarters" + name = "Engineers' Quarters" icon_state = "yellow" /area/construction/qmaint diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index a3c326abfa1..fe2a2e34cbc 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -295,3 +295,23 @@ if(buckled_mob == mover) return 1 return ..() + + +/atom/movable/proc/get_spacemove_backup() + var/atom/movable/dense_object_backup + for(var/A in orange(1, get_turf(src))) + if(isarea(A)) + continue + else if(isturf(A)) + var/turf/turf = A + if(!turf.density) + continue + return turf + else + var/atom/movable/AM = A + if(!AM.CanPass(src) || AM.density) + if(AM.anchored) + return AM + dense_object_backup = AM + break + . = dense_object_backup \ No newline at end of file diff --git a/code/game/communications.dm b/code/game/communications.dm index d9c1595ec2e..2052b793936 100644 --- a/code/game/communications.dm +++ b/code/game/communications.dm @@ -40,7 +40,7 @@ obj/proc/receive_signal(datum/signal/signal, var/receive_method as num, var/receive_param) Handler from received signals. By default does nothing. Define your own for your object. - Avoid of sending signals directly from this proc, use spawn(-1). Do not use sleep() here please. + Avoid of sending signals directly from this proc, use spawn(0). Do not use sleep() here please. parameters: signal - see description below. Extract all needed data from the signal before doing sleep(), spawn() or return! receive_method - may be TRANSMISSION_WIRE or TRANSMISSION_RADIO. diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index d61bb3607e1..1fb027a8844 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -92,13 +92,14 @@ M << "Your service has not gone unrewarded, however. Studying under [usr.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap." equip_antag(M) - var/mob/living/carbon/human/H = usr var/wizard_name_first = pick(wizard_first) var/wizard_name_second = pick(wizard_second) var/randomname = "[wizard_name_first] [wizard_name_second]" - var/datum/objective/default/protect/new_objective = add_objective(M.mind, /datum/objective/default/protect) - new_objective.target = H.mind - new_objective.explanation_text = "Protect [H.real_name], the wizard." + var/datum/objective/protect/new_objective = new /datum/objective/protect + new_objective.owner = M:mind + new_objective:target = usr:mind + new_objective.explanation_text = "Protect [usr.real_name], the wizard." + M.mind.objectives += new_objective ticker.mode.apprentices += M.mind M.mind.special_role = "apprentice" ticker.mode.update_wiz_icons_added(M.mind) @@ -134,7 +135,6 @@ desc = "A single-use teleporter designed to quickly reinforce operatives in the field." icon = 'icons/obj/device.dmi' icon_state = "locator" - var/TC_cost = 0 var/borg_to_spawn var/list/possible_types = list("Assault", "Medical") @@ -163,6 +163,7 @@ var/datum/effect_system/spark_spread/S = new /datum/effect_system/spark_spread S.set_up(4, 1, src) S.start() + qdel(src) else user << "Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded." @@ -251,9 +252,11 @@ S.mind.assigned_role = "Slaughter Demon" S.mind.special_role = "Slaughter Demon" ticker.mode.traitors += S.mind - var/datum/objective/default/assassinate/new_objective = add_objective(S.mind, /datum/objective/default/assassinate) + var/datum/objective/assassinate/new_objective = new /datum/objective/assassinate + new_objective.owner = S.mind new_objective.target = usr.mind new_objective.explanation_text = "Kill [usr.real_name], the one who summoned you." + S.mind.objectives += new_objective var/datum/objective/new_objective2 = new /datum/objective new_objective2.owner = S.mind new_objective2.explanation_text = "Kill everyone else while you're at it." @@ -261,4 +264,4 @@ S << S.playstyle_string S << "You are currently not currently in the same plane of existence as the station. Ctrl+Click a blood pool to manifest." S << "Objective #[1]: [new_objective.explanation_text]" - S << "Objective #[2]: [new_objective2.explanation_text]" \ No newline at end of file + S << "Objective #[2]: [new_objective2.explanation_text]" diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm index 7771469a545..4a6d5c55481 100644 --- a/code/game/gamemodes/blob/blobs/core.dm +++ b/code/game/gamemodes/blob/blobs/core.dm @@ -8,6 +8,8 @@ explosion_block = 6 point_return = -1 atmosblock = 1 + health_regen = 0 //we regen in Life() instead of when pulsed + var/core_regen = 2 var/overmind_get_delay = 0 //we don't want to constantly try to find an overmind, this var tracks when we'll try to get an overmind again var/resource_delay = 0 var/point_rate = 2 @@ -34,9 +36,6 @@ var/image/C = new('icons/mob/blob.dmi', "blob_core_overlay") overlays += C -/obj/effect/blob/core/PulseAnimation() - return - /obj/effect/blob/core/Destroy() blob_cores -= src if(overmind) @@ -56,9 +55,6 @@ if(overmind) //we should have an overmind, but... overmind.update_health() -/obj/effect/blob/core/RegenHealth() - return // Don't regen, we handle it in Life() - /obj/effect/blob/core/Life() if(!overmind) create_overmind() @@ -66,7 +62,7 @@ if(resource_delay <= world.time) resource_delay = world.time + 10 // 1 second overmind.add_points(point_rate) - health = min(maxhealth, health+health_regen) + health = min(maxhealth, health+core_regen) if(overmind) overmind.update_health() Pulse_Area(overmind, 12, 4, 3) diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm index a70842aa7c4..b6c3c879b15 100644 --- a/code/game/gamemodes/blob/blobs/factory.dm +++ b/code/game/gamemodes/blob/blobs/factory.dm @@ -18,22 +18,16 @@ spores = null return ..() -/obj/effect/blob/factory/PulseAnimation(activate = 0) - if(activate) - ..() - return - -/obj/effect/blob/factory/run_action() +/obj/effect/blob/factory/Be_Pulsed() + . = ..() if(spores.len >= max_spores) - return 0 + return if(spore_delay > world.time) - return 0 + return + flick("factory_glow", src) spore_delay = world.time + 100 // 10 seconds - PulseAnimation(1) var/mob/living/simple_animal/hostile/blob/blobspore/BS = new/mob/living/simple_animal/hostile/blob/blobspore(src.loc, src) if(overmind) //if we don't have an overmind, we don't need to do anything but make a spore BS.overmind = overmind BS.update_icons() overmind.blob_mobs.Add(BS) - return 0 - diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm index 3141e98930b..0fa21158e26 100644 --- a/code/game/gamemodes/blob/blobs/node.dm +++ b/code/game/gamemodes/blob/blobs/node.dm @@ -25,9 +25,6 @@ var/image/C = new('icons/mob/blob.dmi', "blob_node_overlay") src.overlays += C -/obj/effect/blob/node/PulseAnimation() - return - /obj/effect/blob/node/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) return diff --git a/code/game/gamemodes/blob/blobs/resource.dm b/code/game/gamemodes/blob/blobs/resource.dm index 03bb6164280..a435685eeb7 100644 --- a/code/game/gamemodes/blob/blobs/resource.dm +++ b/code/game/gamemodes/blob/blobs/resource.dm @@ -8,22 +8,11 @@ point_return = 15 var/resource_delay = 0 - -/obj/effect/blob/resource/PulseAnimation(activate = 0) - if(activate) - ..() - return - -/obj/effect/blob/resource/run_action() - +/obj/effect/blob/resource/Be_Pulsed() + . = ..() if(resource_delay > world.time) - return 0 - - PulseAnimation(1) - + return + flick("factory_glow", src) resource_delay = world.time + 45 // 4 and a half seconds - if(overmind) overmind.add_points(1) - return 0 - diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index 2a0b8ea8575..dcf6c5747a9 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -90,11 +90,13 @@ return var/message_a = say_quote(message, get_spans()) - var/rendered = "Blob Telepathy, [name]([blob_reagent_datum.name]) [message_a]" + var/rendered = "\[Blob Telepathy\] [name]([blob_reagent_datum.name]) [message_a]" for(var/mob/M in mob_list) - if(isovermind(M) || isobserver(M) || istype(M, /mob/living/simple_animal/hostile/blob)) - M.show_message(rendered, 2) + if(isovermind(M) || istype(M, /mob/living/simple_animal/hostile/blob)) + M << rendered + if(isobserver(M)) + M << "(F) [rendered]" /mob/camera/blob/emote(act,m_type=1,message = null) return diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index 5f92432b457..1b845d570c8 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -12,8 +12,7 @@ var/health = 30 var/maxhealth = 30 var/health_regen = 2 //how much health this blob regens when pulsed - var/health_timestamp = 0 //we got healed when? - var/pulse_timestamp = 0 //we got pulsed when? + var/pulse_timestamp = 0 //we got pulsed/healed when? var/brute_resist = 0.5 //multiplies brute damage by this var/fire_resist = 1 //multiplies burn damage by this var/atmosblock = 0 //if the blob blocks atmos and heat spread @@ -90,7 +89,6 @@ src.Be_Pulsed() if(claim_range) for(var/obj/effect/blob/B in ultra_range(claim_range, src, 1)) - B.update_icon() if(!B.overmind && !istype(B, /obj/effect/blob/core) && prob(30)) B.overmind = pulsing_overmind //reclaim unclaimed, non-core blobs. B.update_icon() @@ -106,10 +104,9 @@ /obj/effect/blob/proc/Be_Pulsed() if(pulse_timestamp <= world.time) - PulseAnimation() ConsumeTile() - RegenHealth() - run_action() + health = min(maxhealth, health+health_regen) + update_icon() pulse_timestamp = world.time + 10 return 1 //we did it, we were pulsed! return 0 //oh no we failed @@ -118,21 +115,6 @@ for(var/atom/A in loc) A.blob_act() -/obj/effect/blob/proc/PulseAnimation() - flick("[icon_state]_glow", src) - return - -/obj/effect/blob/proc/RegenHealth() //when pulsed, heal! - if(health_timestamp <= world.time) - health = min(maxhealth, health+health_regen) - update_icon() - health_timestamp = world.time + 10 //1 second between heals - return 1 - return 0 - -/obj/effect/blob/proc/run_action() - return 0 - /obj/effect/blob/proc/expand(turf/T = null, prob = 1, controller = null) if(prob && !prob(health)) diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 2506052b8f2..bd417180b6d 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -113,6 +113,9 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas /datum/game_mode/proc/forge_changeling_objectives(datum/mind/changeling, var/team_mode = 0) //OBJECTIVES - random traitor objectives. Unique objectives "steal brain" and "identity theft". + //No escape alone because changelings aren't suited for it and it'd probably just lead to rampant robusting + //If it seems like they'd be able to do it in play, add a 10% chance to have to escape alone + var/escape_objective_possible = TRUE //if there's a team objective, check if it's compatible with escape objectives @@ -121,7 +124,63 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas escape_objective_possible = FALSE break - generate_objectives(changeling, 4, escape_objective_possible) + var/datum/objective/absorb/absorb_objective = new + absorb_objective.owner = changeling + absorb_objective.gen_amount_goal(6, 8) + changeling.objectives += absorb_objective + + if(prob(60)) + var/datum/objective/steal/steal_objective = new + steal_objective.owner = changeling + steal_objective.find_target() + changeling.objectives += steal_objective + + var/list/active_ais = active_ais() + if(active_ais.len && prob(100/joined_player_list.len)) + var/datum/objective/destroy/destroy_objective = new + destroy_objective.owner = changeling + destroy_objective.find_target() + changeling.objectives += destroy_objective + else + if(prob(70)) + var/datum/objective/assassinate/kill_objective = new + kill_objective.owner = changeling + if(team_mode) //No backstabbing while in a team + kill_objective.find_target_by_role(role = "Changeling", role_type = 1, invert = 1) + else + kill_objective.find_target() + changeling.objectives += kill_objective + else + var/datum/objective/maroon/maroon_objective = new + maroon_objective.owner = changeling + if(team_mode) + maroon_objective.find_target_by_role(role = "Changeling", role_type = 1, invert = 1) + else + maroon_objective.find_target() + changeling.objectives += maroon_objective + + if (!(locate(/datum/objective/escape) in changeling.objectives) && escape_objective_possible) + var/datum/objective/escape/escape_with_identity/identity_theft = new + identity_theft.owner = changeling + identity_theft.target = maroon_objective.target + identity_theft.update_explanation_text() + changeling.objectives += identity_theft + escape_objective_possible = FALSE + + if (!(locate(/datum/objective/escape) in changeling.objectives) && escape_objective_possible) + if(prob(50)) + var/datum/objective/escape/escape_objective = new + escape_objective.owner = changeling + changeling.objectives += escape_objective + else + var/datum/objective/escape/escape_with_identity/identity_theft = new + identity_theft.owner = changeling + if(team_mode) + identity_theft.find_target_by_role(role = "Changeling", role_type = 1, invert = 1) + else + identity_theft.find_target() + changeling.objectives += identity_theft + escape_objective_possible = FALSE diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm index 97aa442b108..da36d8f6d96 100644 --- a/code/game/gamemodes/changeling/powers/absorb.dm +++ b/code/game/gamemodes/changeling/powers/absorb.dm @@ -157,10 +157,10 @@ var/mob/dead/observer/ghost = target.ghostize(0) user.mind.transfer_to(target) - if(ghost && ghost.mind) + if(ghost) ghost.mind.transfer_to(user) - else - user.key = ghost.key + if(ghost.key) + user.key = ghost.key user.Paralyse(2) target << "Our genes cry out as we swap our [user] form for [target]." diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 10e43124d7f..7166ef3eea8 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -20,9 +20,12 @@ user.say(message) else user.whisper(message) + var/my_message = "[(ishuman(user) ? "Acolyte" : "Construct")] [user]: [message]" for(var/mob/M in mob_list) - if(iscultist(M) || (M in dead_mob_list)) - M << "[(ishuman(user) ? "Acolyte" : "Construct")] [user]: [message]" + if(iscultist(M)) + M << my_message + if(M in dead_mob_list) + M << "(F) [my_message]" log_say("[user.real_name]/[user.key] : [message]") diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index bb84c466b3c..a1c9e0b5373 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -37,16 +37,17 @@ cult.large_shell_reference = null if(cult.eldergod) go_to_red = 0 - if(go_to_red) - priority_announce("The extra-dimensional flow has ceased. All personnel should return to their routine activities.","Central Command Higher Dimensions Affairs") - if(get_security_level() == "delta") - set_security_level("red") black_overlay = null if(timer_id) deltimer(timer_id) + if(go_to_red) + priority_announce("The extra-dimensional flow has ceased. All personnel should return to their routine activities.","Central Command Higher Dimensions Affairs") + if(get_security_level() == "delta") + set_security_level("red") SSshuttle.emergencyNoEscape = 0 - SSshuttle.emergency.mode = SHUTTLE_DOCKED - SSshuttle.emergency.timer = world.time + if(SSshuttle.emergency.mode == SHUTTLE_STRANDED) + SSshuttle.emergency.mode = SHUTTLE_DOCKED + SSshuttle.emergency.timer = world.time ..() /obj/structure/constructshell/large/examine(mob/user) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 425a946adf8..a62e1726d33 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -461,8 +461,7 @@ continue //Dead mob, ghost abandoned else if(D.can_reenter_corpse) - msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (This shouldn't appear.)\n" - continue //Lolwhat + continue //Adminghost, or cult/wizard ghost else msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Ghosted)\n" continue //Ghosted while alive diff --git a/code/game/gamemodes/gang/gang_pen.dm b/code/game/gamemodes/gang/gang_pen.dm index 4ef55716810..bf856cce812 100644 --- a/code/game/gamemodes/gang/gang_pen.dm +++ b/code/game/gamemodes/gang/gang_pen.dm @@ -92,17 +92,16 @@ if(I != src) qdel(I) - var/success - if(target.stat != DEAD) - if(target.mind in ticker.mode.get_gangsters()) - if(ticker.mode.remove_gangster(target.mind,0,1)) - success = 1 //Was not a gang boss, convert as usual - else - success = 1 - - if(!target.mind) + if(!target.mind || target.stat == DEAD) return 0 + var/success + if(target.mind in ticker.mode.get_gangsters()) + if(ticker.mode.remove_gangster(target.mind,0,1)) + success = 1 //Was not a gang boss, convert as usual + else + success = 1 + if(ishuman(target)) if(!success) target.visible_message("[target] seems to resist the implant!", "You feel the influence of your enemies try to invade your mind!") diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm index 6dbe8cb927c..f5631779f09 100644 --- a/code/game/gamemodes/gang/recaller.dm +++ b/code/game/gamemodes/gang/recaller.dm @@ -358,7 +358,7 @@ if(ganger.current && (ganger.current.z <= 2) && (ganger.current.stat == CONSCIOUS)) ganger.current << ping for(var/mob/M in dead_mob_list) - M << ping + M << "(F) [ping]" log_game("[key_name(user)] Messaged [gang.name] Gang: [message].") diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index a14280395e6..3d20fde2911 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -339,9 +339,9 @@ 2.Put the specimen on operating table
3.Apply surgical drapes preparing for dissection
4.Apply scalpel to specimen torso
- 5.Stop the bleeders and retract skin
- 6.Cut out organs you find with a scalpel
- 7.Use your hands to remove the remaining organs
+ 5.Retract skin from specimen's torso
+ 6.Apply scalpel to specimen's torso
+ 7.Search through the specimen's torso with your hands to remove any organs
8.Insert replacement gland (Retrieve one from gland storage)
9.Consider dressing the specimen back to not disturb the habitat
10.Put the specimen in the experiment machinery
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 0515de28c96..6baf88b688a 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -493,7 +493,7 @@ return src << "Attempting to repair damage to our body, stand by..." if(do_mob(src, src, 100)) - adjustBruteLoss(-100) + adjustHealth(-100) src << "We successfully repaired ourselves." /mob/living/simple_animal/hostile/swarmer/proc/ToggleLight() @@ -504,10 +504,13 @@ /mob/living/simple_animal/hostile/swarmer/proc/ContactSwarmers() var/message = input(src, "Announce to other swarmers", "Swarmer contact") + var/rendered = "Swarm communication - [src] states: [message]" if(message) for(var/mob/M in mob_list) - if(isswarmer(M) || (M in dead_mob_list)) - M << "Swarm communication - [src] states: [message]" + if(isswarmer(M)) + M << rendered + if(M in dead_mob_list) + M << "(F) [rendered]" diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm index be09a38c2c1..f90b2b78bba 100644 --- a/code/game/gamemodes/miniantags/morph/morph.dm +++ b/code/game/gamemodes/miniantags/morph/morph.dm @@ -61,6 +61,13 @@ return 0 return 1 +/mob/living/simple_animal/hostile/morph/proc/eat(atom/movable/A) + if(A && A.loc != src) + visible_message("[src] swallows [A] whole!") + A.loc = src + return 1 + return 0 + /mob/living/simple_animal/hostile/morph/ShiftClickOn(atom/movable/A) if(morph_time <= world.time && !stat) if(A == src) @@ -151,16 +158,14 @@ var/mob/living/L = target if(L.stat == DEAD) if(do_after(src, 30, target = L)) - visible_message("[src] swallows [target] whole!") - L.loc = src - adjustBruteLoss(-50) + if(eat(L)) + adjustHealth(-50) return else if(istype(target,/obj/item)) // Eat items just to be annoying var/obj/item/I = target if(!I.anchored) if(do_after(src,20, target = I)) - visible_message("[src] swallows [target] whole!") - I.loc = src + eat(I) return target.attack_animal(src) diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index ed153281399..45b53e3f6f2 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -139,7 +139,7 @@ /mob/living/simple_animal/revenant/narsie_act() return //most humans will now be either bones or harvesters, but we're still un-alive. -/mob/living/simple_animal/revenant/adjustBruteLoss(amount) +/mob/living/simple_animal/revenant/adjustHealth(amount) if(!revealed) return essence = max(0, essence-amount) @@ -238,11 +238,12 @@ if(!message) return log_say("[key_name(src)] : [message]") + var/rendered = "[src] says, \"[message]\"" for(var/mob/M in mob_list) - if (istype(M, /mob/new_player)) - continue - if(istype(M, /mob/living/simple_animal/revenant) || M.stat == DEAD) - M << "[src] says, \"[message]\"" //Can commune with the dead + if(istype(M, /mob/living/simple_animal/revenant)) + M << rendered + if(isobserver(M)) + M << "(F) [rendered]" return diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm index 6049556edc0..e5675f6b183 100644 --- a/code/game/gamemodes/nuclear/nuclear_challenge.dm +++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm @@ -40,7 +40,7 @@ U.hidden_uplink.uplink_owner= "[user.key]" U.hidden_uplink.uses = 280 U.hidden_uplink.mode_override = /datum/game_mode/nuclear //Maybe we can have a special set of items for the challenge uplink eventually - config.shuttle_refuel_delay = min(config.shuttle_refuel_delay, CHALLENGE_SHUTTLE_DELAY) + config.shuttle_refuel_delay = max(config.shuttle_refuel_delay, CHALLENGE_SHUTTLE_DELAY) qdel(src) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 073d828dc81..3490b4c750b 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -1,927 +1,838 @@ -/datum/objective - var/datum/mind/owner = null //Who owns the objective. - var/explanation_text = "Nothing" //What that person is supposed to do. - var/datum/mind/target = null //If they are focused on a particular person. - var/target_amount = 0 //If they are focused on a particular number. Steal objectives have their own counter. - var/completed = 0 //currently only used for custom objectives. - var/dangerrating = 0 //How hard the objective is, essentially. Used for dishing out objectives and checking overall victory. - var/martyr_compatible = 0 //If the objective is compatible with martyr objective, i.e. if you can still do it while dead. - var/required_role = null //If the objective can only be done by a certain role, such as absorb for changelings. - var/randomgen = 1 //Whether the objective can be generated randomly. - var/error_text = "" //Displayed to admins if the objective fails to initialize properly when editing or adding - -/proc/generate_objectives(var/datum/mind/M, var/objectives_made = 2, var/has_escape = TRUE) - var/list/objective_types = (typesof(/datum/objective/default) - /datum/objective/default) - var/list/escape_objective_types = (typesof(/datum/objective/escape_obj) - /datum/objective/escape_obj) - for(var/O in objective_types) // this is fucking hacky as shit but - var/datum/objective/obj = new O - if(M.special_role != obj.required_role && obj.required_role != null) - objective_types -= O - if(!obj.randomgen) - objective_types -= O - for(var/E in escape_objective_types) - var/datum/objective/obj = new E - if(M.special_role != obj.required_role && obj.required_role != null) - objective_types -= E - if(!obj.randomgen) - objective_types -= E - for(var/i = 1, i <= objectives_made, i++) - if(i == objectives_made && has_escape) - var/datum/objective/holder_obj = pick(escape_objective_types) - add_objective(M, holder_obj) - return - else - var/datum/objective/holder_obj = pick(objective_types) - objective_types -= holder_obj - var/datum/objective/O = new holder_obj - if(!O.martyr_compatible) - escape_objective_types -= list(/datum/objective/escape_obj/martyr) - add_objective(M, holder_obj) - - -/proc/add_objective(var/datum/mind/M, var/obj_path, var/announce_new_objectives = 0, var/replace_if_impossible = 1, var/admin=0) - var/datum/objective/objective = new obj_path() - objective.owner = M - M.objectives += objective - if(admin && check_rights(R_ADMIN)) - objective.find_target_admin() - else - objective.find_target() - - if(!objective.extra_prep()) - if(replace_if_impossible) - generate_objectives(objective.owner, 1, FALSE) // Generate another objective to replace this one. - objective.owner.objectives -= src - qdel(src) - return null - - objective.update_explanation_text() - if(announce_new_objectives) - if(M.special_role) - M.current << "You are the [M.special_role]." - var/obj_count = 1 - for(var/datum/objective/OBJ in M.objectives) - M.current << "Objective #[obj_count]: [OBJ.explanation_text]" - obj_count++ - return objective - -/datum/objective/New(var/text) - if(text) - explanation_text = text - -/datum/objective/proc/check_completion() - return completed - -/datum/objective/proc/extra_prep() - return 1 - -/datum/objective/proc/is_unique_objective(possible_target) - for(var/datum/objective/O in owner.objectives) - if(istype(O, type) && O.get_target() == possible_target) - return 0 - return 1 - -/datum/objective/proc/get_target() - return target - -/datum/objective/proc/find_possible_targets() - var/list/possible_targets = list() - for(var/datum/mind/possible_target in ticker.minds) - if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2) && is_unique_objective(possible_target)) - possible_targets += possible_target - return possible_targets - -/datum/objective/proc/find_target() - var/list/possible_targets = find_possible_targets() - if(possible_targets.len > 0) - target = pick(possible_targets) - update_explanation_text() - return target - -/datum/objective/proc/find_target_admin() - target = input("Select target:", "Objective target") as null|anything in find_possible_targets() - return target - -/datum/objective/proc/find_target_by_role(role, role_type=0, invert=0)//Option sets either to check assigned role or special role. Default to assigned., invert inverts the check, eg: "Don't choose a Ling" - for(var/datum/mind/possible_target in ticker.minds) - if((possible_target != owner) && ishuman(possible_target.current)) - var/is_role = 0 - if(role_type) - if(possible_target.special_role == role) - is_role++ - else - if(possible_target.assigned_role == role) - is_role++ - - if(invert) - if(is_role) - continue - target = possible_target - break - else if(is_role) - target = possible_target - break - - update_explanation_text() - -/datum/objective/proc/update_explanation_text() - //Default does nothing, override where needed - -/datum/objective/proc/give_special_equipment() - -// Default objectives are ones you can put on any antag type and they should be able to complete it. - -/datum/objective/default/assassinate - var/target_role_type=0 - dangerrating = 10 - martyr_compatible = 1 - -/datum/objective/default/assassinate/find_target_by_role(role, role_type=0, invert=0) - if(!invert) - target_role_type = role_type - ..() - return target - -/datum/objective/default/assassinate/check_completion() - if(target && target.current) - if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite - return 1 - return 0 - return 1 - -/datum/objective/default/assassinate/update_explanation_text() - ..() - if(target && target.current) - explanation_text = "Assassinate [target.name], the [!target_role_type ? target.assigned_role : target.special_role]." - else - explanation_text = "Free Objective" - - -/datum/objective/mutiny - var/target_role_type=0 - martyr_compatible = 1 - -/datum/objective/mutiny/find_target_by_role(role, role_type=0,invert=0) - if(!invert) - target_role_type = role_type - ..() - return target - -/datum/objective/mutiny/check_completion() - if(target && target.current) - if(target.current.stat == DEAD || !ishuman(target.current) || !target.current.ckey || !target.current.client) - return 1 - var/turf/T = get_turf(target.current) - if(T && (T.z > ZLEVEL_STATION) || target.current.client.is_afk()) //If they leave the station or go afk they count as dead for this - return 2 - return 0 - return 1 - -/datum/objective/mutiny/update_explanation_text() - ..() - if(target && target.current) - explanation_text = "Assassinate or exile [target.name], the [!target_role_type ? target.assigned_role : target.special_role]." - else - explanation_text = "Free Objective" - - - -/datum/objective/default/maroon - var/target_role_type=0 - dangerrating = 5 - martyr_compatible = 1 - -/datum/objective/default/maroon/find_target_by_role(role, role_type=0, invert=0) - if(!invert) - target_role_type = role_type - ..() - return target - -/datum/objective/default/maroon/check_completion() - if(target && target.current) - if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite - return 1 - if(target.current.onCentcom() || target.current.onSyndieBase()) - return 0 - return 1 - -/datum/objective/default/maroon/update_explanation_text() - if(target && target.current) - explanation_text = "Prevent [target.name], the [!target_role_type ? target.assigned_role : target.special_role], from escaping alive." - else - explanation_text = "Free Objective" - - - -/datum/objective/default/debrain//I want braaaainssss - var/target_role_type=0 - dangerrating = 20 - randomgen = 0 - -/datum/objective/default/debrain/find_target_by_role(role, role_type=0, invert=0) - if(!invert) - target_role_type = role_type - ..() - return target - -/datum/objective/default/debrain/check_completion() - if(!target)//If it's a free objective. - return 1 - if( !owner.current || owner.current.stat==DEAD )//If you're otherwise dead. - return 0 - if( !target.current || !isbrain(target.current) ) - return 0 - var/atom/A = target.current - while(A.loc) //check to see if the brainmob is on our person - A = A.loc - if(A == owner.current) - return 1 - return 0 - -/datum/objective/default/debrain/update_explanation_text() - ..() - if(target && target.current) - explanation_text = "Steal the brain of [target.name], the [!target_role_type ? target.assigned_role : target.special_role]." - else - explanation_text = "Free Objective" - - - -/datum/objective/default/protect//The opposite of killing a dude. - var/target_role_type=0 - dangerrating = 10 - martyr_compatible = 1 - -/datum/objective/default/protect/find_target_by_role(role, role_type=0, invert=0) - if(!invert) - target_role_type = role_type - ..() - return target - -/datum/objective/default/protect/check_completion() - if(!target) //If it's a free objective. - return 1 - if(target.current) - if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current)) - return 0 - return 1 - return 0 - -/datum/objective/default/protect/update_explanation_text() - ..() - if(target && target.current) - explanation_text = "Protect [target.name], the [!target_role_type ? target.assigned_role : target.special_role]." - else - explanation_text = "Free Objective" - - - -/datum/objective/escape_obj/hijack - explanation_text = "Hijack the shuttle to ensure no loyalist Nanotrasen crew escape alive and out of custody." - dangerrating = 25 - martyr_compatible = 0 //Technically you won't get both anyway. - -/datum/objective/escape_obj/hijack/check_completion() - if(!owner.current || owner.current.stat) - return 0 - if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME) - return 0 - if(issilicon(owner.current)) - return 0 - - var/area/A = get_area(owner.current) - if(SSshuttle.emergency.areaInstance != A) - return 0 - - for(var/mob/living/player in player_list) - if(player.mind && player.mind != owner) - if(player.stat != DEAD) - if(istype(player, /mob/living/silicon)) //Borgs are technically dead anyways - continue - if(get_area(player) == A) - if(!player.mind.special_role && !istype(get_turf(player.mind.current), /turf/simulated/floor/plasteel/shuttle/red)) - return 0 - return 1 - -/datum/objective/hijackclone - explanation_text = "Hijack the emergency shuttle by ensuring only you (or your copies) escape." - dangerrating = 25 - martyr_compatible = 0 - -/datum/objective/hijackclone/check_completion() - if(!owner.current) - return 0 - if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME) - return 0 - - var/area/A = SSshuttle.emergency.areaInstance - - for(var/mob/living/player in player_list) //Make sure nobody else is onboard - if(player.mind && player.mind != owner) - if(player.stat != DEAD) - if(istype(player, /mob/living/silicon)) - continue - if(get_area(player) == A) - if(player.real_name != owner.current.real_name && !istype(get_turf(player.mind.current), /turf/simulated/floor/plasteel/shuttle/red)) - return 0 - - for(var/mob/living/player in player_list) //Make sure at least one of you is onboard - if(player.mind && player.mind != owner) - if(player.stat != DEAD) - if(istype(player, /mob/living/silicon)) - continue - if(get_area(player) == A) - if(player.real_name == owner.current.real_name && !istype(get_turf(player.mind.current), /turf/simulated/floor/plasteel/shuttle/red)) - return 1 - return 0 - -/datum/objective/escape_obj/block - explanation_text = "Do not allow any organic lifeforms to escape on the shuttle alive." - dangerrating = 25 - martyr_compatible = 1 - randomgen = 0 - -/datum/objective/escape_obj/block/check_completion() - if(!istype(owner.current, /mob/living/silicon)) - return 0 - if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME) - return 1 - - var/area/A = SSshuttle.emergency.areaInstance - - for(var/mob/living/player in player_list) - if(istype(player, /mob/living/silicon)) - continue - if(player.mind) - if(player.stat != DEAD) - if(get_area(player) == A) - return 0 - - return 1 - - -/datum/objective/escape_obj/escape - explanation_text = "Escape on the shuttle or an escape pod alive and without being in custody." - dangerrating = 5 - -/datum/objective/escape_obj/escape/check_completion() - if(issilicon(owner.current)) - return 0 - if(isbrain(owner.current)) - return 0 - if(!owner.current || owner.current.stat == DEAD) - return 0 - if(ticker.force_ending) //This one isn't their fault, so lets just assume good faith - return 1 - if(ticker.mode.station_was_nuked) //If they escaped the blast somehow, let them win - return 1 - if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME) - return 0 - var/turf/location = get_turf(owner.current) - if(!location) - return 0 - - if(istype(location, /turf/simulated/floor/plasteel/shuttle/red)) // Fails traitors if they are in the shuttle brig -- Polymorph - return 0 - - if(location.onCentcom() || location.onSyndieBase()) - return 1 - - return 0 - -/datum/objective/escape_obj/escape/escape_with_identity - dangerrating = 10 - var/target_real_name // Has to be stored because the target's real_name can change over the course of the round - var/target_missing_id - required_role = "changeling" - -/datum/objective/escape_obj/escape/escape_with_identity/find_target() - target = ..() - update_explanation_text() - -/datum/objective/escape_obj/escape/escape_with_identity/update_explanation_text() - if(target && target.current) - target_real_name = target.current.real_name - explanation_text = "Escape on the shuttle or an escape pod with the identity of [target_real_name], the [target.assigned_role]" - var/mob/living/carbon/human/H - if(ishuman(target.current)) - H = target.current - if(H && H.get_id_name() != target_real_name) - target_missing_id = 1 - else - explanation_text += " while wearing their identification card" - explanation_text += "." //Proper punctuation is important! - - else - explanation_text = "Free Objective." - -/datum/objective/escape_obj/escape/escape_with_identity/check_completion() - if(!target_real_name) - return 1 - if(!ishuman(owner.current)) - return 0 - var/mob/living/carbon/human/H = owner.current - if(..()) - if(H.dna.real_name == target_real_name) - if(H.get_id_name()== target_real_name || target_missing_id) - return 1 - return 0 - - -/datum/objective/escape_obj/survive - explanation_text = "Stay alive until the end." - dangerrating = 3 - -/datum/objective/survive/check_completion() - if(!owner.current || owner.current.stat == DEAD || isbrain(owner.current)) - return 0 //Brains no longer win survive objectives. --NEO - if(!is_special_character(owner.current)) //This fails borg'd traitors - return 0 - return 1 - - -/datum/objective/escape_obj/martyr - explanation_text = "Die a glorious death." - dangerrating = 1 - -/datum/objective/escape_obj/martyr/check_completion() - if(!owner.current) //Gibbed, etc. - return 1 - if(owner.current && owner.current.stat == DEAD) //You're dead! Yay! - return 1 - return 0 - - -/datum/objective/nuclear - explanation_text = "Destroy the station with a nuclear device." - martyr_compatible = 1 - -/datum/objective/nuclear/check_completion() - if(ticker && ticker.mode && ticker.mode.station_was_nuked) - return 1 - return 0 - -var/global/list/possible_items = list() -/datum/objective/default/steal - var/datum/objective_item/targetinfo = null //Save the chosen item datum so we can access it later. - var/obj/item/steal_target = null //Needed for custom objectives (they're just items, not datums). - dangerrating = 5 //Overridden by the individual item's difficulty, but defaults to 5 for custom objectives. - martyr_compatible = 0 - -/datum/objective/default/steal/get_target() - return steal_target - -/datum/objective/default/steal/New() - ..() - if(!possible_items.len)//Only need to fill the list when it's needed. - init_subtypes(/datum/objective_item/steal,possible_items) - -/datum/objective/default/steal/find_possible_targets() - var/list/approved_targets = list() - if(check_rights(R_ADMIN)) - approved_targets += select_target() - else - for(var/datum/objective_item/possible_item in possible_items) - if(is_unique_objective(possible_item.targetitem) && !(owner.current.mind.assigned_role in possible_item.excludefromjob)) - approved_targets += possible_item - return approved_targets - -/datum/objective/default/steal/find_target() - return set_target(safepick(find_possible_targets())) - -/datum/objective/default/steal/proc/set_target(datum/objective_item/item) - if(item) - targetinfo = item - - steal_target = targetinfo.targetitem - explanation_text = "Steal [targetinfo.name]." - dangerrating = targetinfo.difficulty - give_special_equipment() - return steal_target - else - explanation_text = "Free objective" - return - -/datum/objective/default/steal/proc/select_target() //For admins setting objectives manually. - var/list/possible_items_all = possible_items+"custom" - var/new_target = input("Select target:", "Objective target", steal_target) as null|anything in possible_items_all - if (!new_target) - return - - if (new_target == "custom") //Can set custom items. - var/obj/item/custom_target = input("Select type:","Type") as null|anything in typesof(/obj/item) - if (!custom_target) - return - var/custom_name = initial(custom_target.name) - custom_name = stripped_input("Enter target name:", "Objective target", custom_name) - if (!custom_name) - return - steal_target = custom_target - explanation_text = "Steal [custom_name]." - - return steal_target - -/datum/objective/default/steal/check_completion() - if(!steal_target) - return 1 - if(!isliving(owner.current)) - return 0 - var/list/all_items = owner.current.GetAllContents() //this should get things in cheesewheels, books, etc. - - for(var/obj/I in all_items) //Check for items - if(istype(I, steal_target)) - if(!targetinfo) //If there's no targetinfo, then that means it was a custom objective. At this point, we know you have the item, so return 1. - return 1 - else if(targetinfo.check_special_completion(I))//Returns 1 by default. Items with special checks will return 1 if the conditions are fulfilled. - return 1 - - if(targetinfo && I.type in targetinfo.altitems) //Ok, so you don't have the item. Do you have an alternative, at least? - if(targetinfo.check_special_completion(I))//Yeah, we do! Don't return 0 if we don't though - then you could fail if you had 1 item that didn't pass and got checked first! - return 1 - return 0 - -/datum/objective/default/steal/give_special_equipment() - if(owner && owner.current && targetinfo) - if(istype(owner.current, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = owner.current - var/list/slots = list ("backpack" = slot_in_backpack) - for(var/eq_path in targetinfo.special_equipment) - var/obj/O = new eq_path - H.equip_in_one_of_slots(O, slots) - H.update_icons() - -var/global/list/possible_items_special = list() -/datum/objective/default/steal/special //ninjas are so special they get their own subtype good for them - randomgen = 0 -/datum/objective/default/steal/special/New() - ..() - if(!possible_items_special.len) - init_subtypes(/datum/objective_item/special,possible_items) - init_subtypes(/datum/objective_item/stack,possible_items) - -/datum/objective/default/steal/special/find_target() - return set_target(pick(possible_items_special)) - - - -/datum/objective/default/steal/exchange - dangerrating = 10 - martyr_compatible = 0 - randomgen = 0 - -/datum/objective/default/steal/exchange/proc/set_faction(faction,otheragent) - target = otheragent - if(faction == "red") - targetinfo = new/datum/objective_item/unique/docs_blue - else if(faction == "blue") - targetinfo = new/datum/objective_item/unique/docs_red - explanation_text = "Acquire [targetinfo.name] held by [target.current.real_name], the [target.assigned_role] and syndicate agent" - steal_target = targetinfo.targetitem - - -/datum/objective/default/steal/exchange/update_explanation_text() - ..() - if(target && target.current) - explanation_text = "Acquire [targetinfo.name] held by [target.name], the [target.assigned_role] and syndicate agent" - else - explanation_text = "Free Objective" - - -/datum/objective/default/steal/exchange/backstab - dangerrating = 3 - randomgen = 0 - -/datum/objective/default/steal/exchange/backstab/set_faction(faction) - if(faction == "red") - targetinfo = new/datum/objective_item/unique/docs_red - else if(faction == "blue") - targetinfo = new/datum/objective_item/unique/docs_blue - explanation_text = "Do not give up or lose [targetinfo.name]." - steal_target = targetinfo.targetitem - - -/datum/objective/download - dangerrating = 10 - -/datum/objective/download/proc/gen_amount_goal() - target_amount = rand(10,20) - explanation_text = "Download [target_amount] research level\s." - return target_amount - -/datum/objective/download/check_completion()//NINJACODE - if(!ishuman(owner.current)) - return 0 - - var/mob/living/carbon/human/H = owner.current - if(!H || H.stat == DEAD) - return 0 - - if(!istype(H.wear_suit, /obj/item/clothing/suit/space/space_ninja)) - return 0 - - var/obj/item/clothing/suit/space/space_ninja/SN = H.wear_suit - if(!SN.s_initialized) - return 0 - - var/current_amount - if(!SN.stored_research.len) - return 0 - else - for(var/datum/tech/current_data in SN.stored_research) - if(current_data.level) - current_amount += (current_data.level-1) - if(current_amount= target_amount)) - return 1 - else - return 0 - - - -/datum/objective/default/destroy - dangerrating = 10 - martyr_compatible = 1 - error_text = "No active AIs with minds." - -/datum/objective/default/destroy/find_target() - var/list/possible_targets = active_ais(1) - var/mob/living/silicon/ai/target_ai = pick(possible_targets) - target = target_ai.mind - update_explanation_text() - return target - -/datum/objective/default/destroy/check_completion() - if(target && target.current) - if(target.current.stat == DEAD || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite - return 1 - return 0 - return 1 - -/datum/objective/default/destroy/update_explanation_text() - ..() - if(target && target.current) - explanation_text = "Destroy [target.name], the experimental AI." - else - explanation_text = "Free Objective" - -/datum/objective/default/destroy/extra_prep() - if(!target) - return 0 - return 1 - -/datum/objective/summon_guns - explanation_text = "Steal at least five guns!" - -/datum/objective/summon_guns/check_completion() - if(!isliving(owner.current)) return 0 - var/guncount = 0 - var/list/all_items = owner.current.GetAllContents() //this should get things in cheesewheels, books, etc. - for(var/obj/I in all_items) //Check for guns - if(istype(I, /obj/item/weapon/gun)) - guncount++ - if(guncount >= 5) - return 1 - else - return 0 - return 0 - - - -//////////////////////////////// -// Changeling team objectives // -//////////////////////////////// - -/datum/objective/changeling_team_objective //Abstract type - martyr_compatible = 0 //Suicide is not teamwork! - explanation_text = "Changeling Friendship!" - var/min_lings = 3 //Minimum amount of lings for this team objective to be possible - var/escape_objective_compatible = FALSE - - -//Impersonate department -//Picks as many people as it can from a department (Security,Engineer,Medical,Science) -//and tasks the lings with killing and replacing them -/datum/objective/changeling_team_objective/impersonate_department - explanation_text = "Ensure X derpartment are killed, impersonated, and replaced by Changelings" - var/command_staff_only = FALSE //if this is true, it picks command staff instead - var/list/department_minds = list() - var/list/department_real_names = list() - var/department_string = "" - - -/datum/objective/changeling_team_objective/impersonate_department/proc/get_department_staff() - department_minds = list() - department_real_names = list() - - var/list/departments = list("Head of Security","Research Director","Chief Engineer","Chief Medical Officer") - var/department_head = pick(departments) - switch(department_head) - if("Head of Security") - department_string = "security" - if("Research Director") - department_string = "science" - if("Chief Engineer") - department_string = "engineering" - if("Chief Medical Officer") - department_string = "medical" - - var/ling_count = ticker.mode.changelings - - for(var/datum/mind/M in ticker.minds) - if(M in ticker.mode.changelings) - continue - if(department_head in get_department_heads(M.assigned_role)) - if(ling_count) - ling_count-- - department_minds += M - department_real_names += M.current.real_name - else - break - - if(!department_minds.len) - log_game("[type] has failed to find department staff, and has removed itself. the round will continue normally") - owner.objectives -= src - qdel(src) - return - - -/datum/objective/changeling_team_objective/impersonate_department/proc/get_heads() - department_minds = list() - department_real_names = list() - - //Needed heads is between min_lings and the maximum possible amount of command roles - //So at the time of writing, rand(3,6), it's also capped by the amount of lings there are - //Because you can't fill 6 head roles with 3 lings - - var/needed_heads = rand(min_lings,command_positions.len) - needed_heads = min(ticker.mode.changelings.len,needed_heads) - - var/list/heads = ticker.mode.get_living_heads() - for(var/datum/mind/head in heads) - if(head in ticker.mode.changelings) //Looking at you HoP. - continue - if(needed_heads) - department_minds += head - department_real_names += head.current.real_name - needed_heads-- - else - break - - if(!department_minds.len) - log_game("[type] has failed to find department heads, and has removed itself. the round will continue normally") - owner.objectives -= src - qdel(src) - return - - -/datum/objective/changeling_team_objective/impersonate_department/New(var/text) - ..() - if(command_staff_only) - get_heads() - else - get_department_staff() - - update_explanation_text() - - -/datum/objective/changeling_team_objective/impersonate_department/update_explanation_text() - ..() - if(!department_real_names.len || !department_minds.len) - explanation_text = "Free Objective" - return //Something fucked up, give them a win - - if(command_staff_only) - explanation_text = "Ensure changelings impersonate and escape as the following heads of staff: " - else - explanation_text = "Ensure changelings impersonate and escape as the following members of \the [department_string] department: " - - var/first = 1 - for(var/datum/mind/M in department_minds) - var/string = "[M.name] the [M.assigned_role]" - if(!first) - string = ", [M.name] the [M.assigned_role]" - else - first-- - explanation_text += string - - if(command_staff_only) - explanation_text += ", while the real heads are dead. This is a team objective." - else - explanation_text += ", while the real members are dead. This is a team objective." - - -/datum/objective/changeling_team_objective/impersonate_department/check_completion() - if(!department_real_names.len || !department_minds.len) - return 1 //Something fucked up, give them a win - - var/list/check_names = department_real_names.Copy() - - //Check each department member's mind to see if any of them made it to centcomm alive, if they did it's an automatic fail - for(var/datum/mind/M in department_minds) - if(M in ticker.mode.changelings) //Lings aren't picked for this, but let's be safe - continue - - if(M.current) - var/turf/mloc = get_turf(M.current) - if(mloc.onCentcom() && (M.current.stat != DEAD)) - return 0 //A Non-ling living target got to centcomm, fail - - //Check each staff member has been replaced, by cross referencing changeling minds, changeling current dna, the staff minds and their original DNA names - var/success = 0 - changelings: - for(var/datum/mind/changeling in ticker.mode.changelings) - if(success >= department_minds.len) //We did it, stop here! - return 1 - if(ishuman(changeling.current)) - var/mob/living/carbon/human/H = changeling.current - var/turf/cloc = get_turf(changeling.current) - if(cloc && cloc.onCentcom() && (changeling.current.stat != DEAD)) //Living changeling on centcomm.... - for(var/name in check_names) //Is he (disguised as) one of the staff? - if(H.dna.real_name == name) - check_names -= name //This staff member is accounted for, remove them, so the team don't succeed by escape as 7 of the same engineer - success++ //A living changeling staff member made it to centcomm - continue changelings - - if(success >= department_minds.len) - return 1 - return 0 - - - - -//A subtype of impersonate_derpartment -//This subtype always picks as many command staff as it can (HoS,HoP,Cap,CE,CMO,RD) -//and tasks the lings with killing and replacing them -/datum/objective/changeling_team_objective/impersonate_department/impersonate_heads - explanation_text = "Have X or more heads of staff escape on the shuttle disguised as heads, while the real heads are dead" - command_staff_only = TRUE - -/datum/objective/custom - explanation_text = "Free Objective" \ No newline at end of file +/datum/objective + var/datum/mind/owner = null //Who owns the objective. + var/explanation_text = "Nothing" //What that person is supposed to do. + var/datum/mind/target = null //If they are focused on a particular person. + var/target_amount = 0 //If they are focused on a particular number. Steal objectives have their own counter. + var/completed = 0 //currently only used for custom objectives. + var/dangerrating = 0 //How hard the objective is, essentially. Used for dishing out objectives and checking overall victory. + var/martyr_compatible = 0 //If the objective is compatible with martyr objective, i.e. if you can still do it while dead. + +/datum/objective/New(var/text) + if(text) + explanation_text = text + +/datum/objective/proc/check_completion() + return completed + +/datum/objective/proc/is_unique_objective(possible_target) + for(var/datum/objective/O in owner.objectives) + if(istype(O, type) && O.get_target() == possible_target) + return 0 + return 1 + +/datum/objective/proc/get_target() + return target + +/datum/objective/proc/find_target() + var/list/possible_targets = list() + for(var/datum/mind/possible_target in ticker.minds) + if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2) && is_unique_objective(possible_target)) + possible_targets += possible_target + if(possible_targets.len > 0) + target = pick(possible_targets) + update_explanation_text() + return target + +/datum/objective/proc/find_target_by_role(role, role_type=0, invert=0)//Option sets either to check assigned role or special role. Default to assigned., invert inverts the check, eg: "Don't choose a Ling" + for(var/datum/mind/possible_target in ticker.minds) + if((possible_target != owner) && ishuman(possible_target.current)) + var/is_role = 0 + if(role_type) + if(possible_target.special_role == role) + is_role++ + else + if(possible_target.assigned_role == role) + is_role++ + + if(invert) + if(is_role) + continue + target = possible_target + break + else if(is_role) + target = possible_target + break + + update_explanation_text() + +/datum/objective/proc/update_explanation_text() + //Default does nothing, override where needed + +/datum/objective/proc/give_special_equipment() + +/datum/objective/assassinate + var/target_role_type=0 + dangerrating = 10 + martyr_compatible = 1 + +/datum/objective/assassinate/find_target_by_role(role, role_type=0, invert=0) + if(!invert) + target_role_type = role_type + ..() + return target + +/datum/objective/assassinate/check_completion() + if(target && target.current) + if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite + return 1 + return 0 + return 1 + +/datum/objective/assassinate/update_explanation_text() + ..() + if(target && target.current) + explanation_text = "Assassinate [target.name], the [!target_role_type ? target.assigned_role : target.special_role]." + else + explanation_text = "Free Objective" + + +/datum/objective/mutiny + var/target_role_type=0 + martyr_compatible = 1 + +/datum/objective/mutiny/find_target_by_role(role, role_type=0,invert=0) + if(!invert) + target_role_type = role_type + ..() + return target + +/datum/objective/mutiny/check_completion() + if(target && target.current) + if(target.current.stat == DEAD || !ishuman(target.current) || !target.current.ckey || !target.current.client) + return 1 + var/turf/T = get_turf(target.current) + if(T && (T.z > ZLEVEL_STATION) || target.current.client.is_afk()) //If they leave the station or go afk they count as dead for this + return 2 + return 0 + return 1 + +/datum/objective/mutiny/update_explanation_text() + ..() + if(target && target.current) + explanation_text = "Assassinate or exile [target.name], the [!target_role_type ? target.assigned_role : target.special_role]." + else + explanation_text = "Free Objective" + + + +/datum/objective/maroon + var/target_role_type=0 + dangerrating = 5 + martyr_compatible = 1 + +/datum/objective/maroon/find_target_by_role(role, role_type=0, invert=0) + if(!invert) + target_role_type = role_type + ..() + return target + +/datum/objective/maroon/check_completion() + if(target && target.current) + if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite + return 1 + if(target.current.onCentcom() || target.current.onSyndieBase()) + return 0 + return 1 + +/datum/objective/maroon/update_explanation_text() + if(target && target.current) + explanation_text = "Prevent [target.name], the [!target_role_type ? target.assigned_role : target.special_role], from escaping alive." + else + explanation_text = "Free Objective" + + + +/datum/objective/debrain//I want braaaainssss + var/target_role_type=0 + dangerrating = 20 + +/datum/objective/debrain/find_target_by_role(role, role_type=0, invert=0) + if(!invert) + target_role_type = role_type + ..() + return target + +/datum/objective/debrain/check_completion() + if(!target)//If it's a free objective. + return 1 + if( !owner.current || owner.current.stat==DEAD )//If you're otherwise dead. + return 0 + if( !target.current || !isbrain(target.current) ) + return 0 + var/atom/A = target.current + while(A.loc) //check to see if the brainmob is on our person + A = A.loc + if(A == owner.current) + return 1 + return 0 + +/datum/objective/debrain/update_explanation_text() + ..() + if(target && target.current) + explanation_text = "Steal the brain of [target.name], the [!target_role_type ? target.assigned_role : target.special_role]." + else + explanation_text = "Free Objective" + + + +/datum/objective/protect//The opposite of killing a dude. + var/target_role_type=0 + dangerrating = 10 + martyr_compatible = 1 + +/datum/objective/protect/find_target_by_role(role, role_type=0, invert=0) + if(!invert) + target_role_type = role_type + ..() + return target + +/datum/objective/protect/check_completion() + if(!target) //If it's a free objective. + return 1 + if(target.current) + if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current)) + return 0 + return 1 + return 0 + +/datum/objective/protect/update_explanation_text() + ..() + if(target && target.current) + explanation_text = "Protect [target.name], the [!target_role_type ? target.assigned_role : target.special_role]." + else + explanation_text = "Free Objective" + + + +/datum/objective/hijack + explanation_text = "Hijack the shuttle to ensure no loyalist Nanotrasen crew escape alive and out of custody." + dangerrating = 25 + martyr_compatible = 0 //Technically you won't get both anyway. + +/datum/objective/hijack/check_completion() + if(!owner.current || owner.current.stat) + return 0 + if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME) + return 0 + if(issilicon(owner.current)) + return 0 + + var/area/A = get_area(owner.current) + if(SSshuttle.emergency.areaInstance != A) + return 0 + + for(var/mob/living/player in player_list) + if(player.mind && player.mind != owner) + if(player.stat != DEAD) + if(istype(player, /mob/living/silicon)) //Borgs are technically dead anyways + continue + if(get_area(player) == A) + if(!player.mind.special_role && !istype(get_turf(player.mind.current), /turf/simulated/floor/plasteel/shuttle/red)) + return 0 + return 1 + +/datum/objective/hijackclone + explanation_text = "Hijack the emergency shuttle by ensuring only you (or your copies) escape." + dangerrating = 25 + martyr_compatible = 0 + +/datum/objective/hijackclone/check_completion() + if(!owner.current) + return 0 + if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME) + return 0 + + var/area/A = SSshuttle.emergency.areaInstance + + for(var/mob/living/player in player_list) //Make sure nobody else is onboard + if(player.mind && player.mind != owner) + if(player.stat != DEAD) + if(istype(player, /mob/living/silicon)) + continue + if(get_area(player) == A) + if(player.real_name != owner.current.real_name && !istype(get_turf(player.mind.current), /turf/simulated/floor/plasteel/shuttle/red)) + return 0 + + for(var/mob/living/player in player_list) //Make sure at least one of you is onboard + if(player.mind && player.mind != owner) + if(player.stat != DEAD) + if(istype(player, /mob/living/silicon)) + continue + if(get_area(player) == A) + if(player.real_name == owner.current.real_name && !istype(get_turf(player.mind.current), /turf/simulated/floor/plasteel/shuttle/red)) + return 1 + return 0 + +/datum/objective/block + explanation_text = "Do not allow any organic lifeforms to escape on the shuttle alive." + dangerrating = 25 + martyr_compatible = 1 + +/datum/objective/block/check_completion() + if(!istype(owner.current, /mob/living/silicon)) + return 0 + if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME) + return 1 + + var/area/A = SSshuttle.emergency.areaInstance + + for(var/mob/living/player in player_list) + if(istype(player, /mob/living/silicon)) + continue + if(player.mind) + if(player.stat != DEAD) + if(get_area(player) == A) + return 0 + + return 1 + + +/datum/objective/escape + explanation_text = "Escape on the shuttle or an escape pod alive and without being in custody." + dangerrating = 5 + +/datum/objective/escape/check_completion() + if(issilicon(owner.current)) + return 0 + if(isbrain(owner.current)) + return 0 + if(!owner.current || owner.current.stat == DEAD) + return 0 + if(ticker.force_ending) //This one isn't their fault, so lets just assume good faith + return 1 + if(ticker.mode.station_was_nuked) //If they escaped the blast somehow, let them win + return 1 + if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME) + return 0 + var/turf/location = get_turf(owner.current) + if(!location) + return 0 + + if(istype(location, /turf/simulated/floor/plasteel/shuttle/red)) // Fails traitors if they are in the shuttle brig -- Polymorph + return 0 + + if(location.onCentcom() || location.onSyndieBase()) + return 1 + + return 0 + +/datum/objective/escape/escape_with_identity + dangerrating = 10 + var/target_real_name // Has to be stored because the target's real_name can change over the course of the round + var/target_missing_id + +/datum/objective/escape/escape_with_identity/find_target() + target = ..() + update_explanation_text() + +/datum/objective/escape/escape_with_identity/update_explanation_text() + if(target && target.current) + target_real_name = target.current.real_name + explanation_text = "Escape on the shuttle or an escape pod with the identity of [target_real_name], the [target.assigned_role]" + var/mob/living/carbon/human/H + if(ishuman(target.current)) + H = target.current + if(H && H.get_id_name() != target_real_name) + target_missing_id = 1 + else + explanation_text += " while wearing their identification card" + explanation_text += "." //Proper punctuation is important! + + else + explanation_text = "Free Objective." + +/datum/objective/escape/escape_with_identity/check_completion() + if(!target_real_name) + return 1 + if(!ishuman(owner.current)) + return 0 + var/mob/living/carbon/human/H = owner.current + if(..()) + if(H.dna.real_name == target_real_name) + if(H.get_id_name()== target_real_name || target_missing_id) + return 1 + return 0 + + +/datum/objective/survive + explanation_text = "Stay alive until the end." + dangerrating = 3 + +/datum/objective/survive/check_completion() + if(!owner.current || owner.current.stat == DEAD || isbrain(owner.current)) + return 0 //Brains no longer win survive objectives. --NEO + if(!is_special_character(owner.current)) //This fails borg'd traitors + return 0 + return 1 + + +/datum/objective/martyr + explanation_text = "Die a glorious death." + dangerrating = 1 + +/datum/objective/martyr/check_completion() + if(!owner.current) //Gibbed, etc. + return 1 + if(owner.current && owner.current.stat == DEAD) //You're dead! Yay! + return 1 + return 0 + + +/datum/objective/nuclear + explanation_text = "Destroy the station with a nuclear device." + martyr_compatible = 1 + +/datum/objective/nuclear/check_completion() + if(ticker && ticker.mode && ticker.mode.station_was_nuked) + return 1 + return 0 + + +var/global/list/possible_items = list() +/datum/objective/steal + var/datum/objective_item/targetinfo = null //Save the chosen item datum so we can access it later. + var/obj/item/steal_target = null //Needed for custom objectives (they're just items, not datums). + dangerrating = 5 //Overridden by the individual item's difficulty, but defaults to 5 for custom objectives. + martyr_compatible = 0 + +/datum/objective/steal/get_target() + return steal_target + +/datum/objective/steal/New() + ..() + if(!possible_items.len)//Only need to fill the list when it's needed. + init_subtypes(/datum/objective_item/steal,possible_items) + +/datum/objective/steal/find_target() + var/approved_targets = list() + for(var/datum/objective_item/possible_item in possible_items) + if(is_unique_objective(possible_item.targetitem) && !(owner.current.mind.assigned_role in possible_item.excludefromjob)) + approved_targets += possible_item + return set_target(safepick(approved_targets)) + +/datum/objective/steal/proc/set_target(datum/objective_item/item) + if(item) + targetinfo = item + + steal_target = targetinfo.targetitem + explanation_text = "Steal [targetinfo.name]." + dangerrating = targetinfo.difficulty + give_special_equipment() + return steal_target + else + explanation_text = "Free objective" + return + +/datum/objective/steal/proc/select_target() //For admins setting objectives manually. + var/list/possible_items_all = possible_items+"custom" + var/new_target = input("Select target:", "Objective target", steal_target) as null|anything in possible_items_all + if (!new_target) return + + if (new_target == "custom") //Can set custom items. + var/obj/item/custom_target = input("Select type:","Type") as null|anything in typesof(/obj/item) + if (!custom_target) return + var/tmp_obj = new custom_target + var/custom_name = tmp_obj:name + qdel(tmp_obj) + custom_name = stripped_input("Enter target name:", "Objective target", custom_name) + if (!custom_name) return + steal_target = custom_target + explanation_text = "Steal [custom_name]." + + else + set_target(new_target) + return steal_target + +/datum/objective/steal/check_completion() + if(!steal_target) return 1 + if(!isliving(owner.current)) return 0 + var/list/all_items = owner.current.GetAllContents() //this should get things in cheesewheels, books, etc. + + for(var/obj/I in all_items) //Check for items + if(istype(I, steal_target)) + if(!targetinfo) //If there's no targetinfo, then that means it was a custom objective. At this point, we know you have the item, so return 1. + return 1 + else if(targetinfo.check_special_completion(I))//Returns 1 by default. Items with special checks will return 1 if the conditions are fulfilled. + return 1 + + if(targetinfo && I.type in targetinfo.altitems) //Ok, so you don't have the item. Do you have an alternative, at least? + if(targetinfo.check_special_completion(I))//Yeah, we do! Don't return 0 if we don't though - then you could fail if you had 1 item that didn't pass and got checked first! + return 1 + return 0 + +/datum/objective/steal/give_special_equipment() + if(owner && owner.current && targetinfo) + if(istype(owner.current, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = owner.current + var/list/slots = list ("backpack" = slot_in_backpack) + for(var/eq_path in targetinfo.special_equipment) + var/obj/O = new eq_path + H.equip_in_one_of_slots(O, slots) + H.update_icons() + +var/global/list/possible_items_special = list() +/datum/objective/steal/special //ninjas are so special they get their own subtype good for them + +/datum/objective/steal/special/New() + ..() + if(!possible_items_special.len) + init_subtypes(/datum/objective_item/special,possible_items) + init_subtypes(/datum/objective_item/stack,possible_items) + +/datum/objective/steal/special/find_target() + return set_target(pick(possible_items_special)) + + + +/datum/objective/steal/exchange + dangerrating = 10 + martyr_compatible = 0 + +/datum/objective/steal/exchange/proc/set_faction(faction,otheragent) + target = otheragent + if(faction == "red") + targetinfo = new/datum/objective_item/unique/docs_blue + else if(faction == "blue") + targetinfo = new/datum/objective_item/unique/docs_red + explanation_text = "Acquire [targetinfo.name] held by [target.current.real_name], the [target.assigned_role] and syndicate agent" + steal_target = targetinfo.targetitem + + +/datum/objective/steal/exchange/update_explanation_text() + ..() + if(target && target.current) + explanation_text = "Acquire [targetinfo.name] held by [target.name], the [target.assigned_role] and syndicate agent" + else + explanation_text = "Free Objective" + + +/datum/objective/steal/exchange/backstab + dangerrating = 3 + +/datum/objective/steal/exchange/backstab/set_faction(faction) + if(faction == "red") + targetinfo = new/datum/objective_item/unique/docs_red + else if(faction == "blue") + targetinfo = new/datum/objective_item/unique/docs_blue + explanation_text = "Do not give up or lose [targetinfo.name]." + steal_target = targetinfo.targetitem + + +/datum/objective/download + dangerrating = 10 + +/datum/objective/download/proc/gen_amount_goal() + target_amount = rand(10,20) + explanation_text = "Download [target_amount] research level\s." + return target_amount + +/datum/objective/download/check_completion()//NINJACODE + if(!ishuman(owner.current)) + return 0 + + var/mob/living/carbon/human/H = owner.current + if(!H || H.stat == DEAD) + return 0 + + if(!istype(H.wear_suit, /obj/item/clothing/suit/space/space_ninja)) + return 0 + + var/obj/item/clothing/suit/space/space_ninja/SN = H.wear_suit + if(!SN.s_initialized) + return 0 + + var/current_amount + if(!SN.stored_research.len) + return 0 + else + for(var/datum/tech/current_data in SN.stored_research) + if(current_data.level) + current_amount += (current_data.level-1) + if(current_amount= target_amount)) + return 1 + else + return 0 + + + +/datum/objective/destroy + dangerrating = 10 + martyr_compatible = 1 + +/datum/objective/destroy/find_target() + var/list/possible_targets = active_ais(1) + var/mob/living/silicon/ai/target_ai = pick(possible_targets) + target = target_ai.mind + update_explanation_text() + return target + +/datum/objective/destroy/check_completion() + if(target && target.current) + if(target.current.stat == DEAD || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite + return 1 + return 0 + return 1 + +/datum/objective/destroy/update_explanation_text() + ..() + if(target && target.current) + explanation_text = "Destroy [target.name], the experimental AI." + else + explanation_text = "Free Objective" + +/datum/objective/summon_guns + explanation_text = "Steal at least five guns!" + +/datum/objective/summon_guns/check_completion() + if(!isliving(owner.current)) return 0 + var/guncount = 0 + var/list/all_items = owner.current.GetAllContents() //this should get things in cheesewheels, books, etc. + for(var/obj/I in all_items) //Check for guns + if(istype(I, /obj/item/weapon/gun)) + guncount++ + if(guncount >= 5) + return 1 + else + return 0 + return 0 + + + +//////////////////////////////// +// Changeling team objectives // +//////////////////////////////// + +/datum/objective/changeling_team_objective //Abstract type + martyr_compatible = 0 //Suicide is not teamwork! + explanation_text = "Changeling Friendship!" + var/min_lings = 3 //Minimum amount of lings for this team objective to be possible + var/escape_objective_compatible = FALSE + + +//Impersonate department +//Picks as many people as it can from a department (Security,Engineer,Medical,Science) +//and tasks the lings with killing and replacing them +/datum/objective/changeling_team_objective/impersonate_department + explanation_text = "Ensure X derpartment are killed, impersonated, and replaced by Changelings" + var/command_staff_only = FALSE //if this is true, it picks command staff instead + var/list/department_minds = list() + var/list/department_real_names = list() + var/department_string = "" + + +/datum/objective/changeling_team_objective/impersonate_department/proc/get_department_staff() + department_minds = list() + department_real_names = list() + + var/list/departments = list("Head of Security","Research Director","Chief Engineer","Chief Medical Officer") + var/department_head = pick(departments) + switch(department_head) + if("Head of Security") + department_string = "security" + if("Research Director") + department_string = "science" + if("Chief Engineer") + department_string = "engineering" + if("Chief Medical Officer") + department_string = "medical" + + var/ling_count = ticker.mode.changelings + + for(var/datum/mind/M in ticker.minds) + if(M in ticker.mode.changelings) + continue + if(department_head in get_department_heads(M.assigned_role)) + if(ling_count) + ling_count-- + department_minds += M + department_real_names += M.current.real_name + else + break + + if(!department_minds.len) + log_game("[type] has failed to find department staff, and has removed itself. the round will continue normally") + owner.objectives -= src + qdel(src) + return + + +/datum/objective/changeling_team_objective/impersonate_department/proc/get_heads() + department_minds = list() + department_real_names = list() + + //Needed heads is between min_lings and the maximum possible amount of command roles + //So at the time of writing, rand(3,6), it's also capped by the amount of lings there are + //Because you can't fill 6 head roles with 3 lings + + var/needed_heads = rand(min_lings,command_positions.len) + needed_heads = min(ticker.mode.changelings.len,needed_heads) + + var/list/heads = ticker.mode.get_living_heads() + for(var/datum/mind/head in heads) + if(head in ticker.mode.changelings) //Looking at you HoP. + continue + if(needed_heads) + department_minds += head + department_real_names += head.current.real_name + needed_heads-- + else + break + + if(!department_minds.len) + log_game("[type] has failed to find department heads, and has removed itself. the round will continue normally") + owner.objectives -= src + qdel(src) + return + + +/datum/objective/changeling_team_objective/impersonate_department/New(var/text) + ..() + if(command_staff_only) + get_heads() + else + get_department_staff() + + update_explanation_text() + + +/datum/objective/changeling_team_objective/impersonate_department/update_explanation_text() + ..() + if(!department_real_names.len || !department_minds.len) + explanation_text = "Free Objective" + return //Something fucked up, give them a win + + if(command_staff_only) + explanation_text = "Ensure changelings impersonate and escape as the following heads of staff: " + else + explanation_text = "Ensure changelings impersonate and escape as the following members of \the [department_string] department: " + + var/first = 1 + for(var/datum/mind/M in department_minds) + var/string = "[M.name] the [M.assigned_role]" + if(!first) + string = ", [M.name] the [M.assigned_role]" + else + first-- + explanation_text += string + + if(command_staff_only) + explanation_text += ", while the real heads are dead. This is a team objective." + else + explanation_text += ", while the real members are dead. This is a team objective." + + +/datum/objective/changeling_team_objective/impersonate_department/check_completion() + if(!department_real_names.len || !department_minds.len) + return 1 //Something fucked up, give them a win + + var/list/check_names = department_real_names.Copy() + + //Check each department member's mind to see if any of them made it to centcomm alive, if they did it's an automatic fail + for(var/datum/mind/M in department_minds) + if(M in ticker.mode.changelings) //Lings aren't picked for this, but let's be safe + continue + + if(M.current) + var/turf/mloc = get_turf(M.current) + if(mloc.onCentcom() && (M.current.stat != DEAD)) + return 0 //A Non-ling living target got to centcomm, fail + + //Check each staff member has been replaced, by cross referencing changeling minds, changeling current dna, the staff minds and their original DNA names + var/success = 0 + changelings: + for(var/datum/mind/changeling in ticker.mode.changelings) + if(success >= department_minds.len) //We did it, stop here! + return 1 + if(ishuman(changeling.current)) + var/mob/living/carbon/human/H = changeling.current + var/turf/cloc = get_turf(changeling.current) + if(cloc && cloc.onCentcom() && (changeling.current.stat != DEAD)) //Living changeling on centcomm.... + for(var/name in check_names) //Is he (disguised as) one of the staff? + if(H.dna.real_name == name) + check_names -= name //This staff member is accounted for, remove them, so the team don't succeed by escape as 7 of the same engineer + success++ //A living changeling staff member made it to centcomm + continue changelings + + if(success >= department_minds.len) + return 1 + return 0 + + + + +//A subtype of impersonate_derpartment +//This subtype always picks as many command staff as it can (HoS,HoP,Cap,CE,CMO,RD) +//and tasks the lings with killing and replacing them +/datum/objective/changeling_team_objective/impersonate_department/impersonate_heads + explanation_text = "Have X or more heads of staff escape on the shuttle disguised as heads, while the real heads are dead" + command_staff_only = TRUE + + + diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 9d9457f7d7b..10ccb88d386 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -270,9 +270,13 @@ var/text = stripped_input(user, "What do you want to say your thralls and fellow shadowlings?.", "Hive Chat", "") if(!text) return + var/my_message = "\[Shadowling\] [user.real_name]: [text]" for(var/mob/M in mob_list) - if(is_shadow_or_thrall(M) || (M in dead_mob_list)) - M << "\[Shadowling\] [user.real_name]: [text]" + if(is_shadow_or_thrall(M)) + M << my_message + if(M in dead_mob_list) + M << "(F) [my_message]" + /obj/effect/proc_holder/spell/self/shadowling_regenarmor //Resets a shadowling's species to normal, removes genetic defects, and re-equips their armor @@ -746,9 +750,12 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell var/text = stripped_input(user, "What do you want to say your masters and fellow thralls?.", "Lesser Commune", "") if(!text) return + text = "\[Thrall\] [user.real_name]: [text]" for(var/mob/M in mob_list) - if(is_shadow_or_thrall(M) || (M in dead_mob_list)) - M << "\[Thrall\] [user.real_name]: [text]" + if(is_shadow_or_thrall(M)) + M << text + if(isobserver(M)) + M << "(F) [text]" log_say("[user.real_name]/[user.key] : [text]") @@ -887,8 +894,10 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell var/text = stripped_input(user, "What do you want to say to fellow thralls and shadowlings?.", "Hive Chat", "") if(!text) return - text = "[text]" + text = "\[Ascendant\] [user.real_name]: [text]" for(var/mob/M in mob_list) - if(is_shadow_or_thrall(M) || (M in dead_mob_list)) - M << "\[Ascendant\] [user.real_name]: [text]" //Bigger text for ascendants. + if(is_shadow_or_thrall(M)) + M << text + if(isobserver(M)) + M << "(F) [text]" log_say("[user.real_name]/[user.key] : [text]") diff --git a/code/game/gamemodes/traitor/double_agents.dm b/code/game/gamemodes/traitor/double_agents.dm index 76bcc67c856..af284603f6a 100644 --- a/code/game/gamemodes/traitor/double_agents.dm +++ b/code/game/gamemodes/traitor/double_agents.dm @@ -32,19 +32,27 @@ // Assassinate var/datum/mind/target_mind = target_list[traitor] if(issilicon(target_mind.current)) - var/datum/objective/default/destroy/destroy_objective = add_objective(traitor, /datum/objective/default/destroy) + var/datum/objective/destroy/destroy_objective = new + destroy_objective.owner = traitor destroy_objective.target = target_mind destroy_objective.update_explanation_text() + traitor.objectives += destroy_objective else - var/datum/objective/default/assassinate/kill_objective = add_objective(traitor, /datum/objective/default/assassinate) + var/datum/objective/assassinate/kill_objective = new + kill_objective.owner = traitor kill_objective.target = target_mind kill_objective.update_explanation_text() + traitor.objectives += kill_objective // Escape if(issilicon(traitor.current)) - add_objective(traitor, /datum/objective/escape_obj/survive) + var/datum/objective/survive/survive_objective = new + survive_objective.owner = traitor + traitor.objectives += survive_objective else - add_objective(traitor, /datum/objective/escape_obj/escape) + var/datum/objective/escape/escape_objective = new + escape_objective.owner = traitor + traitor.objectives += escape_objective else ..() // Give them standard objectives. diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 1efb4626f09..1fb01bba993 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -89,14 +89,25 @@ var/objective_count = 0 if(prob(10)) - add_objective(traitor, /datum/objective/escape_obj/block) + var/datum/objective/block/block_objective = new + block_objective.owner = traitor + traitor.objectives += block_objective + objective_count++ for(var/i = objective_count, i < config.traitor_objectives_amount, i++) - add_objective(traitor, /datum/objective/default/assassinate) + var/datum/objective/assassinate/kill_objective = new + kill_objective.owner = traitor + kill_objective.find_target() + traitor.objectives += kill_objective + + var/datum/objective/survive/survive_objective = new + survive_objective.owner = traitor + traitor.objectives += survive_objective - add_objective(traitor, /datum/objective/escape_obj/survive) else - var/objective_count = 0 + var/is_hijacker = prob(10) + var/martyr_chance = prob(20) + var/objective_count = is_hijacker //Hijacking counts towards number of objectives if(!exchange_blue && traitors.len >= 8) //Set up an exchange if there are enough traitors if(!exchange_red) exchange_red = traitor @@ -105,7 +116,56 @@ assign_exchange_role(exchange_red) assign_exchange_role(exchange_blue) objective_count += 1 //Exchange counts towards number of objectives - generate_objectives(traitor, config.traitor_objectives_amount - objective_count, TRUE) + var/list/active_ais = active_ais() + for(var/i = objective_count, i < config.traitor_objectives_amount, i++) + if(prob(50)) + if(active_ais.len && prob(100/joined_player_list.len)) + var/datum/objective/destroy/destroy_objective = new + destroy_objective.owner = traitor + destroy_objective.find_target() + traitor.objectives += destroy_objective + else if(prob(30)) + var/datum/objective/maroon/maroon_objective = new + maroon_objective.owner = traitor + maroon_objective.find_target() + traitor.objectives += maroon_objective + else + var/datum/objective/assassinate/kill_objective = new + kill_objective.owner = traitor + kill_objective.find_target() + traitor.objectives += kill_objective + else + var/datum/objective/steal/steal_objective = new + steal_objective.owner = traitor + steal_objective.find_target() + traitor.objectives += steal_objective + + if(is_hijacker && objective_count <= config.traitor_objectives_amount) //Don't assign hijack if it would exceed the number of objectives set in config.traitor_objectives_amount + if (!(locate(/datum/objective/hijack) in traitor.objectives)) + var/datum/objective/hijack/hijack_objective = new + hijack_objective.owner = traitor + traitor.objectives += hijack_objective + return + + + var/martyr_compatibility = 1 //You can't succeed in stealing if you're dead. + for(var/datum/objective/O in traitor.objectives) + if(!O.martyr_compatible) + martyr_compatibility = 0 + break + + if(martyr_compatibility && martyr_chance) + var/datum/objective/martyr/martyr_objective = new + martyr_objective.owner = traitor + traitor.objectives += martyr_objective + return + + else + if(!(locate(/datum/objective/escape) in traitor.objectives)) + var/datum/objective/escape/escape_objective = new + escape_objective.owner = traitor + traitor.objectives += escape_objective + return @@ -150,6 +210,8 @@ give_codewords(killer) killer.set_syndie_radio() killer << "Your radio has been upgraded! Use :t to speak on an encrypted channel with Syndicate Agents!" + killer << "In the top right corner of the screen you will find the Malfunctions tab, where you can purchase various abilities, from upgraded surveillance to station ending doomsday devices." + killer << "You are also capable of hacking APCs, which grants you more points to spend on your Malfunction powers. The drawback is that a hacked APC will give you away if spotted by the crew. Hacking an APC takes 60 seconds." killer.verbs += /mob/living/silicon/ai/proc/choose_modules killer.malf_picker = new /datum/module_picker @@ -273,13 +335,13 @@ faction = "blue" //Assign objectives - var/datum/objective/default/steal/exchange/exchange_objective = new + var/datum/objective/steal/exchange/exchange_objective = new exchange_objective.set_faction(faction,((faction == "red") ? exchange_blue : exchange_red)) exchange_objective.owner = owner owner.objectives += exchange_objective if(prob(20)) - var/datum/objective/default/steal/exchange/backstab/backstab_objective = new + var/datum/objective/steal/exchange/backstab/backstab_objective = new backstab_objective.set_faction(faction) backstab_objective.owner = owner owner.objectives += backstab_objective diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 9ba6d74ce4a..e8a862d7aa4 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -254,7 +254,7 @@ var/global/list/multiverse = list() evil = TRUE else user << "With your new found power you could easily defend the station!" - var/datum/objective/escape_obj/survive/new_objective = new /datum/objective/escape_obj/survive + var/datum/objective/survive/new_objective = new /datum/objective/survive new_objective.owner = usr.mind new_objective.explanation_text = "Survive, and help defend the innocent from the mobs of multiverse clones." usr << "Objective #[1]: [new_objective.explanation_text]" @@ -302,15 +302,15 @@ var/global/list/multiverse = list() equip_copy(M) if(evil) - var/datum/objective/hijackclone/new_objective = add_objective(M.mind, /datum/objective/hijackclone) - new_objective.owner = M.mind - M.mind.objectives += new_objective - new_objective.explanation_text = "Ensure only [usr.real_name] and their copies are on the shuttle!" - M << "Objective #[1]: [new_objective.explanation_text]" + var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone + hijack_objective.owner = M.mind + M.mind.objectives += hijack_objective + hijack_objective.explanation_text = "Ensure only [usr.real_name] and their copies are on the shuttle!" + M << "Objective #[1]: [hijack_objective.explanation_text]" M.mind.special_role = "multiverse traveller" log_game("[M.key] was made a multiverse traveller with the objective to help [usr.real_name] hijack.") else - var/datum/objective/default/protect/new_objective = add_objective(M.mind, /datum/objective/default/protect) + var/datum/objective/protect/new_objective = new /datum/objective/protect new_objective.owner = M.mind new_objective.target = usr.mind new_objective.explanation_text = "Protect [usr.real_name], your copy, and help them defend the innocent from the mobs of multiverse clones." diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 84b9e6da663..26817a87bce 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -238,24 +238,27 @@ /obj/item/device/soulstone/proc/getCultGhost(obj/item/device/soulstone/C, mob/living/carbon/human/T, mob/U) + var/mob/dead/observer/chosen_ghost - var/list/consenting_candidates = pollCandidates("Would you like to play as a Shade?", be_special_flag = ROLE_CULTIST, poll_time = 100) + for(var/mob/dead/observer/ghost in player_list) //We put them back in their body + if(ghost.mind && ghost.mind.current == T && ghost.client) + chosen_ghost = ghost + break - if(!T) //target mob got soulstoned or gibbed during sleep(50) + if(!chosen_ghost) //Failing that, we grab a ghost + var/list/consenting_candidates = pollCandidates("Would you like to play as a Shade?", be_special_flag = ROLE_CULTIST, poll_time = 100) + if(consenting_candidates.len) + chosen_ghost = pick(consenting_candidates) + if(!T) return 0 - - if(consenting_candidates.len) - var/client/ghost = null - ghost = pick(consenting_candidates) - if(C.contents.len) //If they used the soulstone on someone else in the meantime - return 0 - if(!T.client) //If the original returns in the alloted time - T.client = ghost - for(var/obj/item/W in T) - T.unEquip(W) - init_shade(C, T, U) - qdel(T) - return 1 - else + if(!chosen_ghost) U << "The ghost has fled beyond your grasp." return 0 + if(C.contents.len) //If they used the soulstone on someone else in the meantime + return 0 + T.ckey = chosen_ghost.ckey + for(var/obj/item/W in T) + T.unEquip(W) + init_shade(C, T, U) + qdel(T) + return 1 diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 9d09dbdd948..752694f86ab 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -211,6 +211,7 @@ name = "Lesser Summon Guns" spell_type = /obj/effect/proc_holder/spell/targeted/infinite_guns log_name = "IG" + cost = 4 /datum/spellbook_entry/barnyard name = "Barnyard Curse" diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index e8aa52cf4a4..1dac752b967 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -48,7 +48,51 @@ /datum/game_mode/proc/forge_wizard_objectives(datum/mind/wizard) - generate_objectives(wizard, 2) + switch(rand(1,100)) + if(1 to 30) + + var/datum/objective/assassinate/kill_objective = new + kill_objective.owner = wizard + kill_objective.find_target() + wizard.objectives += kill_objective + + if (!(locate(/datum/objective/escape) in wizard.objectives)) + var/datum/objective/escape/escape_objective = new + escape_objective.owner = wizard + wizard.objectives += escape_objective + if(31 to 60) + var/datum/objective/steal/steal_objective = new + steal_objective.owner = wizard + steal_objective.find_target() + wizard.objectives += steal_objective + + if (!(locate(/datum/objective/escape) in wizard.objectives)) + var/datum/objective/escape/escape_objective = new + escape_objective.owner = wizard + wizard.objectives += escape_objective + + if(61 to 85) + var/datum/objective/assassinate/kill_objective = new + kill_objective.owner = wizard + kill_objective.find_target() + wizard.objectives += kill_objective + + var/datum/objective/steal/steal_objective = new + steal_objective.owner = wizard + steal_objective.find_target() + wizard.objectives += steal_objective + + if (!(locate(/datum/objective/survive) in wizard.objectives)) + var/datum/objective/survive/survive_objective = new + survive_objective.owner = wizard + wizard.objectives += survive_objective + + else + if (!(locate(/datum/objective/hijack) in wizard.objectives)) + var/datum/objective/hijack/hijack_objective = new + hijack_objective.owner = wizard + wizard.objectives += hijack_objective + return /datum/game_mode/proc/name_wizard(mob/living/carbon/human/wizard_mob) diff --git a/code/game/jobs/job/cargo_service.dm b/code/game/jobs/job/cargo_service.dm index cd512286c10..f22bd2daed4 100644 --- a/code/game/jobs/job/cargo_service.dm +++ b/code/game/jobs/job/cargo_service.dm @@ -116,9 +116,9 @@ Bartender ears = /obj/item/device/radio/headset/headset_srv uniform = /obj/item/clothing/under/rank/bartender suit = /obj/item/clothing/suit/armor/vest - backpack_contents = list(/obj/item/ammo_casing/shotgun/beanbag=4) + backpack_contents = list(/obj/item/weapon/storage/box/beanbag=1) shoes = /obj/item/clothing/shoes/laceup - + /* Cook */ diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 922c0a71cd5..47e13d501e7 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -36,6 +36,10 @@ component_parts += new /obj/item/stack/cable_coil(null, 1) RefreshParts() +/obj/machinery/sleeper/Destroy() + go_out() + . = ..() + /obj/machinery/sleeper/RefreshParts() var/E var/I @@ -83,10 +87,6 @@ default_deconstruction_crowbar(I) -/obj/machinery/sleeper/ex_act(severity, target) - go_out() - ..() - /obj/machinery/sleeper/emp_act(severity) if(stat & (BROKEN|NOPOWER)) ..(severity) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 1a20b2ab3ce..1ba91162918 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -187,10 +187,11 @@ else if (!shorted) ui_interact(user) -/obj/machinery/alarm/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/alarm/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ + datum/tgui/master_ui = null, datum/ui_state/state = default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) - ui = new(user, src, ui_key, "air_alarm", name, 480, 660) + ui = new(user, src, ui_key, "air_alarm", name, 440, 650, master_ui, state) ui.open() /obj/machinery/alarm/get_ui_data(mob/user) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 76e0ff5b471..7b0d3fcd3d8 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -279,10 +279,11 @@ update_flag return ui_interact(user) -/obj/machinery/portable_atmospherics/canister/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/portable_atmospherics/canister/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ + datum/tgui/master_ui = null, datum/ui_state/state = physical_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) - ui = new(user, src, ui_key, "canister", name, 405, 405, state = physical_state) + ui = new(user, src, ui_key, "canister", name, 405, 405, master_ui, state) ui.open() /obj/machinery/portable_atmospherics/canister/get_ui_data() diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index b1253d425dd..1a62efe579e 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -174,16 +174,15 @@ var/normaldoorcontrol = 0 var/specialfunctions = OPEN // Bitflag, see assembly file -/obj/machinery/button/door/New(loc, ndir = 0, built = 0) - ..() - if(id && !built && !device) +/obj/machinery/button/door/setup_device() + if(!device) if(normaldoorcontrol) var/obj/item/device/assembly/control/airlock/A = new(src) device = A A.specialfunctions = specialfunctions else device = new /obj/item/device/assembly/control(src) - + ..() /obj/machinery/button/massdriver name = "mass driver button" diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 627f5727480..8c30cfc0c41 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -186,11 +186,12 @@ H << "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?
" H.hardset_dna(ui, se, H.real_name, null, mrace, features) - H.faction |= factions + if(H) + H.faction |= factions - H.set_cloned_appearance() + H.set_cloned_appearance() - H.suiciding = 0 + H.suiciding = 0 src.attempting = 0 return 1 diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 8cfd51a294f..d706a89a1bf 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -297,7 +297,8 @@ src.updateUsrDialog() return - src.active_record.fields = diskette.fields.Copy() + for(var/key in diskette.fields) + src.active_record.fields[key] = diskette.fields[key] src.temp = "Load successful." if("eject") diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index 97339c1bd53..2651ed274ed 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -108,8 +108,8 @@ || locate(/obj/machinery/computer/cloning, get_step(src, SOUTH)) \ || locate(/obj/machinery/computer/cloning, get_step(src, EAST)) \ || locate(/obj/machinery/computer/cloning, get_step(src, WEST))) - - occupant.notify_ghost_cloning("Your corpse has been placed into a cloning scanner. Re-enter your corpse if you want to be cloned!", source = src) + if(!occupant.suiciding && !(occupant.disabilities & NOCLONE)) + occupant.notify_ghost_cloning("Your corpse has been placed into a cloning scanner. Re-enter your corpse if you want to be cloned!", source = src) var/obj/machinery/computer/scan_consolenew/console for(dir in list(NORTH,EAST,SOUTH,WEST)) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 74869fafb76..178af87a6d3 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -54,6 +54,7 @@ var/list/airlock_overlays = list() var/autoclose = 1 var/obj/item/device/doorCharge/charge = null //If applied, causes an explosion upon opening the door var/detonated = 0 + var/doorsound = 'sound/machines/airlock.ogg' var/airlock_material = null //material of inner filling; if its an airlock with glass, this should be set to "glass" var/overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' @@ -507,7 +508,7 @@ About the new airlock wires panel: src.aiHacking=0 return else if(!src.canAIHack()) - user << "We've lost our connection! Unable to hack airlock." + user << "Connection lost! Unable to hack airlock." src.aiHacking=0 return user << "Fault confirmed: airlock control wire disabled or cut." @@ -519,7 +520,7 @@ About the new airlock wires panel: src.aiHacking=0 return else if(!src.canAIHack()) - user << "We've lost our connection! Unable to hack airlock." + user << "Connection lost! Unable to hack airlock." src.aiHacking=0 return user << "Upload access confirmed. Loading control program into airlock software." @@ -529,7 +530,7 @@ About the new airlock wires panel: src.aiHacking=0 return else if(!src.canAIHack()) - user << "We've lost our connection! Unable to hack airlock." + user << "Connection lost! Unable to hack airlock." src.aiHacking=0 return user << "Transfer complete. Forcing airlock to execute program." @@ -657,7 +658,7 @@ About the new airlock wires panel: else if (src.normalspeed) normalspeed = 0 else - usr << text("Door timing circurity already accellerated.") + usr << text("Door timing circuitry already accelerated.") if(7) //close door @@ -762,7 +763,7 @@ About the new airlock wires panel: normalspeed = 1 src.updateUsrDialog() else - usr << text("Door timing circurity currently operating normally.") + usr << text("Door timing circuitry currently operating normally.") if(7) //open door @@ -981,12 +982,7 @@ About the new airlock wires panel: if(emagged) return 0 use_power(50) - if(istype(src, /obj/machinery/door/airlock/glass)) - playsound(src.loc, 'sound/machines/windowdoor.ogg', 100, 1) - if(istype(src, /obj/machinery/door/airlock/clown)) - playsound(src.loc, 'sound/items/bikehorn.ogg', 30, 1) - else - playsound(src.loc, 'sound/machines/airlock.ogg', 30, 1) + playsound(src.loc, doorsound, 30, 1) if(src.closeOther != null && istype(src.closeOther, /obj/machinery/door/airlock/) && !src.closeOther.density) src.closeOther.close() else @@ -1035,12 +1031,7 @@ About the new airlock wires panel: if(emagged) return use_power(50) - if(istype(src, /obj/machinery/door/airlock/glass)) - playsound(src.loc, 'sound/machines/windowdoor.ogg', 30, 1) - if(istype(src, /obj/machinery/door/airlock/clown)) - playsound(src.loc, 'sound/items/bikehorn.ogg', 30, 1) - else - playsound(src.loc, 'sound/machines/airlock.ogg', 30, 1) + playsound(src.loc, doorsound, 30, 1) else playsound(src.loc, 'sound/machines/airlockforced.ogg', 30, 1) @@ -1065,9 +1056,7 @@ About the new airlock wires panel: air_update_turf(1) update_freelook_sight() if(safe) - if(locate(/mob/living) in get_turf(src)) - sleep(1) - open() + CheckForMobs() return 1 /obj/machinery/door/airlock/proc/prison_open() @@ -1176,4 +1165,4 @@ About the new airlock wires panel: lights = 0 locked = 1 loseMainPower() - loseBackupPower() + loseBackupPower() \ No newline at end of file diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index 55bfc93bc04..49f7f636eb9 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -13,10 +13,11 @@ add_fingerprint(user) ui_interact(user) -/obj/item/weapon/electronics/airlock/ui_interact(mob/user, ui_key = "main", var/datum/tgui/ui = null, force_open = 0) - SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/item/weapon/electronics/airlock/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ + datum/tgui/master_ui = null, datum/ui_state/state = hands_state) + SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) - ui = new(user, src, ui_key, "airlock_electronics", name, 975, 420, state = hands_state) + ui = new(user, src, ui_key, "airlock_electronics", name, 975, 420, master_ui, state) ui.open() /obj/item/weapon/electronics/airlock/get_ui_data() diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 852f62ffeca..4c7a47d8488 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -183,6 +183,7 @@ desc = "Honkhonkhonk" icon = 'icons/obj/doors/airlocks/station/bananium.dmi' var/mineral = "bananium" + doorsound = 'sound/items/bikehorn.ogg' doortype = /obj/structure/door_assembly/door_assembly_clown /obj/machinery/door/airlock/sandstone @@ -209,6 +210,7 @@ overlays_file = 'icons/obj/doors/airlocks/station2/overlays.dmi' opacity = 0 doortype = /obj/structure/door_assembly/door_assembly_glass + doorsound = 'sound/machines/windowdoor.ogg' glass = 1 ////////////////////////////////// @@ -309,4 +311,4 @@ opacity = 0 doortype = null glass = 1 - bound_width = 64 // 2x1 + bound_width = 64 // 2x1 \ No newline at end of file diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index bf8f66cb6fa..3a67b933959 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -79,6 +79,11 @@ /obj/machinery/door/proc/CanAStarPass(var/obj/item/weapon/card/id/ID) return !density +/obj/machinery/door/proc/CheckForMobs() + if(locate(/mob/living) in get_turf(src)) + sleep(1) + open() + /obj/machinery/door/proc/bumpopen(mob/user) if(operating) return @@ -221,6 +226,7 @@ update_icon() if(visible && !glass) SetOpacity(1) + CheckForMobs() operating = 0 air_update_turf(1) update_freelook_sight() diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index 1917c75065f..baa872a15f0 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -135,32 +135,32 @@ if(work_sound) playsound(src, work_sound, 50, 1) icon_state = icon_creating - spawn(30) + sleep(30) + icon_state = icon_on + metal -= metal_cost + glass -= glass_cost + if(metal < 0) + metal = 0 + if(glass < 0) + glass = 0 + if(power_used) + use_power(power_used) + new dispense_type(loc) + if(create_sound) + playsound(src, create_sound, 50, 1) + if(end_create_message) + visible_message("[src] [end_create_message]") + icon_state = icon_recharging + sleep(cooldownTime) + if(stat != BROKEN) icon_state = icon_on - metal -= metal_cost - glass -= glass_cost - if(metal < 0) - metal = 0 - if(glass < 0) - glass = 0 - if(power_used) - use_power(power_used) - new dispense_type(loc) - if(create_sound) - playsound(src, create_sound, 50, 1) - if(end_create_message) - visible_message("[src] [end_create_message]") - icon_state = icon_recharging - spawn(cooldownTime) - if(stat != BROKEN) - icon_state = icon_on - else - icon_state = icon_off - droneMadeRecently = 0 - if(recharge_sound) - playsound(src, recharge_sound, 50, 1) - if(recharge_message) - visible_message("[src] [recharge_message]") + else + icon_state = icon_off + droneMadeRecently = 0 + if(recharge_sound) + playsound(src, recharge_sound, 50, 1) + if(recharge_message) + visible_message("[src] [recharge_message]") /obj/machinery/droneDispenser/attackby(obj/item/O, mob/living/user) if(istype(O, /obj/item/stack)) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 62162225baf..d2cdf0153f1 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -504,8 +504,7 @@ if(!tryToShootAt(targets)) if(!always_up) - spawn() - popDown() // no valid targets, close the cover + popDown() // no valid targets, close the cover /obj/machinery/porta_turret/proc/tryToShootAt(list/atom/movable/targets) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index c8471e64002..8242bd0a562 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -153,10 +153,11 @@ /obj/machinery/space_heater/interact(mob/user) ui_interact(user) -/obj/machinery/space_heater/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/space_heater/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ + datum/tgui/master_ui = null, datum/ui_state/state = physical_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) - ui = new(user, src, ui_key, "space_heater", name, 400, 305, state = physical_state) + ui = new(user, src, ui_key, "space_heater", name, 400, 305, master_ui, state) ui.open() /obj/machinery/space_heater/ui_act(action, params) diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 77fd9702487..3da70a1c3e2 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -44,9 +44,12 @@ /obj/machinery/status_display/New() ..() - spawn(5) // must wait for map loading to finish - if(SSradio) - SSradio.add_object(src, frequency) + if(SSradio) + SSradio.add_object(src, frequency) + +/obj/machinery/status_display/initialize() + if(SSradio) + SSradio.add_object(src, frequency) /obj/machinery/status_display/Destroy() if(SSradio) diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index a97f4cc6bc0..d8fce89f1ea 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -80,11 +80,18 @@ custom_objective.owner = N.mind N.mind.objectives += custom_objective - add_objective(N.mind, /datum/objective/escape_obj/escape, 1) + var/datum/objective/escape/escape_objective = new + escape_objective.owner = N.mind + N.mind.objectives += escape_objective M << "You have joined the ranks of the Syndicate and become a traitor to the station!" + var/obj_count = 1 + for(var/datum/objective/OBJ in M.mind.objectives) + M << "Objective #[obj_count]: [OBJ.explanation_text]" + obj_count++ + src.updateUsrDialog() return diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 6f6950527ab..883013d04f0 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -114,9 +114,8 @@ wires.Interact(user) if(!open_panel) if(!active) - spawn() - settings(user) - return + settings(user) + return else if(anchored) user << "The bomb is bolted to the floor!" return diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index f73c58acdd7..5b30ada2d0e 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -14,21 +14,11 @@ //6 = blood, open door //7 = blood, closed door //8 = blood, running - var/panel = 0 - //0 = closed - //1 = open - var/hacked = 1 //Bleh, screw hacking, let's have it hacked by default. - //0 = not hacked - //1 = hacked var/gibs_ready = 0 var/obj/crayon -/obj/machinery/washing_machine/verb/start() - set name = "Start Washing" - set category = "Object" - set src in oview(1) - - if(usr.stat || usr.restrained() || !usr.canmove) +/obj/machinery/washing_machine/AltClick(mob/user) + if(!user.canUseTopic(src)) return if( state != 4 ) @@ -183,12 +173,9 @@ /obj/machinery/washing_machine/update_icon() - icon_state = "wm_[state][panel]" + icon_state = "wm_[state]0" /obj/machinery/washing_machine/attackby(obj/item/weapon/W, mob/user, params) - /*if(istype(W,/obj/item/weapon/screwdriver)) - panel = !panel - user << "\blue you [panel ? "open" : "close"] the [src]'s maintenance panel"*/ if(istype(W,/obj/item/toy/crayon) ||istype(W,/obj/item/weapon/stamp)) if( state in list( 1, 3, 6 ) ) if(!crayon) @@ -201,7 +188,7 @@ else ..() else if(istype(W,/obj/item/weapon/grab)) - if( (state == 1) && hacked) + if(state == 1) var/obj/item/weapon/grab/G = W if(iscorgi(G.affecting)) G.affecting.loc = src @@ -249,9 +236,6 @@ if ( istype(W,/obj/item/clothing/head/syndicatefake ) ) user << "This item does not fit." return -// if ( istype(W,/obj/item/clothing/head/powered ) ) -// user << "This item does not fit." -// return if ( istype(W,/obj/item/clothing/head/helmet ) ) user << "This item does not fit." return @@ -305,4 +289,4 @@ state = 1 - update_icon() \ No newline at end of file + update_icon() diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm index 4748c08ad48..ef9962cf0b4 100644 --- a/code/game/machinery/wishgranter.dm +++ b/code/game/machinery/wishgranter.dm @@ -45,7 +45,14 @@ ticker.mode.traitors += user.mind user.mind.special_role = "Avatar of the Wish Granter" - add_objective(user.mind, /datum/objective/escape_obj/hijack, 1) + var/datum/objective/hijack/hijack = new + hijack.owner = user.mind + user.mind.objectives += hijack + + var/obj_count = 1 + for(var/datum/objective/OBJ in user.mind.objectives) + user << "Objective #[obj_count]: [OBJ.explanation_text]" + obj_count++ user << "You have a very bad feeling about this." diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 622686e70ec..0beb82c3cdc 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -396,7 +396,7 @@ add_part_set_to_queue(filter.get("partset_to_queue")) return update_queue_on_page() if(href_list["process_queue"]) - spawn(-1) + spawn(0) if(processing_queue || being_built) return 0 processing_queue = 1 diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 3a5f8df7da2..689d83d7676 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -407,9 +407,17 @@ events.fireEvent("onMove",get_turf(src)) /obj/mecha/Process_Spacemove(var/movement_dir = 0) - if(occupant) - return occupant.Process_Spacemove(movement_dir) //We'll just say you used the clamp to grab the wall - return ..() + . = ..() + if(.) + return 1 + + var/atom/movable/backup = get_spacemove_backup() + if(backup) + if(istype(backup) && movement_dir && !!backup.anchored) + if(backup.newtonian_move(turn(movement_dir, 180))) + if(occupant) + occupant << "You push off of [backup] to propel yourself." + return 1 /obj/mecha/relaymove(mob/user,direction) if(!direction) diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/contraband.dm similarity index 100% rename from code/game/objects/effects/decals/contraband.dm rename to code/game/objects/effects/contraband.dm diff --git a/code/game/objects/effects/decals/Cleanable/aliens.dm b/code/game/objects/effects/decals/Cleanable/aliens.dm index 1326a890d7d..7e358f18fb4 100644 --- a/code/game/objects/effects/decals/Cleanable/aliens.dm +++ b/code/game/objects/effects/decals/Cleanable/aliens.dm @@ -5,7 +5,6 @@ desc = "It's green and acidic. It looks like... blood?" gender = PLURAL density = 0 - anchored = 1 layer = 2 icon = 'icons/effects/blood.dmi' icon_state = "xfloor1" diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 30d74ba6970..20c32cca078 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -3,7 +3,6 @@ desc = "It's red and gooey. Perhaps it's the chef's cooking?" gender = PLURAL density = 0 - anchored = 1 layer = 2 icon = 'icons/effects/blood.dmi' icon_state = "floor1" @@ -39,7 +38,6 @@ desc = "Your instincts say you shouldn't be following these." gender = PLURAL density = 0 - anchored = 1 layer = 2 random_icon_states = null var/list/existing_dirs = list() @@ -55,7 +53,6 @@ desc = "They look bloody and gruesome." gender = PLURAL density = 0 - anchored = 1 layer = 2 icon = 'icons/effects/blood.dmi' icon_state = "gibbl5" @@ -88,18 +85,18 @@ /obj/effect/decal/cleanable/blood/gibs/proc/streak(list/directions) - spawn (0) - var/direction = pick(directions) - for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++) - sleep(3) - if (i > 0) - var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc) - for(var/datum/disease/D in src.viruses) - var/datum/disease/ND = D.Copy(1) - b.viruses += ND - ND.holder = b - if (step_to(src, get_step(src, direction), 0)) - break + set waitfor = 0 + var/direction = pick(directions) + for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++) + sleep(3) + if (i > 0) + var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc) + for(var/datum/disease/D in src.viruses) + var/datum/disease/ND = D.Copy(1) + b.viruses += ND + ND.holder = b + if (step_to(src, get_step(src, direction), 0)) + break /obj/effect/decal/cleanable/blood/drip name = "drips of blood" diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index 21ded000917..008a0ab9084 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -3,7 +3,6 @@ desc = "Someone should clean that up." gender = PLURAL density = 0 - anchored = 1 layer = 2 icon = 'icons/obj/objects.dmi' icon_state = "shards" @@ -14,7 +13,6 @@ gender = PLURAL icon = 'icons/obj/objects.dmi' icon_state = "ash" - anchored = 1 /obj/effect/decal/cleanable/ash/New() ..() @@ -29,7 +27,6 @@ icon_state = "dirt" gender = PLURAL density = 0 - anchored = 1 layer = 2 mouse_opacity = 0 @@ -38,7 +35,6 @@ desc = "It's still good. Four second rule!" gender = PLURAL density = 0 - anchored = 1 layer = 2 icon = 'icons/effects/effects.dmi' icon_state = "flour" @@ -48,7 +44,6 @@ desc = "Jeez. I hope that's not for lunch." gender = PLURAL density = 0 - anchored = 1 layer = 2 luminosity = 1 icon = 'icons/effects/effects.dmi' @@ -61,7 +56,6 @@ name = "cobweb" desc = "Somebody should remove that." density = 0 - anchored = 1 layer = 3 icon = 'icons/effects/effects.dmi' icon_state = "cobweb1" @@ -74,7 +68,6 @@ name = "gooey grey mass" desc = "It looks like a melted... something." density = 0 - anchored = 1 layer = 3 icon = 'icons/obj/chemical.dmi' icon_state = "molten" @@ -83,7 +76,6 @@ name = "cobweb" desc = "Somebody should remove that." density = 0 - anchored = 1 layer = 3 icon = 'icons/effects/effects.dmi' icon_state = "cobweb2" @@ -94,7 +86,6 @@ desc = "Gosh, how unpleasant." gender = PLURAL density = 0 - anchored = 1 layer = 2 icon = 'icons/effects/blood.dmi' icon_state = "vomit_1" @@ -111,7 +102,6 @@ name = "tomato smudge" desc = "It's red." density = 0 - anchored = 1 layer = 2 icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3") @@ -120,7 +110,6 @@ name = "smashed egg" desc = "Seems like this one won't hatch." density = 0 - anchored = 1 layer = 2 icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_egg1", "smashed_egg2", "smashed_egg3") @@ -129,7 +118,6 @@ name = "smashed pie" desc = "It's pie cream from a cream pie." density = 0 - anchored = 1 layer = 2 icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_pie") @@ -140,7 +128,6 @@ gender = PLURAL icon = 'icons/obj/objects.dmi' icon_state = "ash" - anchored = 1 /obj/effect/decal/cleanable/shreds name = "shreds" @@ -149,7 +136,6 @@ icon_state = "shreds" gender = PLURAL density = 0 - anchored = 1 layer = 2 /obj/effect/decal/cleanable/shreds/New() diff --git a/code/game/objects/effects/decals/Cleanable/robots.dm b/code/game/objects/effects/decals/Cleanable/robots.dm index becacd4d2ea..af2ff562590 100644 --- a/code/game/objects/effects/decals/Cleanable/robots.dm +++ b/code/game/objects/effects/decals/Cleanable/robots.dm @@ -5,7 +5,6 @@ desc = "It's a useless heap of junk... or is it?" gender = PLURAL density = 0 - anchored = 1 layer = 2 icon = 'icons/mob/robots.dmi' icon_state = "gib1" @@ -14,19 +13,19 @@ bloodiness = MAX_SHOE_BLOODINESS /obj/effect/decal/cleanable/robot_debris/proc/streak(list/directions) - spawn (0) - var/direction = pick(directions) - for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++) - sleep(3) - if (i > 0) - if (prob(40)) - new /obj/effect/decal/cleanable/oil/streak(src.loc) - else if (prob(10)) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(3, 1, src) - s.start() - if (step_to(src, get_step(src, direction), 0)) - break + set waitfor = 0 + var/direction = pick(directions) + for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++) + sleep(3) + if (i > 0) + if (prob(40)) + new /obj/effect/decal/cleanable/oil/streak(src.loc) + else if (prob(10)) + var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread + s.set_up(3, 1, src) + s.start() + if (step_to(src, get_step(src, direction), 0)) + break /obj/effect/decal/cleanable/robot_debris/ex_act() return @@ -45,7 +44,6 @@ desc = "It's black and greasy. Looks like Beepsky made another mess." gender = PLURAL density = 0 - anchored = 1 layer = 2 icon = 'icons/mob/robots.dmi' icon_state = "floor1" diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index 488a41be821..bbe88b07c86 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -4,7 +4,6 @@ icon = 'icons/effects/crayondecal.dmi' icon_state = "rune1" layer = 2.1 - anchored = 1 var/do_icon_rotate = TRUE /obj/effect/decal/cleanable/crayon/examine() diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm index b9ffd568347..d9f8cde905d 100644 --- a/code/game/objects/effects/decals/decal.dm +++ b/code/game/objects/effects/decals/decal.dm @@ -1,6 +1,7 @@ /obj/effect/decal name = "decal" icon = 'icons/effects/effects.dmi' + anchored = 1 /obj/effect/decal/ex_act(severity, target) qdel(src) \ No newline at end of file diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm index c8cb4754943..c65f5f494a0 100644 --- a/code/game/objects/effects/decals/misc.dm +++ b/code/game/objects/effects/decals/misc.dm @@ -3,13 +3,11 @@ icon = 'icons/mob/screen_gen.dmi' icon_state = "arrow" layer = 16 - anchored = 1 mouse_opacity = 0 // Used for spray that you spray at walls, tables, hydrovats etc /obj/effect/decal/spraystill density = 0 - anchored = 1 layer = 50 //Used by spraybottles. diff --git a/code/game/objects/effects/decals/remains.dm b/code/game/objects/effects/decals/remains.dm index f98e5922f82..834c3b4c7dc 100644 --- a/code/game/objects/effects/decals/remains.dm +++ b/code/game/objects/effects/decals/remains.dm @@ -2,7 +2,6 @@ name = "remains" gender = PLURAL icon = 'icons/effects/blood.dmi' - anchored = 1 /obj/effect/decal/remains/human desc = "They look like human remains. They have a strange aura about them." diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 5b9f2917d15..b824f9b8722 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -50,7 +50,7 @@ /obj/effect/overlay/temp/cult/turf name = "unholy glow" icon_state = "wallglow" - layer = 2.01 + layer = TURF_LAYER + 0.07 /obj/effect/overlay/temp/cult/turf/floor icon_state = "floorglow" diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index 6efa75f3e21..e1a4efa2a72 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -14,9 +14,19 @@ /proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0 ,silent = 0) + set waitfor = 0 src = null //so we don't abort once src is deleted epicenter = get_turf(epicenter) + //DO NOT REMOVE THIS SLEEP, IT BREAKS THINGS + //not sleeping causes us to ex_act() the thing that triggered the explosion + //doing that might cause it to trigger another explosion + //this is bad + //I would make this not ex_act the thing that triggered the explosion, + //but everything that explodes gives us their loc or a get_turf() + //and somethings expect us to ex_act them so they can qdel() + sleep(1) //tldr, let the calling proc call qdel(src) before we explode + // Archive the uncapped explosion for the doppler array var/orig_dev_range = devastation_range var/orig_heavy_range = heavy_impact_range @@ -30,126 +40,125 @@ flash_range = min (MAX_EX_FLASH_RANGE, flash_range) flame_range = min (MAX_EX_FLAME_RANGE, flame_range) - spawn(0) - var/start = world.timeofday - if(!epicenter) return + var/start = world.timeofday + if(!epicenter) return - var/max_range = max(devastation_range, heavy_impact_range, light_impact_range, flame_range) - var/list/cached_exp_block = list() + var/max_range = max(devastation_range, heavy_impact_range, light_impact_range, flame_range) + var/list/cached_exp_block = list() - if(adminlog) - message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z])") - log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z])") + if(adminlog) + message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z])") + log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z])") - // Play sounds; we want sounds to be different depending on distance so we will manually do it ourselves. - // Stereo users will also hear the direction of the explosion! + // Play sounds; we want sounds to be different depending on distance so we will manually do it ourselves. + // Stereo users will also hear the direction of the explosion! - // Calculate far explosion sound range. Only allow the sound effect for heavy/devastating explosions. - // 3/7/14 will calculate to 80 + 35 + // Calculate far explosion sound range. Only allow the sound effect for heavy/devastating explosions. + // 3/7/14 will calculate to 80 + 35 - var/far_dist = 0 - far_dist += heavy_impact_range * 5 - far_dist += devastation_range * 20 + var/far_dist = 0 + far_dist += heavy_impact_range * 5 + far_dist += devastation_range * 20 - if(!silent) - var/frequency = get_rand_frequency() - for(var/mob/M in player_list) - // Double check for client - if(M && M.client) - var/turf/M_turf = get_turf(M) - if(M_turf && M_turf.z == epicenter.z) - var/dist = get_dist(M_turf, epicenter) - // If inside the blast radius + world.view - 2 - if(dist <= round(max_range + world.view - 2, 1)) - M.playsound_local(epicenter, get_sfx("explosion"), 100, 1, frequency, falloff = 5) // get_sfx() is so that everyone gets the same sound - // You hear a far explosion if you're outside the blast radius. Small bombs shouldn't be heard all over the station. - else if(dist <= far_dist) - var/far_volume = Clamp(far_dist, 30, 50) // Volume is based on explosion size and dist - far_volume += (dist <= far_dist * 0.5 ? 50 : 0) // add 50 volume if the mob is pretty close to the explosion - M.playsound_local(epicenter, 'sound/effects/explosionfar.ogg', far_volume, 1, frequency, falloff = 5) + if(!silent) + var/frequency = get_rand_frequency() + for(var/mob/M in player_list) + // Double check for client + if(M && M.client) + var/turf/M_turf = get_turf(M) + if(M_turf && M_turf.z == epicenter.z) + var/dist = get_dist(M_turf, epicenter) + // If inside the blast radius + world.view - 2 + if(dist <= round(max_range + world.view - 2, 1)) + M.playsound_local(epicenter, get_sfx("explosion"), 100, 1, frequency, falloff = 5) // get_sfx() is so that everyone gets the same sound + // You hear a far explosion if you're outside the blast radius. Small bombs shouldn't be heard all over the station. + else if(dist <= far_dist) + var/far_volume = Clamp(far_dist, 30, 50) // Volume is based on explosion size and dist + far_volume += (dist <= far_dist * 0.5 ? 50 : 0) // add 50 volume if the mob is pretty close to the explosion + M.playsound_local(epicenter, 'sound/effects/explosionfar.ogg', far_volume, 1, frequency, falloff = 5) - //postpone processing for a bit - var/postponeCycles = max(round(devastation_range/8),1) - SSlighting.postpone(postponeCycles) - SSmachine.postpone(postponeCycles) + //postpone processing for a bit + var/postponeCycles = max(round(devastation_range/8),1) + SSlighting.postpone(postponeCycles) + SSmachine.postpone(postponeCycles) - if(heavy_impact_range > 1) - var/datum/effect_system/explosion/E = new/datum/effect_system/explosion() - E.set_up(epicenter) - E.start() + if(heavy_impact_range > 1) + var/datum/effect_system/explosion/E = new/datum/effect_system/explosion() + E.set_up(epicenter) + E.start() - var/x0 = epicenter.x - var/y0 = epicenter.y - var/z0 = epicenter.z + var/x0 = epicenter.x + var/y0 = epicenter.y + var/z0 = epicenter.z - var/list/affected_turfs = trange(max_range, epicenter) + var/list/affected_turfs = trange(max_range, epicenter) + + if(config.reactionary_explosions) + for(var/turf/T in affected_turfs) // we cache the explosion block rating of every turf in the explosion area + cached_exp_block[T] = 0 + if(T.density && T.explosion_block) + cached_exp_block[T] += T.explosion_block + + for(var/obj/machinery/door/D in T) + if(D.density && D.explosion_block) + cached_exp_block[T] += D.explosion_block + + for(var/obj/structure/window/W in T) + if(W.reinf && W.fulltile) + cached_exp_block[T] += W.explosion_block + + for(var/obj/effect/blob/B in T) + cached_exp_block[T] += B.explosion_block + + for(var/turf/T in affected_turfs) + + var/dist = cheap_hypotenuse(T.x, T.y, x0, y0) if(config.reactionary_explosions) - for(var/turf/T in affected_turfs) // we cache the explosion block rating of every turf in the explosion area - cached_exp_block[T] = 0 - if(T.density && T.explosion_block) - cached_exp_block[T] += T.explosion_block + var/turf/Trajectory = T + while(Trajectory != epicenter) + Trajectory = get_step_towards(Trajectory, epicenter) + dist += cached_exp_block[Trajectory] - for(var/obj/machinery/door/D in T) - if(D.density && D.explosion_block) - cached_exp_block[T] += D.explosion_block + var/flame_dist = 0 + var/throw_dist = dist - for(var/obj/structure/window/W in T) - if(W.reinf && W.fulltile) - cached_exp_block[T] += W.explosion_block + if(dist < flame_range) + flame_dist = 1 - for(var/obj/effect/blob/B in T) - cached_exp_block[T] += B.explosion_block + if(dist < devastation_range) dist = 1 + else if(dist < heavy_impact_range) dist = 2 + else if(dist < light_impact_range) dist = 3 + else dist = 0 - for(var/turf/T in affected_turfs) + //------- TURF FIRES ------- - var/dist = cheap_hypotenuse(T.x, T.y, x0, y0) + if(T) + if(flame_dist && prob(40) && !istype(T, /turf/space) && !T.density) + PoolOrNew(/obj/effect/hotspot, T) //Mostly for ambience! + if(dist > 0) + T.ex_act(dist) - if(config.reactionary_explosions) - var/turf/Trajectory = T - while(Trajectory != epicenter) - Trajectory = get_step_towards(Trajectory, epicenter) - dist += cached_exp_block[Trajectory] + //--- THROW ITEMS AROUND --- - var/flame_dist = 0 - var/throw_dist = dist - - if(dist < flame_range) - flame_dist = 1 - - if(dist < devastation_range) dist = 1 - else if(dist < heavy_impact_range) dist = 2 - else if(dist < light_impact_range) dist = 3 - else dist = 0 - - //------- TURF FIRES ------- - - if(T) - if(flame_dist && prob(40) && !istype(T, /turf/space) && !T.density) - PoolOrNew(/obj/effect/hotspot, T) //Mostly for ambience! - if(dist > 0) - T.ex_act(dist) - - //--- THROW ITEMS AROUND --- - - var/throw_dir = get_dir(epicenter,T) - for(var/obj/item/I in T) - if(I && !I.anchored) - var/throw_range = rand(throw_dist, max_range) - var/turf/throw_at = get_ranged_target_turf(I, throw_dir, throw_range) - I.throw_speed = 4 //Temporarily change their throw_speed for embedding purposes (Reset when it finishes throwing, regardless of hitting anything) - I.throw_at_fast(throw_at, throw_range, 2)//Throw it at 2 speed, this is purely visual anyway. + var/throw_dir = get_dir(epicenter,T) + for(var/obj/item/I in T) + if(I && !I.anchored) + var/throw_range = rand(throw_dist, max_range) + var/turf/throw_at = get_ranged_target_turf(I, throw_dir, throw_range) + I.throw_speed = 4 //Temporarily change their throw_speed for embedding purposes (Reset when it finishes throwing, regardless of hitting anything) + I.throw_at_fast(throw_at, throw_range, 2)//Throw it at 2 speed, this is purely visual anyway. - var/took = (world.timeofday-start)/10 - //You need to press the DebugGame verb to see these now....they were getting annoying and we've collected a fair bit of data. Just -test- changes to explosion code using this please so we can compare - if(Debug2) world.log << "## DEBUG: Explosion([x0],[y0],[z0])(d[devastation_range],h[heavy_impact_range],l[light_impact_range]): Took [took] seconds." + var/took = (world.timeofday-start)/10 + //You need to press the DebugGame verb to see these now....they were getting annoying and we've collected a fair bit of data. Just -test- changes to explosion code using this please so we can compare + if(Debug2) world.log << "## DEBUG: Explosion([x0],[y0],[z0])(d[devastation_range],h[heavy_impact_range],l[light_impact_range]): Took [took] seconds." + + //Machines which report explosions. + for(var/array in doppler_arrays) + var/obj/machinery/doppler_array/A = array + A.sense_explosion(epicenter,devastation_range,heavy_impact_range,light_impact_range,took,orig_dev_range,orig_heavy_range,orig_light_range) - //Machines which report explosions. - for(var/array in doppler_arrays) - var/obj/machinery/doppler_array/A = array - A.sense_explosion(epicenter,devastation_range,heavy_impact_range,light_impact_range,took,orig_dev_range,orig_heavy_range,orig_light_range) - return 1 diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index 1171c646104..0d26ff0d940 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -59,8 +59,7 @@ if(!src.lit) src.lit = 1 //src.damtype = "fire" - for(var/mob/O in viewers(usr, null)) - O.show_message(flavor_text, 1) + usr.visible_message(flavor_text) SetLuminosity(CANDLE_LUMINOSITY) if(!infinite) SSobj.processing |= src diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index a1909450b94..34d8002ea9b 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -773,7 +773,7 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/proc/show_to_ghosts(mob/living/user, datum/data_pda_msg/msg,multiple = 0) for(var/mob/M in player_list) if(isobserver(M) && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTPDA)) - M.show_message("(F) [msg.sender] PDA Message --> [multiple ? "Everyone" : msg.recipient]: [msg.message][msg.get_photo_ref()]
") + M << "(F) [msg.sender] PDA Message --> [multiple ? "Everyone" : msg.recipient]: [msg.message][msg.get_photo_ref()]" /obj/item/device/pda/proc/can_send(obj/item/device/pda/P) if(!P || qdeleted(P) || P.toff) @@ -939,9 +939,9 @@ var/global/list/obj/item/device/pda/PDAs = list() switch(scanmode) if(1) - user.visible_message(text("[] has analyzed []'s vitals!", user, C)) + C.visible_message("[user] has analyzed [C]'s vitals!") healthscan(user, C, 1) - src.add_fingerprint(user) + add_fingerprint(user) if(2) // Unused diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index b6401056796..ff8428ffb48 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -241,11 +241,12 @@ /obj/item/weapon/cartridge/proc/print_to_host(text) if (!istype(loc, /obj/item/device/pda)) return - loc:cart = text + var/obj/item/device/pda/P = loc + P.cart = text for (var/mob/M in viewers(1, loc.loc)) if (M.client && M.machine == loc) - loc:attack_self(M) + P.attack_self(M) return @@ -273,6 +274,7 @@ /obj/item/weapon/cartridge/proc/generate_menu(mob/user) switch(mode) if(40) //signaller + var/obj/item/radio/integrated/signal/S = radio menu = "

Remote Signaling System

" menu += {" @@ -280,14 +282,14 @@ Frequency: - - -[format_frequency(radio:frequency)] +[format_frequency(S.frequency)] + +

Code: - - -[radio:code] +[S.code] + +
"} if (41) //crew manifest @@ -611,7 +613,7 @@ Code: active1 = find_record("id", href_list["target"], data_core.general) if(active1) active2 = find_record("id", href_list["target"], data_core.medical) - loc:mode = 441 + pda.mode = 441 mode = 441 if(!active2) active1 = null @@ -620,25 +622,28 @@ Code: active1 = find_record("id", href_list["target"], data_core.general) if(active1) active3 = find_record("id", href_list["target"], data_core.security) - loc:mode = 451 + pda.mode = 451 mode = 451 if(!active3) active1 = null if("Send Signal") spawn( 0 ) - radio:send_signal("ACTIVATE") + var/obj/item/radio/integrated/signal/S = radio + S.send_signal("ACTIVATE") return if("Signal Frequency") - var/new_frequency = sanitize_frequency(radio:frequency + text2num(href_list["sfreq"])) - radio:set_frequency(new_frequency) + var/obj/item/radio/integrated/signal/S = radio + var/new_frequency = sanitize_frequency(S.frequency + text2num(href_list["sfreq"])) + S.set_frequency(new_frequency) if("Signal Code") - radio:code += text2num(href_list["scode"]) - radio:code = round(radio:code) - radio:code = min(100, radio:code) - radio:code = max(1, radio:code) + var/obj/item/radio/integrated/signal/S = radio + S.code += text2num(href_list["scode"]) + S.code = round(S.code) + S.code = min(100, S.code) + S.code = max(1, S.code) if("Status") switch(href_list["statdisp"]) @@ -657,7 +662,7 @@ Code: if("Power Select") var/pnum = text2num(href_list["target"]) powmonitor = powermonitors[pnum] - loc:mode = 433 + pda.mode = 433 mode = 433 if("Supply Orders") @@ -762,4 +767,4 @@ Code: menu += "No bots found.
" return - return menu \ No newline at end of file + return menu diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index f0c0e0c01b4..a7b4d29e2e1 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -12,13 +12,11 @@ var/can_use = 1 var/obj/effect/dummy/chameleon/active_dummy = null var/saved_appearance = null - /* - var/saved_item = /obj/item/weapon/cigbutt - var/saved_icon = 'icons/obj/clothing/masks.dmi' - var/saved_icon_state = "cigbutt" - var/saved_overlays = null - var/saved_underlays = null - */ + +/obj/item/device/chameleon/New() + ..() + var/obj/item/weapon/cigbutt/butt = /obj/item/weapon/cigbutt + saved_appearance = initial(butt.appearance) /obj/item/device/chameleon/dropped() disrupt() diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 55c4ae39336..076c4385658 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -20,8 +20,7 @@ /obj/item/device/radio/intercom/attack_ai(mob/user) src.add_fingerprint(user) - spawn (0) - attack_self(user) + attack_self(user) /obj/item/device/radio/intercom/attack_paw(mob/user) return src.attack_hand(user) @@ -29,8 +28,7 @@ /obj/item/device/radio/intercom/attack_hand(mob/user) src.add_fingerprint(user) - spawn (0) - attack_self(user) + attack_self(user) /obj/item/device/radio/intercom/receive_range(freq, level) if (!on) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 954302bf055..639e59c9008 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -543,10 +543,10 @@ return b_stat = !( b_stat ) if(!istype(src, /obj/item/device/radio/beacon)) - if (b_stat) - user.show_message("The radio can now be attached and modified!") + if(b_stat) + user << "The radio can now be attached and modified!" else - user.show_message("The radio can no longer be modified or attached!") + user << "The radio can no longer be modified or attached!" updateDialog() //Foreach goto(83) add_fingerprint(user) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 32da5f42127..6a76998e260 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -114,7 +114,8 @@ MASS SPECTROMETER // Used by the PDA medical scanner too /proc/healthscan(mob/living/user, mob/living/M, mode = 1) - + if(user.stat || user.eye_blind) + return //Damage specifics var/oxy_loss = M.getOxyLoss() var/tox_loss = M.getToxLoss() @@ -199,8 +200,8 @@ MASS SPECTROMETER if(CI.status == ORGAN_ROBOTIC) implant_detect += "[H.name] is modified with a [CI.name].
" if(implant_detect) - user.show_message("Detected cybernetic modifications:") - user.show_message("[implant_detect]") + user << "Detected cybernetic modifications:" + user << "[implant_detect]" /proc/chemscan(mob/living/user, mob/living/M) if(ishuman(M)) @@ -250,11 +251,13 @@ MASS SPECTROMETER /obj/item/device/analyzer/attack_self(mob/user) - if (user.stat) + add_fingerprint(user) + + if (user.stat || user.eye_blind) return var/turf/location = user.loc - if (!( istype(location, /turf) )) + if(!istype(location)) return var/datum/gas_mixture/environment = location.return_air() @@ -262,11 +265,11 @@ MASS SPECTROMETER var/pressure = environment.return_pressure() var/total_moles = environment.total_moles() - user.show_message("Results:", 1) + user << "Results:" if(abs(pressure - ONE_ATMOSPHERE) < 10) - user.show_message("Pressure: [round(pressure,0.1)] kPa", 1) + user << "Pressure: [round(pressure,0.1)] kPa" else - user.show_message("Pressure: [round(pressure,0.1)] kPa", 1) + user << "Pressure: [round(pressure,0.1)] kPa" if(total_moles) var/list/env_gases = environment.gases @@ -278,33 +281,30 @@ MASS SPECTROMETER environment.garbage_collect() if(abs(n2_concentration - N2STANDARD) < 20) - user.show_message("Nitrogen: [round(n2_concentration*100)] %", 1) + user << "Nitrogen: [round(n2_concentration*100)] %" else - user.show_message("Nitrogen: [round(n2_concentration*100)] %", 1) + user << "Nitrogen: [round(n2_concentration*100)] %" if(abs(o2_concentration - O2STANDARD) < 2) - user.show_message("Oxygen: [round(o2_concentration*100)] %", 1) + user << "Oxygen: [round(o2_concentration*100)] %" else - user.show_message("Oxygen: [round(o2_concentration*100)] %", 1) + user << "Oxygen: [round(o2_concentration*100)] %" if(co2_concentration > 0.01) - user.show_message("CO2: [round(co2_concentration*100)] %", 1) + user << "CO2: [round(co2_concentration*100)] %" else - user.show_message("CO2: [round(co2_concentration*100)] %", 1) + user << "CO2: [round(co2_concentration*100)] %" if(plasma_concentration > 0.01) - user.show_message("Plasma: [round(plasma_concentration*100)] %", 1) + user << "Plasma: [round(plasma_concentration*100)] %" for(var/id in env_gases) if(id in hardcoded_gases) continue var/gas_concentration = env_gases[id][MOLES]/total_moles - user.show_message("[env_gases[id][GAS_NAME]]: [round(gas_concentration*100)] %", 1) + user << "[env_gases[id][GAS_NAME]]: [round(gas_concentration*100)] %" + user << "Temperature: [round(environment.temperature-T0C)] °C" - user.show_message("Temperature: [round(environment.temperature-T0C)] °C", 1) - - src.add_fingerprint(user) - return /obj/item/device/mass_spectrometer desc = "A hand-held mass spectrometer which identifies trace chemicals in a blood sample." @@ -333,7 +333,7 @@ MASS SPECTROMETER icon_state = initial(icon_state) /obj/item/device/mass_spectrometer/attack_self(mob/user) - if (user.stat) + if (user.stat || user.eye_blind) return if (crit_fail) user << "This device has critically failed and is no longer functional!" @@ -346,7 +346,7 @@ MASS SPECTROMETER for(var/datum/reagent/R in reagents.reagent_list) if(R.id != "blood") reagents.clear_reagents() - user.show_message("The sample was contaminated! Please insert another sample.", 1) + user << "The sample was contaminated! Please insert another sample." return else blood_traces = params2list(R.data["trace_chem"]) @@ -373,7 +373,7 @@ MASS SPECTROMETER dat += "" user << dat reagents.clear_reagents() - return + /obj/item/device/mass_spectrometer/adv name = "advanced mass-spectrometer" @@ -395,32 +395,34 @@ MASS SPECTROMETER materials = list(MAT_METAL=30, MAT_GLASS=20) /obj/item/device/slime_scanner/attack(mob/living/M, mob/living/user) + if(user.stat || user.eye_blind) + return if (!isslime(M)) - user.show_message("This device can only scan slimes!", 1) + user << "This device can only scan slimes!" return var/mob/living/simple_animal/slime/T = M - user.show_message("Slime scan results:", 1) - user.show_message(text("[T.colour] [] slime", T.is_adult ? "adult" : "baby"), 1) - user.show_message(text("Nutrition: [T.nutrition]/[]", T.get_max_nutrition()), 1) + user << "Slime scan results:" + user << "[T.colour] [T.is_adult ? "adult" : "baby"] slime" + user << "Nutrition: [T.nutrition]/[T.get_max_nutrition()]" if (T.nutrition < T.get_starve_nutrition()) - user.show_message("Warning: slime is starving!", 1) + user << "Warning: slime is starving!" else if (T.nutrition < T.get_hunger_nutrition()) - user.show_message("Warning: slime is hungry", 1) - user.show_message("Electric change strength: [T.powerlevel]", 1) - user.show_message("Health: [T.health]", 1) + user << "Warning: slime is hungry" + user << "Electric change strength: [T.powerlevel]" + user << "Health: [T.health]" if (T.slime_mutation[4] == T.colour) - user.show_message("This slime does not evolve any further.", 1) + user << "This slime does not evolve any further." else if (T.slime_mutation[3] == T.slime_mutation[4]) if (T.slime_mutation[2] == T.slime_mutation[1]) - user.show_message("Possible mutation: [T.slime_mutation[3]]", 1) - user.show_message("Genetic destability: [T.mutation_chance/2] % chance of mutation on splitting", 1) + user << "Possible mutation: [T.slime_mutation[3]]" + user << "Genetic destability: [T.mutation_chance/2] % chance of mutation on splitting" else - user.show_message("Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]] (x2)", 1) - user.show_message("Genetic destability: [T.mutation_chance] % chance of mutation on splitting", 1) + user << "Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]] (x2)" + user << "Genetic destability: [T.mutation_chance] % chance of mutation on splitting" else - user.show_message("Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]], [T.slime_mutation[4]]", 1) - user.show_message("Genetic destability: [T.mutation_chance] % chance of mutation on splitting", 1) + user << "Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]], [T.slime_mutation[4]]" + user << "Genetic destability: [T.mutation_chance] % chance of mutation on splitting" if (T.cores > 1) - user.show_message("Anomalious slime core amount detected", 1) - user.show_message("Growth progress: [T.amount_grown]/[SLIME_EVOLUTION_THRESHOLD]", 1) + user << "Anomalious slime core amount detected" + user << "Growth progress: [T.amount_grown]/[SLIME_EVOLUTION_THRESHOLD]" diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index f217989a655..af8237a5e70 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -40,16 +40,15 @@ effective or pretty fucking useless. add_logs(user, null, "knocked down people in the area", src) for(var/mob/living/carbon/human/M in ultra_range(10, user, 1)) - spawn() - if(prob(50)) + if(prob(50)) - M.Weaken(rand(10,20)) - if(prob(25)) - M.Stun(rand(5,10)) - M << "You feel a tremendous, paralyzing wave flood your mind." + M.Weaken(rand(10,20)) + if(prob(25)) + M.Stun(rand(5,10)) + M << "You feel a tremendous, paralyzing wave flood your mind." - else - M << "You feel a sudden, electric jolt travel through your head." + else + M << "You feel a sudden, electric jolt travel through your head." playsound(src.loc, 'sound/misc/interference.ogg', 50, 1) user << "You trigger [src]." diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm index 968ac08cf1d..218c7c72213 100644 --- a/code/game/objects/items/devices/uplinks.dm +++ b/code/game/objects/items/devices/uplinks.dm @@ -175,14 +175,15 @@ var/list/world_uplinks = list() return 0 //Refund proc for the borg teleporter (later I'll make a general refund proc if there is demand for it) /obj/item/device/radio/uplink/attackby(obj/item/weapon/W, mob/user, params) - if(istype(W, /obj/item/weapon/antag_spawner/nuke_ops)) - var/obj/item/weapon/antag_spawner/nuke_ops/S = W - if(!S.used) - hidden_uplink.uses += S.TC_cost - qdel(S) - user << "Teleporter refunded." - else - user << "This teleporter is already used!" + if(istype(W)) + for(var/path in subtypesof(/datum/uplink_item)) + var/datum/uplink_item/D = path + if(initial(D.item) == W.type && initial(D.refundable)) + hidden_uplink.uses += (D.cost) + hidden_uplink.used_TC -= initial(D.cost) + user << "[W] refunded." + qdel(W) + return // PRESET UPLINKS // A collection of preset uplinks. diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 46aebec6018..c1c8fef41a7 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -17,11 +17,14 @@ var/is_cyborg = 0 // It's 1 if module is used by a cyborg, and uses its storage var/datum/robot_energy_storage/source var/cost = 1 // How much energy from storage it costs + var/merge_type = null // This path and its children should merge with this stack, defaults to src.type /obj/item/stack/New(var/loc, var/amount=null) ..() if (amount) src.amount = amount + if(!merge_type) + merge_type = src.type return /obj/item/stack/Destroy() @@ -208,19 +211,19 @@ S.add(transfer) /obj/item/stack/Crossed(obj/o) - if(istype(o, src.type) && !o.throwing) + if(istype(o, merge_type) && !o.throwing) merge(o) return ..() /obj/item/stack/hitby(atom/movable/AM, skip, hitpush) - if(istype(AM, src.type)) + if(istype(AM, merge_type)) merge(AM) return ..() /obj/item/stack/attack_hand(mob/user) if (user.get_inactive_hand() == src) if(zero_amount()) return - var/obj/item/stack/F = new src.type( user, 1) + var/obj/item/stack/F = new src.type(user, 1) . = F F.copy_evidences(src) user.put_in_hands(F) @@ -234,7 +237,7 @@ return /obj/item/stack/attackby(obj/item/W, mob/user, params) - if(istype(W, src.type)) + if(istype(W, merge_type)) var/obj/item/stack/S = W merge(S) user << "Your [S.name] stack now contains [S.get_amount()] [S.singular_name]\s." @@ -268,4 +271,4 @@ src.max_res_amount = max_res_amount src.time = time src.one_per_turf = one_per_turf - src.on_floor = on_floor \ No newline at end of file + src.on_floor = on_floor diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 309bea1a0de..7fce1577be4 100755 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -422,7 +422,7 @@ if(istype(target, /obj/effect/decal/cleanable)) target = target.loc if(is_type_in_list(target,validSurfaces)) - + var/temp = "rune" if(letters.Find(drawtype)) temp = "letter" @@ -1106,13 +1106,13 @@ if (cooldown < world.time) cooldown = world.time + 1800 //3 minutes user.visible_message("[user] presses a button on [src].", "You activate [src], it plays a loud noise!", "You hear the click of a button.") - spawn(5) //gia said so - icon_state = "nuketoy" - playsound(src, 'sound/machines/Alarm.ogg', 100, 0, surround = 0) - sleep(135) - icon_state = "nuketoycool" - sleep(cooldown - world.time) - icon_state = "nuketoyidle" + sleep(5) + icon_state = "nuketoy" + playsound(src, 'sound/machines/Alarm.ogg', 100, 0, surround = 0) + sleep(135) + icon_state = "nuketoycool" + sleep(cooldown - world.time) + icon_state = "nuketoyidle" else var/timeleft = (cooldown - world.time) user << "Nothing happens, and '[round(timeleft/10)]' appears on a small display." diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index 125ba5e8d48..3eb2d6aa3b7 100644 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -60,13 +60,6 @@ AI MODULES user << "Upload complete. [reciever]'s laws have been modified." reciever.show_laws() reciever.law_change_counter++ - if(isAI(reciever)) - var/mob/living/silicon/ai/A = reciever - for(var/mob/living/silicon/robot/R in A.connected_robots) - if(R.lawupdate) - R << "From now on, these are your laws:" - R.show_laws() - R.law_change_counter++ var/time = time2text(world.realtime,"hh:mm:ss") lawchanges.Add("[time] : [user.name]([user.key]) used [src.name] on [reciever.name]([reciever.key]).[law2log ? " The law specified [law2log]" : ""]") diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index f81fc5dd559..40f851772f4 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -450,7 +450,8 @@ busy = 0 update_icon() return - H.notify_ghost_cloning("Your heart is being defibrillated. Re-enter your corpse if you want to be revived!", source = src) + if(!H.suiciding && !(H.disabilities & NOCLONE)) + H.notify_ghost_cloning("Your heart is being defibrillated. Re-enter your corpse if you want to be revived!", source = src) user.visible_message("[user] begins to place [src] on [M.name]'s chest.", "You begin to place [src] on [M.name]'s chest...") busy = 1 diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 636145d7452..047aa449f2c 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -12,13 +12,24 @@ var/list/fields var/list/add_mutations = list() var/list/remove_mutations = list() + + var/list/add_mutations_static = list() + var/list/remove_mutations_static = list() + var/used = 0 /obj/item/weapon/dnainjector/attack_paw(mob/user) return attack_hand(user) +/obj/item/weapon/dnainjector/proc/prepare() + for(var/mut_key in add_mutations_static) + add_mutations.Add(mutations_list[mut_key]) + for(var/mut_key in remove_mutations_static) + remove_mutations.Add(mutations_list[mut_key]) /obj/item/weapon/dnainjector/proc/inject(mob/living/carbon/M, mob/user) + prepare() + if(M.has_dna() && !(M.disabilities & NOCLONE)) M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2)) var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]" @@ -76,170 +87,123 @@ /obj/item/weapon/dnainjector/antihulk name = "\improper DNA injector (Anti-Hulk)" desc = "Cures green skin." - New() - ..() - remove_mutations.Add(mutations_list[HULK]) + remove_mutations_static = list(HULK) /obj/item/weapon/dnainjector/hulkmut name = "\improper DNA injector (Hulk)" desc = "This will make you big and strong, but give you a bad skin condition." - New() - ..() - add_mutations.Add(mutations_list[HULK]) + add_mutations_static = list(HULK) + /obj/item/weapon/dnainjector/xraymut name = "\improper DNA injector (Xray)" desc = "Finally you can see what the Captain does." - New() - ..() - add_mutations.Add(mutations_list[XRAY]) + add_mutations_static = list(XRAY) /obj/item/weapon/dnainjector/antixray name = "\improper DNA injector (Anti-Xray)" desc = "It will make you see harder." - New() - ..() - remove_mutations.Add(mutations_list[XRAY]) + remove_mutations_static = list(XRAY) ///////////////////////////////////// /obj/item/weapon/dnainjector/antiglasses name = "\improper DNA injector (Anti-Glasses)" desc = "Toss away those glasses!" - New() - ..() - remove_mutations.Add(mutations_list[BADSIGHT]) + remove_mutations_static = list(BADSIGHT) /obj/item/weapon/dnainjector/glassesmut name = "\improper DNA injector (Glasses)" desc = "Will make you need dorkish glasses." - New() - ..() - add_mutations.Add(mutations_list[BADSIGHT]) + add_mutations_static = list(BADSIGHT) /obj/item/weapon/dnainjector/epimut name = "\improper DNA injector (Epi.)" desc = "Shake shake shake the room!" - New() - ..() - add_mutations.Add(mutations_list[EPILEPSY]) + add_mutations_static = list(EPILEPSY) /obj/item/weapon/dnainjector/antiepi name = "\improper DNA injector (Anti-Epi.)" desc = "Will fix you up from shaking the room." - New() - ..() - remove_mutations.Add(mutations_list[EPILEPSY]) + remove_mutations_static = list(EPILEPSY) //////////////////////////////////// /obj/item/weapon/dnainjector/anticough name = "\improper DNA injector (Anti-Cough)" desc = "Will stop that aweful noise." - New() - ..() - remove_mutations.Add(mutations_list[COUGH]) + remove_mutations_static = list(COUGH) /obj/item/weapon/dnainjector/coughmut name = "\improper DNA injector (Cough)" desc = "Will bring forth a sound of horror from your throat." - New() - ..() - add_mutations.Add(mutations_list[COUGH]) + add_mutations_static = list(COUGH) /obj/item/weapon/dnainjector/antidwarf name = "\improper DNA injector (Anti-Dwarfism)" desc = "Helps you grow big and strong." - New() - ..() - remove_mutations.Add(mutations_list[DWARFISM]) + remove_mutations_static = list(DWARFISM) /obj/item/weapon/dnainjector/dwarf name = "\improper DNA injector (Dwarfism)" desc = "Its a small world after all." - New() - ..() - add_mutations.Add(mutations_list[DWARFISM]) + add_mutations_static = list(DWARFISM) /obj/item/weapon/dnainjector/clumsymut name = "\improper DNA injector (Clumsy)" desc = "Makes clown minions." - New() - ..() - add_mutations.Add(mutations_list[CLOWNMUT]) + add_mutations_static = list(CLOWNMUT) /obj/item/weapon/dnainjector/anticlumsy name = "\improper DNA injector (Anti-Clumy)" desc = "Apply this for Security Clown." - New() - ..() - remove_mutations.Add(mutations_list[CLOWNMUT]) + remove_mutations_static = list(CLOWNMUT) /obj/item/weapon/dnainjector/antitour name = "\improper DNA injector (Anti-Tour.)" desc = "Will cure tourrets." - New() - ..() - remove_mutations.Add(mutations_list[TOURETTES]) + remove_mutations_static = list(TOURETTES) /obj/item/weapon/dnainjector/tourmut name = "\improper DNA injector (Tour.)" desc = "Gives you a nasty case off tourrets." - New() - ..() - add_mutations.Add(mutations_list[TOURETTES]) + add_mutations_static = list(TOURETTES) /obj/item/weapon/dnainjector/stuttmut name = "\improper DNA injector (Stutt.)" desc = "Makes you s-s-stuttterrr" - New() - ..() - add_mutations.Add(mutations_list[NERVOUS]) + add_mutations_static = list(NERVOUS) /obj/item/weapon/dnainjector/antistutt name = "\improper DNA injector (Anti-Stutt.)" desc = "Fixes that speaking impairment." - New() - ..() - remove_mutations.Add(mutations_list[NERVOUS]) + remove_mutations_static = list(NERVOUS) /obj/item/weapon/dnainjector/antifire name = "\improper DNA injector (Anti-Fire)" desc = "Cures fire." - New() - ..() - remove_mutations.Add(mutations_list[COLDRES]) + remove_mutations_static = list(COLDRES) /obj/item/weapon/dnainjector/firemut name = "\improper DNA injector (Fire)" desc = "Gives you fire." - New() - ..() - add_mutations.Add(mutations_list[COLDRES]) + add_mutations_static = list(COLDRES) /obj/item/weapon/dnainjector/blindmut name = "\improper DNA injector (Blind)" desc = "Makes you not see anything." - New() - ..() - add_mutations.Add(mutations_list[BLINDMUT]) + add_mutations_static = list(BLINDMUT) /obj/item/weapon/dnainjector/antiblind name = "\improper DNA injector (Anti-Blind)" desc = "ITS A MIRACLE!!!" - New() - ..() - remove_mutations.Add(mutations_list[BLINDMUT]) + remove_mutations_static = list(BLINDMUT) /obj/item/weapon/dnainjector/antitele name = "\improper DNA injector (Anti-Tele.)" desc = "Will make you not able to control your mind." - New() - ..() - remove_mutations.Add(mutations_list[TK]) + remove_mutations_static = list(TK) /obj/item/weapon/dnainjector/telemut name = "\improper DNA injector (Tele.)" desc = "Super brain man!" - New() - ..() - add_mutations.Add(mutations_list[TK]) + add_mutations_static = list(TK) /obj/item/weapon/dnainjector/telemut/darkbundle name = "\improper DNA injector" @@ -248,143 +212,101 @@ /obj/item/weapon/dnainjector/deafmut name = "\improper DNA injector (Deaf)" desc = "Sorry, what did you say?" - New() - ..() - add_mutations.Add(mutations_list[DEAFMUT]) + add_mutations_static = list(DEAFMUT) /obj/item/weapon/dnainjector/antideaf name = "\improper DNA injector (Anti-Deaf)" desc = "Will make you hear once more." - New() - ..() - remove_mutations.Add(mutations_list[DEAFMUT]) + remove_mutations_static = list(DEAFMUT) /obj/item/weapon/dnainjector/h2m name = "\improper DNA injector (Human > Monkey)" desc = "Will make you a flea bag." - New() - ..() - add_mutations.Add(mutations_list[RACEMUT]) + add_mutations_static = list(RACEMUT) /obj/item/weapon/dnainjector/m2h name = "\improper DNA injector (Monkey > Human)" desc = "Will make you...less hairy." - New() - ..() - remove_mutations.Add(mutations_list[RACEMUT]) + remove_mutations_static = list(RACEMUT) /obj/item/weapon/dnainjector/antichameleon name = "\improper DNA injector (Anti-Chameleon)" - New() - ..() - remove_mutations.Add(mutations_list[CHAMELEON]) + remove_mutations_static = list(CHAMELEON) /obj/item/weapon/dnainjector/chameleonmut name = "\improper DNA injector (Chameleon)" - New() - ..() - add_mutations.Add(mutations_list[CHAMELEON]) + add_mutations_static = list(CHAMELEON) /obj/item/weapon/dnainjector/antiwacky name = "\improper DNA injector (Anti-Wacky)" - New() - ..() - remove_mutations.Add(mutations_list[WACKY]) + remove_mutations_static = list(WACKY) /obj/item/weapon/dnainjector/wackymut name = "\improper DNA injector (Wacky)" - New() - ..() - add_mutations.Add(mutations_list[WACKY]) + add_mutations_static = list(WACKY) /obj/item/weapon/dnainjector/antimute name = "\improper DNA injector (Anti-Mute)" - New() - ..() - remove_mutations.Add(mutations_list[MUT_MUTE]) + remove_mutations_static = list(MUT_MUTE) /obj/item/weapon/dnainjector/mutemut name = "\improper DNA injector (Mute)" - New() - ..() - add_mutations.Add(mutations_list[MUT_MUTE]) + add_mutations_static = list(MUT_MUTE) /obj/item/weapon/dnainjector/antismile name = "\improper DNA injector (Anti-Smile)" - New() - ..() - remove_mutations.Add(mutations_list[SMILE]) + remove_mutations_static = list(SMILE) /obj/item/weapon/dnainjector/smilemut name = "\improper DNA injector (Smile)" - New() - ..() - add_mutations.Add(mutations_list[SMILE]) + add_mutations_static = list(SMILE) /obj/item/weapon/dnainjector/unintelligablemut name = "\improper DNA injector (Unintelligable)" - New() - ..() - add_mutations.Add(mutations_list[UNINTELLIGABLE]) + add_mutations_static = list(UNINTELLIGABLE) /obj/item/weapon/dnainjector/antiunintelligable name = "\improper DNA injector (Anti-Unintelligable)" - New() - ..() - remove_mutations.Add(mutations_list[UNINTELLIGABLE]) + remove_mutations_static = list(UNINTELLIGABLE) /obj/item/weapon/dnainjector/swedishmut name = "\improper DNA injector (Swedish)" - New() - ..() - add_mutations.Add(mutations_list[SWEDISH]) + add_mutations_static = list(SWEDISH) /obj/item/weapon/dnainjector/antiswedish name = "\improper DNA injector (Anti-Swedish)" - New() - ..() - remove_mutations.Add(mutations_list[SWEDISH]) + remove_mutations_static = list(SWEDISH) /obj/item/weapon/dnainjector/chavmut name = "\improper DNA injector (Chav)" - New() - ..() - add_mutations.Add(mutations_list[CHAV]) + add_mutations_static = list(CHAV) /obj/item/weapon/dnainjector/antichav name = "\improper DNA injector (Anti-Chav)" - New() - ..() - remove_mutations.Add(mutations_list[CHAV]) + remove_mutations_static = list(CHAV) /obj/item/weapon/dnainjector/elvismut name = "\improper DNA injector (Elvis)" - New() - ..() - add_mutations.Add(mutations_list[ELVIS]) + add_mutations_static = list(ELVIS) /obj/item/weapon/dnainjector/antielvis name = "\improper DNA injector (Anti-Elvis)" - New() - ..() - remove_mutations.Add(mutations_list[ELVIS]) + remove_mutations_static = list(ELVIS) /obj/item/weapon/dnainjector/lasereyesmut name = "\improper DNA injector (Laser Eyes)" - New() - ..() - add_mutations.Add(mutations_list[LASEREYES]) + add_mutations_static = list(LASEREYES) /obj/item/weapon/dnainjector/antilasereyes name = "\improper DNA injector (Anti-Laser Eyes)" - New() - ..() - remove_mutations.Add(mutations_list[LASEREYES]) + remove_mutations_static = list(LASEREYES) /obj/item/weapon/dnainjector/timed var/duration = 600 /obj/item/weapon/dnainjector/timed/inject(mob/living/carbon/M, mob/user) + prepare() + if(M.has_dna() && !(M.disabilities & NOCLONE)) if(M.stat == DEAD) //prevents dead people from having their DNA changed user << "You can't modify [M]'s DNA while \he's dead." @@ -436,13 +358,9 @@ /obj/item/weapon/dnainjector/timed/hulk name = "\improper DNA injector (Hulk)" desc = "This will make you big and strong, but give you a bad skin condition." - New() - ..() - add_mutations.Add(mutations_list[HULK]) + add_mutations_static = list(HULK) /obj/item/weapon/dnainjector/timed/h2m name = "\improper DNA injector (Human > Monkey)" desc = "Will make you a flea bag." - New() - ..() - add_mutations.Add(mutations_list[RACEMUT]) + add_mutations_static = list(RACEMUT) diff --git a/code/game/objects/items/weapons/grenades/ghettobomb.dm b/code/game/objects/items/weapons/grenades/ghettobomb.dm index 0d1c1723f68..8339ed98c7c 100644 --- a/code/game/objects/items/weapons/grenades/ghettobomb.dm +++ b/code/game/objects/items/weapons/grenades/ghettobomb.dm @@ -59,7 +59,7 @@ /obj/item/weapon/grenade/iedcasing/prime() //Blowing that can up update_mob() - explosion(src.loc,-1,-1,-1, flame_range = range) // no explosive damage, only a large fireball. + explosion(src.loc,-1,-1,2, flame_range = 4) // small explosion, plus a very large fireball. qdel(src) /obj/item/weapon/grenade/iedcasing/examine(mob/user) diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm index 5d73339b164..7c4e0dcce55 100644 --- a/code/game/objects/items/weapons/pneumaticCannon.dm +++ b/code/game/objects/items/weapons/pneumaticCannon.dm @@ -23,8 +23,7 @@ user << "You'll need to get closer to see any more." return for(var/obj/item/I in loadedItems) - spawn(0) - user << "\icon [I] It has \the [I] loaded." + user << "\icon [I] It has \the [I] loaded." if(tank) user << "\icon [tank] It has \the [tank] mounted onto it." diff --git a/code/game/objects/items/weapons/singularityhammer.dm b/code/game/objects/items/weapons/singularityhammer.dm index e8a99f1a441..e4781e32d2b 100644 --- a/code/game/objects/items/weapons/singularityhammer.dm +++ b/code/game/objects/items/weapons/singularityhammer.dm @@ -93,13 +93,12 @@ "You feel a powerful shock course through your body sending you flying!", \ "You hear a heavy electrical crack!") var/atom/throw_target = get_edge_target_turf(target, get_dir(src, get_step_away(target, src))) - target.throw_at(throw_target, 200, 4) + target.throw_at_fast(throw_target, 200, 4) return /obj/item/weapon/twohanded/mjollnir/attack(mob/M, mob/user) ..() - spawn(0) if(wielded) //if(charged == 5) //charged = 0 diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index e36882889e3..dacc3514ec2 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -328,12 +328,8 @@ /obj/item/weapon/storage/backpack/dufflebag/syndie/ammo/loaded/New() ..() contents = list() - new /obj/item/ammo_box/magazine/m12g(src) - new /obj/item/ammo_box/magazine/m12g(src) - new /obj/item/ammo_box/magazine/m12g(src) - new /obj/item/ammo_box/magazine/m12g(src) - new /obj/item/ammo_box/magazine/m12g(src) - new /obj/item/ammo_box/magazine/m12g(src) + for(var/i in 1 to 6) + new /obj/item/ammo_box/magazine/m12g(src) new /obj/item/ammo_box/magazine/m12g/buckshot(src) new /obj/item/ammo_box/magazine/m12g/stun(src) new /obj/item/ammo_box/magazine/m12g/dragon(src) @@ -398,15 +394,8 @@ /obj/item/weapon/storage/backpack/dufflebag/syndie/ammo/smg/New() ..() contents = list() - new /obj/item/ammo_box/magazine/smgm45(src) - new /obj/item/ammo_box/magazine/smgm45(src) - new /obj/item/ammo_box/magazine/smgm45(src) - new /obj/item/ammo_box/magazine/smgm45(src) - new /obj/item/ammo_box/magazine/smgm45(src) - new /obj/item/ammo_box/magazine/smgm45(src) - new /obj/item/ammo_box/magazine/smgm45(src) - new /obj/item/ammo_box/magazine/smgm45(src) - new /obj/item/ammo_box/magazine/smgm45(src) + for(var/i in 1 to 9) + new /obj/item/ammo_box/magazine/smgm45(src) return @@ -416,10 +405,8 @@ /obj/item/weapon/storage/backpack/dufflebag/syndie/ammo/fireteam/New() ..() contents = list() - new /obj/item/ammo_box/magazine/smgm45(src) - new /obj/item/ammo_box/magazine/smgm45(src) - new /obj/item/ammo_box/magazine/smgm45(src) - new /obj/item/ammo_box/magazine/smgm45(src) + for(var/i in 1 to 4) + new /obj/item/ammo_box/magazine/smgm45(src) new /obj/item/ammo_box/magazine/m556(src) new /obj/item/ammo_box/magazine/m556(src) new /obj/item/ammo_box/a40mm(src) diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 7e53d4a443d..db6b4701830 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -121,13 +121,8 @@ /obj/item/weapon/storage/belt/soulstone/full/New() ..() - new /obj/item/device/soulstone(src) - new /obj/item/device/soulstone(src) - new /obj/item/device/soulstone(src) - new /obj/item/device/soulstone(src) - new /obj/item/device/soulstone(src) - new /obj/item/device/soulstone(src) - + for(var/i in 1 to 6) + new /obj/item/device/soulstone(src) /obj/item/weapon/storage/belt/champion name = "championship belt" diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index c08715a561e..aa0679e89b1 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -93,14 +93,9 @@ /obj/item/weapon/storage/box/gloves/New() ..() - new /obj/item/clothing/gloves/color/latex(src) - new /obj/item/clothing/gloves/color/latex(src) - new /obj/item/clothing/gloves/color/latex(src) - new /obj/item/clothing/gloves/color/latex(src) - new /obj/item/clothing/gloves/color/latex(src) - new /obj/item/clothing/gloves/color/latex(src) - new /obj/item/clothing/gloves/color/latex(src) - + for(var/i in 1 to 7) + new /obj/item/clothing/gloves/color/latex(src) + /obj/item/weapon/storage/box/masks name = "box of sterile masks" desc = "This box contains sterile medical masks." @@ -108,14 +103,9 @@ /obj/item/weapon/storage/box/masks/New() ..() - new /obj/item/clothing/mask/surgical(src) - new /obj/item/clothing/mask/surgical(src) - new /obj/item/clothing/mask/surgical(src) - new /obj/item/clothing/mask/surgical(src) - new /obj/item/clothing/mask/surgical(src) - new /obj/item/clothing/mask/surgical(src) - new /obj/item/clothing/mask/surgical(src) - + for(var/i in 1 to 7) + new /obj/item/clothing/mask/surgical(src) + /obj/item/weapon/storage/box/syringes name = "box of syringes" desc = "A box full of syringes." @@ -124,14 +114,9 @@ /obj/item/weapon/storage/box/syringes/New() ..() - new /obj/item/weapon/reagent_containers/syringe( src ) - new /obj/item/weapon/reagent_containers/syringe( src ) - new /obj/item/weapon/reagent_containers/syringe( src ) - new /obj/item/weapon/reagent_containers/syringe( src ) - new /obj/item/weapon/reagent_containers/syringe( src ) - new /obj/item/weapon/reagent_containers/syringe( src ) - new /obj/item/weapon/reagent_containers/syringe( src ) - + for(var/i in 1 to 7) + new /obj/item/weapon/reagent_containers/syringe( src ) + /obj/item/weapon/storage/box/medipens name = "box of medipens" desc = "A box full of epinephrine MediPens." @@ -139,14 +124,9 @@ /obj/item/weapon/storage/box/medipens/New() ..() - new /obj/item/weapon/reagent_containers/hypospray/medipen( src ) - new /obj/item/weapon/reagent_containers/hypospray/medipen( src ) - new /obj/item/weapon/reagent_containers/hypospray/medipen( src ) - new /obj/item/weapon/reagent_containers/hypospray/medipen( src ) - new /obj/item/weapon/reagent_containers/hypospray/medipen( src ) - new /obj/item/weapon/reagent_containers/hypospray/medipen( src ) - new /obj/item/weapon/reagent_containers/hypospray/medipen( src ) - + for(var/i in 1 to 7) + new /obj/item/weapon/reagent_containers/hypospray/medipen( src ) + /obj/item/weapon/storage/box/medipens/utility name = "stimpack value kit" desc = "A box with several stimpack medipens for the economical miner." @@ -154,39 +134,29 @@ /obj/item/weapon/storage/box/medipens/utility/New() ..() - new /obj/item/weapon/reagent_containers/hypospray/medipen/stimpack(src) - new /obj/item/weapon/reagent_containers/hypospray/medipen/stimpack(src) - new /obj/item/weapon/reagent_containers/hypospray/medipen/stimpack(src) - new /obj/item/weapon/reagent_containers/hypospray/medipen/stimpack(src) - new /obj/item/weapon/reagent_containers/hypospray/medipen/stimpack(src) - + for(var/i in 1 to 5) + new /obj/item/weapon/reagent_containers/hypospray/medipen/stimpack(src) + /obj/item/weapon/storage/box/beakers name = "box of beakers" icon_state = "beaker" /obj/item/weapon/storage/box/beakers/New() ..() - new /obj/item/weapon/reagent_containers/glass/beaker( src ) - new /obj/item/weapon/reagent_containers/glass/beaker( src ) - new /obj/item/weapon/reagent_containers/glass/beaker( src ) - new /obj/item/weapon/reagent_containers/glass/beaker( src ) - new /obj/item/weapon/reagent_containers/glass/beaker( src ) - new /obj/item/weapon/reagent_containers/glass/beaker( src ) - new /obj/item/weapon/reagent_containers/glass/beaker( src ) - + for(var/i in 1 to 7) + new /obj/item/weapon/reagent_containers/glass/beaker( src ) + /obj/item/weapon/storage/box/injectors name = "box of DNA injectors" desc = "This box contains injectors it seems." /obj/item/weapon/storage/box/injectors/New() ..() - new /obj/item/weapon/dnainjector/h2m(src) - new /obj/item/weapon/dnainjector/h2m(src) - new /obj/item/weapon/dnainjector/h2m(src) - new /obj/item/weapon/dnainjector/m2h(src) - new /obj/item/weapon/dnainjector/m2h(src) - new /obj/item/weapon/dnainjector/m2h(src) - + for(var/i in 1 to 3) + new /obj/item/weapon/dnainjector/h2m(src) + for(var/i in 1 to 3) + new /obj/item/weapon/dnainjector/m2h(src) + /obj/item/weapon/storage/box/flashbangs name = "box of flashbangs (WARNING)" desc = "WARNING: These devices are extremely dangerous and can cause blindness or deafness in repeated use." @@ -194,14 +164,9 @@ /obj/item/weapon/storage/box/flashbangs/New() ..() - new /obj/item/weapon/grenade/flashbang(src) - new /obj/item/weapon/grenade/flashbang(src) - new /obj/item/weapon/grenade/flashbang(src) - new /obj/item/weapon/grenade/flashbang(src) - new /obj/item/weapon/grenade/flashbang(src) - new /obj/item/weapon/grenade/flashbang(src) - new /obj/item/weapon/grenade/flashbang(src) - + for(var/i in 1 to 7) + new /obj/item/weapon/grenade/flashbang(src) + /obj/item/weapon/storage/box/flashes name = "box of flashbulbs" desc = "WARNING: Flashes can cause serious eye damage, protective eyewear is required." @@ -209,13 +174,9 @@ /obj/item/weapon/storage/box/flashes/New() ..() - new /obj/item/device/assembly/flash/handheld(src) - new /obj/item/device/assembly/flash/handheld(src) - new /obj/item/device/assembly/flash/handheld(src) - new /obj/item/device/assembly/flash/handheld(src) - new /obj/item/device/assembly/flash/handheld(src) - new /obj/item/device/assembly/flash/handheld(src) - + for(var/i in 1 to 6) + new /obj/item/device/assembly/flash/handheld(src) + /obj/item/weapon/storage/box/teargas name = "box of tear gas grenades (WARNING)" desc = "WARNING: These devices are extremely dangerous and can cause blindness and skin irritation." @@ -223,14 +184,9 @@ /obj/item/weapon/storage/box/teargas/New() ..() - new /obj/item/weapon/grenade/chem_grenade/teargas(src) - new /obj/item/weapon/grenade/chem_grenade/teargas(src) - new /obj/item/weapon/grenade/chem_grenade/teargas(src) - new /obj/item/weapon/grenade/chem_grenade/teargas(src) - new /obj/item/weapon/grenade/chem_grenade/teargas(src) - new /obj/item/weapon/grenade/chem_grenade/teargas(src) - new /obj/item/weapon/grenade/chem_grenade/teargas(src) - + for(var/i in 1 to 7) + new /obj/item/weapon/grenade/chem_grenade/teargas(src) + /obj/item/weapon/storage/box/emps name = "box of emp grenades" desc = "A box with 5 emp grenades." @@ -238,12 +194,9 @@ /obj/item/weapon/storage/box/emps/New() ..() - new /obj/item/weapon/grenade/empgrenade(src) - new /obj/item/weapon/grenade/empgrenade(src) - new /obj/item/weapon/grenade/empgrenade(src) - new /obj/item/weapon/grenade/empgrenade(src) - new /obj/item/weapon/grenade/empgrenade(src) - + for(var/i in 1 to 5) + new /obj/item/weapon/grenade/empgrenade(src) + /obj/item/weapon/storage/box/trackimp name = "boxed tracking implant kit" desc = "Box full of scum-bag tracking utensils." @@ -251,10 +204,8 @@ /obj/item/weapon/storage/box/trackimp/New() ..() - new /obj/item/weapon/implantcase/tracking(src) - new /obj/item/weapon/implantcase/tracking(src) - new /obj/item/weapon/implantcase/tracking(src) - new /obj/item/weapon/implantcase/tracking(src) + for(var/i in 1 to 4) + new /obj/item/weapon/implantcase/tracking(src) new /obj/item/weapon/implanter(src) new /obj/item/weapon/implantpad(src) new /obj/item/weapon/locator(src) @@ -266,11 +217,8 @@ /obj/item/weapon/storage/box/chemimp/New() ..() - new /obj/item/weapon/implantcase/chem(src) - new /obj/item/weapon/implantcase/chem(src) - new /obj/item/weapon/implantcase/chem(src) - new /obj/item/weapon/implantcase/chem(src) - new /obj/item/weapon/implantcase/chem(src) + for(var/i in 1 to 5) + new /obj/item/weapon/implantcase/chem(src) new /obj/item/weapon/implanter(src) new /obj/item/weapon/implantpad(src) @@ -281,11 +229,8 @@ /obj/item/weapon/storage/box/exileimp/New() ..() - new /obj/item/weapon/implantcase/exile(src) - new /obj/item/weapon/implantcase/exile(src) - new /obj/item/weapon/implantcase/exile(src) - new /obj/item/weapon/implantcase/exile(src) - new /obj/item/weapon/implantcase/exile(src) + for(var/i in 1 to 5) + new /obj/item/weapon/implantcase/exile(src) new /obj/item/weapon/implanter(src) /obj/item/weapon/storage/box/rxglasses @@ -295,39 +240,26 @@ /obj/item/weapon/storage/box/rxglasses/New() ..() - new /obj/item/clothing/glasses/regular(src) - new /obj/item/clothing/glasses/regular(src) - new /obj/item/clothing/glasses/regular(src) - new /obj/item/clothing/glasses/regular(src) - new /obj/item/clothing/glasses/regular(src) - new /obj/item/clothing/glasses/regular(src) - new /obj/item/clothing/glasses/regular(src) - + for(var/i in 1 to 7) + new /obj/item/clothing/glasses/regular(src) + /obj/item/weapon/storage/box/drinkingglasses name = "box of drinking glasses" desc = "It has a picture of drinking glasses on it." /obj/item/weapon/storage/box/drinkingglasses/New() ..() - new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src) - new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src) - new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src) - new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src) - new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src) - new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src) - + for(var/i in 1 to 6) + new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src) + /obj/item/weapon/storage/box/condimentbottles name = "box of condiment bottles" desc = "It has a large ketchup smear on it." /obj/item/weapon/storage/box/condimentbottles/New() ..() - new /obj/item/weapon/reagent_containers/food/condiment(src) - new /obj/item/weapon/reagent_containers/food/condiment(src) - new /obj/item/weapon/reagent_containers/food/condiment(src) - new /obj/item/weapon/reagent_containers/food/condiment(src) - new /obj/item/weapon/reagent_containers/food/condiment(src) - new /obj/item/weapon/reagent_containers/food/condiment(src) + for(var/i in 1 to 6) + new /obj/item/weapon/reagent_containers/food/condiment(src) /obj/item/weapon/storage/box/cups name = "box of paper cups" @@ -335,14 +267,9 @@ /obj/item/weapon/storage/box/cups/New() ..() - new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src ) - new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src ) - new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src ) - new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src ) - new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src ) - new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src ) - new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src ) - + for(var/i in 1 to 7) + new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src ) + /obj/item/weapon/storage/box/donkpockets name = "box of donk-pockets" desc = "Instructions: Heat in microwave. Product will cool if not eaten within seven minutes." @@ -350,12 +277,8 @@ /obj/item/weapon/storage/box/donkpockets/New() ..() - new /obj/item/weapon/reagent_containers/food/snacks/donkpocket(src) - new /obj/item/weapon/reagent_containers/food/snacks/donkpocket(src) - new /obj/item/weapon/reagent_containers/food/snacks/donkpocket(src) - new /obj/item/weapon/reagent_containers/food/snacks/donkpocket(src) - new /obj/item/weapon/reagent_containers/food/snacks/donkpocket(src) - new /obj/item/weapon/reagent_containers/food/snacks/donkpocket(src) + for(var/i in 1 to 6) + new /obj/item/weapon/reagent_containers/food/snacks/donkpocket(src) /obj/item/weapon/storage/box/monkeycubes name = "monkey cube box" @@ -378,9 +301,8 @@ /obj/item/weapon/storage/box/permits/New() //There's only a few, so blueprints are still useful beyond setting every room's name to PRIMARY FART STORAGE ..() - new /obj/item/areaeditor/permit(src) - new /obj/item/areaeditor/permit(src) - new /obj/item/areaeditor/permit(src) + for(var/i in 1 to 3) + new /obj/item/areaeditor/permit(src) /obj/item/weapon/storage/box/ids @@ -390,14 +312,9 @@ /obj/item/weapon/storage/box/ids/New() ..() - new /obj/item/weapon/card/id(src) - new /obj/item/weapon/card/id(src) - new /obj/item/weapon/card/id(src) - new /obj/item/weapon/card/id(src) - new /obj/item/weapon/card/id(src) - new /obj/item/weapon/card/id(src) - new /obj/item/weapon/card/id(src) - + for(var/i in 1 to 7) + new /obj/item/weapon/card/id(src) + /obj/item/weapon/storage/box/silver_ids name = "box of spare silver IDs" desc = "Shiny IDs for important people." @@ -405,13 +322,8 @@ /obj/item/weapon/storage/box/silver_ids/New() ..() - new /obj/item/weapon/card/id/silver(src) - new /obj/item/weapon/card/id/silver(src) - new /obj/item/weapon/card/id/silver(src) - new /obj/item/weapon/card/id/silver(src) - new /obj/item/weapon/card/id/silver(src) - new /obj/item/weapon/card/id/silver(src) - new /obj/item/weapon/card/id/silver(src) + for(var/i in 1 to 7) + new /obj/item/weapon/card/id/silver(src) /obj/item/weapon/storage/box/prisoner name = "box of prisoner IDs" @@ -436,12 +348,8 @@ /obj/item/weapon/storage/box/seccarts/New() ..() new /obj/item/weapon/cartridge/detective(src) - new /obj/item/weapon/cartridge/security(src) - new /obj/item/weapon/cartridge/security(src) - new /obj/item/weapon/cartridge/security(src) - new /obj/item/weapon/cartridge/security(src) - new /obj/item/weapon/cartridge/security(src) - new /obj/item/weapon/cartridge/security(src) + for(var/i in 1 to 6) + new /obj/item/weapon/cartridge/security(src) /obj/item/weapon/storage/box/firingpins name = "box of standard firing pins" @@ -450,14 +358,9 @@ /obj/item/weapon/storage/box/firingpins/New() ..() - new /obj/item/device/firing_pin(src) - new /obj/item/device/firing_pin(src) - new /obj/item/device/firing_pin(src) - new /obj/item/device/firing_pin(src) - new /obj/item/device/firing_pin(src) - new /obj/item/device/firing_pin(src) - new /obj/item/device/firing_pin(src) - + for(var/i in 1 to 7) + new /obj/item/device/firing_pin(src) + /obj/item/weapon/storage/box/handcuffs name = "box of spare handcuffs" desc = "A box full of handcuffs." @@ -465,14 +368,9 @@ /obj/item/weapon/storage/box/handcuffs/New() ..() - new /obj/item/weapon/restraints/handcuffs(src) - new /obj/item/weapon/restraints/handcuffs(src) - new /obj/item/weapon/restraints/handcuffs(src) - new /obj/item/weapon/restraints/handcuffs(src) - new /obj/item/weapon/restraints/handcuffs(src) - new /obj/item/weapon/restraints/handcuffs(src) - new /obj/item/weapon/restraints/handcuffs(src) - + for(var/i in 1 to 7) + new /obj/item/weapon/restraints/handcuffs(src) + /obj/item/weapon/storage/box/zipties name = "box of spare zipties" desc = "A box full of zipties." @@ -480,14 +378,9 @@ /obj/item/weapon/storage/box/zipties/New() ..() - new /obj/item/weapon/restraints/handcuffs/cable/zipties(src) - new /obj/item/weapon/restraints/handcuffs/cable/zipties(src) - new /obj/item/weapon/restraints/handcuffs/cable/zipties(src) - new /obj/item/weapon/restraints/handcuffs/cable/zipties(src) - new /obj/item/weapon/restraints/handcuffs/cable/zipties(src) - new /obj/item/weapon/restraints/handcuffs/cable/zipties(src) - new /obj/item/weapon/restraints/handcuffs/cable/zipties(src) - + for(var/i in 1 to 7) + new /obj/item/weapon/restraints/handcuffs/cable/zipties(src) + /obj/item/weapon/storage/box/alienhandcuffs name = "box of spare handcuffs" desc = "A box full of handcuffs." @@ -495,14 +388,9 @@ /obj/item/weapon/storage/box/alienhandcuffs/New() ..() - new /obj/item/weapon/restraints/handcuffs/alien(src) - new /obj/item/weapon/restraints/handcuffs/alien(src) - new /obj/item/weapon/restraints/handcuffs/alien(src) - new /obj/item/weapon/restraints/handcuffs/alien(src) - new /obj/item/weapon/restraints/handcuffs/alien(src) - new /obj/item/weapon/restraints/handcuffs/alien(src) - new /obj/item/weapon/restraints/handcuffs/alien(src) - + for(var/i in 1 to 7) + new /obj/item/weapon/restraints/handcuffs/alien(src) + /obj/item/weapon/storage/box/fakesyndiesuit name = "boxed space suit and helmet" desc = "A sleek, sturdy box used to hold replica spacesuits." @@ -520,13 +408,9 @@ /obj/item/weapon/storage/box/mousetraps/New() ..() - new /obj/item/device/assembly/mousetrap( src ) - new /obj/item/device/assembly/mousetrap( src ) - new /obj/item/device/assembly/mousetrap( src ) - new /obj/item/device/assembly/mousetrap( src ) - new /obj/item/device/assembly/mousetrap( src ) - new /obj/item/device/assembly/mousetrap( src ) - + for(var/i in 1 to 6) + new /obj/item/device/assembly/mousetrap( src ) + /obj/item/weapon/storage/box/pillbottles name = "box of pill bottles" desc = "It has pictures of pill bottles on its front." @@ -534,14 +418,9 @@ /obj/item/weapon/storage/box/pillbottles/New() ..() - new /obj/item/weapon/storage/pill_bottle( src ) - new /obj/item/weapon/storage/pill_bottle( src ) - new /obj/item/weapon/storage/pill_bottle( src ) - new /obj/item/weapon/storage/pill_bottle( src ) - new /obj/item/weapon/storage/pill_bottle( src ) - new /obj/item/weapon/storage/pill_bottle( src ) - new /obj/item/weapon/storage/pill_bottle( src ) - + for(var/i in 1 to 7) + new /obj/item/weapon/storage/pill_bottle( src ) + /obj/item/weapon/storage/box/snappops name = "snap pop box" desc = "Eight wrappers of fun! Ages 8 and up. Not suitable for children." @@ -620,14 +499,9 @@ /obj/item/weapon/storage/box/deputy/New() ..() - new /obj/item/clothing/tie/armband/deputy(src) - new /obj/item/clothing/tie/armband/deputy(src) - new /obj/item/clothing/tie/armband/deputy(src) - new /obj/item/clothing/tie/armband/deputy(src) - new /obj/item/clothing/tie/armband/deputy(src) - new /obj/item/clothing/tie/armband/deputy(src) - new /obj/item/clothing/tie/armband/deputy(src) - + for(var/i in 1 to 7) + new /obj/item/clothing/tie/armband/deputy(src) + /obj/item/weapon/storage/box/metalfoam name = "box of metal foam grenades" desc = "To be used to rapidly seal hull breaches" @@ -635,15 +509,9 @@ /obj/item/weapon/storage/box/metalfoam/New() ..() - new /obj/item/weapon/grenade/chem_grenade/metalfoam(src) - new /obj/item/weapon/grenade/chem_grenade/metalfoam(src) - new /obj/item/weapon/grenade/chem_grenade/metalfoam(src) - new /obj/item/weapon/grenade/chem_grenade/metalfoam(src) - new /obj/item/weapon/grenade/chem_grenade/metalfoam(src) - new /obj/item/weapon/grenade/chem_grenade/metalfoam(src) - new /obj/item/weapon/grenade/chem_grenade/metalfoam(src) - - + for(var/i in 1 to 7) + new /obj/item/weapon/grenade/chem_grenade/metalfoam(src) + /obj/item/weapon/storage/box/hug name = "box of hugs" desc = "A special box for sensitive people." @@ -676,14 +544,9 @@ /obj/item/weapon/storage/box/rubbershot/New() ..() - new /obj/item/ammo_casing/shotgun/rubbershot(src) - new /obj/item/ammo_casing/shotgun/rubbershot(src) - new /obj/item/ammo_casing/shotgun/rubbershot(src) - new /obj/item/ammo_casing/shotgun/rubbershot(src) - new /obj/item/ammo_casing/shotgun/rubbershot(src) - new /obj/item/ammo_casing/shotgun/rubbershot(src) - new /obj/item/ammo_casing/shotgun/rubbershot(src) - + for(var/i in 1 to 7) + new /obj/item/ammo_casing/shotgun/rubbershot(src) + /obj/item/weapon/storage/box/lethalshot name = "box of lethal shotgun shots" desc = "A box full of lethal shots, designed for riot shotguns." @@ -698,3 +561,12 @@ new /obj/item/ammo_casing/shotgun/buckshot(src) new /obj/item/ammo_casing/shotgun/buckshot(src) new /obj/item/ammo_casing/shotgun/buckshot(src) + +/obj/item/weapon/storage/box/beanbag/New() + ..() + new /obj/item/ammo_casing/shotgun/beanbag(src) + new /obj/item/ammo_casing/shotgun/beanbag(src) + new /obj/item/ammo_casing/shotgun/beanbag(src) + new /obj/item/ammo_casing/shotgun/beanbag(src) + new /obj/item/ammo_casing/shotgun/beanbag(src) + new /obj/item/ammo_casing/shotgun/beanbag(src) \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 67c4170031c..9183ffc92e5 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -42,9 +42,8 @@ ..() if(empty) return icon_state = pick("ointment","firefirstaid") - new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) - new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) - new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) + for(var/i in 1 to 3) + new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) new /obj/item/weapon/reagent_containers/pill/oxandrolone(src) new /obj/item/weapon/reagent_containers/pill/oxandrolone(src) new /obj/item/weapon/reagent_containers/hypospray/medipen(src) @@ -61,12 +60,10 @@ ..() if(empty) return icon_state = pick("antitoxin","antitoxfirstaid","antitoxfirstaid2","antitoxfirstaid3") - new /obj/item/weapon/reagent_containers/syringe/charcoal(src) - new /obj/item/weapon/reagent_containers/syringe/charcoal(src) - new /obj/item/weapon/reagent_containers/syringe/charcoal(src) - new /obj/item/weapon/reagent_containers/pill/charcoal(src) - new /obj/item/weapon/reagent_containers/pill/charcoal(src) - new /obj/item/weapon/reagent_containers/pill/charcoal(src) + for(var/i in 1 to 3) + new /obj/item/weapon/reagent_containers/syringe/charcoal(src) + for(var/i in 1 to 3) + new /obj/item/weapon/reagent_containers/pill/charcoal(src) new /obj/item/device/healthanalyzer(src) return @@ -79,10 +76,8 @@ /obj/item/weapon/storage/firstaid/o2/New() ..() if(empty) return - new /obj/item/weapon/reagent_containers/pill/salbutamol(src) - new /obj/item/weapon/reagent_containers/pill/salbutamol(src) - new /obj/item/weapon/reagent_containers/pill/salbutamol(src) - new /obj/item/weapon/reagent_containers/pill/salbutamol(src) + for(var/i in 1 to 4) + new /obj/item/weapon/reagent_containers/pill/salbutamol(src) new /obj/item/weapon/reagent_containers/hypospray/medipen(src) new /obj/item/weapon/reagent_containers/hypospray/medipen(src) new /obj/item/device/healthanalyzer(src) @@ -97,10 +92,8 @@ /obj/item/weapon/storage/firstaid/brute/New() ..() if(empty) return - new /obj/item/weapon/reagent_containers/pill/patch/styptic(src) - new /obj/item/weapon/reagent_containers/pill/patch/styptic(src) - new /obj/item/weapon/reagent_containers/pill/patch/styptic(src) - new /obj/item/weapon/reagent_containers/pill/patch/styptic(src) + for(var/i in 1 to 4) + new /obj/item/weapon/reagent_containers/pill/patch/styptic(src) new /obj/item/stack/medical/gauze(src) new /obj/item/stack/medical/gauze(src) new /obj/item/device/healthanalyzer(src) @@ -168,79 +161,50 @@ /obj/item/weapon/storage/box/silver_sulf/New() ..() - new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) - new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) - new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) - new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) - new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) - new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) - new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) - - + for(var/i in 1 to 7) + new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src) + /obj/item/weapon/storage/pill_bottle/charcoal name = "bottle of charcoal pills" desc = "Contains pills used to counter toxins." /obj/item/weapon/storage/pill_bottle/charcoal/New() ..() - new /obj/item/weapon/reagent_containers/pill/charcoal(src) - new /obj/item/weapon/reagent_containers/pill/charcoal(src) - new /obj/item/weapon/reagent_containers/pill/charcoal(src) - new /obj/item/weapon/reagent_containers/pill/charcoal(src) - new /obj/item/weapon/reagent_containers/pill/charcoal(src) - new /obj/item/weapon/reagent_containers/pill/charcoal(src) - new /obj/item/weapon/reagent_containers/pill/charcoal(src) - + for(var/i in 1 to 7) + new /obj/item/weapon/reagent_containers/pill/charcoal(src) + /obj/item/weapon/storage/pill_bottle/epinephrine name = "bottle of epinephrine pills" desc = "Contains pills used to stabilize patients." /obj/item/weapon/storage/pill_bottle/epinephrine/New() ..() - new /obj/item/weapon/reagent_containers/pill/epinephrine(src) - new /obj/item/weapon/reagent_containers/pill/epinephrine(src) - new /obj/item/weapon/reagent_containers/pill/epinephrine(src) - new /obj/item/weapon/reagent_containers/pill/epinephrine(src) - new /obj/item/weapon/reagent_containers/pill/epinephrine(src) - new /obj/item/weapon/reagent_containers/pill/epinephrine(src) - new /obj/item/weapon/reagent_containers/pill/epinephrine(src) - + for(var/i in 1 to 7) + new /obj/item/weapon/reagent_containers/pill/epinephrine(src) + /obj/item/weapon/storage/pill_bottle/mutadone name = "bottle of mutadone pills" desc = "Contains pills used to treat genetic abnormalities." /obj/item/weapon/storage/pill_bottle/mutadone/New() ..() - new /obj/item/weapon/reagent_containers/pill/mutadone(src) - new /obj/item/weapon/reagent_containers/pill/mutadone(src) - new /obj/item/weapon/reagent_containers/pill/mutadone(src) - new /obj/item/weapon/reagent_containers/pill/mutadone(src) - new /obj/item/weapon/reagent_containers/pill/mutadone(src) - new /obj/item/weapon/reagent_containers/pill/mutadone(src) - new /obj/item/weapon/reagent_containers/pill/mutadone(src) - + for(var/i in 1 to 7) + new /obj/item/weapon/reagent_containers/pill/mutadone(src) + /obj/item/weapon/storage/pill_bottle/mannitol name = "bottle of mannitol pills" desc = "Contains pills used to treat brain damage." /obj/item/weapon/storage/pill_bottle/mannitol/New() ..() - new /obj/item/weapon/reagent_containers/pill/mannitol(src) - new /obj/item/weapon/reagent_containers/pill/mannitol(src) - new /obj/item/weapon/reagent_containers/pill/mannitol(src) - new /obj/item/weapon/reagent_containers/pill/mannitol(src) - new /obj/item/weapon/reagent_containers/pill/mannitol(src) - new /obj/item/weapon/reagent_containers/pill/mannitol(src) - new /obj/item/weapon/reagent_containers/pill/mannitol(src) - + for(var/i in 1 to 7) + new /obj/item/weapon/reagent_containers/pill/mannitol(src) + /obj/item/weapon/storage/pill_bottle/stimulant name = "bottle of stimulant pills" desc = "Guaranteed to give you that extra burst of energy during a long shift!" /obj/item/weapon/storage/pill_bottle/stimulant/New() ..() - new /obj/item/weapon/reagent_containers/pill/stimulant(src) - new /obj/item/weapon/reagent_containers/pill/stimulant(src) - new /obj/item/weapon/reagent_containers/pill/stimulant(src) - new /obj/item/weapon/reagent_containers/pill/stimulant(src) - new /obj/item/weapon/reagent_containers/pill/stimulant(src) \ No newline at end of file + for(var/i in 1 to 5) + new /obj/item/weapon/reagent_containers/pill/stimulant(src) diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index bab0a4e07e4..d740a80af20 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -82,9 +82,8 @@ /obj/item/weapon/storage/lockbox/loyalty/New() ..() - new /obj/item/weapon/implantcase/loyalty(src) - new /obj/item/weapon/implantcase/loyalty(src) - new /obj/item/weapon/implantcase/loyalty(src) + for(var/i in 1 to 3) + new /obj/item/weapon/implantcase/loyalty(src) new /obj/item/weapon/implanter/loyalty(src) @@ -114,7 +113,6 @@ ..() new /obj/item/clothing/tie/medal/silver/valor(src) new /obj/item/clothing/tie/medal/bronze_heart(src) - new /obj/item/clothing/tie/medal/conduct(src) - new /obj/item/clothing/tie/medal/conduct(src) - new /obj/item/clothing/tie/medal/conduct(src) - new /obj/item/clothing/tie/medal/gold/captain(src) \ No newline at end of file + for(var/i in 1 to 3) + new /obj/item/clothing/tie/medal/conduct(src) + new /obj/item/clothing/tie/medal/gold/captain(src) diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index a91ba35482c..a80a611d619 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -36,21 +36,21 @@ if (istype(W, /obj/item/weapon/screwdriver)) if (do_after(user, 20/W.toolspeed, target = src)) src.open =! src.open - user.show_message(text("You [] the service panel.", (src.open ? "open" : "close"))) + user.show_message("You [open ? "open" : "close"] the service panel.", 1) return if ((istype(W, /obj/item/device/multitool)) && (src.open == 1)&& (!src.l_hacking)) - user.show_message(text("Now attempting to reset internal memory, please hold."), 1) + user.show_message("Now attempting to reset internal memory, please hold.", 1) src.l_hacking = 1 if (do_after(usr, 100/W.toolspeed, target = src)) if (prob(40)) src.l_setshort = 1 src.l_set = 0 - user.show_message(text("Internal memory reset. Please give it a few seconds to reinitialize."), 1) + user.show_message("Internal memory reset. Please give it a few seconds to reinitialize.", 1) sleep(80) src.l_setshort = 0 src.l_hacking = 0 else - user.show_message(text("Unable to reset internal memory."), 1) + user.show_message("Unable to reset internal memory.", 1) src.l_hacking = 0 else src.l_hacking = 0 return diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 6b2d688e5dd..6dc851cd335 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -158,16 +158,10 @@ /obj/item/weapon/storage/box/syndie_kit/bioterror/New() ..() - new /obj/item/weapon/reagent_containers/syringe/bioterror(src) - new /obj/item/weapon/reagent_containers/syringe/bioterror(src) - new /obj/item/weapon/reagent_containers/syringe/bioterror(src) - new /obj/item/weapon/reagent_containers/syringe/bioterror(src) - new /obj/item/weapon/reagent_containers/syringe/bioterror(src) - new /obj/item/weapon/reagent_containers/syringe/bioterror(src) - new /obj/item/weapon/reagent_containers/syringe/bioterror(src) + for(var/i in 1 to 7) + new /obj/item/weapon/reagent_containers/syringe/bioterror(src) return - /obj/item/weapon/storage/box/syndie_kit/imp_adrenal name = "boxed adrenal implant (with injector)" @@ -178,7 +172,6 @@ O.update_icon() return - /obj/item/weapon/storage/box/syndie_kit/imp_storage name = "boxed storage implant (with injector)" @@ -187,7 +180,6 @@ new /obj/item/weapon/implanter/storage(src) return - /obj/item/weapon/storage/box/syndie_kit/space name = "boxed space suit and helmet" can_hold = list(/obj/item/clothing/suit/space/syndicate, /obj/item/clothing/head/helmet/space/syndicate) @@ -199,7 +191,6 @@ new /obj/item/clothing/head/helmet/space/syndicate/black/red(src) return - /obj/item/weapon/storage/box/syndie_kit/emp name = "boxed EMP kit" @@ -241,30 +232,25 @@ new /obj/item/nuke_core_container(src) new /obj/item/weapon/paper/nuke_instructions(src) - /obj/item/weapon/storage/box/syndie_kit/tuberculosisgrenade - name = "boxed virus grenade kit" + name = "boxed virus grenade kit" -/obj/item/weapon/storage/box/virus_kit/tuberculosisgrenade/New() - ..() - new /obj/item/weapon/grenade/chem_grenade/tuberculosis(src) - new /obj/item/weapon/reagent_containers/hypospray/medipen/tuberculosiscure(src) - new /obj/item/weapon/reagent_containers/hypospray/medipen/tuberculosiscure(src) - new /obj/item/weapon/reagent_containers/hypospray/medipen/tuberculosiscure(src) - new /obj/item/weapon/reagent_containers/hypospray/medipen/tuberculosiscure(src) - new /obj/item/weapon/reagent_containers/hypospray/medipen/tuberculosiscure(src) - new /obj/item/weapon/reagent_containers/syringe(src) - new /obj/item/weapon/reagent_containers/glass/bottle/tuberculosiscure(src) - return +/obj/item/weapon/storage/box/syndie_kit/tuberculosisgrenade/New() + ..() + new /obj/item/weapon/grenade/chem_grenade/tuberculosis(src) + for(var/i in 1 to 5) + new /obj/item/weapon/reagent_containers/hypospray/medipen/tuberculosiscure(src) + new /obj/item/weapon/reagent_containers/syringe(src) + new /obj/item/weapon/reagent_containers/glass/bottle/tuberculosiscure(src) + return /obj/item/weapon/storage/box/syndie_kit/tuberculosiskit - name = "boxed virus kit" - -/obj/item/weapon/storage/box/virus_kit/tuberculosiskit/New() - ..() - new /obj/item/weapon/reagent_containers/glass/bottle/tuberculosis(src) - new /obj/item/weapon/reagent_containers/hypospray/medipen/tuberculosiscure(src) - new /obj/item/weapon/reagent_containers/syringe(src) - new /obj/item/weapon/reagent_containers/glass/bottle/tuberculosiscure(src) - return + name = "boxed virus kit" +/obj/item/weapon/storage/box/syndie_kit/tuberculosiskit/New() + ..() + new /obj/item/weapon/reagent_containers/glass/bottle/tuberculosis(src) + new /obj/item/weapon/reagent_containers/hypospray/medipen/tuberculosiscure(src) + new /obj/item/weapon/reagent_containers/syringe(src) + new /obj/item/weapon/reagent_containers/glass/bottle/tuberculosiscure(src) + return diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index 9fe72a6ddfa..0bc932047d5 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -14,7 +14,7 @@ name = "oxygen tank" desc = "A tank of oxygen." icon_state = "oxygen" - distribute_pressure = 16 + distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE force = 10 @@ -154,7 +154,7 @@ slot_flags = SLOT_BELT w_class = 2 force = 4 - distribute_pressure = ONE_ATMOSPHERE*O2STANDARD + distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE volume = 3 //Tiny. Real life equivalents only have 21 breaths of oxygen in them. They're EMERGENCY tanks anyway -errorage (dangercon 2011) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index eff1d524c21..57054c54afa 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -1,7 +1,3 @@ -#define TANK_MAX_RELEASE_PRESSURE (ONE_ATMOSPHERE*3) -#define TANK_MIN_RELEASE_PRESSURE 0 -#define TANK_DEFAULT_RELEASE_PRESSURE (ONE_ATMOSPHERE*O2STANDARD) - /obj/item/weapon/tank name = "tank" icon = 'icons/obj/tank.dmi' @@ -119,10 +115,11 @@ add_fingerprint(user) ui_interact(user) -/obj/item/weapon/tank/ui_interact(mob/user, ui_key = "main", var/datum/tgui/ui = null, force_open = 0) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/item/weapon/tank/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ + datum/tgui/master_ui = null, datum/ui_state/state = hands_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) - ui = new(user, src, ui_key, "tanks", name, 400, 200, state = inventory_state) + ui = new(user, src, ui_key, "tanks", name, 400, 200, master_ui, state) ui.open() /obj/item/weapon/tank/get_ui_data() diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index 029c0fd0238..2406d7b9d7b 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -156,7 +156,7 @@ Frequency: if(turfs.len) L["None (Dangerous)"] = pick(turfs) var/t1 = input(user, "Please select a teleporter to lock in on.", "Hand Teleporter") in L - if ((user.get_active_hand() != src || user.stat || user.restrained())) + if (user.get_active_hand() != src || user.incapacitated()) return if(active_portals >= 3) user.show_message("\The [src] is recharging!") @@ -166,7 +166,6 @@ Frequency: var/obj/effect/portal/P = new /obj/effect/portal(get_turf(src), T, src) try_move_adjacent(P) active_portals++ - src.add_fingerprint(user) - return + add_fingerprint(user) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 3e716979df8..2cd7a772f8c 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -17,6 +17,7 @@ /obj/Destroy() if(!istype(src, /obj/machinery)) SSobj.processing.Remove(src) // TODO: Have a processing bitflag to reduce on unnecessary loops through the processing lists + SStgui.close_uis(src) return ..() /obj/assume_air(datum/gas_mixture/giver) @@ -194,7 +195,7 @@ /obj/proc/tesla_act(var/power) being_shocked = 1 - var/power_bounced = power / 1.3 - tesla_zap(src, 5, power_bounced) + var/power_bounced = power / 2 + tesla_zap(src, 3, power_bounced) spawn(10) being_shocked = 0 diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 38a348bbfcb..cbddbfeaff7 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -33,6 +33,10 @@ if(!opened) // if closed, any item at the crate's loc is put in the contents take_contents() +/obj/structure/closet/Destroy() + dump_contents() + return ..() + /obj/structure/closet/update_icon() overlays.Cut() if(!opened) @@ -167,7 +171,6 @@ contents_explosion(severity, target) if(loc && ispath(material_drop) && !(flags & NODECONSTRUCT)) new material_drop(loc) - dump_contents() qdel(src) ..() @@ -176,7 +179,6 @@ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) health -= Proj.damage if(health <= 0) - dump_contents() qdel(src) return @@ -184,12 +186,10 @@ if(user.environment_smash) user.do_attack_animation(src) visible_message("[user] destroys \the [src].") - dump_contents() qdel(src) /obj/structure/closet/blob_act() if(prob(75)) - dump_contents() qdel(src) diff --git a/code/game/objects/structures/crates_lockers/closets/fitness.dm b/code/game/objects/structures/crates_lockers/closets/fitness.dm index 46dc772b5fe..d3e7f0156ea 100644 --- a/code/game/objects/structures/crates_lockers/closets/fitness.dm +++ b/code/game/objects/structures/crates_lockers/closets/fitness.dm @@ -43,12 +43,10 @@ /obj/structure/closet/lasertag/red/New() ..() - new /obj/item/weapon/gun/energy/laser/redtag(src) - new /obj/item/weapon/gun/energy/laser/redtag(src) - new /obj/item/weapon/gun/energy/laser/redtag(src) - new /obj/item/clothing/suit/redtag(src) - new /obj/item/clothing/suit/redtag(src) - new /obj/item/clothing/suit/redtag(src) + for(var/i in 1 to 3) + new /obj/item/weapon/gun/energy/laser/redtag(src) + for(var/i in 1 to 3) + new /obj/item/clothing/suit/redtag(src) new /obj/item/clothing/head/helmet/redtaghelm(src) @@ -59,10 +57,8 @@ /obj/structure/closet/lasertag/blue/New() ..() - new /obj/item/weapon/gun/energy/laser/bluetag(src) - new /obj/item/weapon/gun/energy/laser/bluetag(src) - new /obj/item/weapon/gun/energy/laser/bluetag(src) - new /obj/item/clothing/suit/bluetag(src) - new /obj/item/clothing/suit/bluetag(src) - new /obj/item/clothing/suit/bluetag(src) + for(var/i in 1 to 3) + new /obj/item/weapon/gun/energy/laser/bluetag(src) + for(var/i in 1 to 3) + new /obj/item/clothing/suit/bluetag(src) new /obj/item/clothing/head/helmet/bluetaghelm(src) diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm index 1b5cdee6d7e..e2d7f9c2ac1 100644 --- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm +++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm @@ -22,17 +22,10 @@ /obj/structure/closet/gimmick/russian/New() ..() - new /obj/item/clothing/head/ushanka(src) - new /obj/item/clothing/head/ushanka(src) - new /obj/item/clothing/head/ushanka(src) - new /obj/item/clothing/head/ushanka(src) - new /obj/item/clothing/head/ushanka(src) - new /obj/item/clothing/under/soviet(src) - new /obj/item/clothing/under/soviet(src) - new /obj/item/clothing/under/soviet(src) - new /obj/item/clothing/under/soviet(src) - new /obj/item/clothing/under/soviet(src) - + for(var/i in 1 to 5) + new /obj/item/clothing/head/ushanka(src) + for(var/i in 1 to 5) + new /obj/item/clothing/under/soviet(src) /obj/structure/closet/gimmick/tacticool name = "tacticool gear closet" @@ -67,50 +60,38 @@ /obj/structure/closet/thunderdome/tdred/New() ..() - new /obj/item/clothing/suit/armor/tdome/red(src) - new /obj/item/clothing/suit/armor/tdome/red(src) - new /obj/item/clothing/suit/armor/tdome/red(src) - new /obj/item/weapon/melee/energy/sword/saber(src) - new /obj/item/weapon/melee/energy/sword/saber(src) - new /obj/item/weapon/melee/energy/sword/saber(src) - new /obj/item/weapon/gun/energy/laser(src) - new /obj/item/weapon/gun/energy/laser(src) - new /obj/item/weapon/gun/energy/laser(src) - new /obj/item/weapon/melee/baton/loaded(src) - new /obj/item/weapon/melee/baton/loaded(src) - new /obj/item/weapon/melee/baton/loaded(src) - new /obj/item/weapon/storage/box/flashbangs(src) - new /obj/item/weapon/storage/box/flashbangs(src) - new /obj/item/weapon/storage/box/flashbangs(src) - new /obj/item/clothing/head/helmet/thunderdome(src) - new /obj/item/clothing/head/helmet/thunderdome(src) - new /obj/item/clothing/head/helmet/thunderdome(src) - + for(var/i in 1 to 3) + new /obj/item/clothing/suit/armor/tdome/red(src) + for(var/i in 1 to 3) + new /obj/item/weapon/melee/energy/sword/saber(src) + for(var/i in 1 to 3) + new /obj/item/weapon/gun/energy/laser(src) + for(var/i in 1 to 3) + new /obj/item/weapon/melee/baton/loaded(src) + for(var/i in 1 to 3) + new /obj/item/weapon/storage/box/flashbangs(src) + for(var/i in 1 to 3) + new /obj/item/clothing/head/helmet/thunderdome(src) + /obj/structure/closet/thunderdome/tdgreen name = "green-team Thunderdome closet" icon_door = "green" /obj/structure/closet/thunderdome/tdgreen/New() ..() - new /obj/item/clothing/suit/armor/tdome/green(src) - new /obj/item/clothing/suit/armor/tdome/green(src) - new /obj/item/clothing/suit/armor/tdome/green(src) - new /obj/item/weapon/melee/energy/sword/saber(src) - new /obj/item/weapon/melee/energy/sword/saber(src) - new /obj/item/weapon/melee/energy/sword/saber(src) - new /obj/item/weapon/gun/energy/laser(src) - new /obj/item/weapon/gun/energy/laser(src) - new /obj/item/weapon/gun/energy/laser(src) - new /obj/item/weapon/melee/baton/loaded(src) - new /obj/item/weapon/melee/baton/loaded(src) - new /obj/item/weapon/melee/baton/loaded(src) - new /obj/item/weapon/storage/box/flashbangs(src) - new /obj/item/weapon/storage/box/flashbangs(src) - new /obj/item/weapon/storage/box/flashbangs(src) - new /obj/item/clothing/head/helmet/thunderdome(src) - new /obj/item/clothing/head/helmet/thunderdome(src) - new /obj/item/clothing/head/helmet/thunderdome(src) - + for(var/i in 1 to 3) + new /obj/item/clothing/suit/armor/tdome/green(src) + for(var/i in 1 to 3) + new /obj/item/weapon/melee/energy/sword/saber(src) + for(var/i in 1 to 3) + new /obj/item/weapon/gun/energy/laser(src) + for(var/i in 1 to 3) + new /obj/item/weapon/melee/baton/loaded(src) + for(var/i in 1 to 3) + new /obj/item/weapon/storage/box/flashbangs(src) + for(var/i in 1 to 3) + new /obj/item/clothing/head/helmet/thunderdome(src) + /obj/structure/closet/malf/suits desc = "It's a storage unit for operational gear." icon_state = "syndicate" diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index 0f2d6345066..56ca7d875d0 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -23,6 +23,10 @@ new /obj/item/clothing/shoes/sneakers/black(src) new /obj/item/weapon/reagent_containers/glass/rag(src) new /obj/item/weapon/reagent_containers/glass/rag(src) + new /obj/item/weapon/storage/box/beanbag(src) + new /obj/item/clothing/suit/armor/vest(src) + new /obj/item/clothing/glasses/sunglasses/reagent(src) + new /obj/item/weapon/storage/belt/bandolier(src) /obj/structure/closet/chefcloset name = "\proper chef's closet" @@ -37,9 +41,8 @@ new /obj/item/device/radio/headset/headset_srv(src) new /obj/item/clothing/tie/waistcoat(src) new /obj/item/clothing/tie/waistcoat(src) - new /obj/item/clothing/suit/apron/chef(src) - new /obj/item/clothing/suit/apron/chef(src) - new /obj/item/clothing/suit/apron/chef(src) + for(var/i in 1 to 3) + new /obj/item/clothing/suit/apron/chef(src) new /obj/item/clothing/head/soft/mime(src) new /obj/item/clothing/head/soft/mime(src) new /obj/item/weapon/storage/box/mousetraps(src) @@ -61,9 +64,8 @@ new /obj/item/clothing/gloves/color/black(src) new /obj/item/clothing/head/soft/purple(src) new /obj/item/device/flashlight(src) - new /obj/item/weapon/caution(src) - new /obj/item/weapon/caution(src) - new /obj/item/weapon/caution(src) + for(var/i in 1 to 3) + new /obj/item/weapon/caution(src) new /obj/item/weapon/holosign_creator(src) new /obj/item/device/lightreplacer(src) new /obj/item/weapon/soap(src) @@ -132,18 +134,14 @@ new /obj/item/weapon/storage/backpack/satchel_sec(src) new /obj/item/weapon/storage/backpack/dufflebag/sec(src) new /obj/item/weapon/storage/backpack/dufflebag/sec(src) - new /obj/item/clothing/under/rank/security(src) - new /obj/item/clothing/under/rank/security(src) - new /obj/item/clothing/under/rank/security(src) - new /obj/item/clothing/shoes/jackboots(src) - new /obj/item/clothing/shoes/jackboots(src) - new /obj/item/clothing/shoes/jackboots(src) - new /obj/item/clothing/head/beret/sec(src) - new /obj/item/clothing/head/beret/sec(src) - new /obj/item/clothing/head/beret/sec(src) - new /obj/item/clothing/head/soft/sec(src) - new /obj/item/clothing/head/soft/sec(src) - new /obj/item/clothing/head/soft/sec(src) + for(var/i in 1 to 3) + new /obj/item/clothing/under/rank/security(src) + for(var/i in 1 to 3) + new /obj/item/clothing/shoes/jackboots(src) + for(var/i in 1 to 3) + new /obj/item/clothing/head/beret/sec(src) + for(var/i in 1 to 3) + new /obj/item/clothing/head/soft/sec(src) new /obj/item/clothing/mask/bandana/red(src) new /obj/item/clothing/mask/bandana/red(src) return @@ -157,18 +155,14 @@ ..() contents = list() new /obj/item/clothing/suit/hooded/wintercoat/cargo(src) - new /obj/item/clothing/under/rank/cargotech(src) - new /obj/item/clothing/under/rank/cargotech(src) - new /obj/item/clothing/under/rank/cargotech(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/clothing/gloves/fingerless(src) - new /obj/item/clothing/gloves/fingerless(src) - new /obj/item/clothing/gloves/fingerless(src) - new /obj/item/clothing/head/soft(src) - new /obj/item/clothing/head/soft(src) - new /obj/item/clothing/head/soft(src) + for(var/i in 1 to 3) + new /obj/item/clothing/under/rank/cargotech(src) + for(var/i in 1 to 3) + new /obj/item/clothing/shoes/sneakers/black(src) + for(var/i in 1 to 3) + new /obj/item/clothing/gloves/fingerless(src) + for(var/i in 1 to 3) + new /obj/item/clothing/head/soft(src) new /obj/item/device/radio/headset/headset_cargo(src) /obj/structure/closet/wardrobe/atmospherics_yellow @@ -181,15 +175,12 @@ new /obj/item/weapon/storage/backpack/dufflebag(src) new /obj/item/weapon/storage/backpack/satchel_norm(src) new /obj/item/weapon/storage/backpack(src) - new /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos(src) - new /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos(src) - new /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos(src) - new /obj/item/clothing/under/rank/atmospheric_technician(src) - new /obj/item/clothing/under/rank/atmospheric_technician(src) - new /obj/item/clothing/under/rank/atmospheric_technician(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/clothing/shoes/sneakers/black(src) + for(var/i in 1 to 3) + new /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos(src) + for(var/i in 1 to 3) + new /obj/item/clothing/under/rank/atmospheric_technician(src) + for(var/i in 1 to 3) + new /obj/item/clothing/shoes/sneakers/black(src) return /obj/structure/closet/wardrobe/engineering_yellow @@ -203,18 +194,14 @@ new /obj/item/weapon/storage/backpack/industrial(src) new /obj/item/weapon/storage/backpack/satchel_eng(src) new /obj/item/clothing/suit/hooded/wintercoat/engineering(src) - new /obj/item/clothing/under/rank/engineer(src) - new /obj/item/clothing/under/rank/engineer(src) - new /obj/item/clothing/under/rank/engineer(src) - new /obj/item/clothing/suit/hazardvest(src) - new /obj/item/clothing/suit/hazardvest(src) - new /obj/item/clothing/suit/hazardvest(src) - new /obj/item/clothing/shoes/workboots(src) - new /obj/item/clothing/shoes/workboots(src) - new /obj/item/clothing/shoes/workboots(src) - new /obj/item/clothing/head/hardhat(src) - new /obj/item/clothing/head/hardhat(src) - new /obj/item/clothing/head/hardhat(src) + for(var/i in 1 to 3) + new /obj/item/clothing/under/rank/engineer(src) + for(var/i in 1 to 3) + new /obj/item/clothing/suit/hazardvest(src) + for(var/i in 1 to 3) + new /obj/item/clothing/shoes/workboots(src) + for(var/i in 1 to 3) + new /obj/item/clothing/head/hardhat(src) return /obj/structure/closet/wardrobe/white/medical @@ -232,19 +219,16 @@ new /obj/item/clothing/under/rank/medical/blue(src) new /obj/item/clothing/under/rank/medical/green(src) new /obj/item/clothing/under/rank/medical/purple(src) - new /obj/item/clothing/under/rank/medical(src) - new /obj/item/clothing/under/rank/medical(src) - new /obj/item/clothing/under/rank/medical(src) + for(var/i in 1 to 3) + new /obj/item/clothing/under/rank/medical(src) new /obj/item/clothing/suit/toggle/labcoat(src) new /obj/item/clothing/suit/toggle/labcoat(src) new /obj/item/clothing/suit/toggle/labcoat/emt(src) new /obj/item/clothing/suit/toggle/labcoat/emt(src) - new /obj/item/clothing/shoes/sneakers/white(src) - new /obj/item/clothing/shoes/sneakers/white(src) - new /obj/item/clothing/shoes/sneakers/white(src) - new /obj/item/clothing/head/soft/emt(src) - new /obj/item/clothing/head/soft/emt(src) - new /obj/item/clothing/head/soft/emt(src) + for(var/i in 1 to 3) + new /obj/item/clothing/shoes/sneakers/white(src) + for(var/i in 1 to 3) + new /obj/item/clothing/head/soft/emt(src) return /obj/structure/closet/wardrobe/robotics_black @@ -348,20 +332,16 @@ new /obj/item/weapon/storage/backpack/satchel_tox(src) new /obj/item/weapon/storage/backpack/satchel_tox(src) new /obj/item/clothing/suit/hooded/wintercoat/science(src) - new /obj/item/clothing/under/rank/scientist(src) - new /obj/item/clothing/under/rank/scientist(src) - new /obj/item/clothing/under/rank/scientist(src) - new /obj/item/clothing/suit/toggle/labcoat/science(src) - new /obj/item/clothing/suit/toggle/labcoat/science(src) - new /obj/item/clothing/suit/toggle/labcoat/science(src) - new /obj/item/clothing/shoes/sneakers/white(src) - new /obj/item/clothing/shoes/sneakers/white(src) - new /obj/item/clothing/shoes/sneakers/white(src) + for(var/i in 1 to 3) + new /obj/item/clothing/under/rank/scientist(src) + for(var/i in 1 to 3) + new /obj/item/clothing/suit/toggle/labcoat/science(src) + for(var/i in 1 to 3) + new /obj/item/clothing/shoes/sneakers/white(src) new /obj/item/device/radio/headset/headset_sci(src) new /obj/item/device/radio/headset/headset_sci(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/clothing/mask/gas(src) + for(var/i in 1 to 3) + new /obj/item/clothing/mask/gas(src) return /obj/structure/closet/wardrobe/botanist @@ -380,9 +360,7 @@ new /obj/item/clothing/suit/apron(src) new /obj/item/clothing/suit/apron/overalls(src) new /obj/item/clothing/suit/apron/overalls(src) - new /obj/item/clothing/under/rank/hydroponics(src) - new /obj/item/clothing/under/rank/hydroponics(src) - new /obj/item/clothing/under/rank/hydroponics(src) - new /obj/item/clothing/mask/bandana(src) - new /obj/item/clothing/mask/bandana(src) - new /obj/item/clothing/mask/bandana(src) \ No newline at end of file + for(var/i in 1 to 3) + new /obj/item/clothing/under/rank/hydroponics(src) + for(var/i in 1 to 3) + new /obj/item/clothing/mask/bandana(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm index 7d04a6bfee6..72fc2ad7bb8 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm @@ -7,13 +7,5 @@ /obj/structure/closet/secure_closet/bar/New() ..() - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) - new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) + for(var/i in 1 to 10) + new /obj/item/weapon/reagent_containers/food/drinks/beer( src ) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 1c9ebd16da9..3f6c5c5a31c 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -34,16 +34,13 @@ ..() new /obj/item/clothing/gloves/color/yellow(src) new /obj/item/clothing/gloves/color/yellow(src) - new /obj/item/weapon/storage/toolbox/electrical(src) - new /obj/item/weapon/storage/toolbox/electrical(src) - new /obj/item/weapon/storage/toolbox/electrical(src) - new /obj/item/weapon/electronics/apc(src) - new /obj/item/weapon/electronics/apc(src) - new /obj/item/weapon/electronics/apc(src) - new /obj/item/device/multitool(src) - new /obj/item/device/multitool(src) - new /obj/item/device/multitool(src) - + for(var/i in 1 to 3) + new /obj/item/weapon/storage/toolbox/electrical(src) + for(var/i in 1 to 3) + new /obj/item/weapon/electronics/apc(src) + for(var/i in 1 to 3) + new /obj/item/device/multitool(src) + /obj/structure/closet/secure_closet/engineering_welding name = "welding supplies locker" req_access = list(access_engine_equip) @@ -52,13 +49,11 @@ /obj/structure/closet/secure_closet/engineering_welding/New() ..() - new /obj/item/clothing/head/welding(src) - new /obj/item/clothing/head/welding(src) - new /obj/item/clothing/head/welding(src) - new /obj/item/weapon/weldingtool/largetank(src) - new /obj/item/weapon/weldingtool/largetank(src) - new /obj/item/weapon/weldingtool/largetank(src) - + for(var/i in 1 to 3) + new /obj/item/clothing/head/welding(src) + for(var/i in 1 to 3) + new /obj/item/weapon/weldingtool/largetank(src) + /obj/structure/closet/secure_closet/engineering_personal name = "engineer's locker" req_access = list(access_engine_equip) @@ -90,4 +85,4 @@ new /obj/item/weapon/watertank/atmos(src) new /obj/item/clothing/suit/fire/atmos(src) new /obj/item/clothing/head/hardhat/atmos(src) - new /obj/item/clothing/glasses/meson/engine/tray(src) \ No newline at end of file + new /obj/item/clothing/glasses/meson/engine/tray(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 980f7fd6c37..92eac22ab65 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -15,12 +15,10 @@ new /obj/item/weapon/reagent_containers/glass/bottle/toxin(src) new /obj/item/weapon/reagent_containers/glass/bottle/morphine(src) new /obj/item/weapon/reagent_containers/glass/bottle/morphine(src) - new /obj/item/weapon/reagent_containers/glass/bottle/epinephrine(src) - new /obj/item/weapon/reagent_containers/glass/bottle/epinephrine(src) - new /obj/item/weapon/reagent_containers/glass/bottle/epinephrine(src) - new /obj/item/weapon/reagent_containers/glass/bottle/charcoal(src) - new /obj/item/weapon/reagent_containers/glass/bottle/charcoal(src) - new /obj/item/weapon/reagent_containers/glass/bottle/charcoal(src) + for(var/i in 1 to 3) + new /obj/item/weapon/reagent_containers/glass/bottle/epinephrine(src) + for(var/i in 1 to 3) + new /obj/item/weapon/reagent_containers/glass/bottle/charcoal(src) new /obj/item/weapon/storage/box/rxglasses(src) /obj/structure/closet/secure_closet/medical2 @@ -30,13 +28,11 @@ /obj/structure/closet/secure_closet/medical2/New() ..() - new /obj/item/weapon/tank/internals/anesthetic(src) - new /obj/item/weapon/tank/internals/anesthetic(src) - new /obj/item/weapon/tank/internals/anesthetic(src) - new /obj/item/clothing/mask/breath/medical(src) - new /obj/item/clothing/mask/breath/medical(src) - new /obj/item/clothing/mask/breath/medical(src) - + for(var/i in 1 to 3) + new /obj/item/weapon/tank/internals/anesthetic(src) + for(var/i in 1 to 3) + new /obj/item/clothing/mask/breath/medical(src) + /obj/structure/closet/secure_closet/medical3 name = "medical doctor's locker" req_access = list(access_surgery) @@ -81,10 +77,9 @@ /obj/structure/closet/secure_closet/animal/New() ..() new /obj/item/device/assembly/signaler(src) - new /obj/item/device/electropack(src) - new /obj/item/device/electropack(src) - new /obj/item/device/electropack(src) - + for(var/i in 1 to 3) + new /obj/item/device/electropack(src) + /obj/structure/closet/secure_closet/chemical name = "chemical closet" desc = "Store dangerous chemicals in here." diff --git a/code/game/objects/structures/crates_lockers/closets/secure/misc.dm b/code/game/objects/structures/crates_lockers/closets/secure/misc.dm index 5ba9f4e5d5b..f75526e5790 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/misc.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/misc.dm @@ -62,6 +62,5 @@ new /obj/item/stack/sheet/glass(src, 50) new /obj/item/clothing/shoes/magboots(src) new /obj/item/weapon/storage/box/metalfoam(src) - new /obj/item/weapon/rcd_ammo/large(src) - new /obj/item/weapon/rcd_ammo/large(src) - new /obj/item/weapon/rcd_ammo/large(src) + for(var/i in 1 to 3) + new /obj/item/weapon/rcd_ammo/large(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 1bcd35a11b1..e161caf3ce2 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -186,12 +186,9 @@ /obj/structure/closet/secure_closet/injection/New() ..() - new /obj/item/weapon/reagent_containers/syringe/lethal/choral(src) - new /obj/item/weapon/reagent_containers/syringe/lethal/choral(src) - new /obj/item/weapon/reagent_containers/syringe/lethal/choral(src) - new /obj/item/weapon/reagent_containers/syringe/lethal/choral(src) - new /obj/item/weapon/reagent_containers/syringe/lethal/choral(src) - + for(var/i in 1 to 5) + new /obj/item/weapon/reagent_containers/syringe/lethal/choral(src) + /obj/structure/closet/secure_closet/brig name = "brig locker" req_access = list(access_brig) @@ -210,9 +207,8 @@ /obj/structure/closet/secure_closet/courtroom/New() ..() new /obj/item/clothing/shoes/sneakers/brown(src) - new /obj/item/weapon/paper/Court (src) - new /obj/item/weapon/paper/Court (src) - new /obj/item/weapon/paper/Court (src) + for(var/i in 1 to 3) + new /obj/item/weapon/paper/Court (src) new /obj/item/weapon/pen (src) new /obj/item/clothing/suit/judgerobe (src) new /obj/item/clothing/head/powdered_wig (src) @@ -226,16 +222,13 @@ /obj/structure/closet/secure_closet/armory1/New() ..() new /obj/item/clothing/suit/armor/laserproof(src) - new /obj/item/clothing/suit/armor/riot(src) - new /obj/item/clothing/suit/armor/riot(src) - new /obj/item/clothing/suit/armor/riot(src) - new /obj/item/clothing/head/helmet/riot(src) - new /obj/item/clothing/head/helmet/riot(src) - new /obj/item/clothing/head/helmet/riot(src) - new /obj/item/weapon/shield/riot(src) - new /obj/item/weapon/shield/riot(src) - new /obj/item/weapon/shield/riot(src) - + for(var/i in 1 to 3) + new /obj/item/clothing/suit/armor/riot(src) + for(var/i in 1 to 3) + new /obj/item/clothing/head/helmet/riot(src) + for(var/i in 1 to 3) + new /obj/item/weapon/shield/riot(src) + /obj/structure/closet/secure_closet/armory2 name = "armory ballistics locker" req_access = list(access_armory) @@ -244,13 +237,11 @@ /obj/structure/closet/secure_closet/armory2/New() ..() new /obj/item/weapon/storage/box/firingpins(src) - new /obj/item/weapon/storage/box/rubbershot(src) - new /obj/item/weapon/storage/box/rubbershot(src) - new /obj/item/weapon/storage/box/rubbershot(src) - new /obj/item/weapon/gun/projectile/shotgun/riot(src) - new /obj/item/weapon/gun/projectile/shotgun/riot(src) - new /obj/item/weapon/gun/projectile/shotgun/riot(src) - + for(var/i in 1 to 3) + new /obj/item/weapon/storage/box/rubbershot(src) + for(var/i in 1 to 3) + new /obj/item/weapon/gun/projectile/shotgun/riot(src) + /obj/structure/closet/secure_closet/armory3 name = "armory energy gun locker" req_access = list(access_armory) @@ -260,13 +251,11 @@ ..() new /obj/item/weapon/storage/box/firingpins(src) new /obj/item/weapon/gun/energy/ionrifle(src) - new /obj/item/weapon/gun/energy/gun(src) - new /obj/item/weapon/gun/energy/gun(src) - new /obj/item/weapon/gun/energy/gun(src) - new /obj/item/weapon/gun/energy/laser(src) - new /obj/item/weapon/gun/energy/laser(src) - new /obj/item/weapon/gun/energy/laser(src) - + for(var/i in 1 to 3) + new /obj/item/weapon/gun/energy/gun(src) + for(var/i in 1 to 3) + new /obj/item/weapon/gun/energy/laser(src) + /obj/structure/closet/secure_closet/tac name = "armory tac locker" req_access = list(access_armory) @@ -286,6 +275,5 @@ /obj/structure/closet/secure_closet/lethalshots/New() ..() - new /obj/item/weapon/storage/box/lethalshot(src) - new /obj/item/weapon/storage/box/lethalshot(src) - new /obj/item/weapon/storage/box/lethalshot(src) + for(var/i in 1 to 3) + new /obj/item/weapon/storage/box/lethalshot(src) diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index 792d5b167b3..55ea7578571 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -23,19 +23,13 @@ /obj/structure/closet/syndicate/nuclear/New() ..() contents = list() - new /obj/item/ammo_box/magazine/m10mm(src) - new /obj/item/ammo_box/magazine/m10mm(src) - new /obj/item/ammo_box/magazine/m10mm(src) - new /obj/item/ammo_box/magazine/m10mm(src) - new /obj/item/ammo_box/magazine/m10mm(src) + for(var/i in 1 to 5) + new /obj/item/ammo_box/magazine/m10mm(src) new /obj/item/weapon/storage/box/flashbangs(src) new /obj/item/weapon/storage/box/teargas(src) new /obj/item/weapon/storage/backpack/dufflebag/syndie/med(src) - new /obj/item/weapon/pinpointer/nukeop(src) - new /obj/item/weapon/pinpointer/nukeop(src) - new /obj/item/weapon/pinpointer/nukeop(src) - new /obj/item/weapon/pinpointer/nukeop(src) - new /obj/item/weapon/pinpointer/nukeop(src) + for(var/i in 1 to 5) + new /obj/item/weapon/pinpointer/nukeop(src) new /obj/item/device/pda/syndicate(src) return diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index 064256f8f10..edc5b8d1dca 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -174,11 +174,5 @@ /obj/structure/closet/ammunitionlocker/New() ..() - new /obj/item/ammo_casing/shotgun/beanbag(src) - new /obj/item/ammo_casing/shotgun/beanbag(src) - new /obj/item/ammo_casing/shotgun/beanbag(src) - new /obj/item/ammo_casing/shotgun/beanbag(src) - new /obj/item/ammo_casing/shotgun/beanbag(src) - new /obj/item/ammo_casing/shotgun/beanbag(src) - new /obj/item/ammo_casing/shotgun/beanbag(src) - new /obj/item/ammo_casing/shotgun/beanbag(src) + for(var/i in 1 to 8) + new /obj/item/ammo_casing/shotgun/beanbag(src) diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 68c5a8c32d7..489defcdf07 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -5,12 +5,10 @@ /obj/structure/closet/wardrobe/New() ..() - new /obj/item/clothing/under/color/blue(src) - new /obj/item/clothing/under/color/blue(src) - new /obj/item/clothing/under/color/blue(src) - new /obj/item/clothing/shoes/sneakers/brown(src) - new /obj/item/clothing/shoes/sneakers/brown(src) - new /obj/item/clothing/shoes/sneakers/brown(src) + for(var/i in 1 to 3) + new /obj/item/clothing/under/color/blue(src) + for(var/i in 1 to 3) + new /obj/item/clothing/shoes/sneakers/brown(src) return /obj/structure/closet/wardrobe/pink @@ -20,12 +18,10 @@ /obj/structure/closet/wardrobe/pink/New() ..() contents = list() - new /obj/item/clothing/under/color/pink(src) - new /obj/item/clothing/under/color/pink(src) - new /obj/item/clothing/under/color/pink(src) - new /obj/item/clothing/shoes/sneakers/brown(src) - new /obj/item/clothing/shoes/sneakers/brown(src) - new /obj/item/clothing/shoes/sneakers/brown(src) + for(var/i in 1 to 3) + new /obj/item/clothing/under/color/pink(src) + for(var/i in 1 to 3) + new /obj/item/clothing/shoes/sneakers/brown(src) return /obj/structure/closet/wardrobe/black @@ -35,22 +31,18 @@ /obj/structure/closet/wardrobe/black/New() ..() contents = list() - new /obj/item/clothing/under/color/black(src) - new /obj/item/clothing/under/color/black(src) - new /obj/item/clothing/under/color/black(src) + for(var/i in 1 to 3) + new /obj/item/clothing/under/color/black(src) if(prob(25)) new /obj/item/clothing/suit/jacket/leather(src) if(prob(20)) new /obj/item/clothing/suit/jacket/leather/overcoat(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/clothing/head/that(src) - new /obj/item/clothing/head/that(src) - new /obj/item/clothing/head/that(src) - new /obj/item/clothing/head/soft/black(src) - new /obj/item/clothing/head/soft/black(src) - new /obj/item/clothing/head/soft/black(src) + for(var/i in 1 to 3) + new /obj/item/clothing/shoes/sneakers/black(src) + for(var/i in 1 to 3) + new /obj/item/clothing/head/that(src) + for(var/i in 1 to 3) + new /obj/item/clothing/head/soft/black(src) new /obj/item/clothing/mask/bandana/black(src) new /obj/item/clothing/mask/bandana/black(src) if(prob(40)) @@ -65,12 +57,10 @@ /obj/structure/closet/wardrobe/green/New() ..() contents = list() - new /obj/item/clothing/under/color/green(src) - new /obj/item/clothing/under/color/green(src) - new /obj/item/clothing/under/color/green(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/clothing/shoes/sneakers/black(src) + for(var/i in 1 to 3) + new /obj/item/clothing/under/color/green(src) + for(var/i in 1 to 3) + new /obj/item/clothing/shoes/sneakers/black(src) new /obj/item/clothing/mask/bandana/green(src) new /obj/item/clothing/mask/bandana/green(src) return @@ -84,12 +74,10 @@ /obj/structure/closet/wardrobe/orange/New() ..() contents = list() - new /obj/item/clothing/under/rank/prisoner(src) - new /obj/item/clothing/under/rank/prisoner(src) - new /obj/item/clothing/under/rank/prisoner(src) - new /obj/item/clothing/shoes/sneakers/orange(src) - new /obj/item/clothing/shoes/sneakers/orange(src) - new /obj/item/clothing/shoes/sneakers/orange(src) + for(var/i in 1 to 3) + new /obj/item/clothing/under/rank/prisoner(src) + for(var/i in 1 to 3) + new /obj/item/clothing/shoes/sneakers/orange(src) return @@ -100,12 +88,10 @@ /obj/structure/closet/wardrobe/yellow/New() ..() contents = list() - new /obj/item/clothing/under/color/yellow(src) - new /obj/item/clothing/under/color/yellow(src) - new /obj/item/clothing/under/color/yellow(src) - new /obj/item/clothing/shoes/sneakers/orange(src) - new /obj/item/clothing/shoes/sneakers/orange(src) - new /obj/item/clothing/shoes/sneakers/orange(src) + for(var/i in 1 to 3) + new /obj/item/clothing/under/color/yellow(src) + for(var/i in 1 to 3) + new /obj/item/clothing/shoes/sneakers/orange(src) new /obj/item/clothing/mask/bandana/gold(src) new /obj/item/clothing/mask/bandana/gold(src) return @@ -118,15 +104,12 @@ /obj/structure/closet/wardrobe/white/New() ..() contents = list() - new /obj/item/clothing/under/color/white(src) - new /obj/item/clothing/under/color/white(src) - new /obj/item/clothing/under/color/white(src) - new /obj/item/clothing/shoes/sneakers/white(src) - new /obj/item/clothing/shoes/sneakers/white(src) - new /obj/item/clothing/shoes/sneakers/white(src) - new /obj/item/clothing/head/soft/mime(src) - new /obj/item/clothing/head/soft/mime(src) - new /obj/item/clothing/head/soft/mime(src) + for(var/i in 1 to 3) + new /obj/item/clothing/under/color/white(src) + for(var/i in 1 to 3) + new /obj/item/clothing/shoes/sneakers/white(src) + for(var/i in 1 to 3) + new /obj/item/clothing/head/soft/mime(src) return /obj/structure/closet/wardrobe/pjs @@ -140,10 +123,8 @@ new /obj/item/clothing/under/pj/red(src) new /obj/item/clothing/under/pj/blue(src) new /obj/item/clothing/under/pj/blue(src) - new /obj/item/clothing/shoes/sneakers/white(src) - new /obj/item/clothing/shoes/sneakers/white(src) - new /obj/item/clothing/shoes/sneakers/white(src) - new /obj/item/clothing/shoes/sneakers/white(src) + for(var/i in 1 to 4) + new /obj/item/clothing/shoes/sneakers/white(src) return @@ -154,15 +135,12 @@ /obj/structure/closet/wardrobe/grey/New() ..() contents = list() - new /obj/item/clothing/under/color/grey(src) - new /obj/item/clothing/under/color/grey(src) - new /obj/item/clothing/under/color/grey(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/clothing/head/soft/grey(src) - new /obj/item/clothing/head/soft/grey(src) - new /obj/item/clothing/head/soft/grey(src) + for(var/i in 1 to 3) + new /obj/item/clothing/under/color/grey(src) + for(var/i in 1 to 3) + new /obj/item/clothing/shoes/sneakers/black(src) + for(var/i in 1 to 3) + new /obj/item/clothing/head/soft/grey(src) if(prob(50)) new /obj/item/weapon/storage/backpack/dufflebag(src) if(prob(40)) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 73d79abbe06..90c267d2a2a 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -50,10 +50,8 @@ /obj/structure/closet/crate/rcd/New() ..() - new /obj/item/weapon/rcd_ammo(src) - new /obj/item/weapon/rcd_ammo(src) - new /obj/item/weapon/rcd_ammo(src) - new /obj/item/weapon/rcd_ammo(src) + for(var/i in 1 to 4) + new /obj/item/weapon/rcd_ammo(src) new /obj/item/weapon/rcd(src) /obj/structure/closet/crate/freezer @@ -90,15 +88,10 @@ /obj/structure/closet/crate/radiation/New() ..() - new /obj/item/clothing/suit/radiation(src) - new /obj/item/clothing/head/radiation(src) - new /obj/item/clothing/suit/radiation(src) - new /obj/item/clothing/head/radiation(src) - new /obj/item/clothing/suit/radiation(src) - new /obj/item/clothing/head/radiation(src) - new /obj/item/clothing/suit/radiation(src) - new /obj/item/clothing/head/radiation(src) - + for(var/i in 1 to 4) + new /obj/item/clothing/suit/radiation(src) + new /obj/item/clothing/head/radiation(src) + /obj/structure/closet/crate/hydroponics name = "hydroponics crate" desc = "All you need to destroy those pesky weeds and pests." diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 293f881747f..51f11e3b2f9 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -11,6 +11,7 @@ var/health = 10 var/destroyed = 0 var/obj/item/stack/rods/stored + level = 3 /obj/structure/grille/New() stored = new/obj/item/stack/rods(src) diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 521d01bfbec..175971ef2c6 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -23,10 +23,12 @@ /obj/structure/janitorialcart/proc/wet_mop(obj/item/weapon/mop, mob/user) if(reagents.total_volume < 1) user << "[src] is out of water!" + return 0 else - reagents.trans_to(mop, 5) // + reagents.trans_to(mop, 5) user << "You wet [mop] in [src]." playsound(loc, 'sound/effects/slosh.ogg', 25, 1) + return 1 /obj/structure/janitorialcart/proc/put_in_cart(obj/item/I, mob/user) if(!user.drop_item()) @@ -43,8 +45,8 @@ if(istype(I, /obj/item/weapon/mop)) var/obj/item/weapon/mop/m=I if(m.reagents.total_volume < m.reagents.maximum_volume) - wet_mop(m, user) - return + if (wet_mop(m, user)) + return if(!mymop) m.janicart_insert(user, src) else diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index b1b3d9994bf..343cfb5d940 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -61,6 +61,7 @@ /obj/structure/mirror/attackby(obj/item/I, mob/living/user, params) + user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) if(I.damtype == STAMINA) return @@ -90,6 +91,7 @@ /obj/structure/mirror/attack_alien(mob/living/user) + user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) if(islarva(user)) return @@ -106,6 +108,7 @@ var/mob/living/simple_animal/M = user if(M.melee_damage_upper <= 0) return + user.changeNext_move(CLICK_CD_MELEE) M.do_attack_animation(src) if(shattered) playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) @@ -115,6 +118,7 @@ /obj/structure/mirror/attack_slime(mob/living/user) + user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) if(shattered) playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) @@ -246,4 +250,4 @@ if(new_eye_color) H.eye_color = sanitize_hexcolor(new_eye_color) H.dna.update_ui_block(DNA_EYE_COLOR_BLOCK) - H.update_body() \ No newline at end of file + H.update_body() diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 97687c2fa1f..cd8c190569e 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -180,7 +180,7 @@ var/global/list/crematoriums = new/list() update_icon() for(var/mob/living/M in contents) - if (M.stat!=2) + if (M.stat != DEAD) M.emote("scream") if(user) user.attack_log +="\[[time_stamp()]\] Cremated [M]/[M.ckey]" @@ -188,8 +188,9 @@ var/global/list/crematoriums = new/list() else log_attack("\[[time_stamp()]\] UNKNOWN cremated [M]/[M.ckey]") M.death(1) - M.ghostize() - qdel(M) + if(M) //some animals get automatically deleted on death. + M.ghostize() + qdel(M) for(var/obj/O in contents) //obj instead of obj/item so that bodybags and ashes get destroyed. We dont want tons and tons of ash piling up if(O != connected) //Creamtorium does not burn hot enough to destroy the tray diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index aaa115bbd1b..475383d8b2b 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -128,13 +128,12 @@ return for(var/obj/structure/transit_tube_pod/pod in loc) if(!pod.moving && turn(pod.dir, (reverse_launch ? 180 : 0)) in directions()) - spawn(0) - pod_moving = 1 - close_animation() - sleep(CLOSE_DURATION + 2) - if(icon_state == "closed" && pod) - pod.follow_tube(reverse_launch) - pod_moving = 0 + pod_moving = 1 + close_animation() + sleep(CLOSE_DURATION + 2) + if(icon_state == "closed" && pod) + pod.follow_tube(reverse_launch) + pod_moving = 0 return 1 return 0 diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index eb8962025e6..f2cd240656f 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -62,62 +62,63 @@ else return ..() /obj/structure/transit_tube_pod/proc/follow_tube(reverse_launch) + set waitfor = 0 if(moving) return moving = 1 - spawn() - var/obj/structure/transit_tube/current_tube = null - var/next_dir - var/next_loc - var/last_delay = 0 - var/exit_delay - if(reverse_launch) - dir = turn(dir, 180) // Back it up + var/obj/structure/transit_tube/current_tube = null + var/next_dir + var/next_loc + var/last_delay = 0 + var/exit_delay - for(var/obj/structure/transit_tube/tube in loc) - if(tube.has_exit(dir)) + if(reverse_launch) + dir = turn(dir, 180) // Back it up + + for(var/obj/structure/transit_tube/tube in loc) + if(tube.has_exit(dir)) + current_tube = tube + break + + while(current_tube) + next_dir = current_tube.get_exit(dir) + + if(!next_dir) + break + + exit_delay = current_tube.exit_delay(src, dir) + last_delay += exit_delay + + sleep(exit_delay) + + next_loc = get_step(loc, next_dir) + + current_tube = null + for(var/obj/structure/transit_tube/tube in next_loc) + if(tube.has_entrance(next_dir)) current_tube = tube break - while(current_tube) - next_dir = current_tube.get_exit(dir) - - if(!next_dir) - break - - exit_delay = current_tube.exit_delay(src, dir) - last_delay += exit_delay - - sleep(exit_delay) - - next_loc = get_step(loc, next_dir) - - current_tube = null - for(var/obj/structure/transit_tube/tube in next_loc) - if(tube.has_entrance(next_dir)) - current_tube = tube - break - - if(current_tube == null) - dir = next_dir - Move(get_step(loc, dir), dir) // Allow collisions when leaving the tubes. - break - - last_delay = current_tube.enter_delay(src, next_dir) - sleep(last_delay) + if(current_tube == null) dir = next_dir - loc = next_loc // When moving from one tube to another, skip collision and such. - density = current_tube.density + Move(get_step(loc, dir), dir) // Allow collisions when leaving the tubes. + break - if(current_tube && current_tube.should_stop_pod(src, next_dir)) - current_tube.pod_stopped(src, dir) - break + last_delay = current_tube.enter_delay(src, next_dir) + sleep(last_delay) + dir = next_dir + loc = next_loc // When moving from one tube to another, skip collision and such. + density = current_tube.density - density = 1 - moving = 0 + if(current_tube && current_tube.should_stop_pod(src, next_dir)) + current_tube.pod_stopped(src, dir) + break + + density = 1 + moving = 0 // Should I return a copy here? If the caller edits or del()s the returned diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 0e995f815f0..63a85afa005 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -205,6 +205,7 @@ health = maxhealth playsound(loc, 'sound/items/Welder2.ogg', 50, 1) update_nearby_icons() + user << "You repair [src]." else user << "[src] is already in good condition!" return @@ -474,6 +475,7 @@ fulltile = 1 smooth = SMOOTH_TRUE canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile) + level = 3 /obj/structure/window/reinforced/tinted/fulltile icon = 'icons/obj/smooth_structures/tinted_window.dmi' @@ -482,12 +484,14 @@ fulltile = 1 smooth = SMOOTH_TRUE canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile/) + level = 3 /obj/structure/window/reinforced/fulltile/ice icon = 'icons/obj/smooth_structures/rice_window.dmi' icon_state = "ice_window" maxhealth = 150 canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/reinforced/fulltile/ice) + level = 3 /obj/structure/window/shuttle name = "shuttle window" @@ -502,3 +506,4 @@ smooth = SMOOTH_TRUE canSmoothWith = null explosion_block = 1 + level = 3 diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index d49d0ca0a33..06f9ce5d1f6 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -60,3 +60,16 @@ /turf/simulated/ChangeTurf(var/path) . = ..() smooth_icon_neighbors(src) + +/turf/simulated/proc/is_shielded() + +/turf/simulated/contents_explosion(severity, target) + var/affecting_level + if(severity == 1) + affecting_level = 1 + else + affecting_level = is_shielded() ? 2 : (intact ? 2 : 1) + for(var/V in contents) + var/atom/A = V + if(A.level >= affecting_level) + A.ex_act(severity, target) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 3a5e694d904..6ead73f0cae 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -49,11 +49,14 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," /turf/simulated/floor/ex_act(severity, target) ..() + if(is_shielded()) + return if(target == src) src.ChangeTurf(src.baseturf) if(target != null) ex_act(3) return + switch(severity) if(1) src.ChangeTurf(src.baseturf) @@ -75,7 +78,11 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," if (prob(50)) src.break_tile() src.hotspot_expose(1000,CELL_VOLUME) - return + +/turf/simulated/floor/is_shielded() + for(var/obj/structure/A in contents) + if(A.level == 3) + return 1 /turf/simulated/floor/blob_act() return @@ -169,4 +176,4 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," ChangeTurf(/turf/simulated/floor/engine/cult) /turf/simulated/floor/can_have_cabling() - return !burnt & !broken + return !burnt && !broken diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index 74a8646f323..1373a0501de 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -192,30 +192,34 @@ SSobj.processing |= src /turf/simulated/floor/plating/lava/process() - if(!contents) + if(!burn_stuff()) processing = 0 SSobj.processing.Remove(src) - return - burn_stuff() + /turf/simulated/floor/plating/lava/proc/burn_stuff() - for(var/atom/movable/AM in contents) - if(!istype(AM)) - return - if(istype(AM, /obj)) - var/obj/O = AM + . = 0 + for(var/thing in contents) + if(istype(thing, /obj)) + var/obj/O = thing if(istype(O, /obj/effect/decal/cleanable/ash)) //So we don't get stuck burning the same ash pile forever qdel(O) - return + continue + . = 1 if(O.burn_state == FIRE_PROOF) O.burn_state = FLAMMABLE //Even fireproof things burn up in lava + O.fire_act() - else if (istype(AM, /mob/living)) - var/mob/living/L = AM + + + else if (istype(thing, /mob/living)) + . = 1 + var/mob/living/L = thing L.adjustFireLoss(20) if(L) //mobs turning into object corpses could get deleted here. L.adjust_fire_stacks(20) L.IgniteMob() + /turf/simulated/floor/plating/lava/attackby(obj/item/C, mob/user, params) //Lava isn't a good foundation to build on return @@ -240,4 +244,4 @@ /turf/simulated/floor/plating/lava/smooth/airless oxygen = 0 nitrogen = 0 - temperature = TCMB \ No newline at end of file + temperature = TCMB diff --git a/code/game/turfs/simulated/river.dm b/code/game/turfs/simulated/river.dm new file mode 100644 index 00000000000..b602319fba6 --- /dev/null +++ b/code/game/turfs/simulated/river.dm @@ -0,0 +1,85 @@ +#define RANDOM_UPPER_X 200 +#define RANDOM_UPPER_Y 200 + +#define RANDOM_LOWER_X 50 +#define RANDOM_LOWER_Y 50 + +/proc/spawn_rivers(target_z = 5, nodes = 4, turf_type = /turf/simulated/floor/plating/lava/smooth) + var/list/river_nodes = list() + var/num_spawned = 0 + while(num_spawned < nodes) + var/turf/simulated/F = locate(rand(RANDOM_LOWER_X, RANDOM_UPPER_X), rand(RANDOM_LOWER_Y, RANDOM_UPPER_Y), target_z) + + river_nodes += new /obj/effect/landmark/river_waypoint(F) + num_spawned++ + + //make some randomly pathing rivers + for(var/A in river_nodes) + var/obj/effect/landmark/river_waypoint/W = A + if (W.z != target_z || W.connected) + continue + W.connected = 1 + var/turf/cur_turf = get_turf(W) + cur_turf.ChangeTurf(turf_type) + var/turf/target_turf = get_turf(pick(river_nodes - W)) + if(!target_turf) + break + var/detouring = 0 + var/cur_dir = get_dir(cur_turf, target_turf) + while(cur_turf != target_turf) + + if(detouring) //randomly snake around a bit + if(prob(20)) + detouring = 0 + cur_dir = get_dir(cur_turf, target_turf) + else if(prob(20)) + detouring = 1 + if(prob(50)) + cur_dir = turn(cur_dir, 45) + else + cur_dir = turn(cur_dir, -45) + else + cur_dir = get_dir(cur_turf, target_turf) + + cur_turf = get_step(cur_turf, cur_dir) + + if(!istype(cur_turf, /turf/simulated/wall)) //Rivers will flow around walls + var/turf/simulated/river_turf = cur_turf + river_turf.ChangeTurf(turf_type) + river_turf.Spread(30, 25) + else + detouring = 0 + cur_dir = get_dir(cur_turf, target_turf) + cur_turf = get_step(cur_turf, cur_dir) + continue + + + for(var/WP in river_nodes) + qdel(WP) + + +/obj/effect/landmark/river_waypoint + name = "river waypoint" + var/connected = 0 + invisibility = 101 + + +/turf/proc/Spread(probability = 30, prob_loss = 25) + if(probability <= 0) + return + + for(var/turf/simulated/F in orange(1, src)) + + var/turf/L = F + + L.ChangeTurf(src.type) + + if(L && prob(probability)) + L.Spread(probability - prob_loss) + + +#undef RANDOM_UPPER_X +#undef RANDOM_UPPER_Y + +#undef RANDOM_LOWER_X +#undef RANDOM_LOWER_Y diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 074a31dabc3..ccb24864770 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -8,6 +8,7 @@ density = 1 blocks_air = 1 explosion_block = 1 + layer = TURF_LAYER + 0.05 thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT heat_capacity = 312500 //a little over 5 cm thick , 312500 for 1 m by 2.5 m by 0.25 m plasteel wall diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index d08b9340d83..6f0f0890f2d 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -286,6 +286,7 @@ blocks_air = 1 opacity = 1 explosion_block = 50 + layer = TURF_LAYER + 0.05 /turf/indestructible/splashscreen name = "Space Station 13" diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index 735b00c6aac..a2612b46ee2 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -10,7 +10,7 @@ var/list/admin_ranks = list() //list of all admin_rank datums name = init_name switch(name) if("Removed",null,"") - spawn(-1) + spawn(0) qdel(src) throw EXCEPTION("invalid admin-rank name") return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 7c9dbc23474..d0dc7652b51 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -322,10 +322,12 @@ var/list/admin_verbs_hideable = list( if(istype(mob,/mob/dead/observer)) //re-enter var/mob/dead/observer/ghost = mob - if (!ghost.can_reenter_corpse) + if(!ghost.mind || !ghost.mind.current) //won't do anything if there is no body + return + if(!ghost.can_reenter_corpse) log_admin("[key_name(usr)] re-entered corpse") message_admins("[key_name_admin(usr)] re-entered corpse") - ghost.can_reenter_corpse = 1 //just in-case. + ghost.can_reenter_corpse = 1 //force re-entering even when otherwise not possible ghost.reenter_corpse() feedback_add_details("admin_verb","P") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! else if(istype(mob,/mob/new_player)) diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index abe7abcd91a..e7a0550b862 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -16,12 +16,12 @@ var/list/admin_datums = list() /datum/admins/New(datum/admin_rank/R, ckey) if(!ckey) - spawn(-1) + spawn(0) del(src) throw EXCEPTION("Admin datum created without a ckey") return if(!istype(R)) - spawn(-1) + spawn(0) del(src) throw EXCEPTION("Admin datum created without a rank") return diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index ff02ba635d7..a2e264f8c88 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -349,7 +349,8 @@ dat += "[M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""]" dat += "PM" else - dat += "Nuclear Operative not found!" + dat += "[N.name]([N.key]) Nuclear Operative Body destroyed!" + dat += "PM" dat += "
" for(var/obj/item/weapon/disk/nuclear/N in poi_list) dat += "" + dat += "" + dat += "" else dat += "" dat += "" @@ -388,7 +390,8 @@ var/turf/mob_loc = get_turf(M) dat += "" else - dat += "" + dat += "" + dat += "" dat += "
Nuclear Disk(s)
[N.name], " @@ -370,7 +371,8 @@ for(var/datum/mind/N in ticker.mode.head_revolutionaries) var/mob/M = N.current if(!M) - dat += "
Head Revolutionary not found!
[N.name]([N.key])Head Revolutionary body destroyed!PM
[M.real_name] (Leader)[M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""]PM
[mob_loc.loc]
Head not found!
[N.name]([N.key])Head body destroyed!PM
" for(var/datum/gang/G in ticker.mode.gangs) @@ -396,7 +399,8 @@ for(var/datum/mind/N in G.bosses) var/mob/M = N.current if(!M) - dat += "Gang Boss not found!" + dat += "[N.name]([N.key])Gang Boss body destroyed!" + dat += "PM" else dat += "[M.real_name] (Boss)[M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""]" dat += "PM" @@ -416,7 +420,8 @@ dat += "PM" dat += "Show Objective" else - dat += "Changeling not found!" + dat += "[changeling.name]([changeling.key])Changeling body destroyed!" + dat += "PM" dat += "" if(ticker.mode.wizards.len > 0) @@ -428,7 +433,8 @@ dat += "PM" dat += "Show Objective" else - dat += "Wizard not found!" + dat += "[wizard.name]([wizard.key])Wizard body destroyed!" + dat += "PM" dat += "" if(ticker.mode.apprentices.len > 0) @@ -440,7 +446,8 @@ dat += "PM" dat += "Show Objective" else - dat += "Apprentice not found!" + dat += "[apprentice.name]([apprentice.key])Apprentice body destroyed!!" + dat += "PM" dat += "" if(ticker.mode.cult.len) @@ -509,7 +516,8 @@ dat += "PM" dat += "Show Objective" else - dat += "Traitor not found!" + dat += "[traitor.name]([traitor.key])Traitor body destroyed!" + dat += "PM" dat += "" if(ticker.mode.shadows.len) @@ -519,6 +527,9 @@ if(M) dat += "[M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""]" dat += "PM" + else + dat += "[N.name]([N.key])Shadowling body destroyed!" + dat += "PM" dat += "" if(ticker.mode.thralls.len) @@ -539,7 +550,8 @@ dat += "PM" dat += "Show Objective" else - dat += "Abductor not found!" + dat += "[abductor.name]([abductor.key])Abductor body destroyed!" + dat += "PM" dat += "" dat += "
" for(var/obj/machinery/abductor/experiment/E in machines) @@ -550,7 +562,8 @@ dat += "" dat += "" else - dat += "" + dat += "" + dat += "" dat += "
Abductees
PMShow Objective
Abductee not found!
[abductee.name]([abductee.key])Abductee body destroyed!PM
" var/list/blob_minds = list() @@ -568,9 +581,10 @@ var/mob/M = blob.current if(M) dat += "[M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""]" - dat += "PM" + dat += "PM" else - dat += "Blob not found!" + dat += "[blob.name]([blob.key])Blob not found!" + dat += "PM" dat += "" @@ -584,7 +598,8 @@ dat += "[M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""]" dat += "PM" else - dat += "Monkey not found!" + dat += "[eek.name]([eek.key])Monkey not found!" + dat += "PM" dat += "" diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 8c42eb8261b..1bb4ef16a40 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2039,7 +2039,7 @@ else if(href_list["check_antagonist"]) if(!check_rights(R_ADMIN)) return - check_antagonists() + usr.client.check_antagonists() else if(href_list["kick_all_from_lobby"]) if(!check_rights(R_ADMIN)) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 991ebb36886..5ab2eb7e142 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -93,14 +93,11 @@ for(var/datum/d in objs) for(var/v in call_list) - // To stop any procs which sleep from executing slowly. - if(d) - if(hascall(d, v)) - spawn() call(d, v)(arglist(args_list)) // Spawn in case the function sleeps. + SDQL_callproc(d, v, args_list) if("delete") for(var/datum/d in objs) - del d + qdel(d) if("select") var/text = "" @@ -147,6 +144,10 @@ +/proc/SDQL_callproc(thing, procname, args_list) + set waitfor = 0 + if(hascall(thing, procname)) + call(thing, procname)(arglist(args_list)) /proc/SDQL_parse(list/query_list) var/datum/SDQL_parser/parser = new() diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 0067ad3cd22..1e99c5a4ea0 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -28,72 +28,78 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that /client/proc/callproc() set category = "Debug" set name = "Advanced ProcCall" + set waitfor = 0 if(!check_rights(R_DEBUG)) return - spawn(0) - var/target = null - var/targetselected = 0 - var/returnval = null - var/class = null + var/target = null + var/targetselected = 0 + var/returnval = null + var/class = null - switch(alert("Proc owned by something?",,"Yes","No")) - if("Yes") - targetselected = 1 - if(src.holder && src.holder.marked_datum) - class = input("Proc owned by...","Owner",null) as null|anything in list("Obj","Mob","Area or Turf","Client","Marked datum ([holder.marked_datum.type])") - if(class == "Marked datum ([holder.marked_datum.type])") - class = "Marked datum" + switch(alert("Proc owned by something?",,"Yes","No")) + if("Yes") + targetselected = 1 + if(src.holder && src.holder.marked_datum) + class = input("Proc owned by...","Owner",null) as null|anything in list("Obj","Mob","Area or Turf","Client","Marked datum ([holder.marked_datum.type])") + if(class == "Marked datum ([holder.marked_datum.type])") + class = "Marked datum" + else + class = input("Proc owned by...","Owner",null) as null|anything in list("Obj","Mob","Area or Turf","Client") + switch(class) + if("Obj") + target = input("Enter target:","Target",usr) as obj in world + if("Mob") + target = input("Enter target:","Target",usr) as mob in world + if("Area or Turf") + target = input("Enter target:","Target",usr.loc) as area|turf in world + if("Client") + var/list/keys = list() + for(var/client/C) + keys += C + target = input("Please, select a player!", "Selection", null, null) as null|anything in keys + if("Marked datum") + target = holder.marked_datum else - class = input("Proc owned by...","Owner",null) as null|anything in list("Obj","Mob","Area or Turf","Client") - switch(class) - if("Obj") - target = input("Enter target:","Target",usr) as obj in world - if("Mob") - target = input("Enter target:","Target",usr) as mob in world - if("Area or Turf") - target = input("Enter target:","Target",usr.loc) as area|turf in world - if("Client") - var/list/keys = list() - for(var/client/C) - keys += C - target = input("Please, select a player!", "Selection", null, null) as null|anything in keys - if("Marked datum") - target = holder.marked_datum - else - return - if("No") - target = null - targetselected = 0 + return + if("No") + target = null + targetselected = 0 - var/procname = input("Proc path, eg: /proc/fake_blood","Path:", null) as text|null - if(!procname) return - if(targetselected && !hascall(target,procname)) - usr << "Error: callproc(): target has no such call [procname]." + var/procname = input("Proc path, eg: /proc/fake_blood","Path:", null) as text|null + if(!procname) return + if(targetselected && !hascall(target,procname)) + usr << "Error: callproc(): target has no such call [procname]." + return + else + var/procpath = text2path(procname) + if (!procpath) + usr << "Error: callproc(): proc [procname] does not exist. (Did you forget the /proc/ part?)" return - var/list/lst = get_callproc_args() - if(!lst) + var/list/lst = get_callproc_args() + if(!lst) + return + + if(targetselected) + if(!target) + usr << "Error: callproc(): owner of proc no longer exists." return + log_admin("[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") + message_admins("[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") + returnval = call(target,procname)(arglist(lst)) // Pass the lst as an argument list to the proc + else + //this currently has no hascall protection. wasn't able to get it working. + log_admin("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") + message_admins("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") + returnval = call(procname)(arglist(lst)) // Pass the lst as an argument list to the proc - if(targetselected) - if(!target) - usr << "Error: callproc(): owner of proc no longer exists." - return - log_admin("[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") - message_admins("[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") - returnval = call(target,procname)(arglist(lst)) // Pass the lst as an argument list to the proc - else - //this currently has no hascall protection. wasn't able to get it working. - log_admin("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") - message_admins("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") - returnval = call(procname)(arglist(lst)) // Pass the lst as an argument list to the proc - - usr << "[procname] returned: [returnval ? returnval : "null"]" - feedback_add_details("admin_verb","APC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + usr << "[procname] returned: [returnval ? returnval : "null"]" + feedback_add_details("admin_verb","APC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/callproc_datum(A as null|area|mob|obj|turf) set category = "Debug" set name = "Atom ProcCall" + set waitfor = 0 if(!check_rights(R_DEBUG)) return @@ -113,12 +119,13 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that return log_admin("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") message_admins("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") - spawn() - var/returnval = call(A,procname)(arglist(lst)) // Pass the lst as an argument list to the proc - usr << "[procname] returned: [returnval ? returnval : "null"]" - feedback_add_details("admin_verb","DPC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + var/returnval = call(A,procname)(arglist(lst)) // Pass the lst as an argument list to the proc + usr << "[procname] returned: [returnval ? returnval : "null"]" + + + /client/proc/get_callproc_args() var/argnum = input("Number of arguments","Number:",0) as num|null if(!argnum && (argnum!=0)) return @@ -194,7 +201,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(id in hardcoded_gases || env_gases[id][MOLES]) t+= "[env_gases[id][GAS_NAME]] : [env_gases[id][MOLES]]\n" - usr.show_message(t, 1) + usr << t feedback_add_details("admin_verb","ASL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_robotize(mob/M in mob_list) @@ -207,7 +214,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(istype(M, /mob/living/carbon/human)) log_admin("[key_name(src)] has robotized [M.key].") var/mob/living/carbon/human/H = M - spawn(10) + spawn(0) H.Robotize() else @@ -223,7 +230,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(istype(M, /mob/living/carbon/human)) log_admin("[key_name(src)] has blobized [M.key].") var/mob/living/carbon/human/H = M - spawn(10) + spawn(0) H.Blobize() else @@ -247,7 +254,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that return log_admin("[key_name(src)] has animalized [M.key].") - spawn(10) + spawn(0) M.Animalize() @@ -287,7 +294,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that return if(ishuman(M)) log_admin("[key_name(src)] has alienized [M.key].") - spawn(10) + spawn(0) M:Alienize() feedback_add_details("admin_verb","MKAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] made [key_name(M)] into an alien.") @@ -304,7 +311,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that return if(ishuman(M)) log_admin("[key_name(src)] has slimeized [M.key].") - spawn(10) + spawn(0) M:slimeize() feedback_add_details("admin_verb","MKMET") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] made [key_name(M)] into a slime.") diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index 88cd7f16394..d856e5b8577 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -10,8 +10,20 @@ ticker.mode.traitors += H.mind H.mind.special_role = "traitor" - add_objective(H.mind, /datum/objective/default/steal) - add_objective(H.mind, /datum/objective/escape_obj/hijack, 1) + var/datum/objective/steal/steal_objective = new + steal_objective.owner = H.mind + steal_objective.set_target(new /datum/objective_item/steal/nukedisc) + H.mind.objectives += steal_objective + + var/datum/objective/hijack/hijack_objective = new + hijack_objective.owner = H.mind + H.mind.objectives += hijack_objective + + H << "You are the traitor." + var/obj_count = 1 + for(var/datum/objective/OBJ in H.mind.objectives) + H << "Objective #[obj_count]: [OBJ.explanation_text]" + obj_count++ for (var/obj/item/I in H) if (istype(I, /obj/item/weapon/implant)) diff --git a/code/modules/assembly/doorcontrol.dm b/code/modules/assembly/doorcontrol.dm index 9e654648c2d..805acc631b1 100644 --- a/code/modules/assembly/doorcontrol.dm +++ b/code/modules/assembly/doorcontrol.dm @@ -76,7 +76,6 @@ if (M.id == src.id) spawn( 0 ) M.open() - return sleep(10) @@ -90,7 +89,6 @@ if (M.id == src.id) spawn( 0 ) M.close() - return sleep(10) cooldown = 0 diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm index febe545a30e..34c82ac8c6b 100644 --- a/code/modules/assembly/health.dm +++ b/code/modules/assembly/health.dm @@ -74,7 +74,7 @@ if(!secured) user.show_message("The [name] is unsecured!") return 0 - var/dat = text("Health Sensor [scanning?"On":"Off"]") + var/dat = "Health Sensor [scanning?"On":"Off"]" if(scanning && health_scan) dat += "
Health: [health_scan]" user << browse(dat, "window=hscan") diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index 53990197caa..bb355b97e67 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -56,7 +56,6 @@ cooldown = 2 spawn(10) process_cooldown() - return /obj/item/device/assembly/prox_sensor/process() @@ -71,15 +70,13 @@ /obj/item/device/assembly/prox_sensor/dropped() spawn(0) sense() - return - return /obj/item/device/assembly/prox_sensor/toggle_scan() if(!secured) return 0 scanning = !scanning update_icon() - return + /obj/item/device/assembly/prox_sensor/update_icon() diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 463abc6c5e4..ff0396423bc 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -17,7 +17,7 @@ ..() spawn(40) set_frequency(frequency) - return + /obj/item/device/assembly/signaler/Destroy() if(SSradio) diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index d6f2136eebc..a761abd4909 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -132,15 +132,15 @@ var/obj/machinery/gateway/centerstation/the_gateway = null //okay, here's the good teleporting stuff /obj/machinery/gateway/centerstation/Bumped(atom/movable/AM) - if(!ready) + if(!ready) return - if(!active) + if(!active) return - if(!awaygate || qdeleted(awaygate)) + if(!awaygate || qdeleted(awaygate)) return if(awaygate.calibrated) - AM.loc = get_step(awaygate.loc, SOUTH) + AM.forceMove(get_step(awaygate.loc, SOUTH)) AM.dir = SOUTH if (ismob(AM)) var/mob/M = AM @@ -150,7 +150,7 @@ var/obj/machinery/gateway/centerstation/the_gateway = null else var/obj/effect/landmark/dest = pick(awaydestinations) if(dest) - AM.loc = dest.loc + AM.forceMove(get_turf(dest)) AM.dir = SOUTH use_power(5000) return @@ -240,18 +240,18 @@ var/obj/machinery/gateway/centerstation/the_gateway = null /obj/machinery/gateway/centeraway/Bumped(atom/movable/AM) - if(!ready) + if(!ready) return - if(!active) + if(!active) return - if(!stationgate || qdeleted(stationgate)) + if(!stationgate || qdeleted(stationgate)) return if(istype(AM, /mob/living/carbon)) for(var/obj/item/weapon/implant/exile/E in AM)//Checking that there is an exile implant in the contents if(E.imp_in == AM)//Checking that it's actually implanted vs just in their pocket AM << "\black The station gate has detected your exile implant and is blocking your entry." return - AM.loc = get_step(stationgate.loc, SOUTH) + AM.forceMove(get_step(stationgate.loc, SOUTH)) AM.dir = SOUTH if (ismob(AM)) var/mob/M = AM diff --git a/code/modules/awaymissions/maploader/reader.dm b/code/modules/awaymissions/maploader/reader.dm index 49948de8598..a33123bbd7a 100644 --- a/code/modules/awaymissions/maploader/reader.dm +++ b/code/modules/awaymissions/maploader/reader.dm @@ -298,6 +298,10 @@ var/global/dmm_suite/preloader/_preloader = null else if(copytext(trim_right,1,2) == "'") trim_right = file(copytext(trim_right,2,length(trim_right))) + //Check for path + else if(ispath(text2path(trim_right))) + trim_right = text2path(trim_right) + to_return[trim_left] = trim_right else//simple var diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm index 5b43288d109..d6d72ba061f 100644 --- a/code/modules/awaymissions/mission_code/Academy.dm +++ b/code/modules/awaymissions/mission_code/Academy.dm @@ -1,31 +1,31 @@ //Academy Areas /area/awaymission/academy - name = "\improper Academy Asteroids" + name = "Academy Asteroids" icon_state = "away" /area/awaymission/academy/headmaster - name = "\improper Academy Fore Block" + name = "Academy Fore Block" icon_state = "away1" /area/awaymission/academy/classrooms - name = "\improper Academy Classroom Block" + name = "Academy Classroom Block" icon_state = "away2" /area/awaymission/academy/academyaft - name = "\improper Academy Ship Aft Block" + name = "Academy Ship Aft Block" icon_state = "away3" /area/awaymission/academy/academygate - name = "\improper Academy Gateway" + name = "Academy Gateway" icon_state = "away4" /area/awaymission/academy/academycellar - name = "\improper Academy Cellar" + name = "Academy Cellar" icon_state = "away4" /area/awaymission/academy/academyengine - name = "\improper Academy Engine" + name = "Academy Engine" icon_state = "away4" //Academy Items @@ -102,7 +102,7 @@ /obj/structure/academy_wizard_spawner/proc/summon_wizard() var/turf/T = src.loc - + var/mob/living/carbon/human/wizbody = new(T) wizbody.equipOutfit(/datum/outfit/wizard/academy) var/obj/item/weapon/implant/exile/Implant = new/obj/item/weapon/implant/exile(wizbody) @@ -110,7 +110,7 @@ wizbody.faction |= "wizard" wizbody.real_name = "Academy Teacher" wizbody.name = "Academy Teacher" - + var/datum/mind/wizmind = new /datum/mind() wizmind.name = "Wizard Defender" wizmind.special_role = "Academy Defender" @@ -118,13 +118,13 @@ wizmind.objectives += O wizmind.transfer_to(wizbody) ticker.mode.wizards |= wizmind - + wizmind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt) wizmind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile) wizmind.AddSpell(new /obj/effect/proc_holder/spell/dumbfire/fireball) current_wizard = wizbody - + give_control() /obj/structure/academy_wizard_spawner/proc/update_status() diff --git a/code/modules/awaymissions/mission_code/blackmarketpackers.dm b/code/modules/awaymissions/mission_code/blackmarketpackers.dm index b6496fe4718..1b6ffd1d0bf 100644 --- a/code/modules/awaymissions/mission_code/blackmarketpackers.dm +++ b/code/modules/awaymissions/mission_code/blackmarketpackers.dm @@ -1,22 +1,22 @@ //Packer Ship Areas /area/awaymission/BMPship - name = "\improper BMP Asteroids" + name = "BMP Asteroids" icon_state = "away" luminosity = 0 /area/awaymission/BMPship/Aft - name = "\improper Aft Block" + name = "Aft Block" icon_state = "away1" requires_power = 1 /area/awaymission/BMPship/Midship - name = "\improper Midship Block" + name = "Midship Block" icon_state = "away2" requires_power = 1 /area/awaymission/BMPship/Fore - name = "\improper Fore Block" + name = "Fore Block" icon_state = "away3" requires_power = 1 \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/challenge.dm b/code/modules/awaymissions/mission_code/challenge.dm index 1625b3da847..724dcf434e3 100644 --- a/code/modules/awaymissions/mission_code/challenge.dm +++ b/code/modules/awaymissions/mission_code/challenge.dm @@ -5,7 +5,7 @@ icon_state = "away" /area/awaymission/challenge/main - name = "\improper Danger Room" + name = "Danger Room" icon_state = "away1" requires_power = 0 diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index cb9dcad479f..f93f77882fd 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -1,37 +1,37 @@ //Snow Valley Areas//-- /area/awaymission/snowdin - name = "\improper Snowdin Tundra Plains" + name = "Snowdin Tundra Plains" icon_state = "away" requires_power = 0 luminosity = 1 lighting_use_dynamic = DYNAMIC_LIGHTING_ENABLED /area/awaymission/snowdin/post - name = "\improper Snowdin Outpost" + name = "Snowdin Outpost" requires_power = 1 /area/awaymission/snowdin/igloo - name = "\improper Snowdin Igloos" + name = "Snowdin Igloos" icon_state = "away2" /area/awaymission/snowdin/cave - name = "\improper Snowdin Caves" + name = "Snowdin Caves" icon_state = "away2" luminosity = 0 /area/awaymission/snowdin/base - name = "\improper Snowdin Main Base" + name = "Snowdin Main Base" icon_state = "away3" requires_power = 1 /area/awaymission/snowdin/dungeon1 - name = "\improper Snowdin Depths" + name = "Snowdin Depths" icon_state = "away2" luminosity = 0 /area/awaymission/snowdin/sekret - name = "\improper Snowdin Operations" + name = "Snowdin Operations" icon_state = "away3" requires_power = 1 @@ -168,7 +168,6 @@ obj/item/weapon/paper/crumpled/snowdin/shovel /obj/item/weapon/twohanded/dualsaber = 15, /obj/item/organ/internal/heart/demon = 7, /obj/item/weapon/gun/projectile/automatic/c20r/unrestricted = 16, - /obj/item/weapon/teleportation_scroll = 5, /obj/item/weapon/dice/d20/fate = 4, /obj/item/weapon/gun/magic/wand/resurrection/inert = 15, /obj/item/weapon/gun/magic/wand/resurrection = 10, diff --git a/code/modules/awaymissions/mission_code/spacebattle.dm b/code/modules/awaymissions/mission_code/spacebattle.dm index 9b9a70d220a..b8906c8011d 100644 --- a/code/modules/awaymissions/mission_code/spacebattle.dm +++ b/code/modules/awaymissions/mission_code/spacebattle.dm @@ -1,33 +1,33 @@ //Spacebattle Areas /area/awaymission/spacebattle - name = "\improper Space Battle" + name = "Space Battle" icon_state = "away" requires_power = 0 /area/awaymission/spacebattle/cruiser - name = "\improper Nanotrasen Cruiser" + name = "Nanotrasen Cruiser" /area/awaymission/spacebattle/syndicate1 - name = "\improper Syndicate Assault Ship 1" + name = "Syndicate Assault Ship 1" /area/awaymission/spacebattle/syndicate2 - name = "\improper Syndicate Assault Ship 2" + name = "Syndicate Assault Ship 2" /area/awaymission/spacebattle/syndicate3 - name = "\improper Syndicate Assault Ship 3" + name = "Syndicate Assault Ship 3" /area/awaymission/spacebattle/syndicate4 - name = "\improper Syndicate War Sphere 1" + name = "Syndicate War Sphere 1" /area/awaymission/spacebattle/syndicate5 - name = "\improper Syndicate War Sphere 2" + name = "Syndicate War Sphere 2" /area/awaymission/spacebattle/syndicate6 - name = "\improper Syndicate War Sphere 3" + name = "Syndicate War Sphere 3" /area/awaymission/spacebattle/syndicate7 - name = "\improper Syndicate Fighter" + name = "Syndicate Fighter" /area/awaymission/spacebattle/secret - name = "\improper Hidden Chamber" \ No newline at end of file + name = "Hidden Chamber" \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index dc2cdd22470..5b9153cbd2c 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -7,30 +7,30 @@ //Wild West Areas /area/awaymission/wwmines - name = "\improper Wild West Mines" + name = "Wild West Mines" icon_state = "away1" luminosity = 1 requires_power = 0 /area/awaymission/wwgov - name = "\improper Wild West Mansion" + name = "Wild West Mansion" icon_state = "away2" luminosity = 1 requires_power = 0 /area/awaymission/wwrefine - name = "\improper Wild West Refinery" + name = "Wild West Refinery" icon_state = "away3" luminosity = 1 requires_power = 0 /area/awaymission/wwvault - name = "\improper Wild West Vault" + name = "Wild West Vault" icon_state = "away3" luminosity = 0 /area/awaymission/wwvaultdoors - name = "\improper Wild West Vault Doors" // this is to keep the vault area being entirely lit because of requires_power + name = "Wild West Vault Doors" // this is to keep the vault area being entirely lit because of requires_power icon_state = "away2" requires_power = 0 luminosity = 0 @@ -96,8 +96,14 @@ user << "The Wish Granter punishes you for your wickedness, claiming your soul and warping your body to match the darkness in your heart." ticker.mode.traitors += user.mind user.mind.special_role = "traitor" - add_objective(user.mind, /datum/objective/escape_obj/hijack, 1) + var/datum/objective/hijack/hijack = new + hijack.owner = user.mind + user.mind.objectives += hijack user << "Your inhibitions are swept away, the bonds of loyalty broken, you are free to murder as you please!" + var/obj_count = 1 + for(var/datum/objective/OBJ in user.mind.objectives) + user << "Objective #[obj_count]: [OBJ.explanation_text]" + obj_count++ user.set_species(/datum/species/shadow) if("Peace") user << "Whatever alien sentience that the Wish Granter possesses is satisfied with your wish. There is a distant wailing as the last of the Faithless begin to die, then silence." diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index 4219bafe595..eb284af8c41 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -34,6 +34,7 @@ var/global/list/potentialSpaceRuins = generateMapList(filename = "config/spaceRu world << "Away mission loaded." + SortAreas() //To add recently loaded areas else world << "No away missions found." return diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 6e73a0bfd97..9928eea9eda 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -131,7 +131,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the if (register_asset) register_asset(file,files[file]) send_asset(client,file) - sleep(-1) //queuing calls like this too quickly can cause issues in some client versions + sleep(0) //queuing calls like this too quickly can cause issues in some client versions //This proc "registers" an asset, it adds it to the cache for further use, you cannot touch it from this point on or you'll fuck things up. //if it's an icon or something be careful, you'll have to copy it before further use. diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 73b99c574ad..6fd6d507597 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -35,10 +35,6 @@ return cmd_admin_pm(href_list["priv_msg"],null) return - // NanoUI - if(href_list["nano_error"]) - src << href_list["nano_error"] - throw EXCEPTION("NanoUI: [href_list["nano_error"]]") //Logs all hrefs if(config && config.log_hrefs && href_logfile) @@ -334,6 +330,6 @@ var/next_external_rsc = 0 'html/browser/scannernew.css', 'html/browser/playeroptions.css', ) - spawn (10) + spawn (10) //removing this spawn causes all clients to not get verbs. //Precache the client with all other assets slowly, so as to not block other browse() calls getFilesSlow(src, SSasset.cache, register_asset = FALSE) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 2fdb79069e3..ef4359a5861 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -28,6 +28,7 @@ var/list/preferences_datums = list() var/UI_style = "Midnight" var/tgui_fancy = TRUE + var/tgui_lock = TRUE var/toggles = TOGGLES_DEFAULT var/chat_toggles = TOGGLES_DEFAULT_CHAT var/ghost_form = "ghost" @@ -326,6 +327,7 @@ var/list/preferences_datums = list() dat += "

General Settings

" dat += "UI Style: [UI_style]
" dat += "tgui Style: [(tgui_fancy) ? "Fancy" : "No Frills"]
" + dat += "tgui Monitors: [(tgui_lock) ? "Primary" : "All"]
" dat += "Play admin midis: [(toggles & SOUND_MIDI) ? "Yes" : "No"]
" dat += "Play lobby music: [(toggles & SOUND_LOBBY) ? "Yes" : "No"]
" dat += "Ghost ears: [(chat_toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]
" @@ -1008,11 +1010,17 @@ var/list/preferences_datums = list() UI_style = "Plasmafire" if("Plasmafire") UI_style = "Retro" + if("Retro") + UI_style = "Slimecore" + if("Slimecore") + UI_style = "Operative" else UI_style = "Midnight" if("tgui_fancy") tgui_fancy = !tgui_fancy + if("tgui_lock") + tgui_lock = !tgui_lock if("hear_adminhelps") toggles ^= SOUND_ADMINHELP diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 4971819a84e..0b0245f4a41 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -165,6 +165,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["lastchangelog"] >> lastchangelog S["UI_style"] >> UI_style S["tgui_fancy"] >> tgui_fancy + S["tgui_lock"] >> tgui_lock if(islist(S["be_special"])) S["be_special"] >> be_special @@ -190,8 +191,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Sanitize ooccolor = sanitize_ooccolor(sanitize_hexcolor(ooccolor, 6, 1, initial(ooccolor))) lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog)) - UI_style = sanitize_inlist(UI_style, list("Midnight", "Plasmafire", "Retro"), initial(UI_style)) + UI_style = sanitize_inlist(UI_style, list("Midnight", "Plasmafire", "Retro", "Slimecore", "Operative"), initial(UI_style)) tgui_fancy = sanitize_integer(tgui_fancy, 0, 1, initial(tgui_fancy)) + tgui_lock = sanitize_integer(tgui_lock, 0, 1, initial(tgui_lock)) default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot)) toggles = sanitize_integer(toggles, 0, 65535, initial(toggles)) ghost_form = sanitize_inlist(ghost_form, ghost_forms, initial(ghost_form)) @@ -212,6 +214,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["lastchangelog"] << lastchangelog S["UI_style"] << UI_style S["tgui_fancy"] << tgui_fancy + S["tgui_lock"] << tgui_lock S["be_special"] << be_special S["default_slot"] << default_slot S["toggles"] << toggles diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 139f4812fec..88dd4e7d113 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -13,7 +13,7 @@ var/obj/item/clothing/suit/space/hardsuit/suit item_color = "engineering" //Determines used sprites: hardsuit[on]-[color] and hardsuit[on]-[color]2 (lying down sprite) action_button_name = "Toggle Helmet Light" - flags = BLOCKHAIR | STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP + flags = BLOCKHAIR | STOPSPRESSUREDMAGE | THICKMATERIAL flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH @@ -38,6 +38,15 @@ if(on) user.AddLuminosity(-brightness_on) SetLuminosity(brightness_on) + if(suit) + suit.RemoveHelmet() + +/obj/item/clothing/head/helmet/space/hardsuit/equipped(mob/user, slot) + if(slot != slot_head) + if(suit) + suit.RemoveHelmet() + else + qdel(src) /obj/item/clothing/head/helmet/space/hardsuit/proc/display_visor_message(var/msg) var/mob/wearer = loc @@ -178,7 +187,7 @@ on = 0 var/obj/item/clothing/suit/space/hardsuit/syndi/linkedsuit = null action_button_name = "Toggle Helmet Mode" - flags = BLOCKHAIR | STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP + flags = BLOCKHAIR | STOPSPRESSUREDMAGE | THICKMATERIAL flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH /obj/item/clothing/head/helmet/space/hardsuit/syndi/update_icon() @@ -457,7 +466,7 @@ var/datum/effect_system/spark_spread/s = new s.set_up(2, 1, src) s.start() - owner.visible_message("The [attack_text] sparks harmlessly off [owner]'s shields!") + owner.visible_message("[owner]'s shields deflect [attack_text] in a shower of sparks!") current_charges-- recharge_cooldown = world.time + recharge_delay SSobj.processing |= src diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 3ad99150f75..a50f174c9bc 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -137,6 +137,8 @@ helmet.attack_self(H) H.unEquip(helmet, 1) H.update_inv_wear_suit() + H << "The helmet on the hardsuit disengages." + playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1) helmet.loc = src /obj/item/clothing/suit/space/hardsuit/dropped() @@ -163,6 +165,4 @@ H.update_inv_wear_suit() playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1) else - H << "You disengage the helmet on the hardsuit." - playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1) RemoveHelmet() diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 7149bfe7a5d..72517dce58b 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -18,7 +18,7 @@ if(turfs.len) //Pick a turf to spawn at if we can var/turf/simulated/T = pick(turfs) - spawn(0) new/obj/effect/spacevine_controller(T) //spawn a controller at turf + new/obj/effect/spacevine_controller(T) //spawn a controller at turf /datum/spacevine_mutation @@ -437,6 +437,7 @@ /obj/effect/spacevine_controller + invisibility = 101 var/list/obj/effect/spacevine/vines = list() var/list/growth_queue = list() var/spread_multiplier = 5 diff --git a/code/modules/events/wizard/fakeexplosion.dm b/code/modules/events/wizard/fakeexplosion.dm index 955fd7fd390..3b2dfe80a06 100644 --- a/code/modules/events/wizard/fakeexplosion.dm +++ b/code/modules/events/wizard/fakeexplosion.dm @@ -8,5 +8,5 @@ /datum/round_event/wizard/fake_explosion/start() for(var/mob/M in player_list) M << 'sound/machines/Alarm.ogg' - sleep(100) - ticker.station_explosion_cinematic(1,"fake") //:o) \ No newline at end of file + spawn(100) + ticker.station_explosion_cinematic(1,"fake") //:o) \ No newline at end of file diff --git a/code/modules/events/wizard/imposter.dm b/code/modules/events/wizard/imposter.dm index c260a51251c..ec6f4fa06c5 100644 --- a/code/modules/events/wizard/imposter.dm +++ b/code/modules/events/wizard/imposter.dm @@ -38,9 +38,11 @@ ticker.mode.apprentices += I.mind I.mind.special_role = "imposter" - var/datum/objective/protect_objective = add_objective(I.mind, /datum/objective/default/protect) + var/datum/objective/protect/protect_objective = new /datum/objective/protect + protect_objective.owner = I.mind protect_objective.target = W.mind protect_objective.explanation_text = "Protect [W.real_name], the wizard." + I.mind.objectives += protect_objective ticker.mode.update_wiz_icons_added(I.mind) I.attack_log += "\[[time_stamp()]\] Is an imposter!" diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm index eb933f8ce7a..08fb9940f8d 100644 --- a/code/modules/flufftext/Dreaming.dm +++ b/code/modules/flufftext/Dreaming.dm @@ -1,4 +1,5 @@ /mob/living/carbon/proc/dream() + set waitfor = 0 dreaming = 1 var/list/dreams = list( "an ID card","a bottle","a familiar face","a crewmember","a toolbox","a security officer","the captain", @@ -8,17 +9,16 @@ "a blue light","an abandoned laboratory","Nanotrasen","The Syndicate","blood","healing","power","respect", "riches","space","a crash","happiness","pride","a fall","water","flames","ice","melons","flying" ) - spawn(0) - for(var/i = rand(1,4),i > 0, i--) - var/dream_image = pick(dreams) - dreams -= dream_image - src << "... [dream_image] ..." - sleep(rand(40,70)) - if(paralysis <= 0) - dreaming = 0 - return 0 - dreaming = 0 - return 1 + for(var/i = rand(1,4),i > 0, i--) + var/dream_image = pick(dreams) + dreams -= dream_image + src << "... [dream_image] ..." + sleep(rand(40,70)) + if(paralysis <= 0) + dreaming = 0 + return 0 + dreaming = 0 + return 1 /mob/living/carbon/proc/handle_dreams() if(prob(5) && !dreaming) dream() diff --git a/code/modules/food&drinks/drinks/drinks/bottle.dm b/code/modules/food&drinks/drinks/drinks/bottle.dm index 9b9bccc986e..c41e3682c35 100644 --- a/code/modules/food&drinks/drinks/drinks/bottle.dm +++ b/code/modules/food&drinks/drinks/drinks/bottle.dm @@ -125,8 +125,7 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle/proc/SplashReagents(var/mob/M) if(src.reagents.total_volume) - for(var/mob/O in viewers(M, null)) - O.show_message(text("The contents of \the [src] splashes all over [M]!"), 1) + M.visible_message("The contents of \the [src] splashes all over [M]!") reagents.reaction(M, TOUCH) reagents.clear_reagents() return diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index 0efe72640e1..baec9c92ea7 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -87,7 +87,7 @@ else return ..() /obj/item/weapon/deck/proc/dealTo(mob/living/target, mob/living/source) - if (!src.cards.len) + if (!cards.len) source.show_message("There are no cards in the deck.") return @@ -185,10 +185,10 @@ . = ..() if((!concealed || src.loc == usr) && cards.len) - usr.show_message("It contains: ") + usr.show_message("It contains: ", 1) for (var/datum/playingcard/card in cards) - usr.show_message("The [card.name].") + usr.show_message("The [card.name].", 1) /obj/item/weapon/hand/proc/update_conceal() if (src.concealed) src.hi.updateContent("headbar", "You are currently concealing your hand. Reveal your hand.") diff --git a/code/modules/holiday/halloween.dm b/code/modules/holiday/halloween.dm index 6f187ea2ae9..ea41f4f1807 100644 --- a/code/modules/holiday/halloween.dm +++ b/code/modules/holiday/halloween.dm @@ -212,7 +212,7 @@ step(I,direction) return -/mob/living/simple_animal/shade/howling_ghost/adjustBruteLoss() +/mob/living/simple_animal/shade/howling_ghost/adjustHealth() return /mob/living/simple_animal/shade/howling_ghost/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) @@ -272,7 +272,7 @@ /mob/living/simple_animal/hostile/retaliate/clown/insane/AttackTarget() return -/mob/living/simple_animal/hostile/retaliate/clown/insane/adjustBruteLoss() +/mob/living/simple_animal/hostile/retaliate/clown/insane/adjustHealth() if(prob(5)) playsound(loc, 'sound/spookoween/insane_low_laugh.ogg', 300, 1) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 13c40680a50..cd6ed978b57 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -377,7 +377,7 @@ harvest = 0 weedlevel = 0 // Reset - spawn(5) // Wait a while + sleep(5) // Wait a while update_icon() visible_message("[oldPlantName] suddenly mutated into [myseed.plantname]!") @@ -397,7 +397,7 @@ harvest = 0 weedlevel = 0 // Reset - spawn(5) // Wait a while + sleep(5) // Wait a while update_icon() visible_message("The mutated weeds in [src] spawned a [myseed.plantname]!") else @@ -798,8 +798,7 @@ user << "You reconnect \the [src]'s hoses." for(var/obj/machinery/hydroponics/h in range(1,src)) - spawn() - h.update_icon() + h.update_icon() return diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index 044ce578d40..638ac5d5a7c 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -13,8 +13,7 @@ /obj/structure/closet/crate/secure/loot/New() ..() - var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "0") - + var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "z") code = "" for(var/i = 0, i < codelen, i++) var/dig = pick(digits) @@ -169,7 +168,7 @@ user << "You leave the crate alone." else user << "A red light flashes." - lastattempt = input + lastattempt = replacetext(input, 0, "z") attempts-- if (attempts == 0) user << "The crate's anti-tamper system activates!" diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index de1b8269ad9..7d0e9756caf 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -655,18 +655,19 @@ wanted_objects = list(/obj/item/weapon/ore/diamond, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/silver, /obj/item/weapon/ore/plasma, /obj/item/weapon/ore/uranium, /obj/item/weapon/ore/iron, /obj/item/weapon/ore/bananium) + healable = 0 /mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/W = I if(W.welding && !stat) - if(AIStatus == AI_ON) + if(AIStatus != AI_OFF && AIStatus != AI_IDLE) user << "[src] is moving around too much to repair!" return if(maxHealth == health) user << "[src] is at full integrity." else - health += 10 + adjustBruteLoss(-10) user << "You repair some of the armor on [src]." return if(istype(I, /obj/item/device/mining_scanner) || istype(I, /obj/item/device/t_scanner/adv_mining_scanner)) @@ -741,7 +742,7 @@ O.loc = src.loc return -/mob/living/simple_animal/hostile/mining_drone/adjustBruteLoss() +/mob/living/simple_animal/hostile/mining_drone/adjustHealth() if(search_objects) SetOffenseBehavior() ..() diff --git a/code/modules/mining/lavaland/weather.dm b/code/modules/mining/lavaland/weather.dm index 35eb9a821ff..2d24616df50 100644 --- a/code/modules/mining/lavaland/weather.dm +++ b/code/modules/mining/lavaland/weather.dm @@ -36,9 +36,9 @@ if(M.z == target_z) M << start_up_message - sleep(start_up_time) - stage = MAIN_STAGE - weather_main() + spawn(start_up_time) + stage = MAIN_STAGE + weather_main() /datum/weather/proc/weather_main() diff --git a/code/modules/mining/lavaland/weather_types.dm b/code/modules/mining/lavaland/weather_types.dm index e32fbf4dc7a..89308d4437c 100644 --- a/code/modules/mining/lavaland/weather_types.dm +++ b/code/modules/mining/lavaland/weather_types.dm @@ -47,12 +47,13 @@ duration_overlay = "" overlay_layer = 10 -/datum/weather/advanced_darkness/advanced_darkness/update_areas() - ..() +/datum/weather/advanced_darkness/update_areas() for(var/area/A in impacted_areas) if(stage == MAIN_STAGE) + A.invisibility = 0 A.opacity = 1 else + A.invisibility = 100 A.opacity = 0 //Ash storms diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 8ab55ff2f13..40c0ea1d568 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -52,6 +52,7 @@ circuit = /obj/item/weapon/circuitboard/mining_shuttle shuttleId = "mining" possible_destinations = "mining_home;mining_away" + no_destination_swap = 1 /*********************Pickaxe & Drills**************************/ diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index ad4f5ca3d08..e8eb3462876 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -16,6 +16,7 @@ var/global/list/rockTurfEdgeCache opacity = 1 density = 1 blocks_air = 1 + layer = TURF_LAYER + 0.05 temperature = TCMB var/environment_type = "asteroid" var/turf/simulated/floor/plating/asteroid/turf_type = /turf/simulated/floor/plating/asteroid //For basalt vs normal asteroid @@ -89,7 +90,7 @@ var/global/list/rockTurfEdgeCache icon_state = "rock" return -/turf/simulated/mineral/proc/Spread(turf/T) +/turf/simulated/mineral/Spread(turf/T) new src.type(T) /turf/simulated/mineral/random @@ -284,16 +285,14 @@ var/global/list/rockTurfEdgeCache countdown(notify_admins) /turf/simulated/mineral/gibtonite/proc/countdown(notify_admins = 0) - spawn(0) - while(stage == 1 && det_time > 0 && mineralAmt >= 1) - det_time-- - sleep(5) - if(stage == 1 && det_time <= 0 && mineralAmt >= 1) - var/turf/bombturf = get_turf(src) - mineralAmt = 0 - explosion(bombturf,1,3,5, adminlog = notify_admins) - if(stage == 0 || stage == 2) - return + set waitfor = 0 + while(stage == 1 && det_time > 0 && mineralAmt >= 1) + det_time-- + sleep(5) + if(stage == 1 && det_time <= 0 && mineralAmt >= 1) + var/turf/bombturf = get_turf(src) + mineralAmt = 0 + explosion(bombturf,1,3,5, adminlog = notify_admins) /turf/simulated/mineral/gibtonite/proc/defuse() if(stage == 1) @@ -685,7 +684,7 @@ var/global/list/rockTurfEdgeCache /turf/simulated/chasm/proc/drop(atom/movable/AM) visible_message("[AM] falls into [src]!") - AM.Move(locate(drop_x, drop_y, drop_z)) + AM.forceMove(locate(drop_x, drop_y, drop_z)) AM.visible_message("[AM] falls from above!") if(istype(AM, /mob/living)) var/mob/living/L = AM diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 641fa9446f5..65643040b5c 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -182,9 +182,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(!istype(usr, /mob/dead/observer)) usr << "Not when you're not dead!" return - usr.verbs -= /mob/dead/observer/proc/dead_tele - spawn(30) - usr.verbs += /mob/dead/observer/proc/dead_tele var/A A = input("Area to jump to", "BOOYEA", A) as null|anything in sortedAreas var/area/thearea = A diff --git a/code/modules/mob/interactive.dm b/code/modules/mob/interactive.dm index 1bbb0e3ee55..44ecafca878 100644 --- a/code/modules/mob/interactive.dm +++ b/code/modules/mob/interactive.dm @@ -324,8 +324,8 @@ //proc functions for(var/Proc in functions) if(!isnotfunc()) - spawn(1) - call(src,Proc)(src) + callfunction(Proc) + //target interaction stays hardcoded @@ -411,6 +411,9 @@ tryWalk(TARGET) LAST_TARGET = TARGET +/mob/living/carbon/human/interactive/proc/callfunction(Proc) + set waitfor = 0 + call(src,Proc)(src) /mob/living/carbon/human/interactive/proc/tryWalk(turf/TARGET) if(!isnotfunc()) if(!walk2derpless(TARGET)) diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index ccb3d3f8695..4e444378c6f 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -177,6 +177,12 @@ Des: Removes all infected images from the alien. /mob/living/carbon/alien/get_standard_pixel_y_offset(lying = 0) return initial(pixel_y) +/mob/living/carbon/alien/proc/alien_evolve(mob/living/carbon/alien/new_xeno) + src << "You begin to evolve!" + visible_message("[src] begins to twist and contort!") + if(mind) + mind.transfer_to(new_xeno) + qdel(src) #undef HEAT_DAMAGE_LEVEL_1 #undef HEAT_DAMAGE_LEVEL_2 diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index 05bc607668b..4f01f0ca45d 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -90,8 +90,7 @@ Doesn't work on other aliens/AI.*/ if(locate(/obj/structure/alien/weeds/node) in get_turf(user)) src << "There's already a weed node here." return 0 - for(var/mob/O in viewers(user, null)) - O.show_message(text("[user] has planted some alien weeds!"), 1) + user.visible_message("[user] has planted some alien weeds!") new/obj/structure/alien/weeds/node(user.loc) return 1 @@ -241,7 +240,7 @@ Doesn't work on other aliens/AI.*/ user << "There is already a resin structure there." return 0 var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in structures - if(!choice) + if(!choice) return 0 if (!cost_check(check_turf,user)) return 0 diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm index 8f12f2b593b..1b98f34f670 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm @@ -26,12 +26,12 @@ action_icon_state = "alien_evolve_drone" /obj/effect/proc_holder/alien/evolve/fire(mob/living/carbon/alien/user) - if(!alien_type_present(/mob/living/carbon/alien/humanoid/royal/)) - user << "You begin to evolve!" - user.visible_message("[user] begins to twist and contort!") + if(!isturf(user.loc)) + user << "You can't evolve here!" + return 0 + if(!alien_type_present(/mob/living/carbon/alien/humanoid/royal)) var/mob/living/carbon/alien/humanoid/royal/praetorian/new_xeno = new (user.loc) - user.mind.transfer_to(new_xeno) - qdel(user) + user.alien_evolve(new_xeno) return 1 else user << "We already have a living royal!" diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index b1b7efece80..b99f7eb5e88 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -4,6 +4,7 @@ maxHealth = 125 health = 125 icon_state = "alienh_s" + var/obj/screen/leap_icon = null /mob/living/carbon/alien/humanoid/hunter/New() internal_organs += new /obj/item/organ/internal/alien/plasmavessel/small @@ -37,7 +38,6 @@ //Hunter verbs - /mob/living/carbon/alien/humanoid/hunter/proc/toggle_leap(message = 1) leap_on_click = !leap_on_click leap_icon.icon_state = "leap_[leap_on_click ? "on":"off"]" diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm index a493926e129..c7ce06b06b6 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm @@ -54,11 +54,8 @@ /obj/effect/proc_holder/alien/royal/praetorian/evolve/fire(mob/living/carbon/alien/user) if(!alien_type_present(/mob/living/carbon/alien/humanoid/royal/queen)) - user << "You begin to evolve!" - user.visible_message("[user] begins to twist and contort!") var/mob/living/carbon/alien/humanoid/royal/queen/new_xeno = new (user.loc) - user.mind.transfer_to(new_xeno) - qdel(user) + user.alien_evolve(new_xeno) return 1 else user << "We already have an alive queen." diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 6ed3532f9fd..2c9d6b5b156 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -149,6 +149,15 @@ /mob/living/carbon/alien/humanoid/get_permeability_protection() return 0.8 +/mob/living/carbon/alien/humanoid/alien_evolve(mob/living/carbon/alien/humanoid/new_xeno) + drop_l_hand() + drop_r_hand() + for(var/atom/movable/A in stomach_contents) + stomach_contents.Remove(A) + new_xeno.stomach_contents.Add(A) + A.loc = new_xeno + ..() + //For alien evolution/promotion procs. Checks for proc/alien_type_present(var/alienpath) for(var/mob/living/carbon/alien/humanoid/A in living_mob_list) diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm index 3f9cb657498..d575ba5f4f8 100644 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ b/code/modules/mob/living/carbon/alien/larva/powers.dm @@ -32,8 +32,6 @@ return var/mob/living/carbon/alien/larva/L = user - if(L.stat != CONSCIOUS) - return if(L.handcuffed || L.legcuffed) // Cuffing larvas ? Eh ? user << "You cannot evolve when you are cuffed." @@ -45,6 +43,9 @@ L << "Drones are the weakest and slowest of the castes, but can grow into the queen if there is none, and are vital to maintaining a hive with their resin secretion abilities." var/alien_caste = alert(L, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone") + if(user.incapacitated()) //something happened to us while we were choosing. + return + var/mob/living/carbon/alien/humanoid/new_xeno switch(alien_caste) if("Hunter") @@ -53,8 +54,8 @@ new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(L.loc) if("Drone") new_xeno = new /mob/living/carbon/alien/humanoid/drone(L.loc) - if(L.mind) L.mind.transfer_to(new_xeno) - qdel(L) + + L.alien_evolve(new_xeno) return 0 else user << "You are not fully grown." diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm index 5a1746e5ed2..f66c3c8794d 100644 --- a/code/modules/mob/living/carbon/alien/say.dm +++ b/code/modules/mob/living/carbon/alien/say.dm @@ -11,8 +11,10 @@ var/message_a = say_quote(message, get_spans()) var/rendered = "Hivemind, [shown_name] [message_a]" for(var/mob/S in player_list) - if((!S.stat && S.hivecheck()) || (S in dead_mob_list)) + if(!S.stat && S.hivecheck()) S << rendered + if(S in dead_mob_list) + S << "(F) [rendered]" /mob/living/carbon/alien/humanoid/royal/queen/alien_talk(message, shown_name = name) shown_name = "[shown_name]" diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 36184591213..c7d8d287697 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -364,22 +364,21 @@ var/const/GALOSHES_DONT_HELP = 4 adjustBruteLoss(10) /mob/living/carbon/proc/spin(spintime, speed) - spawn() - var/D = dir - while(spintime >= speed) - sleep(speed) - switch(D) - if(NORTH) - D = EAST - if(SOUTH) - D = WEST - if(EAST) - D = SOUTH - if(WEST) - D = NORTH - dir = D - spintime -= speed - return + set waitfor = 0 + var/D = dir + while(spintime >= speed) + sleep(speed) + switch(D) + if(NORTH) + D = EAST + if(SOUTH) + D = WEST + if(EAST) + D = SOUTH + if(WEST) + D = NORTH + dir = D + spintime -= speed /mob/living/carbon/resist_buckle() if(restrained()) diff --git a/code/modules/mob/living/carbon/human/blood.dm b/code/modules/mob/living/carbon/human/blood.dm index ae8d90f7985..65a66e7ef3d 100644 --- a/code/modules/mob/living/carbon/human/blood.dm +++ b/code/modules/mob/living/carbon/human/blood.dm @@ -46,6 +46,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 /mob/living/carbon/human/handle_blood() if(NOBLOOD in dna.species.specflags) + blood_max = 0 return if(stat != DEAD && bodytemperature >= 170) //Dead or cryosleep people do not pump the blood. diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index d578bb03c28..891331c3cc1 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -37,8 +37,6 @@ make_blood() ..() - var/mob/M = src - faction |= "\ref[M]" /mob/living/carbon/human/prepare_data_huds() //Update med hud images... diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index e3c6d588a28..d4f4e91e080 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -1,7 +1,12 @@ /mob/living/carbon/human/attack_hulk(mob/living/carbon/human/user) if(user.a_intent == "harm") ..(user, 1) + playsound(loc, user.dna.species.attack_sound, 25, 1, -1) + var/hulk_verb = pick("smash","pummel") + visible_message("[user] has [hulk_verb]ed [src]!", \ + "[user] has [hulk_verb]ed [src]!") adjustBruteLoss(15) + return 1 /mob/living/carbon/human/attack_hand(mob/living/carbon/human/M) if(..()) //to allow surgery to return properly. diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 88a4581e713..27a76f7eec2 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -306,6 +306,8 @@ if(head) if(head.flags & BLOCK_GAS_SMOKE_EFFECT) . = 1 + if(NOBREATH in dna.species.specflags) + . = 1 return . /mob/living/carbon/human/proc/handle_embedded_objects() for(var/obj/item/organ/limb/L in organs) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 97afcbb9e2c..ba39adb3e7f 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -38,6 +38,7 @@ var/meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human //What the species drops on gibbing var/list/no_equip = list() // slots the race can't equip stuff to var/nojumpsuit = 0 // this is sorta... weird. it basically lets you equip stuff that usually needs jumpsuits without one, like belts and pockets and ids + var/blacklisted = 0 //Flag to exclude from green slime core species. var/dangerous_existence = null //A flag for transformation spells that tells them "hey if you turn a person into one of these without preperation, they'll probably die!" var/say_mod = "says" // affects the speech message var/list/default_features = list() // Default mutant bodyparts for this species. Don't forget to set one for every mutant bodypart you allow this species to have. @@ -1219,7 +1220,7 @@ H.adjustOxyLoss(8) H.throw_alert("too_much_co2", /obj/screen/alert/too_much_co2) if(prob(20)) // Lets give them some chance to know somethings not right though I guess. - spawn(0) H.emote("cough") + H.emote("cough") else H.co2overloadtime = 0 @@ -1274,7 +1275,7 @@ //-- TRACES --// - if(breath && !(NOBREATH in specflags)) // If there's some other shit in the air lets deal with it here. +if(breath && !(NOBREATH in specflags)) // If there's some other shit in the air lets deal with it here. var/SA_pp = breath.get_breath_partial_pressure(breath_gases["n2o"][MOLES]) if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit H.Paralyse(3) // 3 gives them one second to wake up and run away a bit! @@ -1282,9 +1283,7 @@ H.sleeping = max(H.sleeping+2, 10) else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning if(prob(20)) - spawn(0) - H.emote(pick("giggle", "laugh")) - + H.emote(pick("giggle", "laugh")) handle_breath_temperature(breath, H) breath.garbage_collect() @@ -1299,8 +1298,7 @@ if(!(NOBREATH in specflags) || (H.health <= config.health_threshold_crit)) if(prob(20)) - spawn(0) - H.emote("gasp") + H.emote("gasp") if(breath_pp > 0) var/ratio = safe_breath_min/breath_pp H.adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all! diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index ab022a31876..b491e627275 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -168,6 +168,7 @@ datum/species/human/spec_death(gibbed, mob/living/carbon/human/H) darksight = 8 invis_sight = SEE_INVISIBLE_MINIMUM sexes = 0 + blacklisted = 1 ignored_by = list(/mob/living/simple_animal/hostile/faithless) meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/shadow specflags = list(NOBREATH,NOBLOOD,RADIMMUNE) @@ -343,6 +344,7 @@ datum/species/human/spec_death(gibbed, mob/living/carbon/human/H) armor = 55 siemens_coeff = 0 punchmod = 5 + blacklisted = 1 no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_w_uniform) nojumpsuit = 1 meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/golem @@ -387,6 +389,7 @@ datum/species/human/spec_death(gibbed, mob/living/carbon/human/H) id = "skeleton" say_mod = "rattles" need_nutrition = 0 + blacklisted = 1 sexes = 0 meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton specflags = list(NOBREATH,HEATRES,COLDRES,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE) @@ -412,6 +415,7 @@ datum/species/human/spec_death(gibbed, mob/living/carbon/human/H) id = "zombie" say_mod = "moans" sexes = 0 + blacklisted = 1 meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie specflags = list(NOBREATH,HEATRES,COLDRES,NOBLOOD,RADIMMUNE) @@ -453,16 +457,16 @@ datum/species/human/spec_death(gibbed, mob/living/carbon/human/H) /datum/species/abductor/handle_speech(message) //Hacks var/mob/living/carbon/human/user = usr + var/rendered = "[user.name]: [message]" for(var/mob/living/carbon/human/H in mob_list) if(H.dna.species.id != "abductor") continue else var/datum/species/abductor/target_spec = H.dna.species if(target_spec.team == team) - H << "[user.name]: [message]" - //return - technically you can add more aliens to a team + H << rendered for(var/mob/M in dead_mob_list) - M << "[user.name]: [message]" + M << "(F)[rendered]" return "" @@ -479,6 +483,7 @@ var/global/image/plasmaman_on_fire = image("icon"='icons/mob/OnFire.dmi', "icon_ safe_toxins_min = 16 //We breath THIS! safe_toxins_max = 0 dangerous_existence = 1 //So so much + blacklisted = 1 //See above need_nutrition = 0 //Hard to eat through a helmet burnmod = 2 heatmod = 2 @@ -549,6 +554,7 @@ var/global/list/synth_flesh_disguises = list() SA_para_min = 0 SA_sleep_min = 0 dangerous_existence = 1 + blacklisted = 1 need_nutrition = 0 //beep boop robots do not need sustinance meat = null var/list/initial_specflags = list(NOTRANSSTING,NOBREATH,VIRUSIMMUNE) //for getting these values back for assume_disguise() diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 8f460db1de8..00fbd98a442 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -48,7 +48,7 @@ if(losebreath > 0) losebreath-- if(prob(10)) - spawn emote("gasp") + emote("gasp") if(istype(loc, /obj/)) var/obj/loc_as_obj = loc loc_as_obj.handle_internal_lifeform(src,0) @@ -116,8 +116,7 @@ //OXYGEN if(O2_partialpressure < safe_oxy_min) //Not enough oxygen if(prob(20)) - spawn(0) - emote("gasp") + emote("gasp") if(O2_partialpressure > 0) var/ratio = safe_oxy_min/O2_partialpressure adjustOxyLoss(min(5*ratio, 3)) @@ -147,7 +146,7 @@ if(world.time - co2overloadtime > 300) adjustOxyLoss(8) if(prob(20)) - spawn(0) emote("cough") + emote("cough") else co2overloadtime = 0 @@ -170,8 +169,7 @@ sleeping = max(sleeping+2, 10) else if(SA_partialpressure > 0.01) if(prob(20)) - spawn(0) emote(pick("giggle","laugh")) - + emote(pick("giggle","laugh")) breath.garbage_collect() //BREATH TEMPERATURE @@ -268,21 +266,21 @@ /mob/living/carbon/handle_stomach() - spawn(0) - for(var/mob/living/M in stomach_contents) - if(M.loc != src) + set waitfor = 0 + for(var/mob/living/M in stomach_contents) + if(M.loc != src) + stomach_contents.Remove(M) + continue + if(istype(M, /mob/living/carbon) && stat != 2) + if(M.stat == 2) + M.death(1) stomach_contents.Remove(M) + qdel(M) continue - if(istype(M, /mob/living/carbon) && stat != 2) - if(M.stat == 2) - M.death(1) - stomach_contents.Remove(M) - qdel(M) - continue - if(SSmob.times_fired%3==1) - if(!(M.status_flags & GODMODE)) - M.adjustBruteLoss(5) - nutrition += 10 + if(SSmob.times_fired%3==1) + if(!(M.status_flags & GODMODE)) + M.adjustBruteLoss(5) + nutrition += 10 //This updates the health and status of the mob (conscious, unconscious, dead) /mob/living/carbon/handle_regular_status_updates() @@ -324,8 +322,7 @@ adjustStaminaLoss(-10) sleeping = max(sleeping-1, 0) if( prob(10) && health && !hal_crit ) - spawn(0) - emote("snore") + emote("snore") else clear_alert("asleep") diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index db7a3cf58d7..43ab7159124 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -139,9 +139,7 @@ /mob/living/carbon/monkey/handle_random_events() if (prob(1) && prob(2)) - spawn(0) - emote("scratch") - return + emote("scratch") /mob/living/carbon/monkey/has_smoke_protection() if(wear_mask) diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 85216f02e9a..b1e60e3e517 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -96,10 +96,8 @@ damage = rand(10, 15) if ( (paralysis < 5) && (health > 0) ) Paralyse(rand(10, 15)) - spawn( 0 ) - visible_message("[M] has knocked out [name]!", \ + visible_message("[M] has knocked out [name]!", \ "[M] has knocked out [name]!") - return adjustBruteLoss(damage) add_logs(M, src, "attacked") updatehealth() @@ -107,7 +105,6 @@ playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) visible_message("[M] has attempted to punch [name]!", \ "[M] has attempted to punch [name]!") - if("disarm") if (!( paralysis )) M.do_attack_animation(src) @@ -122,7 +119,6 @@ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) visible_message("[M] has disarmed [src]!", \ "[M] has disarmed [src]!") - return /mob/living/carbon/monkey/attack_alien(mob/living/carbon/alien/humanoid/M) if(..()) //if harm or disarm intent. diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index af5c3b5e4bb..86e7256edce 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -167,7 +167,7 @@ if(recursive) for(var/obj/item/T in I) - give_action_button(I, recursive - 1) + give_action_button(T, recursive - 1) //this handles hud updates. Calls update_vision() and handle_hud_icons() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index c46d0f1cfde..6af067cc65c 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -23,6 +23,8 @@ Sorry Giacom. Please don't be mad :( if(unique_name) name = "[name] ([rand(1, 1000)])" real_name = name + + faction |= "\ref[src]" /mob/living/Destroy() @@ -160,10 +162,10 @@ Sorry Giacom. Please don't be mad :( set name = "Pull" set category = "Object" - if(pulling == AM) + if(AM.Adjacent(src)) + start_pulling(AM) + else stop_pulling() - else if(AM.Adjacent(src)) - src.start_pulling(AM) //same as above /mob/living/pointed(atom/A as mob|obj|turf in view()) @@ -235,7 +237,7 @@ Sorry Giacom. Please don't be mad :( /mob/living/proc/adjustBruteLoss(amount) if(status_flags & GODMODE) return 0 - bruteloss = min(max(bruteloss + amount, 0),(maxHealth*2)) + bruteloss = Clamp(bruteloss + amount, 0, maxHealth*2) handle_regular_status_updates() //we update our health right away. /mob/living/proc/getOxyLoss() @@ -243,7 +245,7 @@ Sorry Giacom. Please don't be mad :( /mob/living/proc/adjustOxyLoss(amount) if(status_flags & GODMODE) return 0 - oxyloss = min(max(oxyloss + amount, 0),(maxHealth*2)) + oxyloss = Clamp(oxyloss + amount, 0, maxHealth*2) handle_regular_status_updates() /mob/living/proc/setOxyLoss(amount) @@ -256,7 +258,7 @@ Sorry Giacom. Please don't be mad :( /mob/living/proc/adjustToxLoss(amount) if(status_flags & GODMODE) return 0 - toxloss = min(max(toxloss + amount, 0),(maxHealth*2)) + toxloss = Clamp(toxloss + amount, 0, maxHealth*2) handle_regular_status_updates() /mob/living/proc/setToxLoss(amount) @@ -269,7 +271,7 @@ Sorry Giacom. Please don't be mad :( /mob/living/proc/adjustFireLoss(amount) if(status_flags & GODMODE) return 0 - fireloss = min(max(fireloss + amount, 0),(maxHealth*2)) + fireloss = Clamp(fireloss + amount, 0, maxHealth*2) handle_regular_status_updates() //we update our health right away. /mob/living/proc/getCloneLoss() @@ -277,7 +279,7 @@ Sorry Giacom. Please don't be mad :( /mob/living/proc/adjustCloneLoss(amount) if(status_flags & GODMODE) return 0 - cloneloss = min(max(cloneloss + amount, 0),(maxHealth*2)) + cloneloss = Clamp(cloneloss + amount, 0, maxHealth*2) handle_regular_status_updates() /mob/living/proc/setCloneLoss(amount) @@ -290,7 +292,7 @@ Sorry Giacom. Please don't be mad :( /mob/living/proc/adjustBrainLoss(amount) if(status_flags & GODMODE) return 0 - brainloss = min(max(brainloss + amount, 0),(maxHealth*2)) + brainloss = Clamp(brainloss + amount, 0, maxHealth*2) handle_regular_status_updates() /mob/living/proc/setBrainLoss(amount) @@ -303,7 +305,7 @@ Sorry Giacom. Please don't be mad :( /mob/living/proc/adjustStaminaLoss(amount) if(status_flags & GODMODE) return 0 - staminaloss = min(max(staminaloss + amount, 0),(maxHealth*2)) + staminaloss = Clamp(staminaloss + amount, 0, maxHealth*2) /mob/living/proc/setStaminaLoss(amount) if(status_flags & GODMODE) return 0 @@ -438,6 +440,7 @@ Sorry Giacom. Please don't be mad :( eye_blurry = 0 ear_deaf = 0 ear_damage = 0 + hallucination = 0 heal_overall_damage(1000, 1000) ExtinguishMob() fire_stacks = 0 diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index a95d8be0c5d..471cec390b6 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -208,7 +208,7 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN) log_say("[mind.changeling.changelingID]/[src.key] : [message]") for(var/mob/M in mob_list) if(M in dead_mob_list) - M << msg + M << "(F) [msg]" else switch(M.lingcheck()) if(2) diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index af6786025bc..9268598c985 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -41,7 +41,6 @@ for(var/obj/machinery/ai_status_display/O in world) //change status if(src.key) - spawn( 0 ) O.mode = 2 if (istype(loc, /obj/item/device/aicard)) loc.icon_state = "aicard-404" diff --git a/code/modules/mob/living/silicon/ai/laws.dm b/code/modules/mob/living/silicon/ai/laws.dm index 50c188ca629..9f11d34359b 100644 --- a/code/modules/mob/living/silicon/ai/laws.dm +++ b/code/modules/mob/living/silicon/ai/laws.dm @@ -17,3 +17,10 @@ src.laws_sanity_check() src.laws.show_laws(who) + if(!everyone) + for(var/mob/living/silicon/robot/R in connected_robots) + if(R.lawupdate) + R.lawsync() + R.show_laws() + R.law_change_counter++ + diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 93e1147d746..baeed877e6f 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -161,7 +161,7 @@ sleep(2) //bring up APC dialog apc_override = 1 - theAPC.attack_ai(src) + theAPC.ui_interact(src, state = conscious_state) apc_override = 0 src:aiRestorePowerRoutine = 3 src << "Here are your current laws:" diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index c1ea89972d6..3c11b2851a8 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -190,6 +190,10 @@ CRASH("pAI without card") loc = card +/mob/living/silicon/pai/canUseTopic(atom/movable/M) + return 1 + + //Addition by Mord_Sith to define AI's network change ability /* /mob/living/silicon/pai/proc/pai_network_change() diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index ad2cb1399e1..c10a41e6a78 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -260,8 +260,7 @@ if(href_list["cable"]) var/turf/T = get_turf(src.loc) src.cable = new /obj/item/weapon/pai_cable(T) - for (var/mob/M in viewers(T)) - M.show_message("A port on [src] opens to reveal [src.cable], which promptly falls to the floor.", 3, "You hear the soft click of something light and hard falling to the ground.", 2) + T.visible_message("A port on [src] opens to reveal [src.cable], which promptly falls to the floor.", "You hear the soft click of something light and hard falling to the ground.") //src.updateUsrDialog() We only need to account for the single mob this is intended for, and he will *always* be able to call this window src.paiInterface() // So we'll just call the update directly rather than doing some default checks return diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index 90ba92dd0f6..00cdfcc10e4 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -13,12 +13,14 @@ var/message_a = say_quote(message, get_spans()) var/rendered = "Robotic Talk, [name] [message_a]" for(var/mob/M in player_list) - if(M.binarycheck() || (M in dead_mob_list)) + if(M.binarycheck()) if(istype(M, /mob/living/silicon/ai)) var/renderedAI = "Robotic Talk, [name] ([desig]) [message_a]" M << renderedAI else M << rendered + if(M in dead_mob_list) + M << "(F) [rendered]" /mob/living/silicon/binarycheck() return 1 diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index d03ed22c237..71d2a7213e3 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -105,7 +105,7 @@ Radio = new/obj/item/device/radio(src) if(radio_key) Radio.keyslot = new radio_key - Radio.canhear_range = 1 // 0 ? + Radio.canhear_range = 0 // anything greater will have the bot broadcast the channel as if it were saying it out loud. Radio.recalculateChannels() bot_core = new bot_core_type(src) @@ -163,12 +163,7 @@ else user << "[src] is in pristine condition." -/mob/living/simple_animal/bot/adjustBruteLoss(amount) - if(amount>0 && prob(10)) - new /obj/effect/decal/cleanable/oil(loc) - return ..(amount) - -/mob/living/simple_animal/bot/adjustFireLoss(amount) +/mob/living/simple_animal/bot/adjustHealth(amount) if(amount>0 && prob(10)) new /obj/effect/decal/cleanable/oil(loc) return ..(amount) @@ -710,12 +705,12 @@ Pass a positive integer as an argument to override a bot's default speed. if(usr in users) users.Remove(usr) return 1 - + if(topic_denied(usr)) usr << "[src]'s interface is not responding!" return 1 add_fingerprint(usr) - + if((href_list["power"]) && (bot_core.allowed(usr) || !locked)) if (on) turn_off() @@ -786,3 +781,7 @@ Pass a positive integer as an argument to override a bot's default speed. /mob/living/simple_animal/bot/Logout() . = ..() bot_reset() + +/mob/living/simple_animal/bot/revive() + ..() + update_icon() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index 9e5386a65d9..bf77108174d 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -153,7 +153,7 @@ dat += "Critical Patient Alerts: [declare_crit ? "Yes" : "No"]
" dat += "Patrol Station: [auto_patrol ? "Yes" : "No"]
" dat += "Stationary Mode: [stationary_mode ? "Yes" : "No"]
" - + return dat /mob/living/simple_animal/bot/medbot/Topic(href, href_list) @@ -229,8 +229,7 @@ declare_crit = 0 if(user) user << "You short out [src]'s reagent synthesis circuits." - spawn(0) - audible_message("[src] buzzes oddly!") + audible_message("[src] buzzes oddly!") flick("medibot_spark", src) if(user) oldpatient = user diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index fc0d4bab71c..46d8832ddd8 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -43,7 +43,6 @@ var/global/mulebot_count = 0 var/reached_target = 1 //true if already reached the target - var/refresh = 1 // true to refresh dialogue var/auto_return = 1 // true if auto return to home beacon after unload var/auto_pickup = 1 // true if auto-pickup at beacon var/report_delivery = 1 // true if bot will announce an arrival to a location. @@ -214,8 +213,6 @@ mob/living/simple_animal/bot/mulebot/bot_reset() dat += "Toggle Auto Return Home ([auto_return ? "On":"Off"])
" dat += "Toggle Auto Pickup Crate ([auto_pickup ? "On":"Off"])
" dat += "Toggle Delivery Reporting ([report_delivery ? "On" : "Off"])
" - dat += "Toggle Interface Refreshing ([refresh ? "On" : "Off"])
" - if(load) dat += "Unload Now
" dat += "
The maintenance hatch is closed.
" @@ -297,11 +294,6 @@ mob/living/simple_animal/bot/mulebot/bot_reset() return switch(command) - - if("autorefresh") - refresh = !refresh - update_controls() - if("stop") if(mode >= BOT_DELIVER) bot_reset() @@ -318,26 +310,21 @@ mob/living/simple_animal/bot/mulebot/bot_reset() update_controls() if("destination") - refresh=0 var/new_dest = input(user, "Select M.U.L.E. Destination", "Mulebot [suffix ? "([suffix])" : ""]", destination) as null|anything in deliverybeacontags - refresh=1 if(new_dest) set_destination(new_dest) + update_controls() if("setid") - refresh=0 var/new_id = stripped_input(user, "Enter new bot ID", "Mulebot [suffix ? "([suffix])" : ""]", suffix, MAX_NAME_LEN) - refresh=1 if(new_id) suffix = new_id name = "\improper Mulebot ([suffix])" update_controls() if("sethome") - refresh=0 var/new_home = stripped_input(user, "Enter new home tag", "Mulebot [suffix ? "([suffix])" : ""]", home_destination) - refresh=1 if(new_home) home_destination = new_home update_controls() @@ -512,8 +499,6 @@ mob/living/simple_animal/bot/mulebot/bot_reset() sleep(2) process_bot() - if(refresh) update_controls() - /mob/living/simple_animal/bot/mulebot/proc/process_bot() if(!on) return diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index a0d0ef6b331..eec5a954e23 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -184,6 +184,16 @@ Auto Patrol: []"}, else ..() + +/mob/living/simple_animal/bot/secbot/hitby(atom/movable/AM, skipcatch = 0, hitpush = 1, blocked = 0) + if(istype(AM, /obj/item)) + var/obj/item/I = AM + if(I.throwforce < src.health && I.thrownby && (istype(I.thrownby, /mob/living/carbon/human))) + var/mob/living/carbon/human/H = I.thrownby + retaliate(H) + ..() + + /mob/living/simple_animal/bot/secbot/proc/cuff(mob/living/carbon/C) mode = BOT_ARREST playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index ee584f7cbbe..5ea94615935 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -57,7 +57,7 @@ /mob/living/simple_animal/hostile/construct/attack_animal(mob/living/simple_animal/M) if(istype(M, /mob/living/simple_animal/hostile/construct/builder)) if(health < maxHealth) - adjustBruteLoss(-5) + adjustHealth(-5) if(src != M) Beam(M,icon_state="sendbeam",icon='icons/effects/effects.dmi',time=4) M.visible_message("[M] repairs some of \the [src]'s dents.", \ diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm index 940d574b346..0deb6c4289a 100644 --- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm +++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm @@ -52,4 +52,4 @@ desc = "One bug squashed. Four more will rise in its place." icon = 'icons/effects/blood.dmi' icon_state = "xfloor1" - random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") + random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index a040346808d..9fcc023c4b2 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -119,16 +119,9 @@ switch(remove_from) if("head") if(inventory_head) - name = real_name - desc = initial(desc) - speak = list("YAP", "Woof!", "Bark!", "AUUUUUU") - speak_emote = list("barks", "woofs") - emote_hear = list("barks", "woofs", "yaps","pants") - emote_see = list("shakes its head", "shivers") - desc = "It's a corgi." - SetLuminosity(0) inventory_head.loc = src.loc inventory_head = null + update_corgi_fluff() regenerate_icons() else usr << "There is nothing to remove from its [remove_from]." @@ -137,6 +130,7 @@ if(inventory_back) inventory_back.loc = src.loc inventory_back = null + update_corgi_fluff() regenerate_icons() else usr << "There is nothing to remove from its [remove_from]." @@ -198,6 +192,7 @@ usr.drop_item() item_to_add.loc = src src.inventory_back = item_to_add + update_corgi_fluff() regenerate_icons() show_inv(usr) @@ -239,7 +234,7 @@ /obj/item/clothing/head/wizard/fake, /obj/item/clothing/head/wizard, /obj/item/clothing/head/collectable/wizard, /obj/item/clothing/head/cardborg, /obj/item/weapon/bedsheet, /obj/item/clothing/head/helmet/space/santahat, /obj/item/clothing/head/soft, /obj/item/clothing/head/hardhat/reindeer, /obj/item/clothing/head/sombrero, - /obj/item/clothing/head/hopcap, /obj/item/clothing/head/helmet/space/hardsuit/deathsquad, /obj/item/clothing/mask/gas/clown_hat) + /obj/item/clothing/head/hopcap, /obj/item/clothing/mask/gas/clown_hat) valid = 1 if(valid) @@ -271,115 +266,139 @@ return valid /mob/living/simple_animal/pet/dog/corgi/proc/update_corgi_fluff() - if(!inventory_head) - return - switch(inventory_head.type) - if(/obj/item/clothing/head/helmet) - name = "Sergeant [real_name]" - desc = "The ever-loyal, the ever-vigilant." + var/special_hat = 0 + if(inventory_head) + special_hat = 1 + switch(inventory_head.type) + if(/obj/item/clothing/head/helmet) + name = "Sergeant [real_name]" + desc = "The ever-loyal, the ever-vigilant." - if(/obj/item/clothing/head/chefhat, /obj/item/clothing/head/collectable/chef) - name = "Sous chef [real_name]" - desc = "Your food will be taste-tested. All of it." + if(/obj/item/clothing/head/chefhat, /obj/item/clothing/head/collectable/chef) + name = "Sous chef [real_name]" + desc = "Your food will be taste-tested. All of it." - if(/obj/item/clothing/head/caphat, /obj/item/clothing/head/collectable/captain) - name = "Captain [real_name]" - desc = "Probably better than the last captain." + if(/obj/item/clothing/head/caphat, /obj/item/clothing/head/collectable/captain) + name = "Captain [real_name]" + desc = "Probably better than the last captain." - if(/obj/item/clothing/head/kitty, /obj/item/clothing/head/collectable/kitty) - name = "Runtime" - emote_see = list("coughs up a furball", "stretches") - emote_hear = list("purrs") - speak = list("Purrr", "Meow!", "MAOOOOOW!", "HISSSSS", "MEEEEEEW") - desc = "It's a cute little kitty-cat! ... wait ... what the hell?" + if(/obj/item/clothing/head/kitty, /obj/item/clothing/head/collectable/kitty) + name = "Runtime" + emote_see = list("coughs up a furball", "stretches") + emote_hear = list("purrs") + speak = list("Purrr", "Meow!", "MAOOOOOW!", "HISSSSS", "MEEEEEEW") + desc = "It's a cute little kitty-cat! ... wait ... what the hell?" - if(/obj/item/clothing/head/rabbitears, /obj/item/clothing/head/collectable/rabbitears) - name = "Hoppy" - emote_see = list("twitches its nose", "hops around a bit") - desc = "This is Hoppy. It's a corgi-...urmm... bunny rabbit" + if(/obj/item/clothing/head/rabbitears, /obj/item/clothing/head/collectable/rabbitears) + name = "Hoppy" + emote_see = list("twitches its nose", "hops around a bit") + desc = "This is Hoppy. It's a corgi-...urmm... bunny rabbit" - if(/obj/item/clothing/head/beret, /obj/item/clothing/head/collectable/beret) - name = "Yann" - desc = "Mon dieu! C'est un chien!" - speak = list("le woof!", "le bark!", "JAPPE!!") - emote_see = list("cowers in fear.", "surrenders.", "plays dead.","looks as though there is a wall in front of him.") + if(/obj/item/clothing/head/beret, /obj/item/clothing/head/collectable/beret) + name = "Yann" + desc = "Mon dieu! C'est un chien!" + speak = list("le woof!", "le bark!", "JAPPE!!") + emote_see = list("cowers in fear.", "surrenders.", "plays dead.","looks as though there is a wall in front of him.") - if(/obj/item/clothing/head/det_hat) - name = "Detective [real_name]" - desc = "[name] sees through your lies..." - emote_see = list("investigates the area.","sniffs around for clues.","searches for scooby snacks.") + if(/obj/item/clothing/head/det_hat) + name = "Detective [real_name]" + desc = "[name] sees through your lies..." + emote_see = list("investigates the area.","sniffs around for clues.","searches for scooby snacks.") - if(/obj/item/clothing/head/nursehat) - name = "Nurse [real_name]" - desc = "[name] needs 100cc of beef jerky... STAT!" + if(/obj/item/clothing/head/nursehat) + name = "Nurse [real_name]" + desc = "[name] needs 100cc of beef jerky... STAT!" - if(/obj/item/clothing/head/pirate, /obj/item/clothing/head/collectable/pirate) - name = "[pick("Ol'","Scurvy","Black","Rum","Gammy","Bloody","Gangrene","Death","Long-John")] [pick("kibble","leg","beard","tooth","poop-deck","Threepwood","Le Chuck","corsair","Silver","Crusoe")]" - desc = "Yaarghh!! Thar' be a scurvy dog!" - emote_see = list("hunts for treasure.","stares coldly...","gnashes his tiny corgi teeth!") - emote_hear = list("growls ferociously!", "snarls.") - speak = list("Arrrrgh!!","Grrrrrr!") + if(/obj/item/clothing/head/pirate, /obj/item/clothing/head/collectable/pirate) + name = "[pick("Ol'","Scurvy","Black","Rum","Gammy","Bloody","Gangrene","Death","Long-John")] [pick("kibble","leg","beard","tooth","poop-deck","Threepwood","Le Chuck","corsair","Silver","Crusoe")]" + desc = "Yaarghh!! Thar' be a scurvy dog!" + emote_see = list("hunts for treasure.","stares coldly...","gnashes his tiny corgi teeth!") + emote_hear = list("growls ferociously!", "snarls.") + speak = list("Arrrrgh!!","Grrrrrr!") - if(/obj/item/clothing/head/ushanka) - name = "[pick("Comrade","Commissar","Glorious Leader")] [real_name]" - desc = "A follower of Karl Barx." - emote_see = list("contemplates the failings of the capitalist economic model.", "ponders the pros and cons of vanguardism.") + if(/obj/item/clothing/head/ushanka) + name = "[pick("Comrade","Commissar","Glorious Leader")] [real_name]" + desc = "A follower of Karl Barx." + emote_see = list("contemplates the failings of the capitalist economic model.", "ponders the pros and cons of vanguardism.") - if(/obj/item/clothing/head/warden, /obj/item/clothing/head/collectable/police) - name = "Officer [real_name]" - emote_see = list("drools.","looks for donuts.") - desc = "Stop right there criminal scum!" + if(/obj/item/clothing/head/warden, /obj/item/clothing/head/collectable/police) + name = "Officer [real_name]" + emote_see = list("drools.","looks for donuts.") + desc = "Stop right there criminal scum!" - if(/obj/item/clothing/head/wizard/fake, /obj/item/clothing/head/wizard, /obj/item/clothing/head/collectable/wizard) - name = "Grandwizard [real_name]" - speak = list("YAP", "Woof!", "Bark!", "AUUUUUU", "EI NATH!") + if(/obj/item/clothing/head/wizard/fake, /obj/item/clothing/head/wizard, /obj/item/clothing/head/collectable/wizard) + name = "Grandwizard [real_name]" + speak = list("YAP", "Woof!", "Bark!", "AUUUUUU", "EI NATH!") - if(/obj/item/clothing/head/cardborg) - name = "Borgi" - speak = list("Ping!","Beep!","Woof!") - emote_see = list("goes rogue.", "sniffs out non-humans.") - desc = "Result of robotics budget cuts." + if(/obj/item/clothing/head/cardborg) + name = "Borgi" + speak = list("Ping!","Beep!","Woof!") + emote_see = list("goes rogue.", "sniffs out non-humans.") + desc = "Result of robotics budget cuts." - if(/obj/item/weapon/bedsheet) - name = "\improper Ghost" - speak = list("WoooOOOooo~","AUUUUUUUUUUUUUUUUUU") - emote_see = list("stumbles around.", "shivers.") - emote_hear = list("howls!","groans.") - desc = "Spooky!" + if(/obj/item/weapon/bedsheet) + name = "\improper Ghost" + speak = list("WoooOOOooo~","AUUUUUUUUUUUUUUUUUU") + emote_see = list("stumbles around.", "shivers.") + emote_hear = list("howls!","groans.") + desc = "Spooky!" - if(/obj/item/clothing/head/helmet/space/santahat) - name = "Santa's Corgi Helper" - emote_hear = list("barks Christmas songs.", "yaps merrily!") - emote_see = list("looks for presents.", "checks his list.") - desc = "He's very fond of milk and cookies." + if(/obj/item/clothing/head/helmet/space/santahat) + name = "Santa's Corgi Helper" + emote_hear = list("barks Christmas songs.", "yaps merrily!") + emote_see = list("looks for presents.", "checks his list.") + desc = "He's very fond of milk and cookies." - if(/obj/item/clothing/head/soft) - name = "Corgi Tech [real_name]" - desc = "The reason your yellow gloves have chew-marks." + if(/obj/item/clothing/head/soft) + name = "Corgi Tech [real_name]" + desc = "The reason your yellow gloves have chew-marks." - if(/obj/item/clothing/head/hardhat/reindeer) - name = "[real_name] the red-nosed Corgi" - emote_hear = list("lights the way!", "illuminates.", "yaps!") - desc = "He has a very shiny nose." + if(/obj/item/clothing/head/hardhat/reindeer) + name = "[real_name] the red-nosed Corgi" + emote_hear = list("lights the way!", "illuminates.", "yaps!") + desc = "He has a very shiny nose." - if(/obj/item/clothing/head/sombrero) - name = "Segnor [real_name]" - desc = "You must respect elder [real_name]" + if(/obj/item/clothing/head/sombrero) + name = "Segnor [real_name]" + desc = "You must respect elder [real_name]" - if(/obj/item/clothing/head/hopcap) - name = "Lieutenant [real_name]" - desc = "Can actually be trusted to not run off on his own." + if(/obj/item/clothing/head/hopcap) + name = "Lieutenant [real_name]" + desc = "Can actually be trusted to not run off on his own." - if(/obj/item/clothing/head/helmet/space/hardsuit/deathsquad) - name = "Trooper [real_name]" - desc = "That's not red paint. That's real corgi blood." + if(/obj/item/clothing/head/helmet/space/hardsuit/deathsquad) + name = "Trooper [real_name]" + desc = "That's not red paint. That's real corgi blood." - if(/obj/item/clothing/mask/gas/clown_hat) - name = "[real_name] the Clown" - desc = "Honkman's best friend." - speak = list("HONK!", "Honk!") - emote_see = list("plays tricks.", "slips.") + if(/obj/item/clothing/mask/gas/clown_hat) + name = "[real_name] the Clown" + desc = "Honkman's best friend." + speak = list("HONK!", "Honk!") + emote_see = list("plays tricks.", "slips.") + else + special_hat = 0 + + var/special_back = 0 + if(inventory_back) + special_back = 1 + switch(inventory_back.type) + if(/obj/item/clothing/suit/space/hardsuit/deathsquad) + name = "Trooper [real_name]" + desc = "That's not red paint. That's real corgi blood." + else + special_back = 0 + + if(!special_hat && !special_back) + name = real_name + desc = initial(desc) + speak = list("YAP", "Woof!", "Bark!", "AUUUUUU") + speak_emote = list("barks", "woofs") + emote_hear = list("barks", "woofs", "yaps","pants") + emote_see = list("shakes its head", "shivers") + desc = "It's a corgi." + SetLuminosity(0) + return //IAN! SQUEEEEEEEEE~ /mob/living/simple_animal/pet/dog/corgi/Ian diff --git a/code/modules/mob/living/simple_animal/friendly/drone/say.dm b/code/modules/mob/living/simple_animal/friendly/drone/say.dm index def3ad69d53..b8152458ea6 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/say.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/say.dm @@ -26,21 +26,16 @@ /mob/living/simple_animal/drone/proc/alert_drones(msg, dead_can_hear = 0) - for(var/mob/M in player_list) - var/send_msg = 0 - + for(var/W in mob_list) + var/mob/M = W if(istype(M, /mob/living/simple_animal/drone) && M.stat != DEAD) for(var/F in src.faction) if(F in M.faction) - send_msg = 1 - break - else if(dead_can_hear && (M in dead_mob_list)) - send_msg = 1 - - if(send_msg) - M << msg + M << msg + if(dead_can_hear && (M in dead_mob_list)) + M << "(F) [msg]" /mob/living/simple_animal/drone/proc/drone_chat(msg) - var/rendered = "DRONE CHAT: [name]: [msg]" + var/rendered = "DRONE CHAT: [name]: [msg]" alert_drones(rendered, 1) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index ba81f74ba29..0c5b420d407 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -7,9 +7,9 @@ response_disarm = "flails at" response_harm = "punches" icon = 'icons/mob/guardian.dmi' - icon_state = "guardianorange" - icon_living = "guardianorange" - icon_dead = "stand" + icon_state = "magicOrange" + icon_living = "magicOrange" + icon_dead = "magicOrange" speed = 0 a_intent = "harm" stop_automated_movement = 1 @@ -21,13 +21,13 @@ attacktext = "punches" maxHealth = INFINITY //The spirit itself is invincible health = INFINITY + damage_coeff = list(BRUTE = 0.5, BURN = 0.5, TOX = 0.5, CLONE = 0.5, STAMINA = 0, OXY = 0.5) //how much damage from each damage type we transfer to the owner environment_smash = 0 melee_damage_lower = 15 melee_damage_upper = 15 butcher_results = list(/obj/item/weapon/ectoplasm = 1) AIStatus = AI_OFF var/cooldown = 0 - var/damage_transfer = 1 //how much damage from each attack we transfer to the owner var/mob/living/summoner var/range = 10 //how far from the user the spirit can be var/playstyle_string = "You are a standard Guardian. You shouldn't exist!" @@ -70,7 +70,7 @@ visible_message("The [src] jumps back to its user.") loc = get_turf(summoner) -/mob/living/mob/living/simple_animal/hostile/guardian/canSuicide() +/mob/living/simple_animal/hostile/guardian/canSuicide() return 0 /mob/living/simple_animal/hostile/guardian/death() @@ -78,27 +78,25 @@ summoner << "Your [name] died somehow!" summoner.death() -/mob/living/simple_animal/hostile/guardian/adjustBruteLoss(amount) //The spirit is invincible, but passes on damage to the summoner - var/damage = amount * damage_transfer - if (summoner) +/mob/living/simple_animal/hostile/guardian/adjustHealth(amount) //The spirit is invincible, but passes on damage to the summoner + if(summoner) if(loc == summoner) return - summoner.adjustBruteLoss(damage) - if(damage) + summoner.adjustBruteLoss(amount) + if(amount) summoner << "Your [name] is under attack! You take damage!" summoner.visible_message("Blood sprays from [summoner] as [src] takes damage!") if(summoner.stat == UNCONSCIOUS) summoner << "Your body can't take the strain of sustaining [src] in this condition, it begins to fall apart!" - summoner.adjustCloneLoss(damage/2) + summoner.adjustCloneLoss(amount*0.5) //dying hosts take 50% bonus damage as cloneloss /mob/living/simple_animal/hostile/guardian/ex_act(severity, target) - switch (severity) - if (1) + switch(severity) + if(1) gib() return - if (2) + if(2) adjustBruteLoss(60) - if(3) adjustBruteLoss(30) @@ -129,10 +127,13 @@ var/input = stripped_input(src, "Please enter a message to tell your summoner.", "Guardian", "") if(!input) return + var/my_message = "[src]: [input]" for(var/mob/M in mob_list) - if(M == summoner || (M in dead_mob_list)) - M << "[src]: [input]" - src << "[src]: [input]" + if(M == summoner) + M << my_message + if(M in dead_mob_list) + M << "(F) [my_message]" + src << "[my_message]" log_say("[src.real_name]/[src.key] : [input]") /mob/living/simple_animal/hostile/guardian/proc/ToggleMode() @@ -146,13 +147,14 @@ var/input = stripped_input(src, "Please enter a message to tell your guardian.", "Message", "") if(!input) return + var/my_message = "[src]: [input]" for(var/mob/M in mob_list) if(istype (M, /mob/living/simple_animal/hostile/guardian)) var/mob/living/simple_animal/hostile/guardian/G = M if(G.summoner == src) - G << "[src]: [input]" + G << "[my_message]" else if (M in dead_mob_list) - M << "[src]: [input]" + M << "(F) [my_message]" src << "[src]: [input]" log_say("[src.real_name]/[src.key] : [text]") @@ -204,7 +206,7 @@ melee_damage_upper = 10 attack_sound = 'sound/items/Welder.ogg' attacktext = "sears" - damage_transfer = 0.8 + damage_coeff = list(BRUTE = 0.8, BURN = 0.8, TOX = 0.8, CLONE = 0.8, STAMINA = 0, OXY = 0.8) range = 10 playstyle_string = "As a Chaos type, you have only light damage resistance, but will ignite any enemy you bump into. In addition, your melee attacks will randomly teleport enemies." environment_smash = 1 @@ -252,7 +254,6 @@ /mob/living/simple_animal/hostile/guardian/punch melee_damage_lower = 20 melee_damage_upper = 20 - damage_transfer = 0.5 playstyle_string = "As a standard type you have no special abilities, but have a high damage resistance and a powerful attack capable of smashing through walls." environment_smash = 2 magic_fluff_string = "..And draw the Assistant, faceless and generic, but never to be underestimated." @@ -285,6 +286,7 @@ a_intent = "harm" friendly = "heals" speed = 0 + damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7) melee_damage_lower = 15 melee_damage_upper = 15 playstyle_string = "As a Support type, you may toggle your basic attacks to a healing mode. In addition, Alt-Clicking on an adjacent mob will warp them to your bluespace beacon after a short delay." @@ -317,7 +319,7 @@ if(toggle) a_intent = "harm" speed = 0 - damage_transfer = 0.7 + damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7) melee_damage_lower = 15 melee_damage_upper = 15 src << "You switch to combat mode." @@ -325,7 +327,7 @@ else a_intent = "help" speed = 1 - damage_transfer = 1 + damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) melee_damage_lower = 0 melee_damage_upper = 0 src << "You switch to healing mode." @@ -413,7 +415,7 @@ friendly = "quietly assesses" melee_damage_lower = 10 melee_damage_upper = 10 - damage_transfer = 0.9 + damage_coeff = list(BRUTE = 0.9, BURN = 0.9, TOX = 0.9, CLONE = 0.9, STAMINA = 0, OXY = 0.9) projectiletype = /obj/item/projectile/guardian ranged_cooldown_cap = 0 projectilesound = 'sound/effects/hit_on_shattered_glass.ogg' @@ -494,7 +496,7 @@ /mob/living/simple_animal/hostile/guardian/bomb melee_damage_lower = 15 melee_damage_upper = 15 - damage_transfer = 0.6 + damage_coeff = list(BRUTE = 0.6, BURN = 0.6, TOX = 0.6, CLONE = 0.6, STAMINA = 0, OXY = 0.6) range = 13 playstyle_string = "As an explosive type, you have only moderate close combat abilities, but are capable of converting any adjacent item into a disguised bomb via alt click." magic_fluff_string = "..And draw the Scientist, master of explosive death." @@ -634,19 +636,24 @@ user.verbs += /mob/living/proc/guardian_recall user.verbs += /mob/living/proc/guardian_reset - var/picked_name = pick("Aries", "Leo", "Sagittarius", "Taurus", "Virgo", "Capricorn", "Gemini", "Libra", "Aquarius", "Cancer", "Scorpio", "Pisces") - var/colour = pick("orange", "pink", "red", "blue", "green") - G.name = "[picked_name] [capitalize(colour)]" - G.real_name = "[picked_name] [capitalize(colour)]" - G.icon_living = "guardian[colour]" - G.icon_state = "guardian[colour]" - G.icon_dead = "guardian[colour]" - - switch (theme) + var/colour + var/picked_name + switch(theme) if("magic") user << "[G.magic_fluff_string]." + colour = pick("Pink", "Red", "Orange", "Green", "Blue") + picked_name = pick("Aries", "Leo", "Sagittarius", "Taurus", "Virgo", "Capricorn", "Gemini", "Libra", "Aquarius", "Cancer", "Scorpio", "Pisces") if("tech") user << "[G.tech_fluff_string]." + colour = pick("Rose", "Lily", "Daisy", "Zinnia", "Ivy", "Iris", "Petunia", "Violet", "Orchid") //technically not colors, just flowers that can be specific colors + picked_name = pick("Gallium", "Indium", "Thallium", "Bismuth", "Aluminium", "Mercury", "Iron", "Silver", "Zinc", "Titanium", "Chromium", "Nickel") + + G.name = "[picked_name] [colour]" + G.real_name = "[picked_name] [colour]" + G.icon_living = "[theme][colour]" + G.icon_state = "[theme][colour]" + G.icon_dead = "[theme][colour]" + G.mind.name = "[G.real_name]" /obj/item/weapon/guardiancreator/choose diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index c7328140dd9..7bf00a90da5 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -116,13 +116,11 @@ //second, spin a sticky spiderweb on this tile var/obj/effect/spider/stickyweb/W = locate() in get_turf(src) if(!W) - spawn() - Web() + Web() else //third, lay an egg cluster there if(fed) - spawn() - LayEggs() + LayEggs() else //fourthly, cocoon any nearby items so those pesky pinkskins can't use them for(var/obj/O in can_see) @@ -140,8 +138,7 @@ else if(busy == MOVING_TO_TARGET && cocoon_target) if(get_dist(src, cocoon_target) <= 1) - spawn() - Wrap() + Wrap() else busy = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index 9f4c0d7d686..d1a829a5483 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -43,6 +43,9 @@ // Changeling egg can survive in aliens! var/mob/living/carbon/C = target if(C.stat == DEAD) + if(C.status_flags & XENO_HOST) + src << "A foreign presence repels us from this body. Perhaps we should try to infest another?" + return Infect(target) src << "With our egg laid, our death approaches rapidly..." spawn(100) diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 65a603ddb9e..a7c6dff1d42 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -24,7 +24,7 @@ speak_emote = list("states") gold_core_spawnable = 1 del_on_death = 1 - loot = (/obj/effect/decal/cleanable/robot_debris) + loot = list(/obj/effect/decal/cleanable/robot_debris) /mob/living/simple_animal/hostile/hivebot/New() ..() diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index f1774d355f4..06d620caa4c 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -116,11 +116,7 @@ return 1 if(isliving(the_target)) var/mob/living/L = the_target - var/faction_check = 0 - for(var/F in faction) - if(F in L.faction) - faction_check = 1 - break + var/faction_check = faction_check(L) if(robust_searching) if(L.stat > stat_attack || L.stat != stat_attack && stat_exclusive == 1) return 0 @@ -183,7 +179,7 @@ /mob/living/simple_animal/hostile/proc/Goto(target, delay, minimum_distance) walk_to(src, target, minimum_distance, delay) -/mob/living/simple_animal/hostile/adjustBruteLoss(damage) +/mob/living/simple_animal/hostile/adjustHealth(damage) ..(damage) if(!ckey && !stat && search_objects < 3 && damage > 0)//Not unconscious, and we don't ignore mobs if(search_objects)//Turn off item searching and ignore whatever item we were looking at, we're more concerned with fight or flight diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 3db6b3e76f8..8058ef8717c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -70,7 +70,7 @@ visible_message("[src] starts to move!") attempt_open = 1 -/mob/living/simple_animal/hostile/mimic/crate/adjustBruteLoss(damage) +/mob/living/simple_animal/hostile/mimic/crate/adjustHealth(damage) trigger() ..(damage) @@ -139,7 +139,7 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca return 1 return 0 -/mob/living/simple_animal/hostile/mimic/copy/proc/CopyObject(obj/O, mob/living/creator, destroy_original = 0) +/mob/living/simple_animal/hostile/mimic/copy/proc/CopyObject(obj/O, mob/living/user, destroy_original = 0) if(destroy_original || CheckObject(O)) O.loc = src name = O.name @@ -164,8 +164,8 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca melee_damage_upper = 2 + I.force move_to_delay = 2 * I.w_class + 1 maxHealth = health - if(creator) - creator = creator + if(user) + creator = user faction += "\ref[creator]" // very unique if(destroy_original) qdel(O) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 0842a2062af..29ae2bad90d 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -181,7 +181,7 @@ visible_message("The [P.name] was repelled by [src.name]'s girth!") return -/mob/living/simple_animal/hostile/asteroid/goldgrub/adjustBruteLoss(damage) +/mob/living/simple_animal/hostile/asteroid/goldgrub/adjustHealth(damage) idle_vision_range = 9 ..() @@ -374,6 +374,8 @@ /mob/living/simple_animal/hostile/asteroid/goliath/OpenFire() var/tturf = get_turf(target) + if(!(istype(tturf, /turf/simulated))) + return if(get_dist(src, target) <= 7)//Screen range check, so you can't get tentacle'd offscreen visible_message("The [src.name] digs its tentacles under [target.name]!") new /obj/effect/goliath_tentacle/original(tturf) @@ -382,7 +384,7 @@ pre_attack = 0 return -/mob/living/simple_animal/hostile/asteroid/goliath/adjustBruteLoss(damage) +/mob/living/simple_animal/hostile/asteroid/goliath/adjustHealth(damage) ranged_cooldown-- handle_preattack() ..() @@ -522,7 +524,7 @@ Inflate() ..() -/mob/living/simple_animal/hostile/asteroid/fugu/adjustBruteLoss(var/damage) +/mob/living/simple_animal/hostile/asteroid/fugu/adjustHealth(var/damage) if(wumbo) return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index fe593390418..03dbb7e29b6 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -61,7 +61,7 @@ deathmessage = "[src] fainted." ..() -/mob/living/simple_animal/hostile/mushroom/adjustBruteLoss(damage)//Possibility to flee from a fight just to make it more visually interesting +/mob/living/simple_animal/hostile/mushroom/adjustHealth(damage)//Possibility to flee from a fight just to make it more visually interesting if(!retreat_distance && prob(33)) retreat_distance = 5 spawn(30) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm index 5c4a4621da0..f2c009f2c3b 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm @@ -51,7 +51,7 @@ H.enemies |= enemies return 0 -/mob/living/simple_animal/hostile/retaliate/adjustBruteLoss(damage) +/mob/living/simple_animal/hostile/retaliate/adjustHealth(damage) ..(damage) if(stat == CONSCIOUS) Retaliate() diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm index 074a40e85ed..79fa9969b17 100644 --- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm +++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm @@ -60,8 +60,8 @@ icon_state = "templar" icon_living = "templar" icon_dead = "templar_dead" - maxHealth = 125 - health = 125 + maxHealth = 150 + health = 150 speed = 2 gold_core_spawnable = 0 speak_chance = 1 @@ -75,16 +75,6 @@ /obj/item/clothing/head/helmet/knight/templar, /obj/item/weapon/claymore/hog{name = "holy sword"}) -/mob/living/simple_animal/hostile/skeleton/templar/bullet_act(obj/item/projectile/Proj) - if(!Proj) - return - if(prob(50)) - if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - src.health -= Proj.damage - else - visible_message("[src] blocks [Proj] with its sword!") - return 0 - /mob/living/simple_animal/hostile/skeleton/ice name = "ice skeleton" desc = "A reanimated skeleton protected by a thick sheet of natural ice armor. Looks slow, though." diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 2d04aee5fdc..8b07a7caa40 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -117,7 +117,7 @@ // This loop will, at most, loop twice. for(var/atom/check in check_list) for(var/mob/living/M in viewers(world.view + 1, check) - src) - if(M.client && CanAttack(M) && !issilicon(M)) + if(M.client && CanAttack(M) && !M.has_unlimited_silicon_privilege) if(!M.eye_blind) return M for(var/obj/mecha/M in view(world.view + 1, check)) //assuming if you can see them they can see you diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm index 6a5397ad05c..b80dc417ad7 100644 --- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm +++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm @@ -87,7 +87,7 @@ if(grasping.len < max_grasps) for(var/mob/living/L in range(grasp_range,src)) - if(L == src) + if(L == src || faction_check(L)) continue if(!(L in grasping) && L != target && prob(grasp_chance)) L << "\the [src] has you entangled!" diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index fbb1d8fc11a..805156d5c13 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -281,25 +281,31 @@ Proj.on_hit(src) return 0 +/mob/living/simple_animal/proc/adjustHealth(amount) + if(status_flags & GODMODE) + return 0 + bruteloss = Clamp(bruteloss + amount, 0, maxHealth) + handle_regular_status_updates() + /mob/living/simple_animal/adjustBruteLoss(amount) if(damage_coeff[BRUTE]) - ..(amount*damage_coeff[BRUTE]) + adjustHealth(amount*damage_coeff[BRUTE]) /mob/living/simple_animal/adjustFireLoss(amount) if(damage_coeff[BURN]) - adjustBruteLoss(amount*damage_coeff[BURN]) + adjustHealth(amount*damage_coeff[BURN]) /mob/living/simple_animal/adjustOxyLoss(amount) if(damage_coeff[OXY]) - adjustBruteLoss(amount*damage_coeff[OXY]) + adjustHealth(amount*damage_coeff[OXY]) /mob/living/simple_animal/adjustToxLoss(amount) if(damage_coeff[TOX]) - ..(amount*damage_coeff[TOX]) + adjustHealth(amount*damage_coeff[TOX]) /mob/living/simple_animal/adjustCloneLoss(amount) if(damage_coeff[CLONE]) - ..(amount*damage_coeff[CLONE]) + adjustHealth(amount*damage_coeff[CLONE]) /mob/living/simple_animal/adjustStaminaLoss(amount) return diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 082296dcaf2..ed176d9aa3c 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -27,7 +27,7 @@ player_list |= src update_Login_details() world.update_status() - + client.images = null //remove the images such as AIs being unable to see runes client.screen = list() //remove hud items just in case if(hud_used) qdel(hud_used) //remove the hud objects @@ -37,7 +37,8 @@ sight |= SEE_SELF ..() - + if (key != client.key) + key = client.key if(loc && !isturf(loc)) client.eye = loc client.perspective = EYE_PERSPECTIVE diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 71ee78b16e6..377ddabf388 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -40,108 +40,94 @@ var/next_mob_id = 0 if(gas[MOLES]) t+="[gas[GAS_NAME]]: [gas[MOLES]] \n" - usr.show_message(t, 1) + usr << t -/mob/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2) +/mob/proc/show_message(msg, type, alt_msg, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2) - if(!client) return + if(!client) + return msg = copytext(msg, 1, MAX_MESSAGE_LEN) - if (type) - if(type & 1 && (disabilities & BLIND || paralysis) )//Vision related - if (!( alt )) + if(type) + if(type & 1 && eye_blind )//Vision related + if(!alt_msg) return else - msg = alt + msg = alt_msg type = alt_type - if (type & 2 && ear_deaf)//Hearing related - if (!( alt )) + + if(type & 2 && ear_deaf)//Hearing related + if(!alt_msg) return else - msg = alt + msg = alt_msg type = alt_type - if ((type & 1 && disabilities & BLIND)) + if(type & 1 && eye_blind) return - // Added voice muffling for Issue 41. - if(stat == UNCONSCIOUS || sleeping > 0) - src << "... You can almost hear someone talking ..." + // voice muffling + if(stat == UNCONSCIOUS) + if(type & 2) //audio + src << "... You can almost hear something ..." else src << msg - return -// Show a message to all mobs who sees the src mob and the src mob itself +// Show a message the src mob and to all player mobs who sees the src mob // This would be for visible actions by the src mob // message is the message output to anyone who can see e.g. "[src] does something!" // self_message (optional) is what the src mob sees e.g. "You do something!" // blind_message (optional) is what blind people will hear e.g. "You hear something!" /mob/visible_message(message, self_message, blind_message) - var/list/mob_viewers = list() - var/list/possible_viewers = list() - mob_viewers |= src - mob_viewers |= viewers(src) - var/heard = get_hear(7, src) - for(var/atom/movable/A in heard) - possible_viewers |= recursive_hear_check(A) - for(var/mob/B in possible_viewers) - if(B in mob_viewers) + var/turf/T = get_turf(src) + if(!T) + return + for(var/mob/M in get_hearers_in_view(7, src)) + if(!M.client) continue - if(isturf(B.loc)) - continue - var/turf/T = get_turf(B) - if(src in view(T)) - mob_viewers |= B - - for(var/mob/M in mob_viewers) - if(M.see_invisible < invisibility) - continue //can't view the invisible var/msg = message - if(self_message && M==src) - msg = self_message - M.show_message(msg, 1) + if(M == src) //the src always see the main message or self message + if(self_message) + msg = self_message + else + if(M.see_invisible 1 || diag)) - step(M, get_dir(M.loc, mob.loc)) + if(M)//Mob may get deleted during parent call + if (isturf(M.loc)) + var/diag = get_dir(mob, M) + if ((diag - 1) & diag) + else + diag = null + if ((get_dist(mob, M) > 1 || diag)) + step(M, get_dir(M.loc, mob.loc)) else for(var/mob/M in L) M.other_mobs = 1 @@ -275,13 +276,12 @@ else return L.loc = locate(locx,locy,mobloc.z) - spawn(0) - var/limit = 2//For only two trailing shadows. - for(var/turf/T in getline(mobloc, L.loc)) - spawn(0) - anim(T,L,'icons/mob/mob.dmi',,"shadow",,L.dir) - limit-- - if(limit<=0) break + var/limit = 2//For only two trailing shadows. + for(var/turf/T in getline(mobloc, L.loc)) + spawn(0) + anim(T,L,'icons/mob/mob.dmi',,"shadow",,L.dir) + limit-- + if(limit<=0) break else spawn(0) anim(mobloc,mob,'icons/mob/mob.dmi',,"shadow",,L.dir) @@ -305,43 +305,40 @@ ///For moving in space ///Return 1 for movement 0 for none /mob/Process_Spacemove(movement_dir = 0) - if(..()) return 1 + var/atom/movable/backup = get_spacemove_backup() + if(backup) + if(istype(backup) && movement_dir && !backup.anchored) + if(backup.newtonian_move(turn(movement_dir, 180))) //You're pushing off something movable, so it moves + src << "You push off of [backup] to propel yourself." + return 1 + return 0 +/mob/get_spacemove_backup() var/atom/movable/dense_object_backup - for(var/atom/A in orange(1, get_turf(src))) + for(var/A in orange(1, get_turf(src))) if(isarea(A)) continue - else if(isturf(A)) var/turf/turf = A if(istype(turf,/turf/space)) continue - if(!turf.density && !mob_negates_gravity()) continue - - return 1 - + return A else var/atom/movable/AM = A if(AM == buckled) //Kind of unnecessary but let's just be sure continue if(!AM.CanPass(src) || AM.density) if(AM.anchored) - return 1 + return AM if(pulling == AM) continue dense_object_backup = AM - - if(movement_dir && dense_object_backup) - if(dense_object_backup.newtonian_move(turn(movement_dir, 180))) //You're pushing off something movable, so it moves - src << "You push off of [dense_object_backup] to propel yourself." - - - return 1 - return 0 + break + . = dense_object_backup /mob/proc/mob_has_gravity(turf/T) return has_gravity(src, T) diff --git a/code/modules/ninja/ninja_event.dm b/code/modules/ninja/ninja_event.dm index e4b60e7d420..fda579af7ef 100644 --- a/code/modules/ninja/ninja_event.dm +++ b/code/modules/ninja/ninja_event.dm @@ -76,37 +76,64 @@ Contents: else if(M.assigned_role in command_positions) possible_targets[M] = 1 //good-guy -/* - Alright, so, if I had my way I'd axe all this retarded bullshit entirely, but I know some people would complain because - porting ninja specifics to the random gen system would go horribly. I can at the very least axe 99% of the autism - and make ninja code slightly more bearable. - - Iamgoofball -*/ var/list/objectives = list(1,2,3,4) - while(Mind.objectives.len < 6) //still not enough objectives! // WHY DOES THIS CALL FOR 6 OBJECTIVES - switch(pick_n_take(objectives)) // BUT THEN PREVENT YOU FROM GETTING 4 IN THE END + while(Mind.objectives.len < 6) //still not enough objectives! + switch(pick_n_take(objectives)) if(1) //research - add_objective(Mind, /datum/objective/download) + var/datum/objective/download/O = new /datum/objective/download() + O.owner = Mind + O.gen_amount_goal() + Mind.objectives += O if(2) //steal - add_objective(Mind, /datum/objective/default/steal/special) + var/datum/objective/steal/special/O = new /datum/objective/steal/special() + O.owner = Mind + Mind.objectives += O if(3) //protect/kill - if(prob(50)) - add_objective(Mind, /datum/objective/default/assassinate) - else - add_objective(Mind, /datum/objective/default/protect) + if(!possible_targets.len) continue + var/selected = rand(1,possible_targets.len) + var/datum/mind/M = possible_targets[selected] + var/is_bad_guy = possible_targets[M] + possible_targets.Cut(selected,selected+1) + + if(is_bad_guy ^ helping_station) //kill (good-ninja + bad-guy or bad-ninja + good-guy) + var/datum/objective/assassinate/O = new /datum/objective/assassinate() + O.owner = Mind + O.target = M + O.explanation_text = "Slay \the [M.current.real_name], the [M.assigned_role]." + Mind.objectives += O + else //protect + var/datum/objective/protect/O = new /datum/objective/protect() + O.owner = Mind + O.target = M + O.explanation_text = "Protect \the [M.current.real_name], the [M.assigned_role], from harm." + Mind.objectives += O if(4) //debrain/capture - if(prob(50)) - add_objective(Mind, /datum/objective/default/debrain) - else - add_objective(Mind, /datum/objective/capture) + if(!possible_targets.len) continue + var/selected = rand(1,possible_targets.len) + var/datum/mind/M = possible_targets[selected] + var/is_bad_guy = possible_targets[M] + possible_targets.Cut(selected,selected+1) + + if(is_bad_guy ^ helping_station) //debrain (good-ninja + bad-guy or bad-ninja + good-guy) + var/datum/objective/debrain/O = new /datum/objective/debrain() + O.owner = Mind + O.target = M + O.explanation_text = "Steal the brain of [M.current.real_name]." + Mind.objectives += O + else //capture + var/datum/objective/capture/O = new /datum/objective/capture() + O.owner = Mind + O.gen_amount_goal() + Mind.objectives += O else break //Add a survival objective since it's usually broad enough for any round type. - add_objective(Mind, /datum/objective/escape_obj/survive) - + var/datum/objective/O = new /datum/objective/survive() + O.owner = Mind + Mind.objectives += O //add some RP-fluff Mind.store_memory("I am an elite mercenary assassin of the mighty Spider Clan. A SPACE NINJA!") diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 3d3e32b5b10..3edf26b56e8 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -131,6 +131,12 @@ desc = "A polaroid camera, some say it can see ghosts!" see_ghosts = 1 +/obj/item/device/camera/detective + name = "Detective's camera" + desc = "A polaroid camera with extra capacity for crime investigations." + pictures_max = 30 + pictures_left = 30 + /obj/item/device/camera/siliconcam //camera AI can take pictures with name = "silicon photo camera" diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index a53171e4621..890bd432e16 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -597,7 +597,9 @@ interact(user) /obj/machinery/power/apc/attack_alien(mob/living/carbon/alien/humanoid/user) - if(!user) return + if(!user) + return + user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) user.visible_message("[user.name] slashes at the [src.name]!", "You slash at the [src.name]!") playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) @@ -626,10 +628,11 @@ else ui_interact(user) -/obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", var/datum/tgui/ui = null, force_open = 0) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ + datum/tgui/master_ui = null, datum/ui_state/state = default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) - ui = new(user, src, ui_key, "apc", name, 460, 515) + ui = new(user, src, ui_key, "apc", name, 535, 515, master_ui, state) ui.open() /obj/machinery/power/apc/get_ui_data(mob/user) @@ -878,28 +881,6 @@ point.the_disk = null //the pinpointer will go back to pointing at the nuke disc. -/obj/machinery/power/apc/proc/ion_act() - //intended to be exactly the same as an AI malf attack - if(!src.malfhack && src.z == ZLEVEL_STATION) - if(prob(3)) - src.locked = 1 - if (src.cell.charge > 0) -// world << "\red blew APC in [src.loc.loc]" - src.cell.charge = 0 - cell.corrupt() - src.malfhack = 1 - update_icon() - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(1, src.loc) - smoke.attach(src) - smoke.start() - var/datum/effect_system/spark_spread/s = new - s.set_up(3, 1, src) - s.start() - visible_message("The [src.name] suddenly lets out a blast of smoke and some sparks!", \ - "You hear sizzling electronics.") - - /obj/machinery/power/apc/surplus() if(terminal) return terminal.surplus() diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index b2ca9ae4a1b..9a021cd1b4e 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -468,6 +468,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list ( \ item_state = "coil_red" max_amount = MAXCOIL amount = MAXCOIL + merge_type = /obj/item/stack/cable_coil // This is here to let its children merge between themselves item_color = "red" desc = "A coil of power cable." throwforce = 0 diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index a3c1db86c33..34f3a6de8eb 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -365,18 +365,18 @@ return A.master.lightswitch && A.master.power_light /obj/machinery/light/proc/flicker(var/amount = rand(10, 20)) + set waitfor = 0 if(flickering) return flickering = 1 - spawn(0) - if(on && status == LIGHT_OK) - for(var/i = 0; i < amount; i++) - if(status != LIGHT_OK) break - on = !on - update(0) - sleep(rand(5, 15)) - on = (status == LIGHT_OK) + if(on && status == LIGHT_OK) + for(var/i = 0; i < amount; i++) + if(status != LIGHT_OK) break + on = !on update(0) - flickering = 0 + sleep(rand(5, 15)) + on = (status == LIGHT_OK) + update(0) + flickering = 0 // ai attack - make lights flicker, because why not @@ -539,13 +539,13 @@ // explode the light /obj/machinery/light/proc/explode() + set waitfor = 0 var/turf/T = get_turf(src.loc) - spawn(0) - broken() // break it first to give a warning - sleep(2) - explosion(T, 0, 0, 2, 2) - sleep(1) - qdel(src) + broken() // break it first to give a warning + sleep(2) + explosion(T, 0, 0, 2, 2) + sleep(1) + qdel(src) // the light item // can be tube or bulb subtypes diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index aa748fbbf03..7aaebff4269 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -93,9 +93,6 @@ user.Stun(stun) user.Weaken(10) user.electrocute_act(shock_damage, src, 1) - user.visible_message("[user.name] was shocked by the [src.name]!", \ - "You feel a powerful shock course through your body, sending you flying!", \ - "You hear a heavy electrical crack.") else if(issilicon(user)) if(prob(20)) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 9d0238fba71..86419280ba7 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -158,8 +158,9 @@ terminal.dismantle(user) //crowbarring it ! + var/turf/T = get_turf(src) if(default_deconstruction_crowbar(I)) - message_admins("[src] has been deconstructed by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) + message_admins("[src] has been deconstructed by [key_name_admin(user)](?) (FLW) in ([T.x],[T.y],[T.z] - JMP)",0,1) log_game("[src] has been deconstructed by [key_name(user)]") investigate_log("SMES deconstructed by [key_name(user)]","singulo") @@ -329,10 +330,11 @@ return ui_interact(user) -/obj/machinery/power/smes/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/power/smes/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ + datum/tgui/master_ui = null, datum/ui_state/state = default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) - ui = new(user, src, ui_key, "smes", name, 340, 440) + ui = new(user, src, ui_key, "smes", name, 340, 440, master_ui, state) ui.open() /obj/machinery/power/smes/get_ui_data() @@ -442,4 +444,4 @@ #undef SMES_OUTPUTTING #undef SMES_NOT_OUTPUTTING #undef SMES_INPUTTING -#undef SMES_INPUT_ATTEMPT \ No newline at end of file +#undef SMES_INPUT_ATTEMPT diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index f138b106657..f18c4aeb26c 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -369,10 +369,11 @@ return ui_interact(user) -/obj/machinery/power/solar_control/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/power/solar_control/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ + datum/tgui/master_ui = null, datum/ui_state/state = default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) - ui = new(user, src, ui_key, "solar_control", name, 465, 400) + ui = new(user, src, ui_key, "solar_control", name, 465, 400, master_ui, state) ui.open() /obj/machinery/power/solar_control/get_ui_data() diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index e1e2018779e..8c32c860c1e 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -13,7 +13,8 @@ var/list/blacklisted_tesla_types = list(/obj/machinery/atmospherics, /obj/structure/particle_accelerator/power_box, /obj/structure/particle_accelerator/end_cap, /obj/machinery/field/containment, - /obj/structure/disposalpipe) + /obj/structure/disposalpipe, + /obj/machinery/gateway) /obj/singularity/energy_ball name = "energy ball" @@ -44,7 +45,7 @@ var/list/blacklisted_tesla_types = list(/obj/machinery/atmospherics, move_the_basket_ball(amount_to_move) pixel_x = 0 pixel_y = 0 - playsound(src.loc, 'sound/magic/lightningbolt.ogg', 100, 1, extrarange = 5) + playsound(src.loc, 'sound/magic/lightningbolt.ogg', 100, 1, extrarange = 15) tesla_zap(src, 7, what_does_the_scouter_say_about_the_balls_power_level) pixel_x = -32 pixel_y = -32 @@ -69,7 +70,7 @@ var/list/blacklisted_tesla_types = list(/obj/machinery/atmospherics, /obj/singularity/energy_ball/proc/handle_energy() if(energy >= 300) energy -= 300 - playsound(src.loc, 'sound/magic/lightning_chargeup.ogg', 100, 1, extrarange = 5) + playsound(src.loc, 'sound/magic/lightning_chargeup.ogg', 100, 1, extrarange = 15) spawn(100) var/obj/singularity/energy_ball/EB = new(loc) orbiting_balls.Add(EB) @@ -80,8 +81,7 @@ var/list/blacklisted_tesla_types = list(/obj/machinery/atmospherics, var/orbitsize = (I.Width()+I.Height())*pick(0.5,0.6,0.7) orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25) - spawn(1) - EB.orbit(src,orbitsize, pick(FALSE,TRUE), rand(10,25), pick(3,4,5,6,36)) + EB.orbit(src,orbitsize, pick(FALSE,TRUE), rand(10,25), pick(3,4,5,6,36)) @@ -114,7 +114,7 @@ var/list/blacklisted_tesla_types = list(/obj/machinery/atmospherics, return closest_atom /proc/tesla_zap(var/atom/source, zap_range = 3, power) - if(power < 500) + if(power < 1000) return var/list/tesla_coils = list() var/list/grounding_rods = list() diff --git a/code/modules/procedural mapping/mapGenerator.dm b/code/modules/procedural mapping/mapGenerator.dm index f421b1db0ee..ce6b5a18c89 100644 --- a/code/modules/procedural mapping/mapGenerator.dm +++ b/code/modules/procedural mapping/mapGenerator.dm @@ -38,7 +38,6 @@ if(replace) undefineRegion() - map |= block(Start,End) return map diff --git a/code/modules/procedural mapping/mapGenerators/lava_river.dm b/code/modules/procedural mapping/mapGenerators/lava_river.dm new file mode 100644 index 00000000000..124868557d9 --- /dev/null +++ b/code/modules/procedural mapping/mapGenerators/lava_river.dm @@ -0,0 +1,18 @@ +/datum/mapGenerator/lavaland + var/start_z = 5 + modules = list(/datum/mapGeneratorModule/river) + +/datum/mapGenerator/lavaland/defineRegion(turf/Start, turf/End, replace = 0) + start_z = Start.z + ..() + +/datum/mapGeneratorModule/river + var/river_type = /turf/simulated/floor/plating/lava/smooth + var/river_nodes = 4 + var/start_z = 5 + +/datum/mapGeneratorModule/river/generate() + if(istype(mother, /datum/mapGenerator/lavaland)) + var/datum/mapGenerator/lavaland/L = mother + start_z = L.start_z + spawn_rivers(start_z, river_nodes, river_type) diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index a7d14066c38..0430ef12f13 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -1,5 +1,6 @@ /obj/item/ammo_box/a357 name = "speed loader (.357)" + desc = "Designed to quickly reload revolvers." icon_state = "357" ammo_type = /obj/item/ammo_casing/a357 max_ammo = 7 @@ -7,6 +8,7 @@ /obj/item/ammo_box/c38 name = "speed loader (.38)" + desc = "Designed to quickly reload revolvers." icon_state = "38" ammo_type = /obj/item/ammo_casing/c38 max_ammo = 6 diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index ea35c457cb9..a5ff5364b5e 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -154,6 +154,7 @@ /obj/item/ammo_box/magazine/m10mm name = "pistol magazine (10mm)" + desc = "A gun magazine." icon_state = "9x19p" origin_tech = "combat=2" ammo_type = /obj/item/ammo_casing/c10mm @@ -272,6 +273,7 @@ obj/item/ammo_box/magazine/tommygunm45 /obj/item/ammo_box/magazine/m12g name = "shotgun magazine (12g slugs)" + desc = "A drum magazine." icon_state = "m12gb" ammo_type = /obj/item/ammo_casing/shotgun origin_tech = "combat=3;syndicate=1" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 51e0a7822be..6d6a36df584 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -105,8 +105,7 @@ /obj/item/weapon/gun/proc/shoot_live_shot(mob/living/user as mob|obj, pointblank = 0, mob/pbtarget = null, message = 1) if(recoil) - spawn() - shake_camera(user, recoil + 1, recoil) + shake_camera(user, recoil + 1, recoil) if(suppressed) playsound(user, fire_sound, 10, 1) diff --git a/code/modules/projectiles/guns/grenade_launcher.dm b/code/modules/projectiles/guns/grenade_launcher.dm index 2c38f1b8c85..3c4657947d6 100644 --- a/code/modules/projectiles/guns/grenade_launcher.dm +++ b/code/modules/projectiles/guns/grenade_launcher.dm @@ -41,7 +41,7 @@ return if(grenades.len) - spawn(0) fire_grenade(target,user) + fire_grenade(target,user) else usr << "The grenade launcher is empty." @@ -51,7 +51,7 @@ var/obj/item/weapon/grenade/chem_grenade/F = grenades[1] //Now with less copypasta! grenades -= F F.loc = user.loc - F.throw_at(target, 30, 2,user) + F.throw_at_fast(target, 30, 2,user) message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") log_game("[key_name(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") F.active = 1 diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 80f135be1ba..681db297fc3 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -37,7 +37,6 @@ if(istype(AM, mag_type)) if(magazine) user << "You perform a tactical reload on \the [src], replacing the magazine." - user.say(pick("I'M RELOADING!!!", "NEW MAG IN!!!", "CHANGING MAG!!!", "COVER ME! I'M RELOADING!!!", "RELOADING!!!")) magazine.loc = get_turf(src.loc) magazine.update_icon() magazine = null @@ -233,4 +232,4 @@ fire_sound = 'sound/weapons/Gunshot_smg.ogg' can_suppress = 0 burst_size = 3 - fire_delay = 1 + fire_delay = 1 \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index ee8f3198a85..5d5bd451982 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -217,6 +217,7 @@ sawn_desc = "I'm just here for the gasoline." unique_rename = 0 unique_reskin = 0 + var/slung = 0 /obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/attackby(obj/item/A, mob/user, params) ..() @@ -226,11 +227,18 @@ slot_flags = SLOT_BACK icon_state = "ishotgunsling" user << "You tie the lengths of cable to the shotgun, making a sling." + slung = 1 update_icon() else user << "You need at least ten lengths of cable if you want to make a sling!" return +/obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/update_icon() + ..() + if (slung && (slot_flags & SLOT_BELT) ) + slung = 0 + icon_state = "ishotgun-sawn" + // Sawing guns related procs // /obj/item/weapon/gun/projectile/proc/blow_up(mob/user) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 7cf1c1ba5b2..c3a3cedada1 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -122,18 +122,18 @@ /obj/item/projectile/proc/fire() - spawn(1) - while(loc) - if(!paused) - if((!( current ) || loc == current)) - current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z) - step_towards(src, current) - if(original && (original.layer>=2.75) || ismob(original)) - if(loc == get_turf(original)) - if(!(original in permutated)) - Bump(original, 1) - Range() - sleep(1) + set waitfor = 0 + while(loc) + if(!paused) + if((!( current ) || loc == current)) + current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z) + step_towards(src, current) + if(original && (original.layer>=2.75) || ismob(original)) + if(loc == get_turf(original)) + if(!(original in permutated)) + Bump(original, 1) + Range() + sleep(1) /obj/item/projectile/Crossed(atom/movable/AM) //A mob moving on a tile with a projectile is hit by it. diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index e26987c1e31..5a30450ea97 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -77,24 +77,25 @@ var/const/INJECT = 5 //injection if(current_list_element > reagent_list.len) current_list_element = 1 var/datum/reagent/current_reagent = reagent_list[current_list_element] - src.remove_reagent(current_reagent.id, 1) + remove_reagent(current_reagent.id, 1) current_list_element++ total_transfered++ - src.update_total() + update_total() handle_reactions() return total_transfered /datum/reagents/proc/remove_all(amount = 1) - var/part = amount / src.total_volume - for (var/datum/reagent/current_reagent in src.reagent_list) - var/current_reagent_transfer = current_reagent.volume * part - src.remove_reagent(current_reagent.id, current_reagent_transfer) + if(total_volume > 0) + var/part = amount / total_volume + for(var/datum/reagent/current_reagent in reagent_list) + var/current_reagent_transfer = current_reagent.volume * part + remove_reagent(current_reagent.id, current_reagent_transfer) - src.update_total() - src.handle_reactions() - return amount + update_total() + handle_reactions() + return amount /datum/reagents/proc/get_master_reagent_name() var/the_name = null diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index cb9f8e0894e..d5784519bed 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -85,10 +85,11 @@ return ui_interact(user) -/obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ + datum/tgui/master_ui = null, datum/ui_state/state = default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) - ui = new(user, src, ui_key, "chem_dispenser", name, 412, 600) + ui = new(user, src, ui_key, "chem_dispenser", name, 550, 550, master_ui, state) ui.open() /obj/machinery/chem_dispenser/get_ui_data() @@ -129,11 +130,9 @@ switch(action) if("amount") - amount = round(text2num(params["amount"]), 5) // round to nearest 5 - if (amount < 0) // Since the user can actually type the commands himself, some sanity checking - amount = 0 - if (amount > 100) - amount = 100 + var/amount = text2num(params["amount"]) + if(amount in beaker.possible_transfer_amounts) + src.amount = amount if("dispense") if(beaker && dispensable_reagents.Find(params["reagent"])) var/datum/reagents/R = beaker.reagents diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index eacd2fba7e9..c44489ff699 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -96,10 +96,11 @@ return ui_interact(user) -/obj/machinery/chem_heater/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open = force_open) +/obj/machinery/chem_heater/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ + datum/tgui/master_ui = null, datum/ui_state/state = default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if (!ui) - ui = new(user, src, ui_key, "chem_heater", name, 275, 400) + ui = new(user, src, ui_key, "chem_heater", name, 275, 400, master_ui, state) ui.open() /obj/machinery/chem_heater/get_ui_data() diff --git a/code/modules/reagents/chemistry/reagents/blob_reagents.dm b/code/modules/reagents/chemistry/reagents/blob_reagents.dm index 4704c01e251..ebb389a9482 100644 --- a/code/modules/reagents/chemistry/reagents/blob_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/blob_reagents.dm @@ -334,15 +334,15 @@ if(!X.anchored) var/distance = get_dist(X, pull) var/moving_power = max(range_power - distance, 1) - spawn(0) - if(moving_power > 2) //if the vortex is powerful and we're close, we get thrown - if(setting_type) - var/atom/throw_target = get_edge_target_turf(X, get_dir(X, get_step_away(X, pull))) - var/throw_range = 5 - distance - X.throw_at(throw_target, throw_range, 1) - else - X.throw_at(pull, distance, 1) + if(moving_power > 2) //if the vortex is powerful and we're close, we get thrown + if(setting_type) + var/atom/throw_target = get_edge_target_turf(X, get_dir(X, get_step_away(X, pull))) + var/throw_range = 5 - distance + X.throw_at_fast(throw_target, throw_range, 1) else + X.throw_at_fast(pull, distance, 1) + else + spawn(0) if(setting_type) for(var/i in 0 to moving_power-1) sleep(2) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 39986a13f8f..2f624d883d2 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -362,8 +362,14 @@ H.visible_message("[H] falls to the ground and screams as their skin bubbles and froths!") //'froths' sounds painful when used with SKIN. H.Weaken(3) sleep(30) - var/list/blacklisted_species = list(/datum/species/zombie, /datum/species/skeleton, /datum/species/human, /datum/species/golem, /datum/species/golem/adamantine, /datum/species/shadow, /datum/species/shadow/ling, /datum/species/plasmaman) - var/list/possible_morphs = subtypesof(/datum/species/) - blacklisted_species + //var/list/blacklisted_species = list( + + var/list/possible_morphs = list() + for(var/type in subtypesof(/datum/species)) + var/datum/species/S = type + if(initial(S.blacklisted)) + continue + possible_morphs += S var/datum/species/mutation = pick(possible_morphs) if(prob(90) && mutation && H.dna.species != /datum/species/golem && H.dna.species != /datum/species/golem/adamantine) H << "The pain subsides. You feel... different." diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index 366ca9e7403..c03e3cf066f 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -70,14 +70,14 @@ var/list/chemical_mob_spawn_nicecritters = list() // and possible friendly mobs if(!X.anchored) var/distance = get_dist(X, T) var/moving_power = max(range - distance, 1) - spawn(0) //so everything moves at the same time. - if(moving_power > 2) //if the vortex is powerful and we're close, we get thrown - if(setting_type) - var/atom/throw_target = get_edge_target_turf(X, get_dir(X, get_step_away(X, T))) - X.throw_at(throw_target, moving_power, 1) - else - X.throw_at(T, moving_power, 1) + if(moving_power > 2) //if the vortex is powerful and we're close, we get thrown + if(setting_type) + var/atom/throw_target = get_edge_target_turf(X, get_dir(X, get_step_away(X, T))) + X.throw_at_fast(throw_target, moving_power, 1) else + X.throw_at_fast(T, moving_power, 1) + else + spawn(0) //so everything moves at the same time. if(setting_type) for(var/i = 0, i < moving_power, i++) sleep(2) diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index aa84460deb4..cbc3d93db26 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -100,10 +100,9 @@ /datum/chemical_reaction/slimecrit/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently !"), 1) + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The slime extract begins to vibrate violently !") spawn(50) - chemical_mob_spawn(holder, 5, "Gold Slime") /datum/chemical_reaction/slimecritlesser @@ -117,10 +116,9 @@ /datum/chemical_reaction/slimecritlesser/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently !"), 1) + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The slime extract begins to vibrate violently !") spawn(50) - chemical_mob_spawn(holder, 3, "Lesser Gold Slime", "neutral") /datum/chemical_reaction/slimecritfriendly @@ -134,10 +132,9 @@ /datum/chemical_reaction/slimecritfriendly/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate adorably !"), 1) + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The slime extract begins to vibrate adorably !") spawn(50) - chemical_mob_spawn(holder, 1, "Friendly Gold Slime", "neutral") //Silver @@ -262,8 +259,8 @@ /datum/chemical_reaction/slimefreeze/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently !"), 1) + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The slime extract begins to vibrate adorably !") spawn(50) if(holder && holder.my_atom) playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) @@ -310,8 +307,8 @@ /datum/chemical_reaction/slimefire/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently !"), 1) + var/turf/TU = get_turf(holder.my_atom) + TU.visible_message("The slime extract begins to vibrate adorably !") spawn(50) if(holder && holder.my_atom) var/turf/simulated/T = get_turf(holder.my_atom) @@ -359,8 +356,8 @@ /datum/chemical_reaction/slimeglow/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime begins to emit a soft light. Squeezing it will cause it to grow brightly."), 1) + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The slime begins to emit a soft light. Squeezing it will cause it to grow brightly.") var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime F.loc = get_turf(holder.my_atom) @@ -438,8 +435,7 @@ feedback_add_details("slime_cores_used","[type]") for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null)) slime.rabid = 1 - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The [slime] is driven into a frenzy!"), 1) + slime.visible_message("The [slime] is driven into a frenzy!") /datum/chemical_reaction/slimespeed @@ -498,8 +494,8 @@ /datum/chemical_reaction/slimeexplosion/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently !"), 1) + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The slime extract begins to vibrate violently !") spawn(50) if(holder && holder.my_atom) explosion(get_turf(holder.my_atom), 1 ,3, 6) diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index eb72b18724f..524348b117c 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -104,15 +104,15 @@ use_power(100) affecting = loc.contents - src // moved items will be all in loc - spawn(1) // slight delay to prevent infinite propagation due to map order //TODO: please no spawn() in process(). It's a very bad idea - var/items_moved = 0 - for(var/atom/movable/A in affecting) - if(!A.anchored) - if(A.loc == src.loc) // prevents the object from being affected if it's not currently here. - step(A,movedir) - items_moved++ - if(items_moved >= 10) - break + sleep(1) // slight delay to prevent infinite propagation due to map order + var/items_moved = 0 + for(var/atom/movable/A in affecting) + if(!A.anchored) + if(A.loc == src.loc) // prevents the object from being affected if it's not currently here. + step(A,movedir) + items_moved++ + if(items_moved >= 10) + break // attack with item, place item on conveyor /obj/machinery/conveyor/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/recycling/disposal-structures.dm b/code/modules/recycling/disposal-structures.dm index 24e12478be0..d818c88567c 100644 --- a/code/modules/recycling/disposal-structures.dm +++ b/code/modules/recycling/disposal-structures.dm @@ -62,13 +62,13 @@ loc = D.trunk active = 1 dir = DOWN - spawn(1) - move() // spawn off the movement process + move() return // movement process, persists while holder is moving through pipes /obj/structure/disposalholder/proc/move() + set waitfor = 0 var/obj/structure/disposalpipe/last while(active) var/obj/structure/disposalpipe/curr = loc diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 346264b7354..eac5a5259e0 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -170,28 +170,25 @@ if(!linked_console) dat += "Scan for R&D Console
" if(loaded_item) - if(recentlyExperimented) - dat += "The [src] is still resetting!" - else - dat += "Loaded Item: [loaded_item]
" - dat += "Technology:
" - var/list/D = ConvertReqString2List(loaded_item.origin_tech) - for(var/T in D) - dat += "[T]
" - dat += "

Available tests:" - dat += "
Poke" - dat += "
Irradiate" - dat += "
Gas" - dat += "
Burn" - dat += "
Freeze" - dat += "
Destroy
" - if(istype(loaded_item,/obj/item/weapon/relic)) - dat += "
Discover
" - dat += "
Eject" + dat += "Loaded Item: [loaded_item]
" + dat += "Technology:
" + var/list/D = ConvertReqString2List(loaded_item.origin_tech) + for(var/T in D) + dat += "[T]
" + dat += "

Available tests:" + dat += "
Poke" + dat += "
Irradiate" + dat += "
Gas" + dat += "
Burn" + dat += "
Freeze" + dat += "
Destroy
" + if(istype(loaded_item,/obj/item/weapon/relic)) + dat += "
Discover
" + dat += "
Eject" else dat += "Nothing loaded." dat += "
Refresh
" - dat += "
Close
" + dat += "
Close
" var/datum/browser/popup = new(user, "experimentor","Experimentor", 700, 400, src) popup.set_content(dat) popup.open() @@ -340,7 +337,7 @@ warn_admins(usr, "[chosenchem] smoke") investigate_log("Experimentor has released [chosenchem] smoke!", "experimentor") if(prob(EFFECT_PROB_LOW-badThingCoeff)) - visible_message("[src] malfunctions, spewing harmless gas.>") + visible_message("[src] malfunctions, spewing harmless gas.") throwSmoke(src.loc) if(prob(EFFECT_PROB_MEDIUM-badThingCoeff)) visible_message("[src] melts [exp_on], ionizing the air around it!") @@ -544,8 +541,9 @@ var/scantype = href_list["function"] var/obj/item/process = locate(href_list["item"]) in src - if(scantype == "close") + if(href_list["close"]) usr << browse(null, "window=experimentor") + return else if(scantype == "search") var/obj/machinery/computer/rdconsole/D = locate(/obj/machinery/computer/rdconsole) in oview(3,src) if(D) @@ -558,6 +556,14 @@ if(recentlyExperimented) usr << "[src] has been used too recently!" return + else if(!loaded_item) + updateUsrDialog() //Set the interface to unloaded mode + usr << "[src] is not currently loaded!" + return + else if(!process || process != loaded_item) //Interface exploit protection (such as hrefs or swapping items with interface set to old item) + updateUsrDialog() //Refresh interface to update interface hrefs + usr << "Interface failure detected in [src]. Please try again." + return var/dotype if(text2num(scantype) == SCANTYPE_DISCOVER) dotype = SCANTYPE_DISCOVER @@ -571,8 +577,7 @@ for(var/T in temp_tech) linked_console.files.UpdateTech(T, temp_tech[T]) linked_console.files.UpdateDesigns(process,process.type) - if(scantype != "close") - src.updateUsrDialog() + src.updateUsrDialog() return //~~~~~~~~Admin logging proc, aka the Powergamer Alarm~~~~~~~~ diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 8c3330b9045..4b8839d20e1 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -374,7 +374,7 @@ //close open doors if(istype(O, /obj/machinery/door)) var/obj/machinery/door/Door = O - spawn(-1) + spawn(0) if(Door) Door.close() else if (istype(AM,/mob)) @@ -385,11 +385,10 @@ //docking turbulence if(M.client) - spawn(0) - if(M.buckled) - shake_camera(M, 2, 1) // turn it down a bit come on - else - shake_camera(M, 7, 1) + if(M.buckled) + shake_camera(M, 2, 1) // turn it down a bit come on + else + shake_camera(M, 7, 1) if(istype(M, /mob/living/carbon)) if(!M.buckled) M.Weaken(3) @@ -444,7 +443,7 @@ if(T) var/obj/machinery/door/Door = locate() in T if(Door) - spawn(-1) + spawn(0) Door.close() /obj/docking_port/mobile/proc/roadkill(list/L, dir, x, y) @@ -532,6 +531,7 @@ var/shuttleId var/possible_destinations = "" var/admin_controlled + var/no_destination_swap = 0 /obj/machinery/computer/shuttle/New(location, obj/item/weapon/circuitboard/shuttle/C) ..() @@ -578,6 +578,11 @@ return if(href_list["move"]) + if(no_destination_swap) + var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId) + if(M.mode != SHUTTLE_IDLE) + usr << "Shuttle already in transit." + return switch(SSshuttle.moveShuttle(shuttleId, href_list["move"], 1)) if(0) usr << "Shuttle received message and will be sent shortly." if(1) usr << "Invalid shuttle requested." diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm index 1efa5cee8fe..bb447fa8847 100644 --- a/code/modules/tgui/external.dm +++ b/code/modules/tgui/external.dm @@ -17,9 +17,7 @@ * optional master_ui datum/tgui The parent UI. * optional state datum/ui_state The state used to determine status. **/ -/atom/movable/proc/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, \ - force_open = 0, datum/tgui/master_ui = null, \ - datum/ui_state/state = default_state) +/datum/proc/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state) return -1 // Sorta implemented. /** @@ -32,7 +30,7 @@ * * return list Data to be sent to the UI. **/ -/atom/movable/proc/get_ui_data(mob/user) +/datum/proc/get_ui_data(mob/user) return list() // Not implemented. @@ -47,7 +45,7 @@ * * return bool If the UI should be updated or not. **/ -/atom/movable/proc/ui_act(action, list/params) +/datum/proc/ui_act(action, list/params) return // Not implemented. @@ -55,9 +53,10 @@ * private * * The UI's host object (usually src_object). - * Used internally by ui_state(s). + * This allows modules/datums to have the UI attached to them, + * and be a part of another object. **/ -/atom/proc/ui_host() +/datum/proc/ui_host() return src /** @@ -75,21 +74,17 @@ * * required uiref ref The UI that was closed. **/ -/client/verb/uiclose(uiref as text) +/client/verb/uiclose(ref as text) // Name the verb, and hide it from the user panel. set name = "uiclose" set hidden = 1 // Get the UI based on the ref. - var/datum/tgui/ui = locate(uiref) + var/datum/tgui/ui = locate(ref) // If we found the UI, close it. if(istype(ui)) ui.close() - // If there is a custom ref, call that atom's Topic(). - if(ui.ref) - var/href = "close=1" - src.Topic(href, params2list(href), ui.ref) - // Otherwise, if we use the legacy logic, unset the mob's machine. - else if(src && src.mob) + // Unset machine just to be sure. + if(src && src.mob) src.mob.unset_machine() \ No newline at end of file diff --git a/code/modules/tgui/states/admin.dm b/code/modules/tgui/states/admin.dm index c9a3bb467c4..62e18bb6b96 100644 --- a/code/modules/tgui/states/admin.dm +++ b/code/modules/tgui/states/admin.dm @@ -6,7 +6,7 @@ /var/global/datum/ui_state/admin_state/admin_state = new() -/datum/ui_state/admin_state/can_use_topic(atom/movable/src_object, mob/user) +/datum/ui_state/admin_state/can_use_topic(src_object, mob/user) if(check_rights_for(user.client, R_ADMIN)) return UI_INTERACTIVE return UI_CLOSE diff --git a/code/modules/tgui/states/conscious.dm b/code/modules/tgui/states/conscious.dm index 1b781a458d7..9a5c1a5e54f 100644 --- a/code/modules/tgui/states/conscious.dm +++ b/code/modules/tgui/states/conscious.dm @@ -6,7 +6,7 @@ /var/global/datum/ui_state/conscious_state/conscious_state = new() -/datum/ui_state/conscious_state/can_use_topic(atom/movable/src_object, mob/user) +/datum/ui_state/conscious_state/can_use_topic(src_object, mob/user) if(user.stat == CONSCIOUS) return UI_INTERACTIVE return UI_CLOSE diff --git a/code/modules/tgui/states/contained.dm b/code/modules/tgui/states/contained.dm index 20cda3241e0..6cb88abea28 100644 --- a/code/modules/tgui/states/contained.dm +++ b/code/modules/tgui/states/contained.dm @@ -6,7 +6,7 @@ /var/global/datum/ui_state/contained_state/contained_state = new() -/datum/ui_state/contained_state/can_use_topic(atom/movable/src_object, mob/user) +/datum/ui_state/contained_state/can_use_topic(atom/src_object, mob/user) if(!src_object.contains(user)) return UI_CLOSE return user.shared_ui_interaction(src_object) diff --git a/code/modules/tgui/states/deep_inventory.dm b/code/modules/tgui/states/deep_inventory.dm index 4fef9ad5b3c..70f2a59992e 100644 --- a/code/modules/tgui/states/deep_inventory.dm +++ b/code/modules/tgui/states/deep_inventory.dm @@ -1,12 +1,12 @@ /** * tgui state: deep_inventory_state * - * Checks that the src_object is in the user's fist-level (backpack, webbing, etc) inventory. + * Checks that the src_object is in the user's deep (backpack, box, toolbox, etc) inventory. **/ /var/global/datum/ui_state/deep_inventory_state/deep_inventory_state = new() -/datum/ui_state/deep_inventory_state/can_use_topic(atom/movable/src_object, mob/user) +/datum/ui_state/deep_inventory_state/can_use_topic(src_object, mob/user) if(!user.contains(src_object)) return UI_CLOSE return user.shared_ui_interaction(src_object) diff --git a/code/modules/tgui/states/default.dm b/code/modules/tgui/states/default.dm index 8e1c3e8dec9..56ec71b7cc8 100644 --- a/code/modules/tgui/states/default.dm +++ b/code/modules/tgui/states/default.dm @@ -6,20 +6,20 @@ /var/global/datum/ui_state/default/default_state = new() -/datum/ui_state/default/can_use_topic(atom/movable/src_object, mob/user) +/datum/ui_state/default/can_use_topic(src_object, mob/user) return user.default_can_use_topic(src_object) // Call the individual mob-overriden procs. -/mob/proc/default_can_use_topic(atom/movable/src_object) +/mob/proc/default_can_use_topic(src_object) return UI_CLOSE // Don't allow interaction by default. -/mob/living/default_can_use_topic(atom/movable/src_object) +/mob/living/default_can_use_topic(src_object) . = shared_ui_interaction(src_object) - if(. > UI_CLOSE) - . = min(., shared_living_ui_distance(src_object)) // Check the distance... + if(. > UI_CLOSE && loc) + . = min(., loc.contents_ui_distance(src_object, src)) // Check the distance... if(. == UI_INTERACTIVE) // Non-human living mobs can only look, not touch. return UI_UPDATE -/mob/living/carbon/human/default_can_use_topic(atom/movable/src_object) +/mob/living/carbon/human/default_can_use_topic(src_object) . = shared_ui_interaction(src_object) if(. > UI_CLOSE) . = min(., shared_living_ui_distance(src_object)) // Check the distance... @@ -27,7 +27,7 @@ if(prob(getBrainLoss())) return UI_UPDATE -/mob/living/silicon/robot/default_can_use_topic(atom/movable/src_object) +/mob/living/silicon/robot/default_can_use_topic(src_object) . = shared_ui_interaction(src_object) if(. <= UI_DISABLED) return @@ -37,7 +37,7 @@ return UI_INTERACTIVE return UI_DISABLED // Otherwise they can keep the UI open. -/mob/living/silicon/ai/default_can_use_topic(atom/movable/src_object) +/mob/living/silicon/ai/default_can_use_topic(src_object) . = shared_ui_interaction(src_object) if(. < UI_INTERACTIVE) return @@ -47,12 +47,12 @@ return UI_INTERACTIVE return UI_CLOSE -/mob/living/simple_animal/drone/default_can_use_topic(atom/movable/src_object) +/mob/living/simple_animal/drone/default_can_use_topic(src_object) . = shared_ui_interaction(src_object) if(. > UI_CLOSE) . = min(., shared_living_ui_distance(src_object)) // Drones can only use things they're near. -/mob/living/silicon/pai/default_can_use_topic(atom/movable/src_object) +/mob/living/silicon/pai/default_can_use_topic(src_object) // pAIs can only use themselves and the owner's radio. if((src_object == src || src_object == radio) && !stat) return UI_INTERACTIVE diff --git a/code/modules/tgui/states/hands.dm b/code/modules/tgui/states/hands.dm index 536a90597e4..11b1c021cc2 100644 --- a/code/modules/tgui/states/hands.dm +++ b/code/modules/tgui/states/hands.dm @@ -6,15 +6,15 @@ /var/global/datum/ui_state/hands_state/hands_state = new() -/datum/ui_state/hands_state/can_use_topic(atom/movable/src_object, mob/user) +/datum/ui_state/hands_state/can_use_topic(src_object, mob/user) . = user.shared_ui_interaction(src_object) if(. > UI_CLOSE) return min(., user.hands_can_use_topic(src_object)) -/mob/proc/hands_can_use_topic(atom/movable/src_object) +/mob/proc/hands_can_use_topic(src_object) return UI_CLOSE -/mob/living/hands_can_use_topic(atom/movable/src_object) +/mob/living/hands_can_use_topic(src_object) if(src_object in get_both_hands(src)) return UI_INTERACTIVE return UI_CLOSE \ No newline at end of file diff --git a/code/modules/tgui/states/inventory.dm b/code/modules/tgui/states/inventory.dm index a5f7233f00d..02870296338 100644 --- a/code/modules/tgui/states/inventory.dm +++ b/code/modules/tgui/states/inventory.dm @@ -6,7 +6,7 @@ /var/global/datum/ui_state/inventory_state/inventory_state = new() -/datum/ui_state/inventory_state/can_use_topic(atom/movable/src_object, mob/user) +/datum/ui_state/inventory_state/can_use_topic(src_object, mob/user) if(!(src_object in user)) return UI_CLOSE return user.shared_ui_interaction(src_object) diff --git a/code/modules/tgui/states/notcontained.dm b/code/modules/tgui/states/notcontained.dm index 8df75b57626..0b6462fe331 100644 --- a/code/modules/tgui/states/notcontained.dm +++ b/code/modules/tgui/states/notcontained.dm @@ -6,21 +6,21 @@ /var/global/datum/ui_state/notcontained_state/notcontained_state = new() -/datum/ui_state/notcontained_state/can_use_topic(atom/movable/src_object, mob/user) +/datum/ui_state/notcontained_state/can_use_topic(atom/src_object, mob/user) . = user.shared_ui_interaction(src_object) if(. > UI_CLOSE) return min(., user.notcontained_can_use_topic(src_object)) -/mob/proc/notcontained_can_use_topic(atom/movable/src_object) +/mob/proc/notcontained_can_use_topic(src_object) return UI_CLOSE -/mob/living/notcontained_can_use_topic(atom/movable/src_object) +/mob/living/notcontained_can_use_topic(atom/src_object) if(src_object.contains(src)) return UI_CLOSE // Close if we're inside it. return default_can_use_topic(src_object) -/mob/living/silicon/notcontained_can_use_topic(atom/movable/src_object) +/mob/living/silicon/notcontained_can_use_topic(src_object) return default_can_use_topic(src_object) // Silicons use default bevhavior. -/mob/living/simple_animal/drone/notcontained_can_use_topic(atom/movable/src_object) +/mob/living/simple_animal/drone/notcontained_can_use_topic(src_object) return default_can_use_topic(src_object) // Drones use default bevhavior. diff --git a/code/modules/tgui/states/physical.dm b/code/modules/tgui/states/physical.dm index a3fae3b276e..5cbcae97f7c 100644 --- a/code/modules/tgui/states/physical.dm +++ b/code/modules/tgui/states/physical.dm @@ -6,16 +6,16 @@ /var/global/datum/ui_state/physical/physical_state = new() -/datum/ui_state/physical/can_use_topic(atom/movable/src_object, mob/user) +/datum/ui_state/physical/can_use_topic(src_object, mob/user) . = user.shared_ui_interaction(src_object) if(. > UI_CLOSE) return min(., user.physical_can_use_topic(src_object)) -/mob/proc/physical_can_use_topic(atom/movable/src_object) +/mob/proc/physical_can_use_topic(src_object) return UI_CLOSE -/mob/living/physical_can_use_topic(atom/movable/src_object) +/mob/living/physical_can_use_topic(src_object) return shared_living_ui_distance(src_object) -/mob/living/silicon/physical_can_use_topic(atom/movable/src_object) +/mob/living/silicon/physical_can_use_topic(src_object) return max(UI_UPDATE, shared_living_ui_distance(src_object)) // Silicons can always see. diff --git a/code/modules/tgui/states/self.dm b/code/modules/tgui/states/self.dm index edb7c3ef300..b08fe373c6a 100644 --- a/code/modules/tgui/states/self.dm +++ b/code/modules/tgui/states/self.dm @@ -6,7 +6,7 @@ /var/global/datum/ui_state/self_state/self_state = new() -/datum/ui_state/self_state/can_use_topic(atom/movable/src_object, mob/user) +/datum/ui_state/self_state/can_use_topic(src_object, mob/user) if(src_object != user) return UI_CLOSE return user.shared_ui_interaction(src_object) diff --git a/code/modules/tgui/states/states.dm b/code/modules/tgui/states/states.dm index 195d9394e3e..799ae542d81 100644 --- a/code/modules/tgui/states/states.dm +++ b/code/modules/tgui/states/states.dm @@ -7,22 +7,22 @@ /** * public * - * Checks if a user can use src_object's UI, under the given state. + * Checks the UI state for a mob. * * required user mob The mob who opened/is using the UI. * required state datum/ui_state The state to check. * * return UI_state The state of the UI. **/ -/atom/proc/ui_state(mob/user, datum/ui_state/state) +/datum/proc/ui_status(mob/user, datum/ui_state/state) var/src_object = ui_host() if(istype(user, /mob/dead/observer)) // Special-case ghosts. - if(check_rights_for(user.client, R_ADMIN)) + if(IsAdminGhost(user)) return UI_INTERACTIVE // Admins can interact anyway. - if(get_dist(src_object, src) > user.client.view) - return UI_CLOSE // Keep ghosts from opening too many UIs. - return UI_UPDATE // Ghosts can only view. + if(get_dist(src_object, src) < user.client.view) + return UI_UPDATE // Keep ghosts from opening too many UIs. + return UI_CLOSE // Ghosts can only view. return state.can_use_topic(src_object, user) // Check if the state allows interaction. /** @@ -31,12 +31,12 @@ * Checks if a user can use src_object's UI, and returns the state. * Can call a mob proc, which allows overrides for each mob. * - * required src_object atom/movable The object which owns the UI. + * required src_object datum The object/datum which owns the UI. * required user mob The mob who opened/is using the UI. * * return UI_state The state of the UI. **/ -/datum/ui_state/proc/can_use_topic(atom/movable/src_object, mob/user) +/datum/ui_state/proc/can_use_topic(src_object, mob/user) return UI_CLOSE // Don't allow interaction by default. @@ -47,7 +47,7 @@ * * return UI_state The state of the UI. **/ -/mob/proc/shared_ui_interaction(atom/movable/src_object) +/mob/proc/shared_ui_interaction(src_object) if(!client || stat) // Close UIs if mindless or dead/unconcious. return UI_CLOSE // Update UIs if incapicitated but concious. @@ -55,19 +55,19 @@ return UI_UPDATE return UI_INTERACTIVE -/mob/living/carbon/human/shared_ui_interaction(atom/movable/src_object) +/mob/living/carbon/human/shared_ui_interaction(src_object) // If we have telekinesis and remain close enough, allow interaction. if(dna.check_mutation(TK)) if(tkMaxRangeCheck(src, src_object)) return UI_INTERACTIVE return ..() -/mob/living/silicon/ai/shared_ui_interaction(atom/movable/src_object) +/mob/living/silicon/ai/shared_ui_interaction(src_object) if(lacks_power()) // Close UIs if the AI is unpowered. return UI_CLOSE return ..() -/mob/living/silicon/robot/shared_ui_interaction(atom/movable/src_object) +/mob/living/silicon/robot/shared_ui_interaction(src_object) if(cell.charge <= 0) // Close UIs if the Borg is unpowered. return UI_CLOSE if(lockcharge) // Disable UIs if the Borg is locked. @@ -81,12 +81,12 @@ * Really only used for checks outside the context of a mob. * Otherwise, use shared_living_ui_distance(). * - * required src_object atom/movable The object which owns the UI. + * required src_object The object which owns the UI. * required user mob The mob who opened/is using the UI. * * return UI_state The state of the UI. **/ -/atom/proc/contents_ui_distance(atom/movable/src_object, mob/living/user) +/atom/proc/contents_ui_distance(src_object, mob/living/user) return user.shared_living_ui_distance(src_object) // Just call this mob's check. /** diff --git a/code/modules/tgui/states/zlevel.dm b/code/modules/tgui/states/zlevel.dm index 2f06f36c8f8..1871980a82a 100644 --- a/code/modules/tgui/states/zlevel.dm +++ b/code/modules/tgui/states/zlevel.dm @@ -6,7 +6,7 @@ /var/global/datum/ui_state/z_state/z_state = new() -/datum/ui_state/z_state/can_use_topic(atom/movable/src_object, mob/user) +/datum/ui_state/z_state/can_use_topic(src_object, mob/user) var/turf/turf_obj = get_turf(src_object) var/turf/turf_usr = get_turf(user) if(!turf_obj || !turf_usr || !(turf_obj.z == turf_usr.z)) diff --git a/code/modules/tgui/subsystem.dm b/code/modules/tgui/subsystem.dm index 14b4dd5f7e5..ffa7082bcf7 100644 --- a/code/modules/tgui/subsystem.dm +++ b/code/modules/tgui/subsystem.dm @@ -10,23 +10,19 @@ * Get a open UI given a user, src_object, and ui_key and try to update it with data. * * required user mob The mob who opened/is using the UI. - * required src_object atom/movable The object which owns the UI. + * required src_object datum The object/datum which owns the UI. * required ui_key string The ui_key of the UI. * optional ui datum/tgui The UI to be updated, if it exists. - * optional data list The data to update the UI with, if it exists. * optional force_open bool If the UI should be re-opened instead of updated. * * return datum/tgui The found UI. **/ -/datum/subsystem/tgui/proc/try_update_ui(mob/user, atom/movable/src_object, ui_key, datum/tgui/ui, \ - list/data = null, force_open = 0) - if(!data) - data = src_object.get_ui_data(user) - +/datum/subsystem/tgui/proc/try_update_ui(mob/user, datum/src_object, ui_key, datum/tgui/ui, force_open = 0) if(isnull(ui)) // No UI was passed, so look for one. ui = get_open_ui(user, src_object, ui_key) if(!isnull(ui)) + var/data = src_object.get_ui_data(user) // Get data from the src_object. if(!force_open) // UI is already open; update it. ui.push_data(data) else // Re-open it anyways. @@ -41,12 +37,12 @@ * Get a open UI given a user, src_object, and ui_key. * * required user mob The mob who opened/is using the UI. - * required src_object atom/movable The object which owns the UI. + * required src_object datum The object/datum which owns the UI. * required ui_key string The ui_key of the UI. * * return datum/tgui The found UI. **/ -/datum/subsystem/tgui/proc/get_open_ui(mob/user, atom/movable/src_object, ui_key) +/datum/subsystem/tgui/proc/get_open_ui(mob/user, datum/src_object, ui_key) var/src_object_key = "\ref[src_object]" if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) return null // No UIs open. @@ -64,11 +60,11 @@ * * Update all UIs attached to src_object. * - * required src_object atom/movable The object which owns the UIs. + * required src_object datum The object/datum which owns the UIs. * * return int The number of UIs updated. **/ -/datum/subsystem/tgui/proc/update_uis(atom/movable/src_object) +/datum/subsystem/tgui/proc/update_uis(datum/src_object) var/src_object_key = "\ref[src_object]" if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) return 0 // Couldn't find any UIs for this object. @@ -86,11 +82,11 @@ * * Close all UIs attached to src_object. * - * required src_object atom/movable The object which owns the UIs. + * required src_object datum The object/datum which owns the UIs. * * return int The number of UIs closed. **/ -/datum/subsystem/tgui/proc/close_uis(atom/movable/src_object) +/datum/subsystem/tgui/proc/close_uis(datum/src_object) var/src_object_key = "\ref[src_object]" if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) return 0 // Couldn't find any UIs for this object. @@ -109,12 +105,12 @@ * Update all UIs belonging to a user. * * required user mob The mob who opened/is using the UI. - * optional src_object atom/movable If provided, only update UIs belonging this atom. + * optional src_object datum If provided, only update UIs belonging this src_object. * optional ui_key string If provided, only update UIs with this UI key. * * return int The number of UIs updated. **/ -/datum/subsystem/tgui/proc/update_user_uis(mob/user, atom/movable/src_object = null, ui_key = null) +/datum/subsystem/tgui/proc/update_user_uis(mob/user, datum/src_object = null, ui_key = null) if(isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0) return 0 // Couldn't find any UIs for this user. @@ -131,12 +127,12 @@ * Close all UIs belonging to a user. * * required user mob The mob who opened/is using the UI. - * optional src_object atom/movable If provided, only update UIs belonging this atom. - * optional ui_key string If provided, only update UIs with this UI key. + * optional src_object datum If provided, only close UIs belonging this src_object. + * optional ui_key string If provided, only close UIs with this UI key. * * return int The number of UIs closed. **/ -/datum/subsystem/tgui/proc/close_user_uis(mob/user, atom/movable/src_object = null, ui_key = null) +/datum/subsystem/tgui/proc/close_user_uis(mob/user, datum/src_object = null, ui_key = null) if(isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0) return 0 // Couldn't find any UIs for this user. diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm index 8cc69f3145e..21fb88de03c 100644 --- a/code/modules/tgui/tgui.dm +++ b/code/modules/tgui/tgui.dm @@ -9,7 +9,7 @@ **/ /datum/tgui var/mob/user // The mob who opened/is using the UI. - var/atom/movable/src_object // The object which owns the UI. + var/datum/src_object // The object which owns the UI. var/title // The title of te UI. var/ui_key // The ui_key of the UI. This allows multiple UIs for one src_object. var/window_id // The window_id for browse() and onclose(). @@ -24,7 +24,6 @@ "can_close" = 1, "auto_format" = 0 ) - var/atom/ref = null // An extra ref to call when the window is closed. var/style = "nanotrasen" // The style to be used for this UI. var/interface // The interface (template) to be used for this UI. var/auto_update = 1 // Update the UI every MC tick. @@ -40,22 +39,18 @@ * Create a new UI. * * required user mob The mob who opened/is using the UI. - * required src_object atom/movable The object which owns the UI. + * required src_object datum The object or datum which owns the UI. * required ui_key string The ui_key of the UI. * required interface string The interface used to render the UI. * optional title string The title of the UI. * optional width int The window width. * optional height int The window height. - * optional ref atom An extra ref to use when the window is closed. * optional master_ui datum/tgui The parent UI. * optional state datum/ui_state The state used to determine status. * * return datum/tgui The requested UI. **/ -/datum/tgui/New(mob/user, atom/movable/src_object, ui_key, interface, \ - title, width = 0, height = 0, \ - atom/ref = null, datum/tgui/master_ui = null, \ - datum/ui_state/state = default_state) +/datum/tgui/New(mob/user, datum/src_object, ui_key, interface, title, width = 0, height = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state) src.user = user src.src_object = src_object src.ui_key = ui_key @@ -70,9 +65,6 @@ if(height) src.height = height - if(ref) - src.ref = ref - src.master_ui = master_ui if(master_ui) master_ui.children += src @@ -85,27 +77,25 @@ * public * * Open this UI (and initialize it with data). - * - * optional data list The data to intialize the UI with. **/ -/datum/tgui/proc/open(list/data = null) +/datum/tgui/proc/open() + set waitfor = 0 // Don't wait on sleep()s. if(!user.client) return // Bail if there is no client. update_status(push = 0) // Update the window status. if(status == UI_CLOSE) - return // Bail if we should close. + return // Bail if we're not supposed to open. if(!initial_data) - if(!data) // If we don't have initial_data and data was not passed, get data from the src_object. - data = src_object.get_ui_data(user) - set_initial_data(data) // Otherwise use the passed data. + set_initial_data(src_object.get_ui_data(user)) // Get the UI data. var/window_size = "" if(width && height) // If we have a width and height, use them. window_size = "size=[width]x[height];" - user << browse(get_html(), "window=[window_id];[window_size][list2params(window_options)]") // Open the window. + var/debugable = check_rights_for(user.client, R_DEBUG) + user << browse(get_html(debugable), "window=[window_id];[window_size][list2params(window_options)]") // Open the window. winset(user, window_id, "on-close=\"uiclose \ref[src]\"") // Instruct the client to signal UI when the window is closed. SStgui.on_open(src) @@ -135,6 +125,9 @@ SStgui.on_close(src) for(var/datum/tgui/child in children) // Loop through and close all children. child.close() + children.Cut() + state = null + master_ui = null /** * public @@ -192,11 +185,19 @@ * * Generate HTML for this UI. * + * optional bool inline If the JSON should be inlined into the HTML (for debugging). + * * return string UI HTML output. **/ -/datum/tgui/proc/get_html() - // Poplate HTML with JSON. - return replacetextEx(SStgui.html, "{}", get_json(initial_data)) +/datum/tgui/proc/get_html(var/inline) + var/html + // Poplate HTML with JSON if we're supposed to inline. + if(inline) + html = replacetextEx(SStgui.basehtml, "{}", get_json(initial_data)) + else + html = SStgui.basehtml + html = replacetextEx(html, "\[ref]", "\ref[src]") + return html /** * private @@ -207,19 +208,20 @@ **/ /datum/tgui/proc/get_config_data() var/list/config_data = list( - "title" = title, - "status" = status, - "style" = style, - "interface" = interface, - "fancy" = user.client.prefs.tgui_fancy, - "window" = window_id, - "ref" = "\ref[src]", - "user" = list( - "name" = user.name, - "ref" = "\ref[user]" + "title" = title, + "status" = status, + "style" = style, + "interface" = interface, + "fancy" = user.client.prefs.tgui_fancy, + "locked" = user.client.prefs.tgui_lock, + "window" = window_id, + "ref" = "\ref[src]", + "user" = list( + "name" = user.name, + "ref" = "\ref[user]" ), - "srcObject" = list( - "name" = src_object.name, + "srcObject" = list( + "name" = "[src_object]", "ref" = "\ref[src_object]" ) ) @@ -239,6 +241,7 @@ json_data["config"] = get_config_data() if(!isnull(data)) json_data["data"] = data + json_data["adata"] = data // Generate the JSON; replace bad characters. var/json = JSON.stringify(json_data) @@ -254,14 +257,29 @@ * If the src_object's ui_act() returns 1, update all UIs attacked to it. **/ /datum/tgui/Topic(href, href_list) + var/action = href_list["action"] + var/params = href_list; params -= "action" + + // Handle any special actions. + switch(action) + if("tgui:initialize") + user << output(url_encode(get_json(initial_data)), "[window_id].browser:initialize") + return + if("tgui:link") + user << link(params["url"]) + return + if("tgui:fancy") + user.client.prefs.tgui_fancy = TRUE + return + if("tgui:nofrills") + user.client.prefs.tgui_fancy = FALSE + return + update_status(push = 0) // Update the window state. if(status != UI_INTERACTIVE || user != usr) return // If UI is not interactive or usr calling Topic is not the UI user. - var/action = href_list["action"] // Pull the action out. - href_list -= "action" - - var/update = src_object.ui_act(action, href_list, state) // Call ui_act() on the src_object. + var/update = src_object.ui_act(action, params, state) // Call ui_act() on the src_object. if(src_object && update) SStgui.update_uis(src_object) // If we have a src_object and its ui_act() told us to update. @@ -296,8 +314,8 @@ if(status <= UI_DISABLED && !force) return // Cannot update UI, we have no visibility. - // Send the new JSON to the recieveUpdate() Javascript function. - user << output(url_encode(get_json(data)), "[window_id].browser:receiveUpdate") + // Send the new JSON to the update() Javascript function. + user << output(url_encode(get_json(data)), "[window_id].browser:update") /** @@ -319,14 +337,14 @@ * optional push bool Push an update to the UI (an update is always sent for UI_DISABLED). **/ /datum/tgui/proc/update_status(push = 0) - var/new_status = src_object.ui_state(user, state) + var/obj/host = src_object.ui_host() + var/status = host.ui_status(user, state) if(master_ui) - new_status = min(new_status, master_ui.status) + status = min(status, master_ui.status) - if(new_status == UI_CLOSE) + set_status(status, push) + if(status == UI_CLOSE) close() - else - set_status(new_status, push) /** * private diff --git a/code/modules/tooltip/tooltip.dm b/code/modules/tooltip/tooltip.dm index eb306655402..1ef38cf1383 100644 --- a/code/modules/tooltip/tooltip.dm +++ b/code/modules/tooltip/tooltip.dm @@ -96,7 +96,7 @@ Notes: //Open a tooltip for user, at a location based on params -//Theme is a CSS class in tooltip.html, by default this wrapper chooses a CSS class based on the user's UI_style (Midnight, Plasmafire, Retro) +//Theme is a CSS class in tooltip.html, by default this wrapper chooses a CSS class based on the user's UI_style (Midnight, Plasmafire, Retro, etc) //Includes sanity.checks /proc/openToolTip(mob/user = null, atom/movable/tip_src = null, params = null,title = "",content = "",theme = "") if(istype(user)) diff --git a/code/modules/tooltip/tooltip.html b/code/modules/tooltip/tooltip.html index 04a471d4559..78eb9cdd880 100644 --- a/code/modules/tooltip/tooltip.html +++ b/code/modules/tooltip/tooltip.html @@ -61,6 +61,12 @@ .retro .wrap {border-color: #005E00;} .retro .content {color: #003366; border-color: #005E00; background-color: #00BD00;} + + .slimecore .wrap {border-color: #18640E;} + .slimecore .content {color: #6EA161; border-color: #11450B; background-color: #354E35;} + + .operative .wrap {border-color: #A10000;} + .operative .content {color: #0F0B0C; border-color: #610002; background-color: #382626;} @@ -220,4 +226,4 @@ }; - \ No newline at end of file + diff --git a/html/changelog.html b/html/changelog.html index 5c85c074aeb..da0d7966f63 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,47 @@ -->
+

13 January 2016

+

Joan updated:

+
    +
  • Alien whisper ability has a new icon
  • +
+

MrStonedOne updated:

+
    +
  • Control clicking on the thing you are pulling will no longer unpull, instead control clicking on anything too far away to be pulled will unpull. (reminder that the delete key also unpulls)
  • +
+

OneArmedYeti updated:

+
    +
  • To help with colorblindness, gang HUDs have been changed so leaders have a border and normal gangster icons are smaller.
  • +
+ +

11 January 2016

+

Joan updated:

+
    +
  • Blob cores and nodes no longer cause normal pulsed blobs to animate. Factories and resource nodes will still animate.
  • +
  • Holoparasite sprites have been updated again, are now named after silvery metals and flowers and can also be colored purple, blue or yellow.
  • +
+

xxalpha updated:

+
    +
  • Pipes and cables under walls, intact floors, grilles and reinforced windows will now be shielded from explosions until exposed.
  • +
+ +

09 January 2016

+

Wjohnston updated:

+
    +
  • AI Satellite has been remapped to make it more secure.
  • +
+ +

07 January 2016

+

KorPhaeron updated:

+
    +
  • Doubled cost of Lesser Summon Guns to 4 and increased charge time to 75 seconds.
  • +
+

TrustyGun updated:

+
    +
  • Added two new UI styles: black and green Operative and pale green Slimecore.
  • +
+

02 January 2016

Kor updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 973982dae38..c7b6338025c 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -3189,3 +3189,31 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. in hopes of someone competent receiving it, unfortunately, your station was the only one to respond. Local security forces may not be welcoming your arrival group with open arms. +2016-01-07: + KorPhaeron: + - tweak: Doubled cost of Lesser Summon Guns to 4 and increased charge time to 75 + seconds. + TrustyGun: + - rscadd: 'Added two new UI styles: black and green Operative and pale green Slimecore.' +2016-01-09: + Wjohnston: + - wip: AI Satellite has been remapped to make it more secure. +2016-01-11: + Joan: + - rscdel: Blob cores and nodes no longer cause normal pulsed blobs to animate. Factories + and resource nodes will still animate. + - imageadd: Holoparasite sprites have been updated again, are now named after silvery + metals and flowers and can also be colored purple, blue or yellow. + xxalpha: + - tweak: Pipes and cables under walls, intact floors, grilles and reinforced windows + will now be shielded from explosions until exposed. +2016-01-13: + Joan: + - imageadd: Alien whisper ability has a new icon + MrStonedOne: + - tweak: Control clicking on the thing you are pulling will no longer unpull, instead + control clicking on anything too far away to be pulled will unpull. (reminder + that the delete key also unpulls) + OneArmedYeti: + - imageadd: To help with colorblindness, gang HUDs have been changed so leaders + have a border and normal gangster icons are smaller. diff --git a/html/changelogs/AutoChangeLog-pr-14594.yml b/html/changelogs/AutoChangeLog-pr-14594.yml new file mode 100644 index 00000000000..04f138537a0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14594.yml @@ -0,0 +1,4 @@ +author: Kor +delete-after: True +changes: + - rscadd: "Washing machines are activated via alt+click rather than a right click verb." diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi index c114de2421e..4f06d9fca78 100644 Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ diff --git a/icons/mob/corgi_back.dmi b/icons/mob/corgi_back.dmi index 616d8ab2061..26fb3771e15 100644 Binary files a/icons/mob/corgi_back.dmi and b/icons/mob/corgi_back.dmi differ diff --git a/icons/mob/corgi_head.dmi b/icons/mob/corgi_head.dmi index 1383b0dc40e..51904f2b3cd 100644 Binary files a/icons/mob/corgi_head.dmi and b/icons/mob/corgi_head.dmi differ diff --git a/icons/mob/guardian.dmi b/icons/mob/guardian.dmi index 9da38ca7706..35480eb0d69 100644 Binary files a/icons/mob/guardian.dmi and b/icons/mob/guardian.dmi differ diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 0bd0e0fefb5..50e9757cf3a 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ diff --git a/icons/mob/inhands/guns_righthand.dmi b/icons/mob/inhands/guns_righthand.dmi index b5f858b0406..bb23cabef96 100644 Binary files a/icons/mob/inhands/guns_righthand.dmi and b/icons/mob/inhands/guns_righthand.dmi differ diff --git a/icons/mob/screen_operative.dmi b/icons/mob/screen_operative.dmi new file mode 100644 index 00000000000..01c64e5a4fd Binary files /dev/null and b/icons/mob/screen_operative.dmi differ diff --git a/icons/mob/screen_slimecore.dmi b/icons/mob/screen_slimecore.dmi new file mode 100644 index 00000000000..27c6602d6cd Binary files /dev/null and b/icons/mob/screen_slimecore.dmi differ diff --git a/tgstation.dme b/tgstation.dme index e6b932a0b17..5354cad0eff 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -182,7 +182,6 @@ #include "code\datums\martial.dm" #include "code\datums\material_container.dm" #include "code\datums\mind.dm" -#include "code\datums\modules.dm" #include "code\datums\mutations.dm" #include "code\datums\outfit.dm" #include "code\datums\progressbar.dm" @@ -576,6 +575,7 @@ #include "code\game\objects\effects\aliens.dm" #include "code\game\objects\effects\anomalies.dm" #include "code\game\objects\effects\bump_teleporter.dm" +#include "code\game\objects\effects\contraband.dm" #include "code\game\objects\effects\forcefields.dm" #include "code\game\objects\effects\gibs.dm" #include "code\game\objects\effects\glowshroom.dm" @@ -588,7 +588,6 @@ #include "code\game\objects\effects\spiders.dm" #include "code\game\objects\effects\step_triggers.dm" #include "code\game\objects\effects\decals\cleanable.dm" -#include "code\game\objects\effects\decals\contraband.dm" #include "code\game\objects\effects\decals\crayon.dm" #include "code\game\objects\effects\decals\decal.dm" #include "code\game\objects\effects\decals\misc.dm" @@ -826,6 +825,7 @@ #include "code\game\turfs\turf.dm" #include "code\game\turfs\simulated\dirtystation.dm" #include "code\game\turfs\simulated\floor.dm" +#include "code\game\turfs\simulated\river.dm" #include "code\game\turfs\simulated\walls.dm" #include "code\game\turfs\simulated\walls_mineral.dm" #include "code\game\turfs\simulated\walls_misc.dm" @@ -1448,6 +1448,7 @@ #include "code\modules\procedural mapping\mapGeneratorModules\nature.dm" #include "code\modules\procedural mapping\mapGenerators\asteroid.dm" #include "code\modules\procedural mapping\mapGenerators\cellular.dm" +#include "code\modules\procedural mapping\mapGenerators\lava_river.dm" #include "code\modules\procedural mapping\mapGenerators\nature.dm" #include "code\modules\procedural mapping\mapGenerators\shuttle.dm" #include "code\modules\procedural mapping\mapGenerators\syndicate.dm" diff --git a/tgui/.babelrc b/tgui/.babelrc new file mode 100644 index 00000000000..d6a8c4275c6 --- /dev/null +++ b/tgui/.babelrc @@ -0,0 +1,8 @@ +{ + "presets": [ + "es2015" + ], + "plugins": [ + "external-helpers" + ] +} diff --git a/tgui/.gitattributes b/tgui/.gitattributes new file mode 100644 index 00000000000..3acb4c9ebd7 --- /dev/null +++ b/tgui/.gitattributes @@ -0,0 +1 @@ +assets/* binary diff --git a/tgui/.gitignore b/tgui/.gitignore index 68b9e27759d..71b051e887f 100644 --- a/tgui/.gitignore +++ b/tgui/.gitignore @@ -1,2 +1,2 @@ +npm-debug.log node_modules/ -bower_components/ diff --git a/tgui/Gulpfile.js b/tgui/Gulpfile.js index d1c580b989f..8e50fd71f9b 100644 --- a/tgui/Gulpfile.js +++ b/tgui/Gulpfile.js @@ -1,2 +1,2 @@ -require('coffee-script/register'); -require('./gulp'); +require('babel-register') +require('./gulp') diff --git a/tgui/coffeelint.json b/tgui/coffeelint.json deleted file mode 100644 index 8b80bb6c787..00000000000 --- a/tgui/coffeelint.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "max_line_length": { - "name": "max_line_length", - "level": "ignore" - } -} diff --git a/tgui/colors.json b/tgui/colors.json index b3bad42f0b8..15feaa91db4 100644 --- a/tgui/colors.json +++ b/tgui/colors.json @@ -1,26 +1,55 @@ { - "normal":"#40628a", - "good":"#537d29", - "average":"#be6209", - "bad":"#b00e0e", - "highlight":"#8ba5c4", - "info":"#e9C183", - "label":"#8ba5c4", - "dark":"#272727", - "title":"#98b0c3", - "text":"white", - "textinverse":"black", - "titlebar":"#363636", - "background-start":"#2a2a2a", - "background-end":"#202020", - "resize":"#363636", - "border":"#272727", - "rule":"#40628a", - "notice1":"#bb9b68", - "notice2":"#b1905d", - "hover":"15%", - "selected":"#2f943c", - "caution":"#9a9d00", - "danger":"#9d0808", - "disabled":"#999999" + "normal": "#40628a", + "good": "#537d29", + "average": "#be6209", + "bad": "#b00e0e", + "highlight": "#8ba5c4", + "text": { + "normal": "white", + "inverse": "black", + "title": "#98b0c3" + }, + "rule": { + "normal": "#40628a", + "dark": "#272727" + }, + "titlebar": { + "background": "#363636", + "shadow": "alpha(#000, 0.1)" + }, + "resize": { + "border": "#363636" + }, + "display": { + "background": "alpha(#000, 0.33)", + "shadow": "alpha(#000, 0.5)" + }, + "notice": { + "first": "#bb9b68", + "second": "#b1905d", + "border": "#272727" + }, + "section": { + "label": "#8ba5c4" + }, + "bar": { + "border": "#40628a", + "background": "#272727" + }, + "buttons": { + "normal": "#40628a", + "disabled": "#999999", + "selected": "#2f943c", + "caution": "#9a9d00", + "danger": "#9d0808", + "hover": "15%" + }, + "nanotrasen": { + "background-start": "#2a2a2a", + "background-end": "#202020" + }, + "syndicate": { + "background-start": "#b30f0f", + "background-end": "#740d0d" + } } diff --git a/tgui/gulp/.babelrc b/tgui/gulp/.babelrc new file mode 100644 index 00000000000..6dd1b88134e --- /dev/null +++ b/tgui/gulp/.babelrc @@ -0,0 +1,5 @@ +{ + "presets": [ + "es2015" + ] +} diff --git a/tgui/gulp/compilers/coffeescript.coffee b/tgui/gulp/compilers/coffeescript.coffee deleted file mode 100644 index f9b854cf622..00000000000 --- a/tgui/gulp/compilers/coffeescript.coffee +++ /dev/null @@ -1,13 +0,0 @@ -coffee = require "coffee-script" - - -module.exports = (source, file) -> - compiled = coffee.compile source, - bare: true - sourceMap: true - inline: true - - output = - source: compiled.js - map: JSON.parse compiled.v3SourceMap - output diff --git a/tgui/gulp/compilers/stylus.coffee b/tgui/gulp/compilers/stylus.coffee deleted file mode 100644 index ff75e2e8fc5..00000000000 --- a/tgui/gulp/compilers/stylus.coffee +++ /dev/null @@ -1,9 +0,0 @@ -stylus = require "stylus" - - -module.exports = (source, file) -> - source = stylus source - .set "filename", file - output = - source: source.render() - output diff --git a/tgui/gulp/config/flags.coffee b/tgui/gulp/config/flags.coffee deleted file mode 100644 index 79b3b174b71..00000000000 --- a/tgui/gulp/config/flags.coffee +++ /dev/null @@ -1,7 +0,0 @@ -gutil = require "gulp-util" - - -module.exports = - colorblind: gutil.env.colorblind || gutil.env.c - debug: gutil.env.debug || gutil.env.d - min: gutil.env.min || gutil.env.m diff --git a/tgui/gulp/config/index.coffee b/tgui/gulp/config/index.coffee deleted file mode 100644 index 17352f638d4..00000000000 --- a/tgui/gulp/config/index.coffee +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = - flags: require "./flags" - paths: require "../../paths" - plugins: require "./plugins" diff --git a/tgui/gulp/config/plugins.coffee b/tgui/gulp/config/plugins.coffee deleted file mode 100644 index e04b85f13fc..00000000000 --- a/tgui/gulp/config/plugins.coffee +++ /dev/null @@ -1,15 +0,0 @@ -module.exports = - browserify: - aliasify: require "aliasify" - coffeeify: require "coffeeify" - componentify: require "ractive-componentify" - globify: require "require-globify" - gulp: require("gulp-load-plugins")({replaceString: /^gulp(-|\.)|-/g}) - postcss: - autoprefixer: require "autoprefixer" - colorblind: require "postcss-colorblind" - fontweights: require "postcss-font-weights" - gradient: require "postcss-filter-gradient" - opacity: require "postcss-opacity" - plsfilters: require "pleeease-filters" - rgba: require "postcss-color-rgba-fallback" diff --git a/tgui/gulp/flags.js b/tgui/gulp/flags.js new file mode 100644 index 00000000000..4cb80d26f28 --- /dev/null +++ b/tgui/gulp/flags.js @@ -0,0 +1,4 @@ +const flags = require('minimist')(process.argv.slice(2)) + +export const debug = flags.debug || flags.d +export const min = flags.min || flags.m diff --git a/tgui/gulp/index.coffee b/tgui/gulp/index.coffee deleted file mode 100644 index 55b64f13ef5..00000000000 --- a/tgui/gulp/index.coffee +++ /dev/null @@ -1,12 +0,0 @@ -gulp = require "gulp" - -build = require "./tasks/build" -clean = require "./tasks/clean" -reload = require "./tasks/reload" -watch = require "./tasks/watch" - - -gulp.task clean -gulp.task "default", gulp.series clean, build -gulp.task "update", gulp.series clean, build, reload -gulp.task watch diff --git a/tgui/gulp/index.js b/tgui/gulp/index.js new file mode 100644 index 00000000000..f99dbc05842 --- /dev/null +++ b/tgui/gulp/index.js @@ -0,0 +1,12 @@ +import gulp from 'gulp' + +import { css, watch_css } from './tasks/css' +import { js, watch_js } from './tasks/js' +import { reload, watch_reload } from './tasks/reload' +import { size } from './tasks/size' + +gulp.task(reload) +gulp.task(size) + +gulp.task('default', gulp.series(gulp.parallel(css, js), size)) +gulp.task('watch', gulp.parallel(watch_css, watch_js, watch_reload)) diff --git a/tgui/paths.json b/tgui/gulp/paths.json similarity index 75% rename from tgui/paths.json rename to tgui/gulp/paths.json index bf4b5f9c1d6..08c4fbbd951 100644 --- a/tgui/paths.json +++ b/tgui/gulp/paths.json @@ -1,5 +1,5 @@ { - "out":"assets", + "out":"assets/", "css":{ "dir":"styles/", "main":"main.styl", @@ -11,7 +11,7 @@ }, "js":{ "dir":"scripts/", - "main":"main.coffee", + "main":"main.js", "out":"tgui.js" } } diff --git a/tgui/gulp/plugins.js b/tgui/gulp/plugins.js new file mode 100644 index 00000000000..e074082b64a --- /dev/null +++ b/tgui/gulp/plugins.js @@ -0,0 +1,20 @@ +export const browserify = { + babelify: require('babelify'), + collapse: require('bundle-collapser/plugin'), + componentify: require('ractive-componentify'), + es3ify: require('es3ify'), + globify: require('require-globify'), + helpers: require('babelify-external-helpers'), + rememberify: require('rememberify') +} + +export const gulp = require('gulp-load-plugins')({ replaceString: /^gulp(-|\.)|-/g }) + +export const postcss = { + autoprefixer: require('autoprefixer'), + fontweights: require('postcss-font-weights'), + gradient: require('postcss-filter-gradient'), + opacity: require('postcss-opacity'), + plsfilters: require('pleeease-filters'), + rgba: require('postcss-color-rgba-fallback') +} diff --git a/tgui/gulp/tasks/build.coffee b/tgui/gulp/tasks/build.coffee deleted file mode 100644 index 338f278675f..00000000000 --- a/tgui/gulp/tasks/build.coffee +++ /dev/null @@ -1,7 +0,0 @@ -gulp = require "gulp" - -css = require "./css" -js = require "./js" -size = require "./size" - -module.exports = gulp.series (gulp.parallel css, js), size diff --git a/tgui/gulp/tasks/clean.coffee b/tgui/gulp/tasks/clean.coffee deleted file mode 100644 index 6d99f7d4caa..00000000000 --- a/tgui/gulp/tasks/clean.coffee +++ /dev/null @@ -1,9 +0,0 @@ -c = require "../config" -p = c.paths - -del = require "del" - - -module.exports = -> - del "#{p.out}/*" -module.exports.displayName = "clean" diff --git a/tgui/gulp/tasks/css.coffee b/tgui/gulp/tasks/css.coffee deleted file mode 100644 index 39c9a7319e0..00000000000 --- a/tgui/gulp/tasks/css.coffee +++ /dev/null @@ -1,36 +0,0 @@ -c = require "../config" -f = c.flags -p = c.paths -g = c.plugins.gulp -s = c.plugins.postcss - -gulp = require "gulp" -postcss = require "postcss" - - -cssnano = - autoprefixer: - browsers: ["last 2 versions", "ie >= 8"] - discardComments: - removeAll: true - -module.exports = -> - gulp.src p.css.dir + p.css.main - .pipe g.if(f.debug, g.sourcemaps.init({loadMaps: true})) - .pipe g.stylus({url: 'data-url', paths: [p.img.dir]}) - .pipe g.postcss([ - s.autoprefixer({browsers: ["last 2 versions", "ie >= 8"]}), - s.gradient, - s.opacity, - s.rgba({oldie: true}), - s.plsfilters({oldIE: true}), - s.fontweights - ]) - .pipe g.concat(p.css.out) - .pipe g.bytediff.start() - .pipe g.if(f.colorblind, g.postcss([p.colorblind])) - .pipe g.if(f.min, g.cssnano(cssnano)) - .pipe g.if(f.debug, g.sourcemaps.write(sourceRoot: "/source/#{p.css.dir}")) - .pipe g.bytediff.stop() - .pipe gulp.dest p.out -module.exports.displayName = "css" diff --git a/tgui/gulp/tasks/css.js b/tgui/gulp/tasks/css.js new file mode 100644 index 00000000000..ac1827010f2 --- /dev/null +++ b/tgui/gulp/tasks/css.js @@ -0,0 +1,30 @@ +import * as f from '../flags' +import * as p from '../paths' +import { gulp as g, postcss as s } from '../plugins' + +import gulp from 'gulp' +export function css () { + return gulp.src(p.css.dir + p.css.main) + .pipe(g.if(f.debug, g.sourcemaps.init({loadMaps: true}))) + .pipe(g.stylus({ url: 'data-url', paths: [p.img.dir] })) + .pipe(g.postcss([ + s.autoprefixer({ browsers: ['last 2 versions', 'ie >= 9'] }), + s.gradient, + s.opacity, + s.rgba({oldie: true}), + s.plsfilters({oldIE: true}), + s.fontweights + ])) + .pipe(g.rename(p.css.out)) + .pipe(g.bytediff.start()) + .pipe(g.if(f.min, g.cssnano({ + autoprefixer: { browsers: ['last 2 versions', 'ie >= 9'] }, + discardComments: { removeAll: true } + }))) + .pipe(g.if(f.debug, g.sourcemaps.write({ sourceRoot: '/source/#{p.css.dir}' }))) + .pipe(g.bytediff.stop()) + .pipe(gulp.dest(p.out)) +} +export function watch_css () { + return gulp.watch(p.css.dir + '**', css) +} diff --git a/tgui/gulp/tasks/js.coffee b/tgui/gulp/tasks/js.coffee deleted file mode 100644 index 5b173135ed8..00000000000 --- a/tgui/gulp/tasks/js.coffee +++ /dev/null @@ -1,40 +0,0 @@ -c = require "../config" -f = c.flags -p = c.paths -b = c.plugins.browserify -g = c.plugins.gulp - - -browserify = require "browserify" -gulp = require "gulp" -through = require "through2" - - -b.componentify.compilers["text/coffeescript"] = require "../compilers/coffeescript" -b.componentify.compilers["text/stylus"] = require "../compilers/stylus" - -bundle = -> - through.obj (file, enc, next) -> - browserify file.path, - extensions: [".coffee", ".ract"] - debug: f.debug - .transform b.coffeeify - .transform b.componentify - .transform b.aliasify - .transform b.globify - .bundle (err, res) -> - return next err if err - file.contents = res - next null, file - -module.exports = -> - gulp.src p.js.dir + p.js.main - .pipe bundle() - .pipe g.if(f.debug, g.sourcemaps.init({loadMaps: true})) - .pipe g.concat(p.js.out) - .pipe g.bytediff.start() - .pipe g.if(f.min, g.uglify({mangle: true, compress: {unsafe: true}})) - .pipe g.if(f.debug, g.sourcemaps.write()) - .pipe g.bytediff.stop() - .pipe gulp.dest p.out -module.exports.displayName = "js" diff --git a/tgui/gulp/tasks/js.js b/tgui/gulp/tasks/js.js new file mode 100644 index 00000000000..3b7a53d27ad --- /dev/null +++ b/tgui/gulp/tasks/js.js @@ -0,0 +1,54 @@ +import * as f from '../flags' +import * as p from '../paths' +import { browserify as b, gulp as g } from '../plugins' + +import { transform as babel } from 'babel-core' +import { readFileSync as read } from 'fs' +b.componentify.compilers['text/javascript'] = function (source, file) { + const config = { sourceMaps: true } + Object.assign(config, JSON.parse(read('.babelrc', 'utf8'))) + const compiled = babel(source, config) + + return { + source: compiled.code, + map: compiled.map + } +} + +import browserify from 'browserify' +const bundle = browserify(p.js.dir + p.js.main, { + debug: f.debug, + cache: {}, + extensions: ['.js', '.ract'] +}) +.plugin(b.rememberify) +.transform(b.babelify) +.plugin(b.helpers) +.transform(b.componentify) +.transform(b.globify) +.transform(b.es3ify) +if (f.min) { + bundle.plugin(b.collapse) +} + +import buffer from 'vinyl-buffer' +import gulp from 'gulp' +import source from 'vinyl-source-stream' +export function js () { + return bundle.bundle() + .pipe(source('bundle')) + .pipe(buffer()) + .pipe(g.if(f.debug, g.sourcemaps.init({loadMaps: true}))) + .pipe(g.rename(p.js.out)) + .pipe(g.bytediff.start()) + .pipe(g.if(f.min, g.uglify({mangle: true, compress: {unsafe: true}}))) + .pipe(g.if(f.debug, g.sourcemaps.write())) + .pipe(g.bytediff.stop()) + .pipe(gulp.dest(p.out)) +} +export function watch_js () { + return gulp.watch(p.js.dir + '**', vinyl => { + b.rememberify.forget(bundle, vinyl.path) + return js() + }) +} diff --git a/tgui/gulp/tasks/reload.coffee b/tgui/gulp/tasks/reload.coffee deleted file mode 100644 index 063912e27ff..00000000000 --- a/tgui/gulp/tasks/reload.coffee +++ /dev/null @@ -1,8 +0,0 @@ -child_process = require "child_process" -gulp = require "gulp" - - -module.exports = -> - child_process.exec "reload.bat", (err, stdout, stderr) -> - console.log err if err -module.exports.displayName = "reload" diff --git a/tgui/gulp/tasks/reload.js b/tgui/gulp/tasks/reload.js new file mode 100644 index 00000000000..9099762b995 --- /dev/null +++ b/tgui/gulp/tasks/reload.js @@ -0,0 +1,10 @@ +import * as p from '../paths' + +import { exec } from 'child_process' +export function reload () { + return exec('reload.bat') +} +import gulp from 'gulp' +export function watch_reload () { + return gulp.watch(p.out + '**', reload) +} diff --git a/tgui/gulp/tasks/size.coffee b/tgui/gulp/tasks/size.coffee deleted file mode 100644 index 6fe2c315aa6..00000000000 --- a/tgui/gulp/tasks/size.coffee +++ /dev/null @@ -1,10 +0,0 @@ -c = require "../config" -p = c.paths -g = c.plugins.gulp - -gulp = require "gulp" - -module.exports = -> - gulp.src "#{p.out}/*" - .pipe g.size() -module.exports.displayName = "size" diff --git a/tgui/gulp/tasks/size.js b/tgui/gulp/tasks/size.js new file mode 100644 index 00000000000..84a6d68cc6c --- /dev/null +++ b/tgui/gulp/tasks/size.js @@ -0,0 +1,8 @@ +import * as p from '../paths' +import { gulp as g } from '../plugins' + +import gulp from 'gulp' +export function size () { + return gulp.src(p.out + '*') + .pipe(g.size()) +} diff --git a/tgui/gulp/tasks/watch.coffee b/tgui/gulp/tasks/watch.coffee deleted file mode 100644 index af0121b3d2e..00000000000 --- a/tgui/gulp/tasks/watch.coffee +++ /dev/null @@ -1,17 +0,0 @@ -c = require "../config" -p = c.paths - -gulp = require "gulp" - -build = require "./build" -clean = require "./clean" -reload = require "./reload" - - -module.exports = -> - paths = [] - for i,path of p - paths.push "#{path.dir}**" if path.dir - - gulp.watch paths, gulp.series clean, build, reload -module.exports.displayName = "watch" diff --git a/tgui/images/nanotrasen.svg b/tgui/images/nanotrasen.svg index d93b01a9545..b4b09a1ac46 100644 --- a/tgui/images/nanotrasen.svg +++ b/tgui/images/nanotrasen.svg @@ -1,5 +1,5 @@ - + diff --git a/tgui/images/syndicate.svg b/tgui/images/syndicate.svg new file mode 100644 index 00000000000..4bae2c70cba --- /dev/null +++ b/tgui/images/syndicate.svg @@ -0,0 +1,9 @@ + + + + s + + diff --git a/tgui/package.json b/tgui/package.json index cf94626727c..c47cae75c8f 100644 --- a/tgui/package.json +++ b/tgui/package.json @@ -2,67 +2,55 @@ "name": "tgui", "private": true, "dependencies": { - "aliasify": "^1.8.0", - "autoprefixer": "^6.2.2", - "browserify": "^12.0.1", - "coffee-script": "^1.10.0", - "coffeeify": "^2.0.1", - "del": "^2.2.0", - "dom4": "^1.5.2", - "es5-shim": "^4.4.1", + "autoprefixer": "6.2.3", + "babel-core": "6.4.0", + "babel-plugin-external-helpers": "6.4.0", + "babel-polyfill": "6.3.14", + "babel-preset-es2015": "6.3.13", + "babel-register": "6.3.13", + "babelify": "7.2.0", + "babelify-external-helpers": "1.1.0", + "browserify": "13.0.0", + "bundle-collapser": "1.2.1", + "dom4": "1.6.0", + "es3ify": "0.1.4", "gulp": "github:gulpjs/gulp#4.0", - "gulp-bytediff": "^1.0.0", - "gulp-concat": "^2.6.0", - "gulp-cssnano": "^2.0.0", - "gulp-if": "^2.0.0", - "gulp-load-plugins": "^1.1.0", - "gulp-postcss": "^6.0.1", - "gulp-size": "^2.0.0", - "gulp-sourcemaps": "^1.6.0", - "gulp-stylus": "^2.1.2", - "gulp-uglify": "^1.5.1", - "gulp-util": "^3.0.7", - "hexa-color-regex": "^1.0.0", - "html5shiv": "^3.7.3", - "ie8": "^0.2.9", - "merge2": "^0.3.6", - "mini-signals": "^1.1.0", - "pleeease-filters": "^2.0.0", - "postcss": "^5.0.13", - "postcss-color-rgba-fallback": "^2.1.0", - "postcss-colorblind": "^0.4.0", - "postcss-filter-gradient": "^0.2.1", - "postcss-font-weights": "^2.0.1", - "postcss-opacity": "^3.0.0", - "ractive": "^0.7.3", - "ractive-componentify": "^0.2.2", - "ractive-events-keys": "^0.2.1", - "ractive-transitions-fade": "^0.3.1", - "require-globify": "^1.3.0", - "rfr": "^1.2.3", - "stylus": "^0.53.0", - "through2": "^2.0.0", - "webfontloader": "^1.6.16" + "gulp-bytediff": "1.0.0", + "gulp-cssnano": "2.1.0", + "gulp-if": "2.0.0", + "gulp-load-plugins": "1.2.0", + "gulp-postcss": "6.0.1", + "gulp-rename": "1.2.2", + "gulp-size": "2.0.0", + "gulp-sourcemaps": "1.6.0", + "gulp-stylus": "2.2.0", + "gulp-uglify": "1.5.1", + "html5shiv": "3.7.3", + "ie8": "0.3.0", + "minimist": "1.2.0", + "pleeease-filters": "2.0.0", + "postcss": "5.0.14", + "postcss-color-rgba-fallback": "2.2.0", + "postcss-filter-gradient": "0.2.2", + "postcss-font-weights": "2.0.1", + "postcss-opacity": "3.0.0", + "ractive": "0.7.3", + "ractive-componentify": "0.2.2", + "ractive-events-keys": "0.2.1", + "ractive-transitions-fade": "0.3.1", + "rememberify": "1.0.1", + "require-globify": "1.3.0", + "vinyl-buffer": "1.0.0", + "vinyl-source-stream": "1.1.0", + "webfontloader": "1.6.20" }, - "aliasify": { - "aliases": { - "dom4": "dom4/build/dom4.max", - "ie8": "ie8/build/ie8.max", - "ractive": "ractive/ractive.runtime" - }, - "appliesTo": { - "includeExtensions": [ - ".js", - ".coffee", - ".ract" - ] - } + "browser": { + "ractive": "ractive/ractive-legacy.runtime" }, "require-globify": { "appliesTo": { "includeExtensions": [ ".js", - ".coffee", ".ract" ] } diff --git a/tgui/scripts/byond.coffee b/tgui/scripts/byond.coffee deleted file mode 100644 index 43a939371b2..00000000000 --- a/tgui/scripts/byond.coffee +++ /dev/null @@ -1,12 +0,0 @@ -encode = encodeURIComponent - -module.exports = - href: (params = {}, url = "") -> # Helper to generate a BYOND href given 'params' as an object (with an optional 'url' for eg winset). - params = (Object.keys(params).map (key) -> "#{encode(key)}=#{encode(params[key])}").join("&") - "byond://#{url}?#{params}" - act: (src, action, params = {}) -> # Helper to make a BYOND ui_act() call on the UI 'src' given an 'action' and optional 'params'. - params.src = src - params.action = action - location.href = @href params - winset: (window, key, value) -> # Helper to make a BYOND winset() call on 'window', setting 'key' to 'value' - location.href = @href {"#{window}.#{key}": value}, "winset" diff --git a/tgui/scripts/byond.js b/tgui/scripts/byond.js new file mode 100644 index 00000000000..e48e346317b --- /dev/null +++ b/tgui/scripts/byond.js @@ -0,0 +1,18 @@ +const encode = encodeURIComponent + +// Helper to generate a BYOND href given 'params' as an object (with an optional 'url' for eg winset). +export function href (params = {}, url = '') { + return `byond://${url}?` + Object.keys(params).map(key => `${encode(key)}=${encode(params[key])}`).join('&') +} + +// Helper to make a BYOND ui_act() call on the UI 'src' given an 'action' and optional 'params'. +export function act (src, action, params = {}) { + params.src = src + params.action = action + window.location.href = href(params) +} + +// Helper to make a BYOND winset() call on 'window', setting 'key' to 'value' +export function winset (win, key, value) { + window.location.href = href({[`${win}.${key}`]: value}, 'winset') +} diff --git a/tgui/scripts/components/bar.ract b/tgui/scripts/components/bar.ract index 893838f3f1f..c0f7ae7be1d 100644 --- a/tgui/scripts/components/bar.ract +++ b/tgui/scripts/components/bar.ract @@ -1,11 +1,13 @@ -
    diff --git a/tgui/scripts/components/button.ract b/tgui/scripts/components/button.ract index 739cf15f743..c77ce2d51e6 100644 --- a/tgui/scripts/components/button.ract +++ b/tgui/scripts/components/button.ract @@ -1,34 +1,48 @@ - + on-click-enter='{{#clickable}}press{{/}}'> {{#if icon}} {{/if}} diff --git a/tgui/scripts/components/display.ract b/tgui/scripts/components/display.ract index cdb1fb3c070..176c1781717 100644 --- a/tgui/scripts/components/display.ract +++ b/tgui/scripts/components/display.ract @@ -2,7 +2,9 @@ {{#if title}}

    {{title}}

    - {{#if button}}{{yield button}}{{/if}} + {{#if button}} +
    {{yield button}}
    + {{/if}}
    {{/if}}
    diff --git a/tgui/scripts/components/resize.ract b/tgui/scripts/components/resize.ract index 3f847a9aa73..97a15f7b38f 100644 --- a/tgui/scripts/components/resize.ract +++ b/tgui/scripts/components/resize.ract @@ -1,23 +1,15 @@ - {{#if config.fancy}} -
    +
    {{/if}} diff --git a/tgui/scripts/components/titlebar.ract b/tgui/scripts/components/titlebar.ract index f4cc29dc0fe..5be7cf90ae2 100644 --- a/tgui/scripts/components/titlebar.ract +++ b/tgui/scripts/components/titlebar.ract @@ -1,38 +1,37 @@ - -
    +
    {{yield}} {{#if config.fancy}} diff --git a/tgui/scripts/components/warnings.ract b/tgui/scripts/components/warnings.ract new file mode 100644 index 00000000000..735247d8931 --- /dev/null +++ b/tgui/scripts/components/warnings.ract @@ -0,0 +1,47 @@ + + + +{{#if config.fancy && ie && ie < 11}} + + You have an old (IE{{ie}}), end-of-life (click 'EOL Info' for more information) version of Internet Explorer installed.
    + To upgrade, click 'Upgrade IE' to download IE11 from Microsoft.
    + If you are unable to upgrade directly, click 'IE VMs' to download a VM with IE11 or Edge from Microsoft.
    + Otherwise, click 'No Frills' below to disable potentially incompatible features (and this message). +
    + No Frills + + Upgrade IE + + IE VMs + + EOL Info + Debug Info + {{#if debug}} +
    + Detected: IE{{ie}}
    + User Agent: {{userAgent}} + {{/if}} +
    +{{/if}} diff --git a/tgui/scripts/constants.coffee b/tgui/scripts/constants.coffee deleted file mode 100644 index 1457071dabe..00000000000 --- a/tgui/scripts/constants.coffee +++ /dev/null @@ -1,6 +0,0 @@ -# Constants used in tgui; these are mirrored from the BYOND code. -module.exports = - UI_INTERACTIVE: 2 - UI_UPDATE: 1 - UI_DISABLED: 0 - UI_CLOSE: -1 diff --git a/tgui/scripts/constants.js b/tgui/scripts/constants.js new file mode 100644 index 00000000000..b7dac6eb67d --- /dev/null +++ b/tgui/scripts/constants.js @@ -0,0 +1,5 @@ +// Constants used in tgui; these are mirrored from the BYOND code. +export const UI_INTERACTIVE = 2 +export const UI_UPDATE = 1 +export const UI_DISABLED = 0 +export const UI_CLOSE = -1 diff --git a/tgui/scripts/dragresize.js b/tgui/scripts/dragresize.js new file mode 100644 index 00000000000..a2e83f9af28 --- /dev/null +++ b/tgui/scripts/dragresize.js @@ -0,0 +1,49 @@ +import {winset} from './byond' + +function lock (x, y) { + if (x < 0) { // Left + x = 0 + } else if (x + window.innerWidth > window.screen.availWidth) { // Right + x = window.screen.availWidth - window.innerWidth + } + + if (y < 0) { // Top + y = 0 + } else if (y + window.innerHeight > window.screen.availHeight) { // Bottom + y = window.screen.availHeight - window.innerHeight + } + + return {x, y} +} + +function drag (event) { + event.preventDefault() + + if (this.get('x')) { + let x = (event.screenX - this.get('x')) + window.screenLeft + let y = (event.screenY - this.get('y')) + window.screenTop + if (this.get('config.locked')) ({x, y} = lock(x, y)) // Lock to primary monitor. + winset(this.get('config.window'), 'pos', `${x},${y}`) + } + this.set({ x: event.screenX, y: event.screenY }) +} + +function sane (x, y) { + x = Math.clamp(100, window.screen.width, x) + y = Math.clamp(100, window.screen.height, y) + return {x, y} +} + +function resize (event) { + event.preventDefault() + + if (this.get('x')) { + let x = (event.screenX - this.get('x')) + window.innerWidth + let y = (event.screenY - this.get('y')) + window.innerHeight + ;({x, y} = sane(x, y)) + winset(this.get('config.window'), 'size', `${x},${y}`) + } + this.set({ x: event.screenX, y: event.screenY }) +} + +export { drag, resize } diff --git a/tgui/scripts/interfaces/air_alarm.ract b/tgui/scripts/interfaces/air_alarm.ract index 9139066184a..c9928ea3ef4 100644 --- a/tgui/scripts/interfaces/air_alarm.ract +++ b/tgui/scripts/interfaces/air_alarm.ract @@ -5,18 +5,18 @@ - + {{#if data.siliconUser}} - - {{data.locked ? "Engaged" : "Disengaged"}} - + + {{data.locked ? "Engaged" : "Disengaged"}} + {{else}} Swipe an ID card to {{data.locked ? "unlock" : "lock"}} this interface. {{/if}} - + {{#if !data.locked || data.siliconUser}} - {{#if data.screen == 1}} + {{#if data.screen == 1}} {{elseif data.screen == 2}} diff --git a/tgui/scripts/interfaces/air_alarm/back.ract b/tgui/scripts/interfaces/air_alarm/back.ract index 8528495fc2f..cb0db0f5c20 100644 --- a/tgui/scripts/interfaces/air_alarm/back.ract +++ b/tgui/scripts/interfaces/air_alarm/back.ract @@ -1 +1 @@ -Back +Back diff --git a/tgui/scripts/interfaces/air_alarm/controls.ract b/tgui/scripts/interfaces/air_alarm/controls.ract index 530317a0c77..bd9ae86d908 100644 --- a/tgui/scripts/interfaces/air_alarm/controls.ract +++ b/tgui/scripts/interfaces/air_alarm/controls.ract @@ -1,23 +1,23 @@ - - - Area Atmosphere Alarm - - - Panic Siphon - + + + Area Atmosphere Alarm + + + Panic Siphon +
    - - Vent Controls - - - Scrubber Controls - - - Operating Mode - - - Alarm Thresholds - -
    + + Vent Controls + + + Scrubber Controls + + + Operating Mode + + + Alarm Thresholds + + diff --git a/tgui/scripts/interfaces/air_alarm/modes.ract b/tgui/scripts/interfaces/air_alarm/modes.ract index c726a6d4ba2..cca50a7f730 100644 --- a/tgui/scripts/interfaces/air_alarm/modes.ract +++ b/tgui/scripts/interfaces/air_alarm/modes.ract @@ -1,14 +1,14 @@ - + {{#partial button}} {{/partial}} {{#each data.modes}} - - + {{name}} - + action='mode' params='{"mode": {{mode}}}'>{{name}} + {{/each}} - + diff --git a/tgui/scripts/interfaces/air_alarm/scrubbers.ract b/tgui/scripts/interfaces/air_alarm/scrubbers.ract index 1d80db754ac..7b561723192 100644 --- a/tgui/scripts/interfaces/air_alarm/scrubbers.ract +++ b/tgui/scripts/interfaces/air_alarm/scrubbers.ract @@ -1,33 +1,33 @@ - + {{#partial button}} {{/partial}} {{#each data.scrubbers}} - - - {{power ? "On" : "Off"}} - - - {{scrubbing ? "Scrubbing" : "Siphoning"}} - - - {{widenet ? "Expanded" : "Normal"}} - - - Oxygen - Nitrogen - Plasma - - + + + {{power ? "On" : "Off"}} + + + {{scrubbing ? "Scrubbing" : "Siphoning"}} + + + {{widenet ? "Expanded" : "Normal"}} + + + CO2 + N2O + Plasma + + {{else}} Error: No scrubbers connected. {{/each}} - + diff --git a/tgui/scripts/interfaces/air_alarm/status.ract b/tgui/scripts/interfaces/air_alarm/status.ract index c8c3412ec36..767e6d3c7d1 100644 --- a/tgui/scripts/interfaces/air_alarm/status.ract +++ b/tgui/scripts/interfaces/air_alarm/status.ract @@ -1,31 +1,30 @@ - + {{#if data.environment_data}} - {{#each data.environment_data}} - + {{#each adata.environment_data}} + {{Math.fixed(value, 2)}}{{unit}} - + {{/each}} - + {{data.danger_level == 2 ? "Danger (Internals Required)" : data.danger_level == 1 ? "Caution" : "Optimal"}} - - - + + + {{data.atmos_alarm ? "Atmosphere Alarm" : fire_alarm ? "Fire Alarm" : "Nominal"}} - + {{else}} - - Warning: Cannot obtain air sample for analysis. - + + Cannot obtain air sample for analysis. + {{/if}} {{#if data.emagged}} -
    - - Warning: Safety measures offline. Device may exhibit abnormal behavior. - + + Safety measures offline. Device may exhibit abnormal behavior. + {{/if}} -
    + diff --git a/tgui/scripts/interfaces/air_alarm/thresholds.ract b/tgui/scripts/interfaces/air_alarm/thresholds.ract index 600baa3339a..e427b8eec74 100644 --- a/tgui/scripts/interfaces/air_alarm/thresholds.ract +++ b/tgui/scripts/interfaces/air_alarm/thresholds.ract @@ -1,6 +1,6 @@ - + {{#partial button}} {{/partial}} @@ -16,15 +16,16 @@ {{#each data.thresholds}} {{{name}}} {{#each settings}} - {{Math.fixed(selected, 2)}} + {{Math.fixed(selected, 2)}} {{/each}} {{/each}} - + - diff --git a/tgui/scripts/interfaces/air_alarm/vents.ract b/tgui/scripts/interfaces/air_alarm/vents.ract index 8078ce72ca3..b88a79f9dd3 100644 --- a/tgui/scripts/interfaces/air_alarm/vents.ract +++ b/tgui/scripts/interfaces/air_alarm/vents.ract @@ -1,32 +1,32 @@ - + {{#partial button}} {{/partial}} {{#each data.vents}} - - - {{power ? "On" : "Off"}} - - + + + {{power ? "On" : "Off"}} + + {{direction == "release" ? "Pressurizing" : "Siphoning"}} - - - Internal - External - - - {{Math.fixed(external)}} - Reset - - + + + Internal + External + + + {{Math.fixed(external)}} + Reset + + {{else}} Error: No vents connected. {{/each}} - + diff --git a/tgui/scripts/interfaces/airlock_electronics.ract b/tgui/scripts/interfaces/airlock_electronics.ract index b54b963be19..f41cf6ad13f 100644 --- a/tgui/scripts/interfaces/airlock_electronics.ract +++ b/tgui/scripts/interfaces/airlock_electronics.ract @@ -1,8 +1,8 @@ - - - {{data.oneAccess ? "One" : "All"}} Required - Clear - + + + {{data.oneAccess ? "One" : "All"}} Required + Clear +
    @@ -13,23 +13,27 @@ {{#each data.regions}} {{/each}}
    {{#each accesses}} - {{name}} + {{name}}
    {{/each}}
    -
    + - diff --git a/tgui/scripts/interfaces/apc.ract b/tgui/scripts/interfaces/apc.ract index 7590def3aaf..a778dfcd0fc 100644 --- a/tgui/scripts/interfaces/apc.ract +++ b/tgui/scripts/interfaces/apc.ract @@ -1,110 +1,125 @@ - - + {{#if data.siliconUser}} - - {{data.locked ? "Engaged" : "Disengaged"}} - + + {{data.locked ? "Engaged" : "Disengaged"}} + {{else}} Swipe an ID card to {{data.locked ? "unlock" : "lock"}} this interface. {{/if}} - - - + + + {{#if data.locked && !data.siliconUser}} {{data.isOperating ? "On" : "Off"}} {{else}} - {{data.isOperating ? "On" : "Off"}} + {{data.isOperating ? "On" : "Off"}} {{/if}} - - + + {{data.externalPower == 2 ? "Good" : data.externalPower == 1 ? "Low" : "None"}} - - + + {{#if data.powerCellStatus != null}} - {{Math.fixed(adata.powerCellStatus)}}% + {{Math.fixed(adata.powerCellStatus)}}% {{else}} Power cell removed. {{/if}} - + {{#if data.powerCellStatus != null}} - + {{#if data.locked && !data.siliconUser}} {{data.chargeMode ? "Auto" : "Off"}} {{else}} - {{data.chargeMode ? "Auto" : "Off"}} + {{data.chargeMode ? "Auto" : "Off"}} {{/if}}   [{{data.chargingStatus == 2 ? "Fully Charged" : data.chargingStatus == 1 ? "Charging" : "Not Charging"}}] - + {{/if}} - - - {{#each adata.powerChannels}} - -
    {{Math.round(powerLoad)}} W
    + + + {{#each data.powerChannels}} + +
    {{Math.round(adata.powerChannels[@index].powerLoad)}} W
    {{status >= 2 ? "On" : "Off"}}
    [{{status == 1 || status == 3 ? "Auto" : "Manual"}}]
    {{#if !data.locked || data.siliconUser}} - Auto - On - Off + Auto + On + Off {{/if}}
    -
    + {{/each}} - + {{Math.round(adata.totalLoad)}} W - -
    + + {{#if data.siliconUser}} - - Overload + + Overload {{#if data.malfStatus}} - {{malfButton}} + {{malfButton}} {{/if}} - + {{/if}} - - + + {{#if data.locked && !data.siliconUser}} {{data.coverLocked ? "Engaged" : "Disengaged"}} {{else}} - {{data.coverLocked ? "Engaged" : "Disengaged"}} + {{data.coverLocked ? "Engaged" : "Disengaged"}} {{/if}} - - + + diff --git a/tgui/scripts/interfaces/atmos_filter.ract b/tgui/scripts/interfaces/atmos_filter.ract index 3fdec03c761..10b58ee8932 100644 --- a/tgui/scripts/interfaces/atmos_filter.ract +++ b/tgui/scripts/interfaces/atmos_filter.ract @@ -1,25 +1,25 @@ - - - {{data.on ? "On" : "Off"}} - - - Set - Max + + + {{data.on ? "On" : "Off"}} + + + Set + Max {{Math.round(adata.set_pressure)}} kPa - - - Nothing - Plasma - O2 - N2 - CO2 - N2O - - + + + Nothing + Plasma + O2 + N2 + CO2 + N2O + + \ No newline at end of file diff --git a/tgui/scripts/interfaces/atmos_mixer.ract b/tgui/scripts/interfaces/atmos_mixer.ract index f68516770b1..0212e7f4afb 100644 --- a/tgui/scripts/interfaces/atmos_mixer.ract +++ b/tgui/scripts/interfaces/atmos_mixer.ract @@ -1,33 +1,33 @@ - - - {{data.on ? "On" : "Off"}} - - - Set - Max + + + {{data.on ? "On" : "Off"}} + + + Set + Max {{Math.round(adata.set_pressure)}} kPa - - - + + - - - {{Math.round(adata.node1_concentration)}}% - - - + + - - - {{Math.round(adata.node2_concentration)}}% - - + + diff --git a/tgui/scripts/interfaces/atmos_pump.ract b/tgui/scripts/interfaces/atmos_pump.ract index 2cb3053a38c..08d2b1824c2 100644 --- a/tgui/scripts/interfaces/atmos_pump.ract +++ b/tgui/scripts/interfaces/atmos_pump.ract @@ -1,19 +1,19 @@ - - - {{data.on ? "On" : "Off"}} - + + + {{data.on ? "On" : "Off"}} + {{#if data.max_rate}} - - Set - Max + + Set + Max {{Math.round(adata.transfer_rate)}} L/s - + {{else}} - - Set - Max + + Set + Max {{Math.round(adata.set_pressure)}} kPa - + {{/if}} - + diff --git a/tgui/scripts/interfaces/canister.ract b/tgui/scripts/interfaces/canister.ract index 831d4ee6152..91e49c0bf67 100644 --- a/tgui/scripts/interfaces/canister.ract +++ b/tgui/scripts/interfaces/canister.ract @@ -1,53 +1,53 @@ - + The regulator {{data.hasHoldingTank ? "is" : "is not"}} connected to a tank. - - + + {{#partial button}} - Relabel + Relabel {{/partial}} - + {{Math.round(adata.tankPressure)}} kPa - - + + {{data.portConnected ? "Connected" : "Not Connected"}} - - - - - {{Math.round(adata.releasePressure)}} kPa - - - Reset - Min - Set - Max - - - + + + + {{Math.round(adata.releasePressure)}} kPa + + + Reset + Min + Set + Max + + + {{data.valveOpen ? "Open" : "Closed"}} - - - + action='valve'>{{data.valveOpen ? "Open" : "Closed"}} + + + {{#partial button}} {{#if data.hasHoldingTank}} - Eject + Eject {{/if}} {{/partial}} {{#if data.hasHoldingTank}} - + {{data.holdingTank.name}} - - + + {{Math.round(adata.holdingTank.tankPressure)}} kPa - + {{else}} - + No Holding Tank - + {{/if}} - + diff --git a/tgui/scripts/interfaces/chem_dispenser.ract b/tgui/scripts/interfaces/chem_dispenser.ract index 1a610b4769c..072863e93dd 100644 --- a/tgui/scripts/interfaces/chem_dispenser.ract +++ b/tgui/scripts/interfaces/chem_dispenser.ract @@ -1,34 +1,28 @@ - - - {{Math.fixed(adata.energy)}} Units - - {{#if data.beakerTransferAmounts}} - - {{#each data.beakerTransferAmounts}} - {{.}} - {{/each}} - - {{/if}} - - - - {{#each data.chemicals}} - {{title}} - {{/each}} - - - + + + {{Math.fixed(adata.energy)}} Units + + + {{#partial button}} - Eject + {{#each data.beakerTransferAmounts}} + {{.}} + {{/each}} {{/partial}} - {{#if data.beakerTransferAmounts}} - - {{#each data.beakerTransferAmounts}} - {{.}} - {{/each}} - - {{/if}} - + + {{#each data.chemicals}} + {{title}} + {{/each}} + + + + {{#partial button}} + {{#each data.beakerTransferAmounts}} + {{.}} + {{/each}} + Eject + {{/partial}} + {{#if data.isBeakerLoaded}} {{Math.round(adata.beakerCurrentVolume)}}/{{data.beakerMaxVolume}} Units
    @@ -40,5 +34,5 @@ {{else}} No Beaker {{/if}} - -
    + + diff --git a/tgui/scripts/interfaces/chem_heater.ract b/tgui/scripts/interfaces/chem_heater.ract index 1f704af036e..6cdd258d0d8 100644 --- a/tgui/scripts/interfaces/chem_heater.ract +++ b/tgui/scripts/interfaces/chem_heater.ract @@ -1,19 +1,19 @@ - - - + + {{data.isActive ? "On" : "Off"}} - - - {{Math.round(adata.targetTemp)}} K - - - + action='power'>{{data.isActive ? "On" : "Off"}} + + + {{Math.round(adata.targetTemp)}} K + + + {{#partial button}} - Eject + Eject {{/partial}} - + {{#if data.isBeakerLoaded}} Temperature: {{Math.round(adata.currentTemp)}} K
    @@ -25,5 +25,5 @@ {{else}} No Beaker {{/if}} -
    -
    + + diff --git a/tgui/scripts/interfaces/cryo.ract b/tgui/scripts/interfaces/cryo.ract index babf4ea4d44..90ff2d63188 100644 --- a/tgui/scripts/interfaces/cryo.ract +++ b/tgui/scripts/interfaces/cryo.ract @@ -1,60 +1,65 @@ - - - + + {{data.occupant.name ? data.occupant.name : "No Occupant"}} - + {{#if data.hasOccupant}} - + {{data.occupant.stat == 0 ? "Conscious" : data.occupant.stat == 1 ? "Unconcious" : "Dead"}} - - + + {{Math.round(adata.occupant.bodyTemperature)}} K - - - {{Math.round(adata.occupant.health)}} - + + + {{Math.round(adata.occupant.health)}} + {{#each [{label: "Brute", type: "bruteLoss"}, {label: "Respiratory", type: "oxyLoss"}, {label: "Toxin", type: "toxLoss"}, {label: "Burn", type: "fireLoss"}]}} - - {{Math.round(adata.occupant[type])}} - + + {{Math.round(adata.occupant[type])}} + {{/each}} {{/if}} - - - - + + + {{data.isOperating ? "On" : "Off"}} - - + action='power'>{{data.isOperating ? "On" : "Off"}} + + {{Math.round(adata.cellTemperature)}} K - - - {{data.isOpen ? "Open" : "Closed"}} - {{data.autoEject ? "Auto" : "Manual"}} - - - + + + {{data.isOpen ? "Open" : "Closed"}} + {{data.autoEject ? "Auto" : "Manual"}} + + + {{#partial button}} - Eject + Eject {{/partial}} - + {{#if data.isBeakerLoaded}} {{#each adata.beakerContents}} {{Math.fixed(volume, 2)}} units of {{name}}
    @@ -64,5 +69,5 @@ component.exports = {{else}} No Beaker {{/if}} -
    -
    + + diff --git a/tgui/scripts/interfaces/error.ract b/tgui/scripts/interfaces/error.ract index 1776e064959..b3baa85c589 100644 --- a/tgui/scripts/interfaces/error.ract +++ b/tgui/scripts/interfaces/error.ract @@ -1,3 +1,3 @@ - + The requested interface ({{config.interface}}) was not found. Does it exist? - + diff --git a/tgui/scripts/interfaces/smes.ract b/tgui/scripts/interfaces/smes.ract index b7d48589ae9..152c12fb0cb 100644 --- a/tgui/scripts/interfaces/smes.ract +++ b/tgui/scripts/interfaces/smes.ract @@ -1,69 +1,70 @@ - - - - {{Math.fixed(adata.capacityPercent)}}% - - - - - {{data.inputAttempt ? "Auto" : "Off"}} + + + {{Math.fixed(adata.capacityPercent)}}% + + + + + {{data.inputAttempt ? "Auto" : "Off"}}   [{{data.capacityPercent >= 100 ? "Fully Charged" : data.inputting ? "Charging" : "Not Charging"}}] - - - {{Math.round(adata.inputLevel)}}W - - - - - Set - - - - + + + {{Math.round(adata.inputLevel)}}W + + + + + Set + + + + {{Math.round(adata.inputAvailable)}}W - - - - - {{data.outputAttempt ? "On" : "Off"}} + + + + + {{data.outputAttempt ? "On" : "Off"}}   [{{data.outputting ? "Sending" : data.charge > 0 ? "Not Sending" : "No Charge"}}] - - - {{Math.round(adata.outputLevel)}}W - - - - - Set - - - - + + + {{Math.round(adata.outputLevel)}}W + + + + + Set + + + + {{Math.round(adata.outputUsed)}}W - - + + diff --git a/tgui/scripts/interfaces/solar_control.ract b/tgui/scripts/interfaces/solar_control.ract index 852cc0474fb..3139bd95c1b 100644 --- a/tgui/scripts/interfaces/solar_control.ract +++ b/tgui/scripts/interfaces/solar_control.ract @@ -1,46 +1,46 @@ - - + + {{Math.round(adata.generated)}}W - - + + {{Math.round(adata.angle)}}° ({{data.direction}}) - - - 15° - - - 15° - - - - - Off - Timed - Auto - - + + + 15° + + + 15° + + + + + Off + Timed + Auto + + {{Math.round(adata.tracking_rate)}}°/h ({{data.rotating_way}}) - - - 180° - 30° - - - 30° - 180° - - - + + + 180° + 30° + + + 30° + 180° + + + {{#partial button}} - Refresh + Refresh {{/partial}} - + {{data.connected_tracker ? "" : "Not "}}Found - - + + {{Math.round(adata.connected_panels)}} Panels Connected - - + + diff --git a/tgui/scripts/interfaces/space_heater.ract b/tgui/scripts/interfaces/space_heater.ract index b96a56b1ef0..94cc45baf80 100644 --- a/tgui/scripts/interfaces/space_heater.ract +++ b/tgui/scripts/interfaces/space_heater.ract @@ -1,51 +1,53 @@ - - + {{#partial button}} {{#if data.open}} - Eject + Eject {{/if}} {{/partial}} - - + {{data.on ? "On" : "Off"}} - - + action='power'>{{data.on ? "On" : "Off"}} + + {{#if data.hasPowercell}} - {{Math.fixed(adata.powerLevel)}}% + {{Math.fixed(adata.powerLevel)}}% {{else}} No Cell {{/if}} - - - - + + + + {{Math.round(adata.currentTemp)}}°C - - + + {{Math.round(adata.targetTemp)}}°C - + {{#if data.open}} - - - - Set - - - + + + + Set + + + {{/if}} - + {{#if data.open}} - Heat - Cool - Auto + Heat + Cool + Auto {{else}} {{text.titleCase(data.mode)}} {{/if}} - - + + diff --git a/tgui/scripts/interfaces/tanks.ract b/tgui/scripts/interfaces/tanks.ract index 87b6b1b3030..c945158486a 100644 --- a/tgui/scripts/interfaces/tanks.ract +++ b/tgui/scripts/interfaces/tanks.ract @@ -1,36 +1,39 @@ - - + The regulator {{data.hasHoldingTank ? "is" : "is not"}} connected to a mask. - - - - {{Math.round(adata.tankPressure)}} kPa - - - {{Math.round(adata.releasePressure)}} kPa - - - Reset - Min - Set - Max - - - {{data.valveOpen ? "Open" : "Closed"}} - - + + + + {{Math.round(adata.tankPressure)}} kPa + + + {{Math.round(adata.releasePressure)}} kPa + + + Reset + Min + Set + Max + + + {{data.valveOpen ? "Open" : "Closed"}} + + diff --git a/tgui/scripts/main.coffee b/tgui/scripts/main.coffee deleted file mode 100644 index 9274c34c689..00000000000 --- a/tgui/scripts/main.coffee +++ /dev/null @@ -1,31 +0,0 @@ -require "ie8" -require "dom4" -require "es5-shim" -require "html5shiv" -require "./math" - - -Ractive = require "ractive" -# Set Ractive debug mode based on if we're minified or not. -Ractive.DEBUG = /minified/.test (minified) -> - -WebFont = require "webfontloader" -# Load FontAwesome asynchronously from CDNJS. -WebFont.load - custom: - families: ["FontAwesome"] - urls: ["https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css"] - -tgui = require "./tgui" -# Create the UI; this is just a Ractive component. -window.tgui = new tgui - el: "#container" - data: -> - data = JSON.parse document.getElementById("data").textContent # Load initial data from the server. - alert "Initial data did not load correctly." if not data? or not (data.data? and data.config?) - data.adata = data.data # Spoof animated data as this is the first load. - data - onrender: -> - @observe "config.style", (newkey, oldkey, keypath) -> # Change body style to match config. - document.body.classList.remove oldkey if oldkey? - document.body.classList.add newkey if newkey? diff --git a/tgui/scripts/main.js b/tgui/scripts/main.js new file mode 100644 index 00000000000..1215e5a72c4 --- /dev/null +++ b/tgui/scripts/main.js @@ -0,0 +1,45 @@ +// Temporarily import Ractive first to keep it from detecting ie8's object.defineProperty shim, which it misuses (ractivejs/ractive#2343). +import Ractive from 'ractive' +Ractive.DEBUG = /minified/.test(() => { + /* minified */ +}) + +import 'ie8' +import 'babel-polyfill' +import 'dom4' +import 'html5shiv' + +Object.assign(Math, require('./math')) + +import WebFont from 'webfontloader' +WebFont.load({ + custom: { + families: [ + 'FontAwesome' + ], + urls: [ + 'https://netdna.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css' + ], + testStrings: { + FontAwesome: '\uf240' + } + } +}) + +import TGUI from './tgui' +window.initialize = (dataString) => { + if (window.tgui) return + window.tgui = new TGUI({ + el: '#container', + data: () => JSON.parse(dataString) + }) +} + +import { act } from './byond' +const holder = document.getElementById('data') +if (holder.textContent !== '{}') { // If the JSON was inlined, load it. + window.initialize(holder.textContent) +} else { + act(holder.getAttribute('data-ref'), 'tgui:initialize') + holder.remove() +} diff --git a/tgui/scripts/math.coffee b/tgui/scripts/math.coffee deleted file mode 100644 index 7bb7000110c..00000000000 --- a/tgui/scripts/math.coffee +++ /dev/null @@ -1,9 +0,0 @@ -# Extensions to the built-in 'Math' object. - -# Helper to limit a number to be inside 'min' and 'max'. -Math.clamp = (number, min, max) -> - Math.max min, Math.min number, max - -# Helper to round a number to 'decimals' decimals. -Math.fixed = (number, decimals = 1) -> - Number Math.round(number + "e" + decimals) + "e-" + decimals diff --git a/tgui/scripts/math.js b/tgui/scripts/math.js new file mode 100644 index 00000000000..a4833442d10 --- /dev/null +++ b/tgui/scripts/math.js @@ -0,0 +1,9 @@ +// Helper to limit a number to be inside 'min' and 'max'. +export function clamp (min, max, number) { + return Math.max(min, Math.min(number, max)) +} + +// Helper to round a number to 'decimals' decimals. +export function fixed (number, decimals = 1) { + return Number(Math.round(number + 'e' + decimals) + 'e-' + decimals) +} diff --git a/tgui/scripts/text.coffee b/tgui/scripts/text.coffee deleted file mode 100644 index cb41507316f..00000000000 --- a/tgui/scripts/text.coffee +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = - upperCaseFirst: (str) -> - str[0].toUpperCase() + str[1..].toLowerCase() - titleCase: (str) -> - str.replace /\w\S*/g, @upperCaseFirst diff --git a/tgui/scripts/text.js b/tgui/scripts/text.js new file mode 100644 index 00000000000..f26c5e21f02 --- /dev/null +++ b/tgui/scripts/text.js @@ -0,0 +1,7 @@ +export function upperCaseFirst (str) { + return str[0].toUpperCase() + str.slice(1).toLowerCase() +} + +export function titleCase (str) { + return str.replace(/\w\S*/g, upperCaseFirst) +} diff --git a/tgui/scripts/tgui.ract b/tgui/scripts/tgui.ract index 2d8d265188a..45397330e32 100644 --- a/tgui/scripts/tgui.ract +++ b/tgui/scripts/tgui.ract @@ -1,35 +1,76 @@ + - {{{config.title}}}
    - + +
    - + diff --git a/tgui/styles/components/bar.styl b/tgui/styles/components/bar.styl index c55738dac5c..d2bae9d82f7 100644 --- a/tgui/styles/components/bar.styl +++ b/tgui/styles/components/bar.styl @@ -7,8 +7,8 @@ line-height: 17px padding: 1px - border: 1px solid colors.normal - background: colors.dark + border: 1px solid colors.bar.border + background: colors.bar.background .barText @extend $fontReset diff --git a/tgui/styles/components/button.styl b/tgui/styles/components/button.styl index b65bdbdd153..a396ae1cf88 100644 --- a/tgui/styles/components/button.styl +++ b/tgui/styles/components/button.styl @@ -1,3 +1,14 @@ +buttoncolor(selector, color) + &.{selector} + transition: background-color 0.5s + background-color: color + &.{selector}.active:hover, + &.{selector}.active:focus + transition: background-color 0.25s + background-color: lighten(color, colors.buttons.hover) + outline: 0 + + span.button @extend $fontReset display: inline-block @@ -10,20 +21,11 @@ span.button .fa padding-right: 2px - transition: background-color 0.25s, box-shadow 0.25s - &.normal - background-color: colors.normal - &:hover, &:focus - outline: 0 - box-shadow: inset 0 0 100px 100px alpha(#fff, colors.hover) - &.disabled - background-color: colors.disabled - &.selected - background-color: colors.selected - &.caution - background-color: colors.caution - &.danger - background-color: colors.danger + buttoncolor(normal, colors.buttons.normal) + buttoncolor(disabled, colors.buttons.disabled) + buttoncolor(selected, colors.buttons.selected) + buttoncolor(caution, colors.buttons.caution) + buttoncolor(danger, colors.buttons.danger) &.gridable width: 125px diff --git a/tgui/styles/components/display.styl b/tgui/styles/components/display.styl index 1201c07e62c..dbae05996d1 100644 --- a/tgui/styles/components/display.styl +++ b/tgui/styles/components/display.styl @@ -3,8 +3,8 @@ div.display padding: 4px margin: 6px 0 - background-color: alpha(#000, 0.33) // Transparent background. - box-shadow: inset 0 0 5px alpha(#000, 0.5) + background-color: colors.display.background // Transparent background. + box-shadow: inset 0 0 5px colors.display.shadow header display: block @@ -13,9 +13,9 @@ div.display padding: 0 4px margin-bottom: 6px - border-bottom: 2px solid colors.rule + border-bottom: 2px solid colors.rule.normal - .button + .buttonRight position: absolute bottom: 6px right: 4px diff --git a/tgui/styles/components/notice.styl b/tgui/styles/components/notice.styl index 76c9b6b3580..9f9ee531049 100644 --- a/tgui/styles/components/notice.styl +++ b/tgui/styles/components/notice.styl @@ -1,13 +1,13 @@ @require "display" $noticeStripes - background-color: colors.notice1 // Fallback for old browers. + background-color: colors.notice.first // Fallback for old browers. background-image: repeating-linear-gradient( -45deg, - colors.notice1, - colors.notice1 10px, - colors.notice2 10px, - colors.notice2 20px + colors.notice.first, + colors.notice.first 10px, + colors.notice.second 10px, + colors.notice.second 20px ) div.notice @@ -16,12 +16,15 @@ div.notice box-shadow: none - color: colors.textinverse + color: colors.text.inverse font-weight: bold font-style: italic .button - outline: 1px solid colors.border + outline: 1px solid colors.notice.border .label - color: colors.textinverse + color: colors.text.inverse + + hr + background-color: colors.rule.dark diff --git a/tgui/styles/components/resize.styl b/tgui/styles/components/resize.styl index 74cc43c0a0a..482b0db0de9 100644 --- a/tgui/styles/components/resize.styl +++ b/tgui/styles/components/resize.styl @@ -7,6 +7,6 @@ div.resize border-style: solid; border-width: 0 0 45px 45px; - border-color: transparent transparent colors.resize transparent + border-color: transparent transparent colors.resize.border transparent transform: rotate(360deg) diff --git a/tgui/styles/components/section.styl b/tgui/styles/components/section.styl index 0ba06f8cc56..4cf55f5db7c 100644 --- a/tgui/styles/components/section.styl +++ b/tgui/styles/components/section.styl @@ -18,7 +18,7 @@ section padding-right: 32px white-space: nowrap - color: colors.label + color: colors.section.label .content @extend $cell diff --git a/tgui/styles/components/titlebar.styl b/tgui/styles/components/titlebar.styl index 685a34e80db..76ead93b08e 100644 --- a/tgui/styles/components/titlebar.styl +++ b/tgui/styles/components/titlebar.styl @@ -4,10 +4,10 @@ $titleButton padding: 7px // To make a bigger clickable area. margin: -7px - color: colors.title; + color: colors.text.title; &:hover - color: lighten(colors.title, colors.hover) + color: lighten(colors.text.title, colors.buttons.hover) header.titlebar position: fixed; @@ -16,8 +16,8 @@ header.titlebar width: 100%; height: 32px; - background-color: colors.titlebar - box-shadow: 0 3px 3px alpha(#000, 0.1) + background-color: colors.titlebar.background + box-shadow: 0 3px 3px colors.titlebar.shadow .statusicon position: absolute @@ -30,7 +30,7 @@ header.titlebar top: 6px left: 46px - color: colors.title + color: colors.text.title font-size: 16px white-space: nowrap @@ -44,3 +44,11 @@ header.titlebar position: absolute top: 4px right: 12px + +.wf-inactive + .statusicon::after + content: "O" + .minimize::after + content: "-" + .close::after + content: "X" diff --git a/tgui/styles/core/colors.styl b/tgui/styles/core/colors.styl index ae588547b89..ceb979aeaa0 100644 --- a/tgui/styles/core/colors.styl +++ b/tgui/styles/core/colors.styl @@ -8,7 +8,3 @@ color: colors.bad .highlight color: colors.highlight -.label - color: colors.label -.dark - color: colors.dark diff --git a/tgui/styles/core/document.styl b/tgui/styles/core/document.styl index ba2822cad88..6406c3635d2 100644 --- a/tgui/styles/core/document.styl +++ b/tgui/styles/core/document.styl @@ -14,11 +14,9 @@ body height: 100% margin: 0 6px - background-color: colors.background-end; // Fallback for old browsers. - font-family: font font-size: fontsize - color: colors.text + color: colors.text.normal main display: block @@ -28,5 +26,5 @@ main hr height: 2px - background-color: colors.rule + background-color: colors.rule.normal border: none diff --git a/tgui/styles/core/text.styl b/tgui/styles/core/text.styl index 62541c38381..14f2cbd8857 100644 --- a/tgui/styles/core/text.styl +++ b/tgui/styles/core/text.styl @@ -1,6 +1,6 @@ // Helper to reset font options to default. $fontReset - color: colors.text + color: colors.text.normal font-size: fontsize font-weight: normal font-style: normal @@ -13,5 +13,5 @@ $fontReset font-style: italic // Make 'unselectable' text unselectable on all browsers. -[unselectable] +[unselectable=on] user-select: none diff --git a/tgui/styles/styles/generic.styl b/tgui/styles/styles/generic.styl index ff2bf29a7e3..8d35eb57c81 100644 --- a/tgui/styles/styles/generic.styl +++ b/tgui/styles/styles/generic.styl @@ -1,4 +1,5 @@ body.generic + background-color: colors.nanotrasen.background-start background: linear-gradient(to bottom, - colors.background-start 0%, - colors.background-end 100%) + colors.nanotrasen.background-start 0%, + colors.nanotrasen.background-end 100%) diff --git a/tgui/styles/styles/nanotrasen.styl b/tgui/styles/styles/nanotrasen.styl index 0625ef88dff..b594ed727db 100644 --- a/tgui/styles/styles/nanotrasen.styl +++ b/tgui/styles/styles/nanotrasen.styl @@ -1,5 +1,6 @@ body.nanotrasen + background-color: colors.nanotrasen.background-start background: data-url('nanotrasen.svg') no-repeat fixed center/70% 70%, linear-gradient(to bottom, - colors.background-start 0%, - colors.background-end 100%) + colors.nanotrasen.background-start 0%, + colors.nanotrasen.background-end 100%) diff --git a/tgui/styles/styles/syndicate.styl b/tgui/styles/styles/syndicate.styl new file mode 100644 index 00000000000..124633d35e6 --- /dev/null +++ b/tgui/styles/styles/syndicate.styl @@ -0,0 +1,6 @@ +body.syndicate + background-color: colors.syndicate.background-start + background: data-url('syndicate.svg') no-repeat fixed center/70% 70%, + linear-gradient(to bottom, + colors.syndicate.background-start 0%, + colors.syndicate.background-end 100%) diff --git a/tgui/tgui.html b/tgui/tgui.html index 162a31592b3..2b7a986ac85 100644 --- a/tgui/tgui.html +++ b/tgui/tgui.html @@ -1,27 +1,29 @@ - - - - - + + +
    -
    Loading...
    +
    + Loading...
    +
    - diff --git a/tools/github_webhook_processor.php b/tools/github_webhook_processor.php new file mode 100644 index 00000000000..26a08418d69 --- /dev/null +++ b/tools/github_webhook_processor.php @@ -0,0 +1,345 @@ +getLine()}: " . htmlSpecialChars($e->getMessage()); + die(); +}); +$rawPost = NULL; +if ($hookSecret !== NULL) { + if (!isset($_SERVER['HTTP_X_HUB_SIGNATURE'])) { + throw new \Exception("HTTP header 'X-Hub-Signature' is missing."); + } elseif (!extension_loaded('hash')) { + throw new \Exception("Missing 'hash' extension to check the secret code validity."); + } + list($algo, $hash) = explode('=', $_SERVER['HTTP_X_HUB_SIGNATURE'], 2) + array('', ''); + if (!in_array($algo, hash_algos(), TRUE)) { + throw new \Exception("Hash algorithm '$algo' is not supported."); + } + $rawPost = file_get_contents('php://input'); + if ($hash !== hash_hmac($algo, $rawPost, $hookSecret)) { + throw new \Exception('Hook secret does not match.'); + } +} +if (!isset($_SERVER['HTTP_CONTENT_TYPE'])) { + throw new \Exception("Missing HTTP 'Content-Type' header."); +} elseif (!isset($_SERVER['HTTP_X_GITHUB_EVENT'])) { + throw new \Exception("Missing HTTP 'X-Github-Event' header."); +} +switch ($_SERVER['HTTP_CONTENT_TYPE']) { + case 'application/json': + $json = $rawPost ?: file_get_contents('php://input'); + break; + case 'application/x-www-form-urlencoded': + $json = $_POST['payload']; + break; + default: + throw new \Exception("Unsupported content type: $_SERVER[HTTP_CONTENT_TYPE]"); +} +# Payload structure depends on triggered event +# https://developer.github.com/v3/activity/events/types/ +$payload = json_decode($json, true); + +switch (strtolower($_SERVER['HTTP_X_GITHUB_EVENT'])) { + case 'ping': + echo 'pong'; + break; + case 'pull_request': + handle_pr($payload); + break; + default: + header('HTTP/1.0 404 Not Found'); + echo "Event:$_SERVER[HTTP_X_GITHUB_EVENT] Payload:\n"; + print_r($payload); # For debug only. Can be found in GitHub hook log. + die(); +} +function handle_pr($payload) { + $action = 'opened'; + switch ($payload["action"]) { + case 'opened': + case 'reopened': + $action = $payload['action']; + break; + case 'closed': + if (!$payload['pull_request']['merged']) { + $action = 'closed'; + } + else { + $action = 'merged'; + checkchangelog($payload, true); + } + break; + default: + return; + } + + if (strtolower(substr($payload['pull_request']['title'], 0, 3)) == '[s]') { + echo "PR Announcement Halted; Secret tag detected.\n"; + return; + } + + $msg = 'Pull Request '.$action.' by '.htmlSpecialChars($payload['sender']['login']).': '.htmlSpecialChars('#'.$payload['pull_request']['number'].' '.$payload['pull_request']['user']['login'].' - '.$payload['pull_request']['title']).''; + sendtoallservers('?announce='.urlencode($msg)); + +} + +function checkchangelog($payload, $merge = false) { + global $apiKey; + if (!$merge) + return; + if (!isset($payload['pull_request']) || !isset($payload['pull_request']['body'])) { + return; + } + if (!isset($payload['pull_request']['user']) || !isset($payload['pull_request']['user']['login'])) { + return; + } + $body = $payload['pull_request']['body']; + $body = str_replace("\r\n", "\n", $body); + $body = explode("\n", $body); + $username = $payload['pull_request']['user']['login']; + $incltag = false; + $changelogbody = array(); + $currentchangelogblock = array(); + $foundcltag = false; + foreach ($body as $line) { + $line = trim($line); + if (substr($line,0,4) == ':cl:') { + $incltag = true; + $foundcltag = true; + $pos = strpos($line, " "); + if ($pos) + $username = substr($line, $pos+1); + continue; + } else if (substr($line,0,5) == '/:cl:' || substr($line,0,6) == '/ :cl:' || substr($line,0,5) == ':/cl:') { + $incltag = false; + $changelogbody = array_merge($changelogbody, $currentchangelogblock); + continue; + } + if (!$incltag) + continue; + + $firstword = explode(' ', $line)[0]; + $pos = strpos($line, " "); + $item = ''; + if ($pos) { + $firstword = trim(substr($line, 0, $pos)); + $item = trim(substr($line, $pos+1)); + } else { + $firstword = $line; + } + + if (!strlen($firstword)) { + $currentchangelogblock[count($currentchangelogblock)-1]['body'] .= "\n"; + continue; + } + //not a prefix line. + //so we add it to the last changelog entry as a separate line + if (!strlen($firstword) || $firstword[strlen($firstword)-1] != ':') { + if (count($currentchangelogblock) <= 0) + continue; + $currentchangelogblock[count($currentchangelogblock)-1]['body'] .= "\n".$line; + continue; + } + $cltype = strtolower(substr($firstword, 0, -1)); + switch ($cltype) { + case 'fix': + case 'fixes': + case 'bugfix': + $currentchangelogblock[] = array('type' => 'bugfix', 'body' => $item); + break; + case 'wip': + $currentchangelogblock[] = array('type' => 'wip', 'body' => $item); + break; + case 'rsctweak': + case 'tweaks': + case 'tweak': + $currentchangelogblock[] = array('type' => 'tweak', 'body' => $item); + break; + case 'soundadd': + $currentchangelogblock[] = array('type' => 'soundadd', 'body' => $item); + break; + case 'sounddel': + $currentchangelogblock[] = array('type' => 'sounddel', 'body' => $item); + break; + case 'add': + case 'adds': + case 'rscadd': + $currentchangelogblock[] = array('type' => 'rscadd', 'body' => $item); + break; + case 'del': + case 'dels': + case 'rscdel': + $currentchangelogblock[] = array('type' => 'rscdel', 'body' => $item); + break; + case 'imageadd': + $currentchangelogblock[] = array('type' => 'imageadd', 'body' => $item); + break; + case 'imagedel': + $currentchangelogblock[] = array('type' => 'imagedel', 'body' => $item); + break; + case 'typo': + case 'spellcheck': + $currentchangelogblock[] = array('type' => 'spellcheck', 'body' => $item); + break; + case 'experimental': + case 'experiment': + $currentchangelogblock[] = array('type' => 'experiment', 'body' => $item); + break; + case 'tgs': + $currentchangelogblock[] = array('type' => 'tgs', 'body' => $item); + break; + default: + //we add it to the last changelog entry as a separate line + if (count($currentchangelogblock) > 0) + $currentchangelogblock[count($currentchangelogblock)-1]['body'] .= "\n".$line; + break; + } + } + + if (!count($changelogbody)) + return; + + $file = 'author: '.$username."\n"; + $file .= "delete-after: True\n"; + $file .= "changes: \n"; + foreach ($changelogbody as $changelogitem) { + $type = $changelogitem['type']; + $body = trim(str_replace(array("\\", '"'), array("\\\\", "\\\""), $changelogitem['body'])); + $file .= ' - '.$type.': "'.$body.'"'; + $file .= "\n"; + } + $content = array ( + 'message' => 'Automatic changelog generation for PR #'.$payload['pull_request']['number'], + 'content' => base64_encode($file) + ); + $scontext = array('http' => array( + 'method' => 'PUT', + 'header' => + "Content-type: application/json\r\n". + 'Authorization: token ' . $apiKey, + 'content' => json_encode($content), + 'ignore_errors' => true, + 'user_agent' => 'tgstation13.org-Github-Automation-Tools' + )); + $filename = '/html/changelogs/AutoChangeLog-pr-'.$payload['pull_request']['number'].'.yml'; + echo file_get_contents($payload['pull_request']['base']['repo']['url'].'/contents'.$filename, false, stream_context_create($scontext)); +} + +function sendtoallservers($str) { + global $servers; + foreach ($servers as $serverid => $server) { + if (isset($server['comskey'])) + $rtn = export($server['address'], $server['port'], $str.'&key='.$server['comskey']); + else + $rtn = export($server['address'], $server['port'], $str); + + echo "Server Number $serverid replied: $rtn\n"; + } +} + + + +function export($addr, $port, $str) { + global $error; + // All queries must begin with a question mark (ie "?players") + if($str{0} != '?') $str = ('?' . $str); + + /* --- Prepare a packet to send to the server (based on a reverse-engineered packet structure) --- */ + $query = "\x00\x83" . pack('n', strlen($str) + 6) . "\x00\x00\x00\x00\x00" . $str . "\x00"; + + /* --- Create a socket and connect it to the server --- */ + $server = socket_create(AF_INET,SOCK_STREAM,SOL_TCP) or exit("ERROR"); + socket_set_option($server, SOL_SOCKET, SO_SNDTIMEO, array('sec' => 2, 'usec' => 0)); //sets connect and send timeout to 2 seconds + if(!socket_connect($server,$addr,$port)) { + $error = true; + return "ERROR"; + } + + + /* --- Send bytes to the server. Loop until all bytes have been sent --- */ + $bytestosend = strlen($query); + $bytessent = 0; + while ($bytessent < $bytestosend) { + //echo $bytessent.'
    '; + $result = socket_write($server,substr($query,$bytessent),$bytestosend-$bytessent); + //echo 'Sent '.$result.' bytes
    '; + if ($result===FALSE) die(socket_strerror(socket_last_error())); + $bytessent += $result; + } + + /* --- Idle for a while until recieved bytes from game server --- */ + $result = socket_read($server, 10000, PHP_BINARY_READ); + socket_close($server); // we don't need this anymore + + if($result != "") { + if($result{0} == "\x00" || $result{1} == "\x83") { // make sure it's the right packet format + + // Actually begin reading the output: + $sizebytes = unpack('n', $result{2} . $result{3}); // array size of the type identifier and content + $size = $sizebytes[1] - 1; // size of the string/floating-point (minus the size of the identifier byte) + + if($result{4} == "\x2a") { // 4-byte big-endian floating-point + $unpackint = unpack('f', $result{5} . $result{6} . $result{7} . $result{8}); // 4 possible bytes: add them up together, unpack them as a floating-point + return $unpackint[1]; + } + else if($result{4} == "\x06") { // ASCII string + $unpackstr = ""; // result string + $index = 5; // string index + + while($size > 0) { // loop through the entire ASCII string + $size--; + $unpackstr .= $result{$index}; // add the string position to return string + $index++; + } + return $unpackstr; + } + } + } + //if we get to this point, something went wrong; + $error = true; + return "ERROR"; +} +?>