diff --git a/btime.dll b/btime.dll new file mode 100644 index 00000000000..af6c82a9986 Binary files /dev/null and b/btime.dll differ diff --git a/btime.so b/btime.so new file mode 100644 index 00000000000..edb3cc3113f Binary files /dev/null and b/btime.so differ diff --git a/code/__defines/btime.dm b/code/__defines/btime.dm new file mode 100644 index 00000000000..d4cefc35241 --- /dev/null +++ b/code/__defines/btime.dm @@ -0,0 +1,18 @@ +// Comment this out if the external btime library is unavailable +#define PRECISE_TIMER_AVAILABLE + +#ifdef PRECISE_TIMER_AVAILABLE +var/global/__btime__libName = "btime.[world.system_type==MS_WINDOWS?"dll":"so"]" +#define TimeOfHour (__extern__timeofhour) +#define __extern__timeofhour text2num(call(__btime__libName, "gettime")()) +/hook/startup/proc/checkbtime() + try + // This will always return 1 unless the btime library cannot be accessed + if(TimeOfHour || 1) return 1 + catch(var/exception/e) + log_to_dd("PRECISE_TIMER_AVAILABLE is defined in btime.dm, but calling the btime library failed: [e]") + log_to_dd("This is a fatal error. The world will now shut down.") + del(world) +#else +#define TimeOfHour (world.timeofday % 36000) +#endif \ No newline at end of file diff --git a/code/__defines/damage_organs.dm b/code/__defines/damage_organs.dm index 89b01a699b6..124be534525 100644 --- a/code/__defines/damage_organs.dm +++ b/code/__defines/damage_organs.dm @@ -44,10 +44,11 @@ #define DROPLIMB_BURN 2 // Damage above this value must be repaired with surgery. -#define ROBOLIMB_SELF_REPAIR_CAP 30 +#define ROBOLIMB_REPAIR_CAP 30 -#define ORGAN_ASSISTED 1 -#define ORGAN_ROBOT 2 +#define ORGAN_ASSISTED 1 // Like pacemakers, not robotic +#define ORGAN_ROBOT 2 // Fully robotic, no organic parts +#define ORGAN_LIFELIKE 3 // Robotic, made to appear organic //Germs and infections. #define GERM_LEVEL_AMBIENT 110 // Maximum germ level you can reach by standing still. diff --git a/code/controllers/ProcessScheduler/core/_define.dm b/code/__defines/process_scheduler.dm similarity index 66% rename from code/controllers/ProcessScheduler/core/_define.dm rename to code/__defines/process_scheduler.dm index f0165c98708..76449b9a4b5 100644 --- a/code/controllers/ProcessScheduler/core/_define.dm +++ b/code/__defines/process_scheduler.dm @@ -11,7 +11,10 @@ #define PROCESS_DEFAULT_HANG_ALERT_TIME 600 // 60 seconds #define PROCESS_DEFAULT_HANG_RESTART_TIME 900 // 90 seconds #define PROCESS_DEFAULT_SCHEDULE_INTERVAL 50 // 50 ticks -#define PROCESS_DEFAULT_SLEEP_INTERVAL 2 // 2 ticks +#define PROCESS_DEFAULT_SLEEP_INTERVAL 8 // 2 ticks #define PROCESS_DEFAULT_CPU_THRESHOLD 90 // 90% -//#define UPDATE_QUEUE_DEBUG \ No newline at end of file +// SCHECK macros +// This references src directly to work around a weird bug with try/catch +#define SCHECK_EVERY(this_many_calls) if(++src.calls_since_last_scheck >= this_many_calls) sleepCheck() +#define SCHECK SCHECK_EVERY(50) \ No newline at end of file diff --git a/code/__defines/research.dm b/code/__defines/research.dm index d40722d0cf6..9c3bec3066d 100644 --- a/code/__defines/research.dm +++ b/code/__defines/research.dm @@ -12,7 +12,8 @@ #define TECH_ILLEGAL "syndicate" #define TECH_ARCANE "arcane" -#define IMPRINTER 0x1 //For circuits. Uses glass/chemicals. -#define PROTOLATHE 0x2 //New stuff. Uses glass/metal/chemicals -#define MECHFAB 0x4 //Mechfab -#define CHASSIS 0x8 //For protolathe, but differently +#define IMPRINTER 0x0001 //For circuits. Uses glass/chemicals. +#define PROTOLATHE 0x0002 //New stuff. Uses glass/metal/chemicals +#define MECHFAB 0x0004 //Mechfab +#define CHASSIS 0x0008 //For protolathe, but differently +#define PROSFAB 0x0010 //For prosthetics fab \ No newline at end of file diff --git a/code/_helpers/_global_objects.dm b/code/_helpers/_global_objects.dm new file mode 100644 index 00000000000..4cbbcf33147 --- /dev/null +++ b/code/_helpers/_global_objects.dm @@ -0,0 +1 @@ +var/datum/gear_tweak/color/gear_tweak_free_color_choice = new() \ No newline at end of file diff --git a/code/_helpers/datum_pool.dm b/code/_helpers/datum_pool.dm index 5c13c0d8ba2..b5bcea123fe 100644 --- a/code/_helpers/datum_pool.dm +++ b/code/_helpers/datum_pool.dm @@ -74,7 +74,6 @@ var/global/list/GlobalPool = list() D.Destroy() D.ResetVars() - D.disposed = 1 //Set to stop processing while pooled /proc/IsPooled(var/datum/D) if(isnull(GlobalPool[D.type])) @@ -86,7 +85,6 @@ var/global/list/GlobalPool = list() New(arglist(args)) else New(args) - disposed = null /atom/movable/Prepare(args) var/list/args_list = args diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm index d5a7b1ed46e..57ff4b70138 100644 --- a/code/_helpers/game.dm +++ b/code/_helpers/game.dm @@ -248,31 +248,31 @@ . |= M // Since we're already looping through mobs, why bother using |= ? This only slows things down. return . -/proc/get_mobs_and_objs_in_view_fast(var/turf/T, var/range) - var/list/results = list("objs" = list(), "mobs" = list()) +/proc/get_mobs_and_objs_in_view_fast(var/turf/T, var/range, var/checkghosts = 1) - var/list/hear = dview(range,T,INVISIBILITY_MAXIMUM) - var/list/hearturfs = list() + var/list/mobs = list() + var/list/objs = list() - for(var/I in hear) - if(ismob(I)) - var/mob/M = I - results["mobs"] += M - hearturfs += M.locs[1] - else if(isobj(I)) - var/obj/O = I - results["objs"] += I - hearturfs += O.locs[1] + var/list/hear = dview(range,T,INVISIBILITY_MAXIMUM) + var/list/hearturfs = list() + + for(var/atom/movable/AM in hear) + if(ismob(AM)) + mobs += AM + hearturfs += AM.locs[1] + else if(isobj(AM)) + objs += AM + hearturfs += AM.locs[1] - for(var/mob/M in player_list) - if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_ears)) - results["mobs"] |= M - continue - if(M.loc && M.locs[1] in hearturfs) - results["mobs"] |= M + for(var/mob/M in player_list) + if(checkghosts && M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_ears)) + mobs |= M + continue + if(M.loc && M.locs[1] in hearturfs) + mobs |= M - return results + return list("mobs" = mobs, "objs" = objs) diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index 7ce97d62e68..1a1eced63a1 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -33,6 +33,8 @@ var/global/list/language_keys[0] // Table of say codes for all languages var/global/list/whitelisted_species = list("Human") // Species that require a whitelist check. var/global/list/playable_species = list("Human") // A list of ALL playable species, whitelisted, latejoin or otherwise. +var/list/mannequins_ + // Posters var/global/list/poster_designs = list() @@ -49,45 +51,7 @@ var/global/list/facial_hair_styles_male_list = list() var/global/list/facial_hair_styles_female_list = list() var/global/list/skin_styles_female_list = list() //unused //Underwear -var/global/list/underwear_top_t = list( - "Bra, Red" = "t1", "Bra, White" = "t2", "Bra, Yellow" = "t3", "Bra, Blue" = "t4", "Bra, Black" = "t5", "Lacy Bra" = "t6", "Sports Bra, Black" = "t7", "Sports Bra, White" = "t8", - "Sports Bra Alt, Black" = "t9", "Sporta Bra Alt, White" = "t10", "Bra, Baby-Blue" = "t11", "Bra, Green" = "t12", "Bra, Pink" = "t13", "Bra, Violet" = "t14", - "Lacy Bra Alt" = "t15", "Lacy Bra Alt, Violet" = "t16", "Halterneck Bra, Black" = "t17", "Halterneck Bra, Blue" = "t18", "Halterneck Bra, Green" = "t19", "Halterneck Bra, Purple" = "t20", - "Halterneck Bra, Red" = "t21", "Halterneck Bra, Teal" = "t22", "Halterneck Bra, Violet" = "t23", "Halterneck Bra, White" = "t24", "None") -var/global/list/underwear_bottom_t = list( - "Briefs, White" = "b1", "Briefs, Grey" = "b2", "Briefs, Green" = "b3", "Briefs, Blue" = "b4", "Briefs, Black" = "b5", "Boxers, Loveheart" = "b7", "Boxers, Black" = "b8", - "Boxers, Grey" = "b9", "Boxers, Green & Blue Striped" = "b10", "Panties, Red" = "b11", "Panties, White" = "b12", "Panties, Yellow" = "b13", "Panties, Blue" = "b14", - "Panties, Light-Black" = "b15", "Thong" = "b16", "Panties, Black" = "b17", "Panties Alt, White" = "b18", "Compression Shorts, Black" = "b19", "Compression Shorts, White" = "b20", - "Compression Shorts, Baby-Blue" = "b21", "Panties, Green" = "b22", "Compression Shorts, Pink" = "b23", "Thong, Violet" = "b24", "Thong Alt" = "b25", "Thong Alt, Violet" = "b26", - "Alt Thong, Black" = "b27", "Alt Thong, Blue" = "b28", "Alt Thong, Green" = "b29", "Alt Thong, Purple" = "b30", "Alt Thong, Red" = "b31", "Alt Thong, Teal" = "b32", - "Alt Thong, Violet" = "b33", "Alt Thong, White" = "b34", "None") - //undershirt -var/global/list/undershirt_t = list( - "White tank top" = "u1", "Black tank top" = "u2", "Black shirt" = "u3", - "White shirt" = "u4", "White shirt 2" = "shirt_white_s", "White tank top 2" = "tank_white_s", - "Black shirt 2" = "shirt_black_s", "Grey shirt" = "shirt_grey_s", "Heart shirt" = "lover_s", - "I love NT shirt" = "ilovent_s", "White shortsleeve shirt" = "whiteshortsleeve_s", "Purple shortsleeve shirt" = "purpleshortsleeve_s", - "Blue shortsleeve shirt" = "blueshortsleeve_s", "Green shortsleeve shirt" = "greenshortsleeve_s", "Black shortsleeve shirt" = "blackshortsleeve_s", - "Blue shirt" = "blueshirt_s", "Red shirt" = "redshirt_s", "Yellow shirt" = "yellowshirt_s", "Green shirt" = "greenshirt_s", - "Blue polo shirt" = "bluepolo_s", "Red polo shirt" = "redpolo_s", "White polo shirt" = "whitepolo_s", - "Grey-yellow polo shirt" = "grayyellowpolo_s", "Fire tank top" = "tank_fire_s", "NT shirt" = "shirt_nano_s", - "Blue shirt 2" = "shirt_blue_s", "Red shirt 2" = "shirt_red_s", "Red tank top" = "tank_red_s", "Green shirt 2" = "shirt_green_s", - "Tiedye shirt" = "shirt_tiedye_s", "Green sport shirt" = "greenshirtsport_s", "Red sport shirt" = "redshirtsport_s", - "Blue striped shirt" = "shirt_stripes_s", "Blue sport shirt" = "blueshirtsport_s", "None") - //Socks -var/global/list/socks_t = list( - "White normal" = "white_norm", "White short" = "white_short", "White knee" = "white_knee", - "White thigh" = "white_thigh", "Black normal" = "black_norm", "Black short" = "black_short", - "Black knee" = "black_knee", "Black thigh" = "black_thigh", "Thin knee" = "thin_knee", - "Thin thigh" = "thin_thigh", "Pantyhose" = "pantyhose", "Striped thigh" = "striped_thigh", - "Striped knee" = "striped_knee", "Rainbow knee" = "rainbow_knee", "Rainbow thigh" = "rainbow_thigh", - "Fishnets" = "fishnet", "Thin white thigh" = "thinwhite_thigh", "Thin white knee" = "thinwhite_knee", - "Green striped thigh" = "gstriped_thigh", "Green striped knee" = "gstriped_knee", - "Purple striped thigh" = "pstriped_thigh", "Purple striped knee" = "pstriped_knee", - "Blue striped thigh" = "bstriped_thigh", "Blue striped knee" = "bstriped_knee", - "Yellow striped thigh" = "ystriped_thigh", "Yellow striped knee" = "ystriped_knee", - "Red striped thigh" = "rstriped_thigh", "Red striped knee" = "rstriped_knee", - "Orange striped thigh" = "ostriped_thigh", "Orange striped knee" = "ostriped_knee", "None") +var/datum/category_collection/underwear/global_underwear = new() //Backpacks var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt") @@ -137,6 +101,14 @@ var/global/list/string_slot_flags = list( "holster" = SLOT_HOLSTER ) +/proc/get_mannequin(var/ckey) + if(!mannequins_) + mannequins_ = new() + . = mannequins_[ckey] + if(!.) + . = new/mob/living/carbon/human/dummy/mannequin() + mannequins_[ckey] = . + ////////////////////////// /////Initial Building///// ////////////////////////// diff --git a/code/_helpers/lists.dm b/code/_helpers/lists.dm index 3fb03069010..d4e6710b354 100644 --- a/code/_helpers/lists.dm +++ b/code/_helpers/lists.dm @@ -602,13 +602,13 @@ proc/dd_sortedTextList(list/incoming) /datum/alarm/dd_SortValue() return "[sanitize_old(last_name)]" -/proc/subtypes(prototype) +/proc/subtypesof(prototype) return (typesof(prototype) - prototype) //creates every subtype of prototype (excluding prototype) and adds it to list L. //if no list/L is provided, one is created. /proc/init_subtypes(prototype, list/L) if(!istype(L)) L = list() - for(var/path in subtypes(prototype)) + for(var/path in subtypesof(prototype)) L += new path() return L diff --git a/code/_helpers/logging.dm b/code/_helpers/logging.dm index 133707b794c..35618c9b668 100644 --- a/code/_helpers/logging.dm +++ b/code/_helpers/logging.dm @@ -25,7 +25,6 @@ if (config.log_admin) diary << "\[[time_stamp()]]ADMIN: [text][log_end]" - /proc/log_debug(text) if (config.log_debug) diary << "\[[time_stamp()]]DEBUG: [text][log_end]" @@ -34,7 +33,6 @@ if(C.is_preference_enabled(/datum/client_preference/debug/show_debug_logs)) C << "DEBUG: [text]" - /proc/log_game(text) if (config.log_game) diary << "\[[time_stamp()]]GAME: [text][log_end]" @@ -79,6 +77,11 @@ if (config.log_pda) diary << "\[[time_stamp()]]PDA: [text][log_end]" +/proc/log_to_dd(text) + world.log << text //this comes before the config check because it can't possibly runtime + if(config.log_world_output) + diary << "\[[time_stamp()]]DD_OUTPUT: [text][log_end]" + /proc/log_misc(text) diary << "\[[time_stamp()]]MISC: [text][log_end]" diff --git a/code/_macros.dm b/code/_macros.dm index 45e67c75303..801498d915d 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -38,3 +38,5 @@ #define isslime(A) istype(A, /mob/living/carbon/slime) #define isxeno(A) istype(A, /mob/living/simple_animal/xeno) + +#define RANDOM_BLOOD_TYPE pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+") diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index c631a3435d5..3f872f53e60 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -388,10 +388,7 @@ f_style = "Shaved" if(dna.species == "Human") //no more xenos losing ears/tentacles h_style = pick("Bedhead", "Bedhead 2", "Bedhead 3") - undershirt = null - underwear_top = null - underwear_bottom = null - socks = null + all_underwear.Cut() regenerate_icons() /obj/screen/ling diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 093975051b5..3c65b03f736 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -1,40 +1,59 @@ +/* +=== Item Click Call Sequences === +These are the default click code call sequences used when clicking on stuff with an item. + +Atoms: + +mob/ClickOn() calls the item's resolve_attackby() proc. +item/resolve_attackby() calls the target atom's attackby() proc. + +Mobs: + +mob/living/attackby() after checking for surgery, calls the item's attack() proc. +item/attack() generates attack logs, sets click cooldown and calls the mob's attacked_with_item() proc. If you override this, consider whether you need to set a click cooldown, play attack animations, and generate logs yourself. +mob/attacked_with_item() should then do mob-type specific stuff (like determining hit/miss, handling shields, etc) and then possibly call the item's apply_hit_effect() proc to actually apply the effects of being hit. + +Item Hit Effects: + +item/apply_hit_effect() can be overriden to do whatever you want. However "standard" physical damage based weapons should make use of the target mob's hit_with_weapon() proc to +avoid code duplication. This includes items that may sometimes act as a standard weapon in addition to having other effects (e.g. stunbatons on harm intent). +*/ // Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown. /obj/item/proc/attack_self(mob/user) return +//I would prefer to rename this to attack(), but that would involve touching hundreds of files. +/obj/item/proc/resolve_attackby(atom/A, mob/user) + add_fingerprint(user) + return A.attackby(src, user) + // No comment /atom/proc/attackby(obj/item/W, mob/user) return /atom/movable/attackby(obj/item/W, mob/user) - if(!(W.flags&NOBLUDGEON)) + if(!(W.flags & NOBLUDGEON)) visible_message("[src] has been hit by [user] with [W].") /mob/living/attackby(obj/item/I, mob/user) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - if(istype(I) && ismob(user)) - I.attack(src, user) - + if(!ismob(user)) + return 0 + if(can_operate(src) && do_surgery(src,user,I)) //Surgery + return 1 + return I.attack(src, user, user.zone_sel.selecting) // Proximity_flag is 1 if this afterattack was called on something adjacent, in your square, or on your person. // Click parameters is the params string from byond Click() code, see that documentation. /obj/item/proc/afterattack(atom/target, mob/user, proximity_flag, click_parameters) return -//TODO: refactor mob attack code. -/* -Busy writing something else that I don't want to get mixed up in a general attack code, and I don't want to forget this so leaving a note here. -leave attackby() as handling the general case of "using an item on a mob" -attackby() will decide to call attacked_by() or not. -attacked_by() will be made a living level proc and handle the specific case of "attacking with an item to cause harm" -attacked_by() will then call attack() so that stunbatons and other weapons that have special attack effects can do their thing. -attacked_by() will handle hitting/missing/logging as it does now, and will call attack() to apply the attack effects (damage) instead of the other way around (as it is now). -*/ - -/obj/item/proc/attack(mob/living/M as mob, mob/living/user as mob, def_zone) - - if(!istype(M) || (can_operate(M) && do_surgery(M,user,src))) return 0 +//I would prefer to rename this attack_as_weapon(), but that would involve touching hundreds of files. +/obj/item/proc/attack(mob/living/M, mob/living/user, var/target_zone) + if(!force || (flags & NOBLUDGEON)) + return 0 + if(M == user && user.a_intent != I_HURT) + return 0 ///////////////////////// user.lastattacked = M @@ -46,50 +65,22 @@ attacked_by() will handle hitting/missing/logging as it does now, and will call msg_admin_attack("[key_name(user)] attacked [key_name(M)] with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])" ) ///////////////////////// - // Attacking someone with a weapon while they are neck-grabbed - if(user.a_intent == I_HURT) - for(var/obj/item/weapon/grab/G in M.grabbed_by) - if(G.assailant == user && G.state >= GRAB_NECK) - M.attack_throat(src, G, user) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + user.do_attack_animation(M) + var/hit_zone = M.resolve_item_attack(src, user, target_zone) + if(hit_zone) + apply_hit_effect(M, user, hit_zone) + + return 1 + +//Called when a weapon is used to make a successful melee attack on a mob. Returns the blocked result +/obj/item/proc/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone) + if(hitsound) + playsound(loc, hitsound, 50, 1, -1) + var/power = force if(HULK in user.mutations) power *= 2 + return target.hit_with_weapon(src, user, power, hit_zone) - // TODO: needs to be refactored into a mob/living level attacked_by() proc. ~Z - user.do_attack_animation(M) - user.break_cloak() - if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - - // Handle striking to cripple. - var/dislocation_str - if(user.a_intent == I_DISARM) - dislocation_str = H.attack_joint(src, user, def_zone) - if(H.attacked_by(src, user, def_zone) && hitsound) - playsound(loc, hitsound, 50, 1, -1) - spawn(1) //ugh I hate this but I don't want to root through human attack procs to print it after this call resolves. - if(dislocation_str) user.visible_message("[dislocation_str]") - return 1 - return 0 - else - if(attack_verb.len) - user.visible_message("[M] has been [pick(attack_verb)] with [src] by [user]!") - else - user.visible_message("[M] has been attacked with [src] by [user]!") - - if (hitsound) - playsound(loc, hitsound, 50, 1, -1) - switch(damtype) - if("brute") - M.take_organ_damage(power) - if(prob(33)) // Added blood for whacking non-humans too - var/turf/simulated/location = get_turf(M) - if(istype(location)) location.add_blood_floor(M) - if("fire") - if (!(COLD_RESISTANCE in M.mutations)) - M.take_organ_damage(0, power) - M << "Aargh it burns!" - M.updatehealth() - add_fingerprint(user) - return 1 diff --git a/code/controllers/ProcessScheduler/ProcessScheduler.dme b/code/controllers/ProcessScheduler/ProcessScheduler.dme deleted file mode 100644 index bf17734cc28..00000000000 --- a/code/controllers/ProcessScheduler/ProcessScheduler.dme +++ /dev/null @@ -1,32 +0,0 @@ -// DM Environment file for ProcessScheduler.dme. -// All manual changes should be made outside the BEGIN_ and END_ blocks. -// New source code should be placed in .dm files: choose File/New --> Code File. - -// BEGIN_INTERNALS -// END_INTERNALS - -// BEGIN_FILE_DIR -#define FILE_DIR . -// END_FILE_DIR - -// BEGIN_PREFERENCES -// END_PREFERENCES - -// BEGIN_INCLUDE -#include "core\_define.dm" -#include "core\_stubs.dm" -#include "core\process.dm" -#include "core\processScheduler.dm" -#include "core\updateQueue.dm" -#include "core\updateQueueWorker.dm" -#include "test\processSchedulerView.dm" -#include "test\testDyingUpdateQueueProcess.dm" -#include "test\testHarness.dm" -#include "test\testHungProcess.dm" -#include "test\testNiceProcess.dm" -#include "test\testSlowProcess.dm" -#include "test\testUpdateQueue.dm" -#include "test\testUpdateQueueProcess.dm" -#include "test\testZombieProcess.dm" -// END_INCLUDE - diff --git a/code/controllers/ProcessScheduler/core/_stubs.dm b/code/controllers/ProcessScheduler/core/_stubs.dm index 326fd29ac2a..3615c12f192 100644 --- a/code/controllers/ProcessScheduler/core/_stubs.dm +++ b/code/controllers/ProcessScheduler/core/_stubs.dm @@ -4,15 +4,7 @@ * This file contains constructs that the process scheduler expects to exist * in a standard ss13 fork. */ -/* -/** - * message_admins - * - * sends a message to admins - */ -/proc/message_admins(msg) - world << msg -*/ + /** * logTheThing * @@ -25,14 +17,3 @@ world << "Diary: \[[diaryType]:[type]] [text]" else world << "Log: \[[type]] [text]" - -/** - * var/disposed - * - * In goonstation, disposed is set to 1 after an object enters the delete queue - * or the object is placed in an object pool (effectively out-of-play so to speak) - */ -/datum/var/disposed -// Garbage collection (controller). -/datum/var/gcDestroyed -/datum/var/timeDestroyed \ No newline at end of file diff --git a/code/controllers/ProcessScheduler/core/process.dm b/code/controllers/ProcessScheduler/core/process.dm index 1f27f4c1ded..b7767c367fd 100644 --- a/code/controllers/ProcessScheduler/core/process.dm +++ b/code/controllers/ProcessScheduler/core/process.dm @@ -48,7 +48,7 @@ // This controls how often the process will yield (call sleep(0)) while it is running. // Every concurrent process should sleep periodically while running in order to allow other // processes to execute concurrently. - var/tmp/sleep_interval = PROCESS_DEFAULT_SLEEP_INTERVAL + var/tmp/sleep_interval // hang_warning_time - this is the time (in 1/10 seconds) after which the server will begin to show "maybe hung" in the context window var/tmp/hang_warning_time = PROCESS_DEFAULT_HANG_WARNING_TIME @@ -59,20 +59,20 @@ // hang_restart_time - After this much time(in 1/10 seconds), the server will automatically kill and restart the process. var/tmp/hang_restart_time = PROCESS_DEFAULT_HANG_RESTART_TIME - // cpu_threshold - if world.cpu >= cpu_threshold, scheck() will call sleep(1) to defer further work until the next tick. This keeps a process from driving a tick into overtime (causing perceptible lag) - var/tmp/cpu_threshold = PROCESS_DEFAULT_CPU_THRESHOLD - // How many times in the current run has the process deferred work till the next tick? var/tmp/cpu_defer_count = 0 + // How many SCHECKs have been skipped (to limit btime calls) + var/tmp/calls_since_last_scheck = 0 + /** * recordkeeping vars */ - // Records the time (server ticks) at which the process last finished sleeping + // Records the time (1/10s timeofday) at which the process last finished sleeping var/tmp/last_slept = 0 - // Records the time (s-ticks) at which the process last began running + // Records the time (1/10s timeofday) at which the process last began running var/tmp/run_start = 0 // Records the number of times this process has been killed and restarted @@ -85,26 +85,33 @@ var/tmp/last_object -datum/controller/process/New(var/datum/controller/processScheduler/scheduler) + // Counts the number of times an exception has occurred; gets reset after 10 + var/tmp/list/exceptions = list() + + // Number of deciseconds to delay before starting the process + var/start_delay = 0 + +/datum/controller/process/New(var/datum/controller/processScheduler/scheduler) ..() main = scheduler previousStatus = "idle" idle() name = "process" schedule_interval = 50 - sleep_interval = 2 + sleep_interval = world.tick_lag / PROCESS_DEFAULT_SLEEP_INTERVAL last_slept = 0 run_start = 0 ticks = 0 last_task = 0 last_object = null -datum/controller/process/proc/started() +/datum/controller/process/proc/started() + var/timeofhour = TimeOfHour // Initialize last_slept so we can know when to sleep - last_slept = world.timeofday + last_slept = timeofhour // Initialize run_start so we can detect hung processes. - run_start = world.timeofday + run_start = timeofhour // Initialize defer count cpu_defer_count = 0 @@ -114,65 +121,65 @@ datum/controller/process/proc/started() onStart() -datum/controller/process/proc/finished() +/datum/controller/process/proc/finished() ticks++ idle() main.processFinished(src) onFinish() -datum/controller/process/proc/doWork() +/datum/controller/process/proc/doWork() -datum/controller/process/proc/setup() +/datum/controller/process/proc/setup() -datum/controller/process/proc/process() +/datum/controller/process/proc/process() started() doWork() finished() -datum/controller/process/proc/running() +/datum/controller/process/proc/running() idle = 0 queued = 0 running = 1 hung = 0 setStatus(PROCESS_STATUS_RUNNING) -datum/controller/process/proc/idle() +/datum/controller/process/proc/idle() queued = 0 running = 0 idle = 1 hung = 0 setStatus(PROCESS_STATUS_IDLE) -datum/controller/process/proc/queued() +/datum/controller/process/proc/queued() idle = 0 running = 0 queued = 1 hung = 0 setStatus(PROCESS_STATUS_QUEUED) -datum/controller/process/proc/hung() +/datum/controller/process/proc/hung() hung = 1 setStatus(PROCESS_STATUS_HUNG) -datum/controller/process/proc/handleHung() +/datum/controller/process/proc/handleHung() + var/timeofhour = TimeOfHour var/datum/lastObj = last_object var/lastObjType = "null" if(istype(lastObj)) lastObjType = lastObj.type - // If world.timeofday has rolled over, then we need to adjust. - if (world.timeofday < run_start) - run_start -= 864000 - - var/msg = "[name] process hung at tick #[ticks]. Process was unresponsive for [(world.timeofday - run_start) / 10] seconds and was restarted. Last task: [last_task]. Last Object Type: [lastObjType]" + // If timeofhour has rolled over, then we need to adjust. + if (timeofhour < run_start) + run_start -= 36000 + var/msg = "[name] process hung at tick #[ticks]. Process was unresponsive for [(timeofhour - run_start) / 10] seconds and was restarted. Last task: [last_task]. Last Object Type: [lastObjType]" logTheThing("debug", null, null, msg) logTheThing("diary", null, null, msg, "debug") message_admins(msg) main.restartProcess(src.name) -datum/controller/process/proc/kill() +/datum/controller/process/proc/kill() if (!killed) var/msg = "[name] process was killed at tick #[ticks]." logTheThing("debug", null, null, msg) @@ -182,59 +189,68 @@ datum/controller/process/proc/kill() // Allow inheritors to clean up if needed onKill() - killed = TRUE + // This should del + del(src) - del(src) // This should del - -datum/controller/process/proc/scheck(var/tickId = 0) +// Do not call this directly - use SHECK or SCHECK_EVERY +/datum/controller/process/proc/sleepCheck(var/tickId = 0) + calls_since_last_scheck = 0 if (killed) // The kill proc is the only place where killed is set. // The kill proc should have deleted this datum, and all sleeping procs that are // owned by it. CRASH("A killed process is still running somehow...") + if (hung) + // This will only really help if the doWork proc ends up in an infinite loop. + handleHung() + CRASH("Process [name] hung and was restarted.") - // For each tick the process defers, it increments the cpu_defer_count so we don't - // defer indefinitely - if (world.cpu >= cpu_threshold + cpu_defer_count * 10) - sleep(1) + if (main.getCurrentTickElapsedTime() > main.timeAllowance) + sleep(world.tick_lag) cpu_defer_count++ - last_slept = world.timeofday + last_slept = TimeOfHour else - // If world.timeofday has rolled over, then we need to adjust. - if (world.timeofday < last_slept) - last_slept -= 864000 + var/timeofhour = TimeOfHour + // If timeofhour has rolled over, then we need to adjust. + if (timeofhour < last_slept) + last_slept -= 36000 - if (world.timeofday > last_slept + sleep_interval) - // If we haven't slept in sleep_interval ticks, sleep to allow other work to proceed. + if (timeofhour > last_slept + sleep_interval) + // If we haven't slept in sleep_interval deciseconds, sleep to allow other work to proceed. sleep(0) - last_slept = world.timeofday + last_slept = TimeOfHour -datum/controller/process/proc/update() +/datum/controller/process/proc/update() // Clear delta if(previousStatus != status) setStatus(status) var/elapsedTime = getElapsedTime() - if (elapsedTime > hang_restart_time) + if (hung) + handleHung() + return + else if (elapsedTime > hang_restart_time) hung() else if (elapsedTime > hang_alert_time) setStatus(PROCESS_STATUS_PROBABLY_HUNG) else if (elapsedTime > hang_warning_time) setStatus(PROCESS_STATUS_MAYBE_HUNG) -datum/controller/process/proc/getElapsedTime() - if (world.timeofday < run_start) - return world.timeofday - (run_start - 864000) - return world.timeofday - run_start -datum/controller/process/proc/tickDetail() +/datum/controller/process/proc/getElapsedTime() + var/timeofhour = TimeOfHour + if (timeofhour < run_start) + return timeofhour - (run_start - 36000) + return timeofhour - run_start + +/datum/controller/process/proc/tickDetail() return -datum/controller/process/proc/getContext() +/datum/controller/process/proc/getContext() return "[name][main.averageRunTime(src)][main.last_run_time[src]][main.highest_run_time[src]][ticks]\n" -datum/controller/process/proc/getContextData() +/datum/controller/process/proc/getContextData() return list( "name" = name, "averageRunTime" = main.averageRunTime(src), @@ -246,10 +262,10 @@ datum/controller/process/proc/getContextData() "disabled" = disabled ) -datum/controller/process/proc/getStatus() +/datum/controller/process/proc/getStatus() return status -datum/controller/process/proc/getStatusText(var/s = 0) +/datum/controller/process/proc/getStatusText(var/s = 0) if(!s) s = status switch(s) @@ -268,21 +284,21 @@ datum/controller/process/proc/getStatusText(var/s = 0) else return "UNKNOWN" -datum/controller/process/proc/getPreviousStatus() +/datum/controller/process/proc/getPreviousStatus() return previousStatus -datum/controller/process/proc/getPreviousStatusText() +/datum/controller/process/proc/getPreviousStatusText() return getStatusText(previousStatus) -datum/controller/process/proc/setStatus(var/newStatus) +/datum/controller/process/proc/setStatus(var/newStatus) previousStatus = status status = newStatus -datum/controller/process/proc/setLastTask(var/task, var/object) +/datum/controller/process/proc/setLastTask(var/task, var/object) last_task = task last_object = object -datum/controller/process/proc/_copyStateFrom(var/datum/controller/process/target) +/datum/controller/process/proc/_copyStateFrom(var/datum/controller/process/target) main = target.main name = target.name schedule_interval = target.schedule_interval @@ -295,28 +311,62 @@ datum/controller/process/proc/_copyStateFrom(var/datum/controller/process/target last_object = target.last_object copyStateFrom(target) -datum/controller/process/proc/copyStateFrom(var/datum/controller/process/target) +/datum/controller/process/proc/copyStateFrom(var/datum/controller/process/target) -datum/controller/process/proc/onKill() +/datum/controller/process/proc/onKill() -datum/controller/process/proc/onStart() +/datum/controller/process/proc/onStart() -datum/controller/process/proc/onFinish() +/datum/controller/process/proc/onFinish() -datum/controller/process/proc/disable() +/datum/controller/process/proc/disable() disabled = 1 -datum/controller/process/proc/enable() +/datum/controller/process/proc/enable() disabled = 0 +/datum/controller/process/proc/getAverageRunTime() + return main.averageRunTime(src) /datum/controller/process/proc/getLastRunTime() return main.getProcessLastRunTime(src) +/datum/controller/process/proc/getHighestRunTime() + return main.getProcessHighestRunTime(src) + /datum/controller/process/proc/getTicks() return ticks -/datum/controller/process/proc/getStatName() - return name +/datum/controller/process/proc/statProcess() + var/averageRunTime = round(getAverageRunTime(), 0.1)/10 + var/lastRunTime = round(getLastRunTime(), 0.1)/10 + var/highestRunTime = round(getHighestRunTime(), 0.1)/10 + stat("[name]", "T#[getTicks()] | AR [averageRunTime] | LR [lastRunTime] | HR [highestRunTime] | D [cpu_defer_count]") -/datum/controller/process/proc/getTickTime() - return "#[getTicks()]\t- [getLastRunTime()]" +/datum/controller/process/proc/catchException(var/exception/e, var/thrower) + var/etext = "[e]" + var/eid = "[e]" // Exception ID, for tracking repeated exceptions + var/ptext = "" // "processing..." text, for what was being processed (if known) + if(istype(e)) + etext += " in [e.file], line [e.line]" + eid = "[e.file]:[e.line]" + if(eid in exceptions) + if(exceptions[eid]++ >= 10) + return + else + exceptions[eid] = 1 + if(istype(thrower, /datum)) + var/datum/D = thrower + ptext = " processing [D.type]" + if(istype(thrower, /atom)) + var/atom/A = thrower + ptext += " ([A]) ([A.x],[A.y],[A.z])" + log_to_dd("\[[time_stamp()]\] Process [name] caught exception[ptext]: [etext]") + if(exceptions[eid] >= 10) + log_to_dd("This exception will now be ignored for ten minutes.") + spawn(6000) + exceptions[eid] = 0 + +/datum/controller/process/proc/catchBadType(var/datum/caught) + if(isnull(caught) || !istype(caught) || !isnull(caught.gcDestroyed)) + return // Only bother with types we can identify and that don't belong + catchException("Type [caught.type] does not belong in process' queue") \ No newline at end of file diff --git a/code/controllers/ProcessScheduler/core/processScheduler.dm b/code/controllers/ProcessScheduler/core/processScheduler.dm index 1be24045938..bde79fba07b 100644 --- a/code/controllers/ProcessScheduler/core/processScheduler.dm +++ b/code/controllers/ProcessScheduler/core/processScheduler.dm @@ -17,7 +17,10 @@ var/global/datum/controller/processScheduler/processScheduler // Process name -> process object map var/tmp/datum/controller/process/list/nameToProcessMap = new - // Process last start times + // Process last queued times (world time) + var/tmp/datum/controller/process/list/last_queued = new + + // Process last start times (real time) var/tmp/datum/controller/process/list/last_start = new // Process last run durations @@ -29,8 +32,8 @@ var/global/datum/controller/processScheduler/processScheduler // Process highest run time var/tmp/datum/controller/process/list/highest_run_time = new - // Sleep 1 tick -- This may be too aggressive. - var/tmp/scheduler_sleep_interval = 1 + // How long to sleep between runs (set to tick_lag in New) + var/tmp/scheduler_sleep_interval // Controls whether the scheduler is running or not var/tmp/isRunning = 0 @@ -38,6 +41,25 @@ var/global/datum/controller/processScheduler/processScheduler // Setup for these processes will be deferred until all the other processes are set up. var/tmp/list/deferredSetupList = new + var/tmp/currentTick = 0 + + var/tmp/currentTickStart = 0 + + var/tmp/timeAllowance = 0 + + var/tmp/cpuAverage = 0 + + var/tmp/timeAllowanceMax = 0 + +/datum/controller/processScheduler/New() + ..() + // When the process scheduler is first new'd, tick_lag may be wrong, so these + // get re-initialized when the process scheduler is started. + // (These are kept here for any processes that decide to process before round start) + scheduler_sleep_interval = world.tick_lag + timeAllowance = world.tick_lag * 0.5 + timeAllowanceMax = world.tick_lag + /** * deferSetupFor * @param path processPath @@ -57,7 +79,7 @@ var/global/datum/controller/processScheduler/processScheduler var/process // Add all the processes we can find, except for the ticker - for (process in typesof(/datum/controller/process) - /datum/controller/process) + for (process in subtypesof(/datum/controller/process)) if (!(process in deferredSetupList)) addProcess(new process(src)) @@ -66,11 +88,22 @@ var/global/datum/controller/processScheduler/processScheduler /datum/controller/processScheduler/proc/start() isRunning = 1 + // tick_lag will have been set by now, so re-initialize these + scheduler_sleep_interval = world.tick_lag + timeAllowance = world.tick_lag * 0.5 + timeAllowanceMax = world.tick_lag + updateStartDelays() spawn(0) process() /datum/controller/processScheduler/proc/process() + updateCurrentTickData() + + for(var/i=world.tick_lag,i last_start[p] + p.schedule_interval) + if (world.time >= last_queued[p] + p.schedule_interval) setQueuedProcessState(p) /datum/controller/processScheduler/proc/runQueuedProcesses() @@ -176,6 +201,10 @@ var/global/datum/controller/processScheduler/processScheduler nameToProcessMap[newProcess.name] = newProcess +/datum/controller/processScheduler/proc/updateStartDelays() + for(var/datum/controller/process/p in processes) + if(p.start_delay) + last_queued[p] = world.time - p.start_delay /datum/controller/processScheduler/proc/runProcess(var/datum/controller/process/process) spawn(0) @@ -197,8 +226,6 @@ var/global/datum/controller/processScheduler/processScheduler if (!(process in idle)) idle += process - process.idle() - /datum/controller/processScheduler/proc/setQueuedProcessState(var/datum/controller/process/process) if (process in running) running -= process @@ -218,21 +245,22 @@ var/global/datum/controller/processScheduler/processScheduler if (!(process in running)) running += process - process.running() - /datum/controller/processScheduler/proc/recordStart(var/datum/controller/process/process, var/time = null) if (isnull(time)) - time = world.timeofday - - last_start[process] = time + time = TimeOfHour + last_queued[process] = world.time + last_start[process] = time + else + last_queued[process] = (time == 0 ? 0 : world.time) + last_start[process] = time /datum/controller/processScheduler/proc/recordEnd(var/datum/controller/process/process, var/time = null) if (isnull(time)) - time = world.timeofday + time = TimeOfHour // If world.timeofday has rolled over, then we need to adjust. if (time < last_start[process]) - last_start[process] -= 864000 + last_start[process] -= 36000 var/lastRunTime = time - last_start[process] @@ -273,6 +301,12 @@ var/global/datum/controller/processScheduler/processScheduler return t / c return c +/datum/controller/processScheduler/proc/getProcessLastRunTime(var/datum/controller/process/process) + return last_run_time[process] + +/datum/controller/processScheduler/proc/getProcessHighestRunTime(var/datum/controller/process/process) + return highest_run_time[process] + /datum/controller/processScheduler/proc/getStatusData() var/list/data = new @@ -310,11 +344,39 @@ var/global/datum/controller/processScheduler/processScheduler var/datum/controller/process/process = nameToProcessMap[processName] process.disable() -/datum/controller/processScheduler/proc/getProcess(var/name) - return nameToProcessMap[name] +/datum/controller/processScheduler/proc/getCurrentTickElapsedTime() + if (world.time > currentTick) + updateCurrentTickData() + return 0 + else + return TimeOfHour - currentTickStart -/datum/controller/processScheduler/proc/getProcessLastRunTime(var/datum/controller/process/process) - return last_run_time[process] +/datum/controller/processScheduler/proc/updateCurrentTickData() + if (world.time > currentTick) + // New tick! + currentTick = world.time + currentTickStart = TimeOfHour + updateTimeAllowance() + cpuAverage = (world.cpu + cpuAverage + cpuAverage) / 3 -/datum/controller/processScheduler/proc/getIsRunning() - return isRunning +/datum/controller/processScheduler/proc/updateTimeAllowance() + // Time allowance goes down linearly with world.cpu. + var/tmp/error = cpuAverage - 100 + var/tmp/timeAllowanceDelta = sign(error) * -0.5 * world.tick_lag * max(0, 0.001 * abs(error)) + + //timeAllowance = world.tick_lag * min(1, 0.5 * ((200/max(1,cpuAverage)) - 1)) + timeAllowance = min(timeAllowanceMax, max(0, timeAllowance + timeAllowanceDelta)) + +/datum/controller/processScheduler/proc/sign(var/x) + if (x == 0) + return 1 + return x / abs(x) + +/datum/controller/processScheduler/proc/statProcesses() + if(!isRunning) + stat("Processes", "Scheduler not running") + return + stat("Processes", "[processes.len] (R [running.len] / Q [queued.len] / I [idle.len])") + stat(null, "[round(cpuAverage, 0.1)] CPU, [round(timeAllowance, 0.1)/10] TA") + for(var/datum/controller/process/p in processes) + p.statProcess() \ No newline at end of file diff --git a/code/controllers/ProcessScheduler/core/updateQueue.dm b/code/controllers/ProcessScheduler/core/updateQueue.dm deleted file mode 100644 index 118b6692b5a..00000000000 --- a/code/controllers/ProcessScheduler/core/updateQueue.dm +++ /dev/null @@ -1,127 +0,0 @@ -/** - * updateQueue.dm - */ - -#ifdef UPDATE_QUEUE_DEBUG -#define uq_dbg(text) world << text -#else -#define uq_dbg(text) -#endif -/datum/updateQueue - var/tmp/list/objects - var/tmp/previousStart - var/tmp/procName - var/tmp/list/arguments - var/tmp/datum/updateQueueWorker/currentWorker - var/tmp/workerTimeout - var/tmp/adjustedWorkerTimeout - var/tmp/currentKillCount - var/tmp/totalKillCount - -/datum/updateQueue/New(list/objects = list(), procName = "update", list/arguments = list(), workerTimeout = 2, inplace = 0) - ..() - - uq_dbg("Update queue created.") - - // Init proc allows for recycling the worker. - init(objects = objects, procName = procName, arguments = arguments, workerTimeout = workerTimeout, inplace = inplace) - -/** - * init - * @param list objects objects to update - * @param text procName the proc to call on each item in the object list - * @param list arguments optional arguments to pass to the update proc - * @param number workerTimeout number of ticks to wait for an update to - finish before forking a new update worker - * @param bool inplace whether the updateQueue should make a copy of objects. - the internal list will be modified, so it is usually - a good idea to leave this alone. Default behavior is to - copy. - */ -/datum/updateQueue/proc/init(list/objects = list(), procName = "update", list/arguments = list(), workerTimeout = 2, inplace = 0) - uq_dbg("Update queue initialization started.") - - if (!inplace) - // Make an internal copy of the list so we're not modifying the original. - initList(objects) - else - src.objects = objects - - // Init vars - src.procName = procName - src.arguments = arguments - src.workerTimeout = workerTimeout - - adjustedWorkerTimeout = workerTimeout - currentKillCount = 0 - totalKillCount = 0 - - uq_dbg("Update queue initialization finished. procName = '[procName]'") - -/datum/updateQueue/proc/initList(list/toCopy) - /** - * We will copy the list in reverse order, as our doWork proc - * will access them by popping an element off the end of the list. - * This ends up being quite a lot faster than taking elements off - * the head of the list. - */ - objects = new - - uq_dbg("Copying [toCopy.len] items for processing.") - - for(var/i=toCopy.len,i>0,) - objects.len++ - objects[objects.len] = toCopy[i--] - -/datum/updateQueue/proc/Run() - uq_dbg("Starting run...") - - startWorker() - while (istype(currentWorker) && !currentWorker.finished) - sleep(2) - checkWorker() - - uq_dbg("UpdateQueue completed run.") - -/datum/updateQueue/proc/checkWorker() - if(istype(currentWorker)) - // If world.timeofday has rolled over, then we need to adjust. - if(world.timeofday < currentWorker.lastStart) - currentWorker.lastStart -= 864000 - - if(world.timeofday - currentWorker.lastStart > adjustedWorkerTimeout) - // This worker is a bit slow, let's spawn a new one and kill the old one. - uq_dbg("Current worker is lagging... starting a new one.") - killWorker() - startWorker() - else // No worker! - uq_dbg("update queue ended up without a worker... starting a new one...") - startWorker() - -/datum/updateQueue/proc/startWorker() - // only run the worker if we have objects to work on - if(objects.len) - uq_dbg("Starting worker process.") - - // No need to create a fresh worker if we already have one... - if (istype(currentWorker)) - currentWorker.init(objects, procName, arguments) - else - currentWorker = new(objects, procName, arguments) - currentWorker.start() - else - uq_dbg("Queue is empty. No worker was started.") - currentWorker = null - -/datum/updateQueue/proc/killWorker() - // Kill the worker - currentWorker.kill() - currentWorker = null - // After we kill a worker, yield so that if the worker's been tying up the cpu, other stuff can immediately resume - sleep(-1) - currentKillCount++ - totalKillCount++ - if (currentKillCount >= 3) - uq_dbg("[currentKillCount] workers have been killed with a timeout of [adjustedWorkerTimeout]. Increasing worker timeout to compensate.") - adjustedWorkerTimeout++ - currentKillCount = 0 \ No newline at end of file diff --git a/code/controllers/ProcessScheduler/core/updateQueueWorker.dm b/code/controllers/ProcessScheduler/core/updateQueueWorker.dm deleted file mode 100644 index 66f66bbcc01..00000000000 --- a/code/controllers/ProcessScheduler/core/updateQueueWorker.dm +++ /dev/null @@ -1,83 +0,0 @@ -datum/updateQueueWorker - var/tmp/list/objects - var/tmp/killed - var/tmp/finished - var/tmp/procName - var/tmp/list/arguments - var/tmp/lastStart - var/tmp/cpuThreshold - -datum/updateQueueWorker/New(var/list/objects, var/procName, var/list/arguments, var/cpuThreshold = 90) - ..() - uq_dbg("updateQueueWorker created.") - - init(objects, procName, arguments, cpuThreshold) - -datum/updateQueueWorker/proc/init(var/list/objects, var/procName, var/list/arguments, var/cpuThreshold = 90) - src.objects = objects - src.procName = procName - src.arguments = arguments - src.cpuThreshold = cpuThreshold - - killed = 0 - finished = 0 - -datum/updateQueueWorker/proc/doWork() - // If there's nothing left to execute or we were killed, mark finished and return. - if (!objects || !objects.len) return finished() - - lastStart = world.timeofday // Absolute number of ticks since the world started up - - var/datum/object = objects[objects.len] // Pull out the object - objects.len-- // Remove the object from the list - - if (istype(object) && !isturf(object) && !object.disposed && isnull(object.gcDestroyed)) // We only work with real objects - call(object, procName)(arglist(arguments)) - - // If there's nothing left to execute - // or we were killed while running the above code, mark finished and return. - if (!objects || !objects.len) return finished() - - if (world.cpu > cpuThreshold) - // We don't want to force a tick into overtime! - // If the tick is about to go overtime, spawn the next update to go - // in the next tick. - uq_dbg("tick went into overtime with world.cpu = [world.cpu], deferred next update to next tick [1+(world.time / world.tick_lag)]") - - spawn(1) - doWork() - else - spawn(0) // Execute anonymous function immediately as if we were in a while loop... - doWork() - -datum/updateQueueWorker/proc/finished() - uq_dbg("updateQueueWorker finished.") - /** - * If the worker was killed while it was working on something, it - * should delete itself when it finally finishes working on it. - * Meanwhile, the updateQueue will have proceeded on with the rest of - * the queue. This will also terminate the spawned function that was - * created in the kill() proc. - */ - if(killed) - del(src) - - finished = 1 - -datum/updateQueueWorker/proc/kill() - uq_dbg("updateQueueWorker killed.") - killed = 1 - objects = null - - /** - * If the worker is not done in 30 seconds after it's killed, - * we'll forcibly delete it, causing the anonymous function it was - * running to be terminated. Hasta la vista, baby. - */ - spawn(300) - del(src) - -datum/updateQueueWorker/proc/start() - uq_dbg("updateQueueWorker started.") - spawn(0) - doWork() \ No newline at end of file diff --git a/code/controllers/ProcessScheduler/test/processSchedulerView.dm b/code/controllers/ProcessScheduler/test/processSchedulerView.dm deleted file mode 100644 index ae78b3f0154..00000000000 --- a/code/controllers/ProcessScheduler/test/processSchedulerView.dm +++ /dev/null @@ -1,94 +0,0 @@ -/datum/processSchedulerView - -/datum/processSchedulerView/Topic(href, href_list) - if (!href_list["action"]) - return - - switch (href_list["action"]) - if ("kill") - var/toKill = href_list["name"] - processScheduler.killProcess(toKill) - refreshProcessTable() - if ("enable") - var/toEnable = href_list["name"] - processScheduler.enableProcess(toEnable) - refreshProcessTable() - if ("disable") - var/toDisable = href_list["name"] - processScheduler.disableProcess(toDisable) - refreshProcessTable() - if ("refresh") - refreshProcessTable() - -/datum/processSchedulerView/proc/refreshProcessTable() - windowCall("handleRefresh", getProcessTable()) - -/datum/processSchedulerView/proc/windowCall(var/function, var/data = null) - usr << output(data, "processSchedulerContext.browser:[function]") - -/datum/processSchedulerView/proc/getProcessTable() - var/text = "" - // and the context of each - for (var/list/data in processScheduler.getStatusData()) - text += "" - text += "" - text += "" - text += "" - text += "" - text += "" - text += "" - text += "" - text += "" - text += "" - - text += "
NameAvg(s)Last(s)Highest(s)TickcountTickrateStateAction
[data["name"]][num2text(data["averageRunTime"]/10,3)][num2text(data["lastRunTime"]/10,3)][num2text(data["highestRunTime"]/10,3)][num2text(data["ticks"],4)][data["schedule"]][data["status"]]" - if (data["disabled"]) - text += "" - else - text += "" - text += "
" - return text - -/** - * getContext - * Outputs an interface showing stats for all processes. - */ -/datum/processSchedulerView/proc/getContext() - bootstrap_browse() - usr << browse('processScheduler.js', "file=processScheduler.js;display=0") - - var/text = {" - Process Scheduler Detail - - [bootstrap_includes()] - - - -

Process Scheduler

-
- -
- -

The process scheduler controls [processScheduler.getProcessCount()] loops.

"} - - text += "
" - text += getProcessTable() - text += "
" - - usr << browse(text, "window=processSchedulerContext;size=800x600") - -/datum/processSchedulerView/proc/bootstrap_browse() - usr << browse('bower_components/jquery/dist/jquery.min.js', "file=jquery.min.js;display=0") - usr << browse('bower_components/bootstrap2.3.2/bootstrap/js/bootstrap.min.js', "file=bootstrap.min.js;display=0") - usr << browse('bower_components/bootstrap2.3.2/bootstrap/css/bootstrap.min.css', "file=bootstrap.min.css;display=0") - usr << browse('bower_components/bootstrap2.3.2/bootstrap/img/glyphicons-halflings-white.png', "file=glyphicons-halflings-white.png;display=0") - usr << browse('bower_components/bootstrap2.3.2/bootstrap/img/glyphicons-halflings.png', "file=glyphicons-halflings.png;display=0") - usr << browse('bower_components/json2/json2.js', "file=json2.js;display=0") - -/datum/processSchedulerView/proc/bootstrap_includes() - return {" - - - - - "} diff --git a/code/controllers/ProcessScheduler/test/testDyingUpdateQueueProcess.dm b/code/controllers/ProcessScheduler/test/testDyingUpdateQueueProcess.dm deleted file mode 100644 index d08ec46c7da..00000000000 --- a/code/controllers/ProcessScheduler/test/testDyingUpdateQueueProcess.dm +++ /dev/null @@ -1,27 +0,0 @@ -/** - * testDyingUpdateQueueProcess - * This process is an example of a process using an updateQueue. - * The datums updated by this process behave badly and block the update loop - * by sleeping. If you #define UPDATE_QUEUE_DEBUG, you will see the updateQueue - * killing off its worker processes and spawning new ones to work around slow - * updates. This means that if you have a code path that sleeps for a long time - * in mob.Life once in a blue moon, the mob update loop will not hang. - */ -/datum/slowTestDatum/proc/wackyUpdateProcessName() - sleep(rand(0,20)) // Randomly REALLY slow :| - -/datum/controller/process/testDyingUpdateQueueProcess - var/tmp/datum/updateQueue/updateQueueInstance - var/tmp/list/testDatums = list() - -/datum/controller/process/testDyingUpdateQueueProcess/setup() - name = "Dying UpdateQueue Process" - schedule_interval = 30 // every 3 seconds - updateQueueInstance = new - for(var/i = 1, i < 30, i++) - testDatums.Add(new /datum/slowTestDatum) - -/datum/controller/process/testDyingUpdateQueueProcess/doWork() - updateQueueInstance.init(testDatums, "wackyUpdateProcessName") - updateQueueInstance.Run() - \ No newline at end of file diff --git a/code/controllers/ProcessScheduler/test/testHarness.dm b/code/controllers/ProcessScheduler/test/testHarness.dm deleted file mode 100644 index 2b5f1dff813..00000000000 --- a/code/controllers/ProcessScheduler/test/testHarness.dm +++ /dev/null @@ -1,35 +0,0 @@ -/* - These are simple defaults for your project. - */ -#define DEBUG - -var/global/datum/processSchedulerView/processSchedulerView - -world - loop_checks = 0 - New() - ..() - processScheduler = new - processSchedulerView = new - -mob - step_size = 8 - - New() - ..() - - - verb - startProcessScheduler() - set name = "Start Process Scheduler" - processScheduler.setup() - processScheduler.start() - - getProcessSchedulerContext() - set name = "Get Process Scheduler Status Panel" - processSchedulerView.getContext() - - runUpdateQueueTests() - set name = "Run Update Queue Testsuite" - var/datum/updateQueueTests/t = new - t.runTests() \ No newline at end of file diff --git a/code/controllers/ProcessScheduler/test/testHungProcess.dm b/code/controllers/ProcessScheduler/test/testHungProcess.dm deleted file mode 100644 index ced05dd4d70..00000000000 --- a/code/controllers/ProcessScheduler/test/testHungProcess.dm +++ /dev/null @@ -1,15 +0,0 @@ -/** - * testHungProcess - * This process is an example of a simple update loop process that hangs. - */ - -/datum/controller/process/testHungProcess/setup() - name = "Hung Process" - schedule_interval = 30 // every 3 seconds - -/datum/controller/process/testHungProcess/doWork() - sleep(1000) // FUCK - // scheck is also responsible for handling hung processes. If a process - // hangs, and later resumes, but has already been killed by the scheduler, - // scheck will force the process to bail out. - scheck() \ No newline at end of file diff --git a/code/controllers/ProcessScheduler/test/testNiceProcess.dm b/code/controllers/ProcessScheduler/test/testNiceProcess.dm deleted file mode 100644 index aa921bc62fa..00000000000 --- a/code/controllers/ProcessScheduler/test/testNiceProcess.dm +++ /dev/null @@ -1,13 +0,0 @@ -/** - * testNiceProcess - * This process is an example of a simple update loop process that is - * relatively fast. - */ - -/datum/controller/process/testNiceProcess/setup() - name = "Nice Process" - schedule_interval = 10 // every second - -/datum/controller/process/testNiceProcess/doWork() - sleep(rand(1,5)) // Just to pretend we're doing something - \ No newline at end of file diff --git a/code/controllers/ProcessScheduler/test/testSlowProcess.dm b/code/controllers/ProcessScheduler/test/testSlowProcess.dm deleted file mode 100644 index b7c9e6e21e8..00000000000 --- a/code/controllers/ProcessScheduler/test/testSlowProcess.dm +++ /dev/null @@ -1,28 +0,0 @@ -/** - * testSlowProcess - * This process is an example of a simple update loop process that is slow. - * The update loop here sleeps inside to provide an example, but if you had - * a computationally intensive loop process that is simply slow, you can use - * scheck() inside the loop to force it to yield periodically according to - * the sleep_interval var. By default, scheck will cause a loop to sleep every - * 2 ticks. - */ - -/datum/controller/process/testSlowProcess/setup() - name = "Slow Process" - schedule_interval = 30 // every 3 seconds - -/datum/controller/process/testSlowProcess/doWork() - // set background = 1 will cause loop constructs to sleep periodically, - // whenever the BYOND scheduler deems it productive to do so. - // This behavior is not always sufficient, nor is it always consistent. - // Rather than leaving it up to the BYOND scheduler, we can control it - // ourselves and leave nothing to the black box. - set background = 1 - - for(var/i=1,i<30,i++) - // Just to pretend we're doing something here - sleep(rand(3, 5)) - - // Forces this loop to yield(sleep) periodically. - scheck() \ No newline at end of file diff --git a/code/controllers/ProcessScheduler/test/testUpdateQueue.dm b/code/controllers/ProcessScheduler/test/testUpdateQueue.dm deleted file mode 100644 index 07b64e927f3..00000000000 --- a/code/controllers/ProcessScheduler/test/testUpdateQueue.dm +++ /dev/null @@ -1,209 +0,0 @@ -var/global/list/updateQueueTestCount = list() - -/datum/updateQueueTests - var/start - proc - runTests() - world << "Running 9 tests..." - testUpdateQueuePerformance() - sleep(1) - testInplace() - sleep(1) - testInplaceUpdateQueuePerformance() - sleep(1) - testUpdateQueueReinit() - sleep(1) - testCrashingQueue() - sleep(1) - testEmptyQueue() - sleep(1) - testManySlowItemsInQueue() - sleep(1) - testVariableWorkerTimeout() - sleep(1) - testReallySlowItemInQueue() - sleep(1) - world << "Finished!" - - beginTiming() - start = world.time - - endTiming(text) - var/time = (world.time - start) / world.tick_lag - world << {"Performance - [text] - [time] ticks"} - - getCount() - return updateQueueTestCount[updateQueueTestCount.len] - - incrementTestCount() - updateQueueTestCount.len++ - updateQueueTestCount[updateQueueTestCount.len] = 0 - - assertCountEquals(count, text) - assertThat(getCount() == count, text) - - assertCountLessThan(count, text) - assertThat(getCount() < count, text) - - assertCountGreaterThan(count, text) - assertThat(getCount() > count, text) - - assertThat(condition, text) - if (condition) - world << {"PASS: [text]"} - else - world << {"FAIL: [text]"} - - testUpdateQueuePerformance() - incrementTestCount() - var/list/objs = new - for(var/i=1,i<=100000,i++) - objs.Add(new /datum/uqTestDatum/fast(updateQueueTestCount.len)) - - var/datum/updateQueue/uq = new(objs) - - beginTiming() - uq.Run() - endTiming("updating 100000 simple objects") - - assertCountEquals(100000, "test that update queue updates all objects expected") - del(objs) - del(uq) - - testUpdateQueueReinit() - incrementTestCount() - var/list/objs = new - for(var/i=1,i<=100,i++) - objs.Add(new /datum/uqTestDatum/fast(updateQueueTestCount.len)) - - var/datum/updateQueue/uq = new(objs) - uq.Run() - objs = new - - for(var/i=1,i<=100,i++) - objs.Add(new /datum/uqTestDatum/fast(updateQueueTestCount.len)) - uq.init(objs) - uq.Run() - assertCountEquals(200, "test that update queue reinitializes properly and updates all objects as expected.") - del(objs) - del(uq) - - testInplace() - incrementTestCount() - var/list/objs = new - for(var/i=1,i<=100,i++) - objs.Add(new /datum/uqTestDatum/fast(updateQueueTestCount.len)) - var/datum/updateQueue/uq = new(objects = objs, inplace = 1) - uq.Run() - assertThat(objs.len == 0, "test that update queue inplace option really works inplace") - assertCountEquals(100, "test that inplace update queue updates the right number of objects") - del(objs) - del(uq) - - testInplaceUpdateQueuePerformance() - incrementTestCount() - var/list/objs = new - for(var/i=1,i<=100000,i++) - objs.Add(new /datum/uqTestDatum/fast(updateQueueTestCount.len)) - - var/datum/updateQueue/uq = new(objs) - - beginTiming() - uq.Run() - endTiming("updating 100000 simple objects in place") - del(objs) - del(uq) - - testCrashingQueue() - incrementTestCount() - var/list/objs = new - for(var/i=1,i<=10,i++) - objs.Add(new /datum/uqTestDatum/fast(updateQueueTestCount.len)) - objs.Add(new /datum/uqTestDatum/crasher(updateQueueTestCount.len)) - for(var/i=1,i<=10,i++) - objs.Add(new /datum/uqTestDatum/fast(updateQueueTestCount.len)) - - var/datum/updateQueue/uq = new(objs) - uq.Run() - assertCountEquals(20, "test that update queue handles crashed update procs OK") - del(objs) - del(uq) - - testEmptyQueue() - incrementTestCount() - var/list/objs = new - var/datum/updateQueue/uq = new(objs) - uq.Run() - assertCountEquals(0, "test that update queue doesn't barf on empty lists") - del(objs) - del(uq) - - testManySlowItemsInQueue() - incrementTestCount() - var/list/objs = new - for(var/i=1,i<=30,i++) - objs.Add(new /datum/uqTestDatum/slow(updateQueueTestCount.len)) - var/datum/updateQueue/uq = new(objs) - uq.Run() - assertCountEquals(30, "test that update queue slows down execution if too many objects are slow to update") - del(objs) - del(uq) - - testVariableWorkerTimeout() - incrementTestCount() - var/list/objs = new - for(var/i=1,i<=20,i++) - objs.Add(new /datum/uqTestDatum/slow(updateQueueTestCount.len)) - var/datum/updateQueue/uq = new(objs, workerTimeout=6) - uq.Run() - assertCountEquals(20, "test that variable worker timeout works properly") - del(objs) - del(uq) - - testReallySlowItemInQueue() - incrementTestCount() - var/list/objs = new - for(var/i=1,i<=10,i++) - objs.Add(new /datum/uqTestDatum/fast(updateQueueTestCount.len)) - objs.Add(new /datum/uqTestDatum/reallySlow(updateQueueTestCount.len)) - for(var/i=1,i<=10,i++) - objs.Add(new /datum/uqTestDatum/fast(updateQueueTestCount.len)) - var/datum/updateQueue/uq = new(objs) - uq.Run() - assertCountEquals(20, "test that update queue skips objects that are too slow to update") - del(objs) - del(uq) - - - -datum/uqTestDatum - var/testNum - New(testNum) - ..() - src.testNum = testNum - proc/update() - updateQueueTestCount[testNum]++ - proc/lag(cycles) - set background = 1 - for(var/i=0,i= 0) - if(dels >= maxDels) + if(remaining_force_dels <= 0) #ifdef GC_DEBUG testing("GC: Reached max force dels per tick [dels] vs [maxDels]") #endif @@ -88,13 +94,22 @@ world/loop_checks = 0 testing("GC: -- \ref[A] | [A.type] was unable to be GC'd and was deleted --") logging["[A.type]"]++ del(A) - ++dels - ++hard_dels - #ifdef GC_DEBUG + + hard_dels++ + remaining_force_dels-- else + #ifdef GC_DEBUG testing("GC: [refID] properly GC'd at [world.time] with timeout [GCd_at_time]") - #endif + #endif + soft_dels++ + tick_dels++ + total_dels++ destroyed.Cut(1, 2) + SCHECK + +#undef GC_FORCE_DEL_PER_TICK +#undef GC_COLLECTION_TIMEOUT +#undef GC_COLLECTIONS_PER_TICK #ifdef GC_FINDREF /datum/controller/process/garbage_collector/proc/LookForRefs(var/datum/D, var/list/targ) @@ -132,8 +147,11 @@ world/loop_checks = 0 destroyed -= "\ref[A]" // Removing any previous references that were GC'd so that the current object will be at the end of the list. destroyed["\ref[A]"] = world.time -/datum/controller/process/garbage_collector/getStatName() - return ..()+"([garbage_collector.destroyed.len]/[garbage_collector.dels]/[garbage_collector.hard_dels])" +/datum/controller/process/garbage_collector/statProcess() + ..() + stat(null, "[garbage_collect ? "On" : "Off"], [destroyed.len] queued") + stat(null, "Dels: [total_dels], [soft_dels] soft, [hard_dels] hard, [tick_dels] last run") + // Tests if an atom has been deleted. /proc/deleted(atom/A) @@ -149,7 +167,7 @@ world/loop_checks = 0 crash_with("qdel() passed object of type [A.type]. qdel() can only handle /datum types.") del(A) if(garbage_collector) - garbage_collector.dels++ + garbage_collector.total_dels++ garbage_collector.hard_dels++ else if(isnull(A.gcDestroyed)) // Let our friend know they're about to get collected @@ -263,4 +281,4 @@ world/loop_checks = 0 #ifdef GC_FINDREF #undef GC_FINDREF -#endif +#endif \ No newline at end of file diff --git a/code/controllers/Processes/inactivity.dm b/code/controllers/Processes/inactivity.dm index e61c2d4dc11..f12c0d4e3c7 100644 --- a/code/controllers/Processes/inactivity.dm +++ b/code/controllers/Processes/inactivity.dm @@ -10,4 +10,4 @@ log_access("AFK: [key_name(C)]") C << "You have been inactive for more than [config.kick_inactive] minute\s and have been disconnected." del(C) // Don't qdel, cannot override finalize_qdel behaviour for clients. - scheck() + SCHECK diff --git a/code/controllers/Processes/machinery.dm b/code/controllers/Processes/machinery.dm index 7959ee4fa7b..d0469744898 100644 --- a/code/controllers/Processes/machinery.dm +++ b/code/controllers/Processes/machinery.dm @@ -3,6 +3,7 @@ /datum/controller/process/machinery/setup() name = "machinery" schedule_interval = 20 // every 2 seconds + start_delay = 12 /datum/controller/process/machinery/doWork() internal_sort() @@ -19,10 +20,6 @@ /datum/controller/process/machinery/proc/internal_process_machinery() for(var/obj/machinery/M in machines) if(M && !M.gcDestroyed) - #ifdef PROFILE_MACHINES - var/time_start = world.timeofday - #endif - if(M.process() == PROCESS_KILL) //M.inMachineList = 0 We don't use this debugging function machines.Remove(M) @@ -31,22 +28,13 @@ if(M && M.use_power) M.auto_use_power() - #ifdef PROFILE_MACHINES - var/time_end = world.timeofday - - if(!(M.type in machine_profiling)) - machine_profiling[M.type] = 0 - - machine_profiling[M.type] += (time_end - time_start) - #endif - - scheck() + SCHECK /datum/controller/process/machinery/proc/internal_process_power() for(var/datum/powernet/powerNetwork in powernets) - if(istype(powerNetwork) && !powerNetwork.disposed) + if(istype(powerNetwork) && isnull(powerNetwork.gcDestroyed)) powerNetwork.reset() - scheck() + SCHECK continue powernets.Remove(powerNetwork) @@ -56,16 +44,20 @@ for(var/obj/item/I in processing_power_items) if(!I.pwr_drain()) // 0 = Process Kill, remove from processing list. processing_power_items.Remove(I) - scheck() + SCHECK /datum/controller/process/machinery/proc/internal_process_pipenets() for(var/datum/pipe_network/pipeNetwork in pipe_networks) - if(istype(pipeNetwork) && !pipeNetwork.disposed) + if(istype(pipeNetwork) && isnull(pipeNetwork.gcDestroyed)) pipeNetwork.process() - scheck() + SCHECK continue pipe_networks.Remove(pipeNetwork) -/datum/controller/process/machinery/getStatName() - return ..()+"(MCH:[machines.len] PWR:[powernets.len] PIP:[pipe_networks.len])" +/datum/controller/process/machinery/statProcess() + ..() + stat(null, "[machines.len] machines") + stat(null, "[powernets.len] powernets") + stat(null, "[pipe_networks.len] pipenets") + stat(null, "[processing_power_items.len] power item\s") \ No newline at end of file diff --git a/code/controllers/Processes/mob.dm b/code/controllers/Processes/mob.dm index 39d4844a021..b44842036d9 100644 --- a/code/controllers/Processes/mob.dm +++ b/code/controllers/Processes/mob.dm @@ -4,20 +4,26 @@ /datum/controller/process/mob/setup() name = "mob" schedule_interval = 20 // every 2 seconds - updateQueueInstance = new + start_delay = 16 /datum/controller/process/mob/started() ..() - if(!updateQueueInstance) - if(!mob_list) - mob_list = list() - else if(mob_list.len) - updateQueueInstance = new + if(!mob_list) + mob_list = list() /datum/controller/process/mob/doWork() - if(updateQueueInstance) - updateQueueInstance.init(mob_list, "Life") - updateQueueInstance.Run() + for(last_object in mob_list) + var/mob/M = last_object + if(isnull(M.gcDestroyed)) + try + M.Life() + catch(var/exception/e) + catchException(e, M) + SCHECK + else + catchBadType(M) + mob_list -= M -/datum/controller/process/mob/getStatName() - return ..()+"([mob_list.len])" +/datum/controller/process/mob/statProcess() + ..() + stat(null, "[mob_list.len] mobs") \ No newline at end of file diff --git a/code/controllers/Processes/nanoui.dm b/code/controllers/Processes/nanoui.dm index 654b1621be5..49b9048c078 100644 --- a/code/controllers/Processes/nanoui.dm +++ b/code/controllers/Processes/nanoui.dm @@ -1,14 +1,19 @@ -/datum/controller/process/nanoui - var/tmp/datum/updateQueue/updateQueueInstance - /datum/controller/process/nanoui/setup() name = "nanoui" - schedule_interval = 10 // every 1 second - updateQueueInstance = new + schedule_interval = 20 // every 2 seconds + +/datum/controller/process/nanoui/statProcess() + ..() + stat(null, "[nanomanager.processing_uis.len] UIs") /datum/controller/process/nanoui/doWork() - updateQueueInstance.init(nanomanager.processing_uis, "process") - updateQueueInstance.Run() - -/datum/controller/process/nanoui/getStatName() - return ..()+"([nanomanager.processing_uis.len])" + for(last_object in nanomanager.processing_uis) + var/datum/nanoui/NUI = last_object + if(istype(NUI) && isnull(NUI.gcDestroyed)) + try + NUI.process() + catch(var/exception/e) + catchException(e, NUI) + else + catchBadType(NUI) + nanomanager.processing_uis -= NUI \ No newline at end of file diff --git a/code/controllers/Processes/obj.dm b/code/controllers/Processes/obj.dm index 37766cf92d1..bd50edd1113 100644 --- a/code/controllers/Processes/obj.dm +++ b/code/controllers/Processes/obj.dm @@ -1,24 +1,26 @@ -var/global/list/object_profiling = list() -/datum/controller/process/obj - var/tmp/datum/updateQueue/updateQueueInstance - /datum/controller/process/obj/setup() name = "obj" schedule_interval = 20 // every 2 seconds - updateQueueInstance = new + start_delay = 8 /datum/controller/process/obj/started() ..() - if(!updateQueueInstance) - if(!processing_objects) - processing_objects = list() - else if(processing_objects.len) - updateQueueInstance = new + if(!processing_objects) + processing_objects = list() /datum/controller/process/obj/doWork() - if(updateQueueInstance) - updateQueueInstance.init(processing_objects, "process") - updateQueueInstance.Run() + for(last_object in processing_objects) + var/datum/O = last_object + if(isnull(O.gcDestroyed)) + try + O:process() + catch(var/exception/e) + catchException(e, O) + SCHECK + else + catchBadType(O) + processing_objects -= O -/datum/controller/process/obj/getStatName() - return ..()+"([processing_objects.len])" +/datum/controller/process/obj/statProcess() + ..() + stat(null, "[processing_objects.len] objects") \ No newline at end of file diff --git a/code/controllers/Processes/turf.dm b/code/controllers/Processes/turf.dm index 2ac33f48ba7..33967744973 100644 --- a/code/controllers/Processes/turf.dm +++ b/code/controllers/Processes/turf.dm @@ -8,7 +8,8 @@ var/global/list/turf/processing_turfs = list() for(var/turf/T in processing_turfs) if(T.process() == PROCESS_KILL) processing_turfs.Remove(T) - scheck() + SCHECK -/datum/controller/process/turf/getStatName() - return ..()+"([processing_turfs.len])" +/datum/controller/process/turf/statProcess() + ..() + stat(null, "[processing_turfs.len] turf\s") \ No newline at end of file diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index d456c52e71e..b249db9a47e 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -21,6 +21,7 @@ var/list/gamemode_cache = list() var/log_pda = 0 // log pda messages var/log_hrefs = 0 // logs all links clicked in-game. Could be used for debugging and tracking down exploits var/log_runtime = 0 // logs world.log to a file + var/log_world_output = 0 // log world.log << messages var/sql_enabled = 0 // for sql switching var/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour var/allow_vote_restart = 0 // allow votes to restart @@ -327,6 +328,9 @@ var/list/gamemode_cache = list() if ("log_pda") config.log_pda = 1 + if ("log_world_output") + config.log_world_output = 1 + if ("log_hrefs") config.log_hrefs = 1 diff --git a/code/controllers/subsystem/alarms.dm b/code/controllers/subsystem/alarms.dm deleted file mode 100644 index b05be7ccbfb..00000000000 --- a/code/controllers/subsystem/alarms.dm +++ /dev/null @@ -1,30 +0,0 @@ -// We manually initialize the alarm handlers instead of looping over all existing types -// to make it possible to write: camera.triggerAlarm() rather than alarm_manager.managers[datum/alarm_handler/camera].triggerAlarm() or a variant thereof. -/var/global/datum/alarm_handler/atmosphere/atmosphere_alarm = new() -/var/global/datum/alarm_handler/camera/camera_alarm = new() -/var/global/datum/alarm_handler/fire/fire_alarm = new() -/var/global/datum/alarm_handler/motion/motion_alarm = new() -/var/global/datum/alarm_handler/power/power_alarm = new() - -/datum/subsystem/alarm - name = "Alarm" - var/list/datum/alarm/all_handlers - -/datum/subsystem/alarm/New() - all_handlers = list(atmosphere_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm) - -/datum/subsystem/alarm/fire() - for(var/datum/alarm_handler/AH in all_handlers) - AH.process() - -/datum/subsystem/alarm/proc/active_alarms() - var/list/all_alarms = new - for(var/datum/alarm_handler/AH in all_handlers) - var/list/alarms = AH.alarms - all_alarms += alarms - - return all_alarms - -/datum/subsystem/alarm/proc/number_of_active_alarms() - var/list/alarms = active_alarms() - return alarms.len diff --git a/code/datums/category.dm b/code/datums/category.dm index 01cbc21386a..3bc9640b791 100644 --- a/code/datums/category.dm +++ b/code/datums/category.dm @@ -2,17 +2,20 @@ * Category Collection * **********************/ /datum/category_collection - var/category_group_type // The type of categories to initialize - var/list/datum/category_group/categories // The list of initialized categories + var/category_group_type // Type of categories to initialize + var/list/datum/category_group/categories // List of initialized categories + var/list/datum/category_group/categories_by_name // Associative list of initialized categories, keyed by name /datum/category_collection/New() ..() categories = new() + categories_by_name = new() for(var/category_type in typesof(category_group_type)) var/datum/category_group/category = category_type if(initial(category.name)) category = new category(src) categories += category + categories_by_name[category.name] = category categories = dd_sortedObjectList(categories) /datum/category_collection/Destroy() @@ -26,20 +29,23 @@ ******************/ /datum/category_group var/name = "" - var/category_item_type // The type of items to initialize - var/list/datum/category_item/items // The list of initialized items - var/datum/category_collection/collection // The collection this group belongs to + var/category_item_type // Type of items to initialize + var/list/datum/category_item/items // List of initialized items + var/list/datum/category_item/items_by_name // Associative list of initialized items, by name + var/datum/category_collection/collection // The collection this group belongs to /datum/category_group/New(var/datum/category_collection/cc) ..() collection = cc items = new() + items_by_name = new() for(var/item_type in typesof(category_item_type)) var/datum/category_item/item = item_type if(initial(item.name)) item = new item(src) items += item + items_by_name[item.name] = item // For whatever reason dd_insertObjectList(items, item) doesn't insert in the correct order // If you change this, confirm that character setup doesn't become completely unordered. diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index aec056f7f64..11c1fa87fcf 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -618,6 +618,35 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee access = access_robotics group = "Engineering" +/datum/supply_packs/robolimbs_basic + name = "Basic robolimb blueprints" + contains = list( + /obj/item/weapon/disk/limb/morpheus, + /obj/item/weapon/disk/limb/xion + ) + cost = 15 + containertype = /obj/structure/closet/crate/secure/gear + containername = "Robolimb blueprints (basic)" + access = access_robotics + group = "Engineering" + +/datum/supply_packs/robolimbs_adv + name = "All robolimb blueprints" + contains = list( + /obj/item/weapon/disk/limb/bishop, + /obj/item/weapon/disk/limb/hesphiastos, + /obj/item/weapon/disk/limb/morpheus, + /obj/item/weapon/disk/limb/veymed, + /obj/item/weapon/disk/limb/wardtakahashi, + /obj/item/weapon/disk/limb/xion, + /obj/item/weapon/disk/limb/zenghu, + ) + cost = 40 + containertype = /obj/structure/closet/crate/secure/gear + containername = "Robolimb blueprints (adv)" + access = access_robotics + group = "Engineering" + /datum/supply_packs/phoron name = "Phoron assembly crate" contains = list( diff --git a/code/datums/underwear/bottom.dm b/code/datums/underwear/bottom.dm new file mode 100644 index 00000000000..7f91a186081 --- /dev/null +++ b/code/datums/underwear/bottom.dm @@ -0,0 +1,56 @@ +/datum/category_item/underwear/bottom/none + name = "None" + always_last = TRUE + +/datum/category_item/underwear/bottom/briefs + name = "Briefs" + icon_state = "briefs" + has_color = TRUE + +/datum/category_item/underwear/bottom/briefs/is_default(var/gender) + return gender != FEMALE + +/datum/category_item/underwear/bottom/boxers_loveheart + name = "Boxers, Loveheart" + icon_state = "boxers_loveheart" + +/datum/category_item/underwear/bottom/boxers + name = "Boxers" + icon_state = "boxers" + has_color = TRUE + +/datum/category_item/underwear/bottom/boxers_green_and_blue + name = "Boxers, green & blue striped" + icon_state = "boxers_green_and_blue" + +/datum/category_item/underwear/bottom/panties + name = "Panties" + icon_state = "panties" + has_color = TRUE + +/datum/category_item/underwear/bottom/panties/is_default(var/gender) + return gender == FEMALE + +/datum/category_item/underwear/bottom/lacy_thong + name = "Lacy thong" + icon_state = "lacy_thong" + +/datum/category_item/underwear/bottom/lacy_thong_alt + name = "Lacy thong, alt" + icon_state = "lacy_thong_alt" + has_color = TRUE + +/datum/category_item/underwear/bottom/panties_alt + name = "Panties, alt" + icon_state = "panties_alt" + has_color = TRUE + +/datum/category_item/underwear/bottom/compression_shorts + name = "Compression shorts" + icon_state = "compression_shorts" + has_color = TRUE + +/datum/category_item/underwear/bottom/thong + name = "Thong" + icon_state = "thong" + has_color = TRUE \ No newline at end of file diff --git a/code/datums/underwear/socks.dm b/code/datums/underwear/socks.dm new file mode 100644 index 00000000000..fc1c96ce538 --- /dev/null +++ b/code/datums/underwear/socks.dm @@ -0,0 +1,59 @@ +/datum/category_item/underwear/socks/none + always_last = TRUE + name = "None" + +/datum/category_item/underwear/socks/normal + name = "Normal" + icon_state = "socks_norm" + has_color = TRUE + +/datum/category_item/underwear/socks/short + name = "Short" + icon_state = "socks_short" + has_color = TRUE + +/datum/category_item/underwear/socks/thigh + name = "Thigh" + icon_state = "socks_thigh" + has_color = TRUE + +/datum/category_item/underwear/socks/knee + name = "Knee" + icon_state = "socks_knee" + has_color = TRUE + +/datum/category_item/underwear/socks/striped_knee + name = "Knee, striped" + icon_state = "striped_knee" + has_color = TRUE + +/datum/category_item/underwear/socks/striped_thigh + name = "Thigh, striped" + icon_state = "striped_thigh" + has_color = TRUE + +/datum/category_item/underwear/socks/pantyhose + name = "Pantyhose" + icon_state = "pantyhose" + +/datum/category_item/underwear/socks/thin_thigh + name = "Thigh, thin" + icon_state = "thin_thigh" + has_color = TRUE + +/datum/category_item/underwear/socks/thin_knee + name = "Knee, thin" + icon_state = "thin_knee" + has_color = TRUE + +/datum/category_item/underwear/socks/rainbow_thigh + name = "Thigh, rainbow" + icon_state = "rainbow_thigh" + +/datum/category_item/underwear/socks/rainbow_knee + name = "Knee, rainbow" + icon_state = "rainbow_knee" + +/datum/category_item/underwear/socks/fishnet + name = "Fishnet" + icon_state = "fishnet" \ No newline at end of file diff --git a/code/datums/underwear/top.dm b/code/datums/underwear/top.dm new file mode 100644 index 00000000000..8640e77da90 --- /dev/null +++ b/code/datums/underwear/top.dm @@ -0,0 +1,43 @@ +/datum/category_item/underwear/top/none + name = "None" + always_last = TRUE + +/datum/category_item/underwear/top/none/is_default(var/gender) + return gender != FEMALE + +/datum/category_item/underwear/top/bra + is_default = TRUE + name = "Bra" + icon_state = "bra" + has_color = TRUE + +/datum/category_item/underwear/top/bra/is_default(var/gender) + return gender == FEMALE + +/datum/category_item/underwear/top/sports_bra + name = "Sports bra" + icon_state = "sports_bra" + has_color = TRUE + +/datum/category_item/underwear/top/sports_bra_alt + name = "Sports bra, alt" + icon_state = "sports_bra_alt" + has_color = TRUE + +/datum/category_item/underwear/top/lacy_bra + name = "Lacy bra" + icon_state = "lacy_bra" + +/datum/category_item/underwear/top/lacy_bra_alt + name = "Lacy bra, alt" + icon_state = "lacy_bra_alt" + has_color = TRUE + +/datum/category_item/underwear/top/lacy_bra_alt_stripe + name = "Lacy bra, alt, stripe" + icon_state = "lacy_bra_alt_stripe" + +/datum/category_item/underwear/top/halterneck_bra + name = "Halterneck bra" + icon_state = "halterneck_bra" + has_color = TRUE \ No newline at end of file diff --git a/code/datums/underwear/undershirts.dm b/code/datums/underwear/undershirts.dm new file mode 100644 index 00000000000..33886f997d7 --- /dev/null +++ b/code/datums/underwear/undershirts.dm @@ -0,0 +1,65 @@ +/datum/category_item/underwear/undershirt/none + is_default = TRUE + name = "None" + always_last = TRUE + +/datum/category_item/underwear/undershirt/shirt + name = "Shirt" + icon_state = "undershirt" + has_color = TRUE + +/datum/category_item/underwear/undershirt/tank_top + name = "Tank top" + icon_state = "tanktop" + has_color = TRUE + +/datum/category_item/underwear/undershirt/tank_top_alt + name = "Tank top, alt" + icon_state = "tanktop_alt" + has_color = TRUE + +/datum/category_item/underwear/undershirt/tank_top_fire + name = "Tank top, fire" + icon_state = "tank_fire_s" + +/datum/category_item/underwear/undershirt/shirt_heart + name = "Shirt, heart" + icon_state = "lover_s" + +/datum/category_item/underwear/undershirt/shirt_nt + name = "Shirt, NT" + icon_state = "shirt_nano_s" + +/datum/category_item/underwear/undershirt/shirt_love_nt + name = "Shirt, I<3NT" + icon_state = "lover_s" + +/datum/category_item/underwear/undershirt/shortsleeve_shirt + name = "Shortsleeve shirt" + icon_state = "shortsleeve" + has_color = TRUE + +/datum/category_item/underwear/undershirt/polo_shirt + name = "Polo shirt" + icon_state = "polo" + has_color = TRUE + +/datum/category_item/underwear/undershirt/sport_shirt_green + name = "Sport shirt, green" + icon_state = "greenshirtsport_s" + +/datum/category_item/underwear/undershirt/sport_shirt_red + name = "Sport shirt, red" + icon_state = "redshirtsport_s" + +/datum/category_item/underwear/undershirt/sport_shirt_blue + name = "Sport shirt, blue" + icon_state = "blueshirtsport_s" + +/datum/category_item/underwear/undershirt/shirt_tiedye + name = "Shirt, tiedye" + icon_state = "shirt_tiedye_s" + +/datum/category_item/underwear/undershirt/shirt_blue_striped + name = "Shirt, blue stripes" + icon_state = "shirt_stripes_s" \ No newline at end of file diff --git a/code/datums/underwear/underwear.dm b/code/datums/underwear/underwear.dm new file mode 100644 index 00000000000..d14ddea1339 --- /dev/null +++ b/code/datums/underwear/underwear.dm @@ -0,0 +1,66 @@ +/**************************** +* Category Collection Setup * +****************************/ +/datum/category_collection/underwear + category_group_type = /datum/category_group/underwear + +/************* +* Categories * +*************/ +/datum/category_group/underwear + var/sort_order // Lower sort order is applied as icons first + +datum/category_group/underwear/dd_SortValue() + return sort_order + +/datum/category_group/underwear/top + name = "Underwear, top" + sort_order = 1 + category_item_type = /datum/category_item/underwear/top + +/datum/category_group/underwear/bottom + name = "Underwear, bottom" + sort_order = 2 + category_item_type = /datum/category_item/underwear/bottom + +/datum/category_group/underwear/socks + name = "Socks" + sort_order = 3 + category_item_type = /datum/category_item/underwear/socks + +/datum/category_group/underwear/undershirt + name = "Undershirt" + sort_order = 4 // Undershirts currently have the highest sort order because they may cover both underwear and socks. + category_item_type = /datum/category_item/underwear/undershirt + +/******************* +* Category entries * +*******************/ +/datum/category_item/underwear + var/always_last = FALSE // Should this entry be sorte last? + var/is_default = FALSE // Should this entry be considered the default for its type? + var/icon = 'icons/mob/human.dmi' // Which icon to get the underwear from + var/icon_state // And the particular item state + var/list/tweaks = list() // Underwear customizations. + var/has_color = FALSE + +/datum/category_item/underwear/New() + if(has_color) + tweaks += gear_tweak_free_color_choice + +/datum/category_item/underwear/dd_SortValue() + if(always_last) + return "~"+name + return name + +/datum/category_item/underwear/proc/is_default(var/gender) + return is_default + +/datum/category_item/underwear/proc/generate_image(var/list/metadata) + if(!icon_state) + return + + var/image/I = image(icon = 'icons/mob/human.dmi', icon_state = icon_state) + for(var/datum/gear_tweak/gt in tweaks) + gt.tweak_item(I, metadata && metadata["[gt]"] ? metadata["[gt]"] : gt.get_default()) + return I \ No newline at end of file diff --git a/code/game/antagonist/outsider/deathsquad.dm b/code/game/antagonist/outsider/deathsquad.dm index 3a61152ab2b..1234bdb1f60 100644 --- a/code/game/antagonist/outsider/deathsquad.dm +++ b/code/game/antagonist/outsider/deathsquad.dm @@ -70,7 +70,7 @@ var/datum/antagonist/deathsquad/deathsquad var/syndicate_commando_name = pick(last_names) var/datum/preferences/A = new() //Randomize appearance for the commando. - A.randomize_appearance_for(player.current) + A.randomize_appearance_and_body_for(player.current) player.name = "[syndicate_commando_rank] [syndicate_commando_name]" player.current.name = player.name diff --git a/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm b/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm index dd1489248fe..6dd22efab9c 100644 --- a/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm +++ b/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm @@ -6,10 +6,10 @@ Shocking someone costs ten chemicals per use." enhancedtext = "Shocking biologicals without grabbing only requires five chemicals, and has more disabling power." genomecost = 2 - verbpath = /mob/proc/changeling_bioelectrogenesis + verbpath = /mob/living/carbon/human/proc/changeling_bioelectrogenesis //Recharge whatever's in our hand, or shock people. -/mob/proc/changeling_bioelectrogenesis() +/mob/living/carbon/human/proc/changeling_bioelectrogenesis() set category = "Changeling" set name = "Bioelectrogenesis (20 + 10/shock)" set desc = "Recharges anything in your hand, or shocks people." @@ -33,19 +33,28 @@ return 0 else + // Handle glove conductivity. + var/obj/item/clothing/gloves/gloves = src.gloves + var/siemens = 1 + if(gloves) + siemens = gloves.siemens_coefficient + //If we're grabbing someone, electrocute them. if(istype(held_item,/obj/item/weapon/grab)) var/obj/item/weapon/grab/G = held_item if(G.affecting) - G.affecting.electrocute_act(10,src,1.0,BP_TORSO) - var/agony = 80 //Does more than if hit with an electric hand, since grabbing is slower. + G.affecting.electrocute_act(10 * siemens,src,1.0,BP_TORSO) + var/agony = 80 * siemens //Does more than if hit with an electric hand, since grabbing is slower. G.affecting.stun_effect_act(0, agony, BP_TORSO, src) msg_admin_attack("[key_name(src)] shocked [key_name(G.affecting)] with the [src].") - visible_message("Arcs of electricity strike [G.affecting]!", - "Our hand channels raw electricity into [G.affecting].", - "You hear sparks!") + if(siemens) + visible_message("Arcs of electricity strike [G.affecting]!", + "Our hand channels raw electricity into [G.affecting].", + "You hear sparks!") + else + src << "Our gloves block us from shocking \the [G.affecting]." src.mind.changeling.chem_charges -= 10 return 1 @@ -69,17 +78,19 @@ "Our hand channels raw electricity into \the [held_item].", "You hear sparks!") var/i = 10 - while(i) - cell.charge += 100 //This should be a nice compromise between recharging guns and other batteries. - if(cell.charge > cell.maxcharge) - cell.charge = cell.maxcharge - break - var/T = get_turf(src) - new /obj/effect/effect/sparks(T) - held_item.update_icon() - i-- - sleep(1 SECOND) - success = 1 + if(siemens) + while(i) + cell.charge += 100 * siemens //This should be a nice compromise between recharging guns and other batteries. + if(cell.charge > cell.maxcharge) + cell.charge = cell.maxcharge + break + if(siemens) + var/T = get_turf(src) + new /obj/effect/effect/sparks(T) + held_item.update_icon() + i-- + sleep(1 SECOND) + success = 1 if(success == 0) //If we couldn't do anything with the ability, don't deduct the chemicals. src << "We are unable to affect \the [held_item]." else @@ -113,11 +124,18 @@ if(src) qdel(src) -/obj/item/weapon/electric_hand/afterattack(var/atom/target, var/mob/living/user, proximity) +/obj/item/weapon/electric_hand/afterattack(var/atom/target, var/mob/living/carbon/human/user, proximity) if(!target) return if(!proximity) return + + // Handle glove conductivity. + var/obj/item/clothing/gloves/gloves = user.gloves + var/siemens = 1 + if(gloves) + siemens = gloves.siemens_coefficient + //Excuse the copypasta. if(istype(target,/mob/living/carbon)) var/mob/living/carbon/C = target @@ -126,14 +144,17 @@ src << "We require more chemicals to electrocute [C]!" return 0 - C.electrocute_act(electrocute_amount,src,1.0,BP_TORSO) - C.stun_effect_act(0, agony_amount, BP_TORSO, src) + C.electrocute_act(electrocute_amount * siemens,src,1.0,BP_TORSO) + C.stun_effect_act(0, agony_amount * siemens, BP_TORSO, src) msg_admin_attack("[key_name(user)] shocked [key_name(C)] with the [src].") - visible_message("Arcs of electricity strike [C]!", - "Our hand channels raw electricity into [C]", - "You hear sparks!") + if(siemens) + visible_message("Arcs of electricity strike [C]!", + "Our hand channels raw electricity into [C]", + "You hear sparks!") + else + src << "Our gloves block us from shocking \the [C]." //qdel(src) //Since we're no longer a one hit stun, we need to stick around. user.mind.changeling.chem_charges -= shock_cost return 1 @@ -145,11 +166,12 @@ src << "We require more chemicals to electrocute [S]!" return 0 - S.electrocute_act(60,src,1.0) //If only they had surge protectors. - visible_message("Arcs of electricity strike [S]!", - "Our hand channels raw electricity into [S]", - "You hear sparks!") - S << "Warning: Electrical surge detected!" + S.electrocute_act(60 * siemens,src,1.0) //If only they had surge protectors. + if(siemens) + visible_message("Arcs of electricity strike [S]!", + "Our hand channels raw electricity into [S]", + "You hear sparks!") + S << "Warning: Electrical surge detected!" //qdel(src) user.mind.changeling.chem_charges -= 10 return 1 @@ -164,20 +186,22 @@ "Our hand channels raw electricity into \the [target].", "You hear sparks!") var/i = 10 - while(i) - cell.charge += 100 //This should be a nice compromise between recharging guns and other batteries. - if(cell.charge > cell.maxcharge) - cell.charge = cell.maxcharge - break //No point making sparks if the cell's full. -// if(!Adjacent(T)) -// break - var/Turf = get_turf(src) - new /obj/effect/effect/sparks(Turf) - T.update_icon() - i-- - sleep(1 SECOND) - success = 1 - break + if(siemens) + while(i) + cell.charge += 100 * siemens //This should be a nice compromise between recharging guns and other batteries. + if(cell.charge > cell.maxcharge) + cell.charge = cell.maxcharge + break //No point making sparks if the cell's full. + // if(!Adjacent(T)) + // break + if(siemens) + var/Turf = get_turf(src) + new /obj/effect/effect/sparks(Turf) + T.update_icon() + i-- + sleep(1 SECOND) + success = 1 + break if(success == 0) src << "We are unable to affect \the [target]." else diff --git a/code/game/gamemodes/changeling/powers/fake_death.dm b/code/game/gamemodes/changeling/powers/fake_death.dm index 0018eabad6c..ac7080301b0 100644 --- a/code/game/gamemodes/changeling/powers/fake_death.dm +++ b/code/game/gamemodes/changeling/powers/fake_death.dm @@ -18,14 +18,13 @@ var/mob/living/carbon/C = src if(changeling.max_geneticpoints < 0) //Absorbed by another ling - src << "You have no genomes, not even your own, and cannot regenerate." + src << "We have no genomes, not even our own, and cannot regenerate." return 0 - if(!C.stat && alert("Are we sure we wish to fake our death?",,"Yes","No") == "No")//Confirmation for living changelings if they want to fake their death + if(!C.stat && alert("Are we sure we wish to regenerate? We will appear to be dead while doing so.","Revival","Yes","No") == "No") return C << "We will attempt to regenerate our form." - C.status_flags |= FAKEDEATH //play dead C.update_canmove() C.remove_changeling_powers() @@ -33,13 +32,12 @@ C.suiciding = 0 if(C.stat != DEAD) - C.emote("deathgasp") - C.tod = worldtime2text() + C.adjustOxyLoss(C.maxHealth * 2) spawn(rand(800,2000)) //The ling will now be able to choose when to revive src.verbs += /mob/proc/changeling_revive - src << "We are ready to rise. Use the Revive verb when you are ready." + src << "We are ready to rise. Use the Revive verb when you are ready." feedback_add_details("changeling_powers","FD") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 4f53c95b464..79fd2dcf744 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -25,8 +25,6 @@ C.SetStunned(0) C.SetWeakened(0) C.radiation = 0 - C.halloss = 0 - C.shock_stage = 0 //Pain C.heal_overall_damage(C.getBruteLoss(), C.getFireLoss()) C.reagents.clear_reagents() C.restore_all_organs(ignore_prosthetic_prefs=1) //Covers things like fractures and other things not covered by the above. @@ -36,8 +34,13 @@ H.mutations.Remove(HUSK) H.status_flags -= DISFIGURED H.update_body(1) + for(var/limb in H.organs_by_name) + var/obj/item/organ/external/current_limb = H.organs_by_name[limb] + current_limb.undislocate() + + C.halloss = 0 + C.shock_stage = 0 //Pain C << "We have regenerated." - C.status_flags &= ~FAKEDEATH C.update_canmove() C.mind.changeling.purchased_powers -= C feedback_add_details("changeling_powers","CR") diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 564fc4d004d..1a0aa9e1c53 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -6,23 +6,35 @@ w_class = 4 force = 30 throwforce = 10 + hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") /obj/item/weapon/melee/cultblade/cultify() return -/obj/item/weapon/melee/cultblade/attack(mob/living/target as mob, mob/living/carbon/human/user as mob) +/obj/item/weapon/melee/cultblade/attack(mob/living/M, mob/living/user, var/target_zone) if(iscultist(user)) - playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) return ..() + + var/zone = (user.hand ? "l_arm":"r_arm") + if(ishuman(user)) + var/mob/living/carbon/human/H = user + var/obj/item/organ/external/affecting = H.get_organ(zone) + user << "An unexplicable force rips through your [affecting.name], tearing the sword from your grasp!" else - user.Paralyse(5) - user << "An unexplicable force powerfully repels the sword from [target]!" - var/organ = ((user.hand ? "l_":"r_") + "arm") - var/obj/item/organ/external/affecting = user.get_organ(organ) - if(affecting.take_damage(rand(force/2, force))) //random amount of damage between half of the blade's force and the full force of the blade. - user.UpdateDamageIcon() - return + user << "An unexplicable force rips through you, tearing the sword from your grasp!" + + //random amount of damage between half of the blade's force and the full force of the blade. + user.apply_damage(rand(force/2, force), BRUTE, zone, 0, sharp=1, edge=1) + user.Weaken(5) + + user.drop_from_inventory(src, src.loc) + throw_at(get_edge_target_turf(src, pick(alldirs)), rand(1,3), throw_speed) + + var/spooky = pick('sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg', 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/wail.ogg') + playsound(loc, spooky, 50, 1) + + return 1 /obj/item/weapon/melee/cultblade/pickup(mob/living/user as mob) if(!iscultist(user)) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 37445326cae..3cb41cc8725 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -470,8 +470,7 @@ var/list/sacrificed = list() D.r_eyes = 200 D.g_eyes = 200 D.update_eyes() - D.underwear_top = 0 - D.underwear_bottom = 0 + D.all_underwear.Cut() D.key = ghost.key cult.add_antagonist(D.mind) diff --git a/code/game/jobs/job/assistant.dm b/code/game/jobs/job/assistant.dm index ff87fb58e41..5e2b40d9526 100644 --- a/code/game/jobs/job/assistant.dm +++ b/code/game/jobs/job/assistant.dm @@ -13,21 +13,16 @@ minimal_access = list() //See /datum/job/assistant/get_access() alt_titles = list("Technical Assistant","Medical Intern","Research Assistant","Visitor", "Resident") -/datum/job/assistant/equip(var/mob/living/carbon/human/H) +/datum/job/assistant/equip(var/mob/living/carbon/human/H, var/alt_title) if(!H) return 0 switch(H.backbag) if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) - if (H.mind.role_alt_title) - switch(H.mind.role_alt_title) - if("Visitor") //I doubt someone visiting the station would want to wear an ugly grey uniform - H.equip_to_slot_or_del(new /obj/item/clothing/under/assistantformal(H), slot_w_uniform) - - if("Resident") - H.equip_to_slot_or_del(new /obj/item/clothing/under/color/white(H), slot_w_uniform) - else - H.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(H), slot_w_uniform) + if(has_alt_title(H, alt_title,"Visitor")) //I doubt someone visiting the station would want to wear an ugly grey uniform + H.equip_to_slot_or_del(new /obj/item/clothing/under/assistantformal(H), slot_w_uniform) + else if(has_alt_title(H, alt_title,"Resident")) + H.equip_to_slot_or_del(new /obj/item/clothing/under/color/white(H), slot_w_uniform) else H.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes) diff --git a/code/game/jobs/job/civilian_chaplain.dm b/code/game/jobs/job/civilian_chaplain.dm index cf162c14949..61cba700238 100644 --- a/code/game/jobs/job/civilian_chaplain.dm +++ b/code/game/jobs/job/civilian_chaplain.dm @@ -14,7 +14,7 @@ alt_titles = list("Counselor") - equip(var/mob/living/carbon/human/H) + equip(var/mob/living/carbon/human/H, var/alt_title, var/ask_questions = TRUE) if(!H) return 0 var/obj/item/weapon/storage/bible/B = new /obj/item/weapon/storage/bible(H) //BS12 EDIT @@ -22,6 +22,10 @@ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chaplain(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/device/pda/chaplain(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes) + if(!ask_questions) + return 1 + + spawn(0) var/religion_name = "Christianity" var/new_religion = sanitize(input(H, "You are the crew services officer. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name), MAX_NAME_LEN) @@ -150,3 +154,6 @@ feedback_set_details("religion_deity","[new_deity]") feedback_set_details("religion_book","[new_book_style]") return 1 + +/datum/job/chaplain/equip_preview(var/mob/living/carbon/human/H, var/alt_title) + return equip(H, alt_title, FALSE) diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 2ae944adfda..6bdf3c1c4a1 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -71,8 +71,8 @@ H << "Your account number is: [M.account_number], your account pin is: [M.remote_access_pin]" // overrideable separately so AIs/borgs can have cardborg hats without unneccessary new()/del() -/datum/job/proc/equip_preview(mob/living/carbon/human/H) - return equip(H) +/datum/job/proc/equip_preview(mob/living/carbon/human/H, var/alt_title) + . = equip(H, alt_title) /datum/job/proc/get_access() if(!config || config.jobs_have_minimal_access) @@ -104,3 +104,6 @@ /datum/job/proc/is_position_available() return (current_positions < total_positions) || (total_positions == -1) + +/datum/job/proc/has_alt_title(var/mob/H, var/supplied_title, var/desired_title) + return (supplied_title == desired_title) || (H.mind && H.mind.role_alt_title == desired_title) \ No newline at end of file diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 8a769df0b57..eeb0c8072a5 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -23,7 +23,7 @@ minimal_player_age = 10 ideal_character_age = 50 - equip(var/mob/living/carbon/human/H) + equip(var/mob/living/carbon/human/H, var/alt_title) if(!H) return 0 H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/cmo(H), slot_l_ear) switch(H.backbag) @@ -53,7 +53,7 @@ minimal_access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_virology, access_eva) alt_titles = list("Surgeon","Emergency Physician","Nurse","Virologist") - equip(var/mob/living/carbon/human/H) + equip(var/mob/living/carbon/human/H, var/alt_title) if(!H) return 0 H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) @@ -62,35 +62,33 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/med(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) - if (H.mind.role_alt_title) - switch(H.mind.role_alt_title) - if("Emergency Physician") - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/fr_jacket(H), slot_wear_suit) - if("Surgeon") - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/blue(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit) - H.equip_to_slot_or_del(new /obj/item/clothing/head/surgery/blue(H), slot_head) - if("Virologist") - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/virologist(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/virologist(H), slot_wear_suit) - H.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(H), slot_wear_mask) - switch(H.backbag) - if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/virology(H), slot_back) - if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/vir(H), slot_back) - if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) - if("Medical Doctor") - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit) - if("Nurse") - if(H.gender == FEMALE) - if(prob(50)) - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/nursesuit(H), slot_w_uniform) - else - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/nurse(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/head/nursehat(H), slot_head) - else - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/purple(H), slot_w_uniform) + if(has_alt_title(H, alt_title,"Emergency Physician")) + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/fr_jacket(H), slot_wear_suit) + else if(has_alt_title(H, alt_title,"Surgeon")) + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/blue(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit) + H.equip_to_slot_or_del(new /obj/item/clothing/head/surgery/blue(H), slot_head) + else if(has_alt_title(H, alt_title,"Virologist")) + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/virologist(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/virologist(H), slot_wear_suit) + H.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(H), slot_wear_mask) + switch(H.backbag) + if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/virology(H), slot_back) + if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/vir(H), slot_back) + if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + else if(has_alt_title(H, alt_title,"Medical Doctor")) + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit) + else if(has_alt_title(H, alt_title,"Nurse")) + if(H.gender == FEMALE) + if(prob(50)) + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/nursesuit(H), slot_w_uniform) + else + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/nurse(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/clothing/head/nursehat(H), slot_head) + else + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/purple(H), slot_w_uniform) else H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit) @@ -176,19 +174,17 @@ minimal_access = list(access_medical, access_medical_equip, access_psychiatrist) alt_titles = list("Psychologist") - equip(var/mob/living/carbon/human/H) + equip(var/mob/living/carbon/human/H, var/alt_title) if(!H) return 0 H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear) switch(H.backbag) if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) - if (H.mind.role_alt_title) - switch(H.mind.role_alt_title) - if("Psychiatrist") - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/psych(H), slot_w_uniform) - if("Psychologist") - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/psych/turtleneck(H), slot_w_uniform) + if(has_alt_title(H, alt_title,"Psychiatrist")) + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/psych(H), slot_w_uniform) + else if(has_alt_title(H, alt_title,"Psychologist")) + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/psych/turtleneck(H), slot_w_uniform) else H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes) @@ -211,7 +207,7 @@ minimal_access = list(access_medical, access_medical_equip, access_morgue, access_eva, access_maint_tunnels, access_external_airlocks) alt_titles = list("Emergency Medical Technician") - equip(var/mob/living/carbon/human/H) + equip(var/mob/living/carbon/human/H, var/alt_title) if(!H) return 0 H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes) @@ -220,14 +216,12 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/med(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) - if (H.mind.role_alt_title) - switch(H.mind.role_alt_title) - if("Emergency Medical Technician") - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/paramedic(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/fr_jacket(H), slot_wear_suit) - if("Paramedic") - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/black(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/fr_jacket(H), slot_wear_suit) + if(has_alt_title(H, alt_title,"Emergency Medical Technician")) + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/paramedic(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/fr_jacket(H), slot_wear_suit) + else if(has_alt_title(H, alt_title,"Paramedic")) + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/black(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/fr_jacket(H), slot_wear_suit) else H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/medical/emt(H), slot_belt) diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index dfb3659e0d6..6320a475ce3 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -98,7 +98,7 @@ minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_eva, access_external_airlocks) economic_modifier = 5 minimal_player_age = 3 - equip(var/mob/living/carbon/human/H) + equip(var/mob/living/carbon/human/H, var/alt_title) if(!H) return 0 H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear) switch(H.backbag) @@ -114,7 +114,7 @@ H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_l_hand) else H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_in_backpack) - if(H.mind.role_alt_title && H.mind.role_alt_title == "Forensic Technician") + if(has_alt_title(H, alt_title,"Forensic Technician")) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/forensics/blue(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase/crimekit, slot_r_hand) else diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm index fb9aeb793fd..d9aa96f7101 100644 --- a/code/game/jobs/job/silicon.dm +++ b/code/game/jobs/job/silicon.dm @@ -29,6 +29,7 @@ /datum/job/ai/equip_preview(mob/living/carbon/human/H) H.equip_to_slot_or_del(new /obj/item/clothing/suit/straight_jacket(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/clothing/head/cardborg(H), slot_head) + return 1 /datum/job/cyborg title = "Cyborg" @@ -60,3 +61,4 @@ /datum/job/cyborg/equip_preview(mob/living/carbon/human/H) H.equip_to_slot_or_del(new /obj/item/clothing/suit/cardborg(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/clothing/head/cardborg(H), slot_head) + return 1 diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 83b6f2ce861..bdab3bbbb14 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -360,7 +360,7 @@ return if(subject.isSynthetic()) - scantemp = "Error: Subject is not organic." + scantemp = "Error: Majority of subject is non-organic." return if (subject.suiciding == 1) scantemp = "Error: Subject's brain is not responding to scanning stimuli." diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index 8790bb337f6..05de6b9ac69 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -67,9 +67,12 @@ return 0 /obj/machinery/smartfridge/secure/extract/New() + ..() for(var/i=1 to 5) var/obj/item/xenoproduct/slime/core/C = new(src) C.traits = new() + C.nameVar = "grey" + item_quants[C.name]++ /obj/machinery/smartfridge/secure/medbay name = "\improper Refrigerated Medicine Storage" diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index e28ebc64f9b..55c2e10eaa1 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -7,7 +7,7 @@ obj/machinery/recharger anchored = 1 use_power = 1 idle_power_usage = 4 - active_power_usage = 15000 //15 kW + active_power_usage = 40000 //40 kW var/obj/item/charging = null var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/device/laptop, /obj/item/weapon/cell) var/icon_state_charged = "recharger2" @@ -171,4 +171,4 @@ obj/machinery/recharger/wallcharger icon_state_idle = "wrecharger0" portable = 0 circuit = /obj/item/weapon/circuitboard/recharger/wrecharger - frame_type = "wrecharger" \ No newline at end of file + frame_type = "wrecharger" diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index e0047a08bf5..36c8c628143 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -6,9 +6,9 @@ name = "space heater" desc = "Made by Space Amish using traditional space techniques, this heater is guaranteed not to set the station on fire." var/obj/item/weapon/cell/cell - var/cell_type = /obj/item/weapon/cell/apc + var/cell_type = /obj/item/weapon/cell/high var/on = 0 - var/set_temperature = T0C + 50 //K + var/set_temperature = T0C + 20 //K var/heating_power = 40000 diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index e257dc968d4..ee000d60bef 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -2,7 +2,7 @@ icon = 'icons/obj/robotics.dmi' icon_state = "fab-idle" name = "Exosuit Fabricator" - desc = "A machine used for construction of robotcs and mechas." + desc = "A machine used for construction of mechas." density = 1 anchored = 1 use_power = 1 @@ -23,7 +23,6 @@ var/list/categories = list() var/category = null - var/manufacturer = null var/sync_message = "" /obj/machinery/mecha_part_fabricator/New() @@ -41,7 +40,6 @@ return /obj/machinery/mecha_part_fabricator/initialize() - manufacturer = basic_robolimb.company update_categories() /obj/machinery/mecha_part_fabricator/process() @@ -99,13 +97,6 @@ data["buildable"] = get_build_options() data["category"] = category data["categories"] = categories - if(all_robolimbs) - var/list/T = list() - for(var/A in all_robolimbs) - var/datum/robolimb/R = all_robolimbs[A] - T += list(list("id" = A, "company" = R.company)) - data["manufacturers"] = T - data["manufacturer"] = manufacturer data["materials"] = get_materials() data["maxres"] = res_max_amount data["sync"] = sync_message @@ -133,10 +124,6 @@ if(href_list["category"] in categories) category = href_list["category"] - if(href_list["manufacturer"]) - if(href_list["manufacturer"] in all_robolimbs) - manufacturer = href_list["manufacturer"] - if(href_list["eject"]) eject_materials(href_list["eject"], text2num(href_list["amount"])) @@ -158,43 +145,32 @@ if(default_part_replacement(user, I)) return - var/material - switch(I.type) - if(/obj/item/stack/material/gold) - material = "gold" - if(/obj/item/stack/material/silver) - material = "silver" - if(/obj/item/stack/material/diamond) - material = "diamond" - if(/obj/item/stack/material/phoron) - material = "phoron" - if(/obj/item/stack/material/steel) - material = DEFAULT_WALL_MATERIAL - if(/obj/item/stack/material/glass) - material = "glass" - if(/obj/item/stack/material/uranium) - material = "uranium" + if(istype(I,/obj/item/stack/material)) + var/obj/item/stack/material/S = I + if(!(S.material.name in materials)) + user << "The [src] doesn't accept [S.material]!" + return + + var/sname = "[S.name]" + var/amnt = S.perunit + if(materials[S.material.name] + amnt <= res_max_amount) + if(S && S.amount >= 1) + var/count = 0 + overlays += "fab-load-metal" + spawn(10) + overlays -= "fab-load-metal" + while(materials[S.material.name] + amnt <= res_max_amount && S.amount >= 1) + materials[S.material.name] += amnt + S.use(1) + count++ + user << "You insert [count] [sname] into the fabricator." + update_busy() else - return ..() + user << "The fabricator cannot hold more [sname]." - var/obj/item/stack/material/stack = I - var/sname = "[stack.name]" - var/amnt = stack.perunit + return - if(materials[material] + amnt <= res_max_amount) - if(stack && stack.amount >= 1) - var/count = 0 - overlays += "fab-load-metal" - spawn(10) - overlays -= "fab-load-metal" - while(materials[material] + amnt <= res_max_amount && stack.amount >= 1) - materials[material] += amnt - stack.use(1) - count++ - user << "You insert [count] [sname] into the fabricator." - update_busy() - else - user << "The fabricator cannot hold more [sname]." + ..() /obj/machinery/mecha_part_fabricator/emag_act(var/remaining_charges, var/mob/user) switch(emagged) @@ -254,7 +230,7 @@ for(var/M in D.materials) materials[M] = max(0, materials[M] - D.materials[M] * mat_efficiency) if(D.build_path) - var/obj/new_item = D.Fabricate(loc, src) + var/obj/new_item = D.Fabricate(get_step(get_turf(src), src.dir), src) visible_message("\The [src] pings, indicating that \the [D] is complete.", "You hear a ping.") if(mat_efficiency != 1) if(new_item.matter && new_item.matter.len > 0) @@ -301,36 +277,20 @@ /obj/machinery/mecha_part_fabricator/proc/eject_materials(var/material, var/amount) // 0 amount = 0 means ejecting a full stack; -1 means eject everything var/recursive = amount == -1 ? 1 : 0 - material = lowertext(material) - var/mattype - switch(material) - if(DEFAULT_WALL_MATERIAL) - mattype = /obj/item/stack/material/steel - if("glass") - mattype = /obj/item/stack/material/glass - if("gold") - mattype = /obj/item/stack/material/gold - if("silver") - mattype = /obj/item/stack/material/silver - if("diamond") - mattype = /obj/item/stack/material/diamond - if("phoron") - mattype = /obj/item/stack/material/phoron - if("uranium") - mattype = /obj/item/stack/material/uranium - else - return - var/obj/item/stack/material/S = new mattype(loc) + var/matstring = lowertext(material) + var/material/M = get_material_by_name(matstring) + + var/obj/item/stack/material/S = M.place_sheet(get_turf(src)) if(amount <= 0) amount = S.max_amount - var/ejected = min(round(materials[material] / S.perunit), amount) + var/ejected = min(round(materials[matstring] / S.perunit), amount) S.amount = min(ejected, amount) if(S.amount <= 0) qdel(S) return - materials[material] -= ejected * S.perunit - if(recursive && materials[material] >= S.perunit) - eject_materials(material, -1) + materials[matstring] -= ejected * S.perunit + if(recursive && materials[matstring] >= S.perunit) + eject_materials(matstring, -1) update_busy() /obj/machinery/mecha_part_fabricator/proc/sync() diff --git a/code/game/mecha/mech_prosthetics.dm b/code/game/mecha/mech_prosthetics.dm new file mode 100644 index 00000000000..561a5bb3d8e --- /dev/null +++ b/code/game/mecha/mech_prosthetics.dm @@ -0,0 +1,333 @@ +/obj/machinery/pros_fabricator + icon = 'icons/obj/robotics.dmi' + icon_state = "pros-idle" + name = "Prosthetics Fabricator" + desc = "A machine used for construction of prosthetics." + density = 1 + anchored = 1 + use_power = 1 + idle_power_usage = 20 + active_power_usage = 5000 + req_access = list(access_robotics) + circuit = /obj/item/weapon/circuitboard/prosthetics + + var/speed = 1 + var/mat_efficiency = 1 + var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "gold" = 0, "silver" = 0, "diamond" = 0, "phoron" = 0, "uranium" = 0, "plasteel" = 0) + var/res_max_amount = 200000 + + var/datum/research/files + var/list/datum/design/queue = list() + var/progress = 0 + var/busy = 0 + + var/list/categories = list() + var/category = null + var/manufacturer = null + var/sync_message = "" + +/obj/machinery/pros_fabricator/New() + ..() + circuit = new circuit(src) + component_parts = list() + component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) + component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/micro_laser(src) + component_parts += new /obj/item/weapon/stock_parts/console_screen(src) + RefreshParts() + + files = new /datum/research(src) //Setup the research data holder. + return + +/obj/machinery/pros_fabricator/initialize() + manufacturer = basic_robolimb.company + update_categories() + +/obj/machinery/pros_fabricator/process() + ..() + if(stat) + return + if(busy) + use_power = 2 + progress += speed + check_build() + else + use_power = 1 + update_icon() + +/obj/machinery/pros_fabricator/update_icon() + overlays.Cut() + if(panel_open) + icon_state = "pros-o" + else + icon_state = "pros-idle" + if(busy) + overlays += "pros-active" + +/obj/machinery/pros_fabricator/dismantle() + for(var/f in materials) + eject_materials(f, -1) + ..() + +/obj/machinery/pros_fabricator/RefreshParts() + res_max_amount = 0 + for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) + res_max_amount += M.rating * 100000 // 200k -> 600k + var/T = 0 + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + T += M.rating + mat_efficiency = 1 - (T - 1) / 4 // 1 -> 0.5 + for(var/obj/item/weapon/stock_parts/micro_laser/M in component_parts) // Not resetting T is intended; speed is affected by both + T += M.rating + speed = T / 2 // 1 -> 3 + +/obj/machinery/pros_fabricator/attack_hand(var/mob/user) + if(..()) + return + if(!allowed(user)) + return + ui_interact(user) + +/obj/machinery/pros_fabricator/ui_interact(var/mob/user, var/ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + var/data[0] + + var/datum/design/current = queue.len ? queue[1] : null + if(current) + data["current"] = current.name + data["queue"] = get_queue_names() + data["buildable"] = get_build_options() + data["category"] = category + data["categories"] = categories + if(all_robolimbs) + var/list/T = list() + for(var/A in all_robolimbs) + var/datum/robolimb/R = all_robolimbs[A] + if(R.unavailable_to_build) continue + T += list(list("id" = A, "company" = R.company)) + data["manufacturers"] = T + data["manufacturer"] = manufacturer + data["materials"] = get_materials() + data["maxres"] = res_max_amount + data["sync"] = sync_message + if(current) + data["builtperc"] = round((progress / current.time) * 100) + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if(!ui) + ui = new(user, src, ui_key, "mechfab.tmpl", "Prosthetics Fab UI", 800, 600) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/obj/machinery/pros_fabricator/Topic(href, href_list) + if(..()) + return + + if(href_list["build"]) + add_to_queue(text2num(href_list["build"])) + + if(href_list["remove"]) + remove_from_queue(text2num(href_list["remove"])) + + if(href_list["category"]) + if(href_list["category"] in categories) + category = href_list["category"] + + if(href_list["manufacturer"]) + if(href_list["manufacturer"] in all_robolimbs) + manufacturer = href_list["manufacturer"] + + if(href_list["eject"]) + eject_materials(href_list["eject"], text2num(href_list["amount"])) + + if(href_list["sync"]) + sync() + else + sync_message = "" + + return 1 + +/obj/machinery/pros_fabricator/attackby(var/obj/item/I, var/mob/user) + if(busy) + user << "\The [src] is busy. Please wait for completion of previous operation." + return 1 + if(default_deconstruction_screwdriver(user, I)) + return + if(default_deconstruction_crowbar(user, I)) + return + if(default_part_replacement(user, I)) + return + + if(istype(I,/obj/item/weapon/disk/limb)) + var/obj/item/weapon/disk/limb/D = I + if(!D.company || !(D.company in all_robolimbs)) + user << "This disk seems to be corrupted!" + else + user << "Installing blueprint files for [D.company]..." + if(do_after(user,50,src)) + var/datum/robolimb/R = all_robolimbs[D.company] + R.unavailable_to_build = 0 + user << "Installed [D.company] blueprints!" + qdel(I) + return + + if(istype(I,/obj/item/stack/material)) + var/obj/item/stack/material/S = I + if(!(S.material.name in materials)) + user << "The [src] doesn't accept [S.material]!" + return + + var/sname = "[S.name]" + var/amnt = S.perunit + if(materials[S.material.name] + amnt <= res_max_amount) + if(S && S.amount >= 1) + var/count = 0 + overlays += "pros-load-metal" + spawn(10) + overlays -= "pros-load-metal" + while(materials[S.material.name] + amnt <= res_max_amount && S.amount >= 1) + materials[S.material.name] += amnt + S.use(1) + count++ + user << "You insert [count] [sname] into the fabricator." + update_busy() + else + user << "The fabricator cannot hold more [sname]." + + return + + ..() + +/obj/machinery/pros_fabricator/emag_act(var/remaining_charges, var/mob/user) + switch(emagged) + if(0) + emagged = 0.5 + visible_message("\icon[src] [src] beeps: \"DB error \[Code 0x00F1\]\"") + sleep(10) + visible_message("\icon[src] [src] beeps: \"Attempting auto-repair\"") + sleep(15) + visible_message("\icon[src] [src] beeps: \"User DB corrupted \[Code 0x00FA\]. Truncating data structure...\"") + sleep(30) + visible_message("\icon[src] [src] beeps: \"User DB truncated. Please contact your [company_name] system operator for future assistance.\"") + req_access = null + emagged = 1 + return 1 + if(0.5) + visible_message("\icon[src] [src] beeps: \"DB not responding \[Code 0x0003\]...\"") + if(1) + visible_message("\icon[src] [src] beeps: \"No records in User DB\"") + +/obj/machinery/pros_fabricator/proc/update_busy() + if(queue.len) + if(can_build(queue[1])) + busy = 1 + else + busy = 0 + else + busy = 0 + +/obj/machinery/pros_fabricator/proc/add_to_queue(var/index) + var/datum/design/D = files.known_designs[index] + queue += D + update_busy() + +/obj/machinery/pros_fabricator/proc/remove_from_queue(var/index) + if(index == 1) + progress = 0 + queue.Cut(index, index + 1) + update_busy() + +/obj/machinery/pros_fabricator/proc/can_build(var/datum/design/D) + for(var/M in D.materials) + if(materials[M] < D.materials[M]) + return 0 + return 1 + +/obj/machinery/pros_fabricator/proc/check_build() + if(!queue.len) + progress = 0 + return + var/datum/design/D = queue[1] + if(!can_build(D)) + progress = 0 + return + if(D.time > progress) + return + for(var/M in D.materials) + materials[M] = max(0, materials[M] - D.materials[M] * mat_efficiency) + if(D.build_path) + var/obj/new_item = D.Fabricate(get_step(get_turf(src), src.dir), src) + visible_message("\The [src] pings, indicating that \the [D] is complete.", "You hear a ping.") + if(mat_efficiency != 1) + if(new_item.matter && new_item.matter.len > 0) + for(var/i in new_item.matter) + new_item.matter[i] = new_item.matter[i] * mat_efficiency + remove_from_queue(1) + +/obj/machinery/pros_fabricator/proc/get_queue_names() + . = list() + for(var/i = 2 to queue.len) + var/datum/design/D = queue[i] + . += D.name + +/obj/machinery/pros_fabricator/proc/get_build_options() + . = list() + for(var/i = 1 to files.known_designs.len) + var/datum/design/D = files.known_designs[i] + if(D.build_path && (D.build_type & PROSFAB)) + . += list(list("name" = D.name, "id" = i, "category" = D.category, "resourses" = get_design_resourses(D), "time" = get_design_time(D))) + +/obj/machinery/pros_fabricator/proc/get_design_resourses(var/datum/design/D) + var/list/F = list() + for(var/T in D.materials) + F += "[capitalize(T)]: [D.materials[T] * mat_efficiency]" + return english_list(F, and_text = ", ") + +/obj/machinery/pros_fabricator/proc/get_design_time(var/datum/design/D) + return time2text(round(10 * D.time / speed), "mm:ss") + +/obj/machinery/pros_fabricator/proc/update_categories() + categories = list() + for(var/datum/design/D in files.known_designs) + if(!D.build_path || !(D.build_type & PROSFAB)) + continue + categories |= D.category + if(!category || !(category in categories)) + category = categories[1] + +/obj/machinery/pros_fabricator/proc/get_materials() + . = list() + for(var/T in materials) + . += list(list("mat" = capitalize(T), "amt" = materials[T])) + +/obj/machinery/pros_fabricator/proc/eject_materials(var/material, var/amount) // 0 amount = 0 means ejecting a full stack; -1 means eject everything + var/recursive = amount == -1 ? 1 : 0 + var/matstring = lowertext(material) + var/material/M = get_material_by_name(matstring) + + var/obj/item/stack/material/S = M.place_sheet(get_turf(src)) + if(amount <= 0) + amount = S.max_amount + var/ejected = min(round(materials[matstring] / S.perunit), amount) + S.amount = min(ejected, amount) + if(S.amount <= 0) + qdel(S) + return + materials[matstring] -= ejected * S.perunit + if(recursive && materials[matstring] >= S.perunit) + eject_materials(matstring, -1) + update_busy() + +/obj/machinery/pros_fabricator/proc/sync() + sync_message = "Error: no console found." + for(var/obj/machinery/computer/rdconsole/RDC in get_area_all_atoms(get_area(src))) + if(!RDC.sync) + continue + for(var/datum/tech/T in RDC.files.known_tech) + files.AddTech2Known(T) + for(var/datum/design/D in RDC.files.known_designs) + files.AddDesign2Known(D) + files.RefreshResearch() + sync_message = "Sync complete." + update_categories() diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 02d85234ed7..41ad047cc69 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -5,6 +5,7 @@ var/buckle_lying = -1 //bed-like behavior, forces mob.lying = buckle_lying if != -1 var/buckle_require_restraints = 0 //require people to be handcuffed before being able to buckle. eg: pipes var/mob/living/buckled_mob = null + var/has_buckled /obj/attack_hand(mob/living/user) . = ..() @@ -29,12 +30,17 @@ /obj/proc/buckle_mob(mob/living/M) if(!can_buckle || !istype(M) || (M.loc != loc) || M.buckled || M.pinned.len || (buckle_require_restraints && !M.restrained())) return 0 + if(has_buckled) //Handles trying to buckle yourself to the chair when someone is on it + M << "\The [src] already has someone buckled to it." + return 0 M.buckled = src M.facing_dir = null M.set_dir(buckle_dir ? buckle_dir : dir) M.update_canmove() buckled_mob = M + has_buckled = 1 + post_buckle_mob(M) return 1 @@ -45,6 +51,7 @@ buckled_mob.anchored = initial(buckled_mob.anchored) buckled_mob.update_canmove() buckled_mob = null + has_buckled = 0 post_buckle_mob(.) diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 036e4270780..fc764efd02d 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -17,6 +17,7 @@ var/global/list/image/splatter_cache=list() var/base_icon = 'icons/effects/blood.dmi' blood_DNA = list() var/basecolor="#A10808" // Color when wet. + var/synthblood = 0 var/list/datum/disease2/disease/virus2 = list() var/amount = 5 var/drytime @@ -61,9 +62,9 @@ var/global/list/image/splatter_cache=list() /obj/effect/decal/cleanable/blood/update_icon() if(basecolor == "rainbow") basecolor = "#[get_random_colour(1)]" color = basecolor - if(basecolor == SYNTH_BLOOD_COLOUR) - name = "oil" - desc = "It's black and greasy." + if(synthblood) + name = "synthetic blood" + desc = "It's quite greasy." else name = initial(name) desc = initial(desc) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index db08e9e083a..4d78f5aa9d8 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -453,6 +453,9 @@ var/list/global/slot_flags_enumeration = list( M.attack_log += "\[[time_stamp()]\] Attacked by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])" msg_admin_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (JMP)") //BS12 EDIT ALG + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + user.do_attack_animation(M) + src.add_fingerprint(user) //if((CLUMSY in user.mutations) && prob(50)) // M = user @@ -633,6 +636,3 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. /obj/item/proc/pwr_drain() return 0 // Process Kill -/obj/item/proc/resolve_attackby(atom/A, mob/source) - return A.attackby(src,source) - diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 0024a05c624..ae18aed86c5 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -31,14 +31,17 @@ last_used = world.time times_used = max(0,round(times_used)) //sanity - -/obj/item/device/flash/attack(mob/living/M as mob, mob/user as mob) +//attack_as_weapon +/obj/item/device/flash/attack(mob/living/M, mob/living/user, var/target_zone) if(!user || !M) return //sanity M.attack_log += text("\[[time_stamp()]\] Has been flashed (attempt) with [src.name] by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to flash [M.name] ([M.ckey])") msg_admin_attack("[user.name] ([user.ckey]) Used the [src.name] to flash [M.name] ([M.ckey]) (JMP)") + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + user.do_attack_animation(M) + if(!clown_check(user)) return if(broken) user << "\The [src] is broken." @@ -117,6 +120,8 @@ /obj/item/device/flash/attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0) if(!user || !clown_check(user)) return + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + if(broken) user.show_message("The [src.name] is broken", 2) return @@ -136,7 +141,6 @@ else //can only use it 5 times a minute user.show_message("*click* *click*", 2) return - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1) flick("flash2", src) if(user && isrobot(user)) @@ -184,7 +188,8 @@ icon_state = "sflash" origin_tech = list(TECH_MAGNET = 2, TECH_COMBAT = 1) -/obj/item/device/flash/synthetic/attack(mob/living/M as mob, mob/user as mob) +//attack_as_weapon +/obj/item/device/flash/synthetic/attack(mob/living/M, mob/living/user, var/target_zone) ..() if(!broken) broken = 1 diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 83ac8851ddf..c3fcf893acf 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -79,6 +79,8 @@ user << "\The [M]'s pupils narrow slightly, but are still very dilated." else user << "\The [M]'s pupils narrow." + + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) //can be used offensively flick("flash", M.flash) else return ..() diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 3ccf1fb3a96..28f3a1def6a 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -10,11 +10,7 @@ icon = 'icons/obj/decals.dmi' icon_state = "shock" -/obj/item/borg/stun/attack(var/mob/living/M, var/mob/living/silicon/robot/user) - - if(!istype(M)) - return - +/obj/item/borg/stun/apply_hit_effect(mob/living/M, mob/living/silicon/robot/user, var/hit_zone) // How the Hell. if(!istype(user)) var/mob/living/temp = user @@ -23,18 +19,16 @@ qdel(src) return - M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])") - msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey]) (JMP)") + user.visible_message("\The [user] has prodded \the [M] with \a [src]!") if(!user.cell || !user.cell.checked_use(1250)) //Slightly more than a baton. - user.visible_message("\The [user] has prodded \the [M] with its arm!") return - if (M.stuttering < 5) - M.stuttering = 5 - M.stun_effect_act(0, 70, check_zone(user.zone_sel.selecting), src) - user.visible_message("\The [user] has prodded \the [M] with \a [src]!") + playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) + + M.apply_effect(5, STUTTER) + M.stun_effect_act(0, 70, check_zone(hit_zone), src) + if(ishuman(M)) var/mob/living/carbon/human/H = M H.forcesay(hit_appends) diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 11c312048db..ebdd95791de 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -15,47 +15,37 @@ /obj/item/robot_parts/New(var/newloc, var/model) ..(newloc) - if(model_info && model) - model_info = model - var/datum/robolimb/R = all_robolimbs[model] - if(R) - name = "[R.company] [initial(name)]" - desc = "[R.desc]" - if(icon_state in icon_states(R.icon)) - icon = R.icon - else - name = "robot [initial(name)]" /obj/item/robot_parts/l_arm - name = "left arm" + name = "cyborg left arm" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "l_arm" part = list(BP_L_ARM, BP_L_HAND) model_info = 1 /obj/item/robot_parts/r_arm - name = "right arm" + name = "cyborg right arm" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "r_arm" part = list(BP_R_ARM, BP_R_HAND) model_info = 1 /obj/item/robot_parts/l_leg - name = "left leg" + name = "cyborg left leg" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "l_leg" part = list(BP_L_LEG, BP_L_FOOT) model_info = 1 /obj/item/robot_parts/r_leg - name = "right leg" + name = "cyborg leg" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "r_leg" part = list(BP_R_LEG, BP_R_FOOT) model_info = 1 /obj/item/robot_parts/chest - name = "chest" + name = "cyborg chest" desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell." icon_state = "chest" part = list(BP_GROIN,BP_TORSO) @@ -63,7 +53,7 @@ var/obj/item/weapon/cell/cell = null /obj/item/robot_parts/head - name = "head" + name = "cyborg head" desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals." icon_state = "head" part = list(BP_HEAD) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index d47df19f196..2ddbd4e330e 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -37,8 +37,13 @@ user << "You can't apply [src] through [H.wear_suit]!" return 1 - if(affecting.robotic >= ORGAN_ROBOT) - user << "This isn't useful at all on a robotic limb.." + if(affecting.robotic == ORGAN_ROBOT) + user << "This isn't useful at all on a robotic limb." + return 1 + + if(affecting.robotic >= ORGAN_LIFELIKE) + user << "You apply the [src], but it seems to have no effect..." + use(1) return 1 H.UpdateDamageIcon() diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm index 5b85763b324..1ff55adf852 100644 --- a/code/game/objects/items/stacks/nanopaste.dm +++ b/code/game/objects/items/stacks/nanopaste.dm @@ -27,19 +27,12 @@ var/mob/living/carbon/human/H = M var/obj/item/organ/external/S = H.get_organ(user.zone_sel.selecting) - if(S.open == 1) - if (S && (S.robotic >= ORGAN_ROBOT)) - if(S.get_damage()) - S.heal_damage(15, 15, robo_repair = 1) - H.updatehealth() - use(1) - user.visible_message("\The [user] applies some nanite paste at[user != M ? " \the [M]'s" : " \the"][S.name] with \the [src].",\ - "You apply some nanite paste at [user == M ? "your" : "[M]'s"] [S.name].") - else - user << "Nothing to fix here." + if (S && (S.robotic >= ORGAN_ROBOT)) + if(S.robo_repair(15, "omni", 0, src, user)) + use(1) + user.visible_message("\The [user] applies some nanite paste on [user != M ? "\the [M]'s" : "their"] [S.name].",\ + "You apply some nanite paste on [user == M ? "your" : "[M]'s"] [S.name].") else if (can_operate(H)) if (do_surgery(H,user,src)) return - else - user << "Nothing to fix in here." diff --git a/code/game/objects/items/weapons/circuitboards/machinery/research.dm b/code/game/objects/items/weapons/circuitboards/machinery/research.dm index bf0eb357f43..c871bd3dc51 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/research.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/research.dm @@ -61,3 +61,14 @@ obj/item/weapon/circuitboard/rdserver /obj/item/weapon/stock_parts/manipulator = 1, /obj/item/weapon/stock_parts/micro_laser = 1, /obj/item/weapon/stock_parts/console_screen = 1) + +/obj/item/weapon/circuitboard/prosthetics + name = "Circuit board (Prosthetics Fabricator)" + build_path = "/obj/machinery/pros_fabricator" + board_type = "machine" + origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 2, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/weapon/stock_parts/micro_laser = 1, + /obj/item/weapon/stock_parts/console_screen = 1) \ No newline at end of file diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index 7c8752c6d7d..d15b78963da 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -53,9 +53,11 @@ target.clean_blood() return -/obj/item/weapon/soap/attack(mob/target as mob, mob/user as mob) - if(target && user && ishuman(target) && ishuman(user) && !target.stat && !user.stat && user.zone_sel &&user.zone_sel.selecting == O_MOUTH) +//attack_as_weapon +/obj/item/weapon/soap/attack(mob/living/target, mob/living/user, var/target_zone) + if(target && user && ishuman(target) && ishuman(user) && !user.incapacitated() && user.zone_sel &&user.zone_sel.selecting == "mouth" ) user.visible_message("\The [user] washes \the [target]'s mouth out with soap!") + user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //prevent spam return ..() diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 484c185a14a..24f6ad53b39 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -114,6 +114,9 @@ if(!do_after(user,50)) return + user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) + user.do_attack_animation(M) + M.visible_message("\The [M] has been injected with \the [src] by \the [user].") var/mob/living/carbon/human/H = M diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 294812513c1..46e8e7ba267 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -46,6 +46,7 @@ if (ismob(target) || istype(target, /turf/unsimulated) || istype(target, /turf/simulated/shuttle) || istype(target, /obj/item/weapon/storage/) || istype(target, /obj/item/clothing/accessory/storage/) || istype(target, /obj/item/clothing/under)) return user << "Planting explosives..." + user.do_attack_animation(target) if(do_after(user, 50) && in_range(user, target)) user.drop_item() diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index 73c198c8ab6..94775ceb366 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -61,7 +61,7 @@ qdel(src) /obj/item/weapon/a_gift/attack_self(mob/M as mob) - var/gift_type = pick(/obj/item/weapon/sord, + var/gift_type = pick( /obj/item/weapon/storage/wallet, /obj/item/weapon/storage/photo_album, /obj/item/weapon/storage/box/snappops, @@ -80,7 +80,6 @@ /obj/item/weapon/bikehorn, /obj/item/weapon/beach_ball, /obj/item/weapon/beach_ball/holoball, - /obj/item/weapon/banhammer, /obj/item/toy/balloon, /obj/item/toy/blink, /obj/item/toy/crossbow, diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 1868827b5b9..c44c3e1688e 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -74,6 +74,9 @@ msg_admin_attack("[key_name(user)] attempted to handcuff [key_name(H)]") feedback_add_details("handcuffs","H") + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + user.do_attack_animation(H) + user.visible_message("\The [user] has put [cuff_type] on \the [H]!") // Apply cuffs. @@ -166,4 +169,4 @@ var/last_chew = 0 item_state = null icon = 'icons/obj/bureaucracy.dmi' breakouttime = 200 - cuff_type = "duct tape" \ No newline at end of file + cuff_type = "duct tape" diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index 4f168556d28..655727a62ae 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -30,18 +30,18 @@ if (!istype(M, /mob/living/carbon)) return if (user && src.imp) - for (var/mob/O in viewers(M, null)) - O.show_message("[user] is attemping to implant [M].", 1) + M.visible_message("[user] is attemping to implant [M].") + + user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) + user.do_attack_animation(M) var/turf/T1 = get_turf(M) if (T1 && ((M == user) || do_after(user, 50))) if(user && M && (get_turf(M) == T1) && src && src.imp) - for (var/mob/O in viewers(M, null)) - O.show_message("[M] has been implanted by [user].", 1) + M.visible_message("[M] has been implanted by [user].") admin_attack_log(user, M, "Implanted using \the [src.name] ([src.imp.name])", "Implanted with \the [src.name] ([src.imp.name])", "used an implanter, [src.name] ([src.imp.name]), on") - user.show_message("You implanted the implant into [M].") if(src.imp.implanted(M)) src.imp.loc = M src.imp.imp_in = M diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm index ff1d347c745..6672d488ded 100644 --- a/code/game/objects/items/weapons/material/kitchen.dm +++ b/code/game/objects/items/weapons/material/kitchen.dm @@ -103,13 +103,6 @@ return return ..() -/obj/item/weapon/material/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob) - if ((CLUMSY in user.mutations) && prob(50)) - user << "You somehow managed to cut yourself with \the [src]." - user.take_organ_damage(20) - return - return ..() - /obj/item/weapon/material/kitchen/utensil/knife/plastic default_material = "plastic" diff --git a/code/game/objects/items/weapons/material/material_weapons.dm b/code/game/objects/items/weapons/material/material_weapons.dm index 18181df6b07..fc9ac7eb32d 100644 --- a/code/game/objects/items/weapons/material/material_weapons.dm +++ b/code/game/objects/items/weapons/material/material_weapons.dm @@ -64,9 +64,8 @@ processing_objects -= src ..() -/obj/item/weapon/material/attack() - if(!..()) - return +/obj/item/weapon/material/apply_hit_effect() + ..() if(!unbreakable) if(material.is_brittle()) health = 0 diff --git a/code/game/objects/items/weapons/material/misc.dm b/code/game/objects/items/weapons/material/misc.dm index dcd33fa1725..91d97274f66 100644 --- a/code/game/objects/items/weapons/material/misc.dm +++ b/code/game/objects/items/weapons/material/misc.dm @@ -65,7 +65,6 @@ icon = 'icons/obj/weapons.dmi' icon_state = "hoe" item_state = "hoe" - flags = CONDUCT | NOBLUDGEON force_divisor = 0.25 // 5 with weight 20 (steel) thrown_force_divisor = 0.25 // as above w_class = 2 diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index f8b21af1903..e9f784f4451 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -225,7 +225,7 @@ /obj/item/weapon/storage/box/emps/New() ..() for(var/i = 1 to 5) - new /obj/item/weapon/grenade/empgrenade(src) + new /obj/item/weapon/grenade/empgrenade(src) /obj/item/weapon/storage/box/empslite name = "box of low yield emp grenades" diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 5baf6c9ed37..b7e55cddb81 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -103,73 +103,52 @@ user << "[src] is out of charge." add_fingerprint(user) - /obj/item/weapon/melee/baton/attack(mob/M, mob/user) if(status && (CLUMSY in user.mutations) && prob(50)) user << "You accidentally hit yourself with the [src]!" user.Weaken(30) deductcharge(hitcost) return + return ..() - if(isrobot(M)) - ..() - return +/obj/item/weapon/melee/baton/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone) + if(isrobot(target)) + return ..() var/agony = agonyforce var/stun = stunforce - var/mob/living/L = M + var/obj/item/organ/external/affecting = null + if(ishuman(target)) + var/mob/living/carbon/human/H = target + affecting = H.get_organ(hit_zone) - var/target_zone = check_zone(user.zone_sel.selecting) if(user.a_intent == I_HURT) - if (!..()) //item/attack() does it's own messaging and logs - return 0 // item/attack() will return 1 if they hit, 0 if they missed. + . = ..() + //whacking someone causes a much poorer electrical contact than deliberately prodding them. + agony *= 0.5 stun *= 0.5 - if(status) //Checks to see if the stunbaton is on. - agony *= 0.5 //whacking someone causes a much poorer contact than prodding them. + else if(!status) + if(affecting) + target.visible_message("[target] has been prodded in the [affecting.name] with [src] by [user]. Luckily it was off.") else - agony = 0 //Shouldn't really stun if it's off, should it? - //we can't really extract the actual hit zone from ..(), unfortunately. Just act like they attacked the area they intended to. + target.visible_message("[target] has been prodded with [src] by [user]. Luckily it was off.") else - //copied from human_defense.dm - human defence code should really be refactored some time. - if (ishuman(L)) - user.lastattacked = L //are these used at all, if we have logs? - L.lastattacker = user - - if (user != L) // Attacking yourself can't miss - target_zone = get_zone_with_miss_chance(user.zone_sel.selecting, L) - - if(!target_zone) - L.visible_message("\The [user] misses [L] with \the [src]!") - return 0 - - var/mob/living/carbon/human/H = L - var/obj/item/organ/external/affecting = H.get_organ(target_zone) - if (affecting) - if(!status) - L.visible_message("[L] has been prodded in the [affecting.name] with [src] by [user]. Luckily it was off.") - return 1 - else - H.visible_message("[L] has been prodded in the [affecting.name] with [src] by [user]!") + if(affecting) + target.visible_message("[target] has been prodded in the [affecting.name] with [src] by [user]!") else - if(!status) - L.visible_message("[L] has been prodded with [src] by [user]. Luckily it was off.") - return 1 - else - L.visible_message("[L] has been prodded with [src] by [user]!") + target.visible_message("[target] has been prodded with [src] by [user]!") + playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) //stun effects - L.stun_effect_act(stun, agony, target_zone, src) + if(status) + target.stun_effect_act(stun, agony, hit_zone, src) + msg_admin_attack("[key_name(user)] stunned [key_name(target)] with the [src].") - playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) - msg_admin_attack("[key_name(user)] stunned [key_name(L)] with the [src].") + deductcharge(hitcost) - deductcharge(hitcost) - - if(ishuman(L)) - var/mob/living/carbon/human/H = L - H.forcesay(hit_appends) - - return 1 + if(ishuman(target)) + var/mob/living/carbon/human/H = target + H.forcesay(hit_appends) /obj/item/weapon/melee/baton/emp_act(severity) if(bcell) diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index c773f3da383..b289e792572 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -1,18 +1,10 @@ /* Weapons * Contains: - * Banhammer * Sword * Classic Baton */ -/* - * Banhammer - */ -/obj/item/weapon/banhammer/attack(mob/M as mob, mob/user as mob) - M << " You have been banned FOR NO REISIN by [user]" - user << " You have BANNED [M]" - -/* +/* * Classic Baton */ /obj/item/weapon/melee/classic_baton @@ -34,33 +26,7 @@ else user.take_organ_damage(2*force) return -/*this is already called in ..() - src.add_fingerprint(user) - M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])") - - log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") -*/ - if (user.a_intent == I_HURT) - if(!..()) return - //playsound(src.loc, "swing_hit", 50, 1, -1) - if (M.stuttering < 8 && (!(HULK in M.mutations)) /*&& (!istype(H:wear_suit, /obj/item/clothing/suit/judgerobe))*/) - M.stuttering = 8 - M.Stun(8) - M.Weaken(8) - for(var/mob/O in viewers(M)) - if (O.client) O.show_message("\The [M] has been beaten with \the [src] by [user]!", 1, "You hear someone fall", 2) - else - playsound(src.loc, 'sound/weapons/Genhit.ogg', 50, 1, -1) - M.Stun(5) - M.Weaken(5) - M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])") - msg_admin_attack("[key_name(user)] attacked [key_name(user)] with [src.name] (INTENT: [uppertext(user.a_intent)])") - src.add_fingerprint(user) - - for(var/mob/O in viewers(M)) - if (O.client) O.show_message("\The [M] has been stunned with \the [src] by [user]!", 1, "You hear someone fall", 2) + return ..() //Telescopic baton /obj/item/weapon/melee/telebaton diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index cf10ae43460..b39fc0dd27e 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -116,7 +116,7 @@ item_state = "cutters_yellow" /obj/item/weapon/wirecutters/attack(mob/living/carbon/C as mob, mob/user as mob) - if((C.handcuffed) && (istype(C.handcuffed, /obj/item/weapon/handcuffs/cable))) + if(user.a_intent == I_HELP && (C.handcuffed) && (istype(C.handcuffed, /obj/item/weapon/handcuffs/cable))) usr.visible_message("\The [usr] cuts \the [C]'s restraints with \the [src]!",\ "You cut \the [C]'s restraints with \the [src]!",\ "You hear cable being cut.") diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 35302dc5dcd..0f5cebc44da 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -1,18 +1,3 @@ -/obj/item/weapon/banhammer - desc = "banhammer" - name = "banhammer" - icon = 'icons/obj/items.dmi' - icon_state = "toyhammer" - slot_flags = SLOT_BELT - throwforce = 0 - w_class = 2.0 - throw_speed = 7 - throw_range = 15 - attack_verb = list("banned") - - suicide_act(mob/user) - viewers(user) << "[user] is hitting \himself with the [src.name]! It looks like \he's trying to ban \himself from life." - return (BRUTELOSS|FIRELOSS|TOXLOSS|OXYLOSS) /obj/item/weapon/nullrod name = "null rod" @@ -37,6 +22,9 @@ msg_admin_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (JMP)") + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + user.do_attack_animation(M) + if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") user << "You don't have the dexterity to do this!" return @@ -68,27 +56,6 @@ user << "You hit the floor with the [src]." call(/obj/effect/rune/proc/revealrunes)(src) -/obj/item/weapon/sord - name = "\improper SORD" - desc = "This thing is so unspeakably shitty you are having a hard time even holding it." - icon_state = "sord" - item_state = "sord" - slot_flags = SLOT_BELT - force = 2 - throwforce = 1 - sharp = 1 - edge = 1 - w_class = 3 - attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - - suicide_act(mob/user) - viewers(user) << "[user] is impaling \himself with the [src.name]! It looks like \he's trying to commit suicide." - return(BRUTELOSS) - -/obj/item/weapon/sord/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) - return ..() - /obj/item/weapon/energy_net name = "energy net" desc = "It's a net made of green energy." diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index ad1797756ca..375c6727eab 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -101,6 +101,78 @@ LINEN BINS icon_state = "sheetbrown" item_state = "sheetbrown" +/obj/item/weapon/bedsheet/ian + icon_state = "sheetian" + item_state = "bedsheet" + +/obj/item/weapon/bedsheet/double + icon_state = "doublesheet" + item_state = "bedsheet" + +/obj/item/weapon/bedsheet/bluedouble + icon_state = "doublesheetblue" + item_state = "sheetblue" + +/obj/item/weapon/bedsheet/greendouble + icon_state = "doublesheetgreen" + item_state = "sheetgreen" + +/obj/item/weapon/bedsheet/orangedouble + icon_state = "doublesheetorange" + item_state = "sheetorange" + +/obj/item/weapon/bedsheet/purpledouble + icon_state = "doublesheetpurple" + item_state = "sheetpurple" + +/obj/item/weapon/bedsheet/doublerainbow //all the way across the sky. + icon_state = "doublesheetrainbow" + item_state = "sheetrainbow" + +/obj/item/weapon/bedsheet/doublered + icon_state = "doublesheetred" + item_state = "sheetred" + +/obj/item/weapon/bedsheet/doubleyellow + icon_state = "doublesheetyellow" + item_state = "sheetyellow" + +/obj/item/weapon/bedsheet/doublemime + icon_state = "doublesheetmime" + item_state = "sheetmime" + +/obj/item/weapon/bedsheet/doubleclown + icon_state = "doublesheetclown" + item_state = "sheetclown" + +/obj/item/weapon/bedsheet/doublecaptain + icon_state = "doublesheetcaptain" + item_state = "sheetcaptain" + +/obj/item/weapon/bedsheet/doublerd + icon_state = "doublesheetrd" + item_state = "sheetrd" + +/obj/item/weapon/bedsheet/doublehos + icon_state = "doublesheethos" + item_state = "sheethos" + +/obj/item/weapon/bedsheet/doublehop + icon_state = "doublesheethop" + item_state = "sheethop" + +/obj/item/weapon/bedsheet/doublece + icon_state = "doublesheetce" + item_state = "sheetce" + +/obj/item/weapon/bedsheet/doublebrown + icon_state = "doublesheetbrown" + item_state = "sheetbrown" + +/obj/item/weapon/bedsheet/doubleian + icon_state = "doublesheetian" + item_state = "bedsheet" + /obj/structure/bedsheetbin name = "linen bin" diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 73914e113cc..49ad2753335 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -129,6 +129,9 @@ else if(istype(W, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = W var/mob/living/affecting = G.affecting + if(has_buckled) //Handles trying to buckle someone else to a chair when someone else is on it + user << "\The [src] already has someone buckled to it." + return user.visible_message("[user] attempts to buckle [affecting] into \the [src]!") if(do_after(user, 20)) affecting.loc = loc @@ -176,6 +179,19 @@ /obj/structure/bed/alien/New(var/newloc) ..(newloc,"resin") +/obj/structure/bed/double + name = "double bed" + icon_state = "doublebed" + base_icon = "doublebed" + +/obj/structure/bed/double/post_buckle_mob(mob/living/M as mob) + if(M == buckled_mob) + M.pixel_y = 13 + M.old_y = 13 + else + M.pixel_y = 0 + M.old_y = 0 + /* * Roller beds */ diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm index e4840bedc63..e4d54f48bae 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm @@ -72,6 +72,11 @@ var/global/list/stool_cache = list() //haha stool /obj/item/weapon/stool/attack(mob/M as mob, mob/user as mob) if (prob(5) && istype(M,/mob/living)) user.visible_message("[user] breaks [src] over [M]'s back!") + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + user.do_attack_animation(M) + + user.drop_from_inventory(src) + user.remove_from_mob(src) dismantle() qdel(src) diff --git a/code/game/objects/structures/under_wardrobe.dm b/code/game/objects/structures/under_wardrobe.dm index a02c67c968b..6a06ef26fbc 100644 --- a/code/game/objects/structures/under_wardrobe.dm +++ b/code/game/objects/structures/under_wardrobe.dm @@ -5,39 +5,83 @@ icon_state = "cabinet_closed" density = 1 -/obj/structure/undies_wardrobe/attack_hand(mob/user as mob) - src.add_fingerprint(user) - var/mob/living/carbon/human/H = user - if(!ishuman(user) || (H.species && !(H.species.appearance_flags & HAS_UNDERWEAR))) +/obj/structure/undies_wardrobe/attack_hand(var/mob/user) + if(!human_who_can_use_underwear(user)) user << "Sadly there's nothing in here for you to wear." - return 0 + return + interact(user) - var/utype = alert("Which section do you want to pick from?",,"Underwear", "Undershirts", "Socks",) - var/list/selection - switch(utype) - if("Underwear") - utype = alert("Which section do you want to pick from?",, "Top", "Bottom",) - switch(utype) - if("Top") - selection = underwear_top_t - if("Bottom") - selection = underwear_bottom_t - if("Undershirts") - selection = undershirt_t - if("Socks") - selection = socks_t - var/pick = input("Select the style") as null|anything in selection - if(pick) - if(get_dist(src,user) > 1) +/obj/structure/undies_wardrobe/interact(var/mob/living/carbon/human/H) + var/dat = list() + dat += "Underwear:
" + for(var/datum/category_group/underwear/UWC in global_underwear.categories) + var/datum/category_item/underwear/UWI = H.all_underwear[UWC.name] + var/item_name = UWI ? UWI.name : "None" + dat += "[UWC.name]: [item_name]" + if(UWI) + for(var/datum/gear_tweak/gt in UWI.tweaks) + dat += " [gt.get_contents(get_metadata(H, UWC.name, gt))]" + dat += " (Remove)
" + + dat = jointext(dat,null) + H << browse(dat, "window=wardrobe;size=400x200") + +/obj/structure/undies_wardrobe/proc/get_metadata(var/mob/living/carbon/human/H, var/underwear_category, var/datum/gear_tweak/gt) + var/metadata = H.all_underwear_metadata[underwear_category] + if(!metadata) + metadata = list() + H.all_underwear_metadata[underwear_category] = metadata + + var/tweak_data = metadata["[gt]"] + if(!tweak_data) + tweak_data = gt.get_default() + metadata["[gt]"] = tweak_data + return tweak_data + +/obj/structure/undies_wardrobe/proc/set_metadata(var/mob/living/carbon/human/H, var/underwear_category, var/datum/gear_tweak/gt, var/new_metadata) + var/list/metadata = H.all_underwear_metadata[underwear_category] + metadata["[gt]"] = new_metadata + +/obj/structure/undies_wardrobe/proc/human_who_can_use_underwear(var/mob/living/carbon/human/H) + if(!istype(H) || !H.species || !(H.species.appearance_flags & HAS_UNDERWEAR)) + return FALSE + return TRUE + +/obj/structure/undies_wardrobe/CanUseTopic(var/user) + if(!human_who_can_use_underwear(user)) + return STATUS_CLOSE + + return ..() + +/obj/structure/undies_wardrobe/Topic(href, href_list, state) + if(..()) + return TRUE + + var/mob/living/carbon/human/H = usr + if(href_list["remove_underwear"]) + if(href_list["remove_underwear"] in H.all_underwear) + H.all_underwear -= href_list["remove_underwear"] + . = TRUE + else if(href_list["change_underwear"]) + var/datum/category_group/underwear/UWC = global_underwear.categories_by_name[href_list["change_underwear"]] + if(!UWC) return - if(utype == "Undershirts") - H.undershirt = selection[pick] - else if(utype == "Socks") - H.socks = selection[pick] - else if(utype == "Top") - H.underwear_top = selection[pick] - else - H.underwear_bottom = selection[pick] - H.update_body(1) + var/datum/category_item/underwear/selected_underwear = input(H, "Choose underwear:", "Choose underwear", H.all_underwear[UWC.name]) as null|anything in UWC.items + if(selected_underwear && CanUseTopic(H, default_state)) + H.all_underwear[UWC.name] = selected_underwear + . = TRUE + else if(href_list["underwear"] && href_list["tweak"]) + var/underwear = href_list["underwear"] + if(!(underwear in H.all_underwear)) + return + var/datum/gear_tweak/gt = locate(href_list["tweak"]) + if(!gt) + return + var/new_metadata = gt.get_metadata(usr, get_metadata(H, underwear, gt), "Wardrobe Underwear Selection") + if(new_metadata) + set_metadata(H, underwear, gt, new_metadata) + . = TRUE - return 1 \ No newline at end of file + if(.) + H.update_underwear() + interact(H) \ No newline at end of file diff --git a/code/game/turfs/initialization/maintenance.dm b/code/game/turfs/initialization/maintenance.dm index 5a9574810b1..16b1d03d21e 100644 --- a/code/game/turfs/initialization/maintenance.dm +++ b/code/game/turfs/initialization/maintenance.dm @@ -26,7 +26,7 @@ var/global/list/random_junk if(prob(25)) return /obj/effect/decal/cleanable/generic if(!random_junk) - random_junk = subtypes(/obj/item/trash) + random_junk = subtypesof(/obj/item/trash) random_junk += typesof(/obj/item/weapon/cigbutt) random_junk += /obj/effect/decal/cleanable/spiderling_remains random_junk += /obj/effect/decal/remains/mouse diff --git a/code/global.dm b/code/global.dm index 625712336ca..15b17823f8a 100644 --- a/code/global.dm +++ b/code/global.dm @@ -118,7 +118,6 @@ var/join_motd = null var/datum/nanomanager/nanomanager = new() // NanoManager, the manager for Nano UIs. var/datum/event_manager/event_manager = new() // Event Manager, the manager for events. -var/datum/subsystem/alarm/alarm_manager = new() // Alarm Manager, the manager for alarms. var/list/awaydestinations = list() // Away missions. A list of landmarks that the warpgate can take you to. diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 5d8db9c0729..170f9302f9a 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -234,9 +234,9 @@ Ccomp's first proc. var/list/mobs = list() var/list/ghosts = list() - var/list/sortmob = sortAtom(mob_list) // get the mob list. + var/list/sortmob = sortAtom(mob_list) // get the mob list. var/any=0 - for(var/mob/observer/dead/M in sortmob) + for(var/mob/observer/dead/M in sortmob) mobs.Add(M) //filter it where it's only ghosts any = 1 //if no ghosts show up, any will just be 0 if(!any) @@ -388,7 +388,7 @@ Traitors and the like can also be revived with the previous role mostly intact. else new_character.gender = pick(MALE,FEMALE) var/datum/preferences/A = new() - A.randomize_appearance_for(new_character) + A.randomize_appearance_and_body_for(new_character) new_character.real_name = G_found.real_name if(!new_character.real_name) diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm index 2588836df56..656f54d4778 100644 --- a/code/modules/client/preference_setup/general/01_basic.dm +++ b/code/modules/client/preference_setup/general/01_basic.dm @@ -80,7 +80,7 @@ datum/preferences/proc/set_biological_gender(var/gender) var/new_gender = input(user, "Choose your character's biological gender:", "Character Preference", pref.biological_gender) as null|anything in get_genders() if(new_gender && CanUseTopic(user)) pref.set_biological_gender(new_gender) - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["id_gender"]) var/new_gender = input(user, "Choose your character's identifying gender:", "Character Preference", pref.identifying_gender) as null|anything in all_genders_define_list diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index ee93b2acf47..a092b859b31 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -1,5 +1,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-") +/datum/preferences + var/dress_mob = TRUE + /datum/category_item/player_setup_item/general/body name = "Body" sort_order = 3 @@ -25,6 +28,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O S["disabilities"] >> pref.disabilities S["organ_data"] >> pref.organ_data S["rlimb_data"] >> pref.rlimb_data + pref.preview_icon = null /datum/category_item/player_setup_item/general/body/save_character(var/savefile/S) S["species"] << pref.species @@ -74,10 +78,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O /datum/category_item/player_setup_item/general/body/content(var/mob/user) . = list() - pref.update_preview_icon() - if(pref.preview_icon_front && pref.preview_icon_side) - user << browse_rsc(pref.preview_icon_front, "preview_icon.png") - user << browse_rsc(pref.preview_icon_side, "preview_icon2.png") + if(!pref.preview_icon) + pref.update_preview_icon() + user << browse_rsc(pref.preview_icon, "previewicon.png") var/mob_species = all_species[pref.species] . += "
Body " @@ -167,7 +170,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O else . += "

" - . += "
Preview
" + . += "
Preview
" + . += "
" + . += "
[pref.dress_mob ? "Hide equipment" : "Show equipment"]" + . += "
" . += "Hair
" @@ -196,8 +202,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/datum/species/mob_species = all_species[pref.species] if(href_list["random"]) - pref.randomize_appearance_for() - return TOPIC_REFRESH + pref.randomize_appearance_and_body_for() + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["blood_type"]) var/new_b_type = input(user, "Choose your character's blood-type:", "Character Preference") as null|anything in valid_bloodtypes @@ -274,7 +280,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/datum/species/S = all_species[pref.species] pref.age = max(min(pref.age, S.max_age), S.min_age) - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["hair_color"]) if(!has_flag(mob_species, HAS_HAIR_COLOR)) @@ -284,7 +290,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.r_hair = hex2num(copytext(new_hair, 2, 4)) pref.g_hair = hex2num(copytext(new_hair, 4, 6)) pref.b_hair = hex2num(copytext(new_hair, 6, 8)) - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["hair_style"]) var/list/valid_hairstyles = list() @@ -298,7 +304,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference", pref.h_style) as null|anything in valid_hairstyles if(new_h_style && CanUseTopic(user)) pref.h_style = new_h_style - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["facial_color"]) if(!has_flag(mob_species, HAS_HAIR_COLOR)) @@ -308,7 +314,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.r_facial = hex2num(copytext(new_facial, 2, 4)) pref.g_facial = hex2num(copytext(new_facial, 4, 6)) pref.b_facial = hex2num(copytext(new_facial, 6, 8)) - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["eye_color"]) if(!has_flag(mob_species, HAS_EYE_COLOR)) @@ -318,7 +324,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.r_eyes = hex2num(copytext(new_eyes, 2, 4)) pref.g_eyes = hex2num(copytext(new_eyes, 4, 6)) pref.b_eyes = hex2num(copytext(new_eyes, 6, 8)) - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["skin_tone"]) if(!has_flag(mob_species, HAS_SKIN_TONE)) @@ -326,7 +332,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/new_s_tone = input(user, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Character Preference", (-pref.s_tone) + 35) as num|null if(new_s_tone && has_flag(mob_species, HAS_SKIN_TONE) && CanUseTopic(user)) pref.s_tone = 35 - max(min( round(new_s_tone), 220),1) - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["skin_color"]) if(!has_flag(mob_species, HAS_SKIN_COLOR)) @@ -336,7 +342,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.r_skin = hex2num(copytext(new_skin, 2, 4)) pref.g_skin = hex2num(copytext(new_skin, 4, 6)) pref.b_skin = hex2num(copytext(new_skin, 6, 8)) - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["facial_style"]) var/list/valid_facialhairstyles = list() @@ -354,11 +360,11 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference", pref.f_style) as null|anything in valid_facialhairstyles if(new_f_style && has_flag(mob_species, HAS_HAIR_COLOR) && CanUseTopic(user)) pref.f_style = new_f_style - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["reset_limbs"]) reset_limbs() - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["limbs"]) @@ -419,7 +425,6 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O switch(new_state) if("Normal") - if(limb == BP_TORSO) for(var/other_limb in BP_ALL - BP_TORSO) pref.organ_data[other_limb] = null @@ -444,6 +449,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/list/usable_manufacturers = list() for(var/company in chargen_robolimbs) var/datum/robolimb/M = chargen_robolimbs[company] + if(!(limb in M.parts)) + continue if(tmp_species in M.species_cannot_use) continue usable_manufacturers[company] = M @@ -473,7 +480,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O for(var/internal_organ in list(O_HEART,O_EYES)) pref.organ_data[internal_organ] = "mechanical" - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["organs"]) @@ -511,7 +518,11 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O else if(href_list["disabilities"]) var/disability_flag = text2num(href_list["disabilities"]) pref.disabilities ^= disability_flag - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["toggle_clothing"]) + pref.dress_mob = !pref.dress_mob + return TOPIC_REFRESH_UPDATE_PREVIEW return ..() diff --git a/code/modules/client/preference_setup/general/04_equipment.dm b/code/modules/client/preference_setup/general/04_equipment.dm index e3565515070..c455cef524a 100644 --- a/code/modules/client/preference_setup/general/04_equipment.dm +++ b/code/modules/client/preference_setup/general/04_equipment.dm @@ -1,90 +1,119 @@ +/datum/preferences + var/list/all_underwear + var/list/all_underwear_metadata + /datum/category_item/player_setup_item/general/equipment name = "Clothing" sort_order = 4 /datum/category_item/player_setup_item/general/equipment/load_character(var/savefile/S) - S["underwear_top"] >> pref.underwear_top - S["underwear_bottom"] >> pref.underwear_bottom - S["undershirt"] >> pref.undershirt - S["socks"] >> pref.socks + S["all_underwear"] >> pref.all_underwear + S["all_underwear_metadata"] >> pref.all_underwear_metadata S["backbag"] >> pref.backbag S["pdachoice"] >> pref.pdachoice /datum/category_item/player_setup_item/general/equipment/save_character(var/savefile/S) - S["underwear_top"] << pref.underwear_top - S["underwear_bottom"] << pref.underwear_bottom - S["undershirt"] << pref.undershirt - S["socks"] << pref.socks + S["all_underwear"] << pref.all_underwear + S["all_underwear_metadata"] << pref.all_underwear_metadata S["backbag"] << pref.backbag S["pdachoice"] << pref.pdachoice /datum/category_item/player_setup_item/general/equipment/sanitize_character() + if(!islist(pref.gear)) pref.gear = list() + + if(!istype(pref.all_underwear)) + pref.all_underwear = list() + + for(var/datum/category_group/underwear/WRC in global_underwear.categories) + for(var/datum/category_item/underwear/WRI in WRC.items) + if(WRI.is_default(pref.identifying_gender ? pref.identifying_gender : MALE)) + pref.all_underwear[WRC.name] = WRI.name + break + + if(!istype(pref.all_underwear_metadata)) + pref.all_underwear_metadata = list() + + for(var/underwear_category in pref.all_underwear) + var/datum/category_group/underwear/UWC = global_underwear.categories_by_name[underwear_category] + if(!UWC) + pref.all_underwear -= underwear_category + else + var/datum/category_item/underwear/UWI = UWC.items_by_name[pref.all_underwear[underwear_category]] + if(!UWI) + pref.all_underwear -= underwear_category + + for(var/underwear_metadata in pref.all_underwear_metadata) + if(!(underwear_metadata in pref.all_underwear)) + pref.all_underwear_metadata -= underwear_metadata pref.backbag = sanitize_integer(pref.backbag, 1, backbaglist.len, initial(pref.backbag)) pref.pdachoice = sanitize_integer(pref.pdachoice, 1, pdachoicelist.len, initial(pref.pdachoice)) - if(!islist(pref.gear)) pref.gear = list() - - var/undies_top = get_undies_top() - var/undies_bottom = get_undies_bottom() - if(!get_key_by_value(undies_top, pref.underwear_top)) - pref.underwear_top = undies_top[1] - if(!get_key_by_value(undies_bottom, pref.underwear_bottom)) - pref.underwear_bottom = undies_bottom[1] - if(!get_key_by_value(undershirt_t, pref.undershirt)) - pref.undershirt = undershirt_t[1] - if(!get_key_by_value(socks_t, pref.socks)) - pref.socks = socks_t[1] - /datum/category_item/player_setup_item/general/equipment/content() + . = list() . += "Equipment:
" - . += "Underwear Top: [get_key_by_value(get_undies_top(),pref.underwear_top)]
" - . += "Underwear Bottom: [get_key_by_value(get_undies_bottom(),pref.underwear_bottom)]
" - . += "Undershirt: [get_key_by_value(undershirt_t,pref.undershirt)]
" - . += "Socks: [get_key_by_value(socks_t,pref.socks)]
" + for(var/datum/category_group/underwear/UWC in global_underwear.categories) + var/item_name = pref.all_underwear[UWC.name] ? pref.all_underwear[UWC.name] : "None" + . += "[UWC.name]: [item_name]" + var/datum/category_item/underwear/UWI = UWC.items_by_name[item_name] + if(UWI) + for(var/datum/gear_tweak/gt in UWI.tweaks) + . += " [gt.get_contents(get_metadata(UWC.name, gt))]" + + . += "
" . += "Backpack Type: [backbaglist[pref.backbag]]
" . += "PDA Type: [pdachoicelist[pref.pdachoice]]
" -/datum/category_item/player_setup_item/general/equipment/proc/get_undies_top() - return underwear_top_t -/datum/category_item/player_setup_item/general/equipment/proc/get_undies_bottom() - return underwear_bottom_t + return jointext(.,null) + +/datum/category_item/player_setup_item/general/equipment/proc/get_metadata(var/underwear_category, var/datum/gear_tweak/gt) + var/metadata = pref.all_underwear_metadata[underwear_category] + if(!metadata) + metadata = list() + pref.all_underwear_metadata[underwear_category] = metadata + + var/tweak_data = metadata["[gt]"] + if(!tweak_data) + tweak_data = gt.get_default() + metadata["[gt]"] = tweak_data + return tweak_data + +/datum/category_item/player_setup_item/general/equipment/proc/set_metadata(var/underwear_category, var/datum/gear_tweak/gt, var/new_metadata) + var/list/metadata = pref.all_underwear_metadata[underwear_category] + metadata["[gt]"] = new_metadata + /datum/category_item/player_setup_item/general/equipment/OnTopic(var/href,var/list/href_list, var/mob/user) - if(href_list["change_underwear_top"]) - var/underwear_top_options = get_undies_top() - var/new_underwear_top = input(user, "Choose your character's top underwear:", "Character Preference", get_key_by_value(get_undies_top(),pref.underwear_top)) as null|anything in underwear_top_options - if(!isnull(new_underwear_top) && CanUseTopic(user)) - pref.underwear_top = underwear_top_options[new_underwear_top] - return TOPIC_REFRESH - - else if(href_list["change_underwear_bottom"]) - var/underwear_bottom_options = get_undies_bottom() - var/new_underwear_bottom = input(user, "Choose your character's bottom underwear:", "Character Preference", get_key_by_value(get_undies_bottom(),pref.underwear_bottom)) as null|anything in underwear_bottom_options - if(!isnull(new_underwear_bottom) && CanUseTopic(user)) - pref.underwear_bottom = underwear_bottom_options[new_underwear_bottom] - return TOPIC_REFRESH - - else if(href_list["change_undershirt"]) - var/new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference", get_key_by_value(undershirt_t,pref.undershirt)) as null|anything in undershirt_t - if(!isnull(new_undershirt) && CanUseTopic(user)) - pref.undershirt = undershirt_t[new_undershirt] - return TOPIC_REFRESH - - else if(href_list["change_socks"]) - var/new_socks = input(user, "Choose your character's socks:", "Character Preference", get_key_by_value(socks_t,pref.socks)) as null|anything in socks_t - if(!isnull(new_socks) && CanUseTopic(user)) - pref.socks = socks_t[new_socks] - return TOPIC_REFRESH - - else if(href_list["change_backpack"]) + if(href_list["change_backpack"]) var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference", backbaglist[pref.backbag]) as null|anything in backbaglist if(!isnull(new_backbag) && CanUseTopic(user)) pref.backbag = backbaglist.Find(new_backbag) - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["change_pda"]) var/new_pdachoice = input(user, "Choose your character's style of PDA:", "Character Preference", pdachoicelist[pref.pdachoice]) as null|anything in pdachoicelist if(!isnull(new_pdachoice) && CanUseTopic(user)) pref.pdachoice = pdachoicelist.Find(new_pdachoice) return TOPIC_REFRESH - return ..() + + else if(href_list["change_underwear"]) + var/datum/category_group/underwear/UWC = global_underwear.categories_by_name[href_list["change_underwear"]] + if(!UWC) + return + var/datum/category_item/underwear/selected_underwear = input(user, "Choose underwear:", "Character Preference", pref.all_underwear[UWC.name]) as null|anything in UWC.items + if(selected_underwear && CanUseTopic(user)) + pref.all_underwear[UWC.name] = selected_underwear.name + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["underwear"] && href_list["tweak"]) + var/underwear = href_list["underwear"] + if(!(underwear in pref.all_underwear)) + return TOPIC_NOACTION + var/datum/gear_tweak/gt = locate(href_list["tweak"]) + if(!gt) + return TOPIC_NOACTION + var/new_metadata = gt.get_metadata(usr, get_metadata(underwear, gt)) + if(new_metadata) + set_metadata(underwear, gt, new_metadata) + return TOPIC_REFRESH_UPDATE_PREVIEW + + return ..() \ No newline at end of file diff --git a/code/modules/client/preference_setup/global/setting_datums.dm b/code/modules/client/preference_setup/global/setting_datums.dm index e0e0356a6cf..d446a8f9505 100644 --- a/code/modules/client/preference_setup/global/setting_datums.dm +++ b/code/modules/client/preference_setup/global/setting_datums.dm @@ -5,7 +5,7 @@ var/list/_client_preferences_by_type /proc/get_client_preferences() if(!_client_preferences) _client_preferences = list() - for(var/ct in subtypes(/datum/client_preference)) + for(var/ct in subtypesof(/datum/client_preference)) var/datum/client_preference/client_type = ct if(initial(client_type.description)) _client_preferences += new client_type() diff --git a/code/modules/client/preference_setup/loadout/gear_tweaks.dm b/code/modules/client/preference_setup/loadout/gear_tweaks.dm index 820c95f3248..e8b1a56d621 100644 --- a/code/modules/client/preference_setup/loadout/gear_tweaks.dm +++ b/code/modules/client/preference_setup/loadout/gear_tweaks.dm @@ -17,8 +17,6 @@ * Color adjustment */ -var/datum/gear_tweak/color/gear_tweak_free_color_choice = new() - /datum/gear_tweak/color var/list/valid_colors @@ -32,10 +30,10 @@ var/datum/gear_tweak/color/gear_tweak_free_color_choice = new() /datum/gear_tweak/color/get_default() return valid_colors ? valid_colors[1] : COLOR_GRAY -/datum/gear_tweak/color/get_metadata(var/user, var/metadata) +/datum/gear_tweak/color/get_metadata(var/user, var/metadata, var/title = "Character Preference") if(valid_colors) - return input(user, "Choose an item color.", "Character Preference", metadata) as null|anything in valid_colors - return input(user, "Choose an item color.", "Global Preference", metadata) as color|null + return input(user, "Choose a color.", title, metadata) as null|anything in valid_colors + return input(user, "Choose a color.", title, metadata) as color|null /datum/gear_tweak/color/tweak_item(var/obj/item/I, var/metadata) if(valid_colors && !(metadata in valid_colors)) diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm index e2d73ff8b3f..dd494b03bcc 100644 --- a/code/modules/client/preference_setup/loadout/loadout.dm +++ b/code/modules/client/preference_setup/loadout/loadout.dm @@ -63,6 +63,8 @@ var/list/gear_datums = list() return valid_gear_choices /datum/category_item/player_setup_item/loadout/sanitize_character() + if(!islist(pref.gear)) + pref.gear = list() for(var/gear_name in pref.gear) if(!(gear_name in gear_datums)) @@ -169,7 +171,7 @@ var/list/gear_datums = list() if(istype(G)) total_cost += G.cost if((total_cost+TG.cost) <= MAX_GEAR_COST) pref.gear += TG.display_name - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW if(href_list["gear"] && href_list["tweak"]) var/datum/gear/gear = gear_datums[href_list["gear"]] var/datum/gear_tweak/tweak = locate(href_list["tweak"]) @@ -179,13 +181,13 @@ var/list/gear_datums = list() if(!metadata || !CanUseTopic(user)) return TOPIC_NOACTION set_tweak_metadata(gear, tweak, metadata) - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["select_category"]) current_tab = href_list["select_category"] return TOPIC_REFRESH else if(href_list["clear_loadout"]) pref.gear.Cut() - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW return ..() /datum/gear diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm index a5c66d2e797..a90373d2195 100644 --- a/code/modules/client/preference_setup/loadout/loadout_accessories.dm +++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm @@ -53,10 +53,34 @@ display_name = "tie, blue" path = /obj/item/clothing/accessory/blue +/datum/gear/accessory/tie/blue_clip + display_name = "tie, blue with clip" + path = /obj/item/clothing/accessory/blue_clip + +/datum/gear/accessory/tie/blue_long + display_name = "tie, blue long" + path = /obj/item/clothing/accessory/blue_long + /datum/gear/accessory/tie/red display_name = "tie, red" path = /obj/item/clothing/accessory/red +/datum/gear/accessory/tie/red_clip + display_name = "tie, red with clip" + path = /obj/item/clothing/accessory/red_clip + +/datum/gear/accessory/tie/red_long + display_name = "tie, red long" + path = /obj/item/clothing/accessory/red_long + +/datum/gear/accessory/tie/yellow + display_name = "tie, yellow" + path = /obj/item/clothing/accessory/yellow + +/datum/gear/accessory/tie/navy + display_name = "tie, navy blue" + path = /obj/item/clothing/accessory/navy + /datum/gear/accessory/tie/horrible display_name = "tie, socially disgraceful" path = /obj/item/clothing/accessory/horrible @@ -121,6 +145,30 @@ display_name = "scarf, striped blue" path = /obj/item/clothing/accessory/stripedbluescarf +/datum/gear/accessory/suitjacket + display_name = "suit jacket, tan" + path = /obj/item/clothing/accessory/tan_jacket + +/datum/gear/accessory/suitjacket/charcoal + display_name = "suit jacket, charcoal" + path = /obj/item/clothing/accessory/charcoal_jacket + +/datum/gear/accessory/suitjacket/navy + display_name = "suit jacket, navy blue" + path = /obj/item/clothing/accessory/navy_jacket + +/datum/gear/accessory/suitjacket/burgundy + display_name = "suit jacket, burgundy" + path = /obj/item/clothing/accessory/burgundy_jacket + +/datum/gear/accessory/suitjacket/checkered + display_name = "suit jacket, checkered" + path = /obj/item/clothing/accessory/checkered_jacket + +/datum/gear/accessory/suitvest + display_name = "suit vest" + path = /obj/item/clothing/accessory/vest + /datum/gear/accessory/brown_vest display_name = "webbing, engineering" path = /obj/item/clothing/accessory/storage/brown_vest diff --git a/code/modules/client/preference_setup/occupation/occupation.dm b/code/modules/client/preference_setup/occupation/occupation.dm index 09dd7f573e4..b3704bfb0c5 100644 --- a/code/modules/client/preference_setup/occupation/occupation.dm +++ b/code/modules/client/preference_setup/occupation/occupation.dm @@ -160,10 +160,10 @@ var/choice = input("Choose an title for [job.title].", "Choose Title", pref.GetPlayerAltTitle(job)) as anything in choices|null if(choice && CanUseTopic(user)) SetPlayerAltTitle(job, choice) - return TOPIC_REFRESH + return (pref.dress_mob ? TOPIC_REFRESH_UPDATE_PREVIEW : TOPIC_REFRESH) else if(href_list["set_job"]) - if(SetJob(user, href_list["set_job"])) return TOPIC_REFRESH + if(SetJob(user, href_list["set_job"])) return (pref.dress_mob ? TOPIC_REFRESH_UPDATE_PREVIEW : TOPIC_REFRESH) return ..() diff --git a/code/modules/client/preference_setup/preference_setup.dm b/code/modules/client/preference_setup/preference_setup.dm index a890db16f51..7028894fda4 100644 --- a/code/modules/client/preference_setup/preference_setup.dm +++ b/code/modules/client/preference_setup/preference_setup.dm @@ -1,7 +1,8 @@ -// These are not flags, binary operations not intended #define TOPIC_NOACTION 0 #define TOPIC_HANDLED 1 #define TOPIC_REFRESH 2 +#define TOPIC_UPDATE_PREVIEW 4 +#define TOPIC_REFRESH_UPDATE_PREVIEW (TOPIC_REFRESH|TOPIC_UPDATE_PREVIEW) /datum/category_group/player_setup_category/general_preferences name = "General" @@ -217,7 +218,9 @@ return 1 . = OnTopic(href, href_list, usr) - if(. == TOPIC_REFRESH) + if(. & TOPIC_UPDATE_PREVIEW) + pref_mob.client.prefs.preview_icon = null + if(. & TOPIC_REFRESH) pref_mob.client.prefs.ShowChoices(usr) /datum/category_item/player_setup_item/CanUseTopic(var/mob/user) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 0e9bf5323bd..665ea5836c1 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -28,10 +28,6 @@ datum/preferences var/age = 30 //age of character var/spawnpoint = "Arrivals Shuttle" //where this character will spawn (0-2). var/b_type = "A+" //blood type (not-chooseable) - var/underwear_top - var/underwear_bottom - var/undershirt //undershirt type - var/socks //socks type var/backbag = 2 //backpack type var/pdachoice = 1 //PDA type var/h_style = "Bald" //Hair type @@ -63,8 +59,6 @@ datum/preferences //Mob preview var/icon/preview_icon = null - var/icon/preview_icon_front = null - var/icon/preview_icon_side = null //Jobs, uses bitflags var/job_civilian_high = 0 @@ -122,7 +116,7 @@ datum/preferences player_setup = new(src) set_biological_gender(pick(MALE, FEMALE)) real_name = random_name(identifying_gender,species) - b_type = pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+") + b_type = RANDOM_BLOOD_TYPE gear = list() @@ -213,7 +207,7 @@ datum/preferences dat += "" //user << browse(dat, "window=preferences;size=635x736") - var/datum/browser/popup = new(user, "Character Setup","Character Setup", 635, 736, src) + var/datum/browser/popup = new(user, "Character Setup","Character Setup", 800, 800, src) popup.set_content(dat) popup.open() @@ -254,9 +248,10 @@ datum/preferences ShowChoices(usr) return 1 -/datum/preferences/proc/copy_to(mob/living/carbon/human/character, safety = 0) +/datum/preferences/proc/copy_to(mob/living/carbon/human/character, icon_updates = 1) // Sanitizing rather than saving as someone might still be editing when copy_to occurs. player_setup.sanitize_setup() + character.set_species(species) if(be_random_name) real_name = random_name(identifying_gender,species) @@ -297,10 +292,12 @@ datum/preferences character.g_eyes = g_eyes character.b_eyes = b_eyes + character.h_style = h_style character.r_hair = r_hair character.g_hair = g_hair character.b_hair = b_hair + character.f_style = f_style character.r_facial = r_facial character.g_facial = g_facial character.b_facial = b_facial @@ -346,10 +343,18 @@ datum/preferences else if(status == "mechanical") I.robotize() - character.underwear_bottom = underwear_bottom - character.underwear_top = underwear_top - character.undershirt = undershirt - character.socks = socks + character.all_underwear.Cut() + character.all_underwear_metadata.Cut() + + for(var/underwear_category_name in all_underwear) + var/datum/category_group/underwear/underwear_category = global_underwear.categories_by_name[underwear_category_name] + if(underwear_category) + var/underwear_item_name = all_underwear[underwear_category_name] + character.all_underwear[underwear_category_name] = underwear_category.items_by_name[underwear_item_name] + if(all_underwear_metadata[underwear_category_name]) + character.all_underwear_metadata[underwear_category_name] = all_underwear_metadata[underwear_category_name] + else + all_underwear -= underwear_category_name if(backbag > 4 || backbag < 1) backbag = 1 //Same as above @@ -359,7 +364,13 @@ datum/preferences pdachoice = 1 character.pdachoice = pdachoice - character.update_body() + if(icon_updates) + character.force_update_limbs() + character.update_mutations(0) + character.update_body(0) + character.update_underwear(0) + character.update_hair(0) + character.update_icons() /datum/preferences/proc/open_load_dialog(mob/user) var/dat = "" diff --git a/code/modules/clothing/masks/monitor.dm b/code/modules/clothing/masks/monitor.dm index e8f63401722..9d0651d5ba8 100644 --- a/code/modules/clothing/masks/monitor.dm +++ b/code/modules/clothing/masks/monitor.dm @@ -9,28 +9,10 @@ icon = 'icons/mob/monitor_icons.dmi' icon_override = 'icons/mob/monitor_icons.dmi' - icon_state = "ipc_blank" - item_state = null + icon_state = "monitor" var/monitor_state_index = "blank" - var/global/list/monitor_states = list( - "blank" = "ipc_blank", - "pink" = "ipc_pink", - "red" = "ipc_red", - "green" = "ipc_green", - "blue" = "ipc_blue", - "breakout" = "ipc_breakout", - "eight" = "ipc_eight", - "goggles" = "ipc_goggles", - "heart" = "ipc_heart", - "monoeye" = "ipc_monoeye", - "nature" = "ipc_nature", - "orange" = "ipc_orange", - "purple" = "ipc_purple", - "shower" = "ipc_shower", - "static" = "ipc_static", - "yellow" = "ipc_yellow" - ) + var/global/list/monitor_states = list() /obj/item/clothing/mask/monitor/set_dir() dir = SOUTH @@ -40,8 +22,13 @@ ..() var/mob/living/carbon/human/H = loc if(istype(H) && H.wear_mask == src) + var/obj/item/organ/external/E = H.organs_by_name[BP_HEAD] + var/datum/robolimb/robohead = all_robolimbs[E.model] canremove = 0 - H << "\The [src] connects to your display output." + if(robohead.monitor_styles) + monitor_states = params2list(robohead.monitor_styles) + icon_state = monitor_states[monitor_state_index] + H << "\The [src] connects to your display output." /obj/item/clothing/mask/monitor/dropped() canremove = 1 @@ -52,9 +39,10 @@ return 0 if(istype(user)) var/obj/item/organ/external/E = user.organs_by_name[BP_HEAD] - if(istype(E) && (E.robotic >= ORGAN_ROBOT)) + var/datum/robolimb/robohead = all_robolimbs[E.model] + if(istype(E) && (E.robotic >= ORGAN_ROBOT) && robohead.monitor_styles) return 1 - user << "You must have a robotic head to install this upgrade." + user << "You must have a compatible robotic head to install this upgrade." return 0 /obj/item/clothing/mask/monitor/verb/set_monitor_state() diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index d4ab2e4d0f7..c9ac0fb4f4e 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -84,6 +84,14 @@ name = "blue tie with a clip" icon_state = "bluecliptie" +/obj/item/clothing/accessory/blue_long + name = "blue long tie" + icon_state = "bluelongtie" + +/obj/item/clothing/accessory/red_clip + name = "red tie with a clip" + icon_state = "redcliptie" + /obj/item/clothing/accessory/red_long name = "red long tie" icon_state = "redlongtie" diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm index b78b0ffac3c..2908a7b639d 100644 --- a/code/modules/clothing/under/accessories/badges.dm +++ b/code/modules/clothing/under/accessories/badges.dm @@ -38,6 +38,8 @@ /obj/item/clothing/accessory/badge/attack(mob/living/carbon/human/M, mob/living/user) if(isliving(user)) user.visible_message("[user] invades [M]'s personal space, thrusting [src] into their face insistently.","You invade [M]'s personal space, thrusting [src] into their face insistently.") + user.do_attack_animation(M) + user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam //.Holobadges. /obj/item/clothing/accessory/badge/holo @@ -127,4 +129,4 @@ new /obj/item/clothing/accessory/badge/holo/hos(src) new /obj/item/clothing/accessory/badge/holo/cord(src) ..() - return \ No newline at end of file + return diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index bc0f1a376c9..f9536420e26 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -263,9 +263,6 @@ return 1 return 0 -/obj/item/weapon/holo/esword/attack(target as mob, mob/user as mob) - ..() - /obj/item/weapon/holo/esword/New() item_color = pick("red","blue","green","purple") diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 608398a039c..1a89c9c0a43 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -236,66 +236,22 @@ return ..() -/obj/item/weapon/reagent_containers/food/snacks/grown/attack(var/mob/living/carbon/M, var/mob/user, var/def_zone) - if(user == M) - return ..() +/obj/item/weapon/reagent_containers/food/snacks/grown/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone) + . = ..() - if(user.a_intent == I_HURT) - - // This is being copypasted here because reagent_containers (WHY DOES FOOD DESCEND FROM THAT) overrides it completely. - // TODO: refactor all food paths to be less horrible and difficult to work with in this respect. ~Z - if(!istype(M) || (can_operate(M) && do_surgery(M,user,src))) return 0 - - user.lastattacked = M - M.lastattacker = user - user.attack_log += "\[[time_stamp()]\] Attacked [M.name] ([M.ckey]) with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])" - M.attack_log += "\[[time_stamp()]\] Attacked by [user.name] ([user.ckey]) with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])" - msg_admin_attack("[key_name(user)] attacked [key_name(M)] with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])" ) - - if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - var/hit = H.attacked_by(src, user, def_zone) - if(hit && hitsound) - playsound(loc, hitsound, 50, 1, -1) - return hit - else - if(attack_verb.len) - user.visible_message("[M] has been [pick(attack_verb)] with [src] by [user]!") - else - user.visible_message("[M] has been attacked with [src] by [user]!") - - if (hitsound) - playsound(loc, hitsound, 50, 1, -1) - switch(damtype) - if("brute") - M.take_organ_damage(force) - if(prob(33)) - var/turf/simulated/location = get_turf(M) - if(istype(location)) location.add_blood_floor(M) - if("fire") - if (!(COLD_RESISTANCE in M.mutations)) - M.take_organ_damage(0, force) - M.updatehealth() - - if(seed && seed.get_trait(TRAIT_STINGS)) - if(!reagents || reagents.total_volume <= 0) - return - reagents.remove_any(rand(1,3)) - seed.thrown_at(src,M) - sleep(-1) - if(!src) - return - if(prob(35)) - if(user) - user << "\The [src] has fallen to bits." - user.drop_from_inventory(src) - qdel(src) - - add_fingerprint(user) - return 1 - - else - ..() + if(seed && seed.get_trait(TRAIT_STINGS)) + if(!reagents || reagents.total_volume <= 0) + return + reagents.remove_any(rand(1,3)) + seed.thrown_at(src, target) + sleep(-1) + if(!src) + return + if(prob(35)) + if(user) + user << "\The [src] has fallen to bits." + user.drop_from_inventory(src) + qdel(src) /obj/item/weapon/reagent_containers/food/snacks/grown/attack_self(mob/user as mob) diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 6f4f82b8b8c..9115fea2446 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -337,12 +337,50 @@ return impact +/datum/seed/proc/generate_name() + var/prefix = "" + var/name = "" + if(prob(50)) //start with a prefix. + //These are various plant/mushroom genuses. + //I realize these might not be entirely accurate, but it could facilitate RP. + var/list/possible_prefixes + if(seed_noun == "cuttings" || seed_noun == "seeds" || (seed_noun == "nodes" && prob(50))) + possible_prefixes = list("amelanchier", "saskatoon", + "magnolia", "angiosperma", "osmunda", "scabiosa", "spigelia", "psydrax", "chastetree", + "strychnos", "treebine", "caper", "justica", "ragwortus", "everlasting", "combretum", + "loganiaceae", "gelsemium", "logania", "sabadilla", "neuburgia", "canthium", "rytigynia", + "chaste", "vitex", "cissus", "capparis", "senecio", "curry", "cycad", "liverwort", "charophyta", + "glaucophyte", "pinidae", "vascular", "embryophyte", "lillopsida") + else + possible_prefixes = list("bisporus", "bitorquis", "campestris", "crocodilinus", "agaricus", + "armillaria", "matsutake", "mellea", "ponderosa", "auricularia", "auricala", + "polytricha", "boletus", "badius", "edulis", "mirabilis", "zelleri", + "calvatia", "gigantea", "clitopilis", "prumulus", "entoloma", "abortivum", + "suillus", "tuber", "aestivum", "volvacea", "delica", "russula", "rozites") + + possible_prefixes |= list("butter", "shad", "sugar", "june", "wild", "rigus", "curry", "hard", "soft", "dark", "brick", "stone", "red", "brown", + "black", "white", "paper", "slippery", "honey", "bitter") + prefix = pick(possible_prefixes) + + var/num = rand(2,5) + var/list/possible_name = list("rhon", "cus", "quam", "met", "eget", "was", "reg", "zor", "fra", "rat", "sho", "ghen", "pa", + "eir", "lip", "sum", "lor", "em", "tem", "por", "invi", "dunt", "ut", "la", "bore", "mag", "na", + "al", "i", "qu", "yam", "er", "at", "sed", "di", "am", "vol", "up", "tua", "at", "ve", "ro", "eos", + "et", "ac", "cus") + for(var/i in 1 to num) + var/syl = pick(possible_name) + possible_name -= syl + name += syl + + if(prefix) + name = "[prefix] [name]" + seed_name = name + display_name = name + //Creates a random seed. MAKE SURE THE LINE HAS DIVERGED BEFORE THIS IS CALLED. /datum/seed/proc/randomize() roundstart = 0 - seed_name = "strange plant" // TODO: name generator. - display_name = "strange plants" // TODO: name generator. mysterious = 1 seed_noun = pick("spores","nodes","cuttings","seeds") @@ -390,49 +428,18 @@ var/additional_chems = rand(0,5) if(additional_chems) - var/list/possible_chems = list( - "woodpulp", - "bicaridine", - "hyperzine", - "cryoxadone", - "blood", - "water", - "potassium", - "plasticide", - "mutationtoxin", - "docilitytoxin", - "inaprovaline", - "space_drugs", - "paroxetine", - "mercury", - "sugar", - "radium", - "ryetalyn", - "alkysine", - "thermite", - "tramadol", - "cryptobiolin", - "dermaline", - "dexalin", - "phoron", - "synaptizine", - "impedrezene", - "hyronalin", - "peridaxon", - "toxin", - "rezadone", - "ethylredoxrazine", - "slimejelly", - "cyanide", - "mindbreaker", - "stoxin" + + var/list/banned_chems = list( + "adminordrazine", + "nutriment" ) for(var/x=1;x<=additional_chems;x++) - if(!possible_chems.len) - break - var/new_chem = pick(possible_chems) - possible_chems -= new_chem + + var/new_chem = pick(chemical_reagents_list) + if(new_chem in banned_chems) + continue + banned_chems += new_chem chems[new_chem] = list(rand(1,10),rand(10,20)) if(prob(90)) @@ -487,6 +494,8 @@ set_trait(TRAIT_MATURATION,rand(5,15)) set_trait(TRAIT_PRODUCTION,get_trait(TRAIT_MATURATION)+rand(2,5)) + generate_name() + //Returns a key corresponding to an entry in the global seed list. /datum/seed/proc/get_mutant_variant() if(!mutants || !mutants.len || get_trait(TRAIT_IMMUTABLE) > 0) return 0 diff --git a/code/modules/hydroponics/trays/tray_reagents.dm b/code/modules/hydroponics/trays/tray_reagents.dm index 818bbd3b15f..ba2013812ab 100644 --- a/code/modules/hydroponics/trays/tray_reagents.dm +++ b/code/modules/hydroponics/trays/tray_reagents.dm @@ -48,20 +48,6 @@ toxicity = 8 pest_kill_str = 7 -/obj/item/weapon/material/minihoe // -- Numbers - name = "mini hoe" - desc = "It's used for removing weeds or scratching your back." - icon = 'icons/obj/weapons.dmi' - icon_state = "hoe" - item_state = "hoe" - flags = CONDUCT | NOBLUDGEON - force = 5.0 - throwforce = 7.0 - w_class = 2.0 - matter = list(DEFAULT_WALL_MATERIAL = 50) - attack_verb = list("slashed", "sliced", "cut", "clawed") - - // ************************************* // Weedkiller defines for hydroponics // ************************************* @@ -92,4 +78,4 @@ icon = 'icons/obj/chemical.dmi' icon_state = "bottle15" toxicity = 8 - weed_kill_str = 7 \ No newline at end of file + weed_kill_str = 7 diff --git a/code/modules/hydroponics/trays/tray_update_icons.dm b/code/modules/hydroponics/trays/tray_update_icons.dm index dc69e5448ee..47e6b82ba64 100644 --- a/code/modules/hydroponics/trays/tray_update_icons.dm +++ b/code/modules/hydroponics/trays/tray_update_icons.dm @@ -3,7 +3,7 @@ // Update name. if(seed) if(mechanical) - name = "[base_name] (#[seed.uid])" + name = "[base_name] ([seed.seed_name])" else name = "[seed.seed_name]" else diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 3dbb74d9335..ba96ada8b7f 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -256,6 +256,7 @@ user.visible_message("You open up the book and show it to [M]. ", \ " [user] opens up a book and shows it to [M]. ") M << browse("Penned by [author].
" + "[dat]", "window=book") + user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam /* diff --git a/code/modules/lighting/lighting_process.dm b/code/modules/lighting/lighting_process.dm index 1c8361dbaf6..055e366337b 100644 --- a/code/modules/lighting/lighting_process.dm +++ b/code/modules/lighting/lighting_process.dm @@ -22,7 +22,7 @@ L.force_update = 0 L.needs_update = 0 - scheck() + SCHECK var/list/lighting_update_overlays_old = lighting_update_overlays //Same as above. lighting_update_overlays = null //Same as above @@ -32,4 +32,4 @@ O.update_overlay() O.needs_update = 0 - scheck() + SCHECK diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index cf83cef983a..aebcacc91bb 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -17,6 +17,7 @@ recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") + recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") if(hardness>50) recipes += new/datum/stack_recipe("[display_name] fork", /obj/item/weapon/material/kitchen/utensil/fork/plastic, 1, on_floor = 1, supplied_material = "[name]") diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index a7c4384f4fa..2119896c3f5 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -43,7 +43,7 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images "Bland" = "ghost", "Robed-B" = "ghost1", "Robed-BAlt" = "ghost2", - "Corgi" = "ghostian", + "Corgi" = "corgi", "King" = "ghostking", "Shade" = "shade", "Hecate" = "ghost-narsie", @@ -65,7 +65,15 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images "Pink Elemental" = "magicPink", "Orange Elemental" = "magicOrange", "Green Elemental" = "magicGreen", - "Daemon" = "daemon" + "Daemon" = "daemon", + "Guard Spider" = "guard", + "Hunter Spider" = "hunter", + "Nurse Spider" = "nurse", + "Carp" = "carp", + "Space Bear" = "bear", + "Rogue Drone" = "drone", + "ED-209" = "ed209", + "Beepsky" = "secbot" ) /mob/observer/dead/New(mob/body) @@ -817,6 +825,7 @@ mob/observer/dead/MayRespawn(var/feedback = 0) set name = "Choose Sprite" icon = 'icons/mob/ghost.dmi' + overlays.Cut() var/choice var/finalized = "No" while(finalized == "No" && src.client) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 9d979787c5b..ad71cebe1f6 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -233,3 +233,8 @@ var/list/slot_equipment_priority = list( \ //if(hasvar(src,"r_hand")) if(src:r_hand) items += src:r_hand return items + +/mob/proc/delete_inventory() + for(var/entry in get_equipped_items()) + drop_from_inventory(entry) + qdel(entry) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index 5679cc1a461..0ad82ae384e 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -268,9 +268,6 @@ /mob/living/bot/proc/explode() qdel(src) -/mob/living/bot/attack_throat() - return - /******************************************************************/ // Navigation procs // Used for A-star pathfinding @@ -337,3 +334,4 @@ //if((dir & EAST ) && (D.dir & (NORTH|SOUTH))) return !D.check_access(ID) else return !D.check_access(ID) // it's a real, air blocking door return 0 + diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index c065cbdc54d..c61659261de 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -74,6 +74,7 @@ /obj/item/device/mmi/digital/posibrain/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer. if(src.brainmob && src.brainmob.key) return + world.log << "Resetting Posibrain: [brainmob][brainmob ? ", [brainmob.key]" : ""]" src.searching = 0 icon_state = "posibrain" diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm new file mode 100644 index 00000000000..dd9e4f28b9b --- /dev/null +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -0,0 +1,98 @@ + +//Called when the mob is hit with an item in combat. +/mob/living/carbon/resolve_item_attack(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) + if(check_attack_throat(I, user)) + return null + ..() + +/mob/living/carbon/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/hit_zone) + if(!effective_force || blocked >= 100) + return 0 + + //Hulk modifier + if(HULK in user.mutations) + effective_force *= 2 + + //Apply weapon damage + var/weapon_sharp = is_sharp(I) + var/weapon_edge = has_edge(I) + if(prob(getarmor(hit_zone, "melee"))) //melee armour provides a chance to turn sharp/edge weapon attacks into blunt ones + weapon_sharp = 0 + weapon_edge = 0 + + apply_damage(effective_force, I.damtype, hit_zone, blocked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I) + + //Melee weapon embedded object code. + if (I && I.damtype == BRUTE && !I.anchored && !is_robot_module(I)) + var/damage = effective_force + if (blocked) + damage *= (100 - blocked)/100 + + //blunt objects should really not be embedding in things unless a huge amount of force is involved + var/embed_chance = weapon_sharp? damage/I.w_class : damage/(I.w_class*3) + var/embed_threshold = weapon_sharp? 5*I.w_class : 15*I.w_class + + //Sharp objects will always embed if they do enough damage. + if((weapon_sharp && damage > (10*I.w_class)) || (damage > embed_threshold && prob(embed_chance))) + src.embed(I, hit_zone) + + return 1 + +// Attacking someone with a weapon while they are neck-grabbed +/mob/living/carbon/proc/check_attack_throat(obj/item/W, mob/user) + if(user.a_intent == I_HURT) + for(var/obj/item/weapon/grab/G in src.grabbed_by) + if(G.assailant == user && G.state >= GRAB_NECK) + if(attack_throat(W, G, user)) + return 1 + return 0 + +// Knifing +/mob/living/carbon/proc/attack_throat(obj/item/W, obj/item/weapon/grab/G, mob/user) + + if(!W.edge || !W.force || W.damtype != BRUTE) + return 0 //unsuitable weapon + + user.visible_message("\The [user] begins to slit [src]'s throat with \the [W]!") + + user.next_move = world.time + 20 //also should prevent user from triggering this repeatedly + if(!do_after(user, 20)) + return 0 + if(!(G && G.assailant == user && G.affecting == src)) //check that we still have a grab + return 0 + + var/damage_mod = 1 + //presumably, if they are wearing a helmet that stops pressure effects, then it probably covers the throat as well + var/obj/item/clothing/head/helmet = get_equipped_item(slot_head) + if(istype(helmet) && (helmet.body_parts_covered & HEAD) && (helmet.flags & STOPPRESSUREDAMAGE)) + //we don't do an armor_check here because this is not an impact effect like a weapon swung with momentum, that either penetrates or glances off. + damage_mod = 1.0 - (helmet.armor["melee"]/100) + + var/total_damage = 0 + for(var/i in 1 to 3) + var/damage = min(W.force*1.5, 20)*damage_mod + apply_damage(damage, W.damtype, "head", 0, sharp=W.sharp, edge=W.edge) + total_damage += damage + + var/oxyloss = total_damage + if(total_damage >= 40) //threshold to make someone pass out + oxyloss = 60 // Brain lacks oxygen immediately, pass out + + adjustOxyLoss(min(oxyloss, 100 - getOxyLoss())) //don't put them over 100 oxyloss + + if(total_damage) + if(oxyloss >= 40) + user.visible_message("\The [user] slit [src]'s throat open with \the [W]!") + else + user.visible_message("\The [user] cut [src]'s neck with \the [W]!") + + if(W.hitsound) + playsound(loc, W.hitsound, 50, 1, -1) + + G.last_action = world.time + flick(G.hud.icon_state, G.hud) + + user.attack_log += "\[[time_stamp()]\] Knifed [name] ([ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" + src.attack_log += "\[[time_stamp()]\] Got knifed by [user.name] ([user.ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" + msg_admin_attack("[key_name(user)] knifed [key_name(src)] with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" ) + return 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 6a45483251f..8cb9cca614f 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -36,12 +36,13 @@ animate_tail_stop() //Handle brain slugs. - var/obj/item/organ/external/head = get_organ(BP_HEAD) + var/obj/item/organ/external/Hd = get_organ(BP_HEAD) var/mob/living/simple_animal/borer/B - for(var/I in head.implants) - if(istype(I,/mob/living/simple_animal/borer)) - B = I + if(Hd) + for(var/I in Hd.implants) + if(istype(I,/mob/living/simple_animal/borer)) + B = I if(B) if(!B.ckey && ckey && B.controlling) B.ckey = ckey diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index de3764e5af3..53d12e8b7de 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -4,26 +4,69 @@ var/skipjumpsuit = 0 var/skipshoes = 0 var/skipmask = 0 + var/skipears = 0 var/skipeyes = 0 var/skipface = 0 + var/skipchest = 0 + var/skipgroin = 0 + var/skiphands = 0 + var/skiplegs = 0 + var/skiparms = 0 + var/skipfeet = 0 + + var/looks_synth = looksSynthetic() //exosuits and helmets obscure our view and stuff. if(wear_suit) - skipgloves = wear_suit.flags_inv & HIDEGLOVES - skipsuitstorage = wear_suit.flags_inv & HIDESUITSTORAGE - skipjumpsuit = wear_suit.flags_inv & HIDEJUMPSUIT - skipshoes = wear_suit.flags_inv & HIDESHOES + skipsuitstorage |= wear_suit.flags_inv & HIDESUITSTORAGE + if(wear_suit.flags_inv & HIDEJUMPSUIT) + skiparms |= 1 + skiplegs |= 1 + skipchest |= 1 + skipgroin |= 1 + if(wear_suit.flags_inv & HIDESHOES) + skipshoes |= 1 + skipfeet |= 1 + if(wear_suit.flags_inv & HIDEGLOVES) + skipgloves |= 1 + skiphands |= 1 + + if(w_uniform) + skiplegs |= w_uniform.body_parts_covered & LEGS + skiparms |= w_uniform.body_parts_covered & ARMS + skipchest |= w_uniform.body_parts_covered & UPPER_TORSO + skipgroin |= w_uniform.body_parts_covered & LOWER_TORSO + + if(gloves) + skiphands |= gloves.body_parts_covered & HANDS + + if(shoes) + skipfeet |= shoes.body_parts_covered & FEET if(head) - skipmask = head.flags_inv & HIDEMASK - skipeyes = head.flags_inv & HIDEEYES - skipears = head.flags_inv & HIDEEARS - skipface = head.flags_inv & HIDEFACE + skipmask |= head.flags_inv & HIDEMASK + skipeyes |= head.flags_inv & HIDEEYES + skipears |= head.flags_inv & HIDEEARS + skipface |= head.flags_inv & HIDEFACE if(wear_mask) skipface |= wear_mask.flags_inv & HIDEFACE + //This is what hides what + var/list/hidden = list( + BP_GROIN = skipgroin, + BP_TORSO = skipchest, + BP_HEAD = skipface, + BP_L_ARM = skiparms, + BP_R_ARM = skiparms, + BP_L_HAND= skiphands, + BP_R_HAND= skiphands, + BP_L_FOOT= skipfeet, + BP_R_FOOT= skipfeet, + BP_L_LEG = skiplegs, + BP_R_LEG = skiplegs) + var/msg = "*---------*\nThis is " var/datum/gender/T = gender_datums[get_gender()] @@ -39,9 +82,8 @@ msg += "[src.name]" - var/is_synth = isSynthetic() if(!(skipjumpsuit && skipface)) - if(is_synth) + if(looks_synth) var/use_gender = "a synthetic" if(gender == MALE) use_gender = "an android" @@ -124,8 +166,6 @@ else if(blood_DNA) msg += "[T.He] [T.has] [(hand_blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained hands!\n" - //handcuffed? - //handcuffed? if(handcuffed) if(istype(handcuffed, /obj/item/weapon/handcuffs/cable)) @@ -273,14 +313,16 @@ for(var/obj/item/organ/external/temp in organs) if(temp) + if((temp.organ_tag in hidden) && hidden[temp.organ_tag]) + continue //Organ is hidden, don't talk about it if(temp.status & ORGAN_DESTROYED) wound_flavor_text["[temp.name]"] = "[T.He] [T.is] missing [T.his] [temp.name].\n" continue - if(!is_synth && temp.robotic >= ORGAN_ROBOT) + if(!looks_synth && temp.robotic == ORGAN_ROBOT) if(!(temp.brute_dam + temp.burn_dam)) wound_flavor_text["[temp.name]"] = "[T.He] [T.has] a [temp.name].\n" else - wound_flavor_text["[temp.name]"] = "[T.He] [T.has] a [temp.name]. It has [temp.get_wounds_desc()]!\n" + wound_flavor_text["[temp.name]"] = "[T.He] [T.has] a [temp.name] with [temp.get_wounds_desc()]!\n" continue else if(temp.wounds.len > 0 || temp.open) if(temp.is_stump() && temp.parent_organ && organs_by_name[temp.parent_organ]) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b5ea7931c10..99a4c40ebd7 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -56,8 +56,8 @@ /mob/living/carbon/human/Stat() ..() if(statpanel("Status")) - stat(null, "Intent: [a_intent]") - stat(null, "Move Mode: [m_intent]") + stat("Intent:", "[a_intent]") + stat("Move Mode:", "[m_intent]") if(emergency_shuttle) var/eta_status = emergency_shuttle.get_status_panel_eta() if(eta_status) @@ -1140,8 +1140,6 @@ qdel(hud_used) hud_used = new /datum/hud(src) - full_prosthetic = null - if(species) return 1 else diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 56a47f918b3..7cc3156f189 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -310,23 +310,6 @@ updatehealth() return 1 -/mob/living/carbon/human/proc/attack_joint(var/obj/item/W, var/mob/living/user, var/def_zone) - if(!def_zone) def_zone = user.zone_sel.selecting - var/target_zone = get_zone_with_miss_chance(check_zone(def_zone), src) - - if(user == src) // Attacking yourself can't miss - target_zone = user.zone_sel.selecting - if(!target_zone) - return null - var/obj/item/organ/external/organ = get_organ(check_zone(target_zone)) - if(!organ || (organ.dislocated == 2) || (organ.dislocated == -1)) - return null - var/dislocation_str - if(prob(W.force)) - dislocation_str = "[src]'s [organ.joint] [pick("gives way","caves in","crumbles","collapses")]!" - organ.dislocate(1) - return dislocation_str - //Used to attack a joint through grabbing /mob/living/carbon/human/proc/grab_joint(var/mob/living/user, var/def_zone) var/has_grab = 0 diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 69b57ed74f0..614bbe1de8c 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -139,67 +139,73 @@ emp_act if(.) return return 0 -//Returns 1 if the attack hit, 0 if it missed. -/mob/living/carbon/human/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone) - if(!I || !user) return 0 +/mob/living/carbon/human/emp_act(severity) + for(var/obj/O in src) + if(!O) continue + O.emp_act(severity) + ..() - var/target_zone = def_zone? check_zone(def_zone) : get_zone_with_miss_chance(user.zone_sel.selecting, src) +/mob/living/carbon/human/resolve_item_attack(obj/item/I, mob/living/user, var/target_zone) + if(check_attack_throat(I, user)) + return null if(user == src) // Attacking yourself can't miss - target_zone = user.zone_sel.selecting - if(!target_zone) - visible_message("[user] misses [src] with \the [I]!") - return 0 + return target_zone - var/obj/item/organ/external/affecting = get_organ(target_zone) + var/hit_zone = get_zone_with_miss_chance(target_zone, src) + if(!hit_zone) + visible_message("\The [user] misses [src] with \the [I]!") + return null + + if(check_shields(I.force, I, user, target_zone, "the [I.name]")) + return + + var/obj/item/organ/external/affecting = get_organ(hit_zone) if (!affecting || affecting.is_stump()) user << "They are missing that limb!" + return null + + return hit_zone + +/mob/living/carbon/human/hit_with_weapon(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) + var/obj/item/organ/external/affecting = get_organ(hit_zone) + if(!affecting) + return //should be prevented by attacked_with_item() but for sanity. + + visible_message("[src] has been [I.attack_verb.len? pick(I.attack_verb) : "attacked"] in the [affecting.name] with [I.name] by [user]!") + + var/blocked = run_armor_check(hit_zone, "melee", I.armor_penetration, "Your armor has protected your [affecting.name].", "Your armor has softened the blow to your [affecting.name].") + standard_weapon_hit_effects(I, user, effective_force, blocked, hit_zone) + + return blocked + +/mob/living/carbon/human/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/hit_zone) + var/obj/item/organ/external/affecting = get_organ(hit_zone) + if(!affecting) return 0 - var/effective_force = I.force - if(user.a_intent == "disarm") effective_force = round(I.force/2) - var/hit_area = affecting.name - - if((user != src) && check_shields(effective_force, I, user, target_zone, "the [I.name]")) - return 0 - - if(istype(I,/obj/item/weapon/card/emag)) - if(!(affecting.robotic >= ORGAN_ROBOT)) - user << "\red That limb isn't robotic." - return - if(affecting.sabotaged) - user << "\red [src]'s [affecting.name] is already sabotaged!" + // Handle striking to cripple. + if(user.a_intent == I_DISARM) + effective_force /= 2 + if(..(I, user, effective_force, blocked, hit_zone)) + attack_joint(affecting, I, blocked) else - user << "\red You sneakily slide [I] into the dataport on [src]'s [affecting.name] and short out the safeties." - var/obj/item/weapon/card/emag/emag = I - emag.uses-- - affecting.sabotaged = 1 - return 1 + return 0 + else if(!..()) + return 0 - if(I.attack_verb.len) - visible_message("\red [src] has been [pick(I.attack_verb)] in the [hit_area] with [I.name] by [user]!") - else - visible_message("\red [src] has been attacked in the [hit_area] with [I.name] by [user]!") + if(effective_force > 10 || effective_force >= 5 && prob(33)) + forcesay(hit_appends) //forcesay checks stat already - var/armor = run_armor_check(affecting, "melee", I.armor_penetration, "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") - var/weapon_sharp = is_sharp(I) - var/weapon_edge = has_edge(I) - if ((weapon_sharp || weapon_edge) && prob(getarmor(target_zone, "melee"))) - weapon_sharp = 0 - weapon_edge = 0 + if(prob(25 + (effective_force * 2))) + if(!((I.damtype == BRUTE) || (I.damtype == HALLOSS))) + return - if(armor >= 100) return 0 - if(!effective_force) return 0 - var/Iforce = effective_force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords) + if(!(I.flags & NOBLOODY)) + I.add_blood(src) - apply_damage(effective_force, I.damtype, affecting, armor, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I) - - var/bloody = 0 - if(((I.damtype == BRUTE) || (I.damtype == HALLOSS)) && prob(25 + (effective_force * 2))) - I.add_blood(src) //Make the weapon bloody, not the person. -// if(user.hand) user.update_inv_l_hand() //updates the attacker's overlay for the (now bloodied) weapon -// else user.update_inv_r_hand() //removed because weapons don't have on-mob blood overlays + var/bloody = 0 if(prob(33)) bloody = 1 var/turf/location = loc @@ -212,49 +218,49 @@ emp_act H.bloody_hands(src) if(!stat) - if(headcheck(hit_area)) - //Harder to score a stun but if you do it lasts a bit longer - if(prob(effective_force)) - apply_effect(20, PARALYZE, armor) - visible_message("[src] [species.get_knockout_message(src)]") - else - //Easier to score a stun but lasts less time - if(prob(effective_force + 10)) - apply_effect(6, WEAKEN, armor) - visible_message("[src] has been knocked down!") + switch(hit_zone) + if("head")//Harder to score a stun but if you do it lasts a bit longer + if(prob(effective_force)) + apply_effect(20, PARALYZE, blocked) + visible_message("\The [src] has been knocked unconscious!") + if(bloody)//Apply blood + if(wear_mask) + wear_mask.add_blood(src) + update_inv_wear_mask(0) + if(head) + head.add_blood(src) + update_inv_head(0) + if(glasses && prob(33)) + glasses.add_blood(src) + update_inv_glasses(0) + if("chest")//Easier to score a stun but lasts less time + if(prob(effective_force + 10)) + apply_effect(6, WEAKEN, blocked) + visible_message("\The [src] has been knocked down!") + if(bloody) + bloody_body(src) - //Apply blood - if(bloody) - switch(hit_area) - if(BP_HEAD) - if(wear_mask) - wear_mask.add_blood(src) - update_inv_wear_mask(0) - if(head) - head.add_blood(src) - update_inv_head(0) - if(glasses && prob(33)) - glasses.add_blood(src) - update_inv_glasses(0) - if(BP_TORSO) - bloody_body(src) + return 1 - if(Iforce > 10 || Iforce >= 5 && prob(33)) - forcesay(hit_appends) //forcesay checks stat already +/mob/living/carbon/human/proc/attack_joint(var/obj/item/organ/external/organ, var/obj/item/W, var/blocked) + if(!organ || (organ.dislocated == 2) || (organ.dislocated == -1) || blocked >= 100) + return 0 + if(prob(W.force * (100 - blocked)/100)) + visible_message("[src]'s [organ.joint] [pick("gives way","caves in","crumbles","collapses")]!") + organ.dislocate(1) + return 1 + return 0 - //Melee weapon embedded object code. - if (I && I.damtype == BRUTE && !I.anchored && !is_robot_module(I)) - var/damage = effective_force - if (armor) - damage /= armor+1 - - //blunt objects should really not be embedding in things unless a huge amount of force is involved - var/embed_chance = weapon_sharp? damage/I.w_class : damage/(I.w_class*3) - var/embed_threshold = weapon_sharp? 5*I.w_class : 15*I.w_class - - //Sharp objects will always embed if they do enough damage. - if((weapon_sharp && damage > (10*I.w_class)) || (damage > embed_threshold && prob(embed_chance))) - affecting.embed(I) +/mob/living/carbon/human/emag_act(var/remaining_charges, mob/user, var/emag_source) + var/obj/item/organ/external/affecting = get_organ(user.zone_sel.selecting) + if(!affecting || !(affecting.status & ORGAN_ROBOT)) + user << "That limb isn't robotic." + return -1 + if(affecting.sabotaged) + user << "[src]'s [affecting.name] is already sabotaged!" + return -1 + user << "You sneakily slide [emag_source] into the dataport on [src]'s [affecting.name] and short out the safeties." + affecting.sabotaged = 1 return 1 //this proc handles being hit by a thrown atom diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 390e7ee6c5f..13f4f2f25a2 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -31,11 +31,10 @@ var/age = 30 //Player's age (pure fluff) var/b_type = "A+" //Player's bloodtype + var/synthetic //If they are a synthetic (aka synthetic torso) - var/underwear_top = 1 //Which underwear the player wants - var/underwear_bottom = 1 - var/undershirt = 0 //Which undershirt the player wants. - var/socks = 0 //Which socks the player wants. + var/list/all_underwear = list() + var/list/all_underwear_metadata = list() var/backbag = 2 //Which backpack type the player has chosen. Nothing, Satchel or Backpack. var/pdachoice = 1 //Which PDA type the player has chosen. Default, Slim, or Old. @@ -83,7 +82,6 @@ var/list/flavor_texts = list() var/gunshot_residue var/pulling_punches // Are you trying not to hurt your opponent? - var/full_prosthetic // We are a robutt. var/robolimb_count = 0 // Number of robot limbs. mob_bump_flag = HUMAN diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index df8eead14ec..7682f675b08 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -58,6 +58,38 @@ /mob/living/carbon/human/get_gender() return identifying_gender ? identifying_gender : gender +// This is the 'mechanical' check for synthetic-ness, not appearance +// Returns the company that made the synthetic +/mob/living/carbon/human/isSynthetic() + if(synthetic) return synthetic //Your synthetic-ness is not going away + var/obj/item/organ/external/T = organs_by_name[BP_TORSO] + if(T && T.robotic >= ORGAN_ROBOT) + src.verbs += /mob/living/carbon/human/proc/self_diagnostics + var/datum/robolimb/R = all_robolimbs[T.model] + synthetic = R + return synthetic + + return 0 + +// Would an onlooker know this person is synthetic? +// Based on sort of logical reasoning, 'Look at head, look at torso' +/mob/living/carbon/human/proc/looksSynthetic() + var/obj/item/organ/external/T = organs_by_name[BP_TORSO] + var/obj/item/organ/external/H = organs_by_name[BP_HEAD] + + //Look at their head + if(!head || !(head && (head.flags_inv & HIDEFACE))) + if(H && H.robotic == ORGAN_ROBOT) //Exactly robotic, not higher as lifelike is higher + return 1 + + //Look at their torso + if(!wear_suit || (wear_suit && !(wear_suit.flags_inv & HIDEJUMPSUIT))) + if(!w_uniform || (w_uniform && !(w_uniform.body_parts_covered & UPPER_TORSO))) + if(T && T.robotic == ORGAN_ROBOT) + return 1 + + return 0 + #undef HUMAN_EATING_NO_ISSUE #undef HUMAN_EATING_NO_MOUTH #undef HUMAN_EATING_BLOCKED_MOUTH diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index 48b668a5015..948f3382978 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -145,4 +145,27 @@ qdel(src) +/mob/living/carbon/human/proc/self_diagnostics() + set name = "Self-Diagnostics" + set desc = "Run an internal self-diagnostic to check for damage." + set category = "IC" + if(stat == DEAD) return + + src << "Performing self-diagnostic, please wait..." + sleep(50) + var/output = "Self-Diagnostic Results:\n" + + for(var/obj/item/organ/external/EO in organs) + if(EO.brute_dam || EO.burn_dam) + output += "[EO.name] - [EO.burn_dam + EO.brute_dam > ROBOLIMB_REPAIR_CAP ? "Heavy Damage" : "Light Damage"]\n" + else + output += "[EO.name] - OK\n" + + for(var/obj/item/organ/IO in internal_organs) + if(IO.damage) + output += "[IO.name] - [IO.damage > 10 ? "Heavy Damage" : "Light Damage"]\n" + else + output += "[IO.name] - OK\n" + + src << output diff --git a/code/modules/mob/living/carbon/human/human_species.dm b/code/modules/mob/living/carbon/human/human_species.dm index 4aad06fd7ae..ea1afb157fb 100644 --- a/code/modules/mob/living/carbon/human/human_species.dm +++ b/code/modules/mob/living/carbon/human/human_species.dm @@ -2,6 +2,13 @@ real_name = "Test Dummy" status_flags = GODMODE|CANPUSH +/mob/living/carbon/human/dummy/mannequin/New() + ..() + mob_list -= src + living_mob_list -= src + dead_mob_list -= src + delete_inventory() + /mob/living/carbon/human/skrell/New(var/new_loc) h_style = "Skrell Male Tentacles" ..(new_loc, "Skrell") diff --git a/code/modules/mob/living/carbon/human/species/species_getters.dm b/code/modules/mob/living/carbon/human/species/species_getters.dm index 625d5559433..efb053eddfe 100644 --- a/code/modules/mob/living/carbon/human/species/species_getters.dm +++ b/code/modules/mob/living/carbon/human/species/species_getters.dm @@ -47,10 +47,19 @@ return "no message" /datum/species/proc/get_ssd(var/mob/living/carbon/human/H) - return ((H && H.isSynthetic()) ? "flashing a 'system offline' glyph on their monitor" : show_ssd) + if(H) + if(H.looksSynthetic()) + return "flashing a 'system offline' light" + else + return show_ssd /datum/species/proc/get_blood_colour(var/mob/living/carbon/human/H) - return ((H && H.isSynthetic()) ? SYNTH_BLOOD_COLOUR : blood_color) + if(H) + var/datum/robolimb/company = H.isSynthetic() + if(company) + return company.blood_color + else + return blood_color /datum/species/proc/get_virus_immune(var/mob/living/carbon/human/H) return ((H && H.isSynthetic()) ? 1 : virus_immune) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 088c796f289..43123eab0a0 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -109,29 +109,30 @@ Please contact me on #coderbus IRC. ~Carn x #define MUTATIONS_LAYER 1 #define DAMAGE_LAYER 2 #define SURGERY_LEVEL 3 //bs12 specific. -#define UNIFORM_LAYER 4 -#define ID_LAYER 5 -#define SHOES_LAYER 6 -#define GLOVES_LAYER 7 -#define BELT_LAYER 8 -#define SUIT_LAYER 9 -#define TAIL_LAYER 10 //bs12 specific. this hack is probably gonna come back to haunt me -#define GLASSES_LAYER 11 -#define BELT_LAYER_ALT 12 -#define SUIT_STORE_LAYER 13 -#define BACK_LAYER 14 -#define HAIR_LAYER 15 //TODO: make part of head layer? -#define EARS_LAYER 16 -#define FACEMASK_LAYER 17 -#define HEAD_LAYER 18 -#define COLLAR_LAYER 19 -#define HANDCUFF_LAYER 20 -#define LEGCUFF_LAYER 21 -#define L_HAND_LAYER 22 -#define R_HAND_LAYER 23 -#define FIRE_LAYER 24 //If you're on fire -#define TARGETED_LAYER 25 //BS12: Layer for the target overlay from weapon targeting system -#define TOTAL_LAYERS 25 +#define UNDERWEAR_LAYER 4 +#define UNIFORM_LAYER 5 +#define ID_LAYER 6 +#define SHOES_LAYER 7 +#define GLOVES_LAYER 8 +#define BELT_LAYER 9 +#define SUIT_LAYER 10 +#define TAIL_LAYER 11 //bs12 specific. this hack is probably gonna come back to haunt me +#define GLASSES_LAYER 12 +#define BELT_LAYER_ALT 13 +#define SUIT_STORE_LAYER 14 +#define BACK_LAYER 15 +#define HAIR_LAYER 16 //TODO: make part of head layer? +#define EARS_LAYER 17 +#define FACEMASK_LAYER 18 +#define HEAD_LAYER 19 +#define COLLAR_LAYER 20 +#define HANDCUFF_LAYER 21 +#define LEGCUFF_LAYER 22 +#define L_HAND_LAYER 23 +#define R_HAND_LAYER 24 +#define FIRE_LAYER 25 //If you're on fire +#define TARGETED_LAYER 26 //BS12: Layer for the target overlay from weapon targeting system +#define TOTAL_LAYERS 26 ////////////////////////////////// /mob/living/carbon/human @@ -148,8 +149,12 @@ Please contact me on #coderbus IRC. ~Carn x if (icon_update) icon = stand_icon - for(var/image/I in overlays_standing) - overlays += I + for(var/entry in overlays_standing) + if(istype(entry, /image)) + overlays += entry + else if(istype(entry, /list)) + for(var/inner_entry in entry) + overlays += inner_entry if(lying && !species.prone_icon) //Only rotate them if we're not drawing a specific icon for being prone. var/matrix/M = matrix() @@ -220,6 +225,8 @@ var/global/list/damage_icon_parts = list() var/hulk = (HULK in src.mutations) var/skeleton = (SKELETON in src.mutations) + robolimb_count = 0 + //CACHING: Generate an index key from visible bodyparts. //0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic. @@ -249,6 +256,7 @@ var/global/list/damage_icon_parts = list() icon_key += "0" else if(part.robotic >= ORGAN_ROBOT) icon_key += "2[part.model ? "-[part.model]": ""]" + robolimb_count++ else if(part.status & ORGAN_DEAD) icon_key += "3" else @@ -315,24 +323,24 @@ var/global/list/damage_icon_parts = list() //END CACHED ICON GENERATION. stand_icon.Blend(base_icon,ICON_OVERLAY) - //Underwear - if(underwear_top && species.appearance_flags & HAS_UNDERWEAR) - stand_icon.Blend(new /icon('icons/mob/human.dmi', underwear_top), ICON_OVERLAY) - if(underwear_bottom && species.appearance_flags & HAS_UNDERWEAR) - stand_icon.Blend(new /icon('icons/mob/human.dmi', underwear_bottom), ICON_OVERLAY) - - if(undershirt && species.appearance_flags & HAS_UNDERWEAR) - stand_icon.Blend(new /icon('icons/mob/human.dmi', undershirt), ICON_OVERLAY) - - if(socks && species.appearance_flags & HAS_UNDERWEAR) - stand_icon.Blend(new /icon('icons/mob/human.dmi', socks), ICON_OVERLAY) - if(update_icons) update_icons() //tail update_tail_showing(0) +//UNDERWEAR OVERLAY +/mob/living/carbon/human/proc/update_underwear(var/update_icons=1) + overlays_standing[UNDERWEAR_LAYER] = null + + if(species.appearance_flags & HAS_UNDERWEAR) + overlays_standing[UNDERWEAR_LAYER] = list() + for(var/category in all_underwear) + var/datum/category_item/underwear/UWI = all_underwear[category] + overlays_standing[UNDERWEAR_LAYER] += UWI.generate_image(all_underwear_metadata[category]) + + if(update_icons) update_icons() + //HAIR OVERLAY /mob/living/carbon/human/proc/update_hair(var/update_icons=1) //Reset our hair @@ -427,6 +435,7 @@ var/global/list/damage_icon_parts = list() update_mutations(0) update_body(0) + update_underwear(0) update_hair(0) update_inv_w_uniform(0) update_inv_wear_id(0) @@ -596,7 +605,7 @@ var/global/list/damage_icon_parts = list() standing = image("icon" = 'icons/mob/ears.dmi', "icon_state" = "[t_type]") standing.color = l_ear.color both.overlays += standing - + if(r_ear) var/image/standing var/t_type = r_ear.icon_state @@ -610,7 +619,7 @@ var/global/list/damage_icon_parts = list() standing = image("icon" = 'icons/mob/ears.dmi', "icon_state" = "[t_type]") standing.color = r_ear.color both.overlays += standing - + overlays_standing[EARS_LAYER] = both else diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 3966f60a209..9c374685546 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -144,6 +144,42 @@ O.emp_act(severity) ..() +/mob/living/proc/resolve_item_attack(obj/item/I, mob/living/user, var/target_zone) + return target_zone + +//Called when the mob is hit with an item in combat. Returns the blocked result +/mob/living/proc/hit_with_weapon(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) + visible_message("[src] has been [I.attack_verb.len? pick(I.attack_verb) : "attacked"] with [I.name] by [user]!") + + var/blocked = run_armor_check(hit_zone, "melee") + standard_weapon_hit_effects(I, user, effective_force, blocked, hit_zone) + + if(I.damtype == BRUTE && prob(33)) // Added blood for whacking non-humans too + var/turf/simulated/location = get_turf(src) + if(istype(location)) location.add_blood_floor(src) + + return blocked + +//returns 0 if the effects failed to apply for some reason, 1 otherwise. +/mob/living/proc/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/hit_zone) + if(!effective_force || blocked >= 100) + return 0 + + //Hulk modifier + if(HULK in user.mutations) + effective_force *= 2 + + //Apply weapon damage + var/weapon_sharp = is_sharp(I) + var/weapon_edge = has_edge(I) + if(prob(max(getarmor(hit_zone, "melee") - I.armor_penetration, 0))) //melee armour provides a chance to turn sharp/edge weapon attacks into blunt ones + weapon_sharp = 0 + weapon_edge = 0 + + apply_damage(effective_force, I.damtype, hit_zone, blocked, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I) + + return 1 + //this proc handles being hit by a thrown atom /mob/living/hitby(atom/movable/AM as mob|obj,var/speed = THROWFORCE_SPEED_DIVISOR)//Standardization and logging -Sieve if(istype(AM,/obj/)) @@ -370,54 +406,3 @@ hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number+1) //hud_used.SetButtonCoords(hud_used.hide_actions_toggle,button_number+1) client.screen += hud_used.hide_actions_toggle - - -//If simple_animals are ever moved under carbon, then this can probably be moved to carbon as well -/mob/living/proc/attack_throat(obj/item/W, obj/item/weapon/grab/G, mob/user) - - // Knifing - if(!W.edge || !W.force || W.damtype != BRUTE) return //unsuitable weapon - - user.visible_message("\The [user] begins to slit [src]'s throat with \the [W]!") - - user.next_move = world.time + 20 //also should prevent user from triggering this repeatedly - if(!do_after(user, 20)) - return - if(!(G && G.assailant == user && G.affecting == src)) //check that we still have a grab - return - - var/damage_mod = 1 - //presumably, if they are wearing a helmet that stops pressure effects, then it probably covers the throat as well - var/obj/item/clothing/head/helmet = get_equipped_item(slot_head) - if(istype(helmet) && (helmet.body_parts_covered & HEAD) && (helmet.item_flags & STOPPRESSUREDAMAGE)) - //we don't do an armor_check here because this is not an impact effect like a weapon swung with momentum, that either penetrates or glances off. - damage_mod = 1.0 - (helmet.armor["melee"]/100) - - var/total_damage = 0 - for(var/i in 1 to 3) - var/damage = min(W.force*1.5, 20)*damage_mod - apply_damage(damage, W.damtype, BP_HEAD, 0, sharp=W.sharp, edge=W.edge) - total_damage += damage - - var/oxyloss = total_damage - if(total_damage >= 40) //threshold to make someone pass out - oxyloss = 60 // Brain lacks oxygen immediately, pass out - - adjustOxyLoss(min(oxyloss, 100 - getOxyLoss())) //don't put them over 100 oxyloss - - if(total_damage) - if(oxyloss >= 40) - user.visible_message("\The [user] slit [src]'s throat open with \the [W]!") - else - user.visible_message("\The [user] cut [src]'s neck with \the [W]!") - - if(W.hitsound) - playsound(loc, W.hitsound, 50, 1, -1) - - G.last_action = world.time - flick(G.hud.icon_state, G.hud) - - user.attack_log += "\[[time_stamp()]\] Knifed [name] ([ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" - src.attack_log += "\[[time_stamp()]\] Got knifed by [user.name] ([user.ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" - msg_admin_attack("[key_name(user)] knifed [key_name(src)] with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" ) - return diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 0d0a83b7d1a..d670e17ee3c 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -132,9 +132,6 @@ updatehealth() return 1*/ -/mob/living/silicon/attack_throat() - return - /proc/islinked(var/mob/living/silicon/robot/bot, var/mob/living/silicon/ai/ai) if(!istype(bot) || !istype(ai)) return 0 diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm index db6eb8f4b7f..394dd742acf 100644 --- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm @@ -130,7 +130,7 @@ return 0 else - attacked_with_item(O, user) + O.attack(src, user, user.zone_sel.selecting) /mob/living/simple_animal/spiderbot/emag_act(var/remaining_charges, var/mob/user) if (emagged) diff --git a/code/modules/mob/living/simple_animal/hostile/creature.dm b/code/modules/mob/living/simple_animal/hostile/creature.dm index af42c6ad2e3..b065a78ae94 100644 --- a/code/modules/mob/living/simple_animal/hostile/creature.dm +++ b/code/modules/mob/living/simple_animal/hostile/creature.dm @@ -6,15 +6,16 @@ icon_state = "otherthing" icon_living = "otherthing" icon_dead = "otherthing-dead" - health = 40 maxHealth = 40 + health = 40 + + harm_intent_damage = 8 melee_damage_lower = 5 melee_damage_upper = 5 attacktext = "chomped" attack_sound = 'sound/weapons/bite.ogg' faction = "creature" speed = 8 - harm_intent_damage = 10 /mob/living/simple_animal/hostile/creature/cult faction = "cult" @@ -37,3 +38,35 @@ /mob/living/simple_animal/hostile/creature/cult/Life() ..() check_horde() + + +/mob/living/simple_animal/hostile/creature/strong + maxHealth = 160 + health = 160 + + harm_intent_damage = 5 + melee_damage_lower = 8 + melee_damage_upper = 25 + + +/mob/living/simple_animal/hostile/creature/strong/cult + faction = "cult" + + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + + supernatural = 1 + +/mob/living/simple_animal/hostile/creature/cult/cultify() + return + +/mob/living/simple_animal/hostile/creature/cult/Life() + ..() + check_horde() diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index 7b96db183a8..dd20145b385 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -58,3 +58,26 @@ /mob/living/simple_animal/hostile/faithless/cult/Life() ..() check_horde() + + + + +/mob/living/simple_animal/hostile/faithless/strong + maxHealth = 100 + health = 100 + + harm_intent_damage = 5 + melee_damage_lower = 7 + melee_damage_upper = 20 + + +/mob/living/simple_animal/hostile/faithless/strong/cult + faction = "cult" + supernatural = 1 + +/mob/living/simple_animal/hostile/faithless/cult/cultify() + return + +/mob/living/simple_animal/hostile/faithless/cult/Life() + ..() + check_horde() \ No newline at end of file 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 262aad8e1a4..713d33458c6 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -19,7 +19,7 @@ meat_type = /obj/item/weapon/reagent_containers/food/snacks/xenomeat response_help = "pets" response_disarm = "gently pushes aside" - response_harm = "pokes" + response_harm = "punches" stop_automated_movement_when_pulled = 0 maxHealth = 200 health = 200 diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 4cf07f35f6a..08ff09703f2 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -65,7 +65,7 @@ //Null rod stuff var/supernatural = 0 var/purge = 0 - + //Pulling hostile mob vars down var/stance = STANCE_IDLE //Used to determine behavior var/mob/living/target_mob @@ -81,7 +81,7 @@ var/destroy_surroundings = 0 var/shuttletarget = null var/enroute = 0 - + var/list/resistances = list( HALLOSS = 0, BRUTE = 1, @@ -90,7 +90,7 @@ OXY = 0, CLONE = 0 ) - + var/hostile = 0 /mob/living/simple_animal/New() @@ -231,7 +231,7 @@ if(!atmos_suitable) adjustBruteLoss(unsuitable_atoms_damage) - + //Hostility if(!stat && !client && hostile) switch(stance) @@ -247,7 +247,7 @@ if(destroy_surroundings) DestroySurroundings() AttackTarget() - + return 1 /mob/living/simple_animal/proc/handle_supernatural() @@ -331,26 +331,28 @@ if(istype(O, /obj/item/weapon/material/knife) || istype(O, /obj/item/weapon/material/knife/butch)) harvest(user) else - attacked_with_item(O, user) + if(!O.force) + visible_message("[user] gently taps [src] with \the [O].") + else + O.attack(src, user, user.zone_sel.selecting) -//TODO: refactor mob attackby(), attacked_by(), and friends. -/mob/living/simple_animal/proc/attacked_with_item(var/obj/item/O, var/mob/user) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - if(!O.force) - visible_message("[user] gently taps [src] with \the [O].") - return - - if(O.force > resistance) - var/damage = O.force * resistances[O.damtype] - if(supernatural && istype(O,/obj/item/weapon/nullrod)) - damage *= 2 - purge = 3 - adjustBruteLoss(damage) - else - usr << "This weapon is ineffective, it does no damage." +/mob/living/simple_animal/hit_with_weapon(obj/item/O, mob/living/user, var/effective_force, var/hit_zone) visible_message("\The [src] has been attacked with \the [O] by [user].") - user.do_attack_animation(src) + + if(O.force <= resistance) + user << "This weapon is ineffective, it does no damage." + return 2 + + var/damage = O.force + if (O.damtype == HALLOSS) + damage = 0 + if(supernatural && istype(O,/obj/item/weapon/nullrod)) + damage *= 2 + purge = 3 + adjustBruteLoss(damage) + + return 0 /mob/living/simple_animal/movement_delay() var/tally = 0 //Incase I need to add stuff other than "speed" later diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 405afb537c7..8e9fbdeb62d 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -661,15 +661,13 @@ if(client.holder) if(statpanel("Status")) - stat("Location:","([x], [y], [z])") - if(statpanel("Processes")) + stat("Location:", "([x], [y], [z]) [loc]") stat("CPU:","[world.cpu]") stat("Instances:","[world.contents.len]") - if(processScheduler && processScheduler.getIsRunning()) - for(var/datum/controller/process/P in processScheduler.processes) - stat(P.getStatName(), P.getTickTime()) - else - stat("processScheduler is not running.") + + if(statpanel("Processes")) + if(processScheduler) + processScheduler.statProcesses() if(listed_turf && client) if(!TurfAdjacent(listed_turf)) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 612861ed8c5..5271034d2ba 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -19,18 +19,6 @@ return L.mob_size <= MOB_MINISCULE return 0 - -// If they are 100% robotic, they count as synthetic. -/mob/living/carbon/human/isSynthetic() - if(isnull(full_prosthetic)) - robolimb_count = 0 - for(var/obj/item/organ/external/E in organs) - if(E.robotic >= ORGAN_ROBOT) - robolimb_count++ - if(robolimb_count == organs.len) - full_prosthetic = 1 - return full_prosthetic - /mob/living/silicon/isSynthetic() return 1 diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 55530ddcd85..a1b8437b0b7 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -127,9 +127,13 @@ observer.timeofdeath = world.time // Set the time of death so that the respawn timer works correctly. announce_ghost_joinleave(src) - client.prefs.update_preview_icon() - observer.icon = client.prefs.preview_icon + var/mob/living/carbon/human/dummy/mannequin = new() + client.prefs.dress_preview_mob(mannequin) + observer.appearance = mannequin observer.alpha = 127 + observer.layer = initial(observer.layer) + observer.invisibility = initial(observer.invisibility) + qdel(mannequin) if(client.prefs.be_random_name) client.prefs.real_name = random_name(client.prefs.identifying_gender) @@ -427,7 +431,7 @@ if(ticker.random_players) new_character.gender = pick(MALE, FEMALE) client.prefs.real_name = random_name(new_character.gender) - client.prefs.randomize_appearance_for(new_character) + client.prefs.randomize_appearance_and_body_for(new_character) else client.prefs.copy_to(new_character) diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index e93f2af24c5..527ad8b70b8 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -1,6 +1,6 @@ /datum/preferences //The mob should have a gender you want before running this proc. Will run fine without H -/datum/preferences/proc/randomize_appearance_for(var/mob/living/carbon/human/H) +/datum/preferences/proc/randomize_appearance_and_body_for(var/mob/living/carbon/human/H) var/datum/species/current_species = all_species[species ? species : "Human"] set_biological_gender(pick(current_species.genders)) @@ -9,13 +9,12 @@ if(current_species) if(current_species.appearance_flags & HAS_SKIN_TONE) s_tone = random_skin_tone() + if(current_species.appearance_flags & HAS_SKIN_COLOR) + r_skin = rand (0,255) + g_skin = rand (0,255) + b_skin = rand (0,255) if(current_species.appearance_flags & HAS_EYE_COLOR) randomize_eyes_color() - if(current_species.appearance_flags & HAS_UNDERWEAR) - underwear_top = underwear_top_t[pick(underwear_top_t)] - underwear_bottom = underwear_bottom_t[pick(underwear_bottom_t)] - undershirt = undershirt_t[pick(undershirt_t)] - socks = socks_t[pick(socks_t)] if(current_species.appearance_flags & HAS_HAIR_COLOR) randomize_hair_color("hair") randomize_hair_color("facial") @@ -23,13 +22,17 @@ r_skin = rand (0,255) g_skin = rand (0,255) b_skin = rand (0,255) + if(current_species.appearance_flags & HAS_UNDERWEAR) + all_underwear.Cut() + for(var/datum/category_group/underwear/WRC in global_underwear.categories) + var/datum/category_item/underwear/WRI = pick(WRC.items) + all_underwear[WRC.name] = WRI.name - //backbag = 2 backbag = rand(1,4) pdachoice = rand(1,3) age = rand(current_species.min_age, current_species.max_age) - b_type = pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+") + b_type = RANDOM_BLOOD_TYPE if(H) copy_to(H,1) @@ -190,554 +193,74 @@ g_skin = green b_skin = blue +/datum/preferences/proc/dress_preview_mob(var/mob/living/carbon/human/mannequin) + copy_to(mannequin) + if(!dress_mob) + return -/datum/preferences/proc/update_preview_icon() //seriously. This is horrendous. - qdel(preview_icon_front) - qdel(preview_icon_side) - qdel(preview_icon) - - var/g = "m" - if(biological_gender == FEMALE) g = "f" - - var/icon/icobase - var/datum/species/current_species = all_species[species] - - if(current_species) - icobase = current_species.icobase + // Determine what job is marked as 'High' priority, and dress them up as such. + var/datum/job/previewJob + if(job_civilian_low & ASSISTANT) + previewJob = job_master.GetJob("Assistant") else - icobase = 'icons/mob/human_races/r_human.dmi' + for(var/datum/job/job in job_master.occupations) + var/job_flag + switch(job.department_flag) + if(CIVILIAN) + job_flag = job_civilian_high + if(MEDSCI) + job_flag = job_medsci_high + if(ENGSEC) + job_flag = job_engsec_high + if(job.flag == job_flag) + previewJob = job + break - preview_icon = new /icon(icobase, "") - for(var/name in BP_ALL) - if(organ_data[name] == "amputated") - continue - if(organ_data[name] == "cyborg") - var/datum/robolimb/R - if(rlimb_data[name]) R = all_robolimbs[rlimb_data[name]] - if(!R) R = basic_robolimb - if(name in list(BP_TORSO, BP_GROIN, BP_HEAD)) - preview_icon.Blend(icon(R.icon, "[name]_[g]"), ICON_OVERLAY) - else - preview_icon.Blend(icon(R.icon, "[name]"), ICON_OVERLAY) - continue - var/icon/limb_icon - if(name in list(BP_TORSO, BP_GROIN, BP_HEAD)) - limb_icon = new /icon(icobase, "[name]_[g]") - else - limb_icon = new /icon(icobase, "[name]") - // Skin color - if(current_species && (current_species.appearance_flags & HAS_SKIN_COLOR)) - limb_icon.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) - // Skin tone - if(current_species && (current_species.appearance_flags & HAS_SKIN_TONE)) - if (s_tone >= 0) - limb_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD) - else - limb_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT) - preview_icon.Blend(limb_icon, ICON_OVERLAY) - - //Tail - if(current_species && (current_species.tail)) - var/icon/temp = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[current_species.tail]_s") - if(current_species && (current_species.appearance_flags & HAS_SKIN_COLOR)) - temp.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) - if(current_species && (current_species.appearance_flags & HAS_SKIN_TONE)) - if (s_tone >= 0) - temp.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD) - else - temp.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT) - preview_icon.Blend(temp, ICON_OVERLAY) - - // This is absolute garbage but whatever. It will do until this entire file can be rewritten without crashes. - var/use_eye_icon = "eyes_s" - var/list/use_eye_data = current_species.has_limbs[BP_HEAD] - if(islist(use_eye_data)) - var/use_eye_path = use_eye_data["path"] - var/obj/item/organ/external/head/temp_head = new use_eye_path () - if(istype(temp_head)) - use_eye_icon = temp_head.eye_icon - qdel(temp_head) - - var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = use_eye_icon) - if ((current_species && (current_species.appearance_flags & HAS_EYE_COLOR))) - eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) - - var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] - if(hair_style) - var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") - hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) - eyes_s.Blend(hair_s, ICON_OVERLAY) - - var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style] - if(facial_hair_style) - var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") - facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD) - eyes_s.Blend(facial_s, ICON_OVERLAY) - - var/icon/underwear_top_s = null - if(underwear_top && current_species.appearance_flags & HAS_UNDERWEAR) - underwear_top_s = new/icon("icon" = 'icons/mob/human.dmi', "icon_state" = underwear_top) - var/icon/underwear_bottom_s = null - if(underwear_bottom && current_species.appearance_flags & HAS_UNDERWEAR) - underwear_bottom_s = new/icon("icon" = 'icons/mob/human.dmi', "icon_state" = underwear_bottom) - - var/icon/undershirt_s = null - if(undershirt && current_species.appearance_flags & HAS_UNDERWEAR) - undershirt_s = new/icon("icon" = 'icons/mob/human.dmi', "icon_state" = undershirt) - - var/icon/socks_s = null - if(socks && current_species.appearance_flags & HAS_UNDERWEAR) - socks_s = new/icon("icon" = 'icons/mob/human.dmi', "icon_state" = socks) - - var/icon/clothes_s = null - if(job_civilian_low & ASSISTANT)//This gives the preview icon clothes depending on which job(if any) is set to 'high' - clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - else if(backbag == 3 || backbag == 4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - - else if(job_civilian_high)//I hate how this looks, but there's no reason to go through this switch if it's empty - switch(job_civilian_high) - if(HOP) - clothes_s = new /icon('icons/mob/uniform.dmi', "hop_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "ianshirt"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(BARTENDER) - clothes_s = new /icon('icons/mob/uniform.dmi', "ba_suit_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "tophat"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(BOTANIST) - clothes_s = new /icon('icons/mob/uniform.dmi', "hydroponics_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/hands.dmi', "ggloves"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "apron"), ICON_OVERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "nymph"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-hyd"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(CHEF) - clothes_s = new /icon('icons/mob/uniform.dmi', "chef_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "chefhat"), ICON_OVERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "apronchef"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(JANITOR) - clothes_s = new /icon('icons/mob/uniform.dmi', "janitor_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "bio_janitor"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(LIBRARIAN) - clothes_s = new /icon('icons/mob/uniform.dmi', "red_suit_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "hairflower"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(QUARTERMASTER) - clothes_s = new /icon('icons/mob/uniform.dmi', "qm_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "poncho"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(CARGOTECH) - clothes_s = new /icon('icons/mob/uniform.dmi', "cargotech_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "flat_cap"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(MINER) - clothes_s = new /icon('icons/mob/uniform.dmi', "miner_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "bearpelt"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-eng"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(LAWYER) - clothes_s = new /icon('icons/mob/uniform.dmi', "internalaffairs_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - clothes_s.Blend(new /icon(INV_R_HAND_DEF_ICON, "briefcase"), ICON_UNDERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "suitjacket_blue"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(CHAPLAIN) - clothes_s = new /icon('icons/mob/uniform.dmi', "chapblack_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "imperium_monk"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(CLOWN) - clothes_s = new /icon('icons/mob/uniform.dmi', "clown_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "clown"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/mask.dmi', "clown"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "clownpack"), ICON_OVERLAY) - if(MIME) - clothes_s = new /icon('icons/mob/uniform.dmi', "mime_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/hands.dmi', "lgloves"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/mask.dmi', "mime"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "beret"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "suspenders"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - - else if(job_medsci_high) - switch(job_medsci_high) - if(RD) - clothes_s = new /icon('icons/mob/uniform.dmi', "director_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "petehat"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-tox"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(SCIENTIST) - clothes_s = new /icon('icons/mob/uniform.dmi', "sciencewhite_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_tox_open"), ICON_OVERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "metroid"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-tox"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(XENOBIOLOGIST) - clothes_s = new /icon('icons/mob/uniform.dmi', "sciencewhite_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_tox_open"), ICON_OVERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "metroid"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-tox"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(CHEMIST) - clothes_s = new /icon('icons/mob/uniform.dmi', "chemistrywhite_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labgreen"), ICON_OVERLAY) + if(previewJob) + mannequin.job = previewJob.title + previewJob.equip_preview(mannequin, player_alt_titles[previewJob.title]) + var/list/equipped_slots = list() //If more than one item takes the same slot only spawn the first + for(var/thing in gear) + var/datum/gear/G = gear_datums[thing] + if(G) + var/permitted = 0 + if(G.allowed_roles) + for(var/job_name in G.allowed_roles) + if(previewJob.title == job_name) + permitted = 1 else - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_chem_open"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-chem"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(CMO) - clothes_s = new /icon('icons/mob/uniform.dmi', "cmo_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "bio_cmo"), ICON_OVERLAY) - else - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_cmo_open"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-med"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(DOCTOR) - clothes_s = new /icon('icons/mob/uniform.dmi', "medical_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "surgeon"), ICON_OVERLAY) - else - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-med"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(GENETICIST) - clothes_s = new /icon('icons/mob/uniform.dmi', "geneticswhite_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "monkeysuit"), ICON_OVERLAY) - else - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_gen_open"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-gen"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(VIROLOGIST) - clothes_s = new /icon('icons/mob/uniform.dmi', "virologywhite_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/mask.dmi', "sterile"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_vir_open"), ICON_OVERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "plaguedoctor"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-vir"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(ROBOTICIST) - clothes_s = new /icon('icons/mob/uniform.dmi', "robotics_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY) - if(prob(1)) - clothes_s.Blend(new /icon(INV_R_HAND_DEF_ICON, "toolbox_blue"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + permitted = 1 - else if(job_engsec_high) - switch(job_engsec_high) - if(CAPTAIN) - clothes_s = new /icon('icons/mob/uniform.dmi', "captain_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "centcomcaptain"), ICON_OVERLAY) - else - clothes_s.Blend(new /icon('icons/mob/head.dmi', "captain"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-cap"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(HOS) - clothes_s = new /icon('icons/mob/uniform.dmi', "hosred_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "hosberet"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-sec"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(WARDEN) - clothes_s = new /icon('icons/mob/uniform.dmi', "warden_s") - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "slippers_worn"), ICON_OVERLAY) - else - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-sec"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(DETECTIVE) - clothes_s = new /icon('icons/mob/uniform.dmi', "detective_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/mask.dmi', "cigaron"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "detective"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "detective"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(OFFICER) - clothes_s = new /icon('icons/mob/uniform.dmi', "secred_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "officerberet"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-sec"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(CHIEF) - clothes_s = new /icon('icons/mob/uniform.dmi', "chief_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "hardhat0_white"), ICON_OVERLAY) - if(prob(1)) - clothes_s.Blend(new /icon(INV_R_HAND_DEF_ICON, "blueprints"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "engiepack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-eng"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(ENGINEER) - clothes_s = new /icon('icons/mob/uniform.dmi', "engine_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "orange"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "hardhat0_yellow"), ICON_OVERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "hazard"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "engiepack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-eng"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(ATMOSTECH) - clothes_s = new /icon('icons/mob/uniform.dmi', "atmos_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) - if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "firesuit"), ICON_OVERLAY) - switch(backbag) - if(2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - if(3) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) - if(4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(G.whitelisted && (G.whitelisted != mannequin.species.name)) + permitted = 0 - if(AI)//Gives AI and borgs assistant-wear, so they can still customize their character - clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "straight_jacket"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "cardborg_h"), ICON_OVERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - else if(backbag == 3 || backbag == 4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) - if(CYBORG) - clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "cardborg"), ICON_OVERLAY) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "cardborg_h"), ICON_OVERLAY) - if(backbag == 2) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) - else if(backbag == 3 || backbag == 4) - clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(!permitted) + continue - if(disabilities & NEARSIGHTED) - preview_icon.Blend(new /icon('icons/mob/eyes.dmi', "glasses"), ICON_OVERLAY) + if(G.slot && !(G.slot in equipped_slots)) + equipped_slots += G.slot + var/metadata = gear[G.display_name] + mannequin.equip_to_slot_or_del(G.spawn_item(mannequin, metadata), G.slot) + mannequin.update_icons() - preview_icon.Blend(eyes_s, ICON_OVERLAY) - if(underwear_top_s) - preview_icon.Blend(underwear_top_s, ICON_OVERLAY) - if(underwear_bottom_s) - preview_icon.Blend(underwear_bottom_s, ICON_OVERLAY) - if(undershirt_s) - preview_icon.Blend(undershirt_s, ICON_OVERLAY) - if(socks_s) - preview_icon.Blend(socks_s, ICON_OVERLAY) - if(clothes_s) - preview_icon.Blend(clothes_s, ICON_OVERLAY) - preview_icon_front = new(preview_icon, dir = SOUTH) - preview_icon_side = new(preview_icon, dir = WEST) +/datum/preferences/proc/update_preview_icon() + var/mob/living/carbon/human/dummy/mannequin/mannequin = get_mannequin(client_ckey) + mannequin.delete_inventory(TRUE) + dress_preview_mob(mannequin) - qdel(eyes_s) - qdel(underwear_top_s) - qdel(underwear_bottom_s) - qdel(undershirt_s) - qdel(socks_s) - qdel(clothes_s) + preview_icon = icon('icons/effects/effects.dmi', "nothing") + preview_icon.Scale(48+32, 16+32) + + mannequin.dir = NORTH + var/icon/stamp = getFlatIcon(mannequin) + preview_icon.Blend(stamp, ICON_OVERLAY, 25, 17) + + mannequin.dir = WEST + stamp = getFlatIcon(mannequin) + preview_icon.Blend(stamp, ICON_OVERLAY, 1, 9) + + mannequin.dir = SOUTH + stamp = getFlatIcon(mannequin) + preview_icon.Blend(stamp, ICON_OVERLAY, 49, 1) + + preview_icon.Scale(preview_icon.Width() * 2, preview_icon.Height() * 2) // Scaling here to prevent blurring in the browser. \ No newline at end of file diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 17219a48d43..2c5f24984a5 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -266,9 +266,11 @@ proc/blood_splatter(var/target,var/datum/reagent/blood/source,var/large) var/obj/effect/decal/cleanable/blood/B var/decal_type = /obj/effect/decal/cleanable/blood/splatter var/turf/T = get_turf(target) + var/synth = 0 if(istype(source,/mob/living/carbon/human)) var/mob/living/carbon/human/M = source + if(M.isSynthetic()) synth = 1 source = M.get_blood(M.vessel) // Are we dripping or splattering? @@ -297,6 +299,7 @@ proc/blood_splatter(var/target,var/datum/reagent/blood/source,var/large) // Update appearance. if(source.data["blood_colour"]) B.basecolor = source.data["blood_colour"] + B.synthblood = synth B.update_icon() // Update blood information. diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 5c096aa9d64..13eef2eaf41 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -70,6 +70,8 @@ var/list/organ_cache = list() blood_DNA[dna.unique_enzymes] = dna.b_type if(internal) holder.internal_organs |= src + else + species = all_species["Human"] /obj/item/organ/proc/set_dna(var/datum/dna/new_dna) if(new_dna) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index cc105e1bbf7..c084c061707 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -44,7 +44,7 @@ var/list/wounds = list() // wound datum list. var/number_wounds = 0 // number of wounds, which is NOT wounds.len! var/obj/item/organ/external/parent // Master-limb. - var/list/children // Sub-limbs. + var/list/children = list() // Sub-limbs. var/list/internal_organs = list() // Internal organs of this body part var/sabotaged = 0 // If a prosthetic limb is emagged, it will detonate when it fails. var/list/implants = list() // Currently implanted objects. @@ -363,15 +363,16 @@ var/damage_amount switch(damage_type) - if(BRUTE) damage_amount = brute_dam - if(BURN) damage_amount = burn_dam + if(BRUTE) damage_amount = brute_dam + if(BURN) damage_amount = burn_dam + if("omni") damage_amount = max(brute_dam,burn_dam) else return 0 if(!damage_amount) user << "Nothing to fix!" return 0 - if(damage_amount >= ROBOLIMB_SELF_REPAIR_CAP) + if(damage_amount >= ROBOLIMB_REPAIR_CAP) user << "The damage is far too severe to patch over externally." return 0 @@ -394,10 +395,13 @@ switch(damage_type) if(BRUTE) src.heal_damage(repair_amount, 0, 0, 1) if(BURN) src.heal_damage(0, repair_amount, 0, 1) - if(user == src.owner) - user.visible_message("\The [user] patches [damage_desc] on \his [src.name] with [tool].") - else - user.visible_message("\The [user] patches [damage_desc] on [owner]'s [src.name] with [tool].") + if("omni")src.heal_damage(repair_amount, repair_amount, 0, 1) + + if(damage_desc) + if(user == src.owner) + user.visible_message("\The [user] patches [damage_desc] on \his [src.name] with [tool].") + else + user.visible_message("\The [user] patches [damage_desc] on [owner]'s [src.name] with [tool].") return 1 @@ -1028,7 +1032,11 @@ Note that amputating the affected organ does in fact remove the infection from t R = basic_robolimb if(R) force_icon = R.icon - name = "robotic [initial(name)]" + if(R.lifelike) + robotic = ORGAN_LIFELIKE + name = "[initial(name)]" + else + name = "robotic [initial(name)]" desc = "[R.desc] It looks like it was produced by [R.company]." dislocated = -1 @@ -1041,9 +1049,6 @@ Note that amputating the affected organ does in fact remove the infection from t if(owner) - if(!skip_prosthetics) - owner.full_prosthetic = null // Will be rechecked next isSynthetic() call. - if(!keep_organs) for(var/obj/item/organ/thing in internal_organs) if(istype(thing)) @@ -1175,29 +1180,39 @@ Note that amputating the affected organ does in fact remove the infection from t if(status & ORGAN_DESTROYED && !is_stump()) . += "tear at [amputation_point] so severe that it hangs by a scrap of flesh" + //Handle robotic and synthetic organ damage if(robotic >= ORGAN_ROBOT) + var/LL //Life-Like, aka only show that it's robotic in heavy damage + if(robotic >= ORGAN_LIFELIKE) + LL = 1 if(brute_dam) switch(brute_dam) if(0 to 20) - . += "some dents" + . += "some [LL ? "cuts" : "dents"]" if(21 to INFINITY) - . += pick("a lot of dents","severe denting") + . += "[LL ? pick("exposed wiring","torn-back synthflesh") : pick("a lot of dents","severe denting")]" + if(brute_dam && burn_dam) . += " and " + if(burn_dam) switch(burn_dam) if(0 to 20) . += "some burns" if(21 to INFINITY) - . += pick("a lot of burns","severe melting") + . += "[LL ? pick("roasted synth-flesh","melted internal wiring") : pick("many burns","scorched metal")]" + if(open) if(brute_dam || burn_dam) - . += " and an open panel" + . += " and " + if(open == 1) + . += "some exposed screws" else . += "an open panel" return + //Normal organic organ damage var/list/wound_descriptors = list() if(open > 1) wound_descriptors["an open incision"] = 1 @@ -1260,7 +1275,6 @@ Note that amputating the affected organ does in fact remove the infection from t // Give them a new cell. owner.internal_organs_by_name["cell"] = new /obj/item/organ/internal/cell(owner,1) - /obj/item/organ/external/groin name = "lower body" organ_tag = BP_GROIN diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index e54598d23e4..5241747f12c 100644 --- a/code/modules/organs/robolimbs.dm +++ b/code/modules/organs/robolimbs.dm @@ -1,6 +1,27 @@ var/list/all_robolimbs = list() +var/list/robolimb_data = list() var/list/chargen_robolimbs = list() var/datum/robolimb/basic_robolimb +var/const/standard_monitor_styles = "blank=ipc_blank;\ + pink=ipc_pink;\ + green=ipc_green,\ + red=ipc_red;\ + blue=ipc_blue;\ + shower=ipc_shower;\ + orange=ipc_orange;\ + nature=ipc_nature;\ + eight=ipc_eight;\ + goggles=ipc_goggles;\ + heart=ipc_heart;\ + monoeye=ipc_monoeye;\ + breakout=ipc_breakout;\ + yellow=ipc_yellow;\ + static=ipc_static;\ + purple=ipc_purple;\ + scroll=ipc_scroll;\ + console=ipc_console;\ + glider=ipc_gol_glider;\ + rainbow=ipc_rainbow" /proc/populate_robolimb_list() basic_robolimb = new() @@ -8,46 +29,169 @@ var/datum/robolimb/basic_robolimb var/datum/robolimb/R = new limb_type() all_robolimbs[R.company] = R if(!R.unavailable_at_chargen) - chargen_robolimbs[R.company] = R + chargen_robolimbs[R.company] = R //List only main brands and solo parts. /datum/robolimb var/company = "Unbranded" // Shown when selecting the limb. var/desc = "A generic unbranded robotic prosthesis." // Seen when examining a limb. var/icon = 'icons/mob/human_races/robotic.dmi' // Icon base to draw from. var/unavailable_at_chargen // If set, not available at chargen. + var/unavailable_to_build // If set, can't be constructed. + var/lifelike // If set, appears organic. + var/blood_color = "#030303" var/list/species_cannot_use = list("Teshari") + var/list/monitor_styles //If empty, the model of limbs offers a head compatible with monitors. + var/parts = BP_ALL //Defines what parts said brand can replace on a body. /datum/robolimb/bishop company = "Bishop" desc = "This limb has a white polymer casing with blue holo-displays." - icon = 'icons/mob/human_races/cyberlimbs/bishop.dmi' + icon = 'icons/mob/human_races/cyberlimbs/bishop/bishop_main.dmi' + unavailable_to_build = 1 -/datum/robolimb/hesphaistos +/datum/robolimb/bishop_alt1 + company = "Bishop - Glyph" + desc = "This limb has a white polymer casing with blue holo-displays." + icon = 'icons/mob/human_races/cyberlimbs/bishop/bishop_alt1.dmi' + unavailable_to_build = 1 + parts = list(BP_HEAD) + +/datum/robolimb/bishop_monitor + company = "Bishop Monitor" + desc = "Bishop Cybernetics' unique spin on a popular prosthetic head model. The themes conflict in an intriguing way." + icon = 'icons/mob/human_races/cyberlimbs/bishop/bishop_monitor.dmi' + unavailable_to_build = 1 + parts = list(BP_HEAD) + monitor_styles = standard_monitor_styles + +/datum/robolimb/hesphiastos company = "Hesphiastos" desc = "This limb has a militaristic black and green casing with gold stripes." - icon = 'icons/mob/human_races/cyberlimbs/hesphaistos.dmi' + icon = 'icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_main.dmi' + unavailable_to_build = 1 -/datum/robolimb/zenghu - company = "Zeng-Hu" - desc = "This limb has a rubbery fleshtone covering with visible seams." - icon = 'icons/mob/human_races/cyberlimbs/zenghu.dmi' +/datum/robolimb/hesphiastos_alt1 + company = "Hesphiastos - Frontier" + desc = "A rugged prosthetic head featuring the standard Hesphiastos theme, a visor and an external display." + icon = 'icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_alt1.dmi' + unavailable_to_build = 1 + parts = list(BP_HEAD) + monitor_styles = "blank=hesphiastos_alt_off;\ + pink=hesphiastos_alt_pink;\ + orange=hesphiastos_alt_orange;\ + goggles=hesphiastos_alt_goggles;\ + scroll=hesphiastos_alt_scroll;\ + rgb=hesphiastos_alt_rgb;\ + rainbow=hesphiastos_alt_rainbow" -/datum/robolimb/xion - company = "Xion" - desc = "This limb has a minimalist black and red casing." - icon = 'icons/mob/human_races/cyberlimbs/xion.dmi' +/datum/robolimb/hesphiastos_monitor + company = "Hesphiastos Monitor" + desc = "Hesphiastos' unique spin on a popular prosthetic head model. It looks rugged and sturdy." + icon = 'icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_monitor.dmi' + unavailable_to_build = 1 + parts = list(BP_HEAD) + monitor_styles = standard_monitor_styles -/datum/robolimb/ipc +/datum/robolimb/morpheus company = "Morpheus" desc = "This limb is simple and functional; no effort has been made to make it look human." - icon = 'icons/mob/human_races/cyberlimbs/ipc.dmi' + icon = 'icons/mob/human_races/cyberlimbs/morpheus/morpheus_main.dmi' + unavailable_to_build = 1 + monitor_styles = standard_monitor_styles -/datum/robolimb/wardtakahashi - company = "Ward-Takahashi" - desc = "This limb features sleek black and white polymers." - icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi.dmi' +/datum/robolimb/morpheus_alt1 + company = "Morpheus - Zenith" + desc = "This limb is simple and functional; no effort has been made to make it look human." + icon = 'icons/mob/human_races/cyberlimbs/morpheus/morpheus_alt1.dmi' + unavailable_to_build = 1 + parts = list(BP_HEAD) /datum/robolimb/veymed company = "Vey-Med" desc = "This high quality limb is nearly indistinguishable from an organic one." - icon = 'icons/mob/human_races/cyberlimbs/veymed.dmi' \ No newline at end of file + icon = 'icons/mob/human_races/cyberlimbs/veymed/veymed_main.dmi' + unavailable_to_build = 1 + lifelike = 1 + blood_color = "#CCCCCC" + +/datum/robolimb/wardtakahashi + company = "Ward-Takahashi" + desc = "This limb features sleek black and white polymers." + icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_main.dmi' + unavailable_to_build = 1 + +/datum/robolimb/wardtakahashi_alt1 + company = "Ward-Takahashi - Shroud" + desc = "This limb features sleek black and white polymers. This one looks more like a helmet of some sort." + icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_alt1.dmi' + unavailable_to_build = 1 + parts = list(BP_HEAD) + +/datum/robolimb/wardtakahashi_monitor + company = "Ward-Takahashi Monitor" + desc = "Ward-Takahashi's unique spin on a popular prosthetic head model. It looks sleek and modern." + icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_monitor.dmi' + unavailable_to_build = 1 + parts = list(BP_HEAD) + monitor_styles = standard_monitor_styles + +/datum/robolimb/xion + company = "Xion" + desc = "This limb has a minimalist black and red casing." + icon = 'icons/mob/human_races/cyberlimbs/xion/xion_main.dmi' + unavailable_to_build = 1 + +/datum/robolimb/xion_alt1 + company = "Xion Mfg. - Breach" + desc = "This limb has a minimalist black and red casing. Looks a bit menacing." + icon = 'icons/mob/human_races/cyberlimbs/xion/xion_alt1.dmi' + unavailable_to_build = 1 + parts = list(BP_HEAD) + +/datum/robolimb/xion_monitor + company = "Xion Mfg. Monitor" + desc = "Xion Mfg.'s unique spin on a popular prosthetic head model. It looks and minimalist and utilitarian." + icon = 'icons/mob/human_races/cyberlimbs/xion/xion_monitor.dmi' + unavailable_to_build = 1 + parts = list(BP_HEAD) + monitor_styles = standard_monitor_styles + +/datum/robolimb/zenghu + company = "Zeng-Hu" + desc = "This limb has a rubbery fleshtone covering with visible seams." + icon = 'icons/mob/human_races/cyberlimbs/zenghu/zenghu_main.dmi' + unavailable_to_build = 1 + +/obj/item/weapon/disk/limb + name = "Limb Blueprints" + desc = "A disk containing the blueprints for prosthetics." + icon = 'icons/obj/cloning.dmi' + icon_state = "datadisk2" + var/company = "" + + //I'm normally opposed to relative pathing, but pls. + bishop + company = "Bishop" + + hesphiastos + company = "Hesphiastos" + + morpheus + company = "Morpheus" + + veymed + company = "Vey-Med" + + wardtakahashi + company = "Ward-Takahashi" + + xion + company = "Xion" + + zenghu + company = "Zeng-Hu" + +/obj/item/weapon/disk/limb/New(var/newloc) + ..() + if(company) + name = "[company] [initial(name)]" diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm index 04544035c08..df74367d0d5 100644 --- a/code/modules/organs/subtypes/machine.dm +++ b/code/modules/organs/subtypes/machine.dm @@ -25,6 +25,7 @@ organ_tag = "brain" parent_organ = BP_HEAD vital = 1 + var/brain_type = /obj/item/device/mmi var/obj/item/device/mmi/stored_mmi /obj/item/organ/internal/mmi_holder/Destroy() @@ -35,8 +36,10 @@ /obj/item/organ/internal/mmi_holder/New(var/mob/living/carbon/human/new_owner, var/internal) ..(new_owner, internal) - if(!stored_mmi) - stored_mmi = new(src) + var/mob/living/carbon/human/dummy/mannequin/M = new_owner + if(istype(M)) + return + stored_mmi = new brain_type(src) sleep(-1) update_from_mmi() @@ -80,10 +83,8 @@ /obj/item/organ/internal/mmi_holder/posibrain name = "positronic brain interface" - -/obj/item/organ/internal/mmi_holder/posibrain/New() - stored_mmi = new /obj/item/device/mmi/digital/posibrain(src) - ..() + brain_type = /obj/item/device/mmi/digital/posibrain + /obj/item/organ/internal/mmi_holder/posibrain/update_from_mmi() ..() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index ab052834ec1..92066ae899a 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -221,7 +221,7 @@ admin_attack_log(usr, attacker_message="Fired [src]", admin_message="fired a gun ([src]) (MODE: [src.mode_name]) [reflex ? "by reflex" : "manually"].") //update timing - user.setClickCooldown(4) + user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) user.setMoveCooldown(move_delay) next_fire_time = world.time + fire_delay @@ -426,4 +426,4 @@ return new_mode /obj/item/weapon/gun/attack_self(mob/user) - switch_firemodes(user) \ No newline at end of file + switch_firemodes(user) diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index 9fcc709ba05..b389d39153f 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -78,7 +78,7 @@ H.set_species(randomize) H.universal_speak = 1 var/datum/preferences/A = new() //Randomize appearance for the human - A.randomize_appearance_for(H) + A.randomize_appearance_and_body_for(H) if(new_mob) for (var/spell/S in M.spell_list) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index f98d90b248e..2c8c853ebcb 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -25,11 +25,6 @@ /obj/item/weapon/reagent_containers/attack_self(mob/user as mob) return -/obj/item/weapon/reagent_containers/attack(mob/M as mob, mob/user as mob, def_zone) - if(can_operate(M))//Checks if mob is lying down on table for surgery - if(do_surgery(M, user, src)) - return - /obj/item/weapon/reagent_containers/afterattack(obj/target, mob/user, flag) return @@ -106,6 +101,7 @@ user << "\The [blocked] is in the way!" return + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) //puts a limit on how fast people can eat/drink things self_feed_message(user) reagents.trans_to_mob(user, issmall(user) ? ceil(amount_per_transfer_from_this/2) : amount_per_transfer_from_this, CHEM_INGEST) feed_sound(user) @@ -123,6 +119,7 @@ other_feed_message_start(user, target) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(!do_mob(user, target)) return diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index 3b78dc73263..dea0da4180f 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -23,6 +23,9 @@ flags |= OPENCONTAINER /obj/item/weapon/reagent_containers/food/drinks/attack(mob/M as mob, mob/user as mob, def_zone) + if(force && !(flags & NOBLUDGEON) && user.a_intent == I_HURT) + return ..() + if(standard_feed_mob(user, M)) return @@ -93,10 +96,6 @@ volume = 150 flags = CONDUCT | OPENCONTAINER -/obj/item/weapon/reagent_containers/food/drinks/golden_cup/tournament_26_06_2011 - desc = "A golden cup. It will be presented to a winner of tournament 26 june and name of the winner will be graved on it." - - ///////////////////////////////////////////////Drinks //Notes by Darem: Drinks are simply containers that start preloaded. Unlike condiments, the contents can be ingested directly // rather then having to add it to something else first. They should only contain liquids. They have a default container size of 50. diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm index 712772a54b5..c0189dd1c67 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm @@ -32,7 +32,7 @@ var/throw_dist = get_dist(throw_source, loc) if(speed >= throw_speed && smash_check(throw_dist)) //not as reliable as smashing directly if(reagents) - hit_atom.visible_message("The contents of the [src] splash all over [hit_atom]!") + hit_atom.visible_message("The contents of \the [src] splash all over [hit_atom]!") reagents.splash(hit_atom, reagents.total_volume) src.smash(loc, hit_atom) @@ -137,59 +137,34 @@ else set_light(0) -/obj/item/weapon/reagent_containers/food/drinks/bottle/attack(mob/living/target as mob, mob/living/user as mob) - if(!target) +/obj/item/weapon/reagent_containers/food/drinks/bottle/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone) + var/blocked = ..() + + if(user.a_intent != I_HURT) return - - if(user.a_intent != I_HURT || !isGlass) - return ..() - - var/affecting = user.zone_sel.selecting //Find what the player is aiming at - - var/armor_block = 0 //Get the target's armour values for normal attack damage. - var/armor_duration = 0 //The more force the bottle has, the longer the duration. - - //Calculating duration and calculating damage. - armor_block = target.run_armor_check(affecting, "melee") - - //force will counteract armour, but will never increase duration - armor_duration = smash_duration + min(0, force - target.getarmor(affecting, "melee") + 10) - - //Apply the damage! - target.apply_damage(force, BRUTE, affecting, armor_block, sharp=0) + if(!smash_check(1)) + return //won't always break on the first hit // You are going to knock someone out for longer if they are not wearing a helmet. - var/do_smash = smash_check(1) //won't always break on the first hit - var/mob/living/carbon/human/H = target - if(do_smash && istype(H) && H.headcheck(affecting)) - //Display an attack message. - var/obj/item/organ/O = H.get_organ(affecting) - user.visible_message("[user] smashes [src] into [H]'s [O.name]!") - //Weaken the target for the duration that we calculated and divide it by 5. - if(armor_duration) - target.apply_effect(min(armor_duration, 5) , WEAKEN, armor_block) // Never weaken more than a flash! + var/weaken_duration = 0 + if(blocked < 100) + weaken_duration = smash_duration + min(0, force - target.getarmor(hit_zone, "melee") + 10) + + if(hit_zone == "head" && istype(target, /mob/living/carbon/)) + user.visible_message("\The [user] smashes [src] over [target]'s head!") + if(weaken_duration) + target.apply_effect(min(weaken_duration, 5), WEAKEN, blocked) // Never weaken more than a flash! else - //Default attack message and don't weaken the target. - for(var/mob/O in viewers(user, null)) - if(target != user) O.show_message(text("\red [target] has been attacked with a bottle of [src.name], by [user]!"), 1) - else O.show_message(text("\red [target] has attacked \himself with a bottle of [src.name]!"), 1) + user.visible_message("\The [user] smashes [src] into [target]!") - //Attack logs - user.attack_log += text("\[[time_stamp()]\] Has attacked [target.name] ([target.ckey]) with a bottle!") - target.attack_log += text("\[[time_stamp()]\] Has been smashed with a bottle by [user.name] ([user.ckey])") - msg_admin_attack("[user.name] ([user.ckey]) attacked [target.name] ([target.ckey]) with a bottle. (INTENT: [uppertext(user.a_intent)]) (JMP)") + //The reagents in the bottle splash all over the target, thanks for the idea Nodrak + if(reagents) + user.visible_message("The contents of \the [src] splash all over [target]!") + reagents.splash(target, reagents.total_volume) - if(do_smash) - //The reagents in the bottle splash all over the target, thanks for the idea Nodrak - if(reagents) - user.visible_message("The contents of the [src] splash all over [target]!") - reagents.splash(target, reagents.total_volume) - - //Finally, smash the bottle. This kills (qdel) the bottle. - var/obj/item/weapon/broken_bottle/B = src.smash(target.loc, target) - user.put_in_active_hand(B) - - return + //Finally, smash the bottle. This kills (qdel) the bottle. + var/obj/item/weapon/broken_bottle/B = smash(target.loc, target) + user.put_in_active_hand(B) //Keeping this here for now, I'll ask if I should keep it here. /obj/item/weapon/broken_bottle @@ -507,4 +482,4 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale/New() ..() - reagents.add_reagent("ale", 30) \ No newline at end of file + reagents.add_reagent("ale", 30) diff --git a/code/modules/reagents/reagent_containers/food/lunch.dm b/code/modules/reagents/reagent_containers/food/lunch.dm index edb4e3b8909..794d7f69ddb 100644 --- a/code/modules/reagents/reagent_containers/food/lunch.dm +++ b/code/modules/reagents/reagent_containers/food/lunch.dm @@ -107,7 +107,7 @@ var/list/lunchables_ethanol_reagents_ = list(/datum/reagent/ethanol/acid_spit, /proc/init_lunchable_reagent_list(var/list/banned_reagents, var/reagent_types) . = list() - for(var/reagent_type in subtypes(reagent_types)) + for(var/reagent_type in subtypesof(reagent_types)) if(reagent_type in banned_reagents) continue var/datum/reagent/reagent = reagent_type diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 854e6b72812..45b0eb97b81 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -41,6 +41,8 @@ return 0 if(istype(M, /mob/living/carbon)) + //TODO: replace with standard_feed_mob() call. + var/fullness = M.nutrition + (M.reagents.get_reagent_amount("nutriment") * 25) if(M == user) //If you're eating it yourself if(istype(M,/mob/living/carbon/human)) @@ -53,6 +55,7 @@ user << "\The [blocked] is in the way!" return + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) //puts a limit on how fast people can eat/drink things if (fullness <= 50) M << "You hungrily chew out a piece of [src] and gobble it!" if (fullness > 50 && fullness <= 150) @@ -83,6 +86,7 @@ user.visible_message("[user] cannot force anymore of [src] down [M]'s throat.") return 0 + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(!do_mob(user, M)) return M.attack_log += text("\[[time_stamp()]\] Has been fed [src.name] by [user.name] ([user.ckey]) Reagents: [reagentlist(src)]") diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 44ea628eca3..4eb927444e7 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -41,7 +41,8 @@ /obj/machinery/smartfridge/, /obj/machinery/biogenerator, /obj/structure/frame, - /obj/machinery/radiocarbon_spectrometer + /obj/machinery/radiocarbon_spectrometer, + /obj/machinery/xenobio2/manualinjector ) /obj/item/weapon/reagent_containers/glass/New() diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 355f825db2f..884afc5ed83 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -37,6 +37,7 @@ user << "You cannot inject a robotic limb." return + user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) user << "You inject [M] with [src]." M << "You feel a tiny prick!" diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 9e223628726..def1ac7f817 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -12,12 +12,15 @@ slot_flags = SLOT_EARS volume = 60 + + /obj/item/weapon/reagent_containers/pill/New() ..() if(!icon_state) icon_state = "pill[rand(1, 20)]" /obj/item/weapon/reagent_containers/pill/attack(mob/M as mob, mob/user as mob, def_zone) + if(M == user) if(istype(M, /mob/living/carbon/human)) @@ -50,6 +53,7 @@ user.visible_message("[user] attempts to force [M] to swallow \the [src].") + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(!do_mob(user, M)) return diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index f782b862984..09ae98eb908 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -175,6 +175,8 @@ else user.visible_message("[user] begins hunting for an injection port on [target]'s suit!") + user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) + if(!do_mob(user, target, injtime)) return diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 92ba8432744..b9560be615c 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -651,7 +651,7 @@ other types of metals and chemistry for reagents). name = "Positronic brain" id = "posibrain" req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 6, TECH_BLUESPACE = 2, TECH_DATA = 4) - build_type = PROTOLATHE | MECHFAB + build_type = PROTOLATHE | PROSFAB materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500, "phoron" = 500, "diamond" = 100) build_path = /obj/item/device/mmi/digital/posibrain category = "Misc" @@ -661,7 +661,7 @@ other types of metals and chemistry for reagents). name = "Man-machine interface" id = "mmi" req_tech = list(TECH_DATA = 2, TECH_BIO = 3) - build_type = PROTOLATHE | MECHFAB + build_type = PROTOLATHE | PROSFAB materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500) build_path = /obj/item/device/mmi category = "Misc" @@ -671,7 +671,7 @@ other types of metals and chemistry for reagents). name = "Radio-enabled man-machine interface" id = "mmi_radio" req_tech = list(TECH_DATA = 2, TECH_BIO = 4) - build_type = PROTOLATHE | MECHFAB + build_type = PROTOLATHE | PROSFAB materials = list(DEFAULT_WALL_MATERIAL = 1200, "glass" = 500) build_path = /obj/item/device/mmi/radio_enabled category = "Misc" @@ -946,6 +946,13 @@ CIRCUITS BELOW build_path = /obj/item/weapon/circuitboard/mechfab sort_string = "HABAE" +/datum/design/circuit/prosfab + name = "prosthetics fabricator" + id = "prosfab" + req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) + build_path = /obj/item/weapon/circuitboard/prosthetics + sort_string = "HABAF" + /datum/design/circuit/mech_recharger name = "mech recharger" id = "mech_recharger" diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm index 85ace414528..35f064321c6 100644 --- a/code/modules/research/mechfab_designs.dm +++ b/code/modules/research/mechfab_designs.dm @@ -1,101 +1,8 @@ /datum/design/item/mechfab build_type = MECHFAB - category = "Misc" + category = "Other" req_tech = list(TECH_MATERIAL = 1) -/datum/design/item/mechfab/robot - category = "Robot" - -//if the fabricator is a mech fab pass the manufacturer info over to the robot part constructor -/datum/design/item/mechfab/robot/Fabricate(var/newloc, var/fabricator) - if(istype(fabricator, /obj/machinery/mecha_part_fabricator)) - var/obj/machinery/mecha_part_fabricator/mechfab = fabricator - return new build_path(newloc, mechfab.manufacturer) - return ..() - -/datum/design/item/mechfab/robot/exoskeleton - name = "Robot exoskeleton" - id = "robot_exoskeleton" - build_path = /obj/item/robot_parts/robot_suit - time = 50 - materials = list(DEFAULT_WALL_MATERIAL = 50000) - -/datum/design/item/mechfab/robot/torso - name = "Robot torso" - id = "robot_torso" - build_path = /obj/item/robot_parts/chest - time = 35 - materials = list(DEFAULT_WALL_MATERIAL = 40000) - -/datum/design/item/mechfab/robot/head - name = "Robot head" - id = "robot_head" - build_path = /obj/item/robot_parts/head - time = 35 - materials = list(DEFAULT_WALL_MATERIAL = 25000) - -/datum/design/item/mechfab/robot/l_arm - name = "Robot left arm" - id = "robot_l_arm" - build_path = /obj/item/robot_parts/l_arm - time = 20 - materials = list(DEFAULT_WALL_MATERIAL = 18000) - -/datum/design/item/mechfab/robot/r_arm - name = "Robot right arm" - id = "robot_r_arm" - build_path = /obj/item/robot_parts/r_arm - time = 20 - materials = list(DEFAULT_WALL_MATERIAL = 18000) - -/datum/design/item/mechfab/robot/l_leg - name = "Robot left leg" - id = "robot_l_leg" - build_path = /obj/item/robot_parts/l_leg - time = 20 - materials = list(DEFAULT_WALL_MATERIAL = 15000) - -/datum/design/item/mechfab/robot/r_leg - name = "Robot right leg" - id = "robot_r_leg" - build_path = /obj/item/robot_parts/r_leg - time = 20 - materials = list(DEFAULT_WALL_MATERIAL = 15000) - -/datum/design/item/mechfab/robot/component - time = 20 - materials = list(DEFAULT_WALL_MATERIAL = 5000) - -/datum/design/item/mechfab/robot/component/binary_communication_device - name = "Binary communication device" - id = "binary_communication_device" - build_path = /obj/item/robot_parts/robot_component/binary_communication_device - -/datum/design/item/mechfab/robot/component/radio - name = "Radio" - id = "radio" - build_path = /obj/item/robot_parts/robot_component/radio - -/datum/design/item/mechfab/robot/component/actuator - name = "Actuator" - id = "actuator" - build_path = /obj/item/robot_parts/robot_component/actuator - -/datum/design/item/mechfab/robot/component/diagnosis_unit - name = "Diagnosis unit" - id = "diagnosis_unit" - build_path = /obj/item/robot_parts/robot_component/diagnosis_unit - -/datum/design/item/mechfab/robot/component/camera - name = "Camera" - id = "camera" - build_path = /obj/item/robot_parts/robot_component/camera - -/datum/design/item/mechfab/robot/component/armour - name = "Armour plating" - id = "armour" - build_path = /obj/item/robot_parts/robot_component/armour - /datum/design/item/mechfab/ripley category = "Ripley" @@ -316,60 +223,6 @@ time = 60 materials = list(DEFAULT_WALL_MATERIAL = 50000, "uranium" = 10000) -/datum/design/item/robot_upgrade - build_type = MECHFAB - time = 12 - materials = list(DEFAULT_WALL_MATERIAL = 10000) - category = "Cyborg Upgrade Modules" - -/datum/design/item/robot_upgrade/rename - name = "Rename module" - desc = "Used to rename a cyborg." - id = "borg_rename_module" - build_path = /obj/item/borg/upgrade/rename - -/datum/design/item/robot_upgrade/reset - name = "Reset module" - desc = "Used to reset a cyborg's module. Destroys any other upgrades applied to the robot." - id = "borg_reset_module" - build_path = /obj/item/borg/upgrade/reset - -/datum/design/item/robot_upgrade/restart - name = "Emergency restart module" - desc = "Used to force a restart of a disabled-but-repaired robot, bringing it back online." - id = "borg_restart_module" - materials = list(DEFAULT_WALL_MATERIAL = 60000, "glass" = 5000) - build_path = /obj/item/borg/upgrade/restart - -/datum/design/item/robot_upgrade/vtec - name = "VTEC module" - desc = "Used to kick in a robot's VTEC systems, increasing their speed." - id = "borg_vtec_module" - materials = list(DEFAULT_WALL_MATERIAL = 80000, "glass" = 6000, "gold" = 5000) - build_path = /obj/item/borg/upgrade/vtec - -/datum/design/item/robot_upgrade/tasercooler - name = "Rapid taser cooling module" - desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate." - id = "borg_taser_module" - materials = list(DEFAULT_WALL_MATERIAL = 80000, "glass" = 6000, "gold" = 2000, "diamond" = 500) - build_path = /obj/item/borg/upgrade/tasercooler - -/datum/design/item/robot_upgrade/jetpack - name = "Jetpack module" - desc = "A carbon dioxide jetpack suitable for low-gravity mining operations." - id = "borg_jetpack_module" - materials = list(DEFAULT_WALL_MATERIAL = 10000, "phoron" = 15000, "uranium" = 20000) - build_path = /obj/item/borg/upgrade/jetpack - -/datum/design/item/robot_upgrade/syndicate - name = "Illegal upgrade" - desc = "Allows for the construction of lethal upgrades for cyborgs." - id = "borg_syndicate_module" - req_tech = list(TECH_COMBAT = 4, TECH_ILLEGAL = 3) - materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 15000, "diamond" = 10000) - build_path = /obj/item/borg/upgrade/syndicate - /datum/design/item/mecha_tracking name = "Exosuit tracking beacon" build_type = MECHFAB @@ -407,7 +260,7 @@ name = "Cable layer" id = "mech_cable_layer" build_path = /obj/item/mecha_parts/mecha_equipment/tool/cable_layer - + /datum/design/item/mecha/flaregun name = "Flare launcher" id = "mecha_flare_gun" diff --git a/code/modules/research/prosfab_designs.dm b/code/modules/research/prosfab_designs.dm new file mode 100644 index 00000000000..c12434536b0 --- /dev/null +++ b/code/modules/research/prosfab_designs.dm @@ -0,0 +1,297 @@ +/datum/design/item/prosfab + build_type = PROSFAB + category = "Misc" + req_tech = list(TECH_MATERIAL = 1) + +/datum/design/item/prosfab/pros + category = "Prosthetics" + +// Make new external organs and make 'em robotish +/datum/design/item/prosfab/pros/Fabricate(var/newloc, var/fabricator) + if(istype(fabricator, /obj/machinery/pros_fabricator)) + var/obj/machinery/pros_fabricator/prosfab = fabricator + var/obj/item/organ/O = new build_path(newloc) + O.species = all_species["Human"] + O.robotize(prosfab.manufacturer) + O.dna = new/datum/dna() //Uuughhhh... why do I have to do this? + O.dna.ResetUI() + O.dna.ResetSE() + spawn(10) //Limbs love to flop around. Who am I to deny them? + O.dir = 2 + return O + return ..() + +// Deep Magic for the torso since it needs to be a new mob +/datum/design/item/prosfab/pros/torso/Fabricate(var/newloc, var/fabricator) + if(istype(fabricator, /obj/machinery/pros_fabricator)) + var/obj/machinery/pros_fabricator/prosfab = fabricator + var/mob/living/carbon/human/H = new(newloc,"Human") + H.stat = DEAD + H.gender = gender + for(var/obj/item/organ/external/EO in H.organs) + if(EO.organ_tag == BP_TORSO || EO.organ_tag == BP_GROIN) + continue //Roboticizing a torso does all the children and wastes time, do it later + else + EO.remove_rejuv() + + for(var/obj/item/organ/external/O in H.organs) + O.species = all_species["Human"] + O.robotize(prosfab.manufacturer) + O.dna = new/datum/dna() + O.dna.ResetUI() + O.dna.ResetSE() + + H.real_name = "Synthmorph #[rand(100,999)]" + H.name = H.real_name + H.dir = 2 + return H + +//////////////////// Prosthetics //////////////////// +/datum/design/item/prosfab/pros/torso + time = 35 + materials = list(DEFAULT_WALL_MATERIAL = 60000, "glass" = 10000, "plasteel" = 2000) + req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 3, TECH_DATA = 3) + var/gender = MALE + +/datum/design/item/prosfab/pros/torso/male + name = "FBP torso (M)" + id = "pros_torso_m" + build_path = /obj/item/organ/external/chest + gender = MALE + +/obj/item/organ/external/chest/f //To satisfy Travis. :| + +/datum/design/item/prosfab/pros/torso/female + name = "FBP torso (F)" + id = "pros_torso_f" + build_path = /obj/item/organ/external/chest/f + gender = FEMALE + +/datum/design/item/prosfab/pros/head + name = "Prosthetic head" + id = "pros_head" + build_path = /obj/item/organ/external/head + time = 30 + materials = list(DEFAULT_WALL_MATERIAL = 25000, "glass" = 5000, "plasteel" = 1000) + req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 3, TECH_DATA = 3) + +/datum/design/item/prosfab/pros/l_arm + name = "Prosthetic left arm" + id = "pros_l_arm" + build_path = /obj/item/organ/external/arm + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 18000) + +/datum/design/item/prosfab/pros/l_hand + name = "Prosthetic left hand" + id = "pros_l_hand" + build_path = /obj/item/organ/external/hand + time = 15 + materials = list(DEFAULT_WALL_MATERIAL = 10000) + +/datum/design/item/prosfab/pros/l_leg + name = "Prosthetic left leg" + id = "pros_l_leg" + build_path = /obj/item/organ/external/leg + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 15000) + +/datum/design/item/prosfab/pros/l_foot + name = "Prosthetic left foot" + id = "pros_l_foot" + build_path = /obj/item/organ/external/foot + time = 15 + materials = list(DEFAULT_WALL_MATERIAL = 10000) + +/datum/design/item/prosfab/pros/r_arm + name = "Prosthetic right arm" + id = "pros_r_arm" + build_path = /obj/item/organ/external/arm/right + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 18000) + +/datum/design/item/prosfab/pros/r_hand + name = "Prosthetic right hand" + id = "pros_r_hand" + build_path = /obj/item/organ/external/hand/right + time = 15 + materials = list(DEFAULT_WALL_MATERIAL = 10000) + +/datum/design/item/prosfab/pros/r_leg + name = "Prosthetic right leg" + id = "pros_r_leg" + build_path = /obj/item/organ/external/leg/right + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 15000) + +/datum/design/item/prosfab/pros/r_foot + name = "Prosthetic right foot" + id = "pros_r_foot" + build_path = /obj/item/organ/external/foot/right + time = 15 + materials = list(DEFAULT_WALL_MATERIAL = 10000) + +/datum/design/item/prosfab/pros/cell + name = "Prosthetic powercell" + id = "pros_cell" + build_path = /obj/item/organ/internal/cell + time = 15 + materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 4000, "plasteel" = 2000) + req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 2) + +/datum/design/item/prosfab/pros/eyes + name = "Prosthetic eyes" + id = "pros_eyes" + build_path = /obj/item/organ/internal/eyes/robot + time = 15 + materials = list(DEFAULT_WALL_MATERIAL = 7500, "glass" = 7500) + req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 2) + +//////////////////// Cyborg Parts //////////////////// +/datum/design/item/prosfab/cyborg + category = "Cyborg Parts" + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 5000) + +/datum/design/item/prosfab/cyborg/exoskeleton + name = "Robot exoskeleton" + id = "robot_exoskeleton" + build_path = /obj/item/robot_parts/robot_suit + time = 50 + materials = list(DEFAULT_WALL_MATERIAL = 50000) + +/datum/design/item/prosfab/cyborg/torso + name = "Robot torso" + id = "robot_torso" + build_path = /obj/item/robot_parts/chest + time = 35 + materials = list(DEFAULT_WALL_MATERIAL = 40000) + +/datum/design/item/prosfab/cyborg/head + name = "Robot head" + id = "robot_head" + build_path = /obj/item/robot_parts/head + time = 35 + materials = list(DEFAULT_WALL_MATERIAL = 25000) + +/datum/design/item/prosfab/cyborg/l_arm + name = "Robot left arm" + id = "robot_l_arm" + build_path = /obj/item/robot_parts/l_arm + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 18000) + +/datum/design/item/prosfab/cyborg/r_arm + name = "Robot right arm" + id = "robot_r_arm" + build_path = /obj/item/robot_parts/r_arm + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 18000) + +/datum/design/item/prosfab/cyborg/l_leg + name = "Robot left leg" + id = "robot_l_leg" + build_path = /obj/item/robot_parts/l_leg + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 15000) + +/datum/design/item/prosfab/cyborg/r_leg + name = "Robot right leg" + id = "robot_r_leg" + build_path = /obj/item/robot_parts/r_leg + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 15000) + + +//////////////////// Cyborg Internals //////////////////// +/datum/design/item/prosfab/cyborg/component + category = "Cyborg Internals" + build_type = PROSFAB + time = 12 + materials = list(DEFAULT_WALL_MATERIAL = 10000) + +/datum/design/item/prosfab/cyborg/component/binary_communication_device + name = "Binary communication device" + id = "binary_communication_device" + build_path = /obj/item/robot_parts/robot_component/binary_communication_device + +/datum/design/item/prosfab/cyborg/component/radio + name = "Radio" + id = "radio" + build_path = /obj/item/robot_parts/robot_component/radio + +/datum/design/item/prosfab/cyborg/component/actuator + name = "Actuator" + id = "actuator" + build_path = /obj/item/robot_parts/robot_component/actuator + +/datum/design/item/prosfab/cyborg/component/diagnosis_unit + name = "Diagnosis unit" + id = "diagnosis_unit" + build_path = /obj/item/robot_parts/robot_component/diagnosis_unit + +/datum/design/item/prosfab/cyborg/component/camera + name = "Camera" + id = "camera" + build_path = /obj/item/robot_parts/robot_component/camera + +/datum/design/item/prosfab/cyborg/component/armour + name = "Armour plating" + id = "armour" + build_path = /obj/item/robot_parts/robot_component/armour + + +//////////////////// Cyborg Modules //////////////////// +/datum/design/item/prosfab/robot_upgrade + category = "Cyborg Modules" + build_type = PROSFAB + time = 12 + materials = list(DEFAULT_WALL_MATERIAL = 10000) + +/datum/design/item/prosfab/robot_upgrade/rename + name = "Rename module" + desc = "Used to rename a cyborg." + id = "borg_rename_module" + build_path = /obj/item/borg/upgrade/rename + +/datum/design/item/prosfab/robot_upgrade/reset + name = "Reset module" + desc = "Used to reset a cyborg's module. Destroys any other upgrades applied to the robot." + id = "borg_reset_module" + build_path = /obj/item/borg/upgrade/reset + +/datum/design/item/prosfab/robot_upgrade/restart + name = "Emergency restart module" + desc = "Used to force a restart of a disabled-but-repaired robot, bringing it back online." + id = "borg_restart_module" + materials = list(DEFAULT_WALL_MATERIAL = 60000, "glass" = 5000) + build_path = /obj/item/borg/upgrade/restart + +/datum/design/item/prosfab/robot_upgrade/vtec + name = "VTEC module" + desc = "Used to kick in a robot's VTEC systems, increasing their speed." + id = "borg_vtec_module" + materials = list(DEFAULT_WALL_MATERIAL = 80000, "glass" = 6000, "gold" = 5000) + build_path = /obj/item/borg/upgrade/vtec + +/datum/design/item/prosfab/robot_upgrade/tasercooler + name = "Rapid taser cooling module" + desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate." + id = "borg_taser_module" + materials = list(DEFAULT_WALL_MATERIAL = 80000, "glass" = 6000, "gold" = 2000, "diamond" = 500) + build_path = /obj/item/borg/upgrade/tasercooler + +/datum/design/item/prosfab/robot_upgrade/jetpack + name = "Jetpack module" + desc = "A carbon dioxide jetpack suitable for low-gravity mining operations." + id = "borg_jetpack_module" + materials = list(DEFAULT_WALL_MATERIAL = 10000, "phoron" = 15000, "uranium" = 20000) + build_path = /obj/item/borg/upgrade/jetpack + +/datum/design/item/prosfab/robot_upgrade/syndicate + name = "Illegal upgrade" + desc = "Allows for the construction of lethal upgrades for cyborgs." + id = "borg_syndicate_module" + req_tech = list(TECH_COMBAT = 4, TECH_ILLEGAL = 3) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 15000, "diamond" = 10000) + build_path = /obj/item/borg/upgrade/syndicate \ No newline at end of file diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index fc5ca4bcbfe..41c6f6978ce 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -124,7 +124,7 @@ research holder datum. // A simple helper proc to find the name of a tech with a given ID. /proc/CallTechName(var/ID) - for(var/T in subtypes(/datum/tech)) + for(var/T in subtypesof(/datum/tech)) var/datum/tech/check_tech = T if(initial(check_tech.id) == ID) return initial(check_tech.name) diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm index eadd4db655a..ee0dfecb4fd 100644 --- a/code/modules/surgery/limb_reattach.dm +++ b/code/modules/surgery/limb_reattach.dm @@ -21,6 +21,18 @@ min_duration = 50 max_duration = 70 + can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/E = tool + var/obj/item/organ/external/P = target.organs_by_name[E.parent_organ] + if(!P) + user << "There's nothing to attach [E] to!" + return 0 + else if((P.robotic >= ORGAN_ROBOT) && (E.robotic < ORGAN_ROBOT)) + user << "Attaching [E] to [P] wouldn't work well." + return 0 + else + return 1 + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/E = tool user.visible_message("[user] starts attaching [E.name] to [target]'s [E.amputation_point].", \ diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index cc4143658cd..6635753ed92 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -424,6 +424,20 @@ if(M.brainmob && M.brainmob.mind) M.brainmob.mind.transfer_to(target) + spawn(0) //Name yourself on your own damn time + var/new_name = "" + while(!new_name) + if(!target) return + var/try_name = input(target,"Pick a name for your new form!", "New Name", target.name) + var/clean_name = sanitizeName(try_name) + if(clean_name) + var/okay = alert(target,"New name will be '[clean_name]', ok?", "Cancel", "Ok") + if(okay == "Ok") + new_name = clean_name + + target.name = new_name + target.real_name = target.name + fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("[user]'s hand slips.", \ "Your hand slips.") diff --git a/code/modules/xenobio2/machinery/core_extractor.dm b/code/modules/xenobio2/machinery/core_extractor.dm index 818e3e65107..421c8ed22f5 100644 --- a/code/modules/xenobio2/machinery/core_extractor.dm +++ b/code/modules/xenobio2/machinery/core_extractor.dm @@ -112,6 +112,8 @@ var/obj/item/xenoproduct/slime/core/C = new(src) C.traits = occupant.traitdat + C.nameVar = occupant.nameVar + C.create_reagents(C.traits.traits[TRAIT_XENO_CHEMVOL]) for(var/reagent in occupant.traitdat.chems) C.reagents.add_reagent(reagent, occupant.traitdat.chems[reagent]) diff --git a/code/modules/xenobio2/machinery/injector_computer.dm b/code/modules/xenobio2/machinery/injector_computer.dm index d39f791cb7c..f65599e4850 100644 --- a/code/modules/xenobio2/machinery/injector_computer.dm +++ b/code/modules/xenobio2/machinery/injector_computer.dm @@ -60,9 +60,10 @@ data["occupied"] = 1 if(isxeno(injector.occupant)) var/mob/living/simple_animal/xeno/X = injector.occupant - data["instability"] = (X.mut_level / X.mut_max) * 100 + data["compatible"] = 1 + data["instability"] = 100 * (X.mut_level / X.mut_max) else - data["instability"] = null + data["compatible"] = null if(injector.beaker) data["reagentAmount"] = injector.beaker.reagents.total_volume diff --git a/code/modules/xenobio2/machinery/slime_replicator.dm b/code/modules/xenobio2/machinery/slime_replicator.dm index 77b70bc3b86..3626304bfef 100644 --- a/code/modules/xenobio2/machinery/slime_replicator.dm +++ b/code/modules/xenobio2/machinery/slime_replicator.dm @@ -74,6 +74,8 @@ spawn(30) var/mob/living/simple_animal/xeno/slime/S = new(src) S.traitdat = core.traits + S.nameVar = core.nameVar + S.name = "[S.nameVar] baby slime" S.ProcessTraits() qdel(core) spawn(30) diff --git a/code/modules/xenobio2/mob/slime/slime.dm b/code/modules/xenobio2/mob/slime/slime.dm index 8ef1efb5ccc..b214b346306 100644 --- a/code/modules/xenobio2/mob/slime/slime.dm +++ b/code/modules/xenobio2/mob/slime/slime.dm @@ -12,12 +12,12 @@ Slime definitions, Life and New live here. icon_living = "slime adult" icon_dead = "slime adult dead" internal_vol = 200 - mut_max = 200 + mut_max = 50 mutable = COLORMUT var/is_child = 1 var/cores = 3 var/growthcounter = 0 - var/growthpoint = 150 //At what point they grow up. + var/growthpoint = 50 //At what point they grow up. var/shiny = 0 move_to_delay = 17 //Slimes shouldn't be able to go faster than humans. default_chems = list("slimejelly" = 5) diff --git a/code/modules/xenobio2/mob/xeno procs.dm b/code/modules/xenobio2/mob/xeno procs.dm index e0a64ebdd34..e20373c21ce 100644 --- a/code/modules/xenobio2/mob/xeno procs.dm +++ b/code/modules/xenobio2/mob/xeno procs.dm @@ -24,68 +24,66 @@ Procs for targeting starve_damage = traitdat.traits[TRAIT_XENO_STARVEDAMAGE] minbodytemp = T20C - traitdat.traits[TRAIT_XENO_COLDRES] maxbodytemp = T20C + traitdat.traits[TRAIT_XENO_HEATRES] - - if(traitdat.traits[TRAIT_XENO_BIOLUMESCENT]) + + if(traitdat.traits[TRAIT_XENO_BIOLUMESCENT]) set_light(traitdat.traits[TRAIT_XENO_GLOW_RANGE], traitdat.traits[TRAIT_XENO_GLOW_STRENGTH], traitdat.traits[TRAIT_XENO_BIO_COLOR]) else set_light(0, 0, "#000000") //Should kill any light that shouldn't be there. - if(!(chromatic)) + if(chromatic) hostile = 0 //No. No laser-reflecting hostile creatures. Bad. else hostile = traitdat.traits[TRAIT_XENO_HOSTILE] - + speed = traitdat.traits[TRAIT_XENO_SPEED] - + if(traitdat.traits[TRAIT_XENO_CANSPEAK]) speak_chance = traitdat.traits[TRAIT_XENO_SPEAKCHANCE] else speak_chance = 0 - + melee_damage_lower = traitdat.get_trait(TRAIT_XENO_STRENGTH) - traitdat.get_trait(TRAIT_XENO_STR_RANGE) melee_damage_upper = traitdat.traits[TRAIT_XENO_STRENGTH] + traitdat.get_trait(TRAIT_XENO_STR_RANGE) - - - + + + //Metabolism proc, simplified for xenos. Heavily based on botanical metabolism. /mob/living/simple_animal/xeno/proc/handle_reagents() if(!stasis) if(!reagents) return - if(reagents.total_volume <= 0) - return //Let's handle some chemical smoke, for scientific smoke bomb purposes. for(var/obj/effect/effect/smoke/chem/smoke in view(1, src)) if(smoke.reagents.total_volume) smoke.reagents.trans_to_mob(src, 10, CHEM_BLOOD, copy = 1) - + reagents.trans_to_obj(temp_chem_holder, min(reagents.total_volume,rand(1,4))) var/reagent_total var/list/reagent_response = list() for(var/datum/reagent/R in temp_chem_holder.reagents.reagent_list) - + reagent_total = temp_chem_holder.reagents.get_reagent_amount(R.id) - + reagent_response = chemreact[R.id] - + if(reagent_response["toxic"]) adjustToxLoss(reagent_response["toxic"] * reagent_total) - + if(reagent_response["heal"]) heal_overall_damage(reagent_response["heal"] * reagent_total) - + if(reagent_response["nutr"]) nutrition += reagent_response["nutr"] * reagent_total - + if(reagent_response["mut"]) mut_level += reagent_response["mut"] * reagent_total - + temp_chem_holder.reagents.clear_reagents() - + return 1 //Everything worked out okay. - + return 0 - + /mob/living/simple_animal/xeno/proc/Mutate() nameVar = "mutated" if((COLORMUT & mutable)) @@ -95,14 +93,14 @@ Procs for targeting traitdat.traits[TRAIT_XENO_BIO_COLOR] = "#" for(var/i=0, i<6, i++) traitdat.traits[TRAIT_XENO_BIO_COLOR] += pick(hexNums) - + RandomChemicals() //if(SPECIESMUT & mutable) //Placeholder, currently no xenos that have species mutations. RandomizeTraits() ProcessTraits() return 1 - + /mob/living/simple_animal/xeno/proc/RandomizeTraits() return @@ -136,33 +134,34 @@ Procs for targeting // /mob/living/simple_animal/xeno/proc/BuildReagentLists() return - -/mob/living/simple_animal/xeno/attacked_with_item(var/obj/item/O, var/mob/user) + +/mob/living/simple_animal/xeno/bullet_act(var/obj/item/projectile/P) //Shamelessly stolen from ablative armor. - if((traitdat.traits[TRAIT_XENO_CHROMATIC]) && istype(O, /obj/item/projectile/beam)) - var/obj/item/projectile/P = O - visible_message("") + if((traitdat.traits[TRAIT_XENO_CHROMATIC]) && istype(P, /obj/item/projectile/beam)) + visible_message(")\The beam reflects off of the [src]!") // Find a turf near or on the original location to bounce to var/new_x = P.starting.x + pick(0, -1, 1, -2, 2) var/new_y = P.starting.y + pick(0, -1, 1, -2, 2) - var/turf/curloc = get_turf(user) + var/turf/curloc = get_turf(src) // redirect the projectile - P.redirect(new_x, new_y, curloc, user) - return + P.redirect(new_x, new_y, curloc, src) + + return -1 + else ..() - + /mob/living/simple_animal/xeno/proc/RandomChemicals() traitdat.chems.Cut() //Clear the amount first. - + var/num_chems = round(rand(1,4)) var/list/chemchoices = xenoChemList - + for(var/i = 1 to num_chems) var/chemtype = pick(chemchoices) chemchoices -= chemtype var/chemamount = rand(1,5) traitdat.chems[chemtype] = chemamount - + traitdat.chems += default_chems diff --git a/code/modules/xenobio2/mob/xeno_product.dm b/code/modules/xenobio2/mob/xeno_product.dm index 2ea970c89fb..b084b8eea64 100644 --- a/code/modules/xenobio2/mob/xeno_product.dm +++ b/code/modules/xenobio2/mob/xeno_product.dm @@ -9,4 +9,5 @@ Xenobiological product lives here as a basic type. var/datum/xeno/traits/traits var/source = "Unknown" var/product = "mess" + var/nameVar = "blah" \ No newline at end of file diff --git a/code/modules/xenobio2/tools/xeno_trait_scanner.dm b/code/modules/xenobio2/tools/xeno_trait_scanner.dm new file mode 100644 index 00000000000..8063b6071bb --- /dev/null +++ b/code/modules/xenobio2/tools/xeno_trait_scanner.dm @@ -0,0 +1,185 @@ +/obj/item/device/analyzer/xeno_analyzer + name = "exotic biological analyzer" + desc = "A device to investigate the genetic data of a biological target." + var/form_title + var/last_data + +/obj/item/device/analyzer/xeno_analyzer/proc/print_report_verb() + set name = "Print Plant Report" + set category = "Object" + set src = usr + + if(usr.stat || usr.restrained() || usr.lying) + return + print_report(usr) + +/obj/item/device/analyzer/xeno_analyzer/Topic(href, href_list) + if(..()) + return + if(href_list["print"]) + print_report(usr) + +/obj/item/device/analyzer/xeno_analyzer/proc/print_report(var/mob/living/user) + if(!last_data) + user << "There is no scan data to print." + return + var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(src)) + P.name = "paper - [form_title]" + P.info = "[last_data]" + if(istype(user,/mob/living/carbon/human)) + user.put_in_hands(P) + user.visible_message("\The [src] spits out a piece of paper.") + return + +/obj/item/device/analyzer/xeno_analyzer/attack_self(mob/user as mob) + print_report(user) + return 0 + +/obj/item/device/analyzer/xeno_analyzer/afterattack(var/target, mob/user, flag) + if(!flag) return + + var/datum/xeno/traits/trait_info + var/datum/reagents/prod_reagents + var/targetName + var/growth_level + var/growth_max + if(istype(target,/obj/structure/table)) + return ..() + else if(istype(target,/mob/living/simple_animal/xeno)) + + var/mob/living/simple_animal/xeno/X = target + if(istype(X, /mob/living/simple_animal/xeno/slime)) + var/mob/living/simple_animal/xeno/slime/S = X + if(S.is_child) + growth_level = S.growthcounter + growth_max = S.growthpoint + + targetName = X.name + trait_info = X.traitdat + + else if(istype(target,/obj/item/xenoproduct)) + + var/obj/item/xenoproduct/P = target + trait_info = P.traits + targetName = P.name + prod_reagents = P.reagents + + if(!trait_info) + user << "[src] can tell you nothing about \the [target]." + return + + form_title = "[targetName]" + var/dat = "

Biological data for [form_title]

" + user.visible_message("[user] runs the scanner over \the [target].") + + dat += "

General Data

" + + + dat += "Health: [trait_info.get_trait(TRAIT_XENO_HEALTH)]" + + if(prod_reagents && prod_reagents.reagent_list && prod_reagents.reagent_list.len) + dat += "

Reagent Data

" + + dat += "
This sample contains: " + for(var/datum/reagent/R in prod_reagents.reagent_list) + dat += "
- [R.name], [prod_reagents.get_reagent_amount(R.id)] unit(s)" + + dat += "

Other Data

" + + if(trait_info.get_trait(TRAIT_XENO_EATS)) + dat += "This subject requires nutritional intake.
" + + if(trait_info.get_trait(TRAIT_XENO_HUNGER)) + if(trait_info.get_trait(TRAIT_XENO_HUNGER) < 7) + dat += "It appears to have a slower metabolism.
" + else if(trait_info.get_trait(TRAIT_XENO_HUNGER) > 15) + dat += "It appears to have a greater metabolism.
" + else + dat += "It appears to have an average metabolism.
" + + if(trait_info.get_trait(TRAIT_IMMUTABLE) == -1) + dat += "This plant is highly mutable.
" + else if(trait_info.get_trait(TRAIT_IMMUTABLE) > 0) + dat += "This plant does not possess genetics that are alterable.
" + + if(trait_info.get_trait(TRAIT_XENO_HEALTH)) + if(trait_info.get_trait(TRAIT_XENO_HEALTH) < 20) + dat += "It bears characteristics that indicate resilience to damage.
" + else if(trait_info.get_trait(TRAIT_XENO_HEALTH) > 10) + dat += "It bears characteristics that indicate susceptibility to damage.
" + else + dat += "It bears no characters indicating resilience to damage.
" + + if(growth_max) + if(growth_level < 25) + dat += "It appears to be far to growing up.
" + else if(growth_level > 40) + dat += "It appears to be close to growing up.
" + else + dat += "It appears to be growing.
" + else + dat += "It appears to be fully grown.
" + + if(trait_info.get_trait(TRAIT_XENO_COLDRES)) + if(trait_info.get_trait(TRAIT_XENO_COLDRES) < 10) + dat += "It bears characteristics that indicate resilience to colder temperatures.
" + else if(trait_info.get_trait(TRAIT_XENO_COLDRES) > 20) + dat += "It bears characteristics that indicate susceptibility to colder temperatures.
" + + if(trait_info.get_trait(TRAIT_XENO_HEATRES)) + if(trait_info.get_trait(TRAIT_XENO_HEATRES) < 10) + dat += "It bears characteristics that indicate resilience to warmer temperatures.
" + else if(trait_info.get_trait(TRAIT_XENO_HEATRES) > 20) + dat += "It bears characteristics that indicate susceptibility to warmer temperatures.
" + + if(trait_info.get_trait(TRAIT_XENO_SPEED)) + if(trait_info.get_trait(TRAIT_XENO_SPEED) < 0) + dat += "It appears to be agile.
" + else if(trait_info.get_trait(TRAIT_XENO_SPEED) > 0) + dat += "It appears to be slower.
" + + if(trait_info.get_trait(TRAIT_XENO_CANSPEAK)) + dat += "
The subject appears to be able to articulate." + + if(trait_info.get_trait(TRAIT_XENO_SPEAKCHANCE)) + if(trait_info.get_trait(TRAIT_XENO_SPEAKCHANCE) < 10) + dat += "The subject appears to articulate infrequently.
" + else if(trait_info.get_trait(TRAIT_XENO_SPEAKCHANCE) > 20) + dat += "The subject appears to articulate frequently.
" + + if(trait_info.get_trait(TRAIT_XENO_CANLEARN)) + dat += "
The subject appears to have process verbal information." + + if(trait_info.get_trait(TRAIT_XENO_LEARNCHANCE)) + if(trait_info.get_trait(TRAIT_XENO_LEARNCHANCE) < 50) + dat += "The subject appears to comprehend verbal information infrequently.
" + else if(trait_info.get_trait(TRAIT_XENO_LEARNCHANCE) > 51) + dat += "The subject appears to comprehend verbal information frequently.
" + + if(trait_info.get_trait(TRAIT_XENO_STRENGTH) < 5) + dat += "It appears to have lower average physical capacity.
" + else if(trait_info.get_trait(TRAIT_XENO_STRENGTH) > 7) + dat += "It appears to have greater average physical capacity.
" + + if(trait_info.get_trait(TRAIT_XENO_STR_RANGE)) + if(trait_info.get_trait(TRAIT_XENO_STR_RANGE) < 50) + dat += "The subject appears to have more consistent attacks.
" + else if(trait_info.get_trait(TRAIT_XENO_STR_RANGE) > 51) + dat += "The subject appears to have more varied attacks.
" + + if(trait_info.get_trait(TRAIT_XENO_BIOLUMESCENT)) + dat += "
It is [trait_info.get_trait(TRAIT_XENO_BIO_COLOR) ? "bio-luminescent" : "bio-luminescent"]." + + if(trait_info.get_trait(TRAIT_XENO_HOSTILE)) + dat += "
The subject appears to have hostile tendencies." + + if(trait_info.get_trait(TRAIT_XENO_CHROMATIC)) + dat += "
The subject appears to have chromatic particles inside of it." + + + if(dat) + last_data = dat + dat += "

\[print report\]" + user << browse(dat,"window=xeno_analyzer") + + return \ No newline at end of file diff --git a/config/example/config.txt b/config/example/config.txt index ec934298274..ae99ec3d198 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -58,6 +58,9 @@ LOG_ATTACK ## log pda messages LOG_PDA +## log world.log messages +# LOG_WORLD_OUTPUT + ## log all Topic() calls (for use by coders in tracking down Topic issues) # LOG_HREFS diff --git a/html/changelog.html b/html/changelog.html index 5f348af1424..e5cdf2a7a26 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,6 +53,27 @@ -->
+

30 May 2016

+

EmperorJon updated:

+
    +
  • Ports Baystation's setup screen changes, thanks to PsiOmegaDelta.
  • +
  • Includes character preview with toggleable equipment, visible loadout items, ghost character sprites, and custom colour underwear. Your underwear will have reset, so you'll need to set it back.
  • +
+ +

29 May 2016

+

Datraen updated:

+
    +
  • Injecting people with mutationtoxin no longer mutates them into slime people.
  • +
  • Removes amutationtoxin.
  • +
  • Removes slime core recipies.
  • +
  • Adds slime monkey cubes, which are created by injecting monkey cubes with mutationtoxin and activating like a posibrain.
  • +
  • Maps for Xenobio2 research labs/stations.
  • +
+

Zuhayr updated:

+
    +
  • Backend change: allowed accessories to be placed on any clothing item with the appropriate variables set.
  • +
+

27 May 2016

Yoshax updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 091249c1047..c051458c702 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2325,3 +2325,21 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. preference you will need to save your character slot, as there is a problem with satanisiation and it believes the preference is set to disable the nanoui styling. +2016-05-29: + Datraen: + - rscdel: Injecting people with mutationtoxin no longer mutates them into slime + people. + - rscdel: Removes amutationtoxin. + - rscdel: Removes slime core recipies. + - rscadd: Adds slime monkey cubes, which are created by injecting monkey cubes with + mutationtoxin and activating like a posibrain. + - wip: Maps for Xenobio2 research labs/stations. + Zuhayr: + - tweak: 'Backend change: allowed accessories to be placed on any clothing item + with the appropriate variables set.' +2016-05-30: + EmperorJon: + - rscadd: Ports Baystation's setup screen changes, thanks to PsiOmegaDelta. + - rscadd: Includes character preview with toggleable equipment, visible loadout + items, ghost character sprites, and custom colour underwear. Your underwear + will have reset, so you'll need to set it back. diff --git a/html/changelogs/Datraen-Xenobio2Init.yml b/html/changelogs/Datraen-Xenobio2Init.yml deleted file mode 100644 index 98d84e1eb72..00000000000 --- a/html/changelogs/Datraen-Xenobio2Init.yml +++ /dev/null @@ -1,40 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Datraen - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - rscdel: "Injecting people with mutationtoxin no longer mutates them into slime people." - - rscdel: "Removes amutationtoxin." - - rscdel: "Removes slime core recipies." - - rscadd: "Adds slime monkey cubes, which are created by injecting monkey cubes with mutationtoxin and activating like a posibrain." - - wip: "Maps for Xenobio2 research labs/stations." diff --git a/html/changelogs/Datraen-Xenobio2Update2.yml b/html/changelogs/Datraen-Xenobio2Update2.yml new file mode 100644 index 00000000000..7db43469277 --- /dev/null +++ b/html/changelogs/Datraen-Xenobio2Update2.yml @@ -0,0 +1,9 @@ +author: Datraen + + +delete-after: True + +changes: + - rscadd: "Adds a trait tool for Xenobio2. It was supposed to be in the initial implementation, but fell through the cracks, sorry!" + - bugfix: "Fixed the xenobio smartfridge not displaying it's starting core amount." + - bugfix: "Fixed an inverted check with slimes." diff --git a/html/changelogs/Zuhayr-accessorizing.yml b/html/changelogs/Zuhayr-accessorizing.yml deleted file mode 100644 index 88048209879..00000000000 --- a/html/changelogs/Zuhayr-accessorizing.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Zuhayr -delete-after: True -changes: - - tweak: "Backend change: allowed accessories to be placed on any clothing item with the appropriate variables set." - diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index d968c6ed577..daba63e2e9b 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/ghost.dmi b/icons/mob/ghost.dmi index 5f61e7a1e76..34dacd25a35 100644 Binary files a/icons/mob/ghost.dmi and b/icons/mob/ghost.dmi differ diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi index e3b924ee2c7..4ed82dd5ed2 100644 Binary files a/icons/mob/human.dmi and b/icons/mob/human.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/bishop/bishop_alt1.dmi b/icons/mob/human_races/cyberlimbs/bishop/bishop_alt1.dmi new file mode 100644 index 00000000000..e403436daf4 Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/bishop/bishop_alt1.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/bishop.dmi b/icons/mob/human_races/cyberlimbs/bishop/bishop_main.dmi similarity index 100% rename from icons/mob/human_races/cyberlimbs/bishop.dmi rename to icons/mob/human_races/cyberlimbs/bishop/bishop_main.dmi diff --git a/icons/mob/human_races/cyberlimbs/bishop/bishop_monitor.dmi b/icons/mob/human_races/cyberlimbs/bishop/bishop_monitor.dmi new file mode 100644 index 00000000000..edd2236cfb3 Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/bishop/bishop_monitor.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_alt1.dmi b/icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_alt1.dmi new file mode 100644 index 00000000000..3b6daa48bc4 Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_alt1.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/hesphaistos.dmi b/icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_main.dmi similarity index 100% rename from icons/mob/human_races/cyberlimbs/hesphaistos.dmi rename to icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_main.dmi diff --git a/icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_monitor.dmi b/icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_monitor.dmi new file mode 100644 index 00000000000..5f3d72f3fc4 Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_monitor.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/morpheus/morpheus_alt1.dmi b/icons/mob/human_races/cyberlimbs/morpheus/morpheus_alt1.dmi new file mode 100644 index 00000000000..7a0211e603f Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/morpheus/morpheus_alt1.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/ipc.dmi b/icons/mob/human_races/cyberlimbs/morpheus/morpheus_main.dmi similarity index 100% rename from icons/mob/human_races/cyberlimbs/ipc.dmi rename to icons/mob/human_races/cyberlimbs/morpheus/morpheus_main.dmi diff --git a/icons/mob/human_races/cyberlimbs/veymed.dmi b/icons/mob/human_races/cyberlimbs/veymed/veymed_main.dmi similarity index 100% rename from icons/mob/human_races/cyberlimbs/veymed.dmi rename to icons/mob/human_races/cyberlimbs/veymed/veymed_main.dmi diff --git a/icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_alt1.dmi b/icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_alt1.dmi new file mode 100644 index 00000000000..10ea9c95148 Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_alt1.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/wardtakahashi.dmi b/icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_main.dmi similarity index 100% rename from icons/mob/human_races/cyberlimbs/wardtakahashi.dmi rename to icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_main.dmi diff --git a/icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_monitor.dmi b/icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_monitor.dmi new file mode 100644 index 00000000000..2777d06ff81 Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_monitor.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/xion/xion_alt1.dmi b/icons/mob/human_races/cyberlimbs/xion/xion_alt1.dmi new file mode 100644 index 00000000000..84a7fec2a9c Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/xion/xion_alt1.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/xion.dmi b/icons/mob/human_races/cyberlimbs/xion/xion_main.dmi similarity index 100% rename from icons/mob/human_races/cyberlimbs/xion.dmi rename to icons/mob/human_races/cyberlimbs/xion/xion_main.dmi diff --git a/icons/mob/human_races/cyberlimbs/xion/xion_monitor.dmi b/icons/mob/human_races/cyberlimbs/xion/xion_monitor.dmi new file mode 100644 index 00000000000..0a049fc759f Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/xion/xion_monitor.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/zenghu.dmi b/icons/mob/human_races/cyberlimbs/zenghu/zenghu_main.dmi similarity index 100% rename from icons/mob/human_races/cyberlimbs/zenghu.dmi rename to icons/mob/human_races/cyberlimbs/zenghu/zenghu_main.dmi diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi index a1dde7b433d..bab98652cc4 100644 Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi index 105b1fe5a59..e52cd632b04 100644 Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ diff --git a/icons/mob/monitor_icons.dmi b/icons/mob/monitor_icons.dmi index 5dbc224fa30..542ff23fcc7 100644 Binary files a/icons/mob/monitor_icons.dmi and b/icons/mob/monitor_icons.dmi differ diff --git a/icons/mob/screen/midnight.dmi b/icons/mob/screen/midnight.dmi index 8fbf0f1bb0c..68c90e2bf6d 100644 Binary files a/icons/mob/screen/midnight.dmi and b/icons/mob/screen/midnight.dmi differ diff --git a/icons/mob/screen/minimalist.dmi b/icons/mob/screen/minimalist.dmi index 41873de9ca3..7d761f042ea 100644 Binary files a/icons/mob/screen/minimalist.dmi and b/icons/mob/screen/minimalist.dmi differ diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi index aebba434306..33f7790f888 100644 Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi index 9f49187dee0..f3ef480e1a0 100644 Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ diff --git a/icons/obj/furniture.dmi b/icons/obj/furniture.dmi index 952fc829fab..39dbbdcc677 100644 Binary files a/icons/obj/furniture.dmi and b/icons/obj/furniture.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 615be07ebf5..53836c99c5e 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/robotics.dmi b/icons/obj/robotics.dmi index c53e7823cab..85d5a8d0a0b 100644 Binary files a/icons/obj/robotics.dmi and b/icons/obj/robotics.dmi differ diff --git a/maps/polaris-1.dmm b/maps/polaris-1.dmm index 94cdb344d04..aac45cef297 100644 --- a/maps/polaris-1.dmm +++ b/maps/polaris-1.dmm @@ -155,7 +155,7 @@ "acY" = (/obj/structure/closet,/obj/item/device/flashlight,/obj/effect/decal/cleanable/cobweb2,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/library) "acZ" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/maintenance/library) "ada" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor,/area/maintenance/locker) -"adb" = (/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 0},/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/library_conference_room) +"adb" = (/obj/machinery/photocopier,/turf/simulated/floor/lino,/area/chapel/office) "adc" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled/dark,/area/chapel/chapel_morgue) "add" = (/turf/simulated/wall,/area/maintenance/library) "ade" = (/turf/space,/area/shuttle/escape_pod1/station) @@ -258,7 +258,7 @@ "aeX" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/tiled,/area/crew_quarters/locker) "aeY" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/tiled,/area/crew_quarters/locker) "aeZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/security_starboard) -"afa" = (/obj/machinery/door/window{dir = 8; name = "Mass Driver"; req_access = list(22)},/obj/machinery/mass_driver{dir = 4; id = "chapelgun"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/airlock_sensor{pixel_y = 25},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/chapel/chapel_morgue) +"afa" = (/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 0},/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/library_conference_room) "afb" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/wood,/area/library_conference_room) "afc" = (/turf/simulated/floor/wood,/area/library_conference_room) "afd" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/library_conference_room) @@ -395,7 +395,7 @@ "ahE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/library) "ahF" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/carpet,/area/library) "ahG" = (/obj/machinery/sleep_console,/obj/effect/floor_decal/corner/paleblue{dir = 5},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled/white,/area/medical/first_aid_station_starboard) -"ahH" = (/obj/machinery/photocopier,/turf/simulated/floor/lino,/area/chapel/office) +"ahH" = (/obj/machinery/sleeper{dir = 8},/obj/effect/floor_decal/corner/paleblue/full{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/first_aid_station_starboard) "ahI" = (/obj/structure/sign/redcross{name = "FirstAid"},/turf/simulated/wall,/area/medical/first_aid_station_starboard) "ahJ" = (/obj/effect/floor_decal/corner/paleblue/full{dir = 1},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 28},/turf/simulated/floor/tiled/white,/area/medical/first_aid_station_starboard) "ahK" = (/obj/structure/bed/chair,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/civilian_hallway_fore) @@ -513,7 +513,7 @@ "ajS" = (/obj/structure/table/steel,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/tiled,/area/janitor) "ajT" = (/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/machinery/requests_console{department = "Janitorial"; departmentType = 1; pixel_y = 28},/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table/steel,/obj/item/weapon/storage/box/mousetraps,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/tiled,/area/janitor) "ajU" = (/obj/machinery/vending/coffee,/turf/simulated/floor/wood,/area/library) -"ajV" = (/obj/machinery/dnaforensics,/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/tiled/white,/area/security/detectives_office) +"ajV" = (/obj/structure/table/woodentable,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/carpet,/area/crew_quarters/recreation_area) "ajW" = (/obj/structure/morgue,/turf/simulated/floor/tiled/dark,/area/chapel/chapel_morgue) "ajX" = (/obj/structure/table/woodentable,/obj/item/weapon/coin/silver,/obj/machinery/ai_status_display{pixel_y = 32},/obj/machinery/camera/network/civilian{c_tag = "CIV - Recreation Area Fore"; dir = 2},/obj/item/clothing/glasses/threedglasses,/turf/simulated/floor/carpet,/area/crew_quarters/recreation_area) "ajY" = (/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/obj/structure/closet/jcloset,/turf/simulated/floor/tiled,/area/janitor) @@ -539,7 +539,7 @@ "aks" = (/obj/structure/closet,/obj/item/weapon/beach_ball,/turf/simulated/floor,/area/maintenance/pool) "akt" = (/obj/structure/closet/toolcloset,/turf/simulated/floor/tiled,/area/storage/tools) "aku" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/random/tech_supply,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/storage/tools) -"akv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/machinery/door/airlock/glass{name = "Auxiliary Tool Storage"; req_access = list(12)},/turf/simulated/floor/tiled,/area/storage/tools) +"akv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/airlock/glass{name = "Auxiliary Tool Storage"; req_access = list(12)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/storage/tools) "akw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/storage/tools) "akx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/storage/tools) "aky" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/storage/tools) @@ -549,7 +549,7 @@ "akC" = (/obj/effect/decal/cleanable/generic,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/locker) "akD" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/maintenance/pool) "akE" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/dark,/area/chapel/chapel_morgue) -"akF" = (/obj/machinery/camera/network/security{c_tag = "SEC - Forensic Office"; dir = 8},/obj/machinery/photocopier,/turf/simulated/floor/tiled/freezer,/area/security/detectives_office) +"akF" = (/obj/machinery/door/window{dir = 8; name = "Mass Driver"; req_access = list(22)},/obj/machinery/mass_driver{dir = 4; id = "chapelgun"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/airlock_sensor{pixel_y = 25},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/chapel/chapel_morgue) "akG" = (/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/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/chapel/chapel_morgue) "akH" = (/obj/machinery/door/blast/regular{id = "chapelgun"; name = "Chapel Launcher Door"},/turf/simulated/floor/plating,/area/chapel/chapel_morgue) "akI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light/small,/turf/simulated/floor,/area/maintenance/pool) @@ -566,7 +566,7 @@ "akT" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/machinery/light_switch{pixel_x = -26; pixel_y = 0},/obj/structure/cable,/turf/simulated/floor/tiled,/area/storage/tools) "akU" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled,/area/storage/tools) "akV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/storage/tools) -"akW" = (/obj/structure/table/standard,/obj/machinery/recharger,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/effect/floor_decal/corner/red{dir = 5},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/item/weapon/storage/box/donut,/turf/simulated/floor/tiled,/area/security/main) +"akW" = (/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/structure/table/steel,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/tiled,/area/storage/tools) "akX" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) "akY" = (/obj/machinery/space_heater,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) "akZ" = (/obj/machinery/atmospherics/binary/pump/high_power/on{dir = 4; name = "Pump station in"; target_pressure = 4500},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) @@ -687,7 +687,7 @@ "ank" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/security/detectives_office) "anl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/security/detectives_office) "anm" = (/obj/structure/table/reinforced,/obj/item/device/mass_spectrometer/adv,/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/item/device/reagent_scanner,/obj/item/weapon/reagent_containers/syringe,/turf/simulated/floor/tiled/white,/area/security/detectives_office) -"ann" = (/obj/effect/floor_decal/corner/red{dir = 5},/obj/machinery/photocopier,/turf/simulated/floor/tiled,/area/security/main) +"ann" = (/obj/machinery/dnaforensics,/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/tiled/white,/area/security/detectives_office) "ano" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/cable/green,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/security/detectives_office) "anp" = (/obj/structure/bed/chair{dir = 1},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/structure/closet/walllocker/emerglocker{pixel_x = -28},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station) "anq" = (/obj/structure/bed/chair{dir = 1},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/structure/closet/walllocker/emerglocker{pixel_x = -28},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod2/station) @@ -706,7 +706,7 @@ "anD" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/camera/network/medbay{c_tag = "MED - Virology Access Hallway"; dir = 1},/obj/machinery/alarm{dir = 1; pixel_y = -25},/turf/simulated/floor/tiled,/area/medical/virologyaccess) "anE" = (/obj/machinery/door/airlock/maintenance{name = "Resturant Maintenance"; req_one_access = list(12,28,35)},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/central) "anF" = (/obj/machinery/vending/tool,/turf/simulated/floor/tiled,/area/storage/primary) -"anG" = (/obj/machinery/sleeper{dir = 8},/obj/effect/floor_decal/corner/paleblue/full{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/first_aid_station_starboard) +"anG" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/recharge_station,/turf/simulated/floor/tiled,/area/assembly/chargebay) "anH" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/hallway/primary/central_four) "anI" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/plating,/area/hallway/primary/central_four) "anJ" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor,/area/maintenance/central) @@ -718,7 +718,7 @@ "anP" = (/obj/effect/floor_decal/chapel{tag = "icon-chapel (NORTH)"; icon_state = "chapel"; dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/dark,/area/chapel/main) "anQ" = (/obj/effect/floor_decal/chapel{tag = "icon-chapel (EAST)"; icon_state = "chapel"; dir = 4},/turf/simulated/floor/tiled/dark,/area/chapel/main) "anR" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled/dark,/area/chapel/main) -"anS" = (/obj/machinery/recharge_station,/obj/effect/floor_decal/corner/red/full{dir = 4},/turf/simulated/floor/tiled,/area/security/brig) +"anS" = (/obj/machinery/recharge_station,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/status_display{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/tiled/neutral,/area/crew_quarters/cafeteria) "anT" = (/turf/simulated/floor/tiled,/area/maintenance/chapel) "anU" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/maintenance/chapel) "anV" = (/obj/machinery/alarm{pixel_y = 22},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/maintenance/chapel) @@ -937,7 +937,7 @@ "asa" = (/obj/machinery/status_display{pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/structure/closet{name = "Evidence Closet"},/obj/item/weapon/storage/box/gloves,/obj/item/weapon/storage/box/evidence,/obj/item/weapon/storage/box/bodybags,/turf/simulated/floor/tiled/freezer,/area/security/detectives_office) "asb" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/tiled/freezer,/area/security/detectives_office) "asc" = (/obj/machinery/light,/obj/machinery/chem_master,/turf/simulated/floor/tiled/freezer,/area/security/detectives_office) -"asd" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Security's Desk"; departmentType = 5; name = "Head of Security RC"; pixel_x = 0; pixel_y = 30},/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 4},/obj/item/weapon/reagent_containers/food/drinks/flask/barflask{pixel_x = -4; pixel_y = 8},/obj/item/device/taperecorder{pixel_y = 0},/obj/item/device/megaphone,/obj/item/device/radio/off,/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos) +"asd" = (/obj/machinery/camera/network/security{c_tag = "SEC - Forensic Office"; dir = 8},/obj/machinery/photocopier,/turf/simulated/floor/tiled/freezer,/area/security/detectives_office) "ase" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/plating,/area/storage/emergency_storage/emergency5) "asf" = (/obj/structure/table/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/storage/emergency_storage/emergency5) "asg" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/obj/item/device/communicator,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) @@ -1012,8 +1012,8 @@ "atx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/security/main) "aty" = (/obj/effect/floor_decal/corner/red{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment,/obj/structure/table/standard,/obj/machinery/chemical_dispenser/bar_soft/full,/obj/item/weapon/storage/box/drinkingglasses,/turf/simulated/floor/tiled,/area/security/main) "atz" = (/obj/structure/table/standard,/obj/machinery/cell_charger,/obj/item/weapon/screwdriver{pixel_y = 15},/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/tiled,/area/security/main) -"atA" = (/obj/structure/table/standard,/obj/structure/reagent_dispensers/peppertank{pixel_x = 30},/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = -28},/obj/effect/floor_decal/corner/red/full{dir = 4},/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/turf/simulated/floor/tiled,/area/security/security_lockerroom) -"atB" = (/obj/structure/table/standard,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = -28},/obj/item/clothing/accessory/badge/holo,/obj/item/clothing/accessory/badge/holo,/obj/item/clothing/accessory/badge/holo/cord,/obj/effect/floor_decal/corner/red/full,/turf/simulated/floor/tiled,/area/security/security_lockerroom) +"atA" = (/obj/structure/table/standard,/obj/machinery/recharger,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/effect/floor_decal/corner/red{dir = 5},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/item/weapon/storage/box/donut,/turf/simulated/floor/tiled,/area/security/main) +"atB" = (/obj/effect/floor_decal/corner/red{dir = 5},/obj/machinery/photocopier,/turf/simulated/floor/tiled,/area/security/main) "atC" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/tiled,/area/security/main) "atD" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/security/security_lockerroom) "atE" = (/obj/structure/closet/secure_closet/security,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/clothing/glasses/hud/security,/turf/simulated/floor/tiled,/area/security/security_lockerroom) @@ -1039,7 +1039,7 @@ "atY" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled,/area/crew_quarters/locker) "atZ" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/tiled,/area/crew_quarters/locker) "aua" = (/obj/machinery/light,/turf/simulated/floor/tiled,/area/crew_quarters/locker) -"aub" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "Head of Security"},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos) +"aub" = (/obj/machinery/recharge_station,/turf/simulated/floor/tiled,/area/crew_quarters/locker) "auc" = (/obj/machinery/lapvend,/turf/simulated/floor/tiled,/area/storage/primary) "aud" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/locker/locker_toilet) "aue" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/light_switch{pixel_x = 11; pixel_y = 24},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/locker/locker_toilet) @@ -1092,7 +1092,7 @@ "auZ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/structure/bed/chair,/turf/simulated/floor/tiled,/area/security/interrogation) "ava" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/red{dir = 8},/turf/simulated/floor/tiled,/area/security/brig) "avb" = (/obj/effect/floor_decal/corner/red,/turf/simulated/floor/tiled,/area/security/brig) -"avc" = (/obj/machinery/photocopier,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = -28},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos) +"avc" = (/obj/machinery/recharge_station,/obj/effect/floor_decal/corner/red/full{dir = 4},/turf/simulated/floor/tiled,/area/security/brig) "avd" = (/turf/simulated/wall,/area/security/evidence_storage) "ave" = (/obj/machinery/door/airlock/security{name = "Evidence Storage"; req_access = list(1)},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/dark,/area/security/evidence_storage) "avf" = (/turf/simulated/wall,/area/crew_quarters/heads/hos) @@ -1133,7 +1133,7 @@ "avO" = (/obj/effect/floor_decal/corner/red{dir = 6},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled,/area/security/brig) "avP" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/dark,/area/security/evidence_storage) "avQ" = (/obj/structure/closet{name = "Evidence Closet"},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/evidence_storage) -"avR" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/recharger/wallcharger{pixel_x = 32; pixel_y = -4},/turf/simulated/floor/tiled/dark,/area/security/armoury) +"avR" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Security's Desk"; departmentType = 5; name = "Head of Security RC"; pixel_x = 0; pixel_y = 30},/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 4},/obj/item/weapon/reagent_containers/food/drinks/flask/barflask{pixel_x = -4; pixel_y = 8},/obj/item/device/taperecorder{pixel_y = 0},/obj/item/device/megaphone,/obj/item/device/radio/off,/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos) "avS" = (/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos) "avT" = (/turf/simulated/floor/carpet,/area/crew_quarters/heads/hos) "avU" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/crew_quarters/heads/hos) @@ -1165,9 +1165,9 @@ "awu" = (/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/firealarm{dir = 4; pixel_x = 26},/obj/structure/table/glass,/turf/simulated/floor/tiled,/area/crew_quarters/sleep/elevator) "awv" = (/obj/machinery/vending/fitness,/turf/simulated/floor/lino,/area/hallway/secondary/entry/docking_lounge) "aww" = (/obj/machinery/vending/fitness,/turf/simulated/floor/tiled,/area/crew_quarters/locker) -"awx" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/light_switch{pixel_x = 14; pixel_y = 24},/obj/machinery/photocopier,/turf/simulated/floor/tiled/dark,/area/security/warden) -"awy" = (/obj/structure/table/reinforced,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 26},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/camera/network/security{c_tag = "SEC - Warden's Office"},/obj/item/weapon/crowbar,/obj/item/device/radio/off,/obj/item/weapon/wrench,/obj/item/device/retail_scanner/security,/turf/simulated/floor/tiled/dark,/area/security/warden) -"awz" = (/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = 30},/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{department = "Warden's Office"},/turf/simulated/floor/tiled/dark,/area/security/warden) +"awx" = (/obj/machinery/conveyor{dir = 4; id = "garbage"},/obj/machinery/light/small{dir = 1},/obj/structure/plasticflaps/mining,/turf/simulated/floor,/area/maintenance/disposal) +"awy" = (/obj/machinery/conveyor{dir = 2; id = "garbage"},/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor,/area/maintenance/disposal) +"awz" = (/obj/effect/floor_decal/industrial/loading,/obj/machinery/door/firedoor/border_only,/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=2"; freq = 1400; location = "Command"},/turf/simulated/floor/tiled,/area/bridge_hallway) "awA" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/camera/network/security{c_tag = "SEC - Interrogation"},/turf/simulated/floor/tiled/dark,/area/security/interrogation) "awB" = (/obj/structure/bed/chair,/turf/simulated/floor/tiled/dark,/area/security/interrogation) "awC" = (/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/tiled/dark,/area/security/interrogation) @@ -1189,8 +1189,8 @@ "awS" = (/obj/effect/floor_decal/corner/red,/obj/machinery/camera/network/security{c_tag = "SEC - Briefing"; dir = 8},/turf/simulated/floor/tiled,/area/security/main) "awT" = (/obj/structure/closet/secure_closet/security,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/clothing/glasses/hud/security,/turf/simulated/floor/tiled,/area/security/security_lockerroom) "awU" = (/obj/structure/closet/secure_closet/security,/obj/machinery/light,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/clothing/glasses/hud/security,/turf/simulated/floor/tiled,/area/security/security_lockerroom) -"awV" = (/obj/machinery/recharger/wallcharger{pixel_x = 32; pixel_y = -4},/turf/simulated/floor/tiled/dark,/area/security/armoury) -"awW" = (/obj/structure/table/woodentable,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/carpet,/area/crew_quarters/recreation_area) +"awV" = (/obj/structure/table/standard,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = -28},/obj/item/clothing/accessory/badge/holo,/obj/item/clothing/accessory/badge/holo,/obj/item/clothing/accessory/badge/holo/cord,/obj/effect/floor_decal/corner/red/full,/turf/simulated/floor/tiled,/area/security/security_lockerroom) +"awW" = (/obj/structure/table/standard,/obj/structure/reagent_dispensers/peppertank{pixel_x = 30},/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = -28},/obj/effect/floor_decal/corner/red/full{dir = 4},/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/turf/simulated/floor/tiled,/area/security/security_lockerroom) "awX" = (/obj/structure/curtain/open/shower/security,/obj/machinery/shower{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/northleft{name = "Shower"; req_access = list()},/turf/simulated/floor/tiled/freezer,/area/security/security_bathroom) "awY" = (/obj/structure/curtain/open/shower/security,/obj/machinery/shower{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/northright{dir = 1; name = "Shower"; req_access = list()},/turf/simulated/floor/tiled/freezer,/area/security/security_bathroom) "awZ" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{brightness_color = "#DA0205"; brightness_power = 1; brightness_range = 5},/turf/simulated/floor/tiled/freezer,/area/security/security_bathroom) @@ -1202,8 +1202,8 @@ "axf" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/civilian_hallway_aft) "axg" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/civilian_hallway_aft) "axh" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/civilian_hallway_aft) -"axi" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 26},/obj/effect/floor_decal/corner/red{dir = 1},/turf/simulated/floor/tiled,/area/security/brig) -"axj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 26},/obj/effect/floor_decal/corner/red{dir = 4},/turf/simulated/floor/tiled,/area/security/brig) +"axi" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled,/area/bridge_hallway) +"axj" = (/obj/effect/floor_decal/corner/blue{dir = 9},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/window/southleft{base_state = "left"; dir = 2; icon_state = "left"; name = "Command Delivery"; req_access = list(19)},/turf/simulated/floor/tiled,/area/bridge_hallway) "axk" = (/obj/machinery/camera/network/northern_star{c_tag = "Hall - Civilian Aft Starboard 2"; dir = 2},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/civilian_hallway_aft) "axl" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_aft) "axm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_aft) @@ -1211,7 +1211,7 @@ "axo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/chapel_hallway) "axp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/chapel_hallway) "axq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/secondary/chapel_hallway) -"axr" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/washing_machine,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/security/prison) +"axr" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/pros_fabricator,/turf/simulated/floor/tiled,/area/assembly/robotics) "axs" = (/turf/simulated/wall/r_wall,/area/security/security_equiptment_storage) "axt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/light/small{dir = 8},/obj/item/device/radio/intercom/interrogation{dir = 8; pixel_x = -22},/turf/simulated/floor/tiled/dark,/area/security/interrogation) "axu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/obj/item/device/taperecorder,/turf/simulated/floor/tiled/dark,/area/security/interrogation) @@ -1221,7 +1221,7 @@ "axy" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/camera/network/security{c_tag = "SEC - Brig Fore Hallway 2"; dir = 8},/turf/simulated/floor/tiled,/area/security/brig) "axz" = (/turf/simulated/floor/tiled/dark,/area/security/evidence_storage) "axA" = (/obj/structure/closet{name = "Evidence Closet"},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/evidence_storage) -"axB" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{anchored = 0; department = "Internal Affairs"},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled/dark,/area/lawoffice) +"axB" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "Head of Security"},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos) "axC" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos) "axD" = (/obj/structure/table/woodentable,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/device/flashlight/lamp/green{dir = 2; pixel_x = 10; pixel_y = 12},/turf/simulated/floor/carpet,/area/crew_quarters/heads/hos) "axE" = (/obj/structure/table/woodentable,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/item/weapon/stamp/hos,/turf/simulated/floor/carpet,/area/crew_quarters/heads/hos) @@ -1240,35 +1240,18 @@ "axR" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_aft) "axS" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_aft) "axT" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_aft) -"axU" = (/obj/machinery/photocopier,/obj/machinery/ai_status_display{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/lawoffice) "axV" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_aft) -"axW" = (/obj/structure/table/reinforced,/obj/machinery/recharger/wallcharger{pixel_x = 32; pixel_y = -4},/obj/item/clothing/ears/earmuffs{pixel_x = -3; pixel_y = -2},/obj/item/clothing/ears/earmuffs,/obj/item/clothing/ears/earmuffs,/turf/simulated/floor/tiled,/area/security/range) -"axX" = (/obj/structure/table/reinforced,/obj/machinery/recharger/wallcharger{pixel_x = 32; pixel_y = -4},/obj/item/clothing/glasses/sunglasses,/obj/item/clothing/glasses/sunglasses{pixel_x = 3; pixel_y = 3},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/tiled,/area/security/range) -"axY" = (/obj/structure/table/steel,/obj/machinery/microwave,/turf/simulated/floor/tiled,/area/security/prison) -"axZ" = (/obj/structure/table/standard,/obj/machinery/recharger,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/tiled,/area/storage/art) -"aya" = (/obj/machinery/recharge_station,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/recreation_area_restroom) -"ayb" = (/obj/machinery/sleeper{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station) -"ayc" = (/obj/machinery/washing_machine,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/recreation_area_restroom) "ayd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_aft) "aye" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/tiled,/area/hallway/secondary/chapel_hallway) "ayf" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/chapel_hallway) "ayg" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/tiled,/area/hallway/secondary/chapel_hallway) "ayh" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/chapel_hallway) "ayi" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera/network/northern_star{c_tag = "Hall - Chapel Access Port"; dir = 2},/turf/simulated/floor/tiled,/area/hallway/secondary/chapel_hallway) -"ayj" = (/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/structure/table/steel,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/tiled,/area/storage/tools) -"ayk" = (/obj/machinery/recharge_station,/turf/simulated/floor/bluegrid,/area/ai_cyborg_station) -"ayl" = (/obj/machinery/recharge_station,/obj/machinery/camera/network/command{c_tag = "AI - Cyborg Station"; dir = 1},/turf/simulated/floor/bluegrid,/area/ai_cyborg_station) "aym" = (/turf/simulated/floor/tiled,/area/hallway/secondary/chapel_hallway) -"ayn" = (/obj/machinery/teleport/hub,/turf/simulated/floor/tiled/dark,/area/teleporter) -"ayo" = (/obj/machinery/teleport/station,/turf/simulated/floor/tiled/dark,/area/teleporter) "ayp" = (/obj/structure/closet/emcloset,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/chapel_hallway) -"ayq" = (/obj/structure/table/standard,/obj/machinery/recharger{pixel_y = 0},/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) "ayr" = (/obj/machinery/deployable/barrier,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/security/security_equiptment_storage) -"ays" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/medical/cryo) "ayt" = (/obj/structure/table/rack,/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 28},/turf/simulated/floor/tiled,/area/security/security_equiptment_storage) "ayu" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/seccarts{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled,/area/security/security_equiptment_storage) -"ayv" = (/obj/machinery/r_n_d/server/robotics,/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server) -"ayw" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer_1"; use_power = 1; power_setting = 20; set_temperature = 73},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled/dark,/area/server) "ayx" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled/dark,/area/security/interrogation) "ayy" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/tiled/dark,/area/security/interrogation) "ayz" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/dark,/area/security/interrogation) @@ -1276,7 +1259,6 @@ "ayB" = (/obj/structure/filingcabinet/filingcabinet,/obj/machinery/light_switch{pixel_x = 0; pixel_y = -26},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/dark,/area/security/evidence_storage) "ayC" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled/dark,/area/security/evidence_storage) "ayD" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/table/standard,/obj/machinery/camera/network/security{c_tag = "SEC - Evidence Storage"; dir = 8},/obj/item/weapon/storage/laundry_basket,/turf/simulated/floor/tiled/dark,/area/security/evidence_storage) -"ayE" = (/obj/machinery/washing_machine,/obj/effect/floor_decal/corner/lime/full{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/virology) "ayF" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos) "ayG" = (/obj/structure/bed/chair/comfy/black{dir = 1},/obj/effect/landmark/start{name = "Head of Security"},/obj/machinery/button/remote/airlock{id = "HoSdoor"; name = "Office Door"; pixel_x = -36; pixel_y = 29},/obj/machinery/button/windowtint{pixel_x = -26; pixel_y = 30},/obj/machinery/button/remote/blast_door{id = "security_lockdown"; name = "Brig Lockdown"; pixel_x = -36; pixel_y = 39; req_access = list(2)},/turf/simulated/floor/carpet,/area/crew_quarters/heads/hos) "ayH" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos) @@ -1321,15 +1303,6 @@ "azu" = (/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/tiled,/area/hallway/secondary/chapel_hallway) "azv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/chapel_hallway) "azw" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/chapel_hallway) -"azx" = (/obj/machinery/r_n_d/server/core,/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server) -"azy" = (/obj/machinery/autolathe,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/dark,/area/rnd/lab) -"azz" = (/obj/machinery/washing_machine,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) -"azA" = (/obj/item/weapon/stock_parts/console_screen,/obj/structure/table/standard,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/obj/effect/floor_decal/corner/purple/full{dir = 1},/obj/machinery/firealarm{dir = 4; layer = 3.3; pixel_x = 26},/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/tiled/white,/area/rnd/lab) -"azB" = (/obj/machinery/recharge_station,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/sleeper) -"azC" = (/obj/effect/floor_decal/corner/purple{dir = 6},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 28},/obj/structure/table/standard,/obj/machinery/recharger,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled/white,/area/rnd/research) -"azD" = (/obj/machinery/r_n_d/destructive_analyzer,/turf/simulated/floor/tiled,/area/rnd/lab) -"azE" = (/obj/machinery/r_n_d/protolathe,/turf/simulated/floor/tiled,/area/rnd/lab) -"azF" = (/obj/machinery/r_n_d/circuit_imprinter,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric,/turf/simulated/floor/tiled,/area/rnd/lab) "azG" = (/turf/space,/area/syndicate_station/northwest) "azH" = (/turf/simulated/floor/tiled,/area/security/security_equiptment_storage) "azI" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled,/area/security/security_equiptment_storage) @@ -1353,7 +1326,6 @@ "aAa" = (/obj/machinery/atmospherics/valve,/turf/simulated/floor,/area/security/riot_control) "aAb" = (/turf/simulated/floor,/area/security/riot_control) "aAc" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor,/area/security/riot_control) -"aAd" = (/obj/structure/table/standard,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/effect/floor_decal/corner/lime/full{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/virology) "aAe" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "security_lockdown"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor,/area/maintenance/security_starboard) "aAf" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor,/area/maintenance/security_starboard) "aAg" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor,/area/maintenance/security_starboard) @@ -1379,22 +1351,15 @@ "aAA" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/chapel_hallway) "aAB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/turf/simulated/floor/tiled,/area/hallway/secondary/chapel_hallway) "aAC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/tiled,/area/hallway/secondary/chapel_hallway) -"aAD" = (/obj/structure/table/glass,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/wood,/area/rnd/research) -"aAE" = (/obj/machinery/photocopier,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/reception) -"aAF" = (/obj/machinery/bodyscanner{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/sleeper) -"aAG" = (/obj/machinery/conveyor{dir = 4; id = "garbage"},/obj/machinery/light/small{dir = 1},/obj/structure/plasticflaps{opacity = 0},/turf/simulated/floor,/area/maintenance/disposal) -"aAH" = (/obj/effect/decal/cleanable/cobweb2,/obj/machinery/conveyor{dir = 4; id = "garbage"},/turf/simulated/floor,/area/maintenance/disposal) -"aAI" = (/obj/machinery/conveyor{dir = 4; id = "garbage"},/obj/structure/sign/vacuum{pixel_x = 0; pixel_y = 32},/turf/simulated/floor,/area/maintenance/disposal) "aAJ" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/chapel) -"aAK" = (/obj/machinery/clonepod{biomass = 600},/obj/effect/floor_decal/corner/mauve/full,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) "aAL" = (/turf/simulated/wall/r_wall,/area/security/armoury) "aAM" = (/obj/structure/closet/bombclosetsecurity,/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/window/reinforced,/turf/simulated/floor/tiled,/area/security/security_equiptment_storage) "aAN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/security/security_equiptment_storage) "aAO" = (/obj/machinery/computer/prisoner,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/warden) "aAP" = (/obj/structure/filingcabinet/chestdrawer,/obj/effect/floor_decal/industrial/outline/grey,/obj/item/device/radio/intercom{broadcasting = 0; dir = 1; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/tiled/dark,/area/security/warden) -"aAQ" = (/obj/machinery/mass_driver{dir = 1; id = "trash"},/turf/simulated/floor/airless,/area/maintenance/disposal) -"aAR" = (/obj/machinery/conveyor{dir = 2; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal) -"aAS" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/obj/machinery/conveyor{dir = 2; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal) +"aAQ" = (/obj/structure/table/reinforced,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 26},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/camera/network/security{c_tag = "SEC - Warden's Office"},/obj/item/weapon/crowbar,/obj/item/device/radio/off,/obj/item/weapon/wrench,/obj/item/device/retail_scanner/security,/turf/simulated/floor/tiled/dark,/area/security/warden) +"aAR" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/light_switch{pixel_x = 14; pixel_y = 24},/obj/machinery/photocopier,/turf/simulated/floor/tiled/dark,/area/security/warden) +"aAS" = (/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = 30},/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{department = "Warden's Office"},/turf/simulated/floor/tiled/dark,/area/security/warden) "aAT" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/folder/red,/obj/item/weapon/pen,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled/dark,/area/security/warden) "aAU" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/red{dir = 9},/turf/simulated/floor/tiled,/area/security/brig) "aAV" = (/obj/effect/floor_decal/corner/red{dir = 6},/turf/simulated/floor/tiled,/area/security/brig) @@ -1574,7 +1539,7 @@ "aEn" = (/obj/structure/disposalpipe/segment,/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_aft) "aEo" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/maintenance/holodeck) "aEp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/recreation_area_hallway) -"aEq" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/sleeper) +"aEq" = (/obj/machinery/photocopier,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = -28},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos) "aEr" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area_hallway) "aEs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area_hallway) "aEt" = (/obj/machinery/camera/network/northern_star{c_tag = "Hall - Recreation Fore"; dir = 4},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area_hallway) @@ -1593,7 +1558,6 @@ "aEG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/escape/medical_escape_pod_hallway) "aEH" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/machinery/door/window/brigdoor/northleft{name = "Weapons locker"; req_access = list(2)},/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/gun/projectile/colt/detective,/obj/item/weapon/gun/projectile/colt/detective,/obj/item/weapon/gun/projectile/colt/detective,/obj/item/weapon/gun/projectile/colt/detective,/turf/simulated/floor/tiled,/area/security/security_equiptment_storage) "aEI" = (/obj/machinery/disposal,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/disposalpipe/trunk,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/warden) -"aEJ" = (/obj/machinery/conveyor{dir = 2; id = "garbage"},/turf/simulated/floor,/area/maintenance/disposal) "aEK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/security_equiptment_storage) "aEL" = (/obj/machinery/computer/security{pixel_y = 0},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/warden) "aEM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/security/warden) @@ -1633,9 +1597,7 @@ "aFu" = (/obj/structure/flora/pottedplant{icon_state = "plant-22"},/turf/simulated/floor/carpet,/area/crew_quarters/recreation_area) "aFv" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/carpet,/area/crew_quarters/recreation_area) "aFw" = (/obj/machinery/computer/arcade,/turf/simulated/floor/carpet,/area/crew_quarters/recreation_area) -"aFx" = (/obj/machinery/photocopier,/obj/effect/floor_decal/corner/paleblue{dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "aFy" = (/obj/structure/table/woodentable,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/item/device/paicard,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/carpet,/area/crew_quarters/recreation_area) -"aFz" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{department = "CMO's Office"},/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/machinery/light,/obj/machinery/camera/network/medbay{c_tag = "MED - CMO"; dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "aFA" = (/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/carpet,/area/crew_quarters/recreation_area) "aFB" = (/obj/structure/closet/athletic_mixed,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool) "aFC" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool) @@ -1653,7 +1615,6 @@ "aFO" = (/obj/machinery/door/blast/regular{id = "Armoury"; name = "Emergency Access"},/turf/simulated/floor/tiled,/area/security/armoury) "aFP" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/tiled,/area/security/brig) "aFQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/brig) -"aFR" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/medical/sleeper) "aFS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/security/warden) "aFT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/security/warden) "aFU" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_security{name = "Warden's Office"; req_access = list(3)},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/dark,/area/security/warden) @@ -1685,7 +1646,6 @@ "aGu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor,/area/maintenance/security_starboard) "aGv" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/closet/l3closet/janitor,/turf/simulated/floor/tiled,/area/janitor) "aGw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/security/brig) -"aGx" = (/obj/machinery/autolathe,/turf/simulated/floor/tiled/white,/area/assembly/robotics) "aGy" = (/obj/structure/disposalpipe/segment,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area_hallway) "aGz" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_aft) "aGA" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/clipboard,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/dark,/area/lawoffice) @@ -1727,10 +1687,10 @@ "aHk" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/security/brig) "aHl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/red{dir = 4},/turf/simulated/floor/tiled,/area/security/brig) "aHm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/red{dir = 5},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/security/brig) -"aHn" = (/obj/machinery/r_n_d/circuit_imprinter,/turf/simulated/floor/tiled/white,/area/assembly/robotics) +"aHn" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 26},/obj/effect/floor_decal/corner/red{dir = 1},/turf/simulated/floor/tiled,/area/security/brig) "aHo" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/security/brig) "aHp" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/security/brig) -"aHq" = (/obj/structure/table/reinforced,/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 30},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) +"aHq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 26},/obj/effect/floor_decal/corner/red{dir = 4},/turf/simulated/floor/tiled,/area/security/brig) "aHr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/red{dir = 5},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/security/brig) "aHs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/red{dir = 1},/turf/simulated/floor/tiled,/area/security/brig) "aHt" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/tiled,/area/security/brig) @@ -1752,9 +1712,7 @@ "aHJ" = (/obj/machinery/flasher{id = "Cell 3"; pixel_x = -28; pixel_y = 0},/obj/structure/bed/padded,/turf/simulated/floor/tiled,/area/security/prison) "aHK" = (/obj/structure/closet/secure_closet/brig{id = "Cell 3"; name = "Cell 3 Locker"},/obj/machinery/camera/network/prison{c_tag = "SEC - Brig Cell 3"; dir = 8},/obj/effect/floor_decal/corner/red{dir = 10},/turf/simulated/floor/tiled,/area/security/prison) "aHL" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor,/area/maintenance/security_starboard) -"aHM" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{department = "Head of Personnel's Office"},/obj/effect/floor_decal/corner/blue/full{dir = 1},/obj/machinery/ai_status_display{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) "aHN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/maintenance/security_starboard) -"aHO" = (/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 0},/obj/effect/floor_decal/corner/blue{dir = 4},/obj/machinery/light_switch{pixel_x = 34; pixel_y = 0},/obj/machinery/keycard_auth{pixel_x = 24; pixel_y = 0},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) "aHP" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/janitor) "aHQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/janitor) "aHR" = (/obj/machinery/light_switch{pixel_x = 34; pixel_y = 1},/obj/machinery/button/remote/blast_door{id = "janitor_blast"; name = "Privacy Shutters"; pixel_x = 26; pixel_y = 0},/obj/machinery/camera/network/civilian{c_tag = "CIV - Custodial Closet"; dir = 9},/turf/simulated/floor/tiled,/area/janitor) @@ -1818,7 +1776,6 @@ "aIX" = (/obj/machinery/door/blast/regular{dir = 1; id = "Cell 3"; name = "Cell Door"},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/security/prison) "aIY" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 4},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor,/area/maintenance/security_starboard) "aIZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor,/area/maintenance/security_starboard) -"aJa" = (/obj/structure/table/standard,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "aJb" = (/turf/simulated/floor/tiled,/area/janitor) "aJc" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/janitor) "aJd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/janitor) @@ -1852,7 +1809,6 @@ "aJF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/red{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/computer/cryopod{density = 0; layer = 3.3; pixel_y = 32},/turf/simulated/floor/tiled,/area/security/security_cell_hallway) "aJG" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/dark,/area/security/armoury) "aJH" = (/obj/effect/floor_decal/corner/red{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; dir = 1; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/tiled,/area/security/security_cell_hallway) -"aJI" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the RD's goons from the safety of his office."; name = "Research Monitor"; network = list("Research","Toxins Test Area","Robots","Anomaly Isolation","Research Outpost"); pixel_x = -32; pixel_y = -4},/obj/structure/table/standard,/obj/machinery/photocopier/faxmachine{department = "Research Director's Office"},/obj/effect/floor_decal/corner/purple{dir = 9},/turf/simulated/floor/tiled/white,/area/rnd/rdoffice) "aJJ" = (/turf/simulated/wall/r_wall,/area/security/range) "aJK" = (/turf/simulated/wall,/area/security/range) "aJL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/security/range) @@ -1871,11 +1827,10 @@ "aJY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock{id_tag = "visitdoor"; name = "Visitation Area"; req_access = list(63)},/turf/simulated/floor/tiled,/area/security/prison) "aJZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_security{id_tag = "prisonexit"; name = "Brig Exit"; req_access = list(2)},/turf/simulated/floor/tiled,/area/security/prison) "aKa" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_security{id_tag = "prisonexit"; name = "Brig Exit"; req_access = list(2)},/turf/simulated/floor/tiled,/area/security/prison) -"aKb" = (/obj/effect/floor_decal/corner/lime{dir = 6},/obj/machinery/biogenerator,/turf/simulated/floor/tiled,/area/hydroponics) "aKc" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/computer/arcade,/turf/simulated/floor/tiled,/area/security/prison) "aKd" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/security/prison) "aKe" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/security/prison) -"aKf" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/biogenerator,/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora) +"aKf" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/washing_machine,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/security/prison) "aKg" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/security/prison) "aKh" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/security/prison) "aKi" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/security/prison) @@ -1883,10 +1838,7 @@ "aKk" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/security/prison) "aKl" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/maintenance/security_starboard) "aKm" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "Janitor"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/janitor) -"aKn" = (/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/bridge/meeting_room) "aKo" = (/obj/structure/janitorialcart,/turf/simulated/floor/tiled,/area/janitor) -"aKp" = (/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "Bridge"},/turf/simulated/floor/wood,/area/bridge/meeting_room) -"aKq" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = 28},/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain) "aKr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "lawyer_blast"; name = "Privacy Shutters"; opacity = 0},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/lawoffice) "aKs" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/dark,/area/lawoffice) "aKt" = (/obj/structure/table/reinforced,/obj/item/weapon/pen/blue{pixel_x = -5; pixel_y = -1},/obj/item/weapon/pen/red{pixel_x = -1; pixel_y = 3},/obj/item/weapon/material/ashtray/plastic{pixel_x = 4; pixel_y = 6},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/turf/simulated/floor/tiled/dark,/area/lawoffice) @@ -1901,9 +1853,6 @@ "aKC" = (/turf/simulated/floor/beach/water{icon_state = "seadeep"},/area/crew_quarters/pool) "aKD" = (/obj/effect/floor_decal/spline/plain{dir = 4},/turf/simulated/floor/beach/water{icon_state = "seadeep"},/area/crew_quarters/pool) "aKE" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool) -"aKF" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/recharge_station,/turf/simulated/floor/tiled,/area/assembly/chargebay) -"aKG" = (/obj/machinery/atmospherics/unary/heater{dir = 2; icon_state = "heater"},/obj/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora_storage) -"aKH" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/obj/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora_storage) "aKI" = (/turf/simulated/floor/tiled,/area/security/range) "aKJ" = (/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled,/area/security/range) "aKK" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/security/range) @@ -1941,11 +1890,7 @@ "aLq" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/maintenance/security_starboard) "aLr" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{name = "Custodial Maintenance"; req_access = list(26)},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/janitor) "aLs" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/janitor) -"aLt" = (/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/wood,/area/bridge/meeting_room) -"aLu" = (/obj/machinery/recharge_station,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) -"aLv" = (/obj/machinery/recharge_station,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/status_display{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/tiled/neutral,/area/crew_quarters/cafeteria) "aLw" = (/obj/item/weapon/stool/padded,/obj/effect/landmark/start{name = "Janitor"},/turf/simulated/floor/tiled,/area/janitor) -"aLx" = (/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "Captain's Office"},/turf/simulated/floor/wood,/area/crew_quarters/captain) "aLy" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_aft) "aLz" = (/obj/machinery/button/remote/blast_door{id = "lawyer_blast"; name = "Privacy Shutters"; pixel_x = -26; pixel_y = 0},/obj/machinery/light_switch{pixel_x = -34; pixel_y = 0},/obj/machinery/camera/network/civilian{c_tag = "CIV - Internal Affairs"; dir = 5},/turf/simulated/floor/tiled/dark,/area/lawoffice) "aLA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/dark,/area/lawoffice) @@ -1966,8 +1911,6 @@ "aLP" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area) "aLQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/pool) "aLR" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool) -"aLS" = (/obj/machinery/recharge_station,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) -"aLT" = (/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 0},/obj/structure/window/reinforced{dir = 4},/obj/effect/floor_decal/corner/blue/full{dir = 4},/turf/simulated/floor/tiled,/area/bridge) "aLU" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/structure/target_stake,/turf/simulated/floor/tiled,/area/security/range) "aLV" = (/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/security/range) "aLW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/range) @@ -1987,7 +1930,6 @@ "aMk" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/flasher{id = "permentryflash"; name = "Floor mounted flash"; pixel_x = 0},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/tiled,/area/security/prison) "aMl" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera/network/prison{c_tag = "SEC - Common Brig Enterance"; dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/security/prison) "aMm" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green,/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Prison Gate"; name = "Communal Brig Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison) -"aMn" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod1/station) "aMo" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/table/steel,/obj/machinery/camera/network/prison{c_tag = "SEC - Brig Observation"; dir = 1},/turf/simulated/floor/tiled,/area/security/prison) "aMp" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green,/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Prison Gate"; name = "Communal Brig Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison) "aMq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/security/prison) @@ -2002,7 +1944,7 @@ "aMz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/dark,/area/lawoffice) "aMA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/tiled/dark,/area/lawoffice) "aMB" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/dark,/area/lawoffice) -"aMC" = (/obj/machinery/photocopier,/obj/effect/floor_decal/corner/brown/full{dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/office) +"aMC" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{anchored = 0; department = "Internal Affairs"},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled/dark,/area/lawoffice) "aMD" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor,/area/maintenance/holodeck) "aME" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/meter,/turf/simulated/floor,/area/maintenance/holodeck) "aMF" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled,/area/holodeck_control) @@ -2022,12 +1964,6 @@ "aMT" = (/obj/effect/floor_decal/spline/plain{dir = 1},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool) "aMU" = (/obj/effect/floor_decal/spline/plain{dir = 5},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool) "aMV" = (/obj/structure/table/glass,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool) -"aMW" = (/obj/machinery/conveyor{dir = 1; id = "packageSort1"},/turf/simulated/floor,/area/quartermaster/delivery) -"aMX" = (/obj/structure/plasticflaps{opacity = 0},/obj/machinery/conveyor{dir = 1; id = "packageSort1"},/turf/simulated/floor,/area/quartermaster/delivery) -"aMY" = (/obj/machinery/conveyor{dir = 1; id = "packageSort1"},/turf/simulated/floor/plating,/area/quartermaster/delivery) -"aMZ" = (/obj/machinery/sleeper{dir = 4},/obj/effect/floor_decal/corner/paleblue/full{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/first_aid_station) -"aNa" = (/obj/machinery/conveyor{dir = 1; id = "packageSort1"},/obj/structure/plasticflaps/mining,/turf/simulated/floor/plating,/area/quartermaster/delivery) -"aNb" = (/obj/machinery/autolathe,/obj/effect/floor_decal/corner/brown{dir = 9},/turf/simulated/floor/tiled,/area/quartermaster/office) "aNc" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled,/area/security/range) "aNd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/security/range) "aNe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/security/range) @@ -2070,7 +2006,7 @@ "aNP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/storage/art) "aNQ" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green,/turf/simulated/floor/tiled/dark,/area/lawoffice) "aNR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/dark,/area/lawoffice) -"aNS" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_5) +"aNS" = (/obj/machinery/photocopier,/obj/machinery/ai_status_display{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/lawoffice) "aNT" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/meter,/turf/simulated/floor,/area/maintenance/holodeck) "aNU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor,/area/maintenance/holodeck) "aNV" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/holodeck_control) @@ -2093,12 +2029,7 @@ "aOm" = (/obj/effect/floor_decal/spline/plain{dir = 6},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool) "aOn" = (/obj/structure/table/glass,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool) "aOo" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/pool) -"aOp" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_6) "aOq" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/white,/area/medical/first_aid_station_starboard) -"aOr" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_11) -"aOs" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_12) -"aOt" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/floor,/area/quartermaster/storage) -"aOu" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "cargo_bay_door"; locked = 1; name = "Cargo Docking Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/quartermaster/storage) "aOv" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/security/range) "aOw" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/security/range) "aOx" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/security/range) @@ -2134,7 +2065,6 @@ "aPb" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled/dark,/area/lawoffice) "aPc" = (/obj/structure/table/reinforced,/obj/item/weapon/pen/blue,/obj/item/weapon/pen/red{pixel_x = -5; pixel_y = -1},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/turf/simulated/floor/tiled/dark,/area/lawoffice) "aPd" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/holodeck) -"aPe" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/floor,/area/quartermaster/storage) "aPf" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor/tiled,/area/holodeck_control) "aPg" = (/obj/machinery/light/small,/turf/simulated/floor/tiled,/area/holodeck_control) "aPh" = (/obj/machinery/camera/network/northern_star{c_tag = "Hall - Recreation Mid"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area_hallway) @@ -2151,7 +2081,6 @@ "aPs" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool) "aPt" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/pool) "aPu" = (/obj/structure/closet/secure_closet/paramedic,/obj/item/clothing/accessory/storage/black_vest,/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay) -"aPv" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "cargo_bay_door"; locked = 1; name = "Cargo Docking Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/quartermaster/storage) "aPw" = (/obj/structure/table/rack,/obj/effect/floor_decal/corner/blue{dir = 10},/obj/structure/window/reinforced,/obj/random/energy,/obj/random/energy,/obj/machinery/door/window/brigdoor/northleft{name = "Energy"; req_access = list(1)},/turf/simulated/floor/tiled/dark,/area/security/armoury) "aPx" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/security/range) "aPy" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/security/range) @@ -2159,7 +2088,7 @@ "aPA" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/security/range) "aPB" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/tiled,/area/security/range) "aPC" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/security/range) -"aPD" = (/obj/machinery/conveyor{dir = 9; id = "QMLoad"},/turf/simulated/floor,/area/quartermaster/storage) +"aPD" = (/obj/structure/table/reinforced,/obj/machinery/recharger/wallcharger{pixel_x = 32; pixel_y = -4},/obj/item/clothing/ears/earmuffs{pixel_x = -3; pixel_y = -2},/obj/item/clothing/ears/earmuffs,/obj/item/clothing/ears/earmuffs,/turf/simulated/floor/tiled,/area/security/range) "aPE" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/security/lobby) "aPF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/security/lobby) "aPG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/security/lobby) @@ -2207,7 +2136,7 @@ "aQw" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/window/westright{name = "Range Access"; req_access = list(63)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/item/device/radio/intercom{broadcasting = 0; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/tiled,/area/security/range) "aQx" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/security/range) "aQy" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled,/area/security/range) -"aQz" = (/obj/effect/floor_decal/corner/red{dir = 8},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/light_switch{pixel_x = -36},/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/tiled,/area/security/checkpoint2) +"aQz" = (/obj/structure/table/reinforced,/obj/machinery/recharger/wallcharger{pixel_x = 32; pixel_y = -4},/obj/item/clothing/glasses/sunglasses,/obj/item/clothing/glasses/sunglasses{pixel_x = 3; pixel_y = 3},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/tiled,/area/security/range) "aQA" = (/obj/effect/floor_decal/corner/red/full,/obj/structure/bed/chair{dir = 1},/obj/machinery/atm{pixel_y = -30},/turf/simulated/floor/tiled,/area/security/lobby) "aQB" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/tiled,/area/security/lobby) "aQC" = (/obj/effect/floor_decal/corner/red{dir = 10},/turf/simulated/floor/tiled,/area/security/lobby) @@ -2233,7 +2162,6 @@ "aQW" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area_hallway) "aQX" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/recreation_area_restroom) "aQY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/recreation_area_restroom) -"aQZ" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_3) "aRa" = (/obj/machinery/door/airlock{name = "Unisex Showers"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/recreation_area_restroom) "aRb" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool) "aRc" = (/obj/effect/floor_decal/spline/plain{dir = 10},/turf/simulated/floor/beach/water{icon_state = "seadeep"},/area/crew_quarters/pool) @@ -2245,7 +2173,7 @@ "aRi" = (/turf/simulated/wall/r_wall,/area/security/lobby) "aRj" = (/obj/machinery/firealarm{dir = 8; pixel_x = -26},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/flora/pottedplant{icon_state = "plant-22"},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_two) "aRk" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/security/lobby) -"aRl" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_4) +"aRl" = (/obj/structure/table/steel,/obj/machinery/microwave,/turf/simulated/floor/tiled,/area/security/prison) "aRm" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/steel,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/tiled,/area/security/prison) "aRn" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/item/weapon/bedsheet/orange,/obj/structure/bed/padded,/turf/simulated/floor/tiled,/area/security/prison) "aRo" = (/obj/structure/table/steel,/obj/item/weapon/book/manual/security_space_law,/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 2},/turf/simulated/floor/tiled,/area/security/prison) @@ -2258,7 +2186,7 @@ "aRv" = (/obj/machinery/door/airlock{name = "Toilet"},/turf/simulated/floor/tiled/freezer,/area/security/prison) "aRw" = (/obj/structure/table/standard,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box{pixel_x = 3; pixel_y = 3},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/item/weapon/tape_roll{pixel_x = 4; pixel_y = 4},/obj/item/weapon/tape_roll,/turf/simulated/floor/tiled,/area/storage/art) "aRx" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen/blue{pixel_x = -5; pixel_y = -1},/obj/item/weapon/pen/red{pixel_x = -1; pixel_y = 3},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/light,/turf/simulated/floor/tiled,/area/storage/art) -"aRy" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_9) +"aRy" = (/obj/structure/table/standard,/obj/machinery/recharger,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/tiled,/area/storage/art) "aRz" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled,/area/hallway/secondary/civilian_hallway_aft) "aRA" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/briefcase{pixel_x = -2; pixel_y = -5},/obj/item/weapon/storage/briefcase{pixel_x = 3; pixel_y = 0},/obj/machinery/light,/turf/simulated/floor/tiled/dark,/area/lawoffice) "aRB" = (/obj/structure/closet/lawcloset,/turf/simulated/floor/tiled/dark,/area/lawoffice) @@ -2273,7 +2201,6 @@ "aRK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool) "aRL" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool) "aRM" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/maintenance/pool) -"aRN" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_10) "aRO" = (/turf/simulated/shuttle/wall{icon_state = "swall_s"; dir = 4},/area/shuttle/large_escape_pod2/station) "aRP" = (/turf/simulated/shuttle/wall,/area/shuttle/large_escape_pod2/station) "aRQ" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "propulsion_r"},/turf/space,/area/shuttle/large_escape_pod2/station) @@ -2304,7 +2231,7 @@ "aSp" = (/obj/structure/bed/chair,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/large_escape_pod2/station) "aSq" = (/obj/structure/bed/chair,/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/large_escape_pod2/station) "aSr" = (/obj/machinery/sleep_console{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station) -"aSs" = (/obj/machinery/conveyor{dir = 2; id = "QMLoad"},/obj/machinery/light{dir = 8},/turf/simulated/floor,/area/quartermaster/storage) +"aSs" = (/obj/machinery/sleeper{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station) "aSt" = (/obj/structure/table/standard,/obj/item/bodybag/cryobag,/obj/item/roller{pixel_y = 8},/obj/item/roller{pixel_y = 16},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/large_escape_pod2/station) "aSu" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/bed/chair,/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/large_escape_pod2/station) "aSv" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/shuttle/large_escape_pod2/station) @@ -2325,7 +2252,7 @@ "aSK" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/recreation_area_restroom) "aSL" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/recreation_area_restroom) "aSM" = (/obj/machinery/camera/network/civilian{c_tag = "CIV - Recreation Rest Room"; dir = 1},/obj/machinery/light,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/recreation_area_restroom) -"aSN" = (/obj/machinery/conveyor{dir = 2; id = "QMLoad"},/turf/simulated/floor,/area/quartermaster/storage) +"aSN" = (/obj/machinery/washing_machine,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/recreation_area_restroom) "aSO" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/light,/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/recreation_area_restroom) "aSP" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool) "aSQ" = (/obj/structure/table/glass,/obj/machinery/light,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool) @@ -2524,11 +2451,8 @@ "aWB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area_hallway) "aWC" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area_hallway) "aWD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area_hallway) -"aWE" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/status_display/supply_display{pixel_y = -32},/turf/simulated/floor,/area/quartermaster/storage) "aWF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/dark,/area/crew_quarters/recreation_area_hallway) "aWG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/maintenance/pool) -"aWH" = (/obj/machinery/recharge_station,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/barrestroom) -"aWI" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_1) "aWJ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/maintenance/pool) "aWK" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor/tiled,/area/hallway/secondary/escape/fore_port_escape_pod_hallway) "aWL" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/escape/fore_port_escape_pod_hallway) @@ -2760,7 +2684,6 @@ "bbd" = (/turf/space,/area/skipjack_station/northwest_solars) "bbe" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/closet/firecloset,/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/camera/network/research{c_tag = "SCI - Research Auxiliary Access"; dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/research_foyer_auxiliary) "bbf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/rnd/research_foyer_auxiliary) -"bbg" = (/obj/structure/table/standard,/obj/machinery/microwave,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_2) "bbh" = (/obj/structure/window/reinforced,/obj/machinery/newscaster{pixel_x = -31; pixel_y = 0},/obj/machinery/camera/network/civilian{c_tag = "CIV - Gateway"; dir = 4},/turf/simulated/floor/tiled/dark,/area/gateway) "bbi" = (/obj/machinery/gateway{dir = 10},/obj/effect/landmark{name = "JoinLateGateway"},/turf/simulated/floor/tiled/dark,/area/gateway) "bbj" = (/obj/machinery/gateway,/obj/effect/landmark{name = "JoinLateGateway"},/turf/simulated/floor/tiled/dark,/area/gateway) @@ -2872,8 +2795,8 @@ "bdl" = (/turf/simulated/wall/r_wall,/area/ai_upload) "bdm" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/highsecurity{name = "AI Upload"; req_access = list(16)},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/ai_upload) "bdn" = (/obj/structure/closet/crate{name = "Camera Assembly Crate"},/obj/item/weapon/camera_assembly,/obj/item/weapon/camera_assembly,/obj/item/weapon/camera_assembly,/obj/item/weapon/camera_assembly,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled/dark,/area/ai_cyborg_station) -"bdo" = (/obj/structure/table/standard,/obj/machinery/microwave,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_7) -"bdp" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_8) +"bdo" = (/obj/machinery/recharge_station,/obj/machinery/camera/network/command{c_tag = "AI - Cyborg Station"; dir = 1},/turf/simulated/floor/bluegrid,/area/ai_cyborg_station) +"bdp" = (/obj/machinery/recharge_station,/turf/simulated/floor/bluegrid,/area/ai_cyborg_station) "bdq" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hydroponics/garden) "bdr" = (/obj/effect/floor_decal/spline/fancy/wood{dir = 4},/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/machinery/camera/network/civilian{c_tag = "CIV - Park Port"; dir = 4},/turf/simulated/floor/grass,/area/hydroponics/garden) "bds" = (/obj/effect/floor_decal/spline/fancy/wood{tag = "icon-spline_fancy (SOUTHWEST)"; icon_state = "spline_fancy"; dir = 10},/obj/structure/flora/ausbushes/sparsegrass,/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/hydroponics/garden) @@ -2952,8 +2875,8 @@ "beN" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/newscaster{pixel_x = 28; pixel_y = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_four) "beO" = (/obj/structure/table/standard,/obj/item/weapon/hand_tele,/turf/simulated/floor/tiled/dark,/area/teleporter) "beP" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/tiled/dark,/area/teleporter) -"beQ" = (/obj/machinery/washing_machine,/obj/effect/floor_decal/corner/blue{dir = 1},/obj/effect/floor_decal/corner/white{dir = 4},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry) -"beR" = (/obj/machinery/washing_machine,/obj/effect/floor_decal/corner/blue{dir = 1},/obj/effect/floor_decal/corner/white{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry) +"beQ" = (/obj/machinery/teleport/station,/turf/simulated/floor/tiled/dark,/area/teleporter) +"beR" = (/obj/machinery/teleport/hub,/turf/simulated/floor/tiled/dark,/area/teleporter) "beS" = (/obj/machinery/porta_turret{dir = 8},/turf/simulated/floor/bluegrid,/area/ai_upload) "beT" = (/turf/simulated/floor/bluegrid,/area/ai_upload) "beU" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/ai_upload) @@ -2967,7 +2890,6 @@ "bfc" = (/obj/structure/table/standard,/obj/item/weapon/hemostat,/obj/item/weapon/cautery,/obj/effect/floor_decal/corner/pink/full{dir = 8},/obj/machinery/button/remote/blast_door{id = "surgeryobs2"; name = "Privacy Shutters"; pixel_x = -26; pixel_y = 0},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled/white,/area/medical/surgery2) "bfd" = (/obj/structure/table/standard,/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/retractor,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled/white,/area/medical/surgery2) "bfe" = (/obj/structure/table/standard,/obj/item/weapon/circular_saw{pixel_y = 8},/obj/item/weapon/scalpel,/obj/effect/floor_decal/corner/pink{dir = 5},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled/white,/area/medical/surgery2) -"bff" = (/obj/machinery/recharge_station,/obj/effect/floor_decal/corner/blue{dir = 1},/obj/effect/floor_decal/corner/white{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry) "bfg" = (/obj/structure/closet/secure_closet/medical2,/obj/effect/floor_decal/corner/pink/full{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/surgery2) "bfh" = (/turf/simulated/wall,/area/medical/surgery2) "bfi" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/tiled/white,/area/medical/surgery_hallway) @@ -3067,7 +2989,7 @@ "bgY" = (/turf/simulated/wall,/area/medical/exam_room) "bgZ" = (/turf/simulated/wall,/area/medical/cryo) "bha" = (/obj/structure/bookcase/manuals/medical,/obj/item/weapon/book/manual/stasis,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) -"bhb" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/reinforced,/obj/machinery/recharger,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) +"bhb" = (/obj/structure/table/standard,/obj/machinery/recharger{pixel_y = 0},/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) "bhc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH5"; location = "CH4"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "bhd" = (/obj/machinery/vending/cola,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) "bhe" = (/obj/machinery/vending/coffee,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) @@ -3081,7 +3003,6 @@ "bhm" = (/obj/effect/floor_decal/corner/purple{dir = 9},/obj/structure/extinguisher_cabinet{pixel_x = -27},/turf/simulated/floor/tiled/white,/area/rnd/research) "bhn" = (/obj/effect/floor_decal/corner/purple{dir = 6},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 26},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera/network/research{c_tag = "SCI - Research Auxiliary Hallway"; dir = 8},/turf/simulated/floor/tiled/white,/area/rnd/research) "bho" = (/turf/simulated/wall/r_wall,/area/rnd/research_restroom) -"bhp" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{department = "Chief Engineer's Office"},/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Engineer's Desk"; departmentType = 6; name = "Chief Engineer RC"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) "bhq" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/primary/central_four) "bhr" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/primary/central_four) "bhs" = (/obj/structure/closet/emcloset,/turf/simulated/floor/tiled,/area/hallway/primary/central_four) @@ -3114,7 +3035,7 @@ "bhT" = (/obj/structure/closet/secure_closet/medical1,/obj/effect/floor_decal/corner/pink/full{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/exam_room) "bhU" = (/obj/item/weapon/wrench,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/structure/table/glass,/obj/effect/floor_decal/corner/pink/full{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/cryo) "bhV" = (/obj/machinery/atmospherics/unary/cryo_cell,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/medical/cryo) -"bhW" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/reinforced,/obj/machinery/microwave,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/break_room) +"bhW" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/medical/cryo) "bhX" = (/obj/machinery/vending/snack,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) "bhY" = (/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) "bhZ" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) @@ -3167,7 +3088,6 @@ "biU" = (/obj/machinery/iv_drip,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/tiled/white,/area/medical/surgery2) "biV" = (/obj/structure/bed/chair/wood{dir = 8},/obj/effect/floor_decal/corner/brown{dir = 10},/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop) "biW" = (/obj/machinery/vending/wallmed1{pixel_y = -32},/obj/machinery/camera/network/medbay{c_tag = "MED - Operating Theatre 2"; dir = 1},/turf/simulated/floor/tiled/white,/area/medical/surgery2) -"biX" = (/obj/structure/table/reinforced,/obj/machinery/recharger,/turf/simulated/floor/tiled,/area/engineering/foyer) "biY" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/turf/simulated/floor/tiled/white,/area/medical/surgery_hallway) "biZ" = (/obj/structure/table/standard,/obj/item/weapon/cane,/obj/item/weapon/cane{pixel_x = -3; pixel_y = 2},/obj/item/weapon/storage/box/rxglasses,/obj/effect/floor_decal/corner/pink{dir = 9},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/exam_room) "bja" = (/obj/structure/bed/chair/office/light{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/exam_room) @@ -3194,13 +3114,13 @@ "bjv" = (/obj/effect/floor_decal/corner/lime{dir = 10},/turf/simulated/floor/tiled/white,/area/medical/virology) "bjw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/medical/virology) "bjx" = (/obj/item/roller,/obj/effect/floor_decal/corner/lime{dir = 10},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/turf/simulated/floor/tiled/white,/area/medical/virology) -"bjy" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) +"bjy" = (/obj/machinery/r_n_d/server/robotics,/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server) "bjz" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; icon_state = "map_vent_out"; use_power = 1},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server) "bjA" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled/dark,/area/server) "bjB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/server) "bjC" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/obj/machinery/light/small{dir = 1},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc/high{dir = 1; name = "north bump"; pixel_y = 24},/turf/simulated/floor/tiled/dark,/area/server) "bjD" = (/obj/machinery/camera/network/research{c_tag = "SCI - Server Room"},/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor/tiled/dark,/area/server) -"bjE" = (/obj/machinery/atmospherics/unary/heater{dir = 2; icon_state = "heater"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) +"bjE" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer_1"; use_power = 1; power_setting = 20; set_temperature = 73},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled/dark,/area/server) "bjF" = (/obj/effect/floor_decal/corner/purple{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/white,/area/rnd/research) "bjG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/rnd/research) "bjH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/research) @@ -3310,7 +3230,6 @@ "blH" = (/obj/structure/table/standard,/obj/item/weapon/hemostat,/obj/item/weapon/cautery,/obj/machinery/button/remote/blast_door{id = "surgeryobs"; name = "Privacy Shutters"; pixel_x = -26; pixel_y = 0},/obj/effect/floor_decal/corner/pink/full{dir = 8},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled/white,/area/medical/surgery) "blI" = (/obj/structure/table/standard,/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/retractor,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled/white,/area/medical/surgery) "blJ" = (/obj/structure/table/standard,/obj/item/weapon/circular_saw{pixel_y = 8},/obj/item/weapon/scalpel,/obj/effect/floor_decal/corner/pink{dir = 5},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled/white,/area/medical/surgery) -"blK" = (/obj/machinery/recharge_station,/turf/simulated/floor/tiled,/area/crew_quarters/locker) "blL" = (/obj/structure/closet/secure_closet/medical2,/obj/effect/floor_decal/corner/pink/full{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/surgery) "blM" = (/turf/simulated/wall,/area/medical/surgery) "blN" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/camera/network/medbay{c_tag = "MED - Surgery Hallway"; dir = 4},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor/tiled/white,/area/medical/surgery_hallway) @@ -3339,11 +3258,11 @@ "bmk" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/green,/obj/effect/floor_decal/corner/lime/full{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/tiled/white,/area/medical/virology) "bml" = (/obj/effect/floor_decal/corner/lime{dir = 5},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/tiled/white,/area/medical/virology) "bmm" = (/turf/simulated/floor/tiled/white,/area/medical/virology) -"bmn" = (/obj/machinery/recharge_station,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"bmn" = (/obj/machinery/washing_machine,/obj/effect/floor_decal/corner/lime/full{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/virology) "bmo" = (/turf/simulated/shuttle/wall,/area/shuttle/research/station) "bmp" = (/turf/simulated/shuttle/wall{icon_state = "swall_straight"; dir = 4},/area/shuttle/research/station) "bmq" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/research/station) -"bmr" = (/obj/structure/table/standard,/obj/machinery/microwave{pixel_x = -2; pixel_y = 5},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) +"bmr" = (/obj/machinery/r_n_d/server/core,/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server) "bms" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 0; external_pressure_bound_default = 0; icon_state = "map_vent_in"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server) "bmt" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/server) "bmu" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -26},/turf/simulated/floor/tiled/dark,/area/server) @@ -3357,7 +3276,7 @@ "bmC" = (/obj/structure/closet/wardrobe/science_white,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/floor_decal/corner/purple/diagonal,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled/white,/area/rnd/research_restroom) "bmD" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/tiled/dark,/area/rnd/lab) "bmE" = (/obj/structure/table/standard,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/gloves/latex,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled/dark,/area/rnd/lab) -"bmF" = (/obj/machinery/power/supermatter{layer = 4},/obj/machinery/mass_driver{id = "enginecore"},/turf/simulated/floor/greengrid/nitrogen,/area/engineering/engine_room) +"bmF" = (/obj/machinery/autolathe,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/dark,/area/rnd/lab) "bmG" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/shuttle/plating,/area/rnd/lab) "bmH" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/shuttle/plating,/area/rnd/lab) "bmI" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/rnd/lab) @@ -3398,6 +3317,7 @@ "bnr" = (/obj/machinery/computer/med_data,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/machinery/light,/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) "bns" = (/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) "bnt" = (/obj/structure/closet/wardrobe/medic_white,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/machinery/light,/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) +"bnu" = (/obj/machinery/washing_machine,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) "bnv" = (/obj/machinery/shower{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/northleft{name = "Shower"; req_access = list()},/obj/structure/curtain/open/shower/medical,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/medical_restroom) "bnw" = (/obj/machinery/shower{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/northright{dir = 1; name = "Shower"; req_access = list()},/obj/structure/curtain/open/shower/medical,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/medical_restroom) "bnx" = (/obj/structure/toilet{dir = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/medical_restroom) @@ -3437,6 +3357,7 @@ "bof" = (/obj/effect/floor_decal/corner/purple{dir = 5},/obj/machinery/camera/network/research{c_tag = "SCI - R&D Lab"},/turf/simulated/floor/tiled/white,/area/rnd/lab) "bog" = (/obj/structure/table/standard{name = "plastic table frame"},/obj/item/stack/material/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/material/steel{amount = 50},/obj/item/clothing/glasses/welding,/obj/effect/floor_decal/corner/purple{dir = 5},/turf/simulated/floor/tiled/white,/area/rnd/lab) "boh" = (/obj/structure/table/standard,/obj/item/weapon/hand_labeler,/obj/item/weapon/pen,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/effect/floor_decal/corner/purple{dir = 5},/turf/simulated/floor/tiled/white,/area/rnd/lab) +"boi" = (/obj/item/weapon/stock_parts/console_screen,/obj/structure/table/standard,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/obj/effect/floor_decal/corner/purple/full{dir = 1},/obj/machinery/firealarm{dir = 4; layer = 3.3; pixel_x = 26},/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/tiled/white,/area/rnd/lab) "boj" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled,/area/hallway/primary/central_four) "bok" = (/obj/structure/closet/crate,/obj/item/weapon/crowbar,/turf/simulated/floor/tiled,/area/teleporter) "bol" = (/obj/structure/closet/crate,/turf/simulated/floor/tiled,/area/teleporter) @@ -3544,6 +3465,7 @@ "bqk" = (/obj/effect/floor_decal/corner/paleblue{dir = 5},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bql" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bqm" = (/obj/effect/floor_decal/corner/paleblue{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/sleeper) +"bqn" = (/obj/machinery/recharge_station,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bqo" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/bodybags{pixel_x = 1; pixel_y = 2},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/effect/floor_decal/corner/mauve{dir = 5},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/machinery/light_switch{pixel_x = -36; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) "bqp" = (/obj/machinery/camera/network/security{c_tag = "SEC - Secure Armory Armor"; dir = 8},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/tiled/dark,/area/security/armoury) "bqq" = (/obj/structure/window/reinforced{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/medical/genetics_cloning) @@ -3592,10 +3514,13 @@ "brh" = (/obj/machinery/vending/coffee,/turf/simulated/floor/wood,/area/rnd/research) "bri" = (/obj/effect/floor_decal/corner/purple{dir = 9},/turf/simulated/floor/tiled/white,/area/rnd/research) "brj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/white,/area/rnd/research) +"brk" = (/obj/effect/floor_decal/corner/purple{dir = 6},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 28},/obj/structure/table/standard,/obj/machinery/recharger,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled/white,/area/rnd/research) "brl" = (/turf/simulated/wall,/area/rnd/lab) "brm" = (/obj/effect/floor_decal/corner/purple{dir = 9},/obj/machinery/light{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/rnd/lab) "brn" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/lab) +"bro" = (/obj/machinery/r_n_d/destructive_analyzer,/turf/simulated/floor/tiled,/area/rnd/lab) "brp" = (/turf/simulated/floor/tiled,/area/rnd/lab) +"brq" = (/obj/machinery/r_n_d/protolathe,/turf/simulated/floor/tiled,/area/rnd/lab) "brr" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled/white,/area/rnd/lab) "brs" = (/obj/structure/table/standard,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/weapon/stock_parts/scanning_module{pixel_x = 2; pixel_y = 3},/obj/item/weapon/stock_parts/scanning_module,/obj/effect/floor_decal/corner/purple{dir = 6},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled/white,/area/rnd/lab) "brt" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/camera/network/northern_star{c_tag = "Hall - Central Primary Port Fore 2"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_four) @@ -3669,6 +3594,7 @@ "bsK" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = -30; pixel_y = 0},/obj/effect/floor_decal/corner/purple{dir = 9},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/rnd/lab) "bsL" = (/obj/machinery/computer/rdconsole/core,/turf/simulated/floor/tiled,/area/rnd/lab) "bsM" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/rnd/lab) +"bsN" = (/obj/machinery/r_n_d/circuit_imprinter,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric,/turf/simulated/floor/tiled,/area/rnd/lab) "bsO" = (/obj/effect/floor_decal/corner/purple{dir = 6},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled/white,/area/rnd/lab) "bsP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/rnd/lab) "bsQ" = (/obj/machinery/porta_turret{dir = 4},/turf/simulated/floor/bluegrid,/area/ai) @@ -3709,6 +3635,7 @@ "btA" = (/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/white,/area/medical/virology) "btB" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/virology) "btC" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/lime,/turf/simulated/floor/tiled/white,/area/medical/virology) +"btD" = (/obj/structure/table/standard,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/effect/floor_decal/corner/lime/full{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/virology) "btE" = (/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/auxport) "btF" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/airless,/area/solar/auxport) "btG" = (/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/auxport) @@ -3727,6 +3654,7 @@ "btT" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/rnd/research) "btU" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/rnd/research) "btV" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/rnd/research) +"btW" = (/obj/structure/table/glass,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/wood,/area/rnd/research) "btX" = (/obj/structure/table/glass,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/wood,/area/rnd/research) "btY" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/rnd/research) "btZ" = (/obj/machinery/door/firedoor/glass,/turf/simulated/floor/wood,/area/rnd/research) @@ -3749,6 +3677,7 @@ "buq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/reception) "bur" = (/obj/item/roller,/obj/item/roller{pixel_y = 8},/obj/item/roller{pixel_y = 16},/obj/structure/table/glass,/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/effect/floor_decal/corner/paleblue{dir = 6},/turf/simulated/floor/tiled/white,/area/medical/reception) "bus" = (/obj/structure/table/standard,/obj/structure/window/reinforced{dir = 8},/obj/machinery/computer/med_data/laptop,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/effect/floor_decal/corner/paleblue/full{dir = 8},/obj/machinery/camera/network/medbay{c_tag = "MED - Lobby Fore"; dir = 2},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/reception) +"but" = (/obj/machinery/photocopier,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/reception) "buu" = (/obj/structure/filingcabinet/chestdrawer{name = "Medical Forms"},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/reception) "buv" = (/obj/structure/filingcabinet/medical{desc = "A large cabinet with hard copy medical records."; name = "Medical Records"},/obj/machinery/alarm{pixel_y = 22},/obj/effect/floor_decal/corner/paleblue/full{dir = 1},/obj/structure/extinguisher_cabinet{pixel_x = 25},/turf/simulated/floor/tiled/white,/area/medical/reception) "buw" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/effect/floor_decal/corner/paleblue/full{dir = 8},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/medbay_primary_storage) @@ -3761,6 +3690,7 @@ "buD" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "buE" = (/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "buF" = (/obj/effect/floor_decal/corner/pink{dir = 6},/turf/simulated/floor/tiled/white,/area/medical/sleeper) +"buG" = (/obj/machinery/bodyscanner{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "buH" = (/obj/machinery/body_scanconsole,/turf/simulated/floor/tiled/white,/area/medical/sleeper) "buI" = (/obj/effect/floor_decal/corner/pink{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/medical/sleeper) "buJ" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled/freezer,/area/medical/surgery_storage) @@ -3788,6 +3718,8 @@ "bvf" = (/obj/machinery/door/blast/regular{id = "trash"; name = "disposal mass driver"},/turf/simulated/floor/airless,/area/maintenance/disposal) "bvg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/disposal) "bvh" = (/obj/machinery/disposal/deliveryChute{dir = 4},/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor,/area/maintenance/disposal) +"bvj" = (/obj/machinery/conveyor{dir = 4; id = "garbage"},/obj/structure/sign/vacuum{pixel_x = 0; pixel_y = 32},/turf/simulated/floor,/area/maintenance/disposal) +"bvk" = (/obj/effect/decal/cleanable/cobweb2,/obj/machinery/conveyor{dir = 4; id = "garbage"},/turf/simulated/floor,/area/maintenance/disposal) "bvl" = (/obj/effect/floor_decal/corner/purple/full,/obj/machinery/newscaster{pixel_x = -28; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/rnd/research) "bvm" = (/obj/effect/floor_decal/corner/purple{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/rnd/research) "bvn" = (/obj/effect/floor_decal/corner/purple/full{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/rnd/research) @@ -3843,6 +3775,7 @@ "bwm" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bwn" = (/obj/effect/floor_decal/corner/paleblue{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bwo" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/floor_decal/corner/paleblue/full{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) +"bwp" = (/obj/machinery/clonepod{biomass = 600},/obj/effect/floor_decal/corner/mauve/full,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) "bwq" = (/obj/machinery/computer/cloning,/obj/effect/floor_decal/corner/mauve{dir = 10},/obj/machinery/light,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) "bwr" = (/obj/machinery/dna_scannernew,/obj/effect/floor_decal/corner/mauve{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) "bws" = (/obj/structure/closet/wardrobe/genetics_white,/obj/effect/floor_decal/corner/mauve,/turf/simulated/floor/tiled/white,/area/medical/genetics_cloning) @@ -3859,10 +3792,12 @@ "bwD" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "arrivals_pump"},/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor,/area/maintenance/research) "bwE" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor,/area/maintenance/research) "bwF" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "arrivals_pump"},/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/machinery/camera/network/exodus{c_tag = "CIV - Port Fore Airlock"; dir = 9},/turf/simulated/floor,/area/maintenance/research) +"bwG" = (/obj/machinery/mass_driver{dir = 1; id = "trash"},/turf/simulated/floor/airless,/area/maintenance/disposal) "bwH" = (/obj/structure/disposaloutlet{dir = 8},/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/airless,/area/maintenance/disposal) "bwI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/plating,/area/maintenance/disposal) "bwJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/disposal) "bwK" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/maintenance/disposal) +"bwL" = (/obj/machinery/conveyor{dir = 2; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal) "bwM" = (/turf/simulated/wall/r_wall,/area/rnd/misc_lab) "bwN" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_research{name = "Research Hallway"; req_access = list(47)},/turf/simulated/floor/tiled/white,/area/rnd/research) "bwO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/rnd/research) @@ -3918,6 +3853,7 @@ "bxN" = (/obj/item/weapon/stool/padded,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor,/area/maintenance/disposal) "bxO" = (/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "garbage"; name = "disposal coveyor"},/turf/simulated/floor,/area/maintenance/disposal) "bxP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal) +"bxQ" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/obj/machinery/conveyor{dir = 2; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal) "bxR" = (/obj/structure/closet/secure_closet/scientist,/obj/effect/floor_decal/corner/purple/full{dir = 8},/obj/machinery/light{dir = 1},/obj/machinery/newscaster{pixel_x = -28; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/rnd/misc_lab) "bxS" = (/obj/structure/closet/crate,/obj/effect/floor_decal/corner/purple{dir = 5},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 28},/turf/simulated/floor/tiled/white,/area/rnd/misc_lab) "bxT" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/alarm{pixel_y = 22},/obj/effect/floor_decal/corner/purple{dir = 5},/turf/simulated/floor/tiled/white,/area/rnd/misc_lab) @@ -3959,6 +3895,7 @@ "byD" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/emergency,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/simulated/floor/tiled/white,/area/medical/medbay_primary_storage) "byE" = (/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/storage/pill_bottle/antitox,/obj/item/weapon/storage/pill_bottle/tramadol,/obj/structure/closet/secure_closet/medical_wall{name = "Pill Cabinet"; pixel_x = -32; pixel_y = 0},/obj/structure/table/glass,/turf/simulated/floor/tiled/white,/area/medical/sleeper) "byF" = (/obj/effect/floor_decal/corner/paleblue{dir = 6},/turf/simulated/floor/tiled/white,/area/medical/sleeper) +"byG" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "byH" = (/obj/machinery/sleep_console,/turf/simulated/floor/tiled/white,/area/medical/sleeper) "byI" = (/obj/effect/floor_decal/corner/paleblue{dir = 9},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "byJ" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled/white,/area/medical/sleeper) @@ -3997,6 +3934,7 @@ "bzq" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor,/area/maintenance/disposal) "bzr" = (/turf/simulated/floor,/area/maintenance/disposal) "bzs" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/disposal) +"bzt" = (/obj/machinery/conveyor{dir = 2; id = "garbage"},/turf/simulated/floor,/area/maintenance/disposal) "bzu" = (/obj/machinery/atmospherics/portables_connector,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/effect/floor_decal/corner/purple/full{dir = 8},/turf/simulated/floor/tiled/white,/area/rnd/misc_lab) "bzv" = (/obj/effect/floor_decal/corner/purple{dir = 1},/turf/simulated/floor/tiled/white,/area/rnd/misc_lab) "bzw" = (/turf/simulated/floor/tiled/white,/area/rnd/misc_lab) @@ -4055,6 +3993,7 @@ "bAx" = (/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bAy" = (/obj/effect/floor_decal/corner/paleblue{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bAz" = (/obj/effect/floor_decal/corner/paleblue{dir = 2},/obj/structure/disposalpipe/segment,/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/sleeper) +"bAA" = (/obj/machinery/photocopier,/obj/effect/floor_decal/corner/paleblue{dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bAB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bAC" = (/obj/structure/table/reinforced,/obj/machinery/computer/med_data/laptop{pixel_x = 3; pixel_y = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bAD" = (/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) @@ -4167,6 +4106,7 @@ "bCG" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bCH" = (/obj/structure/filingcabinet/chestdrawer{dir = 1},/obj/effect/floor_decal/corner/paleblue/full,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bCI" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) +"bCJ" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{department = "CMO's Office"},/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/machinery/light,/obj/machinery/camera/network/medbay{c_tag = "MED - CMO"; dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bCK" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/light_switch{pixel_x = -10; pixel_y = -23},/obj/effect/floor_decal/corner/paleblue{dir = 10},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bCL" = (/obj/structure/table/steel,/obj/item/device/camera{name = "Autopsy Camera"; pixel_x = -2; pixel_y = 7},/obj/item/weapon/paper_bin{pixel_y = -6},/obj/item/weapon/pen/red{pixel_x = -1; pixel_y = -9},/obj/item/weapon/pen/blue{pixel_x = 3; pixel_y = -5},/obj/effect/floor_decal/corner/paleblue{dir = 5},/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; dir = 1; frequency = 1487; icon_state = "intercom"; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/tiled,/area/medical/morgue) "bCM" = (/obj/effect/floor_decal/corner/paleblue{dir = 9},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/medical/morgue) @@ -4351,6 +4291,7 @@ "bGl" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bGm" = (/obj/machinery/door/firedoor/glass,/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bGn" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/atmospherics/portables_connector,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/medical/sleeper) +"bGo" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/medical/sleeper) "bGp" = (/obj/machinery/atmospherics/unary/cryo_cell,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/medical/sleeper) "bGq" = (/obj/structure/table/steel,/obj/item/weapon/storage/box/bodybags,/obj/effect/floor_decal/corner/paleblue/full{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/tiled,/area/medical/morgue) "bGr" = (/obj/structure/table/steel,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/blue{pixel_x = 3; pixel_y = -5},/obj/item/weapon/pen/red{pixel_x = -1; pixel_y = -9},/obj/effect/floor_decal/corner/paleblue{dir = 5},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled,/area/medical/morgue) @@ -4384,6 +4325,8 @@ "bGT" = (/obj/effect/floor_decal/corner/pink{dir = 1},/turf/simulated/floor/tiled/white,/area/assembly/robotics) "bGU" = (/obj/effect/floor_decal/corner/pink{dir = 5},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/assembly/robotics) "bGV" = (/obj/machinery/computer/rdconsole/robotics,/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor/tiled/white,/area/assembly/robotics) +"bGW" = (/obj/machinery/autolathe,/turf/simulated/floor/tiled/white,/area/assembly/robotics) +"bGX" = (/obj/machinery/r_n_d/circuit_imprinter,/turf/simulated/floor/tiled/white,/area/assembly/robotics) "bGY" = (/turf/simulated/wall/r_wall,/area/assembly/robotics) "bGZ" = (/obj/structure/table/reinforced,/obj/machinery/door/window/southright{name = "Robotics Desk"; req_access = list(29)},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/folder/white,/obj/item/weapon/pen,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/assembly/robotics) "bHa" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor/tiled,/area/hallway/primary/central_four) @@ -4471,7 +4414,8 @@ "bIF" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) "bIG" = (/obj/effect/floor_decal/corner/blue{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) "bIH" = (/obj/effect/floor_decal/corner/blue{dir = 5},/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge RC"; pixel_y = 28},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) -"bIK" = (/obj/effect/floor_decal/corner/blue{dir = 9},/turf/simulated/floor/tiled,/area/bridge_hallway) +"bII" = (/obj/structure/table/reinforced,/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 30},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) +"bIJ" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{department = "Head of Personnel's Office"},/obj/effect/floor_decal/corner/blue/full{dir = 1},/obj/machinery/ai_status_display{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) "bIL" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/bridge_hallway) "bIM" = (/obj/effect/floor_decal/corner/blue{dir = 6},/obj/structure/table/standard,/obj/item/weapon/storage/box/cups,/turf/simulated/floor/tiled,/area/bridge_hallway) "bIN" = (/obj/machinery/cell_charger,/obj/structure/table/steel,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/substation/command) @@ -4549,6 +4493,7 @@ "bKh" = (/turf/simulated/floor/carpet,/area/crew_quarters/heads/hop) "bKi" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/carpet,/area/crew_quarters/heads/hop) "bKj" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/crew_quarters/heads/hop) +"bKk" = (/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 0},/obj/effect/floor_decal/corner/blue{dir = 4},/obj/machinery/light_switch{pixel_x = 34; pixel_y = 0},/obj/machinery/keycard_auth{pixel_x = 24; pixel_y = 0},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) "bKl" = (/obj/effect/floor_decal/corner/blue{dir = 1},/turf/simulated/floor/tiled,/area/bridge_hallway) "bKm" = (/obj/effect/floor_decal/corner/blue{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/bridge_hallway) "bKn" = (/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/turf/simulated/floor,/area/maintenance/substation/command) @@ -4561,6 +4506,7 @@ "bKu" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bKv" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bKw" = (/obj/structure/table/marble,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 5},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) +"bKx" = (/obj/structure/table/standard,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bKy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/kitchen) "bKz" = (/obj/machinery/smartfridge/drying_rack,/turf/simulated/floor/grass,/area/hydroponics/garden) "bKA" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hydroponics) @@ -4609,6 +4555,7 @@ "bLr" = (/obj/item/device/radio/intercom{layer = 4; name = "Station Intercom (General)"; pixel_y = -27},/obj/machinery/camera/network/research{c_tag = "Research - Miscellaneous Test Chamber"; dir = 1; network = list("Research","Miscellaneous Reseach")},/turf/simulated/floor/reinforced,/area/rnd/misc_lab) "bLs" = (/obj/machinery/light,/turf/simulated/floor/reinforced,/area/rnd/misc_lab) "bLt" = (/obj/effect/floor_decal/corner/purple{dir = 9},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/rnd/research) +"bLu" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the RD's goons from the safety of his office."; name = "Research Monitor"; network = list("Research","Toxins Test Area","Robots","Anomaly Isolation","Research Outpost"); pixel_x = -32; pixel_y = -4},/obj/structure/table/standard,/obj/machinery/photocopier/faxmachine{department = "Research Director's Office"},/obj/effect/floor_decal/corner/purple{dir = 9},/turf/simulated/floor/tiled/white,/area/rnd/rdoffice) "bLv" = (/obj/structure/bed/chair/office/light{dir = 1},/obj/effect/landmark/start{name = "Research Director"},/obj/machinery/button/remote/blast_door{id = "Biohazard"; name = "Biohazard Shutter Control"; pixel_x = -38; pixel_y = 13; req_access = list(47)},/obj/machinery/button/remote/airlock{desc = "A remote control-switch for the cargo doors."; id = "researchdoor"; name = "Research door control"; pixel_x = -27; pixel_y = 13; req_access = list(30)},/obj/machinery/button/windowtint{pixel_x = -26; pixel_y = 21},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/white,/area/rnd/rdoffice) "bLw" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/white,/area/rnd/rdoffice) "bLx" = (/obj/effect/floor_decal/corner/purple{dir = 6},/turf/simulated/floor/tiled/white,/area/rnd/rdoffice) @@ -4648,6 +4595,7 @@ "bMf" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hydroponics) "bMg" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/hydroponics) "bMh" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/hydroponics) +"bMi" = (/obj/effect/floor_decal/corner/lime{dir = 6},/obj/machinery/biogenerator,/turf/simulated/floor/tiled,/area/hydroponics) "bMj" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "bMk" = (/turf/simulated/wall/r_wall,/area/medical/chemistry) "bMl" = (/obj/structure/sign/chemistry,/turf/simulated/wall/r_wall,/area/medical/chemistry) @@ -4934,6 +4882,7 @@ "bRH" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/light,/obj/machinery/button/remote/blast_door{id = "kitchen"; name = "Kitchen Shutters Control"; pixel_x = -1; pixel_y = -24; req_access = list(28)},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bRI" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bRJ" = (/obj/machinery/vending/dinnerware,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) +"bRK" = (/obj/machinery/conveyor{dir = 1; id = "packageSort1"},/obj/structure/plasticflaps/mining,/turf/simulated/floor/plating,/area/quartermaster/delivery) "bRL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH6"; location = "CH5"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "bRM" = (/obj/effect/floor_decal/corner/brown{dir = 10},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/obj/structure/flora/pottedplant{icon_state = "plant-22"},/turf/simulated/floor/tiled,/area/quartermaster/foyer) "bRN" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/neutral,/area/crew_quarters/cafeteria) @@ -5073,6 +5022,7 @@ "bUr" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/hydro,/area/rnd/xenobiology/xenoflora) "bUs" = (/obj/effect/floor_decal/corner/green{dir = 9},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora) "bUt" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/light{dir = 1},/obj/item/weapon/wrench,/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora) +"bUu" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/biogenerator,/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora) "bUv" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/seed_extractor,/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora) "bUw" = (/obj/machinery/reagentgrinder,/obj/structure/table/glass,/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora) "bUx" = (/obj/effect/floor_decal/corner/green{dir = 6},/obj/structure/table/glass,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora) @@ -5085,6 +5035,7 @@ "bUE" = (/turf/simulated/wall/r_wall,/area/assembly/chargebay) "bUF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/hallway/primary/central_four) "bUG" = (/turf/simulated/wall/r_wall,/area/bridge/meeting_room) +"bUH" = (/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/bridge/meeting_room) "bUI" = (/obj/machinery/button/remote/blast_door{id = "heads_meeting"; name = "Security Shutters"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/wood,/area/bridge/meeting_room) "bUJ" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/wood,/area/bridge/meeting_room) "bUK" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/camera/network/command{c_tag = "COM - Conference Room"},/obj/machinery/light{dir = 1},/turf/simulated/floor/wood,/area/bridge/meeting_room) @@ -5171,6 +5122,7 @@ "bWn" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/assembly/chargebay) "bWo" = (/obj/machinery/camera/network/northern_star{c_tag = "Hall - Central Primary Port Mid 2"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_four) "bWp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "heads_meeting"; name = "Meeting Room Window Shutters"; opacity = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/bridge/meeting_room) +"bWq" = (/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "Bridge"},/turf/simulated/floor/wood,/area/bridge/meeting_room) "bWr" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/carpet,/area/bridge/meeting_room) "bWs" = (/obj/structure/bed/chair/comfy/black,/turf/simulated/floor/carpet,/area/bridge/meeting_room) "bWt" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet,/area/bridge/meeting_room) @@ -5180,6 +5132,7 @@ "bWx" = (/obj/structure/flora/pottedplant{tag = "icon-plant-10"; icon_state = "plant-10"},/obj/structure/extinguisher_cabinet{pixel_x = -27},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bWy" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bWz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain) +"bWA" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = 28},/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bWB" = (/obj/machinery/computer/card,/obj/item/weapon/card/id/captains_spare,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bWC" = (/obj/machinery/computer/communications,/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bWD" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = 24},/turf/simulated/floor/wood,/area/crew_quarters/captain) @@ -5293,6 +5246,8 @@ "bYI" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "mining_dock_airlock"; pixel_x = -6; pixel_y = -25; req_one_access = list(13,48); tag_airpump = "mining_dock_pump"; tag_chamber_sensor = "mining_dock_sensor"; tag_exterior_door = "mining_dock_outer"; tag_interior_door = "mining_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "mining_dock_sensor"; pixel_x = 6; pixel_y = -24},/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/tiled/steel,/area/quartermaster/miningdock) "bYJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_access = null; req_one_access = list(12,47)},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/maintenance/research) "bYK" = (/obj/effect/floor_decal/corner/green/full,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/obj/machinery/camera/network/research{c_tag = "SCI - Xenoflora Storage"; dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora_storage) +"bYL" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/obj/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora_storage) +"bYM" = (/obj/machinery/atmospherics/unary/heater{dir = 2; icon_state = "heater"},/obj/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora_storage) "bYN" = (/obj/machinery/atmospherics/portables_connector,/obj/effect/floor_decal/corner/green/full{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora_storage) "bYO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora_storage) "bYP" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled/hydro,/area/rnd/xenobiology/xenoflora) @@ -5309,6 +5264,7 @@ "bZa" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/central_four) "bZb" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/primary/central_four) "bZc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green,/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "heads_meeting"; name = "Meeting Room Window Shutters"; opacity = 0},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/bridge/meeting_room) +"bZd" = (/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/wood,/area/bridge/meeting_room) "bZe" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/bridge/meeting_room) "bZf" = (/obj/structure/bed/chair/comfy/black{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/bridge/meeting_room) "bZg" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/bridge/meeting_room) @@ -5325,6 +5281,7 @@ "bZr" = (/obj/structure/table/woodentable,/obj/machinery/computer/skills,/obj/item/weapon/hand_tele,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bZs" = (/obj/machinery/door/window/southright{name = "Captain's Desk Door"; req_access = list(20)},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bZt" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/folder/blue,/obj/item/weapon/pen,/obj/item/device/megaphone,/obj/machinery/requests_console{announcementConsole = 1; department = "Captain's Desk"; departmentType = 5; name = "Captain RC"; pixel_x = 30; pixel_y = 0},/obj/structure/window/reinforced,/turf/simulated/floor/wood,/area/crew_quarters/captain) +"bZu" = (/obj/machinery/recharge_station,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/recreation_area_restroom) "bZv" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) "bZw" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) "bZx" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/space) @@ -5382,6 +5339,7 @@ "cax" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain) "cay" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/captain) "caz" = (/obj/structure/filingcabinet,/obj/machinery/light{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain) +"caA" = (/obj/machinery/recharge_station,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) "caC" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/neutral,/area/crew_quarters/cafeteria) "caD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) "caE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled/neutral,/area/crew_quarters/cafeteria) @@ -5473,6 +5431,7 @@ "ccn" = (/obj/effect/floor_decal/corner/pink{dir = 10},/obj/structure/table/glass,/obj/item/weapon/paper_bin,/obj/item/weapon/clipboard,/obj/item/weapon/pen,/turf/simulated/floor/tiled/white,/area/medical/patient_d) "cco" = (/obj/machinery/computer/med_data/laptop,/obj/structure/table/glass,/obj/effect/floor_decal/corner/pink/full{dir = 4},/obj/machinery/light,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/turf/simulated/floor/tiled/white,/area/medical/patient_d) "ccp" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/escape/medical_escape_pod_hallway) +"ccq" = (/obj/machinery/sleeper{dir = 4},/obj/effect/floor_decal/corner/paleblue/full{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/first_aid_station) "ccr" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/escape/medical_escape_pod_hallway) "ccs" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/hallway/secondary/escape/medical_escape_pod_hallway) "cct" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored/upper_level) @@ -5496,6 +5455,7 @@ "ccL" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/effect/floor_decal/corner/blue{dir = 6},/turf/simulated/floor/tiled,/area/bridge) "ccM" = (/obj/machinery/door/airlock/command{id_tag = "captaindoor"; name = "Captain's Office"; req_access = list(20)},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/crew_quarters/captain) "ccN" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/captain) +"ccO" = (/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "Captain's Office"},/turf/simulated/floor/wood,/area/crew_quarters/captain) "ccP" = (/turf/simulated/wall,/area/crew_quarters/captain) "ccQ" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/maintenance/central) "ccR" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -26},/obj/effect/floor_decal/corner/yellow/full,/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop) @@ -5788,6 +5748,7 @@ "ciu" = (/obj/machinery/computer/card,/obj/effect/floor_decal/corner/blue/full,/turf/simulated/floor/tiled,/area/bridge) "civ" = (/obj/machinery/computer/communications,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/blue/full{dir = 4},/turf/simulated/floor/tiled,/area/bridge) "ciw" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/secure/briefcase,/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/blue/full,/turf/simulated/floor/tiled,/area/bridge) +"cix" = (/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 0},/obj/structure/window/reinforced{dir = 4},/obj/effect/floor_decal/corner/blue/full{dir = 4},/turf/simulated/floor/tiled,/area/bridge) "ciy" = (/obj/machinery/computer/crew,/obj/effect/floor_decal/corner/white/full,/turf/simulated/floor/tiled,/area/bridge) "ciz" = (/obj/machinery/computer/med_data,/obj/effect/floor_decal/corner/white/full{tag = "icon-corner_white_full (EAST)"; icon_state = "corner_white_full"; dir = 4},/turf/simulated/floor/tiled,/area/bridge) "ciA" = (/obj/structure/table/reinforced,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/aicard,/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/blue/full,/obj/machinery/light,/turf/simulated/floor/tiled,/area/bridge) @@ -5816,6 +5777,7 @@ "ciX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/cafeteria) "ciY" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/item/weapon/wrench,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/large_escape_pod1/station) "ciZ" = (/obj/structure/closet/crate/medical,/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/box/masks{pixel_x = 0; pixel_y = 0},/obj/item/weapon/storage/box/gloves{pixel_x = 3; pixel_y = 4},/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/fire{layer = 2.9; pixel_x = 2; pixel_y = 3},/obj/item/weapon/storage/firstaid/adv{pixel_x = -2},/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/large_escape_pod1/station) +"cja" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod1/station) "cjb" = (/obj/machinery/sleep_console,/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod1/station) "cjc" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/light,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/large_escape_pod1/station) "cjd" = (/obj/structure/bed/chair{dir = 1},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/large_escape_pod1/station) @@ -5856,14 +5818,17 @@ "cjM" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 26},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_two) "cjN" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion_r"},/turf/space,/area/shuttle/large_escape_pod1/station) "cjO" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/corner/brown/full{dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/office) +"cjP" = (/obj/machinery/photocopier,/obj/effect/floor_decal/corner/brown/full{dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/office) "cjQ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/quartermaster/miningdock) "cjR" = (/obj/machinery/door/airlock/mining{id_tag = "cargodoor"; name = "Mining Dock"; req_access = list(50)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/quartermaster/miningdock) "cjT" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/quartermaster/delivery) +"cjU" = (/obj/machinery/conveyor{dir = 1; id = "packageSort1"},/turf/simulated/floor,/area/quartermaster/delivery) "cjV" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/maintenance/substation/cargo) "cjW" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor,/area/maintenance/substation/cargo) "cjX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor,/area/maintenance/substation/cargo) "cjY" = (/obj/structure/closet/crate,/obj/item/clothing/mask/gas,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/cargo) "cjZ" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 1; start_pressure = 740},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor,/area/maintenance/cargo) +"cka" = (/obj/effect/floor_decal/corner/red{dir = 8},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/light_switch{pixel_x = -36},/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/tiled,/area/security/checkpoint2) "ckb" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/obj/item/device/multitool,/obj/item/clothing/glasses/meson,/obj/machinery/ai_status_display{pixel_x = -32; pixel_y = 0},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/storage/tech) "ckc" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/obj/item/clothing/gloves/yellow,/obj/item/device/t_scanner,/obj/item/clothing/glasses/meson,/obj/item/device/multitool,/turf/simulated/floor/plating,/area/storage/tech) "ckd" = (/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flash,/obj/item/device/flash,/obj/structure/table/steel,/obj/machinery/camera/network/engineering{c_tag = "ENG - Technical Storage"; dir = 2},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/plating,/area/storage/tech) @@ -5888,6 +5853,7 @@ "ckw" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/delivery) "ckx" = (/obj/effect/floor_decal/corner/brown{dir = 5},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/delivery) "ckz" = (/obj/effect/floor_decal/industrial/warning/corner,/obj/machinery/firealarm{dir = 4; pixel_x = 26},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/quartermaster/delivery) +"ckA" = (/obj/structure/plasticflaps{opacity = 0},/obj/machinery/conveyor{dir = 1; id = "packageSort1"},/turf/simulated/floor,/area/quartermaster/delivery) "ckB" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning/corner,/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/maintenance/substation/cargo) "ckC" = (/obj/machinery/power/terminal,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor,/area/maintenance/substation/cargo) "ckD" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor,/area/maintenance/substation/cargo) @@ -5973,6 +5939,7 @@ "cmf" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/quartermaster/delivery) "cmg" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/quartermaster/delivery) "cmh" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/delivery) +"cmi" = (/obj/machinery/conveyor{dir = 1; id = "packageSort1"},/turf/simulated/floor/plating,/area/quartermaster/delivery) "cmj" = (/turf/simulated/wall,/area/storage/emergency_storage/emergency6) "cmk" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled,/area/storage/tools) "cml" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled,/area/storage/tools) @@ -6100,6 +6067,7 @@ "coM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/medbay_aft) "coN" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/medbay_aft) "coO" = (/obj/structure/closet/crate/medical,/turf/simulated/floor,/area/maintenance/medbay_aft) +"coP" = (/obj/machinery/autolathe,/obj/effect/floor_decal/corner/brown{dir = 9},/turf/simulated/floor/tiled,/area/quartermaster/office) "coQ" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/quartermaster/office) "coR" = (/obj/machinery/computer/supplycomp,/turf/simulated/floor/tiled,/area/quartermaster/office) "coS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/sleep/elevator) @@ -6564,12 +6532,14 @@ "cxW" = (/obj/machinery/door/airlock/glass_medical{name = "First-Aid Station"; req_one_access = list(5,10,63)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/medical/first_aid_station) "cxX" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/obj/machinery/camera/network/civilian{c_tag = "CIV - Visitor Room 5"; dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_5) "cxY" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 2},/obj/machinery/light,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_5) +"cxZ" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_5) "cya" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_11) "cyb" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock{name = "Room 11"},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_11) "cyc" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/white{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cyd" = (/obj/effect/floor_decal/corner/blue,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cye" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_11) "cyf" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) +"cyg" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_6) "cyh" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 2},/obj/machinery/light,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_6) "cyi" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/obj/machinery/camera/network/civilian{c_tag = "CIV - Visitor Room 6"; dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_6) "cyj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/medical/first_aid_station) @@ -6578,12 +6548,14 @@ "cym" = (/obj/effect/floor_decal/corner/red{dir = 5},/obj/structure/closet/secure_closet/security,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/security/checkpoint2) "cyn" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/obj/machinery/camera/network/civilian{c_tag = "CIV - Visitor Room 11"; dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_11) "cyo" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 2},/obj/machinery/light,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_11) +"cyp" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_11) "cyq" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cyr" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_5) "cys" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/white{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cyt" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_5) "cyu" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_6) "cyv" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_12) +"cyw" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_12) "cyx" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 2},/obj/machinery/light,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_12) "cyy" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/obj/machinery/camera/network/civilian{c_tag = "CIV - Visitor Room 12"; dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_12) "cyz" = (/obj/structure/table/reinforced,/obj/item/weapon/stamp/ce,/obj/item/weapon/pen,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/flame/lighter/zippo,/obj/item/device/megaphone,/obj/item/weapon/folder/yellow_ce,/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) @@ -6630,6 +6602,8 @@ "czo" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/bar) "czp" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/white{dir = 8},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "czq" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) +"czr" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "cargo_bay_door"; locked = 1; name = "Cargo Docking Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/quartermaster/storage) +"czs" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/floor,/area/quartermaster/storage) "czt" = (/obj/effect/floor_decal/industrial/loading{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/storage) "czu" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/storage) "czv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/storage) @@ -6837,6 +6811,7 @@ "cDp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/crew_quarters/bar) "cDq" = (/obj/structure/table/woodentable,/obj/item/weapon/material/ashtray/glass,/turf/simulated/floor/wood,/area/crew_quarters/bar) "cDr" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar) +"cDs" = (/obj/machinery/recharge_station,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) "cDt" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_3) "cDu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_3) "cDv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_3) @@ -6864,6 +6839,9 @@ "cDT" = (/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_10) "cDU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_10) "cDV" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_10) +"cDW" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "cargo_bay_door"; locked = 1; name = "Cargo Docking Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/quartermaster/storage) +"cDX" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/floor,/area/quartermaster/storage) +"cDY" = (/obj/machinery/conveyor{dir = 9; id = "QMLoad"},/turf/simulated/floor,/area/quartermaster/storage) "cDZ" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/storage) "cEa" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/storage) "cEb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/storage) @@ -6926,10 +6904,12 @@ "cFg" = (/obj/structure/closet/secure_closet/engineering_personal,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/camera/network/engineering{c_tag = "ENG - Locker Room"; dir = 4},/turf/simulated/floor/tiled/yellow,/area/engineering/locker_room) "cFh" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/obj/machinery/camera/network/civilian{c_tag = "CIV - Visitor Room 3"; dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_3) "cFi" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 2},/obj/machinery/light,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_3) +"cFj" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_3) "cFk" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/mirror{pixel_x = -28},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_10) "cFl" = (/obj/machinery/door/airlock{name = "Restroom"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_3) "cFm" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/crew_quarters/sleep/vistor_room_4) "cFn" = (/obj/machinery/door/airlock{name = "Restroom"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_9) +"cFo" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_4) "cFp" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 2},/obj/machinery/light,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_4) "cFq" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/obj/machinery/camera/network/civilian{c_tag = "CIV - Visitor Room 4"; dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_4) "cFr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/hallway/primary/port) @@ -6938,10 +6918,12 @@ "cFu" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/hallway/primary/port) "cFv" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/obj/machinery/camera/network/civilian{c_tag = "CIV - Visitor Room 9"; dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_9) "cFw" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 2},/obj/machinery/light,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_9) +"cFx" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_9) "cFy" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/white{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cFz" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_3) "cFA" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/disposalpipe/junction{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_3) "cFB" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_10) +"cFC" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_10) "cFD" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 2},/obj/machinery/light,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_10) "cFE" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/obj/machinery/camera/network/civilian{c_tag = "CIV - Visitor Room 10"; dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_10) "cFF" = (/obj/structure/closet/wardrobe/engineering_yellow,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/firealarm{dir = 4; layer = 3.3; pixel_x = 26},/turf/simulated/floor/tiled/yellow,/area/engineering/locker_room) @@ -6949,6 +6931,7 @@ "cFH" = (/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) "cFI" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/quartermaster/storage) "cFJ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/quartermaster/storage) +"cFK" = (/obj/machinery/conveyor{dir = 2; id = "QMLoad"},/obj/machinery/light{dir = 8},/turf/simulated/floor,/area/quartermaster/storage) "cFL" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/quartermaster/storage) "cFM" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/storage) "cFN" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/storage) @@ -6992,6 +6975,7 @@ "cGz" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/wood,/area/crew_quarters/bar) "cGA" = (/obj/structure/table/reinforced,/obj/machinery/door/blast/shutters{dir = 1; id = "bar"; layer = 3.1; name = "Bar Shutters"},/turf/simulated/floor/lino,/area/crew_quarters/bar) "cGB" = (/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) +"cGC" = (/obj/machinery/conveyor{dir = 2; id = "QMLoad"},/turf/simulated/floor,/area/quartermaster/storage) "cGD" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "QMLoad"},/turf/simulated/floor/tiled,/area/quartermaster/storage) "cGE" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/quartermaster/storage) "cGF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/storage) @@ -7060,6 +7044,7 @@ "cHQ" = (/obj/structure/toilet,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_8) "cHR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/sleep/engi_wash) "cHS" = (/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) +"cHT" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/status_display/supply_display{pixel_y = -32},/turf/simulated/floor,/area/quartermaster/storage) "cHU" = (/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/storage) "cHV" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/tiled,/area/quartermaster/storage) "cHW" = (/obj/machinery/button/remote/blast_door{id = "qm_warehouse"; name = "Warehouse Door Control"; pixel_x = 26; pixel_y = 0; req_access = list(31)},/turf/simulated/floor/tiled,/area/quartermaster/storage) @@ -7286,6 +7271,7 @@ "cMj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/hallway/primary/port) "cMk" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/obj/machinery/camera/network/civilian{c_tag = "CIV - Visitor Room 1"; dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_1) "cMl" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 2},/obj/machinery/light,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_1) +"cMm" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_1) "cMn" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_1) "cMp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_1) "cMq" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/mirror{pixel_x = -28},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_2) @@ -7302,6 +7288,7 @@ "cMC" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_7) "cMD" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_7) "cME" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_8) +"cMF" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_8) "cMG" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 2},/obj/machinery/light,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_8) "cMH" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/obj/machinery/camera/network/civilian{c_tag = "CIV - Visitor Room 8"; dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_8) "cMI" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/hallway/primary/port) @@ -7445,8 +7432,11 @@ "cPv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_5) "cPw" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cPx" = (/turf/simulated/wall,/area/crew_quarters/visitor_laundry) +"cPy" = (/obj/machinery/washing_machine,/obj/effect/floor_decal/corner/blue{dir = 1},/obj/effect/floor_decal/corner/white{dir = 4},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry) +"cPz" = (/obj/machinery/washing_machine,/obj/effect/floor_decal/corner/blue{dir = 1},/obj/effect/floor_decal/corner/white{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry) "cPA" = (/obj/effect/floor_decal/corner/blue{dir = 1},/obj/effect/floor_decal/corner/white{dir = 4},/obj/structure/undies_wardrobe,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry) "cPB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_11) +"cPC" = (/obj/machinery/recharge_station,/obj/effect/floor_decal/corner/blue{dir = 1},/obj/effect/floor_decal/corner/white{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry) "cPD" = (/obj/structure/closet/wardrobe/pjs,/obj/effect/floor_decal/corner/blue{dir = 1},/obj/effect/floor_decal/corner/white{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry) "cPE" = (/obj/structure/closet/wardrobe/pjs,/obj/effect/floor_decal/corner/blue/diagonal,/obj/effect/floor_decal/corner/white{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry) "cPF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engineering/break_room) @@ -7515,6 +7505,7 @@ "cQQ" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cQR" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cQS" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) +"cQT" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/reinforced,/obj/machinery/recharger,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cQU" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/reinforced,/obj/item/weapon/hand_labeler,/obj/item/device/communicator,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cQV" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/reinforced,/obj/item/weapon/folder,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cQW" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/reinforced,/obj/item/device/paicard,/obj/item/clothing/head/soft/grey,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) @@ -7561,6 +7552,7 @@ "cRM" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills,/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) "cRN" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) "cRO" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) +"cRP" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{department = "Chief Engineer's Office"},/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Engineer's Desk"; departmentType = 6; name = "Chief Engineer RC"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) "cRQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/engineering) "cRR" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor,/area/maintenance/evahallway) "cRS" = (/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor/plating,/area/maintenance/evahallway) @@ -7673,6 +7665,7 @@ "cTY" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/atmos) "cTZ" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos) "cUa" = (/obj/machinery/door/airlock/glass_atmos{name = "Atmospherics Monitoring Room"; req_access = list(24)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) +"cUb" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/reinforced,/obj/machinery/microwave,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/break_room) "cUc" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/carpet,/area/engineering/break_room) "cUd" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet,/area/engineering/break_room) "cUe" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor/carpet,/area/engineering/break_room) @@ -7882,6 +7875,7 @@ "cYb" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer) "cYc" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/atmospherics/pipe/simple/hidden/red,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer) "cYd" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer) +"cYe" = (/obj/structure/table/reinforced,/obj/machinery/recharger,/turf/simulated/floor/tiled,/area/engineering/foyer) "cYf" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hallway/secondary/entry/docking_lounge) "cYg" = (/obj/machinery/computer/security/engineering,/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring) "cYh" = (/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring) @@ -8011,6 +8005,8 @@ "daJ" = (/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/tiled,/area/engineering/atmos) "daK" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/binary/pump{dir = 4; name = "O2 to Mixing"},/turf/simulated/floor/tiled,/area/engineering/atmos) "daL" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) +"daM" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) +"daN" = (/obj/machinery/atmospherics/unary/heater{dir = 2; icon_state = "heater"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) "daP" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) "daQ" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Port to Waste"},/turf/simulated/floor/tiled,/area/engineering/atmos) "daR" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled,/area/engineering/atmos) @@ -8550,6 +8546,7 @@ "dli" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/reinforced/carbon_dioxide,/area/engineering/atmos) "dlk" = (/turf/simulated/floor/reinforced/n20,/area/engineering/atmos) "dll" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor/reinforced/n20,/area/engineering/atmos) +"dlm" = (/obj/machinery/recharge_station,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "dln" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/effect/decal/remains/robot,/turf/simulated/floor,/area/engineering/drone_fabrication) "dlo" = (/obj/machinery/drone_fabricator,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "dlp" = (/turf/simulated/floor/plating,/area/engineering/drone_fabrication) @@ -8885,6 +8882,7 @@ "drJ" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light_switch{pixel_x = -38; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/engine_smes) "drK" = (/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/device/multitool{pixel_x = 5},/obj/item/clothing/gloves/yellow,/obj/structure/table/steel,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled,/area/engineering/engine_smes) "drL" = (/turf/simulated/wall/r_wall,/area/engineering/engine_monitoring) +"drM" = (/obj/structure/table/standard,/obj/machinery/microwave{pixel_x = -2; pixel_y = 5},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "drN" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "drO" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "drP" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/ai_status_display{layer = 4; pixel_y = 32},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) @@ -9348,6 +9346,7 @@ "dAF" = (/obj/machinery/atmospherics/unary/heat_exchanger,/turf/simulated/floor,/area/engineering/engine_room) "dAG" = (/obj/structure/grille,/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (EAST)"; icon_state = "phoronrwindow"; dir = 4},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (WEST)"; icon_state = "phoronrwindow"; dir = 8},/obj/machinery/door/blast/regular{dir = 1; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor/plating,/area/engineering/engine_room) "dAH" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/reinforced/nitrogen{nitrogen = 82.1472},/area/engineering/engine_room) +"dAI" = (/obj/machinery/power/supermatter{layer = 4},/obj/machinery/mass_driver{id = "enginecore"},/turf/simulated/floor/greengrid/nitrogen,/area/engineering/engine_room) "dAJ" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/reinforced/nitrogen{nitrogen = 82.1472},/area/engineering/engine_room) "dAK" = (/obj/machinery/power/generator{anchored = 1; dir = 4},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/engineering/engine_room) "dAL" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 6},/turf/simulated/floor/plating,/area/engineering/engine_room) @@ -9416,6 +9415,7 @@ "dBX" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_2) "dBY" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_2) "dBZ" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 2},/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_2) +"dCa" = (/obj/structure/table/standard,/obj/machinery/microwave,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_2) "dCb" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/tiled,/area/hallway/primary/port) "dCc" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/obj/machinery/camera/network/civilian{c_tag = "CIV - Visitor Room 2"; dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_2) "dCd" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/crew_quarters/sleep/vistor_room_2) @@ -9425,6 +9425,7 @@ "dCh" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 2},/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_7) "dCi" = (/obj/structure/bed/chair/comfy/beige{dir = 8},/obj/machinery/camera/network/civilian{c_tag = "CIV - Visitor Room 7"; dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_7) "dCj" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_7) +"dCk" = (/obj/structure/table/standard,/obj/machinery/microwave,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_7) "dCl" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_7) "dCm" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/blue,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "dCn" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_8) @@ -9491,6 +9492,7 @@ "dDx" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask,/obj/item/weapon/reagent_containers/food/drinks/flask/barflask,/obj/machinery/light,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/lino,/area/crew_quarters/bar) "dDy" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/lino,/area/crew_quarters/bar) "dDz" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/barrestroom) +"dDA" = (/obj/machinery/recharge_station,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/barrestroom) "dDB" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass{id_tag = "security_bar"; name = "Bar"},/turf/simulated/floor/tiled,/area/crew_quarters/bar) "dDC" = (/obj/machinery/door/airlock/glass{id_tag = "security_bar"; name = "Bar"},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/crew_quarters/bar) "dDD" = (/obj/effect/floor_decal/corner/white/diagonal,/obj/structure/table/woodentable,/obj/item/weapon/dice,/obj/structure/noticeboard{pixel_x = 0; pixel_y = 27},/obj/item/weapon/deck/cards,/turf/simulated/floor/tiled,/area/engineering/break_room) @@ -9562,11 +9564,13 @@ "dFz" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/door/window/brigdoor/southleft{name = "Lethal Ammo"; req_access = list(3)},/turf/simulated/floor/tiled/dark,/area/security/armoury) "dFA" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/dark,/area/security/armoury) "dFB" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/obj/machinery/light{dir = 1},/obj/machinery/firealarm{dir = 2; layer = 3.3; pixel_x = 0; pixel_y = 26},/turf/simulated/floor/tiled/dark,/area/security/armoury) +"dFC" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/recharger/wallcharger{pixel_x = 32; pixel_y = -4},/turf/simulated/floor/tiled/dark,/area/security/armoury) "dFD" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/dark,/area/security/armoury) "dFE" = (/obj/structure/table/rack,/obj/effect/floor_decal/corner/red/full{dir = 8},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced{dir = 1},/obj/item/ammo_magazine/mc9mmt/practice,/obj/item/ammo_magazine/mc9mmt/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/machinery/door/window/brigdoor/eastright{name = "Ammo"},/turf/simulated/floor/tiled/dark,/area/security/armoury) "dFF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/dark,/area/security/armoury) "dFG" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/dark,/area/security/armoury) "dFH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/stool,/turf/simulated/floor/tiled/dark,/area/security/armoury) +"dFI" = (/obj/machinery/recharger/wallcharger{pixel_x = 32; pixel_y = -4},/turf/simulated/floor/tiled/dark,/area/security/armoury) "dFJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled/dark,/area/security/armoury) "dFK" = (/obj/structure/table/rack,/obj/effect/floor_decal/corner/red{dir = 9},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/machinery/door/window/brigdoor/eastright{name = "Ammo"},/turf/simulated/floor/tiled/dark,/area/security/armoury) "dFL" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/empslite{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/turf/simulated/floor/tiled/dark,/area/security/armoury) @@ -9722,143 +9726,143 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaaaaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaaaaadaadaaaaaaaddaddaddaddaddaddahQabXacraddaddadYadZaeaacsaddaddaahaahaahaahaaeaaqaaraayaazaaAaazaaBaaxaaqaaeaahaahaahaahaahaahaahaahaaSabtabtaaSaaSaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczaczacAaczaczacOacAaadaadaadaadaaaaaaaaaaadaadaadacOaadaaaaaaaaaaddaifakQakQakQakQakQactakQakQakQakQakQakQakQacvaddaddaahaahaahaaeaaqaaraayaazaaCaazaaBaaxaaqaaeaahaahaahaahaahaahaahaahaaSabtabtabtaaSaaSaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxaiwaeLaeMaeMaeMaeMaeNaeMaeMaeMaeMaeOaePadVacBabQaddaahaahaahaaeaaqaaraayaazaaAaazaaBaaxaaqaaeaahaahaahaahaahaahaahaahaaSaaSabtabtabHaaSaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacCaiwaddaeMadbafbafcafdafeafbaffaeMagHaddaddacEacDaddaahaahaahaaeaaqaaDaaEaaAaaAaaAaaFaaGaaqaaeaahaahaahaahaahaahaahaahaahaaSabtabtabIaiZaiZaiZaiZaiZaiZaahaahaahaahaahahyaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacCaiwaddaeMafaafbafcafdafeafbaffaeMagHaddaddacEacDaddaahaahaahaaeaaqaaDaaEaaAaaAaaAaaFaaGaaqaaeaahaahaahaahaahaahaahaahaahaaSabtabtabIaiZaiZaiZaiZaiZaiZaahaahaahaahaahahyaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyaaaacyacyacyacyacyaaaacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFacGaeMafoafcafpafqafrafsaftaftafuaeMaahaddaddacGaddaahaahaahaaeaaHaaIaajaaJaaJaaJaajaaIaaKaaeaahaahaahaahaahaahaahaahaaSaaSacHaaSaiZaiZajHajrajsajsaiZahyahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacyacyacyacyacyaaaacyacyacyacyacyaaaacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddacIaeMafFafGafHafIafJafKafLafMafNaeMaahaahaddacIaddaahaahaahaaeaaeaaeaaeaaLaaMaaMaaeaaeaaeaaeaahaaSaaSaaSaaSaaSaaSaaSaaSaiYabtaiXaiZajWajHajHajsajsaiZahyahyaaaahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddacKaddacLaeMafSafTafUafVafWafXafYafcafZaeMaahaahaddacLaddaddaddaahaahaahaahaaNaaOaaPaaPaaNaahaahaahaaSaaSabtabtabtacMabtabtabtabtabtajFakAajWajHakhaiZaiZaiZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddaddakNakOakRaeMafcafcagkaglaglaglagmafcafcaeMaahaahaddaiwacQacPaddaddaddaddaddaaeaaRaaRaaRaaNaaSaaSaaSaaSabtabtakAakAakAakAakAakAakAabtakCakAacRakEajHafaakGakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaddaddacSalvacTadVaeMagtaguagkafcagvafcagwaguagxaeMaahaahaddaiwacVacUacXacWacZacYaddabbabcabdabcabeaaSabtadaabsabKabqakAalkallalmalnahHakAabtajFakAalNalOadcaiZaiZaiZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddaddakNakOakRaeMafcafcagkaglaglaglagmafcafcaeMaahaahaddaiwacQacPaddaddaddaddaddaaeaaRaaRaaRaaNaaSaaSaaSaaSabtabtakAakAakAakAakAakAakAabtakCakAacRakEajHakFakGakHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaddaddacSalvacTadVaeMagtaguagkafcagvafcagwaguagxaeMaahaahaddaiwacVacUacXacWacZacYaddabbabcabdabcabeaaSabtadaabsabKabqakAalkallalmalnadbakAabtajFakAalNalOadcaiZaiZaiZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeadeadeaaaadfadfadfahyahyaaQaahaaaalTalUalVaaaalWalXalYaddaifakRadgaddaddaeMaeMaeMagCagDagEagFagGaeMaeMaeMaahaahaddadhadiakQakQakQadkadjadmadladoadnaeyaboabpabtabtabJabHabIakAalGalHalIalJalKakAadpalMakAaiZajHadqalQalRalSaaaahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamuadeadeadeaBmadfadfadfaBmaahaahaahamxamvamwamvamxamyamzamyadraiwadVaddaddaahagHagNagNagPagQagRagSagTahtahtagHaahaahaddaddaddaddaddahoahPagMagMadsabcadtaduabGaaSaaSakzakzakzakzakAamiamjamkamlammakAamnamoabqaiZampamqamramsamtahyahyahyahyahyaaaaaaahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamPamQamQamRaaaamuatNatNatNaBmatNatNatNaBmaahaahaahamxamvamSamvamxamyamTamyadraiwadVaddaahaahagHahbahcahdahcahcahcaheahfahgagHaahaahaahaahaahaahagMadvadAadzagMagMadDadBadEaaNaTWaahakzalhalialjakAamlamGamHamIamJakAabvamKamLaiZajHamMamNamsamOahyahyahyahyahyahyahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamuanhaniamuamuamuanjankamuamuanlanmajVanoamuamuadGadFadHaBmadIayZadJaBmaahaahaahamxamvanpamvamxamyanqamyadraiwadVaddaahaahagHahqahqagPagQahrahsagTagVagVagHaahaahaahaahaahaahagMadSadUadTadWahoabcabZafwaaNaahaahakzalEakzalFakAancandaneancandakzakzaaSanfaiZaiZangaiZaiZaiZahyahyahyahyahyahyahyahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamuanhaniamuamuamuanjankamuamuanlanmannanoamuamuadGadFadHaBmadIayZadJaBmaahaahaahamxamvanpamvamxamyanqamyadraiwadVaddaahaahagHahqahqagPagQahrahsagTagVagVagHaahaahaahaahaahaahagMadSadUadTadWahoabcabZafwaaNaahaahakzalEakzalFakAancandaneancandakzakzaaSanfaiZaiZangaiZaiZaiZahyahyahyahyahyahyahyahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyamuamuaobaocaodaoeaofaogaohaoiaojaokaolaolaomaonamuayZayZayZaBmadXayZayZaBmaahaahaahamxaooaopaoqamxaoraosaotadraiwaebaddaahaahagHaecahfahEahFaeeaedaefahcaehagHaahaahaahaahaahaahagMahAaepaeiaeqahaabDabZaeraaNaahaahakzaesanKanLanManNanOanPanQanRamfakzanTanUanVanWanXanYanYanZanZanZanZaoaahyahyahyahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyamuapeapfapgaphapiaphapjapkapeaplapmapmapmapnapoamuaeuaetaevaBmaewaetaexaBmaeAaeAaeAamxappapqapramxapsapqaptamxaeBanranraahagHagHahSahSagPahTaeDahVagUaeEaeHagHagHaahaahaahaahaahagMagMagMagMagMapzafgaeIafiaaNaahaahakzaoIaoJaoKaoLaoMaoNaoOaoPaoQaoRaoSaoTaoTaoUaoVaoWaoXaoYaoZapaapbapcaeJahyahyahyahyahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyahyamuapYapZaqaapZaqbaqcaqaapZapYaqdapnaqeapmaqfaqgamuatNayZatNaBmatNaeKatNaBmatNatNanramxanraqhaqiamxanraqjaqiamxapxapyanraahagHaiiagUagUagPaijaeQailagUagUagUagUagHaahaahaahaahaahaahapzaqqaqraeRapzabYabZagKaaNaahaahakzapJamfamfapKapLapMapNamfamfapOakzapPanTaeTaeSaeUanTapTapUapVapWapcaeWahyahyahyahyahyahyahyahyaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyahyahyahyahyahyahyahyahyahyamuaqMapZapZaqNaqOaqPaqQaqQaqRaqSaqTaqUaqVaqWaqXaqYaLqaLqaLqaLqaLqaLqaLqaLqafhaeZafkafjafxafnafzafyafxafAafOafCagbapwanraahagHagcaiAagUagPagQaeQagSagUaizaiyagdagHagHagHagHagHaahaahapzagiagearparoagnagjagoaaNaahaahakzaqFaqGaqHaqIaqJaqKaqGaqHaqFakzakzanZanZaqLanZanZanZanZanZanZanZanZanZanZaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyahyahyahyahyahyahyahyahyahyahyamuarParQarRarSarTarUarVarWarXarYarZasaasbascakFamuayZagpagrayZayZagsayZayZauNayZanransansansansagIansansagOagJasrapwanraahagHagWahUagUagPagUagTagUagUaiyagUagUaiOaiNaiMaiMagHaahaahapzassagXasuapzagYabZagZaaNaahaahakzarEarFarGarHarIarJarKarLarMakzaahaahanZahiahhahhahhahhahhahkahjanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyahyahyahyahyahyahyahyahyahyahyamuarParQarRarSarTarUarVarWarXarYarZasaasbascasdamuayZagpagrayZayZagsayZayZauNayZanransansansansagIansansagOagJasrapwanraahagHagWahUagUagPagUagTagUagUaiyagUagUaiOaiNaiMaiMagHaahaahapzassagXasuapzagYabZagZaaNaahaahakzarEarFarGarHarIarJarKarLarMakzaahaahanZahiahhahhahhahhahhahkahjanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyahyahyasGasGasGasHasIasJasIasKasGasGamuasLasLasMasNasOasPasNasLasLamuamuamuamuamuamuasLasQasRasRasRasRasRatNayZauNatNanranraqkaqkanranranranransahlahmanranraahagHajiajiagUagPagUahnajeajeajfajeajeajdahpajbahuagHaahaahdEOdEOdEOdEOapzahvabSafwaaNaaNaahakzaqFaqFaqFaqIaqJaqKaqFaqFaqFakzaahaahanZaAJarOanZanZanZanZaAJarNanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyatiatiatiatiatjatkatlatmatnatoatpatqatratsattatuatvatwatxatyatzakWannatCatDatEatFatGatHatIasQatJatKatLatMasRatNatNahwatNahxanranranranraahaahanrahzatQatRanraeAaahagHagUagUagUahBajzahCagUagUajwagUagUaiOajvajuahDagHaahdEOdEOanGahGahJahIagaabEahLahKaaNaahakzamfatganQaqIaqJaqKatganQathakzaahamXamXamXamXamXanyanxanZanZarNanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyatiatiatiatiatjatkatlatmatnatoatpatqatratsattatuatvatwatxatyatzatAatBatCatDatEatFatGatHatIasQatJatKatLatMasRatNatNahwatNahxanranranranraahaahanrahzatQatRanraeAaahagHagUagUagUahBajzahCagUagUajwagUagUaiOajvajuahDagHaahdEOdEOahHahGahJahIagaabEahLahKaaNaahakzamfatganQaqIaqJaqKatganQathakzaahamXamXamXamXamXanyanxanZanZarNanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyatiatiauiaujaukaulaumaunauoaupauqaurausautauuauvauwauxauyauzauAauBauCauBauDauEauFauGauHauGauIasQauJauKauLauMasRaahatNauNatNatNanraahaahaahaahaahanrasTauOasranraahaahagHajUahNahMahWahRahXagUagUajNajMajLagHajKajJagHagHaahdEOahYaibahZaigaicaikaihafwaimaaNaahakzaqFaufaugaqIaqJaqKauhaugaqFakzaahamXaoxanzanzaoyaozanzapEanZarNanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahyahyahyahyahyatiauXauYauZatiavaavbanSavdaveavdavfavfavgavhaviavjavkavfavlavmavnavoavpavqatDavravsavtavuavvavwavxavyavzavAasRaahatNavBatNaahaahaahaahaahaahaahanrasTauOasranraahaahagHagHakbakcagHainahXagUagHakbakcagHagHagHagHagHahyahydEOaioaOqaipairaiqabYafvafwaisaaNaahakzauSauTakzauUauVauWakzauSauTakzaahamXaitanzanzapBaiuapDapEanZaixanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaxsaxsaxsaxsaxsaxsaxsaxsaahatiavKavLavMatiavNavOavdavdavPavQavfasdavSavTavUavTavVavWavXavYavZawaawbawcawdaweaweawfaweawgasQawhawiasRawjasRaahatNauNatNaahaahaahaahaahaahanranrawkaiBawmanranrahyahyahyahyahyagHaiCaiDakfagHahyahyahyaahaahaahahyahyahydEOaiEaiGaiFdEOaaNaiIaiHaiJaaNaaNahyahyahyahyaiKavHavIavJaiKahyahyahyaahamXanwanzanzaquaquaquapEanZarNanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyaahaahaahaahaahaahaahaahaxsdFmdFnazHdFoaytayuaxsaahatiawAawBawCatiawDawEavdawFawGawHavfawIawJawKawLawMawNawOawPavmawQawQawRawSatDatEawTawUatBatAasQawXawYasRawZasRaahatNauNatNaahaahaahaahaahatNavCaxaaxbaxcaxdaxeavCavCaxfaxgaxhavCavCaxdavEawnavCavCavCavCavCavCavCaxfaxgaxhavCaiLaiQaiPavCaxkaxlaxmaxdaxnawsawsawsaxoaxpawsavHaxqavJawsaxoaxpawsawsamXaiRanwanwanwanwanwapEanZaiSanZaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyaahaahaahaALaALaALaALaALaALaALaxsdFqdFqazHazHdFrdFraxsaahatiaxtaxuaxvaxwaxxaxyavdavQaxzaxAavfaubaxCaxDaxEaxFaxGavfawPaxHaxIawQawRaxJaxKaxKaxKaxKaxKaxKaxKaxLaxLaxLaxLaxLaahatNauNatNatNatNatNatNatNatNaxMawnaxNaxOaxPaxQaiTaxSaxTaxQaxQaxRaxVaiUaiWaiVaiVajaaiVaiVajgajcajhaiVajjaiVajkaiVaiVaiVajaaiVajmajlajnaydayeaygayfayfayhayiajpajoavJaymaymaymaymaypamXajqajtanzanzajxanwanZanZarNanZaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaALaALaALaALaALaALaALaALaxsdFsdFsazHazHdFtdFuaxsaahatiayxayyayzatiayAavbavdayBayCayDavfavcayFavTayGavTayHayIayJayKayLayMayNayOayPayQayRayPazXaySayPayTayUayVayWayXatNatNauNayYayZayZayZazaazbazcazdawnaxlazeazfazgazkaziazjazjazgazhaziazjazlazjazgazmaznaznaznazoaznaznazpaznazqaznaznaznazmazqazpazrazsaztazuazvazvazvazwazvazvajyajAazvazvazvazvavDavGavFawoawlawlawpajBanZarOarNanZaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahyahyahyahyahyatiauXauYauZatiavaavbavcavdaveavdavfavfavgavhaviavjavkavfavlavmavnavoavpavqatDavravsavtavuavvavwavxavyavzavAasRaahatNavBatNaahaahaahaahaahaahaahanrasTauOasranraahaahagHagHakbakcagHainahXagUagHakbakcagHagHagHagHagHahyahydEOaioaOqaipairaiqabYafvafwaisaaNaahakzauSauTakzauUauVauWakzauSauTakzaahamXaitanzanzapBaiuapDapEanZaixanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaxsaxsaxsaxsaxsaxsaxsaxsaahatiavKavLavMatiavNavOavdavdavPavQavfavRavSavTavUavTavVavWavXavYavZawaawbawcawdaweaweawfaweawgasQawhawiasRawjasRaahatNauNatNaahaahaahaahaahaahanranrawkaiBawmanranrahyahyahyahyahyagHaiCaiDakfagHahyahyahyaahaahaahahyahyahydEOaiEaiGaiFdEOaaNaiIaiHaiJaaNaaNahyahyahyahyaiKavHavIavJaiKahyahyahyaahamXanwanzanzaquaquaquapEanZarNanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyaahaahaahaahaahaahaahaahaxsdFmdFnazHdFoaytayuaxsaahatiawAawBawCatiawDawEavdawFawGawHavfawIawJawKawLawMawNawOawPavmawQawQawRawSatDatEawTawUawVawWasQawXawYasRawZasRaahatNauNatNaahaahaahaahaahatNavCaxaaxbaxcaxdaxeavCavCaxfaxgaxhavCavCaxdavEawnavCavCavCavCavCavCavCaxfaxgaxhavCaiLaiQaiPavCaxkaxlaxmaxdaxnawsawsawsaxoaxpawsavHaxqavJawsaxoaxpawsawsamXaiRanwanwanwanwanwapEanZaiSanZaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyaahaahaahaALaALaALaALaALaALaALaxsdFqdFqazHazHdFrdFraxsaahatiaxtaxuaxvaxwaxxaxyavdavQaxzaxAavfaxBaxCaxDaxEaxFaxGavfawPaxHaxIawQawRaxJaxKaxKaxKaxKaxKaxKaxKaxLaxLaxLaxLaxLaahatNauNatNatNatNatNatNatNatNaxMawnaxNaxOaxPaxQaiTaxSaxTaxQaxQaxRaxVaiUaiWaiVaiVajaaiVaiVajgajcajhaiVajjaiVajkaiVaiVaiVajaaiVajmajlajnaydayeaygayfayfayhayiajpajoavJaymaymaymaymaypamXajqajtanzanzajxanwanZanZarNanZaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaALaALaALaALaALaALaALaALaxsdFsdFsazHazHdFtdFuaxsaahatiayxayyayzatiayAavbavdayBayCayDavfaEqayFavTayGavTayHayIayJayKayLayMayNayOayPayQayRayPazXaySayPayTayUayVayWayXatNatNauNayYayZayZayZazaazbazcazdawnaxlazeazfazgazkaziazjazjazgazhaziazjazlazjazgazmaznaznaznazoaznaznazpaznazqaznaznaznazmazqazpazrazsaztazuazvazvazvazwazvazvajyajAazvazvazvazvavDavGavFawoawlawlawpajBanZarOarNanZaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaALaALaALdFwdFvdFxaALdFzdFyaxsayrayraBCazHazHazIaxsazJazJazJazJazJazJazKazLazMazMazNazMazMazMazMazOazPazQazRazSazTazUazVavqavqazWayPazYaBiayPaCdaCcayPazZaAaaAbaAcaGWaAeaAfauNaAgatNatNatNaAhazbatNaAiawnaxlaxmaxdaAjaAoaAlawnaAmaAnaAkaApawnaAqawnaAraAkawnawnawnaApawnawnaAsawnaAtawnaAuawnaAkaAvaxlaAwaAxaAyaAzaAAaAAaAAaAAaACaABajCajDayfayfayfajGajEajOajIasYaoAaoAanzajPanZarOajQanZaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaALaALaALdFAaDxaDxaDxdFBdFDavRaALayrayrazHazHaAMaAMaANaAOaAPawyawxawzaATaAUaAVaAWaAXaAYaAZaBaaBbazMavfavfavfavfavfaBcaBdaBeaBfaBgaBhayPaDdaDeayPaIoaDgayPaBjaBkaBlayXayXaBmaBnaBoatNatNaKlatNatNatNatNavCaBpaxlaxmaxdaBqavCavCaxfaxgaxhavCavCaBraBsaAiavCavCaBtaBuaBuaBuaBvavCavCavCavCavCavCavCavCaBwaxlaAwaxdaBxawsawsawsawsawsawsawsawsawsawsawsawsawsawsamXajRanzataanzanzataanZaByaBzanZaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaALaALdFEaDxdFGdFFdFHdFFdFJawVaALaBAaBBazHazHaBDaBEaBFaBGaBGaBHaBGaBIaBJaBKaBLaBMaBNaBOaBPaBQaBRazMaBSaBTaBUaBVaBWaBXaBYaBeaBZaCaaCbayPaIpayPayPayPaIqayPayXaCeayXayXaAeaCfayZauNdpIayZayZayZdpHayZayZavCavCaCgaChaCiavCavCahyahyahyahyahyaCjaCjaCkaCjaCjahyahyahyahyahyahyahyaahaahaahaahaahaahaClaClaCmaCnaCoaClawsaahaahaahaahaahaahaahaahaahaahaahaahaahamXamXamXamXamXamXamXanZanZaCpanZanZaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaALaALaALdFAaDxaDxaDxdFBdFDdFCaALayrayrazHazHaAMaAMaANaAOaAPaAQaARaASaATaAUaAVaAWaAXaAYaAZaBaaBbazMavfavfavfavfavfaBcaBdaBeaBfaBgaBhayPaDdaDeayPaIoaDgayPaBjaBkaBlayXayXaBmaBnaBoatNatNaKlatNatNatNatNavCaBpaxlaxmaxdaBqavCavCaxfaxgaxhavCavCaBraBsaAiavCavCaBtaBuaBuaBuaBvavCavCavCavCavCavCavCavCaBwaxlaAwaxdaBxawsawsawsawsawsawsawsawsawsawsawsawsawsawsamXajRanzataanzanzataanZaByaBzanZaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaALaALdFEaDxdFGdFFdFHdFFdFJdFIaALaBAaBBazHazHaBDaBEaBFaBGaBGaBHaBGaBIaBJaBKaBLaBMaBNaBOaBPaBQaBRazMaBSaBTaBUaBVaBWaBXaBYaBeaBZaCaaCbayPaIpayPayPayPaIqayPayXaCeayXayXaAeaCfayZauNdpIayZayZayZdpHayZayZavCavCaCgaChaCiavCavCahyahyahyahyahyaCjaCjaCkaCjaCjahyahyahyahyahyahyahyaahaahaahaahaahaahaClaClaCmaCnaCoaClawsaahaahaahaahaahaahaahaahaahaahaahaahaahamXamXamXamXamXamXamXanZanZaCpanZanZaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaALaALdFKaDxaJGdFLdFNdFMdFPdFOaALaCvaCwaCxaCyaCzazHaCAaCBaCCaCDaCEaCFaCGaCHaCIaCJaCKaCLaCMaCNaCNaCOaCPaCQaCRaCSaCTaCUaCVaCWaCXaCYaCZaDadEhaDbaDcaJFdEiaDfaJHaDhaDiaDjaAeaDkaDlauNatNdpJayZayZayZayZayZayZaFmaxlaxmaxdavCahyahyahyahyahyahyahyaCjaDmaDnaCjahyahyahyahyahyahyahyahyaahaahaahaahaahaDoaDpaDqaDraDsaClaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaDtaDuaDvaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaALaALdFQaDxaGVdFRdFSdFRdFTaDxaDyazHaDzaDAaDBazHazHaDCaBGaBGaDDaBGaDEaDGaDHaDIaDJaDKaDLaDMaDNaDOazMaDPaDQaDRaBVaDSaDTaDUaDVaDWaDXaDYaDZaEaaEbaEcaEdaEaaEeaEfaEgaEhaEiaEjaEkaElaEmatNayZayZdqFaFmaFmaFmaFmaFmaxlaxmaEnavCahyahyahyahyahyahyahyaCjaEoaDnaCjahyahyahyahyahyahyahyahyahyahyaahaahaahaEpaEtaEraEsaGyaClaEuaEuaEuaEuaEuaEuaEuaEuaEuaEvaEvaEvaEvaEvaEvaEvaEvaEvaEvaEvaEvaEvaEvaEwaExaDtaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaALaALaALdFUaDxaDxaDxaDxdFVaEBaALaECaEDaEEaEFdFWaEHaEFaEIaEzaDDaDFaELaEMaENaEOaEPaEQaERaESaETaEUazMaBVaEVaBVaEWaEXaEYaEZaFaaFbaFcaFdaFaaFeaFfaFeaFaaFeaFgaFeaFhayPaFiatNaFjaFkaFlatNdANdqFaFmaFmaGvajSajTaFmaFnaxcaxdaFoaFoaFoaFoaFoahyahyahyaCjaDmaCjaCjahyahyahyahyahyahyahyahyahyahyahyaahaahaFpaFqaFraFsaFtaClaFuaFvaFwawWaFyajXaLgaFAaFuaEvaFBaFBaFCaFDaFEaFFaFGaFFaFHaFDaFCaFIaEvaDtaFJaYeaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaALaALaALdFUaDxaDxaDxaDxdFVaEBaALaECaEDaEEaEFdFWaEHaEFaEIaEzaDDaDFaELaEMaENaEOaEPaEQaERaESaETaEUazMaBVaEVaBVaEWaEXaEYaEZaFaaFbaFcaFdaFaaFeaFfaFeaFaaFeaFgaFeaFhayPaFiatNaFjaFkaFlatNdANdqFaFmaFmaGvajSajTaFmaFnaxcaxdaFoaFoaFoaFoaFoahyahyahyaCjaDmaCjaCjahyahyahyahyahyahyahyahyahyahyahyaahaahaFpaFqaFraFsaFtaClaFuaFvaFwajVaFyajXaLgaFAaFuaEvaFBaFBaFCaFDaFEaFFaFGaFFaFHaFDaFCaFIaEvaDtaFJaYeaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaALaALaALaALbaDaPwbfbaDxdGaaFNaFOaFPaCIaFQaEFaECaEKaEFaFSaFTaFUaFVaFWaFXaFYaFZazMaGaaGbaGcaGdaGeazMaGfaGgaGhaGiaGjaGkaGlaFaaGmaGnaGoaFaaGpaGqaGraFaaGpaGnaGraFhaahaahatNaGsaGtaGuatNayZaFmaFmajYaHPajZaLwaKwaxlaxmaGzaFoaGAaGBaGCaFoaFoahyahyaCjaDmaCjahyahyaGDaGDaGEaGFaGFaGFaGGaGFaGFaGFaGFaGHaGDaGIaGJaGKaGLaClaFKaGNaGOaGNaGPaGNaGOaGNaGQaEvaGRaGSaGRaGRaGRaGRaGRaGRaGRaGRaGRaGRaGTaDtaFJaYdaDtaDtaDtaDtaDtaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALaALaALaALaALdGbdGcaGZaHaaHbaHcaHdaHeaHfaGwaHhaHiaHjaHkaHlaHmaxiaHoaHpaxjaHraHsaHtaHlaHuaHvaHwaHxaHyaHzaHAaHBaHCaFaaHDaHEaHFaFaaHGaHHaHIaFaaHJaHEaHKaFhaahaahatNaHLakaaHNatNayZaFmakdaJbaHPaHQaHRaFmaHSaxmaxdaFoaHTaHUaHVaHWaFoaFoahyaCjaDmaCjahyahyaGDaHXaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaHZaIaaIbaIcaIdaClaIeaGNaGNaIfaIgaIhaGNaGNaIiaEvaGRaIjaIkaIkaIkaIkaIkaIkaIkaIkaIkaIlaGRaDtaFJdGHakedBlaVCaVCaDtaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALaALaALaALaALdGbdGcaGZaHaaHbaHcaHdaHeaHfaGwaHhaHiaHjaHkaHlaHmaHnaHoaHpaHqaHraHsaHtaHlaHuaHvaHwaHxaHyaHzaHAaHBaHCaFaaHDaHEaHFaFaaHGaHHaHIaFaaHJaHEaHKaFhaahaahatNaHLakaaHNatNayZaFmakdaJbaHPaHQaHRaFmaHSaxmaxdaFoaHTaHUaHVaHWaFoaFoahyaCjaDmaCjahyahyaGDaHXaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaHZaIaaIbaIcaIdaClaIeaGNaGNaIfaIgaIhaGNaGNaIiaEvaGRaIjaIkaIkaIkaIkaIkaIkaIkaIkaIkaIlaGRaDtaFJdGHakedBlaVCaVCaDtaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALaALdGedGddGfaDxdGadGgaIraIsaItaIuaIvaIwaHgaIyaIzaIAaIBaICaIDaIEaIFaIGaIHaIIaIHaIJaIKaILaIMaINaIOaBXaIPaIQaGkaIRaFaaISaITaIUaFaaIVaIWaIVaFaaIVaIXaIVaFhaahaahatNaIYaIZaHNatNaFmaFmakgaJbaJcaJdaJeaJfaJgaJhaJiaJjaJkaJlaJmaJnaJoaFoahyaCjaDmaCjahyahyaGDaJpaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaJqaJraFraFsaQkaClaJsaGNaJtaJuaJvaJwaJxaGNaJyaEvaJzaJAaJBaJCaJCaJCaJCaJCaJCaJCaJDaGRaJEaDtaFJdBtaVCaVCdGIdGJaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALaALdGhaGVdFRdFRdFRdGjdGiaALaJJaJKaJKaJKaJLaJMaJKaJNaJKaJOaJPaJKaJQaJRaJSaJTaJQaJUaJVaJWaFaaJXaJYaFaaJZaKaaFabnNaFaaFaaKcaKdaKeaxraKgaKhbjdaKjaKiaKdaKkaFhaFhaahatNatNaKlaLpaLqaLraLsakiaJbaJbakjakkaFmaxlaxmaxdaKraJkaKsaKtaJkaKuaFoahyaCjaDmaCjaGDaGDaGDaGDaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaJqaKvaIbaIcaLJaDoaKyaGNaJtaJuaJvaJwaJxaGNaLKaKzaKAaJAaKBaKCaKCaKCaKCaKCaKCaKCaKDaGRaKEaDtaFJaVCaDtdGIaVCdGKaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALaALdGhaGVdFRdFRdFRdGjdGiaALaJJaJKaJKaJKaJLaJMaJKaJNaJKaJOaJPaJKaJQaJRaJSaJTaJQaJUaJVaJWaFaaJXaJYaFaaJZaKaaFabnNaFaaFaaKcaKdaKeaKfaKgaKhbjdaKjaKiaKdaKkaFhaFhaahatNatNaKlaLpaLqaLraLsakiaJbaJbakjakkaFmaxlaxmaxdaKraJkaKsaKtaJkaKuaFoahyaCjaDmaCjaGDaGDaGDaGDaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaJqaKvaIbaIcaLJaDoaKyaGNaJtaJuaJvaJwaJxaGNaLKaKzaKAaJAaKBaKCaKCaKCaKCaKCaKCaKCaKDaGRaKEaDtaFJaVCaDtdGIaVCdGKaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALdGkaDxaDxaDxaDxaDxdFPbqpaALaJJaKIaKIaKJaKIaKKaKLaKMaKNaKOaKPaKQaJQaKRaKSaKTaKUaKVaKWaKXaFaaKYaKZaFaaLaaLbaLcaLdaLeaLfboJaLhaLiaLjaLkaLlboJaLmaLmaLmaLmaLnaFhaahaahatNaLoaHNayZaKmaklaknakmakpakoaKoaFmaLyaxmaxdaFoaLzaLAaJkaJkaLBaFoahyaCjaLCaLDaGDaLEaLFaLGaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaLHaLIaIbaIcaLJaFpakqaLLaLLaLMaLNaLOaLLaLLaLLaLQaLRaJAaKBaKCaKCaKCaKCaKCaKCaKCaKDaGRaJEaDtaFJaDtaDtaDtaDtaDtaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALdGmaDxaDxdGndGoaDxdFPbsdaALaJJaLUaKIaKIaKIaLVaLWaLXaLYaLZaMaaMbaMcaMdaKSaKSaMeaMfaMgaMhaFaaMiaMjaFaaMkaMlaMmaEAaMoaMpaLmaMqaMraMsaMtaLmaLmaMsaLmaLmaLmaLnaFhaahaahatNaMuaHNatNaFmaFmaFmaFmaFmaFmaFmaFmaMvaMwaMxaMyaMzaMAaMBaJkaxBaFoahyaCjaMDaMEaGDaMFaMGaMHaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaMIaLIaMJaEsaMKaMLaMMaMMaMMaMNaMOaMPaMMaMMaMMaMQaMRaJAaKBaKCaKCaMSaMTaMUaKCaKCaKDaGRaMVaDtaFJaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALdGmaDxaDxdGqdGraDxdFPdGsaALaJJaNcaNdaNeaNeaNeaNfaNgaNhaNiaNjaNkaNlaNmaNnaNoaNpaNqaNraNsaFaaNtaNuaFaaNvaNwaFaaNxaNyaFaaLmaNzaNAaNBaNCaNDaNEaNFaNEaLmaNGaFhaFhaahaahatNaNHaNIatNaahaNJaNKaNLaNMaNNaNOaNPaxlaxmawnaFoaNQaNRaJkaJkaxUaFoahyaCjaNTaNUaNVaNWaNXaNYaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaMIaLIaNZaOaaObaOcaOdaOdaOdaOeaOdaOfaOdaOgaOdaOhaOiaOjaKBaKCaKCaOkaOlaOmaKCaKCaKDaGRaOnaDtaOoaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALdGmaDxaDxdGndGoaDxdFPbsdaALaJJaLUaKIaKIaKIaLVaLWaLXaLYaLZaMaaMbaMcaMdaKSaKSaMeaMfaMgaMhaFaaMiaMjaFaaMkaMlaMmaEAaMoaMpaLmaMqaMraMsaMtaLmaLmaMsaLmaLmaLmaLnaFhaahaahatNaMuaHNatNaFmaFmaFmaFmaFmaFmaFmaFmaMvaMwaMxaMyaMzaMAaMBaJkaMCaFoahyaCjaMDaMEaGDaMFaMGaMHaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaMIaLIaMJaEsaMKaMLaMMaMMaMMaMNaMOaMPaMMaMMaMMaMQaMRaJAaKBaKCaKCaMSaMTaMUaKCaKCaKDaGRaMVaDtaFJaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALdGmaDxaDxdGqdGraDxdFPdGsaALaJJaNcaNdaNeaNeaNeaNfaNgaNhaNiaNjaNkaNlaNmaNnaNoaNpaNqaNraNsaFaaNtaNuaFaaNvaNwaFaaNxaNyaFaaLmaNzaNAaNBaNCaNDaNEaNFaNEaLmaNGaFhaFhaahaahatNaNHaNIatNaahaNJaNKaNLaNMaNNaNOaNPaxlaxmawnaFoaNQaNRaJkaJkaNSaFoahyaCjaNTaNUaNVaNWaNXaNYaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaMIaLIaNZaOaaObaOcaOdaOdaOdaOeaOdaOfaOdaOgaOdaOhaOiaOjaKBaKCaKCaOkaOlaOmaKCaKCaKDaGRaOnaDtaOoaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALdGtaDxaJGaDxaDxaDxdGvdGuaALaJJaLUaOvaOwaOwaOxaOyaOzaOAaOBaOCaODaOEaOFaMdaOGaOHaKSaOIaOJaOKaOLaOMaFaaONaOOaOPaLmaLmaOQaLmaORaFhaOSaOTaOTaOUaFaaFaaOVaFaaFaaahaahaahatNatNaNIatNaahaNJaOWaOXaOYaOZaOXaPaaxlaxmawnaJjaJkaPbaPcaJkaKuaFoahyaCjaPdakraGDaPfaPgaLGaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaHZaPhaLIaIcaPiaPjaPlaPlaPlaPmaPnaPoaPlaPpaPlaPraPsaJAaKBaKCaKCaKCaKCaKCaKCaKCaKDaGRaJEaDtaPtaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALaALdGwaDxaDxaDxaDxaDxaALaALaJJaKIaPxaKIaKIaKIaPyaPzaPAaPBaPCaxWaJQaKVaPEaPFaPFaPFaPGaPHaPIaPJaPKaPLaPMaPNaPOaPNaPPaPQaPNaPRaPSaKxaPUaPTaPWaFaaPXaPYdGLaFaaahaahaahaahatNaHNatNaahaNJaQaaOXaQbaQcaQdaQeaQfaQgaQhaKraJkaQiaJmaJnaQjaFoahyaCjaPdaCjaGDaGDaGDaGDaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaJqaKvaLIaIcaQmaQlaLPaQnaQnaQoaQnaQnaQpaQqaPkaLQaQsaJAaKBaKCaKCaKCaKCaKCaKCaKCaKDaGRaKEaDtaOoaDtaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALaALbtpbtobtobtraALaALaahaJJaJJaPxaKIaQtaQuaQvaLXaQwaQxaQyaxXaJQaQAaQBaQCaKSaQCaQDaQEaFhaFhaFhaFhaQFboJaQGaQHaQHaMtaLmaQIaQJaPNaPPaQKaQLaFaaQMaPYaQNaFaaahaahaahaahatNaHNatNaahaNJaNJaQOaOXaQPaQQaNPawnaxmaQRaFoaJkaJkaHVaQSaFoaFoahyaCjaPdaCjaahaahaGDaQTaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaJqaQUaQVaDraQWaClaQnaQnaQXaQYaYSaQnaQnaRaaQnaQnaRbaJAaRcaRdaRdaRdaRdaRdaRdaRdaReaGRaJEaDtaFJaksaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahahyaRfaRfaRfaRfaRfaRfaRfaRfaRfaRfaRfaRfaahaahaahaALaALaALaALaALaALaALaALaahaahaRgaRhaRgaRgaJJaJJaJJaJJaJJaJJaJJaRiaRiaRiaPqaRkaPqaRiaRiaRiaahaahaFhaFhaxYaRmaPVaRoaRpaRqaRraPSaKxaRsaRnaRuaFhaFaaFaaRvaFaaahaahaahatNatNaHNatNaahaahaNJaNJaRwaRxaxZaPaawnaxmaRzaFoaRAaRBaGCaFoaFoahyahyaCjaPdaCjaahaahaGDaHXaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaLHaIaaLIaIcaRCaClayaaREaRFaRGaYSaQnaRHaRGaRIaQnaRbaRJaRKaRKaRKaRKaRKaRKaRKaRKaRKaRLaGRaRMaFJdGJaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALaALdGwaDxaDxaDxaDxaDxaALaALaJJaKIaPxaKIaKIaKIaPyaPzaPAaPBaPCaPDaJQaKVaPEaPFaPFaPFaPGaPHaPIaPJaPKaPLaPMaPNaPOaPNaPPaPQaPNaPRaPSaKxaPUaPTaPWaFaaPXaPYdGLaFaaahaahaahaahatNaHNatNaahaNJaQaaOXaQbaQcaQdaQeaQfaQgaQhaKraJkaQiaJmaJnaQjaFoahyaCjaPdaCjaGDaGDaGDaGDaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaJqaKvaLIaIcaQmaQlaLPaQnaQnaQoaQnaQnaQpaQqaPkaLQaQsaJAaKBaKCaKCaKCaKCaKCaKCaKCaKDaGRaKEaDtaOoaDtaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALaALbtpbtobtobtraALaALaahaJJaJJaPxaKIaQtaQuaQvaLXaQwaQxaQyaQzaJQaQAaQBaQCaKSaQCaQDaQEaFhaFhaFhaFhaQFboJaQGaQHaQHaMtaLmaQIaQJaPNaPPaQKaQLaFaaQMaPYaQNaFaaahaahaahaahatNaHNatNaahaNJaNJaQOaOXaQPaQQaNPawnaxmaQRaFoaJkaJkaHVaQSaFoaFoahyaCjaPdaCjaahaahaGDaQTaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaJqaQUaQVaDraQWaClaQnaQnaQXaQYaYSaQnaQnaRaaQnaQnaRbaJAaRcaRdaRdaRdaRdaRdaRdaRdaReaGRaJEaDtaFJaksaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahahyaRfaRfaRfaRfaRfaRfaRfaRfaRfaRfaRfaRfaahaahaahaALaALaALaALaALaALaALaALaahaahaRgaRhaRgaRgaJJaJJaJJaJJaJJaJJaJJaRiaRiaRiaPqaRkaPqaRiaRiaRiaahaahaFhaFhaRlaRmaPVaRoaRpaRqaRraPSaKxaRsaRnaRuaFhaFaaFaaRvaFaaahaahaahatNatNaHNatNaahaahaNJaNJaRwaRxaRyaPaawnaxmaRzaFoaRAaRBaGCaFoaFoahyahyaCjaPdaCjaahaahaGDaHXaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaLHaIaaLIaIcaRCaClbZuaREaRFaRGaYSaQnaRHaRGaRIaQnaRbaRJaRKaRKaRKaRKaRKaRKaRKaRKaRKaRLaGRaRMaFJdGJaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaROaRPaRPaRPaRPaRPaRPaRPaRPaRPaRQaRfaahaahaahaahaALaALaALaALaALaALaahaahaahaRgaRRaRSaRTahyahyahyahyahyahyahyahyahyaRUaRVaRVaRVaRUahyahyaahaahaahaFhaFhaRWaRXaRXaRYaFhaFhaFhaFhaFhaFhaFhaFhaahaFaaRZaFaaahaahaahatNaSaaSbatNaahaahahyaNJaNJaNJaNJaNJaScaSdawnaFoaFoaFoaFoaFoahyahyahyaCjaPdaCjaCjaahaGDaGDaGEaGFaGFaGFaSeaGFaGFaGFaGFaGHaGDaGIaSfaGKaGLaClaQnaQnaSgaShaSiaSjaSkaSlaSmaSjaRbaSnaGRaGRaGRaGRaGRaGRaGRaGRaGRaGRaGRaDtaFJaVCaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaROaRPaSoaSpaSqaSraybaStaSoaSuaSvaSwaRfaahaahaahaahaahaahaahaahaahaSxaSxaSxaSxaSxaSyaSzaRTahyahyahyahyahyahyahyahyahyaSAaSBaSCaSDaSAahyahyaahaahaahaahahyahyahyahyahyahyahyahyahyahyahyaahaahaahaFaaFaaFaaahaahaahatNaSEaSFatNaahaahahyahyahyahyahyaSGawnaxmawnaSGahyahyahyahyahyahyahyaCjaSHaSIaCjaahaahahyahyahyahyahyahyahyahyahyahyahyaDoaFqaSJaFsaFtaClaRDaSKaSLaSMaycaQnaRHaSOaRIaQnaSPaGRaFCaSQaSRaFFaSSaFFaSTaSQaFCaSUaEvaDtaOoaDtaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaROaRPaSoaSpaSqaSraSsaStaSoaSuaSvaSwaRfaahaahaahaahaahaahaahaahaahaSxaSxaSxaSxaSxaSyaSzaRTahyahyahyahyahyahyahyahyahyaSAaSBaSCaSDaSAahyahyaahaahaahaahahyahyahyahyahyahyahyahyahyahyahyaahaahaahaFaaFaaFaaahaahaahatNaSEaSFatNaahaahahyahyahyahyahyaSGawnaxmawnaSGahyahyahyahyahyahyahyaCjaSHaSIaCjaahaahahyahyahyahyahyahyahyahyahyahyahyaDoaFqaSJaFsaFtaClaRDaSKaSLaSMaSNaQnaRHaSOaRIaQnaSPaGRaFCaSQaSRaFFaSSaFFaSTaSQaFCaSUaEvaDtaOoaDtaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSVaSWaSXaSXaSXaSXaSXaSXaSXaSYaSvaSwaRfaahaahaahaahaahaahaahaahaahaSxaSZaTaaTbaTcaTdaTeaRTahyahyahyaTfaTgaThaTiaTfahyaTjaTkaTlaTkaTjahyahyaahaahaahaahaahahyahyahyahyahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahatNaHNaTmatNaahaahahyahyahyahyahyaTnawnaxmawnaTnahyaToaTpaTqaTraToahyaCjaPdaDnaCjaahaahahyahyahyahyahyahyahyahyahyahyahyaEpbdHaLIaIcaLJaClaQnaQnaQnaQnaQnaQnaQnaQnaQnaQnaEvaEvaEvaEvaEvaEvaEvaEvaEvaEvaEvaEvaEvaTtaOoaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTuaRPaTvaTwaTwaSXaTxaTyaTzaTAaSvaSwaRfaahaahaahaahaahaahaahaahaahaSxaTBaTCaTDaTEaTFaTGaRTahyahyaTfaTfaQraTIaQraTfaTfaTfaTJaTKaTJaTfaTfahyahyaahaahaahaahahyahyahyahyahyahyahyahyahyaTfaTfaTfaTfaTfaahaahaahaahaTfatNaTLatNaTfaahaahaahahyahyahyavCavCaTMaTNaTMavCaToaToaTOaTPaTQaToaToaCjaTRaCjaCjaahaahaahaahahyahyahyahyahyahyahyahyahyaFpaDpaQVaDraQkaClaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaDtaTSaTTaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTuaRPaRPaRPaTUaTUaRPaRPaRPaRPaTVaRfaahaahaahaahaahaTWaTWaTWaTWaSxaTXaTYaTZaSxaRTaUaaRTaUbaUcaTfaUdaTkaTkaTkaUeaTfaUfaTkaUgaTkaUhaTfaUiaUjaTfaTfaTfaTfaTgaThaThaThaThaThaThaThaTiaTfaUkaUlaUmaTfaTfaTfaTfaTfaTfaUnaUoaUpaTfaTfaTfaTfaTfaUqaUraTfaUsaTkaTlaTkaUtaToaUuaUvaUvaUwaUxaToaUyaUzaUAaClaClaClaClaClaClaUBaUCaUCaUCaUCaUCaUCaUDaClaGIaUEaCnaCoaClaClcllcllcllcllcllcllaDtaDtaDtaDtaDtaDtaahaahaahaahaahaahaahaTWaDtaDtaUFaUGaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaRfaRfaRfaRfaUHaUHaRfaRfaRfaRfaRfaRfaUIaUIaUIaUIaUIaUIaUJaUKaULaSxaTcaUMaSxaSxawqaUOaUPaUNaUNaUQaTkaURaUSaUTaUTaUUaUVaUTaUWaUTaUTaUUaUTaUTaUTaUXaUYaUTaUZaUTaUTaUTaUTaUSaUTaUTaUTaUUaUTaVaaUSaUUaUTaUTaVbaVcaVdaUTaVeaTkaTJaTkaVfaTkaVgaTkaTkaVhaTkaTkaTlaTkaTkaViaVjaUvaUvaVkaVlaVmaVnaVoaVnaVpaVqaVraZQaVsaVtaVnaVnaVuaVvaVnaVnaVwaVxaVyaVnaVnaVzaVAaLIaUAcpZcmkcmlakuaktaktaDtaVCaYcaYdaYeaDtaDtaDtaDtaDtaDtaDtaDtaDtaVBaVCaFJaDtaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaRfaVDaVEaVFaVGaVHaVIaVJaVKaVLaVMaVNaVOaVPaVQaVKaVKaVRaVSaVTaVKaVUaVKaVPaVVaVWaVVaVRaVKaVXaVYaVZaIxaVYaVYaWbaWcaWdaWeaWdaWfaWbaWdaWdaWdaWgaWhaWdaWdaWiaWdaWdaWfaWcaWdaWdaWaaWbaWdaWjaWcaWbaWqaWdaWgaWdaWkaWhaWlaWdaWbaWdaWiaWdaWcaWdaWdaWmaWdaWfaWnaTkaTkaViaWoaWpbhcaWraWsaWtaWuaWvaWuaWwaWuaWuaWuaWuaWxaWyaWuaObaWuaWuaWuaWzaWAaWAaWAaWBaWCaWDaWDaWFakvakxakwakBakyakyakDaWGakIaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWJaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaazGazGazGazGazGaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaRfaWKaWLaWMaWNaWLaWOaWPaUNaWQaUNaWRaUNaWSaUNaWTaWUaWVaWWaWXaWYaWZaXaaXbaXcaXdaXeaXfaXgaXhaXiaXjaXkaXlaXmaXnaXmaXmaXmaXmaXoaXnaXmaXmaXpaXmaXqaXmaXmaXraXmaXmaXsaXtaXuaXmaXvaXnaXwaXxaXyaXzaXyaXyaXyaXAaXBaXCaXDaXEaXFaXGaXHaXmaXIaXtaXJaXKaTkaXLaTkaTkaTkaViaUvaXMaXNaXOaXPaXQaXRaXSaLIaLIaXTaLIaLIaXVaSfaXWaLIaLJaLIaXXaLIaXYaXZaXVaXUaYaaYbaLIaLIaUAcpZakLakKakPakMcomaDtaDtaDtaDtaDtaDtaDtaDtaDtaDtaDtaDtaDtaDtaDtaDtaDtaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaazGazGazGazGazGaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaRfaRfaYfaYgaYhaYiaYjaRfaRfaRfaRfaYkaYlaYmaRfaUIaUIaUIaUIaUIaUIaUbaYnaYnaYnaUcaUIaUIaYhaTfaYoaYpaYqaYraYsaTfaYtaTkaTkaTkaYuaTfaTfaTfaTfaTfaTfaYvaYwaUgaYxaYvaTfaTfaTfaTfaTfaTfaYyaYzaYAaTfaUqaYBaUraTfaTfaUqaYBaUraTfaYCaYDaYEaTfaUqaYBaUraTfaTfaUqaYBaUraToaRjaYGaYHaUwaYIaToaClaYJaYKaYLaClaYJaYKaYLaClaClaClaYMaUAaClaClaClaClaClaClaUAaYNaUAaClaClcllakTakSakVakUayjdEoakYakXalaakZalcalbdEoaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaazGazGazGazGazGaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaRfaRfaYfaYgaYhaYiaYjaRfaRfaRfaRfaYkaYlaYmaRfaUIaUIaUIaUIaUIaUIaUbaYnaYnaYnaUcaUIaUIaYhaTfaYoaYpaYqaYraYsaTfaYtaTkaTkaTkaYuaTfaTfaTfaTfaTfaTfaYvaYwaUgaYxaYvaTfaTfaTfaTfaTfaTfaYyaYzaYAaTfaUqaYBaUraTfaTfaUqaYBaUraTfaYCaYDaYEaTfaUqaYBaUraTfaTfaUqaYBaUraToaRjaYGaYHaUwaYIaToaClaYJaYKaYLaClaYJaYKaYLaClaClaClaYMaUAaClaClaClaClaClaClaUAaYNaUAaClaClcllakTakSakVakUakWdEoakYakXalaakZalcalbdEoaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaRfaRfaRfaRfaRfaRfaRfaahaahaRfaYOaYOaYOaRfaahaahaahaahaYPaYQaYRaYRaYRaYRaYRbewaYPahyaTfaTfaYTaYUaYVaTfaTfaTfaYWaYXaYYaTfaTfaahaahaahaahaahaYZaZaaZbaZcaYZaahaahaahaahaahaTfaZdaZeaZdaTfahyahyahyahyahyahyahyahyaZfaZgaZhaZiaZfahyahyahyahyahyahyahyahyaToaToaZjaZkaZlaToaToahyahyahyahyahyahyahyahyahyahyaClaYMaUAaClaahaahaahaahaZmaZmaZnaZmaZmaahcllclldEoalddEodEodEoakYalealgalfaloalbdEoaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZpaZqaZraZoaahaahaahaahaYPaZsaZtaZuaZvaZwaZxaYRaYPahyahyaZyaZzaZAaZBaZyahyaTfaUiaThaTiaTfaahaahaZCaZCaZCaZCaZDaZDaZEaZDaZDaZFaZFaZFaZFaahaZdaZGaZHaZdahyahyahyahyaZIaZJaZKaZLaZIaZIaZMaZNaZOaZIaZIaZJaZKaZLaZIahyahyahyahyaZPaYGaYHaUwbaAaZRaZRaZSaZTaZUaZRaZSaZTaZUaZRaZRaZRaZVaZRaZRaahaahaahaahaahaZmaZWaZXaZmaahaahdEoalpalsalralualtalxalwalzalyalyalAdEoaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZYaZZbaaaZoaahaahaahaahaYPbabbacbadbaebafbagbahaYPahyahybaibajbakbalbamahyahyahyahyahyaahaahaahaZCbanbaobapaZDbaqbarbasaZDbatbaubavaZFaahaZdaZGbaxaZdahyahyahybayaZLbKzaYFaTHbaCbKMbaEbaFbaGbaHbaIbawbazbhAaZJbaMahyahyahybaNaYGaYHaUwbdwbaLbaBbaPbaObaRbaQbaPbaSbaRbaTbaWbaVbcPbaXaZRaZRaahaahaahaahaZmbbbbbcaZmaahaahdEoalBalCalyalLalDalyalPalZalyambamadEoaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdaaaaaabbdaaaaaaaaabbdaaaaaaaaaaaaaaabbdaaaaaaaaabbdaaaaaabbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZobbebbfdGNaZoaahaahaahaahaYPbbhbacbbibbjbbkbagbblaYPbbmbbnbbobbpbbqbbrbamahyahyahyaahaahaahaahaahaZCbbsbbtbbubbvbbwbbxbbybbzbbAbbBbbCaZFaahaZdaZdaZHaZdahyahybaybbDbbEbMcbfMbdCbdCdCqbbGbbHbbGbgHccSblCdCpbbLbbEbbMbaMahyahybbNbbObbPbbQbbRbbabaYbbTbbSbbTbbUbbWbbVbbWbcabcIbbXbbYbbZbcJaZRaahaahaahaahaZmaZWbcbaZmaahaahdEodEBamdamcamgameamAamhamCamBamDamadEoaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaaaaabbdbbdbbdbbdbbdbbdbbdaaaaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZobccbcdbceaZoaahaahaahaahaYPbcfbcgbchbchbchbcibfvbcjbckbclbclbcmbcnbcobamahyahyaahaahaahaahaahaahaZCbcpbcqbcraZDbcsbctbcuaZDbcvbcwbcxaZFaahaahaZdaZHaZdahyaZIbcybbEbbFbfMdCqbbGbbGbczbcAbcBbcCbcDbbGbbGbgHdCrbbLbbEbcyaZIahyaTobcEbcFbcGbcHbcLbcKbcNbcMbcNbcQbdzbdybdzdCsbdDbcObaZdCtbdEaZRbcRbcRbcRbcRaZmbcSbcTaZmaahaahdEodEBamFamEamWamVanaamZdEodEodEodEodEoaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZpbcUaZoaZoaahaahaahaahaYPbcVbcWbcXbcYbcZbdabdbbdcbddbdebdebdfbdgbdhbaiahyahyaahaahaahaahaahaahaZCbdibdjbdkbdlbdlbdmbdlbdlbdnaylaykaZFaahaahaZdaZHaZdahybdqbaJbbFbfMdCqbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbgHdCrbdsbaKbdqahyaTobdubdvaUwbdwbaLbdFbfkbdGbLZbdIbWObNGbiVbYuaZRccRcsWdCucwuaZRbdJbdKbdLbcRbdMbdNbdOaZmaahaahaZmaZmaZmanbaZmaZmaZmaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZpbcUaZoaZoaahaahaahaahaYPbcVbcWbcXbcYbcZbdabdbbdcbddbdebdebdfbdgbdhbaiahyahyaahaahaahaahaahaahaZCbdibdjbdkbdlbdlbdmbdlbdlbdnbdobdpaZFaahaahaZdaZHaZdahybdqbaJbbFbfMdCqbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbgHdCrbdsbaKbdqahyaTobdubdvaUwbdwbaLbdFbfkbdGbLZbdIbWObNGbiVbYuaZRccRcsWdCucwuaZRbdJbdKbdLbcRbdMbdNbdOaZmaahaahaZmaZmaZmanbaZmaZmaZmaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbdPbdPbdPbdPbdQbdRbdSbdTaahaahaahaahaYPaRtbdVbdWbdXbdYbdXbdZbeabebbecbecaZzbcnbedbeebefbefbefbefbefaahaahaahaZCaZCaZCaZCbdlbegbehbeibdlaZFaZFaZFaZFaahaahaZdaZHaZdahybejbiHbfMdCqbbGbelbbGbembenbbGbbGbbGbeobepbbGbelbbGbgHdCvbiFbejahyaZPbesbetaUwaToaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRbkjbevbuJbcRbdMbdNbdOaZmaahaZmaZmbexbeyaZWantbdObezbeAaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbeBbeCbeDbdPbeEbeFbeGbdTaahaahaahaahaYPaYPbeHbeIbeJbeKbeLaYPaYPbbmbbnbbobeMbcnbeNbeebeObePayoaynbefaahaahaahaahaahbdlbdlbeSbeTbeUbeTbeSbdlbdlaahaahaahaahaZdaZHaZdahybcybiHdCwbeqbbGbbGbeVbeWbbGbbGbbGbbGbbGbeXbepbbGbbGbbGdCxbiFbcyahybaNbbObetbeYaToaahaahbeZbeZbfaaFLbeZbfcbfdbfedGObfgbfhbfibfjbcRbkhbevbevbflbdMbdNbfmaZmaZmaZmbfnbfobfodGGbfobfobfobfobfpaZmaZmaZmaZmaZmaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbeBbeCbeDbdPbeEbeFbeGbdTaahaahaahaahaYPaYPbeHbeIbeJbeKbeLaYPaYPbbmbbnbbobeMbcnbeNbeebeObePbeQbeRbefaahaahaahaahaahbdlbdlbeSbeTbeUbeTbeSbdlbdlaahaahaahaahaZdaZHaZdahybcybiHdCwbeqbbGbbGbeVbeWbbGbbGbbGbbGbbGbeXbepbbGbbGbbGdCxbiFbcyahybaNbbObetbeYaToaahaahbeZbeZbfaaFLbeZbfcbfdbfedGObfgbfhbfibfjbcRbkhbevbevbflbdMbdNbfmaZmaZmaZmbfnbfobfodGGbfobfobfobfobfpaZmaZmaZmaZmaZmaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbfqbfrbfsbdPbftbfucxEbdTaahaahaahaahaahaYPaYPbfwbfxbfyaYPaYPahyahyahybfzbfAbcnbfBbeebfCbfDbfEbfFbefbefaahaahaahaahbdlbfGbeTbfHbfIbfJbeTbfKbdlaahaahaahaahaZdaZHaZdahyaZIbfLdCybbJbbGbeVbfNbfObbGdCzdCzdCzbbGbjlbfPbfQbbGbbGdCAbfSaZIahybbNaYGbetaUwaToaahaahbeZbfTbfUbfVbfWbfXbfYbfZbfZbgabgbbgcbgdbgebgfbggbghbcRbdMbgibfobfobfobfobgjbgkbgkbgkbgkbgkbgkbgkbglbfobfobfobfobfobfpaZmaZmaahaahaahaahaahaahbgmbgmbgmbgmbgmbgmbgmaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbgnbfrbgobdPbgpbgqbgrbdTaahaahaahaahahyahyahyahyahyahyahyahyahyahybbobbobgsbcnbgtbeebefbgubgvbgwbgxbefaahaahaahaahbdlbgybeTbeibgzbeibeTbgAbdlaahaahaahaZdaZdaZHaZdahyaZIbgBdCBbfRbbGbgCbbGbbGdCCbgDbgEbgFdCDbbGbbGbgCbbGbgGbgHdCEaZIaZfaTobgIbgJbgKaToaToaahbeZbgLbgMbgNbgObgPbgQbgRbgSbgTbgUbgVbgWbgXbgYbgYbgYbgYbgYbgYbgZbgZbgZbgZbgZbgkbhaayqbmzbhdbhebgkbhfbhfbhfbhfbhfbhfbglbfpaZmaahaahaahaahaahbgmbgmbhgbhhbhibhhbhjbgmbgmaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbhkbhlbhkbdPbhmbfubhnbhobhobhobhoaahaahaahahyahyahyahyahyahyahyahyaZycrkbajbhqbhrbhsbefbhtbgvbgwbhubefaahaahaahaahbdlbhvbeTbhwbhxbhwbeTbhybdlaahaahaahaZdaZGaZHaZdahybdqbaUdCFbbGbbGbbGbbGdCGbgDbhAbhAbhAbgFdCFbbGbbGbbGbhBbbGbhCbhDbhEbhFbhGbetaUwbhHaToaahbeZbhIbhJbgNbhKbhLbhLbhLbhLbhMbhNbgVbhObhPbgYbhQbhRbhSbhTbgYbhUbhVbhVaysbgZbhXbhYbhYbhZbhZbhYbiabhfbibbicbidbiebhfbdOaZWaZmaahaahaahaahaahbgmbifbigbihbiibijbikbifbgmaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbgnbfrbgobdPbgpbgqbgrbdTaahaahaahaahahyahyahyahyahyahyahyahyahyahybbobbobgsbcnbgtbeebefbgubgvbgwbgxbefaahaahaahaahbdlbgybeTbeibgzbeibeTbgAbdlaahaahaahaZdaZdaZHaZdahyaZIbgBdCBbfRbbGbgCbbGbbGdCCbgDbgEbgFdCDbbGbbGbgCbbGbgGbgHdCEaZIaZfaTobgIbgJbgKaToaToaahbeZbgLbgMbgNbgObgPbgQbgRbgSbgTbgUbgVbgWbgXbgYbgYbgYbgYbgYbgYbgZbgZbgZbgZbgZbgkbhabhbbmzbhdbhebgkbhfbhfbhfbhfbhfbhfbglbfpaZmaahaahaahaahaahbgmbgmbhgbhhbhibhhbhjbgmbgmaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbhkbhlbhkbdPbhmbfubhnbhobhobhobhoaahaahaahahyahyahyahyahyahyahyahyaZycrkbajbhqbhrbhsbefbhtbgvbgwbhubefaahaahaahaahbdlbhvbeTbhwbhxbhwbeTbhybdlaahaahaahaZdaZGaZHaZdahybdqbaUdCFbbGbbGbbGbbGdCGbgDbhAbhAbhAbgFdCFbbGbbGbbGbhBbbGbhCbhDbhEbhFbhGbetaUwbhHaToaahbeZbhIbhJbgNbhKbhLbhLbhLbhLbhMbhNbgVbhObhPbgYbhQbhRbhSbhTbgYbhUbhVbhVbhWbgZbhXbhYbhYbhZbhZbhYbiabhfbibbicbidbiebhfbdOaZWaZmaahaahaahaahaahbgmbifbigbihbiibijbikbifbgmaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyaahaahaahaahaahaahaahaahaahaahaahaahbilbilbilbilbilbilbilbilbilbimbinbiobipbeEbfubinbhobiqbirbhobhobhoaahaahahyahyahyahyahyahyahybambisaZzbitbiubdebivbiwbixbgwbhubefaahaahaahaahbdlbiybeTbizbiAbiBbeTbiCbdlaahaahaahaZdbiDaZHaZdahybejbdrdCFbbGbbGbbGbbGdCGbiFbhAbdtbhAbiHdCFbbGbbGbbGbiIbiJbiJbiKbiLbiMbiNbiObiPbiQaToaahbeZbfTbiRbiSbeZbiTbiUblObiWbxjbfhbzjbhObiYbgYbiZbjabjbbjcbgYbSjbjebjfbjgbgZbjhbjibjjbjkbpybjmbjnbhfbibbjobjpbjqbhfbjrbjsaZmaahaahaahaahaahbgmbjtbjubjvbjwbjvbjubjxbgmaahaahbgmbgmbgmbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahbilayvbjzbjAbjBbjCbjDaywbilbjFbjGbjHbjIbjJbjKbjLbhobjMbjNbjObjPbhoaahaahaahahyahyahyahyahyahybaibjQbjRbjSbhrbecbjTbjUbjVbgwbhubefaahaahaahaahbjWbjWbjWbjWbjXbjWbjWbjWbjWaahaahaahaZdbjYaZHaZdahybcybaUdCFbbGbbGbbGbbGdCGbjZbhAbhAbhAbkadCFbbGbbGbbGbkbbbGbbGbkcaZibkdaYGbetaUwbkeaToaahbeZbkfbkgblRbeZbfhbfhbfhbfhbkibfhbALbkkbklbgYbkmbknbkobkpbgYbkqbkrbksbktbgZbkubkvbkwbkxbkybkzbkAbkBbkCbkDbkEbkFbhfbdObkGaZmaahaahbgmbgmbgmbgmbkHbkIbkHbkJbkHbkKbkHbgmbgmbgmbgmbkLbkMbkNbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkObkPbkRbkQbkSbkPbkPahyaahaahaahaahaahaahaahaahaahbilbkTbkUbkVbkWbkXbkYbkZblablbblcbldbleblfblgblhbhoblibljblkblkbhobllbllbllbllahyahyahyahyahybbobboblmblnblobeebefblpbjVbgwblqbefaahaahaahaahbjWblrblsbltblublvblwblxbjWaahaahaahaZdaZdaZHaZdahyaZIblydCwbeqbbGblzbbGbbGdCrbjZblAbkabfMbbGbbGblzbbGblBdCHdCIaZIaZfaToaZjblDaZlaToaToaahbeZblEblFblGbeZblHblIblJdGQblLblMblNbhOblWbgYbgYblPblQbpabgYblSblTblUblVbgZbrKbhZbhYblXbhYbhYblYbhfblZbmabhfbmbbhfbmcaZWaZmaahbgmbgmbifbmdbkHbmebmfbmgbmhbmibmfbmgbmjbkJbmkbmlbmibmmbmgayEbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkPbmobmpbmqbmpbmobkRahyahyaahbkPbkPbkPbkPaahaahaahbilazxbmsbjAbmtbmubmvbmwbilbmxbfubmybdTbrebdTbrebhoblibmAbmBbmCblkbmDbmEazybllbmGbmHbmIbllahyahyaZyaZzbcnbhrbeebmJbmKbmLbmMbefbefaahaahaahaahbjWbmNbmObmPbmQbmPbmRbmSbjWaahaahaahaahaZdaZHaZdahyaZIbmTdCJbbJbbGbfPbfQbmUbbGbdCbdCbdCbbGbmUbeVbfNbbGbbGdCKbmVaZIahyaZPaYGaYHaUwaToaahaahbeZbmWbmXbmYbmZbnabnbbncbncbndbnebnfbngbnhbnibgYbnjbnkbnlbgYbnmbnnbnobnpbgZbnqbnrbhYbnsbhYbntazzbhfbnvbnwbhfbnxbhfbnyaZWaZmaahbgmbnzbnAbnBbnCbnDbnEbnDbnFbnDbnGbihbnHbkJbnIbnJbnKbnLbihbnMaFMbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnObnPbnQbnRbnRbnPbnSbnTbkPbkPbkPbnUbnVbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbftbfubnWbdTbnXbnYbnZblkblkboabobbocblkbodboeboebofbogbohazAbllahyahybamaZzbcnbojbeebmKbmKbokbolbefaahaahaahaahbjWbjWbombonboobopboqbonborbjWbjWaahaahaahaZdaZHaZdahybdqbiHdCBbfRbbGbbGbfPbfQbbGbbGbbGbbGbbGbembeWbbGbbGbbGdCxbdxbdqahybaNbbObotbouaToaahaahbeZbgLbovbgNbowboxboybozboAboBboCbgVbhOboDboEbgYboFboGboFbgYboHboIbTzboKbgZbgkboLboMbdAboLboMboOboOboOboOboOboOboOboOaZWaZmaahbgmboPboQboRbkHboSbmfanuboUboVboWbmmbmgbkHbmibmmboXboYboSboZbuPbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkQbmqbpbbpcbpcbmqbpdbpebpfbpgbphbpibpjbpkbplbpmbpnbpobppbpqbprbprbpsbprbptbpubpvbpwbpxbMKbpzbpzbpzbpAblkblkbpBblkblkbpCbpDbpEbpEbpEbpFbpGbllahyahybamaZzbcnbfBbeebefbefbefbefbefaahaahaahaahbjWbpHbpIbpJbpKbpLbpKbpMbpNbpObjWaahaahaahaZdaZHaZdahybejbiHdCDdCLbbGbelbbGbfPbenbbGbbGbbGbeobeWbbGbelbbGdCHdCMbdxbejahybbNaYGaYHaUwbpPahyaahbeZbpQbpRbgNbpSbpTbpUbpVbpVbpWbpXbpYbpZbqabqabqbbqcbqdbqcbqebqcbqfbqgbqhbqibqjbqkbqhbqlbqmazBboObqoaCqbqqbqrbqsbqtboOaZWaZmaahbgmbqubqvbqwbkJbqxbqybqzbgmbqAbqBbqCbqCbqDbsnbqCbqEbqFbqGboZbqHbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaacAacOacAacAacAacAacAacAacAacOacAacAacAacAaaaaaaacAacAacAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqIaadahybkQbnPbqJbpcbpcbqKbqLbqMbqNbqObqPbqQbqRbqSbqTbqUbqVbqTbqWbqXbqTbqYbqZbrabrbbrcbrdbgqbinbMNbrfbrgbpzbrhbrebribrjazCbrlbrmbrnazDbrpazEbrrbrsbllahyahybambrtbrubrvaZyahyahyahyahyahyahyaahaahaahbjWbjWbrwbrxbpKbpKbpKbrybrzbjWbjWaahaahaahaZdaZHaZdahybcyaTsbrBdCDdCLbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGdCHdCCbrCbdBbcyahyaTobrEaYHbrFbrGahyahybeZbfTblFbrHbeZbrIbrJbvUbrLbEEblMbrNbrObrPbrQbrRbrSbrTbrSbrSbrSbrUbrVbrWbrXbrYbrZbrYbsabrYbrYbsbbscaCrbsebsfbsgbsgboOaZWaZmaahbgmboPbshboRbkHbmibsibsjbskbslbmmbmmbsmbkHbuYbmmbsobspbmiboZbsqbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaaaaaaaadaadaaaaadaadaadaaaaadaadaadaaaacAaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsrahyahybssbmqbstbpcbpcbmqbsubsvbswbsxbsybszbsAbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbsBbfubsCbdTbekbsEbsFbsFbsGbsHbsIbsJbrlbsKbrnbsLbsMazFbrrbsObsPahyahybamaZzbcnbhrbamahyahyahyahyahyahyaahaahaahaahbjWbsQbrxbsRbsSbsTbsUbsQbjWaahaahaahaahaZdaZHaZdahyaZIbdqbbEbsVdCDdCLbbIbbJbbKbbGbbGbbGbbIbbJbbKdCHdCCbrCbbEbdqaZIahyaZPaYGbetaUwbrGahyahybeZbeZbsWbeZbeZblMblMblMbsXbsXbsXbsXbsYbsZbsXbsXbtabtbbtcbtdbtdbtebtfbtbbtgbthbtibtjbtkawrbtmboObtnaCsaCuaCtaCuaDwboOaZWaZmaahbgmbtsbttbnBbtubnDbtvbnDbtwbmmbtxbmmbtybkJbyTbijbtzbtAbtBbtCaAdbgmaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaacAaaabtEbtFbtGaaabtEbtFbtGaaabtEbtFbtGaaabtEbtFbtGaaaacAaadaadaaaaaaaaaaaaaaaaaabtHbtIbtJbtKaaaaaabtLbtMbtNbtLbtLbtObnPbnQbtPbtQbnPbtRbnTbkPbkPbkPbtSbnTbkPaahaahaahaahaahaahaahaahaahaahaahbdTbtTbtUbtVbMKaADbtXbtYbpzbtZbeEbuabubbucbudbuebufbufbufbugbuhbuiahyahybamaZzbcnbhrbamahyahyahyahyahyaahaahaahaahaahbjWbujbukbulbumbukbukbujbjWaahaahaahaahaZdaZHaZdahyahybbMbaMbbEbsVdCDdCNdCPdCOdCzdCzdCzdCNdCPdCOdCCbrCbbEbaybbDahyahybaNbdubdvbunbrGahyahybuoberbuqburbusaAEbuubuvbsXbuwbuxbuybuzbuAbuBbuCbuDbuEbuFaAFbuHbuIbtfbHXbuKbuLbuMbuNbuObuLbuNboObwxbuQbuRbuSbuTbuUboOaZWaZmaahbgmbgmbifbuVbkHboSbuWbmmbmfbmmbmmbtCbuXbkJbCQbwubuZbvabsmbvbbgmbgmaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaacAaadbtEbvcbtGaadbtEbvcbtGaadbtEbvcbtGaadbtEbvcbtGaadacOaaaaadaadaaaaaaaaaaaaaaabtHbtHbvdbvebtHbvfbvgbvhaAGaAIaAHbkPbmobmpbmqbmpbmobkRahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahaahbdTbvlbvmbvnbMNbvobvpbvqbvrbMKbvsbvtbvubvvbvwbvxbvybvzbvAbvBbvCbllahyahybaiaZzbMObhrbaiahyahyahyaahaahaahaahaahaahaahbjWbjWbjWbvDbjWbjWbjWbjWbjWaahaahaahaahaZdaZHaZdahyahyahybbMaZLbaJbgEbgEbvGbvHbiEbhzbiEbvKbvLbgEbgEbiGaZJbbDahyahyahybbNaYGbRLaUwbvNahyahybvObosbuqbvQboNbvSbvTbxbbsXanvbvWbvXbvYbvYbvZbwabwbbwcbwdbwebwebwfbwgbQwbwibwjbwkbwlbwmbwnbwoboOaAKbwqbwrbtqbwsbwtboOaZWaZmaahaahbgmbgmbgmbgmbAQbwvbwwbmfbyUbwybwzbkJbkJbGRbkJbwAbwBbwCbgmbgmaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaadaadaaaaaaaaaaaabtHbwDbwEbwFbtHaAQbwHbwIbwJbwKaARbkObkPbkRbkQbkSbkPbkPaahaahahyahyahyahyahyahyaahaahbwMbwMbwMbwMbwMbwMbwMbwMbwMbwNbwObwPbdTbrAbwRbwSbwTbMNbwUbuabsCbucbwVbwWbwXbllbwYbwZbwYbllahybeebeeblmblnblobboahyahyaahaahaahaahaahaahaahaahaahaahaahbxaaahaahaahaahaahaahaahaahaZdaZdaZHaZdaZdahyahyahyaZIaZJaZKaZLaZIaZIaZJaZKaZLaZIaZIaZJaZKaZLaZIahyahyahyahyaToaZjblDaZlaToaToahybxcbxdbxebvSbxfbxgbxhbxibsXanAbxkbxlbxmbvYbvYbxnbqhbxpbxqbthbthbxrbtfbxsbxtbxubxvbxwbxxbADbvRboOboOboOboObxAboOboOboOaZWaZmaahaahaahaahaahbgmbxBbxCbkJbxDbkJbxBbxEbkJbxFbxGbkJbxHbxIbkJbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaaaaadaadaaaaaaaaabtHbxJbxKbxLbtHdDfbxMbxNbxObxPaASbtLaahaahaahahyahyaahaahahyahyahyahyaahaahaahaahbwMbwMbxRbxSbxTbxUbxVbxWbxXbwMbxYbxZbyabdTbybbycbydbyebdTbyfbuabygbyhbyhbyhbyhbyhbyibyjbykbyhbfzbeebylaZzbcnbymbboaZdaahaahaahaahaahaahaahaahaahaahaahaahbxaaahaahaahaahaahaahaahaZdaZdaZGaZHaZGaZdaZdahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyaZdaTobbObynbiPbyoaTobypbyqbyrbysbytbyubyvbywbyxbyybyzbyAbyBbyCbvYbxobsXbyEbtbbyFaEqbyHbyIbyJbyKbyLbyMbyNbxybyPbyQbyRbySbIxbCLbyVbyWbyXbyYbySaZWaZmaahaahaahaahaahbgmbyZbzabzbbzcbzdbzebzfbzgbzhbzibkJdkQbzkbzlbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaaaaaaaadbzmbznbznbznbznbzobtHbtHbtLbzpbzqbzrbzsaEJbtLaahaahaahaahahyahyahyahyahyahyaahaahaahaahaahbwMbzubzvbzwbzxbzybzzbzAbzBbzCbzDbzEbzFbzGbzHbzIbzJbzKbzLbzMbzNbzObzPbzQbzRbzSbzPbzTbzUbzVbzWbzXbzYbecbajbhqbhrbzZaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaahaahaahbxaaahaahaZdaZdaZdaZdaZdaZdbAabAbbAcbAdaZGaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdbAebAfbAgbAhaUvbAibAjbAkbvSbAlbvSbAmbxgbAnbAobuCbApbAqbArbAsbAtbAubuCbAvbAwbqmbAxbAxbAybtfbAzbwiaFxbABbACbADbAEbAFbySbAGbAHbAIbyWbyWbAJbySbAKaZmaahaahaahaahaahbgmbgmdkRbAMbANbAObAPcBYbARbASbATbAUbAVbAWbAXbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaaaaaaaaabAZbBabBbbBcbBdbBebBfbBgbBhbBibtLbBjbBkbBlbBmaEJbtLaahaahaahaahaahahyahyahyahyaahaahaahaahaahaahbwMbBnbzwbBobBpbBqbBrbBsbBrbBtbBubBvbBwbBxbjJbBybjJbBzbjJbjJbBAbBBbBCbBDbBEbBFbBGbBHbBIbBJbBKbBLbBMbBNbBObBPbBQbBRbBSbBTbBUbBUbBUbBUbBVbBUbBWaZdaZdaZdaZdbBXaZdaZdaZdbBYbBZbBZbBZbBZbBZbCabCbbCcbCdbCdbCdbCdbCdbCdbCdbCebCdbCdbCdbCfbCgbCgbCgbCgbCgbCgbCgbCgbChbCgbCibCjbCkbClbCmbbRbCnbCobCpbCqbCrbvQbCsbvSbCtbCubwabCvbCwbCxbCzbyDbCybwabCBbCCbCDbCEbCEbCFbCGbwhbxtbCHbCIaFzbCKbIcbySbySbCMbCNbCObCPbyWbAJbySbAKaZmaahaahaahaahaahaahbgmbgmbgmbJJbCRbgmbgmbgmbgmbgmbgmbCSbCTbgmbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaadbCUbCVbCVbCVbAYbCVbCVbCVbAYbCVbCVbCVbAYbCVbCVbCVbAYbCVbCVbCVbCVbCVbCZbDabDbbDcbDdbDebDfbDgbDhbDibDjbtLbtLbDkbtLbtLbDlbtLaahaahaahaahaahaahaahahyahyaahaahaahaahaahaahbwMbDmbDnbDobDpbDqbDrbDsbDtbwMbDubDvbDwbDxbDybDzbDAbDBbDCbDDbDEbDFbyhbDGbDHbDIbDJbDKbDLbzVbzWbzXbzYbecbecbDMbDNbDOaZdbDPbDQbDRbDSbDTbDUbDVbDWbDXbDYbDZbEabEbbBUbBUbBUbEcaZdaZdaZdaZdaZGbEdbEebEfbEgbEgbEgbEgbEgbEgbEgbEhbEgbEgbEgbEibEjbEjbEjbEjbEjbEjbEjbEkbiDbjYaZdbElaYGbetbEmaVlbEnbEobEpbEqbErbEsbEtbEubEvbEwbsXbsYbsZbExbsYbEybsZbsXbEzbtbbyFaEqbyHbEAbtfbEBbuKbECbEDbuKbySbySbySdBabEFbEGbEHbEIbyWbAJbySbAKaZmaahaahaahaahaahaahaahbgmbEJbEKbELbgmaahaahaahaahbgmbgmbgmbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaaaaaaaaabAZbBabENbEObEPbEQbznbERbESbETbEUbEUbEVbEWbtHbEXbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbwMbEYbEZbFabFbbFcbFdbFebFfbwMbFgbfubFhbFibFjbFkbFlbFmbFibFnbFobFnbyhbyhbyhbyhbyhbrDbFqbFrbyhbfzbeebFsbecbcnbFtbboaZdbFubFubFubFubFubFubFvbFwaZdbFxbFybFxaZdbFzbFAbFBbFCaZdaahaahaZdaZdaZGaZHaZGbFDbFEbFFbFGbEgbFHbFIbFJbFJbFKbFLbFMbFObFNbFPbFNbHvbHubEjbFQbEjaZdaZdaTobFRbgJaUvbFSaTobypbyqbFTbAlbFUbFVbFWbFXbEqbFYbFZbGabGbbGcbGdbGebGfbGgbGhbGibGjbGjbGkbGlbtbbGmbGnaFRbGpbySbGqbGrbGsbGtbGubGvbGwbyWbAJbySaZWaZmaZmaahaahaahaahaahaahbgmbxzbGybGzbgmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaadbtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaaaadaaaaaaaaaaaaaaabGBbznbznbznbznbtHbtHbGCbGDbDibGEbGFbGGbGHbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbwMbwMbwMbGIbGJbGJbGJbwMbwMbwMbGKbGLbyfbGMbGNbGObGPbGQbFibGSbGUbGTaGxbGVbIsaHnbGYbFnbGZbFnbGYahybeebeebHabcnbecbHbbHcbFubHdbyObHfbHgbFubFubFubFubHhbHibHhbHjbHjbHkbHlbHjbHmaahaahaahaZdaZdaZHbEgbEgbHnbHobHpbEgbHqbHrbHsbHsbHsbHtbHwbHybHxbHxbHzbKBbJbbHAbHBbEjahyahyaToaZjblDbHCaToaToahybxcbHDbHEbCqbHFbHGbHHbCqbHIbHJbHKbHLbHMbHNbHMbHObHPbHPbHQbHPbHPbHRbHSbHTbHUbHVbHWdBkbySbHYbHZbIabGtbGubGvbIbbyWbAJbySbbbbJraZmaahaahaahaahaahaahbgmbHebIedGPbgmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaaaadaaaaaaaaaaahaahaahaahaahaahaahaahbtHbtHbtHbtHbtHbIgbIhbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbwMbIjbGJbGIbGJbGJbGJbGJbIkbwMbIlbfubImbInbIobIpbIqbIrbFibItbIAbIybIubIubIwbIubJXbJWbIzbJYbKcahyahybIBbecbRQbecbICbHcbIDbIEbIFbIFbIGbIHaHqaHMbFubIKbILbIMbHjbINbIObIPbHjaahaahaahaahaZdaZGaZHbEgbIQbIRbISbITbEgbIUbIVbIWbFJbFJbIXbIYbIZbJabJabJabJabJabJbbJcbJdahyahybJeaYGbRSaUvbpPahyahybuobosbvSbvSbJfbJgbvSbvSbJhbJibJjbJkbxqbJlbJmbJnbthbJobJpbJqbKLbJsbJtbJubJvbJwbJxbJybJzbJAbJBbJCbJDbJEbJFbJGbJHbJIbySbglbfpaZmaahaahaahaahaahaahbgmbgmbLDbJKbgmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaaacAaaaaaaaahaahahyahyahyahyahyahyahyahyaahaahaahbtHbtHbJLbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbwMbJMbGJbJNbJObGJbGJbGJbIkbwMbJPbtUbJQbJRbJSbIdbJUbJVbFibGYbKabJZbIubIubIubIubKbbIubIubLzbLAahyahybKdbecbcnbecbKebHcbKfbKgbKhbKibKjbKhbKhaHObFubKlbILbKmbHjbKnbKobKpbHjaahaahaahaahaZdbKqaZHbEgbIQbKrbKsbKtbEgbKubKvbKwbFJaJabKycuybKAbJabJabJabJabJabKBbKCbKDahyahybrGbKEbynbKFbrGahyahybvObsDbKHbKHbKIbKKbMHaGMbKNbKNbKObKPbKQbKRbKNbKSbKTbKUbKVbKSbKWbKWbKWbKWbKWbKXbKYbKZbLabySbySbySbySbySbySbySbySbySbySbLbbLcaZmbLdbLebLebLebLdbLdbLfbLgbLhbLibLfbLdaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaadbtEbGAbtGaadbtEbGAbtGaadbtEbGAbtGaadbtEbGAbtGaadacAaaabLjaahbLkbLkbLlbkQbkQbkQbLmbLkbLkahyaahaahaahbtHbLnbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbwMbLobLpbLqbGJbLrbGJbLsbwMbwMbLtbfubImbFiaJIbLvbLwbLxbLybGYbLCbLBbIvbIubIubIubKbbIvbIubLEbLAahyahybKdbLGbhqbecbKebHcbLHbLIbKhbLJbLKbLLbLMbLNbLObLPbLQbLRbLSbLTbLUbLVbHjaahaahaahaahaZdaZdaZHbEgbEgbLWbEgbEgbEgbLXbLYcAgbMaaJabMbcuBbMdbMebMfbMgbMhbKBbKBaKbbKDahyahybvNbMjbgJaUvbvNahyahybMkbMlbMmbKJbOcbMkbMkbMkbMkaPubMqbMrbMsbMtbMsbKSbMubMvbMwbMxbKWbMybMzbMAbMBbMCbMDbMEbMFbMGbOdbMIbMJbRXbMLbMMdFecbabUSbMQbMRbMSbMTbMUbMVbMWbMXbMYbMZbNabNbbNabNcbLdaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOaaabtEbNdbtGaaabtEbNdbtGaaabtEbNdbtGaaabtEbNdbtGaaaaadaadbLjaahbLkbNebNfbNgbNfbNgbNfbNebLkahyahyaahaahbtHbNhbIibtHbtHaahaahaahaahaahaahaahaahaahaahaahbtHbtHbtHbwMbwMbwMbwMbwMbwMbwMbwMbwMbNibNjbfubyfbGMbNkbNlbNmbLxbNnbGYbPkbNsbRfbPnbPnbRhbRibRfbRkbRjbLFahyahybKdbecbDMbDNbKebNtbFubNubKhbNvbNwbNxbKhbNybFubNzbNAaGUbNCbNCbNCbNCbNCbNCbNCbNCaahaahaZdaZHbEgbNDbNEbNFbQAbNHbFJbFJbNIbFJbNJbEgbNKbNLbNMbNNbNObKBbNPbNQbNRbNSahyahyaTobNTbetbNUaToahyahybMkbNVbNWbNXbNYbSkbUXbMnbMobNBbMqbMrbOebOfbOgbKSbOhbOibOjbOkbKWbOlbOmbOnbOobOpbOqbOrbOsbOtbOtbOubOvbOqbOtbOwbOtbOxbOybOzbOAbOBbOCbODbOEbOEbOFbOEbOGbOHbOIbOJbOKbLdaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahbilbjybjzbjAbjBbjCbjDbjEbilbjFbjGbjHbjIbjJbjKbjLbhobjMbjNbjObjPbhoaahaahaahahyahyahyahyahyahybaibjQbjRbjSbhrbecbjTbjUbjVbgwbhubefaahaahaahaahbjWbjWbjWbjWbjXbjWbjWbjWbjWaahaahaahaZdbjYaZHaZdahybcybaUdCFbbGbbGbbGbbGdCGbjZbhAbhAbhAbkadCFbbGbbGbbGbkbbbGbbGbkcaZibkdaYGbetaUwbkeaToaahbeZbkfbkgblRbeZbfhbfhbfhbfhbkibfhbALbkkbklbgYbkmbknbkobkpbgYbkqbkrbksbktbgZbkubkvbkwbkxbkybkzbkAbkBbkCbkDbkEbkFbhfbdObkGaZmaahaahbgmbgmbgmbgmbkHbkIbkHbkJbkHbkKbkHbgmbgmbgmbgmbkLbkMbkNbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkObkPbkRbkQbkSbkPbkPahyaahaahaahaahaahaahaahaahaahbilbkTbkUbkVbkWbkXbkYbkZblablbblcbldbleblfblgblhbhoblibljblkblkbhobllbllbllbllahyahyahyahyahybbobboblmblnblobeebefblpbjVbgwblqbefaahaahaahaahbjWblrblsbltblublvblwblxbjWaahaahaahaZdaZdaZHaZdahyaZIblydCwbeqbbGblzbbGbbGdCrbjZblAbkabfMbbGbbGblzbbGblBdCHdCIaZIaZfaToaZjblDaZlaToaToaahbeZblEblFblGbeZblHblIblJdGQblLblMblNbhOblWbgYbgYblPblQbpabgYblSblTblUblVbgZbrKbhZbhYblXbhYbhYblYbhfblZbmabhfbmbbhfbmcaZWaZmaahbgmbgmbifbmdbkHbmebmfbmgbmhbmibmfbmgbmjbkJbmkbmlbmibmmbmgbmnbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkPbmobmpbmqbmpbmobkRahyahyaahbkPbkPbkPbkPaahaahaahbilbmrbmsbjAbmtbmubmvbmwbilbmxbfubmybdTbrebdTbrebhoblibmAbmBbmCblkbmDbmEbmFbllbmGbmHbmIbllahyahyaZyaZzbcnbhrbeebmJbmKbmLbmMbefbefaahaahaahaahbjWbmNbmObmPbmQbmPbmRbmSbjWaahaahaahaahaZdaZHaZdahyaZIbmTdCJbbJbbGbfPbfQbmUbbGbdCbdCbdCbbGbmUbeVbfNbbGbbGdCKbmVaZIahyaZPaYGaYHaUwaToaahaahbeZbmWbmXbmYbmZbnabnbbncbncbndbnebnfbngbnhbnibgYbnjbnkbnlbgYbnmbnnbnobnpbgZbnqbnrbhYbnsbhYbntbnubhfbnvbnwbhfbnxbhfbnyaZWaZmaahbgmbnzbnAbnBbnCbnDbnEbnDbnFbnDbnGbihbnHbkJbnIbnJbnKbnLbihbnMaFMbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnObnPbnQbnRbnRbnPbnSbnTbkPbkPbkPbnUbnVbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbftbfubnWbdTbnXbnYbnZblkblkboabobbocblkbodboeboebofbogbohboibllahyahybamaZzbcnbojbeebmKbmKbokbolbefaahaahaahaahbjWbjWbombonboobopboqbonborbjWbjWaahaahaahaZdaZHaZdahybdqbiHdCBbfRbbGbbGbfPbfQbbGbbGbbGbbGbbGbembeWbbGbbGbbGdCxbdxbdqahybaNbbObotbouaToaahaahbeZbgLbovbgNbowboxboybozboAboBboCbgVbhOboDboEbgYboFboGboFbgYboHboIbTzboKbgZbgkboLboMbdAboLboMboOboOboOboOboOboOboOboOaZWaZmaahbgmboPboQboRbkHboSbmfanuboUboVboWbmmbmgbkHbmibmmboXboYboSboZbuPbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkQbmqbpbbpcbpcbmqbpdbpebpfbpgbphbpibpjbpkbplbpmbpnbpobppbpqbprbprbpsbprbptbpubpvbpwbpxbMKbpzbpzbpzbpAblkblkbpBblkblkbpCbpDbpEbpEbpEbpFbpGbllahyahybamaZzbcnbfBbeebefbefbefbefbefaahaahaahaahbjWbpHbpIbpJbpKbpLbpKbpMbpNbpObjWaahaahaahaZdaZHaZdahybejbiHdCDdCLbbGbelbbGbfPbenbbGbbGbbGbeobeWbbGbelbbGdCHdCMbdxbejahybbNaYGaYHaUwbpPahyaahbeZbpQbpRbgNbpSbpTbpUbpVbpVbpWbpXbpYbpZbqabqabqbbqcbqdbqcbqebqcbqfbqgbqhbqibqjbqkbqhbqlbqmbqnboObqoaCqbqqbqrbqsbqtboOaZWaZmaahbgmbqubqvbqwbkJbqxbqybqzbgmbqAbqBbqCbqCbqDbsnbqCbqEbqFbqGboZbqHbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaacAacOacAacAacAacAacAacAacAacOacAacAacAacAaaaaaaacAacAacAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqIaadahybkQbnPbqJbpcbpcbqKbqLbqMbqNbqObqPbqQbqRbqSbqTbqUbqVbqTbqWbqXbqTbqYbqZbrabrbbrcbrdbgqbinbMNbrfbrgbpzbrhbrebribrjbrkbrlbrmbrnbrobrpbrqbrrbrsbllahyahybambrtbrubrvaZyahyahyahyahyahyahyaahaahaahbjWbjWbrwbrxbpKbpKbpKbrybrzbjWbjWaahaahaahaZdaZHaZdahybcyaTsbrBdCDdCLbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGdCHdCCbrCbdBbcyahyaTobrEaYHbrFbrGahyahybeZbfTblFbrHbeZbrIbrJbvUbrLbEEblMbrNbrObrPbrQbrRbrSbrTbrSbrSbrSbrUbrVbrWbrXbrYbrZbrYbsabrYbrYbsbbscaCrbsebsfbsgbsgboOaZWaZmaahbgmboPbshboRbkHbmibsibsjbskbslbmmbmmbsmbkHbuYbmmbsobspbmiboZbsqbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaaaaaaaadaadaaaaadaadaadaaaaadaadaadaaaacAaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsrahyahybssbmqbstbpcbpcbmqbsubsvbswbsxbsybszbsAbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbsBbfubsCbdTbekbsEbsFbsFbsGbsHbsIbsJbrlbsKbrnbsLbsMbsNbrrbsObsPahyahybamaZzbcnbhrbamahyahyahyahyahyahyaahaahaahaahbjWbsQbrxbsRbsSbsTbsUbsQbjWaahaahaahaahaZdaZHaZdahyaZIbdqbbEbsVdCDdCLbbIbbJbbKbbGbbGbbGbbIbbJbbKdCHdCCbrCbbEbdqaZIahyaZPaYGbetaUwbrGahyahybeZbeZbsWbeZbeZblMblMblMbsXbsXbsXbsXbsYbsZbsXbsXbtabtbbtcbtdbtdbtebtfbtbbtgbthbtibtjbtkawrbtmboObtnaCsaCuaCtaCuaDwboOaZWaZmaahbgmbtsbttbnBbtubnDbtvbnDbtwbmmbtxbmmbtybkJbyTbijbtzbtAbtBbtCbtDbgmaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaacAaaabtEbtFbtGaaabtEbtFbtGaaabtEbtFbtGaaabtEbtFbtGaaaacAaadaadaaaaaaaaaaaaaaaaaabtHbtIbtJbtKaaaaaabtLbtMbtNbtLbtLbtObnPbnQbtPbtQbnPbtRbnTbkPbkPbkPbtSbnTbkPaahaahaahaahaahaahaahaahaahaahaahbdTbtTbtUbtVbMKbtWbtXbtYbpzbtZbeEbuabubbucbudbuebufbufbufbugbuhbuiahyahybamaZzbcnbhrbamahyahyahyahyahyaahaahaahaahaahbjWbujbukbulbumbukbukbujbjWaahaahaahaahaZdaZHaZdahyahybbMbaMbbEbsVdCDdCNdCPdCOdCzdCzdCzdCNdCPdCOdCCbrCbbEbaybbDahyahybaNbdubdvbunbrGahyahybuoberbuqburbusbutbuubuvbsXbuwbuxbuybuzbuAbuBbuCbuDbuEbuFbuGbuHbuIbtfbHXbuKbuLbuMbuNbuObuLbuNboObwxbuQbuRbuSbuTbuUboOaZWaZmaahbgmbgmbifbuVbkHboSbuWbmmbmfbmmbmmbtCbuXbkJbCQbwubuZbvabsmbvbbgmbgmaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaacAaadbtEbvcbtGaadbtEbvcbtGaadbtEbvcbtGaadbtEbvcbtGaadacOaaaaadaadaaaaaaaaaaaaaaabtHbtHbvdbvebtHbvfbvgbvhawxbvjbvkbkPbmobmpbmqbmpbmobkRahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahaahbdTbvlbvmbvnbMNbvobvpbvqbvrbMKbvsbvtbvubvvbvwbvxbvybvzbvAbvBbvCbllahyahybaiaZzbMObhrbaiahyahyahyaahaahaahaahaahaahaahbjWbjWbjWbvDbjWbjWbjWbjWbjWaahaahaahaahaZdaZHaZdahyahyahybbMaZLbaJbgEbgEbvGbvHbiEbhzbiEbvKbvLbgEbgEbiGaZJbbDahyahyahybbNaYGbRLaUwbvNahyahybvObosbuqbvQboNbvSbvTbxbbsXanvbvWbvXbvYbvYbvZbwabwbbwcbwdbwebwebwfbwgbQwbwibwjbwkbwlbwmbwnbwoboObwpbwqbwrbtqbwsbwtboOaZWaZmaahaahbgmbgmbgmbgmbAQbwvbwwbmfbyUbwybwzbkJbkJbGRbkJbwAbwBbwCbgmbgmaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaadaadaaaaaaaaaaaabtHbwDbwEbwFbtHbwGbwHbwIbwJbwKbwLbkObkPbkRbkQbkSbkPbkPaahaahahyahyahyahyahyahyaahaahbwMbwMbwMbwMbwMbwMbwMbwMbwMbwNbwObwPbdTbrAbwRbwSbwTbMNbwUbuabsCbucbwVbwWbwXbllbwYbwZbwYbllahybeebeeblmblnblobboahyahyaahaahaahaahaahaahaahaahaahaahaahbxaaahaahaahaahaahaahaahaahaZdaZdaZHaZdaZdahyahyahyaZIaZJaZKaZLaZIaZIaZJaZKaZLaZIaZIaZJaZKaZLaZIahyahyahyahyaToaZjblDaZlaToaToahybxcbxdbxebvSbxfbxgbxhbxibsXanAbxkbxlbxmbvYbvYbxnbqhbxpbxqbthbthbxrbtfbxsbxtbxubxvbxwbxxbADbvRboOboOboOboObxAboOboOboOaZWaZmaahaahaahaahaahbgmbxBbxCbkJbxDbkJbxBbxEbkJbxFbxGbkJbxHbxIbkJbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaaaaadaadaaaaaaaaabtHbxJbxKbxLbtHdDfbxMbxNbxObxPbxQbtLaahaahaahahyahyaahaahahyahyahyahyaahaahaahaahbwMbwMbxRbxSbxTbxUbxVbxWbxXbwMbxYbxZbyabdTbybbycbydbyebdTbyfbuabygbyhbyhbyhbyhbyhbyibyjbykbyhbfzbeebylaZzbcnbymbboaZdaahaahaahaahaahaahaahaahaahaahaahaahbxaaahaahaahaahaahaahaahaZdaZdaZGaZHaZGaZdaZdahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyaZdaTobbObynbiPbyoaTobypbyqbyrbysbytbyubyvbywbyxbyybyzbyAbyBbyCbvYbxobsXbyEbtbbyFbyGbyHbyIbyJbyKbyLbyMbyNbxybyPbyQbyRbySbIxbCLbyVbyWbyXbyYbySaZWaZmaahaahaahaahaahbgmbyZbzabzbbzcbzdbzebzfbzgbzhbzibkJdkQbzkbzlbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaaaaaaaadbzmbznbznbznbznbzobtHbtHbtLbzpbzqbzrbzsawybtLaahaahaahaahahyahyahyahyahyahyaahaahaahaahaahbwMbzubzvbzwbzxbzybzzbzAbzBbzCbzDbzEbzFbzGbzHbzIbzJbzKbzLbzMbzNbzObzPbzQbzRbzSbzPbzTbzUbzVbzWbzXbzYbecbajbhqbhrbzZaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaahaahaahbxaaahaahaZdaZdaZdaZdaZdaZdbAabAbbAcbAdaZGaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdbAebAfbAgbAhaUvbAibAjbAkbvSbAlbvSbAmbxgbAnbAobuCbApbAqbArbAsbAtbAubuCbAvbAwbqmbAxbAxbAybtfbAzbwibAAbABbACbADbAEbAFbySbAGbAHbAIbyWbyWbAJbySbAKaZmaahaahaahaahaahbgmbgmdkRbAMbANbAObAPcBYbARbASbATbAUbAVbAWbAXbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaaaaaaaaabAZbBabBbbBcbBdbBebBfbBgbBhbBibtLbBjbBkbBlbBmbztbtLaahaahaahaahaahahyahyahyahyaahaahaahaahaahaahbwMbBnbzwbBobBpbBqbBrbBsbBrbBtbBubBvbBwbBxbjJbBybjJbBzbjJbjJbBAbBBbBCbBDbBEbBFbBGbBHbBIbBJbBKbBLbBMbBNbBObBPbBQbBRbBSbBTbBUbBUbBUbBUbBVbBUbBWaZdaZdaZdaZdbBXaZdaZdaZdbBYbBZbBZbBZbBZbBZbCabCbbCcbCdbCdbCdbCdbCdbCdbCdbCebCdbCdbCdbCfbCgbCgbCgbCgbCgbCgbCgbCgbChbCgbCibCjbCkbClbCmbbRbCnbCobCpbCqbCrbvQbCsbvSbCtbCubwabCvbCwbCxbCzbyDbCybwabCBbCCbCDbCEbCEbCFbCGbwhbxtbCHbCIbCJbCKbIcbySbySbCMbCNbCObCPbyWbAJbySbAKaZmaahaahaahaahaahaahbgmbgmbgmbJJbCRbgmbgmbgmbgmbgmbgmbCSbCTbgmbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaadbCUbCVbCVbCVbAYbCVbCVbCVbAYbCVbCVbCVbAYbCVbCVbCVbAYbCVbCVbCVbCVbCVbCZbDabDbbDcbDdbDebDfbDgbDhbDibDjbtLbtLbDkbtLbtLbDlbtLaahaahaahaahaahaahaahahyahyaahaahaahaahaahaahbwMbDmbDnbDobDpbDqbDrbDsbDtbwMbDubDvbDwbDxbDybDzbDAbDBbDCbDDbDEbDFbyhbDGbDHbDIbDJbDKbDLbzVbzWbzXbzYbecbecbDMbDNbDOaZdbDPbDQbDRbDSbDTbDUbDVbDWbDXbDYbDZbEabEbbBUbBUbBUbEcaZdaZdaZdaZdaZGbEdbEebEfbEgbEgbEgbEgbEgbEgbEgbEhbEgbEgbEgbEibEjbEjbEjbEjbEjbEjbEjbEkbiDbjYaZdbElaYGbetbEmaVlbEnbEobEpbEqbErbEsbEtbEubEvbEwbsXbsYbsZbExbsYbEybsZbsXbEzbtbbyFbyGbyHbEAbtfbEBbuKbECbEDbuKbySbySbySdBabEFbEGbEHbEIbyWbAJbySbAKaZmaahaahaahaahaahaahaahbgmbEJbEKbELbgmaahaahaahaahbgmbgmbgmbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaaaaaaaaabAZbBabENbEObEPbEQbznbERbESbETbEUbEUbEVbEWbtHbEXbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbwMbEYbEZbFabFbbFcbFdbFebFfbwMbFgbfubFhbFibFjbFkbFlbFmbFibFnbFobFnbyhbyhbyhbyhbyhbrDbFqbFrbyhbfzbeebFsbecbcnbFtbboaZdbFubFubFubFubFubFubFvbFwaZdbFxbFybFxaZdbFzbFAbFBbFCaZdaahaahaZdaZdaZGaZHaZGbFDbFEbFFbFGbEgbFHbFIbFJbFJbFKbFLbFMbFObFNbFPbFNbHvbHubEjbFQbEjaZdaZdaTobFRbgJaUvbFSaTobypbyqbFTbAlbFUbFVbFWbFXbEqbFYbFZbGabGbbGcbGdbGebGfbGgbGhbGibGjbGjbGkbGlbtbbGmbGnbGobGpbySbGqbGrbGsbGtbGubGvbGwbyWbAJbySaZWaZmaZmaahaahaahaahaahaahbgmbxzbGybGzbgmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaadbtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaaaadaaaaaaaaaaaaaaabGBbznbznbznbznbtHbtHbGCbGDbDibGEbGFbGGbGHbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbwMbwMbwMbGIbGJbGJbGJbwMbwMbwMbGKbGLbyfbGMbGNbGObGPbGQbFibGSbGUbGTbGWbGVbIsbGXbGYbFnbGZbFnbGYahybeebeebHabcnbecbHbbHcbFubHdbyObHfbHgbFubFubFubFuawzbHibHhbHjbHjbHkbHlbHjbHmaahaahaahaZdaZdaZHbEgbEgbHnbHobHpbEgbHqbHrbHsbHsbHsbHtbHwbHybHxbHxbHzbKBbJbbHAbHBbEjahyahyaToaZjblDbHCaToaToahybxcbHDbHEbCqbHFbHGbHHbCqbHIbHJbHKbHLbHMbHNbHMbHObHPbHPbHQbHPbHPbHRbHSbHTbHUbHVbHWdBkbySbHYbHZbIabGtbGubGvbIbbyWbAJbySbbbbJraZmaahaahaahaahaahaahbgmbHebIedGPbgmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaaaadaaaaaaaaaaahaahaahaahaahaahaahaahbtHbtHbtHbtHbtHbIgbIhbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbwMbIjbGJbGIbGJbGJbGJbGJbIkbwMbIlbfubImbInbIobIpbIqbIrbFibItbIAbIybIubIubIwbIubJXbJWbIzbJYbKcahyahybIBbecbRQbecbICbHcbIDbIEbIFbIFbIGbIHbIIbIJbFuaxjaxibIMbHjbINbIObIPbHjaahaahaahaahaZdaZGaZHbEgbIQbIRbISbITbEgbIUbIVbIWbFJbFJbIXbIYbIZbJabJabJabJabJabJbbJcbJdahyahybJeaYGbRSaUvbpPahyahybuobosbvSbvSbJfbJgbvSbvSbJhbJibJjbJkbxqbJlbJmbJnbthbJobJpbJqbKLbJsbJtbJubJvbJwbJxbJybJzbJAbJBbJCbJDbJEbJFbJGbJHbJIbySbglbfpaZmaahaahaahaahaahaahbgmbgmbLDbJKbgmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaaacAaaaaaaaahaahahyahyahyahyahyahyahyahyaahaahaahbtHbtHbJLbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbwMbJMbGJbJNbJObGJbGJbGJbIkbwMbJPbtUbJQbJRbJSbIdbJUbJVbFibGYbKabJZbIubIubIubIubKbbIubIubLzbLAahyahybKdbecbcnbecbKebHcbKfbKgbKhbKibKjbKhbKhbKkbFubKlbILbKmbHjbKnbKobKpbHjaahaahaahaahaZdbKqaZHbEgbIQbKrbKsbKtbEgbKubKvbKwbFJbKxbKycuybKAbJabJabJabJabJabKBbKCbKDahyahybrGbKEbynbKFbrGahyahybvObsDbKHbKHbKIbKKbMHaGMbKNbKNbKObKPbKQbKRbKNbKSbKTbKUbKVbKSbKWbKWbKWbKWbKWbKXbKYbKZbLabySbySbySbySbySbySbySbySbySbySbLbbLcaZmbLdbLebLebLebLdbLdbLfbLgbLhbLibLfbLdaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaadbtEbGAbtGaadbtEbGAbtGaadbtEbGAbtGaadbtEbGAbtGaadacAaaabLjaahbLkbLkbLlbkQbkQbkQbLmbLkbLkahyaahaahaahbtHbLnbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbwMbLobLpbLqbGJbLrbGJbLsbwMbwMbLtbfubImbFibLubLvbLwbLxbLybGYbLCbLBbIvbIubIubIubKbbIvbIubLEbLAahyahybKdbLGbhqbecbKebHcbLHbLIbKhbLJbLKbLLbLMbLNbLObLPbLQbLRbLSbLTbLUbLVbHjaahaahaahaahaZdaZdaZHbEgbEgbLWbEgbEgbEgbLXbLYcAgbMabKxbMbcuBbMdbMebMfbMgbMhbKBbKBbMibKDahyahybvNbMjbgJaUvbvNahyahybMkbMlbMmbKJbOcbMkbMkbMkbMkaPubMqbMrbMsbMtbMsbKSbMubMvbMwbMxbKWbMybMzbMAbMBbMCbMDbMEbMFbMGbOdbMIbMJbRXbMLbMMdFecbabUSbMQbMRbMSbMTbMUbMVbMWbMXbMYbMZbNabNbbNabNcbLdaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOaaabtEbNdbtGaaabtEbNdbtGaaabtEbNdbtGaaabtEbNdbtGaaaaadaadbLjaahbLkbNebNfbNgbNfbNgbNfbNebLkahyahyaahaahbtHbNhbIibtHbtHaahaahaahaahaahaahaahaahaahaahaahbtHbtHbtHbwMbwMbwMbwMbwMbwMbwMbwMbwMbNibNjbfubyfbGMbNkbNlbNmbLxbNnbGYbPkbNsbRfbPnaxrbRhbRibRfbRkbRjbLFahyahybKdbecbDMbDNbKebNtbFubNubKhbNvbNwbNxbKhbNybFubNzbNAaGUbNCbNCbNCbNCbNCbNCbNCbNCaahaahaZdaZHbEgbNDbNEbNFbQAbNHbFJbFJbNIbFJbNJbEgbNKbNLbNMbNNbNObKBbNPbNQbNRbNSahyahyaTobNTbetbNUaToahyahybMkbNVbNWbNXbNYbSkbUXbMnbMobNBbMqbMrbOebOfbOgbKSbOhbOibOjbOkbKWbOlbOmbOnbOobOpbOqbOrbOsbOtbOtbOubOvbOqbOtbOwbOtbOxbOybOzbOAbOBbOCbODbOEbOEbOFbOEbOGbOHbOIbOJbOKbLdaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaaaaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaaaaadaadaahaahaahbOLbOMbONbOObOPbOQbOLbORahyahyaahaahbtHbOSbIibOTbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbOUbOVbOWbOXbOYbOZbzHbPabPbbPcbPdbPebPfbPgbImbInbIobPhbPibLxbPjbGYbSRbSQbSSbNqbNqbNrbNpbSSbRlbSTbGYahyahybKdbecbcnbecbPobHcbFubPpbKhbPqbPrbPsbKhbPtbFubPubPvbPwbNCbPxbPybPzbPAbNCbPBbNCbNCaahaZdaZHbEgbPCbPDbPEbPEbPFbPEbPEbPGbFJbPHbEgbPIbPJbPKbPLbPMbPNbPIbPJbPKbEjbPObPPaToaZjblDbHCaToaToahybMkbPQbPRbPSbPTbPUbPVbPWbPXbPYbPZbQabQbbQcbQdbKSbQebQfbQgbQhbKWbQibQjbQkbMBbQlbQmbQnbQobQpbQqbQrbQsbQtbQpbQubQvdGRbMPbMQbQxbQybQzbMUbMVbWWbQBbOJanDbQDbQEbOJcAfbLdaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczaczacAaczaczacOacAaadaadaadaadaaaaaaaaaaadaadaadacOaadaaaaahaahaahbNgbQFbQGbQHbQHbQIbNgahyahyahyaahaahbtHbQJbQKbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQMbQNbQObQPbQQbQRbQSbQTbQUbQVbQWbQXbQYbQZbyfbJRbRabRbbRcbRdbRebGYbNobNpbNpbNpbNpbNpbNpbNpbRlbSUbGYahyahybKdbecbcnbRmbRnbRobRpbRqbRrbRsbRtbRubRvbRwbFubRxbPvbRybNCbRzbRAbRBbRBbRCbRDbREbNCaahaZdaZHbEgbRFbRGbFJbRHbRIbFJbFJbFJbFJbRJbEgbupbTlbTkbRNbRObRPbRObRPbvEbRTbRUbRUbRVbRWbetaUvbvFaToahybMkbRYbRZbSabNWbSbbScbSdbSebSfbSgbShbSibMpbvIbKSbXibQfbSlbSmbKWbKWbKWbKWbKWbSnbSobSpbSpbSpbSpbSpbSqbSrbSqbSqbSqbSqbSqbSsbStbSubSvbSwbSwbSwbLdbLdbSxbSycNtbSxbLdbLdaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbOLbSAbQGbQHbQHbSBbOLbORahyahyaahaahbtHbSCbIibSDbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbSEbSEbSFbSGbSEbSHbSIbSJbSKbSLbSMbSNbSObSPbSLbSLbSLbSLbSLbGYbUDbPlbPmbNpbNpbSzcpCcpubRlbXTbGYahyahybKdbecbcnbSVbbobbobFubFubFubFubFubFubSWbFubFubSXbSYbSZbNCbTabTbbTcbTdbNCbTebTfbNCaahaZdaZHbEgbFLbvJbEgbEgbThbTibTibTibTibEgbEgbTjbTkbTlbTmbTnbTkbTlbTkbTobTpaUvaUvaUvaUvbTqbTrbTsaToahybMkbGxbTubTvbTubTtbScbTxbTybVhbTAbTBbTCbTDbTEbKSbTFbTGbTHbTIbTJbTKbTLbTMbTNbTObTPbTQbTRbTSbTTbSpbTUbTVbTWbOabTXbTZbSqbUabUbbSubUcbUdbUebSuaahaahbSxbUfbUgbSxaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbLkbNebNfbNgbUhbNgbNfbNebLkahyahyaahaahbtHbtHbIibtHbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbUibUjbUkbUlbSEbUmbUnbUnbUobUpbUqbUrbUsbUtaKfbUvbUwbUxbGYbXUbRgbYYbNpbNpcbIbRgcGibRlcGQbGYahyahybKdbecbcnaZzbUFahybUGaKnbUIbUJbUKbULbULbUMbUGbUNbUObUPbNCbNCbUQbNCbNCbNCbNCbNCbNCaahaZdaZHaZdbvMbUTbUUbUVbUWbUWbUWbUWbUWbYobUYbTkbTlbUZbVabVbbVcbTkbTlbVdbVeaUvaUvbVfbVgbdvaUvbvPaToahybMkbVibVjbVkbVlbVmbVnbVobVpbVqbVrbVsdGSbKNbKNbKSbKSbKSbKSbKSbTJbVtbVubVvbVwbVxbVybVzbVAbVBbVCbSpbVDbVEbVFbVGbVGbVHbSqbVIbVJbSubVKbVLbVMbSuaahaahbSxbVNcAhbSxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbLkbLlbVPbVQbVRbVSbVTbLmbLkahyaahaahaahaahbtHbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbVUbVVbVWbVXbVYbVZbWabWbbWcbWdbWebWfbWgbWhbWibWibWjbWkbUEcNkcIgcNkdHrdHrcNkdHscNkdHtcNkbUEahyahybKdbWobcnaZzbamahybWpaKpbULbWrbWsbWsbWtbWubUGbWvbWwbUPbWxbWybWzaKqbWBbWCbWDbWEbNCaahaZdbWFanEbWHbWIbWJclZbWLbWKbTwbWKbWLbWKbWJbTlbTkbWNdBObVabWPbTlbTkbWQbURbPObPPaTobHCblDbHCaToaToahybMkbWRbWSbMkbWRbWSbMkbMkbMkbYAbWUbWVbCAbKNaahaahaahaahaahaahbTJbWXbWYbWZbTNbXabXbbTQbXcbXdbXebSpbXfbXgbXhcccbXjbXkbSqbXlbXmbXnbXobXpbSubSuaahaahbSxbXqbXrbSxbSxaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahahyahybXsbXtbXubXvbXsahyahyahyaahaahaahaahbtHbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbXwbXxbXybXzbXAbXBbXCbXDbXEbXFbXGbXHbXIbXJbXKbXLbXMbXNbUEbUybUzbUAbUBbUBbUybUzbUybUCaKFbUEahyahybKdbXVbhqbXWbamahybXXbXYbXZbYabYbbYcbYdbYebYfbYgbYhbYibYjbYjbYkcqEbYmbYnbYnbTYbNCaahaZdbYpaZdbYqbTkbTlbWJbYrbWJbYrbWJbYrbWJbYsbTkbTlbUZbYtbVbbVcbTkbTlcgwbURahyahyaTobYvbetbYwaToahyahyahyahyahyahyahyahyahyahybKNbKNbYxbYybKNbKNaahaahaahaahaahaahbTJbTJbTJbTJbTJbYzciWbSpbSpbSpbSpbSpbSqbSqbSqbSqbSqbSqbSqbYBbYCbSubSubSubSuaahaahaahbSxbYDbVObYEbSxaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahybYFbYGbYHbYIbYFahyahyahyaahaahaahaahbtHbYJbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbYKaKHaKGbYNbYObYPbXMbYQbYRbYSbYTbYUbYRbYQbXMbXMbXMbYVbUEbWlbWmbWlbWnbUBbWlbWmbWlbUCaKFbUEahyahyanHbecbDMbZbbamahybZcaLtbZebZfbZgbZhbZibZjbUGbWvbZkbZlbZmbZnbZobZpbZqbZrbZsbZtbNCaahaZdbYpaZdaZdbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkbTlbZvbTjbZwbTlbTkbTjbZybZxahybJeaUvbetaUvbJeahyahyahyahyahyahyahyahyahyahyahybZzbZAbZBbZzbeubeubeubeubeubeuaahbZCbZDbZEbZFbZGbTObTPbZHbZIbZJbZKbZLaahaahaahaahaahaahbZMbZNbZObZPbZQbZMaahaahaahaahbSxbZRbZSbZTbSxaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahybZUbZVbZWbZUbZUahyahyaahaahaahaahaahbZXbZYbZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbZZcaacabcacbSEcadcaecaecaecafcagcahcaicaecaecaecajcakbUEbXObUBbUBbXPbXQbXRbXRbXRbXSdHwbUEahyahyanIbecbcnaZzdHyahycaocapbZecaqcarcarcasbULbUGbWvcatcaucavcavcawcaxcaybYnbYncazbNCaahaZdbYpanJaZdaLubTlbTkbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkcaCcaDcaEcaFcaGcaHcaIahyahybrGaUvbetcaJbrGahyahyahyahyahyahyahyahyahyahyahycaKcaLcaMcaNbeubZMbZMbZMbZMbeuaahbZCcaOcaPcaQcaRcaScaTcaUcaVcaWcaXbZLaahaahaahaahaahaahbZMcaYcaZbJTcbbbZMaahaahaahaahcbccbdcbecbfcbcaahahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahycbgcbhcbicbjcbgahyahyaahaahaahaahaahbZXbZYbZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEcbkcblcbmcbnbSEbNZcbpcbqcbrcbscbtcbucbvcbwcbxcbycbzcbAbUEbWlbWmbWlbYWbUBbWlbWmbWlbYXdHzbUEbYZbZabeeccHdHAdHBbeeahybUGcbJcbKcbLcbMbULcbNbUGcbOcbPcbQcbObNCcbRcbScbTcbUcbVcbWcbXbNCaahaZdbYpaZGaZdaLvbTkbTlbTmbTnbTkbTlbTkcbZbTmbTlbTkbTlccabTnccbbTlbTkdBQcaIahyahybrGccdbgJaUvbrGahyahyahyahyahyahyahyahyahyahyahyccBccfccgcaNbeudGTcgndGUbZMbeuaahbZCcchcciccjbZGcckcclbZHccmccnccobZLaahaahaahaahaahaahbZMbZNbZMbZMbZMbZMaahaahaahaahcbcccpaEGccrccscctccuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahahyahybXsccvccwccxbXsahyahyaahaahaahbZXbZXbZXbZYbZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbSEccycczbSEbSEbSLbSLbSLbSLbSLccAbSLbSLbSLccEccCccDbSLbUEbUybUybUybUBbUBbUybUybUybYXcalcamcanbecbecbecbcnaZzbeeahybUGbUGbUGbUGbUGbUGbUGbUGccIccJccKccLbNCbNCccMbNCbNCbNCccNaLxbNCccPaZdccQaZdaZdaLSbTlbUZdBRbVbbVcccTccUbVbbVaccVccWbUZbVadBOccXbTkbTlcbYcaIahyahybrGaUvbetaUvbvNahyahyahyahyahyahyahyahyahyahyahyccBccYccZcaNbeucgncgndGWbZMbeuaahbZCbZCbZCbZCbZCcdacdbbZLbZLbZLbZLbZLaahaahaahaahaahaahbZMbZNbZMaahaahaahaahaahaahaahcbccdccddcdecdfcdgcdhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbLkbNebNfbNgbUhbNgbNfbNebLkahyahyaahaahbtHbtHbIibtHbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbUibUjbUkbUlbSEbUmbUnbUnbUobUpbUqbUrbUsbUtbUubUvbUwbUxbGYbXUbRgbYYbNpbNpcbIbRgcGibRlcGQbGYahyahybKdbecbcnaZzbUFahybUGbUHbUIbUJbUKbULbULbUMbUGbUNbUObUPbNCbNCbUQbNCbNCbNCbNCbNCbNCaahaZdaZHaZdbvMbUTbUUbUVbUWbUWbUWbUWbUWbYobUYbTkbTlbUZbVabVbbVcbTkbTlbVdbVeaUvaUvbVfbVgbdvaUvbvPaToahybMkbVibVjbVkbVlbVmbVnbVobVpbVqbVrbVsdGSbKNbKNbKSbKSbKSbKSbKSbTJbVtbVubVvbVwbVxbVybVzbVAbVBbVCbSpbVDbVEbVFbVGbVGbVHbSqbVIbVJbSubVKbVLbVMbSuaahaahbSxbVNcAhbSxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbLkbLlbVPbVQbVRbVSbVTbLmbLkahyaahaahaahaahbtHbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbVUbVVbVWbVXbVYbVZbWabWbbWcbWdbWebWfbWgbWhbWibWibWjbWkbUEcNkcIgcNkdHrdHrcNkdHscNkdHtcNkbUEahyahybKdbWobcnaZzbamahybWpbWqbULbWrbWsbWsbWtbWubUGbWvbWwbUPbWxbWybWzbWAbWBbWCbWDbWEbNCaahaZdbWFanEbWHbWIbWJclZbWLbWKbTwbWKbWLbWKbWJbTlbTkbWNdBObVabWPbTlbTkbWQbURbPObPPaTobHCblDbHCaToaToahybMkbWRbWSbMkbWRbWSbMkbMkbMkbYAbWUbWVbCAbKNaahaahaahaahaahaahbTJbWXbWYbWZbTNbXabXbbTQbXcbXdbXebSpbXfbXgbXhcccbXjbXkbSqbXlbXmbXnbXobXpbSubSuaahaahbSxbXqbXrbSxbSxaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahahyahybXsbXtbXubXvbXsahyahyahyaahaahaahaahbtHbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbXwbXxbXybXzbXAbXBbXCbXDbXEbXFbXGbXHbXIbXJbXKbXLbXMbXNbUEbUybUzbUAbUBbUBbUybUzbUybUCanGbUEahyahybKdbXVbhqbXWbamahybXXbXYbXZbYabYbbYcbYdbYebYfbYgbYhbYibYjbYjbYkcqEbYmbYnbYnbTYbNCaahaZdbYpaZdbYqbTkbTlbWJbYrbWJbYrbWJbYrbWJbYsbTkbTlbUZbYtbVbbVcbTkbTlcgwbURahyahyaTobYvbetbYwaToahyahyahyahyahyahyahyahyahyahybKNbKNbYxbYybKNbKNaahaahaahaahaahaahbTJbTJbTJbTJbTJbYzciWbSpbSpbSpbSpbSpbSqbSqbSqbSqbSqbSqbSqbYBbYCbSubSubSubSuaahaahaahbSxbYDbVObYEbSxaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahybYFbYGbYHbYIbYFahyahyahyaahaahaahaahbtHbYJbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbYKbYLbYMbYNbYObYPbXMbYQbYRbYSbYTbYUbYRbYQbXMbXMbXMbYVbUEbWlbWmbWlbWnbUBbWlbWmbWlbUCanGbUEahyahyanHbecbDMbZbbamahybZcbZdbZebZfbZgbZhbZibZjbUGbWvbZkbZlbZmbZnbZobZpbZqbZrbZsbZtbNCaahaZdbYpaZdaZdbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkbTlbZvbTjbZwbTlbTkbTjbZybZxahybJeaUvbetaUvbJeahyahyahyahyahyahyahyahyahyahyahybZzbZAbZBbZzbeubeubeubeubeubeuaahbZCbZDbZEbZFbZGbTObTPbZHbZIbZJbZKbZLaahaahaahaahaahaahbZMbZNbZObZPbZQbZMaahaahaahaahbSxbZRbZSbZTbSxaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahybZUbZVbZWbZUbZUahyahyaahaahaahaahaahbZXbZYbZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbZZcaacabcacbSEcadcaecaecaecafcagcahcaicaecaecaecajcakbUEbXObUBbUBbXPbXQbXRbXRbXRbXSdHwbUEahyahyanIbecbcnaZzdHyahycaocapbZecaqcarcarcasbULbUGbWvcatcaucavcavcawcaxcaybYnbYncazbNCaahaZdbYpanJaZdcaAbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkcaCcaDcaEcaFcaGcaHcaIahyahybrGaUvbetcaJbrGahyahyahyahyahyahyahyahyahyahyahycaKcaLcaMcaNbeubZMbZMbZMbZMbeuaahbZCcaOcaPcaQcaRcaScaTcaUcaVcaWcaXbZLaahaahaahaahaahaahbZMcaYcaZbJTcbbbZMaahaahaahaahcbccbdcbecbfcbcaahahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahycbgcbhcbicbjcbgahyahyaahaahaahaahaahbZXbZYbZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEcbkcblcbmcbnbSEbNZcbpcbqcbrcbscbtcbucbvcbwcbxcbycbzcbAbUEbWlbWmbWlbYWbUBbWlbWmbWlbYXdHzbUEbYZbZabeeccHdHAdHBbeeahybUGcbJcbKcbLcbMbULcbNbUGcbOcbPcbQcbObNCcbRcbScbTcbUcbVcbWcbXbNCaahaZdbYpaZGaZdanSbTkbTlbTmbTnbTkbTlbTkcbZbTmbTlbTkbTlccabTnccbbTlbTkdBQcaIahyahybrGccdbgJaUvbrGahyahyahyahyahyahyahyahyahyahyahyccBccfccgcaNbeudGTcgndGUbZMbeuaahbZCcchcciccjbZGcckcclbZHccmccnccobZLaahaahaahaahaahaahbZMbZNbZMbZMbZMbZMaahaahaahaahcbcccpaEGccrccscctccuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahahyahybXsccvccwccxbXsahyahyaahaahaahbZXbZXbZXbZYbZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbSEccycczbSEbSEbSLbSLbSLbSLbSLccAbSLbSLbSLccEccCccDbSLbUEbUybUybUybUBbUBbUybUybUybYXcalcamcanbecbecbecbcnaZzbeeahybUGbUGbUGbUGbUGbUGbUGbUGccIccJccKccLbNCbNCccMbNCbNCbNCccNccObNCccPaZdccQaZdaZdcDsbTlbUZdBRbVbbVcccTccUbVbbVaccVccWbUZbVadBOccXbTkbTlcbYcaIahyahybrGaUvbetaUvbvNahyahyahyahyahyahyahyahyahyahyahyccBccYccZcaNbeucgncgndGWbZMbeuaahbZCbZCbZCbZCbZCcdacdbbZLbZLbZLbZLbZLaahaahaahaahaahaahbZMbZNbZMaahaahaahaahaahaahaahcbccdccddcdecdfcdgcdhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahahyahybYFcdiccwcdjbYFahyahyaahaahaahbZXcdkcdlcdmbZXbZXbZXbZXaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbSEbSEbSEaahaahaahaahbZXcdncdobZXahyahyahyahyahyahybUEcbBcbCbUBbUBbUBbUBcbDbUBcbEcbFcamcancbGcbHbecbcnaZzcbOcbOcbOcbOcdpcdqcdrcdscdtbFpcdvcdwcdxcdycdzcdAcdBcdCcdDcbOcbOcbOcbOcbOcdEcdFcdGbURbURaouccUbVbbYtccVaovbUZbYtdBObVccdIccUcdJcdKcdLcdMcdNcdOcdSahyahybrGcdQbetcdRaTocaNahyahyahyahyahyahyahyahyahyahycelcdTcdUcaNbeudGYdGXdGZbZMbeuaahaahaahaahaahbZMcdVcdWbZMaahaahaahaahaahaahaahaahaahaahbZMbZNbZMaahaahcbccbccbccbccbccbccdXcdXcbccbccbccbcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahbZUbVSbVQbZUcdYccwcdZbZUbVSbVQbZUbZUbZXbZXceacebceccedceecefbZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZXcegcehceiceiceiceiceiahyahybUEbUEbUEcdPccFccFccGbUEbUEbUEbUEbUEbYZbZabeecejbjSaZzcekceLcemcbOcenceocepceocencencenccJccKcencencencdBceqcercescbOcetceLceucevcewcexceycezceAceBceCceDceAceEceAceFceCceBceGceBceCceHceIbTkbTlceJbURahyahybvNaUvbetaUvceKcaNcgqceMceMceMceMceMceMceMceMceNcaNceOcePcaNbZMdHabZMbZMaTWbeuaahaahaahbZMbZMbZMceQceRbZMaahaahaahaahaahaahaahaahaahbZMbZMbZNbZMaahaahcbcceSceTceTceTceTceUceUceVceTceTceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbZUceXceYceXceZcfacfbcfccfdcfecffcfgcfhcficfjcfkcflcfmcfncfobZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZXcfpcfqcfrcfscftcfuceiahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahybbocfvcfwcfxcfycfzcfAcfBcfCcfDcfEcfFcfFcfFcfFcfGcfHcfFcfFcfFcfIcfJcfDcfKcfLcfMcfNcfOcfPcfQcfRcfSbTpcfTbTlbTkbTlbTkcfUbTkbTlbTkbTlcfVbTlbTkcfWbTkbTlbTkcfXbZyahyahyaTocfYbyncfZaVlcgacgbcgbcgbcgccgbcgbcgdcgbcgbcgbcgbcgecgfcggbZMdGYcgicgnbZMbZMbZMbZMbZMbZMcgjcgkcglcgmbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMdHbbZNbZMaahaahcbccgocgpcgTcgrcgscgtcgucgvcqbcgxceTceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahbZUcgycgzcgAccwcgBccwccwcgCccwcgDbZUcgEcgFcgEcgGcgHcgIcgJbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXcgKcgLceicgMcgNcgOceiahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyaZycgPcgQcgRcgSchucgUcbOcgVcgWcgXcgYcgZchacgWcgWchbcgWchcchdchechfcgWchgcbOcgUchuchhchichjcevcevchkaowcdNcdMcdNchlchmcdMchncdMcdNchochpcdMchqchrchschtchLchvahyahybJechwchxbbQbbRchychzchzchzchAchzaoBchBchzchzchzchzchCchDchEchFchGchHchGchGchGchGchGchGchGchGchGchIchJchJchJchJchJchJchJchJchJchJchJchJchJchKbZMaahaahcbccgocgpciscgucgucgucgucgucgucguchMchNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahbZUchOchPchQchRchSchTchUccwchVchWbZUchXchYchZchYciacibciccidcidcidcidcidcidcidaoCcidcidcidcidcidcidcidcidcidcidcidcidciecifcidcidcigcihciicijcikcilceiahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahybamcimbcnbeccbOcbOcbOcbOcinciocipciqcirciwcitciucivciAaLTciycizciGciBciCcbOcbOcbOcbOciDcfQciEciFbURbURciXciHciHciHciHciHciHciHciHciHciHciHciHciIbURciXchvahyahyahybrGciJciKciLciKciMciNciNciOciNciNaoEciPciNciNciNciOciQciRciSbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMciTciUciVcqcbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMaahaahcbccgocgpcjAciYciZaMncjbcjccjdcjeceTcjfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahbZUchOchPchQchRchSchTchUccwchVchWbZUchXchYchZchYciacibciccidcidcidcidcidcidcidaoCcidcidcidcidcidcidcidcidcidcidcidcidciecifcidcidcigcihciicijcikcilceiahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahybamcimbcnbeccbOcbOcbOcbOcinciocipciqcirciwcitciucivciAcixciycizciGciBciCcbOcbOcbOcbOciDcfQciEciFbURbURciXciHciHciHciHciHciHciHciHciHciHciHciHciIbURciXchvahyahyahybrGciJciKciLciKciMciNciNciOciNciNaoEciPciNciNciNciOciQciRciSbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMciTciUciVcqcbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMaahaahcbccgocgpcjAciYciZcjacjbcjccjdcjeceTcjfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcjgcjgbZUbZUcjhcjicjjcgBcjkcjlcjlcjmbZUbZUcjnchYcjochYcjpcjqcjrcjsbZXbZXbZXaoFcjvcjvaoGcjvaoHapdbZXbZXbZXbZXbZXbZXbZXbZXbZXcjtcjucjvcjvcjwcjxcjyceiceiceiceiahyahycjzcjzcjzcjzcjzcjzcjzahyahyahyahyahyahyahybaicimbcnbeccjBahyahycbOcbOcbOcjHcjCcjDcjEcjDcjDcjFcjDcjEcjDcjCcjGcbOcbOcbOahyahyckhcjIcjJcjKciFaahaahahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahybvNaUvaUvcjLcjMcaNcgqceMceMceMapuapAapvceMceMceNcaNcaNcaNcaNbZMaahaahaahaahaahaahaahaahbZMbZMbZMciVbZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahcbccjNceTceTceTceTceTceTceVceTceTcjfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcjgcjgcjOaMCcjgbVScjQbVQcjRbVScjQbVQbZUchYapCcjTchYaMWchYcjVcjWcjXcjqaahaahamYamYamYamYapFamYamYamYamYaahaahaahaahaahaahaahbZXbZXcjucjYbZXcjZbYlbZXaahahyahyahyahycjzcjzckbckcckdckeckfcjzcjzahyahyahyahyahybbobbockgblnccHbbobboahyahyahyckEahyahyahyahyahyahyahyahyahyahyahyahyckEahyahyahyciFciFckicfQcfRciFciFaahaahaahahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyciFciFckjckjckkciFciFahyahyahyahyapGapAapGahyahyahyaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMciVbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahcbccbccbccbccbccbccbccbccbccbccbccbcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcjgcjgcklckmcknckockpckqckrckscktckuckvckwckxapHckzchYaMXchYckBckCckDcjqaahaahamYaqwapIapRapQapSanCaqwamYaahaahaahaahaahaahaahaahbZXcjubZXbZXbZXbZXbZXahyahyckKckFckFckGckHckIckIckIckIckIckIcjzahyahyahyahybbobbodETcimbcnbecbDObboclmckLckMciFclmckLckLckLckLckLckLckLckLckLckLckMciFclmckLckMciFckNckOckPcfRckQciFciFciFciFciFclmckLckLckLckLckLckLckLckLckLckLckRciFclmckLckRciFckScfRcfRckTckUciFciFahyahOahOahOapXahOahOahOaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMciVbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcjgckVckmcknckWckXckYckZclaclbchVclccldclecleclfclgclhaMWchYclicljclkcjqaahaahamYaqwaoDaoDaqlaqnaqmaucamYaahaahaahaahaahaahaahaahbZXcjubZXaahaahaahaahahyahyclYclncloclpclqclrclscltcluclvclwcjzahyahyahyahyaZycrkbecclyclzclAclAclBclCclCclCclDclCclEclCclCclFcfRcfRcfRcfRclGclHclIclJclIclIclIclKclLclMclNclIclIclKclIclOclIclPclIclQclIclIclIclIclIclQclRclIclSclIclTclIclQclIclKclIclUclUclVclWbKGcmpahyahOaqoaieaqsaqpaqtahOaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMciVbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcjgcsTcknckncmacmbcmcbZUbZUcmdbZUbZUchYcmeclecmfcmgcmhaMYchYcjqcjqcjqcjqaahaahamYaqvaoDaqwaqxaqwaoDaqyamYcmjcmjcmjcmjaahaahaahbZXbZXcjubZXdEldEldEldElahyahycmRcmqcmrcmscmtcmtcmucmvcmwcmtcmxcjzahyahyahyahybambisbeccimcsUbecbeccmzcfRcfRcfRcfRcmAcmBcmBcmBcmCcmDcmDcmDcmEcmDcmFcmDcmGcmDcmDcsVcmHcmIcmJcmKcmDcmDcmHcsZcmDcmDcmLcmDcmDcmDcmMcmDcmDcmDcmDcmGcmDcmDcmDcmEcmDcmDcmDcmHcmNcmBctacmOcmPcmQcncahyahOaieaieaqzaieaqAahOaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMbZMciVbZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcjgcmScmTcmUcmVcmWcjgcmXbObcmZcnacnbcnScndcnecnfcngcnhaMYchYaahaahaahaahaahaahamYartaoDaqwaqBaqwaoDanFamYcnicnjcnkcmjaahaahaahbZXcnocjubZXbWTckJaMZdEldElahyclYcnpcnqcnrcnsckIcntcnucnvckIcnwcjzahyahyahyahybaibjQbeccimbDMbDNbeccmzcfRcnxcfRcnycnzcnAcnBcfRcnCcnxcfRcfRcnDcnxcnEcfRcnFcfRcnxcfRcjKcnGchicnHcevcevcnIcevcnJcevcnKcnMcevcnLcxCcevcnJcevcevcevcevcnJcevcnNcevcevcevcnIcnOcnQcnPcnRcfRbKGcodahyahOaqDaqCaqZaqEaraahOaahaahaahaahaahaahbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMcnTciVcgnbZMbZMbZMbZMbZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbLjaahaahcjgcnUckXcnVcnWcnXcnYcnZcoacobcoacoccoocoecleclecofchYaNachYaahaahaahaahaahaahamYanBarbardarcaoDaoDaqwamYcogcohcoicmjaahaahaahbZXconcjubZXclxcrlcmycrqdElahycowckFckFcopcoqckIckIcorckIckIcoscjzahyahyahyahybbobbocotcimbcnbeccoAbboclmckLckMciFclmckMciFcovcoGcoxcoycozcoScoxcoBcovciFclmckLckMciFcoCckicoDcmBcoEciFclmckLckMciFciFclmckLckMczAclmckLckMciFciFdCQckMciFclmckLckMciFcoFckickicfRcoXciFciFaahahOareaiearfaieargahOaahaahaahaahaahbZMbZMcoHcoIcoJcoJcoJcoJcoJcoJcoJcoJcoKcoLcoLcoLcoMcoNcoObZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadbLjaahaahcjgaNbckncoQcmacoRcpqcoTcoUcoVcoacoWcpPcoYcoZcpacpbchYcpcchYaahaahaahaahaahaahamYariarharkarjarmarlarnamYcpdcohcpecmjaahaahaahcpjbZXarqbZXcpjcvVcrrcvWdElahyahyahyahycjzcplcpmcpncpocppcpTcprcjzahyahyahyahyahybbobbocpscptcmzbbobboahyahyahyahyahyahycovawtcpvcpwcpxcpycpzcpAcpBawucovahyahyahyciFciFcpDcpEckjciFciFahyahyahyczZcEVcEVcEVcEvcEvcEvcEVcEVcEWczZahyahyahyahyahyahyciFciFcjIcjIcjKciFciFaahaahahOahOaiaarraidahOahOaahaahaahaahaahbZMcpFcpGcpHbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMcpIcoMcpJbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcjgcjgcjOcjPcjgbVScjQbVQcjRbVScjQbVQbZUchYapCcjTchYcjUchYcjVcjWcjXcjqaahaahamYamYamYamYapFamYamYamYamYaahaahaahaahaahaahaahbZXbZXcjucjYbZXcjZbYlbZXaahahyahyahyahycjzcjzckbckcckdckeckfcjzcjzahyahyahyahyahybbobbockgblnccHbbobboahyahyahyckEahyahyahyahyahyahyahyahyahyahyahyahyckEahyahyahyciFciFckicfQcfRciFciFaahaahaahahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyciFciFckjckjckkciFciFahyahyahyahyapGapAapGahyahyahyaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMciVbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahcbccbccbccbccbccbccbccbccbccbccbccbcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcjgcjgcklckmcknckockpckqckrckscktckuckvckwckxapHckzchYckAchYckBckCckDcjqaahaahamYaqwapIapRapQapSanCaqwamYaahaahaahaahaahaahaahaahbZXcjubZXbZXbZXbZXbZXahyahyckKckFckFckGckHckIckIckIckIckIckIcjzahyahyahyahybbobbodETcimbcnbecbDObboclmckLckMciFclmckLckLckLckLckLckLckLckLckLckLckMciFclmckLckMciFckNckOckPcfRckQciFciFciFciFciFclmckLckLckLckLckLckLckLckLckLckLckRciFclmckLckRciFckScfRcfRckTckUciFciFahyahOahOahOapXahOahOahOaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMciVbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcjgckVckmcknckWckXckYckZclaclbchVclccldclecleclfclgclhcjUchYclicljclkcjqaahaahamYaqwaoDaoDaqlaqnaqmaucamYaahaahaahaahaahaahaahaahbZXcjubZXaahaahaahaahahyahyclYclncloclpclqclrclscltcluclvclwcjzahyahyahyahyaZycrkbecclyclzclAclAclBclCclCclCclDclCclEclCclCclFcfRcfRcfRcfRclGclHclIclJclIclIclIclKclLclMclNclIclIclKclIclOclIclPclIclQclIclIclIclIclIclQclRclIclSclIclTclIclQclIclKclIclUclUclVclWbKGcmpahyahOaqoaieaqsaqpaqtahOaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMciVbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcjgcsTcknckncmacmbcmcbZUbZUcmdbZUbZUchYcmeclecmfcmgcmhcmichYcjqcjqcjqcjqaahaahamYaqvaoDaqwaqxaqwaoDaqyamYcmjcmjcmjcmjaahaahaahbZXbZXcjubZXdEldEldEldElahyahycmRcmqcmrcmscmtcmtcmucmvcmwcmtcmxcjzahyahyahyahybambisbeccimcsUbecbeccmzcfRcfRcfRcfRcmAcmBcmBcmBcmCcmDcmDcmDcmEcmDcmFcmDcmGcmDcmDcsVcmHcmIcmJcmKcmDcmDcmHcsZcmDcmDcmLcmDcmDcmDcmMcmDcmDcmDcmDcmGcmDcmDcmDcmEcmDcmDcmDcmHcmNcmBctacmOcmPcmQcncahyahOaieaieaqzaieaqAahOaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMbZMciVbZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcjgcmScmTcmUcmVcmWcjgcmXbObcmZcnacnbcnScndcnecnfcngcnhcmichYaahaahaahaahaahaahamYartaoDaqwaqBaqwaoDanFamYcnicnjcnkcmjaahaahaahbZXcnocjubZXbWTckJccqdEldElahyclYcnpcnqcnrcnsckIcntcnucnvckIcnwcjzahyahyahyahybaibjQbeccimbDMbDNbeccmzcfRcnxcfRcnycnzcnAcnBcfRcnCcnxcfRcfRcnDcnxcnEcfRcnFcfRcnxcfRcjKcnGchicnHcevcevcnIcevcnJcevcnKcnMcevcnLcxCcevcnJcevcevcevcevcnJcevcnNcevcevcevcnIcnOcnQcnPcnRcfRbKGcodahyahOaqDaqCaqZaqEaraahOaahaahaahaahaahaahbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMcnTciVcgnbZMbZMbZMbZMbZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbLjaahaahcjgcnUckXcnVcnWcnXcnYcnZcoacobcoacoccoocoecleclecofchYbRKchYaahaahaahaahaahaahamYanBarbardarcaoDaoDaqwamYcogcohcoicmjaahaahaahbZXconcjubZXclxcrlcmycrqdElahycowckFckFcopcoqckIckIcorckIckIcoscjzahyahyahyahybbobbocotcimbcnbeccoAbboclmckLckMciFclmckMciFcovcoGcoxcoycozcoScoxcoBcovciFclmckLckMciFcoCckicoDcmBcoEciFclmckLckMciFciFclmckLckMczAclmckLckMciFciFdCQckMciFclmckLckMciFcoFckickicfRcoXciFciFaahahOareaiearfaieargahOaahaahaahaahaahbZMbZMcoHcoIcoJcoJcoJcoJcoJcoJcoJcoJcoKcoLcoLcoLcoMcoNcoObZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadbLjaahaahcjgcoPckncoQcmacoRcpqcoTcoUcoVcoacoWcpPcoYcoZcpacpbchYcpcchYaahaahaahaahaahaahamYariarharkarjarmarlarnamYcpdcohcpecmjaahaahaahcpjbZXarqbZXcpjcvVcrrcvWdElahyahyahyahycjzcplcpmcpncpocppcpTcprcjzahyahyahyahyahybbobbocpscptcmzbbobboahyahyahyahyahyahycovawtcpvcpwcpxcpycpzcpAcpBawucovahyahyahyciFciFcpDcpEckjciFciFahyahyahyczZcEVcEVcEVcEvcEvcEvcEVcEVcEWczZahyahyahyahyahyahyciFciFcjIcjIcjKciFciFaahaahahOahOaiaarraidahOahOaahaahaahaahaahbZMcpFcpGcpHbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMcpIcoMcpJbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaahaahaahcjgcpKcpLcpMcpNcpOcqecpQcoacpRcoacpSchYcqzcpUcqzcpVcpWchZchYcpXcpXcpXcpXcpXcpXamYamYarsauQaruauRarvamYamYcmjcpYcmjcmjcpXcpXcpjcpjcFucFrcqdcpjdElcxWcyjdElcrIcqfcqfcqgcjzcjzcjzcjzcqhcjzcjzcjzcjzcrIcqfcqfcqfcqgcpjcqicqjcqkcqlcqmcpjcpjahyahyahyahyahycovcqncqocqpcqqcqrcqscrJcpBcqucovahyahyahyahycqvcqwcqxcqycqvahyahyahyahyczZcuIarwcxUcEvcEvcEVcEVcEVcIFczZahyahyahyahyahyahyahycrNckicqAcqBciFaahaahaahaahahOahOahOahOahOaahaahaahaahaahaahbZMcqCcgnbZMbZMaahaahaahaahaahaahaahaahaahaahaahbZMbZMcgncqDbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaahaahaahcjgctxckncqFcqGcqHcqIcqJcqJcqKcqLcqMcqNcqOcqOcqPcqQcqRcqScqTcqUcqVcqWcqXcqYcqYcqZcqOarxcracqYcqYcqYcqYarycqOcrdarzcrfcrgcrhcricrjcMIcMjcrmcrncrocOZcrudBNcrscrtcrucrucrvcrucricrwcrxcrycrzcrAcrBcrAcrCcrAcrDcrAcrzcrAcrEcrFcrGcrucrHcrRahyahyahyahyahycrWcqtcrKcrLcrLcrMcrLcrLcpBcqtcrWahyahyahyahycsKcrOcrPcqycsKahyahyahyahycIHcEVcEVcEVcEVcEVcEVcEVcEVcJKcrQcrQcrQcsLcrScrTcrUcrQcrQctccsNctccrQcrQcrQcrQaahaahaahaahaahaahaahcrXcrXcrXcrXcrXbZMcrYcrZcrZcrZcrZcrZaahaahaahaahaahaahaahcsacsacsacsacsacsbbZMcsccsccsccsccscaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaahaahcjgcsdcknckncsecsfcsgcshcshcsicshcsjcskcslcsmcsncsncsncsocspcsqcsrcsqcsqcsqcsscsqcsqcsqcstcsqcsqcsqcsscsqcsqcsqcstcsqcsqcsucsvcswcsxcsycswcswcsvdBPcswcswcszcsAcsBcrucrucrucricrucsCcswcsDcswcsEcswcswcswcsFcswcsvcswcsGcsHcsIcrucsJcsRahyahyahyahyahyctmcqtcrKcrLcsMcsMcsMcrLcpBcqtctmahyahyahyctucsOcrOcsPcsQcumcsSahyahyahycMYcEVcEVcDncEVcEVcEVcEVcFecrQcrQcwtctdcsXcwtcwvcsXcsYcwwctbcsYctbctecxOcwxcrQcrQaahaahcrXcrXcrXcrXcrXctfctgcthcrXctictjcrZctkctlcurcrZcrZcrZcrZcrZcsacsacsacsactnctoctpcsactqctrcscctscttcuTcsccsccsccsccscaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaabLjbLjcjgctvctwcALctycmacjgbRMctActBctCctDctEctFctGctHcrfcrfcrfctIctJctKcrfctLctMctNcrfctFctOcrfcrfctPctQctRctSctTctQctQctUctVctWcrocrpctXctYctZcuacubdCbcuadCfcuacuccudcuacuacuacubcuecufcuacubcuacugcuacuhcuicuacuacubcuacujcrucukcruculcuYahyahyahyahyahyctmcuncuocrLcsMcupcsMcrLcuqcunctmahyahyahycvacqycrOcrPcqycqycvaahyahyahycMYcJacEVcLvcEVcQdcEVcEVcEVcrQcxScsYcwrcwscwscwscwscwscwsczmczlczoczncPbcPbcBjcrQaahaahcrXcuucuvcuucrXcNfcuxdGMcrXcuzcuAcrZcuNcuCcuDcrZcuEcuFcuEcrZcuGcuHcuGcsacOScuJdHccsacuLcuMcsccwEcuOcuPcsccuQcuRcuQcscaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadcuScuScvgcuUcuScuVcuWcuScuScuScuXcvocuZcuXcvrcvbcuXcvccvdcvecvfcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpjcvNcvhcrFcvicvjcpjcpjcpjcpjcrIcqfcqfcqfcqfcqgcpjbRRcvlcqdcpjcrIcqfcqgcpjcrIcqfcqgcpjcvmcrucrucrGcvncpjcpjahyahyahyahyahycwjcvpcuocrLcrLcrLcrLcrLcuqcvqcwjahyahyahycqvcwqcrOcrPcqycvscqvahyahyahycRUcWRcEVcEVcEVcEVcEVcEVcWRcrQcBkcsYcsYcsYcvucvucvucvucvuctbcDpcwzcsYcsYcsYcducrQaahaahcrXcvwcvxcvwcrXcrXcvycrXcrXcwFcwGcrZcrZcvBcrZcrZcvCcvDcvCcrZcvEcvFcvEcsacsacvGcsacsacvHcvIcsccsccvJcsccsccvKcvLcvKcscaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacxfcvOcvPcvQcvRcvScvTcvUdEKdEJcvXcvYcvZcwacwbcwccuXcpXcpXcpXcpXcpXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahcpjcwdcwecwfcwgcwdcpjdELdELdELahyahyahyahyahyahycpjcwhcwicwhcpjahyahyahyahyahyahyahycxAcqicqicqicwkcqicxAahyahyahyahyahyahycovcuncwlcwmcwncwocuncuncuqcwpcovahyahyahycsKcqycrOcrPcqycqycsKahyahyahyczZcPicEVcEVcEvcPocEVcEVcEVcrQcvucvucsYcsYcBicDqdBUcxPbdUctbcxRcsYcFdcFdcFdcFdcrQaahaahcrXcwBcwCcwDcPvcwDcwJcwHcwLcwKcwUcwTcwXcwVcwMcwNcwMcwOcwPcrZcwQcwRcwScPBcwScyacyecybcyqcyfcwYcwZcxacxbcxccxbcxdcxecscaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacxNcxgcxgcxgcxgcvScvTcxhcxhcxicuXcxjcxkcxlcxmcxncuXcxocxpcxqcxraahaahaahaahaahcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxscxtcxucxvcxwcwhcwhcwhcwhcwhcwhcwhcwhcwhcwhcwhcxxcxycwhahyahyahyahyahyahyahyahycxzcyBcxBczkcxDcyBcxzahyahyahyahyahyahycovcovdHdcxFcxGcxHcxIcxJdHecovcovahyahyahycumcsScxLcxMcqyctucsOahyahyahyczZczZcEVcTdcQncUncEVcEVddacrQcEFcxPcsYcsYcxQcxQcxQcxQcxQctbcxRcsYcFdcFdcFdcFbcrQaahaahcrXcxVdEMcxXcxYaNScytcyrcrXcyccydcrZcAkcyuaOpcyhcyidENcykcrZcyldEPcyncyoaOrcAqcAucsacyscAxcBocBncyvaOscyxcyydEQcyAcscaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacxNcxgcxgcxgcxgcvScvTcxhcxhcxicuXcxjcxkcxlcxmcxncuXcxocxpcxqcxraahaahaahaahaahcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxscxtcxucxvcxwcwhcwhcwhcwhcwhcwhcwhcwhcwhcwhcwhcxxcxycwhahyahyahyahyahyahyahyahycxzcyBcxBczkcxDcyBcxzahyahyahyahyahyahycovcovdHdcxFcxGcxHcxIcxJdHecovcovahyahyahycumcsScxLcxMcqyctucsOahyahyahyczZczZcEVcTdcQncUncEVcEVddacrQcEFcxPcsYcsYcxQcxQcxQcxQcxQctbcxRcsYcFdcFdcFdcFbcrQaahaahcrXcxVdEMcxXcxYcxZcytcyrcrXcyccydcrZcAkcyucygcyhcyidENcykcrZcyldEPcyncyocypcAqcAucsacyscAxcBocBncyvcywcyxcyydEQcyAcscaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMczTcyCcyDcyEcyFcxgcxgcvScyGcyHcyIcyJcyKcyLcyMaGXcyOcyPcuXcxqcxqcxqcxrcxrcxrcxrcxrcxrcxrcyQcyRcyScyScyScyScyScyScyScyScyScyScyScyTcyScyUcyVcyWcyXcyYcyVcyZczaczbczaczaczaczaczaczaczaczaczaczccwhahyahyahyahyahycxzcxzcxzcxzczdczebTgczgczhcxzcxzcxzcxzahyahyahyahycovcovcovcziczjczicovcovcovahyahyahyahyahycvacrOcrPcqycvaahyahyahyahyahyczZczZczZczZddeczZczZczZcrQcxQcxQcDocwycwycwycFccHvcHrcJzcHxcsYcFdcFdcFdcFdcrQaahaahcrXcrXcrXcrXcrXcrXcBqcrXcrXczpcuAcrZcrZcBrcrZcrZcrZcrZcrZcrZcsacsacsacsacsacBucsacsacuLcBvcsccsccsccsccsccsccsccsccscaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaOuaOtaOuaOtcztczuczvczwczxczyczzcxgcArczBczCczDczEcuXcuXczFczGczGczGczGczGczGczGczGczGczGczHcxqcxrcxrcxrcxrcxrczIczIczJcxrcOHczKcxqcxrczLczMczNczOczPcwhczQczQddgddmddkczQczQcwhcwhcwhcwhczRcwhahyahyahyahyahycxzczSczScABczUczVczWczXczYcAIcAacAacxzaahahyahyahyahyaahaahczicAbcziaahaahaahahyahyahyahyahycqvcAccAdcAecqvahyahyahyahyahyahyahyahycBgcWQcBgahyaahcrQcJNcxTcKMcxTcxTcFacFacKNcxTcxTcMecDrcFdcFdcFdcmYcrQaahaahaahaahaahaahcAicAjcBxcAlcAicAmcAncAocApcCccBbcAoaahaahaahaahaahaahaahcAscAtcClcAvcAscAwcCmcAycAzcAAcBAcAyaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMczrczsczrczscztczuczvczwczxczyczzcxgcArczBczCczDczEcuXcuXczFczGczGczGczGczGczGczGczGczGczGczHcxqcxrcxrcxrcxrcxrczIczIczJcxrcOHczKcxqcxrczLczMczNczOczPcwhczQczQddgddmddkczQczQcwhcwhcwhcwhczRcwhahyahyahyahyahycxzczSczScABczUczVczWczXczYcAIcAacAacxzaahahyahyahyahyaahaahczicAbcziaahaahaahahyahyahyahyahycqvcAccAdcAecqvahyahyahyahyahyahyahyahycBgcWQcBgahyaahcrQcJNcxTcKMcxTcxTcFacFacKNcxTcxTcMecDrcFdcFdcFdcmYcrQaahaahaahaahaahaahcAicAjcBxcAlcAicAmcAncAocApcCccBbcAoaahaahaahaahaahaahaahcAscAtcClcAvcAscAwcCmcAycAzcAAcBAcAyaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcACcADcACcAEcAFcxgcxgcvScvTcAGczzcAHcBTcAJcAKcMdbWMcuXcxqcANcxqcxqcxrcxrcxrcxrcxrcxrcxrcxrcAOcxrcxraahaahaahcxrcAPcAPcAPcxrcxrcxrcxrcwdcwdcAQcARcAScwdcwdcwhcwhcwhcwhcwhczQcwhcwhaahaahcwhczRcwhaahahyahyahyahycxzcATczecAUcAVczeczeczgcAWcAXczecAYcxzaahahyahyaahaahaahaahczicAZcziaahaahaahcBacCScBccBacqvcqvcBdcBecBfcqvcBgcBgcBgcBgcBgahyahyahycBgcWQcBgaahaahcrQcvucvucMXcGzcGAcGAcGAcNJcGAcGzcNMcsYcNVcNVcNWcNXcrQaahaahcAicAicAicAicAicBmcDydHfcAiczpcBpcAocDDcDCcBscAocAocAocAocAocAscAscAscAscBtcDMdHgcAscBwcBvcAycFkcBycBzcAycAycAycAycAyaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcEBcyCcBBcBCcxgcxgcxgcBDcvTcAGczzcBEcuXcvrcvbcuXcuXcuXcxrcANcBFcxrcxraahaahaahaahaahaahcxrcBGcBHcxraahaahaahcBIcBIcBJcBIcBIaahaahaahaahcwdcBKcxucxvcwdaahaahaahaahaahcwhczQcwhaahaahaahcwhczRcwhaahaahaahahyahycxzcxzcxzcxzcBLcBMcBNcBOcbocxzcxzcxzcxzaahaahaahaahaahaahaahczicAbczicziczicBacBacymcBRcBacBScEIcrOcrPcqycBUcBgcBVcBWcBXcBgcBgahyahycBgcWQcBgaTWaahcrQcNRcxPcMXcGzcHscHtcHucNUdFccGzcNMcsYcPccPccPccOVcrQaahaahcAicBZcCacCbcAicAicFlcAicAicCdcvAcAocFmcCecAocAocCfcCgcChcAocCicCjcCkcAscAscFncAscAscvHcFycAycAycCncAycAycCocCpcCqcAyaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcACcADcACcCrcyFcxgcxgcvScvTcAGczzcCscCtcCucCvcCwcCxcCycCzcCAcxrcxraahaahaahaahaahaahaahcxrcCBcCCcxrcxraahaahcBIcBQcCEcCDcBIcCGcCGcCGaahcwdcCHcCIcCJcCKcCKcCKcCKcCKcCKcCKcCLcCKcCKaahahycwhczRcwhaahaahaahaahahycxzcCMcCNcABcCOczVcCPcCQcCRcEKcCTcCUcxzaahaahaahaahaahaahaahczicCVcCWcCXcCXcCYcCZcDacDbcDccDdcDecDfcDgcDhcDicBgcDjcDkcDlcDmcBgcBgcBgcBgcWQcQzcBgcBgcrQclXcxQcMXcGzcHscHtcIGcOYcHwcGzcNMcsYcQHcQHdERcPacrQaahaahcAicDtcDucDvcDwcDvcFAcFzcDzcDAcwIcDBcHFcHAcDEcDFcDEcDGcDHcAocDIcDJcDKcDLcDKcHGcHKcDOcwWcHNcDPcDQcDRcDScDTcDScDUcDVcAyaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaPvaPeaPvaPDcDZcEacEbcEccEdcEeczzcEfcCtcEgcEhcEicEjcEkcCtcxrcxraahaahaahaahaahaahaahaahcxrcElcEmcxqcxraahaahcBIcBQcCEcCDcBIcEncEocCGcCGcwdcEpcEqcErcCKcEscEtcEuddpcEwcEwcEwcExcCKahyahycwhczRcwhaahaahaahaahaahcxzcATczecEycAVczecEzczgcEAcFHczeczecxzaahaahaahaahaahaahaahczicECcEDcEEcEDcBaaQzcEGcEHcFXcEJcGfcELcEMcENcEOcEPcEQcERcERcEScETcEUcEUcQecZMcEXcQfcEYcEZcxTcxTcQgcQhcHscJLcJMcQFcHwcGzcNMcQIcQGcQGcQGcQGcQGaahaahcAicFfdEScFhcFiaQZcIKcIJcAicyccydcAocIPcILaRlcFpcFqdEUcFscAocFtdEVcFvcFwaRycIQcIRcAscyscAxcKacJRcFBaRNcFDcFEdEWcFGcAyaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcGjcFIcFJaSscDZcxgcxgcvScFLcyHcFMcFNcFOcFPcFQcFRcFScFTcCtaahaahaahaahaahaahaahaahaahaahcxrcElcFUcxqcxraahaahcBIcCFcCEcCDcBIcFWcGpcFYcFZcwdcGacGbcGccCKcGdcGecEwcEwcEwcEwcEwcEwcCKahyahycwhczRcwhaahaahaahaahaahcxzcxzcxzcxzcGqczecGgcGhcOIcGBczecGkcxzaahaahaahaahaahaahaahczicECcGlcziczicBacGmcGncGocGScEJcHccGrcrPcqycGscBgcGtcGucGvcGwcBgcBgcBgcGxcXdcERcERddqcrQcrQcrQcrQcrQcKJcKKcKLdhfcHwcGzcNMcQGcQGdkBdkBdlCcQGaahaahcAicAicAicAicAicAicKbcAicAiczpcuAcAocAocFmcAocAocAocAocAocAocAscAscAscAscAscKScAscAscuLcBvcAycAycAycAycAycAycAycAycAyaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacHHaSNcGDcGEcGEcGFcGGcGGcGGcGGcGHcGIcGIcGJcGKcGLcCtbkQbkQahyahyahybkQbkQaahaahaahcxrcGMcGNcxrcxraahaahcBIcFgcGPcFFcBIcGRcHRcCGcCGcwdcGTcCIcGUcGVcGWcGWcGWcGXcGXcGXcGXcGYcCKahyahycwhczRcwhaahaahaahaahaahcxzcGZczecABcHaczVcCPcCQcHbcHSczecGkcxzaahaahaahaahaahaahaahczicAbczicziaahcBacHdcHedmEcHgcHfcHccHicHjcHkcHlcHmcHncHocHmcHpcHmaahcBgcBgcHqcGxcGxdnjcOUdBScFVcMfcrQcrQcMgcMhdhfcHwcGzdBVdDhdDgdDjdDidDkcQGaahaahaahaahaahaahcHycHzcKTcHBcHycHCcHDcHEcKXcKWcIzcHEaahaahaahaahaahaahaahcHIcHJcLgcHLcHIcHMcLhcHOcHPcHQcJtcHOaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacJwaSNaPeaWEaPecHUcHVcxgcxgcHWcCtcHXcGKcHYcHZcIacCtbkQcIbcIccIccIccIcbkQaahaahaahcxrcIdcIecxraahaahaahcBIcBQcIfcGOcBIcIhcIicIjcIkcwdcIlcImcIncCKcGecIocGecEwcGecEwcEwcEwcCKahyahycwhczRcwhaahaahaahaahaahcxzcIpczecIqcAVcIrcIscItcAWcIuczecGkcxzaahaahaahaahaahaahaahczicAbcziaahaahcBacIvcIwcHhcFXcIycKDcrOcrPcIAcDicHmcIBcICcIDcIEcHmaahaahcBgcHqcBgcOTdDlcNKcNTcNLcNNctzcNOcNPcNQdDmcNScNTdDncQGdDodDqdDpdDrcQGaahaahcHycHycHycHycHycIIcMpdHhcHyczpcuAcHEcMqcIMcINcHEcHEcHEcHEcHEcHIcHIcHIcHIcIOcMrdHicHIcuLcBvcHOcMtcIScITcHOcHOcHOcHOcHOaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcDWcDXcDWcDYcDZcEacEbcEccEdcEeczzcEfcCtcEgcEhcEicEjcEkcCtcxrcxraahaahaahaahaahaahaahaahcxrcElcEmcxqcxraahaahcBIcBQcCEcCDcBIcEncEocCGcCGcwdcEpcEqcErcCKcEscEtcEuddpcEwcEwcEwcExcCKahyahycwhczRcwhaahaahaahaahaahcxzcATczecEycAVczecEzczgcEAcFHczeczecxzaahaahaahaahaahaahaahczicECcEDcEEcEDcBackacEGcEHcFXcEJcGfcELcEMcENcEOcEPcEQcERcERcEScETcEUcEUcQecZMcEXcQfcEYcEZcxTcxTcQgcQhcHscJLcJMcQFcHwcGzcNMcQIcQGcQGcQGcQGcQGaahaahcAicFfdEScFhcFicFjcIKcIJcAicyccydcAocIPcILcFocFpcFqdEUcFscAocFtdEVcFvcFwcFxcIQcIRcAscyscAxcKacJRcFBcFCcFDcFEdEWcFGcAyaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcGjcFIcFJcFKcDZcxgcxgcvScFLcyHcFMcFNcFOcFPcFQcFRcFScFTcCtaahaahaahaahaahaahaahaahaahaahcxrcElcFUcxqcxraahaahcBIcCFcCEcCDcBIcFWcGpcFYcFZcwdcGacGbcGccCKcGdcGecEwcEwcEwcEwcEwcEwcCKahyahycwhczRcwhaahaahaahaahaahcxzcxzcxzcxzcGqczecGgcGhcOIcGBczecGkcxzaahaahaahaahaahaahaahczicECcGlcziczicBacGmcGncGocGScEJcHccGrcrPcqycGscBgcGtcGucGvcGwcBgcBgcBgcGxcXdcERcERddqcrQcrQcrQcrQcrQcKJcKKcKLdhfcHwcGzcNMcQGcQGdkBdkBdlCcQGaahaahcAicAicAicAicAicAicKbcAicAiczpcuAcAocAocFmcAocAocAocAocAocAocAscAscAscAscAscKScAscAscuLcBvcAycAycAycAycAycAycAycAycAyaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacHHcGCcGDcGEcGEcGFcGGcGGcGGcGGcGHcGIcGIcGJcGKcGLcCtbkQbkQahyahyahybkQbkQaahaahaahcxrcGMcGNcxrcxraahaahcBIcFgcGPcFFcBIcGRcHRcCGcCGcwdcGTcCIcGUcGVcGWcGWcGWcGXcGXcGXcGXcGYcCKahyahycwhczRcwhaahaahaahaahaahcxzcGZczecABcHaczVcCPcCQcHbcHSczecGkcxzaahaahaahaahaahaahaahczicAbczicziaahcBacHdcHedmEcHgcHfcHccHicHjcHkcHlcHmcHncHocHmcHpcHmaahcBgcBgcHqcGxcGxdnjcOUdBScFVcMfcrQcrQcMgcMhdhfcHwcGzdBVdDhdDgdDjdDidDkcQGaahaahaahaahaahaahcHycHzcKTcHBcHycHCcHDcHEcKXcKWcIzcHEaahaahaahaahaahaahaahcHIcHJcLgcHLcHIcHMcLhcHOcHPcHQcJtcHOaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacJwcGCcDXcHTcDXcHUcHVcxgcxgcHWcCtcHXcGKcHYcHZcIacCtbkQcIbcIccIccIccIcbkQaahaahaahcxrcIdcIecxraahaahaahcBIcBQcIfcGOcBIcIhcIicIjcIkcwdcIlcImcIncCKcGecIocGecEwcGecEwcEwcEwcCKahyahycwhczRcwhaahaahaahaahaahcxzcIpczecIqcAVcIrcIscItcAWcIuczecGkcxzaahaahaahaahaahaahaahczicAbcziaahaahcBacIvcIwcHhcFXcIycKDcrOcrPcIAcDicHmcIBcICcIDcIEcHmaahaahcBgcHqcBgcOTdDlcNKcNTcNLcNNctzcNOcNPcNQdDmcNScNTdDncQGdDodDqdDpdDrcQGaahaahcHycHycHycHycHycIIcMpdHhcHyczpcuAcHEcMqcIMcINcHEcHEcHEcHEcHEcHIcHIcHIcHIcIOcMrdHicHIcuLcBvcHOcMtcIScITcHOcHOcHOcHOcHOaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadcvMcvMcvMcvMcvMaadaadaadcuScuScuScuScuScuScuScIUcIVcIWcIXcIYcIZddOcJbcCtcCtahycIccJccJdcJccIcahyahyaahcJecJecJfcJgcJeaahaahaahcBIcBQcJhcJicJjcJkcJlcJmcJmcwdcJncJocJpcCKcJqcGecEwcEwcEwcEwcJrcExcCKahyahycwhczRcwhaahaahaahaahaahcxzcJsczecMLcJuczVcJvczXczYcNgczeczecxzaahaahaahaahaahaahaahczicAbcziaahaahcBacJxcJycIxcGScJAcJBcJCcJDcJEcJFcHmcJGcJHcJIcJJcHmaahaahcBgcGycBgcBgcBgcrQdFdcsYcOWdHjcrQcHtdDscOYdDtcsYdDucQGdDvcQGdDwcQGcQGaahaahcHycJOcJPcJQcHycHycMucHycHycJScvAcHEcMvcJTcHEcHEcJUcJVcJWcHEcJXcJYcJZcHIcHIcMwcHIcHIcvHcMxcHOcHOcKccHOcHOcKdcKecKfcHOaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaaaaadbkQaahaahaahaahaahcuScuScuScuScCtcCtcCtcCtcCtcCtaahahycIccJccJccJccIcahyahyaahcJecKgcKhcKicJecKjcKjcKjcBIcBIcKkcKlcBIcKmcKncKocKpcKqcKrcKscKtcKqcKucGedeccKvcEwcKwcKwcKwcCKahyahycwhczRcwhaahaahaahaahaahcxzcKxczecHScKyczecKzczgcKAcHScKBcKBcxzaahaahaahaahaahaahaahczicAbcziaahcKCcKCcNYcKEcKFcKCcKCcKCcKGcKHcKIcKCcKCcKCcKCcKCcKCcKCcKCaahcBgcHqcBgaahaahcrQcrQcQAcQBcQCcrQcQDcQEdDydDxcsYcsYcQGdDzcQGaWHcQGaahaahaahcHycKOcKPcKQcKRcKQcMzcMycKUcDAcwIcKVcMBcMAcKYcKZcKYcLacLbcHEcLccLdcLecLfcLecMCcMDcLicwWcHNcLjcLkcLlcLmcLncLmcLocLpcHOaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaahyaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahycIccLqcLrcLscIcahyaahaahcJecLtcLudEXcJecLwcLxcLycLzcBIcLAcBIcCGcCGcLBcCGcLCcKqcLDcLEcLFcKqcLGcLGcLGcLGcLGcLGcLGcLGahyahyahycwhczRcwhcziaahaahaahaahcxzcxzcxzcxzcLHcLIcLJcLKcLLcxzcxzcxzcxzaahaahaahaahaahaahcziczicAbczicKCcKCcLMcLNcLOawvcLQcLRcLScLTcLUcLVcLWcLXcLYcLZcMacMbcMccKCcKCcBgcHqcBgahyaahaahcrQcrQcrQcrQcrQcrQcrQcrQcrQdDCdDBcQGcQGcQGcQGcQGaahaahaahcHycMidEYcMkcMlaWIcMndBWcHycyccydcHEdBYdBXbbgdBZdCcdEZdCedCddCgdFadCidChbdodCjdClcHIcysdCmdCodCncMEbdpcMGcMHdFbcMJcHOaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaaaaadbkQaahaahaahaahaahcuScuScuScuScCtcCtcCtcCtcCtcCtaahahycIccJccJccJccIcahyahyaahcJecKgcKhcKicJecKjcKjcKjcBIcBIcKkcKlcBIcKmcKncKocKpcKqcKrcKscKtcKqcKucGedeccKvcEwcKwcKwcKwcCKahyahycwhczRcwhaahaahaahaahaahcxzcKxczecHScKyczecKzczgcKAcHScKBcKBcxzaahaahaahaahaahaahaahczicAbcziaahcKCcKCcNYcKEcKFcKCcKCcKCcKGcKHcKIcKCcKCcKCcKCcKCcKCcKCcKCaahcBgcHqcBgaahaahcrQcrQcQAcQBcQCcrQcQDcQEdDydDxcsYcsYcQGdDzcQGdDAcQGaahaahaahcHycKOcKPcKQcKRcKQcMzcMycKUcDAcwIcKVcMBcMAcKYcKZcKYcLacLbcHEcLccLdcLecLfcLecMCcMDcLicwWcHNcLjcLkcLlcLmcLncLmcLocLpcHOaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaahyaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahycIccLqcLrcLscIcahyaahaahcJecLtcLudEXcJecLwcLxcLycLzcBIcLAcBIcCGcCGcLBcCGcLCcKqcLDcLEcLFcKqcLGcLGcLGcLGcLGcLGcLGcLGahyahyahycwhczRcwhcziaahaahaahaahcxzcxzcxzcxzcLHcLIcLJcLKcLLcxzcxzcxzcxzaahaahaahaahaahaahcziczicAbczicKCcKCcLMcLNcLOawvcLQcLRcLScLTcLUcLVcLWcLXcLYcLZcMacMbcMccKCcKCcBgcHqcBgahyaahaahcrQcrQcrQcrQcrQcrQcrQcrQcrQdDCdDBcQGcQGcQGcQGcQGaahaahaahcHycMidEYcMkcMlcMmcMndBWcHycyccydcHEdBYdBXdCadBZdCcdEZdCedCddCgdFadCidChdCkdCjdClcHIcysdCmdCodCncMEcMFcMGcMHdFbcMJcHOaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahybkQcIccMKcNZcMMcIcbkQcMNcMNcMNcMNcMPcMOcKjcMQcMRcMScMTcMUcMVcMWdDDcoucMZcNacMUcNbcNccNdcNecrVcOpcNhcNicNjcTfcLGcNlcLGcLGahyahycwhcNmcNncziczicziczicziczicNocNpcxzcNqcxzcNrcxzcNqcxzcEDcEDcziczicziczicziczicziczicUqcXxcUucKCcNucLPcLPcNvcNwcNwcNxcNycNzcNAcNBcNCcNDcNEcNEcNEcNFcLPcNGcKCcZgdDEcBgahyahyaahaahaahaahaahaahaahaahcWudDFdbMdbMdDGcWuaahaahaahaahaahaahcHycHycHycHycHycHycHycHycHyczpcuAcHEcHEcHEcHEcHEcHEcHEcHEcHEcHIcHIcHIcHIcHIcHIcHIcHIcuLczqcHOcHOcHOcHOcHOcHOcHOcHOcHOaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahybkQbkQcOsahycOMbkQbkQcMNcOacObcOccOdcOecOfcOgcOhcOicMTcOjcOkcOlcOlcOmcOncOocPFcOqcNccNdcNecOrcPPcOtcOtcyzdDHcOvcOtcOwcLGahyahycwhcOxcOycOzcOAcOBcOCcOCcOCcOCcOAcOAcOAcODcOEcOFcOAcOCcOCcOGcOCcOCcOCcOCcOCcOCcOCcOCdlDdBIdBHcKCcOKcLPcLPcOLcLPcLPcPYcONcOOcOPcOQcONcPYcLPcLPcLPcORcLPcLPcKCdBJcHqcBgahyahyahyaahaahaahaahaahaahaahcWudDIdbMdbMdDJcWuaahaahaahaahaahaahcPdcPecPfcPgcPhaGYcPjcPkcPdcPlcPmcPncuscPpcPpcPqcPpcutcPrcPscPpcPtcPpcPucPpcPpcvkcPncPwcPlcPxbeQbeRcPAaEybffcPDcPEcPxaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahycQscPGcPGcPHcPGcPIcPJcPKcMNcPLcPMcPMcPNcPOcRfcPQcPRcPScMTcPTcPUcOocPVcPWcOocPXcRucPZcNccQacQbcQcdcEdDKdDMdDLdDNcQicQjcQkcLGahyahycwhcQlczQczicziczicziczicziczicziczicEDcEDcEEcNscEDczicziczicziczicziczicziczicziczicQmcEDdBKcKCcQocQocLPcQpcQqcQrcRJcQtcOOcQucQvcQwcRJcQxcQocLPcQycQqcQocKCdCRcHqcBgahyahyahyahyaahaahaahaahaahaahcWucWudDPdDOcWucWuaahaahaahaahaahaahcPdcQJcQKcQKcQLcQKcQKcQMcQNcQOcQPcQQcQRcQRcQRcQScQRbhbcQUcQVcQWcQXcQRcQYcQRcQRcQRcQQcQZarAcRbcRccRccRccRdcRccRccRecPxaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbLjbLjaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahycSAcRgcRhcRicRjcRkcRlcRmcRncRocRpcRqcRrcRscRtcSLcRvcRwcRxcMTcRycPUcRzcRAcRBcRCcOlcRDcREcRFcRGcRHcRIcTadDQcRKcRLcRMcRNcRObhpcLGahyahycwhcRQcwhcziahyahyahyahyahyahyahycziczicziczicziczicziaahaahaahaahaahaahaahaahaahcziczicRRdCScKCcRTcRWcRVcLPcRWcRXcRJcRYcOOcOPcOQcRZcRJcRTcRWcLPcRVcRWcSacKCdCTcSccBgahyahyahyahyahyaahaahaahaahaahahydDRdbMdDScWuaahaahcXGcXGcXGcXGaahcPdcSdcSecSfcSgcShcSicSjcSjcSkcSlcSmcSlcSlcSlcSncSlcSlcSlcSocSpcSqcSqcSrcSqcSqcSqcSscStarBcSucSucSvcSwcSxcSycSyarCcPxaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahybkQbkQcOsahycOMbkQbkQcMNcOacObcOccOdcOecOfcOgcOhcOicMTcOjcOkcOlcOlcOmcOncOocPFcOqcNccNdcNecOrcPPcOtcOtcyzdDHcOvcOtcOwcLGahyahycwhcOxcOycOzcOAcOBcOCcOCcOCcOCcOAcOAcOAcODcOEcOFcOAcOCcOCcOGcOCcOCcOCcOCcOCcOCcOCcOCdlDdBIdBHcKCcOKcLPcLPcOLcLPcLPcPYcONcOOcOPcOQcONcPYcLPcLPcLPcORcLPcLPcKCdBJcHqcBgahyahyahyaahaahaahaahaahaahaahcWudDIdbMdbMdDJcWuaahaahaahaahaahaahcPdcPecPfcPgcPhaGYcPjcPkcPdcPlcPmcPncuscPpcPpcPqcPpcutcPrcPscPpcPtcPpcPucPpcPpcvkcPncPwcPlcPxcPycPzcPAaEycPCcPDcPEcPxaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahycQscPGcPGcPHcPGcPIcPJcPKcMNcPLcPMcPMcPNcPOcRfcPQcPRcPScMTcPTcPUcOocPVcPWcOocPXcRucPZcNccQacQbcQcdcEdDKdDMdDLdDNcQicQjcQkcLGahyahycwhcQlczQczicziczicziczicziczicziczicEDcEDcEEcNscEDczicziczicziczicziczicziczicziczicQmcEDdBKcKCcQocQocLPcQpcQqcQrcRJcQtcOOcQucQvcQwcRJcQxcQocLPcQycQqcQocKCdCRcHqcBgahyahyahyahyaahaahaahaahaahaahcWucWudDPdDOcWucWuaahaahaahaahaahaahcPdcQJcQKcQKcQLcQKcQKcQMcQNcQOcQPcQQcQRcQRcQRcQScQRcQTcQUcQVcQWcQXcQRcQYcQRcQRcQRcQQcQZarAcRbcRccRccRccRdcRccRccRecPxaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbLjbLjaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahycSAcRgcRhcRicRjcRkcRlcRmcRncRocRpcRqcRrcRscRtcSLcRvcRwcRxcMTcRycPUcRzcRAcRBcRCcOlcRDcREcRFcRGcRHcRIcTadDQcRKcRLcRMcRNcROcRPcLGahyahycwhcRQcwhcziahyahyahyahyahyahyahycziczicziczicziczicziaahaahaahaahaahaahaahaahaahcziczicRRdCScKCcRTcRWcRVcLPcRWcRXcRJcRYcOOcOPcOQcRZcRJcRTcRWcLPcRVcRWcSacKCdCTcSccBgahyahyahyahyahyaahaahaahaahaahahydDRdbMdDScWuaahaahcXGcXGcXGcXGaahcPdcSdcSecSfcSgcShcSicSjcSjcSkcSlcSmcSlcSlcSlcSncSlcSlcSlcSocSpcSqcSqcSrcSqcSqcSqcSscStarBcSucSucSvcSwcSxcSycSyarCcPxaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahbLjbLjaahaahaahaahaahaahaahaahaahbkQbkQahyahyahybkQbkQcTZcSBcSCcPMcSDcPMcSEcSFcSGcSHcPMcPMcSIcSJcSKcUlcSMcSNcSOcMTcSPcSQcSRcSScSTcSUcSVcSWcSXcSYcSZcNecRIcUscTbcOtcTccOtcTearDcTgcLGahyahycwhcRQcwhahyahyahyahyahyahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahaahaahaahczicThcRScKCcTicTjcTkcLPcTlcTjcRJcTmcTncTocOQcTmcRJcTjcTjcTpcLPcTlcTqcKCcSbcTrcBgahyahyahyahyahyahyahyahyahyahyahydDTdbMdDUcWuaahcXGcXGasfasecXGaahcPdcPdcTscTtcTucTvcTwcTxcPdcPncPncPncTycTzcTzcTAcTBcTCcTDcTEcTFcTGdCUcTHcTzcTzasgcPncTDashcPxcTJcTKasicTMcTNcTOcPxcPxaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQcTZcSBcTPcTQcTRcTScTTcTUcTVcTWcPMcPMcTXcSIcTYcKjcUvcUacUvcMTbhWcUccUdcUecUecUfcPXcPFcUgcUhcUicUjcRIcUkcUycUmcUodcLcUkcUkcUkcLGahyahycwhcUpcwhahyahyahyahyahyahyahyahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahahyczidCVcRScKCcUrcLPcORcLPcLPcLPcUHcONcOOcOPcOQcONcUHcLPcLPcOLcLPcLPcUtcKCcSbdCWcBgahyahyahyahyahyahyahyahyahyahyahycWudDWdDVcWuaahcXGasjaskdaDcXGaahaahcPdcUIcUwcUwcUwcUxcPdcPdaahaahcPncPncUYcUzcUzcUAcPncUBcUCcUDcPncPncPncPncPncPncPncUBcPmcPxcPxcPxcPxcPxcPxcPxcPxaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQcTZcSBcTPcTQcTRcTScTTcTUcTVcTWcPMcPMcTXcSIcTYcKjcUvcUacUvcMTcUbcUccUdcUecUecUfcPXcPFcUgcUhcUicUjcRIcUkcUycUmcUodcLcUkcUkcUkcLGahyahycwhcUpcwhahyahyahyahyahyahyahyahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahahyczidCVcRScKCcUrcLPcORcLPcLPcLPcUHcONcOOcOPcOQcONcUHcLPcLPcOLcLPcLPcUtcKCcSbdCWcBgahyahyahyahyahyahyahyahyahyahyahycWudDWdDVcWuaahcXGasjaskdaDcXGaahaahcPdcUIcUwcUwcUwcUxcPdcPdaahaahcPncPncUYcUzcUzcUAcPncUBcUCcUDcPncPncPncPncPncPncPncUBcPmcPxcPxcPxcPxcPxcPxcPxcPxaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahahycIccUEcUEcUFcUGcVucVgcUJcUKcULcUMcPMcUMcUNcUOcUPcUQcURcUScUTcUUcUVcRqcUWcUXcVQcUZcOocOocOocOocOocVacRucVbcUhcVccNecVdcVecVfcWicVhcVicVjcVkcVlcVmahyahycwhcRQcwhahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyaahaahaahahyahyahyahyahyahyczicVncEDcKCcLPcLPcVocNEcNEcNEcNDcNCcVpcVqcVrcNycNxcNwcNwcVscLPcLPcLPcKCcGxcVtcBgahyahyahyahyahyahyahyahyahyahyahydDRdbMdbScWuaahcXGaslaskasmcXGaahaahahyahyahyahyahyahyahyaahaahaahaahahyahyahyahyahycWvcVvcVwcVxcPnaahaahaahaahaahabTasoasnabTaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahahycIccVycVzcVAcNZahycTZcVBcVCcVDcVEcVFcUMcVGcVHcVIcVJcVKcVKcVLcVMcVNcPMcVOcVPcWBcVRcVScVScVTcOocVUcVVcMTcVWcVXcVYcNecVZcWacWbcWicWccWdcWecWfcWgcVmcwhcwhcwhcRQcwhcWhcWhcWOcWjcWkcWhcWhcWOcWjcWkcWhcWhahyahyahyahyahyahyahyahyahyahyahyahycziczicWlczicKCcWmcWncWocWpcvtcLPcLRcONcOOcOOcOQcONcLRcLPcvtcWpcWqcWrcWscKCcBgcWtcBgcBgahyahyahyahyahyahyahyahyahyahydDTdbMdbScWuaahcXGcXGaspcXGcXGaahaahahyahyahyahyahyaahaahaahaahaahaahaahahyahyahyahycXncWwcWxcWycWuaahabTabTabTabTabTastasqabTabTabTabTabTaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccUEcUEcWzcWAcVucXucWCcWDcWEcWFcWGcWHcWIcWJcWJcWJcWFcWFcWFcWKcWLcPMcWMcWNcMTcMTcXycWPcwAcvvcXycWPcWScWTcWUcVYcNecWVcWWcWXcWicWYcWZcXacXbcXccVmdDXcXecXecXfczQcWhcXgcXhcXicXjcXkcXlcXhcXmcXhcXhcWhcWhcXHcXocXocXocXocXocXpcXqcXHcXpcXqcXqcXrcXscXtcKCcKCcNYcKEcKFcKCcKCcKCcYfcXvcXvcKIcYfcKCcKCcKCcNYcKEcKFcKCcKCcXtcXwdCXcXqcXqcZncXzcXzcXzcXAcWucWucWudDYcWucWwdDZcWucWucWucXBasvdHkcWucWucWucWucZncXzcXzcXAcWucWucWucWucWucWucWucZncXzcXzcXAcWucXDcXEcXFcWuabTabTaswacwacwasxacuaeVaszasyacwacwabTabTaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQcZocXIcXJcVDcXKcXLcUMcUNcXMcXMcXNcUOcVEcXOcXPcWFcXQcXRcXScXTcXUcXVcXWcXXcXYcXZcYacYbcYacYccYdcNebiXcWacNcdaTcYgcYhcYicYjcYkcVmcRQczQcYlczQczQcYmcYncYocYpcYqcYncYrcYpcYscYtcYucYvcYwcYxcYycYxcYxcYzcYxcYAcYBcYxcYxcYCcYDcYEcYFcYGcYHcYCcYxcYIcYxcYycYJcYKcYxcYxcYxcYLcYxcYMcYNcYycYxcYxcYxcYCcYxcYGcYOcYPcYPcYQcYRcYScYRcYTcYRcYUcYVdCYcYRcYScYWcYRcYRcYXcYScYYasAcYZdCYcYXcYRcZacYRcYRcZbcYRcYRcZccYUdCYcYRcYRcZdcYRcYRcYScYRcYXcZecZfcXFasBasDasCacuacuacuasEasFaeVacuacuacuacuawwabTaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQcZocXIcXJcVDcXKcXLcUMcUNcXMcXMcXNcUOcVEcXOcXPcWFcXQcXRcXScXTcXUcXVcXWcXXcXYcXZcYacYbcYacYccYdcNecYecWacNcdaTcYgcYhcYicYjcYkcVmcRQczQcYlczQczQcYmcYncYocYpcYqcYncYrcYpcYscYtcYucYvcYwcYxcYycYxcYxcYzcYxcYAcYBcYxcYxcYCcYDcYEcYFcYGcYHcYCcYxcYIcYxcYycYJcYKcYxcYxcYxcYLcYxcYMcYNcYycYxcYxcYxcYCcYxcYGcYOcYPcYPcYQcYRcYScYRcYTcYRcYUcYVdCYcYRcYScYWcYRcYRcYXcYScYYasAcYZdCYcYXcYRcZacYRcYRcZbcYRcYRcZccYUdCYcYRcYRcZdcYRcYRcYScYRcYXcZecZfcXFasBasDasCacuacuacuasEasFaeVacuacuacuacuawwabTaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccZkcZkcZlcZmdbDdbdcZpcZqcVMcZrcPMcUMcUNcZscZtcZucVGcVHcZvcZqcZwcZxcZycZqcZzcZAcZBcZCcZDcZEcZFcZGcZHcZGcZIcZJcZKcZLdmbcZNcZOcZPcZQcZRcZScZTcVmcRQcwhcwhcZUcwhcZVcZWcZXcWhcZVcZWcZYcWhcZVcZZdaadabdacdaddaddaddaedaddaddafdaddaddaddagdaedahdaidajdakdagdaddajdaddaddaddaedaddaddaddaddaddafdaddaddaddaddaddagdakdajdaldaddaedagdamdamdamdandamdamdaodamdamdamdapdamdamdaqdaodardasdatdaudaqdamdandamdamdaodamdamdamdamdamdamdamdavdamdamdaudamdaqdawdaxasUasSasWasVasXasXatbasZatdatcacJacuacuacuadKabTaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahahycIcdaEdaFdaGcNZahycTZdaHdaIdaJdaKcTSdaLcUNbjybjEaImcUNcPMdaPcPMdaQcPMcPMdaRdaSdaSdbIdaUdaVdaWdbIdaUdaSdaXdaYdaZdbadbbdbcdbNdbedbfdbgdbNdbedbcdbccRQcwhdbhdbidbjcZVdbkdbldbmcWhdbndbldbocZVcWhdbpcXhdbqdbrdbrdbrdbsdbtdbrdbrdbudbrdbrdbvdbwdbxdbydbzdbAdbBdbCdcedbCdbCdbEdbFdbCdbCdbGdbCdbCdbCdbHdbCdbCdcfdbCdbBdbJdbzdbydbKdbLdbvdbMdbMdcrdbMdbMdbMdbOdbMdbMdbMdbPdbMdbMcWwdbQdbRdbScXEdbTcWwdbMdcrdbMdbMdbUdbMdbVdbMdbMdbMdbVdbMdbMdbMdbMdbWdbMcWwdbWdbXcXFdbYadCacuacuateatOatfatSatPacJacuacuacuatTabTaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahahycIcdaEdaFdaGcNZahycTZdaHdaIdaJdaKcTSdaLcUNdaMdaNaImcUNcPMdaPcPMdaQcPMcPMdaRdaSdaSdbIdaUdaVdaWdbIdaUdaSdaXdaYdaZdbadbbdbcdbNdbedbfdbgdbNdbedbcdbccRQcwhdbhdbidbjcZVdbkdbldbmcWhdbndbldbocZVcWhdbpcXhdbqdbrdbrdbrdbsdbtdbrdbrdbudbrdbrdbvdbwdbxdbydbzdbAdbBdbCdcedbCdbCdbEdbFdbCdbCdbGdbCdbCdbCdbHdbCdbCdcfdbCdbBdbJdbzdbydbKdbLdbvdbMdbMdcrdbMdbMdbMdbOdbMdbMdbMdbPdbMdbMcWwdbQdbRdbScXEdbTcWwdbMdcrdbMdbMdbUdbMdbVdbMdbMdbMdbVdbMdbMdbMdbMdbWdbMcWwdbWdbXcXFdbYadCacuacuateatOatfatSatPacJacuacuacuatTabTaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccZkcZkdccdcddcDdczdcgdchdcidaPcPMcUMdcjdckdcldcmdcndcodcpcTQdcpdcmdcodcqdcJdcsdctdcudcvdcwdcxdcydcxddbdcAdcBdcCddndmkdcFdcGdcHdcIddtdcKczfdbcdcMcwhdcNdbidcOcZVdcPdcQdcRcWhdcSdcTdcUcZVcWhcWhcWhcWhcXHcXocXocXocXocXocXpdcVcXHcXpdcWdcXdpPdqIdpQdcXdcWddDdcVcXHcXocXocXocXocXpdcVcXHcXocXocXocXocXpdcVddDddcddddskdtrdstddddddcZncXAddhcZncXzcXAddhcZncXzcXAddhcZncXAddiddjdBAdBCdBBddjddiddPddhcZncXzcXzcXzcXzcXAddhcZncXzcXzcXzcXzcXAddhddPddodBEdBDdBFddsabTaezacuaeVacuacuatVatUacuacuacuacuaeCabTaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQddWdducXJddvddwcTSddxcPMcUOcVFcVEcPMcPMddyddzcWLddAddBddCdeedcsdcudcudcvdcwddEddEddFddGddHddIdcCddJddKddKddKddLddMddNddNdBGdbccRQcwhdekddQddRcZVddSddTddScWhddUddVddUcZVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeqddXddYddZdeadebdeqaaaaaaaaaaaaaaadeddeddeddeddeddeddedaaaaaaaaaaaaaaadeWdefdegdehdeidejdeWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfbdeldemdendeodepdfbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfcderdesdetdeuddsatWatYatXauaatZaegacuaeXblKaciaeYabTabTaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQddWdducXJddvddwcTSddxcPMcUOcVFcVEcPMcPMddyddzcWLddAddBddCdeedcsdcudcudcvdcwddEddEddFddGddHddIdcCddJddKddKddKddLddMddNddNdBGdbccRQcwhdekddQddRcZVddSddTddScWhddUddVddUcZVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeqddXddYddZdeadebdeqaaaaaaaaaaaaaaadeddeddeddeddeddeddedaaaaaaaaaaaaaaadeWdefdegdehdeidejdeWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfbdeldemdendeodepdfbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfcderdesdetdeuddsatWatYatXauaatZaegacuaeXaubaciaeYabTabTaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahbkQcIcdevdevdewcZmdbDdbddexcZqdeydezcVNcUMcPMdcjdclcVHcSHcPMcWLcWLcVIcVJdeAdeBdeCdeDdcudeEdeFdeGdeHdeIdeJdeKdeLdeMdeNddJddKddKdeOdePdeQdeRddKdeSdbccRQcwhahyahyahycZVddSdeTddScWhddUdeUddUcZVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVaaaaaadfhdeXdeYdeZdeadfadfmaaaaaaaaaaaadeddeddeddeddeddeddeddeddedaaaaaaaaaaaadfBdfddegdfedffdfgdfBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfIdfidfjdfkdeodfldfIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfLderdesdfndfoddsabTabTabTaflaflafmaflaflabTabTabTabTaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahahycIcdfpdfqdfrcNZahycTZdfscPMcUMcWLcVIdeydftcZqdfucZqdftcZqdfvcWLcPMcPMdfwdfxdfydfzdcudcudfAaIndfCdfDdfEddbdfFdfGdfHddndfXdfJdfKdfYdfMdfYdfNdbcdbccRQcwhahyahyahyahyddSdfOddScZVddUdfPddUdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdgwdfRdfSdfTdfUdfVdfWdhgdcWaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaaddcdhudfZdgadgbdgcddcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddidgddemdgedgfdggddiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddodghdgidgjdgkddsaahaflagBaflaudafBaueafDafEaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahahycIcdevdevdgldcddcDdczdgmcTSdgncWLcPMdgocTTcTSdgpcTScTScTSdgpdgpdgqcPMdgrdgsdaSdgtdcudgudgvdhzdgxdfDdgydgzdgAddIdgBdgCdgCdgCdgCdgCdgCdgCdgCdbcdgDdgEcwhcwhahyahyahydgFdgGdgHaaadgIdgJdgKdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdgLdgMdgNdgOdgPdgQdgRdfadeqaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadeWdfddgSdgTdeidfgdeWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfbdfidemdgUdgVdfldfbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfcderdgWdgjdgXddsaahaflauPaflafPafQafRaflaflaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9868,15 +9872,15 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaaaaaaaaaahydkCdjxdbDdbDdkJdjxdkLdbDdkJdjxdkLdbDdkJdkUcOsbkQbkQahydaSdgzdgzdgzdgzdgzdjydgzdgzdgzdjzdjAdjBdjCdjCdjCdjCdjCdjCdjCdjCdjCcxxdhtcwhcwhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeqdeXddYddZdgRdfadeqaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadeWdfddgSdehdeidfgdeWaaaaaaaaadjjdjDdjEdjkdjEdjDdjjaaaaaaaaadfbdfidemdendhGdfldfbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfcderdesdixdgXddsaahaahaahaflagyagLagzaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAaaadjFaaabkQcIcdjGcNZcMKcIcdjGcNZcMKcIcdjGcNZcMKcIcbkQaahdjHdjHdjIdjJdjKdjLdjMdjNdjOdjPdjQdjRdjSdjCdjTdjUdjVdjWdjXdjYdjZdjCdjCdhtcwhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgwdfRdfSdkadfUddZdgRdebdfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMdejdgSdehdeidgSdhMaaaaaadisdkbdkcdkcdkddkcdkcdkbdiwaaaaaadifdhGdemdendhGdepdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiyderdesdixdgXddsddsaahaahaflaflaflaflaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaadaadaaaaadaadaadaaaaadaadaadaaaaadaadaadaaaacAaaddkeaadbkQcIcdkfdkgdkhcIcddrdcYdfQcIcdkldkmdkncIcaahaahdjHdkodkpdkqdkrdksdktdkqdkudjPdkvdkwdkxdjCdkydkydkzdjXdjXdkAdkAdEbdjCdhtcwhdkYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkDdkEdkFdkGdkHddZdkIdlEdfSdfRdkKdeddeddeddeddeddeddeddeddeddeddeddeddeddlUdkMdkNdkOdkPdehdeidfgdhMaaaaaadjjdjkdHmdHldjkdHldHndkSdjjaaaaaadifdfidemdendkTdlYdkVdkWdkXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmGdkZdladlbdlcdixdgXdldddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaadledlfdlgaaadledlfdlgaaadledlfdlgaaadledlfdlgaaaacAaadaadaaaaaacIcdlhdlidlhcIcdkjdkidkjcIcdlkdlldlkcIcaahaahdjHbmndlndkqdlodlpdlqdlrdlsdltdludlvdlwdlxdlydlzdlAdlzdlzdlBdlzdEcdjCdhtdDadoidlFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadhIdfRdhvdkadlGdlHdlIdlJdlKdlLdlMdeddeddeddeddeddeddeddeddeddeddeddeddeddlNdlOdlPdlQdlRdlSdlTdokdkNdkMdlVdjjdlWdjkdjkdjkdjkdjkdlXdjjdoEdkWdkVdkXdlZdmadDbdmcdmddmedmfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmgdmhdmidmjdDcdixdgXdmlddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaddledmmdlgaaddledmmdlgaaddledmmdlgaaddledmmdlgaadacOaaaaadaadaaacIcdlhdmndlhcIcdkjdkkdkjcIcdlkdmpdlkcIcaahaahdjHbmndmqdkqdlpdlpdmrdmsdmtdmudmvdmwdmxdmydmzdmAdmBdmCdmCdmDdlzdEddjCdhtczQdmFdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfmdeXddYddZdmHdmIdmJdmKdmLdeddeddeddeddeddeddeddeddeddeddeddeddeddmMdmNdmOdmPdmQdehdmRdmSdmTdgSdmSdkddjkdmUdmUdjkdmUdmUdjkdkddmVdhGdmWdmVdmXdendmYdmZdnadnbdncaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnddnednfdngdnhdixdgXdniddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaadledlfdlgaaadledlfdlgaaadledlfdlgaaadledlfdlgaaaacAaadaadaaaaaacIcdlhdlidlhcIcdkjdkidkjcIcdlkdlldlkcIcaahaahdjHdlmdlndkqdlodlpdlqdlrdlsdltdludlvdlwdlxdlydlzdlAdlzdlzdlBdlzdEcdjCdhtdDadoidlFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadhIdfRdhvdkadlGdlHdlIdlJdlKdlLdlMdeddeddeddeddeddeddeddeddeddeddeddeddeddlNdlOdlPdlQdlRdlSdlTdokdkNdkMdlVdjjdlWdjkdjkdjkdjkdjkdlXdjjdoEdkWdkVdkXdlZdmadDbdmcdmddmedmfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmgdmhdmidmjdDcdixdgXdmlddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaddledmmdlgaaddledmmdlgaaddledmmdlgaaddledmmdlgaadacOaaaaadaadaaacIcdlhdmndlhcIcdkjdkkdkjcIcdlkdmpdlkcIcaahaahdjHdlmdmqdkqdlpdlpdmrdmsdmtdmudmvdmwdmxdmydmzdmAdmBdmCdmCdmDdlzdEddjCdhtczQdmFdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfmdeXddYddZdmHdmIdmJdmKdmLdeddeddeddeddeddeddeddeddeddeddeddeddeddmMdmNdmOdmPdmQdehdmRdmSdmTdgSdmSdkddjkdmUdmUdjkdmUdmUdjkdkddmVdhGdmWdmVdmXdendmYdmZdnadnbdncaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnddnednfdngdnhdixdgXdniddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaadledmmdlgaaadledmmdlgaaadledmmdlgaaadledmmdlgaaaaadaaaaaaaadaadcIccIccIccIccIccIccIccIccIccIccIccIccIcaahaahdjHdkodkpdkqdlodlpdktdkqdEedjPdfFdihdnkdjCdnldnmdnndnodnpdnqdnrdnsdjCdntczQdnudppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiXdcWdjvdiZdjadcXdcXdcXdcXdcXdcWdnvddYddZdnwdlEdhvdfRdfTdeddeddeddeddeddeddeddeddeddeddeddeddeddokdkMdnxdkOdnydehdnzdokdnxdkMdkOdjjdjkdjkdjkdjkdjkdjkdjkdjjdlYdkWdnAdkXdnBdendnCdlYdnAdkWdkXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmGdkZdnDdlbdnEdixdgXdnFddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaadledmmdlgaaadledmmdlgaaadledmmdlgaaadledmmdlgaaaaadaaaaaaaaaaadaadaadaadaaaaaaaadaadaadaaabkQdnGdnGdnGdnGdnGdjHdjHdnHdnIdnJdnKdnLdnMdjHdjHdnNdnOdnPdjCdjCdnQdnodnRdnSdnTdnrdjCdjCdhtczQdnudppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUaaaaaaaaadeqdeXdnVdnWdgRdeXdfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMdnXdgSdnYdnZdnXdhMaaaaaadoadjkdmUdmUdobdmUdmUdjkdoaaaaaaadifdocdoddoedhGdocdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiydofdesdogdohddsddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaaadledmmdlgaaadledmmdlgaaadledmmdlgaaadledmmdlgaaaaadaaaaaaaaaaaaaaddqrdojdojdojdojdnGdqLdoldnGdnGdomdomdondoodopdjHdjHdjHdjHdjHdjHdjHdjHdoqdordosdotdoudjCdjCdjCdjCdjCdjCdjCdjCdjCdhtczQdovdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdgwdfRdfSdkadfUddZdgRdhydfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMdhAdgSdehdeidowdhMaaaaaadoxdjkdjkdjkdoydjkdjkdjkdoxaaaaaadifdozdemdendhGdhHdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiydhJdesdixdoAddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadbCWaadaaaaadbCWaadaaaaadbCWaadaaaaadbCWaadaaadoDaaaaaaaaadqNdoFdoGdoHdoIdoJdoKdoLdoMdoNdoOdoPdoQdoQdoRdoSdoTdoUdoVdoWdoRdoOdoXdoYdoZdpadpbdpcdpddpedpfdpgdphdpidpjdpkdpldpmdpndhtdpodqTdpqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdprdpsdptdpudpvdpwdpxdeXdfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMdnXdpydpzdeidnXdhMaaaaaadpAdjkdmUdmUdjkdmUdmUdjkdpAaaaaaadifdocdemdpBdpCdocdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiydofdpDdpEdgXddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaddpFdpGdpGdpGbCXdpGdpGdpGbCXdpGdpGdpGbCXdpGdpGdpGbCXdpGdpGdpGdpGdpGdpKdpLdpMdpNdpOcBhcAMdpRdpSdpTdpUdpVdpWdpXdpYdpZdqadqbdqcdqddqedoudoudqfdoudqgdoudqhdqidoudoudqjdoudqfdqkdqldqmdqndqodqpdqqcwhdqYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdhIdfRdhvdkadqsdcZdqtdlEdfSdfRdfTdeddeddeddeddeddeddeddeddeddeddeddeddeddokdkMdkNdkOdquddfdqvdokdkNdkMdkOdjjdqwdjkdjkdjkdjkdjkdqxdjjdlYdkWdkVdkXdqyddldqzdlYdkVdkWdkXaaaaaaaaaaaadqAdqAdqAdqAdqAdqAdqAaaaaaadmGdkZdladlbdqBdqCdqDddsaahaahaahdqEdqEdqEdqEdqEdqEdqEaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadbCWaadaaaaadbCWaadaaaaadbCWaadaaaaadbCWaadaaaaadaaaaaaaaadqNdoFdqGdqHcBPcBldojdnGdqJdqKdnGdnGdrxdoldqMdnGdrAdqOdqOdqPdqOdqQdqRdqQdqSdrBdqUdqVdrBdqUdqSdqWdqXdsLdnGdqZdqZdnGdnGcwhcwhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUaaaaaaaaadfmdeXddYddZdmHdradrbdrcdrddeddeddeddeddeddeddeddeddeddeddeddeddeddredrfdrgdrhdmQdehdmRdmSdridgSdmSdkddjkdmUdmUdjkdmUdmUdjkdkddmVdhGdrjdmVdmXdendmYdrkdrldrmdrnaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAaaadrodrpdrqdrrdnhdixdgXddsdqEdqEdqEdqEdrsdrtdrudrvdrsdqEdqEdqEdqEdqEdqEdqEdqEdqEdqEdqEdqEaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaaddledrwdlgaaadledrwdlgaaadledrwdlgaaadledrwdlgaaaaadaaaaaaaaaaaaaaddtkdojdojdojdojdnGdrydrzdtIaaadtXdrCdrDdrEdrFdqOdrGdrHdrIdqQdrJdrKdrLbmrdrNdrOdrPdrQdrLdrRdrSdrTdnGdrUdrVdrWdtIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiXdcWdjvdiZdjadcXdcXdcXdcXdcXdcWdjbdrXdlHdrYdrZdsadsbdscdeddeddeddeddeddeddeddeddeddeddeddeddeddsddsedsfdsgdshdlSdsidokdnxdkMdlVdjjdlWdjkdjkdjkdjkdjkdlXdjjdoEdkWdnAdkXdsjdmadDddsldsmdsndsoaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAaaadspdsqdsrdssdDedsudsvdswdBLdsydsydsydszdsAdszdsBdszdsydsxdsydsydsydsCdsDdsEdsFdsGdsHdqEdqEaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaaddledrwdlgaaadledrwdlgaaadledrwdlgaaadledrwdlgaaaaadaaaaaaaaaaaaaaddtkdojdojdojdojdnGdrydrzdtIaaadtXdrCdrDdrEdrFdqOdrGdrHdrIdqQdrJdrKdrLdrMdrNdrOdrPdrQdrLdrRdrSdrTdnGdrUdrVdrWdtIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiXdcWdjvdiZdjadcXdcXdcXdcXdcXdcWdjbdrXdlHdrYdrZdsadsbdscdeddeddeddeddeddeddeddeddeddeddeddeddeddsddsedsfdsgdshdlSdsidokdnxdkMdlVdjjdlWdjkdjkdjkdjkdjkdlXdjjdoEdkWdnAdkXdsjdmadDddsldsmdsndsoaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAaaadspdsqdsrdssdDedsudsvdswdBLdsydsydsydszdsAdszdsBdszdsydsxdsydsydsydsCdsDdsEdsFdsGdsHdqEdqEaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsIdsIdsIdsIdsIdsIdsIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaadledrwdlgaaadledrwdlgaaadledrwdlgaaadledrwdlgaaaaadaaaaaaaaaaadaadaaaaaaaaaaaaaaadnGdsJdsKdtZaaddtXdsMdsNdsOdsPdqOdsQdsRdsSdqQdsTdsUdrLdsVdsWdsXdsYdsZdrLdtadtbdtcdnGdtddtedtfdtZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeqdeXddYddZdtgdlEdhvdfRdkKdeddeddeddeddeddeddeddeddeddeddeddeddeddlUdkMdnxdkOdthdehdeidfgdhMaaaaaadjjdtidtjdHodHqdHpdtjdwfdjjaaaaaadifdfidemdendtldlYdnAdkWdkXaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAaaadmGdkZdtmdtndtodtpdtqdtqdBMdtsdttdtudtvdtwdtxdtydtzdtwdtAdtBdtCdtDdtEdtBdtBdtBdtBdtFdtGdqEaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsIdsIdsIdsIdsIdsIdsIdsIdsIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaadledrwdlgaaadledrwdlgaaadledrwdlgaaadledrwdlgaaaacAaaaaaaaadaadaaaaaaaaaaaaaaaaaadnGdtHdtHdnGahydxKdoldtJdqLdoldqOdtKdtLdtMdtNdtOdtPdtQdtRdtSdtTdtUdtVdtWdxNdtYdxOduadubducdnGdnGaaddudduedueduedueaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgwdfRdfSdkadufddZdgRdugdfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMduhdgSdehdeiduidhMaaaaaadujdukduldumdumdumduldukdunaaaaaadifduodemdendhGdupdifaaaaaaaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAaaaaaaaaaaaadiyduqdixdurddsdqEdqEdusdutduudqEdusdutduvdqEdusdqEdqEdqEdqEdqEdqEdqEdtBdtFdtBdqEaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsIdsIdsIdsIdsIdsIdsIdsIdsIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaddledrwdlgaaddledrwdlgaaddledrwdlgaaddledrwdlgaadacAaaaaadaadaaaaaaaaaaaaaaaaaaaaaduwduxduyduwbkQduzduAduBduAduzdqOduCduDduEdqQduFduGdrLduHduIduJduIduKdrLduLduMduNduaduOduPduQduRaaaaadaadaaaaaadueaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduSduTduUduVduWduXdjddfadfmaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadfBdfddjgduYdeidfgdfBaaaaaaaaaaaadujdukdukdukdunaaaaaaaaaaaadfIdfidemduZdjndfldfIaaaaaaaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAaaaaaaaaaaaadfLdvadvbdvcddsaahaahdqEdvddvedvfdqEdvgdvhdvidqEaahaahaahaahaahaahdvjdvjdvkdvjdvjaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9889,7 +9893,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsIdsIds aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyRdyRdyRdyRaaaaaaaaadyRdyRdyRdyRdyRdyRdyRaaaaaaaaadyRdyRdyRdyRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadzvdnGdzNbkQdzNdnGduadzwdxzdzxdzydzzdwUdzAdzBdzCdzDdzEdzFdzGdzHdzIdzJdzKdzLdzMdBwdzhdwldwXdwYdwldyudueaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBxdfTdzPdzQdfmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfBdzRdzSdokdzTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBydkXdzVdzWdfIaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdmGdkZdzXdkZdkZdzYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaadzZaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyRdyRdyRdyRaaaaaadyRdyRdyRdyRdyRdyRdyRdyRdyRaaaaaadyRdyRdyRdyRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahydBzahyahyduadAbdyTdAcdAddAedwUdAfduadAgdAhdAiduadAjdAkdAldAmdAndAodApduadwkdwldwZdwWdwldwndueaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaadaadaaaaaaaaaaaadAraaaaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyRdyRdyRdyRaaaaaadyRdyRdyRdyRdyRdyRdyRdyRdyRaaaaaadyRdyRdyRdyRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadueaaaahyduadAsdwUdAtdAudAudwUdAvdAwdAxdAydAzdAwdAAdABdzbdzcdACdADdAEduadwWdwmdwXdwYdwmdwZdueaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaadAraaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadueaaaaaaduadwUdwUdzydAFdAFdwUdAvdAGdAHbmFdAJdAGdAAdAvdzIdAKdzKdALdAMduadwkdwldwZdwWdwldwndueaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduedueduedudaadaadaadaaddAraadaadaadaadaadacOduedueaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadueaaaaaaduadwUdwUdzydAFdAFdwUdAvdAGdAHdAIdAJdAGdAAdAvdzIdAKdzKdALdAMduadwkdwldwZdwWdwldwndueaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduedueduedudaadaadaadaaddAraadaadaadaadaadacOduedueaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadueaaaaaaduaduadwUdAOdAddAddAPdAvdAQdARdASdATdAQdAUdAVdAWdAXdAYdAZduaduadytdwldwXdwYdwldyudueaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaadAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadueaaaaadaaaaadaaaaaaaaadAraaaaadaadaaaaaaaaaaaadueaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadudaaaaaaaaaduaduadBbdBcdBbdBbduaduaduadBdduaduaduaduaduadBeduaduaduaaaddwYdwmdwZdwWdwmdwXdueaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadueaaadBfdBfdBfdBfdBfaaddAraaddBfdBfdBfdBfdBfaaadueaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIdsIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRdyRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduedueaaaaaaaaaaaadBgdBgdBgdBgaadaaddBhaaadBhaadaaaaadaaaaaaaadaaaaaaaaddytdwldwXdwYdwldyudueaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqdAqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAdqAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadueaaddBidBjdBjdBjdBjadLaejadLdBmdBmdBmdBmdBnaaddueaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/polaris-5.dmm b/maps/polaris-5.dmm index 1aa7d8f647d..7399aa2e705 100644 --- a/maps/polaris-5.dmm +++ b/maps/polaris-5.dmm @@ -299,7 +299,7 @@ "fM" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio2"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/southright{dir = 1; name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology) "fN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio2"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/disposalpipe/segment,/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/outpost/research/xenobiology) "fO" = (/turf/simulated/floor/tiled,/area/outpost/research/xenobiology) -"fP" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology) +"fP" = (/obj/machinery/xenobio/editor,/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology) "fQ" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/outpost/research/hallway/toxins_hallway) "fR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/research{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "toxins_airlock_exterior"; locked = 1; name = "Toxins External Airlock"; req_access = list(7)},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "toxins_airlock_control"; name = "Toxins Access Button"; pixel_x = 26; pixel_y = 0; req_access = list(7)},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway/toxins_hallway) "fS" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/turf/space,/area/space) @@ -432,8 +432,8 @@ "ip" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/research/hallway/catwalk) "iq" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored) "ir" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/pen/blue{pixel_x = -5; pixel_y = -1},/obj/item/weapon/pen/red{pixel_x = -1; pixel_y = 3},/turf/simulated/floor/tiled/dark,/area/outpost/research/xenobiology) -"is" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/xenobio/editor,/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology) -"it" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/xenobiology) +"is" = (/obj/machinery/chemical_dispenser/full{density = 1},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology) +"it" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology) "iu" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology) "iv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology) "iw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology) @@ -445,7 +445,7 @@ "iC" = (/obj/structure/disposaloutlet{dir = 1},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology) "iD" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/research/hallway/catwalk) "iE" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = 30},/turf/simulated/floor/tiled,/area/outpost/research/xenobiology) -"iF" = (/obj/structure/table/standard,/obj/item/weapon/clipboard,/obj/item/weapon/folder,/obj/item/weapon/pen,/obj/item/weapon/melee/baton/slime/loaded,/turf/simulated/floor/tiled/dark,/area/outpost/research/xenobiology) +"iF" = (/obj/structure/table/standard,/obj/item/weapon/clipboard,/obj/item/weapon/folder,/obj/item/weapon/pen,/obj/item/weapon/melee/baton/slime/loaded,/obj/item/device/analyzer/xeno_analyzer,/turf/simulated/floor/tiled/dark,/area/outpost/research/xenobiology) "iG" = (/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology) "iH" = (/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/research/xenobiology) "iI" = (/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for a door to space."; id = "xenobioout6"; name = "Containment Release Switch"; pixel_x = 0; pixel_y = -28; req_access = list(55)},/turf/simulated/floor/tiled,/area/outpost/research/xenobiology) @@ -461,7 +461,7 @@ "iS" = (/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Xenobiology Aft Starboard"; dir = 1},/obj/machinery/newscaster{pixel_y = -32},/obj/machinery/light,/obj/machinery/computer/xenobio2,/turf/simulated/floor/tiled,/area/outpost/research/xenobiology) "iT" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/hallway/catwalk) "iU" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/outpost/research/hallway/catwalk) -"iV" = (/obj/structure/table/steel,/obj/item/clothing/glasses/science,/turf/simulated/floor/tiled/dark,/area/outpost/research/xenobiology) +"iV" = (/obj/structure/table/steel,/obj/item/clothing/glasses/science,/obj/item/device/analyzer/xeno_analyzer,/turf/simulated/floor/tiled/dark,/area/outpost/research/xenobiology) "iW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/disposalpipe/segment,/obj/structure/cable/blue,/turf/simulated/floor/plating,/area/outpost/research/xenobiology) "iX" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/window/southright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology) "iY" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable/blue,/turf/simulated/floor/plating,/area/outpost/research/xenobiology) @@ -469,9 +469,9 @@ "ja" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/window/southright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology) "jb" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable/blue,/turf/simulated/floor/plating,/area/outpost/research/xenobiology) "jc" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology) -"jd" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/xenobiodisk,/obj/item/weapon/melee/baton/slime/loaded,/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology) +"jd" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/xenobiodisk,/obj/item/weapon/melee/baton/slime/loaded,/obj/item/device/analyzer/xeno_analyzer,/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology) "je" = (/turf/simulated/wall,/area/outpost/research/xenobiology) -"jf" = (/obj/structure/closet,/obj/item/toy/figure/scientist,/obj/item/clothing/accessory/armband/science,/turf/simulated/floor/tiled/dark,/area/outpost/research/xenobiology) +"jf" = (/obj/structure/closet,/obj/item/toy/figure/scientist,/obj/item/clothing/accessory/armband/science,/obj/item/device/analyzer/xeno_analyzer,/turf/simulated/floor/tiled/dark,/area/outpost/research/xenobiology) "jg" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/outpost/research/hallway/catwalk) "jh" = (/obj/machinery/light/small{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology) "ji" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology) @@ -529,7 +529,7 @@ "ki" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/research/dorms) "kj" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/research/dorms) "kk" = (/obj/structure/table/reinforced,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/turf/simulated/floor/tiled,/area/outpost/research/xenobiology) -"kl" = (/obj/machinery/recharger/wallcharger{pixel_x = 32},/turf/simulated/floor/tiled,/area/outpost/research/xenobiology) +"kl" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/outpost/research/dorms) "km" = (/obj/structure/closet/wardrobe/science_white,/turf/simulated/floor/wood,/area/outpost/research/dorms) "kn" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/tiled/dark,/area/outpost/research/longtermstorage) "ko" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/dark,/area/outpost/research/longtermstorage) @@ -542,7 +542,7 @@ "kv" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTHEAST)"; icon_state = "warning_dust"; dir = 5},/turf/simulated/floor/tiled/asteroid_steel/airless,/area/mine/explored) "kw" = (/obj/structure/table/standard,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/roller{pixel_x = 2; pixel_y = 3},/obj/item/roller,/turf/simulated/floor/tiled/white,/area/outpost/research/medical) "kx" = (/turf/simulated/floor/tiled/white,/area/outpost/research/medical) -"ky" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/outpost/research/dorms) +"ky" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/medical) "kz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/sleep_console,/turf/simulated/floor/tiled/white,/area/outpost/research/medical) "kA" = (/obj/effect/floor_decal/corner/paleblue{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/white,/area/outpost/research/medical) "kB" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_medical{name = "Medbay"; req_access = list(47); req_one_access = null},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/outpost/research/medical) @@ -593,9 +593,9 @@ "lu" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/tempstorage) "lv" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/outpost/research/tempstorage) "lw" = (/obj/effect/floor_decal/corner/purple{dir = 9},/obj/structure/closet/emcloset,/turf/simulated/floor/tiled/white,/area/outpost/research/dock) -"lx" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/medical) -"ly" = (/obj/machinery/conveyor{dir = 3; id = "anolongstorage"},/turf/simulated/floor/plating{dir = 10},/area/outpost/research/tempstorage) -"lz" = (/obj/structure/plasticflaps/mining,/obj/machinery/conveyor{dir = 4; id = "anolongstorage"},/turf/simulated/floor/plating,/area/outpost/research/tempstorage) +"lx" = (/obj/machinery/conveyor{dir = 4; id = "anolongstorage"},/turf/simulated/floor/plating,/area/outpost/research/tempstorage) +"ly" = (/obj/structure/plasticflaps/mining,/obj/machinery/conveyor{dir = 4; id = "anolongstorage"},/turf/simulated/floor/plating,/area/outpost/research/tempstorage) +"lz" = (/obj/machinery/conveyor{dir = 4; id = "anolongstorage"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/research/tempstorage) "lA" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/research/medical) "lB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/research/medical) "lC" = (/obj/machinery/door/airlock/glass_medical{name = "Medbay"; req_access = list(47); req_one_access = null},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled/white,/area/outpost/research/medical) @@ -649,9 +649,9 @@ "my" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/tempstorage) "mz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/tempstorage) "mA" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled,/area/outpost/research/tempstorage) -"mB" = (/obj/machinery/conveyor{dir = 4; id = "anolongstorage"},/turf/simulated/floor/plating,/area/outpost/research/tempstorage) -"mC" = (/obj/machinery/conveyor{dir = 4; id = "anolongstorage"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/research/tempstorage) -"mD" = (/obj/machinery/conveyor{dir = 4; id = "anotempload"},/turf/simulated/floor/plating,/area/outpost/research/tempstorage) +"mB" = (/obj/machinery/conveyor{dir = 4; id = "anotempload"},/turf/simulated/floor/plating,/area/outpost/research/tempstorage) +"mC" = (/obj/structure/plasticflaps/mining,/obj/machinery/conveyor{dir = 4; id = "anotempload"},/turf/simulated/floor/plating,/area/outpost/research/tempstorage) +"mD" = (/obj/machinery/conveyor{dir = 4; id = "anotempload"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/research/tempstorage) "mE" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/shuttle/research/outpost) "mF" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/dock) "mG" = (/obj/structure/table/standard,/obj/item/weapon/material/ashtray/glass,/obj/item/weapon/reagent_containers/food/drinks/coffee,/obj/machinery/light,/turf/simulated/floor/tiled/white,/area/outpost/research/dock) @@ -718,7 +718,7 @@ "nP" = (/obj/machinery/portable_atmospherics/powered/scrubber,/obj/effect/floor_decal/corner/purple{dir = 5},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway/mid) "nQ" = (/obj/machinery/portable_atmospherics/powered/scrubber,/obj/effect/floor_decal/corner/purple{dir = 5},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway/mid) "nR" = (/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/wood,/area/outpost/research/dorms) -"nS" = (/obj/machinery/conveyor{dir = 4; id = "anotempload"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/research/tempstorage) +"nS" = (/obj/machinery/conveyor{dir = 3; id = "anolongstorage"},/turf/simulated/floor/plating{dir = 10},/area/outpost/research/tempstorage) "nT" = (/turf/simulated/floor/tiled,/area/outpost/research/hallway/starboard) "nU" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/outpost/research/hallway/starboard) "nV" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/purple,/turf/simulated/floor/tiled,/area/outpost/research/hallway/starboard) @@ -853,8 +853,8 @@ "qu" = (/obj/structure/table/rack,/obj/item/clothing/head/welding,/obj/item/weapon/weldingtool,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly) "qv" = (/obj/structure/table/standard,/obj/machinery/cell_charger,/obj/item/weapon/screwdriver{pixel_y = 15},/obj/item/weapon/melee/baton/loaded,/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly) "qw" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/anomaly) -"qx" = (/obj/structure/plasticflaps/mining,/obj/machinery/conveyor{dir = 4; id = "anotempload"},/turf/simulated/floor/plating,/area/outpost/research/tempstorage) -"qy" = (/obj/machinery/conveyor{dir = 4; id = "anom"},/turf/simulated/floor/plating,/area/outpost/research/anomaly) +"qx" = (/obj/machinery/conveyor{dir = 4; id = "anom"},/turf/simulated/floor/plating,/area/outpost/research/anomaly) +"qy" = (/obj/machinery/conveyor{dir = 4; id = "anom"},/obj/structure/plasticflaps/mining,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/outpost/research/anomaly) "qz" = (/obj/machinery/conveyor{dir = 4; id = "anom"},/obj/machinery/door/window,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/outpost/research/anomaly) "qA" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/anomaly) "qB" = (/obj/machinery/door/airlock/glass_research{name = "Anomalous Materials"; req_access = list(65)},/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly) @@ -969,14 +969,14 @@ "sG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly) "sH" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/anomaly) "sI" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/anomaly) -"sJ" = (/obj/machinery/conveyor{dir = 4; id = "anom"},/obj/structure/plasticflaps/mining,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/outpost/research/anomaly) +"sJ" = (/obj/machinery/conveyor{dir = 2; id = "anolongstorage2"},/turf/simulated/floor,/area/outpost/research/anomaly) "sK" = (/obj/structure/closet/secure_closet/xenoarchaeologist{req_access = list(47)},/obj/effect/floor_decal/corner/purple{dir = 10},/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Hallway Mid 1"; dir = 1},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway/mid) "sL" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/eva) "sM" = (/obj/effect/floor_decal/corner/purple{dir = 6},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Expedition Prep Access"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/eva) "sN" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/research/eva) "sO" = (/obj/structure/closet/excavation,/obj/effect/floor_decal/corner/purple{dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/eva) "sP" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/eva) -"sQ" = (/obj/machinery/conveyor{dir = 2; id = "anolongstorage2"},/turf/simulated/floor,/area/outpost/research/anomaly) +"sQ" = (/obj/machinery/recharge_station,/obj/effect/floor_decal/corner/purple/full{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/eva) "sR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/outpost/research/eva) "sS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/research/eva) "sT" = (/obj/structure/reagent_dispensers/coolanttank,/obj/effect/floor_decal/corner/lime/full,/obj/structure/sign/nosmoking_2{pixel_y = -32},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) @@ -985,8 +985,8 @@ "sW" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/tiled,/area/outpost/research/anomaly) "sX" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/outpost/research/anomaly) "sY" = (/obj/machinery/door/firedoor/glass,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/anomaly) -"sZ" = (/obj/machinery/recharge_station,/obj/effect/floor_decal/corner/purple/full{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/eva) -"ta" = (/obj/machinery/atmospherics/unary/heater{dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/research/anomaly) +"sZ" = (/obj/machinery/atmospherics/unary/heater{dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/research/anomaly) +"ta" = (/obj/machinery/atmospherics/unary/freezer{dir = 1; icon_state = "freezer"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/outpost/research/anomaly) "tb" = (/obj/machinery/atmospherics/valve/digital/open,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/outpost/research/anomaly) "tc" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/obj/structure/table/standard,/obj/item/weapon/folder,/obj/item/device/camera,/obj/item/weapon/pen,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly) "td" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly) @@ -1079,14 +1079,14 @@ "uM" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/north_hall) "uN" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "mining_outpost_airlock"; pixel_x = 28; pixel_y = 0; req_one_access = list(13,48); tag_airpump = "mining_outpost_pump"; tag_chamber_sensor = "mining_outpost_sensor"; tag_exterior_door = "mining_outpost_outer"; tag_interior_door = "mining_outpost_inner"},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/tiled,/area/outpost/mining_main/north_hall) "uO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/mining_main/north_hall) -"uP" = (/obj/machinery/atmospherics/unary/freezer{dir = 1; icon_state = "freezer"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/outpost/research/anomaly) +"uP" = (/obj/structure/table/standard,/obj/machinery/recharger,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/break_room) "uQ" = (/obj/machinery/firealarm{dir = 2; layer = 3.3; pixel_x = 0; pixel_y = 26},/turf/simulated/floor/wood,/area/outpost/mining_main/break_room) "uR" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/outpost/mining_main/break_room) "uS" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/outpost/mining_main/break_room) "uT" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/outpost/mining_main/break_room) "uU" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/mining_main/break_room) "uV" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/mining_main/medbay) -"uW" = (/obj/machinery/conveyor{dir = 2; id = "anolongstorage2"},/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor,/area/outpost/research/anomaly) +"uW" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/mining_main/medbay) "uX" = (/obj/machinery/sleep_console,/turf/simulated/floor/tiled/white,/area/outpost/mining_main/medbay) "uY" = (/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/effect/floor_decal/corner/paleblue{dir = 6},/turf/simulated/floor/tiled/white,/area/outpost/mining_main/medbay) "uZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/outpost/mining_main/north_hall) @@ -1116,7 +1116,7 @@ "vx" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/wood,/area/outpost/mining_main/break_room) "vy" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/outpost/mining_main/break_room) "vz" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/wood,/area/outpost/mining_main/break_room) -"vA" = (/obj/structure/table/standard,/obj/machinery/recharger,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/break_room) +"vA" = (/obj/structure/table/standard,/obj/machinery/microwave{pixel_y = 6},/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/break_room) "vB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTHWEST)"; icon_state = "warning_dust"; dir = 9},/turf/simulated/floor/tiled/asteroid_steel/airless,/area/mine/explored) "vC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTH)"; icon_state = "warning_dust"; dir = 1},/turf/simulated/floor/tiled/asteroid_steel/airless,/area/mine/explored) "vD" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "meoutpost_main_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = -25; req_access = newlist(); req_one_access = list(10,48,65)},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTH)"; icon_state = "warning_dust"; dir = 1},/turf/simulated/floor/tiled/asteroid_steel/airless,/area/mine/explored) @@ -1157,7 +1157,7 @@ "wm" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "meoutpost_main_pump"},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway) "wn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway) "wo" = (/obj/machinery/mining/brace,/turf/simulated/floor/tiled/asteroid_steel/airless,/area/mine/explored) -"wp" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/mining_main/medbay) +"wp" = (/obj/machinery/mining/drill,/turf/simulated/floor/tiled/asteroid_steel/airless,/area/mine/explored) "wq" = (/obj/structure/cable,/obj/machinery/power/apc/super{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/tiled/asteroid_steel/airless,/area/mine/explored) "wr" = (/obj/machinery/light/small,/turf/simulated/floor/tiled/asteroid_steel/airless,/area/mine/explored) "ws" = (/obj/structure/ore_box,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored) @@ -1273,14 +1273,14 @@ "yy" = (/obj/machinery/door/airlock/glass_mining{name = "Mining Outpost Airlock"; req_access = list(48)},/obj/machinery/door/firedoor/glass,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/outpost/mining_main/north_hall) "yz" = (/obj/machinery/mineral/input,/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 1},/obj/effect/floor_decal/industrial/loading{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) "yA" = (/obj/machinery/mineral/unloading_machine,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery) -"yB" = (/obj/structure/table/standard,/obj/machinery/microwave{pixel_y = 6},/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/break_room) -"yC" = (/obj/machinery/mining/drill,/turf/simulated/floor/tiled/asteroid_steel/airless,/area/mine/explored) -"yD" = (/obj/machinery/conveyor{dir = 4; id = "mining_internal"},/obj/structure/plasticflaps/mining,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery) -"yE" = (/obj/machinery/conveyor{dir = 4; id = "mining_internal"},/obj/machinery/mineral/output,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery) +"yB" = (/obj/machinery/conveyor{dir = 4; id = "mining_internal"},/obj/machinery/mineral/output,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery) +"yC" = (/obj/machinery/conveyor{dir = 4; id = "mining_internal"},/obj/structure/plasticflaps/mining,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery) +"yD" = (/obj/machinery/conveyor{dir = 4; id = "mining_internal"},/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery) +"yE" = (/obj/machinery/conveyor{dir = 9; id = "mining_internal"},/obj/machinery/mineral/output,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery) "yF" = (/obj/machinery/mineral/unloading_machine{icon_state = "unloader-corner"},/turf/simulated/floor/plating,/area/outpost/mining_main/refinery) -"yG" = (/obj/machinery/conveyor{dir = 9; id = "mining_internal"},/obj/machinery/mineral/output,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery) -"yH" = (/obj/machinery/conveyor{dir = 4; id = "mining_internal"},/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery) -"yI" = (/obj/machinery/conveyor{dir = 4; id = "mining_external"},/obj/machinery/mineral/input,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"yG" = (/obj/machinery/conveyor{dir = 4; id = "mining_external"},/obj/machinery/mineral/input,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"yH" = (/obj/machinery/conveyor{dir = 4; id = "mining_external"},/obj/structure/plasticflaps/mining,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"yI" = (/obj/machinery/conveyor{dir = 4; id = "mining_external"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/mining_main/refinery) "yJ" = (/turf/simulated/wall/r_wall,/area/outpost/engineering/mining/telecomms) "yK" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway) "yL" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway) @@ -1306,7 +1306,7 @@ "zf" = (/obj/effect/floor_decal/corner/purple{dir = 9},/obj/effect/floor_decal/industrial/warning/corner,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled,/area/outpost/research/eva) "zg" = (/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery) "zh" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/mining_main/refinery) -"zi" = (/obj/machinery/conveyor{dir = 4; id = "mining_external"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/mining_main/refinery) +"zi" = (/obj/machinery/conveyor{dir = 2; id = "mining_internal"},/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery) "zj" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/camera/network/engineering_outpost{c_tag = "ENG - Outpost Mining Telecomm"; dir = 2},/turf/simulated/floor/tiled/dark,/area/outpost/engineering/mining/telecomms) "zk" = (/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/outpost/engineering/mining/telecomms) "zl" = (/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway) @@ -1335,7 +1335,7 @@ "zI" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway) "zJ" = (/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway) "zK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/dispenser/oxygen,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway) -"zL" = (/obj/machinery/conveyor{dir = 4; id = "mining_external"},/obj/structure/plasticflaps/mining,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) +"zL" = (/obj/machinery/conveyor{dir = 2; id = "anolongstorage2"},/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor,/area/outpost/research/anomaly) "zM" = (/turf/simulated/wall,/area/outpost/engineering/mining/power) "zN" = (/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/outpost/engineering/mining/power) "zO" = (/obj/machinery/power/smes/buildable/outpost_substation{charge = 500000; input_attempt = 1; input_level = 150000; output_level = 150000; RCon_tag = "Outpost - Mining Engineering"},/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/outpost/engineering/mining/power) @@ -1403,7 +1403,7 @@ "AY" = (/obj/structure/closet/crate,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) "AZ" = (/obj/structure/closet/crate,/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) "Ba" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) -"Bb" = (/obj/machinery/conveyor{dir = 2; id = "mining_internal"},/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery) +"Bb" = (/obj/machinery/conveyor{dir = 2; id = "mining_internal"},/obj/machinery/mineral/output,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery) "Bc" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTHEAST)"; icon_state = "warning_dust"; dir = 5},/turf/simulated/floor/tiled/asteroid_steel/airless,/area/outpost/mining_main/refinery) "Bd" = (/obj/structure/closet/crate,/obj/item/stack/material/phoron{amount = 50},/obj/item/stack/material/phoron{amount = 50},/obj/item/stack/material/phoron{amount = 50},/turf/simulated/floor/plating,/area/outpost/engineering/mining/power) "Be" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/power/sensor{long_range = 1; name_tag = "Asteroid Main Grid"},/turf/simulated/floor/plating,/area/outpost/engineering/mining/power) @@ -1424,15 +1424,15 @@ "Bt" = (/obj/machinery/power/smes/buildable{charge = 1.5e+007; cur_coils = 3; input_attempt = 1; input_level = 750000; input_level_max = 750000; output_level = 750000; output_level_max = 750000; RCon_tag = "Outpost - Main Power Unit 1"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/outpost/engineering/mining/power) "Bu" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/obj/machinery/floodlight,/turf/simulated/floor/plating,/area/outpost/engineering/mining/power) "Bv" = (/obj/effect/floor_decal/corner/brown/full,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled,/area/outpost/mining_main/north_hall) -"Bw" = (/obj/machinery/mining/drill,/turf/simulated/floor/tiled/asteroid_steel/airless,/area/outpost/mining_main/refinery) +"Bw" = (/obj/machinery/washing_machine,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/dorms) "Bx" = (/obj/machinery/firealarm{dir = 8; pixel_x = -26},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) "By" = (/obj/structure/disposalpipe/segment,/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/mining_main/dorms) "Bz" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_x = 0; pixel_y = -32},/obj/machinery/light,/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/tiled,/area/outpost/mining_main/refinery) -"BA" = (/obj/machinery/conveyor{dir = 2; id = "mining_internal"},/obj/machinery/mineral/output,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery) -"BB" = (/obj/machinery/washing_machine,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/dorms) -"BC" = (/obj/machinery/conveyor{dir = 8; id = "mining_internal"},/obj/structure/plasticflaps,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery) +"BA" = (/obj/machinery/conveyor{dir = 8; id = "mining_internal"},/obj/structure/plasticflaps,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery) +"BB" = (/obj/machinery/conveyor{dir = 8; id = "mining_internal"},/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery) +"BC" = (/obj/machinery/conveyor{dir = 8; id = "mining_internal"},/obj/machinery/mineral/output,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery) "BD" = (/obj/machinery/mineral/stacking_machine,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery) -"BE" = (/obj/machinery/conveyor{dir = 8; id = "mining_internal"},/obj/machinery/mineral/output,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery) +"BE" = (/obj/machinery/conveyor{dir = 5; icon_state = "conveyor0"; id = "mining_internal"},/obj/machinery/mineral/input,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery) "BF" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled/asteroid_steel/airless,/area/outpost/mining_main/refinery) "BG" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (EAST)"; icon_state = "warning_dust"; dir = 4},/turf/simulated/floor/tiled/asteroid_steel/airless,/area/outpost/mining_main/refinery) "BH" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/outpost/engineering/mining/power) @@ -1475,7 +1475,7 @@ "Cs" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/floor/tiled,/area/outpost/mining_main/eva) "Ct" = (/obj/machinery/door/airlock/external{frequency = 1377; icon_state = "door_locked"; id_tag = "mext"; locked = 1},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled,/area/outpost/mining_main/eva) "Cu" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (EAST)"; icon_state = "warning_dust"; dir = 4},/obj/machinery/access_button/airlock_exterior{frequency = 1377; master_tag = "mcontrol"; pixel_x = -26; pixel_y = 26; req_access = list(48)},/turf/simulated/floor/tiled/asteroid_steel/airless,/area/mine/explored) -"Cv" = (/obj/machinery/conveyor{dir = 8; id = "mining_internal"},/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery) +"Cv" = (/obj/machinery/recharge_station,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/storage) "Cw" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/storage) "Cx" = (/obj/machinery/camera/network/mining{c_tag = "OPM - Mining Storage Room"; dir = 8},/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/storage) "Cy" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/mining_main/storage) @@ -1581,15 +1581,16 @@ "Eu" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/obj/machinery/computer/crew,/turf/simulated/floor/tiled/white,/area/outpost/mining_main/medbay) "Ev" = (/obj/machinery/mining/brace,/turf/simulated/floor/tiled/asteroid_steel/airless,/area/outpost/mining_main/refinery) "Ew" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (EAST)"; icon_state = "warning_dust"; dir = 4},/obj/machinery/mining/brace,/turf/simulated/floor/tiled/asteroid_steel/airless,/area/outpost/mining_main/refinery) -"Ex" = (/obj/machinery/conveyor{dir = 5; icon_state = "conveyor0"; id = "mining_internal"},/obj/machinery/mineral/input,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/refinery) +"Ex" = (/obj/machinery/mining/drill,/turf/simulated/floor/tiled/asteroid_steel/airless,/area/outpost/mining_main/refinery) "Ey" = (/obj/structure/table/steel,/obj/item/weapon/screwdriver,/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/turf/simulated/floor/tiled/asteroid_steel/airless,/area/outpost/mining_main/refinery) "Ez" = (/obj/structure/table/steel,/obj/item/weapon/cell/high,/turf/simulated/floor/tiled/asteroid_steel/airless,/area/outpost/mining_main/refinery) "EA" = (/obj/structure/table/steel,/obj/machinery/cell_charger,/turf/simulated/floor/tiled/asteroid_steel/airless,/area/outpost/mining_main/refinery) "EB" = (/obj/effect/floor_decal/industrial/warning/dust/corner,/obj/machinery/light/small,/turf/simulated/floor/tiled/asteroid_steel/airless,/area/outpost/mining_main/refinery) "EC" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled,/area/outpost/research/xenobiology) "ED" = (/obj/machinery/xenobio/extractor,/turf/simulated/floor/tiled/dark,/area/outpost/research/xenobiology) -"EE" = (/obj/structure/disposalpipe/segment,/obj/machinery/xenobio/editor,/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology) -"EF" = (/obj/machinery/recharge_station,/turf/simulated/floor/tiled/dark,/area/outpost/mining_main/storage) +"EE" = (/obj/structure/bed/chair/office/light{dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/xenobiology) +"EF" = (/obj/machinery/recharger/wallcharger{pixel_x = 32},/turf/simulated/floor/tiled,/area/outpost/research/xenobiology) +"EG" = (/obj/machinery/light{dir = 1},/obj/machinery/vending/hydronutrients,/turf/simulated/floor/tiled,/area/outpost/research/xenobiology) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1679,21 +1680,21 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeeWaqeXaiaqeYeZfafbfcfdeCeUfeEcfgdRacacacacacacacacaceVfhfhfieVfhfhfieVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaefsfkaqaqaeaeflaeaeeTeBfmfyfofoacacacacacacacaceVeVeVfhfhfqeVfhfhfqeVeVeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaefrfraegYftfuaefvfwfofofofxdldlacacdlacaceVeVjeeVfpfhfzeVfpfhfzeVfAeVeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlaeaeaeaefBfCfDaedRdRfofEfxfFdldldldldlaceVeVfGhWeVfIfJfKeVfLfMfNeVfOfPeVeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlaeaeaeaefBfCfDaedRdRfofEfxfFdldldldldlaceVeVfGhWeVfIfJfKeVfLfMfNeVfOiteVeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldlaeaefQfRaeaedRaafEfSfFfFdldldldldleVeVfTfOfUfVfWfXfYfZgafXgbgcgdfOfAeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldlgegfggghgiaaaafSfSfSfSaadldldldlgjgkfOglfOfHgngogpgqgrgogsfOgmeVeVeVeVeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlgtgugvgwgxaaaagygzgygzaaaaaaaadlgAfAgCgDgdgEgFgGgGgHgGgGgGgIgJgKfpgLfheVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlgNgMgOgwgxgPaaaaaaaaaaaaaagPgQgReVeVeVeVeVgSgTgUgogVfOfOgdgWgXiofhfhfheVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagtgZgvgwhagQgQgQgQgQgQgQgQhbgZhceVhdhehfeVgBgTgWhghhhifOgdhjhkhlhmhmhneVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahohphqhrhshshthuhshshshvhshshwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLkkeVhNhNhNeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahOguorhPhQhQhQhRhQhQhQhShQhQhQhTeVhUhVkreVgWgTgWhXhYhZgWgdiaibicisidideVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagPieifigiiihijijijijijijijijijikeVeVeVeVeVilgTimgoingogVgdgWgXmrfhfhfheVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahOipiUiqdldlaaaaaaaaaaaaaaaaaagjiriEitgdiuiviwiwixiwiwiwiyhkiziAiBiCeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahOiDiUiqdldldlaaaaaaaaaaaaaaaagAiFfOfOfOfOiGgoiHiIingoiJfOkleVeVeVeVeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahOguorhPhQhQhQhRhQhQhQhShQhQhQhTeVhUhVkreVgWgTgWhXhYhZgWgdiaibicididideVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagPieifigiiihijijijijijijijijijikeVeVeVeVeVilgTimgoingogVgdgWgXmrfhfPfheVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahOipiUiqdldlaaaaaaaaaaaaaaaaaagjiriEEGisiuiviwiwixiwiwiwiyhkiziAiBiCeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahOiDiUiqdldldlaaaaaaaaaaaaaaaagAiFfOfOEEfOiGgoiHiIingoiJfOEFeVeVeVeVeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahOiDiUiqdldldlaaaaaaaaaaaaaaaaeVeViRiKgdiLiMiNiOhMiPiNiQiSgdfOiVeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahOiTjgiqdldldlaaaaaaaaaaaaaaaaaaeVeVjdECeViWiXiYeViZjajbeVfOjceVeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagtiDiUiqdldldlaaaaaaaaaaaaaaaaaaaaeVeVEDeVEEfhfhjefzfhfpeVjfeVeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlgtiDjpiqdldldldldlaaaaaaaaaaaaaaaaaaeVeVeVjhfhfhjejhfhfheVeVeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagtiDiUiqdldldlaaaaaaaaaaaaaaaaaaaaeVeVEDeVfzfhfhjefzfhfpeVjfeVeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlgtiDjpiqdldldldldlaaaaaaaaaaaaaaaaaaeVeVeVjhfPfhjejhfhfheVeVeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlgtiDiUiqdldldldldlaaaaaaaaaaaaaaaaaaaaaaeVjifhfhjejifhfheVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlgtiDiUiqdldldldldlaaaaaaaaaaaaaaaaaaaaaaeVjjjjjjeVeVeVeVeVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagtifigiqdldldldldlaaaaaaaaaaaaaaaaaaaaaajkjkjkjkjkacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1706,23 +1707,23 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldljqjqjrjsjLjtjtdldldldldldldldldldldldldldldljtjujujujujujvacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldljwjxjqjylwjAkdjCjtjtjtdldldldldldldldldldldljtjtjtjujDmsjEjEjvjvjvacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadljqjqjFjGjHjIjJjKkgjMjNjOjtjtjtdldldldldldldljtjtjtjPjQjujRjSjTjRjUjVjvjvjvacacacacjWacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajqjqjXjYjZkakbkcjAkEkejPjPkfkFjtjtkhkikikikjjtjtmIkyjPkmjuknkokpkpjUkqmTksjvjvktktktkukvacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadljwjxkwkxlxkzkAkBkCkDkHErAtEsAtEtkIkJkKkGkLkGkGkMkGkNkOkPkQjukRkSkTkUjUkVkWkXkYjvjvkZkZkZlakvacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldljFlbkxlcldlelfkblglhliljlklllklklklklmlnlojPjPlojPlplojPlqjulrlskpnOjUltlulvlymBlzmCmCmCkZlakvacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajqjqjXjYjZkakbkcjAkEkejPjPkfkFjtjtkhkikikikjjtjtmIkljPkmjuknkokpkpjUkqmTksjvjvktktktkukvacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadljwjxkwkxkykzkAkBkCkDkHErAtEsAtEtkIkJkKkGkLkGkGkMkGkNkOkPkQjukRkSkTkUjUkVkWkXkYjvjvkZkZkZlakvacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldljFlbkxlcldlelfkblglhliljlklllklklklklmlnlojPjPlojPlplojPlqjulrlskpnOjUltlulvnSlxlylzlzlzkZlakvacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldljrjqjIlAlBlClAlBlDlEjAlFjtlGlHlIlJlKlLlMjClNjCjClOjCjClPjCjCjulQlRlSlTlUlVlWlXlYlZjvjvmakZkZkZmbacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNmcgNgNmdmcjrmemfmgmhmimjmkjqmlmmmljtmnjPlImomplLnRjCmqnZjCmqnZjCpjmtmujumvmwmxjujUkVmymzmAmDmDqxnSnSnSkZmbacacacdldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNmcgNgNmdmcjrmemfmgmhmimjmkjqmlmmmljtmnjPlImomplLnRjCmqnZjCmqnZjCpjmtmujumvmwmxjujUkVmymzmAmBmBmCmDmDmDkZmbacacacdldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamcmEmEmEmEmEjrmemFmgmgmgmGjrjrjzjAmHjrjtqclImJmKlLjPjCmLmMjCmLmMjCmNmOjtmPmQmRmSmPjvqomUmVmWmYmXjvmZnakZkZmbdldldldldldldldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanbmEmEmEmEmEncndnenfmgmgjrjrngnhninjnkjtjtjtjCkhkikjjCjtjtjCjCjCjCjtjtjtnlnmnnnonpjvjvjvnqnrnsntnumPnvnwkZmbdldldldldldldldldldldldldldldldldldldldldldldldldldldldldljWacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNmEmEmEmEmEnxnynznxnAmgqFqEnBlFnCnDnEmgnFnGnHnInJnKnLnMnNqKnPnQqppXnFnTnUnVnWnXnTnTnYrqoamRobocodoeofogohmbdldldldldldldldldldldldldldldldldldldldldldldldldldldldldloidldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNmEmEmEmEmEojokolomonooopopoqrujrosotouovowoxoyoyozoyoAoBoCoDoDoEoDoFoGoHoImPoJoKoGoLCMoMoNoOoPoQoRoSoToUmboVoVoVoVoVdldldldldldldldldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNmEmEmEmEmEoWoXoYoWoZpapbpcpbpdpepfpgmgnFphpisKpkpkplnMpmpnpopppqprpstnpupvpwpxpyptpzpApBpCpDEdodpFpGpHpImboVoVoVoVoVdloVoVoVoVdldloVdldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlpJmEmEmEmEmEpKndndpLpMpNpMpMpOpPmglFpQpRpRpRpSpSpTpUpVpRpWqBpWpSpSpRpRpRpYpZqaqbvNqdqdqdqeqeqfqgnumPnvqhqiqjoVoVdldldloVoVoVdloVoVoVdloVoVdldldloVdldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlmcmEmEmEmEmEpMqkqlqlqmqnvRpMjrqWqqqrjrpRqsqtquqvqwqysJqzqArbqCqDxYxWqDpRmPqGqHqImPqdqJyuqLqLqMqNqdqOoVoVoVoVoVdldldldldldldldldldldldloVoVoVdloVoVdldldldldloVdldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlmcmEmEmEmEmEpMqkqlqlqmqnvRpMjrqWqqqrjrpRqsqtquqvqwqxqyqzqArbqCqDxYxWqDpRmPqGqHqImPqdqJyuqLqLqMqNqdqOoVoVoVoVoVdldldldldldldldldldldldloVoVoVdloVoVdldldldldloVdldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlgNmcgNgNmdmcpMqPqQqRqSqTqUqVpMpTpUpVpRyNqXqXqXqXqYqZrarcserAqCrdqXqXrdrepRrfrgqgqdrhrirjqLqLqMrkqdoVoVoVoVoVdldldldldldldldldldldldldldldldldldldloVdloVdldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldlpMpMrlrmrnrorpyQpMrrrsrtpRyWrvrvrvrvrwrxryrxrzsGrBrvrvrvrvrCpRrDrErFqdrGqLrHrIqLrJqdqdoVoVoVdldldldldldldldldldldldldldldldldldlrKdldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldlrLrMrNrOrPrQrRrSrTrUrVpWrWrXrXrXrYrZsasbscsdtcrZsfrZrtsgshsisjskslsmsnsospqLsqsrssoVoVoVdldldlrKacacacacacacacacacacacacacacacjWdldldldldldldldldldldldldldldldldldldldldldldljWacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldlstsusvswsxsyszsAsBrXsCsDrXrXrYsfsEsFsFsFDGsFtdsFsEsHrtsIsQpWzfsLsMsNsOqLsPsqsZsRsSoVoVacacdldljWacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldldloidldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldlpMpMsTsUsVszsAsWsXsXsYrXrXtauPtbtftethtgtItytRtJtYtisIuWtjtjtktltjtmsqAitoqdqdoVoVtpacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldlstsusvswsxsyszsAsBrXsCsDrXrXrYsfsEsFsFsFDGsFtdsFsEsHrtsIsJpWzfsLsMsNsOqLsPsqsQsRsSoVoVacacdldljWacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldldloidldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldlpMpMsTsUsVszsAsWsXsXsYrXrXsZtatbtftethtgtItytRtJtYtisIzLtjtjtktltjtmsqAitoqdqdoVoVtpacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldlpMpMpMtqszsAtrtsttpWtutupRpWtvtZpRpWtwtZpRpWtxtZpRuatztjtAtBtCtjtDtEqdqdqdoVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldlpMpMpMsAtFtGtHpSpRpRpRuducxIpRuducxIpRuducxIpRpRpRtjtKtLtMtjqdqdqdoVoVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldldlpMpMpRpWpRpRpRdlpRtNtOtPpRtQtOyepRtStOtTpRdlpRtUtUtVtUtUqdoVoVoVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacjWtWdldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1734,28 +1735,28 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldlumgN aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldlumumumugujujujujujujujugununundldlaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldldldldldldldldldldldldldldldldldldldlukuouldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldlumumupuqugujujujujujujujugurusunundldlaaaaaaaaaaaaaaaaaaaadldldldldldldldldldldldldldloVoVoVoVoVoVoVoVoVoVoVoVueoVdldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldlutuuuvuwuwuguxuyuzuAuxuyuBuguCuCuDuEuFdldldldlaaaaaaaaaaaadldldldldldldldldldldldldldlukuououououououououououououldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldluGuHuwuwuwuIuJuKuLuMuNuOvAuQuRuSuTuCuUdldldldldldldldldldldldldldldldldldldldldldldloVueoVdldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlumumuVuwwpuXuwuYuZvavbvcvdveuCvfvgvhviunundldldldloVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVukuldldldldlacacdldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldlumvjvkvlvmvnvovpvqvrvsvrvtvuvvvwvxvyvzyBundldldlukuouououououououovBvCvCvDvEvFvFvFvFvGvHkvdldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldluGuHuwuwuwuIuJuKuLuMuNuOuPuQuRuSuTuCuUdldldldldldldldldldldldldldldldldldldldldldldloVueoVdldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlumumuVuwuWuXuwuYuZvavbvcvdveuCvfvgvhviunundldldldloVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVukuldldldldlacacdldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldlumvjvkvlvmvnvovpvqvrvsvrvtvuvvvwvxvyvzvAundldldlukuouououououououovBvCvCvDvEvFvFvFvFvGvHkvdldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlumumvIvJvKvLvMEuumvtvOvPvQvtunAIvSvTuCuCvUunundldlueoVoVoVdldldldldlvVvWvXvYvXvWkZkZkZvZkZmbdldlwsdldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlumwbwbwbwcwdwewfwgwhvbvbvbwiununvSvTwjwkwkwkwldldluedloVoVdldldldldlvVvXwmwnwmvXwoyCwowqwrmbdlwsdldlxGacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlumwbwbwbwcwdwewfwgwhvbvbvbwiununvSvTwjwkwkwkwldldluedloVoVdldldldldlvVvXwmwnwmvXwowpwowqwrmbdlwsdldlxGacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldlvtwtwuugwvwwwxwxwyvbwzwAwBwCwCwDwEwFwGwkwHwIwldldluedloVoVdldldldlvWvWvWwJwKwLwMwMwMwMwMwMwMwMwMwMwMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldlugwNwOwPwQwRwSwSwTwSwUvtwVwSwWwXwYwZxaxbxcxdxeuououldloVoVdldldlvWvWxfvWvXxgvXwMxhxixjxkxlxmxnxoxowMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlvtxpxqugxrxsxtxtxuvbxvxwxxvbxyxzxAxAxBxCxDxEwlxFuiuizBoVoVdlDAvWvWxHEkxJxKxLxMwMxNxOxPxQxRxRxRxSxTwMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlxUxVxVxVxVxVxUxUxUBvxXDIxZyaybybybycycybycycybyczCzCAHoVoVdldlvWydEmElEoEnEpyhyiyjykylymynyoypyqxTwMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlxUyrysxVytCgxVyvxUxUywyxyyybybyzyAyEyDyHyGyFyIzLzizizioVoVdlyJyJyJyJyKyfyLyMCUwMEqyPDeyRySyTyRyUyUwMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlxVyVDixVyXyYxVyZzazbzczdDMybDNzgycycyczhBbybybycuiuiBcoVoVdlyJzjzkyJzlyfyfwnzmwMwMwMwMwMwMwMwMwMwMwMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldlxVxVznxVxVzoxVzpzqzrzsztzuzvzwzwzxzyzzzABbybBrBFBrzDBGoVoVDAyJzEzFzGzHzIzJzKDOzMzNzOzPzQzMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlxUyrysxVytCgxVyvxUxUywyxyyybybyzyAyByCyDyEyFyGyHyIyIyIoVoVdlyJyJyJyJyKyfyLyMCUwMEqyPDeyRySyTyRyUyUwMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlxVyVDixVyXyYxVyZzazbzczdDMybDNzgycycyczhziybybycuiuiBcoVoVdlyJzjzkyJzlyfyfwnzmwMwMwMwMwMwMwMwMwMwMwMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldlxVxVznxVxVzoxVzpzqzrzsztzuzvzwzwzxzyzzzAziybBrBFBrzDBGoVoVDAyJzEzFzGzHzIzJzKDOzMzNzOzPzQzMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldlacxVzRzSzTzUzVzWzXzYzZAaAbAcAdAdAeAdAfAgAhybBrDLDLDLBGoVoVdlyJDPAjyJzMzMAkAlAkzMAmAnAozQzMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlacacxVApAqArAsDQAuAvAwAxAsAyAzAAABACADAEAFAGybBrDLEvBwEwoVoVdlyJyJyJyJDRAJAKALAMANAOAPAQzMzMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlacxVxVARxVxVASxVATyZzbAUAVAWzvAXAXAYAZBazhBAybEyDLDLDLBGoVoVdlaczMBdBdAoAoAoBeBfBfBfBgBhzMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacxVBiBjxVBiBkxVyZBlzrzczUBmybBnzgBoBpBqAgBbybEzDLEvBwEwoVoVdlaczMzMBsAoAoBtBJBIAoAoBuzMzMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacxUytDSxVytDSxVBBxUxUBxzUByybybBzBCCvBEBDExycEAEBzCzCAHoVoVdlacaczMzMBHAoBKDFDEAoBLzMzMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlacacxVApAqArAsDQAuAvAwAxAsAyAzAAABACADAEAFAGybBrDLEvExEwoVoVdlyJyJyJyJDRAJAKALAMANAOAPAQzMzMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlacxVxVARxVxVASxVATyZzbAUAVAWzvAXAXAYAZBazhBbybEyDLDLDLBGoVoVdlaczMBdBdAoAoAoBeBfBfBfBgBhzMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacxVBiBjxVBiBkxVyZBlzrzczUBmybBnzgBoBpBqAgziybEzDLEvExEwoVoVdlaczMzMBsAoAoBtBJBIAoAoBuzMzMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacxUytDSxVytDSxVBwxUxUBxzUByybybBzBABBBCBDBEycEAEBzCzCAHoVoVdlacaczMzMBHAoBKDFDEAoBLzMzMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacxUxVxVxVxVxVxUxUxUBMzczdzeBNBOBOBOBPBPBPBPBPBOBPtWdloVoVoVdldlacaczMzMzMBQBRBQzMzMzMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBSBSBTBTBTBUBVBUBSBSBWBXBYBOBOBZCaBZCbCbCcCdCeCckvoVoVoVdldldlacacacaczMzMzMzMzMacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacBSCfCfCfCfCfCfDTChCiCjCkClCmEeCoEgEfCpCqCrCsCtCuoVoVdldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacBSBSEFCfCfCwCfCxCyCzCACBCCCDEhCEDJCnCnCcCFCGCcqjoVoVdldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacBSEFCfCHCICJCJCKCLDKCNCOCPEiCQCnCnCRBOCSCTBPdloVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacBSBSCvCfCfCwCfCxCyCzCACBCCCDEhCEDJCnCnCcCFCGCcqjoVoVdldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacBSCvCfCHCICJCJCKCLDKCNCOCPEiCQCnCnCRBOCSCTBPdloVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacBSBSDUCVCWCVCVCXCYCZDaDbDcDcDdDcDVBOBOdldldloVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacBSBSDfDgCfCfDhDWDjDkBPCnCnDlDmBOBOdldldloVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacBSBSBSDnDoDhDpDpCkBPDqDrBOBOBOdldldloVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/nano/js/nano_base_helpers.js b/nano/js/nano_base_helpers.js index 2f0f59772d3..42b68b4f6e8 100644 --- a/nano/js/nano_base_helpers.js +++ b/nano/js/nano_base_helpers.js @@ -92,7 +92,7 @@ NanoBaseHelpers = function () return string.charAt(0).toUpperCase() + string.slice(1); }, // Display a bar. Used to show health, capacity, etc. Use difClass if the entire display bar class should be different - displayBar: function(value, rangeMin, rangeMax, styleClass, showText, difClass) { + displayBar: function(value, rangeMin, rangeMax, styleClass, showText, difClass, direction) { if (rangeMin < rangeMax) { @@ -129,12 +129,21 @@ NanoBaseHelpers = function () if (typeof difClass == 'undefined' || !difClass) { - return '
    ' + showText + '
    '; + difClass = '' } - + + if(typeof direction == 'undefined' || !direction) + { + direction = 'width' + } + else + { + direction = 'height' + } + var percentage = Math.round((value - rangeMin) / (rangeMax - rangeMin) * 100); - - return '
    ' + showText + '
    '; + + return '
    ' + showText + '
    '; }, // Display DNA Blocks (for the DNA Modifier UI) displayDNABlocks: function(dnaString, selectedBlock, selectedSubblock, blockSize, paramKey) { diff --git a/nano/templates/mechfab.tmpl b/nano/templates/mechfab.tmpl index 8fcc82f877d..29afe23cf9c 100644 --- a/nano/templates/mechfab.tmpl +++ b/nano/templates/mechfab.tmpl @@ -1,15 +1,16 @@ -

    Exosuit Fabricator

    {{:helper.link("Sync", null, {'sync' : 1})}} {{:data.sync}}
    +
    {{if data.manufacturers}}
    {{for data.manufacturers}} {{:helper.link(value.company, null, {'manufacturer' : value.id}, value.id == data.manufacturer ? 'selected' : null)}} {{/for}}
    +
    {{/if}}
    {{for data.categories}} @@ -18,6 +19,7 @@ There are no known designs {{/for}}
    +
    {{for data.buildable}} {{if value.category == data.category}}
    diff --git a/nano/templates/xenobio_computer.tmpl b/nano/templates/xenobio_computer.tmpl index 9cf053cddd4..730c06358fd 100644 --- a/nano/templates/xenobio_computer.tmpl +++ b/nano/templates/xenobio_computer.tmpl @@ -9,10 +9,10 @@ Used In File(s): \code\modules\xenobio2\machines\injector_computer.dm
    {{if data.beaker}} {{:data.reagentAmount}}u / {{:data.reagentMax}}u - {{:helper.displayBar(data.reagentAmount, data.reagentMax, data.reagentMin, 'good', null, 'displayBarBeaker')}} + {{:helper.displayBar(data.reagentAmount, data.reagentMax, data.reagentMin, 'good', null, 'Beaker', 1)}} {{else}} - ERRR% - {{:helper.displayBar(data.reagentAmount, data.reagentMax, data.reagentMin, 'good', null, 'displayBarBeaker')}} + ERR + {{:helper.displayBar(data.reagentAmount, data.reagentMax, data.reagentMin, 'good', null, 'Beaker', 1)}} {{/if}}
    @@ -23,7 +23,7 @@ Used In File(s): \code\modules\xenobio2\machines\injector_computer.dm Instability:
    - {{if data.instability}} + {{if data.compatible}} {{:data.instability}}% {{else}} ERRR% Please contact your local technician for assistance. diff --git a/polaris.dme b/polaris.dme index 8d761a68e87..0483132999e 100644 --- a/polaris.dme +++ b/polaris.dme @@ -132,7 +132,6 @@ #include "code\controllers\Processes\air.dm" #include "code\controllers\Processes\alarm.dm" #include "code\controllers\Processes\chemistry.dm" -#include "code\controllers\Processes\disease.dm" #include "code\controllers\Processes\emergencyShuttle.dm" #include "code\controllers\Processes\event.dm" #include "code\controllers\Processes\garbage.dm" @@ -147,13 +146,9 @@ #include "code\controllers\Processes\ticker.dm" #include "code\controllers\Processes\turf.dm" #include "code\controllers\Processes\vote.dm" -#include "code\controllers\ProcessScheduler\core\_define.dm" #include "code\controllers\ProcessScheduler\core\_stubs.dm" #include "code\controllers\ProcessScheduler\core\process.dm" #include "code\controllers\ProcessScheduler\core\processScheduler.dm" -#include "code\controllers\ProcessScheduler\core\updateQueue.dm" -#include "code\controllers\ProcessScheduler\core\updateQueueWorker.dm" -#include "code\controllers\subsystem\alarms.dm" #include "code\datums\ai_law_sets.dm" #include "code\datums\ai_laws.dm" #include "code\datums\browser.dm"